@linzumi/cli 1.0.271 → 1.0.273

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 (43) hide show
  1. package/README.md +1 -1
  2. package/dist/impl-res/cloud-supervisor.mjs +69 -69
  3. package/dist/impl-res/index.js +360 -319
  4. package/dist/impl-res/mcp-server.mjs +34 -34
  5. package/dist/impl-ts/cloud-supervisor.mjs +69 -69
  6. package/dist/impl-ts/index.js +490 -490
  7. package/dist/impl-ts/mcp-server.mjs +1 -1
  8. package/dist/mcp-server.mjs +1 -1
  9. package/package.json +3 -2
  10. package/scripts/build-auth-parity-oracle.mjs +0 -709
  11. package/scripts/build-canonical-codex-transpiler-oracle.mjs +0 -93
  12. package/scripts/build-config-identity-parity-oracle.mjs +0 -526
  13. package/scripts/build-core-commander-seams-parity-oracle.mjs +0 -799
  14. package/scripts/build-core-daemon-parity-oracle.mjs +0 -573
  15. package/scripts/build-core-dispatch-input-queue-parity-oracle.mjs +0 -225
  16. package/scripts/build-core-fate-ladder-parity-oracle.mjs +0 -350
  17. package/scripts/build-core-generation-overlap-parity-oracle.mjs +0 -292
  18. package/scripts/build-core-integration-parity-oracle.mjs +0 -453
  19. package/scripts/build-core-lifecycle-guards-parity-oracle.mjs +0 -443
  20. package/scripts/build-core-lock-parity-oracle.mjs +0 -462
  21. package/scripts/build-core-reconnect-resume-parity-oracle.mjs +0 -365
  22. package/scripts/build-core-startup-resume-scan-parity-oracle.mjs +0 -296
  23. package/scripts/build-core-supervisor-parity-oracle.mjs +0 -781
  24. package/scripts/build-cross-harness-failover-oracle.mjs +0 -349
  25. package/scripts/build-editor-parity-oracle.mjs +0 -1525
  26. package/scripts/build-forwarding-parity-oracle.mjs +0 -1390
  27. package/scripts/build-harness-claude-parity-oracle.mjs +0 -407
  28. package/scripts/build-harness-codex-parity-oracle.mjs +0 -479
  29. package/scripts/build-mcp-parity-oracle.mjs +0 -412
  30. package/scripts/build-mcp-selector-parity-oracle.mjs +0 -65
  31. package/scripts/build-onboarding-discovery-parity-oracle.mjs +0 -388
  32. package/scripts/build-onboarding-flow-parity-oracle.mjs +0 -562
  33. package/scripts/build-onboarding-gateway-parity-oracle.mjs +0 -313
  34. package/scripts/build-onboarding-support-parity-oracle.mjs +0 -519
  35. package/scripts/build-pipeline-parity-oracle.mjs +0 -614
  36. package/scripts/build-protocol-parity-oracle.mjs +0 -398
  37. package/scripts/build-queue-parity-oracle.mjs +0 -1012
  38. package/scripts/build-session-registry-parity-oracle.mjs +0 -582
  39. package/scripts/build-transport-parity-oracle.mjs +0 -694
  40. package/scripts/build-tui-parity-oracle.mjs +0 -577
  41. package/scripts/build-vm-sandbox-parity-oracle.mjs +0 -1281
  42. package/scripts/build-worker-entry-parity-oracle.mjs +0 -424
  43. package/scripts/build-worker-spawn-parity-oracle.mjs +0 -823
