@ashx-j/lunr-dev 0.2.13-dev.3.1 → 0.2.13-dev.4.1

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 (120) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/builtin-extensions/ashxj-tui.d.ts +2 -1
  3. package/dist/builtin-extensions/ashxj-tui.d.ts.map +1 -1
  4. package/dist/builtin-extensions/ashxj-tui.js +7 -17
  5. package/dist/builtin-extensions/ashxj-tui.js.map +1 -1
  6. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts +2 -0
  7. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
  8. package/dist/builtin-extensions/pi-subagents/src/extension/index.js +27 -22
  9. package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
  10. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts.map +1 -1
  11. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js +5 -2
  12. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js.map +1 -1
  13. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.d.ts.map +1 -1
  14. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.js +12 -1
  15. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.js.map +1 -1
  16. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-status.d.ts +1 -0
  17. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-status.d.ts.map +1 -1
  18. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-status.js +3 -2
  19. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-status.js.map +1 -1
  20. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-append.d.ts.map +1 -1
  21. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-append.js +1 -0
  22. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-append.js.map +1 -1
  23. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.d.ts.map +1 -1
  24. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.js +3 -0
  25. package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.js.map +1 -1
  26. package/dist/builtin-extensions/pi-subagents/src/runs/background/fleet-view.d.ts.map +1 -1
  27. package/dist/builtin-extensions/pi-subagents/src/runs/background/fleet-view.js +3 -3
  28. package/dist/builtin-extensions/pi-subagents/src/runs/background/fleet-view.js.map +1 -1
  29. package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.d.ts.map +1 -1
  30. package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.js +2 -2
  31. package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.js.map +1 -1
  32. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts.map +1 -1
  33. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js +3 -0
  34. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js.map +1 -1
  35. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts.map +1 -1
  36. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js +7 -1
  37. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js.map +1 -1
  38. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
  39. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js +2 -0
  40. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
  41. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts +1 -0
  42. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
  43. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +19 -3
  44. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
  45. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts +10 -1
  46. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts.map +1 -1
  47. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js +19 -0
  48. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js.map +1 -1
  49. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts +1 -0
  50. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts.map +1 -1
  51. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js.map +1 -1
  52. package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.d.ts +2 -1
  53. package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.d.ts.map +1 -1
  54. package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.js +17 -0
  55. package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.js.map +1 -1
  56. package/dist/builtin-extensions/pi-subagents/src/shared/formatters.d.ts +3 -1
  57. package/dist/builtin-extensions/pi-subagents/src/shared/formatters.d.ts.map +1 -1
  58. package/dist/builtin-extensions/pi-subagents/src/shared/formatters.js +14 -3
  59. package/dist/builtin-extensions/pi-subagents/src/shared/formatters.js.map +1 -1
  60. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts +14 -0
  61. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts.map +1 -1
  62. package/dist/builtin-extensions/pi-subagents/src/shared/types.js.map +1 -1
  63. package/dist/builtin-extensions/pi-subagents/src/tui/fleet.d.ts.map +1 -1
  64. package/dist/builtin-extensions/pi-subagents/src/tui/fleet.js +2 -2
  65. package/dist/builtin-extensions/pi-subagents/src/tui/fleet.js.map +1 -1
  66. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
  67. package/dist/builtin-extensions/pi-subagents/src/tui/render.js +12 -10
  68. package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
  69. package/dist/core/customize.d.ts +2 -4
  70. package/dist/core/customize.d.ts.map +1 -1
  71. package/dist/core/customize.js +2 -8
  72. package/dist/core/customize.js.map +1 -1
  73. package/dist/core/settings-manager.d.ts +0 -6
  74. package/dist/core/settings-manager.d.ts.map +1 -1
  75. package/dist/core/settings-manager.js +0 -17
  76. package/dist/core/settings-manager.js.map +1 -1
  77. package/dist/core/slash-commands.d.ts.map +1 -1
  78. package/dist/core/slash-commands.js +1 -0
  79. package/dist/core/slash-commands.js.map +1 -1
  80. package/dist/migrations.d.ts +2 -0
  81. package/dist/migrations.d.ts.map +1 -1
  82. package/dist/migrations.js +14 -4
  83. package/dist/migrations.js.map +1 -1
  84. package/dist/modes/interactive/components/assistant-message.d.ts +1 -3
  85. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  86. package/dist/modes/interactive/components/assistant-message.js +4 -32
  87. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  88. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  89. package/dist/modes/interactive/components/custom-editor.js +2 -1
  90. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  91. package/dist/modes/interactive/components/plan-message.d.ts +1 -3
  92. package/dist/modes/interactive/components/plan-message.d.ts.map +1 -1
  93. package/dist/modes/interactive/components/plan-message.js +1 -16
  94. package/dist/modes/interactive/components/plan-message.js.map +1 -1
  95. package/dist/modes/interactive/components/settings-selector.d.ts +0 -4
  96. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  97. package/dist/modes/interactive/components/settings-selector.js +10 -30
  98. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  99. package/dist/modes/interactive/components/user-message.d.ts +1 -3
  100. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  101. package/dist/modes/interactive/components/user-message.js +2 -19
  102. package/dist/modes/interactive/components/user-message.js.map +1 -1
  103. package/dist/modes/interactive/interactive-mode.d.ts +2 -0
  104. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  105. package/dist/modes/interactive/interactive-mode.js +29 -34
  106. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  107. package/dist/modes/interactive/theme/moon.json +0 -1
  108. package/dist/modes/interactive/theme/theme-schema.json +3 -3
  109. package/dist/modes/interactive/theme/theme.d.ts +1 -1
  110. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  111. package/dist/modes/interactive/theme/theme.js +0 -6
  112. package/dist/modes/interactive/theme/theme.js.map +1 -1
  113. package/docs/features.md +2 -2
  114. package/docs/keybindings.md +1 -1
  115. package/docs/quickstart.md +1 -1
  116. package/docs/settings.md +1 -3
  117. package/docs/terminal-setup.md +2 -2
  118. package/docs/usage.md +2 -1
  119. package/docs/windows.md +1 -1
  120. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"async-status.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/background/async-status.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { formatDuration, formatModelThinking, formatTokens, shortenPath } from \"../../shared/formatters.ts\";\nimport { formatActivityLabel, formatParallelOutcome } from \"../../shared/status-format.ts\";\nimport { type ActivityState, type AsyncJobStep, type AsyncParallelGroupStatus, type AsyncStatus, type CostSummary, type NestedRunSummary, type SteeringStatus, type SubagentRunMode, type TokenUsage, type TurnBudgetState } from \"../../shared/types.ts\";\nimport { readStatus } from \"../../shared/utils.ts\";\nimport { attachRootChildrenToSteps, buildNestedRouteIndex, type NestedRoute, projectNestedEvents } from \"../shared/nested-events.ts\";\nimport { formatNestedRunStatusLines } from \"../shared/nested-render.ts\";\nimport { flatToLogicalStepIndex, normalizeParallelGroups } from \"./parallel-groups.ts\";\nimport { reconcileAsyncRun, reconcileNestedAsyncDescendants } from \"./stale-run-reconciler.ts\";\n\ninterface AsyncRunStepSummary {\n\tindex: number;\n\tagent: string;\n\tlabel?: string;\n\tphase?: string;\n\toutputName?: string;\n\tstructured?: boolean;\n\tstatus: AsyncJobStep[\"status\"];\n\tactivityState?: ActivityState;\n\tlastActivityAt?: number;\n\tcurrentTool?: string;\n\tcurrentToolArgs?: string;\n\tcurrentToolStartedAt?: number;\n\tcurrentPath?: string;\n\trecentTools?: Array<{ tool: string; args: string; endMs: number }>;\n\trecentOutput?: string[];\n\tturnCount?: number;\n\ttoolCount?: number;\n\tsteering?: SteeringStatus;\n\tdurationMs?: number;\n\ttokens?: TokenUsage;\n\ttotalCost?: CostSummary;\n\tskills?: string[];\n\tmodel?: string;\n\tthinking?: string;\n\tattemptedModels?: string[];\n\terror?: string;\n\ttimedOut?: boolean;\n\tstopped?: boolean;\n\tturnBudget?: TurnBudgetState;\n\tturnBudgetExceeded?: boolean;\n\twrapUpRequested?: boolean;\n\tchildren?: NestedRunSummary[];\n}\n\nexport interface AsyncRunSummary {\n\tid: string;\n\tasyncDir: string;\n\tsessionId?: string;\n\tstate: \"queued\" | \"running\" | \"complete\" | \"failed\" | \"paused\" | \"stopped\";\n\terror?: string;\n\tactivityState?: ActivityState;\n\tlastActivityAt?: number;\n\tcurrentTool?: string;\n\tcurrentToolStartedAt?: number;\n\tcurrentPath?: string;\n\tturnCount?: number;\n\ttoolCount?: number;\n\tsteering?: SteeringStatus;\n\tmode: SubagentRunMode;\n\tcwd?: string;\n\tstartedAt: number;\n\tlastUpdate?: number;\n\tendedAt?: number;\n\ttimeoutMs?: number;\n\tdeadlineAt?: number;\n\ttimedOut?: boolean;\n\tstopped?: boolean;\n\tturnBudget?: TurnBudgetState;\n\tturnBudgetExceeded?: boolean;\n\twrapUpRequested?: boolean;\n\tcurrentStep?: number;\n\tchainStepCount?: number;\n\tpendingAppends?: number;\n\tparallelGroups?: AsyncParallelGroupStatus[];\n\tsteps: AsyncRunStepSummary[];\n\tsessionDir?: string;\n\toutputFile?: string;\n\ttotalTokens?: TokenUsage;\n\ttotalCost?: CostSummary;\n\tsessionFile?: string;\n\tnestedChildren?: NestedRunSummary[];\n\tnestedWarnings?: string[];\n}\n\ninterface AsyncRunListOptions {\n\tstates?: Array<AsyncRunSummary[\"state\"]>;\n\tsessionId?: string;\n\tlimit?: number;\n\tresultsDir?: string;\n\tkill?: (pid: number, signal?: NodeJS.Signals | 0) => boolean;\n\tnow?: () => number;\n\treconcile?: boolean;\n}\n\nfunction getErrorMessage(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error);\n}\n\nfunction isNotFoundError(error: unknown): boolean {\n\treturn typeof error === \"object\"\n\t\t&& error !== null\n\t\t&& \"code\" in error\n\t\t&& (error as NodeJS.ErrnoException).code === \"ENOENT\";\n}\n\nfunction isAsyncRunDir(root: string, entry: string): boolean {\n\tconst entryPath = path.join(root, entry);\n\ttry {\n\t\treturn fs.statSync(entryPath).isDirectory();\n\t} catch (error) {\n\t\tif (isNotFoundError(error)) return false;\n\t\tthrow new Error(`Failed to inspect async run path '${entryPath}': ${getErrorMessage(error)}`, {\n\t\t\tcause: error instanceof Error ? error : undefined,\n\t\t});\n\t}\n}\n\nfunction outputFileMtime(outputFile: string | undefined): number | undefined {\n\tif (!outputFile) return undefined;\n\ttry {\n\t\treturn fs.statSync(outputFile).mtimeMs;\n\t} catch (error) {\n\t\tif (isNotFoundError(error)) return undefined;\n\t\tthrow new Error(`Failed to inspect async output file '${outputFile}': ${getErrorMessage(error)}`, {\n\t\t\tcause: error instanceof Error ? error : undefined,\n\t\t});\n\t}\n}\n\nfunction deriveAsyncActivityState(asyncDir: string, status: AsyncStatus): { activityState?: ActivityState; lastActivityAt?: number } {\n\tif (status.state !== \"running\") return { activityState: status.activityState, lastActivityAt: status.lastActivityAt };\n\tconst outputPath = status.outputFile ? (path.isAbsolute(status.outputFile) ? status.outputFile : path.join(asyncDir, status.outputFile)) : undefined;\n\tconst currentStep = typeof status.currentStep === \"number\" ? status.steps?.[status.currentStep] : undefined;\n\treturn {\n\t\tactivityState: status.activityState,\n\t\tlastActivityAt: status.lastActivityAt ?? outputFileMtime(outputPath) ?? currentStep?.lastActivityAt ?? currentStep?.startedAt ?? status.startedAt,\n\t};\n}\n\nfunction statusToSummary(asyncDir: string, status: AsyncStatus & { cwd?: string }, nestedWarnings: string[] = [], nestedRoute?: NestedRoute): AsyncRunSummary {\n\tif (status.sessionId !== undefined && typeof status.sessionId !== \"string\") {\n\t\tthrow new Error(`Invalid async status '${path.join(asyncDir, \"status.json\")}': sessionId must be a string.`);\n\t}\n\tconst { activityState, lastActivityAt } = deriveAsyncActivityState(asyncDir, status);\n\tconst steps = status.steps ?? [];\n\tconst chainStepCount = status.chainStepCount ?? steps.length;\n\tconst parallelGroups = normalizeParallelGroups(status.parallelGroups, steps.length, chainStepCount);\n\tlet nestedChildren: NestedRunSummary[] = [];\n\tif (nestedWarnings.length === 0 && nestedRoute) {\n\t\ttry {\n\t\t\t// The route is resolved by the caller via buildNestedRouteIndex, so this\n\t\t\t// avoids a fresh scan of the nested-events directory per run.\n\t\t\tnestedChildren = projectNestedEvents(nestedRoute)?.children ?? [];\n\t\t} catch (error) {\n\t\t\tnestedWarnings.push(`Nested status unavailable: ${getErrorMessage(error)}`);\n\t\t}\n\t}\n\tconst summarizedSteps = steps.map((step, index) => {\n\t\tconst stepActivityState = step.activityState;\n\t\tconst stepLastActivityAt = step.lastActivityAt;\n\t\treturn {\n\t\t\tindex,\n\t\t\tagent: step.agent,\n\t\t\t...(step.label ? { label: step.label } : {}),\n\t\t\t...(step.phase ? { phase: step.phase } : {}),\n\t\t\t...(step.outputName ? { outputName: step.outputName } : {}),\n\t\t\t...(step.structured ? { structured: step.structured } : {}),\n\t\t\tstatus: step.status,\n\t\t\t...(stepActivityState ? { activityState: stepActivityState } : {}),\n\t\t\t...(stepLastActivityAt ? { lastActivityAt: stepLastActivityAt } : {}),\n\t\t\t...(step.currentTool ? { currentTool: step.currentTool } : {}),\n\t\t\t...(step.currentToolArgs ? { currentToolArgs: step.currentToolArgs } : {}),\n\t\t\t...(step.currentToolStartedAt ? { currentToolStartedAt: step.currentToolStartedAt } : {}),\n\t\t\t...(step.currentPath ? { currentPath: step.currentPath } : {}),\n\t\t\t...(step.recentTools ? { recentTools: step.recentTools.map((tool) => ({ ...tool })) } : {}),\n\t\t\t...(step.recentOutput ? { recentOutput: [...step.recentOutput] } : {}),\n\t\t\t...(step.turnCount !== undefined ? { turnCount: step.turnCount } : {}),\n\t\t\t...(step.toolCount !== undefined ? { toolCount: step.toolCount } : {}),\n\t\t\t...(step.steering ? { steering: step.steering } : {}),\n\t\t\t...(step.durationMs !== undefined ? { durationMs: step.durationMs } : {}),\n\t\t\t...(step.tokens ? { tokens: step.tokens } : {}),\n\t\t\t...(step.totalCost ? { totalCost: step.totalCost } : {}),\n\t\t\t...(step.skills ? { skills: step.skills } : {}),\n\t\t\t...(step.model ? { model: step.model } : {}),\n\t\t\t...(step.thinking ? { thinking: step.thinking } : {}),\n\t\t\t...(step.attemptedModels ? { attemptedModels: step.attemptedModels } : {}),\n\t\t\t...(step.error ? { error: step.error } : {}),\n\t\t\t...(step.timedOut !== undefined ? { timedOut: step.timedOut } : {}),\n\t\t\t...(step.stopped !== undefined ? { stopped: step.stopped } : {}),\n\t\t\t...(step.turnBudget ? { turnBudget: step.turnBudget } : {}),\n\t\t\t...(step.turnBudgetExceeded !== undefined ? { turnBudgetExceeded: step.turnBudgetExceeded } : {}),\n\t\t\t...(step.wrapUpRequested !== undefined ? { wrapUpRequested: step.wrapUpRequested } : {}),\n\t\t\t...(step.children?.length ? { children: step.children } : {}),\n\t\t};\n\t});\n\tattachRootChildrenToSteps(status.runId || path.basename(asyncDir), summarizedSteps, nestedChildren);\n\treturn {\n\t\tid: status.runId || path.basename(asyncDir),\n\t\tasyncDir,\n\t\t...(status.sessionId ? { sessionId: status.sessionId } : {}),\n\t\tstate: status.state,\n\t\t...(status.error ? { error: status.error } : {}),\n\t\tactivityState,\n\t\tlastActivityAt,\n\t\tcurrentTool: status.currentTool,\n\t\tcurrentToolStartedAt: status.currentToolStartedAt,\n\t\tcurrentPath: status.currentPath,\n\t\tturnCount: status.turnCount,\n\t\ttoolCount: status.toolCount,\n\t\tsteering: status.steering,\n\t\tmode: status.mode,\n\t\tcwd: status.cwd,\n\t\tstartedAt: status.startedAt,\n\t\tlastUpdate: status.lastUpdate,\n\t\tendedAt: status.endedAt,\n\t\t...(status.timeoutMs !== undefined ? { timeoutMs: status.timeoutMs } : {}),\n\t\t...(status.deadlineAt !== undefined ? { deadlineAt: status.deadlineAt } : {}),\n\t\t...(status.timedOut !== undefined ? { timedOut: status.timedOut } : {}),\n\t\t...(status.stopped !== undefined ? { stopped: status.stopped } : {}),\n\t\t...(status.turnBudget ? { turnBudget: status.turnBudget } : {}),\n\t\t...(status.turnBudgetExceeded !== undefined ? { turnBudgetExceeded: status.turnBudgetExceeded } : {}),\n\t\t...(status.wrapUpRequested !== undefined ? { wrapUpRequested: status.wrapUpRequested } : {}),\n\t\tcurrentStep: status.currentStep,\n\t\t...(status.chainStepCount !== undefined ? { chainStepCount: status.chainStepCount } : {}),\n\t\t...(status.pendingAppends !== undefined ? { pendingAppends: status.pendingAppends } : {}),\n\t\t...(parallelGroups.length ? { parallelGroups } : {}),\n\t\tsteps: summarizedSteps,\n\t\t...(nestedChildren.length ? { nestedChildren } : {}),\n\t\t...(nestedWarnings.length ? { nestedWarnings } : {}),\n\t\t...(status.sessionDir ? { sessionDir: status.sessionDir } : {}),\n\t\t...(status.outputFile ? { outputFile: status.outputFile } : {}),\n\t\t...(status.totalTokens ? { totalTokens: status.totalTokens } : {}),\n\t\t...(status.totalCost ? { totalCost: status.totalCost } : {}),\n\t\t...(status.sessionFile ? { sessionFile: status.sessionFile } : {}),\n\t};\n}\n\nexport function summarizeAsyncStatus(asyncDir: string, status: AsyncStatus & { cwd?: string }): AsyncRunSummary {\n\treturn statusToSummary(asyncDir, status);\n}\n\nfunction sortRuns(runs: AsyncRunSummary[]): AsyncRunSummary[] {\n\tconst rank = (state: AsyncRunSummary[\"state\"]): number => {\n\t\tswitch (state) {\n\t\t\tcase \"running\": return 0;\n\t\t\tcase \"queued\": return 1;\n\t\t\tcase \"failed\": return 2;\n\t\t\tcase \"stopped\": return 2;\n\t\t\tcase \"paused\": return 2;\n\t\t\tcase \"complete\": return 3;\n\t\t}\n\t};\n\treturn [...runs].sort((a, b) => {\n\t\tconst byState = rank(a.state) - rank(b.state);\n\t\tif (byState !== 0) return byState;\n\t\tconst aTime = a.lastUpdate ?? a.endedAt ?? a.startedAt;\n\t\tconst bTime = b.lastUpdate ?? b.endedAt ?? b.startedAt;\n\t\treturn bTime - aTime;\n\t});\n}\n\nexport function listAsyncRuns(asyncDirRoot: string, options: AsyncRunListOptions = {}): AsyncRunSummary[] {\n\tlet entries: string[];\n\ttry {\n\t\tentries = fs.readdirSync(asyncDirRoot).filter((entry) => isAsyncRunDir(asyncDirRoot, entry));\n\t} catch (error) {\n\t\tif (isNotFoundError(error)) return [];\n\t\tthrow new Error(`Failed to list async runs in '${asyncDirRoot}': ${getErrorMessage(error)}`, {\n\t\t\tcause: error instanceof Error ? error : undefined,\n\t\t});\n\t}\n\n\tconst allowedStates = options.states ? new Set(options.states) : undefined;\n\tconst runs: AsyncRunSummary[] = [];\n\t// Route resolution for every run shares a single index built from the\n\t// nested-events directory, so the per-run lookup is O(1) instead of scanning\n\t// the directory once per run. The index is built lazily on first use, so\n\t// load-time restoration (which only wants queued/running runs) skips it\n\t// entirely when no active runs match.\n\tlet nestedRouteIndex: Map<string, NestedRoute> | undefined;\n\tconst resolveNestedRoute = (rootRunId: string): NestedRoute | undefined => {\n\t\tif (!nestedRouteIndex) nestedRouteIndex = buildNestedRouteIndex();\n\t\treturn nestedRouteIndex.get(rootRunId);\n\t};\n\tfor (const entry of entries) {\n\t\tconst asyncDir = path.join(asyncDirRoot, entry);\n\t\tconst reconciliation = options.reconcile === false\n\t\t\t? undefined\n\t\t\t: reconcileAsyncRun(asyncDir, { resultsDir: options.resultsDir, kill: options.kill, now: options.now });\n\t\tconst status = (reconciliation?.status ?? readStatus(asyncDir)) as (AsyncStatus & { cwd?: string }) | null;\n\t\tif (!status) continue;\n\t\t// Filter before the nested-route lookup: the lookup builds an index over\n\t\t// the nested-events directory, so deferring it for filtered-out runs keeps\n\t\t// restoration at load from scanning that directory when no active runs\n\t\t// match.\n\t\tif (allowedStates && !allowedStates.has(status.state)) continue;\n\t\tif (options.sessionId && status.sessionId !== options.sessionId) continue;\n\t\tconst nestedWarnings: string[] = [];\n\t\tlet nestedRoute: NestedRoute | undefined;\n\t\tif (options.reconcile !== false) {\n\t\t\ttry {\n\t\t\t\tnestedRoute = resolveNestedRoute(status.runId || path.basename(asyncDir));\n\t\t\t\tif (nestedRoute) reconcileNestedAsyncDescendants(nestedRoute, { resultsDir: options.resultsDir, kill: options.kill, now: options.now });\n\t\t\t} catch (error) {\n\t\t\t\tnestedWarnings.push(`Nested status unavailable: ${getErrorMessage(error)}`);\n\t\t\t}\n\t\t}\n\t\tconst summary = statusToSummary(asyncDir, status, nestedWarnings, nestedRoute);\n\t\truns.push(summary);\n\t}\n\n\tconst sorted = sortRuns(runs);\n\treturn options.limit !== undefined ? sorted.slice(0, options.limit) : sorted;\n}\n\nfunction formatActivityFacts(input: { activityState?: ActivityState; lastActivityAt?: number; currentTool?: string; currentToolStartedAt?: number; currentPath?: string; turnCount?: number; toolCount?: number; steering?: SteeringStatus; turnBudget?: TurnBudgetState; turnBudgetExceeded?: boolean; wrapUpRequested?: boolean }): string | undefined {\n\tconst facts: string[] = [];\n\tif (input.currentTool && input.currentToolStartedAt !== undefined) facts.push(`tool ${input.currentTool} ${formatDuration(Math.max(0, Date.now() - input.currentToolStartedAt))}`);\n\telse if (input.currentTool) facts.push(`tool ${input.currentTool}`);\n\tif (input.currentPath) facts.push(shortenPath(input.currentPath));\n\tif (input.turnCount !== undefined) facts.push(`${input.turnCount} turns`);\n\tif (input.turnBudgetExceeded && input.turnBudget) facts.push(`turn budget exceeded ${input.turnBudget.turnCount}/${input.turnBudget.maxTurns}+${input.turnBudget.graceTurns}`);\n\telse if (input.wrapUpRequested && input.turnBudget) facts.push(`wrap-up requested ${input.turnBudget.turnCount}/${input.turnBudget.maxTurns}`);\n\telse if (input.turnBudget) facts.push(`turn budget ${input.turnBudget.turnCount}/${input.turnBudget.maxTurns}+${input.turnBudget.graceTurns}`);\n\tif (input.toolCount !== undefined) facts.push(`${input.toolCount} tools`);\n\tif (input.steering) facts.push(`steering ${input.steering.scheduled} scheduled, ${input.steering.pending} pending, ${input.steering.delivered} delivered, ${input.steering.failed} failed, ${input.steering.recovered} recovered`);\n\tconst activity = formatActivityLabel(input.lastActivityAt, input.activityState);\n\treturn activity || facts.length ? [activity, ...facts].filter(Boolean).join(\" | \") : undefined;\n}\n\nfunction formatStepLine(step: AsyncRunStepSummary): string {\n\tconst display = step.label ? `${step.label} (${step.agent})` : step.agent;\n\tconst phase = step.phase ? `[${step.phase}] ` : \"\";\n\tconst parts = [`${step.index + 1}. ${phase}${display}`, step.status];\n\tconst activity = formatActivityFacts(step);\n\tif (activity) parts.push(activity);\n\tconst modelThinking = formatModelThinking(step.model, step.thinking);\n\tif (modelThinking) parts.push(modelThinking);\n\tif (step.durationMs !== undefined) parts.push(formatDuration(step.durationMs));\n\tif (step.tokens) parts.push(`${formatTokens(step.tokens.total)} tok`);\n\treturn parts.join(\" | \");\n}\n\nexport function formatAsyncRunOutputPath(run: Pick<AsyncRunSummary, \"asyncDir\" | \"outputFile\">): string | undefined {\n\tif (!run.outputFile) return undefined;\n\treturn path.isAbsolute(run.outputFile) ? run.outputFile : path.join(run.asyncDir, run.outputFile);\n}\n\nexport function formatAsyncRunProgressLabel(run: Pick<AsyncRunSummary, \"mode\" | \"state\" | \"currentStep\" | \"chainStepCount\" | \"parallelGroups\" | \"steps\">): string {\n\tconst stepCount = run.steps.length || 1;\n\tconst chainStepCount = run.chainStepCount ?? stepCount;\n\tconst groups = normalizeParallelGroups(run.parallelGroups, run.steps.length, chainStepCount);\n\tconst activeGroup = run.currentStep !== undefined\n\t\t? groups.find((group) => run.currentStep! >= group.start && run.currentStep! < group.start + group.count)\n\t\t: undefined;\n\tif (activeGroup) {\n\t\tconst groupSteps = run.steps.slice(activeGroup.start, activeGroup.start + activeGroup.count);\n\t\tconst groupLabel = formatParallelOutcome(groupSteps, activeGroup.count, { showRunning: run.state === \"running\" });\n\t\tif (run.mode === \"parallel\") return groupLabel;\n\t\treturn `step ${activeGroup.stepIndex + 1}/${chainStepCount} · parallel group: ${groupLabel}`;\n\t}\n\tif (run.mode === \"parallel\") return formatParallelOutcome(run.steps, stepCount, { showRunning: run.state === \"running\" });\n\tif (run.mode === \"chain\" && run.currentStep !== undefined && groups.length > 0) {\n\t\tconst logicalStep = flatToLogicalStepIndex(run.currentStep, chainStepCount, groups);\n\t\treturn `step ${logicalStep + 1}/${chainStepCount}`;\n\t}\n\treturn run.currentStep !== undefined ? `step ${run.currentStep + 1}/${stepCount}` : `steps ${stepCount}`;\n}\n\nfunction formatRunHeader(run: AsyncRunSummary): string {\n\tconst stepLabel = formatAsyncRunProgressLabel(run);\n\tconst cwd = run.cwd ? shortenPath(run.cwd) : shortenPath(run.asyncDir);\n\tconst activity = formatActivityFacts(run);\n\tconst pending = run.pendingAppends ? ` | ${run.pendingAppends} pending append${run.pendingAppends === 1 ? \"\" : \"s\"}` : \"\";\n\treturn `${run.id} | ${run.state}${activity ? ` | ${activity}` : \"\"} | ${run.mode} | ${stepLabel}${pending} | ${cwd}`;\n}\n\nexport function formatAsyncRunList(runs: AsyncRunSummary[], heading = \"Active async runs\"): string {\n\tif (runs.length === 0) return `No ${heading.toLowerCase()}.`;\n\n\tconst lines = [`${heading}: ${runs.length}`, \"\"];\n\tfor (const run of runs) {\n\t\tlines.push(`- ${formatRunHeader(run)}`);\n\t\tfor (const step of run.steps) {\n\t\t\tlines.push(` ${formatStepLine(step)}`);\n\t\t\tlines.push(...formatNestedRunStatusLines(step.children, { indent: \" \", maxLines: 12 }));\n\t\t}\n\t\tconst attached = new Set(run.steps.flatMap((step) => step.children?.map((child) => child.id) ?? []));\n\t\tconst unattached = run.nestedChildren?.filter((child) => !attached.has(child.id)) ?? [];\n\t\tlines.push(...formatNestedRunStatusLines(unattached, { indent: \" \", maxLines: 12 }));\n\t\tif (run.error) lines.push(` Error: ${run.error}`);\n\t\tfor (const warning of run.nestedWarnings ?? []) lines.push(` Warning: ${warning}`);\n\t\tconst outputPath = formatAsyncRunOutputPath(run);\n\t\tif (outputPath) lines.push(` output: ${shortenPath(outputPath)}`);\n\t\tif (run.sessionFile) lines.push(` session: ${shortenPath(run.sessionFile)}`);\n\t\tlines.push(\"\");\n\t}\n\treturn lines.join(\"\\n\").trimEnd();\n}\n"]}
