@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.
- package/{docs/agent-reference → agent-docs}/AGENTS.md +31 -15
- package/{docs/agent-reference → agent-docs}/skills/README.md +1 -0
- package/agent-docs/skills/calls.md +82 -0
- package/{docs/agent-reference → agent-docs}/skills/resource-locks.md +13 -7
- package/{docs/agent-reference → agent-docs}/skills/signals.md +1 -1
- package/dist/agents/container-runner.d.ts +3 -2
- package/dist/agents/container-runner.d.ts.map +1 -1
- package/dist/agents/container-runner.js +12 -12
- package/dist/agents/container-runner.js.map +1 -1
- package/dist/agents/prompt.d.ts.map +1 -1
- package/dist/agents/prompt.js +3 -2
- package/dist/agents/prompt.js.map +1 -1
- package/dist/agents/runner.d.ts +3 -2
- package/dist/agents/runner.d.ts.map +1 -1
- package/dist/agents/runner.js +14 -14
- package/dist/agents/runner.js.map +1 -1
- package/dist/build-info.json +1 -1
- package/dist/cli/commands/doctor.d.ts +1 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +53 -15
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/env.d.ts +4 -0
- package/dist/cli/commands/env.d.ts.map +1 -1
- package/dist/cli/commands/env.js +41 -0
- package/dist/cli/commands/env.js.map +1 -1
- package/dist/cli/commands/kill.js +2 -2
- package/dist/cli/commands/kill.js.map +1 -1
- package/dist/cli/commands/logs.d.ts.map +1 -1
- package/dist/cli/commands/logs.js +25 -20
- package/dist/cli/commands/logs.js.map +1 -1
- package/dist/cli/commands/pause.js +2 -2
- package/dist/cli/commands/pause.js.map +1 -1
- package/dist/cli/commands/push.d.ts +1 -0
- package/dist/cli/commands/push.d.ts.map +1 -1
- package/dist/cli/commands/push.js +2 -1
- package/dist/cli/commands/push.js.map +1 -1
- package/dist/cli/commands/resume.js +2 -2
- package/dist/cli/commands/resume.js.map +1 -1
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +21 -46
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/start.d.ts.map +1 -1
- package/dist/cli/commands/start.js +62 -2
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +23 -7
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/stop.d.ts +1 -0
- package/dist/cli/commands/stop.d.ts.map +1 -1
- package/dist/cli/commands/stop.js +3 -2
- package/dist/cli/commands/stop.js.map +1 -1
- package/dist/cli/gateway-client.d.ts +6 -0
- package/dist/cli/gateway-client.d.ts.map +1 -1
- package/dist/cli/gateway-client.js +19 -0
- package/dist/cli/gateway-client.js.map +1 -1
- package/dist/cli/main.js +12 -0
- package/dist/cli/main.js.map +1 -1
- package/dist/cloud/vps/constants.d.ts +1 -1
- package/dist/cloud/vps/constants.d.ts.map +1 -1
- package/dist/cloud/vps/constants.js +9 -0
- package/dist/cloud/vps/constants.js.map +1 -1
- package/dist/cloud/vps/hetzner-api.d.ts +14 -3
- package/dist/cloud/vps/hetzner-api.d.ts.map +1 -1
- package/dist/cloud/vps/hetzner-api.js +24 -11
- package/dist/cloud/vps/hetzner-api.js.map +1 -1
- package/dist/cloud/vps/provision.js +29 -6
- package/dist/cloud/vps/provision.js.map +1 -1
- package/dist/cloud/vps/ssh.d.ts +7 -0
- package/dist/cloud/vps/ssh.d.ts.map +1 -1
- package/dist/cloud/vps/ssh.js +15 -1
- package/dist/cloud/vps/ssh.js.map +1 -1
- package/dist/credentials/builtins/index.d.ts.map +1 -1
- package/dist/credentials/builtins/index.js +2 -0
- package/dist/credentials/builtins/index.js.map +1 -1
- package/dist/credentials/builtins/reddit-oauth.d.ts +4 -0
- package/dist/credentials/builtins/reddit-oauth.d.ts.map +1 -0
- package/dist/credentials/builtins/reddit-oauth.js +71 -0
- package/dist/credentials/builtins/reddit-oauth.js.map +1 -0
- package/dist/docker/local-runtime.d.ts +1 -0
- package/dist/docker/local-runtime.d.ts.map +1 -1
- package/dist/docker/local-runtime.js +9 -6
- package/dist/docker/local-runtime.js.map +1 -1
- package/dist/gateway/index.d.ts.map +1 -1
- package/dist/gateway/index.js +5 -4
- package/dist/gateway/index.js.map +1 -1
- package/dist/gateway/routes/logs.d.ts.map +1 -1
- package/dist/gateway/routes/logs.js +29 -111
- package/dist/gateway/routes/logs.js.map +1 -1
- package/dist/remote/bootstrap.d.ts +2 -0
- package/dist/remote/bootstrap.d.ts.map +1 -1
- package/dist/remote/bootstrap.js +7 -11
- package/dist/remote/bootstrap.js.map +1 -1
- package/dist/remote/push.d.ts +6 -0
- package/dist/remote/push.d.ts.map +1 -1
- package/dist/remote/push.js +172 -91
- package/dist/remote/push.js.map +1 -1
- package/dist/remote/ssh.d.ts +1 -0
- package/dist/remote/ssh.d.ts.map +1 -1
- package/dist/remote/ssh.js +8 -0
- package/dist/remote/ssh.js.map +1 -1
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js +56 -7
- package/dist/scheduler/index.js.map +1 -1
- package/dist/scheduler/watcher.d.ts +1 -1
- package/dist/scheduler/watcher.d.ts.map +1 -1
- package/dist/scheduler/watcher.js +5 -6
- package/dist/scheduler/watcher.js.map +1 -1
- package/dist/setup/scaffold.js +2 -2
- package/dist/setup/scaffold.js.map +1 -1
- package/dist/shared/config.d.ts +1 -0
- package/dist/shared/config.d.ts.map +1 -1
- package/dist/shared/config.js.map +1 -1
- package/dist/shared/credentials.d.ts +8 -18
- package/dist/shared/credentials.d.ts.map +1 -1
- package/dist/shared/credentials.js +8 -62
- package/dist/shared/credentials.js.map +1 -1
- package/dist/shared/server.d.ts +2 -0
- package/dist/shared/server.d.ts.map +1 -1
- package/dist/shared/server.js.map +1 -1
- package/dist/tui/App.d.ts.map +1 -1
- package/dist/tui/App.js +1 -1
- package/dist/tui/App.js.map +1 -1
- package/dist/webhooks/definitions/github.d.ts.map +1 -1
- package/dist/webhooks/definitions/github.js +13 -0
- package/dist/webhooks/definitions/github.js.map +1 -1
- package/dist/webhooks/providers/github.d.ts.map +1 -1
- package/dist/webhooks/providers/github.js +6 -0
- package/dist/webhooks/providers/github.js.map +1 -1
- package/dist/webhooks/registry.d.ts.map +1 -1
- package/dist/webhooks/registry.js +9 -3
- package/dist/webhooks/registry.js.map +1 -1
- package/dist/webhooks/types.d.ts +3 -1
- package/dist/webhooks/types.d.ts.map +1 -1
- package/docker/bin/_http-exit +17 -0
- package/docker/bin/al-call +10 -4
- package/docker/bin/al-check +9 -3
- package/docker/bin/al-status +1 -1
- package/docker/bin/al-wait +11 -3
- package/docker/bin/rlock +9 -2
- package/docker/bin/rlock-heartbeat +9 -2
- package/docker/bin/runlock +9 -2
- package/package.json +2 -2
- package/docs/agent-config-reference.md +0 -313
- package/docs/agents.md +0 -256
- package/docs/cloud-run.md +0 -173
- package/docs/cloud.md +0 -98
- package/docs/commands.md +0 -286
- package/docs/config-reference.md +0 -241
- package/docs/creating-agents.md +0 -147
- package/docs/credentials.md +0 -167
- package/docs/docker.md +0 -323
- package/docs/ecs.md +0 -795
- package/docs/examples/dev/ACTIONS.md +0 -75
- package/docs/examples/dev/README.md +0 -28
- package/docs/examples/dev/agent-config.toml +0 -18
- package/docs/examples/devops/ACTIONS.md +0 -33
- package/docs/examples/devops/README.md +0 -23
- package/docs/examples/devops/agent-config.toml +0 -13
- package/docs/examples/index.md +0 -15
- package/docs/examples/reviewer/ACTIONS.md +0 -37
- package/docs/examples/reviewer/README.md +0 -22
- package/docs/examples/reviewer/agent-config.toml +0 -11
- package/docs/models.md +0 -191
- package/docs/vps-deployment.md +0 -285
- package/docs/web-dashboard.md +0 -113
- package/docs/webhooks.md +0 -152
- /package/{docs/agent-reference → agent-docs}/skills/credentials.md +0 -0
- /package/{docs/agent-reference → agent-docs}/skills/environment.md +0 -0
package/dist/remote/push.js
CHANGED
|
@@ -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("\
|
|
88
|
+
console.log("\nChecking server...");
|
|
51
89
|
let binPaths;
|
|
52
90
|
if (dryRun) {
|
|
53
|
-
console.log("(dry-run)
|
|
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
|
-
|
|
63
|
-
|
|
64
|
-
if (!noFiles)
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
];
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
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
|
-
|
|
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
|
-
|
|
118
|
-
|
|
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("\
|
|
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
|
-
//
|
|
131
|
-
console.log("\
|
|
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
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
//
|
|
139
|
-
console.log("\
|
|
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
|
-
|
|
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("
|
|
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
|
-
|
|
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
|
|
274
|
+
console.log("\n Service failed to start.");
|
|
193
275
|
}
|
|
194
276
|
else {
|
|
195
|
-
console.log(`\
|
|
277
|
+
console.log(`\n Health check timed out after ${Math.round(TIMEOUT_MS / 1000)}s.`);
|
|
196
278
|
}
|
|
197
|
-
console.log("
|
|
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
|
|
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
|
|
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
|
package/dist/remote/push.js.map
CHANGED
|
@@ -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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"}
|
package/dist/remote/ssh.d.ts
CHANGED
package/dist/remote/ssh.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/remote/ssh.js
CHANGED
|
@@ -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 = [
|
package/dist/remote/ssh.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssh.js","sourceRoot":"","sources":["../../src/remote/ssh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAGjC,MAAM,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;
|
|
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;;;;;;;
|
|
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"}
|
package/dist/scheduler/index.js
CHANGED
|
@@ -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
|
-
|
|
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,
|
|
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
|
|
483
|
+
createRunner: (agentConfig, image) => {
|
|
440
484
|
const agentRuntime = agentRuntimeOverrides[agentConfig.name] || runtime;
|
|
441
|
-
return new ContainerAgentRunnerClass(agentRuntime, globalConfig, agentConfig, mkLogger(projectPath,
|
|
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
|
}
|