imcodes 2026.4.1874-dev.1860 → 2026.4.1881-dev.1865

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 (28) hide show
  1. package/dist/shared/effort-levels.d.ts +4 -2
  2. package/dist/shared/effort-levels.d.ts.map +1 -1
  3. package/dist/shared/effort-levels.js +16 -2
  4. package/dist/shared/effort-levels.js.map +1 -1
  5. package/dist/src/context/materialization-coordinator.d.ts.map +1 -1
  6. package/dist/src/context/materialization-coordinator.js +94 -51
  7. package/dist/src/context/materialization-coordinator.js.map +1 -1
  8. package/dist/src/daemon/jsonl-parse-core.d.ts +79 -0
  9. package/dist/src/daemon/jsonl-parse-core.d.ts.map +1 -0
  10. package/dist/src/daemon/jsonl-parse-core.js +400 -0
  11. package/dist/src/daemon/jsonl-parse-core.js.map +1 -0
  12. package/dist/src/daemon/jsonl-parse-pool.d.ts +52 -0
  13. package/dist/src/daemon/jsonl-parse-pool.d.ts.map +1 -0
  14. package/dist/src/daemon/jsonl-parse-pool.js +173 -0
  15. package/dist/src/daemon/jsonl-parse-pool.js.map +1 -0
  16. package/dist/src/daemon/jsonl-parse-worker-bootstrap.mjs +30 -0
  17. package/dist/src/daemon/jsonl-parse-worker-types.d.ts +36 -0
  18. package/dist/src/daemon/jsonl-parse-worker-types.d.ts.map +1 -0
  19. package/dist/src/daemon/jsonl-parse-worker-types.js +2 -0
  20. package/dist/src/daemon/jsonl-parse-worker-types.js.map +1 -0
  21. package/dist/src/daemon/jsonl-parse-worker.d.ts +12 -0
  22. package/dist/src/daemon/jsonl-parse-worker.d.ts.map +1 -0
  23. package/dist/src/daemon/jsonl-parse-worker.js +47 -0
  24. package/dist/src/daemon/jsonl-parse-worker.js.map +1 -0
  25. package/dist/src/daemon/jsonl-watcher.d.ts.map +1 -1
  26. package/dist/src/daemon/jsonl-watcher.js +72 -412
  27. package/dist/src/daemon/jsonl-watcher.js.map +1 -1
  28. package/package.json +2 -2
