@action-llama/action-llama 0.12.2 → 0.13.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (168) hide show
  1. package/{docs/agent-reference → agent-docs}/AGENTS.md +31 -15
  2. package/{docs/agent-reference → agent-docs}/skills/README.md +1 -0
  3. package/agent-docs/skills/calls.md +82 -0
  4. package/{docs/agent-reference → agent-docs}/skills/resource-locks.md +13 -7
  5. package/{docs/agent-reference → agent-docs}/skills/signals.md +1 -1
  6. package/dist/agents/container-runner.d.ts +3 -2
  7. package/dist/agents/container-runner.d.ts.map +1 -1
  8. package/dist/agents/container-runner.js +12 -12
  9. package/dist/agents/container-runner.js.map +1 -1
  10. package/dist/agents/prompt.d.ts.map +1 -1
  11. package/dist/agents/prompt.js +3 -2
  12. package/dist/agents/prompt.js.map +1 -1
  13. package/dist/agents/runner.d.ts +3 -2
  14. package/dist/agents/runner.d.ts.map +1 -1
  15. package/dist/agents/runner.js +14 -14
  16. package/dist/agents/runner.js.map +1 -1
  17. package/dist/build-info.json +1 -1
  18. package/dist/cli/commands/doctor.d.ts +1 -0
  19. package/dist/cli/commands/doctor.d.ts.map +1 -1
  20. package/dist/cli/commands/doctor.js +53 -15
  21. package/dist/cli/commands/doctor.js.map +1 -1
  22. package/dist/cli/commands/env.d.ts +4 -0
  23. package/dist/cli/commands/env.d.ts.map +1 -1
  24. package/dist/cli/commands/env.js +41 -0
  25. package/dist/cli/commands/env.js.map +1 -1
  26. package/dist/cli/commands/kill.js +2 -2
  27. package/dist/cli/commands/kill.js.map +1 -1
  28. package/dist/cli/commands/logs.d.ts.map +1 -1
  29. package/dist/cli/commands/logs.js +25 -20
  30. package/dist/cli/commands/logs.js.map +1 -1
  31. package/dist/cli/commands/pause.js +2 -2
  32. package/dist/cli/commands/pause.js.map +1 -1
  33. package/dist/cli/commands/push.d.ts +1 -0
  34. package/dist/cli/commands/push.d.ts.map +1 -1
  35. package/dist/cli/commands/push.js +2 -1
  36. package/dist/cli/commands/push.js.map +1 -1
  37. package/dist/cli/commands/resume.js +2 -2
  38. package/dist/cli/commands/resume.js.map +1 -1
  39. package/dist/cli/commands/run.d.ts.map +1 -1
  40. package/dist/cli/commands/run.js +21 -46
  41. package/dist/cli/commands/run.js.map +1 -1
  42. package/dist/cli/commands/start.d.ts.map +1 -1
  43. package/dist/cli/commands/start.js +62 -2
  44. package/dist/cli/commands/start.js.map +1 -1
  45. package/dist/cli/commands/status.d.ts.map +1 -1
  46. package/dist/cli/commands/status.js +23 -7
  47. package/dist/cli/commands/status.js.map +1 -1
  48. package/dist/cli/commands/stop.d.ts +1 -0
  49. package/dist/cli/commands/stop.d.ts.map +1 -1
  50. package/dist/cli/commands/stop.js +3 -2
  51. package/dist/cli/commands/stop.js.map +1 -1
  52. package/dist/cli/gateway-client.d.ts +6 -0
  53. package/dist/cli/gateway-client.d.ts.map +1 -1
  54. package/dist/cli/gateway-client.js +19 -0
  55. package/dist/cli/gateway-client.js.map +1 -1
  56. package/dist/cli/main.js +12 -0
  57. package/dist/cli/main.js.map +1 -1
  58. package/dist/cloud/vps/constants.d.ts +1 -1
  59. package/dist/cloud/vps/constants.d.ts.map +1 -1
  60. package/dist/cloud/vps/constants.js +9 -0
  61. package/dist/cloud/vps/constants.js.map +1 -1
  62. package/dist/cloud/vps/hetzner-api.d.ts +14 -3
  63. package/dist/cloud/vps/hetzner-api.d.ts.map +1 -1
  64. package/dist/cloud/vps/hetzner-api.js +24 -11
  65. package/dist/cloud/vps/hetzner-api.js.map +1 -1
  66. package/dist/cloud/vps/provision.js +29 -6
  67. package/dist/cloud/vps/provision.js.map +1 -1
  68. package/dist/cloud/vps/ssh.d.ts +7 -0
  69. package/dist/cloud/vps/ssh.d.ts.map +1 -1
  70. package/dist/cloud/vps/ssh.js +15 -1
  71. package/dist/cloud/vps/ssh.js.map +1 -1
  72. package/dist/credentials/builtins/index.d.ts.map +1 -1
  73. package/dist/credentials/builtins/index.js +2 -0
  74. package/dist/credentials/builtins/index.js.map +1 -1
  75. package/dist/credentials/builtins/reddit-oauth.d.ts +4 -0
  76. package/dist/credentials/builtins/reddit-oauth.d.ts.map +1 -0
  77. package/dist/credentials/builtins/reddit-oauth.js +71 -0
  78. package/dist/credentials/builtins/reddit-oauth.js.map +1 -0
  79. package/dist/docker/local-runtime.d.ts +1 -0
  80. package/dist/docker/local-runtime.d.ts.map +1 -1
  81. package/dist/docker/local-runtime.js +9 -6
  82. package/dist/docker/local-runtime.js.map +1 -1
  83. package/dist/gateway/index.d.ts.map +1 -1
  84. package/dist/gateway/index.js +5 -4
  85. package/dist/gateway/index.js.map +1 -1
  86. package/dist/gateway/routes/logs.d.ts.map +1 -1
  87. package/dist/gateway/routes/logs.js +29 -111
  88. package/dist/gateway/routes/logs.js.map +1 -1
  89. package/dist/remote/bootstrap.d.ts +2 -0
  90. package/dist/remote/bootstrap.d.ts.map +1 -1
  91. package/dist/remote/bootstrap.js +7 -11
  92. package/dist/remote/bootstrap.js.map +1 -1
  93. package/dist/remote/push.d.ts +6 -0
  94. package/dist/remote/push.d.ts.map +1 -1
  95. package/dist/remote/push.js +172 -91
  96. package/dist/remote/push.js.map +1 -1
  97. package/dist/remote/ssh.d.ts +1 -0
  98. package/dist/remote/ssh.d.ts.map +1 -1
  99. package/dist/remote/ssh.js +8 -0
  100. package/dist/remote/ssh.js.map +1 -1
  101. package/dist/scheduler/index.d.ts.map +1 -1
  102. package/dist/scheduler/index.js +56 -7
  103. package/dist/scheduler/index.js.map +1 -1
  104. package/dist/scheduler/watcher.d.ts +1 -1
  105. package/dist/scheduler/watcher.d.ts.map +1 -1
  106. package/dist/scheduler/watcher.js +5 -6
  107. package/dist/scheduler/watcher.js.map +1 -1
  108. package/dist/setup/scaffold.js +2 -2
  109. package/dist/setup/scaffold.js.map +1 -1
  110. package/dist/shared/config.d.ts +1 -0
  111. package/dist/shared/config.d.ts.map +1 -1
  112. package/dist/shared/config.js.map +1 -1
  113. package/dist/shared/credentials.d.ts +8 -18
  114. package/dist/shared/credentials.d.ts.map +1 -1
  115. package/dist/shared/credentials.js +8 -62
  116. package/dist/shared/credentials.js.map +1 -1
  117. package/dist/shared/server.d.ts +2 -0
  118. package/dist/shared/server.d.ts.map +1 -1
  119. package/dist/shared/server.js.map +1 -1
  120. package/dist/tui/App.d.ts.map +1 -1
  121. package/dist/tui/App.js +1 -1
  122. package/dist/tui/App.js.map +1 -1
  123. package/dist/webhooks/definitions/github.d.ts.map +1 -1
  124. package/dist/webhooks/definitions/github.js +13 -0
  125. package/dist/webhooks/definitions/github.js.map +1 -1
  126. package/dist/webhooks/providers/github.d.ts.map +1 -1
  127. package/dist/webhooks/providers/github.js +6 -0
  128. package/dist/webhooks/providers/github.js.map +1 -1
  129. package/dist/webhooks/registry.d.ts.map +1 -1
  130. package/dist/webhooks/registry.js +9 -3
  131. package/dist/webhooks/registry.js.map +1 -1
  132. package/dist/webhooks/types.d.ts +3 -1
  133. package/dist/webhooks/types.d.ts.map +1 -1
  134. package/docker/bin/_http-exit +17 -0
  135. package/docker/bin/al-call +10 -4
  136. package/docker/bin/al-check +9 -3
  137. package/docker/bin/al-status +1 -1
  138. package/docker/bin/al-wait +11 -3
  139. package/docker/bin/rlock +9 -2
  140. package/docker/bin/rlock-heartbeat +9 -2
  141. package/docker/bin/runlock +9 -2
  142. package/package.json +2 -2
  143. package/docs/agent-config-reference.md +0 -313
  144. package/docs/agents.md +0 -256
  145. package/docs/cloud-run.md +0 -173
  146. package/docs/cloud.md +0 -98
  147. package/docs/commands.md +0 -286
  148. package/docs/config-reference.md +0 -241
  149. package/docs/creating-agents.md +0 -147
  150. package/docs/credentials.md +0 -167
  151. package/docs/docker.md +0 -323
  152. package/docs/ecs.md +0 -795
  153. package/docs/examples/dev/ACTIONS.md +0 -75
  154. package/docs/examples/dev/README.md +0 -28
  155. package/docs/examples/dev/agent-config.toml +0 -18
  156. package/docs/examples/devops/ACTIONS.md +0 -33
  157. package/docs/examples/devops/README.md +0 -23
  158. package/docs/examples/devops/agent-config.toml +0 -13
  159. package/docs/examples/index.md +0 -15
  160. package/docs/examples/reviewer/ACTIONS.md +0 -37
  161. package/docs/examples/reviewer/README.md +0 -22
  162. package/docs/examples/reviewer/agent-config.toml +0 -11
  163. package/docs/models.md +0 -191
  164. package/docs/vps-deployment.md +0 -285
  165. package/docs/web-dashboard.md +0 -113
  166. package/docs/webhooks.md +0 -152
  167. /package/{docs/agent-reference → agent-docs}/skills/credentials.md +0 -0
  168. /package/{docs/agent-reference → agent-docs}/skills/environment.md +0 -0
