fission-worker 0.3.1 → 0.4.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/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/dist/index.js +11 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/runner/modules/pipeline/data/api-data.service.js +3 -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 +20 -2
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/dist/index.js
CHANGED
|
@@ -2,15 +2,24 @@
|
|
|
2
2
|
"use strict";
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
const commander_1 = require("commander");
|
|
5
|
+
const fs_1 = require("fs");
|
|
6
|
+
const path_1 = require("path");
|
|
5
7
|
const config_1 = require("./config");
|
|
6
8
|
const agent_1 = require("./agent");
|
|
7
9
|
const setup_1 = require("./setup");
|
|
8
10
|
const health_1 = require("./health");
|
|
11
|
+
// Read version from package.json at runtime
|
|
12
|
+
let PKG_VERSION = "unknown";
|
|
13
|
+
try {
|
|
14
|
+
const pkg = JSON.parse((0, fs_1.readFileSync)((0, path_1.join)(__dirname, "..", "package.json"), "utf-8"));
|
|
15
|
+
PKG_VERSION = pkg.version;
|
|
16
|
+
}
|
|
17
|
+
catch { /* fallback */ }
|
|
9
18
|
const program = new commander_1.Command();
|
|
10
19
|
program
|
|
11
20
|
.name("fission-worker")
|
|
12
21
|
.description("Fission Worker Agent — runs pipeline sessions in Docker containers")
|
|
13
|
-
.version(
|
|
22
|
+
.version(PKG_VERSION);
|
|
14
23
|
program
|
|
15
24
|
.command("setup")
|
|
16
25
|
.description("Interactive setup wizard — register this machine as a Fission worker")
|
|
@@ -27,7 +36,7 @@ program
|
|
|
27
36
|
process.exit(1);
|
|
28
37
|
}
|
|
29
38
|
const config = (0, config_1.readConfig)();
|
|
30
|
-
console.log(`[fission-worker]
|
|
39
|
+
console.log(`[fission-worker] v${PKG_VERSION} — starting worker "${config.workerName}" (${config.workerId.slice(0, 8)})`);
|
|
31
40
|
await (0, agent_1.agentLoop)(config);
|
|
32
41
|
});
|
|
33
42
|
program
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,qCAAmE;AACnE,mCAAoC;AACpC,mCAAmC;AACnC,qCAA8C;AAE9C,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,gBAAgB,CAAC;KACtB,WAAW,CAAC,oEAAoE,CAAC;KACjF,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -123,7 +123,9 @@ class ApiDataService {
|
|
|
123
123
|
type,
|
|
124
124
|
data,
|
|
125
125
|
sessionId: this.sessionId,
|
|
126
|
-
}).catch(() => {
|
|
126
|
+
}).catch((err) => {
|
|
127
|
+
console.error(`[ApiDataService] Failed to emit ${type}: ${err}`);
|
|
128
|
+
});
|
|
127
129
|
}
|
|
128
130
|
// -- Activity Log ----------------------------------------------------- //
|
|
129
131
|
async log(action, entityType, entityId, userId, details) {
|
|
@@ -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 //
|
|
@@ -76,11 +76,16 @@ let WorkerApiController = WorkerApiController_1 = class WorkerApiController {
|
|
|
76
76
|
this.logger.warn(`Failed to generate GitHub token for installation ${repoWithInstallation.githubInstallationId}: ${err}`);
|
|
77
77
|
}
|
|
78
78
|
}
|
|
79
|
-
// Mark as ACTIVE
|
|
79
|
+
// Mark as ACTIVE and notify browser
|
|
80
80
|
await this.prisma.session.update({
|
|
81
81
|
where: { id: session.id },
|
|
82
82
|
data: { status: "ACTIVE" },
|
|
83
83
|
});
|
|
84
|
+
this.eventBus.emit(session.projectId, "phase_changed", {
|
|
85
|
+
sessionId: session.id,
|
|
86
|
+
phase: "BUILD",
|
|
87
|
+
status: "ACTIVE",
|
|
88
|
+
});
|
|
84
89
|
return {
|
|
85
90
|
sessionId: session.id,
|
|
86
91
|
projectId: session.projectId,
|
|
@@ -101,10 +106,23 @@ let WorkerApiController = WorkerApiController_1 = class WorkerApiController {
|
|
|
101
106
|
status: "ONLINE",
|
|
102
107
|
},
|
|
103
108
|
});
|
|
104
|
-
|
|
109
|
+
// Check if any sessions the worker thinks are active have been cancelled
|
|
110
|
+
let cancelSessions = [];
|
|
111
|
+
if (body.activeSessionIds?.length) {
|
|
112
|
+
const terminated = await this.prisma.session.findMany({
|
|
113
|
+
where: {
|
|
114
|
+
id: { in: body.activeSessionIds },
|
|
115
|
+
status: "TERMINATED",
|
|
116
|
+
},
|
|
117
|
+
select: { id: true },
|
|
118
|
+
});
|
|
119
|
+
cancelSessions = terminated.map((s) => s.id);
|
|
120
|
+
}
|
|
121
|
+
return { ok: true, cancelSessions };
|
|
105
122
|
}
|
|
106
123
|
// ── Event relay (worker → SSE → browser) ──────────────────────── //
|
|
107
124
|
async relayEvent(body) {
|
|
125
|
+
this.logger.debug(`[EventRelay] ${body.type} for project ${body.projectId?.slice(0, 8)}`);
|
|
108
126
|
this.eventBus.emit(body.projectId, body.type, body.data);
|
|
109
127
|
}
|
|
110
128
|
// ── Tasks ──────────────────────────────────────────────────────── //
|