@caupulican/pi-adaptative 0.85.0 → 0.85.3

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 (88) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/bundled-resources/runtimes/pi-shell-engine/arithmetic.py +364 -0
  3. package/dist/bundled-resources/runtimes/pi-shell-engine/context.py +2 -1
  4. package/dist/bundled-resources/runtimes/pi-shell-engine/errors.py +16 -0
  5. package/dist/bundled-resources/runtimes/pi-shell-engine/exec.py +137 -14
  6. package/dist/bundled-resources/runtimes/pi-shell-engine/nodes.py +23 -2
  7. package/dist/bundled-resources/runtimes/pi-shell-engine/parser.py +134 -6
  8. package/dist/bundled-resources/runtimes/pi-shell-engine/tokens.py +25 -2
  9. package/dist/core/agent-session.d.ts.map +1 -1
  10. package/dist/core/agent-session.js +8 -0
  11. package/dist/core/agent-session.js.map +1 -1
  12. package/dist/core/compaction-controller.d.ts +2 -0
  13. package/dist/core/compaction-controller.d.ts.map +1 -1
  14. package/dist/core/compaction-controller.js +35 -13
  15. package/dist/core/compaction-controller.js.map +1 -1
  16. package/dist/core/failure-corpus.d.ts +26 -1
  17. package/dist/core/failure-corpus.d.ts.map +1 -1
  18. package/dist/core/failure-corpus.js +17 -0
  19. package/dist/core/failure-corpus.js.map +1 -1
  20. package/dist/core/model-tool-protocol.d.ts +3 -2
  21. package/dist/core/model-tool-protocol.d.ts.map +1 -1
  22. package/dist/core/model-tool-protocol.js +5 -1
  23. package/dist/core/model-tool-protocol.js.map +1 -1
  24. package/dist/core/models/runtime-process.d.ts +7 -1
  25. package/dist/core/models/runtime-process.d.ts.map +1 -1
  26. package/dist/core/models/runtime-process.js +4 -2
  27. package/dist/core/models/runtime-process.js.map +1 -1
  28. package/dist/core/process-matrix/runtime.js +43 -11
  29. package/dist/core/process-matrix/runtime.js.map +1 -1
  30. package/dist/core/resource-loader.d.ts +2 -0
  31. package/dist/core/resource-loader.d.ts.map +1 -1
  32. package/dist/core/resource-loader.js +18 -6
  33. package/dist/core/resource-loader.js.map +1 -1
  34. package/dist/core/tool-recovery-log-records.d.ts +33 -1
  35. package/dist/core/tool-recovery-log-records.d.ts.map +1 -1
  36. package/dist/core/tool-recovery-log-records.js +59 -12
  37. package/dist/core/tool-recovery-log-records.js.map +1 -1
  38. package/dist/core/tool-recovery-logger.d.ts +12 -1
  39. package/dist/core/tool-recovery-logger.d.ts.map +1 -1
  40. package/dist/core/tool-recovery-logger.js +24 -1
  41. package/dist/core/tool-recovery-logger.js.map +1 -1
  42. package/dist/core/tool-repair-health.d.ts.map +1 -1
  43. package/dist/core/tool-repair-health.js +6 -0
  44. package/dist/core/tool-repair-health.js.map +1 -1
  45. package/dist/core/tools/bash.d.ts +2 -2
  46. package/dist/core/tools/bash.d.ts.map +1 -1
  47. package/dist/core/tools/bash.js +2 -2
  48. package/dist/core/tools/bash.js.map +1 -1
  49. package/dist/core/tools/find.d.ts +2 -1
  50. package/dist/core/tools/find.d.ts.map +1 -1
  51. package/dist/core/tools/find.js +2 -6
  52. package/dist/core/tools/find.js.map +1 -1
  53. package/dist/core/tools/grep.d.ts +2 -1
  54. package/dist/core/tools/grep.d.ts.map +1 -1
  55. package/dist/core/tools/grep.js +2 -6
  56. package/dist/core/tools/grep.js.map +1 -1
  57. package/dist/core/tools/managed-search-tool.d.ts +8 -0
  58. package/dist/core/tools/managed-search-tool.d.ts.map +1 -0
  59. package/dist/core/tools/managed-search-tool.js +10 -0
  60. package/dist/core/tools/managed-search-tool.js.map +1 -0
  61. package/dist/core/tools/shell-command-parser.d.ts +4 -3
  62. package/dist/core/tools/shell-command-parser.d.ts.map +1 -1
  63. package/dist/core/tools/shell-command-parser.js +32 -7
  64. package/dist/core/tools/shell-command-parser.js.map +1 -1
  65. package/dist/core/tools/shell-contract-router.d.ts.map +1 -1
  66. package/dist/core/tools/shell-contract-router.js +23 -1
  67. package/dist/core/tools/shell-contract-router.js.map +1 -1
  68. package/dist/core/tools/windows-shell-engine.js +1 -1
  69. package/dist/core/tools/windows-shell-engine.js.map +1 -1
  70. package/dist/utils/paths.js +1 -1
  71. package/dist/utils/paths.js.map +1 -1
  72. package/dist/utils/tools-manager.d.ts +18 -1
  73. package/dist/utils/tools-manager.d.ts.map +1 -1
  74. package/dist/utils/tools-manager.js +73 -43
  75. package/dist/utils/tools-manager.js.map +1 -1
  76. package/docs/models.md +1 -1
  77. package/docs/settings.md +1 -1
  78. package/docs/tool-repair.md +3 -3
  79. package/docs/windows.md +7 -5
  80. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  81. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  82. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  83. package/examples/extensions/sandbox/package-lock.json +2 -2
  84. package/examples/extensions/sandbox/package.json +1 -1
  85. package/examples/extensions/with-deps/package-lock.json +2 -2
  86. package/examples/extensions/with-deps/package.json +1 -1
  87. package/npm-shrinkwrap.json +12 -12
  88. package/package.json +4 -4
@@ -22,7 +22,13 @@ export interface RuntimeCommandRunnerLimits {
22
22
  * Output is retained as chunk tails and flattened once, after the child reaches a terminal state.
23
23
  */
24
24
  export declare function createRuntimeCommandRunner(limits: RuntimeCommandRunnerLimits): RuntimeCommandRunner;
25
- export declare function runtimeCommandAvailable(command: string): boolean;
25
+ type RuntimeCommandProbe = (command: string, args: string[], options: {
26
+ encoding: "utf8";
27
+ timeout: number;
28
+ }) => {
29
+ error?: unknown;
30
+ };
31
+ export declare function runtimeCommandAvailable(command: string, probe?: RuntimeCommandProbe): boolean;
26
32
  export declare function runtimeSleep(ms: number): Promise<void>;
27
33
  export type ManagedRuntimeChild = Pick<ChildProcess, "pid" | "kill" | "unref" | "on">;
28
34
  export interface ManagedRuntimeSpawnOptions {
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-process.d.ts","sourceRoot":"","sources":["../../../src/core/models/runtime-process.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime-process.d.ts","sourceRoot":"","sources":["../../../src/core/models/runtime-process.ts"],"names":[],"mappings":"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"}
@@ -64,8 +64,10 @@ export function createRuntimeCommandRunner(limits) {
64
64
  }
65
65
  };
66
66
  }
