This repository has no description
3.4 kB
122 lines
1{
2 self,
3 config,
4 pkgs,
5 ...
6}:
7let
8 opencrow = self.inputs.opencrow.packages.${pkgs.system}.opencrow;
9 pi = self.inputs.llm-agents.packages.${pkgs.system}.pi;
10in
11{
12 users.users.bot = {
13 isNormalUser = true;
14 home = "/home/bot";
15 createHome = true;
16 group = "users";
17 useDefaultShell = true;
18 openssh.authorizedKeys.keys = [
19 self.keys.ssh.barnacle.public
20 self.keys.ssh.yubi_pgp.public
21 self.keys.ssh.termux_massulus.public
22 self.keys.ssh.yubi1.public
23 self.keys.ssh.yubi2.public
24 self.keys.ssh.solo2.public
25 self.keys.ssh.xerxes.public
26 self.keys.ssh.ignavia.public
27 self.keys.ssh.phonetpm_massulus.public
28 self.keys.ssh.massulus.public
29 ];
30 packages = [
31 opencrow
32 pi
33 pkgs.curl
34 pkgs.jq
35 pkgs.lynx
36 ];
37 };
38
39 clan.core.vars.generators.opencrow-matrix = {
40 prompts.matrix-access-token = {
41 description = "Matrix access token for @opencrow:lassul.us";
42 type = "hidden";
43 persist = true;
44 };
45 };
46
47 clan.core.vars.generators.opencrow-openrouter = {
48 prompts.openrouter-api-key = {
49 description = "OpenRouter API key for opencrow - get from https://openrouter.ai/keys";
50 type = "hidden";
51 persist = true;
52 };
53 };
54
55 clan.core.vars.generators.opencrow-env = {
56 dependencies = [
57 "opencrow-matrix"
58 "opencrow-openrouter"
59 ];
60 files."opencrow.env" = { };
61 script = ''
62 cat > "$out/opencrow.env" << EOF
63 OPENCROW_MATRIX_ACCESS_TOKEN=$(cat $in/opencrow-matrix/matrix-access-token)
64 OPENROUTER_API_KEY=$(cat $in/opencrow-openrouter/openrouter-api-key)
65 EOF
66 '';
67 };
68
69 systemd.services.opencrow = {
70 description = "OpenCrow Matrix Bot";
71 wantedBy = [ "multi-user.target" ];
72 after = [ "network-online.target" ];
73 wants = [ "network-online.target" ];
74
75 path = [
76 opencrow
77 pi
78 pkgs.bash
79 pkgs.coreutils
80 pkgs.curl
81 pkgs.jq
82 pkgs.lynx
83 ];
84
85 environment = {
86 OPENCROW_MATRIX_HOMESERVER = "https://matrix.lassul.us";
87 OPENCROW_ALLOWED_USERS = "@lassulus:lassul.us";
88 OPENCROW_MATRIX_USER_ID = "@opencrow:lassul.us";
89 OPENCROW_MATRIX_DEVICE_ID = "AYBPKDHIDV";
90 OPENCROW_PI_SESSION_DIR = "/home/bot/opencrow/sessions";
91 OPENCROW_PI_WORKING_DIR = "/home/bot/opencrow";
92 OPENCROW_PI_SKILLS = "${opencrow}/share/opencrow/skills/web";
93 OPENCROW_PI_SKILLS_DIR = "/home/bot/skills";
94 OPENCROW_PI_PROVIDER = "openrouter";
95 OPENCROW_PI_MODEL = "anthropic/claude-sonnet-4";
96 # OPENCROW_HEARTBEAT_INTERVAL = "10m";
97 OPENCROW_SHOW_TOOL_CALLS = "1";
98 OPENCROW_SOUL_FILE = "/home/bot/opencrow/SOUL.md";
99 PI_CODING_AGENT_DIR = "/home/bot/opencrow/pi-agent";
100 };
101
102 serviceConfig = {
103 EnvironmentFile = [
104 config.clan.core.vars.generators.opencrow-env.files."opencrow.env".path
105 config.clan.core.vars.generators.mailserver-bot.files."mail.env".path
106 ];
107 ExecStart = "${opencrow}/bin/opencrow";
108 Restart = "on-failure";
109 RestartSec = 10;
110 User = "bot";
111 Group = "users";
112 WorkingDirectory = "/home/bot/opencrow";
113 };
114 };
115
116 # ensure working directory exists
117 systemd.tmpfiles.rules = [
118 "d /home/bot/opencrow 0750 bot users -"
119 "d /home/bot/opencrow/sessions 0750 bot users -"
120 "d /home/bot/opencrow/pi-agent 0750 bot users -"
121 ];
122}