@ashx-j/lunr 0.2.20 → 0.2.21

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 (172) hide show
  1. package/CHANGELOG.md +13 -1
  2. package/dist/builtin-extensions/lunr-todos.d.ts +6 -5
  3. package/dist/builtin-extensions/lunr-todos.d.ts.map +1 -1
  4. package/dist/builtin-extensions/lunr-todos.js +9 -7
  5. package/dist/builtin-extensions/lunr-todos.js.map +1 -1
  6. package/dist/builtin-extensions/pi-intercom/broker/spawn.d.ts.map +1 -1
  7. package/dist/builtin-extensions/pi-intercom/broker/spawn.js +30 -21
  8. package/dist/builtin-extensions/pi-intercom/broker/spawn.js.map +1 -1
  9. package/dist/builtin-extensions/pi-intercom/index.d.ts.map +1 -1
  10. package/dist/builtin-extensions/pi-intercom/index.js +12 -3
  11. package/dist/builtin-extensions/pi-intercom/index.js.map +1 -1
  12. package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.d.ts.map +1 -1
  13. package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.js +2 -2
  14. package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.js.map +1 -1
  15. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts +7 -6
  16. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
  17. package/dist/builtin-extensions/pi-subagents/src/extension/index.js +63 -29
  18. package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
  19. package/dist/builtin-extensions/pi-subagents/src/extension/schemas.d.ts.map +1 -1
  20. package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js +2 -2
  21. package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js.map +1 -1
  22. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts +3 -3
  23. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts.map +1 -1
  24. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js +3 -2
  25. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js.map +1 -1
  26. package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.d.ts +1 -0
  27. package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.d.ts.map +1 -1
  28. package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.js +26 -7
  29. package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.js.map +1 -1
  30. package/dist/builtin-extensions/pi-subagents/src/intercom/result-intercom.d.ts +1 -0
  31. package/dist/builtin-extensions/pi-subagents/src/intercom/result-intercom.d.ts.map +1 -1
  32. package/dist/builtin-extensions/pi-subagents/src/intercom/result-intercom.js +1 -1
  33. package/dist/builtin-extensions/pi-subagents/src/intercom/result-intercom.js.map +1 -1
  34. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts +2 -0
  35. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts.map +1 -1
  36. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js +4 -3
  37. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js.map +1 -1
  38. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-job-tracker.d.ts.map +1 -1
  39. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-job-tracker.js +2 -0
  40. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-job-tracker.js.map +1 -1
  41. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts +6 -2
  42. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts.map +1 -1
  43. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js +23 -1
  44. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js.map +1 -1
  45. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.d.ts.map +1 -1
  46. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js +1 -0
  47. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js.map +1 -1
  48. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts +100 -0
  49. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts.map +1 -1
  50. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js +46 -31
  51. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js.map +1 -1
  52. package/dist/builtin-extensions/pi-subagents/src/runs/background/top-level-async.d.ts +15 -2
  53. package/dist/builtin-extensions/pi-subagents/src/runs/background/top-level-async.d.ts.map +1 -1
  54. package/dist/builtin-extensions/pi-subagents/src/runs/background/top-level-async.js +14 -4
  55. package/dist/builtin-extensions/pi-subagents/src/runs/background/top-level-async.js.map +1 -1
  56. package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.d.ts.map +1 -1
  57. package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.js +1 -1
  58. package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.js.map +1 -1
  59. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
  60. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js +1 -1
  61. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
  62. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts +0 -1
  63. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
  64. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +9 -9
  65. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
  66. package/dist/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.d.ts +1 -1
  67. package/dist/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.d.ts.map +1 -1
  68. package/dist/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.js +1 -1
  69. package/dist/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.js.map +1 -1
  70. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts +1 -0
  71. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts.map +1 -1
  72. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js.map +1 -1
  73. package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.d.ts +3 -0
  74. package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.d.ts.map +1 -1
  75. package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.js +2 -0
  76. package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.js.map +1 -1
  77. package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.d.ts +2 -2
  78. package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.d.ts.map +1 -1
  79. package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.js +5 -10
  80. package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.js.map +1 -1
  81. package/dist/builtin-extensions/pi-subagents/src/shared/async-guidance.d.ts +2 -0
  82. package/dist/builtin-extensions/pi-subagents/src/shared/async-guidance.d.ts.map +1 -0
  83. package/dist/builtin-extensions/pi-subagents/src/shared/async-guidance.js +3 -0
  84. package/dist/builtin-extensions/pi-subagents/src/shared/async-guidance.js.map +1 -0
  85. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts +5 -0
  86. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts.map +1 -1
  87. package/dist/builtin-extensions/pi-subagents/src/shared/types.js.map +1 -1
  88. package/dist/builtin-extensions/pi-subagents/src/slash/delegation-adapters.d.ts.map +1 -1
  89. package/dist/builtin-extensions/pi-subagents/src/slash/delegation-adapters.js.map +1 -1
  90. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts +7 -0
  91. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts.map +1 -1
  92. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js +11 -7
  93. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js.map +1 -1
  94. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts +4 -0
  95. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts.map +1 -1
  96. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js +22 -23
  97. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js.map +1 -1
  98. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +2 -0
  99. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
  100. package/dist/builtin-extensions/pi-subagents/src/tui/render.js +237 -374
  101. package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
  102. package/dist/core/customize.d.ts +2 -0
  103. package/dist/core/customize.d.ts.map +1 -1
  104. package/dist/core/customize.js +3 -0
  105. package/dist/core/customize.js.map +1 -1
  106. package/dist/core/settings-manager.d.ts +4 -0
  107. package/dist/core/settings-manager.d.ts.map +1 -1
  108. package/dist/core/settings-manager.js +11 -0
  109. package/dist/core/settings-manager.js.map +1 -1
  110. package/dist/core/subagent-spinner-setting.d.ts +6 -0
  111. package/dist/core/subagent-spinner-setting.d.ts.map +1 -0
  112. package/dist/core/subagent-spinner-setting.js +12 -0
  113. package/dist/core/subagent-spinner-setting.js.map +1 -0
  114. package/dist/core/subagent-spinner.d.ts +4 -0
  115. package/dist/core/subagent-spinner.d.ts.map +1 -0
  116. package/dist/core/subagent-spinner.js +6 -0
  117. package/dist/core/subagent-spinner.js.map +1 -0
  118. package/dist/modes/interactive/components/settings-selector.d.ts +4 -0
  119. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  120. package/dist/modes/interactive/components/settings-selector.js +73 -1
  121. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  122. package/dist/modes/interactive/extension-widget-order.d.ts +8 -0
  123. package/dist/modes/interactive/extension-widget-order.d.ts.map +1 -0
  124. package/dist/modes/interactive/extension-widget-order.js +37 -0
  125. package/dist/modes/interactive/extension-widget-order.js.map +1 -0
  126. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  127. package/dist/modes/interactive/interactive-mode.js +15 -22
  128. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  129. package/dist/node-runtime/{agent-session-services-75JKASCW.js → agent-session-services-C743TYQE.js} +4 -3
  130. package/dist/node-runtime/{builtin-extensions-X4JMM4ZS.js → builtin-extensions-JCOPAAB5.js} +2 -1
  131. package/dist/node-runtime/{chunk-QKFMBRAL.js → chunk-2BUAYZ7K.js} +94 -25
  132. package/dist/node-runtime/chunk-5ZH3ZFIZ.js +308 -0
  133. package/dist/node-runtime/{chunk-BBUVIEZB.js → chunk-A3KMVBZV.js} +10 -1
  134. package/dist/node-runtime/{chunk-K3646JTM.js → chunk-AWVD5IEY.js} +7 -307
  135. package/dist/node-runtime/{chunk-ELWEXVO5.js → chunk-GB2MGFLI.js} +11 -11
  136. package/dist/node-runtime/chunk-LISUTZS3.js +19 -0
  137. package/dist/node-runtime/{chunk-AL2FMKKM.js → chunk-PDNXVXMD.js} +12 -12
  138. package/dist/node-runtime/{chunk-46ECNOLF.js → chunk-SY2TFMLO.js} +57 -17
  139. package/dist/node-runtime/{chunk-HQCKFM2O.js → chunk-VGYZ3APQ.js} +3 -0
  140. package/dist/node-runtime/{chunk-4DJ6HEGH.js → chunk-VZR3NCM7.js} +3 -3
  141. package/dist/node-runtime/{chunk-AOFXZQKA.js → chunk-W3SILANP.js} +1 -1
  142. package/dist/node-runtime/{chunk-CBGB57XT.js → chunk-WLLDXJRT.js} +10 -0
  143. package/dist/node-runtime/{chunk-JYNNB7DU.js → chunk-XI77KVKA.js} +2 -2
  144. package/dist/node-runtime/{chunk-4CSFRBCN.js → chunk-Y5KOEMBH.js} +1 -1
  145. package/dist/node-runtime/{chunk-AROOY4BB.js → chunk-YMEAYRBE.js} +1 -1
  146. package/dist/node-runtime/{command-RBTRL55A.js → command-P4NYCJ2M.js} +1 -1
  147. package/dist/node-runtime/{customize-XEXL2DGQ.js → customize-LF5VST47.js} +1 -1
  148. package/dist/node-runtime/{gateway-L4ANRTVE.js → gateway-BM6NLOH4.js} +1 -1
  149. package/dist/node-runtime/index.js +13 -11
  150. package/dist/node-runtime/{interactive-mode-HPUNH7SV.js → interactive-mode-EVVBA64D.js} +9 -7
  151. package/dist/node-runtime/{lunr-cron-NNYTWTGF.js → lunr-cron-4VHP4E4B.js} +1 -1
  152. package/dist/node-runtime/main.js +11 -9
  153. package/dist/node-runtime/{package-manager-cli-7RKSZGEN.js → package-manager-cli-N37546V5.js} +5 -4
  154. package/dist/node-runtime/{pi-intercom-DDQMRNPJ.js → pi-intercom-NV2LW6X7.js} +34 -33
  155. package/dist/node-runtime/{pi-subagents-T5WMMLBB.js → pi-subagents-6MUIFNDM.js} +286 -345
  156. package/dist/node-runtime/rpc-entry.js +11 -9
  157. package/dist/node-runtime/{runtime-bridges-NJQERQ72.js → runtime-bridges-2VQTLPOZ.js} +2 -2
  158. package/dist/node-runtime/{settings-manager-GHPTUN7R.js → settings-manager-CUGAZWAB.js} +2 -1
  159. package/dist/node-runtime/{subagent-executor-SRFC26SJ.js → subagent-executor-MH4A7CCF.js} +14 -46
  160. package/dist/node-runtime/{update-cli-L3JIBH2U.js → update-cli-XTZMZGOL.js} +2 -1
  161. package/docs/features.md +6 -2
  162. package/docs/settings.md +2 -1
  163. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  164. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  165. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  166. package/examples/extensions/gondolin/package-lock.json +2 -2
  167. package/examples/extensions/gondolin/package.json +1 -1
  168. package/examples/extensions/sandbox/package-lock.json +2 -2
  169. package/examples/extensions/sandbox/package.json +1 -1
  170. package/examples/extensions/with-deps/package-lock.json +2 -2
  171. package/examples/extensions/with-deps/package.json +1 -1
  172. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"result-watcher.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/background/result-watcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAI9B,OAAO,EAEN,KAAK,gBAAgB,EAGrB,KAAK,aAAa,EAClB,MAAM,uBAAuB,CAAC;AAc/B,KAAK,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,GAAG,cAAc,GAAG,YAAY,GAAG,aAAa,GAAG,WAAW,GAAG,cAAc,GAAG,OAAO,CAAC,CAAC;AAE9I,KAAK,mBAAmB,GAAG;IAC1B,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,YAAY,EAAE,OAAO,YAAY,CAAC;IAClC,WAAW,EAAE,OAAO,WAAW,CAAC;IAChC,aAAa,EAAE,OAAO,aAAa,CAAC;CACpC,CAAC;AAEF,KAAK,iBAAiB,GAAG;IACxB,EAAE,CAAC,EAAE,eAAe,CAAC;IACrB,MAAM,CAAC,EAAE,mBAAmB,CAAC;CAC7B,CAAC;AA6DF,wBAAgB,mBAAmB,CAClC,EAAE,EAAE;IAAE,MAAM,EAAE,gBAAgB,CAAC;IAAC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;CAAE,EACrF,KAAK,EAAE,aAAa,EACpB,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,MAAM,EACvB,IAAI,GAAE,iBAAsB,GAC1B;IACF,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,oBAAoB,EAAE,MAAM,IAAI,CAAC;IACjC,iBAAiB,EAAE,MAAM,IAAI,CAAC;CAC9B,CA4NA","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { buildCompletionKey, markSeenWithTtl } from \"./completion-dedupe.ts\";\nimport { createFileCoalescer } from \"../../shared/file-coalescer.ts\";\nimport {\n\tSUBAGENT_ASYNC_COMPLETE_EVENT,\n\ttype IntercomEventBus,\n\ttype NestedRunSummary,\n\ttype SubagentResultIntercomChild,\n\ttype SubagentState,\n} from \"../../shared/types.ts\";\nimport {\n\tattachNestedChildrenToResultChildren,\n\tbuildSubagentResultIntercomPayload,\n\tcompactNestedResultChildren,\n\tdeliverSubagentResultIntercomEvent,\n\tresolveSubagentResultStatus,\n} from \"../../intercom/result-intercom.ts\";\nimport { projectNestedRegistryForRoot, sanitizeSummary } from \"../shared/nested-events.ts\";\nimport { resolveWatchPath } from \"../../shared/utils.ts\";\n\nconst WATCHER_RESTART_DELAY_MS = 3000;\nconst POLL_INTERVAL_MS = 3000;\n\ntype ResultWatcherFs = Pick<typeof fs, \"existsSync\" | \"readFileSync\" | \"unlinkSync\" | \"readdirSync\" | \"mkdirSync\" | \"realpathSync\" | \"watch\">;\n\ntype ResultWatcherTimers = {\n\tsetTimeout: typeof setTimeout;\n\tclearTimeout: typeof clearTimeout;\n\tsetInterval: typeof setInterval;\n\tclearInterval: typeof clearInterval;\n};\n\ntype ResultWatcherDeps = {\n\tfs?: ResultWatcherFs;\n\ttimers?: ResultWatcherTimers;\n};\n\ntype ResultFileChild = {\n\tagent?: string;\n\toutput?: string;\n\terror?: string;\n\tsuccess?: boolean;\n\tstate?: string;\n\tstopped?: boolean;\n\tsessionFile?: string;\n\tartifactPaths?: { outputPath?: string };\n\tintercomTarget?: string;\n\tchildren?: unknown;\n};\n\ntype ResultFileData = {\n\tid?: string;\n\trunId?: string;\n\tagent?: string;\n\tsuccess?: boolean;\n\tstate?: string;\n\tmode?: string;\n\tsummary?: string;\n\tresults?: ResultFileChild[];\n\tnestedChildren?: unknown;\n\tsessionId?: string;\n\tcwd?: string;\n\tsessionFile?: string;\n\tasyncDir?: string;\n\tintercomTarget?: string;\n};\n\nfunction sanitizeNestedResultChildren(value: unknown, resultPath: string, label: string, report: (message: string) => void): NestedRunSummary[] | undefined {\n\tif (value === undefined) return undefined;\n\tif (!Array.isArray(value)) {\n\t\treport(`Ignoring invalid nested children in subagent result file '${resultPath}' at ${label}: expected an array.`);\n\t\treturn undefined;\n\t}\n\tconst children = value.map((child) => sanitizeSummary(child)).filter((child): child is NestedRunSummary => Boolean(child));\n\tif (children.length !== value.length) {\n\t\treport(`Ignoring ${value.length - children.length} invalid nested child record(s) in subagent result file '${resultPath}' at ${label}.`);\n\t}\n\treturn children.length ? children : undefined;\n}\n\nfunction getErrorCode(error: unknown): string | undefined {\n\treturn typeof error === \"object\" && error !== null && \"code\" in error\n\t\t? (error as NodeJS.ErrnoException).code\n\t\t: undefined;\n}\n\nfunction isNotFoundError(error: unknown): boolean {\n\treturn getErrorCode(error) === \"ENOENT\";\n}\n\nfunction shouldFallBackToPolling(error: unknown): boolean {\n\tconst code = getErrorCode(error);\n\treturn code === \"EMFILE\" || code === \"ENOSPC\";\n}\n\n\nexport function createResultWatcher(\n\tpi: { events: IntercomEventBus; appendEntry?: (type: string, data: unknown) => void },\n\tstate: SubagentState,\n\tresultsDir: string,\n\tcompletionTtlMs: number,\n\tdeps: ResultWatcherDeps = {},\n): {\n\tstartResultWatcher: () => void;\n\tprimeExistingResults: () => void;\n\tstopResultWatcher: () => void;\n} {\n\tconst fsApi = deps.fs ?? fs;\n\tconst timers = deps.timers ?? { setTimeout, clearTimeout, setInterval, clearInterval };\n\n\tlet generation = 0;\n\tconst inFlight = new Set<string>();\n\tconst attempts = new Map<string, number>();\n\tconst report = (message: string, error?: unknown) => {\n\t\tpi.appendEntry?.(\"subagent_result_delivery\", { message, error: error instanceof Error ? error.message : error });\n\t};\n\n\tconst handleResult = async (file: string) => {\n\t\tif (inFlight.has(file) || (attempts.get(file) ?? 0) >= 3) return;\n\t\tconst currentGeneration = generation;\n\t\tconst sessionId = state.currentSessionId;\n\t\tconst isCurrent = () => generation === currentGeneration && state.currentSessionId === sessionId;\n\t\tconst resultPath = path.join(resultsDir, file);\n\t\tif (!fsApi.existsSync(resultPath)) return;\n\t\tinFlight.add(file);\n\t\ttry {\n\t\t\tconst data = JSON.parse(fsApi.readFileSync(resultPath, \"utf-8\")) as ResultFileData;\n\t\t\tif (typeof data.sessionId !== \"string\" || data.sessionId !== state.currentSessionId) return;\n\n\t\t\tconst runId = data.runId ?? data.id ?? file.replace(/\\.json$/i, \"\");\n\t\t\tconst hasExplicitNestedChildren = data.nestedChildren !== undefined;\n\t\t\tlet nestedChildren = compactNestedResultChildren(sanitizeNestedResultChildren(data.nestedChildren, resultPath, \"nestedChildren\", report));\n\t\t\tif (!nestedChildren?.length && !hasExplicitNestedChildren) {\n\t\t\t\ttry {\n\t\t\t\t\tnestedChildren = compactNestedResultChildren(projectNestedRegistryForRoot(runId)?.children);\n\t\t\t\t} catch (error) {\n\t\t\t\t\treport(`Failed to enrich subagent result file '${resultPath}' with nested registry children; will retry later:`, error);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst now = Date.now();\n\t\t\tconst completionKey = buildCompletionKey(data, `result:${file}`);\n\n\t\t\tconst hasResultChildren = Array.isArray(data.results) && data.results.length > 0;\n\t\t\tconst resultChildren = hasResultChildren\n\t\t\t\t? data.results!\n\t\t\t\t: [{\n\t\t\t\t\tagent: data.agent,\n\t\t\t\t\toutput: data.summary,\n\t\t\t\t\tsuccess: data.success,\n\t\t\t\t}];\n\t\t\tconst normalizedChildren = attachNestedChildrenToResultChildren(runId, resultChildren.map((result = {}, index): SubagentResultIntercomChild => {\n\t\t\t\tconst baseOutput = result.output ?? data.summary;\n\t\t\t\tconst hasRealOutput = typeof baseOutput === \"string\" && baseOutput.trim().length > 0;\n\t\t\t\tconst output = hasRealOutput ? baseOutput : \"(no output)\";\n\t\t\t\tconst summary = result.success === false && result.error\n\t\t\t\t\t? `${result.error}${hasRealOutput ? `\\n\\nOutput:\\n${baseOutput}` : \"\"}`\n\t\t\t\t\t: output;\n\t\t\t\tconst sessionPath = result.sessionFile ?? (resultChildren.length === 1 ? data.sessionFile : undefined);\n\t\t\t\tconst childNestedChildren = sanitizeNestedResultChildren(result.children, resultPath, `results[${index}].children`, report);\n\t\t\t\tconst childState = result.state === \"paused\" || result.state === \"stopped\"\n\t\t\t\t\t? result.state\n\t\t\t\t\t: result.stopped === true\n\t\t\t\t\t\t? \"stopped\"\n\t\t\t\t\t\t: data.state === \"paused\" || (!hasResultChildren && (data.state === \"stopped\" || typeof result.success !== \"boolean\"))\n\t\t\t\t\t\t\t? data.state\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\treturn {\n\t\t\t\t\tagent: result.agent ?? data.agent ?? `step-${index + 1}`,\n\t\t\t\t\tstatus: resolveSubagentResultStatus({\n\t\t\t\t\t\tsuccess: result.success,\n\t\t\t\t\t\tstate: childState,\n\t\t\t\t\t}),\n\t\t\t\t\tsummary,\n\t\t\t\t\tindex,\n\t\t\t\t\tartifactPath: result.artifactPaths?.outputPath,\n\t\t\t\t\t...(typeof sessionPath === \"string\" && fsApi.existsSync(sessionPath) ? { sessionPath } : {}),\n\t\t\t\t\t...(result.intercomTarget ? { intercomTarget: result.intercomTarget } : {}),\n\t\t\t\t\t...(childNestedChildren ? { children: childNestedChildren } : {}),\n\t\t\t\t};\n\t\t\t}), nestedChildren);\n\n\t\t\tif (!markSeenWithTtl(state.completionSeen, completionKey, now, completionTtlMs)) {\n\t\t\t\tpi.events.emit(SUBAGENT_ASYNC_COMPLETE_EVENT, {\n\t\t\t\t\t...data,\n\t\t\t\t\trunId,\n\t\t\t\t\t...(nestedChildren?.length ? { nestedChildren } : {}),\n\t\t\t\t\t...(Array.isArray(data.results) ? { results: hasResultChildren ? normalizedChildren.map((child, index) => ({\n\t\t\t\t\t\t...data.results![index], agent: child.agent, status: child.status, summary: child.summary,\n\t\t\t\t\t\tindex: child.index, artifactPath: child.artifactPath, sessionPath: child.sessionPath, children: child.children,\n\t\t\t\t\t})) : [] } : {}),\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (!isCurrent()) return;\n\t\t\tconst intercomTarget = data.state === \"stopped\" ? undefined : data.intercomTarget?.trim();\n\t\t\tif (intercomTarget) {\n\t\t\t\tconst mode = data.mode === \"single\" || data.mode === \"parallel\" || data.mode === \"chain\"\n\t\t\t\t\t? data.mode\n\t\t\t\t\t: resultChildren.length > 1 ? \"chain\" : \"single\";\n\t\t\t\tconst payload = buildSubagentResultIntercomPayload({\n\t\t\t\t\tto: intercomTarget,\n\t\t\t\t\trunId,\n\t\t\t\t\tmode,\n\t\t\t\t\tsource: \"async\",\n\t\t\t\t\tchildren: normalizedChildren,\n\t\t\t\t\tasyncId: data.id,\n\t\t\t\t\tasyncDir: data.asyncDir,\n\t\t\t\t});\n\t\t\t\tpayload.requestId = `async-result:${sessionId}:${completionKey}`;\n\t\t\t\tattempts.set(file, (attempts.get(file) ?? 0) + 1);\n\t\t\t\tconst delivered = await deliverSubagentResultIntercomEvent(pi.events, payload);\n\t\t\t\tif (!isCurrent()) return;\n\t\t\t\tif (!delivered) {\n\t\t\t\t\treport(`Async result delivery pending for '${runId}'; output retained.`, resultPath);\n\t\t\t\t\tif (attempts.get(file)! < 3) state.resultFileCoalescer.schedule(file, 1000);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (isCurrent()) fsApi.unlinkSync(resultPath);\n\t\t} catch (error) {\n\t\t\tif (isNotFoundError(error)) return;\n\t\t\treport(`Failed to process subagent result file '${resultPath}'.`, error);\n\t\t} finally {\n\t\t\tinFlight.delete(file);\n\t\t}\n\t};\n\n\tstate.resultFileCoalescer = createFileCoalescer((file) => {\n\t\tvoid handleResult(file);\n\t}, 50);\n\n\tconst primeExistingResults = () => {\n\t\ttry {\n\t\t\tfsApi.readdirSync(resultsDir)\n\t\t\t\t.filter((f) => f.endsWith(\".json\"))\n\t\t\t\t.forEach((file) => state.resultFileCoalescer.schedule(file, 0));\n\t\t} catch (error) {\n\t\t\tif (isNotFoundError(error)) return;\n\t\t\treport(`Failed to scan subagent result directory '${resultsDir}':`, error);\n\t\t}\n\t};\n\n\tconst startPollingFallback = (reason: unknown) => {\n\t\tstate.watcher?.close();\n\t\tstate.watcher = null;\n\t\tif (state.watcherRestartTimer) return;\n\n\t\treport(\n\t\t\t`Subagent result watcher for '${resultsDir}' fell back to polling because native fs.watch is unavailable (${getErrorCode(reason) ?? \"unknown error\"}).`,\n\t\t);\n\t\tprimeExistingResults();\n\t\tstate.watcherRestartTimer = timers.setInterval(primeExistingResults, POLL_INTERVAL_MS);\n\t\tstate.watcherRestartTimer.unref?.();\n\t};\n\n\tconst scheduleRestart = () => {\n\t\tif (state.watcherRestartTimer) return;\n\t\tstate.watcherRestartTimer = timers.setTimeout(() => {\n\t\t\tstate.watcherRestartTimer = null;\n\t\t\ttry {\n\t\t\t\tfsApi.mkdirSync(resultsDir, { recursive: true });\n\t\t\t\tstartResultWatcher();\n\t\t\t} catch (error) {\n\t\t\t\tif (shouldFallBackToPolling(error)) {\n\t\t\t\t\tstartPollingFallback(error);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treport(`Failed to restart subagent result watcher for '${resultsDir}':`, error);\n\t\t\t\tscheduleRestart();\n\t\t\t}\n\t\t}, WATCHER_RESTART_DELAY_MS);\n\t\tstate.watcherRestartTimer.unref?.();\n\t};\n\n\tconst startResultWatcher = () => {\n\t\tif (state.watcher) return;\n\t\tif (state.watcherRestartTimer) {\n\t\t\ttimers.clearTimeout(state.watcherRestartTimer);\n\t\t\ttimers.clearInterval(state.watcherRestartTimer);\n\t\t\tstate.watcherRestartTimer = null;\n\t\t}\n\t\ttry {\n\t\t\tconst watchDir = resolveWatchPath(resultsDir, fsApi.realpathSync.native);\n\t\t\tstate.watcher = fsApi.watch(watchDir, (ev, file) => {\n\t\t\t\tif (ev !== \"rename\" || !file) return;\n\t\t\t\tconst fileName = file.toString();\n\t\t\t\tif (!fileName.endsWith(\".json\")) return;\n\t\t\t\tstate.resultFileCoalescer.schedule(fileName);\n\t\t\t});\n\t\t\tstate.watcher.on(\"error\", (error) => {\n\t\t\t\tif (shouldFallBackToPolling(error)) {\n\t\t\t\t\tstartPollingFallback(error);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treport(`Subagent result watcher failed for '${resultsDir}':`, error);\n\t\t\t\tstate.watcher?.close();\n\t\t\t\tstate.watcher = null;\n\t\t\t\tscheduleRestart();\n\t\t\t});\n\t\t\tstate.watcher.unref?.();\n\t\t} catch (error) {\n\t\t\tif (shouldFallBackToPolling(error)) {\n\t\t\t\tstartPollingFallback(error);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treport(`Failed to start subagent result watcher for '${resultsDir}':`, error);\n\t\t\tstate.watcher = null;\n\t\t\tscheduleRestart();\n\t\t}\n\t};\n\n\tconst stopResultWatcher = () => {\n\t\tgeneration++;\n\t\tattempts.clear();\n\t\tstate.watcher?.close();\n\t\tstate.watcher = null;\n\t\tif (state.watcherRestartTimer) {\n\t\t\ttimers.clearTimeout(state.watcherRestartTimer);\n\t\t\ttimers.clearInterval(state.watcherRestartTimer);\n\t\t}\n\t\tstate.watcherRestartTimer = null;\n\t\tstate.resultFileCoalescer.clear();\n\t};\n\n\treturn { startResultWatcher, primeExistingResults, stopResultWatcher };\n}\n"]}
