@tyvm/knowhow 0.0.132 → 0.0.135
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/package.json +1 -1
- package/src/agents/base/base.ts +63 -21
- package/src/cli.ts +2 -0
- package/src/commands/hash.ts +15 -7
- package/src/commands/sandbox.ts +540 -0
- package/src/tunnel.ts +11 -0
- package/src/worker.ts +102 -10
- package/tests/agents/interrupt.test.ts +207 -0
- package/ts_build/package.json +1 -1
- package/ts_build/src/agents/base/base.d.ts +2 -0
- package/ts_build/src/agents/base/base.js +30 -19
- package/ts_build/src/agents/base/base.js.map +1 -1
- package/ts_build/src/cli.js +2 -0
- package/ts_build/src/cli.js.map +1 -1
- package/ts_build/src/commands/hash.js +12 -7
- package/ts_build/src/commands/hash.js.map +1 -1
- package/ts_build/src/commands/sandbox.d.ts +2 -0
- package/ts_build/src/commands/sandbox.js +353 -0
- package/ts_build/src/commands/sandbox.js.map +1 -0
- package/ts_build/src/tunnel.d.ts +1 -0
- package/ts_build/src/tunnel.js +6 -1
- package/ts_build/src/tunnel.js.map +1 -1
- package/ts_build/src/worker.js +56 -6
- package/ts_build/src/worker.js.map +1 -1
- package/ts_build/tests/agents/interrupt.test.d.ts +15 -0
- package/ts_build/tests/agents/interrupt.test.js +146 -0
- package/ts_build/tests/agents/interrupt.test.js.map +1 -0
|
@@ -60,7 +60,10 @@ function addHashCommand(program) {
|
|
|
60
60
|
.requiredOption("--name <name>", "Unique name for this hash slot (e.g. 'build', 'generate-api'). Becomes the top-level key in .hashes.json.")
|
|
61
61
|
.requiredOption("--input <glob>", "Glob pattern(s) of input files to hash. Separate multiple globs with commas.")
|
|
62
62
|
.option("--output <paths>", "Optional output file(s) — if any are missing the check always returns changed (comma-separated).")
|
|
63
|
-
.option("--save", "Save the current hash
|
|
63
|
+
.option("--save", "Save the current hash. In standalone mode, records the hash immediately (no command run). " +
|
|
64
|
+
"In --run mode, records the hash only if the command succeeds. " +
|
|
65
|
+
"Without --save in --run mode, the hash is never recorded — useful when --run is a " +
|
|
66
|
+
"side-effect trigger rather than the step that produces the tracked artifacts.")
|
|
64
67
|
.option("--run <command>", "Self-contained mode: if inputs are unchanged, skip and exit 0. " +
|
|
65
68
|
"If changed (or first run), run this shell command and — only if it " +
|
|
66
69
|
"succeeds — save the new hash. Replaces the '(hash) || (build && hash --save)' pattern.")
|
|
@@ -126,12 +129,14 @@ function addHashCommand(program) {
|
|
|
126
129
|
catch (err) {
|
|
127
130
|
process.exit(typeof err?.status === "number" ? err.status : 1);
|
|
128
131
|
}
|
|
129
|
-
if (
|
|
130
|
-
hashes[opts.name]
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
132
|
+
if (opts.save) {
|
|
133
|
+
if (!hashes[opts.name])
|
|
134
|
+
hashes[opts.name] = {};
|
|
135
|
+
hashes[opts.name][opts.input] = currentHash;
|
|
136
|
+
await (0, hashes_1.saveHashes)(hashes);
|
|
137
|
+
if (opts.verbose) {
|
|
138
|
+
console.error(`[knowhow hash] saved hash ${currentHash} for "${opts.name}"`);
|
|
139
|
+
}
|
|
135
140
|
}
|
|
136
141
|
process.exit(0);
|
|
137
142
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hash.js","sourceRoot":"","sources":["../../../src/commands/hash.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBA,
|
|
1
|
+
{"version":3,"file":"hash.js","sourceRoot":"","sources":["../../../src/commands/hash.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.addSandboxCommand = addSandboxCommand;
|
|
7
|
+
const KnowhowClient_1 = require("../services/KnowhowClient");
|
|
8
|
+
const http_1 = __importDefault(require("../utils/http"));
|
|
9
|
+
function getBaseUrl() {
|
|
10
|
+
return `${process.env.KNOWHOW_API_URL || KnowhowClient_1.KNOWHOW_API_URL}/api`;
|
|
11
|
+
}
|
|
12
|
+
function getAuthHeaders() {
|
|
13
|
+
const token = process.env.KNOWHOW_API_TOKEN ||
|
|
14
|
+
(() => {
|
|
15
|
+
try {
|
|
16
|
+
return (0, KnowhowClient_1.loadKnowhowJwt)();
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
throw new Error("No API token found. Set KNOWHOW_API_TOKEN env var or run `knowhow login`.");
|
|
20
|
+
}
|
|
21
|
+
})();
|
|
22
|
+
return { Authorization: `Bearer ${token}` };
|
|
23
|
+
}
|
|
24
|
+
async function apiGet(path) {
|
|
25
|
+
const res = await http_1.default.get(`${getBaseUrl()}${path}`, {
|
|
26
|
+
headers: getAuthHeaders(),
|
|
27
|
+
});
|
|
28
|
+
return res.data;
|
|
29
|
+
}
|
|
30
|
+
async function apiPost(path, body) {
|
|
31
|
+
const res = await http_1.default.post(`${getBaseUrl()}${path}`, body, {
|
|
32
|
+
headers: getAuthHeaders(),
|
|
33
|
+
});
|
|
34
|
+
return res.data;
|
|
35
|
+
}
|
|
36
|
+
async function apiDelete(path) {
|
|
37
|
+
await http_1.default.delete(`${getBaseUrl()}${path}`, {
|
|
38
|
+
headers: getAuthHeaders(),
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
async function resolveSandboxId(nameOrId) {
|
|
42
|
+
if (/^[a-z0-9]{15,}$/i.test(nameOrId)) {
|
|
43
|
+
return nameOrId;
|
|
44
|
+
}
|
|
45
|
+
const sandboxes = await apiGet("/sandboxes");
|
|
46
|
+
const match = sandboxes.find((s) => s.name === nameOrId || s.id === nameOrId);
|
|
47
|
+
if (!match) {
|
|
48
|
+
const names = sandboxes.map((s) => s.name || s.id).join(", ");
|
|
49
|
+
throw new Error(`Sandbox not found: "${nameOrId}". Available: ${names || "(none)"}`);
|
|
50
|
+
}
|
|
51
|
+
return match.id;
|
|
52
|
+
}
|
|
53
|
+
async function resolveSnapshot(sandboxId, nameOrId) {
|
|
54
|
+
if (/^[a-z0-9]{15,}$/i.test(nameOrId)) {
|
|
55
|
+
try {
|
|
56
|
+
return await apiGet(`/sandboxes/${sandboxId}/snapshots/${nameOrId}`);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
const snapshots = await apiGet(`/sandboxes/${sandboxId}/snapshots`);
|
|
62
|
+
let match = snapshots.find((s) => s.label === nameOrId || s.id === nameOrId);
|
|
63
|
+
if (!match) {
|
|
64
|
+
const orgSnaps = await apiGet("/org-snapshots");
|
|
65
|
+
match = orgSnaps.find((s) => s.label === nameOrId || s.id === nameOrId);
|
|
66
|
+
}
|
|
67
|
+
if (!match) {
|
|
68
|
+
const labels = snapshots.map((s) => s.label || s.id).join(", ");
|
|
69
|
+
throw new Error(`Snapshot not found: "${nameOrId}". Available for sandbox: ${labels || "(none)"}`);
|
|
70
|
+
}
|
|
71
|
+
return match;
|
|
72
|
+
}
|
|
73
|
+
async function pollSandboxStatus(sandboxId, targetStatuses, timeoutMs, label = sandboxId) {
|
|
74
|
+
const deadline = Date.now() + timeoutMs;
|
|
75
|
+
let lastStatus = "";
|
|
76
|
+
while (Date.now() < deadline) {
|
|
77
|
+
const sandbox = await apiGet(`/sandboxes/${sandboxId}`);
|
|
78
|
+
if (sandbox.status !== lastStatus) {
|
|
79
|
+
console.log(` [${label}] status: ${sandbox.status}`);
|
|
80
|
+
lastStatus = sandbox.status;
|
|
81
|
+
}
|
|
82
|
+
if (targetStatuses.includes(sandbox.status))
|
|
83
|
+
return sandbox;
|
|
84
|
+
if (["error", "destroyed", "terminated"].includes(sandbox.status)) {
|
|
85
|
+
throw new Error(`Sandbox ${label} entered terminal status: ${sandbox.status}`);
|
|
86
|
+
}
|
|
87
|
+
await new Promise((r) => setTimeout(r, 5000));
|
|
88
|
+
}
|
|
89
|
+
throw new Error(`Timeout waiting for sandbox ${label} to reach ${targetStatuses.join("/")} (${timeoutMs}ms). Last: ${lastStatus}`);
|
|
90
|
+
}
|
|
91
|
+
async function pollSnapshotStatus(sandboxId, snapshotId, targetStatuses, timeoutMs) {
|
|
92
|
+
const deadline = Date.now() + timeoutMs;
|
|
93
|
+
let lastStatus = "";
|
|
94
|
+
while (Date.now() < deadline) {
|
|
95
|
+
const snap = await apiGet(`/sandboxes/${sandboxId}/snapshots/${snapshotId}`);
|
|
96
|
+
if (snap.status !== lastStatus) {
|
|
97
|
+
console.log(` [snapshot] status: ${snap.status}`);
|
|
98
|
+
if (snap.statusMessage)
|
|
99
|
+
console.log(` message: ${snap.statusMessage}`);
|
|
100
|
+
lastStatus = snap.status;
|
|
101
|
+
}
|
|
102
|
+
if (targetStatuses.includes(snap.status))
|
|
103
|
+
return snap;
|
|
104
|
+
if (["error", "failed"].includes(snap.status)) {
|
|
105
|
+
throw new Error(`Snapshot failed: ${snap.errorMsg || snap.statusMessage || "(no details)"}`);
|
|
106
|
+
}
|
|
107
|
+
await new Promise((r) => setTimeout(r, 5000));
|
|
108
|
+
}
|
|
109
|
+
throw new Error(`Timeout waiting for snapshot to reach ${targetStatuses.join("/")} (${timeoutMs}ms). Last: ${lastStatus}`);
|
|
110
|
+
}
|
|
111
|
+
function addSandboxCommand(program) {
|
|
112
|
+
const sandboxCmd = program
|
|
113
|
+
.command("sandbox")
|
|
114
|
+
.description("Manage Knowhow sandboxes and snapshots");
|
|
115
|
+
sandboxCmd
|
|
116
|
+
.command("list")
|
|
117
|
+
.description("List all sandboxes in your org")
|
|
118
|
+
.option("--status <status>", "Filter by status (running|stopped|all)", "all")
|
|
119
|
+
.option("--json", "Output raw JSON")
|
|
120
|
+
.action(async (opts) => {
|
|
121
|
+
const sandboxes = await apiGet("/sandboxes");
|
|
122
|
+
const filtered = opts.status === "all"
|
|
123
|
+
? sandboxes
|
|
124
|
+
: sandboxes.filter((s) => s.status === opts.status);
|
|
125
|
+
if (opts.json) {
|
|
126
|
+
console.log(JSON.stringify(filtered, null, 2));
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
console.log(`Found ${filtered.length} sandbox(es):\n`);
|
|
130
|
+
for (const s of filtered) {
|
|
131
|
+
console.log(` ${s.id} name=${s.name || "(none)"} status=${s.status} vmStatus=${s.vmStatus || "?"}`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
sandboxCmd
|
|
136
|
+
.command("list-snapshots")
|
|
137
|
+
.description("List snapshots (org-wide or for a specific sandbox)")
|
|
138
|
+
.option("--sandbox-id <id>", "Filter by sandbox ID")
|
|
139
|
+
.option("--sandbox-name <name>", "Filter by sandbox name")
|
|
140
|
+
.option("--json", "Output raw JSON")
|
|
141
|
+
.action(async (opts) => {
|
|
142
|
+
let snapshots;
|
|
143
|
+
if (opts.sandboxId || opts.sandboxName) {
|
|
144
|
+
const sbId = opts.sandboxId || (await resolveSandboxId(opts.sandboxName));
|
|
145
|
+
snapshots = await apiGet(`/sandboxes/${sbId}/snapshots`);
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
snapshots = await apiGet("/org-snapshots");
|
|
149
|
+
}
|
|
150
|
+
if (opts.json) {
|
|
151
|
+
console.log(JSON.stringify(snapshots, null, 2));
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
console.log(`Found ${snapshots.length} snapshot(s):\n`);
|
|
155
|
+
for (const s of snapshots) {
|
|
156
|
+
console.log(` ${s.id} label=${s.label || "(none)"} status=${s.status} sandboxId=${s.sandboxId}`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
sandboxCmd
|
|
161
|
+
.command("exec")
|
|
162
|
+
.description("Execute a command in a running sandbox")
|
|
163
|
+
.option("--sandbox-id <id>", "Sandbox ID")
|
|
164
|
+
.option("--sandbox-name <name>", "Sandbox name")
|
|
165
|
+
.requiredOption("--cmd <command>", "Shell command to run (passed to /bin/bash -c)")
|
|
166
|
+
.option("--timeout-ms <ms>", "Timeout in ms (max 300000)", "60000")
|
|
167
|
+
.action(async (opts) => {
|
|
168
|
+
const sbId = opts.sandboxId || (opts.sandboxName ? await resolveSandboxId(opts.sandboxName) : null);
|
|
169
|
+
if (!sbId)
|
|
170
|
+
throw new Error("Provide --sandbox-id or --sandbox-name");
|
|
171
|
+
console.log(`Executing in sandbox ${sbId}: ${opts.cmd}`);
|
|
172
|
+
const result = await apiPost(`/sandboxes/${sbId}/exec`, {
|
|
173
|
+
command: "/bin/bash",
|
|
174
|
+
args: ["-c", opts.cmd],
|
|
175
|
+
timeoutMs: Math.min(Number(opts.timeoutMs), 300000),
|
|
176
|
+
});
|
|
177
|
+
if (result.stdout)
|
|
178
|
+
process.stdout.write(result.stdout);
|
|
179
|
+
if (result.stderr)
|
|
180
|
+
process.stderr.write(result.stderr);
|
|
181
|
+
if (result.exitCode != null && result.exitCode !== 0) {
|
|
182
|
+
process.exit(result.exitCode);
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
sandboxCmd
|
|
186
|
+
.command("start")
|
|
187
|
+
.description("Start a stopped sandbox")
|
|
188
|
+
.option("--sandbox-id <id>", "Sandbox ID")
|
|
189
|
+
.option("--sandbox-name <name>", "Sandbox name")
|
|
190
|
+
.option("--wait", "Wait until sandbox is running")
|
|
191
|
+
.option("--timeout-minutes <min>", "Max wait time in minutes", "10")
|
|
192
|
+
.action(async (opts) => {
|
|
193
|
+
const sbId = opts.sandboxId || (opts.sandboxName ? await resolveSandboxId(opts.sandboxName) : null);
|
|
194
|
+
if (!sbId)
|
|
195
|
+
throw new Error("Provide --sandbox-id or --sandbox-name");
|
|
196
|
+
console.log(`Starting sandbox ${sbId}...`);
|
|
197
|
+
await apiPost(`/sandboxes/${sbId}/start`);
|
|
198
|
+
if (opts.wait) {
|
|
199
|
+
await pollSandboxStatus(sbId, ["running"], Number(opts.timeoutMinutes) * 60000);
|
|
200
|
+
console.log("✓ Sandbox is running");
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
sandboxCmd
|
|
204
|
+
.command("stop")
|
|
205
|
+
.description("Stop a running sandbox")
|
|
206
|
+
.option("--sandbox-id <id>", "Sandbox ID")
|
|
207
|
+
.option("--sandbox-name <name>", "Sandbox name")
|
|
208
|
+
.option("--wait", "Wait until sandbox is stopped")
|
|
209
|
+
.option("--timeout-minutes <min>", "Max wait time in minutes", "10")
|
|
210
|
+
.action(async (opts) => {
|
|
211
|
+
const sbId = opts.sandboxId || (opts.sandboxName ? await resolveSandboxId(opts.sandboxName) : null);
|
|
212
|
+
if (!sbId)
|
|
213
|
+
throw new Error("Provide --sandbox-id or --sandbox-name");
|
|
214
|
+
console.log(`Stopping sandbox ${sbId}...`);
|
|
215
|
+
await apiPost(`/sandboxes/${sbId}/stop`);
|
|
216
|
+
if (opts.wait) {
|
|
217
|
+
await pollSandboxStatus(sbId, ["stopped"], Number(opts.timeoutMinutes) * 60000);
|
|
218
|
+
console.log("✓ Sandbox is stopped");
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
sandboxCmd
|
|
222
|
+
.command("delete-snapshot")
|
|
223
|
+
.description("Delete a snapshot by ID")
|
|
224
|
+
.option("--sandbox-id <id>", "Sandbox ID")
|
|
225
|
+
.option("--sandbox-name <name>", "Sandbox name")
|
|
226
|
+
.requiredOption("--snapshot-id <id>", "Snapshot ID to delete")
|
|
227
|
+
.action(async (opts) => {
|
|
228
|
+
const sbId = opts.sandboxId || (opts.sandboxName ? await resolveSandboxId(opts.sandboxName) : null);
|
|
229
|
+
if (!sbId)
|
|
230
|
+
throw new Error("Provide --sandbox-id or --sandbox-name");
|
|
231
|
+
await apiDelete(`/sandboxes/${sbId}/snapshots/${opts.snapshotId}`);
|
|
232
|
+
console.log(`✓ Deleted snapshot ${opts.snapshotId}`);
|
|
233
|
+
});
|
|
234
|
+
sandboxCmd
|
|
235
|
+
.command("regenerate-snapshot")
|
|
236
|
+
.description("Regenerate a snapshot: forks an ephemeral sandbox from it, runs the\n" +
|
|
237
|
+
"snapshot's setupScript on a fresh base image, captures a new snapshot\n" +
|
|
238
|
+
"with the same label, then destroys the ephemeral sandbox.\n\n" +
|
|
239
|
+
"Typical CI usage (run before tests, only when inputs changed):\n" +
|
|
240
|
+
" knowhow hash --name prisma-gen --input 'prisma/schema/**,package-lock.json' \\\\\n" +
|
|
241
|
+
" || knowhow sandbox regenerate-snapshot \\\\\n" +
|
|
242
|
+
" --sandbox-name knowhow-web --snapshot-name tests-ready")
|
|
243
|
+
.option("--sandbox-id <id>", "Source sandbox ID")
|
|
244
|
+
.option("--sandbox-name <name>", "Source sandbox name (alternative to --sandbox-id)")
|
|
245
|
+
.option("--snapshot-id <id>", "Snapshot ID to regenerate")
|
|
246
|
+
.option("--snapshot-name <name>", "Snapshot label to regenerate")
|
|
247
|
+
.option("--no-wait", "Return immediately without waiting for snapshot to be ready")
|
|
248
|
+
.option("--timeout-minutes <min>", "Max time for the full regen cycle", "60")
|
|
249
|
+
.action(async (opts) => {
|
|
250
|
+
const timeoutMs = Number(opts.timeoutMinutes) * 60 * 1000;
|
|
251
|
+
const deadline = Date.now() + timeoutMs;
|
|
252
|
+
if (!opts.sandboxId && !opts.sandboxName) {
|
|
253
|
+
throw new Error("Provide --sandbox-id or --sandbox-name");
|
|
254
|
+
}
|
|
255
|
+
const sandboxId = opts.sandboxId || (await resolveSandboxId(opts.sandboxName));
|
|
256
|
+
if (!opts.snapshotId && !opts.snapshotName) {
|
|
257
|
+
throw new Error("Provide --snapshot-id or --snapshot-name");
|
|
258
|
+
}
|
|
259
|
+
const snapshot = opts.snapshotId
|
|
260
|
+
? await apiGet(`/sandboxes/${sandboxId}/snapshots/${opts.snapshotId}`)
|
|
261
|
+
: await resolveSnapshot(sandboxId, opts.snapshotName);
|
|
262
|
+
const snapshotId = snapshot.id;
|
|
263
|
+
console.log(`\n🔄 Regenerating snapshot "${snapshot.label || snapshotId}" (${snapshotId})`);
|
|
264
|
+
console.log(` Source sandbox: ${sandboxId}`);
|
|
265
|
+
if (snapshot.status !== "ready") {
|
|
266
|
+
throw new Error(`Snapshot must be in 'ready' status to regenerate (current: ${snapshot.status})`);
|
|
267
|
+
}
|
|
268
|
+
if (!snapshot.setupScript) {
|
|
269
|
+
throw new Error("Snapshot has no setupScript. Add one via the UI before regenerating.");
|
|
270
|
+
}
|
|
271
|
+
console.log("\n📦 Step 1/4: Forking ephemeral sandbox from snapshot...");
|
|
272
|
+
const ephemeralName = `regen-${snapshotId.slice(0, 8)}-${Date.now()}`;
|
|
273
|
+
const forkResult = await apiPost("/sandboxes/fork", { snapshotId, name: ephemeralName });
|
|
274
|
+
const ephemeralId = forkResult.id || forkResult.sandboxId;
|
|
275
|
+
if (!ephemeralId) {
|
|
276
|
+
throw new Error(`Fork did not return a sandbox ID: ${JSON.stringify(forkResult)}`);
|
|
277
|
+
}
|
|
278
|
+
console.log(` Ephemeral sandbox: ${ephemeralId} (${ephemeralName})`);
|
|
279
|
+
console.log("\n⏳ Step 2/4: Waiting for sandbox to start...");
|
|
280
|
+
await pollSandboxStatus(ephemeralId, ["running"], Math.min(deadline - Date.now(), 10 * 60 * 1000), ephemeralName);
|
|
281
|
+
console.log(" ✓ Running");
|
|
282
|
+
console.log("\n🔧 Step 3/4: Executing setupScript...");
|
|
283
|
+
console.log(` Script length: ${snapshot.setupScript.length} chars`);
|
|
284
|
+
let execResult;
|
|
285
|
+
try {
|
|
286
|
+
execResult = await apiPost(`/sandboxes/${ephemeralId}/exec`, {
|
|
287
|
+
command: "/bin/bash",
|
|
288
|
+
args: ["-c", snapshot.setupScript],
|
|
289
|
+
timeoutMs: Math.min(deadline - Date.now(), 25 * 60 * 1000),
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
catch (err) {
|
|
293
|
+
console.error(`\n❌ setupScript exec failed: ${err.message}`);
|
|
294
|
+
await safeDestroy(ephemeralId);
|
|
295
|
+
throw err;
|
|
296
|
+
}
|
|
297
|
+
if (execResult.stdout) {
|
|
298
|
+
console.log("--- stdout ---");
|
|
299
|
+
process.stdout.write(execResult.stdout);
|
|
300
|
+
}
|
|
301
|
+
if (execResult.stderr) {
|
|
302
|
+
console.error("--- stderr ---");
|
|
303
|
+
process.stderr.write(execResult.stderr);
|
|
304
|
+
}
|
|
305
|
+
if (execResult.exitCode != null && execResult.exitCode !== 0) {
|
|
306
|
+
await safeDestroy(ephemeralId);
|
|
307
|
+
throw new Error(`setupScript exited with code ${execResult.exitCode}`);
|
|
308
|
+
}
|
|
309
|
+
console.log(" ✓ setupScript completed");
|
|
310
|
+
console.log("\n📸 Step 4/4: Capturing new snapshot...");
|
|
311
|
+
const newLabel = snapshot.label || `regen-${snapshotId.slice(0, 8)}`;
|
|
312
|
+
let createResult;
|
|
313
|
+
try {
|
|
314
|
+
createResult = await apiPost(`/sandboxes/${ephemeralId}/snapshots`, {
|
|
315
|
+
label: newLabel,
|
|
316
|
+
description: snapshot.description,
|
|
317
|
+
snapshotContent: snapshot.snapshotContent || "full",
|
|
318
|
+
snapshotType: "full",
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
catch (err) {
|
|
322
|
+
console.error(`\n❌ Snapshot creation failed: ${err.message}`);
|
|
323
|
+
await safeDestroy(ephemeralId);
|
|
324
|
+
throw err;
|
|
325
|
+
}
|
|
326
|
+
const newSnapshot = createResult.snapshot || createResult;
|
|
327
|
+
const newSnapshotId = newSnapshot.id;
|
|
328
|
+
console.log(` New snapshot ID: ${newSnapshotId}`);
|
|
329
|
+
if (opts.wait) {
|
|
330
|
+
console.log(" Waiting for snapshot upload...");
|
|
331
|
+
await pollSnapshotStatus(ephemeralId, newSnapshotId, ["ready"], Math.min(deadline - Date.now(), 20 * 60 * 1000));
|
|
332
|
+
console.log(" ✓ Snapshot ready");
|
|
333
|
+
}
|
|
334
|
+
console.log("\n🗑 Destroying ephemeral sandbox...");
|
|
335
|
+
await safeDestroy(ephemeralId);
|
|
336
|
+
console.log(" ✓ Destroyed");
|
|
337
|
+
console.log(`\n✅ Snapshot regeneration complete!\n` +
|
|
338
|
+
` Old snapshot ID : ${snapshotId}\n` +
|
|
339
|
+
` New snapshot ID : ${newSnapshotId}\n` +
|
|
340
|
+
` Label : ${newLabel}\n\n` +
|
|
341
|
+
`ℹ The old snapshot still exists. Clean it up with:\n` +
|
|
342
|
+
` knowhow sandbox delete-snapshot --sandbox-id ${sandboxId} --snapshot-id ${snapshotId}`);
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
async function safeDestroy(sandboxId) {
|
|
346
|
+
try {
|
|
347
|
+
await apiDelete(`/sandboxes/${sandboxId}`);
|
|
348
|
+
}
|
|
349
|
+
catch (err) {
|
|
350
|
+
console.warn(`⚠ Could not destroy sandbox ${sandboxId}: ${err.message}`);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
//# sourceMappingURL=sandbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../../src/commands/sandbox.ts"],"names":[],"mappings":"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"}
|
package/ts_build/src/tunnel.d.ts
CHANGED
|
@@ -21,6 +21,7 @@ export interface TunnelWebSocketOptions {
|
|
|
21
21
|
onOpen?: (handler: TunnelHandler) => void;
|
|
22
22
|
onClose?: (code: number, reason: string) => void;
|
|
23
23
|
onError?: (error: Error) => void;
|
|
24
|
+
onPong?: () => void;
|
|
24
25
|
authService?: WorkerPasskeyAuthService | null;
|
|
25
26
|
}
|
|
26
27
|
export declare function connectTunnelWebSocket(options: TunnelWebSocketOptions): WebSocket;
|
package/ts_build/src/tunnel.js
CHANGED
|
@@ -62,7 +62,7 @@ function resolveTunnelConfig(config, isInsideDocker) {
|
|
|
62
62
|
return { tunnelLocalHost, portMapping };
|
|
63
63
|
}
|
|
64
64
|
function connectTunnelWebSocket(options) {
|
|
65
|
-
const { tunnelDomain, tunnelUseHttps, tunnelLocalHost, portMapping, config, headers, onOpen, onClose, onError, authService, } = options;
|
|
65
|
+
const { tunnelDomain, tunnelUseHttps, tunnelLocalHost, portMapping, config, headers, onOpen, onClose, onError, onPong, authService, } = options;
|
|
66
66
|
const tunnelConnection = new ws_1.WebSocket(`${KnowhowClient_1.KNOWHOW_API_URL}/ws/tunnel`, { headers });
|
|
67
67
|
tunnelConnection.on("open", async () => {
|
|
68
68
|
console.log("Tunnel WebSocket connected");
|
|
@@ -101,6 +101,11 @@ function connectTunnelWebSocket(options) {
|
|
|
101
101
|
console.error("Tunnel WebSocket error:", error);
|
|
102
102
|
onError?.(error);
|
|
103
103
|
});
|
|
104
|
+
if (onPong) {
|
|
105
|
+
tunnelConnection.on("pong", () => {
|
|
106
|
+
onPong();
|
|
107
|
+
});
|
|
108
|
+
}
|
|
104
109
|
return tunnelConnection;
|
|
105
110
|
}
|
|
106
111
|
exports.TUNNEL_MINIMAL_TOOLS = [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../../src/tunnel.ts"],"names":[],"mappings":";;;AAiBA,kDAoBC;AAKD,8CAiBC;AAMD,kDA2BC;
|
|
1
|
+
{"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../../src/tunnel.ts"],"names":[],"mappings":"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"}
|
package/ts_build/src/worker.js
CHANGED
|
@@ -245,6 +245,11 @@ async function worker(options) {
|
|
|
245
245
|
let tunnelWs = null;
|
|
246
246
|
let lastJwt = null;
|
|
247
247
|
let unauthorizedJwt = null;
|
|
248
|
+
const PONG_TIMEOUT_MS = 15000;
|
|
249
|
+
let awaitingPong = false;
|
|
250
|
+
let lastPongAt = Date.now();
|
|
251
|
+
let tunnelAwaitingPong = false;
|
|
252
|
+
let tunnelLastPongAt = Date.now();
|
|
248
253
|
const tunnelEnabled = options?.allowedTools
|
|
249
254
|
? true
|
|
250
255
|
: (config.worker?.tunnel?.enabled ?? false);
|
|
@@ -341,6 +346,12 @@ async function worker(options) {
|
|
|
341
346
|
authService,
|
|
342
347
|
onOpen: (handler) => {
|
|
343
348
|
tunnelHandler = handler;
|
|
349
|
+
tunnelAwaitingPong = false;
|
|
350
|
+
tunnelLastPongAt = Date.now();
|
|
351
|
+
},
|
|
352
|
+
onPong: () => {
|
|
353
|
+
tunnelAwaitingPong = false;
|
|
354
|
+
tunnelLastPongAt = Date.now();
|
|
344
355
|
},
|
|
345
356
|
onClose: (code, _reason) => {
|
|
346
357
|
if (code === 1008) {
|
|
@@ -367,6 +378,12 @@ async function worker(options) {
|
|
|
367
378
|
ws.on("open", () => {
|
|
368
379
|
console.log("Worker WebSocket connected");
|
|
369
380
|
connected = true;
|
|
381
|
+
awaitingPong = false;
|
|
382
|
+
lastPongAt = Date.now();
|
|
383
|
+
});
|
|
384
|
+
ws.on("pong", () => {
|
|
385
|
+
awaitingPong = false;
|
|
386
|
+
lastPongAt = Date.now();
|
|
370
387
|
});
|
|
371
388
|
ws.on("close", async (code, reason) => {
|
|
372
389
|
console.log(`WebSocket closed. Code: ${code}, Reason: ${reason.toString()}`);
|
|
@@ -390,8 +407,8 @@ async function worker(options) {
|
|
|
390
407
|
mcpServer.runWsServer(ws);
|
|
391
408
|
return { ws, mcpServer, tunnelWs };
|
|
392
409
|
}
|
|
410
|
+
let connection = null;
|
|
393
411
|
while (true) {
|
|
394
|
-
let connection = null;
|
|
395
412
|
if (!connected) {
|
|
396
413
|
if (unauthorizedJwt !== null) {
|
|
397
414
|
const currentJwt = await (0, login_1.loadJwt)().catch(() => null);
|
|
@@ -406,13 +423,46 @@ async function worker(options) {
|
|
|
406
423
|
connection = await connectWebSocket();
|
|
407
424
|
}
|
|
408
425
|
if (connection && connected) {
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
426
|
+
if (awaitingPong && Date.now() - lastPongAt > PONG_TIMEOUT_MS) {
|
|
427
|
+
console.error(`WebSocket pong timeout (${PONG_TIMEOUT_MS}ms) — connection is dead (likely a snapshot-resume zombie). Forcing reconnect...`);
|
|
428
|
+
try {
|
|
429
|
+
connection.ws.terminate();
|
|
430
|
+
}
|
|
431
|
+
catch {
|
|
432
|
+
}
|
|
414
433
|
connected = false;
|
|
415
434
|
}
|
|
435
|
+
else {
|
|
436
|
+
try {
|
|
437
|
+
awaitingPong = true;
|
|
438
|
+
connection.ws.ping();
|
|
439
|
+
}
|
|
440
|
+
catch (error) {
|
|
441
|
+
console.error("WebSocket ping failed:", error);
|
|
442
|
+
connected = false;
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
if (connected && tunnelWs && tunnelWs.readyState === ws_1.WebSocket.OPEN) {
|
|
446
|
+
if (tunnelAwaitingPong && Date.now() - tunnelLastPongAt > PONG_TIMEOUT_MS) {
|
|
447
|
+
console.error(`Tunnel WebSocket pong timeout (${PONG_TIMEOUT_MS}ms) — tunnel connection is dead. Forcing reconnect...`);
|
|
448
|
+
try {
|
|
449
|
+
tunnelWs.terminate();
|
|
450
|
+
}
|
|
451
|
+
catch {
|
|
452
|
+
}
|
|
453
|
+
connected = false;
|
|
454
|
+
}
|
|
455
|
+
else {
|
|
456
|
+
try {
|
|
457
|
+
tunnelAwaitingPong = true;
|
|
458
|
+
tunnelWs.ping();
|
|
459
|
+
}
|
|
460
|
+
catch (error) {
|
|
461
|
+
console.error("Tunnel WebSocket ping failed:", error);
|
|
462
|
+
connected = false;
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
}
|
|
416
466
|
}
|
|
417
467
|
await (0, utils_1.wait)(5000);
|
|
418
468
|
}
|