summaryrefslogtreecommitdiff
path: root/Omni/Dev/Beryllium/Ava.nix
blob: 7563b2627b0d4c3da63b885c0319a88b115c4164 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
{...}: let
  bild = import ../../Bild.nix {};
  avaPkg = bild.run ../../Ava.hs;

  # Python environment for Ava's python_exec tool
  avaPython = bild.python.pythonWith (p: [
    p.requests # HTTP requests
    p.httpx # Async HTTP
    p.beautifulsoup4 # HTML/XML parsing
    p.lxml # Fast XML/HTML parser
    p.pandas # Data analysis
    p.numpy # Numerical computing
    p.pillow # Image processing
    p.pyyaml # YAML parsing
    p.python-dateutil # Date utilities
  ]);

  # Nixpkgs for CLI tools not in bild.pkgs
  nixpkgs = import ../../Bild/Nixpkgs.nix;
  pkgs = nixpkgs.nixos-24_11;

  # Wrap ava binary with tools in PATH
  avaWithTools = bild.stdenv.mkDerivation {
    name = "ava-wrapped";
    buildInputs = [bild.makeWrapper];
    phases = ["installPhase"];
    installPhase = ''
      mkdir -p $out/bin
      makeWrapper ${avaPkg}/bin/ava $out/bin/ava \
        --prefix PATH : ${bild.lib.makeBinPath [
        avaPython
        bild.pkgs.jq
        bild.pkgs.ripgrep
        bild.pkgs.coreutils
        bild.pkgs.git
        bild.pkgs.sqlite
        bild.pkgs.ffmpeg
        bild.pkgs.bash
        pkgs.curl
        pkgs.pandoc
        pkgs.imagemagick
        pkgs.csvkit
        pkgs.openai-whisper-cpp
        pkgs.direnv
        pkgs.nix
      ]}
    '';
  };
in {
  systemd.services.ava = {
    description = "Ava Telegram assistant";
    after = ["network-online.target" "ollama.service"];
    wants = ["network-online.target" "ollama.service"];
    wantedBy = ["multi-user.target"];

    serviceConfig = {
      Type = "simple";
      User = "ava";
      Group = "users";
      WorkingDirectory = "/home/ava/omni";

      Environment = [
        "AVA_DATA_ROOT=/home/ava"
        "HOME=/home/ava"
        "OLLAMA_URL=http://localhost:11434"
        "AVA_WEB_PORT=8079"
        "AVA_WEB_URL=https://beryllium.oryx-ide.ts.net"
      ];

      EnvironmentFile = "/run/secrets/ava.env";

      ExecStart = "${avaWithTools}/bin/ava";

      StandardOutput = "journal";
      StandardError = "journal";

      Restart = "on-failure";
      RestartSec = 5;

      TimeoutStopSec = 90;
      KillMode = "mixed";
      KillSignal = "SIGTERM";
    };
  };

  systemd.tmpfiles.rules = [
    "d /home/ava 0755 ava users -"
    "d /home/ava/omni 0755 ava users -"
    "d /home/ava/skills 0755 ava users -"
    "d /home/ava/prompts 0755 ava users -"
    "d /home/ava/prompts/agents 0755 ava users -"
    "d /home/ava/prompts/agents/telegram 0755 ava users -"
    "d /home/ava/prompts/shared 0755 ava users -"
    "d /home/ava/prompts/shared/formatting 0755 ava users -"
    "d /home/ava/prompts/subagents 0755 ava users -"
    "d /home/ava/prompts/subagents/generic 0755 ava users -"
    "d /home/ava/prompts/subagents/coder 0755 ava users -"
    "d /home/ava/outreach 0755 ava users -"
    "d /home/ava/outreach/pending 0755 ava users -"
    "d /home/ava/outreach/approved 0755 ava users -"
    "d /home/ava/outreach/rejected 0755 ava users -"
    "d /home/ava/outreach/sent 0755 ava users -"
    "d /home/ava/users 0755 ava users -"
    "d /home/ava/.local/share/omni 0755 ava users -"
    "d /home/ava/models 0755 ava users -"
    "d /home/ava/logs 0755 ava users -"
    "d /home/ava/logs/ava 0755 ava users -"
    "d /home/ava/logs/subagents 0755 ava users -"
  ];

  # Create .bashrc with direnv hook if it doesn't exist
  system.activationScripts.avaBashrc = ''
    if [ ! -f /home/ava/.bashrc ]; then
      echo 'eval "$(direnv hook bash)"' > /home/ava/.bashrc
      chown ava:users /home/ava/.bashrc
    fi
  '';

  # Note: Tailscale Funnel for Ava web server is configured via:
  #   tailscale funnel --bg 8079
  # This persists in tailscaled config and doesn't need a systemd service.
  # URL: https://beryllium.oryx-ide.ts.net/
}