1
+ {"version":3,"file":"result-watcher.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/background/result-watcher.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAI9B,OAAO,EAEN,KAAK,gBAAgB,EAGrB,KAAK,aAAa,EAClB,MAAM,uBAAuB,CAAC;AAc/B,KAAK,eAAe,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,GAAG,cAAc,GAAG,YAAY,GAAG,aAAa,GAAG,WAAW,GAAG,cAAc,GAAG,OAAO,CAAC,CAAC;AAE9I,KAAK,mBAAmB,GAAG;IAC1B,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,YAAY,EAAE,OAAO,YAAY,CAAC;IAClC,WAAW,EAAE,OAAO,WAAW,CAAC;IAChC,aAAa,EAAE,OAAO,aAAa,CAAC;CACpC,CAAC;AAEF,KAAK,iBAAiB,GAAG;IACxB,EAAE,CAAC,EAAE,eAAe,CAAC;IACrB,MAAM,CAAC,EAAE,mBAAmB,CAAC;CAC7B,CAAC;AA6DF,wBAAgB,mBAAmB,CAClC,EAAE,EAAE;IAAE,MAAM,EAAE,gBAAgB,CAAC;IAAC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;CAAE,EACrF,KAAK,EAAE,aAAa,EACpB,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,MAAM,EACvB,IAAI,GAAE,iBAAsB,GAC1B;IACF,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,oBAAoB,EAAE,MAAM,IAAI,CAAC;IACjC,iBAAiB,EAAE,MAAM,IAAI,CAAC;CAC9B,CA6NA","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { buildCompletionKey, markSeenWithTtl } from \"./completion-dedupe.ts\";\nimport { createFileCoalescer } from \"../../shared/file-coalescer.ts\";\nimport {\n\tSUBAGENT_ASYNC_COMPLETE_EVENT,\n\ttype IntercomEventBus,\n\ttype NestedRunSummary,\n\ttype SubagentResultIntercomChild,\n\ttype SubagentState,\n} from \"../../shared/types.ts\";\nimport {\n\tattachNestedChildrenToResultChildren,\n\tbuildSubagentResultIntercomPayload,\n\tcompactNestedResultChildren,\n\tdeliverSubagentResultIntercomEvent,\n\tresolveSubagentResultStatus,\n} from \"../../intercom/result-intercom.ts\";\nimport { projectNestedRegistryForRoot, sanitizeSummary } from \"../shared/nested-events.ts\";\nimport { resolveWatchPath } from \"../../shared/utils.ts\";\n\nconst WATCHER_RESTART_DELAY_MS = 3000;\nconst POLL_INTERVAL_MS = 3000;\n\ntype ResultWatcherFs = Pick<typeof fs, \"existsSync\" | \"readFileSync\" | \"unlinkSync\" | \"readdirSync\" | \"mkdirSync\" | \"realpathSync\" | \"watch\">;\n\ntype ResultWatcherTimers = {\n\tsetTimeout: typeof setTimeout;\n\tclearTimeout: typeof clearTimeout;\n\tsetInterval: typeof setInterval;\n\tclearInterval: typeof clearInterval;\n};\n\ntype ResultWatcherDeps = {\n\tfs?: ResultWatcherFs;\n\ttimers?: ResultWatcherTimers;\n};\n\ntype ResultFileChild = {\n\tagent?: string;\n\toutput?: string;\n\terror?: string;\n\tsuccess?: boolean;\n\tstate?: string;\n\tstopped?: boolean;\n\tsessionFile?: string;\n\tartifactPaths?: { outputPath?: string };\n\tintercomTarget?: string;\n\tchildren?: unknown;\n};\n\ntype ResultFileData = {\n\tid?: string;\n\trunId?: string;\n\tagent?: string;\n\tsuccess?: boolean;\n\tstate?: string;\n\tmode?: string;\n\tsummary?: string;\n\tresults?: ResultFileChild[];\n\tnestedChildren?: unknown;\n\tsessionId?: string;\n\tcwd?: string;\n\tsessionFile?: string;\n\tasyncDir?: string;\n\tintercomTarget?: string;\n};\n\nfunction sanitizeNestedResultChildren(value: unknown, resultPath: string, label: string, report: (message: string) => void): NestedRunSummary[] | undefined {\n\tif (value === undefined) return undefined;\n\tif (!Array.isArray(value)) {\n\t\treport(`Ignoring invalid nested children in subagent result file '${resultPath}' at ${label}: expected an array.`);\n\t\treturn undefined;\n\t}\n\tconst children = value.map((child) => sanitizeSummary(child)).filter((child): child is NestedRunSummary => Boolean(child));\n\tif (children.length !== value.length) {\n\t\treport(`Ignoring ${value.length - children.length} invalid nested child record(s) in subagent result file '${resultPath}' at ${label}.`);\n\t}\n\treturn children.length ? children : undefined;\n}\n\nfunction getErrorCode(error: unknown): string | undefined {\n\treturn typeof error === \"object\" && error !== null && \"code\" in error\n\t\t? (error as NodeJS.ErrnoException).code\n\t\t: undefined;\n}\n\nfunction isNotFoundError(error: unknown): boolean {\n\treturn getErrorCode(error) === \"ENOENT\";\n}\n\nfunction shouldFallBackToPolling(error: unknown): boolean {\n\tconst code = getErrorCode(error);\n\treturn code === \"EMFILE\" || code === \"ENOSPC\";\n}\n\n\nexport function createResultWatcher(\n\tpi: { events: IntercomEventBus; appendEntry?: (type: string, data: unknown) => void },\n\tstate: SubagentState,\n\tresultsDir: string,\n\tcompletionTtlMs: number,\n\tdeps: ResultWatcherDeps = {},\n): {\n\tstartResultWatcher: () => void;\n\tprimeExistingResults: () => void;\n\tstopResultWatcher: () => void;\n} {\n\tconst fsApi = deps.fs ?? fs;\n\tconst timers = deps.timers ?? { setTimeout, clearTimeout, setInterval, clearInterval };\n\n\tlet generation = 0;\n\tconst inFlight = new Set<string>();\n\tconst attempts = new Map<string, number>();\n\tconst report = (message: string, error?: unknown) => {\n\t\tpi.appendEntry?.(\"subagent_result_delivery\", { message, error: error instanceof Error ? error.message : error });\n\t};\n\n\tconst handleResult = async (file: string) => {\n\t\tif (inFlight.has(file) || (attempts.get(file) ?? 0) >= 3) return;\n\t\tconst currentGeneration = generation;\n\t\tconst sessionId = state.currentSessionId;\n\t\tconst isCurrent = () => generation === currentGeneration && state.currentSessionId === sessionId;\n\t\tconst resultPath = path.join(resultsDir, file);\n\t\tif (!fsApi.existsSync(resultPath)) return;\n\t\tinFlight.add(file);\n\t\ttry {\n\t\t\tconst data = JSON.parse(fsApi.readFileSync(resultPath, \"utf-8\")) as ResultFileData;\n\t\t\tif (typeof data.sessionId !== \"string\" || data.sessionId !== state.currentSessionId) return;\n\n\t\t\tconst runId = data.runId ?? data.id ?? file.replace(/\\.json$/i, \"\");\n\t\t\tconst hasExplicitNestedChildren = data.nestedChildren !== undefined;\n\t\t\tlet nestedChildren = compactNestedResultChildren(sanitizeNestedResultChildren(data.nestedChildren, resultPath, \"nestedChildren\", report));\n\t\t\tif (!nestedChildren?.length && !hasExplicitNestedChildren) {\n\t\t\t\ttry {\n\t\t\t\t\tnestedChildren = compactNestedResultChildren(projectNestedRegistryForRoot(runId)?.children);\n\t\t\t\t} catch (error) {\n\t\t\t\t\treport(`Failed to enrich subagent result file '${resultPath}' with nested registry children; will retry later:`, error);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst now = Date.now();\n\t\t\tconst completionKey = buildCompletionKey(data, `result:${file}`);\n\n\t\t\tconst hasResultChildren = Array.isArray(data.results) && data.results.length > 0;\n\t\t\tconst resultChildren = hasResultChildren\n\t\t\t\t? data.results!\n\t\t\t\t: [{\n\t\t\t\t\tagent: data.agent,\n\t\t\t\t\toutput: data.summary,\n\t\t\t\t\tsuccess: data.success,\n\t\t\t\t}];\n\t\t\tconst normalizedChildren = attachNestedChildrenToResultChildren(runId, resultChildren.map((result = {}, index): SubagentResultIntercomChild => {\n\t\t\t\tconst baseOutput = result.output ?? data.summary;\n\t\t\t\tconst hasRealOutput = typeof baseOutput === \"string\" && baseOutput.trim().length > 0;\n\t\t\t\tconst output = hasRealOutput ? baseOutput : \"(no output)\";\n\t\t\t\tconst summary = result.success === false && result.error\n\t\t\t\t\t? `${result.error}${hasRealOutput ? `\\n\\nOutput:\\n${baseOutput}` : \"\"}`\n\t\t\t\t\t: output;\n\t\t\t\tconst sessionPath = result.sessionFile ?? (resultChildren.length === 1 ? data.sessionFile : undefined);\n\t\t\t\tconst childNestedChildren = sanitizeNestedResultChildren(result.children, resultPath, `results[${index}].children`, report);\n\t\t\t\tconst childState = result.state === \"paused\" || result.state === \"stopped\"\n\t\t\t\t\t? result.state\n\t\t\t\t\t: result.stopped === true\n\t\t\t\t\t\t? \"stopped\"\n\t\t\t\t\t\t: data.state === \"paused\" || (!hasResultChildren && (data.state === \"stopped\" || typeof result.success !== \"boolean\"))\n\t\t\t\t\t\t\t? data.state\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\treturn {\n\t\t\t\t\tagent: result.agent ?? data.agent ?? `step-${index + 1}`,\n\t\t\t\t\tstatus: resolveSubagentResultStatus({\n\t\t\t\t\t\tsuccess: result.success,\n\t\t\t\t\t\tstate: childState,\n\t\t\t\t\t}),\n\t\t\t\t\tsummary,\n\t\t\t\t\tindex,\n\t\t\t\t\tartifactPath: result.artifactPaths?.outputPath,\n\t\t\t\t\t...(typeof sessionPath === \"string\" && fsApi.existsSync(sessionPath) ? { sessionPath } : {}),\n\t\t\t\t\t...(result.intercomTarget ? { intercomTarget: result.intercomTarget } : {}),\n\t\t\t\t\t...(childNestedChildren ? { children: childNestedChildren } : {}),\n\t\t\t\t};\n\t\t\t}), nestedChildren);\n\n\t\t\tif (!markSeenWithTtl(state.completionSeen, completionKey, now, completionTtlMs)) {\n\t\t\t\tpi.events.emit(SUBAGENT_ASYNC_COMPLETE_EVENT, {\n\t\t\t\t\t...data,\n\t\t\t\t\trunId,\n\t\t\t\t\t...(nestedChildren?.length ? { nestedChildren } : {}),\n\t\t\t\t\t...(Array.isArray(data.results) ? { results: hasResultChildren ? normalizedChildren.map((child, index) => ({\n\t\t\t\t\t\t...data.results![index], agent: child.agent, status: child.status, summary: child.summary,\n\t\t\t\t\t\tindex: child.index, artifactPath: child.artifactPath, sessionPath: child.sessionPath, children: child.children,\n\t\t\t\t\t})) : [] } : {}),\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (!isCurrent()) return;\n\t\t\tconst intercomTarget = data.state === \"stopped\" ? undefined : data.intercomTarget?.trim();\n\t\t\tif (intercomTarget) {\n\t\t\t\tconst mode = data.mode === \"single\" || data.mode === \"parallel\" || data.mode === \"chain\"\n\t\t\t\t\t? data.mode\n\t\t\t\t\t: resultChildren.length > 1 ? \"chain\" : \"single\";\n\t\t\t\tconst payload = buildSubagentResultIntercomPayload({\n\t\t\t\t\tto: intercomTarget,\n\t\t\t\t\trunId,\n\t\t\t\t\tmode,\n\t\t\t\t\tsource: \"async\",\n\t\t\t\t\tchildren: normalizedChildren,\n\t\t\t\t\tasyncId: data.id,\n\t\t\t\t\tasyncDir: data.asyncDir,\n\t\t\t\t});\n\t\t\t\tpayload.requestId = `async-result:${sessionId}:${completionKey}`;\n\t\t\t\tpayload.ownerNotificationSessionId = sessionId;\n\t\t\t\tattempts.set(file, (attempts.get(file) ?? 0) + 1);\n\t\t\t\tconst delivered = await deliverSubagentResultIntercomEvent(pi.events, payload);\n\t\t\t\tif (!isCurrent()) return;\n\t\t\t\tif (!delivered) {\n\t\t\t\t\treport(`Async result delivery pending for '${runId}'; output retained.`, resultPath);\n\t\t\t\t\tif (attempts.get(file)! < 3) state.resultFileCoalescer.schedule(file, 1000);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (isCurrent()) fsApi.unlinkSync(resultPath);\n\t\t} catch (error) {\n\t\t\tif (isNotFoundError(error)) return;\n\t\t\treport(`Failed to process subagent result file '${resultPath}'.`, error);\n\t\t} finally {\n\t\t\tinFlight.delete(file);\n\t\t}\n\t};\n\n\tstate.resultFileCoalescer = createFileCoalescer((file) => {\n\t\tvoid handleResult(file);\n\t}, 50);\n\n\tconst primeExistingResults = () => {\n\t\ttry {\n\t\t\tfsApi.readdirSync(resultsDir)\n\t\t\t\t.filter((f) => f.endsWith(\".json\"))\n\t\t\t\t.forEach((file) => state.resultFileCoalescer.schedule(file, 0));\n\t\t} catch (error) {\n\t\t\tif (isNotFoundError(error)) return;\n\t\t\treport(`Failed to scan subagent result directory '${resultsDir}':`, error);\n\t\t}\n\t};\n\n\tconst startPollingFallback = (reason: unknown) => {\n\t\tstate.watcher?.close();\n\t\tstate.watcher = null;\n\t\tif (state.watcherRestartTimer) return;\n\n\t\treport(\n\t\t\t`Subagent result watcher for '${resultsDir}' fell back to polling because native fs.watch is unavailable (${getErrorCode(reason) ?? \"unknown error\"}).`,\n\t\t);\n\t\tprimeExistingResults();\n\t\tstate.watcherRestartTimer = timers.setInterval(primeExistingResults, POLL_INTERVAL_MS);\n\t\tstate.watcherRestartTimer.unref?.();\n\t};\n\n\tconst scheduleRestart = () => {\n\t\tif (state.watcherRestartTimer) return;\n\t\tstate.watcherRestartTimer = timers.setTimeout(() => {\n\t\t\tstate.watcherRestartTimer = null;\n\t\t\ttry {\n\t\t\t\tfsApi.mkdirSync(resultsDir, { recursive: true });\n\t\t\t\tstartResultWatcher();\n\t\t\t} catch (error) {\n\t\t\t\tif (shouldFallBackToPolling(error)) {\n\t\t\t\t\tstartPollingFallback(error);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treport(`Failed to restart subagent result watcher for '${resultsDir}':`, error);\n\t\t\t\tscheduleRestart();\n\t\t\t}\n\t\t}, WATCHER_RESTART_DELAY_MS);\n\t\tstate.watcherRestartTimer.unref?.();\n\t};\n\n\tconst startResultWatcher = () => {\n\t\tif (state.watcher) return;\n\t\tif (state.watcherRestartTimer) {\n\t\t\ttimers.clearTimeout(state.watcherRestartTimer);\n\t\t\ttimers.clearInterval(state.watcherRestartTimer);\n\t\t\tstate.watcherRestartTimer = null;\n\t\t}\n\t\ttry {\n\t\t\tconst watchDir = resolveWatchPath(resultsDir, fsApi.realpathSync.native);\n\t\t\tstate.watcher = fsApi.watch(watchDir, (ev, file) => {\n\t\t\t\tif (ev !== \"rename\" || !file) return;\n\t\t\t\tconst fileName = file.toString();\n\t\t\t\tif (!fileName.endsWith(\".json\")) return;\n\t\t\t\tstate.resultFileCoalescer.schedule(fileName);\n\t\t\t});\n\t\t\tstate.watcher.on(\"error\", (error) => {\n\t\t\t\tif (shouldFallBackToPolling(error)) {\n\t\t\t\t\tstartPollingFallback(error);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treport(`Subagent result watcher failed for '${resultsDir}':`, error);\n\t\t\t\tstate.watcher?.close();\n\t\t\t\tstate.watcher = null;\n\t\t\t\tscheduleRestart();\n\t\t\t});\n\t\t\tstate.watcher.unref?.();\n\t\t} catch (error) {\n\t\t\tif (shouldFallBackToPolling(error)) {\n\t\t\t\tstartPollingFallback(error);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treport(`Failed to start subagent result watcher for '${resultsDir}':`, error);\n\t\t\tstate.watcher = null;\n\t\t\tscheduleRestart();\n\t\t}\n\t};\n\n\tconst stopResultWatcher = () => {\n\t\tgeneration++;\n\t\tattempts.clear();\n\t\tstate.watcher?.close();\n\t\tstate.watcher = null;\n\t\tif (state.watcherRestartTimer) {\n\t\t\ttimers.clearTimeout(state.watcherRestartTimer);\n\t\t\ttimers.clearInterval(state.watcherRestartTimer);\n\t\t}\n\t\tstate.watcherRestartTimer = null;\n\t\tstate.resultFileCoalescer.clear();\n\t};\n\n\treturn { startResultWatcher, primeExistingResults, stopResultWatcher };\n}\n"]}
@@ -138,6 +138,7 @@ export function createResultWatcher(pi, state, resultsDir, completionTtlMs, deps
138
138
  asyncDir: data.asyncDir,
139
139
  });
