@narumitw/pi-subagents 2.0.1 → 2.0.3
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 +20 -7
- package/dist/chunks/auto-transport-SY2VHUFH.ts +109 -0
- package/dist/chunks/auto-transport-SY2VHUFH.ts.map +7 -0
- package/dist/chunks/capability-grant-CGEWOEKE.ts +19 -0
- package/dist/chunks/capability-grant-CGEWOEKE.ts.map +7 -0
- package/dist/chunks/chunk-434NII74.ts +282 -0
- package/dist/chunks/chunk-434NII74.ts.map +7 -0
- package/dist/chunks/chunk-47SK2QYC.ts +56 -0
- package/dist/chunks/chunk-47SK2QYC.ts.map +7 -0
- package/dist/chunks/chunk-6KJ34M6S.ts +159 -0
- package/dist/chunks/chunk-6KJ34M6S.ts.map +7 -0
- package/dist/chunks/chunk-7OBINKFM.ts +80 -0
- package/dist/chunks/chunk-7OBINKFM.ts.map +7 -0
- package/dist/chunks/chunk-7QPPBBXZ.ts +335 -0
- package/dist/chunks/chunk-7QPPBBXZ.ts.map +7 -0
- package/dist/chunks/chunk-AEUYS7JC.ts +73 -0
- package/dist/chunks/chunk-AEUYS7JC.ts.map +7 -0
- package/dist/chunks/chunk-BFK2Z4ZF.ts +189 -0
- package/dist/chunks/chunk-BFK2Z4ZF.ts.map +7 -0
- package/dist/chunks/chunk-BOAXY55Y.ts +153 -0
- package/dist/chunks/chunk-BOAXY55Y.ts.map +7 -0
- package/dist/chunks/chunk-C4L6P266.ts +22 -0
- package/dist/chunks/chunk-C4L6P266.ts.map +7 -0
- package/dist/chunks/chunk-DPPVEQAM.ts +29 -0
- package/dist/chunks/chunk-DPPVEQAM.ts.map +7 -0
- package/dist/chunks/chunk-DQMN4OYM.ts +913 -0
- package/dist/chunks/chunk-DQMN4OYM.ts.map +7 -0
- package/dist/chunks/chunk-DSOOH73Y.ts +238 -0
- package/dist/chunks/chunk-DSOOH73Y.ts.map +7 -0
- package/dist/chunks/chunk-EFBPISNT.ts +421 -0
- package/dist/chunks/chunk-EFBPISNT.ts.map +7 -0
- package/dist/chunks/chunk-EWWXFU7N.ts +150 -0
- package/dist/chunks/chunk-EWWXFU7N.ts.map +7 -0
- package/dist/chunks/chunk-F4L2UVSK.ts +380 -0
- package/dist/chunks/chunk-F4L2UVSK.ts.map +7 -0
- package/dist/chunks/chunk-F5YWVHQX.ts +1543 -0
- package/dist/chunks/chunk-F5YWVHQX.ts.map +7 -0
- package/dist/chunks/chunk-G3RSMSXJ.ts +63 -0
- package/dist/chunks/chunk-G3RSMSXJ.ts.map +7 -0
- package/dist/chunks/chunk-G6VZTCFH.ts +70 -0
- package/dist/chunks/chunk-G6VZTCFH.ts.map +7 -0
- package/dist/chunks/chunk-H3FP6DLR.ts +160 -0
- package/dist/chunks/chunk-H3FP6DLR.ts.map +7 -0
- package/dist/chunks/chunk-HA36LPCO.ts +130 -0
- package/dist/chunks/chunk-HA36LPCO.ts.map +7 -0
- package/dist/chunks/chunk-HKC4ES4B.ts +65 -0
- package/dist/chunks/chunk-HKC4ES4B.ts.map +7 -0
- package/dist/chunks/chunk-HOP5FXDT.ts +27 -0
- package/dist/chunks/chunk-HOP5FXDT.ts.map +7 -0
- package/dist/chunks/chunk-I2FAK44T.ts +324 -0
- package/dist/chunks/chunk-I2FAK44T.ts.map +7 -0
- package/dist/chunks/chunk-IGAMVWFN.ts +139 -0
- package/dist/chunks/chunk-IGAMVWFN.ts.map +7 -0
- package/dist/chunks/chunk-KMGKCEO4.ts +38 -0
- package/dist/chunks/chunk-KMGKCEO4.ts.map +7 -0
- package/dist/chunks/chunk-N7BLVXKK.ts +73 -0
- package/dist/chunks/chunk-N7BLVXKK.ts.map +7 -0
- package/dist/chunks/chunk-NIF42QMF.ts +297 -0
- package/dist/chunks/chunk-NIF42QMF.ts.map +7 -0
- package/dist/chunks/chunk-O4VO6JUJ.ts +52 -0
- package/dist/chunks/chunk-O4VO6JUJ.ts.map +7 -0
- package/dist/chunks/chunk-ONDTY4EL.ts +91 -0
- package/dist/chunks/chunk-ONDTY4EL.ts.map +7 -0
- package/dist/chunks/chunk-OVPHFGKO.ts +1769 -0
- package/dist/chunks/chunk-OVPHFGKO.ts.map +7 -0
- package/dist/chunks/chunk-P7OH4XMF.ts +60 -0
- package/dist/chunks/chunk-P7OH4XMF.ts.map +7 -0
- package/dist/chunks/chunk-PSK43Y6A.ts +339 -0
- package/dist/chunks/chunk-PSK43Y6A.ts.map +7 -0
- package/dist/chunks/chunk-QBORTI4W.ts +468 -0
- package/dist/chunks/chunk-QBORTI4W.ts.map +7 -0
- package/dist/chunks/chunk-QDVGH2X7.ts +171 -0
- package/dist/chunks/chunk-QDVGH2X7.ts.map +7 -0
- package/dist/chunks/chunk-RHRQMT7Q.ts +490 -0
- package/dist/chunks/chunk-RHRQMT7Q.ts.map +7 -0
- package/dist/chunks/chunk-RRR66UWR.ts +28 -0
- package/dist/chunks/chunk-RRR66UWR.ts.map +7 -0
- package/dist/chunks/chunk-RSUXZD6S.ts +275 -0
- package/dist/chunks/chunk-RSUXZD6S.ts.map +7 -0
- package/dist/chunks/chunk-RTCVYIZA.ts +221 -0
- package/dist/chunks/chunk-RTCVYIZA.ts.map +7 -0
- package/dist/chunks/chunk-S2IWVK3J.ts +44 -0
- package/dist/chunks/chunk-S2IWVK3J.ts.map +7 -0
- package/dist/chunks/chunk-SCZ33MYW.ts +52 -0
- package/dist/chunks/chunk-SCZ33MYW.ts.map +7 -0
- package/dist/chunks/chunk-SWGQLFSD.ts +60 -0
- package/dist/chunks/chunk-SWGQLFSD.ts.map +7 -0
- package/dist/chunks/chunk-UMBPMVJW.ts +22 -0
- package/dist/chunks/chunk-UMBPMVJW.ts.map +7 -0
- package/dist/chunks/chunk-UVFVHIOP.ts +735 -0
- package/dist/chunks/chunk-UVFVHIOP.ts.map +7 -0
- package/dist/chunks/completion-delivery-YPOWSSV3.ts +16 -0
- package/dist/chunks/completion-delivery-YPOWSSV3.ts.map +7 -0
- package/dist/chunks/config-status-J4GPWP46.ts +34 -0
- package/dist/chunks/config-status-J4GPWP46.ts.map +7 -0
- package/dist/chunks/config-ui-3IBMHTQB.ts +1146 -0
- package/dist/chunks/config-ui-3IBMHTQB.ts.map +7 -0
- package/dist/chunks/consult-NYXVDN5G.ts +518 -0
- package/dist/chunks/consult-NYXVDN5G.ts.map +7 -0
- package/dist/chunks/context-QDKLVQXE.ts +11 -0
- package/dist/chunks/context-QDKLVQXE.ts.map +7 -0
- package/dist/chunks/create-stateful-transport-4WKZHRSI.ts +130 -0
- package/dist/chunks/create-stateful-transport-4WKZHRSI.ts.map +7 -0
- package/dist/chunks/cwd-policy-NB6XZ5GF.ts +17 -0
- package/dist/chunks/cwd-policy-NB6XZ5GF.ts.map +7 -0
- package/dist/chunks/delegation-contract-WJPT4FVS.ts +24 -0
- package/dist/chunks/delegation-contract-WJPT4FVS.ts.map +7 -0
- package/dist/chunks/discovery-K25T3SH4.ts +12 -0
- package/dist/chunks/discovery-K25T3SH4.ts.map +7 -0
- package/dist/chunks/execution-DS2DEIQZ.ts +4034 -0
- package/dist/chunks/execution-DS2DEIQZ.ts.map +7 -0
- package/dist/chunks/in-process-transport-TEYAWSEC.ts +38 -0
- package/dist/chunks/in-process-transport-TEYAWSEC.ts.map +7 -0
- package/dist/chunks/inspect-UOQQ3KNL.ts +619 -0
- package/dist/chunks/inspect-UOQQ3KNL.ts.map +7 -0
- package/dist/chunks/peer-communication-KL36Z6CO.ts +294 -0
- package/dist/chunks/peer-communication-KL36Z6CO.ts.map +7 -0
- package/dist/chunks/persistence-VSGXAW4P.ts +344 -0
- package/dist/chunks/persistence-VSGXAW4P.ts.map +7 -0
- package/dist/chunks/registry-E6XPJB7L.ts +1324 -0
- package/dist/chunks/registry-E6XPJB7L.ts.map +7 -0
- package/dist/chunks/retained-semantic-state-7WXSGRJU.ts +81 -0
- package/dist/chunks/retained-semantic-state-7WXSGRJU.ts.map +7 -0
- package/dist/chunks/rpc-transport-Y6LA5BOP.ts +1154 -0
- package/dist/chunks/rpc-transport-Y6LA5BOP.ts.map +7 -0
- package/dist/chunks/runtime-policy-5YELCOVC.ts +15 -0
- package/dist/chunks/runtime-policy-5YELCOVC.ts.map +7 -0
- package/dist/chunks/semantic-snapshot-WPJ3UAFW.ts +19 -0
- package/dist/chunks/semantic-snapshot-WPJ3UAFW.ts.map +7 -0
- package/dist/chunks/spawn-idempotency-QGHO2WKC.ts +13 -0
- package/dist/chunks/spawn-idempotency-QGHO2WKC.ts.map +7 -0
- package/dist/chunks/stateful-lifecycle-JAR6K55H.ts +15 -0
- package/dist/chunks/stateful-lifecycle-JAR6K55H.ts.map +7 -0
- package/dist/chunks/subprocess-transport-C2XVR25R.ts +158 -0
- package/dist/chunks/subprocess-transport-C2XVR25R.ts.map +7 -0
- package/dist/chunks/workspace-WDKLN72J.ts +11 -0
- package/dist/chunks/workspace-WDKLN72J.ts.map +7 -0
- package/dist/index.ts +1057 -0
- package/dist/index.ts.map +7 -0
- package/package.json +9 -5
- package/src/index.ts +1 -1
- package/src/settings-reader.ts +208 -0
- package/src/settings.ts +22 -187
- package/src/stateful-registration.ts +1230 -0
- package/src/stateful-safety.ts +1 -1
- package/src/stateful.ts +2 -1234
- package/src/subagents-extension.ts +307 -0
- package/src/subagents.ts +1 -308
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
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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",
|
|
6
|
+
"names": ["Text", "text", "Text", "preview", "usageStr", "result"]
|
|
7
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@narumitw/pi-subagents",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.3",
|
|
4
4
|
"description": "Pi extension for delegating work to specialized isolated subagents.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -15,20 +15,23 @@
|
|
|
15
15
|
],
|
|
16
16
|
"files": [
|
|
17
17
|
"src",
|
|
18
|
+
"dist",
|
|
18
19
|
"README.md",
|
|
19
20
|
"LICENSE"
|
|
20
21
|
],
|
|
21
22
|
"pi": {
|
|
22
23
|
"extensions": [
|
|
23
|
-
"./
|
|
24
|
+
"./dist/index.ts"
|
|
24
25
|
]
|
|
25
26
|
},
|
|
26
27
|
"piExtension": {
|
|
27
28
|
"lifecycle": "stable"
|
|
28
29
|
},
|
|
29
30
|
"scripts": {
|
|
30
|
-
"
|
|
31
|
+
"build": "node scripts/build-runtime.mjs",
|
|
32
|
+
"check": "npm run build && biome check . && npm run typecheck",
|
|
31
33
|
"format": "biome check --write .",
|
|
34
|
+
"prepack": "npm run build",
|
|
32
35
|
"typecheck": "tsc --noEmit"
|
|
33
36
|
},
|
|
34
37
|
"peerDependencies": {
|
|
@@ -39,12 +42,13 @@
|
|
|
39
42
|
"typebox": "*"
|
|
40
43
|
},
|
|
41
44
|
"devDependencies": {
|
|
42
|
-
"@biomejs/biome": "2.5.
|
|
45
|
+
"@biomejs/biome": "2.5.9",
|
|
43
46
|
"@earendil-works/pi-agent-core": "0.84.2",
|
|
44
47
|
"@earendil-works/pi-ai": "0.84.2",
|
|
45
48
|
"@earendil-works/pi-coding-agent": "0.84.2",
|
|
46
49
|
"@earendil-works/pi-tui": "0.84.2",
|
|
47
|
-
"
|
|
50
|
+
"esbuild": "0.28.2",
|
|
51
|
+
"typebox": "1.3.16",
|
|
48
52
|
"typescript": "7.0.2"
|
|
49
53
|
},
|
|
50
54
|
"dependencies": {
|
package/src/index.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { default } from "./subagents.js";
|
|
1
|
+
export { default } from "./subagents-extension.js";
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import { getAgentDir } from "@earendil-works/pi-coding-agent";
|
|
4
|
+
import type { SubagentSettings } from "./agents/types.js";
|
|
5
|
+
import {
|
|
6
|
+
type BlockingParallelLimitSettingsSnapshot,
|
|
7
|
+
buildBlockingParallelLimitSettingsSnapshot,
|
|
8
|
+
buildCompletionDeliverySettingsSnapshot,
|
|
9
|
+
buildConsultResourceSettingsSnapshot,
|
|
10
|
+
buildCwdPolicySettingsSnapshot,
|
|
11
|
+
buildDelegationWorkflowSettingsSnapshot,
|
|
12
|
+
buildStatefulLimitSettingsSnapshot,
|
|
13
|
+
buildStatefulTransportSettingsSnapshot,
|
|
14
|
+
buildSubagentSettingsSnapshot,
|
|
15
|
+
type CompletionDeliverySettingsSnapshot,
|
|
16
|
+
type ConsultResourceSettingsSnapshot,
|
|
17
|
+
type CwdPolicySettingsSnapshot,
|
|
18
|
+
type DelegationWorkflowSettingsSnapshot,
|
|
19
|
+
type InspectedSubagentSettingsDocument,
|
|
20
|
+
type StatefulLimitSettingsSnapshot,
|
|
21
|
+
type StatefulTransportSettingsSnapshot,
|
|
22
|
+
type SubagentSettingsSnapshot,
|
|
23
|
+
} from "./settings/inspection.js";
|
|
24
|
+
import { isPlainObject, normalizeSubagentSettings } from "./settings/schema.js";
|
|
25
|
+
|
|
26
|
+
export {
|
|
27
|
+
type BlockingParallelLimitSettingsSnapshot,
|
|
28
|
+
type CompletionDeliverySettingsSnapshot,
|
|
29
|
+
type ConsultResourceSettingsSnapshot,
|
|
30
|
+
type CwdPolicyFieldSnapshot,
|
|
31
|
+
type CwdPolicySettingsSnapshot,
|
|
32
|
+
DEFAULT_CONSULT_RESOURCE_POLICY,
|
|
33
|
+
DEFAULT_CONSULTATION_CWD_POLICY,
|
|
34
|
+
DEFAULT_DELEGATION_CWD_POLICY,
|
|
35
|
+
type DelegationWorkflow,
|
|
36
|
+
type DelegationWorkflowSettingsSnapshot,
|
|
37
|
+
resolveBlockingMaxParallelTasks,
|
|
38
|
+
resolveDelegationWorkflow,
|
|
39
|
+
type StatefulLimitFieldSnapshot,
|
|
40
|
+
type StatefulLimitSettingsSnapshot,
|
|
41
|
+
type StatefulTransportSettingsSnapshot,
|
|
42
|
+
type SubagentSettingsSnapshot,
|
|
43
|
+
} from "./settings/inspection.js";
|
|
44
|
+
export { hasOwn, normalizeAgentSettings, normalizeSubagentSettings } from "./settings/schema.js";
|
|
45
|
+
|
|
46
|
+
export const SUBAGENT_SETTINGS_FILE = "pi-subagents.json";
|
|
47
|
+
const LEGACY_SETTINGS_FILE = "pi-subagents-config.json";
|
|
48
|
+
let pendingSettingsNotice: string | undefined;
|
|
49
|
+
|
|
50
|
+
export function resolveSubagentSettingsPaths(): {
|
|
51
|
+
canonicalPath: string;
|
|
52
|
+
legacyPath: string;
|
|
53
|
+
activePath?: string;
|
|
54
|
+
} {
|
|
55
|
+
const canonicalPath = path.join(getAgentDir(), SUBAGENT_SETTINGS_FILE);
|
|
56
|
+
const legacyPath = path.join(getAgentDir(), LEGACY_SETTINGS_FILE);
|
|
57
|
+
return {
|
|
58
|
+
canonicalPath,
|
|
59
|
+
legacyPath,
|
|
60
|
+
activePath: fs.existsSync(canonicalPath)
|
|
61
|
+
? canonicalPath
|
|
62
|
+
: fs.existsSync(legacyPath)
|
|
63
|
+
? legacyPath
|
|
64
|
+
: undefined,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export function readSubagentSettings(): SubagentSettings | undefined {
|
|
69
|
+
pendingSettingsNotice = undefined;
|
|
70
|
+
const { canonicalPath, legacyPath, activePath } = resolveSubagentSettingsPaths();
|
|
71
|
+
if (activePath === canonicalPath) {
|
|
72
|
+
const canonical = readSettingsFile(canonicalPath);
|
|
73
|
+
const notices: string[] = [];
|
|
74
|
+
if (!canonical) notices.push(`${SUBAGENT_SETTINGS_FILE} is invalid and was ignored.`);
|
|
75
|
+
if (fs.existsSync(legacyPath)) {
|
|
76
|
+
notices.push(
|
|
77
|
+
`${LEGACY_SETTINGS_FILE} ignored because ${SUBAGENT_SETTINGS_FILE} takes precedence.`,
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
if (notices.length > 0) pendingSettingsNotice = notices.join("\n");
|
|
81
|
+
return canonical;
|
|
82
|
+
}
|
|
83
|
+
if (activePath === undefined) return undefined;
|
|
84
|
+
const legacy = readSettingsFile(legacyPath);
|
|
85
|
+
if (fs.existsSync(canonicalPath)) {
|
|
86
|
+
const canonical = readSettingsFile(canonicalPath);
|
|
87
|
+
pendingSettingsNotice = [
|
|
88
|
+
...(!canonical ? [`${SUBAGENT_SETTINGS_FILE} is invalid and was ignored.`] : []),
|
|
89
|
+
`${LEGACY_SETTINGS_FILE} ignored because ${SUBAGENT_SETTINGS_FILE} was created concurrently.`,
|
|
90
|
+
].join("\n");
|
|
91
|
+
return canonical;
|
|
92
|
+
}
|
|
93
|
+
if (!legacy) {
|
|
94
|
+
pendingSettingsNotice = `${LEGACY_SETTINGS_FILE} is invalid and was ignored.`;
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
pendingSettingsNotice = `Using legacy ${LEGACY_SETTINGS_FILE}; rename it to ${SUBAGENT_SETTINGS_FILE}. Future saves write ${SUBAGENT_SETTINGS_FILE} without modifying the legacy file.`;
|
|
98
|
+
return legacy;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export function consumeSubagentSettingsNotice() {
|
|
102
|
+
const notice = pendingSettingsNotice;
|
|
103
|
+
pendingSettingsNotice = undefined;
|
|
104
|
+
return notice;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export function subagentSettingsFilePath(): string {
|
|
108
|
+
return path.join(getAgentDir(), SUBAGENT_SETTINGS_FILE);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function inspectSubagentSettingsDocument(): InspectedSubagentSettingsDocument {
|
|
112
|
+
const { canonicalPath, activePath } = resolveSubagentSettingsPaths();
|
|
113
|
+
if (activePath === undefined) return { path: canonicalPath };
|
|
114
|
+
const inspected = inspectSubagentSettingsPath(activePath);
|
|
115
|
+
return activePath !== canonicalPath && fs.existsSync(canonicalPath)
|
|
116
|
+
? inspectSubagentSettingsPath(canonicalPath)
|
|
117
|
+
: inspected;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function inspectSubagentSettingsPath(configPath: string): InspectedSubagentSettingsDocument {
|
|
121
|
+
const fileName = path.basename(configPath);
|
|
122
|
+
let contents: string;
|
|
123
|
+
try {
|
|
124
|
+
contents = fs.readFileSync(configPath, "utf8");
|
|
125
|
+
} catch (error) {
|
|
126
|
+
const code = (error as NodeJS.ErrnoException).code;
|
|
127
|
+
return {
|
|
128
|
+
path: configPath,
|
|
129
|
+
error: `${fileName} could not be read${code ? ` (${safeErrorCode(code)})` : ""}`,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
let raw: unknown;
|
|
133
|
+
try {
|
|
134
|
+
raw = JSON.parse(contents);
|
|
135
|
+
} catch {
|
|
136
|
+
return { path: configPath, error: `${fileName} contains malformed JSON` };
|
|
137
|
+
}
|
|
138
|
+
const settings = normalizeSubagentSettings(raw);
|
|
139
|
+
if (!isPlainObject(raw) || !settings) {
|
|
140
|
+
return { path: configPath, error: `${fileName} is not a valid settings object` };
|
|
141
|
+
}
|
|
142
|
+
return { path: configPath, raw, settings };
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
export function inspectSubagentSettings(): SubagentSettingsSnapshot {
|
|
146
|
+
return buildSubagentSettingsSnapshot(inspectSubagentSettingsDocument());
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export function inspectConsultResourceSettings(): ConsultResourceSettingsSnapshot {
|
|
150
|
+
return buildConsultResourceSettingsSnapshot(inspectSubagentSettingsDocument());
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export function inspectCwdPolicySettings(): CwdPolicySettingsSnapshot {
|
|
154
|
+
return buildCwdPolicySettingsSnapshot(inspectSubagentSettingsDocument());
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export function inspectDelegationWorkflowSettings(): DelegationWorkflowSettingsSnapshot {
|
|
158
|
+
return buildDelegationWorkflowSettingsSnapshot(inspectSubagentSettingsDocument());
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export function inspectCompletionDeliverySettings(): CompletionDeliverySettingsSnapshot {
|
|
162
|
+
return buildCompletionDeliverySettingsSnapshot(inspectSubagentSettingsDocument());
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
export function inspectStatefulTransportSettings(): StatefulTransportSettingsSnapshot {
|
|
166
|
+
return buildStatefulTransportSettingsSnapshot(inspectSubagentSettingsDocument());
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export function inspectBlockingParallelLimitSettings(): BlockingParallelLimitSettingsSnapshot {
|
|
170
|
+
return buildBlockingParallelLimitSettingsSnapshot(inspectSubagentSettingsDocument());
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
export function inspectStatefulLimitSettings(): StatefulLimitSettingsSnapshot {
|
|
174
|
+
return buildStatefulLimitSettingsSnapshot(
|
|
175
|
+
inspectSubagentSettingsDocument(),
|
|
176
|
+
subagentSettingsFilePath(),
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
export function pathEntryExists(filePath: string): boolean {
|
|
181
|
+
try {
|
|
182
|
+
fs.lstatSync(filePath);
|
|
183
|
+
return true;
|
|
184
|
+
} catch (error) {
|
|
185
|
+
if ((error as NodeJS.ErrnoException).code === "ENOENT") return false;
|
|
186
|
+
throw error;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
function readSettingsFile(configPath: string): SubagentSettings | undefined {
|
|
191
|
+
return readSettingsSnapshot(configPath).settings;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
export function readSettingsSnapshot(configPath: string): {
|
|
195
|
+
settings?: SubagentSettings;
|
|
196
|
+
contents?: string;
|
|
197
|
+
} {
|
|
198
|
+
try {
|
|
199
|
+
const contents = fs.readFileSync(configPath, "utf8");
|
|
200
|
+
return { settings: normalizeSubagentSettings(JSON.parse(contents)), contents };
|
|
201
|
+
} catch {
|
|
202
|
+
return {};
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
function safeErrorCode(value: string): string {
|
|
207
|
+
return value.replace(/[^A-Z0-9_-]/giu, "?").slice(0, 64);
|
|
208
|
+
}
|