@seele00/seele 0.1.63 → 0.1.64

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.
Files changed (105) hide show
  1. package/README.md +5 -3
  2. package/bin/seele-codex +1 -1
  3. package/libexec/seele-server +0 -0
  4. package/libexec/seele-worker +0 -0
  5. package/package.json +1 -4
  6. package/scripts/deploy/bootstrap.sh +14 -3
  7. package/scripts/deploy/start.sh +14 -9
  8. package/web/dist/assets/{abnfDiagram-VRR7QNED-DXJQwnn-.js → abnfDiagram-VRR7QNED-BB7DT0BN.js} +1 -1
  9. package/web/dist/assets/{arc-D_47-IET.js → arc-BlEU_mit.js} +1 -1
  10. package/web/dist/assets/{architectureDiagram-ZJ3FMSHR-CKUldIzR.js → architectureDiagram-ZJ3FMSHR-Dy9cu2Mg.js} +1 -1
  11. package/web/dist/assets/{blockDiagram-677ZJIJ3-BD4Ym8Xi.js → blockDiagram-677ZJIJ3-DP4jMSfo.js} +1 -1
  12. package/web/dist/assets/{c4Diagram-LMCZKHZV-Cn268vLB.js → c4Diagram-LMCZKHZV-BtqFzX1w.js} +1 -1
  13. package/web/dist/assets/channel-mhSuRKJT.js +1 -0
  14. package/web/dist/assets/{chunk-2Q5K7J3B-D00lQ7mJ.js → chunk-2Q5K7J3B-BK9F5a0L.js} +1 -1
  15. package/web/dist/assets/{chunk-32BRIVSS-z7gv8Mry.js → chunk-32BRIVSS-nuQI6gtU.js} +1 -1
  16. package/web/dist/assets/{chunk-5VM5RSS4-BZJeO_rz.js → chunk-5VM5RSS4-D4IT05bt.js} +1 -1
  17. package/web/dist/assets/{chunk-EX3LRPZG-DoIg9UGx.js → chunk-EX3LRPZG-CrOtgxcr.js} +1 -1
  18. package/web/dist/assets/{chunk-JWPE2WC7-C1LcQus2.js → chunk-JWPE2WC7-Dn9JHm4W.js} +1 -1
  19. package/web/dist/assets/{chunk-MOJQB5TN--JPbFu4n.js → chunk-MOJQB5TN-VtD0_fGF.js} +1 -1
  20. package/web/dist/assets/{chunk-RYQCIY6F-BVv30W60.js → chunk-RYQCIY6F-TqRYsCot.js} +1 -1
  21. package/web/dist/assets/{chunk-V7JOEXUC-DYoSFgRT.js → chunk-V7JOEXUC-U9b5a7vL.js} +1 -1
  22. package/web/dist/assets/{chunk-VR4S4FIN-C8BRkTOa.js → chunk-VR4S4FIN-B3qLfeNJ.js} +1 -1
  23. package/web/dist/assets/{chunk-XXDRQBXY-CDfofIob.js → chunk-XXDRQBXY-DazVAZe-.js} +1 -1
  24. package/web/dist/assets/classDiagram-OUVF2IWQ-DYQSxD4g.js +1 -0
  25. package/web/dist/assets/classDiagram-v2-EOCWNBFH-DYQSxD4g.js +1 -0
  26. package/web/dist/assets/{core-C10OFTno.js → core-2RdBW0rZ.js} +1 -1
  27. package/web/dist/assets/{cose-bilkent-JH36ORCC-g9E8J4Fz.js → cose-bilkent-JH36ORCC-vvKttQXU.js} +1 -1
  28. package/web/dist/assets/{cynefin-VYW2F7L2-Dc689veM.js → cynefin-VYW2F7L2-BKMZmA-n.js} +1 -1
  29. package/web/dist/assets/{cynefinDiagram-TSTJHNR4-BAAq_jvr.js → cynefinDiagram-TSTJHNR4-ckdzxzlr.js} +1 -1
  30. package/web/dist/assets/{dagre-VKFMJZFB-CPtiniZQ.js → dagre-VKFMJZFB-CZw8DTb1.js} +1 -1
  31. package/web/dist/assets/{diagram-FQU43EPY-CvbIL3lu.js → diagram-FQU43EPY-C06X0Kru.js} +1 -1
  32. package/web/dist/assets/{diagram-G47NLZAW-u5m78Utg.js → diagram-G47NLZAW-HX9CdauD.js} +1 -1
  33. package/web/dist/assets/{diagram-NH7WQ7WH-4f-Ipubv.js → diagram-NH7WQ7WH-Dlo1tIod.js} +1 -1
  34. package/web/dist/assets/{diagram-OA4YK3LP-SUl1EQ56.js → diagram-OA4YK3LP-C9GXFhgw.js} +1 -1
  35. package/web/dist/assets/{diagram-WEI45ONY-C_Upd46l.js → diagram-WEI45ONY-Ch1Xx234.js} +1 -1
  36. package/web/dist/assets/{ebnfDiagram-CCIWWBDH-CHp2D7Q9.js → ebnfDiagram-CCIWWBDH-Q0_rEUgk.js} +1 -1
  37. package/web/dist/assets/{erDiagram-Q63AITRT-DQliHxOw.js → erDiagram-Q63AITRT-BsDRdpx6.js} +1 -1
  38. package/web/dist/assets/{flowDiagram-23GEKE2U-BcOYSJFM.js → flowDiagram-23GEKE2U-DDFuMRJN.js} +1 -1
  39. package/web/dist/assets/{ganttDiagram-NO4QXBWP-CDLHtJq0.js → ganttDiagram-NO4QXBWP-Cjpm08-d.js} +1 -1
  40. package/web/dist/assets/{gitGraphDiagram-IHSO6WYX-2j8C3mlk.js → gitGraphDiagram-IHSO6WYX-CnIosh2K.js} +1 -1
  41. package/web/dist/assets/index-eN6ddNRA.js +111 -0
  42. package/web/dist/assets/{infoDiagram-FWYZ7A6U-ClxdyQnM.js → infoDiagram-FWYZ7A6U-CH163HyC.js} +1 -1
  43. package/web/dist/assets/{ishikawaDiagram-FXEZZL3T-Bc2nIRgb.js → ishikawaDiagram-FXEZZL3T-DkT-3n3D.js} +1 -1
  44. package/web/dist/assets/{journeyDiagram-5HDEW3XC-R-vJ00LW.js → journeyDiagram-5HDEW3XC-34TnH3wG.js} +1 -1
  45. package/web/dist/assets/{kanban-definition-HUTT4EX6-CR0s_Mo8.js → kanban-definition-HUTT4EX6-CJbOm0lN.js} +1 -1
  46. package/web/dist/assets/{linear-BQgrawZS.js → linear-CTKXTLwe.js} +1 -1
  47. package/web/dist/assets/{mermaid.core-faLMbjSU.js → mermaid.core-CAVP16_-.js} +4 -4
  48. package/web/dist/assets/{mindmap-definition-LN4V7U3C-BZULnQui.js → mindmap-definition-LN4V7U3C-rlppHZj_.js} +1 -1
  49. package/web/dist/assets/{pegDiagram-2B236MQR-DUm1p_1o.js → pegDiagram-2B236MQR-MbcWBNJi.js} +1 -1
  50. package/web/dist/assets/{pieDiagram-ENE6RG2P-r3LCASRK.js → pieDiagram-ENE6RG2P-DKU7a4tv.js} +1 -1
  51. package/web/dist/assets/{quadrantDiagram-ABIIQ3AL-CGaCp0Px.js → quadrantDiagram-ABIIQ3AL-DpDsJVLi.js} +1 -1
  52. package/web/dist/assets/{railroadDiagram-RFXS5EU6-DmEKGO1A.js → railroadDiagram-RFXS5EU6-DrPM3aKC.js} +1 -1
  53. package/web/dist/assets/{requirementDiagram-TGXJPOKE-Byc4ivmp.js → requirementDiagram-TGXJPOKE-ZzS_iVag.js} +1 -1
  54. package/web/dist/assets/{sankeyDiagram-HTMAVEWB-BtJiL4zX.js → sankeyDiagram-HTMAVEWB-DrRrN0Lc.js} +1 -1
  55. package/web/dist/assets/{sequenceDiagram-DBY2YBRQ-Bg3vdDGW.js → sequenceDiagram-DBY2YBRQ-CP8GBGZM.js} +1 -1
  56. package/web/dist/assets/{sizeCapture-X5ZJPWSS-CCRwjaWU.js → sizeCapture-X5ZJPWSS-BYVg_dQd.js} +1 -1
  57. package/web/dist/assets/{stateDiagram-2N3HPSRC-CQU-udox.js → stateDiagram-2N3HPSRC-CsJ3M80-.js} +1 -1
  58. package/web/dist/assets/stateDiagram-v2-6OUMAXLB-CaFOY1Xb.js +1 -0
  59. package/web/dist/assets/{swimlanes-5IMT3BWC-r3tJnQLJ.js → swimlanes-5IMT3BWC-XgRKQ20Q.js} +2 -2
  60. package/web/dist/assets/swimlanesDiagram-G3AALYLV-DaKP_iDy.js +8 -0
  61. package/web/dist/assets/{timeline-definition-FHXFAJF6-DryYrdts.js → timeline-definition-FHXFAJF6-CU_Cq10d.js} +1 -1
  62. package/web/dist/assets/{vennDiagram-L72KCM5P-ZLPc0qvQ.js → vennDiagram-L72KCM5P-CLSDbg6o.js} +1 -1
  63. package/web/dist/assets/{wardleyDiagram-EHGQE667-RmgA6vQ9.js → wardleyDiagram-EHGQE667-DnAOuvzv.js} +1 -1
  64. package/web/dist/assets/{xychartDiagram-FW5EYKEG-BGIzispI.js → xychartDiagram-FW5EYKEG-CyC6V11l.js} +1 -1
  65. package/web/dist/index.html +1 -1
  66. package/codex/dist/app-server.js +0 -63
  67. package/codex/dist/errors.js +0 -16
  68. package/codex/dist/index.js +0 -4
  69. package/codex/dist/rpc-client.js +0 -96
  70. package/codex/dist/transports/stdio.js +0 -81
  71. package/codex/dist/types.js +0 -1
  72. package/codex/package.json +0 -12
  73. package/scripts/deploy/npm/postinstall.mjs +0 -10
  74. package/server/dist/auth/session.js +0 -71
  75. package/server/dist/auth/users.js +0 -276
  76. package/server/dist/codex-runtime/run-streamed-turn.js +0 -587
  77. package/server/dist/config/config.js +0 -71
  78. package/server/dist/contracts/artifact-rendering.js +0 -14
  79. package/server/dist/contracts/global-environment.js +0 -23
  80. package/server/dist/contracts/index.js +0 -114
  81. package/server/dist/contracts/managed-assets.js +0 -13
  82. package/server/dist/contracts/response-style.js +0 -23
  83. package/server/dist/contracts/task-clarification.js +0 -13
  84. package/server/dist/contracts/types.js +0 -1
  85. package/server/dist/contracts/wakeup.js +0 -13
  86. package/server/dist/contracts/workspace-boundary.js +0 -20
  87. package/server/dist/contracts/workspace-knowledge.js +0 -48
  88. package/server/dist/contracts/workspace-memory.js +0 -32
  89. package/server/dist/contracts/workspace-responsibility.js +0 -23
  90. package/server/dist/contracts/workspace-transcript.js +0 -26
  91. package/server/dist/conversations/knowledge.js +0 -380
  92. package/server/dist/conversations/store.js +0 -2466
  93. package/server/dist/doctor.js +0 -105
  94. package/server/dist/realtime/sse.js +0 -12
  95. package/server/dist/runtime-worker/client.js +0 -405
  96. package/server/dist/runtime-worker/process.js +0 -216
  97. package/server/dist/runtime-worker/protocol.js +0 -1
  98. package/server/dist/server.js +0 -4605
  99. package/server/dist/storage/sqlite.js +0 -39
  100. package/web/dist/assets/channel-Uz6zF6Xw.js +0 -1
  101. package/web/dist/assets/classDiagram-OUVF2IWQ-D6mpE1t2.js +0 -1
  102. package/web/dist/assets/classDiagram-v2-EOCWNBFH-D6mpE1t2.js +0 -1
  103. package/web/dist/assets/index-BqSosI7W.js +0 -111
  104. package/web/dist/assets/stateDiagram-v2-6OUMAXLB-YNSWW4ip.js +0 -1
  105. package/web/dist/assets/swimlanesDiagram-G3AALYLV-BGZAc11_.js +0 -8
