@narumitw/pi-subagents 2.0.6 → 2.1.0
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/README.md +152 -50
- package/dist/chunks/{auto-transport-SY2VHUFH.ts → auto-transport-FUUKFDIG.ts} +6 -6
- package/dist/chunks/{capability-grant-CGEWOEKE.ts → capability-grant-PR72SWWS.ts} +4 -4
- package/dist/chunks/{chunk-DPPVEQAM.ts → chunk-4AQSF7AS.ts} +1 -1
- package/dist/chunks/chunk-4AQSF7AS.ts.map +7 -0
- package/dist/chunks/chunk-6H6TBBED.ts +108 -0
- package/dist/chunks/chunk-6H6TBBED.ts.map +7 -0
- package/dist/chunks/{chunk-DSOOH73Y.ts → chunk-7AAJEUSL.ts} +3 -3
- package/dist/chunks/{chunk-DSOOH73Y.ts.map → chunk-7AAJEUSL.ts.map} +2 -2
- package/dist/chunks/{chunk-7QPPBBXZ.ts → chunk-D4CR7T73.ts} +21 -3
- package/dist/chunks/chunk-D4CR7T73.ts.map +7 -0
- package/dist/chunks/{chunk-434NII74.ts → chunk-DIHBUR2E.ts} +54 -8
- package/dist/chunks/chunk-DIHBUR2E.ts.map +7 -0
- package/dist/chunks/{chunk-NIF42QMF.ts → chunk-FEVPWRMU.ts} +7 -4
- package/dist/chunks/chunk-FEVPWRMU.ts.map +7 -0
- package/dist/chunks/{chunk-YBUWBRF7.ts → chunk-FXI45N3J.ts} +5 -5
- package/dist/chunks/{chunk-S2IWVK3J.ts → chunk-ILEQ27AL.ts} +3 -2
- package/dist/chunks/chunk-ILEQ27AL.ts.map +7 -0
- package/dist/chunks/{chunk-DQMN4OYM.ts → chunk-ITVWPNU4.ts} +12 -106
- package/dist/chunks/chunk-ITVWPNU4.ts.map +7 -0
- package/dist/chunks/{chunk-QDVGH2X7.ts → chunk-IWC32VPY.ts} +2 -1
- package/dist/chunks/{chunk-QDVGH2X7.ts.map → chunk-IWC32VPY.ts.map} +2 -2
- package/dist/chunks/{chunk-I2FAK44T.ts → chunk-JSZIP73U.ts} +48 -10
- package/dist/chunks/chunk-JSZIP73U.ts.map +7 -0
- package/dist/chunks/{chunk-ZHTNCZIA.ts → chunk-JU6LUNLP.ts} +2 -2
- package/dist/chunks/{chunk-PSK43Y6A.ts → chunk-LASD73CM.ts} +2 -2
- package/dist/chunks/{chunk-C4L6P266.ts → chunk-LEOYDZI3.ts} +1 -1
- package/dist/chunks/{chunk-C4L6P266.ts.map → chunk-LEOYDZI3.ts.map} +2 -2
- package/dist/chunks/{chunk-H3BFJ7HJ.ts → chunk-LL4LP2T7.ts} +5 -5
- package/dist/chunks/chunk-N2T5IN4X.ts +18 -0
- package/dist/chunks/chunk-N2T5IN4X.ts.map +7 -0
- package/dist/chunks/{chunk-G3RSMSXJ.ts → chunk-NTRPLF46.ts} +1 -1
- package/dist/chunks/chunk-NTRPLF46.ts.map +7 -0
- package/dist/chunks/{chunk-CBP76ARQ.ts → chunk-PABJJYP6.ts} +174 -47
- package/dist/chunks/chunk-PABJJYP6.ts.map +7 -0
- package/dist/chunks/{chunk-EFBPISNT.ts → chunk-PBZMBTNJ.ts} +104 -103
- package/dist/chunks/chunk-PBZMBTNJ.ts.map +7 -0
- package/dist/chunks/{chunk-SCZ33MYW.ts → chunk-PGLSFLYW.ts} +2 -2
- package/dist/chunks/{chunk-O4VO6JUJ.ts → chunk-TM2R67J3.ts} +3 -3
- package/dist/chunks/{chunk-QBORTI4W.ts → chunk-TMZRHIIK.ts} +32 -3
- package/dist/chunks/chunk-TMZRHIIK.ts.map +7 -0
- package/dist/chunks/chunk-TZ34IQ3M.ts +59 -0
- package/dist/chunks/chunk-TZ34IQ3M.ts.map +7 -0
- package/dist/chunks/chunk-VBDGNNLM.ts +214 -0
- package/dist/chunks/chunk-VBDGNNLM.ts.map +7 -0
- package/dist/chunks/{chunk-7OBINKFM.ts → chunk-VDG7LTYE.ts} +11 -11
- package/dist/chunks/chunk-VDG7LTYE.ts.map +7 -0
- package/dist/chunks/{chunk-AEUYS7JC.ts → chunk-X4NMONPE.ts} +1 -1
- package/dist/chunks/chunk-X4NMONPE.ts.map +7 -0
- package/dist/chunks/{chunk-HKC4ES4B.ts → chunk-YPJEN6NU.ts} +2 -2
- package/dist/chunks/{completion-delivery-YPOWSSV3.ts → completion-delivery-JVLNQRWX.ts} +5 -4
- package/dist/chunks/{config-status-J4GPWP46.ts → config-status-FKGDECZ3.ts} +7 -6
- package/dist/chunks/{config-ui-2YUCUEBM.ts → config-ui-DDKERQHI.ts} +297 -231
- package/dist/chunks/config-ui-DDKERQHI.ts.map +7 -0
- package/dist/chunks/{consult-IV7UBNQQ.ts → consult-PQ6PRAKC.ts} +14 -13
- package/dist/chunks/consult-PQ6PRAKC.ts.map +7 -0
- package/dist/chunks/{create-stateful-transport-ZP3IXNV3.ts → create-stateful-transport-JWC2EFYL.ts} +6 -6
- package/dist/chunks/{delegation-contract-WJPT4FVS.ts → delegation-contract-LA56I5DT.ts} +2 -2
- package/dist/chunks/{discovery-K25T3SH4.ts → discovery-MIFB2U4Y.ts} +3 -3
- package/dist/chunks/{execution-LA7HN5YF.ts → execution-Q2JZLKJA.ts} +19 -16
- package/dist/chunks/execution-Q2JZLKJA.ts.map +7 -0
- package/dist/chunks/{in-process-transport-4RF3J6XK.ts → in-process-transport-HJ6TZXC3.ts} +9 -9
- package/dist/chunks/{inspect-XV2QALMR.ts → inspect-UH2TKH6E.ts} +25 -10
- package/dist/chunks/inspect-UH2TKH6E.ts.map +7 -0
- package/dist/chunks/{persistence-VSGXAW4P.ts → persistence-XHPJBZL7.ts} +11 -7
- package/dist/chunks/persistence-XHPJBZL7.ts.map +7 -0
- package/dist/chunks/{registry-E6XPJB7L.ts → registry-XDXPECWF.ts} +136 -15
- package/dist/chunks/registry-XDXPECWF.ts.map +7 -0
- package/dist/chunks/{retained-semantic-state-7WXSGRJU.ts → retained-semantic-state-GM75FZGE.ts} +3 -3
- package/dist/chunks/{rpc-transport-NEHBHWX4.ts → rpc-transport-7R7DVCEB.ts} +12 -16
- package/dist/chunks/rpc-transport-7R7DVCEB.ts.map +7 -0
- package/dist/chunks/{spawn-idempotency-QGHO2WKC.ts → spawn-idempotency-BNHOSMZW.ts} +2 -2
- package/dist/chunks/{subprocess-transport-NSHOGDC4.ts → subprocess-transport-VHZJRBTW.ts} +15 -14
- package/dist/chunks/subprocess-transport-VHZJRBTW.ts.map +7 -0
- package/dist/chunks/usage-recording-store-CW3EH2SZ.ts +164 -0
- package/dist/chunks/usage-recording-store-CW3EH2SZ.ts.map +7 -0
- package/dist/index.ts +427 -30
- package/dist/index.ts.map +3 -3
- package/docs/async-runtime-protocol.md +69 -0
- package/docs/implementation-notes/pi-subagents-capability-matrix.md +62 -0
- package/docs/implementation-notes/pi-subagents-current-direction.md +99 -0
- package/docs/implementation-notes/pi-subagents-rpc-v1.md +153 -0
- package/docs/pi-subagents-diagrams.md +183 -0
- package/package.json +9 -8
- package/src/agents/types.ts +2 -0
- package/src/async-subagent-benchmark.ts +532 -0
- package/src/completion-delivery.ts +71 -4
- package/src/completion-render.ts +1 -0
- package/src/completion-requirement.ts +308 -0
- package/src/config-registration.ts +5 -5
- package/src/config-status.ts +66 -70
- package/src/config-ui.ts +244 -150
- package/src/consult-resources.ts +1 -1
- package/src/consult.ts +3 -8
- package/src/delegation-contract.ts +55 -9
- package/src/execution-plan.ts +1 -1
- package/src/execution-ui.ts +40 -29
- package/src/execution.ts +2 -3
- package/src/inspect.ts +24 -1
- package/src/orchestration-metrics.ts +1 -1
- package/src/panel-execution.ts +2 -3
- package/src/panel-failure.ts +1 -1
- package/src/panel-render.ts +1 -1
- package/src/parallel-limit-ui.ts +6 -5
- package/src/params.ts +2 -1
- package/src/persistence.ts +9 -0
- package/src/process-control.ts +43 -0
- package/src/registry-types.ts +5 -0
- package/src/registry.ts +162 -18
- package/src/render.ts +2 -1
- package/src/rpc-transport.ts +1 -1
- package/src/runner-outcome.ts +1 -1
- package/src/runner-result.ts +1 -1
- package/src/runner-types.ts +102 -0
- package/src/runner.ts +11 -192
- package/src/settings/inspection.ts +27 -0
- package/src/settings/schema.ts +9 -0
- package/src/settings-reader.ts +7 -0
- package/src/settings.ts +20 -0
- package/src/spawn-idempotency.ts +5 -0
- package/src/stateful-agent-view.ts +15 -19
- package/src/stateful-guidance.ts +14 -4
- package/src/stateful-limit-ui.ts +23 -20
- package/src/stateful-limits.ts +10 -10
- package/src/stateful-registration.ts +126 -9
- package/src/stateful-render.ts +27 -2
- package/src/subagent-details.ts +43 -0
- package/src/subagents-extension.ts +66 -8
- package/src/subagents.ts +2 -0
- package/src/subprocess-transport.ts +2 -1
- package/src/supervision.ts +2 -1
- package/src/timeout-finalization.ts +1 -1
- package/src/tool-schema-compatibility.ts +73 -0
- package/src/transport-types.ts +6 -0
- package/src/transport-ui.ts +18 -46
- package/src/usage-recording-config.ts +13 -0
- package/src/usage-recording-store.ts +183 -0
- package/src/usage-recording.ts +478 -0
- package/src/verification-harness.ts +1 -1
- package/src/workflow-ui.ts +17 -9
- package/dist/chunks/chunk-434NII74.ts.map +0 -7
- package/dist/chunks/chunk-7OBINKFM.ts.map +0 -7
- package/dist/chunks/chunk-7QPPBBXZ.ts.map +0 -7
- package/dist/chunks/chunk-AEUYS7JC.ts.map +0 -7
- package/dist/chunks/chunk-CBP76ARQ.ts.map +0 -7
- package/dist/chunks/chunk-DPPVEQAM.ts.map +0 -7
- package/dist/chunks/chunk-DQMN4OYM.ts.map +0 -7
- package/dist/chunks/chunk-EFBPISNT.ts.map +0 -7
- package/dist/chunks/chunk-G3RSMSXJ.ts.map +0 -7
- package/dist/chunks/chunk-I2FAK44T.ts.map +0 -7
- package/dist/chunks/chunk-NIF42QMF.ts.map +0 -7
- package/dist/chunks/chunk-QBORTI4W.ts.map +0 -7
- package/dist/chunks/chunk-S2IWVK3J.ts.map +0 -7
- package/dist/chunks/config-ui-2YUCUEBM.ts.map +0 -7
- package/dist/chunks/consult-IV7UBNQQ.ts.map +0 -7
- package/dist/chunks/execution-LA7HN5YF.ts.map +0 -7
- package/dist/chunks/inspect-XV2QALMR.ts.map +0 -7
- package/dist/chunks/persistence-VSGXAW4P.ts.map +0 -7
- package/dist/chunks/registry-E6XPJB7L.ts.map +0 -7
- package/dist/chunks/rpc-transport-NEHBHWX4.ts.map +0 -7
- package/dist/chunks/subprocess-transport-NSHOGDC4.ts.map +0 -7
- /package/dist/chunks/{auto-transport-SY2VHUFH.ts.map → auto-transport-FUUKFDIG.ts.map} +0 -0
- /package/dist/chunks/{capability-grant-CGEWOEKE.ts.map → capability-grant-PR72SWWS.ts.map} +0 -0
- /package/dist/chunks/{chunk-YBUWBRF7.ts.map → chunk-FXI45N3J.ts.map} +0 -0
- /package/dist/chunks/{chunk-ZHTNCZIA.ts.map → chunk-JU6LUNLP.ts.map} +0 -0
- /package/dist/chunks/{chunk-PSK43Y6A.ts.map → chunk-LASD73CM.ts.map} +0 -0
- /package/dist/chunks/{chunk-H3BFJ7HJ.ts.map → chunk-LL4LP2T7.ts.map} +0 -0
- /package/dist/chunks/{chunk-SCZ33MYW.ts.map → chunk-PGLSFLYW.ts.map} +0 -0
- /package/dist/chunks/{chunk-O4VO6JUJ.ts.map → chunk-TM2R67J3.ts.map} +0 -0
- /package/dist/chunks/{chunk-HKC4ES4B.ts.map → chunk-YPJEN6NU.ts.map} +0 -0
- /package/dist/chunks/{completion-delivery-YPOWSSV3.ts.map → completion-delivery-JVLNQRWX.ts.map} +0 -0
- /package/dist/chunks/{config-status-J4GPWP46.ts.map → config-status-FKGDECZ3.ts.map} +0 -0
- /package/dist/chunks/{create-stateful-transport-ZP3IXNV3.ts.map → create-stateful-transport-JWC2EFYL.ts.map} +0 -0
- /package/dist/chunks/{delegation-contract-WJPT4FVS.ts.map → delegation-contract-LA56I5DT.ts.map} +0 -0
- /package/dist/chunks/{discovery-K25T3SH4.ts.map → discovery-MIFB2U4Y.ts.map} +0 -0
- /package/dist/chunks/{in-process-transport-4RF3J6XK.ts.map → in-process-transport-HJ6TZXC3.ts.map} +0 -0
- /package/dist/chunks/{retained-semantic-state-7WXSGRJU.ts.map → retained-semantic-state-GM75FZGE.ts.map} +0 -0
- /package/dist/chunks/{spawn-idempotency-QGHO2WKC.ts.map → spawn-idempotency-BNHOSMZW.ts.map} +0 -0
package/dist/index.ts.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/subagents-extension.ts", "../src/config-registration.ts", "../src/render.ts", "../src/panel-render.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Subagent Tool - Delegate tasks to specialized agents\n *\n * Spawns a separate `pi` process for each subagent invocation,\n * giving it an isolated context window.\n *\n * Supports blocking single, parallel, chain, workflow, and panel modes.\n *\n * Uses JSON mode to capture structured output from subagents.\n */\n\nimport {\n\tCONFIG_DIR_NAME,\n\ttype ExtensionAPI,\n\ttype ToolDefinition,\n} from \"@earendil-works/pi-coding-agent\";\nimport { discoverAgentCatalog, formatAgentCatalog } from \"./agents/catalog.js\";\nimport type {\n\tConsultationCwdPolicy,\n\tConsultResourcePolicy,\n\tDelegationCwdPolicy,\n\tSubagentSettings,\n} from \"./agents/types.js\";\nimport { cachedModuleLoader, throwIfAborted } from \"./cached-module-loader.js\";\nimport { renderCompletionMessage, SUBAGENT_COMPLETION_MESSAGE_TYPE } from \"./completion-render.js\";\nimport {\n\ttype ConfigRegistrationDependencies,\n\tregisterSubagentConfigCommand,\n\tregisterSubagentConfigLifecycle,\n} from \"./config-registration.js\";\nimport {\n\ttype ConsultRegistrationDependencies,\n\tregisterSubagentConsult,\n} from \"./consult-registration.js\";\nimport {\n\ttype InspectRegistrationDependencies,\n\tregisterSubagentInspect,\n} from \"./inspect-registration.js\";\nimport { MAX_BLOCKING_PARALLEL_CONCURRENCY } from \"./limits.js\";\nimport { SubagentParams } from \"./params.js\";\nimport { renderSubagentCall, renderSubagentResult } from \"./render.js\";\nimport type { SubagentDetails } from \"./runner.js\";\nimport {\n\tconsumeSubagentSettingsNotice,\n\tDEFAULT_CONSULT_RESOURCE_POLICY,\n\tDEFAULT_CONSULTATION_CWD_POLICY,\n\tDEFAULT_DELEGATION_CWD_POLICY,\n\tinspectSubagentSettings,\n\treadSubagentSettings,\n\tresolveBlockingMaxParallelTasks,\n} from \"./settings-reader.js\";\nimport { registerStatefulSubagents } from \"./stateful-registration.js\";\nimport type { SubagentTransport } from \"./transport.js\";\n\ntype BlockingExecutionModule = Pick<typeof import(\"./execution.js\"), \"executeSubagent\">;\n\nexport interface SubagentsDependencies {\n\tloadBlockingExecution?: () => Promise<BlockingExecutionModule>;\n\tloadStatefulTransport?: () => Promise<SubagentTransport>;\n\tconfig?: ConfigRegistrationDependencies;\n\tconsult?: ConsultRegistrationDependencies;\n\tinspect?: InspectRegistrationDependencies;\n}\n\nexport default function (pi: ExtensionAPI, dependencies: SubagentsDependencies = {}) {\n\tpi.registerMessageRenderer(SUBAGENT_COMPLETION_MESSAGE_TYPE, renderCompletionMessage);\n\tconst loadBlockingExecution = cachedModuleLoader(\n\t\tdependencies.loadBlockingExecution ?? (() => import(\"./execution.js\")),\n\t);\n\tconst configOwner = registerSubagentConfigLifecycle(pi);\n\tconst settings = readSubagentSettings();\n\tlet currentSettings: SubagentSettings | undefined = settings;\n\tlet currentCatalog = \"\";\n\tconst blockingEnabled = settings?.blocking?.enabled !== false;\n\tconst refreshBlockingCatalog = blockingEnabled\n\t\t? registerBlockingSubagent(pi, () => currentSettings, loadBlockingExecution)\n\t\t: () => undefined;\n\tlet refreshStatefulCatalog: (catalog: string) => void = () => undefined;\n\tlet refreshConsultCatalog: (catalog: string) => void = () => undefined;\n\n\tpi.on(\"session_start\", (_event, ctx) => {\n\t\t// Preserve a one-shot migration notice from extension load while refreshing\n\t\t// validation against settings that may have changed before this session.\n\t\tconst loadNotice = consumeSubagentSettingsNotice();\n\t\tconst refreshedSettings = readSubagentSettings();\n\t\tconst refreshedNotice = consumeSubagentSettingsNotice();\n\t\tif (!inspectSubagentSettings().error) currentSettings = refreshedSettings;\n\t\tconst notice = [\n\t\t\t...new Set([loadNotice, refreshedNotice].filter((value) => value !== undefined)),\n\t\t].join(\"\\n\");\n\t\tif (notice) ctx.ui.notify(notice, \"warning\");\n\n\t\tcurrentCatalog = formatAgentCatalog(\n\t\t\tdiscoverAgentCatalog(ctx.cwd, ctx.isProjectTrusted(), refreshedSettings),\n\t\t).text;\n\t\trefreshBlockingCatalog(currentCatalog);\n\t\trefreshStatefulCatalog(currentCatalog);\n\t\trefreshConsultCatalog(currentCatalog);\n\t});\n\n\tconst statefulRuntime = registerStatefulSubagents(pi, {\n\t\tblockingEnabled,\n\t\tsettings: settings?.stateful,\n\t\tgetSettings: () => currentSettings,\n\t\tloadTransport: dependencies.loadStatefulTransport,\n\t});\n\trefreshStatefulCatalog = statefulRuntime.setAgentCatalog;\n\tconst getBlockingEnabled = () => blockingEnabled;\n\tconst getMaxParallelTasks = () => resolveBlockingMaxParallelTasks(currentSettings);\n\tconst getConsultResourcePolicy = () =>\n\t\tcurrentSettings?.consult?.resources ?? DEFAULT_CONSULT_RESOURCE_POLICY;\n\tconst getConsultationCwdPolicy = () =>\n\t\tcurrentSettings?.cwdPolicy?.consultation ?? DEFAULT_CONSULTATION_CWD_POLICY;\n\tconst getDelegationCwdPolicy = () =>\n\t\tcurrentSettings?.cwdPolicy?.delegation ?? DEFAULT_DELEGATION_CWD_POLICY;\n\tregisterSubagentInspect(\n\t\tpi,\n\t\t{\n\t\t\t...statefulRuntime,\n\t\t\tgetBlockingEnabled,\n\t\t\tgetMaxParallelTasks,\n\t\t\tgetConsultResourcePolicy,\n\t\t\tgetConsultationCwdPolicy,\n\t\t\tgetDelegationCwdPolicy,\n\t\t},\n\t\tdependencies.inspect,\n\t);\n\tif (blockingEnabled) {\n\t\trefreshConsultCatalog = registerSubagentConsult(\n\t\t\tpi,\n\t\t\t{ getSettings: () => currentSettings },\n\t\t\tdependencies.consult,\n\t\t);\n\t}\n\tregisterSubagentConfigCommand(\n\t\tpi,\n\t\t{\n\t\t\t...statefulRuntime,\n\t\t\tgetBlockingEnabled,\n\t\t\tgetMaxParallelTasks,\n\t\t\tgetConsultResourcePolicy,\n\t\t\tgetConsultationCwdPolicy,\n\t\t\tgetDelegationCwdPolicy,\n\t\t\tsetMaxParallelTasks(value: number) {\n\t\t\t\tconst previousSettings = currentSettings;\n\t\t\t\tcurrentSettings = {\n\t\t\t\t\t...(currentSettings ?? {}),\n\t\t\t\t\tblocking: { ...(currentSettings?.blocking ?? {}), maxParallelTasks: value },\n\t\t\t\t};\n\t\t\t\ttry {\n\t\t\t\t\trefreshBlockingCatalog(currentCatalog);\n\t\t\t\t} catch (applyError) {\n\t\t\t\t\tcurrentSettings = previousSettings;\n\t\t\t\t\ttry {\n\t\t\t\t\t\trefreshBlockingCatalog(currentCatalog);\n\t\t\t\t\t} catch (rollbackError) {\n\t\t\t\t\t\tthrow new AggregateError(\n\t\t\t\t\t\t\t[applyError, rollbackError],\n\t\t\t\t\t\t\t\"Failed to apply and roll back the parallel-worker limit\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tthrow applyError;\n\t\t\t\t}\n\t\t\t},\n\t\t\tsetConsultResourcePolicy(value: ConsultResourcePolicy) {\n\t\t\t\tcurrentSettings = {\n\t\t\t\t\t...(currentSettings ?? {}),\n\t\t\t\t\tconsult: { ...(currentSettings?.consult ?? {}), resources: value },\n\t\t\t\t};\n\t\t\t\trefreshConsultCatalog(currentCatalog);\n\t\t\t},\n\t\t\tsetConsultationCwdPolicy(value: ConsultationCwdPolicy) {\n\t\t\t\tcurrentSettings = {\n\t\t\t\t\t...(currentSettings ?? {}),\n\t\t\t\t\tcwdPolicy: { ...(currentSettings?.cwdPolicy ?? {}), consultation: value },\n\t\t\t\t};\n\t\t\t\trefreshConsultCatalog(currentCatalog);\n\t\t\t},\n\t\t\tsetDelegationCwdPolicy(value: DelegationCwdPolicy) {\n\t\t\t\tcurrentSettings = {\n\t\t\t\t\t...(currentSettings ?? {}),\n\t\t\t\t\tcwdPolicy: { ...(currentSettings?.cwdPolicy ?? {}), delegation: value },\n\t\t\t\t};\n\t\t\t\trefreshBlockingCatalog(currentCatalog);\n\t\t\t\tstatefulRuntime.refreshSettingsGuidance();\n\t\t\t},\n\t\t},\n\t\tconfigOwner,\n\t\tdependencies.config,\n\t);\n}\n\nfunction registerBlockingSubagent(\n\tpi: ExtensionAPI,\n\tgetSettings: () => SubagentSettings | undefined,\n\tloadExecution: () => Promise<BlockingExecutionModule>,\n): (catalog: string) => void {\n\tlet catalog = \"\";\n\tconst activeControllers = new Set<AbortController>();\n\tconst activeWork = new Set<Promise<unknown>>();\n\tconst cancelAndWaitForWork = async (reason: string) => {\n\t\tfor (const controller of activeControllers) {\n\t\t\tcontroller.abort(new DOMException(reason, \"AbortError\"));\n\t\t}\n\t\tawait Promise.allSettled([...activeWork]);\n\t};\n\tpi.on(\"session_start\", () => cancelAndWaitForWork(\"Blocking subagent session replaced\"));\n\tpi.on(\"session_shutdown\", () => cancelAndWaitForWork(\"Blocking subagent session shut down\"));\n\tconst baseDescription = () =>\n\t\t[\n\t\t\t\"Run specialized subagents as a blocking operation with isolated contexts.\",\n\t\t\t\"The call blocks the main agent until every worker and optional aggregator finishes, so queued steering waits.\",\n\t\t\t\"Modes: single (agent + task), parallel (tasks array), chain (sequential with {previous} placeholder), workflow (named dependency tasks with optional capability routing), or panel (independent reviewers plus evidence-preserving synthesis).\",\n\t\t\t\"Parallel mode may include an aggregator fan-in step; workflow mode validates dependencies, authority, artifacts, scope conflicts, retries, and hedging before scheduling. Use subagent_consult instead for one synchronous child that must be executor-constrained to read-only tools.\",\n\t\t\t'Default agent scope is \"user\" (from ~/.pi/agent/agents).',\n\t\t\t`To enable project-local agents in ${CONFIG_DIR_NAME}/agents, pass agentScope: \"both\" (or \"project\") as a top-level argument for that call.`,\n\t\t\t`Maximum parallel worker tasks per call: ${resolveBlockingMaxParallelTasks(getSettings())}. Parallel execution starts at most ${MAX_BLOCKING_PARALLEL_CONCURRENCY} workers at once.`,\n\t\t\t`Working-directory target policy: ${getSettings()?.cwdPolicy?.delegation ?? DEFAULT_DELEGATION_CWD_POLICY}. This controls launch targets and protected project resources, not filesystem access or sandboxing.`,\n\t\t].join(\" \");\n\tconst promptGuidelines = () => [\n\t\t\"Use subagent only when delegation fits; the main agent should decide how many subagents to spawn from task shape instead of waiting for the user to specify a count.\",\n\t\t\"The main agent retains overall planning, immediate critical-path work, integration, final verification, and the final answer.\",\n\t\t\"Use no subagent for simple answers, quick targeted edits, latency-sensitive one-step work, tasks requiring frequent user back-and-forth, or critical-path work the main agent can perform directly.\",\n\t\t\"One ordinary implementation worker should not replace work the main agent can perform directly; use a blocking single only when intentional synchronous isolation or a user-requested specialist justifies waiting.\",\n\t\t\"Keep ordinary planning in the main agent, or use explicit workflow mode when a genuine dependency graph requires caller-authored orchestration.\",\n\t\t\"Keep ordinary review in the main agent with a review skill and deterministic checks; reserve panel mode or custom verifier agents for consequential independent verification.\",\n\t\t\"Use the blocking subagent tool only when delegated outputs are required before the main agent's next action and waiting is intentional; the main agent cannot process queued steering until the call returns.\",\n\t\t\"Use a blocking subagent single, parallel, chain, workflow, panel, or fan-in call only when synchronous context or output isolation is worth making the main agent unavailable while it runs.\",\n\t\t`If a blocking parallel subagent call is genuinely required, keep tasks independent, stay within the configured max ${resolveBlockingMaxParallelTasks(getSettings())}, and avoid write-heavy implementation touching the same files or shared state.`,\n\t\t\"For parallel subagent calls, omit the aggregator key entirely unless a fan-in step is required; do not send null, empty strings, or an empty object for unused optional fields.\",\n\t\t\"Use workflow mode for explicit dependencies or capability routing; declare read/write or ownership scopes, require structured-v2 artifacts when downstream tasks consume them, and use retry or hedging only with the required side-effect contract.\",\n\t\t\"Use panel mode only for consequential review or research that benefits from at least two independent reviewers and one bounded synthesis; agreement is not proof, dissent and blocking objections remain visible, and simple or latency-sensitive work should not use a panel.\",\n\t\t'Do not use subagent with project-local agents unless the user explicitly wants project agents or sets agentScope to \"project\" or \"both\"; keep confirmation enabled for untrusted repositories.',\n\t\t\"When using subagent, write self-contained tasks with file paths, context, expected output, and whether the subagent may edit files.\",\n\t\t\"Set subagent timeoutMs to the shortest realistic work deadline for the task difficulty, just as thinkingLevel should match reasoning difficulty; split oversized tasks instead of extending the deadline merely to compensate for broad scope. Use totalTimeoutMs to cap an entire blocking workflow, idleTimeoutMs for stalled work, and maxTurns or maxToolCalls to stop repeated work without progress. Every budget stop preserves a bounded checkpoint and may make one separately bounded summary attempt.\",\n\t];\n\tconst definition: ToolDefinition<typeof SubagentParams, SubagentDetails> = {\n\t\tname: \"subagent\",\n\t\tlabel: \"Blocking Subagent\",\n\t\tdescription: appendAgentCatalog(baseDescription(), catalog),\n\t\tpromptSnippet:\n\t\t\t\"Run blocking isolated subagents only when their outputs are required before the main agent can continue.\",\n\t\tpromptGuidelines: promptGuidelines(),\n\t\tparameters: SubagentParams,\n\n\t\tasync execute(toolCallId, params, signal, onUpdate, ctx) {\n\t\t\tconst lifecycleController = new AbortController();\n\t\t\tactiveControllers.add(lifecycleController);\n\t\t\tconst effectiveSignal = signal\n\t\t\t\t? AbortSignal.any([signal, lifecycleController.signal])\n\t\t\t\t: lifecycleController.signal;\n\t\t\tconst work = (async () => {\n\t\t\t\tthrowIfAborted(effectiveSignal, \"Blocking subagent execution was cancelled\");\n\t\t\t\tlet executionModule: BlockingExecutionModule;\n\t\t\t\ttry {\n\t\t\t\t\texecutionModule = await loadExecution();\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthrowIfAborted(\n\t\t\t\t\t\teffectiveSignal,\n\t\t\t\t\t\t\"Blocking subagent execution was cancelled while loading\",\n\t\t\t\t\t);\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\tthrowIfAborted(effectiveSignal, \"Blocking subagent execution was cancelled while loading\");\n\t\t\t\treturn executionModule.executeSubagent(\n\t\t\t\t\ttoolCallId,\n\t\t\t\t\tparams,\n\t\t\t\t\teffectiveSignal,\n\t\t\t\t\tonUpdate,\n\t\t\t\t\tctx,\n\t\t\t\t\tgetSettings(),\n\t\t\t\t);\n\t\t\t})();\n\t\t\tactiveWork.add(work);\n\t\t\ttry {\n\t\t\t\treturn await work;\n\t\t\t} finally {\n\t\t\t\tactiveControllers.delete(lifecycleController);\n\t\t\t\tactiveWork.delete(work);\n\t\t\t}\n\t\t},\n\n\t\trenderCall(args, theme) {\n\t\t\treturn renderSubagentCall(args, theme);\n\t\t},\n\n\t\trenderResult(result, options, theme) {\n\t\t\treturn renderSubagentResult(result, options, theme);\n\t\t},\n\t};\n\tpi.registerTool<typeof SubagentParams, SubagentDetails>(definition);\n\tpi.on(\"tool_result\", (event) => {\n\t\tif (event.toolName !== \"subagent\") return;\n\t\tif ((event.details as (SubagentDetails & { isError?: boolean }) | undefined)?.isError)\n\t\t\treturn { isError: true };\n\t});\n\treturn (nextCatalog: string) => {\n\t\tcatalog = nextCatalog;\n\t\tdefinition.description = appendAgentCatalog(baseDescription(), catalog);\n\t\tdefinition.promptGuidelines = promptGuidelines();\n\t\tpi.registerTool<typeof SubagentParams, SubagentDetails>(definition);\n\t};\n}\n\nfunction appendAgentCatalog(baseDescription: string, catalog: string): string {\n\treturn catalog ? `${baseDescription}\\n\\n${catalog}` : baseDescription;\n}\n", "import type { ExtensionAPI } from \"@earendil-works/pi-coding-agent\";\nimport { cachedModuleLoader } from \"./cached-module-loader.js\";\nimport type { SubagentMenuOwner, SubagentSettingsRuntime } from \"./config-ui.js\";\n\nconst SUBCOMMANDS = [\n\t{ value: \"settings\", label: \"settings\", description: \"Configure subagent user settings\" },\n\t{ value: \"status\", label: \"status\", description: \"Show effective subagent settings\" },\n\t{ value: \"help\", label: \"help\", description: \"Show subagent settings help\" },\n];\n\ntype ConfigUiModule = Pick<\n\ttypeof import(\"./config-ui.js\"),\n\t\"showSubagentManager\" | \"showSubagentSettings\"\n>;\n\ntype ConfigStatusModule = Pick<\n\ttypeof import(\"./config-status.js\"),\n\t\"showSubagentHelp\" | \"showSubagentStatus\"\n>;\n\nexport interface ConfigRegistrationDependencies {\n\tloadConfigUi?: () => Promise<ConfigUiModule>;\n\tloadConfigStatus?: () => Promise<ConfigStatusModule>;\n}\n\nexport function registerSubagentConfigLifecycle(pi: ExtensionAPI): SubagentMenuOwner {\n\tconst owner: SubagentMenuOwner = { generation: 0, controller: new AbortController() };\n\tpi.on(\"session_start\", () => {\n\t\towner.generation += 1;\n\t\towner.controller.abort(new DOMException(\"Subagent session replaced\", \"AbortError\"));\n\t\towner.controller = new AbortController();\n\t});\n\tpi.on(\"session_shutdown\", () => {\n\t\towner.generation += 1;\n\t\towner.controller.abort(new DOMException(\"Subagent session shut down\", \"AbortError\"));\n\t});\n\treturn owner;\n}\n\nexport function registerSubagentConfigCommand(\n\tpi: ExtensionAPI,\n\truntime: SubagentSettingsRuntime,\n\towner = registerSubagentConfigLifecycle(pi),\n\tdependencies: ConfigRegistrationDependencies = {},\n): void {\n\tconst loadConfigUi = cachedModuleLoader(\n\t\tdependencies.loadConfigUi ?? (() => import(\"./config-ui.js\")),\n\t);\n\tconst loadConfigStatus = cachedModuleLoader<ConfigStatusModule>(\n\t\tdependencies.loadConfigStatus ?? (() => import(\"./config-status.js\")),\n\t);\n\tpi.registerCommand(\"subagents\", {\n\t\tdescription: \"Manage current-session subagents and user settings\",\n\t\tgetArgumentCompletions(prefix: string) {\n\t\t\tconst normalized = prefix.trim().toLowerCase();\n\t\t\tconst matches = SUBCOMMANDS.filter((item) => item.value.startsWith(normalized));\n\t\t\treturn matches.length > 0 ? matches : null;\n\t\t},\n\t\tasync handler(args, ctx) {\n\t\t\tconst subcommand = args.trim().toLowerCase();\n\t\t\tconst runStatusCommand = async (show: (status: ConfigStatusModule) => void) => {\n\t\t\t\tconst generation = owner.generation;\n\t\t\t\tconst controller = owner.controller;\n\t\t\t\tconst isCurrent = () =>\n\t\t\t\t\tgeneration === owner.generation &&\n\t\t\t\t\tcontroller === owner.controller &&\n\t\t\t\t\t!controller.signal.aborted;\n\t\t\t\tlet status: ConfigStatusModule;\n\t\t\t\ttry {\n\t\t\t\t\tstatus = await loadConfigStatus();\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (!isCurrent()) return;\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\tif (!isCurrent()) return;\n\t\t\t\tshow(status);\n\t\t\t};\n\t\t\tif (!subcommand && ctx.mode !== \"tui\") {\n\t\t\t\tawait runStatusCommand((status) => status.showSubagentStatus(ctx, runtime));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (subcommand === \"status\") {\n\t\t\t\tawait runStatusCommand((status) => status.showSubagentStatus(ctx, runtime));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (subcommand === \"help\") {\n\t\t\t\tawait runStatusCommand((status) => status.showSubagentHelp(ctx, runtime));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!subcommand || subcommand === \"settings\") {\n\t\t\t\tconst generation = owner.generation;\n\t\t\t\tconst controller = owner.controller;\n\t\t\t\tconst isCurrent = () =>\n\t\t\t\t\tgeneration === owner.generation &&\n\t\t\t\t\tcontroller === owner.controller &&\n\t\t\t\t\t!controller.signal.aborted;\n\t\t\t\tlet configUi: ConfigUiModule;\n\t\t\t\ttry {\n\t\t\t\t\tconfigUi = await loadConfigUi();\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (!isCurrent()) return;\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\tif (!isCurrent()) return;\n\t\t\t\tif (!subcommand) await configUi.showSubagentManager(pi, ctx, runtime, owner);\n\t\t\t\telse await configUi.showSubagentSettings(ctx, runtime, owner);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (ctx.mode === \"tui\" || ctx.hasUI) {\n\t\t\t\tctx.ui.notify(`Unknown /subagents subcommand: ${subcommand}`, \"warning\");\n\t\t\t}\n\t\t},\n\t});\n}\n", "import type { AgentToolResult } from \"@earendil-works/pi-agent-core\";\nimport type { Message } from \"@earendil-works/pi-ai\";\nimport {\n\tgetMarkdownTheme,\n\ttype Theme,\n\ttype ThemeColor,\n\ttype ToolRenderResultOptions,\n} from \"@earendil-works/pi-coding-agent\";\nimport { Container, Markdown, Spacer, Text } from \"@earendil-works/pi-tui\";\nimport type { AgentScope } from \"./agents/types.js\";\nimport { renderPanelCall, renderPanelResult } from \"./panel-render.js\";\nimport { hasUsableAggregator, type SubagentParams } from \"./params.js\";\nimport { expansionHint, formatToolActivity, safeBlock, safeLine } from \"./render-common.js\";\nimport type { SingleResult, SubagentDetails } from \"./runner.js\";\nimport { getResultFinalOutput, isResultError } from \"./runner-outcome.js\";\nimport { formatUsageStats } from \"./usage-format.js\";\n\nconst COLLAPSED_ITEM_COUNT = 5;\n\nfunction previewTask(task: unknown, maxLength = 40): string {\n\tconst safe = safeLine(task, \"...\", 2 * 1024);\n\treturn safe.length > maxLength ? `${safe.slice(0, maxLength)}...` : safe;\n}\n\nfunction previewAgent(agent: unknown): string {\n\treturn safeLine(agent, \"...\", 256);\n}\n\nfunction formatResultUsageStats(result: SingleResult): string {\n\treturn formatUsageStats(\n\t\tresult.usage,\n\t\tresult.model,\n\t\tresult.thinkingLevel,\n\t\tresult.actualProvider,\n\t\tresult.actualModel,\n\t);\n}\n\nfunction formatToolCall(\n\ttoolName: string,\n\targs: Record<string, unknown>,\n\tthemeFg: (color: ThemeColor, text: string) => string,\n): string {\n\treturn formatToolActivity(toolName, args, themeFg);\n}\n\ntype DisplayItem =\n\t| { type: \"text\"; text: string }\n\t| { type: \"toolCall\"; name: string; args: Record<string, unknown> };\n\nfunction getDisplayItems(messages: Message[]): DisplayItem[] {\n\tconst items: DisplayItem[] = [];\n\tfor (const msg of messages) {\n\t\tif (msg.role === \"assistant\") {\n\t\t\tfor (const part of msg.content) {\n\t\t\t\tif (part.type === \"text\") {\n\t\t\t\t\tconst text = safeBlock(part.text, \"\", 8 * 1024).trim();\n\t\t\t\t\tif (text) items.push({ type: \"text\", text });\n\t\t\t\t} else if (part.type === \"toolCall\") {\n\t\t\t\t\titems.push({\n\t\t\t\t\t\ttype: \"toolCall\",\n\t\t\t\t\t\tname: safeLine(part.name, \"tool\", 256),\n\t\t\t\t\t\targs: part.arguments,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn items;\n}\nfunction getCollapsedDisplayItems(result: SingleResult): { items: DisplayItem[]; total: number } {\n\tif (result.recentActivity && result.recentActivity.length > 0) {\n\t\treturn {\n\t\t\titems: result.recentActivity,\n\t\t\ttotal: Math.max(result.recentActivity.length, result.recentActivityTotal ?? 0),\n\t\t};\n\t}\n\tconst items = getDisplayItems(result.messages);\n\treturn { items, total: items.length };\n}\n\nfunction sanitizeSingleResultForRender(result: SingleResult): SingleResult {\n\treturn {\n\t\t...result,\n\t\tagent: safeLine(result.agent, \"subagent\", 256),\n\t\ttask: safeBlock(result.task, \"\", 50 * 1024),\n\t\tstderr: safeBlock(result.stderr, \"\", 8 * 1024),\n\t\tmodel: result.model ? safeLine(result.model, \"\", 256) : undefined,\n\t\tactualProvider: result.actualProvider ? safeLine(result.actualProvider, \"\", 256) : undefined,\n\t\tactualModel: result.actualModel ? safeLine(result.actualModel, \"\", 256) : undefined,\n\t\tstopReason: result.stopReason ? safeLine(result.stopReason, \"\", 256) : undefined,\n\t\terrorMessage: result.errorMessage ? safeBlock(result.errorMessage, \"\", 8 * 1024) : undefined,\n\t\tfinalOutput: result.finalOutput ? safeBlock(result.finalOutput, \"\", 50 * 1024) : undefined,\n\t};\n}\n\nfunction renderResultStatus(result: SingleResult, isPartial: boolean): string {\n\tif (result.outcome && ![\"completed\", \"partial\"].includes(result.outcome.status)) {\n\t\treturn result.outcome.status\n\t\t\t.split(\"-\")\n\t\t\t.map((part) => `${part.slice(0, 1).toUpperCase()}${part.slice(1)}`)\n\t\t\t.join(\" \");\n\t}\n\tif (isResultError(result)) {\n\t\treturn result.stopReason === \"aborted\" || result.aborted ? \"Cancelled\" : \"Failed\";\n\t}\n\treturn isPartial || result.exitCode === -1 ? \"Running\" : \"Completed\";\n}\n\nfunction coloredStatus(theme: Theme, status: string): string {\n\tconst color: ThemeColor =\n\t\tstatus === \"Failed\" ? \"error\" : status === \"Completed\" ? \"success\" : \"warning\";\n\treturn theme.fg(color, status);\n}\n\nfunction coloredResultStatus(theme: Theme, result: SingleResult, isPartial: boolean): string {\n\treturn coloredStatus(theme, renderResultStatus(result, isPartial));\n}\n\nfunction formatResultIntelligence(result: SingleResult): string {\n\tconst structured =\n\t\tresult.structuredResult?.version === \"pi-subagents:result:v2\"\n\t\t\t? result.structuredResult\n\t\t\t: undefined;\n\treturn [\n\t\tresult.contract ? `contract: ${result.contract.level} \u00B7 ${result.contract.taskId}` : undefined,\n\t\tresult.outcome\n\t\t\t? `outcome: ${result.outcome.status}${result.outcome.reasonCode ? ` \u00B7 ${result.outcome.reasonCode}` : \"\"}`\n\t\t\t: undefined,\n\t\tstructured\n\t\t\t? `evidence: ${structured.claims.length} claims \u00B7 ${structured.artifacts.length} artifacts \u00B7 ${structured.verification.length} verification items \u00B7 ${structured.limitations.length} limitations`\n\t\t\t: undefined,\n\t\tresult.resultContractInvalid ? \"contract warning: invalid structured result\" : undefined,\n\t\tresult.executionPlan\n\t\t\t? `plan: ${result.executionPlan.id.slice(0, 12)} \u00B7 generation ${result.executionPlan.taskGeneration} \u00B7 admission ${result.executionPlan.admission.recommendation}`\n\t\t\t: undefined,\n\t\tresult.capabilityGrant\n\t\t\t? `grant: ${result.capabilityGrant.state} \u00B7 expires ${result.capabilityGrant.expiresAt}`\n\t\t\t: undefined,\n\t]\n\t\t.filter((line): line is string => Boolean(line))\n\t\t.join(\"\\n\");\n}\n\nfunction formatResultPolicy(result: SingleResult): string {\n\tif (!result.policy) return \"\";\n\treturn [\n\t\t`inherited: ${result.policy.inherited.map((tool) => safeLine(tool, \"\", 256)).join(\", \") || \"none\"}`,\n\t\t`overridden: ${result.policy.overridden.map((tool) => safeLine(tool, \"\", 256)).join(\", \") || \"none\"}`,\n\t\t`unsupported: ${result.policy.unsupported.map((tool) => safeLine(tool, \"\", 256)).join(\", \") || \"none\"}`,\n\t].join(\"\\n\");\n}\n\nexport function renderSubagentCall(args: SubagentParams, theme: Theme) {\n\tconst scope: AgentScope = args.agentScope ?? \"user\";\n\tconst limits = [\n\t\ttypeof args.timeoutMs === \"number\" ? `timeout:${args.timeoutMs}ms` : undefined,\n\t\ttypeof args.totalTimeoutMs === \"number\" ? `total:${args.totalTimeoutMs}ms` : undefined,\n\t\ttypeof args.idleTimeoutMs === \"number\" ? `idle:${args.idleTimeoutMs}ms` : undefined,\n\t\ttypeof args.maxTurns === \"number\" ? `turns:${args.maxTurns}` : undefined,\n\t\ttypeof args.maxToolCalls === \"number\" ? `tools:${args.maxToolCalls}` : undefined,\n\t].filter((value): value is string => Boolean(value));\n\tconst limitText = limits.length > 0 ? ` \u00B7 ${limits.join(\" \u00B7 \")}` : \"\";\n\tconst panelCall = renderPanelCall(args, theme);\n\tif (panelCall) return panelCall;\n\tif (args.workflow && args.workflow.tasks.length > 0) {\n\t\tlet text =\n\t\t\ttheme.fg(\"toolTitle\", theme.bold(\"subagent \")) +\n\t\t\ttheme.fg(\"accent\", `workflow (${args.workflow.tasks.length} tasks)`) +\n\t\t\ttheme.fg(\"muted\", ` [${scope}]${limitText}`);\n\t\tfor (const task of args.workflow.tasks.slice(0, 3)) {\n\t\t\ttext += `\\n ${theme.fg(\"muted\", `${task.id}:`)} ${theme.fg(\"accent\", previewAgent(task.agent))}${theme.fg(\"dim\", ` ${previewTask(task.task)}`)}`;\n\t\t}\n\t\tif (args.workflow.tasks.length > 3) {\n\t\t\ttext += `\\n ${theme.fg(\"muted\", `... +${args.workflow.tasks.length - 3} more`)}`;\n\t\t}\n\t\treturn new Text(text, 0, 0);\n\t}\n\tif (args.chain && args.chain.length > 0) {\n\t\tlet text =\n\t\t\ttheme.fg(\"toolTitle\", theme.bold(\"subagent \")) +\n\t\t\ttheme.fg(\"accent\", `chain (${args.chain.length} steps)`) +\n\t\t\ttheme.fg(\"muted\", ` [${scope}]${limitText}`);\n\t\tfor (let i = 0; i < Math.min(args.chain.length, 3); i++) {\n\t\t\tconst step = args.chain[i] as { agent?: unknown; task?: unknown } | undefined;\n\t\t\t// Clean up {previous} placeholder for display\n\t\t\tconst cleanTask =\n\t\t\t\ttypeof step?.task === \"string\" ? step.task.replace(/\\{previous\\}/g, \"\").trim() : undefined;\n\t\t\ttext +=\n\t\t\t\t\"\\n \" +\n\t\t\t\ttheme.fg(\"muted\", `${i + 1}.`) +\n\t\t\t\t\" \" +\n\t\t\t\ttheme.fg(\"accent\", previewAgent(step?.agent)) +\n\t\t\t\ttheme.fg(\"dim\", ` ${previewTask(cleanTask)}`);\n\t\t}\n\t\tif (args.chain.length > 3)\n\t\t\ttext += `\\n ${theme.fg(\"muted\", `... +${args.chain.length - 3} more`)}`;\n\t\treturn new Text(text, 0, 0);\n\t}\n\tif (args.tasks && args.tasks.length > 0) {\n\t\tlet text =\n\t\t\ttheme.fg(\"toolTitle\", theme.bold(\"subagent \")) +\n\t\t\ttheme.fg(\"accent\", `parallel (${args.tasks.length} tasks)`) +\n\t\t\ttheme.fg(\"muted\", ` [${scope}]${limitText}`);\n\t\tfor (const task of args.tasks.slice(0, 3)) {\n\t\t\tconst item = task as { agent?: unknown; task?: unknown } | undefined;\n\t\t\ttext += `\\n ${theme.fg(\"accent\", previewAgent(item?.agent))}${theme.fg(\"dim\", ` ${previewTask(item?.task)}`)}`;\n\t\t}\n\t\tif (args.tasks.length > 3)\n\t\t\ttext += `\\n ${theme.fg(\"muted\", `... +${args.tasks.length - 3} more`)}`;\n\t\tif (hasUsableAggregator(args.aggregator)) {\n\t\t\tconst aggregator = args.aggregator;\n\t\t\ttext += `\\n ${theme.fg(\"muted\", \"fan-in \u2192 \")}${theme.fg(\"accent\", previewAgent(aggregator.agent))}${theme.fg(\n\t\t\t\t\"dim\",\n\t\t\t\t` ${previewTask(aggregator.task)}`,\n\t\t\t)}`;\n\t\t}\n\t\treturn new Text(text, 0, 0);\n\t}\n\tconst agentName = previewAgent(args.agent);\n\tconst preview = previewTask(args.task, 60);\n\tlet text =\n\t\ttheme.fg(\"toolTitle\", theme.bold(\"subagent \")) +\n\t\ttheme.fg(\"accent\", agentName) +\n\t\ttheme.fg(\"muted\", ` [${scope}]${limitText}`);\n\ttext += `\\n ${theme.fg(\"dim\", preview)}`;\n\treturn new Text(text, 0, 0);\n}\n\nexport function renderSubagentResult(\n\tresult: AgentToolResult<SubagentDetails>,\n\t{ expanded, isPartial }: ToolRenderResultOptions,\n\ttheme: Theme,\n) {\n\tconst rawDetails = result.details as SubagentDetails | undefined;\n\tif (rawDetails?.mode === \"panel\") {\n\t\tconst panelResult = renderPanelResult(rawDetails, expanded, isPartial, theme);\n\t\tif (panelResult) return panelResult;\n\t}\n\tif (!rawDetails || rawDetails.results.length === 0) {\n\t\tconst text = result.content[0];\n\t\treturn new Text(\n\t\t\ttext?.type === \"text\" ? safeBlock(text.text, \"(no output)\", 8 * 1024) : \"(no output)\",\n\t\t\t0,\n\t\t\t0,\n\t\t);\n\t}\n\tconst details: SubagentDetails = {\n\t\t...rawDetails,\n\t\tresults: rawDetails.results.map(sanitizeSingleResultForRender),\n\t\taggregator: rawDetails.aggregator\n\t\t\t? sanitizeSingleResultForRender(rawDetails.aggregator)\n\t\t\t: undefined,\n\t};\n\n\tconst mdTheme = getMarkdownTheme();\n\n\tconst renderDisplayItems = (items: DisplayItem[], limit?: number, total = items.length) => {\n\t\tconst toShow = limit ? items.slice(-limit) : items;\n\t\tconst skipped = Math.max(0, total - toShow.length);\n\t\tlet text = \"\";\n\t\tif (skipped > 0) text += theme.fg(\"muted\", `... ${skipped} earlier items\\n`);\n\t\tfor (const item of toShow) {\n\t\t\tif (item.type === \"text\") {\n\t\t\t\tconst safeText = safeBlock(item.text, \"\", 8 * 1024);\n\t\t\t\tconst preview = expanded ? safeText : safeText.split(\"\\n\").slice(0, 3).join(\"\\n\");\n\t\t\t\ttext += `${theme.fg(\"toolOutput\", preview)}\\n`;\n\t\t\t} else {\n\t\t\t\ttext += `${theme.fg(\"muted\", \"\u2192 \") + formatToolCall(item.name, item.args, theme.fg.bind(theme))}\\n`;\n\t\t\t}\n\t\t}\n\t\treturn text.trimEnd();\n\t};\n\n\tif (details.mode === \"single\" && details.results.length === 1) {\n\t\tconst r = details.results[0];\n\t\tconst isError = isResultError(r);\n\t\tconst icon = isError\n\t\t\t? theme.fg(\"error\", \"\u2717\")\n\t\t\t: isPartial\n\t\t\t\t? theme.fg(\"warning\", \"\u23F3\")\n\t\t\t\t: theme.fg(\"success\", \"\u2713\");\n\t\tconst displayItems = getDisplayItems(r.messages);\n\t\tconst finalOutput = getResultFinalOutput(r);\n\n\t\tif (expanded) {\n\t\t\tconst container = new Container();\n\t\t\tlet header = `${icon} ${theme.fg(\"toolTitle\", theme.bold(r.agent))}${theme.fg(\"muted\", ` (${safeLine(r.agentSource, \"unknown\", 128)})`)} \u00B7 ${coloredResultStatus(theme, r, isPartial)}`;\n\t\t\tif (isError && r.stopReason) header += ` ${theme.fg(\"error\", `[${r.stopReason}]`)}`;\n\t\t\tcontainer.addChild(new Text(header, 0, 0));\n\t\t\tif (isError && r.errorMessage)\n\t\t\t\tcontainer.addChild(new Text(theme.fg(\"error\", `Error: ${r.errorMessage}`), 0, 0));\n\t\t\tcontainer.addChild(new Spacer(1));\n\t\t\tcontainer.addChild(new Text(theme.fg(\"muted\", \"\u2500\u2500\u2500 Task \u2500\u2500\u2500\"), 0, 0));\n\t\t\tcontainer.addChild(new Text(theme.fg(\"dim\", r.task), 0, 0));\n\t\t\tconst intelligence = formatResultIntelligence(r);\n\t\t\tif (intelligence) {\n\t\t\t\tcontainer.addChild(new Spacer(1));\n\t\t\t\tcontainer.addChild(new Text(theme.fg(\"muted\", \"\u2500\u2500\u2500 Delegation \u2500\u2500\u2500\"), 0, 0));\n\t\t\t\tcontainer.addChild(new Text(theme.fg(\"dim\", intelligence), 0, 0));\n\t\t\t}\n\t\t\tconst policy = formatResultPolicy(r);\n\t\t\tif (policy) {\n\t\t\t\tcontainer.addChild(new Spacer(1));\n\t\t\t\tcontainer.addChild(new Text(theme.fg(\"muted\", \"\u2500\u2500\u2500 Policy \u2500\u2500\u2500\"), 0, 0));\n\t\t\t\tcontainer.addChild(new Text(theme.fg(\"dim\", policy), 0, 0));\n\t\t\t}\n\t\t\tcontainer.addChild(new Spacer(1));\n\t\t\tcontainer.addChild(new Text(theme.fg(\"muted\", \"\u2500\u2500\u2500 Output \u2500\u2500\u2500\"), 0, 0));\n\t\t\tif (displayItems.length === 0 && !finalOutput) {\n\t\t\t\tcontainer.addChild(new Text(theme.fg(\"muted\", \"(no output)\"), 0, 0));\n\t\t\t} else {\n\t\t\t\tfor (const item of displayItems) {\n\t\t\t\t\tif (item.type === \"toolCall\")\n\t\t\t\t\t\tcontainer.addChild(\n\t\t\t\t\t\t\tnew Text(\n\t\t\t\t\t\t\t\ttheme.fg(\"muted\", \"\u2192 \") +\n\t\t\t\t\t\t\t\t\tformatToolCall(item.name, item.args, theme.fg.bind(theme)),\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (finalOutput) {\n\t\t\t\t\tcontainer.addChild(new Spacer(1));\n\t\t\t\t\tcontainer.addChild(new Markdown(finalOutput.trim(), 0, 0, mdTheme));\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst usageStr = formatResultUsageStats(r);\n\t\t\tif (usageStr) {\n\t\t\t\tcontainer.addChild(new Spacer(1));\n\t\t\t\tcontainer.addChild(new Text(theme.fg(\"dim\", usageStr), 0, 0));\n\t\t\t}\n\t\t\treturn container;\n\t\t}\n\n\t\tconst collapsed = getCollapsedDisplayItems(r);\n\t\tlet text = `${icon} ${theme.fg(\"toolTitle\", theme.bold(r.agent))}${theme.fg(\"muted\", ` (${safeLine(r.agentSource, \"unknown\", 128)})`)} \u00B7 ${coloredResultStatus(theme, r, isPartial)}`;\n\t\tif (isError && r.stopReason) text += ` ${theme.fg(\"error\", `[${r.stopReason}]`)}`;\n\t\tif (isError && r.errorMessage) text += `\\n${theme.fg(\"error\", `Error: ${r.errorMessage}`)}`;\n\t\tif (collapsed.items.length > 0) {\n\t\t\ttext += `\\n${renderDisplayItems(collapsed.items, COLLAPSED_ITEM_COUNT, collapsed.total)}`;\n\t\t\tif (collapsed.total > COLLAPSED_ITEM_COUNT) text += `\\n${expansionHint()}`;\n\t\t} else if (finalOutput.trim()) {\n\t\t\tconst outputLines = finalOutput.trim().split(\"\\n\");\n\t\t\ttext += `\\n${theme.fg(\"toolOutput\", outputLines.slice(0, 3).join(\"\\n\"))}`;\n\t\t\tif (outputLines.length > 3) text += `\\n${expansionHint()}`;\n\t\t} else if (!isError || !r.errorMessage) {\n\t\t\ttext += `\\n${theme.fg(\"muted\", isPartial && !isError ? \"(running...)\" : \"(no output)\")}`;\n\t\t}\n\t\tconst usageStr = formatResultUsageStats(r);\n\t\tif (usageStr) text += `\\n${theme.fg(\"dim\", usageStr)}`;\n\t\treturn new Text(text, 0, 0);\n\t}\n\n\tconst aggregateUsage = (results: SingleResult[]) => {\n\t\tconst total = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, turns: 0 };\n\t\tfor (const r of results) {\n\t\t\ttotal.input += r.usage.input;\n\t\t\ttotal.output += r.usage.output;\n\t\t\ttotal.cacheRead += r.usage.cacheRead;\n\t\t\ttotal.cacheWrite += r.usage.cacheWrite;\n\t\t\ttotal.cost += r.usage.cost;\n\t\t\ttotal.turns += r.usage.turns;\n\t\t}\n\t\treturn total;\n\t};\n\n\tif (details.mode === \"chain\") {\n\t\tconst currentResult = details.results.at(-1);\n\t\tconst currentIsRunning =\n\t\t\tisPartial && currentResult !== undefined && !isResultError(currentResult);\n\t\tconst successCount = details.results.filter(\n\t\t\t(result) => !isResultError(result) && (!currentIsRunning || result !== currentResult),\n\t\t).length;\n\t\tconst icon = currentIsRunning\n\t\t\t? theme.fg(\"warning\", \"\u23F3\")\n\t\t\t: successCount === details.results.length\n\t\t\t\t? theme.fg(\"success\", \"\u2713\")\n\t\t\t\t: theme.fg(\"error\", \"\u2717\");\n\t\tconst overallStatus = currentIsRunning\n\t\t\t? \"Running\"\n\t\t\t: successCount === details.results.length\n\t\t\t\t? \"Completed\"\n\t\t\t\t: \"Failed\";\n\n\t\tif (expanded) {\n\t\t\tconst container = new Container();\n\t\t\tcontainer.addChild(\n\t\t\t\tnew Text(\n\t\t\t\t\ticon +\n\t\t\t\t\t\t\" \" +\n\t\t\t\t\t\ttheme.fg(\"toolTitle\", theme.bold(\"chain \")) +\n\t\t\t\t\t\ttheme.fg(\"accent\", `${successCount}/${details.results.length} steps`) +\n\t\t\t\t\t\t` \u00B7 ${coloredStatus(theme, overallStatus)}`,\n\t\t\t\t\t0,\n\t\t\t\t\t0,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tfor (const r of details.results) {\n\t\t\t\tconst rFailed = isResultError(r);\n\t\t\t\tconst rIcon = rFailed\n\t\t\t\t\t? theme.fg(\"error\", \"\u2717\")\n\t\t\t\t\t: currentIsRunning && r === currentResult\n\t\t\t\t\t\t? theme.fg(\"warning\", \"\u23F3\")\n\t\t\t\t\t\t: theme.fg(\"success\", \"\u2713\");\n\t\t\t\tconst displayItems = getDisplayItems(r.messages);\n\t\t\t\tconst finalOutput = getResultFinalOutput(r);\n\n\t\t\t\tcontainer.addChild(new Spacer(1));\n\t\t\t\tcontainer.addChild(\n\t\t\t\t\tnew Text(\n\t\t\t\t\t\t`${theme.fg(\"muted\", `\u2500\u2500\u2500 Step ${r.step}: `) + theme.fg(\"accent\", r.agent)} ${rIcon} ${coloredResultStatus(theme, r, currentIsRunning && r === currentResult)}`,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t0,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tcontainer.addChild(new Text(theme.fg(\"muted\", \"Task: \") + theme.fg(\"dim\", r.task), 0, 0));\n\t\t\t\tconst policy = formatResultPolicy(r);\n\t\t\t\tif (policy)\n\t\t\t\t\tcontainer.addChild(\n\t\t\t\t\t\tnew Text(theme.fg(\"muted\", \"Policy:\\n\") + theme.fg(\"dim\", policy), 0, 0),\n\t\t\t\t\t);\n\t\t\t\tif (rFailed && r.errorMessage)\n\t\t\t\t\tcontainer.addChild(new Text(theme.fg(\"error\", `Error: ${r.errorMessage}`), 0, 0));\n\n\t\t\t\t// Show tool calls\n\t\t\t\tfor (const item of displayItems) {\n\t\t\t\t\tif (item.type === \"toolCall\") {\n\t\t\t\t\t\tcontainer.addChild(\n\t\t\t\t\t\t\tnew Text(\n\t\t\t\t\t\t\t\ttheme.fg(\"muted\", \"\u2192 \") +\n\t\t\t\t\t\t\t\t\tformatToolCall(item.name, item.args, theme.fg.bind(theme)),\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Show final output as markdown\n\t\t\t\tif (finalOutput) {\n\t\t\t\t\tcontainer.addChild(new Spacer(1));\n\t\t\t\t\tcontainer.addChild(new Markdown(finalOutput.trim(), 0, 0, mdTheme));\n\t\t\t\t}\n\n\t\t\t\tconst stepUsage = formatResultUsageStats(r);\n\t\t\t\tif (stepUsage) container.addChild(new Text(theme.fg(\"dim\", stepUsage), 0, 0));\n\t\t\t}\n\n\t\t\tconst usageStr = formatUsageStats(aggregateUsage(details.results));\n\t\t\tif (usageStr) {\n\t\t\t\tcontainer.addChild(new Spacer(1));\n\t\t\t\tcontainer.addChild(new Text(theme.fg(\"dim\", `Total: ${usageStr}`), 0, 0));\n\t\t\t}\n\t\t\treturn container;\n\t\t}\n\n\t\t// Collapsed view\n\t\tlet text =\n\t\t\ticon +\n\t\t\t\" \" +\n\t\t\ttheme.fg(\"toolTitle\", theme.bold(\"chain \")) +\n\t\t\ttheme.fg(\"accent\", `${successCount}/${details.results.length} steps`) +\n\t\t\t` \u00B7 ${coloredStatus(theme, overallStatus)}`;\n\t\tfor (const r of details.results) {\n\t\t\tconst rFailed = isResultError(r);\n\t\t\tconst rIcon = rFailed\n\t\t\t\t? theme.fg(\"error\", \"\u2717\")\n\t\t\t\t: currentIsRunning && r === currentResult\n\t\t\t\t\t? theme.fg(\"warning\", \"\u23F3\")\n\t\t\t\t\t: theme.fg(\"success\", \"\u2713\");\n\t\t\tconst collapsed = getCollapsedDisplayItems(r);\n\t\t\tconst finalOutput = getResultFinalOutput(r).trim();\n\t\t\ttext += `\\n\\n${theme.fg(\"muted\", `\u2500\u2500\u2500 Step ${r.step}: `)}${theme.fg(\"accent\", r.agent)} ${rIcon} ${coloredResultStatus(theme, r, currentIsRunning && r === currentResult)}`;\n\t\t\tif (rFailed && r.errorMessage) text += `\\n${theme.fg(\"error\", `Error: ${r.errorMessage}`)}`;\n\t\t\tif (collapsed.items.length > 0)\n\t\t\t\ttext += `\\n${renderDisplayItems(collapsed.items, 5, collapsed.total)}`;\n\t\t\telse if (currentIsRunning && r === currentResult)\n\t\t\t\ttext += `\\n${theme.fg(\"muted\", \"(running...)\")}`;\n\t\t\telse if (finalOutput)\n\t\t\t\ttext += `\\n${theme.fg(\"toolOutput\", finalOutput.split(\"\\n\").slice(0, 3).join(\"\\n\"))}`;\n\t\t\telse if (!rFailed || !r.errorMessage) text += `\\n${theme.fg(\"muted\", \"(no output)\")}`;\n\t\t}\n\t\tconst usageStr = formatUsageStats(aggregateUsage(details.results));\n\t\tif (usageStr) text += `\\n\\n${theme.fg(\"dim\", `Total: ${usageStr}`)}`;\n\t\ttext += `\\n${expansionHint()}`;\n\t\treturn new Text(text, 0, 0);\n\t}\n\n\tif (details.mode === \"parallel\" || details.mode === \"workflow\") {\n\t\tconst modeLabel = details.mode === \"workflow\" ? \"workflow\" : \"parallel\";\n\t\tconst resultIsRunning = (result: SingleResult) =>\n\t\t\tresult.exitCode === -1 && !isResultError(result);\n\t\tconst running = details.results.filter(resultIsRunning).length;\n\t\tconst successCount = details.results.filter(\n\t\t\t(result) => result.exitCode !== -1 && !isResultError(result),\n\t\t).length;\n\t\tconst failCount = details.results.filter(isResultError).length;\n\t\tconst aggregator = details.aggregator;\n\t\tconst aggregatorFailed = aggregator ? isResultError(aggregator) : false;\n\t\tconst aggregatorRunning = aggregator\n\t\t\t? !aggregatorFailed && (isPartial || aggregator.exitCode === -1)\n\t\t\t: false;\n\t\tconst pendingSuccessfulSettlement =\n\t\t\tisPartial && !aggregator && running === 0 && failCount === 0;\n\t\tconst isRunning = running > 0 || aggregatorRunning || pendingSuccessfulSettlement;\n\t\tconst icon = isRunning\n\t\t\t? theme.fg(\"warning\", \"\u23F3\")\n\t\t\t: failCount > 0 || aggregatorFailed\n\t\t\t\t? theme.fg(\"warning\", \"\u25D0\")\n\t\t\t\t: theme.fg(\"success\", \"\u2713\");\n\t\tconst status = isRunning\n\t\t\t? aggregatorRunning\n\t\t\t\t? `${successCount + failCount}/${details.results.length} done, fan-in running`\n\t\t\t\t: running > 0\n\t\t\t\t\t? `${successCount + failCount}/${details.results.length} done, ${running} running`\n\t\t\t\t\t: `${successCount + failCount}/${details.results.length} done, running`\n\t\t\t: aggregator\n\t\t\t\t? `${successCount}/${details.results.length} tasks + fan-in`\n\t\t\t\t: `${successCount}/${details.results.length} tasks`;\n\t\tconst overallStatus = isRunning\n\t\t\t? \"Running\"\n\t\t\t: failCount > 0 || aggregatorFailed\n\t\t\t\t? \"Failed\"\n\t\t\t\t: \"Completed\";\n\n\t\tif (expanded && !isRunning) {\n\t\t\tconst container = new Container();\n\t\t\tcontainer.addChild(\n\t\t\t\tnew Text(\n\t\t\t\t\t`${icon} ${theme.fg(\"toolTitle\", theme.bold(`${modeLabel} `))}${theme.fg(\"accent\", status)} \u00B7 ${coloredStatus(theme, overallStatus)}`,\n\t\t\t\t\t0,\n\t\t\t\t\t0,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tfor (const r of details.results) {\n\t\t\t\tconst rFailed = isResultError(r);\n\t\t\t\tconst rIcon = rFailed\n\t\t\t\t\t? theme.fg(\"error\", \"\u2717\")\n\t\t\t\t\t: resultIsRunning(r)\n\t\t\t\t\t\t? theme.fg(\"warning\", \"\u23F3\")\n\t\t\t\t\t\t: theme.fg(\"success\", \"\u2713\");\n\t\t\t\tconst displayItems = getDisplayItems(r.messages);\n\t\t\t\tconst finalOutput = getResultFinalOutput(r);\n\n\t\t\t\tcontainer.addChild(new Spacer(1));\n\t\t\t\tcontainer.addChild(\n\t\t\t\t\tnew Text(\n\t\t\t\t\t\t`${theme.fg(\"muted\", \"\u2500\u2500\u2500 \") + theme.fg(\"accent\", r.agent)} ${rIcon} ${coloredResultStatus(theme, r, resultIsRunning(r))}`,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t0,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tcontainer.addChild(new Text(theme.fg(\"muted\", \"Task: \") + theme.fg(\"dim\", r.task), 0, 0));\n\t\t\t\tconst policy = formatResultPolicy(r);\n\t\t\t\tif (policy)\n\t\t\t\t\tcontainer.addChild(\n\t\t\t\t\t\tnew Text(theme.fg(\"muted\", \"Policy:\\n\") + theme.fg(\"dim\", policy), 0, 0),\n\t\t\t\t\t);\n\t\t\t\tif (rFailed && r.errorMessage)\n\t\t\t\t\tcontainer.addChild(new Text(theme.fg(\"error\", `Error: ${r.errorMessage}`), 0, 0));\n\n\t\t\t\t// Show tool calls\n\t\t\t\tfor (const item of displayItems) {\n\t\t\t\t\tif (item.type === \"toolCall\") {\n\t\t\t\t\t\tcontainer.addChild(\n\t\t\t\t\t\t\tnew Text(\n\t\t\t\t\t\t\t\ttheme.fg(\"muted\", \"\u2192 \") +\n\t\t\t\t\t\t\t\t\tformatToolCall(item.name, item.args, theme.fg.bind(theme)),\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Show final output as markdown\n\t\t\t\tif (finalOutput) {\n\t\t\t\t\tcontainer.addChild(new Spacer(1));\n\t\t\t\t\tcontainer.addChild(new Markdown(finalOutput.trim(), 0, 0, mdTheme));\n\t\t\t\t}\n\n\t\t\t\tconst taskUsage = formatResultUsageStats(r);\n\t\t\t\tif (taskUsage) container.addChild(new Text(theme.fg(\"dim\", taskUsage), 0, 0));\n\t\t\t}\n\n\t\t\tif (aggregator) {\n\t\t\t\tconst rIcon = aggregatorFailed\n\t\t\t\t\t? theme.fg(\"error\", \"\u2717\")\n\t\t\t\t\t: aggregatorRunning\n\t\t\t\t\t\t? theme.fg(\"warning\", \"\u23F3\")\n\t\t\t\t\t\t: theme.fg(\"success\", \"\u2713\");\n\t\t\t\tconst displayItems = getDisplayItems(aggregator.messages);\n\t\t\t\tconst finalOutput = getResultFinalOutput(aggregator);\n\n\t\t\t\tcontainer.addChild(new Spacer(1));\n\t\t\t\tcontainer.addChild(\n\t\t\t\t\tnew Text(\n\t\t\t\t\t\t`${theme.fg(\"muted\", \"\u2500\u2500\u2500 fan-in \u2192 \") + theme.fg(\"accent\", aggregator.agent)} ${rIcon} ${coloredResultStatus(theme, aggregator, aggregatorRunning)}`,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t0,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tcontainer.addChild(\n\t\t\t\t\tnew Text(theme.fg(\"muted\", \"Task: \") + theme.fg(\"dim\", aggregator.task), 0, 0),\n\t\t\t\t);\n\t\t\t\tconst aggregatorPolicy = formatResultPolicy(aggregator);\n\t\t\t\tif (aggregatorPolicy)\n\t\t\t\t\tcontainer.addChild(\n\t\t\t\t\t\tnew Text(theme.fg(\"muted\", \"Policy:\\n\") + theme.fg(\"dim\", aggregatorPolicy), 0, 0),\n\t\t\t\t\t);\n\t\t\t\tif (aggregatorFailed && aggregator.errorMessage)\n\t\t\t\t\tcontainer.addChild(\n\t\t\t\t\t\tnew Text(theme.fg(\"error\", `Error: ${aggregator.errorMessage}`), 0, 0),\n\t\t\t\t\t);\n\t\t\t\tfor (const item of displayItems) {\n\t\t\t\t\tif (item.type === \"toolCall\") {\n\t\t\t\t\t\tcontainer.addChild(\n\t\t\t\t\t\t\tnew Text(\n\t\t\t\t\t\t\t\ttheme.fg(\"muted\", \"\u2192 \") +\n\t\t\t\t\t\t\t\t\tformatToolCall(item.name, item.args, theme.fg.bind(theme)),\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (finalOutput) {\n\t\t\t\t\tcontainer.addChild(new Spacer(1));\n\t\t\t\t\tcontainer.addChild(new Markdown(finalOutput.trim(), 0, 0, mdTheme));\n\t\t\t\t}\n\t\t\t\tconst fanInUsage = formatResultUsageStats(aggregator);\n\t\t\t\tif (fanInUsage) container.addChild(new Text(theme.fg(\"dim\", fanInUsage), 0, 0));\n\t\t\t}\n\n\t\t\tconst usageResults = aggregator ? [...details.results, aggregator] : details.results;\n\t\t\tconst usageStr = formatUsageStats(aggregateUsage(usageResults));\n\t\t\tif (usageStr) {\n\t\t\t\tcontainer.addChild(new Spacer(1));\n\t\t\t\tcontainer.addChild(new Text(theme.fg(\"dim\", `Total: ${usageStr}`), 0, 0));\n\t\t\t}\n\t\t\treturn container;\n\t\t}\n\n\t\t// Collapsed view (or still running)\n\t\tlet text = `${icon} ${theme.fg(\"toolTitle\", theme.bold(`${modeLabel} `))}${theme.fg(\"accent\", status)} \u00B7 ${coloredStatus(theme, overallStatus)}`;\n\t\tfor (const r of details.results) {\n\t\t\tconst rFailed = isResultError(r);\n\t\t\tconst rRunning = resultIsRunning(r);\n\t\t\tconst rIcon = rFailed\n\t\t\t\t? theme.fg(\"error\", \"\u2717\")\n\t\t\t\t: rRunning\n\t\t\t\t\t? theme.fg(\"warning\", \"\u23F3\")\n\t\t\t\t\t: theme.fg(\"success\", \"\u2713\");\n\t\t\tconst collapsed = getCollapsedDisplayItems(r);\n\t\t\tconst finalOutput = getResultFinalOutput(r).trim();\n\t\t\ttext += `\\n\\n${theme.fg(\"muted\", \"\u2500\u2500\u2500 \")}${theme.fg(\"accent\", r.agent)} ${rIcon} ${coloredResultStatus(theme, r, rRunning)}`;\n\t\t\tif (rFailed && r.errorMessage) text += `\\n${theme.fg(\"error\", `Error: ${r.errorMessage}`)}`;\n\t\t\tif (collapsed.items.length > 0)\n\t\t\t\ttext += `\\n${renderDisplayItems(collapsed.items, 5, collapsed.total)}`;\n\t\t\telse if (rRunning) text += `\\n${theme.fg(\"muted\", \"(running...)\")}`;\n\t\t\telse if (finalOutput)\n\t\t\t\ttext += `\\n${theme.fg(\"toolOutput\", finalOutput.split(\"\\n\").slice(0, 3).join(\"\\n\"))}`;\n\t\t\telse if (!rFailed || !r.errorMessage) text += `\\n${theme.fg(\"muted\", \"(no output)\")}`;\n\t\t}\n\t\tif (aggregator) {\n\t\t\tconst rIcon = aggregatorFailed\n\t\t\t\t? theme.fg(\"error\", \"\u2717\")\n\t\t\t\t: aggregatorRunning\n\t\t\t\t\t? theme.fg(\"warning\", \"\u23F3\")\n\t\t\t\t\t: theme.fg(\"success\", \"\u2713\");\n\t\t\tconst collapsed = getCollapsedDisplayItems(aggregator);\n\t\t\tconst finalOutput = getResultFinalOutput(aggregator).trim();\n\t\t\ttext += `\\n\\n${theme.fg(\"muted\", \"\u2500\u2500\u2500 fan-in \u2192 \")}${theme.fg(\"accent\", aggregator.agent)} ${rIcon} ${coloredResultStatus(theme, aggregator, aggregatorRunning)}`;\n\t\t\tif (aggregatorFailed && aggregator.errorMessage)\n\t\t\t\ttext += `\\n${theme.fg(\"error\", `Error: ${aggregator.errorMessage}`)}`;\n\t\t\tif (collapsed.items.length > 0)\n\t\t\t\ttext += `\\n${renderDisplayItems(collapsed.items, 5, collapsed.total)}`;\n\t\t\telse if (aggregatorRunning) text += `\\n${theme.fg(\"muted\", \"(running...)\")}`;\n\t\t\telse if (finalOutput)\n\t\t\t\ttext += `\\n${theme.fg(\"toolOutput\", finalOutput.split(\"\\n\").slice(0, 3).join(\"\\n\"))}`;\n\t\t\telse if (!aggregatorFailed || !aggregator.errorMessage)\n\t\t\t\ttext += `\\n${theme.fg(\"muted\", \"(no output)\")}`;\n\t\t}\n\t\tif (!isRunning) {\n\t\t\tconst usageResults = aggregator ? [...details.results, aggregator] : details.results;\n\t\t\tconst usageStr = formatUsageStats(aggregateUsage(usageResults));\n\t\t\tif (usageStr) text += `\\n\\n${theme.fg(\"dim\", `Total: ${usageStr}`)}`;\n\t\t}\n\t\tif (!expanded) text += `\\n${expansionHint()}`;\n\t\treturn new Text(text, 0, 0);\n\t}\n\n\tconst text = result.content[0];\n\treturn new Text(\n\t\ttext?.type === \"text\" ? safeBlock(text.text, \"(no output)\", 8 * 1024) : \"(no output)\",\n\t\t0,\n\t\t0,\n\t);\n}\n", "import type { Theme } from \"@earendil-works/pi-coding-agent\";\nimport { Text } from \"@earendil-works/pi-tui\";\nimport type { SubagentParams } from \"./params.js\";\nimport { safeBlock, safeLine } from \"./render-common.js\";\nimport type { SubagentDetails } from \"./runner.js\";\n\nexport function renderPanelCall(args: SubagentParams, theme: Theme): Text | undefined {\n\tconst panel = args.panel;\n\tif (!panel) return undefined;\n\tconst scope = args.agentScope ?? \"user\";\n\tlet text =\n\t\ttheme.fg(\"toolTitle\", theme.bold(\"subagent \")) +\n\t\ttheme.fg(\"accent\", `panel ${panel.preset ?? \"custom\"} (${panel.reviewers.length} reviewers)`) +\n\t\ttheme.fg(\"muted\", ` [${scope}]`);\n\ttext += `\\n ${theme.fg(\"dim\", preview(panel.task, 80))}`;\n\tfor (const reviewer of panel.reviewers.slice(0, 3)) {\n\t\ttext += `\\n ${theme.fg(\"muted\", `${safeLine(reviewer.id, \"reviewer\", 256)}:`)} ${theme.fg(\"accent\", safeLine(reviewer.agent, \"agent\", 256))}`;\n\t\tif (reviewer.focus) text += theme.fg(\"dim\", ` ${preview(reviewer.focus, 40)}`);\n\t}\n\tif (panel.reviewers.length > 3) {\n\t\ttext += `\\n ${theme.fg(\"muted\", `... +${panel.reviewers.length - 3} more`)}`;\n\t}\n\ttext += `\\n ${theme.fg(\"muted\", \"synthesis \u2192 \")}${theme.fg(\"accent\", safeLine(panel.synthesizer.agent, \"agent\", 256))}`;\n\treturn new Text(text, 0, 0);\n}\n\nexport function renderPanelResult(\n\tdetails: SubagentDetails,\n\texpanded: boolean,\n\tisPartial: boolean,\n\ttheme: Theme,\n): Text | undefined {\n\tconst panel = details.panel;\n\tif (details.mode !== \"panel\" || !panel) return undefined;\n\tconst running = isPartial || panel.state === \"running\";\n\tconst status = running ? \"running\" : panel.state;\n\tconst color =\n\t\tstatus === \"completed\"\n\t\t\t? \"success\"\n\t\t\t: status === \"running\" || status === \"degraded\"\n\t\t\t\t? \"warning\"\n\t\t\t\t: \"error\";\n\tlet text = `${theme.fg(color, status)} ${theme.fg(\"accent\", safeLine(panel.preset, \"panel\", 128))}`;\n\ttext += theme.fg(\n\t\t\"muted\",\n\t\t` \u00B7 valid ${panel.validReviewCount}/${panel.reviewerIds.length} \u00B7 failed ${panel.failedReviewCount} \u00B7 blockers ${panel.blockingObjectionCount} \u00B7 dissent ${panel.dissentCount}`,\n\t);\n\tif (panel.synthesis) {\n\t\ttext += `\\n${theme.fg(\"toolOutput\", safeBlock(panel.synthesis.summary, \"\", 8 * 1024))}`;\n\t} else if (panel.state === \"insufficient-panel\") {\n\t\ttext += `\\n${theme.fg(\"warning\", \"Synthesis skipped because too few valid reviews remained.\")}`;\n\t}\n\tif (!expanded) return new Text(text, 0, 0);\n\n\ttext += `\\n\\n${theme.fg(\"muted\", \"Shared task: \")}${theme.fg(\"dim\", safeBlock(panel.sharedTaskPreview, \"\", 2 * 1024))}`;\n\ttext += `\\n\\n${theme.fg(\"muted\", \"Reviewers:\")}`;\n\tfor (const reviewerId of panel.reviewerIds) {\n\t\tconst artifact = panel.evidence.find((candidate) => candidate.reviewerId === reviewerId);\n\t\tconst failure = panel.failures.find((candidate) => candidate.reviewerId === reviewerId);\n\t\tconst result = details.results.find(\n\t\t\t(candidate) => candidate.step === panel.reviewerIds.indexOf(reviewerId) + 1,\n\t\t);\n\t\tconst model = result?.actualModel ?? result?.model;\n\t\ttext += `\\n ${theme.fg(\"accent\", safeLine(reviewerId, \"reviewer\", 256))}`;\n\t\tif (model) text += theme.fg(\"muted\", ` \u00B7 ${safeLine(model, \"\", 256)}`);\n\t\tif (artifact) {\n\t\t\ttext += theme.fg(\n\t\t\t\t\"muted\",\n\t\t\t\t` \u00B7 ${artifact.review.disposition} \u00B7 revision ${artifact.revision}`,\n\t\t\t);\n\t\t\tfor (const finding of artifact.review.findings) {\n\t\t\t\ttext += `\\n ${theme.fg(finding.severity === \"critical\" || finding.severity === \"high\" ? \"error\" : \"warning\", `[${finding.severity}]`)} ${safeLine(finding.title, \"finding\", 512)}`;\n\t\t\t}\n\t\t} else if (failure) {\n\t\t\ttext += theme.fg(\"error\", ` \u00B7 ${safeLine(failure.kind, \"failed\", 128)}`);\n\t\t}\n\t}\n\tif (panel.synthesis?.disagreements.length) {\n\t\ttext += `\\n\\n${theme.fg(\"muted\", \"Disagreements:\")}`;\n\t\tfor (const disagreement of panel.synthesis.disagreements) {\n\t\t\ttext += `\\n ${safeLine(disagreement.summary, \"disagreement\", 1024)}`;\n\t\t}\n\t}\n\tif (panel.synthesis?.objections.length) {\n\t\ttext += `\\n\\n${theme.fg(\"muted\", \"Blocking objections:\")}`;\n\t\tfor (const objection of panel.synthesis.objections) {\n\t\t\ttext += `\\n ${safeLine(`${objection.reviewerId}/${objection.findingId}: ${objection.resolution}`, \"objection\", 1024)}`;\n\t\t}\n\t}\n\tconst limitations = panel.synthesis?.limitations ?? [];\n\tif (limitations.length) {\n\t\ttext += `\\n\\n${theme.fg(\"muted\", \"Limitations:\")}`;\n\t\tfor (const limitation of limitations) text += `\\n ${safeLine(limitation, \"\", 1024)}`;\n\t}\n\ttext += `\\n\\n${theme.fg(\"muted\", `Budget: review ${panel.budgets.reviewMs}ms \u00B7 finalization ${panel.budgets.finalizationMs}ms \u00B7 synthesis ${panel.budgets.synthesisMs}ms \u00B7 cleanup ${panel.budgets.cleanupMs}ms`)}`;\n\ttext += `\\n${theme.fg(\"muted\", `Cleanup: ${panel.cleanupComplete ? \"complete\" : \"pending\"}`)}`;\n\treturn new Text(text, 0, 0);\n}\n\nfunction preview(value: unknown, maxLength: number): string {\n\tconst text = safeLine(value, \"\", 2 * 1024);\n\treturn text.length > maxLength ? `${text.slice(0, maxLength)}...` : text;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
3
|
+
"sources": ["../src/subagents-extension.ts", "../src/config-registration.ts", "../src/render.ts", "../src/panel-render.ts", "../src/usage-recording.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Subagent Tool - Delegate tasks to specialized agents\n *\n * Spawns a separate `pi` process for each subagent invocation,\n * giving it an isolated context window.\n *\n * Supports blocking single, parallel, chain, workflow, and panel modes.\n *\n * Uses JSON mode to capture structured output from subagents.\n */\n\nimport {\n\tCONFIG_DIR_NAME,\n\ttype ExtensionAPI,\n\ttype ToolDefinition,\n} from \"@earendil-works/pi-coding-agent\";\nimport { discoverAgentCatalog, formatAgentCatalog } from \"./agents/catalog.js\";\nimport type {\n\tConsultationCwdPolicy,\n\tConsultResourcePolicy,\n\tDelegationCwdPolicy,\n\tSubagentSettings,\n} from \"./agents/types.js\";\nimport { cachedModuleLoader, throwIfAborted } from \"./cached-module-loader.js\";\nimport { renderCompletionMessage, SUBAGENT_COMPLETION_MESSAGE_TYPE } from \"./completion-render.js\";\nimport {\n\ttype ConfigRegistrationDependencies,\n\tregisterSubagentConfigCommand,\n\tregisterSubagentConfigLifecycle,\n} from \"./config-registration.js\";\nimport {\n\ttype ConsultRegistrationDependencies,\n\tregisterSubagentConsult,\n} from \"./consult-registration.js\";\nimport {\n\ttype InspectRegistrationDependencies,\n\tregisterSubagentInspect,\n} from \"./inspect-registration.js\";\nimport { MAX_BLOCKING_PARALLEL_CONCURRENCY } from \"./limits.js\";\nimport { SubagentParams } from \"./params.js\";\nimport { renderSubagentCall, renderSubagentResult } from \"./render.js\";\nimport {\n\tconsumeSubagentSettingsNotice,\n\tDEFAULT_CONSULT_RESOURCE_POLICY,\n\tDEFAULT_CONSULTATION_CWD_POLICY,\n\tDEFAULT_DELEGATION_CWD_POLICY,\n\tinspectSubagentSettings,\n\treadSubagentSettings,\n\tresolveBlockingMaxParallelTasks,\n} from \"./settings-reader.js\";\nimport { registerStatefulSubagents } from \"./stateful-registration.js\";\nimport type { SubagentDetails } from \"./subagent-details.js\";\nimport type { SubagentTransport } from \"./transport.js\";\nimport {\n\tregisterUsageRecording,\n\ttype UsageRecordingDependencies,\n\ttype UsageSurfaceArm,\n} from \"./usage-recording.js\";\nimport { resolveUsageRecordingEnabled } from \"./usage-recording-config.js\";\n\ntype BlockingExecutionModule = Pick<typeof import(\"./execution.js\"), \"executeSubagent\">;\n\nexport interface SubagentsDependencies {\n\tloadBlockingExecution?: () => Promise<BlockingExecutionModule>;\n\tloadStatefulTransport?: () => Promise<SubagentTransport>;\n\tconfig?: ConfigRegistrationDependencies;\n\tconsult?: ConsultRegistrationDependencies;\n\tinspect?: InspectRegistrationDependencies;\n\tusageRecording?: Partial<UsageRecordingDependencies>;\n}\n\nexport default function (pi: ExtensionAPI, dependencies: SubagentsDependencies = {}) {\n\tpi.registerMessageRenderer(SUBAGENT_COMPLETION_MESSAGE_TYPE, renderCompletionMessage);\n\tconst loadBlockingExecution = cachedModuleLoader(\n\t\tdependencies.loadBlockingExecution ?? (() => import(\"./execution.js\")),\n\t);\n\tconst configOwner = registerSubagentConfigLifecycle(pi);\n\tconst usageRecording = registerUsageRecording(pi, dependencies.usageRecording);\n\tconst settings = readSubagentSettings();\n\tlet currentSettings: SubagentSettings | undefined = settings;\n\tlet currentCatalog = \"\";\n\tconst blockingEnabled = settings?.blocking?.enabled !== false;\n\tconst refreshBlockingCatalog = blockingEnabled\n\t\t? registerBlockingSubagent(pi, () => currentSettings, loadBlockingExecution)\n\t\t: () => undefined;\n\tlet refreshStatefulCatalog: (catalog: string) => void = () => undefined;\n\tlet refreshConsultCatalog: (catalog: string) => void = () => undefined;\n\n\tpi.on(\"session_start\", async (event, ctx) => {\n\t\t// Preserve a one-shot migration notice from extension load while refreshing\n\t\t// validation against settings that may have changed before this session.\n\t\tconst loadNotice = consumeSubagentSettingsNotice();\n\t\tconst refreshedSettings = readSubagentSettings();\n\t\tconst refreshedNotice = consumeSubagentSettingsNotice();\n\t\tif (!inspectSubagentSettings().error) currentSettings = refreshedSettings;\n\t\tconst notice = [\n\t\t\t...new Set([loadNotice, refreshedNotice].filter((value) => value !== undefined)),\n\t\t].join(\"\\n\");\n\t\tif (notice) ctx.ui.notify(notice, \"warning\");\n\n\t\tcurrentCatalog = formatAgentCatalog(\n\t\t\tdiscoverAgentCatalog(ctx.cwd, ctx.isProjectTrusted(), refreshedSettings),\n\t\t).text;\n\t\trefreshBlockingCatalog(currentCatalog);\n\t\trefreshStatefulCatalog(currentCatalog);\n\t\trefreshConsultCatalog(currentCatalog);\n\t\tawait usageRecording.startSession({\n\t\t\tenabled: resolveUsageRecordingEnabled(currentSettings?.usageRecording),\n\t\t\tsurfaceArm: usageSurfaceArm(blockingEnabled, statefulRuntime.getRuntimeStatus().enabled),\n\t\t\treason: event.reason,\n\t\t\tonWarning: (message) => {\n\t\t\t\tif (ctx.hasUI) ctx.ui.notify(message, \"warning\");\n\t\t\t},\n\t\t});\n\t});\n\n\tconst statefulRuntime = registerStatefulSubagents(pi, {\n\t\tblockingEnabled,\n\t\tsettings: settings?.stateful,\n\t\tgetSettings: () => currentSettings,\n\t\tloadTransport: dependencies.loadStatefulTransport,\n\t\tusageRecording,\n\t});\n\trefreshStatefulCatalog = statefulRuntime.setAgentCatalog;\n\tconst getBlockingEnabled = () => blockingEnabled;\n\tconst getMaxParallelTasks = () => resolveBlockingMaxParallelTasks(currentSettings);\n\tconst getConsultResourcePolicy = () =>\n\t\tcurrentSettings?.consult?.resources ?? DEFAULT_CONSULT_RESOURCE_POLICY;\n\tconst getConsultationCwdPolicy = () =>\n\t\tcurrentSettings?.cwdPolicy?.consultation ?? DEFAULT_CONSULTATION_CWD_POLICY;\n\tconst getDelegationCwdPolicy = () =>\n\t\tcurrentSettings?.cwdPolicy?.delegation ?? DEFAULT_DELEGATION_CWD_POLICY;\n\tregisterSubagentInspect(\n\t\tpi,\n\t\t{\n\t\t\t...statefulRuntime,\n\t\t\tgetBlockingEnabled,\n\t\t\tgetMaxParallelTasks,\n\t\t\tgetConsultResourcePolicy,\n\t\t\tgetConsultationCwdPolicy,\n\t\t\tgetDelegationCwdPolicy,\n\t\t\tgetUsageRecordingStatus: () => usageRecording.getStatus(),\n\t\t},\n\t\tdependencies.inspect,\n\t);\n\tif (blockingEnabled) {\n\t\trefreshConsultCatalog = registerSubagentConsult(\n\t\t\tpi,\n\t\t\t{ getSettings: () => currentSettings },\n\t\t\tdependencies.consult,\n\t\t);\n\t}\n\tregisterSubagentConfigCommand(\n\t\tpi,\n\t\t{\n\t\t\t...statefulRuntime,\n\t\t\tgetBlockingEnabled,\n\t\t\tgetMaxParallelTasks,\n\t\t\tgetConsultResourcePolicy,\n\t\t\tgetConsultationCwdPolicy,\n\t\t\tgetDelegationCwdPolicy,\n\t\t\tgetUsageRecordingEnabled: () => usageRecording.getStatus().enabled,\n\t\t\tgetUsageRecordingStatus: () => usageRecording.getStatus(),\n\t\t\tsetUsageRecordingEnabled: async (value: boolean) => {\n\t\t\t\tawait usageRecording.setEnabled(value);\n\t\t\t\tcurrentSettings = {\n\t\t\t\t\t...(currentSettings ?? {}),\n\t\t\t\t\tusageRecording: { ...(currentSettings?.usageRecording ?? {}), enabled: value },\n\t\t\t\t};\n\t\t\t},\n\t\t\tsetMaxParallelTasks(value: number) {\n\t\t\t\tconst previousSettings = currentSettings;\n\t\t\t\tcurrentSettings = {\n\t\t\t\t\t...(currentSettings ?? {}),\n\t\t\t\t\tblocking: { ...(currentSettings?.blocking ?? {}), maxParallelTasks: value },\n\t\t\t\t};\n\t\t\t\ttry {\n\t\t\t\t\trefreshBlockingCatalog(currentCatalog);\n\t\t\t\t} catch (applyError) {\n\t\t\t\t\tcurrentSettings = previousSettings;\n\t\t\t\t\ttry {\n\t\t\t\t\t\trefreshBlockingCatalog(currentCatalog);\n\t\t\t\t\t} catch (rollbackError) {\n\t\t\t\t\t\tthrow new AggregateError(\n\t\t\t\t\t\t\t[applyError, rollbackError],\n\t\t\t\t\t\t\t\"Failed to apply and roll back the parallel-worker limit\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tthrow applyError;\n\t\t\t\t}\n\t\t\t},\n\t\t\tsetConsultResourcePolicy(value: ConsultResourcePolicy) {\n\t\t\t\tcurrentSettings = {\n\t\t\t\t\t...(currentSettings ?? {}),\n\t\t\t\t\tconsult: { ...(currentSettings?.consult ?? {}), resources: value },\n\t\t\t\t};\n\t\t\t\trefreshConsultCatalog(currentCatalog);\n\t\t\t},\n\t\t\tsetConsultationCwdPolicy(value: ConsultationCwdPolicy) {\n\t\t\t\tcurrentSettings = {\n\t\t\t\t\t...(currentSettings ?? {}),\n\t\t\t\t\tcwdPolicy: { ...(currentSettings?.cwdPolicy ?? {}), consultation: value },\n\t\t\t\t};\n\t\t\t\trefreshConsultCatalog(currentCatalog);\n\t\t\t},\n\t\t\tsetDelegationCwdPolicy(value: DelegationCwdPolicy) {\n\t\t\t\tcurrentSettings = {\n\t\t\t\t\t...(currentSettings ?? {}),\n\t\t\t\t\tcwdPolicy: { ...(currentSettings?.cwdPolicy ?? {}), delegation: value },\n\t\t\t\t};\n\t\t\t\trefreshBlockingCatalog(currentCatalog);\n\t\t\t\tstatefulRuntime.refreshSettingsGuidance();\n\t\t\t},\n\t\t},\n\t\tconfigOwner,\n\t\tdependencies.config,\n\t);\n\tpi.on(\"session_shutdown\", (event) => usageRecording.shutdown(event.reason));\n}\n\nfunction usageSurfaceArm(blockingEnabled: boolean, statefulEnabled: boolean): UsageSurfaceArm {\n\tif (blockingEnabled && statefulEnabled) return \"all\";\n\tif (statefulEnabled) return \"async-only\";\n\tif (blockingEnabled) return \"blocking-only\";\n\treturn \"disabled\";\n}\n\nfunction registerBlockingSubagent(\n\tpi: ExtensionAPI,\n\tgetSettings: () => SubagentSettings | undefined,\n\tloadExecution: () => Promise<BlockingExecutionModule>,\n): (catalog: string) => void {\n\tlet catalog = \"\";\n\tlet deprecationWarningShown = false;\n\tconst activeControllers = new Set<AbortController>();\n\tconst activeWork = new Set<Promise<unknown>>();\n\tconst cancelAndWaitForWork = async (reason: string) => {\n\t\tfor (const controller of activeControllers) {\n\t\t\tcontroller.abort(new DOMException(reason, \"AbortError\"));\n\t\t}\n\t\tawait Promise.allSettled([...activeWork]);\n\t};\n\tpi.on(\"session_start\", () => {\n\t\tdeprecationWarningShown = false;\n\t\treturn cancelAndWaitForWork(\"Blocking subagent session replaced\");\n\t});\n\tpi.on(\"session_shutdown\", () => cancelAndWaitForWork(\"Blocking subagent session shut down\"));\n\tconst statefulEnabled = () => getSettings()?.stateful?.enabled !== false;\n\tconst deprecationAlternatives = () =>\n\t\tstatefulEnabled()\n\t\t\t? \"Prefer the main agent for tightly coupled work, subagent_spawn for detached work, subagent_await for an intentional retained-agent join, or subagent_consult for bounded synchronous read-only evidence.\"\n\t\t\t: \"Prefer the main agent for tightly coupled work or subagent_consult for bounded synchronous read-only evidence; enable the background workflow before using detached alternatives.\";\n\tconst baseDescription = () =>\n\t\t[\n\t\t\t\"Deprecated compatibility tool: do not choose subagent for new work.\",\n\t\t\tdeprecationAlternatives(),\n\t\t\t\"Run specialized subagents as a blocking operation with isolated contexts.\",\n\t\t\t\"The call blocks the main agent until every worker and optional aggregator finishes, so queued steering waits.\",\n\t\t\t\"Modes: single (agent + task), parallel (tasks array), chain (sequential with {previous} placeholder), workflow (named dependency tasks with optional capability routing), or panel (independent reviewers plus evidence-preserving synthesis).\",\n\t\t\t\"Parallel mode may include an aggregator fan-in step; workflow mode validates dependencies, authority, artifacts, scope conflicts, retries, and hedging before scheduling. Use subagent_consult instead for one synchronous child that must be executor-constrained to read-only tools.\",\n\t\t\t'Default agent scope is \"user\" (from ~/.pi/agent/agents).',\n\t\t\t`To enable project-local agents in ${CONFIG_DIR_NAME}/agents, pass agentScope: \"both\" (or \"project\") as a top-level argument for that call.`,\n\t\t\t`Maximum parallel worker tasks per call: ${resolveBlockingMaxParallelTasks(getSettings())}. Parallel execution starts at most ${MAX_BLOCKING_PARALLEL_CONCURRENCY} workers at once.`,\n\t\t\t`Working-directory target policy: ${getSettings()?.cwdPolicy?.delegation ?? DEFAULT_DELEGATION_CWD_POLICY}. This controls launch targets and protected project resources, not filesystem access or sandboxing.`,\n\t\t].join(\" \");\n\tconst promptGuidelines = () => [\n\t\tstatefulEnabled()\n\t\t\t? \"The subagent tool is deprecated for new work; prefer the main agent, subagent_spawn with supported completion delivery, subagent_await for an intentional retained-agent join, or subagent_consult for bounded synchronous read-only evidence.\"\n\t\t\t: \"The subagent tool is deprecated for new work; prefer the main agent or subagent_consult for bounded synchronous read-only evidence, and enable the background workflow before using detached alternatives.\",\n\t\t\"Use deprecated subagent only for an existing caller or an explicit user request whose blocking chain, fan-in, panel, or workflow semantics do not yet have a detached replacement.\",\n\t\t\"When compatibility requires subagent, decide how many subagents to spawn from task shape instead of waiting for the user to specify a count.\",\n\t\t\"The main agent retains overall planning, immediate critical-path work, integration, final verification, and the final answer.\",\n\t\t\"Use no subagent for simple answers, quick targeted edits, latency-sensitive one-step work, tasks requiring frequent user back-and-forth, or critical-path work the main agent can perform directly.\",\n\t\t\"One ordinary implementation worker should not replace work the main agent can perform directly; use a blocking single only when intentional synchronous isolation or a user-requested specialist justifies waiting.\",\n\t\t\"Keep ordinary planning in the main agent, or use explicit workflow mode when a genuine dependency graph requires caller-authored orchestration.\",\n\t\t\"Keep ordinary review in the main agent with a review skill and deterministic checks; reserve panel mode or custom verifier agents for consequential independent verification.\",\n\t\t\"A compatibility subagent call blocks the main agent from processing queued steering until it returns; use it only when the explicit legacy workflow justifies making Pi unavailable.\",\n\t\t`If a blocking parallel subagent call is genuinely required, keep tasks independent, stay within the configured max ${resolveBlockingMaxParallelTasks(getSettings())}, and avoid write-heavy implementation touching the same files or shared state.`,\n\t\t\"For parallel subagent calls, omit the aggregator key entirely unless a fan-in step is required; do not send null, empty strings, or an empty object for unused optional fields.\",\n\t\t\"Use workflow mode for explicit dependencies or capability routing; declare read/write or ownership scopes, require structured-v2 artifacts when downstream tasks consume them, and use retry or hedging only with the required side-effect contract.\",\n\t\t\"Use panel mode only for consequential review or research that benefits from at least two independent reviewers and one bounded synthesis; agreement is not proof, dissent and blocking objections remain visible, and simple or latency-sensitive work should not use a panel.\",\n\t\t'Do not use subagent with project-local agents unless the user explicitly wants project agents or sets agentScope to \"project\" or \"both\"; keep confirmation enabled for untrusted repositories.',\n\t\t\"When using subagent, write self-contained tasks with file paths, context, expected output, and whether the subagent may edit files.\",\n\t\t\"Set subagent timeoutMs to the shortest realistic work deadline for the task difficulty, just as thinkingLevel should match reasoning difficulty; split oversized tasks instead of extending the deadline merely to compensate for broad scope. Use totalTimeoutMs to cap an entire blocking workflow, idleTimeoutMs for stalled work, and maxTurns or maxToolCalls to stop repeated work without progress. Every budget stop preserves a bounded checkpoint and may make one separately bounded summary attempt.\",\n\t];\n\tconst definition: ToolDefinition<typeof SubagentParams, SubagentDetails> = {\n\t\tname: \"subagent\",\n\t\tlabel: \"Blocking Subagent \u00B7 Deprecated\",\n\t\tdescription: appendAgentCatalog(baseDescription(), catalog),\n\t\tpromptSnippet:\n\t\t\t\"Deprecated blocking subagent compatibility tool; prefer detached or read-only alternatives.\",\n\t\tpromptGuidelines: promptGuidelines(),\n\t\tparameters: SubagentParams,\n\n\t\tasync execute(toolCallId, params, signal, onUpdate, ctx) {\n\t\t\tconst lifecycleController = new AbortController();\n\t\t\tactiveControllers.add(lifecycleController);\n\t\t\tconst effectiveSignal = signal\n\t\t\t\t? AbortSignal.any([signal, lifecycleController.signal])\n\t\t\t\t: lifecycleController.signal;\n\t\t\tconst work = (async () => {\n\t\t\t\tthrowIfAborted(effectiveSignal, \"Blocking subagent execution was cancelled\");\n\t\t\t\tif (!deprecationWarningShown && ctx.hasUI) {\n\t\t\t\t\tdeprecationWarningShown = true;\n\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\tstatefulEnabled()\n\t\t\t\t\t\t\t? \"subagent is deprecated for new work. Prefer the main agent, subagent_spawn with completion delivery, subagent_await for an intentional join, or subagent_consult for synchronous read-only evidence.\"\n\t\t\t\t\t\t\t: \"subagent is deprecated for new work. Prefer the main agent or subagent_consult; enable the background workflow before using detached alternatives.\",\n\t\t\t\t\t\t\"warning\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tlet executionModule: BlockingExecutionModule;\n\t\t\t\ttry {\n\t\t\t\t\texecutionModule = await loadExecution();\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthrowIfAborted(\n\t\t\t\t\t\teffectiveSignal,\n\t\t\t\t\t\t\"Blocking subagent execution was cancelled while loading\",\n\t\t\t\t\t);\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\tthrowIfAborted(effectiveSignal, \"Blocking subagent execution was cancelled while loading\");\n\t\t\t\treturn executionModule.executeSubagent(\n\t\t\t\t\ttoolCallId,\n\t\t\t\t\tparams,\n\t\t\t\t\teffectiveSignal,\n\t\t\t\t\tonUpdate,\n\t\t\t\t\tctx,\n\t\t\t\t\tgetSettings(),\n\t\t\t\t);\n\t\t\t})();\n\t\t\tactiveWork.add(work);\n\t\t\ttry {\n\t\t\t\treturn await work;\n\t\t\t} finally {\n\t\t\t\tactiveControllers.delete(lifecycleController);\n\t\t\t\tactiveWork.delete(work);\n\t\t\t}\n\t\t},\n\n\t\trenderCall(args, theme) {\n\t\t\treturn renderSubagentCall(args, theme);\n\t\t},\n\n\t\trenderResult(result, options, theme) {\n\t\t\treturn renderSubagentResult(result, options, theme);\n\t\t},\n\t};\n\tpi.registerTool<typeof SubagentParams, SubagentDetails>(definition);\n\tpi.on(\"tool_result\", (event) => {\n\t\tif (event.toolName !== \"subagent\") return;\n\t\tif ((event.details as (SubagentDetails & { isError?: boolean }) | undefined)?.isError)\n\t\t\treturn { isError: true };\n\t});\n\treturn (nextCatalog: string) => {\n\t\tcatalog = nextCatalog;\n\t\tdefinition.description = appendAgentCatalog(baseDescription(), catalog);\n\t\tdefinition.promptGuidelines = promptGuidelines();\n\t\tpi.registerTool<typeof SubagentParams, SubagentDetails>(definition);\n\t};\n}\n\nfunction appendAgentCatalog(baseDescription: string, catalog: string): string {\n\treturn catalog ? `${baseDescription}\\n\\n${catalog}` : baseDescription;\n}\n", "import type { ExtensionAPI } from \"@earendil-works/pi-coding-agent\";\nimport { cachedModuleLoader } from \"./cached-module-loader.js\";\nimport type { SubagentMenuOwner, SubagentSettingsRuntime } from \"./config-ui.js\";\n\nconst SUBCOMMANDS = [\n\t{ value: \"settings\", label: \"settings\", description: \"Open grouped subagent settings\" },\n\t{ value: \"status\", label: \"status\", description: \"Show detailed subagent diagnostics\" },\n\t{ value: \"help\", label: \"help\", description: \"Show subagent first steps and safety help\" },\n];\n\ntype ConfigUiModule = Pick<\n\ttypeof import(\"./config-ui.js\"),\n\t\"showSubagentManager\" | \"showSubagentSettings\"\n>;\n\ntype ConfigStatusModule = Pick<\n\ttypeof import(\"./config-status.js\"),\n\t\"showSubagentHelp\" | \"showSubagentStatus\"\n>;\n\nexport interface ConfigRegistrationDependencies {\n\tloadConfigUi?: () => Promise<ConfigUiModule>;\n\tloadConfigStatus?: () => Promise<ConfigStatusModule>;\n}\n\nexport function registerSubagentConfigLifecycle(pi: ExtensionAPI): SubagentMenuOwner {\n\tconst owner: SubagentMenuOwner = { generation: 0, controller: new AbortController() };\n\tpi.on(\"session_start\", () => {\n\t\towner.generation += 1;\n\t\towner.controller.abort(new DOMException(\"Subagent session replaced\", \"AbortError\"));\n\t\towner.controller = new AbortController();\n\t});\n\tpi.on(\"session_shutdown\", () => {\n\t\towner.generation += 1;\n\t\towner.controller.abort(new DOMException(\"Subagent session shut down\", \"AbortError\"));\n\t});\n\treturn owner;\n}\n\nexport function registerSubagentConfigCommand(\n\tpi: ExtensionAPI,\n\truntime: SubagentSettingsRuntime,\n\towner = registerSubagentConfigLifecycle(pi),\n\tdependencies: ConfigRegistrationDependencies = {},\n): void {\n\tconst loadConfigUi = cachedModuleLoader(\n\t\tdependencies.loadConfigUi ?? (() => import(\"./config-ui.js\")),\n\t);\n\tconst loadConfigStatus = cachedModuleLoader<ConfigStatusModule>(\n\t\tdependencies.loadConfigStatus ?? (() => import(\"./config-status.js\")),\n\t);\n\tpi.registerCommand(\"subagents\", {\n\t\tdescription: \"Manage subagents, settings, diagnostics, and help\",\n\t\tgetArgumentCompletions(prefix: string) {\n\t\t\tconst normalized = prefix.trim().toLowerCase();\n\t\t\tconst matches = SUBCOMMANDS.filter((item) => item.value.startsWith(normalized));\n\t\t\treturn matches.length > 0 ? matches : null;\n\t\t},\n\t\tasync handler(args, ctx) {\n\t\t\tconst subcommand = args.trim().toLowerCase();\n\t\t\tconst runStatusCommand = async (show: (status: ConfigStatusModule) => void) => {\n\t\t\t\tconst generation = owner.generation;\n\t\t\t\tconst controller = owner.controller;\n\t\t\t\tconst isCurrent = () =>\n\t\t\t\t\tgeneration === owner.generation &&\n\t\t\t\t\tcontroller === owner.controller &&\n\t\t\t\t\t!controller.signal.aborted;\n\t\t\t\tlet status: ConfigStatusModule;\n\t\t\t\ttry {\n\t\t\t\t\tstatus = await loadConfigStatus();\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (!isCurrent()) return;\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\tif (!isCurrent()) return;\n\t\t\t\tshow(status);\n\t\t\t};\n\t\t\tif (!subcommand && ctx.mode !== \"tui\") {\n\t\t\t\tawait runStatusCommand((status) => status.showSubagentStatus(ctx, runtime));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (subcommand === \"status\") {\n\t\t\t\tawait runStatusCommand((status) => status.showSubagentStatus(ctx, runtime));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (subcommand === \"help\") {\n\t\t\t\tawait runStatusCommand((status) => status.showSubagentHelp(ctx, runtime));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!subcommand || subcommand === \"settings\") {\n\t\t\t\tconst generation = owner.generation;\n\t\t\t\tconst controller = owner.controller;\n\t\t\t\tconst isCurrent = () =>\n\t\t\t\t\tgeneration === owner.generation &&\n\t\t\t\t\tcontroller === owner.controller &&\n\t\t\t\t\t!controller.signal.aborted;\n\t\t\t\tlet configUi: ConfigUiModule;\n\t\t\t\ttry {\n\t\t\t\t\tconfigUi = await loadConfigUi();\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (!isCurrent()) return;\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\tif (!isCurrent()) return;\n\t\t\t\tif (!subcommand) await configUi.showSubagentManager(pi, ctx, runtime, owner);\n\t\t\t\telse await configUi.showSubagentSettings(pi, ctx, runtime, owner);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (ctx.mode === \"tui\" || ctx.hasUI) {\n\t\t\t\tctx.ui.notify(`Unknown /subagents subcommand: ${subcommand}`, \"warning\");\n\t\t\t}\n\t\t},\n\t});\n}\n", "import type { AgentToolResult } from \"@earendil-works/pi-agent-core\";\nimport type { Message } from \"@earendil-works/pi-ai\";\nimport {\n\tgetMarkdownTheme,\n\ttype Theme,\n\ttype ThemeColor,\n\ttype ToolRenderResultOptions,\n} from \"@earendil-works/pi-coding-agent\";\nimport { Container, Markdown, Spacer, Text } from \"@earendil-works/pi-tui\";\nimport type { AgentScope } from \"./agents/types.js\";\nimport { renderPanelCall, renderPanelResult } from \"./panel-render.js\";\nimport { hasUsableAggregator, type SubagentParams } from \"./params.js\";\nimport { expansionHint, formatToolActivity, safeBlock, safeLine } from \"./render-common.js\";\nimport { getResultFinalOutput, isResultError } from \"./runner-outcome.js\";\nimport type { SingleResult } from \"./runner-types.js\";\nimport type { SubagentDetails } from \"./subagent-details.js\";\nimport { formatUsageStats } from \"./usage-format.js\";\n\nconst COLLAPSED_ITEM_COUNT = 5;\n\nfunction previewTask(task: unknown, maxLength = 40): string {\n\tconst safe = safeLine(task, \"...\", 2 * 1024);\n\treturn safe.length > maxLength ? `${safe.slice(0, maxLength)}...` : safe;\n}\n\nfunction previewAgent(agent: unknown): string {\n\treturn safeLine(agent, \"...\", 256);\n}\n\nfunction formatResultUsageStats(result: SingleResult): string {\n\treturn formatUsageStats(\n\t\tresult.usage,\n\t\tresult.model,\n\t\tresult.thinkingLevel,\n\t\tresult.actualProvider,\n\t\tresult.actualModel,\n\t);\n}\n\nfunction formatToolCall(\n\ttoolName: string,\n\targs: Record<string, unknown>,\n\tthemeFg: (color: ThemeColor, text: string) => string,\n): string {\n\treturn formatToolActivity(toolName, args, themeFg);\n}\n\ntype DisplayItem =\n\t| { type: \"text\"; text: string }\n\t| { type: \"toolCall\"; name: string; args: Record<string, unknown> };\n\nfunction getDisplayItems(messages: Message[]): DisplayItem[] {\n\tconst items: DisplayItem[] = [];\n\tfor (const msg of messages) {\n\t\tif (msg.role === \"assistant\") {\n\t\t\tfor (const part of msg.content) {\n\t\t\t\tif (part.type === \"text\") {\n\t\t\t\t\tconst text = safeBlock(part.text, \"\", 8 * 1024).trim();\n\t\t\t\t\tif (text) items.push({ type: \"text\", text });\n\t\t\t\t} else if (part.type === \"toolCall\") {\n\t\t\t\t\titems.push({\n\t\t\t\t\t\ttype: \"toolCall\",\n\t\t\t\t\t\tname: safeLine(part.name, \"tool\", 256),\n\t\t\t\t\t\targs: part.arguments,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn items;\n}\nfunction getCollapsedDisplayItems(result: SingleResult): { items: DisplayItem[]; total: number } {\n\tif (result.recentActivity && result.recentActivity.length > 0) {\n\t\treturn {\n\t\t\titems: result.recentActivity,\n\t\t\ttotal: Math.max(result.recentActivity.length, result.recentActivityTotal ?? 0),\n\t\t};\n\t}\n\tconst items = getDisplayItems(result.messages);\n\treturn { items, total: items.length };\n}\n\nfunction sanitizeSingleResultForRender(result: SingleResult): SingleResult {\n\treturn {\n\t\t...result,\n\t\tagent: safeLine(result.agent, \"subagent\", 256),\n\t\ttask: safeBlock(result.task, \"\", 50 * 1024),\n\t\tstderr: safeBlock(result.stderr, \"\", 8 * 1024),\n\t\tmodel: result.model ? safeLine(result.model, \"\", 256) : undefined,\n\t\tactualProvider: result.actualProvider ? safeLine(result.actualProvider, \"\", 256) : undefined,\n\t\tactualModel: result.actualModel ? safeLine(result.actualModel, \"\", 256) : undefined,\n\t\tstopReason: result.stopReason ? safeLine(result.stopReason, \"\", 256) : undefined,\n\t\terrorMessage: result.errorMessage ? safeBlock(result.errorMessage, \"\", 8 * 1024) : undefined,\n\t\tfinalOutput: result.finalOutput ? safeBlock(result.finalOutput, \"\", 50 * 1024) : undefined,\n\t};\n}\n\nfunction renderResultStatus(result: SingleResult, isPartial: boolean): string {\n\tif (result.outcome && ![\"completed\", \"partial\"].includes(result.outcome.status)) {\n\t\treturn result.outcome.status\n\t\t\t.split(\"-\")\n\t\t\t.map((part) => `${part.slice(0, 1).toUpperCase()}${part.slice(1)}`)\n\t\t\t.join(\" \");\n\t}\n\tif (isResultError(result)) {\n\t\treturn result.stopReason === \"aborted\" || result.aborted ? \"Cancelled\" : \"Failed\";\n\t}\n\treturn isPartial || result.exitCode === -1 ? \"Running\" : \"Completed\";\n}\n\nfunction coloredStatus(theme: Theme, status: string): string {\n\tconst color: ThemeColor =\n\t\tstatus === \"Failed\" ? \"error\" : status === \"Completed\" ? \"success\" : \"warning\";\n\treturn theme.fg(color, status);\n}\n\nfunction coloredResultStatus(theme: Theme, result: SingleResult, isPartial: boolean): string {\n\treturn coloredStatus(theme, renderResultStatus(result, isPartial));\n}\n\nfunction formatResultIntelligence(result: SingleResult): string {\n\tconst structured =\n\t\tresult.structuredResult?.version === \"pi-subagents:result:v2\"\n\t\t\t? result.structuredResult\n\t\t\t: undefined;\n\treturn [\n\t\tresult.contract ? `contract: ${result.contract.level} \u00B7 ${result.contract.taskId}` : undefined,\n\t\tresult.outcome\n\t\t\t? `outcome: ${result.outcome.status}${result.outcome.reasonCode ? ` \u00B7 ${result.outcome.reasonCode}` : \"\"}`\n\t\t\t: undefined,\n\t\tstructured\n\t\t\t? `evidence: ${structured.claims.length} claims \u00B7 ${structured.artifacts.length} artifacts \u00B7 ${structured.verification.length} verification items \u00B7 ${structured.limitations.length} limitations`\n\t\t\t: undefined,\n\t\tresult.resultContractInvalid ? \"contract warning: invalid structured result\" : undefined,\n\t\tresult.executionPlan\n\t\t\t? `plan: ${result.executionPlan.id.slice(0, 12)} \u00B7 generation ${result.executionPlan.taskGeneration} \u00B7 admission ${result.executionPlan.admission.recommendation}`\n\t\t\t: undefined,\n\t\tresult.capabilityGrant\n\t\t\t? `grant: ${result.capabilityGrant.state} \u00B7 expires ${result.capabilityGrant.expiresAt}`\n\t\t\t: undefined,\n\t]\n\t\t.filter((line): line is string => Boolean(line))\n\t\t.join(\"\\n\");\n}\n\nfunction formatResultPolicy(result: SingleResult): string {\n\tif (!result.policy) return \"\";\n\treturn [\n\t\t`inherited: ${result.policy.inherited.map((tool) => safeLine(tool, \"\", 256)).join(\", \") || \"none\"}`,\n\t\t`overridden: ${result.policy.overridden.map((tool) => safeLine(tool, \"\", 256)).join(\", \") || \"none\"}`,\n\t\t`unsupported: ${result.policy.unsupported.map((tool) => safeLine(tool, \"\", 256)).join(\", \") || \"none\"}`,\n\t].join(\"\\n\");\n}\n\nexport function renderSubagentCall(args: SubagentParams, theme: Theme) {\n\tconst scope: AgentScope = args.agentScope ?? \"user\";\n\tconst limits = [\n\t\ttypeof args.timeoutMs === \"number\" ? `timeout:${args.timeoutMs}ms` : undefined,\n\t\ttypeof args.totalTimeoutMs === \"number\" ? `total:${args.totalTimeoutMs}ms` : undefined,\n\t\ttypeof args.idleTimeoutMs === \"number\" ? `idle:${args.idleTimeoutMs}ms` : undefined,\n\t\ttypeof args.maxTurns === \"number\" ? `turns:${args.maxTurns}` : undefined,\n\t\ttypeof args.maxToolCalls === \"number\" ? `tools:${args.maxToolCalls}` : undefined,\n\t].filter((value): value is string => Boolean(value));\n\tconst limitText = limits.length > 0 ? ` \u00B7 ${limits.join(\" \u00B7 \")}` : \"\";\n\tconst panelCall = renderPanelCall(args, theme);\n\tif (panelCall) return panelCall;\n\tif (args.workflow && args.workflow.tasks.length > 0) {\n\t\tlet text =\n\t\t\ttheme.fg(\"toolTitle\", theme.bold(\"subagent \")) +\n\t\t\ttheme.fg(\"accent\", `workflow (${args.workflow.tasks.length} tasks)`) +\n\t\t\ttheme.fg(\"muted\", ` [${scope}]${limitText}`);\n\t\tfor (const task of args.workflow.tasks.slice(0, 3)) {\n\t\t\ttext += `\\n ${theme.fg(\"muted\", `${task.id}:`)} ${theme.fg(\"accent\", previewAgent(task.agent))}${theme.fg(\"dim\", ` ${previewTask(task.task)}`)}`;\n\t\t}\n\t\tif (args.workflow.tasks.length > 3) {\n\t\t\ttext += `\\n ${theme.fg(\"muted\", `... +${args.workflow.tasks.length - 3} more`)}`;\n\t\t}\n\t\treturn new Text(text, 0, 0);\n\t}\n\tif (args.chain && args.chain.length > 0) {\n\t\tlet text =\n\t\t\ttheme.fg(\"toolTitle\", theme.bold(\"subagent \")) +\n\t\t\ttheme.fg(\"accent\", `chain (${args.chain.length} steps)`) +\n\t\t\ttheme.fg(\"muted\", ` [${scope}]${limitText}`);\n\t\tfor (let i = 0; i < Math.min(args.chain.length, 3); i++) {\n\t\t\tconst step = args.chain[i] as { agent?: unknown; task?: unknown } | undefined;\n\t\t\t// Clean up {previous} placeholder for display\n\t\t\tconst cleanTask =\n\t\t\t\ttypeof step?.task === \"string\" ? step.task.replace(/\\{previous\\}/g, \"\").trim() : undefined;\n\t\t\ttext +=\n\t\t\t\t\"\\n \" +\n\t\t\t\ttheme.fg(\"muted\", `${i + 1}.`) +\n\t\t\t\t\" \" +\n\t\t\t\ttheme.fg(\"accent\", previewAgent(step?.agent)) +\n\t\t\t\ttheme.fg(\"dim\", ` ${previewTask(cleanTask)}`);\n\t\t}\n\t\tif (args.chain.length > 3)\n\t\t\ttext += `\\n ${theme.fg(\"muted\", `... +${args.chain.length - 3} more`)}`;\n\t\treturn new Text(text, 0, 0);\n\t}\n\tif (args.tasks && args.tasks.length > 0) {\n\t\tlet text =\n\t\t\ttheme.fg(\"toolTitle\", theme.bold(\"subagent \")) +\n\t\t\ttheme.fg(\"accent\", `parallel (${args.tasks.length} tasks)`) +\n\t\t\ttheme.fg(\"muted\", ` [${scope}]${limitText}`);\n\t\tfor (const task of args.tasks.slice(0, 3)) {\n\t\t\tconst item = task as { agent?: unknown; task?: unknown } | undefined;\n\t\t\ttext += `\\n ${theme.fg(\"accent\", previewAgent(item?.agent))}${theme.fg(\"dim\", ` ${previewTask(item?.task)}`)}`;\n\t\t}\n\t\tif (args.tasks.length > 3)\n\t\t\ttext += `\\n ${theme.fg(\"muted\", `... +${args.tasks.length - 3} more`)}`;\n\t\tif (hasUsableAggregator(args.aggregator)) {\n\t\t\tconst aggregator = args.aggregator;\n\t\t\ttext += `\\n ${theme.fg(\"muted\", \"fan-in \u2192 \")}${theme.fg(\"accent\", previewAgent(aggregator.agent))}${theme.fg(\n\t\t\t\t\"dim\",\n\t\t\t\t` ${previewTask(aggregator.task)}`,\n\t\t\t)}`;\n\t\t}\n\t\treturn new Text(text, 0, 0);\n\t}\n\tconst agentName = previewAgent(args.agent);\n\tconst preview = previewTask(args.task, 60);\n\tlet text =\n\t\ttheme.fg(\"toolTitle\", theme.bold(\"subagent \")) +\n\t\ttheme.fg(\"accent\", agentName) +\n\t\ttheme.fg(\"muted\", ` [${scope}]${limitText}`);\n\ttext += `\\n ${theme.fg(\"dim\", preview)}`;\n\treturn new Text(text, 0, 0);\n}\n\nexport function renderSubagentResult(\n\tresult: AgentToolResult<SubagentDetails>,\n\t{ expanded, isPartial }: ToolRenderResultOptions,\n\ttheme: Theme,\n) {\n\tconst rawDetails = result.details as SubagentDetails | undefined;\n\tif (rawDetails?.mode === \"panel\") {\n\t\tconst panelResult = renderPanelResult(rawDetails, expanded, isPartial, theme);\n\t\tif (panelResult) return panelResult;\n\t}\n\tif (!rawDetails || rawDetails.results.length === 0) {\n\t\tconst text = result.content[0];\n\t\treturn new Text(\n\t\t\ttext?.type === \"text\" ? safeBlock(text.text, \"(no output)\", 8 * 1024) : \"(no output)\",\n\t\t\t0,\n\t\t\t0,\n\t\t);\n\t}\n\tconst details: SubagentDetails = {\n\t\t...rawDetails,\n\t\tresults: rawDetails.results.map(sanitizeSingleResultForRender),\n\t\taggregator: rawDetails.aggregator\n\t\t\t? sanitizeSingleResultForRender(rawDetails.aggregator)\n\t\t\t: undefined,\n\t};\n\n\tconst mdTheme = getMarkdownTheme();\n\n\tconst renderDisplayItems = (items: DisplayItem[], limit?: number, total = items.length) => {\n\t\tconst toShow = limit ? items.slice(-limit) : items;\n\t\tconst skipped = Math.max(0, total - toShow.length);\n\t\tlet text = \"\";\n\t\tif (skipped > 0) text += theme.fg(\"muted\", `... ${skipped} earlier items\\n`);\n\t\tfor (const item of toShow) {\n\t\t\tif (item.type === \"text\") {\n\t\t\t\tconst safeText = safeBlock(item.text, \"\", 8 * 1024);\n\t\t\t\tconst preview = expanded ? safeText : safeText.split(\"\\n\").slice(0, 3).join(\"\\n\");\n\t\t\t\ttext += `${theme.fg(\"toolOutput\", preview)}\\n`;\n\t\t\t} else {\n\t\t\t\ttext += `${theme.fg(\"muted\", \"\u2192 \") + formatToolCall(item.name, item.args, theme.fg.bind(theme))}\\n`;\n\t\t\t}\n\t\t}\n\t\treturn text.trimEnd();\n\t};\n\n\tif (details.mode === \"single\" && details.results.length === 1) {\n\t\tconst r = details.results[0];\n\t\tconst isError = isResultError(r);\n\t\tconst icon = isError\n\t\t\t? theme.fg(\"error\", \"\u2717\")\n\t\t\t: isPartial\n\t\t\t\t? theme.fg(\"warning\", \"\u23F3\")\n\t\t\t\t: theme.fg(\"success\", \"\u2713\");\n\t\tconst displayItems = getDisplayItems(r.messages);\n\t\tconst finalOutput = getResultFinalOutput(r);\n\n\t\tif (expanded) {\n\t\t\tconst container = new Container();\n\t\t\tlet header = `${icon} ${theme.fg(\"toolTitle\", theme.bold(r.agent))}${theme.fg(\"muted\", ` (${safeLine(r.agentSource, \"unknown\", 128)})`)} \u00B7 ${coloredResultStatus(theme, r, isPartial)}`;\n\t\t\tif (isError && r.stopReason) header += ` ${theme.fg(\"error\", `[${r.stopReason}]`)}`;\n\t\t\tcontainer.addChild(new Text(header, 0, 0));\n\t\t\tif (isError && r.errorMessage)\n\t\t\t\tcontainer.addChild(new Text(theme.fg(\"error\", `Error: ${r.errorMessage}`), 0, 0));\n\t\t\tcontainer.addChild(new Spacer(1));\n\t\t\tcontainer.addChild(new Text(theme.fg(\"muted\", \"\u2500\u2500\u2500 Task \u2500\u2500\u2500\"), 0, 0));\n\t\t\tcontainer.addChild(new Text(theme.fg(\"dim\", r.task), 0, 0));\n\t\t\tconst intelligence = formatResultIntelligence(r);\n\t\t\tif (intelligence) {\n\t\t\t\tcontainer.addChild(new Spacer(1));\n\t\t\t\tcontainer.addChild(new Text(theme.fg(\"muted\", \"\u2500\u2500\u2500 Delegation \u2500\u2500\u2500\"), 0, 0));\n\t\t\t\tcontainer.addChild(new Text(theme.fg(\"dim\", intelligence), 0, 0));\n\t\t\t}\n\t\t\tconst policy = formatResultPolicy(r);\n\t\t\tif (policy) {\n\t\t\t\tcontainer.addChild(new Spacer(1));\n\t\t\t\tcontainer.addChild(new Text(theme.fg(\"muted\", \"\u2500\u2500\u2500 Policy \u2500\u2500\u2500\"), 0, 0));\n\t\t\t\tcontainer.addChild(new Text(theme.fg(\"dim\", policy), 0, 0));\n\t\t\t}\n\t\t\tcontainer.addChild(new Spacer(1));\n\t\t\tcontainer.addChild(new Text(theme.fg(\"muted\", \"\u2500\u2500\u2500 Output \u2500\u2500\u2500\"), 0, 0));\n\t\t\tif (displayItems.length === 0 && !finalOutput) {\n\t\t\t\tcontainer.addChild(new Text(theme.fg(\"muted\", \"(no output)\"), 0, 0));\n\t\t\t} else {\n\t\t\t\tfor (const item of displayItems) {\n\t\t\t\t\tif (item.type === \"toolCall\")\n\t\t\t\t\t\tcontainer.addChild(\n\t\t\t\t\t\t\tnew Text(\n\t\t\t\t\t\t\t\ttheme.fg(\"muted\", \"\u2192 \") +\n\t\t\t\t\t\t\t\t\tformatToolCall(item.name, item.args, theme.fg.bind(theme)),\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (finalOutput) {\n\t\t\t\t\tcontainer.addChild(new Spacer(1));\n\t\t\t\t\tcontainer.addChild(new Markdown(finalOutput.trim(), 0, 0, mdTheme));\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst usageStr = formatResultUsageStats(r);\n\t\t\tif (usageStr) {\n\t\t\t\tcontainer.addChild(new Spacer(1));\n\t\t\t\tcontainer.addChild(new Text(theme.fg(\"dim\", usageStr), 0, 0));\n\t\t\t}\n\t\t\treturn container;\n\t\t}\n\n\t\tconst collapsed = getCollapsedDisplayItems(r);\n\t\tlet text = `${icon} ${theme.fg(\"toolTitle\", theme.bold(r.agent))}${theme.fg(\"muted\", ` (${safeLine(r.agentSource, \"unknown\", 128)})`)} \u00B7 ${coloredResultStatus(theme, r, isPartial)}`;\n\t\tif (isError && r.stopReason) text += ` ${theme.fg(\"error\", `[${r.stopReason}]`)}`;\n\t\tif (isError && r.errorMessage) text += `\\n${theme.fg(\"error\", `Error: ${r.errorMessage}`)}`;\n\t\tif (collapsed.items.length > 0) {\n\t\t\ttext += `\\n${renderDisplayItems(collapsed.items, COLLAPSED_ITEM_COUNT, collapsed.total)}`;\n\t\t\tif (collapsed.total > COLLAPSED_ITEM_COUNT) text += `\\n${expansionHint()}`;\n\t\t} else if (finalOutput.trim()) {\n\t\t\tconst outputLines = finalOutput.trim().split(\"\\n\");\n\t\t\ttext += `\\n${theme.fg(\"toolOutput\", outputLines.slice(0, 3).join(\"\\n\"))}`;\n\t\t\tif (outputLines.length > 3) text += `\\n${expansionHint()}`;\n\t\t} else if (!isError || !r.errorMessage) {\n\t\t\ttext += `\\n${theme.fg(\"muted\", isPartial && !isError ? \"(running...)\" : \"(no output)\")}`;\n\t\t}\n\t\tconst usageStr = formatResultUsageStats(r);\n\t\tif (usageStr) text += `\\n${theme.fg(\"dim\", usageStr)}`;\n\t\treturn new Text(text, 0, 0);\n\t}\n\n\tconst aggregateUsage = (results: SingleResult[]) => {\n\t\tconst total = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, turns: 0 };\n\t\tfor (const r of results) {\n\t\t\ttotal.input += r.usage.input;\n\t\t\ttotal.output += r.usage.output;\n\t\t\ttotal.cacheRead += r.usage.cacheRead;\n\t\t\ttotal.cacheWrite += r.usage.cacheWrite;\n\t\t\ttotal.cost += r.usage.cost;\n\t\t\ttotal.turns += r.usage.turns;\n\t\t}\n\t\treturn total;\n\t};\n\n\tif (details.mode === \"chain\") {\n\t\tconst currentResult = details.results.at(-1);\n\t\tconst currentIsRunning =\n\t\t\tisPartial && currentResult !== undefined && !isResultError(currentResult);\n\t\tconst successCount = details.results.filter(\n\t\t\t(result) => !isResultError(result) && (!currentIsRunning || result !== currentResult),\n\t\t).length;\n\t\tconst icon = currentIsRunning\n\t\t\t? theme.fg(\"warning\", \"\u23F3\")\n\t\t\t: successCount === details.results.length\n\t\t\t\t? theme.fg(\"success\", \"\u2713\")\n\t\t\t\t: theme.fg(\"error\", \"\u2717\");\n\t\tconst overallStatus = currentIsRunning\n\t\t\t? \"Running\"\n\t\t\t: successCount === details.results.length\n\t\t\t\t? \"Completed\"\n\t\t\t\t: \"Failed\";\n\n\t\tif (expanded) {\n\t\t\tconst container = new Container();\n\t\t\tcontainer.addChild(\n\t\t\t\tnew Text(\n\t\t\t\t\ticon +\n\t\t\t\t\t\t\" \" +\n\t\t\t\t\t\ttheme.fg(\"toolTitle\", theme.bold(\"chain \")) +\n\t\t\t\t\t\ttheme.fg(\"accent\", `${successCount}/${details.results.length} steps`) +\n\t\t\t\t\t\t` \u00B7 ${coloredStatus(theme, overallStatus)}`,\n\t\t\t\t\t0,\n\t\t\t\t\t0,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tfor (const r of details.results) {\n\t\t\t\tconst rFailed = isResultError(r);\n\t\t\t\tconst rIcon = rFailed\n\t\t\t\t\t? theme.fg(\"error\", \"\u2717\")\n\t\t\t\t\t: currentIsRunning && r === currentResult\n\t\t\t\t\t\t? theme.fg(\"warning\", \"\u23F3\")\n\t\t\t\t\t\t: theme.fg(\"success\", \"\u2713\");\n\t\t\t\tconst displayItems = getDisplayItems(r.messages);\n\t\t\t\tconst finalOutput = getResultFinalOutput(r);\n\n\t\t\t\tcontainer.addChild(new Spacer(1));\n\t\t\t\tcontainer.addChild(\n\t\t\t\t\tnew Text(\n\t\t\t\t\t\t`${theme.fg(\"muted\", `\u2500\u2500\u2500 Step ${r.step}: `) + theme.fg(\"accent\", r.agent)} ${rIcon} ${coloredResultStatus(theme, r, currentIsRunning && r === currentResult)}`,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t0,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tcontainer.addChild(new Text(theme.fg(\"muted\", \"Task: \") + theme.fg(\"dim\", r.task), 0, 0));\n\t\t\t\tconst policy = formatResultPolicy(r);\n\t\t\t\tif (policy)\n\t\t\t\t\tcontainer.addChild(\n\t\t\t\t\t\tnew Text(theme.fg(\"muted\", \"Policy:\\n\") + theme.fg(\"dim\", policy), 0, 0),\n\t\t\t\t\t);\n\t\t\t\tif (rFailed && r.errorMessage)\n\t\t\t\t\tcontainer.addChild(new Text(theme.fg(\"error\", `Error: ${r.errorMessage}`), 0, 0));\n\n\t\t\t\t// Show tool calls\n\t\t\t\tfor (const item of displayItems) {\n\t\t\t\t\tif (item.type === \"toolCall\") {\n\t\t\t\t\t\tcontainer.addChild(\n\t\t\t\t\t\t\tnew Text(\n\t\t\t\t\t\t\t\ttheme.fg(\"muted\", \"\u2192 \") +\n\t\t\t\t\t\t\t\t\tformatToolCall(item.name, item.args, theme.fg.bind(theme)),\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Show final output as markdown\n\t\t\t\tif (finalOutput) {\n\t\t\t\t\tcontainer.addChild(new Spacer(1));\n\t\t\t\t\tcontainer.addChild(new Markdown(finalOutput.trim(), 0, 0, mdTheme));\n\t\t\t\t}\n\n\t\t\t\tconst stepUsage = formatResultUsageStats(r);\n\t\t\t\tif (stepUsage) container.addChild(new Text(theme.fg(\"dim\", stepUsage), 0, 0));\n\t\t\t}\n\n\t\t\tconst usageStr = formatUsageStats(aggregateUsage(details.results));\n\t\t\tif (usageStr) {\n\t\t\t\tcontainer.addChild(new Spacer(1));\n\t\t\t\tcontainer.addChild(new Text(theme.fg(\"dim\", `Total: ${usageStr}`), 0, 0));\n\t\t\t}\n\t\t\treturn container;\n\t\t}\n\n\t\t// Collapsed view\n\t\tlet text =\n\t\t\ticon +\n\t\t\t\" \" +\n\t\t\ttheme.fg(\"toolTitle\", theme.bold(\"chain \")) +\n\t\t\ttheme.fg(\"accent\", `${successCount}/${details.results.length} steps`) +\n\t\t\t` \u00B7 ${coloredStatus(theme, overallStatus)}`;\n\t\tfor (const r of details.results) {\n\t\t\tconst rFailed = isResultError(r);\n\t\t\tconst rIcon = rFailed\n\t\t\t\t? theme.fg(\"error\", \"\u2717\")\n\t\t\t\t: currentIsRunning && r === currentResult\n\t\t\t\t\t? theme.fg(\"warning\", \"\u23F3\")\n\t\t\t\t\t: theme.fg(\"success\", \"\u2713\");\n\t\t\tconst collapsed = getCollapsedDisplayItems(r);\n\t\t\tconst finalOutput = getResultFinalOutput(r).trim();\n\t\t\ttext += `\\n\\n${theme.fg(\"muted\", `\u2500\u2500\u2500 Step ${r.step}: `)}${theme.fg(\"accent\", r.agent)} ${rIcon} ${coloredResultStatus(theme, r, currentIsRunning && r === currentResult)}`;\n\t\t\tif (rFailed && r.errorMessage) text += `\\n${theme.fg(\"error\", `Error: ${r.errorMessage}`)}`;\n\t\t\tif (collapsed.items.length > 0)\n\t\t\t\ttext += `\\n${renderDisplayItems(collapsed.items, 5, collapsed.total)}`;\n\t\t\telse if (currentIsRunning && r === currentResult)\n\t\t\t\ttext += `\\n${theme.fg(\"muted\", \"(running...)\")}`;\n\t\t\telse if (finalOutput)\n\t\t\t\ttext += `\\n${theme.fg(\"toolOutput\", finalOutput.split(\"\\n\").slice(0, 3).join(\"\\n\"))}`;\n\t\t\telse if (!rFailed || !r.errorMessage) text += `\\n${theme.fg(\"muted\", \"(no output)\")}`;\n\t\t}\n\t\tconst usageStr = formatUsageStats(aggregateUsage(details.results));\n\t\tif (usageStr) text += `\\n\\n${theme.fg(\"dim\", `Total: ${usageStr}`)}`;\n\t\ttext += `\\n${expansionHint()}`;\n\t\treturn new Text(text, 0, 0);\n\t}\n\n\tif (details.mode === \"parallel\" || details.mode === \"workflow\") {\n\t\tconst modeLabel = details.mode === \"workflow\" ? \"workflow\" : \"parallel\";\n\t\tconst resultIsRunning = (result: SingleResult) =>\n\t\t\tresult.exitCode === -1 && !isResultError(result);\n\t\tconst running = details.results.filter(resultIsRunning).length;\n\t\tconst successCount = details.results.filter(\n\t\t\t(result) => result.exitCode !== -1 && !isResultError(result),\n\t\t).length;\n\t\tconst failCount = details.results.filter(isResultError).length;\n\t\tconst aggregator = details.aggregator;\n\t\tconst aggregatorFailed = aggregator ? isResultError(aggregator) : false;\n\t\tconst aggregatorRunning = aggregator\n\t\t\t? !aggregatorFailed && (isPartial || aggregator.exitCode === -1)\n\t\t\t: false;\n\t\tconst pendingSuccessfulSettlement =\n\t\t\tisPartial && !aggregator && running === 0 && failCount === 0;\n\t\tconst isRunning = running > 0 || aggregatorRunning || pendingSuccessfulSettlement;\n\t\tconst icon = isRunning\n\t\t\t? theme.fg(\"warning\", \"\u23F3\")\n\t\t\t: failCount > 0 || aggregatorFailed\n\t\t\t\t? theme.fg(\"warning\", \"\u25D0\")\n\t\t\t\t: theme.fg(\"success\", \"\u2713\");\n\t\tconst status = isRunning\n\t\t\t? aggregatorRunning\n\t\t\t\t? `${successCount + failCount}/${details.results.length} done, fan-in running`\n\t\t\t\t: running > 0\n\t\t\t\t\t? `${successCount + failCount}/${details.results.length} done, ${running} running`\n\t\t\t\t\t: `${successCount + failCount}/${details.results.length} done, running`\n\t\t\t: aggregator\n\t\t\t\t? `${successCount}/${details.results.length} tasks + fan-in`\n\t\t\t\t: `${successCount}/${details.results.length} tasks`;\n\t\tconst overallStatus = isRunning\n\t\t\t? \"Running\"\n\t\t\t: failCount > 0 || aggregatorFailed\n\t\t\t\t? \"Failed\"\n\t\t\t\t: \"Completed\";\n\n\t\tif (expanded && !isRunning) {\n\t\t\tconst container = new Container();\n\t\t\tcontainer.addChild(\n\t\t\t\tnew Text(\n\t\t\t\t\t`${icon} ${theme.fg(\"toolTitle\", theme.bold(`${modeLabel} `))}${theme.fg(\"accent\", status)} \u00B7 ${coloredStatus(theme, overallStatus)}`,\n\t\t\t\t\t0,\n\t\t\t\t\t0,\n\t\t\t\t),\n\t\t\t);\n\n\t\t\tfor (const r of details.results) {\n\t\t\t\tconst rFailed = isResultError(r);\n\t\t\t\tconst rIcon = rFailed\n\t\t\t\t\t? theme.fg(\"error\", \"\u2717\")\n\t\t\t\t\t: resultIsRunning(r)\n\t\t\t\t\t\t? theme.fg(\"warning\", \"\u23F3\")\n\t\t\t\t\t\t: theme.fg(\"success\", \"\u2713\");\n\t\t\t\tconst displayItems = getDisplayItems(r.messages);\n\t\t\t\tconst finalOutput = getResultFinalOutput(r);\n\n\t\t\t\tcontainer.addChild(new Spacer(1));\n\t\t\t\tcontainer.addChild(\n\t\t\t\t\tnew Text(\n\t\t\t\t\t\t`${theme.fg(\"muted\", \"\u2500\u2500\u2500 \") + theme.fg(\"accent\", r.agent)} ${rIcon} ${coloredResultStatus(theme, r, resultIsRunning(r))}`,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t0,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tcontainer.addChild(new Text(theme.fg(\"muted\", \"Task: \") + theme.fg(\"dim\", r.task), 0, 0));\n\t\t\t\tconst policy = formatResultPolicy(r);\n\t\t\t\tif (policy)\n\t\t\t\t\tcontainer.addChild(\n\t\t\t\t\t\tnew Text(theme.fg(\"muted\", \"Policy:\\n\") + theme.fg(\"dim\", policy), 0, 0),\n\t\t\t\t\t);\n\t\t\t\tif (rFailed && r.errorMessage)\n\t\t\t\t\tcontainer.addChild(new Text(theme.fg(\"error\", `Error: ${r.errorMessage}`), 0, 0));\n\n\t\t\t\t// Show tool calls\n\t\t\t\tfor (const item of displayItems) {\n\t\t\t\t\tif (item.type === \"toolCall\") {\n\t\t\t\t\t\tcontainer.addChild(\n\t\t\t\t\t\t\tnew Text(\n\t\t\t\t\t\t\t\ttheme.fg(\"muted\", \"\u2192 \") +\n\t\t\t\t\t\t\t\t\tformatToolCall(item.name, item.args, theme.fg.bind(theme)),\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Show final output as markdown\n\t\t\t\tif (finalOutput) {\n\t\t\t\t\tcontainer.addChild(new Spacer(1));\n\t\t\t\t\tcontainer.addChild(new Markdown(finalOutput.trim(), 0, 0, mdTheme));\n\t\t\t\t}\n\n\t\t\t\tconst taskUsage = formatResultUsageStats(r);\n\t\t\t\tif (taskUsage) container.addChild(new Text(theme.fg(\"dim\", taskUsage), 0, 0));\n\t\t\t}\n\n\t\t\tif (aggregator) {\n\t\t\t\tconst rIcon = aggregatorFailed\n\t\t\t\t\t? theme.fg(\"error\", \"\u2717\")\n\t\t\t\t\t: aggregatorRunning\n\t\t\t\t\t\t? theme.fg(\"warning\", \"\u23F3\")\n\t\t\t\t\t\t: theme.fg(\"success\", \"\u2713\");\n\t\t\t\tconst displayItems = getDisplayItems(aggregator.messages);\n\t\t\t\tconst finalOutput = getResultFinalOutput(aggregator);\n\n\t\t\t\tcontainer.addChild(new Spacer(1));\n\t\t\t\tcontainer.addChild(\n\t\t\t\t\tnew Text(\n\t\t\t\t\t\t`${theme.fg(\"muted\", \"\u2500\u2500\u2500 fan-in \u2192 \") + theme.fg(\"accent\", aggregator.agent)} ${rIcon} ${coloredResultStatus(theme, aggregator, aggregatorRunning)}`,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t0,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tcontainer.addChild(\n\t\t\t\t\tnew Text(theme.fg(\"muted\", \"Task: \") + theme.fg(\"dim\", aggregator.task), 0, 0),\n\t\t\t\t);\n\t\t\t\tconst aggregatorPolicy = formatResultPolicy(aggregator);\n\t\t\t\tif (aggregatorPolicy)\n\t\t\t\t\tcontainer.addChild(\n\t\t\t\t\t\tnew Text(theme.fg(\"muted\", \"Policy:\\n\") + theme.fg(\"dim\", aggregatorPolicy), 0, 0),\n\t\t\t\t\t);\n\t\t\t\tif (aggregatorFailed && aggregator.errorMessage)\n\t\t\t\t\tcontainer.addChild(\n\t\t\t\t\t\tnew Text(theme.fg(\"error\", `Error: ${aggregator.errorMessage}`), 0, 0),\n\t\t\t\t\t);\n\t\t\t\tfor (const item of displayItems) {\n\t\t\t\t\tif (item.type === \"toolCall\") {\n\t\t\t\t\t\tcontainer.addChild(\n\t\t\t\t\t\t\tnew Text(\n\t\t\t\t\t\t\t\ttheme.fg(\"muted\", \"\u2192 \") +\n\t\t\t\t\t\t\t\t\tformatToolCall(item.name, item.args, theme.fg.bind(theme)),\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (finalOutput) {\n\t\t\t\t\tcontainer.addChild(new Spacer(1));\n\t\t\t\t\tcontainer.addChild(new Markdown(finalOutput.trim(), 0, 0, mdTheme));\n\t\t\t\t}\n\t\t\t\tconst fanInUsage = formatResultUsageStats(aggregator);\n\t\t\t\tif (fanInUsage) container.addChild(new Text(theme.fg(\"dim\", fanInUsage), 0, 0));\n\t\t\t}\n\n\t\t\tconst usageResults = aggregator ? [...details.results, aggregator] : details.results;\n\t\t\tconst usageStr = formatUsageStats(aggregateUsage(usageResults));\n\t\t\tif (usageStr) {\n\t\t\t\tcontainer.addChild(new Spacer(1));\n\t\t\t\tcontainer.addChild(new Text(theme.fg(\"dim\", `Total: ${usageStr}`), 0, 0));\n\t\t\t}\n\t\t\treturn container;\n\t\t}\n\n\t\t// Collapsed view (or still running)\n\t\tlet text = `${icon} ${theme.fg(\"toolTitle\", theme.bold(`${modeLabel} `))}${theme.fg(\"accent\", status)} \u00B7 ${coloredStatus(theme, overallStatus)}`;\n\t\tfor (const r of details.results) {\n\t\t\tconst rFailed = isResultError(r);\n\t\t\tconst rRunning = resultIsRunning(r);\n\t\t\tconst rIcon = rFailed\n\t\t\t\t? theme.fg(\"error\", \"\u2717\")\n\t\t\t\t: rRunning\n\t\t\t\t\t? theme.fg(\"warning\", \"\u23F3\")\n\t\t\t\t\t: theme.fg(\"success\", \"\u2713\");\n\t\t\tconst collapsed = getCollapsedDisplayItems(r);\n\t\t\tconst finalOutput = getResultFinalOutput(r).trim();\n\t\t\ttext += `\\n\\n${theme.fg(\"muted\", \"\u2500\u2500\u2500 \")}${theme.fg(\"accent\", r.agent)} ${rIcon} ${coloredResultStatus(theme, r, rRunning)}`;\n\t\t\tif (rFailed && r.errorMessage) text += `\\n${theme.fg(\"error\", `Error: ${r.errorMessage}`)}`;\n\t\t\tif (collapsed.items.length > 0)\n\t\t\t\ttext += `\\n${renderDisplayItems(collapsed.items, 5, collapsed.total)}`;\n\t\t\telse if (rRunning) text += `\\n${theme.fg(\"muted\", \"(running...)\")}`;\n\t\t\telse if (finalOutput)\n\t\t\t\ttext += `\\n${theme.fg(\"toolOutput\", finalOutput.split(\"\\n\").slice(0, 3).join(\"\\n\"))}`;\n\t\t\telse if (!rFailed || !r.errorMessage) text += `\\n${theme.fg(\"muted\", \"(no output)\")}`;\n\t\t}\n\t\tif (aggregator) {\n\t\t\tconst rIcon = aggregatorFailed\n\t\t\t\t? theme.fg(\"error\", \"\u2717\")\n\t\t\t\t: aggregatorRunning\n\t\t\t\t\t? theme.fg(\"warning\", \"\u23F3\")\n\t\t\t\t\t: theme.fg(\"success\", \"\u2713\");\n\t\t\tconst collapsed = getCollapsedDisplayItems(aggregator);\n\t\t\tconst finalOutput = getResultFinalOutput(aggregator).trim();\n\t\t\ttext += `\\n\\n${theme.fg(\"muted\", \"\u2500\u2500\u2500 fan-in \u2192 \")}${theme.fg(\"accent\", aggregator.agent)} ${rIcon} ${coloredResultStatus(theme, aggregator, aggregatorRunning)}`;\n\t\t\tif (aggregatorFailed && aggregator.errorMessage)\n\t\t\t\ttext += `\\n${theme.fg(\"error\", `Error: ${aggregator.errorMessage}`)}`;\n\t\t\tif (collapsed.items.length > 0)\n\t\t\t\ttext += `\\n${renderDisplayItems(collapsed.items, 5, collapsed.total)}`;\n\t\t\telse if (aggregatorRunning) text += `\\n${theme.fg(\"muted\", \"(running...)\")}`;\n\t\t\telse if (finalOutput)\n\t\t\t\ttext += `\\n${theme.fg(\"toolOutput\", finalOutput.split(\"\\n\").slice(0, 3).join(\"\\n\"))}`;\n\t\t\telse if (!aggregatorFailed || !aggregator.errorMessage)\n\t\t\t\ttext += `\\n${theme.fg(\"muted\", \"(no output)\")}`;\n\t\t}\n\t\tif (!isRunning) {\n\t\t\tconst usageResults = aggregator ? [...details.results, aggregator] : details.results;\n\t\t\tconst usageStr = formatUsageStats(aggregateUsage(usageResults));\n\t\t\tif (usageStr) text += `\\n\\n${theme.fg(\"dim\", `Total: ${usageStr}`)}`;\n\t\t}\n\t\tif (!expanded) text += `\\n${expansionHint()}`;\n\t\treturn new Text(text, 0, 0);\n\t}\n\n\tconst text = result.content[0];\n\treturn new Text(\n\t\ttext?.type === \"text\" ? safeBlock(text.text, \"(no output)\", 8 * 1024) : \"(no output)\",\n\t\t0,\n\t\t0,\n\t);\n}\n", "import type { Theme } from \"@earendil-works/pi-coding-agent\";\nimport { Text } from \"@earendil-works/pi-tui\";\nimport type { SubagentParams } from \"./params.js\";\nimport { safeBlock, safeLine } from \"./render-common.js\";\nimport type { SubagentDetails } from \"./subagent-details.js\";\n\nexport function renderPanelCall(args: SubagentParams, theme: Theme): Text | undefined {\n\tconst panel = args.panel;\n\tif (!panel) return undefined;\n\tconst scope = args.agentScope ?? \"user\";\n\tlet text =\n\t\ttheme.fg(\"toolTitle\", theme.bold(\"subagent \")) +\n\t\ttheme.fg(\"accent\", `panel ${panel.preset ?? \"custom\"} (${panel.reviewers.length} reviewers)`) +\n\t\ttheme.fg(\"muted\", ` [${scope}]`);\n\ttext += `\\n ${theme.fg(\"dim\", preview(panel.task, 80))}`;\n\tfor (const reviewer of panel.reviewers.slice(0, 3)) {\n\t\ttext += `\\n ${theme.fg(\"muted\", `${safeLine(reviewer.id, \"reviewer\", 256)}:`)} ${theme.fg(\"accent\", safeLine(reviewer.agent, \"agent\", 256))}`;\n\t\tif (reviewer.focus) text += theme.fg(\"dim\", ` ${preview(reviewer.focus, 40)}`);\n\t}\n\tif (panel.reviewers.length > 3) {\n\t\ttext += `\\n ${theme.fg(\"muted\", `... +${panel.reviewers.length - 3} more`)}`;\n\t}\n\ttext += `\\n ${theme.fg(\"muted\", \"synthesis \u2192 \")}${theme.fg(\"accent\", safeLine(panel.synthesizer.agent, \"agent\", 256))}`;\n\treturn new Text(text, 0, 0);\n}\n\nexport function renderPanelResult(\n\tdetails: SubagentDetails,\n\texpanded: boolean,\n\tisPartial: boolean,\n\ttheme: Theme,\n): Text | undefined {\n\tconst panel = details.panel;\n\tif (details.mode !== \"panel\" || !panel) return undefined;\n\tconst running = isPartial || panel.state === \"running\";\n\tconst status = running ? \"running\" : panel.state;\n\tconst color =\n\t\tstatus === \"completed\"\n\t\t\t? \"success\"\n\t\t\t: status === \"running\" || status === \"degraded\"\n\t\t\t\t? \"warning\"\n\t\t\t\t: \"error\";\n\tlet text = `${theme.fg(color, status)} ${theme.fg(\"accent\", safeLine(panel.preset, \"panel\", 128))}`;\n\ttext += theme.fg(\n\t\t\"muted\",\n\t\t` \u00B7 valid ${panel.validReviewCount}/${panel.reviewerIds.length} \u00B7 failed ${panel.failedReviewCount} \u00B7 blockers ${panel.blockingObjectionCount} \u00B7 dissent ${panel.dissentCount}`,\n\t);\n\tif (panel.synthesis) {\n\t\ttext += `\\n${theme.fg(\"toolOutput\", safeBlock(panel.synthesis.summary, \"\", 8 * 1024))}`;\n\t} else if (panel.state === \"insufficient-panel\") {\n\t\ttext += `\\n${theme.fg(\"warning\", \"Synthesis skipped because too few valid reviews remained.\")}`;\n\t}\n\tif (!expanded) return new Text(text, 0, 0);\n\n\ttext += `\\n\\n${theme.fg(\"muted\", \"Shared task: \")}${theme.fg(\"dim\", safeBlock(panel.sharedTaskPreview, \"\", 2 * 1024))}`;\n\ttext += `\\n\\n${theme.fg(\"muted\", \"Reviewers:\")}`;\n\tfor (const reviewerId of panel.reviewerIds) {\n\t\tconst artifact = panel.evidence.find((candidate) => candidate.reviewerId === reviewerId);\n\t\tconst failure = panel.failures.find((candidate) => candidate.reviewerId === reviewerId);\n\t\tconst result = details.results.find(\n\t\t\t(candidate) => candidate.step === panel.reviewerIds.indexOf(reviewerId) + 1,\n\t\t);\n\t\tconst model = result?.actualModel ?? result?.model;\n\t\ttext += `\\n ${theme.fg(\"accent\", safeLine(reviewerId, \"reviewer\", 256))}`;\n\t\tif (model) text += theme.fg(\"muted\", ` \u00B7 ${safeLine(model, \"\", 256)}`);\n\t\tif (artifact) {\n\t\t\ttext += theme.fg(\n\t\t\t\t\"muted\",\n\t\t\t\t` \u00B7 ${artifact.review.disposition} \u00B7 revision ${artifact.revision}`,\n\t\t\t);\n\t\t\tfor (const finding of artifact.review.findings) {\n\t\t\t\ttext += `\\n ${theme.fg(finding.severity === \"critical\" || finding.severity === \"high\" ? \"error\" : \"warning\", `[${finding.severity}]`)} ${safeLine(finding.title, \"finding\", 512)}`;\n\t\t\t}\n\t\t} else if (failure) {\n\t\t\ttext += theme.fg(\"error\", ` \u00B7 ${safeLine(failure.kind, \"failed\", 128)}`);\n\t\t}\n\t}\n\tif (panel.synthesis?.disagreements.length) {\n\t\ttext += `\\n\\n${theme.fg(\"muted\", \"Disagreements:\")}`;\n\t\tfor (const disagreement of panel.synthesis.disagreements) {\n\t\t\ttext += `\\n ${safeLine(disagreement.summary, \"disagreement\", 1024)}`;\n\t\t}\n\t}\n\tif (panel.synthesis?.objections.length) {\n\t\ttext += `\\n\\n${theme.fg(\"muted\", \"Blocking objections:\")}`;\n\t\tfor (const objection of panel.synthesis.objections) {\n\t\t\ttext += `\\n ${safeLine(`${objection.reviewerId}/${objection.findingId}: ${objection.resolution}`, \"objection\", 1024)}`;\n\t\t}\n\t}\n\tconst limitations = panel.synthesis?.limitations ?? [];\n\tif (limitations.length) {\n\t\ttext += `\\n\\n${theme.fg(\"muted\", \"Limitations:\")}`;\n\t\tfor (const limitation of limitations) text += `\\n ${safeLine(limitation, \"\", 1024)}`;\n\t}\n\ttext += `\\n\\n${theme.fg(\"muted\", `Budget: review ${panel.budgets.reviewMs}ms \u00B7 finalization ${panel.budgets.finalizationMs}ms \u00B7 synthesis ${panel.budgets.synthesisMs}ms \u00B7 cleanup ${panel.budgets.cleanupMs}ms`)}`;\n\ttext += `\\n${theme.fg(\"muted\", `Cleanup: ${panel.cleanupComplete ? \"complete\" : \"pending\"}`)}`;\n\treturn new Text(text, 0, 0);\n}\n\nfunction preview(value: unknown, maxLength: number): string {\n\tconst text = safeLine(value, \"\", 2 * 1024);\n\treturn text.length > maxLength ? `${text.slice(0, maxLength)}...` : text;\n}\n", "import { randomUUID } from \"node:crypto\";\nimport path from \"node:path\";\nimport { type ExtensionAPI, getAgentDir } from \"@earendil-works/pi-coding-agent\";\nimport type { AgentTurnCompletion, ManagedAgent } from \"./registry-types.js\";\nimport type { TransportUsage } from \"./transport-types.js\";\nimport {\n\tUSAGE_RECORDING_DIRECTORY,\n\tUSAGE_RECORDING_RETENTION_DAYS,\n\tUSAGE_RECORDING_STUDY_ID,\n} from \"./usage-recording-config.js\";\nimport type { UsageEventStorePort } from \"./usage-recording-store.js\";\n\nconst SHUTDOWN_FLUSH_MS = 2_500;\n\nconst SUBAGENT_TOOLS = new Set([\n\t\"subagent\",\n\t\"subagent_spawn\",\n\t\"subagent_send\",\n\t\"subagent_manage\",\n\t\"subagent_mailbox\",\n\t\"subagent_inspect\",\n\t\"subagent_consult\",\n\t\"subagent_await\",\n]);\n\nexport type UsageSurfaceArm = \"all\" | \"async-only\" | \"blocking-only\" | \"disabled\";\n\ntype UsageEventType =\n\t| \"study_exposure\"\n\t| \"parent_turn_start\"\n\t| \"parent_turn_end\"\n\t| \"tool_start\"\n\t| \"tool_end\"\n\t| \"child_run_start\"\n\t| \"child_run_end\"\n\t| \"completion_transition\"\n\t| \"lifecycle\";\n\ninterface UsageEvent {\n\tschemaVersion: 1;\n\tstudyId: typeof USAGE_RECORDING_STUDY_ID;\n\tsurfaceArm: UsageSurfaceArm;\n\tlogicalSession: string;\n\truntimeInstance: string;\n\tbranchEpoch: number;\n\tturnId?: string;\n\teventSequence: number;\n\tmonotonicOffsetMs: number;\n\teventType: UsageEventType;\n\tdata: Record<string, boolean | number | string>;\n}\n\nexport interface UsageRecordingStatus {\n\tenabled: boolean;\n\tinitialized: boolean;\n\tretentionDays: number;\n\tpath: string;\n\trecordedEvents: number;\n\twriteFailure: boolean;\n}\n\nexport interface UsageRecordingController {\n\tstartSession(input: {\n\t\tenabled: boolean;\n\t\tsurfaceArm: UsageSurfaceArm;\n\t\treason: \"startup\" | \"reload\" | \"new\" | \"resume\" | \"fork\";\n\t\tonWarning?: (message: string) => void;\n\t}): Promise<void>;\n\tshutdown(reason: \"quit\" | \"reload\" | \"new\" | \"resume\" | \"fork\"): Promise<void>;\n\tsetEnabled(value: boolean): Promise<void>;\n\tgetStatus(): UsageRecordingStatus;\n\tobserveAgents(agents: readonly ManagedAgent[]): void;\n\trecordChildCompletion(completion: AgentTurnCompletion): void;\n\trecordCompletionDeliveryAttempt(\n\t\tcompletion: AgentTurnCompletion,\n\t\tinput: {\n\t\t\tdelivery: \"steer\" | \"nextTurn\";\n\t\t\ttriggerTurn: boolean;\n\t\t\toutcome: \"accepted\" | \"failed\";\n\t\t},\n\t): void;\n\trecordCompletionVisible(completion: AgentTurnCompletion): void;\n}\n\nexport interface UsageRecordingDependencies {\n\tcreateId(): string;\n\tmonotonicNow(): number;\n\tgetAgentDir(): string;\n\tloadStore(): Promise<{\n\t\tUsageEventStore: new (path: string) => UsageEventStorePort;\n\t}>;\n}\n\nexport function registerUsageRecording(\n\tpi: ExtensionAPI,\n\tdependencies: Partial<UsageRecordingDependencies> = {},\n): UsageRecordingController {\n\tconst deps: UsageRecordingDependencies = {\n\t\tcreateId: dependencies.createId ?? randomUUID,\n\t\tmonotonicNow: dependencies.monotonicNow ?? performance.now.bind(performance),\n\t\tgetAgentDir: dependencies.getAgentDir ?? getAgentDir,\n\t\tloadStore: dependencies.loadStore ?? (() => import(\"./usage-recording-store.js\")),\n\t};\n\tconst pathValue = path.join(deps.getAgentDir(), USAGE_RECORDING_DIRECTORY);\n\tconst runtimeInstance = deps.createId();\n\tlet logicalSession = deps.createId();\n\tlet branchEpoch = 0;\n\tlet surfaceArm: UsageSurfaceArm = \"disabled\";\n\tlet sessionStartedAt = deps.monotonicNow();\n\tlet enabled = false;\n\tlet eventSequence = 0;\n\tlet recordedEvents = 0;\n\tlet writeFailure = false;\n\tlet warningActive = false;\n\tlet onWarning: ((message: string) => void) | undefined;\n\tlet storePromise: Promise<UsageEventStorePort> | undefined;\n\tlet writeGeneration = 0;\n\tlet writeTail: Promise<void> = Promise.resolve();\n\tlet transitionTail: Promise<void> = Promise.resolve();\n\tlet currentTurnId: string | undefined;\n\tlet turnOrdinal = 0;\n\tlet operationOrdinal = 0;\n\tlet childOrdinal = 0;\n\tlet runOrdinal = 0;\n\tlet completionOrdinal = 0;\n\tconst operations = new Map<string, { id: string; startedAt: number }>();\n\tconst children = new Map<string, string>();\n\tconst runs = new Map<string, string>();\n\tconst completions = new Map<string, string>();\n\tconst agentStates = new Map<string, string>();\n\tconst activeRuns = new Map<string, string>();\n\n\tpi.on(\"agent_start\", () => record(\"lifecycle\", { phase: \"parent_agent_start\" }));\n\tpi.on(\"agent_settled\", () => record(\"lifecycle\", { phase: \"parent_agent_settled\" }));\n\tpi.on(\"turn_start\", () => {\n\t\tcurrentTurnId = `turn-${++turnOrdinal}`;\n\t\trecord(\"parent_turn_start\", { turnOrdinal }, currentTurnId);\n\t});\n\tpi.on(\"turn_end\", (event) => {\n\t\trecord(\n\t\t\t\"parent_turn_end\",\n\t\t\t{\n\t\t\t\tturnOrdinal,\n\t\t\t\t...usageNumbers(event.message.role === \"assistant\" ? event.message.usage : undefined),\n\t\t\t},\n\t\t\tcurrentTurnId,\n\t\t);\n\t\tcurrentTurnId = undefined;\n\t});\n\tpi.on(\"tool_execution_start\", (event) => {\n\t\tif (!SUBAGENT_TOOLS.has(event.toolName)) return;\n\t\tconst operationId = `tool-${++operationOrdinal}`;\n\t\toperations.set(event.toolCallId, { id: operationId, startedAt: offset() });\n\t\trecord(\"tool_start\", { operationId, tool: event.toolName }, currentTurnId);\n\t});\n\tpi.on(\"tool_execution_end\", (event) => {\n\t\tif (!SUBAGENT_TOOLS.has(event.toolName)) return;\n\t\tconst operation = operations.get(event.toolCallId);\n\t\toperations.delete(event.toolCallId);\n\t\trecord(\n\t\t\t\"tool_end\",\n\t\t\t{\n\t\t\t\toperationId: operation?.id ?? `tool-${++operationOrdinal}`,\n\t\t\t\ttool: event.toolName,\n\t\t\t\tisError: event.isError,\n\t\t\t\t...(operation ? { durationMs: Math.max(0, offset() - operation.startedAt) } : {}),\n\t\t\t\t...usageNumbers(event.result?.usage),\n\t\t\t},\n\t\t\tcurrentTurnId,\n\t\t);\n\t});\n\n\tconst controller: UsageRecordingController = {\n\t\tstartSession(input) {\n\t\t\treturn serializeTransition(async () => {\n\t\t\t\tenabled = false;\n\t\t\t\tawait closeStore();\n\t\t\t\tlogicalSession = deps.createId();\n\t\t\t\tbranchEpoch += 1;\n\t\t\t\tsurfaceArm = input.surfaceArm;\n\t\t\t\tsessionStartedAt = deps.monotonicNow();\n\t\t\t\teventSequence = 0;\n\t\t\t\trecordedEvents = 0;\n\t\t\t\twriteFailure = false;\n\t\t\t\twarningActive = false;\n\t\t\t\tonWarning = input.onWarning;\n\t\t\t\tcurrentTurnId = undefined;\n\t\t\t\tturnOrdinal = 0;\n\t\t\t\toperationOrdinal = 0;\n\t\t\t\tchildOrdinal = 0;\n\t\t\t\trunOrdinal = 0;\n\t\t\t\tcompletionOrdinal = 0;\n\t\t\t\toperations.clear();\n\t\t\t\tchildren.clear();\n\t\t\t\truns.clear();\n\t\t\t\tcompletions.clear();\n\t\t\t\tagentStates.clear();\n\t\t\t\tactiveRuns.clear();\n\t\t\t\tenabled = input.enabled;\n\t\t\t\tif (!enabled) return;\n\t\t\t\trecord(\"study_exposure\", { reason: input.reason });\n\t\t\t\trecord(\"lifecycle\", { phase: \"session_start\", reason: input.reason });\n\t\t\t\tenqueue(async (store) => store.prune(USAGE_RECORDING_RETENTION_DAYS));\n\t\t\t\tawait writeTail;\n\t\t\t});\n\t\t},\n\t\tshutdown(reason) {\n\t\t\treturn serializeTransition(async () => {\n\t\t\t\tif (enabled) record(\"lifecycle\", { phase: \"session_shutdown\", reason });\n\t\t\t\tenabled = false;\n\t\t\t\tawait flushWithin(SHUTDOWN_FLUSH_MS);\n\t\t\t\tawait closeStore();\n\t\t\t});\n\t\t},\n\t\tsetEnabled(value) {\n\t\t\treturn serializeTransition(async () => {\n\t\t\t\tif (value === enabled) return;\n\t\t\t\tif (value) {\n\t\t\t\t\tenabled = true;\n\t\t\t\t\trecord(\"study_exposure\", { reason: \"enabled_in_settings\" });\n\t\t\t\t\trecord(\"lifecycle\", { phase: \"recording_enabled\" });\n\t\t\t\t\tenqueue(async (store) => store.prune(USAGE_RECORDING_RETENTION_DAYS));\n\t\t\t\t\tawait writeTail;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\trecord(\"lifecycle\", { phase: \"recording_disabled\" });\n\t\t\t\tenabled = false;\n\t\t\t\tawait flushWithin(SHUTDOWN_FLUSH_MS);\n\t\t\t\tawait closeStore();\n\t\t\t});\n\t\t},\n\t\tgetStatus() {\n\t\t\treturn {\n\t\t\t\tenabled,\n\t\t\t\tinitialized: storePromise !== undefined,\n\t\t\t\tretentionDays: USAGE_RECORDING_RETENTION_DAYS,\n\t\t\t\tpath: pathValue,\n\t\t\t\trecordedEvents,\n\t\t\t\twriteFailure,\n\t\t\t};\n\t\t},\n\t\tobserveAgents(agents) {\n\t\t\tif (!enabled) return;\n\t\t\tfor (const agent of agents) {\n\t\t\t\tconst childId = localChildId(agent.id);\n\t\t\t\tif (agentStates.get(agent.id) !== agent.state) {\n\t\t\t\t\tagentStates.set(agent.id, agent.state);\n\t\t\t\t\trecord(\"lifecycle\", { phase: \"child_state\", childId, state: agent.state });\n\t\t\t\t}\n\t\t\t\tif (agent.currentRunId && activeRuns.get(agent.id) !== agent.currentRunId) {\n\t\t\t\t\tactiveRuns.set(agent.id, agent.currentRunId);\n\t\t\t\t\trecord(\"child_run_start\", {\n\t\t\t\t\t\tchildId,\n\t\t\t\t\t\trunId: localRunId(agent.currentRunId),\n\t\t\t\t\t\tgeneration: agent.currentTurnGeneration ?? agent.turnGeneration ?? 0,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\trecordChildCompletion(completion) {\n\t\t\tif (!enabled) return;\n\t\t\tconst childId = localChildId(completion.agent.id);\n\t\t\tconst runId = localRunId(completion.runId);\n\t\t\tconst timing = completion.agent.telemetry?.timing;\n\t\t\trecord(\"child_run_end\", {\n\t\t\t\tchildId,\n\t\t\t\trunId,\n\t\t\t\tgeneration: completion.generation,\n\t\t\t\tstate: completion.agent.state,\n\t\t\t\t...(completion.agent.outcome?.status\n\t\t\t\t\t? { outcomeStatus: completion.agent.outcome.status }\n\t\t\t\t\t: {}),\n\t\t\t\t...(completion.agent.termination?.reason\n\t\t\t\t\t? { terminationReason: completion.agent.termination.reason }\n\t\t\t\t\t: {}),\n\t\t\t\t...(completion.agent.telemetry?.budgetSource\n\t\t\t\t\t? {\n\t\t\t\t\t\t\ttimeoutBudgetSource: completion.agent.telemetry.budgetSource.timeout,\n\t\t\t\t\t\t\tidleTimeoutBudgetSource: completion.agent.telemetry.budgetSource.idleTimeout,\n\t\t\t\t\t\t\tturnLimitBudgetSource: completion.agent.telemetry.budgetSource.turnLimit,\n\t\t\t\t\t\t\ttoolCallLimitBudgetSource: completion.agent.telemetry.budgetSource.toolCallLimit,\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t\t...(timing?.startedAt !== undefined && timing.settledAt !== undefined\n\t\t\t\t\t? { durationMs: Math.max(0, timing.settledAt - timing.startedAt) }\n\t\t\t\t\t: {}),\n\t\t\t\t...transportUsageNumbers(completion.agent.telemetry?.usage),\n\t\t\t});\n\t\t\trecordCompletion(completion, \"persisted\");\n\t\t},\n\t\trecordCompletionDeliveryAttempt(completion, input) {\n\t\t\trecordCompletion(completion, \"delivery_attempt\", {\n\t\t\t\tdelivery: input.delivery,\n\t\t\t\ttriggerTurn: input.triggerTurn,\n\t\t\t\toutcome: input.outcome,\n\t\t\t});\n\t\t},\n\t\trecordCompletionVisible(completion) {\n\t\t\trecordCompletion(completion, \"visible\");\n\t\t},\n\t};\n\n\treturn controller;\n\n\tfunction record(\n\t\teventType: UsageEventType,\n\t\tdata: UsageEvent[\"data\"],\n\t\tturnId = currentTurnId,\n\t): void {\n\t\tif (!enabled) return;\n\t\tconst event: UsageEvent = {\n\t\t\tschemaVersion: 1,\n\t\t\tstudyId: USAGE_RECORDING_STUDY_ID,\n\t\t\tsurfaceArm,\n\t\t\tlogicalSession,\n\t\t\truntimeInstance,\n\t\t\tbranchEpoch,\n\t\t\t...(turnId ? { turnId } : {}),\n\t\t\teventSequence: ++eventSequence,\n\t\t\tmonotonicOffsetMs: offset(),\n\t\t\teventType,\n\t\t\tdata,\n\t\t};\n\t\tenqueue(async (store) => store.append(event), true);\n\t}\n\n\tfunction recordCompletion(\n\t\tcompletion: AgentTurnCompletion,\n\t\ttransition: \"persisted\" | \"delivery_attempt\" | \"visible\",\n\t\textra: UsageEvent[\"data\"] = {},\n\t): void {\n\t\tif (!enabled) return;\n\t\trecord(\"completion_transition\", {\n\t\t\tcompletionId: localCompletionId(completion.completionId),\n\t\t\tchildId: localChildId(completion.agent.id),\n\t\t\trunId: localRunId(completion.runId),\n\t\t\tgeneration: completion.generation,\n\t\t\ttransition,\n\t\t\t...extra,\n\t\t});\n\t}\n\n\tfunction enqueue(\n\t\toperation: (store: UsageEventStorePort) => Promise<void>,\n\t\tcountsAsEvent = false,\n\t): void {\n\t\tconst generation = writeGeneration;\n\t\tconst task = writeTail.then(async () => {\n\t\t\tif (generation !== writeGeneration) return false;\n\t\t\tawait operation(await ensureStore());\n\t\t\treturn true;\n\t\t});\n\t\twriteTail = task.then(\n\t\t\t(completed) => {\n\t\t\t\tif (completed && countsAsEvent) recordedEvents += 1;\n\t\t\t\twriteFailure = false;\n\t\t\t\twarningActive = false;\n\t\t\t},\n\t\t\t() => {\n\t\t\t\twriteFailure = true;\n\t\t\t\tif (!warningActive) {\n\t\t\t\t\twarningActive = true;\n\t\t\t\t\tsafeWarn(\"Local subagent usage recording could not save an event; recording will retry.\");\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\t}\n\n\tasync function ensureStore(): Promise<UsageEventStorePort> {\n\t\tstorePromise ??= deps\n\t\t\t.loadStore()\n\t\t\t.then(({ UsageEventStore }) => new UsageEventStore(pathValue))\n\t\t\t.catch((error: unknown) => {\n\t\t\t\tstorePromise = undefined;\n\t\t\t\tthrow error;\n\t\t\t});\n\t\treturn storePromise;\n\t}\n\n\tfunction serializeTransition(operation: () => Promise<void>): Promise<void> {\n\t\tconst result = transitionTail.then(operation, operation);\n\t\ttransitionTail = result.catch(() => undefined);\n\t\treturn result;\n\t}\n\n\tasync function flushWithin(timeoutMs: number): Promise<void> {\n\t\tlet timer: NodeJS.Timeout | undefined;\n\t\ttry {\n\t\t\tawait Promise.race([\n\t\t\t\twriteTail,\n\t\t\t\tnew Promise<void>((resolve) => {\n\t\t\t\t\ttimer = setTimeout(resolve, timeoutMs);\n\t\t\t\t}),\n\t\t\t]);\n\t\t} finally {\n\t\t\tif (timer) clearTimeout(timer);\n\t\t}\n\t}\n\n\tasync function closeStore(): Promise<void> {\n\t\twriteGeneration += 1;\n\t\tconst active = storePromise;\n\t\tstorePromise = undefined;\n\t\tif (active) await active.then((store) => store.close()).catch(() => undefined);\n\t\tawait writeTail;\n\t\twriteTail = Promise.resolve();\n\t}\n\n\tfunction localChildId(value: string): string {\n\t\treturn localId(children, value, \"child\", () => ++childOrdinal);\n\t}\n\n\tfunction localRunId(value: string): string {\n\t\treturn localId(runs, value, \"run\", () => ++runOrdinal);\n\t}\n\n\tfunction localCompletionId(value: string): string {\n\t\treturn localId(completions, value, \"completion\", () => ++completionOrdinal);\n\t}\n\n\tfunction offset(): number {\n\t\treturn Math.max(0, Math.round(deps.monotonicNow() - sessionStartedAt));\n\t}\n\n\tfunction safeWarn(message: string): void {\n\t\ttry {\n\t\t\tonWarning?.(message);\n\t\t} catch {\n\t\t\t// A replaced UI cannot receive storage feedback.\n\t\t}\n\t}\n}\n\nfunction localId(\n\tvalues: Map<string, string>,\n\traw: string,\n\tprefix: string,\n\tnext: () => number,\n): string {\n\tconst existing = values.get(raw);\n\tif (existing) return existing;\n\tconst created = `${prefix}-${next()}`;\n\tvalues.set(raw, created);\n\treturn created;\n}\n\nfunction usageNumbers(value: unknown): Record<string, number> {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return {};\n\tconst record = value as Record<string, unknown>;\n\treturn numericFields(record, [\"input\", \"output\", \"cacheRead\", \"cacheWrite\"]);\n}\n\nfunction transportUsageNumbers(value: TransportUsage | undefined): Record<string, number> {\n\tif (!value) return {};\n\treturn numericFields(value as unknown as Record<string, unknown>, [\n\t\t\"input\",\n\t\t\"output\",\n\t\t\"cacheRead\",\n\t\t\"cacheWrite\",\n\t\t\"totalTokens\",\n\t\t\"cost\",\n\t\t\"turns\",\n\t]);\n}\n\nfunction numericFields(\n\trecord: Record<string, unknown>,\n\tfields: readonly string[],\n): Record<string, number> {\n\treturn Object.fromEntries(\n\t\tfields.flatMap((field) => {\n\t\t\tconst value = record[field];\n\t\t\treturn typeof value === \"number\" && Number.isFinite(value) && value >= 0\n\t\t\t\t? [[field, value] as const]\n\t\t\t\t: [];\n\t\t}),\n\t);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["Text", "text", "Text", "preview", "usageStr", "result"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# Async runtime protocol
|
|
2
|
+
|
|
3
|
+
This document defines `pi-subagents:completion-requirement:v1` and the current runtime boundary for final-answer-dependent detached work.
|
|
4
|
+
|
|
5
|
+
## Requirement identity
|
|
6
|
+
|
|
7
|
+
A caller marks one `subagent_spawn` or `subagent_send` turn with `completionRequirement: "required"`.
|
|
8
|
+
The runtime binds that requirement to the accepted `agentId`, executor-owned `runId`, and monotonically increasing turn generation.
|
|
9
|
+
Agent names and task paths are display and addressing aids and never replace exact run identity.
|
|
10
|
+
Omitting the field or using `background` preserves prior behavior and does not create a final-answer dependency.
|
|
11
|
+
|
|
12
|
+
## State ownership
|
|
13
|
+
|
|
14
|
+
`AgentRegistry` owns requirement transitions with the child turn and persisted completion outbox.
|
|
15
|
+
Tool-result `details.agent.completionRequirements` provides fork-sensitive branch evidence.
|
|
16
|
+
Session restoration retains exact requirements found on the active branch and treats sessions without visible subagent state as a possible compacted continuation.
|
|
17
|
+
The `context` hook owns one canonical hidden `pi-subagent-required-completions` block and replaces any older copy on every provider context assembly.
|
|
18
|
+
`CompletionDeliveryBroker` owns exact completion visibility acknowledgement and asks the registry to mark the corresponding requirement visible.
|
|
19
|
+
No timer, waiter, or UI object owns requirement truth.
|
|
20
|
+
|
|
21
|
+
## States
|
|
22
|
+
|
|
23
|
+
A newly accepted exact run enters `pending`.
|
|
24
|
+
A durably persisted terminal completion moves the exact run to `available` and records its completion ID and terminal child state.
|
|
25
|
+
Observation of that exact completion ID in the intended parent context moves the run to `visible`.
|
|
26
|
+
Interruption, close, restore of a non-running owner, or shutdown moves an unfinished requirement to `cancelled` with an explicit terminal state.
|
|
27
|
+
Duplicate completion delivery and acknowledgement are idempotent.
|
|
28
|
+
A follow-up receives a new run ID and generation and creates a requirement only when that follow-up explicitly requests one.
|
|
29
|
+
The runtime bounds retained requirement records per agent and rejects a sixty-fifth unresolved required run before acceptance so every unresolved exact identity fits in the canonical parent context.
|
|
30
|
+
|
|
31
|
+
## Parent behavior
|
|
32
|
+
|
|
33
|
+
Pending and available requirements remain final-answer dependencies.
|
|
34
|
+
Visible requirements no longer appear in the canonical context block.
|
|
35
|
+
Cancelled requirements are terminal and must be reported rather than silently treated as successful evidence.
|
|
36
|
+
A failed, partial, interrupted, stale, or cancelled child never satisfies mutating acceptance or independent-verification requirements merely because its turn settled.
|
|
37
|
+
|
|
38
|
+
## Budget termination
|
|
39
|
+
|
|
40
|
+
Omitted limits use runtime or agent policy and are recorded as runtime-sourced telemetry.
|
|
41
|
+
Explicit timeout, idle, turn, and tool-call limits remain compatible and are recorded as explicit sources.
|
|
42
|
+
A limit stop with non-empty successful bounded finalization becomes a typed `partial` outcome with the exact termination reason.
|
|
43
|
+
Empty finalization, failed finalization, malformed required structured output, and transport failures remain failed or contract-invalid.
|
|
44
|
+
Partial evidence is available to the parent but is not successful verification or mutating acceptance.
|
|
45
|
+
|
|
46
|
+
## Pi core boundary
|
|
47
|
+
|
|
48
|
+
The inspected supported Pi runtime emits provider `message_update` events before the TUI, RPC, JSON, and SDK surfaces display them.
|
|
49
|
+
An extension `message_end` handler can replace the finalized same-role message but cannot retract previously displayed deltas.
|
|
50
|
+
Steering is queued after the extension `input` event, direct RPC steering bypasses that event, and tool abort signals do not observe every accepted steer.
|
|
51
|
+
Therefore an extension cannot provide a hard pre-display final-answer barrier or a reliably steer-interruptible join across all supported modes.
|
|
52
|
+
`subagent_await` remains the bounded non-polling compatibility join and accurately states that queued steering is blocked until the tool settles.
|
|
53
|
+
|
|
54
|
+
A future core implementation would need replay-safe post-enqueue input activity, exact session-owned blocker handles, pre-display buffering or suppression, bounded timeout, and abort, replacement, reload, shutdown, and headless-mode semantics.
|
|
55
|
+
This repository does not modify or publish Pi core packages for this work.
|
|
56
|
+
|
|
57
|
+
## Codex reference
|
|
58
|
+
|
|
59
|
+
Codex `wait_agent` uses replay-safe pending activity plus an event-driven watch receiver for mailbox and steering activity.
|
|
60
|
+
Codex completion context uses a typed `FINAL_ANSWER` envelope with explicit task, sender, and payload fields.
|
|
61
|
+
Codex rollout budgets use shared runtime-owned accounting and acknowledge reminders only after context insertion.
|
|
62
|
+
These patterns inform waiting, completion identity, and budget ownership, but Codex also does not provide an absolute pre-display final-answer barrier.
|
|
63
|
+
|
|
64
|
+
## Compatibility fallback
|
|
65
|
+
|
|
66
|
+
Older persisted agents without requirement metadata behave as background work.
|
|
67
|
+
Current Pi versions continue using bounded persisted at-least-once completion delivery and optional idle-root auto-resume.
|
|
68
|
+
The package must not claim that prompt guidance, context injection, automatic delivery, or finalized-message replacement is a hard barrier.
|
|
69
|
+
The deprecated synchronous `subagent` tool remains available for unmatched chain, fan-in, panel, workflow, and compatibility callers.
|