@@ -1,4 +1,6 @@
1
1
  import { resolve, basename, dirname } from "path";
2
+ import { createHash } from "crypto";
3
+ import { readFileSync, unlinkSync } from "fs";
2
4
  import { stringify as stringifyTOML } from "smol-toml";
3
5
  import { CREDENTIALS_DIR } from "../shared/paths.js";
4
6
  import { VPS_CONSTANTS } from "../cloud/vps/constants.js";
@@ -7,6 +9,23 @@ import { execFile as execFileCb } from "child_process";
7
9
  import { promisify } from "util";
8
10
  const execFile = promisify(execFileCb);
9
11
  import { bootstrapServer } from "./bootstrap.js";
12
+ /**
13
+ * Compute a SHA-256 hash of package.json + package-lock.json contents.
14
+ * Used to skip `npm install` when dependencies haven't changed.
15
+ */
16
+ export function computePkgHash(projectPath) {
17
+ const hash = createHash("sha256");
18
+ for (const file of ["package.json", "package-lock.json"]) {
19
+ try {
20
+ hash.update(readFileSync(resolve(projectPath, file)));
21
+ }
22
+ catch {
23
+ // File missing — hash will differ from remote, triggering install
24
+ hash.update(`missing:${file}`);
25
+ }
26
+ }
27
+ return hash.digest("hex");
28
+ }
10
29
  /**
11
30
  * Build a systemd unit file for the al scheduler.
12
31
  */
