fission-worker 0.3.1 → 0.4.0
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/agent.js +22 -13
- package/dist/agent.js.map +1 -1
- package/dist/docker.d.ts +4 -0
- package/dist/docker.js +19 -0
- package/dist/docker.js.map +1 -1
- package/package.json +1 -1
- package/runner/modules/pipeline/pipeline-helpers.service.js +45 -4
- package/runner/modules/pipeline/pipeline.service.js +19 -1
- package/runner/modules/worker-api/worker-api.controller.js +13 -1
package/dist/agent.js
CHANGED
|
@@ -18,32 +18,41 @@ async function agentLoop(config) {
|
|
|
18
18
|
};
|
|
19
19
|
process.on("SIGTERM", shutdown);
|
|
20
20
|
process.on("SIGINT", shutdown);
|
|
21
|
-
//
|
|
22
|
-
const
|
|
21
|
+
// Send heartbeat and handle cancel responses
|
|
22
|
+
const sendHeartbeat = async () => {
|
|
23
23
|
try {
|
|
24
|
-
await fetch(`${config.fissionUrl}/api/v1/worker/heartbeat`, {
|
|
24
|
+
const res = await fetch(`${config.fissionUrl}/api/v1/worker/heartbeat`, {
|
|
25
25
|
method: "POST",
|
|
26
26
|
headers: {
|
|
27
27
|
Authorization: `Bearer ${config.apiKey}`,
|
|
28
28
|
"Content-Type": "application/json",
|
|
29
29
|
},
|
|
30
|
-
body: JSON.stringify({
|
|
30
|
+
body: JSON.stringify({
|
|
31
|
+
activeSessions: activeSessions.size,
|
|
32
|
+
activeSessionIds: [...activeSessions.keys()],
|
|
33
|
+
}),
|
|
31
34
|
});
|
|
35
|
+
if (res.ok) {
|
|
36
|
+
const data = await res.json();
|
|
37
|
+
if (data.cancelSessions?.length) {
|
|
38
|
+
for (const sessionId of data.cancelSessions) {
|
|
39
|
+
if (activeSessions.has(sessionId)) {
|
|
40
|
+
console.log(`[agent] Stopping session ${sessionId.slice(0, 8)} (cancelled by dashboard)`);
|
|
41
|
+
(0, docker_1.killSession)(sessionId, activeSessions);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
32
46
|
}
|
|
33
47
|
catch {
|
|
34
48
|
// Heartbeat failure is non-fatal
|
|
35
49
|
}
|
|
36
|
-
}
|
|
50
|
+
};
|
|
51
|
+
// Heartbeat timer
|
|
52
|
+
const heartbeatTimer = setInterval(sendHeartbeat, HEARTBEAT_INTERVAL_MS);
|
|
37
53
|
// Send initial heartbeat
|
|
38
54
|
try {
|
|
39
|
-
await
|
|
40
|
-
method: "POST",
|
|
41
|
-
headers: {
|
|
42
|
-
Authorization: `Bearer ${config.apiKey}`,
|
|
43
|
-
"Content-Type": "application/json",
|
|
44
|
-
},
|
|
45
|
-
body: JSON.stringify({ activeSessions: 0 }),
|
|
46
|
-
});
|
|
55
|
+
await sendHeartbeat();
|
|
47
56
|
console.log(`[agent] Connected to ${config.fissionUrl}`);
|
|
48
57
|
}
|
|
49
58
|
catch (err) {
|
package/dist/agent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":";;AAWA,
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
|
package/dist/docker.d.ts
CHANGED
|
@@ -20,3 +20,7 @@ export interface PipelineJob {
|
|
|
20
20
|
* cleans up when done. Uses the host's Claude subscription auth.
|
|
21
21
|
*/
|
|
22
22
|
export declare function startSession(job: PipelineJob, config: WorkerConfig, activeSessions: Map<string, ChildProcess>): void;
|
|
23
|
+
/**
|
|
24
|
+
* Kill a running session — sends SIGTERM, then SIGKILL after 10s grace period.
|
|
25
|
+
*/
|
|
26
|
+
export declare function killSession(sessionId: string, activeSessions: Map<string, ChildProcess>): void;
|
package/dist/docker.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.startSession = startSession;
|
|
4
|
+
exports.killSession = killSession;
|
|
4
5
|
const child_process_1 = require("child_process");
|
|
5
6
|
const fs_1 = require("fs");
|
|
6
7
|
const path_1 = require("path");
|
|
@@ -138,6 +139,24 @@ function findRunnerScript() {
|
|
|
138
139
|
}
|
|
139
140
|
return null;
|
|
140
141
|
}
|
|
142
|
+
/**
|
|
143
|
+
* Kill a running session — sends SIGTERM, then SIGKILL after 10s grace period.
|
|
144
|
+
*/
|
|
145
|
+
function killSession(sessionId, activeSessions) {
|
|
146
|
+
const proc = activeSessions.get(sessionId);
|
|
147
|
+
if (!proc)
|
|
148
|
+
return;
|
|
149
|
+
const tag = sessionId.slice(0, 8);
|
|
150
|
+
console.log(`[${tag}] Sending SIGTERM...`);
|
|
151
|
+
proc.kill("SIGTERM");
|
|
152
|
+
// Force kill after 10s if still running
|
|
153
|
+
setTimeout(() => {
|
|
154
|
+
if (activeSessions.has(sessionId)) {
|
|
155
|
+
console.log(`[${tag}] Grace period expired, sending SIGKILL`);
|
|
156
|
+
proc.kill("SIGKILL");
|
|
157
|
+
}
|
|
158
|
+
}, 10_000);
|
|
159
|
+
}
|
|
141
160
|
function emitEvent(config, projectId, type, data) {
|
|
142
161
|
fetch(`${config.fissionUrl}/api/v1/worker/events`, {
|
|
143
162
|
method: "POST",
|
package/dist/docker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../src/docker.ts"],"names":[],"mappings":";;AAoBA,oCAqIC;
|
|
1
|
+
{"version":3,"file":"docker.js","sourceRoot":"","sources":["../src/docker.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -90,12 +90,53 @@ let PipelineHelpersService = PipelineHelpersService_1 = class PipelineHelpersSer
|
|
|
90
90
|
if (options?.jsonOutput) {
|
|
91
91
|
try {
|
|
92
92
|
const json = JSON.parse(stdout.trim());
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
93
|
+
if (Array.isArray(json)) {
|
|
94
|
+
// Array format: [{type:"system",subtype:"init",session_id:...}, ..., {type:"result",result:"..."}]
|
|
95
|
+
const initMsg = json.find((m) => m.type === "system" && m.subtype === "init");
|
|
96
|
+
if (initMsg?.session_id)
|
|
97
|
+
sessionId = initMsg.session_id;
|
|
98
|
+
const resultMsg = [...json].reverse().find((m) => m.type === "result");
|
|
99
|
+
if (resultMsg?.result) {
|
|
100
|
+
stdout = resultMsg.result;
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
// Fallback: last assistant message content
|
|
104
|
+
const lastAssistant = [...json].reverse().find((m) => m.type === "assistant");
|
|
105
|
+
if (lastAssistant) {
|
|
106
|
+
const content = lastAssistant.content;
|
|
107
|
+
if (typeof content === "string") {
|
|
108
|
+
stdout = content;
|
|
109
|
+
}
|
|
110
|
+
else if (Array.isArray(content)) {
|
|
111
|
+
stdout = content
|
|
112
|
+
.filter((b) => b.type === "text")
|
|
113
|
+
.map((b) => b.text)
|
|
114
|
+
.join("\n");
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
// Single object format: {session_id:"...", result:"..."}
|
|
121
|
+
sessionId = json.session_id;
|
|
122
|
+
stdout = json.result ?? stdout;
|
|
123
|
+
}
|
|
96
124
|
}
|
|
97
125
|
catch {
|
|
98
|
-
// JSON parse failed —
|
|
126
|
+
// JSON parse failed — try JSONL (one JSON object per line)
|
|
127
|
+
try {
|
|
128
|
+
const lines = stdout.trim().split("\n").filter(Boolean);
|
|
129
|
+
const messages = lines.map((l) => JSON.parse(l));
|
|
130
|
+
const initMsg = messages.find((m) => m.type === "system" && m.subtype === "init");
|
|
131
|
+
if (initMsg?.session_id)
|
|
132
|
+
sessionId = initMsg.session_id;
|
|
133
|
+
const resultMsg = [...messages].reverse().find((m) => m.type === "result");
|
|
134
|
+
if (resultMsg?.result)
|
|
135
|
+
stdout = resultMsg.result;
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
// Neither JSON nor JSONL — leave stdout as-is
|
|
139
|
+
}
|
|
99
140
|
}
|
|
100
141
|
}
|
|
101
142
|
resolve({ stdout, stderr, exitCode: code ?? 1, sessionId });
|
|
@@ -337,11 +337,22 @@ let PipelineService = PipelineService_1 = class PipelineService {
|
|
|
337
337
|
});
|
|
338
338
|
let killed = 0;
|
|
339
339
|
let dequeued = 0;
|
|
340
|
+
let dispatched = 0;
|
|
340
341
|
for (const session of sessions) {
|
|
341
342
|
if (session.status === "QUEUED") {
|
|
342
343
|
this.pipelineQueue.cancel(session.id);
|
|
343
344
|
dequeued++;
|
|
344
345
|
}
|
|
346
|
+
else if (session.status === "DISPATCHED" || session.workerId) {
|
|
347
|
+
// Remote worker session — mark TERMINATED so heartbeat tells worker to cancel
|
|
348
|
+
dispatched++;
|
|
349
|
+
if (session.workerId) {
|
|
350
|
+
await this.prisma.worker.update({
|
|
351
|
+
where: { id: session.workerId },
|
|
352
|
+
data: { activeSessions: { decrement: 1 } },
|
|
353
|
+
}).catch(() => { });
|
|
354
|
+
}
|
|
355
|
+
}
|
|
345
356
|
else {
|
|
346
357
|
this.stopRequested.add(session.id);
|
|
347
358
|
const proc = this.activeProcesses.get(session.id);
|
|
@@ -362,7 +373,14 @@ let PipelineService = PipelineService_1 = class PipelineService {
|
|
|
362
373
|
this.helpers.workerTasks.clear();
|
|
363
374
|
this.helpers.slot3Info = null;
|
|
364
375
|
this.workerService.clearSessions();
|
|
365
|
-
|
|
376
|
+
const parts = [];
|
|
377
|
+
if (killed)
|
|
378
|
+
parts.push(`stopped ${killed} local`);
|
|
379
|
+
if (dispatched)
|
|
380
|
+
parts.push(`cancelling ${dispatched} worker`);
|
|
381
|
+
if (dequeued)
|
|
382
|
+
parts.push(`removed ${dequeued} from queue`);
|
|
383
|
+
return { message: parts.join(", ") || "No active sessions" };
|
|
366
384
|
}
|
|
367
385
|
// ------------------------------------------------------------------ //
|
|
368
386
|
// Autopilot — run pipeline in a continuous loop //
|
|
@@ -101,7 +101,19 @@ let WorkerApiController = WorkerApiController_1 = class WorkerApiController {
|
|
|
101
101
|
status: "ONLINE",
|
|
102
102
|
},
|
|
103
103
|
});
|
|
104
|
-
|
|
104
|
+
// Check if any sessions the worker thinks are active have been cancelled
|
|
105
|
+
let cancelSessions = [];
|
|
106
|
+
if (body.activeSessionIds?.length) {
|
|
107
|
+
const terminated = await this.prisma.session.findMany({
|
|
108
|
+
where: {
|
|
109
|
+
id: { in: body.activeSessionIds },
|
|
110
|
+
status: "TERMINATED",
|
|
111
|
+
},
|
|
112
|
+
select: { id: true },
|
|
113
|
+
});
|
|
114
|
+
cancelSessions = terminated.map((s) => s.id);
|
|
115
|
+
}
|
|
116
|
+
return { ok: true, cancelSessions };
|
|
105
117
|
}
|
|
106
118
|
// ── Event relay (worker → SSE → browser) ──────────────────────── //
|
|
107
119
|
async relayEvent(body) {
|