@@ -0,0 +1,400 @@
1
+ /**
2
+ * Pure Claude-Code JSONL parser — no direct access to timelineEmitter or
3
+ * module-level state. Designed to be shared between:
4
+ *
5
+ * 1) the main process (fallback when the parse worker is disabled/crashed)
6
+ * 2) the parse worker thread (`jsonl-parse-worker.ts`)
7
+ *
8
+ * Given a batch of raw JSONL lines + a per-session parse context (which holds
9
+ * the pending tool-call correlation map), the parser returns an ordered list
10
+ * of `EmitInstruction`s that the caller passes to `timelineEmitter.emit(...)`.
11
+ *
12
+ * Keeping this logic pure lets us run the heavy JSON.parse / regex / normalise
13
+ * work off the main event loop without diverging from the main-thread
14
+ * fallback semantics.
15
+ */
16
+ import { TIMELINE_EVENT_FILE_CHANGE } from '../../shared/file-change.js';
17
+ import { normalizeClaudeFileChange } from './file-change-normalizer.js';
18
+ import { resolveContextWindow } from '../shared/models/context.js';
19
+ export function createParseContext() {
20
+ return { pendingToolCalls: new Map() };
21
+ }
22
+ // ── Helpers (ports of jsonl-watcher's private helpers, made pure) ────────────
23
+ function asRecord(value) {
24
+ return value && typeof value === 'object' && !Array.isArray(value) ? value : null;
25
+ }
26
+ function extractToolInput(name, input) {
27
+ if (!input)
28
+ return '';
29
+ if (name === 'Grep') {
30
+ const pattern = input.pattern ?? input.query ?? input.text;
31
+ const path = input.path ?? input.file_path ?? input.filePath;
32
+ if (pattern && path)
33
+ return `${String(pattern).split('\n')[0]} in ${String(path).split('\n')[0]}`;
34
+ }
35
+ const val = input.command
36
+ ?? input.path
37
+ ?? input.file_path
38
+ ?? input.pattern
39
+ ?? input.description
40
+ ?? input.query
41
+ ?? input.objective
42
+ ?? input.text
43
+ ?? '';
44
+ const text = String(val);
45
+ return text.split('\n')[0] ?? '';
46
+ }
47
+ function extractToolResultOutput(block) {
48
+ const raw = block.content;
49
+ if (!raw)
50
+ return undefined;
51
+ let text;
52
+ if (typeof raw === 'string') {
53
+ text = raw;
54
+ }
55
+ else if (Array.isArray(raw)) {
56
+ text = raw.map((b) => b.text ?? '').join('\n');
57
+ }
58
+ else {
59
+ return undefined;
60
+ }
61
+ text = text.trim();
62
+ if (!text)
63
+ return undefined;
64
+ return text.length > 200 ? text.slice(0, 197) + '...' : text;
65
+ }
66
+ function isClaudeFileChangeTool(name) {
67
+ return name === 'Edit' || name === 'MultiEdit' || name === 'Write' || name === 'NotebookEdit';
68
+ }
69
+ function buildClaudeToolEventId(sessionName, toolUseId, phase) {
70
+ return `cc-tool:${sessionName}:${toolUseId}:${phase}`;
71
+ }
72
+ /** Patterns for system-injected messages that should not display as user messages. */
73
+ const SYSTEM_INJECT_RE = /<task-notification|<system-reminder|<command-name>|<command-message>|<local-command-|<bash-input>|<bash-stdout>|<bash-stderr>/;
74
+ // ── Pending tool-call map helpers (scoped to ctx) ────────────────────────────
75
+ function rememberClaudeToolCall(ctx, sessionName, pending) {
76
+ let map = ctx.pendingToolCalls.get(sessionName);
77
+ if (!map) {
78
+ map = new Map();
79
+ ctx.pendingToolCalls.set(sessionName, map);
80
+ }
81
+ map.set(pending.id, pending);
82
+ }
83
+ function takeClaudeToolCall(ctx, sessionName, toolUseId) {
84
+ if (!toolUseId)
85
+ return undefined;
86
+ const pending = ctx.pendingToolCalls.get(sessionName);
87
+ if (!pending)
88
+ return undefined;
89
+ const tool = pending.get(toolUseId);
90
+ if (tool)
91
+ pending.delete(toolUseId);
92
+ if (pending.size === 0)
93
+ ctx.pendingToolCalls.delete(sessionName);
94
+ return tool;
95
+ }
96
+ /** Drop all pending state for a session — called by caller when the watcher stops. */
97
+ export function forgetSession(ctx, sessionName) {
98
+ ctx.pendingToolCalls.delete(sessionName);
99
+ }
100
+ // ── Emit-collection helpers ──────────────────────────────────────────────────
101
+ function pushEmit(out, sessionName, type, payload, metadata) {
102
+ out.push({ sessionName, type, payload, metadata });
103
+ }
104
+ function emitUserStringContent(out, sessionName, text, stableId, ts) {
105
+ if (!text.trim())
106
+ return;
107
+ if (SYSTEM_INJECT_RE.test(text)) {
108
+ pushEmit(out, sessionName, 'agent.status', {
109
+ status: 'processing',
110
+ label: 'Processing system event...',
111
+ }, { source: 'daemon', confidence: 'high' });
112
+ return;
113
+ }
114
+ pushEmit(out, sessionName, 'user.message', { text }, {
115
+ source: 'daemon',
116
+ confidence: 'high',
117
+ ...(stableId ? { eventId: stableId('um') } : {}),
118
+ ...(ts ? { ts } : {}),
119
+ });
120
+ }
121
+ function emitAssistantStringContent(out, sessionName, text, stableId, ts) {
122
+ if (!text.trim())
123
+ return;
124
+ pushEmit(out, sessionName, 'assistant.text', { text, streaming: false }, {
125
+ source: 'daemon',
126
+ confidence: 'high',
127
+ ...(stableId ? { eventId: stableId('at') } : {}),
128
+ ...(ts ? { ts } : {}),
129
+ });
130
+ }
131
+ function emitClaudeFileChange(out, sessionName, batch, eventId, ts) {
132
+ pushEmit(out, sessionName, TIMELINE_EVENT_FILE_CHANGE, { batch }, {
133
+ source: 'daemon',
134
+ confidence: 'high',
135
+ eventId,
136
+ ...(ts ? { ts } : {}),
137
+ });
138
+ }
139
+ function emitClaudeToolCallBlock(ctx, out, sessionName, block, stableId, ts) {
140
+ if (!block.name)
141
+ return;
142
+ if (block.name === 'AskUserQuestion') {
143
+ const inp = block.input;
144
+ pushEmit(out, sessionName, 'ask.question', {
145
+ toolUseId: block.id,
146
+ questions: inp?.['questions'] ?? [],
147
+ }, {
148
+ source: 'daemon',
149
+ confidence: 'high',
150
+ ...(stableId ? { eventId: stableId('aq') } : {}),
151
+ ...(ts ? { ts } : {}),
152
+ });
153
+ return;
154
+ }
155
+ const input = block.input;
156
+ const toolUseId = block.id;
157
+ const isDeferredFileTool = isClaudeFileChangeTool(block.name) && !!toolUseId;
158
+ if (toolUseId) {
159
+ rememberClaudeToolCall(ctx, sessionName, {
160
+ id: toolUseId,
161
+ name: block.name,
162
+ input,
163
+ ...(ts ? { ts } : {}),
164
+ });
165
+ }
166
+ if (isDeferredFileTool)
167
+ return;
168
+ const callEventId = toolUseId ? buildClaudeToolEventId(sessionName, toolUseId, 'call') : (stableId ? stableId('tc') : undefined);
169
+ const summaryInput = extractToolInput(block.name, input);
170
+ pushEmit(out, sessionName, 'tool.call', {
171
+ tool: block.name,
172
+ ...(summaryInput ? { input: summaryInput } : (input ? { input } : {})),
173
+ }, {
174
+ source: 'daemon',
175
+ confidence: 'high',
176
+ ...(callEventId ? { eventId: callEventId } : {}),
177
+ ...(ts ? { ts } : {}),
178
+ });
179
+ }
180
+ function emitClaudeToolResultBlock(ctx, out, sessionName, block, stableId, ts) {
181
+ const toolUseId = block.tool_use_id;
182
+ const pending = takeClaudeToolCall(ctx, sessionName, toolUseId);
183
+ const toolUseResult = asRecord(block.toolUseResult);
184
+ const contentResult = asRecord(block.content);
185
+ const normalized = pending
186
+ && !block.is_error
187
+ ? normalizeClaudeFileChange({
188
+ toolName: pending.name,
189
+ toolCallId: pending.id,
190
+ input: pending.input,
191
+ toolResult: toolUseResult ?? contentResult ?? undefined,
192
+ })
193
+ : null;
194
+ if (pending && isClaudeFileChangeTool(pending.name)) {
195
+ const summaryInput = extractToolInput(pending.name, pending.input);
196
+ pushEmit(out, sessionName, 'tool.call', {
197
+ tool: pending.name,
198
+ ...(summaryInput ? { input: summaryInput } : (pending.input ? { input: pending.input } : {})),
199
+ }, {
200
+ source: 'daemon',
201
+ confidence: 'high',
202
+ eventId: buildClaudeToolEventId(sessionName, pending.id, 'call'),
203
+ ...(pending.ts ? { ts: pending.ts } : {}),
204
+ ...(normalized ? { hidden: true } : {}),
205
+ });
206
+ }
207
+ if (normalized && pending) {
208
+ pushEmit(out, sessionName, 'tool.result', {
209
+ ...(block.is_error ? { error: String(block.content ?? 'error') } : {}),
210
+ ...(toolUseResult?.content ? { output: toolUseResult.content } : {}),
211
+ }, {
212
+ source: 'daemon',
213
+ confidence: 'high',
214
+ eventId: buildClaudeToolEventId(sessionName, pending.id, 'result'),
215
+ ...(ts ? { ts } : {}),
216
+ hidden: true,
217
+ });
218
+ emitClaudeFileChange(out, sessionName, normalized, `cc-file-change:${sessionName}:${pending.id}`, ts);
219
+ return;
220
+ }
221
+ const error = block.is_error ? String(block.content ?? 'error') : undefined;
222
+ const output = !error ? extractToolResultOutput(block) : undefined;
223
+ pushEmit(out, sessionName, 'tool.result', {
224
+ ...(error ? { error } : {}),
225
+ ...(output ? { output } : {}),
226
+ }, {
227
+ source: 'daemon',
228
+ confidence: 'high',
229
+ ...(toolUseId ? { eventId: buildClaudeToolEventId(sessionName, toolUseId, 'result') } : stableId ? { eventId: stableId('tr') } : {}),
230
+ ...(ts ? { ts } : {}),
231
+ });
232
+ }
233
+ // ── Main entry points ────────────────────────────────────────────────────────
234
+ function parseOneLine(ctx, out, sessionName, line, lineByteOffset, presetContextWindow) {
235
+ if (!line.trim())
236
+ return;
237
+ let raw;
238
+ try {
239
+ raw = JSON.parse(line);
240
+ }
241
+ catch {
242
+ return;
243
+ }
244
+ const lineTs = raw['timestamp'] ? new Date(raw['timestamp']).getTime() : undefined;
245
+ const ts = lineTs && isFinite(lineTs) ? lineTs : undefined;
246
+ let blockIdx = 0;
247
+ const stableId = lineByteOffset !== undefined
248
+ ? (suffix) => `cc:${sessionName}:${lineByteOffset}:${suffix}:${blockIdx++}`
249
+ : undefined;
250
+ if (raw['type'] === 'progress') {
251
+ const data = raw['data'];
252
+ if (!data)
253
+ return;
254
+ const progressType = String(data['type'] ?? '');
255
+ switch (progressType) {
256
+ case 'bash_progress': {
257
+ const elapsed = data['elapsedTimeSeconds'];
258
+ pushEmit(out, sessionName, 'agent.status', {
259
+ status: 'bash_running',
260
+ label: `Bash running${elapsed ? ` (${Math.round(elapsed)}s)` : ''}...`,
261
+ }, { source: 'daemon', confidence: 'high' });
262
+ break;
263
+ }
264
+ case 'agent_progress': {
265
+ const inner = data['message'];
266
+ let msg = 'working';
267
+ if (typeof inner === 'string') {
268
+ msg = inner;
269
+ }
270
+ else if (inner && typeof inner === 'object') {
271
+ const role = inner.type ?? inner.role ?? '';
272
+ msg = String(role) || 'working';
273
+ }
274
+ pushEmit(out, sessionName, 'agent.status', {
275
+ status: 'agent_working',
276
+ label: `Sub-agent: ${msg}`,
277
+ }, { source: 'daemon', confidence: 'high' });
278
+ break;
279
+ }
280
+ case 'mcp_progress': {
281
+ const toolName = String(data['toolName'] ?? 'tool');
282
+ const server = String(data['serverName'] ?? '');
283
+ const mStatus = String(data['status'] ?? 'started');
284
+ if (mStatus === 'started') {
285
+ pushEmit(out, sessionName, 'agent.status', {
286
+ status: 'mcp_running',
287
+ label: `MCP: ${server ? server + '/' : ''}${toolName}...`,
288
+ }, { source: 'daemon', confidence: 'high' });
289
+ }
290
+ break;
291
+ }
292
+ case 'waiting_for_task': {
293
+ const desc = String(data['taskDescription'] ?? 'task');
294
+ pushEmit(out, sessionName, 'agent.status', {
295
+ status: 'waiting',
296
+ label: `Waiting: ${desc}`,
297
+ }, { source: 'daemon', confidence: 'high' });
298
+ break;
299
+ }
300
+ }
301
+ return;
302
+ }
303
+ if (raw['type'] === 'result') {
304
+ const costUsd = raw['total_cost_usd'];
305
+ if (typeof costUsd === 'number' && costUsd > 0) {
306
+ pushEmit(out, sessionName, 'usage.update', { costUsd }, { source: 'daemon', confidence: 'high' });
307
+ }
308
+ return;
309
+ }
310
+ if (raw['type'] === 'system') {
311
+ const subtype = String(raw['subtype'] ?? '');
312
+ if (subtype === 'compact_boundary') {
313
+ pushEmit(out, sessionName, 'agent.status', {
314
+ status: 'compacting',
315
+ label: 'Compacting conversation...',
316
+ }, { source: 'daemon', confidence: 'high' });
317
+ }
318
+ return;
319
+ }
320
+ const msg = raw['message'];
321
+ if (!msg)
322
+ return;
323
+ const content = msg['content'];
324
+ if (raw['type'] === 'assistant') {
325
+ if (typeof content === 'string') {
326
+ emitAssistantStringContent(out, sessionName, content, stableId, ts);
327
+ return;
328
+ }
329
+ if (!Array.isArray(content))
330
+ return;
331
+ for (const block of content) {
332
+ if (block.type === 'text' && block.text) {
333
+ pushEmit(out, sessionName, 'assistant.text', {
334
+ text: block.text,
335
+ streaming: false,
336
+ }, {
337
+ source: 'daemon',
338
+ confidence: 'high',
339
+ ...(stableId ? { eventId: stableId('at') } : {}),
340
+ ...(ts ? { ts } : {}),
341
+ });
342
+ }
343
+ else if (block.type === 'thinking') {
344
+ pushEmit(out, sessionName, 'assistant.thinking', {
345
+ text: block.thinking,
346
+ }, {
347
+ source: 'daemon',
348
+ confidence: 'high',
349
+ ...(stableId ? { eventId: stableId('th') } : {}),
350
+ ...(ts ? { ts } : {}),
351
+ });
352
+ }
353
+ else if (block.type === 'tool_use' && block.name) {
354
+ emitClaudeToolCallBlock(ctx, out, sessionName, block, stableId, ts);
355
+ }
356
+ else if (block.type === 'tool_result') {
357
+ emitClaudeToolResultBlock(ctx, out, sessionName, block, stableId, ts);
358
+ }
359
+ }
360
+ const usage = msg['usage'];
361
+ const model = msg['model'];
362
+ if (usage && typeof usage.input_tokens === 'number') {
363
+ pushEmit(out, sessionName, 'usage.update', {
364
+ inputTokens: usage.input_tokens + (usage.cache_creation_input_tokens ?? 0),
365
+ cacheTokens: usage.cache_read_input_tokens ?? 0,
366
+ contextWindow: resolveContextWindow(presetContextWindow, model),
367
+ ...(model ? { model } : {}),
368
+ }, { source: 'daemon', confidence: 'high' });
369
+ }
370
+ return;
371
+ }
372
+ if (raw['type'] === 'user') {
373
+ if (typeof content === 'string') {
374
+ emitUserStringContent(out, sessionName, content, stableId, ts);
375
+ return;
376
+ }
377
+ if (!Array.isArray(content))
378
+ return;
379
+ for (const block of content) {
380
+ if (block.type === 'text' && block.text?.trim()) {
381
+ emitUserStringContent(out, sessionName, block.text, stableId, ts);
382
+ }
383
+ else if (block.type === 'tool_result') {
384
+ emitClaudeToolResultBlock(ctx, out, sessionName, block, stableId, ts);
385
+ }
386
+ }
387
+ }
388
+ }
389
+ /**
390
+ * Parse a batch of JSONL lines and return the emit instructions (in order).
391
+ * Mutates `ctx.pendingToolCalls` to track in-flight Claude tool invocations.
392
+ */
393
+ export function parseLines(ctx, req) {
394
+ const out = [];
395
+ for (const item of req.items) {
396
+ parseOneLine(ctx, out, req.sessionName, item.line, item.lineByteOffset, req.presetContextWindow);
397
+ }
398
+ return { emits: out };
399
+ }
400
+ //# sourceMappingURL=jsonl-parse-core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonl-parse-core.js","sourceRoot":"","sources":["../../../src/daemon/jsonl-parse-core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Main-thread client for the JSONL parse worker.
3
+ *
4
+ * Responsibility:
5
+ * - Lazily spawn a single worker thread on first use
6
+ * - Route requests by numeric id, handle timeouts
7
+ * - On worker crash / unexpected exit: mark pool permanently disabled so the
8
+ * caller falls back to main-thread parsing. (We don't auto-restart because
9
+ * the pending tool-call state lives in the worker and would be lost —
10
+ * logging and continuing on main is simpler and safe.)
11
+ *
12
+ * The worker is **disabled by default**: the project's hot paths are moving
13
+ * to SDK-based transport providers, and every agent's chat now runs through
14
+ * `timeline-projection-worker` for persistence — so the main-thread parseLine
15
+ * cost on Claude JSONL is no longer a priority to offload. The worker code
16
+ * is kept in-tree (plus its parity tests) as an opt-in escape hatch: set
17
+ * `IM4CODES_JSONL_WORKER=1` (or true/yes/on) to turn it back on without a
18
+ * redeploy.
19
+ */
20
+ import type { ParseLinesRequest, ParseLinesResult } from './jsonl-parse-core.js';
21
+ /**
22
+ * `true` if the pool should be used in place of main-thread parseLine.
23
+ *
24
+ * Default: `false`. Set `IM4CODES_JSONL_WORKER` to `1`/`true`/`yes`/`on` to
25
+ * opt in (e.g. if a specific deployment notices JSONL parsing pressure on
26
+ * the main event loop).
27
+ */
28
+ export declare function isJsonlWorkerEnabled(): boolean;
29
+ declare class JsonlParsePool {
30
+ private worker;
31
+ private nextId;
32
+ private readonly pending;
33
+ private permanentlyDisabled;
34
+ /** True if the pool is currently alive (or may be lazily started). */
35
+ isAvailable(): boolean;
36
+ private ensureWorker;
37
+ private handleWorkerMessage;
38
+ private failAllPending;
39
+ private request;
40
+ /**
41
+ * Parse a batch of JSONL lines in the worker.
42
+ * Returns `null` on worker failure / timeout so the caller can fall back to
43
+ * main-thread parsing.
44
+ */
45
+ parseLines(req: ParseLinesRequest, timeoutMs?: number): Promise<ParseLinesResult | null>;
46
+ /** Drop worker-side pending tool-call state for a session. Best-effort. */
47
+ forgetSession(sessionName: string, timeoutMs?: number): Promise<void>;
48
+ shutdown(): Promise<void>;
49
+ }
50
+ export declare const jsonlParsePool: JsonlParsePool;
51
+ export {};
52
+ //# sourceMappingURL=jsonl-parse-pool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonl-parse-pool.d.ts","sourceRoot":"","sources":["../../../src/daemon/jsonl-parse-pool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAwBjF;;;;;;GAMG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAK9C;AAQD,cAAM,cAAc;IAClB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmC;IAC3D,OAAO,CAAC,mBAAmB,CAAS;IAEpC,sEAAsE;IACtE,WAAW,IAAI,OAAO;IAItB,OAAO,CAAC,YAAY;IA+BpB,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,OAAO;IAmBf;;;;OAIG;IACG,UAAU,CAAC,GAAG,EAAE,iBAAiB,EAAE,SAAS,SAA2B,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAahH,2EAA2E;IACrE,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,SAA4B,GAAG,OAAO,CAAC,IAAI,CAAC;IASxF,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAgBhC;AAED,eAAO,MAAM,cAAc,gBAAuB,CAAC"}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Main-thread client for the JSONL parse worker.
3
+ *
4
+ * Responsibility:
5
+ * - Lazily spawn a single worker thread on first use
6
+ * - Route requests by numeric id, handle timeouts
7
+ * - On worker crash / unexpected exit: mark pool permanently disabled so the
8
+ * caller falls back to main-thread parsing. (We don't auto-restart because
9
+ * the pending tool-call state lives in the worker and would be lost —
10
+ * logging and continuing on main is simpler and safe.)
11
+ *
12
+ * The worker is **disabled by default**: the project's hot paths are moving
13
+ * to SDK-based transport providers, and every agent's chat now runs through
14
+ * `timeline-projection-worker` for persistence — so the main-thread parseLine
15
+ * cost on Claude JSONL is no longer a priority to offload. The worker code
16
+ * is kept in-tree (plus its parity tests) as an opt-in escape hatch: set
17
+ * `IM4CODES_JSONL_WORKER=1` (or true/yes/on) to turn it back on without a
18
+ * redeploy.
19
+ */
20
+ import { Worker } from 'node:worker_threads';
21
+ import logger from '../util/logger.js';
22
+ const DEFAULT_PARSE_TIMEOUT_MS = 500;
23
+ const DEFAULT_FORGET_TIMEOUT_MS = 200;
24
+ /**
25
+ * Resolve the worker entry URL.
26
+ *
27
+ * The entry is a `.mjs` bootstrap (not a `.ts` file) so Node can load it
28
+ * directly in any mode. The bootstrap then registers the tsx loader (dev)
29
+ * and imports the real worker module. See `jsonl-parse-worker-bootstrap.mjs`.
30
+ */
31
+ function getWorkerModuleUrl() {
32
+ return new URL('./jsonl-parse-worker-bootstrap.mjs', import.meta.url);
33
+ }
34
+ /**
35
+ * `true` if the pool should be used in place of main-thread parseLine.
36
+ *
37
+ * Default: `false`. Set `IM4CODES_JSONL_WORKER` to `1`/`true`/`yes`/`on` to
38
+ * opt in (e.g. if a specific deployment notices JSONL parsing pressure on
39
+ * the main event loop).
40
+ */
41
+ export function isJsonlWorkerEnabled() {
42
+ const raw = process.env.IM4CODES_JSONL_WORKER;
43
+ if (!raw)
44
+ return false;
45
+ const v = raw.trim().toLowerCase();
46
+ return v === '1' || v === 'true' || v === 'yes' || v === 'on';
47
+ }
48
+ class JsonlParsePool {
49
+ worker = null;
50
+ nextId = 1;
51
+ pending = new Map();
52
+ permanentlyDisabled = false;
53
+ /** True if the pool is currently alive (or may be lazily started). */
54
+ isAvailable() {
55
+ return !this.permanentlyDisabled;
56
+ }
57
+ ensureWorker() {
58
+ if (this.permanentlyDisabled)
59
+ return null;
60
+ if (this.worker)
61
+ return this.worker;
62
+ try {
63
+ const worker = new Worker(getWorkerModuleUrl());
64
+ worker.unref();
65
+ worker.on('message', (message) => this.handleWorkerMessage(message));
66
+ worker.on('error', (err) => {
67
+ logger.warn({ err }, 'JsonlParse: worker failed');
68
+ this.failAllPending(err instanceof Error ? err : new Error(String(err)));
69
+ this.worker = null;
70
+ this.permanentlyDisabled = true;
71
+ });
72
+ worker.on('exit', (code) => {
73
+ if (code !== 0) {
74
+ logger.warn({ code }, 'JsonlParse: worker exited unexpectedly');
75
+ }
76
+ this.failAllPending(new Error(`jsonl_parse_worker_exit:${code}`));
77
+ this.worker = null;
78
+ // Only disable on non-zero exit; a clean shutdown is caller-initiated.
79
+ if (code !== 0)
80
+ this.permanentlyDisabled = true;
81
+ });
82
+ this.worker = worker;
83
+ return worker;
84
+ }
85
+ catch (err) {
86
+ logger.warn({ err }, 'JsonlParse: failed to start worker');
87
+ this.permanentlyDisabled = true;
88
+ return null;
89
+ }
90
+ }
91
+ handleWorkerMessage(message) {
92
+ const pending = this.pending.get(message.id);
93
+ if (!pending)
94
+ return;
95
+ this.pending.delete(message.id);
96
+ if (pending.timer)
97
+ clearTimeout(pending.timer);
98
+ if (message.ok)
99
+ pending.resolve(message.result);
100
+ else
101
+ pending.reject(new Error(message.error));
102
+ }
103
+ failAllPending(err) {
104
+ for (const [id, pending] of this.pending) {
105
+ this.pending.delete(id);
106
+ if (pending.timer)
107
+ clearTimeout(pending.timer);
108
+ pending.reject(err);
109
+ }
110
+ }
111
+ request(type, payload, timeoutMs) {
112
+ const worker = this.ensureWorker();
113
+ if (!worker)
114
+ return Promise.reject(new Error('jsonl_parse_worker_unavailable'));
115
+ const id = this.nextId++;
116
+ return new Promise((resolve, reject) => {
117
+ const timer = timeoutMs > 0 ? setTimeout(() => {
118
+ this.pending.delete(id);
119
+ reject(new Error(`jsonl_parse_timeout:${type}`));
120
+ }, timeoutMs) : undefined;
121
+ this.pending.set(id, { resolve: resolve, reject, timer });
122
+ const envelope = { id, type, payload };
123
+ worker.postMessage(envelope);
124
+ });
125
+ }
126
+ /**
127
+ * Parse a batch of JSONL lines in the worker.
128
+ * Returns `null` on worker failure / timeout so the caller can fall back to
129
+ * main-thread parsing.
130
+ */
131
+ async parseLines(req, timeoutMs = DEFAULT_PARSE_TIMEOUT_MS) {
132
+ if (this.permanentlyDisabled)
133
+ return null;
134
+ try {
135
+ return await this.request('parseLines', req, timeoutMs);
136
+ }
137
+ catch (err) {
138
+ logger.debug({ err, sessionName: req?.sessionName, count: Array.isArray(req?.items) ? req.items.length : -1 }, 'JsonlParse: parseLines failed, falling back');
139
+ return null;
140
+ }
141
+ }
142
+ /** Drop worker-side pending tool-call state for a session. Best-effort. */
143
+ async forgetSession(sessionName, timeoutMs = DEFAULT_FORGET_TIMEOUT_MS) {
144
+ if (this.permanentlyDisabled)
145
+ return;
146
+ try {
147
+ await this.request('forgetSession', { sessionName }, timeoutMs);
148
+ }
149
+ catch (err) {
150
+ logger.debug({ err, sessionName }, 'JsonlParse: forgetSession failed');
151
+ }
152
+ }
153
+ async shutdown() {
154
+ const worker = this.worker;
155
+ this.worker = null;
156
+ if (!worker)
157
+ return;
158
+ this.failAllPending(new Error('jsonl_parse_pool_shutdown'));
159
+ try {
160
+ await worker.terminate();
161
+ }
162
+ catch (err) {
163
+ logger.debug({ err }, 'JsonlParse: terminate failed');
164
+ }
165
+ // terminate() exits the worker with a non-zero code, which would otherwise
166
+ // trip the exit handler's permanentlyDisabled guard. Reset explicitly so
167
+ // the pool can be restarted (useful for tests and, in principle, runtime
168
+ // recovery via an admin reset).
169
+ this.permanentlyDisabled = false;
170
+ }
171
+ }
172
+ export const jsonlParsePool = new JsonlParsePool();
173
+ //# sourceMappingURL=jsonl-parse-pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonl-parse-pool.js","sourceRoot":"","sources":["../../../src/daemon/jsonl-parse-pool.ts"],"names":[],"mappings":"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"}