@grackle-ai/server 0.71.2 → 0.72.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/compute-task-status.d.ts +1 -5
- package/dist/compute-task-status.d.ts.map +1 -1
- package/dist/compute-task-status.js +3 -24
- package/dist/compute-task-status.js.map +1 -1
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +14 -0
- package/dist/db.js.map +1 -1
- package/dist/event-processor.d.ts.map +1 -1
- package/dist/event-processor.js +14 -19
- package/dist/event-processor.js.map +1 -1
- package/dist/grpc-service.d.ts.map +1 -1
- package/dist/grpc-service.js +49 -46
- package/dist/grpc-service.js.map +1 -1
- package/dist/lifecycle.d.ts +7 -6
- package/dist/lifecycle.d.ts.map +1 -1
- package/dist/lifecycle.js +37 -18
- package/dist/lifecycle.js.map +1 -1
- package/dist/pipe-delivery.d.ts.map +1 -1
- package/dist/pipe-delivery.js +5 -8
- package/dist/pipe-delivery.js.map +1 -1
- package/dist/schema.d.ts +19 -0
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +1 -0
- package/dist/schema.js.map +1 -1
- package/dist/session-recovery.js +3 -3
- package/dist/session-recovery.js.map +1 -1
- package/dist/session-store.d.ts +5 -6
- package/dist/session-store.d.ts.map +1 -1
- package/dist/session-store.js +7 -15
- package/dist/session-store.js.map +1 -1
- package/dist/signals/sigchld.d.ts.map +1 -1
- package/dist/signals/sigchld.js +17 -12
- package/dist/signals/sigchld.js.map +1 -1
- package/dist/ws-bridge.d.ts.map +1 -1
- package/dist/ws-bridge.js +34 -31
- package/dist/ws-bridge.js.map +1 -1
- package/package.json +7 -7
package/dist/session-recovery.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { create } from "@bufbuild/protobuf";
|
|
2
|
-
import { grackle, powerline, eventTypeToEnum, SESSION_STATUS, LOGS_DIR } from "@grackle-ai/common";
|
|
2
|
+
import { grackle, powerline, eventTypeToEnum, SESSION_STATUS, LOGS_DIR, END_REASON } from "@grackle-ai/common";
|
|
3
3
|
import { join } from "node:path";
|
|
4
4
|
import * as sessionStore from "./session-store.js";
|
|
5
5
|
import * as taskStore from "./task-store.js";
|
|
@@ -91,8 +91,8 @@ export async function recoverSuspendedSessions(environmentId, connection) {
|
|
|
91
91
|
emitTaskUpdated(session.taskId);
|
|
92
92
|
}
|
|
93
93
|
catch (err) {
|
|
94
|
-
logger.error({ sessionId: session.id, err }, "Failed to recover suspended session — marking
|
|
95
|
-
sessionStore.updateSession(session.id, SESSION_STATUS.
|
|
94
|
+
logger.error({ sessionId: session.id, err }, "Failed to recover suspended session — marking stopped (interrupted)");
|
|
95
|
+
sessionStore.updateSession(session.id, SESSION_STATUS.STOPPED, undefined, `Recovery failed: ${String(err)}`, END_REASON.INTERRUPTED);
|
|
96
96
|
emitTaskUpdated(session.taskId);
|
|
97
97
|
}
|
|
98
98
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-recovery.js","sourceRoot":"","sources":["../src/session-recovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"session-recovery.js","sourceRoot":"","sources":["../src/session-recovery.ts"],"names":[],"mappings":"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"}
|
package/dist/session-store.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type SessionRow } from "./schema.js";
|
|
2
|
-
import type { SessionStatus, PipeMode } from "@grackle-ai/common";
|
|
2
|
+
import type { SessionStatus, PipeMode, EndReason } from "@grackle-ai/common";
|
|
3
3
|
export type { SessionRow };
|
|
4
4
|
/** Insert a new session record into the database. */
|
|
5
5
|
export declare function createSession(id: string, environmentId: string, runtime: string, prompt: string, model: string, logPath: string, taskId?: string, personaId?: string, parentSessionId?: string, pipeMode?: PipeMode): void;
|
|
@@ -10,8 +10,9 @@ export declare function listSessions(environmentId?: string, status?: string): S
|
|
|
10
10
|
/** List all sessions belonging to a specific environment. */
|
|
11
11
|
export declare function listByEnv(environmentId: string): SessionRow[];
|
|
12
12
|
/** Update a session's status and error; auto-sets `endedAt` for terminal states.
|
|
13
|
-
* Only updates `runtimeSessionId` when explicitly provided (omitting preserves the current value).
|
|
14
|
-
|
|
13
|
+
* Only updates `runtimeSessionId` when explicitly provided (omitting preserves the current value).
|
|
14
|
+
* `endReason` is only meaningful when status is STOPPED — it records why the session ended. */
|
|
15
|
+
export declare function updateSession(id: string, status: SessionStatus, runtimeSessionId?: string, error?: string, endReason?: EndReason): void;
|
|
15
16
|
/** Update only the status column of a session. */
|
|
16
17
|
export declare function updateSessionStatus(id: string, status: SessionStatus): void;
|
|
17
18
|
/** Get the currently active (pending/running/waiting_input) session for an environment, if any. */
|
|
@@ -41,7 +42,7 @@ export declare function updateRuntimeSessionId(id: string, runtimeSessionId: str
|
|
|
41
42
|
export declare function suspendSession(id: string): void;
|
|
42
43
|
/** Get all SUSPENDED sessions for an environment, ordered by startedAt (oldest first). */
|
|
43
44
|
export declare function getSuspendedForEnv(environmentId: string): SessionRow[];
|
|
44
|
-
/** Clear terminal state for reanimate — reset status to running, clear endedAt/error/suspendedAt. */
|
|
45
|
+
/** Clear terminal state for reanimate — reset status to running, clear endedAt/endReason/error/suspendedAt. */
|
|
45
46
|
export declare function reanimateSession(id: string): void;
|
|
46
47
|
/** List all sessions for a specific task, ordered chronologically (oldest first). */
|
|
47
48
|
export declare function listSessionsForTask(taskId: string): SessionRow[];
|
|
@@ -51,8 +52,6 @@ export declare function getLatestSessionForTask(taskId: string): SessionRow | un
|
|
|
51
52
|
export declare function getActiveSessionsForTask(taskId: string): SessionRow[];
|
|
52
53
|
/** Batch-fetch all sessions for a set of task IDs. Avoids N+1 queries for listTasks. */
|
|
53
54
|
export declare function listSessionsByTaskIds(taskIds: string[]): SessionRow[];
|
|
54
|
-
/** Transition a session to HIBERNATING — process dead, JSONL persists, reanimate-safe. */
|
|
55
|
-
export declare function hibernateSession(id: string): void;
|
|
56
55
|
/** List all child sessions spawned by a parent session. */
|
|
57
56
|
export declare function getChildSessions(parentSessionId: string): SessionRow[];
|
|
58
57
|
//# sourceMappingURL=session-store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../src/session-store.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAGxD,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../src/session-store.ts"],"names":[],"mappings":"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"}
|
package/dist/session-store.js
CHANGED
|
@@ -48,14 +48,16 @@ export function listByEnv(environmentId) {
|
|
|
48
48
|
.all();
|
|
49
49
|
}
|
|
50
50
|
/** Update a session's status and error; auto-sets `endedAt` for terminal states.
|
|
51
|
-
* Only updates `runtimeSessionId` when explicitly provided (omitting preserves the current value).
|
|
52
|
-
|
|
53
|
-
|
|
51
|
+
* Only updates `runtimeSessionId` when explicitly provided (omitting preserves the current value).
|
|
52
|
+
* `endReason` is only meaningful when status is STOPPED — it records why the session ended. */
|
|
53
|
+
export function updateSession(id, status, runtimeSessionId, error, endReason) {
|
|
54
|
+
const endedAt = status === SESSION_STATUS.STOPPED
|
|
54
55
|
? new Date().toISOString()
|
|
55
56
|
: null;
|
|
56
57
|
const patch = {
|
|
57
58
|
status,
|
|
58
59
|
endedAt,
|
|
60
|
+
endReason: endReason ?? null,
|
|
59
61
|
error: error ?? null,
|
|
60
62
|
};
|
|
61
63
|
if (runtimeSessionId !== undefined) {
|
|
@@ -154,10 +156,10 @@ export function getSuspendedForEnv(environmentId) {
|
|
|
154
156
|
.orderBy(asc(sessions.startedAt))
|
|
155
157
|
.all();
|
|
156
158
|
}
|
|
157
|
-
/** Clear terminal state for reanimate — reset status to running, clear endedAt/error/suspendedAt. */
|
|
159
|
+
/** Clear terminal state for reanimate — reset status to running, clear endedAt/endReason/error/suspendedAt. */
|
|
158
160
|
export function reanimateSession(id) {
|
|
159
161
|
db.update(sessions)
|
|
160
|
-
.set({ status: SESSION_STATUS.RUNNING, endedAt: null, error: null, suspendedAt: null })
|
|
162
|
+
.set({ status: SESSION_STATUS.RUNNING, endedAt: null, endReason: null, error: null, suspendedAt: null })
|
|
161
163
|
.where(eq(sessions.id, id))
|
|
162
164
|
.run();
|
|
163
165
|
}
|
|
@@ -192,16 +194,6 @@ export function listSessionsByTaskIds(taskIds) {
|
|
|
192
194
|
.orderBy(asc(sessions.startedAt), asc(sessions.id))
|
|
193
195
|
.all();
|
|
194
196
|
}
|
|
195
|
-
/** Transition a session to HIBERNATING — process dead, JSONL persists, reanimate-safe. */
|
|
196
|
-
export function hibernateSession(id) {
|
|
197
|
-
db.update(sessions)
|
|
198
|
-
.set({
|
|
199
|
-
status: SESSION_STATUS.HIBERNATING,
|
|
200
|
-
endedAt: new Date().toISOString(),
|
|
201
|
-
})
|
|
202
|
-
.where(eq(sessions.id, id))
|
|
203
|
-
.run();
|
|
204
|
-
}
|
|
205
197
|
/** List all child sessions spawned by a parent session. */
|
|
206
198
|
export function getChildSessions(parentSessionId) {
|
|
207
199
|
return db.select().from(sessions)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../src/session-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAmB,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAKpD,qDAAqD;AACrD,MAAM,UAAU,aAAa,CAC3B,EAAU,EACV,aAAqB,EACrB,OAAe,EACf,MAAc,EACd,KAAa,EACb,OAAe,EACf,SAAiB,EAAE,EACnB,YAAoB,EAAE,EACtB,kBAA0B,EAAE,EAC5B,WAAqB,EAAE;IAEvB,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;QACzB,EAAE;QACF,aAAa;QACb,OAAO;QACP,MAAM;QACN,KAAK;QACL,OAAO;QACP,MAAM;QACN,SAAS;QACT,eAAe;QACf,QAAQ;QACR,0EAA0E;QAC1E,0EAA0E;QAC1E,sEAAsE;QACtE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CAAC,GAAG,EAAE,CAAC;AACX,CAAC;AAED,uCAAuC;AACvC,MAAM,UAAU,UAAU,CAAC,EAAU;IACnC,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AACrE,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,YAAY,CAAC,aAAsB,EAAE,MAAe;IAClE,MAAM,UAAU,GAAG,EAAE,CAAC;IACtB,IAAI,aAAa,EAAE,CAAC;QAClB,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,MAAM,EAAE,CAAC;QACX,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,KAAK,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IACjF,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AACvD,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,SAAS,CAAC,aAAqB;IAC7C,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;SAC9B,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;SAChD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;SACjC,GAAG,EAAE,CAAC;AACX,CAAC;AAED;
|
|
1
|
+
{"version":3,"file":"session-store.js","sourceRoot":"","sources":["../src/session-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sigchld.d.ts","sourceRoot":"","sources":["../../src/signals/sigchld.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sigchld.d.ts","sourceRoot":"","sources":["../../src/signals/sigchld.ts"],"names":[],"mappings":"AAyCA,wBAAgB,qBAAqB,IAAI,IAAI,CA2B5C;AAyHD;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAGvC"}
|
package/dist/signals/sigchld.js
CHANGED
|
@@ -9,28 +9,23 @@ import { logger } from "../logger.js";
|
|
|
9
9
|
const MAX_LAST_MESSAGE_LENGTH = 2000;
|
|
10
10
|
/**
|
|
11
11
|
* Session statuses that trigger SIGCHLD. LLM agents don't reliably exit() —
|
|
12
|
-
* they go IDLE when they stop working.
|
|
12
|
+
* they go IDLE when they stop working. STOPPED fires when the session's event
|
|
13
13
|
* stream ends (agent-initiated, not user-initiated — the user marking a task
|
|
14
14
|
* "Complete" emits task.completed which this subscriber does not listen to).
|
|
15
|
-
* Dedup prevents double notification if both IDLE and
|
|
15
|
+
* Dedup prevents double notification if both IDLE and STOPPED fire for the
|
|
16
16
|
* same session.
|
|
17
17
|
*/
|
|
18
18
|
const SIGCHLD_STATUSES = new Set([
|
|
19
19
|
SESSION_STATUS.IDLE,
|
|
20
|
-
SESSION_STATUS.
|
|
21
|
-
SESSION_STATUS.FAILED,
|
|
22
|
-
SESSION_STATUS.INTERRUPTED,
|
|
20
|
+
SESSION_STATUS.STOPPED,
|
|
23
21
|
]);
|
|
24
22
|
/** How long (ms) to remember a delivered notification before allowing re-delivery. */
|
|
25
23
|
const DEDUP_TTL_MS = 3_600_000; // 1 hour
|
|
26
24
|
/** Track delivered notifications to prevent duplicates: key → delivery timestamp. */
|
|
27
25
|
const delivered = new Map();
|
|
28
|
-
/** Human-readable status labels for the notification text. */
|
|
26
|
+
/** Human-readable status labels for the notification text (non-STOPPED statuses only). */
|
|
29
27
|
const STATUS_LABELS = {
|
|
30
28
|
[SESSION_STATUS.IDLE]: "finished working (awaiting review)",
|
|
31
|
-
[SESSION_STATUS.COMPLETED]: "completed successfully",
|
|
32
|
-
[SESSION_STATUS.FAILED]: "failed",
|
|
33
|
-
[SESSION_STATUS.INTERRUPTED]: "was interrupted",
|
|
34
29
|
};
|
|
35
30
|
/**
|
|
36
31
|
* Initialize the SIGCHLD event-bus subscriber.
|
|
@@ -99,7 +94,17 @@ async function handleTaskUpdated(childTaskId) {
|
|
|
99
94
|
// Extract the last text message from the child's session log
|
|
100
95
|
const lastTextMessage = extractLastTextMessage(latestSession.logPath || undefined);
|
|
101
96
|
// Format the notification with actionable instructions for the parent
|
|
102
|
-
|
|
97
|
+
let statusLabel;
|
|
98
|
+
if (latestSession.status === SESSION_STATUS.STOPPED) {
|
|
99
|
+
statusLabel = latestSession.endReason === "completed"
|
|
100
|
+
? "completed successfully"
|
|
101
|
+
: latestSession.endReason === "killed"
|
|
102
|
+
? "was killed"
|
|
103
|
+
: "crashed unexpectedly";
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
statusLabel = STATUS_LABELS[latestSession.status] || latestSession.status;
|
|
107
|
+
}
|
|
103
108
|
let message = `[SIGCHLD] Child task "${childTask.title}" (${childTaskId}) ${statusLabel}.`;
|
|
104
109
|
if (lastTextMessage) {
|
|
105
110
|
const truncated = lastTextMessage.length > MAX_LAST_MESSAGE_LENGTH
|
|
@@ -112,8 +117,8 @@ async function handleTaskUpdated(childTaskId) {
|
|
|
112
117
|
+ `task_complete({ taskId: "${childTaskId}" }). `
|
|
113
118
|
+ "If more work is needed, send additional input to the child's session.";
|
|
114
119
|
}
|
|
115
|
-
else if (latestSession.status === SESSION_STATUS.
|
|
116
|
-
message += "\n\nThe child task
|
|
120
|
+
else if (latestSession.status === SESSION_STATUS.STOPPED && latestSession.endReason === "interrupted") {
|
|
121
|
+
message += "\n\nThe child task crashed unexpectedly. Review the error and decide whether to retry or reassign the work.";
|
|
117
122
|
}
|
|
118
123
|
logger.info({ childTaskId, parentTaskId: childTask.parentTaskId, status: latestSession.status }, "Delivering SIGCHLD to parent task");
|
|
119
124
|
const success = await deliverSignalToTask(childTask.parentTaskId, "sigchld", message);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sigchld.js","sourceRoot":"","sources":["../../src/signals/sigchld.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAqB,MAAM,iBAAiB,CAAC;AAC/D,OAAO,KAAK,SAAS,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,YAAY,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,4EAA4E;AAC5E,MAAM,uBAAuB,GAAW,IAAI,CAAC;AAE7C;;;;;;;GAOG;AACH,MAAM,gBAAgB,GAAwB,IAAI,GAAG,CAAC;IACpD,cAAc,CAAC,IAAI;IACnB,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"sigchld.js","sourceRoot":"","sources":["../../src/signals/sigchld.ts"],"names":[],"mappings":"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"}
|
package/dist/ws-bridge.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ws-bridge.d.ts","sourceRoot":"","sources":["../src/ws-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAC;AAetD,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"ws-bridge.d.ts","sourceRoot":"","sources":["../src/ws-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAC;AAetD,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAC;AA0E7C,0CAA0C;AAC1C,MAAM,WAAW,eAAe;IAC9B,qCAAqC;IACrC,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IACzC,+BAA+B;IAC/B,cAAc,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC;IACnD,+EAA+E;IAC/E,OAAO,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,YAAY,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,OAAO,GACpB,OAAO,CAyBT;AAED,wGAAwG;AACxG,wBAAgB,cAAc,CAC5B,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,eAAe,GACvB,eAAe,CAiDjB;AA6HD,8GAA8G;AAC9G,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,SAAS,GAAG,SAAS,EACzB,IAAI,EAAE,SAAS,CAAC,OAAO,EACvB,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACvE,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA6I7B"}
|
package/dist/ws-bridge.js
CHANGED
|
@@ -14,7 +14,7 @@ import * as findingStore from "./finding-store.js";
|
|
|
14
14
|
import * as personaStore from "./persona-store.js";
|
|
15
15
|
import { v4 as uuid } from "uuid";
|
|
16
16
|
import { join } from "node:path";
|
|
17
|
-
import { LOGS_DIR, SESSION_STATUS, TERMINAL_SESSION_STATUSES, TASK_STATUS, DEFAULT_MCP_PORT, ROOT_TASK_ID, eventTypeToString, } from "@grackle-ai/common";
|
|
17
|
+
import { LOGS_DIR, SESSION_STATUS, TERMINAL_SESSION_STATUSES, END_REASON, TASK_STATUS, DEFAULT_MCP_PORT, ROOT_TASK_ID, eventTypeToString, } from "@grackle-ai/common";
|
|
18
18
|
import { resolvePersona } from "./resolve-persona.js";
|
|
19
19
|
import { fetchOrchestratorContext } from "./orchestrator-context.js";
|
|
20
20
|
import * as settingsStore from "./settings-store.js";
|
|
@@ -328,44 +328,26 @@ export async function startTaskSession(ws, task, options) {
|
|
|
328
328
|
return undefined;
|
|
329
329
|
}
|
|
330
330
|
/**
|
|
331
|
-
* Terminate a session
|
|
331
|
+
* Terminate a session: set STOPPED+killed, then close lifecycle FDs.
|
|
332
332
|
*
|
|
333
|
-
*
|
|
334
|
-
*
|
|
335
|
-
*
|
|
336
|
-
*
|
|
337
|
-
* Matches the pattern used by `killAgent` in grpc-service.ts.
|
|
333
|
+
* Sets the session to STOPPED+killed first, then deletes the lifecycle
|
|
334
|
+
* stream. The orphan callback still sends the PowerLine kill request
|
|
335
|
+
* (even for already-terminal sessions) to ensure the process is stopped.
|
|
338
336
|
*/
|
|
339
337
|
async function terminateSession(sessionId) {
|
|
340
338
|
const session = sessionStore.getSession(sessionId);
|
|
341
339
|
if (!session) {
|
|
342
340
|
return;
|
|
343
341
|
}
|
|
344
|
-
// 1.
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
for (const sub of subs) {
|
|
349
|
-
streamRegistry.unsubscribe(sub.id);
|
|
350
|
-
}
|
|
351
|
-
// 3. Fallback for legacy sessions without lifecycle streams
|
|
352
|
-
const current = sessionStore.getSession(sessionId);
|
|
353
|
-
if (current && !TERMINAL_SESSION_STATUSES.has(current.status)) {
|
|
354
|
-
const conn = adapterManager.getConnection(session.environmentId);
|
|
355
|
-
if (conn) {
|
|
356
|
-
try {
|
|
357
|
-
await conn.client.kill(create(powerline.SessionIdSchema, { id: sessionId }));
|
|
358
|
-
}
|
|
359
|
-
catch (err) {
|
|
360
|
-
logger.warn({ sessionId, err }, "PowerLine kill failed during session termination");
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
sessionStore.updateSession(sessionId, SESSION_STATUS.INTERRUPTED);
|
|
342
|
+
// 1. Set STOPPED + killed BEFORE closing the lifecycle FD so the orphan
|
|
343
|
+
// callback sees the session is already terminal and skips.
|
|
344
|
+
if (!TERMINAL_SESSION_STATUSES.has(session.status)) {
|
|
345
|
+
sessionStore.updateSession(sessionId, SESSION_STATUS.STOPPED, undefined, undefined, END_REASON.KILLED);
|
|
364
346
|
streamHub.publish(create(grackle.SessionEventSchema, {
|
|
365
347
|
sessionId,
|
|
366
348
|
type: grackle.EventType.STATUS,
|
|
367
349
|
timestamp: new Date().toISOString(),
|
|
368
|
-
content:
|
|
350
|
+
content: END_REASON.KILLED,
|
|
369
351
|
raw: "",
|
|
370
352
|
}));
|
|
371
353
|
if (session.taskId) {
|
|
@@ -375,6 +357,14 @@ async function terminateSession(sessionId) {
|
|
|
375
357
|
}
|
|
376
358
|
}
|
|
377
359
|
}
|
|
360
|
+
// 2. Delete lifecycle stream — orphan callback sees session is already
|
|
361
|
+
// STOPPED and skips status change, but still kills the PowerLine process.
|
|
362
|
+
cleanupLifecycleStream(sessionId);
|
|
363
|
+
// 3. Close other subscriptions (pipe streams etc.)
|
|
364
|
+
const subs = streamRegistry.getSubscriptionsForSession(sessionId);
|
|
365
|
+
for (const sub of subs) {
|
|
366
|
+
streamRegistry.unsubscribe(sub.id);
|
|
367
|
+
}
|
|
378
368
|
}
|
|
379
369
|
async function handleMessage(ws, msg, subscriptions) {
|
|
380
370
|
switch (msg.type) {
|
|
@@ -404,6 +394,7 @@ async function handleMessage(ws, msg, subscriptions) {
|
|
|
404
394
|
inputTokens: r.inputTokens,
|
|
405
395
|
outputTokens: r.outputTokens,
|
|
406
396
|
costUsd: r.costUsd,
|
|
397
|
+
endReason: r.endReason || undefined,
|
|
407
398
|
})),
|
|
408
399
|
},
|
|
409
400
|
});
|
|
@@ -624,6 +615,10 @@ async function handleMessage(ws, msg, subscriptions) {
|
|
|
624
615
|
const taskId = msg.payload?.taskId;
|
|
625
616
|
if (!taskId)
|
|
626
617
|
return;
|
|
618
|
+
if (taskId === ROOT_TASK_ID) {
|
|
619
|
+
sendWs(ws, { type: "error", payload: { message: "Cannot stop the system task" } });
|
|
620
|
+
return;
|
|
621
|
+
}
|
|
627
622
|
// Terminate all active sessions for this task via fd closure
|
|
628
623
|
const activeSessions = sessionStore.getActiveSessionsForTask(taskId);
|
|
629
624
|
for (const session of activeSessions) {
|
|
@@ -1034,8 +1029,7 @@ async function handleMessage(ws, msg, subscriptions) {
|
|
|
1034
1029
|
sendWs(ws, { type: "error", payload: { message: `Session not found: ${lateBindSessionId}` } });
|
|
1035
1030
|
return;
|
|
1036
1031
|
}
|
|
1037
|
-
|
|
1038
|
-
if (terminalStatuses.includes(session.status)) {
|
|
1032
|
+
if (TERMINAL_SESSION_STATUSES.has(session.status)) {
|
|
1039
1033
|
sendWs(ws, {
|
|
1040
1034
|
type: "error",
|
|
1041
1035
|
payload: { message: `Cannot bind terminal session ${lateBindSessionId} (status: ${session.status})` },
|
|
@@ -1146,6 +1140,10 @@ async function handleMessage(ws, msg, subscriptions) {
|
|
|
1146
1140
|
const taskId = msg.payload?.taskId;
|
|
1147
1141
|
if (!taskId)
|
|
1148
1142
|
return;
|
|
1143
|
+
if (taskId === ROOT_TASK_ID) {
|
|
1144
|
+
sendWs(ws, { type: "error", payload: { message: "Cannot complete the system task" } });
|
|
1145
|
+
return;
|
|
1146
|
+
}
|
|
1149
1147
|
taskStore.markTaskComplete(taskId, TASK_STATUS.COMPLETE);
|
|
1150
1148
|
const task = taskStore.getTask(taskId);
|
|
1151
1149
|
const unblocked = task?.workspaceId ? taskStore.checkAndUnblock(task.workspaceId) : [];
|
|
@@ -1175,7 +1173,7 @@ async function handleMessage(ws, msg, subscriptions) {
|
|
|
1175
1173
|
sendWs(ws, { type: "error", payload: { message: `Task ${taskId} has no sessions to resume` } });
|
|
1176
1174
|
return;
|
|
1177
1175
|
}
|
|
1178
|
-
if (![SESSION_STATUS.
|
|
1176
|
+
if (![SESSION_STATUS.STOPPED, SESSION_STATUS.SUSPENDED].includes(latestSession.status)) {
|
|
1179
1177
|
sendWs(ws, {
|
|
1180
1178
|
type: "error",
|
|
1181
1179
|
payload: { message: `Latest session ${latestSession.id} is not resumable (status: ${latestSession.status})` },
|
|
@@ -1217,6 +1215,10 @@ async function handleMessage(ws, msg, subscriptions) {
|
|
|
1217
1215
|
const taskId = msg.payload?.taskId;
|
|
1218
1216
|
if (!taskId)
|
|
1219
1217
|
return;
|
|
1218
|
+
if (taskId === ROOT_TASK_ID) {
|
|
1219
|
+
sendWs(ws, { type: "error", payload: { message: "Cannot delete the system task" } });
|
|
1220
|
+
return;
|
|
1221
|
+
}
|
|
1220
1222
|
const deletedTask = taskStore.getTask(taskId);
|
|
1221
1223
|
if (!deletedTask) {
|
|
1222
1224
|
sendWs(ws, { type: "error", payload: { message: `Task not found: ${taskId}` } });
|
|
@@ -1270,6 +1272,7 @@ async function handleMessage(ws, msg, subscriptions) {
|
|
|
1270
1272
|
inputTokens: r.inputTokens,
|
|
1271
1273
|
outputTokens: r.outputTokens,
|
|
1272
1274
|
costUsd: r.costUsd,
|
|
1275
|
+
endReason: r.endReason || undefined,
|
|
1273
1276
|
})),
|
|
1274
1277
|
},
|
|
1275
1278
|
});
|