@action-llama/action-llama 0.12.0 → 0.12.2
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/dist/build-info.json +1 -1
- package/dist/cli/commands/chat.js +1 -1
- package/dist/cli/commands/chat.js.map +1 -1
- package/dist/cli/commands/kill.d.ts.map +1 -1
- package/dist/cli/commands/kill.js +1 -0
- package/dist/cli/commands/kill.js.map +1 -1
- package/dist/cli/commands/logs.js +3 -3
- package/dist/cli/commands/logs.js.map +1 -1
- package/dist/cli/commands/pause.d.ts.map +1 -1
- package/dist/cli/commands/pause.js +1 -0
- package/dist/cli/commands/pause.js.map +1 -1
- package/dist/cli/commands/push.d.ts.map +1 -1
- package/dist/cli/commands/push.js +0 -1
- package/dist/cli/commands/push.js.map +1 -1
- package/dist/cli/commands/resume.d.ts.map +1 -1
- package/dist/cli/commands/resume.js +1 -0
- package/dist/cli/commands/resume.js.map +1 -1
- package/dist/cli/commands/start.d.ts +1 -0
- package/dist/cli/commands/start.d.ts.map +1 -1
- package/dist/cli/commands/start.js +6 -0
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/status.js +2 -2
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/gateway-client.d.ts +4 -2
- package/dist/cli/gateway-client.d.ts.map +1 -1
- package/dist/cli/gateway-client.js +6 -4
- package/dist/cli/gateway-client.js.map +1 -1
- package/dist/cli/main.js +1 -0
- package/dist/cli/main.js.map +1 -1
- package/dist/cloud/vps/hetzner-api.d.ts +133 -0
- package/dist/cloud/vps/hetzner-api.d.ts.map +1 -0
- package/dist/cloud/vps/hetzner-api.js +95 -0
- package/dist/cloud/vps/hetzner-api.js.map +1 -0
- package/dist/cloud/vps/provision.d.ts.map +1 -1
- package/dist/cloud/vps/provision.js +414 -3
- package/dist/cloud/vps/provision.js.map +1 -1
- package/dist/cloud/vps/teardown.d.ts.map +1 -1
- package/dist/cloud/vps/teardown.js +18 -15
- package/dist/cloud/vps/teardown.js.map +1 -1
- package/dist/credentials/builtins/hetzner-api-key.d.ts +4 -0
- package/dist/credentials/builtins/hetzner-api-key.d.ts.map +1 -0
- package/dist/credentials/builtins/hetzner-api-key.js +24 -0
- package/dist/credentials/builtins/hetzner-api-key.js.map +1 -0
- 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/gateway/views/logs-page.d.ts.map +1 -1
- package/dist/gateway/views/logs-page.js +121 -25
- package/dist/gateway/views/logs-page.js.map +1 -1
- package/dist/remote/bootstrap.d.ts +5 -4
- package/dist/remote/bootstrap.d.ts.map +1 -1
- package/dist/remote/bootstrap.js +6 -36
- package/dist/remote/bootstrap.js.map +1 -1
- package/dist/remote/push.d.ts +1 -2
- package/dist/remote/push.d.ts.map +1 -1
- package/dist/remote/push.js +42 -13
- package/dist/remote/push.js.map +1 -1
- package/dist/scheduler/index.js +1 -1
- package/dist/scheduler/index.js.map +1 -1
- package/dist/shared/config.d.ts +2 -0
- package/dist/shared/config.d.ts.map +1 -1
- package/dist/shared/config.js.map +1 -1
- package/docs/cloud.md +2 -1
- package/docs/vps-deployment.md +11 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hetzner-api-key.d.ts","sourceRoot":"","sources":["../../../src/credentials/builtins/hetzner-api-key.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEzD,QAAA,MAAM,aAAa,EAAE,oBAsBpB,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
const hetznerApiKey = {
|
|
2
|
+
id: "hetzner_api_key",
|
|
3
|
+
label: "Hetzner API Key",
|
|
4
|
+
description: "API key for Hetzner Cloud VPS provisioning (not needed at agent runtime)",
|
|
5
|
+
helpUrl: "https://console.hetzner.cloud/projects",
|
|
6
|
+
fields: [
|
|
7
|
+
{ name: "api_key", label: "API Key", description: "Hetzner Cloud API key", secret: true },
|
|
8
|
+
],
|
|
9
|
+
envVars: { api_key: "HETZNER_API_KEY" },
|
|
10
|
+
agentContext: "`HETZNER_API_KEY` — Hetzner Cloud API access (provisioning only, not typically needed by agents)",
|
|
11
|
+
async validate(values) {
|
|
12
|
+
const res = await fetch("https://api.hetzner.cloud/v1/server_types", {
|
|
13
|
+
headers: { Authorization: `Bearer ${values.api_key}` },
|
|
14
|
+
});
|
|
15
|
+
if (!res.ok) {
|
|
16
|
+
const body = await res.json().catch(() => ({ error: { message: "Unknown error" } }));
|
|
17
|
+
const errorMessage = body.error?.message || `HTTP ${res.status}`;
|
|
18
|
+
throw new Error(`Hetzner API key validation failed: ${errorMessage}`);
|
|
19
|
+
}
|
|
20
|
+
return true;
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
export default hetznerApiKey;
|
|
24
|
+
//# sourceMappingURL=hetzner-api-key.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hetzner-api-key.js","sourceRoot":"","sources":["../../../src/credentials/builtins/hetzner-api-key.ts"],"names":[],"mappings":"AAEA,MAAM,aAAa,GAAyB;IAC1C,EAAE,EAAE,iBAAiB;IACrB,KAAK,EAAE,iBAAiB;IACxB,WAAW,EAAE,0EAA0E;IACvF,OAAO,EAAE,wCAAwC;IACjD,MAAM,EAAE;QACN,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,EAAE,IAAI,EAAE;KAC1F;IACD,OAAO,EAAE,EAAE,OAAO,EAAE,iBAAiB,EAAE;IACvC,YAAY,EAAE,kGAAkG;IAEhH,KAAK,CAAC,QAAQ,CAAC,MAAM;QACnB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,2CAA2C,EAAE;YACnE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,MAAM,CAAC,OAAO,EAAE,EAAE;SACvD,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC;YACrF,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,EAAE,OAAO,IAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;YACjE,MAAM,IAAI,KAAK,CAAC,sCAAsC,YAAY,EAAE,CAAC,CAAC;QACxE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/credentials/builtins/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/credentials/builtins/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAyBzD,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAwBnE,CAAC"}
|
|
@@ -18,6 +18,7 @@ import netlifyToken from "./netlify-token.js";
|
|
|
18
18
|
import xTwitterApi from "./x-twitter-api.js";
|
|
19
19
|
import bugsnagToken from "./bugsnag-token.js";
|
|
20
20
|
import vultrApiKey from "./vultr-api-key.js";
|
|
21
|
+
import hetznerApiKey from "./hetzner-api-key.js";
|
|
21
22
|
import vpsSsh from "./vps-ssh.js";
|
|
22
23
|
import cloudflareApiToken from "./cloudflare-api-token.js";
|
|
23
24
|
export const builtinCredentials = {
|
|
@@ -41,6 +42,7 @@ export const builtinCredentials = {
|
|
|
41
42
|
"x_twitter_api": xTwitterApi,
|
|
42
43
|
"bugsnag_token": bugsnagToken,
|
|
43
44
|
"vultr_api_key": vultrApiKey,
|
|
45
|
+
"hetzner_api_key": hetznerApiKey,
|
|
44
46
|
"vps_ssh": vpsSsh,
|
|
45
47
|
"cloudflare_api_token": cloudflareApiToken,
|
|
46
48
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/credentials/builtins/index.ts"],"names":[],"mappings":"AACA,OAAO,WAAW,MAAM,mBAAmB,CAAC;AAC5C,OAAO,YAAY,MAAM,oBAAoB,CAAC;AAC9C,OAAO,SAAS,MAAM,iBAAiB,CAAC;AACxC,OAAO,OAAO,MAAM,eAAe,CAAC;AACpC,OAAO,SAAS,MAAM,iBAAiB,CAAC;AACxC,OAAO,MAAM,MAAM,cAAc,CAAC;AAClC,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAC1C,OAAO,aAAa,MAAM,qBAAqB,CAAC;AAChD,OAAO,SAAS,MAAM,iBAAiB,CAAC;AACxC,OAAO,WAAW,MAAM,mBAAmB,CAAC;AAC5C,OAAO,WAAW,MAAM,mBAAmB,CAAC;AAC5C,OAAO,WAAW,MAAM,mBAAmB,CAAC;AAC5C,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,mBAAmB,MAAM,4BAA4B,CAAC;AAC7D,OAAO,kBAAkB,MAAM,2BAA2B,CAAC;AAC3D,OAAO,mBAAmB,MAAM,4BAA4B,CAAC;AAC7D,OAAO,YAAY,MAAM,oBAAoB,CAAC;AAC9C,OAAO,WAAW,MAAM,oBAAoB,CAAC;AAC7C,OAAO,YAAY,MAAM,oBAAoB,CAAC;AAC9C,OAAO,WAAW,MAAM,oBAAoB,CAAC;AAC7C,OAAO,MAAM,MAAM,cAAc,CAAC;AAClC,OAAO,kBAAkB,MAAM,2BAA2B,CAAC;AAE3D,MAAM,CAAC,MAAM,kBAAkB,GAAyC;IACtE,cAAc,EAAE,WAAW;IAC3B,eAAe,EAAE,YAAY;IAC7B,YAAY,EAAE,SAAS;IACvB,UAAU,EAAE,OAAO;IACnB,YAAY,EAAE,SAAS;IACvB,SAAS,EAAE,MAAM;IACjB,aAAa,EAAE,UAAU;IACzB,gBAAgB,EAAE,aAAa;IAC/B,YAAY,EAAE,SAAS;IACvB,cAAc,EAAE,WAAW;IAC3B,cAAc,EAAE,WAAW;IAC3B,cAAc,EAAE,WAAW;IAC3B,SAAS,EAAE,MAAM;IACjB,uBAAuB,EAAE,mBAAmB;IAC5C,sBAAsB,EAAE,kBAAkB;IAC1C,uBAAuB,EAAE,mBAAmB;IAC5C,eAAe,EAAE,YAAY;IAC7B,eAAe,EAAE,WAAW;IAC5B,eAAe,EAAE,YAAY;IAC7B,eAAe,EAAE,WAAW;IAC5B,SAAS,EAAE,MAAM;IACjB,sBAAsB,EAAE,kBAAkB;CAC3C,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/credentials/builtins/index.ts"],"names":[],"mappings":"AACA,OAAO,WAAW,MAAM,mBAAmB,CAAC;AAC5C,OAAO,YAAY,MAAM,oBAAoB,CAAC;AAC9C,OAAO,SAAS,MAAM,iBAAiB,CAAC;AACxC,OAAO,OAAO,MAAM,eAAe,CAAC;AACpC,OAAO,SAAS,MAAM,iBAAiB,CAAC;AACxC,OAAO,MAAM,MAAM,cAAc,CAAC;AAClC,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAC1C,OAAO,aAAa,MAAM,qBAAqB,CAAC;AAChD,OAAO,SAAS,MAAM,iBAAiB,CAAC;AACxC,OAAO,WAAW,MAAM,mBAAmB,CAAC;AAC5C,OAAO,WAAW,MAAM,mBAAmB,CAAC;AAC5C,OAAO,WAAW,MAAM,mBAAmB,CAAC;AAC5C,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,mBAAmB,MAAM,4BAA4B,CAAC;AAC7D,OAAO,kBAAkB,MAAM,2BAA2B,CAAC;AAC3D,OAAO,mBAAmB,MAAM,4BAA4B,CAAC;AAC7D,OAAO,YAAY,MAAM,oBAAoB,CAAC;AAC9C,OAAO,WAAW,MAAM,oBAAoB,CAAC;AAC7C,OAAO,YAAY,MAAM,oBAAoB,CAAC;AAC9C,OAAO,WAAW,MAAM,oBAAoB,CAAC;AAC7C,OAAO,aAAa,MAAM,sBAAsB,CAAC;AACjD,OAAO,MAAM,MAAM,cAAc,CAAC;AAClC,OAAO,kBAAkB,MAAM,2BAA2B,CAAC;AAE3D,MAAM,CAAC,MAAM,kBAAkB,GAAyC;IACtE,cAAc,EAAE,WAAW;IAC3B,eAAe,EAAE,YAAY;IAC7B,YAAY,EAAE,SAAS;IACvB,UAAU,EAAE,OAAO;IACnB,YAAY,EAAE,SAAS;IACvB,SAAS,EAAE,MAAM;IACjB,aAAa,EAAE,UAAU;IACzB,gBAAgB,EAAE,aAAa;IAC/B,YAAY,EAAE,SAAS;IACvB,cAAc,EAAE,WAAW;IAC3B,cAAc,EAAE,WAAW;IAC3B,cAAc,EAAE,WAAW;IAC3B,SAAS,EAAE,MAAM;IACjB,uBAAuB,EAAE,mBAAmB;IAC5C,sBAAsB,EAAE,kBAAkB;IAC1C,uBAAuB,EAAE,mBAAmB;IAC5C,eAAe,EAAE,YAAY;IAC7B,eAAe,EAAE,WAAW;IAC5B,eAAe,EAAE,YAAY;IAC7B,eAAe,EAAE,WAAW;IAC5B,iBAAiB,EAAE,aAAa;IAChC,SAAS,EAAE,MAAM;IACjB,sBAAsB,EAAE,kBAAkB;CAC3C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logs-page.d.ts","sourceRoot":"","sources":["../../../src/gateway/views/logs-page.ts"],"names":[],"mappings":"AAQA,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CA+
|
|
1
|
+
{"version":3,"file":"logs-page.d.ts","sourceRoot":"","sources":["../../../src/gateway/views/logs-page.ts"],"names":[],"mappings":"AAQA,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CA+QxD"}
|
|
@@ -27,14 +27,21 @@ export function renderLogsPage(agentName) {
|
|
|
27
27
|
.controls button.active { background: #3b82f6; border-color: #3b82f6; }
|
|
28
28
|
.controls .status { font-size: 0.8rem; color: #64748b; }
|
|
29
29
|
.log-container { flex: 1; background: #1e293b; border-radius: 8px; padding: 12px; font-family: 'SF Mono', 'Fira Code', monospace; font-size: 0.75rem; line-height: 1.5; overflow-y: auto; min-height: 0; -webkit-overflow-scrolling: touch; }
|
|
30
|
-
.log-line { white-space: pre-wrap; word-break: break-all; }
|
|
30
|
+
.log-line { white-space: pre-wrap; word-break: break-all; padding: 1px 0; }
|
|
31
31
|
.log-time { color: #64748b; }
|
|
32
|
-
.log-
|
|
33
|
-
.log-
|
|
34
|
-
.log-
|
|
35
|
-
.log-
|
|
36
|
-
.log-
|
|
37
|
-
.log-
|
|
32
|
+
.log-msg { color: #cbd5e1; }
|
|
33
|
+
.log-assistant { color: #f8fafc; font-weight: 500; }
|
|
34
|
+
.log-assistant-cont { color: #f8fafc; padding-left: 7.5em; display: block; }
|
|
35
|
+
.log-bash { color: #22d3ee; }
|
|
36
|
+
.log-tool { color: #60a5fa; }
|
|
37
|
+
.log-tool-error { color: #ef4444; }
|
|
38
|
+
.log-lifecycle { color: #c084fc; font-weight: 600; }
|
|
39
|
+
.log-completed { color: #22c55e; font-weight: 600; }
|
|
40
|
+
.log-dim { color: #64748b; }
|
|
41
|
+
.log-warn { color: #eab308; }
|
|
42
|
+
.log-error { color: #ef4444; font-weight: 600; }
|
|
43
|
+
.log-detail { color: #64748b; padding-left: 7.5em; display: block; font-size: 0.9em; }
|
|
44
|
+
.run-header { border-top: 1px solid #334155; margin-top: 8px; padding-top: 6px; color: #c084fc; font-weight: 600; }
|
|
38
45
|
.empty { color: #475569; font-style: italic; }
|
|
39
46
|
.connection-status { font-size: 0.75rem; padding: 2px 8px; border-radius: 3px; }
|
|
40
47
|
.connection-status.connected { color: #22c55e; }
|
|
@@ -101,29 +108,118 @@ export function renderLogsPage(agentName) {
|
|
|
101
108
|
lineCountEl.textContent = "0 lines";
|
|
102
109
|
}
|
|
103
110
|
|
|
104
|
-
const
|
|
105
|
-
const levelClasses = { 10: "trace", 20: "debug", 30: "info", 40: "warn", 50: "error", 60: "error" };
|
|
111
|
+
const SKIP_MSGS = new Set(["event", "tool done"]);
|
|
106
112
|
|
|
107
|
-
function
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
113
|
+
function fmtTime(ts) {
|
|
114
|
+
return new Date(ts).toLocaleTimeString("en-US", { hour12: false });
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function formatEntry(p) {
|
|
118
|
+
var time = '<span class="log-time">' + esc(fmtTime(p.time)) + '</span> ';
|
|
119
|
+
var msg = p.msg || "";
|
|
120
|
+
var lvl = p.level || 30;
|
|
121
|
+
|
|
122
|
+
// Skip noise
|
|
123
|
+
if (SKIP_MSGS.has(msg)) return null;
|
|
124
|
+
if (lvl <= 20 && msg !== "tool start") return null;
|
|
125
|
+
|
|
126
|
+
// Assistant text
|
|
127
|
+
if (msg === "assistant") {
|
|
128
|
+
var text = p.text || "";
|
|
129
|
+
if (!text) return null;
|
|
130
|
+
var lines = text.split("\\n");
|
|
131
|
+
var out = time + '<span class="log-assistant">' + esc(lines[0]) + '</span>';
|
|
132
|
+
for (var i = 1; i < lines.length; i++) {
|
|
133
|
+
out += '<span class="log-assistant-cont">' + esc(lines[i]) + '</span>';
|
|
134
|
+
}
|
|
135
|
+
return out;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// Bash command
|
|
139
|
+
if (msg === "bash") {
|
|
140
|
+
return time + '<span class="log-bash">$ ' + esc(p.cmd || "") + '</span>';
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Tool start
|
|
144
|
+
if (msg === "tool start") {
|
|
145
|
+
return time + '<span class="log-tool">\\u25b8 ' + esc(p.tool || "unknown") + '</span>';
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Tool error
|
|
149
|
+
if (msg === "tool error") {
|
|
150
|
+
var out = time + '<span class="log-tool-error">\\u2717 ' + esc(p.tool || "unknown") + ' failed</span>';
|
|
151
|
+
if (p.cmd) out += '<span class="log-detail">$ ' + esc(String(p.cmd)) + '</span>';
|
|
152
|
+
if (p.result) out += '<span class="log-detail">' + esc(String(p.result).slice(0, 300)) + '</span>';
|
|
153
|
+
return out;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Run start
|
|
157
|
+
if (msg.startsWith && msg.startsWith("Starting ")) {
|
|
158
|
+
var ctr = p.container ? ' <span class="log-dim">(' + esc(p.container) + ')</span>' : "";
|
|
159
|
+
return time + '<span class="log-lifecycle">' + esc(msg) + '</span>' + ctr;
|
|
119
160
|
}
|
|
161
|
+
|
|
162
|
+
// Run completed
|
|
163
|
+
if (msg === "run completed" || msg === "run completed, rerun requested") {
|
|
164
|
+
var suffix = msg.includes("rerun") ? ' <span class="log-warn">(rerun requested)</span>' : "";
|
|
165
|
+
return time + '<span class="log-completed">Run completed</span>' + suffix;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// Container lifecycle
|
|
169
|
+
if (msg === "container launched") {
|
|
170
|
+
var ctr = p.container ? ' ' + esc(p.container) : "";
|
|
171
|
+
return time + '<span class="log-dim">Container launched' + ctr + '</span>';
|
|
172
|
+
}
|
|
173
|
+
if (msg === "container finished" || msg === "container finished (rerun requested)") {
|
|
174
|
+
var el = p.elapsed ? ' (' + esc(p.elapsed) + ')' : "";
|
|
175
|
+
return time + '<span class="log-dim">Container finished' + el + '</span>';
|
|
176
|
+
}
|
|
177
|
+
if (msg === "container starting") {
|
|
178
|
+
var model = p.modelId ? ' <span class="log-dim">model=' + esc(p.modelId) + '</span>' : "";
|
|
179
|
+
return time + '<span class="log-lifecycle">Container starting: ' + esc(p.agentName || "") + '</span>' + model;
|
|
180
|
+
}
|
|
181
|
+
if (msg === "creating agent session" || msg === "session created, sending prompt") {
|
|
182
|
+
return time + '<span class="log-dim">' + esc(msg) + '</span>';
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// Errors
|
|
186
|
+
if (lvl >= 50) {
|
|
187
|
+
var detail = p.err ? '<span class="log-detail">' + esc(JSON.stringify(p.err).slice(0, 300)) + '</span>' : "";
|
|
188
|
+
return time + '<span class="log-error">ERROR: ' + esc(msg) + '</span>' + detail;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// Warnings
|
|
192
|
+
if (lvl >= 40) {
|
|
193
|
+
return time + '<span class="log-warn">WARN: ' + esc(msg) + '</span>';
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Catch-all
|
|
197
|
+
return time + '<span class="log-dim">' + esc(msg) + '</span>';
|
|
120
198
|
}
|
|
121
199
|
|
|
122
|
-
function
|
|
200
|
+
function maybeRunHeader(p) {
|
|
201
|
+
var msg = p.msg || "";
|
|
202
|
+
if (msg.startsWith && msg.startsWith("Starting ") && (msg.includes(" run") || msg.includes(" container run"))) {
|
|
203
|
+
var name = p.name || "agent";
|
|
204
|
+
var ctr = p.container ? " " + p.container : "";
|
|
205
|
+
return '<div class="log-line run-header">\\u2500\\u2500 ' + esc(name + ctr) + ' ' + "\\u2500".repeat(50) + '</div>';
|
|
206
|
+
}
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
function appendEntry(p) {
|
|
123
211
|
if (emptyMsg && emptyMsg.parentNode) emptyMsg.remove();
|
|
124
|
-
|
|
212
|
+
var header = maybeRunHeader(p);
|
|
213
|
+
if (header) {
|
|
214
|
+
var hdiv = document.createElement("div");
|
|
215
|
+
hdiv.innerHTML = header;
|
|
216
|
+
container.appendChild(hdiv.firstChild);
|
|
217
|
+
}
|
|
218
|
+
var html = formatEntry(p);
|
|
219
|
+
if (!html) return;
|
|
220
|
+
var div = document.createElement("div");
|
|
125
221
|
div.className = "log-line";
|
|
126
|
-
div.innerHTML =
|
|
222
|
+
div.innerHTML = html;
|
|
127
223
|
container.appendChild(div);
|
|
128
224
|
lineCount++;
|
|
129
225
|
lineCountEl.textContent = lineCount + " line" + (lineCount !== 1 ? "s" : "");
|
|
@@ -153,7 +249,7 @@ export function renderLogsPage(agentName) {
|
|
|
153
249
|
const res = await fetch("/api/logs/agents/" + encodeURIComponent(agentName) + "?" + params, { credentials: "same-origin" });
|
|
154
250
|
if (!res.ok) throw new Error(res.status);
|
|
155
251
|
const data = await res.json();
|
|
156
|
-
for (const entry of data.entries)
|
|
252
|
+
for (const entry of data.entries) appendEntry(entry);
|
|
157
253
|
if (data.cursor) logCursor = data.cursor;
|
|
158
254
|
connStatus.textContent = "connected";
|
|
159
255
|
connStatus.className = "connection-status connected";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logs-page.js","sourceRoot":"","sources":["../../../src/gateway/views/logs-page.ts"],"names":[],"mappings":"AAAA,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,GAAG;SACP,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,OAAO;;;;;SAKA,UAAU,CAAC,SAAS,CAAC
|
|
1
|
+
{"version":3,"file":"logs-page.js","sourceRoot":"","sources":["../../../src/gateway/views/logs-page.ts"],"names":[],"mappings":"AAAA,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,GAAG;SACP,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,OAAO;;;;;SAKA,UAAU,CAAC,SAAS,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAuDpB,UAAU,CAAC,SAAS,CAAC;;;;;;;;;;;;;;;;wBAgBP,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAiMzC,CAAC;AACT,CAAC"}
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import type { SshOptions } from "./ssh.js";
|
|
2
2
|
export interface BootstrapResult {
|
|
3
|
-
/** Absolute path to the `al` binary on the remote server. */
|
|
4
|
-
alPath: string;
|
|
5
3
|
/** Absolute path to the `node` binary on the remote server. */
|
|
6
4
|
nodePath: string;
|
|
7
5
|
}
|
|
8
6
|
/**
|
|
9
|
-
* Check server prerequisites
|
|
10
|
-
* Throws if a hard requirement
|
|
7
|
+
* Check server prerequisites (Node >= 20, Docker).
|
|
8
|
+
* Throws if a hard requirement is not met.
|
|
11
9
|
* Returns resolved binary paths for use in the systemd unit.
|
|
10
|
+
*
|
|
11
|
+
* Note: al itself is not checked here — it is installed as a project
|
|
12
|
+
* dependency via `npm install` during the push.
|
|
12
13
|
*/
|
|
13
14
|
export declare function bootstrapServer(ssh: SshOptions): Promise<BootstrapResult>;
|
|
14
15
|
//# sourceMappingURL=bootstrap.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/remote/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAG3C,MAAM,WAAW,eAAe;IAC9B
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/remote/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAG3C,MAAM,WAAW,eAAe;IAC9B,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,eAAe,CAAC,CA8B/E"}
|
package/dist/remote/bootstrap.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { sshExec } from "./ssh.js";
|
|
2
2
|
/**
|
|
3
|
-
* Check server prerequisites
|
|
4
|
-
* Throws if a hard requirement
|
|
3
|
+
* Check server prerequisites (Node >= 20, Docker).
|
|
4
|
+
* Throws if a hard requirement is not met.
|
|
5
5
|
* Returns resolved binary paths for use in the systemd unit.
|
|
6
|
+
*
|
|
7
|
+
* Note: al itself is not checked here — it is installed as a project
|
|
8
|
+
* dependency via `npm install` during the push.
|
|
6
9
|
*/
|
|
7
10
|
export async function bootstrapServer(ssh) {
|
|
8
|
-
|
|
9
|
-
const [nodeResult, dockerResult, alResult] = await Promise.allSettled([
|
|
11
|
+
const [nodeResult, dockerResult] = await Promise.allSettled([
|
|
10
12
|
checkNode(ssh),
|
|
11
13
|
checkDocker(ssh),
|
|
12
|
-
checkAl(ssh),
|
|
13
14
|
]);
|
|
14
|
-
// Report results and collect errors
|
|
15
15
|
const errors = [];
|
|
16
16
|
if (nodeResult.status === "fulfilled") {
|
|
17
17
|
console.log(` Node.js ${nodeResult.value.version}`);
|
|
@@ -25,36 +25,11 @@ export async function bootstrapServer(ssh) {
|
|
|
25
25
|
else {
|
|
26
26
|
errors.push(dockerResult.reason?.message ?? "Docker check failed");
|
|
27
27
|
}
|
|
28
|
-
// al might need install — handle separately
|
|
29
|
-
let alPath;
|
|
30
|
-
if (alResult.status === "fulfilled") {
|
|
31
|
-
console.log(` al ${alResult.value.version}`);
|
|
32
|
-
alPath = alResult.value.path;
|
|
33
|
-
}
|
|
34
|
-
else {
|
|
35
|
-
// Try installing al (requires node to be present)
|
|
36
|
-
if (nodeResult.status !== "fulfilled") {
|
|
37
|
-
errors.push("Cannot install al CLI — Node.js is not available");
|
|
38
|
-
}
|
|
39
|
-
else {
|
|
40
|
-
try {
|
|
41
|
-
console.log(" al not found, installing...");
|
|
42
|
-
await sshExec(ssh, "npm install -g @action-llama/action-llama@next");
|
|
43
|
-
const alVersion = (await sshExec(ssh, "al --version")).trim();
|
|
44
|
-
alPath = (await sshExec(ssh, "which al")).trim();
|
|
45
|
-
console.log(` al ${alVersion} installed`);
|
|
46
|
-
}
|
|
47
|
-
catch {
|
|
48
|
-
errors.push("Failed to install al CLI on the server");
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
28
|
if (errors.length > 0) {
|
|
53
29
|
throw new Error("Server prerequisites not met:\n" +
|
|
54
30
|
errors.map(e => ` - ${e}`).join("\n"));
|
|
55
31
|
}
|
|
56
32
|
return {
|
|
57
|
-
alPath: alPath,
|
|
58
33
|
nodePath: nodeResult.status === "fulfilled" ? nodeResult.value.path : "",
|
|
59
34
|
};
|
|
60
35
|
}
|
|
@@ -82,9 +57,4 @@ async function checkDocker(ssh) {
|
|
|
82
57
|
throw new Error("Docker is not running on the server. Install and start Docker before running al push.");
|
|
83
58
|
}
|
|
84
59
|
}
|
|
85
|
-
async function checkAl(ssh) {
|
|
86
|
-
const alVersion = (await sshExec(ssh, "al --version")).trim();
|
|
87
|
-
const alPath = (await sshExec(ssh, "which al")).trim();
|
|
88
|
-
return { version: alVersion, path: alPath };
|
|
89
|
-
}
|
|
90
60
|
//# sourceMappingURL=bootstrap.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/remote/bootstrap.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/remote/bootstrap.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAOnC;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAe;IACnD,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;QAC1D,SAAS,CAAC,GAAG,CAAC;QACd,WAAW,CAAC,GAAG,CAAC;KACjB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,UAAU,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,aAAa,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACvD,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,IAAI,sBAAsB,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,YAAY,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC;IAChD,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,IAAI,qBAAqB,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACb,iCAAiC;YACjC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CACvC,CAAC;IACJ,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,UAAU,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;KACzE,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,GAAe;IACtC,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAClE,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1D,IAAI,KAAK,GAAG,EAAE,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,iCAAiC,WAAW,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,MAAM,QAAQ,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3D,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAClD,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IAAI,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC;YAAE,MAAM,GAAG,CAAC;QACjD,MAAM,IAAI,KAAK,CACb,gFAAgF,CACjF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,GAAe;IACxC,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,OAAO,CAAC,GAAG,EAAE,2CAA2C,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAClF,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,uFAAuF,CACxF,CAAC;IACJ,CAAC;AACH,CAAC"}
|
package/dist/remote/push.d.ts
CHANGED
|
@@ -5,7 +5,6 @@ export interface PushOptions {
|
|
|
5
5
|
projectPath: string;
|
|
6
6
|
serverConfig: ServerConfig;
|
|
7
7
|
globalConfig: GlobalConfig;
|
|
8
|
-
envName: string;
|
|
9
8
|
dryRun?: boolean;
|
|
10
9
|
noCreds?: boolean;
|
|
11
10
|
noFiles?: boolean;
|
|
@@ -13,7 +12,7 @@ export interface PushOptions {
|
|
|
13
12
|
/**
|
|
14
13
|
* Build a systemd unit file for the al scheduler.
|
|
15
14
|
*/
|
|
16
|
-
export declare function buildSystemdUnit(projectName: string, basePath: string, binPaths?: BootstrapResult): string;
|
|
15
|
+
export declare function buildSystemdUnit(projectName: string, basePath: string, binPaths?: BootstrapResult, gatewayPort?: number): string;
|
|
17
16
|
/**
|
|
18
17
|
* Push project files and credentials to a server, set up systemd, and verify.
|
|
19
18
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../src/remote/push.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAQxD,OAAO,EAAmB,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEvE,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,YAAY,CAAC;IAC3B,
|
|
1
|
+
{"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../src/remote/push.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAQxD,OAAO,EAAmB,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEvE,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,YAAY,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,eAAe,EAC1B,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,CA0BR;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA2HnE"}
|
package/dist/remote/push.js
CHANGED
|
@@ -10,14 +10,13 @@ import { bootstrapServer } from "./bootstrap.js";
|
|
|
10
10
|
/**
|
|
11
11
|
* Build a systemd unit file for the al scheduler.
|
|
12
12
|
*/
|
|
13
|
-
export function buildSystemdUnit(projectName, basePath, binPaths) {
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
export function buildSystemdUnit(projectName, basePath, binPaths, gatewayPort) {
|
|
14
|
+
// al is installed as a project dependency — use the local binary
|
|
15
|
+
const alExec = `${basePath}/project/node_modules/.bin/al`;
|
|
16
|
+
// Ensure node is on PATH so the al binary can find it
|
|
16
17
|
const extraDirs = new Set();
|
|
17
18
|
if (binPaths?.nodePath)
|
|
18
19
|
extraDirs.add(dirname(binPaths.nodePath));
|
|
19
|
-
if (binPaths?.alPath)
|
|
20
|
-
extraDirs.add(dirname(binPaths.alPath));
|
|
21
20
|
const pathEnv = extraDirs.size > 0
|
|
22
21
|
? `\nEnvironment=PATH=${[...extraDirs].join(":")}:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin`
|
|
23
22
|
: "";
|
|
@@ -29,7 +28,7 @@ Requires=docker.service
|
|
|
29
28
|
[Service]
|
|
30
29
|
Type=simple
|
|
31
30
|
WorkingDirectory=${basePath}/project
|
|
32
|
-
ExecStart=${alExec} start --headless --
|
|
31
|
+
ExecStart=${alExec} start --headless -w${gatewayPort ? ` --port ${gatewayPort}` : ""}
|
|
33
32
|
Restart=on-failure
|
|
34
33
|
RestartSec=5
|
|
35
34
|
Environment=NODE_ENV=production${pathEnv}
|
|
@@ -42,7 +41,7 @@ WantedBy=multi-user.target
|
|
|
42
41
|
* Push project files and credentials to a server, set up systemd, and verify.
|
|
43
42
|
*/
|
|
44
43
|
export async function pushToServer(opts) {
|
|
45
|
-
const { projectPath, serverConfig, globalConfig,
|
|
44
|
+
const { projectPath, serverConfig, globalConfig, dryRun, noCreds, noFiles } = opts;
|
|
46
45
|
const ssh = sshOptionsFromConfig(serverConfig);
|
|
47
46
|
const basePath = serverConfig.basePath ?? "/opt/action-llama";
|
|
48
47
|
const gatewayPort = VPS_CONSTANTS.DEFAULT_GATEWAY_PORT;
|
|
@@ -72,6 +71,12 @@ export async function pushToServer(opts) {
|
|
|
72
71
|
];
|
|
73
72
|
await rsyncTo(ssh, projectPath, `${basePath}/project`, excludes, rsyncFlags);
|
|
74
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.");
|
|
79
|
+
}
|
|
75
80
|
}
|
|
76
81
|
// Step 4: Sync credentials
|
|
77
82
|
if (!noCreds) {
|
|
@@ -79,13 +84,37 @@ export async function pushToServer(opts) {
|
|
|
79
84
|
await rsyncTo(ssh, CREDENTIALS_DIR, `${basePath}/credentials`, undefined, rsyncFlags);
|
|
80
85
|
console.log(dryRun ? "(dry-run) Would sync credentials" : "Credentials synced.");
|
|
81
86
|
}
|
|
82
|
-
// Step 5:
|
|
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
|
|
83
106
|
if (!dryRun) {
|
|
84
107
|
console.log("\n=== Writing server .env.toml ===\n");
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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
|
+
}
|
|
117
|
+
const envToml = stringifyTOML(remoteEnv);
|
|
89
118
|
// Escape for shell
|
|
90
119
|
const escaped = envToml.replace(/'/g, "'\\''");
|
|
91
120
|
await sshExec(ssh, `cat > ${basePath}/project/.env.toml << 'ENVEOF'\n${escaped}\nENVEOF`);
|
|
@@ -100,7 +129,7 @@ export async function pushToServer(opts) {
|
|
|
100
129
|
}
|
|
101
130
|
// Step 6: Install systemd unit
|
|
102
131
|
console.log("\n=== Setting up systemd service ===\n");
|
|
103
|
-
const unitContent = buildSystemdUnit(projectName, basePath, binPaths);
|
|
132
|
+
const unitContent = buildSystemdUnit(projectName, basePath, binPaths, gatewayPort);
|
|
104
133
|
const unitEscaped = unitContent.replace(/'/g, "'\\''");
|
|
105
134
|
await sshExec(ssh, `sudo tee /etc/systemd/system/action-llama.service > /dev/null << 'UNITEOF'\n${unitEscaped}\nUNITEOF`);
|
|
106
135
|
await sshExec(ssh, "sudo systemctl daemon-reload");
|
package/dist/remote/push.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push.js","sourceRoot":"","sources":["../../src/remote/push.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAClD,OAAO,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,WAAW,CAAC;AAGvD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAmB,MAAM,UAAU,CAAC;AAC3G,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEjC,MAAM,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;AACvC,OAAO,EAAE,eAAe,EAAwB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"push.js","sourceRoot":"","sources":["../../src/remote/push.ts"],"names":[],"mappings":"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"}
|
package/dist/scheduler/index.js
CHANGED
|
@@ -235,7 +235,7 @@ export async function startScheduler(projectPath, globalConfigOverride, statusTr
|
|
|
235
235
|
Object.assign(agentImages, buildResult.agentImages);
|
|
236
236
|
// Import necessary classes for container runners
|
|
237
237
|
const { ContainerAgentRunner: ContainerAgentRunnerClass } = await import("../agents/container-runner.js");
|
|
238
|
-
const gatewayUrl = process.env.GATEWAY_URL || `http://
|
|
238
|
+
const gatewayUrl = process.env.GATEWAY_URL || `http://gateway:8080`;
|
|
239
239
|
// Gateway callbacks — async (ContainerRegistry persists to StateStore).
|
|
240
240
|
const registerContainer = gateway
|
|
241
241
|
? gateway.registerContainer
|