@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.
- package/CHANGELOG.md +13 -1
- package/dist/builtin-extensions/lunr-todos.d.ts +6 -5
- package/dist/builtin-extensions/lunr-todos.d.ts.map +1 -1
- package/dist/builtin-extensions/lunr-todos.js +9 -7
- package/dist/builtin-extensions/lunr-todos.js.map +1 -1
- package/dist/builtin-extensions/pi-intercom/broker/spawn.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-intercom/broker/spawn.js +30 -21
- package/dist/builtin-extensions/pi-intercom/broker/spawn.js.map +1 -1
- package/dist/builtin-extensions/pi-intercom/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-intercom/index.js +12 -3
- package/dist/builtin-extensions/pi-intercom/index.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.js +2 -2
- package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts +7 -6
- package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.js +63 -29
- package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js +2 -2
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts +3 -3
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js +3 -2
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.d.ts +1 -0
- package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.js +26 -7
- package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/result-intercom.d.ts +1 -0
- package/dist/builtin-extensions/pi-subagents/src/intercom/result-intercom.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/result-intercom.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/result-intercom.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts +2 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js +4 -3
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-job-tracker.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-job-tracker.js +2 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-job-tracker.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts +6 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js +23 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js +1 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts +100 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js +46 -31
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/top-level-async.d.ts +15 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/background/top-level-async.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/top-level-async.js +14 -4
- package/dist/builtin-extensions/pi-subagents/src/runs/background/top-level-async.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts +0 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +9 -9
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts +1 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.d.ts +3 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.js +2 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.js +5 -10
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/async-guidance.d.ts +2 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/async-guidance.d.ts.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/async-guidance.js +3 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/async-guidance.js.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts +5 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/types.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/delegation-adapters.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/delegation-adapters.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts +7 -0
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js +11 -7
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts +4 -0
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js +22 -23
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +2 -0
- package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.js +237 -374
- package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
- package/dist/core/customize.d.ts +2 -0
- package/dist/core/customize.d.ts.map +1 -1
- package/dist/core/customize.js +3 -0
- package/dist/core/customize.js.map +1 -1
- package/dist/core/settings-manager.d.ts +4 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +11 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/subagent-spinner-setting.d.ts +6 -0
- package/dist/core/subagent-spinner-setting.d.ts.map +1 -0
- package/dist/core/subagent-spinner-setting.js +12 -0
- package/dist/core/subagent-spinner-setting.js.map +1 -0
- package/dist/core/subagent-spinner.d.ts +4 -0
- package/dist/core/subagent-spinner.d.ts.map +1 -0
- package/dist/core/subagent-spinner.js +6 -0
- package/dist/core/subagent-spinner.js.map +1 -0
- package/dist/modes/interactive/components/settings-selector.d.ts +4 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +73 -1
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/extension-widget-order.d.ts +8 -0
- package/dist/modes/interactive/extension-widget-order.d.ts.map +1 -0
- package/dist/modes/interactive/extension-widget-order.js +37 -0
- package/dist/modes/interactive/extension-widget-order.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +15 -22
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/node-runtime/{agent-session-services-75JKASCW.js → agent-session-services-C743TYQE.js} +4 -3
- package/dist/node-runtime/{builtin-extensions-X4JMM4ZS.js → builtin-extensions-JCOPAAB5.js} +2 -1
- package/dist/node-runtime/{chunk-QKFMBRAL.js → chunk-2BUAYZ7K.js} +94 -25
- package/dist/node-runtime/chunk-5ZH3ZFIZ.js +308 -0
- package/dist/node-runtime/{chunk-BBUVIEZB.js → chunk-A3KMVBZV.js} +10 -1
- package/dist/node-runtime/{chunk-K3646JTM.js → chunk-AWVD5IEY.js} +7 -307
- package/dist/node-runtime/{chunk-ELWEXVO5.js → chunk-GB2MGFLI.js} +11 -11
- package/dist/node-runtime/chunk-LISUTZS3.js +19 -0
- package/dist/node-runtime/{chunk-AL2FMKKM.js → chunk-PDNXVXMD.js} +12 -12
- package/dist/node-runtime/{chunk-46ECNOLF.js → chunk-SY2TFMLO.js} +57 -17
- package/dist/node-runtime/{chunk-HQCKFM2O.js → chunk-VGYZ3APQ.js} +3 -0
- package/dist/node-runtime/{chunk-4DJ6HEGH.js → chunk-VZR3NCM7.js} +3 -3
- package/dist/node-runtime/{chunk-AOFXZQKA.js → chunk-W3SILANP.js} +1 -1
- package/dist/node-runtime/{chunk-CBGB57XT.js → chunk-WLLDXJRT.js} +10 -0
- package/dist/node-runtime/{chunk-JYNNB7DU.js → chunk-XI77KVKA.js} +2 -2
- package/dist/node-runtime/{chunk-4CSFRBCN.js → chunk-Y5KOEMBH.js} +1 -1
- package/dist/node-runtime/{chunk-AROOY4BB.js → chunk-YMEAYRBE.js} +1 -1
- package/dist/node-runtime/{command-RBTRL55A.js → command-P4NYCJ2M.js} +1 -1
- package/dist/node-runtime/{customize-XEXL2DGQ.js → customize-LF5VST47.js} +1 -1
- package/dist/node-runtime/{gateway-L4ANRTVE.js → gateway-BM6NLOH4.js} +1 -1
- package/dist/node-runtime/index.js +13 -11
- package/dist/node-runtime/{interactive-mode-HPUNH7SV.js → interactive-mode-EVVBA64D.js} +9 -7
- package/dist/node-runtime/{lunr-cron-NNYTWTGF.js → lunr-cron-4VHP4E4B.js} +1 -1
- package/dist/node-runtime/main.js +11 -9
- package/dist/node-runtime/{package-manager-cli-7RKSZGEN.js → package-manager-cli-N37546V5.js} +5 -4
- package/dist/node-runtime/{pi-intercom-DDQMRNPJ.js → pi-intercom-NV2LW6X7.js} +34 -33
- package/dist/node-runtime/{pi-subagents-T5WMMLBB.js → pi-subagents-6MUIFNDM.js} +286 -345
- package/dist/node-runtime/rpc-entry.js +11 -9
- package/dist/node-runtime/{runtime-bridges-NJQERQ72.js → runtime-bridges-2VQTLPOZ.js} +2 -2
- package/dist/node-runtime/{settings-manager-GHPTUN7R.js → settings-manager-CUGAZWAB.js} +2 -1
- package/dist/node-runtime/{subagent-executor-SRFC26SJ.js → subagent-executor-MH4A7CCF.js} +14 -46
- package/dist/node-runtime/{update-cli-L3JIBH2U.js → update-cli-XTZMZGOL.js} +2 -1
- package/docs/features.md +6 -2
- package/docs/settings.md +2 -1
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- 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
|