1
+ {"version":3,"file":"async-status.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/background/async-status.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { formatDuration, formatModelSelection, formatTokens, shortenPath } from \"../../shared/formatters.ts\";\nimport { formatActivityLabel, formatParallelOutcome } from \"../../shared/status-format.ts\";\nimport { type ActivityState, type AsyncJobStep, type AsyncParallelGroupStatus, type AsyncStatus, type CostSummary, type NestedRunSummary, type SteeringStatus, type SubagentRunMode, type TokenUsage, type TurnBudgetState } from \"../../shared/types.ts\";\nimport { readStatus } from \"../../shared/utils.ts\";\nimport { attachRootChildrenToSteps, buildNestedRouteIndex, type NestedRoute, projectNestedEvents } from \"../shared/nested-events.ts\";\nimport { formatNestedRunStatusLines } from \"../shared/nested-render.ts\";\nimport { flatToLogicalStepIndex, normalizeParallelGroups } from \"./parallel-groups.ts\";\nimport { reconcileAsyncRun, reconcileNestedAsyncDescendants } from \"./stale-run-reconciler.ts\";\n\ninterface AsyncRunStepSummary {\n\tindex: number;\n\tagent: string;\n\tlabel?: string;\n\tphase?: string;\n\toutputName?: string;\n\tstructured?: boolean;\n\tstatus: AsyncJobStep[\"status\"];\n\tactivityState?: ActivityState;\n\tlastActivityAt?: number;\n\tcurrentTool?: string;\n\tcurrentToolArgs?: string;\n\tcurrentToolStartedAt?: number;\n\tcurrentPath?: string;\n\trecentTools?: Array<{ tool: string; args: string; endMs: number }>;\n\trecentOutput?: string[];\n\tturnCount?: number;\n\ttoolCount?: number;\n\tsteering?: SteeringStatus;\n\tdurationMs?: number;\n\ttokens?: TokenUsage;\n\ttotalCost?: CostSummary;\n\tskills?: string[];\n\tmodel?: string;\n\tthinking?: string;\n\tmodelSelection?: import(\"../../shared/types.ts\").ModelSelection;\n\tattemptedModels?: string[];\n\terror?: string;\n\ttimedOut?: boolean;\n\tstopped?: boolean;\n\tturnBudget?: TurnBudgetState;\n\tturnBudgetExceeded?: boolean;\n\twrapUpRequested?: boolean;\n\tchildren?: NestedRunSummary[];\n}\n\nexport interface AsyncRunSummary {\n\tid: string;\n\tasyncDir: string;\n\tsessionId?: string;\n\tstate: \"queued\" | \"running\" | \"complete\" | \"failed\" | \"paused\" | \"stopped\";\n\terror?: string;\n\tactivityState?: ActivityState;\n\tlastActivityAt?: number;\n\tcurrentTool?: string;\n\tcurrentToolStartedAt?: number;\n\tcurrentPath?: string;\n\tturnCount?: number;\n\ttoolCount?: number;\n\tsteering?: SteeringStatus;\n\tmode: SubagentRunMode;\n\tcwd?: string;\n\tstartedAt: number;\n\tlastUpdate?: number;\n\tendedAt?: number;\n\ttimeoutMs?: number;\n\tdeadlineAt?: number;\n\ttimedOut?: boolean;\n\tstopped?: boolean;\n\tturnBudget?: TurnBudgetState;\n\tturnBudgetExceeded?: boolean;\n\twrapUpRequested?: boolean;\n\tcurrentStep?: number;\n\tchainStepCount?: number;\n\tpendingAppends?: number;\n\tparallelGroups?: AsyncParallelGroupStatus[];\n\tsteps: AsyncRunStepSummary[];\n\tsessionDir?: string;\n\toutputFile?: string;\n\ttotalTokens?: TokenUsage;\n\ttotalCost?: CostSummary;\n\tsessionFile?: string;\n\tnestedChildren?: NestedRunSummary[];\n\tnestedWarnings?: string[];\n}\n\ninterface AsyncRunListOptions {\n\tstates?: Array<AsyncRunSummary[\"state\"]>;\n\tsessionId?: string;\n\tlimit?: number;\n\tresultsDir?: string;\n\tkill?: (pid: number, signal?: NodeJS.Signals | 0) => boolean;\n\tnow?: () => number;\n\treconcile?: boolean;\n}\n\nfunction getErrorMessage(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error);\n}\n\nfunction isNotFoundError(error: unknown): boolean {\n\treturn typeof error === \"object\"\n\t\t&& error !== null\n\t\t&& \"code\" in error\n\t\t&& (error as NodeJS.ErrnoException).code === \"ENOENT\";\n}\n\nfunction isAsyncRunDir(root: string, entry: string): boolean {\n\tconst entryPath = path.join(root, entry);\n\ttry {\n\t\treturn fs.statSync(entryPath).isDirectory();\n\t} catch (error) {\n\t\tif (isNotFoundError(error)) return false;\n\t\tthrow new Error(`Failed to inspect async run path '${entryPath}': ${getErrorMessage(error)}`, {\n\t\t\tcause: error instanceof Error ? error : undefined,\n\t\t});\n\t}\n}\n\nfunction outputFileMtime(outputFile: string | undefined): number | undefined {\n\tif (!outputFile) return undefined;\n\ttry {\n\t\treturn fs.statSync(outputFile).mtimeMs;\n\t} catch (error) {\n\t\tif (isNotFoundError(error)) return undefined;\n\t\tthrow new Error(`Failed to inspect async output file '${outputFile}': ${getErrorMessage(error)}`, {\n\t\t\tcause: error instanceof Error ? error : undefined,\n\t\t});\n\t}\n}\n\nfunction deriveAsyncActivityState(asyncDir: string, status: AsyncStatus): { activityState?: ActivityState; lastActivityAt?: number } {\n\tif (status.state !== \"running\") return { activityState: status.activityState, lastActivityAt: status.lastActivityAt };\n\tconst outputPath = status.outputFile ? (path.isAbsolute(status.outputFile) ? status.outputFile : path.join(asyncDir, status.outputFile)) : undefined;\n\tconst currentStep = typeof status.currentStep === \"number\" ? status.steps?.[status.currentStep] : undefined;\n\treturn {\n\t\tactivityState: status.activityState,\n\t\tlastActivityAt: status.lastActivityAt ?? outputFileMtime(outputPath) ?? currentStep?.lastActivityAt ?? currentStep?.startedAt ?? status.startedAt,\n\t};\n}\n\nfunction statusToSummary(asyncDir: string, status: AsyncStatus & { cwd?: string }, nestedWarnings: string[] = [], nestedRoute?: NestedRoute): AsyncRunSummary {\n\tif (status.sessionId !== undefined && typeof status.sessionId !== \"string\") {\n\t\tthrow new Error(`Invalid async status '${path.join(asyncDir, \"status.json\")}': sessionId must be a string.`);\n\t}\n\tconst { activityState, lastActivityAt } = deriveAsyncActivityState(asyncDir, status);\n\tconst steps = status.steps ?? [];\n\tconst chainStepCount = status.chainStepCount ?? steps.length;\n\tconst parallelGroups = normalizeParallelGroups(status.parallelGroups, steps.length, chainStepCount);\n\tlet nestedChildren: NestedRunSummary[] = [];\n\tif (nestedWarnings.length === 0 && nestedRoute) {\n\t\ttry {\n\t\t\t// The route is resolved by the caller via buildNestedRouteIndex, so this\n\t\t\t// avoids a fresh scan of the nested-events directory per run.\n\t\t\tnestedChildren = projectNestedEvents(nestedRoute)?.children ?? [];\n\t\t} catch (error) {\n\t\t\tnestedWarnings.push(`Nested status unavailable: ${getErrorMessage(error)}`);\n\t\t}\n\t}\n\tconst summarizedSteps = steps.map((step, index) => {\n\t\tconst stepActivityState = step.activityState;\n\t\tconst stepLastActivityAt = step.lastActivityAt;\n\t\treturn {\n\t\t\tindex,\n\t\t\tagent: step.agent,\n\t\t\t...(step.label ? { label: step.label } : {}),\n\t\t\t...(step.phase ? { phase: step.phase } : {}),\n\t\t\t...(step.outputName ? { outputName: step.outputName } : {}),\n\t\t\t...(step.structured ? { structured: step.structured } : {}),\n\t\t\tstatus: step.status,\n\t\t\t...(stepActivityState ? { activityState: stepActivityState } : {}),\n\t\t\t...(stepLastActivityAt ? { lastActivityAt: stepLastActivityAt } : {}),\n\t\t\t...(step.currentTool ? { currentTool: step.currentTool } : {}),\n\t\t\t...(step.currentToolArgs ? { currentToolArgs: step.currentToolArgs } : {}),\n\t\t\t...(step.currentToolStartedAt ? { currentToolStartedAt: step.currentToolStartedAt } : {}),\n\t\t\t...(step.currentPath ? { currentPath: step.currentPath } : {}),\n\t\t\t...(step.recentTools ? { recentTools: step.recentTools.map((tool) => ({ ...tool })) } : {}),\n\t\t\t...(step.recentOutput ? { recentOutput: [...step.recentOutput] } : {}),\n\t\t\t...(step.turnCount !== undefined ? { turnCount: step.turnCount } : {}),\n\t\t\t...(step.toolCount !== undefined ? { toolCount: step.toolCount } : {}),\n\t\t\t...(step.steering ? { steering: step.steering } : {}),\n\t\t\t...(step.durationMs !== undefined ? { durationMs: step.durationMs } : {}),\n\t\t\t...(step.tokens ? { tokens: step.tokens } : {}),\n\t\t\t...(step.totalCost ? { totalCost: step.totalCost } : {}),\n\t\t\t...(step.skills ? { skills: step.skills } : {}),\n\t\t\t...(step.model ? { model: step.model } : {}),\n\t\t\t...(step.thinking ? { thinking: step.thinking } : {}),\n\t\t\t...(step.modelSelection ? { modelSelection: step.modelSelection } : {}),\n\t\t\t...(step.attemptedModels ? { attemptedModels: step.attemptedModels } : {}),\n\t\t\t...(step.error ? { error: step.error } : {}),\n\t\t\t...(step.timedOut !== undefined ? { timedOut: step.timedOut } : {}),\n\t\t\t...(step.stopped !== undefined ? { stopped: step.stopped } : {}),\n\t\t\t...(step.turnBudget ? { turnBudget: step.turnBudget } : {}),\n\t\t\t...(step.turnBudgetExceeded !== undefined ? { turnBudgetExceeded: step.turnBudgetExceeded } : {}),\n\t\t\t...(step.wrapUpRequested !== undefined ? { wrapUpRequested: step.wrapUpRequested } : {}),\n\t\t\t...(step.children?.length ? { children: step.children } : {}),\n\t\t};\n\t});\n\tattachRootChildrenToSteps(status.runId || path.basename(asyncDir), summarizedSteps, nestedChildren);\n\treturn {\n\t\tid: status.runId || path.basename(asyncDir),\n\t\tasyncDir,\n\t\t...(status.sessionId ? { sessionId: status.sessionId } : {}),\n\t\tstate: status.state,\n\t\t...(status.error ? { error: status.error } : {}),\n\t\tactivityState,\n\t\tlastActivityAt,\n\t\tcurrentTool: status.currentTool,\n\t\tcurrentToolStartedAt: status.currentToolStartedAt,\n\t\tcurrentPath: status.currentPath,\n\t\tturnCount: status.turnCount,\n\t\ttoolCount: status.toolCount,\n\t\tsteering: status.steering,\n\t\tmode: status.mode,\n\t\tcwd: status.cwd,\n\t\tstartedAt: status.startedAt,\n\t\tlastUpdate: status.lastUpdate,\n\t\tendedAt: status.endedAt,\n\t\t...(status.timeoutMs !== undefined ? { timeoutMs: status.timeoutMs } : {}),\n\t\t...(status.deadlineAt !== undefined ? { deadlineAt: status.deadlineAt } : {}),\n\t\t...(status.timedOut !== undefined ? { timedOut: status.timedOut } : {}),\n\t\t...(status.stopped !== undefined ? { stopped: status.stopped } : {}),\n\t\t...(status.turnBudget ? { turnBudget: status.turnBudget } : {}),\n\t\t...(status.turnBudgetExceeded !== undefined ? { turnBudgetExceeded: status.turnBudgetExceeded } : {}),\n\t\t...(status.wrapUpRequested !== undefined ? { wrapUpRequested: status.wrapUpRequested } : {}),\n\t\tcurrentStep: status.currentStep,\n\t\t...(status.chainStepCount !== undefined ? { chainStepCount: status.chainStepCount } : {}),\n\t\t...(status.pendingAppends !== undefined ? { pendingAppends: status.pendingAppends } : {}),\n\t\t...(parallelGroups.length ? { parallelGroups } : {}),\n\t\tsteps: summarizedSteps,\n\t\t...(nestedChildren.length ? { nestedChildren } : {}),\n\t\t...(nestedWarnings.length ? { nestedWarnings } : {}),\n\t\t...(status.sessionDir ? { sessionDir: status.sessionDir } : {}),\n\t\t...(status.outputFile ? { outputFile: status.outputFile } : {}),\n\t\t...(status.totalTokens ? { totalTokens: status.totalTokens } : {}),\n\t\t...(status.totalCost ? { totalCost: status.totalCost } : {}),\n\t\t...(status.sessionFile ? { sessionFile: status.sessionFile } : {}),\n\t};\n}\n\nexport function summarizeAsyncStatus(asyncDir: string, status: AsyncStatus & { cwd?: string }): AsyncRunSummary {\n\treturn statusToSummary(asyncDir, status);\n}\n\nfunction sortRuns(runs: AsyncRunSummary[]): AsyncRunSummary[] {\n\tconst rank = (state: AsyncRunSummary[\"state\"]): number => {\n\t\tswitch (state) {\n\t\t\tcase \"running\": return 0;\n\t\t\tcase \"queued\": return 1;\n\t\t\tcase \"failed\": return 2;\n\t\t\tcase \"stopped\": return 2;\n\t\t\tcase \"paused\": return 2;\n\t\t\tcase \"complete\": return 3;\n\t\t}\n\t};\n\treturn [...runs].sort((a, b) => {\n\t\tconst byState = rank(a.state) - rank(b.state);\n\t\tif (byState !== 0) return byState;\n\t\tconst aTime = a.lastUpdate ?? a.endedAt ?? a.startedAt;\n\t\tconst bTime = b.lastUpdate ?? b.endedAt ?? b.startedAt;\n\t\treturn bTime - aTime;\n\t});\n}\n\nexport function listAsyncRuns(asyncDirRoot: string, options: AsyncRunListOptions = {}): AsyncRunSummary[] {\n\tlet entries: string[];\n\ttry {\n\t\tentries = fs.readdirSync(asyncDirRoot).filter((entry) => isAsyncRunDir(asyncDirRoot, entry));\n\t} catch (error) {\n\t\tif (isNotFoundError(error)) return [];\n\t\tthrow new Error(`Failed to list async runs in '${asyncDirRoot}': ${getErrorMessage(error)}`, {\n\t\t\tcause: error instanceof Error ? error : undefined,\n\t\t});\n\t}\n\n\tconst allowedStates = options.states ? new Set(options.states) : undefined;\n\tconst runs: AsyncRunSummary[] = [];\n\t// Route resolution for every run shares a single index built from the\n\t// nested-events directory, so the per-run lookup is O(1) instead of scanning\n\t// the directory once per run. The index is built lazily on first use, so\n\t// load-time restoration (which only wants queued/running runs) skips it\n\t// entirely when no active runs match.\n\tlet nestedRouteIndex: Map<string, NestedRoute> | undefined;\n\tconst resolveNestedRoute = (rootRunId: string): NestedRoute | undefined => {\n\t\tif (!nestedRouteIndex) nestedRouteIndex = buildNestedRouteIndex();\n\t\treturn nestedRouteIndex.get(rootRunId);\n\t};\n\tfor (const entry of entries) {\n\t\tconst asyncDir = path.join(asyncDirRoot, entry);\n\t\tconst reconciliation = options.reconcile === false\n\t\t\t? undefined\n\t\t\t: reconcileAsyncRun(asyncDir, { resultsDir: options.resultsDir, kill: options.kill, now: options.now });\n\t\tconst status = (reconciliation?.status ?? readStatus(asyncDir)) as (AsyncStatus & { cwd?: string }) | null;\n\t\tif (!status) continue;\n\t\t// Filter before the nested-route lookup: the lookup builds an index over\n\t\t// the nested-events directory, so deferring it for filtered-out runs keeps\n\t\t// restoration at load from scanning that directory when no active runs\n\t\t// match.\n\t\tif (allowedStates && !allowedStates.has(status.state)) continue;\n\t\tif (options.sessionId && status.sessionId !== options.sessionId) continue;\n\t\tconst nestedWarnings: string[] = [];\n\t\tlet nestedRoute: NestedRoute | undefined;\n\t\tif (options.reconcile !== false) {\n\t\t\ttry {\n\t\t\t\tnestedRoute = resolveNestedRoute(status.runId || path.basename(asyncDir));\n\t\t\t\tif (nestedRoute) reconcileNestedAsyncDescendants(nestedRoute, { resultsDir: options.resultsDir, kill: options.kill, now: options.now });\n\t\t\t} catch (error) {\n\t\t\t\tnestedWarnings.push(`Nested status unavailable: ${getErrorMessage(error)}`);\n\t\t\t}\n\t\t}\n\t\tconst summary = statusToSummary(asyncDir, status, nestedWarnings, nestedRoute);\n\t\truns.push(summary);\n\t}\n\n\tconst sorted = sortRuns(runs);\n\treturn options.limit !== undefined ? sorted.slice(0, options.limit) : sorted;\n}\n\nfunction formatActivityFacts(input: { activityState?: ActivityState; lastActivityAt?: number; currentTool?: string; currentToolStartedAt?: number; currentPath?: string; turnCount?: number; toolCount?: number; steering?: SteeringStatus; turnBudget?: TurnBudgetState; turnBudgetExceeded?: boolean; wrapUpRequested?: boolean }): string | undefined {\n\tconst facts: string[] = [];\n\tif (input.currentTool && input.currentToolStartedAt !== undefined) facts.push(`tool ${input.currentTool} ${formatDuration(Math.max(0, Date.now() - input.currentToolStartedAt))}`);\n\telse if (input.currentTool) facts.push(`tool ${input.currentTool}`);\n\tif (input.currentPath) facts.push(shortenPath(input.currentPath));\n\tif (input.turnCount !== undefined) facts.push(`${input.turnCount} turns`);\n\tif (input.turnBudgetExceeded && input.turnBudget) facts.push(`turn budget exceeded ${input.turnBudget.turnCount}/${input.turnBudget.maxTurns}+${input.turnBudget.graceTurns}`);\n\telse if (input.wrapUpRequested && input.turnBudget) facts.push(`wrap-up requested ${input.turnBudget.turnCount}/${input.turnBudget.maxTurns}`);\n\telse if (input.turnBudget) facts.push(`turn budget ${input.turnBudget.turnCount}/${input.turnBudget.maxTurns}+${input.turnBudget.graceTurns}`);\n\tif (input.toolCount !== undefined) facts.push(`${input.toolCount} tools`);\n\tif (input.steering) facts.push(`steering ${input.steering.scheduled} scheduled, ${input.steering.pending} pending, ${input.steering.delivered} delivered, ${input.steering.failed} failed, ${input.steering.recovered} recovered`);\n\tconst activity = formatActivityLabel(input.lastActivityAt, input.activityState);\n\treturn activity || facts.length ? [activity, ...facts].filter(Boolean).join(\" | \") : undefined;\n}\n\nfunction formatStepLine(step: AsyncRunStepSummary): string {\n\tconst display = step.label ? `${step.label} (${step.agent})` : step.agent;\n\tconst phase = step.phase ? `[${step.phase}] ` : \"\";\n\tconst parts = [`${step.index + 1}. ${phase}${display}`, step.status];\n\tconst activity = formatActivityFacts(step);\n\tif (activity) parts.push(activity);\n\tconst modelThinking = formatModelSelection(step.modelSelection, step.model, step.thinking);\n\tif (modelThinking) parts.push(modelThinking);\n\tif (step.durationMs !== undefined) parts.push(formatDuration(step.durationMs));\n\tif (step.tokens) parts.push(`${formatTokens(step.tokens.total)} tok`);\n\treturn parts.join(\" | \");\n}\n\nexport function formatAsyncRunOutputPath(run: Pick<AsyncRunSummary, \"asyncDir\" | \"outputFile\">): string | undefined {\n\tif (!run.outputFile) return undefined;\n\treturn path.isAbsolute(run.outputFile) ? run.outputFile : path.join(run.asyncDir, run.outputFile);\n}\n\nexport function formatAsyncRunProgressLabel(run: Pick<AsyncRunSummary, \"mode\" | \"state\" | \"currentStep\" | \"chainStepCount\" | \"parallelGroups\" | \"steps\">): string {\n\tconst stepCount = run.steps.length || 1;\n\tconst chainStepCount = run.chainStepCount ?? stepCount;\n\tconst groups = normalizeParallelGroups(run.parallelGroups, run.steps.length, chainStepCount);\n\tconst activeGroup = run.currentStep !== undefined\n\t\t? groups.find((group) => run.currentStep! >= group.start && run.currentStep! < group.start + group.count)\n\t\t: undefined;\n\tif (activeGroup) {\n\t\tconst groupSteps = run.steps.slice(activeGroup.start, activeGroup.start + activeGroup.count);\n\t\tconst groupLabel = formatParallelOutcome(groupSteps, activeGroup.count, { showRunning: run.state === \"running\" });\n\t\tif (run.mode === \"parallel\") return groupLabel;\n\t\treturn `step ${activeGroup.stepIndex + 1}/${chainStepCount} · parallel group: ${groupLabel}`;\n\t}\n\tif (run.mode === \"parallel\") return formatParallelOutcome(run.steps, stepCount, { showRunning: run.state === \"running\" });\n\tif (run.mode === \"chain\" && run.currentStep !== undefined && groups.length > 0) {\n\t\tconst logicalStep = flatToLogicalStepIndex(run.currentStep, chainStepCount, groups);\n\t\treturn `step ${logicalStep + 1}/${chainStepCount}`;\n\t}\n\treturn run.currentStep !== undefined ? `step ${run.currentStep + 1}/${stepCount}` : `steps ${stepCount}`;\n}\n\nfunction formatRunHeader(run: AsyncRunSummary): string {\n\tconst stepLabel = formatAsyncRunProgressLabel(run);\n\tconst cwd = run.cwd ? shortenPath(run.cwd) : shortenPath(run.asyncDir);\n\tconst activity = formatActivityFacts(run);\n\tconst pending = run.pendingAppends ? ` | ${run.pendingAppends} pending append${run.pendingAppends === 1 ? \"\" : \"s\"}` : \"\";\n\treturn `${run.id} | ${run.state}${activity ? ` | ${activity}` : \"\"} | ${run.mode} | ${stepLabel}${pending} | ${cwd}`;\n}\n\nexport function formatAsyncRunList(runs: AsyncRunSummary[], heading = \"Active async runs\"): string {\n\tif (runs.length === 0) return `No ${heading.toLowerCase()}.`;\n\n\tconst lines = [`${heading}: ${runs.length}`, \"\"];\n\tfor (const run of runs) {\n\t\tlines.push(`- ${formatRunHeader(run)}`);\n\t\tfor (const step of run.steps) {\n\t\t\tlines.push(` ${formatStepLine(step)}`);\n\t\t\tlines.push(...formatNestedRunStatusLines(step.children, { indent: \" \", maxLines: 12 }));\n\t\t}\n\t\tconst attached = new Set(run.steps.flatMap((step) => step.children?.map((child) => child.id) ?? []));\n\t\tconst unattached = run.nestedChildren?.filter((child) => !attached.has(child.id)) ?? [];\n\t\tlines.push(...formatNestedRunStatusLines(unattached, { indent: \" \", maxLines: 12 }));\n\t\tif (run.error) lines.push(` Error: ${run.error}`);\n\t\tfor (const warning of run.nestedWarnings ?? []) lines.push(` Warning: ${warning}`);\n\t\tconst outputPath = formatAsyncRunOutputPath(run);\n\t\tif (outputPath) lines.push(` output: ${shortenPath(outputPath)}`);\n\t\tif (run.sessionFile) lines.push(` session: ${shortenPath(run.sessionFile)}`);\n\t\tlines.push(\"\");\n\t}\n\treturn lines.join(\"\\n\").trimEnd();\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  // @ts-nocheck
2
2
  import * as fs from "node:fs";
3
3
  import * as path from "node:path";
4
- import { formatDuration, formatModelThinking, formatTokens, shortenPath } from "../../shared/formatters.js";
4
+ import { formatDuration, formatModelSelection, formatTokens, shortenPath } from "../../shared/formatters.js";
5
5
  import { formatActivityLabel, formatParallelOutcome } from "../../shared/status-format.js";
6
6
  import { readStatus } from "../../shared/utils.js";
7
7
  import { attachRootChildrenToSteps, buildNestedRouteIndex, projectNestedEvents } from "../shared/nested-events.js";
@@ -101,6 +101,7 @@ function statusToSummary(asyncDir, status, nestedWarnings = [], nestedRoute) {
101
101
  ...(step.skills ? { skills: step.skills } : {}),
102
102
  ...(step.model ? { model: step.model } : {}),
103
103
  ...(step.thinking ? { thinking: step.thinking } : {}),
104
+ ...(step.modelSelection ? { modelSelection: step.modelSelection } : {}),
104
105
  ...(step.attemptedModels ? { attemptedModels: step.attemptedModels } : {}),
105
106
  ...(step.error ? { error: step.error } : {}),
106
107
  ...(step.timedOut !== undefined ? { timedOut: step.timedOut } : {}),
@@ -264,7 +265,7 @@ function formatStepLine(step) {
264
265
  const activity = formatActivityFacts(step);
265
266
  if (activity)
266
267
  parts.push(activity);
267
- const modelThinking = formatModelThinking(step.model, step.thinking);
268
+ const modelThinking = formatModelSelection(step.modelSelection, step.model, step.thinking);
268
269
  if (modelThinking)
269
270
  parts.push(modelThinking);
270
271
  if (step.durationMs !== undefined)
@@ -1 +1 @@
1
- {"version":3,"file":"async-status.js","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/background/async-status.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { formatDuration, formatModelThinking, formatTokens, shortenPath } from \"../../shared/formatters.ts\";\nimport { formatActivityLabel, formatParallelOutcome } from \"../../shared/status-format.ts\";\nimport { type ActivityState, type AsyncJobStep, type AsyncParallelGroupStatus, type AsyncStatus, type CostSummary, type NestedRunSummary, type SteeringStatus, type SubagentRunMode, type TokenUsage, type TurnBudgetState } from \"../../shared/types.ts\";\nimport { readStatus } from \"../../shared/utils.ts\";\nimport { attachRootChildrenToSteps, buildNestedRouteIndex, type NestedRoute, projectNestedEvents } from \"../shared/nested-events.ts\";\nimport { formatNestedRunStatusLines } from \"../shared/nested-render.ts\";\nimport { flatToLogicalStepIndex, normalizeParallelGroups } from \"./parallel-groups.ts\";\nimport { reconcileAsyncRun, reconcileNestedAsyncDescendants } from \"./stale-run-reconciler.ts\";\n\ninterface AsyncRunStepSummary {\n\tindex: number;\n\tagent: string;\n\tlabel?: string;\n\tphase?: string;\n\toutputName?: string;\n\tstructured?: boolean;\n\tstatus: AsyncJobStep[\"status\"];\n\tactivityState?: ActivityState;\n\tlastActivityAt?: number;\n\tcurrentTool?: string;\n\tcurrentToolArgs?: string;\n\tcurrentToolStartedAt?: number;\n\tcurrentPath?: string;\n\trecentTools?: Array<{ tool: string; args: string; endMs: number }>;\n\trecentOutput?: string[];\n\tturnCount?: number;\n\ttoolCount?: number;\n\tsteering?: SteeringStatus;\n\tdurationMs?: number;\n\ttokens?: TokenUsage;\n\ttotalCost?: CostSummary;\n\tskills?: string[];\n\tmodel?: string;\n\tthinking?: string;\n\tattemptedModels?: string[];\n\terror?: string;\n\ttimedOut?: boolean;\n\tstopped?: boolean;\n\tturnBudget?: TurnBudgetState;\n\tturnBudgetExceeded?: boolean;\n\twrapUpRequested?: boolean;\n\tchildren?: NestedRunSummary[];\n}\n\nexport interface AsyncRunSummary {\n\tid: string;\n\tasyncDir: string;\n\tsessionId?: string;\n\tstate: \"queued\" | \"running\" | \"complete\" | \"failed\" | \"paused\" | \"stopped\";\n\terror?: string;\n\tactivityState?: ActivityState;\n\tlastActivityAt?: number;\n\tcurrentTool?: string;\n\tcurrentToolStartedAt?: number;\n\tcurrentPath?: string;\n\tturnCount?: number;\n\ttoolCount?: number;\n\tsteering?: SteeringStatus;\n\tmode: SubagentRunMode;\n\tcwd?: string;\n\tstartedAt: number;\n\tlastUpdate?: number;\n\tendedAt?: number;\n\ttimeoutMs?: number;\n\tdeadlineAt?: number;\n\ttimedOut?: boolean;\n\tstopped?: boolean;\n\tturnBudget?: TurnBudgetState;\n\tturnBudgetExceeded?: boolean;\n\twrapUpRequested?: boolean;\n\tcurrentStep?: number;\n\tchainStepCount?: number;\n\tpendingAppends?: number;\n\tparallelGroups?: AsyncParallelGroupStatus[];\n\tsteps: AsyncRunStepSummary[];\n\tsessionDir?: string;\n\toutputFile?: string;\n\ttotalTokens?: TokenUsage;\n\ttotalCost?: CostSummary;\n\tsessionFile?: string;\n\tnestedChildren?: NestedRunSummary[];\n\tnestedWarnings?: string[];\n}\n\ninterface AsyncRunListOptions {\n\tstates?: Array<AsyncRunSummary[\"state\"]>;\n\tsessionId?: string;\n\tlimit?: number;\n\tresultsDir?: string;\n\tkill?: (pid: number, signal?: NodeJS.Signals | 0) => boolean;\n\tnow?: () => number;\n\treconcile?: boolean;\n}\n\nfunction getErrorMessage(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error);\n}\n\nfunction isNotFoundError(error: unknown): boolean {\n\treturn typeof error === \"object\"\n\t\t&& error !== null\n\t\t&& \"code\" in error\n\t\t&& (error as NodeJS.ErrnoException).code === \"ENOENT\";\n}\n\nfunction isAsyncRunDir(root: string, entry: string): boolean {\n\tconst entryPath = path.join(root, entry);\n\ttry {\n\t\treturn fs.statSync(entryPath).isDirectory();\n\t} catch (error) {\n\t\tif (isNotFoundError(error)) return false;\n\t\tthrow new Error(`Failed to inspect async run path '${entryPath}': ${getErrorMessage(error)}`, {\n\t\t\tcause: error instanceof Error ? error : undefined,\n\t\t});\n\t}\n}\n\nfunction outputFileMtime(outputFile: string | undefined): number | undefined {\n\tif (!outputFile) return undefined;\n\ttry {\n\t\treturn fs.statSync(outputFile).mtimeMs;\n\t} catch (error) {\n\t\tif (isNotFoundError(error)) return undefined;\n\t\tthrow new Error(`Failed to inspect async output file '${outputFile}': ${getErrorMessage(error)}`, {\n\t\t\tcause: error instanceof Error ? error : undefined,\n\t\t});\n\t}\n}\n\nfunction deriveAsyncActivityState(asyncDir: string, status: AsyncStatus): { activityState?: ActivityState; lastActivityAt?: number } {\n\tif (status.state !== \"running\") return { activityState: status.activityState, lastActivityAt: status.lastActivityAt };\n\tconst outputPath = status.outputFile ? (path.isAbsolute(status.outputFile) ? status.outputFile : path.join(asyncDir, status.outputFile)) : undefined;\n\tconst currentStep = typeof status.currentStep === \"number\" ? status.steps?.[status.currentStep] : undefined;\n\treturn {\n\t\tactivityState: status.activityState,\n\t\tlastActivityAt: status.lastActivityAt ?? outputFileMtime(outputPath) ?? currentStep?.lastActivityAt ?? currentStep?.startedAt ?? status.startedAt,\n\t};\n}\n\nfunction statusToSummary(asyncDir: string, status: AsyncStatus & { cwd?: string }, nestedWarnings: string[] = [], nestedRoute?: NestedRoute): AsyncRunSummary {\n\tif (status.sessionId !== undefined && typeof status.sessionId !== \"string\") {\n\t\tthrow new Error(`Invalid async status '${path.join(asyncDir, \"status.json\")}': sessionId must be a string.`);\n\t}\n\tconst { activityState, lastActivityAt } = deriveAsyncActivityState(asyncDir, status);\n\tconst steps = status.steps ?? [];\n\tconst chainStepCount = status.chainStepCount ?? steps.length;\n\tconst parallelGroups = normalizeParallelGroups(status.parallelGroups, steps.length, chainStepCount);\n\tlet nestedChildren: NestedRunSummary[] = [];\n\tif (nestedWarnings.length === 0 && nestedRoute) {\n\t\ttry {\n\t\t\t// The route is resolved by the caller via buildNestedRouteIndex, so this\n\t\t\t// avoids a fresh scan of the nested-events directory per run.\n\t\t\tnestedChildren = projectNestedEvents(nestedRoute)?.children ?? [];\n\t\t} catch (error) {\n\t\t\tnestedWarnings.push(`Nested status unavailable: ${getErrorMessage(error)}`);\n\t\t}\n\t}\n\tconst summarizedSteps = steps.map((step, index) => {\n\t\tconst stepActivityState = step.activityState;\n\t\tconst stepLastActivityAt = step.lastActivityAt;\n\t\treturn {\n\t\t\tindex,\n\t\t\tagent: step.agent,\n\t\t\t...(step.label ? { label: step.label } : {}),\n\t\t\t...(step.phase ? { phase: step.phase } : {}),\n\t\t\t...(step.outputName ? { outputName: step.outputName } : {}),\n\t\t\t...(step.structured ? { structured: step.structured } : {}),\n\t\t\tstatus: step.status,\n\t\t\t...(stepActivityState ? { activityState: stepActivityState } : {}),\n\t\t\t...(stepLastActivityAt ? { lastActivityAt: stepLastActivityAt } : {}),\n\t\t\t...(step.currentTool ? { currentTool: step.currentTool } : {}),\n\t\t\t...(step.currentToolArgs ? { currentToolArgs: step.currentToolArgs } : {}),\n\t\t\t...(step.currentToolStartedAt ? { currentToolStartedAt: step.currentToolStartedAt } : {}),\n\t\t\t...(step.currentPath ? { currentPath: step.currentPath } : {}),\n\t\t\t...(step.recentTools ? { recentTools: step.recentTools.map((tool) => ({ ...tool })) } : {}),\n\t\t\t...(step.recentOutput ? { recentOutput: [...step.recentOutput] } : {}),\n\t\t\t...(step.turnCount !== undefined ? { turnCount: step.turnCount } : {}),\n\t\t\t...(step.toolCount !== undefined ? { toolCount: step.toolCount } : {}),\n\t\t\t...(step.steering ? { steering: step.steering } : {}),\n\t\t\t...(step.durationMs !== undefined ? { durationMs: step.durationMs } : {}),\n\t\t\t...(step.tokens ? { tokens: step.tokens } : {}),\n\t\t\t...(step.totalCost ? { totalCost: step.totalCost } : {}),\n\t\t\t...(step.skills ? { skills: step.skills } : {}),\n\t\t\t...(step.model ? { model: step.model } : {}),\n\t\t\t...(step.thinking ? { thinking: step.thinking } : {}),\n\t\t\t...(step.attemptedModels ? { attemptedModels: step.attemptedModels } : {}),\n\t\t\t...(step.error ? { error: step.error } : {}),\n\t\t\t...(step.timedOut !== undefined ? { timedOut: step.timedOut } : {}),\n\t\t\t...(step.stopped !== undefined ? { stopped: step.stopped } : {}),\n\t\t\t...(step.turnBudget ? { turnBudget: step.turnBudget } : {}),\n\t\t\t...(step.turnBudgetExceeded !== undefined ? { turnBudgetExceeded: step.turnBudgetExceeded } : {}),\n\t\t\t...(step.wrapUpRequested !== undefined ? { wrapUpRequested: step.wrapUpRequested } : {}),\n\t\t\t...(step.children?.length ? { children: step.children } : {}),\n\t\t};\n\t});\n\tattachRootChildrenToSteps(status.runId || path.basename(asyncDir), summarizedSteps, nestedChildren);\n\treturn {\n\t\tid: status.runId || path.basename(asyncDir),\n\t\tasyncDir,\n\t\t...(status.sessionId ? { sessionId: status.sessionId } : {}),\n\t\tstate: status.state,\n\t\t...(status.error ? { error: status.error } : {}),\n\t\tactivityState,\n\t\tlastActivityAt,\n\t\tcurrentTool: status.currentTool,\n\t\tcurrentToolStartedAt: status.currentToolStartedAt,\n\t\tcurrentPath: status.currentPath,\n\t\tturnCount: status.turnCount,\n\t\ttoolCount: status.toolCount,\n\t\tsteering: status.steering,\n\t\tmode: status.mode,\n\t\tcwd: status.cwd,\n\t\tstartedAt: status.startedAt,\n\t\tlastUpdate: status.lastUpdate,\n\t\tendedAt: status.endedAt,\n\t\t...(status.timeoutMs !== undefined ? { timeoutMs: status.timeoutMs } : {}),\n\t\t...(status.deadlineAt !== undefined ? { deadlineAt: status.deadlineAt } : {}),\n\t\t...(status.timedOut !== undefined ? { timedOut: status.timedOut } : {}),\n\t\t...(status.stopped !== undefined ? { stopped: status.stopped } : {}),\n\t\t...(status.turnBudget ? { turnBudget: status.turnBudget } : {}),\n\t\t...(status.turnBudgetExceeded !== undefined ? { turnBudgetExceeded: status.turnBudgetExceeded } : {}),\n\t\t...(status.wrapUpRequested !== undefined ? { wrapUpRequested: status.wrapUpRequested } : {}),\n\t\tcurrentStep: status.currentStep,\n\t\t...(status.chainStepCount !== undefined ? { chainStepCount: status.chainStepCount } : {}),\n\t\t...(status.pendingAppends !== undefined ? { pendingAppends: status.pendingAppends } : {}),\n\t\t...(parallelGroups.length ? { parallelGroups } : {}),\n\t\tsteps: summarizedSteps,\n\t\t...(nestedChildren.length ? { nestedChildren } : {}),\n\t\t...(nestedWarnings.length ? { nestedWarnings } : {}),\n\t\t...(status.sessionDir ? { sessionDir: status.sessionDir } : {}),\n\t\t...(status.outputFile ? { outputFile: status.outputFile } : {}),\n\t\t...(status.totalTokens ? { totalTokens: status.totalTokens } : {}),\n\t\t...(status.totalCost ? { totalCost: status.totalCost } : {}),\n\t\t...(status.sessionFile ? { sessionFile: status.sessionFile } : {}),\n\t};\n}\n\nexport function summarizeAsyncStatus(asyncDir: string, status: AsyncStatus & { cwd?: string }): AsyncRunSummary {\n\treturn statusToSummary(asyncDir, status);\n}\n\nfunction sortRuns(runs: AsyncRunSummary[]): AsyncRunSummary[] {\n\tconst rank = (state: AsyncRunSummary[\"state\"]): number => {\n\t\tswitch (state) {\n\t\t\tcase \"running\": return 0;\n\t\t\tcase \"queued\": return 1;\n\t\t\tcase \"failed\": return 2;\n\t\t\tcase \"stopped\": return 2;\n\t\t\tcase \"paused\": return 2;\n\t\t\tcase \"complete\": return 3;\n\t\t}\n\t};\n\treturn [...runs].sort((a, b) => {\n\t\tconst byState = rank(a.state) - rank(b.state);\n\t\tif (byState !== 0) return byState;\n\t\tconst aTime = a.lastUpdate ?? a.endedAt ?? a.startedAt;\n\t\tconst bTime = b.lastUpdate ?? b.endedAt ?? b.startedAt;\n\t\treturn bTime - aTime;\n\t});\n}\n\nexport function listAsyncRuns(asyncDirRoot: string, options: AsyncRunListOptions = {}): AsyncRunSummary[] {\n\tlet entries: string[];\n\ttry {\n\t\tentries = fs.readdirSync(asyncDirRoot).filter((entry) => isAsyncRunDir(asyncDirRoot, entry));\n\t} catch (error) {\n\t\tif (isNotFoundError(error)) return [];\n\t\tthrow new Error(`Failed to list async runs in '${asyncDirRoot}': ${getErrorMessage(error)}`, {\n\t\t\tcause: error instanceof Error ? error : undefined,\n\t\t});\n\t}\n\n\tconst allowedStates = options.states ? new Set(options.states) : undefined;\n\tconst runs: AsyncRunSummary[] = [];\n\t// Route resolution for every run shares a single index built from the\n\t// nested-events directory, so the per-run lookup is O(1) instead of scanning\n\t// the directory once per run. The index is built lazily on first use, so\n\t// load-time restoration (which only wants queued/running runs) skips it\n\t// entirely when no active runs match.\n\tlet nestedRouteIndex: Map<string, NestedRoute> | undefined;\n\tconst resolveNestedRoute = (rootRunId: string): NestedRoute | undefined => {\n\t\tif (!nestedRouteIndex) nestedRouteIndex = buildNestedRouteIndex();\n\t\treturn nestedRouteIndex.get(rootRunId);\n\t};\n\tfor (const entry of entries) {\n\t\tconst asyncDir = path.join(asyncDirRoot, entry);\n\t\tconst reconciliation = options.reconcile === false\n\t\t\t? undefined\n\t\t\t: reconcileAsyncRun(asyncDir, { resultsDir: options.resultsDir, kill: options.kill, now: options.now });\n\t\tconst status = (reconciliation?.status ?? readStatus(asyncDir)) as (AsyncStatus & { cwd?: string }) | null;\n\t\tif (!status) continue;\n\t\t// Filter before the nested-route lookup: the lookup builds an index over\n\t\t// the nested-events directory, so deferring it for filtered-out runs keeps\n\t\t// restoration at load from scanning that directory when no active runs\n\t\t// match.\n\t\tif (allowedStates && !allowedStates.has(status.state)) continue;\n\t\tif (options.sessionId && status.sessionId !== options.sessionId) continue;\n\t\tconst nestedWarnings: string[] = [];\n\t\tlet nestedRoute: NestedRoute | undefined;\n\t\tif (options.reconcile !== false) {\n\t\t\ttry {\n\t\t\t\tnestedRoute = resolveNestedRoute(status.runId || path.basename(asyncDir));\n\t\t\t\tif (nestedRoute) reconcileNestedAsyncDescendants(nestedRoute, { resultsDir: options.resultsDir, kill: options.kill, now: options.now });\n\t\t\t} catch (error) {\n\t\t\t\tnestedWarnings.push(`Nested status unavailable: ${getErrorMessage(error)}`);\n\t\t\t}\n\t\t}\n\t\tconst summary = statusToSummary(asyncDir, status, nestedWarnings, nestedRoute);\n\t\truns.push(summary);\n\t}\n\n\tconst sorted = sortRuns(runs);\n\treturn options.limit !== undefined ? sorted.slice(0, options.limit) : sorted;\n}\n\nfunction formatActivityFacts(input: { activityState?: ActivityState; lastActivityAt?: number; currentTool?: string; currentToolStartedAt?: number; currentPath?: string; turnCount?: number; toolCount?: number; steering?: SteeringStatus; turnBudget?: TurnBudgetState; turnBudgetExceeded?: boolean; wrapUpRequested?: boolean }): string | undefined {\n\tconst facts: string[] = [];\n\tif (input.currentTool && input.currentToolStartedAt !== undefined) facts.push(`tool ${input.currentTool} ${formatDuration(Math.max(0, Date.now() - input.currentToolStartedAt))}`);\n\telse if (input.currentTool) facts.push(`tool ${input.currentTool}`);\n\tif (input.currentPath) facts.push(shortenPath(input.currentPath));\n\tif (input.turnCount !== undefined) facts.push(`${input.turnCount} turns`);\n\tif (input.turnBudgetExceeded && input.turnBudget) facts.push(`turn budget exceeded ${input.turnBudget.turnCount}/${input.turnBudget.maxTurns}+${input.turnBudget.graceTurns}`);\n\telse if (input.wrapUpRequested && input.turnBudget) facts.push(`wrap-up requested ${input.turnBudget.turnCount}/${input.turnBudget.maxTurns}`);\n\telse if (input.turnBudget) facts.push(`turn budget ${input.turnBudget.turnCount}/${input.turnBudget.maxTurns}+${input.turnBudget.graceTurns}`);\n\tif (input.toolCount !== undefined) facts.push(`${input.toolCount} tools`);\n\tif (input.steering) facts.push(`steering ${input.steering.scheduled} scheduled, ${input.steering.pending} pending, ${input.steering.delivered} delivered, ${input.steering.failed} failed, ${input.steering.recovered} recovered`);\n\tconst activity = formatActivityLabel(input.lastActivityAt, input.activityState);\n\treturn activity || facts.length ? [activity, ...facts].filter(Boolean).join(\" | \") : undefined;\n}\n\nfunction formatStepLine(step: AsyncRunStepSummary): string {\n\tconst display = step.label ? `${step.label} (${step.agent})` : step.agent;\n\tconst phase = step.phase ? `[${step.phase}] ` : \"\";\n\tconst parts = [`${step.index + 1}. ${phase}${display}`, step.status];\n\tconst activity = formatActivityFacts(step);\n\tif (activity) parts.push(activity);\n\tconst modelThinking = formatModelThinking(step.model, step.thinking);\n\tif (modelThinking) parts.push(modelThinking);\n\tif (step.durationMs !== undefined) parts.push(formatDuration(step.durationMs));\n\tif (step.tokens) parts.push(`${formatTokens(step.tokens.total)} tok`);\n\treturn parts.join(\" | \");\n}\n\nexport function formatAsyncRunOutputPath(run: Pick<AsyncRunSummary, \"asyncDir\" | \"outputFile\">): string | undefined {\n\tif (!run.outputFile) return undefined;\n\treturn path.isAbsolute(run.outputFile) ? run.outputFile : path.join(run.asyncDir, run.outputFile);\n}\n\nexport function formatAsyncRunProgressLabel(run: Pick<AsyncRunSummary, \"mode\" | \"state\" | \"currentStep\" | \"chainStepCount\" | \"parallelGroups\" | \"steps\">): string {\n\tconst stepCount = run.steps.length || 1;\n\tconst chainStepCount = run.chainStepCount ?? stepCount;\n\tconst groups = normalizeParallelGroups(run.parallelGroups, run.steps.length, chainStepCount);\n\tconst activeGroup = run.currentStep !== undefined\n\t\t? groups.find((group) => run.currentStep! >= group.start && run.currentStep! < group.start + group.count)\n\t\t: undefined;\n\tif (activeGroup) {\n\t\tconst groupSteps = run.steps.slice(activeGroup.start, activeGroup.start + activeGroup.count);\n\t\tconst groupLabel = formatParallelOutcome(groupSteps, activeGroup.count, { showRunning: run.state === \"running\" });\n\t\tif (run.mode === \"parallel\") return groupLabel;\n\t\treturn `step ${activeGroup.stepIndex + 1}/${chainStepCount} · parallel group: ${groupLabel}`;\n\t}\n\tif (run.mode === \"parallel\") return formatParallelOutcome(run.steps, stepCount, { showRunning: run.state === \"running\" });\n\tif (run.mode === \"chain\" && run.currentStep !== undefined && groups.length > 0) {\n\t\tconst logicalStep = flatToLogicalStepIndex(run.currentStep, chainStepCount, groups);\n\t\treturn `step ${logicalStep + 1}/${chainStepCount}`;\n\t}\n\treturn run.currentStep !== undefined ? `step ${run.currentStep + 1}/${stepCount}` : `steps ${stepCount}`;\n}\n\nfunction formatRunHeader(run: AsyncRunSummary): string {\n\tconst stepLabel = formatAsyncRunProgressLabel(run);\n\tconst cwd = run.cwd ? shortenPath(run.cwd) : shortenPath(run.asyncDir);\n\tconst activity = formatActivityFacts(run);\n\tconst pending = run.pendingAppends ? ` | ${run.pendingAppends} pending append${run.pendingAppends === 1 ? \"\" : \"s\"}` : \"\";\n\treturn `${run.id} | ${run.state}${activity ? ` | ${activity}` : \"\"} | ${run.mode} | ${stepLabel}${pending} | ${cwd}`;\n}\n\nexport function formatAsyncRunList(runs: AsyncRunSummary[], heading = \"Active async runs\"): string {\n\tif (runs.length === 0) return `No ${heading.toLowerCase()}.`;\n\n\tconst lines = [`${heading}: ${runs.length}`, \"\"];\n\tfor (const run of runs) {\n\t\tlines.push(`- ${formatRunHeader(run)}`);\n\t\tfor (const step of run.steps) {\n\t\t\tlines.push(` ${formatStepLine(step)}`);\n\t\t\tlines.push(...formatNestedRunStatusLines(step.children, { indent: \" \", maxLines: 12 }));\n\t\t}\n\t\tconst attached = new Set(run.steps.flatMap((step) => step.children?.map((child) => child.id) ?? []));\n\t\tconst unattached = run.nestedChildren?.filter((child) => !attached.has(child.id)) ?? [];\n\t\tlines.push(...formatNestedRunStatusLines(unattached, { indent: \" \", maxLines: 12 }));\n\t\tif (run.error) lines.push(` Error: ${run.error}`);\n\t\tfor (const warning of run.nestedWarnings ?? []) lines.push(` Warning: ${warning}`);\n\t\tconst outputPath = formatAsyncRunOutputPath(run);\n\t\tif (outputPath) lines.push(` output: ${shortenPath(outputPath)}`);\n\t\tif (run.sessionFile) lines.push(` session: ${shortenPath(run.sessionFile)}`);\n\t\tlines.push(\"\");\n\t}\n\treturn lines.join(\"\\n\").trimEnd();\n}\n"]}
1
+ {"version":3,"file":"async-status.js","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/background/async-status.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { formatDuration, formatModelSelection, formatTokens, shortenPath } from \"../../shared/formatters.ts\";\nimport { formatActivityLabel, formatParallelOutcome } from \"../../shared/status-format.ts\";\nimport { type ActivityState, type AsyncJobStep, type AsyncParallelGroupStatus, type AsyncStatus, type CostSummary, type NestedRunSummary, type SteeringStatus, type SubagentRunMode, type TokenUsage, type TurnBudgetState } from \"../../shared/types.ts\";\nimport { readStatus } from \"../../shared/utils.ts\";\nimport { attachRootChildrenToSteps, buildNestedRouteIndex, type NestedRoute, projectNestedEvents } from \"../shared/nested-events.ts\";\nimport { formatNestedRunStatusLines } from \"../shared/nested-render.ts\";\nimport { flatToLogicalStepIndex, normalizeParallelGroups } from \"./parallel-groups.ts\";\nimport { reconcileAsyncRun, reconcileNestedAsyncDescendants } from \"./stale-run-reconciler.ts\";\n\ninterface AsyncRunStepSummary {\n\tindex: number;\n\tagent: string;\n\tlabel?: string;\n\tphase?: string;\n\toutputName?: string;\n\tstructured?: boolean;\n\tstatus: AsyncJobStep[\"status\"];\n\tactivityState?: ActivityState;\n\tlastActivityAt?: number;\n\tcurrentTool?: string;\n\tcurrentToolArgs?: string;\n\tcurrentToolStartedAt?: number;\n\tcurrentPath?: string;\n\trecentTools?: Array<{ tool: string; args: string; endMs: number }>;\n\trecentOutput?: string[];\n\tturnCount?: number;\n\ttoolCount?: number;\n\tsteering?: SteeringStatus;\n\tdurationMs?: number;\n\ttokens?: TokenUsage;\n\ttotalCost?: CostSummary;\n\tskills?: string[];\n\tmodel?: string;\n\tthinking?: string;\n\tmodelSelection?: import(\"../../shared/types.ts\").ModelSelection;\n\tattemptedModels?: string[];\n\terror?: string;\n\ttimedOut?: boolean;\n\tstopped?: boolean;\n\tturnBudget?: TurnBudgetState;\n\tturnBudgetExceeded?: boolean;\n\twrapUpRequested?: boolean;\n\tchildren?: NestedRunSummary[];\n}\n\nexport interface AsyncRunSummary {\n\tid: string;\n\tasyncDir: string;\n\tsessionId?: string;\n\tstate: \"queued\" | \"running\" | \"complete\" | \"failed\" | \"paused\" | \"stopped\";\n\terror?: string;\n\tactivityState?: ActivityState;\n\tlastActivityAt?: number;\n\tcurrentTool?: string;\n\tcurrentToolStartedAt?: number;\n\tcurrentPath?: string;\n\tturnCount?: number;\n\ttoolCount?: number;\n\tsteering?: SteeringStatus;\n\tmode: SubagentRunMode;\n\tcwd?: string;\n\tstartedAt: number;\n\tlastUpdate?: number;\n\tendedAt?: number;\n\ttimeoutMs?: number;\n\tdeadlineAt?: number;\n\ttimedOut?: boolean;\n\tstopped?: boolean;\n\tturnBudget?: TurnBudgetState;\n\tturnBudgetExceeded?: boolean;\n\twrapUpRequested?: boolean;\n\tcurrentStep?: number;\n\tchainStepCount?: number;\n\tpendingAppends?: number;\n\tparallelGroups?: AsyncParallelGroupStatus[];\n\tsteps: AsyncRunStepSummary[];\n\tsessionDir?: string;\n\toutputFile?: string;\n\ttotalTokens?: TokenUsage;\n\ttotalCost?: CostSummary;\n\tsessionFile?: string;\n\tnestedChildren?: NestedRunSummary[];\n\tnestedWarnings?: string[];\n}\n\ninterface AsyncRunListOptions {\n\tstates?: Array<AsyncRunSummary[\"state\"]>;\n\tsessionId?: string;\n\tlimit?: number;\n\tresultsDir?: string;\n\tkill?: (pid: number, signal?: NodeJS.Signals | 0) => boolean;\n\tnow?: () => number;\n\treconcile?: boolean;\n}\n\nfunction getErrorMessage(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error);\n}\n\nfunction isNotFoundError(error: unknown): boolean {\n\treturn typeof error === \"object\"\n\t\t&& error !== null\n\t\t&& \"code\" in error\n\t\t&& (error as NodeJS.ErrnoException).code === \"ENOENT\";\n}\n\nfunction isAsyncRunDir(root: string, entry: string): boolean {\n\tconst entryPath = path.join(root, entry);\n\ttry {\n\t\treturn fs.statSync(entryPath).isDirectory();\n\t} catch (error) {\n\t\tif (isNotFoundError(error)) return false;\n\t\tthrow new Error(`Failed to inspect async run path '${entryPath}': ${getErrorMessage(error)}`, {\n\t\t\tcause: error instanceof Error ? error : undefined,\n\t\t});\n\t}\n}\n\nfunction outputFileMtime(outputFile: string | undefined): number | undefined {\n\tif (!outputFile) return undefined;\n\ttry {\n\t\treturn fs.statSync(outputFile).mtimeMs;\n\t} catch (error) {\n\t\tif (isNotFoundError(error)) return undefined;\n\t\tthrow new Error(`Failed to inspect async output file '${outputFile}': ${getErrorMessage(error)}`, {\n\t\t\tcause: error instanceof Error ? error : undefined,\n\t\t});\n\t}\n}\n\nfunction deriveAsyncActivityState(asyncDir: string, status: AsyncStatus): { activityState?: ActivityState; lastActivityAt?: number } {\n\tif (status.state !== \"running\") return { activityState: status.activityState, lastActivityAt: status.lastActivityAt };\n\tconst outputPath = status.outputFile ? (path.isAbsolute(status.outputFile) ? status.outputFile : path.join(asyncDir, status.outputFile)) : undefined;\n\tconst currentStep = typeof status.currentStep === \"number\" ? status.steps?.[status.currentStep] : undefined;\n\treturn {\n\t\tactivityState: status.activityState,\n\t\tlastActivityAt: status.lastActivityAt ?? outputFileMtime(outputPath) ?? currentStep?.lastActivityAt ?? currentStep?.startedAt ?? status.startedAt,\n\t};\n}\n\nfunction statusToSummary(asyncDir: string, status: AsyncStatus & { cwd?: string }, nestedWarnings: string[] = [], nestedRoute?: NestedRoute): AsyncRunSummary {\n\tif (status.sessionId !== undefined && typeof status.sessionId !== \"string\") {\n\t\tthrow new Error(`Invalid async status '${path.join(asyncDir, \"status.json\")}': sessionId must be a string.`);\n\t}\n\tconst { activityState, lastActivityAt } = deriveAsyncActivityState(asyncDir, status);\n\tconst steps = status.steps ?? [];\n\tconst chainStepCount = status.chainStepCount ?? steps.length;\n\tconst parallelGroups = normalizeParallelGroups(status.parallelGroups, steps.length, chainStepCount);\n\tlet nestedChildren: NestedRunSummary[] = [];\n\tif (nestedWarnings.length === 0 && nestedRoute) {\n\t\ttry {\n\t\t\t// The route is resolved by the caller via buildNestedRouteIndex, so this\n\t\t\t// avoids a fresh scan of the nested-events directory per run.\n\t\t\tnestedChildren = projectNestedEvents(nestedRoute)?.children ?? [];\n\t\t} catch (error) {\n\t\t\tnestedWarnings.push(`Nested status unavailable: ${getErrorMessage(error)}`);\n\t\t}\n\t}\n\tconst summarizedSteps = steps.map((step, index) => {\n\t\tconst stepActivityState = step.activityState;\n\t\tconst stepLastActivityAt = step.lastActivityAt;\n\t\treturn {\n\t\t\tindex,\n\t\t\tagent: step.agent,\n\t\t\t...(step.label ? { label: step.label } : {}),\n\t\t\t...(step.phase ? { phase: step.phase } : {}),\n\t\t\t...(step.outputName ? { outputName: step.outputName } : {}),\n\t\t\t...(step.structured ? { structured: step.structured } : {}),\n\t\t\tstatus: step.status,\n\t\t\t...(stepActivityState ? { activityState: stepActivityState } : {}),\n\t\t\t...(stepLastActivityAt ? { lastActivityAt: stepLastActivityAt } : {}),\n\t\t\t...(step.currentTool ? { currentTool: step.currentTool } : {}),\n\t\t\t...(step.currentToolArgs ? { currentToolArgs: step.currentToolArgs } : {}),\n\t\t\t...(step.currentToolStartedAt ? { currentToolStartedAt: step.currentToolStartedAt } : {}),\n\t\t\t...(step.currentPath ? { currentPath: step.currentPath } : {}),\n\t\t\t...(step.recentTools ? { recentTools: step.recentTools.map((tool) => ({ ...tool })) } : {}),\n\t\t\t...(step.recentOutput ? { recentOutput: [...step.recentOutput] } : {}),\n\t\t\t...(step.turnCount !== undefined ? { turnCount: step.turnCount } : {}),\n\t\t\t...(step.toolCount !== undefined ? { toolCount: step.toolCount } : {}),\n\t\t\t...(step.steering ? { steering: step.steering } : {}),\n\t\t\t...(step.durationMs !== undefined ? { durationMs: step.durationMs } : {}),\n\t\t\t...(step.tokens ? { tokens: step.tokens } : {}),\n\t\t\t...(step.totalCost ? { totalCost: step.totalCost } : {}),\n\t\t\t...(step.skills ? { skills: step.skills } : {}),\n\t\t\t...(step.model ? { model: step.model } : {}),\n\t\t\t...(step.thinking ? { thinking: step.thinking } : {}),\n\t\t\t...(step.modelSelection ? { modelSelection: step.modelSelection } : {}),\n\t\t\t...(step.attemptedModels ? { attemptedModels: step.attemptedModels } : {}),\n\t\t\t...(step.error ? { error: step.error } : {}),\n\t\t\t...(step.timedOut !== undefined ? { timedOut: step.timedOut } : {}),\n\t\t\t...(step.stopped !== undefined ? { stopped: step.stopped } : {}),\n\t\t\t...(step.turnBudget ? { turnBudget: step.turnBudget } : {}),\n\t\t\t...(step.turnBudgetExceeded !== undefined ? { turnBudgetExceeded: step.turnBudgetExceeded } : {}),\n\t\t\t...(step.wrapUpRequested !== undefined ? { wrapUpRequested: step.wrapUpRequested } : {}),\n\t\t\t...(step.children?.length ? { children: step.children } : {}),\n\t\t};\n\t});\n\tattachRootChildrenToSteps(status.runId || path.basename(asyncDir), summarizedSteps, nestedChildren);\n\treturn {\n\t\tid: status.runId || path.basename(asyncDir),\n\t\tasyncDir,\n\t\t...(status.sessionId ? { sessionId: status.sessionId } : {}),\n\t\tstate: status.state,\n\t\t...(status.error ? { error: status.error } : {}),\n\t\tactivityState,\n\t\tlastActivityAt,\n\t\tcurrentTool: status.currentTool,\n\t\tcurrentToolStartedAt: status.currentToolStartedAt,\n\t\tcurrentPath: status.currentPath,\n\t\tturnCount: status.turnCount,\n\t\ttoolCount: status.toolCount,\n\t\tsteering: status.steering,\n\t\tmode: status.mode,\n\t\tcwd: status.cwd,\n\t\tstartedAt: status.startedAt,\n\t\tlastUpdate: status.lastUpdate,\n\t\tendedAt: status.endedAt,\n\t\t...(status.timeoutMs !== undefined ? { timeoutMs: status.timeoutMs } : {}),\n\t\t...(status.deadlineAt !== undefined ? { deadlineAt: status.deadlineAt } : {}),\n\t\t...(status.timedOut !== undefined ? { timedOut: status.timedOut } : {}),\n\t\t...(status.stopped !== undefined ? { stopped: status.stopped } : {}),\n\t\t...(status.turnBudget ? { turnBudget: status.turnBudget } : {}),\n\t\t...(status.turnBudgetExceeded !== undefined ? { turnBudgetExceeded: status.turnBudgetExceeded } : {}),\n\t\t...(status.wrapUpRequested !== undefined ? { wrapUpRequested: status.wrapUpRequested } : {}),\n\t\tcurrentStep: status.currentStep,\n\t\t...(status.chainStepCount !== undefined ? { chainStepCount: status.chainStepCount } : {}),\n\t\t...(status.pendingAppends !== undefined ? { pendingAppends: status.pendingAppends } : {}),\n\t\t...(parallelGroups.length ? { parallelGroups } : {}),\n\t\tsteps: summarizedSteps,\n\t\t...(nestedChildren.length ? { nestedChildren } : {}),\n\t\t...(nestedWarnings.length ? { nestedWarnings } : {}),\n\t\t...(status.sessionDir ? { sessionDir: status.sessionDir } : {}),\n\t\t...(status.outputFile ? { outputFile: status.outputFile } : {}),\n\t\t...(status.totalTokens ? { totalTokens: status.totalTokens } : {}),\n\t\t...(status.totalCost ? { totalCost: status.totalCost } : {}),\n\t\t...(status.sessionFile ? { sessionFile: status.sessionFile } : {}),\n\t};\n}\n\nexport function summarizeAsyncStatus(asyncDir: string, status: AsyncStatus & { cwd?: string }): AsyncRunSummary {\n\treturn statusToSummary(asyncDir, status);\n}\n\nfunction sortRuns(runs: AsyncRunSummary[]): AsyncRunSummary[] {\n\tconst rank = (state: AsyncRunSummary[\"state\"]): number => {\n\t\tswitch (state) {\n\t\t\tcase \"running\": return 0;\n\t\t\tcase \"queued\": return 1;\n\t\t\tcase \"failed\": return 2;\n\t\t\tcase \"stopped\": return 2;\n\t\t\tcase \"paused\": return 2;\n\t\t\tcase \"complete\": return 3;\n\t\t}\n\t};\n\treturn [...runs].sort((a, b) => {\n\t\tconst byState = rank(a.state) - rank(b.state);\n\t\tif (byState !== 0) return byState;\n\t\tconst aTime = a.lastUpdate ?? a.endedAt ?? a.startedAt;\n\t\tconst bTime = b.lastUpdate ?? b.endedAt ?? b.startedAt;\n\t\treturn bTime - aTime;\n\t});\n}\n\nexport function listAsyncRuns(asyncDirRoot: string, options: AsyncRunListOptions = {}): AsyncRunSummary[] {\n\tlet entries: string[];\n\ttry {\n\t\tentries = fs.readdirSync(asyncDirRoot).filter((entry) => isAsyncRunDir(asyncDirRoot, entry));\n\t} catch (error) {\n\t\tif (isNotFoundError(error)) return [];\n\t\tthrow new Error(`Failed to list async runs in '${asyncDirRoot}': ${getErrorMessage(error)}`, {\n\t\t\tcause: error instanceof Error ? error : undefined,\n\t\t});\n\t}\n\n\tconst allowedStates = options.states ? new Set(options.states) : undefined;\n\tconst runs: AsyncRunSummary[] = [];\n\t// Route resolution for every run shares a single index built from the\n\t// nested-events directory, so the per-run lookup is O(1) instead of scanning\n\t// the directory once per run. The index is built lazily on first use, so\n\t// load-time restoration (which only wants queued/running runs) skips it\n\t// entirely when no active runs match.\n\tlet nestedRouteIndex: Map<string, NestedRoute> | undefined;\n\tconst resolveNestedRoute = (rootRunId: string): NestedRoute | undefined => {\n\t\tif (!nestedRouteIndex) nestedRouteIndex = buildNestedRouteIndex();\n\t\treturn nestedRouteIndex.get(rootRunId);\n\t};\n\tfor (const entry of entries) {\n\t\tconst asyncDir = path.join(asyncDirRoot, entry);\n\t\tconst reconciliation = options.reconcile === false\n\t\t\t? undefined\n\t\t\t: reconcileAsyncRun(asyncDir, { resultsDir: options.resultsDir, kill: options.kill, now: options.now });\n\t\tconst status = (reconciliation?.status ?? readStatus(asyncDir)) as (AsyncStatus & { cwd?: string }) | null;\n\t\tif (!status) continue;\n\t\t// Filter before the nested-route lookup: the lookup builds an index over\n\t\t// the nested-events directory, so deferring it for filtered-out runs keeps\n\t\t// restoration at load from scanning that directory when no active runs\n\t\t// match.\n\t\tif (allowedStates && !allowedStates.has(status.state)) continue;\n\t\tif (options.sessionId && status.sessionId !== options.sessionId) continue;\n\t\tconst nestedWarnings: string[] = [];\n\t\tlet nestedRoute: NestedRoute | undefined;\n\t\tif (options.reconcile !== false) {\n\t\t\ttry {\n\t\t\t\tnestedRoute = resolveNestedRoute(status.runId || path.basename(asyncDir));\n\t\t\t\tif (nestedRoute) reconcileNestedAsyncDescendants(nestedRoute, { resultsDir: options.resultsDir, kill: options.kill, now: options.now });\n\t\t\t} catch (error) {\n\t\t\t\tnestedWarnings.push(`Nested status unavailable: ${getErrorMessage(error)}`);\n\t\t\t}\n\t\t}\n\t\tconst summary = statusToSummary(asyncDir, status, nestedWarnings, nestedRoute);\n\t\truns.push(summary);\n\t}\n\n\tconst sorted = sortRuns(runs);\n\treturn options.limit !== undefined ? sorted.slice(0, options.limit) : sorted;\n}\n\nfunction formatActivityFacts(input: { activityState?: ActivityState; lastActivityAt?: number; currentTool?: string; currentToolStartedAt?: number; currentPath?: string; turnCount?: number; toolCount?: number; steering?: SteeringStatus; turnBudget?: TurnBudgetState; turnBudgetExceeded?: boolean; wrapUpRequested?: boolean }): string | undefined {\n\tconst facts: string[] = [];\n\tif (input.currentTool && input.currentToolStartedAt !== undefined) facts.push(`tool ${input.currentTool} ${formatDuration(Math.max(0, Date.now() - input.currentToolStartedAt))}`);\n\telse if (input.currentTool) facts.push(`tool ${input.currentTool}`);\n\tif (input.currentPath) facts.push(shortenPath(input.currentPath));\n\tif (input.turnCount !== undefined) facts.push(`${input.turnCount} turns`);\n\tif (input.turnBudgetExceeded && input.turnBudget) facts.push(`turn budget exceeded ${input.turnBudget.turnCount}/${input.turnBudget.maxTurns}+${input.turnBudget.graceTurns}`);\n\telse if (input.wrapUpRequested && input.turnBudget) facts.push(`wrap-up requested ${input.turnBudget.turnCount}/${input.turnBudget.maxTurns}`);\n\telse if (input.turnBudget) facts.push(`turn budget ${input.turnBudget.turnCount}/${input.turnBudget.maxTurns}+${input.turnBudget.graceTurns}`);\n\tif (input.toolCount !== undefined) facts.push(`${input.toolCount} tools`);\n\tif (input.steering) facts.push(`steering ${input.steering.scheduled} scheduled, ${input.steering.pending} pending, ${input.steering.delivered} delivered, ${input.steering.failed} failed, ${input.steering.recovered} recovered`);\n\tconst activity = formatActivityLabel(input.lastActivityAt, input.activityState);\n\treturn activity || facts.length ? [activity, ...facts].filter(Boolean).join(\" | \") : undefined;\n}\n\nfunction formatStepLine(step: AsyncRunStepSummary): string {\n\tconst display = step.label ? `${step.label} (${step.agent})` : step.agent;\n\tconst phase = step.phase ? `[${step.phase}] ` : \"\";\n\tconst parts = [`${step.index + 1}. ${phase}${display}`, step.status];\n\tconst activity = formatActivityFacts(step);\n\tif (activity) parts.push(activity);\n\tconst modelThinking = formatModelSelection(step.modelSelection, step.model, step.thinking);\n\tif (modelThinking) parts.push(modelThinking);\n\tif (step.durationMs !== undefined) parts.push(formatDuration(step.durationMs));\n\tif (step.tokens) parts.push(`${formatTokens(step.tokens.total)} tok`);\n\treturn parts.join(\" | \");\n}\n\nexport function formatAsyncRunOutputPath(run: Pick<AsyncRunSummary, \"asyncDir\" | \"outputFile\">): string | undefined {\n\tif (!run.outputFile) return undefined;\n\treturn path.isAbsolute(run.outputFile) ? run.outputFile : path.join(run.asyncDir, run.outputFile);\n}\n\nexport function formatAsyncRunProgressLabel(run: Pick<AsyncRunSummary, \"mode\" | \"state\" | \"currentStep\" | \"chainStepCount\" | \"parallelGroups\" | \"steps\">): string {\n\tconst stepCount = run.steps.length || 1;\n\tconst chainStepCount = run.chainStepCount ?? stepCount;\n\tconst groups = normalizeParallelGroups(run.parallelGroups, run.steps.length, chainStepCount);\n\tconst activeGroup = run.currentStep !== undefined\n\t\t? groups.find((group) => run.currentStep! >= group.start && run.currentStep! < group.start + group.count)\n\t\t: undefined;\n\tif (activeGroup) {\n\t\tconst groupSteps = run.steps.slice(activeGroup.start, activeGroup.start + activeGroup.count);\n\t\tconst groupLabel = formatParallelOutcome(groupSteps, activeGroup.count, { showRunning: run.state === \"running\" });\n\t\tif (run.mode === \"parallel\") return groupLabel;\n\t\treturn `step ${activeGroup.stepIndex + 1}/${chainStepCount} · parallel group: ${groupLabel}`;\n\t}\n\tif (run.mode === \"parallel\") return formatParallelOutcome(run.steps, stepCount, { showRunning: run.state === \"running\" });\n\tif (run.mode === \"chain\" && run.currentStep !== undefined && groups.length > 0) {\n\t\tconst logicalStep = flatToLogicalStepIndex(run.currentStep, chainStepCount, groups);\n\t\treturn `step ${logicalStep + 1}/${chainStepCount}`;\n\t}\n\treturn run.currentStep !== undefined ? `step ${run.currentStep + 1}/${stepCount}` : `steps ${stepCount}`;\n}\n\nfunction formatRunHeader(run: AsyncRunSummary): string {\n\tconst stepLabel = formatAsyncRunProgressLabel(run);\n\tconst cwd = run.cwd ? shortenPath(run.cwd) : shortenPath(run.asyncDir);\n\tconst activity = formatActivityFacts(run);\n\tconst pending = run.pendingAppends ? ` | ${run.pendingAppends} pending append${run.pendingAppends === 1 ? \"\" : \"s\"}` : \"\";\n\treturn `${run.id} | ${run.state}${activity ? ` | ${activity}` : \"\"} | ${run.mode} | ${stepLabel}${pending} | ${cwd}`;\n}\n\nexport function formatAsyncRunList(runs: AsyncRunSummary[], heading = \"Active async runs\"): string {\n\tif (runs.length === 0) return `No ${heading.toLowerCase()}.`;\n\n\tconst lines = [`${heading}: ${runs.length}`, \"\"];\n\tfor (const run of runs) {\n\t\tlines.push(`- ${formatRunHeader(run)}`);\n\t\tfor (const step of run.steps) {\n\t\t\tlines.push(` ${formatStepLine(step)}`);\n\t\t\tlines.push(...formatNestedRunStatusLines(step.children, { indent: \" \", maxLines: 12 }));\n\t\t}\n\t\tconst attached = new Set(run.steps.flatMap((step) => step.children?.map((child) => child.id) ?? []));\n\t\tconst unattached = run.nestedChildren?.filter((child) => !attached.has(child.id)) ?? [];\n\t\tlines.push(...formatNestedRunStatusLines(unattached, { indent: \" \", maxLines: 12 }));\n\t\tif (run.error) lines.push(` Error: ${run.error}`);\n\t\tfor (const warning of run.nestedWarnings ?? []) lines.push(` Warning: ${warning}`);\n\t\tconst outputPath = formatAsyncRunOutputPath(run);\n\t\tif (outputPath) lines.push(` output: ${shortenPath(outputPath)}`);\n\t\tif (run.sessionFile) lines.push(` session: ${shortenPath(run.sessionFile)}`);\n\t\tlines.push(\"\");\n\t}\n\treturn lines.join(\"\\n\").trimEnd();\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"chain-append.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/background/chain-append.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAA4B,WAAW,EAA4C,MAAM,uBAAuB,CAAC;AAE7H,OAAO,KAAK,EAAyC,UAAU,EAAsB,MAAM,6BAA6B,CAAC;AAKzH,MAAM,WAAW,kBAAkB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,UAAU,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IACjC,OAAO,EAAE,kBAAkB,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;CACrB;AAyBD,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAExE;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,EAAE,CAYnE;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;CACb,GAAG,iBAAiB,CA8BpB;AAUD,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,EAAE,CAKrF;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,EAAE,CAYjF;AA4HD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE;IAChD,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAwBtD","sourcesContent":["// @ts-nocheck\nimport { randomUUID } from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { writeAtomicJson } from \"../../shared/atomic-json.ts\";\nimport { appendJsonl } from \"../../shared/artifacts.ts\";\nimport type { AsyncParallelGroupStatus, AsyncStatus, WorkflowGraphNode, WorkflowGraphSnapshot } from \"../../shared/types.ts\";\nimport { readStatus } from \"../../shared/utils.ts\";\nimport type { DynamicRunnerGroup, ParallelStepGroup, RunnerStep, RunnerSubagentStep } from \"../shared/parallel-utils.ts\";\nimport { isDynamicRunnerGroup, isParallelGroup } from \"../shared/parallel-utils.ts\";\n\nconst APPEND_REQUESTS_DIR = \"append-requests\";\n\nexport interface ChainAppendRequest {\n\tid: string;\n\tcreatedAt: number;\n\tsteps: RunnerStep[];\n}\n\nexport interface ChainAppendResult {\n\trequest: ChainAppendRequest;\n\tpendingCount: number;\n}\n\ntype StatusStep = NonNullable<AsyncStatus[\"steps\"]>[number];\n\nfunction appendDir(asyncDir: string): string {\n\treturn path.join(asyncDir, APPEND_REQUESTS_DIR);\n}\n\nfunction appendRequestPath(asyncDir: string, request: ChainAppendRequest): string {\n\treturn path.join(appendDir(asyncDir), `${request.createdAt}-${request.id}.json`);\n}\n\nfunction listAppendRequestFiles(asyncDir: string): string[] {\n\tconst dir = appendDir(asyncDir);\n\ttry {\n\t\treturn fs.readdirSync(dir)\n\t\t\t.filter((entry) => entry.endsWith(\".json\"))\n\t\t\t.map((entry) => path.join(dir, entry))\n\t\t\t.sort();\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") return [];\n\t\tthrow error;\n\t}\n}\n\nexport function countPendingChainAppendRequests(asyncDir: string): number {\n\treturn listAppendRequestFiles(asyncDir).length;\n}\n\nexport function runnerStepOutputNames(steps: RunnerStep[]): string[] {\n\tconst names: string[] = [];\n\tfor (const step of steps) {\n\t\tif (isParallelGroup(step)) {\n\t\t\tnames.push(...step.parallel.map((task) => task.outputName).filter((name): name is string => Boolean(name)));\n\t\t} else if (isDynamicRunnerGroup(step)) {\n\t\t\tif (step.collect.as) names.push(step.collect.as);\n\t\t} else if (step.outputName) {\n\t\t\tnames.push(step.outputName);\n\t\t}\n\t}\n\treturn names;\n}\n\nexport function enqueueChainAppendRequest(input: {\n\tasyncDir: string;\n\trunId: string;\n\tsteps: RunnerStep[];\n\tnow?: number;\n}): ChainAppendResult {\n\tconst status = readStatus(input.asyncDir);\n\tif (!status) throw new Error(`No async run status found for '${input.runId}'.`);\n\tif (status.runId !== input.runId) throw new Error(`Async run id mismatch: expected '${input.runId}', found '${status.runId}'.`);\n\tif (status.mode !== \"chain\") throw new Error(`Run '${input.runId}' is ${status.mode}; only active chain runs accept appended steps.`);\n\tif (status.state !== \"running\") throw new Error(`Run '${input.runId}' is ${status.state}; only running chain runs accept appended steps.`);\n\tconst stillInProgress = (status.steps ?? []).some((step) => step.status === \"running\" || step.status === \"pending\") || (status.pendingAppends ?? 0) > 0;\n\tif (!stillInProgress) throw new Error(`Run '${input.runId}' has no running or pending chain steps left; append-step must target an in-progress chain.`);\n\tif (input.steps.length === 0) throw new Error(\"append-step requires one chain step.\");\n\n\tconst request: ChainAppendRequest = {\n\t\tid: randomUUID(),\n\t\tcreatedAt: input.now ?? Date.now(),\n\t\tsteps: input.steps,\n\t};\n\tfs.mkdirSync(appendDir(input.asyncDir), { recursive: true });\n\twriteAtomicJson(appendRequestPath(input.asyncDir, request), request);\n\tconst pendingCount = countPendingChainAppendRequests(input.asyncDir);\n\tconst statusPath = path.join(input.asyncDir, \"status.json\");\n\tconst updatedStatus = { ...status, pendingAppends: pendingCount, lastUpdate: request.createdAt };\n\twriteAtomicJson(statusPath, updatedStatus);\n\tappendJsonl(path.join(input.asyncDir, \"events.jsonl\"), JSON.stringify({\n\t\ttype: \"subagent.chain.append.requested\",\n\t\tts: request.createdAt,\n\t\trunId: input.runId,\n\t\trequestId: request.id,\n\t\tstepCount: input.steps.length,\n\t\tpendingAppends: pendingCount,\n\t}));\n\treturn { request, pendingCount };\n}\n\nfunction readAppendRequest(filePath: string): ChainAppendRequest | undefined {\n\tconst raw = JSON.parse(fs.readFileSync(filePath, \"utf-8\")) as Partial<ChainAppendRequest>;\n\tif (!raw.id || typeof raw.id !== \"string\") return undefined;\n\tif (!Number.isFinite(raw.createdAt)) return undefined;\n\tif (!Array.isArray(raw.steps) || raw.steps.length === 0) return undefined;\n\treturn { id: raw.id, createdAt: raw.createdAt, steps: raw.steps as RunnerStep[] };\n}\n\nexport function readPendingChainAppendRequests(asyncDir: string): ChainAppendRequest[] {\n\treturn listAppendRequestFiles(asyncDir)\n\t\t.map((filePath) => readAppendRequest(filePath))\n\t\t.filter((request): request is ChainAppendRequest => Boolean(request))\n\t\t.sort((left, right) => left.createdAt - right.createdAt || left.id.localeCompare(right.id));\n}\n\nexport function consumeChainAppendRequests(asyncDir: string): ChainAppendRequest[] {\n\tconst requests: ChainAppendRequest[] = [];\n\tfor (const filePath of listAppendRequestFiles(asyncDir)) {\n\t\tconst request = readAppendRequest(filePath);\n\t\ttry {\n\t\t\tfs.unlinkSync(filePath);\n\t\t} catch {\n\t\t\t// The runner should not execute a consumed request twice.\n\t\t}\n\t\tif (request) requests.push(request);\n\t}\n\treturn requests.sort((left, right) => left.createdAt - right.createdAt || left.id.localeCompare(right.id));\n}\n\nfunction statusStepForTask(task: RunnerSubagentStep): StatusStep {\n\treturn {\n\t\tagent: task.agent,\n\t\tphase: task.phase,\n\t\tlabel: task.label,\n\t\toutputName: task.outputName,\n\t\tstructured: task.structured,\n\t\tstatus: \"pending\",\n\t\t...(task.sessionFile ? { sessionFile: task.sessionFile } : {}),\n\t\tskills: task.skills,\n\t\tmodel: task.model,\n\t\tthinking: task.thinking,\n\t\tattemptedModels: task.modelCandidates && task.modelCandidates.length > 0 ? task.modelCandidates : task.model ? [task.model] : undefined,\n\t\trecentTools: [],\n\t\trecentOutput: [],\n\t};\n}\n\nfunction statusStepsForRunnerStep(step: RunnerStep): StatusStep[] {\n\tif (isParallelGroup(step)) return step.parallel.map(statusStepForTask);\n\tif (isDynamicRunnerGroup(step)) {\n\t\treturn [{\n\t\t\tagent: `expand:${step.parallel.agent}`,\n\t\t\tphase: step.phase ?? step.parallel.phase,\n\t\t\tlabel: step.label ?? step.parallel.label ?? `Dynamic fanout (${step.collect.as})`,\n\t\t\toutputName: step.collect.as,\n\t\t\tstructured: Boolean(step.collect.outputSchema),\n\t\t\tstatus: \"pending\",\n\t\t\trecentTools: [],\n\t\t\trecentOutput: [],\n\t\t}];\n\t}\n\treturn [statusStepForTask(step)];\n}\n\nfunction pushPhase(graph: WorkflowGraphSnapshot, phase: string | undefined, nodeId: string): void {\n\tif (!phase) return;\n\tlet group = graph.phases.find((candidate) => candidate.title === phase);\n\tif (!group) {\n\t\tgroup = { title: phase, nodeIds: [] };\n\t\tgraph.phases.push(group);\n\t}\n\tgroup.nodeIds.push(nodeId);\n}\n\nfunction graphNodeForSequential(step: RunnerSubagentStep, stepIndex: number, flatIndex: number): WorkflowGraphNode {\n\treturn {\n\t\tid: `step-${stepIndex}`,\n\t\tkind: \"step\",\n\t\tagent: step.agent,\n\t\tphase: step.phase,\n\t\tlabel: step.label?.trim() || step.agent || `Step ${stepIndex + 1}`,\n\t\tstatus: \"pending\",\n\t\tflatIndex,\n\t\tstepIndex,\n\t\toutputName: step.outputName,\n\t\tstructured: step.structured,\n\t};\n}\n\nfunction graphNodeForParallel(step: ParallelStepGroup, stepIndex: number, flatIndex: number, graph: WorkflowGraphSnapshot): WorkflowGraphNode {\n\tconst children = step.parallel.map((task, taskIndex) => {\n\t\tconst childId = `step-${stepIndex}-agent-${taskIndex}`;\n\t\tpushPhase(graph, task.phase, childId);\n\t\treturn {\n\t\t\tid: childId,\n\t\t\tkind: \"agent\" as const,\n\t\t\tagent: task.agent,\n\t\t\tphase: task.phase,\n\t\t\tlabel: task.label?.trim() || task.agent || `Agent ${taskIndex + 1}`,\n\t\t\tstatus: \"pending\" as const,\n\t\t\tflatIndex: flatIndex + taskIndex,\n\t\t\tstepIndex,\n\t\t\toutputName: task.outputName,\n\t\t\tstructured: task.structured,\n\t\t};\n\t});\n\treturn {\n\t\tid: `step-${stepIndex}`,\n\t\tkind: \"parallel-group\",\n\t\tlabel: step.parallel.length === 1 ? \"Parallel task\" : `Parallel group (${step.parallel.length})`,\n\t\tstatus: \"pending\",\n\t\tstepIndex,\n\t\tchildren,\n\t};\n}\n\nfunction graphNodeForDynamic(step: DynamicRunnerGroup, stepIndex: number): WorkflowGraphNode {\n\treturn {\n\t\tid: `step-${stepIndex}`,\n\t\tkind: \"dynamic-parallel-group\",\n\t\tlabel: step.label?.trim() || step.parallel.label?.trim() || `Dynamic fanout (${step.collect.as})`,\n\t\tstatus: \"pending\",\n\t\tstepIndex,\n\t\toutputName: step.collect.as,\n\t\tstructured: Boolean(step.collect.outputSchema),\n\t\tdynamic: {\n\t\t\tsourceOutput: step.expand.from.output,\n\t\t\tsourcePath: step.expand.from.path,\n\t\t\titemName: step.expand.item ?? \"item\",\n\t\t\tmaxItems: step.expand.maxItems,\n\t\t\tcollectAs: step.collect.as,\n\t\t},\n\t\tchildren: [],\n\t};\n}\n\nfunction appendWorkflowNode(graph: WorkflowGraphSnapshot | undefined, step: RunnerStep, stepIndex: number, flatIndex: number): void {\n\tif (!graph) return;\n\tif (isParallelGroup(step)) {\n\t\tgraph.nodes.push(graphNodeForParallel(step, stepIndex, flatIndex, graph));\n\t\treturn;\n\t}\n\tif (isDynamicRunnerGroup(step)) {\n\t\tgraph.nodes.push(graphNodeForDynamic(step, stepIndex));\n\t\treturn;\n\t}\n\tconst node = graphNodeForSequential(step, stepIndex, flatIndex);\n\tgraph.nodes.push(node);\n\tpushPhase(graph, step.phase, node.id);\n}\n\nexport function appendRunnerStepsToStatus(input: {\n\tstatus: AsyncStatus;\n\tsteps: RunnerStep[];\n\tnow?: number;\n\tpendingAppends?: number;\n}): { addedChainSteps: number; addedFlatSteps: number } {\n\tlet addedChainSteps = 0;\n\tlet addedFlatSteps = 0;\n\tfor (const step of input.steps) {\n\t\tconst stepIndex = input.status.chainStepCount ?? input.status.steps?.length ?? 0;\n\t\tconst flatIndex = input.status.steps?.length ?? 0;\n\t\tconst statusSteps = statusStepsForRunnerStep(step);\n\t\tinput.status.steps ??= [];\n\t\tinput.status.steps.push(...statusSteps);\n\t\tif (isParallelGroup(step)) {\n\t\t\tinput.status.parallelGroups ??= [];\n\t\t\tinput.status.parallelGroups.push({ start: flatIndex, count: step.parallel.length, stepIndex });\n\t\t} else if (isDynamicRunnerGroup(step)) {\n\t\t\tinput.status.parallelGroups ??= [];\n\t\t\tinput.status.parallelGroups.push({ start: flatIndex, count: 1, stepIndex });\n\t\t}\n\t\tappendWorkflowNode(input.status.workflowGraph, step, stepIndex, flatIndex);\n\t\tinput.status.chainStepCount = stepIndex + 1;\n\t\taddedChainSteps++;\n\t\taddedFlatSteps += statusSteps.length;\n\t}\n\tinput.status.pendingAppends = input.pendingAppends ?? 0;\n\tinput.status.lastUpdate = input.now ?? Date.now();\n\treturn { addedChainSteps, addedFlatSteps };\n}\n"]}
1
+ {"version":3,"file":"chain-append.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/background/chain-append.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAA4B,WAAW,EAA4C,MAAM,uBAAuB,CAAC;AAE7H,OAAO,KAAK,EAAyC,UAAU,EAAsB,MAAM,6BAA6B,CAAC;AAKzH,MAAM,WAAW,kBAAkB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,UAAU,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IACjC,OAAO,EAAE,kBAAkB,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;CACrB;AAyBD,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAExE;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,EAAE,CAYnE;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;CACb,GAAG,iBAAiB,CA8BpB;AAUD,wBAAgB,8BAA8B,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,EAAE,CAKrF;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,EAAE,CAYjF;AA6HD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE;IAChD,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAwBtD","sourcesContent":["// @ts-nocheck\nimport { randomUUID } from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { writeAtomicJson } from \"../../shared/atomic-json.ts\";\nimport { appendJsonl } from \"../../shared/artifacts.ts\";\nimport type { AsyncParallelGroupStatus, AsyncStatus, WorkflowGraphNode, WorkflowGraphSnapshot } from \"../../shared/types.ts\";\nimport { readStatus } from \"../../shared/utils.ts\";\nimport type { DynamicRunnerGroup, ParallelStepGroup, RunnerStep, RunnerSubagentStep } from \"../shared/parallel-utils.ts\";\nimport { isDynamicRunnerGroup, isParallelGroup } from \"../shared/parallel-utils.ts\";\n\nconst APPEND_REQUESTS_DIR = \"append-requests\";\n\nexport interface ChainAppendRequest {\n\tid: string;\n\tcreatedAt: number;\n\tsteps: RunnerStep[];\n}\n\nexport interface ChainAppendResult {\n\trequest: ChainAppendRequest;\n\tpendingCount: number;\n}\n\ntype StatusStep = NonNullable<AsyncStatus[\"steps\"]>[number];\n\nfunction appendDir(asyncDir: string): string {\n\treturn path.join(asyncDir, APPEND_REQUESTS_DIR);\n}\n\nfunction appendRequestPath(asyncDir: string, request: ChainAppendRequest): string {\n\treturn path.join(appendDir(asyncDir), `${request.createdAt}-${request.id}.json`);\n}\n\nfunction listAppendRequestFiles(asyncDir: string): string[] {\n\tconst dir = appendDir(asyncDir);\n\ttry {\n\t\treturn fs.readdirSync(dir)\n\t\t\t.filter((entry) => entry.endsWith(\".json\"))\n\t\t\t.map((entry) => path.join(dir, entry))\n\t\t\t.sort();\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") return [];\n\t\tthrow error;\n\t}\n}\n\nexport function countPendingChainAppendRequests(asyncDir: string): number {\n\treturn listAppendRequestFiles(asyncDir).length;\n}\n\nexport function runnerStepOutputNames(steps: RunnerStep[]): string[] {\n\tconst names: string[] = [];\n\tfor (const step of steps) {\n\t\tif (isParallelGroup(step)) {\n\t\t\tnames.push(...step.parallel.map((task) => task.outputName).filter((name): name is string => Boolean(name)));\n\t\t} else if (isDynamicRunnerGroup(step)) {\n\t\t\tif (step.collect.as) names.push(step.collect.as);\n\t\t} else if (step.outputName) {\n\t\t\tnames.push(step.outputName);\n\t\t}\n\t}\n\treturn names;\n}\n\nexport function enqueueChainAppendRequest(input: {\n\tasyncDir: string;\n\trunId: string;\n\tsteps: RunnerStep[];\n\tnow?: number;\n}): ChainAppendResult {\n\tconst status = readStatus(input.asyncDir);\n\tif (!status) throw new Error(`No async run status found for '${input.runId}'.`);\n\tif (status.runId !== input.runId) throw new Error(`Async run id mismatch: expected '${input.runId}', found '${status.runId}'.`);\n\tif (status.mode !== \"chain\") throw new Error(`Run '${input.runId}' is ${status.mode}; only active chain runs accept appended steps.`);\n\tif (status.state !== \"running\") throw new Error(`Run '${input.runId}' is ${status.state}; only running chain runs accept appended steps.`);\n\tconst stillInProgress = (status.steps ?? []).some((step) => step.status === \"running\" || step.status === \"pending\") || (status.pendingAppends ?? 0) > 0;\n\tif (!stillInProgress) throw new Error(`Run '${input.runId}' has no running or pending chain steps left; append-step must target an in-progress chain.`);\n\tif (input.steps.length === 0) throw new Error(\"append-step requires one chain step.\");\n\n\tconst request: ChainAppendRequest = {\n\t\tid: randomUUID(),\n\t\tcreatedAt: input.now ?? Date.now(),\n\t\tsteps: input.steps,\n\t};\n\tfs.mkdirSync(appendDir(input.asyncDir), { recursive: true });\n\twriteAtomicJson(appendRequestPath(input.asyncDir, request), request);\n\tconst pendingCount = countPendingChainAppendRequests(input.asyncDir);\n\tconst statusPath = path.join(input.asyncDir, \"status.json\");\n\tconst updatedStatus = { ...status, pendingAppends: pendingCount, lastUpdate: request.createdAt };\n\twriteAtomicJson(statusPath, updatedStatus);\n\tappendJsonl(path.join(input.asyncDir, \"events.jsonl\"), JSON.stringify({\n\t\ttype: \"subagent.chain.append.requested\",\n\t\tts: request.createdAt,\n\t\trunId: input.runId,\n\t\trequestId: request.id,\n\t\tstepCount: input.steps.length,\n\t\tpendingAppends: pendingCount,\n\t}));\n\treturn { request, pendingCount };\n}\n\nfunction readAppendRequest(filePath: string): ChainAppendRequest | undefined {\n\tconst raw = JSON.parse(fs.readFileSync(filePath, \"utf-8\")) as Partial<ChainAppendRequest>;\n\tif (!raw.id || typeof raw.id !== \"string\") return undefined;\n\tif (!Number.isFinite(raw.createdAt)) return undefined;\n\tif (!Array.isArray(raw.steps) || raw.steps.length === 0) return undefined;\n\treturn { id: raw.id, createdAt: raw.createdAt, steps: raw.steps as RunnerStep[] };\n}\n\nexport function readPendingChainAppendRequests(asyncDir: string): ChainAppendRequest[] {\n\treturn listAppendRequestFiles(asyncDir)\n\t\t.map((filePath) => readAppendRequest(filePath))\n\t\t.filter((request): request is ChainAppendRequest => Boolean(request))\n\t\t.sort((left, right) => left.createdAt - right.createdAt || left.id.localeCompare(right.id));\n}\n\nexport function consumeChainAppendRequests(asyncDir: string): ChainAppendRequest[] {\n\tconst requests: ChainAppendRequest[] = [];\n\tfor (const filePath of listAppendRequestFiles(asyncDir)) {\n\t\tconst request = readAppendRequest(filePath);\n\t\ttry {\n\t\t\tfs.unlinkSync(filePath);\n\t\t} catch {\n\t\t\t// The runner should not execute a consumed request twice.\n\t\t}\n\t\tif (request) requests.push(request);\n\t}\n\treturn requests.sort((left, right) => left.createdAt - right.createdAt || left.id.localeCompare(right.id));\n}\n\nfunction statusStepForTask(task: RunnerSubagentStep): StatusStep {\n\treturn {\n\t\tagent: task.agent,\n\t\tphase: task.phase,\n\t\tlabel: task.label,\n\t\toutputName: task.outputName,\n\t\tstructured: task.structured,\n\t\tstatus: \"pending\",\n\t\t...(task.sessionFile ? { sessionFile: task.sessionFile } : {}),\n\t\tskills: task.skills,\n\t\tmodel: task.model,\n\t\tthinking: task.thinking,\n\t\t...(task.modelSelection ? { modelSelection: task.modelSelection } : {}),\n\t\tattemptedModels: task.modelCandidates && task.modelCandidates.length > 0 ? task.modelCandidates : task.model ? [task.model] : undefined,\n\t\trecentTools: [],\n\t\trecentOutput: [],\n\t};\n}\n\nfunction statusStepsForRunnerStep(step: RunnerStep): StatusStep[] {\n\tif (isParallelGroup(step)) return step.parallel.map(statusStepForTask);\n\tif (isDynamicRunnerGroup(step)) {\n\t\treturn [{\n\t\t\tagent: `expand:${step.parallel.agent}`,\n\t\t\tphase: step.phase ?? step.parallel.phase,\n\t\t\tlabel: step.label ?? step.parallel.label ?? `Dynamic fanout (${step.collect.as})`,\n\t\t\toutputName: step.collect.as,\n\t\t\tstructured: Boolean(step.collect.outputSchema),\n\t\t\tstatus: \"pending\",\n\t\t\trecentTools: [],\n\t\t\trecentOutput: [],\n\t\t}];\n\t}\n\treturn [statusStepForTask(step)];\n}\n\nfunction pushPhase(graph: WorkflowGraphSnapshot, phase: string | undefined, nodeId: string): void {\n\tif (!phase) return;\n\tlet group = graph.phases.find((candidate) => candidate.title === phase);\n\tif (!group) {\n\t\tgroup = { title: phase, nodeIds: [] };\n\t\tgraph.phases.push(group);\n\t}\n\tgroup.nodeIds.push(nodeId);\n}\n\nfunction graphNodeForSequential(step: RunnerSubagentStep, stepIndex: number, flatIndex: number): WorkflowGraphNode {\n\treturn {\n\t\tid: `step-${stepIndex}`,\n\t\tkind: \"step\",\n\t\tagent: step.agent,\n\t\tphase: step.phase,\n\t\tlabel: step.label?.trim() || step.agent || `Step ${stepIndex + 1}`,\n\t\tstatus: \"pending\",\n\t\tflatIndex,\n\t\tstepIndex,\n\t\toutputName: step.outputName,\n\t\tstructured: step.structured,\n\t};\n}\n\nfunction graphNodeForParallel(step: ParallelStepGroup, stepIndex: number, flatIndex: number, graph: WorkflowGraphSnapshot): WorkflowGraphNode {\n\tconst children = step.parallel.map((task, taskIndex) => {\n\t\tconst childId = `step-${stepIndex}-agent-${taskIndex}`;\n\t\tpushPhase(graph, task.phase, childId);\n\t\treturn {\n\t\t\tid: childId,\n\t\t\tkind: \"agent\" as const,\n\t\t\tagent: task.agent,\n\t\t\tphase: task.phase,\n\t\t\tlabel: task.label?.trim() || task.agent || `Agent ${taskIndex + 1}`,\n\t\t\tstatus: \"pending\" as const,\n\t\t\tflatIndex: flatIndex + taskIndex,\n\t\t\tstepIndex,\n\t\t\toutputName: task.outputName,\n\t\t\tstructured: task.structured,\n\t\t};\n\t});\n\treturn {\n\t\tid: `step-${stepIndex}`,\n\t\tkind: \"parallel-group\",\n\t\tlabel: step.parallel.length === 1 ? \"Parallel task\" : `Parallel group (${step.parallel.length})`,\n\t\tstatus: \"pending\",\n\t\tstepIndex,\n\t\tchildren,\n\t};\n}\n\nfunction graphNodeForDynamic(step: DynamicRunnerGroup, stepIndex: number): WorkflowGraphNode {\n\treturn {\n\t\tid: `step-${stepIndex}`,\n\t\tkind: \"dynamic-parallel-group\",\n\t\tlabel: step.label?.trim() || step.parallel.label?.trim() || `Dynamic fanout (${step.collect.as})`,\n\t\tstatus: \"pending\",\n\t\tstepIndex,\n\t\toutputName: step.collect.as,\n\t\tstructured: Boolean(step.collect.outputSchema),\n\t\tdynamic: {\n\t\t\tsourceOutput: step.expand.from.output,\n\t\t\tsourcePath: step.expand.from.path,\n\t\t\titemName: step.expand.item ?? \"item\",\n\t\t\tmaxItems: step.expand.maxItems,\n\t\t\tcollectAs: step.collect.as,\n\t\t},\n\t\tchildren: [],\n\t};\n}\n\nfunction appendWorkflowNode(graph: WorkflowGraphSnapshot | undefined, step: RunnerStep, stepIndex: number, flatIndex: number): void {\n\tif (!graph) return;\n\tif (isParallelGroup(step)) {\n\t\tgraph.nodes.push(graphNodeForParallel(step, stepIndex, flatIndex, graph));\n\t\treturn;\n\t}\n\tif (isDynamicRunnerGroup(step)) {\n\t\tgraph.nodes.push(graphNodeForDynamic(step, stepIndex));\n\t\treturn;\n\t}\n\tconst node = graphNodeForSequential(step, stepIndex, flatIndex);\n\tgraph.nodes.push(node);\n\tpushPhase(graph, step.phase, node.id);\n}\n\nexport function appendRunnerStepsToStatus(input: {\n\tstatus: AsyncStatus;\n\tsteps: RunnerStep[];\n\tnow?: number;\n\tpendingAppends?: number;\n}): { addedChainSteps: number; addedFlatSteps: number } {\n\tlet addedChainSteps = 0;\n\tlet addedFlatSteps = 0;\n\tfor (const step of input.steps) {\n\t\tconst stepIndex = input.status.chainStepCount ?? input.status.steps?.length ?? 0;\n\t\tconst flatIndex = input.status.steps?.length ?? 0;\n\t\tconst statusSteps = statusStepsForRunnerStep(step);\n\t\tinput.status.steps ??= [];\n\t\tinput.status.steps.push(...statusSteps);\n\t\tif (isParallelGroup(step)) {\n\t\t\tinput.status.parallelGroups ??= [];\n\t\t\tinput.status.parallelGroups.push({ start: flatIndex, count: step.parallel.length, stepIndex });\n\t\t} else if (isDynamicRunnerGroup(step)) {\n\t\t\tinput.status.parallelGroups ??= [];\n\t\t\tinput.status.parallelGroups.push({ start: flatIndex, count: 1, stepIndex });\n\t\t}\n\t\tappendWorkflowNode(input.status.workflowGraph, step, stepIndex, flatIndex);\n\t\tinput.status.chainStepCount = stepIndex + 1;\n\t\taddedChainSteps++;\n\t\taddedFlatSteps += statusSteps.length;\n\t}\n\tinput.status.pendingAppends = input.pendingAppends ?? 0;\n\tinput.status.lastUpdate = input.now ?? Date.now();\n\treturn { addedChainSteps, addedFlatSteps };\n}\n"]}
@@ -125,6 +125,7 @@ function statusStepForTask(task) {
125
125
  skills: task.skills,
126
126
  model: task.model,
127
127
  thinking: task.thinking,
128
+ ...(task.modelSelection ? { modelSelection: task.modelSelection } : {}),
128
129
  attemptedModels: task.modelCandidates && task.modelCandidates.length > 0 ? task.modelCandidates : task.model ? [task.model] : undefined,
129
130
  recentTools: [],
130
131
  recentOutput: [],
@@ -1 +1 @@
1
- {"version":3,"file":"chain-append.js","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/background/chain-append.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport { randomUUID } from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { writeAtomicJson } from \"../../shared/atomic-json.ts\";\nimport { appendJsonl } from \"../../shared/artifacts.ts\";\nimport type { AsyncParallelGroupStatus, AsyncStatus, WorkflowGraphNode, WorkflowGraphSnapshot } from \"../../shared/types.ts\";\nimport { readStatus } from \"../../shared/utils.ts\";\nimport type { DynamicRunnerGroup, ParallelStepGroup, RunnerStep, RunnerSubagentStep } from \"../shared/parallel-utils.ts\";\nimport { isDynamicRunnerGroup, isParallelGroup } from \"../shared/parallel-utils.ts\";\n\nconst APPEND_REQUESTS_DIR = \"append-requests\";\n\nexport interface ChainAppendRequest {\n\tid: string;\n\tcreatedAt: number;\n\tsteps: RunnerStep[];\n}\n\nexport interface ChainAppendResult {\n\trequest: ChainAppendRequest;\n\tpendingCount: number;\n}\n\ntype StatusStep = NonNullable<AsyncStatus[\"steps\"]>[number];\n\nfunction appendDir(asyncDir: string): string {\n\treturn path.join(asyncDir, APPEND_REQUESTS_DIR);\n}\n\nfunction appendRequestPath(asyncDir: string, request: ChainAppendRequest): string {\n\treturn path.join(appendDir(asyncDir), `${request.createdAt}-${request.id}.json`);\n}\n\nfunction listAppendRequestFiles(asyncDir: string): string[] {\n\tconst dir = appendDir(asyncDir);\n\ttry {\n\t\treturn fs.readdirSync(dir)\n\t\t\t.filter((entry) => entry.endsWith(\".json\"))\n\t\t\t.map((entry) => path.join(dir, entry))\n\t\t\t.sort();\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") return [];\n\t\tthrow error;\n\t}\n}\n\nexport function countPendingChainAppendRequests(asyncDir: string): number {\n\treturn listAppendRequestFiles(asyncDir).length;\n}\n\nexport function runnerStepOutputNames(steps: RunnerStep[]): string[] {\n\tconst names: string[] = [];\n\tfor (const step of steps) {\n\t\tif (isParallelGroup(step)) {\n\t\t\tnames.push(...step.parallel.map((task) => task.outputName).filter((name): name is string => Boolean(name)));\n\t\t} else if (isDynamicRunnerGroup(step)) {\n\t\t\tif (step.collect.as) names.push(step.collect.as);\n\t\t} else if (step.outputName) {\n\t\t\tnames.push(step.outputName);\n\t\t}\n\t}\n\treturn names;\n}\n\nexport function enqueueChainAppendRequest(input: {\n\tasyncDir: string;\n\trunId: string;\n\tsteps: RunnerStep[];\n\tnow?: number;\n}): ChainAppendResult {\n\tconst status = readStatus(input.asyncDir);\n\tif (!status) throw new Error(`No async run status found for '${input.runId}'.`);\n\tif (status.runId !== input.runId) throw new Error(`Async run id mismatch: expected '${input.runId}', found '${status.runId}'.`);\n\tif (status.mode !== \"chain\") throw new Error(`Run '${input.runId}' is ${status.mode}; only active chain runs accept appended steps.`);\n\tif (status.state !== \"running\") throw new Error(`Run '${input.runId}' is ${status.state}; only running chain runs accept appended steps.`);\n\tconst stillInProgress = (status.steps ?? []).some((step) => step.status === \"running\" || step.status === \"pending\") || (status.pendingAppends ?? 0) > 0;\n\tif (!stillInProgress) throw new Error(`Run '${input.runId}' has no running or pending chain steps left; append-step must target an in-progress chain.`);\n\tif (input.steps.length === 0) throw new Error(\"append-step requires one chain step.\");\n\n\tconst request: ChainAppendRequest = {\n\t\tid: randomUUID(),\n\t\tcreatedAt: input.now ?? Date.now(),\n\t\tsteps: input.steps,\n\t};\n\tfs.mkdirSync(appendDir(input.asyncDir), { recursive: true });\n\twriteAtomicJson(appendRequestPath(input.asyncDir, request), request);\n\tconst pendingCount = countPendingChainAppendRequests(input.asyncDir);\n\tconst statusPath = path.join(input.asyncDir, \"status.json\");\n\tconst updatedStatus = { ...status, pendingAppends: pendingCount, lastUpdate: request.createdAt };\n\twriteAtomicJson(statusPath, updatedStatus);\n\tappendJsonl(path.join(input.asyncDir, \"events.jsonl\"), JSON.stringify({\n\t\ttype: \"subagent.chain.append.requested\",\n\t\tts: request.createdAt,\n\t\trunId: input.runId,\n\t\trequestId: request.id,\n\t\tstepCount: input.steps.length,\n\t\tpendingAppends: pendingCount,\n\t}));\n\treturn { request, pendingCount };\n}\n\nfunction readAppendRequest(filePath: string): ChainAppendRequest | undefined {\n\tconst raw = JSON.parse(fs.readFileSync(filePath, \"utf-8\")) as Partial<ChainAppendRequest>;\n\tif (!raw.id || typeof raw.id !== \"string\") return undefined;\n\tif (!Number.isFinite(raw.createdAt)) return undefined;\n\tif (!Array.isArray(raw.steps) || raw.steps.length === 0) return undefined;\n\treturn { id: raw.id, createdAt: raw.createdAt, steps: raw.steps as RunnerStep[] };\n}\n\nexport function readPendingChainAppendRequests(asyncDir: string): ChainAppendRequest[] {\n\treturn listAppendRequestFiles(asyncDir)\n\t\t.map((filePath) => readAppendRequest(filePath))\n\t\t.filter((request): request is ChainAppendRequest => Boolean(request))\n\t\t.sort((left, right) => left.createdAt - right.createdAt || left.id.localeCompare(right.id));\n}\n\nexport function consumeChainAppendRequests(asyncDir: string): ChainAppendRequest[] {\n\tconst requests: ChainAppendRequest[] = [];\n\tfor (const filePath of listAppendRequestFiles(asyncDir)) {\n\t\tconst request = readAppendRequest(filePath);\n\t\ttry {\n\t\t\tfs.unlinkSync(filePath);\n\t\t} catch {\n\t\t\t// The runner should not execute a consumed request twice.\n\t\t}\n\t\tif (request) requests.push(request);\n\t}\n\treturn requests.sort((left, right) => left.createdAt - right.createdAt || left.id.localeCompare(right.id));\n}\n\nfunction statusStepForTask(task: RunnerSubagentStep): StatusStep {\n\treturn {\n\t\tagent: task.agent,\n\t\tphase: task.phase,\n\t\tlabel: task.label,\n\t\toutputName: task.outputName,\n\t\tstructured: task.structured,\n\t\tstatus: \"pending\",\n\t\t...(task.sessionFile ? { sessionFile: task.sessionFile } : {}),\n\t\tskills: task.skills,\n\t\tmodel: task.model,\n\t\tthinking: task.thinking,\n\t\tattemptedModels: task.modelCandidates && task.modelCandidates.length > 0 ? task.modelCandidates : task.model ? [task.model] : undefined,\n\t\trecentTools: [],\n\t\trecentOutput: [],\n\t};\n}\n\nfunction statusStepsForRunnerStep(step: RunnerStep): StatusStep[] {\n\tif (isParallelGroup(step)) return step.parallel.map(statusStepForTask);\n\tif (isDynamicRunnerGroup(step)) {\n\t\treturn [{\n\t\t\tagent: `expand:${step.parallel.agent}`,\n\t\t\tphase: step.phase ?? step.parallel.phase,\n\t\t\tlabel: step.label ?? step.parallel.label ?? `Dynamic fanout (${step.collect.as})`,\n\t\t\toutputName: step.collect.as,\n\t\t\tstructured: Boolean(step.collect.outputSchema),\n\t\t\tstatus: \"pending\",\n\t\t\trecentTools: [],\n\t\t\trecentOutput: [],\n\t\t}];\n\t}\n\treturn [statusStepForTask(step)];\n}\n\nfunction pushPhase(graph: WorkflowGraphSnapshot, phase: string | undefined, nodeId: string): void {\n\tif (!phase) return;\n\tlet group = graph.phases.find((candidate) => candidate.title === phase);\n\tif (!group) {\n\t\tgroup = { title: phase, nodeIds: [] };\n\t\tgraph.phases.push(group);\n\t}\n\tgroup.nodeIds.push(nodeId);\n}\n\nfunction graphNodeForSequential(step: RunnerSubagentStep, stepIndex: number, flatIndex: number): WorkflowGraphNode {\n\treturn {\n\t\tid: `step-${stepIndex}`,\n\t\tkind: \"step\",\n\t\tagent: step.agent,\n\t\tphase: step.phase,\n\t\tlabel: step.label?.trim() || step.agent || `Step ${stepIndex + 1}`,\n\t\tstatus: \"pending\",\n\t\tflatIndex,\n\t\tstepIndex,\n\t\toutputName: step.outputName,\n\t\tstructured: step.structured,\n\t};\n}\n\nfunction graphNodeForParallel(step: ParallelStepGroup, stepIndex: number, flatIndex: number, graph: WorkflowGraphSnapshot): WorkflowGraphNode {\n\tconst children = step.parallel.map((task, taskIndex) => {\n\t\tconst childId = `step-${stepIndex}-agent-${taskIndex}`;\n\t\tpushPhase(graph, task.phase, childId);\n\t\treturn {\n\t\t\tid: childId,\n\t\t\tkind: \"agent\" as const,\n\t\t\tagent: task.agent,\n\t\t\tphase: task.phase,\n\t\t\tlabel: task.label?.trim() || task.agent || `Agent ${taskIndex + 1}`,\n\t\t\tstatus: \"pending\" as const,\n\t\t\tflatIndex: flatIndex + taskIndex,\n\t\t\tstepIndex,\n\t\t\toutputName: task.outputName,\n\t\t\tstructured: task.structured,\n\t\t};\n\t});\n\treturn {\n\t\tid: `step-${stepIndex}`,\n\t\tkind: \"parallel-group\",\n\t\tlabel: step.parallel.length === 1 ? \"Parallel task\" : `Parallel group (${step.parallel.length})`,\n\t\tstatus: \"pending\",\n\t\tstepIndex,\n\t\tchildren,\n\t};\n}\n\nfunction graphNodeForDynamic(step: DynamicRunnerGroup, stepIndex: number): WorkflowGraphNode {\n\treturn {\n\t\tid: `step-${stepIndex}`,\n\t\tkind: \"dynamic-parallel-group\",\n\t\tlabel: step.label?.trim() || step.parallel.label?.trim() || `Dynamic fanout (${step.collect.as})`,\n\t\tstatus: \"pending\",\n\t\tstepIndex,\n\t\toutputName: step.collect.as,\n\t\tstructured: Boolean(step.collect.outputSchema),\n\t\tdynamic: {\n\t\t\tsourceOutput: step.expand.from.output,\n\t\t\tsourcePath: step.expand.from.path,\n\t\t\titemName: step.expand.item ?? \"item\",\n\t\t\tmaxItems: step.expand.maxItems,\n\t\t\tcollectAs: step.collect.as,\n\t\t},\n\t\tchildren: [],\n\t};\n}\n\nfunction appendWorkflowNode(graph: WorkflowGraphSnapshot | undefined, step: RunnerStep, stepIndex: number, flatIndex: number): void {\n\tif (!graph) return;\n\tif (isParallelGroup(step)) {\n\t\tgraph.nodes.push(graphNodeForParallel(step, stepIndex, flatIndex, graph));\n\t\treturn;\n\t}\n\tif (isDynamicRunnerGroup(step)) {\n\t\tgraph.nodes.push(graphNodeForDynamic(step, stepIndex));\n\t\treturn;\n\t}\n\tconst node = graphNodeForSequential(step, stepIndex, flatIndex);\n\tgraph.nodes.push(node);\n\tpushPhase(graph, step.phase, node.id);\n}\n\nexport function appendRunnerStepsToStatus(input: {\n\tstatus: AsyncStatus;\n\tsteps: RunnerStep[];\n\tnow?: number;\n\tpendingAppends?: number;\n}): { addedChainSteps: number; addedFlatSteps: number } {\n\tlet addedChainSteps = 0;\n\tlet addedFlatSteps = 0;\n\tfor (const step of input.steps) {\n\t\tconst stepIndex = input.status.chainStepCount ?? input.status.steps?.length ?? 0;\n\t\tconst flatIndex = input.status.steps?.length ?? 0;\n\t\tconst statusSteps = statusStepsForRunnerStep(step);\n\t\tinput.status.steps ??= [];\n\t\tinput.status.steps.push(...statusSteps);\n\t\tif (isParallelGroup(step)) {\n\t\t\tinput.status.parallelGroups ??= [];\n\t\t\tinput.status.parallelGroups.push({ start: flatIndex, count: step.parallel.length, stepIndex });\n\t\t} else if (isDynamicRunnerGroup(step)) {\n\t\t\tinput.status.parallelGroups ??= [];\n\t\t\tinput.status.parallelGroups.push({ start: flatIndex, count: 1, stepIndex });\n\t\t}\n\t\tappendWorkflowNode(input.status.workflowGraph, step, stepIndex, flatIndex);\n\t\tinput.status.chainStepCount = stepIndex + 1;\n\t\taddedChainSteps++;\n\t\taddedFlatSteps += statusSteps.length;\n\t}\n\tinput.status.pendingAppends = input.pendingAppends ?? 0;\n\tinput.status.lastUpdate = input.now ?? Date.now();\n\treturn { addedChainSteps, addedFlatSteps };\n}\n"]}
1
+ {"version":3,"file":"chain-append.js","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/background/chain-append.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport { randomUUID } from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { writeAtomicJson } from \"../../shared/atomic-json.ts\";\nimport { appendJsonl } from \"../../shared/artifacts.ts\";\nimport type { AsyncParallelGroupStatus, AsyncStatus, WorkflowGraphNode, WorkflowGraphSnapshot } from \"../../shared/types.ts\";\nimport { readStatus } from \"../../shared/utils.ts\";\nimport type { DynamicRunnerGroup, ParallelStepGroup, RunnerStep, RunnerSubagentStep } from \"../shared/parallel-utils.ts\";\nimport { isDynamicRunnerGroup, isParallelGroup } from \"../shared/parallel-utils.ts\";\n\nconst APPEND_REQUESTS_DIR = \"append-requests\";\n\nexport interface ChainAppendRequest {\n\tid: string;\n\tcreatedAt: number;\n\tsteps: RunnerStep[];\n}\n\nexport interface ChainAppendResult {\n\trequest: ChainAppendRequest;\n\tpendingCount: number;\n}\n\ntype StatusStep = NonNullable<AsyncStatus[\"steps\"]>[number];\n\nfunction appendDir(asyncDir: string): string {\n\treturn path.join(asyncDir, APPEND_REQUESTS_DIR);\n}\n\nfunction appendRequestPath(asyncDir: string, request: ChainAppendRequest): string {\n\treturn path.join(appendDir(asyncDir), `${request.createdAt}-${request.id}.json`);\n}\n\nfunction listAppendRequestFiles(asyncDir: string): string[] {\n\tconst dir = appendDir(asyncDir);\n\ttry {\n\t\treturn fs.readdirSync(dir)\n\t\t\t.filter((entry) => entry.endsWith(\".json\"))\n\t\t\t.map((entry) => path.join(dir, entry))\n\t\t\t.sort();\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") return [];\n\t\tthrow error;\n\t}\n}\n\nexport function countPendingChainAppendRequests(asyncDir: string): number {\n\treturn listAppendRequestFiles(asyncDir).length;\n}\n\nexport function runnerStepOutputNames(steps: RunnerStep[]): string[] {\n\tconst names: string[] = [];\n\tfor (const step of steps) {\n\t\tif (isParallelGroup(step)) {\n\t\t\tnames.push(...step.parallel.map((task) => task.outputName).filter((name): name is string => Boolean(name)));\n\t\t} else if (isDynamicRunnerGroup(step)) {\n\t\t\tif (step.collect.as) names.push(step.collect.as);\n\t\t} else if (step.outputName) {\n\t\t\tnames.push(step.outputName);\n\t\t}\n\t}\n\treturn names;\n}\n\nexport function enqueueChainAppendRequest(input: {\n\tasyncDir: string;\n\trunId: string;\n\tsteps: RunnerStep[];\n\tnow?: number;\n}): ChainAppendResult {\n\tconst status = readStatus(input.asyncDir);\n\tif (!status) throw new Error(`No async run status found for '${input.runId}'.`);\n\tif (status.runId !== input.runId) throw new Error(`Async run id mismatch: expected '${input.runId}', found '${status.runId}'.`);\n\tif (status.mode !== \"chain\") throw new Error(`Run '${input.runId}' is ${status.mode}; only active chain runs accept appended steps.`);\n\tif (status.state !== \"running\") throw new Error(`Run '${input.runId}' is ${status.state}; only running chain runs accept appended steps.`);\n\tconst stillInProgress = (status.steps ?? []).some((step) => step.status === \"running\" || step.status === \"pending\") || (status.pendingAppends ?? 0) > 0;\n\tif (!stillInProgress) throw new Error(`Run '${input.runId}' has no running or pending chain steps left; append-step must target an in-progress chain.`);\n\tif (input.steps.length === 0) throw new Error(\"append-step requires one chain step.\");\n\n\tconst request: ChainAppendRequest = {\n\t\tid: randomUUID(),\n\t\tcreatedAt: input.now ?? Date.now(),\n\t\tsteps: input.steps,\n\t};\n\tfs.mkdirSync(appendDir(input.asyncDir), { recursive: true });\n\twriteAtomicJson(appendRequestPath(input.asyncDir, request), request);\n\tconst pendingCount = countPendingChainAppendRequests(input.asyncDir);\n\tconst statusPath = path.join(input.asyncDir, \"status.json\");\n\tconst updatedStatus = { ...status, pendingAppends: pendingCount, lastUpdate: request.createdAt };\n\twriteAtomicJson(statusPath, updatedStatus);\n\tappendJsonl(path.join(input.asyncDir, \"events.jsonl\"), JSON.stringify({\n\t\ttype: \"subagent.chain.append.requested\",\n\t\tts: request.createdAt,\n\t\trunId: input.runId,\n\t\trequestId: request.id,\n\t\tstepCount: input.steps.length,\n\t\tpendingAppends: pendingCount,\n\t}));\n\treturn { request, pendingCount };\n}\n\nfunction readAppendRequest(filePath: string): ChainAppendRequest | undefined {\n\tconst raw = JSON.parse(fs.readFileSync(filePath, \"utf-8\")) as Partial<ChainAppendRequest>;\n\tif (!raw.id || typeof raw.id !== \"string\") return undefined;\n\tif (!Number.isFinite(raw.createdAt)) return undefined;\n\tif (!Array.isArray(raw.steps) || raw.steps.length === 0) return undefined;\n\treturn { id: raw.id, createdAt: raw.createdAt, steps: raw.steps as RunnerStep[] };\n}\n\nexport function readPendingChainAppendRequests(asyncDir: string): ChainAppendRequest[] {\n\treturn listAppendRequestFiles(asyncDir)\n\t\t.map((filePath) => readAppendRequest(filePath))\n\t\t.filter((request): request is ChainAppendRequest => Boolean(request))\n\t\t.sort((left, right) => left.createdAt - right.createdAt || left.id.localeCompare(right.id));\n}\n\nexport function consumeChainAppendRequests(asyncDir: string): ChainAppendRequest[] {\n\tconst requests: ChainAppendRequest[] = [];\n\tfor (const filePath of listAppendRequestFiles(asyncDir)) {\n\t\tconst request = readAppendRequest(filePath);\n\t\ttry {\n\t\t\tfs.unlinkSync(filePath);\n\t\t} catch {\n\t\t\t// The runner should not execute a consumed request twice.\n\t\t}\n\t\tif (request) requests.push(request);\n\t}\n\treturn requests.sort((left, right) => left.createdAt - right.createdAt || left.id.localeCompare(right.id));\n}\n\nfunction statusStepForTask(task: RunnerSubagentStep): StatusStep {\n\treturn {\n\t\tagent: task.agent,\n\t\tphase: task.phase,\n\t\tlabel: task.label,\n\t\toutputName: task.outputName,\n\t\tstructured: task.structured,\n\t\tstatus: \"pending\",\n\t\t...(task.sessionFile ? { sessionFile: task.sessionFile } : {}),\n\t\tskills: task.skills,\n\t\tmodel: task.model,\n\t\tthinking: task.thinking,\n\t\t...(task.modelSelection ? { modelSelection: task.modelSelection } : {}),\n\t\tattemptedModels: task.modelCandidates && task.modelCandidates.length > 0 ? task.modelCandidates : task.model ? [task.model] : undefined,\n\t\trecentTools: [],\n\t\trecentOutput: [],\n\t};\n}\n\nfunction statusStepsForRunnerStep(step: RunnerStep): StatusStep[] {\n\tif (isParallelGroup(step)) return step.parallel.map(statusStepForTask);\n\tif (isDynamicRunnerGroup(step)) {\n\t\treturn [{\n\t\t\tagent: `expand:${step.parallel.agent}`,\n\t\t\tphase: step.phase ?? step.parallel.phase,\n\t\t\tlabel: step.label ?? step.parallel.label ?? `Dynamic fanout (${step.collect.as})`,\n\t\t\toutputName: step.collect.as,\n\t\t\tstructured: Boolean(step.collect.outputSchema),\n\t\t\tstatus: \"pending\",\n\t\t\trecentTools: [],\n\t\t\trecentOutput: [],\n\t\t}];\n\t}\n\treturn [statusStepForTask(step)];\n}\n\nfunction pushPhase(graph: WorkflowGraphSnapshot, phase: string | undefined, nodeId: string): void {\n\tif (!phase) return;\n\tlet group = graph.phases.find((candidate) => candidate.title === phase);\n\tif (!group) {\n\t\tgroup = { title: phase, nodeIds: [] };\n\t\tgraph.phases.push(group);\n\t}\n\tgroup.nodeIds.push(nodeId);\n}\n\nfunction graphNodeForSequential(step: RunnerSubagentStep, stepIndex: number, flatIndex: number): WorkflowGraphNode {\n\treturn {\n\t\tid: `step-${stepIndex}`,\n\t\tkind: \"step\",\n\t\tagent: step.agent,\n\t\tphase: step.phase,\n\t\tlabel: step.label?.trim() || step.agent || `Step ${stepIndex + 1}`,\n\t\tstatus: \"pending\",\n\t\tflatIndex,\n\t\tstepIndex,\n\t\toutputName: step.outputName,\n\t\tstructured: step.structured,\n\t};\n}\n\nfunction graphNodeForParallel(step: ParallelStepGroup, stepIndex: number, flatIndex: number, graph: WorkflowGraphSnapshot): WorkflowGraphNode {\n\tconst children = step.parallel.map((task, taskIndex) => {\n\t\tconst childId = `step-${stepIndex}-agent-${taskIndex}`;\n\t\tpushPhase(graph, task.phase, childId);\n\t\treturn {\n\t\t\tid: childId,\n\t\t\tkind: \"agent\" as const,\n\t\t\tagent: task.agent,\n\t\t\tphase: task.phase,\n\t\t\tlabel: task.label?.trim() || task.agent || `Agent ${taskIndex + 1}`,\n\t\t\tstatus: \"pending\" as const,\n\t\t\tflatIndex: flatIndex + taskIndex,\n\t\t\tstepIndex,\n\t\t\toutputName: task.outputName,\n\t\t\tstructured: task.structured,\n\t\t};\n\t});\n\treturn {\n\t\tid: `step-${stepIndex}`,\n\t\tkind: \"parallel-group\",\n\t\tlabel: step.parallel.length === 1 ? \"Parallel task\" : `Parallel group (${step.parallel.length})`,\n\t\tstatus: \"pending\",\n\t\tstepIndex,\n\t\tchildren,\n\t};\n}\n\nfunction graphNodeForDynamic(step: DynamicRunnerGroup, stepIndex: number): WorkflowGraphNode {\n\treturn {\n\t\tid: `step-${stepIndex}`,\n\t\tkind: \"dynamic-parallel-group\",\n\t\tlabel: step.label?.trim() || step.parallel.label?.trim() || `Dynamic fanout (${step.collect.as})`,\n\t\tstatus: \"pending\",\n\t\tstepIndex,\n\t\toutputName: step.collect.as,\n\t\tstructured: Boolean(step.collect.outputSchema),\n\t\tdynamic: {\n\t\t\tsourceOutput: step.expand.from.output,\n\t\t\tsourcePath: step.expand.from.path,\n\t\t\titemName: step.expand.item ?? \"item\",\n\t\t\tmaxItems: step.expand.maxItems,\n\t\t\tcollectAs: step.collect.as,\n\t\t},\n\t\tchildren: [],\n\t};\n}\n\nfunction appendWorkflowNode(graph: WorkflowGraphSnapshot | undefined, step: RunnerStep, stepIndex: number, flatIndex: number): void {\n\tif (!graph) return;\n\tif (isParallelGroup(step)) {\n\t\tgraph.nodes.push(graphNodeForParallel(step, stepIndex, flatIndex, graph));\n\t\treturn;\n\t}\n\tif (isDynamicRunnerGroup(step)) {\n\t\tgraph.nodes.push(graphNodeForDynamic(step, stepIndex));\n\t\treturn;\n\t}\n\tconst node = graphNodeForSequential(step, stepIndex, flatIndex);\n\tgraph.nodes.push(node);\n\tpushPhase(graph, step.phase, node.id);\n}\n\nexport function appendRunnerStepsToStatus(input: {\n\tstatus: AsyncStatus;\n\tsteps: RunnerStep[];\n\tnow?: number;\n\tpendingAppends?: number;\n}): { addedChainSteps: number; addedFlatSteps: number } {\n\tlet addedChainSteps = 0;\n\tlet addedFlatSteps = 0;\n\tfor (const step of input.steps) {\n\t\tconst stepIndex = input.status.chainStepCount ?? input.status.steps?.length ?? 0;\n\t\tconst flatIndex = input.status.steps?.length ?? 0;\n\t\tconst statusSteps = statusStepsForRunnerStep(step);\n\t\tinput.status.steps ??= [];\n\t\tinput.status.steps.push(...statusSteps);\n\t\tif (isParallelGroup(step)) {\n\t\t\tinput.status.parallelGroups ??= [];\n\t\t\tinput.status.parallelGroups.push({ start: flatIndex, count: step.parallel.length, stepIndex });\n\t\t} else if (isDynamicRunnerGroup(step)) {\n\t\t\tinput.status.parallelGroups ??= [];\n\t\t\tinput.status.parallelGroups.push({ start: flatIndex, count: 1, stepIndex });\n\t\t}\n\t\tappendWorkflowNode(input.status.workflowGraph, step, stepIndex, flatIndex);\n\t\tinput.status.chainStepCount = stepIndex + 1;\n\t\taddedChainSteps++;\n\t\taddedFlatSteps += statusSteps.length;\n\t}\n\tinput.status.pendingAppends = input.pendingAppends ?? 0;\n\tinput.status.lastUpdate = input.now ?? Date.now();\n\treturn { addedChainSteps, addedFlatSteps };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"chain-root-attachment.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAe,WAAW,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGtG,MAAM,WAAW,iBAAiB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,uBAAuB;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAC/B,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB;AA0ID,wBAAsB,wBAAwB,CAC7C,IAAI,EAAE,iBAAiB,EACvB,OAAO,GAAE;IAAE,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAO,GACjJ,OAAO,CAAC,uBAAuB,CAAC,CAuBlC;AAED,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEpF","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { AcceptanceLedger, AsyncStatus, CostSummary, ModelAttempt } from \"../../shared/types.ts\";\nimport { readStatus } from \"../../shared/utils.ts\";\n\nexport interface ImportedAsyncRoot {\n\trunId: string;\n\tasyncDir: string;\n\tresultPath: string;\n\tindex: number;\n}\n\nexport interface ImportedAsyncRootResult {\n\tagent: string;\n\toutput: string;\n\tsuccess: boolean;\n\texitCode: number;\n\terror?: string;\n\tsessionFile?: string;\n\tintercomTarget?: string;\n\tmodel?: string;\n\tattemptedModels?: string[];\n\tmodelAttempts?: ModelAttempt[];\n\ttotalCost?: CostSummary;\n\tstructuredOutput?: unknown;\n\tstructuredOutputPath?: string;\n\tstructuredOutputSchemaPath?: string;\n\tacceptance?: AcceptanceLedger;\n\ttimedOut?: boolean;\n\tstopped?: boolean;\n}\n\ninterface AsyncResultFile {\n\tstate?: string;\n\tsuccess?: boolean;\n\tsummary?: string;\n\terror?: string;\n\ttimedOut?: boolean;\n\tstopped?: boolean;\n\tresults?: Array<{\n\t\tagent?: string;\n\t\toutput?: string;\n\t\terror?: string;\n\t\tsuccess?: boolean;\n\t\ttimedOut?: boolean;\n\t\tstopped?: boolean;\n\t\tsessionFile?: string;\n\t\tintercomTarget?: string;\n\t\tmodel?: string;\n\t\tattemptedModels?: string[];\n\t\tmodelAttempts?: ModelAttempt[];\n\t\ttotalCost?: CostSummary;\n\t\tstructuredOutput?: unknown;\n\t\tstructuredOutputPath?: string;\n\t\tstructuredOutputSchemaPath?: string;\n\t\tacceptance?: AcceptanceLedger;\n\t}>;\n}\n\nconst TERMINAL_STATES = new Set([\"complete\", \"failed\", \"paused\", \"stopped\"]);\nconst TERMINAL_STEP_STATUSES = new Set([\"complete\", \"completed\", \"failed\", \"paused\", \"stopped\"]);\n\nfunction readResultFile(resultPath: string): AsyncResultFile | undefined {\n\ttry {\n\t\treturn JSON.parse(fs.readFileSync(resultPath, \"utf-8\")) as AsyncResultFile;\n\t} catch (error) {\n\t\tif (typeof error === \"object\" && error !== null && \"code\" in error && (error as NodeJS.ErrnoException).code === \"ENOENT\") {\n\t\t\treturn undefined;\n\t\t}\n\t\tthrow error;\n\t}\n}\n\nfunction selectedStatusStep(status: AsyncStatus | null, index: number): NonNullable<AsyncStatus[\"steps\"]>[number] | undefined {\n\treturn status?.steps?.[index];\n}\n\nfunction isTerminalStatus(status: AsyncStatus | null, index: number): boolean {\n\tif (!status) return false;\n\tconst step = selectedStatusStep(status, index);\n\tif (step && TERMINAL_STEP_STATUSES.has(step.status)) return true;\n\treturn TERMINAL_STATES.has(status.state);\n}\n\nfunction resultState(result: AsyncResultFile | undefined, child: NonNullable<AsyncResultFile[\"results\"]>[number] | undefined): \"complete\" | \"failed\" | \"paused\" | \"stopped\" | undefined {\n\tif (!result) return undefined;\n\tif (child?.stopped === true) return \"stopped\";\n\tif (child?.success === true) return \"complete\";\n\tif (child?.success === false) return result.state === \"stopped\" ? \"stopped\" : result.state === \"paused\" ? \"paused\" : \"failed\";\n\tif (result.state === \"complete\" || result.state === \"failed\" || result.state === \"paused\" || result.state === \"stopped\") return result.state;\n\tif (result.success === true) return \"complete\";\n\tif (result.success === false) return \"failed\";\n\treturn undefined;\n}\n\nfunction outputFromTerminalStatus(root: ImportedAsyncRoot, status: AsyncStatus, step: NonNullable<AsyncStatus[\"steps\"]>[number] | undefined): ImportedAsyncRootResult {\n\tconst agent = step?.agent ?? status.steps?.[root.index]?.agent ?? \"subagent\";\n\tconst timedOut = step?.timedOut === true || status.timedOut === true;\n\tconst stopped = step?.stopped === true || status.stopped === true || status.state === \"stopped\";\n\tconst message = step?.error ?? status.error ?? (stopped ? \"Subagent stopped by user.\" : `Attached async root ${root.runId} ended without a result file at ${root.resultPath}.`);\n\treturn {\n\t\tagent,\n\t\toutput: message,\n\t\tsuccess: false,\n\t\texitCode: 1,\n\t\terror: message,\n\t\t...(timedOut ? { timedOut: true } : {}),\n\t\t...(stopped ? { stopped: true } : {}),\n\t\t...(step?.sessionFile ?? status.sessionFile ? { sessionFile: step?.sessionFile ?? status.sessionFile } : {}),\n\t\t...(step?.model ? { model: step.model } : {}),\n\t\t...(step?.attemptedModels ? { attemptedModels: step.attemptedModels } : {}),\n\t\t...(step?.modelAttempts ? { modelAttempts: step.modelAttempts } : {}),\n\t\t...(step?.totalCost ? { totalCost: step.totalCost } : {}),\n\t\t...(step?.structuredOutput !== undefined ? { structuredOutput: step.structuredOutput } : {}),\n\t\t...(step?.structuredOutputPath ? { structuredOutputPath: step.structuredOutputPath } : {}),\n\t\t...(step?.structuredOutputSchemaPath ? { structuredOutputSchemaPath: step.structuredOutputSchemaPath } : {}),\n\t\t...(step?.acceptance ? { acceptance: step.acceptance } : {}),\n\t};\n}\n\nfunction outputFromTimeout(root: ImportedAsyncRoot, status: AsyncStatus | null, message: string): ImportedAsyncRootResult {\n\tconst step = selectedStatusStep(status, root.index);\n\treturn {\n\t\tagent: step?.agent ?? status?.steps?.[root.index]?.agent ?? \"subagent\",\n\t\toutput: message,\n\t\tsuccess: false,\n\t\texitCode: 1,\n\t\terror: message,\n\t\ttimedOut: true,\n\t\t...(step?.sessionFile ?? status?.sessionFile ? { sessionFile: step?.sessionFile ?? status?.sessionFile } : {}),\n\t\t...(step?.model ? { model: step.model } : {}),\n\t\t...(step?.attemptedModels ? { attemptedModels: step.attemptedModels } : {}),\n\t\t...(step?.modelAttempts ? { modelAttempts: step.modelAttempts } : {}),\n\t\t...(step?.totalCost ? { totalCost: step.totalCost } : {}),\n\t};\n}\n\nfunction buildImportedResult(root: ImportedAsyncRoot, status: AsyncStatus | null, result: AsyncResultFile): ImportedAsyncRootResult {\n\tconst child = result.results?.[root.index];\n\tconst step = selectedStatusStep(status, root.index);\n\tconst state = resultState(result, child);\n\tconst agent = child?.agent ?? step?.agent ?? status?.steps?.[root.index]?.agent ?? \"subagent\";\n\tconst output = child?.output ?? result.summary ?? \"\";\n\tconst timedOut = child?.timedOut === true || step?.timedOut === true || result.timedOut === true || status?.timedOut === true;\n\tconst stopped = child?.stopped === true || step?.stopped === true || result.stopped === true || status?.stopped === true || state === \"stopped\";\n\tconst success = state === \"complete\" && !timedOut && !stopped;\n\tconst error = child?.error ?? (success ? undefined : stopped ? \"Subagent stopped by user.\" : result.error ?? result.summary ?? status?.error ?? `Attached async root ${root.runId} did not complete successfully.`);\n\treturn {\n\t\tagent,\n\t\toutput: success ? output : (output || error || \"\"),\n\t\tsuccess,\n\t\texitCode: success ? 0 : 1,\n\t\t...(error ? { error } : {}),\n\t\t...(timedOut ? { timedOut: true } : {}),\n\t\t...(stopped ? { stopped: true } : {}),\n\t\t...(child?.sessionFile ?? step?.sessionFile ?? status?.sessionFile ? { sessionFile: child?.sessionFile ?? step?.sessionFile ?? status?.sessionFile } : {}),\n\t\t...(child?.intercomTarget ? { intercomTarget: child.intercomTarget } : {}),\n\t\t...(child?.model ?? step?.model ? { model: child?.model ?? step?.model } : {}),\n\t\t...(child?.attemptedModels ?? step?.attemptedModels ? { attemptedModels: child?.attemptedModels ?? step?.attemptedModels } : {}),\n\t\t...(child?.modelAttempts ?? step?.modelAttempts ? { modelAttempts: child?.modelAttempts ?? step?.modelAttempts } : {}),\n\t\t...(child?.totalCost ?? step?.totalCost ? { totalCost: child?.totalCost ?? step?.totalCost } : {}),\n\t\t...(child?.structuredOutput !== undefined ? { structuredOutput: child.structuredOutput } : step?.structuredOutput !== undefined ? { structuredOutput: step.structuredOutput } : {}),\n\t\t...(child?.structuredOutputPath ?? step?.structuredOutputPath ? { structuredOutputPath: child?.structuredOutputPath ?? step?.structuredOutputPath } : {}),\n\t\t...(child?.structuredOutputSchemaPath ?? step?.structuredOutputSchemaPath ? { structuredOutputSchemaPath: child?.structuredOutputSchemaPath ?? step?.structuredOutputSchemaPath } : {}),\n\t\t...(child?.acceptance ?? step?.acceptance ? { acceptance: child?.acceptance ?? step?.acceptance } : {}),\n\t};\n}\n\nexport async function waitForImportedAsyncRoot(\n\troot: ImportedAsyncRoot,\n\toptions: { pollIntervalMs?: number; terminalResultGraceMs?: number; now?: () => number; shouldAbort?: () => boolean; timeoutMessage?: string } = {},\n): Promise<ImportedAsyncRootResult> {\n\tconst pollIntervalMs = options.pollIntervalMs ?? 500;\n\tconst terminalResultGraceMs = options.terminalResultGraceMs ?? 1_000;\n\tconst now = options.now ?? Date.now;\n\tlet terminalSince: number | undefined;\n\tfor (;;) {\n\t\tconst status = readStatus(root.asyncDir);\n\t\tif (options.shouldAbort?.()) return outputFromTimeout(root, status, options.timeoutMessage ?? \"Subagent timed out.\");\n\t\tconst result = readResultFile(root.resultPath);\n\t\tif (result) return buildImportedResult(root, status, result);\n\t\tif (isTerminalStatus(status, root.index)) {\n\t\t\tterminalSince ??= now();\n\t\t\tif (now() - terminalSince >= terminalResultGraceMs) {\n\t\t\t\treturn outputFromTerminalStatus(root, status!, selectedStatusStep(status, root.index));\n\t\t\t}\n\t\t} else {\n\t\t\tterminalSince = undefined;\n\t\t}\n\t\tif (!status && !fs.existsSync(root.asyncDir)) {\n\t\t\tthrow new Error(`Attached async root '${root.runId}' directory does not exist: ${root.asyncDir}`);\n\t\t}\n\t\tawait new Promise((resolve) => setTimeout(resolve, pollIntervalMs));\n\t}\n}\n\nexport function resolveAsyncRootResultPath(resultsDir: string, runId: string): string {\n\treturn path.join(resultsDir, `${runId}.json`);\n}\n"]}
1
+ {"version":3,"file":"chain-root-attachment.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAe,WAAW,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGtG,MAAM,WAAW,iBAAiB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,uBAAuB;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAC/B,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB;AA6ID,wBAAsB,wBAAwB,CAC7C,IAAI,EAAE,iBAAiB,EACvB,OAAO,GAAE;IAAE,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAO,GACjJ,OAAO,CAAC,uBAAuB,CAAC,CAuBlC;AAED,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEpF","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { AcceptanceLedger, AsyncStatus, CostSummary, ModelAttempt } from \"../../shared/types.ts\";\nimport { readStatus } from \"../../shared/utils.ts\";\n\nexport interface ImportedAsyncRoot {\n\trunId: string;\n\tasyncDir: string;\n\tresultPath: string;\n\tindex: number;\n}\n\nexport interface ImportedAsyncRootResult {\n\tagent: string;\n\toutput: string;\n\tsuccess: boolean;\n\texitCode: number;\n\terror?: string;\n\tsessionFile?: string;\n\tintercomTarget?: string;\n\tmodel?: string;\n\tattemptedModels?: string[];\n\tmodelAttempts?: ModelAttempt[];\n\ttotalCost?: CostSummary;\n\tstructuredOutput?: unknown;\n\tstructuredOutputPath?: string;\n\tstructuredOutputSchemaPath?: string;\n\tacceptance?: AcceptanceLedger;\n\ttimedOut?: boolean;\n\tstopped?: boolean;\n}\n\ninterface AsyncResultFile {\n\tstate?: string;\n\tsuccess?: boolean;\n\tsummary?: string;\n\terror?: string;\n\ttimedOut?: boolean;\n\tstopped?: boolean;\n\tresults?: Array<{\n\t\tagent?: string;\n\t\toutput?: string;\n\t\terror?: string;\n\t\tsuccess?: boolean;\n\t\ttimedOut?: boolean;\n\t\tstopped?: boolean;\n\t\tsessionFile?: string;\n\t\tintercomTarget?: string;\n\t\tmodel?: string;\n\t\tattemptedModels?: string[];\n\t\tmodelAttempts?: ModelAttempt[];\n\t\ttotalCost?: CostSummary;\n\t\tstructuredOutput?: unknown;\n\t\tstructuredOutputPath?: string;\n\t\tstructuredOutputSchemaPath?: string;\n\t\tacceptance?: AcceptanceLedger;\n\t}>;\n}\n\nconst TERMINAL_STATES = new Set([\"complete\", \"failed\", \"paused\", \"stopped\"]);\nconst TERMINAL_STEP_STATUSES = new Set([\"complete\", \"completed\", \"failed\", \"paused\", \"stopped\"]);\n\nfunction readResultFile(resultPath: string): AsyncResultFile | undefined {\n\ttry {\n\t\treturn JSON.parse(fs.readFileSync(resultPath, \"utf-8\")) as AsyncResultFile;\n\t} catch (error) {\n\t\tif (typeof error === \"object\" && error !== null && \"code\" in error && (error as NodeJS.ErrnoException).code === \"ENOENT\") {\n\t\t\treturn undefined;\n\t\t}\n\t\tthrow error;\n\t}\n}\n\nfunction selectedStatusStep(status: AsyncStatus | null, index: number): NonNullable<AsyncStatus[\"steps\"]>[number] | undefined {\n\treturn status?.steps?.[index];\n}\n\nfunction isTerminalStatus(status: AsyncStatus | null, index: number): boolean {\n\tif (!status) return false;\n\tconst step = selectedStatusStep(status, index);\n\tif (step && TERMINAL_STEP_STATUSES.has(step.status)) return true;\n\treturn TERMINAL_STATES.has(status.state);\n}\n\nfunction resultState(result: AsyncResultFile | undefined, child: NonNullable<AsyncResultFile[\"results\"]>[number] | undefined): \"complete\" | \"failed\" | \"paused\" | \"stopped\" | undefined {\n\tif (!result) return undefined;\n\tif (child?.stopped === true) return \"stopped\";\n\tif (child?.success === true) return \"complete\";\n\tif (child?.success === false) return result.state === \"stopped\" ? \"stopped\" : result.state === \"paused\" ? \"paused\" : \"failed\";\n\tif (result.state === \"complete\" || result.state === \"failed\" || result.state === \"paused\" || result.state === \"stopped\") return result.state;\n\tif (result.success === true) return \"complete\";\n\tif (result.success === false) return \"failed\";\n\treturn undefined;\n}\n\nfunction outputFromTerminalStatus(root: ImportedAsyncRoot, status: AsyncStatus, step: NonNullable<AsyncStatus[\"steps\"]>[number] | undefined): ImportedAsyncRootResult {\n\tconst agent = step?.agent ?? status.steps?.[root.index]?.agent ?? \"subagent\";\n\tconst timedOut = step?.timedOut === true || status.timedOut === true;\n\tconst stopped = step?.stopped === true || status.stopped === true || status.state === \"stopped\";\n\tconst message = step?.error ?? status.error ?? (stopped ? \"Subagent stopped by user.\" : `Attached async root ${root.runId} ended without a result file at ${root.resultPath}.`);\n\treturn {\n\t\tagent,\n\t\toutput: message,\n\t\tsuccess: false,\n\t\texitCode: 1,\n\t\terror: message,\n\t\t...(timedOut ? { timedOut: true } : {}),\n\t\t...(stopped ? { stopped: true } : {}),\n\t\t...(step?.sessionFile ?? status.sessionFile ? { sessionFile: step?.sessionFile ?? status.sessionFile } : {}),\n\t\t...(step?.model ? { model: step.model } : {}),\n\t\t...(step?.modelSelection ? { modelSelection: step.modelSelection } : {}),\n\t\t...(step?.attemptedModels ? { attemptedModels: step.attemptedModels } : {}),\n\t\t...(step?.modelAttempts ? { modelAttempts: step.modelAttempts } : {}),\n\t\t...(step?.totalCost ? { totalCost: step.totalCost } : {}),\n\t\t...(step?.structuredOutput !== undefined ? { structuredOutput: step.structuredOutput } : {}),\n\t\t...(step?.structuredOutputPath ? { structuredOutputPath: step.structuredOutputPath } : {}),\n\t\t...(step?.structuredOutputSchemaPath ? { structuredOutputSchemaPath: step.structuredOutputSchemaPath } : {}),\n\t\t...(step?.acceptance ? { acceptance: step.acceptance } : {}),\n\t};\n}\n\nfunction outputFromTimeout(root: ImportedAsyncRoot, status: AsyncStatus | null, message: string): ImportedAsyncRootResult {\n\tconst step = selectedStatusStep(status, root.index);\n\treturn {\n\t\tagent: step?.agent ?? status?.steps?.[root.index]?.agent ?? \"subagent\",\n\t\toutput: message,\n\t\tsuccess: false,\n\t\texitCode: 1,\n\t\terror: message,\n\t\ttimedOut: true,\n\t\t...(step?.sessionFile ?? status?.sessionFile ? { sessionFile: step?.sessionFile ?? status?.sessionFile } : {}),\n\t\t...(step?.model ? { model: step.model } : {}),\n\t\t...(step?.modelSelection ? { modelSelection: step.modelSelection } : {}),\n\t\t...(step?.attemptedModels ? { attemptedModels: step.attemptedModels } : {}),\n\t\t...(step?.modelAttempts ? { modelAttempts: step.modelAttempts } : {}),\n\t\t...(step?.totalCost ? { totalCost: step.totalCost } : {}),\n\t};\n}\n\nfunction buildImportedResult(root: ImportedAsyncRoot, status: AsyncStatus | null, result: AsyncResultFile): ImportedAsyncRootResult {\n\tconst child = result.results?.[root.index];\n\tconst step = selectedStatusStep(status, root.index);\n\tconst state = resultState(result, child);\n\tconst agent = child?.agent ?? step?.agent ?? status?.steps?.[root.index]?.agent ?? \"subagent\";\n\tconst output = child?.output ?? result.summary ?? \"\";\n\tconst timedOut = child?.timedOut === true || step?.timedOut === true || result.timedOut === true || status?.timedOut === true;\n\tconst stopped = child?.stopped === true || step?.stopped === true || result.stopped === true || status?.stopped === true || state === \"stopped\";\n\tconst success = state === \"complete\" && !timedOut && !stopped;\n\tconst error = child?.error ?? (success ? undefined : stopped ? \"Subagent stopped by user.\" : result.error ?? result.summary ?? status?.error ?? `Attached async root ${root.runId} did not complete successfully.`);\n\treturn {\n\t\tagent,\n\t\toutput: success ? output : (output || error || \"\"),\n\t\tsuccess,\n\t\texitCode: success ? 0 : 1,\n\t\t...(error ? { error } : {}),\n\t\t...(timedOut ? { timedOut: true } : {}),\n\t\t...(stopped ? { stopped: true } : {}),\n\t\t...(child?.sessionFile ?? step?.sessionFile ?? status?.sessionFile ? { sessionFile: child?.sessionFile ?? step?.sessionFile ?? status?.sessionFile } : {}),\n\t\t...(child?.intercomTarget ? { intercomTarget: child.intercomTarget } : {}),\n\t\t...(child?.model ?? step?.model ? { model: child?.model ?? step?.model } : {}),\n\t\t...(child?.modelSelection ?? step?.modelSelection ? { modelSelection: child?.modelSelection ?? step?.modelSelection } : {}),\n\t\t...(child?.attemptedModels ?? step?.attemptedModels ? { attemptedModels: child?.attemptedModels ?? step?.attemptedModels } : {}),\n\t\t...(child?.modelAttempts ?? step?.modelAttempts ? { modelAttempts: child?.modelAttempts ?? step?.modelAttempts } : {}),\n\t\t...(child?.totalCost ?? step?.totalCost ? { totalCost: child?.totalCost ?? step?.totalCost } : {}),\n\t\t...(child?.structuredOutput !== undefined ? { structuredOutput: child.structuredOutput } : step?.structuredOutput !== undefined ? { structuredOutput: step.structuredOutput } : {}),\n\t\t...(child?.structuredOutputPath ?? step?.structuredOutputPath ? { structuredOutputPath: child?.structuredOutputPath ?? step?.structuredOutputPath } : {}),\n\t\t...(child?.structuredOutputSchemaPath ?? step?.structuredOutputSchemaPath ? { structuredOutputSchemaPath: child?.structuredOutputSchemaPath ?? step?.structuredOutputSchemaPath } : {}),\n\t\t...(child?.acceptance ?? step?.acceptance ? { acceptance: child?.acceptance ?? step?.acceptance } : {}),\n\t};\n}\n\nexport async function waitForImportedAsyncRoot(\n\troot: ImportedAsyncRoot,\n\toptions: { pollIntervalMs?: number; terminalResultGraceMs?: number; now?: () => number; shouldAbort?: () => boolean; timeoutMessage?: string } = {},\n): Promise<ImportedAsyncRootResult> {\n\tconst pollIntervalMs = options.pollIntervalMs ?? 500;\n\tconst terminalResultGraceMs = options.terminalResultGraceMs ?? 1_000;\n\tconst now = options.now ?? Date.now;\n\tlet terminalSince: number | undefined;\n\tfor (;;) {\n\t\tconst status = readStatus(root.asyncDir);\n\t\tif (options.shouldAbort?.()) return outputFromTimeout(root, status, options.timeoutMessage ?? \"Subagent timed out.\");\n\t\tconst result = readResultFile(root.resultPath);\n\t\tif (result) return buildImportedResult(root, status, result);\n\t\tif (isTerminalStatus(status, root.index)) {\n\t\t\tterminalSince ??= now();\n\t\t\tif (now() - terminalSince >= terminalResultGraceMs) {\n\t\t\t\treturn outputFromTerminalStatus(root, status!, selectedStatusStep(status, root.index));\n\t\t\t}\n\t\t} else {\n\t\t\tterminalSince = undefined;\n\t\t}\n\t\tif (!status && !fs.existsSync(root.asyncDir)) {\n\t\t\tthrow new Error(`Attached async root '${root.runId}' directory does not exist: ${root.asyncDir}`);\n\t\t}\n\t\tawait new Promise((resolve) => setTimeout(resolve, pollIntervalMs));\n\t}\n}\n\nexport function resolveAsyncRootResultPath(resultsDir: string, runId: string): string {\n\treturn path.join(resultsDir, `${runId}.json`);\n}\n"]}