@@ -1,105 +0,0 @@
1
- import { constants as fsConstants } from "node:fs";
2
- import fs from "node:fs/promises";
3
- import { loadConfig } from "./config/config.js";
4
- import { UserStore } from "./auth/users.js";
5
- import { getConversationStoreDiagnostics, initializeConversationStore, } from "./conversations/store.js";
6
- const config = loadConfig();
7
- const users = new UserStore(config.centerDbPath, {
8
- username: config.authUsername,
9
- password: config.authPassword,
10
- });
11
- let store = null;
12
- let initializationError = null;
13
- try {
14
- initializeConversationStore({
15
- centerDbPath: config.centerDbPath,
16
- workspaceRoot: config.workspaceRoot,
17
- defaultSandbox: config.defaultSandbox,
18
- defaultOwnerId: users.listUsers().find((user) => user.role === "admin")?.id ?? "local-admin",
19
- });
20
- store = getConversationStoreDiagnostics();
21
- }
22
- catch (error) {
23
- initializationError = error instanceof Error ? error.message : String(error);
24
- }
25
- const paths = {
26
- seeleRoot: await checkPath(config.seeleRoot),
27
- workspaceRoot: await checkPath(config.workspaceRoot),
28
- webDistPath: await checkPath(config.webDistPath, { requireWrite: false }),
29
- };
30
- const centerDbOk = store !== null &&
31
- store.centerSchemaVersion === store.expectedCenterSchemaVersion;
32
- const workspaceSchemasOk = store !== null && store.workspaceDatabases.every((workspace) => workspace.schemaVersion === store.expectedWorkspaceSchemaVersion);
33
- const pathsOk = Object.values(paths).every((check) => check.ok);
34
- const ok = initializationError === null && centerDbOk && workspaceSchemasOk && pathsOk;
35
- const report = {
36
- ok,
37
- config: {
38
- seeleRoot: config.seeleRoot,
39
- centerDbPath: config.centerDbPath,
40
- workspaceRoot: config.workspaceRoot,
41
- defaultSandbox: config.defaultSandbox,
42
- defaultModel: config.defaultModel ?? null,
43
- codexBin: config.codexBin ?? null,
44
- },
45
- checks: {
46
- initialization: {
47
- ok: initializationError === null,
48
- error: initializationError,
49
- },
50
- centerDb: {
51
- ok: centerDbOk,
52
- schemaVersion: store?.centerSchemaVersion ?? null,
53
- expected: store?.expectedCenterSchemaVersion ?? null,
54
- },
55
- workspaceSchemas: {
56
- ok: workspaceSchemasOk,
57
- expected: store?.expectedWorkspaceSchemaVersion ?? null,
58
- workspaces: (store?.workspaceDatabases ?? []).map((workspace) => ({
59
- id: workspace.id,
60
- title: workspace.title,
61
- schemaVersion: workspace.schemaVersion,
62
- messages: workspace.messages,
63
- events: workspace.events,
64
- turns: workspace.turns,
65
- })),
66
- },
67
- paths,
68
- },
69
- summary: {
70
- workspaces: store?.workspaces ?? 0,
71
- groups: store?.groups ?? 0,
72
- activeConversations: store?.activeConversations ?? 0,
73
- },
74
- };
75
- console.log(JSON.stringify(report, null, 2));
76
- process.exitCode = ok ? 0 : 1;
77
- async function checkPath(targetPath, options = {}) {
78
- const requireWrite = options.requireWrite ?? true;
79
- let readable = false;
80
- let writable = requireWrite ? false : null;
81
- let error = null;
82
- try {
83
- await fs.access(targetPath, fsConstants.R_OK);
84
- readable = true;
85
- }
86
- catch (accessError) {
87
- error = accessError instanceof Error ? accessError.message : String(accessError);
88
- }
89
- if (requireWrite) {
90
- try {
91
- await fs.access(targetPath, fsConstants.W_OK);
92
- writable = true;
93
- }
94
- catch (accessError) {
95
- error = accessError instanceof Error ? accessError.message : String(accessError);
96
- }
97
- }
98
- return {
99
- ok: readable && (writable ?? true),
100
- path: targetPath,
101
- readable,
102
- writable,
103
- error,
104
- };
105
- }
@@ -1,12 +0,0 @@
1
- export function openSse(response) {
2
- response.writeHead(200, {
3
- "Content-Type": "text/event-stream",
4
- "Cache-Control": "no-cache, no-transform",
5
- Connection: "keep-alive",
6
- "X-Accel-Buffering": "no",
7
- });
8
- }
9
- export function sendSse(response, event, data) {
10
- response.write(`event: ${event}\n`);
11
- response.write(`data: ${JSON.stringify(data)}\n\n`);
12
- }
@@ -1,405 +0,0 @@
1
- import { fork } from "node:child_process";
2
- import { randomUUID } from "node:crypto";
3
- import { fileURLToPath } from "node:url";
4
- const WORKER_HARD_KILL_AFTER_MS = 5_000;
5
- const WORKER_STALE_AFTER_MS = 45_000;
6
- export class RuntimeWorkerClient {
7
- handlers;
8
- workers = new Map();
9
- pendingThreadReads = new Map();
10
- pendingThreadRebuilds = new Map();
11
- pendingModelLists = new Map();
12
- pendingRateLimitReads = new Map();
13
- constructor(handlers) {
14
- this.handlers = handlers;
15
- }
16
- getDiagnostics() {
17
- const now = Date.now();
18
- const workers = [...this.workers.entries()]
19
- .map(([turnId, entry]) => ({
20
- turnId,
21
- pid: entry.process.pid ?? null,
22
- state: entry.state,
23
- uptimeMs: Math.max(0, now - entry.startedAt),
24
- eventCount: entry.eventCount,
25
- lastMessageAt: formatTimestamp(entry.lastMessageAt),
26
- lastEventAt: formatTimestamp(entry.lastEventAt),
27
- lastHeartbeatAt: formatTimestamp(entry.lastHeartbeatAt),
28
- stopRequestedAt: formatTimestamp(entry.stopRequestedAt),
29
- stale: isWorkerStale(entry, now),
30
- }))
31
- .sort((left, right) => left.turnId.localeCompare(right.turnId));
32
- return {
33
- workerCount: this.workers.size,
34
- workers,
35
- turnIds: workers.map((worker) => worker.turnId),
36
- staleWorkerCount: workers.filter((worker) => worker.stale).length,
37
- };
38
- }
39
- startTurn(turnId, config, request) {
40
- this.send(turnId, {
41
- type: "turn.start",
42
- payload: {
43
- turnId,
44
- config,
45
- request,
46
- },
47
- });
48
- }
49
- stopTurn(turnId) {
50
- const entry = this.workers.get(turnId);
51
- if (entry) {
52
- entry.state = "stopping";
53
- entry.stopRequestedAt = Date.now();
54
- this.scheduleHardKill(turnId, entry);
55
- }
56
- this.sendToExisting(turnId, {
57
- type: "turn.stop",
58
- payload: { turnId },
59
- });
60
- }
61
- steerTurn(turnId, message) {
62
- this.sendToExisting(turnId, {
63
- type: "turn.steer",
64
- payload: { turnId, message },
65
- });
66
- }
67
- respondApproval(turnId, requestId, decision) {
68
- this.sendToExisting(turnId, {
69
- type: "turn.approval.respond",
70
- payload: { turnId, requestId, decision },
71
- });
72
- }
73
- readThread(config, request) {
74
- const operationId = `thread-read:${randomUUID()}`;
75
- return new Promise((resolve, reject) => {
76
- this.pendingThreadReads.set(operationId, { resolve, reject });
77
- this.send(operationId, {
78
- type: "thread.read",
79
- payload: {
80
- operationId,
81
- config,
82
- request,
83
- },
84
- });
85
- });
86
- }
87
- rebuildThread(config, request, injectedItems) {
88
- const operationId = `thread-rebuild:${randomUUID()}`;
89
- return new Promise((resolve, reject) => {
90
- this.pendingThreadRebuilds.set(operationId, { resolve, reject });
91
- this.send(operationId, {
92
- type: "thread.rebuild",
93
- payload: {
94
- operationId,
95
- config,
96
- request,
97
- injectedItems,
98
- },
99
- });
100
- });
101
- }
102
- listModels(config) {
103
- const operationId = `models-list:${randomUUID()}`;
104
- return new Promise((resolve, reject) => {
105
- this.pendingModelLists.set(operationId, { resolve, reject });
106
- this.send(operationId, {
107
- type: "runtime.models.list",
108
- payload: { operationId, config },
109
- });
110
- });
111
- }
112
- readRateLimits(config) {
113
- const operationId = `rate-limits-read:${randomUUID()}`;
114
- return new Promise((resolve, reject) => {
115
- this.pendingRateLimitReads.set(operationId, { resolve, reject });
116
- this.send(operationId, {
117
- type: "runtime.rate_limits.read",
118
- payload: { operationId, config },
119
- });
120
- });
121
- }
122
- send(turnId, message) {
123
- const entry = this.ensureWorker(turnId);
124
- this.sendToEntry(turnId, entry, message);
125
- if (message.type === "turn.start" ||
126
- message.type === "thread.read" ||
127
- message.type === "thread.rebuild" ||
128
- message.type === "runtime.models.list" ||
129
- message.type === "runtime.rate_limits.read") {
130
- entry.state = "running";
131
- }
132
- }
133
- sendToExisting(turnId, message) {
134
- const entry = this.workers.get(turnId);
135
- if (!entry) {
136
- throw new Error(`runtime worker not found: ${turnId}`);
137
- }
138
- this.sendToEntry(turnId, entry, message);
139
- }
140
- sendToEntry(turnId, entry, message) {
141
- if (!entry.process.connected) {
142
- throw new Error(`runtime worker is not connected: ${turnId}`);
143
- }
144
- entry.process.send(message);
145
- }
146
- ensureWorker(turnId) {
147
- const existing = this.workers.get(turnId);
148
- if (existing?.process.connected) {
149
- return existing;
150
- }
151
- const workerEntry = resolveWorkerEntry();
152
- const worker = fork(workerEntry.path, [], {
153
- execArgv: workerEntry.execArgv,
154
- stdio: ["ignore", "inherit", "inherit", "ipc"],
155
- });
156
- const entry = {
157
- process: worker,
158
- startedAt: Date.now(),
159
- state: "starting",
160
- hardKillTimer: null,
161
- eventCount: 0,
162
- lastMessageAt: null,
163
- lastEventAt: null,
164
- lastHeartbeatAt: null,
165
- stopRequestedAt: null,
166
- };
167
- this.workers.set(turnId, entry);
168
- worker.on("message", (message) => {
169
- this.handleWorkerMessage(message);
170
- });
171
- worker.on("exit", (code, signal) => {
172
- if (this.workers.get(turnId)?.process === worker) {
173
- const state = this.workers.get(turnId)?.state ?? "failed";
174
- this.workers.delete(turnId);
175
- this.clearHardKill(entry);
176
- this.rejectPendingOperation(turnId, new Error(`runtime worker exited: code=${code} signal=${signal}`));
177
- if (!isRuntimeOperationId(turnId) &&
178
- state !== "completed" &&
179
- state !== "failed" &&
180
- state !== "stopping") {
181
- this.handlers.onFailed({
182
- turnId,
183
- message: `runtime worker exited: code=${code} signal=${signal}`,
184
- });
185
- }
186
- }
187
- });
188
- worker.on("error", (error) => {
189
- if (this.workers.get(turnId)?.process === worker) {
190
- entry.state = "failed";
191
- this.workers.delete(turnId);
192
- this.clearHardKill(entry);
193
- this.rejectPendingOperation(turnId, error);
194
- if (!isRuntimeOperationId(turnId)) {
195
- this.handlers.onFailed({
196
- turnId,
197
- message: error.message,
198
- });
199
- }
200
- }
201
- });
202
- return entry;
203
- }
204
- handleWorkerMessage(message) {
205
- this.touchWorkerMessage(message);
206
- if (message.type === "worker.ready") {
207
- const entry = this.workers.get(message.turnId);
208
- if (entry && entry.state === "starting") {
209
- entry.state = "running";
210
- }
211
- this.handlers.onEvent({
212
- turnId: message.turnId,
213
- event: "runtime.worker_ready",
214
- data: {},
215
- });
216
- return;
217
- }
218
- if (message.type === "worker.heartbeat") {
219
- const entry = this.workers.get(message.turnId);
220
- if (entry) {
221
- entry.lastHeartbeatAt = Date.now();
222
- }
223
- return;
224
- }
225
- if (message.type === "turn.event") {
226
- const entry = this.workers.get(message.turnId);
227
- if (entry) {
228
- entry.eventCount += 1;
229
- entry.lastEventAt = Date.now();
230
- }
231
- this.handlers.onEvent(message);
232
- return;
233
- }
234
- if (message.type === "turn.completed") {
235
- const entry = this.workers.get(message.turnId);
236
- if (entry) {
237
- entry.state = "completed";
238
- }
239
- this.forgetWorker(message.turnId);
240
- this.handlers.onCompleted(message);
241
- return;
242
- }
243
- if (message.type === "turn.failed") {
244
- const entry = this.workers.get(message.turnId);
245
- if (entry) {
246
- entry.state = "failed";
247
- }
248
- this.forgetWorker(message.turnId);
249
- this.handlers.onFailed(message);
250
- return;
251
- }
252
- if (message.type === "turn.worker_error") {
253
- if (message.turnId) {
254
- this.handlers.onEvent({
255
- turnId: message.turnId,
256
- event: "runtime.worker_error",
257
- data: { message: message.message },
258
- });
259
- }
260
- }
261
- if (message.type === "thread.read.completed") {
262
- const pending = this.pendingThreadReads.get(message.operationId);
263
- this.pendingThreadReads.delete(message.operationId);
264
- this.forgetWorker(message.operationId);
265
- pending?.resolve(message.result);
266
- return;
267
- }
268
- if (message.type === "thread.rebuild.completed") {
269
- const pending = this.pendingThreadRebuilds.get(message.operationId);
270
- this.pendingThreadRebuilds.delete(message.operationId);
271
- this.forgetWorker(message.operationId);
272
- pending?.resolve(message.result);
273
- return;
274
- }
275
- if (message.type === "runtime.models.list.completed") {
276
- const pending = this.pendingModelLists.get(message.operationId);
277
- this.pendingModelLists.delete(message.operationId);
278
- this.forgetWorker(message.operationId);
279
- pending?.resolve(message.result);
280
- return;
281
- }
282
- if (message.type === "runtime.rate_limits.read.completed") {
283
- const pending = this.pendingRateLimitReads.get(message.operationId);
284
- this.pendingRateLimitReads.delete(message.operationId);
285
- this.forgetWorker(message.operationId);
286
- pending?.resolve(message.result);
287
- return;
288
- }
289
- if (message.type === "runtime.operation_failed") {
290
- const error = new Error(message.message);
291
- const readPending = this.pendingThreadReads.get(message.operationId);
292
- if (readPending) {
293
- this.pendingThreadReads.delete(message.operationId);
294
- this.forgetWorker(message.operationId);
295
- readPending.reject(error);
296
- return;
297
- }
298
- const rebuildPending = this.pendingThreadRebuilds.get(message.operationId);
299
- if (rebuildPending) {
300
- this.pendingThreadRebuilds.delete(message.operationId);
301
- this.forgetWorker(message.operationId);
302
- rebuildPending.reject(error);
303
- return;
304
- }
305
- const modelListPending = this.pendingModelLists.get(message.operationId);
306
- if (modelListPending) {
307
- this.pendingModelLists.delete(message.operationId);
308
- this.forgetWorker(message.operationId);
309
- modelListPending.reject(error);
310
- return;
311
- }
312
- const rateLimitPending = this.pendingRateLimitReads.get(message.operationId);
313
- if (rateLimitPending) {
314
- this.pendingRateLimitReads.delete(message.operationId);
315
- this.forgetWorker(message.operationId);
316
- rateLimitPending.reject(error);
317
- }
318
- }
319
- }
320
- forgetWorker(turnId) {
321
- const entry = this.workers.get(turnId);
322
- if (entry) {
323
- this.clearHardKill(entry);
324
- }
325
- this.workers.delete(turnId);
326
- }
327
- rejectPendingOperation(operationId, error) {
328
- const readPending = this.pendingThreadReads.get(operationId);
329
- if (readPending) {
330
- this.pendingThreadReads.delete(operationId);
331
- readPending.reject(error);
332
- }
333
- const rebuildPending = this.pendingThreadRebuilds.get(operationId);
334
- if (rebuildPending) {
335
- this.pendingThreadRebuilds.delete(operationId);
336
- rebuildPending.reject(error);
337
- }
338
- const modelListPending = this.pendingModelLists.get(operationId);
339
- if (modelListPending) {
340
- this.pendingModelLists.delete(operationId);
341
- modelListPending.reject(error);
342
- }
343
- const rateLimitPending = this.pendingRateLimitReads.get(operationId);
344
- if (rateLimitPending) {
345
- this.pendingRateLimitReads.delete(operationId);
346
- rateLimitPending.reject(error);
347
- }
348
- }
349
- scheduleHardKill(turnId, entry) {
350
- if (entry.hardKillTimer) {
351
- return;
352
- }
353
- entry.hardKillTimer = setTimeout(() => {
354
- if (this.workers.get(turnId) !== entry) {
355
- return;
356
- }
357
- this.handlers.onEvent({
358
- turnId,
359
- event: "runtime.worker_hard_kill",
360
- data: { timeoutMs: WORKER_HARD_KILL_AFTER_MS },
361
- });
362
- entry.process.kill("SIGKILL");
363
- }, WORKER_HARD_KILL_AFTER_MS);
364
- entry.hardKillTimer.unref?.();
365
- }
366
- clearHardKill(entry) {
367
- if (entry.hardKillTimer) {
368
- clearTimeout(entry.hardKillTimer);
369
- entry.hardKillTimer = null;
370
- }
371
- }
372
- touchWorkerMessage(message) {
373
- if (!("turnId" in message) || !message.turnId) {
374
- return;
375
- }
376
- const entry = this.workers.get(message.turnId);
377
- if (entry) {
378
- entry.lastMessageAt = Date.now();
379
- }
380
- }
381
- }
382
- function isWorkerStale(entry, now) {
383
- if (entry.state === "stopping") {
384
- return false;
385
- }
386
- const lastSignal = Math.max(entry.startedAt, entry.lastMessageAt ?? 0, entry.lastEventAt ?? 0, entry.lastHeartbeatAt ?? 0);
387
- return now - lastSignal > WORKER_STALE_AFTER_MS;
388
- }
389
- function isRuntimeOperationId(value) {
390
- return (value.startsWith("thread-read:") ||
391
- value.startsWith("thread-rebuild:") ||
392
- value.startsWith("models-list:") ||
393
- value.startsWith("rate-limits-read:"));
394
- }
395
- function formatTimestamp(value) {
396
- return value === null ? null : new Date(value).toISOString();
397
- }
398
- function resolveWorkerEntry() {
399
- const currentPath = fileURLToPath(import.meta.url);
400
- const isTypeScriptRuntime = currentPath.endsWith(".ts");
401
- return {
402
- path: fileURLToPath(new URL(`./process.${isTypeScriptRuntime ? "ts" : "js"}`, import.meta.url)),
403
- execArgv: isTypeScriptRuntime ? ["--import", "tsx"] : [],
404
- };
405
- }