67
- export function runtimeCommandAvailable(command) {
68
- return spawnProcessSync(command, ["--version"], { encoding: "utf8", timeout: 5_000 }).error === undefined;
67
+ export function runtimeCommandAvailable(command, probe = spawnProcessSync) {
68
+ // Node returns `undefined` on success; cross-spawn normalizes that field to `null` on Windows.
69
+ // Both are the absence of an error. A strict undefined check made every Windows probe fail.
70
+ return probe(command, ["--version"], { encoding: "utf8", timeout: 5_000 }).error == null;
69
71
  }
70
72
  export function runtimeSleep(ms) {
71
73
  return sleep(ms);
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-process.js","sourceRoot":"","sources":["../../../src/core/models/runtime-process.ts"],"names":[],"mappings":"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","sourcesContent":["import { type ChildProcess, spawn } from \"node:child_process\";\nimport { createWriteStream, existsSync, mkdirSync, rmSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { Readable, Transform, Writable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport { spawnProcess, spawnProcessSync, waitForChildProcessWithTermination } from \"../../utils/child-process.ts\";\nimport { sleep } from \"../../utils/sleep.ts\";\nimport { createRollingOutputBuffer } from \"../exec.ts\";\n\nexport interface RuntimeCommandResult {\n\tok: boolean;\n\tstdout: string;\n\tstderr: string;\n\tcode?: number | null;\n\terror?: string;\n}\n\nexport interface RuntimeCommandOptions {\n\tenv?: NodeJS.ProcessEnv;\n\tonOutput?: (chunk: string) => void;\n}\n\nexport type RuntimeCommandRunner = (\n\tcommand: string,\n\targs: string[],\n\toptions?: RuntimeCommandOptions,\n) => Promise<RuntimeCommandResult>;\n\nexport interface RuntimeCommandRunnerLimits {\n\ttimeoutMs: number;\n\tkillGraceMs: number;\n\tmaxOutputUnits?: number;\n}\n\nconst DEFAULT_RUNTIME_OUTPUT_UNITS = 1024 * 1024;\n\n/**\n * Build a runtime-management command runner with one bounded process lifecycle.\n * Output is retained as chunk tails and flattened once, after the child reaches a terminal state.\n */\nexport function createRuntimeCommandRunner(limits: RuntimeCommandRunnerLimits): RuntimeCommandRunner {\n\tconst requestedOutputUnits = limits.maxOutputUnits ?? DEFAULT_RUNTIME_OUTPUT_UNITS;\n\tconst maxOutputUnits =\n\t\tNumber.isFinite(requestedOutputUnits) && requestedOutputUnits > 0\n\t\t\t? Math.floor(requestedOutputUnits)\n\t\t\t: DEFAULT_RUNTIME_OUTPUT_UNITS;\n\treturn async (command, args, options = {}) => {\n\t\ttry {\n\t\t\tconst proc = spawnProcess(command, args, {\n\t\t\t\tdetached: process.platform !== \"win32\",\n\t\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t\t\tenv: options.env ? { ...process.env, ...options.env } : process.env,\n\t\t\t});\n\t\t\tconst stdout = createRollingOutputBuffer(maxOutputUnits);\n\t\t\tconst stderr = createRollingOutputBuffer(maxOutputUnits);\n\t\t\tproc.stdout.setEncoding(\"utf8\");\n\t\t\tproc.stderr.setEncoding(\"utf8\");\n\t\t\tproc.stdout.on(\"data\", (chunk: string) => {\n\t\t\t\tstdout.push(chunk);\n\t\t\t\toptions.onOutput?.(chunk);\n\t\t\t});\n\t\t\tproc.stderr.on(\"data\", (chunk: string) => {\n\t\t\t\tstderr.push(chunk);\n\t\t\t\toptions.onOutput?.(chunk);\n\t\t\t});\n\t\t\tconst terminal = await waitForChildProcessWithTermination(proc, {\n\t\t\t\ttimeoutMs: limits.timeoutMs,\n\t\t\t\tkillGraceMs: limits.killGraceMs,\n\t\t\t});\n\t\t\tconst stdoutText = stdout.text();\n\t\t\tconst stderrText = stderr.text();\n\t\t\treturn {\n\t\t\t\tok: terminal.code === 0,\n\t\t\t\tstdout: stdoutText,\n\t\t\t\tstderr: stderrText,\n\t\t\t\tcode: terminal.code,\n\t\t\t\t...(terminal.code === 0\n\t\t\t\t\t? {}\n\t\t\t\t\t: {\n\t\t\t\t\t\t\terror:\n\t\t\t\t\t\t\t\tterminal.reason === \"timeout\"\n\t\t\t\t\t\t\t\t\t? `${command} timed out after ${limits.timeoutMs}ms`\n\t\t\t\t\t\t\t\t\t: stderrText.trim() || stdoutText.trim() || `exit code ${terminal.code ?? \"unknown\"}`,\n\t\t\t\t\t\t}),\n\t\t\t};\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\tstdout: \"\",\n\t\t\t\tstderr: \"\",\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t};\n\t\t}\n\t};\n}\n\nexport function runtimeCommandAvailable(command: string): boolean {\n\treturn spawnProcessSync(command, [\"--version\"], { encoding: \"utf8\", timeout: 5_000 }).error === undefined;\n}\n\nexport function runtimeSleep(ms: number): Promise<void> {\n\treturn sleep(ms);\n}\n\nexport type ManagedRuntimeChild = Pick<ChildProcess, \"pid\" | \"kill\" | \"unref\" | \"on\">;\nexport interface ManagedRuntimeSpawnOptions {\n\tdetached?: boolean;\n\tstdio?: \"ignore\";\n\tenv: NodeJS.ProcessEnv;\n}\nexport type ManagedRuntimeSpawn = (\n\tcommand: string,\n\targs: string[],\n\toptions: ManagedRuntimeSpawnOptions,\n) => ManagedRuntimeChild;\n\nexport function spawnManagedRuntime(\n\tcommand: string,\n\targs: string[],\n\toptions: ManagedRuntimeSpawnOptions,\n): ManagedRuntimeChild {\n\treturn spawn(command, args, { ...options, stdio: \"ignore\" });\n}\n\nexport interface RuntimeLifecycleDependencyOverrides {\n\tfetchFn?: typeof fetch;\n\tspawnFn?: ManagedRuntimeSpawn;\n\texistsFn?: (path: string) => boolean;\n\tsleepFn?: (ms: number) => Promise<void>;\n}\n\nexport type RuntimeLifecycleDependencies = readonly [\n\tfetchFn: typeof fetch,\n\tspawnFn: ManagedRuntimeSpawn,\n\texistsFn: (path: string) => boolean,\n\tsleepFn: (ms: number) => Promise<void>,\n];\n\n/** Resolve the common runtime lifecycle boundary once, during construction. */\nexport function resolveRuntimeLifecycleDependencies(\n\toverrides?: RuntimeLifecycleDependencyOverrides,\n): RuntimeLifecycleDependencies {\n\treturn [\n\t\toverrides?.fetchFn ?? fetch,\n\t\toverrides?.spawnFn ?? spawnManagedRuntime,\n\t\toverrides?.existsFn ?? existsSync,\n\t\toverrides?.sleepFn ?? runtimeSleep,\n\t];\n}\n\nexport type RuntimeDownloadResult =\n\t| { ok: true; response: Response; body: ReadableStream<Uint8Array> }\n\t| { ok: false; error: string };\n\ntype RuntimeFetch = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;\n\n/** Validate a runtime download without consuming, decoding, or copying its response body. */\nexport async function fetchRuntimeDownload(\n\tfetchFn: RuntimeFetch,\n\turl: string,\n\tinit?: RequestInit,\n): Promise<RuntimeDownloadResult> {\n\tlet response: Response;\n\ttry {\n\t\tresponse = await fetchFn(url, init);\n\t} catch (error) {\n\t\treturn { ok: false, error: `download-fail: ${error instanceof Error ? error.message : String(error)}` };\n\t}\n\tif (!response.ok || !response.body) return { ok: false, error: `download-fail: HTTP ${response.status}` };\n\treturn { ok: true, response, body: response.body };\n}\n\n/** Download and extract a runtime archive without materializing or copying its body. */\nexport async function installRuntimeArchive<TInput extends NodeJS.ReadableStream, TKind extends string>(\n\tfetchFn: RuntimeFetch,\n\tdownloadUrl: string,\n\tdestDir: string,\n\tasset: { name: string; kind: TKind },\n\textractArchive: (input: TInput, destDir: string, kind: TKind) => Promise<{ ok: boolean; error?: string }>,\n\tonProgress?: (status: string) => void,\n): Promise<{ ok: boolean; error?: string }> {\n\tonProgress?.(`Downloading ${asset.name}…`);\n\tconst download = await fetchRuntimeDownload(fetchFn, downloadUrl);\n\tif (!download.ok) return download;\n\tmkdirSync(destDir, { recursive: true });\n\tonProgress?.(`Extracting ${asset.name}…`);\n\treturn extractArchive(download.body as unknown as TInput, destDir, asset.kind);\n}\n\nexport function tryFileSizeBytes(path: string): number | undefined {\n\ttry {\n\t\treturn statSync(path).size;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nexport function removePartialDownload(path: string): void {\n\ttry {\n\t\trmSync(path, { force: true });\n\t} catch {\n\t\t// best-effort cleanup\n\t}\n}\n\n/** Wait for a failed pipeline's file descriptor to close before deleting its partial output. */\nexport function waitForWritableClosed(stream: Writable & { closed?: boolean }): Promise<void> {\n\tif (stream.closed) return Promise.resolve();\n\treturn new Promise((resolve) => {\n\t\tstream.once(\"close\", resolve);\n\t\tstream.destroy();\n\t});\n}\n\n/** Stream a runtime payload to disk, closing and deleting partial output on any failure. */\nexport async function writeRuntimeDownload(\n\tinput: Readable,\n\tdestPath: string,\n\ttransform?: Transform,\n): Promise<{ ok: true } | { ok: false; error: string }> {\n\tconst writeStream = createWriteStream(destPath);\n\ttry {\n\t\tif (transform) await pipeline(input, transform, writeStream);\n\t\telse await pipeline(input, writeStream);\n\t\treturn { ok: true };\n\t} catch (error) {\n\t\tawait waitForWritableClosed(writeStream);\n\t\tremovePartialDownload(destPath);\n\t\treturn { ok: false, error: `download-fail: ${error instanceof Error ? error.message : String(error)}` };\n\t}\n}\n\nexport function requireRuntimeStdin(proc: ChildProcess, label: string): Writable {\n\tif (!proc.stdin) throw new Error(`${label}: no stdin pipe`);\n\treturn proc.stdin;\n}\n\nexport interface ExtractZipArchiveOptions {\n\tinput: Readable;\n\tdestDir: string;\n\ttempPrefix: string;\n\tplatform: () => string;\n\thasCommand: (command: string) => boolean;\n\ttimeoutMs: number;\n\tkillGraceMs: number;\n}\n\n/** Shared seekable-file extraction path for managed runtime zip archives. */\nexport async function extractZipArchive(options: ExtractZipArchiveOptions): Promise<{ ok: boolean; error?: string }> {\n\tconst zipPath = join(options.destDir, \"..\", `${options.tempPrefix}-${process.pid}-${Date.now()}.zip`);\n\ttry {\n\t\tawait pipeline(options.input, createWriteStream(zipPath));\n\t\tconst extractCommand = options.platform() === \"win32\" && options.hasCommand(\"tar\") ? \"tar\" : \"unzip\";\n\t\tconst args =\n\t\t\textractCommand === \"tar\" ? [\"-xf\", zipPath, \"-C\", options.destDir] : [\"-q\", zipPath, \"-d\", options.destDir];\n\t\tconst proc = spawnProcess(extractCommand, args, {\n\t\t\tdetached: process.platform !== \"win32\",\n\t\t\tstdio: \"ignore\",\n\t\t});\n\t\tconst terminal = await waitForChildProcessWithTermination(proc, {\n\t\t\ttimeoutMs: options.timeoutMs,\n\t\t\tkillGraceMs: options.killGraceMs,\n\t\t});\n\t\tif (terminal.reason === \"timeout\" || terminal.code !== 0) {\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\terror:\n\t\t\t\t\tterminal.reason === \"timeout\"\n\t\t\t\t\t\t? `extract-fail: ${extractCommand} timed out after ${options.timeoutMs}ms`\n\t\t\t\t\t\t: `extract-fail: ${extractCommand} exited with code ${terminal.code ?? \"unknown\"}`,\n\t\t\t};\n\t\t}\n\t\treturn { ok: true };\n\t} finally {\n\t\tremovePartialDownload(zipPath);\n\t}\n}\n"]}
1
+ {"version":3,"file":"runtime-process.js","sourceRoot":"","sources":["../../../src/core/models/runtime-process.ts"],"names":[],"mappings":"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","sourcesContent":["import { type ChildProcess, spawn } from \"node:child_process\";\nimport { createWriteStream, existsSync, mkdirSync, rmSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { Readable, Transform, Writable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport { spawnProcess, spawnProcessSync, waitForChildProcessWithTermination } from \"../../utils/child-process.ts\";\nimport { sleep } from \"../../utils/sleep.ts\";\nimport { createRollingOutputBuffer } from \"../exec.ts\";\n\nexport interface RuntimeCommandResult {\n\tok: boolean;\n\tstdout: string;\n\tstderr: string;\n\tcode?: number | null;\n\terror?: string;\n}\n\nexport interface RuntimeCommandOptions {\n\tenv?: NodeJS.ProcessEnv;\n\tonOutput?: (chunk: string) => void;\n}\n\nexport type RuntimeCommandRunner = (\n\tcommand: string,\n\targs: string[],\n\toptions?: RuntimeCommandOptions,\n) => Promise<RuntimeCommandResult>;\n\nexport interface RuntimeCommandRunnerLimits {\n\ttimeoutMs: number;\n\tkillGraceMs: number;\n\tmaxOutputUnits?: number;\n}\n\nconst DEFAULT_RUNTIME_OUTPUT_UNITS = 1024 * 1024;\n\n/**\n * Build a runtime-management command runner with one bounded process lifecycle.\n * Output is retained as chunk tails and flattened once, after the child reaches a terminal state.\n */\nexport function createRuntimeCommandRunner(limits: RuntimeCommandRunnerLimits): RuntimeCommandRunner {\n\tconst requestedOutputUnits = limits.maxOutputUnits ?? DEFAULT_RUNTIME_OUTPUT_UNITS;\n\tconst maxOutputUnits =\n\t\tNumber.isFinite(requestedOutputUnits) && requestedOutputUnits > 0\n\t\t\t? Math.floor(requestedOutputUnits)\n\t\t\t: DEFAULT_RUNTIME_OUTPUT_UNITS;\n\treturn async (command, args, options = {}) => {\n\t\ttry {\n\t\t\tconst proc = spawnProcess(command, args, {\n\t\t\t\tdetached: process.platform !== \"win32\",\n\t\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t\t\tenv: options.env ? { ...process.env, ...options.env } : process.env,\n\t\t\t});\n\t\t\tconst stdout = createRollingOutputBuffer(maxOutputUnits);\n\t\t\tconst stderr = createRollingOutputBuffer(maxOutputUnits);\n\t\t\tproc.stdout.setEncoding(\"utf8\");\n\t\t\tproc.stderr.setEncoding(\"utf8\");\n\t\t\tproc.stdout.on(\"data\", (chunk: string) => {\n\t\t\t\tstdout.push(chunk);\n\t\t\t\toptions.onOutput?.(chunk);\n\t\t\t});\n\t\t\tproc.stderr.on(\"data\", (chunk: string) => {\n\t\t\t\tstderr.push(chunk);\n\t\t\t\toptions.onOutput?.(chunk);\n\t\t\t});\n\t\t\tconst terminal = await waitForChildProcessWithTermination(proc, {\n\t\t\t\ttimeoutMs: limits.timeoutMs,\n\t\t\t\tkillGraceMs: limits.killGraceMs,\n\t\t\t});\n\t\t\tconst stdoutText = stdout.text();\n\t\t\tconst stderrText = stderr.text();\n\t\t\treturn {\n\t\t\t\tok: terminal.code === 0,\n\t\t\t\tstdout: stdoutText,\n\t\t\t\tstderr: stderrText,\n\t\t\t\tcode: terminal.code,\n\t\t\t\t...(terminal.code === 0\n\t\t\t\t\t? {}\n\t\t\t\t\t: {\n\t\t\t\t\t\t\terror:\n\t\t\t\t\t\t\t\tterminal.reason === \"timeout\"\n\t\t\t\t\t\t\t\t\t? `${command} timed out after ${limits.timeoutMs}ms`\n\t\t\t\t\t\t\t\t\t: stderrText.trim() || stdoutText.trim() || `exit code ${terminal.code ?? \"unknown\"}`,\n\t\t\t\t\t\t}),\n\t\t\t};\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\tstdout: \"\",\n\t\t\t\tstderr: \"\",\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t};\n\t\t}\n\t};\n}\n\ntype RuntimeCommandProbe = (\n\tcommand: string,\n\targs: string[],\n\toptions: { encoding: \"utf8\"; timeout: number },\n) => { error?: unknown };\n\nexport function runtimeCommandAvailable(command: string, probe: RuntimeCommandProbe = spawnProcessSync): boolean {\n\t// Node returns `undefined` on success; cross-spawn normalizes that field to `null` on Windows.\n\t// Both are the absence of an error. A strict undefined check made every Windows probe fail.\n\treturn probe(command, [\"--version\"], { encoding: \"utf8\", timeout: 5_000 }).error == null;\n}\n\nexport function runtimeSleep(ms: number): Promise<void> {\n\treturn sleep(ms);\n}\n\nexport type ManagedRuntimeChild = Pick<ChildProcess, \"pid\" | \"kill\" | \"unref\" | \"on\">;\nexport interface ManagedRuntimeSpawnOptions {\n\tdetached?: boolean;\n\tstdio?: \"ignore\";\n\tenv: NodeJS.ProcessEnv;\n}\nexport type ManagedRuntimeSpawn = (\n\tcommand: string,\n\targs: string[],\n\toptions: ManagedRuntimeSpawnOptions,\n) => ManagedRuntimeChild;\n\nexport function spawnManagedRuntime(\n\tcommand: string,\n\targs: string[],\n\toptions: ManagedRuntimeSpawnOptions,\n): ManagedRuntimeChild {\n\treturn spawn(command, args, { ...options, stdio: \"ignore\" });\n}\n\nexport interface RuntimeLifecycleDependencyOverrides {\n\tfetchFn?: typeof fetch;\n\tspawnFn?: ManagedRuntimeSpawn;\n\texistsFn?: (path: string) => boolean;\n\tsleepFn?: (ms: number) => Promise<void>;\n}\n\nexport type RuntimeLifecycleDependencies = readonly [\n\tfetchFn: typeof fetch,\n\tspawnFn: ManagedRuntimeSpawn,\n\texistsFn: (path: string) => boolean,\n\tsleepFn: (ms: number) => Promise<void>,\n];\n\n/** Resolve the common runtime lifecycle boundary once, during construction. */\nexport function resolveRuntimeLifecycleDependencies(\n\toverrides?: RuntimeLifecycleDependencyOverrides,\n): RuntimeLifecycleDependencies {\n\treturn [\n\t\toverrides?.fetchFn ?? fetch,\n\t\toverrides?.spawnFn ?? spawnManagedRuntime,\n\t\toverrides?.existsFn ?? existsSync,\n\t\toverrides?.sleepFn ?? runtimeSleep,\n\t];\n}\n\nexport type RuntimeDownloadResult =\n\t| { ok: true; response: Response; body: ReadableStream<Uint8Array> }\n\t| { ok: false; error: string };\n\ntype RuntimeFetch = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;\n\n/** Validate a runtime download without consuming, decoding, or copying its response body. */\nexport async function fetchRuntimeDownload(\n\tfetchFn: RuntimeFetch,\n\turl: string,\n\tinit?: RequestInit,\n): Promise<RuntimeDownloadResult> {\n\tlet response: Response;\n\ttry {\n\t\tresponse = await fetchFn(url, init);\n\t} catch (error) {\n\t\treturn { ok: false, error: `download-fail: ${error instanceof Error ? error.message : String(error)}` };\n\t}\n\tif (!response.ok || !response.body) return { ok: false, error: `download-fail: HTTP ${response.status}` };\n\treturn { ok: true, response, body: response.body };\n}\n\n/** Download and extract a runtime archive without materializing or copying its body. */\nexport async function installRuntimeArchive<TInput extends NodeJS.ReadableStream, TKind extends string>(\n\tfetchFn: RuntimeFetch,\n\tdownloadUrl: string,\n\tdestDir: string,\n\tasset: { name: string; kind: TKind },\n\textractArchive: (input: TInput, destDir: string, kind: TKind) => Promise<{ ok: boolean; error?: string }>,\n\tonProgress?: (status: string) => void,\n): Promise<{ ok: boolean; error?: string }> {\n\tonProgress?.(`Downloading ${asset.name}…`);\n\tconst download = await fetchRuntimeDownload(fetchFn, downloadUrl);\n\tif (!download.ok) return download;\n\tmkdirSync(destDir, { recursive: true });\n\tonProgress?.(`Extracting ${asset.name}…`);\n\treturn extractArchive(download.body as unknown as TInput, destDir, asset.kind);\n}\n\nexport function tryFileSizeBytes(path: string): number | undefined {\n\ttry {\n\t\treturn statSync(path).size;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nexport function removePartialDownload(path: string): void {\n\ttry {\n\t\trmSync(path, { force: true });\n\t} catch {\n\t\t// best-effort cleanup\n\t}\n}\n\n/** Wait for a failed pipeline's file descriptor to close before deleting its partial output. */\nexport function waitForWritableClosed(stream: Writable & { closed?: boolean }): Promise<void> {\n\tif (stream.closed) return Promise.resolve();\n\treturn new Promise((resolve) => {\n\t\tstream.once(\"close\", resolve);\n\t\tstream.destroy();\n\t});\n}\n\n/** Stream a runtime payload to disk, closing and deleting partial output on any failure. */\nexport async function writeRuntimeDownload(\n\tinput: Readable,\n\tdestPath: string,\n\ttransform?: Transform,\n): Promise<{ ok: true } | { ok: false; error: string }> {\n\tconst writeStream = createWriteStream(destPath);\n\ttry {\n\t\tif (transform) await pipeline(input, transform, writeStream);\n\t\telse await pipeline(input, writeStream);\n\t\treturn { ok: true };\n\t} catch (error) {\n\t\tawait waitForWritableClosed(writeStream);\n\t\tremovePartialDownload(destPath);\n\t\treturn { ok: false, error: `download-fail: ${error instanceof Error ? error.message : String(error)}` };\n\t}\n}\n\nexport function requireRuntimeStdin(proc: ChildProcess, label: string): Writable {\n\tif (!proc.stdin) throw new Error(`${label}: no stdin pipe`);\n\treturn proc.stdin;\n}\n\nexport interface ExtractZipArchiveOptions {\n\tinput: Readable;\n\tdestDir: string;\n\ttempPrefix: string;\n\tplatform: () => string;\n\thasCommand: (command: string) => boolean;\n\ttimeoutMs: number;\n\tkillGraceMs: number;\n}\n\n/** Shared seekable-file extraction path for managed runtime zip archives. */\nexport async function extractZipArchive(options: ExtractZipArchiveOptions): Promise<{ ok: boolean; error?: string }> {\n\tconst zipPath = join(options.destDir, \"..\", `${options.tempPrefix}-${process.pid}-${Date.now()}.zip`);\n\ttry {\n\t\tawait pipeline(options.input, createWriteStream(zipPath));\n\t\tconst extractCommand = options.platform() === \"win32\" && options.hasCommand(\"tar\") ? \"tar\" : \"unzip\";\n\t\tconst args =\n\t\t\textractCommand === \"tar\" ? [\"-xf\", zipPath, \"-C\", options.destDir] : [\"-q\", zipPath, \"-d\", options.destDir];\n\t\tconst proc = spawnProcess(extractCommand, args, {\n\t\t\tdetached: process.platform !== \"win32\",\n\t\t\tstdio: \"ignore\",\n\t\t});\n\t\tconst terminal = await waitForChildProcessWithTermination(proc, {\n\t\t\ttimeoutMs: options.timeoutMs,\n\t\t\tkillGraceMs: options.killGraceMs,\n\t\t});\n\t\tif (terminal.reason === \"timeout\" || terminal.code !== 0) {\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\terror:\n\t\t\t\t\tterminal.reason === \"timeout\"\n\t\t\t\t\t\t? `extract-fail: ${extractCommand} timed out after ${options.timeoutMs}ms`\n\t\t\t\t\t\t: `extract-fail: ${extractCommand} exited with code ${terminal.code ?? \"unknown\"}`,\n\t\t\t};\n\t\t}\n\t\treturn { ok: true };\n\t} finally {\n\t\tremovePartialDownload(zipPath);\n\t}\n}\n"]}
@@ -471,6 +471,8 @@ async function startWorkerBranch(config, initialParentPid, now) {
471
471
  let timer;
472
472
  let ticking = false;
473
473
  let preserveResumableOnExit = false;
474
+ let stopTask;
475
+ const generationStartedAt = entry.startedAt;
474
476
  const closeOnExit = (code = null) => {
475
477
  if (preserveResumableOnExit)
476
478
  return;
@@ -484,17 +486,44 @@ async function startWorkerBranch(config, initialParentPid, now) {
484
486
  }
485
487
  };
486
488
  process.once("exit", closeOnExit);
487
- const stop = () => {
489
+ const closeWorker = async () => {
488
490
  if (stopped)
489
491
  return;
490
492
  stopped = true;
491
493
  if (timer)
492
494
  clearInterval(timer);
493
495
  timer = undefined;
494
- if (!preserveResumableOnExit)
495
- closeOnExit();
496
+ if (!preserveResumableOnExit) {
497
+ // Normal runtime shutdown can await the lock and Windows rename retry policy. Keep the
498
+ // synchronous exit hook only as a last-chance process-exit fallback: using it here made a
499
+ // transient lock collision leave cooperative cleanup permanently in `winding_down`.
500
+ for (let attempt = 0; attempt < 3; attempt++) {
501
+ const expected = entry;
502
+ const terminal = markTerminal(expected, { code: null, signal: null }, nowIso(now));
503
+ try {
504
+ if (await writeEntryIfUnchanged(config.agentDir, expected.entryId, expected, terminal)) {
505
+ entry = terminal;
506
+ break;
507
+ }
508
+ const current = await readEntry(config.agentDir, expected.entryId);
509
+ if (current?.pid !== process.pid || current.startedAt !== generationStartedAt) {
510
+ config.onDiagnostic?.("process-matrix: worker entry ownership moved to a newer process generation");
511
+ break;
512
+ }
513
+ entry = current;
514
+ }
515
+ catch (error) {
516
+ config.onDiagnostic?.(`process-matrix: failed to persist worker terminal state: ${describeError(error)}`);
517
+ break;
518
+ }
519
+ }
520
+ }
496
521
  process.off("exit", closeOnExit);
497
522
  };
523
+ const stop = () => {
524
+ stopTask ??= closeWorker();
525
+ return stopTask;
526
+ };
498
527
  const persist = async (expected, next, failureContext) => {
499
528
  try {
500
529
  if (await writeEntryIfUnchanged(config.agentDir, expected.entryId, expected, next)) {
@@ -518,6 +547,14 @@ async function startWorkerBranch(config, initialParentPid, now) {
518
547
  }
519
548
  return false;
520
549
  };
550
+ const completeCooperativeCleanup = async (fresh) => {
551
+ if (!(await persist(fresh, beginWindDown(fresh, "user_cleanup", nowIso(now)), "failed to write a master-requested worker wind-down")))
552
+ return;
553
+ preserveResumableOnExit = false;
554
+ emitRuntimeNotice(config, "process-matrix: the parent session requested a cooperative cleanup. Winding down.");
555
+ await stop();
556
+ config.requestExit();
557
+ };
521
558
  const startHealthyWatch = () => {
522
559
  timer = setInterval(() => {
523
560
  if (ticking)
@@ -558,11 +595,7 @@ async function startWorkerBranch(config, initialParentPid, now) {
558
595
  const directive = pollWorkerDirective(fresh, currentParentPid, { isPidAlive: config.isProcessAlive });
559
596
  if (directive.code !== "user_cleanup")
560
597
  return;
561
- if (!(await persist(fresh, beginWindDown(fresh, "user_cleanup", nowIso(now)), "failed to write a master-requested worker wind-down")))
562
- return;
563
- emitRuntimeNotice(config, "process-matrix: the parent session requested a cooperative cleanup. Winding down.");
564
- stop();
565
- config.requestExit();
598
+ await completeCooperativeCleanup(fresh);
566
599
  };
567
600
  const enterWindDown = async () => {
568
601
  const windDownAt = nowIso(now);
@@ -617,13 +650,12 @@ async function startWorkerBranch(config, initialParentPid, now) {
617
650
  return;
618
651
  }
619
652
  if (directive.code === "user_cleanup") {
620
- stop();
621
- config.requestExit();
653
+ await completeCooperativeCleanup(fresh);
622
654
  return;
623
655
  }
624
656
  }
625
657
  if (now() >= graceDeadline) {
626
- stop();
658
+ await stop();
627
659
  config.requestExit();
628
660
  }
629
661
  };
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/core/process-matrix/runtime.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Process-matrix runtime composition: the pieces main.ts wires together for durable,\n * restart-surviving master/worker process supervision.\n *\n * Contract:\n * - A WORKER is any process launched with a known parent (`PI_PARENT_PID` -- set by the\n * `--parent-pid` CLI flag, or directly by a launcher such as tmux dispatch). It self-registers\n * its OWN entry (the single writer of that entry during normal operation) and watches its\n * parent's liveness. On parent death it winds down GRACEFULLY -- never silently -- leaving a\n * `resumable` payload, then exits on its own after a bounded grace window (during which it may\n * instead be adopted by a new parent). \"No new turns\" after that point is automatic: a dead\n * parent injects no further follow-ups, so the worker simply runs out of work to do.\n * - A MASTER is everything else (no known parent). On startup it scans the matrix for orphaned\n * workers (workers whose recorded parent is dead). Workers owned by this exact resumed session\n * are restored automatically; foreign workers remain owner-gated interactively and report-only\n * headlessly.\n *\n * Sanctioned exceptions to \"a worker's entry is written only by that worker\": an exact resumed\n * parent may restore its recorded ownership, and an owner may explicitly approve adoption or\n * cooperative cleanup of a foreign orphan. The worker later confirms/applies the directive via\n * `pollWorkerDirective` and re-writes its own entry -- see `docs/process-matrix.md`. Outside these\n * identity/approval-fenced handshakes, a master NEVER writes another session's entry, and nothing\n * here ever kills a process directly.\n */\n\nimport { hostname as osHostname } from \"node:os\";\nimport { isAgentIdentity } from \"../orchestration/agent-resume.ts\";\nimport type { AgentIdentityContract } from \"../orchestration/contracts.ts\";\nimport { getParentPid, getParentSessionId, getProcessTaskRef } from \"../process-identity.ts\";\nimport type { ResolvedProcessMatrixSettings } from \"../settings-manager.ts\";\nimport { getBoundWorktreeLaneKey } from \"../worktree-sync/runtime.ts\";\nimport type { ProcessMatrixEntry, ResumablePayload } from \"./codes.ts\";\nimport {\n\tbuildEntryId,\n\tlistEntries,\n\treadEntry,\n\tremoveEntryIfUnchanged,\n\twriteEntry,\n\twriteEntryIfUnchanged,\n\twriteEntryIfUnchangedSync,\n} from \"./store.ts\";\nimport {\n\tapplyAdoption,\n\tapplyHeartbeat,\n\tbeginWindDown,\n\tbuildMasterEntry,\n\tbuildWorkerEntry,\n\tdetectOrphanedWorkers,\n\tmarkClosed,\n\tmarkResumable,\n\tmarkTerminal,\n\tmarkTerminalNotificationDelivered,\n\tpollWorkerDirective,\n\treconcileMatrix,\n} from \"./supervisor.ts\";\n\nexport {\n\tgetOrchestrationAgentId,\n\tgetParentPid,\n\tgetParentSessionId,\n\tgetProcessTaskRef,\n\tPI_ORCHESTRATION_AGENT_ID_ENV,\n\tPI_PARENT_PID_ENV,\n\tPI_PARENT_SESSION_ENV,\n\tPI_TASK_REF_ENV,\n} from \"../process-identity.ts\";\n\nexport interface ProcessMatrixRuntimeConfig {\n\tagentDir: string;\n\t/** Canonical logical identity for this process and any exact-session resume. */\n\tagent: AgentIdentityContract;\n\t/** Whether an interactive UI is available to ask the owner (see `promptConfirm`). */\n\thasUI: boolean;\n\tsettings: ResolvedProcessMatrixSettings;\n\tisProcessAlive: (pid: number) => boolean;\n\tnow?: () => number;\n\t/** Structural notice injection into the running session (host `sendCustomMessage` seam). */\n\tnotify: (text: string) => void | Promise<void>;\n\t/** Diagnostics sink (never throws into the session). */\n\tonDiagnostic?: (message: string) => void;\n\t/** The ask seam: resolves false on decline AND on any non-interactive/non-TTY caller. */\n\tpromptConfirm: (message: string) => Promise<boolean>;\n\t/** Cooperative self-exit -- called by a worker once wound down (grace expiry or a\n\t * master-granted cleanup directive). Never called for the master's own lifecycle. */\n\trequestExit: () => void;\n\t/** Stable goal/task identity. Automatic recovery requires an exact match. */\n\ttaskRef?: string;\n\ttaskSummary?: string;\n\t/** False for terminal/blocked owner state; recovery then remains explicit-owner gated. */\n\tallowAutomaticRecovery?: boolean;\n\t/** Starts a replacement OS process for a dead resumable worker. Completion is an event-driven\n\t * terminal signal; worker product remains in its persisted session/artifacts. */\n\tresumeWorker?: (payload: ResumablePayload) => Promise<ResumeWorkerLaunchOutcome>;\n}\n\nexport type ResumeWorkerLaunchOutcome =\n\t| {\n\t\t\tstarted: true;\n\t\t\t/** OS identity of this specific replacement process, used to fence its terminal handoff. */\n\t\t\tpid: number;\n\t\t\tcompletion: Promise<{ code: number | null; signal: NodeJS.Signals | null }>;\n\t }\n\t| { started: false; reason: string };\n\nexport interface ProcessMatrixRuntimeHandle {\n\tstop(): Promise<void> | void;\n}\n\nconst NOOP_HANDLE: ProcessMatrixRuntimeHandle = { stop: () => {} };\nexport const PROCESS_MATRIX_RESUMABLE_RETENTION_MS = 30 * 24 * 60 * 60_000;\n\nfunction describeError(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error);\n}\n\nfunction nowIso(now: () => number): string {\n\treturn new Date(now()).toISOString();\n}\n\nfunction emitRuntimeNotice(config: ProcessMatrixRuntimeConfig, text: string): void {\n\ttry {\n\t\tvoid Promise.resolve(config.notify(text)).catch((error: unknown) => {\n\t\t\tconfig.onDiagnostic?.(`process-matrix: failed to notify session: ${describeError(error)}`);\n\t\t});\n\t} catch (error) {\n\t\tconfig.onDiagnostic?.(`process-matrix: failed to notify session: ${describeError(error)}`);\n\t}\n}\n\n/**\n * Start the per-session process-matrix runtime. No-op when disabled (byte-identical to not\n * calling this at all). Never throws: a broken store must surface as a diagnostic, not a startup\n * crash.\n */\nexport async function startProcessMatrixRuntime(\n\tconfig: ProcessMatrixRuntimeConfig,\n): Promise<ProcessMatrixRuntimeHandle> {\n\tif (!config.settings.enabled) return NOOP_HANDLE;\n\tconst now = config.now ?? Date.now;\n\tconst parentPid = getParentPid();\n\n\ttry {\n\t\tif (!isAgentIdentity(config.agent)) throw new TypeError(\"Process-matrix agent identity is invalid.\");\n\t\tif (parentPid !== undefined) {\n\t\t\treturn await startWorkerBranch(config, parentPid, now);\n\t\t}\n\t\treturn await startMasterBranch(config, now);\n\t} catch (error) {\n\t\tconfig.onDiagnostic?.(`process-matrix: runtime failed to start: ${describeError(error)}`);\n\t\treturn NOOP_HANDLE;\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Master branch\n// ---------------------------------------------------------------------------\n\nasync function startMasterBranch(\n\tconfig: ProcessMatrixRuntimeConfig,\n\tnow: () => number,\n): Promise<ProcessMatrixRuntimeHandle> {\n\tlet entry = buildMasterEntry({\n\t\tagent: config.agent,\n\t\tpid: process.pid,\n\t\thostname: osHostname(),\n\t\tnow: nowIso(now),\n\t});\n\ttry {\n\t\tawait writeEntry(config.agentDir, entry);\n\t} catch (error) {\n\t\tconfig.onDiagnostic?.(`process-matrix: failed to register master entry: ${describeError(error)}`);\n\t}\n\n\tlet stopped = false;\n\tlet ownsEntry = true;\n\tlet heartbeatTask: Promise<void> | undefined;\n\tconst lifetime = new AbortController();\n\tconst heartbeatTimer = setInterval(() => {\n\t\tif (stopped || !ownsEntry || heartbeatTask) return;\n\t\tconst expected = entry;\n\t\tconst next = applyHeartbeat(expected, nowIso(now));\n\t\theartbeatTask = writeEntryIfUnchanged(config.agentDir, expected.entryId, expected, next)\n\t\t\t.then((written) => {\n\t\t\t\tif (written) {\n\t\t\t\t\tentry = next;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\townsEntry = false;\n\t\t\t\tlifetime.abort();\n\t\t\t\tclearInterval(heartbeatTimer);\n\t\t\t\tprocess.off(\"exit\", closeOnExit);\n\t\t\t\tconfig.onDiagnostic?.(\"process-matrix: master entry ownership moved to a newer process generation\");\n\t\t\t})\n\t\t\t.catch((error: unknown) => {\n\t\t\t\tconfig.onDiagnostic?.(`process-matrix: failed to write master heartbeat: ${describeError(error)}`);\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\theartbeatTask = undefined;\n\t\t\t});\n\t}, config.settings.heartbeatMs);\n\theartbeatTimer.unref?.();\n\n\t// Best-effort close on process exit. A SIGKILLed master leaving \"running\" is fine -- reconcile's\n\t// own dead-pid detection covers it; this only makes the common clean-exit case tidy.\n\tconst closeOnExit = (): void => {\n\t\tif (!ownsEntry) return;\n\t\ttry {\n\t\t\tconst closed = markClosed(entry, nowIso(now));\n\t\t\tif (writeEntryIfUnchangedSync(config.agentDir, entry, closed)) entry = closed;\n\t\t} catch {\n\t\t\t// Best-effort only -- see module doc.\n\t\t}\n\t};\n\tprocess.once(\"exit\", closeOnExit);\n\n\tconst maintenance = reconcileAndRunOrphanScan(config, now, lifetime.signal).catch((error: unknown) => {\n\t\tconfig.onDiagnostic?.(`process-matrix: maintenance failed: ${describeError(error)}`);\n\t});\n\n\treturn {\n\t\tasync stop() {\n\t\t\tif (stopped) return;\n\t\t\tstopped = true;\n\t\t\tlifetime.abort();\n\t\t\tclearInterval(heartbeatTimer);\n\t\t\tprocess.off(\"exit\", closeOnExit);\n\t\t\tawait heartbeatTask;\n\t\t\tif (ownsEntry) {\n\t\t\t\tconst closed = markClosed(entry, nowIso(now));\n\t\t\t\tif (await writeEntryIfUnchanged(config.agentDir, entry.entryId, entry, closed)) entry = closed;\n\t\t\t}\n\t\t\tawait maintenance;\n\t\t},\n\t};\n}\n\nasync function reconcileAndRunOrphanScan(\n\tconfig: ProcessMatrixRuntimeConfig,\n\tnow: () => number,\n\tsignal: AbortSignal,\n): Promise<void> {\n\tlet entries: ProcessMatrixEntry[];\n\ttry {\n\t\tentries = await listEntries(config.agentDir);\n\t} catch (error) {\n\t\tconfig.onDiagnostic?.(`process-matrix: reconciliation failed to list entries: ${describeError(error)}`);\n\t\treturn;\n\t}\n\tif (signal.aborted) return;\n\tconst reconciled = reconcileMatrix(entries, {\n\t\tisPidAlive: (pid) => pid === process.pid || config.isProcessAlive(pid),\n\t\tnow: now(),\n\t\tresumableTtlMs: PROCESS_MATRIX_RESUMABLE_RETENTION_MS,\n\t});\n\tconst originalByEntryId = new Map(entries.map((entry) => [entry.entryId, entry]));\n\tconst recoveredEntryIdSet = new Set(reconciled.recoveredEntryIds);\n\tconst [prunedOutcomes, recoveredOutcomes] = await Promise.all([\n\t\tPromise.all(\n\t\t\treconciled.prunedEntryIds.map((entryId) => {\n\t\t\t\tconst original = originalByEntryId.get(entryId);\n\t\t\t\treturn original ? removeEntryIfUnchanged(config.agentDir, original) : false;\n\t\t\t}),\n\t\t),\n\t\tPromise.all(\n\t\t\treconciled.kept\n\t\t\t\t.filter((entry) => recoveredEntryIdSet.has(entry.entryId))\n\t\t\t\t.map((entry) => {\n\t\t\t\t\tconst original = originalByEntryId.get(entry.entryId);\n\t\t\t\t\treturn original ? writeEntryIfUnchanged(config.agentDir, entry.entryId, original, entry) : false;\n\t\t\t\t}),\n\t\t),\n\t]);\n\tif (signal.aborted) return;\n\tconst recoveredCount = recoveredOutcomes.filter(Boolean).length;\n\tconst prunedCount = prunedOutcomes.filter(Boolean).length;\n\tif (recoveredCount > 0) {\n\t\tconfig.onDiagnostic?.(\n\t\t\t`process-matrix: recovered ${recoveredCount} interrupted Pi worker entr${recoveredCount === 1 ? \"y\" : \"ies\"}`,\n\t\t);\n\t}\n\tif (prunedCount > 0) {\n\t\tconfig.onDiagnostic?.(\n\t\t\t`process-matrix: pruned ${prunedCount} terminal or expired entr${prunedCount === 1 ? \"y\" : \"ies\"}`,\n\t\t);\n\t}\n\tconst currentEntries = await listEntries(config.agentDir);\n\tawait deliverTerminalNotifications(config, currentEntries, now, signal);\n\tif (signal.aborted) return;\n\tawait runOrphanScan(config, currentEntries, now, signal);\n}\n\nasync function deliverTerminalNotifications(\n\tconfig: ProcessMatrixRuntimeConfig,\n\tentries: ProcessMatrixEntry[],\n\tnow: () => number,\n\tsignal: AbortSignal,\n): Promise<void> {\n\tfor (const entry of entries) {\n\t\tif (\n\t\t\tsignal.aborted ||\n\t\t\tentry.status !== \"closed\" ||\n\t\t\t!entry.terminal ||\n\t\t\tentry.terminal.notificationDeliveredAt ||\n\t\t\tentry.parentSessionId !== config.agent.resumeContext.sessionId\n\t\t)\n\t\t\tcontinue;\n\t\ttry {\n\t\t\tawait config.notify(formatTerminalNotification(entry));\n\t\t\tif (signal.aborted) return;\n\t\t} catch (error) {\n\t\t\tconfig.onDiagnostic?.(\n\t\t\t\t`process-matrix: failed to deliver terminal handoff for ${entry.entryId}: ${describeError(error)}`,\n\t\t\t);\n\t\t\tcontinue;\n\t\t}\n\t\ttry {\n\t\t\tconst delivered = markTerminalNotificationDelivered(entry, nowIso(now));\n\t\t\tif (!(await writeEntryIfUnchanged(config.agentDir, entry.entryId, entry, delivered))) {\n\t\t\t\tconfig.onDiagnostic?.(\n\t\t\t\t\t`process-matrix: terminal handoff changed before acknowledgement for ${entry.entryId}`,\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconfig.onDiagnostic?.(\n\t\t\t\t`process-matrix: failed to acknowledge terminal handoff for ${entry.entryId}: ${describeError(error)}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\nfunction formatTerminalNotification(entry: ProcessMatrixEntry): string {\n\tconst terminal = entry.terminal;\n\treturn `process-matrix: resumed agent ${entry.agent.agentId} reached a terminal process state (code ${terminal?.code ?? \"none\"}, signal ${terminal?.signal ?? \"none\"}). Inspect its persisted result before continuing.`;\n}\n\nasync function runOrphanScan(\n\tconfig: ProcessMatrixRuntimeConfig,\n\tentries: ProcessMatrixEntry[],\n\tnow: () => number,\n\tsignal: AbortSignal,\n): Promise<void> {\n\tconst orphans = detectOrphanedWorkers(entries, {\n\t\tisPidAlive: config.isProcessAlive,\n\t\townSessionId: config.agent.resumeContext.sessionId,\n\t});\n\tif (orphans.length === 0) return;\n\n\tfor (const orphan of orphans) {\n\t\tif (signal.aborted) return;\n\t\tconst recoveryBoundary = getAutomaticRecoveryBoundary(config, orphan);\n\t\tconst exactResumedParent = recoveryBoundary === undefined;\n\t\tif (!config.isProcessAlive(orphan.pid)) {\n\t\t\tif (!exactResumedParent) {\n\t\t\t\tif (!config.hasUI) {\n\t\t\t\t\treportOwnerGatedOrphan(config, orphan, recoveryBoundary);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst payload = orphan.resumable;\n\t\t\t\tif (!payload) {\n\t\t\t\t\tconfig.onDiagnostic?.(\n\t\t\t\t\t\t`process-matrix: dead worker ${orphan.entryId} is not resumable because its launch context is unavailable`,\n\t\t\t\t\t);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst resume = await config.promptConfirm(\n\t\t\t\t\t`resume agent ${payload.agent.agentId} from its persisted session?`,\n\t\t\t\t);\n\t\t\t\tif (!resume || signal.aborted) continue;\n\t\t\t}\n\t\t\tawait resumeDeadOrphan(config, orphan, signal);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (exactResumedParent) {\n\t\t\tawait adoptLiveOrphan(config, orphan, signal);\n\t\t\tcontinue;\n\t\t}\n\t\tif (!config.hasUI) {\n\t\t\treportOwnerGatedOrphan(config, orphan, recoveryBoundary);\n\t\t\tcontinue;\n\t\t}\n\t\tconst adopt = await config.promptConfirm(\n\t\t\t`adopt worker ${orphan.entryId} (lane ${orphan.agent.resumeContext.worktreeLaneKey ?? \"none\"})?`,\n\t\t);\n\t\tif (signal.aborted) return;\n\t\tif (adopt) {\n\t\t\tawait adoptLiveOrphan(config, orphan, signal);\n\t\t\tcontinue;\n\t\t}\n\t\tconst cleanup = await config.promptConfirm(`clean up worker ${orphan.entryId} gracefully?`);\n\t\tif (!cleanup || signal.aborted) continue;\n\t\tconst windingDown = beginWindDown(orphan, \"user_cleanup\", nowIso(now));\n\t\ttry {\n\t\t\tif (!(await writeEntryIfUnchanged(config.agentDir, orphan.entryId, orphan, windingDown))) {\n\t\t\t\tconfig.onDiagnostic?.(`process-matrix: cleanup skipped because ${orphan.entryId} changed`);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconfig.onDiagnostic?.(\n\t\t\t\t`process-matrix: failed to write cleanup for ${orphan.entryId}: ${describeError(error)}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\nfunction getAutomaticRecoveryBoundary(\n\tconfig: ProcessMatrixRuntimeConfig,\n\torphan: ProcessMatrixEntry,\n): string | undefined {\n\tif (orphan.parentSessionId !== config.agent.resumeContext.sessionId) return \"foreign parent session\";\n\tconst entryTaskRef = orphan.taskRef;\n\tconst payloadTaskRef = orphan.resumable?.taskRef;\n\tif (entryTaskRef !== undefined && payloadTaskRef !== undefined && entryTaskRef !== payloadTaskRef) {\n\t\treturn \"inconsistent persisted task identity\";\n\t}\n\tif ((payloadTaskRef ?? entryTaskRef) !== config.taskRef) return \"task identity does not match the current goal\";\n\tif (config.allowAutomaticRecovery === false) return \"current goal state does not permit automatic recovery\";\n\treturn undefined;\n}\n\nfunction reportOwnerGatedOrphan(config: ProcessMatrixRuntimeConfig, orphan: ProcessMatrixEntry, reason: string): void {\n\tconfig.onDiagnostic?.(\n\t\t`process-matrix: found owner-gated orphan ${orphan.entryId} (${reason}; report-only, non-interactive; nothing written, nothing killed)`,\n\t);\n}\n\nasync function adoptLiveOrphan(\n\tconfig: ProcessMatrixRuntimeConfig,\n\torphan: ProcessMatrixEntry,\n\tsignal: AbortSignal,\n): Promise<void> {\n\tif (signal.aborted) return;\n\tconst adopted = applyAdoption(orphan, {\n\t\tparentPid: process.pid,\n\t\tparentSessionId: config.agent.resumeContext.sessionId,\n\t});\n\ttry {\n\t\tif (!(await writeEntryIfUnchanged(config.agentDir, orphan.entryId, orphan, adopted))) return;\n\t\tif (signal.aborted) await writeEntryIfUnchanged(config.agentDir, orphan.entryId, adopted, orphan);\n\t} catch (error) {\n\t\tconfig.onDiagnostic?.(`process-matrix: failed to write adoption for ${orphan.entryId}: ${describeError(error)}`);\n\t}\n}\n\nasync function resumeDeadOrphan(\n\tconfig: ProcessMatrixRuntimeConfig,\n\torphan: ProcessMatrixEntry,\n\tsignal: AbortSignal,\n): Promise<void> {\n\tif (signal.aborted) return;\n\tconst payload = orphan.resumable;\n\tif (!payload || !config.resumeWorker) {\n\t\tconfig.onDiagnostic?.(\n\t\t\t`process-matrix: dead worker ${orphan.entryId} is not resumable because its launch context or resume launcher is unavailable`,\n\t\t);\n\t\treturn;\n\t}\n\tconst claimed = applyAdoption(orphan, {\n\t\tparentPid: process.pid,\n\t\tparentSessionId: config.agent.resumeContext.sessionId,\n\t});\n\tlet launched: Extract<ResumeWorkerLaunchOutcome, { started: true }>;\n\ttry {\n\t\tif (!(await writeEntryIfUnchanged(config.agentDir, orphan.entryId, orphan, claimed))) return;\n\t\tif (signal.aborted) {\n\t\t\tawait writeEntryIfUnchanged(config.agentDir, orphan.entryId, claimed, orphan);\n\t\t\treturn;\n\t\t}\n\t\tconst launchOutcome = await config.resumeWorker(payload);\n\t\tif (!launchOutcome.started) {\n\t\t\tawait writeEntryIfUnchanged(config.agentDir, orphan.entryId, claimed, orphan);\n\t\t\tconfig.onDiagnostic?.(`process-matrix: failed to resume ${orphan.entryId}: ${launchOutcome.reason}`);\n\t\t\treturn;\n\t\t}\n\t\tlaunched = launchOutcome;\n\t} catch (error) {\n\t\ttry {\n\t\t\tawait writeEntryIfUnchanged(config.agentDir, orphan.entryId, claimed, orphan);\n\t\t} catch {\n\t\t\t// The original resumable record remains the intended recovery state.\n\t\t}\n\t\tconfig.onDiagnostic?.(`process-matrix: failed to resume ${orphan.entryId}: ${describeError(error)}`);\n\t\treturn;\n\t}\n\tconst launchedEntry = { ...claimed, pid: launched.pid };\n\tif (!signal.aborted) {\n\t\ttry {\n\t\t\t// Bridge the interval before the replacement can self-register. Without its real PID here, a\n\t\t\t// restarted master can mistake this live replacement for the original dead process and spawn\n\t\t\t// a duplicate.\n\t\t\tawait writeEntryIfUnchanged(config.agentDir, claimed.entryId, claimed, launchedEntry);\n\t\t} catch (error) {\n\t\t\tconfig.onDiagnostic?.(\n\t\t\t\t`process-matrix: failed to record resumed worker pid for ${orphan.entryId}: ${describeError(error)}`,\n\t\t\t);\n\t\t}\n\t} else {\n\t\tconfig.onDiagnostic?.(\n\t\t\t`process-matrix: resumed worker ${orphan.entryId} launched after owner shutdown; preserving its terminal handoff only`,\n\t\t);\n\t}\n\tvoid launched.completion.then(\n\t\t(result) => persistResumedWorkerTerminal(config, launchedEntry, claimed, result, signal),\n\t\t(error: unknown) => {\n\t\t\tconfig.onDiagnostic?.(\n\t\t\t\t`process-matrix: resumed agent ${payload.agent.agentId} terminal signal failed: ${describeError(error)}`,\n\t\t\t);\n\t\t},\n\t);\n}\n\nasync function persistResumedWorkerTerminal(\n\tconfig: ProcessMatrixRuntimeConfig,\n\tclaimed: ProcessMatrixEntry,\n\tpreLaunchClaim: ProcessMatrixEntry,\n\tresult: { code: number | null; signal: NodeJS.Signals | null },\n\tlifetime: AbortSignal,\n): Promise<void> {\n\ttry {\n\t\tconst observedAt = new Date().toISOString();\n\t\tconst terminal = markTerminal(claimed, result, observedAt);\n\t\tif (await writeEntryIfUnchanged(config.agentDir, claimed.entryId, claimed, terminal)) {\n\t\t\tif (lifetime.aborted) return;\n\t\t\tawait notifyResumedWorkerTerminal(config, terminal, lifetime);\n\t\t\treturn;\n\t\t}\n\t\tconst selfRegistered = await readEntry(config.agentDir, claimed.entryId);\n\t\tif (selfRegistered?.pid === claimed.pid) {\n\t\t\tconst registeredTerminal = markTerminal(selfRegistered, result, observedAt);\n\t\t\tif (await writeEntryIfUnchanged(config.agentDir, claimed.entryId, selfRegistered, registeredTerminal)) {\n\t\t\t\tif (lifetime.aborted) return;\n\t\t\t\tawait notifyResumedWorkerTerminal(config, registeredTerminal, lifetime);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t// If recording the spawned PID failed (or shutdown won the race immediately after spawn), the\n\t\t// untouched pre-launch claim proves no newer process has taken this logical entry. Upgrade it\n\t\t// to the actual exited process before persisting its terminal handoff.\n\t\tconst fallbackTerminal = markTerminal({ ...preLaunchClaim, pid: claimed.pid }, result, observedAt);\n\t\tif (await writeEntryIfUnchanged(config.agentDir, claimed.entryId, preLaunchClaim, fallbackTerminal)) {\n\t\t\tif (lifetime.aborted) return;\n\t\t\tawait notifyResumedWorkerTerminal(config, fallbackTerminal, lifetime);\n\t\t\treturn;\n\t\t}\n\t\tif (await writeEntryIfUnchanged(config.agentDir, claimed.entryId, undefined, terminal)) {\n\t\t\tif (lifetime.aborted) return;\n\t\t\tawait notifyResumedWorkerTerminal(config, terminal, lifetime);\n\t\t\treturn;\n\t\t}\n\t\tconfig.onDiagnostic?.(`process-matrix: ignored stale terminal handoff for ${claimed.entryId}`);\n\t} catch (error) {\n\t\tconfig.onDiagnostic?.(\n\t\t\t`process-matrix: failed to persist terminal handoff for ${claimed.entryId}: ${describeError(error)}`,\n\t\t);\n\t}\n}\n\nasync function notifyResumedWorkerTerminal(\n\tconfig: ProcessMatrixRuntimeConfig,\n\tterminal: ProcessMatrixEntry,\n\tlifetime: AbortSignal,\n): Promise<void> {\n\tif (lifetime.aborted) return;\n\ttry {\n\t\tawait config.notify(formatTerminalNotification(terminal));\n\t\tif (lifetime.aborted) return;\n\t\tconst delivered = markTerminalNotificationDelivered(terminal, new Date().toISOString());\n\t\tif (!(await writeEntryIfUnchanged(config.agentDir, terminal.entryId, terminal, delivered))) {\n\t\t\tconfig.onDiagnostic?.(\n\t\t\t\t`process-matrix: terminal handoff changed before acknowledgement for ${terminal.entryId}`,\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\tconfig.onDiagnostic?.(\n\t\t\t`process-matrix: failed to deliver terminal handoff for ${terminal.entryId}: ${describeError(error)}`,\n\t\t);\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Worker branch\n// ---------------------------------------------------------------------------\n\nasync function startWorkerBranch(\n\tconfig: ProcessMatrixRuntimeConfig,\n\tinitialParentPid: number,\n\tnow: () => number,\n): Promise<ProcessMatrixRuntimeHandle> {\n\tconst parentSessionId = getParentSessionId();\n\tconst taskRef = (getProcessTaskRef() ?? config.taskRef)?.trim().slice(0, 512) || undefined;\n\tconst taskSummary = config.taskSummary?.trim().slice(0, 2_000) || undefined;\n\tconst laneKey = getBoundWorktreeLaneKey();\n\tconst contextLaneKey = config.agent.resumeContext.worktreeLaneKey;\n\tif (laneKey !== contextLaneKey) {\n\t\tthrow new TypeError(\n\t\t\t`Process-matrix agent lane '${contextLaneKey ?? \"none\"}' does not match active lane '${laneKey ?? \"none\"}'.`,\n\t\t);\n\t}\n\n\tlet entry = buildWorkerEntry({\n\t\tagent: config.agent,\n\t\tpid: process.pid,\n\t\thostname: osHostname(),\n\t\tnow: nowIso(now),\n\t\tparentPid: initialParentPid,\n\t\t...(parentSessionId !== undefined ? { parentSessionId } : {}),\n\t\t...(taskRef !== undefined ? { taskRef } : {}),\n\t\t...(taskSummary !== undefined ? { taskSummary } : {}),\n\t});\n\ttry {\n\t\tawait writeEntry(config.agentDir, entry);\n\t} catch (error) {\n\t\tconfig.onDiagnostic?.(`process-matrix: failed to register worker entry: ${describeError(error)}`);\n\t}\n\n\tlet currentParentPid = initialParentPid;\n\tlet currentParentSessionId = parentSessionId;\n\tlet stopped = false;\n\tlet timer: NodeJS.Timeout | undefined;\n\tlet ticking = false;\n\tlet preserveResumableOnExit = false;\n\tconst closeOnExit = (code: number | null = null): void => {\n\t\tif (preserveResumableOnExit) return;\n\t\ttry {\n\t\t\tconst terminal = markTerminal(entry, { code, signal: null }, nowIso(now));\n\t\t\tif (writeEntryIfUnchangedSync(config.agentDir, entry, terminal)) entry = terminal;\n\t\t} catch {\n\t\t\t// Best-effort. Dead-pid reconciliation remains authoritative.\n\t\t}\n\t};\n\tprocess.once(\"exit\", closeOnExit);\n\n\tconst stop = (): void => {\n\t\tif (stopped) return;\n\t\tstopped = true;\n\t\tif (timer) clearInterval(timer);\n\t\ttimer = undefined;\n\t\tif (!preserveResumableOnExit) closeOnExit();\n\t\tprocess.off(\"exit\", closeOnExit);\n\t};\n\n\tconst persist = async (\n\t\texpected: ProcessMatrixEntry,\n\t\tnext: ProcessMatrixEntry,\n\t\tfailureContext: string,\n\t): Promise<boolean> => {\n\t\ttry {\n\t\t\tif (await writeEntryIfUnchanged(config.agentDir, expected.entryId, expected, next)) {\n\t\t\t\tentry = next;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tconst current = await readEntry(config.agentDir, expected.entryId);\n\t\t\tif (current?.pid === process.pid) entry = current;\n\t\t\telse {\n\t\t\t\tstopped = true;\n\t\t\t\tif (timer) clearInterval(timer);\n\t\t\t\ttimer = undefined;\n\t\t\t\tprocess.off(\"exit\", closeOnExit);\n\t\t\t\tconfig.onDiagnostic?.(\"process-matrix: worker entry ownership moved to a newer process generation\");\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconfig.onDiagnostic?.(`process-matrix: ${failureContext}: ${describeError(error)}`);\n\t\t}\n\t\treturn false;\n\t};\n\n\tconst startHealthyWatch = (): void => {\n\t\ttimer = setInterval(() => {\n\t\t\tif (ticking) return;\n\t\t\tticking = true;\n\t\t\tvoid healthyTick().finally(() => {\n\t\t\t\tticking = false;\n\t\t\t});\n\t\t}, config.settings.watcherPollMs);\n\t\ttimer.unref?.();\n\t};\n\n\tconst declaredParentIsAlive = async (): Promise<boolean> => {\n\t\t// PID liveness alone is not process identity: a reused PID could otherwise keep a worker\n\t\t// attached to an unrelated process forever. The parent session's own fresh master entry binds\n\t\t// PID to a durable identity and proves that that exact session is still heartbeating.\n\t\tif (!currentParentSessionId || !config.isProcessAlive(currentParentPid)) return false;\n\t\tconst parent = await readEntry(config.agentDir, buildEntryId(\"master\", currentParentSessionId));\n\t\tif (!parent || parent.role !== \"master\" || parent.agent.resumeContext.sessionId !== currentParentSessionId)\n\t\t\treturn false;\n\t\tif (parent.pid !== currentParentPid || parent.status !== \"running\") return false;\n\t\tconst heartbeatAt = Date.parse(parent.heartbeatAt);\n\t\tconst maxAge = config.settings.heartbeatMs * 2 + config.settings.watcherPollMs;\n\t\treturn Number.isFinite(heartbeatAt) && now() - heartbeatAt <= maxAge;\n\t};\n\n\tconst healthyTick = async (): Promise<void> => {\n\t\tif (stopped) return;\n\t\tif (!(await declaredParentIsAlive())) {\n\t\t\tawait enterWindDown();\n\t\t\treturn;\n\t\t}\n\t\t// Still healthy: also poll for a master-initiated cooperative-cleanup directive.\n\t\tconst fresh = await readEntry(config.agentDir, entry.entryId);\n\t\tif (!fresh) return;\n\t\tconst directive = pollWorkerDirective(fresh, currentParentPid, { isPidAlive: config.isProcessAlive });\n\t\tif (directive.code !== \"user_cleanup\") return;\n\t\tif (\n\t\t\t!(await persist(\n\t\t\t\tfresh,\n\t\t\t\tbeginWindDown(fresh, \"user_cleanup\", nowIso(now)),\n\t\t\t\t\"failed to write a master-requested worker wind-down\",\n\t\t\t))\n\t\t)\n\t\t\treturn;\n\t\temitRuntimeNotice(config, \"process-matrix: the parent session requested a cooperative cleanup. Winding down.\");\n\t\tstop();\n\t\tconfig.requestExit();\n\t};\n\n\tconst enterWindDown = async (): Promise<void> => {\n\t\tconst windDownAt = nowIso(now);\n\t\tconst expected = entry;\n\t\tconst resumable: ResumablePayload = { lastCode: \"resumable\", agent: structuredClone(config.agent) };\n\t\tif (expected.taskRef !== undefined) resumable.taskRef = expected.taskRef;\n\t\tif (expected.taskSummary !== undefined) resumable.taskSummary = expected.taskSummary;\n\t\tconst woundDown = markResumable(beginWindDown(expected, \"parent_lost\", windDownAt), resumable, windDownAt);\n\t\tif (!(await persist(expected, woundDown, \"failed to write worker wind-down\"))) return;\n\t\tif (timer) clearInterval(timer);\n\t\ttimer = undefined;\n\t\tpreserveResumableOnExit = true;\n\t\temitRuntimeNotice(\n\t\t\tconfig,\n\t\t\t`process-matrix: parent process (pid ${currentParentPid}) is gone. Winding down gracefully; this task is resumable.`,\n\t\t);\n\t\tstartGraceWatch();\n\t};\n\n\tconst startGraceWatch = (): void => {\n\t\tconst graceDeadline = now() + config.settings.adoptionGraceMs;\n\t\ttimer = setInterval(() => {\n\t\t\tif (ticking) return;\n\t\t\tticking = true;\n\t\t\tvoid graceTick(graceDeadline).finally(() => {\n\t\t\t\tticking = false;\n\t\t\t});\n\t\t}, config.settings.watcherPollMs);\n\t\ttimer.unref?.();\n\t};\n\n\tconst graceTick = async (graceDeadline: number): Promise<void> => {\n\t\tif (stopped) return;\n\t\tconst fresh = await readEntry(config.agentDir, entry.entryId);\n\t\tif (fresh) {\n\t\t\tconst directive = pollWorkerDirective(fresh, currentParentPid, { isPidAlive: config.isProcessAlive });\n\t\t\tif (directive.code === \"adopt\" && fresh.parentSessionId) {\n\t\t\t\t// The adopting master persists its session id with the pid. Require both on the next\n\t\t\t\t// healthy tick; accepting a pid-only adoption would reintroduce the PID-reuse bug.\n\t\t\t\tif (\n\t\t\t\t\t!(await persist(\n\t\t\t\t\t\tfresh,\n\t\t\t\t\t\tapplyAdoption(fresh, { parentPid: directive.parentPid, parentSessionId: fresh.parentSessionId }),\n\t\t\t\t\t\t\"failed to write worker adoption\",\n\t\t\t\t\t))\n\t\t\t\t)\n\t\t\t\t\treturn;\n\t\t\t\temitRuntimeNotice(\n\t\t\t\t\tconfig,\n\t\t\t\t\t`process-matrix: adopted by a new parent (pid ${directive.parentPid}). Resuming.`,\n\t\t\t\t);\n\t\t\t\tcurrentParentPid = directive.parentPid;\n\t\t\t\tcurrentParentSessionId = fresh.parentSessionId;\n\t\t\t\tpreserveResumableOnExit = false;\n\t\t\t\tif (timer) {\n\t\t\t\t\tclearInterval(timer);\n\t\t\t\t\ttimer = undefined;\n\t\t\t\t}\n\t\t\t\tstartHealthyWatch();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (directive.code === \"user_cleanup\") {\n\t\t\t\tstop();\n\t\t\t\tconfig.requestExit();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tif (now() >= graceDeadline) {\n\t\t\tstop();\n\t\t\tconfig.requestExit();\n\t\t}\n\t};\n\n\tstartHealthyWatch();\n\n\treturn { stop };\n}\n"]}
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/core/process-matrix/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAEnE,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE7F,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAEtE,OAAO,EACN,YAAY,EACZ,WAAW,EACX,SAAS,EACT,sBAAsB,EACtB,UAAU,EACV,qBAAqB,EACrB,yBAAyB,GACzB,MAAM,YAAY,CAAC;AACpB,OAAO,EACN,aAAa,EACb,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,UAAU,EACV,aAAa,EACb,YAAY,EACZ,iCAAiC,EACjC,mBAAmB,EACnB,eAAe,GACf,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACN,uBAAuB,EACvB,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,EACjB,6BAA6B,EAC7B,iBAAiB,EACjB,qBAAqB,EACrB,eAAe,GACf,MAAM,wBAAwB,CAAC;AA2ChC,MAAM,WAAW,GAA+B,EAAE,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC;AACnE,MAAM,CAAC,MAAM,qCAAqC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC;AAE3E,SAAS,aAAa,CAAC,KAAc;IACpC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,MAAM,CAAC,GAAiB;IAChC,OAAO,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AACtC,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAkC,EAAE,IAAY;IAC1E,IAAI,CAAC;QACJ,KAAK,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YAClE,MAAM,CAAC,YAAY,EAAE,CAAC,6CAA6C,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC5F,CAAC,CAAC,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,YAAY,EAAE,CAAC,6CAA6C,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC5F,CAAC;AACF,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC9C,MAAkC;IAElC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO;QAAE,OAAO,WAAW,CAAC;IACjD,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IACnC,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IAEjC,IAAI,CAAC;QACJ,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,SAAS,CAAC,2CAA2C,CAAC,CAAC;QACrG,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC7B,OAAO,MAAM,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,MAAM,iBAAiB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,YAAY,EAAE,CAAC,4CAA4C,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC1F,OAAO,WAAW,CAAC;IACpB,CAAC;AACF,CAAC;AAED,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E,KAAK,UAAU,iBAAiB,CAC/B,MAAkC,EAClC,GAAiB;IAEjB,IAAI,KAAK,GAAG,gBAAgB,CAAC;QAC5B,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,QAAQ,EAAE,UAAU,EAAE;QACtB,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC;KAChB,CAAC,CAAC;IACH,IAAI,CAAC;QACJ,MAAM,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,YAAY,EAAE,CAAC,oDAAoD,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACnG,CAAC;IAED,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,SAAS,GAAG,IAAI,CAAC;IACrB,IAAI,aAAwC,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;IACvC,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;QACvC,IAAI,OAAO,IAAI,CAAC,SAAS,IAAI,aAAa;YAAE,OAAO;QACnD,MAAM,QAAQ,GAAG,KAAK,CAAC;QACvB,MAAM,IAAI,GAAG,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACnD,aAAa,GAAG,qBAAqB,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC;aACtF,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;YACjB,IAAI,OAAO,EAAE,CAAC;gBACb,KAAK,GAAG,IAAI,CAAC;gBACb,OAAO;YACR,CAAC;YACD,SAAS,GAAG,KAAK,CAAC;YAClB,QAAQ,CAAC,KAAK,EAAE,CAAC;YACjB,aAAa,CAAC,cAAc,CAAC,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YACjC,MAAM,CAAC,YAAY,EAAE,CAAC,4EAA4E,CAAC,CAAC;QACrG,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YACzB,MAAM,CAAC,YAAY,EAAE,CAAC,qDAAqD,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpG,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACb,aAAa,GAAG,SAAS,CAAC;QAC3B,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAChC,cAAc,CAAC,KAAK,EAAE,EAAE,CAAC;IAEzB,iGAAiG;IACjG,qFAAqF;IACrF,MAAM,WAAW,GAAG,GAAS,EAAE;QAC9B,IAAI,CAAC,SAAS;YAAE,OAAO;QACvB,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9C,IAAI,yBAAyB,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC;gBAAE,KAAK,GAAG,MAAM,CAAC;QAC/E,CAAC;QAAC,MAAM,CAAC;YACR,sCAAsC;QACvC,CAAC;IACF,CAAC,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAElC,MAAM,WAAW,GAAG,yBAAyB,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QACpG,MAAM,CAAC,YAAY,EAAE,CAAC,uCAAuC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;IAEH,OAAO;QACN,KAAK,CAAC,IAAI;YACT,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,QAAQ,CAAC,KAAK,EAAE,CAAC;YACjB,aAAa,CAAC,cAAc,CAAC,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YACjC,MAAM,aAAa,CAAC;YACpB,IAAI,SAAS,EAAE,CAAC;gBACf,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC9C,IAAI,MAAM,qBAAqB,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC;oBAAE,KAAK,GAAG,MAAM,CAAC;YAChG,CAAC;YACD,MAAM,WAAW,CAAC;QACnB,CAAC;KACD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,yBAAyB,CACvC,MAAkC,EAClC,GAAiB,EACjB,MAAmB;IAEnB,IAAI,OAA6B,CAAC;IAClC,IAAI,CAAC;QACJ,OAAO,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,YAAY,EAAE,CAAC,0DAA0D,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACxG,OAAO;IACR,CAAC;IACD,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO;IAC3B,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,EAAE;QAC3C,UAAU,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,IAAI,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC;QACtE,GAAG,EAAE,GAAG,EAAE;QACV,cAAc,EAAE,qCAAqC;KACrD,CAAC,CAAC;IACH,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAClF,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;IAClE,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC7D,OAAO,CAAC,GAAG,CACV,UAAU,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;YACzC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAChD,OAAO,QAAQ,CAAC,CAAC,CAAC,sBAAsB,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAC7E,CAAC,CAAC,CACF;QACD,OAAO,CAAC,GAAG,CACV,UAAU,CAAC,IAAI;aACb,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;aACzD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACd,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACtD,OAAO,QAAQ,CAAC,CAAC,CAAC,qBAAqB,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAClG,CAAC,CAAC,CACH;KACD,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO;IAC3B,MAAM,cAAc,GAAG,iBAAiB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAChE,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAC1D,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,YAAY,EAAE,CACpB,6BAA6B,cAAc,8BAA8B,cAAc,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAC7G,CAAC;IACH,CAAC;IACD,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,CAAC,YAAY,EAAE,CACpB,0BAA0B,WAAW,4BAA4B,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAClG,CAAC;IACH,CAAC;IACD,MAAM,cAAc,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC1D,MAAM,4BAA4B,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IACxE,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO;IAC3B,MAAM,aAAa,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;AAC1D,CAAC;AAED,KAAK,UAAU,4BAA4B,CAC1C,MAAkC,EAClC,OAA6B,EAC7B,GAAiB,EACjB,MAAmB;IAEnB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC7B,IACC,MAAM,CAAC,OAAO;YACd,KAAK,CAAC,MAAM,KAAK,QAAQ;YACzB,CAAC,KAAK,CAAC,QAAQ;YACf,KAAK,CAAC,QAAQ,CAAC,uBAAuB;YACtC,KAAK,CAAC,eAAe,KAAK,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,SAAS;YAE9D,SAAS;QACV,IAAI,CAAC;YACJ,MAAM,MAAM,CAAC,MAAM,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC,CAAC;YACvD,IAAI,MAAM,CAAC,OAAO;gBAAE,OAAO;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,CAAC,YAAY,EAAE,CACpB,0DAA0D,KAAK,CAAC,OAAO,KAAK,aAAa,CAAC,KAAK,CAAC,EAAE,CAClG,CAAC;YACF,SAAS;QACV,CAAC;QACD,IAAI,CAAC;YACJ,MAAM,SAAS,GAAG,iCAAiC,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YACxE,IAAI,CAAC,CAAC,MAAM,qBAAqB,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;gBACtF,MAAM,CAAC,YAAY,EAAE,CACpB,uEAAuE,KAAK,CAAC,OAAO,EAAE,CACtF,CAAC;YACH,CAAC;QACF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,CAAC,YAAY,EAAE,CACpB,8DAA8D,KAAK,CAAC,OAAO,KAAK,aAAa,CAAC,KAAK,CAAC,EAAE,CACtG,CAAC;QACH,CAAC;IACF,CAAC;AACF,CAAC;AAED,SAAS,0BAA0B,CAAC,KAAyB;IAC5D,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;IAChC,OAAO,iCAAiC,KAAK,CAAC,KAAK,CAAC,OAAO,2CAA2C,QAAQ,EAAE,IAAI,IAAI,MAAM,YAAY,QAAQ,EAAE,MAAM,IAAI,MAAM,oDAAoD,CAAC;AAC1N,CAAC;AAED,KAAK,UAAU,aAAa,CAC3B,MAAkC,EAClC,OAA6B,EAC7B,GAAiB,EACjB,MAAmB;IAEnB,MAAM,OAAO,GAAG,qBAAqB,CAAC,OAAO,EAAE;QAC9C,UAAU,EAAE,MAAM,CAAC,cAAc;QACjC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,SAAS;KAClD,CAAC,CAAC;IACH,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAEjC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC9B,IAAI,MAAM,CAAC,OAAO;YAAE,OAAO;QAC3B,MAAM,gBAAgB,GAAG,4BAA4B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACtE,MAAM,kBAAkB,GAAG,gBAAgB,KAAK,SAAS,CAAC;QAC1D,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACzB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;oBACnB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC;oBACzD,SAAS;gBACV,CAAC;gBACD,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC;gBACjC,IAAI,CAAC,OAAO,EAAE,CAAC;oBACd,MAAM,CAAC,YAAY,EAAE,CACpB,+BAA+B,MAAM,CAAC,OAAO,6DAA6D,CAC1G,CAAC;oBACF,SAAS;gBACV,CAAC;gBACD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CACxC,gBAAgB,OAAO,CAAC,KAAK,CAAC,OAAO,8BAA8B,CACnE,CAAC;gBACF,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO;oBAAE,SAAS;YACzC,CAAC;YACD,MAAM,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YAC/C,SAAS;QACV,CAAC;QAED,IAAI,kBAAkB,EAAE,CAAC;YACxB,MAAM,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YAC9C,SAAS;QACV,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACnB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC;YACzD,SAAS;QACV,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,aAAa,CACvC,gBAAgB,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,eAAe,IAAI,MAAM,IAAI,CAChG,CAAC;QACF,IAAI,MAAM,CAAC,OAAO;YAAE,OAAO;QAC3B,IAAI,KAAK,EAAE,CAAC;YACX,MAAM,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YAC9C,SAAS;QACV,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,mBAAmB,MAAM,CAAC,OAAO,cAAc,CAAC,CAAC;QAC5F,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO;YAAE,SAAS;QACzC,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACvE,IAAI,CAAC;YACJ,IAAI,CAAC,CAAC,MAAM,qBAAqB,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;gBAC1F,MAAM,CAAC,YAAY,EAAE,CAAC,2CAA2C,MAAM,CAAC,OAAO,UAAU,CAAC,CAAC;YAC5F,CAAC;QACF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,CAAC,YAAY,EAAE,CACpB,+CAA+C,MAAM,CAAC,OAAO,KAAK,aAAa,CAAC,KAAK,CAAC,EAAE,CACxF,CAAC;QACH,CAAC;IACF,CAAC;AACF,CAAC;AAED,SAAS,4BAA4B,CACpC,MAAkC,EAClC,MAA0B;IAE1B,IAAI,MAAM,CAAC,eAAe,KAAK,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,SAAS;QAAE,OAAO,wBAAwB,CAAC;IACrG,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC;IACpC,MAAM,cAAc,GAAG,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC;IACjD,IAAI,YAAY,KAAK,SAAS,IAAI,cAAc,KAAK,SAAS,IAAI,YAAY,KAAK,cAAc,EAAE,CAAC;QACnG,OAAO,sCAAsC,CAAC;IAC/C,CAAC;IACD,IAAI,CAAC,cAAc,IAAI,YAAY,CAAC,KAAK,MAAM,CAAC,OAAO;QAAE,OAAO,+CAA+C,CAAC;IAChH,IAAI,MAAM,CAAC,sBAAsB,KAAK,KAAK;QAAE,OAAO,uDAAuD,CAAC;IAC5G,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,sBAAsB,CAAC,MAAkC,EAAE,MAA0B,EAAE,MAAc;IAC7G,MAAM,CAAC,YAAY,EAAE,CACpB,4CAA4C,MAAM,CAAC,OAAO,KAAK,MAAM,kEAAkE,CACvI,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAC7B,MAAkC,EAClC,MAA0B,EAC1B,MAAmB;IAEnB,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO;IAC3B,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,EAAE;QACrC,SAAS,EAAE,OAAO,CAAC,GAAG;QACtB,eAAe,EAAE,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,SAAS;KACrD,CAAC,CAAC;IACH,IAAI,CAAC;QACJ,IAAI,CAAC,CAAC,MAAM,qBAAqB,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAAE,OAAO;QAC7F,IAAI,MAAM,CAAC,OAAO;YAAE,MAAM,qBAAqB,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACnG,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,YAAY,EAAE,CAAC,gDAAgD,MAAM,CAAC,OAAO,KAAK,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAClH,CAAC;AACF,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC9B,MAAkC,EAClC,MAA0B,EAC1B,MAAmB;IAEnB,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO;IAC3B,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC;IACjC,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QACtC,MAAM,CAAC,YAAY,EAAE,CACpB,+BAA+B,MAAM,CAAC,OAAO,gFAAgF,CAC7H,CAAC;QACF,OAAO;IACR,CAAC;IACD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,EAAE;QACrC,SAAS,EAAE,OAAO,CAAC,GAAG;QACtB,eAAe,EAAE,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,SAAS;KACrD,CAAC,CAAC;IACH,IAAI,QAA+D,CAAC;IACpE,IAAI,CAAC;QACJ,IAAI,CAAC,CAAC,MAAM,qBAAqB,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAAE,OAAO;QAC7F,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,qBAAqB,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YAC9E,OAAO;QACR,CAAC;QACD,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACzD,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;YAC5B,MAAM,qBAAqB,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YAC9E,MAAM,CAAC,YAAY,EAAE,CAAC,oCAAoC,MAAM,CAAC,OAAO,KAAK,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;YACrG,OAAO;QACR,CAAC;QACD,QAAQ,GAAG,aAAa,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,CAAC;YACJ,MAAM,qBAAqB,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAC/E,CAAC;QAAC,MAAM,CAAC;YACR,qEAAqE;QACtE,CAAC;QACD,MAAM,CAAC,YAAY,EAAE,CAAC,oCAAoC,MAAM,CAAC,OAAO,KAAK,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACrG,OAAO;IACR,CAAC;IACD,MAAM,aAAa,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC;IACxD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACrB,IAAI,CAAC;YACJ,6FAA6F;YAC7F,6FAA6F;YAC7F,eAAe;YACf,MAAM,qBAAqB,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;QACvF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,CAAC,YAAY,EAAE,CACpB,2DAA2D,MAAM,CAAC,OAAO,KAAK,aAAa,CAAC,KAAK,CAAC,EAAE,CACpG,CAAC;QACH,CAAC;IACF,CAAC;SAAM,CAAC;QACP,MAAM,CAAC,YAAY,EAAE,CACpB,kCAAkC,MAAM,CAAC,OAAO,sEAAsE,CACtH,CAAC;IACH,CAAC;IACD,KAAK,QAAQ,CAAC,UAAU,CAAC,IAAI,CAC5B,CAAC,MAAM,EAAE,EAAE,CAAC,4BAA4B,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EACxF,CAAC,KAAc,EAAE,EAAE;QAClB,MAAM,CAAC,YAAY,EAAE,CACpB,iCAAiC,OAAO,CAAC,KAAK,CAAC,OAAO,4BAA4B,aAAa,CAAC,KAAK,CAAC,EAAE,CACxG,CAAC;IACH,CAAC,CACD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,4BAA4B,CAC1C,MAAkC,EAClC,OAA2B,EAC3B,cAAkC,EAClC,MAA8D,EAC9D,QAAqB;IAErB,IAAI,CAAC;QACJ,MAAM,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;QAC3D,IAAI,MAAM,qBAAqB,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC;YACtF,IAAI,QAAQ,CAAC,OAAO;gBAAE,OAAO;YAC7B,MAAM,2BAA2B,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC9D,OAAO;QACR,CAAC;QACD,MAAM,cAAc,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QACzE,IAAI,cAAc,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC;YACzC,MAAM,kBAAkB,GAAG,YAAY,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;YAC5E,IAAI,MAAM,qBAAqB,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,EAAE,cAAc,EAAE,kBAAkB,CAAC,EAAE,CAAC;gBACvG,IAAI,QAAQ,CAAC,OAAO;oBAAE,OAAO;gBAC7B,MAAM,2BAA2B,CAAC,MAAM,EAAE,kBAAkB,EAAE,QAAQ,CAAC,CAAC;gBACxE,OAAO;YACR,CAAC;QACF,CAAC;QACD,8FAA8F;QAC9F,8FAA8F;QAC9F,uEAAuE;QACvE,MAAM,gBAAgB,GAAG,YAAY,CAAC,EAAE,GAAG,cAAc,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;QACnG,IAAI,MAAM,qBAAqB,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,EAAE,cAAc,EAAE,gBAAgB,CAAC,EAAE,CAAC;YACrG,IAAI,QAAQ,CAAC,OAAO;gBAAE,OAAO;YAC7B,MAAM,2BAA2B,CAAC,MAAM,EAAE,gBAAgB,EAAE,QAAQ,CAAC,CAAC;YACtE,OAAO;QACR,CAAC;QACD,IAAI,MAAM,qBAAqB,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC;YACxF,IAAI,QAAQ,CAAC,OAAO;gBAAE,OAAO;YAC7B,MAAM,2BAA2B,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC9D,OAAO;QACR,CAAC;QACD,MAAM,CAAC,YAAY,EAAE,CAAC,sDAAsD,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAChG,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,YAAY,EAAE,CACpB,0DAA0D,OAAO,CAAC,OAAO,KAAK,aAAa,CAAC,KAAK,CAAC,EAAE,CACpG,CAAC;IACH,CAAC;AACF,CAAC;AAED,KAAK,UAAU,2BAA2B,CACzC,MAAkC,EAClC,QAA4B,EAC5B,QAAqB;IAErB,IAAI,QAAQ,CAAC,OAAO;QAAE,OAAO;IAC7B,IAAI,CAAC;QACJ,MAAM,MAAM,CAAC,MAAM,CAAC,0BAA0B,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC1D,IAAI,QAAQ,CAAC,OAAO;YAAE,OAAO;QAC7B,MAAM,SAAS,GAAG,iCAAiC,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;QACxF,IAAI,CAAC,CAAC,MAAM,qBAAqB,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;YAC5F,MAAM,CAAC,YAAY,EAAE,CACpB,uEAAuE,QAAQ,CAAC,OAAO,EAAE,CACzF,CAAC;QACH,CAAC;IACF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,YAAY,EAAE,CACpB,0DAA0D,QAAQ,CAAC,OAAO,KAAK,aAAa,CAAC,KAAK,CAAC,EAAE,CACrG,CAAC;IACH,CAAC;AACF,CAAC;AAED,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E,KAAK,UAAU,iBAAiB,CAC/B,MAAkC,EAClC,gBAAwB,EACxB,GAAiB;IAEjB,MAAM,eAAe,GAAG,kBAAkB,EAAE,CAAC;IAC7C,MAAM,OAAO,GAAG,CAAC,iBAAiB,EAAE,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,SAAS,CAAC;IAC3F,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,SAAS,CAAC;IAC5E,MAAM,OAAO,GAAG,uBAAuB,EAAE,CAAC;IAC1C,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,eAAe,CAAC;IAClE,IAAI,OAAO,KAAK,cAAc,EAAE,CAAC;QAChC,MAAM,IAAI,SAAS,CAClB,8BAA8B,cAAc,IAAI,MAAM,iCAAiC,OAAO,IAAI,MAAM,IAAI,CAC5G,CAAC;IACH,CAAC;IAED,IAAI,KAAK,GAAG,gBAAgB,CAAC;QAC5B,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,QAAQ,EAAE,UAAU,EAAE;QACtB,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC;QAChB,SAAS,EAAE,gBAAgB;QAC3B,GAAG,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACrD,CAAC,CAAC;IACH,IAAI,CAAC;QACJ,MAAM,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,YAAY,EAAE,CAAC,oDAAoD,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACnG,CAAC;IAED,IAAI,gBAAgB,GAAG,gBAAgB,CAAC;IACxC,IAAI,sBAAsB,GAAG,eAAe,CAAC;IAC7C,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,KAAiC,CAAC;IACtC,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,uBAAuB,GAAG,KAAK,CAAC;IACpC,IAAI,QAAmC,CAAC;IACxC,MAAM,mBAAmB,GAAG,KAAK,CAAC,SAAS,CAAC;IAC5C,MAAM,WAAW,GAAG,CAAC,IAAI,GAAkB,IAAI,EAAQ,EAAE;QACxD,IAAI,uBAAuB;YAAE,OAAO;QACpC,IAAI,CAAC;YACJ,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1E,IAAI,yBAAyB,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAC;gBAAE,KAAK,GAAG,QAAQ,CAAC;QACnF,CAAC;QAAC,MAAM,CAAC;YACR,8DAA8D;QAC/D,CAAC;IACF,CAAC,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAElC,MAAM,WAAW,GAAG,KAAK,IAAmB,EAAE;QAC7C,IAAI,OAAO;YAAE,OAAO;QACpB,OAAO,GAAG,IAAI,CAAC;QACf,IAAI,KAAK;YAAE,aAAa,CAAC,KAAK,CAAC,CAAC;QAChC,KAAK,GAAG,SAAS,CAAC;QAClB,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC9B,uFAAuF;YACvF,0FAA0F;YAC1F,oFAAoF;YACpF,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;gBAC9C,MAAM,QAAQ,GAAG,KAAK,CAAC;gBACvB,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;gBACnF,IAAI,CAAC;oBACJ,IAAI,MAAM,qBAAqB,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;wBACxF,KAAK,GAAG,QAAQ,CAAC;wBACjB,MAAM;oBACP,CAAC;oBACD,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;oBACnE,IAAI,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,SAAS,KAAK,mBAAmB,EAAE,CAAC;wBAC/E,MAAM,CAAC,YAAY,EAAE,CAAC,4EAA4E,CAAC,CAAC;wBACpG,MAAM;oBACP,CAAC;oBACD,KAAK,GAAG,OAAO,CAAC;gBACjB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBAChB,MAAM,CAAC,YAAY,EAAE,CACpB,4DAA4D,aAAa,CAAC,KAAK,CAAC,EAAE,CAClF,CAAC;oBACF,MAAM;gBACP,CAAC;YACF,CAAC;QACF,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAClC,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,GAAkB,EAAE;QAChC,QAAQ,KAAK,WAAW,EAAE,CAAC;QAC3B,OAAO,QAAQ,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,KAAK,EACpB,QAA4B,EAC5B,IAAwB,EACxB,cAAsB,EACH,EAAE;QACrB,IAAI,CAAC;YACJ,IAAI,MAAM,qBAAqB,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC;gBACpF,KAAK,GAAG,IAAI,CAAC;gBACb,OAAO,IAAI,CAAC;YACb,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;YACnE,IAAI,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG;gBAAE,KAAK,GAAG,OAAO,CAAC;iBAC7C,CAAC;gBACL,OAAO,GAAG,IAAI,CAAC;gBACf,IAAI,KAAK;oBAAE,aAAa,CAAC,KAAK,CAAC,CAAC;gBAChC,KAAK,GAAG,SAAS,CAAC;gBAClB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;gBACjC,MAAM,CAAC,YAAY,EAAE,CAAC,4EAA4E,CAAC,CAAC;YACrG,CAAC;QACF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,CAAC,YAAY,EAAE,CAAC,mBAAmB,cAAc,KAAK,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACrF,CAAC;QACD,OAAO,KAAK,CAAC;IACd,CAAC,CAAC;IAEF,MAAM,0BAA0B,GAAG,KAAK,EAAE,KAAyB,EAAiB,EAAE;QACrF,IACC,CAAC,CAAC,MAAM,OAAO,CACd,KAAK,EACL,aAAa,CAAC,KAAK,EAAE,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EACjD,qDAAqD,CACrD,CAAC;YAEF,OAAO;QACR,uBAAuB,GAAG,KAAK,CAAC;QAChC,iBAAiB,CAAC,MAAM,EAAE,mFAAmF,CAAC,CAAC;QAC/G,MAAM,IAAI,EAAE,CAAC;QACb,MAAM,CAAC,WAAW,EAAE,CAAC;IACtB,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,GAAS,EAAE;QACpC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YACxB,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,KAAK,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;gBAC/B,OAAO,GAAG,KAAK,CAAC;YACjB,CAAC,CAAC,CAAC;QACJ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QAClC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,qBAAqB,GAAG,KAAK,IAAsB,EAAE;QAC1D,yFAAyF;QACzF,8FAA8F;QAC9F,sFAAsF;QACtF,IAAI,CAAC,sBAAsB,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,gBAAgB,CAAC;YAAE,OAAO,KAAK,CAAC;QACtF,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,YAAY,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAAC,CAAC;QAChG,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,SAAS,KAAK,sBAAsB;YACzG,OAAO,KAAK,CAAC;QACd,IAAI,MAAM,CAAC,GAAG,KAAK,gBAAgB,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QACjF,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,GAAG,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC/E,OAAO,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,GAAG,EAAE,GAAG,WAAW,IAAI,MAAM,CAAC;IACtE,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,KAAK,IAAmB,EAAE;QAC7C,IAAI,OAAO;YAAE,OAAO;QACpB,IAAI,CAAC,CAAC,MAAM,qBAAqB,EAAE,CAAC,EAAE,CAAC;YACtC,MAAM,aAAa,EAAE,CAAC;YACtB,OAAO;QACR,CAAC;QACD,iFAAiF;QACjF,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9D,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,MAAM,SAAS,GAAG,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;QACtG,IAAI,SAAS,CAAC,IAAI,KAAK,cAAc;YAAE,OAAO;QAC9C,MAAM,0BAA0B,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,KAAK,IAAmB,EAAE;QAC/C,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,QAAQ,GAAG,KAAK,CAAC;QACvB,MAAM,SAAS,GAAqB,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACpG,IAAI,QAAQ,CAAC,OAAO,KAAK,SAAS;YAAE,SAAS,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;QACzE,IAAI,QAAQ,CAAC,WAAW,KAAK,SAAS;YAAE,SAAS,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC;QACrF,MAAM,SAAS,GAAG,aAAa,CAAC,aAAa,CAAC,QAAQ,EAAE,aAAa,EAAE,UAAU,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QAC3G,IAAI,CAAC,CAAC,MAAM,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,kCAAkC,CAAC,CAAC;YAAE,OAAO;QACtF,IAAI,KAAK;YAAE,aAAa,CAAC,KAAK,CAAC,CAAC;QAChC,KAAK,GAAG,SAAS,CAAC;QAClB,uBAAuB,GAAG,IAAI,CAAC;QAC/B,iBAAiB,CAChB,MAAM,EACN,uCAAuC,gBAAgB,6DAA6D,CACpH,CAAC;QACF,eAAe,EAAE,CAAC;IACnB,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,GAAS,EAAE;QAClC,MAAM,aAAa,GAAG,GAAG,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC;QAC9D,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YACxB,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,KAAK,SAAS,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;gBAC1C,OAAO,GAAG,KAAK,CAAC;YACjB,CAAC,CAAC,CAAC;QACJ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QAClC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,KAAK,EAAE,aAAqB,EAAiB,EAAE;QAChE,IAAI,OAAO;YAAE,OAAO;QACpB,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9D,IAAI,KAAK,EAAE,CAAC;YACX,MAAM,SAAS,GAAG,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;YACtG,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;gBACzD,qFAAqF;gBACrF,mFAAmF;gBACnF,IACC,CAAC,CAAC,MAAM,OAAO,CACd,KAAK,EACL,aAAa,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,CAAC,EAChG,iCAAiC,CACjC,CAAC;oBAEF,OAAO;gBACR,iBAAiB,CAChB,MAAM,EACN,gDAAgD,SAAS,CAAC,SAAS,cAAc,CACjF,CAAC;gBACF,gBAAgB,GAAG,SAAS,CAAC,SAAS,CAAC;gBACvC,sBAAsB,GAAG,KAAK,CAAC,eAAe,CAAC;gBAC/C,uBAAuB,GAAG,KAAK,CAAC;gBAChC,IAAI,KAAK,EAAE,CAAC;oBACX,aAAa,CAAC,KAAK,CAAC,CAAC;oBACrB,KAAK,GAAG,SAAS,CAAC;gBACnB,CAAC;gBACD,iBAAiB,EAAE,CAAC;gBACpB,OAAO;YACR,CAAC;YACD,IAAI,SAAS,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBACvC,MAAM,0BAA0B,CAAC,KAAK,CAAC,CAAC;gBACxC,OAAO;YACR,CAAC;QACF,CAAC;QACD,IAAI,GAAG,EAAE,IAAI,aAAa,EAAE,CAAC;YAC5B,MAAM,IAAI,EAAE,CAAC;YACb,MAAM,CAAC,WAAW,EAAE,CAAC;QACtB,CAAC;IACF,CAAC,CAAC;IAEF,iBAAiB,EAAE,CAAC;IAEpB,OAAO,EAAE,IAAI,EAAE,CAAC;AACjB,CAAC","sourcesContent":["/**\n * Process-matrix runtime composition: the pieces main.ts wires together for durable,\n * restart-surviving master/worker process supervision.\n *\n * Contract:\n * - A WORKER is any process launched with a known parent (`PI_PARENT_PID` -- set by the\n * `--parent-pid` CLI flag, or directly by a launcher such as tmux dispatch). It self-registers\n * its OWN entry (the single writer of that entry during normal operation) and watches its\n * parent's liveness. On parent death it winds down GRACEFULLY -- never silently -- leaving a\n * `resumable` payload, then exits on its own after a bounded grace window (during which it may\n * instead be adopted by a new parent). \"No new turns\" after that point is automatic: a dead\n * parent injects no further follow-ups, so the worker simply runs out of work to do.\n * - A MASTER is everything else (no known parent). On startup it scans the matrix for orphaned\n * workers (workers whose recorded parent is dead). Workers owned by this exact resumed session\n * are restored automatically; foreign workers remain owner-gated interactively and report-only\n * headlessly.\n *\n * Sanctioned exceptions to \"a worker's entry is written only by that worker\": an exact resumed\n * parent may restore its recorded ownership, and an owner may explicitly approve adoption or\n * cooperative cleanup of a foreign orphan. The worker later confirms/applies the directive via\n * `pollWorkerDirective` and re-writes its own entry -- see `docs/process-matrix.md`. Outside these\n * identity/approval-fenced handshakes, a master NEVER writes another session's entry, and nothing\n * here ever kills a process directly.\n */\n\nimport { hostname as osHostname } from \"node:os\";\nimport { isAgentIdentity } from \"../orchestration/agent-resume.ts\";\nimport type { AgentIdentityContract } from \"../orchestration/contracts.ts\";\nimport { getParentPid, getParentSessionId, getProcessTaskRef } from \"../process-identity.ts\";\nimport type { ResolvedProcessMatrixSettings } from \"../settings-manager.ts\";\nimport { getBoundWorktreeLaneKey } from \"../worktree-sync/runtime.ts\";\nimport type { ProcessMatrixEntry, ResumablePayload } from \"./codes.ts\";\nimport {\n\tbuildEntryId,\n\tlistEntries,\n\treadEntry,\n\tremoveEntryIfUnchanged,\n\twriteEntry,\n\twriteEntryIfUnchanged,\n\twriteEntryIfUnchangedSync,\n} from \"./store.ts\";\nimport {\n\tapplyAdoption,\n\tapplyHeartbeat,\n\tbeginWindDown,\n\tbuildMasterEntry,\n\tbuildWorkerEntry,\n\tdetectOrphanedWorkers,\n\tmarkClosed,\n\tmarkResumable,\n\tmarkTerminal,\n\tmarkTerminalNotificationDelivered,\n\tpollWorkerDirective,\n\treconcileMatrix,\n} from \"./supervisor.ts\";\n\nexport {\n\tgetOrchestrationAgentId,\n\tgetParentPid,\n\tgetParentSessionId,\n\tgetProcessTaskRef,\n\tPI_ORCHESTRATION_AGENT_ID_ENV,\n\tPI_PARENT_PID_ENV,\n\tPI_PARENT_SESSION_ENV,\n\tPI_TASK_REF_ENV,\n} from \"../process-identity.ts\";\n\nexport interface ProcessMatrixRuntimeConfig {\n\tagentDir: string;\n\t/** Canonical logical identity for this process and any exact-session resume. */\n\tagent: AgentIdentityContract;\n\t/** Whether an interactive UI is available to ask the owner (see `promptConfirm`). */\n\thasUI: boolean;\n\tsettings: ResolvedProcessMatrixSettings;\n\tisProcessAlive: (pid: number) => boolean;\n\tnow?: () => number;\n\t/** Structural notice injection into the running session (host `sendCustomMessage` seam). */\n\tnotify: (text: string) => void | Promise<void>;\n\t/** Diagnostics sink (never throws into the session). */\n\tonDiagnostic?: (message: string) => void;\n\t/** The ask seam: resolves false on decline AND on any non-interactive/non-TTY caller. */\n\tpromptConfirm: (message: string) => Promise<boolean>;\n\t/** Cooperative self-exit -- called by a worker once wound down (grace expiry or a\n\t * master-granted cleanup directive). Never called for the master's own lifecycle. */\n\trequestExit: () => void;\n\t/** Stable goal/task identity. Automatic recovery requires an exact match. */\n\ttaskRef?: string;\n\ttaskSummary?: string;\n\t/** False for terminal/blocked owner state; recovery then remains explicit-owner gated. */\n\tallowAutomaticRecovery?: boolean;\n\t/** Starts a replacement OS process for a dead resumable worker. Completion is an event-driven\n\t * terminal signal; worker product remains in its persisted session/artifacts. */\n\tresumeWorker?: (payload: ResumablePayload) => Promise<ResumeWorkerLaunchOutcome>;\n}\n\nexport type ResumeWorkerLaunchOutcome =\n\t| {\n\t\t\tstarted: true;\n\t\t\t/** OS identity of this specific replacement process, used to fence its terminal handoff. */\n\t\t\tpid: number;\n\t\t\tcompletion: Promise<{ code: number | null; signal: NodeJS.Signals | null }>;\n\t }\n\t| { started: false; reason: string };\n\nexport interface ProcessMatrixRuntimeHandle {\n\tstop(): Promise<void> | void;\n}\n\nconst NOOP_HANDLE: ProcessMatrixRuntimeHandle = { stop: () => {} };\nexport const PROCESS_MATRIX_RESUMABLE_RETENTION_MS = 30 * 24 * 60 * 60_000;\n\nfunction describeError(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error);\n}\n\nfunction nowIso(now: () => number): string {\n\treturn new Date(now()).toISOString();\n}\n\nfunction emitRuntimeNotice(config: ProcessMatrixRuntimeConfig, text: string): void {\n\ttry {\n\t\tvoid Promise.resolve(config.notify(text)).catch((error: unknown) => {\n\t\t\tconfig.onDiagnostic?.(`process-matrix: failed to notify session: ${describeError(error)}`);\n\t\t});\n\t} catch (error) {\n\t\tconfig.onDiagnostic?.(`process-matrix: failed to notify session: ${describeError(error)}`);\n\t}\n}\n\n/**\n * Start the per-session process-matrix runtime. No-op when disabled (byte-identical to not\n * calling this at all). Never throws: a broken store must surface as a diagnostic, not a startup\n * crash.\n */\nexport async function startProcessMatrixRuntime(\n\tconfig: ProcessMatrixRuntimeConfig,\n): Promise<ProcessMatrixRuntimeHandle> {\n\tif (!config.settings.enabled) return NOOP_HANDLE;\n\tconst now = config.now ?? Date.now;\n\tconst parentPid = getParentPid();\n\n\ttry {\n\t\tif (!isAgentIdentity(config.agent)) throw new TypeError(\"Process-matrix agent identity is invalid.\");\n\t\tif (parentPid !== undefined) {\n\t\t\treturn await startWorkerBranch(config, parentPid, now);\n\t\t}\n\t\treturn await startMasterBranch(config, now);\n\t} catch (error) {\n\t\tconfig.onDiagnostic?.(`process-matrix: runtime failed to start: ${describeError(error)}`);\n\t\treturn NOOP_HANDLE;\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Master branch\n// ---------------------------------------------------------------------------\n\nasync function startMasterBranch(\n\tconfig: ProcessMatrixRuntimeConfig,\n\tnow: () => number,\n): Promise<ProcessMatrixRuntimeHandle> {\n\tlet entry = buildMasterEntry({\n\t\tagent: config.agent,\n\t\tpid: process.pid,\n\t\thostname: osHostname(),\n\t\tnow: nowIso(now),\n\t});\n\ttry {\n\t\tawait writeEntry(config.agentDir, entry);\n\t} catch (error) {\n\t\tconfig.onDiagnostic?.(`process-matrix: failed to register master entry: ${describeError(error)}`);\n\t}\n\n\tlet stopped = false;\n\tlet ownsEntry = true;\n\tlet heartbeatTask: Promise<void> | undefined;\n\tconst lifetime = new AbortController();\n\tconst heartbeatTimer = setInterval(() => {\n\t\tif (stopped || !ownsEntry || heartbeatTask) return;\n\t\tconst expected = entry;\n\t\tconst next = applyHeartbeat(expected, nowIso(now));\n\t\theartbeatTask = writeEntryIfUnchanged(config.agentDir, expected.entryId, expected, next)\n\t\t\t.then((written) => {\n\t\t\t\tif (written) {\n\t\t\t\t\tentry = next;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\townsEntry = false;\n\t\t\t\tlifetime.abort();\n\t\t\t\tclearInterval(heartbeatTimer);\n\t\t\t\tprocess.off(\"exit\", closeOnExit);\n\t\t\t\tconfig.onDiagnostic?.(\"process-matrix: master entry ownership moved to a newer process generation\");\n\t\t\t})\n\t\t\t.catch((error: unknown) => {\n\t\t\t\tconfig.onDiagnostic?.(`process-matrix: failed to write master heartbeat: ${describeError(error)}`);\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\theartbeatTask = undefined;\n\t\t\t});\n\t}, config.settings.heartbeatMs);\n\theartbeatTimer.unref?.();\n\n\t// Best-effort close on process exit. A SIGKILLed master leaving \"running\" is fine -- reconcile's\n\t// own dead-pid detection covers it; this only makes the common clean-exit case tidy.\n\tconst closeOnExit = (): void => {\n\t\tif (!ownsEntry) return;\n\t\ttry {\n\t\t\tconst closed = markClosed(entry, nowIso(now));\n\t\t\tif (writeEntryIfUnchangedSync(config.agentDir, entry, closed)) entry = closed;\n\t\t} catch {\n\t\t\t// Best-effort only -- see module doc.\n\t\t}\n\t};\n\tprocess.once(\"exit\", closeOnExit);\n\n\tconst maintenance = reconcileAndRunOrphanScan(config, now, lifetime.signal).catch((error: unknown) => {\n\t\tconfig.onDiagnostic?.(`process-matrix: maintenance failed: ${describeError(error)}`);\n\t});\n\n\treturn {\n\t\tasync stop() {\n\t\t\tif (stopped) return;\n\t\t\tstopped = true;\n\t\t\tlifetime.abort();\n\t\t\tclearInterval(heartbeatTimer);\n\t\t\tprocess.off(\"exit\", closeOnExit);\n\t\t\tawait heartbeatTask;\n\t\t\tif (ownsEntry) {\n\t\t\t\tconst closed = markClosed(entry, nowIso(now));\n\t\t\t\tif (await writeEntryIfUnchanged(config.agentDir, entry.entryId, entry, closed)) entry = closed;\n\t\t\t}\n\t\t\tawait maintenance;\n\t\t},\n\t};\n}\n\nasync function reconcileAndRunOrphanScan(\n\tconfig: ProcessMatrixRuntimeConfig,\n\tnow: () => number,\n\tsignal: AbortSignal,\n): Promise<void> {\n\tlet entries: ProcessMatrixEntry[];\n\ttry {\n\t\tentries = await listEntries(config.agentDir);\n\t} catch (error) {\n\t\tconfig.onDiagnostic?.(`process-matrix: reconciliation failed to list entries: ${describeError(error)}`);\n\t\treturn;\n\t}\n\tif (signal.aborted) return;\n\tconst reconciled = reconcileMatrix(entries, {\n\t\tisPidAlive: (pid) => pid === process.pid || config.isProcessAlive(pid),\n\t\tnow: now(),\n\t\tresumableTtlMs: PROCESS_MATRIX_RESUMABLE_RETENTION_MS,\n\t});\n\tconst originalByEntryId = new Map(entries.map((entry) => [entry.entryId, entry]));\n\tconst recoveredEntryIdSet = new Set(reconciled.recoveredEntryIds);\n\tconst [prunedOutcomes, recoveredOutcomes] = await Promise.all([\n\t\tPromise.all(\n\t\t\treconciled.prunedEntryIds.map((entryId) => {\n\t\t\t\tconst original = originalByEntryId.get(entryId);\n\t\t\t\treturn original ? removeEntryIfUnchanged(config.agentDir, original) : false;\n\t\t\t}),\n\t\t),\n\t\tPromise.all(\n\t\t\treconciled.kept\n\t\t\t\t.filter((entry) => recoveredEntryIdSet.has(entry.entryId))\n\t\t\t\t.map((entry) => {\n\t\t\t\t\tconst original = originalByEntryId.get(entry.entryId);\n\t\t\t\t\treturn original ? writeEntryIfUnchanged(config.agentDir, entry.entryId, original, entry) : false;\n\t\t\t\t}),\n\t\t),\n\t]);\n\tif (signal.aborted) return;\n\tconst recoveredCount = recoveredOutcomes.filter(Boolean).length;\n\tconst prunedCount = prunedOutcomes.filter(Boolean).length;\n\tif (recoveredCount > 0) {\n\t\tconfig.onDiagnostic?.(\n\t\t\t`process-matrix: recovered ${recoveredCount} interrupted Pi worker entr${recoveredCount === 1 ? \"y\" : \"ies\"}`,\n\t\t);\n\t}\n\tif (prunedCount > 0) {\n\t\tconfig.onDiagnostic?.(\n\t\t\t`process-matrix: pruned ${prunedCount} terminal or expired entr${prunedCount === 1 ? \"y\" : \"ies\"}`,\n\t\t);\n\t}\n\tconst currentEntries = await listEntries(config.agentDir);\n\tawait deliverTerminalNotifications(config, currentEntries, now, signal);\n\tif (signal.aborted) return;\n\tawait runOrphanScan(config, currentEntries, now, signal);\n}\n\nasync function deliverTerminalNotifications(\n\tconfig: ProcessMatrixRuntimeConfig,\n\tentries: ProcessMatrixEntry[],\n\tnow: () => number,\n\tsignal: AbortSignal,\n): Promise<void> {\n\tfor (const entry of entries) {\n\t\tif (\n\t\t\tsignal.aborted ||\n\t\t\tentry.status !== \"closed\" ||\n\t\t\t!entry.terminal ||\n\t\t\tentry.terminal.notificationDeliveredAt ||\n\t\t\tentry.parentSessionId !== config.agent.resumeContext.sessionId\n\t\t)\n\t\t\tcontinue;\n\t\ttry {\n\t\t\tawait config.notify(formatTerminalNotification(entry));\n\t\t\tif (signal.aborted) return;\n\t\t} catch (error) {\n\t\t\tconfig.onDiagnostic?.(\n\t\t\t\t`process-matrix: failed to deliver terminal handoff for ${entry.entryId}: ${describeError(error)}`,\n\t\t\t);\n\t\t\tcontinue;\n\t\t}\n\t\ttry {\n\t\t\tconst delivered = markTerminalNotificationDelivered(entry, nowIso(now));\n\t\t\tif (!(await writeEntryIfUnchanged(config.agentDir, entry.entryId, entry, delivered))) {\n\t\t\t\tconfig.onDiagnostic?.(\n\t\t\t\t\t`process-matrix: terminal handoff changed before acknowledgement for ${entry.entryId}`,\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconfig.onDiagnostic?.(\n\t\t\t\t`process-matrix: failed to acknowledge terminal handoff for ${entry.entryId}: ${describeError(error)}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\nfunction formatTerminalNotification(entry: ProcessMatrixEntry): string {\n\tconst terminal = entry.terminal;\n\treturn `process-matrix: resumed agent ${entry.agent.agentId} reached a terminal process state (code ${terminal?.code ?? \"none\"}, signal ${terminal?.signal ?? \"none\"}). Inspect its persisted result before continuing.`;\n}\n\nasync function runOrphanScan(\n\tconfig: ProcessMatrixRuntimeConfig,\n\tentries: ProcessMatrixEntry[],\n\tnow: () => number,\n\tsignal: AbortSignal,\n): Promise<void> {\n\tconst orphans = detectOrphanedWorkers(entries, {\n\t\tisPidAlive: config.isProcessAlive,\n\t\townSessionId: config.agent.resumeContext.sessionId,\n\t});\n\tif (orphans.length === 0) return;\n\n\tfor (const orphan of orphans) {\n\t\tif (signal.aborted) return;\n\t\tconst recoveryBoundary = getAutomaticRecoveryBoundary(config, orphan);\n\t\tconst exactResumedParent = recoveryBoundary === undefined;\n\t\tif (!config.isProcessAlive(orphan.pid)) {\n\t\t\tif (!exactResumedParent) {\n\t\t\t\tif (!config.hasUI) {\n\t\t\t\t\treportOwnerGatedOrphan(config, orphan, recoveryBoundary);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst payload = orphan.resumable;\n\t\t\t\tif (!payload) {\n\t\t\t\t\tconfig.onDiagnostic?.(\n\t\t\t\t\t\t`process-matrix: dead worker ${orphan.entryId} is not resumable because its launch context is unavailable`,\n\t\t\t\t\t);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst resume = await config.promptConfirm(\n\t\t\t\t\t`resume agent ${payload.agent.agentId} from its persisted session?`,\n\t\t\t\t);\n\t\t\t\tif (!resume || signal.aborted) continue;\n\t\t\t}\n\t\t\tawait resumeDeadOrphan(config, orphan, signal);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (exactResumedParent) {\n\t\t\tawait adoptLiveOrphan(config, orphan, signal);\n\t\t\tcontinue;\n\t\t}\n\t\tif (!config.hasUI) {\n\t\t\treportOwnerGatedOrphan(config, orphan, recoveryBoundary);\n\t\t\tcontinue;\n\t\t}\n\t\tconst adopt = await config.promptConfirm(\n\t\t\t`adopt worker ${orphan.entryId} (lane ${orphan.agent.resumeContext.worktreeLaneKey ?? \"none\"})?`,\n\t\t);\n\t\tif (signal.aborted) return;\n\t\tif (adopt) {\n\t\t\tawait adoptLiveOrphan(config, orphan, signal);\n\t\t\tcontinue;\n\t\t}\n\t\tconst cleanup = await config.promptConfirm(`clean up worker ${orphan.entryId} gracefully?`);\n\t\tif (!cleanup || signal.aborted) continue;\n\t\tconst windingDown = beginWindDown(orphan, \"user_cleanup\", nowIso(now));\n\t\ttry {\n\t\t\tif (!(await writeEntryIfUnchanged(config.agentDir, orphan.entryId, orphan, windingDown))) {\n\t\t\t\tconfig.onDiagnostic?.(`process-matrix: cleanup skipped because ${orphan.entryId} changed`);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconfig.onDiagnostic?.(\n\t\t\t\t`process-matrix: failed to write cleanup for ${orphan.entryId}: ${describeError(error)}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\nfunction getAutomaticRecoveryBoundary(\n\tconfig: ProcessMatrixRuntimeConfig,\n\torphan: ProcessMatrixEntry,\n): string | undefined {\n\tif (orphan.parentSessionId !== config.agent.resumeContext.sessionId) return \"foreign parent session\";\n\tconst entryTaskRef = orphan.taskRef;\n\tconst payloadTaskRef = orphan.resumable?.taskRef;\n\tif (entryTaskRef !== undefined && payloadTaskRef !== undefined && entryTaskRef !== payloadTaskRef) {\n\t\treturn \"inconsistent persisted task identity\";\n\t}\n\tif ((payloadTaskRef ?? entryTaskRef) !== config.taskRef) return \"task identity does not match the current goal\";\n\tif (config.allowAutomaticRecovery === false) return \"current goal state does not permit automatic recovery\";\n\treturn undefined;\n}\n\nfunction reportOwnerGatedOrphan(config: ProcessMatrixRuntimeConfig, orphan: ProcessMatrixEntry, reason: string): void {\n\tconfig.onDiagnostic?.(\n\t\t`process-matrix: found owner-gated orphan ${orphan.entryId} (${reason}; report-only, non-interactive; nothing written, nothing killed)`,\n\t);\n}\n\nasync function adoptLiveOrphan(\n\tconfig: ProcessMatrixRuntimeConfig,\n\torphan: ProcessMatrixEntry,\n\tsignal: AbortSignal,\n): Promise<void> {\n\tif (signal.aborted) return;\n\tconst adopted = applyAdoption(orphan, {\n\t\tparentPid: process.pid,\n\t\tparentSessionId: config.agent.resumeContext.sessionId,\n\t});\n\ttry {\n\t\tif (!(await writeEntryIfUnchanged(config.agentDir, orphan.entryId, orphan, adopted))) return;\n\t\tif (signal.aborted) await writeEntryIfUnchanged(config.agentDir, orphan.entryId, adopted, orphan);\n\t} catch (error) {\n\t\tconfig.onDiagnostic?.(`process-matrix: failed to write adoption for ${orphan.entryId}: ${describeError(error)}`);\n\t}\n}\n\nasync function resumeDeadOrphan(\n\tconfig: ProcessMatrixRuntimeConfig,\n\torphan: ProcessMatrixEntry,\n\tsignal: AbortSignal,\n): Promise<void> {\n\tif (signal.aborted) return;\n\tconst payload = orphan.resumable;\n\tif (!payload || !config.resumeWorker) {\n\t\tconfig.onDiagnostic?.(\n\t\t\t`process-matrix: dead worker ${orphan.entryId} is not resumable because its launch context or resume launcher is unavailable`,\n\t\t);\n\t\treturn;\n\t}\n\tconst claimed = applyAdoption(orphan, {\n\t\tparentPid: process.pid,\n\t\tparentSessionId: config.agent.resumeContext.sessionId,\n\t});\n\tlet launched: Extract<ResumeWorkerLaunchOutcome, { started: true }>;\n\ttry {\n\t\tif (!(await writeEntryIfUnchanged(config.agentDir, orphan.entryId, orphan, claimed))) return;\n\t\tif (signal.aborted) {\n\t\t\tawait writeEntryIfUnchanged(config.agentDir, orphan.entryId, claimed, orphan);\n\t\t\treturn;\n\t\t}\n\t\tconst launchOutcome = await config.resumeWorker(payload);\n\t\tif (!launchOutcome.started) {\n\t\t\tawait writeEntryIfUnchanged(config.agentDir, orphan.entryId, claimed, orphan);\n\t\t\tconfig.onDiagnostic?.(`process-matrix: failed to resume ${orphan.entryId}: ${launchOutcome.reason}`);\n\t\t\treturn;\n\t\t}\n\t\tlaunched = launchOutcome;\n\t} catch (error) {\n\t\ttry {\n\t\t\tawait writeEntryIfUnchanged(config.agentDir, orphan.entryId, claimed, orphan);\n\t\t} catch {\n\t\t\t// The original resumable record remains the intended recovery state.\n\t\t}\n\t\tconfig.onDiagnostic?.(`process-matrix: failed to resume ${orphan.entryId}: ${describeError(error)}`);\n\t\treturn;\n\t}\n\tconst launchedEntry = { ...claimed, pid: launched.pid };\n\tif (!signal.aborted) {\n\t\ttry {\n\t\t\t// Bridge the interval before the replacement can self-register. Without its real PID here, a\n\t\t\t// restarted master can mistake this live replacement for the original dead process and spawn\n\t\t\t// a duplicate.\n\t\t\tawait writeEntryIfUnchanged(config.agentDir, claimed.entryId, claimed, launchedEntry);\n\t\t} catch (error) {\n\t\t\tconfig.onDiagnostic?.(\n\t\t\t\t`process-matrix: failed to record resumed worker pid for ${orphan.entryId}: ${describeError(error)}`,\n\t\t\t);\n\t\t}\n\t} else {\n\t\tconfig.onDiagnostic?.(\n\t\t\t`process-matrix: resumed worker ${orphan.entryId} launched after owner shutdown; preserving its terminal handoff only`,\n\t\t);\n\t}\n\tvoid launched.completion.then(\n\t\t(result) => persistResumedWorkerTerminal(config, launchedEntry, claimed, result, signal),\n\t\t(error: unknown) => {\n\t\t\tconfig.onDiagnostic?.(\n\t\t\t\t`process-matrix: resumed agent ${payload.agent.agentId} terminal signal failed: ${describeError(error)}`,\n\t\t\t);\n\t\t},\n\t);\n}\n\nasync function persistResumedWorkerTerminal(\n\tconfig: ProcessMatrixRuntimeConfig,\n\tclaimed: ProcessMatrixEntry,\n\tpreLaunchClaim: ProcessMatrixEntry,\n\tresult: { code: number | null; signal: NodeJS.Signals | null },\n\tlifetime: AbortSignal,\n): Promise<void> {\n\ttry {\n\t\tconst observedAt = new Date().toISOString();\n\t\tconst terminal = markTerminal(claimed, result, observedAt);\n\t\tif (await writeEntryIfUnchanged(config.agentDir, claimed.entryId, claimed, terminal)) {\n\t\t\tif (lifetime.aborted) return;\n\t\t\tawait notifyResumedWorkerTerminal(config, terminal, lifetime);\n\t\t\treturn;\n\t\t}\n\t\tconst selfRegistered = await readEntry(config.agentDir, claimed.entryId);\n\t\tif (selfRegistered?.pid === claimed.pid) {\n\t\t\tconst registeredTerminal = markTerminal(selfRegistered, result, observedAt);\n\t\t\tif (await writeEntryIfUnchanged(config.agentDir, claimed.entryId, selfRegistered, registeredTerminal)) {\n\t\t\t\tif (lifetime.aborted) return;\n\t\t\t\tawait notifyResumedWorkerTerminal(config, registeredTerminal, lifetime);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t// If recording the spawned PID failed (or shutdown won the race immediately after spawn), the\n\t\t// untouched pre-launch claim proves no newer process has taken this logical entry. Upgrade it\n\t\t// to the actual exited process before persisting its terminal handoff.\n\t\tconst fallbackTerminal = markTerminal({ ...preLaunchClaim, pid: claimed.pid }, result, observedAt);\n\t\tif (await writeEntryIfUnchanged(config.agentDir, claimed.entryId, preLaunchClaim, fallbackTerminal)) {\n\t\t\tif (lifetime.aborted) return;\n\t\t\tawait notifyResumedWorkerTerminal(config, fallbackTerminal, lifetime);\n\t\t\treturn;\n\t\t}\n\t\tif (await writeEntryIfUnchanged(config.agentDir, claimed.entryId, undefined, terminal)) {\n\t\t\tif (lifetime.aborted) return;\n\t\t\tawait notifyResumedWorkerTerminal(config, terminal, lifetime);\n\t\t\treturn;\n\t\t}\n\t\tconfig.onDiagnostic?.(`process-matrix: ignored stale terminal handoff for ${claimed.entryId}`);\n\t} catch (error) {\n\t\tconfig.onDiagnostic?.(\n\t\t\t`process-matrix: failed to persist terminal handoff for ${claimed.entryId}: ${describeError(error)}`,\n\t\t);\n\t}\n}\n\nasync function notifyResumedWorkerTerminal(\n\tconfig: ProcessMatrixRuntimeConfig,\n\tterminal: ProcessMatrixEntry,\n\tlifetime: AbortSignal,\n): Promise<void> {\n\tif (lifetime.aborted) return;\n\ttry {\n\t\tawait config.notify(formatTerminalNotification(terminal));\n\t\tif (lifetime.aborted) return;\n\t\tconst delivered = markTerminalNotificationDelivered(terminal, new Date().toISOString());\n\t\tif (!(await writeEntryIfUnchanged(config.agentDir, terminal.entryId, terminal, delivered))) {\n\t\t\tconfig.onDiagnostic?.(\n\t\t\t\t`process-matrix: terminal handoff changed before acknowledgement for ${terminal.entryId}`,\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\tconfig.onDiagnostic?.(\n\t\t\t`process-matrix: failed to deliver terminal handoff for ${terminal.entryId}: ${describeError(error)}`,\n\t\t);\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Worker branch\n// ---------------------------------------------------------------------------\n\nasync function startWorkerBranch(\n\tconfig: ProcessMatrixRuntimeConfig,\n\tinitialParentPid: number,\n\tnow: () => number,\n): Promise<ProcessMatrixRuntimeHandle> {\n\tconst parentSessionId = getParentSessionId();\n\tconst taskRef = (getProcessTaskRef() ?? config.taskRef)?.trim().slice(0, 512) || undefined;\n\tconst taskSummary = config.taskSummary?.trim().slice(0, 2_000) || undefined;\n\tconst laneKey = getBoundWorktreeLaneKey();\n\tconst contextLaneKey = config.agent.resumeContext.worktreeLaneKey;\n\tif (laneKey !== contextLaneKey) {\n\t\tthrow new TypeError(\n\t\t\t`Process-matrix agent lane '${contextLaneKey ?? \"none\"}' does not match active lane '${laneKey ?? \"none\"}'.`,\n\t\t);\n\t}\n\n\tlet entry = buildWorkerEntry({\n\t\tagent: config.agent,\n\t\tpid: process.pid,\n\t\thostname: osHostname(),\n\t\tnow: nowIso(now),\n\t\tparentPid: initialParentPid,\n\t\t...(parentSessionId !== undefined ? { parentSessionId } : {}),\n\t\t...(taskRef !== undefined ? { taskRef } : {}),\n\t\t...(taskSummary !== undefined ? { taskSummary } : {}),\n\t});\n\ttry {\n\t\tawait writeEntry(config.agentDir, entry);\n\t} catch (error) {\n\t\tconfig.onDiagnostic?.(`process-matrix: failed to register worker entry: ${describeError(error)}`);\n\t}\n\n\tlet currentParentPid = initialParentPid;\n\tlet currentParentSessionId = parentSessionId;\n\tlet stopped = false;\n\tlet timer: NodeJS.Timeout | undefined;\n\tlet ticking = false;\n\tlet preserveResumableOnExit = false;\n\tlet stopTask: Promise<void> | undefined;\n\tconst generationStartedAt = entry.startedAt;\n\tconst closeOnExit = (code: number | null = null): void => {\n\t\tif (preserveResumableOnExit) return;\n\t\ttry {\n\t\t\tconst terminal = markTerminal(entry, { code, signal: null }, nowIso(now));\n\t\t\tif (writeEntryIfUnchangedSync(config.agentDir, entry, terminal)) entry = terminal;\n\t\t} catch {\n\t\t\t// Best-effort. Dead-pid reconciliation remains authoritative.\n\t\t}\n\t};\n\tprocess.once(\"exit\", closeOnExit);\n\n\tconst closeWorker = async (): Promise<void> => {\n\t\tif (stopped) return;\n\t\tstopped = true;\n\t\tif (timer) clearInterval(timer);\n\t\ttimer = undefined;\n\t\tif (!preserveResumableOnExit) {\n\t\t\t// Normal runtime shutdown can await the lock and Windows rename retry policy. Keep the\n\t\t\t// synchronous exit hook only as a last-chance process-exit fallback: using it here made a\n\t\t\t// transient lock collision leave cooperative cleanup permanently in `winding_down`.\n\t\t\tfor (let attempt = 0; attempt < 3; attempt++) {\n\t\t\t\tconst expected = entry;\n\t\t\t\tconst terminal = markTerminal(expected, { code: null, signal: null }, nowIso(now));\n\t\t\t\ttry {\n\t\t\t\t\tif (await writeEntryIfUnchanged(config.agentDir, expected.entryId, expected, terminal)) {\n\t\t\t\t\t\tentry = terminal;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tconst current = await readEntry(config.agentDir, expected.entryId);\n\t\t\t\t\tif (current?.pid !== process.pid || current.startedAt !== generationStartedAt) {\n\t\t\t\t\t\tconfig.onDiagnostic?.(\"process-matrix: worker entry ownership moved to a newer process generation\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tentry = current;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconfig.onDiagnostic?.(\n\t\t\t\t\t\t`process-matrix: failed to persist worker terminal state: ${describeError(error)}`,\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tprocess.off(\"exit\", closeOnExit);\n\t};\n\n\tconst stop = (): Promise<void> => {\n\t\tstopTask ??= closeWorker();\n\t\treturn stopTask;\n\t};\n\n\tconst persist = async (\n\t\texpected: ProcessMatrixEntry,\n\t\tnext: ProcessMatrixEntry,\n\t\tfailureContext: string,\n\t): Promise<boolean> => {\n\t\ttry {\n\t\t\tif (await writeEntryIfUnchanged(config.agentDir, expected.entryId, expected, next)) {\n\t\t\t\tentry = next;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tconst current = await readEntry(config.agentDir, expected.entryId);\n\t\t\tif (current?.pid === process.pid) entry = current;\n\t\t\telse {\n\t\t\t\tstopped = true;\n\t\t\t\tif (timer) clearInterval(timer);\n\t\t\t\ttimer = undefined;\n\t\t\t\tprocess.off(\"exit\", closeOnExit);\n\t\t\t\tconfig.onDiagnostic?.(\"process-matrix: worker entry ownership moved to a newer process generation\");\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconfig.onDiagnostic?.(`process-matrix: ${failureContext}: ${describeError(error)}`);\n\t\t}\n\t\treturn false;\n\t};\n\n\tconst completeCooperativeCleanup = async (fresh: ProcessMatrixEntry): Promise<void> => {\n\t\tif (\n\t\t\t!(await persist(\n\t\t\t\tfresh,\n\t\t\t\tbeginWindDown(fresh, \"user_cleanup\", nowIso(now)),\n\t\t\t\t\"failed to write a master-requested worker wind-down\",\n\t\t\t))\n\t\t)\n\t\t\treturn;\n\t\tpreserveResumableOnExit = false;\n\t\temitRuntimeNotice(config, \"process-matrix: the parent session requested a cooperative cleanup. Winding down.\");\n\t\tawait stop();\n\t\tconfig.requestExit();\n\t};\n\n\tconst startHealthyWatch = (): void => {\n\t\ttimer = setInterval(() => {\n\t\t\tif (ticking) return;\n\t\t\tticking = true;\n\t\t\tvoid healthyTick().finally(() => {\n\t\t\t\tticking = false;\n\t\t\t});\n\t\t}, config.settings.watcherPollMs);\n\t\ttimer.unref?.();\n\t};\n\n\tconst declaredParentIsAlive = async (): Promise<boolean> => {\n\t\t// PID liveness alone is not process identity: a reused PID could otherwise keep a worker\n\t\t// attached to an unrelated process forever. The parent session's own fresh master entry binds\n\t\t// PID to a durable identity and proves that that exact session is still heartbeating.\n\t\tif (!currentParentSessionId || !config.isProcessAlive(currentParentPid)) return false;\n\t\tconst parent = await readEntry(config.agentDir, buildEntryId(\"master\", currentParentSessionId));\n\t\tif (!parent || parent.role !== \"master\" || parent.agent.resumeContext.sessionId !== currentParentSessionId)\n\t\t\treturn false;\n\t\tif (parent.pid !== currentParentPid || parent.status !== \"running\") return false;\n\t\tconst heartbeatAt = Date.parse(parent.heartbeatAt);\n\t\tconst maxAge = config.settings.heartbeatMs * 2 + config.settings.watcherPollMs;\n\t\treturn Number.isFinite(heartbeatAt) && now() - heartbeatAt <= maxAge;\n\t};\n\n\tconst healthyTick = async (): Promise<void> => {\n\t\tif (stopped) return;\n\t\tif (!(await declaredParentIsAlive())) {\n\t\t\tawait enterWindDown();\n\t\t\treturn;\n\t\t}\n\t\t// Still healthy: also poll for a master-initiated cooperative-cleanup directive.\n\t\tconst fresh = await readEntry(config.agentDir, entry.entryId);\n\t\tif (!fresh) return;\n\t\tconst directive = pollWorkerDirective(fresh, currentParentPid, { isPidAlive: config.isProcessAlive });\n\t\tif (directive.code !== \"user_cleanup\") return;\n\t\tawait completeCooperativeCleanup(fresh);\n\t};\n\n\tconst enterWindDown = async (): Promise<void> => {\n\t\tconst windDownAt = nowIso(now);\n\t\tconst expected = entry;\n\t\tconst resumable: ResumablePayload = { lastCode: \"resumable\", agent: structuredClone(config.agent) };\n\t\tif (expected.taskRef !== undefined) resumable.taskRef = expected.taskRef;\n\t\tif (expected.taskSummary !== undefined) resumable.taskSummary = expected.taskSummary;\n\t\tconst woundDown = markResumable(beginWindDown(expected, \"parent_lost\", windDownAt), resumable, windDownAt);\n\t\tif (!(await persist(expected, woundDown, \"failed to write worker wind-down\"))) return;\n\t\tif (timer) clearInterval(timer);\n\t\ttimer = undefined;\n\t\tpreserveResumableOnExit = true;\n\t\temitRuntimeNotice(\n\t\t\tconfig,\n\t\t\t`process-matrix: parent process (pid ${currentParentPid}) is gone. Winding down gracefully; this task is resumable.`,\n\t\t);\n\t\tstartGraceWatch();\n\t};\n\n\tconst startGraceWatch = (): void => {\n\t\tconst graceDeadline = now() + config.settings.adoptionGraceMs;\n\t\ttimer = setInterval(() => {\n\t\t\tif (ticking) return;\n\t\t\tticking = true;\n\t\t\tvoid graceTick(graceDeadline).finally(() => {\n\t\t\t\tticking = false;\n\t\t\t});\n\t\t}, config.settings.watcherPollMs);\n\t\ttimer.unref?.();\n\t};\n\n\tconst graceTick = async (graceDeadline: number): Promise<void> => {\n\t\tif (stopped) return;\n\t\tconst fresh = await readEntry(config.agentDir, entry.entryId);\n\t\tif (fresh) {\n\t\t\tconst directive = pollWorkerDirective(fresh, currentParentPid, { isPidAlive: config.isProcessAlive });\n\t\t\tif (directive.code === \"adopt\" && fresh.parentSessionId) {\n\t\t\t\t// The adopting master persists its session id with the pid. Require both on the next\n\t\t\t\t// healthy tick; accepting a pid-only adoption would reintroduce the PID-reuse bug.\n\t\t\t\tif (\n\t\t\t\t\t!(await persist(\n\t\t\t\t\t\tfresh,\n\t\t\t\t\t\tapplyAdoption(fresh, { parentPid: directive.parentPid, parentSessionId: fresh.parentSessionId }),\n\t\t\t\t\t\t\"failed to write worker adoption\",\n\t\t\t\t\t))\n\t\t\t\t)\n\t\t\t\t\treturn;\n\t\t\t\temitRuntimeNotice(\n\t\t\t\t\tconfig,\n\t\t\t\t\t`process-matrix: adopted by a new parent (pid ${directive.parentPid}). Resuming.`,\n\t\t\t\t);\n\t\t\t\tcurrentParentPid = directive.parentPid;\n\t\t\t\tcurrentParentSessionId = fresh.parentSessionId;\n\t\t\t\tpreserveResumableOnExit = false;\n\t\t\t\tif (timer) {\n\t\t\t\t\tclearInterval(timer);\n\t\t\t\t\ttimer = undefined;\n\t\t\t\t}\n\t\t\t\tstartHealthyWatch();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (directive.code === \"user_cleanup\") {\n\t\t\t\tawait completeCooperativeCleanup(fresh);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tif (now() >= graceDeadline) {\n\t\t\tawait stop();\n\t\t\tconfig.requestExit();\n\t\t}\n\t};\n\n\tstartHealthyWatch();\n\n\treturn { stop };\n}\n"]}
@@ -105,6 +105,8 @@ export declare function loadRawProjectContextFiles(options: {
105
105
  cwd: string;
106
106
  agentDir: string;
107
107
  projectTrusted?: boolean;
108
+ /** Testable filesystem case semantics; production defaults to the current platform. */
109
+ platform?: NodeJS.Platform;
108
110
  }): Array<{
109
111
  path: string;
110
112
  rawContent: string;
@@ -1 +1 @@
1
- {"version":3,"file":"resource-loader.d.ts","sourceRoot":"","sources":["../../src/core/resource-loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resource-loader.d.ts","sourceRoot":"","sources":["../../src/core/resource-loader.ts"],"names":[],"mappings":"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"}
@@ -157,23 +157,35 @@ function loadRawContextFilesFromDir(dir) {
157
157
  export function loadRawProjectContextFiles(options) {
158
158
  const resolvedCwd = resolvePath(options.cwd);
159
159
  const resolvedAgentDir = resolvePath(options.agentDir);
160
+ const platform = options.platform ?? process.platform;
161
+ const pathIdentity = (filePath) => {
162
+ const canonicalPath = canonicalizePath(filePath);
163
+ return platform === "win32" ? canonicalPath.toLowerCase() : canonicalPath;
164
+ };
160
165
  const contextFiles = [];
161
- const seenPaths = new Set();
166
+ const seenPathIdentities = new Set();
162
167
  for (const globalContext of loadRawContextFilesFromDir(resolvedAgentDir)) {
168
+ const identity = pathIdentity(globalContext.path);
169
+ if (seenPathIdentities.has(identity))
170
+ continue;
171
+ seenPathIdentities.add(identity);
163
172
  contextFiles.push(globalContext);
164
- seenPaths.add(globalContext.path);
165
173
  }
166
174
  if (options.projectTrusted !== false) {
167
175
  const ancestorContextFiles = [];
168
176
  let currentDir = resolvedCwd;
169
177
  const root = resolve("/");
170
178
  while (true) {
171
- const contextFilesInDir = loadRawContextFilesFromDir(currentDir).filter((contextFile) => !seenPaths.has(contextFile.path));
179
+ const contextFilesInDir = [];
180
+ for (const contextFile of loadRawContextFilesFromDir(currentDir)) {
181
+ const identity = pathIdentity(contextFile.path);
182
+ if (seenPathIdentities.has(identity))
183
+ continue;
184
+ seenPathIdentities.add(identity);
185
+ contextFilesInDir.push(contextFile);
186
+ }
172
187
  if (contextFilesInDir.length > 0) {
173
188
  ancestorContextFiles.unshift(...contextFilesInDir);
174
- for (const contextFile of contextFilesInDir) {
175
- seenPaths.add(contextFile.path);
176
- }
177
189
  }
178
190
  if (currentDir === root)
179
191
  break;