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