@narumitw/pi-subagents 2.0.6 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +171 -60
- 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-CBP76ARQ.ts → chunk-2LMJU25E.ts} +172 -74
- package/dist/chunks/chunk-2LMJU25E.ts.map +7 -0
- 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-YBUWBRF7.ts → chunk-6NSJVPXX.ts} +6 -16
- package/dist/chunks/{chunk-YBUWBRF7.ts.map → chunk-6NSJVPXX.ts.map} +2 -2
- 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-NIF42QMF.ts → chunk-FEVPWRMU.ts} +7 -4
- package/dist/chunks/chunk-FEVPWRMU.ts.map +7 -0
- 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-NLT67IZS.ts +322 -0
- package/dist/chunks/chunk-NLT67IZS.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-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-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/{chunk-434NII74.ts → chunk-YU53SHA7.ts} +54 -8
- package/dist/chunks/chunk-YU53SHA7.ts.map +7 -0
- package/dist/chunks/{completion-delivery-YPOWSSV3.ts → completion-delivery-RSJU6BXL.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-ABHYNGQ7.ts} +297 -231
- package/dist/chunks/config-ui-ABHYNGQ7.ts.map +7 -0
- package/dist/chunks/{consult-IV7UBNQQ.ts → consult-LJU3IQY5.ts} +14 -13
- package/dist/chunks/consult-LJU3IQY5.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-UY3PY6E5.ts} +11 -7
- package/dist/chunks/persistence-UY3PY6E5.ts.map +7 -0
- package/dist/chunks/{registry-E6XPJB7L.ts → registry-BT54L6CY.ts} +136 -15
- package/dist/chunks/registry-BT54L6CY.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 +682 -82
- package/dist/index.ts.map +3 -3
- package/docs/async-runtime-protocol.md +83 -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 +479 -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-registration.ts +4 -12
- 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/session-guidance-contract.ts +309 -0
- 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 +11 -18
- package/src/stateful-limit-ui.ts +23 -20
- package/src/stateful-limits.ts +10 -10
- package/src/stateful-registration.ts +126 -36
- package/src/stateful-render.ts +27 -2
- package/src/subagent-details.ts +43 -0
- package/src/subagents-extension.ts +116 -68
- 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-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-RSJU6BXL.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
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/stateful-agent-view.ts", "../../src/stateful-config.ts", "../../src/stateful-registration.ts", "../../src/stateful-guidance.ts", "../../src/stateful-render.ts", "../../src/stateful-tool-params.ts"],
|
|
4
|
+
"sourcesContent": ["import { MAX_TOOL_MESSAGE_BYTES, truncateUtf8 } from \"./limits.js\";\nimport type { ManagedAgent } from \"./registry.js\";\n\nexport function formatStatefulAgentLine(agent: ManagedAgent, now = Date.now()): string {\n\tconst elapsedSeconds = Math.max(0, Math.floor((now - agent.updatedAt) / 1000));\n\tconst task = agent.currentTask ? ` \u2014 ${sanitizeStatusLine(agent.currentTask, 80)}` : \"\";\n\tconst unread = agent.mailbox.filter((message) => !message.readAt).length;\n\tconst indent = \" \".repeat(agent.depth);\n\treturn `${indent}${sanitizeStatusLine(agent.taskPath ?? agent.id, 256)} \u00B7 ${sanitizeStatusLine(agent.agent, 128)} \u00B7 ${agentStateLabel(agent.state)} \u00B7 updated ${elapsedSeconds}s ago \u00B7 ${unread} unread${task}`;\n}\n\nexport function summarizeStatefulAgent(agent: ManagedAgent) {\n\treturn {\n\t\tid: agent.id,\n\t\ttaskName: agent.taskName,\n\t\ttaskPath: agent.taskPath,\n\t\tagent: agent.agent,\n\t\tparentId: agent.parentId,\n\t\trootId: agent.rootId,\n\t\tdepth: agent.depth,\n\t\tchildren: [...agent.children],\n\t\tstate: agent.state,\n\t\tcreatedAt: agent.createdAt,\n\t\tupdatedAt: agent.updatedAt,\n\t\tcwd: agent.cwd,\n\t\tworkspaceMode: agent.workspaceMode ?? \"shared\",\n\t\tthinkingLevel: agent.thinkingLevel,\n\t\ttimeoutMs: agent.timeoutMs,\n\t\tcurrentTimeoutMs: agent.currentTimeoutMs,\n\t\tidleTimeoutMs: agent.idleTimeoutMs,\n\t\tcurrentIdleTimeoutMs: agent.currentIdleTimeoutMs,\n\t\tmaxTurns: agent.maxTurns,\n\t\tcurrentMaxTurns: agent.currentMaxTurns,\n\t\tmaxToolCalls: agent.maxToolCalls,\n\t\tcurrentMaxToolCalls: agent.currentMaxToolCalls,\n\t\tcurrentTask: agent.currentTask\n\t\t\t? truncateUtf8(agent.currentTask, MAX_TOOL_MESSAGE_BYTES).text\n\t\t\t: undefined,\n\t\thistoryCount: agent.history.length,\n\t\tunreadMessages: agent.mailbox.filter((message) => !message.readAt).length,\n\t\tcontext: {\n\t\t\tturns: agent.contextTurns ?? 0,\n\t\t\tsources: agent.contextSourceIds?.length ?? 0,\n\t\t\tbytes: agent.contextBytes ?? 0,\n\t\t\ttruncated: agent.contextTruncated === true,\n\t\t},\n\t\tresultFormat: agent.resultFormat ?? \"text\",\n\t\tcompletionRequirements: (agent.completionRequirements ?? []).map((record) => ({\n\t\t\t...record,\n\t\t})),\n\t\tstructuredResult: agent.structuredResult,\n\t\ttermination: agent.termination,\n\t\toutcome: agent.outcome,\n\t\texecutionPlan: agent.executionPlan,\n\t\tcapabilityGrant: agent.capabilityGrant,\n\t\tsemanticCompatibility: agent.semanticCompatibility,\n\t\tsemanticSnapshotDigest: agent.semanticSnapshot?.digest,\n\t\ttelemetry: agent.telemetry,\n\t\terror: agent.error ? truncateUtf8(agent.error, MAX_TOOL_MESSAGE_BYTES).text : undefined,\n\t\ttarget: agent.target,\n\t\tpolicy: agent.policy,\n\t};\n}\n\nfunction agentStateLabel(state: ManagedAgent[\"state\"]): string {\n\tswitch (state) {\n\t\tcase \"running\":\n\t\t\treturn \"working\";\n\t\tcase \"completed\":\n\t\t\treturn \"finished\";\n\t\tdefault:\n\t\t\treturn state;\n\t}\n}\n\nfunction sanitizeStatusLine(value: string, maxLength: number): string {\n\treturn (\n\t\tvalue\n\t\t\t.slice(0, maxLength)\n\t\t\t// biome-ignore lint/suspicious/noControlCharactersInRegex: Escape untrusted terminal controls.\n\t\t\t.replace(/[\\u0000-\\u001f\\u007f-\\u009f]/gu, \" \")\n\t\t\t.replace(/\\s+/gu, \" \")\n\t\t\t.trim()\n\t);\n}\n", "import type { CompletionDelivery, SubagentTransportKind } from \"./agents/types.js\";\n\nexport function resolveStatefulTransportKind(\n\tvalue: SubagentTransportKind | undefined,\n): SubagentTransportKind {\n\treturn value ?? \"subprocess\";\n}\n\nexport function resolveCompletionDelivery(\n\tvalue: CompletionDelivery | undefined,\n): CompletionDelivery {\n\treturn value ?? \"next-turn\";\n}\n", "/**\n * Stateful registration remains one lifecycle owner so session replacement, persistence,\n * capability revocation, workspace cleanup, and completion delivery cannot reorder.\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport { StringEnum } from \"@earendil-works/pi-ai\";\nimport { defineTool, type ExtensionAPI } from \"@earendil-works/pi-coding-agent\";\nimport { Type } from \"typebox\";\nimport {\n\ttype AgentScope,\n\ttype CompletionDelivery,\n\tisThinkingLevel,\n\ttype SubagentRuntimeSettings,\n\ttype SubagentSettings,\n\ttype SubagentTransportKind,\n\tTHINKING_LEVELS,\n} from \"./agents/types.js\";\nimport type { CompletionDeliveryBroker } from \"./completion-delivery.js\";\nimport {\n\tCompletionRequirementModeSchema,\n\tcompletionRequirementsFromBranch,\n} from \"./completion-requirement.js\";\nimport type { ContextMode } from \"./context.js\";\nimport type { CreateStatefulTransportOptions } from \"./create-stateful-transport.js\";\nimport { DelegationContractSchema } from \"./delegation-contract.js\";\nimport type { ChildSessionFactory, ParentRuntimeSnapshot } from \"./in-process-transport.js\";\nimport {\n\tDEFAULT_MAX_CONTEXT_BYTES,\n\tMAX_SUBAGENT_TIMEOUT_MS,\n\tMAX_TOOL_MESSAGE_BYTES,\n\ttruncateUtf8,\n} from \"./limits.js\";\nimport type { AgentPersistence } from \"./persistence.js\";\nimport type {\n\tAgentRegistry,\n\tAgentRunInspectionDetail,\n\tAgentRunInspectionSummary,\n\tManagedAgent,\n} from \"./registry.js\";\nimport { SUBAGENT_RESULT_FORMATS, type SubagentResultFormat } from \"./result-contract.js\";\nimport { DEFAULT_DELEGATION_CWD_POLICY } from \"./settings/inspection.js\";\nimport { readSubagentSettings } from \"./settings-reader.js\";\nimport {\n\tassertSpawnIdempotencyKey,\n\tMAX_SPAWN_IDEMPOTENCY_KEY_LENGTH,\n} from \"./spawn-idempotency.js\";\nimport { summarizeStatefulAgent } from \"./stateful-agent-view.js\";\nimport { resolveCompletionDelivery, resolveStatefulTransportKind } from \"./stateful-config.js\";\nimport { createSpawnPromptGuidelines } from \"./stateful-guidance.js\";\nimport { assertCurrentSpawn, waitForOwnedSpawn } from \"./stateful-lifecycle.js\";\nimport { resolveStatefulLimits, type StatefulLimits } from \"./stateful-limits.js\";\nimport { createStatefulToolRenderer } from \"./stateful-render.js\";\nimport { confirmProjectAgent } from \"./stateful-safety.js\";\nimport {\n\tMailboxParamsSchema,\n\tManageParamsSchema,\n\tvalidateMailboxParams,\n\tvalidateManageParams,\n} from \"./stateful-tool-params.js\";\nimport { MAX_TASK_NAME_LENGTH } from \"./task-path.js\";\nimport { grammarSafeToolObject } from \"./tool-schema-compatibility.js\";\nimport { MAX_SUBAGENT_TOOL_CALLS, MAX_SUBAGENT_TURNS } from \"./turn-budget.js\";\nimport type { UsageRecordingController } from \"./usage-recording.js\";\nimport type { WorkspaceManager } from \"./workspace.js\";\n\ntype CwdPolicyModule = typeof import(\"./cwd-policy.js\");\ntype StateLifecycleModule = typeof import(\"./stateful-lifecycle.js\");\n\ntype StatefulSessionModules = {\n\tbroker: typeof import(\"./completion-delivery.js\");\n\tpeerCommunication: typeof import(\"./peer-communication.js\");\n\tcontext: typeof import(\"./context.js\");\n\ttransport: typeof import(\"./create-stateful-transport.js\");\n\tcwdPolicy: CwdPolicyModule;\n\tpersistence: typeof import(\"./persistence.js\");\n\tregistry: typeof import(\"./registry.js\");\n\tlifecycle: StateLifecycleModule;\n};\n\ntype StatefulSpawnModules = {\n\tagents: typeof import(\"./agents/discovery.js\");\n\tcapabilityGrant: typeof import(\"./capability-grant.js\");\n\tcontext: typeof import(\"./context.js\");\n\tcwdPolicy: CwdPolicyModule;\n\tdelegationContract: typeof import(\"./delegation-contract.js\");\n\truntimePolicy: typeof import(\"./execution/runtime-policy.js\");\n\tretainedSemanticState: typeof import(\"./retained-semantic-state.js\");\n\tsemanticSnapshot: typeof import(\"./semantic-snapshot.js\");\n\tspawnIdempotency: typeof import(\"./spawn-idempotency.js\");\n};\n\nlet statefulSessionModules: Promise<StatefulSessionModules> | undefined;\nlet statefulSpawnModules: Promise<StatefulSpawnModules> | undefined;\nlet workspaceModule: Promise<typeof import(\"./workspace.js\")> | undefined;\n\nfunction loadStatefulSessionModules(): Promise<StatefulSessionModules> {\n\tstatefulSessionModules ??= Promise.all([\n\t\timport(\"./completion-delivery.js\"),\n\t\timport(\"./peer-communication.js\"),\n\t\timport(\"./context.js\"),\n\t\timport(\"./create-stateful-transport.js\"),\n\t\timport(\"./cwd-policy.js\"),\n\t\timport(\"./persistence.js\"),\n\t\timport(\"./registry.js\"),\n\t\timport(\"./stateful-lifecycle.js\"),\n\t])\n\t\t.then(\n\t\t\t([\n\t\t\t\tbroker,\n\t\t\t\tpeerCommunication,\n\t\t\t\tcontext,\n\t\t\t\ttransport,\n\t\t\t\tcwdPolicy,\n\t\t\t\tpersistence,\n\t\t\t\tregistry,\n\t\t\t\tlifecycle,\n\t\t\t]) => ({\n\t\t\t\tbroker,\n\t\t\t\tpeerCommunication,\n\t\t\t\tcontext,\n\t\t\t\ttransport,\n\t\t\t\tcwdPolicy,\n\t\t\t\tpersistence,\n\t\t\t\tregistry,\n\t\t\t\tlifecycle,\n\t\t\t}),\n\t\t)\n\t\t.catch((error: unknown) => {\n\t\t\tstatefulSessionModules = undefined;\n\t\t\tthrow error;\n\t\t});\n\treturn statefulSessionModules;\n}\n\nfunction loadStatefulSpawnModules(): Promise<StatefulSpawnModules> {\n\tstatefulSpawnModules ??= Promise.all([\n\t\timport(\"./agents/discovery.js\"),\n\t\timport(\"./capability-grant.js\"),\n\t\timport(\"./context.js\"),\n\t\timport(\"./cwd-policy.js\"),\n\t\timport(\"./delegation-contract.js\"),\n\t\timport(\"./execution/runtime-policy.js\"),\n\t\timport(\"./retained-semantic-state.js\"),\n\t\timport(\"./semantic-snapshot.js\"),\n\t\timport(\"./spawn-idempotency.js\"),\n\t])\n\t\t.then(\n\t\t\t([\n\t\t\t\tagents,\n\t\t\t\tcapabilityGrant,\n\t\t\t\tcontext,\n\t\t\t\tcwdPolicy,\n\t\t\t\tdelegationContract,\n\t\t\t\truntimePolicy,\n\t\t\t\tretainedSemanticState,\n\t\t\t\tsemanticSnapshot,\n\t\t\t\tspawnIdempotency,\n\t\t\t]) => ({\n\t\t\t\tagents,\n\t\t\t\tcapabilityGrant,\n\t\t\t\tcontext,\n\t\t\t\tcwdPolicy,\n\t\t\t\tdelegationContract,\n\t\t\t\truntimePolicy,\n\t\t\t\tretainedSemanticState,\n\t\t\t\tsemanticSnapshot,\n\t\t\t\tspawnIdempotency,\n\t\t\t}),\n\t\t)\n\t\t.catch((error: unknown) => {\n\t\t\tstatefulSpawnModules = undefined;\n\t\t\tthrow error;\n\t\t});\n\treturn statefulSpawnModules;\n}\n\nasync function loadWorkspaceModule(): Promise<typeof import(\"./workspace.js\")> {\n\tworkspaceModule ??= import(\"./workspace.js\").catch((error: unknown) => {\n\t\tworkspaceModule = undefined;\n\t\tthrow error;\n\t});\n\treturn workspaceModule;\n}\n\nconst ContextModeSchema = Type.Union([\n\tStringEnum([\"none\", \"all\", \"summary\"] as const),\n\tType.Number({ minimum: 1, description: \"Include the most recent N user turns.\" }),\n]);\nconst ScopeSchema = StringEnum([\"user\", \"project\", \"both\"] as const, {\n\tdescription:\n\t\t'Per-invocation custom agent scope for this spawn. Default: \"user\". Use \"project\" for project-local agents or \"both\" for user and project agents; the selected scope is retained for follow-ups.',\n\tdefault: \"user\",\n});\nconst StatefulThinkingLevelSchema = StringEnum(THINKING_LEVELS, {\n\tdescription:\n\t\t\"Optional requested Pi thinking level selected for this task difficulty; retained for every turn of the spawned agent.\",\n});\nconst StatefulTimeoutSchema = Type.Integer({\n\tminimum: 1,\n\tmaximum: MAX_SUBAGENT_TIMEOUT_MS,\n\tdescription:\n\t\t\"Work deadline in milliseconds selected for the task difficulty. On expiry, Pi aborts the work and makes one separately bounded summary attempt. Retained as the agent default.\",\n});\nconst DEFAULT_SUBAGENT_AWAIT_TIMEOUT_MS = 30_000;\nconst SubagentAwaitParams = Type.Object({\n\tagentId: Type.String({\n\t\tminLength: 1,\n\t\tdescription: \"Retained agent ID or canonical task path.\",\n\t}),\n\ttimeoutMs: Type.Optional(\n\t\tType.Integer({\n\t\t\tminimum: 1,\n\t\t\tmaximum: MAX_SUBAGENT_TIMEOUT_MS,\n\t\t\tdescription:\n\t\t\t\t\"Maximum time to wait in milliseconds. A wait timeout stops only this tool call and does not interrupt or close the subagent. Defaults to 30000.\",\n\t\t}),\n\t),\n});\nconst StatefulTurnLimitFields = {\n\tidleTimeoutMs: Type.Optional(\n\t\tType.Integer({\n\t\t\tminimum: 1,\n\t\t\tmaximum: MAX_SUBAGENT_TIMEOUT_MS,\n\t\t\tdescription:\n\t\t\t\t\"Maximum milliseconds without a completed assistant turn or tool result; retained as the agent default.\",\n\t\t}),\n\t),\n\tmaxTurns: Type.Optional(\n\t\tType.Integer({\n\t\t\tminimum: 1,\n\t\t\tmaximum: MAX_SUBAGENT_TURNS,\n\t\t\tdescription:\n\t\t\t\t\"Maximum unfinished assistant turns; retained as the agent default. Omit rather than guessing a tight bound.\",\n\t\t}),\n\t),\n\tmaxToolCalls: Type.Optional(\n\t\tType.Integer({\n\t\t\tminimum: 1,\n\t\t\tmaximum: MAX_SUBAGENT_TOOL_CALLS,\n\t\t\tdescription:\n\t\t\t\t\"Maximum tool calls; retained as the agent default. Omit rather than guessing a tight bound.\",\n\t\t}),\n\t),\n};\nexport interface StatefulSubagentDependencies {\n\tblockingEnabled?: boolean;\n\tcreateInProcessSession?: ChildSessionFactory;\n\tworkspaceManager?: WorkspaceManager;\n\tsettings?: SubagentRuntimeSettings;\n\tgetSettings?: () => SubagentSettings | undefined;\n\tloadTransport?: CreateStatefulTransportOptions[\"loadTransport\"];\n\tusageRecording?: UsageRecordingController;\n}\n\nexport interface StatefulSubagentRuntimeStatus {\n\tenabled: boolean;\n\tinitialized: boolean;\n\ttransport: SubagentTransportKind;\n\tcompletionDelivery: CompletionDelivery;\n\tlimits: StatefulLimits;\n\tactiveAgents: number;\n\tretainedAgents: number;\n}\n\nexport interface StatefulSubagentController {\n\tgetCompletionDelivery(): CompletionDelivery;\n\tsetCompletionDelivery(value: CompletionDelivery): void;\n\tgetRuntimeStatus(): StatefulSubagentRuntimeStatus;\n\tlistAgents(includeClosed?: boolean): ManagedAgent[];\n\tlistRunInspection(includeClosed?: boolean): AgentRunInspectionSummary[];\n\tgetRunInspection(agentId: string): AgentRunInspectionDetail | undefined;\n\tclearAgents(): Promise<number>;\n}\n\ninterface StatefulActionToolResult {\n\tcontent: Array<{ type: \"text\"; text: string }>;\n\tdetails: Record<string, unknown>;\n}\n\nexport function registerStatefulSubagents(\n\tpi: ExtensionAPI,\n\tdependencies: StatefulSubagentDependencies = {},\n): StatefulSubagentController {\n\tconst settings = Object.hasOwn(dependencies, \"settings\")\n\t\t? (dependencies.settings ?? {})\n\t\t: (readSubagentSettings()?.stateful ?? {});\n\tconst blockingEnabled = dependencies.blockingEnabled !== false;\n\tconst enabled = settings.enabled !== false;\n\tconst transportKind = resolveStatefulTransportKind(settings.transport);\n\tlet completionDelivery = resolveCompletionDelivery(settings.completionDelivery);\n\tlet runtimeLimits = resolveStatefulLimits(settings);\n\tlet completionBroker: CompletionDeliveryBroker | undefined;\n\tlet peerBroker: import(\"./peer-communication.js\").PeerCommunicationBroker | undefined;\n\tlet registry: AgentRegistry | undefined;\n\tlet persistence: AgentPersistence | undefined;\n\tlet sweepTimer: NodeJS.Timeout | undefined;\n\tlet runtimeGeneration = 0;\n\tlet runtimeTransition: Promise<void> = Promise.resolve();\n\tlet workspaceManager = dependencies.workspaceManager;\n\tconst getWorkspaceManager = async () => {\n\t\tif (workspaceManager) return workspaceManager;\n\t\tconst { WorkspaceManager } = await loadWorkspaceModule();\n\t\tworkspaceManager = new WorkspaceManager();\n\t\treturn workspaceManager;\n\t};\n\tconst isolatedAgents = new Map<string, string>();\n\tconst seenMessageIds = new Set<string>();\n\ttype PendingIdempotentSpawn = {\n\t\tgeneration: number;\n\t\trequestHash: string;\n\t\tpromise: Promise<ManagedAgent>;\n\t};\n\tconst pendingIdempotentSpawns = new Map<string, PendingIdempotentSpawn>();\n\tconst parentRuntime: ParentRuntimeSnapshot = { model: undefined, thinkingLevel: \"off\" };\n\tconst getCurrentSettings = () =>\n\t\tdependencies.getSettings ? dependencies.getSettings() : readSubagentSettings();\n\tconst getCurrentStatefulSettings = () =>\n\t\tdependencies.getSettings ? (dependencies.getSettings()?.stateful ?? {}) : settings;\n\n\tconst clearAgents = async (): Promise<number> => {\n\t\tconst generation = runtimeGeneration;\n\t\tconst currentRegistry = registry;\n\t\tconst currentPersistence = persistence;\n\t\tif (!currentRegistry) return 0;\n\t\tconst currentWorkspaceManager = await getWorkspaceManager();\n\t\tconst count = currentRegistry.list().length;\n\t\tconst clear = async () => {\n\t\t\tawait currentRegistry.closeAll();\n\t\t\tif (generation !== runtimeGeneration) return;\n\t\t\tawait currentWorkspaceManager.cleanupAll();\n\t\t\tisolatedAgents.clear();\n\t\t\tseenMessageIds.clear();\n\t\t\tawait currentPersistence?.delete();\n\t\t};\n\t\tconst transition = runtimeTransition.then(clear, clear);\n\t\truntimeTransition = transition.catch(() => undefined);\n\t\tawait transition;\n\t\treturn count;\n\t};\n\tconst controller: StatefulSubagentController = {\n\t\tgetCompletionDelivery() {\n\t\t\treturn completionDelivery;\n\t\t},\n\t\tsetCompletionDelivery(value) {\n\t\t\tcompletionDelivery = value;\n\t\t\tcompletionBroker?.setDelivery(value);\n\t\t},\n\t\tgetRuntimeStatus() {\n\t\t\tconst counts = registry?.inspectionCounts() ?? { activeAgents: 0, retainedAgents: 0 };\n\t\t\treturn {\n\t\t\t\tenabled,\n\t\t\t\tinitialized: registry !== undefined,\n\t\t\t\ttransport: transportKind,\n\t\t\t\tcompletionDelivery,\n\t\t\t\tlimits: { ...runtimeLimits },\n\t\t\t\t...counts,\n\t\t\t};\n\t\t},\n\t\tlistAgents(includeClosed = false) {\n\t\t\treturn registry?.list(includeClosed) ?? [];\n\t\t},\n\t\tlistRunInspection(includeClosed = false) {\n\t\t\treturn registry?.listInspection(includeClosed) ?? [];\n\t\t},\n\t\tgetRunInspection(agentId) {\n\t\t\treturn registry?.getInspection(agentId);\n\t\t},\n\t\tclearAgents,\n\t};\n\tif (!enabled) return controller;\n\n\tconst requireRegistry = () => {\n\t\tif (!registry) throw new Error(\"Stateful subagents are not initialized for this session\");\n\t\treturn registry;\n\t};\n\tpi.on(\"session_start\", async (event, ctx) => {\n\t\tconst generation = ++runtimeGeneration;\n\t\tcompletionBroker?.close();\n\t\tcompletionBroker = undefined;\n\t\tconst previousPeerBroker = peerBroker;\n\t\tpeerBroker = undefined;\n\t\tif (sweepTimer) clearInterval(sweepTimer);\n\t\tsweepTimer = undefined;\n\t\tconst previousRegistry = registry;\n\t\tregistry = undefined;\n\t\tpersistence = undefined;\n\t\tisolatedAgents.clear();\n\t\tseenMessageIds.clear();\n\t\tpendingIdempotentSpawns.clear();\n\t\tconst initialize = async () => {\n\t\t\tawait previousPeerBroker?.close();\n\t\t\tconst currentWorkspaceManager = await getWorkspaceManager();\n\t\t\tconst modules = await loadStatefulSessionModules();\n\t\t\tconst cleanupErrors = await modules.lifecycle.disposeStatefulRuntime(\n\t\t\t\tpreviousRegistry,\n\t\t\t\tcurrentWorkspaceManager,\n\t\t\t);\n\t\t\tif (generation !== runtimeGeneration) return;\n\t\t\tif (cleanupErrors.length > 0 && ctx.hasUI) {\n\t\t\t\tctx.ui.notify(\n\t\t\t\t\t`Previous subagent runtime cleanup reported ${cleanupErrors.length} error(s).`,\n\t\t\t\t\t\"warning\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tparentRuntime.model = ctx.model;\n\t\t\tparentRuntime.thinkingLevel = normalizeRuntimeThinkingLevel(pi.getThinkingLevel());\n\t\t\tconst sessionSettings = getCurrentStatefulSettings();\n\t\t\tconst nextLimits = resolveStatefulLimits(sessionSettings);\n\t\t\tconst owner =\n\t\t\t\tctx.sessionManager.getSessionId?.() ??\n\t\t\t\tctx.sessionManager.getSessionFile?.() ??\n\t\t\t\t`ephemeral:${ctx.cwd}`;\n\t\t\tconst sessionPersistence = new modules.persistence.AgentPersistence(owner, {\n\t\t\t\tretentionDays: sessionSettings.retentionDays,\n\t\t\t\tmaxStoredAgents: nextLimits.maxStoredAgents,\n\t\t\t});\n\t\t\tlet nextRegistry: AgentRegistry;\n\t\t\tlet transport: import(\"./transport.js\").SubagentTransport;\n\t\t\tconst sessionBroker = new modules.broker.CompletionDeliveryBroker(\n\t\t\t\tpi,\n\t\t\t\tctx,\n\t\t\t\tcompletionDelivery,\n\t\t\t\t{\n\t\t\t\t\tonDeliveryError: (error) => {\n\t\t\t\t\t\tif (!ctx.hasUI) return;\n\t\t\t\t\t\tconst reason = error instanceof Error ? error.message : String(error);\n\t\t\t\t\t\tctx.ui.notify(`Subagent completion delivery failed: ${reason}`, \"warning\");\n\t\t\t\t\t},\n\t\t\t\t\tonDeliveryAttempt: (completions, input) => {\n\t\t\t\t\t\tif (generation !== runtimeGeneration) return;\n\t\t\t\t\t\tfor (const completion of completions) {\n\t\t\t\t\t\t\tdependencies.usageRecording?.recordCompletionDeliveryAttempt(completion, input);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tonAcknowledged: (completions, deliveredAt) => {\n\t\t\t\t\t\tif (generation !== runtimeGeneration) return;\n\t\t\t\t\t\tfor (const completion of completions) {\n\t\t\t\t\t\t\tdependencies.usageRecording?.recordCompletionVisible(completion);\n\t\t\t\t\t\t\tvoid nextRegistry\n\t\t\t\t\t\t\t\t.markCompletionDelivered(completion.completionId, deliveredAt)\n\t\t\t\t\t\t\t\t.catch((error: unknown) => {\n\t\t\t\t\t\t\t\t\tif (!ctx.hasUI || generation !== runtimeGeneration) return;\n\t\t\t\t\t\t\t\t\tconst reason = error instanceof Error ? error.message : String(error);\n\t\t\t\t\t\t\t\t\tctx.ui.notify(`Subagent completion acknowledgement failed: ${reason}`, \"warning\");\n\t\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);\n\t\t\tconst sessionPeerBroker = new modules.peerCommunication.PeerCommunicationBroker({\n\t\t\t\tgetRegistry: () => nextRegistry,\n\t\t\t\tsendRoot: ({ message, senderPath }) => {\n\t\t\t\t\tpi.appendEntry(\"pi-subagent-peer-message\", {\n\t\t\t\t\t\tmessageId: message.id,\n\t\t\t\t\t\tsenderId: message.senderId,\n\t\t\t\t\t\tsenderPath,\n\t\t\t\t\t\tcontent: modules.context.redactPrivateText(message.content),\n\t\t\t\t\t});\n\t\t\t\t\tpi.sendMessage(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcustomType: \"pi-subagent-peer-message\",\n\t\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t\t\"Message Type: SUBAGENT_PEER_MESSAGE\",\n\t\t\t\t\t\t\t\t\"Protocol: pi-subagents:v1\",\n\t\t\t\t\t\t\t\t`Message ID: ${message.id}`,\n\t\t\t\t\t\t\t\t`Sender ID: ${message.senderId}`,\n\t\t\t\t\t\t\t\t`Sender Path: ${senderPath}`,\n\t\t\t\t\t\t\t\t\"Payload:\",\n\t\t\t\t\t\t\t\tmessage.content,\n\t\t\t\t\t\t\t].join(\"\\n\"),\n\t\t\t\t\t\t\tdisplay: true,\n\t\t\t\t\t\t\tdetails: { ...message, senderPath },\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ deliverAs: \"steer\", triggerTurn: false },\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\tdispatch: (recipient, message) => transport.deliverMessage?.(recipient, message) ?? false,\n\t\t\t});\n\t\t\ttransport = modules.transport.createStatefulTransport({\n\t\t\t\tkind: transportKind,\n\t\t\t\tmodelRegistry: ctx.modelRegistry,\n\t\t\t\tgetParentRuntime: () => ({ ...parentRuntime }),\n\t\t\t\tgetSettings: getCurrentSettings,\n\t\t\t\tcreateInProcessSession: dependencies.createInProcessSession,\n\t\t\t\tpeerRuntime: sessionPeerBroker,\n\t\t\t\tloadTransport: dependencies.loadTransport,\n\t\t\t});\n\t\t\tnextRegistry = new modules.registry.AgentRegistry(transport, {\n\t\t\t\tmaxAgents: nextLimits.maxAgents,\n\t\t\t\tmaxActiveTurns: nextLimits.maxActiveTurns,\n\t\t\t\tmaxDepth: nextLimits.maxDepth,\n\t\t\t\tmaxChildrenPerAgent: nextLimits.maxChildrenPerAgent,\n\t\t\t\tmaxMailboxMessages: sessionSettings.maxMailboxMessages,\n\t\t\t\tmaxMailboxMessageBytes: sessionSettings.maxMailboxMessageBytes,\n\t\t\t\tidleTtlMs: sessionSettings.idleTtlMs,\n\t\t\t\tonChange: async (agents) => {\n\t\t\t\t\tif (generation !== runtimeGeneration) return;\n\t\t\t\t\tawait sessionPersistence.save(agents);\n\t\t\t\t\tif (generation !== runtimeGeneration) return;\n\t\t\t\t\tdependencies.usageRecording?.observeAgents(agents);\n\t\t\t\t\tfor (const agent of agents) {\n\t\t\t\t\t\tfor (const message of agent.mailbox) {\n\t\t\t\t\t\t\tif (seenMessageIds.has(message.id)) continue;\n\t\t\t\t\t\t\tseenMessageIds.add(message.id);\n\t\t\t\t\t\t\tpi.appendEntry(\"pi-subagent-message\", {\n\t\t\t\t\t\t\t\tsenderId: message.senderId,\n\t\t\t\t\t\t\t\trecipientId: message.recipientId,\n\t\t\t\t\t\t\t\tcontent: modules.context.redactPrivateText(message.content).slice(0, 160),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tagent.state === \"running\" &&\n\t\t\t\t\t\t\t\tmessage.deduplicationKey?.startsWith(\"completion:\")\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tawait transport.deliverMessage?.(agent, {\n\t\t\t\t\t\t\t\t\t\t...message,\n\t\t\t\t\t\t\t\t\t\tcontent: modules.context.redactPrivateText(message.content),\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t\t\t// The durable parent mailbox remains the retry path for the next turn.\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (generation !== runtimeGeneration) return;\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\tonTurnComplete: (completion) => {\n\t\t\t\t\tif (generation !== runtimeGeneration) return;\n\t\t\t\t\tdependencies.usageRecording?.recordChildCompletion(completion);\n\t\t\t\t\tif (completion.recipientId === \"root\") sessionBroker.enqueue(completion);\n\t\t\t\t},\n\t\t\t});\n\t\t\tconst persisted = sessionPersistence.load();\n\t\t\tconst orphanCleanupFailures = await modules.lifecycle.cleanupPersistedWorkspaces(\n\t\t\t\tpersisted,\n\t\t\t\tcurrentWorkspaceManager,\n\t\t\t);\n\t\t\tif (generation !== runtimeGeneration) {\n\t\t\t\tsessionBroker.close();\n\t\t\t\tawait sessionPeerBroker.close();\n\t\t\t\tawait modules.lifecycle.disposeStatefulRuntime(nextRegistry, currentWorkspaceManager);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (ctx.hasUI && orphanCleanupFailures > 0) {\n\t\t\t\tctx.ui.notify(\"Some orphaned subagent worktrees could not be cleaned\", \"warning\");\n\t\t\t}\n\t\t\tconst restored = persisted\n\t\t\t\t.filter(\n\t\t\t\t\t(agent) =>\n\t\t\t\t\t\tagent.workspaceMode !== \"worktree\" &&\n\t\t\t\t\t\t((agent.agentScope !== \"project\" && agent.agentScope !== \"both\") ||\n\t\t\t\t\t\t\tctx.isProjectTrusted()),\n\t\t\t\t)\n\t\t\t\t.flatMap((agent) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst target = modules.cwdPolicy.resolveSubagentTarget({\n\t\t\t\t\t\t\tworkspace: ctx.cwd,\n\t\t\t\t\t\t\trequestedCwd: agent.cwd,\n\t\t\t\t\t\t\tcurrentProjectTrusted: ctx.isProjectTrusted(),\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn [\n\t\t\t\t\t\t\t{ ...agent, cwd: target.cwd, target: modules.cwdPolicy.targetPolicyAudit(target) },\n\t\t\t\t\t\t];\n\t\t\t\t\t} catch {\n\t\t\t\t\t\treturn [];\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\tfor (const agent of restored) {\n\t\t\t\tfor (const message of agent.mailbox) seenMessageIds.add(message.id);\n\t\t\t}\n\t\t\tnextRegistry.restore(restored);\n\t\t\tconst branchRequirements = completionRequirementsFromBranch(ctx.sessionManager.getBranch());\n\t\t\tconst branchOwnsRequirementState =\n\t\t\t\tbranchRequirements.observedState || event.reason === \"fork\" || event.reason === \"new\";\n\t\t\tnextRegistry.reconcileCompletionRequirements(\n\t\t\t\tbranchRequirements.records,\n\t\t\t\tbranchOwnsRequirementState,\n\t\t\t);\n\t\t\tif (branchOwnsRequirementState) {\n\t\t\t\ttry {\n\t\t\t\t\tawait sessionPersistence.save(nextRegistry.list(true));\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (generation === runtimeGeneration && ctx.hasUI) {\n\t\t\t\t\t\tconst reason = error instanceof Error ? error.message : String(error);\n\t\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t\t`Subagent requirement reconciliation could not be persisted yet: ${reason}`,\n\t\t\t\t\t\t\t\"warning\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (generation !== runtimeGeneration) {\n\t\t\t\tsessionBroker.close();\n\t\t\t\tawait sessionPeerBroker.close();\n\t\t\t\tawait modules.lifecycle.disposeStatefulRuntime(nextRegistry, currentWorkspaceManager);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tregistry = nextRegistry;\n\t\t\tpersistence = sessionPersistence;\n\t\t\tcompletionBroker = sessionBroker;\n\t\t\tpeerBroker = sessionPeerBroker;\n\t\t\tfor (const completion of nextRegistry.listPendingCompletions()) {\n\t\t\t\tif (completion.recipientId === \"root\") sessionBroker.enqueue(completion);\n\t\t\t}\n\t\t\truntimeLimits = nextLimits;\n\t\t\tconst sweepEveryMs = Math.max(\n\t\t\t\t1_000,\n\t\t\t\tMath.min(sessionSettings.idleTtlMs ?? 60 * 60 * 1000, 60_000),\n\t\t\t);\n\t\t\tsweepTimer = setInterval(() => {\n\t\t\t\tvoid nextRegistry.sweepExpired().catch((error: unknown) => {\n\t\t\t\t\tif (!ctx.hasUI || generation !== runtimeGeneration) return;\n\t\t\t\t\tconst reason = error instanceof Error ? error.message : String(error);\n\t\t\t\t\tctx.ui.notify(`Subagent expiry cleanup failed: ${reason}`, \"warning\");\n\t\t\t\t});\n\t\t\t}, sweepEveryMs);\n\t\t\tsweepTimer.unref();\n\t\t};\n\t\tconst transition = runtimeTransition.then(initialize, initialize);\n\t\truntimeTransition = transition.catch(() => undefined);\n\t\tawait transition;\n\t});\n\n\tpi.on(\"agent_start\", () => {\n\t\tcompletionBroker?.onParentTurnStart();\n\t});\n\n\tpi.on(\"context\", (event) => {\n\t\tcompletionBroker?.onParentContext(event.messages);\n\t});\n\n\tpi.on(\"agent_settled\", () => {\n\t\tcompletionBroker?.onParentSettled();\n\t});\n\n\tpi.on(\"model_select\", (event) => {\n\t\tparentRuntime.model = event.model;\n\t});\n\n\tpi.on(\"thinking_level_select\", (event) => {\n\t\tparentRuntime.thinkingLevel = normalizeRuntimeThinkingLevel(event.level);\n\t});\n\n\tpi.on(\"session_shutdown\", async (_event, ctx) => {\n\t\truntimeGeneration++;\n\t\tcompletionBroker?.close();\n\t\tcompletionBroker = undefined;\n\t\tconst previousPeerBroker = peerBroker;\n\t\tpeerBroker = undefined;\n\t\tif (sweepTimer) clearInterval(sweepTimer);\n\t\tsweepTimer = undefined;\n\t\tconst previousRegistry = registry;\n\t\tregistry = undefined;\n\t\tpersistence = undefined;\n\t\tisolatedAgents.clear();\n\t\tseenMessageIds.clear();\n\t\tpendingIdempotentSpawns.clear();\n\t\tconst shutdown = async () => {\n\t\t\tawait previousPeerBroker?.close();\n\t\t\tconst currentWorkspaceManager = await getWorkspaceManager();\n\t\t\tconst { disposeStatefulRuntime } = await import(\"./stateful-lifecycle.js\");\n\t\t\tconst errors = await disposeStatefulRuntime(previousRegistry, currentWorkspaceManager);\n\t\t\tif (errors.length > 0 && ctx.hasUI) {\n\t\t\t\tctx.ui.notify(`Subagent shutdown cleanup reported ${errors.length} error(s).`, \"warning\");\n\t\t\t}\n\t\t};\n\t\tconst transition = runtimeTransition.then(shutdown, shutdown);\n\t\truntimeTransition = transition.catch(() => undefined);\n\t\tawait transition;\n\t});\n\n\tconst spawnTool = defineTool({\n\t\tname: \"subagent_spawn\",\n\t\tlabel: \"Spawn Subagent\",\n\t\tdescription:\n\t\t\t\"Start an addressable background subagent with an opaque agentId and canonical taskPath, an optional thinking level and execution budgets chosen for the task difficulty, and asynchronous completion delivery. The current bounded capacity, completion policy, working-directory policy, and available agent definitions are published in the pi-subagents session-guidance message. Working-directory policy controls launch targets and protected project resources, not filesystem access or sandboxing.\",\n\t\tpromptSnippet: \"Start a reusable detached subagent; completion is delivered asynchronously\",\n\t\tpromptGuidelines: createSpawnPromptGuidelines(blockingEnabled),\n\t\tparameters: grammarSafeToolObject({\n\t\t\tagent: Type.String({ minLength: 1 }),\n\t\t\ttaskName: Type.Optional(\n\t\t\t\tType.String({\n\t\t\t\t\tminLength: 1,\n\t\t\t\t\tmaxLength: MAX_TASK_NAME_LENGTH,\n\t\t\t\t\tpattern: \"^[a-z0-9_]+$\",\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t\"Canonical path segment for this task; use lowercase letters, digits, and underscores.\",\n\t\t\t\t}),\n\t\t\t),\n\t\t\ttask: Type.String({ minLength: 1, maxLength: DEFAULT_MAX_CONTEXT_BYTES }),\n\t\t\tthinkingLevel: Type.Optional(StatefulThinkingLevelSchema),\n\t\t\ttimeoutMs: Type.Optional(StatefulTimeoutSchema),\n\t\t\t...StatefulTurnLimitFields,\n\t\t\tcwd: Type.Optional(Type.String()),\n\t\t\tagentScope: Type.Optional(ScopeSchema),\n\t\t\tconfirmProjectAgents: Type.Optional(Type.Boolean({ default: true })),\n\t\t\tcontext: Type.Optional(ContextModeSchema),\n\t\t\tcontextEntryIds: Type.Optional(\n\t\t\t\tType.Array(Type.String(), { description: \"Optional selected session entry IDs.\" }),\n\t\t\t),\n\t\t\tparentId: Type.Optional(\n\t\t\t\tType.String({ description: \"Optional parent agent ID or canonical task path.\" }),\n\t\t\t),\n\t\t\tallowConcurrentWrites: Type.Optional(\n\t\t\t\tType.Boolean({\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t\"Deprecated compatibility field; shared-workspace concurrency is allowed by default.\",\n\t\t\t\t}),\n\t\t\t),\n\t\t\tworkspaceMode: Type.Optional(\n\t\t\t\tStringEnum([\"shared\", \"worktree\"] as const, {\n\t\t\t\t\tdescription: \"Use the shared workspace (default) or an opt-in disposable Git worktree.\",\n\t\t\t\t}),\n\t\t\t),\n\t\t\tcontract: Type.Optional(DelegationContractSchema),\n\t\t\tidempotencyKey: Type.Optional(\n\t\t\t\tType.String({\n\t\t\t\t\tminLength: 1,\n\t\t\t\t\tmaxLength: MAX_SPAWN_IDEMPOTENCY_KEY_LENGTH,\n\t\t\t\t\tdescription: \"Reuse the same retained agent for an exact accepted spawn retry.\",\n\t\t\t\t}),\n\t\t\t),\n\t\t\tresultFormat: Type.Optional(\n\t\t\t\tStringEnum(SUBAGENT_RESULT_FORMATS, {\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t\"Use text (default), structured-v1, or the evidence-preserving structured-v2 completion contract.\",\n\t\t\t\t}),\n\t\t\t),\n\t\t\tcompletionRequirement: Type.Optional(CompletionRequirementModeSchema),\n\t\t}),\n\t\t...createStatefulToolRenderer(\"spawn\"),\n\t\tasync execute(_id, params, signal, _update, ctx) {\n\t\t\tconst generation = runtimeGeneration;\n\t\t\tconst capturedRegistry = registry;\n\t\t\tlet modules: StatefulSpawnModules;\n\t\t\ttry {\n\t\t\t\tmodules = await loadStatefulSpawnModules();\n\t\t\t} catch (error) {\n\t\t\t\tassertCurrentSpawn(signal, generation, runtimeGeneration);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tassertCurrentSpawn(signal, generation, runtimeGeneration);\n\t\t\tlet currentWorkspaceManager: WorkspaceManager;\n\t\t\ttry {\n\t\t\t\tcurrentWorkspaceManager = await getWorkspaceManager();\n\t\t\t} catch (error) {\n\t\t\t\tassertCurrentSpawn(signal, generation, runtimeGeneration);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tassertCurrentSpawn(signal, generation, runtimeGeneration);\n\t\t\tconst scope = (params.agentScope ?? \"user\") as AgentScope;\n\t\t\tconst resultFormat = (params.resultFormat ?? \"text\") as SubagentResultFormat;\n\t\t\tconst contract = modules.delegationContract.normalizeDelegationContract(params.contract);\n\t\t\tif (params.contract !== undefined && !contract) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"subagent_spawn contract must be a valid pi-subagents:delegation:v2 object\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tmodules.runtimePolicy.assertSubagentDepthAllowed();\n\t\t\tassertSpawnIdempotencyKey(params.idempotencyKey);\n\t\t\tconst currentSettings = getCurrentSettings();\n\t\t\tconst target = modules.cwdPolicy.resolveSubagentTarget({\n\t\t\t\tworkspace: ctx.cwd,\n\t\t\t\trequestedCwd: params.cwd,\n\t\t\t\tcurrentProjectTrusted: ctx.isProjectTrusted(),\n\t\t\t});\n\t\t\tmodules.cwdPolicy.assertDelegationTargetAllowed(\n\t\t\t\ttarget,\n\t\t\t\tcurrentSettings?.cwdPolicy?.delegation ?? DEFAULT_DELEGATION_CWD_POLICY,\n\t\t\t);\n\t\t\tconst cwd = target.cwd;\n\t\t\tconst mode = resolveSpawnContextMode(params.context, params.contextEntryIds);\n\t\t\tconst snapshot = modules.context.buildContextSnapshot(\n\t\t\t\tctx.sessionManager.getBranch(),\n\t\t\t\tmode,\n\t\t\t\tDEFAULT_MAX_CONTEXT_BYTES,\n\t\t\t\tparams.contextEntryIds,\n\t\t\t);\n\t\t\tif ((scope === \"project\" || scope === \"both\") && !ctx.isProjectTrusted()) {\n\t\t\t\tthrow new Error(\"Project-local subagent definitions require a trusted project\");\n\t\t\t}\n\t\t\tconst resolvedAgents = modules.agents.discoverAgents(cwd, scope, currentSettings).agents;\n\t\t\tconst resolvedAgent = resolvedAgents.find((agent) => agent.name === params.agent);\n\t\t\tif (!resolvedAgent) {\n\t\t\t\tconst available = resolvedAgents.map((agent) => agent.name).join(\", \") || \"none\";\n\t\t\t\tthrow new Error(`Unknown subagent ${params.agent}. Available agents: ${available}`);\n\t\t\t}\n\t\t\tconst targetSnapshot = modules.cwdPolicy.targetPolicyAudit(target);\n\t\t\tconst { executionPlan, semanticSnapshot } =\n\t\t\t\tawait modules.retainedSemanticState.buildRetainedSemanticState({\n\t\t\t\t\tagent: resolvedAgent,\n\t\t\t\t\tcontract,\n\t\t\t\t\ttarget: targetSnapshot,\n\t\t\t\t\tcwd,\n\t\t\t\t\tworkspaceMode: params.workspaceMode === \"worktree\" ? \"worktree\" : \"shared\",\n\t\t\t\t\ttransport: transportKind,\n\t\t\t\t\tresultFormat,\n\t\t\t\t\tthinkingLevel: params.thinkingLevel,\n\t\t\t\t\ttimeoutMs: params.timeoutMs,\n\t\t\t\t\ttaskGeneration: 1,\n\t\t\t\t});\n\t\t\tassertCurrentSpawn(signal, generation, runtimeGeneration);\n\t\t\tconst requestHash = modules.spawnIdempotency.hashSpawnRequest({\n\t\t\t\tagent: params.agent,\n\t\t\t\ttaskName: params.taskName,\n\t\t\t\ttask: params.task,\n\t\t\t\tcwd,\n\t\t\t\tagentScope: scope,\n\t\t\t\tthinkingLevel: params.thinkingLevel,\n\t\t\t\ttimeoutMs: params.timeoutMs,\n\t\t\t\tidleTimeoutMs: params.idleTimeoutMs,\n\t\t\t\tmaxTurns: params.maxTurns,\n\t\t\t\tmaxToolCalls: params.maxToolCalls,\n\t\t\t\tparentId: params.parentId,\n\t\t\t\tcontext: snapshot.text || undefined,\n\t\t\t\tcontextSourceIds: snapshot.sourceIds,\n\t\t\t\tworkspaceMode: params.workspaceMode ?? \"shared\",\n\t\t\t\tallowConcurrentWrites: params.allowConcurrentWrites ?? false,\n\t\t\t\tcontract,\n\t\t\t\tresultFormat,\n\t\t\t\tcompletionRequirement: params.completionRequirement ?? \"background\",\n\t\t\t});\n\t\t\tif (!capturedRegistry) {\n\t\t\t\tthrow new Error(\"Stateful subagents are not initialized for this session\");\n\t\t\t}\n\t\t\tconst ownedRegistry = capturedRegistry;\n\t\t\tconst retained = ownedRegistry.findBySpawnIdempotencyKey(params.idempotencyKey, requestHash);\n\t\t\tif (retained) return result(retained, `Reused ${retained.agent} as ${retained.id}.`);\n\t\t\tconst foundPending = params.idempotencyKey\n\t\t\t\t? pendingIdempotentSpawns.get(params.idempotencyKey)\n\t\t\t\t: undefined;\n\t\t\tif (\n\t\t\t\tparams.idempotencyKey &&\n\t\t\t\tfoundPending &&\n\t\t\t\tfoundPending.generation !== generation &&\n\t\t\t\tpendingIdempotentSpawns.get(params.idempotencyKey) === foundPending\n\t\t\t) {\n\t\t\t\tpendingIdempotentSpawns.delete(params.idempotencyKey);\n\t\t\t}\n\t\t\tconst pending = foundPending?.generation === generation ? foundPending : undefined;\n\t\t\tif (pending) {\n\t\t\t\tif (pending.requestHash !== requestHash) {\n\t\t\t\t\tthrow new Error(\"The subagent_spawn idempotencyKey is pending with different parameters\");\n\t\t\t\t}\n\t\t\t\tconst agent = await waitForOwnedSpawn(pending.promise, signal);\n\t\t\t\tassertCurrentSpawn(signal, generation, runtimeGeneration);\n\t\t\t\treturn result(agent, `Reused ${agent.agent} as ${agent.id}.`);\n\t\t\t}\n\t\t\tlet resolvePending: ((agent: ManagedAgent) => void) | undefined;\n\t\t\tlet rejectPending: ((error: unknown) => void) | undefined;\n\t\t\tlet ownedPending: PendingIdempotentSpawn | undefined;\n\t\t\tif (params.idempotencyKey) {\n\t\t\t\tconst promise = new Promise<ManagedAgent>((resolve, reject) => {\n\t\t\t\t\tresolvePending = resolve;\n\t\t\t\t\trejectPending = reject;\n\t\t\t\t});\n\t\t\t\tvoid promise.catch(() => undefined);\n\t\t\t\townedPending = { generation, requestHash, promise };\n\t\t\t\tpendingIdempotentSpawns.set(params.idempotencyKey, ownedPending);\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait confirmProjectAgent(\n\t\t\t\t\tparams.agent,\n\t\t\t\t\tscope,\n\t\t\t\t\tparams.confirmProjectAgents ?? true,\n\t\t\t\t\tctx,\n\t\t\t\t\tcwd,\n\t\t\t\t\tcurrentSettings,\n\t\t\t\t);\n\t\t\t\tassertCurrentSpawn(signal, generation, runtimeGeneration);\n\t\t\t\tif (params.workspaceMode === \"worktree\" && resolvedAgent.source === \"project\") {\n\t\t\t\t\tthrow new Error(\"Project-local subagent definitions cannot run in a detached worktree\");\n\t\t\t\t}\n\t\t\t\tconst requestedCwd = cwd;\n\t\t\t\tconst workspaceOwner = `pending-${randomUUID()}`;\n\t\t\t\tconst workspace =\n\t\t\t\t\tparams.workspaceMode === \"worktree\"\n\t\t\t\t\t\t? await currentWorkspaceManager.create(workspaceOwner, requestedCwd)\n\t\t\t\t\t\t: undefined;\n\t\t\t\ttry {\n\t\t\t\t\tassertCurrentSpawn(signal, generation, runtimeGeneration);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (workspace) await currentWorkspaceManager.cleanup(workspaceOwner);\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\tlet agent: ManagedAgent | undefined;\n\t\t\t\ttry {\n\t\t\t\t\tconst capabilityGrant = modules.capabilityGrant.issueCapabilityGrant(\n\t\t\t\t\t\texecutionPlan,\n\t\t\t\t\t\tDate.now(),\n\t\t\t\t\t\tMath.max(1, (params.timeoutMs ?? resolvedAgent.timeoutMs ?? 600_000) + 60_000),\n\t\t\t\t\t);\n\t\t\t\t\tagent = await ownedRegistry.spawn({\n\t\t\t\t\t\tagent: params.agent,\n\t\t\t\t\t\ttaskName: params.taskName,\n\t\t\t\t\t\ttask: params.task,\n\t\t\t\t\t\tcwd: workspace?.path ?? requestedCwd,\n\t\t\t\t\t\tagentScope: scope,\n\t\t\t\t\t\tthinkingLevel: params.thinkingLevel,\n\t\t\t\t\t\ttimeoutMs: params.timeoutMs,\n\t\t\t\t\t\tidleTimeoutMs: params.idleTimeoutMs,\n\t\t\t\t\t\tmaxTurns: params.maxTurns,\n\t\t\t\t\t\tmaxToolCalls: params.maxToolCalls,\n\t\t\t\t\t\tparentId: params.parentId,\n\t\t\t\t\t\tcontext: snapshot.text || undefined,\n\t\t\t\t\t\tcontextSourceIds: snapshot.sourceIds,\n\t\t\t\t\t\tcontextTruncated: snapshot.truncated,\n\t\t\t\t\t\tcontextTurns: snapshot.turns,\n\t\t\t\t\t\tcontextBytes: Buffer.byteLength(snapshot.text, \"utf8\"),\n\t\t\t\t\t\tworkspaceMode: workspace ? \"worktree\" : undefined,\n\t\t\t\t\t\tspawnIdempotencyKey: params.idempotencyKey,\n\t\t\t\t\t\tspawnRequestHash: params.idempotencyKey ? requestHash : undefined,\n\t\t\t\t\t\tcontract,\n\t\t\t\t\t\tresultFormat: resultFormat === \"text\" ? undefined : resultFormat,\n\t\t\t\t\t\tcompletionRequirement: params.completionRequirement ?? \"background\",\n\t\t\t\t\t\texecutionPlan,\n\t\t\t\t\t\tcapabilityGrant,\n\t\t\t\t\t\tsemanticSnapshot,\n\t\t\t\t\t\tsemanticCompatibility: { status: \"compatible\", changedComponents: [] },\n\t\t\t\t\t\ttarget: targetSnapshot,\n\t\t\t\t\t});\n\t\t\t\t\tassertCurrentSpawn(signal, generation, runtimeGeneration);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (agent) await ownedRegistry.closeTree(agent.id).catch(() => undefined);\n\t\t\t\t\tif (workspace) await currentWorkspaceManager.cleanup(workspaceOwner);\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\tif (!agent) throw new Error(\"Subagent spawn completed without a retained agent\");\n\t\t\t\tif (workspace && agent.cwd === workspace.path) isolatedAgents.set(agent.id, workspaceOwner);\n\t\t\t\telse if (workspace) await currentWorkspaceManager.cleanup(workspaceOwner);\n\t\t\t\tassertCurrentSpawn(signal, generation, runtimeGeneration);\n\t\t\t\tresolvePending?.(agent);\n\t\t\t\tconst deliveryNote =\n\t\t\t\t\tcompletionDelivery === \"auto-resume\"\n\t\t\t\t\t\t? \"Auto-resume steers completions into active parent work or requests synthesis when idle. Treat this response as progress, not final synthesis, until every final-answer-required completion message is visible. If local work is exhausted while required children remain active, emit at most one brief progress sentence and end the turn; do not repeat waiting updates or use the requested final format, verdict, or conclusion. Do not redo a running child's assigned work.\"\n\t\t\t\t\t\t: \"The current response must not depend on the result because next-turn delivery will not wake an idle root.\";\n\t\t\t\tconst requirementNote =\n\t\t\t\t\tparams.completionRequirement === \"required\"\n\t\t\t\t\t\t? \"This exact run is runtime-tracked as required until its completion becomes visible or reaches an explicit terminal state. Current Pi versions still cannot prevent already-streamed premature output.\"\n\t\t\t\t\t\t: \"This run is background work and does not block the parent final answer.\";\n\t\t\t\treturn result(\n\t\t\t\t\tagent,\n\t\t\t\t\t`Spawned ${agent.agent} as ${agent.taskPath ?? agent.id} (${agent.id}). ${requirementNote} Continue the identified non-overlapping local work immediately; do not merely announce the spawn or end while useful local work remains. Only an explicit user-requested specialist model, tool-profile, or isolation exception may lack concurrent local work. ${deliveryNote} Do not poll for progress.`,\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\trejectPending?.(error);\n\t\t\t\tthrow error;\n\t\t\t} finally {\n\t\t\t\tif (\n\t\t\t\t\tparams.idempotencyKey &&\n\t\t\t\t\townedPending &&\n\t\t\t\t\tpendingIdempotentSpawns.get(params.idempotencyKey) === ownedPending\n\t\t\t\t) {\n\t\t\t\t\tpendingIdempotentSpawns.delete(params.idempotencyKey);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t});\n\tpi.registerTool(spawnTool);\n\n\tpi.registerTool({\n\t\tname: \"subagent_send\",\n\t\tlabel: \"Send Subagent Follow-up\",\n\t\tdescription:\n\t\t\t\"Send follow-up work to a reusable retained subagent and start a new turn. Semantic resource skew requires explicit revalidation. Use subagent_mailbox for queue-only messages.\",\n\t\tpromptSnippet: \"Start a new detached follow-up turn on a retained subagent\",\n\t\tparameters: Type.Object({\n\t\t\tagentId: Type.String({ description: \"Retained agent ID or canonical task path.\" }),\n\t\t\ttask: Type.String({ minLength: 1, maxLength: DEFAULT_MAX_CONTEXT_BYTES }),\n\t\t\ttimeoutMs: Type.Optional(\n\t\t\t\tType.Integer({\n\t\t\t\t\tminimum: 1,\n\t\t\t\t\tmaximum: MAX_SUBAGENT_TIMEOUT_MS,\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t\"Optional work deadline for this follow-up turn. On expiry, Pi aborts the work and makes one separately bounded summary attempt.\",\n\t\t\t\t}),\n\t\t\t),\n\t\t\t...StatefulTurnLimitFields,\n\t\t\tcompletionRequirement: Type.Optional(CompletionRequirementModeSchema),\n\t\t\trevalidate: Type.Optional(\n\t\t\t\tType.Boolean({\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t\"Accept the current semantic resource snapshot after a reported mismatch before starting this follow-up.\",\n\t\t\t\t}),\n\t\t\t),\n\t\t\tallowConcurrentWrites: Type.Optional(\n\t\t\t\tType.Boolean({\n\t\t\t\t\tdescription:\n\t\t\t\t\t\t\"Deprecated compatibility field; shared-workspace concurrency is allowed by default.\",\n\t\t\t\t}),\n\t\t\t),\n\t\t}),\n\t\t...createStatefulToolRenderer(\"send\"),\n\t\tasync execute(_id, params, signal, _update, ctx) {\n\t\t\tconst generation = runtimeGeneration;\n\t\t\tconst ownedRegistry = requireRegistry();\n\t\t\tlet modules: StatefulSpawnModules;\n\t\t\ttry {\n\t\t\t\tmodules = await loadStatefulSpawnModules();\n\t\t\t} catch (error) {\n\t\t\t\tassertCurrentSpawn(signal, generation, runtimeGeneration);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tassertCurrentSpawn(signal, generation, runtimeGeneration);\n\t\t\tconst currentSettings = getCurrentSettings();\n\t\t\tconst existing = ownedRegistry.get(params.agentId);\n\t\t\tif (!existing) throw new Error(`Unknown subagent: ${params.agentId}`);\n\t\t\tconst currentAgent = modules.agents\n\t\t\t\t.discoverAgents(existing.cwd, existing.agentScope ?? \"user\", currentSettings)\n\t\t\t\t.agents.find((agent) => agent.name === existing.agent);\n\t\t\tif (!currentAgent) throw new Error(`Unknown retained subagent definition: ${existing.agent}`);\n\t\t\tconst resolvedFollowUpTarget =\n\t\t\t\texisting.workspaceMode === \"worktree\"\n\t\t\t\t\t? undefined\n\t\t\t\t\t: modules.cwdPolicy.resolveSubagentTarget({\n\t\t\t\t\t\t\tworkspace: ctx.cwd,\n\t\t\t\t\t\t\trequestedCwd: existing.cwd,\n\t\t\t\t\t\t\tcurrentProjectTrusted: ctx.isProjectTrusted(),\n\t\t\t\t\t\t});\n\t\t\tif (resolvedFollowUpTarget) {\n\t\t\t\tmodules.cwdPolicy.assertDelegationTargetAllowed(\n\t\t\t\t\tresolvedFollowUpTarget,\n\t\t\t\t\tcurrentSettings?.cwdPolicy?.delegation ?? DEFAULT_DELEGATION_CWD_POLICY,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (existing.workspaceMode === \"worktree\" && !existing.target) {\n\t\t\t\tthrow new Error(\"Retained worktree is missing its trusted target snapshot\");\n\t\t\t}\n\t\t\tconst currentTarget =\n\t\t\t\texisting.workspaceMode === \"worktree\" && existing.target\n\t\t\t\t\t? existing.target\n\t\t\t\t\t: modules.cwdPolicy.targetPolicyAudit(\n\t\t\t\t\t\t\tresolvedFollowUpTarget as NonNullable<typeof resolvedFollowUpTarget>,\n\t\t\t\t\t\t);\n\t\t\tconst { executionPlan: currentPlan, semanticSnapshot: currentSnapshot } =\n\t\t\t\tawait modules.retainedSemanticState.buildRetainedSemanticState({\n\t\t\t\t\tagent: currentAgent,\n\t\t\t\t\tcontract: existing.contract,\n\t\t\t\t\ttarget: currentTarget,\n\t\t\t\t\tcwd: existing.cwd,\n\t\t\t\t\tworkspaceMode: existing.workspaceMode === \"worktree\" ? \"worktree\" : \"shared\",\n\t\t\t\t\ttransport: transportKind,\n\t\t\t\t\tresultFormat: existing.resultFormat ?? \"text\",\n\t\t\t\t\tthinkingLevel: existing.thinkingLevel,\n\t\t\t\t\ttimeoutMs: params.timeoutMs ?? existing.timeoutMs,\n\t\t\t\t\ttaskGeneration: (existing.executionPlan?.taskGeneration ?? 0) + 1,\n\t\t\t\t\tcancellationLineage: [\n\t\t\t\t\t\t...(existing.executionPlan?.cancellationLineage ?? []),\n\t\t\t\t\t\t...(existing.state === \"interrupted\" && existing.executionPlan?.id\n\t\t\t\t\t\t\t? [existing.executionPlan.id]\n\t\t\t\t\t\t\t: []),\n\t\t\t\t\t],\n\t\t\t\t});\n\t\t\tassertCurrentSpawn(signal, generation, runtimeGeneration);\n\t\t\tconst compatibility = existing.semanticSnapshot\n\t\t\t\t? modules.semanticSnapshot.evaluateSemanticCompatibility(\n\t\t\t\t\t\texisting.semanticSnapshot,\n\t\t\t\t\t\tcurrentSnapshot,\n\t\t\t\t\t)\n\t\t\t\t: { status: \"warning\" as const, changedComponents: [\"legacy-missing-snapshot\"] };\n\t\t\tif (\n\t\t\t\t(compatibility.status === \"needs-revalidation\" || compatibility.status === \"rejected\") &&\n\t\t\t\tparams.revalidate !== true\n\t\t\t) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Subagent semantic resources changed; retry with revalidate: true after reviewing: ${compatibility.changedComponents.join(\", \")}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait confirmProjectAgent(\n\t\t\t\texisting.agent,\n\t\t\t\texisting.agentScope ?? \"user\",\n\t\t\t\tfalse,\n\t\t\t\tctx,\n\t\t\t\texisting.cwd,\n\t\t\t\tcurrentSettings,\n\t\t\t);\n\t\t\tassertCurrentSpawn(signal, generation, runtimeGeneration);\n\t\t\tconst currentGrant = modules.capabilityGrant.issueCapabilityGrant(\n\t\t\t\tcurrentPlan,\n\t\t\t\tDate.now(),\n\t\t\t\tMath.max(1, (params.timeoutMs ?? existing.timeoutMs ?? 600_000) + 60_000),\n\t\t\t);\n\t\t\tawait ownedRegistry.updateSemanticState(\n\t\t\t\texisting.id,\n\t\t\t\tcurrentPlan,\n\t\t\t\tcurrentGrant,\n\t\t\t\tcurrentSnapshot,\n\t\t\t\tparams.revalidate === true && compatibility.status !== \"compatible\"\n\t\t\t\t\t? { status: \"warning\", changedComponents: compatibility.changedComponents }\n\t\t\t\t\t: compatibility,\n\t\t\t);\n\t\t\tassertCurrentSpawn(signal, generation, runtimeGeneration);\n\t\t\tconst agent = await ownedRegistry.followUp(params.agentId, params.task, {\n\t\t\t\ttimeoutMs: params.timeoutMs,\n\t\t\t\tidleTimeoutMs: params.idleTimeoutMs,\n\t\t\t\tmaxTurns: params.maxTurns,\n\t\t\t\tmaxToolCalls: params.maxToolCalls,\n\t\t\t\tcompletionRequirement: params.completionRequirement ?? \"background\",\n\t\t\t});\n\t\t\tassertCurrentSpawn(signal, generation, runtimeGeneration);\n\t\t\treturn result(agent, `Started follow-up for ${agent.id}.`);\n\t\t},\n\t});\n\n\tif (blockingEnabled) {\n\t\tpi.registerTool({\n\t\t\tname: \"subagent_await\",\n\t\t\tlabel: \"Await Subagent\",\n\t\t\tdescription:\n\t\t\t\t\"Wait for one retained subagent's current turn to settle and return its latest bounded output. This blocks Pi from processing queued steering until the wait finishes. A wait timeout or caller cancellation stops only the wait and never interrupts or closes the subagent; use subagent_manage for lifecycle changes. Automatic completion delivery remains active and may later repeat the same at-least-once completion.\",\n\t\t\tpromptSnippet:\n\t\t\t\t\"Intentionally block until one retained subagent settles or the wait times out\",\n\t\t\tpromptGuidelines: [\n\t\t\t\t\"Use subagent_await only when the retained result is required before the next action, useful overlapping main-agent work is complete, and blocking Pi is intentional.\",\n\t\t\t\t\"Do not repeatedly call subagent_await after a timeout; the subagent keeps running and completion delivery remains active. Use subagent_manage only when the user wants to interrupt or close it.\",\n\t\t\t],\n\t\t\tparameters: SubagentAwaitParams,\n\t\t\t...createStatefulToolRenderer(\"await\"),\n\t\t\tasync execute(_id, params, signal): Promise<StatefulActionToolResult> {\n\t\t\t\tconst generation = runtimeGeneration;\n\t\t\t\tconst timeoutMs = params.timeoutMs ?? DEFAULT_SUBAGENT_AWAIT_TIMEOUT_MS;\n\t\t\t\tconst waited = await requireRegistry().wait(params.agentId, timeoutMs, signal);\n\t\t\t\tassertCurrentSpawn(signal, generation, runtimeGeneration);\n\t\t\t\treturn awaitResult(waited.agent, waited.timedOut, timeoutMs);\n\t\t\t},\n\t\t});\n\t}\n\n\tpi.registerTool({\n\t\tname: \"subagent_manage\",\n\t\tlabel: \"Manage Subagents\",\n\t\tdescription:\n\t\t\t\"Interrupt active work while keeping an agent reusable, or close agents and release their resources. Use subagent_inspect for every read-only list, detail, status, and diagnostic operation.\",\n\t\tpromptSnippet: \"Interrupt or close retained detached subagents\",\n\t\tparameters: ManageParamsSchema,\n\t\t...createStatefulToolRenderer(\"manage\"),\n\t\tasync execute(_id, params, signal): Promise<StatefulActionToolResult> {\n\t\t\tconst generation = runtimeGeneration;\n\t\t\tconst ownedRegistry = requireRegistry();\n\t\t\tlet currentWorkspaceManager: WorkspaceManager;\n\t\t\ttry {\n\t\t\t\tcurrentWorkspaceManager = await getWorkspaceManager();\n\t\t\t} catch (error) {\n\t\t\t\tassertCurrentSpawn(signal, generation, runtimeGeneration);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tassertCurrentSpawn(signal, generation, runtimeGeneration);\n\t\t\tconst ownedAgent = (agentId: string): ManagedAgent => {\n\t\t\t\tconst value = ownedRegistry.get(agentId);\n\t\t\t\tif (!value) throw new Error(`Unknown subagent: ${agentId}`);\n\t\t\t\treturn value;\n\t\t\t};\n\t\t\tconst operation = validateManageParams(params);\n\t\t\tconst agentId = operation.agentId;\n\t\t\tif (operation.action === \"interrupt\") {\n\t\t\t\tif (operation.subtree) {\n\t\t\t\t\tconst agents = await ownedRegistry.interruptTree(agentId);\n\t\t\t\t\tassertCurrentSpawn(signal, generation, runtimeGeneration);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: `Interrupted ${agents.length} active agent(s).` }],\n\t\t\t\t\t\tdetails: {\n\t\t\t\t\t\t\tagent: summarizeStatefulAgent(ownedAgent(agentId)),\n\t\t\t\t\t\t\tagents: agents.map(summarizeStatefulAgent),\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst agent = await ownedRegistry.interrupt(agentId);\n\t\t\t\tassertCurrentSpawn(signal, generation, runtimeGeneration);\n\t\t\t\treturn result(agent, `Interrupted ${agent.id}; it remains reusable.`);\n\t\t\t}\n\t\t\tconst existing = ownedRegistry.get(agentId);\n\t\t\tif (existing?.state === \"closed\" && !operation.subtree) {\n\t\t\t\tconst pendingOwner = isolatedAgents.get(existing.id);\n\t\t\t\tif (pendingOwner) await currentWorkspaceManager.cleanup(pendingOwner);\n\t\t\t\tassertCurrentSpawn(signal, generation, runtimeGeneration);\n\t\t\t\tisolatedAgents.delete(existing.id);\n\t\t\t\treturn result(existing, `Closed ${existing.id}.`);\n\t\t\t}\n\t\t\tif (operation.subtree) {\n\t\t\t\tlet agents: ManagedAgent[];\n\t\t\t\ttry {\n\t\t\t\t\tagents = await ownedRegistry.closeTree(agentId);\n\t\t\t\t} finally {\n\t\t\t\t\tawait cleanupClosedWorkspaces(ownedRegistry, isolatedAgents, currentWorkspaceManager);\n\t\t\t\t}\n\t\t\t\tassertCurrentSpawn(signal, generation, runtimeGeneration);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: `Closed ${agents.length} agent(s).` }],\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\tagent: summarizeStatefulAgent(ownedAgent(agentId)),\n\t\t\t\t\t\tagents: agents.map(summarizeStatefulAgent),\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t\tlet agent: ManagedAgent;\n\t\t\ttry {\n\t\t\t\tagent = await ownedRegistry.close(agentId);\n\t\t\t} finally {\n\t\t\t\tawait cleanupClosedWorkspaces(ownedRegistry, isolatedAgents, currentWorkspaceManager);\n\t\t\t}\n\t\t\tassertCurrentSpawn(signal, generation, runtimeGeneration);\n\t\t\treturn result(agent, `Closed ${agent.id}.`);\n\t\t},\n\t});\n\n\tpi.registerTool({\n\t\tname: \"subagent_mailbox\",\n\t\tlabel: \"Subagent Mailbox\",\n\t\tdescription:\n\t\t\t\"Queue a bounded message without starting a turn, or read unread mailbox messages. Read acknowledges returned messages by default; use subagent_inspect for metadata-only unread counts.\",\n\t\tpromptSnippet: \"Send or read queue-only detached-subagent mailbox messages\",\n\t\tparameters: MailboxParamsSchema,\n\t\t...createStatefulToolRenderer(\"mailbox\"),\n\t\tasync execute(_id, params, signal): Promise<StatefulActionToolResult> {\n\t\t\tconst generation = runtimeGeneration;\n\t\t\tconst ownedRegistry = requireRegistry();\n\t\t\tconst operation = validateMailboxParams(params);\n\t\t\tif (operation.action === \"send\") {\n\t\t\t\tconst message = await ownedRegistry.sendMessage(\n\t\t\t\t\toperation.agentId,\n\t\t\t\t\toperation.message,\n\t\t\t\t\toperation.senderId,\n\t\t\t\t\toperation.deduplicationKey,\n\t\t\t\t);\n\t\t\t\tassertCurrentSpawn(signal, generation, runtimeGeneration);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: `Queued ${message.id} for ${message.recipientId}.` }],\n\t\t\t\t\tdetails: { message },\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst messages = await ownedRegistry.readMessages(\n\t\t\t\toperation.agentId,\n\t\t\t\toperation.acknowledge,\n\t\t\t\toperation.limit,\n\t\t\t);\n\t\t\tassertCurrentSpawn(signal, generation, runtimeGeneration);\n\t\t\tconst summaries = messages.map((message) => ({\n\t\t\t\t...message,\n\t\t\t\tcontent: truncateUtf8(message.content, MAX_TOOL_MESSAGE_BYTES).text,\n\t\t\t}));\n\t\t\tconst text = summaries.length\n\t\t\t\t? summaries\n\t\t\t\t\t\t.map((message) => `${message.id} from ${message.senderId}: ${message.content}`)\n\t\t\t\t\t\t.join(\"\\n\")\n\t\t\t\t: \"No unread messages.\";\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: truncateUtf8(text, DEFAULT_MAX_CONTEXT_BYTES).text }],\n\t\t\t\tdetails: { messages: summaries },\n\t\t\t};\n\t\t},\n\t});\n\n\treturn controller;\n}\n\nfunction normalizeContextMode(value: \"none\" | \"all\" | \"summary\" | number | undefined): ContextMode {\n\tif (value === undefined) return \"none\";\n\tif (value === \"none\" || value === \"all\" || value === \"summary\") return value;\n\treturn Math.max(1, Math.floor(value));\n}\n\nexport function resolveSpawnContextMode(\n\tvalue: \"none\" | \"all\" | \"summary\" | number | undefined,\n\tcontextEntryIds: readonly string[] | undefined,\n): ContextMode {\n\tif (value === undefined && contextEntryIds !== undefined) return \"all\";\n\treturn normalizeContextMode(value);\n}\n\nasync function cleanupClosedWorkspaces(\n\tregistry: AgentRegistry,\n\tisolatedAgents: Map<string, string>,\n\tworkspaceManager: WorkspaceManager,\n): Promise<void> {\n\tfor (const [agentId, owner] of [...isolatedAgents]) {\n\t\tif (registry.get(agentId)?.state !== \"closed\") continue;\n\t\tawait workspaceManager.cleanup(owner);\n\t\tisolatedAgents.delete(agentId);\n\t}\n}\n\nfunction result(agent: ManagedAgent, text: string) {\n\treturn {\n\t\tcontent: [{ type: \"text\" as const, text }],\n\t\tdetails: { agent: summarizeStatefulAgent(agent) },\n\t};\n}\n\nfunction awaitResult(agent: ManagedAgent, timedOut: boolean, timeoutMs: number) {\n\tconst latestTurn = agent.history.at(-1);\n\tconst output = timedOut\n\t\t? \"\"\n\t\t: truncateUtf8(latestTurn?.output ?? \"\", DEFAULT_MAX_CONTEXT_BYTES).text;\n\tconst error = timedOut ? \"\" : truncateUtf8(agent.error ?? \"\", MAX_TOOL_MESSAGE_BYTES).text;\n\tconst text = timedOut\n\t\t? `Stopped waiting for ${agent.taskPath ?? agent.id} after ${timeoutMs}ms; it remains ${agent.state}. The wait did not interrupt or close the subagent.`\n\t\t: [`Subagent ${agent.taskPath ?? agent.id} settled as ${agent.state}.`, output || error]\n\t\t\t\t.filter(Boolean)\n\t\t\t\t.join(\"\\n\\n\");\n\treturn {\n\t\tcontent: [\n\t\t\t{\n\t\t\t\ttype: \"text\" as const,\n\t\t\t\ttext: truncateUtf8(text, DEFAULT_MAX_CONTEXT_BYTES).text,\n\t\t\t},\n\t\t],\n\t\tdetails: {\n\t\t\tagent: summarizeStatefulAgent(agent),\n\t\t\ttimedOut,\n\t\t\ttimeoutMs,\n\t\t\t...(output ? { output } : {}),\n\t\t\t...(error ? { error } : {}),\n\t\t},\n\t};\n}\n\nfunction normalizeRuntimeThinkingLevel(value: string): ParentRuntimeSnapshot[\"thinkingLevel\"] {\n\treturn isThinkingLevel(value) ? value : \"off\";\n}\n", "export function createSpawnPromptGuidelines(blockingEnabled = true): string[] {\n\treturn [\n\t\t\"Do not use subagent_spawn for simple or critical-path work that the main agent can perform directly. The main agent retains overall planning, immediate critical-path work, integration, final verification, and the final answer.\",\n\t\t\"Before one ordinary subagent_spawn, identify concrete useful non-overlapping main-agent work you can start immediately and a supported completion integration path. If none exists, perform the task directly instead of calling subagent_spawn.\",\n\t\t\"Give subagent_spawn a concise unique taskName using lowercase letters, digits, and underscores so the retained agent has a stable canonical task path.\",\n\t\t\"Set subagent_spawn thinkingLevel to the lowest sufficient thinking level for the delegated task: use off or minimal for extraction, formatting, or mechanical work; low for straightforward bounded work; medium for ordinary multi-step research or implementation; high for complex debugging, design, review, or cross-file analysis; xhigh for highly ambiguous, cross-system, or high-risk analysis; and max only for the hardest tasks when quality clearly outweighs latency and cost. Omit subagent_spawn thinkingLevel only to preserve the agent or child default.\",\n\t\t\"Set subagent_spawn timeoutMs to the shortest realistic work deadline for the task difficulty; use idleTimeoutMs for stalled work and maxTurns or maxToolCalls to stop repeated work without progress. Scope the task to the smallest named files or questions. When setting subagent_spawn maxTurns or maxToolCalls, leave sufficient headroom for discovery, evidence reads, and final synthesis; otherwise omit them instead of guessing speculative tight values. Split oversized tasks instead of extending budgets merely to compensate for broad scope.\",\n\t\t\"For an ordinary subagent_spawn, omit contract; use a delegation contract only when explicit acceptance, authority, evidence, or admission semantics are required.\",\n\t\t\"Do not set subagent_spawn contract enforcement to enforce with requestedAuthority readPaths, writePaths, network, or secrets; those guarantees are unsupported and reject before child launch, while capabilities and tools remain enforceable.\",\n\t\t\"If subagent_spawn rejects an unsupported guarantee, retry once with those fields removed or enforcement set to audit only when they were advisory; when any field is a required security boundary, stop instead of weakening it.\",\n\t\t\"Read the current pi-subagents session-guidance message before choosing detached completion behavior. With next-turn delivery, use subagent_spawn only when the current response does not depend on its result unless useful overlap ends with an intentional subagent_await. With auto-resume delivery, final-answer-dependent detached work may continue asynchronously.\",\n\t\t'Track every final-answer-dependent subagent_spawn by setting completionRequirement to \"required\" and retaining its returned agentId or taskPath; treat interim output as progress, and synthesize only after every corresponding completion message is visible or terminal.',\n\t\t\"Keep ordinary review in the main agent with a review skill and deterministic checks; use subagent_spawn for detached review only when consequential independent verification has concrete parallel value.\",\n\t\t\"Use a single subagent_spawn for a bounded implementation slice with clear ownership only when it can run beside the identified main-agent work.\",\n\t\t\"Use a single subagent_spawn without concurrent main-agent work only for an explicit user-requested specialist model, tool profile, or isolation boundary.\",\n\t\t...(blockingEnabled\n\t\t\t? [\n\t\t\t\t\t\"The subagent tool is deprecated; do not select it merely because synchronous output is required. Prefer subagent_spawn with supported completion delivery, and use subagent_await only after useful overlapping main-agent work is complete and an intentional join is required.\",\n\t\t\t\t\t\"Use deprecated subagent instead of subagent_spawn 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; queued steering cannot be processed until it returns.\",\n\t\t\t\t]\n\t\t\t: []),\n\t\t\"Add another subagent_spawn only for truly independent work with safe workspace concurrency and disjoint write ownership; shared workspaces permit concurrent writes by default, so use workspaceMode worktree when repository isolation is required. The main agent still owns integration.\",\n\t\t\"After subagent_spawn returns, immediately continue the identified local task; do not merely announce the spawn, wait, poll, or end the response while useful local work remains.\",\n\t\t\"When completionRequirement required subagent_spawn work remains active after local work is exhausted, emit at most one brief progress sentence and end the turn; do not repeat waiting updates or use the requested final format, verdict, or conclusion until every required completion is visible or terminal. Current Pi versions do not enforce a hard pre-display barrier.\",\n\t\t\"Do not duplicate assigned work from subagent_spawn while its retained agent is running; use a bounded parent fallback only after its completion reports failure or insufficient evidence.\",\n\t\t'Consume and synthesize available subagent_spawn completion messages; use subagent_manage with action \"interrupt\" or \"close\" for agents that are no longer needed.',\n\t\t'Completion from subagent_spawn is delivered automatically. Do not poll with subagent_inspect or subagent_mailbox action \"read\", repeatedly check progress, or duplicate the delegated work.',\n\t];\n}\n", "import type { AgentToolResult } from \"@earendil-works/pi-agent-core\";\nimport type { Theme, ToolRenderResultOptions } from \"@earendil-works/pi-coding-agent\";\nimport { Text } from \"@earendil-works/pi-tui\";\nimport {\n\tCOLLAPSED_LIST_LIMIT,\n\texpansionHint,\n\ttype RenderStatus,\n\trecordList,\n\trecordValue,\n\trenderFallbackResult,\n\tsafeBlock,\n\tsafeLine,\n\tstatusBadge,\n\tstringValue,\n\ttype ToolRendererContext,\n\ttextResult,\n\ttoolHeader,\n} from \"./render-common.js\";\n\nexport type StatefulRenderTool = \"spawn\" | \"send\" | \"await\" | \"manage\" | \"mailbox\";\n\nexport function createStatefulToolRenderer(tool: StatefulRenderTool) {\n\treturn {\n\t\trenderCall(args: unknown, theme: Theme) {\n\t\t\treturn renderStatefulCall(tool, recordValue(args) ?? {}, theme);\n\t\t},\n\t\trenderResult(\n\t\t\tresult: AgentToolResult<unknown>,\n\t\t\toptions: ToolRenderResultOptions,\n\t\t\ttheme: Theme,\n\t\t\tcontext: ToolRendererContext<unknown>,\n\t\t) {\n\t\t\treturn renderStatefulResult(tool, result, options, theme, context);\n\t\t},\n\t};\n}\n\nfunction renderStatefulCall(tool: StatefulRenderTool, args: Record<string, unknown>, theme: Theme) {\n\tif (tool === \"spawn\") {\n\t\tconst metadata = [\n\t\t\t`[${safeLine(args.agentScope, \"user\", 64)}]`,\n\t\t\t\"detached\",\n\t\t\tsafeLine(args.workspaceMode, \"shared\", 64),\n\t\t];\n\t\tif (typeof args.thinkingLevel === \"string\") metadata.push(`thinking:${args.thinkingLevel}`);\n\t\tif (typeof args.timeoutMs === \"number\") metadata.push(`timeout:${args.timeoutMs}ms`);\n\t\tif (typeof args.idleTimeoutMs === \"number\") metadata.push(`idle:${args.idleTimeoutMs}ms`);\n\t\tif (typeof args.maxTurns === \"number\") metadata.push(`turns:${args.maxTurns}`);\n\t\tif (typeof args.maxToolCalls === \"number\") metadata.push(`tools:${args.maxToolCalls}`);\n\t\treturn new Text(\n\t\t\t[\n\t\t\t\ttoolHeader(theme, \"subagent_spawn\", args.agent, metadata),\n\t\t\t\t` ${theme.fg(\"dim\", safeLine(args.task, \"...\", 2 * 1024))}`,\n\t\t\t].join(\"\\n\"),\n\t\t\t0,\n\t\t\t0,\n\t\t);\n\t}\n\tif (tool === \"send\") {\n\t\tconst metadata = [\"follow-up\"];\n\t\tif (typeof args.timeoutMs === \"number\") metadata.push(`timeout:${args.timeoutMs}ms`);\n\t\tif (typeof args.idleTimeoutMs === \"number\") metadata.push(`idle:${args.idleTimeoutMs}ms`);\n\t\tif (typeof args.maxTurns === \"number\") metadata.push(`turns:${args.maxTurns}`);\n\t\tif (typeof args.maxToolCalls === \"number\") metadata.push(`tools:${args.maxToolCalls}`);\n\t\treturn new Text(\n\t\t\t[\n\t\t\t\ttoolHeader(theme, \"subagent_send\", args.agentId, metadata),\n\t\t\t\t` ${theme.fg(\"dim\", safeLine(args.task, \"...\", 2 * 1024))}`,\n\t\t\t].join(\"\\n\"),\n\t\t\t0,\n\t\t\t0,\n\t\t);\n\t}\n\tif (tool === \"await\") {\n\t\tconst metadata = [\"blocking\"];\n\t\tif (typeof args.timeoutMs === \"number\") metadata.push(`timeout:${args.timeoutMs}ms`);\n\t\treturn new Text(toolHeader(theme, \"subagent_await\", args.agentId, metadata), 0, 0);\n\t}\n\tif (tool === \"manage\") {\n\t\tconst metadata: string[] = [];\n\t\tif (typeof args.agentId === \"string\") metadata.push(`id:${safeLine(args.agentId, \"\", 256)}`);\n\t\tif (args.subtree === true) metadata.push(\"subtree\");\n\t\treturn new Text(toolHeader(theme, \"subagent_manage\", args.action, metadata), 0, 0);\n\t}\n\tconst metadata = [`id:${safeLine(args.agentId, \"...\", 256)}`];\n\tif (args.action === \"read\") {\n\t\tmetadata.push(args.acknowledge === false ? \"leave unread\" : \"acknowledge\");\n\t}\n\tconst lines = [toolHeader(theme, \"subagent_mailbox\", args.action, metadata)];\n\tif (args.action === \"send\") {\n\t\tlines.push(` ${theme.fg(\"dim\", safeLine(args.message, \"...\", 2 * 1024))}`);\n\t}\n\treturn new Text(lines.join(\"\\n\"), 0, 0);\n}\n\nfunction renderStatefulResult(\n\ttool: StatefulRenderTool,\n\tresult: AgentToolResult<unknown>,\n\toptions: ToolRenderResultOptions,\n\ttheme: Theme,\n\tcontext: ToolRendererContext<unknown>,\n) {\n\tconst details = recordValue(result.details);\n\tconst args = recordValue(context.args) ?? {};\n\tif (!details) return renderFallbackResult(result, options, theme, context.isError);\n\tif (tool === \"spawn\" || tool === \"send\" || tool === \"await\") {\n\t\tconst agent = recordValue(details.agent);\n\t\tif (!agent) return renderFallbackResult(result, options, theme, context.isError);\n\t\tif (tool === \"await\" && details.timedOut === true) {\n\t\t\treturn new Text(renderAwaitTimeout(agent, result, options.expanded, theme), 0, 0);\n\t\t}\n\t\treturn new Text(renderAgentResult(agent, result, options.expanded, theme), 0, 0);\n\t}\n\tif (tool === \"manage\") {\n\t\treturn new Text(renderManageResult(args, details, result, options.expanded, theme), 0, 0);\n\t}\n\treturn new Text(renderMailboxResult(args, details, options.expanded, theme), 0, 0);\n}\n\nfunction renderAgentResult(\n\tagent: Record<string, unknown>,\n\tresult: AgentToolResult<unknown>,\n\texpanded: boolean,\n\ttheme: Theme,\n): string {\n\tconst state = safeLine(agent.state, \"unknown\", 128);\n\tconst lines = [\n\t\t`${statusBadge(theme, lifecycleStatus(state))} \u00B7 ${theme.fg(\"accent\", safeLine(agent.id, \"agent\", 256))} \u00B7 ${theme.fg(\"toolOutput\", safeLine(agent.agent, \"subagent\", 256))} \u00B7 ${theme.fg(\"muted\", state)}`,\n\t];\n\tconst thinking = stringValue(agent.thinkingLevel);\n\tconst timeout =\n\t\ttypeof agent.currentTimeoutMs === \"number\"\n\t\t\t? agent.currentTimeoutMs\n\t\t\t: typeof agent.timeoutMs === \"number\"\n\t\t\t\t? agent.timeoutMs\n\t\t\t\t: 0;\n\tconst idleTimeout =\n\t\ttypeof agent.currentIdleTimeoutMs === \"number\"\n\t\t\t? agent.currentIdleTimeoutMs\n\t\t\t: typeof agent.idleTimeoutMs === \"number\"\n\t\t\t\t? agent.idleTimeoutMs\n\t\t\t\t: 0;\n\tconst maxTurns =\n\t\ttypeof agent.currentMaxTurns === \"number\"\n\t\t\t? agent.currentMaxTurns\n\t\t\t: typeof agent.maxTurns === \"number\"\n\t\t\t\t? agent.maxTurns\n\t\t\t\t: 0;\n\tconst maxToolCalls =\n\t\ttypeof agent.currentMaxToolCalls === \"number\"\n\t\t\t? agent.currentMaxToolCalls\n\t\t\t: typeof agent.maxToolCalls === \"number\"\n\t\t\t\t? agent.maxToolCalls\n\t\t\t\t: 0;\n\tconst unread = typeof agent.unreadMessages === \"number\" ? agent.unreadMessages : 0;\n\tif (thinking || timeout || idleTimeout || maxTurns || maxToolCalls || unread > 0) {\n\t\tlines.push(\n\t\t\ttheme.fg(\n\t\t\t\t\"dim\",\n\t\t\t\t[\n\t\t\t\t\tthinking && `thinking:${safeLine(thinking, \"\", 128)}`,\n\t\t\t\t\ttimeout && `timeout:${timeout}ms`,\n\t\t\t\t\tidleTimeout && `idle:${idleTimeout}ms`,\n\t\t\t\t\tmaxTurns && `turns:${maxTurns}`,\n\t\t\t\t\tmaxToolCalls && `tools:${maxToolCalls}`,\n\t\t\t\t\tunread > 0 && `unread:${unread}`,\n\t\t\t\t]\n\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t.join(\" \u00B7 \"),\n\t\t\t),\n\t\t);\n\t}\n\tif (expanded) {\n\t\tconst task = safeBlock(agent.currentTask, \"\", 2 * 1024).trim();\n\t\tconst error = safeBlock(agent.error, \"\", 2 * 1024).trim();\n\t\tif (task) lines.push(theme.fg(\"dim\", `task: ${task}`));\n\t\tif (error) lines.push(theme.fg(\"error\", `error: ${error}`));\n\t\tconst content = safeBlock(textResult(result), \"\", 8 * 1024).trim();\n\t\tif (content) lines.push(theme.fg(\"toolOutput\", content));\n\t} else lines.push(expansionHint());\n\treturn lines.join(\"\\n\");\n}\n\nfunction renderAwaitTimeout(\n\tagent: Record<string, unknown>,\n\tresult: AgentToolResult<unknown>,\n\texpanded: boolean,\n\ttheme: Theme,\n): string {\n\tconst lines = [\n\t\t`${statusBadge(theme, \"running\")} \u00B7 ${theme.fg(\"accent\", safeLine(agent.id, \"agent\", 256))} \u00B7 ${theme.fg(\"warning\", \"wait timed out\")} \u00B7 ${theme.fg(\"muted\", safeLine(agent.state, \"unknown\", 128))}`,\n\t];\n\tif (expanded) {\n\t\tconst content = safeBlock(textResult(result), \"\", 8 * 1024).trim();\n\t\tif (content) lines.push(theme.fg(\"toolOutput\", content));\n\t} else lines.push(expansionHint());\n\treturn lines.join(\"\\n\");\n}\n\nfunction renderManageResult(\n\targs: Record<string, unknown>,\n\tdetails: Record<string, unknown>,\n\tresult: AgentToolResult<unknown>,\n\texpanded: boolean,\n\ttheme: Theme,\n): string {\n\tconst action = safeLine(args.action, \"action\", 128);\n\tconst agents = recordList(details.agents);\n\tconst primary = recordValue(details.agent);\n\tif (action === \"list\") {\n\t\tconst lines = [\n\t\t\t`${statusBadge(theme, \"completed\")} \u00B7 list \u00B7 ${agents.length} agent${agents.length === 1 ? \"\" : \"s\"}`,\n\t\t];\n\t\tconst selected = expanded ? agents : agents.slice(0, COLLAPSED_LIST_LIMIT);\n\t\tfor (const agent of selected) lines.push(formatAgentLine(agent, theme, expanded));\n\t\tif (agents.length === 0) lines.push(theme.fg(\"muted\", \"(no retained agents)\"));\n\t\tif (agents.length > selected.length)\n\t\t\tlines.push(theme.fg(\"muted\", `\u2026 ${agents.length - selected.length} omitted`));\n\t\tif (!expanded && agents.length > 0) lines.push(expansionHint());\n\t\treturn lines.join(\"\\n\");\n\t}\n\n\tconst subtree = args.subtree === true;\n\tconst affected = subtree ? agents.length : agents.length > 0 ? agents.length : primary ? 1 : 0;\n\tconst status: RenderStatus = action === \"interrupt\" ? \"interrupted\" : \"closed\";\n\tconst lines = [\n\t\t`${statusBadge(theme, status)} \u00B7 ${affected} agent${affected === 1 ? \"\" : \"s\"}${subtree ? theme.fg(\"muted\", \" \u00B7 subtree\") : \"\"}`,\n\t];\n\tconst selected = agents.length > 0 ? agents : !subtree && primary ? [primary] : [];\n\tfor (const agent of expanded ? selected : selected.slice(0, COLLAPSED_LIST_LIMIT)) {\n\t\tlines.push(formatAgentLine(agent, theme, expanded));\n\t}\n\tif (selected.length === 0) {\n\t\tconst content = safeBlock(textResult(result), \"(no output)\", 8 * 1024);\n\t\tlines.push(theme.fg(\"toolOutput\", content));\n\t}\n\tif (!expanded && selected.length > 0) lines.push(expansionHint());\n\treturn lines.join(\"\\n\");\n}\n\nfunction renderMailboxResult(\n\targs: Record<string, unknown>,\n\tdetails: Record<string, unknown>,\n\texpanded: boolean,\n\ttheme: Theme,\n): string {\n\tconst action = safeLine(args.action, \"action\", 64);\n\tif (action === \"send\") {\n\t\tconst message = recordValue(details.message);\n\t\tif (!message) return `${statusBadge(theme, \"completed\")} \u00B7 Queued message`;\n\t\tconst lines = [\n\t\t\t`${theme.fg(\"success\", \"\u2713\")} ${theme.fg(\"success\", \"Queued\")} \u00B7 ${theme.fg(\"accent\", safeLine(message.id, \"message\", 256))} \u00B7 ${theme.fg(\"muted\", `to ${safeLine(message.recipientId, safeLine(args.agentId), 256)}`)}`,\n\t\t];\n\t\tif (expanded) {\n\t\t\tlines.push(theme.fg(\"toolOutput\", safeBlock(message.content, \"(empty message)\", 2 * 1024)));\n\t\t} else lines.push(expansionHint());\n\t\treturn lines.join(\"\\n\");\n\t}\n\n\tconst messages = recordList(details.messages);\n\tconst acknowledged = args.acknowledge === false ? \"left unread\" : \"acknowledged\";\n\tconst lines = [\n\t\t`${statusBadge(theme, \"completed\")} \u00B7 ${messages.length} message${messages.length === 1 ? \"\" : \"s\"} \u00B7 ${acknowledged}`,\n\t];\n\tconst selected = expanded ? messages : messages.slice(0, COLLAPSED_LIST_LIMIT);\n\tfor (const message of selected) {\n\t\tconst content = expanded\n\t\t\t? safeBlock(message.content, \"(empty message)\", 2 * 1024)\n\t\t\t: safeLine(message.content, \"(empty message)\", 512);\n\t\tlines.push(\n\t\t\t`${theme.fg(\"muted\", \"\u2022 \")}${theme.fg(\"accent\", safeLine(message.id, \"message\", 256))} ${theme.fg(\"muted\", `from ${safeLine(message.senderId, \"unknown\", 256)}: `)}${theme.fg(\"toolOutput\", content)}`,\n\t\t);\n\t}\n\tif (messages.length === 0) lines.push(theme.fg(\"muted\", \"(no unread messages)\"));\n\tif (messages.length > selected.length)\n\t\tlines.push(theme.fg(\"muted\", `\u2026 ${messages.length - selected.length} omitted`));\n\tif (!expanded && messages.length > 0) lines.push(expansionHint());\n\treturn lines.join(\"\\n\");\n}\n\nfunction formatAgentLine(agent: Record<string, unknown>, theme: Theme, expanded: boolean): string {\n\tconst unread = typeof agent.unreadMessages === \"number\" ? agent.unreadMessages : 0;\n\tconst lines = [\n\t\t`${theme.fg(\"muted\", \"\u2022 \")}${theme.fg(\"accent\", safeLine(agent.id, \"agent\", 256))} ${theme.fg(\"toolOutput\", safeLine(agent.agent, \"subagent\", 256))} ${theme.fg(\"muted\", safeLine(agent.state, \"unknown\", 128))}${unread > 0 ? theme.fg(\"warning\", ` \u00B7 unread:${unread}`) : \"\"}`,\n\t];\n\tif (expanded) {\n\t\tconst task = safeBlock(agent.currentTask, \"\", 2 * 1024).trim();\n\t\tconst error = safeBlock(agent.error, \"\", 2 * 1024).trim();\n\t\tif (task) lines.push(` ${theme.fg(\"dim\", `task: ${task}`)}`);\n\t\tif (error) lines.push(` ${theme.fg(\"error\", `error: ${error}`)}`);\n\t}\n\treturn lines.join(\"\\n\");\n}\n\nfunction lifecycleStatus(state: string): RenderStatus {\n\tswitch (state) {\n\t\tcase \"starting\":\n\t\t\treturn \"starting\";\n\t\tcase \"running\":\n\t\t\treturn \"running\";\n\t\tcase \"idle\":\n\t\t\treturn \"idle\";\n\t\tcase \"partial\":\n\t\tcase \"blocked\":\n\t\tcase \"needs-input\":\n\t\tcase \"abstained\":\n\t\tcase \"stale\":\n\t\t\treturn \"warning\";\n\t\tcase \"failed\":\n\t\t\treturn \"failed\";\n\t\tcase \"interrupted\":\n\t\t\treturn \"interrupted\";\n\t\tcase \"closed\":\n\t\t\treturn \"closed\";\n\t\tdefault:\n\t\t\treturn \"completed\";\n\t}\n}\n", "import { StringEnum } from \"@earendil-works/pi-ai\";\nimport { Type } from \"typebox\";\n\nconst MANAGE_ACTIONS = [\"interrupt\", \"close\"] as const;\nconst MAILBOX_ACTIONS = [\"send\", \"read\"] as const;\nconst MAX_MAILBOX_MESSAGE_LENGTH = 16 * 1024;\n\nexport const ManageParamsSchema = Type.Object(\n\t{\n\t\taction: StringEnum(MANAGE_ACTIONS, {\n\t\t\tdescription: \"Interrupt active work or close an agent and release its resources.\",\n\t\t}),\n\t\tagentId: Type.Optional(\n\t\t\tType.String({\n\t\t\t\tminLength: 1,\n\t\t\t\tdescription: \"Required agent ID or canonical task path for interrupt and close.\",\n\t\t\t}),\n\t\t),\n\t\tsubtree: Type.Optional(\n\t\t\tType.Boolean({\n\t\t\t\tdefault: false,\n\t\t\t\tdescription: \"Interrupt or close the target and all descendants child-first.\",\n\t\t\t}),\n\t\t),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport const MailboxParamsSchema = Type.Object(\n\t{\n\t\taction: StringEnum(MAILBOX_ACTIONS, {\n\t\t\tdescription: \"Use send for queue-only delivery or read to inspect unread mailbox messages.\",\n\t\t}),\n\t\tagentId: Type.String({\n\t\t\tminLength: 1,\n\t\t\tdescription: \"Mailbox owner or recipient agent ID or canonical task path.\",\n\t\t}),\n\t\tmessage: Type.Optional(\n\t\t\tType.String({\n\t\t\t\tminLength: 1,\n\t\t\t\tmaxLength: MAX_MAILBOX_MESSAGE_LENGTH,\n\t\t\t\tdescription: \"Message content required by send; sending does not start a turn.\",\n\t\t\t}),\n\t\t),\n\t\tsenderId: Type.Optional(\n\t\t\tType.String({ description: \"Optional sender agent ID or canonical task path.\" }),\n\t\t),\n\t\tdeduplicationKey: Type.Optional(\n\t\t\tType.String({ maxLength: 256, description: \"Optional idempotency key for send.\" }),\n\t\t),\n\t\tacknowledge: Type.Optional(\n\t\t\tType.Boolean({ default: true, description: \"Mark returned read messages as acknowledged.\" }),\n\t\t),\n\t\tlimit: Type.Optional(\n\t\t\tType.Number({ minimum: 1, maximum: 20, default: 20, description: \"Maximum messages.\" }),\n\t\t),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport type ValidatedManageParams = {\n\taction: \"interrupt\" | \"close\";\n\tagentId: string;\n\tsubtree?: boolean;\n};\n\nexport type ValidatedMailboxParams =\n\t| {\n\t\t\taction: \"send\";\n\t\t\tagentId: string;\n\t\t\tmessage: string;\n\t\t\tsenderId?: string;\n\t\t\tdeduplicationKey?: string;\n\t }\n\t| { action: \"read\"; agentId: string; acknowledge?: boolean; limit?: number };\n\nexport function validateManageParams(params: unknown): ValidatedManageParams {\n\tconst values = parameterRecord(params, \"subagent_manage\");\n\tassertKnownKeys(\"subagent_manage\", values, [\"action\", \"agentId\", \"subtree\"]);\n\tconst action = values.action;\n\tif (action === \"list\") {\n\t\tthrow new Error(\n\t\t\t'subagent_manage no longer supports \"list\"; use subagent_inspect action \"list_runs\"',\n\t\t);\n\t}\n\tif (\n\t\ttypeof action !== \"string\" ||\n\t\t!MANAGE_ACTIONS.includes(action as (typeof MANAGE_ACTIONS)[number])\n\t) {\n\t\tthrow new Error(`subagent_manage action must be one of: ${MANAGE_ACTIONS.join(\", \")}`);\n\t}\n\tassertRequiredString(\"subagent_manage\", action, values, \"agentId\");\n\tassertOptionalBoolean(\"subagent_manage\", action, values, \"subtree\");\n\treturn {\n\t\taction,\n\t\tagentId: values.agentId,\n\t\t...(values.subtree === undefined ? {} : { subtree: values.subtree }),\n\t} as ValidatedManageParams;\n}\n\nexport function validateMailboxParams(params: unknown): ValidatedMailboxParams {\n\tconst values = parameterRecord(params, \"subagent_mailbox\");\n\tassertKnownKeys(\"subagent_mailbox\", values, [\n\t\t\"action\",\n\t\t\"agentId\",\n\t\t\"message\",\n\t\t\"senderId\",\n\t\t\"deduplicationKey\",\n\t\t\"acknowledge\",\n\t\t\"limit\",\n\t]);\n\tconst action = values.action;\n\tif (\n\t\ttypeof action !== \"string\" ||\n\t\t!MAILBOX_ACTIONS.includes(action as (typeof MAILBOX_ACTIONS)[number])\n\t) {\n\t\tthrow new Error(`subagent_mailbox action must be one of: ${MAILBOX_ACTIONS.join(\", \")}`);\n\t}\n\tif (action === \"send\") {\n\t\tassertRequiredString(\"subagent_mailbox\", action, values, \"agentId\");\n\t\tassertRequiredString(\"subagent_mailbox\", action, values, \"message\");\n\t\tconst message = values.message as string;\n\t\tif (message.length > MAX_MAILBOX_MESSAGE_LENGTH) {\n\t\t\tthrow new Error(\n\t\t\t\t`subagent_mailbox action \"send\" requires message at most ${MAX_MAILBOX_MESSAGE_LENGTH} characters`,\n\t\t\t);\n\t\t}\n\t\tassertOptionalString(\"subagent_mailbox\", action, values, \"senderId\");\n\t\tassertOptionalString(\"subagent_mailbox\", action, values, \"deduplicationKey\");\n\t\tif (typeof values.deduplicationKey === \"string\" && values.deduplicationKey.length > 256) {\n\t\t\tthrow new Error(\n\t\t\t\t'subagent_mailbox action \"send\" requires deduplicationKey at most 256 characters',\n\t\t\t);\n\t\t}\n\t\treturn {\n\t\t\taction,\n\t\t\tagentId: values.agentId,\n\t\t\tmessage,\n\t\t\t...(values.senderId === undefined ? {} : { senderId: values.senderId }),\n\t\t\t...(values.deduplicationKey === undefined\n\t\t\t\t? {}\n\t\t\t\t: { deduplicationKey: values.deduplicationKey }),\n\t\t} as ValidatedMailboxParams;\n\t}\n\tassertRequiredString(\"subagent_mailbox\", action, values, \"agentId\");\n\tassertOptionalBoolean(\"subagent_mailbox\", action, values, \"acknowledge\");\n\tif (\n\t\tvalues.limit !== undefined &&\n\t\t(typeof values.limit !== \"number\" ||\n\t\t\t!Number.isFinite(values.limit) ||\n\t\t\tvalues.limit < 1 ||\n\t\t\tvalues.limit > 20)\n\t) {\n\t\tthrow new Error('subagent_mailbox action \"read\" requires limit between 1 and 20');\n\t}\n\treturn {\n\t\taction,\n\t\tagentId: values.agentId,\n\t\t...(values.acknowledge === undefined ? {} : { acknowledge: values.acknowledge }),\n\t\t...(values.limit === undefined ? {} : { limit: values.limit }),\n\t} as ValidatedMailboxParams;\n}\n\nfunction parameterRecord(params: unknown, toolName: string): Record<string, unknown> {\n\tif (!params || typeof params !== \"object\" || Array.isArray(params)) {\n\t\tthrow new Error(`${toolName} parameters must be an object`);\n\t}\n\treturn params as Record<string, unknown>;\n}\n\nfunction assertKnownKeys(\n\ttoolName: string,\n\tvalues: Record<string, unknown>,\n\tallowed: readonly string[],\n): void {\n\tconst unexpected = Object.keys(values).find(\n\t\t(key) => values[key] !== undefined && !allowed.includes(key),\n\t);\n\tif (unexpected) throw new Error(`${toolName} does not accept ${unexpected}`);\n}\n\nfunction assertRequiredString(\n\ttoolName: string,\n\taction: string,\n\tvalues: Record<string, unknown>,\n\tkey: string,\n): void {\n\tconst value = values[key];\n\tif (value === undefined) throw new Error(`${toolName} action \"${action}\" requires ${key}`);\n\tif (typeof value !== \"string\" || value.length === 0) {\n\t\tthrow new Error(`${toolName} action \"${action}\" requires ${key} to be a non-empty string`);\n\t}\n}\n\nfunction assertOptionalString(\n\ttoolName: string,\n\taction: string,\n\tvalues: Record<string, unknown>,\n\tkey: string,\n): void {\n\tif (values[key] !== undefined && typeof values[key] !== \"string\") {\n\t\tthrow new Error(`${toolName} action \"${action}\" requires ${key} to be a string`);\n\t}\n}\n\nfunction assertOptionalBoolean(\n\ttoolName: string,\n\taction: string,\n\tvalues: Record<string, unknown>,\n\tkey: string,\n): void {\n\tif (values[key] !== undefined && typeof values[key] !== \"boolean\") {\n\t\tthrow new Error(`${toolName} action \"${action}\" requires ${key} to be a boolean`);\n\t}\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["StringEnum", "Type", "result", "metadata", "lines", "selected", "Type", "StringEnum", "agent", "agentId"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/agents/types.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Foundational agent and settings types with dependency-light validation helpers.\n */\n\nimport type { AgentCapabilityManifest } from \"../capabilities.js\";\nimport type { SubagentUsageRecordingSettings } from \"../usage-recording-config.js\";\n\nexport const THINKING_LEVELS = [\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"] as const;\n\nexport type SubagentThinkingLevel = (typeof THINKING_LEVELS)[number];\n\nexport function isThinkingLevel(value: unknown): value is SubagentThinkingLevel {\n\treturn typeof value === \"string\" && THINKING_LEVELS.includes(value as SubagentThinkingLevel);\n}\n\nexport type AgentScope = \"user\" | \"project\" | \"both\";\n\nexport type AgentSource = \"built-in\" | \"user\" | \"project\";\n\nexport const DEFAULT_PI_TOOL_NAMES = [\"read\", \"bash\", \"edit\", \"write\"] as const;\n\nexport function resolveAgentToolNames(tools: readonly string[] | undefined): string[] {\n\treturn [...new Set(tools ?? DEFAULT_PI_TOOL_NAMES)];\n}\n\nexport interface AgentConfig {\n\tname: string;\n\tdescription: string;\n\ttools?: string[];\n\tmodel?: string;\n\tthinkingLevel?: SubagentThinkingLevel;\n\ttimeoutMs?: number;\n\tcapabilityManifest?: AgentCapabilityManifest;\n\tsystemPrompt: string;\n\tsource: AgentSource;\n\tfilePath: string;\n}\n\nexport interface SubagentAgentConfig {\n\ttools?: string[];\n\tmodel?: string | null;\n\tthinkingLevel?: SubagentThinkingLevel | null;\n\ttimeoutMs?: number | null;\n}\n\nexport type SubagentTransportKind = \"subprocess\" | \"in-process\" | \"rpc\" | \"auto\";\n\nexport type CompletionDelivery = \"next-turn\" | \"auto-resume\";\n\nexport const CONSULT_RESOURCE_POLICIES = [\"project-context\", \"none\", \"all\"] as const;\n\nexport type ConsultResourcePolicy = (typeof CONSULT_RESOURCE_POLICIES)[number];\n\nexport interface SubagentConsultSettings {\n\tresources?: ConsultResourcePolicy;\n}\n\nexport const CONSULTATION_CWD_POLICIES = [\"anywhere\", \"current-workspace\"] as const;\nexport type ConsultationCwdPolicy = (typeof CONSULTATION_CWD_POLICIES)[number];\n\nexport const DELEGATION_CWD_POLICIES = [\n\t\"trusted-targets\",\n\t\"current-workspace\",\n\t\"anywhere\",\n] as const;\nexport type DelegationCwdPolicy = (typeof DELEGATION_CWD_POLICIES)[number];\n\nexport interface SubagentCwdPolicySettings {\n\tconsultation?: ConsultationCwdPolicy;\n\tdelegation?: DelegationCwdPolicy;\n}\n\nexport interface SubagentBlockingSettings {\n\tenabled?: boolean;\n\tmaxParallelTasks?: number;\n}\n\nexport interface SubagentRuntimeSettings {\n\tenabled?: boolean;\n\ttransport?: SubagentTransportKind;\n\tcompletionDelivery?: CompletionDelivery;\n\tmaxAgents?: number;\n\tmaxActiveTurns?: number;\n\tmaxDepth?: number;\n\tmaxChildrenPerAgent?: number;\n\tmaxMailboxMessages?: number;\n\tmaxMailboxMessageBytes?: number;\n\tidleTtlMs?: number;\n\tretentionDays?: number;\n\tmaxStoredAgents?: number;\n}\n\nexport interface SubagentSettings {\n\tagents?: Record<string, SubagentAgentConfig>;\n\tblocking?: SubagentBlockingSettings;\n\tstateful?: SubagentRuntimeSettings;\n\tconsult?: SubagentConsultSettings;\n\tcwdPolicy?: SubagentCwdPolicySettings;\n\tusageRecording?: SubagentUsageRecordingSettings;\n}\n"],
|
|
5
|
+
"mappings": ";;;;AAOO,IAAM,kBAAkB,CAAC,OAAO,WAAW,OAAO,UAAU,QAAQ,SAAS,KAAK;AAIlF,SAAS,gBAAgB,OAAgD;AAC/E,SAAO,OAAO,UAAU,YAAY,gBAAgB,SAAS,KAA8B;AAC5F;AAMO,IAAM,wBAAwB,CAAC,QAAQ,QAAQ,QAAQ,OAAO;AAE9D,SAAS,sBAAsB,OAAgD;AACrF,SAAO,CAAC,GAAG,IAAI,IAAI,SAAS,qBAAqB,CAAC;AACnD;AA0BO,IAAM,4BAA4B,CAAC,mBAAmB,QAAQ,KAAK;AAQnE,IAAM,4BAA4B,CAAC,YAAY,mBAAmB;AAGlE,IAAM,0BAA0B;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AACD;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
// @generated by scripts/build-runtime.mjs; do not edit.
|
|
2
|
+
// @ts-nocheck -- generated JavaScript uses a .ts extension for Pi's Jiti loader.
|
|
3
|
+
|
|
4
|
+
// src/process-control.ts
|
|
5
|
+
var KILL_GRACE_MS = 5e3;
|
|
6
|
+
function signalProcess(proc, signal) {
|
|
7
|
+
if (process.platform !== "win32" && proc.pid) {
|
|
8
|
+
try {
|
|
9
|
+
process.kill(-proc.pid, signal);
|
|
10
|
+
return;
|
|
11
|
+
} catch {
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
try {
|
|
15
|
+
proc.kill(signal);
|
|
16
|
+
} catch {
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function terminateProcess(proc, graceMs = KILL_GRACE_MS) {
|
|
20
|
+
const leaderExited = proc.exitCode !== null || proc.signalCode !== null;
|
|
21
|
+
const capturedOutputClosed = [proc.stdout, proc.stderr].every(
|
|
22
|
+
(stream) => !stream || stream.readableEnded || stream.destroyed
|
|
23
|
+
);
|
|
24
|
+
let closed = leaderExited && capturedOutputClosed;
|
|
25
|
+
const onClose = () => {
|
|
26
|
+
closed = true;
|
|
27
|
+
};
|
|
28
|
+
proc.once("close", onClose);
|
|
29
|
+
if (!closed) signalProcess(proc, "SIGTERM");
|
|
30
|
+
const escalation = setTimeout(() => {
|
|
31
|
+
if (!closed) signalProcess(proc, "SIGKILL");
|
|
32
|
+
}, graceMs);
|
|
33
|
+
escalation.unref();
|
|
34
|
+
return () => {
|
|
35
|
+
clearTimeout(escalation);
|
|
36
|
+
proc.off("close", onClose);
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// src/protocol.ts
|
|
41
|
+
import { StringDecoder } from "node:string_decoder";
|
|
42
|
+
var DEFAULT_MAX_LINE_BYTES = 256 * 1024;
|
|
43
|
+
var JsonLineDecoder = class {
|
|
44
|
+
constructor(options) {
|
|
45
|
+
this.options = options;
|
|
46
|
+
const maxLineBytes = options.maxLineBytes ?? DEFAULT_MAX_LINE_BYTES;
|
|
47
|
+
if (!Number.isSafeInteger(maxLineBytes) || maxLineBytes < 1) {
|
|
48
|
+
throw new Error("JSON line limit must be a positive safe integer");
|
|
49
|
+
}
|
|
50
|
+
this.maxLineBytes = maxLineBytes;
|
|
51
|
+
}
|
|
52
|
+
options;
|
|
53
|
+
buffer = "";
|
|
54
|
+
droppingOversizedLine = false;
|
|
55
|
+
maxLineBytes;
|
|
56
|
+
decoder = new StringDecoder("utf8");
|
|
57
|
+
push(chunk) {
|
|
58
|
+
this.buffer += typeof chunk === "string" ? chunk : this.decoder.write(chunk);
|
|
59
|
+
this.drain(false);
|
|
60
|
+
}
|
|
61
|
+
finish() {
|
|
62
|
+
this.buffer += this.decoder.end();
|
|
63
|
+
this.drain(true);
|
|
64
|
+
this.buffer = "";
|
|
65
|
+
this.droppingOversizedLine = false;
|
|
66
|
+
}
|
|
67
|
+
drain(flush) {
|
|
68
|
+
while (true) {
|
|
69
|
+
const newline = this.buffer.indexOf("\n");
|
|
70
|
+
if (newline < 0) break;
|
|
71
|
+
const line = this.buffer.slice(0, newline).replace(/\r$/, "");
|
|
72
|
+
this.buffer = this.buffer.slice(newline + 1);
|
|
73
|
+
if (this.droppingOversizedLine) {
|
|
74
|
+
this.droppingOversizedLine = false;
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
this.processLine(line);
|
|
78
|
+
}
|
|
79
|
+
if (!flush && Buffer.byteLength(this.buffer, "utf8") > this.maxLineBytes) {
|
|
80
|
+
this.options.onOversized?.(Buffer.byteLength(this.buffer, "utf8"));
|
|
81
|
+
this.buffer = "";
|
|
82
|
+
this.droppingOversizedLine = true;
|
|
83
|
+
}
|
|
84
|
+
if (flush && this.buffer.length > 0 && !this.droppingOversizedLine) {
|
|
85
|
+
this.processLine(this.buffer.replace(/\r$/, ""));
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
processLine(line) {
|
|
89
|
+
if (!line.trim()) return;
|
|
90
|
+
const bytes = Buffer.byteLength(line, "utf8");
|
|
91
|
+
if (bytes > this.maxLineBytes) {
|
|
92
|
+
this.options.onOversized?.(bytes);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
try {
|
|
96
|
+
this.options.onValue(JSON.parse(line));
|
|
97
|
+
} catch {
|
|
98
|
+
this.options.onMalformed?.(line);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
export {
|
|
104
|
+
KILL_GRACE_MS,
|
|
105
|
+
terminateProcess,
|
|
106
|
+
JsonLineDecoder
|
|
107
|
+
};
|
|
108
|
+
//# sourceMappingURL=chunk-6H6TBBED.ts.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/process-control.ts", "../../src/protocol.ts"],
|
|
4
|
+
"sourcesContent": ["import type { spawn } from \"node:child_process\";\n\nexport const KILL_GRACE_MS = 5000;\n\nfunction signalProcess(proc: ReturnType<typeof spawn>, signal: NodeJS.Signals): void {\n\tif (process.platform !== \"win32\" && proc.pid) {\n\t\ttry {\n\t\t\tprocess.kill(-proc.pid, signal);\n\t\t\treturn;\n\t\t} catch {\n\t\t\t// Fall back to signaling the immediate child when process-group signaling is unavailable.\n\t\t}\n\t}\n\ttry {\n\t\tproc.kill(signal);\n\t} catch {\n\t\t// The process may already have exited.\n\t}\n}\n\nexport function terminateProcess(\n\tproc: ReturnType<typeof spawn>,\n\tgraceMs = KILL_GRACE_MS,\n): () => void {\n\tconst leaderExited = proc.exitCode !== null || proc.signalCode !== null;\n\tconst capturedOutputClosed = [proc.stdout, proc.stderr].every(\n\t\t(stream) => !stream || stream.readableEnded || stream.destroyed,\n\t);\n\tlet closed = leaderExited && capturedOutputClosed;\n\tconst onClose = () => {\n\t\tclosed = true;\n\t};\n\tproc.once(\"close\", onClose);\n\tif (!closed) signalProcess(proc, \"SIGTERM\");\n\tconst escalation = setTimeout(() => {\n\t\tif (!closed) signalProcess(proc, \"SIGKILL\");\n\t}, graceMs);\n\tescalation.unref();\n\treturn () => {\n\t\tclearTimeout(escalation);\n\t\tproc.off(\"close\", onClose);\n\t};\n}\n", "import { StringDecoder } from \"node:string_decoder\";\n\nconst DEFAULT_MAX_LINE_BYTES = 256 * 1024;\n\nexport interface JsonLineDecoderOptions {\n\tmaxLineBytes?: number;\n\tonValue: (value: unknown) => void;\n\tonMalformed?: (line: string) => void;\n\tonOversized?: (bytes: number) => void;\n}\n\n/** Bounded newline-delimited JSON decoder for child Pi event streams. */\nexport class JsonLineDecoder {\n\tprivate buffer = \"\";\n\tprivate droppingOversizedLine = false;\n\tprivate readonly maxLineBytes: number;\n\tprivate readonly decoder = new StringDecoder(\"utf8\");\n\n\tconstructor(private readonly options: JsonLineDecoderOptions) {\n\t\tconst maxLineBytes = options.maxLineBytes ?? DEFAULT_MAX_LINE_BYTES;\n\t\tif (!Number.isSafeInteger(maxLineBytes) || maxLineBytes < 1) {\n\t\t\tthrow new Error(\"JSON line limit must be a positive safe integer\");\n\t\t}\n\t\tthis.maxLineBytes = maxLineBytes;\n\t}\n\n\tpush(chunk: string | Buffer): void {\n\t\tthis.buffer += typeof chunk === \"string\" ? chunk : this.decoder.write(chunk);\n\t\tthis.drain(false);\n\t}\n\n\tfinish(): void {\n\t\tthis.buffer += this.decoder.end();\n\t\tthis.drain(true);\n\t\tthis.buffer = \"\";\n\t\tthis.droppingOversizedLine = false;\n\t}\n\n\tprivate drain(flush: boolean): void {\n\t\twhile (true) {\n\t\t\tconst newline = this.buffer.indexOf(\"\\n\");\n\t\t\tif (newline < 0) break;\n\t\t\tconst line = this.buffer.slice(0, newline).replace(/\\r$/, \"\");\n\t\t\tthis.buffer = this.buffer.slice(newline + 1);\n\t\t\tif (this.droppingOversizedLine) {\n\t\t\t\tthis.droppingOversizedLine = false;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis.processLine(line);\n\t\t}\n\n\t\tif (!flush && Buffer.byteLength(this.buffer, \"utf8\") > this.maxLineBytes) {\n\t\t\tthis.options.onOversized?.(Buffer.byteLength(this.buffer, \"utf8\"));\n\t\t\tthis.buffer = \"\";\n\t\t\tthis.droppingOversizedLine = true;\n\t\t}\n\n\t\tif (flush && this.buffer.length > 0 && !this.droppingOversizedLine) {\n\t\t\tthis.processLine(this.buffer.replace(/\\r$/, \"\"));\n\t\t}\n\t}\n\n\tprivate processLine(line: string): void {\n\t\tif (!line.trim()) return;\n\t\tconst bytes = Buffer.byteLength(line, \"utf8\");\n\t\tif (bytes > this.maxLineBytes) {\n\t\t\tthis.options.onOversized?.(bytes);\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tthis.options.onValue(JSON.parse(line));\n\t\t} catch {\n\t\t\tthis.options.onMalformed?.(line);\n\t\t}\n\t}\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -7,15 +7,11 @@ import {
|
|
|
7
7
|
import {
|
|
8
8
|
BUILT_IN_AGENTS,
|
|
9
9
|
discoverAgents
|
|
10
|
-
} from "./chunk-
|
|
11
|
-
import {
|
|
12
|
-
DEFAULT_CONSULTATION_CWD_POLICY,
|
|
13
|
-
DEFAULT_CONSULT_RESOURCE_POLICY
|
|
14
|
-
} from "./chunk-QBORTI4W.ts";
|
|
10
|
+
} from "./chunk-LASD73CM.ts";
|
|
15
11
|
import {
|
|
16
12
|
THINKING_LEVELS,
|
|
17
13
|
resolveAgentToolNames
|
|
18
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-4AQSF7AS.ts";
|
|
19
15
|
import {
|
|
20
16
|
COLLAPSED_ANSWER_LINES,
|
|
21
17
|
COLLAPSED_LIST_LIMIT,
|
|
@@ -372,7 +368,7 @@ function safeNumber(value) {
|
|
|
372
368
|
// src/consult-registration.ts
|
|
373
369
|
function registerSubagentConsult(pi, options, dependencies = {}) {
|
|
374
370
|
const loadExecution = cachedModuleLoader(
|
|
375
|
-
dependencies.loadExecution ?? (() => import("./consult-
|
|
371
|
+
dependencies.loadExecution ?? (() => import("./consult-LJU3IQY5.ts"))
|
|
376
372
|
);
|
|
377
373
|
let generation = 0;
|
|
378
374
|
const active = /* @__PURE__ */ new Set();
|
|
@@ -390,11 +386,11 @@ function registerSubagentConsult(pi, options, dependencies = {}) {
|
|
|
390
386
|
};
|
|
391
387
|
pi.on("session_start", () => cancelAndWaitForWork("Subagent consultation session replaced"));
|
|
392
388
|
pi.on("session_shutdown", () => cancelAndWaitForWork("Subagent consultation session shut down"));
|
|
393
|
-
const
|
|
389
|
+
const description = "Run one ephemeral subagent synchronously under enforced read-only tool and resource policies and return its answer. The child can use only the effective subset of Pi's built-in read, grep, find, and ls tools. Shell commands, file writes, extension tools, detached lifecycle operations, and persistent agent state are disabled. The current working-directory policy, trusted-target resource policy, and available agent definitions are published in the pi-subagents session-guidance message. Allowed targets without effective trust inherit no target or project resources. This is not a filesystem sandbox.";
|
|
394
390
|
const definition = {
|
|
395
391
|
name: "subagent_consult",
|
|
396
392
|
label: "Consult Read-only Subagent",
|
|
397
|
-
description
|
|
393
|
+
description,
|
|
398
394
|
promptSnippet: "Consult one constrained read-only subagent and wait for its answer",
|
|
399
395
|
promptGuidelines: [
|
|
400
396
|
"Use subagent_consult only for bounded read-only evidence gathering when an independent perspective is worth making the main agent wait.",
|
|
@@ -451,12 +447,6 @@ function registerSubagentConsult(pi, options, dependencies = {}) {
|
|
|
451
447
|
if (event.toolName !== "subagent_consult") return;
|
|
452
448
|
if (event.details?.isError) return { isError: true };
|
|
453
449
|
});
|
|
454
|
-
return (catalog) => {
|
|
455
|
-
definition.description = catalog ? `${baseDescription()}
|
|
456
|
-
|
|
457
|
-
${catalog}` : baseDescription();
|
|
458
|
-
pi.registerTool(definition);
|
|
459
|
-
};
|
|
460
450
|
}
|
|
461
451
|
function combineAbortSignals(external, owned) {
|
|
462
452
|
if (!external) return { signal: owned, dispose() {
|
|
@@ -487,4 +477,4 @@ export {
|
|
|
487
477
|
SubagentConsultParams,
|
|
488
478
|
registerSubagentConsult
|
|
489
479
|
};
|
|
490
|
-
//# sourceMappingURL=chunk-
|
|
480
|
+
//# sourceMappingURL=chunk-6NSJVPXX.ts.map
|