@ashx-j/lunr 0.2.14 → 0.2.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +24 -1
- package/README.md +4 -4
- package/dist/builtin-extensions/ashxj-tui.d.ts.map +1 -1
- package/dist/builtin-extensions/ashxj-tui.js +4 -4
- package/dist/builtin-extensions/ashxj-tui.js.map +1 -1
- package/dist/builtin-extensions/index.d.ts.map +1 -1
- package/dist/builtin-extensions/index.js +2 -0
- package/dist/builtin-extensions/index.js.map +1 -1
- package/dist/builtin-extensions/lunr-settings-tools.d.ts +4 -0
- package/dist/builtin-extensions/lunr-settings-tools.d.ts.map +1 -0
- package/dist/builtin-extensions/lunr-settings-tools.js +120 -0
- package/dist/builtin-extensions/lunr-settings-tools.js.map +1 -0
- package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.d.ts.map +1 -1
- package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.js +6 -2
- package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-runtime.d.ts +2 -2
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-runtime.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-runtime.js.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-step.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-step.js +3 -3
- package/dist/builtin-extensions/pi-prompt-template-model/subagent-step.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/api/delegation.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/api/delegation.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/api/delegation.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/api/delegation.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.js +2 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.d.ts +5 -11
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js +12 -15
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts +3 -3
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js +14 -27
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js +6 -4
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-job-tracker.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-job-tracker.js +2 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-job-tracker.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.js +6 -4
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-status.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-status.js +4 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-status.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-clarify.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-clarify.js +3 -35
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-clarify.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js +5 -12
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +14 -31
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts +2 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js +28 -22
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts +1 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.js +9 -4
- package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/formatters.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/formatters.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/formatters.js +2 -2
- package/dist/builtin-extensions/pi-subagents/src/shared/formatters.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts +4 -7
- package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/types.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/types.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/delegation-adapters.d.ts +3 -3
- package/dist/builtin-extensions/pi-subagents/src/slash/delegation-adapters.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/delegation-adapters.js +7 -6
- package/dist/builtin-extensions/pi-subagents/src/slash/delegation-adapters.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/delegation-request.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/delegation-request.js +3 -3
- package/dist/builtin-extensions/pi-subagents/src/slash/delegation-request.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js +6 -4
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js +15 -10
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/fleet.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/fleet.js +3 -2
- package/dist/builtin-extensions/pi-subagents/src/tui/fleet.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.js +75 -43
- package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts +5 -1
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +7 -2
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session.d.ts +5 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +68 -10
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +10 -5
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/context-breakdown.d.ts +2 -0
- package/dist/core/context-breakdown.d.ts.map +1 -1
- package/dist/core/context-breakdown.js +6 -2
- package/dist/core/context-breakdown.js.map +1 -1
- package/dist/core/extensions/types.d.ts +2 -2
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/injected-prompt.d.ts +3 -3
- package/dist/core/injected-prompt.d.ts.map +1 -1
- package/dist/core/injected-prompt.js +2 -7
- package/dist/core/injected-prompt.js.map +1 -1
- package/dist/core/large-subagent-launch.d.ts +13 -0
- package/dist/core/large-subagent-launch.d.ts.map +1 -0
- package/dist/core/large-subagent-launch.js +54 -0
- package/dist/core/large-subagent-launch.js.map +1 -0
- package/dist/core/model-instructions.d.ts +24 -0
- package/dist/core/model-instructions.d.ts.map +1 -0
- package/dist/core/model-instructions.js +123 -0
- package/dist/core/model-instructions.js.map +1 -0
- package/dist/core/permissions.d.ts +10 -11
- package/dist/core/permissions.d.ts.map +1 -1
- package/dist/core/permissions.js +107 -40
- package/dist/core/permissions.js.map +1 -1
- package/dist/core/plan-mode.d.ts.map +1 -1
- package/dist/core/plan-mode.js +10 -1
- package/dist/core/plan-mode.js.map +1 -1
- package/dist/core/resource-loader.d.ts +3 -0
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +13 -4
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/runtime-bridges.d.ts +4 -0
- package/dist/core/runtime-bridges.d.ts.map +1 -0
- package/dist/core/runtime-bridges.js +16 -0
- package/dist/core/runtime-bridges.js.map +1 -0
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +1 -0
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/settings-manager.d.ts +13 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +32 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/settings-tools-bridge.d.ts +35 -0
- package/dist/core/settings-tools-bridge.d.ts.map +1 -0
- package/dist/core/settings-tools-bridge.js +56 -0
- package/dist/core/settings-tools-bridge.js.map +1 -0
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +0 -1
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +1 -1
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/gateway/agent-bridge.d.ts.map +1 -1
- package/dist/gateway/agent-bridge.js +3 -2
- package/dist/gateway/agent-bridge.js.map +1 -1
- package/dist/gateway/approval.d.ts.map +1 -1
- package/dist/gateway/approval.js +4 -3
- package/dist/gateway/approval.js.map +1 -1
- package/dist/gateway/commands.d.ts +1 -1
- package/dist/gateway/commands.d.ts.map +1 -1
- package/dist/gateway/commands.js +1 -18
- package/dist/gateway/commands.js.map +1 -1
- package/dist/gateway/cron.d.ts.map +1 -1
- package/dist/gateway/cron.js +3 -2
- package/dist/gateway/cron.js.map +1 -1
- package/dist/gateway/router.d.ts +1 -1
- package/dist/gateway/router.d.ts.map +1 -1
- package/dist/gateway/router.js +1 -1
- package/dist/gateway/router.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +3 -9
- package/dist/main.js.map +1 -1
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +4 -0
- package/dist/migrations.js.map +1 -1
- package/dist/modes/interactive/components/injected-prompt-message.d.ts +1 -1
- package/dist/modes/interactive/components/injected-prompt-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/injected-prompt-message.js +1 -1
- package/dist/modes/interactive/components/injected-prompt-message.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +8 -1
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +61 -1
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +3 -3
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +45 -54
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/docs/compaction.md +5 -3
- package/docs/features.md +7 -7
- package/docs/quickstart.md +2 -1
- package/docs/settings.md +3 -1
- package/docs/termux.md +1 -1
- package/docs/usage.md +2 -2
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/subagent/README.md +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/package.json +4 -4
- package/dist/core/swarm.d.ts +0 -54
- package/dist/core/swarm.d.ts.map +0 -1
- package/dist/core/swarm.js +0 -119
- package/dist/core/swarm.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"goal.js","sourceRoot":"","sources":["../../../../src/builtin-extensions/narumiruna-pi-goal/src/goal.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n// lunr: defineTool imported from the concrete module, NOT the package barrel —\n// the barrel re-exports main.ts which imports this extension (cycle).\nimport { defineTool } from \"../../../core/extensions/types.js\";\nimport { isCronFire } from \"../../../core/cron/fire-guard.js\";\nimport type { ExtensionAPI } from \"@ashx-j/lunr\";\nimport { Type } from \"typebox\";\nimport { Container, Markdown, Text } from \"@ashx-j/lunr-tui\";\nimport { currentTokenTotal } from \"./accounting.js\";\nimport { completeGoalArguments, parseCommand } from \"./command.js\";\nimport { GoalCommandController } from \"./commands.js\";\nimport { type ActiveGoal, loadGoalStateFromSession } from \"./persistence.js\";\nimport { buildGoalPrompt, buildGoalSystemPrompt } from \"./prompts.js\";\nimport { activateQueuedGoal } from \"./queue.js\";\nimport {\n\ttype AssistantMessageLike,\n\tabortCurrentTurn,\n\tblocksStaleGoalToolCalls,\n\tfindFinalAssistantMessage,\n\tformatError,\n\tformatStatus,\n\tGOAL_BLOCKED_TOOL,\n\tGOAL_COMPLETE_TOOL,\n\tGoalRuntime,\n\tgoalIdRejectionReason,\n\tincrementGoal,\n\tisContradictoryCompletionSummary,\n\tisGoalContextOverflow,\n\tisRetryableGoalInterruption,\n\tisUsageLimitedGoalInterruption,\n\tparseUsageResetTimeMs,\n\tSTATUS_KEY,\n\ttype StatusContext,\n\ttransitionGoal,\n\ttruncateNotification,\n} from \"./runtime.js\";\nimport { DEFAULT_GOAL_SETTINGS, readGoalSettings } from \"./settings.js\";\n\n// goal.ts is the Pi-facing composition root: it keeps tool contracts and event\n// ordering together. Per-session mechanisms live in runtime.ts, while user command\n// transitions live in commands.ts. Each factory constructs isolated instances.\n\ninterface GoalCompleteDetails {\n\tgoal: string;\n\tgoal_id: string;\n\tsummary: string;\n}\n\ninterface GoalBlockedDetails {\n\tgoal: string;\n\tgoal_id: string;\n\treason: string;\n\tevidence: string;\n\trepeated_turns: number;\n}\n\ninterface GoalOptions {\n\tsettingsPath?: string;\n}\n\nconst GOAL_COMPLETE_MESSAGE_TYPE = \"goal-complete\";\nconst EXPERIMENTAL_GOALS_WARNING =\n\t\"Experimental ordered goals are enabled for pi-goal. Queue behavior and persisted state may change.\";\nconst MAX_BLOCKER_REASON_LENGTH = 1_000;\nconst MAX_BLOCKER_EVIDENCE_LENGTH = 4_000;\n\nfunction registerGoalRuntime(pi: ExtensionAPI, options: GoalOptions = {}) {\n\tconst runtime = new GoalRuntime(pi);\n\tconst commands = new GoalCommandController(runtime);\n\n\t// Bind per-factory runtime operations once so event orchestration stays concise\n\t// without reintroducing module-global mutable state.\n\tconst clearCompletionStatusTimer = runtime.clearCompletionStatusTimer.bind(runtime);\n\t// lunr: footer refresh timer cleanup\n\tconst clearStatusRefreshTimer = runtime.clearStatusRefreshTimer.bind(runtime);\n\tconst clearContinuationTracking = runtime.clearContinuationTracking.bind(runtime);\n\tconst clearPendingGoalPrompts = runtime.clearPendingGoalPrompts.bind(runtime);\n\tconst clearGoalRecovery = runtime.clearGoalRecovery.bind(runtime);\n\tconst clearBudgetWrapUp = runtime.clearBudgetWrapUp.bind(runtime);\n\tconst clearStaleGoalToolCallBlock = runtime.clearStaleGoalToolCallBlock.bind(runtime);\n\tconst persistGoal = runtime.persistGoal.bind(runtime);\n\tconst updateGoalUsage = runtime.recordGoalUsage.bind(runtime);\n\tconst updateStatus = runtime.updateStatus.bind(runtime);\n\tconst limitActiveGoalForBudget = runtime.limitActiveGoalForBudget.bind(runtime);\n\tconst hideGoalToolsIfLocked = runtime.hideGoalToolsIfLocked.bind(runtime);\n\tconst goalToolsAvailable = runtime.goalToolsAvailable.bind(runtime);\n\tconst pauseGoalForUnavailableTools = runtime.pauseGoalForUnavailableTools.bind(runtime);\n\tconst isPiOwnedCompactionRetry = runtime.isPiOwnedCompactionRetry.bind(runtime);\n\tconst requestContinuation = runtime.requestContinuation.bind(runtime);\n\tconst dispatchContinuationIfSettled = runtime.dispatchContinuationIfSettled.bind(runtime);\n\tconst isGoalToolName = runtime.isGoalToolName.bind(runtime);\n\tconst queueBudgetWrapUp = runtime.queueBudgetWrapUp.bind(runtime);\n\tconst clearGoalRecoveryForGoal = runtime.clearGoalRecoveryForGoal.bind(runtime);\n\tconst blockStaleGoalToolCalls = runtime.blockStaleGoalToolCalls.bind(runtime);\n\tconst cancelContinuationWork = runtime.cancelContinuationWork.bind(runtime);\n\tconst consumeCancelledContinuationPrompt =\n\t\truntime.consumeCancelledContinuationPrompt.bind(runtime);\n\tconst consumeStaleOwnedGoalPrompt = runtime.consumeStaleOwnedGoalPrompt.bind(runtime);\n\tconst consumePendingGoalPrompt = runtime.consumeOwnedGoalPrompt.bind(runtime);\n\tconst markContinuationStarted = runtime.markContinuationStarted.bind(runtime);\n\tconst hasContinuationWorkForGoal = runtime.hasContinuationWorkForGoal.bind(runtime);\n\tconst clearActiveGoal = runtime.clearActiveGoal.bind(runtime);\n\tconst showCompletionStatus = runtime.showCompletionStatus.bind(runtime);\n\tconst restoreGoalToolsHiddenByPolicy = runtime.restoreGoalToolsHiddenByPolicy.bind(runtime);\n\tconst sendOwnedGoalPrompt = (\n\t\t_pi: ExtensionAPI,\n\t\tctx: StatusContext,\n\t\tgoalId: string,\n\t\tprompt: string,\n\t) => runtime.sendOwnedGoalPrompt(ctx, goalId, prompt);\n\tconst dispatchPendingQueueActionIfSettled =\n\t\tcommands.dispatchPendingQueueActionIfSettled.bind(commands);\n\n\tconst emitGoalCompleteMessage = (summary: string) => {\n\t\tconst text = summary.startsWith(\"Goal complete\") ? summary : summary;\n\t\tpi.sendMessage({\n\t\t\tcustomType: GOAL_COMPLETE_MESSAGE_TYPE,\n\t\t\tcontent: [{ type: \"text\", text }],\n\t\t\tdisplay: true,\n\t\t});\n\t};\n\n\tpi.registerMessageRenderer(GOAL_COMPLETE_MESSAGE_TYPE, (message, _options, theme) => {\n\t\tconst raw =\n\t\t\ttypeof message.content === \"string\"\n\t\t\t\t? message.content\n\t\t\t\t: message.content\n\t\t\t\t\t\t.filter((block) => block.type === \"text\")\n\t\t\t\t\t\t.map((block) => (\"text\" in block ? block.text : \"\"))\n\t\t\t\t\t\t.join(\"\\n\");\n\t\tconst c = new Container();\n\t\tc.addChild(new Markdown(`● ${raw}`, 1, 0, undefined, {\n\t\t\tcolor: (content) => theme.fg(\"text\", content),\n\t\t}));\n\t\treturn c;\n\t});\n\n\tconst goalCompleteTool = defineTool({\n\t\tname: GOAL_COMPLETE_TOOL,\n\t\tlabel: \"Goal Complete\",\n\t\tdescription:\n\t\t\t\"Mark the active /goal as complete after all required work is done and verified, using the current goal_id stale-turn guard. Do not use for partial progress, blockers, failing, or unverified work.\",\n\t\tpromptSnippet:\n\t\t\t\"Mark the active /goal as complete after fully finishing and verifying it, with the current goal_id\",\n\t\tpromptGuidelines: [\n\t\t\t\"When a /goal is active, keep working until the goal is complete; do not stop with only a plan or partial progress.\",\n\t\t\t\"Before calling goal_complete, audit the active goal requirement by requirement against the current files, command output, tests, or external state.\",\n\t\t\t\"Pass the exact goal_id shown in the current /goal prompt; never reuse a goal_id from an older, stopped, replaced, or cleared turn.\",\n\t\t\t\"Call goal_complete only after the requested goal is fully implemented, verified, and no known required work remains; otherwise keep working.\",\n\t\t],\n\t\tparameters: Type.Object({\n\t\t\tgoal_id: Type.String({\n\t\t\t\tdescription:\n\t\t\t\t\t\"The exact goal_id shown in the current active /goal prompt. Used only to reject stale completion calls from older turns.\",\n\t\t\t}),\n\t\t\tsummary: Type.String({\n\t\t\t\tdescription:\n\t\t\t\t\t\"State what was completed and what evidence verified it. Do not use this tool to report partial progress, blockers, failures, or remaining work.\",\n\t\t\t}),\n\t\t}),\n\t\tasync execute(_toolCallId, params, _signal, _onUpdate, ctx) {\n\t\t\tconst completedGoal = runtime.activeGoal;\n\t\t\tconst goal = completedGoal?.text ?? \"unknown goal\";\n\t\t\tconst requestedGoalId = typeof params.goal_id === \"string\" ? params.goal_id.trim() : \"\";\n\t\t\tconst summary = typeof params.summary === \"string\" ? params.summary.trim() : \"\";\n\n\t\t\tif (!completedGoal) {\n\t\t\t\tconst rejection = \"Goal completion rejected: no active goal.\";\n\t\t\t\tctx.ui.notify(rejection, \"warning\");\n\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: rejection }],\n\t\t\t\t\tdetails: { goal, goal_id: requestedGoalId, summary } satisfies GoalCompleteDetails,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst completingDuringBudgetWrapUp = runtime.hasActiveBudgetWrapUp();\n\t\t\tif (!runtime.canRecordGoalUsage() && !completingDuringBudgetWrapUp) {\n\t\t\t\tconst rejection = \"Goal completion rejected: current run does not own the active goal.\";\n\t\t\t\tctx.ui.notify(rejection, \"warning\");\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: rejection }],\n\t\t\t\t\tdetails: { goal, goal_id: requestedGoalId, summary } satisfies GoalCompleteDetails,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (hasPendingSkipForGoal(completedGoal.id)) {\n\t\t\t\tupdateGoalUsage(completedGoal, ctx);\n\t\t\t\tpersistGoal(completedGoal);\n\t\t\t\tupdateStatus(ctx, completedGoal);\n\t\t\t\tclearBudgetWrapUp();\n\t\t\t\tconst rejection = \"Goal completion rejected: goal is queued to be skipped.\";\n\t\t\t\tctx.ui.notify(rejection, \"warning\");\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: rejection }],\n\t\t\t\t\tdetails: { goal, goal_id: requestedGoalId, summary } satisfies GoalCompleteDetails,\n\t\t\t\t\tterminate: true,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst staleGoalRejection = goalIdRejectionReason(completedGoal, requestedGoalId);\n\t\t\tif (staleGoalRejection) {\n\t\t\t\tconst rejection = `Goal completion rejected: ${staleGoalRejection}.`;\n\t\t\t\tctx.ui.notify(rejection, \"warning\");\n\t\t\t\tif (completingDuringBudgetWrapUp) {\n\t\t\t\t\tupdateGoalUsage(completedGoal, ctx);\n\t\t\t\t\tpersistGoal(completedGoal);\n\t\t\t\t\tupdateStatus(ctx, completedGoal);\n\t\t\t\t\tclearBudgetWrapUp();\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: rejection }],\n\t\t\t\t\tdetails: { goal, goal_id: requestedGoalId, summary } satisfies GoalCompleteDetails,\n\t\t\t\t\tterminate: completingDuringBudgetWrapUp || undefined,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (completedGoal.status !== \"active\" && !completingDuringBudgetWrapUp) {\n\t\t\t\tconst rejection = `Goal completion rejected: goal is ${completedGoal.status}, not active.`;\n\t\t\t\tctx.ui.notify(rejection, \"warning\");\n\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: rejection }],\n\t\t\t\t\tdetails: { goal, goal_id: requestedGoalId, summary } satisfies GoalCompleteDetails,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst rejectionReason = !summary\n\t\t\t\t? \"summary is empty\"\n\t\t\t\t: isContradictoryCompletionSummary(summary)\n\t\t\t\t\t? \"summary says the goal is not complete\"\n\t\t\t\t\t: undefined;\n\t\t\tif (rejectionReason) {\n\t\t\t\tupdateGoalUsage(completedGoal, ctx);\n\t\t\t\tpersistGoal(completedGoal);\n\t\t\t\tupdateStatus(ctx, completedGoal);\n\t\t\t\tconst rejection = `Goal completion rejected: ${rejectionReason}.`;\n\t\t\t\tctx.ui.notify(rejection, \"warning\");\n\t\t\t\tif (completingDuringBudgetWrapUp) clearBudgetWrapUp();\n\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: rejection,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tdetails: { goal, goal_id: requestedGoalId, summary } satisfies GoalCompleteDetails,\n\t\t\t\t\tterminate: completingDuringBudgetWrapUp || undefined,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\truntime.activeGoal = transitionGoal(completedGoal, \"complete\");\n\t\t\tupdateGoalUsage(runtime.activeGoal, ctx);\n\t\t\tif (runtime.pendingQueueAction?.kind === \"prioritize\") {\n\t\t\t\tpersistGoal(runtime.activeGoal);\n\t\t\t\tctx.ui.setStatus(STATUS_KEY, \"complete\");\n\t\t\t\temitGoalCompleteMessage(summary);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: `Goal complete: ${summary}` }],\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\tgoal,\n\t\t\t\t\t\tgoal_id: requestedGoalId,\n\t\t\t\t\t\tsummary,\n\t\t\t\t\t} satisfies GoalCompleteDetails,\n\t\t\t\t\tterminate: true,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (runtime.queuedGoals.length > 0) {\n\t\t\t\truntime.pendingQueueAction = {\n\t\t\t\t\tkind: \"advance\",\n\t\t\t\t\tgoalId: runtime.activeGoal.id,\n\t\t\t\t\treason: \"complete\",\n\t\t\t\t\tcompletedText: goal,\n\t\t\t\t};\n\t\t\t\tpersistGoal(runtime.activeGoal);\n\t\t\t\tctx.ui.setStatus(STATUS_KEY, \"complete\");\n\t\t\t\temitGoalCompleteMessage(summary);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: `Goal complete: ${summary}\\nNext goal queued: ${runtime.queuedGoals[0]?.text}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\tgoal,\n\t\t\t\t\t\tgoal_id: requestedGoalId,\n\t\t\t\t\t\tsummary,\n\t\t\t\t\t} satisfies GoalCompleteDetails,\n\t\t\t\t\tterminate: true,\n\t\t\t\t};\n\t\t\t}\n\t\t\tpersistGoal(runtime.activeGoal);\n\n\t\t\tctx.ui.setStatus(STATUS_KEY, formatStatus(runtime.activeGoal));\n\t\t\tclearActiveGoal(ctx);\n\t\t\tshowCompletionStatus(ctx);\n\t\t\temitGoalCompleteMessage(summary);\n\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: `Goal complete: ${summary}` }],\n\t\t\t\tdetails: { goal, goal_id: requestedGoalId, summary } satisfies GoalCompleteDetails,\n\t\t\t\tterminate: true,\n\t\t\t};\n\t\t},\n\t\trenderResult(_result, { isPartial }, theme) {\n\t\t\tif (isPartial) return new Text(theme.fg(\"warning\", \"Completing goal...\"), 0, 0);\n\t\t\treturn { render: () => [], invalidate() {} };\n\t\t},\n\t});\n\n\tconst goalBlockedTool = defineTool({\n\t\tname: GOAL_BLOCKED_TOOL,\n\t\tlabel: \"Goal Blocked\",\n\t\tdescription:\n\t\t\t\"Stop the active /goal only at a true impasse after the same blocker recurs for at least three consecutive goal turns, with the current goal_id and concrete evidence that user or external action is required. Do not use for ordinary clarification, uncertainty, or recoverable failures.\",\n\t\tpromptSnippet:\n\t\t\t\"Mark the active /goal blocked only after the same blocker recurs for three consecutive goal turns\",\n\t\tpromptGuidelines: [\n\t\t\t\"Use goal_blocked only for a true impasse after the same blocker recurs for at least three consecutive goal turns and concrete evidence shows user or external action is required.\",\n\t\t\t\"After a blocked goal is resumed, start a fresh three-turn blocker audit before using goal_blocked again.\",\n\t\t\t\"Do not use goal_blocked for ordinary clarification, incomplete work, uncertainty, difficult tasks, or recoverable tool/provider failures.\",\n\t\t\t\"Pass goal_blocked the exact current goal_id; never reuse a goal_id from an older, stopped, replaced, or cleared goal turn.\",\n\t\t],\n\t\tparameters: Type.Object({\n\t\t\tgoal_id: Type.String({\n\t\t\t\tdescription: \"The exact goal_id shown in the current active /goal prompt.\",\n\t\t\t}),\n\t\t\treason: Type.String({\n\t\t\t\tminLength: 1,\n\t\t\t\tmaxLength: MAX_BLOCKER_REASON_LENGTH,\n\t\t\t\tdescription: \"The specific user or external action required to unblock the goal.\",\n\t\t\t}),\n\t\t\tevidence: Type.String({\n\t\t\t\tminLength: 1,\n\t\t\t\tmaxLength: MAX_BLOCKER_EVIDENCE_LENGTH,\n\t\t\t\tdescription: \"Concrete evidence from the repeated attempts that proves the impasse.\",\n\t\t\t}),\n\t\t\trepeated_turns: Type.Integer({\n\t\t\t\tminimum: 3,\n\t\t\t\tdescription: \"Number of separate turns spent trying to resolve this same blocker.\",\n\t\t\t}),\n\t\t}),\n\t\tasync execute(_toolCallId, params, _signal, _onUpdate, ctx) {\n\t\t\tconst blockedGoal = runtime.activeGoal;\n\t\t\tconst goal = blockedGoal?.text ?? \"unknown goal\";\n\t\t\tconst requestedGoalId = typeof params.goal_id === \"string\" ? params.goal_id.trim() : \"\";\n\t\t\tconst reason = typeof params.reason === \"string\" ? params.reason.trim() : \"\";\n\t\t\tconst evidence = typeof params.evidence === \"string\" ? params.evidence.trim() : \"\";\n\t\t\tconst repeatedTurns =\n\t\t\t\ttypeof params.repeated_turns === \"number\" ? params.repeated_turns : Number.NaN;\n\t\t\tconst reject = (rejectionReason: string, terminate = false) => {\n\t\t\t\tconst rejection = `goal_blocked rejected: ${rejectionReason}.`;\n\t\t\t\tctx.ui.notify(rejection, \"warning\");\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\" as const, text: rejection }],\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\tgoal,\n\t\t\t\t\t\tgoal_id: requestedGoalId,\n\t\t\t\t\t\treason: reason.slice(0, MAX_BLOCKER_REASON_LENGTH),\n\t\t\t\t\t\tevidence: evidence.slice(0, MAX_BLOCKER_EVIDENCE_LENGTH),\n\t\t\t\t\t\trepeated_turns: Number.isFinite(repeatedTurns) ? repeatedTurns : 0,\n\t\t\t\t\t} satisfies GoalBlockedDetails,\n\t\t\t\t\t...(terminate ? { terminate: true as const } : {}),\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tif (!blockedGoal) return reject(\"no active goal\");\n\t\t\tif (!runtime.canRecordGoalUsage()) {\n\t\t\t\treturn reject(\"current run does not own the active goal\");\n\t\t\t}\n\t\t\tif (hasPendingSkipForGoal(blockedGoal.id)) {\n\t\t\t\tupdateGoalUsage(blockedGoal, ctx);\n\t\t\t\tpersistGoal(blockedGoal);\n\t\t\t\tupdateStatus(ctx, blockedGoal);\n\t\t\t\tclearBudgetWrapUp();\n\t\t\t\treturn reject(\"goal is queued to be skipped\", true);\n\t\t\t}\n\t\t\tconst staleGoalRejection = goalIdRejectionReason(blockedGoal, requestedGoalId);\n\t\t\tif (staleGoalRejection) return reject(staleGoalRejection);\n\t\t\tif (blockedGoal.status !== \"active\") {\n\t\t\t\treturn reject(`goal is ${blockedGoal.status}, not active`);\n\t\t\t}\n\t\t\tif (!reason) return reject(\"reason is empty\");\n\t\t\tif (reason.length > MAX_BLOCKER_REASON_LENGTH) return reject(\"reason is too long\");\n\t\t\tif (!evidence) return reject(\"evidence is empty\");\n\t\t\tif (evidence.length > MAX_BLOCKER_EVIDENCE_LENGTH) return reject(\"evidence is too long\");\n\t\t\tif (!Number.isInteger(repeatedTurns)) return reject(\"repeated_turns must be a whole number\");\n\t\t\tif (repeatedTurns < 3) return reject(\"repeated_turns must be at least 3\");\n\n\t\t\tupdateGoalUsage(blockedGoal, ctx);\n\t\t\tcancelContinuationWork();\n\t\t\tclearBudgetWrapUp();\n\t\t\tclearGoalRecoveryForGoal(blockedGoal.id);\n\t\t\tblockStaleGoalToolCalls();\n\t\t\truntime.activeGoal = transitionGoal(blockedGoal, \"blocked\");\n\t\t\tpersistGoal(runtime.activeGoal);\n\t\t\tupdateStatus(ctx, runtime.activeGoal);\n\t\t\tctx.ui.notify(`Goal blocked: ${truncateNotification(reason)}`, \"warning\");\n\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: `Goal blocked: ${reason}` }],\n\t\t\t\tdetails: {\n\t\t\t\t\tgoal,\n\t\t\t\t\tgoal_id: requestedGoalId,\n\t\t\t\t\treason,\n\t\t\t\t\tevidence,\n\t\t\t\t\trepeated_turns: repeatedTurns,\n\t\t\t\t} satisfies GoalBlockedDetails,\n\t\t\t\tterminate: true,\n\t\t\t};\n\t\t},\n\t});\n\n\tpi.registerTool(goalCompleteTool);\n\tpi.registerTool(goalBlockedTool);\n\t// Do not touch the active tool set during factory registration: ExtensionAPI\n\t// actions are unbound until the session binds the runtime. session_start applies\n\t// baseline visibility once actions work; later hooks only enforce goal safety.\n\n\tpi.registerCommand(\"goal\", {\n\t\tdescription: \"Run a goal to completion: /goal [--tokens 100k] <goal_to_complete>\",\n\t\tgetArgumentCompletions: (prefix) =>\n\t\t\tcompleteGoalArguments(prefix, {\n\t\t\t\texperimentalGoals: runtime.settings.experimental.goals,\n\t\t\t}),\n\t\thandler: async (args, ctx) => {\n\t\t\tconst result = parseCommand(args, {\n\t\t\t\texperimentalGoals: runtime.settings.experimental.goals,\n\t\t\t});\n\t\t\tif (typeof result === \"string\") {\n\t\t\t\tctx.ui.notify(result, \"warning\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (runtime.queueFrozen) {\n\t\t\t\tif (result.kind === \"show\") commands.showGoal(ctx);\n\t\t\t\telse if (result.kind === \"clear\") commands.clearGoal(ctx);\n\t\t\t\telse commands.notifyFrozenQueue(ctx);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (runtime.pendingQueueAction && result.kind !== \"show\" && result.kind !== \"clear\") {\n\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\"A queued goal change is waiting for Pi to settle. Retry after it finishes.\",\n\t\t\t\t\t\"warning\",\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tswitch (result.kind) {\n\t\t\t\tcase \"show\":\n\t\t\t\t\tcommands.showGoal(ctx);\n\t\t\t\t\treturn;\n\t\t\t\tcase \"pause\":\n\t\t\t\t\tcommands.pauseGoal(ctx);\n\t\t\t\t\treturn;\n\t\t\t\tcase \"resume\":\n\t\t\t\t\tawait commands.resumeGoal(ctx);\n\t\t\t\t\treturn;\n\t\t\t\tcase \"clear\":\n\t\t\t\t\tcommands.clearGoal(ctx);\n\t\t\t\t\treturn;\n\t\t\t\tcase \"edit\":\n\t\t\t\t\tawait commands.editGoal(result.objective ?? \"\", result.tokenBudget, ctx);\n\t\t\t\t\treturn;\n\t\t\t\tcase \"add\":\n\t\t\t\t\tawait commands.addGoal(result.objective ?? \"\", result.tokenBudget, ctx);\n\t\t\t\t\treturn;\n\t\t\t\tcase \"prioritize\":\n\t\t\t\t\tawait commands.prioritizeGoal(result.objective ?? \"\", result.tokenBudget, ctx);\n\t\t\t\t\treturn;\n\t\t\t\tcase \"drop-last\":\n\t\t\t\t\tcommands.dropLastGoal(ctx);\n\t\t\t\t\treturn;\n\t\t\t\tcase \"skip\":\n\t\t\t\t\tawait commands.skipGoal(ctx);\n\t\t\t\t\treturn;\n\t\t\t\tcase \"start\":\n\t\t\t\t\tawait commands.startGoal(result.objective ?? \"\", result.tokenBudget, ctx);\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t},\n\t});\n\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tclearCompletionStatusTimer();\n\t\tclearStatusRefreshTimer(); // lunr\n\t\tclearContinuationTracking();\n\t\tclearPendingGoalPrompts();\n\t\truntime.agentRunGoalId = undefined;\n\t\tclearGoalRecovery();\n\t\tclearBudgetWrapUp();\n\t\tclearStaleGoalToolCallBlock();\n\t\truntime.queuedGoals = [];\n\t\truntime.pendingQueueAction = undefined;\n\t\truntime.queueFrozen = false;\n\t\tconst previousToolVisibility = runtime.settings.toolVisibility;\n\t\tconst settingsResult = readGoalSettings(options.settingsPath);\n\t\truntime.settings =\n\t\t\tsettingsResult.kind === \"loaded\" ? settingsResult.settings : DEFAULT_GOAL_SETTINGS;\n\t\tif (settingsResult.kind === \"invalid\") {\n\t\t\tctx.ui.notify(\n\t\t\t\t`pi-goal settings ignored: ${settingsResult.reason}. Using default settings.`,\n\t\t\t\t\"warning\",\n\t\t\t);\n\t\t}\n\t\tif (runtime.settings.experimental.goals) {\n\t\t\tctx.ui.notify(EXPERIMENTAL_GOALS_WARNING, \"warning\");\n\t\t}\n\t\tif (\n\t\t\truntime.settings.toolVisibility === \"after-first-goal\" &&\n\t\t\tpreviousToolVisibility === \"always\"\n\t\t) {\n\t\t\truntime.goalToolsUnlocked = false;\n\t\t}\n\t\tif (runtime.settings.toolVisibility === \"always\") {\n\t\t\tif (runtime.goalToolsHiddenByPolicy.size > 0) {\n\t\t\t\ttry {\n\t\t\t\t\trestoreGoalToolsHiddenByPolicy();\n\t\t\t\t} catch (error) {\n\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t`Could not restore always-visible goal tools: ${formatError(error)}`,\n\t\t\t\t\t\t\"error\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\truntime.goalToolsUnlocked = true;\n\t\t}\n\n\t\tconst loaded = loadGoalStateFromSession(ctx);\n\t\truntime.activeGoal = loaded.goal;\n\t\truntime.queuedGoals = loaded.queue;\n\t\truntime.pendingQueueAction = loaded.pendingAction;\n\t\truntime.queueFrozen = loaded.hasExperimentalQueueState && !runtime.settings.experimental.goals;\n\t\tif (runtime.queueFrozen) {\n\t\t\tif (runtime.activeGoal) persistGoal(runtime.activeGoal);\n\t\t\tctx.ui.setStatus(STATUS_KEY, \"queue off\");\n\t\t\tctx.ui.notify(\n\t\t\t\t\"An experimental goal queue is frozen because experimental.goals is disabled. Re-enable it and run /reload to continue, or use /goal clear.\",\n\t\t\t\t\"warning\",\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tlet startRestoredQueuedGoal = false;\n\t\tif (runtime.activeGoal?.status === \"queued\" && !runtime.pendingQueueAction) {\n\t\t\truntime.activeGoal = activateQueuedGoal(runtime.activeGoal, currentTokenTotal(ctx));\n\t\t\tstartRestoredQueuedGoal = runtime.activeGoal.status === \"active\";\n\t\t}\n\t\tif (runtime.pendingQueueAction) await dispatchPendingQueueActionIfSettled(ctx);\n\t\tif (runtime.activeGoal) {\n\t\t\tif (runtime.activeGoal.status === \"active\") {\n\t\t\t\tupdateGoalUsage(runtime.activeGoal, ctx);\n\t\t\t\tif (limitActiveGoalForBudget(ctx, false)) return;\n\t\t\t}\n\t\t\tif (runtime.settings.toolVisibility === \"after-first-goal\") {\n\t\t\t\t// Registered tools are already active on an unrestricted fresh runtime.\n\t\t\t\t// If an earlier session_start handler removed them, that restrictive\n\t\t\t\t// policy wins: mark lazy visibility unlocked without widening its set.\n\t\t\t\truntime.goalToolsUnlocked = true;\n\t\t\t\truntime.goalToolsHiddenByPolicy.clear();\n\t\t\t}\n\t\t\tif (runtime.activeGoal.status === \"active\" && !goalToolsAvailable()) {\n\t\t\t\tpauseGoalForUnavailableTools(ctx, false);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tpersistGoal(runtime.activeGoal);\n\t\t\tupdateStatus(ctx, runtime.activeGoal);\n\t\t\tif (startRestoredQueuedGoal) {\n\t\t\t\tconst restoredGoal = runtime.activeGoal;\n\t\t\t\tconst sent = await sendOwnedGoalPrompt(\n\t\t\t\t\truntime.pi,\n\t\t\t\t\tctx,\n\t\t\t\t\trestoredGoal.id,\n\t\t\t\t\tbuildGoalPrompt(restoredGoal),\n\t\t\t\t);\n\t\t\t\tif (!sent && runtime.activeGoal?.id === restoredGoal.id) {\n\t\t\t\t\truntime.activeGoal = transitionGoal(restoredGoal, \"paused\");\n\t\t\t\t\tblockStaleGoalToolCalls();\n\t\t\t\t\tpersistGoal(runtime.activeGoal);\n\t\t\t\t\tupdateStatus(ctx, runtime.activeGoal);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (runtime.settings.toolVisibility === \"after-first-goal\" && !runtime.goalToolsUnlocked) {\n\t\t\t\thideGoalToolsIfLocked();\n\t\t\t}\n\t\t\tctx.ui.setStatus(STATUS_KEY, undefined);\n\t\t}\n\t});\n\n\tpi.on(\"session_shutdown\", (_event, ctx) => {\n\t\tif (runtime.activeGoal) {\n\t\t\tif (!runtime.queueFrozen && runtime.activeGoal.status === \"active\") {\n\t\t\t\tupdateGoalUsage(runtime.activeGoal, ctx, false);\n\t\t\t}\n\t\t\tpersistGoal(runtime.activeGoal);\n\t\t}\n\t\tclearContinuationTracking();\n\t\tclearPendingGoalPrompts();\n\t\truntime.agentRunGoalId = undefined;\n\t\tclearGoalRecovery();\n\t\tclearBudgetWrapUp();\n\t\tclearStaleGoalToolCallBlock();\n\t\truntime.activeGoal = undefined;\n\t\truntime.queuedGoals = [];\n\t\truntime.pendingQueueAction = undefined;\n\t\truntime.queueFrozen = false;\n\t\tctx.ui.setStatus(STATUS_KEY, undefined);\n\t\tclearCompletionStatusTimer();\n\t\tclearStatusRefreshTimer(); // lunr\n\t});\n\n\tpi.on(\"session_before_compact\", (event, ctx) => {\n\t\tif (runtime.queueFrozen) return;\n\t\tif (runtime.activeGoal?.status === \"budget_limited\") {\n\t\t\tif ((event as { willRetry?: boolean }).willRetry === true) return { cancel: true as const };\n\t\t\treturn;\n\t\t}\n\t\tif (runtime.activeGoal?.status !== \"active\") return;\n\t\tif (!updateGoalUsage(runtime.activeGoal, ctx)) return;\n\t\tcancelContinuationWork();\n\t\tpersistGoal(runtime.activeGoal);\n\t\tupdateStatus(ctx, runtime.activeGoal);\n\t\tif (runtime.pendingQueueAction) return;\n\t\tif (limitActiveGoalForBudget(ctx, false)) return { cancel: true as const };\n\t});\n\n\tpi.on(\"session_compact\", async (event, ctx) => {\n\t\tif (runtime.queueFrozen) return;\n\t\tif (runtime.activeGoal?.status !== \"active\") {\n\t\t\tclearGoalRecovery();\n\t\t\tif (runtime.pendingQueueAction) await dispatchPendingQueueActionIfSettled(ctx);\n\t\t\treturn;\n\t\t}\n\n\t\tconst restoredState = loadGoalStateFromSession(ctx);\n\t\tif (restoredState.goal?.id === runtime.activeGoal.id) {\n\t\t\truntime.activeGoal = restoredState.goal;\n\t\t\truntime.queuedGoals = restoredState.queue;\n\t\t\truntime.pendingQueueAction = restoredState.pendingAction;\n\t\t}\n\t\tconst usageRecorded = updateGoalUsage(runtime.activeGoal, ctx);\n\t\tif (usageRecorded) {\n\t\t\tpersistGoal(runtime.activeGoal);\n\t\t\tupdateStatus(ctx, runtime.activeGoal);\n\t\t}\n\t\tif (runtime.pendingQueueAction) {\n\t\t\tawait dispatchPendingQueueActionIfSettled(ctx);\n\t\t\treturn;\n\t\t}\n\t\tif (!usageRecorded) return;\n\t\tif (limitActiveGoalForBudget(ctx, false)) return;\n\n\t\tconst wasPiRetry = isPiOwnedCompactionRetry(event, runtime.activeGoal.id);\n\t\tclearGoalRecoveryForGoal(runtime.activeGoal.id);\n\t\tif (wasPiRetry) return;\n\t\trequestContinuation(runtime.activeGoal);\n\t\t// Manual compaction does not emit agent_settled. This common dispatcher is\n\t\t// therefore the narrow fallback; threshold compaction leaves the intent for\n\t\t// agent_settled when Pi is still busy.\n\t\tdispatchContinuationIfSettled(ctx);\n\t});\n\n\tpi.on(\"input\", (event) => {\n\t\tif (event.source === \"extension\") {\n\t\t\tif (\n\t\t\t\tconsumeCancelledContinuationPrompt(event.text) ||\n\t\t\t\tconsumeStaleOwnedGoalPrompt(event.text)\n\t\t\t) {\n\t\t\t\treturn { action: \"handled\" as const };\n\t\t\t}\n\t\t\tif (runtime.queueFrozen) return;\n\t\t\tclearGoalRecovery();\n\t\t\treturn;\n\t\t}\n\t\tif (runtime.queueFrozen) return;\n\t\tif (/^\\/goal(?:\\s|$)/u.test(event.text.trimStart())) return;\n\t\tclearGoalRecovery();\n\t\tclearBudgetWrapUp();\n\t\tclearStaleGoalToolCallBlock();\n\t});\n\n\t// lunr: the previous context-event filter dropped superseded budget\n\t// wrap-up messages from request context. That breaks Anthropic prefix\n\t// continuity (full cache miss from the cut). The wrap-up custom message\n\t// is small; keeping history unfiltered is cheaper than a cache rewrite.\n\t// keepBudgetWrapUpMessage remains on the runtime if a future token-saving\n\t// path can prove the wrap-up was never sent.\n\n\tpi.on(\"tool_call\", (event, ctx) => {\n\t\tif (runtime.queueFrozen) {\n\t\t\tif (!isGoalToolName(event.toolName)) return;\n\t\t\treturn {\n\t\t\t\tblock: true,\n\t\t\t\treason:\n\t\t\t\t\t\"The experimental goal queue is frozen. Re-enable experimental.goals and run /reload, or use /goal clear.\",\n\t\t\t};\n\t\t}\n\t\t// lunr: mask locked goal tools instead of removing them from the active\n\t\t// list (setActiveTools churn busts the tools+system cache prefix).\n\t\tif (isGoalToolName(event.toolName) && runtime.areGoalToolsLocked()) {\n\t\t\treturn {\n\t\t\t\tblock: true,\n\t\t\t\treason: \"Goal tools are locked until a /goal is activated.\",\n\t\t\t};\n\t\t}\n\t\tif (\n\t\t\truntime.activeGoal?.status === \"budget_limited\" &&\n\t\t\truntime.budgetWrapUp?.goalId === runtime.activeGoal.id &&\n\t\t\tevent.toolName !== \"goal_complete\"\n\t\t) {\n\t\t\t// A blocked tool result would normally trigger another model call. Abort the\n\t\t\t// wrap-up instead so a tool-seeking model cannot create an unbounded loop.\n\t\t\tabortCurrentTurn(ctx);\n\t\t\treturn {\n\t\t\t\tblock: true,\n\t\t\t\treason: \"Goal token budget is exhausted; only goal_complete is allowed during wrap-up.\",\n\t\t\t};\n\t\t}\n\t\tif (!runtime.staleGoalToolCallsBlocked) return;\n\t\tif (!runtime.activeGoal || !blocksStaleGoalToolCalls(runtime.activeGoal.status)) {\n\t\t\tclearStaleGoalToolCallBlock();\n\t\t\treturn;\n\t\t}\n\t\treturn {\n\t\t\tblock: true,\n\t\t\treason: \"Blocked stale /goal tool call after the goal stopped or was interrupted.\",\n\t\t};\n\t});\n\n\tpi.on(\"tool_execution_end\", (_event, ctx) => {\n\t\tif (runtime.queueFrozen) return;\n\t\tif (\n\t\t\truntime.activeGoal?.status === \"budget_limited\" &&\n\t\t\truntime.budgetWrapUp?.goalId === runtime.activeGoal.id &&\n\t\t\t!runtime.budgetWrapUp.delivered\n\t\t) {\n\t\t\tqueueBudgetWrapUp(ctx, runtime.activeGoal);\n\t\t\treturn;\n\t\t}\n\t\tif (runtime.activeGoal?.status !== \"active\") return;\n\n\t\t// AgentSession persists assistant message_end before tool execution events,\n\t\t// so the completed assistant call's usage is authoritative at this boundary.\n\t\tif (!updateGoalUsage(runtime.activeGoal, ctx)) return;\n\t\tpersistGoal(runtime.activeGoal);\n\t\tupdateStatus(ctx, runtime.activeGoal);\n\t\tif (limitActiveGoalForBudget(ctx, true)) return;\n\t\tif (!goalToolsAvailable()) pauseGoalForUnavailableTools(ctx);\n\t});\n\n\tpi.on(\"before_agent_start\", (event, ctx) => {\n\t\tif (runtime.queueFrozen) {\n\t\t\truntime.agentRunGoalId = undefined;\n\t\t\treturn;\n\t\t}\n\t\tconst goalPromptGoalId = consumePendingGoalPrompt(event.prompt);\n\t\tconst continuationGoalId = goalPromptGoalId ? undefined : markContinuationStarted(event.prompt);\n\t\tconst ownedPromptGoalId = goalPromptGoalId ?? continuationGoalId;\n\t\tconst activeBudgetWrapUp = runtime.hasActiveBudgetWrapUp();\n\t\tconst activeGoalRecovery = runtime.hasActiveGoalRecovery();\n\t\t// lunr: auto-resume a usage_limited goal on a wake-up turn. Two triggers:\n\t\t// - resumeAfter was parsed from the provider error and has elapsed (any turn\n\t\t// resumes — the reset time is known, so the goal should not stay parked);\n\t\t// - no reset time was parseable: only a cron-fired turn resumes (the user\n\t\t// scheduled the wake-up explicitly; ordinary manual turns don't hijack —\n\t\t// /goal resume stays the manual path).\n\t\t// Gateway cron fires are headless and cannot see this session's goal.\n\t\tconst resumeAfter = runtime.activeGoal?.resumeAfter;\n\t\tconst resumeDue = resumeAfter !== undefined && Date.now() >= resumeAfter;\n\t\tconst cronWakeUp = resumeAfter === undefined && isCronFire();\n\t\tif (\n\t\t\truntime.activeGoal?.status === \"usage_limited\" &&\n\t\t\t(resumeDue || cronWakeUp) &&\n\t\t\t!ownedPromptGoalId &&\n\t\t\t!activeBudgetWrapUp &&\n\t\t\t!activeGoalRecovery\n\t\t) {\n\t\t\tconst resumed = runtime.reactivateGoalForResume(ctx);\n\t\t\tif (resumed) {\n\t\t\t\truntime.agentRunGoalId = resumed.id;\n\t\t\t\tif (!goalToolsAvailable()) {\n\t\t\t\t\tpauseGoalForUnavailableTools(ctx, false);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tsystemPrompt: event.systemPrompt + \"\\n\\n\" + buildGoalSystemPrompt(runtime.activeGoal),\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\tif (\n\t\t\truntime.pendingQueueAction?.kind === \"prioritize\" &&\n\t\t\t!activeBudgetWrapUp &&\n\t\t\t!activeGoalRecovery\n\t\t) {\n\t\t\t// A turn that starts after priority intent is committed belongs to neither\n\t\t\t// the displaced goal nor the not-yet-activated urgent goal. Persist the\n\t\t\t// displaced goal's final accounting boundary so reload cannot absorb this run.\n\t\t\tif (!runtime.pendingQueueAction.displacedUsageFinalized) {\n\t\t\t\tif (runtime.activeGoal?.status === \"active\") {\n\t\t\t\t\tupdateGoalUsage(runtime.activeGoal, ctx, false);\n\t\t\t\t}\n\t\t\t\truntime.pendingQueueAction.displacedUsageFinalized = true;\n\t\t\t\tif (runtime.activeGoal) {\n\t\t\t\t\tpersistGoal(runtime.activeGoal);\n\t\t\t\t\tupdateStatus(ctx, runtime.activeGoal);\n\t\t\t\t}\n\t\t\t}\n\t\t\truntime.agentRunGoalId = null;\n\t\t\tif (ownedPromptGoalId) abortCurrentTurn(ctx);\n\t\t\treturn;\n\t\t}\n\t\tif (activeBudgetWrapUp && runtime.activeGoal) {\n\t\t\truntime.agentRunGoalId = runtime.activeGoal.id;\n\t\t\treturn;\n\t\t}\n\t\tif (\n\t\t\truntime.pendingQueueAction?.kind === \"advance\" &&\n\t\t\truntime.pendingQueueAction.goalId === runtime.activeGoal?.id\n\t\t) {\n\t\t\truntime.agentRunGoalId = ownedPromptGoalId ?? runtime.activeGoal.id;\n\t\t\tif (ownedPromptGoalId) abortCurrentTurn(ctx);\n\t\t\treturn;\n\t\t}\n\t\tif (ownedPromptGoalId && ownedPromptGoalId !== runtime.activeGoal?.id) {\n\t\t\truntime.agentRunGoalId = ownedPromptGoalId;\n\t\t\tif (runtime.activeGoal?.status === \"active\" && !goalToolsAvailable()) {\n\t\t\t\tpauseGoalForUnavailableTools(ctx, false);\n\t\t\t}\n\t\t\tabortCurrentTurn(ctx);\n\t\t\treturn;\n\t\t}\n\t\tif (runtime.activeGoal?.status !== \"active\") {\n\t\t\truntime.agentRunGoalId = undefined;\n\t\t\treturn;\n\t\t}\n\t\truntime.agentRunGoalId = runtime.activeGoal.id;\n\t\tif (!goalToolsAvailable()) {\n\t\t\tpauseGoalForUnavailableTools(ctx, ownedPromptGoalId !== undefined);\n\t\t\treturn;\n\t\t}\n\n\t\treturn {\n\t\t\tsystemPrompt: `${event.systemPrompt}\\n\\n${buildGoalSystemPrompt(runtime.activeGoal)}`,\n\t\t};\n\t});\n\n\tpi.on(\"agent_end\", (event, ctx) => {\n\t\tif (runtime.queueFrozen) return;\n\t\tconst agentRunGoalId = runtime.agentRunGoalId;\n\t\truntime.agentRunGoalId = undefined;\n\t\tif (\n\t\t\tagentRunGoalId === null ||\n\t\t\t(!runtime.canRecordGoalUsage() && !runtime.hasActiveBudgetWrapUp())\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tif (agentRunGoalId && agentRunGoalId !== runtime.activeGoal?.id) return;\n\t\tif (!runtime.activeGoal) return;\n\t\tif (\n\t\t\truntime.activeGoal.status === \"budget_limited\" &&\n\t\t\truntime.budgetWrapUp?.goalId === runtime.activeGoal.id\n\t\t) {\n\t\t\tupdateGoalUsage(runtime.activeGoal, ctx);\n\t\t\tpersistGoal(runtime.activeGoal);\n\t\t\tupdateStatus(ctx, runtime.activeGoal);\n\t\t\tclearBudgetWrapUp();\n\t\t\treturn;\n\t\t}\n\t\tif (runtime.activeGoal.status !== \"active\") return;\n\t\tif (\n\t\t\truntime.pendingQueueAction?.kind === \"advance\" &&\n\t\t\truntime.pendingQueueAction.goalId === runtime.activeGoal.id\n\t\t) {\n\t\t\tupdateGoalUsage(runtime.activeGoal, ctx);\n\t\t\tpersistGoal(runtime.activeGoal);\n\t\t\tupdateStatus(ctx, runtime.activeGoal);\n\t\t\treturn;\n\t\t}\n\n\t\tconst goalId = runtime.activeGoal.id;\n\t\tconst alreadyAwaitingContinuation = hasContinuationWorkForGoal(goalId);\n\t\tconst finalAssistant = findFinalAssistantMessage(event.messages);\n\n\t\tif (!alreadyAwaitingContinuation) runtime.activeGoal = incrementGoal(runtime.activeGoal);\n\t\tupdateGoalUsage(runtime.activeGoal, ctx);\n\n\t\tif (finalAssistant?.stopReason === \"aborted\") {\n\t\t\tclearGoalRecoveryForGoal(goalId);\n\t\t\tstopGoalAfterAgentEnd(ctx, runtime.activeGoal, finalAssistant, \"paused\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (finalAssistant?.stopReason === \"error\") {\n\t\t\tif (isRetryableGoalInterruption(finalAssistant)) {\n\t\t\t\tif (limitActiveGoalForBudget(ctx, false)) return;\n\t\t\t\tif (!goalToolsAvailable()) {\n\t\t\t\t\tpauseGoalForUnavailableTools(ctx);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\truntime.goalRecovery = {\n\t\t\t\t\tgoalId,\n\t\t\t\t\tkind: isGoalContextOverflow(finalAssistant) ? \"compaction_retry\" : \"provider_retry\",\n\t\t\t\t};\n\t\t\t\tcancelContinuationWork();\n\t\t\t\tpersistGoal(runtime.activeGoal);\n\t\t\t\tupdateStatus(ctx, runtime.activeGoal);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tclearGoalRecoveryForGoal(goalId);\n\t\t\tstopGoalAfterAgentEnd(\n\t\t\t\tctx,\n\t\t\t\truntime.activeGoal,\n\t\t\t\tfinalAssistant,\n\t\t\t\tisUsageLimitedGoalInterruption(finalAssistant) ? \"usage_limited\" : \"blocked\",\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tclearGoalRecoveryForGoal(goalId);\n\n\t\tif (limitActiveGoalForBudget(ctx, false)) return;\n\t\tif (!goalToolsAvailable()) {\n\t\t\tpauseGoalForUnavailableTools(ctx);\n\t\t\treturn;\n\t\t}\n\n\t\tpersistGoal(runtime.activeGoal);\n\t\tupdateStatus(ctx, runtime.activeGoal);\n\n\t\tconst currentGoal = runtime.activeGoal;\n\t\tif (!currentGoal || currentGoal.id !== goalId || currentGoal.status !== \"active\") return;\n\t\tif (runtime.pendingQueueAction?.kind === \"prioritize\") return;\n\t\trequestContinuation(currentGoal);\n\t});\n\n\tpi.on(\"agent_settled\", (_event, ctx) => {\n\t\tif (runtime.queueFrozen) return;\n\t\tif (!runtime.pendingQueueAction) {\n\t\t\tdispatchContinuationIfSettled(ctx);\n\t\t\treturn;\n\t\t}\n\t\treturn dispatchPendingQueueActionIfSettled(ctx).then((dispatched) => {\n\t\t\tif (!dispatched) dispatchContinuationIfSettled(ctx);\n\t\t});\n\t});\n\n\tfunction hasPendingSkipForGoal(goalId: string) {\n\t\treturn (\n\t\t\truntime.pendingQueueAction?.kind === \"advance\" &&\n\t\t\truntime.pendingQueueAction.reason === \"skip\" &&\n\t\t\truntime.pendingQueueAction.goalId === goalId\n\t\t);\n\t}\n\n\tfunction stopGoalAfterAgentEnd(\n\t\tctx: StatusContext,\n\t\tgoal: ActiveGoal,\n\t\tassistant: AssistantMessageLike,\n\t\tstatus: \"paused\" | \"blocked\" | \"usage_limited\",\n\t) {\n\t\tcancelContinuationWork();\n\t\tclearBudgetWrapUp();\n\t\tblockStaleGoalToolCalls();\n\t\tabortCurrentTurn(ctx);\n\t\t// lunr: if the provider error carries a reset time, pre-fill resumeAfter so a\n\t\t// one-shot /cron wake-up auto-resumes the goal without a manual /goal resume.\n\t\tconst resumeAfter = status === \"usage_limited\" ? parseUsageResetTimeMs(assistant.errorMessage) : undefined;\n\t\tconst goalWithResume = resumeAfter !== undefined ? { ...goal, resumeAfter } : goal;\n\t\truntime.activeGoal = transitionGoal(goalWithResume, status);\n\t\tpersistGoal(runtime.activeGoal);\n\t\tupdateStatus(ctx, runtime.activeGoal);\n\n\t\tconst details = assistant.errorMessage\n\t\t\t? ` (${truncateNotification(assistant.errorMessage)})`\n\t\t\t: \"\";\n\t\tif (status === \"paused\") {\n\t\t\tctx.ui.notify(\n\t\t\t\t`Goal paused after interruption${details}. Run /goal resume to continue.`,\n\t\t\t\t\"warning\",\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tif (status === \"usage_limited\") {\n\t\t\tconst when = resumeAfter !== undefined ? ` Auto-resume scheduled for ${new Date(resumeAfter).toLocaleString()}.` : \"\";\n\t\t\tctx.ui.notify(\n\t\t\t\t`Goal usage-limited${details}.${when} Run /goal resume when usage resets, or schedule a one-shot /cron firing \"continue\" into this session to wake it.`,\n\t\t\t\t\"warning\",\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tctx.ui.notify(\n\t\t\t`Goal blocked after agent error${details}. Resolve the blocker or run /goal resume to retry.`,\n\t\t\t\"warning\",\n\t\t);\n\t}\n}\n\nexport default function goal(pi: ExtensionAPI, options: GoalOptions = {}) {\n\tregisterGoalRuntime(pi, options);\n}\n\nexport {\n\tassistantUsageTokens,\n\tcumulativeAssistantTokens,\n\tformatDuration,\n\tformatTokenCount,\n} from \"./accounting.js\";\n\nexport {\n\tcompleteGoalArguments,\n\tparseCommand,\n\tparseTokenBudget,\n\tvalidateObjective,\n} from \"./command.js\";\n\nexport { buildGoalSystemPrompt } from \"./prompts.js\";\n\nexport {\n\tfindFinalAssistantMessage,\n\tformatStatus,\n\tisContradictoryCompletionSummary,\n\tisRetryableGoalInterruption,\n\tisUsageLimitedGoalInterruption,\n} from \"./runtime.js\";\n"]}
|
|
1
|
+
{"version":3,"file":"goal.js","sourceRoot":"","sources":["../../../../src/builtin-extensions/narumiruna-pi-goal/src/goal.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n// lunr: defineTool imported from the concrete module, NOT the package barrel —\n// the barrel re-exports main.ts which imports this extension (cycle).\nimport { defineTool } from \"../../../core/extensions/types.js\";\nimport { isCronFire } from \"../../../core/cron/fire-guard.js\";\nimport type { ExtensionAPI } from \"@ashx-j/lunr\";\nimport { Type } from \"typebox\";\nimport { Container, Markdown, Text } from \"@ashx-j/lunr-tui\";\nimport { currentTokenTotal } from \"./accounting.js\";\nimport { completeGoalArguments, parseCommand } from \"./command.js\";\nimport { GoalCommandController } from \"./commands.js\";\nimport { type ActiveGoal, loadGoalStateFromSession } from \"./persistence.js\";\nimport { buildGoalPrompt, buildGoalSystemPrompt } from \"./prompts.js\";\nimport { activateQueuedGoal } from \"./queue.js\";\nimport {\n\ttype AssistantMessageLike,\n\tabortCurrentTurn,\n\tblocksStaleGoalToolCalls,\n\tfindFinalAssistantMessage,\n\tformatError,\n\tformatStatus,\n\tGOAL_BLOCKED_TOOL,\n\tGOAL_COMPLETE_TOOL,\n\tGoalRuntime,\n\tgoalIdRejectionReason,\n\tincrementGoal,\n\tisContradictoryCompletionSummary,\n\tisGoalContextOverflow,\n\tisRetryableGoalInterruption,\n\tisUsageLimitedGoalInterruption,\n\tparseUsageResetTimeMs,\n\tSTATUS_KEY,\n\ttype StatusContext,\n\ttransitionGoal,\n\ttruncateNotification,\n} from \"./runtime.js\";\nimport { DEFAULT_GOAL_SETTINGS, readGoalSettings } from \"./settings.js\";\n\n// goal.ts is the Pi-facing composition root: it keeps tool contracts and event\n// ordering together. Per-session mechanisms live in runtime.ts, while user command\n// transitions live in commands.ts. Each factory constructs isolated instances.\n\ninterface GoalCompleteDetails {\n\tgoal: string;\n\tgoal_id: string;\n\tsummary: string;\n}\n\ninterface GoalBlockedDetails {\n\tgoal: string;\n\tgoal_id: string;\n\treason: string;\n\tevidence: string;\n\trepeated_turns: number;\n}\n\ninterface GoalOptions {\n\tsettingsPath?: string;\n}\n\nconst GOAL_COMPLETE_MESSAGE_TYPE = \"goal-complete\";\nconst EXPERIMENTAL_GOALS_WARNING =\n\t\"Experimental ordered goals are enabled for pi-goal. Queue behavior and persisted state may change.\";\nconst MAX_BLOCKER_REASON_LENGTH = 1_000;\nconst MAX_BLOCKER_EVIDENCE_LENGTH = 4_000;\n\nfunction registerGoalRuntime(pi: ExtensionAPI, options: GoalOptions = {}) {\n\tconst runtime = new GoalRuntime(pi);\n\tconst commands = new GoalCommandController(runtime);\n\n\t// Bind per-factory runtime operations once so event orchestration stays concise\n\t// without reintroducing module-global mutable state.\n\tconst clearCompletionStatusTimer = runtime.clearCompletionStatusTimer.bind(runtime);\n\t// lunr: footer refresh timer cleanup\n\tconst clearStatusRefreshTimer = runtime.clearStatusRefreshTimer.bind(runtime);\n\tconst clearContinuationTracking = runtime.clearContinuationTracking.bind(runtime);\n\tconst clearPendingGoalPrompts = runtime.clearPendingGoalPrompts.bind(runtime);\n\tconst clearGoalRecovery = runtime.clearGoalRecovery.bind(runtime);\n\tconst clearBudgetWrapUp = runtime.clearBudgetWrapUp.bind(runtime);\n\tconst clearStaleGoalToolCallBlock = runtime.clearStaleGoalToolCallBlock.bind(runtime);\n\tconst persistGoal = runtime.persistGoal.bind(runtime);\n\tconst updateGoalUsage = runtime.recordGoalUsage.bind(runtime);\n\tconst updateStatus = runtime.updateStatus.bind(runtime);\n\tconst limitActiveGoalForBudget = runtime.limitActiveGoalForBudget.bind(runtime);\n\tconst hideGoalToolsIfLocked = runtime.hideGoalToolsIfLocked.bind(runtime);\n\tconst goalToolsAvailable = runtime.goalToolsAvailable.bind(runtime);\n\tconst pauseGoalForUnavailableTools = runtime.pauseGoalForUnavailableTools.bind(runtime);\n\tconst isPiOwnedCompactionRetry = runtime.isPiOwnedCompactionRetry.bind(runtime);\n\tconst requestContinuation = runtime.requestContinuation.bind(runtime);\n\tconst dispatchContinuationIfSettled = runtime.dispatchContinuationIfSettled.bind(runtime);\n\tconst isGoalToolName = runtime.isGoalToolName.bind(runtime);\n\tconst queueBudgetWrapUp = runtime.queueBudgetWrapUp.bind(runtime);\n\tconst clearGoalRecoveryForGoal = runtime.clearGoalRecoveryForGoal.bind(runtime);\n\tconst blockStaleGoalToolCalls = runtime.blockStaleGoalToolCalls.bind(runtime);\n\tconst cancelContinuationWork = runtime.cancelContinuationWork.bind(runtime);\n\tconst consumeCancelledContinuationPrompt =\n\t\truntime.consumeCancelledContinuationPrompt.bind(runtime);\n\tconst consumeStaleOwnedGoalPrompt = runtime.consumeStaleOwnedGoalPrompt.bind(runtime);\n\tconst consumePendingGoalPrompt = runtime.consumeOwnedGoalPrompt.bind(runtime);\n\tconst markContinuationStarted = runtime.markContinuationStarted.bind(runtime);\n\tconst hasContinuationWorkForGoal = runtime.hasContinuationWorkForGoal.bind(runtime);\n\tconst clearActiveGoal = runtime.clearActiveGoal.bind(runtime);\n\tconst showCompletionStatus = runtime.showCompletionStatus.bind(runtime);\n\tconst restoreGoalToolsHiddenByPolicy = runtime.restoreGoalToolsHiddenByPolicy.bind(runtime);\n\tconst sendOwnedGoalPrompt = (\n\t\t_pi: ExtensionAPI,\n\t\tctx: StatusContext,\n\t\tgoalId: string,\n\t\tprompt: string,\n\t) => runtime.sendOwnedGoalPrompt(ctx, goalId, prompt);\n\tconst dispatchPendingQueueActionIfSettled =\n\t\tcommands.dispatchPendingQueueActionIfSettled.bind(commands);\n\n\tconst emitGoalCompleteMessage = (summary: string) => {\n\t\tconst text = summary.startsWith(\"Goal complete\") ? summary : summary;\n\t\tpi.sendMessage({\n\t\t\tcustomType: GOAL_COMPLETE_MESSAGE_TYPE,\n\t\t\tcontent: [{ type: \"text\", text }],\n\t\t\tdisplay: true,\n\t\t});\n\t};\n\n\tpi.registerMessageRenderer(GOAL_COMPLETE_MESSAGE_TYPE, (message, _options, theme) => {\n\t\tconst raw =\n\t\t\ttypeof message.content === \"string\"\n\t\t\t\t? message.content\n\t\t\t\t: message.content\n\t\t\t\t\t\t.filter((block) => block.type === \"text\")\n\t\t\t\t\t\t.map((block) => (\"text\" in block ? block.text : \"\"))\n\t\t\t\t\t\t.join(\"\\n\");\n\t\tconst c = new Container();\n\t\tc.addChild(new Markdown(`● ${raw}`, 1, 0, undefined, {\n\t\t\tcolor: (content) => theme.fg(\"text\", content),\n\t\t}));\n\t\treturn c;\n\t});\n\n\tconst goalCompleteTool = defineTool({\n\t\tname: GOAL_COMPLETE_TOOL,\n\t\tlabel: \"Goal Complete\",\n\t\tdescription:\n\t\t\t\"Mark the active /goal as complete after all required work is done and verified, using the current goal_id stale-turn guard. Do not use for partial progress, blockers, failing, or unverified work.\",\n\t\tpromptSnippet:\n\t\t\t\"Mark the active /goal as complete after fully finishing and verifying it, with the current goal_id\",\n\t\tpromptGuidelines: [\n\t\t\t\"When a /goal is active, keep working until the goal is complete; do not stop with only a plan or partial progress.\",\n\t\t\t\"Before calling goal_complete, audit the active goal requirement by requirement against the current files, command output, tests, or external state.\",\n\t\t\t\"Pass the exact goal_id shown in the current /goal prompt; never reuse a goal_id from an older, stopped, replaced, or cleared turn.\",\n\t\t\t\"Call goal_complete only after the requested goal is fully implemented, verified, and no known required work remains; otherwise keep working.\",\n\t\t],\n\t\tparameters: Type.Object({\n\t\t\tgoal_id: Type.String({\n\t\t\t\tdescription:\n\t\t\t\t\t\"The exact goal_id shown in the current active /goal prompt. Used only to reject stale completion calls from older turns.\",\n\t\t\t}),\n\t\t\tsummary: Type.String({\n\t\t\t\tdescription:\n\t\t\t\t\t\"State what was completed and what evidence verified it. Do not use this tool to report partial progress, blockers, failures, or remaining work.\",\n\t\t\t}),\n\t\t}),\n\t\tasync execute(_toolCallId, params, _signal, _onUpdate, ctx) {\n\t\t\tconst completedGoal = runtime.activeGoal;\n\t\t\tconst goal = completedGoal?.text ?? \"unknown goal\";\n\t\t\tconst requestedGoalId = typeof params.goal_id === \"string\" ? params.goal_id.trim() : \"\";\n\t\t\tconst summary = typeof params.summary === \"string\" ? params.summary.trim() : \"\";\n\n\t\t\tif (!completedGoal) {\n\t\t\t\tconst rejection = \"Goal completion rejected: no active goal.\";\n\t\t\t\tctx.ui.notify(rejection, \"warning\");\n\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: rejection }],\n\t\t\t\t\tdetails: { goal, goal_id: requestedGoalId, summary } satisfies GoalCompleteDetails,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst completingDuringBudgetWrapUp = runtime.hasActiveBudgetWrapUp();\n\t\t\tif (!runtime.canRecordGoalUsage() && !completingDuringBudgetWrapUp) {\n\t\t\t\tconst rejection = \"Goal completion rejected: current run does not own the active goal.\";\n\t\t\t\tctx.ui.notify(rejection, \"warning\");\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: rejection }],\n\t\t\t\t\tdetails: { goal, goal_id: requestedGoalId, summary } satisfies GoalCompleteDetails,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (hasPendingSkipForGoal(completedGoal.id)) {\n\t\t\t\tupdateGoalUsage(completedGoal, ctx);\n\t\t\t\tpersistGoal(completedGoal);\n\t\t\t\tupdateStatus(ctx, completedGoal);\n\t\t\t\tclearBudgetWrapUp();\n\t\t\t\tconst rejection = \"Goal completion rejected: goal is queued to be skipped.\";\n\t\t\t\tctx.ui.notify(rejection, \"warning\");\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: rejection }],\n\t\t\t\t\tdetails: { goal, goal_id: requestedGoalId, summary } satisfies GoalCompleteDetails,\n\t\t\t\t\tterminate: true,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst staleGoalRejection = goalIdRejectionReason(completedGoal, requestedGoalId);\n\t\t\tif (staleGoalRejection) {\n\t\t\t\tconst rejection = `Goal completion rejected: ${staleGoalRejection}.`;\n\t\t\t\tctx.ui.notify(rejection, \"warning\");\n\t\t\t\tif (completingDuringBudgetWrapUp) {\n\t\t\t\t\tupdateGoalUsage(completedGoal, ctx);\n\t\t\t\t\tpersistGoal(completedGoal);\n\t\t\t\t\tupdateStatus(ctx, completedGoal);\n\t\t\t\t\tclearBudgetWrapUp();\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: rejection }],\n\t\t\t\t\tdetails: { goal, goal_id: requestedGoalId, summary } satisfies GoalCompleteDetails,\n\t\t\t\t\tterminate: completingDuringBudgetWrapUp || undefined,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (completedGoal.status !== \"active\" && !completingDuringBudgetWrapUp) {\n\t\t\t\tconst rejection = `Goal completion rejected: goal is ${completedGoal.status}, not active.`;\n\t\t\t\tctx.ui.notify(rejection, \"warning\");\n\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: rejection }],\n\t\t\t\t\tdetails: { goal, goal_id: requestedGoalId, summary } satisfies GoalCompleteDetails,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst rejectionReason = !summary\n\t\t\t\t? \"summary is empty\"\n\t\t\t\t: isContradictoryCompletionSummary(summary)\n\t\t\t\t\t? \"summary says the goal is not complete\"\n\t\t\t\t\t: undefined;\n\t\t\tif (rejectionReason) {\n\t\t\t\tupdateGoalUsage(completedGoal, ctx);\n\t\t\t\tpersistGoal(completedGoal);\n\t\t\t\tupdateStatus(ctx, completedGoal);\n\t\t\t\tconst rejection = `Goal completion rejected: ${rejectionReason}.`;\n\t\t\t\tctx.ui.notify(rejection, \"warning\");\n\t\t\t\tif (completingDuringBudgetWrapUp) clearBudgetWrapUp();\n\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: rejection,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tdetails: { goal, goal_id: requestedGoalId, summary } satisfies GoalCompleteDetails,\n\t\t\t\t\tterminate: completingDuringBudgetWrapUp || undefined,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\truntime.activeGoal = transitionGoal(completedGoal, \"complete\");\n\t\t\tupdateGoalUsage(runtime.activeGoal, ctx);\n\t\t\tif (runtime.pendingQueueAction?.kind === \"prioritize\") {\n\t\t\t\tpersistGoal(runtime.activeGoal);\n\t\t\t\tctx.ui.setStatus(STATUS_KEY, \"complete\");\n\t\t\t\temitGoalCompleteMessage(summary);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: `Goal complete: ${summary}` }],\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\tgoal,\n\t\t\t\t\t\tgoal_id: requestedGoalId,\n\t\t\t\t\t\tsummary,\n\t\t\t\t\t} satisfies GoalCompleteDetails,\n\t\t\t\t\tterminate: true,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (runtime.queuedGoals.length > 0) {\n\t\t\t\truntime.pendingQueueAction = {\n\t\t\t\t\tkind: \"advance\",\n\t\t\t\t\tgoalId: runtime.activeGoal.id,\n\t\t\t\t\treason: \"complete\",\n\t\t\t\t\tcompletedText: goal,\n\t\t\t\t};\n\t\t\t\tpersistGoal(runtime.activeGoal);\n\t\t\t\tctx.ui.setStatus(STATUS_KEY, \"complete\");\n\t\t\t\temitGoalCompleteMessage(summary);\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: `Goal complete: ${summary}\\nNext goal queued: ${runtime.queuedGoals[0]?.text}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\tgoal,\n\t\t\t\t\t\tgoal_id: requestedGoalId,\n\t\t\t\t\t\tsummary,\n\t\t\t\t\t} satisfies GoalCompleteDetails,\n\t\t\t\t\tterminate: true,\n\t\t\t\t};\n\t\t\t}\n\t\t\tpersistGoal(runtime.activeGoal);\n\n\t\t\tctx.ui.setStatus(STATUS_KEY, formatStatus(runtime.activeGoal));\n\t\t\tclearActiveGoal(ctx);\n\t\t\tshowCompletionStatus(ctx);\n\t\t\temitGoalCompleteMessage(summary);\n\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: `Goal complete: ${summary}` }],\n\t\t\t\tdetails: { goal, goal_id: requestedGoalId, summary } satisfies GoalCompleteDetails,\n\t\t\t\tterminate: true,\n\t\t\t};\n\t\t},\n\t\trenderResult(_result, { isPartial }, theme) {\n\t\t\tif (isPartial) return new Text(theme.fg(\"warning\", \"Completing goal...\"), 0, 0);\n\t\t\treturn { render: () => [], invalidate() {} };\n\t\t},\n\t});\n\n\tconst goalBlockedTool = defineTool({\n\t\tname: GOAL_BLOCKED_TOOL,\n\t\tlabel: \"Goal Blocked\",\n\t\tdescription:\n\t\t\t\"Stop the active /goal only at a true impasse after the same blocker recurs for at least three consecutive goal turns, with the current goal_id and concrete evidence that user or external action is required. Do not use for ordinary clarification, uncertainty, or recoverable failures.\",\n\t\tpromptSnippet:\n\t\t\t\"Mark the active /goal blocked only after the same blocker recurs for three consecutive goal turns\",\n\t\tpromptGuidelines: [\n\t\t\t\"Use goal_blocked only for a true impasse after the same blocker recurs for at least three consecutive goal turns and concrete evidence shows user or external action is required.\",\n\t\t\t\"After a blocked goal is resumed, start a fresh three-turn blocker audit before using goal_blocked again.\",\n\t\t\t\"Do not use goal_blocked for ordinary clarification, incomplete work, uncertainty, difficult tasks, or recoverable tool/provider failures.\",\n\t\t\t\"Pass goal_blocked the exact current goal_id; never reuse a goal_id from an older, stopped, replaced, or cleared goal turn.\",\n\t\t],\n\t\tparameters: Type.Object({\n\t\t\tgoal_id: Type.String({\n\t\t\t\tdescription: \"The exact goal_id shown in the current active /goal prompt.\",\n\t\t\t}),\n\t\t\treason: Type.String({\n\t\t\t\tminLength: 1,\n\t\t\t\tmaxLength: MAX_BLOCKER_REASON_LENGTH,\n\t\t\t\tdescription: \"The specific user or external action required to unblock the goal.\",\n\t\t\t}),\n\t\t\tevidence: Type.String({\n\t\t\t\tminLength: 1,\n\t\t\t\tmaxLength: MAX_BLOCKER_EVIDENCE_LENGTH,\n\t\t\t\tdescription: \"Concrete evidence from the repeated attempts that proves the impasse.\",\n\t\t\t}),\n\t\t\trepeated_turns: Type.Integer({\n\t\t\t\tminimum: 3,\n\t\t\t\tdescription: \"Number of separate turns spent trying to resolve this same blocker.\",\n\t\t\t}),\n\t\t}),\n\t\tasync execute(_toolCallId, params, _signal, _onUpdate, ctx) {\n\t\t\tconst blockedGoal = runtime.activeGoal;\n\t\t\tconst goal = blockedGoal?.text ?? \"unknown goal\";\n\t\t\tconst requestedGoalId = typeof params.goal_id === \"string\" ? params.goal_id.trim() : \"\";\n\t\t\tconst reason = typeof params.reason === \"string\" ? params.reason.trim() : \"\";\n\t\t\tconst evidence = typeof params.evidence === \"string\" ? params.evidence.trim() : \"\";\n\t\t\tconst repeatedTurns =\n\t\t\t\ttypeof params.repeated_turns === \"number\" ? params.repeated_turns : Number.NaN;\n\t\t\tconst reject = (rejectionReason: string, terminate = false) => {\n\t\t\t\tconst rejection = `goal_blocked rejected: ${rejectionReason}.`;\n\t\t\t\tctx.ui.notify(rejection, \"warning\");\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\" as const, text: rejection }],\n\t\t\t\t\tdetails: {\n\t\t\t\t\t\tgoal,\n\t\t\t\t\t\tgoal_id: requestedGoalId,\n\t\t\t\t\t\treason: reason.slice(0, MAX_BLOCKER_REASON_LENGTH),\n\t\t\t\t\t\tevidence: evidence.slice(0, MAX_BLOCKER_EVIDENCE_LENGTH),\n\t\t\t\t\t\trepeated_turns: Number.isFinite(repeatedTurns) ? repeatedTurns : 0,\n\t\t\t\t\t} satisfies GoalBlockedDetails,\n\t\t\t\t\t...(terminate ? { terminate: true as const } : {}),\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tif (!blockedGoal) return reject(\"no active goal\");\n\t\t\tif (!runtime.canRecordGoalUsage()) {\n\t\t\t\treturn reject(\"current run does not own the active goal\");\n\t\t\t}\n\t\t\tif (hasPendingSkipForGoal(blockedGoal.id)) {\n\t\t\t\tupdateGoalUsage(blockedGoal, ctx);\n\t\t\t\tpersistGoal(blockedGoal);\n\t\t\t\tupdateStatus(ctx, blockedGoal);\n\t\t\t\tclearBudgetWrapUp();\n\t\t\t\treturn reject(\"goal is queued to be skipped\", true);\n\t\t\t}\n\t\t\tconst staleGoalRejection = goalIdRejectionReason(blockedGoal, requestedGoalId);\n\t\t\tif (staleGoalRejection) return reject(staleGoalRejection);\n\t\t\tif (blockedGoal.status !== \"active\") {\n\t\t\t\treturn reject(`goal is ${blockedGoal.status}, not active`);\n\t\t\t}\n\t\t\tif (!reason) return reject(\"reason is empty\");\n\t\t\tif (reason.length > MAX_BLOCKER_REASON_LENGTH) return reject(\"reason is too long\");\n\t\t\tif (!evidence) return reject(\"evidence is empty\");\n\t\t\tif (evidence.length > MAX_BLOCKER_EVIDENCE_LENGTH) return reject(\"evidence is too long\");\n\t\t\tif (!Number.isInteger(repeatedTurns)) return reject(\"repeated_turns must be a whole number\");\n\t\t\tif (repeatedTurns < 3) return reject(\"repeated_turns must be at least 3\");\n\n\t\t\tupdateGoalUsage(blockedGoal, ctx);\n\t\t\tcancelContinuationWork();\n\t\t\tclearBudgetWrapUp();\n\t\t\tclearGoalRecoveryForGoal(blockedGoal.id);\n\t\t\tblockStaleGoalToolCalls();\n\t\t\truntime.activeGoal = transitionGoal(blockedGoal, \"blocked\");\n\t\t\tpersistGoal(runtime.activeGoal);\n\t\t\tupdateStatus(ctx, runtime.activeGoal);\n\t\t\tctx.ui.notify(`Goal blocked: ${truncateNotification(reason)}`, \"warning\");\n\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: `Goal blocked: ${reason}` }],\n\t\t\t\tdetails: {\n\t\t\t\t\tgoal,\n\t\t\t\t\tgoal_id: requestedGoalId,\n\t\t\t\t\treason,\n\t\t\t\t\tevidence,\n\t\t\t\t\trepeated_turns: repeatedTurns,\n\t\t\t\t} satisfies GoalBlockedDetails,\n\t\t\t\tterminate: true,\n\t\t\t};\n\t\t},\n\t});\n\n\tpi.registerTool(goalCompleteTool);\n\tpi.registerTool(goalBlockedTool);\n\t// Do not touch the active tool set during factory registration: ExtensionAPI\n\t// actions are unbound until the session binds the runtime. session_start applies\n\t// baseline visibility once actions work; later hooks only enforce goal safety.\n\n\tpi.registerCommand(\"goal\", {\n\t\tdescription: \"Run a goal to completion: /goal [--tokens 100k] <goal_to_complete>\",\n\t\tgetArgumentCompletions: (prefix) =>\n\t\t\tcompleteGoalArguments(prefix, {\n\t\t\t\texperimentalGoals: runtime.settings.experimental.goals,\n\t\t\t}),\n\t\thandler: async (args, ctx) => {\n\t\t\tconst result = parseCommand(args, {\n\t\t\t\texperimentalGoals: runtime.settings.experimental.goals,\n\t\t\t});\n\t\t\tif (typeof result === \"string\") {\n\t\t\t\tctx.ui.notify(result, \"warning\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (runtime.queueFrozen) {\n\t\t\t\tif (result.kind === \"show\") commands.showGoal(ctx);\n\t\t\t\telse if (result.kind === \"clear\") commands.clearGoal(ctx);\n\t\t\t\telse commands.notifyFrozenQueue(ctx);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (runtime.pendingQueueAction && result.kind !== \"show\" && result.kind !== \"clear\") {\n\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\"A queued goal change is waiting for Pi to settle. Retry after it finishes.\",\n\t\t\t\t\t\"warning\",\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tswitch (result.kind) {\n\t\t\t\tcase \"show\":\n\t\t\t\t\tcommands.showGoal(ctx);\n\t\t\t\t\treturn;\n\t\t\t\tcase \"pause\":\n\t\t\t\t\tcommands.pauseGoal(ctx);\n\t\t\t\t\treturn;\n\t\t\t\tcase \"resume\":\n\t\t\t\t\tawait commands.resumeGoal(ctx);\n\t\t\t\t\treturn;\n\t\t\t\tcase \"clear\":\n\t\t\t\t\tcommands.clearGoal(ctx);\n\t\t\t\t\treturn;\n\t\t\t\tcase \"edit\":\n\t\t\t\t\tawait commands.editGoal(result.objective ?? \"\", result.tokenBudget, ctx);\n\t\t\t\t\treturn;\n\t\t\t\tcase \"add\":\n\t\t\t\t\tawait commands.addGoal(result.objective ?? \"\", result.tokenBudget, ctx);\n\t\t\t\t\treturn;\n\t\t\t\tcase \"prioritize\":\n\t\t\t\t\tawait commands.prioritizeGoal(result.objective ?? \"\", result.tokenBudget, ctx);\n\t\t\t\t\treturn;\n\t\t\t\tcase \"drop-last\":\n\t\t\t\t\tcommands.dropLastGoal(ctx);\n\t\t\t\t\treturn;\n\t\t\t\tcase \"skip\":\n\t\t\t\t\tawait commands.skipGoal(ctx);\n\t\t\t\t\treturn;\n\t\t\t\tcase \"start\":\n\t\t\t\t\tawait commands.startGoal(result.objective ?? \"\", result.tokenBudget, ctx);\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t},\n\t});\n\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tclearCompletionStatusTimer();\n\t\tclearStatusRefreshTimer(); // lunr\n\t\tclearContinuationTracking();\n\t\tclearPendingGoalPrompts();\n\t\truntime.agentRunGoalId = undefined;\n\t\tclearGoalRecovery();\n\t\tclearBudgetWrapUp();\n\t\tclearStaleGoalToolCallBlock();\n\t\truntime.queuedGoals = [];\n\t\truntime.pendingQueueAction = undefined;\n\t\truntime.queueFrozen = false;\n\t\tconst previousToolVisibility = runtime.settings.toolVisibility;\n\t\tconst settingsResult = readGoalSettings(options.settingsPath);\n\t\truntime.settings =\n\t\t\tsettingsResult.kind === \"loaded\" ? settingsResult.settings : DEFAULT_GOAL_SETTINGS;\n\t\tif (settingsResult.kind === \"invalid\") {\n\t\t\tctx.ui.notify(\n\t\t\t\t`pi-goal settings ignored: ${settingsResult.reason}. Using default settings.`,\n\t\t\t\t\"warning\",\n\t\t\t);\n\t\t}\n\t\tif (runtime.settings.experimental.goals) {\n\t\t\tctx.ui.notify(EXPERIMENTAL_GOALS_WARNING, \"warning\");\n\t\t}\n\t\tif (\n\t\t\truntime.settings.toolVisibility === \"after-first-goal\" &&\n\t\t\tpreviousToolVisibility === \"always\"\n\t\t) {\n\t\t\truntime.goalToolsUnlocked = false;\n\t\t}\n\t\tif (runtime.settings.toolVisibility === \"always\") {\n\t\t\tif (runtime.goalToolsHiddenByPolicy.size > 0) {\n\t\t\t\ttry {\n\t\t\t\t\trestoreGoalToolsHiddenByPolicy();\n\t\t\t\t} catch (error) {\n\t\t\t\t\tctx.ui.notify(\n\t\t\t\t\t\t`Could not restore always-visible goal tools: ${formatError(error)}`,\n\t\t\t\t\t\t\"error\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\truntime.goalToolsUnlocked = true;\n\t\t}\n\n\t\tconst loaded = loadGoalStateFromSession(ctx);\n\t\truntime.activeGoal = loaded.goal;\n\t\truntime.queuedGoals = loaded.queue;\n\t\truntime.pendingQueueAction = loaded.pendingAction;\n\t\truntime.queueFrozen = loaded.hasExperimentalQueueState && !runtime.settings.experimental.goals;\n\t\tif (runtime.queueFrozen) {\n\t\t\tif (runtime.activeGoal) persistGoal(runtime.activeGoal);\n\t\t\tctx.ui.setStatus(STATUS_KEY, \"queue off\");\n\t\t\tctx.ui.notify(\n\t\t\t\t\"An experimental goal queue is frozen because experimental.goals is disabled. Re-enable it and run /reload to continue, or use /goal clear.\",\n\t\t\t\t\"warning\",\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tlet startRestoredQueuedGoal = false;\n\t\tif (runtime.activeGoal?.status === \"queued\" && !runtime.pendingQueueAction) {\n\t\t\truntime.activeGoal = activateQueuedGoal(runtime.activeGoal, currentTokenTotal(ctx));\n\t\t\tstartRestoredQueuedGoal = runtime.activeGoal.status === \"active\";\n\t\t}\n\t\tif (runtime.pendingQueueAction) await dispatchPendingQueueActionIfSettled(ctx);\n\t\tif (runtime.activeGoal) {\n\t\t\tif (runtime.activeGoal.status === \"active\") {\n\t\t\t\tupdateGoalUsage(runtime.activeGoal, ctx);\n\t\t\t\tif (limitActiveGoalForBudget(ctx, false)) return;\n\t\t\t}\n\t\t\tif (runtime.settings.toolVisibility === \"after-first-goal\") {\n\t\t\t\t// Registered tools are already active on an unrestricted fresh runtime.\n\t\t\t\t// If an earlier session_start handler removed them, that restrictive\n\t\t\t\t// policy wins: mark lazy visibility unlocked without widening its set.\n\t\t\t\truntime.goalToolsUnlocked = true;\n\t\t\t\truntime.goalToolsHiddenByPolicy.clear();\n\t\t\t}\n\t\t\tif (runtime.activeGoal.status === \"active\" && !goalToolsAvailable()) {\n\t\t\t\tpauseGoalForUnavailableTools(ctx, false);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tpersistGoal(runtime.activeGoal);\n\t\t\tupdateStatus(ctx, runtime.activeGoal);\n\t\t\tif (startRestoredQueuedGoal) {\n\t\t\t\tconst restoredGoal = runtime.activeGoal;\n\t\t\t\tconst sent = await sendOwnedGoalPrompt(\n\t\t\t\t\truntime.pi,\n\t\t\t\t\tctx,\n\t\t\t\t\trestoredGoal.id,\n\t\t\t\t\tbuildGoalPrompt(restoredGoal),\n\t\t\t\t);\n\t\t\t\tif (!sent && runtime.activeGoal?.id === restoredGoal.id) {\n\t\t\t\t\truntime.activeGoal = transitionGoal(restoredGoal, \"paused\");\n\t\t\t\t\tblockStaleGoalToolCalls();\n\t\t\t\t\tpersistGoal(runtime.activeGoal);\n\t\t\t\t\tupdateStatus(ctx, runtime.activeGoal);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (runtime.settings.toolVisibility === \"after-first-goal\" && !runtime.goalToolsUnlocked) {\n\t\t\t\thideGoalToolsIfLocked();\n\t\t\t}\n\t\t\tctx.ui.setStatus(STATUS_KEY, undefined);\n\t\t}\n\t});\n\n\tpi.on(\"session_shutdown\", (_event, ctx) => {\n\t\tif (runtime.activeGoal) {\n\t\t\tif (!runtime.queueFrozen && runtime.activeGoal.status === \"active\") {\n\t\t\t\tupdateGoalUsage(runtime.activeGoal, ctx, false);\n\t\t\t}\n\t\t\tpersistGoal(runtime.activeGoal);\n\t\t}\n\t\tclearContinuationTracking();\n\t\tclearPendingGoalPrompts();\n\t\truntime.agentRunGoalId = undefined;\n\t\tclearGoalRecovery();\n\t\tclearBudgetWrapUp();\n\t\tclearStaleGoalToolCallBlock();\n\t\truntime.activeGoal = undefined;\n\t\truntime.queuedGoals = [];\n\t\truntime.pendingQueueAction = undefined;\n\t\truntime.queueFrozen = false;\n\t\tctx.ui.setStatus(STATUS_KEY, undefined);\n\t\tclearCompletionStatusTimer();\n\t\tclearStatusRefreshTimer(); // lunr\n\t});\n\n\tpi.on(\"session_before_compact\", (event, ctx) => {\n\t\tif (runtime.queueFrozen) return;\n\t\tif (runtime.activeGoal?.status === \"budget_limited\") {\n\t\t\tif (event.reason === \"overflow\" && (event as { willRetry?: boolean }).willRetry === true) {\n\t\t\t\treturn { cancel: true as const };\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (runtime.activeGoal?.status !== \"active\") return;\n\t\tif (!updateGoalUsage(runtime.activeGoal, ctx)) return;\n\t\tcancelContinuationWork();\n\t\tpersistGoal(runtime.activeGoal);\n\t\tupdateStatus(ctx, runtime.activeGoal);\n\t\tif (runtime.pendingQueueAction) return;\n\t\tif (limitActiveGoalForBudget(ctx, false)) {\n\t\t\tif (event.reason === \"threshold\" && (event as { willRetry?: boolean }).willRetry === true) return;\n\t\t\treturn { cancel: true as const };\n\t\t}\n\t});\n\n\tpi.on(\"session_compact\", async (event, ctx) => {\n\t\tif (runtime.queueFrozen) return;\n\t\tif (runtime.activeGoal?.status !== \"active\") {\n\t\t\tclearGoalRecovery();\n\t\t\tif (runtime.pendingQueueAction) await dispatchPendingQueueActionIfSettled(ctx);\n\t\t\treturn;\n\t\t}\n\n\t\tconst restoredState = loadGoalStateFromSession(ctx);\n\t\tif (restoredState.goal?.id === runtime.activeGoal.id) {\n\t\t\truntime.activeGoal = restoredState.goal;\n\t\t\truntime.queuedGoals = restoredState.queue;\n\t\t\truntime.pendingQueueAction = restoredState.pendingAction;\n\t\t}\n\t\tconst usageRecorded = updateGoalUsage(runtime.activeGoal, ctx);\n\t\tif (usageRecorded) {\n\t\t\tpersistGoal(runtime.activeGoal);\n\t\t\tupdateStatus(ctx, runtime.activeGoal);\n\t\t}\n\t\tif (runtime.pendingQueueAction) {\n\t\t\tawait dispatchPendingQueueActionIfSettled(ctx);\n\t\t\treturn;\n\t\t}\n\t\tif (!usageRecorded) return;\n\t\tif (limitActiveGoalForBudget(ctx, false)) return;\n\n\t\tconst wasPiRetry = isPiOwnedCompactionRetry(event, runtime.activeGoal.id);\n\t\tclearGoalRecoveryForGoal(runtime.activeGoal.id);\n\t\tif (wasPiRetry) return;\n\t\trequestContinuation(runtime.activeGoal);\n\t\t// Manual compaction does not emit agent_settled. This common dispatcher is\n\t\t// therefore the narrow fallback; threshold compaction leaves the intent for\n\t\t// agent_settled when Pi is still busy.\n\t\tdispatchContinuationIfSettled(ctx);\n\t});\n\n\tpi.on(\"input\", (event) => {\n\t\tif (event.source === \"extension\") {\n\t\t\tif (\n\t\t\t\tconsumeCancelledContinuationPrompt(event.text) ||\n\t\t\t\tconsumeStaleOwnedGoalPrompt(event.text)\n\t\t\t) {\n\t\t\t\treturn { action: \"handled\" as const };\n\t\t\t}\n\t\t\tif (runtime.queueFrozen) return;\n\t\t\tclearGoalRecovery();\n\t\t\treturn;\n\t\t}\n\t\tif (runtime.queueFrozen) return;\n\t\tif (/^\\/goal(?:\\s|$)/u.test(event.text.trimStart())) return;\n\t\tclearGoalRecovery();\n\t\tclearBudgetWrapUp();\n\t\tclearStaleGoalToolCallBlock();\n\t});\n\n\t// lunr: the previous context-event filter dropped superseded budget\n\t// wrap-up messages from request context. That breaks Anthropic prefix\n\t// continuity (full cache miss from the cut). The wrap-up custom message\n\t// is small; keeping history unfiltered is cheaper than a cache rewrite.\n\t// keepBudgetWrapUpMessage remains on the runtime if a future token-saving\n\t// path can prove the wrap-up was never sent.\n\n\tpi.on(\"tool_call\", (event, ctx) => {\n\t\tif (runtime.queueFrozen) {\n\t\t\tif (!isGoalToolName(event.toolName)) return;\n\t\t\treturn {\n\t\t\t\tblock: true,\n\t\t\t\treason:\n\t\t\t\t\t\"The experimental goal queue is frozen. Re-enable experimental.goals and run /reload, or use /goal clear.\",\n\t\t\t};\n\t\t}\n\t\t// lunr: mask locked goal tools instead of removing them from the active\n\t\t// list (setActiveTools churn busts the tools+system cache prefix).\n\t\tif (isGoalToolName(event.toolName) && runtime.areGoalToolsLocked()) {\n\t\t\treturn {\n\t\t\t\tblock: true,\n\t\t\t\treason: \"Goal tools are locked until a /goal is activated.\",\n\t\t\t};\n\t\t}\n\t\tif (\n\t\t\truntime.activeGoal?.status === \"budget_limited\" &&\n\t\t\truntime.budgetWrapUp?.goalId === runtime.activeGoal.id &&\n\t\t\tevent.toolName !== \"goal_complete\"\n\t\t) {\n\t\t\t// A blocked tool result would normally trigger another model call. Abort the\n\t\t\t// wrap-up instead so a tool-seeking model cannot create an unbounded loop.\n\t\t\tabortCurrentTurn(ctx);\n\t\t\treturn {\n\t\t\t\tblock: true,\n\t\t\t\treason: \"Goal token budget is exhausted; only goal_complete is allowed during wrap-up.\",\n\t\t\t};\n\t\t}\n\t\tif (!runtime.staleGoalToolCallsBlocked) return;\n\t\tif (!runtime.activeGoal || !blocksStaleGoalToolCalls(runtime.activeGoal.status)) {\n\t\t\tclearStaleGoalToolCallBlock();\n\t\t\treturn;\n\t\t}\n\t\treturn {\n\t\t\tblock: true,\n\t\t\treason: \"Blocked stale /goal tool call after the goal stopped or was interrupted.\",\n\t\t};\n\t});\n\n\tpi.on(\"tool_execution_end\", (_event, ctx) => {\n\t\tif (runtime.queueFrozen) return;\n\t\tif (\n\t\t\truntime.activeGoal?.status === \"budget_limited\" &&\n\t\t\truntime.budgetWrapUp?.goalId === runtime.activeGoal.id &&\n\t\t\t!runtime.budgetWrapUp.delivered\n\t\t) {\n\t\t\tqueueBudgetWrapUp(ctx, runtime.activeGoal);\n\t\t\treturn;\n\t\t}\n\t\tif (runtime.activeGoal?.status !== \"active\") return;\n\n\t\t// AgentSession persists assistant message_end before tool execution events,\n\t\t// so the completed assistant call's usage is authoritative at this boundary.\n\t\tif (!updateGoalUsage(runtime.activeGoal, ctx)) return;\n\t\tpersistGoal(runtime.activeGoal);\n\t\tupdateStatus(ctx, runtime.activeGoal);\n\t\tif (limitActiveGoalForBudget(ctx, true)) return;\n\t\tif (!goalToolsAvailable()) pauseGoalForUnavailableTools(ctx);\n\t});\n\n\tpi.on(\"before_agent_start\", (event, ctx) => {\n\t\tif (runtime.queueFrozen) {\n\t\t\truntime.agentRunGoalId = undefined;\n\t\t\treturn;\n\t\t}\n\t\tconst goalPromptGoalId = consumePendingGoalPrompt(event.prompt);\n\t\tconst continuationGoalId = goalPromptGoalId ? undefined : markContinuationStarted(event.prompt);\n\t\tconst ownedPromptGoalId = goalPromptGoalId ?? continuationGoalId;\n\t\tconst activeBudgetWrapUp = runtime.hasActiveBudgetWrapUp();\n\t\tconst activeGoalRecovery = runtime.hasActiveGoalRecovery();\n\t\t// lunr: auto-resume a usage_limited goal on a wake-up turn. Two triggers:\n\t\t// - resumeAfter was parsed from the provider error and has elapsed (any turn\n\t\t// resumes — the reset time is known, so the goal should not stay parked);\n\t\t// - no reset time was parseable: only a cron-fired turn resumes (the user\n\t\t// scheduled the wake-up explicitly; ordinary manual turns don't hijack —\n\t\t// /goal resume stays the manual path).\n\t\t// Gateway cron fires are headless and cannot see this session's goal.\n\t\tconst resumeAfter = runtime.activeGoal?.resumeAfter;\n\t\tconst resumeDue = resumeAfter !== undefined && Date.now() >= resumeAfter;\n\t\tconst cronWakeUp = resumeAfter === undefined && isCronFire();\n\t\tif (\n\t\t\truntime.activeGoal?.status === \"usage_limited\" &&\n\t\t\t(resumeDue || cronWakeUp) &&\n\t\t\t!ownedPromptGoalId &&\n\t\t\t!activeBudgetWrapUp &&\n\t\t\t!activeGoalRecovery\n\t\t) {\n\t\t\tconst resumed = runtime.reactivateGoalForResume(ctx);\n\t\t\tif (resumed) {\n\t\t\t\truntime.agentRunGoalId = resumed.id;\n\t\t\t\tif (!goalToolsAvailable()) {\n\t\t\t\t\tpauseGoalForUnavailableTools(ctx, false);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tsystemPrompt: event.systemPrompt + \"\\n\\n\" + buildGoalSystemPrompt(runtime.activeGoal),\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\tif (\n\t\t\truntime.pendingQueueAction?.kind === \"prioritize\" &&\n\t\t\t!activeBudgetWrapUp &&\n\t\t\t!activeGoalRecovery\n\t\t) {\n\t\t\t// A turn that starts after priority intent is committed belongs to neither\n\t\t\t// the displaced goal nor the not-yet-activated urgent goal. Persist the\n\t\t\t// displaced goal's final accounting boundary so reload cannot absorb this run.\n\t\t\tif (!runtime.pendingQueueAction.displacedUsageFinalized) {\n\t\t\t\tif (runtime.activeGoal?.status === \"active\") {\n\t\t\t\t\tupdateGoalUsage(runtime.activeGoal, ctx, false);\n\t\t\t\t}\n\t\t\t\truntime.pendingQueueAction.displacedUsageFinalized = true;\n\t\t\t\tif (runtime.activeGoal) {\n\t\t\t\t\tpersistGoal(runtime.activeGoal);\n\t\t\t\t\tupdateStatus(ctx, runtime.activeGoal);\n\t\t\t\t}\n\t\t\t}\n\t\t\truntime.agentRunGoalId = null;\n\t\t\tif (ownedPromptGoalId) abortCurrentTurn(ctx);\n\t\t\treturn;\n\t\t}\n\t\tif (activeBudgetWrapUp && runtime.activeGoal) {\n\t\t\truntime.agentRunGoalId = runtime.activeGoal.id;\n\t\t\treturn;\n\t\t}\n\t\tif (\n\t\t\truntime.pendingQueueAction?.kind === \"advance\" &&\n\t\t\truntime.pendingQueueAction.goalId === runtime.activeGoal?.id\n\t\t) {\n\t\t\truntime.agentRunGoalId = ownedPromptGoalId ?? runtime.activeGoal.id;\n\t\t\tif (ownedPromptGoalId) abortCurrentTurn(ctx);\n\t\t\treturn;\n\t\t}\n\t\tif (ownedPromptGoalId && ownedPromptGoalId !== runtime.activeGoal?.id) {\n\t\t\truntime.agentRunGoalId = ownedPromptGoalId;\n\t\t\tif (runtime.activeGoal?.status === \"active\" && !goalToolsAvailable()) {\n\t\t\t\tpauseGoalForUnavailableTools(ctx, false);\n\t\t\t}\n\t\t\tabortCurrentTurn(ctx);\n\t\t\treturn;\n\t\t}\n\t\tif (runtime.activeGoal?.status !== \"active\") {\n\t\t\truntime.agentRunGoalId = undefined;\n\t\t\treturn;\n\t\t}\n\t\truntime.agentRunGoalId = runtime.activeGoal.id;\n\t\tif (!goalToolsAvailable()) {\n\t\t\tpauseGoalForUnavailableTools(ctx, ownedPromptGoalId !== undefined);\n\t\t\treturn;\n\t\t}\n\n\t\treturn {\n\t\t\tsystemPrompt: `${event.systemPrompt}\\n\\n${buildGoalSystemPrompt(runtime.activeGoal)}`,\n\t\t};\n\t});\n\n\tpi.on(\"agent_end\", (event, ctx) => {\n\t\tif (runtime.queueFrozen) return;\n\t\tconst agentRunGoalId = runtime.agentRunGoalId;\n\t\truntime.agentRunGoalId = undefined;\n\t\tif (\n\t\t\tagentRunGoalId === null ||\n\t\t\t(!runtime.canRecordGoalUsage() && !runtime.hasActiveBudgetWrapUp())\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tif (agentRunGoalId && agentRunGoalId !== runtime.activeGoal?.id) return;\n\t\tif (!runtime.activeGoal) return;\n\t\tif (\n\t\t\truntime.activeGoal.status === \"budget_limited\" &&\n\t\t\truntime.budgetWrapUp?.goalId === runtime.activeGoal.id\n\t\t) {\n\t\t\tupdateGoalUsage(runtime.activeGoal, ctx);\n\t\t\tpersistGoal(runtime.activeGoal);\n\t\t\tupdateStatus(ctx, runtime.activeGoal);\n\t\t\tclearBudgetWrapUp();\n\t\t\treturn;\n\t\t}\n\t\tif (runtime.activeGoal.status !== \"active\") return;\n\t\tif (\n\t\t\truntime.pendingQueueAction?.kind === \"advance\" &&\n\t\t\truntime.pendingQueueAction.goalId === runtime.activeGoal.id\n\t\t) {\n\t\t\tupdateGoalUsage(runtime.activeGoal, ctx);\n\t\t\tpersistGoal(runtime.activeGoal);\n\t\t\tupdateStatus(ctx, runtime.activeGoal);\n\t\t\treturn;\n\t\t}\n\n\t\tconst goalId = runtime.activeGoal.id;\n\t\tconst alreadyAwaitingContinuation = hasContinuationWorkForGoal(goalId);\n\t\tconst finalAssistant = findFinalAssistantMessage(event.messages);\n\n\t\tif (!alreadyAwaitingContinuation) runtime.activeGoal = incrementGoal(runtime.activeGoal);\n\t\tupdateGoalUsage(runtime.activeGoal, ctx);\n\n\t\tif (finalAssistant?.stopReason === \"aborted\") {\n\t\t\tclearGoalRecoveryForGoal(goalId);\n\t\t\tstopGoalAfterAgentEnd(ctx, runtime.activeGoal, finalAssistant, \"paused\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (finalAssistant?.stopReason === \"error\") {\n\t\t\tif (isRetryableGoalInterruption(finalAssistant)) {\n\t\t\t\tif (limitActiveGoalForBudget(ctx, false)) return;\n\t\t\t\tif (!goalToolsAvailable()) {\n\t\t\t\t\tpauseGoalForUnavailableTools(ctx);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\truntime.goalRecovery = {\n\t\t\t\t\tgoalId,\n\t\t\t\t\tkind: isGoalContextOverflow(finalAssistant) ? \"compaction_retry\" : \"provider_retry\",\n\t\t\t\t};\n\t\t\t\tcancelContinuationWork();\n\t\t\t\tpersistGoal(runtime.activeGoal);\n\t\t\t\tupdateStatus(ctx, runtime.activeGoal);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tclearGoalRecoveryForGoal(goalId);\n\t\t\tstopGoalAfterAgentEnd(\n\t\t\t\tctx,\n\t\t\t\truntime.activeGoal,\n\t\t\t\tfinalAssistant,\n\t\t\t\tisUsageLimitedGoalInterruption(finalAssistant) ? \"usage_limited\" : \"blocked\",\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tclearGoalRecoveryForGoal(goalId);\n\n\t\tif (limitActiveGoalForBudget(ctx, false)) return;\n\t\tif (!goalToolsAvailable()) {\n\t\t\tpauseGoalForUnavailableTools(ctx);\n\t\t\treturn;\n\t\t}\n\n\t\tpersistGoal(runtime.activeGoal);\n\t\tupdateStatus(ctx, runtime.activeGoal);\n\n\t\tconst currentGoal = runtime.activeGoal;\n\t\tif (!currentGoal || currentGoal.id !== goalId || currentGoal.status !== \"active\") return;\n\t\tif (runtime.pendingQueueAction?.kind === \"prioritize\") return;\n\t\trequestContinuation(currentGoal);\n\t});\n\n\tpi.on(\"agent_settled\", (_event, ctx) => {\n\t\tif (runtime.queueFrozen) return;\n\t\tif (!runtime.pendingQueueAction) {\n\t\t\tdispatchContinuationIfSettled(ctx);\n\t\t\treturn;\n\t\t}\n\t\treturn dispatchPendingQueueActionIfSettled(ctx).then((dispatched) => {\n\t\t\tif (!dispatched) dispatchContinuationIfSettled(ctx);\n\t\t});\n\t});\n\n\tfunction hasPendingSkipForGoal(goalId: string) {\n\t\treturn (\n\t\t\truntime.pendingQueueAction?.kind === \"advance\" &&\n\t\t\truntime.pendingQueueAction.reason === \"skip\" &&\n\t\t\truntime.pendingQueueAction.goalId === goalId\n\t\t);\n\t}\n\n\tfunction stopGoalAfterAgentEnd(\n\t\tctx: StatusContext,\n\t\tgoal: ActiveGoal,\n\t\tassistant: AssistantMessageLike,\n\t\tstatus: \"paused\" | \"blocked\" | \"usage_limited\",\n\t) {\n\t\tcancelContinuationWork();\n\t\tclearBudgetWrapUp();\n\t\tblockStaleGoalToolCalls();\n\t\tabortCurrentTurn(ctx);\n\t\t// lunr: if the provider error carries a reset time, pre-fill resumeAfter so a\n\t\t// one-shot /cron wake-up auto-resumes the goal without a manual /goal resume.\n\t\tconst resumeAfter = status === \"usage_limited\" ? parseUsageResetTimeMs(assistant.errorMessage) : undefined;\n\t\tconst goalWithResume = resumeAfter !== undefined ? { ...goal, resumeAfter } : goal;\n\t\truntime.activeGoal = transitionGoal(goalWithResume, status);\n\t\tpersistGoal(runtime.activeGoal);\n\t\tupdateStatus(ctx, runtime.activeGoal);\n\n\t\tconst details = assistant.errorMessage\n\t\t\t? ` (${truncateNotification(assistant.errorMessage)})`\n\t\t\t: \"\";\n\t\tif (status === \"paused\") {\n\t\t\tctx.ui.notify(\n\t\t\t\t`Goal paused after interruption${details}. Run /goal resume to continue.`,\n\t\t\t\t\"warning\",\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tif (status === \"usage_limited\") {\n\t\t\tconst when = resumeAfter !== undefined ? ` Auto-resume scheduled for ${new Date(resumeAfter).toLocaleString()}.` : \"\";\n\t\t\tctx.ui.notify(\n\t\t\t\t`Goal usage-limited${details}.${when} Run /goal resume when usage resets, or schedule a one-shot /cron firing \"continue\" into this session to wake it.`,\n\t\t\t\t\"warning\",\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tctx.ui.notify(\n\t\t\t`Goal blocked after agent error${details}. Resolve the blocker or run /goal resume to retry.`,\n\t\t\t\"warning\",\n\t\t);\n\t}\n}\n\nexport default function goal(pi: ExtensionAPI, options: GoalOptions = {}) {\n\tregisterGoalRuntime(pi, options);\n}\n\nexport {\n\tassistantUsageTokens,\n\tcumulativeAssistantTokens,\n\tformatDuration,\n\tformatTokenCount,\n} from \"./accounting.js\";\n\nexport {\n\tcompleteGoalArguments,\n\tparseCommand,\n\tparseTokenBudget,\n\tvalidateObjective,\n} from \"./command.js\";\n\nexport { buildGoalSystemPrompt } from \"./prompts.js\";\n\nexport {\n\tfindFinalAssistantMessage,\n\tformatStatus,\n\tisContradictoryCompletionSummary,\n\tisRetryableGoalInterruption,\n\tisUsageLimitedGoalInterruption,\n} from \"./runtime.js\";\n"]}
|
|
@@ -8,7 +8,7 @@ export declare const DEFAULT_SUBAGENT_NAME = "delegate";
|
|
|
8
8
|
export interface DelegatedSubagentTask {
|
|
9
9
|
agent: string;
|
|
10
10
|
task: string;
|
|
11
|
-
|
|
11
|
+
tier: "light" | "standard" | "heavy";
|
|
12
12
|
cwd?: string;
|
|
13
13
|
}
|
|
14
14
|
export interface DelegatedSubagentParallelResult {
|
|
@@ -23,7 +23,7 @@ export interface DelegatedSubagentRequest {
|
|
|
23
23
|
task: string;
|
|
24
24
|
tasks?: DelegatedSubagentTask[];
|
|
25
25
|
context: "fresh" | "fork";
|
|
26
|
-
|
|
26
|
+
tier: "light" | "standard" | "heavy";
|
|
27
27
|
cwd: string;
|
|
28
28
|
worktree?: boolean;
|
|
29
29
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagent-runtime.d.ts","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-prompt-template-model/subagent-runtime.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,sCAAsC,qCAAqC,CAAC;AACzF,eAAO,MAAM,sCAAsC,qCAAqC,CAAC;AACzF,eAAO,MAAM,uCAAuC,sCAAsC,CAAC;AAC3F,eAAO,MAAM,qCAAqC,oCAAoC,CAAC;AACvF,eAAO,MAAM,qCAAqC,oCAAoC,CAAC;AACvF,eAAO,MAAM,qCAAqC,6BAA6B,CAAC;AAChF,eAAO,MAAM,qBAAqB,aAAa,CAAC;AAEhD,MAAM,WAAW,qBAAqB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,
|
|
1
|
+
{"version":3,"file":"subagent-runtime.d.ts","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-prompt-template-model/subagent-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nexport const PROMPT_TEMPLATE_SUBAGENT_REQUEST_EVENT = \"prompt-template:subagent:request\";\nexport const PROMPT_TEMPLATE_SUBAGENT_STARTED_EVENT = \"prompt-template:subagent:started\";\nexport const PROMPT_TEMPLATE_SUBAGENT_RESPONSE_EVENT = \"prompt-template:subagent:response\";\nexport const PROMPT_TEMPLATE_SUBAGENT_UPDATE_EVENT = \"prompt-template:subagent:update\";\nexport const PROMPT_TEMPLATE_SUBAGENT_CANCEL_EVENT = \"prompt-template:subagent:cancel\";\nexport const PROMPT_TEMPLATE_SUBAGENT_MESSAGE_TYPE = \"prompt-template-subagent\";\nexport const DEFAULT_SUBAGENT_NAME = \"delegate\";\n\nexport interface DelegatedSubagentTask {\n\tagent: string;\n\ttask: string;\n\ttier: \"light\" | \"standard\" | \"heavy\";\n\tcwd?: string;\n}\n\nexport interface DelegatedSubagentParallelResult {\n\tagent: string;\n\tmessages: unknown[];\n\tisError: boolean;\n\terrorText?: string;\n}\n\nexport interface DelegatedSubagentRequest {\n\trequestId: string;\n\tagent: string;\n\ttask: string;\n\ttasks?: DelegatedSubagentTask[];\n\tcontext: \"fresh\" | \"fork\";\n\ttier: \"light\" | \"standard\" | \"heavy\";\n\tcwd: string;\n\tworktree?: boolean;\n}\n\nexport interface DelegatedSubagentResponse {\n\trequestId: string;\n\tagent: string;\n\ttask: string;\n\tcontext: \"fresh\" | \"fork\";\n\tmodel: string;\n\tcwd: string;\n\tmessages: unknown[];\n\tparallelResults?: DelegatedSubagentParallelResult[];\n\tcontentText?: string;\n\tisError: boolean;\n\terrorText?: string;\n}\n\nexport interface DelegatedSubagentUpdate {\n\trequestId: string;\n\tcurrentTool?: string;\n\tcurrentToolArgs?: string;\n\trecentOutput?: string;\n\trecentOutputLines?: string[];\n\trecentTools?: Array<{ tool: string; args: string }>;\n\tmodel?: string;\n\ttoolCount?: number;\n\tdurationMs?: number;\n\ttokens?: number;\n\ttaskProgress?: DelegatedSubagentTaskProgress[];\n}\n\nexport interface DelegatedSubagentTaskProgress {\n\tindex?: number;\n\tagent: string;\n\tstatus?: string;\n\tcurrentTool?: string;\n\tcurrentToolArgs?: string;\n\trecentOutput?: string;\n\trecentOutputLines?: string[];\n\trecentTools?: Array<{ tool: string; args: string }>;\n\tmodel?: string;\n\ttoolCount?: number;\n\tdurationMs?: number;\n\ttokens?: number;\n}\n\nexport interface DelegatedSubagentLiveState {\n\tstatus?: string;\n\tcurrentTool?: string;\n\tcurrentToolArgs?: string;\n\trecentOutput: string[];\n\trecentTools: Array<{ tool: string; args: string }>;\n\tmodel?: string;\n\ttoolCount: number;\n\tdurationMs: number;\n\ttokens: number;\n\ttaskProgress: DelegatedSubagentTaskProgress[];\n\tstartedAt: number;\n\tupdatedAt: number;\n}\n\nconst delegatedLiveState = new Map<string, DelegatedSubagentLiveState>();\n\nexport function updateDelegatedLiveState(requestId: string, update: Partial<DelegatedSubagentLiveState>): void {\n\tconst now = Date.now();\n\tconst existing = delegatedLiveState.get(requestId) ?? {\n\t\trecentOutput: [],\n\t\trecentTools: [],\n\t\ttoolCount: 0,\n\t\tdurationMs: 0,\n\t\ttokens: 0,\n\t\ttaskProgress: [],\n\t\tstartedAt: now,\n\t\tupdatedAt: now,\n\t};\n\tconst next: DelegatedSubagentLiveState = {\n\t\t...existing,\n\t\t...update,\n\t\trecentOutput: update.recentOutput ?? existing.recentOutput,\n\t\trecentTools: update.recentTools ?? existing.recentTools,\n\t\tmodel: update.model ?? existing.model,\n\t\ttoolCount: update.toolCount ?? existing.toolCount,\n\t\tdurationMs: update.durationMs ?? (now - existing.startedAt),\n\t\ttokens: update.tokens ?? existing.tokens,\n\t\ttaskProgress: update.taskProgress ?? existing.taskProgress,\n\t\tstartedAt: existing.startedAt,\n\t\tupdatedAt: now,\n\t};\n\tdelegatedLiveState.set(requestId, next);\n}\n\nexport function appendDelegatedLiveOutput(requestId: string, line?: string): void {\n\tif (!line || !line.trim() || line.trim() === \"(running...)\") return;\n\tconst fallbackNow = Date.now();\n\tconst existing = delegatedLiveState.get(requestId) ?? {\n\t\trecentOutput: [],\n\t\trecentTools: [],\n\t\ttoolCount: 0,\n\t\tdurationMs: 0,\n\t\ttokens: 0,\n\t\ttaskProgress: [],\n\t\tstartedAt: fallbackNow,\n\t\tupdatedAt: fallbackNow,\n\t};\n\tconst recentOutput = [...existing.recentOutput, line];\n\tdelegatedLiveState.set(requestId, {\n\t\t...existing,\n\t\trecentOutput,\n\t\tupdatedAt: Date.now(),\n\t});\n}\n\nexport function getDelegatedLiveState(requestId: string): DelegatedSubagentLiveState | undefined {\n\treturn delegatedLiveState.get(requestId);\n}\n\nexport function clearDelegatedLiveState(requestId: string): void {\n\tdelegatedLiveState.delete(requestId);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagent-runtime.js","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-prompt-template-model/subagent-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nexport const PROMPT_TEMPLATE_SUBAGENT_REQUEST_EVENT = \"prompt-template:subagent:request\";\nexport const PROMPT_TEMPLATE_SUBAGENT_STARTED_EVENT = \"prompt-template:subagent:started\";\nexport const PROMPT_TEMPLATE_SUBAGENT_RESPONSE_EVENT = \"prompt-template:subagent:response\";\nexport const PROMPT_TEMPLATE_SUBAGENT_UPDATE_EVENT = \"prompt-template:subagent:update\";\nexport const PROMPT_TEMPLATE_SUBAGENT_CANCEL_EVENT = \"prompt-template:subagent:cancel\";\nexport const PROMPT_TEMPLATE_SUBAGENT_MESSAGE_TYPE = \"prompt-template-subagent\";\nexport const DEFAULT_SUBAGENT_NAME = \"delegate\";\n\nexport interface DelegatedSubagentTask {\n\tagent: string;\n\ttask: string;\n\
|
|
1
|
+
{"version":3,"file":"subagent-runtime.js","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-prompt-template-model/subagent-runtime.ts"],"names":[],"mappings":"AAAA,cAAc;AACd,MAAM,CAAC,MAAM,sCAAsC,GAAG,kCAAkC,CAAC;AACzF,MAAM,CAAC,MAAM,sCAAsC,GAAG,kCAAkC,CAAC;AACzF,MAAM,CAAC,MAAM,uCAAuC,GAAG,mCAAmC,CAAC;AAC3F,MAAM,CAAC,MAAM,qCAAqC,GAAG,iCAAiC,CAAC;AACvF,MAAM,CAAC,MAAM,qCAAqC,GAAG,iCAAiC,CAAC;AACvF,MAAM,CAAC,MAAM,qCAAqC,GAAG,0BAA0B,CAAC;AAChF,MAAM,CAAC,MAAM,qBAAqB,GAAG,UAAU,CAAC;AAqFhD,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAsC,CAAC;AAEzE,MAAM,UAAU,wBAAwB,CAAC,SAAiB,EAAE,MAA2C,EAAQ;IAC9G,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI;QACrD,YAAY,EAAE,EAAE;QAChB,WAAW,EAAE,EAAE;QACf,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,CAAC;QACb,MAAM,EAAE,CAAC;QACT,YAAY,EAAE,EAAE;QAChB,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;KACd,CAAC;IACF,MAAM,IAAI,GAA+B;QACxC,GAAG,QAAQ;QACX,GAAG,MAAM;QACT,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,QAAQ,CAAC,YAAY;QAC1D,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,QAAQ,CAAC,WAAW;QACvD,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK;QACrC,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAS;QACjD,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC;QAC3D,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM;QACxC,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,QAAQ,CAAC,YAAY;QAC1D,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,SAAS,EAAE,GAAG;KACd,CAAC;IACF,kBAAkB,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAAA,CACxC;AAED,MAAM,UAAU,yBAAyB,CAAC,SAAiB,EAAE,IAAa,EAAQ;IACjF,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,cAAc;QAAE,OAAO;IACpE,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC/B,MAAM,QAAQ,GAAG,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI;QACrD,YAAY,EAAE,EAAE;QAChB,WAAW,EAAE,EAAE;QACf,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,CAAC;QACb,MAAM,EAAE,CAAC;QACT,YAAY,EAAE,EAAE;QAChB,SAAS,EAAE,WAAW;QACtB,SAAS,EAAE,WAAW;KACtB,CAAC;IACF,MAAM,YAAY,GAAG,CAAC,GAAG,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IACtD,kBAAkB,CAAC,GAAG,CAAC,SAAS,EAAE;QACjC,GAAG,QAAQ;QACX,YAAY;QACZ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACrB,CAAC,CAAC;AAAA,CACH;AAED,MAAM,UAAU,qBAAqB,CAAC,SAAiB,EAA0C;IAChG,OAAO,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAAA,CACzC;AAED,MAAM,UAAU,uBAAuB,CAAC,SAAiB,EAAQ;IAChE,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AAAA,CACrC","sourcesContent":["// @ts-nocheck\nexport const PROMPT_TEMPLATE_SUBAGENT_REQUEST_EVENT = \"prompt-template:subagent:request\";\nexport const PROMPT_TEMPLATE_SUBAGENT_STARTED_EVENT = \"prompt-template:subagent:started\";\nexport const PROMPT_TEMPLATE_SUBAGENT_RESPONSE_EVENT = \"prompt-template:subagent:response\";\nexport const PROMPT_TEMPLATE_SUBAGENT_UPDATE_EVENT = \"prompt-template:subagent:update\";\nexport const PROMPT_TEMPLATE_SUBAGENT_CANCEL_EVENT = \"prompt-template:subagent:cancel\";\nexport const PROMPT_TEMPLATE_SUBAGENT_MESSAGE_TYPE = \"prompt-template-subagent\";\nexport const DEFAULT_SUBAGENT_NAME = \"delegate\";\n\nexport interface DelegatedSubagentTask {\n\tagent: string;\n\ttask: string;\n\ttier: \"light\" | \"standard\" | \"heavy\";\n\tcwd?: string;\n}\n\nexport interface DelegatedSubagentParallelResult {\n\tagent: string;\n\tmessages: unknown[];\n\tisError: boolean;\n\terrorText?: string;\n}\n\nexport interface DelegatedSubagentRequest {\n\trequestId: string;\n\tagent: string;\n\ttask: string;\n\ttasks?: DelegatedSubagentTask[];\n\tcontext: \"fresh\" | \"fork\";\n\ttier: \"light\" | \"standard\" | \"heavy\";\n\tcwd: string;\n\tworktree?: boolean;\n}\n\nexport interface DelegatedSubagentResponse {\n\trequestId: string;\n\tagent: string;\n\ttask: string;\n\tcontext: \"fresh\" | \"fork\";\n\tmodel: string;\n\tcwd: string;\n\tmessages: unknown[];\n\tparallelResults?: DelegatedSubagentParallelResult[];\n\tcontentText?: string;\n\tisError: boolean;\n\terrorText?: string;\n}\n\nexport interface DelegatedSubagentUpdate {\n\trequestId: string;\n\tcurrentTool?: string;\n\tcurrentToolArgs?: string;\n\trecentOutput?: string;\n\trecentOutputLines?: string[];\n\trecentTools?: Array<{ tool: string; args: string }>;\n\tmodel?: string;\n\ttoolCount?: number;\n\tdurationMs?: number;\n\ttokens?: number;\n\ttaskProgress?: DelegatedSubagentTaskProgress[];\n}\n\nexport interface DelegatedSubagentTaskProgress {\n\tindex?: number;\n\tagent: string;\n\tstatus?: string;\n\tcurrentTool?: string;\n\tcurrentToolArgs?: string;\n\trecentOutput?: string;\n\trecentOutputLines?: string[];\n\trecentTools?: Array<{ tool: string; args: string }>;\n\tmodel?: string;\n\ttoolCount?: number;\n\tdurationMs?: number;\n\ttokens?: number;\n}\n\nexport interface DelegatedSubagentLiveState {\n\tstatus?: string;\n\tcurrentTool?: string;\n\tcurrentToolArgs?: string;\n\trecentOutput: string[];\n\trecentTools: Array<{ tool: string; args: string }>;\n\tmodel?: string;\n\ttoolCount: number;\n\tdurationMs: number;\n\ttokens: number;\n\ttaskProgress: DelegatedSubagentTaskProgress[];\n\tstartedAt: number;\n\tupdatedAt: number;\n}\n\nconst delegatedLiveState = new Map<string, DelegatedSubagentLiveState>();\n\nexport function updateDelegatedLiveState(requestId: string, update: Partial<DelegatedSubagentLiveState>): void {\n\tconst now = Date.now();\n\tconst existing = delegatedLiveState.get(requestId) ?? {\n\t\trecentOutput: [],\n\t\trecentTools: [],\n\t\ttoolCount: 0,\n\t\tdurationMs: 0,\n\t\ttokens: 0,\n\t\ttaskProgress: [],\n\t\tstartedAt: now,\n\t\tupdatedAt: now,\n\t};\n\tconst next: DelegatedSubagentLiveState = {\n\t\t...existing,\n\t\t...update,\n\t\trecentOutput: update.recentOutput ?? existing.recentOutput,\n\t\trecentTools: update.recentTools ?? existing.recentTools,\n\t\tmodel: update.model ?? existing.model,\n\t\ttoolCount: update.toolCount ?? existing.toolCount,\n\t\tdurationMs: update.durationMs ?? (now - existing.startedAt),\n\t\ttokens: update.tokens ?? existing.tokens,\n\t\ttaskProgress: update.taskProgress ?? existing.taskProgress,\n\t\tstartedAt: existing.startedAt,\n\t\tupdatedAt: now,\n\t};\n\tdelegatedLiveState.set(requestId, next);\n}\n\nexport function appendDelegatedLiveOutput(requestId: string, line?: string): void {\n\tif (!line || !line.trim() || line.trim() === \"(running...)\") return;\n\tconst fallbackNow = Date.now();\n\tconst existing = delegatedLiveState.get(requestId) ?? {\n\t\trecentOutput: [],\n\t\trecentTools: [],\n\t\ttoolCount: 0,\n\t\tdurationMs: 0,\n\t\ttokens: 0,\n\t\ttaskProgress: [],\n\t\tstartedAt: fallbackNow,\n\t\tupdatedAt: fallbackNow,\n\t};\n\tconst recentOutput = [...existing.recentOutput, line];\n\tdelegatedLiveState.set(requestId, {\n\t\t...existing,\n\t\trecentOutput,\n\t\tupdatedAt: Date.now(),\n\t});\n}\n\nexport function getDelegatedLiveState(requestId: string): DelegatedSubagentLiveState | undefined {\n\treturn delegatedLiveState.get(requestId);\n}\n\nexport function clearDelegatedLiveState(requestId: string): void {\n\tdelegatedLiveState.delete(requestId);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagent-step.d.ts","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-prompt-template-model/subagent-step.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAoB,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACtF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAGnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAqB1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAGlD,UAAU,0BAA0B;IACnC,EAAE,EAAE,YAAY,CAAC;IACjB,GAAG,EAAE,gBAAgB,CAAC;IACtB,YAAY,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,cAAc,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,UAAU,4BAA6B,SAAQ,0BAA0B;IACxE,MAAM,EAAE,eAAe,CAAC;IACxB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,CAAC,EAAE,KAAK,CAAC;CACjB;AAED,UAAU,0BAA0B;IACnC,MAAM,EAAE,eAAe,CAAC;IACxB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,8BAA+B,SAAQ,0BAA0B;IAC1E,QAAQ,EAAE,0BAA0B,EAAE,CAAC;IACvC,MAAM,CAAC,EAAE,KAAK,CAAC;IACf,IAAI,CAAC,EAAE,KAAK,CAAC;CACb;AAED,KAAK,sBAAsB,GAAG,4BAA4B,GAAG,8BAA8B,CAAC;AAE5F,MAAM,WAAW,6BAA6B;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,6BAA6B,EAAE,CAAC;CAClD;AA2cD,wBAAsB,yBAAyB,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,GAAG,SAAS,CAAC,CA4J5H","sourcesContent":["// @ts-nocheck\nimport { existsSync } from \"node:fs\";\nimport { randomUUID } from \"node:crypto\";\nimport type { AssistantMessage, Message } from \"@ashx-j/lunr-ai\";\nimport type { ExtensionAPI, ExtensionContext } from \"@ashx-j/lunr\";\nimport type { Model } from \"@ashx-j/lunr-ai\";\nimport { Key, matchesKey } from \"@ashx-j/lunr-tui\";\nimport { preparePromptExecution } from \"./prompt-execution.ts\";\nimport type { PromptWithModel } from \"./prompt-loader.ts\";\nimport { notify } from \"./notifications.ts\";\nimport {\n\tDEFAULT_SUBAGENT_NAME,\n\tappendDelegatedLiveOutput,\n\tclearDelegatedLiveState,\n\tgetDelegatedLiveState,\n\tPROMPT_TEMPLATE_SUBAGENT_CANCEL_EVENT,\n\tPROMPT_TEMPLATE_SUBAGENT_MESSAGE_TYPE,\n\tPROMPT_TEMPLATE_SUBAGENT_REQUEST_EVENT,\n\tPROMPT_TEMPLATE_SUBAGENT_RESPONSE_EVENT,\n\tPROMPT_TEMPLATE_SUBAGENT_STARTED_EVENT,\n\tPROMPT_TEMPLATE_SUBAGENT_UPDATE_EVENT,\n\tupdateDelegatedLiveState,\n\ttype DelegatedSubagentParallelResult,\n\ttype DelegatedSubagentRequest,\n\ttype DelegatedSubagentResponse,\n\ttype DelegatedSubagentTask,\n\ttype DelegatedSubagentTaskProgress,\n\ttype DelegatedSubagentUpdate,\n} from \"./subagent-runtime.ts\";\nimport type { SubagentOverride } from \"./args.ts\";\nimport { createDelegatedProgressWidget, DELEGATED_WIDGET_KEY } from \"./subagent-widget.ts\";\n\ninterface DelegatedPromptBaseOptions {\n\tpi: ExtensionAPI;\n\tctx: ExtensionContext;\n\tcurrentModel: Model<any> | undefined;\n\toverride?: SubagentOverride;\n\tsignal?: AbortSignal;\n\tinheritedModel?: Model<any>;\n\ttaskPreamble?: string;\n\tworktree?: boolean;\n\tallowPartialFailures?: boolean;\n}\n\ninterface DelegatedSinglePromptOptions extends DelegatedPromptBaseOptions {\n\tprompt: PromptWithModel;\n\targs: string[];\n\tparallel?: never;\n}\n\ninterface DelegatedParallelTaskInput {\n\tprompt: PromptWithModel;\n\targs: string[];\n\ttaskPrefix?: string;\n}\n\ninterface DelegatedParallelPromptOptions extends DelegatedPromptBaseOptions {\n\tparallel: DelegatedParallelTaskInput[];\n\tprompt?: never;\n\targs?: never;\n}\n\ntype DelegatedPromptOptions = DelegatedSinglePromptOptions | DelegatedParallelPromptOptions;\n\nexport interface DelegatedPromptParallelResult {\n\tagent: string;\n\ttext: string;\n\tmessages: Message[];\n\tisError: boolean;\n\terrorText?: string;\n}\n\nexport interface DelegatedPromptOutcome {\n\tchanged: boolean;\n\ttext: string;\n\tagent: string;\n\tparallelResults?: DelegatedPromptParallelResult[];\n}\n\nfunction extractTextFromBlocks(content: AssistantMessage[\"content\"]): string {\n\tfor (let i = content.length - 1; i >= 0; i--) {\n\t\tconst block = content[i];\n\t\tif (block.type === \"text\") {\n\t\t\tconst trimmed = block.text.trim();\n\t\t\tif (trimmed) return trimmed;\n\t\t}\n\t}\n\treturn \"\";\n}\n\nfunction extractDelegatedText(messages: Message[]): string {\n\tfor (let i = messages.length - 1; i >= 0; i--) {\n\t\tconst message = messages[i];\n\t\tif (message.role !== \"assistant\") continue;\n\t\tconst text = extractTextFromBlocks((message as AssistantMessage).content);\n\t\tif (text) return text;\n\t}\n\treturn \"\";\n}\n\nfunction delegatedMessagesChanged(messages: Message[]): boolean {\n\tfor (const message of messages) {\n\t\tif (message.role !== \"assistant\") continue;\n\t\tfor (const block of (message as AssistantMessage).content) {\n\t\t\tif (block.type !== \"toolCall\") continue;\n\t\t\tif (block.name === \"write\" || block.name === \"edit\") return true;\n\t\t}\n\t}\n\treturn false;\n}\n\nfunction coerceMessages(messages: unknown[]): Message[] {\n\tif (!Array.isArray(messages)) return [];\n\treturn messages as Message[];\n}\n\nfunction coerceParallelResults(parallelResults: DelegatedSubagentParallelResult[] | undefined): DelegatedPromptParallelResult[] {\n\tif (!Array.isArray(parallelResults)) return [];\n\treturn parallelResults.map((result) => {\n\t\tconst messages = coerceMessages(result.messages);\n\t\treturn {\n\t\t\tagent: result.agent,\n\t\t\ttext: extractDelegatedText(messages),\n\t\t\tmessages,\n\t\t\tisError: result.isError === true,\n\t\t\terrorText: result.errorText,\n\t\t};\n\t});\n}\n\nfunction renderParallelDelegatedText(\n\tresults: Array<{\n\t\tagent: string;\n\t\tmessages: Message[];\n\t}>,\n): string {\n\treturn results\n\t\t.map((result, index) => {\n\t\t\tconst text = extractDelegatedText(result.messages);\n\t\t\tconst body = text || \"(no assistant text)\";\n\t\t\treturn `=== Parallel Task ${index + 1} (${result.agent}) ===\\n${body}`;\n\t\t})\n\t\t.join(\"\\n\\n\");\n}\n\nfunction resolveDelegationName(prompt: PromptWithModel, override?: SubagentOverride): string | undefined {\n\tif (override) {\n\t\treturn override.agent || (typeof prompt.subagent === \"string\" ? prompt.subagent : DEFAULT_SUBAGENT_NAME);\n\t}\n\tif (prompt.subagent === true) return DEFAULT_SUBAGENT_NAME;\n\tif (typeof prompt.subagent === \"string\") return prompt.subagent;\n\treturn undefined;\n}\n\ninterface PreparedDelegatedTask {\n\tpromptName: string;\n\tagent: string;\n\ttask: string;\n\tcontext: \"fresh\" | \"fork\";\n\tmodel: string;\n\tcwd: string;\n}\n\nasync function prepareDelegatedTask(\n\ttask: DelegatedParallelTaskInput,\n\tctx: ExtensionContext,\n\tcurrentModel: Model<any> | undefined,\n\toverride: SubagentOverride | undefined,\n\tinheritedModel: Model<any> | undefined,\n\ttaskPreamble: string | undefined,\n): Promise<PreparedDelegatedTask> {\n\tconst requestedAgent = resolveDelegationName(task.prompt, override);\n\tif (!requestedAgent) {\n\t\tthrow new Error(`Prompt \\`${task.prompt.name}\\` is not configured for delegated execution.`);\n\t}\n\tconst effectiveCwd = task.prompt.cwd ?? ctx.cwd;\n\tif (effectiveCwd !== ctx.cwd && !existsSync(effectiveCwd)) {\n\t\tthrow new Error(`cwd directory does not exist: ${effectiveCwd}`);\n\t}\n\tconst agent = requestedAgent;\n\tconst preparationOptions = inheritedModel === undefined ? undefined : { inheritedModel };\n\tconst prepared = await preparePromptExecution(\n\t\ttask.prompt,\n\t\ttask.args,\n\t\tcurrentModel,\n\t\tctx.modelRegistry,\n\t\tpreparationOptions,\n\t);\n\tif (!prepared) {\n\t\tthrow new Error(`No available model from: ${task.prompt.models.join(\", \")}`);\n\t}\n\tif (\"message\" in prepared) {\n\t\tif (prepared.warning) notify(ctx, prepared.warning, \"warning\");\n\t\tthrow new Error(prepared.message);\n\t}\n\tif (prepared.warning) notify(ctx, prepared.warning, \"warning\");\n\tlet taskText = prepared.content;\n\tif (!task.prompt.inheritContext && taskPreamble) {\n\t\ttaskText = `${taskPreamble}\\n\\n---\\n\\n${prepared.content}`;\n\t}\n\tif (task.taskPrefix) {\n\t\ttaskText = `${task.taskPrefix}\\n\\n${taskText}`;\n\t}\n\n\treturn {\n\t\tpromptName: task.prompt.name,\n\t\tagent,\n\t\ttask: taskText,\n\t\tcontext: task.prompt.inheritContext ? \"fork\" : \"fresh\",\n\t\tmodel: `${prepared.selectedModel.model.provider}/${prepared.selectedModel.model.id}`,\n\t\tcwd: effectiveCwd,\n\t};\n}\n\nfunction formatProgressStatus(update: DelegatedSubagentUpdate): string | undefined {\n\tif (update.currentTool) {\n\t\treturn `running ${update.currentTool}${update.currentToolArgs ? ` ${update.currentToolArgs}` : \"\"}`;\n\t}\n\tif (update.taskProgress?.some((task) => task.status === \"running\")) {\n\t\treturn \"running\";\n\t}\n\tif (update.toolCount && update.toolCount > 0) {\n\t\treturn `completed ${update.toolCount} tool${update.toolCount === 1 ? \"\" : \"s\"}`;\n\t}\n\treturn undefined;\n}\n\nfunction formatParallelProgressStatus(update: DelegatedSubagentUpdate): string | undefined {\n\tif (!update.taskProgress || update.taskProgress.length === 0) return undefined;\n\tconst completed = update.taskProgress.filter((task) => task.status === \"completed\").length;\n\treturn `parallel ${completed}/${update.taskProgress.length} running`;\n}\n\nfunction hasOwn<T extends object>(value: T, key: PropertyKey): boolean {\n\treturn Object.prototype.hasOwnProperty.call(value, key);\n}\n\nfunction sanitizeOutputLines(lines: string[] | undefined): string[] {\n\tif (!lines || lines.length === 0) return [];\n\treturn lines.filter((line): line is string => typeof line === \"string\" && line.trim() && line.trim() !== \"(running...)\");\n}\n\nfunction collectNewOutputLines(previous: string[] | undefined, next: string[] | undefined): string[] {\n\tconst previousLines = sanitizeOutputLines(previous);\n\tconst nextLines = sanitizeOutputLines(next);\n\tif (nextLines.length === 0) return [];\n\tif (previousLines.length === 0) return nextLines;\n\n\tconst overlapLimit = Math.min(previousLines.length, nextLines.length);\n\tfor (let overlap = overlapLimit; overlap > 0; overlap--) {\n\t\tlet matches = true;\n\t\tfor (let index = 0; index < overlap; index++) {\n\t\t\tif (previousLines[previousLines.length - overlap + index] !== nextLines[index]) {\n\t\t\t\tmatches = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (matches) {\n\t\t\treturn nextLines.slice(overlap);\n\t\t}\n\t}\n\n\treturn nextLines;\n}\n\nfunction mergeTaskProgress(\n\trequestTasks: DelegatedSubagentTask[] | undefined,\n\texistingProgress: DelegatedSubagentTaskProgress[] | undefined,\n\tincomingProgress: DelegatedSubagentTaskProgress[] | undefined,\n): DelegatedSubagentTaskProgress[] | undefined {\n\tif (!requestTasks || requestTasks.length === 0) return incomingProgress;\n\n\tconst merged = requestTasks.map((task, index) => {\n\t\tconst existing =\n\t\t\texistingProgress?.find((entry) => entry.index === index) ??\n\t\t\texistingProgress?.[index] ??\n\t\t\texistingProgress?.find((entry) => entry.agent === task.agent);\n\t\treturn {\n\t\t\tindex,\n\t\t\tagent: task.agent,\n\t\t\tstatus: existing?.status ?? \"pending\",\n\t\t\tcurrentTool: existing?.currentTool,\n\t\t\tcurrentToolArgs: existing?.currentToolArgs,\n\t\t\trecentOutput: existing?.recentOutput,\n\t\t\trecentOutputLines: existing?.recentOutputLines,\n\t\t\trecentTools: existing?.recentTools,\n\t\t\tmodel: existing?.model ?? task.model,\n\t\t\ttoolCount: existing?.toolCount,\n\t\t\tdurationMs: existing?.durationMs,\n\t\t\ttokens: existing?.tokens,\n\t\t};\n\t});\n\n\tif (!incomingProgress || incomingProgress.length === 0) return merged;\n\n\tconst consumed = new Set<number>();\n\tfor (const entry of incomingProgress) {\n\t\tlet targetIndex =\n\t\t\ttypeof entry.index === \"number\" && entry.index >= 0 && entry.index < merged.length\n\t\t\t\t? entry.index\n\t\t\t\t: -1;\n\n\t\tif (targetIndex < 0) {\n\t\t\ttargetIndex = merged.findIndex((task, index) => task.agent === entry.agent && !consumed.has(index));\n\t\t}\n\t\tif (targetIndex < 0) continue;\n\t\tconsumed.add(targetIndex);\n\t\tconst current = merged[targetIndex]!;\n\t\tmerged[targetIndex] = {\n\t\t\tindex: targetIndex,\n\t\t\tagent: current.agent,\n\t\t\tstatus: entry.status ?? current.status,\n\t\t\tcurrentTool: hasOwn(entry, \"currentTool\") ? entry.currentTool : current.currentTool,\n\t\t\tcurrentToolArgs: hasOwn(entry, \"currentToolArgs\") ? entry.currentToolArgs : current.currentToolArgs,\n\t\t\trecentOutput: entry.recentOutput ?? current.recentOutput,\n\t\t\trecentOutputLines: entry.recentOutputLines ?? current.recentOutputLines,\n\t\t\trecentTools: entry.recentTools ?? current.recentTools,\n\t\t\tmodel: entry.model ?? current.model,\n\t\t\ttoolCount: entry.toolCount ?? current.toolCount,\n\t\t\tdurationMs: entry.durationMs ?? current.durationMs,\n\t\t\ttokens: entry.tokens ?? current.tokens,\n\t\t};\n\t}\n\n\treturn merged;\n}\n\nasync function requestDelegatedRun(\n\tpi: ExtensionAPI,\n\tctx: ExtensionContext,\n\trequest: DelegatedSubagentRequest,\n\tsignal?: AbortSignal,\n): Promise<DelegatedSubagentResponse> {\n\treturn await new Promise((resolve, reject) => {\n\t\tconst requestLabel = request.tasks && request.tasks.length > 0 ? `parallel(${request.tasks.length})` : request.agent;\n\t\tlet done = false;\n\t\tlet started = false;\n\t\tconst startTimeoutMs = Number(process.env.PI_PROMPT_SUBAGENT_START_TIMEOUT_MS ?? \"15000\");\n\t\tconst effectiveTimeout = Number.isFinite(startTimeoutMs) && startTimeoutMs > 0 ? startTimeoutMs : 15_000;\n\t\tconst startTimeout = setTimeout(() => {\n\t\t\tfinish(() => reject(new Error(`Delegated subagent \\`${requestLabel}\\` did not start within ${Math.round(effectiveTimeout / 1000)}s. Check that the pi-subagents extension is loaded.`)));\n\t\t}, effectiveTimeout);\n\n\t\tconst onStarted = (data: unknown) => {\n\t\t\tif (done || !data || typeof data !== \"object\") return;\n\t\t\tconst requestId = (data as { requestId?: unknown }).requestId;\n\t\t\tif (requestId !== request.requestId) return;\n\t\t\tstarted = true;\n\t\t\tclearTimeout(startTimeout);\n\t\t\tupdateDelegatedLiveState(request.requestId, {\n\t\t\t\tstatus: \"running...\",\n\t\t\t\ttoolCount: 0,\n\t\t\t\trecentOutput: [],\n\t\t\t\ttaskProgress: request.tasks?.map((task, index) => ({ index, agent: task.agent, status: \"pending\" })) ?? [],\n\t\t\t});\n\t\t\tshowWidget();\n\t\t};\n\n\t\tconst onResponse = (data: unknown) => {\n\t\t\tif (done || !data || typeof data !== \"object\") return;\n\t\t\tconst payload = data as Partial<DelegatedSubagentResponse>;\n\t\t\tif (payload.requestId !== request.requestId) return;\n\t\t\tclearTimeout(startTimeout);\n\t\t\tupdateDelegatedLiveState(request.requestId, {\n\t\t\t\tstatus: payload.isError ? \"failed\" : \"completed\",\n\t\t\t\ttaskProgress: payload.parallelResults?.map((result, index) => ({\n\t\t\t\t\tindex,\n\t\t\t\t\tagent: result.agent,\n\t\t\t\t\tstatus: result.isError ? \"failed\" : \"completed\",\n\t\t\t\t})),\n\t\t\t});\n\t\t\tclearWidget();\n\t\t\tfinish(() => resolve(payload as DelegatedSubagentResponse));\n\t\t};\n\n\t\tlet lastProgressStatus = \"\";\n\t\tlet widgetSet = false;\n\t\tlet refreshTimer: ReturnType<typeof setInterval> | null = null;\n\n\t\tconst showWidget = () => {\n\t\t\tif (!ctx.hasUI || widgetSet) return;\n\t\t\twidgetSet = true;\n\t\t\tctx.ui.setWidget(\n\t\t\t\tDELEGATED_WIDGET_KEY,\n\t\t\t\t(_tui, theme) => createDelegatedProgressWidget(request.requestId, request.agent, request.context, request.task, request.tasks, theme, request.model),\n\t\t\t\t{ placement: \"aboveEditor\" },\n\t\t\t);\n\t\t\t// Force TUI repaints every second so the elapsed timer ticks during idle periods\n\t\t\trefreshTimer = setInterval(() => {\n\t\t\t\tif (done) return;\n\t\t\t\tconst statusLine = lastProgressStatus || \"running...\";\n\t\t\t\tctx.ui.setStatus(\"prompt-subagent\", `delegating to ${requestLabel} · ${statusLine}`);\n\t\t\t}, 1000);\n\t\t};\n\n\t\tconst clearWidget = () => {\n\t\t\tif (refreshTimer) {\n\t\t\t\tclearInterval(refreshTimer);\n\t\t\t\trefreshTimer = null;\n\t\t\t}\n\t\t\tif (ctx.hasUI && widgetSet) {\n\t\t\t\tctx.ui.setWidget(DELEGATED_WIDGET_KEY, undefined);\n\t\t\t\twidgetSet = false;\n\t\t\t}\n\t\t};\n\n\t\tconst onUpdate = (data: unknown) => {\n\t\t\tif (done || !data || typeof data !== \"object\") return;\n\t\t\tconst update = data as DelegatedSubagentUpdate;\n\t\t\tif (update.requestId !== request.requestId) return;\n\n\t\t\tconst previousTaskProgress = getDelegatedLiveState(request.requestId)?.taskProgress;\n\t\t\tconst mergedTaskProgress = mergeTaskProgress(\n\t\t\t\trequest.tasks,\n\t\t\t\tpreviousTaskProgress,\n\t\t\t\tupdate.taskProgress,\n\t\t\t);\n\t\t\tconst isParallel = (request.tasks?.length ?? 0) > 0;\n\t\t\tconst progressStatus = isParallel\n\t\t\t\t? formatParallelProgressStatus({\n\t\t\t\t\t...update,\n\t\t\t\t\ttaskProgress: mergedTaskProgress,\n\t\t\t\t}) ?? formatProgressStatus(update)\n\t\t\t\t: formatProgressStatus(update);\n\t\t\tif (progressStatus) {\n\t\t\t\tlastProgressStatus = progressStatus;\n\t\t\t}\n\n\t\t\tupdateDelegatedLiveState(request.requestId, {\n\t\t\t\tstatus: progressStatus ?? (lastProgressStatus || \"running...\"),\n\t\t\t\tcurrentTool: update.currentTool,\n\t\t\t\tcurrentToolArgs: update.currentToolArgs,\n\t\t\t\trecentTools: update.recentTools,\n\t\t\t\tmodel: update.model,\n\t\t\t\ttoolCount: update.toolCount,\n\t\t\t\tdurationMs: update.durationMs,\n\t\t\t\ttokens: update.tokens,\n\t\t\t\ttaskProgress: mergedTaskProgress,\n\t\t\t});\n\n\t\t\tif (!isParallel) {\n\t\t\t\tif (update.recentOutputLines && update.recentOutputLines.length > 0) {\n\t\t\t\t\tupdateDelegatedLiveState(request.requestId, {\n\t\t\t\t\t\trecentOutput: sanitizeOutputLines(update.recentOutputLines),\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tappendDelegatedLiveOutput(request.requestId, update.recentOutput);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (isParallel && mergedTaskProgress) {\n\t\t\t\tfor (const task of mergedTaskProgress) {\n\t\t\t\t\tconst previousTask =\n\t\t\t\t\t\tpreviousTaskProgress?.find((entry) => entry.index === task.index) ??\n\t\t\t\t\t\tpreviousTaskProgress?.find((entry) => entry.agent === task.agent);\n\n\t\t\t\t\tconst newOutputLines = collectNewOutputLines(previousTask?.recentOutputLines, task.recentOutputLines);\n\t\t\t\t\tif (newOutputLines.length > 0) {\n\t\t\t\t\t\tfor (const line of newOutputLines) {\n\t\t\t\t\t\t\tappendDelegatedLiveOutput(request.requestId, line);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!task.recentOutput || task.recentOutput === previousTask?.recentOutput) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tappendDelegatedLiveOutput(request.requestId, task.recentOutput);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!ctx.hasUI) return;\n\t\t\tconst statusLine = progressStatus ?? (lastProgressStatus || \"running...\");\n\t\t\tctx.ui.setStatus(\"prompt-subagent\", `delegating to ${requestLabel} · ${statusLine}`);\n\t\t};\n\n\t\tconst onTerminalInput = ctx.hasUI\n\t\t\t? ctx.ui.onTerminalInput((input) => {\n\t\t\t\tif (!matchesKey(input, Key.escape)) return undefined;\n\t\t\t\tpi.events.emit(PROMPT_TEMPLATE_SUBAGENT_CANCEL_EVENT, {\n\t\t\t\t\trequestId: request.requestId,\n\t\t\t\t\treason: \"escape\",\n\t\t\t\t});\n\t\t\t\tfinish(() => reject(new Error(\"Delegated prompt cancelled.\")));\n\t\t\t\treturn { consume: true };\n\t\t\t})\n\t\t\t: undefined;\n\n\t\tconst unsubscribeStarted = pi.events.on(PROMPT_TEMPLATE_SUBAGENT_STARTED_EVENT, onStarted);\n\t\tconst unsubscribeResponse = pi.events.on(PROMPT_TEMPLATE_SUBAGENT_RESPONSE_EVENT, onResponse);\n\t\tconst unsubscribeUpdate = pi.events.on(PROMPT_TEMPLATE_SUBAGENT_UPDATE_EVENT, onUpdate);\n\t\tlet onAbort: (() => void) | undefined;\n\n\t\tconst finish = (next: () => void) => {\n\t\t\tif (done) return;\n\t\t\tdone = true;\n\t\t\tclearTimeout(startTimeout);\n\t\t\tunsubscribeStarted();\n\t\t\tunsubscribeResponse();\n\t\t\tunsubscribeUpdate();\n\t\t\tonTerminalInput?.();\n\t\t\tclearWidget();\n\t\t\tif (signal && onAbort) signal.removeEventListener(\"abort\", onAbort);\n\t\t\tnext();\n\t\t};\n\n\t\tonAbort = () => {\n\t\t\tpi.events.emit(PROMPT_TEMPLATE_SUBAGENT_CANCEL_EVENT, {\n\t\t\t\trequestId: request.requestId,\n\t\t\t\treason: \"abort\",\n\t\t\t});\n\t\t\tfinish(() => reject(new Error(\"Delegated prompt cancelled.\")));\n\t\t};\n\t\tif (signal) {\n\t\t\tif (signal.aborted) {\n\t\t\t\tonAbort();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t\t}\n\n\t\tpi.events.emit(PROMPT_TEMPLATE_SUBAGENT_REQUEST_EVENT, request);\n\n\t\t// The bridge emits STARTED_EVENT synchronously during the REQUEST_EVENT\n\t\t// emit (all sync before the first await in the async handler chain).\n\t\t// If started is still false, no bridge received the request.\n\t\tif (!started && done) return; // already finished (e.g. response came synchronously)\n\t\tif (!started) {\n\t\t\tfinish(() => reject(new Error(\n\t\t\t\t`No loaded pi-subagents bridge responded for \\`${requestLabel}\\`. ` +\n\t\t\t\t`Install or load pi-subagents and make sure no extension name conflicts are blocking it.`,\n\t\t\t)));\n\t\t\treturn;\n\t\t}\n\t});\n}\n\nexport async function executeSubagentPromptStep(options: DelegatedPromptOptions): Promise<DelegatedPromptOutcome | undefined> {\n\tconst { pi, ctx, currentModel, override, signal, inheritedModel, taskPreamble, allowPartialFailures } = options;\n\tconst isParallelRequest = \"parallel\" in options;\n\n\tconst tasks = isParallelRequest\n\t\t? options.parallel\n\t\t: [{ prompt: options.prompt, args: options.args }];\n\tif (tasks.length === 0) return undefined;\n\n\tconst preparedTasks: PreparedDelegatedTask[] = [];\n\tfor (const task of tasks) {\n\t\tconst preparedTask = await prepareDelegatedTask(task, ctx, currentModel, override, inheritedModel, taskPreamble);\n\t\tpreparedTasks.push(preparedTask);\n\t}\n\n\tconst requestContext = preparedTasks[0]!.context;\n\tconst requestCwd = preparedTasks[0]!.cwd;\n\tfor (const preparedTask of preparedTasks) {\n\t\tif (preparedTask.context !== requestContext) {\n\t\t\tthrow new Error(\"Parallel delegated prompts must share the same inheritContext setting.\");\n\t\t}\n\t\tif (options.worktree === true && preparedTask.cwd !== requestCwd) {\n\t\t\tthrow new Error(\"Parallel delegated prompts with worktree enabled must share the same cwd setting.\");\n\t\t}\n\t}\n\n\tconst request: DelegatedSubagentRequest = {\n\t\trequestId: randomUUID(),\n\t\tagent: preparedTasks[0]!.agent,\n\t\ttask: preparedTasks[0]!.task,\n\t\t...(isParallelRequest\n\t\t\t? {\n\t\t\t\ttasks: preparedTasks.map<DelegatedSubagentTask>((task) => ({\n\t\t\t\t\tagent: task.agent,\n\t\t\t\t\ttask: task.task,\n\t\t\t\t\tmodel: task.model,\n\t\t\t\t\tcwd: task.cwd,\n\t\t\t\t})),\n\t\t\t}\n\t\t\t: {}),\n\t\tcontext: requestContext,\n\t\tmodel: preparedTasks[0]!.model,\n\t\tcwd: requestCwd,\n\t\t...(options.worktree ? { worktree: true } : {}),\n\t};\n\n\tconst promptLabel = preparedTasks.map((task) => task.promptName).join(\", \");\n\tconst statusLabel = isParallelRequest ? `parallel(${preparedTasks.length})` : preparedTasks[0]!.agent;\n\tif (ctx.hasUI) {\n\t\tctx.ui.setStatus(\"prompt-subagent\", `delegating to ${statusLabel}`);\n\t\tctx.ui.setWorkingMessage(isParallelRequest ? `Running delegated parallel prompts with ${statusLabel}...` : `Running delegated prompt with ${statusLabel}...`);\n\t}\n\tnotify(\n\t\tctx,\n\t\tisParallelRequest\n\t\t\t? `Delegating parallel prompts (${promptLabel})`\n\t\t\t: `Delegating prompt \\`${preparedTasks[0]!.promptName}\\` to subagent \\`${preparedTasks[0]!.agent}\\``,\n\t\t\"info\",\n\t);\n\n\ttry {\n\t\tconst response = await requestDelegatedRun(pi, ctx, request, signal);\n\t\tif (response.isError) {\n\t\t\tthrow new Error(\n\t\t\t\t`Delegated prompt execution failed: ${response.errorText || \"unknown delegated error\"}`,\n\t\t\t);\n\t\t}\n\n\t\tif (isParallelRequest) {\n\t\t\tconst parallelResults = coerceParallelResults(response.parallelResults);\n\t\t\tif (parallelResults.length === 0) {\n\t\t\t\tthrow new Error(\"Delegated parallel execution returned no results.\");\n\t\t\t}\n\t\t\tconst failures = parallelResults.filter((result) => result.isError);\n\t\t\tif (!allowPartialFailures && failures.length > 0) {\n\t\t\t\tconst failureText = failures\n\t\t\t\t\t.map((failure) => `${failure.agent}: ${failure.errorText || \"unknown delegated error\"}`)\n\t\t\t\t\t.join(\"; \");\n\t\t\t\tthrow new Error(`Delegated parallel execution failed: ${failureText}`);\n\t\t\t}\n\n\t\t\tconst text = response.contentText?.trim() || renderParallelDelegatedText(parallelResults);\n\t\t\tconst changed =\n\t\t\t\tparallelResults.some((result) => delegatedMessagesChanged(result.messages))\n\t\t\t\t|| text.includes(\"=== Worktree Changes ===\");\n\t\t\tpi.sendMessage({\n\t\t\t\tcustomType: PROMPT_TEMPLATE_SUBAGENT_MESSAGE_TYPE,\n\t\t\t\tcontent: text,\n\t\t\t\tdisplay: true,\n\t\t\t\tdetails: {\n\t\t\t\t\trequestId: response.requestId,\n\t\t\t\t\tagent: request.agent,\n\t\t\t\t\ttask: preparedTasks.map((task) => task.task).join(\"\\n\\n\"),\n\t\t\t\t\tcontext: response.context,\n\t\t\t\t\tmodel: response.model,\n\t\t\t\t\tmessages: [],\n\t\t\t\t\tparallelResults,\n\t\t\t\t\ttext,\n\t\t\t\t\tchanged,\n\t\t\t\t\tisError: false,\n\t\t\t\t\terrorText: response.errorText,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\tchanged,\n\t\t\t\ttext,\n\t\t\t\tagent: request.agent,\n\t\t\t\tparallelResults,\n\t\t\t};\n\t\t}\n\n\t\tconst messages = coerceMessages(response.messages);\n\t\tconst text = extractDelegatedText(messages);\n\t\tif (!text) {\n\t\t\tthrow new Error(\"Delegated subagent returned no assistant text.\");\n\t\t}\n\n\t\tconst changed = delegatedMessagesChanged(messages);\n\t\tpi.sendMessage({\n\t\t\tcustomType: PROMPT_TEMPLATE_SUBAGENT_MESSAGE_TYPE,\n\t\t\tcontent: text,\n\t\t\tdisplay: true,\n\t\t\tdetails: {\n\t\t\t\trequestId: response.requestId,\n\t\t\t\tagent: preparedTasks[0]!.agent,\n\t\t\t\ttask: request.task,\n\t\t\t\tcontext: response.context,\n\t\t\t\tmodel: response.model,\n\t\t\t\tmessages,\n\t\t\t\ttext,\n\t\t\t\tchanged,\n\t\t\t\tisError: false,\n\t\t\t\terrorText: response.errorText,\n\t\t\t},\n\t\t});\n\n\t\treturn {\n\t\t\tchanged,\n\t\t\ttext,\n\t\t\tagent: preparedTasks[0]!.agent,\n\t\t};\n\t} catch (error) {\n\t\tconst cause = error instanceof Error ? error : new Error(String(error));\n\t\tconst responseText = cause.message;\n\t\tif (isParallelRequest) {\n\t\t\tthrow new Error(`Parallel delegated prompts (${promptLabel}) failed: ${responseText}`, { cause });\n\t\t}\n\t\tthrow new Error(`Prompt \\`${preparedTasks[0]!.promptName}\\` delegated subagent \\`${preparedTasks[0]!.agent}\\` failed: ${responseText}`, { cause });\n\t} finally {\n\t\tclearDelegatedLiveState(request.requestId);\n\t\tif (ctx.hasUI) {\n\t\t\tctx.ui.setStatus(\"prompt-subagent\", undefined);\n\t\t\tctx.ui.setWorkingMessage();\n\t\t}\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"subagent-step.d.ts","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-prompt-template-model/subagent-step.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAoB,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACtF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAGnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAqB1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAGlD,UAAU,0BAA0B;IACnC,EAAE,EAAE,YAAY,CAAC;IACjB,GAAG,EAAE,gBAAgB,CAAC;IACtB,YAAY,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,cAAc,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,UAAU,4BAA6B,SAAQ,0BAA0B;IACxE,MAAM,EAAE,eAAe,CAAC;IACxB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,CAAC,EAAE,KAAK,CAAC;CACjB;AAED,UAAU,0BAA0B;IACnC,MAAM,EAAE,eAAe,CAAC;IACxB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,8BAA+B,SAAQ,0BAA0B;IAC1E,QAAQ,EAAE,0BAA0B,EAAE,CAAC;IACvC,MAAM,CAAC,EAAE,KAAK,CAAC;IACf,IAAI,CAAC,EAAE,KAAK,CAAC;CACb;AAED,KAAK,sBAAsB,GAAG,4BAA4B,GAAG,8BAA8B,CAAC;AAE5F,MAAM,WAAW,6BAA6B;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,6BAA6B,EAAE,CAAC;CAClD;AA2cD,wBAAsB,yBAAyB,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,GAAG,SAAS,CAAC,CA4J5H","sourcesContent":["// @ts-nocheck\nimport { existsSync } from \"node:fs\";\nimport { randomUUID } from \"node:crypto\";\nimport type { AssistantMessage, Message } from \"@ashx-j/lunr-ai\";\nimport type { ExtensionAPI, ExtensionContext } from \"@ashx-j/lunr\";\nimport type { Model } from \"@ashx-j/lunr-ai\";\nimport { Key, matchesKey } from \"@ashx-j/lunr-tui\";\nimport { preparePromptExecution } from \"./prompt-execution.ts\";\nimport type { PromptWithModel } from \"./prompt-loader.ts\";\nimport { notify } from \"./notifications.ts\";\nimport {\n\tDEFAULT_SUBAGENT_NAME,\n\tappendDelegatedLiveOutput,\n\tclearDelegatedLiveState,\n\tgetDelegatedLiveState,\n\tPROMPT_TEMPLATE_SUBAGENT_CANCEL_EVENT,\n\tPROMPT_TEMPLATE_SUBAGENT_MESSAGE_TYPE,\n\tPROMPT_TEMPLATE_SUBAGENT_REQUEST_EVENT,\n\tPROMPT_TEMPLATE_SUBAGENT_RESPONSE_EVENT,\n\tPROMPT_TEMPLATE_SUBAGENT_STARTED_EVENT,\n\tPROMPT_TEMPLATE_SUBAGENT_UPDATE_EVENT,\n\tupdateDelegatedLiveState,\n\ttype DelegatedSubagentParallelResult,\n\ttype DelegatedSubagentRequest,\n\ttype DelegatedSubagentResponse,\n\ttype DelegatedSubagentTask,\n\ttype DelegatedSubagentTaskProgress,\n\ttype DelegatedSubagentUpdate,\n} from \"./subagent-runtime.ts\";\nimport type { SubagentOverride } from \"./args.ts\";\nimport { createDelegatedProgressWidget, DELEGATED_WIDGET_KEY } from \"./subagent-widget.ts\";\n\ninterface DelegatedPromptBaseOptions {\n\tpi: ExtensionAPI;\n\tctx: ExtensionContext;\n\tcurrentModel: Model<any> | undefined;\n\toverride?: SubagentOverride;\n\tsignal?: AbortSignal;\n\tinheritedModel?: Model<any>;\n\ttaskPreamble?: string;\n\tworktree?: boolean;\n\tallowPartialFailures?: boolean;\n}\n\ninterface DelegatedSinglePromptOptions extends DelegatedPromptBaseOptions {\n\tprompt: PromptWithModel;\n\targs: string[];\n\tparallel?: never;\n}\n\ninterface DelegatedParallelTaskInput {\n\tprompt: PromptWithModel;\n\targs: string[];\n\ttaskPrefix?: string;\n}\n\ninterface DelegatedParallelPromptOptions extends DelegatedPromptBaseOptions {\n\tparallel: DelegatedParallelTaskInput[];\n\tprompt?: never;\n\targs?: never;\n}\n\ntype DelegatedPromptOptions = DelegatedSinglePromptOptions | DelegatedParallelPromptOptions;\n\nexport interface DelegatedPromptParallelResult {\n\tagent: string;\n\ttext: string;\n\tmessages: Message[];\n\tisError: boolean;\n\terrorText?: string;\n}\n\nexport interface DelegatedPromptOutcome {\n\tchanged: boolean;\n\ttext: string;\n\tagent: string;\n\tparallelResults?: DelegatedPromptParallelResult[];\n}\n\nfunction extractTextFromBlocks(content: AssistantMessage[\"content\"]): string {\n\tfor (let i = content.length - 1; i >= 0; i--) {\n\t\tconst block = content[i];\n\t\tif (block.type === \"text\") {\n\t\t\tconst trimmed = block.text.trim();\n\t\t\tif (trimmed) return trimmed;\n\t\t}\n\t}\n\treturn \"\";\n}\n\nfunction extractDelegatedText(messages: Message[]): string {\n\tfor (let i = messages.length - 1; i >= 0; i--) {\n\t\tconst message = messages[i];\n\t\tif (message.role !== \"assistant\") continue;\n\t\tconst text = extractTextFromBlocks((message as AssistantMessage).content);\n\t\tif (text) return text;\n\t}\n\treturn \"\";\n}\n\nfunction delegatedMessagesChanged(messages: Message[]): boolean {\n\tfor (const message of messages) {\n\t\tif (message.role !== \"assistant\") continue;\n\t\tfor (const block of (message as AssistantMessage).content) {\n\t\t\tif (block.type !== \"toolCall\") continue;\n\t\t\tif (block.name === \"write\" || block.name === \"edit\") return true;\n\t\t}\n\t}\n\treturn false;\n}\n\nfunction coerceMessages(messages: unknown[]): Message[] {\n\tif (!Array.isArray(messages)) return [];\n\treturn messages as Message[];\n}\n\nfunction coerceParallelResults(parallelResults: DelegatedSubagentParallelResult[] | undefined): DelegatedPromptParallelResult[] {\n\tif (!Array.isArray(parallelResults)) return [];\n\treturn parallelResults.map((result) => {\n\t\tconst messages = coerceMessages(result.messages);\n\t\treturn {\n\t\t\tagent: result.agent,\n\t\t\ttext: extractDelegatedText(messages),\n\t\t\tmessages,\n\t\t\tisError: result.isError === true,\n\t\t\terrorText: result.errorText,\n\t\t};\n\t});\n}\n\nfunction renderParallelDelegatedText(\n\tresults: Array<{\n\t\tagent: string;\n\t\tmessages: Message[];\n\t}>,\n): string {\n\treturn results\n\t\t.map((result, index) => {\n\t\t\tconst text = extractDelegatedText(result.messages);\n\t\t\tconst body = text || \"(no assistant text)\";\n\t\t\treturn `=== Parallel Task ${index + 1} (${result.agent}) ===\\n${body}`;\n\t\t})\n\t\t.join(\"\\n\\n\");\n}\n\nfunction resolveDelegationName(prompt: PromptWithModel, override?: SubagentOverride): string | undefined {\n\tif (override) {\n\t\treturn override.agent || (typeof prompt.subagent === \"string\" ? prompt.subagent : DEFAULT_SUBAGENT_NAME);\n\t}\n\tif (prompt.subagent === true) return DEFAULT_SUBAGENT_NAME;\n\tif (typeof prompt.subagent === \"string\") return prompt.subagent;\n\treturn undefined;\n}\n\ninterface PreparedDelegatedTask {\n\tpromptName: string;\n\tagent: string;\n\ttask: string;\n\tcontext: \"fresh\" | \"fork\";\n\tmodel: string;\n\tcwd: string;\n}\n\nasync function prepareDelegatedTask(\n\ttask: DelegatedParallelTaskInput,\n\tctx: ExtensionContext,\n\tcurrentModel: Model<any> | undefined,\n\toverride: SubagentOverride | undefined,\n\tinheritedModel: Model<any> | undefined,\n\ttaskPreamble: string | undefined,\n): Promise<PreparedDelegatedTask> {\n\tconst requestedAgent = resolveDelegationName(task.prompt, override);\n\tif (!requestedAgent) {\n\t\tthrow new Error(`Prompt \\`${task.prompt.name}\\` is not configured for delegated execution.`);\n\t}\n\tconst effectiveCwd = task.prompt.cwd ?? ctx.cwd;\n\tif (effectiveCwd !== ctx.cwd && !existsSync(effectiveCwd)) {\n\t\tthrow new Error(`cwd directory does not exist: ${effectiveCwd}`);\n\t}\n\tconst agent = requestedAgent;\n\tconst preparationOptions = inheritedModel === undefined ? undefined : { inheritedModel };\n\tconst prepared = await preparePromptExecution(\n\t\ttask.prompt,\n\t\ttask.args,\n\t\tcurrentModel,\n\t\tctx.modelRegistry,\n\t\tpreparationOptions,\n\t);\n\tif (!prepared) {\n\t\tthrow new Error(`No available model from: ${task.prompt.models.join(\", \")}`);\n\t}\n\tif (\"message\" in prepared) {\n\t\tif (prepared.warning) notify(ctx, prepared.warning, \"warning\");\n\t\tthrow new Error(prepared.message);\n\t}\n\tif (prepared.warning) notify(ctx, prepared.warning, \"warning\");\n\tlet taskText = prepared.content;\n\tif (!task.prompt.inheritContext && taskPreamble) {\n\t\ttaskText = `${taskPreamble}\\n\\n---\\n\\n${prepared.content}`;\n\t}\n\tif (task.taskPrefix) {\n\t\ttaskText = `${task.taskPrefix}\\n\\n${taskText}`;\n\t}\n\n\treturn {\n\t\tpromptName: task.prompt.name,\n\t\tagent,\n\t\ttask: taskText,\n\t\tcontext: task.prompt.inheritContext ? \"fork\" : \"fresh\",\n\t\tmodel: `${prepared.selectedModel.model.provider}/${prepared.selectedModel.model.id}`,\n\t\tcwd: effectiveCwd,\n\t};\n}\n\nfunction formatProgressStatus(update: DelegatedSubagentUpdate): string | undefined {\n\tif (update.currentTool) {\n\t\treturn `running ${update.currentTool}${update.currentToolArgs ? ` ${update.currentToolArgs}` : \"\"}`;\n\t}\n\tif (update.taskProgress?.some((task) => task.status === \"running\")) {\n\t\treturn \"running\";\n\t}\n\tif (update.toolCount && update.toolCount > 0) {\n\t\treturn `completed ${update.toolCount} tool${update.toolCount === 1 ? \"\" : \"s\"}`;\n\t}\n\treturn undefined;\n}\n\nfunction formatParallelProgressStatus(update: DelegatedSubagentUpdate): string | undefined {\n\tif (!update.taskProgress || update.taskProgress.length === 0) return undefined;\n\tconst completed = update.taskProgress.filter((task) => task.status === \"completed\").length;\n\treturn `parallel ${completed}/${update.taskProgress.length} running`;\n}\n\nfunction hasOwn<T extends object>(value: T, key: PropertyKey): boolean {\n\treturn Object.prototype.hasOwnProperty.call(value, key);\n}\n\nfunction sanitizeOutputLines(lines: string[] | undefined): string[] {\n\tif (!lines || lines.length === 0) return [];\n\treturn lines.filter((line): line is string => typeof line === \"string\" && line.trim() && line.trim() !== \"(running...)\");\n}\n\nfunction collectNewOutputLines(previous: string[] | undefined, next: string[] | undefined): string[] {\n\tconst previousLines = sanitizeOutputLines(previous);\n\tconst nextLines = sanitizeOutputLines(next);\n\tif (nextLines.length === 0) return [];\n\tif (previousLines.length === 0) return nextLines;\n\n\tconst overlapLimit = Math.min(previousLines.length, nextLines.length);\n\tfor (let overlap = overlapLimit; overlap > 0; overlap--) {\n\t\tlet matches = true;\n\t\tfor (let index = 0; index < overlap; index++) {\n\t\t\tif (previousLines[previousLines.length - overlap + index] !== nextLines[index]) {\n\t\t\t\tmatches = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (matches) {\n\t\t\treturn nextLines.slice(overlap);\n\t\t}\n\t}\n\n\treturn nextLines;\n}\n\nfunction mergeTaskProgress(\n\trequestTasks: DelegatedSubagentTask[] | undefined,\n\texistingProgress: DelegatedSubagentTaskProgress[] | undefined,\n\tincomingProgress: DelegatedSubagentTaskProgress[] | undefined,\n): DelegatedSubagentTaskProgress[] | undefined {\n\tif (!requestTasks || requestTasks.length === 0) return incomingProgress;\n\n\tconst merged = requestTasks.map((task, index) => {\n\t\tconst existing =\n\t\t\texistingProgress?.find((entry) => entry.index === index) ??\n\t\t\texistingProgress?.[index] ??\n\t\t\texistingProgress?.find((entry) => entry.agent === task.agent);\n\t\treturn {\n\t\t\tindex,\n\t\t\tagent: task.agent,\n\t\t\tstatus: existing?.status ?? \"pending\",\n\t\t\tcurrentTool: existing?.currentTool,\n\t\t\tcurrentToolArgs: existing?.currentToolArgs,\n\t\t\trecentOutput: existing?.recentOutput,\n\t\t\trecentOutputLines: existing?.recentOutputLines,\n\t\t\trecentTools: existing?.recentTools,\n\t\t\tmodel: existing?.model ?? task.model,\n\t\t\ttoolCount: existing?.toolCount,\n\t\t\tdurationMs: existing?.durationMs,\n\t\t\ttokens: existing?.tokens,\n\t\t};\n\t});\n\n\tif (!incomingProgress || incomingProgress.length === 0) return merged;\n\n\tconst consumed = new Set<number>();\n\tfor (const entry of incomingProgress) {\n\t\tlet targetIndex =\n\t\t\ttypeof entry.index === \"number\" && entry.index >= 0 && entry.index < merged.length\n\t\t\t\t? entry.index\n\t\t\t\t: -1;\n\n\t\tif (targetIndex < 0) {\n\t\t\ttargetIndex = merged.findIndex((task, index) => task.agent === entry.agent && !consumed.has(index));\n\t\t}\n\t\tif (targetIndex < 0) continue;\n\t\tconsumed.add(targetIndex);\n\t\tconst current = merged[targetIndex]!;\n\t\tmerged[targetIndex] = {\n\t\t\tindex: targetIndex,\n\t\t\tagent: current.agent,\n\t\t\tstatus: entry.status ?? current.status,\n\t\t\tcurrentTool: hasOwn(entry, \"currentTool\") ? entry.currentTool : current.currentTool,\n\t\t\tcurrentToolArgs: hasOwn(entry, \"currentToolArgs\") ? entry.currentToolArgs : current.currentToolArgs,\n\t\t\trecentOutput: entry.recentOutput ?? current.recentOutput,\n\t\t\trecentOutputLines: entry.recentOutputLines ?? current.recentOutputLines,\n\t\t\trecentTools: entry.recentTools ?? current.recentTools,\n\t\t\tmodel: entry.model ?? current.model,\n\t\t\ttoolCount: entry.toolCount ?? current.toolCount,\n\t\t\tdurationMs: entry.durationMs ?? current.durationMs,\n\t\t\ttokens: entry.tokens ?? current.tokens,\n\t\t};\n\t}\n\n\treturn merged;\n}\n\nasync function requestDelegatedRun(\n\tpi: ExtensionAPI,\n\tctx: ExtensionContext,\n\trequest: DelegatedSubagentRequest,\n\tsignal?: AbortSignal,\n): Promise<DelegatedSubagentResponse> {\n\treturn await new Promise((resolve, reject) => {\n\t\tconst requestLabel = request.tasks && request.tasks.length > 0 ? `parallel(${request.tasks.length})` : request.agent;\n\t\tlet done = false;\n\t\tlet started = false;\n\t\tconst startTimeoutMs = Number(process.env.PI_PROMPT_SUBAGENT_START_TIMEOUT_MS ?? \"15000\");\n\t\tconst effectiveTimeout = Number.isFinite(startTimeoutMs) && startTimeoutMs > 0 ? startTimeoutMs : 15_000;\n\t\tconst startTimeout = setTimeout(() => {\n\t\t\tfinish(() => reject(new Error(`Delegated subagent \\`${requestLabel}\\` did not start within ${Math.round(effectiveTimeout / 1000)}s. Check that the pi-subagents extension is loaded.`)));\n\t\t}, effectiveTimeout);\n\n\t\tconst onStarted = (data: unknown) => {\n\t\t\tif (done || !data || typeof data !== \"object\") return;\n\t\t\tconst requestId = (data as { requestId?: unknown }).requestId;\n\t\t\tif (requestId !== request.requestId) return;\n\t\t\tstarted = true;\n\t\t\tclearTimeout(startTimeout);\n\t\t\tupdateDelegatedLiveState(request.requestId, {\n\t\t\t\tstatus: \"running...\",\n\t\t\t\ttoolCount: 0,\n\t\t\t\trecentOutput: [],\n\t\t\t\ttaskProgress: request.tasks?.map((task, index) => ({ index, agent: task.agent, status: \"pending\" })) ?? [],\n\t\t\t});\n\t\t\tshowWidget();\n\t\t};\n\n\t\tconst onResponse = (data: unknown) => {\n\t\t\tif (done || !data || typeof data !== \"object\") return;\n\t\t\tconst payload = data as Partial<DelegatedSubagentResponse>;\n\t\t\tif (payload.requestId !== request.requestId) return;\n\t\t\tclearTimeout(startTimeout);\n\t\t\tupdateDelegatedLiveState(request.requestId, {\n\t\t\t\tstatus: payload.isError ? \"failed\" : \"completed\",\n\t\t\t\ttaskProgress: payload.parallelResults?.map((result, index) => ({\n\t\t\t\t\tindex,\n\t\t\t\t\tagent: result.agent,\n\t\t\t\t\tstatus: result.isError ? \"failed\" : \"completed\",\n\t\t\t\t})),\n\t\t\t});\n\t\t\tclearWidget();\n\t\t\tfinish(() => resolve(payload as DelegatedSubagentResponse));\n\t\t};\n\n\t\tlet lastProgressStatus = \"\";\n\t\tlet widgetSet = false;\n\t\tlet refreshTimer: ReturnType<typeof setInterval> | null = null;\n\n\t\tconst showWidget = () => {\n\t\t\tif (!ctx.hasUI || widgetSet) return;\n\t\t\twidgetSet = true;\n\t\t\tctx.ui.setWidget(\n\t\t\t\tDELEGATED_WIDGET_KEY,\n\t\t\t\t(_tui, theme) => createDelegatedProgressWidget(request.requestId, request.agent, request.context, request.task, request.tasks, theme, preparedTasks[0]?.model),\n\t\t\t\t{ placement: \"aboveEditor\" },\n\t\t\t);\n\t\t\t// Force TUI repaints every second so the elapsed timer ticks during idle periods\n\t\t\trefreshTimer = setInterval(() => {\n\t\t\t\tif (done) return;\n\t\t\t\tconst statusLine = lastProgressStatus || \"running...\";\n\t\t\t\tctx.ui.setStatus(\"prompt-subagent\", `delegating to ${requestLabel} · ${statusLine}`);\n\t\t\t}, 1000);\n\t\t};\n\n\t\tconst clearWidget = () => {\n\t\t\tif (refreshTimer) {\n\t\t\t\tclearInterval(refreshTimer);\n\t\t\t\trefreshTimer = null;\n\t\t\t}\n\t\t\tif (ctx.hasUI && widgetSet) {\n\t\t\t\tctx.ui.setWidget(DELEGATED_WIDGET_KEY, undefined);\n\t\t\t\twidgetSet = false;\n\t\t\t}\n\t\t};\n\n\t\tconst onUpdate = (data: unknown) => {\n\t\t\tif (done || !data || typeof data !== \"object\") return;\n\t\t\tconst update = data as DelegatedSubagentUpdate;\n\t\t\tif (update.requestId !== request.requestId) return;\n\n\t\t\tconst previousTaskProgress = getDelegatedLiveState(request.requestId)?.taskProgress;\n\t\t\tconst mergedTaskProgress = mergeTaskProgress(\n\t\t\t\trequest.tasks,\n\t\t\t\tpreviousTaskProgress,\n\t\t\t\tupdate.taskProgress,\n\t\t\t);\n\t\t\tconst isParallel = (request.tasks?.length ?? 0) > 0;\n\t\t\tconst progressStatus = isParallel\n\t\t\t\t? formatParallelProgressStatus({\n\t\t\t\t\t...update,\n\t\t\t\t\ttaskProgress: mergedTaskProgress,\n\t\t\t\t}) ?? formatProgressStatus(update)\n\t\t\t\t: formatProgressStatus(update);\n\t\t\tif (progressStatus) {\n\t\t\t\tlastProgressStatus = progressStatus;\n\t\t\t}\n\n\t\t\tupdateDelegatedLiveState(request.requestId, {\n\t\t\t\tstatus: progressStatus ?? (lastProgressStatus || \"running...\"),\n\t\t\t\tcurrentTool: update.currentTool,\n\t\t\t\tcurrentToolArgs: update.currentToolArgs,\n\t\t\t\trecentTools: update.recentTools,\n\t\t\t\tmodel: update.model,\n\t\t\t\ttoolCount: update.toolCount,\n\t\t\t\tdurationMs: update.durationMs,\n\t\t\t\ttokens: update.tokens,\n\t\t\t\ttaskProgress: mergedTaskProgress,\n\t\t\t});\n\n\t\t\tif (!isParallel) {\n\t\t\t\tif (update.recentOutputLines && update.recentOutputLines.length > 0) {\n\t\t\t\t\tupdateDelegatedLiveState(request.requestId, {\n\t\t\t\t\t\trecentOutput: sanitizeOutputLines(update.recentOutputLines),\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tappendDelegatedLiveOutput(request.requestId, update.recentOutput);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (isParallel && mergedTaskProgress) {\n\t\t\t\tfor (const task of mergedTaskProgress) {\n\t\t\t\t\tconst previousTask =\n\t\t\t\t\t\tpreviousTaskProgress?.find((entry) => entry.index === task.index) ??\n\t\t\t\t\t\tpreviousTaskProgress?.find((entry) => entry.agent === task.agent);\n\n\t\t\t\t\tconst newOutputLines = collectNewOutputLines(previousTask?.recentOutputLines, task.recentOutputLines);\n\t\t\t\t\tif (newOutputLines.length > 0) {\n\t\t\t\t\t\tfor (const line of newOutputLines) {\n\t\t\t\t\t\t\tappendDelegatedLiveOutput(request.requestId, line);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!task.recentOutput || task.recentOutput === previousTask?.recentOutput) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tappendDelegatedLiveOutput(request.requestId, task.recentOutput);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!ctx.hasUI) return;\n\t\t\tconst statusLine = progressStatus ?? (lastProgressStatus || \"running...\");\n\t\t\tctx.ui.setStatus(\"prompt-subagent\", `delegating to ${requestLabel} · ${statusLine}`);\n\t\t};\n\n\t\tconst onTerminalInput = ctx.hasUI\n\t\t\t? ctx.ui.onTerminalInput((input) => {\n\t\t\t\tif (!matchesKey(input, Key.escape)) return undefined;\n\t\t\t\tpi.events.emit(PROMPT_TEMPLATE_SUBAGENT_CANCEL_EVENT, {\n\t\t\t\t\trequestId: request.requestId,\n\t\t\t\t\treason: \"escape\",\n\t\t\t\t});\n\t\t\t\tfinish(() => reject(new Error(\"Delegated prompt cancelled.\")));\n\t\t\t\treturn { consume: true };\n\t\t\t})\n\t\t\t: undefined;\n\n\t\tconst unsubscribeStarted = pi.events.on(PROMPT_TEMPLATE_SUBAGENT_STARTED_EVENT, onStarted);\n\t\tconst unsubscribeResponse = pi.events.on(PROMPT_TEMPLATE_SUBAGENT_RESPONSE_EVENT, onResponse);\n\t\tconst unsubscribeUpdate = pi.events.on(PROMPT_TEMPLATE_SUBAGENT_UPDATE_EVENT, onUpdate);\n\t\tlet onAbort: (() => void) | undefined;\n\n\t\tconst finish = (next: () => void) => {\n\t\t\tif (done) return;\n\t\t\tdone = true;\n\t\t\tclearTimeout(startTimeout);\n\t\t\tunsubscribeStarted();\n\t\t\tunsubscribeResponse();\n\t\t\tunsubscribeUpdate();\n\t\t\tonTerminalInput?.();\n\t\t\tclearWidget();\n\t\t\tif (signal && onAbort) signal.removeEventListener(\"abort\", onAbort);\n\t\t\tnext();\n\t\t};\n\n\t\tonAbort = () => {\n\t\t\tpi.events.emit(PROMPT_TEMPLATE_SUBAGENT_CANCEL_EVENT, {\n\t\t\t\trequestId: request.requestId,\n\t\t\t\treason: \"abort\",\n\t\t\t});\n\t\t\tfinish(() => reject(new Error(\"Delegated prompt cancelled.\")));\n\t\t};\n\t\tif (signal) {\n\t\t\tif (signal.aborted) {\n\t\t\t\tonAbort();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t\t}\n\n\t\tpi.events.emit(PROMPT_TEMPLATE_SUBAGENT_REQUEST_EVENT, request);\n\n\t\t// The bridge emits STARTED_EVENT synchronously during the REQUEST_EVENT\n\t\t// emit (all sync before the first await in the async handler chain).\n\t\t// If started is still false, no bridge received the request.\n\t\tif (!started && done) return; // already finished (e.g. response came synchronously)\n\t\tif (!started) {\n\t\t\tfinish(() => reject(new Error(\n\t\t\t\t`No loaded pi-subagents bridge responded for \\`${requestLabel}\\`. ` +\n\t\t\t\t`Install or load pi-subagents and make sure no extension name conflicts are blocking it.`,\n\t\t\t)));\n\t\t\treturn;\n\t\t}\n\t});\n}\n\nexport async function executeSubagentPromptStep(options: DelegatedPromptOptions): Promise<DelegatedPromptOutcome | undefined> {\n\tconst { pi, ctx, currentModel, override, signal, inheritedModel, taskPreamble, allowPartialFailures } = options;\n\tconst isParallelRequest = \"parallel\" in options;\n\n\tconst tasks = isParallelRequest\n\t\t? options.parallel\n\t\t: [{ prompt: options.prompt, args: options.args }];\n\tif (tasks.length === 0) return undefined;\n\n\tconst preparedTasks: PreparedDelegatedTask[] = [];\n\tfor (const task of tasks) {\n\t\tconst preparedTask = await prepareDelegatedTask(task, ctx, currentModel, override, inheritedModel, taskPreamble);\n\t\tpreparedTasks.push(preparedTask);\n\t}\n\n\tconst requestContext = preparedTasks[0]!.context;\n\tconst requestCwd = preparedTasks[0]!.cwd;\n\tfor (const preparedTask of preparedTasks) {\n\t\tif (preparedTask.context !== requestContext) {\n\t\t\tthrow new Error(\"Parallel delegated prompts must share the same inheritContext setting.\");\n\t\t}\n\t\tif (options.worktree === true && preparedTask.cwd !== requestCwd) {\n\t\t\tthrow new Error(\"Parallel delegated prompts with worktree enabled must share the same cwd setting.\");\n\t\t}\n\t}\n\n\tconst request: DelegatedSubagentRequest = {\n\t\trequestId: randomUUID(),\n\t\tagent: preparedTasks[0]!.agent,\n\t\ttask: preparedTasks[0]!.task,\n\t\t...(isParallelRequest\n\t\t\t? {\n\t\t\t\ttasks: preparedTasks.map<DelegatedSubagentTask>((task) => ({\n\t\t\t\t\tagent: task.agent,\n\t\t\t\t\ttask: task.task,\n\t\t\t\t\ttier: \"standard\",\n\t\t\t\t\tcwd: task.cwd,\n\t\t\t\t})),\n\t\t\t}\n\t\t\t: {}),\n\t\tcontext: requestContext,\n\t\ttier: \"standard\",\n\t\tcwd: requestCwd,\n\t\t...(options.worktree ? { worktree: true } : {}),\n\t};\n\n\tconst promptLabel = preparedTasks.map((task) => task.promptName).join(\", \");\n\tconst statusLabel = isParallelRequest ? `parallel(${preparedTasks.length})` : preparedTasks[0]!.agent;\n\tif (ctx.hasUI) {\n\t\tctx.ui.setStatus(\"prompt-subagent\", `delegating to ${statusLabel}`);\n\t\tctx.ui.setWorkingMessage(isParallelRequest ? `Running delegated parallel prompts with ${statusLabel}...` : `Running delegated prompt with ${statusLabel}...`);\n\t}\n\tnotify(\n\t\tctx,\n\t\tisParallelRequest\n\t\t\t? `Delegating parallel prompts (${promptLabel})`\n\t\t\t: `Delegating prompt \\`${preparedTasks[0]!.promptName}\\` to subagent \\`${preparedTasks[0]!.agent}\\``,\n\t\t\"info\",\n\t);\n\n\ttry {\n\t\tconst response = await requestDelegatedRun(pi, ctx, request, signal);\n\t\tif (response.isError) {\n\t\t\tthrow new Error(\n\t\t\t\t`Delegated prompt execution failed: ${response.errorText || \"unknown delegated error\"}`,\n\t\t\t);\n\t\t}\n\n\t\tif (isParallelRequest) {\n\t\t\tconst parallelResults = coerceParallelResults(response.parallelResults);\n\t\t\tif (parallelResults.length === 0) {\n\t\t\t\tthrow new Error(\"Delegated parallel execution returned no results.\");\n\t\t\t}\n\t\t\tconst failures = parallelResults.filter((result) => result.isError);\n\t\t\tif (!allowPartialFailures && failures.length > 0) {\n\t\t\t\tconst failureText = failures\n\t\t\t\t\t.map((failure) => `${failure.agent}: ${failure.errorText || \"unknown delegated error\"}`)\n\t\t\t\t\t.join(\"; \");\n\t\t\t\tthrow new Error(`Delegated parallel execution failed: ${failureText}`);\n\t\t\t}\n\n\t\t\tconst text = response.contentText?.trim() || renderParallelDelegatedText(parallelResults);\n\t\t\tconst changed =\n\t\t\t\tparallelResults.some((result) => delegatedMessagesChanged(result.messages))\n\t\t\t\t|| text.includes(\"=== Worktree Changes ===\");\n\t\t\tpi.sendMessage({\n\t\t\t\tcustomType: PROMPT_TEMPLATE_SUBAGENT_MESSAGE_TYPE,\n\t\t\t\tcontent: text,\n\t\t\t\tdisplay: true,\n\t\t\t\tdetails: {\n\t\t\t\t\trequestId: response.requestId,\n\t\t\t\t\tagent: request.agent,\n\t\t\t\t\ttask: preparedTasks.map((task) => task.task).join(\"\\n\\n\"),\n\t\t\t\t\tcontext: response.context,\n\t\t\t\t\tmodel: response.model,\n\t\t\t\t\tmessages: [],\n\t\t\t\t\tparallelResults,\n\t\t\t\t\ttext,\n\t\t\t\t\tchanged,\n\t\t\t\t\tisError: false,\n\t\t\t\t\terrorText: response.errorText,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\tchanged,\n\t\t\t\ttext,\n\t\t\t\tagent: request.agent,\n\t\t\t\tparallelResults,\n\t\t\t};\n\t\t}\n\n\t\tconst messages = coerceMessages(response.messages);\n\t\tconst text = extractDelegatedText(messages);\n\t\tif (!text) {\n\t\t\tthrow new Error(\"Delegated subagent returned no assistant text.\");\n\t\t}\n\n\t\tconst changed = delegatedMessagesChanged(messages);\n\t\tpi.sendMessage({\n\t\t\tcustomType: PROMPT_TEMPLATE_SUBAGENT_MESSAGE_TYPE,\n\t\t\tcontent: text,\n\t\t\tdisplay: true,\n\t\t\tdetails: {\n\t\t\t\trequestId: response.requestId,\n\t\t\t\tagent: preparedTasks[0]!.agent,\n\t\t\t\ttask: request.task,\n\t\t\t\tcontext: response.context,\n\t\t\t\tmodel: response.model,\n\t\t\t\tmessages,\n\t\t\t\ttext,\n\t\t\t\tchanged,\n\t\t\t\tisError: false,\n\t\t\t\terrorText: response.errorText,\n\t\t\t},\n\t\t});\n\n\t\treturn {\n\t\t\tchanged,\n\t\t\ttext,\n\t\t\tagent: preparedTasks[0]!.agent,\n\t\t};\n\t} catch (error) {\n\t\tconst cause = error instanceof Error ? error : new Error(String(error));\n\t\tconst responseText = cause.message;\n\t\tif (isParallelRequest) {\n\t\t\tthrow new Error(`Parallel delegated prompts (${promptLabel}) failed: ${responseText}`, { cause });\n\t\t}\n\t\tthrow new Error(`Prompt \\`${preparedTasks[0]!.promptName}\\` delegated subagent \\`${preparedTasks[0]!.agent}\\` failed: ${responseText}`, { cause });\n\t} finally {\n\t\tclearDelegatedLiveState(request.requestId);\n\t\tif (ctx.hasUI) {\n\t\t\tctx.ui.setStatus(\"prompt-subagent\", undefined);\n\t\t\tctx.ui.setWorkingMessage();\n\t\t}\n\t}\n}\n"]}
|