140
140
  payload.requestId = `async-result:${sessionId}:${completionKey}`;
141
+ payload.ownerNotificationSessionId = sessionId;
141
142
  attempts.set(file, (attempts.get(file) ?? 0) + 1);
142
143
  const delivered = await deliverSubagentResultIntercomEvent(pi.events, payload);
143
144
  if (!isCurrent())
@@ -1 +1 @@
1
- {"version":3,"file":"result-watcher.js","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/background/result-watcher.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { buildCompletionKey, markSeenWithTtl } from \"./completion-dedupe.ts\";\nimport { createFileCoalescer } from \"../../shared/file-coalescer.ts\";\nimport {\n\tSUBAGENT_ASYNC_COMPLETE_EVENT,\n\ttype IntercomEventBus,\n\ttype NestedRunSummary,\n\ttype SubagentResultIntercomChild,\n\ttype SubagentState,\n} from \"../../shared/types.ts\";\nimport {\n\tattachNestedChildrenToResultChildren,\n\tbuildSubagentResultIntercomPayload,\n\tcompactNestedResultChildren,\n\tdeliverSubagentResultIntercomEvent,\n\tresolveSubagentResultStatus,\n} from \"../../intercom/result-intercom.ts\";\nimport { projectNestedRegistryForRoot, sanitizeSummary } from \"../shared/nested-events.ts\";\nimport { resolveWatchPath } from \"../../shared/utils.ts\";\n\nconst WATCHER_RESTART_DELAY_MS = 3000;\nconst POLL_INTERVAL_MS = 3000;\n\ntype ResultWatcherFs = Pick<typeof fs, \"existsSync\" | \"readFileSync\" | \"unlinkSync\" | \"readdirSync\" | \"mkdirSync\" | \"realpathSync\" | \"watch\">;\n\ntype ResultWatcherTimers = {\n\tsetTimeout: typeof setTimeout;\n\tclearTimeout: typeof clearTimeout;\n\tsetInterval: typeof setInterval;\n\tclearInterval: typeof clearInterval;\n};\n\ntype ResultWatcherDeps = {\n\tfs?: ResultWatcherFs;\n\ttimers?: ResultWatcherTimers;\n};\n\ntype ResultFileChild = {\n\tagent?: string;\n\toutput?: string;\n\terror?: string;\n\tsuccess?: boolean;\n\tstate?: string;\n\tstopped?: boolean;\n\tsessionFile?: string;\n\tartifactPaths?: { outputPath?: string };\n\tintercomTarget?: string;\n\tchildren?: unknown;\n};\n\ntype ResultFileData = {\n\tid?: string;\n\trunId?: string;\n\tagent?: string;\n\tsuccess?: boolean;\n\tstate?: string;\n\tmode?: string;\n\tsummary?: string;\n\tresults?: ResultFileChild[];\n\tnestedChildren?: unknown;\n\tsessionId?: string;\n\tcwd?: string;\n\tsessionFile?: string;\n\tasyncDir?: string;\n\tintercomTarget?: string;\n};\n\nfunction sanitizeNestedResultChildren(value: unknown, resultPath: string, label: string, report: (message: string) => void): NestedRunSummary[] | undefined {\n\tif (value === undefined) return undefined;\n\tif (!Array.isArray(value)) {\n\t\treport(`Ignoring invalid nested children in subagent result file '${resultPath}' at ${label}: expected an array.`);\n\t\treturn undefined;\n\t}\n\tconst children = value.map((child) => sanitizeSummary(child)).filter((child): child is NestedRunSummary => Boolean(child));\n\tif (children.length !== value.length) {\n\t\treport(`Ignoring ${value.length - children.length} invalid nested child record(s) in subagent result file '${resultPath}' at ${label}.`);\n\t}\n\treturn children.length ? children : undefined;\n}\n\nfunction getErrorCode(error: unknown): string | undefined {\n\treturn typeof error === \"object\" && error !== null && \"code\" in error\n\t\t? (error as NodeJS.ErrnoException).code\n\t\t: undefined;\n}\n\nfunction isNotFoundError(error: unknown): boolean {\n\treturn getErrorCode(error) === \"ENOENT\";\n}\n\nfunction shouldFallBackToPolling(error: unknown): boolean {\n\tconst code = getErrorCode(error);\n\treturn code === \"EMFILE\" || code === \"ENOSPC\";\n}\n\n\nexport function createResultWatcher(\n\tpi: { events: IntercomEventBus; appendEntry?: (type: string, data: unknown) => void },\n\tstate: SubagentState,\n\tresultsDir: string,\n\tcompletionTtlMs: number,\n\tdeps: ResultWatcherDeps = {},\n): {\n\tstartResultWatcher: () => void;\n\tprimeExistingResults: () => void;\n\tstopResultWatcher: () => void;\n} {\n\tconst fsApi = deps.fs ?? fs;\n\tconst timers = deps.timers ?? { setTimeout, clearTimeout, setInterval, clearInterval };\n\n\tlet generation = 0;\n\tconst inFlight = new Set<string>();\n\tconst attempts = new Map<string, number>();\n\tconst report = (message: string, error?: unknown) => {\n\t\tpi.appendEntry?.(\"subagent_result_delivery\", { message, error: error instanceof Error ? error.message : error });\n\t};\n\n\tconst handleResult = async (file: string) => {\n\t\tif (inFlight.has(file) || (attempts.get(file) ?? 0) >= 3) return;\n\t\tconst currentGeneration = generation;\n\t\tconst sessionId = state.currentSessionId;\n\t\tconst isCurrent = () => generation === currentGeneration && state.currentSessionId === sessionId;\n\t\tconst resultPath = path.join(resultsDir, file);\n\t\tif (!fsApi.existsSync(resultPath)) return;\n\t\tinFlight.add(file);\n\t\ttry {\n\t\t\tconst data = JSON.parse(fsApi.readFileSync(resultPath, \"utf-8\")) as ResultFileData;\n\t\t\tif (typeof data.sessionId !== \"string\" || data.sessionId !== state.currentSessionId) return;\n\n\t\t\tconst runId = data.runId ?? data.id ?? file.replace(/\\.json$/i, \"\");\n\t\t\tconst hasExplicitNestedChildren = data.nestedChildren !== undefined;\n\t\t\tlet nestedChildren = compactNestedResultChildren(sanitizeNestedResultChildren(data.nestedChildren, resultPath, \"nestedChildren\", report));\n\t\t\tif (!nestedChildren?.length && !hasExplicitNestedChildren) {\n\t\t\t\ttry {\n\t\t\t\t\tnestedChildren = compactNestedResultChildren(projectNestedRegistryForRoot(runId)?.children);\n\t\t\t\t} catch (error) {\n\t\t\t\t\treport(`Failed to enrich subagent result file '${resultPath}' with nested registry children; will retry later:`, error);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst now = Date.now();\n\t\t\tconst completionKey = buildCompletionKey(data, `result:${file}`);\n\n\t\t\tconst hasResultChildren = Array.isArray(data.results) && data.results.length > 0;\n\t\t\tconst resultChildren = hasResultChildren\n\t\t\t\t? data.results!\n\t\t\t\t: [{\n\t\t\t\t\tagent: data.agent,\n\t\t\t\t\toutput: data.summary,\n\t\t\t\t\tsuccess: data.success,\n\t\t\t\t}];\n\t\t\tconst normalizedChildren = attachNestedChildrenToResultChildren(runId, resultChildren.map((result = {}, index): SubagentResultIntercomChild => {\n\t\t\t\tconst baseOutput = result.output ?? data.summary;\n\t\t\t\tconst hasRealOutput = typeof baseOutput === \"string\" && baseOutput.trim().length > 0;\n\t\t\t\tconst output = hasRealOutput ? baseOutput : \"(no output)\";\n\t\t\t\tconst summary = result.success === false && result.error\n\t\t\t\t\t? `${result.error}${hasRealOutput ? `\\n\\nOutput:\\n${baseOutput}` : \"\"}`\n\t\t\t\t\t: output;\n\t\t\t\tconst sessionPath = result.sessionFile ?? (resultChildren.length === 1 ? data.sessionFile : undefined);\n\t\t\t\tconst childNestedChildren = sanitizeNestedResultChildren(result.children, resultPath, `results[${index}].children`, report);\n\t\t\t\tconst childState = result.state === \"paused\" || result.state === \"stopped\"\n\t\t\t\t\t? result.state\n\t\t\t\t\t: result.stopped === true\n\t\t\t\t\t\t? \"stopped\"\n\t\t\t\t\t\t: data.state === \"paused\" || (!hasResultChildren && (data.state === \"stopped\" || typeof result.success !== \"boolean\"))\n\t\t\t\t\t\t\t? data.state\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\treturn {\n\t\t\t\t\tagent: result.agent ?? data.agent ?? `step-${index + 1}`,\n\t\t\t\t\tstatus: resolveSubagentResultStatus({\n\t\t\t\t\t\tsuccess: result.success,\n\t\t\t\t\t\tstate: childState,\n\t\t\t\t\t}),\n\t\t\t\t\tsummary,\n\t\t\t\t\tindex,\n\t\t\t\t\tartifactPath: result.artifactPaths?.outputPath,\n\t\t\t\t\t...(typeof sessionPath === \"string\" && fsApi.existsSync(sessionPath) ? { sessionPath } : {}),\n\t\t\t\t\t...(result.intercomTarget ? { intercomTarget: result.intercomTarget } : {}),\n\t\t\t\t\t...(childNestedChildren ? { children: childNestedChildren } : {}),\n\t\t\t\t};\n\t\t\t}), nestedChildren);\n\n\t\t\tif (!markSeenWithTtl(state.completionSeen, completionKey, now, completionTtlMs)) {\n\t\t\t\tpi.events.emit(SUBAGENT_ASYNC_COMPLETE_EVENT, {\n\t\t\t\t\t...data,\n\t\t\t\t\trunId,\n\t\t\t\t\t...(nestedChildren?.length ? { nestedChildren } : {}),\n\t\t\t\t\t...(Array.isArray(data.results) ? { results: hasResultChildren ? normalizedChildren.map((child, index) => ({\n\t\t\t\t\t\t...data.results![index], agent: child.agent, status: child.status, summary: child.summary,\n\t\t\t\t\t\tindex: child.index, artifactPath: child.artifactPath, sessionPath: child.sessionPath, children: child.children,\n\t\t\t\t\t})) : [] } : {}),\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (!isCurrent()) return;\n\t\t\tconst intercomTarget = data.state === \"stopped\" ? undefined : data.intercomTarget?.trim();\n\t\t\tif (intercomTarget) {\n\t\t\t\tconst mode = data.mode === \"single\" || data.mode === \"parallel\" || data.mode === \"chain\"\n\t\t\t\t\t? data.mode\n\t\t\t\t\t: resultChildren.length > 1 ? \"chain\" : \"single\";\n\t\t\t\tconst payload = buildSubagentResultIntercomPayload({\n\t\t\t\t\tto: intercomTarget,\n\t\t\t\t\trunId,\n\t\t\t\t\tmode,\n\t\t\t\t\tsource: \"async\",\n\t\t\t\t\tchildren: normalizedChildren,\n\t\t\t\t\tasyncId: data.id,\n\t\t\t\t\tasyncDir: data.asyncDir,\n\t\t\t\t});\n\t\t\t\tpayload.requestId = `async-result:${sessionId}:${completionKey}`;\n\t\t\t\tattempts.set(file, (attempts.get(file) ?? 0) + 1);\n\t\t\t\tconst delivered = await deliverSubagentResultIntercomEvent(pi.events, payload);\n\t\t\t\tif (!isCurrent()) return;\n\t\t\t\tif (!delivered) {\n\t\t\t\t\treport(`Async result delivery pending for '${runId}'; output retained.`, resultPath);\n\t\t\t\t\tif (attempts.get(file)! < 3) state.resultFileCoalescer.schedule(file, 1000);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (isCurrent()) fsApi.unlinkSync(resultPath);\n\t\t} catch (error) {\n\t\t\tif (isNotFoundError(error)) return;\n\t\t\treport(`Failed to process subagent result file '${resultPath}'.`, error);\n\t\t} finally {\n\t\t\tinFlight.delete(file);\n\t\t}\n\t};\n\n\tstate.resultFileCoalescer = createFileCoalescer((file) => {\n\t\tvoid handleResult(file);\n\t}, 50);\n\n\tconst primeExistingResults = () => {\n\t\ttry {\n\t\t\tfsApi.readdirSync(resultsDir)\n\t\t\t\t.filter((f) => f.endsWith(\".json\"))\n\t\t\t\t.forEach((file) => state.resultFileCoalescer.schedule(file, 0));\n\t\t} catch (error) {\n\t\t\tif (isNotFoundError(error)) return;\n\t\t\treport(`Failed to scan subagent result directory '${resultsDir}':`, error);\n\t\t}\n\t};\n\n\tconst startPollingFallback = (reason: unknown) => {\n\t\tstate.watcher?.close();\n\t\tstate.watcher = null;\n\t\tif (state.watcherRestartTimer) return;\n\n\t\treport(\n\t\t\t`Subagent result watcher for '${resultsDir}' fell back to polling because native fs.watch is unavailable (${getErrorCode(reason) ?? \"unknown error\"}).`,\n\t\t);\n\t\tprimeExistingResults();\n\t\tstate.watcherRestartTimer = timers.setInterval(primeExistingResults, POLL_INTERVAL_MS);\n\t\tstate.watcherRestartTimer.unref?.();\n\t};\n\n\tconst scheduleRestart = () => {\n\t\tif (state.watcherRestartTimer) return;\n\t\tstate.watcherRestartTimer = timers.setTimeout(() => {\n\t\t\tstate.watcherRestartTimer = null;\n\t\t\ttry {\n\t\t\t\tfsApi.mkdirSync(resultsDir, { recursive: true });\n\t\t\t\tstartResultWatcher();\n\t\t\t} catch (error) {\n\t\t\t\tif (shouldFallBackToPolling(error)) {\n\t\t\t\t\tstartPollingFallback(error);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treport(`Failed to restart subagent result watcher for '${resultsDir}':`, error);\n\t\t\t\tscheduleRestart();\n\t\t\t}\n\t\t}, WATCHER_RESTART_DELAY_MS);\n\t\tstate.watcherRestartTimer.unref?.();\n\t};\n\n\tconst startResultWatcher = () => {\n\t\tif (state.watcher) return;\n\t\tif (state.watcherRestartTimer) {\n\t\t\ttimers.clearTimeout(state.watcherRestartTimer);\n\t\t\ttimers.clearInterval(state.watcherRestartTimer);\n\t\t\tstate.watcherRestartTimer = null;\n\t\t}\n\t\ttry {\n\t\t\tconst watchDir = resolveWatchPath(resultsDir, fsApi.realpathSync.native);\n\t\t\tstate.watcher = fsApi.watch(watchDir, (ev, file) => {\n\t\t\t\tif (ev !== \"rename\" || !file) return;\n\t\t\t\tconst fileName = file.toString();\n\t\t\t\tif (!fileName.endsWith(\".json\")) return;\n\t\t\t\tstate.resultFileCoalescer.schedule(fileName);\n\t\t\t});\n\t\t\tstate.watcher.on(\"error\", (error) => {\n\t\t\t\tif (shouldFallBackToPolling(error)) {\n\t\t\t\t\tstartPollingFallback(error);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treport(`Subagent result watcher failed for '${resultsDir}':`, error);\n\t\t\t\tstate.watcher?.close();\n\t\t\t\tstate.watcher = null;\n\t\t\t\tscheduleRestart();\n\t\t\t});\n\t\t\tstate.watcher.unref?.();\n\t\t} catch (error) {\n\t\t\tif (shouldFallBackToPolling(error)) {\n\t\t\t\tstartPollingFallback(error);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treport(`Failed to start subagent result watcher for '${resultsDir}':`, error);\n\t\t\tstate.watcher = null;\n\t\t\tscheduleRestart();\n\t\t}\n\t};\n\n\tconst stopResultWatcher = () => {\n\t\tgeneration++;\n\t\tattempts.clear();\n\t\tstate.watcher?.close();\n\t\tstate.watcher = null;\n\t\tif (state.watcherRestartTimer) {\n\t\t\ttimers.clearTimeout(state.watcherRestartTimer);\n\t\t\ttimers.clearInterval(state.watcherRestartTimer);\n\t\t}\n\t\tstate.watcherRestartTimer = null;\n\t\tstate.resultFileCoalescer.clear();\n\t};\n\n\treturn { startResultWatcher, primeExistingResults, stopResultWatcher };\n}\n"]}
1
+ {"version":3,"file":"result-watcher.js","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/background/result-watcher.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { buildCompletionKey, markSeenWithTtl } from \"./completion-dedupe.ts\";\nimport { createFileCoalescer } from \"../../shared/file-coalescer.ts\";\nimport {\n\tSUBAGENT_ASYNC_COMPLETE_EVENT,\n\ttype IntercomEventBus,\n\ttype NestedRunSummary,\n\ttype SubagentResultIntercomChild,\n\ttype SubagentState,\n} from \"../../shared/types.ts\";\nimport {\n\tattachNestedChildrenToResultChildren,\n\tbuildSubagentResultIntercomPayload,\n\tcompactNestedResultChildren,\n\tdeliverSubagentResultIntercomEvent,\n\tresolveSubagentResultStatus,\n} from \"../../intercom/result-intercom.ts\";\nimport { projectNestedRegistryForRoot, sanitizeSummary } from \"../shared/nested-events.ts\";\nimport { resolveWatchPath } from \"../../shared/utils.ts\";\n\nconst WATCHER_RESTART_DELAY_MS = 3000;\nconst POLL_INTERVAL_MS = 3000;\n\ntype ResultWatcherFs = Pick<typeof fs, \"existsSync\" | \"readFileSync\" | \"unlinkSync\" | \"readdirSync\" | \"mkdirSync\" | \"realpathSync\" | \"watch\">;\n\ntype ResultWatcherTimers = {\n\tsetTimeout: typeof setTimeout;\n\tclearTimeout: typeof clearTimeout;\n\tsetInterval: typeof setInterval;\n\tclearInterval: typeof clearInterval;\n};\n\ntype ResultWatcherDeps = {\n\tfs?: ResultWatcherFs;\n\ttimers?: ResultWatcherTimers;\n};\n\ntype ResultFileChild = {\n\tagent?: string;\n\toutput?: string;\n\terror?: string;\n\tsuccess?: boolean;\n\tstate?: string;\n\tstopped?: boolean;\n\tsessionFile?: string;\n\tartifactPaths?: { outputPath?: string };\n\tintercomTarget?: string;\n\tchildren?: unknown;\n};\n\ntype ResultFileData = {\n\tid?: string;\n\trunId?: string;\n\tagent?: string;\n\tsuccess?: boolean;\n\tstate?: string;\n\tmode?: string;\n\tsummary?: string;\n\tresults?: ResultFileChild[];\n\tnestedChildren?: unknown;\n\tsessionId?: string;\n\tcwd?: string;\n\tsessionFile?: string;\n\tasyncDir?: string;\n\tintercomTarget?: string;\n};\n\nfunction sanitizeNestedResultChildren(value: unknown, resultPath: string, label: string, report: (message: string) => void): NestedRunSummary[] | undefined {\n\tif (value === undefined) return undefined;\n\tif (!Array.isArray(value)) {\n\t\treport(`Ignoring invalid nested children in subagent result file '${resultPath}' at ${label}: expected an array.`);\n\t\treturn undefined;\n\t}\n\tconst children = value.map((child) => sanitizeSummary(child)).filter((child): child is NestedRunSummary => Boolean(child));\n\tif (children.length !== value.length) {\n\t\treport(`Ignoring ${value.length - children.length} invalid nested child record(s) in subagent result file '${resultPath}' at ${label}.`);\n\t}\n\treturn children.length ? children : undefined;\n}\n\nfunction getErrorCode(error: unknown): string | undefined {\n\treturn typeof error === \"object\" && error !== null && \"code\" in error\n\t\t? (error as NodeJS.ErrnoException).code\n\t\t: undefined;\n}\n\nfunction isNotFoundError(error: unknown): boolean {\n\treturn getErrorCode(error) === \"ENOENT\";\n}\n\nfunction shouldFallBackToPolling(error: unknown): boolean {\n\tconst code = getErrorCode(error);\n\treturn code === \"EMFILE\" || code === \"ENOSPC\";\n}\n\n\nexport function createResultWatcher(\n\tpi: { events: IntercomEventBus; appendEntry?: (type: string, data: unknown) => void },\n\tstate: SubagentState,\n\tresultsDir: string,\n\tcompletionTtlMs: number,\n\tdeps: ResultWatcherDeps = {},\n): {\n\tstartResultWatcher: () => void;\n\tprimeExistingResults: () => void;\n\tstopResultWatcher: () => void;\n} {\n\tconst fsApi = deps.fs ?? fs;\n\tconst timers = deps.timers ?? { setTimeout, clearTimeout, setInterval, clearInterval };\n\n\tlet generation = 0;\n\tconst inFlight = new Set<string>();\n\tconst attempts = new Map<string, number>();\n\tconst report = (message: string, error?: unknown) => {\n\t\tpi.appendEntry?.(\"subagent_result_delivery\", { message, error: error instanceof Error ? error.message : error });\n\t};\n\n\tconst handleResult = async (file: string) => {\n\t\tif (inFlight.has(file) || (attempts.get(file) ?? 0) >= 3) return;\n\t\tconst currentGeneration = generation;\n\t\tconst sessionId = state.currentSessionId;\n\t\tconst isCurrent = () => generation === currentGeneration && state.currentSessionId === sessionId;\n\t\tconst resultPath = path.join(resultsDir, file);\n\t\tif (!fsApi.existsSync(resultPath)) return;\n\t\tinFlight.add(file);\n\t\ttry {\n\t\t\tconst data = JSON.parse(fsApi.readFileSync(resultPath, \"utf-8\")) as ResultFileData;\n\t\t\tif (typeof data.sessionId !== \"string\" || data.sessionId !== state.currentSessionId) return;\n\n\t\t\tconst runId = data.runId ?? data.id ?? file.replace(/\\.json$/i, \"\");\n\t\t\tconst hasExplicitNestedChildren = data.nestedChildren !== undefined;\n\t\t\tlet nestedChildren = compactNestedResultChildren(sanitizeNestedResultChildren(data.nestedChildren, resultPath, \"nestedChildren\", report));\n\t\t\tif (!nestedChildren?.length && !hasExplicitNestedChildren) {\n\t\t\t\ttry {\n\t\t\t\t\tnestedChildren = compactNestedResultChildren(projectNestedRegistryForRoot(runId)?.children);\n\t\t\t\t} catch (error) {\n\t\t\t\t\treport(`Failed to enrich subagent result file '${resultPath}' with nested registry children; will retry later:`, error);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst now = Date.now();\n\t\t\tconst completionKey = buildCompletionKey(data, `result:${file}`);\n\n\t\t\tconst hasResultChildren = Array.isArray(data.results) && data.results.length > 0;\n\t\t\tconst resultChildren = hasResultChildren\n\t\t\t\t? data.results!\n\t\t\t\t: [{\n\t\t\t\t\tagent: data.agent,\n\t\t\t\t\toutput: data.summary,\n\t\t\t\t\tsuccess: data.success,\n\t\t\t\t}];\n\t\t\tconst normalizedChildren = attachNestedChildrenToResultChildren(runId, resultChildren.map((result = {}, index): SubagentResultIntercomChild => {\n\t\t\t\tconst baseOutput = result.output ?? data.summary;\n\t\t\t\tconst hasRealOutput = typeof baseOutput === \"string\" && baseOutput.trim().length > 0;\n\t\t\t\tconst output = hasRealOutput ? baseOutput : \"(no output)\";\n\t\t\t\tconst summary = result.success === false && result.error\n\t\t\t\t\t? `${result.error}${hasRealOutput ? `\\n\\nOutput:\\n${baseOutput}` : \"\"}`\n\t\t\t\t\t: output;\n\t\t\t\tconst sessionPath = result.sessionFile ?? (resultChildren.length === 1 ? data.sessionFile : undefined);\n\t\t\t\tconst childNestedChildren = sanitizeNestedResultChildren(result.children, resultPath, `results[${index}].children`, report);\n\t\t\t\tconst childState = result.state === \"paused\" || result.state === \"stopped\"\n\t\t\t\t\t? result.state\n\t\t\t\t\t: result.stopped === true\n\t\t\t\t\t\t? \"stopped\"\n\t\t\t\t\t\t: data.state === \"paused\" || (!hasResultChildren && (data.state === \"stopped\" || typeof result.success !== \"boolean\"))\n\t\t\t\t\t\t\t? data.state\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\treturn {\n\t\t\t\t\tagent: result.agent ?? data.agent ?? `step-${index + 1}`,\n\t\t\t\t\tstatus: resolveSubagentResultStatus({\n\t\t\t\t\t\tsuccess: result.success,\n\t\t\t\t\t\tstate: childState,\n\t\t\t\t\t}),\n\t\t\t\t\tsummary,\n\t\t\t\t\tindex,\n\t\t\t\t\tartifactPath: result.artifactPaths?.outputPath,\n\t\t\t\t\t...(typeof sessionPath === \"string\" && fsApi.existsSync(sessionPath) ? { sessionPath } : {}),\n\t\t\t\t\t...(result.intercomTarget ? { intercomTarget: result.intercomTarget } : {}),\n\t\t\t\t\t...(childNestedChildren ? { children: childNestedChildren } : {}),\n\t\t\t\t};\n\t\t\t}), nestedChildren);\n\n\t\t\tif (!markSeenWithTtl(state.completionSeen, completionKey, now, completionTtlMs)) {\n\t\t\t\tpi.events.emit(SUBAGENT_ASYNC_COMPLETE_EVENT, {\n\t\t\t\t\t...data,\n\t\t\t\t\trunId,\n\t\t\t\t\t...(nestedChildren?.length ? { nestedChildren } : {}),\n\t\t\t\t\t...(Array.isArray(data.results) ? { results: hasResultChildren ? normalizedChildren.map((child, index) => ({\n\t\t\t\t\t\t...data.results![index], agent: child.agent, status: child.status, summary: child.summary,\n\t\t\t\t\t\tindex: child.index, artifactPath: child.artifactPath, sessionPath: child.sessionPath, children: child.children,\n\t\t\t\t\t})) : [] } : {}),\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (!isCurrent()) return;\n\t\t\tconst intercomTarget = data.state === \"stopped\" ? undefined : data.intercomTarget?.trim();\n\t\t\tif (intercomTarget) {\n\t\t\t\tconst mode = data.mode === \"single\" || data.mode === \"parallel\" || data.mode === \"chain\"\n\t\t\t\t\t? data.mode\n\t\t\t\t\t: resultChildren.length > 1 ? \"chain\" : \"single\";\n\t\t\t\tconst payload = buildSubagentResultIntercomPayload({\n\t\t\t\t\tto: intercomTarget,\n\t\t\t\t\trunId,\n\t\t\t\t\tmode,\n\t\t\t\t\tsource: \"async\",\n\t\t\t\t\tchildren: normalizedChildren,\n\t\t\t\t\tasyncId: data.id,\n\t\t\t\t\tasyncDir: data.asyncDir,\n\t\t\t\t});\n\t\t\t\tpayload.requestId = `async-result:${sessionId}:${completionKey}`;\n\t\t\t\tpayload.ownerNotificationSessionId = sessionId;\n\t\t\t\tattempts.set(file, (attempts.get(file) ?? 0) + 1);\n\t\t\t\tconst delivered = await deliverSubagentResultIntercomEvent(pi.events, payload);\n\t\t\t\tif (!isCurrent()) return;\n\t\t\t\tif (!delivered) {\n\t\t\t\t\treport(`Async result delivery pending for '${runId}'; output retained.`, resultPath);\n\t\t\t\t\tif (attempts.get(file)! < 3) state.resultFileCoalescer.schedule(file, 1000);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (isCurrent()) fsApi.unlinkSync(resultPath);\n\t\t} catch (error) {\n\t\t\tif (isNotFoundError(error)) return;\n\t\t\treport(`Failed to process subagent result file '${resultPath}'.`, error);\n\t\t} finally {\n\t\t\tinFlight.delete(file);\n\t\t}\n\t};\n\n\tstate.resultFileCoalescer = createFileCoalescer((file) => {\n\t\tvoid handleResult(file);\n\t}, 50);\n\n\tconst primeExistingResults = () => {\n\t\ttry {\n\t\t\tfsApi.readdirSync(resultsDir)\n\t\t\t\t.filter((f) => f.endsWith(\".json\"))\n\t\t\t\t.forEach((file) => state.resultFileCoalescer.schedule(file, 0));\n\t\t} catch (error) {\n\t\t\tif (isNotFoundError(error)) return;\n\t\t\treport(`Failed to scan subagent result directory '${resultsDir}':`, error);\n\t\t}\n\t};\n\n\tconst startPollingFallback = (reason: unknown) => {\n\t\tstate.watcher?.close();\n\t\tstate.watcher = null;\n\t\tif (state.watcherRestartTimer) return;\n\n\t\treport(\n\t\t\t`Subagent result watcher for '${resultsDir}' fell back to polling because native fs.watch is unavailable (${getErrorCode(reason) ?? \"unknown error\"}).`,\n\t\t);\n\t\tprimeExistingResults();\n\t\tstate.watcherRestartTimer = timers.setInterval(primeExistingResults, POLL_INTERVAL_MS);\n\t\tstate.watcherRestartTimer.unref?.();\n\t};\n\n\tconst scheduleRestart = () => {\n\t\tif (state.watcherRestartTimer) return;\n\t\tstate.watcherRestartTimer = timers.setTimeout(() => {\n\t\t\tstate.watcherRestartTimer = null;\n\t\t\ttry {\n\t\t\t\tfsApi.mkdirSync(resultsDir, { recursive: true });\n\t\t\t\tstartResultWatcher();\n\t\t\t} catch (error) {\n\t\t\t\tif (shouldFallBackToPolling(error)) {\n\t\t\t\t\tstartPollingFallback(error);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treport(`Failed to restart subagent result watcher for '${resultsDir}':`, error);\n\t\t\t\tscheduleRestart();\n\t\t\t}\n\t\t}, WATCHER_RESTART_DELAY_MS);\n\t\tstate.watcherRestartTimer.unref?.();\n\t};\n\n\tconst startResultWatcher = () => {\n\t\tif (state.watcher) return;\n\t\tif (state.watcherRestartTimer) {\n\t\t\ttimers.clearTimeout(state.watcherRestartTimer);\n\t\t\ttimers.clearInterval(state.watcherRestartTimer);\n\t\t\tstate.watcherRestartTimer = null;\n\t\t}\n\t\ttry {\n\t\t\tconst watchDir = resolveWatchPath(resultsDir, fsApi.realpathSync.native);\n\t\t\tstate.watcher = fsApi.watch(watchDir, (ev, file) => {\n\t\t\t\tif (ev !== \"rename\" || !file) return;\n\t\t\t\tconst fileName = file.toString();\n\t\t\t\tif (!fileName.endsWith(\".json\")) return;\n\t\t\t\tstate.resultFileCoalescer.schedule(fileName);\n\t\t\t});\n\t\t\tstate.watcher.on(\"error\", (error) => {\n\t\t\t\tif (shouldFallBackToPolling(error)) {\n\t\t\t\t\tstartPollingFallback(error);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treport(`Subagent result watcher failed for '${resultsDir}':`, error);\n\t\t\t\tstate.watcher?.close();\n\t\t\t\tstate.watcher = null;\n\t\t\t\tscheduleRestart();\n\t\t\t});\n\t\t\tstate.watcher.unref?.();\n\t\t} catch (error) {\n\t\t\tif (shouldFallBackToPolling(error)) {\n\t\t\t\tstartPollingFallback(error);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treport(`Failed to start subagent result watcher for '${resultsDir}':`, error);\n\t\t\tstate.watcher = null;\n\t\t\tscheduleRestart();\n\t\t}\n\t};\n\n\tconst stopResultWatcher = () => {\n\t\tgeneration++;\n\t\tattempts.clear();\n\t\tstate.watcher?.close();\n\t\tstate.watcher = null;\n\t\tif (state.watcherRestartTimer) {\n\t\t\ttimers.clearTimeout(state.watcherRestartTimer);\n\t\t\ttimers.clearInterval(state.watcherRestartTimer);\n\t\t}\n\t\tstate.watcherRestartTimer = null;\n\t\tstate.resultFileCoalescer.clear();\n\t};\n\n\treturn { startResultWatcher, primeExistingResults, stopResultWatcher };\n}\n"]}
@@ -1,2 +1,102 @@
1
+ import type { Message } from "@ashx-j/lunr-ai";
2
+ import { type ArtifactConfig, type ArtifactPaths, type ChainOutputMap, type ModelAttempt, type NestedRouteInfo, type ResolvedTurnBudget, type ToolBudgetState, type TurnBudgetState } from "../../shared/types.ts";
3
+ import { type RunnerSubagentStep as SubagentStep } from "../shared/parallel-utils.ts";
4
+ interface ChildUsage {
5
+ input?: number;
6
+ inputTokens?: number;
7
+ output?: number;
8
+ outputTokens?: number;
9
+ cacheRead?: number;
10
+ cacheWrite?: number;
11
+ cost?: {
12
+ total?: number;
13
+ };
14
+ }
15
+ type ChildMessage = Message & {
16
+ model?: string;
17
+ errorMessage?: string;
18
+ usage?: ChildUsage;
19
+ };
20
+ interface ChildEvent {
21
+ type?: string;
22
+ message?: ChildMessage;
23
+ toolName?: string;
24
+ args?: Record<string, unknown>;
25
+ willRetry?: unknown;
26
+ }
27
+ /** Context for running a single step */
28
+ interface SingleStepContext {
29
+ supervisorSessionId?: string;
30
+ previousOutput: string;
31
+ outputs?: ChainOutputMap;
32
+ placeholder: string;
33
+ cwd: string;
34
+ sessionEnabled: boolean;
35
+ sessionDir?: string;
36
+ artifactsDir?: string;
37
+ artifactConfig?: Partial<ArtifactConfig>;
38
+ id: string;
39
+ flatIndex: number;
40
+ flatStepCount: number;
41
+ outputFile: string;
42
+ steerInboxDir?: string;
43
+ steerCapabilityPath?: string;
44
+ steerAckDir?: string;
45
+ transcriptPath?: string;
46
+ piPackageRoot?: string;
47
+ piArgv1?: string;
48
+ registerInterrupt?: (interrupt: (() => void) | undefined) => void;
49
+ registerTimeout?: (interrupt: (() => void) | undefined) => void;
50
+ registerStop?: (stop: (() => void) | undefined) => void;
51
+ registerTurnBudgetAbort?: (abort: ((message: string, state?: TurnBudgetState) => void) | undefined) => void;
52
+ timeoutSignal?: AbortSignal;
53
+ stopSignal?: AbortSignal;
54
+ timeoutMessage?: string;
55
+ stopMessage?: string;
56
+ turnBudget?: ResolvedTurnBudget;
57
+ childIntercomTarget?: string;
58
+ orchestratorIntercomTarget?: string;
59
+ nestedRoute?: NestedRouteInfo;
60
+ onAttemptStart?: (attempt: {
61
+ model?: string;
62
+ thinking?: string;
63
+ }) => void;
64
+ onChildEvent?: (event: ChildEvent) => void;
65
+ onWriterProcess?: (writer: {
66
+ state: "none" | "spawning";
67
+ } | {
68
+ state: "running";
69
+ pid: number;
70
+ }) => void;
71
+ skipAcceptance?: () => boolean;
72
+ }
73
+ /** Run a single pi agent step, returning output and metadata */
74
+ export declare function runSingleStep(step: SubagentStep, ctx: SingleStepContext): Promise<{
75
+ agent: string;
76
+ output: string;
77
+ exitCode: number | null;
78
+ error?: string;
79
+ model?: string;
80
+ attemptedModels?: string[];
81
+ modelAttempts?: ModelAttempt[];
82
+ artifactPaths?: ArtifactPaths;
83
+ transcriptPath?: string;
84
+ transcriptError?: string;
85
+ interrupted?: boolean;
86
+ timedOut?: boolean;
87
+ stopped?: boolean;
88
+ turnBudget?: TurnBudgetState;
89
+ turnBudgetExceeded?: boolean;
90
+ wrapUpRequested?: boolean;
91
+ toolBudget?: ToolBudgetState;
92
+ toolBudgetBlocked?: boolean;
93
+ sessionFile?: string;
94
+ intercomTarget?: string;
95
+ completionGuardTriggered?: boolean;
96
+ structuredOutput?: unknown;
97
+ structuredOutputPath?: string;
98
+ structuredOutputSchemaPath?: string;
99
+ acceptance?: import("../../shared/types.ts").AcceptanceLedger;
100
+ }>;
1
101
  export {};
2
102
  //# sourceMappingURL=subagent-runner.d.ts.map