@ashx-j/lunr 0.2.13 → 0.2.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -1
- package/README.md +6 -3
- package/dist/builtin-extensions/ashxj-tui.d.ts +16 -1
- package/dist/builtin-extensions/ashxj-tui.d.ts.map +1 -1
- package/dist/builtin-extensions/ashxj-tui.js +44 -20
- package/dist/builtin-extensions/ashxj-tui.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts +2 -0
- package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.js +27 -22
- package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js +5 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.js +12 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-status.d.ts +1 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-status.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-status.js +3 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-status.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-append.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-append.js +1 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-append.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.js +3 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/background/chain-root-attachment.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/fleet-view.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/fleet-view.js +3 -3
- package/dist/builtin-extensions/pi-subagents/src/runs/background/fleet-view.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.js +2 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js +3 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js +7 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js +2 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts +1 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +19 -3
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts +10 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js +19 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts +1 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.d.ts +2 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.js +17 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/formatters.d.ts +3 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/formatters.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/formatters.js +14 -3
- package/dist/builtin-extensions/pi-subagents/src/shared/formatters.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts +14 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/types.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/fleet.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/fleet.js +2 -2
- package/dist/builtin-extensions/pi-subagents/src/tui/fleet.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.js +12 -10
- package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
- package/dist/catalog/models.json +1 -1
- package/dist/catalog/providers/amazon-bedrock.json +1 -1
- package/dist/catalog/providers/anthropic.json +1 -1
- package/dist/catalog/providers/azure-openai-responses.json +1 -1
- package/dist/catalog/providers/cloudflare-ai-gateway.json +1 -1
- package/dist/catalog/providers/fireworks.json +1 -1
- package/dist/catalog/providers/github-copilot.json +1 -1
- package/dist/catalog/providers/google-vertex.json +1 -1
- package/dist/catalog/providers/google.json +1 -1
- package/dist/catalog/providers/groq.json +1 -1
- package/dist/catalog/providers/huggingface.json +1 -1
- package/dist/catalog/providers/nvidia.json +1 -1
- package/dist/catalog/providers/openai-codex.json +1 -1
- package/dist/catalog/providers/openai.json +1 -1
- package/dist/catalog/providers/opencode-go.json +1 -1
- package/dist/catalog/providers/opencode.json +1 -1
- package/dist/catalog/providers/openrouter.json +1 -1
- package/dist/catalog/providers/vercel-ai-gateway.json +1 -1
- package/dist/catalog/publication.json +131 -3
- package/dist/cli/list-models.d.ts.map +1 -1
- package/dist/cli/list-models.js +1 -0
- package/dist/cli/list-models.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +52 -27
- package/dist/cli.js.map +1 -1
- package/dist/core/catalog-cache-scope.d.ts +3 -0
- package/dist/core/catalog-cache-scope.d.ts.map +1 -0
- package/dist/core/catalog-cache-scope.js +12 -0
- package/dist/core/catalog-cache-scope.js.map +1 -0
- package/dist/core/catalog-merge.d.ts +2 -0
- package/dist/core/catalog-merge.d.ts.map +1 -1
- package/dist/core/catalog-merge.js +29 -2
- package/dist/core/catalog-merge.js.map +1 -1
- package/dist/core/catalog-refresh-polling.d.ts +8 -0
- package/dist/core/catalog-refresh-polling.d.ts.map +1 -0
- package/dist/core/catalog-refresh-polling.js +30 -0
- package/dist/core/catalog-refresh-polling.js.map +1 -0
- package/dist/core/codex-catalog.d.ts +3 -0
- package/dist/core/codex-catalog.d.ts.map +1 -0
- package/dist/core/codex-catalog.js +15 -0
- package/dist/core/codex-catalog.js.map +1 -0
- package/dist/core/customize.d.ts +2 -4
- package/dist/core/customize.d.ts.map +1 -1
- package/dist/core/customize.js +2 -8
- package/dist/core/customize.js.map +1 -1
- package/dist/core/footer-data-provider.d.ts +3 -4
- package/dist/core/footer-data-provider.d.ts.map +1 -1
- package/dist/core/footer-data-provider.js +54 -82
- package/dist/core/footer-data-provider.js.map +1 -1
- package/dist/core/live-catalog.d.ts +5 -2
- package/dist/core/live-catalog.d.ts.map +1 -1
- package/dist/core/live-catalog.js +108 -27
- package/dist/core/live-catalog.js.map +1 -1
- package/dist/core/model-runtime.d.ts +8 -0
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +64 -12
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/official-catalog.d.ts +4 -0
- package/dist/core/official-catalog.d.ts.map +1 -1
- package/dist/core/official-catalog.js +86 -21
- package/dist/core/official-catalog.js.map +1 -1
- package/dist/core/settings-manager.d.ts +0 -6
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +0 -17
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +1 -0
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/main.d.ts +2 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +106 -50
- package/dist/main.js.map +1 -1
- package/dist/migrations.d.ts +2 -0
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +14 -4
- package/dist/migrations.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts +1 -3
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +4 -32
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-editor.js +2 -1
- package/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +4 -1
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/plan-message.d.ts +1 -3
- package/dist/modes/interactive/components/plan-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/plan-message.js +1 -16
- package/dist/modes/interactive/components/plan-message.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +0 -4
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +10 -30
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message.d.ts +1 -3
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message.js +2 -19
- package/dist/modes/interactive/components/user-message.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +12 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +137 -127
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/moon.json +0 -1
- package/dist/modes/interactive/theme/theme-schema.json +3 -3
- package/dist/modes/interactive/theme/theme.d.ts +1 -1
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +95 -90
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/startup/interactive-view.d.ts +55 -0
- package/dist/startup/interactive-view.d.ts.map +1 -0
- package/dist/startup/interactive-view.js +332 -0
- package/dist/startup/interactive-view.js.map +1 -0
- package/dist/startup/launch-routing.d.ts +8 -0
- package/dist/startup/launch-routing.d.ts.map +1 -0
- package/dist/startup/launch-routing.js +29 -0
- package/dist/startup/launch-routing.js.map +1 -0
- package/dist/startup/startup-milestones.d.ts +4 -0
- package/dist/startup/startup-milestones.d.ts.map +1 -0
- package/dist/startup/startup-milestones.js +14 -0
- package/dist/startup/startup-milestones.js.map +1 -0
- package/dist/utils/syntax-highlight.d.ts.map +1 -1
- package/dist/utils/syntax-highlight.js +10 -4
- package/dist/utils/syntax-highlight.js.map +1 -1
- package/docs/features.md +2 -2
- package/docs/interactive-startup.md +58 -0
- package/docs/keybindings.md +1 -1
- package/docs/model-catalog.md +29 -0
- package/docs/quickstart.md +1 -1
- package/docs/settings.md +1 -3
- package/docs/terminal-setup.md +2 -2
- package/docs/usage.md +2 -1
- package/docs/windows.md +1 -1
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/package.json +16 -16
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/extension/index.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * Subagent Tool\n *\n * Full-featured subagent with sync and async modes.\n * - Sync (default): Streams output, renders markdown, tracks usage\n * - Async: Background execution, emits events when done\n *\n * Modes: single (agent + task), parallel (tasks[]), chain (chain[] with {previous})\n * Toggle: async parameter (default: false, configurable via config.json)\n *\n * Config file: ~/.lunr/agent/extensions/subagent/config.json\n * { \"asyncByDefault\": true, \"forceTopLevelAsync\": true, \"maxSubagentDepth\": 1, \"intercomBridge\": { \"mode\": \"always\", \"instructionFile\": \"./intercom-bridge.md\" }, \"worktreeSetupHook\": \"./scripts/setup-worktree.mjs\" }\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { AgentToolResult } from \"@ashx-j/lunr-agent\";\nimport { keyText, type ExtensionAPI, type ExtensionContext, type ToolDefinition } from \"@ashx-j/lunr\";\nimport { Box, Container, Spacer, Text, truncateToWidth, visibleWidth, wrapTextWithAnsi, type Component } from \"@ashx-j/lunr-tui\";\n\nimport { cleanupAllArtifactDirs, cleanupOldArtifacts, getArtifactsDir } from \"../shared/artifacts.ts\";\nimport { resolveCurrentSessionId } from \"../shared/session-identity.ts\";\nimport { cleanupOldChainDirs } from \"../shared/settings.ts\";\nimport { clearLegacyResultAnimationTimer, renderSubagentResult, subagentAnimSink } from \"../tui/render.ts\";\nimport { SubagentParams } from \"./schemas.ts\";\nimport { validateChainInput } from \"./chain-validation.ts\";\nimport { createSubagentExecutor, type SubagentParamsLike } from \"../runs/foreground/subagent-executor.ts\";\nimport { createAsyncJobTracker } from \"../runs/background/async-job-tracker.ts\";\nimport { createResultWatcher } from \"../runs/background/result-watcher.ts\";\nimport { createScheduledRunManager } from \"../runs/background/scheduled-runs.ts\";\nimport { registerSlashCommands } from \"../slash/slash-commands.ts\";\nimport { registerPromptTemplateDelegationBridge } from \"../slash/prompt-template-bridge.ts\";\nimport { registerMainWatchdog } from \"../watchdog/register-main.ts\";\nimport { registerSlashSubagentBridge } from \"../slash/slash-bridge.ts\";\nimport { createNativeSupervisorChannel } from \"../intercom/native-supervisor-channel.ts\";\nimport { registerSubagentRpcBridge } from \"./rpc.ts\";\nimport { clearSlashSnapshots, getSlashRenderableSnapshot, resolveSlashMessageDetails, restoreSlashFinalSnapshots, type SlashMessageDetails } from \"../slash/slash-live-state.ts\";\nimport { inspectSubagentStatus } from \"../runs/background/run-status.ts\";\nimport { resolveWaitToolConfig } from \"../runs/background/subagent-wait.ts\";\nimport { registerWaitTool } from \"../runs/background/wait-tool.ts\";\nimport { drainOutstandingWork } from \"../runs/background/auto-drain.ts\";\nimport registerSubagentNotify, { parseSubagentNotifyContent, type SubagentNotifyDetails } from \"../runs/background/notify.ts\";\nimport { formatSteeringNotice, handleSubagentSteeringNotice, SUBAGENT_STEERING_MESSAGE_TYPE, type SubagentSteeringMessageDetails } from \"./steering-notices.ts\";\nimport { SUBAGENT_CHILD_ENV, SUBAGENT_PARENT_SESSION_ENV } from \"../runs/shared/pi-args.ts\";\nimport { formatDuration, shortenPath } from \"../shared/formatters.ts\";\nimport { loadConfig } from \"./config.ts\";\nimport { buildSubagentToolDescription } from \"./tool-description.ts\";\nimport {\n\ttype Details,\n\ttype SubagentState,\n\tASYNC_DIR,\n\tDEFAULT_ARTIFACT_CONFIG,\n\tRESULTS_DIR,\n\tSLASH_RESULT_TYPE,\n\tSLASH_TEXT_RESULT_TYPE,\n\tSUBAGENT_ASYNC_COMPLETE_EVENT,\n\tSUBAGENT_ASYNC_STARTED_EVENT,\n\tSUBAGENT_CONTROL_EVENT,\n\tSUBAGENT_STEERING_NOTICE_EVENT,\n\tWIDGET_KEY,\n} from \"../shared/types.ts\";\nimport {\n\tclearPendingForegroundControlNotices,\n\tformatSubagentControlNotice,\n\thandleSubagentControlNotice,\n\tSUBAGENT_CONTROL_MESSAGE_TYPE,\n\ttype SubagentControlMessageDetails,\n} from \"./control-notices.ts\";\n\nexport { loadConfig } from \"./config.ts\";\n\n/**\n * Derive subagent session base directory from parent session file.\n * If parent session is ~/.lunr/agent/sessions/abc123.jsonl,\n * returns ~/.lunr/agent/sessions/abc123/ as the base.\n * Callers add runId to create the actual session root: abc123/{runId}/\n * Falls back to a unique temp directory if no parent session.\n */\nfunction getSubagentSessionRoot(parentSessionFile: string | null): string {\n\tif (parentSessionFile) {\n\t\tconst baseName = path.basename(parentSessionFile, \".jsonl\");\n\t\tconst sessionsDir = path.dirname(parentSessionFile);\n\t\treturn path.join(sessionsDir, baseName);\n\t}\n\treturn fs.mkdtempSync(path.join(os.tmpdir(), \"pi-subagent-session-\"));\n}\n\nfunction expandTilde(p: string): string {\n\treturn p.startsWith(\"~/\") ? path.join(os.homedir(), p.slice(2)) : p;\n}\n\n/**\n * Create a directory and verify it is actually accessible.\n * On Windows with Azure AD/Entra ID, directories created shortly after\n * wake-from-sleep can end up with broken NTFS ACLs (null DACL) when the\n * cloud SID cannot be resolved without network connectivity. This leaves\n * the directory completely inaccessible to the creating user.\n */\nfunction ensureAccessibleDir(dirPath: string): void {\n\tfs.mkdirSync(dirPath, { recursive: true });\n\ttry {\n\t\tfs.accessSync(dirPath, fs.constants.R_OK | fs.constants.W_OK);\n\t} catch {\n\t\ttry {\n\t\t\tfs.rmSync(dirPath, { recursive: true, force: true });\n\t\t} catch {\n\t\t\t// Best effort: retry mkdir/access even if cleanup fails.\n\t\t}\n\t\tfs.mkdirSync(dirPath, { recursive: true });\n\t\tfs.accessSync(dirPath, fs.constants.R_OK | fs.constants.W_OK);\n\t}\n}\n\nfunction isSlashResultRunning(result: { details?: Details }): boolean {\n\treturn result.details?.progress?.some((entry) => entry.status === \"running\")\n\t\t|| result.details?.results.some((entry) => entry.progress?.status === \"running\")\n\t\t|| false;\n}\n\n// Drives the inline running-indicator braille animation for foreground subagent\n// results. Foreground runs receive progress only on child events, so the glyph\n// (derived from progress fields) would freeze between events. While a result is\n// running we tick a frame counter every 80ms; renderResult registers the\n// running-glyph lines in state.animEntries (via subagentAnimSink) and the timer\n// rewrites just those Text nodes + requests a repaint, instead of invalidate()-ing\n// the whole tool component (a full renderSubagentResult rebuild 12.5x/s made the\n// spinner laggy).\nfunction subagentResultIsRunning(result: { details?: Details }): boolean {\n\treturn result.details?.progress?.some((entry) => entry.status === \"running\")\n\t\t|| result.details?.results.some((entry) => entry.progress?.status === \"running\")\n\t\t|| false;\n}\n\nfunction ensureSubagentResultAnimation(context: { state: Record<string, unknown>; invalidate?: () => void; requestRender?: () => void }): void {\n\tconst state = context.state as {\n\t\tsubagentResultAnimationTimer?: ReturnType<typeof setInterval>;\n\t\tframe?: number;\n\t\tanimEntries?: Array<{ text: Text; line: (frame: number) => string }>;\n\t};\n\tif (state.subagentResultAnimationTimer) return;\n\tif (typeof context.invalidate !== \"function\") return;\n\tif (state.frame === undefined) state.frame = 0;\n\tstate.subagentResultAnimationTimer = setInterval(() => {\n\t\tstate.frame = ((state.frame ?? 0) + 1) % 10;\n\t\ttry {\n\t\t\tconst entries = state.animEntries;\n\t\t\tif (entries?.length && typeof context.requestRender === \"function\") {\n\t\t\t\tfor (const entry of entries) entry.text.setText(entry.line(state.frame ?? 0));\n\t\t\t\tcontext.requestRender();\n\t\t\t} else {\n\t\t\t\tcontext.invalidate();\n\t\t\t}\n\t\t} catch {}\n\t}, 80);\n}\n\nfunction isSlashResultError(result: { details?: Details }): boolean {\n\treturn result.details?.results.some((entry) => entry.exitCode !== 0 && entry.progress?.status !== \"running\") || false;\n}\n\nfunction isStaleExtensionContextError(error: unknown): boolean {\n\treturn error instanceof Error && error.message.includes(\"Extension context no longer active\");\n}\n\nfunction rebuildSlashResultContainer(\n\tcontainer: Container,\n\tresult: AgentToolResult<Details>,\n\toptions: { expanded: boolean },\n\ttheme: ExtensionContext[\"ui\"][\"theme\"],\n): void {\n\tcontainer.clear();\n\tcontainer.addChild(new Spacer(1));\n\tconst boxTheme = isSlashResultRunning(result) ? \"toolPendingBg\" : isSlashResultError(result) ? \"toolErrorBg\" : \"toolSuccessBg\";\n\tconst box = new Box(1, 1, (text: string) => theme.bg(boxTheme, text));\n\tbox.addChild(renderSubagentResult(result, options, theme));\n\tcontainer.addChild(box);\n}\n\nfunction createSlashResultComponent(\n\tdetails: SlashMessageDetails,\n\toptions: { expanded: boolean },\n\ttheme: ExtensionContext[\"ui\"][\"theme\"],\n): Container {\n\tconst container = new Container();\n\tlet lastVersion = -1;\n\tcontainer.render = (width: number): string[] => {\n\t\tconst snapshot = getSlashRenderableSnapshot(details);\n\t\tif (snapshot.version !== lastVersion || isSlashResultRunning(snapshot.result)) {\n\t\t\tlastVersion = snapshot.version;\n\t\t\trebuildSlashResultContainer(container, snapshot.result, options, theme);\n\t\t}\n\t\treturn Container.prototype.render.call(container, width);\n\t};\n\treturn container;\n}\n\nclass SubagentControlNoticeComponent implements Component {\n\tconstructor(\n\t\tprivate readonly details: SubagentControlMessageDetails,\n\t\tprivate readonly theme: ExtensionContext[\"ui\"][\"theme\"],\n\t) {}\n\n\tinvalidate(): void {}\n\n\trender(width: number): string[] {\n\t\tconst eventLabel = this.details.event.type.replaceAll(\"_\", \" \");\n\t\tif (width < 3) return [truncateToWidth(`Subagent ${eventLabel}`, width)];\n\t\tconst bodyWidth = Math.max(1, width - 2);\n\t\tconst borderChar = \"─\";\n\t\tconst header = ` ⚠ Subagent ${eventLabel}: ${this.details.event.agent} `;\n\t\tconst headerText = truncateToWidth(header, bodyWidth, \"\");\n\t\tconst headerPadding = Math.max(0, bodyWidth - visibleWidth(headerText));\n\t\tconst lines = [this.theme.fg(\"accent\", `╭${headerText}${borderChar.repeat(headerPadding)}╮`)];\n\n\t\tfor (const line of wrapTextWithAnsi(formatSubagentControlNotice(this.details), bodyWidth)) {\n\t\t\tconst text = truncateToWidth(line, bodyWidth, \"\");\n\t\t\tconst padding = Math.max(0, bodyWidth - visibleWidth(text));\n\t\t\tlines.push(this.theme.fg(\"accent\", `│${text}${\" \".repeat(padding)}│`));\n\t\t}\n\t\tlines.push(this.theme.fg(\"accent\", `╰${borderChar.repeat(bodyWidth)}╯`));\n\t\treturn lines;\n\t}\n}\n\nexport default function registerSubagentExtension(pi: ExtensionAPI): void {\n\tif (process.env[SUBAGENT_CHILD_ENV] === \"1\") {\n\t\treturn;\n\t}\n\tconst globalStore = globalThis as Record<string, unknown>;\n\tconst runtimeCleanupStoreKey = \"__piSubagentRuntimeCleanup\";\n\tconst previousRuntimeCleanup = globalStore[runtimeCleanupStoreKey];\n\tif (typeof previousRuntimeCleanup === \"function\") {\n\t\ttry {\n\t\t\tpreviousRuntimeCleanup();\n\t\t} catch {\n\t\t\t// Best effort cleanup for stale timers from an older reload.\n\t\t}\n\t}\n\n\tensureAccessibleDir(RESULTS_DIR);\n\tensureAccessibleDir(ASYNC_DIR);\n\tcleanupOldChainDirs();\n\n\tconst config = loadConfig();\n\tconst waitToolConfig = resolveWaitToolConfig(config.waitTool);\n\tconst asyncByDefault = config.asyncByDefault === true;\n\tconst tempArtifactsDir = getArtifactsDir(null);\n\tcleanupAllArtifactDirs(DEFAULT_ARTIFACT_CONFIG.cleanupDays);\n\n\tconst state: SubagentState = {\n\t\tbaseCwd: \"\",\n\t\tcurrentSessionId: null,\n\t\tforegroundSubagentInFlight: 0,\n\t\tsubagentSpawns: { sessionId: null, count: 0 },\n\t\tasyncJobs: new Map(),\n\t\tfleetJobs: new Map(),\n\t\tforegroundRuns: new Map(),\n\t\tforegroundControls: new Map(),\n\t\tlastForegroundControlId: null,\n\t\tpendingForegroundControlNotices: new Map(),\n\t\tcleanupTimers: new Map(),\n\t\tlastUiContext: null,\n\t\tpoller: null,\n\t\tcompletionSeen: new Map(),\n\t\twatcher: null,\n\t\twatcherRestartTimer: null,\n\t\tresultFileCoalescer: {\n\t\t\tschedule: () => false,\n\t\t\tclear: () => {},\n\t\t},\n\t};\n\n\tconst supervisorChannel = createNativeSupervisorChannel(pi, state);\n\tconst mainWatchdog = registerMainWatchdog(pi);\n\tconst { startResultWatcher, primeExistingResults, stopResultWatcher } = createResultWatcher(\n\t\tpi,\n\t\tstate,\n\t\tRESULTS_DIR,\n\t\t10 * 60 * 1000,\n\t);\n\tstartResultWatcher();\n\tprimeExistingResults();\n\n\tconst runtimeCleanup = () => {\n\t\tmainWatchdog.dispose();\n\t\tstopResultWatcher();\n\t\tscheduledRunManager.stop();\n\t\tsupervisorChannel.dispose();\n\t\tclearPendingForegroundControlNotices(state);\n\t\tif (state.poller) {\n\t\t\tclearInterval(state.poller);\n\t\t\tstate.poller = null;\n\t\t}\n\t};\n\tglobalStore[runtimeCleanupStoreKey] = runtimeCleanup;\n\n\tconst { ensurePoller, refreshWidget, handleStarted, handleComplete, resetJobs, restoreActiveJobs } = createAsyncJobTracker(pi, state, ASYNC_DIR, {\n\t\twidgetEnabled: config.asyncWidget !== false,\n\t});\n\tlet executorExecute: ((id: string, params: SubagentParamsLike, signal: AbortSignal, onUpdate: ((r: AgentToolResult<Details>) => void) | undefined, ctx: ExtensionContext) => Promise<AgentToolResult<Details>>) | undefined;\n\tconst scheduledRunManager = createScheduledRunManager({\n\t\tconfig,\n\t\tlaunch: (params, ctx, signal) => {\n\t\t\tif (!executorExecute) {\n\t\t\t\treturn Promise.resolve({\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Scheduled subagent launch is unavailable (executor not ready).\" }],\n\t\t\t\t\tisError: true,\n\t\t\t\t\tdetails: { mode: \"management\" as const, results: [] },\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn executorExecute(randomUUID(), params, signal, undefined, ctx);\n\t\t},\n\t});\n\tconst executor = createSubagentExecutor({\n\t\tpi,\n\t\tstate,\n\t\tconfig,\n\t\tasyncByDefault,\n\t\twaitToolEnabled: waitToolConfig.enabled,\n\t\thandleScheduledRunAction: (params, ctx) => scheduledRunManager.handleToolCall(params, ctx),\n\t\twatchdog: mainWatchdog,\n\t\ttempArtifactsDir,\n\t\tgetSubagentSessionRoot,\n\t\texpandTilde,\n\t});\n\texecutorExecute = executor.execute;\n\n\tpi.registerMessageRenderer<SlashMessageDetails>(SLASH_RESULT_TYPE, (message, options, theme) => {\n\t\tconst details = resolveSlashMessageDetails(message.details);\n\t\tif (!details) return undefined;\n\t\treturn createSlashResultComponent(details, options, theme);\n\t});\n\n\tpi.registerMessageRenderer<undefined>(SLASH_TEXT_RESULT_TYPE, (message, _options, _theme) => {\n\t\tconst content = typeof message.content === \"string\"\n\t\t\t? message.content\n\t\t\t: message.content\n\t\t\t\t.filter((entry) => entry.type === \"text\")\n\t\t\t\t.map((entry) => entry.text)\n\t\t\t\t.join(\"\\n\");\n\t\treturn new Text(content, 0, 0);\n\t});\n\n\tpi.registerMessageRenderer<SubagentNotifyDetails>(\"subagent-notify\", (message, options, theme) => {\n\t\tconst content = typeof message.content === \"string\" ? message.content : \"\";\n\t\tconst details = (message.details as SubagentNotifyDetails | undefined) ?? parseSubagentNotifyContent(content);\n\t\tif (!details) return new Text(content, 0, 0);\n\t\tconst icon = details.status === \"completed\"\n\t\t\t? theme.fg(\"success\", \"✓\")\n\t\t\t: details.status === \"paused\"\n\t\t\t\t? theme.fg(\"warning\", \"■\")\n\t\t\t\t: theme.fg(\"error\", \"✗\");\n\t\tconst parts: string[] = [];\n\t\tif (details.taskInfo) parts.push(details.taskInfo);\n\t\tif (details.durationMs !== undefined) parts.push(formatDuration(details.durationMs));\n\t\tconst notifyLabel = details.taskInfo || details.agent || \"child\";\n\t\tlet text = `${icon} ${theme.bold(notifyLabel)} ${theme.fg(\"dim\", details.status)}`;\n\t\tif (parts.length > 0) text += ` ${theme.fg(\"dim\", \"·\")} ${parts.map((part) => theme.fg(\"dim\", part)).join(` ${theme.fg(\"dim\", \"·\")} `)}`;\n\t\tconst trimmedPreview = details.resultPreview.trim();\n\t\tconst previewLines = options.expanded\n\t\t\t? trimmedPreview.split(\"\\n\").filter((line) => line.trim())\n\t\t\t: [trimmedPreview.split(\"\\n\", 1)[0] ?? \"\"].filter((line) => line.trim());\n\t\tfor (const line of previewLines.length > 0 ? previewLines : [\"(no output)\"]) {\n\t\t\ttext += `\\n ${theme.fg(\"dim\", `⎿ ${line}`)}`;\n\t\t}\n\t\tif (!options.expanded && trimmedPreview.includes(\"\\n\")) {\n\t\t\tconst expandKey = keyText(\"app.tools.expand\");\n\t\t\ttext += `\\n ${theme.fg(\"dim\", `${expandKey} full notification`)}`;\n\t\t}\n\t\tif (details.sessionLabel && details.sessionValue) {\n\t\t\ttext += `\\n ${theme.fg(\"muted\", `${details.sessionLabel}: ${shortenPath(details.sessionValue)}`)}`;\n\t\t}\n\t\treturn new Text(text, 0, 0);\n\t});\n\n\tpi.registerMessageRenderer<SubagentSteeringMessageDetails>(SUBAGENT_STEERING_MESSAGE_TYPE, (message, _options, theme) => {\n\t\tconst details = message.details as SubagentSteeringMessageDetails | undefined;\n\t\tif (!details) return undefined;\n\t\treturn new Text(theme.fg(details.state === \"recovered\" ? \"warning\" : \"error\", formatSteeringNotice(details)), 0, 0);\n\t});\n\n\tpi.registerMessageRenderer<SubagentControlMessageDetails>(SUBAGENT_CONTROL_MESSAGE_TYPE, () => undefined);\n\n\tconst executeSubagentCollapsed = (id: string, params: SubagentParamsLike, signal: AbortSignal, onUpdate: ((result: AgentToolResult<Details>) => void) | undefined, ctx: ExtensionContext) => {\n\t\tif (ctx.hasUI) ctx.ui.setToolsExpanded(false);\n\t\treturn executor.execute(id, params, signal, onUpdate, ctx);\n\t};\n\n\tconst slashBridge = registerSlashSubagentBridge({\n\t\tevents: pi.events,\n\t\tgetContext: () => state.lastUiContext,\n\t\texecute: (id, params, signal, onUpdate, ctx) =>\n\t\t\texecuteSubagentCollapsed(id, params, signal, onUpdate, ctx),\n\t});\n\n\tconst promptTemplateBridge = registerPromptTemplateDelegationBridge({\n\t\tevents: pi.events,\n\t\tgetContext: () => state.lastUiContext,\n\t\texecute: (requestId, params, signal, ctx, onUpdate) =>\n\t\t\texecuteSubagentCollapsed(requestId, params, signal, onUpdate, ctx),\n\t});\n\n\tconst rpcBridge = registerSubagentRpcBridge({\n\t\tevents: pi.events,\n\t\tgetContext: () => state.lastUiContext,\n\t\texecute: (id, params, signal, onUpdate, ctx) => executor.execute(id, params, signal, onUpdate, ctx),\n\t});\n\n\tfunction effectiveParallelTaskCount(tasks: Array<{ count?: unknown }> | undefined): number {\n\t\tif (!tasks || tasks.length === 0) return 0;\n\t\treturn tasks.reduce((total, task) => {\n\t\t\tconst count = typeof task.count === \"number\" && Number.isInteger(task.count) && task.count >= 1 ? task.count : 1;\n\t\t\treturn total + count;\n\t\t}, 0);\n\t}\n\n\tconst tool: ToolDefinition<typeof SubagentParams, Details> = {\n\t\tname: \"subagent\",\n\t\tlabel: \"Subagent\",\n\t\tdescription: buildSubagentToolDescription(config),\n\t\tparameters: SubagentParams,\n\t\t// lunr: same-turn SINGLE calls overlap; sequential work uses chain.\n\t\texecutionMode: \"parallel\",\n\n\t\tprepareArguments(args) {\n\t\t\t// Run friendly chain validation before pi-ai's raw TypeBox schema check\n\t\t\t// so the model sees which property is disallowed, what is allowed, and a\n\t\t\t// valid example instead of `chain.N: must not have additional properties`.\n\t\t\tvalidateChainInput(args);\n\t\t\treturn args as never;\n\t\t},\n\n\t\texecute(id, params, signal, onUpdate, ctx) {\n\t\t\treturn executeSubagentCollapsed(id, params, signal, onUpdate, ctx);\n\t\t},\n\n\t\trenderCall(args, theme) {\n\t\t\tif (args.action) {\n\t\t\t\tconst target = args.id || args.runId || \"\";\n\t\t\t\treturn new Text(\n\t\t\t\t\t`${theme.fg(\"toolTitle\", theme.bold(\"subagent \"))}${args.action}${target ? ` ${theme.fg(\"accent\", target)}` : \"\"}`,\n\t\t\t\t\t0, 0,\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst isParallel = (args.tasks?.length ?? 0) > 0;\n\t\t\tconst parallelCount = effectiveParallelTaskCount(args.tasks as Array<{ count?: unknown }> | undefined);\n\t\t\tconst asyncLabel = args.async === true && args.clarify !== true ? theme.fg(\"warning\", \" [async]\") : \"\";\n\t\t\tif (args.chain?.length)\n\t\t\t\treturn new Text(\n\t\t\t\t\t`${theme.fg(\"toolTitle\", theme.bold(\"subagent \"))}chain (${args.chain.length})${asyncLabel}`,\n\t\t\t\t\t0,\n\t\t\t\t\t0,\n\t\t\t\t);\n\t\t\tif (isParallel)\n\t\t\t\treturn new Text(\n\t\t\t\t\t`${theme.fg(\"toolTitle\", theme.bold(\"subagent \"))}parallel (${parallelCount})${asyncLabel}`,\n\t\t\t\t\t0,\n\t\t\t\t\t0,\n\t\t\t\t);\n\t\t\treturn new Text(\n\t\t\t\t`${theme.fg(\"toolTitle\", theme.bold(\"subagent \"))}${theme.fg(\"accent\", args.description || args.task || \"?\")}${asyncLabel}`,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t);\n\t\t},\n\n\t\trenderResult(result, options, theme, context) {\n\t\t\tif (subagentResultIsRunning(result)) {\n\t\t\t\tensureSubagentResultAnimation(context);\n\t\t\t} else {\n\t\t\t\tclearLegacyResultAnimationTimer(context);\n\t\t\t}\n\t\t\tconst state = context.state as { frame?: number; animEntries?: Array<{ text: Text; line: (frame: number) => string }> };\n\t\t\t// lunr: collect running-glyph line templates while rendering so the\n\t\t\t// animation timer can rewrite them in place (see ensureSubagentResultAnimation).\n\t\t\tconst entries: Array<{ text: Text; line: (frame: number) => string }> = [];\n\t\t\tstate.animEntries = entries;\n\t\t\tsubagentAnimSink.current = entries;\n\t\t\ttry {\n\t\t\t\treturn renderSubagentResult(result, options, theme, state.frame ?? 0);\n\t\t\t} finally {\n\t\t\t\tsubagentAnimSink.current = null;\n\t\t\t}\n\t\t},\n\n\t};\n\n\tpi.registerTool(tool);\n\n\t// lunr: register a callback so toggling model tiers mid-session rebuilds the subagent\n\t// tool description (adds/removes MODEL TIERS guidance) and refreshes the tool registry.\n\tconst modelTierBridge = (globalThis as Record<symbol, unknown>)[Symbol.for(\"@lunr/model-tiers\")] as\n\t\t| { registerToolDescriptionRefresher?: (refresher: () => void) => void }\n\t\t| undefined;\n\tmodelTierBridge?.registerToolDescriptionRefresher?.(() => {\n\t\ttool.description = buildSubagentToolDescription(config);\n\t\t// pi.runtime is not on ExtensionAPI; registerTool refreshes the live registry.\n\t\tpi.registerTool(tool);\n\t});\n\n\tregisterWaitTool(pi, state, waitToolConfig.enabled);\n\n\tpi.on(\"agent_end\", async (_event, ctx) => {\n\t\tif (ctx.hasUI) return;\n\t\tawait drainOutstandingWork({ state, events: pi.events });\n\t});\n\n\tregisterSlashCommands(pi, state);\n\n\tconst eventUnsubscribeStoreKey = \"__piSubagentEventUnsubscribes\";\n\tconst controlNoticeSeenStoreKey = \"__piSubagentVisibleControlNotices\";\n\tconst previousEventUnsubscribes = globalStore[eventUnsubscribeStoreKey];\n\tif (Array.isArray(previousEventUnsubscribes)) {\n\t\tfor (const unsubscribe of previousEventUnsubscribes) {\n\t\t\tif (typeof unsubscribe !== \"function\") continue;\n\t\t\ttry {\n\t\t\t\tunsubscribe();\n\t\t\t} catch {\n\t\t\t\t// Best effort cleanup for stale handlers from an older reload.\n\t\t\t}\n\t\t}\n\t}\n\tregisterSubagentNotify(pi, state, { batchConfig: config.completionBatch });\n\n\tconst existingVisibleControlNotices = globalStore[controlNoticeSeenStoreKey];\n\tconst visibleControlNotices = existingVisibleControlNotices instanceof Set ? existingVisibleControlNotices as Set<string> : new Set<string>();\n\tglobalStore[controlNoticeSeenStoreKey] = visibleControlNotices;\n\tconst controlEventHandler = (payload: unknown) => {\n\t\thandleSubagentControlNotice({\n\t\t\tpi,\n\t\t\tstate,\n\t\t\tvisibleControlNotices,\n\t\t\tdetails: payload as SubagentControlMessageDetails,\n\t\t});\n\t};\n\tconst steeringNoticeHandler = (payload: unknown) => {\n\t\thandleSubagentSteeringNotice({ pi, state, details: payload as SubagentSteeringMessageDetails });\n\t};\n\tconst eventUnsubscribes = [\n\t\tpi.events.on(SUBAGENT_ASYNC_STARTED_EVENT, handleStarted),\n\t\tpi.events.on(SUBAGENT_ASYNC_COMPLETE_EVENT, handleComplete),\n\t\tpi.events.on(SUBAGENT_CONTROL_EVENT, controlEventHandler),\n\t\tpi.events.on(SUBAGENT_STEERING_NOTICE_EVENT, steeringNoticeHandler),\n\t\trpcBridge.dispose,\n\t];\n\tglobalStore[eventUnsubscribeStoreKey] = eventUnsubscribes;\n\n\tpi.on(\"tool_result\", (event, ctx) => {\n\t\tif (event.toolName !== \"subagent\") return;\n\t\tif (!ctx.hasUI) return;\n\t\tstate.lastUiContext = ctx;\n\t\tif (state.asyncJobs.size > 0) {\n\t\t\trefreshWidget(ctx);\n\t\t\tensurePoller();\n\t\t}\n\t});\n\n\tconst cleanupSessionArtifacts = (ctx: ExtensionContext) => {\n\t\ttry {\n\t\t\tconst sessionFile = ctx.sessionManager.getSessionFile();\n\t\t\tif (sessionFile) {\n\t\t\t\tcleanupOldArtifacts(getArtifactsDir(sessionFile), DEFAULT_ARTIFACT_CONFIG.cleanupDays);\n\t\t\t}\n\t\t} catch {\n\t\t\t// Cleanup failures should not block session lifecycle events.\n\t\t}\n\t};\n\n\tconst resetSessionState = (ctx: ExtensionContext) => {\n\t\tstate.baseCwd = ctx.cwd;\n\t\tstate.currentSessionId = resolveCurrentSessionId(ctx.sessionManager);\n\t\tstate.subagentSpawns = { sessionId: state.currentSessionId, count: 0 };\n\t\t// Set PI_SUBAGENT_PARENT_SESSION for permission-system forwarding.\n\t\t// Only set in the root session (the interactive UI session), not in\n\t\t// child subagent processes — children inherit the parent's value\n\t\t// through the process environment at spawn time and must not overwrite\n\t\t// it with their own session identity.\n\t\tif (!process.env[SUBAGENT_CHILD_ENV]) {\n\t\t\tconst sessionId = ctx.sessionManager.getSessionId();\n\t\t\tif (sessionId) {\n\t\t\t\tprocess.env[SUBAGENT_PARENT_SESSION_ENV] = sessionId;\n\t\t\t}\n\t\t}\n\t\tstate.lastUiContext = ctx;\n\t\tcleanupSessionArtifacts(ctx);\n\t\tclearPendingForegroundControlNotices(state);\n\t\tresetJobs(ctx);\n\t\trestoreActiveJobs(ctx);\n\t\tscheduledRunManager.bindSession(ctx);\n\t\trestoreSlashFinalSnapshots(ctx.sessionManager.getEntries());\n\t\tprimeExistingResults();\n\t};\n\n\tpi.on(\"session_start\", (_event, ctx) => {\n\t\tresetSessionState(ctx);\n\t\trpcBridge.emitReady(ctx);\n\t\tsupervisorChannel.start();\n\t});\n\n\tpi.on(\"session_shutdown\", () => {\n\t\tdelete process.env[SUBAGENT_PARENT_SESSION_ENV];\n\t\tfor (const unsubscribe of eventUnsubscribes) {\n\t\t\ttry {\n\t\t\t\tunsubscribe();\n\t\t\t} catch {\n\t\t\t\t// Best effort cleanup during shutdown.\n\t\t\t}\n\t\t}\n\t\tif (globalStore[eventUnsubscribeStoreKey] === eventUnsubscribes) {\n\t\t\tdelete globalStore[eventUnsubscribeStoreKey];\n\t\t}\n\t\tstopResultWatcher();\n\t\tscheduledRunManager.stop();\n\t\tif (state.poller) clearInterval(state.poller);\n\t\tstate.poller = null;\n\t\tclearPendingForegroundControlNotices(state);\n\t\tfor (const timer of state.cleanupTimers.values()) {\n\t\t\tclearTimeout(timer);\n\t\t}\n\t\tstate.cleanupTimers.clear();\n\t\tstate.asyncJobs.clear();\n\t\tclearSlashSnapshots();\n\t\tslashBridge.cancelAll();\n\t\tslashBridge.dispose();\n\t\tpromptTemplateBridge.cancelAll();\n\t\tpromptTemplateBridge.dispose();\n\t\tsupervisorChannel.dispose();\n\t\tif (globalStore[runtimeCleanupStoreKey] === runtimeCleanup) {\n\t\t\tdelete globalStore[runtimeCleanupStoreKey];\n\t\t}\n\t\ttry {\n\t\t\tif (state.lastUiContext?.hasUI) {\n\t\t\t\tstate.lastUiContext.ui.setWidget(WIDGET_KEY, undefined);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (!isStaleExtensionContextError(error)) throw error;\n\t\t}\n\t});\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/extension/index.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * Subagent Tool\n *\n * Full-featured subagent with sync and async modes.\n * - Sync (default): Streams output, renders markdown, tracks usage\n * - Async: Background execution, emits events when done\n *\n * Modes: single (agent + task), parallel (tasks[]), chain (chain[] with {previous})\n * Toggle: async parameter (default: false, configurable via config.json)\n *\n * Config file: ~/.lunr/agent/extensions/subagent/config.json\n * { \"asyncByDefault\": true, \"forceTopLevelAsync\": true, \"maxSubagentDepth\": 1, \"intercomBridge\": { \"mode\": \"always\", \"instructionFile\": \"./intercom-bridge.md\" }, \"worktreeSetupHook\": \"./scripts/setup-worktree.mjs\" }\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { AgentToolResult } from \"@ashx-j/lunr-agent\";\nimport { keyText, type ExtensionAPI, type ExtensionContext, type ToolDefinition } from \"@ashx-j/lunr\";\nimport { Box, Container, Spacer, Text, truncateToWidth, visibleWidth, wrapTextWithAnsi, type Component } from \"@ashx-j/lunr-tui\";\n\nimport { cleanupAllArtifactDirs, cleanupOldArtifacts, getArtifactsDir } from \"../shared/artifacts.ts\";\nimport { resolveCurrentSessionId } from \"../shared/session-identity.ts\";\nimport { cleanupOldChainDirs } from \"../shared/settings.ts\";\nimport { clearLegacyResultAnimationTimer, renderSubagentResult, subagentAnimSink } from \"../tui/render.ts\";\nimport { SubagentParams } from \"./schemas.ts\";\nimport { validateChainInput } from \"./chain-validation.ts\";\nimport { createSubagentExecutor, type SubagentParamsLike } from \"../runs/foreground/subagent-executor.ts\";\nimport { createAsyncJobTracker } from \"../runs/background/async-job-tracker.ts\";\nimport { createResultWatcher } from \"../runs/background/result-watcher.ts\";\nimport { createScheduledRunManager } from \"../runs/background/scheduled-runs.ts\";\nimport { registerSlashCommands } from \"../slash/slash-commands.ts\";\nimport { registerPromptTemplateDelegationBridge } from \"../slash/prompt-template-bridge.ts\";\nimport { registerMainWatchdog } from \"../watchdog/register-main.ts\";\nimport { registerSlashSubagentBridge } from \"../slash/slash-bridge.ts\";\nimport { createNativeSupervisorChannel } from \"../intercom/native-supervisor-channel.ts\";\nimport { registerSubagentRpcBridge } from \"./rpc.ts\";\nimport { clearSlashSnapshots, getSlashRenderableSnapshot, resolveSlashMessageDetails, restoreSlashFinalSnapshots, type SlashMessageDetails } from \"../slash/slash-live-state.ts\";\nimport { inspectSubagentStatus } from \"../runs/background/run-status.ts\";\nimport { resolveWaitToolConfig } from \"../runs/background/subagent-wait.ts\";\nimport { registerWaitTool } from \"../runs/background/wait-tool.ts\";\nimport { drainOutstandingWork } from \"../runs/background/auto-drain.ts\";\nimport registerSubagentNotify, { parseSubagentNotifyContent, type SubagentNotifyDetails } from \"../runs/background/notify.ts\";\nimport { formatSteeringNotice, handleSubagentSteeringNotice, SUBAGENT_STEERING_MESSAGE_TYPE, type SubagentSteeringMessageDetails } from \"./steering-notices.ts\";\nimport { SUBAGENT_CHILD_ENV, SUBAGENT_PARENT_SESSION_ENV } from \"../runs/shared/pi-args.ts\";\nimport { formatDuration, shortenPath } from \"../shared/formatters.ts\";\nimport { loadConfig } from \"./config.ts\";\nimport { buildSubagentToolDescription } from \"./tool-description.ts\";\nimport {\n\ttype Details,\n\ttype SubagentState,\n\tASYNC_DIR,\n\tDEFAULT_ARTIFACT_CONFIG,\n\tRESULTS_DIR,\n\tSLASH_RESULT_TYPE,\n\tSLASH_TEXT_RESULT_TYPE,\n\tSUBAGENT_ASYNC_COMPLETE_EVENT,\n\tSUBAGENT_ASYNC_STARTED_EVENT,\n\tSUBAGENT_CONTROL_EVENT,\n\tSUBAGENT_STEERING_NOTICE_EVENT,\n\tWIDGET_KEY,\n} from \"../shared/types.ts\";\nimport {\n\tclearPendingForegroundControlNotices,\n\tformatSubagentControlNotice,\n\thandleSubagentControlNotice,\n\tSUBAGENT_CONTROL_MESSAGE_TYPE,\n\ttype SubagentControlMessageDetails,\n} from \"./control-notices.ts\";\n\nexport { loadConfig } from \"./config.ts\";\n\n/**\n * Derive subagent session base directory from parent session file.\n * If parent session is ~/.lunr/agent/sessions/abc123.jsonl,\n * returns ~/.lunr/agent/sessions/abc123/ as the base.\n * Callers add runId to create the actual session root: abc123/{runId}/\n * Falls back to a unique temp directory if no parent session.\n */\nfunction getSubagentSessionRoot(parentSessionFile: string | null): string {\n\tif (parentSessionFile) {\n\t\tconst baseName = path.basename(parentSessionFile, \".jsonl\");\n\t\tconst sessionsDir = path.dirname(parentSessionFile);\n\t\treturn path.join(sessionsDir, baseName);\n\t}\n\treturn fs.mkdtempSync(path.join(os.tmpdir(), \"pi-subagent-session-\"));\n}\n\nfunction expandTilde(p: string): string {\n\treturn p.startsWith(\"~/\") ? path.join(os.homedir(), p.slice(2)) : p;\n}\n\n/**\n * Create a directory and verify it is actually accessible.\n * On Windows with Azure AD/Entra ID, directories created shortly after\n * wake-from-sleep can end up with broken NTFS ACLs (null DACL) when the\n * cloud SID cannot be resolved without network connectivity. This leaves\n * the directory completely inaccessible to the creating user.\n */\nfunction ensureAccessibleDir(dirPath: string): void {\n\tfs.mkdirSync(dirPath, { recursive: true });\n\ttry {\n\t\tfs.accessSync(dirPath, fs.constants.R_OK | fs.constants.W_OK);\n\t} catch {\n\t\ttry {\n\t\t\tfs.rmSync(dirPath, { recursive: true, force: true });\n\t\t} catch {\n\t\t\t// Best effort: retry mkdir/access even if cleanup fails.\n\t\t}\n\t\tfs.mkdirSync(dirPath, { recursive: true });\n\t\tfs.accessSync(dirPath, fs.constants.R_OK | fs.constants.W_OK);\n\t}\n}\n\nfunction isSlashResultRunning(result: { details?: Details }): boolean {\n\treturn result.details?.progress?.some((entry) => entry.status === \"running\")\n\t\t|| result.details?.results.some((entry) => entry.progress?.status === \"running\")\n\t\t|| false;\n}\n\n// Drives the inline running-indicator braille animation for foreground subagent\n// results. Foreground runs receive progress only on child events, so the glyph\n// (derived from progress fields) would freeze between events. While a result is\n// running we tick a frame counter every 80ms; renderResult registers the\n// running-glyph lines in state.animEntries (via subagentAnimSink) and the timer\n// rewrites just those Text nodes + requests a repaint, instead of invalidate()-ing\n// the whole tool component (a full renderSubagentResult rebuild 12.5x/s made the\n// spinner laggy).\nfunction subagentResultIsRunning(result: { details?: Details }): boolean {\n\treturn result.details?.progress?.some((entry) => entry.status === \"running\")\n\t\t|| result.details?.results.some((entry) => entry.progress?.status === \"running\")\n\t\t|| false;\n}\n\nfunction effectiveParallelTaskCount(tasks: Array<{ count?: unknown }> | undefined): number {\n\tif (!tasks || tasks.length === 0) return 0;\n\treturn tasks.reduce((total, task) => {\n\t\tconst count = typeof task.count === \"number\" && Number.isInteger(task.count) && task.count >= 1 ? task.count : 1;\n\t\treturn total + count;\n\t}, 0);\n}\n\nexport function renderSubagentCall(args, theme, context): Text {\n\tif (args.action) {\n\t\tconst target = args.id || args.runId || \"\";\n\t\treturn new Text(\n\t\t\t`${theme.fg(\"toolTitle\", theme.bold(\"subagent \"))}${args.action}${target ? ` ${theme.fg(\"accent\", target)}` : \"\"}`,\n\t\t\t0,\n\t\t\t0,\n\t\t);\n\t}\n\tconst isParallel = (args.tasks?.length ?? 0) > 0;\n\tconst parallelCount = effectiveParallelTaskCount(args.tasks as Array<{ count?: unknown }> | undefined);\n\tconst asyncLabel = args.async === true && args.clarify !== true ? theme.fg(\"warning\", \" [async]\") : \"\";\n\tif (args.chain?.length) {\n\t\treturn new Text(\n\t\t\t`${theme.fg(\"toolTitle\", theme.bold(\"subagent \"))}chain (${args.chain.length})${asyncLabel}`,\n\t\t\t0,\n\t\t\t0,\n\t\t);\n\t}\n\tif (isParallel) {\n\t\treturn new Text(\n\t\t\t`${theme.fg(\"toolTitle\", theme.bold(\"subagent \"))}parallel (${parallelCount})${asyncLabel}`,\n\t\t\t0,\n\t\t\t0,\n\t\t);\n\t}\n\tconst showDescription = !context?.isPartial && !context?.expanded && !context?.isError;\n\tconst description = showDescription ? theme.fg(\"accent\", args.description || args.task || \"?\") : \"\";\n\treturn new Text(\n\t\t`${theme.fg(\"toolTitle\", theme.bold(description ? \"subagent \" : \"subagent\"))}${description}${asyncLabel}`,\n\t\t0,\n\t\t0,\n\t);\n}\n\nfunction ensureSubagentResultAnimation(context: { state: Record<string, unknown>; invalidate?: () => void; requestRender?: () => void }): void {\n\tconst state = context.state as {\n\t\tsubagentResultAnimationTimer?: ReturnType<typeof setInterval>;\n\t\tframe?: number;\n\t\tanimEntries?: Array<{ text: Text; line: (frame: number) => string }>;\n\t};\n\tif (state.subagentResultAnimationTimer) return;\n\tif (typeof context.invalidate !== \"function\") return;\n\tif (state.frame === undefined) state.frame = 0;\n\tstate.subagentResultAnimationTimer = setInterval(() => {\n\t\tstate.frame = ((state.frame ?? 0) + 1) % 10;\n\t\ttry {\n\t\t\tconst entries = state.animEntries;\n\t\t\tif (entries?.length && typeof context.requestRender === \"function\") {\n\t\t\t\tfor (const entry of entries) entry.text.setText(entry.line(state.frame ?? 0));\n\t\t\t\tcontext.requestRender();\n\t\t\t} else {\n\t\t\t\tcontext.invalidate();\n\t\t\t}\n\t\t} catch {}\n\t}, 80);\n}\n\nfunction isSlashResultError(result: { details?: Details }): boolean {\n\treturn result.details?.results.some((entry) => entry.exitCode !== 0 && entry.progress?.status !== \"running\") || false;\n}\n\nfunction isStaleExtensionContextError(error: unknown): boolean {\n\treturn error instanceof Error && error.message.includes(\"Extension context no longer active\");\n}\n\nfunction rebuildSlashResultContainer(\n\tcontainer: Container,\n\tresult: AgentToolResult<Details>,\n\toptions: { expanded: boolean },\n\ttheme: ExtensionContext[\"ui\"][\"theme\"],\n): void {\n\tcontainer.clear();\n\tcontainer.addChild(new Spacer(1));\n\tconst boxTheme = isSlashResultRunning(result) ? \"toolPendingBg\" : isSlashResultError(result) ? \"toolErrorBg\" : \"toolSuccessBg\";\n\tconst box = new Box(1, 1, (text: string) => theme.bg(boxTheme, text));\n\tbox.addChild(renderSubagentResult(result, options, theme));\n\tcontainer.addChild(box);\n}\n\nfunction createSlashResultComponent(\n\tdetails: SlashMessageDetails,\n\toptions: { expanded: boolean },\n\ttheme: ExtensionContext[\"ui\"][\"theme\"],\n): Container {\n\tconst container = new Container();\n\tlet lastVersion = -1;\n\tcontainer.render = (width: number): string[] => {\n\t\tconst snapshot = getSlashRenderableSnapshot(details);\n\t\tif (snapshot.version !== lastVersion || isSlashResultRunning(snapshot.result)) {\n\t\t\tlastVersion = snapshot.version;\n\t\t\trebuildSlashResultContainer(container, snapshot.result, options, theme);\n\t\t}\n\t\treturn Container.prototype.render.call(container, width);\n\t};\n\treturn container;\n}\n\nclass SubagentControlNoticeComponent implements Component {\n\tconstructor(\n\t\tprivate readonly details: SubagentControlMessageDetails,\n\t\tprivate readonly theme: ExtensionContext[\"ui\"][\"theme\"],\n\t) {}\n\n\tinvalidate(): void {}\n\n\trender(width: number): string[] {\n\t\tconst eventLabel = this.details.event.type.replaceAll(\"_\", \" \");\n\t\tif (width < 3) return [truncateToWidth(`Subagent ${eventLabel}`, width)];\n\t\tconst bodyWidth = Math.max(1, width - 2);\n\t\tconst borderChar = \"─\";\n\t\tconst header = ` ⚠ Subagent ${eventLabel}: ${this.details.event.agent} `;\n\t\tconst headerText = truncateToWidth(header, bodyWidth, \"\");\n\t\tconst headerPadding = Math.max(0, bodyWidth - visibleWidth(headerText));\n\t\tconst lines = [this.theme.fg(\"accent\", `╭${headerText}${borderChar.repeat(headerPadding)}╮`)];\n\n\t\tfor (const line of wrapTextWithAnsi(formatSubagentControlNotice(this.details), bodyWidth)) {\n\t\t\tconst text = truncateToWidth(line, bodyWidth, \"\");\n\t\t\tconst padding = Math.max(0, bodyWidth - visibleWidth(text));\n\t\t\tlines.push(this.theme.fg(\"accent\", `│${text}${\" \".repeat(padding)}│`));\n\t\t}\n\t\tlines.push(this.theme.fg(\"accent\", `╰${borderChar.repeat(bodyWidth)}╯`));\n\t\treturn lines;\n\t}\n}\n\nexport default function registerSubagentExtension(pi: ExtensionAPI): void {\n\tif (process.env[SUBAGENT_CHILD_ENV] === \"1\") {\n\t\treturn;\n\t}\n\tconst globalStore = globalThis as Record<string, unknown>;\n\tconst runtimeCleanupStoreKey = \"__piSubagentRuntimeCleanup\";\n\tconst previousRuntimeCleanup = globalStore[runtimeCleanupStoreKey];\n\tif (typeof previousRuntimeCleanup === \"function\") {\n\t\ttry {\n\t\t\tpreviousRuntimeCleanup();\n\t\t} catch {\n\t\t\t// Best effort cleanup for stale timers from an older reload.\n\t\t}\n\t}\n\n\tensureAccessibleDir(RESULTS_DIR);\n\tensureAccessibleDir(ASYNC_DIR);\n\tcleanupOldChainDirs();\n\n\tconst config = loadConfig();\n\tconst waitToolConfig = resolveWaitToolConfig(config.waitTool);\n\tconst asyncByDefault = config.asyncByDefault === true;\n\tconst tempArtifactsDir = getArtifactsDir(null);\n\tcleanupAllArtifactDirs(DEFAULT_ARTIFACT_CONFIG.cleanupDays);\n\n\tconst state: SubagentState = {\n\t\tbaseCwd: \"\",\n\t\tcurrentSessionId: null,\n\t\tforegroundSubagentInFlight: 0,\n\t\tsubagentSpawns: { sessionId: null, count: 0 },\n\t\tasyncJobs: new Map(),\n\t\tfleetJobs: new Map(),\n\t\tforegroundRuns: new Map(),\n\t\tforegroundControls: new Map(),\n\t\tlastForegroundControlId: null,\n\t\tpendingForegroundControlNotices: new Map(),\n\t\tcleanupTimers: new Map(),\n\t\tlastUiContext: null,\n\t\tpoller: null,\n\t\tcompletionSeen: new Map(),\n\t\twatcher: null,\n\t\twatcherRestartTimer: null,\n\t\tresultFileCoalescer: {\n\t\t\tschedule: () => false,\n\t\t\tclear: () => {},\n\t\t},\n\t};\n\n\tconst supervisorChannel = createNativeSupervisorChannel(pi, state);\n\tconst mainWatchdog = registerMainWatchdog(pi);\n\tconst { startResultWatcher, primeExistingResults, stopResultWatcher } = createResultWatcher(\n\t\tpi,\n\t\tstate,\n\t\tRESULTS_DIR,\n\t\t10 * 60 * 1000,\n\t);\n\tstartResultWatcher();\n\tprimeExistingResults();\n\n\tconst runtimeCleanup = () => {\n\t\tmainWatchdog.dispose();\n\t\tstopResultWatcher();\n\t\tscheduledRunManager.stop();\n\t\tsupervisorChannel.dispose();\n\t\tclearPendingForegroundControlNotices(state);\n\t\tif (state.poller) {\n\t\t\tclearInterval(state.poller);\n\t\t\tstate.poller = null;\n\t\t}\n\t};\n\tglobalStore[runtimeCleanupStoreKey] = runtimeCleanup;\n\n\tconst { ensurePoller, refreshWidget, handleStarted, handleComplete, resetJobs, restoreActiveJobs } = createAsyncJobTracker(pi, state, ASYNC_DIR, {\n\t\twidgetEnabled: config.asyncWidget !== false,\n\t});\n\tlet executorExecute: ((id: string, params: SubagentParamsLike, signal: AbortSignal, onUpdate: ((r: AgentToolResult<Details>) => void) | undefined, ctx: ExtensionContext) => Promise<AgentToolResult<Details>>) | undefined;\n\tconst scheduledRunManager = createScheduledRunManager({\n\t\tconfig,\n\t\tlaunch: (params, ctx, signal) => {\n\t\t\tif (!executorExecute) {\n\t\t\t\treturn Promise.resolve({\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Scheduled subagent launch is unavailable (executor not ready).\" }],\n\t\t\t\t\tisError: true,\n\t\t\t\t\tdetails: { mode: \"management\" as const, results: [] },\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn executorExecute(randomUUID(), params, signal, undefined, ctx);\n\t\t},\n\t});\n\tconst executor = createSubagentExecutor({\n\t\tpi,\n\t\tstate,\n\t\tconfig,\n\t\tasyncByDefault,\n\t\twaitToolEnabled: waitToolConfig.enabled,\n\t\thandleScheduledRunAction: (params, ctx) => scheduledRunManager.handleToolCall(params, ctx),\n\t\twatchdog: mainWatchdog,\n\t\ttempArtifactsDir,\n\t\tgetSubagentSessionRoot,\n\t\texpandTilde,\n\t});\n\texecutorExecute = executor.execute;\n\n\tpi.registerMessageRenderer<SlashMessageDetails>(SLASH_RESULT_TYPE, (message, options, theme) => {\n\t\tconst details = resolveSlashMessageDetails(message.details);\n\t\tif (!details) return undefined;\n\t\treturn createSlashResultComponent(details, options, theme);\n\t});\n\n\tpi.registerMessageRenderer<undefined>(SLASH_TEXT_RESULT_TYPE, (message, _options, _theme) => {\n\t\tconst content = typeof message.content === \"string\"\n\t\t\t? message.content\n\t\t\t: message.content\n\t\t\t\t.filter((entry) => entry.type === \"text\")\n\t\t\t\t.map((entry) => entry.text)\n\t\t\t\t.join(\"\\n\");\n\t\treturn new Text(content, 0, 0);\n\t});\n\n\tpi.registerMessageRenderer<SubagentNotifyDetails>(\"subagent-notify\", (message, options, theme) => {\n\t\tconst content = typeof message.content === \"string\" ? message.content : \"\";\n\t\tconst details = (message.details as SubagentNotifyDetails | undefined) ?? parseSubagentNotifyContent(content);\n\t\tif (!details) return new Text(content, 0, 0);\n\t\tconst icon = details.status === \"completed\"\n\t\t\t? theme.fg(\"success\", \"✓\")\n\t\t\t: details.status === \"paused\"\n\t\t\t\t? theme.fg(\"warning\", \"■\")\n\t\t\t\t: theme.fg(\"error\", \"✗\");\n\t\tconst parts: string[] = [];\n\t\tif (details.taskInfo) parts.push(details.taskInfo);\n\t\tif (details.durationMs !== undefined) parts.push(formatDuration(details.durationMs));\n\t\tconst notifyLabel = details.taskInfo || details.agent || \"child\";\n\t\tlet text = `${icon} ${theme.bold(notifyLabel)} ${theme.fg(\"dim\", details.status)}`;\n\t\tif (parts.length > 0) text += ` ${theme.fg(\"dim\", \"·\")} ${parts.map((part) => theme.fg(\"dim\", part)).join(` ${theme.fg(\"dim\", \"·\")} `)}`;\n\t\tconst trimmedPreview = details.resultPreview.trim();\n\t\tconst previewLines = options.expanded\n\t\t\t? trimmedPreview.split(\"\\n\").filter((line) => line.trim())\n\t\t\t: [trimmedPreview.split(\"\\n\", 1)[0] ?? \"\"].filter((line) => line.trim());\n\t\tfor (const line of previewLines.length > 0 ? previewLines : [\"(no output)\"]) {\n\t\t\ttext += `\\n ${theme.fg(\"dim\", `⎿ ${line}`)}`;\n\t\t}\n\t\tif (!options.expanded && trimmedPreview.includes(\"\\n\")) {\n\t\t\tconst expandKey = keyText(\"app.tools.expand\");\n\t\t\ttext += `\\n ${theme.fg(\"dim\", `${expandKey} full notification`)}`;\n\t\t}\n\t\tif (details.sessionLabel && details.sessionValue) {\n\t\t\ttext += `\\n ${theme.fg(\"muted\", `${details.sessionLabel}: ${shortenPath(details.sessionValue)}`)}`;\n\t\t}\n\t\treturn new Text(text, 0, 0);\n\t});\n\n\tpi.registerMessageRenderer<SubagentSteeringMessageDetails>(SUBAGENT_STEERING_MESSAGE_TYPE, (message, _options, theme) => {\n\t\tconst details = message.details as SubagentSteeringMessageDetails | undefined;\n\t\tif (!details) return undefined;\n\t\treturn new Text(theme.fg(details.state === \"recovered\" ? \"warning\" : \"error\", formatSteeringNotice(details)), 0, 0);\n\t});\n\n\tpi.registerMessageRenderer<SubagentControlMessageDetails>(SUBAGENT_CONTROL_MESSAGE_TYPE, () => undefined);\n\n\tconst executeSubagentCollapsed = (id: string, params: SubagentParamsLike, signal: AbortSignal, onUpdate: ((result: AgentToolResult<Details>) => void) | undefined, ctx: ExtensionContext) => {\n\t\tif (ctx.hasUI) ctx.ui.setToolsExpanded(false);\n\t\treturn executor.execute(id, params, signal, onUpdate, ctx);\n\t};\n\n\tconst slashBridge = registerSlashSubagentBridge({\n\t\tevents: pi.events,\n\t\tgetContext: () => state.lastUiContext,\n\t\texecute: (id, params, signal, onUpdate, ctx) =>\n\t\t\texecuteSubagentCollapsed(id, params, signal, onUpdate, ctx),\n\t});\n\n\tconst promptTemplateBridge = registerPromptTemplateDelegationBridge({\n\t\tevents: pi.events,\n\t\tgetContext: () => state.lastUiContext,\n\t\texecute: (requestId, params, signal, ctx, onUpdate) =>\n\t\t\texecuteSubagentCollapsed(requestId, params, signal, onUpdate, ctx),\n\t});\n\n\tconst rpcBridge = registerSubagentRpcBridge({\n\t\tevents: pi.events,\n\t\tgetContext: () => state.lastUiContext,\n\t\texecute: (id, params, signal, onUpdate, ctx) => executor.execute(id, params, signal, onUpdate, ctx),\n\t});\n\n\tconst tool: ToolDefinition<typeof SubagentParams, Details> = {\n\t\tname: \"subagent\",\n\t\tlabel: \"Subagent\",\n\t\tdescription: buildSubagentToolDescription(config),\n\t\tparameters: SubagentParams,\n\t\t// lunr: same-turn SINGLE calls overlap; sequential work uses chain.\n\t\texecutionMode: \"parallel\",\n\n\t\tprepareArguments(args) {\n\t\t\t// Run friendly chain validation before pi-ai's raw TypeBox schema check\n\t\t\t// so the model sees which property is disallowed, what is allowed, and a\n\t\t\t// valid example instead of `chain.N: must not have additional properties`.\n\t\t\tvalidateChainInput(args);\n\t\t\treturn args as never;\n\t\t},\n\n\t\texecute(id, params, signal, onUpdate, ctx) {\n\t\t\treturn executeSubagentCollapsed(id, params, signal, onUpdate, ctx);\n\t\t},\n\n\t\trenderCall: renderSubagentCall,\n\n\t\trenderResult(result, options, theme, context) {\n\t\t\tif (subagentResultIsRunning(result)) {\n\t\t\t\tensureSubagentResultAnimation(context);\n\t\t\t} else {\n\t\t\t\tclearLegacyResultAnimationTimer(context);\n\t\t\t}\n\t\t\tconst state = context.state as { frame?: number; animEntries?: Array<{ text: Text; line: (frame: number) => string }> };\n\t\t\t// lunr: collect running-glyph line templates while rendering so the\n\t\t\t// animation timer can rewrite them in place (see ensureSubagentResultAnimation).\n\t\t\tconst entries: Array<{ text: Text; line: (frame: number) => string }> = [];\n\t\t\tstate.animEntries = entries;\n\t\t\tsubagentAnimSink.current = entries;\n\t\t\ttry {\n\t\t\t\treturn renderSubagentResult(result, options, theme, state.frame ?? 0);\n\t\t\t} finally {\n\t\t\t\tsubagentAnimSink.current = null;\n\t\t\t}\n\t\t},\n\n\t};\n\n\tpi.registerTool(tool);\n\n\t// lunr: register a callback so toggling model tiers mid-session rebuilds the subagent\n\t// tool description (adds/removes MODEL TIERS guidance) and refreshes the tool registry.\n\tconst modelTierBridge = (globalThis as Record<symbol, unknown>)[Symbol.for(\"@lunr/model-tiers\")] as\n\t\t| { registerToolDescriptionRefresher?: (refresher: () => void) => void }\n\t\t| undefined;\n\tmodelTierBridge?.registerToolDescriptionRefresher?.(() => {\n\t\ttool.description = buildSubagentToolDescription(config);\n\t\t// pi.runtime is not on ExtensionAPI; registerTool refreshes the live registry.\n\t\tpi.registerTool(tool);\n\t});\n\n\tregisterWaitTool(pi, state, waitToolConfig.enabled);\n\n\tpi.on(\"agent_end\", async (_event, ctx) => {\n\t\tif (ctx.hasUI) return;\n\t\tawait drainOutstandingWork({ state, events: pi.events });\n\t});\n\n\tregisterSlashCommands(pi, state);\n\n\tconst eventUnsubscribeStoreKey = \"__piSubagentEventUnsubscribes\";\n\tconst controlNoticeSeenStoreKey = \"__piSubagentVisibleControlNotices\";\n\tconst previousEventUnsubscribes = globalStore[eventUnsubscribeStoreKey];\n\tif (Array.isArray(previousEventUnsubscribes)) {\n\t\tfor (const unsubscribe of previousEventUnsubscribes) {\n\t\t\tif (typeof unsubscribe !== \"function\") continue;\n\t\t\ttry {\n\t\t\t\tunsubscribe();\n\t\t\t} catch {\n\t\t\t\t// Best effort cleanup for stale handlers from an older reload.\n\t\t\t}\n\t\t}\n\t}\n\tregisterSubagentNotify(pi, state, { batchConfig: config.completionBatch });\n\n\tconst existingVisibleControlNotices = globalStore[controlNoticeSeenStoreKey];\n\tconst visibleControlNotices = existingVisibleControlNotices instanceof Set ? existingVisibleControlNotices as Set<string> : new Set<string>();\n\tglobalStore[controlNoticeSeenStoreKey] = visibleControlNotices;\n\tconst controlEventHandler = (payload: unknown) => {\n\t\thandleSubagentControlNotice({\n\t\t\tpi,\n\t\t\tstate,\n\t\t\tvisibleControlNotices,\n\t\t\tdetails: payload as SubagentControlMessageDetails,\n\t\t});\n\t};\n\tconst steeringNoticeHandler = (payload: unknown) => {\n\t\thandleSubagentSteeringNotice({ pi, state, details: payload as SubagentSteeringMessageDetails });\n\t};\n\tconst eventUnsubscribes = [\n\t\tpi.events.on(SUBAGENT_ASYNC_STARTED_EVENT, handleStarted),\n\t\tpi.events.on(SUBAGENT_ASYNC_COMPLETE_EVENT, handleComplete),\n\t\tpi.events.on(SUBAGENT_CONTROL_EVENT, controlEventHandler),\n\t\tpi.events.on(SUBAGENT_STEERING_NOTICE_EVENT, steeringNoticeHandler),\n\t\trpcBridge.dispose,\n\t];\n\tglobalStore[eventUnsubscribeStoreKey] = eventUnsubscribes;\n\n\tpi.on(\"tool_result\", (event, ctx) => {\n\t\tif (event.toolName !== \"subagent\") return;\n\t\tif (!ctx.hasUI) return;\n\t\tstate.lastUiContext = ctx;\n\t\tif (state.asyncJobs.size > 0) {\n\t\t\trefreshWidget(ctx);\n\t\t\tensurePoller();\n\t\t}\n\t});\n\n\tconst cleanupSessionArtifacts = (ctx: ExtensionContext) => {\n\t\ttry {\n\t\t\tconst sessionFile = ctx.sessionManager.getSessionFile();\n\t\t\tif (sessionFile) {\n\t\t\t\tcleanupOldArtifacts(getArtifactsDir(sessionFile), DEFAULT_ARTIFACT_CONFIG.cleanupDays);\n\t\t\t}\n\t\t} catch {\n\t\t\t// Cleanup failures should not block session lifecycle events.\n\t\t}\n\t};\n\n\tconst resetSessionState = (ctx: ExtensionContext) => {\n\t\tstate.baseCwd = ctx.cwd;\n\t\tstate.currentSessionId = resolveCurrentSessionId(ctx.sessionManager);\n\t\tstate.subagentSpawns = { sessionId: state.currentSessionId, count: 0 };\n\t\t// Set PI_SUBAGENT_PARENT_SESSION for permission-system forwarding.\n\t\t// Only set in the root session (the interactive UI session), not in\n\t\t// child subagent processes — children inherit the parent's value\n\t\t// through the process environment at spawn time and must not overwrite\n\t\t// it with their own session identity.\n\t\tif (!process.env[SUBAGENT_CHILD_ENV]) {\n\t\t\tconst sessionId = ctx.sessionManager.getSessionId();\n\t\t\tif (sessionId) {\n\t\t\t\tprocess.env[SUBAGENT_PARENT_SESSION_ENV] = sessionId;\n\t\t\t}\n\t\t}\n\t\tstate.lastUiContext = ctx;\n\t\tcleanupSessionArtifacts(ctx);\n\t\tclearPendingForegroundControlNotices(state);\n\t\tresetJobs(ctx);\n\t\trestoreActiveJobs(ctx);\n\t\tscheduledRunManager.bindSession(ctx);\n\t\trestoreSlashFinalSnapshots(ctx.sessionManager.getEntries());\n\t\tprimeExistingResults();\n\t};\n\n\tpi.on(\"session_start\", (_event, ctx) => {\n\t\tresetSessionState(ctx);\n\t\trpcBridge.emitReady(ctx);\n\t\tsupervisorChannel.start();\n\t});\n\n\tpi.on(\"session_shutdown\", () => {\n\t\tdelete process.env[SUBAGENT_PARENT_SESSION_ENV];\n\t\tfor (const unsubscribe of eventUnsubscribes) {\n\t\t\ttry {\n\t\t\t\tunsubscribe();\n\t\t\t} catch {\n\t\t\t\t// Best effort cleanup during shutdown.\n\t\t\t}\n\t\t}\n\t\tif (globalStore[eventUnsubscribeStoreKey] === eventUnsubscribes) {\n\t\t\tdelete globalStore[eventUnsubscribeStoreKey];\n\t\t}\n\t\tstopResultWatcher();\n\t\tscheduledRunManager.stop();\n\t\tif (state.poller) clearInterval(state.poller);\n\t\tstate.poller = null;\n\t\tclearPendingForegroundControlNotices(state);\n\t\tfor (const timer of state.cleanupTimers.values()) {\n\t\t\tclearTimeout(timer);\n\t\t}\n\t\tstate.cleanupTimers.clear();\n\t\tstate.asyncJobs.clear();\n\t\tclearSlashSnapshots();\n\t\tslashBridge.cancelAll();\n\t\tslashBridge.dispose();\n\t\tpromptTemplateBridge.cancelAll();\n\t\tpromptTemplateBridge.dispose();\n\t\tsupervisorChannel.dispose();\n\t\tif (globalStore[runtimeCleanupStoreKey] === runtimeCleanup) {\n\t\t\tdelete globalStore[runtimeCleanupStoreKey];\n\t\t}\n\t\ttry {\n\t\t\tif (state.lastUiContext?.hasUI) {\n\t\t\t\tstate.lastUiContext.ui.setWidget(WIDGET_KEY, undefined);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (!isStaleExtensionContextError(error)) throw error;\n\t\t}\n\t});\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"async-execution.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/background/async-execution.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * Async execution logic for subagent tool\n */\n\nimport { spawn } from \"node:child_process\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { createRequire } from \"node:module\";\nimport type { ExtensionAPI } from \"@ashx-j/lunr\";\nimport { normalizeChildSpec } from \"../../shared/child-spec.ts\";\nimport { writePrivateAtomicJson } from \"../../shared/atomic-json.ts\";\nimport { applyThinkingSuffix } from \"../shared/pi-args.ts\";\nimport { snapshotParentPermissionMode } from \"../../../../../core/subagent-permission-inherit.ts\";\nimport { injectOutputPathSystemPrompt, injectSingleOutputInstruction, normalizeSingleOutputOverride, resolveSingleOutputPath, validateFileOnlyOutputMode } from \"../shared/single-output.ts\";\nimport { buildChainInstructions, isDynamicParallelStep, isParallelStep, resolveStepBehavior, suppressProgressForReadOnlyTask, writeInitialProgressFile, type ChainStep, type ResolvedStepBehavior, type SequentialStep, type StepOverrides } from \"../../shared/settings.ts\";\nimport type { RunnerStep } from \"../shared/parallel-utils.ts\";\nimport { resolvePiPackageRoot } from \"../shared/pi-spawn.ts\";\nimport { buildSkillInjection, normalizeSkillInput, resolveSkillsWithFallback } from \"../../agents/skills.ts\";\nimport { PI_CODING_AGENT_PACKAGE_ROOT_ENV, resolveChildCwd } from \"../../shared/utils.ts\";\nimport { buildModelCandidates, resolveEffectiveSubagentModel, resolveModelCandidate, resolveSubagentModelOverride, type AvailableModelInfo, type ParentModel } from \"../shared/model-fallback.ts\";\nimport type { ModelScopeConfig } from \"../shared/model-scope.ts\";\nimport { resolveEffectiveThinking } from \"../../shared/model-info.ts\";\nimport { resolveExpectedWorktreeAgentCwd } from \"../shared/worktree.ts\";\nimport { buildWorkflowGraphSnapshot } from \"../shared/workflow-graph.ts\";\nimport { ChainOutputValidationError, validateChainOutputBindings } from \"../shared/chain-outputs.ts\";\nimport { createStructuredOutputRuntime } from \"../shared/structured-output.ts\";\nimport { resolveEffectiveAcceptance } from \"../shared/acceptance.ts\";\nimport {\n\ttype AcceptanceInput,\n\ttype ArtifactConfig,\n\ttype ChildSpec,\n\ttype Details,\n\ttype MaxOutputConfig,\n\ttype NestedRouteInfo,\n\ttype ResolvedControlConfig,\n\ttype ResolvedTurnBudget,\n\ttype ResolvedToolBudget,\n\ttype SubagentRunMode,\n\ttype SteeringRecoveryDescriptor,\n\tASYNC_DIR,\n\tRESULTS_DIR,\n\tSUBAGENT_ASYNC_STARTED_EVENT,\n\tSUBAGENT_LIFECYCLE_ARTIFACT_VERSION,\n\tTEMP_ROOT_DIR,\n\tgetAsyncConfigPath,\n\tresolveChildMaxSubagentDepth,\n} from \"../../shared/types.ts\";\nimport { nestedResultsPath, resolveInheritedNestedRouteFromEnv, resolveNestedParentAddressFromEnv, writeNestedEvent } from \"../shared/nested-events.ts\";\nimport { initialTurnBudgetState } from \"../shared/turn-budget.ts\";\nimport { validateToolBudgetConfig } from \"../shared/tool-budget.ts\";\nimport type { ImportedAsyncRoot } from \"./chain-root-attachment.ts\";\nimport type { SessionLeaseRequest } from \"../shared/session-lease.ts\";\n\nconst require = createRequire(import.meta.url);\nconst piPackageRoot = resolvePiPackageRoot();\n\nfunction resolveJitiCliFromPackageJson(packageJsonPath: string): string | undefined {\n\tif (!fs.existsSync(packageJsonPath)) return undefined;\n\tconst packageRoot = path.dirname(packageJsonPath);\n\tconst pkg = JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\")) as {\n\t\tbin?: string | Record<string, string>;\n\t};\n\tconst binField = pkg.bin;\n\tconst binPath = typeof binField === \"string\"\n\t\t? binField\n\t\t: binField?.jiti ?? Object.values(binField ?? {})[0];\n\tconst candidates = [binPath, \"lib/jiti-cli.mjs\"].filter((candidate): candidate is string => Boolean(candidate));\n\tfor (const candidate of candidates) {\n\t\tconst cliPath = path.resolve(packageRoot, candidate);\n\t\tif (fs.existsSync(cliPath)) return cliPath;\n\t}\n\treturn undefined;\n}\n\nfunction resolveJitiCliPath(): string | undefined {\n\tconst candidates: Array<() => string | undefined> = [\n\t\t() => require.resolve(\"jiti/package.json\"),\n\t\t() => piPackageRoot\n\t\t\t? createRequire(path.join(piPackageRoot, \"package.json\")).resolve(\"jiti/package.json\")\n\t\t\t: undefined,\n\t\t() => {\n\t\t\tif (!process.argv[1]) return undefined;\n\t\t\tconst piEntry = fs.realpathSync(process.argv[1]);\n\t\t\treturn createRequire(piEntry).resolve(\"jiti/package.json\");\n\t\t},\n\t\t() => piPackageRoot ? path.join(piPackageRoot, \"node_modules\", \"jiti\", \"package.json\") : undefined,\n\t];\n\tfor (const candidate of candidates) {\n\t\ttry {\n\t\t\tconst packageJsonPath = candidate();\n\t\t\tif (!packageJsonPath) continue;\n\t\t\tconst cliPath = resolveJitiCliFromPackageJson(packageJsonPath);\n\t\t\tif (cliPath) return cliPath;\n\t\t} catch {\n\t\t\t// Candidate not available in this install, continue probing.\n\t\t}\n\t}\n\treturn undefined;\n}\n\nconst jitiCliPath = resolveJitiCliPath();\n\ninterface AsyncExecutionContext {\n\tpi: ExtensionAPI;\n\tcwd: string;\n\tcurrentSessionId: string;\n\t/** Parent session id used by permission-system ask forwarding. */\n\tparentSessionId?: string;\n\tcurrentModelProvider?: string;\n\tcurrentModel?: ParentModel;\n\t/** Optional model-scope enforcement resolved from subagent settings. */\n\tmodelScope?: ModelScopeConfig;\n}\n\ninterface AsyncChainParams {\n\tchain: ChainStep[];\n\ttask?: string;\n\t/** Raw caller-facing goal used only by the started event. */\n\tgoal?: string;\n\tattachRoot?: ImportedAsyncRoot & { agent: string; outputName?: string; label?: string };\n\tresultMode?: Exclude<SubagentRunMode, \"single\">;\n\tctx: AsyncExecutionContext;\n\tavailableModels?: AvailableModelInfo[];\n\tcwd?: string;\n\tmaxOutput?: MaxOutputConfig;\n\tartifactsDir?: string;\n\tartifactConfig: ArtifactConfig;\n\tshareEnabled: boolean;\n\tsessionRoot?: string;\n\tchainSkills?: string[];\n\tsessionFilesByFlatIndex?: (string | undefined)[];\n\tthinkingOverridesByFlatIndex?: (string | false | undefined)[];\n\tprogressDir?: string;\n\tdynamicFanoutMaxItems?: number;\n\tmaxSubagentDepth: number;\n\twaitToolEnabled?: boolean;\n\tworktreeSetupHook?: string;\n\tworktreeSetupHookTimeoutMs?: number;\n\tworktreeBaseDir?: string;\n\tcontrolConfig?: ResolvedControlConfig;\n\tcontrolIntercomTarget?: string;\n\tchildIntercomTarget?: (agent: string, index: number) => string | undefined;\n\tnestedRoute?: NestedRouteInfo;\n\tacceptance?: AcceptanceInput;\n\ttimeoutMs?: number;\n\tturnBudget?: ResolvedTurnBudget;\n\ttoolBudget?: ResolvedToolBudget;\n\tconfigToolBudget?: ResolvedToolBudget;\n\t/** Global cap on simultaneously-running subagent tasks within the async run. */\n\tglobalConcurrencyLimit?: number;\n}\n\ninterface AsyncSingleParams {\n\tspec: ChildSpec;\n\t/** Raw caller-facing goal used only by the started event. */\n\tgoal?: string;\n\tctx: AsyncExecutionContext;\n\tcwd?: string;\n\tmaxOutput?: MaxOutputConfig;\n\tartifactsDir?: string;\n\tartifactConfig: ArtifactConfig;\n\tshareEnabled: boolean;\n\tsessionRoot?: string;\n\tsessionDir?: string;\n\tsessionFile?: string;\n\trevivalLease?: SessionLeaseRequest;\n\tskills?: string[];\n\toutput?: string | boolean;\n\toutputMode?: \"inline\" | \"file-only\";\n\toutputBaseDir?: string;\n\tmodelOverride?: string;\n\tthinkingOverride?: string | false;\n\tavailableModels?: AvailableModelInfo[];\n\tmaxSubagentDepth: number;\n\twaitToolEnabled?: boolean;\n\tworktreeSetupHook?: string;\n\tworktreeSetupHookTimeoutMs?: number;\n\tworktreeBaseDir?: string;\n\tcontrolConfig?: ResolvedControlConfig;\n\tcontrolIntercomTarget?: string;\n\tchildIntercomTarget?: (agent: string, index: number) => string | undefined;\n\tnestedRoute?: NestedRouteInfo;\n\tacceptance?: AcceptanceInput;\n\ttimeoutMs?: number;\n\tabsoluteDeadlineAt?: number;\n\tturnBudget?: ResolvedTurnBudget;\n\ttoolBudget?: ResolvedToolBudget;\n\tconfigToolBudget?: ResolvedToolBudget;\n}\n\ninterface AsyncExecutionResult {\n\tcontent: Array<{ type: \"text\"; text: string }>;\n\tdetails: Details;\n\tisError?: boolean;\n}\n\nexport interface AsyncRunnerStepBuildParams {\n\tchain: ChainStep[];\n\ttask?: string;\n\tattachRoot?: ImportedAsyncRoot & { agent: string; outputName?: string; label?: string };\n\tresultMode?: SubagentRunMode;\n\tctx: AsyncExecutionContext;\n\tavailableModels?: AvailableModelInfo[];\n\tcwd?: string;\n\tchainSkills?: string[];\n\tsessionFilesByFlatIndex?: (string | undefined)[];\n\tthinkingOverridesByFlatIndex?: (string | false | undefined)[];\n\tprogressDir?: string;\n\tdynamicFanoutMaxItems?: number;\n\tmaxSubagentDepth: number;\n\twaitToolEnabled?: boolean;\n\tworktreeBaseDir?: string;\n\tasyncDir: string;\n\toutputBaseDir?: string;\n\tvalidateOutputBindings?: boolean;\n\ttoolBudget?: ResolvedToolBudget;\n\tconfigToolBudget?: ResolvedToolBudget;\n\t/** Optional collision-free ChildSpec id namespace for steps appended to a live run. */\n\tchildIdRunId?: string;\n}\n\nexport type AsyncRunnerStepBuildResult =\n\t| {\n\t\tsteps: RunnerStep[];\n\t\trunnerCwd: string;\n\t\tworkflowGraph: ReturnType<typeof buildWorkflowGraphSnapshot>;\n\t\teventChain: ChainStep[];\n\t\toriginalTask?: string;\n\t}\n\t| { error: string };\n\nexport function formatAsyncStartedMessage(headline: string): string {\n\treturn [\n\t\theadline,\n\t\t\"\",\n\t\t\"The async run is detached. Do not run sleep timers or polling loops just to wait for it.\",\n\t\t\"If you have independent work, continue that work. When you have nothing left to do until the async result arrives, call subagent_wait() — it blocks until the run finishes and delivers the completion here. Only if you are certain you will get another turn (an interactive session where the user will prompt you again) can you instead stop and let Pi wake you; inside a skill that must run to completion, or in a non-interactive run, there is no next turn, so use subagent_wait().\",\n\t\t\"Use subagent({ action: \\\"status\\\", id: \\\"...\\\" }) when you need a one-shot status/result or to inspect a blocked/stale run. To block until completion, prefer subagent_wait(). Do not poll in a loop just to wait.\",\n\t].join(\"\\n\");\n}\n\n/**\n * Check if jiti is available for async execution\n */\nexport function isAsyncAvailable(): boolean {\n\treturn jitiCliPath !== undefined;\n}\n\nfunction isNodeExecutableName(execPath: string): boolean {\n\tconst basename = path.basename(execPath).toLowerCase();\n\treturn basename === \"node\" || basename === \"node.exe\" || basename === \"nodejs\" || basename === \"nodejs.exe\";\n}\n\nfunction canUseCurrentNodeExecutable(execPath: string): boolean {\n\ttry {\n\t\tfs.accessSync(execPath, process.platform === \"win32\" ? fs.constants.F_OK : fs.constants.X_OK);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction resolveAsyncRunnerNodeCommand(): string {\n\tif (isNodeExecutableName(process.execPath) && canUseCurrentNodeExecutable(process.execPath)) {\n\t\treturn process.execPath;\n\t}\n\treturn process.platform === \"win32\" ? \"node.exe\" : \"node\";\n}\n\nexport function resolveAsyncRunnerLogPaths(cfg: object): { stdoutPath: string; stderrPath: string } | undefined {\n\tconst asyncDir = typeof (cfg as { asyncDir?: unknown }).asyncDir === \"string\"\n\t\t? (cfg as { asyncDir: string }).asyncDir\n\t\t: undefined;\n\tif (!asyncDir) return undefined;\n\treturn {\n\t\tstdoutPath: path.join(asyncDir, \"runner.stdout.log\"),\n\t\tstderrPath: path.join(asyncDir, \"runner.stderr.log\"),\n\t};\n}\n\nfunction closeFd(fd: number | undefined): void {\n\tif (fd === undefined) return;\n\ttry {\n\t\tfs.closeSync(fd);\n\t} catch {\n\t\t// Best-effort cleanup; child process already owns its duplicated stdio fd.\n\t}\n}\n\n/**\n * Spawn the async runner process\n */\nconst RUNNER_STARTUP_TIMEOUT_MS = 10_000;\nconst RUNNER_STARTUP_WAIT_BUFFER = typeof SharedArrayBuffer !== \"undefined\" ? new SharedArrayBuffer(4) : undefined;\nconst RUNNER_STARTUP_WAIT_VIEW = RUNNER_STARTUP_WAIT_BUFFER ? new Int32Array(RUNNER_STARTUP_WAIT_BUFFER) : undefined;\n\ntype RunnerStartupState = \"ready\" | \"acknowledged\";\n\ntype RunnerStartupWaitResult =\n\t| { ok: true; token: string }\n\t| { ok: false; error: string };\n\nfunction waitForStartupInterval(delayMs = 20): void {\n\tif (RUNNER_STARTUP_WAIT_VIEW) {\n\t\tAtomics.wait(RUNNER_STARTUP_WAIT_VIEW, 0, 0, delayMs);\n\t\treturn;\n\t}\n\tconst waitUntil = Date.now() + delayMs;\n\twhile (Date.now() < waitUntil) {\n\t\t// Startup handshakes are synchronous so resume rejects before reporting a run as started.\n\t}\n}\n\nfunction readRunnerStartup(startupPath: string, expectedState: RunnerStartupState, expectedToken?: string): RunnerStartupWaitResult | undefined {\n\tif (!fs.existsSync(startupPath)) return undefined;\n\ttry {\n\t\tconst payload = JSON.parse(fs.readFileSync(startupPath, \"utf-8\")) as { state?: unknown; token?: unknown; error?: unknown };\n\t\tif (payload.state === \"error\" && typeof payload.error === \"string\") return { ok: false, error: payload.error };\n\t\tif (payload.state !== expectedState) return undefined;\n\t\tif (typeof payload.token !== \"string\" || (expectedToken !== undefined && payload.token !== expectedToken)) {\n\t\t\treturn { ok: false, error: `Async runner wrote an invalid ${expectedState} startup handshake: ${startupPath}` };\n\t\t}\n\t\treturn { ok: true, token: payload.token };\n\t} catch (error) {\n\t\treturn { ok: false, error: `Failed to read async runner startup handshake '${startupPath}': ${error instanceof Error ? error.message : String(error)}` };\n\t}\n}\n\nfunction waitForRunnerStartup(startupPath: string, expectedState: RunnerStartupState, timeoutMs: number, expectedToken?: string): RunnerStartupWaitResult {\n\tconst deadline = Date.now() + timeoutMs;\n\tfor (;;) {\n\t\tconst result = readRunnerStartup(startupPath, expectedState, expectedToken);\n\t\tif (result) return result;\n\t\tif (Date.now() >= deadline) break;\n\t\twaitForStartupInterval(Math.min(20, Math.max(1, deadline - Date.now())));\n\t}\n\tconst finalResult = readRunnerStartup(startupPath, expectedState, expectedToken);\n\tif (finalResult) return finalResult;\n\treturn { ok: false, error: `Timed out after ${timeoutMs}ms waiting for the async runner startup state '${expectedState}'.` };\n}\n\nfunction writeRunnerStartupControl(filePath: string, payload: { action: \"ack\" | \"proceed\"; token: string }): void {\n\tconst tempPath = `${filePath}.${process.pid}.${Date.now()}.${Math.random().toString(36).slice(2)}.tmp`;\n\ttry {\n\t\tfs.writeFileSync(tempPath, JSON.stringify(payload), { encoding: \"utf-8\", mode: 0o600 });\n\t\tfs.renameSync(tempPath, filePath);\n\t} catch (error) {\n\t\ttry {\n\t\t\tfs.rmSync(tempPath, { force: true });\n\t\t} catch {\n\t\t\t// Preserve the startup-control write error.\n\t\t}\n\t\tthrow error;\n\t}\n}\n\nfunction runnerIsAlive(pid: number): boolean {\n\ttry {\n\t\tprocess.kill(pid, 0);\n\t\treturn true;\n\t} catch (error) {\n\t\treturn (error as NodeJS.ErrnoException).code === \"EPERM\";\n\t}\n}\n\nfunction terminateRunnerBeforeProceed(pid: number): void {\n\tfor (const signal of [\"SIGTERM\", \"SIGKILL\"] as const) {\n\t\tif (!runnerIsAlive(pid)) return;\n\t\ttry {\n\t\t\tprocess.kill(pid, signal);\n\t\t} catch {\n\t\t\tif (!runnerIsAlive(pid)) return;\n\t\t}\n\t\tconst deadline = Date.now() + 1000;\n\t\twhile (runnerIsAlive(pid) && Date.now() < deadline) waitForStartupInterval();\n\t}\n}\n\nfunction spawnRunner(cfg: object, suffix: string, cwd: string): { pid?: number; error?: string } {\n\tif (!jitiCliPath) {\n\t\treturn { error: \"upstream jiti for TypeScript execution could not be found; ensure package dependencies are installed\" };\n\t}\n\n\ttry {\n\t\tconst cwdStats = fs.statSync(cwd);\n\t\tif (!cwdStats.isDirectory()) {\n\t\t\treturn { error: `cwd is not a directory: ${cwd}` };\n\t\t}\n\t} catch {\n\t\treturn { error: `cwd does not exist: ${cwd}` };\n\t}\n\n\tfs.mkdirSync(TEMP_ROOT_DIR, { recursive: true });\n\tconst cfgPath = getAsyncConfigPath(suffix);\n\tfs.writeFileSync(cfgPath, JSON.stringify(cfg));\n\t// lunr: bake-in ships compiled .js only; use the .ts when present (upstream dev), else the .js sibling.\n\tconst runnerTsPath = path.join(path.dirname(fileURLToPath(import.meta.url)), \"subagent-runner.ts\");\n\tconst runner = fs.existsSync(runnerTsPath) ? runnerTsPath : runnerTsPath.replace(/\\.ts$/, \".js\");\n\tconst nodeCommand = resolveAsyncRunnerNodeCommand();\n\tconst startupPath = typeof (cfg as { revivalLease?: unknown; asyncDir?: unknown }).revivalLease === \"object\"\n\t\t&& typeof (cfg as { asyncDir?: unknown }).asyncDir === \"string\"\n\t\t? path.join((cfg as { asyncDir: string }).asyncDir, \"runner-startup.json\")\n\t\t: undefined;\n\tconst startupAckPath = startupPath ? path.join(path.dirname(startupPath), \"runner-startup-ack.json\") : undefined;\n\tconst startupProceedPath = startupPath ? path.join(path.dirname(startupPath), \"runner-startup-proceed.json\") : undefined;\n\tif (startupPath) fs.rmSync(startupPath, { force: true });\n\tif (startupAckPath) fs.rmSync(startupAckPath, { force: true });\n\tif (startupProceedPath) fs.rmSync(startupProceedPath, { force: true });\n\n\tconst logPaths = resolveAsyncRunnerLogPaths(cfg);\n\tlet stdoutFd: number | undefined;\n\tlet stderrFd: number | undefined;\n\ttry {\n\t\tif (logPaths) {\n\t\t\tfs.mkdirSync(path.dirname(logPaths.stdoutPath), { recursive: true });\n\t\t\tstdoutFd = fs.openSync(logPaths.stdoutPath, \"a\");\n\t\t\tstderrFd = fs.openSync(logPaths.stderrPath, \"a\");\n\t\t}\n\t\tconst proc = spawn(nodeCommand, [jitiCliPath, runner, cfgPath], {\n\t\t\tcwd,\n\t\t\tdetached: true,\n\t\t\tstdio: [\"ignore\", stdoutFd ?? \"ignore\", stderrFd ?? \"ignore\"],\n\t\t\twindowsHide: true,\n\t\t\tenv: {\n\t\t\t\t...process.env,\n\t\t\t\t...(piPackageRoot ? { [PI_CODING_AGENT_PACKAGE_ROOT_ENV]: piPackageRoot } : {}),\n\t\t\t},\n\t\t});\n\t\tcloseFd(stdoutFd);\n\t\tcloseFd(stderrFd);\n\t\tproc.on(\"error\", (error) => {\n\t\t\tconsole.error(`[pi-subagents] async spawn failed: ${error.message}`);\n\t\t});\n\t\tif (typeof proc.pid !== \"number\") {\n\t\t\treturn { error: `async runner did not produce a pid for cwd: ${cwd}` };\n\t\t}\n\t\tproc.unref();\n\t\tif (startupPath && startupAckPath && startupProceedPath) {\n\t\t\tconst ready = waitForRunnerStartup(startupPath, \"ready\", RUNNER_STARTUP_TIMEOUT_MS);\n\t\t\tif (!ready.ok) {\n\t\t\t\tterminateRunnerBeforeProceed(proc.pid);\n\t\t\t\treturn { error: ready.error };\n\t\t\t}\n\t\t\ttry {\n\t\t\t\twriteRunnerStartupControl(startupAckPath, { action: \"ack\", token: ready.token });\n\t\t\t} catch (error) {\n\t\t\t\tterminateRunnerBeforeProceed(proc.pid);\n\t\t\t\treturn { error: `Failed to acknowledge async runner startup: ${error instanceof Error ? error.message : String(error)}` };\n\t\t\t}\n\t\t\tconst acknowledged = waitForRunnerStartup(startupPath, \"acknowledged\", RUNNER_STARTUP_TIMEOUT_MS, ready.token);\n\t\t\tif (!acknowledged.ok) {\n\t\t\t\tterminateRunnerBeforeProceed(proc.pid);\n\t\t\t\treturn { error: acknowledged.error };\n\t\t\t}\n\t\t\ttry {\n\t\t\t\twriteRunnerStartupControl(startupProceedPath, { action: \"proceed\", token: ready.token });\n\t\t\t} catch (error) {\n\t\t\t\tterminateRunnerBeforeProceed(proc.pid);\n\t\t\t\treturn { error: `Failed to authorize async runner startup: ${error instanceof Error ? error.message : String(error)}` };\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tfs.rmSync(startupPath, { force: true });\n\t\t\t} catch {\n\t\t\t\t// Proceed is the commit point; handshake cleanup cannot turn a running revival into a start error.\n\t\t\t}\n\t\t}\n\t\treturn { pid: proc.pid };\n\t} catch (error) {\n\t\tcloseFd(stdoutFd);\n\t\tcloseFd(stderrFd);\n\t\treturn { error: error instanceof Error ? error.message : String(error) };\n\t}\n}\n\nfunction formatAsyncStartError(mode: SubagentRunMode, message: string): AsyncExecutionResult {\n\treturn {\n\t\tcontent: [{ type: \"text\", text: message }],\n\t\tisError: true,\n\t\tdetails: { mode, results: [] },\n\t};\n}\n\nconst UNAVAILABLE_SUBAGENT_SKILL_ERROR = \"Skills not found: pi-subagents\";\n\nclass UnavailableSubagentSkillError extends Error {}\nclass AsyncStartValidationError extends Error {}\n\nfunction childDescription(step: Pick<SequentialStep, \"description\" | \"label\" | \"agent\">): string {\n\treturn step.description || step.label || step.agent || \"child\";\n}\n\nexport function buildAsyncRunnerSteps(id: string, params: AsyncRunnerStepBuildParams): AsyncRunnerStepBuildResult {\n\tconst {\n\t\tchain,\n\t\tctx,\n\t\tcwd,\n\t\tsessionFilesByFlatIndex,\n\t\tthinkingOverridesByFlatIndex,\n\t\tmaxSubagentDepth,\n\t\tworktreeBaseDir,\n\t\tasyncDir,\n\t} = params;\n\tconst outputBaseDir = params.outputBaseDir;\n\tconst resultMode = params.resultMode ?? \"chain\";\n\tconst chainSkills = params.chainSkills ?? [];\n\tconst availableModels = params.availableModels;\n\tconst runnerCwd = resolveChildCwd(ctx.cwd, cwd);\n\tconst progressDir = params.progressDir ?? runnerCwd;\n\tconst graphChain: ChainStep[] = params.attachRoot\n\t\t? [{\n\t\t\t\tagent: params.attachRoot.agent,\n\t\t\t\ttask: `Attach async root ${params.attachRoot.runId}`,\n\t\t\t\tlabel: params.attachRoot.label ?? `Attached root ${params.attachRoot.runId}`,\n\t\t\t\t...(params.attachRoot.outputName ? { as: params.attachRoot.outputName } : {}),\n\t\t\t}, ...chain]\n\t\t: chain;\n\tconst firstStep = chain[0];\n\tconst originalTask = params.task ?? (firstStep\n\t\t? (isParallelStep(firstStep)\n\t\t\t? firstStep.parallel[0]?.task\n\t\t\t: isDynamicParallelStep(firstStep)\n\t\t\t\t? firstStep.parallel.task\n\t\t\t\t: (firstStep as SequentialStep).task)\n\t\t: undefined);\n\ttry {\n\t\tif (params.validateOutputBindings !== false) {\n\t\t\tvalidateChainOutputBindings(chain, { maxItems: params.dynamicFanoutMaxItems });\n\t\t}\n\t} catch (error) {\n\t\tif (error instanceof ChainOutputValidationError) return { error: error.message };\n\t\tthrow error;\n\t}\n\tconst workflowGraph = buildWorkflowGraphSnapshot({ runId: id, mode: resultMode, steps: graphChain });\n\n\tlet progressInstructionCreated = false;\n\tconst buildStepOverrides = (s: SequentialStep): StepOverrides => {\n\t\tconst stepSkillInput = normalizeSkillInput(s.skill);\n\t\treturn {\n\t\t\t...(s.output !== undefined ? { output: s.output } : {}),\n\t\t\t...(s.outputMode !== undefined ? { outputMode: s.outputMode } : {}),\n\t\t\t...(s.reads !== undefined ? { reads: s.reads } : {}),\n\t\t\t...(s.progress !== undefined ? { progress: s.progress } : {}),\n\t\t\t...(stepSkillInput !== undefined ? { skills: stepSkillInput } : {}),\n\t\t\t...(s.model !== undefined ? { model: s.model } : {}),\n\t\t};\n\t};\n\tconst buildSeqStep = (s: SequentialStep, sessionFile?: string, behaviorCwd?: string, progressPrecreated = false, resolvedBehavior?: ResolvedStepBehavior, flatIndex?: number, parallelOutputNamespace?: { stepIndex: number; taskIndex?: number }) => {\n\t\tconst childIndex = flatIndex ?? parallelOutputNamespace?.stepIndex ?? 0;\n\t\tconst spec = normalizeChildSpec(s, {\n\t\t\tparentMode: snapshotParentPermissionMode(ctx.parentSessionId ?? ctx.currentSessionId),\n\t\t\trunId: params.childIdRunId ?? id,\n\t\t\tindex: childIndex,\n\t\t\tchildId: s.childId ?? (s.agent?.trim() ? s.agent : undefined),\n\t\t\tdefaultTask: \"{previous}\",\n\t\t\tfanoutAuthorized: false,\n\t\t});\n\t\tconst toolBudgetInput = spec.toolBudget ?? params.toolBudget ?? params.configToolBudget;\n\t\tconst resolvedToolBudget = validateToolBudgetConfig(toolBudgetInput, spec.toolBudget ? \"toolBudget\" : \"config.toolBudget\");\n\t\tif (resolvedToolBudget.error) throw new AsyncStartValidationError(resolvedToolBudget.error);\n\t\tconst stepCwd = resolveChildCwd(runnerCwd, s.cwd);\n\t\tconst instructionCwd = behaviorCwd ?? stepCwd;\n\t\tlet behavior = suppressProgressForReadOnlyTask(resolvedBehavior ?? resolveStepBehavior(buildStepOverrides(s), chainSkills), s.task, originalTask);\n\t\tconst inheritedRelativeParallelOutput = parallelOutputNamespace && s.output === undefined && typeof behavior.output === \"string\" && !path.isAbsolute(behavior.output);\n\t\tif (inheritedRelativeParallelOutput && parallelOutputNamespace.taskIndex !== undefined) {\n\t\t\tbehavior = {\n\t\t\t\t...behavior,\n\t\t\t\toutput: path.join(`parallel-${parallelOutputNamespace.stepIndex}`, String(parallelOutputNamespace.taskIndex), behavior.output),\n\t\t\t};\n\t\t}\n\t\tconst namespaceOutputPath = Boolean(inheritedRelativeParallelOutput && parallelOutputNamespace.taskIndex === undefined);\n\t\tconst skillNames = behavior.skills === false ? [] : behavior.skills;\n\t\tconst { resolved: resolvedSkills, missing: missingSkills } = resolveSkillsWithFallback(\n\t\t\tskillNames,\n\t\t\tstepCwd,\n\t\t\tctx.cwd,\n\t\t\tundefined,\n\t\t\tstepCwd,\n\t\t);\n\t\tif (missingSkills.includes(\"pi-subagents\")) throw new UnavailableSubagentSkillError(UNAVAILABLE_SUBAGENT_SKILL_ERROR);\n\n\t\tlet systemPrompt = \"\";\n\t\tif (resolvedSkills.length > 0) {\n\t\t\tconst injection = buildSkillInjection(resolvedSkills);\n\t\t\tsystemPrompt = systemPrompt ? `${systemPrompt}\\n\\n${injection}` : injection;\n\t\t}\n\t\tconst readInstructions = buildChainInstructions({ ...behavior, output: false, progress: false }, instructionCwd, false);\n\t\tconst isFirstProgressAgent = behavior.progress && !progressPrecreated && !progressInstructionCreated;\n\t\tif (behavior.progress) progressInstructionCreated = true;\n\t\tconst progressInstructions = buildChainInstructions({ ...behavior, output: false, reads: false }, progressDir, isFirstProgressAgent);\n\t\tconst outputPath = resolveSingleOutputPath(behavior.output, ctx.cwd, instructionCwd, outputBaseDir);\n\t\tif (!namespaceOutputPath) systemPrompt = injectOutputPathSystemPrompt(systemPrompt, outputPath, {\n\t\t\ttools: spec.effectivePermissions === \"read-only\" ? [\"read\", \"grep\", \"find\", \"ls\", \"bash\"] : undefined,\n\t\t});\n\t\tconst validationError = validateFileOnlyOutputMode(behavior.outputMode, outputPath, `Async step (${spec.description})`);\n\t\tif (validationError) throw new AsyncStartValidationError(validationError);\n\t\tlet taskTemplate = s.task ?? \"{previous}\";\n\t\ttaskTemplate = taskTemplate.replace(/\\{task\\}/g, originalTask ?? \"\");\n\t\ttaskTemplate = taskTemplate.replace(/\\{chain_dir\\}/g, runnerCwd);\n\t\tconst taskText = `${readInstructions.prefix}${taskTemplate}${progressInstructions.suffix}`;\n\t\tconst task = namespaceOutputPath ? taskText : injectSingleOutputInstruction(taskText, outputPath, {\n\t\t\ttools: spec.effectivePermissions === \"read-only\" ? [\"read\", \"grep\", \"find\", \"ls\", \"bash\"] : undefined,\n\t\t});\n\n\t\tconst primaryModel = resolveEffectiveSubagentModel(\n\t\t\tspec.model,\n\t\t\tundefined,\n\t\t\tctx.currentModel,\n\t\t\tavailableModels,\n\t\t\tctx.currentModelProvider,\n\t\t\t{ scope: ctx.modelScope },\n\t\t);\n\t\tconst thinkingOverride = flatIndex === undefined ? undefined : thinkingOverridesByFlatIndex?.[flatIndex];\n\t\tconst effectiveThinking = thinkingOverride;\n\t\tconst model = applyThinkingSuffix(primaryModel, effectiveThinking, thinkingOverride !== undefined);\n\t\treturn {\n\t\t\tparentSessionId: ctx.parentSessionId ?? ctx.currentSessionId,\n\t\t\tparentPermissionMode: snapshotParentPermissionMode(ctx.parentSessionId ?? ctx.currentSessionId),\n\t\t\tchildId: spec.childId,\n\t\t\tdescription: spec.description,\n\t\t\tpermissions: spec.effectivePermissions,\n\t\t\tagent: spec.description,\n\t\t\ttask,\n\t\t\tphase: s.phase,\n\t\t\tlabel: s.label,\n\t\t\toutputName: s.as,\n\t\t\tstructured: Boolean(s.outputSchema),\n\t\t\tcwd: stepCwd,\n\t\t\tmodel,\n\t\t\tthinking: resolveEffectiveThinking(model, effectiveThinking),\n\t\t\tmodelCandidates: buildModelCandidates(primaryModel, undefined, availableModels, ctx.currentModelProvider, { scope: ctx.modelScope }).map((candidate) =>\n\t\t\t\tapplyThinkingSuffix(candidate, effectiveThinking, thinkingOverride !== undefined),\n\t\t\t),\n\t\t\tsystemPrompt,\n\t\t\tsystemPromptMode: \"append\",\n\t\t\tinheritProjectContext: true,\n\t\t\tinheritSkills: false,\n\t\t\tskills: resolvedSkills.map((r) => r.name),\n\t\t\toutputPath,\n\t\t\t...(namespaceOutputPath ? { namespaceOutputPath: true } : {}),\n\t\t\toutputMode: behavior.outputMode,\n\t\t\tsessionFile,\n\t\t\tmaxSubagentDepth,\n\t\t\twaitToolEnabled: params.waitToolEnabled,\n\t\t\teffectiveAcceptance: resolveEffectiveAcceptance({\n\t\t\t\texplicit: s.acceptance,\n\t\t\t\tagentName: spec.description,\n\t\t\t\tpermissions: spec.effectivePermissions,\n\t\t\t\ttask,\n\t\t\t\tmode: resultMode,\n\t\t\t\tasync: true,\n\t\t\t\tdynamic: false,\n\t\t\t}),\n\t\t\tacceptanceInput: s.acceptance,\n\t\t\tacceptanceRole: spec.effectivePermissions === \"read-only\" ? \"read-only\" : \"writer\",\n\t\t\t...(s.outputSchema ? { structuredOutputSchema: s.outputSchema } : {}),\n\t\t\t...(s.outputSchema ? { structuredOutput: createStructuredOutputRuntime(s.outputSchema, path.join(asyncDir, \"structured-output\")) } : {}),\n\t\t\t...(resolvedToolBudget.budget ? { toolBudget: resolvedToolBudget.budget } : {}),\n\t\t};\n\t};\n\n\tlet flatStepIndex = 0;\n\tconst nextFlatStep = (): { index: number; sessionFile?: string; thinkingOverride?: string | false } => {\n\t\tconst index = flatStepIndex;\n\t\tconst sessionFile = sessionFilesByFlatIndex?.[flatStepIndex];\n\t\tconst thinkingOverride = thinkingOverridesByFlatIndex?.[flatStepIndex];\n\t\tflatStepIndex++;\n\t\treturn {\n\t\t\tindex,\n\t\t\t...(sessionFile ? { sessionFile } : {}),\n\t\t\t...(thinkingOverride ? { thinkingOverride } : {}),\n\t\t};\n\t};\n\n\ttry {\n\t\tconst builtSteps = chain.map((s, stepIndex) => {\n\t\t\tif (isParallelStep(s)) {\n\t\t\t\tconst parallelBehaviors = s.parallel.map((task) => {\n\t\t\t\t\treturn suppressProgressForReadOnlyTask(resolveStepBehavior(buildStepOverrides(task), chainSkills), task.task, originalTask);\n\t\t\t\t});\n\t\t\t\tconst progressPrecreated = parallelBehaviors.some((behavior) => behavior.progress);\n\t\t\t\tif (progressPrecreated) {\n\t\t\t\t\tif (!s.worktree || params.progressDir) writeInitialProgressFile(progressDir);\n\t\t\t\t\tprogressInstructionCreated = true;\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tparallel: s.parallel.map((t, taskIndex) => {\n\t\t\t\t\t\tlet behaviorCwd: string | undefined;\n\t\t\t\t\t\tif (s.worktree) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tbehaviorCwd = resolveExpectedWorktreeAgentCwd(runnerCwd, `${id}-s${stepIndex}`, taskIndex, worktreeBaseDir);\n\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\tbehaviorCwd = undefined;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst staticStep = nextFlatStep();\n\t\t\t\t\t\treturn buildSeqStep(t, staticStep.sessionFile, behaviorCwd, progressPrecreated, parallelBehaviors[taskIndex], staticStep.index, { stepIndex, taskIndex });\n\t\t\t\t\t}),\n\t\t\t\t\tconcurrency: s.concurrency,\n\t\t\t\t\tfailFast: s.failFast,\n\t\t\t\t\tworktree: s.worktree,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (isDynamicParallelStep(s)) {\n\t\t\t\tconst behavior = suppressProgressForReadOnlyTask(resolveStepBehavior(buildStepOverrides(s.parallel), chainSkills), s.parallel.task, originalTask);\n\t\t\t\tconst progressPrecreated = behavior.progress;\n\t\t\t\tif (progressPrecreated) {\n\t\t\t\t\twriteInitialProgressFile(progressDir);\n\t\t\t\t\tprogressInstructionCreated = true;\n\t\t\t\t}\n\t\t\t\tconst maxItems = s.expand.maxItems ?? params.dynamicFanoutMaxItems ?? 0;\n\t\t\t\tconst dynamicFlatSteps = Array.from({ length: maxItems }, () => nextFlatStep());\n\t\t\t\tconst parallel = buildSeqStep(s.parallel as SequentialStep, undefined, undefined, progressPrecreated, behavior, undefined, { stepIndex });\n\t\t\t\treturn {\n\t\t\t\t\texpand: s.expand,\n\t\t\t\t\tparallel,\n\t\t\t\t\tcollect: s.collect,\n\t\t\t\t\tconcurrency: s.concurrency,\n\t\t\t\t\tfailFast: s.failFast,\n\t\t\t\t\tphase: s.phase,\n\t\t\t\t\tlabel: s.label,\n\t\t\t\t\tsessionFiles: dynamicFlatSteps.map((step) => step.sessionFile),\n\t\t\t\t\tthinkingOverrides: dynamicFlatSteps.map((step) => step.thinkingOverride),\n\t\t\t\t\teffectiveAcceptance: resolveEffectiveAcceptance({\n\t\t\t\t\t\texplicit: s.acceptance,\n\t\t\t\t\t\tagentName: s.parallel.description,\n\t\t\t\t\t\tpermissions: s.parallel.permissions === \"read-only\" ? \"read-only\" : \"full\",\n\t\t\t\t\t\ttask: parallel.task,\n\t\t\t\t\t\tmode: resultMode,\n\t\t\t\t\t\tasync: true,\n\t\t\t\t\t\tdynamicGroup: true,\n\t\t\t\t\t}),\n\t\t\t\t\tacceptanceInput: s.acceptance,\n\t\t\t\t\tacceptanceRole: s.parallel.permissions === \"read-only\" ? \"read-only\" : \"writer\",\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst staticStep = nextFlatStep();\n\t\t\treturn buildSeqStep(s as SequentialStep, staticStep.sessionFile, undefined, false, undefined, staticStep.index);\n\t\t});\n\t\tconst steps = params.attachRoot\n\t\t\t? [{\n\t\t\t\t\tagent: params.attachRoot.agent,\n\t\t\t\t\ttask: \"\",\n\t\t\t\t\tlabel: params.attachRoot.label ?? `Attached root ${params.attachRoot.runId}`,\n\t\t\t\t\toutputName: params.attachRoot.outputName,\n\t\t\t\t\timportAsyncRoot: {\n\t\t\t\t\t\trunId: params.attachRoot.runId,\n\t\t\t\t\t\tasyncDir: params.attachRoot.asyncDir,\n\t\t\t\t\t\tresultPath: params.attachRoot.resultPath,\n\t\t\t\t\t\tindex: params.attachRoot.index,\n\t\t\t\t\t},\n\t\t\t\t\tinheritProjectContext: false,\n\t\t\t\t\tinheritSkills: false,\n\t\t\t\t}, ...builtSteps]\n\t\t\t: builtSteps;\n\t\tfor (const step of steps) {\n\t\t\tif (!(\"parallel\" in step) || !Array.isArray(step.parallel)) continue;\n\t\t\tconst seen = new Map<string, { index: number; agent: string }>();\n\t\t\tfor (let index = 0; index < step.parallel.length; index++) {\n\t\t\t\tconst task = step.parallel[index]!;\n\t\t\t\tif (!task.outputPath) continue;\n\t\t\t\tconst previous = seen.get(task.outputPath);\n\t\t\t\tif (previous) {\n\t\t\t\t\tthrow new AsyncStartValidationError(`Parallel tasks ${previous.index + 1} (${previous.agent}) and ${index + 1} (${task.agent}) resolve output to the same path: ${task.outputPath}. Use distinct output paths.`);\n\t\t\t\t}\n\t\t\t\tseen.set(task.outputPath, { index, agent: task.agent });\n\t\t\t}\n\t\t}\n\t\treturn { steps, runnerCwd, workflowGraph, eventChain: graphChain, ...(originalTask !== undefined ? { originalTask } : {}) };\n\t} catch (error) {\n\t\tif (error instanceof UnavailableSubagentSkillError || error instanceof AsyncStartValidationError) return { error: error.message };\n\t\tthrow error;\n\t}\n}\n\n/**\n * Execute a chain asynchronously\n */\nexport function executeAsyncChain(\n\tid: string,\n\tparams: AsyncChainParams,\n): AsyncExecutionResult {\n\tconst {\n\t\tchain,\n\t\tctx,\n\t\tcwd,\n\t\tmaxOutput,\n\t\tartifactsDir,\n\t\tartifactConfig,\n\t\tshareEnabled,\n\t\tsessionRoot,\n\t\tsessionFilesByFlatIndex,\n\t\tthinkingOverridesByFlatIndex,\n\t\tmaxSubagentDepth,\n\t\tworktreeSetupHook,\n\t\tworktreeSetupHookTimeoutMs,\n\t\tworktreeBaseDir,\n\t\tcontrolConfig,\n\t\tcontrolIntercomTarget,\n\t\tchildIntercomTarget,\n\t\tnestedRoute,\n\t} = params;\n\tconst resultMode = params.resultMode ?? \"chain\";\n\tconst inheritedNestedRoute = resolveInheritedNestedRouteFromEnv();\n\tconst nestedAddress = inheritedNestedRoute ? resolveNestedParentAddressFromEnv() : undefined;\n\tconst asyncDir = inheritedNestedRoute\n\t\t? path.join(TEMP_ROOT_DIR, \"nested-subagent-runs\", inheritedNestedRoute.rootRunId, id)\n\t\t: path.join(ASYNC_DIR, id);\n\ttry {\n\t\tfs.mkdirSync(asyncDir, { recursive: true });\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\treturn {\n\t\t\tcontent: [{ type: \"text\", text: `Failed to create async run directory '${asyncDir}': ${message}` }],\n\t\t\tisError: true,\n\t\t\tdetails: { mode: resultMode, results: [] },\n\t\t};\n\t}\n\n\tconst built = buildAsyncRunnerSteps(id, {\n\t\tchain,\n\t\ttask: params.task,\n\t\tattachRoot: params.attachRoot,\n\t\tresultMode,\n\t\tctx,\n\t\tavailableModels: params.availableModels,\n\t\tcwd,\n\t\tchainSkills: params.chainSkills,\n\t\tsessionFilesByFlatIndex,\n\t\tthinkingOverridesByFlatIndex,\n\t\tprogressDir: params.progressDir ?? (artifactsDir ? path.join(artifactsDir, \"progress\", id) : resultMode === \"parallel\" ? path.join(asyncDir, \"progress\") : undefined),\n\t\toutputBaseDir: artifactsDir ? path.join(artifactsDir, \"outputs\", id) : undefined,\n\t\tdynamicFanoutMaxItems: params.dynamicFanoutMaxItems,\n\t\tmaxSubagentDepth,\n\t\twaitToolEnabled: params.waitToolEnabled,\n\t\tworktreeBaseDir,\n\t\tasyncDir,\n\t\ttoolBudget: params.toolBudget,\n\t\tconfigToolBudget: params.configToolBudget,\n\t});\n\tif (\"error\" in built) {\n\t\ttry {\n\t\t\tfs.rmSync(asyncDir, { recursive: true, force: true });\n\t\t} catch {\n\t\t\t// Best-effort cleanup for validation failures before the runner is spawned.\n\t\t}\n\t\treturn formatAsyncStartError(resultMode, built.error);\n\t}\n\tconst { steps, runnerCwd, workflowGraph, eventChain } = built;\n\tconst deadlineAt = params.timeoutMs !== undefined ? Date.now() + params.timeoutMs : undefined;\n\tconst initialTurnBudget = params.turnBudget ? initialTurnBudgetState(params.turnBudget) : undefined;\n\tlet childTargetIndex = 0;\n\tconst childIntercomTargets = childIntercomTarget ? steps.flatMap((step) => {\n\t\tif (!(\"parallel\" in step) && step.importAsyncRoot) {\n\t\t\tchildTargetIndex++;\n\t\t\treturn [undefined];\n\t\t}\n\t\tif (\"parallel\" in step) {\n\t\t\tif (!Array.isArray(step.parallel)) {\n\t\t\t\tchildTargetIndex++;\n\t\t\t\treturn [undefined];\n\t\t\t}\n\t\t\treturn step.parallel.map((task) => childIntercomTarget(task.childId ?? task.agent, childTargetIndex++));\n\t\t}\n\t\treturn [childIntercomTarget(step.childId ?? step.agent, childTargetIndex++)];\n\t}) : undefined;\n\n\tlet spawnResult: { pid?: number; error?: string } = {};\n\ttry {\n\t\tspawnResult = spawnRunner(\n\t\t\t{\n\t\t\t\tid,\n\t\t\t\tsteps,\n\t\t\t\tresultPath: inheritedNestedRoute ? nestedResultsPath(inheritedNestedRoute.rootRunId, id) : path.join(RESULTS_DIR, `${id}.json`),\n\t\t\t\tcwd: runnerCwd,\n\t\t\t\tplaceholder: \"{previous}\",\n\t\t\t\tmaxOutput,\n\t\t\t\tartifactsDir: artifactConfig.enabled ? artifactsDir : undefined,\n\t\t\t\tartifactConfig,\n\t\t\t\tshare: shareEnabled,\n\t\t\t\tsessionDir: sessionRoot ? path.join(sessionRoot, `async-${id}`) : undefined,\n\t\t\t\tasyncDir,\n\t\t\t\tsessionId: ctx.currentSessionId,\n\t\t\t\tpiPackageRoot,\n\t\t\t\tpiArgv1: process.argv[1],\n\t\t\t\tworktreeSetupHook,\n\t\t\t\tworktreeSetupHookTimeoutMs,\n\t\t\t\tworktreeBaseDir,\n\t\t\t\tcontrolConfig,\n\t\t\t\tturnBudget: params.turnBudget,\n\t\t\t\ttoolBudget: params.toolBudget,\n\t\t\t\tcontrolIntercomTarget,\n\t\t\t\tchildIntercomTargets,\n\t\t\t\tresultMode,\n\t\t\t\tdynamicFanoutMaxItems: params.dynamicFanoutMaxItems,\n\t\t\t\ttimeoutMs: params.timeoutMs,\n\t\t\t\tdeadlineAt,\n\t\t\t\tglobalConcurrencyLimit: params.globalConcurrencyLimit,\n\t\t\t\tworkflowGraph,\n\t\t\t\tnestedRoute: nestedRoute ?? inheritedNestedRoute,\n\t\t\t\tnestedSelf: inheritedNestedRoute && nestedAddress ? {\n\t\t\t\t\tparentRunId: nestedAddress.parentRunId,\n\t\t\t\t\tparentStepIndex: nestedAddress.parentStepIndex,\n\t\t\t\t\tdepth: nestedAddress.depth,\n\t\t\t\t\tpath: nestedAddress.path,\n\t\t\t\t} : undefined,\n\t\t\t},\n\t\t\tid,\n\t\t\trunnerCwd,\n\t\t);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\treturn formatAsyncStartError(resultMode, `Failed to start async ${resultMode} '${id}': ${message}`);\n\t}\n\n\tif (spawnResult.error) {\n\t\treturn formatAsyncStartError(resultMode, `Failed to start async ${resultMode} '${id}': ${spawnResult.error}`);\n\t}\n\n\tif (spawnResult.pid) {\n\t\tconst eventFirstStep = eventChain[0];\n\t\tconst firstAgents = isParallelStep(eventFirstStep)\n\t\t\t? eventFirstStep.parallel.map(childDescription)\n\t\t\t: isDynamicParallelStep(eventFirstStep)\n\t\t\t\t? [childDescription(eventFirstStep.parallel)]\n\t\t\t: [childDescription(eventFirstStep as SequentialStep)];\n\t\tconst firstTask = isParallelStep(eventFirstStep)\n\t\t\t? eventFirstStep.parallel[0]?.task\n\t\t\t: isDynamicParallelStep(eventFirstStep)\n\t\t\t\t? eventFirstStep.parallel.task\n\t\t\t\t: (eventFirstStep as SequentialStep).task;\n\t\tconst workflowGoal = params.goal ?? (params.task?.trim() || firstTask);\n\t\tconst parallelGroups: Array<{ start: number; count: number; stepIndex: number }> = [];\n\t\tconst flatAgents: string[] = [];\n\t\tlet flatStepStart = 0;\n\t\tfor (let stepIndex = 0; stepIndex < eventChain.length; stepIndex++) {\n\t\t\tconst step = eventChain[stepIndex]!;\n\t\t\tif (isParallelStep(step)) {\n\t\t\t\tparallelGroups.push({ start: flatStepStart, count: step.parallel.length, stepIndex });\n\t\t\t\tflatAgents.push(...step.parallel.map(childDescription));\n\t\t\t\tflatStepStart += step.parallel.length;\n\t\t\t} else if (isDynamicParallelStep(step)) {\n\t\t\t\tparallelGroups.push({ start: flatStepStart, count: 1, stepIndex });\n\t\t\t\tflatAgents.push(childDescription(step.parallel));\n\t\t\t\tflatStepStart++;\n\t\t\t} else {\n\t\t\t\tflatAgents.push(childDescription(step as SequentialStep));\n\t\t\t\tflatStepStart++;\n\t\t\t}\n\t\t}\n\t\tif (inheritedNestedRoute && nestedAddress) {\n\t\t\tconst now = Date.now();\n\t\t\ttry {\n\t\t\t\twriteNestedEvent(inheritedNestedRoute, {\n\t\t\t\t\ttype: \"subagent.nested.started\",\n\t\t\t\t\tts: now,\n\t\t\t\t\tparentRunId: nestedAddress.parentRunId,\n\t\t\t\t\tparentStepIndex: nestedAddress.parentStepIndex,\n\t\t\t\t\tchild: {\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tparentRunId: nestedAddress.parentRunId,\n\t\t\t\t\t\tparentStepIndex: nestedAddress.parentStepIndex,\n\t\t\t\t\t\tdepth: nestedAddress.depth,\n\t\t\t\t\t\tpath: nestedAddress.path,\n\t\t\t\t\t\tasyncDir,\n\t\t\t\t\t\tpid: spawnResult.pid,\n\t\t\t\t\t\townerIntercomTarget: process.env.PI_SUBAGENT_INTERCOM_SESSION_NAME,\n\t\t\t\t\t\tleafIntercomTarget: childIntercomTargets?.[0],\n\t\t\t\t\t\tintercomTarget: childIntercomTargets?.[0],\n\t\t\t\t\t\townerState: \"live\",\n\t\t\t\t\t\tmode: resultMode,\n\t\t\t\t\t\tstate: \"running\",\n\t\t\t\t\t\tagent: firstAgents[0],\n\t\t\t\t\t\tagents: flatAgents,\n\t\t\t\t\t\tchainStepCount: eventChain.length,\n\t\t\t\t\t\tparallelGroups,\n\t\t\t\t\t\t...(params.timeoutMs !== undefined ? { timeoutMs: params.timeoutMs, deadlineAt } : {}),\n\t\t\t\t\t\t...(initialTurnBudget ? { turnBudget: initialTurnBudget } : {}),\n\t\t\t\t\t\tstartedAt: now,\n\t\t\t\t\t\tlastUpdate: now,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\"Failed to emit nested async start event:\", error);\n\t\t\t}\n\t\t}\n\t\tctx.pi.events.emit(SUBAGENT_ASYNC_STARTED_EVENT, {\n\t\t\tlifecycleArtifactVersion: SUBAGENT_LIFECYCLE_ARTIFACT_VERSION,\n\t\t\tid,\n\t\t\tpid: spawnResult.pid,\n\t\t\tsessionId: ctx.currentSessionId,\n\t\t\tmode: resultMode,\n\t\t\tagent: firstAgents[0],\n\t\t\tagents: flatAgents,\n\t\t\ttask: firstTask?.slice(0, 50),\n\t\t\tgoal: workflowGoal?.slice(0, 120),\n\t\t\tchain: eventChain.map((s) =>\n\t\t\t\tisParallelStep(s) ? `[${s.parallel.map(childDescription).join(\"+\")}]` : isDynamicParallelStep(s) ? `expand:${childDescription(s.parallel)}` : childDescription(s as SequentialStep),\n\t\t\t),\n\t\t\tchainStepCount: eventChain.length,\n\t\t\tparallelGroups,\n\t\t\tworkflowGraph,\n\t\t\tcwd: runnerCwd,\n\t\t\tasyncDir,\n\t\t\t...(params.timeoutMs !== undefined ? { timeoutMs: params.timeoutMs, deadlineAt } : {}),\n\t\t\t...(initialTurnBudget ? { turnBudget: initialTurnBudget } : {}),\n\t\t\tnestedRoute,\n\t\t});\n\t}\n\n\tconst chainDesc = chain\n\t\t.map((s) =>\n\t\t\tisParallelStep(s) ? `[${s.parallel.map(childDescription).join(\"+\")}]` : isDynamicParallelStep(s) ? `expand:${childDescription(s.parallel)}` : childDescription(s as SequentialStep),\n\t\t)\n\t\t.join(\" -> \");\n\n\treturn {\n\t\tcontent: [{ type: \"text\", text: formatAsyncStartedMessage(`Async ${resultMode}: ${chainDesc} [${id}]`) }],\n\t\tdetails: { mode: resultMode, runId: id, results: [], asyncId: id, asyncDir, workflowGraph, ...(params.timeoutMs !== undefined ? { timeoutMs: params.timeoutMs, deadlineAt } : {}), ...(params.turnBudget ? { turnBudget: params.turnBudget } : {}), ...(params.toolBudget ? { toolBudget: params.toolBudget } : {}) },\n\t};\n}\n\n/**\n * Execute a single agent asynchronously\n */\nexport function executeAsyncSingle(\n\tid: string,\n\tparams: AsyncSingleParams,\n): AsyncExecutionResult {\n\tconst {\n\t\tspec,\n\t\tctx,\n\t\tcwd,\n\t\tmaxOutput,\n\t\tartifactsDir,\n\t\tartifactConfig,\n\t\tshareEnabled,\n\t\tsessionRoot,\n\t\tsessionFile,\n\t\tmaxSubagentDepth,\n\t\tworktreeSetupHook,\n\t\tworktreeSetupHookTimeoutMs,\n\t\tworktreeBaseDir,\n\t\tcontrolConfig,\n\t\tcontrolIntercomTarget,\n\t\tchildIntercomTarget,\n\t\tnestedRoute,\n\t} = params;\n\tconst agent = spec.description;\n\tconst task = spec.task;\n\tconst runnerCwd = resolveChildCwd(ctx.cwd, cwd);\n\tconst skillNames = params.skills ?? (spec.skill === false ? [] : normalizeSkillInput(spec.skill) ?? []);\n\tconst availableModels = params.availableModels;\n\tconst { resolved: resolvedSkills, missing: missingSkills } = resolveSkillsWithFallback(\n\t\tskillNames,\n\t\trunnerCwd,\n\t\tctx.cwd,\n\t\tundefined,\n\t\trunnerCwd,\n\t);\n\tif (missingSkills.includes(\"pi-subagents\")) return formatAsyncStartError(\"single\", UNAVAILABLE_SUBAGENT_SKILL_ERROR);\n\tlet systemPrompt = \"\";\n\tif (resolvedSkills.length > 0) {\n\t\tconst injection = buildSkillInjection(resolvedSkills);\n\t\tsystemPrompt = systemPrompt ? `${systemPrompt}\\n\\n${injection}` : injection;\n\t}\n\tconst inheritedNestedRoute = resolveInheritedNestedRouteFromEnv();\n\tconst nestedAddress = inheritedNestedRoute ? resolveNestedParentAddressFromEnv() : undefined;\n\tconst asyncDir = inheritedNestedRoute\n\t\t? path.join(TEMP_ROOT_DIR, \"nested-subagent-runs\", inheritedNestedRoute.rootRunId, id)\n\t\t: path.join(ASYNC_DIR, id);\n\ttry {\n\t\tfs.mkdirSync(asyncDir, { recursive: true });\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\treturn {\n\t\t\tcontent: [{ type: \"text\", text: `Failed to create async run directory '${asyncDir}': ${message}` }],\n\t\t\tisError: true,\n\t\t\tdetails: { mode: \"single\" as const, results: [] },\n\t\t};\n\t}\n\n\tconst effectiveOutput = normalizeSingleOutputOverride(params.output ?? spec.output, typeof spec.output === \"string\" ? spec.output : undefined);\n\tconst outputPath = resolveSingleOutputPath(effectiveOutput, ctx.cwd, runnerCwd, params.outputBaseDir ?? (artifactsDir ? path.join(artifactsDir, \"outputs\", id) : undefined));\n\tconst childToolShape = { tools: spec.effectivePermissions === \"read-only\" ? [\"read\", \"grep\", \"find\", \"ls\", \"bash\"] : undefined };\n\tsystemPrompt = injectOutputPathSystemPrompt(systemPrompt, outputPath, childToolShape);\n\tconst outputMode = params.outputMode ?? spec.outputMode ?? \"inline\";\n\tconst validationError = validateFileOnlyOutputMode(outputMode, outputPath, `Async single run (${agent})`);\n\tif (validationError) return formatAsyncStartError(\"single\", validationError);\n\tconst taskWithOutputInstruction = injectSingleOutputInstruction(task, outputPath, childToolShape);\n\tconst primaryModel = resolveSubagentModelOverride(\n\t\tparams.modelOverride ?? spec.model,\n\t\tctx.currentModel,\n\t\tavailableModels,\n\t\tctx.currentModelProvider,\n\t);\n\tconst effectiveThinking = params.thinkingOverride;\n\tconst model = applyThinkingSuffix(primaryModel, effectiveThinking, params.thinkingOverride !== undefined);\n\tconst toolBudgetInput = params.toolBudget ?? spec.toolBudget ?? params.configToolBudget;\n\tconst resolvedToolBudget = validateToolBudgetConfig(toolBudgetInput, params.toolBudget || spec.toolBudget ? \"toolBudget\" : \"config.toolBudget\");\n\tif (resolvedToolBudget.error) return formatAsyncStartError(\"single\", resolvedToolBudget.error);\n\tconst deadlineAt = params.absoluteDeadlineAt ?? (params.timeoutMs !== undefined ? Date.now() + params.timeoutMs : undefined);\n\tconst timeoutMs = params.absoluteDeadlineAt !== undefined && deadlineAt !== undefined\n\t\t? deadlineAt - Date.now()\n\t\t: params.timeoutMs;\n\tif (timeoutMs !== undefined && timeoutMs <= 0) return formatAsyncStartError(\"single\", \"The source run's absolute deadline expired before recovery could launch.\");\n\tconst initialTurnBudget = params.turnBudget ? initialTurnBudgetState(params.turnBudget) : undefined;\n\tconst resolvedSessionDir = params.sessionDir ?? (sessionRoot ? path.join(sessionRoot, `async-${id}`) : undefined);\n\tconst resolvedAcceptance = resolveEffectiveAcceptance({\n\t\texplicit: params.acceptance ?? spec.acceptance,\n\t\tagentName: agent,\n\t\tpermissions: spec.effectivePermissions,\n\t\ttask,\n\t\tmode: \"single\",\n\t\tasync: true,\n\t});\n\tconst recoveryDescriptor: SteeringRecoveryDescriptor = {\n\t\tversion: 3,\n\t\tlifecycleArtifactVersion: SUBAGENT_LIFECYCLE_ARTIFACT_VERSION,\n\t\tsourceRunId: id,\n\t\tchildId: spec.childId,\n\t\tdescription: spec.description,\n\t\tpermissions: spec.effectivePermissions,\n\t\tagent,\n\t\t...(sessionFile ? { sessionFile } : {}),\n\t\tcwd: runnerCwd,\n\t\t...(model ? { model } : {}),\n\t\t...(effectiveThinking ? { thinking: resolveEffectiveThinking(model, effectiveThinking) } : {}),\n\t\t...(resolvedSkills.length ? { skills: resolvedSkills.map((skill) => skill.name) } : {}),\n\t\t...(outputPath ? { outputPath } : {}),\n\t\toutputMode,\n\t\t...(resolvedAcceptance ? { acceptance: resolvedAcceptance } : {}),\n\t\t...(controlConfig ? { controlConfig } : {}),\n\t\t...(deadlineAt !== undefined ? { absoluteDeadlineAt: deadlineAt } : {}),\n\t\t...(params.turnBudget ? { initialTurnBudget: params.turnBudget } : {}),\n\t\t...(resolvedToolBudget.budget ? { initialToolBudget: resolvedToolBudget.budget } : {}),\n\t\tmaxSubagentDepth,\n\t\t...(maxOutput ? { maxOutput } : {}),\n\t\tshare: shareEnabled,\n\t\t...(resolvedSessionDir ? { sessionDir: resolvedSessionDir } : {}),\n\t\t...(artifactsDir ? { artifactsDir } : {}),\n\t\tartifactConfig,\n\t};\n\ttry {\n\t\twritePrivateAtomicJson(path.join(asyncDir, \"recovery-descriptor.json\"), recoveryDescriptor);\n\t} catch (error) {\n\t\treturn formatAsyncStartError(\"single\", `Failed to persist async recovery descriptor for '${id}': ${error instanceof Error ? error.message : String(error)}`);\n\t}\n\tlet spawnResult: { pid?: number; error?: string } = {};\n\ttry {\n\t\tspawnResult = spawnRunner(\n\t\t\t{\n\t\t\t\tid,\n\t\t\t\tsteps: [\n\t\t\t\t\t{\n\t\t\t\t\t\tparentSessionId: ctx.parentSessionId ?? ctx.currentSessionId,\n\t\t\t\t\t\tparentPermissionMode: snapshotParentPermissionMode(ctx.parentSessionId ?? ctx.currentSessionId),\n\t\t\t\t\t\tchildId: spec.childId,\n\t\t\t\t\t\tdescription: spec.description,\n\t\t\t\t\t\tpermissions: spec.effectivePermissions,\n\t\t\t\t\t\tagent,\n\t\t\t\t\t\ttask: taskWithOutputInstruction,\n\t\t\t\t\t\tcwd: runnerCwd,\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\tthinking: resolveEffectiveThinking(model, effectiveThinking),\n\t\t\t\t\t\tmodelCandidates: buildModelCandidates(primaryModel, undefined, availableModels, ctx.currentModelProvider, { scope: ctx.modelScope }).map((candidate) =>\n\t\t\t\t\t\t\tapplyThinkingSuffix(candidate, effectiveThinking, params.thinkingOverride !== undefined),\n\t\t\t\t\t\t),\n\t\t\t\t\t\tsystemPrompt,\n\t\t\t\t\t\tsystemPromptMode: \"append\",\n\t\t\t\t\t\tinheritProjectContext: true,\n\t\t\t\t\t\tinheritSkills: false,\n\t\t\t\t\t\tskills: resolvedSkills.map((r) => r.name),\n\t\t\t\t\t\toutputPath,\n\t\t\t\t\t\toutputMode,\n\t\t\t\t\t\tsessionFile,\n\t\t\t\t\t\tmaxSubagentDepth,\n\t\t\t\t\t\twaitToolEnabled: params.waitToolEnabled,\n\t\t\t\t\t\teffectiveAcceptance: resolvedAcceptance,\n\t\t\t\t\t\t...(resolvedToolBudget.budget ? { toolBudget: resolvedToolBudget.budget } : {}),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tresultPath: inheritedNestedRoute ? nestedResultsPath(inheritedNestedRoute.rootRunId, id) : path.join(RESULTS_DIR, `${id}.json`),\n\t\t\t\tcwd: runnerCwd,\n\t\t\t\tplaceholder: \"{previous}\",\n\t\t\t\tmaxOutput,\n\t\t\t\tartifactsDir: artifactConfig.enabled ? artifactsDir : undefined,\n\t\t\t\tartifactConfig,\n\t\t\t\tshare: shareEnabled,\n\t\t\t\tsessionDir: resolvedSessionDir,\n\t\t\t\tasyncDir,\n\t\t\t\tsessionId: ctx.currentSessionId,\n\t\t\t\tpiPackageRoot,\n\t\t\t\tpiArgv1: process.argv[1],\n\t\t\t\tworktreeSetupHook,\n\t\t\t\tworktreeSetupHookTimeoutMs,\n\t\t\t\tworktreeBaseDir,\n\t\t\t\tcontrolConfig,\n\t\t\t\ttimeoutMs,\n\t\t\t\tdeadlineAt,\n\t\t\t\tturnBudget: params.turnBudget,\n\t\t\t\ttoolBudget: params.toolBudget,\n\t\t\t\tcontrolIntercomTarget,\n\t\t\t\tchildIntercomTargets: childIntercomTarget ? [childIntercomTarget(spec.childId, 0)] : undefined,\n\t\t\t\tresultMode: \"single\",\n\t\t\t\t...(params.revivalLease ? { revivalLease: params.revivalLease } : {}),\n\t\t\t\tnestedRoute: nestedRoute ?? inheritedNestedRoute,\n\t\t\t\tnestedSelf: inheritedNestedRoute && nestedAddress ? {\n\t\t\t\t\tparentRunId: nestedAddress.parentRunId,\n\t\t\t\t\tparentStepIndex: nestedAddress.parentStepIndex,\n\t\t\t\t\tdepth: nestedAddress.depth,\n\t\t\t\t\tpath: nestedAddress.path,\n\t\t\t\t} : undefined,\n\t\t\t},\n\t\t\tid,\n\t\t\trunnerCwd,\n\t\t);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\treturn formatAsyncStartError(\"single\", `Failed to start async run '${id}': ${message}`);\n\t}\n\n\tif (spawnResult.error) {\n\t\treturn formatAsyncStartError(\"single\", `Failed to start async run '${id}': ${spawnResult.error}`);\n\t}\n\n\tif (spawnResult.pid) {\n\t\tif (inheritedNestedRoute && nestedAddress) {\n\t\t\tconst now = Date.now();\n\t\t\ttry {\n\t\t\t\twriteNestedEvent(inheritedNestedRoute, {\n\t\t\t\t\ttype: \"subagent.nested.started\",\n\t\t\t\t\tts: now,\n\t\t\t\t\tparentRunId: nestedAddress.parentRunId,\n\t\t\t\t\tparentStepIndex: nestedAddress.parentStepIndex,\n\t\t\t\t\tchild: {\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tparentRunId: nestedAddress.parentRunId,\n\t\t\t\t\t\tparentStepIndex: nestedAddress.parentStepIndex,\n\t\t\t\t\t\tdepth: nestedAddress.depth,\n\t\t\t\t\t\tpath: nestedAddress.path,\n\t\t\t\t\t\tasyncDir,\n\t\t\t\t\t\tpid: spawnResult.pid,\n\t\t\t\t\t\townerIntercomTarget: process.env.PI_SUBAGENT_INTERCOM_SESSION_NAME,\n\t\t\t\t\t\tleafIntercomTarget: childIntercomTarget?.(agent, 0),\n\t\t\t\t\t\tintercomTarget: childIntercomTarget?.(agent, 0),\n\t\t\t\t\t\townerState: \"live\",\n\t\t\t\t\t\tmode: \"single\",\n\t\t\t\t\t\tstate: \"running\",\n\t\t\t\t\t\tagent,\n\t\t\t\t\t\tagents: [agent],\n\t\t\t\t\t\tchainStepCount: 1,\n\t\t\t\t\t\t...(timeoutMs !== undefined ? { timeoutMs, deadlineAt } : {}),\n\t\t\t\t\t\t...(initialTurnBudget ? { turnBudget: initialTurnBudget } : {}),\n\t\t\t\t\t\tstartedAt: now,\n\t\t\t\t\t\tlastUpdate: now,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\"Failed to emit nested async start event:\", error);\n\t\t\t}\n\t\t}\n\t\tctx.pi.events.emit(SUBAGENT_ASYNC_STARTED_EVENT, {\n\t\t\tlifecycleArtifactVersion: SUBAGENT_LIFECYCLE_ARTIFACT_VERSION,\n\t\t\tid,\n\t\t\tpid: spawnResult.pid,\n\t\t\tsessionId: ctx.currentSessionId,\n\t\t\tmode: \"single\",\n\t\t\tagent,\n\t\t\ttask: task?.slice(0, 50),\n\t\t\tgoal: (params.goal ?? task).slice(0, 120),\n\t\t\tcwd: runnerCwd,\n\t\t\tasyncDir,\n\t\t\t...(timeoutMs !== undefined ? { timeoutMs, deadlineAt } : {}),\n\t\t\t...(initialTurnBudget ? { turnBudget: initialTurnBudget } : {}),\n\t\t\tnestedRoute,\n\t\t});\n\t}\n\n\treturn {\n\t\tcontent: [{ type: \"text\", text: formatAsyncStartedMessage(`Async: ${agent} [${id}]`) }],\n\t\tdetails: { mode: \"single\", runId: id, results: [], asyncId: id, asyncDir, ...(timeoutMs !== undefined ? { timeoutMs, deadlineAt } : {}), ...(params.turnBudget ? { turnBudget: params.turnBudget } : {}), ...(params.toolBudget ? { toolBudget: params.toolBudget } : {}) },\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"async-execution.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/background/async-execution.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * Async execution logic for subagent tool\n */\n\nimport { spawn } from \"node:child_process\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { createRequire } from \"node:module\";\nimport type { ExtensionAPI } from \"@ashx-j/lunr\";\nimport { normalizeChildSpec } from \"../../shared/child-spec.ts\";\nimport { writePrivateAtomicJson } from \"../../shared/atomic-json.ts\";\nimport { applyThinkingSuffix } from \"../shared/pi-args.ts\";\nimport { snapshotParentPermissionMode } from \"../../../../../core/subagent-permission-inherit.ts\";\nimport { injectOutputPathSystemPrompt, injectSingleOutputInstruction, normalizeSingleOutputOverride, resolveSingleOutputPath, validateFileOnlyOutputMode } from \"../shared/single-output.ts\";\nimport { buildChainInstructions, isDynamicParallelStep, isParallelStep, resolveStepBehavior, suppressProgressForReadOnlyTask, writeInitialProgressFile, type ChainStep, type ResolvedStepBehavior, type SequentialStep, type StepOverrides } from \"../../shared/settings.ts\";\nimport type { RunnerStep } from \"../shared/parallel-utils.ts\";\nimport { resolvePiPackageRoot } from \"../shared/pi-spawn.ts\";\nimport { buildSkillInjection, normalizeSkillInput, resolveSkillsWithFallback } from \"../../agents/skills.ts\";\nimport { PI_CODING_AGENT_PACKAGE_ROOT_ENV, resolveChildCwd } from \"../../shared/utils.ts\";\nimport { buildModelCandidates, resolveEffectiveSubagentModel, resolveModelCandidate, resolveSubagentModelOverride, resolveTierModelOverride, type AvailableModelInfo, type ParentModel } from \"../shared/model-fallback.ts\";\nimport type { ModelScopeConfig } from \"../shared/model-scope.ts\";\nimport { resolveEffectiveThinking } from \"../../shared/model-info.ts\";\nimport { resolveExpectedWorktreeAgentCwd } from \"../shared/worktree.ts\";\nimport { buildWorkflowGraphSnapshot } from \"../shared/workflow-graph.ts\";\nimport { ChainOutputValidationError, validateChainOutputBindings } from \"../shared/chain-outputs.ts\";\nimport { createStructuredOutputRuntime } from \"../shared/structured-output.ts\";\nimport { resolveEffectiveAcceptance } from \"../shared/acceptance.ts\";\nimport {\n\ttype AcceptanceInput,\n\ttype ArtifactConfig,\n\ttype ChildSpec,\n\ttype Details,\n\ttype MaxOutputConfig,\n\ttype NestedRouteInfo,\n\ttype ResolvedControlConfig,\n\ttype ResolvedTurnBudget,\n\ttype ResolvedToolBudget,\n\ttype SubagentRunMode,\n\ttype SteeringRecoveryDescriptor,\n\tASYNC_DIR,\n\tRESULTS_DIR,\n\tSUBAGENT_ASYNC_STARTED_EVENT,\n\tSUBAGENT_LIFECYCLE_ARTIFACT_VERSION,\n\tTEMP_ROOT_DIR,\n\tgetAsyncConfigPath,\n\tresolveChildMaxSubagentDepth,\n} from \"../../shared/types.ts\";\nimport { nestedResultsPath, resolveInheritedNestedRouteFromEnv, resolveNestedParentAddressFromEnv, writeNestedEvent } from \"../shared/nested-events.ts\";\nimport { initialTurnBudgetState } from \"../shared/turn-budget.ts\";\nimport { validateToolBudgetConfig } from \"../shared/tool-budget.ts\";\nimport type { ImportedAsyncRoot } from \"./chain-root-attachment.ts\";\nimport type { SessionLeaseRequest } from \"../shared/session-lease.ts\";\n\nconst require = createRequire(import.meta.url);\nconst piPackageRoot = resolvePiPackageRoot();\n\nfunction resolveJitiCliFromPackageJson(packageJsonPath: string): string | undefined {\n\tif (!fs.existsSync(packageJsonPath)) return undefined;\n\tconst packageRoot = path.dirname(packageJsonPath);\n\tconst pkg = JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\")) as {\n\t\tbin?: string | Record<string, string>;\n\t};\n\tconst binField = pkg.bin;\n\tconst binPath = typeof binField === \"string\"\n\t\t? binField\n\t\t: binField?.jiti ?? Object.values(binField ?? {})[0];\n\tconst candidates = [binPath, \"lib/jiti-cli.mjs\"].filter((candidate): candidate is string => Boolean(candidate));\n\tfor (const candidate of candidates) {\n\t\tconst cliPath = path.resolve(packageRoot, candidate);\n\t\tif (fs.existsSync(cliPath)) return cliPath;\n\t}\n\treturn undefined;\n}\n\nfunction resolveJitiCliPath(): string | undefined {\n\tconst candidates: Array<() => string | undefined> = [\n\t\t() => require.resolve(\"jiti/package.json\"),\n\t\t() => piPackageRoot\n\t\t\t? createRequire(path.join(piPackageRoot, \"package.json\")).resolve(\"jiti/package.json\")\n\t\t\t: undefined,\n\t\t() => {\n\t\t\tif (!process.argv[1]) return undefined;\n\t\t\tconst piEntry = fs.realpathSync(process.argv[1]);\n\t\t\treturn createRequire(piEntry).resolve(\"jiti/package.json\");\n\t\t},\n\t\t() => piPackageRoot ? path.join(piPackageRoot, \"node_modules\", \"jiti\", \"package.json\") : undefined,\n\t];\n\tfor (const candidate of candidates) {\n\t\ttry {\n\t\t\tconst packageJsonPath = candidate();\n\t\t\tif (!packageJsonPath) continue;\n\t\t\tconst cliPath = resolveJitiCliFromPackageJson(packageJsonPath);\n\t\t\tif (cliPath) return cliPath;\n\t\t} catch {\n\t\t\t// Candidate not available in this install, continue probing.\n\t\t}\n\t}\n\treturn undefined;\n}\n\nconst jitiCliPath = resolveJitiCliPath();\n\ninterface AsyncExecutionContext {\n\tpi: ExtensionAPI;\n\tcwd: string;\n\tcurrentSessionId: string;\n\t/** Parent session id used by permission-system ask forwarding. */\n\tparentSessionId?: string;\n\tcurrentModelProvider?: string;\n\tcurrentModel?: ParentModel;\n\t/** Optional model-scope enforcement resolved from subagent settings. */\n\tmodelScope?: ModelScopeConfig;\n}\n\ninterface AsyncChainParams {\n\tchain: ChainStep[];\n\ttask?: string;\n\t/** Raw caller-facing goal used only by the started event. */\n\tgoal?: string;\n\tattachRoot?: ImportedAsyncRoot & { agent: string; outputName?: string; label?: string };\n\tresultMode?: Exclude<SubagentRunMode, \"single\">;\n\tctx: AsyncExecutionContext;\n\tavailableModels?: AvailableModelInfo[];\n\tcwd?: string;\n\tmaxOutput?: MaxOutputConfig;\n\tartifactsDir?: string;\n\tartifactConfig: ArtifactConfig;\n\tshareEnabled: boolean;\n\tsessionRoot?: string;\n\tchainSkills?: string[];\n\tsessionFilesByFlatIndex?: (string | undefined)[];\n\tthinkingOverridesByFlatIndex?: (string | false | undefined)[];\n\tprogressDir?: string;\n\tdynamicFanoutMaxItems?: number;\n\tmaxSubagentDepth: number;\n\twaitToolEnabled?: boolean;\n\tworktreeSetupHook?: string;\n\tworktreeSetupHookTimeoutMs?: number;\n\tworktreeBaseDir?: string;\n\tcontrolConfig?: ResolvedControlConfig;\n\tcontrolIntercomTarget?: string;\n\tchildIntercomTarget?: (agent: string, index: number) => string | undefined;\n\tnestedRoute?: NestedRouteInfo;\n\tacceptance?: AcceptanceInput;\n\ttimeoutMs?: number;\n\tturnBudget?: ResolvedTurnBudget;\n\ttoolBudget?: ResolvedToolBudget;\n\tconfigToolBudget?: ResolvedToolBudget;\n\t/** Global cap on simultaneously-running subagent tasks within the async run. */\n\tglobalConcurrencyLimit?: number;\n}\n\ninterface AsyncSingleParams {\n\tspec: ChildSpec;\n\t/** Raw caller-facing goal used only by the started event. */\n\tgoal?: string;\n\tctx: AsyncExecutionContext;\n\tcwd?: string;\n\tmaxOutput?: MaxOutputConfig;\n\tartifactsDir?: string;\n\tartifactConfig: ArtifactConfig;\n\tshareEnabled: boolean;\n\tsessionRoot?: string;\n\tsessionDir?: string;\n\tsessionFile?: string;\n\trevivalLease?: SessionLeaseRequest;\n\tskills?: string[];\n\toutput?: string | boolean;\n\toutputMode?: \"inline\" | \"file-only\";\n\toutputBaseDir?: string;\n\tmodelOverride?: string;\n\tthinkingOverride?: string | false;\n\tavailableModels?: AvailableModelInfo[];\n\tmaxSubagentDepth: number;\n\twaitToolEnabled?: boolean;\n\tworktreeSetupHook?: string;\n\tworktreeSetupHookTimeoutMs?: number;\n\tworktreeBaseDir?: string;\n\tcontrolConfig?: ResolvedControlConfig;\n\tcontrolIntercomTarget?: string;\n\tchildIntercomTarget?: (agent: string, index: number) => string | undefined;\n\tnestedRoute?: NestedRouteInfo;\n\tacceptance?: AcceptanceInput;\n\ttimeoutMs?: number;\n\tabsoluteDeadlineAt?: number;\n\tturnBudget?: ResolvedTurnBudget;\n\ttoolBudget?: ResolvedToolBudget;\n\tconfigToolBudget?: ResolvedToolBudget;\n}\n\ninterface AsyncExecutionResult {\n\tcontent: Array<{ type: \"text\"; text: string }>;\n\tdetails: Details;\n\tisError?: boolean;\n}\n\nexport interface AsyncRunnerStepBuildParams {\n\tchain: ChainStep[];\n\ttask?: string;\n\tattachRoot?: ImportedAsyncRoot & { agent: string; outputName?: string; label?: string };\n\tresultMode?: SubagentRunMode;\n\tctx: AsyncExecutionContext;\n\tavailableModels?: AvailableModelInfo[];\n\tcwd?: string;\n\tchainSkills?: string[];\n\tsessionFilesByFlatIndex?: (string | undefined)[];\n\tthinkingOverridesByFlatIndex?: (string | false | undefined)[];\n\tprogressDir?: string;\n\tdynamicFanoutMaxItems?: number;\n\tmaxSubagentDepth: number;\n\twaitToolEnabled?: boolean;\n\tworktreeBaseDir?: string;\n\tasyncDir: string;\n\toutputBaseDir?: string;\n\tvalidateOutputBindings?: boolean;\n\ttoolBudget?: ResolvedToolBudget;\n\tconfigToolBudget?: ResolvedToolBudget;\n\t/** Optional collision-free ChildSpec id namespace for steps appended to a live run. */\n\tchildIdRunId?: string;\n}\n\nexport type AsyncRunnerStepBuildResult =\n\t| {\n\t\tsteps: RunnerStep[];\n\t\trunnerCwd: string;\n\t\tworkflowGraph: ReturnType<typeof buildWorkflowGraphSnapshot>;\n\t\teventChain: ChainStep[];\n\t\toriginalTask?: string;\n\t}\n\t| { error: string };\n\nexport function formatAsyncStartedMessage(headline: string): string {\n\treturn [\n\t\theadline,\n\t\t\"\",\n\t\t\"The async run is detached. Do not run sleep timers or polling loops just to wait for it.\",\n\t\t\"If you have independent work, continue that work. When you have nothing left to do until the async result arrives, call subagent_wait() — it blocks until the run finishes and delivers the completion here. Only if you are certain you will get another turn (an interactive session where the user will prompt you again) can you instead stop and let Pi wake you; inside a skill that must run to completion, or in a non-interactive run, there is no next turn, so use subagent_wait().\",\n\t\t\"Use subagent({ action: \\\"status\\\", id: \\\"...\\\" }) when you need a one-shot status/result or to inspect a blocked/stale run. To block until completion, prefer subagent_wait(). Do not poll in a loop just to wait.\",\n\t].join(\"\\n\");\n}\n\n/**\n * Check if jiti is available for async execution\n */\nexport function isAsyncAvailable(): boolean {\n\treturn jitiCliPath !== undefined;\n}\n\nfunction isNodeExecutableName(execPath: string): boolean {\n\tconst basename = path.basename(execPath).toLowerCase();\n\treturn basename === \"node\" || basename === \"node.exe\" || basename === \"nodejs\" || basename === \"nodejs.exe\";\n}\n\nfunction canUseCurrentNodeExecutable(execPath: string): boolean {\n\ttry {\n\t\tfs.accessSync(execPath, process.platform === \"win32\" ? fs.constants.F_OK : fs.constants.X_OK);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction resolveAsyncRunnerNodeCommand(): string {\n\tif (isNodeExecutableName(process.execPath) && canUseCurrentNodeExecutable(process.execPath)) {\n\t\treturn process.execPath;\n\t}\n\treturn process.platform === \"win32\" ? \"node.exe\" : \"node\";\n}\n\nexport function resolveAsyncRunnerLogPaths(cfg: object): { stdoutPath: string; stderrPath: string } | undefined {\n\tconst asyncDir = typeof (cfg as { asyncDir?: unknown }).asyncDir === \"string\"\n\t\t? (cfg as { asyncDir: string }).asyncDir\n\t\t: undefined;\n\tif (!asyncDir) return undefined;\n\treturn {\n\t\tstdoutPath: path.join(asyncDir, \"runner.stdout.log\"),\n\t\tstderrPath: path.join(asyncDir, \"runner.stderr.log\"),\n\t};\n}\n\nfunction closeFd(fd: number | undefined): void {\n\tif (fd === undefined) return;\n\ttry {\n\t\tfs.closeSync(fd);\n\t} catch {\n\t\t// Best-effort cleanup; child process already owns its duplicated stdio fd.\n\t}\n}\n\n/**\n * Spawn the async runner process\n */\nconst RUNNER_STARTUP_TIMEOUT_MS = 10_000;\nconst RUNNER_STARTUP_WAIT_BUFFER = typeof SharedArrayBuffer !== \"undefined\" ? new SharedArrayBuffer(4) : undefined;\nconst RUNNER_STARTUP_WAIT_VIEW = RUNNER_STARTUP_WAIT_BUFFER ? new Int32Array(RUNNER_STARTUP_WAIT_BUFFER) : undefined;\n\ntype RunnerStartupState = \"ready\" | \"acknowledged\";\n\ntype RunnerStartupWaitResult =\n\t| { ok: true; token: string }\n\t| { ok: false; error: string };\n\nfunction waitForStartupInterval(delayMs = 20): void {\n\tif (RUNNER_STARTUP_WAIT_VIEW) {\n\t\tAtomics.wait(RUNNER_STARTUP_WAIT_VIEW, 0, 0, delayMs);\n\t\treturn;\n\t}\n\tconst waitUntil = Date.now() + delayMs;\n\twhile (Date.now() < waitUntil) {\n\t\t// Startup handshakes are synchronous so resume rejects before reporting a run as started.\n\t}\n}\n\nfunction readRunnerStartup(startupPath: string, expectedState: RunnerStartupState, expectedToken?: string): RunnerStartupWaitResult | undefined {\n\tif (!fs.existsSync(startupPath)) return undefined;\n\ttry {\n\t\tconst payload = JSON.parse(fs.readFileSync(startupPath, \"utf-8\")) as { state?: unknown; token?: unknown; error?: unknown };\n\t\tif (payload.state === \"error\" && typeof payload.error === \"string\") return { ok: false, error: payload.error };\n\t\tif (payload.state !== expectedState) return undefined;\n\t\tif (typeof payload.token !== \"string\" || (expectedToken !== undefined && payload.token !== expectedToken)) {\n\t\t\treturn { ok: false, error: `Async runner wrote an invalid ${expectedState} startup handshake: ${startupPath}` };\n\t\t}\n\t\treturn { ok: true, token: payload.token };\n\t} catch (error) {\n\t\treturn { ok: false, error: `Failed to read async runner startup handshake '${startupPath}': ${error instanceof Error ? error.message : String(error)}` };\n\t}\n}\n\nfunction waitForRunnerStartup(startupPath: string, expectedState: RunnerStartupState, timeoutMs: number, expectedToken?: string): RunnerStartupWaitResult {\n\tconst deadline = Date.now() + timeoutMs;\n\tfor (;;) {\n\t\tconst result = readRunnerStartup(startupPath, expectedState, expectedToken);\n\t\tif (result) return result;\n\t\tif (Date.now() >= deadline) break;\n\t\twaitForStartupInterval(Math.min(20, Math.max(1, deadline - Date.now())));\n\t}\n\tconst finalResult = readRunnerStartup(startupPath, expectedState, expectedToken);\n\tif (finalResult) return finalResult;\n\treturn { ok: false, error: `Timed out after ${timeoutMs}ms waiting for the async runner startup state '${expectedState}'.` };\n}\n\nfunction writeRunnerStartupControl(filePath: string, payload: { action: \"ack\" | \"proceed\"; token: string }): void {\n\tconst tempPath = `${filePath}.${process.pid}.${Date.now()}.${Math.random().toString(36).slice(2)}.tmp`;\n\ttry {\n\t\tfs.writeFileSync(tempPath, JSON.stringify(payload), { encoding: \"utf-8\", mode: 0o600 });\n\t\tfs.renameSync(tempPath, filePath);\n\t} catch (error) {\n\t\ttry {\n\t\t\tfs.rmSync(tempPath, { force: true });\n\t\t} catch {\n\t\t\t// Preserve the startup-control write error.\n\t\t}\n\t\tthrow error;\n\t}\n}\n\nfunction runnerIsAlive(pid: number): boolean {\n\ttry {\n\t\tprocess.kill(pid, 0);\n\t\treturn true;\n\t} catch (error) {\n\t\treturn (error as NodeJS.ErrnoException).code === \"EPERM\";\n\t}\n}\n\nfunction terminateRunnerBeforeProceed(pid: number): void {\n\tfor (const signal of [\"SIGTERM\", \"SIGKILL\"] as const) {\n\t\tif (!runnerIsAlive(pid)) return;\n\t\ttry {\n\t\t\tprocess.kill(pid, signal);\n\t\t} catch {\n\t\t\tif (!runnerIsAlive(pid)) return;\n\t\t}\n\t\tconst deadline = Date.now() + 1000;\n\t\twhile (runnerIsAlive(pid) && Date.now() < deadline) waitForStartupInterval();\n\t}\n}\n\nfunction spawnRunner(cfg: object, suffix: string, cwd: string): { pid?: number; error?: string } {\n\tif (!jitiCliPath) {\n\t\treturn { error: \"upstream jiti for TypeScript execution could not be found; ensure package dependencies are installed\" };\n\t}\n\n\ttry {\n\t\tconst cwdStats = fs.statSync(cwd);\n\t\tif (!cwdStats.isDirectory()) {\n\t\t\treturn { error: `cwd is not a directory: ${cwd}` };\n\t\t}\n\t} catch {\n\t\treturn { error: `cwd does not exist: ${cwd}` };\n\t}\n\n\tfs.mkdirSync(TEMP_ROOT_DIR, { recursive: true });\n\tconst cfgPath = getAsyncConfigPath(suffix);\n\tfs.writeFileSync(cfgPath, JSON.stringify(cfg));\n\t// lunr: bake-in ships compiled .js only; use the .ts when present (upstream dev), else the .js sibling.\n\tconst runnerTsPath = path.join(path.dirname(fileURLToPath(import.meta.url)), \"subagent-runner.ts\");\n\tconst runner = fs.existsSync(runnerTsPath) ? runnerTsPath : runnerTsPath.replace(/\\.ts$/, \".js\");\n\tconst nodeCommand = resolveAsyncRunnerNodeCommand();\n\tconst startupPath = typeof (cfg as { revivalLease?: unknown; asyncDir?: unknown }).revivalLease === \"object\"\n\t\t&& typeof (cfg as { asyncDir?: unknown }).asyncDir === \"string\"\n\t\t? path.join((cfg as { asyncDir: string }).asyncDir, \"runner-startup.json\")\n\t\t: undefined;\n\tconst startupAckPath = startupPath ? path.join(path.dirname(startupPath), \"runner-startup-ack.json\") : undefined;\n\tconst startupProceedPath = startupPath ? path.join(path.dirname(startupPath), \"runner-startup-proceed.json\") : undefined;\n\tif (startupPath) fs.rmSync(startupPath, { force: true });\n\tif (startupAckPath) fs.rmSync(startupAckPath, { force: true });\n\tif (startupProceedPath) fs.rmSync(startupProceedPath, { force: true });\n\n\tconst logPaths = resolveAsyncRunnerLogPaths(cfg);\n\tlet stdoutFd: number | undefined;\n\tlet stderrFd: number | undefined;\n\ttry {\n\t\tif (logPaths) {\n\t\t\tfs.mkdirSync(path.dirname(logPaths.stdoutPath), { recursive: true });\n\t\t\tstdoutFd = fs.openSync(logPaths.stdoutPath, \"a\");\n\t\t\tstderrFd = fs.openSync(logPaths.stderrPath, \"a\");\n\t\t}\n\t\tconst proc = spawn(nodeCommand, [jitiCliPath, runner, cfgPath], {\n\t\t\tcwd,\n\t\t\tdetached: true,\n\t\t\tstdio: [\"ignore\", stdoutFd ?? \"ignore\", stderrFd ?? \"ignore\"],\n\t\t\twindowsHide: true,\n\t\t\tenv: {\n\t\t\t\t...process.env,\n\t\t\t\t...(piPackageRoot ? { [PI_CODING_AGENT_PACKAGE_ROOT_ENV]: piPackageRoot } : {}),\n\t\t\t},\n\t\t});\n\t\tcloseFd(stdoutFd);\n\t\tcloseFd(stderrFd);\n\t\tproc.on(\"error\", (error) => {\n\t\t\tconsole.error(`[pi-subagents] async spawn failed: ${error.message}`);\n\t\t});\n\t\tif (typeof proc.pid !== \"number\") {\n\t\t\treturn { error: `async runner did not produce a pid for cwd: ${cwd}` };\n\t\t}\n\t\tproc.unref();\n\t\tif (startupPath && startupAckPath && startupProceedPath) {\n\t\t\tconst ready = waitForRunnerStartup(startupPath, \"ready\", RUNNER_STARTUP_TIMEOUT_MS);\n\t\t\tif (!ready.ok) {\n\t\t\t\tterminateRunnerBeforeProceed(proc.pid);\n\t\t\t\treturn { error: ready.error };\n\t\t\t}\n\t\t\ttry {\n\t\t\t\twriteRunnerStartupControl(startupAckPath, { action: \"ack\", token: ready.token });\n\t\t\t} catch (error) {\n\t\t\t\tterminateRunnerBeforeProceed(proc.pid);\n\t\t\t\treturn { error: `Failed to acknowledge async runner startup: ${error instanceof Error ? error.message : String(error)}` };\n\t\t\t}\n\t\t\tconst acknowledged = waitForRunnerStartup(startupPath, \"acknowledged\", RUNNER_STARTUP_TIMEOUT_MS, ready.token);\n\t\t\tif (!acknowledged.ok) {\n\t\t\t\tterminateRunnerBeforeProceed(proc.pid);\n\t\t\t\treturn { error: acknowledged.error };\n\t\t\t}\n\t\t\ttry {\n\t\t\t\twriteRunnerStartupControl(startupProceedPath, { action: \"proceed\", token: ready.token });\n\t\t\t} catch (error) {\n\t\t\t\tterminateRunnerBeforeProceed(proc.pid);\n\t\t\t\treturn { error: `Failed to authorize async runner startup: ${error instanceof Error ? error.message : String(error)}` };\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tfs.rmSync(startupPath, { force: true });\n\t\t\t} catch {\n\t\t\t\t// Proceed is the commit point; handshake cleanup cannot turn a running revival into a start error.\n\t\t\t}\n\t\t}\n\t\treturn { pid: proc.pid };\n\t} catch (error) {\n\t\tcloseFd(stdoutFd);\n\t\tcloseFd(stderrFd);\n\t\treturn { error: error instanceof Error ? error.message : String(error) };\n\t}\n}\n\nfunction formatAsyncStartError(mode: SubagentRunMode, message: string): AsyncExecutionResult {\n\treturn {\n\t\tcontent: [{ type: \"text\", text: message }],\n\t\tisError: true,\n\t\tdetails: { mode, results: [] },\n\t};\n}\n\nconst UNAVAILABLE_SUBAGENT_SKILL_ERROR = \"Skills not found: pi-subagents\";\n\nclass UnavailableSubagentSkillError extends Error {}\nclass AsyncStartValidationError extends Error {}\n\nfunction childDescription(step: Pick<SequentialStep, \"description\" | \"label\" | \"agent\">): string {\n\treturn step.description || step.label || step.agent || \"child\";\n}\n\nexport function buildAsyncRunnerSteps(id: string, params: AsyncRunnerStepBuildParams): AsyncRunnerStepBuildResult {\n\tconst {\n\t\tchain,\n\t\tctx,\n\t\tcwd,\n\t\tsessionFilesByFlatIndex,\n\t\tthinkingOverridesByFlatIndex,\n\t\tmaxSubagentDepth,\n\t\tworktreeBaseDir,\n\t\tasyncDir,\n\t} = params;\n\tconst outputBaseDir = params.outputBaseDir;\n\tconst resultMode = params.resultMode ?? \"chain\";\n\tconst chainSkills = params.chainSkills ?? [];\n\tconst availableModels = params.availableModels;\n\tconst runnerCwd = resolveChildCwd(ctx.cwd, cwd);\n\tconst progressDir = params.progressDir ?? runnerCwd;\n\tconst graphChain: ChainStep[] = params.attachRoot\n\t\t? [{\n\t\t\t\tagent: params.attachRoot.agent,\n\t\t\t\ttask: `Attach async root ${params.attachRoot.runId}`,\n\t\t\t\tlabel: params.attachRoot.label ?? `Attached root ${params.attachRoot.runId}`,\n\t\t\t\t...(params.attachRoot.outputName ? { as: params.attachRoot.outputName } : {}),\n\t\t\t}, ...chain]\n\t\t: chain;\n\tconst firstStep = chain[0];\n\tconst originalTask = params.task ?? (firstStep\n\t\t? (isParallelStep(firstStep)\n\t\t\t? firstStep.parallel[0]?.task\n\t\t\t: isDynamicParallelStep(firstStep)\n\t\t\t\t? firstStep.parallel.task\n\t\t\t\t: (firstStep as SequentialStep).task)\n\t\t: undefined);\n\ttry {\n\t\tif (params.validateOutputBindings !== false) {\n\t\t\tvalidateChainOutputBindings(chain, { maxItems: params.dynamicFanoutMaxItems });\n\t\t}\n\t} catch (error) {\n\t\tif (error instanceof ChainOutputValidationError) return { error: error.message };\n\t\tthrow error;\n\t}\n\tconst workflowGraph = buildWorkflowGraphSnapshot({ runId: id, mode: resultMode, steps: graphChain });\n\n\tlet progressInstructionCreated = false;\n\tconst buildStepOverrides = (s: SequentialStep): StepOverrides => {\n\t\tconst stepSkillInput = normalizeSkillInput(s.skill);\n\t\treturn {\n\t\t\t...(s.output !== undefined ? { output: s.output } : {}),\n\t\t\t...(s.outputMode !== undefined ? { outputMode: s.outputMode } : {}),\n\t\t\t...(s.reads !== undefined ? { reads: s.reads } : {}),\n\t\t\t...(s.progress !== undefined ? { progress: s.progress } : {}),\n\t\t\t...(stepSkillInput !== undefined ? { skills: stepSkillInput } : {}),\n\t\t\t...(s.model !== undefined ? { model: s.model } : {}),\n\t\t};\n\t};\n\tconst buildSeqStep = (s: SequentialStep, sessionFile?: string, behaviorCwd?: string, progressPrecreated = false, resolvedBehavior?: ResolvedStepBehavior, flatIndex?: number, parallelOutputNamespace?: { stepIndex: number; taskIndex?: number }) => {\n\t\tconst childIndex = flatIndex ?? parallelOutputNamespace?.stepIndex ?? 0;\n\t\tconst spec = normalizeChildSpec(s, {\n\t\t\tparentMode: snapshotParentPermissionMode(ctx.parentSessionId ?? ctx.currentSessionId),\n\t\t\trunId: params.childIdRunId ?? id,\n\t\t\tindex: childIndex,\n\t\t\tchildId: s.childId ?? (s.agent?.trim() ? s.agent : undefined),\n\t\t\tdefaultTask: \"{previous}\",\n\t\t\tfanoutAuthorized: false,\n\t\t});\n\t\tconst toolBudgetInput = spec.toolBudget ?? params.toolBudget ?? params.configToolBudget;\n\t\tconst resolvedToolBudget = validateToolBudgetConfig(toolBudgetInput, spec.toolBudget ? \"toolBudget\" : \"config.toolBudget\");\n\t\tif (resolvedToolBudget.error) throw new AsyncStartValidationError(resolvedToolBudget.error);\n\t\tconst stepCwd = resolveChildCwd(runnerCwd, s.cwd);\n\t\tconst instructionCwd = behaviorCwd ?? stepCwd;\n\t\tlet behavior = suppressProgressForReadOnlyTask(resolvedBehavior ?? resolveStepBehavior(buildStepOverrides(s), chainSkills), s.task, originalTask);\n\t\tconst inheritedRelativeParallelOutput = parallelOutputNamespace && s.output === undefined && typeof behavior.output === \"string\" && !path.isAbsolute(behavior.output);\n\t\tif (inheritedRelativeParallelOutput && parallelOutputNamespace.taskIndex !== undefined) {\n\t\t\tbehavior = {\n\t\t\t\t...behavior,\n\t\t\t\toutput: path.join(`parallel-${parallelOutputNamespace.stepIndex}`, String(parallelOutputNamespace.taskIndex), behavior.output),\n\t\t\t};\n\t\t}\n\t\tconst namespaceOutputPath = Boolean(inheritedRelativeParallelOutput && parallelOutputNamespace.taskIndex === undefined);\n\t\tconst skillNames = behavior.skills === false ? [] : behavior.skills;\n\t\tconst { resolved: resolvedSkills, missing: missingSkills } = resolveSkillsWithFallback(\n\t\t\tskillNames,\n\t\t\tstepCwd,\n\t\t\tctx.cwd,\n\t\t\tundefined,\n\t\t\tstepCwd,\n\t\t);\n\t\tif (missingSkills.includes(\"pi-subagents\")) throw new UnavailableSubagentSkillError(UNAVAILABLE_SUBAGENT_SKILL_ERROR);\n\n\t\tlet systemPrompt = \"\";\n\t\tif (resolvedSkills.length > 0) {\n\t\t\tconst injection = buildSkillInjection(resolvedSkills);\n\t\t\tsystemPrompt = systemPrompt ? `${systemPrompt}\\n\\n${injection}` : injection;\n\t\t}\n\t\tconst readInstructions = buildChainInstructions({ ...behavior, output: false, progress: false }, instructionCwd, false);\n\t\tconst isFirstProgressAgent = behavior.progress && !progressPrecreated && !progressInstructionCreated;\n\t\tif (behavior.progress) progressInstructionCreated = true;\n\t\tconst progressInstructions = buildChainInstructions({ ...behavior, output: false, reads: false }, progressDir, isFirstProgressAgent);\n\t\tconst outputPath = resolveSingleOutputPath(behavior.output, ctx.cwd, instructionCwd, outputBaseDir);\n\t\tif (!namespaceOutputPath) systemPrompt = injectOutputPathSystemPrompt(systemPrompt, outputPath, {\n\t\t\ttools: spec.effectivePermissions === \"read-only\" ? [\"read\", \"grep\", \"find\", \"ls\", \"bash\"] : undefined,\n\t\t});\n\t\tconst validationError = validateFileOnlyOutputMode(behavior.outputMode, outputPath, `Async step (${spec.description})`);\n\t\tif (validationError) throw new AsyncStartValidationError(validationError);\n\t\tlet taskTemplate = s.task ?? \"{previous}\";\n\t\ttaskTemplate = taskTemplate.replace(/\\{task\\}/g, originalTask ?? \"\");\n\t\ttaskTemplate = taskTemplate.replace(/\\{chain_dir\\}/g, runnerCwd);\n\t\tconst taskText = `${readInstructions.prefix}${taskTemplate}${progressInstructions.suffix}`;\n\t\tconst task = namespaceOutputPath ? taskText : injectSingleOutputInstruction(taskText, outputPath, {\n\t\t\ttools: spec.effectivePermissions === \"read-only\" ? [\"read\", \"grep\", \"find\", \"ls\", \"bash\"] : undefined,\n\t\t});\n\n\t\tconst primaryModel = resolveEffectiveSubagentModel(\n\t\t\tspec.model ?? resolveTierModelOverride(spec.tier),\n\t\t\tundefined,\n\t\t\tctx.currentModel,\n\t\t\tavailableModels,\n\t\t\tctx.currentModelProvider,\n\t\t\t{ scope: ctx.modelScope },\n\t\t);\n\t\tconst thinkingOverride = flatIndex === undefined ? undefined : thinkingOverridesByFlatIndex?.[flatIndex];\n\t\tconst effectiveThinking = thinkingOverride;\n\t\tconst model = applyThinkingSuffix(primaryModel, effectiveThinking, thinkingOverride !== undefined);\n\t\treturn {\n\t\t\tparentSessionId: ctx.parentSessionId ?? ctx.currentSessionId,\n\t\t\tparentPermissionMode: snapshotParentPermissionMode(ctx.parentSessionId ?? ctx.currentSessionId),\n\t\t\tchildId: spec.childId,\n\t\t\tdescription: spec.description,\n\t\t\tpermissions: spec.effectivePermissions,\n\t\t\tagent: spec.description,\n\t\t\ttask,\n\t\t\tphase: s.phase,\n\t\t\tlabel: s.label,\n\t\t\toutputName: s.as,\n\t\t\tstructured: Boolean(s.outputSchema),\n\t\t\tcwd: stepCwd,\n\t\t\tmodel,\n\t\t\tthinking: resolveEffectiveThinking(model, effectiveThinking),\n\t\t\t...(spec.modelSelection ? { modelSelection: spec.modelSelection } : {}),\n\t\t\tmodelCandidates: buildModelCandidates(primaryModel, undefined, availableModels, ctx.currentModelProvider, { scope: ctx.modelScope }).map((candidate) =>\n\t\t\t\tapplyThinkingSuffix(candidate, effectiveThinking, thinkingOverride !== undefined),\n\t\t\t),\n\t\t\tsystemPrompt,\n\t\t\tsystemPromptMode: \"append\",\n\t\t\tinheritProjectContext: true,\n\t\t\tinheritSkills: false,\n\t\t\tskills: resolvedSkills.map((r) => r.name),\n\t\t\toutputPath,\n\t\t\t...(namespaceOutputPath ? { namespaceOutputPath: true } : {}),\n\t\t\toutputMode: behavior.outputMode,\n\t\t\tsessionFile,\n\t\t\tmaxSubagentDepth,\n\t\t\twaitToolEnabled: params.waitToolEnabled,\n\t\t\teffectiveAcceptance: resolveEffectiveAcceptance({\n\t\t\t\texplicit: s.acceptance,\n\t\t\t\tagentName: spec.description,\n\t\t\t\tpermissions: spec.effectivePermissions,\n\t\t\t\ttask,\n\t\t\t\tmode: resultMode,\n\t\t\t\tasync: true,\n\t\t\t\tdynamic: false,\n\t\t\t}),\n\t\t\tacceptanceInput: s.acceptance,\n\t\t\tacceptanceRole: spec.effectivePermissions === \"read-only\" ? \"read-only\" : \"writer\",\n\t\t\t...(s.outputSchema ? { structuredOutputSchema: s.outputSchema } : {}),\n\t\t\t...(s.outputSchema ? { structuredOutput: createStructuredOutputRuntime(s.outputSchema, path.join(asyncDir, \"structured-output\")) } : {}),\n\t\t\t...(resolvedToolBudget.budget ? { toolBudget: resolvedToolBudget.budget } : {}),\n\t\t};\n\t};\n\n\tlet flatStepIndex = 0;\n\tconst nextFlatStep = (): { index: number; sessionFile?: string; thinkingOverride?: string | false } => {\n\t\tconst index = flatStepIndex;\n\t\tconst sessionFile = sessionFilesByFlatIndex?.[flatStepIndex];\n\t\tconst thinkingOverride = thinkingOverridesByFlatIndex?.[flatStepIndex];\n\t\tflatStepIndex++;\n\t\treturn {\n\t\t\tindex,\n\t\t\t...(sessionFile ? { sessionFile } : {}),\n\t\t\t...(thinkingOverride ? { thinkingOverride } : {}),\n\t\t};\n\t};\n\n\ttry {\n\t\tconst builtSteps = chain.map((s, stepIndex) => {\n\t\t\tif (isParallelStep(s)) {\n\t\t\t\tconst parallelBehaviors = s.parallel.map((task) => {\n\t\t\t\t\treturn suppressProgressForReadOnlyTask(resolveStepBehavior(buildStepOverrides(task), chainSkills), task.task, originalTask);\n\t\t\t\t});\n\t\t\t\tconst progressPrecreated = parallelBehaviors.some((behavior) => behavior.progress);\n\t\t\t\tif (progressPrecreated) {\n\t\t\t\t\tif (!s.worktree || params.progressDir) writeInitialProgressFile(progressDir);\n\t\t\t\t\tprogressInstructionCreated = true;\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tparallel: s.parallel.map((t, taskIndex) => {\n\t\t\t\t\t\tlet behaviorCwd: string | undefined;\n\t\t\t\t\t\tif (s.worktree) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tbehaviorCwd = resolveExpectedWorktreeAgentCwd(runnerCwd, `${id}-s${stepIndex}`, taskIndex, worktreeBaseDir);\n\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\tbehaviorCwd = undefined;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst staticStep = nextFlatStep();\n\t\t\t\t\t\treturn buildSeqStep(t, staticStep.sessionFile, behaviorCwd, progressPrecreated, parallelBehaviors[taskIndex], staticStep.index, { stepIndex, taskIndex });\n\t\t\t\t\t}),\n\t\t\t\t\tconcurrency: s.concurrency,\n\t\t\t\t\tfailFast: s.failFast,\n\t\t\t\t\tworktree: s.worktree,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (isDynamicParallelStep(s)) {\n\t\t\t\tconst behavior = suppressProgressForReadOnlyTask(resolveStepBehavior(buildStepOverrides(s.parallel), chainSkills), s.parallel.task, originalTask);\n\t\t\t\tconst progressPrecreated = behavior.progress;\n\t\t\t\tif (progressPrecreated) {\n\t\t\t\t\twriteInitialProgressFile(progressDir);\n\t\t\t\t\tprogressInstructionCreated = true;\n\t\t\t\t}\n\t\t\t\tconst maxItems = s.expand.maxItems ?? params.dynamicFanoutMaxItems ?? 0;\n\t\t\t\tconst dynamicFlatSteps = Array.from({ length: maxItems }, () => nextFlatStep());\n\t\t\t\tconst parallel = buildSeqStep(s.parallel as SequentialStep, undefined, undefined, progressPrecreated, behavior, undefined, { stepIndex });\n\t\t\t\treturn {\n\t\t\t\t\texpand: s.expand,\n\t\t\t\t\tparallel,\n\t\t\t\t\tcollect: s.collect,\n\t\t\t\t\tconcurrency: s.concurrency,\n\t\t\t\t\tfailFast: s.failFast,\n\t\t\t\t\tphase: s.phase,\n\t\t\t\t\tlabel: s.label,\n\t\t\t\t\tsessionFiles: dynamicFlatSteps.map((step) => step.sessionFile),\n\t\t\t\t\tthinkingOverrides: dynamicFlatSteps.map((step) => step.thinkingOverride),\n\t\t\t\t\teffectiveAcceptance: resolveEffectiveAcceptance({\n\t\t\t\t\t\texplicit: s.acceptance,\n\t\t\t\t\t\tagentName: s.parallel.description,\n\t\t\t\t\t\tpermissions: s.parallel.permissions === \"read-only\" ? \"read-only\" : \"full\",\n\t\t\t\t\t\ttask: parallel.task,\n\t\t\t\t\t\tmode: resultMode,\n\t\t\t\t\t\tasync: true,\n\t\t\t\t\t\tdynamicGroup: true,\n\t\t\t\t\t}),\n\t\t\t\t\tacceptanceInput: s.acceptance,\n\t\t\t\t\tacceptanceRole: s.parallel.permissions === \"read-only\" ? \"read-only\" : \"writer\",\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst staticStep = nextFlatStep();\n\t\t\treturn buildSeqStep(s as SequentialStep, staticStep.sessionFile, undefined, false, undefined, staticStep.index);\n\t\t});\n\t\tconst steps = params.attachRoot\n\t\t\t? [{\n\t\t\t\t\tagent: params.attachRoot.agent,\n\t\t\t\t\ttask: \"\",\n\t\t\t\t\tlabel: params.attachRoot.label ?? `Attached root ${params.attachRoot.runId}`,\n\t\t\t\t\toutputName: params.attachRoot.outputName,\n\t\t\t\t\timportAsyncRoot: {\n\t\t\t\t\t\trunId: params.attachRoot.runId,\n\t\t\t\t\t\tasyncDir: params.attachRoot.asyncDir,\n\t\t\t\t\t\tresultPath: params.attachRoot.resultPath,\n\t\t\t\t\t\tindex: params.attachRoot.index,\n\t\t\t\t\t},\n\t\t\t\t\tinheritProjectContext: false,\n\t\t\t\t\tinheritSkills: false,\n\t\t\t\t}, ...builtSteps]\n\t\t\t: builtSteps;\n\t\tfor (const step of steps) {\n\t\t\tif (!(\"parallel\" in step) || !Array.isArray(step.parallel)) continue;\n\t\t\tconst seen = new Map<string, { index: number; agent: string }>();\n\t\t\tfor (let index = 0; index < step.parallel.length; index++) {\n\t\t\t\tconst task = step.parallel[index]!;\n\t\t\t\tif (!task.outputPath) continue;\n\t\t\t\tconst previous = seen.get(task.outputPath);\n\t\t\t\tif (previous) {\n\t\t\t\t\tthrow new AsyncStartValidationError(`Parallel tasks ${previous.index + 1} (${previous.agent}) and ${index + 1} (${task.agent}) resolve output to the same path: ${task.outputPath}. Use distinct output paths.`);\n\t\t\t\t}\n\t\t\t\tseen.set(task.outputPath, { index, agent: task.agent });\n\t\t\t}\n\t\t}\n\t\treturn { steps, runnerCwd, workflowGraph, eventChain: graphChain, ...(originalTask !== undefined ? { originalTask } : {}) };\n\t} catch (error) {\n\t\tif (error instanceof UnavailableSubagentSkillError || error instanceof AsyncStartValidationError) return { error: error.message };\n\t\tthrow error;\n\t}\n}\n\n/**\n * Execute a chain asynchronously\n */\nexport function executeAsyncChain(\n\tid: string,\n\tparams: AsyncChainParams,\n): AsyncExecutionResult {\n\tconst {\n\t\tchain,\n\t\tctx,\n\t\tcwd,\n\t\tmaxOutput,\n\t\tartifactsDir,\n\t\tartifactConfig,\n\t\tshareEnabled,\n\t\tsessionRoot,\n\t\tsessionFilesByFlatIndex,\n\t\tthinkingOverridesByFlatIndex,\n\t\tmaxSubagentDepth,\n\t\tworktreeSetupHook,\n\t\tworktreeSetupHookTimeoutMs,\n\t\tworktreeBaseDir,\n\t\tcontrolConfig,\n\t\tcontrolIntercomTarget,\n\t\tchildIntercomTarget,\n\t\tnestedRoute,\n\t} = params;\n\tconst resultMode = params.resultMode ?? \"chain\";\n\tconst inheritedNestedRoute = resolveInheritedNestedRouteFromEnv();\n\tconst nestedAddress = inheritedNestedRoute ? resolveNestedParentAddressFromEnv() : undefined;\n\tconst asyncDir = inheritedNestedRoute\n\t\t? path.join(TEMP_ROOT_DIR, \"nested-subagent-runs\", inheritedNestedRoute.rootRunId, id)\n\t\t: path.join(ASYNC_DIR, id);\n\ttry {\n\t\tfs.mkdirSync(asyncDir, { recursive: true });\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\treturn {\n\t\t\tcontent: [{ type: \"text\", text: `Failed to create async run directory '${asyncDir}': ${message}` }],\n\t\t\tisError: true,\n\t\t\tdetails: { mode: resultMode, results: [] },\n\t\t};\n\t}\n\n\tconst built = buildAsyncRunnerSteps(id, {\n\t\tchain,\n\t\ttask: params.task,\n\t\tattachRoot: params.attachRoot,\n\t\tresultMode,\n\t\tctx,\n\t\tavailableModels: params.availableModels,\n\t\tcwd,\n\t\tchainSkills: params.chainSkills,\n\t\tsessionFilesByFlatIndex,\n\t\tthinkingOverridesByFlatIndex,\n\t\tprogressDir: params.progressDir ?? (artifactsDir ? path.join(artifactsDir, \"progress\", id) : resultMode === \"parallel\" ? path.join(asyncDir, \"progress\") : undefined),\n\t\toutputBaseDir: artifactsDir ? path.join(artifactsDir, \"outputs\", id) : undefined,\n\t\tdynamicFanoutMaxItems: params.dynamicFanoutMaxItems,\n\t\tmaxSubagentDepth,\n\t\twaitToolEnabled: params.waitToolEnabled,\n\t\tworktreeBaseDir,\n\t\tasyncDir,\n\t\ttoolBudget: params.toolBudget,\n\t\tconfigToolBudget: params.configToolBudget,\n\t});\n\tif (\"error\" in built) {\n\t\ttry {\n\t\t\tfs.rmSync(asyncDir, { recursive: true, force: true });\n\t\t} catch {\n\t\t\t// Best-effort cleanup for validation failures before the runner is spawned.\n\t\t}\n\t\treturn formatAsyncStartError(resultMode, built.error);\n\t}\n\tconst { steps, runnerCwd, workflowGraph, eventChain } = built;\n\tconst deadlineAt = params.timeoutMs !== undefined ? Date.now() + params.timeoutMs : undefined;\n\tconst initialTurnBudget = params.turnBudget ? initialTurnBudgetState(params.turnBudget) : undefined;\n\tlet childTargetIndex = 0;\n\tconst childIntercomTargets = childIntercomTarget ? steps.flatMap((step) => {\n\t\tif (!(\"parallel\" in step) && step.importAsyncRoot) {\n\t\t\tchildTargetIndex++;\n\t\t\treturn [undefined];\n\t\t}\n\t\tif (\"parallel\" in step) {\n\t\t\tif (!Array.isArray(step.parallel)) {\n\t\t\t\tchildTargetIndex++;\n\t\t\t\treturn [undefined];\n\t\t\t}\n\t\t\treturn step.parallel.map((task) => childIntercomTarget(task.childId ?? task.agent, childTargetIndex++));\n\t\t}\n\t\treturn [childIntercomTarget(step.childId ?? step.agent, childTargetIndex++)];\n\t}) : undefined;\n\n\tlet spawnResult: { pid?: number; error?: string } = {};\n\ttry {\n\t\tspawnResult = spawnRunner(\n\t\t\t{\n\t\t\t\tid,\n\t\t\t\tsteps,\n\t\t\t\tresultPath: inheritedNestedRoute ? nestedResultsPath(inheritedNestedRoute.rootRunId, id) : path.join(RESULTS_DIR, `${id}.json`),\n\t\t\t\tcwd: runnerCwd,\n\t\t\t\tplaceholder: \"{previous}\",\n\t\t\t\tmaxOutput,\n\t\t\t\tartifactsDir: artifactConfig.enabled ? artifactsDir : undefined,\n\t\t\t\tartifactConfig,\n\t\t\t\tshare: shareEnabled,\n\t\t\t\tsessionDir: sessionRoot ? path.join(sessionRoot, `async-${id}`) : undefined,\n\t\t\t\tasyncDir,\n\t\t\t\tsessionId: ctx.currentSessionId,\n\t\t\t\tpiPackageRoot,\n\t\t\t\tpiArgv1: process.argv[1],\n\t\t\t\tworktreeSetupHook,\n\t\t\t\tworktreeSetupHookTimeoutMs,\n\t\t\t\tworktreeBaseDir,\n\t\t\t\tcontrolConfig,\n\t\t\t\tturnBudget: params.turnBudget,\n\t\t\t\ttoolBudget: params.toolBudget,\n\t\t\t\tcontrolIntercomTarget,\n\t\t\t\tchildIntercomTargets,\n\t\t\t\tresultMode,\n\t\t\t\tdynamicFanoutMaxItems: params.dynamicFanoutMaxItems,\n\t\t\t\ttimeoutMs: params.timeoutMs,\n\t\t\t\tdeadlineAt,\n\t\t\t\tglobalConcurrencyLimit: params.globalConcurrencyLimit,\n\t\t\t\tworkflowGraph,\n\t\t\t\tnestedRoute: nestedRoute ?? inheritedNestedRoute,\n\t\t\t\tnestedSelf: inheritedNestedRoute && nestedAddress ? {\n\t\t\t\t\tparentRunId: nestedAddress.parentRunId,\n\t\t\t\t\tparentStepIndex: nestedAddress.parentStepIndex,\n\t\t\t\t\tdepth: nestedAddress.depth,\n\t\t\t\t\tpath: nestedAddress.path,\n\t\t\t\t} : undefined,\n\t\t\t},\n\t\t\tid,\n\t\t\trunnerCwd,\n\t\t);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\treturn formatAsyncStartError(resultMode, `Failed to start async ${resultMode} '${id}': ${message}`);\n\t}\n\n\tif (spawnResult.error) {\n\t\treturn formatAsyncStartError(resultMode, `Failed to start async ${resultMode} '${id}': ${spawnResult.error}`);\n\t}\n\n\tif (spawnResult.pid) {\n\t\tconst eventFirstStep = eventChain[0];\n\t\tconst firstAgents = isParallelStep(eventFirstStep)\n\t\t\t? eventFirstStep.parallel.map(childDescription)\n\t\t\t: isDynamicParallelStep(eventFirstStep)\n\t\t\t\t? [childDescription(eventFirstStep.parallel)]\n\t\t\t: [childDescription(eventFirstStep as SequentialStep)];\n\t\tconst firstTask = isParallelStep(eventFirstStep)\n\t\t\t? eventFirstStep.parallel[0]?.task\n\t\t\t: isDynamicParallelStep(eventFirstStep)\n\t\t\t\t? eventFirstStep.parallel.task\n\t\t\t\t: (eventFirstStep as SequentialStep).task;\n\t\tconst workflowGoal = params.goal ?? (params.task?.trim() || firstTask);\n\t\tconst parallelGroups: Array<{ start: number; count: number; stepIndex: number }> = [];\n\t\tconst flatAgents: string[] = [];\n\t\tlet flatStepStart = 0;\n\t\tfor (let stepIndex = 0; stepIndex < eventChain.length; stepIndex++) {\n\t\t\tconst step = eventChain[stepIndex]!;\n\t\t\tif (isParallelStep(step)) {\n\t\t\t\tparallelGroups.push({ start: flatStepStart, count: step.parallel.length, stepIndex });\n\t\t\t\tflatAgents.push(...step.parallel.map(childDescription));\n\t\t\t\tflatStepStart += step.parallel.length;\n\t\t\t} else if (isDynamicParallelStep(step)) {\n\t\t\t\tparallelGroups.push({ start: flatStepStart, count: 1, stepIndex });\n\t\t\t\tflatAgents.push(childDescription(step.parallel));\n\t\t\t\tflatStepStart++;\n\t\t\t} else {\n\t\t\t\tflatAgents.push(childDescription(step as SequentialStep));\n\t\t\t\tflatStepStart++;\n\t\t\t}\n\t\t}\n\t\tif (inheritedNestedRoute && nestedAddress) {\n\t\t\tconst now = Date.now();\n\t\t\ttry {\n\t\t\t\twriteNestedEvent(inheritedNestedRoute, {\n\t\t\t\t\ttype: \"subagent.nested.started\",\n\t\t\t\t\tts: now,\n\t\t\t\t\tparentRunId: nestedAddress.parentRunId,\n\t\t\t\t\tparentStepIndex: nestedAddress.parentStepIndex,\n\t\t\t\t\tchild: {\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tparentRunId: nestedAddress.parentRunId,\n\t\t\t\t\t\tparentStepIndex: nestedAddress.parentStepIndex,\n\t\t\t\t\t\tdepth: nestedAddress.depth,\n\t\t\t\t\t\tpath: nestedAddress.path,\n\t\t\t\t\t\tasyncDir,\n\t\t\t\t\t\tpid: spawnResult.pid,\n\t\t\t\t\t\townerIntercomTarget: process.env.PI_SUBAGENT_INTERCOM_SESSION_NAME,\n\t\t\t\t\t\tleafIntercomTarget: childIntercomTargets?.[0],\n\t\t\t\t\t\tintercomTarget: childIntercomTargets?.[0],\n\t\t\t\t\t\townerState: \"live\",\n\t\t\t\t\t\tmode: resultMode,\n\t\t\t\t\t\tstate: \"running\",\n\t\t\t\t\t\tagent: firstAgents[0],\n\t\t\t\t\t\tagents: flatAgents,\n\t\t\t\t\t\tchainStepCount: eventChain.length,\n\t\t\t\t\t\tparallelGroups,\n\t\t\t\t\t\t...(params.timeoutMs !== undefined ? { timeoutMs: params.timeoutMs, deadlineAt } : {}),\n\t\t\t\t\t\t...(initialTurnBudget ? { turnBudget: initialTurnBudget } : {}),\n\t\t\t\t\t\tstartedAt: now,\n\t\t\t\t\t\tlastUpdate: now,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\"Failed to emit nested async start event:\", error);\n\t\t\t}\n\t\t}\n\t\tctx.pi.events.emit(SUBAGENT_ASYNC_STARTED_EVENT, {\n\t\t\tlifecycleArtifactVersion: SUBAGENT_LIFECYCLE_ARTIFACT_VERSION,\n\t\t\tid,\n\t\t\tpid: spawnResult.pid,\n\t\t\tsessionId: ctx.currentSessionId,\n\t\t\tmode: resultMode,\n\t\t\tagent: firstAgents[0],\n\t\t\tagents: flatAgents,\n\t\t\ttask: firstTask?.slice(0, 50),\n\t\t\tgoal: workflowGoal?.slice(0, 120),\n\t\t\tchain: eventChain.map((s) =>\n\t\t\t\tisParallelStep(s) ? `[${s.parallel.map(childDescription).join(\"+\")}]` : isDynamicParallelStep(s) ? `expand:${childDescription(s.parallel)}` : childDescription(s as SequentialStep),\n\t\t\t),\n\t\t\tchainStepCount: eventChain.length,\n\t\t\tparallelGroups,\n\t\t\tworkflowGraph,\n\t\t\tcwd: runnerCwd,\n\t\t\tasyncDir,\n\t\t\t...(params.timeoutMs !== undefined ? { timeoutMs: params.timeoutMs, deadlineAt } : {}),\n\t\t\t...(initialTurnBudget ? { turnBudget: initialTurnBudget } : {}),\n\t\t\tnestedRoute,\n\t\t});\n\t}\n\n\tconst chainDesc = chain\n\t\t.map((s) =>\n\t\t\tisParallelStep(s) ? `[${s.parallel.map(childDescription).join(\"+\")}]` : isDynamicParallelStep(s) ? `expand:${childDescription(s.parallel)}` : childDescription(s as SequentialStep),\n\t\t)\n\t\t.join(\" -> \");\n\n\treturn {\n\t\tcontent: [{ type: \"text\", text: formatAsyncStartedMessage(`Async ${resultMode}: ${chainDesc} [${id}]`) }],\n\t\tdetails: { mode: resultMode, runId: id, results: [], asyncId: id, asyncDir, workflowGraph, ...(params.timeoutMs !== undefined ? { timeoutMs: params.timeoutMs, deadlineAt } : {}), ...(params.turnBudget ? { turnBudget: params.turnBudget } : {}), ...(params.toolBudget ? { toolBudget: params.toolBudget } : {}) },\n\t};\n}\n\n/**\n * Execute a single agent asynchronously\n */\nexport function executeAsyncSingle(\n\tid: string,\n\tparams: AsyncSingleParams,\n): AsyncExecutionResult {\n\tconst {\n\t\tspec,\n\t\tctx,\n\t\tcwd,\n\t\tmaxOutput,\n\t\tartifactsDir,\n\t\tartifactConfig,\n\t\tshareEnabled,\n\t\tsessionRoot,\n\t\tsessionFile,\n\t\tmaxSubagentDepth,\n\t\tworktreeSetupHook,\n\t\tworktreeSetupHookTimeoutMs,\n\t\tworktreeBaseDir,\n\t\tcontrolConfig,\n\t\tcontrolIntercomTarget,\n\t\tchildIntercomTarget,\n\t\tnestedRoute,\n\t} = params;\n\tconst agent = spec.description;\n\tconst task = spec.task;\n\tconst runnerCwd = resolveChildCwd(ctx.cwd, cwd);\n\tconst skillNames = params.skills ?? (spec.skill === false ? [] : normalizeSkillInput(spec.skill) ?? []);\n\tconst availableModels = params.availableModels;\n\tconst { resolved: resolvedSkills, missing: missingSkills } = resolveSkillsWithFallback(\n\t\tskillNames,\n\t\trunnerCwd,\n\t\tctx.cwd,\n\t\tundefined,\n\t\trunnerCwd,\n\t);\n\tif (missingSkills.includes(\"pi-subagents\")) return formatAsyncStartError(\"single\", UNAVAILABLE_SUBAGENT_SKILL_ERROR);\n\tlet systemPrompt = \"\";\n\tif (resolvedSkills.length > 0) {\n\t\tconst injection = buildSkillInjection(resolvedSkills);\n\t\tsystemPrompt = systemPrompt ? `${systemPrompt}\\n\\n${injection}` : injection;\n\t}\n\tconst inheritedNestedRoute = resolveInheritedNestedRouteFromEnv();\n\tconst nestedAddress = inheritedNestedRoute ? resolveNestedParentAddressFromEnv() : undefined;\n\tconst asyncDir = inheritedNestedRoute\n\t\t? path.join(TEMP_ROOT_DIR, \"nested-subagent-runs\", inheritedNestedRoute.rootRunId, id)\n\t\t: path.join(ASYNC_DIR, id);\n\ttry {\n\t\tfs.mkdirSync(asyncDir, { recursive: true });\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\treturn {\n\t\t\tcontent: [{ type: \"text\", text: `Failed to create async run directory '${asyncDir}': ${message}` }],\n\t\t\tisError: true,\n\t\t\tdetails: { mode: \"single\" as const, results: [] },\n\t\t};\n\t}\n\n\tconst effectiveOutput = normalizeSingleOutputOverride(params.output ?? spec.output, typeof spec.output === \"string\" ? spec.output : undefined);\n\tconst outputPath = resolveSingleOutputPath(effectiveOutput, ctx.cwd, runnerCwd, params.outputBaseDir ?? (artifactsDir ? path.join(artifactsDir, \"outputs\", id) : undefined));\n\tconst childToolShape = { tools: spec.effectivePermissions === \"read-only\" ? [\"read\", \"grep\", \"find\", \"ls\", \"bash\"] : undefined };\n\tsystemPrompt = injectOutputPathSystemPrompt(systemPrompt, outputPath, childToolShape);\n\tconst outputMode = params.outputMode ?? spec.outputMode ?? \"inline\";\n\tconst validationError = validateFileOnlyOutputMode(outputMode, outputPath, `Async single run (${agent})`);\n\tif (validationError) return formatAsyncStartError(\"single\", validationError);\n\tconst taskWithOutputInstruction = injectSingleOutputInstruction(task, outputPath, childToolShape);\n\tconst primaryModel = resolveSubagentModelOverride(\n\t\tparams.modelOverride ?? spec.model,\n\t\tctx.currentModel,\n\t\tavailableModels,\n\t\tctx.currentModelProvider,\n\t);\n\tconst effectiveThinking = params.thinkingOverride;\n\tconst model = applyThinkingSuffix(primaryModel, effectiveThinking, params.thinkingOverride !== undefined);\n\tconst toolBudgetInput = params.toolBudget ?? spec.toolBudget ?? params.configToolBudget;\n\tconst resolvedToolBudget = validateToolBudgetConfig(toolBudgetInput, params.toolBudget || spec.toolBudget ? \"toolBudget\" : \"config.toolBudget\");\n\tif (resolvedToolBudget.error) return formatAsyncStartError(\"single\", resolvedToolBudget.error);\n\tconst deadlineAt = params.absoluteDeadlineAt ?? (params.timeoutMs !== undefined ? Date.now() + params.timeoutMs : undefined);\n\tconst timeoutMs = params.absoluteDeadlineAt !== undefined && deadlineAt !== undefined\n\t\t? deadlineAt - Date.now()\n\t\t: params.timeoutMs;\n\tif (timeoutMs !== undefined && timeoutMs <= 0) return formatAsyncStartError(\"single\", \"The source run's absolute deadline expired before recovery could launch.\");\n\tconst initialTurnBudget = params.turnBudget ? initialTurnBudgetState(params.turnBudget) : undefined;\n\tconst resolvedSessionDir = params.sessionDir ?? (sessionRoot ? path.join(sessionRoot, `async-${id}`) : undefined);\n\tconst resolvedAcceptance = resolveEffectiveAcceptance({\n\t\texplicit: params.acceptance ?? spec.acceptance,\n\t\tagentName: agent,\n\t\tpermissions: spec.effectivePermissions,\n\t\ttask,\n\t\tmode: \"single\",\n\t\tasync: true,\n\t});\n\tconst recoveryDescriptor: SteeringRecoveryDescriptor = {\n\t\tversion: 3,\n\t\tlifecycleArtifactVersion: SUBAGENT_LIFECYCLE_ARTIFACT_VERSION,\n\t\tsourceRunId: id,\n\t\tchildId: spec.childId,\n\t\tdescription: spec.description,\n\t\tpermissions: spec.effectivePermissions,\n\t\tagent,\n\t\t...(sessionFile ? { sessionFile } : {}),\n\t\tcwd: runnerCwd,\n\t\t...(model ? { model } : {}),\n\t\t...(effectiveThinking ? { thinking: resolveEffectiveThinking(model, effectiveThinking) } : {}),\n\t\t...(spec.modelSelection ? { modelSelection: spec.modelSelection } : {}),\n\t\t...(resolvedSkills.length ? { skills: resolvedSkills.map((skill) => skill.name) } : {}),\n\t\t...(outputPath ? { outputPath } : {}),\n\t\toutputMode,\n\t\t...(resolvedAcceptance ? { acceptance: resolvedAcceptance } : {}),\n\t\t...(controlConfig ? { controlConfig } : {}),\n\t\t...(deadlineAt !== undefined ? { absoluteDeadlineAt: deadlineAt } : {}),\n\t\t...(params.turnBudget ? { initialTurnBudget: params.turnBudget } : {}),\n\t\t...(resolvedToolBudget.budget ? { initialToolBudget: resolvedToolBudget.budget } : {}),\n\t\tmaxSubagentDepth,\n\t\t...(maxOutput ? { maxOutput } : {}),\n\t\tshare: shareEnabled,\n\t\t...(resolvedSessionDir ? { sessionDir: resolvedSessionDir } : {}),\n\t\t...(artifactsDir ? { artifactsDir } : {}),\n\t\tartifactConfig,\n\t};\n\ttry {\n\t\twritePrivateAtomicJson(path.join(asyncDir, \"recovery-descriptor.json\"), recoveryDescriptor);\n\t} catch (error) {\n\t\treturn formatAsyncStartError(\"single\", `Failed to persist async recovery descriptor for '${id}': ${error instanceof Error ? error.message : String(error)}`);\n\t}\n\tlet spawnResult: { pid?: number; error?: string } = {};\n\ttry {\n\t\tspawnResult = spawnRunner(\n\t\t\t{\n\t\t\t\tid,\n\t\t\t\tsteps: [\n\t\t\t\t\t{\n\t\t\t\t\t\tparentSessionId: ctx.parentSessionId ?? ctx.currentSessionId,\n\t\t\t\t\t\tparentPermissionMode: snapshotParentPermissionMode(ctx.parentSessionId ?? ctx.currentSessionId),\n\t\t\t\t\t\tchildId: spec.childId,\n\t\t\t\t\t\tdescription: spec.description,\n\t\t\t\t\t\tpermissions: spec.effectivePermissions,\n\t\t\t\t\t\tagent,\n\t\t\t\t\t\ttask: taskWithOutputInstruction,\n\t\t\t\t\t\tcwd: runnerCwd,\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\tthinking: resolveEffectiveThinking(model, effectiveThinking),\n\t\t\t\t\t\t...(spec.modelSelection ? { modelSelection: spec.modelSelection } : {}),\n\t\t\t\t\t\tmodelCandidates: buildModelCandidates(primaryModel, undefined, availableModels, ctx.currentModelProvider, { scope: ctx.modelScope }).map((candidate) =>\n\t\t\t\t\t\t\tapplyThinkingSuffix(candidate, effectiveThinking, params.thinkingOverride !== undefined),\n\t\t\t\t\t\t),\n\t\t\t\t\t\tsystemPrompt,\n\t\t\t\t\t\tsystemPromptMode: \"append\",\n\t\t\t\t\t\tinheritProjectContext: true,\n\t\t\t\t\t\tinheritSkills: false,\n\t\t\t\t\t\tskills: resolvedSkills.map((r) => r.name),\n\t\t\t\t\t\toutputPath,\n\t\t\t\t\t\toutputMode,\n\t\t\t\t\t\tsessionFile,\n\t\t\t\t\t\tmaxSubagentDepth,\n\t\t\t\t\t\twaitToolEnabled: params.waitToolEnabled,\n\t\t\t\t\t\teffectiveAcceptance: resolvedAcceptance,\n\t\t\t\t\t\t...(resolvedToolBudget.budget ? { toolBudget: resolvedToolBudget.budget } : {}),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tresultPath: inheritedNestedRoute ? nestedResultsPath(inheritedNestedRoute.rootRunId, id) : path.join(RESULTS_DIR, `${id}.json`),\n\t\t\t\tcwd: runnerCwd,\n\t\t\t\tplaceholder: \"{previous}\",\n\t\t\t\tmaxOutput,\n\t\t\t\tartifactsDir: artifactConfig.enabled ? artifactsDir : undefined,\n\t\t\t\tartifactConfig,\n\t\t\t\tshare: shareEnabled,\n\t\t\t\tsessionDir: resolvedSessionDir,\n\t\t\t\tasyncDir,\n\t\t\t\tsessionId: ctx.currentSessionId,\n\t\t\t\tpiPackageRoot,\n\t\t\t\tpiArgv1: process.argv[1],\n\t\t\t\tworktreeSetupHook,\n\t\t\t\tworktreeSetupHookTimeoutMs,\n\t\t\t\tworktreeBaseDir,\n\t\t\t\tcontrolConfig,\n\t\t\t\ttimeoutMs,\n\t\t\t\tdeadlineAt,\n\t\t\t\tturnBudget: params.turnBudget,\n\t\t\t\ttoolBudget: params.toolBudget,\n\t\t\t\tcontrolIntercomTarget,\n\t\t\t\tchildIntercomTargets: childIntercomTarget ? [childIntercomTarget(spec.childId, 0)] : undefined,\n\t\t\t\tresultMode: \"single\",\n\t\t\t\t...(params.revivalLease ? { revivalLease: params.revivalLease } : {}),\n\t\t\t\tnestedRoute: nestedRoute ?? inheritedNestedRoute,\n\t\t\t\tnestedSelf: inheritedNestedRoute && nestedAddress ? {\n\t\t\t\t\tparentRunId: nestedAddress.parentRunId,\n\t\t\t\t\tparentStepIndex: nestedAddress.parentStepIndex,\n\t\t\t\t\tdepth: nestedAddress.depth,\n\t\t\t\t\tpath: nestedAddress.path,\n\t\t\t\t} : undefined,\n\t\t\t},\n\t\t\tid,\n\t\t\trunnerCwd,\n\t\t);\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\treturn formatAsyncStartError(\"single\", `Failed to start async run '${id}': ${message}`);\n\t}\n\n\tif (spawnResult.error) {\n\t\treturn formatAsyncStartError(\"single\", `Failed to start async run '${id}': ${spawnResult.error}`);\n\t}\n\n\tif (spawnResult.pid) {\n\t\tif (inheritedNestedRoute && nestedAddress) {\n\t\t\tconst now = Date.now();\n\t\t\ttry {\n\t\t\t\twriteNestedEvent(inheritedNestedRoute, {\n\t\t\t\t\ttype: \"subagent.nested.started\",\n\t\t\t\t\tts: now,\n\t\t\t\t\tparentRunId: nestedAddress.parentRunId,\n\t\t\t\t\tparentStepIndex: nestedAddress.parentStepIndex,\n\t\t\t\t\tchild: {\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tparentRunId: nestedAddress.parentRunId,\n\t\t\t\t\t\tparentStepIndex: nestedAddress.parentStepIndex,\n\t\t\t\t\t\tdepth: nestedAddress.depth,\n\t\t\t\t\t\tpath: nestedAddress.path,\n\t\t\t\t\t\tasyncDir,\n\t\t\t\t\t\tpid: spawnResult.pid,\n\t\t\t\t\t\townerIntercomTarget: process.env.PI_SUBAGENT_INTERCOM_SESSION_NAME,\n\t\t\t\t\t\tleafIntercomTarget: childIntercomTarget?.(agent, 0),\n\t\t\t\t\t\tintercomTarget: childIntercomTarget?.(agent, 0),\n\t\t\t\t\t\townerState: \"live\",\n\t\t\t\t\t\tmode: \"single\",\n\t\t\t\t\t\tstate: \"running\",\n\t\t\t\t\t\tagent,\n\t\t\t\t\t\tagents: [agent],\n\t\t\t\t\t\tchainStepCount: 1,\n\t\t\t\t\t\t...(timeoutMs !== undefined ? { timeoutMs, deadlineAt } : {}),\n\t\t\t\t\t\t...(initialTurnBudget ? { turnBudget: initialTurnBudget } : {}),\n\t\t\t\t\t\tstartedAt: now,\n\t\t\t\t\t\tlastUpdate: now,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\"Failed to emit nested async start event:\", error);\n\t\t\t}\n\t\t}\n\t\tctx.pi.events.emit(SUBAGENT_ASYNC_STARTED_EVENT, {\n\t\t\tlifecycleArtifactVersion: SUBAGENT_LIFECYCLE_ARTIFACT_VERSION,\n\t\t\tid,\n\t\t\tpid: spawnResult.pid,\n\t\t\tsessionId: ctx.currentSessionId,\n\t\t\tmode: \"single\",\n\t\t\tagent,\n\t\t\ttask: task?.slice(0, 50),\n\t\t\tgoal: (params.goal ?? task).slice(0, 120),\n\t\t\tcwd: runnerCwd,\n\t\t\tasyncDir,\n\t\t\t...(timeoutMs !== undefined ? { timeoutMs, deadlineAt } : {}),\n\t\t\t...(initialTurnBudget ? { turnBudget: initialTurnBudget } : {}),\n\t\t\tnestedRoute,\n\t\t});\n\t}\n\n\treturn {\n\t\tcontent: [{ type: \"text\", text: formatAsyncStartedMessage(`Async: ${agent} [${id}]`) }],\n\t\tdetails: { mode: \"single\", runId: id, results: [], asyncId: id, asyncDir, ...(timeoutMs !== undefined ? { timeoutMs, deadlineAt } : {}), ...(params.turnBudget ? { turnBudget: params.turnBudget } : {}), ...(params.toolBudget ? { toolBudget: params.toolBudget } : {}) },\n\t};\n}\n"]}
|
|
@@ -16,7 +16,7 @@ import { buildChainInstructions, isDynamicParallelStep, isParallelStep, resolveS
|
|
|
16
16
|
import { resolvePiPackageRoot } from "../shared/pi-spawn.js";
|
|
17
17
|
import { buildSkillInjection, normalizeSkillInput, resolveSkillsWithFallback } from "../../agents/skills.js";
|
|
18
18
|
import { PI_CODING_AGENT_PACKAGE_ROOT_ENV, resolveChildCwd } from "../../shared/utils.js";
|
|
19
|
-
import { buildModelCandidates, resolveEffectiveSubagentModel, resolveSubagentModelOverride } from "../shared/model-fallback.js";
|
|
19
|
+
import { buildModelCandidates, resolveEffectiveSubagentModel, resolveSubagentModelOverride, resolveTierModelOverride } from "../shared/model-fallback.js";
|
|
20
20
|
import { resolveEffectiveThinking } from "../../shared/model-info.js";
|
|
21
21
|
import { resolveExpectedWorktreeAgentCwd } from "../shared/worktree.js";
|
|
22
22
|
import { buildWorkflowGraphSnapshot } from "../shared/workflow-graph.js";
|
|
@@ -437,7 +437,7 @@ export function buildAsyncRunnerSteps(id, params) {
|
|
|
437
437
|
const task = namespaceOutputPath ? taskText : injectSingleOutputInstruction(taskText, outputPath, {
|
|
438
438
|
tools: spec.effectivePermissions === "read-only" ? ["read", "grep", "find", "ls", "bash"] : undefined,
|
|
439
439
|
});
|
|
440
|
-
const primaryModel = resolveEffectiveSubagentModel(spec.model, undefined, ctx.currentModel, availableModels, ctx.currentModelProvider, { scope: ctx.modelScope });
|
|
440
|
+
const primaryModel = resolveEffectiveSubagentModel(spec.model ?? resolveTierModelOverride(spec.tier), undefined, ctx.currentModel, availableModels, ctx.currentModelProvider, { scope: ctx.modelScope });
|
|
441
441
|
const thinkingOverride = flatIndex === undefined ? undefined : thinkingOverridesByFlatIndex?.[flatIndex];
|
|
442
442
|
const effectiveThinking = thinkingOverride;
|
|
443
443
|
const model = applyThinkingSuffix(primaryModel, effectiveThinking, thinkingOverride !== undefined);
|
|
@@ -456,6 +456,7 @@ export function buildAsyncRunnerSteps(id, params) {
|
|
|
456
456
|
cwd: stepCwd,
|
|
457
457
|
model,
|
|
458
458
|
thinking: resolveEffectiveThinking(model, effectiveThinking),
|
|
459
|
+
...(spec.modelSelection ? { modelSelection: spec.modelSelection } : {}),
|
|
459
460
|
modelCandidates: buildModelCandidates(primaryModel, undefined, availableModels, ctx.currentModelProvider, { scope: ctx.modelScope }).map((candidate) => applyThinkingSuffix(candidate, effectiveThinking, thinkingOverride !== undefined)),
|
|
460
461
|
systemPrompt,
|
|
461
462
|
systemPromptMode: "append",
|
|
@@ -896,6 +897,7 @@ export function executeAsyncSingle(id, params) {
|
|
|
896
897
|
cwd: runnerCwd,
|
|
897
898
|
...(model ? { model } : {}),
|
|
898
899
|
...(effectiveThinking ? { thinking: resolveEffectiveThinking(model, effectiveThinking) } : {}),
|
|
900
|
+
...(spec.modelSelection ? { modelSelection: spec.modelSelection } : {}),
|
|
899
901
|
...(resolvedSkills.length ? { skills: resolvedSkills.map((skill) => skill.name) } : {}),
|
|
900
902
|
...(outputPath ? { outputPath } : {}),
|
|
901
903
|
outputMode,
|
|
@@ -933,6 +935,7 @@ export function executeAsyncSingle(id, params) {
|
|
|
933
935
|
cwd: runnerCwd,
|
|
934
936
|
model,
|
|
935
937
|
thinking: resolveEffectiveThinking(model, effectiveThinking),
|
|
938
|
+
...(spec.modelSelection ? { modelSelection: spec.modelSelection } : {}),
|
|
936
939
|
modelCandidates: buildModelCandidates(primaryModel, undefined, availableModels, ctx.currentModelProvider, { scope: ctx.modelScope }).map((candidate) => applyThinkingSuffix(candidate, effectiveThinking, params.thinkingOverride !== undefined)),
|
|
937
940
|
systemPrompt,
|
|
938
941
|
systemPromptMode: "append",
|