@@ -28,7 +47,7 @@ Requires=docker.service
28
47
  [Service]
29
48
  Type=simple
30
49
  WorkingDirectory=${basePath}/project
31
- ExecStart=${alExec} start --headless -w${gatewayPort ? ` --port ${gatewayPort}` : ""}
50
+ ExecStart=${alExec} start --headless -w -e${gatewayPort ? ` --port ${gatewayPort}` : ""}
32
51
  Restart=on-failure
33
52
  RestartSec=5
34
53
  Environment=NODE_ENV=production${pathEnv}
@@ -41,118 +60,180 @@ WantedBy=multi-user.target
41
60
  * Push project files and credentials to a server, set up systemd, and verify.
42
61
  */
43
62
  export async function pushToServer(opts) {
44
- const { projectPath, serverConfig, globalConfig, dryRun, noCreds, noFiles } = opts;
63
+ const { projectPath, serverConfig, globalConfig, dryRun, noCreds, noFiles, forceInstall } = opts;
45
64
  const ssh = sshOptionsFromConfig(serverConfig);
46
65
  const basePath = serverConfig.basePath ?? "/opt/action-llama";
47
66
  const gatewayPort = VPS_CONSTANTS.DEFAULT_GATEWAY_PORT;
48
67
  const projectName = basename(resolve(projectPath));
68
+ // Set up SSH ControlMaster for connection multiplexing
69
+ const hostHash = createHash("sha256").update(ssh.host).digest("hex").slice(0, 8);
70
+ const controlPath = `/tmp/al-ssh-${hostHash}-${process.pid}`;
71
+ ssh.controlPath = controlPath;
72
+ try {
73
+ await pushToServerInner(ssh, {
74
+ projectPath, serverConfig, globalConfig, dryRun, noCreds, noFiles, forceInstall,
75
+ basePath, gatewayPort, projectName,
76
+ });
77
+ }
78
+ finally {
79
+ try {
80
+ unlinkSync(controlPath);
81
+ }
82
+ catch { }
83
+ }
84
+ }
85
+ async function pushToServerInner(ssh, opts) {
86
+ const { projectPath, serverConfig, globalConfig, dryRun, noCreds, noFiles, forceInstall, basePath, gatewayPort, projectName } = opts;
49
87
  // Step 1: Bootstrap server
50
- console.log("\n=== Checking server prerequisites ===\n");
88
+ console.log("\nChecking server...");
51
89
  let binPaths;
52
90
  if (dryRun) {
53
- console.log("(dry-run) Would check server prerequisites");
91
+ console.log(" (dry-run) Skipped.");
54
92
  }
55
93
  else {
56
94
  binPaths = await bootstrapServer(ssh);
95
+ console.log(` Node.js ${binPaths.nodeVersion}`);
96
+ console.log(` Docker ${binPaths.dockerVersion}`);
57
97
  }
58
98
  // Step 2: Ensure remote directories exist
59
99
  if (!dryRun) {
60
100
  await sshExec(ssh, `mkdir -p ${basePath}/project ${basePath}/credentials`);
61
101
  }
62
- const rsyncFlags = dryRun ? ["--dry-run", "-v"] : [];
63
- // Step 3: Rsync project files
64
- if (!noFiles) {
65
- console.log("\n=== Syncing project files ===\n");
66
- const excludes = [
67
- "node_modules",
68
- ".al",
69
- ".git",
70
- ".env.toml",
71
- ];
72
- await rsyncTo(ssh, projectPath, `${basePath}/project`, excludes, rsyncFlags);
73
- console.log(dryRun ? "(dry-run) Would sync project files" : "Project files synced.");
74
- // Install project dependencies on the remote
75
- if (!dryRun) {
76
- console.log("\n=== Installing dependencies ===\n");
77
- await sshExec(ssh, `cd ${basePath}/project && npm install`);
78
- console.log("Dependencies installed.");
102
+ // Phase A: Rsync files and credentials in parallel
103
+ const syncItems = [];
104
+ if (!noFiles)
105
+ syncItems.push("files");
106
+ if (!noCreds)
107
+ syncItems.push("credentials");
108
+ if (syncItems.length > 0) {
109
+ console.log(`\nSyncing ${syncItems.join(" and ")}...`);
110
+ const rsyncFlags = dryRun ? ["--dry-run", "-v"] : [];
111
+ const phaseA = [];
112
+ if (!noFiles) {
113
+ const excludes = ["node_modules", ".al", ".git", ".env.toml"];
114
+ phaseA.push(rsyncTo(ssh, projectPath, `${basePath}/project`, excludes, rsyncFlags));
79
115
  }
80
- }
81
- // Step 4: Sync credentials
82
- if (!noCreds) {
83
- console.log("\n=== Syncing credentials ===\n");
84
- await rsyncTo(ssh, CREDENTIALS_DIR, `${basePath}/credentials`, undefined, rsyncFlags);
85
- console.log(dryRun ? "(dry-run) Would sync credentials" : "Credentials synced.");
86
- }
87
- // Step 5: Configure nginx TLS reverse proxy (certs from provisioning)
88
- if (!dryRun && !noCreds && serverConfig.cloudflareHostname) {
89
- console.log("\n=== Configuring nginx ===\n");
90
- const cfHost = serverConfig.cloudflareHostname;
91
- const certSrc = `${basePath}/credentials/cloudflare_origin_cert/${cfHost}/certificate`;
92
- const keySrc = `${basePath}/credentials/cloudflare_origin_cert/${cfHost}/private_key`;
93
- await sshExec(ssh, `sudo mkdir -p ${VPS_CONSTANTS.NGINX_CERT_DIR}`);
94
- await sshExec(ssh, `sudo cp ${certSrc} ${VPS_CONSTANTS.NGINX_CERT_PATH}`);
95
- await sshExec(ssh, `sudo cp ${keySrc} ${VPS_CONSTANTS.NGINX_KEY_PATH}`);
96
- const { generateNginxConfig } = await import("../cloud/vps/nginx.js");
97
- const nginxConf = generateNginxConfig(cfHost, gatewayPort);
98
- const nginxEscaped = nginxConf.replace(/'/g, "'\\''");
99
- await sshExec(ssh, `sudo tee ${VPS_CONSTANTS.NGINX_SITE_CONFIG} > /dev/null << 'NGINXEOF'\n${nginxEscaped}\nNGINXEOF`);
100
- await sshExec(ssh, `sudo ln -sfn ${VPS_CONSTANTS.NGINX_SITE_CONFIG} /etc/nginx/sites-enabled/action-llama`);
101
- await sshExec(ssh, "sudo rm -f /etc/nginx/sites-enabled/default");
102
- await sshExec(ssh, "sudo nginx -t && sudo systemctl reload nginx");
103
- console.log(` nginx: ${cfHost} :443 → 127.0.0.1:${gatewayPort}`);
104
- }
105
- // Step 6: Write .env.toml on the server
106
- if (!dryRun) {
107
- console.log("\n=== Writing server .env.toml ===\n");
108
- // Build a self-contained .env.toml — no environment reference needed on the
109
- // remote since the server is effectively running locally. Inline gateway and
110
- // telemetry config so the scheduler has everything it needs.
111
- const remoteEnv = {
112
- gateway: { ...globalConfig.gateway, port: gatewayPort },
113
- };
114
- if (globalConfig.telemetry) {
115
- remoteEnv.telemetry = globalConfig.telemetry;
116
+ if (!noCreds) {
117
+ phaseA.push(rsyncTo(ssh, CREDENTIALS_DIR, `${basePath}/credentials`, undefined, rsyncFlags));
116
118
  }
117
- const envToml = stringifyTOML(remoteEnv);
118
- // Escape for shell
119
- const escaped = envToml.replace(/'/g, "'\\''");
120
- await sshExec(ssh, `cat > ${basePath}/project/.env.toml << 'ENVEOF'\n${escaped}\nENVEOF`);
121
- console.log("Server .env.toml written.");
122
- // Symlink credentials dir so al can find them
123
- await sshExec(ssh, `mkdir -p ~/.action-llama && ln -sfn ${basePath}/credentials ~/.action-llama/credentials`);
119
+ await Promise.all(phaseA);
120
+ console.log(dryRun ? " (dry-run) No changes made." : " Done.");
124
121
  }
125
122
  if (dryRun) {
126
- console.log("\n=== Dry run complete ===\n");
127
- console.log("No changes were made to the server.");
123
+ console.log("\nDry run complete — no changes were made.");
128
124
  return;
129
125
  }
130
- // Step 6: Install systemd unit
131
- console.log("\n=== Setting up systemd service ===\n");
126
+ // Phase B: Configure server (parallel, results collected for deterministic output)
127
+ console.log("\nConfiguring server...");
128
+ const phaseB = [];
129
+ // SSH hardening (idempotent — safe to run on every push)
130
+ phaseB.push(hardenSsh(ssh));
131
+ if (!noFiles) {
132
+ phaseB.push(conditionalNpmInstall(ssh, projectPath, basePath, forceInstall));
133
+ }
134
+ if (!noCreds && serverConfig.cloudflareHostname) {
135
+ phaseB.push(setupNginx(ssh, basePath, serverConfig.cloudflareHostname, gatewayPort));
136
+ }
137
+ phaseB.push(writeEnvAndSymlink(ssh, basePath, gatewayPort, globalConfig));
132
138
  const unitContent = buildSystemdUnit(projectName, basePath, binPaths, gatewayPort);
133
- const unitEscaped = unitContent.replace(/'/g, "'\\''");
134
- await sshExec(ssh, `sudo tee /etc/systemd/system/action-llama.service > /dev/null << 'UNITEOF'\n${unitEscaped}\nUNITEOF`);
135
- await sshExec(ssh, "sudo systemctl daemon-reload");
136
- await sshExec(ssh, "sudo systemctl enable action-llama");
137
- console.log("Systemd service installed.");
138
- // Step 7: Restart service
139
- console.log("\n=== Restarting service ===\n");
139
+ phaseB.push(installSystemdUnit(ssh, unitContent));
140
+ const results = await Promise.all(phaseB);
141
+ for (const msg of results) {
142
+ console.log(` ${msg}`);
143
+ }
144
+ // Phase C: Restart + health check
145
+ console.log("\nRestarting service...");
140
146
  await sshExec(ssh, "sudo systemctl restart action-llama");
141
- console.log("Service restarted.");
142
- // Step 8: Health check
143
- console.log("\n=== Health check ===\n");
144
147
  await healthCheck(ssh, gatewayPort);
145
- // Print status
146
148
  console.log(`\nDeployed to ${serverConfig.host}:`);
147
149
  console.log(` Gateway: http://${serverConfig.host}:${gatewayPort}`);
148
150
  console.log(` Project: ${basePath}/project`);
149
151
  console.log(` Service: systemctl status action-llama`);
150
152
  console.log(` Logs: journalctl -u action-llama -f`);
151
153
  }
154
+ /**
155
+ * Harden SSH on the remote server. Idempotent — safe to run on every push.
156
+ * Disables password authentication, restricts root login to key-only,
157
+ * and installs fail2ban for brute-force protection.
158
+ */
159
+ async function hardenSsh(ssh) {
160
+ await sshExec(ssh, [
161
+ // Disable password auth and restrict root to key-only
162
+ "sed -i 's/^#\\?PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config",
163
+ "sed -i 's/^#\\?PermitRootLogin.*/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config",
164
+ "systemctl restart sshd",
165
+ // Install fail2ban if not already present
166
+ "dpkg -s fail2ban >/dev/null 2>&1 || (apt-get update -qq && apt-get install -y -qq fail2ban && systemctl enable fail2ban && systemctl start fail2ban)",
167
+ ].join(" && "));
168
+ return "SSH hardened (password auth disabled, fail2ban active).";
169
+ }
170
+ async function conditionalNpmInstall(ssh, projectPath, basePath, forceInstall) {
171
+ const localHash = computePkgHash(projectPath);
172
+ if (!forceInstall) {
173
+ const remoteHash = (await sshExec(ssh, `cat ${basePath}/.pkg-hash 2>/dev/null || true`)).trim();
174
+ if (remoteHash === localHash) {
175
+ return "Dependencies unchanged, skipped npm install.";
176
+ }
177
+ }
178
+ await sshExec(ssh, `cd ${basePath}/project && npm install`);
179
+ // When pushing the source package itself (not a consumer project), npm install
180
+ // won't create a bin symlink for the package's own "bin" entry. Ensure it exists.
181
+ await sshExec(ssh, [
182
+ `cd ${basePath}/project`,
183
+ `test -x node_modules/.bin/al || (mkdir -p node_modules/.bin && ln -sf ../../dist/cli/main.js node_modules/.bin/al)`,
184
+ ].join(" && "));
185
+ await sshExec(ssh, `cat > ${basePath}/.pkg-hash << 'HASHEOF'\n${localHash}\nHASHEOF`);
186
+ return "Dependencies installed.";
187
+ }
188
+ async function setupNginx(ssh, basePath, cfHost, gatewayPort) {
189
+ const certSrc = `${basePath}/credentials/cloudflare_origin_cert/${cfHost}/certificate`;
190
+ const keySrc = `${basePath}/credentials/cloudflare_origin_cert/${cfHost}/private_key`;
191
+ const { generateNginxConfig } = await import("../cloud/vps/nginx.js");
192
+ const nginxConf = generateNginxConfig(cfHost, gatewayPort);
193
+ const nginxEscaped = nginxConf.replace(/'/g, "'\\''");
194
+ // Heredoc delimiter must be on its own line — place post-heredoc commands on
195
+ // the opening line so the closing NGINXEOF isn't polluted by " && next_cmd".
196
+ const postNginxCmds = [
197
+ `sudo ln -sfn ${VPS_CONSTANTS.NGINX_SITE_CONFIG} /etc/nginx/sites-enabled/action-llama`,
198
+ "sudo rm -f /etc/nginx/sites-enabled/default",
199
+ "sudo nginx -t && sudo systemctl reload nginx",
200
+ ].join(" && ");
201
+ await sshExec(ssh, [
202
+ `sudo mkdir -p ${VPS_CONSTANTS.NGINX_CERT_DIR}`,
203
+ `sudo cp ${certSrc} ${VPS_CONSTANTS.NGINX_CERT_PATH}`,
204
+ `sudo cp ${keySrc} ${VPS_CONSTANTS.NGINX_KEY_PATH}`,
205
+ `sudo tee ${VPS_CONSTANTS.NGINX_SITE_CONFIG} > /dev/null << 'NGINXEOF' && ${postNginxCmds}\n${nginxEscaped}\nNGINXEOF`,
206
+ ].join(" && "));
207
+ return `nginx: ${cfHost} :443 → 127.0.0.1:${gatewayPort}`;
208
+ }
209
+ async function writeEnvAndSymlink(ssh, basePath, gatewayPort, globalConfig) {
210
+ const remoteEnv = {
211
+ gateway: { ...globalConfig.gateway, port: gatewayPort },
212
+ };
213
+ if (globalConfig.telemetry) {
214
+ remoteEnv.telemetry = globalConfig.telemetry;
215
+ }
216
+ const envToml = stringifyTOML(remoteEnv);
217
+ const escaped = envToml.replace(/'/g, "'\\''");
218
+ // Heredoc delimiter must be on its own line — place subsequent commands on the
219
+ // opening line so the closing ENVEOF isn't polluted by " && next_cmd".
220
+ const symlinkCmd = `mkdir -p ~/.action-llama && ln -sfn ${basePath}/credentials ~/.action-llama/credentials`;
221
+ await sshExec(ssh, `cat > ${basePath}/project/.env.toml << 'ENVEOF' && ${symlinkCmd}\n${escaped}\nENVEOF`);
222
+ return ".env.toml written.";
223
+ }
224
+ async function installSystemdUnit(ssh, unitContent) {
225
+ const unitEscaped = unitContent.replace(/'/g, "'\\''");
226
+ // Heredoc delimiter must be on its own line — place post-heredoc commands on
227
+ // the opening line so the closing UNITEOF isn't polluted by " && next_cmd".
228
+ const postUnitCmds = "sudo systemctl daemon-reload && sudo systemctl enable action-llama";
229
+ await sshExec(ssh, `sudo tee /etc/systemd/system/action-llama.service > /dev/null << 'UNITEOF' && ${postUnitCmds}\n${unitEscaped}\nUNITEOF`);
230
+ return "Systemd service installed.";
231
+ }
232
+ /** Ramp-up intervals: faster initial polling, then backs off. */
233
+ const HEALTH_CHECK_INTERVALS_MS = [1000, 1000, 2000, 3000, 3000];
152
234
  async function healthCheck(ssh, port) {
153
235
  const TIMEOUT_MS = 180_000; // 3 minutes — first push builds Docker images
154
- const POLL_MS = 3_000;
155
- console.log(" Waiting for service to start...\n");
236
+ console.log(" Waiting for health check...");
156
237
  // Tail journal for live build/startup progress so the user sees what's happening
157
238
  const journal = sshSpawn(ssh, "journalctl -u action-llama -f --since 'now' -o cat 2>/dev/null");
158
239
  journal.stdout?.on("data", (chunk) => {
@@ -165,23 +246,24 @@ async function healthCheck(ssh, port) {
165
246
  });
166
247
  const startTime = Date.now();
167
248
  let serviceFailed = false;
249
+ let pollIndex = 0;
168
250
  try {
169
251
  while (Date.now() - startTime < TIMEOUT_MS) {
170
- // Try health endpoint
171
252
  try {
172
253
  await sshExec(ssh, `curl -sf http://localhost:${port}/health`);
173
- console.log("\n Health check passed.");
254
+ console.log(" Health check passed.");
174
255
  return;
175
256
  }
176
257
  catch {
177
- // Check if service has crashed/stopped — fail fast instead of waiting
178
258
  const active = await sshExecSafe(ssh, "systemctl is-active action-llama");
179
259
  if (active === "failed" || active === "inactive") {
180
260
  serviceFailed = true;
181
261
  break;
182
262
  }
183
263
  }
184
- await new Promise((r) => setTimeout(r, POLL_MS));
264
+ const delay = HEALTH_CHECK_INTERVALS_MS[Math.min(pollIndex, HEALTH_CHECK_INTERVALS_MS.length - 1)];
265
+ pollIndex++;
266
+ await new Promise((r) => setTimeout(r, delay));
185
267
  }
186
268
  }
187
269
  finally {
@@ -189,18 +271,17 @@ async function healthCheck(ssh, port) {
189
271
  }
190
272
  // Failure diagnostics
191
273
  if (serviceFailed) {
192
- console.log("\n Service failed to start.\n");
274
+ console.log("\n Service failed to start.");
193
275
  }
194
276
  else {
195
- console.log(`\nHealth check did not pass within ${Math.round(TIMEOUT_MS / 1000)}s.\n`);
277
+ console.log(`\n Health check timed out after ${Math.round(TIMEOUT_MS / 1000)}s.`);
196
278
  }
197
- console.log("=== Service status ===\n");
279
+ console.log("\n Service status:");
198
280
  const statusOutput = await sshExecSafe(ssh, "systemctl status action-llama --no-pager -l 2>&1; true");
199
281
  console.log(statusOutput || " (no output)");
200
- console.log("\n=== Recent logs ===\n");
282
+ console.log("\n Recent logs:");
201
283
  const logsOutput = await sshExecSafe(ssh, "journalctl -u action-llama --no-pager -n 40 2>&1; true");
202
- console.log(logsOutput || " (no log output — service may have failed to start)");
203
- console.log("");
284
+ console.log(logsOutput || " (no log output)");
204
285
  }
205
286
  /**
206
287
  * Run a command via SSH, returning whatever output is available even if the
@@ -1 +1 @@
1
- {"version":3,"file":"push.js","sourceRoot":"","sources":["../../src/remote/push.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"push.js","sourceRoot":"","sources":["../../src/remote/push.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ export interface SshOptions {
4
4
  user: string;
5
5
  port: number;
6
6
  keyPath?: string;
7
+ controlPath?: string;
7
8
  }
8
9
  export declare function sshOptionsFromConfig(config: ServerConfig): SshOptions;
9
10
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ssh.d.ts","sourceRoot":"","sources":["../../src/remote/ssh.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAIxD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,UAAU,CAOrE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,EAAE,CAWvD;AAED;;;GAGG;AACH,wBAAsB,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAKhF;AAED;;GAEG;AACH,wBAAsB,OAAO,CAC3B,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,EACnB,UAAU,CAAC,EAAE,MAAM,EAAE,GACpB,OAAO,CAAC,IAAI,CAAC,CA4Bf;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,0HAIzD"}
1
+ {"version":3,"file":"ssh.d.ts","sourceRoot":"","sources":["../../src/remote/ssh.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAIxD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,UAAU,CAOrE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,EAAE,CAkBvD;AAED;;;GAGG;AACH,wBAAsB,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAKhF;AAED;;GAEG;AACH,wBAAsB,OAAO,CAC3B,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,EACnB,UAAU,CAAC,EAAE,MAAM,EAAE,GACpB,OAAO,CAAC,IAAI,CAAC,CAiCf;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,0HAIzD"}
@@ -18,6 +18,9 @@ export function buildSshArgs(opts) {
18
18
  "-o", "BatchMode=yes",
19
19
  "-p", String(opts.port),
20
20
  ];
21
+ if (opts.controlPath) {
22
+ args.push("-o", "ControlMaster=auto", "-o", `ControlPath=${opts.controlPath}`, "-o", "ControlPersist=30");
23
+ }
21
24
  if (opts.keyPath) {
22
25
  args.push("-i", opts.keyPath);
23
26
  }
@@ -43,6 +46,11 @@ export async function rsyncTo(opts, localPath, remotePath, excludes, extraFlags)
43
46
  "-o", "StrictHostKeyChecking=accept-new",
44
47
  "-o", "BatchMode=yes",
45
48
  "-p", String(opts.port),
49
+ ...(opts.controlPath ? [
50
+ "-o", "ControlMaster=auto",
51
+ "-o", `ControlPath=${opts.controlPath}`,
52
+ "-o", "ControlPersist=30",
53
+ ] : []),
46
54
  ...(opts.keyPath ? ["-i", opts.keyPath] : []),
47
55
  ].join(" ");
48
56
  const args = [
@@ -1 +1 @@
1
- {"version":3,"file":"ssh.js","sourceRoot":"","sources":["../../src/remote/ssh.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ssh.js","sourceRoot":"","sources":["../../src/remote/ssh.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scheduler/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B,OAAO,KAAK,EAAE,YAAY,EAAe,MAAM,qBAAqB,CAAC;AAGrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAKzD,OAAO,EAAE,UAAU,EAAmB,MAAM,kBAAkB,CAAC;AAa/D,YAAY,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAEjE,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,oBAAoB,CAAC,EAAE,YAAY,EAAE,aAAa,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,OAAO;;;;;;;GA0gB9J"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scheduler/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B,OAAO,KAAK,EAAE,YAAY,EAAe,MAAM,qBAAqB,CAAC;AAGrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAKzD,OAAO,EAAE,UAAU,EAAmB,MAAM,kBAAkB,CAAC;AAa/D,YAAY,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAEjE,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,oBAAoB,CAAC,EAAE,YAAY,EAAE,aAAa,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,OAAO;;;;;;;GA0jB9J"}
@@ -202,6 +202,12 @@ export async function startScheduler(projectPath, globalConfigOverride, statusTr
202
202
  // 1. Create the container runtime
203
203
  const { runtime, agentRuntimeOverrides } = await createContainerRuntime(globalConfig, activeAgentConfigs, logger);
204
204
  logger.info({ runtime: "local" }, "Container mode enabled — initializing infrastructure");
205
+ // Start gateway proxy container so containers can reach the host gateway
206
+ // via http://gateway:8080 on the Docker network.
207
+ if (runtime.startGatewayProxy) {
208
+ logger.info({ port: gatewayPort }, "Starting gateway proxy container");
209
+ await runtime.startGatewayProxy(gatewayPort);
210
+ }
205
211
  // Check for orphan containers from a previous scheduler run.
206
212
  // Only clean up containers belonging to agents in this project to avoid
207
213
  // killing containers from other schedulers running in parallel (e.g. tests).
@@ -243,13 +249,50 @@ export async function startScheduler(projectPath, globalConfigOverride, statusTr
243
249
  const unregisterContainer = gateway
244
250
  ? gateway.unregisterContainer
245
251
  : async (_secret) => { };
246
- for (const agentConfig of agentConfigs) {
252
+ // Enforce project-wide scale limit
253
+ let totalScale = 0;
254
+ const adjustedConfigs = agentConfigs.map(config => ({ ...config }));
255
+ if (globalConfig.scale !== undefined) {
256
+ for (let i = 0; i < adjustedConfigs.length; i++) {
257
+ const config = adjustedConfigs[i];
258
+ const requestedScale = config.scale ?? 1;
259
+ const remainingCapacity = globalConfig.scale - totalScale;
260
+ if (remainingCapacity <= 0) {
261
+ config.scale = 1; // Ensure at least 1 runner per agent
262
+ if (requestedScale > 1) {
263
+ logger.warn({
264
+ agent: config.name,
265
+ requested: requestedScale,
266
+ reduced: 1,
267
+ projectLimit: globalConfig.scale
268
+ }, "Agent scale reduced due to project scale limit");
269
+ }
270
+ totalScale += 1;
271
+ }
272
+ else if (requestedScale > remainingCapacity) {
273
+ config.scale = remainingCapacity;
274
+ logger.warn({
275
+ agent: config.name,
276
+ requested: requestedScale,
277
+ reduced: remainingCapacity,
278
+ projectLimit: globalConfig.scale
279
+ }, "Agent scale reduced due to project scale limit");
280
+ totalScale += remainingCapacity;
281
+ }
282
+ else {
283
+ totalScale += requestedScale;
284
+ }
285
+ }
286
+ }
287
+ for (const agentConfig of adjustedConfigs) {
247
288
  const scale = agentConfig.scale ?? 1;
248
289
  const runners = [];
290
+ // Single log file per agent — instances share the file and are distinguished
291
+ // by the `instance` field in each log entry (generated per-run by the runner).
292
+ const agentLogger = mkLogger(projectPath, agentConfig.name);
249
293
  for (let i = 0; i < scale; i++) {
250
- const instanceId = scale >= 2 ? `${agentConfig.name}(${i + 1})` : agentConfig.name;
251
294
  const agentRuntime = agentRuntimeOverrides[agentConfig.name] || runtime;
252
- runners.push(new ContainerAgentRunnerClass(agentRuntime, globalConfig, agentConfig, mkLogger(projectPath, instanceId), registerContainer, unregisterContainer, gatewayUrl, projectPath, agentImages[agentConfig.name] || baseImage, statusTracker, instanceId));
295
+ runners.push(new ContainerAgentRunnerClass(agentRuntime, globalConfig, agentConfig, agentLogger, registerContainer, unregisterContainer, gatewayUrl, projectPath, agentImages[agentConfig.name] || baseImage, statusTracker));
253
296
  }
254
297
  runnerPools[agentConfig.name] = new RunnerPool(runners);
255
298
  logger.info({ agent: agentConfig.name, scale }, "Created runner pool");
@@ -313,20 +356,21 @@ export async function startScheduler(projectPath, globalConfigOverride, statusTr
313
356
  filter,
314
357
  trigger: (context) => {
315
358
  if (statusTracker && !statusTracker.isAgentEnabled(agentConfig.name))
316
- return;
359
+ return false;
317
360
  const runner = pool.getAvailableRunner();
318
361
  if (!runner) {
319
362
  const { dropped } = schedulerCtx.workQueue.enqueue(agentConfig.name, { type: 'webhook', context });
320
363
  logger.info({ agent: agentConfig.name, event: context.event, queueSize: schedulerCtx.workQueue.size(agentConfig.name) }, "webhook queued");
321
364
  if (dropped)
322
365
  logger.warn({ agent: agentConfig.name }, "queue full, oldest event dropped");
323
- return;
366
+ return true;
324
367
  }
325
368
  logger.info({ agent: agentConfig.name, event: context.event, action: context.action }, "webhook triggering agent");
326
369
  const prompt = makeWebhookPrompt(agentConfig, context, schedulerCtx);
327
370
  executeRun(runner, prompt, { type: 'webhook', source: context.event }, agentConfig.name, 0, schedulerCtx)
328
371
  .then(() => drainQueues(schedulerCtx))
329
372
  .catch((err) => logger.error({ err, agent: agentConfig.name }, "webhook run failed"));
373
+ return true;
330
374
  },
331
375
  });
332
376
  }
@@ -436,9 +480,9 @@ export async function startScheduler(projectPath, globalConfigOverride, statusTr
436
480
  skills,
437
481
  timezone,
438
482
  baseImage,
439
- createRunner: (agentConfig, image, instanceId) => {
483
+ createRunner: (agentConfig, image) => {
440
484
  const agentRuntime = agentRuntimeOverrides[agentConfig.name] || runtime;
441
- return new ContainerAgentRunnerClass(agentRuntime, globalConfig, agentConfig, mkLogger(projectPath, instanceId), registerContainer, unregisterContainer, gatewayUrl, projectPath, image, statusTracker, instanceId);
485
+ return new ContainerAgentRunnerClass(agentRuntime, globalConfig, agentConfig, mkLogger(projectPath, agentConfig.name), registerContainer, unregisterContainer, gatewayUrl, projectPath, image, statusTracker);
442
486
  },
443
487
  });
444
488
  logger.info("Watching agents/ for changes (hot reload enabled)");
@@ -455,6 +499,11 @@ export async function startScheduler(projectPath, globalConfigOverride, statusTr
455
499
  await gateway.close();
456
500
  logger.info("Gateway server stopped");
457
501
  }
502
+ // Stop gateway proxy container
503
+ if (runtime?.stopGatewayProxy) {
504
+ await runtime.stopGatewayProxy();
505
+ logger.info("Gateway proxy container stopped");
506
+ }
458
507
  if (stateStore) {
459
508
  await stateStore.close();
460
509
  }