@@ -1,582 +0,0 @@
1
- // Spec: kandan/plans/2026-07-10-compute-nodes-rescript-commander-zero-ts-program.md
2
- // (M3 cluster 6, session-registry/leases).
3
- // Relationship: Builds the TS-side PARITY ORACLE for the session-registry/
4
- // leases cluster of the ReScript commander port, the sibling of
5
- // build-queue-parity-oracle.mjs (cluster 5). The oracle bundles the REAL
6
- // TS session/lease modules (runnerThreadSessionRegistry.ts,
7
- // codexSessionOwnership.ts, leaseEpochGuard.ts, threadReconcilerLock.ts,
8
- // the pin-registry/disposition slice of generationOverlap.ts, and the
9
- // exported liveness classifiers from runner.ts - threadRunnerEntryLiveness
10
- // + processIsAlive) behind the cluster 1/2 one-shot batch driver: a JSON
11
- // array of cases on stdin, a JSON array of results on stdout. The ReScript
12
- // package's RegistryParityConformance drives the SAME scripted inputs
13
- // through the ported modules in its own scratch directories and asserts
14
- // per-action outcome equivalence AND byte-identical registry files - the
15
- // cross-impl round-trip contract that lets both commanders share
16
- // ~/.linzumi through M4.
17
- //
18
- // Determinism: clocks are pinned per case (updatedAtMs/nowMs ride the
19
- // inputs; the registry store takes nowMs on rebind), scripted lock
20
- // sections use millisecond-scale sleeps sized so outcomes (not timings)
21
- // are deterministic, timing NUMBERS inside diagnostics are normalized on
22
- // both sides, and scratch paths are normalized through the "$DIR"
23
- // placeholder in both directions. Worker-liveness pid probes use the
24
- // driver's own live pid and a genuinely-dead child pid so the REAL
25
- // process.kill(pid, 0) probe is exercised identically by both impls.
26
- //
27
- // SECRETS: the oracle only ever sees the conformance suite's synthetic
28
- // payloads; nothing here logs case contents.
29
- //
30
- // The output is a local test artifact (.differential/ is gitignored, never
31
- // published) and stays unminified for debuggability.
32
- import { copyFile, mkdir } from 'node:fs/promises';
33
- import { dirname, join } from 'node:path';
34
- import { fileURLToPath } from 'node:url';
35
- import { build } from 'esbuild';
36
-
37
- const packageRoot = dirname(dirname(fileURLToPath(import.meta.url)));
38
-
39
- const driverSource = `
40
- import { spawnSync } from 'node:child_process';
41
- import {
42
- mkdtempSync,
43
- readdirSync,
44
- readFileSync,
45
- realpathSync,
46
- statSync,
47
- writeFileSync,
48
- } from 'node:fs';
49
- import { tmpdir } from 'node:os';
50
- import { join, relative } from 'node:path';
51
- import {
52
- createRunnerThreadSessionRegistryStore,
53
- defaultThreadSessionRehydrationMaxAgeMs,
54
- reannounceThreadSessionCap,
55
- reannounceableThreadSessions,
56
- rehydrateThreadSessions,
57
- runnerThreadSessionRegistryDir,
58
- runnerThreadSessionRegistryPath,
59
- } from './src/runnerThreadSessionRegistry';
60
- import {
61
- CodexSessionOwnershipConflictError,
62
- findCodexSessionOwnerConflict,
63
- sanitizeCodexSessionOwnership,
64
- } from './src/codexSessionOwnership';
65
- import {
66
- createLeaseEpochRegistry,
67
- isFencedClaim,
68
- leaseEpochEnvelope,
69
- readLeaseEpoch,
70
- } from './src/leaseEpochGuard';
71
- import {
72
- ReconcilerLockQueuedTimeoutError,
73
- ReconcilerLockTimeoutError,
74
- createThreadReconcilerLock,
75
- } from './src/threadReconcilerLock';
76
- import {
77
- createGenerationPinRegistry,
78
- generationControlDisposition,
79
- } from './src/generationOverlap';
80
- import { processIsAlive, threadRunnerEntryLiveness } from './src/runner';
81
-
82
- // --- Placeholder + snapshot plumbing ----------------------------------------------
83
-
84
- const dirPlaceholder = '$DIR';
85
-
86
- function scratch() {
87
- // realpath so macOS /var -> /private/var never splits the two impls'
88
- // placeholder substitution.
89
- return realpathSync(mkdtempSync(join(tmpdir(), 'linzumi-registry-oracle-')));
90
- }
91
-
92
- function substitute(value, from, to) {
93
- if (typeof value === 'string') {
94
- return value.split(from).join(to);
95
- }
96
- if (Array.isArray(value)) {
97
- return value.map((entry) => substitute(entry, from, to));
98
- }
99
- if (typeof value === 'object' && value !== null) {
100
- return Object.fromEntries(
101
- Object.entries(value).map(([key, entry]) => [
102
- substitute(key, from, to),
103
- substitute(entry, from, to),
104
- ])
105
- );
106
- }
107
- return value;
108
- }
109
-
110
- function snapshotFiles(dir) {
111
- const files = {};
112
- const walk = (current) => {
113
- for (const name of readdirSync(current).sort()) {
114
- const full = join(current, name);
115
- if (statSync(full).isDirectory()) {
116
- walk(full);
117
- } else {
118
- files[relative(dir, full)] = readFileSync(full, 'utf8');
119
- }
120
- }
121
- };
122
- walk(dir);
123
- return files;
124
- }
125
-
126
- function outcome(run) {
127
- try {
128
- const value = run();
129
- return value === undefined ? { defined: false } : { defined: true, value };
130
- } catch (error) {
131
- return {
132
- threw: true,
133
- message: error instanceof Error ? error.message : String(error),
134
- };
135
- }
136
- }
137
-
138
- function collectingLog(events, dir) {
139
- return (event, payload) => {
140
- events.push({ event, payload: substitute(payload, dir, dirPlaceholder) });
141
- };
142
- }
143
-
144
- // --- Ownership pure transforms -----------------------------------------------------
145
-
146
- function handleOwnership(testCase) {
147
- switch (testCase.fn) {
148
- case 'conflictMessage': {
149
- const error = new CodexSessionOwnershipConflictError({
150
- codexThreadId: testCase.codexThreadId,
151
- ownerKandanThreadId: testCase.ownerThreadId,
152
- requestingKandanThreadId: testCase.requestingThreadId,
153
- });
154
- return { message: error.message, name: error.name };
155
- }
156
- case 'findConflict':
157
- return outcome(() =>
158
- findCodexSessionOwnerConflict(testCase.records, testCase.bind)
159
- );
160
- case 'sanitize':
161
- return outcome(() => sanitizeCodexSessionOwnership(testCase.records));
162
- default:
163
- return { threw: true, message: 'unknown ownership fn ' + String(testCase.fn) };
164
- }
165
- }
166
-
167
- // --- Lease epoch registry -----------------------------------------------------------
168
-
169
- function handleLease(testCase) {
170
- switch (testCase.fn) {
171
- case 'readLeaseEpoch':
172
- return outcome(() => readLeaseEpoch(testCase.value));
173
- case 'envelope':
174
- return outcome(() => leaseEpochEnvelope(testCase.held ?? undefined));
175
- case 'isFenced':
176
- return outcome(() =>
177
- isFencedClaim(testCase.held ?? undefined, testCase.control ?? undefined)
178
- );
179
- case 'scenario': {
180
- const registry = createLeaseEpochRegistry();
181
- const results = (testCase.actions ?? []).map((action) => {
182
- switch (action.fn) {
183
- case 'adopt':
184
- return outcome(() => registry.adopt(action.threadId, action.epoch));
185
- case 'current':
186
- return outcome(() => registry.current(action.threadId));
187
- case 'release':
188
- return outcome(() => registry.release(action.threadId));
189
- case 'snapshot':
190
- return outcome(() => registry.snapshot());
191
- default:
192
- return { threw: true, message: 'unknown lease fn ' + String(action.fn) };
193
- }
194
- });
195
- return { results };
196
- }
197
- default:
198
- return { threw: true, message: 'unknown lease fn ' + String(testCase.fn) };
199
- }
200
- }
201
-
202
- // --- Registry store paths + scripted lifecycles --------------------------------------
203
-
204
- function handleRegistryPaths(testCase) {
205
- process.env.LINZUMI_SESSION_REGISTRY_DIR = testCase.envDir ?? '';
206
- const result = {
207
- dir: outcome(() => runnerThreadSessionRegistryDir()),
208
- path: outcome(() => runnerThreadSessionRegistryPath(testCase.runnerId)),
209
- };
210
- delete process.env.LINZUMI_SESSION_REGISTRY_DIR;
211
- return result;
212
- }
213
-
214
- function handleRegistryScenario(testCase) {
215
- const dir = scratch();
216
- const path = join(dir, 'registry.json');
217
- if (testCase.initialContents !== undefined) {
218
- writeFileSync(path, testCase.initialContents, 'utf8');
219
- }
220
- const events = [];
221
- const log = collectingLog(events, dir);
222
- // spec/commander-recovery-rules.md rules 01/05 and projection fence:
223
- // construction failure is an observable refusal, not an empty store.
224
- let store;
225
- const startup = outcome(() => {
226
- store = createRunnerThreadSessionRegistryStore(path, log);
227
- return 'ready';
228
- });
229
- const results = startup.threw ? [] : (testCase.actions ?? []).map((action) => {
230
- switch (action.fn) {
231
- case 'upsert':
232
- return outcome(() => store.upsert(action.record));
233
- case 'remove':
234
- return outcome(() => store.remove(action.threadId));
235
- case 'rebind':
236
- return outcome(() =>
237
- store.rebindCodexThread(
238
- action.threadId,
239
- action.newHarnessSessionId,
240
- action.nowMs ?? undefined
241
- )
242
- );
243
- case 'list':
244
- return outcome(() => store.list());
245
- case 'reload': {
246
- // Simulated restart: a fresh store re-reads (and re-sanitizes) the file.
247
- store = createRunnerThreadSessionRegistryStore(path, log);
248
- return { defined: false };
249
- }
250
- default:
251
- return { threw: true, message: 'unknown registry fn ' + String(action.fn) };
252
- }
253
- });
254
- return substitute(
255
- { startup, results, events, files: snapshotFiles(dir) },
256
- dir,
257
- dirPlaceholder
258
- );
259
- }
260
-
261
- // --- Rehydration orchestrator ---------------------------------------------------------
262
-
263
- async function handleRehydrate(testCase) {
264
- const events = [];
265
- const log = collectingLog(events, '\\u0000never');
266
- const retired = [];
267
- const attachCalls = [];
268
- const attachScript = testCase.attach ?? {};
269
- const unfinishedScript = testCase.unfinished ?? {};
270
- const summary = await rehydrateThreadSessions({
271
- records: testCase.records,
272
- nowMs: testCase.nowMs,
273
- maxAgeMs: testCase.maxAgeMs ?? defaultThreadSessionRehydrationMaxAgeMs,
274
- pendingDurableRowCount: (record) =>
275
- (testCase.pendingRows ?? {})[record.kandanThreadId] ?? 0,
276
- ...(testCase.useUnfinished === true
277
- ? {
278
- hasUnfinishedWork: (record) => {
279
- const value = unfinishedScript[record.kandanThreadId];
280
- if (value === 'throw') {
281
- throw new Error('scripted unfinished probe failure');
282
- }
283
- return value === true;
284
- },
285
- }
286
- : {}),
287
- attach: async (record) => {
288
- attachCalls.push(record.kandanThreadId);
289
- const value = attachScript[record.kandanThreadId] ?? 'failed';
290
- if (value === 'throw') {
291
- throw new Error('scripted attach failure');
292
- }
293
- return value;
294
- },
295
- retire: (record) => {
296
- retired.push(record.kandanThreadId);
297
- return { outcome: 'removed' };
298
- },
299
- log,
300
- });
301
- return { summary, retired, attachCalls, events };
302
- }
303
-
304
- // --- Re-announce selection --------------------------------------------------------------
305
-
306
- function handleReannounce(testCase) {
307
- const input = testCase.records.map((record) => ({ ...record }));
308
- const entries = reannounceableThreadSessions(
309
- input,
310
- testCase.nowMs,
311
- testCase.maxAgeMs ?? defaultThreadSessionRehydrationMaxAgeMs,
312
- testCase.cap ?? reannounceThreadSessionCap
313
- );
314
- return {
315
- entries,
316
- // The input must never be mutated (the filter-copies contract).
317
- inputUnchanged:
318
- JSON.stringify(input) === JSON.stringify(testCase.records),
319
- defaults: {
320
- maxAgeMs: defaultThreadSessionRehydrationMaxAgeMs,
321
- cap: reannounceThreadSessionCap,
322
- },
323
- };
324
- }
325
-
326
- // --- Reconciler lock -----------------------------------------------------------------
327
-
328
- function handleLockMessages(testCase) {
329
- const running = new ReconcilerLockTimeoutError(
330
- testCase.threadId,
331
- testCase.timeoutMs
332
- );
333
- const queued = new ReconcilerLockQueuedTimeoutError({
334
- threadId: testCase.threadId,
335
- timeoutMs: testCase.timeoutMs,
336
- queuedForMs: testCase.queuedForMs,
337
- blockedSectionAgeMs: testCase.blockedSectionAgeMs ?? undefined,
338
- });
339
- return {
340
- running: { name: running.name, message: running.message },
341
- queued: {
342
- name: queued.name,
343
- message: queued.message,
344
- // The subclass relationship existing catches rely on.
345
- isTimeoutSubclass: queued instanceof ReconcilerLockTimeoutError,
346
- },
347
- };
348
- }
349
-
350
- const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
351
-
352
- async function handleLockScenario(testCase) {
353
- const lock = createThreadReconcilerLock();
354
- const started = [];
355
- const settledOrder = [];
356
- const callers = (testCase.sections ?? []).map((section) => {
357
- const caller = lock
358
- .runExclusive(
359
- section.threadId,
360
- async () => {
361
- started.push(section.id);
362
- if (section.sleepMs !== undefined) {
363
- await sleep(section.sleepMs);
364
- }
365
- if (section.fail === true) {
366
- throw new Error('scripted section failure ' + section.id);
367
- }
368
- return section.id;
369
- },
370
- section.deadlineMs ?? undefined
371
- )
372
- .then(
373
- (value) => ({ id: section.id, outcome: 'completed', value }),
374
- (error) => ({
375
- id: section.id,
376
- outcome:
377
- error instanceof ReconcilerLockQueuedTimeoutError
378
- ? 'queued_timeout'
379
- : error instanceof ReconcilerLockTimeoutError
380
- ? 'section_timeout'
381
- : 'failed',
382
- message:
383
- error instanceof ReconcilerLockQueuedTimeoutError ||
384
- error instanceof ReconcilerLockTimeoutError
385
- ? undefined
386
- : error.message,
387
- })
388
- )
389
- .then((result) => {
390
- settledOrder.push(result.id);
391
- return result;
392
- });
393
- return caller;
394
- });
395
- const results = await Promise.all(callers);
396
- // Let any background sections settle so zombie runs (there must be none)
397
- // are observable.
398
- await sleep(testCase.settleMs ?? 150);
399
- return {
400
- results,
401
- started,
402
- settledOrder,
403
- busyAfter: (testCase.sections ?? []).some((section) =>
404
- lock.isBusy(section.threadId)
405
- ),
406
- activeThreadCountAfter: lock.activeThreadCount(),
407
- };
408
- }
409
-
410
- // --- Generation pins -------------------------------------------------------------------
411
-
412
- function handlePins(testCase) {
413
- if (testCase.fn === 'disposition') {
414
- const pinned = new Set(testCase.pinned ?? []);
415
- return outcome(() =>
416
- generationControlDisposition({
417
- role: testCase.role,
418
- threadId: testCase.threadId ?? undefined,
419
- isPinned: (threadId) => pinned.has(threadId),
420
- })
421
- );
422
- }
423
- const registry = createGenerationPinRegistry();
424
- const results = (testCase.actions ?? []).map((action) => {
425
- switch (action.fn) {
426
- case 'pin':
427
- return outcome(() => registry.pin(action.threadId));
428
- case 'release':
429
- return outcome(() => registry.release(action.threadId));
430
- case 'isPinned':
431
- return outcome(() => registry.isPinned(action.threadId));
432
- case 'replaceAll':
433
- return outcome(() => registry.replaceAll(action.threadIds));
434
- case 'clear':
435
- return outcome(() => registry.clear());
436
- case 'snapshot':
437
- return outcome(() => registry.snapshot());
438
- case 'size':
439
- return outcome(() => registry.size());
440
- default:
441
- return { threw: true, message: 'unknown pins fn ' + String(action.fn) };
442
- }
443
- });
444
- return { results };
445
- }
446
-
447
- // --- Thread-worker liveness ---------------------------------------------------------------
448
-
449
- // A genuinely-dead pid: spawnSync returns only after the child exits, so
450
- // the pid no longer maps to a live process (the TS unit tests' technique).
451
- let cachedDeadPid;
452
- function deadPid() {
453
- if (cachedDeadPid === undefined) {
454
- const result = spawnSync(process.execPath, ['-e', '0']);
455
- cachedDeadPid = result.pid;
456
- }
457
- return cachedDeadPid;
458
- }
459
-
460
- function resolvePid(spec) {
461
- if (spec === 'live') return process.pid;
462
- if (spec === 'dead') return deadPid();
463
- return undefined;
464
- }
465
-
466
- function fakeCodexClient(isClosed) {
467
- return {
468
- request: async () => ({ jsonrpc: '2.0', id: 1, result: {} }),
469
- notify: () => undefined,
470
- onNotification: () => undefined,
471
- onRequest: () => undefined,
472
- onClose: () => undefined,
473
- isClosed: () => isClosed === true,
474
- close: () => undefined,
475
- };
476
- }
477
-
478
- function handleWorkerLiveness(testCase) {
479
- if (testCase.fn === 'processIsAlive') {
480
- return outcome(() => processIsAlive(resolvePid(testCase.pid)));
481
- }
482
- const entry =
483
- testCase.entry.kind === 'starting'
484
- ? { kind: 'starting', promise: new Promise(() => undefined) }
485
- : {
486
- kind: 'running',
487
- handle: {
488
- kandanThreadId: testCase.entry.threadId ?? 'thread-1',
489
- codex: fakeCodexClient(testCase.entry.ipcClosed),
490
- close: async () => undefined,
491
- ...(testCase.entry.sessionClosed === undefined
492
- ? {}
493
- : { sessionClosed: () => testCase.entry.sessionClosed === true }),
494
- ...(testCase.entry.pid === undefined
495
- ? {}
496
- : { processPid: resolvePid(testCase.entry.pid) }),
497
- },
498
- };
499
- return outcome(() => threadRunnerEntryLiveness(entry));
500
- }
501
-
502
- // --- Dispatch --------------------------------------------------------------------------
503
-
504
- async function handle(testCase) {
505
- switch (testCase.op) {
506
- case 'ownership':
507
- return handleOwnership(testCase);
508
- case 'lease':
509
- return handleLease(testCase);
510
- case 'registryPaths':
511
- return handleRegistryPaths(testCase);
512
- case 'registryScenario':
513
- return handleRegistryScenario(testCase);
514
- case 'rehydrate':
515
- return await handleRehydrate(testCase);
516
- case 'reannounce':
517
- return handleReannounce(testCase);
518
- case 'lockMessages':
519
- return handleLockMessages(testCase);
520
- case 'lockScenario':
521
- return await handleLockScenario(testCase);
522
- case 'pins':
523
- return handlePins(testCase);
524
- case 'workerLiveness':
525
- return handleWorkerLiveness(testCase);
526
- default:
527
- return { threw: true, message: 'unknown op ' + String(testCase.op) };
528
- }
529
- }
530
-
531
- let stdin = '';
532
- process.stdin.setEncoding('utf8');
533
- for await (const chunk of process.stdin) {
534
- stdin += chunk;
535
- }
536
- const cases = JSON.parse(stdin);
537
- const results = [];
538
- for (const testCase of cases) {
539
- results.push(await handle(testCase));
540
- }
541
- process.stdout.write(JSON.stringify(results), () => {
542
- process.exit(0);
543
- });
544
- `;
545
-
546
- await mkdir(join(packageRoot, '.differential'), { recursive: true });
547
-
548
- // runner.ts's graph resolves assets/ relative to the bundle at import time
549
- // (the hello-project scaffold's inlined logo), so the asset must sit next
550
- // to the emitted oracle - the build-auth-parity-oracle precedent.
551
- await mkdir(join(packageRoot, '.differential/assets'), { recursive: true });
552
- await copyFile(
553
- join(packageRoot, 'src/assets/linzumi-logo.svg'),
554
- join(packageRoot, '.differential/assets/linzumi-logo.svg')
555
- );
556
-
557
- await build({
558
- stdin: {
559
- contents: driverSource,
560
- resolveDir: packageRoot,
561
- sourcefile: 'session-registry-parity-driver.ts',
562
- loader: 'ts',
563
- },
564
- bundle: true,
565
- // Spec: plans/2026-09-09-ts-native-account-continuation.md. Match the
566
- // production/auth-oracle ESM bridge for reachable CJS runtime dependencies;
567
- // the distinct banner binding cannot collide with bundled createRequire.
568
- banner: {
569
- js: "import { createRequire as __sessionRegistryOracleCreateRequire } from 'node:module';\nconst require = __sessionRegistryOracleCreateRequire(import.meta.url);",
570
- },
571
- platform: 'node',
572
- target: 'node20',
573
- format: 'esm',
574
- outfile: join(
575
- packageRoot,
576
- '.differential/session-registry-parity-oracle.mjs'
577
- ),
578
- minify: false,
579
- sourcemap: false,
580
- legalComments: 'none',
581
- external: ['ws', 'undici', 'blessed', '@anthropic-ai/claude-agent-sdk'],
582
- });