iosm-cli 0.2.15 → 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 +32 -0
- package/README.md +18 -1
- package/dist/cli/args.d.ts +2 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +16 -3
- package/dist/cli/args.js.map +1 -1
- package/dist/core/agent-profiles.d.ts.map +1 -1
- package/dist/core/agent-profiles.js +3 -0
- package/dist/core/agent-profiles.js.map +1 -1
- package/dist/core/agent-session.d.ts +2 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +26 -10
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/agent-teams.d.ts.map +1 -1
- package/dist/core/agent-teams.js +12 -9
- package/dist/core/agent-teams.js.map +1 -1
- package/dist/core/checkpoint/fs-checkpoint.d.ts +14 -0
- package/dist/core/checkpoint/fs-checkpoint.d.ts.map +1 -0
- package/dist/core/checkpoint/fs-checkpoint.js +211 -0
- package/dist/core/checkpoint/fs-checkpoint.js.map +1 -0
- package/dist/core/command-dispatcher.d.ts +2 -0
- package/dist/core/command-dispatcher.d.ts.map +1 -1
- package/dist/core/command-dispatcher.js +78 -13
- package/dist/core/command-dispatcher.js.map +1 -1
- package/dist/core/mcp/cli.d.ts.map +1 -1
- package/dist/core/mcp/cli.js +26 -0
- package/dist/core/mcp/cli.js.map +1 -1
- package/dist/core/mcp/config.d.ts.map +1 -1
- package/dist/core/mcp/config.js +55 -0
- package/dist/core/mcp/config.js.map +1 -1
- package/dist/core/mcp/index.d.ts +1 -1
- package/dist/core/mcp/index.d.ts.map +1 -1
- package/dist/core/mcp/index.js.map +1 -1
- package/dist/core/mcp/runtime.d.ts +3 -1
- package/dist/core/mcp/runtime.d.ts.map +1 -1
- package/dist/core/mcp/runtime.js +21 -2
- package/dist/core/mcp/runtime.js.map +1 -1
- package/dist/core/mcp/types.d.ts +30 -2
- package/dist/core/mcp/types.d.ts.map +1 -1
- package/dist/core/mcp/types.js.map +1 -1
- package/dist/core/package-manager.d.ts +10 -0
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +100 -2
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/policy/engine.d.ts +77 -0
- package/dist/core/policy/engine.d.ts.map +1 -0
- package/dist/core/policy/engine.js +614 -0
- package/dist/core/policy/engine.js.map +1 -0
- package/dist/core/policy/index.d.ts +2 -0
- package/dist/core/policy/index.d.ts.map +1 -0
- package/dist/core/policy/index.js +2 -0
- package/dist/core/policy/index.js.map +1 -0
- package/dist/core/sandbox/executor.d.ts +13 -0
- package/dist/core/sandbox/executor.d.ts.map +1 -0
- package/dist/core/sandbox/executor.js +64 -0
- package/dist/core/sandbox/executor.js.map +1 -0
- package/dist/core/sdk.d.ts +2 -2
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +3 -3
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/security/index.d.ts +3 -0
- package/dist/core/security/index.d.ts.map +1 -0
- package/dist/core/security/index.js +3 -0
- package/dist/core/security/index.js.map +1 -0
- package/dist/core/security/source-security.d.ts +43 -0
- package/dist/core/security/source-security.d.ts.map +1 -0
- package/dist/core/security/source-security.js +94 -0
- package/dist/core/security/source-security.js.map +1 -0
- package/dist/core/security/trust-ledger.d.ts +24 -0
- package/dist/core/security/trust-ledger.d.ts.map +1 -0
- package/dist/core/security/trust-ledger.js +66 -0
- package/dist/core/security/trust-ledger.js.map +1 -0
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +128 -15
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +6 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +22 -1
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +9 -2
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/task-plan.d.ts +1 -0
- package/dist/core/task-plan.d.ts.map +1 -1
- package/dist/core/task-plan.js +103 -0
- package/dist/core/task-plan.js.map +1 -1
- package/dist/core/tools/apply-patch.d.ts +29 -0
- package/dist/core/tools/apply-patch.d.ts.map +1 -0
- package/dist/core/tools/apply-patch.js +167 -0
- package/dist/core/tools/apply-patch.js.map +1 -0
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +15 -1
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/git-common.d.ts.map +1 -1
- package/dist/core/tools/git-common.js +15 -1
- package/dist/core/tools/git-common.js.map +1 -1
- package/dist/core/tools/index.d.ts +20 -2
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js +85 -25
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/permissions.d.ts +16 -0
- package/dist/core/tools/permissions.d.ts.map +1 -1
- package/dist/core/tools/permissions.js +34 -1
- package/dist/core/tools/permissions.js.map +1 -1
- package/dist/core/tools/task.d.ts.map +1 -1
- package/dist/core/tools/task.js +68 -24
- package/dist/core/tools/task.js.map +1 -1
- package/dist/core/tools/tool-search.d.ts +24 -0
- package/dist/core/tools/tool-search.d.ts.map +1 -0
- package/dist/core/tools/tool-search.js +85 -0
- package/dist/core/tools/tool-search.js.map +1 -0
- package/dist/core/tools/tool-suggest.d.ts +18 -0
- package/dist/core/tools/tool-suggest.d.ts.map +1 -0
- package/dist/core/tools/tool-suggest.js +94 -0
- package/dist/core/tools/tool-suggest.js.map +1 -0
- package/dist/core/tools/verification-runner.d.ts.map +1 -1
- package/dist/core/tools/verification-runner.js +15 -1
- package/dist/core/tools/verification-runner.js.map +1 -1
- package/dist/core/unified-exec.d.ts +39 -0
- package/dist/core/unified-exec.d.ts.map +1 -0
- package/dist/core/unified-exec.js +286 -0
- package/dist/core/unified-exec.js.map +1 -0
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +93 -11
- package/dist/main.js.map +1 -1
- package/dist/modes/acp/acp-mode.d.ts +17 -0
- package/dist/modes/acp/acp-mode.d.ts.map +1 -0
- package/dist/modes/acp/acp-mode.js +352 -0
- package/dist/modes/acp/acp-mode.js.map +1 -0
- package/dist/modes/index.d.ts +2 -1
- package/dist/modes/index.d.ts.map +1 -1
- package/dist/modes/index.js +1 -0
- package/dist/modes/index.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +217 -0
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +8 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +159 -72
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +25 -1
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +33 -0
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts +13 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +189 -28
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +54 -1
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js +96 -9
- package/dist/utils/tools-manager.js.map +1 -1
- package/docs/README.md +2 -0
- package/docs/acp-rpc-mapping.md +38 -0
- package/docs/configuration.generated.md +81 -0
- package/docs/configuration.md +7 -0
- package/package.json +4 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-session.js","sourceRoot":"","sources":["../../src/core/agent-session.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * AgentSession - Core abstraction for agent lifecycle and session management.\n *\n * This class is shared between all run modes (interactive, print, rpc).\n * It encapsulates:\n * - Agent state access\n * - Event subscription with automatic session persistence\n * - Model and thinking level management\n * - Compaction (manual and auto)\n * - Bash execution\n * - Session switching and branching\n *\n * Modes use this class and add their own I/O layer on top.\n */\n\nimport { appendFileSync, mkdirSync, readFileSync } from \"node:fs\";\nimport { basename, dirname, join } from \"node:path\";\nimport { spawnSync } from \"node:child_process\";\nimport type {\n\tAgent,\n\tAgentEvent,\n\tAgentMessage,\n\tAgentState,\n\tAgentTool,\n\tThinkingLevel,\n} from \"@mariozechner/pi-agent-core\";\nimport type { AssistantMessage, ImageContent, Message, Model, TextContent } from \"@mariozechner/pi-ai\";\nimport { completeSimple, isContextOverflow, modelsAreEqual, resetApiProviders, supportsXhigh } from \"@mariozechner/pi-ai\";\nimport { getDocsPath, getSessionTracePath, isSessionTraceEnabled } from \"../config.js\";\nimport { buildIosmRuntimeDirective, prepareIosmRuntimeContext } from \"../iosm/runtime-context.js\";\nimport { theme } from \"../modes/interactive/theme/theme.js\";\nimport { stripFrontmatter } from \"../utils/frontmatter.js\";\nimport { sleep } from \"../utils/sleep.js\";\nimport { type BashResult, executeBash as executeBashCommand, executeBashWithOperations } from \"./bash-executor.js\";\nimport {\n\ttype CompactionResult,\n\tcalculateContextTokens,\n\tcollectEntriesForBranchSummary,\n\tcompact,\n\testimateContextTokens,\n\tgenerateBranchSummary,\n\tprepareCompaction,\n\tshouldCompact,\n} from \"./compaction/index.js\";\nimport { DEFAULT_THINKING_LEVEL } from \"./defaults.js\";\nimport { exportSessionToHtml, type ToolHtmlRenderer } from \"./export-html/index.js\";\nimport { createToolHtmlRenderer } from \"./export-html/tool-renderer.js\";\nimport {\n\ttype ContextUsage,\n\ttype ExtensionCommandContextActions,\n\ttype ExtensionErrorListener,\n\tExtensionRunner,\n\ttype ExtensionUIContext,\n\ttype InputSource,\n\ttype MessageEndEvent,\n\ttype MessageStartEvent,\n\ttype MessageUpdateEvent,\n\ttype SessionBeforeCompactResult,\n\ttype SessionBeforeForkResult,\n\ttype SessionBeforeSwitchResult,\n\ttype SessionBeforeTreeResult,\n\ttype ShutdownHandler,\n\ttype ToolDefinition,\n\ttype ToolExecutionEndEvent,\n\ttype ToolExecutionStartEvent,\n\ttype ToolExecutionUpdateEvent,\n\ttype SubagentStartEvent,\n\ttype SubagentStopEvent,\n\ttype TaskCompletedEvent,\n\ttype TeammateIdleEvent,\n\ttype ConfigChangeEvent,\n\ttype ToolInfo,\n\ttype TreePreparation,\n\ttype TurnEndEvent,\n\ttype TurnStartEvent,\n\twrapRegisteredTools,\n\twrapToolsWithExtensions,\n} from \"./extensions/index.js\";\nimport { INTERNAL_UI_META_CUSTOM_TYPE, type BashExecutionMessage, type CustomMessage } from \"./messages.js\";\nimport type { ModelRegistry } from \"./model-registry.js\";\nimport { expandPromptTemplate, type PromptTemplate } from \"./prompt-templates.js\";\nimport { startBackgroundProcess } from \"./background-processes.js\";\nimport type { ResourceExtensionPaths, ResourceLoader } from \"./resource-loader.js\";\nimport type { BranchSummaryEntry, CompactionEntry, SessionManager } from \"./session-manager.js\";\nimport { getLatestCompactionEntry } from \"./session-manager.js\";\nimport type { SettingsManager } from \"./settings-manager.js\";\nimport { BUILTIN_SLASH_COMMANDS, type SlashCommandInfo, type SlashCommandLocation } from \"./slash-commands.js\";\nimport { buildSystemPrompt } from \"./system-prompt.js\";\nimport { isReadOnlyProfileName, type AgentProfileName } from \"./agent-profiles.js\";\nimport {\n\tapplyPostToolUseHooks,\n\tapplyPreToolUseHooks,\n\tapplyStopHooks,\n\tapplyUserPromptSubmitHooks,\n\temptyHooksConfig,\n\ttype HookEventName,\n\ttype LoadedHooksConfig,\n} from \"./hooks.js\";\nimport {\n\textractTaskPlanFromAssistantMessage,\n\tformatTaskPlanMessageContent,\n\ttaskPlanSignature,\n\tTASK_PLAN_CUSTOM_TYPE,\n\ttype TaskPlanSnapshot,\n} from \"./task-plan.js\";\nimport type { BashOperations } from \"./tools/bash.js\";\nimport { createAllTools, getAllowedFetchMethodsForProfile } from \"./tools/index.js\";\nimport type { ToolPermissionRequest, ToolRequiredPermission } from \"./tools/index.js\";\nimport { resolveAssistantCostWithOpenRouterFallback } from \"./usage-cost.js\";\nimport {\n\tULTRATHINK_CHECKPOINT_COMPRESSION_SYSTEM_PROMPT,\n\tULTRATHINK_MAX_CHECKPOINT_CHARS,\n\tULTRATHINK_MAX_ITERATION_INPUT_TOKENS,\n\tULTRATHINK_MAX_RUN_COST,\n\tULTRATHINK_MAX_RUN_INPUT_TOKENS,\n\tULTRATHINK_MAX_RUN_TOTAL_TOKENS,\n\tULTRATHINK_STAGNATION_LIMIT,\n\tULTRATHINK_VISIBLE_PROMPT_PREFIX,\n\tbuildUltrathinkCheckpointCompressionPrompt,\n\tbuildUltrathinkBudgetStatusLine,\n\tbuildUltrathinkComplianceRepairPrompt,\n\tbuildUltrathinkContextTail,\n\tbuildUltrathinkEvidenceCatalog,\n\tbuildUltrathinkIterationPrompt,\n\tbuildUltrathinkToolGroundingPrompt,\n\tbuildUltrathinkVisibleIterationPrompt,\n\tcreateInitialUltrathinkCheckpoint,\n\tevaluateUltrathinkEvidencePolicy,\n\textractUltrathinkCheckpoint,\n\textractUltrathinkIterationSummary,\n\textractUltrathinkToolEvidence,\n\tfindLastMeaningfulUserIntent,\n\tgetUltrathinkPhase,\n\thasUltrathinkEvidenceViolations,\n\tisUltrathinkStagnated,\n\tnormalizeUltrathinkCheckpoint,\n\tparseUltrathinkCommand,\n\tresolveUltrathinkReadOnlyTools,\n\tshouldUltrathinkForceToolGrounding,\n\ttruncateUltrathinkCheckpoint,\n\tULTRATHINK_USAGE,\n\ttype UltrathinkCommandConfig,\n} from \"./ultrathink.js\";\n\n// ============================================================================\n// Skill Block Parsing\n// ============================================================================\n\n/** Parsed skill block from a user message */\nexport interface ParsedSkillBlock {\n\tname: string;\n\tlocation: string;\n\tcontent: string;\n\tuserMessage: string | undefined;\n}\n\n/**\n * Parse a skill block from message text.\n * Returns null if the text doesn't contain a skill block.\n */\nexport function parseSkillBlock(text: string): ParsedSkillBlock | null {\n\tconst match = text.match(/^<skill name=\"([^\"]+)\" location=\"([^\"]+)\">\\n([\\s\\S]*?)\\n<\\/skill>(?:\\n\\n([\\s\\S]+))?$/);\n\tif (!match) return null;\n\treturn {\n\t\tname: match[1],\n\t\tlocation: match[2],\n\t\tcontent: match[3],\n\t\tuserMessage: match[4]?.trim() || undefined,\n\t};\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nconst GIT_SNAPSHOT_CAPTURE_MAX_BUFFER = 512 * 1024;\n\ninterface GitSnapshotContextDiagnostics {\n\tbeforeChars: number;\n\tafterChars: number;\n\ttruncated: boolean;\n\tincluded: boolean;\n}\n\nfunction parseOrchestrateBlock(text: string):\n\t| {\n\t\t\tmode?: string;\n\t\t\tagents?: number;\n\t\t\tmaxParallel?: number;\n\t\t\tbody: string;\n\t }\n\t| undefined {\n\tconst match = text.match(/<orchestrate\\b([^>]*)>([\\s\\S]*?)<\\/orchestrate>/i);\n\tif (!match) return undefined;\n\n\tconst attrs = match[1] ?? \"\";\n\tconst body = (match[2] ?? \"\").trim();\n\tconst readAttr = (name: string): string | undefined => {\n\t\tconst attrMatch = attrs.match(new RegExp(`${name}\\\\s*=\\\\s*(?:\"([^\"]+)\"|'([^']+)')`, \"i\"));\n\t\treturn (attrMatch?.[1] ?? attrMatch?.[2])?.trim();\n\t};\n\n\tconst mode = readAttr(\"mode\");\n\tconst agentsRaw = readAttr(\"agents\");\n\tconst maxParallelRaw = readAttr(\"max_parallel\");\n\tconst agentsParsed = agentsRaw ? Number.parseInt(agentsRaw, 10) : undefined;\n\tconst maxParallelParsed = maxParallelRaw ? Number.parseInt(maxParallelRaw, 10) : undefined;\n\n\treturn {\n\t\tmode,\n\t\tagents: Number.isInteger(agentsParsed) ? agentsParsed : undefined,\n\t\tmaxParallel: Number.isInteger(maxParallelParsed) ? maxParallelParsed : undefined,\n\t\tbody,\n\t};\n}\n\nfunction deriveOrchestrationDisplayText(promptTextWithoutDirective: string): string | undefined {\n\tconst block = parseOrchestrateBlock(promptTextWithoutDirective);\n\tif (!block) return undefined;\n\tconst taskMatch = block.body.match(/(?:^|\\n)\\s*task:\\s*(.+)$/im);\n\tconst task = taskMatch?.[1]?.trim();\n\tif (!task) return undefined;\n\tconst agentMatch = block.body.match(/(?:^|\\n)\\s*-\\s*agent\\s+\\d+:[^\\n]*\\bagent=([A-Za-z0-9._-]+)/im);\n\tconst agent = agentMatch?.[1]?.trim();\n\tif (agent) {\n\t\treturn `@${agent} ${task}`;\n\t}\n\treturn task;\n}\n\ntype PromptProtocolIssue = {\n\thasToolCallMarkup: boolean;\n\thasDelegateTaskMarkup: boolean;\n};\n\nfunction extractAssistantProtocolText(message: AssistantMessage): string {\n\tconst parts: string[] = [];\n\tfor (const content of message.content) {\n\t\tif (content.type === \"text\" && typeof content.text === \"string\" && content.text.trim()) {\n\t\t\tparts.push(content.text.trim());\n\t\t\tcontinue;\n\t\t}\n\t\tif (content.type !== \"thinking\") continue;\n\t\tconst record = content as unknown as Record<string, unknown>;\n\t\tconst thinking = record.thinking;\n\t\tif (typeof thinking === \"string\" && thinking.trim()) {\n\t\t\tparts.push(thinking.trim());\n\t\t}\n\t}\n\treturn parts.join(\"\\n\\n\").trim();\n}\n\nfunction extractAssistantVisibleText(message: AssistantMessage): string {\n\treturn message.content\n\t\t.filter((content): content is { type: \"text\"; text: string } => content.type === \"text\")\n\t\t.map((content) => content.text.trim())\n\t\t.filter((text) => text.length > 0)\n\t\t.join(\"\\n\\n\")\n\t\t.trim();\n}\n\nfunction isNonActionableVisibleAssistantText(text: string): boolean {\n\tconst trimmed = text.trim();\n\tif (trimmed.length === 0) return true;\n\treturn /^\\[\\s*output\\s+truncated[^\\]]*\\]?\\s*\\.?$/i.test(trimmed);\n}\n\nfunction detectPromptProtocolIssue(text: string): PromptProtocolIssue | undefined {\n\tconst trimmed = text.trim();\n\tif (!trimmed) return undefined;\n\n\tconst hasToolCallOpenBlock = /(^|\\n)\\s*<\\s*tool_call\\b/i.test(trimmed);\n\tconst hasToolCallCloseTag = /<\\/\\s*tool_call\\s*>/i.test(trimmed);\n\tconst hasFunctionBlock = /(^|\\n)\\s*<\\s*function\\s*=\\s*[A-Za-z0-9._:-]+/i.test(trimmed);\n\tconst hasParameterBlock = /(^|\\n)\\s*<\\s*parameter\\s*=\\s*[A-Za-z0-9._:-]+\\s*>/i.test(trimmed);\n\t// Flag only executable-looking pseudo markup; don't treat inline explanatory mentions as protocol issues.\n\tconst hasToolCallMarkup =\n\t\t(hasToolCallOpenBlock && (hasToolCallCloseTag || hasFunctionBlock || hasParameterBlock)) ||\n\t\t(hasFunctionBlock && hasParameterBlock);\n\tconst hasDelegateTaskMarkup = /<\\s*delegate_task\\b/i.test(trimmed) && /<\\/\\s*delegate_task\\s*>/i.test(trimmed);\n\n\tif (!hasToolCallMarkup && !hasDelegateTaskMarkup) return undefined;\n\treturn {\n\t\thasToolCallMarkup,\n\t\thasDelegateTaskMarkup,\n\t};\n}\n\nfunction buildPromptProtocolCorrectionPrompt(input: {\n\toriginalPrompt: string;\n\tissue: PromptProtocolIssue;\n\thasPriorToolActivity?: boolean;\n}): string {\n\tconst reasons = [\n\t\tinput.issue.hasToolCallMarkup ? \"raw <tool_call>/<function=...> markup\" : undefined,\n\t\tinput.issue.hasDelegateTaskMarkup ? \"raw <delegate_task> blocks\" : undefined,\n\t].filter((item): item is string => typeof item === \"string\");\n\tconst boundedOriginal =\n\t\tinput.originalPrompt.length > 2_000\n\t\t\t? `${input.originalPrompt.slice(0, 2_000).trimEnd()}...`\n\t\t\t: input.originalPrompt;\n\n\treturn [\n\t\t\"[TOOL_PROTOCOL_CORRECTION]\",\n\t\t`Previous assistant output included ${reasons.join(\" and \")} in plain text.`,\n\t\t\"These XML-like blocks are not executable tool calls.\",\n\t\t\"Retry now and follow this protocol exactly:\",\n\t\t\"1) Do not output XML/pseudo-call tags (<tool_call>, <function=...>, <delegate_task>).\",\n\t\t\"2) If a tool is needed, emit real structured tool calls only.\",\n\t\t\"3) Prefer structured tools when available instead of ad-hoc pseudo calls.\",\n\t\t\"4) If no tool is needed, provide a direct normal answer.\",\n\t\tinput.hasPriorToolActivity\n\t\t\t? \"5) Continue from the current in-memory state; avoid repeating already completed tool steps unless necessary.\"\n\t\t\t: undefined,\n\t\t\"Execute the original user request now.\",\n\t\t\"<original_user_request>\",\n\t\tboundedOriginal,\n\t\t\"</original_user_request>\",\n\t\t\"[/TOOL_PROTOCOL_CORRECTION]\",\n\t]\n\t\t.filter((line): line is string => typeof line === \"string\")\n\t\t.join(\"\\n\");\n}\n\nfunction buildPromptSilentStopRecoveryPrompt(input: {\n\toriginalPrompt: string;\n\thasPriorToolActivity?: boolean;\n}): string {\n\tconst boundedOriginal =\n\t\tinput.originalPrompt.length > 2_000\n\t\t\t? `${input.originalPrompt.slice(0, 2_000).trimEnd()}...`\n\t\t\t: input.originalPrompt;\n\treturn [\n\t\t\"[ASSISTANT_STALL_RECOVERY]\",\n\t\t\"Previous assistant output ended with stop but produced no visible text and no executable tool calls.\",\n\t\t\"Retry now and continue the same request.\",\n\t\t\"1) Do not return an empty response.\",\n\t\t\"2) If a tool is needed, emit real structured tool calls.\",\n\t\t\"3) If no tool is needed, provide a direct answer.\",\n\t\tinput.hasPriorToolActivity\n\t\t\t? \"4) Continue from the current in-memory state; avoid repeating already completed tool steps unless necessary.\"\n\t\t\t: undefined,\n\t\t\"Execute the original user request now.\",\n\t\t\"<original_user_request>\",\n\t\tboundedOriginal,\n\t\t\"</original_user_request>\",\n\t\t\"[/ASSISTANT_STALL_RECOVERY]\",\n\t]\n\t\t.filter((line): line is string => typeof line === \"string\")\n\t\t.join(\"\\n\");\n}\n\nfunction buildSubagentOrchestrationDirective(text: string): string | undefined {\n\tconst block = parseOrchestrateBlock(text);\n\tif (block) {\n\t\treturn [\n\t\t\t\"[ORCHESTRATION_DIRECTIVE]\",\n\t\t\t\"The user provided an explicit orchestration contract via <orchestrate>.\",\n\t\t\t\"You MUST execute this contract using the `task` tool.\",\n\t\t\t\"Before final prose, perform the required task tool calls from this contract.\",\n\t\t\t`Execution mode: ${block.mode ?? \"unspecified\"}.`,\n\t\t\t`Requested subagent count: ${block.agents ?? \"unspecified\"}.`,\n\t\t\t`Max parallel workers: ${block.maxParallel ?? \"unspecified\"}.`,\n\t\t\t\"Use one task call per agent assignment in the contract body.\",\n\t\t\t\"Each task call must include run_id and task_id when they are present in the assignment line.\",\n\t\t\t\"When parallel mode is requested, launch independent task calls up to max_parallel if provided.\",\n\t\t\t\"For parallel mode, emit independent task calls in one assistant response when possible.\",\n\t\t\t\"In parallel mode, follow parallel tool-call style and batch independent task calls together in the same turn.\",\n\t\t\t\"For write-capable parallel agents, include lock_key only when serialization is required; omit lock_key for independent read-only analyses.\",\n\t\t\t\"For orchestration contracts, keep required task calls foreground and avoid background=true unless the user explicitly asked for detached async execution.\",\n\t\t\t\"During orchestration execution, emit task calls and final synthesis only; avoid interim status prose and avoid manual polling via bash/read.\",\n\t\t\t\"When assignments can conflict on writable files, serialize those conflicting writes.\",\n\t\t\t\"Contract body:\",\n\t\t\tblock.body || \"(empty)\",\n\t\t].join(\"\\n\");\n\t}\n\n\treturn undefined;\n}\n\nfunction buildMetaProfileOrchestrationDirective(text: string): string | undefined {\n\tif (parseOrchestrateBlock(text)) {\n\t\treturn undefined;\n\t}\n\n\treturn [\n\t\t\"[META_ORCHESTRATION_DIRECTIVE]\",\n\t\t\"Session profile is meta. The main/root agent remains the orchestrator for this request.\",\n\t\t\"First classify the user request.\",\n\t\t\"If the request is conversational or non-repository (for example: quick Q&A, opinion, preference, explanation, rewrite, translation, casual chat), DO NOT orchestrate and DO NOT call `task`.\",\n\t\t\"For non-repository requests, answer directly as a normal chat assistant in the user's language.\",\n\t\t\"For non-repository requests, do not run tools, do not inspect repository files, and do not perform reconnaissance unless the user explicitly asks for it.\",\n\t\t\"Do not output internal reasoning, classification notes, or status preambles (for example: 'The user is asking...' or 'Let me analyze...'). Return only the final user-facing answer.\",\n\t\t\"Only apply the orchestration rules below when the request is actionable repository work (requires reading/modifying/running/verifying workspace code or project artifacts).\",\n\t\t\"For actionable repository work, keep recon bounded and read-only, just enough to identify the workstreams.\",\n\t\t\"The main emphasis of meta mode is parallelism through top-level agents and nested delegates.\",\n\t\t\"For any non-trivial work, the main/root agent MUST orchestrate with multiple top-level `task` calls in the parent turn when independent streams exist.\",\n\t\t\"For any child workstream that still contains multiple independent slices, require nested delegation rather than letting one child do everything alone.\",\n\t\t\"Do NOT collapse the whole task into one root implementation subagent.\",\n\t\t\"Do NOT hand the entire job to a single write-capable specialist such as iosm_change_executor when the work can be partitioned.\",\n\t\t\"Use specialist/custom agents as focused workstreams within a broader execution graph, not as the sole executor for the entire non-trivial task.\",\n\t\t\"If you need clarification first, ask it concisely; once clarified, continue with orchestration.\",\n\t\t\"If the user specified agent/delegate counts or parallelism constraints, treat them as hard execution requirements.\",\n\t\t\"For non-trivial work where implementation, tests, verification, docs, or risk analysis can be separated, prefer 3 or more focused task calls rather than 1, and prefer additional delegate fan-out inside those tasks when it shortens the critical path safely.\",\n\t\t\"If you truly cannot split the work into multiple top-level tasks or nested delegates, include one line: DELEGATION_IMPOSSIBLE: <precise reason>.\",\n\t].join(\"\\n\");\n}\n\n/** Session-specific events that extend the core AgentEvent */\nexport type AgentSessionEvent =\n\t| AgentEvent\n\t| { type: \"auto_compaction_start\"; reason: \"threshold\" | \"overflow\" }\n\t| {\n\t\t\ttype: \"auto_compaction_end\";\n\t\t\tresult: CompactionResult | undefined;\n\t\t\taborted: boolean;\n\t\t\twillRetry: boolean;\n\t\t\terrorMessage?: string;\n\t }\n\t| { type: \"auto_retry_start\"; attempt: number; maxAttempts: number; delayMs: number; errorMessage: string }\n\t| { type: \"auto_retry_end\"; success: boolean; attempt: number; finalError?: string }\n\t| { type: \"meta_applied\"; step: number; text: string };\n\n/** Listener function for agent session events */\nexport type AgentSessionEventListener = (event: AgentSessionEvent) => void;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface AgentSessionConfig {\n\tagent: Agent;\n\tsessionManager: SessionManager;\n\tsettingsManager: SettingsManager;\n\tcwd: string;\n\t/** Models to cycle through with Ctrl+P (from --models flag) */\n\tscopedModels?: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>;\n\t/** Resource loader for skills, prompts, themes, context files, system prompt */\n\tresourceLoader: ResourceLoader;\n\t/** SDK custom tools registered outside extensions */\n\tcustomTools?: ToolDefinition[];\n\t/** Model registry for API key resolution and model discovery */\n\tmodelRegistry: ModelRegistry;\n\t/** Initial active built-in tool names. Default: [read, bash, edit, write] */\n\tinitialActiveToolNames?: string[];\n\t/** Override base tools (useful for custom runtimes). */\n\tbaseToolsOverride?: Record<string, AgentTool>;\n\t/** Mutable ref used by Agent to access the current ExtensionRunner */\n\textensionRunnerRef?: { current?: ExtensionRunner };\n\t/**\n\t * Extra text appended to the system prompt (after extensions).\n\t * Used to inject profile-specific instructions for the main session.\n\t */\n\tsystemPromptSuffix?: string;\n\t/** Enable IOSM runtime context injection/autopilot for this session. Default: true. */\n\tiosmAutopilotEnabled?: boolean;\n\t/** Optional active profile name for runtime prompt policies. */\n\tprofileName?: AgentProfileName | string;\n\t/** Optional permission handler called before destructive built-in tools execute. */\n\ttoolPermissionHandler?: (request: ToolPermissionRequest) => Promise<boolean>;\n}\n\nexport interface ExtensionBindings {\n\tuiContext?: ExtensionUIContext;\n\tcommandContextActions?: ExtensionCommandContextActions;\n\tshutdownHandler?: ShutdownHandler;\n\tonError?: ExtensionErrorListener;\n}\n\n/** Options for AgentSession.prompt() */\nexport interface PromptOptions {\n\t/** Whether to expand file-based prompt templates (default: true) */\n\texpandPromptTemplates?: boolean;\n\t/** Image attachments */\n\timages?: ImageContent[];\n\t/** Skip automatic IOSM runtime context injection for internal/system prompts. */\n\tskipIosmAutopilot?: boolean;\n\t/** When streaming, how to queue the message: \"steer\" (interrupt), \"followUp\" (wait), or \"meta\" (adaptive soft/pivot update). Required if streaming. */\n\tstreamingBehavior?: \"steer\" | \"followUp\" | \"meta\";\n\t/** Source of input for extension input event handlers. Defaults to \"interactive\". */\n\tsource?: InputSource;\n\t/** Skip auto-injected orchestration directive for prompts that intentionally mention agents/subagents as data. */\n\tskipOrchestrationDirective?: boolean;\n\t/** Internal safety valve: disable one-shot protocol auto-repair for this prompt call. */\n\tskipProtocolAutoRepair?: boolean;\n\t/** Internal safety valve: skip /ultrathink command interception for internal prompts. */\n\tskipUltrathinkCommand?: boolean;\n}\n\n/** Result from cycleModel() */\nexport interface ModelCycleResult {\n\tmodel: Model<any>;\n\tthinkingLevel: ThinkingLevel;\n\t/** Whether cycling through scoped models (--models flag) or all available */\n\tisScoped: boolean;\n}\n\n/** Session statistics for /session command */\nexport interface SessionStats {\n\tsessionFile: string | undefined;\n\tsessionId: string;\n\tuserMessages: number;\n\tassistantMessages: number;\n\ttoolCalls: number;\n\ttoolResults: number;\n\ttotalMessages: number;\n\ttokens: {\n\t\tinput: number;\n\t\toutput: number;\n\t\tcacheRead: number;\n\t\tcacheWrite: number;\n\t\ttotal: number;\n\t};\n\tcost: number;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Standard thinking levels */\nconst THINKING_LEVELS: ThinkingLevel[] = [\"off\", \"minimal\", \"low\", \"medium\", \"high\"];\nconst MAX_PROMPT_PROTOCOL_AUTO_REPAIR_ATTEMPTS = 2;\n\n/** Thinking levels including xhigh (for supported models) */\nconst THINKING_LEVELS_WITH_XHIGH: ThinkingLevel[] = [\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\"];\n\nconst BUILTIN_TOOL_REQUIRED_PERMISSIONS: Record<string, ToolRequiredPermission> = {\n\tbash: \"danger-full-access\",\n\tedit: \"workspace-write\",\n\twrite: \"workspace-write\",\n\tfetch: \"read-only\",\n\tweb_search: \"read-only\",\n\tgit_write: \"workspace-write\",\n\tfs_ops: \"workspace-write\",\n\tdb_run: \"workspace-write\",\n};\n\n// ============================================================================\n// AgentSession Class\n// ============================================================================\n\nexport class AgentSession {\n\treadonly agent: Agent;\n\treadonly sessionManager: SessionManager;\n\treadonly settingsManager: SettingsManager;\n\n\tprivate _scopedModels: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>;\n\n\t// Event subscription state\n\tprivate _unsubscribeAgent?: () => void;\n\tprivate _eventListeners: AgentSessionEventListener[] = [];\n\tprivate _agentEventQueue: Promise<void> = Promise.resolve();\n\n\t/** Tracks pending steering messages for UI display. Removed when delivered. */\n\tprivate _steeringMessages: string[] = [];\n\t/** Tracks pending follow-up messages for UI display. Removed when delivered. */\n\tprivate _followUpMessages: string[] = [];\n\t/** Tracks pending meta messages for UI display and task-level checkpoint polling. */\n\tprivate _metaMessages: string[] = [];\n\t/** Monotonic counter for applied meta updates (displayed as \"applied at step X\"). */\n\tprivate _metaAppliedStep = 0;\n\t/** Messages queued to be included with the next user prompt as context (\"asides\"). */\n\tprivate _pendingNextTurnMessages: CustomMessage[] = [];\n\n\t// Compaction state\n\tprivate _compactionAbortController: AbortController | undefined = undefined;\n\tprivate _autoCompactionAbortController: AbortController | undefined = undefined;\n\tprivate _overflowRecoveryAttempted = false;\n\n\t// Branch summarization state\n\tprivate _branchSummaryAbortController: AbortController | undefined = undefined;\n\n\t// Retry state\n\tprivate _retryAbortController: AbortController | undefined = undefined;\n\tprivate _retryAttempt = 0;\n\tprivate _retryPromise: Promise<void> | undefined = undefined;\n\tprivate _retryResolve: (() => void) | undefined = undefined;\n\n\t// Bash execution state\n\tprivate _bashAbortController: AbortController | undefined = undefined;\n\tprivate _pendingBashMessages: BashExecutionMessage[] = [];\n\n\t// Extension system\n\tprivate _extensionRunner: ExtensionRunner | undefined = undefined;\n\tprivate _turnIndex = 0;\n\n\tprivate _resourceLoader: ResourceLoader;\n\tprivate _customTools: ToolDefinition[];\n\tprivate _baseToolRegistry: Map<string, AgentTool> = new Map();\n\tprivate _cwd: string;\n\tprivate _extensionRunnerRef?: { current?: ExtensionRunner };\n\tprivate _initialActiveToolNames?: string[];\n\tprivate _baseToolsOverride?: Record<string, AgentTool>;\n\tprivate _extensionUIContext?: ExtensionUIContext;\n\tprivate _extensionCommandContextActions?: ExtensionCommandContextActions;\n\tprivate _extensionShutdownHandler?: ShutdownHandler;\n\tprivate _extensionErrorListener?: ExtensionErrorListener;\n\tprivate _extensionErrorUnsubscriber?: () => void;\n\n\t// Model registry for API key resolution\n\tprivate _modelRegistry: ModelRegistry;\n\n\t// Tool registry for extension getTools/setTools\n\tprivate _toolRegistry: Map<string, AgentTool> = new Map();\n\tprivate _toolPromptSnippets: Map<string, string> = new Map();\n\tprivate _toolPromptGuidelines: Map<string, string[]> = new Map();\n\tprivate _toolRequiredPermissions: Map<string, ToolRequiredPermission | undefined> = new Map();\n\tprivate _subagentStartMeta = new Map<\n\t\tstring,\n\t\t{\n\t\t\tstartedAt: number;\n\t\t\tprofile: string;\n\t\t\tdescription: string;\n\t\t\tcwd?: string;\n\t\t\tagent?: string;\n\t\t\tlockKey?: string;\n\t\t\tisolation?: string;\n\t\t}\n\t>();\n\n\t// Base system prompt (without extension appends) - used to apply fresh appends each turn\n\tprivate _baseSystemPrompt = \"\";\n\tprivate _systemPromptSuffix?: string;\n\tprivate _iosmAutopilotEnabled = true;\n\tprivate _profileName?: string;\n\tprivate _toolPermissionHandler?: (request: ToolPermissionRequest) => Promise<boolean>;\n\tprivate _hooksConfig: LoadedHooksConfig = emptyHooksConfig();\n\tprivate _pendingHookNotices: Array<{ event: HookEventName; message: string }> = [];\n\tprivate _sessionTraceEnabled = isSessionTraceEnabled();\n\tprivate _sessionTracePath: string | undefined;\n\tprivate _protocolAutoRepairActive = false;\n\tprivate _ultrathinkActive = false;\n\n\tconstructor(config: AgentSessionConfig) {\n\t\tthis.agent = config.agent;\n\t\tthis.sessionManager = config.sessionManager;\n\t\tthis.settingsManager = config.settingsManager;\n\t\tthis._scopedModels = config.scopedModels ?? [];\n\t\tthis._resourceLoader = config.resourceLoader;\n\t\tthis._customTools = config.customTools ?? [];\n\t\tthis._cwd = config.cwd;\n\t\tthis._modelRegistry = config.modelRegistry;\n\t\tthis._extensionRunnerRef = config.extensionRunnerRef;\n\t\tthis._initialActiveToolNames = config.initialActiveToolNames;\n\t\tthis._baseToolsOverride = config.baseToolsOverride;\n\t\tthis._systemPromptSuffix = config.systemPromptSuffix || undefined;\n\t\tthis._iosmAutopilotEnabled = config.iosmAutopilotEnabled !== false;\n\t\tthis._profileName = config.profileName?.trim().toLowerCase() || undefined;\n\t\tthis._toolPermissionHandler = config.toolPermissionHandler;\n\t\tthis._hooksConfig = this._resourceLoader.getHooks?.() ?? emptyHooksConfig();\n\t\tthis._refreshSessionTracePath(\"session_start\");\n\n\t\t// Always subscribe to agent events for internal handling\n\t\t// (session persistence, extensions, auto-compaction, retry logic)\n\t\tthis._unsubscribeAgent = this.agent.subscribe(this._handleAgentEvent);\n\n\t\tthis._buildRuntime({\n\t\t\tactiveToolNames: this._initialActiveToolNames,\n\t\t\tincludeAllExtensionTools: true,\n\t\t});\n\t}\n\n\t/** Model registry for API key resolution and model discovery */\n\tget modelRegistry(): ModelRegistry {\n\t\treturn this._modelRegistry;\n\t}\n\n\t/** Active profile name for runtime orchestration policies. */\n\tget profileName(): string | undefined {\n\t\treturn this._profileName;\n\t}\n\n\t// =========================================================================\n\t// Event Subscription\n\t// =========================================================================\n\n\t/** Emit an event to all listeners */\n\tprivate _emit(event: AgentSessionEvent): void {\n\t\tfor (const l of this._eventListeners) {\n\t\t\tl(event);\n\t\t}\n\t}\n\n\tprivate _emitConfigChange(event: Omit<ConfigChangeEvent, \"type\">): void {\n\t\tif (!this._extensionRunner) return;\n\t\tvoid this._extensionRunner.emit({\n\t\t\ttype: \"config_change\",\n\t\t\t...event,\n\t\t});\n\t}\n\n\tprivate _refreshSessionTracePath(reason: string): void {\n\t\tif (!this._sessionTraceEnabled) {\n\t\t\tthis._sessionTracePath = undefined;\n\t\t\treturn;\n\t\t}\n\n\t\tconst sessionId = this.sessionManager.getSessionId();\n\t\tconst nextPath = getSessionTracePath(sessionId);\n\t\tthis._sessionTracePath = nextPath;\n\t\tmkdirSync(dirname(nextPath), { recursive: true });\n\n\t\tthis._appendSessionTrace({\n\t\t\ttype: \"trace_header\",\n\t\t\treason,\n\t\t\tsessionId,\n\t\t\tsessionFile: this.sessionManager.getSessionFile() ?? null,\n\t\t\tcwd: this.sessionManager.getCwd(),\n\t\t});\n\t}\n\n\tprivate _appendSessionTrace(payload: Record<string, unknown>): void {\n\t\tif (!this._sessionTraceEnabled || !this._sessionTracePath) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst entry = {\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t...payload,\n\t\t};\n\n\t\ttry {\n\t\t\tappendFileSync(\n\t\t\t\tthis._sessionTracePath,\n\t\t\t\t`${JSON.stringify(entry, (_key, value) => (typeof value === \"bigint\" ? value.toString() : value))}\\n`,\n\t\t\t\t\"utf8\",\n\t\t\t);\n\t\t} catch {\n\t\t\t// Tracing is best-effort and must not break the session runtime.\n\t\t}\n\t}\n\n\tprivate _queueHookNotices(event: HookEventName, notices: string[]): void {\n\t\tfor (const notice of notices) {\n\t\t\tconst trimmed = notice.trim();\n\t\t\tif (trimmed.length === 0) continue;\n\t\t\tthis._pendingHookNotices.push({ event, message: trimmed });\n\t\t}\n\t}\n\n\tprivate _flushHookNotices(): void {\n\t\tif (this._pendingHookNotices.length === 0) return;\n\t\tconst notices = [...this._pendingHookNotices];\n\t\tthis._pendingHookNotices = [];\n\t\tfor (const notice of notices) {\n\t\t\tthis._appendCustomMessageLocally({\n\t\t\t\tcustomType: \"hooks\",\n\t\t\t\tcontent: `[${notice.event}] ${notice.message}`,\n\t\t\t\tdisplay: true,\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate _extractToolResultText(result: unknown): string {\n\t\tif (!isRecord(result)) {\n\t\t\treturn \"\";\n\t\t}\n\t\tconst content = result.content;\n\t\tif (!Array.isArray(content)) {\n\t\t\treturn \"\";\n\t\t}\n\t\treturn content\n\t\t\t.filter((part) => isRecord(part) && part.type === \"text\" && typeof part.text === \"string\")\n\t\t\t.map((part) => String(part.text))\n\t\t\t.join(\"\\n\");\n\t}\n\n\t// Track last assistant message for auto-compaction check\n\tprivate _lastAssistantMessage: AssistantMessage | undefined = undefined;\n\tprivate _lastTaskPlanSignature: string | undefined = undefined;\n\n\t/** Internal handler for agent events - shared by subscribe and reconnect */\n\tprivate _handleAgentEvent = (event: AgentEvent): void => {\n\t\t// Create retry promise synchronously before queueing async processing.\n\t\t// Agent.emit() calls this handler synchronously, and prompt() calls waitForRetry()\n\t\t// as soon as agent.prompt() resolves. If _retryPromise is created only inside\n\t\t// _processAgentEvent, slow earlier queued events can delay agent_end processing\n\t\t// and waitForRetry() can miss the in-flight retry.\n\t\tthis._createRetryPromiseForAgentEnd(event);\n\n\t\tthis._agentEventQueue = this._agentEventQueue.then(\n\t\t\t() => this._processAgentEvent(event),\n\t\t\t() => this._processAgentEvent(event),\n\t\t);\n\n\t\t// Keep queue alive if an event handler fails\n\t\tthis._agentEventQueue.catch(() => {});\n\t};\n\n\tprivate _createRetryPromiseForAgentEnd(event: AgentEvent): void {\n\t\tif (event.type !== \"agent_end\" || this._retryPromise) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst settings = this.settingsManager.getRetrySettings();\n\t\tif (!settings.enabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst lastAssistant = this._findLastAssistantInMessages(event.messages);\n\t\tif (!lastAssistant || !this._isRetryableError(lastAssistant)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._retryPromise = new Promise((resolve) => {\n\t\t\tthis._retryResolve = resolve;\n\t\t});\n\t}\n\n\tprivate _findLastAssistantInMessages(messages: AgentMessage[]): AssistantMessage | undefined {\n\t\tfor (let i = messages.length - 1; i >= 0; i--) {\n\t\t\tconst message = messages[i];\n\t\t\tif (message.role === \"assistant\") {\n\t\t\t\treturn message as AssistantMessage;\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate async _processAgentEvent(event: AgentEvent): Promise<void> {\n\t\tthis._appendSessionTrace({\n\t\t\ttype: \"agent_event\",\n\t\t\teventType: event.type,\n\t\t\tevent,\n\t\t});\n\n\t\tlet processedEvent = event;\n\t\tlet taskPlanSnapshot: TaskPlanSnapshot | undefined;\n\t\tif (event.type === \"message_end\" && event.message.role === \"assistant\") {\n\t\t\tconst extracted = extractTaskPlanFromAssistantMessage(event.message);\n\t\t\ttaskPlanSnapshot = extracted.planSnapshot;\n\t\t\tif (extracted.changed) {\n\t\t\t\t(event.message as AssistantMessage).content = extracted.sanitizedMessage.content;\n\t\t\t}\n\t\t}\n\n\t\t// When a user message starts, check if it's from either queue and remove it BEFORE emitting\n\t\t// This ensures the UI sees the updated queue state\n\t\tif (processedEvent.type === \"message_start\" && processedEvent.message.role === \"user\") {\n\t\t\tthis._overflowRecoveryAttempted = false;\n\t\t\tconst messageText = this._getUserMessageText(processedEvent.message);\n\t\t\tif (messageText) {\n\t\t\t\tconst metaIndex = this._metaMessages.indexOf(messageText);\n\t\t\t\tif (metaIndex !== -1) {\n\t\t\t\t\tthis._metaMessages.splice(metaIndex, 1);\n\t\t\t\t\tthis._metaAppliedStep += 1;\n\t\t\t\t\tthis._emit({ type: \"meta_applied\", step: this._metaAppliedStep, text: messageText });\n\t\t\t\t} else {\n\t\t\t\t\t// Check steering queue first\n\t\t\t\t\tconst steeringIndex = this._steeringMessages.indexOf(messageText);\n\t\t\t\t\tif (steeringIndex !== -1) {\n\t\t\t\t\t\tthis._steeringMessages.splice(steeringIndex, 1);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Check follow-up queue\n\t\t\t\t\t\tconst followUpIndex = this._followUpMessages.indexOf(messageText);\n\t\t\t\t\t\tif (followUpIndex !== -1) {\n\t\t\t\t\t\t\tthis._followUpMessages.splice(followUpIndex, 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Emit to extensions first\n\t\tawait this._emitExtensionEvent(processedEvent);\n\n\t\t// Notify all listeners\n\t\tthis._emit(processedEvent);\n\n\t\t// Handle session persistence\n\t\tif (processedEvent.type === \"message_end\") {\n\t\t\t// Check if this is a custom message from extensions\n\t\t\tif (processedEvent.message.role === \"custom\") {\n\t\t\t\t// Persist as CustomMessageEntry\n\t\t\t\tthis.sessionManager.appendCustomMessageEntry(\n\t\t\t\t\tprocessedEvent.message.customType,\n\t\t\t\t\tprocessedEvent.message.content,\n\t\t\t\t\tprocessedEvent.message.display,\n\t\t\t\t\tprocessedEvent.message.details,\n\t\t\t\t);\n\t\t\t} else if (\n\t\t\t\tprocessedEvent.message.role === \"user\" ||\n\t\t\t\tprocessedEvent.message.role === \"assistant\" ||\n\t\t\t\tprocessedEvent.message.role === \"toolResult\"\n\t\t\t) {\n\t\t\t\t// Regular LLM message - persist as SessionMessageEntry\n\t\t\t\tthis.sessionManager.appendMessage(processedEvent.message);\n\t\t\t}\n\t\t\t// Other message types (bashExecution, compactionSummary, branchSummary) are persisted elsewhere\n\n\t\t\t// Track assistant message for auto-compaction (checked on agent_end)\n\t\t\tif (processedEvent.message.role === \"assistant\") {\n\t\t\t\tthis._lastAssistantMessage = processedEvent.message;\n\n\t\t\t\tconst assistantMsg = processedEvent.message as AssistantMessage;\n\t\t\t\tif (assistantMsg.stopReason !== \"error\") {\n\t\t\t\t\tthis._overflowRecoveryAttempted = false;\n\t\t\t\t}\n\n\t\t\t\t// Reset retry counter immediately on successful assistant response\n\t\t\t\t// This prevents accumulation across multiple LLM calls within a turn\n\t\t\t\tif (assistantMsg.stopReason !== \"error\" && this._retryAttempt > 0) {\n\t\t\t\t\tthis._emit({\n\t\t\t\t\t\ttype: \"auto_retry_end\",\n\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\tattempt: this._retryAttempt,\n\t\t\t\t\t});\n\t\t\t\t\tthis._retryAttempt = 0;\n\t\t\t\t\tthis._resolveRetry();\n\t\t\t\t}\n\n\t\t\t\tif (taskPlanSnapshot) {\n\t\t\t\t\tconst signature = taskPlanSignature(taskPlanSnapshot);\n\t\t\t\t\tif (signature !== this._lastTaskPlanSignature) {\n\t\t\t\t\t\tthis._lastTaskPlanSignature = signature;\n\t\t\t\t\t\tthis._appendCustomMessageLocally({\n\t\t\t\t\t\t\tcustomType: TASK_PLAN_CUSTOM_TYPE,\n\t\t\t\t\t\t\tcontent: formatTaskPlanMessageContent(taskPlanSnapshot),\n\t\t\t\t\t\t\tdisplay: true,\n\t\t\t\t\t\t\tdetails: taskPlanSnapshot,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (processedEvent.type === \"tool_execution_end\") {\n\t\t\tconst notices = applyPostToolUseHooks(this._hooksConfig, {\n\t\t\t\ttoolName: processedEvent.toolName,\n\t\t\t\toutputText: this._extractToolResultText(processedEvent.result),\n\t\t\t\tisError: processedEvent.isError,\n\t\t\t});\n\t\t\tthis._queueHookNotices(\"PostToolUse\", notices);\n\t\t}\n\n\t\t// Check auto-retry and auto-compaction after agent completes\n\t\tif (processedEvent.type === \"agent_end\" && this._lastAssistantMessage) {\n\t\t\tconst msg = this._lastAssistantMessage;\n\t\t\tthis._lastAssistantMessage = undefined;\n\n\t\t\t// Check for retryable errors first (overloaded, rate limit, server errors)\n\t\t\tif (this._isRetryableError(msg)) {\n\t\t\t\tconst didRetry = await this._handleRetryableError(msg);\n\t\t\t\tif (didRetry) return; // Retry was initiated, don't proceed to compaction\n\t\t\t}\n\n\t\t\tawait this._checkCompaction(msg);\n\t\t}\n\n\t\tif (processedEvent.type === \"agent_end\") {\n\t\t\tthis._flushHookNotices();\n\t\t}\n\t}\n\n\t/** Resolve the pending retry promise */\n\tprivate _resolveRetry(): void {\n\t\tif (this._retryResolve) {\n\t\t\tthis._retryResolve();\n\t\t\tthis._retryResolve = undefined;\n\t\t\tthis._retryPromise = undefined;\n\t\t}\n\t}\n\n\t/** Extract text content from a message */\n\tprivate _getUserMessageText(message: Message): string {\n\t\tif (message.role !== \"user\") return \"\";\n\t\tconst content = message.content;\n\t\tif (typeof content === \"string\") return content;\n\t\tconst textBlocks = content.filter((c) => c.type === \"text\");\n\t\treturn textBlocks.map((c) => (c as TextContent).text).join(\"\");\n\t}\n\n\t/** Find the last assistant message in agent state (including aborted ones) */\n\tprivate _findLastAssistantMessage(): AssistantMessage | undefined {\n\t\tconst messages = this.agent.state.messages;\n\t\tfor (let i = messages.length - 1; i >= 0; i--) {\n\t\t\tconst msg = messages[i];\n\t\t\tif (msg.role === \"assistant\") {\n\t\t\t\treturn msg as AssistantMessage;\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t/** Emit extension events based on agent events */\n\tprivate async _emitExtensionEvent(event: AgentEvent): Promise<void> {\n\t\tif (!this._extensionRunner) return;\n\n\t\tif (event.type === \"agent_start\") {\n\t\t\tthis._turnIndex = 0;\n\t\t\tawait this._extensionRunner.emit({ type: \"agent_start\" });\n\t\t} else if (event.type === \"agent_end\") {\n\t\t\tawait this._extensionRunner.emit({ type: \"agent_end\", messages: event.messages });\n\t\t} else if (event.type === \"turn_start\") {\n\t\t\tconst extensionEvent: TurnStartEvent = {\n\t\t\t\ttype: \"turn_start\",\n\t\t\t\tturnIndex: this._turnIndex,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t};\n\t\t\tawait this._extensionRunner.emit(extensionEvent);\n\t\t} else if (event.type === \"turn_end\") {\n\t\t\tconst extensionEvent: TurnEndEvent = {\n\t\t\t\ttype: \"turn_end\",\n\t\t\t\tturnIndex: this._turnIndex,\n\t\t\t\tmessage: event.message,\n\t\t\t\ttoolResults: event.toolResults,\n\t\t\t};\n\t\t\tawait this._extensionRunner.emit(extensionEvent);\n\t\t\tthis._turnIndex++;\n\t\t} else if (event.type === \"message_start\") {\n\t\t\tconst extensionEvent: MessageStartEvent = {\n\t\t\t\ttype: \"message_start\",\n\t\t\t\tmessage: event.message,\n\t\t\t};\n\t\t\tawait this._extensionRunner.emit(extensionEvent);\n\t\t} else if (event.type === \"message_update\") {\n\t\t\tconst extensionEvent: MessageUpdateEvent = {\n\t\t\t\ttype: \"message_update\",\n\t\t\t\tmessage: event.message,\n\t\t\t\tassistantMessageEvent: event.assistantMessageEvent,\n\t\t\t};\n\t\t\tawait this._extensionRunner.emit(extensionEvent);\n\t\t} else if (event.type === \"message_end\") {\n\t\t\tconst extensionEvent: MessageEndEvent = {\n\t\t\t\ttype: \"message_end\",\n\t\t\t\tmessage: event.message,\n\t\t\t};\n\t\t\tawait this._extensionRunner.emit(extensionEvent);\n\t\t} else if (event.type === \"tool_execution_start\") {\n\t\t\tconst extensionEvent: ToolExecutionStartEvent = {\n\t\t\t\ttype: \"tool_execution_start\",\n\t\t\t\ttoolCallId: event.toolCallId,\n\t\t\t\ttoolName: event.toolName,\n\t\t\t\targs: event.args,\n\t\t\t};\n\t\t\tawait this._extensionRunner.emit(extensionEvent);\n\t\t\tif (event.toolName === \"task\") {\n\t\t\t\tconst args = event.args as {\n\t\t\t\t\tdescription?: string;\n\t\t\t\t\tprofile?: string;\n\t\t\t\t\tcwd?: string;\n\t\t\t\t\tagent?: string;\n\t\t\t\t\tlock_key?: string;\n\t\t\t\t\tisolation?: string;\n\t\t\t\t};\n\t\t\t\tconst description = args.description ?? \"Running subtask\";\n\t\t\t\tconst profile = args.profile ?? \"full\";\n\t\t\t\tthis._subagentStartMeta.set(event.toolCallId, {\n\t\t\t\t\tstartedAt: Date.now(),\n\t\t\t\t\tprofile,\n\t\t\t\t\tdescription,\n\t\t\t\t\tcwd: args.cwd,\n\t\t\t\t\tagent: args.agent,\n\t\t\t\t\tlockKey: args.lock_key,\n\t\t\t\t\tisolation: args.isolation,\n\t\t\t\t});\n\t\t\t\tconst subagentStart: SubagentStartEvent = {\n\t\t\t\t\ttype: \"subagent_start\",\n\t\t\t\t\ttoolCallId: event.toolCallId,\n\t\t\t\t\tdescription,\n\t\t\t\t\tprofile,\n\t\t\t\t\tcwd: args.cwd,\n\t\t\t\t\tagent: args.agent,\n\t\t\t\t\tlockKey: args.lock_key,\n\t\t\t\t\tisolation: args.isolation,\n\t\t\t\t};\n\t\t\t\tawait this._extensionRunner.emit(subagentStart);\n\t\t\t}\n\t\t} else if (event.type === \"tool_execution_update\") {\n\t\t\tconst extensionEvent: ToolExecutionUpdateEvent = {\n\t\t\t\ttype: \"tool_execution_update\",\n\t\t\t\ttoolCallId: event.toolCallId,\n\t\t\t\ttoolName: event.toolName,\n\t\t\t\targs: event.args,\n\t\t\t\tpartialResult: event.partialResult,\n\t\t\t};\n\t\t\tawait this._extensionRunner.emit(extensionEvent);\n\t\t} else if (event.type === \"tool_execution_end\") {\n\t\t\tconst extensionEvent: ToolExecutionEndEvent = {\n\t\t\t\ttype: \"tool_execution_end\",\n\t\t\t\ttoolCallId: event.toolCallId,\n\t\t\t\ttoolName: event.toolName,\n\t\t\t\tresult: event.result,\n\t\t\t\tisError: event.isError,\n\t\t\t};\n\t\t\tawait this._extensionRunner.emit(extensionEvent);\n\t\t\tif (event.toolName === \"task\") {\n\t\t\t\tconst startMeta = this._subagentStartMeta.get(event.toolCallId);\n\t\t\t\tthis._subagentStartMeta.delete(event.toolCallId);\n\t\t\t\tconst details = event.result?.details as Record<string, unknown> | undefined;\n\t\t\t\tconst outputLength = typeof details?.outputLength === \"number\" ? details.outputLength : undefined;\n\t\t\t\tconst runId = typeof details?.runId === \"string\" ? details.runId : undefined;\n\t\t\t\tconst status: \"done\" | \"error\" | \"cancelled\" = event.isError ? \"error\" : \"done\";\n\t\t\t\tconst errorMessage = event.isError\n\t\t\t\t\t? (event.result?.content?.[0] as { text?: string } | undefined)?.text\n\t\t\t\t\t: undefined;\n\t\t\t\tconst durationMs = Math.max(0, Date.now() - (startMeta?.startedAt ?? Date.now()));\n\t\t\t\tconst profile = startMeta?.profile ?? \"full\";\n\t\t\t\tconst description = startMeta?.description ?? \"Running subtask\";\n\t\t\t\tconst subagentStop: SubagentStopEvent = {\n\t\t\t\t\ttype: \"subagent_stop\",\n\t\t\t\t\ttoolCallId: event.toolCallId,\n\t\t\t\t\tdescription,\n\t\t\t\t\tprofile,\n\t\t\t\t\tstatus,\n\t\t\t\t\tdurationMs,\n\t\t\t\t\toutputLength,\n\t\t\t\t\trunId,\n\t\t\t\t\terrorMessage,\n\t\t\t\t\tcwd: startMeta?.cwd,\n\t\t\t\t\tagent: startMeta?.agent,\n\t\t\t\t\tlockKey: startMeta?.lockKey,\n\t\t\t\t\tisolation: startMeta?.isolation,\n\t\t\t\t};\n\t\t\t\tawait this._extensionRunner.emit(subagentStop);\n\t\t\t\tconst taskCompleted: TaskCompletedEvent = {\n\t\t\t\t\ttype: \"task_completed\",\n\t\t\t\t\ttoolCallId: event.toolCallId,\n\t\t\t\t\tstatus,\n\t\t\t\t\tprofile,\n\t\t\t\t\tdescription,\n\t\t\t\t\tdurationMs,\n\t\t\t\t\toutputLength,\n\t\t\t\t\trunId,\n\t\t\t\t\terrorMessage,\n\t\t\t\t};\n\t\t\t\tawait this._extensionRunner.emit(taskCompleted);\n\t\t\t\tif (this._subagentStartMeta.size === 0) {\n\t\t\t\t\tconst teammateIdle: TeammateIdleEvent = {\n\t\t\t\t\t\ttype: \"teammate_idle\",\n\t\t\t\t\t\tactiveSubagents: 0,\n\t\t\t\t\t\tlastCompletedToolCallId: event.toolCallId,\n\t\t\t\t\t};\n\t\t\t\t\tawait this._extensionRunner.emit(teammateIdle);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Subscribe to agent events.\n\t * Session persistence is handled internally (saves messages on message_end).\n\t * Multiple listeners can be added. Returns unsubscribe function for this listener.\n\t */\n\tsubscribe(listener: AgentSessionEventListener): () => void {\n\t\tthis._eventListeners.push(listener);\n\n\t\t// Return unsubscribe function for this specific listener\n\t\treturn () => {\n\t\t\tconst index = this._eventListeners.indexOf(listener);\n\t\t\tif (index !== -1) {\n\t\t\t\tthis._eventListeners.splice(index, 1);\n\t\t\t}\n\t\t};\n\t}\n\n\t/**\n\t * Temporarily disconnect from agent events.\n\t * User listeners are preserved and will receive events again after resubscribe().\n\t * Used internally during operations that need to pause event processing.\n\t */\n\tprivate _disconnectFromAgent(): void {\n\t\tif (this._unsubscribeAgent) {\n\t\t\tthis._unsubscribeAgent();\n\t\t\tthis._unsubscribeAgent = undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Reconnect to agent events after _disconnectFromAgent().\n\t * Preserves all existing listeners.\n\t */\n\tprivate _reconnectToAgent(): void {\n\t\tif (this._unsubscribeAgent) return; // Already connected\n\t\tthis._unsubscribeAgent = this.agent.subscribe(this._handleAgentEvent);\n\t}\n\n\t/**\n\t * Remove all listeners and disconnect from agent.\n\t * Call this when completely done with the session.\n\t */\n\tdispose(): void {\n\t\tthis._disconnectFromAgent();\n\t\tthis._eventListeners = [];\n\t}\n\n\t// =========================================================================\n\t// Read-only State Access\n\t// =========================================================================\n\n\t/** Full agent state */\n\tget state(): AgentState {\n\t\treturn this.agent.state;\n\t}\n\n\t/** Current model (may be undefined if not yet selected) */\n\tget model(): Model<any> | undefined {\n\t\treturn this.agent.state.model;\n\t}\n\n\t/** Current thinking level */\n\tget thinkingLevel(): ThinkingLevel {\n\t\treturn this.agent.state.thinkingLevel;\n\t}\n\n\t/** Whether agent is currently streaming a response */\n\tget isStreaming(): boolean {\n\t\treturn this.agent.state.isStreaming;\n\t}\n\n\t/** Current effective system prompt (includes any per-turn extension modifications) */\n\tget systemPrompt(): string {\n\t\treturn this.agent.state.systemPrompt;\n\t}\n\n\t/** Current retry attempt (0 if not retrying) */\n\tget retryAttempt(): number {\n\t\treturn this._retryAttempt;\n\t}\n\n\t/**\n\t * Get the names of currently active tools.\n\t * Returns the names of tools currently set on the agent.\n\t */\n\tgetActiveToolNames(): string[] {\n\t\treturn this.agent.state.tools.map((t) => t.name);\n\t}\n\n\t/**\n\t * Get all configured tools with name, description, and parameter schema.\n\t */\n\tgetAllTools(): ToolInfo[] {\n\t\treturn Array.from(this._toolRegistry.values()).map((t) => ({\n\t\t\tname: t.name,\n\t\t\tdescription: t.description,\n\t\t\tparameters: t.parameters,\n\t\t}));\n\t}\n\n\t/**\n\t * Set active tools by name.\n\t * Only tools in the registry can be enabled. Unknown tool names are ignored.\n\t * Also rebuilds the system prompt to reflect the new tool set.\n\t * Changes take effect on the next agent turn.\n\t */\n\tsetActiveToolsByName(toolNames: string[]): void {\n\t\tconst previousTools = this.getActiveToolNames();\n\t\tconst tools: AgentTool[] = [];\n\t\tconst validToolNames: string[] = [];\n\t\tfor (const name of toolNames) {\n\t\t\tconst tool = this._toolRegistry.get(name);\n\t\t\tif (tool) {\n\t\t\t\ttools.push(tool);\n\t\t\t\tvalidToolNames.push(name);\n\t\t\t}\n\t\t}\n\t\tthis.agent.setTools(tools);\n\n\t\t// Rebuild base system prompt with new tool set\n\t\tthis._baseSystemPrompt = this._rebuildSystemPrompt(validToolNames);\n\t\tthis.agent.setSystemPrompt(this._baseSystemPrompt);\n\t\tthis._emitConfigChange({\n\t\t\tkey: \"active_tools\",\n\t\t\tprevious: previousTools,\n\t\t\tcurrent: validToolNames,\n\t\t});\n\t}\n\n\t/**\n\t * Set or clear the profile-specific system prompt suffix.\n\t * Rebuilds and reapplies the base system prompt immediately.\n\t */\n\tsetSystemPromptSuffix(suffix?: string): void {\n\t\tconst previousSuffix = this._systemPromptSuffix;\n\t\tconst nextSuffix = suffix?.trim();\n\t\tthis._systemPromptSuffix = nextSuffix && nextSuffix.length > 0 ? nextSuffix : undefined;\n\t\tthis._baseSystemPrompt = this._rebuildSystemPrompt(this.getActiveToolNames());\n\t\tthis.agent.setSystemPrompt(this._baseSystemPrompt);\n\t\tthis._emitConfigChange({\n\t\t\tkey: \"system_prompt_suffix\",\n\t\t\tprevious: previousSuffix,\n\t\t\tcurrent: this._systemPromptSuffix,\n\t\t});\n\t}\n\n\tsetIosmAutopilotEnabled(enabled: boolean): void {\n\t\tconst previous = this._iosmAutopilotEnabled;\n\t\tthis._iosmAutopilotEnabled = enabled;\n\t\tthis._baseSystemPrompt = this._rebuildSystemPrompt(this.getActiveToolNames());\n\t\tthis.agent.setSystemPrompt(this._baseSystemPrompt);\n\t\tthis._emitConfigChange({\n\t\t\tkey: \"iosm_autopilot_enabled\",\n\t\t\tprevious,\n\t\t\tcurrent: enabled,\n\t\t});\n\t}\n\n\tsetProfileName(profileName?: string): void {\n\t\tconst previous = this._profileName;\n\t\tconst normalized = profileName?.trim().toLowerCase();\n\t\tthis._profileName = normalized && normalized.length > 0 ? normalized : undefined;\n\t\tthis._emitConfigChange({\n\t\t\tkey: \"profile_name\",\n\t\t\tprevious,\n\t\t\tcurrent: this._profileName,\n\t\t});\n\t}\n\n\tsetToolPermissionHandler(handler?: (request: ToolPermissionRequest) => Promise<boolean>): void {\n\t\tthis._toolPermissionHandler = handler;\n\t\tthis._buildRuntime({\n\t\t\tactiveToolNames: this.getActiveToolNames(),\n\t\t\tincludeAllExtensionTools: true,\n\t\t});\n\t}\n\n\tsetCustomTools(customTools: ToolDefinition[]): void {\n\t\tthis._customTools = [...customTools];\n\t\tthis._buildRuntime({\n\t\t\tactiveToolNames: this.getActiveToolNames(),\n\t\t\tincludeAllExtensionTools: true,\n\t\t});\n\t}\n\n\t/** Whether compaction or branch summarization is currently running */\n\tget isCompacting(): boolean {\n\t\treturn (\n\t\t\tthis._autoCompactionAbortController !== undefined ||\n\t\t\tthis._compactionAbortController !== undefined ||\n\t\t\tthis._branchSummaryAbortController !== undefined\n\t\t);\n\t}\n\n\t/** All messages including custom types like BashExecutionMessage */\n\tget messages(): AgentMessage[] {\n\t\treturn this.agent.state.messages;\n\t}\n\n\t/** Current steering mode */\n\tget steeringMode(): \"all\" | \"one-at-a-time\" {\n\t\treturn this.agent.getSteeringMode();\n\t}\n\n\t/** Current follow-up mode */\n\tget followUpMode(): \"all\" | \"one-at-a-time\" {\n\t\treturn this.agent.getFollowUpMode();\n\t}\n\n\t/** Current session file path, or undefined if sessions are disabled */\n\tget sessionFile(): string | undefined {\n\t\treturn this.sessionManager.getSessionFile();\n\t}\n\n\t/** Current session ID */\n\tget sessionId(): string {\n\t\treturn this.sessionManager.getSessionId();\n\t}\n\n\t/** Whether full session trace logging is currently enabled for this session. */\n\tget isSessionTraceOn(): boolean {\n\t\treturn this._sessionTraceEnabled;\n\t}\n\n\t/** Absolute path to the current session trace JSONL file, when tracing is enabled. */\n\tget sessionTracePath(): string | undefined {\n\t\treturn this._sessionTracePath;\n\t}\n\n\t/** Enable full session trace logging for the current runtime session. */\n\tenableSessionTrace(): void {\n\t\tif (this._sessionTraceEnabled) {\n\t\t\treturn;\n\t\t}\n\t\tthis._sessionTraceEnabled = true;\n\t\tthis._refreshSessionTracePath(\"session_trace_enabled\");\n\t}\n\n\t/** Current session display name, if set */\n\tget sessionName(): string | undefined {\n\t\treturn this.sessionManager.getSessionName();\n\t}\n\n\t/** Scoped models for cycling (from --models flag) */\n\tget scopedModels(): ReadonlyArray<{ model: Model<any>; thinkingLevel?: ThinkingLevel }> {\n\t\treturn this._scopedModels;\n\t}\n\n\t/** Update scoped models for cycling */\n\tsetScopedModels(scopedModels: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>): void {\n\t\tthis._scopedModels = scopedModels;\n\t}\n\n\t/** File-based prompt templates */\n\tget promptTemplates(): ReadonlyArray<PromptTemplate> {\n\t\treturn this._resourceLoader.getPrompts().prompts;\n\t}\n\n\tprivate _normalizePromptSnippet(text: string | undefined): string | undefined {\n\t\tif (!text) return undefined;\n\t\tconst oneLine = text\n\t\t\t.replace(/[\\r\\n]+/g, \" \")\n\t\t\t.replace(/\\s+/g, \" \")\n\t\t\t.trim();\n\t\treturn oneLine.length > 0 ? oneLine : undefined;\n\t}\n\n\tprivate _normalizePromptGuidelines(guidelines: string[] | undefined): string[] {\n\t\tif (!guidelines || guidelines.length === 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst unique = new Set<string>();\n\t\tfor (const guideline of guidelines) {\n\t\t\tconst normalized = guideline.trim();\n\t\t\tif (normalized.length > 0) {\n\t\t\t\tunique.add(normalized);\n\t\t\t}\n\t\t}\n\t\treturn Array.from(unique);\n\t}\n\n\tprivate _summarizeToolPermissionInput(input: Record<string, unknown>): string {\n\t\tlet preview = \"{}\";\n\t\ttry {\n\t\t\tpreview = JSON.stringify(input);\n\t\t} catch {\n\t\t\tpreview = \"{...}\";\n\t\t}\n\t\tif (preview.length > 200) {\n\t\t\tpreview = `${preview.slice(0, 197)}...`;\n\t\t}\n\t\treturn preview;\n\t}\n\n\tprivate _captureGitSnapshotCommand(args: string[]): string | undefined {\n\t\tconst result = spawnSync(\"git\", [\"-C\", this._cwd, ...args], {\n\t\t\tencoding: \"utf8\",\n\t\t\tmaxBuffer: GIT_SNAPSHOT_CAPTURE_MAX_BUFFER,\n\t\t});\n\t\tif (result.status !== 0) return undefined;\n\t\tconst output = typeof result.stdout === \"string\" ? result.stdout.trim() : \"\";\n\t\treturn output.length > 0 ? output : undefined;\n\t}\n\n\tprivate _buildGitSnapshotContext(maxChars: number): {\n\t\tgitSnapshotContext: { path?: string; content: string } | undefined;\n\t\tdiagnostics: GitSnapshotContextDiagnostics;\n\t} {\n\t\tconst diagnostics: GitSnapshotContextDiagnostics = {\n\t\t\tbeforeChars: 0,\n\t\t\tafterChars: 0,\n\t\t\ttruncated: false,\n\t\t\tincluded: false,\n\t\t};\n\n\t\tconst sections: string[] = [];\n\t\tconst status = this._captureGitSnapshotCommand([\"status\", \"--porcelain=v1\", \"--branch\"]);\n\t\tif (status) {\n\t\t\tsections.push(`### git status --porcelain --branch\\n${status}`);\n\t\t}\n\t\tconst diffStat = this._captureGitSnapshotCommand([\"diff\", \"--stat\", \"--no-color\"]);\n\t\tif (diffStat) {\n\t\t\tsections.push(`### git diff --stat\\n${diffStat}`);\n\t\t}\n\t\tconst stagedDiffStat = this._captureGitSnapshotCommand([\"diff\", \"--cached\", \"--stat\", \"--no-color\"]);\n\t\tif (stagedDiffStat) {\n\t\t\tsections.push(`### git diff --cached --stat\\n${stagedDiffStat}`);\n\t\t}\n\n\t\tif (sections.length === 0) {\n\t\t\treturn {\n\t\t\t\tgitSnapshotContext: undefined,\n\t\t\t\tdiagnostics,\n\t\t\t};\n\t\t}\n\n\t\tconst combined = sections.join(\"\\n\\n\").trim();\n\t\tdiagnostics.beforeChars = combined.length;\n\n\t\tlet content = combined;\n\t\tif (content.length > maxChars) {\n\t\t\tconst marker = \"\\n\\n...[git snapshot truncated]...\";\n\t\t\tconst safeBudget = Math.max(0, maxChars - marker.length);\n\t\t\tconst sliced = content.slice(0, safeBudget).trimEnd();\n\t\t\tcontent = `${sliced}${marker}`;\n\t\t\tdiagnostics.truncated = true;\n\t\t}\n\t\tcontent = content.trim();\n\t\tdiagnostics.afterChars = content.length;\n\t\tdiagnostics.included = content.length > 0;\n\n\t\treturn {\n\t\t\tgitSnapshotContext: diagnostics.included\n\t\t\t\t? {\n\t\t\t\t\t\tpath: \"[git-snapshot]\",\n\t\t\t\t\t\tcontent,\n\t\t\t\t\t}\n\t\t\t\t: undefined,\n\t\t\tdiagnostics,\n\t\t};\n\t}\n\n\tprivate async _evaluateToolPermission(request: ToolPermissionRequest): Promise<boolean> {\n\t\tconst normalizedRequest: ToolPermissionRequest = {\n\t\t\t...request,\n\t\t\trequiredPermission:\n\t\t\t\trequest.requiredPermission ?? this._toolRequiredPermissions.get(request.toolName) ?? undefined,\n\t\t\ttoolSource: request.toolSource ?? \"builtin\",\n\t\t};\n\t\tconst hookResult = applyPreToolUseHooks(this._hooksConfig, normalizedRequest);\n\t\tthis._queueHookNotices(\"PreToolUse\", hookResult.notices);\n\t\tif (!hookResult.allowed) {\n\t\t\tthrow new Error(hookResult.message ?? \"Tool blocked by PreToolUse hook.\");\n\t\t}\n\t\treturn this._toolPermissionHandler ? this._toolPermissionHandler(normalizedRequest) : true;\n\t}\n\n\tprivate _rebuildSystemPrompt(toolNames: string[]): string {\n\t\tconst validToolNames = toolNames.filter((name) => this._toolRegistry.has(name));\n\t\tconst toolSnippets: Record<string, string> = {};\n\t\tconst promptGuidelines: string[] = [];\n\t\tfor (const name of validToolNames) {\n\t\t\tconst snippet = this._toolPromptSnippets.get(name);\n\t\t\tif (snippet) {\n\t\t\t\ttoolSnippets[name] = snippet;\n\t\t\t}\n\n\t\t\tconst toolGuidelines = this._toolPromptGuidelines.get(name);\n\t\t\tif (toolGuidelines) {\n\t\t\t\tpromptGuidelines.push(...toolGuidelines);\n\t\t\t}\n\t\t}\n\n\t\tconst loaderSystemPrompt = this._resourceLoader.getSystemPrompt();\n\t\tconst loaderAppendSystemPrompt = this._resourceLoader.getAppendSystemPrompt();\n\t\tconst allAppends = [...loaderAppendSystemPrompt];\n\t\tif (this._systemPromptSuffix) allAppends.push(this._systemPromptSuffix);\n\t\tconst appendSystemPrompt = allAppends.length > 0 ? allAppends.join(\"\\n\\n\") : undefined;\n\t\tconst loadedSkills = this._resourceLoader.getSkills().skills;\n\t\tconst loadedContextFiles = this._resourceLoader\n\t\t\t.getAgentsFiles()\n\t\t\t.agentsFiles.filter((file) => {\n\t\t\t\tconst normalized = file.path.replace(/\\\\/g, \"/\");\n\t\t\t\tconst isIosmPlaybook = normalized.endsWith(\"/IOSM.md\");\n\t\t\t\tconst isAgentsPlaybook = normalized.endsWith(\"/AGENTS.md\");\n\t\t\t\tif (!isIosmPlaybook && !isAgentsPlaybook) return true;\n\t\t\t\treturn this._iosmAutopilotEnabled ? isIosmPlaybook : isAgentsPlaybook;\n\t\t\t});\n\n\t\tconst promptContextOptions = {\n\t\t\tenableContextDedupe: this.settingsManager.getPromptContextEnableDedupe(),\n\t\t\tmaxContextCharsPerFile: this.settingsManager.getPromptContextMaxCharsPerFile(),\n\t\t\tmaxTotalContextChars: this.settingsManager.getPromptContextMaxTotalChars(),\n\t\t\tenableGitSnapshotContext: this.settingsManager.getPromptContextEnableGitSnapshotContext(),\n\t\t};\n\t\tconst gitSnapshotMaxChars = this.settingsManager.getPromptContextGitSnapshotMaxChars();\n\t\tconst gitSnapshotResult = promptContextOptions.enableGitSnapshotContext\n\t\t\t? this._buildGitSnapshotContext(gitSnapshotMaxChars)\n\t\t\t: {\n\t\t\t\t\tgitSnapshotContext: undefined,\n\t\t\t\t\tdiagnostics: {\n\t\t\t\t\t\tbeforeChars: 0,\n\t\t\t\t\t\tafterChars: 0,\n\t\t\t\t\t\ttruncated: false,\n\t\t\t\t\t\tincluded: false,\n\t\t\t\t\t} as GitSnapshotContextDiagnostics,\n\t\t\t\t};\n\n\t\treturn buildSystemPrompt({\n\t\t\tcwd: this._cwd,\n\t\t\tskills: loadedSkills,\n\t\t\tcontextFiles: loadedContextFiles,\n\t\t\tgitSnapshotContext: gitSnapshotResult.gitSnapshotContext,\n\t\t\tcontextProcessing: promptContextOptions,\n\t\t\tcustomPrompt: loaderSystemPrompt,\n\t\t\tappendSystemPrompt,\n\t\t\tselectedTools: validToolNames,\n\t\t\ttoolSnippets,\n\t\t\tpromptGuidelines,\n\t\t\tonContextProcessed: (stats) => {\n\t\t\t\tthis._appendSessionTrace({\n\t\t\t\t\ttype: \"system_prompt_context_compose\",\n\t\t\t\t\tcontext_before_chars: stats.contextBeforeChars,\n\t\t\t\t\tcontext_after_chars: stats.contextAfterChars,\n\t\t\t\t\tdedupe_hits: stats.dedupeHits,\n\t\t\t\t\ttruncated_files: stats.truncatedFiles,\n\t\t\t\t\tdropped_files: stats.droppedFiles,\n\t\t\t\t\tincluded_files: stats.includedFiles,\n\t\t\t\t\ttotal_files: stats.totalFiles,\n\t\t\t\t\tgit_snapshot_included: stats.gitSnapshotIncluded,\n\t\t\t\t\tgit_snapshot_chars_before: gitSnapshotResult.diagnostics.beforeChars,\n\t\t\t\t\tgit_snapshot_chars_after: gitSnapshotResult.diagnostics.afterChars,\n\t\t\t\t\tgit_snapshot_truncated: gitSnapshotResult.diagnostics.truncated,\n\t\t\t\t\tgit_snapshot_max_chars: gitSnapshotMaxChars,\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\t}\n\n\t// =========================================================================\n\t// Prompting\n\t// =========================================================================\n\n\t/**\n\t * Send a prompt to the agent.\n\t * - Handles extension commands (registered via iosm.registerCommand) immediately, even during streaming\n\t * - Expands file-based prompt templates by default\n\t * - During streaming, queues via steer() or followUp() based on streamingBehavior option\n\t * - Validates model and API key before sending (when not streaming)\n\t * @throws Error if streaming and no streamingBehavior specified\n\t * @throws Error if no model selected or no API key available (when not streaming)\n\t */\n\tasync prompt(text: string, options?: PromptOptions): Promise<void> {\n\t\tconst expandPromptTemplates = options?.expandPromptTemplates ?? true;\n\t\tconst inputSource = options?.source ?? \"interactive\";\n\t\tthis._appendSessionTrace({\n\t\t\ttype: \"prompt_start\",\n\t\t\ttext,\n\t\t\texpandPromptTemplates,\n\t\t\tsource: inputSource,\n\t\t\timageCount: options?.images?.length ?? 0,\n\t\t});\n\n\t\tif (!options?.skipUltrathinkCommand) {\n\t\t\tconst ultrathinkParseResult = parseUltrathinkCommand(text);\n\t\t\tif (ultrathinkParseResult?.kind === \"error\") {\n\t\t\t\tthrow new Error(`${ultrathinkParseResult.error}\\n\\n${ultrathinkParseResult.usage}`);\n\t\t\t}\n\t\t\tif (ultrathinkParseResult?.kind === \"command\") {\n\t\t\t\tawait this._runUltrathinkCommand(ultrathinkParseResult.command, { source: inputSource });\n\t\t\t\tthis._appendSessionTrace({\n\t\t\t\t\ttype: \"prompt_handled_by_command\",\n\t\t\t\t\ttext,\n\t\t\t\t\tcommand: \"ultrathink\",\n\t\t\t\t\titerations: ultrathinkParseResult.command.iterations,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Handle extension commands first (execute immediately, even during streaming)\n\t\t// Extension commands manage their own LLM interaction via iosm.sendMessage()\n\t\tif (expandPromptTemplates && text.startsWith(\"/\")) {\n\t\t\tconst handled = await this._tryExecuteExtensionCommand(text);\n\t\t\tif (handled) {\n\t\t\t\tthis._appendSessionTrace({\n\t\t\t\t\ttype: \"prompt_handled_by_command\",\n\t\t\t\t\ttext,\n\t\t\t\t});\n\t\t\t\t// Extension command executed, no prompt to send\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Emit input event for extension interception (before skill/template expansion)\n\t\tlet currentText = text;\n\t\tlet currentImages = options?.images;\n\t\tif (this._extensionRunner?.hasHandlers(\"input\")) {\n\t\t\tconst inputResult = await this._extensionRunner.emitInput(\n\t\t\t\tcurrentText,\n\t\t\t\tcurrentImages,\n\t\t\t\tinputSource,\n\t\t\t);\n\t\t\tif (inputResult.action === \"handled\") {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (inputResult.action === \"transform\") {\n\t\t\t\tcurrentText = inputResult.text;\n\t\t\t\tcurrentImages = inputResult.images ?? currentImages;\n\t\t\t}\n\t\t}\n\n\t\tconst userPromptHooks = applyUserPromptSubmitHooks(this._hooksConfig, currentText);\n\t\tthis._queueHookNotices(\"UserPromptSubmit\", userPromptHooks.notices);\n\t\tif (userPromptHooks.notices.length > 0) {\n\t\t\tthis._flushHookNotices();\n\t\t}\n\t\tif (userPromptHooks.blocked) {\n\t\t\tthis._flushHookNotices();\n\t\t\tthrow new Error(userPromptHooks.message ?? \"Prompt blocked by UserPromptSubmit hook.\");\n\t\t}\n\t\tcurrentText = userPromptHooks.text;\n\n\t\t// Expand skill commands (/skill:name args) and prompt templates (/template args)\n\t\tlet expandedText = currentText;\n\t\tif (expandPromptTemplates) {\n\t\t\texpandedText = this._expandSkillCommand(expandedText);\n\t\t\texpandedText = expandPromptTemplate(expandedText, [...this.promptTemplates]);\n\t\t}\n\t\tconst orchestrationDirective = options?.skipOrchestrationDirective\n\t\t\t? undefined\n\t\t\t: buildSubagentOrchestrationDirective(expandedText) ??\n\t\t\t\t(this._profileName === \"meta\" ? buildMetaProfileOrchestrationDirective(expandedText) : undefined);\n\t\tconst promptText = orchestrationDirective ? `${expandedText}\\n\\n${orchestrationDirective}` : expandedText;\n\t\tconst orchestrationDisplayText = orchestrationDirective\n\t\t\t? deriveOrchestrationDisplayText(expandedText) ?? expandedText\n\t\t\t: undefined;\n\t\tthis._appendSessionTrace({\n\t\t\ttype: \"prompt_expanded\",\n\t\t\ttext: promptText,\n\t\t\timageCount: currentImages?.length ?? 0,\n\t\t\torchestrationInjected: orchestrationDirective !== undefined,\n\t\t});\n\n\t\tif (orchestrationDirective) {\n\t\t\tthis._appendCustomMessageLocally({\n\t\t\t\tcustomType: INTERNAL_UI_META_CUSTOM_TYPE,\n\t\t\t\tcontent: \"\",\n\t\t\t\tdisplay: false,\n\t\t\t\tdetails: {\n\t\t\t\t\tkind: \"orchestration_context\",\n\t\t\t\t\trawPrompt: promptText,\n\t\t\t\t\tdisplayText: orchestrationDisplayText,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\t// If streaming, queue via steer(), followUp(), or meta() based on option\n\t\tif (this.isStreaming) {\n\t\t\tif (!options?.streamingBehavior) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"Agent is already processing. Specify streamingBehavior ('steer', 'followUp', or 'meta') to queue the message.\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait this._injectIosmRuntimeContext(currentText, options.streamingBehavior, {\n\t\t\t\tsource: inputSource,\n\t\t\t\tskip: options?.skipIosmAutopilot,\n\t\t\t});\n\t\t\tif (options.streamingBehavior === \"followUp\") {\n\t\t\t\tawait this._queueFollowUp(promptText, currentImages);\n\t\t\t} else if (options.streamingBehavior === \"meta\") {\n\t\t\t\tawait this._queueMeta(promptText, currentImages);\n\t\t\t} else {\n\t\t\t\tawait this._queueSteer(promptText, currentImages);\n\t\t\t}\n\t\t\tthis._appendSessionTrace({\n\t\t\t\ttype: \"prompt_queued\",\n\t\t\t\tmode: options.streamingBehavior,\n\t\t\t\ttext: promptText,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// Flush any pending bash messages before the new prompt\n\t\tthis._flushPendingBashMessages();\n\n\t\t// Validate model\n\t\tif (!this.model) {\n\t\t\tthrow new Error(\n\t\t\t\t\"No model selected.\\n\\n\" +\n\t\t\t\t\t`Use /login or set an API key environment variable. See ${join(getDocsPath(), \"providers.md\")}\\n\\n` +\n\t\t\t\t\t\"Then use /model to select a model.\",\n\t\t\t);\n\t\t}\n\n\t\t// Validate API key\n\t\tconst apiKey = await this._modelRegistry.getApiKey(this.model);\n\t\tif (!apiKey) {\n\t\t\tconst isOAuth = this._modelRegistry.isUsingOAuth(this.model);\n\t\t\tif (isOAuth) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Authentication failed for \"${this.model.provider}\". ` +\n\t\t\t\t\t\t`Credentials may have expired or network is unavailable. ` +\n\t\t\t\t\t\t`Run '/login ${this.model.provider}' to re-authenticate.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow new Error(\n\t\t\t\t`No API key found for ${this.model.provider}.\\n\\n` +\n\t\t\t\t\t`Use /login or set an API key environment variable. See ${join(getDocsPath(), \"providers.md\")}`,\n\t\t\t);\n\t\t}\n\n\t\t// Check if we need to compact before sending (catches aborted responses)\n\t\tconst lastAssistant = this._findLastAssistantMessage();\n\t\tif (lastAssistant) {\n\t\t\tawait this._checkCompaction(lastAssistant, false);\n\t\t}\n\n\t\tawait this._injectIosmRuntimeContext(currentText, \"nextTurn\", {\n\t\t\tsource: inputSource,\n\t\t\tskip: options?.skipIosmAutopilot,\n\t\t});\n\n\t\t// Build messages array (custom context first, then user message)\n\t\tconst messages: AgentMessage[] = [];\n\n\t\t// Inject any pending \"nextTurn\" messages as context before the user message\n\t\tfor (const msg of this._pendingNextTurnMessages) {\n\t\t\tmessages.push(msg);\n\t\t}\n\t\tthis._pendingNextTurnMessages = [];\n\n\t\t// Add user message\n\t\tconst userContent: (TextContent | ImageContent)[] = [{ type: \"text\", text: promptText }];\n\t\tif (currentImages) {\n\t\t\tuserContent.push(...currentImages);\n\t\t}\n\t\tmessages.push({\n\t\t\trole: \"user\",\n\t\t\tcontent: userContent,\n\t\t\ttimestamp: Date.now(),\n\t\t});\n\n\t\t// Emit before_agent_start extension event\n\t\tif (this._extensionRunner) {\n\t\t\tconst result = await this._extensionRunner.emitBeforeAgentStart(\n\t\t\t\tpromptText,\n\t\t\t\tcurrentImages,\n\t\t\t\tthis._baseSystemPrompt,\n\t\t\t);\n\t\t\t// Add all custom messages from extensions\n\t\t\tif (result?.messages) {\n\t\t\t\tfor (const msg of result.messages) {\n\t\t\t\t\tmessages.push({\n\t\t\t\t\t\trole: \"custom\",\n\t\t\t\t\t\tcustomType: msg.customType,\n\t\t\t\t\t\tcontent: msg.content,\n\t\t\t\t\t\tdisplay: msg.display,\n\t\t\t\t\t\tdetails: msg.details,\n\t\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Apply extension-modified system prompt, or reset to base\n\t\t\tif (result?.systemPrompt) {\n\t\t\t\tthis.agent.setSystemPrompt(result.systemPrompt);\n\t\t\t} else {\n\t\t\t\t// Ensure we're using the base prompt (in case previous turn had modifications)\n\t\t\t\tthis.agent.setSystemPrompt(this._baseSystemPrompt);\n\t\t\t}\n\t\t}\n\n\t\tconst enableProtocolAutoRepair = !options?.skipProtocolAutoRepair && !this._protocolAutoRepairActive;\n\t\tlet protocolToolCallsStarted = 0;\n\t\tlet latestAssistantProtocolText = \"\";\n\t\tlet latestAssistantMessage: AssistantMessage | undefined;\n\t\tlet latestAssistantVisibleText = \"\";\n\t\tconst unsubscribeProtocolMonitor = enableProtocolAutoRepair\n\t\t\t? this.subscribe((event) => {\n\t\t\t\t\tif (event.type === \"tool_execution_start\") {\n\t\t\t\t\t\tprotocolToolCallsStarted += 1;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (event.type === \"message_end\" && event.message.role === \"assistant\") {\n\t\t\t\t\t\tlatestAssistantMessage = event.message as AssistantMessage;\n\t\t\t\t\t\tlatestAssistantProtocolText = extractAssistantProtocolText(latestAssistantMessage);\n\t\t\t\t\t\tlatestAssistantVisibleText = extractAssistantVisibleText(latestAssistantMessage);\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t: undefined;\n\n\t\ttry {\n\t\t\tawait this.agent.prompt(messages);\n\t\t\tawait this.waitForRetry();\n\t\t} finally {\n\t\t\tunsubscribeProtocolMonitor?.();\n\t\t}\n\n\t\tthis._appendSessionTrace({\n\t\t\ttype: \"prompt_dispatched\",\n\t\t\tmessageCount: messages.length,\n\t\t\ttext: promptText,\n\t\t});\n\n\t\tif (enableProtocolAutoRepair) {\n\t\t\tlet nextIssue = detectPromptProtocolIssue(latestAssistantProtocolText);\n\t\t\tlet nextSilentStopWithoutOutput =\n\t\t\t\t!nextIssue &&\n\t\t\t\tlatestAssistantMessage?.stopReason === \"stop\" &&\n\t\t\t\t!latestAssistantMessage.content.some((part) => part.type === \"toolCall\") &&\n\t\t\t\tisNonActionableVisibleAssistantText(latestAssistantVisibleText);\n\t\t\tif (nextIssue || nextSilentStopWithoutOutput) {\n\t\t\t\tthis._protocolAutoRepairActive = true;\n\t\t\t\ttry {\n\t\t\t\t\tfor (\n\t\t\t\t\t\tlet repairAttempt = 1;\n\t\t\t\t\t\trepairAttempt <= MAX_PROMPT_PROTOCOL_AUTO_REPAIR_ATTEMPTS && (nextIssue || nextSilentStopWithoutOutput);\n\t\t\t\t\t\trepairAttempt += 1\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst hasPriorToolActivity = protocolToolCallsStarted > 0 || repairAttempt > 1;\n\t\t\t\t\t\tconst correctionPrompt = nextIssue\n\t\t\t\t\t\t\t? buildPromptProtocolCorrectionPrompt({\n\t\t\t\t\t\t\t\t\toriginalPrompt: expandedText,\n\t\t\t\t\t\t\t\t\tissue: nextIssue,\n\t\t\t\t\t\t\t\t\thasPriorToolActivity,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t: buildPromptSilentStopRecoveryPrompt({\n\t\t\t\t\t\t\t\t\toriginalPrompt: expandedText,\n\t\t\t\t\t\t\t\t\thasPriorToolActivity,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\tthis._appendSessionTrace({\n\t\t\t\t\t\t\ttype: \"prompt_protocol_auto_repair\",\n\t\t\t\t\t\t\toriginalPrompt: expandedText,\n\t\t\t\t\t\t\tissue: nextIssue ?? { silentStopWithoutOutput: true },\n\t\t\t\t\t\t\thasPriorToolActivity,\n\t\t\t\t\t\t\trepairAttempt,\n\t\t\t\t\t\t\tmaxRepairAttempts: MAX_PROMPT_PROTOCOL_AUTO_REPAIR_ATTEMPTS,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tawait this.prompt(correctionPrompt, {\n\t\t\t\t\t\t\texpandPromptTemplates: false,\n\t\t\t\t\t\t\tskipIosmAutopilot: true,\n\t\t\t\t\t\t\tskipOrchestrationDirective: true,\n\t\t\t\t\t\t\tskipProtocolAutoRepair: true,\n\t\t\t\t\t\t\tsource: inputSource,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst repairedAssistant = this._findLastAssistantMessage();\n\t\t\t\t\t\tconst repairedProtocolText = repairedAssistant ? extractAssistantProtocolText(repairedAssistant) : \"\";\n\t\t\t\t\t\tconst repairedVisibleText = repairedAssistant ? extractAssistantVisibleText(repairedAssistant) : \"\";\n\t\t\t\t\t\tnextIssue = detectPromptProtocolIssue(repairedProtocolText);\n\t\t\t\t\t\tnextSilentStopWithoutOutput =\n\t\t\t\t\t\t\t!nextIssue &&\n\t\t\t\t\t\t\trepairedAssistant?.stopReason === \"stop\" &&\n\t\t\t\t\t\t\t!repairedAssistant.content.some((part) => part.type === \"toolCall\") &&\n\t\t\t\t\t\t\tisNonActionableVisibleAssistantText(repairedVisibleText);\n\t\t\t\t\t}\n\t\t\t\t} finally {\n\t\t\t\t\tthis._protocolAutoRepairActive = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async _runUltrathinkCommand(\n\t\tcommand: UltrathinkCommandConfig,\n\t\toptions: { source: InputSource },\n\t): Promise<void> {\n\t\tif (this.isStreaming) {\n\t\t\tthrow new Error(\"Cannot start /ultrathink while the agent is processing another request.\");\n\t\t}\n\t\tif (this.isCompacting) {\n\t\t\tthrow new Error(\"Cannot start /ultrathink while compaction is running.\");\n\t\t}\n\t\tif (this._ultrathinkActive) {\n\t\t\tthrow new Error(\"An /ultrathink run is already in progress.\");\n\t\t}\n\n\t\tif (!this.model) {\n\t\t\tthrow new Error(\n\t\t\t\t\"No model selected.\\n\\n\" +\n\t\t\t\t\t`Use /login or set an API key environment variable. See ${join(getDocsPath(), \"providers.md\")}\\n\\n` +\n\t\t\t\t\t\"Then use /model to select a model.\",\n\t\t\t);\n\t\t}\n\n\t\tconst apiKey = await this._modelRegistry.getApiKey(this.model);\n\t\tif (!apiKey) {\n\t\t\tconst isOAuth = this._modelRegistry.isUsingOAuth(this.model);\n\t\t\tif (isOAuth) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Authentication failed for \"${this.model.provider}\". ` +\n\t\t\t\t\t\t`Credentials may have expired or network is unavailable. ` +\n\t\t\t\t\t\t`Run '/login ${this.model.provider}' to re-authenticate.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow new Error(\n\t\t\t\t`No API key found for ${this.model.provider}.\\n\\n` +\n\t\t\t\t\t`Use /login or set an API key environment variable. See ${join(getDocsPath(), \"providers.md\")}`,\n\t\t\t);\n\t\t}\n\n\t\tconst objective = command.query?.trim() || findLastMeaningfulUserIntent(this.messages);\n\t\tif (!objective) {\n\t\t\tthrow new Error(\n\t\t\t\t[\n\t\t\t\t\t\"Cannot infer an objective for /ultrathink from session context.\",\n\t\t\t\t\t\"Provide a query explicitly or send a regular user request first.\",\n\t\t\t\t\t\"\",\n\t\t\t\t\tULTRATHINK_USAGE,\n\t\t\t\t].join(\"\\n\"),\n\t\t\t);\n\t\t}\n\n\t\tconst originalTools = this.getActiveToolNames();\n\t\tconst availableToolNames = this.getAllTools().map((tool) => tool.name);\n\t\tconst readOnlyTools = resolveUltrathinkReadOnlyTools(availableToolNames);\n\t\tif (readOnlyTools.length === 0) {\n\t\t\tthrow new Error(\n\t\t\t\t[\n\t\t\t\t\t\"Cannot start /ultrathink: no read-only tools are currently active.\",\n\t\t\t\t\t\"Enable at least one analysis tool (for example read/rg/find/semantic_search/fetch/git_read) and retry.\",\n\t\t\t\t].join(\"\\n\"),\n\t\t\t);\n\t\t}\n\n\t\tconst contextTail = buildUltrathinkContextTail(this.messages);\n\t\tlet checkpoint = createInitialUltrathinkCheckpoint(objective);\n\t\tlet previousSummary: string | undefined;\n\t\tlet accumulatedInputTokens = 0;\n\t\tlet accumulatedTotalTokens = 0;\n\t\tlet accumulatedCost = 0;\n\t\tlet stagnationCount = 0;\n\t\tlet targetIterations = command.iterations;\n\t\tlet enforceEvidencePolicy = true;\n\t\tconst evidenceById = new Map<string, ReturnType<typeof extractUltrathinkToolEvidence>[number]>();\n\n\t\tconst mergeEvidence = (messages: AgentMessage[]): number => {\n\t\t\tconst evidence = extractUltrathinkToolEvidence(messages);\n\t\t\tfor (const entry of evidence) {\n\t\t\t\tevidenceById.set(entry.toolCallId, entry);\n\t\t\t}\n\t\t\treturn evidence.length;\n\t\t};\n\n\t\tconst registerUsage = (\n\t\t\tassistantMessage: AssistantMessage | undefined,\n\t\t): { inputTokens: number; totalTokens: number; costTotal: number } => {\n\t\t\tconst usage = assistantMessage?.usage;\n\t\t\tconst inputTokens = Number(usage?.input ?? 0);\n\t\t\tconst totalTokens = Number(usage?.totalTokens ?? inputTokens + Number(usage?.output ?? 0));\n\t\t\tconst costTotal = Number(usage?.cost?.total ?? 0);\n\t\t\taccumulatedInputTokens += inputTokens;\n\t\t\taccumulatedTotalTokens += totalTokens;\n\t\t\taccumulatedCost += costTotal;\n\t\t\treturn { inputTokens, totalTokens, costTotal };\n\t\t};\n\n\t\tconst exceedsBudget = (iterationInputTokens: number): boolean =>\n\t\t\titerationInputTokens > ULTRATHINK_MAX_ITERATION_INPUT_TOKENS ||\n\t\t\taccumulatedInputTokens > ULTRATHINK_MAX_RUN_INPUT_TOKENS ||\n\t\t\taccumulatedTotalTokens > ULTRATHINK_MAX_RUN_TOTAL_TOKENS ||\n\t\t\taccumulatedCost > ULTRATHINK_MAX_RUN_COST;\n\n\t\tconst runUltrathinkInternalPrompt = async (rawPrompt: string, displayText: string): Promise<AgentMessage[]> => {\n\t\t\tthis._appendCustomMessageLocally({\n\t\t\t\tcustomType: INTERNAL_UI_META_CUSTOM_TYPE,\n\t\t\t\tcontent: \"\",\n\t\t\t\tdisplay: false,\n\t\t\t\tdetails: {\n\t\t\t\t\tkind: \"orchestration_context\",\n\t\t\t\t\trawPrompt,\n\t\t\t\t\tdisplayText,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tconst messageCountBefore = this.messages.length;\n\t\t\tawait this.prompt(rawPrompt, {\n\t\t\t\texpandPromptTemplates: false,\n\t\t\t\tskipIosmAutopilot: true,\n\t\t\t\tskipOrchestrationDirective: true,\n\t\t\t\tskipUltrathinkCommand: true,\n\t\t\t\tsource: options.source,\n\t\t\t});\n\t\t\treturn this.messages.slice(messageCountBefore);\n\t\t};\n\n\t\tthis._ultrathinkActive = true;\n\t\tthis.setActiveToolsByName(readOnlyTools);\n\n\t\ttry {\n\t\t\tfor (let iteration = 1; iteration <= targetIterations; iteration++) {\n\t\t\t\tconst phase = iteration === targetIterations ? \"Synthesis\" : getUltrathinkPhase(iteration, targetIterations);\n\t\t\t\tconst evidenceCatalog = buildUltrathinkEvidenceCatalog([...evidenceById.values()]);\n\t\t\t\tconst budgetStatus = buildUltrathinkBudgetStatusLine({\n\t\t\t\t\taccumulatedInputTokens,\n\t\t\t\t\taccumulatedTotalTokens,\n\t\t\t\t\taccumulatedCost,\n\t\t\t\t});\n\t\t\t\tconst iterationPrompt = buildUltrathinkIterationPrompt({\n\t\t\t\t\titeration,\n\t\t\t\t\ttotalIterations: targetIterations,\n\t\t\t\t\tphase,\n\t\t\t\t\tobjective,\n\t\t\t\t\tcheckpoint,\n\t\t\t\t\tpreviousSummary,\n\t\t\t\t\tcontextTail: iteration === 1 ? contextTail : undefined,\n\t\t\t\t\tevidenceCatalog,\n\t\t\t\t\tbudgetStatus,\n\t\t\t\t});\n\t\t\t\tconst visibleIterationPrompt = buildUltrathinkVisibleIterationPrompt({\n\t\t\t\t\titeration,\n\t\t\t\t\ttotalIterations: targetIterations,\n\t\t\t\t\tphase,\n\t\t\t\t\tobjective,\n\t\t\t\t});\n\n\t\t\t\tconst iterationMessages = await runUltrathinkInternalPrompt(iterationPrompt, visibleIterationPrompt);\n\t\t\t\tlet toolChecksThisIteration = mergeEvidence(iterationMessages);\n\t\t\t\tlet assistantMessage = this._findLastAssistantMessage();\n\t\t\t\tlet assistantText = this.getLastAssistantText() ?? \"\";\n\t\t\t\tlet iterationUsage = registerUsage(assistantMessage);\n\t\t\t\tlet iterationInputTokens = iterationUsage.inputTokens;\n\n\t\t\t\tconst evaluatePolicy = () =>\n\t\t\t\t\tevaluateUltrathinkEvidencePolicy({\n\t\t\t\t\t\ttext: assistantText,\n\t\t\t\t\t\tphase,\n\t\t\t\t\t\ttoolChecksThisIteration,\n\t\t\t\t\t\tknownEvidenceIds: [...evidenceById.keys()],\n\t\t\t\t\t});\n\n\t\t\t\tconst shouldGround = shouldUltrathinkForceToolGrounding({\n\t\t\t\t\tphase,\n\t\t\t\t\tcumulativeEvidenceCount: evidenceById.size,\n\t\t\t\t\ttoolChecksThisIteration,\n\t\t\t\t});\n\t\t\t\tif (shouldGround) {\n\t\t\t\t\tconst groundingPrompt = buildUltrathinkToolGroundingPrompt({\n\t\t\t\t\t\titeration,\n\t\t\t\t\t\ttotalIterations: targetIterations,\n\t\t\t\t\t\tphase,\n\t\t\t\t\t\tobjective,\n\t\t\t\t\t\tcheckpoint,\n\t\t\t\t\t\tavailableReadOnlyTools: readOnlyTools,\n\t\t\t\t\t\tevidenceCatalog: buildUltrathinkEvidenceCatalog([...evidenceById.values()]),\n\t\t\t\t\t});\n\t\t\t\t\tconst groundingDisplayText = `${ULTRATHINK_VISIBLE_PROMPT_PREFIX} ${iteration}/${targetIterations} (${phase}) grounding retry. Performing live workspace probes with read-only tools.`;\n\t\t\t\t\tconst groundingMessages = await runUltrathinkInternalPrompt(groundingPrompt, groundingDisplayText);\n\t\t\t\t\ttoolChecksThisIteration += mergeEvidence(groundingMessages);\n\t\t\t\t\tassistantMessage = this._findLastAssistantMessage();\n\t\t\t\t\tassistantText = this.getLastAssistantText() ?? \"\";\n\t\t\t\t\titerationUsage = registerUsage(assistantMessage);\n\t\t\t\t\titerationInputTokens += iterationUsage.inputTokens;\n\t\t\t\t}\n\n\t\t\t\tif (enforceEvidencePolicy) {\n\t\t\t\t\tlet evidencePolicy = evaluatePolicy();\n\t\t\t\t\tif (hasUltrathinkEvidenceViolations(evidencePolicy)) {\n\t\t\t\t\t\tconst policyIssues: string[] = [];\n\t\t\t\t\t\tif (evidencePolicy.missingEvidenceForNumbers) {\n\t\t\t\t\t\t\tpolicyIssues.push(\"Quantitative claims are missing `[evidence:<toolCallId>]` tags.\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (evidencePolicy.invalidEvidenceTags.length > 0) {\n\t\t\t\t\t\t\tpolicyIssues.push(`Unknown evidence tags: ${evidencePolicy.invalidEvidenceTags.join(\", \")}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (evidencePolicy.needsNoNewEvidenceMarker && !evidencePolicy.hasNoNewEvidenceMarker) {\n\t\t\t\t\t\t\tpolicyIssues.push(\"Verify/Synthesis response with no new tool checks must include [NO_NEW_EVIDENCE_OK].\");\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst repairPrompt = buildUltrathinkComplianceRepairPrompt({\n\t\t\t\t\t\t\titeration,\n\t\t\t\t\t\t\ttotalIterations: targetIterations,\n\t\t\t\t\t\t\tphase,\n\t\t\t\t\t\t\tobjective,\n\t\t\t\t\t\t\toriginalResponse: assistantText,\n\t\t\t\t\t\t\tissues: policyIssues,\n\t\t\t\t\t\t\tcheckpoint,\n\t\t\t\t\t\t\tevidenceCatalog: buildUltrathinkEvidenceCatalog([...evidenceById.values()]),\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst repairDisplayText = `${ULTRATHINK_VISIBLE_PROMPT_PREFIX} ${iteration}/${targetIterations} (${phase}) policy repair. Normalizing evidence links and checkpoint format.`;\n\t\t\t\t\t\tconst repairMessages = await runUltrathinkInternalPrompt(repairPrompt, repairDisplayText);\n\t\t\t\t\t\ttoolChecksThisIteration += mergeEvidence(repairMessages);\n\t\t\t\t\t\tassistantMessage = this._findLastAssistantMessage();\n\t\t\t\t\t\tassistantText = this.getLastAssistantText() ?? \"\";\n\t\t\t\t\t\titerationUsage = registerUsage(assistantMessage);\n\t\t\t\t\t\titerationInputTokens += iterationUsage.inputTokens;\n\t\t\t\t\t\tevidencePolicy = evaluatePolicy();\n\n\t\t\t\t\t\tif (hasUltrathinkEvidenceViolations(evidencePolicy)) {\n\t\t\t\t\t\t\t// Do not fail the entire run; keep the latest usable answer and finish gracefully.\n\t\t\t\t\t\t\tenforceEvidencePolicy = false;\n\t\t\t\t\t\t\tif (iteration < targetIterations) {\n\t\t\t\t\t\t\t\ttargetIterations = Math.min(targetIterations, iteration + 1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tpreviousSummary = extractUltrathinkIterationSummary(assistantText);\n\t\t\t\tconst checkpointBeforeIteration = checkpoint;\n\t\t\t\tconst extractedCheckpoint = extractUltrathinkCheckpoint(assistantText);\n\t\t\t\tif (extractedCheckpoint && extractedCheckpoint.trim()) {\n\t\t\t\t\tcheckpoint = normalizeUltrathinkCheckpoint(extractedCheckpoint, objective);\n\t\t\t\t}\n\t\t\t\tif (checkpoint.length > ULTRATHINK_MAX_CHECKPOINT_CHARS) {\n\t\t\t\t\tcheckpoint = await this._compressUltrathinkCheckpoint(checkpoint, objective, apiKey);\n\t\t\t\t}\n\n\t\t\t\tconst stagnated = isUltrathinkStagnated({\n\t\t\t\t\tpreviousCheckpoint: checkpointBeforeIteration,\n\t\t\t\t\tnextCheckpoint: checkpoint,\n\t\t\t\t\ttoolChecksThisIteration,\n\t\t\t\t});\n\t\t\t\tif (stagnated && iteration < targetIterations) {\n\t\t\t\t\tstagnationCount += 1;\n\t\t\t\t\tif (stagnationCount >= ULTRATHINK_STAGNATION_LIMIT) {\n\t\t\t\t\t\ttargetIterations = Math.min(targetIterations, iteration + 1);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tstagnationCount = 0;\n\t\t\t\t}\n\n\t\t\t\tif (iteration < targetIterations && exceedsBudget(iterationInputTokens)) {\n\t\t\t\t\ttargetIterations = Math.min(targetIterations, iteration + 1);\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\tthis._ultrathinkActive = false;\n\t\t\tconst currentTools = this.getActiveToolNames();\n\t\t\tconst shouldRestore =\n\t\t\t\tcurrentTools.length !== originalTools.length ||\n\t\t\t\tcurrentTools.some((toolName, index) => toolName !== originalTools[index]);\n\t\t\tif (shouldRestore) {\n\t\t\t\tthis.setActiveToolsByName(originalTools);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async _compressUltrathinkCheckpoint(\n\t\tcheckpoint: string,\n\t\tobjective: string,\n\t\tapiKey: string,\n\t): Promise<string> {\n\t\tconst model = this.model;\n\t\tconst fallback = truncateUltrathinkCheckpoint(\n\t\t\tnormalizeUltrathinkCheckpoint(checkpoint, objective),\n\t\t\tULTRATHINK_MAX_CHECKPOINT_CHARS,\n\t\t);\n\t\tif (!model) return fallback;\n\n\t\tconst reserveTokens = this.settingsManager.getCompactionReserveTokens();\n\t\tconst maxTokens = Math.max(256, Math.min(2048, Math.floor(reserveTokens * 0.4)));\n\n\t\ttry {\n\t\t\tconst response = await completeSimple(\n\t\t\t\tmodel,\n\t\t\t\t{\n\t\t\t\t\tsystemPrompt: ULTRATHINK_CHECKPOINT_COMPRESSION_SYSTEM_PROMPT,\n\t\t\t\t\tmessages: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\trole: \"user\",\n\t\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\ttext: buildUltrathinkCheckpointCompressionPrompt({\n\t\t\t\t\t\t\t\t\t\tobjective,\n\t\t\t\t\t\t\t\t\t\tcheckpoint,\n\t\t\t\t\t\t\t\t\t\tmaxChars: ULTRATHINK_MAX_CHECKPOINT_CHARS,\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\tmodel.reasoning\n\t\t\t\t\t? { maxTokens, apiKey, reasoning: \"high\" as const }\n\t\t\t\t\t: { maxTokens, apiKey },\n\t\t\t);\n\n\t\t\tif (response.stopReason === \"error\") {\n\t\t\t\treturn fallback;\n\t\t\t}\n\n\t\t\tconst text = response.content\n\t\t\t\t.filter((part): part is { type: \"text\"; text: string } => part.type === \"text\")\n\t\t\t\t.map((part) => part.text)\n\t\t\t\t.join(\"\\n\")\n\t\t\t\t.trim();\n\t\t\tif (!text) {\n\t\t\t\treturn fallback;\n\t\t\t}\n\n\t\t\treturn truncateUltrathinkCheckpoint(\n\t\t\t\tnormalizeUltrathinkCheckpoint(text, objective),\n\t\t\t\tULTRATHINK_MAX_CHECKPOINT_CHARS,\n\t\t\t);\n\t\t} catch {\n\t\t\treturn fallback;\n\t\t}\n\t}\n\n\t/**\n\t * Try to execute an extension command. Returns true if command was found and executed.\n\t */\n\tprivate async _tryExecuteExtensionCommand(text: string): Promise<boolean> {\n\t\tif (!this._extensionRunner) return false;\n\n\t\t// Parse command name and args\n\t\tconst spaceIndex = text.indexOf(\" \");\n\t\tconst commandName = spaceIndex === -1 ? text.slice(1) : text.slice(1, spaceIndex);\n\t\tconst args = spaceIndex === -1 ? \"\" : text.slice(spaceIndex + 1);\n\n\t\tconst command = this._extensionRunner.getCommand(commandName);\n\t\tif (!command) return false;\n\n\t\t// Get command context from extension runner (includes session control methods)\n\t\tconst ctx = this._extensionRunner.createCommandContext();\n\n\t\ttry {\n\t\t\tawait command.handler(args, ctx);\n\t\t\treturn true;\n\t\t} catch (err) {\n\t\t\t// Emit error via extension runner\n\t\t\tthis._extensionRunner.emitError({\n\t\t\t\textensionPath: `command:${commandName}`,\n\t\t\t\tevent: \"command\",\n\t\t\t\terror: err instanceof Error ? err.message : String(err),\n\t\t\t});\n\t\t\treturn true;\n\t\t}\n\t}\n\n\t/**\n\t * Expand skill commands (/skill:name args) to their full content.\n\t * Returns the expanded text, or the original text if not a skill command or skill not found.\n\t * Emits errors via extension runner if file read fails.\n\t */\n\tprivate _expandSkillCommand(text: string): string {\n\t\tif (!text.startsWith(\"/skill:\")) return text;\n\n\t\tconst spaceIndex = text.indexOf(\" \");\n\t\tconst skillName = spaceIndex === -1 ? text.slice(7) : text.slice(7, spaceIndex);\n\t\tconst args = spaceIndex === -1 ? \"\" : text.slice(spaceIndex + 1).trim();\n\n\t\tconst skill = this.resourceLoader.getSkills().skills.find((s) => s.name === skillName);\n\t\tif (!skill) return text; // Unknown skill, pass through\n\n\t\ttry {\n\t\t\tconst content = readFileSync(skill.filePath, \"utf-8\");\n\t\t\tconst body = stripFrontmatter(content).trim();\n\t\t\tconst skillBlock = `<skill name=\"${skill.name}\" location=\"${skill.filePath}\">\\nReferences are relative to ${skill.baseDir}.\\n\\n${body}\\n</skill>`;\n\t\t\treturn args ? `${skillBlock}\\n\\n${args}` : skillBlock;\n\t\t} catch (err) {\n\t\t\t// Emit error like extension commands do\n\t\t\tthis._extensionRunner?.emitError({\n\t\t\t\textensionPath: skill.filePath,\n\t\t\t\tevent: \"skill_expansion\",\n\t\t\t\terror: err instanceof Error ? err.message : String(err),\n\t\t\t});\n\t\t\treturn text; // Return original on error\n\t\t}\n\t}\n\n\t/**\n\t * Queue a steering message to interrupt the agent mid-run.\n\t * Delivered after current tool execution, skips remaining tools.\n\t * Expands skill commands and prompt templates. Errors on extension commands.\n\t * @param images Optional image attachments to include with the message\n\t * @throws Error if text is an extension command\n\t */\n\tasync steer(text: string, images?: ImageContent[]): Promise<void> {\n\t\t// Check for extension commands (cannot be queued)\n\t\tif (text.startsWith(\"/\")) {\n\t\t\tthis._throwIfExtensionCommand(text);\n\t\t}\n\n\t\tawait this._injectIosmRuntimeContext(text, \"steer\", {\n\t\t\tsource: \"interactive\",\n\t\t});\n\n\t\t// Expand skill commands and prompt templates\n\t\tlet expandedText = this._expandSkillCommand(text);\n\t\texpandedText = expandPromptTemplate(expandedText, [...this.promptTemplates]);\n\n\t\tawait this._queueSteer(expandedText, images);\n\t}\n\n\t/**\n\t * Queue a follow-up message to be processed after the agent finishes.\n\t * Delivered only when agent has no more tool calls or steering messages.\n\t * Expands skill commands and prompt templates. Errors on extension commands.\n\t * @param images Optional image attachments to include with the message\n\t * @throws Error if text is an extension command\n\t */\n\tasync followUp(text: string, images?: ImageContent[]): Promise<void> {\n\t\t// Check for extension commands (cannot be queued)\n\t\tif (text.startsWith(\"/\")) {\n\t\t\tthis._throwIfExtensionCommand(text);\n\t\t}\n\n\t\tawait this._injectIosmRuntimeContext(text, \"followUp\", {\n\t\t\tsource: \"interactive\",\n\t\t});\n\n\t\t// Expand skill commands and prompt templates\n\t\tlet expandedText = this._expandSkillCommand(text);\n\t\texpandedText = expandPromptTemplate(expandedText, [...this.promptTemplates]);\n\n\t\tawait this._queueFollowUp(expandedText, images);\n\t}\n\n\t/**\n\t * Queue a meta message as a soft update.\n\t * It does not interrupt current tool execution and is delivered like follow-up,\n\t * while being tracked separately for UI and task-level checkpoint polling.\n\t */\n\tasync meta(text: string, images?: ImageContent[]): Promise<void> {\n\t\t// Check for extension commands (cannot be queued)\n\t\tif (text.startsWith(\"/\")) {\n\t\t\tthis._throwIfExtensionCommand(text);\n\t\t}\n\n\t\tawait this._injectIosmRuntimeContext(text, \"meta\", {\n\t\t\tsource: \"interactive\",\n\t\t});\n\n\t\t// Expand skill commands and prompt templates\n\t\tlet expandedText = this._expandSkillCommand(text);\n\t\texpandedText = expandPromptTemplate(expandedText, [...this.promptTemplates]);\n\n\t\tawait this._queueMeta(expandedText, images);\n\t}\n\n\t/**\n\t * Internal: Queue a steering message (already expanded, no extension command check).\n\t */\n\tprivate async _queueSteer(text: string, images?: ImageContent[]): Promise<void> {\n\t\tthis._steeringMessages.push(text);\n\t\tthis._appendSessionTrace({\n\t\t\ttype: \"queue_steer\",\n\t\t\ttext,\n\t\t\timageCount: images?.length ?? 0,\n\t\t});\n\t\tconst content: (TextContent | ImageContent)[] = [{ type: \"text\", text }];\n\t\tif (images) {\n\t\t\tcontent.push(...images);\n\t\t}\n\t\tthis.agent.steer({\n\t\t\trole: \"user\",\n\t\t\tcontent,\n\t\t\ttimestamp: Date.now(),\n\t\t});\n\t}\n\n\t/**\n\t * Internal: Queue a follow-up message (already expanded, no extension command check).\n\t */\n\tprivate async _queueFollowUp(text: string, images?: ImageContent[]): Promise<void> {\n\t\tthis._followUpMessages.push(text);\n\t\tthis._appendSessionTrace({\n\t\t\ttype: \"queue_follow_up\",\n\t\t\ttext,\n\t\t\timageCount: images?.length ?? 0,\n\t\t});\n\t\tconst content: (TextContent | ImageContent)[] = [{ type: \"text\", text }];\n\t\tif (images) {\n\t\t\tcontent.push(...images);\n\t\t}\n\t\tthis.agent.followUp({\n\t\t\trole: \"user\",\n\t\t\tcontent,\n\t\t\ttimestamp: Date.now(),\n\t\t});\n\t}\n\n\t/**\n\t * Internal: Queue a meta message.\n\t * Uses steering delivery while streaming so updates are applied at the next tool boundary\n\t * without language-specific trigger parsing. We still keep a separate meta queue for UI/polling.\n\t */\n\tprivate async _queueMeta(text: string, images?: ImageContent[]): Promise<void> {\n\t\tthis._metaMessages.push(text);\n\t\tthis._appendSessionTrace({\n\t\t\ttype: \"queue_meta\",\n\t\t\ttext,\n\t\t\timageCount: images?.length ?? 0,\n\t\t});\n\t\tconst content: (TextContent | ImageContent)[] = [{ type: \"text\", text }];\n\t\tif (images) {\n\t\t\tcontent.push(...images);\n\t\t}\n\t\t// Language-agnostic behavior: while streaming, meta always pivots via steer.\n\t\t// This avoids brittle keyword trigger lists across locales.\n\t\tconst deliverAsSteer = this.isStreaming;\n\t\tconst queueMethod = deliverAsSteer ? this.agent.steer.bind(this.agent) : this.agent.followUp.bind(this.agent);\n\t\tqueueMethod({\n\t\t\trole: \"user\",\n\t\t\tcontent,\n\t\t\ttimestamp: Date.now(),\n\t\t});\n\t}\n\n\t/**\n\t * Throw an error if the text is an extension command.\n\t */\n\tprivate _throwIfExtensionCommand(text: string): void {\n\t\tif (!this._extensionRunner) return;\n\n\t\tconst spaceIndex = text.indexOf(\" \");\n\t\tconst commandName = spaceIndex === -1 ? text.slice(1) : text.slice(1, spaceIndex);\n\t\tconst command = this._extensionRunner.getCommand(commandName);\n\n\t\tif (command) {\n\t\t\tthrow new Error(\n\t\t\t\t`Extension command \"/${commandName}\" cannot be queued. Use prompt() or execute the command when not streaming.`,\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate _shouldInjectIosmRuntimeContext(options: { source?: InputSource; skip?: boolean }): boolean {\n\t\tif (options.skip) {\n\t\t\treturn false;\n\t\t}\n\t\tif (!this._iosmAutopilotEnabled) {\n\t\t\treturn false;\n\t\t}\n\t\treturn options.source !== \"extension\";\n\t}\n\n\tprivate async _injectIosmRuntimeContext(\n\t\tuserInput: string,\n\t\tdeliverAs: \"steer\" | \"followUp\" | \"meta\" | \"nextTurn\",\n\t\toptions: { source?: InputSource; skip?: boolean },\n\t): Promise<void> {\n\t\tif (!this._shouldInjectIosmRuntimeContext(options)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst runtimeContext = await prepareIosmRuntimeContext(this._cwd, userInput);\n\t\tawait this.sendCustomMessage(\n\t\t\t{\n\t\t\t\tcustomType: \"iosm-runtime\",\n\t\t\t\tcontent: buildIosmRuntimeDirective(runtimeContext),\n\t\t\t\tdisplay: false,\n\t\t\t},\n\t\t\t{ deliverAs },\n\t\t);\n\t}\n\n\t/**\n\t * Send a custom message to the session. Creates a CustomMessageEntry.\n\t *\n\t * Handles three cases:\n\t * - Streaming: queues message, processed when loop pulls from queue\n\t * - Not streaming + triggerTurn: appends to state/session, starts new turn\n\t * - Not streaming + no trigger: appends to state/session, no turn\n\t *\n\t * @param message Custom message with customType, content, display, details\n\t * @param options.triggerTurn If true and not streaming, triggers a new LLM turn\n\t * @param options.deliverAs Delivery mode: \"steer\", \"followUp\", \"meta\", or \"nextTurn\"\n\t */\n\tprivate _appendCustomMessageLocally<T = unknown>(\n\t\tmessage: Pick<CustomMessage<T>, \"customType\" | \"content\" | \"display\" | \"details\">,\n\t): void {\n\t\tconst appMessage = {\n\t\t\trole: \"custom\" as const,\n\t\t\tcustomType: message.customType,\n\t\t\tcontent: message.content,\n\t\t\tdisplay: message.display,\n\t\t\tdetails: message.details,\n\t\t\ttimestamp: Date.now(),\n\t\t} satisfies CustomMessage<T>;\n\n\t\tthis.agent.appendMessage(appMessage);\n\t\tthis.sessionManager.appendCustomMessageEntry(message.customType, message.content, message.display, message.details);\n\t\tthis._emit({ type: \"message_start\", message: appMessage });\n\t\tthis._emit({ type: \"message_end\", message: appMessage });\n\t}\n\n\tasync sendCustomMessage<T = unknown>(\n\t\tmessage: Pick<CustomMessage<T>, \"customType\" | \"content\" | \"display\" | \"details\">,\n\t\toptions?: { triggerTurn?: boolean; deliverAs?: \"steer\" | \"followUp\" | \"meta\" | \"nextTurn\" },\n\t): Promise<void> {\n\t\tconst appMessage = {\n\t\t\trole: \"custom\" as const,\n\t\t\tcustomType: message.customType,\n\t\t\tcontent: message.content,\n\t\t\tdisplay: message.display,\n\t\t\tdetails: message.details,\n\t\t\ttimestamp: Date.now(),\n\t\t} satisfies CustomMessage<T>;\n\t\tif (options?.deliverAs === \"nextTurn\") {\n\t\t\tthis._pendingNextTurnMessages.push(appMessage);\n\t\t} else if (this.isStreaming) {\n\t\t\tif (options?.deliverAs === \"followUp\" || options?.deliverAs === \"meta\") {\n\t\t\t\tthis.agent.followUp(appMessage);\n\t\t\t} else {\n\t\t\t\tthis.agent.steer(appMessage);\n\t\t\t}\n\t\t} else if (options?.triggerTurn) {\n\t\t\tawait this.agent.prompt(appMessage);\n\t\t} else {\n\t\t\tthis._appendCustomMessageLocally(message);\n\t\t}\n\t}\n\n\t/**\n\t * Send a user message to the agent. Always triggers a turn.\n\t * When the agent is streaming, use deliverAs to specify how to queue the message.\n\t *\n\t * @param content User message content (string or content array)\n\t * @param options.deliverAs Delivery mode when streaming: \"steer\", \"followUp\", or \"meta\"\n\t */\n\tasync sendUserMessage(\n\t\tcontent: string | (TextContent | ImageContent)[],\n\t\toptions?: { deliverAs?: \"steer\" | \"followUp\" | \"meta\" },\n\t): Promise<void> {\n\t\t// Normalize content to text string + optional images\n\t\tlet text: string;\n\t\tlet images: ImageContent[] | undefined;\n\n\t\tif (typeof content === \"string\") {\n\t\t\ttext = content;\n\t\t} else {\n\t\t\tconst textParts: string[] = [];\n\t\t\timages = [];\n\t\t\tfor (const part of content) {\n\t\t\t\tif (part.type === \"text\") {\n\t\t\t\t\ttextParts.push(part.text);\n\t\t\t\t} else {\n\t\t\t\t\timages.push(part);\n\t\t\t\t}\n\t\t\t}\n\t\t\ttext = textParts.join(\"\\n\");\n\t\t\tif (images.length === 0) images = undefined;\n\t\t}\n\n\t\t// Use prompt() with expandPromptTemplates: false to skip command handling and template expansion\n\t\tawait this.prompt(text, {\n\t\t\texpandPromptTemplates: false,\n\t\t\tstreamingBehavior: options?.deliverAs,\n\t\t\timages,\n\t\t\tsource: \"extension\",\n\t\t});\n\t}\n\n\t/**\n\t * Clear all queued messages and return them.\n\t * Useful for restoring to editor when user aborts.\n\t * @returns Object with steering, followUp, and meta arrays\n\t */\n\tclearQueue(): { steering: string[]; followUp: string[]; meta: string[] } {\n\t\tconst steering = [...this._steeringMessages];\n\t\tconst followUp = [...this._followUpMessages];\n\t\tconst meta = [...this._metaMessages];\n\t\tthis._steeringMessages = [];\n\t\tthis._followUpMessages = [];\n\t\tthis._metaMessages = [];\n\t\tthis.agent.clearAllQueues();\n\t\treturn { steering, followUp, meta };\n\t}\n\n\t/** Number of pending messages (includes steering, follow-up, and meta) */\n\tget pendingMessageCount(): number {\n\t\treturn this._steeringMessages.length + this._followUpMessages.length + this._metaMessages.length;\n\t}\n\n\t/** Get pending steering messages (read-only) */\n\tgetSteeringMessages(): readonly string[] {\n\t\treturn this._steeringMessages;\n\t}\n\n\t/** Get pending follow-up messages (read-only) */\n\tgetFollowUpMessages(): readonly string[] {\n\t\treturn this._followUpMessages;\n\t}\n\n\t/** Get pending meta messages (read-only). */\n\tgetMetaMessages(): readonly string[] {\n\t\treturn this._metaMessages;\n\t}\n\n\t/** Number of meta updates already applied into the run. */\n\tget metaAppliedStep(): number {\n\t\treturn this._metaAppliedStep;\n\t}\n\n\tget resourceLoader(): ResourceLoader {\n\t\treturn this._resourceLoader;\n\t}\n\n\tasync notifyStopHooks(reason: string): Promise<void> {\n\t\tconst notices = applyStopHooks(this._hooksConfig, reason);\n\t\tif (notices.length === 0) return;\n\t\tthis._queueHookNotices(\"Stop\", notices);\n\t\tif (!this.isStreaming) {\n\t\t\tthis._flushHookNotices();\n\t\t}\n\t}\n\n\t/**\n\t * Abort current operation and wait for agent to become idle.\n\t */\n\tasync abort(): Promise<void> {\n\t\tawait this.notifyStopHooks(\"abort\");\n\t\tthis.abortRetry();\n\t\tthis.agent.abort();\n\t\tawait this.agent.waitForIdle();\n\t}\n\n\t/**\n\t * Start a new session, optionally with initial messages and parent tracking.\n\t * Clears all messages and starts a new session.\n\t * Listeners are preserved and will continue receiving events.\n\t * @param options.parentSession - Optional parent session path for tracking\n\t * @param options.setup - Optional callback to initialize session (e.g., append messages)\n\t * @returns true if completed, false if cancelled by extension\n\t */\n\tasync newSession(options?: {\n\t\tparentSession?: string;\n\t\tsetup?: (sessionManager: SessionManager) => Promise<void>;\n\t}): Promise<boolean> {\n\t\tconst previousSessionFile = this.sessionFile;\n\t\tthis._appendSessionTrace({\n\t\t\ttype: \"session_new_start\",\n\t\t\tpreviousSessionFile: previousSessionFile ?? null,\n\t\t\tparentSession: options?.parentSession ?? null,\n\t\t});\n\n\t\t// Emit session_before_switch event with reason \"new\" (can be cancelled)\n\t\tif (this._extensionRunner?.hasHandlers(\"session_before_switch\")) {\n\t\t\tconst result = (await this._extensionRunner.emit({\n\t\t\t\ttype: \"session_before_switch\",\n\t\t\t\treason: \"new\",\n\t\t\t})) as SessionBeforeSwitchResult | undefined;\n\n\t\t\tif (result?.cancel) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tthis._disconnectFromAgent();\n\t\tawait this.abort();\n\t\tthis.agent.reset();\n\t\tthis.sessionManager.newSession({ parentSession: options?.parentSession });\n\t\tthis.agent.sessionId = this.sessionManager.getSessionId();\n\t\t\tthis._refreshSessionTracePath(\"new_session\");\n\t\t\tthis._steeringMessages = [];\n\t\t\tthis._followUpMessages = [];\n\t\t\tthis._metaMessages = [];\n\t\t\tthis._metaAppliedStep = 0;\n\t\t\tthis._pendingNextTurnMessages = [];\n\n\t\tthis.sessionManager.appendThinkingLevelChange(this.thinkingLevel);\n\n\t\t// Run setup callback if provided (e.g., to append initial messages)\n\t\tif (options?.setup) {\n\t\t\tawait options.setup(this.sessionManager);\n\t\t\t// Sync agent state with session manager after setup\n\t\t\tconst sessionContext = this.sessionManager.buildSessionContext();\n\t\t\tthis.agent.replaceMessages(sessionContext.messages);\n\t\t}\n\n\t\tthis._reconnectToAgent();\n\n\t\t// Emit session_switch event with reason \"new\" to extensions\n\t\tif (this._extensionRunner) {\n\t\t\tawait this._extensionRunner.emit({\n\t\t\t\ttype: \"session_switch\",\n\t\t\t\treason: \"new\",\n\t\t\t\tpreviousSessionFile,\n\t\t\t});\n\t\t}\n\n\t\t// Emit session event to custom tools\n\t\tthis._appendSessionTrace({\n\t\t\ttype: \"session_new_complete\",\n\t\t\tsessionId: this.sessionManager.getSessionId(),\n\t\t\tsessionFile: this.sessionFile ?? null,\n\t\t});\n\t\treturn true;\n\t}\n\n\t// =========================================================================\n\t// Model Management\n\t// =========================================================================\n\n\tprivate async _emitModelSelect(\n\t\tnextModel: Model<any>,\n\t\tpreviousModel: Model<any> | undefined,\n\t\tsource: \"set\" | \"cycle\" | \"restore\",\n\t): Promise<void> {\n\t\tif (!this._extensionRunner) return;\n\t\tif (modelsAreEqual(previousModel, nextModel)) return;\n\t\tawait this._extensionRunner.emit({\n\t\t\ttype: \"model_select\",\n\t\t\tmodel: nextModel,\n\t\t\tpreviousModel,\n\t\t\tsource,\n\t\t});\n\t}\n\n\t/**\n\t * Set model directly.\n\t * Validates API key, saves to session and settings.\n\t * @throws Error if no API key available for the model\n\t */\n\tasync setModel(model: Model<any>): Promise<void> {\n\t\tconst apiKey = await this._modelRegistry.getApiKey(model);\n\t\tif (!apiKey) {\n\t\t\tthrow new Error(`No API key for ${model.provider}/${model.id}`);\n\t\t}\n\n\t\tconst previousModel = this.model;\n\t\tthis.agent.setModel(model);\n\t\tthis.sessionManager.appendModelChange(model.provider, model.id);\n\t\tthis.settingsManager.setDefaultModelAndProvider(model.provider, model.id);\n\t\tthis._appendSessionTrace({\n\t\t\ttype: \"model_set\",\n\t\t\tprovider: model.provider,\n\t\t\tmodelId: model.id,\n\t\t});\n\n\t\t// Re-clamp thinking level for new model's capabilities\n\t\tthis.setThinkingLevel(this.thinkingLevel);\n\n\t\tawait this._emitModelSelect(model, previousModel, \"set\");\n\t}\n\n\t/**\n\t * Cycle to next/previous model.\n\t * Uses scoped models (from --models flag) if available, otherwise all available models.\n\t * @param direction - \"forward\" (default) or \"backward\"\n\t * @returns The new model info, or undefined if only one model available\n\t */\n\tasync cycleModel(direction: \"forward\" | \"backward\" = \"forward\"): Promise<ModelCycleResult | undefined> {\n\t\tif (this._scopedModels.length > 0) {\n\t\t\treturn this._cycleScopedModel(direction);\n\t\t}\n\t\treturn this._cycleAvailableModel(direction);\n\t}\n\n\tprivate async _getScopedModelsWithApiKey(): Promise<Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>> {\n\t\tconst apiKeysByProvider = new Map<string, string | undefined>();\n\t\tconst result: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }> = [];\n\n\t\tfor (const scoped of this._scopedModels) {\n\t\t\tconst provider = scoped.model.provider;\n\t\t\tlet apiKey: string | undefined;\n\t\t\tif (apiKeysByProvider.has(provider)) {\n\t\t\t\tapiKey = apiKeysByProvider.get(provider);\n\t\t\t} else {\n\t\t\t\tapiKey = await this._modelRegistry.getApiKeyForProvider(provider);\n\t\t\t\tapiKeysByProvider.set(provider, apiKey);\n\t\t\t}\n\n\t\t\tif (apiKey) {\n\t\t\t\tresult.push(scoped);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tprivate async _cycleScopedModel(direction: \"forward\" | \"backward\"): Promise<ModelCycleResult | undefined> {\n\t\tconst scopedModels = await this._getScopedModelsWithApiKey();\n\t\tif (scopedModels.length <= 1) return undefined;\n\n\t\tconst currentModel = this.model;\n\t\tlet currentIndex = scopedModels.findIndex((sm) => modelsAreEqual(sm.model, currentModel));\n\n\t\tif (currentIndex === -1) currentIndex = 0;\n\t\tconst len = scopedModels.length;\n\t\tconst nextIndex = direction === \"forward\" ? (currentIndex + 1) % len : (currentIndex - 1 + len) % len;\n\t\tconst next = scopedModels[nextIndex];\n\n\t\t// Apply model\n\t\tthis.agent.setModel(next.model);\n\t\tthis.sessionManager.appendModelChange(next.model.provider, next.model.id);\n\t\tthis.settingsManager.setDefaultModelAndProvider(next.model.provider, next.model.id);\n\n\t\t// Apply thinking level.\n\t\t// - Explicit scoped model thinking level overrides current session level\n\t\t// - Undefined scoped model thinking level inherits current session level\n\t\t// setThinkingLevel clamps to model capabilities.\n\t\tthis.setThinkingLevel(next.thinkingLevel ?? this.thinkingLevel);\n\n\t\tawait this._emitModelSelect(next.model, currentModel, \"cycle\");\n\n\t\treturn { model: next.model, thinkingLevel: this.thinkingLevel, isScoped: true };\n\t}\n\n\tprivate async _cycleAvailableModel(direction: \"forward\" | \"backward\"): Promise<ModelCycleResult | undefined> {\n\t\tconst availableModels = await this._modelRegistry.getAvailable();\n\t\tif (availableModels.length <= 1) return undefined;\n\n\t\tconst currentModel = this.model;\n\t\tlet currentIndex = availableModels.findIndex((m) => modelsAreEqual(m, currentModel));\n\n\t\tif (currentIndex === -1) currentIndex = 0;\n\t\tconst len = availableModels.length;\n\t\tconst nextIndex = direction === \"forward\" ? (currentIndex + 1) % len : (currentIndex - 1 + len) % len;\n\t\tconst nextModel = availableModels[nextIndex];\n\n\t\tconst apiKey = await this._modelRegistry.getApiKey(nextModel);\n\t\tif (!apiKey) {\n\t\t\tthrow new Error(`No API key for ${nextModel.provider}/${nextModel.id}`);\n\t\t}\n\n\t\tthis.agent.setModel(nextModel);\n\t\tthis.sessionManager.appendModelChange(nextModel.provider, nextModel.id);\n\t\tthis.settingsManager.setDefaultModelAndProvider(nextModel.provider, nextModel.id);\n\n\t\t// Re-clamp thinking level for new model's capabilities\n\t\tthis.setThinkingLevel(this.thinkingLevel);\n\n\t\tawait this._emitModelSelect(nextModel, currentModel, \"cycle\");\n\n\t\treturn { model: nextModel, thinkingLevel: this.thinkingLevel, isScoped: false };\n\t}\n\n\t// =========================================================================\n\t// Thinking Level Management\n\t// =========================================================================\n\n\t/**\n\t * Set thinking level.\n\t * Clamps to model capabilities based on available thinking levels.\n\t * Saves to session and settings only if the level actually changes.\n\t */\n\tsetThinkingLevel(level: ThinkingLevel): void {\n\t\tconst availableLevels = this.getAvailableThinkingLevels();\n\t\tconst effectiveLevel = availableLevels.includes(level) ? level : this._clampThinkingLevel(level, availableLevels);\n\t\tconst previousLevel = this.agent.state.thinkingLevel;\n\n\t\t// Only persist if actually changing\n\t\tconst isChanging = effectiveLevel !== this.agent.state.thinkingLevel;\n\n\t\tthis.agent.setThinkingLevel(effectiveLevel);\n\n\t\tif (isChanging) {\n\t\t\tthis.sessionManager.appendThinkingLevelChange(effectiveLevel);\n\t\t\tthis.settingsManager.setDefaultThinkingLevel(effectiveLevel);\n\t\t\tthis._appendSessionTrace({\n\t\t\t\ttype: \"thinking_level_set\",\n\t\t\t\trequested: level,\n\t\t\t\teffective: effectiveLevel,\n\t\t\t});\n\t\t\tthis._emitConfigChange({\n\t\t\t\tkey: \"thinking_level\",\n\t\t\t\tprevious: previousLevel,\n\t\t\t\tcurrent: effectiveLevel,\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Cycle to next thinking level.\n\t * @returns New level, or undefined if model doesn't support thinking\n\t */\n\tcycleThinkingLevel(): ThinkingLevel | undefined {\n\t\tif (!this.supportsThinking()) return undefined;\n\n\t\tconst levels = this.getAvailableThinkingLevels();\n\t\tconst currentIndex = levels.indexOf(this.thinkingLevel);\n\t\tconst nextIndex = (currentIndex + 1) % levels.length;\n\t\tconst nextLevel = levels[nextIndex];\n\n\t\tthis.setThinkingLevel(nextLevel);\n\t\treturn nextLevel;\n\t}\n\n\t/**\n\t * Get available thinking levels for current model.\n\t * The provider will clamp to what the specific model supports internally.\n\t */\n\tgetAvailableThinkingLevels(): ThinkingLevel[] {\n\t\tif (!this.supportsThinking()) return [\"off\"];\n\t\treturn this.supportsXhighThinking() ? THINKING_LEVELS_WITH_XHIGH : THINKING_LEVELS;\n\t}\n\n\t/**\n\t * Check if current model supports xhigh thinking level.\n\t */\n\tsupportsXhighThinking(): boolean {\n\t\treturn this.model ? supportsXhigh(this.model) : false;\n\t}\n\n\t/**\n\t * Check if current model supports thinking/reasoning.\n\t */\n\tsupportsThinking(): boolean {\n\t\treturn !!this.model?.reasoning;\n\t}\n\n\tprivate _clampThinkingLevel(level: ThinkingLevel, availableLevels: ThinkingLevel[]): ThinkingLevel {\n\t\tconst ordered = THINKING_LEVELS_WITH_XHIGH;\n\t\tconst available = new Set(availableLevels);\n\t\tconst requestedIndex = ordered.indexOf(level);\n\t\tif (requestedIndex === -1) {\n\t\t\treturn availableLevels[0] ?? \"off\";\n\t\t}\n\t\tfor (let i = requestedIndex; i < ordered.length; i++) {\n\t\t\tconst candidate = ordered[i];\n\t\t\tif (available.has(candidate)) return candidate;\n\t\t}\n\t\tfor (let i = requestedIndex - 1; i >= 0; i--) {\n\t\t\tconst candidate = ordered[i];\n\t\t\tif (available.has(candidate)) return candidate;\n\t\t}\n\t\treturn availableLevels[0] ?? \"off\";\n\t}\n\n\t// =========================================================================\n\t// Queue Mode Management\n\t// =========================================================================\n\n\t/**\n\t * Set steering message mode.\n\t * Saves to settings.\n\t */\n\tsetSteeringMode(mode: \"all\" | \"one-at-a-time\"): void {\n\t\tconst previous = this.agent.getSteeringMode();\n\t\tthis.agent.setSteeringMode(mode);\n\t\tthis.settingsManager.setSteeringMode(mode);\n\t\tif (previous !== mode) {\n\t\t\tthis._emitConfigChange({\n\t\t\t\tkey: \"steering_mode\",\n\t\t\t\tprevious,\n\t\t\t\tcurrent: mode,\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Set follow-up message mode.\n\t * Saves to settings.\n\t */\n\tsetFollowUpMode(mode: \"all\" | \"one-at-a-time\"): void {\n\t\tconst previous = this.agent.getFollowUpMode();\n\t\tthis.agent.setFollowUpMode(mode);\n\t\tthis.settingsManager.setFollowUpMode(mode);\n\t\tif (previous !== mode) {\n\t\t\tthis._emitConfigChange({\n\t\t\t\tkey: \"followup_mode\",\n\t\t\t\tprevious,\n\t\t\t\tcurrent: mode,\n\t\t\t});\n\t\t}\n\t}\n\n\t/** Default behavior for Enter while streaming in interactive mode. */\n\tget streamInputMode(): \"steer\" | \"followUp\" | \"meta\" {\n\t\treturn this.settingsManager.getStreamInputMode();\n\t}\n\n\tsetStreamInputMode(mode: \"steer\" | \"followUp\" | \"meta\"): void {\n\t\tconst previous = this.settingsManager.getStreamInputMode();\n\t\tthis.settingsManager.setStreamInputMode(mode);\n\t\tif (previous !== mode) {\n\t\t\tthis._emitConfigChange({\n\t\t\t\tkey: \"stream_input_mode\",\n\t\t\t\tprevious,\n\t\t\t\tcurrent: mode,\n\t\t\t});\n\t\t}\n\t}\n\n\t// =========================================================================\n\t// Compaction\n\t// =========================================================================\n\n\t/**\n\t * Manually compact the session context.\n\t * Aborts current agent operation first.\n\t * @param customInstructions Optional instructions for the compaction summary\n\t */\n\tasync compact(customInstructions?: string): Promise<CompactionResult> {\n\t\tthis._disconnectFromAgent();\n\t\tawait this.abort();\n\t\tthis._compactionAbortController = new AbortController();\n\n\t\ttry {\n\t\t\tif (!this.model) {\n\t\t\t\tthrow new Error(\"No model selected\");\n\t\t\t}\n\n\t\t\tconst apiKey = await this._modelRegistry.getApiKey(this.model);\n\t\t\tif (!apiKey) {\n\t\t\t\tthrow new Error(`No API key for ${this.model.provider}`);\n\t\t\t}\n\n\t\t\tconst pathEntries = this.sessionManager.getBranch();\n\t\t\tconst settings = this.settingsManager.getCompactionSettings();\n\n\t\t\tconst preparation = prepareCompaction(pathEntries, settings);\n\t\t\tif (!preparation) {\n\t\t\t\t// Check why we can't compact\n\t\t\t\tconst lastEntry = pathEntries[pathEntries.length - 1];\n\t\t\t\tif (lastEntry?.type === \"compaction\") {\n\t\t\t\t\tthrow new Error(\"Already compacted\");\n\t\t\t\t}\n\t\t\t\tthrow new Error(\"Nothing to compact (session too small)\");\n\t\t\t}\n\n\t\t\tlet extensionCompaction: CompactionResult | undefined;\n\t\t\tlet fromExtension = false;\n\n\t\t\tif (this._extensionRunner?.hasHandlers(\"session_before_compact\")) {\n\t\t\t\tconst result = (await this._extensionRunner.emit({\n\t\t\t\t\ttype: \"session_before_compact\",\n\t\t\t\t\tpreparation,\n\t\t\t\t\tbranchEntries: pathEntries,\n\t\t\t\t\tcustomInstructions,\n\t\t\t\t\tsignal: this._compactionAbortController.signal,\n\t\t\t\t})) as SessionBeforeCompactResult | undefined;\n\n\t\t\t\tif (result?.cancel) {\n\t\t\t\t\tthrow new Error(\"Compaction cancelled\");\n\t\t\t\t}\n\n\t\t\t\tif (result?.compaction) {\n\t\t\t\t\textensionCompaction = result.compaction;\n\t\t\t\t\tfromExtension = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet summary: string;\n\t\t\tlet firstKeptEntryId: string;\n\t\t\tlet tokensBefore: number;\n\t\t\tlet details: unknown;\n\n\t\t\tif (extensionCompaction) {\n\t\t\t\t// Extension provided compaction content\n\t\t\t\tsummary = extensionCompaction.summary;\n\t\t\t\tfirstKeptEntryId = extensionCompaction.firstKeptEntryId;\n\t\t\t\ttokensBefore = extensionCompaction.tokensBefore;\n\t\t\t\tdetails = extensionCompaction.details;\n\t\t\t} else {\n\t\t\t\t// Generate compaction result\n\t\t\t\tconst result = await compact(\n\t\t\t\t\tpreparation,\n\t\t\t\t\tthis.model,\n\t\t\t\t\tapiKey,\n\t\t\t\t\tcustomInstructions,\n\t\t\t\t\tthis._compactionAbortController.signal,\n\t\t\t\t);\n\t\t\t\tsummary = result.summary;\n\t\t\t\tfirstKeptEntryId = result.firstKeptEntryId;\n\t\t\t\ttokensBefore = result.tokensBefore;\n\t\t\t\tdetails = result.details;\n\t\t\t}\n\n\t\t\tif (this._compactionAbortController.signal.aborted) {\n\t\t\t\tthrow new Error(\"Compaction cancelled\");\n\t\t\t}\n\n\t\t\tthis.sessionManager.appendCompaction(summary, firstKeptEntryId, tokensBefore, details, fromExtension);\n\t\t\tconst newEntries = this.sessionManager.getEntries();\n\t\t\tconst sessionContext = this.sessionManager.buildSessionContext();\n\t\t\tthis.agent.replaceMessages(sessionContext.messages);\n\n\t\t\t// Get the saved compaction entry for the extension event\n\t\t\tconst savedCompactionEntry = newEntries.find((e) => e.type === \"compaction\" && e.summary === summary) as\n\t\t\t\t| CompactionEntry\n\t\t\t\t| undefined;\n\n\t\t\tif (this._extensionRunner && savedCompactionEntry) {\n\t\t\t\tawait this._extensionRunner.emit({\n\t\t\t\t\ttype: \"session_compact\",\n\t\t\t\t\tcompactionEntry: savedCompactionEntry,\n\t\t\t\t\tfromExtension,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tsummary,\n\t\t\t\tfirstKeptEntryId,\n\t\t\t\ttokensBefore,\n\t\t\t\tdetails,\n\t\t\t};\n\t\t} finally {\n\t\t\tthis._compactionAbortController = undefined;\n\t\t\tthis._reconnectToAgent();\n\t\t}\n\t}\n\n\t/**\n\t * Cancel in-progress compaction (manual or auto).\n\t */\n\tabortCompaction(): void {\n\t\tthis._compactionAbortController?.abort();\n\t\tthis._autoCompactionAbortController?.abort();\n\t}\n\n\t/**\n\t * Cancel in-progress branch summarization.\n\t */\n\tabortBranchSummary(): void {\n\t\tthis._branchSummaryAbortController?.abort();\n\t}\n\n\t/**\n\t * Check if compaction is needed and run it.\n\t * Called after agent_end and before prompt submission.\n\t *\n\t * Two cases:\n\t * 1. Overflow: LLM returned context overflow error, remove error message from agent state, compact, auto-retry\n\t * 2. Threshold: Context over threshold, compact, NO auto-retry (user continues manually)\n\t *\n\t * @param assistantMessage The assistant message to check\n\t * @param skipAbortedCheck If false, include aborted messages (for pre-prompt check). Default: true\n\t */\n\tprivate async _checkCompaction(assistantMessage: AssistantMessage, skipAbortedCheck = true): Promise<void> {\n\t\tconst settings = this.settingsManager.getCompactionSettings();\n\t\tif (!settings.enabled) return;\n\n\t\t// Skip if message was aborted (user cancelled) - unless skipAbortedCheck is false\n\t\tif (skipAbortedCheck && assistantMessage.stopReason === \"aborted\") return;\n\n\t\tconst contextWindow = this.model?.contextWindow ?? 0;\n\n\t\t// Skip overflow check if the message came from a different model.\n\t\t// This handles the case where user switched from a smaller-context model (e.g. opus)\n\t\t// to a larger-context model (e.g. codex) - the overflow error from the old model\n\t\t// shouldn't trigger compaction for the new model.\n\t\tconst sameModel =\n\t\t\tthis.model && assistantMessage.provider === this.model.provider && assistantMessage.model === this.model.id;\n\n\t\t// Skip overflow check if the error is from before a compaction in the current path.\n\t\t// This handles the case where an error was kept after compaction (in the \"kept\" region).\n\t\t// The error shouldn't trigger another compaction since we already compacted.\n\t\t// Example: opus fails → switch to codex → compact → switch back to opus → opus error\n\t\t// is still in context but shouldn't trigger compaction again.\n\t\tconst compactionEntry = getLatestCompactionEntry(this.sessionManager.getBranch());\n\t\tconst errorIsFromBeforeCompaction =\n\t\t\tcompactionEntry !== null && assistantMessage.timestamp < new Date(compactionEntry.timestamp).getTime();\n\n\t\t// Case 1: Overflow - LLM returned context overflow error\n\t\tif (sameModel && !errorIsFromBeforeCompaction && isContextOverflow(assistantMessage, contextWindow)) {\n\t\t\tif (this._overflowRecoveryAttempted) {\n\t\t\t\tthis._emit({\n\t\t\t\t\ttype: \"auto_compaction_end\",\n\t\t\t\t\tresult: undefined,\n\t\t\t\t\taborted: false,\n\t\t\t\t\twillRetry: false,\n\t\t\t\t\terrorMessage:\n\t\t\t\t\t\t\"Context overflow recovery failed after one compact-and-retry attempt. Try reducing context or switching to a larger-context model.\",\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._overflowRecoveryAttempted = true;\n\t\t\t// Remove the error message from agent state (it IS saved to session for history,\n\t\t\t// but we don't want it in context for the retry)\n\t\t\tconst messages = this.agent.state.messages;\n\t\t\tif (messages.length > 0 && messages[messages.length - 1].role === \"assistant\") {\n\t\t\t\tthis.agent.replaceMessages(messages.slice(0, -1));\n\t\t\t}\n\t\t\tawait this._runAutoCompaction(\"overflow\", true);\n\t\t\treturn;\n\t\t}\n\n\t\t// Case 2: Threshold - turn succeeded but context is getting large\n\t\t// Skip if this was an error (non-overflow errors don't have usage data)\n\t\tif (assistantMessage.stopReason === \"error\") return;\n\n\t\tconst contextTokens = calculateContextTokens(assistantMessage.usage);\n\t\tif (shouldCompact(contextTokens, contextWindow, settings)) {\n\t\t\tawait this._runAutoCompaction(\"threshold\", false);\n\t\t}\n\t}\n\n\t/**\n\t * Internal: Run auto-compaction with events.\n\t */\n\tprivate async _runAutoCompaction(reason: \"overflow\" | \"threshold\", willRetry: boolean): Promise<void> {\n\t\tconst settings = this.settingsManager.getCompactionSettings();\n\n\t\tthis._emit({ type: \"auto_compaction_start\", reason });\n\t\tthis._autoCompactionAbortController = new AbortController();\n\n\t\ttry {\n\t\t\tif (!this.model) {\n\t\t\t\tthis._emit({ type: \"auto_compaction_end\", result: undefined, aborted: false, willRetry: false });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst apiKey = await this._modelRegistry.getApiKey(this.model);\n\t\t\tif (!apiKey) {\n\t\t\t\tthis._emit({ type: \"auto_compaction_end\", result: undefined, aborted: false, willRetry: false });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst pathEntries = this.sessionManager.getBranch();\n\n\t\t\tconst preparation = prepareCompaction(pathEntries, settings);\n\t\t\tif (!preparation) {\n\t\t\t\tthis._emit({ type: \"auto_compaction_end\", result: undefined, aborted: false, willRetry: false });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet extensionCompaction: CompactionResult | undefined;\n\t\t\tlet fromExtension = false;\n\n\t\t\tif (this._extensionRunner?.hasHandlers(\"session_before_compact\")) {\n\t\t\t\tconst extensionResult = (await this._extensionRunner.emit({\n\t\t\t\t\ttype: \"session_before_compact\",\n\t\t\t\t\tpreparation,\n\t\t\t\t\tbranchEntries: pathEntries,\n\t\t\t\t\tcustomInstructions: undefined,\n\t\t\t\t\tsignal: this._autoCompactionAbortController.signal,\n\t\t\t\t})) as SessionBeforeCompactResult | undefined;\n\n\t\t\t\tif (extensionResult?.cancel) {\n\t\t\t\t\tthis._emit({ type: \"auto_compaction_end\", result: undefined, aborted: true, willRetry: false });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (extensionResult?.compaction) {\n\t\t\t\t\textensionCompaction = extensionResult.compaction;\n\t\t\t\t\tfromExtension = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet summary: string;\n\t\t\tlet firstKeptEntryId: string;\n\t\t\tlet tokensBefore: number;\n\t\t\tlet details: unknown;\n\n\t\t\tif (extensionCompaction) {\n\t\t\t\t// Extension provided compaction content\n\t\t\t\tsummary = extensionCompaction.summary;\n\t\t\t\tfirstKeptEntryId = extensionCompaction.firstKeptEntryId;\n\t\t\t\ttokensBefore = extensionCompaction.tokensBefore;\n\t\t\t\tdetails = extensionCompaction.details;\n\t\t\t} else {\n\t\t\t\t// Generate compaction result\n\t\t\t\tconst compactResult = await compact(\n\t\t\t\t\tpreparation,\n\t\t\t\t\tthis.model,\n\t\t\t\t\tapiKey,\n\t\t\t\t\tundefined,\n\t\t\t\t\tthis._autoCompactionAbortController.signal,\n\t\t\t\t);\n\t\t\t\tsummary = compactResult.summary;\n\t\t\t\tfirstKeptEntryId = compactResult.firstKeptEntryId;\n\t\t\t\ttokensBefore = compactResult.tokensBefore;\n\t\t\t\tdetails = compactResult.details;\n\t\t\t}\n\n\t\t\tif (this._autoCompactionAbortController.signal.aborted) {\n\t\t\t\tthis._emit({ type: \"auto_compaction_end\", result: undefined, aborted: true, willRetry: false });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.sessionManager.appendCompaction(summary, firstKeptEntryId, tokensBefore, details, fromExtension);\n\t\t\tconst newEntries = this.sessionManager.getEntries();\n\t\t\tconst sessionContext = this.sessionManager.buildSessionContext();\n\t\t\tthis.agent.replaceMessages(sessionContext.messages);\n\n\t\t\t// Get the saved compaction entry for the extension event\n\t\t\tconst savedCompactionEntry = newEntries.find((e) => e.type === \"compaction\" && e.summary === summary) as\n\t\t\t\t| CompactionEntry\n\t\t\t\t| undefined;\n\n\t\t\tif (this._extensionRunner && savedCompactionEntry) {\n\t\t\t\tawait this._extensionRunner.emit({\n\t\t\t\t\ttype: \"session_compact\",\n\t\t\t\t\tcompactionEntry: savedCompactionEntry,\n\t\t\t\t\tfromExtension,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst result: CompactionResult = {\n\t\t\t\tsummary,\n\t\t\t\tfirstKeptEntryId,\n\t\t\t\ttokensBefore,\n\t\t\t\tdetails,\n\t\t\t};\n\t\t\tthis._emit({ type: \"auto_compaction_end\", result, aborted: false, willRetry });\n\n\t\t\tif (willRetry) {\n\t\t\t\tconst messages = this.agent.state.messages;\n\t\t\t\tconst lastMsg = messages[messages.length - 1];\n\t\t\t\tif (lastMsg?.role === \"assistant\" && (lastMsg as AssistantMessage).stopReason === \"error\") {\n\t\t\t\t\tthis.agent.replaceMessages(messages.slice(0, -1));\n\t\t\t\t}\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.agent.continue().catch(() => {});\n\t\t\t\t}, 100);\n\t\t\t} else if (this.agent.hasQueuedMessages()) {\n\t\t\t\t// Auto-compaction can complete while follow-up/steering/custom messages are waiting.\n\t\t\t\t// Kick the loop so queued messages are actually delivered.\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.agent.continue().catch(() => {});\n\t\t\t\t}, 100);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconst errorMessage = error instanceof Error ? error.message : \"compaction failed\";\n\t\t\tthis._emit({\n\t\t\t\ttype: \"auto_compaction_end\",\n\t\t\t\tresult: undefined,\n\t\t\t\taborted: false,\n\t\t\t\twillRetry: false,\n\t\t\t\terrorMessage:\n\t\t\t\t\treason === \"overflow\"\n\t\t\t\t\t\t? `Context overflow recovery failed: ${errorMessage}`\n\t\t\t\t\t\t: `Auto-compaction failed: ${errorMessage}`,\n\t\t\t});\n\t\t} finally {\n\t\t\tthis._autoCompactionAbortController = undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Toggle auto-compaction setting.\n\t */\n\tsetAutoCompactionEnabled(enabled: boolean): void {\n\t\tconst previous = this.settingsManager.getCompactionEnabled();\n\t\tthis.settingsManager.setCompactionEnabled(enabled);\n\t\tif (previous !== enabled) {\n\t\t\tthis._emitConfigChange({\n\t\t\t\tkey: \"auto_compaction_enabled\",\n\t\t\t\tprevious,\n\t\t\t\tcurrent: enabled,\n\t\t\t});\n\t\t}\n\t}\n\n\t/** Whether auto-compaction is enabled */\n\tget autoCompactionEnabled(): boolean {\n\t\treturn this.settingsManager.getCompactionEnabled();\n\t}\n\n\tasync bindExtensions(bindings: ExtensionBindings): Promise<void> {\n\t\tif (bindings.uiContext !== undefined) {\n\t\t\tthis._extensionUIContext = bindings.uiContext;\n\t\t}\n\t\tif (bindings.commandContextActions !== undefined) {\n\t\t\tthis._extensionCommandContextActions = bindings.commandContextActions;\n\t\t}\n\t\tif (bindings.shutdownHandler !== undefined) {\n\t\t\tthis._extensionShutdownHandler = bindings.shutdownHandler;\n\t\t}\n\t\tif (bindings.onError !== undefined) {\n\t\t\tthis._extensionErrorListener = bindings.onError;\n\t\t}\n\n\t\tif (this._extensionRunner) {\n\t\t\tthis._applyExtensionBindings(this._extensionRunner);\n\t\t\tawait this._extensionRunner.emit({ type: \"session_start\" });\n\t\t\tawait this.extendResourcesFromExtensions(\"startup\");\n\t\t}\n\t}\n\n\tprivate async extendResourcesFromExtensions(reason: \"startup\" | \"reload\"): Promise<void> {\n\t\tif (!this._extensionRunner?.hasHandlers(\"resources_discover\")) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst { skillPaths, promptPaths, themePaths } = await this._extensionRunner.emitResourcesDiscover(\n\t\t\tthis._cwd,\n\t\t\treason,\n\t\t);\n\n\t\tif (skillPaths.length === 0 && promptPaths.length === 0 && themePaths.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst extensionPaths: ResourceExtensionPaths = {\n\t\t\tskillPaths: this.buildExtensionResourcePaths(skillPaths),\n\t\t\tpromptPaths: this.buildExtensionResourcePaths(promptPaths),\n\t\t\tthemePaths: this.buildExtensionResourcePaths(themePaths),\n\t\t};\n\n\t\tthis._resourceLoader.extendResources(extensionPaths);\n\t\tthis._baseSystemPrompt = this._rebuildSystemPrompt(this.getActiveToolNames());\n\t\tthis.agent.setSystemPrompt(this._baseSystemPrompt);\n\t}\n\n\tprivate buildExtensionResourcePaths(entries: Array<{ path: string; extensionPath: string }>): Array<{\n\t\tpath: string;\n\t\tmetadata: { source: string; scope: \"temporary\"; origin: \"top-level\"; baseDir?: string };\n\t}> {\n\t\treturn entries.map((entry) => {\n\t\t\tconst source = this.getExtensionSourceLabel(entry.extensionPath);\n\t\t\tconst baseDir = entry.extensionPath.startsWith(\"<\") ? undefined : dirname(entry.extensionPath);\n\t\t\treturn {\n\t\t\t\tpath: entry.path,\n\t\t\t\tmetadata: {\n\t\t\t\t\tsource,\n\t\t\t\t\tscope: \"temporary\",\n\t\t\t\t\torigin: \"top-level\",\n\t\t\t\t\tbaseDir,\n\t\t\t\t},\n\t\t\t};\n\t\t});\n\t}\n\n\tprivate getExtensionSourceLabel(extensionPath: string): string {\n\t\tif (extensionPath.startsWith(\"<\")) {\n\t\t\treturn `extension:${extensionPath.replace(/[<>]/g, \"\")}`;\n\t\t}\n\t\tconst base = basename(extensionPath);\n\t\tconst name = base.replace(/\\.(ts|js)$/, \"\");\n\t\treturn `extension:${name}`;\n\t}\n\n\tprivate _applyExtensionBindings(runner: ExtensionRunner): void {\n\t\trunner.setUIContext(this._extensionUIContext);\n\t\trunner.bindCommandContext(this._extensionCommandContextActions);\n\n\t\tthis._extensionErrorUnsubscriber?.();\n\t\tthis._extensionErrorUnsubscriber = this._extensionErrorListener\n\t\t\t? runner.onError(this._extensionErrorListener)\n\t\t\t: undefined;\n\t}\n\n\tprivate _bindExtensionCore(runner: ExtensionRunner): void {\n\t\tconst normalizeLocation = (source: string): SlashCommandLocation | undefined => {\n\t\t\tif (source === \"user\" || source === \"project\" || source === \"path\") {\n\t\t\t\treturn source;\n\t\t\t}\n\t\t\treturn undefined;\n\t\t};\n\n\t\tconst reservedBuiltins = new Set(BUILTIN_SLASH_COMMANDS.map((command) => command.name));\n\n\t\tconst getCommands = (): SlashCommandInfo[] => {\n\t\t\tconst extensionCommands: SlashCommandInfo[] = runner\n\t\t\t\t.getRegisteredCommandsWithPaths()\n\t\t\t\t.filter(({ command }) => !reservedBuiltins.has(command.name))\n\t\t\t\t.map(({ command, extensionPath }) => ({\n\t\t\t\t\tname: command.name,\n\t\t\t\t\tdescription: command.description,\n\t\t\t\t\tsource: \"extension\",\n\t\t\t\t\tpath: extensionPath,\n\t\t\t\t}));\n\n\t\t\tconst templates: SlashCommandInfo[] = this.promptTemplates.map((template) => ({\n\t\t\t\tname: template.name,\n\t\t\t\tdescription: template.description,\n\t\t\t\tsource: \"prompt\",\n\t\t\t\tlocation: normalizeLocation(template.source),\n\t\t\t\tpath: template.filePath,\n\t\t\t}));\n\n\t\t\tconst skills: SlashCommandInfo[] = this._resourceLoader.getSkills().skills.map((skill) => ({\n\t\t\t\tname: `skill:${skill.name}`,\n\t\t\t\tdescription: skill.description,\n\t\t\t\tsource: \"skill\",\n\t\t\t\tlocation: normalizeLocation(skill.source),\n\t\t\t\tpath: skill.filePath,\n\t\t\t}));\n\n\t\t\treturn [...extensionCommands, ...templates, ...skills];\n\t\t};\n\n\t\trunner.bindCore(\n\t\t\t{\n\t\t\t\tsendMessage: (message, options) => {\n\t\t\t\t\tthis.sendCustomMessage(message, options).catch((err) => {\n\t\t\t\t\t\trunner.emitError({\n\t\t\t\t\t\t\textensionPath: \"<runtime>\",\n\t\t\t\t\t\t\tevent: \"send_message\",\n\t\t\t\t\t\t\terror: err instanceof Error ? err.message : String(err),\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tsendUserMessage: (content, options) => {\n\t\t\t\t\tthis.sendUserMessage(content, options).catch((err) => {\n\t\t\t\t\t\trunner.emitError({\n\t\t\t\t\t\t\textensionPath: \"<runtime>\",\n\t\t\t\t\t\t\tevent: \"send_user_message\",\n\t\t\t\t\t\t\terror: err instanceof Error ? err.message : String(err),\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tappendEntry: (customType, data) => {\n\t\t\t\t\tthis.sessionManager.appendCustomEntry(customType, data);\n\t\t\t\t},\n\t\t\t\tsetSessionName: (name) => {\n\t\t\t\t\tthis.sessionManager.appendSessionInfo(name);\n\t\t\t\t},\n\t\t\t\tgetSessionName: () => {\n\t\t\t\t\treturn this.sessionManager.getSessionName();\n\t\t\t\t},\n\t\t\t\tsetLabel: (entryId, label) => {\n\t\t\t\t\tthis.sessionManager.appendLabelChange(entryId, label);\n\t\t\t\t},\n\t\t\t\tgetActiveTools: () => this.getActiveToolNames(),\n\t\t\t\tgetAllTools: () => this.getAllTools(),\n\t\t\t\tsetActiveTools: (toolNames) => this.setActiveToolsByName(toolNames),\n\t\t\t\trefreshTools: () => this._refreshToolRegistry(),\n\t\t\t\tgetCommands,\n\t\t\t\tsetModel: async (model) => {\n\t\t\t\t\tconst key = await this.modelRegistry.getApiKey(model);\n\t\t\t\t\tif (!key) return false;\n\t\t\t\t\tawait this.setModel(model);\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\t\t\t\tgetThinkingLevel: () => this.thinkingLevel,\n\t\t\t\tsetThinkingLevel: (level) => this.setThinkingLevel(level),\n\t\t\t},\n\t\t\t{\n\t\t\t\tgetModel: () => this.model,\n\t\t\t\tisIdle: () => !this.isStreaming,\n\t\t\t\tabort: () => this.abort(),\n\t\t\t\thasPendingMessages: () => this.pendingMessageCount > 0,\n\t\t\t\tshutdown: () => {\n\t\t\t\t\tthis._extensionShutdownHandler?.();\n\t\t\t\t},\n\t\t\t\tgetContextUsage: () => this.getContextUsage(),\n\t\t\t\tcompact: (options) => {\n\t\t\t\t\tvoid (async () => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst result = await this.compact(options?.customInstructions);\n\t\t\t\t\t\t\toptions?.onComplete?.(result);\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tconst err = error instanceof Error ? error : new Error(String(error));\n\t\t\t\t\t\t\toptions?.onError?.(err);\n\t\t\t\t\t\t}\n\t\t\t\t\t})();\n\t\t\t\t},\n\t\t\t\tgetSystemPrompt: () => this.systemPrompt,\n\t\t\t},\n\t\t);\n\t}\n\n\tprivate _refreshToolRegistry(options?: { activeToolNames?: string[]; includeAllExtensionTools?: boolean }): void {\n\t\tconst previousRegistryNames = new Set(this._toolRegistry.keys());\n\t\tconst previousActiveToolNames = this.getActiveToolNames();\n\t\tconst enforceExtensionToolPermissions = this.settingsManager.getPermissionExtensionToolEnforcement();\n\n\t\tconst registeredTools = this._extensionRunner?.getAllRegisteredTools() ?? [];\n\t\tconst allCustomTools = [\n\t\t\t...registeredTools,\n\t\t\t...this._customTools.map((def) => ({ definition: def, extensionPath: \"<sdk>\" })),\n\t\t];\n\t\tconst requiredPermissionEntries = Object.entries(BUILTIN_TOOL_REQUIRED_PERMISSIONS).map(\n\t\t\t([name, permission]) => [name, permission] as const,\n\t\t);\n\t\tthis._toolRequiredPermissions = new Map(requiredPermissionEntries);\n\t\tfor (const registeredTool of allCustomTools) {\n\t\t\tconst existing = this._toolRequiredPermissions.get(registeredTool.definition.name);\n\t\t\tthis._toolRequiredPermissions.set(\n\t\t\t\tregisteredTool.definition.name,\n\t\t\t\tregisteredTool.definition.requiredPermission ?? existing,\n\t\t\t);\n\t\t}\n\t\tthis._toolPromptSnippets = new Map(\n\t\t\tallCustomTools\n\t\t\t\t.map((registeredTool) => {\n\t\t\t\t\tconst snippet = this._normalizePromptSnippet(\n\t\t\t\t\t\tregisteredTool.definition.promptSnippet ?? registeredTool.definition.description,\n\t\t\t\t\t);\n\t\t\t\t\treturn snippet ? ([registeredTool.definition.name, snippet] as const) : undefined;\n\t\t\t\t})\n\t\t\t\t.filter((entry): entry is readonly [string, string] => entry !== undefined),\n\t\t);\n\t\tthis._toolPromptGuidelines = new Map(\n\t\t\tallCustomTools\n\t\t\t\t.map((registeredTool) => {\n\t\t\t\t\tconst guidelines = this._normalizePromptGuidelines(registeredTool.definition.promptGuidelines);\n\t\t\t\t\treturn guidelines.length > 0 ? ([registeredTool.definition.name, guidelines] as const) : undefined;\n\t\t\t\t})\n\t\t\t\t.filter((entry): entry is readonly [string, string[]] => entry !== undefined),\n\t\t);\n\t\tconst wrappedExtensionTools = this._extensionRunner\n\t\t\t? wrapRegisteredTools(allCustomTools, this._extensionRunner, (registeredTool) => {\n\t\t\t\t\tconst toolSource = registeredTool.extensionPath === \"<sdk>\" ? \"custom\" : \"extension\";\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttoolSource,\n\t\t\t\t\t\tpermissionPolicy: {\n\t\t\t\t\t\t\tenabled: enforceExtensionToolPermissions && toolSource === \"extension\",\n\t\t\t\t\t\t\tguard: async (request) => this._evaluateToolPermission(request),\n\t\t\t\t\t\t\tcreateRequest: ({ toolName, params, requiredPermission, toolSource: source }) => ({\n\t\t\t\t\t\t\t\ttoolName,\n\t\t\t\t\t\t\t\tcwd: this._cwd,\n\t\t\t\t\t\t\t\tinput: params,\n\t\t\t\t\t\t\t\tsummary: `Extension tool ${toolName} ${this._summarizeToolPermissionInput(params)}`,\n\t\t\t\t\t\t\t\trequiredPermission,\n\t\t\t\t\t\t\t\ttoolSource: source,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t})\n\t\t\t: [];\n\n\t\tconst toolRegistry = new Map(this._baseToolRegistry);\n\t\tfor (const tool of wrappedExtensionTools as AgentTool[]) {\n\t\t\ttoolRegistry.set(tool.name, tool);\n\t\t}\n\n\t\tif (this._extensionRunner) {\n\t\t\tconst wrappedAllTools = wrapToolsWithExtensions(Array.from(toolRegistry.values()), this._extensionRunner);\n\t\t\tthis._toolRegistry = new Map(wrappedAllTools.map((tool) => [tool.name, tool]));\n\t\t} else {\n\t\t\tthis._toolRegistry = toolRegistry;\n\t\t}\n\n\t\tconst nextActiveToolNames = options?.activeToolNames\n\t\t\t? [...options.activeToolNames]\n\t\t\t: [...previousActiveToolNames];\n\n\t\tif (options?.includeAllExtensionTools) {\n\t\t\tfor (const tool of wrappedExtensionTools) {\n\t\t\t\tnextActiveToolNames.push(tool.name);\n\t\t\t}\n\t\t} else if (!options?.activeToolNames) {\n\t\t\tfor (const toolName of this._toolRegistry.keys()) {\n\t\t\t\tif (!previousRegistryNames.has(toolName)) {\n\t\t\t\t\tnextActiveToolNames.push(toolName);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.setActiveToolsByName([...new Set(nextActiveToolNames)]);\n\t}\n\n\tprivate _buildRuntime(options: {\n\t\tactiveToolNames?: string[];\n\t\tflagValues?: Map<string, boolean | string>;\n\t\tincludeAllExtensionTools?: boolean;\n\t}): void {\n\t\tconst autoResizeImages = this.settingsManager.getImageAutoResize();\n\t\tconst shellCommandPrefix = this.settingsManager.getShellCommandPrefix();\n\t\tconst baseTools = this._baseToolsOverride\n\t\t\t? this._baseToolsOverride\n\t\t\t\t: createAllTools(this._cwd, {\n\t\t\t\t\tread: { autoResizeImages },\n\t\t\t\t\tbash: {\n\t\t\t\t\t\tcommandPrefix: shellCommandPrefix,\n\t\t\t\t\t\tpermissionGuard: async (request) => this._evaluateToolPermission(request),\n\t\t\t\t\t},\n\t\t\t\t\tedit: {\n\t\t\t\t\t\tpermissionGuard: async (request) => this._evaluateToolPermission(request),\n\t\t\t\t\t},\n\t\t\t\t\twrite: {\n\t\t\t\t\t\tpermissionGuard: async (request) => this._evaluateToolPermission(request),\n\t\t\t\t\t},\n\t\t\t\t\tsemantic: {\n\t\t\t\t\t\tauthStorage: this._modelRegistry.authStorage,\n\t\t\t\t\t},\n\t\t\t\t\tfetch: {\n\t\t\t\t\t\tresolveAllowedMethods: () => getAllowedFetchMethodsForProfile(this._profileName),\n\t\t\t\t\t\tpermissionGuard: async (request) => this._evaluateToolPermission(request),\n\t\t\t\t\t},\n\t\t\t\t\twebSearch: {\n\t\t\t\t\t\tresolveRuntimeConfig: () => ({\n\t\t\t\t\t\t\tenabled: this.settingsManager.getWebSearchEnabled(),\n\t\t\t\t\t\t\tproviderMode: this.settingsManager.getWebSearchProviderMode(),\n\t\t\t\t\t\t\tfallbackMode: this.settingsManager.getWebSearchFallbackMode(),\n\t\t\t\t\t\t\tsafeSearch: this.settingsManager.getWebSearchSafeSearch(),\n\t\t\t\t\t\t\tmaxResults: this.settingsManager.getWebSearchMaxResults(),\n\t\t\t\t\t\t\ttimeoutSeconds: this.settingsManager.getWebSearchTimeoutSeconds(),\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tresolveTavilyApiKey: () => this.settingsManager.getWebSearchTavilyApiKey(),\n\t\t\t\t\t\tresolveSearxngBaseUrl: () => this.settingsManager.getWebSearchSearxngUrl(),\n\t\t\t\t\t\tpermissionGuard: async (request) => this._evaluateToolPermission(request),\n\t\t\t\t\t},\n\t\t\t\t\tgitWrite: {\n\t\t\t\t\t\tresolveRuntimeConfig: () => ({\n\t\t\t\t\t\t\tnetworkEnabled: this.settingsManager.getGithubToolsNetworkEnabled(),\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tresolveGithubToken: () => this.settingsManager.getGithubToolsToken(),\n\t\t\t\t\t\tpermissionGuard: async (request) => this._evaluateToolPermission(request),\n\t\t\t\t\t},\n\t\t\t\t\tfsOps: {\n\t\t\t\t\t\tpermissionGuard: async (request) => this._evaluateToolPermission(request),\n\t\t\t\t\t},\n\t\t\t\t\tdbRun: {\n\t\t\t\t\t\tresolveRuntimeConfig: () => this.settingsManager.getDbToolsSettings(),\n\t\t\t\t\t\tpermissionGuard: async (request) => this._evaluateToolPermission(request),\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\tthis._baseToolRegistry = new Map(Object.entries(baseTools).map(([name, tool]) => [name, tool as AgentTool]));\n\n\t\tconst extensionsResult = this._resourceLoader.getExtensions();\n\t\tif (options.flagValues) {\n\t\t\tfor (const [name, value] of options.flagValues) {\n\t\t\t\textensionsResult.runtime.flagValues.set(name, value);\n\t\t\t}\n\t\t}\n\n\t\tconst hasExtensions = extensionsResult.extensions.length > 0;\n\t\tconst hasCustomTools = this._customTools.length > 0;\n\t\tthis._extensionRunner =\n\t\t\thasExtensions || hasCustomTools\n\t\t\t\t? new ExtensionRunner(\n\t\t\t\t\t\textensionsResult.extensions,\n\t\t\t\t\t\textensionsResult.runtime,\n\t\t\t\t\t\tthis._cwd,\n\t\t\t\t\t\tthis.sessionManager,\n\t\t\t\t\t\tthis._modelRegistry,\n\t\t\t\t\t)\n\t\t\t\t: undefined;\n\t\tif (this._extensionRunnerRef) {\n\t\t\tthis._extensionRunnerRef.current = this._extensionRunner;\n\t\t}\n\t\tif (this._extensionRunner) {\n\t\t\tthis._bindExtensionCore(this._extensionRunner);\n\t\t\tthis._applyExtensionBindings(this._extensionRunner);\n\t\t}\n\n\t\tconst defaultActiveToolNames = this._baseToolsOverride\n\t\t\t? Object.keys(this._baseToolsOverride)\n\t\t\t: [\"read\", \"bash\", \"edit\", \"write\"];\n\t\tconst baseActiveToolNames = options.activeToolNames ?? defaultActiveToolNames;\n\t\tthis._refreshToolRegistry({\n\t\t\tactiveToolNames: baseActiveToolNames,\n\t\t\tincludeAllExtensionTools: options.includeAllExtensionTools,\n\t\t});\n\t}\n\n\tasync reload(): Promise<void> {\n\t\tconst previousFlagValues = this._extensionRunner?.getFlagValues();\n\t\tawait this._extensionRunner?.emit({ type: \"session_shutdown\" });\n\t\tthis.settingsManager.reload();\n\t\tresetApiProviders();\n\t\tawait this._resourceLoader.reload();\n\t\tthis._hooksConfig = this._resourceLoader.getHooks?.() ?? emptyHooksConfig();\n\t\tthis._buildRuntime({\n\t\t\tactiveToolNames: this.getActiveToolNames(),\n\t\t\tflagValues: previousFlagValues,\n\t\t\tincludeAllExtensionTools: true,\n\t\t});\n\n\t\tconst hasBindings =\n\t\t\tthis._extensionUIContext ||\n\t\t\tthis._extensionCommandContextActions ||\n\t\t\tthis._extensionShutdownHandler ||\n\t\t\tthis._extensionErrorListener;\n\t\tif (this._extensionRunner && hasBindings) {\n\t\t\tawait this._extensionRunner.emit({ type: \"session_start\" });\n\t\t\tawait this.extendResourcesFromExtensions(\"reload\");\n\t\t}\n\t}\n\n\t// =========================================================================\n\t// Auto-Retry\n\t// =========================================================================\n\n\t/**\n\t * Check if an error is retryable (overloaded, rate limit, server errors).\n\t * Context overflow errors are NOT retryable (handled by compaction instead).\n\t */\n\tprivate _isRetryableError(message: AssistantMessage): boolean {\n\t\tif (message.stopReason !== \"error\" || !message.errorMessage) return false;\n\n\t\t// Context overflow is handled by compaction, not retry\n\t\tconst contextWindow = this.model?.contextWindow ?? 0;\n\t\tif (isContextOverflow(message, contextWindow)) return false;\n\n\t\tconst err = message.errorMessage;\n\t\t// Match: overloaded_error, rate limit, 429, 500, 502, 503, 504, service unavailable, connection errors, fetch failed, terminated, retry delay exceeded\n\t\treturn /overloaded|rate.?limit|too many requests|429|500|502|503|504|service.?unavailable|server error|internal error|connection.?error|connection.?refused|other side closed|fetch failed|upstream.?connect|reset before headers|terminated|retry delay/i.test(\n\t\t\terr,\n\t\t);\n\t}\n\n\t/**\n\t * Handle retryable errors with exponential backoff.\n\t * @returns true if retry was initiated, false if max retries exceeded or disabled\n\t */\n\tprivate async _handleRetryableError(message: AssistantMessage): Promise<boolean> {\n\t\tconst settings = this.settingsManager.getRetrySettings();\n\t\tif (!settings.enabled) {\n\t\t\tthis._resolveRetry();\n\t\t\treturn false;\n\t\t}\n\n\t\t// Retry promise is created synchronously in _handleAgentEvent for agent_end.\n\t\t// Keep a defensive fallback here in case a future refactor bypasses that path.\n\t\tif (!this._retryPromise) {\n\t\t\tthis._retryPromise = new Promise((resolve) => {\n\t\t\t\tthis._retryResolve = resolve;\n\t\t\t});\n\t\t}\n\n\t\tthis._retryAttempt++;\n\n\t\tif (this._retryAttempt > settings.maxRetries) {\n\t\t\t// Max retries exceeded, emit final failure and reset\n\t\t\tthis._emit({\n\t\t\t\ttype: \"auto_retry_end\",\n\t\t\t\tsuccess: false,\n\t\t\t\tattempt: this._retryAttempt - 1,\n\t\t\t\tfinalError: message.errorMessage,\n\t\t\t});\n\t\t\tthis._retryAttempt = 0;\n\t\t\tthis._resolveRetry(); // Resolve so waitForRetry() completes\n\t\t\treturn false;\n\t\t}\n\n\t\tconst delayMs = settings.baseDelayMs * 2 ** (this._retryAttempt - 1);\n\n\t\tthis._emit({\n\t\t\ttype: \"auto_retry_start\",\n\t\t\tattempt: this._retryAttempt,\n\t\t\tmaxAttempts: settings.maxRetries,\n\t\t\tdelayMs,\n\t\t\terrorMessage: message.errorMessage || \"Unknown error\",\n\t\t});\n\n\t\t// Remove error message from agent state (keep in session for history)\n\t\tconst messages = this.agent.state.messages;\n\t\tif (messages.length > 0 && messages[messages.length - 1].role === \"assistant\") {\n\t\t\tthis.agent.replaceMessages(messages.slice(0, -1));\n\t\t}\n\n\t\t// Wait with exponential backoff (abortable)\n\t\tthis._retryAbortController = new AbortController();\n\t\ttry {\n\t\t\tawait sleep(delayMs, this._retryAbortController.signal);\n\t\t} catch {\n\t\t\t// Aborted during sleep - emit end event so UI can clean up\n\t\t\tconst attempt = this._retryAttempt;\n\t\t\tthis._retryAttempt = 0;\n\t\t\tthis._retryAbortController = undefined;\n\t\t\tthis._emit({\n\t\t\t\ttype: \"auto_retry_end\",\n\t\t\t\tsuccess: false,\n\t\t\t\tattempt,\n\t\t\t\tfinalError: \"Retry cancelled\",\n\t\t\t});\n\t\t\tthis._resolveRetry();\n\t\t\treturn false;\n\t\t}\n\t\tthis._retryAbortController = undefined;\n\n\t\t// Retry via continue() - use setTimeout to break out of event handler chain\n\t\tsetTimeout(() => {\n\t\t\tthis.agent.continue().catch(() => {\n\t\t\t\t// Retry failed - will be caught by next agent_end\n\t\t\t});\n\t\t}, 0);\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Cancel in-progress retry.\n\t */\n\tabortRetry(): void {\n\t\tthis._retryAbortController?.abort();\n\t\t// Note: _retryAttempt is reset in the catch block of _autoRetry\n\t\tthis._resolveRetry();\n\t}\n\n\t/**\n\t * Wait for any in-progress retry to complete.\n\t * Returns immediately if no retry is in progress.\n\t */\n\tprivate async waitForRetry(): Promise<void> {\n\t\tif (this._retryPromise) {\n\t\t\tawait this._retryPromise;\n\t\t}\n\t}\n\n\t/** Whether auto-retry is currently in progress */\n\tget isRetrying(): boolean {\n\t\treturn this._retryPromise !== undefined;\n\t}\n\n\t/** Whether auto-retry is enabled */\n\tget autoRetryEnabled(): boolean {\n\t\treturn this.settingsManager.getRetryEnabled();\n\t}\n\n\t/**\n\t * Toggle auto-retry setting.\n\t */\n\tsetAutoRetryEnabled(enabled: boolean): void {\n\t\tconst previous = this.settingsManager.getRetryEnabled();\n\t\tthis.settingsManager.setRetryEnabled(enabled);\n\t\tif (previous !== enabled) {\n\t\t\tthis._emitConfigChange({\n\t\t\t\tkey: \"retry_enabled\",\n\t\t\t\tprevious,\n\t\t\t\tcurrent: enabled,\n\t\t\t});\n\t\t}\n\t}\n\n\t// =========================================================================\n\t// Bash Execution\n\t// =========================================================================\n\n\t/**\n\t * Execute a bash command.\n\t * Adds result to agent context and session.\n\t * @param command The bash command to execute\n\t * @param onChunk Optional streaming callback for output\n\t * @param options.excludeFromContext If true, command output won't be sent to LLM (!! prefix)\n\t * @param options.operations Custom BashOperations for remote execution\n\t */\n\tasync executeBash(\n\t\tcommand: string,\n\t\tonChunk?: (chunk: string) => void,\n\t\toptions?: { excludeFromContext?: boolean; operations?: BashOperations; runInBackground?: boolean },\n\t): Promise<BashResult> {\n\t\tif (isReadOnlyProfileName(this._profileName)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Bash execution is disabled in ${this._profileName} profile. Switch to full/meta/iosm for command execution.`,\n\t\t\t);\n\t\t}\n\t\tthis._appendSessionTrace({\n\t\t\ttype: \"bash_start\",\n\t\t\tcommand,\n\t\t\texcludeFromContext: options?.excludeFromContext ?? false,\n\t\t});\n\t\tthis._bashAbortController = new AbortController();\n\n\t\t// Apply command prefix if configured (e.g., \"shopt -s expand_aliases\" for alias support)\n\t\tconst prefix = this.settingsManager.getShellCommandPrefix();\n\t\tconst resolvedCommand = prefix ? `${prefix}\\n${command}` : command;\n\n\t\ttry {\n\t\t\tlet result: BashResult;\n\t\t\tif (options?.runInBackground) {\n\t\t\t\tif (options.operations) {\n\t\t\t\t\tthrow new Error(\"Background bash is not supported with custom execution operations.\");\n\t\t\t\t}\n\t\t\t\tconst background = startBackgroundProcess({\n\t\t\t\t\trootCwd: this._cwd,\n\t\t\t\t\tcwd: this._cwd,\n\t\t\t\t\tcommand: resolvedCommand,\n\t\t\t\t\tsource: \"interactive\",\n\t\t\t\t});\n\t\t\t\tresult = {\n\t\t\t\t\toutput: `Started background process ${background.id} (pid ${background.pid}). Use /bg status ${background.id}, /bg logs ${background.id}, or /bg stop ${background.id}.`,\n\t\t\t\t\texitCode: undefined,\n\t\t\t\t\tcancelled: false,\n\t\t\t\t\ttruncated: false,\n\t\t\t\t\tbackgroundTaskId: background.id,\n\t\t\t\t\tbackgroundStatusPath: background.metaPath,\n\t\t\t\t\tbackgroundLogPath: background.logPath,\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tresult = options?.operations\n\t\t\t\t\t? await executeBashWithOperations(resolvedCommand, this._cwd, options.operations, {\n\t\t\t\t\t\t\tonChunk,\n\t\t\t\t\t\t\tsignal: this._bashAbortController.signal,\n\t\t\t\t\t\t})\n\t\t\t\t\t: await executeBashCommand(resolvedCommand, {\n\t\t\t\t\t\t\tcwd: this._cwd,\n\t\t\t\t\t\t\tonChunk,\n\t\t\t\t\t\t\tsignal: this._bashAbortController.signal,\n\t\t\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.recordBashResult(command, result, options);\n\t\t\tthis._appendSessionTrace({\n\t\t\t\ttype: \"bash_end\",\n\t\t\t\tcommand,\n\t\t\t\texitCode: result.exitCode,\n\t\t\t\tcancelled: result.cancelled,\n\t\t\t\ttruncated: result.truncated,\n\t\t\t\tbackgroundTaskId: result.backgroundTaskId ?? null,\n\t\t\t});\n\t\t\treturn result;\n\t\t} finally {\n\t\t\tthis._bashAbortController = undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Record a bash execution result in session history.\n\t * Used by executeBash and by extensions that handle bash execution themselves.\n\t */\n\trecordBashResult(command: string, result: BashResult, options?: { excludeFromContext?: boolean }): void {\n\t\tconst bashMessage: BashExecutionMessage = {\n\t\t\trole: \"bashExecution\",\n\t\t\tcommand,\n\t\t\toutput: result.output,\n\t\t\texitCode: result.exitCode,\n\t\t\tcancelled: result.cancelled,\n\t\t\ttruncated: result.truncated,\n\t\t\tfullOutputPath: result.fullOutputPath,\n\t\t\ttimestamp: Date.now(),\n\t\t\texcludeFromContext: options?.excludeFromContext,\n\t\t};\n\n\t\t// If agent is streaming, defer adding to avoid breaking tool_use/tool_result ordering\n\t\tif (this.isStreaming) {\n\t\t\t// Queue for later - will be flushed on agent_end\n\t\t\tthis._pendingBashMessages.push(bashMessage);\n\t\t} else {\n\t\t\t// Add to agent state immediately\n\t\t\tthis.agent.appendMessage(bashMessage);\n\n\t\t\t// Save to session\n\t\t\tthis.sessionManager.appendMessage(bashMessage);\n\t\t}\n\t}\n\n\t/**\n\t * Cancel running bash command.\n\t */\n\tabortBash(): void {\n\t\tthis._bashAbortController?.abort();\n\t}\n\n\t/** Whether a bash command is currently running */\n\tget isBashRunning(): boolean {\n\t\treturn this._bashAbortController !== undefined;\n\t}\n\n\t/** Whether there are pending bash messages waiting to be flushed */\n\tget hasPendingBashMessages(): boolean {\n\t\treturn this._pendingBashMessages.length > 0;\n\t}\n\n\t/**\n\t * Flush pending bash messages to agent state and session.\n\t * Called after agent turn completes to maintain proper message ordering.\n\t */\n\tprivate _flushPendingBashMessages(): void {\n\t\tif (this._pendingBashMessages.length === 0) return;\n\n\t\tfor (const bashMessage of this._pendingBashMessages) {\n\t\t\t// Add to agent state\n\t\t\tthis.agent.appendMessage(bashMessage);\n\n\t\t\t// Save to session\n\t\t\tthis.sessionManager.appendMessage(bashMessage);\n\t\t}\n\n\t\tthis._pendingBashMessages = [];\n\t}\n\n\t// =========================================================================\n\t// Session Management\n\t// =========================================================================\n\n\t/**\n\t * Switch to a different session file.\n\t * Aborts current operation, loads messages, restores model/thinking.\n\t * Listeners are preserved and will continue receiving events.\n\t * @returns true if switch completed, false if cancelled by extension\n\t */\n\tasync switchSession(sessionPath: string): Promise<boolean> {\n\t\tconst previousSessionFile = this.sessionManager.getSessionFile();\n\t\tthis._appendSessionTrace({\n\t\t\ttype: \"session_switch_start\",\n\t\t\tpreviousSessionFile: previousSessionFile ?? null,\n\t\t\ttargetSessionFile: sessionPath,\n\t\t});\n\n\t\t// Emit session_before_switch event (can be cancelled)\n\t\tif (this._extensionRunner?.hasHandlers(\"session_before_switch\")) {\n\t\t\tconst result = (await this._extensionRunner.emit({\n\t\t\t\ttype: \"session_before_switch\",\n\t\t\t\treason: \"resume\",\n\t\t\t\ttargetSessionFile: sessionPath,\n\t\t\t})) as SessionBeforeSwitchResult | undefined;\n\n\t\t\tif (result?.cancel) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tthis._disconnectFromAgent();\n\t\t\tawait this.abort();\n\t\t\tthis._steeringMessages = [];\n\t\t\tthis._followUpMessages = [];\n\t\t\tthis._metaMessages = [];\n\t\t\tthis._metaAppliedStep = 0;\n\t\t\tthis._pendingNextTurnMessages = [];\n\n\t\t// Set new session\n\t\tthis.sessionManager.setSessionFile(sessionPath);\n\t\tthis.agent.sessionId = this.sessionManager.getSessionId();\n\t\tthis._refreshSessionTracePath(\"switch_session\");\n\n\t\t// Reload messages\n\t\tconst sessionContext = this.sessionManager.buildSessionContext();\n\n\t\t// Emit session_switch event to extensions\n\t\tif (this._extensionRunner) {\n\t\t\tawait this._extensionRunner.emit({\n\t\t\t\ttype: \"session_switch\",\n\t\t\t\treason: \"resume\",\n\t\t\t\tpreviousSessionFile,\n\t\t\t});\n\t\t}\n\n\t\t// Emit session event to custom tools\n\n\t\tthis.agent.replaceMessages(sessionContext.messages);\n\n\t\t// Restore model if saved\n\t\tif (sessionContext.model) {\n\t\t\tconst previousModel = this.model;\n\t\t\tconst availableModels = await this._modelRegistry.getAvailable();\n\t\t\tconst match = availableModels.find(\n\t\t\t\t(m) => m.provider === sessionContext.model!.provider && m.id === sessionContext.model!.modelId,\n\t\t\t);\n\t\t\tif (match) {\n\t\t\t\tthis.agent.setModel(match);\n\t\t\t\tawait this._emitModelSelect(match, previousModel, \"restore\");\n\t\t\t}\n\t\t}\n\n\t\tconst hasThinkingEntry = this.sessionManager.getBranch().some((entry) => entry.type === \"thinking_level_change\");\n\t\tconst defaultThinkingLevel = this.settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL;\n\n\t\tif (hasThinkingEntry) {\n\t\t\t// Restore thinking level if saved (setThinkingLevel clamps to model capabilities)\n\t\t\tthis.setThinkingLevel(sessionContext.thinkingLevel as ThinkingLevel);\n\t\t} else {\n\t\t\tconst availableLevels = this.getAvailableThinkingLevels();\n\t\t\tconst effectiveLevel = availableLevels.includes(defaultThinkingLevel)\n\t\t\t\t? defaultThinkingLevel\n\t\t\t\t: this._clampThinkingLevel(defaultThinkingLevel, availableLevels);\n\t\t\tthis.agent.setThinkingLevel(effectiveLevel);\n\t\t\tthis.sessionManager.appendThinkingLevelChange(effectiveLevel);\n\t\t}\n\n\t\tthis._reconnectToAgent();\n\t\tthis._appendSessionTrace({\n\t\t\ttype: \"session_switch_complete\",\n\t\t\tsessionId: this.sessionManager.getSessionId(),\n\t\t\tsessionFile: this.sessionFile ?? null,\n\t\t});\n\t\treturn true;\n\t}\n\n\t/**\n\t * Set a display name for the current session.\n\t */\n\tsetSessionName(name: string): void {\n\t\tthis.sessionManager.appendSessionInfo(name);\n\t}\n\n\t/**\n\t * Create a fork from a specific entry.\n\t * Emits before_fork/fork session events to extensions.\n\t *\n\t * @param entryId ID of the entry to fork from\n\t * @returns Object with:\n\t * - selectedText: The text of the selected user message (for editor pre-fill)\n\t * - cancelled: True if an extension cancelled the fork\n\t */\n\tasync fork(entryId: string): Promise<{ selectedText: string; cancelled: boolean }> {\n\t\tconst previousSessionFile = this.sessionFile;\n\t\tthis._appendSessionTrace({\n\t\t\ttype: \"session_fork_start\",\n\t\t\tentryId,\n\t\t\tpreviousSessionFile: previousSessionFile ?? null,\n\t\t});\n\t\tconst selectedEntry = this.sessionManager.getEntry(entryId);\n\n\t\tif (!selectedEntry || selectedEntry.type !== \"message\" || selectedEntry.message.role !== \"user\") {\n\t\t\tthrow new Error(\"Invalid entry ID for forking\");\n\t\t}\n\n\t\tconst selectedText = this._extractUserMessageText(selectedEntry.message.content);\n\n\t\tlet skipConversationRestore = false;\n\n\t\t// Emit session_before_fork event (can be cancelled)\n\t\tif (this._extensionRunner?.hasHandlers(\"session_before_fork\")) {\n\t\t\tconst result = (await this._extensionRunner.emit({\n\t\t\t\ttype: \"session_before_fork\",\n\t\t\t\tentryId,\n\t\t\t})) as SessionBeforeForkResult | undefined;\n\n\t\t\tif (result?.cancel) {\n\t\t\t\treturn { selectedText, cancelled: true };\n\t\t\t}\n\t\t\tskipConversationRestore = result?.skipConversationRestore ?? false;\n\t\t}\n\n\t\t// Clear pending messages (bound to old session state)\n\t\tthis._pendingNextTurnMessages = [];\n\n\t\tif (!selectedEntry.parentId) {\n\t\t\tthis.sessionManager.newSession({ parentSession: previousSessionFile });\n\t\t} else {\n\t\t\tthis.sessionManager.createBranchedSession(selectedEntry.parentId);\n\t\t}\n\t\tthis.agent.sessionId = this.sessionManager.getSessionId();\n\t\tthis._refreshSessionTracePath(\"fork_session\");\n\n\t\t// Reload messages from entries (works for both file and in-memory mode)\n\t\tconst sessionContext = this.sessionManager.buildSessionContext();\n\n\t\t// Emit session_fork event to extensions (after fork completes)\n\t\tif (this._extensionRunner) {\n\t\t\tawait this._extensionRunner.emit({\n\t\t\t\ttype: \"session_fork\",\n\t\t\t\tpreviousSessionFile,\n\t\t\t});\n\t\t}\n\n\t\t// Emit session event to custom tools (with reason \"fork\")\n\n\t\tif (!skipConversationRestore) {\n\t\t\tthis.agent.replaceMessages(sessionContext.messages);\n\t\t}\n\n\t\tthis._appendSessionTrace({\n\t\t\ttype: \"session_fork_complete\",\n\t\t\tsessionId: this.sessionManager.getSessionId(),\n\t\t\tsessionFile: this.sessionFile ?? null,\n\t\t});\n\n\t\treturn { selectedText, cancelled: false };\n\t}\n\n\t// =========================================================================\n\t// Tree Navigation\n\t// =========================================================================\n\n\t/**\n\t * Navigate to a different node in the session tree.\n\t * Unlike fork() which creates a new session file, this stays in the same file.\n\t *\n\t * @param targetId The entry ID to navigate to\n\t * @param options.summarize Whether user wants to summarize abandoned branch\n\t * @param options.customInstructions Custom instructions for summarizer\n\t * @param options.replaceInstructions If true, customInstructions replaces the default prompt\n\t * @param options.label Label to attach to the branch summary entry\n\t * @returns Result with editorText (if user message) and cancelled status\n\t */\n\tasync navigateTree(\n\t\ttargetId: string,\n\t\toptions: { summarize?: boolean; customInstructions?: string; replaceInstructions?: boolean; label?: string } = {},\n\t): Promise<{ editorText?: string; cancelled: boolean; aborted?: boolean; summaryEntry?: BranchSummaryEntry }> {\n\t\tconst oldLeafId = this.sessionManager.getLeafId();\n\n\t\t// No-op if already at target\n\t\tif (targetId === oldLeafId) {\n\t\t\treturn { cancelled: false };\n\t\t}\n\n\t\t// Model required for summarization\n\t\tif (options.summarize && !this.model) {\n\t\t\tthrow new Error(\"No model available for summarization\");\n\t\t}\n\n\t\tconst targetEntry = this.sessionManager.getEntry(targetId);\n\t\tif (!targetEntry) {\n\t\t\tthrow new Error(`Entry ${targetId} not found`);\n\t\t}\n\n\t\t// Collect entries to summarize (from old leaf to common ancestor)\n\t\tconst { entries: entriesToSummarize, commonAncestorId } = collectEntriesForBranchSummary(\n\t\t\tthis.sessionManager,\n\t\t\toldLeafId,\n\t\t\ttargetId,\n\t\t);\n\n\t\t// Prepare event data - mutable so extensions can override\n\t\tlet customInstructions = options.customInstructions;\n\t\tlet replaceInstructions = options.replaceInstructions;\n\t\tlet label = options.label;\n\n\t\tconst preparation: TreePreparation = {\n\t\t\ttargetId,\n\t\t\toldLeafId,\n\t\t\tcommonAncestorId,\n\t\t\tentriesToSummarize,\n\t\t\tuserWantsSummary: options.summarize ?? false,\n\t\t\tcustomInstructions,\n\t\t\treplaceInstructions,\n\t\t\tlabel,\n\t\t};\n\n\t\t// Set up abort controller for summarization\n\t\tthis._branchSummaryAbortController = new AbortController();\n\t\tlet extensionSummary: { summary: string; details?: unknown } | undefined;\n\t\tlet fromExtension = false;\n\n\t\t// Emit session_before_tree event\n\t\tif (this._extensionRunner?.hasHandlers(\"session_before_tree\")) {\n\t\t\tconst result = (await this._extensionRunner.emit({\n\t\t\t\ttype: \"session_before_tree\",\n\t\t\t\tpreparation,\n\t\t\t\tsignal: this._branchSummaryAbortController.signal,\n\t\t\t})) as SessionBeforeTreeResult | undefined;\n\n\t\t\tif (result?.cancel) {\n\t\t\t\treturn { cancelled: true };\n\t\t\t}\n\n\t\t\tif (result?.summary && options.summarize) {\n\t\t\t\textensionSummary = result.summary;\n\t\t\t\tfromExtension = true;\n\t\t\t}\n\n\t\t\t// Allow extensions to override instructions and label\n\t\t\tif (result?.customInstructions !== undefined) {\n\t\t\t\tcustomInstructions = result.customInstructions;\n\t\t\t}\n\t\t\tif (result?.replaceInstructions !== undefined) {\n\t\t\t\treplaceInstructions = result.replaceInstructions;\n\t\t\t}\n\t\t\tif (result?.label !== undefined) {\n\t\t\t\tlabel = result.label;\n\t\t\t}\n\t\t}\n\n\t\t// Run default summarizer if needed\n\t\tlet summaryText: string | undefined;\n\t\tlet summaryDetails: unknown;\n\t\tif (options.summarize && entriesToSummarize.length > 0 && !extensionSummary) {\n\t\t\tconst model = this.model!;\n\t\t\tconst apiKey = await this._modelRegistry.getApiKey(model);\n\t\t\tif (!apiKey) {\n\t\t\t\tthrow new Error(`No API key for ${model.provider}`);\n\t\t\t}\n\t\t\tconst branchSummarySettings = this.settingsManager.getBranchSummarySettings();\n\t\t\tconst result = await generateBranchSummary(entriesToSummarize, {\n\t\t\t\tmodel,\n\t\t\t\tapiKey,\n\t\t\t\tsignal: this._branchSummaryAbortController.signal,\n\t\t\t\tcustomInstructions,\n\t\t\t\treplaceInstructions,\n\t\t\t\treserveTokens: branchSummarySettings.reserveTokens,\n\t\t\t});\n\t\t\tthis._branchSummaryAbortController = undefined;\n\t\t\tif (result.aborted) {\n\t\t\t\treturn { cancelled: true, aborted: true };\n\t\t\t}\n\t\t\tif (result.error) {\n\t\t\t\tthrow new Error(result.error);\n\t\t\t}\n\t\t\tsummaryText = result.summary;\n\t\t\tsummaryDetails = {\n\t\t\t\treadFiles: result.readFiles || [],\n\t\t\t\tmodifiedFiles: result.modifiedFiles || [],\n\t\t\t};\n\t\t} else if (extensionSummary) {\n\t\t\tsummaryText = extensionSummary.summary;\n\t\t\tsummaryDetails = extensionSummary.details;\n\t\t}\n\n\t\t// Determine the new leaf position based on target type\n\t\tlet newLeafId: string | null;\n\t\tlet editorText: string | undefined;\n\n\t\tif (targetEntry.type === \"message\" && targetEntry.message.role === \"user\") {\n\t\t\t// User message: leaf = parent (null if root), text goes to editor\n\t\t\tnewLeafId = targetEntry.parentId;\n\t\t\teditorText = this._extractUserMessageText(targetEntry.message.content);\n\t\t} else if (targetEntry.type === \"custom_message\") {\n\t\t\t// Custom message: leaf = parent (null if root), text goes to editor\n\t\t\tnewLeafId = targetEntry.parentId;\n\t\t\teditorText =\n\t\t\t\ttypeof targetEntry.content === \"string\"\n\t\t\t\t\t? targetEntry.content\n\t\t\t\t\t: targetEntry.content\n\t\t\t\t\t\t\t.filter((c): c is { type: \"text\"; text: string } => c.type === \"text\")\n\t\t\t\t\t\t\t.map((c) => c.text)\n\t\t\t\t\t\t\t.join(\"\");\n\t\t} else {\n\t\t\t// Non-user message: leaf = selected node\n\t\t\tnewLeafId = targetId;\n\t\t}\n\n\t\t// Switch leaf (with or without summary)\n\t\t// Summary is attached at the navigation target position (newLeafId), not the old branch\n\t\tlet summaryEntry: BranchSummaryEntry | undefined;\n\t\tif (summaryText) {\n\t\t\t// Create summary at target position (can be null for root)\n\t\t\tconst summaryId = this.sessionManager.branchWithSummary(newLeafId, summaryText, summaryDetails, fromExtension);\n\t\t\tsummaryEntry = this.sessionManager.getEntry(summaryId) as BranchSummaryEntry;\n\n\t\t\t// Attach label to the summary entry\n\t\t\tif (label) {\n\t\t\t\tthis.sessionManager.appendLabelChange(summaryId, label);\n\t\t\t}\n\t\t} else if (newLeafId === null) {\n\t\t\t// No summary, navigating to root - reset leaf\n\t\t\tthis.sessionManager.resetLeaf();\n\t\t} else {\n\t\t\t// No summary, navigating to non-root\n\t\t\tthis.sessionManager.branch(newLeafId);\n\t\t}\n\n\t\t// Attach label to target entry when not summarizing (no summary entry to label)\n\t\tif (label && !summaryText) {\n\t\t\tthis.sessionManager.appendLabelChange(targetId, label);\n\t\t}\n\n\t\t// Update agent state\n\t\tconst sessionContext = this.sessionManager.buildSessionContext();\n\t\tthis.agent.replaceMessages(sessionContext.messages);\n\n\t\t// Emit session_tree event\n\t\tif (this._extensionRunner) {\n\t\t\tawait this._extensionRunner.emit({\n\t\t\t\ttype: \"session_tree\",\n\t\t\t\tnewLeafId: this.sessionManager.getLeafId(),\n\t\t\t\toldLeafId,\n\t\t\t\tsummaryEntry,\n\t\t\t\tfromExtension: summaryText ? fromExtension : undefined,\n\t\t\t});\n\t\t}\n\n\t\t// Emit to custom tools\n\n\t\tthis._branchSummaryAbortController = undefined;\n\t\treturn { editorText, cancelled: false, summaryEntry };\n\t}\n\n\t/**\n\t * Get all user messages from session for fork selector.\n\t */\n\tgetUserMessagesForForking(): Array<{ entryId: string; text: string }> {\n\t\tconst entries = this.sessionManager.getEntries();\n\t\tconst result: Array<{ entryId: string; text: string }> = [];\n\n\t\tfor (const entry of entries) {\n\t\t\tif (entry.type !== \"message\") continue;\n\t\t\tif (entry.message.role !== \"user\") continue;\n\n\t\t\tconst text = this._extractUserMessageText(entry.message.content);\n\t\t\tif (text) {\n\t\t\t\tresult.push({ entryId: entry.id, text });\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tprivate _extractUserMessageText(content: string | Array<{ type: string; text?: string }>): string {\n\t\tif (typeof content === \"string\") return content;\n\t\tif (Array.isArray(content)) {\n\t\t\treturn content\n\t\t\t\t.filter((c): c is { type: \"text\"; text: string } => c.type === \"text\")\n\t\t\t\t.map((c) => c.text)\n\t\t\t\t.join(\"\");\n\t\t}\n\t\treturn \"\";\n\t}\n\n\t/**\n\t * Get session statistics.\n\t */\n\tgetSessionStats(): SessionStats {\n\t\tconst state = this.state;\n\t\tconst userMessages = state.messages.filter((m) => m.role === \"user\").length;\n\t\tconst assistantMessages = state.messages.filter((m) => m.role === \"assistant\").length;\n\t\tconst toolResults = state.messages.filter((m) => m.role === \"toolResult\").length;\n\n\t\tlet toolCalls = 0;\n\t\tlet totalInput = 0;\n\t\tlet totalOutput = 0;\n\t\tlet totalCacheRead = 0;\n\t\tlet totalCacheWrite = 0;\n\t\tlet totalCost = 0;\n\n\t\tfor (const message of state.messages) {\n\t\t\tif (message.role === \"assistant\") {\n\t\t\t\tconst assistantMsg = message as AssistantMessage;\n\t\t\t\ttoolCalls += assistantMsg.content.filter((c) => c.type === \"toolCall\").length;\n\t\t\t\ttotalInput += assistantMsg.usage.input;\n\t\t\t\ttotalOutput += assistantMsg.usage.output;\n\t\t\t\ttotalCacheRead += assistantMsg.usage.cacheRead;\n\t\t\t\ttotalCacheWrite += assistantMsg.usage.cacheWrite;\n\t\t\t\ttotalCost += resolveAssistantCostWithOpenRouterFallback(assistantMsg, (provider, modelId) =>\n\t\t\t\t\tthis.modelRegistry.find(provider, modelId),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tsessionFile: this.sessionFile,\n\t\t\tsessionId: this.sessionId,\n\t\t\tuserMessages,\n\t\t\tassistantMessages,\n\t\t\ttoolCalls,\n\t\t\ttoolResults,\n\t\t\ttotalMessages: state.messages.length,\n\t\t\ttokens: {\n\t\t\t\tinput: totalInput,\n\t\t\t\toutput: totalOutput,\n\t\t\t\tcacheRead: totalCacheRead,\n\t\t\t\tcacheWrite: totalCacheWrite,\n\t\t\t\ttotal: totalInput + totalOutput + totalCacheRead + totalCacheWrite,\n\t\t\t},\n\t\t\tcost: totalCost,\n\t\t};\n\t}\n\n\tgetContextUsage(): ContextUsage | undefined {\n\t\tconst model = this.model;\n\t\tif (!model) return undefined;\n\n\t\tconst contextWindow = model.contextWindow ?? 0;\n\t\tif (contextWindow <= 0) return undefined;\n\n\t\t// After compaction, the last assistant usage reflects pre-compaction context size.\n\t\t// We can only trust usage from an assistant that responded after the latest compaction.\n\t\t// If no such assistant exists, context token count is unknown until the next LLM response.\n\t\tconst branchEntries = this.sessionManager.getBranch();\n\t\tconst latestCompaction = getLatestCompactionEntry(branchEntries);\n\n\t\tif (latestCompaction) {\n\t\t\t// Check if there's a valid assistant usage after the compaction boundary\n\t\t\tconst compactionIndex = branchEntries.lastIndexOf(latestCompaction);\n\t\t\tlet hasPostCompactionUsage = false;\n\t\t\tfor (let i = branchEntries.length - 1; i > compactionIndex; i--) {\n\t\t\t\tconst entry = branchEntries[i];\n\t\t\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\t\t\tconst assistant = entry.message;\n\t\t\t\t\tif (assistant.stopReason !== \"aborted\" && assistant.stopReason !== \"error\") {\n\t\t\t\t\t\tconst contextTokens = calculateContextTokens(assistant.usage);\n\t\t\t\t\t\tif (contextTokens > 0) {\n\t\t\t\t\t\t\thasPostCompactionUsage = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!hasPostCompactionUsage) {\n\t\t\t\treturn { tokens: null, contextWindow, percent: null };\n\t\t\t}\n\t\t}\n\n\t\tconst estimate = estimateContextTokens(this.messages);\n\t\tconst percent = (estimate.tokens / contextWindow) * 100;\n\n\t\treturn {\n\t\t\ttokens: estimate.tokens,\n\t\t\tcontextWindow,\n\t\t\tpercent,\n\t\t};\n\t}\n\n\t/**\n\t * Export session to HTML.\n\t * @param outputPath Optional output path (defaults to session directory)\n\t * @returns Path to exported file\n\t */\n\tasync exportToHtml(outputPath?: string): Promise<string> {\n\t\tconst themeName = this.settingsManager.getTheme();\n\n\t\t// Create tool renderer if we have an extension runner (for custom tool HTML rendering)\n\t\tlet toolRenderer: ToolHtmlRenderer | undefined;\n\t\tif (this._extensionRunner) {\n\t\t\ttoolRenderer = createToolHtmlRenderer({\n\t\t\t\tgetToolDefinition: (name) => this._extensionRunner!.getToolDefinition(name),\n\t\t\t\ttheme,\n\t\t\t});\n\t\t}\n\n\t\treturn await exportSessionToHtml(this.sessionManager, this.state, {\n\t\t\toutputPath,\n\t\t\tthemeName,\n\t\t\ttoolRenderer,\n\t\t});\n\t}\n\n\t// =========================================================================\n\t// Utilities\n\t// =========================================================================\n\n\t/**\n\t * Get text content of last assistant message.\n\t * Useful for /copy command.\n\t * @returns Text content, or undefined if no assistant message exists\n\t */\n\tgetLastAssistantText(): string | undefined {\n\t\tconst lastAssistant = this.messages\n\t\t\t.slice()\n\t\t\t.reverse()\n\t\t\t.find((m) => {\n\t\t\t\tif (m.role !== \"assistant\") return false;\n\t\t\t\tconst msg = m as AssistantMessage;\n\t\t\t\t// Skip aborted messages with no content\n\t\t\t\tif (msg.stopReason === \"aborted\" && msg.content.length === 0) return false;\n\t\t\t\treturn true;\n\t\t\t});\n\n\t\tif (!lastAssistant) return undefined;\n\n\t\tlet text = \"\";\n\t\tfor (const content of (lastAssistant as AssistantMessage).content) {\n\t\t\tif (content.type === \"text\") {\n\t\t\t\ttext += content.text;\n\t\t\t}\n\t\t}\n\n\t\treturn text.trim() || undefined;\n\t}\n\n\t// =========================================================================\n\t// Extension System\n\t// =========================================================================\n\n\t/**\n\t * Check if extensions have handlers for a specific event type.\n\t */\n\thasExtensionHandlers(eventType: string): boolean {\n\t\treturn this._extensionRunner?.hasHandlers(eventType) ?? false;\n\t}\n\n\t/**\n\t * Get the extension runner (for setting UI context and error handlers).\n\t */\n\tget extensionRunner(): ExtensionRunner | undefined {\n\t\treturn this._extensionRunner;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"agent-session.js","sourceRoot":"","sources":["../../src/core/agent-session.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * AgentSession - Core abstraction for agent lifecycle and session management.\n *\n * This class is shared between all run modes (interactive, print, rpc).\n * It encapsulates:\n * - Agent state access\n * - Event subscription with automatic session persistence\n * - Model and thinking level management\n * - Compaction (manual and auto)\n * - Bash execution\n * - Session switching and branching\n *\n * Modes use this class and add their own I/O layer on top.\n */\n\nimport { appendFileSync, mkdirSync, readFileSync } from \"node:fs\";\nimport { basename, dirname, join } from \"node:path\";\nimport { spawnSync } from \"node:child_process\";\nimport type {\n\tAgent,\n\tAgentEvent,\n\tAgentMessage,\n\tAgentState,\n\tAgentTool,\n\tThinkingLevel,\n} from \"@mariozechner/pi-agent-core\";\nimport type { AssistantMessage, ImageContent, Message, Model, TextContent } from \"@mariozechner/pi-ai\";\nimport { completeSimple, isContextOverflow, modelsAreEqual, resetApiProviders, supportsXhigh } from \"@mariozechner/pi-ai\";\nimport { getDocsPath, getSessionTracePath, isSessionTraceEnabled } from \"../config.js\";\nimport { buildIosmRuntimeDirective, prepareIosmRuntimeContext } from \"../iosm/runtime-context.js\";\nimport { theme } from \"../modes/interactive/theme/theme.js\";\nimport { stripFrontmatter } from \"../utils/frontmatter.js\";\nimport { sleep } from \"../utils/sleep.js\";\nimport { type BashResult, executeBash as executeBashCommand, executeBashWithOperations } from \"./bash-executor.js\";\nimport {\n\ttype CompactionResult,\n\tcalculateContextTokens,\n\tcollectEntriesForBranchSummary,\n\tcompact,\n\testimateContextTokens,\n\tgenerateBranchSummary,\n\tprepareCompaction,\n\tshouldCompact,\n} from \"./compaction/index.js\";\nimport { DEFAULT_THINKING_LEVEL } from \"./defaults.js\";\nimport { exportSessionToHtml, type ToolHtmlRenderer } from \"./export-html/index.js\";\nimport { createToolHtmlRenderer } from \"./export-html/tool-renderer.js\";\nimport {\n\ttype ContextUsage,\n\ttype ExtensionCommandContextActions,\n\ttype ExtensionErrorListener,\n\tExtensionRunner,\n\ttype ExtensionUIContext,\n\ttype InputSource,\n\ttype MessageEndEvent,\n\ttype MessageStartEvent,\n\ttype MessageUpdateEvent,\n\ttype SessionBeforeCompactResult,\n\ttype SessionBeforeForkResult,\n\ttype SessionBeforeSwitchResult,\n\ttype SessionBeforeTreeResult,\n\ttype ShutdownHandler,\n\ttype ToolDefinition,\n\ttype ToolExecutionEndEvent,\n\ttype ToolExecutionStartEvent,\n\ttype ToolExecutionUpdateEvent,\n\ttype SubagentStartEvent,\n\ttype SubagentStopEvent,\n\ttype TaskCompletedEvent,\n\ttype TeammateIdleEvent,\n\ttype ConfigChangeEvent,\n\ttype ToolInfo,\n\ttype TreePreparation,\n\ttype TurnEndEvent,\n\ttype TurnStartEvent,\n\twrapRegisteredTools,\n\twrapToolsWithExtensions,\n} from \"./extensions/index.js\";\nimport { INTERNAL_UI_META_CUSTOM_TYPE, type BashExecutionMessage, type CustomMessage } from \"./messages.js\";\nimport type { ModelRegistry } from \"./model-registry.js\";\nimport { expandPromptTemplate, type PromptTemplate } from \"./prompt-templates.js\";\nimport { startBackgroundProcess } from \"./background-processes.js\";\nimport type { ResourceExtensionPaths, ResourceLoader } from \"./resource-loader.js\";\nimport type { BranchSummaryEntry, CompactionEntry, SessionManager } from \"./session-manager.js\";\nimport { getLatestCompactionEntry } from \"./session-manager.js\";\nimport type { SettingsManager } from \"./settings-manager.js\";\nimport { BUILTIN_SLASH_COMMANDS, type SlashCommandInfo, type SlashCommandLocation } from \"./slash-commands.js\";\nimport { buildSystemPrompt } from \"./system-prompt.js\";\nimport { isReadOnlyProfileName, type AgentProfileName } from \"./agent-profiles.js\";\nimport {\n\tapplyPostToolUseHooks,\n\tapplyPreToolUseHooks,\n\tapplyStopHooks,\n\tapplyUserPromptSubmitHooks,\n\temptyHooksConfig,\n\ttype HookEventName,\n\ttype LoadedHooksConfig,\n} from \"./hooks.js\";\nimport {\n\textractTaskPlanFromAssistantMessage,\n\tformatTaskPlanMessageContent,\n\ttaskPlanSignature,\n\tTASK_PLAN_CUSTOM_TYPE,\n\ttype TaskPlanSnapshot,\n} from \"./task-plan.js\";\nimport type { BashOperations } from \"./tools/bash.js\";\nimport { createAllTools, getAllowedFetchMethodsForProfile } from \"./tools/index.js\";\nimport type { ToolPermissionRequest, ToolRequiredPermission } from \"./tools/index.js\";\nimport { resolveAssistantCostWithOpenRouterFallback } from \"./usage-cost.js\";\nimport {\n\tULTRATHINK_CHECKPOINT_COMPRESSION_SYSTEM_PROMPT,\n\tULTRATHINK_MAX_CHECKPOINT_CHARS,\n\tULTRATHINK_MAX_ITERATION_INPUT_TOKENS,\n\tULTRATHINK_MAX_RUN_COST,\n\tULTRATHINK_MAX_RUN_INPUT_TOKENS,\n\tULTRATHINK_MAX_RUN_TOTAL_TOKENS,\n\tULTRATHINK_STAGNATION_LIMIT,\n\tULTRATHINK_VISIBLE_PROMPT_PREFIX,\n\tbuildUltrathinkCheckpointCompressionPrompt,\n\tbuildUltrathinkBudgetStatusLine,\n\tbuildUltrathinkComplianceRepairPrompt,\n\tbuildUltrathinkContextTail,\n\tbuildUltrathinkEvidenceCatalog,\n\tbuildUltrathinkIterationPrompt,\n\tbuildUltrathinkToolGroundingPrompt,\n\tbuildUltrathinkVisibleIterationPrompt,\n\tcreateInitialUltrathinkCheckpoint,\n\tevaluateUltrathinkEvidencePolicy,\n\textractUltrathinkCheckpoint,\n\textractUltrathinkIterationSummary,\n\textractUltrathinkToolEvidence,\n\tfindLastMeaningfulUserIntent,\n\tgetUltrathinkPhase,\n\thasUltrathinkEvidenceViolations,\n\tisUltrathinkStagnated,\n\tnormalizeUltrathinkCheckpoint,\n\tparseUltrathinkCommand,\n\tresolveUltrathinkReadOnlyTools,\n\tshouldUltrathinkForceToolGrounding,\n\ttruncateUltrathinkCheckpoint,\n\tULTRATHINK_USAGE,\n\ttype UltrathinkCommandConfig,\n} from \"./ultrathink.js\";\n\n// ============================================================================\n// Skill Block Parsing\n// ============================================================================\n\n/** Parsed skill block from a user message */\nexport interface ParsedSkillBlock {\n\tname: string;\n\tlocation: string;\n\tcontent: string;\n\tuserMessage: string | undefined;\n}\n\n/**\n * Parse a skill block from message text.\n * Returns null if the text doesn't contain a skill block.\n */\nexport function parseSkillBlock(text: string): ParsedSkillBlock | null {\n\tconst match = text.match(/^<skill name=\"([^\"]+)\" location=\"([^\"]+)\">\\n([\\s\\S]*?)\\n<\\/skill>(?:\\n\\n([\\s\\S]+))?$/);\n\tif (!match) return null;\n\treturn {\n\t\tname: match[1],\n\t\tlocation: match[2],\n\t\tcontent: match[3],\n\t\tuserMessage: match[4]?.trim() || undefined,\n\t};\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nconst GIT_SNAPSHOT_CAPTURE_MAX_BUFFER = 512 * 1024;\n\ninterface GitSnapshotContextDiagnostics {\n\tbeforeChars: number;\n\tafterChars: number;\n\ttruncated: boolean;\n\tincluded: boolean;\n}\n\nfunction parseOrchestrateBlock(text: string):\n\t| {\n\t\t\tmode?: string;\n\t\t\tagents?: number;\n\t\t\tmaxParallel?: number;\n\t\t\tbody: string;\n\t }\n\t| undefined {\n\tconst match = text.match(/<orchestrate\\b([^>]*)>([\\s\\S]*?)<\\/orchestrate>/i);\n\tif (!match) return undefined;\n\n\tconst attrs = match[1] ?? \"\";\n\tconst body = (match[2] ?? \"\").trim();\n\tconst readAttr = (name: string): string | undefined => {\n\t\tconst attrMatch = attrs.match(new RegExp(`${name}\\\\s*=\\\\s*(?:\"([^\"]+)\"|'([^']+)')`, \"i\"));\n\t\treturn (attrMatch?.[1] ?? attrMatch?.[2])?.trim();\n\t};\n\n\tconst mode = readAttr(\"mode\");\n\tconst agentsRaw = readAttr(\"agents\");\n\tconst maxParallelRaw = readAttr(\"max_parallel\");\n\tconst agentsParsed = agentsRaw ? Number.parseInt(agentsRaw, 10) : undefined;\n\tconst maxParallelParsed = maxParallelRaw ? Number.parseInt(maxParallelRaw, 10) : undefined;\n\n\treturn {\n\t\tmode,\n\t\tagents: Number.isInteger(agentsParsed) ? agentsParsed : undefined,\n\t\tmaxParallel: Number.isInteger(maxParallelParsed) ? maxParallelParsed : undefined,\n\t\tbody,\n\t};\n}\n\nfunction deriveOrchestrationDisplayText(promptTextWithoutDirective: string): string | undefined {\n\tconst block = parseOrchestrateBlock(promptTextWithoutDirective);\n\tif (!block) return undefined;\n\tconst taskMatch = block.body.match(/(?:^|\\n)\\s*task:\\s*(.+)$/im);\n\tconst task = taskMatch?.[1]?.trim();\n\tif (!task) return undefined;\n\tconst agentMatch = block.body.match(/(?:^|\\n)\\s*-\\s*agent\\s+\\d+:[^\\n]*\\bagent=([A-Za-z0-9._-]+)/im);\n\tconst agent = agentMatch?.[1]?.trim();\n\tif (agent) {\n\t\treturn `@${agent} ${task}`;\n\t}\n\treturn task;\n}\n\ntype PromptProtocolIssue = {\n\thasToolCallMarkup: boolean;\n\thasDelegateTaskMarkup: boolean;\n};\n\nfunction extractAssistantProtocolText(message: AssistantMessage): string {\n\tconst parts: string[] = [];\n\tfor (const content of message.content) {\n\t\tif (content.type === \"text\" && typeof content.text === \"string\" && content.text.trim()) {\n\t\t\tparts.push(content.text.trim());\n\t\t\tcontinue;\n\t\t}\n\t\tif (content.type !== \"thinking\") continue;\n\t\tconst record = content as unknown as Record<string, unknown>;\n\t\tconst thinking = record.thinking;\n\t\tif (typeof thinking === \"string\" && thinking.trim()) {\n\t\t\tparts.push(thinking.trim());\n\t\t}\n\t}\n\treturn parts.join(\"\\n\\n\").trim();\n}\n\nfunction extractAssistantVisibleText(message: AssistantMessage): string {\n\treturn message.content\n\t\t.filter((content): content is { type: \"text\"; text: string } => content.type === \"text\")\n\t\t.map((content) => content.text.trim())\n\t\t.filter((text) => text.length > 0)\n\t\t.join(\"\\n\\n\")\n\t\t.trim();\n}\n\nfunction isNonActionableVisibleAssistantText(text: string): boolean {\n\tconst trimmed = text.trim();\n\tif (trimmed.length === 0) return true;\n\treturn /^\\[\\s*output\\s+truncated[^\\]]*\\]?\\s*\\.?$/i.test(trimmed);\n}\n\nfunction detectPromptProtocolIssue(text: string): PromptProtocolIssue | undefined {\n\tconst trimmed = text.trim();\n\tif (!trimmed) return undefined;\n\n\tconst hasToolCallOpenBlock = /(^|\\n)\\s*<\\s*tool_call\\b/i.test(trimmed);\n\tconst hasToolCallCloseTag = /<\\/\\s*tool_call\\s*>/i.test(trimmed);\n\tconst hasFunctionBlock = /(^|\\n)\\s*<\\s*function\\s*=\\s*[A-Za-z0-9._:-]+/i.test(trimmed);\n\tconst hasParameterBlock = /(^|\\n)\\s*<\\s*parameter\\s*=\\s*[A-Za-z0-9._:-]+\\s*>/i.test(trimmed);\n\t// Flag only executable-looking pseudo markup; don't treat inline explanatory mentions as protocol issues.\n\tconst hasToolCallMarkup =\n\t\t(hasToolCallOpenBlock && (hasToolCallCloseTag || hasFunctionBlock || hasParameterBlock)) ||\n\t\t(hasFunctionBlock && hasParameterBlock);\n\tconst hasDelegateTaskMarkup = /<\\s*delegate_task\\b/i.test(trimmed) && /<\\/\\s*delegate_task\\s*>/i.test(trimmed);\n\n\tif (!hasToolCallMarkup && !hasDelegateTaskMarkup) return undefined;\n\treturn {\n\t\thasToolCallMarkup,\n\t\thasDelegateTaskMarkup,\n\t};\n}\n\nfunction buildPromptProtocolCorrectionPrompt(input: {\n\toriginalPrompt: string;\n\tissue: PromptProtocolIssue;\n\thasPriorToolActivity?: boolean;\n}): string {\n\tconst reasons = [\n\t\tinput.issue.hasToolCallMarkup ? \"raw <tool_call>/<function=...> markup\" : undefined,\n\t\tinput.issue.hasDelegateTaskMarkup ? \"raw <delegate_task> blocks\" : undefined,\n\t].filter((item): item is string => typeof item === \"string\");\n\tconst boundedOriginal =\n\t\tinput.originalPrompt.length > 2_000\n\t\t\t? `${input.originalPrompt.slice(0, 2_000).trimEnd()}...`\n\t\t\t: input.originalPrompt;\n\n\treturn [\n\t\t\"[TOOL_PROTOCOL_CORRECTION]\",\n\t\t`Previous assistant output included ${reasons.join(\" and \")} in plain text.`,\n\t\t\"These XML-like blocks are not executable tool calls.\",\n\t\t\"Retry now and follow this protocol exactly:\",\n\t\t\"1) Do not output XML/pseudo-call tags (<tool_call>, <function=...>, <delegate_task>).\",\n\t\t\"2) If a tool is needed, emit real structured tool calls only.\",\n\t\t\"3) Prefer structured tools when available instead of ad-hoc pseudo calls.\",\n\t\t\"4) If no tool is needed, provide a direct normal answer.\",\n\t\tinput.hasPriorToolActivity\n\t\t\t? \"5) Continue from the current in-memory state; avoid repeating already completed tool steps unless necessary.\"\n\t\t\t: undefined,\n\t\t\"Execute the original user request now.\",\n\t\t\"<original_user_request>\",\n\t\tboundedOriginal,\n\t\t\"</original_user_request>\",\n\t\t\"[/TOOL_PROTOCOL_CORRECTION]\",\n\t]\n\t\t.filter((line): line is string => typeof line === \"string\")\n\t\t.join(\"\\n\");\n}\n\nfunction buildPromptSilentStopRecoveryPrompt(input: {\n\toriginalPrompt: string;\n\thasPriorToolActivity?: boolean;\n}): string {\n\tconst boundedOriginal =\n\t\tinput.originalPrompt.length > 2_000\n\t\t\t? `${input.originalPrompt.slice(0, 2_000).trimEnd()}...`\n\t\t\t: input.originalPrompt;\n\treturn [\n\t\t\"[ASSISTANT_STALL_RECOVERY]\",\n\t\t\"Previous assistant output ended with stop but produced no visible text and no executable tool calls.\",\n\t\t\"Retry now and continue the same request.\",\n\t\t\"1) Do not return an empty response.\",\n\t\t\"2) If a tool is needed, emit real structured tool calls.\",\n\t\t\"3) If no tool is needed, provide a direct answer.\",\n\t\tinput.hasPriorToolActivity\n\t\t\t? \"4) Continue from the current in-memory state; avoid repeating already completed tool steps unless necessary.\"\n\t\t\t: undefined,\n\t\t\"Execute the original user request now.\",\n\t\t\"<original_user_request>\",\n\t\tboundedOriginal,\n\t\t\"</original_user_request>\",\n\t\t\"[/ASSISTANT_STALL_RECOVERY]\",\n\t]\n\t\t.filter((line): line is string => typeof line === \"string\")\n\t\t.join(\"\\n\");\n}\n\nfunction buildSubagentOrchestrationDirective(text: string): string | undefined {\n\tconst block = parseOrchestrateBlock(text);\n\tif (block) {\n\t\treturn [\n\t\t\t\"[ORCHESTRATION_DIRECTIVE]\",\n\t\t\t\"The user provided an explicit orchestration contract via <orchestrate>.\",\n\t\t\t\"You MUST execute this contract using the `task` tool.\",\n\t\t\t\"Before final prose, perform the required task tool calls from this contract.\",\n\t\t\t`Execution mode: ${block.mode ?? \"unspecified\"}.`,\n\t\t\t`Requested subagent count: ${block.agents ?? \"unspecified\"}.`,\n\t\t\t`Max parallel workers: ${block.maxParallel ?? \"unspecified\"}.`,\n\t\t\t\"Use one task call per agent assignment in the contract body.\",\n\t\t\t\"Each task call must include run_id and task_id when they are present in the assignment line.\",\n\t\t\t\"When parallel mode is requested, launch independent task calls up to max_parallel if provided.\",\n\t\t\t\"For parallel mode, emit independent task calls in one assistant response when possible.\",\n\t\t\t\"In parallel mode, follow parallel tool-call style and batch independent task calls together in the same turn.\",\n\t\t\t\"For write-capable parallel agents, include lock_key only when serialization is required; omit lock_key for independent read-only analyses.\",\n\t\t\t\"For orchestration contracts, keep required task calls foreground and avoid background=true unless the user explicitly asked for detached async execution.\",\n\t\t\t\"During orchestration execution, emit task calls and final synthesis only; avoid interim status prose and avoid manual polling via bash/read.\",\n\t\t\t\"When assignments can conflict on writable files, serialize those conflicting writes.\",\n\t\t\t\"Contract body:\",\n\t\t\tblock.body || \"(empty)\",\n\t\t].join(\"\\n\");\n\t}\n\n\treturn undefined;\n}\n\nfunction buildMetaProfileOrchestrationDirective(text: string): string | undefined {\n\tif (parseOrchestrateBlock(text)) {\n\t\treturn undefined;\n\t}\n\n\treturn [\n\t\t\"[META_ORCHESTRATION_DIRECTIVE]\",\n\t\t\"Session profile is meta. The root agent remains the orchestrator for this request.\",\n\t\t\"First classify the user request.\",\n\t\t\"If the request is conversational or non-repository (for example: quick Q&A, opinion, preference, explanation, rewrite, translation, casual chat), DO NOT orchestrate and DO NOT call `task`.\",\n\t\t\"For non-repository requests, answer directly as a normal chat assistant in the user's language.\",\n\t\t\"For non-repository requests, do not run tools or repository reconnaissance unless the user explicitly asks for it.\",\n\t\t\"Do not output internal reasoning or status preambles; return only the final user-facing answer.\",\n\t\t\"Only apply the orchestration rules below when the request is actionable repository work (requires reading/modifying/running/verifying workspace code or project artifacts).\",\n\t\t\"For actionable repository work, keep recon bounded and read-only, just enough to identify the workstreams.\",\n\t\t\"The main emphasis of meta mode is parallelism through top-level agents and nested delegates.\",\n\t\t\"For any non-trivial work, the main/root agent MUST orchestrate with multiple top-level `task` calls in the parent turn when independent streams exist.\",\n\t\t\"For independent streams, emit task calls in the same turn when feasible; for child streams with independent slices, require nested delegation.\",\n\t\t\"If user-specified agent/delegate counts or parallelism constraints exist, treat them as hard execution requirements.\",\n\t\t\"If you truly cannot split the work into multiple top-level tasks or nested delegates, include one line: DELEGATION_IMPOSSIBLE: <precise reason>.\",\n\t].join(\"\\n\");\n}\n\n/** Session-specific events that extend the core AgentEvent */\nexport type AgentSessionEvent =\n\t| AgentEvent\n\t| { type: \"auto_compaction_start\"; reason: \"threshold\" | \"overflow\" }\n\t| {\n\t\t\ttype: \"auto_compaction_end\";\n\t\t\tresult: CompactionResult | undefined;\n\t\t\taborted: boolean;\n\t\t\twillRetry: boolean;\n\t\t\terrorMessage?: string;\n\t }\n\t| { type: \"auto_retry_start\"; attempt: number; maxAttempts: number; delayMs: number; errorMessage: string }\n\t| { type: \"auto_retry_end\"; success: boolean; attempt: number; finalError?: string }\n\t| { type: \"meta_applied\"; step: number; text: string };\n\n/** Listener function for agent session events */\nexport type AgentSessionEventListener = (event: AgentSessionEvent) => void;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface AgentSessionConfig {\n\tagent: Agent;\n\tsessionManager: SessionManager;\n\tsettingsManager: SettingsManager;\n\tcwd: string;\n\t/** Models to cycle through with Ctrl+P (from --models flag) */\n\tscopedModels?: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>;\n\t/** Resource loader for skills, prompts, themes, context files, system prompt */\n\tresourceLoader: ResourceLoader;\n\t/** SDK custom tools registered outside extensions */\n\tcustomTools?: ToolDefinition[];\n\t/** Model registry for API key resolution and model discovery */\n\tmodelRegistry: ModelRegistry;\n\t/** Initial active built-in tool names. Default: [read, bash, edit, write] */\n\tinitialActiveToolNames?: string[];\n\t/** Override base tools (useful for custom runtimes). */\n\tbaseToolsOverride?: Record<string, AgentTool>;\n\t/** Mutable ref used by Agent to access the current ExtensionRunner */\n\textensionRunnerRef?: { current?: ExtensionRunner };\n\t/**\n\t * Extra text appended to the system prompt (after extensions).\n\t * Used to inject profile-specific instructions for the main session.\n\t */\n\tsystemPromptSuffix?: string;\n\t/** Enable IOSM runtime context injection/autopilot for this session. Default: true. */\n\tiosmAutopilotEnabled?: boolean;\n\t/** Optional active profile name for runtime prompt policies. */\n\tprofileName?: AgentProfileName | string;\n\t/** Optional permission handler called before destructive built-in tools execute. */\n\ttoolPermissionHandler?: (request: ToolPermissionRequest) => Promise<boolean>;\n}\n\nexport interface ExtensionBindings {\n\tuiContext?: ExtensionUIContext;\n\tcommandContextActions?: ExtensionCommandContextActions;\n\tshutdownHandler?: ShutdownHandler;\n\tonError?: ExtensionErrorListener;\n}\n\n/** Options for AgentSession.prompt() */\nexport interface PromptOptions {\n\t/** Whether to expand file-based prompt templates (default: true) */\n\texpandPromptTemplates?: boolean;\n\t/** Image attachments */\n\timages?: ImageContent[];\n\t/** Skip automatic IOSM runtime context injection for internal/system prompts. */\n\tskipIosmAutopilot?: boolean;\n\t/** When streaming, how to queue the message: \"steer\" (interrupt), \"followUp\" (wait), or \"meta\" (adaptive soft/pivot update). Required if streaming. */\n\tstreamingBehavior?: \"steer\" | \"followUp\" | \"meta\";\n\t/** Source of input for extension input event handlers. Defaults to \"interactive\". */\n\tsource?: InputSource;\n\t/** Skip auto-injected orchestration directive for prompts that intentionally mention agents/subagents as data. */\n\tskipOrchestrationDirective?: boolean;\n\t/** Internal safety valve: disable one-shot protocol auto-repair for this prompt call. */\n\tskipProtocolAutoRepair?: boolean;\n\t/** Internal safety valve: skip /ultrathink command interception for internal prompts. */\n\tskipUltrathinkCommand?: boolean;\n}\n\n/** Result from cycleModel() */\nexport interface ModelCycleResult {\n\tmodel: Model<any>;\n\tthinkingLevel: ThinkingLevel;\n\t/** Whether cycling through scoped models (--models flag) or all available */\n\tisScoped: boolean;\n}\n\n/** Session statistics for /session command */\nexport interface SessionStats {\n\tsessionFile: string | undefined;\n\tsessionId: string;\n\tuserMessages: number;\n\tassistantMessages: number;\n\ttoolCalls: number;\n\ttoolResults: number;\n\ttotalMessages: number;\n\ttokens: {\n\t\tinput: number;\n\t\toutput: number;\n\t\tcacheRead: number;\n\t\tcacheWrite: number;\n\t\ttotal: number;\n\t};\n\tcost: number;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Standard thinking levels */\nconst THINKING_LEVELS: ThinkingLevel[] = [\"off\", \"minimal\", \"low\", \"medium\", \"high\"];\nconst MAX_PROMPT_PROTOCOL_AUTO_REPAIR_ATTEMPTS = 2;\n\n/** Thinking levels including xhigh (for supported models) */\nconst THINKING_LEVELS_WITH_XHIGH: ThinkingLevel[] = [\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\"];\n\nconst BUILTIN_TOOL_REQUIRED_PERMISSIONS: Record<string, ToolRequiredPermission> = {\n\tbash: \"danger-full-access\",\n\tedit: \"workspace-write\",\n\twrite: \"workspace-write\",\n\tapply_patch: \"workspace-write\",\n\tfetch: \"read-only\",\n\tweb_search: \"read-only\",\n\tgit_write: \"workspace-write\",\n\tfs_ops: \"workspace-write\",\n\tdb_run: \"workspace-write\",\n};\n\n// ============================================================================\n// AgentSession Class\n// ============================================================================\n\nexport class AgentSession {\n\treadonly agent: Agent;\n\treadonly sessionManager: SessionManager;\n\treadonly settingsManager: SettingsManager;\n\n\tprivate _scopedModels: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>;\n\n\t// Event subscription state\n\tprivate _unsubscribeAgent?: () => void;\n\tprivate _eventListeners: AgentSessionEventListener[] = [];\n\tprivate _agentEventQueue: Promise<void> = Promise.resolve();\n\n\t/** Tracks pending steering messages for UI display. Removed when delivered. */\n\tprivate _steeringMessages: string[] = [];\n\t/** Tracks pending follow-up messages for UI display. Removed when delivered. */\n\tprivate _followUpMessages: string[] = [];\n\t/** Tracks pending meta messages for UI display and task-level checkpoint polling. */\n\tprivate _metaMessages: string[] = [];\n\t/** Monotonic counter for applied meta updates (displayed as \"applied at step X\"). */\n\tprivate _metaAppliedStep = 0;\n\t/** Messages queued to be included with the next user prompt as context (\"asides\"). */\n\tprivate _pendingNextTurnMessages: CustomMessage[] = [];\n\n\t// Compaction state\n\tprivate _compactionAbortController: AbortController | undefined = undefined;\n\tprivate _autoCompactionAbortController: AbortController | undefined = undefined;\n\tprivate _overflowRecoveryAttempted = false;\n\n\t// Branch summarization state\n\tprivate _branchSummaryAbortController: AbortController | undefined = undefined;\n\n\t// Retry state\n\tprivate _retryAbortController: AbortController | undefined = undefined;\n\tprivate _retryAttempt = 0;\n\tprivate _retryPromise: Promise<void> | undefined = undefined;\n\tprivate _retryResolve: (() => void) | undefined = undefined;\n\n\t// Bash execution state\n\tprivate _bashAbortController: AbortController | undefined = undefined;\n\tprivate _pendingBashMessages: BashExecutionMessage[] = [];\n\n\t// Extension system\n\tprivate _extensionRunner: ExtensionRunner | undefined = undefined;\n\tprivate _turnIndex = 0;\n\n\tprivate _resourceLoader: ResourceLoader;\n\tprivate _customTools: ToolDefinition[];\n\tprivate _baseToolRegistry: Map<string, AgentTool> = new Map();\n\tprivate _cwd: string;\n\tprivate _extensionRunnerRef?: { current?: ExtensionRunner };\n\tprivate _initialActiveToolNames?: string[];\n\tprivate _baseToolsOverride?: Record<string, AgentTool>;\n\tprivate _extensionUIContext?: ExtensionUIContext;\n\tprivate _extensionCommandContextActions?: ExtensionCommandContextActions;\n\tprivate _extensionShutdownHandler?: ShutdownHandler;\n\tprivate _extensionErrorListener?: ExtensionErrorListener;\n\tprivate _extensionErrorUnsubscriber?: () => void;\n\n\t// Model registry for API key resolution\n\tprivate _modelRegistry: ModelRegistry;\n\n\t// Tool registry for extension getTools/setTools\n\tprivate _toolRegistry: Map<string, AgentTool> = new Map();\n\tprivate _toolPromptSnippets: Map<string, string> = new Map();\n\tprivate _toolPromptGuidelines: Map<string, string[]> = new Map();\n\tprivate _toolRequiredPermissions: Map<string, ToolRequiredPermission | undefined> = new Map();\n\tprivate _subagentStartMeta = new Map<\n\t\tstring,\n\t\t{\n\t\t\tstartedAt: number;\n\t\t\tprofile: string;\n\t\t\tdescription: string;\n\t\t\tcwd?: string;\n\t\t\tagent?: string;\n\t\t\tlockKey?: string;\n\t\t\tisolation?: string;\n\t\t}\n\t>();\n\n\t// Base system prompt (without extension appends) - used to apply fresh appends each turn\n\tprivate _baseSystemPrompt = \"\";\n\tprivate _systemPromptSuffix?: string;\n\tprivate _iosmAutopilotEnabled = true;\n\tprivate _profileName?: string;\n\tprivate _toolPermissionHandler?: (request: ToolPermissionRequest) => Promise<boolean>;\n\tprivate _hooksConfig: LoadedHooksConfig = emptyHooksConfig();\n\tprivate _pendingHookNotices: Array<{ event: HookEventName; message: string }> = [];\n\tprivate _sessionTraceEnabled = isSessionTraceEnabled();\n\tprivate _sessionTracePath: string | undefined;\n\tprivate _protocolAutoRepairActive = false;\n\tprivate _ultrathinkActive = false;\n\n\tconstructor(config: AgentSessionConfig) {\n\t\tthis.agent = config.agent;\n\t\tthis.sessionManager = config.sessionManager;\n\t\tthis.settingsManager = config.settingsManager;\n\t\tthis._scopedModels = config.scopedModels ?? [];\n\t\tthis._resourceLoader = config.resourceLoader;\n\t\tthis._customTools = config.customTools ?? [];\n\t\tthis._cwd = config.cwd;\n\t\tthis._modelRegistry = config.modelRegistry;\n\t\tthis._extensionRunnerRef = config.extensionRunnerRef;\n\t\tthis._initialActiveToolNames = config.initialActiveToolNames;\n\t\tthis._baseToolsOverride = config.baseToolsOverride;\n\t\tthis._systemPromptSuffix = config.systemPromptSuffix || undefined;\n\t\tthis._iosmAutopilotEnabled = config.iosmAutopilotEnabled !== false;\n\t\tthis._profileName = config.profileName?.trim().toLowerCase() || undefined;\n\t\tthis._toolPermissionHandler = config.toolPermissionHandler;\n\t\tthis._hooksConfig = this._resourceLoader.getHooks?.() ?? emptyHooksConfig();\n\t\tthis._refreshSessionTracePath(\"session_start\");\n\n\t\t// Always subscribe to agent events for internal handling\n\t\t// (session persistence, extensions, auto-compaction, retry logic)\n\t\tthis._unsubscribeAgent = this.agent.subscribe(this._handleAgentEvent);\n\n\t\tthis._buildRuntime({\n\t\t\tactiveToolNames: this._initialActiveToolNames,\n\t\t\tincludeAllExtensionTools: true,\n\t\t});\n\t}\n\n\t/** Model registry for API key resolution and model discovery */\n\tget modelRegistry(): ModelRegistry {\n\t\treturn this._modelRegistry;\n\t}\n\n\t/** Active profile name for runtime orchestration policies. */\n\tget profileName(): string | undefined {\n\t\treturn this._profileName;\n\t}\n\n\t// =========================================================================\n\t// Event Subscription\n\t// =========================================================================\n\n\t/** Emit an event to all listeners */\n\tprivate _emit(event: AgentSessionEvent): void {\n\t\tfor (const l of this._eventListeners) {\n\t\t\tl(event);\n\t\t}\n\t}\n\n\tprivate _emitConfigChange(event: Omit<ConfigChangeEvent, \"type\">): void {\n\t\tif (!this._extensionRunner) return;\n\t\tvoid this._extensionRunner.emit({\n\t\t\ttype: \"config_change\",\n\t\t\t...event,\n\t\t});\n\t}\n\n\tprivate _refreshSessionTracePath(reason: string): void {\n\t\tif (!this._sessionTraceEnabled) {\n\t\t\tthis._sessionTracePath = undefined;\n\t\t\treturn;\n\t\t}\n\n\t\tconst sessionId = this.sessionManager.getSessionId();\n\t\tconst nextPath = getSessionTracePath(sessionId);\n\t\tthis._sessionTracePath = nextPath;\n\t\tmkdirSync(dirname(nextPath), { recursive: true });\n\n\t\tthis._appendSessionTrace({\n\t\t\ttype: \"trace_header\",\n\t\t\treason,\n\t\t\tsessionId,\n\t\t\tsessionFile: this.sessionManager.getSessionFile() ?? null,\n\t\t\tcwd: this.sessionManager.getCwd(),\n\t\t});\n\t}\n\n\tprivate _appendSessionTrace(payload: Record<string, unknown>): void {\n\t\tif (!this._sessionTraceEnabled || !this._sessionTracePath) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst entry = {\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t...payload,\n\t\t};\n\n\t\ttry {\n\t\t\tappendFileSync(\n\t\t\t\tthis._sessionTracePath,\n\t\t\t\t`${JSON.stringify(entry, (_key, value) => (typeof value === \"bigint\" ? value.toString() : value))}\\n`,\n\t\t\t\t\"utf8\",\n\t\t\t);\n\t\t} catch {\n\t\t\t// Tracing is best-effort and must not break the session runtime.\n\t\t}\n\t}\n\n\tprivate _queueHookNotices(event: HookEventName, notices: string[]): void {\n\t\tfor (const notice of notices) {\n\t\t\tconst trimmed = notice.trim();\n\t\t\tif (trimmed.length === 0) continue;\n\t\t\tthis._pendingHookNotices.push({ event, message: trimmed });\n\t\t}\n\t}\n\n\tprivate _flushHookNotices(): void {\n\t\tif (this._pendingHookNotices.length === 0) return;\n\t\tconst notices = [...this._pendingHookNotices];\n\t\tthis._pendingHookNotices = [];\n\t\tfor (const notice of notices) {\n\t\t\tthis._appendCustomMessageLocally({\n\t\t\t\tcustomType: \"hooks\",\n\t\t\t\tcontent: `[${notice.event}] ${notice.message}`,\n\t\t\t\tdisplay: true,\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate _extractToolResultText(result: unknown): string {\n\t\tif (!isRecord(result)) {\n\t\t\treturn \"\";\n\t\t}\n\t\tconst content = result.content;\n\t\tif (!Array.isArray(content)) {\n\t\t\treturn \"\";\n\t\t}\n\t\treturn content\n\t\t\t.filter((part) => isRecord(part) && part.type === \"text\" && typeof part.text === \"string\")\n\t\t\t.map((part) => String(part.text))\n\t\t\t.join(\"\\n\");\n\t}\n\n\t// Track last assistant message for auto-compaction check\n\tprivate _lastAssistantMessage: AssistantMessage | undefined = undefined;\n\tprivate _lastTaskPlanSignature: string | undefined = undefined;\n\n\t/** Internal handler for agent events - shared by subscribe and reconnect */\n\tprivate _handleAgentEvent = (event: AgentEvent): void => {\n\t\t// Create retry promise synchronously before queueing async processing.\n\t\t// Agent.emit() calls this handler synchronously, and prompt() calls waitForRetry()\n\t\t// as soon as agent.prompt() resolves. If _retryPromise is created only inside\n\t\t// _processAgentEvent, slow earlier queued events can delay agent_end processing\n\t\t// and waitForRetry() can miss the in-flight retry.\n\t\tthis._createRetryPromiseForAgentEnd(event);\n\n\t\tthis._agentEventQueue = this._agentEventQueue.then(\n\t\t\t() => this._processAgentEvent(event),\n\t\t\t() => this._processAgentEvent(event),\n\t\t);\n\n\t\t// Keep queue alive if an event handler fails\n\t\tthis._agentEventQueue.catch(() => {});\n\t};\n\n\tprivate _createRetryPromiseForAgentEnd(event: AgentEvent): void {\n\t\tif (event.type !== \"agent_end\" || this._retryPromise) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst settings = this.settingsManager.getRetrySettings();\n\t\tif (!settings.enabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst lastAssistant = this._findLastAssistantInMessages(event.messages);\n\t\tif (!lastAssistant || !this._isRetryableError(lastAssistant)) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._retryPromise = new Promise((resolve) => {\n\t\t\tthis._retryResolve = resolve;\n\t\t});\n\t}\n\n\tprivate _findLastAssistantInMessages(messages: AgentMessage[]): AssistantMessage | undefined {\n\t\tfor (let i = messages.length - 1; i >= 0; i--) {\n\t\t\tconst message = messages[i];\n\t\t\tif (message.role === \"assistant\") {\n\t\t\t\treturn message as AssistantMessage;\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate async _processAgentEvent(event: AgentEvent): Promise<void> {\n\t\tthis._appendSessionTrace({\n\t\t\ttype: \"agent_event\",\n\t\t\teventType: event.type,\n\t\t\tevent,\n\t\t});\n\n\t\tlet processedEvent = event;\n\t\tlet taskPlanSnapshot: TaskPlanSnapshot | undefined;\n\t\tif (event.type === \"message_end\" && event.message.role === \"assistant\") {\n\t\t\tconst extracted = extractTaskPlanFromAssistantMessage(event.message);\n\t\t\ttaskPlanSnapshot = extracted.planSnapshot;\n\t\t\tif (extracted.changed) {\n\t\t\t\t(event.message as AssistantMessage).content = extracted.sanitizedMessage.content;\n\t\t\t}\n\t\t}\n\n\t\t// When a user message starts, check if it's from either queue and remove it BEFORE emitting\n\t\t// This ensures the UI sees the updated queue state\n\t\tif (processedEvent.type === \"message_start\" && processedEvent.message.role === \"user\") {\n\t\t\tthis._overflowRecoveryAttempted = false;\n\t\t\tconst messageText = this._getUserMessageText(processedEvent.message);\n\t\t\tif (messageText) {\n\t\t\t\tconst metaIndex = this._metaMessages.indexOf(messageText);\n\t\t\t\tif (metaIndex !== -1) {\n\t\t\t\t\tthis._metaMessages.splice(metaIndex, 1);\n\t\t\t\t\tthis._metaAppliedStep += 1;\n\t\t\t\t\tthis._emit({ type: \"meta_applied\", step: this._metaAppliedStep, text: messageText });\n\t\t\t\t} else {\n\t\t\t\t\t// Check steering queue first\n\t\t\t\t\tconst steeringIndex = this._steeringMessages.indexOf(messageText);\n\t\t\t\t\tif (steeringIndex !== -1) {\n\t\t\t\t\t\tthis._steeringMessages.splice(steeringIndex, 1);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Check follow-up queue\n\t\t\t\t\t\tconst followUpIndex = this._followUpMessages.indexOf(messageText);\n\t\t\t\t\t\tif (followUpIndex !== -1) {\n\t\t\t\t\t\t\tthis._followUpMessages.splice(followUpIndex, 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Emit to extensions first\n\t\tawait this._emitExtensionEvent(processedEvent);\n\n\t\t// Notify all listeners\n\t\tthis._emit(processedEvent);\n\n\t\t// Handle session persistence\n\t\tif (processedEvent.type === \"message_end\") {\n\t\t\t// Check if this is a custom message from extensions\n\t\t\tif (processedEvent.message.role === \"custom\") {\n\t\t\t\t// Persist as CustomMessageEntry\n\t\t\t\tthis.sessionManager.appendCustomMessageEntry(\n\t\t\t\t\tprocessedEvent.message.customType,\n\t\t\t\t\tprocessedEvent.message.content,\n\t\t\t\t\tprocessedEvent.message.display,\n\t\t\t\t\tprocessedEvent.message.details,\n\t\t\t\t);\n\t\t\t} else if (\n\t\t\t\tprocessedEvent.message.role === \"user\" ||\n\t\t\t\tprocessedEvent.message.role === \"assistant\" ||\n\t\t\t\tprocessedEvent.message.role === \"toolResult\"\n\t\t\t) {\n\t\t\t\t// Regular LLM message - persist as SessionMessageEntry\n\t\t\t\tthis.sessionManager.appendMessage(processedEvent.message);\n\t\t\t}\n\t\t\t// Other message types (bashExecution, compactionSummary, branchSummary) are persisted elsewhere\n\n\t\t\t// Track assistant message for auto-compaction (checked on agent_end)\n\t\t\tif (processedEvent.message.role === \"assistant\") {\n\t\t\t\tthis._lastAssistantMessage = processedEvent.message;\n\n\t\t\t\tconst assistantMsg = processedEvent.message as AssistantMessage;\n\t\t\t\tif (assistantMsg.stopReason !== \"error\") {\n\t\t\t\t\tthis._overflowRecoveryAttempted = false;\n\t\t\t\t}\n\n\t\t\t\t// Reset retry counter immediately on successful assistant response\n\t\t\t\t// This prevents accumulation across multiple LLM calls within a turn\n\t\t\t\tif (assistantMsg.stopReason !== \"error\" && this._retryAttempt > 0) {\n\t\t\t\t\tthis._emit({\n\t\t\t\t\t\ttype: \"auto_retry_end\",\n\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\tattempt: this._retryAttempt,\n\t\t\t\t\t});\n\t\t\t\t\tthis._retryAttempt = 0;\n\t\t\t\t\tthis._resolveRetry();\n\t\t\t\t}\n\n\t\t\t\tif (taskPlanSnapshot) {\n\t\t\t\t\tconst signature = taskPlanSignature(taskPlanSnapshot);\n\t\t\t\t\tif (signature !== this._lastTaskPlanSignature) {\n\t\t\t\t\t\tthis._lastTaskPlanSignature = signature;\n\t\t\t\t\t\tthis._appendCustomMessageLocally({\n\t\t\t\t\t\t\tcustomType: TASK_PLAN_CUSTOM_TYPE,\n\t\t\t\t\t\t\tcontent: formatTaskPlanMessageContent(taskPlanSnapshot),\n\t\t\t\t\t\t\tdisplay: true,\n\t\t\t\t\t\t\tdetails: taskPlanSnapshot,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (processedEvent.type === \"tool_execution_end\") {\n\t\t\tconst notices = applyPostToolUseHooks(this._hooksConfig, {\n\t\t\t\ttoolName: processedEvent.toolName,\n\t\t\t\toutputText: this._extractToolResultText(processedEvent.result),\n\t\t\t\tisError: processedEvent.isError,\n\t\t\t});\n\t\t\tthis._queueHookNotices(\"PostToolUse\", notices);\n\t\t}\n\n\t\t// Check auto-retry and auto-compaction after agent completes\n\t\tif (processedEvent.type === \"agent_end\" && this._lastAssistantMessage) {\n\t\t\tconst msg = this._lastAssistantMessage;\n\t\t\tthis._lastAssistantMessage = undefined;\n\n\t\t\t// Check for retryable errors first (overloaded, rate limit, server errors)\n\t\t\tif (this._isRetryableError(msg)) {\n\t\t\t\tconst didRetry = await this._handleRetryableError(msg);\n\t\t\t\tif (didRetry) return; // Retry was initiated, don't proceed to compaction\n\t\t\t}\n\n\t\t\tawait this._checkCompaction(msg);\n\t\t}\n\n\t\tif (processedEvent.type === \"agent_end\") {\n\t\t\tthis._flushHookNotices();\n\t\t}\n\t}\n\n\t/** Resolve the pending retry promise */\n\tprivate _resolveRetry(): void {\n\t\tif (this._retryResolve) {\n\t\t\tthis._retryResolve();\n\t\t\tthis._retryResolve = undefined;\n\t\t\tthis._retryPromise = undefined;\n\t\t}\n\t}\n\n\t/** Extract text content from a message */\n\tprivate _getUserMessageText(message: Message): string {\n\t\tif (message.role !== \"user\") return \"\";\n\t\tconst content = message.content;\n\t\tif (typeof content === \"string\") return content;\n\t\tconst textBlocks = content.filter((c) => c.type === \"text\");\n\t\treturn textBlocks.map((c) => (c as TextContent).text).join(\"\");\n\t}\n\n\t/** Find the last assistant message in agent state (including aborted ones) */\n\tprivate _findLastAssistantMessage(): AssistantMessage | undefined {\n\t\tconst messages = this.agent.state.messages;\n\t\tfor (let i = messages.length - 1; i >= 0; i--) {\n\t\t\tconst msg = messages[i];\n\t\t\tif (msg.role === \"assistant\") {\n\t\t\t\treturn msg as AssistantMessage;\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t/** Emit extension events based on agent events */\n\tprivate async _emitExtensionEvent(event: AgentEvent): Promise<void> {\n\t\tif (!this._extensionRunner) return;\n\n\t\tif (event.type === \"agent_start\") {\n\t\t\tthis._turnIndex = 0;\n\t\t\tawait this._extensionRunner.emit({ type: \"agent_start\" });\n\t\t} else if (event.type === \"agent_end\") {\n\t\t\tawait this._extensionRunner.emit({ type: \"agent_end\", messages: event.messages });\n\t\t} else if (event.type === \"turn_start\") {\n\t\t\tconst extensionEvent: TurnStartEvent = {\n\t\t\t\ttype: \"turn_start\",\n\t\t\t\tturnIndex: this._turnIndex,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t};\n\t\t\tawait this._extensionRunner.emit(extensionEvent);\n\t\t} else if (event.type === \"turn_end\") {\n\t\t\tconst extensionEvent: TurnEndEvent = {\n\t\t\t\ttype: \"turn_end\",\n\t\t\t\tturnIndex: this._turnIndex,\n\t\t\t\tmessage: event.message,\n\t\t\t\ttoolResults: event.toolResults,\n\t\t\t};\n\t\t\tawait this._extensionRunner.emit(extensionEvent);\n\t\t\tthis._turnIndex++;\n\t\t} else if (event.type === \"message_start\") {\n\t\t\tconst extensionEvent: MessageStartEvent = {\n\t\t\t\ttype: \"message_start\",\n\t\t\t\tmessage: event.message,\n\t\t\t};\n\t\t\tawait this._extensionRunner.emit(extensionEvent);\n\t\t} else if (event.type === \"message_update\") {\n\t\t\tconst extensionEvent: MessageUpdateEvent = {\n\t\t\t\ttype: \"message_update\",\n\t\t\t\tmessage: event.message,\n\t\t\t\tassistantMessageEvent: event.assistantMessageEvent,\n\t\t\t};\n\t\t\tawait this._extensionRunner.emit(extensionEvent);\n\t\t} else if (event.type === \"message_end\") {\n\t\t\tconst extensionEvent: MessageEndEvent = {\n\t\t\t\ttype: \"message_end\",\n\t\t\t\tmessage: event.message,\n\t\t\t};\n\t\t\tawait this._extensionRunner.emit(extensionEvent);\n\t\t} else if (event.type === \"tool_execution_start\") {\n\t\t\tconst extensionEvent: ToolExecutionStartEvent = {\n\t\t\t\ttype: \"tool_execution_start\",\n\t\t\t\ttoolCallId: event.toolCallId,\n\t\t\t\ttoolName: event.toolName,\n\t\t\t\targs: event.args,\n\t\t\t};\n\t\t\tawait this._extensionRunner.emit(extensionEvent);\n\t\t\tif (event.toolName === \"task\") {\n\t\t\t\tconst args = event.args as {\n\t\t\t\t\tdescription?: string;\n\t\t\t\t\tprofile?: string;\n\t\t\t\t\tcwd?: string;\n\t\t\t\t\tagent?: string;\n\t\t\t\t\tlock_key?: string;\n\t\t\t\t\tisolation?: string;\n\t\t\t\t};\n\t\t\t\tconst description = args.description ?? \"Running subtask\";\n\t\t\t\tconst profile = args.profile ?? \"full\";\n\t\t\t\tthis._subagentStartMeta.set(event.toolCallId, {\n\t\t\t\t\tstartedAt: Date.now(),\n\t\t\t\t\tprofile,\n\t\t\t\t\tdescription,\n\t\t\t\t\tcwd: args.cwd,\n\t\t\t\t\tagent: args.agent,\n\t\t\t\t\tlockKey: args.lock_key,\n\t\t\t\t\tisolation: args.isolation,\n\t\t\t\t});\n\t\t\t\tconst subagentStart: SubagentStartEvent = {\n\t\t\t\t\ttype: \"subagent_start\",\n\t\t\t\t\ttoolCallId: event.toolCallId,\n\t\t\t\t\tdescription,\n\t\t\t\t\tprofile,\n\t\t\t\t\tcwd: args.cwd,\n\t\t\t\t\tagent: args.agent,\n\t\t\t\t\tlockKey: args.lock_key,\n\t\t\t\t\tisolation: args.isolation,\n\t\t\t\t};\n\t\t\t\tawait this._extensionRunner.emit(subagentStart);\n\t\t\t}\n\t\t} else if (event.type === \"tool_execution_update\") {\n\t\t\tconst extensionEvent: ToolExecutionUpdateEvent = {\n\t\t\t\ttype: \"tool_execution_update\",\n\t\t\t\ttoolCallId: event.toolCallId,\n\t\t\t\ttoolName: event.toolName,\n\t\t\t\targs: event.args,\n\t\t\t\tpartialResult: event.partialResult,\n\t\t\t};\n\t\t\tawait this._extensionRunner.emit(extensionEvent);\n\t\t} else if (event.type === \"tool_execution_end\") {\n\t\t\tconst extensionEvent: ToolExecutionEndEvent = {\n\t\t\t\ttype: \"tool_execution_end\",\n\t\t\t\ttoolCallId: event.toolCallId,\n\t\t\t\ttoolName: event.toolName,\n\t\t\t\tresult: event.result,\n\t\t\t\tisError: event.isError,\n\t\t\t};\n\t\t\tawait this._extensionRunner.emit(extensionEvent);\n\t\t\tif (event.toolName === \"task\") {\n\t\t\t\tconst startMeta = this._subagentStartMeta.get(event.toolCallId);\n\t\t\t\tthis._subagentStartMeta.delete(event.toolCallId);\n\t\t\t\tconst details = event.result?.details as Record<string, unknown> | undefined;\n\t\t\t\tconst outputLength = typeof details?.outputLength === \"number\" ? details.outputLength : undefined;\n\t\t\t\tconst runId = typeof details?.runId === \"string\" ? details.runId : undefined;\n\t\t\t\tconst status: \"done\" | \"error\" | \"cancelled\" = event.isError ? \"error\" : \"done\";\n\t\t\t\tconst errorMessage = event.isError\n\t\t\t\t\t? (event.result?.content?.[0] as { text?: string } | undefined)?.text\n\t\t\t\t\t: undefined;\n\t\t\t\tconst durationMs = Math.max(0, Date.now() - (startMeta?.startedAt ?? Date.now()));\n\t\t\t\tconst profile = startMeta?.profile ?? \"full\";\n\t\t\t\tconst description = startMeta?.description ?? \"Running subtask\";\n\t\t\t\tconst subagentStop: SubagentStopEvent = {\n\t\t\t\t\ttype: \"subagent_stop\",\n\t\t\t\t\ttoolCallId: event.toolCallId,\n\t\t\t\t\tdescription,\n\t\t\t\t\tprofile,\n\t\t\t\t\tstatus,\n\t\t\t\t\tdurationMs,\n\t\t\t\t\toutputLength,\n\t\t\t\t\trunId,\n\t\t\t\t\terrorMessage,\n\t\t\t\t\tcwd: startMeta?.cwd,\n\t\t\t\t\tagent: startMeta?.agent,\n\t\t\t\t\tlockKey: startMeta?.lockKey,\n\t\t\t\t\tisolation: startMeta?.isolation,\n\t\t\t\t};\n\t\t\t\tawait this._extensionRunner.emit(subagentStop);\n\t\t\t\tconst taskCompleted: TaskCompletedEvent = {\n\t\t\t\t\ttype: \"task_completed\",\n\t\t\t\t\ttoolCallId: event.toolCallId,\n\t\t\t\t\tstatus,\n\t\t\t\t\tprofile,\n\t\t\t\t\tdescription,\n\t\t\t\t\tdurationMs,\n\t\t\t\t\toutputLength,\n\t\t\t\t\trunId,\n\t\t\t\t\terrorMessage,\n\t\t\t\t};\n\t\t\t\tawait this._extensionRunner.emit(taskCompleted);\n\t\t\t\tif (this._subagentStartMeta.size === 0) {\n\t\t\t\t\tconst teammateIdle: TeammateIdleEvent = {\n\t\t\t\t\t\ttype: \"teammate_idle\",\n\t\t\t\t\t\tactiveSubagents: 0,\n\t\t\t\t\t\tlastCompletedToolCallId: event.toolCallId,\n\t\t\t\t\t};\n\t\t\t\t\tawait this._extensionRunner.emit(teammateIdle);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Subscribe to agent events.\n\t * Session persistence is handled internally (saves messages on message_end).\n\t * Multiple listeners can be added. Returns unsubscribe function for this listener.\n\t */\n\tsubscribe(listener: AgentSessionEventListener): () => void {\n\t\tthis._eventListeners.push(listener);\n\n\t\t// Return unsubscribe function for this specific listener\n\t\treturn () => {\n\t\t\tconst index = this._eventListeners.indexOf(listener);\n\t\t\tif (index !== -1) {\n\t\t\t\tthis._eventListeners.splice(index, 1);\n\t\t\t}\n\t\t};\n\t}\n\n\t/**\n\t * Temporarily disconnect from agent events.\n\t * User listeners are preserved and will receive events again after resubscribe().\n\t * Used internally during operations that need to pause event processing.\n\t */\n\tprivate _disconnectFromAgent(): void {\n\t\tif (this._unsubscribeAgent) {\n\t\t\tthis._unsubscribeAgent();\n\t\t\tthis._unsubscribeAgent = undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Reconnect to agent events after _disconnectFromAgent().\n\t * Preserves all existing listeners.\n\t */\n\tprivate _reconnectToAgent(): void {\n\t\tif (this._unsubscribeAgent) return; // Already connected\n\t\tthis._unsubscribeAgent = this.agent.subscribe(this._handleAgentEvent);\n\t}\n\n\t/**\n\t * Remove all listeners and disconnect from agent.\n\t * Call this when completely done with the session.\n\t */\n\tdispose(): void {\n\t\tthis._disconnectFromAgent();\n\t\tthis._eventListeners = [];\n\t}\n\n\t// =========================================================================\n\t// Read-only State Access\n\t// =========================================================================\n\n\t/** Full agent state */\n\tget state(): AgentState {\n\t\treturn this.agent.state;\n\t}\n\n\t/** Current model (may be undefined if not yet selected) */\n\tget model(): Model<any> | undefined {\n\t\treturn this.agent.state.model;\n\t}\n\n\t/** Current thinking level */\n\tget thinkingLevel(): ThinkingLevel {\n\t\treturn this.agent.state.thinkingLevel;\n\t}\n\n\t/** Whether agent is currently streaming a response */\n\tget isStreaming(): boolean {\n\t\treturn this.agent.state.isStreaming;\n\t}\n\n\t/** Current effective system prompt (includes any per-turn extension modifications) */\n\tget systemPrompt(): string {\n\t\treturn this.agent.state.systemPrompt;\n\t}\n\n\t/** Current retry attempt (0 if not retrying) */\n\tget retryAttempt(): number {\n\t\treturn this._retryAttempt;\n\t}\n\n\t/**\n\t * Get the names of currently active tools.\n\t * Returns the names of tools currently set on the agent.\n\t */\n\tgetActiveToolNames(): string[] {\n\t\treturn this.agent.state.tools.map((t) => t.name);\n\t}\n\n\t/**\n\t * Get all configured tools with name, description, and parameter schema.\n\t */\n\tgetAllTools(): ToolInfo[] {\n\t\treturn Array.from(this._toolRegistry.values()).map((t) => ({\n\t\t\tname: t.name,\n\t\t\tdescription: t.description,\n\t\t\tparameters: t.parameters,\n\t\t}));\n\t}\n\n\t/**\n\t * Set active tools by name.\n\t * Only tools in the registry can be enabled. Unknown tool names are ignored.\n\t * Also rebuilds the system prompt to reflect the new tool set.\n\t * Changes take effect on the next agent turn.\n\t */\n\tsetActiveToolsByName(toolNames: string[]): void {\n\t\tconst previousTools = this.getActiveToolNames();\n\t\tconst tools: AgentTool[] = [];\n\t\tconst validToolNames: string[] = [];\n\t\tfor (const name of toolNames) {\n\t\t\tconst tool = this._toolRegistry.get(name);\n\t\t\tif (tool) {\n\t\t\t\ttools.push(tool);\n\t\t\t\tvalidToolNames.push(name);\n\t\t\t}\n\t\t}\n\t\tthis.agent.setTools(tools);\n\n\t\t// Rebuild base system prompt with new tool set\n\t\tthis._baseSystemPrompt = this._rebuildSystemPrompt(validToolNames);\n\t\tthis.agent.setSystemPrompt(this._baseSystemPrompt);\n\t\tthis._emitConfigChange({\n\t\t\tkey: \"active_tools\",\n\t\t\tprevious: previousTools,\n\t\t\tcurrent: validToolNames,\n\t\t});\n\t}\n\n\t/**\n\t * Set or clear the profile-specific system prompt suffix.\n\t * Rebuilds and reapplies the base system prompt immediately.\n\t */\n\tsetSystemPromptSuffix(suffix?: string): void {\n\t\tconst previousSuffix = this._systemPromptSuffix;\n\t\tconst nextSuffix = suffix?.trim();\n\t\tthis._systemPromptSuffix = nextSuffix && nextSuffix.length > 0 ? nextSuffix : undefined;\n\t\tthis._baseSystemPrompt = this._rebuildSystemPrompt(this.getActiveToolNames());\n\t\tthis.agent.setSystemPrompt(this._baseSystemPrompt);\n\t\tthis._emitConfigChange({\n\t\t\tkey: \"system_prompt_suffix\",\n\t\t\tprevious: previousSuffix,\n\t\t\tcurrent: this._systemPromptSuffix,\n\t\t});\n\t}\n\n\tsetIosmAutopilotEnabled(enabled: boolean): void {\n\t\tconst previous = this._iosmAutopilotEnabled;\n\t\tthis._iosmAutopilotEnabled = enabled;\n\t\tthis._baseSystemPrompt = this._rebuildSystemPrompt(this.getActiveToolNames());\n\t\tthis.agent.setSystemPrompt(this._baseSystemPrompt);\n\t\tthis._emitConfigChange({\n\t\t\tkey: \"iosm_autopilot_enabled\",\n\t\t\tprevious,\n\t\t\tcurrent: enabled,\n\t\t});\n\t}\n\n\tsetProfileName(profileName?: string): void {\n\t\tconst previous = this._profileName;\n\t\tconst normalized = profileName?.trim().toLowerCase();\n\t\tthis._profileName = normalized && normalized.length > 0 ? normalized : undefined;\n\t\tthis._emitConfigChange({\n\t\t\tkey: \"profile_name\",\n\t\t\tprevious,\n\t\t\tcurrent: this._profileName,\n\t\t});\n\t}\n\n\tsetToolPermissionHandler(handler?: (request: ToolPermissionRequest) => Promise<boolean>): void {\n\t\tthis._toolPermissionHandler = handler;\n\t\tthis._buildRuntime({\n\t\t\tactiveToolNames: this.getActiveToolNames(),\n\t\t\tincludeAllExtensionTools: true,\n\t\t});\n\t}\n\n\tsetCustomTools(customTools: ToolDefinition[]): void {\n\t\tthis._customTools = [...customTools];\n\t\tthis._buildRuntime({\n\t\t\tactiveToolNames: this.getActiveToolNames(),\n\t\t\tincludeAllExtensionTools: true,\n\t\t});\n\t}\n\n\t/** Whether compaction or branch summarization is currently running */\n\tget isCompacting(): boolean {\n\t\treturn (\n\t\t\tthis._autoCompactionAbortController !== undefined ||\n\t\t\tthis._compactionAbortController !== undefined ||\n\t\t\tthis._branchSummaryAbortController !== undefined\n\t\t);\n\t}\n\n\t/** All messages including custom types like BashExecutionMessage */\n\tget messages(): AgentMessage[] {\n\t\treturn this.agent.state.messages;\n\t}\n\n\t/** Current steering mode */\n\tget steeringMode(): \"all\" | \"one-at-a-time\" {\n\t\treturn this.agent.getSteeringMode();\n\t}\n\n\t/** Current follow-up mode */\n\tget followUpMode(): \"all\" | \"one-at-a-time\" {\n\t\treturn this.agent.getFollowUpMode();\n\t}\n\n\t/** Current session file path, or undefined if sessions are disabled */\n\tget sessionFile(): string | undefined {\n\t\treturn this.sessionManager.getSessionFile();\n\t}\n\n\t/** Current session ID */\n\tget sessionId(): string {\n\t\treturn this.sessionManager.getSessionId();\n\t}\n\n\t/** Whether full session trace logging is currently enabled for this session. */\n\tget isSessionTraceOn(): boolean {\n\t\treturn this._sessionTraceEnabled;\n\t}\n\n\t/** Absolute path to the current session trace JSONL file, when tracing is enabled. */\n\tget sessionTracePath(): string | undefined {\n\t\treturn this._sessionTracePath;\n\t}\n\n\t/** Enable full session trace logging for the current runtime session. */\n\tenableSessionTrace(): void {\n\t\tif (this._sessionTraceEnabled) {\n\t\t\treturn;\n\t\t}\n\t\tthis._sessionTraceEnabled = true;\n\t\tthis._refreshSessionTracePath(\"session_trace_enabled\");\n\t}\n\n\t/** Append an arbitrary runtime trace event when session tracing is enabled. */\n\tappendRuntimeTrace(type: string, payload: Record<string, unknown>): void {\n\t\tthis._appendSessionTrace({\n\t\t\ttype,\n\t\t\t...payload,\n\t\t});\n\t}\n\n\t/** Current session display name, if set */\n\tget sessionName(): string | undefined {\n\t\treturn this.sessionManager.getSessionName();\n\t}\n\n\t/** Scoped models for cycling (from --models flag) */\n\tget scopedModels(): ReadonlyArray<{ model: Model<any>; thinkingLevel?: ThinkingLevel }> {\n\t\treturn this._scopedModels;\n\t}\n\n\t/** Update scoped models for cycling */\n\tsetScopedModels(scopedModels: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>): void {\n\t\tthis._scopedModels = scopedModels;\n\t}\n\n\t/** File-based prompt templates */\n\tget promptTemplates(): ReadonlyArray<PromptTemplate> {\n\t\treturn this._resourceLoader.getPrompts().prompts;\n\t}\n\n\tprivate _normalizePromptSnippet(text: string | undefined): string | undefined {\n\t\tif (!text) return undefined;\n\t\tconst oneLine = text\n\t\t\t.replace(/[\\r\\n]+/g, \" \")\n\t\t\t.replace(/\\s+/g, \" \")\n\t\t\t.trim();\n\t\treturn oneLine.length > 0 ? oneLine : undefined;\n\t}\n\n\tprivate _normalizePromptGuidelines(guidelines: string[] | undefined): string[] {\n\t\tif (!guidelines || guidelines.length === 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst unique = new Set<string>();\n\t\tfor (const guideline of guidelines) {\n\t\t\tconst normalized = guideline.trim();\n\t\t\tif (normalized.length > 0) {\n\t\t\t\tunique.add(normalized);\n\t\t\t}\n\t\t}\n\t\treturn Array.from(unique);\n\t}\n\n\tprivate _summarizeToolPermissionInput(input: Record<string, unknown>): string {\n\t\tlet preview = \"{}\";\n\t\ttry {\n\t\t\tpreview = JSON.stringify(input);\n\t\t} catch {\n\t\t\tpreview = \"{...}\";\n\t\t}\n\t\tif (preview.length > 200) {\n\t\t\tpreview = `${preview.slice(0, 197)}...`;\n\t\t}\n\t\treturn preview;\n\t}\n\n\tprivate _captureGitSnapshotCommand(args: string[]): string | undefined {\n\t\tconst result = spawnSync(\"git\", [\"-C\", this._cwd, ...args], {\n\t\t\tencoding: \"utf8\",\n\t\t\tmaxBuffer: GIT_SNAPSHOT_CAPTURE_MAX_BUFFER,\n\t\t});\n\t\tif (result.status !== 0) return undefined;\n\t\tconst output = typeof result.stdout === \"string\" ? result.stdout.trim() : \"\";\n\t\treturn output.length > 0 ? output : undefined;\n\t}\n\n\tprivate _buildGitSnapshotContext(maxChars: number): {\n\t\tgitSnapshotContext: { path?: string; content: string } | undefined;\n\t\tdiagnostics: GitSnapshotContextDiagnostics;\n\t} {\n\t\tconst diagnostics: GitSnapshotContextDiagnostics = {\n\t\t\tbeforeChars: 0,\n\t\t\tafterChars: 0,\n\t\t\ttruncated: false,\n\t\t\tincluded: false,\n\t\t};\n\n\t\tconst sections: string[] = [];\n\t\tconst status = this._captureGitSnapshotCommand([\"status\", \"--porcelain=v1\", \"--branch\"]);\n\t\tif (status) {\n\t\t\tsections.push(`### git status --porcelain --branch\\n${status}`);\n\t\t}\n\t\tconst diffStat = this._captureGitSnapshotCommand([\"diff\", \"--stat\", \"--no-color\"]);\n\t\tif (diffStat) {\n\t\t\tsections.push(`### git diff --stat\\n${diffStat}`);\n\t\t}\n\t\tconst stagedDiffStat = this._captureGitSnapshotCommand([\"diff\", \"--cached\", \"--stat\", \"--no-color\"]);\n\t\tif (stagedDiffStat) {\n\t\t\tsections.push(`### git diff --cached --stat\\n${stagedDiffStat}`);\n\t\t}\n\n\t\tif (sections.length === 0) {\n\t\t\treturn {\n\t\t\t\tgitSnapshotContext: undefined,\n\t\t\t\tdiagnostics,\n\t\t\t};\n\t\t}\n\n\t\tconst combined = sections.join(\"\\n\\n\").trim();\n\t\tdiagnostics.beforeChars = combined.length;\n\n\t\tlet content = combined;\n\t\tif (content.length > maxChars) {\n\t\t\tconst marker = \"\\n\\n...[git snapshot truncated]...\";\n\t\t\tconst safeBudget = Math.max(0, maxChars - marker.length);\n\t\t\tconst sliced = content.slice(0, safeBudget).trimEnd();\n\t\t\tcontent = `${sliced}${marker}`;\n\t\t\tdiagnostics.truncated = true;\n\t\t}\n\t\tcontent = content.trim();\n\t\tdiagnostics.afterChars = content.length;\n\t\tdiagnostics.included = content.length > 0;\n\n\t\treturn {\n\t\t\tgitSnapshotContext: diagnostics.included\n\t\t\t\t? {\n\t\t\t\t\t\tpath: \"[git-snapshot]\",\n\t\t\t\t\t\tcontent,\n\t\t\t\t\t}\n\t\t\t\t: undefined,\n\t\t\tdiagnostics,\n\t\t};\n\t}\n\n\tprivate async _evaluateToolPermission(request: ToolPermissionRequest): Promise<boolean> {\n\t\tconst normalizedRequest: ToolPermissionRequest = {\n\t\t\t...request,\n\t\t\trequiredPermission:\n\t\t\t\trequest.requiredPermission ?? this._toolRequiredPermissions.get(request.toolName) ?? undefined,\n\t\t\ttoolSource: request.toolSource ?? \"builtin\",\n\t\t};\n\t\tconst hookResult = applyPreToolUseHooks(this._hooksConfig, normalizedRequest);\n\t\tthis._queueHookNotices(\"PreToolUse\", hookResult.notices);\n\t\tif (!hookResult.allowed) {\n\t\t\tthrow new Error(hookResult.message ?? \"Tool blocked by PreToolUse hook.\");\n\t\t}\n\t\treturn this._toolPermissionHandler ? this._toolPermissionHandler(normalizedRequest) : true;\n\t}\n\n\tprivate _rebuildSystemPrompt(toolNames: string[]): string {\n\t\tconst validToolNames = toolNames.filter((name) => this._toolRegistry.has(name));\n\t\tconst toolSnippets: Record<string, string> = {};\n\t\tconst promptGuidelines: string[] = [];\n\t\tfor (const name of validToolNames) {\n\t\t\tconst snippet = this._toolPromptSnippets.get(name);\n\t\t\tif (snippet) {\n\t\t\t\ttoolSnippets[name] = snippet;\n\t\t\t}\n\n\t\t\tconst toolGuidelines = this._toolPromptGuidelines.get(name);\n\t\t\tif (toolGuidelines) {\n\t\t\t\tpromptGuidelines.push(...toolGuidelines);\n\t\t\t}\n\t\t}\n\n\t\tconst loaderSystemPrompt = this._resourceLoader.getSystemPrompt();\n\t\tconst loaderAppendSystemPrompt = this._resourceLoader.getAppendSystemPrompt();\n\t\tconst allAppends = [...loaderAppendSystemPrompt];\n\t\tif (this._systemPromptSuffix) allAppends.push(this._systemPromptSuffix);\n\t\tconst appendSystemPrompt = allAppends.length > 0 ? allAppends.join(\"\\n\\n\") : undefined;\n\t\tconst loadedSkills = this._resourceLoader.getSkills().skills;\n\t\tconst loadedContextFiles = this._resourceLoader\n\t\t\t.getAgentsFiles()\n\t\t\t.agentsFiles.filter((file) => {\n\t\t\t\tconst normalized = file.path.replace(/\\\\/g, \"/\");\n\t\t\t\tconst isIosmPlaybook = normalized.endsWith(\"/IOSM.md\");\n\t\t\t\tconst isAgentsPlaybook = normalized.endsWith(\"/AGENTS.md\");\n\t\t\t\tif (!isIosmPlaybook && !isAgentsPlaybook) return true;\n\t\t\t\treturn this._iosmAutopilotEnabled ? isIosmPlaybook : isAgentsPlaybook;\n\t\t\t});\n\n\t\tconst promptContextOptions = {\n\t\t\tenableContextDedupe: this.settingsManager.getPromptContextEnableDedupe(),\n\t\t\tmaxContextCharsPerFile: this.settingsManager.getPromptContextMaxCharsPerFile(),\n\t\t\tmaxTotalContextChars: this.settingsManager.getPromptContextMaxTotalChars(),\n\t\t\tenableGitSnapshotContext: this.settingsManager.getPromptContextEnableGitSnapshotContext(),\n\t\t};\n\t\tconst gitSnapshotMaxChars = this.settingsManager.getPromptContextGitSnapshotMaxChars();\n\t\tconst gitSnapshotResult = promptContextOptions.enableGitSnapshotContext\n\t\t\t? this._buildGitSnapshotContext(gitSnapshotMaxChars)\n\t\t\t: {\n\t\t\t\t\tgitSnapshotContext: undefined,\n\t\t\t\t\tdiagnostics: {\n\t\t\t\t\t\tbeforeChars: 0,\n\t\t\t\t\t\tafterChars: 0,\n\t\t\t\t\t\ttruncated: false,\n\t\t\t\t\t\tincluded: false,\n\t\t\t\t\t} as GitSnapshotContextDiagnostics,\n\t\t\t\t};\n\n\t\treturn buildSystemPrompt({\n\t\t\tcwd: this._cwd,\n\t\t\tskills: loadedSkills,\n\t\t\tcontextFiles: loadedContextFiles,\n\t\t\tgitSnapshotContext: gitSnapshotResult.gitSnapshotContext,\n\t\t\tcontextProcessing: promptContextOptions,\n\t\t\tcustomPrompt: loaderSystemPrompt,\n\t\t\tappendSystemPrompt,\n\t\t\tselectedTools: validToolNames,\n\t\t\ttoolSnippets,\n\t\t\tpromptGuidelines,\n\t\t\tonContextProcessed: (stats) => {\n\t\t\t\tthis._appendSessionTrace({\n\t\t\t\t\ttype: \"system_prompt_context_compose\",\n\t\t\t\t\tcontext_before_chars: stats.contextBeforeChars,\n\t\t\t\t\tcontext_after_chars: stats.contextAfterChars,\n\t\t\t\t\tdedupe_hits: stats.dedupeHits,\n\t\t\t\t\ttruncated_files: stats.truncatedFiles,\n\t\t\t\t\tdropped_files: stats.droppedFiles,\n\t\t\t\t\tincluded_files: stats.includedFiles,\n\t\t\t\t\ttotal_files: stats.totalFiles,\n\t\t\t\t\tgit_snapshot_included: stats.gitSnapshotIncluded,\n\t\t\t\t\tgit_snapshot_chars_before: gitSnapshotResult.diagnostics.beforeChars,\n\t\t\t\t\tgit_snapshot_chars_after: gitSnapshotResult.diagnostics.afterChars,\n\t\t\t\t\tgit_snapshot_truncated: gitSnapshotResult.diagnostics.truncated,\n\t\t\t\t\tgit_snapshot_max_chars: gitSnapshotMaxChars,\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\t}\n\n\t// =========================================================================\n\t// Prompting\n\t// =========================================================================\n\n\t/**\n\t * Send a prompt to the agent.\n\t * - Handles extension commands (registered via iosm.registerCommand) immediately, even during streaming\n\t * - Expands file-based prompt templates by default\n\t * - During streaming, queues via steer() or followUp() based on streamingBehavior option\n\t * - Validates model and API key before sending (when not streaming)\n\t * @throws Error if streaming and no streamingBehavior specified\n\t * @throws Error if no model selected or no API key available (when not streaming)\n\t */\n\tasync prompt(text: string, options?: PromptOptions): Promise<void> {\n\t\tconst expandPromptTemplates = options?.expandPromptTemplates ?? true;\n\t\tconst inputSource = options?.source ?? \"interactive\";\n\t\tthis._appendSessionTrace({\n\t\t\ttype: \"prompt_start\",\n\t\t\ttext,\n\t\t\texpandPromptTemplates,\n\t\t\tsource: inputSource,\n\t\t\timageCount: options?.images?.length ?? 0,\n\t\t});\n\n\t\tif (!options?.skipUltrathinkCommand) {\n\t\t\tconst ultrathinkParseResult = parseUltrathinkCommand(text);\n\t\t\tif (ultrathinkParseResult?.kind === \"error\") {\n\t\t\t\tthrow new Error(`${ultrathinkParseResult.error}\\n\\n${ultrathinkParseResult.usage}`);\n\t\t\t}\n\t\t\tif (ultrathinkParseResult?.kind === \"command\") {\n\t\t\t\tawait this._runUltrathinkCommand(ultrathinkParseResult.command, { source: inputSource });\n\t\t\t\tthis._appendSessionTrace({\n\t\t\t\t\ttype: \"prompt_handled_by_command\",\n\t\t\t\t\ttext,\n\t\t\t\t\tcommand: \"ultrathink\",\n\t\t\t\t\titerations: ultrathinkParseResult.command.iterations,\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Handle extension commands first (execute immediately, even during streaming)\n\t\t// Extension commands manage their own LLM interaction via iosm.sendMessage()\n\t\tif (expandPromptTemplates && text.startsWith(\"/\")) {\n\t\t\tconst handled = await this._tryExecuteExtensionCommand(text);\n\t\t\tif (handled) {\n\t\t\t\tthis._appendSessionTrace({\n\t\t\t\t\ttype: \"prompt_handled_by_command\",\n\t\t\t\t\ttext,\n\t\t\t\t});\n\t\t\t\t// Extension command executed, no prompt to send\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Emit input event for extension interception (before skill/template expansion)\n\t\tlet currentText = text;\n\t\tlet currentImages = options?.images;\n\t\tif (this._extensionRunner?.hasHandlers(\"input\")) {\n\t\t\tconst inputResult = await this._extensionRunner.emitInput(\n\t\t\t\tcurrentText,\n\t\t\t\tcurrentImages,\n\t\t\t\tinputSource,\n\t\t\t);\n\t\t\tif (inputResult.action === \"handled\") {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (inputResult.action === \"transform\") {\n\t\t\t\tcurrentText = inputResult.text;\n\t\t\t\tcurrentImages = inputResult.images ?? currentImages;\n\t\t\t}\n\t\t}\n\n\t\tconst userPromptHooks = applyUserPromptSubmitHooks(this._hooksConfig, currentText);\n\t\tthis._queueHookNotices(\"UserPromptSubmit\", userPromptHooks.notices);\n\t\tif (userPromptHooks.notices.length > 0) {\n\t\t\tthis._flushHookNotices();\n\t\t}\n\t\tif (userPromptHooks.blocked) {\n\t\t\tthis._flushHookNotices();\n\t\t\tthrow new Error(userPromptHooks.message ?? \"Prompt blocked by UserPromptSubmit hook.\");\n\t\t}\n\t\tcurrentText = userPromptHooks.text;\n\n\t\t// Expand skill commands (/skill:name args) and prompt templates (/template args)\n\t\tlet expandedText = currentText;\n\t\tif (expandPromptTemplates) {\n\t\t\texpandedText = this._expandSkillCommand(expandedText);\n\t\t\texpandedText = expandPromptTemplate(expandedText, [...this.promptTemplates]);\n\t\t}\n\t\tconst orchestrationDirective = options?.skipOrchestrationDirective\n\t\t\t? undefined\n\t\t\t: buildSubagentOrchestrationDirective(expandedText) ??\n\t\t\t\t(this._profileName === \"meta\" ? buildMetaProfileOrchestrationDirective(expandedText) : undefined);\n\t\tconst promptText = orchestrationDirective ? `${expandedText}\\n\\n${orchestrationDirective}` : expandedText;\n\t\tconst orchestrationDisplayText = orchestrationDirective\n\t\t\t? deriveOrchestrationDisplayText(expandedText) ?? expandedText\n\t\t\t: undefined;\n\t\tthis._appendSessionTrace({\n\t\t\ttype: \"prompt_expanded\",\n\t\t\ttext: promptText,\n\t\t\timageCount: currentImages?.length ?? 0,\n\t\t\torchestrationInjected: orchestrationDirective !== undefined,\n\t\t});\n\n\t\tif (orchestrationDirective) {\n\t\t\tthis._appendCustomMessageLocally({\n\t\t\t\tcustomType: INTERNAL_UI_META_CUSTOM_TYPE,\n\t\t\t\tcontent: \"\",\n\t\t\t\tdisplay: false,\n\t\t\t\tdetails: {\n\t\t\t\t\tkind: \"orchestration_context\",\n\t\t\t\t\trawPrompt: promptText,\n\t\t\t\t\tdisplayText: orchestrationDisplayText,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\t// If streaming, queue via steer(), followUp(), or meta() based on option\n\t\tif (this.isStreaming) {\n\t\t\tif (!options?.streamingBehavior) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"Agent is already processing. Specify streamingBehavior ('steer', 'followUp', or 'meta') to queue the message.\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait this._injectIosmRuntimeContext(currentText, options.streamingBehavior, {\n\t\t\t\tsource: inputSource,\n\t\t\t\tskip: options?.skipIosmAutopilot,\n\t\t\t});\n\t\t\tif (options.streamingBehavior === \"followUp\") {\n\t\t\t\tawait this._queueFollowUp(promptText, currentImages);\n\t\t\t} else if (options.streamingBehavior === \"meta\") {\n\t\t\t\tawait this._queueMeta(promptText, currentImages);\n\t\t\t} else {\n\t\t\t\tawait this._queueSteer(promptText, currentImages);\n\t\t\t}\n\t\t\tthis._appendSessionTrace({\n\t\t\t\ttype: \"prompt_queued\",\n\t\t\t\tmode: options.streamingBehavior,\n\t\t\t\ttext: promptText,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// Flush any pending bash messages before the new prompt\n\t\tthis._flushPendingBashMessages();\n\n\t\t// Validate model\n\t\tif (!this.model) {\n\t\t\tthrow new Error(\n\t\t\t\t\"No model selected.\\n\\n\" +\n\t\t\t\t\t`Use /login or set an API key environment variable. See ${join(getDocsPath(), \"providers.md\")}\\n\\n` +\n\t\t\t\t\t\"Then use /model to select a model.\",\n\t\t\t);\n\t\t}\n\n\t\t// Validate API key\n\t\tconst apiKey = await this._modelRegistry.getApiKey(this.model);\n\t\tif (!apiKey) {\n\t\t\tconst isOAuth = this._modelRegistry.isUsingOAuth(this.model);\n\t\t\tif (isOAuth) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Authentication failed for \"${this.model.provider}\". ` +\n\t\t\t\t\t\t`Credentials may have expired or network is unavailable. ` +\n\t\t\t\t\t\t`Run '/login ${this.model.provider}' to re-authenticate.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow new Error(\n\t\t\t\t`No API key found for ${this.model.provider}.\\n\\n` +\n\t\t\t\t\t`Use /login or set an API key environment variable. See ${join(getDocsPath(), \"providers.md\")}`,\n\t\t\t);\n\t\t}\n\n\t\t// Check if we need to compact before sending (catches aborted responses)\n\t\tconst lastAssistant = this._findLastAssistantMessage();\n\t\tif (lastAssistant) {\n\t\t\tawait this._checkCompaction(lastAssistant, false);\n\t\t}\n\n\t\tawait this._injectIosmRuntimeContext(currentText, \"nextTurn\", {\n\t\t\tsource: inputSource,\n\t\t\tskip: options?.skipIosmAutopilot,\n\t\t});\n\n\t\t// Build messages array (custom context first, then user message)\n\t\tconst messages: AgentMessage[] = [];\n\n\t\t// Inject any pending \"nextTurn\" messages as context before the user message\n\t\tfor (const msg of this._pendingNextTurnMessages) {\n\t\t\tmessages.push(msg);\n\t\t}\n\t\tthis._pendingNextTurnMessages = [];\n\n\t\t// Add user message\n\t\tconst userContent: (TextContent | ImageContent)[] = [{ type: \"text\", text: promptText }];\n\t\tif (currentImages) {\n\t\t\tuserContent.push(...currentImages);\n\t\t}\n\t\tmessages.push({\n\t\t\trole: \"user\",\n\t\t\tcontent: userContent,\n\t\t\ttimestamp: Date.now(),\n\t\t});\n\n\t\t// Emit before_agent_start extension event\n\t\tif (this._extensionRunner) {\n\t\t\tconst result = await this._extensionRunner.emitBeforeAgentStart(\n\t\t\t\tpromptText,\n\t\t\t\tcurrentImages,\n\t\t\t\tthis._baseSystemPrompt,\n\t\t\t);\n\t\t\t// Add all custom messages from extensions\n\t\t\tif (result?.messages) {\n\t\t\t\tfor (const msg of result.messages) {\n\t\t\t\t\tmessages.push({\n\t\t\t\t\t\trole: \"custom\",\n\t\t\t\t\t\tcustomType: msg.customType,\n\t\t\t\t\t\tcontent: msg.content,\n\t\t\t\t\t\tdisplay: msg.display,\n\t\t\t\t\t\tdetails: msg.details,\n\t\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Apply extension-modified system prompt, or reset to base\n\t\t\tif (result?.systemPrompt) {\n\t\t\t\tthis.agent.setSystemPrompt(result.systemPrompt);\n\t\t\t} else {\n\t\t\t\t// Ensure we're using the base prompt (in case previous turn had modifications)\n\t\t\t\tthis.agent.setSystemPrompt(this._baseSystemPrompt);\n\t\t\t}\n\t\t}\n\n\t\tconst enableProtocolAutoRepair = !options?.skipProtocolAutoRepair && !this._protocolAutoRepairActive;\n\t\tlet protocolToolCallsStarted = 0;\n\t\tlet latestAssistantProtocolText = \"\";\n\t\tlet latestAssistantMessage: AssistantMessage | undefined;\n\t\tlet latestAssistantVisibleText = \"\";\n\t\tconst unsubscribeProtocolMonitor = enableProtocolAutoRepair\n\t\t\t? this.subscribe((event) => {\n\t\t\t\t\tif (event.type === \"tool_execution_start\") {\n\t\t\t\t\t\tprotocolToolCallsStarted += 1;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (event.type === \"message_end\" && event.message.role === \"assistant\") {\n\t\t\t\t\t\tlatestAssistantMessage = event.message as AssistantMessage;\n\t\t\t\t\t\tlatestAssistantProtocolText = extractAssistantProtocolText(latestAssistantMessage);\n\t\t\t\t\t\tlatestAssistantVisibleText = extractAssistantVisibleText(latestAssistantMessage);\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t: undefined;\n\n\t\ttry {\n\t\t\tawait this.agent.prompt(messages);\n\t\t\tawait this.waitForRetry();\n\t\t} finally {\n\t\t\tunsubscribeProtocolMonitor?.();\n\t\t}\n\n\t\tthis._appendSessionTrace({\n\t\t\ttype: \"prompt_dispatched\",\n\t\t\tmessageCount: messages.length,\n\t\t\ttext: promptText,\n\t\t});\n\n\t\tif (enableProtocolAutoRepair) {\n\t\t\tlet nextIssue = detectPromptProtocolIssue(latestAssistantProtocolText);\n\t\t\tlet nextSilentStopWithoutOutput =\n\t\t\t\t!nextIssue &&\n\t\t\t\tlatestAssistantMessage?.stopReason === \"stop\" &&\n\t\t\t\t!latestAssistantMessage.content.some((part) => part.type === \"toolCall\") &&\n\t\t\t\tisNonActionableVisibleAssistantText(latestAssistantVisibleText);\n\t\t\tif (nextIssue || nextSilentStopWithoutOutput) {\n\t\t\t\tthis._protocolAutoRepairActive = true;\n\t\t\t\ttry {\n\t\t\t\t\tfor (\n\t\t\t\t\t\tlet repairAttempt = 1;\n\t\t\t\t\t\trepairAttempt <= MAX_PROMPT_PROTOCOL_AUTO_REPAIR_ATTEMPTS && (nextIssue || nextSilentStopWithoutOutput);\n\t\t\t\t\t\trepairAttempt += 1\n\t\t\t\t\t) {\n\t\t\t\t\t\tconst hasPriorToolActivity = protocolToolCallsStarted > 0 || repairAttempt > 1;\n\t\t\t\t\t\tconst correctionPrompt = nextIssue\n\t\t\t\t\t\t\t? buildPromptProtocolCorrectionPrompt({\n\t\t\t\t\t\t\t\t\toriginalPrompt: expandedText,\n\t\t\t\t\t\t\t\t\tissue: nextIssue,\n\t\t\t\t\t\t\t\t\thasPriorToolActivity,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t: buildPromptSilentStopRecoveryPrompt({\n\t\t\t\t\t\t\t\t\toriginalPrompt: expandedText,\n\t\t\t\t\t\t\t\t\thasPriorToolActivity,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\tthis._appendSessionTrace({\n\t\t\t\t\t\t\ttype: \"prompt_protocol_auto_repair\",\n\t\t\t\t\t\t\toriginalPrompt: expandedText,\n\t\t\t\t\t\t\tissue: nextIssue ?? { silentStopWithoutOutput: true },\n\t\t\t\t\t\t\thasPriorToolActivity,\n\t\t\t\t\t\t\trepairAttempt,\n\t\t\t\t\t\t\tmaxRepairAttempts: MAX_PROMPT_PROTOCOL_AUTO_REPAIR_ATTEMPTS,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tawait this.prompt(correctionPrompt, {\n\t\t\t\t\t\t\texpandPromptTemplates: false,\n\t\t\t\t\t\t\tskipIosmAutopilot: true,\n\t\t\t\t\t\t\tskipOrchestrationDirective: true,\n\t\t\t\t\t\t\tskipProtocolAutoRepair: true,\n\t\t\t\t\t\t\tsource: inputSource,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst repairedAssistant = this._findLastAssistantMessage();\n\t\t\t\t\t\tconst repairedProtocolText = repairedAssistant ? extractAssistantProtocolText(repairedAssistant) : \"\";\n\t\t\t\t\t\tconst repairedVisibleText = repairedAssistant ? extractAssistantVisibleText(repairedAssistant) : \"\";\n\t\t\t\t\t\tnextIssue = detectPromptProtocolIssue(repairedProtocolText);\n\t\t\t\t\t\tnextSilentStopWithoutOutput =\n\t\t\t\t\t\t\t!nextIssue &&\n\t\t\t\t\t\t\trepairedAssistant?.stopReason === \"stop\" &&\n\t\t\t\t\t\t\t!repairedAssistant.content.some((part) => part.type === \"toolCall\") &&\n\t\t\t\t\t\t\tisNonActionableVisibleAssistantText(repairedVisibleText);\n\t\t\t\t\t}\n\t\t\t\t} finally {\n\t\t\t\t\tthis._protocolAutoRepairActive = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async _runUltrathinkCommand(\n\t\tcommand: UltrathinkCommandConfig,\n\t\toptions: { source: InputSource },\n\t): Promise<void> {\n\t\tif (this.isStreaming) {\n\t\t\tthrow new Error(\"Cannot start /ultrathink while the agent is processing another request.\");\n\t\t}\n\t\tif (this.isCompacting) {\n\t\t\tthrow new Error(\"Cannot start /ultrathink while compaction is running.\");\n\t\t}\n\t\tif (this._ultrathinkActive) {\n\t\t\tthrow new Error(\"An /ultrathink run is already in progress.\");\n\t\t}\n\n\t\tif (!this.model) {\n\t\t\tthrow new Error(\n\t\t\t\t\"No model selected.\\n\\n\" +\n\t\t\t\t\t`Use /login or set an API key environment variable. See ${join(getDocsPath(), \"providers.md\")}\\n\\n` +\n\t\t\t\t\t\"Then use /model to select a model.\",\n\t\t\t);\n\t\t}\n\n\t\tconst apiKey = await this._modelRegistry.getApiKey(this.model);\n\t\tif (!apiKey) {\n\t\t\tconst isOAuth = this._modelRegistry.isUsingOAuth(this.model);\n\t\t\tif (isOAuth) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Authentication failed for \"${this.model.provider}\". ` +\n\t\t\t\t\t\t`Credentials may have expired or network is unavailable. ` +\n\t\t\t\t\t\t`Run '/login ${this.model.provider}' to re-authenticate.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow new Error(\n\t\t\t\t`No API key found for ${this.model.provider}.\\n\\n` +\n\t\t\t\t\t`Use /login or set an API key environment variable. See ${join(getDocsPath(), \"providers.md\")}`,\n\t\t\t);\n\t\t}\n\n\t\tconst objective = command.query?.trim() || findLastMeaningfulUserIntent(this.messages);\n\t\tif (!objective) {\n\t\t\tthrow new Error(\n\t\t\t\t[\n\t\t\t\t\t\"Cannot infer an objective for /ultrathink from session context.\",\n\t\t\t\t\t\"Provide a query explicitly or send a regular user request first.\",\n\t\t\t\t\t\"\",\n\t\t\t\t\tULTRATHINK_USAGE,\n\t\t\t\t].join(\"\\n\"),\n\t\t\t);\n\t\t}\n\n\t\tconst originalTools = this.getActiveToolNames();\n\t\tconst availableToolNames = this.getAllTools().map((tool) => tool.name);\n\t\tconst readOnlyTools = resolveUltrathinkReadOnlyTools(availableToolNames);\n\t\tif (readOnlyTools.length === 0) {\n\t\t\tthrow new Error(\n\t\t\t\t[\n\t\t\t\t\t\"Cannot start /ultrathink: no read-only tools are currently active.\",\n\t\t\t\t\t\"Enable at least one analysis tool (for example read/rg/find/semantic_search/fetch/git_read) and retry.\",\n\t\t\t\t].join(\"\\n\"),\n\t\t\t);\n\t\t}\n\n\t\tconst contextTail = buildUltrathinkContextTail(this.messages);\n\t\tlet checkpoint = createInitialUltrathinkCheckpoint(objective);\n\t\tlet previousSummary: string | undefined;\n\t\tlet accumulatedInputTokens = 0;\n\t\tlet accumulatedTotalTokens = 0;\n\t\tlet accumulatedCost = 0;\n\t\tlet stagnationCount = 0;\n\t\tlet targetIterations = command.iterations;\n\t\tlet enforceEvidencePolicy = true;\n\t\tconst evidenceById = new Map<string, ReturnType<typeof extractUltrathinkToolEvidence>[number]>();\n\n\t\tconst mergeEvidence = (messages: AgentMessage[]): number => {\n\t\t\tconst evidence = extractUltrathinkToolEvidence(messages);\n\t\t\tfor (const entry of evidence) {\n\t\t\t\tevidenceById.set(entry.toolCallId, entry);\n\t\t\t}\n\t\t\treturn evidence.length;\n\t\t};\n\n\t\tconst registerUsage = (\n\t\t\tassistantMessage: AssistantMessage | undefined,\n\t\t): { inputTokens: number; totalTokens: number; costTotal: number } => {\n\t\t\tconst usage = assistantMessage?.usage;\n\t\t\tconst inputTokens = Number(usage?.input ?? 0);\n\t\t\tconst totalTokens = Number(usage?.totalTokens ?? inputTokens + Number(usage?.output ?? 0));\n\t\t\tconst costTotal = Number(usage?.cost?.total ?? 0);\n\t\t\taccumulatedInputTokens += inputTokens;\n\t\t\taccumulatedTotalTokens += totalTokens;\n\t\t\taccumulatedCost += costTotal;\n\t\t\treturn { inputTokens, totalTokens, costTotal };\n\t\t};\n\n\t\tconst exceedsBudget = (iterationInputTokens: number): boolean =>\n\t\t\titerationInputTokens > ULTRATHINK_MAX_ITERATION_INPUT_TOKENS ||\n\t\t\taccumulatedInputTokens > ULTRATHINK_MAX_RUN_INPUT_TOKENS ||\n\t\t\taccumulatedTotalTokens > ULTRATHINK_MAX_RUN_TOTAL_TOKENS ||\n\t\t\taccumulatedCost > ULTRATHINK_MAX_RUN_COST;\n\n\t\tconst runUltrathinkInternalPrompt = async (rawPrompt: string, displayText: string): Promise<AgentMessage[]> => {\n\t\t\tthis._appendCustomMessageLocally({\n\t\t\t\tcustomType: INTERNAL_UI_META_CUSTOM_TYPE,\n\t\t\t\tcontent: \"\",\n\t\t\t\tdisplay: false,\n\t\t\t\tdetails: {\n\t\t\t\t\tkind: \"orchestration_context\",\n\t\t\t\t\trawPrompt,\n\t\t\t\t\tdisplayText,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tconst messageCountBefore = this.messages.length;\n\t\t\tawait this.prompt(rawPrompt, {\n\t\t\t\texpandPromptTemplates: false,\n\t\t\t\tskipIosmAutopilot: true,\n\t\t\t\tskipOrchestrationDirective: true,\n\t\t\t\tskipUltrathinkCommand: true,\n\t\t\t\tsource: options.source,\n\t\t\t});\n\t\t\treturn this.messages.slice(messageCountBefore);\n\t\t};\n\n\t\tthis._ultrathinkActive = true;\n\t\tthis.setActiveToolsByName(readOnlyTools);\n\n\t\ttry {\n\t\t\tfor (let iteration = 1; iteration <= targetIterations; iteration++) {\n\t\t\t\tconst phase = iteration === targetIterations ? \"Synthesis\" : getUltrathinkPhase(iteration, targetIterations);\n\t\t\t\tconst evidenceCatalog = buildUltrathinkEvidenceCatalog([...evidenceById.values()]);\n\t\t\t\tconst budgetStatus = buildUltrathinkBudgetStatusLine({\n\t\t\t\t\taccumulatedInputTokens,\n\t\t\t\t\taccumulatedTotalTokens,\n\t\t\t\t\taccumulatedCost,\n\t\t\t\t});\n\t\t\t\tconst iterationPrompt = buildUltrathinkIterationPrompt({\n\t\t\t\t\titeration,\n\t\t\t\t\ttotalIterations: targetIterations,\n\t\t\t\t\tphase,\n\t\t\t\t\tobjective,\n\t\t\t\t\tcheckpoint,\n\t\t\t\t\tpreviousSummary,\n\t\t\t\t\tcontextTail: iteration === 1 ? contextTail : undefined,\n\t\t\t\t\tevidenceCatalog,\n\t\t\t\t\tbudgetStatus,\n\t\t\t\t});\n\t\t\t\tconst visibleIterationPrompt = buildUltrathinkVisibleIterationPrompt({\n\t\t\t\t\titeration,\n\t\t\t\t\ttotalIterations: targetIterations,\n\t\t\t\t\tphase,\n\t\t\t\t\tobjective,\n\t\t\t\t});\n\n\t\t\t\tconst iterationMessages = await runUltrathinkInternalPrompt(iterationPrompt, visibleIterationPrompt);\n\t\t\t\tlet toolChecksThisIteration = mergeEvidence(iterationMessages);\n\t\t\t\tlet assistantMessage = this._findLastAssistantMessage();\n\t\t\t\tlet assistantText = this.getLastAssistantText() ?? \"\";\n\t\t\t\tlet iterationUsage = registerUsage(assistantMessage);\n\t\t\t\tlet iterationInputTokens = iterationUsage.inputTokens;\n\n\t\t\t\tconst evaluatePolicy = () =>\n\t\t\t\t\tevaluateUltrathinkEvidencePolicy({\n\t\t\t\t\t\ttext: assistantText,\n\t\t\t\t\t\tphase,\n\t\t\t\t\t\ttoolChecksThisIteration,\n\t\t\t\t\t\tknownEvidenceIds: [...evidenceById.keys()],\n\t\t\t\t\t});\n\n\t\t\t\tconst shouldGround = shouldUltrathinkForceToolGrounding({\n\t\t\t\t\tphase,\n\t\t\t\t\tcumulativeEvidenceCount: evidenceById.size,\n\t\t\t\t\ttoolChecksThisIteration,\n\t\t\t\t});\n\t\t\t\tif (shouldGround) {\n\t\t\t\t\tconst groundingPrompt = buildUltrathinkToolGroundingPrompt({\n\t\t\t\t\t\titeration,\n\t\t\t\t\t\ttotalIterations: targetIterations,\n\t\t\t\t\t\tphase,\n\t\t\t\t\t\tobjective,\n\t\t\t\t\t\tcheckpoint,\n\t\t\t\t\t\tavailableReadOnlyTools: readOnlyTools,\n\t\t\t\t\t\tevidenceCatalog: buildUltrathinkEvidenceCatalog([...evidenceById.values()]),\n\t\t\t\t\t});\n\t\t\t\t\tconst groundingDisplayText = `${ULTRATHINK_VISIBLE_PROMPT_PREFIX} ${iteration}/${targetIterations} (${phase}) grounding retry. Performing live workspace probes with read-only tools.`;\n\t\t\t\t\tconst groundingMessages = await runUltrathinkInternalPrompt(groundingPrompt, groundingDisplayText);\n\t\t\t\t\ttoolChecksThisIteration += mergeEvidence(groundingMessages);\n\t\t\t\t\tassistantMessage = this._findLastAssistantMessage();\n\t\t\t\t\tassistantText = this.getLastAssistantText() ?? \"\";\n\t\t\t\t\titerationUsage = registerUsage(assistantMessage);\n\t\t\t\t\titerationInputTokens += iterationUsage.inputTokens;\n\t\t\t\t}\n\n\t\t\t\tif (enforceEvidencePolicy) {\n\t\t\t\t\tlet evidencePolicy = evaluatePolicy();\n\t\t\t\t\tif (hasUltrathinkEvidenceViolations(evidencePolicy)) {\n\t\t\t\t\t\tconst policyIssues: string[] = [];\n\t\t\t\t\t\tif (evidencePolicy.missingEvidenceForNumbers) {\n\t\t\t\t\t\t\tpolicyIssues.push(\"Quantitative claims are missing `[evidence:<toolCallId>]` tags.\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (evidencePolicy.invalidEvidenceTags.length > 0) {\n\t\t\t\t\t\t\tpolicyIssues.push(`Unknown evidence tags: ${evidencePolicy.invalidEvidenceTags.join(\", \")}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (evidencePolicy.needsNoNewEvidenceMarker && !evidencePolicy.hasNoNewEvidenceMarker) {\n\t\t\t\t\t\t\tpolicyIssues.push(\"Verify/Synthesis response with no new tool checks must include [NO_NEW_EVIDENCE_OK].\");\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst repairPrompt = buildUltrathinkComplianceRepairPrompt({\n\t\t\t\t\t\t\titeration,\n\t\t\t\t\t\t\ttotalIterations: targetIterations,\n\t\t\t\t\t\t\tphase,\n\t\t\t\t\t\t\tobjective,\n\t\t\t\t\t\t\toriginalResponse: assistantText,\n\t\t\t\t\t\t\tissues: policyIssues,\n\t\t\t\t\t\t\tcheckpoint,\n\t\t\t\t\t\t\tevidenceCatalog: buildUltrathinkEvidenceCatalog([...evidenceById.values()]),\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst repairDisplayText = `${ULTRATHINK_VISIBLE_PROMPT_PREFIX} ${iteration}/${targetIterations} (${phase}) policy repair. Normalizing evidence links and checkpoint format.`;\n\t\t\t\t\t\tconst repairMessages = await runUltrathinkInternalPrompt(repairPrompt, repairDisplayText);\n\t\t\t\t\t\ttoolChecksThisIteration += mergeEvidence(repairMessages);\n\t\t\t\t\t\tassistantMessage = this._findLastAssistantMessage();\n\t\t\t\t\t\tassistantText = this.getLastAssistantText() ?? \"\";\n\t\t\t\t\t\titerationUsage = registerUsage(assistantMessage);\n\t\t\t\t\t\titerationInputTokens += iterationUsage.inputTokens;\n\t\t\t\t\t\tevidencePolicy = evaluatePolicy();\n\n\t\t\t\t\t\tif (hasUltrathinkEvidenceViolations(evidencePolicy)) {\n\t\t\t\t\t\t\t// Do not fail the entire run; keep the latest usable answer and finish gracefully.\n\t\t\t\t\t\t\tenforceEvidencePolicy = false;\n\t\t\t\t\t\t\tif (iteration < targetIterations) {\n\t\t\t\t\t\t\t\ttargetIterations = Math.min(targetIterations, iteration + 1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tpreviousSummary = extractUltrathinkIterationSummary(assistantText);\n\t\t\t\tconst checkpointBeforeIteration = checkpoint;\n\t\t\t\tconst extractedCheckpoint = extractUltrathinkCheckpoint(assistantText);\n\t\t\t\tif (extractedCheckpoint && extractedCheckpoint.trim()) {\n\t\t\t\t\tcheckpoint = normalizeUltrathinkCheckpoint(extractedCheckpoint, objective);\n\t\t\t\t}\n\t\t\t\tif (checkpoint.length > ULTRATHINK_MAX_CHECKPOINT_CHARS) {\n\t\t\t\t\tcheckpoint = await this._compressUltrathinkCheckpoint(checkpoint, objective, apiKey);\n\t\t\t\t}\n\n\t\t\t\tconst stagnated = isUltrathinkStagnated({\n\t\t\t\t\tpreviousCheckpoint: checkpointBeforeIteration,\n\t\t\t\t\tnextCheckpoint: checkpoint,\n\t\t\t\t\ttoolChecksThisIteration,\n\t\t\t\t});\n\t\t\t\tif (stagnated && iteration < targetIterations) {\n\t\t\t\t\tstagnationCount += 1;\n\t\t\t\t\tif (stagnationCount >= ULTRATHINK_STAGNATION_LIMIT) {\n\t\t\t\t\t\ttargetIterations = Math.min(targetIterations, iteration + 1);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tstagnationCount = 0;\n\t\t\t\t}\n\n\t\t\t\tif (iteration < targetIterations && exceedsBudget(iterationInputTokens)) {\n\t\t\t\t\ttargetIterations = Math.min(targetIterations, iteration + 1);\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\tthis._ultrathinkActive = false;\n\t\t\tconst currentTools = this.getActiveToolNames();\n\t\t\tconst shouldRestore =\n\t\t\t\tcurrentTools.length !== originalTools.length ||\n\t\t\t\tcurrentTools.some((toolName, index) => toolName !== originalTools[index]);\n\t\t\tif (shouldRestore) {\n\t\t\t\tthis.setActiveToolsByName(originalTools);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async _compressUltrathinkCheckpoint(\n\t\tcheckpoint: string,\n\t\tobjective: string,\n\t\tapiKey: string,\n\t): Promise<string> {\n\t\tconst model = this.model;\n\t\tconst fallback = truncateUltrathinkCheckpoint(\n\t\t\tnormalizeUltrathinkCheckpoint(checkpoint, objective),\n\t\t\tULTRATHINK_MAX_CHECKPOINT_CHARS,\n\t\t);\n\t\tif (!model) return fallback;\n\n\t\tconst reserveTokens = this.settingsManager.getCompactionReserveTokens();\n\t\tconst maxTokens = Math.max(256, Math.min(2048, Math.floor(reserveTokens * 0.4)));\n\n\t\ttry {\n\t\t\tconst response = await completeSimple(\n\t\t\t\tmodel,\n\t\t\t\t{\n\t\t\t\t\tsystemPrompt: ULTRATHINK_CHECKPOINT_COMPRESSION_SYSTEM_PROMPT,\n\t\t\t\t\tmessages: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\trole: \"user\",\n\t\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\t\t\ttext: buildUltrathinkCheckpointCompressionPrompt({\n\t\t\t\t\t\t\t\t\t\tobjective,\n\t\t\t\t\t\t\t\t\t\tcheckpoint,\n\t\t\t\t\t\t\t\t\t\tmaxChars: ULTRATHINK_MAX_CHECKPOINT_CHARS,\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\tmodel.reasoning\n\t\t\t\t\t? { maxTokens, apiKey, reasoning: \"high\" as const }\n\t\t\t\t\t: { maxTokens, apiKey },\n\t\t\t);\n\n\t\t\tif (response.stopReason === \"error\") {\n\t\t\t\treturn fallback;\n\t\t\t}\n\n\t\t\tconst text = response.content\n\t\t\t\t.filter((part): part is { type: \"text\"; text: string } => part.type === \"text\")\n\t\t\t\t.map((part) => part.text)\n\t\t\t\t.join(\"\\n\")\n\t\t\t\t.trim();\n\t\t\tif (!text) {\n\t\t\t\treturn fallback;\n\t\t\t}\n\n\t\t\treturn truncateUltrathinkCheckpoint(\n\t\t\t\tnormalizeUltrathinkCheckpoint(text, objective),\n\t\t\t\tULTRATHINK_MAX_CHECKPOINT_CHARS,\n\t\t\t);\n\t\t} catch {\n\t\t\treturn fallback;\n\t\t}\n\t}\n\n\t/**\n\t * Try to execute an extension command. Returns true if command was found and executed.\n\t */\n\tprivate async _tryExecuteExtensionCommand(text: string): Promise<boolean> {\n\t\tif (!this._extensionRunner) return false;\n\n\t\t// Parse command name and args\n\t\tconst spaceIndex = text.indexOf(\" \");\n\t\tconst commandName = spaceIndex === -1 ? text.slice(1) : text.slice(1, spaceIndex);\n\t\tconst args = spaceIndex === -1 ? \"\" : text.slice(spaceIndex + 1);\n\n\t\tconst command = this._extensionRunner.getCommand(commandName);\n\t\tif (!command) return false;\n\n\t\t// Get command context from extension runner (includes session control methods)\n\t\tconst ctx = this._extensionRunner.createCommandContext();\n\n\t\ttry {\n\t\t\tawait command.handler(args, ctx);\n\t\t\treturn true;\n\t\t} catch (err) {\n\t\t\t// Emit error via extension runner\n\t\t\tthis._extensionRunner.emitError({\n\t\t\t\textensionPath: `command:${commandName}`,\n\t\t\t\tevent: \"command\",\n\t\t\t\terror: err instanceof Error ? err.message : String(err),\n\t\t\t});\n\t\t\treturn true;\n\t\t}\n\t}\n\n\t/**\n\t * Expand skill commands (/skill:name args) to their full content.\n\t * Returns the expanded text, or the original text if not a skill command or skill not found.\n\t * Emits errors via extension runner if file read fails.\n\t */\n\tprivate _expandSkillCommand(text: string): string {\n\t\tif (!text.startsWith(\"/skill:\")) return text;\n\n\t\tconst spaceIndex = text.indexOf(\" \");\n\t\tconst skillName = spaceIndex === -1 ? text.slice(7) : text.slice(7, spaceIndex);\n\t\tconst args = spaceIndex === -1 ? \"\" : text.slice(spaceIndex + 1).trim();\n\n\t\tconst skill = this.resourceLoader.getSkills().skills.find((s) => s.name === skillName);\n\t\tif (!skill) return text; // Unknown skill, pass through\n\n\t\ttry {\n\t\t\tconst content = readFileSync(skill.filePath, \"utf-8\");\n\t\t\tconst body = stripFrontmatter(content).trim();\n\t\t\tconst skillBlock = `<skill name=\"${skill.name}\" location=\"${skill.filePath}\">\\nReferences are relative to ${skill.baseDir}.\\n\\n${body}\\n</skill>`;\n\t\t\treturn args ? `${skillBlock}\\n\\n${args}` : skillBlock;\n\t\t} catch (err) {\n\t\t\t// Emit error like extension commands do\n\t\t\tthis._extensionRunner?.emitError({\n\t\t\t\textensionPath: skill.filePath,\n\t\t\t\tevent: \"skill_expansion\",\n\t\t\t\terror: err instanceof Error ? err.message : String(err),\n\t\t\t});\n\t\t\treturn text; // Return original on error\n\t\t}\n\t}\n\n\t/**\n\t * Queue a steering message to interrupt the agent mid-run.\n\t * Delivered after current tool execution, skips remaining tools.\n\t * Expands skill commands and prompt templates. Errors on extension commands.\n\t * @param images Optional image attachments to include with the message\n\t * @throws Error if text is an extension command\n\t */\n\tasync steer(text: string, images?: ImageContent[]): Promise<void> {\n\t\t// Check for extension commands (cannot be queued)\n\t\tif (text.startsWith(\"/\")) {\n\t\t\tthis._throwIfExtensionCommand(text);\n\t\t}\n\n\t\tawait this._injectIosmRuntimeContext(text, \"steer\", {\n\t\t\tsource: \"interactive\",\n\t\t});\n\n\t\t// Expand skill commands and prompt templates\n\t\tlet expandedText = this._expandSkillCommand(text);\n\t\texpandedText = expandPromptTemplate(expandedText, [...this.promptTemplates]);\n\n\t\tawait this._queueSteer(expandedText, images);\n\t}\n\n\t/**\n\t * Queue a follow-up message to be processed after the agent finishes.\n\t * Delivered only when agent has no more tool calls or steering messages.\n\t * Expands skill commands and prompt templates. Errors on extension commands.\n\t * @param images Optional image attachments to include with the message\n\t * @throws Error if text is an extension command\n\t */\n\tasync followUp(text: string, images?: ImageContent[]): Promise<void> {\n\t\t// Check for extension commands (cannot be queued)\n\t\tif (text.startsWith(\"/\")) {\n\t\t\tthis._throwIfExtensionCommand(text);\n\t\t}\n\n\t\tawait this._injectIosmRuntimeContext(text, \"followUp\", {\n\t\t\tsource: \"interactive\",\n\t\t});\n\n\t\t// Expand skill commands and prompt templates\n\t\tlet expandedText = this._expandSkillCommand(text);\n\t\texpandedText = expandPromptTemplate(expandedText, [...this.promptTemplates]);\n\n\t\tawait this._queueFollowUp(expandedText, images);\n\t}\n\n\t/**\n\t * Queue a meta message as a soft update.\n\t * It does not interrupt current tool execution and is delivered like follow-up,\n\t * while being tracked separately for UI and task-level checkpoint polling.\n\t */\n\tasync meta(text: string, images?: ImageContent[]): Promise<void> {\n\t\t// Check for extension commands (cannot be queued)\n\t\tif (text.startsWith(\"/\")) {\n\t\t\tthis._throwIfExtensionCommand(text);\n\t\t}\n\n\t\tawait this._injectIosmRuntimeContext(text, \"meta\", {\n\t\t\tsource: \"interactive\",\n\t\t});\n\n\t\t// Expand skill commands and prompt templates\n\t\tlet expandedText = this._expandSkillCommand(text);\n\t\texpandedText = expandPromptTemplate(expandedText, [...this.promptTemplates]);\n\n\t\tawait this._queueMeta(expandedText, images);\n\t}\n\n\t/**\n\t * Internal: Queue a steering message (already expanded, no extension command check).\n\t */\n\tprivate async _queueSteer(text: string, images?: ImageContent[]): Promise<void> {\n\t\tthis._steeringMessages.push(text);\n\t\tthis._appendSessionTrace({\n\t\t\ttype: \"queue_steer\",\n\t\t\ttext,\n\t\t\timageCount: images?.length ?? 0,\n\t\t});\n\t\tconst content: (TextContent | ImageContent)[] = [{ type: \"text\", text }];\n\t\tif (images) {\n\t\t\tcontent.push(...images);\n\t\t}\n\t\tthis.agent.steer({\n\t\t\trole: \"user\",\n\t\t\tcontent,\n\t\t\ttimestamp: Date.now(),\n\t\t});\n\t}\n\n\t/**\n\t * Internal: Queue a follow-up message (already expanded, no extension command check).\n\t */\n\tprivate async _queueFollowUp(text: string, images?: ImageContent[]): Promise<void> {\n\t\tthis._followUpMessages.push(text);\n\t\tthis._appendSessionTrace({\n\t\t\ttype: \"queue_follow_up\",\n\t\t\ttext,\n\t\t\timageCount: images?.length ?? 0,\n\t\t});\n\t\tconst content: (TextContent | ImageContent)[] = [{ type: \"text\", text }];\n\t\tif (images) {\n\t\t\tcontent.push(...images);\n\t\t}\n\t\tthis.agent.followUp({\n\t\t\trole: \"user\",\n\t\t\tcontent,\n\t\t\ttimestamp: Date.now(),\n\t\t});\n\t}\n\n\t/**\n\t * Internal: Queue a meta message.\n\t * Uses steering delivery while streaming so updates are applied at the next tool boundary\n\t * without language-specific trigger parsing. We still keep a separate meta queue for UI/polling.\n\t */\n\tprivate async _queueMeta(text: string, images?: ImageContent[]): Promise<void> {\n\t\tthis._metaMessages.push(text);\n\t\tthis._appendSessionTrace({\n\t\t\ttype: \"queue_meta\",\n\t\t\ttext,\n\t\t\timageCount: images?.length ?? 0,\n\t\t});\n\t\tconst content: (TextContent | ImageContent)[] = [{ type: \"text\", text }];\n\t\tif (images) {\n\t\t\tcontent.push(...images);\n\t\t}\n\t\t// Language-agnostic behavior: while streaming, meta always pivots via steer.\n\t\t// This avoids brittle keyword trigger lists across locales.\n\t\tconst deliverAsSteer = this.isStreaming;\n\t\tconst queueMethod = deliverAsSteer ? this.agent.steer.bind(this.agent) : this.agent.followUp.bind(this.agent);\n\t\tqueueMethod({\n\t\t\trole: \"user\",\n\t\t\tcontent,\n\t\t\ttimestamp: Date.now(),\n\t\t});\n\t}\n\n\t/**\n\t * Throw an error if the text is an extension command.\n\t */\n\tprivate _throwIfExtensionCommand(text: string): void {\n\t\tif (!this._extensionRunner) return;\n\n\t\tconst spaceIndex = text.indexOf(\" \");\n\t\tconst commandName = spaceIndex === -1 ? text.slice(1) : text.slice(1, spaceIndex);\n\t\tconst command = this._extensionRunner.getCommand(commandName);\n\n\t\tif (command) {\n\t\t\tthrow new Error(\n\t\t\t\t`Extension command \"/${commandName}\" cannot be queued. Use prompt() or execute the command when not streaming.`,\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate _shouldInjectIosmRuntimeContext(options: { source?: InputSource; skip?: boolean }): boolean {\n\t\tif (options.skip) {\n\t\t\treturn false;\n\t\t}\n\t\tif (!this._iosmAutopilotEnabled) {\n\t\t\treturn false;\n\t\t}\n\t\treturn options.source !== \"extension\";\n\t}\n\n\tprivate async _injectIosmRuntimeContext(\n\t\tuserInput: string,\n\t\tdeliverAs: \"steer\" | \"followUp\" | \"meta\" | \"nextTurn\",\n\t\toptions: { source?: InputSource; skip?: boolean },\n\t): Promise<void> {\n\t\tif (!this._shouldInjectIosmRuntimeContext(options)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst runtimeContext = await prepareIosmRuntimeContext(this._cwd, userInput);\n\t\tawait this.sendCustomMessage(\n\t\t\t{\n\t\t\t\tcustomType: \"iosm-runtime\",\n\t\t\t\tcontent: buildIosmRuntimeDirective(runtimeContext),\n\t\t\t\tdisplay: false,\n\t\t\t},\n\t\t\t{ deliverAs },\n\t\t);\n\t}\n\n\t/**\n\t * Send a custom message to the session. Creates a CustomMessageEntry.\n\t *\n\t * Handles three cases:\n\t * - Streaming: queues message, processed when loop pulls from queue\n\t * - Not streaming + triggerTurn: appends to state/session, starts new turn\n\t * - Not streaming + no trigger: appends to state/session, no turn\n\t *\n\t * @param message Custom message with customType, content, display, details\n\t * @param options.triggerTurn If true and not streaming, triggers a new LLM turn\n\t * @param options.deliverAs Delivery mode: \"steer\", \"followUp\", \"meta\", or \"nextTurn\"\n\t */\n\tprivate _appendCustomMessageLocally<T = unknown>(\n\t\tmessage: Pick<CustomMessage<T>, \"customType\" | \"content\" | \"display\" | \"details\">,\n\t): void {\n\t\tconst appMessage = {\n\t\t\trole: \"custom\" as const,\n\t\t\tcustomType: message.customType,\n\t\t\tcontent: message.content,\n\t\t\tdisplay: message.display,\n\t\t\tdetails: message.details,\n\t\t\ttimestamp: Date.now(),\n\t\t} satisfies CustomMessage<T>;\n\n\t\tthis.agent.appendMessage(appMessage);\n\t\tthis.sessionManager.appendCustomMessageEntry(message.customType, message.content, message.display, message.details);\n\t\tthis._emit({ type: \"message_start\", message: appMessage });\n\t\tthis._emit({ type: \"message_end\", message: appMessage });\n\t}\n\n\tasync sendCustomMessage<T = unknown>(\n\t\tmessage: Pick<CustomMessage<T>, \"customType\" | \"content\" | \"display\" | \"details\">,\n\t\toptions?: { triggerTurn?: boolean; deliverAs?: \"steer\" | \"followUp\" | \"meta\" | \"nextTurn\" },\n\t): Promise<void> {\n\t\tconst appMessage = {\n\t\t\trole: \"custom\" as const,\n\t\t\tcustomType: message.customType,\n\t\t\tcontent: message.content,\n\t\t\tdisplay: message.display,\n\t\t\tdetails: message.details,\n\t\t\ttimestamp: Date.now(),\n\t\t} satisfies CustomMessage<T>;\n\t\tif (options?.deliverAs === \"nextTurn\") {\n\t\t\tthis._pendingNextTurnMessages.push(appMessage);\n\t\t} else if (this.isStreaming) {\n\t\t\tif (options?.deliverAs === \"followUp\" || options?.deliverAs === \"meta\") {\n\t\t\t\tthis.agent.followUp(appMessage);\n\t\t\t} else {\n\t\t\t\tthis.agent.steer(appMessage);\n\t\t\t}\n\t\t} else if (options?.triggerTurn) {\n\t\t\tawait this.agent.prompt(appMessage);\n\t\t} else {\n\t\t\tthis._appendCustomMessageLocally(message);\n\t\t}\n\t}\n\n\t/**\n\t * Send a user message to the agent. Always triggers a turn.\n\t * When the agent is streaming, use deliverAs to specify how to queue the message.\n\t *\n\t * @param content User message content (string or content array)\n\t * @param options.deliverAs Delivery mode when streaming: \"steer\", \"followUp\", or \"meta\"\n\t */\n\tasync sendUserMessage(\n\t\tcontent: string | (TextContent | ImageContent)[],\n\t\toptions?: { deliverAs?: \"steer\" | \"followUp\" | \"meta\" },\n\t): Promise<void> {\n\t\t// Normalize content to text string + optional images\n\t\tlet text: string;\n\t\tlet images: ImageContent[] | undefined;\n\n\t\tif (typeof content === \"string\") {\n\t\t\ttext = content;\n\t\t} else {\n\t\t\tconst textParts: string[] = [];\n\t\t\timages = [];\n\t\t\tfor (const part of content) {\n\t\t\t\tif (part.type === \"text\") {\n\t\t\t\t\ttextParts.push(part.text);\n\t\t\t\t} else {\n\t\t\t\t\timages.push(part);\n\t\t\t\t}\n\t\t\t}\n\t\t\ttext = textParts.join(\"\\n\");\n\t\t\tif (images.length === 0) images = undefined;\n\t\t}\n\n\t\t// Use prompt() with expandPromptTemplates: false to skip command handling and template expansion\n\t\tawait this.prompt(text, {\n\t\t\texpandPromptTemplates: false,\n\t\t\tstreamingBehavior: options?.deliverAs,\n\t\t\timages,\n\t\t\tsource: \"extension\",\n\t\t});\n\t}\n\n\t/**\n\t * Clear all queued messages and return them.\n\t * Useful for restoring to editor when user aborts.\n\t * @returns Object with steering, followUp, and meta arrays\n\t */\n\tclearQueue(): { steering: string[]; followUp: string[]; meta: string[] } {\n\t\tconst steering = [...this._steeringMessages];\n\t\tconst followUp = [...this._followUpMessages];\n\t\tconst meta = [...this._metaMessages];\n\t\tthis._steeringMessages = [];\n\t\tthis._followUpMessages = [];\n\t\tthis._metaMessages = [];\n\t\tthis.agent.clearAllQueues();\n\t\treturn { steering, followUp, meta };\n\t}\n\n\t/** Number of pending messages (includes steering, follow-up, and meta) */\n\tget pendingMessageCount(): number {\n\t\treturn this._steeringMessages.length + this._followUpMessages.length + this._metaMessages.length;\n\t}\n\n\t/** Get pending steering messages (read-only) */\n\tgetSteeringMessages(): readonly string[] {\n\t\treturn this._steeringMessages;\n\t}\n\n\t/** Get pending follow-up messages (read-only) */\n\tgetFollowUpMessages(): readonly string[] {\n\t\treturn this._followUpMessages;\n\t}\n\n\t/** Get pending meta messages (read-only). */\n\tgetMetaMessages(): readonly string[] {\n\t\treturn this._metaMessages;\n\t}\n\n\t/** Number of meta updates already applied into the run. */\n\tget metaAppliedStep(): number {\n\t\treturn this._metaAppliedStep;\n\t}\n\n\tget resourceLoader(): ResourceLoader {\n\t\treturn this._resourceLoader;\n\t}\n\n\tasync notifyStopHooks(reason: string): Promise<void> {\n\t\tconst notices = applyStopHooks(this._hooksConfig, reason);\n\t\tif (notices.length === 0) return;\n\t\tthis._queueHookNotices(\"Stop\", notices);\n\t\tif (!this.isStreaming) {\n\t\t\tthis._flushHookNotices();\n\t\t}\n\t}\n\n\t/**\n\t * Abort current operation and wait for agent to become idle.\n\t */\n\tasync abort(): Promise<void> {\n\t\tawait this.notifyStopHooks(\"abort\");\n\t\tthis.abortRetry();\n\t\tthis.agent.abort();\n\t\tawait this.agent.waitForIdle();\n\t}\n\n\t/**\n\t * Start a new session, optionally with initial messages and parent tracking.\n\t * Clears all messages and starts a new session.\n\t * Listeners are preserved and will continue receiving events.\n\t * @param options.parentSession - Optional parent session path for tracking\n\t * @param options.setup - Optional callback to initialize session (e.g., append messages)\n\t * @returns true if completed, false if cancelled by extension\n\t */\n\tasync newSession(options?: {\n\t\tparentSession?: string;\n\t\tsetup?: (sessionManager: SessionManager) => Promise<void>;\n\t}): Promise<boolean> {\n\t\tconst previousSessionFile = this.sessionFile;\n\t\tthis._appendSessionTrace({\n\t\t\ttype: \"session_new_start\",\n\t\t\tpreviousSessionFile: previousSessionFile ?? null,\n\t\t\tparentSession: options?.parentSession ?? null,\n\t\t});\n\n\t\t// Emit session_before_switch event with reason \"new\" (can be cancelled)\n\t\tif (this._extensionRunner?.hasHandlers(\"session_before_switch\")) {\n\t\t\tconst result = (await this._extensionRunner.emit({\n\t\t\t\ttype: \"session_before_switch\",\n\t\t\t\treason: \"new\",\n\t\t\t})) as SessionBeforeSwitchResult | undefined;\n\n\t\t\tif (result?.cancel) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tthis._disconnectFromAgent();\n\t\tawait this.abort();\n\t\tthis.agent.reset();\n\t\tthis.sessionManager.newSession({ parentSession: options?.parentSession });\n\t\tthis.agent.sessionId = this.sessionManager.getSessionId();\n\t\t\tthis._refreshSessionTracePath(\"new_session\");\n\t\t\tthis._steeringMessages = [];\n\t\t\tthis._followUpMessages = [];\n\t\t\tthis._metaMessages = [];\n\t\t\tthis._metaAppliedStep = 0;\n\t\t\tthis._pendingNextTurnMessages = [];\n\n\t\tthis.sessionManager.appendThinkingLevelChange(this.thinkingLevel);\n\n\t\t// Run setup callback if provided (e.g., to append initial messages)\n\t\tif (options?.setup) {\n\t\t\tawait options.setup(this.sessionManager);\n\t\t\t// Sync agent state with session manager after setup\n\t\t\tconst sessionContext = this.sessionManager.buildSessionContext();\n\t\t\tthis.agent.replaceMessages(sessionContext.messages);\n\t\t}\n\n\t\tthis._reconnectToAgent();\n\n\t\t// Emit session_switch event with reason \"new\" to extensions\n\t\tif (this._extensionRunner) {\n\t\t\tawait this._extensionRunner.emit({\n\t\t\t\ttype: \"session_switch\",\n\t\t\t\treason: \"new\",\n\t\t\t\tpreviousSessionFile,\n\t\t\t});\n\t\t}\n\n\t\t// Emit session event to custom tools\n\t\tthis._appendSessionTrace({\n\t\t\ttype: \"session_new_complete\",\n\t\t\tsessionId: this.sessionManager.getSessionId(),\n\t\t\tsessionFile: this.sessionFile ?? null,\n\t\t});\n\t\treturn true;\n\t}\n\n\t// =========================================================================\n\t// Model Management\n\t// =========================================================================\n\n\tprivate async _emitModelSelect(\n\t\tnextModel: Model<any>,\n\t\tpreviousModel: Model<any> | undefined,\n\t\tsource: \"set\" | \"cycle\" | \"restore\",\n\t): Promise<void> {\n\t\tif (!this._extensionRunner) return;\n\t\tif (modelsAreEqual(previousModel, nextModel)) return;\n\t\tawait this._extensionRunner.emit({\n\t\t\ttype: \"model_select\",\n\t\t\tmodel: nextModel,\n\t\t\tpreviousModel,\n\t\t\tsource,\n\t\t});\n\t}\n\n\t/**\n\t * Set model directly.\n\t * Validates API key, saves to session and settings.\n\t * @throws Error if no API key available for the model\n\t */\n\tasync setModel(model: Model<any>): Promise<void> {\n\t\tconst apiKey = await this._modelRegistry.getApiKey(model);\n\t\tif (!apiKey) {\n\t\t\tthrow new Error(`No API key for ${model.provider}/${model.id}`);\n\t\t}\n\n\t\tconst previousModel = this.model;\n\t\tthis.agent.setModel(model);\n\t\tthis.sessionManager.appendModelChange(model.provider, model.id);\n\t\tthis.settingsManager.setDefaultModelAndProvider(model.provider, model.id);\n\t\tthis._appendSessionTrace({\n\t\t\ttype: \"model_set\",\n\t\t\tprovider: model.provider,\n\t\t\tmodelId: model.id,\n\t\t});\n\n\t\t// Re-clamp thinking level for new model's capabilities\n\t\tthis.setThinkingLevel(this.thinkingLevel);\n\n\t\tawait this._emitModelSelect(model, previousModel, \"set\");\n\t}\n\n\t/**\n\t * Cycle to next/previous model.\n\t * Uses scoped models (from --models flag) if available, otherwise all available models.\n\t * @param direction - \"forward\" (default) or \"backward\"\n\t * @returns The new model info, or undefined if only one model available\n\t */\n\tasync cycleModel(direction: \"forward\" | \"backward\" = \"forward\"): Promise<ModelCycleResult | undefined> {\n\t\tif (this._scopedModels.length > 0) {\n\t\t\treturn this._cycleScopedModel(direction);\n\t\t}\n\t\treturn this._cycleAvailableModel(direction);\n\t}\n\n\tprivate async _getScopedModelsWithApiKey(): Promise<Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>> {\n\t\tconst apiKeysByProvider = new Map<string, string | undefined>();\n\t\tconst result: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }> = [];\n\n\t\tfor (const scoped of this._scopedModels) {\n\t\t\tconst provider = scoped.model.provider;\n\t\t\tlet apiKey: string | undefined;\n\t\t\tif (apiKeysByProvider.has(provider)) {\n\t\t\t\tapiKey = apiKeysByProvider.get(provider);\n\t\t\t} else {\n\t\t\t\tapiKey = await this._modelRegistry.getApiKeyForProvider(provider);\n\t\t\t\tapiKeysByProvider.set(provider, apiKey);\n\t\t\t}\n\n\t\t\tif (apiKey) {\n\t\t\t\tresult.push(scoped);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tprivate async _cycleScopedModel(direction: \"forward\" | \"backward\"): Promise<ModelCycleResult | undefined> {\n\t\tconst scopedModels = await this._getScopedModelsWithApiKey();\n\t\tif (scopedModels.length <= 1) return undefined;\n\n\t\tconst currentModel = this.model;\n\t\tlet currentIndex = scopedModels.findIndex((sm) => modelsAreEqual(sm.model, currentModel));\n\n\t\tif (currentIndex === -1) currentIndex = 0;\n\t\tconst len = scopedModels.length;\n\t\tconst nextIndex = direction === \"forward\" ? (currentIndex + 1) % len : (currentIndex - 1 + len) % len;\n\t\tconst next = scopedModels[nextIndex];\n\n\t\t// Apply model\n\t\tthis.agent.setModel(next.model);\n\t\tthis.sessionManager.appendModelChange(next.model.provider, next.model.id);\n\t\tthis.settingsManager.setDefaultModelAndProvider(next.model.provider, next.model.id);\n\n\t\t// Apply thinking level.\n\t\t// - Explicit scoped model thinking level overrides current session level\n\t\t// - Undefined scoped model thinking level inherits current session level\n\t\t// setThinkingLevel clamps to model capabilities.\n\t\tthis.setThinkingLevel(next.thinkingLevel ?? this.thinkingLevel);\n\n\t\tawait this._emitModelSelect(next.model, currentModel, \"cycle\");\n\n\t\treturn { model: next.model, thinkingLevel: this.thinkingLevel, isScoped: true };\n\t}\n\n\tprivate async _cycleAvailableModel(direction: \"forward\" | \"backward\"): Promise<ModelCycleResult | undefined> {\n\t\tconst availableModels = await this._modelRegistry.getAvailable();\n\t\tif (availableModels.length <= 1) return undefined;\n\n\t\tconst currentModel = this.model;\n\t\tlet currentIndex = availableModels.findIndex((m) => modelsAreEqual(m, currentModel));\n\n\t\tif (currentIndex === -1) currentIndex = 0;\n\t\tconst len = availableModels.length;\n\t\tconst nextIndex = direction === \"forward\" ? (currentIndex + 1) % len : (currentIndex - 1 + len) % len;\n\t\tconst nextModel = availableModels[nextIndex];\n\n\t\tconst apiKey = await this._modelRegistry.getApiKey(nextModel);\n\t\tif (!apiKey) {\n\t\t\tthrow new Error(`No API key for ${nextModel.provider}/${nextModel.id}`);\n\t\t}\n\n\t\tthis.agent.setModel(nextModel);\n\t\tthis.sessionManager.appendModelChange(nextModel.provider, nextModel.id);\n\t\tthis.settingsManager.setDefaultModelAndProvider(nextModel.provider, nextModel.id);\n\n\t\t// Re-clamp thinking level for new model's capabilities\n\t\tthis.setThinkingLevel(this.thinkingLevel);\n\n\t\tawait this._emitModelSelect(nextModel, currentModel, \"cycle\");\n\n\t\treturn { model: nextModel, thinkingLevel: this.thinkingLevel, isScoped: false };\n\t}\n\n\t// =========================================================================\n\t// Thinking Level Management\n\t// =========================================================================\n\n\t/**\n\t * Set thinking level.\n\t * Clamps to model capabilities based on available thinking levels.\n\t * Saves to session and settings only if the level actually changes.\n\t */\n\tsetThinkingLevel(level: ThinkingLevel): void {\n\t\tconst availableLevels = this.getAvailableThinkingLevels();\n\t\tconst effectiveLevel = availableLevels.includes(level) ? level : this._clampThinkingLevel(level, availableLevels);\n\t\tconst previousLevel = this.agent.state.thinkingLevel;\n\n\t\t// Only persist if actually changing\n\t\tconst isChanging = effectiveLevel !== this.agent.state.thinkingLevel;\n\n\t\tthis.agent.setThinkingLevel(effectiveLevel);\n\n\t\tif (isChanging) {\n\t\t\tthis.sessionManager.appendThinkingLevelChange(effectiveLevel);\n\t\t\tthis.settingsManager.setDefaultThinkingLevel(effectiveLevel);\n\t\t\tthis._appendSessionTrace({\n\t\t\t\ttype: \"thinking_level_set\",\n\t\t\t\trequested: level,\n\t\t\t\teffective: effectiveLevel,\n\t\t\t});\n\t\t\tthis._emitConfigChange({\n\t\t\t\tkey: \"thinking_level\",\n\t\t\t\tprevious: previousLevel,\n\t\t\t\tcurrent: effectiveLevel,\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Cycle to next thinking level.\n\t * @returns New level, or undefined if model doesn't support thinking\n\t */\n\tcycleThinkingLevel(): ThinkingLevel | undefined {\n\t\tif (!this.supportsThinking()) return undefined;\n\n\t\tconst levels = this.getAvailableThinkingLevels();\n\t\tconst currentIndex = levels.indexOf(this.thinkingLevel);\n\t\tconst nextIndex = (currentIndex + 1) % levels.length;\n\t\tconst nextLevel = levels[nextIndex];\n\n\t\tthis.setThinkingLevel(nextLevel);\n\t\treturn nextLevel;\n\t}\n\n\t/**\n\t * Get available thinking levels for current model.\n\t * The provider will clamp to what the specific model supports internally.\n\t */\n\tgetAvailableThinkingLevels(): ThinkingLevel[] {\n\t\tif (!this.supportsThinking()) return [\"off\"];\n\t\treturn this.supportsXhighThinking() ? THINKING_LEVELS_WITH_XHIGH : THINKING_LEVELS;\n\t}\n\n\t/**\n\t * Check if current model supports xhigh thinking level.\n\t */\n\tsupportsXhighThinking(): boolean {\n\t\treturn this.model ? supportsXhigh(this.model) : false;\n\t}\n\n\t/**\n\t * Check if current model supports thinking/reasoning.\n\t */\n\tsupportsThinking(): boolean {\n\t\treturn !!this.model?.reasoning;\n\t}\n\n\tprivate _clampThinkingLevel(level: ThinkingLevel, availableLevels: ThinkingLevel[]): ThinkingLevel {\n\t\tconst ordered = THINKING_LEVELS_WITH_XHIGH;\n\t\tconst available = new Set(availableLevels);\n\t\tconst requestedIndex = ordered.indexOf(level);\n\t\tif (requestedIndex === -1) {\n\t\t\treturn availableLevels[0] ?? \"off\";\n\t\t}\n\t\tfor (let i = requestedIndex; i < ordered.length; i++) {\n\t\t\tconst candidate = ordered[i];\n\t\t\tif (available.has(candidate)) return candidate;\n\t\t}\n\t\tfor (let i = requestedIndex - 1; i >= 0; i--) {\n\t\t\tconst candidate = ordered[i];\n\t\t\tif (available.has(candidate)) return candidate;\n\t\t}\n\t\treturn availableLevels[0] ?? \"off\";\n\t}\n\n\t// =========================================================================\n\t// Queue Mode Management\n\t// =========================================================================\n\n\t/**\n\t * Set steering message mode.\n\t * Saves to settings.\n\t */\n\tsetSteeringMode(mode: \"all\" | \"one-at-a-time\"): void {\n\t\tconst previous = this.agent.getSteeringMode();\n\t\tthis.agent.setSteeringMode(mode);\n\t\tthis.settingsManager.setSteeringMode(mode);\n\t\tif (previous !== mode) {\n\t\t\tthis._emitConfigChange({\n\t\t\t\tkey: \"steering_mode\",\n\t\t\t\tprevious,\n\t\t\t\tcurrent: mode,\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Set follow-up message mode.\n\t * Saves to settings.\n\t */\n\tsetFollowUpMode(mode: \"all\" | \"one-at-a-time\"): void {\n\t\tconst previous = this.agent.getFollowUpMode();\n\t\tthis.agent.setFollowUpMode(mode);\n\t\tthis.settingsManager.setFollowUpMode(mode);\n\t\tif (previous !== mode) {\n\t\t\tthis._emitConfigChange({\n\t\t\t\tkey: \"followup_mode\",\n\t\t\t\tprevious,\n\t\t\t\tcurrent: mode,\n\t\t\t});\n\t\t}\n\t}\n\n\t/** Default behavior for Enter while streaming in interactive mode. */\n\tget streamInputMode(): \"steer\" | \"followUp\" | \"meta\" {\n\t\treturn this.settingsManager.getStreamInputMode();\n\t}\n\n\tsetStreamInputMode(mode: \"steer\" | \"followUp\" | \"meta\"): void {\n\t\tconst previous = this.settingsManager.getStreamInputMode();\n\t\tthis.settingsManager.setStreamInputMode(mode);\n\t\tif (previous !== mode) {\n\t\t\tthis._emitConfigChange({\n\t\t\t\tkey: \"stream_input_mode\",\n\t\t\t\tprevious,\n\t\t\t\tcurrent: mode,\n\t\t\t});\n\t\t}\n\t}\n\n\t// =========================================================================\n\t// Compaction\n\t// =========================================================================\n\n\t/**\n\t * Manually compact the session context.\n\t * Aborts current agent operation first.\n\t * @param customInstructions Optional instructions for the compaction summary\n\t */\n\tasync compact(customInstructions?: string): Promise<CompactionResult> {\n\t\tthis._disconnectFromAgent();\n\t\tawait this.abort();\n\t\tthis._compactionAbortController = new AbortController();\n\n\t\ttry {\n\t\t\tif (!this.model) {\n\t\t\t\tthrow new Error(\"No model selected\");\n\t\t\t}\n\n\t\t\tconst apiKey = await this._modelRegistry.getApiKey(this.model);\n\t\t\tif (!apiKey) {\n\t\t\t\tthrow new Error(`No API key for ${this.model.provider}`);\n\t\t\t}\n\n\t\t\tconst pathEntries = this.sessionManager.getBranch();\n\t\t\tconst settings = this.settingsManager.getCompactionSettings();\n\n\t\t\tconst preparation = prepareCompaction(pathEntries, settings);\n\t\t\tif (!preparation) {\n\t\t\t\t// Check why we can't compact\n\t\t\t\tconst lastEntry = pathEntries[pathEntries.length - 1];\n\t\t\t\tif (lastEntry?.type === \"compaction\") {\n\t\t\t\t\tthrow new Error(\"Already compacted\");\n\t\t\t\t}\n\t\t\t\tthrow new Error(\"Nothing to compact (session too small)\");\n\t\t\t}\n\n\t\t\tlet extensionCompaction: CompactionResult | undefined;\n\t\t\tlet fromExtension = false;\n\n\t\t\tif (this._extensionRunner?.hasHandlers(\"session_before_compact\")) {\n\t\t\t\tconst result = (await this._extensionRunner.emit({\n\t\t\t\t\ttype: \"session_before_compact\",\n\t\t\t\t\tpreparation,\n\t\t\t\t\tbranchEntries: pathEntries,\n\t\t\t\t\tcustomInstructions,\n\t\t\t\t\tsignal: this._compactionAbortController.signal,\n\t\t\t\t})) as SessionBeforeCompactResult | undefined;\n\n\t\t\t\tif (result?.cancel) {\n\t\t\t\t\tthrow new Error(\"Compaction cancelled\");\n\t\t\t\t}\n\n\t\t\t\tif (result?.compaction) {\n\t\t\t\t\textensionCompaction = result.compaction;\n\t\t\t\t\tfromExtension = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet summary: string;\n\t\t\tlet firstKeptEntryId: string;\n\t\t\tlet tokensBefore: number;\n\t\t\tlet details: unknown;\n\n\t\t\tif (extensionCompaction) {\n\t\t\t\t// Extension provided compaction content\n\t\t\t\tsummary = extensionCompaction.summary;\n\t\t\t\tfirstKeptEntryId = extensionCompaction.firstKeptEntryId;\n\t\t\t\ttokensBefore = extensionCompaction.tokensBefore;\n\t\t\t\tdetails = extensionCompaction.details;\n\t\t\t} else {\n\t\t\t\t// Generate compaction result\n\t\t\t\tconst result = await compact(\n\t\t\t\t\tpreparation,\n\t\t\t\t\tthis.model,\n\t\t\t\t\tapiKey,\n\t\t\t\t\tcustomInstructions,\n\t\t\t\t\tthis._compactionAbortController.signal,\n\t\t\t\t);\n\t\t\t\tsummary = result.summary;\n\t\t\t\tfirstKeptEntryId = result.firstKeptEntryId;\n\t\t\t\ttokensBefore = result.tokensBefore;\n\t\t\t\tdetails = result.details;\n\t\t\t}\n\n\t\t\tif (this._compactionAbortController.signal.aborted) {\n\t\t\t\tthrow new Error(\"Compaction cancelled\");\n\t\t\t}\n\n\t\t\tthis.sessionManager.appendCompaction(summary, firstKeptEntryId, tokensBefore, details, fromExtension);\n\t\t\tconst newEntries = this.sessionManager.getEntries();\n\t\t\tconst sessionContext = this.sessionManager.buildSessionContext();\n\t\t\tthis.agent.replaceMessages(sessionContext.messages);\n\n\t\t\t// Get the saved compaction entry for the extension event\n\t\t\tconst savedCompactionEntry = newEntries.find((e) => e.type === \"compaction\" && e.summary === summary) as\n\t\t\t\t| CompactionEntry\n\t\t\t\t| undefined;\n\n\t\t\tif (this._extensionRunner && savedCompactionEntry) {\n\t\t\t\tawait this._extensionRunner.emit({\n\t\t\t\t\ttype: \"session_compact\",\n\t\t\t\t\tcompactionEntry: savedCompactionEntry,\n\t\t\t\t\tfromExtension,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tsummary,\n\t\t\t\tfirstKeptEntryId,\n\t\t\t\ttokensBefore,\n\t\t\t\tdetails,\n\t\t\t};\n\t\t} finally {\n\t\t\tthis._compactionAbortController = undefined;\n\t\t\tthis._reconnectToAgent();\n\t\t}\n\t}\n\n\t/**\n\t * Cancel in-progress compaction (manual or auto).\n\t */\n\tabortCompaction(): void {\n\t\tthis._compactionAbortController?.abort();\n\t\tthis._autoCompactionAbortController?.abort();\n\t}\n\n\t/**\n\t * Cancel in-progress branch summarization.\n\t */\n\tabortBranchSummary(): void {\n\t\tthis._branchSummaryAbortController?.abort();\n\t}\n\n\t/**\n\t * Check if compaction is needed and run it.\n\t * Called after agent_end and before prompt submission.\n\t *\n\t * Two cases:\n\t * 1. Overflow: LLM returned context overflow error, remove error message from agent state, compact, auto-retry\n\t * 2. Threshold: Context over threshold, compact, NO auto-retry (user continues manually)\n\t *\n\t * @param assistantMessage The assistant message to check\n\t * @param skipAbortedCheck If false, include aborted messages (for pre-prompt check). Default: true\n\t */\n\tprivate async _checkCompaction(assistantMessage: AssistantMessage, skipAbortedCheck = true): Promise<void> {\n\t\tconst settings = this.settingsManager.getCompactionSettings();\n\t\tif (!settings.enabled) return;\n\n\t\t// Skip if message was aborted (user cancelled) - unless skipAbortedCheck is false\n\t\tif (skipAbortedCheck && assistantMessage.stopReason === \"aborted\") return;\n\n\t\tconst contextWindow = this.model?.contextWindow ?? 0;\n\n\t\t// Skip overflow check if the message came from a different model.\n\t\t// This handles the case where user switched from a smaller-context model (e.g. opus)\n\t\t// to a larger-context model (e.g. codex) - the overflow error from the old model\n\t\t// shouldn't trigger compaction for the new model.\n\t\tconst sameModel =\n\t\t\tthis.model && assistantMessage.provider === this.model.provider && assistantMessage.model === this.model.id;\n\n\t\t// Skip overflow check if the error is from before a compaction in the current path.\n\t\t// This handles the case where an error was kept after compaction (in the \"kept\" region).\n\t\t// The error shouldn't trigger another compaction since we already compacted.\n\t\t// Example: opus fails → switch to codex → compact → switch back to opus → opus error\n\t\t// is still in context but shouldn't trigger compaction again.\n\t\tconst compactionEntry = getLatestCompactionEntry(this.sessionManager.getBranch());\n\t\tconst errorIsFromBeforeCompaction =\n\t\t\tcompactionEntry !== null && assistantMessage.timestamp < new Date(compactionEntry.timestamp).getTime();\n\n\t\t// Case 1: Overflow - LLM returned context overflow error\n\t\tif (sameModel && !errorIsFromBeforeCompaction && isContextOverflow(assistantMessage, contextWindow)) {\n\t\t\tif (this._overflowRecoveryAttempted) {\n\t\t\t\tthis._emit({\n\t\t\t\t\ttype: \"auto_compaction_end\",\n\t\t\t\t\tresult: undefined,\n\t\t\t\t\taborted: false,\n\t\t\t\t\twillRetry: false,\n\t\t\t\t\terrorMessage:\n\t\t\t\t\t\t\"Context overflow recovery failed after one compact-and-retry attempt. Try reducing context or switching to a larger-context model.\",\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._overflowRecoveryAttempted = true;\n\t\t\t// Remove the error message from agent state (it IS saved to session for history,\n\t\t\t// but we don't want it in context for the retry)\n\t\t\tconst messages = this.agent.state.messages;\n\t\t\tif (messages.length > 0 && messages[messages.length - 1].role === \"assistant\") {\n\t\t\t\tthis.agent.replaceMessages(messages.slice(0, -1));\n\t\t\t}\n\t\t\tawait this._runAutoCompaction(\"overflow\", true);\n\t\t\treturn;\n\t\t}\n\n\t\t// Case 2: Threshold - turn succeeded but context is getting large\n\t\t// Skip if this was an error (non-overflow errors don't have usage data)\n\t\tif (assistantMessage.stopReason === \"error\") return;\n\n\t\tconst contextTokens = calculateContextTokens(assistantMessage.usage);\n\t\tif (shouldCompact(contextTokens, contextWindow, settings)) {\n\t\t\tawait this._runAutoCompaction(\"threshold\", false);\n\t\t}\n\t}\n\n\t/**\n\t * Internal: Run auto-compaction with events.\n\t */\n\tprivate async _runAutoCompaction(reason: \"overflow\" | \"threshold\", willRetry: boolean): Promise<void> {\n\t\tconst settings = this.settingsManager.getCompactionSettings();\n\n\t\tthis._emit({ type: \"auto_compaction_start\", reason });\n\t\tthis._autoCompactionAbortController = new AbortController();\n\n\t\ttry {\n\t\t\tif (!this.model) {\n\t\t\t\tthis._emit({ type: \"auto_compaction_end\", result: undefined, aborted: false, willRetry: false });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst apiKey = await this._modelRegistry.getApiKey(this.model);\n\t\t\tif (!apiKey) {\n\t\t\t\tthis._emit({ type: \"auto_compaction_end\", result: undefined, aborted: false, willRetry: false });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst pathEntries = this.sessionManager.getBranch();\n\n\t\t\tconst preparation = prepareCompaction(pathEntries, settings);\n\t\t\tif (!preparation) {\n\t\t\t\tthis._emit({ type: \"auto_compaction_end\", result: undefined, aborted: false, willRetry: false });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet extensionCompaction: CompactionResult | undefined;\n\t\t\tlet fromExtension = false;\n\n\t\t\tif (this._extensionRunner?.hasHandlers(\"session_before_compact\")) {\n\t\t\t\tconst extensionResult = (await this._extensionRunner.emit({\n\t\t\t\t\ttype: \"session_before_compact\",\n\t\t\t\t\tpreparation,\n\t\t\t\t\tbranchEntries: pathEntries,\n\t\t\t\t\tcustomInstructions: undefined,\n\t\t\t\t\tsignal: this._autoCompactionAbortController.signal,\n\t\t\t\t})) as SessionBeforeCompactResult | undefined;\n\n\t\t\t\tif (extensionResult?.cancel) {\n\t\t\t\t\tthis._emit({ type: \"auto_compaction_end\", result: undefined, aborted: true, willRetry: false });\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (extensionResult?.compaction) {\n\t\t\t\t\textensionCompaction = extensionResult.compaction;\n\t\t\t\t\tfromExtension = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet summary: string;\n\t\t\tlet firstKeptEntryId: string;\n\t\t\tlet tokensBefore: number;\n\t\t\tlet details: unknown;\n\n\t\t\tif (extensionCompaction) {\n\t\t\t\t// Extension provided compaction content\n\t\t\t\tsummary = extensionCompaction.summary;\n\t\t\t\tfirstKeptEntryId = extensionCompaction.firstKeptEntryId;\n\t\t\t\ttokensBefore = extensionCompaction.tokensBefore;\n\t\t\t\tdetails = extensionCompaction.details;\n\t\t\t} else {\n\t\t\t\t// Generate compaction result\n\t\t\t\tconst compactResult = await compact(\n\t\t\t\t\tpreparation,\n\t\t\t\t\tthis.model,\n\t\t\t\t\tapiKey,\n\t\t\t\t\tundefined,\n\t\t\t\t\tthis._autoCompactionAbortController.signal,\n\t\t\t\t);\n\t\t\t\tsummary = compactResult.summary;\n\t\t\t\tfirstKeptEntryId = compactResult.firstKeptEntryId;\n\t\t\t\ttokensBefore = compactResult.tokensBefore;\n\t\t\t\tdetails = compactResult.details;\n\t\t\t}\n\n\t\t\tif (this._autoCompactionAbortController.signal.aborted) {\n\t\t\t\tthis._emit({ type: \"auto_compaction_end\", result: undefined, aborted: true, willRetry: false });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.sessionManager.appendCompaction(summary, firstKeptEntryId, tokensBefore, details, fromExtension);\n\t\t\tconst newEntries = this.sessionManager.getEntries();\n\t\t\tconst sessionContext = this.sessionManager.buildSessionContext();\n\t\t\tthis.agent.replaceMessages(sessionContext.messages);\n\n\t\t\t// Get the saved compaction entry for the extension event\n\t\t\tconst savedCompactionEntry = newEntries.find((e) => e.type === \"compaction\" && e.summary === summary) as\n\t\t\t\t| CompactionEntry\n\t\t\t\t| undefined;\n\n\t\t\tif (this._extensionRunner && savedCompactionEntry) {\n\t\t\t\tawait this._extensionRunner.emit({\n\t\t\t\t\ttype: \"session_compact\",\n\t\t\t\t\tcompactionEntry: savedCompactionEntry,\n\t\t\t\t\tfromExtension,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst result: CompactionResult = {\n\t\t\t\tsummary,\n\t\t\t\tfirstKeptEntryId,\n\t\t\t\ttokensBefore,\n\t\t\t\tdetails,\n\t\t\t};\n\t\t\tthis._emit({ type: \"auto_compaction_end\", result, aborted: false, willRetry });\n\n\t\t\tif (willRetry) {\n\t\t\t\tconst messages = this.agent.state.messages;\n\t\t\t\tconst lastMsg = messages[messages.length - 1];\n\t\t\t\tif (lastMsg?.role === \"assistant\" && (lastMsg as AssistantMessage).stopReason === \"error\") {\n\t\t\t\t\tthis.agent.replaceMessages(messages.slice(0, -1));\n\t\t\t\t}\n\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.agent.continue().catch(() => {});\n\t\t\t\t}, 100);\n\t\t\t} else if (this.agent.hasQueuedMessages()) {\n\t\t\t\t// Auto-compaction can complete while follow-up/steering/custom messages are waiting.\n\t\t\t\t// Kick the loop so queued messages are actually delivered.\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.agent.continue().catch(() => {});\n\t\t\t\t}, 100);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconst errorMessage = error instanceof Error ? error.message : \"compaction failed\";\n\t\t\tthis._emit({\n\t\t\t\ttype: \"auto_compaction_end\",\n\t\t\t\tresult: undefined,\n\t\t\t\taborted: false,\n\t\t\t\twillRetry: false,\n\t\t\t\terrorMessage:\n\t\t\t\t\treason === \"overflow\"\n\t\t\t\t\t\t? `Context overflow recovery failed: ${errorMessage}`\n\t\t\t\t\t\t: `Auto-compaction failed: ${errorMessage}`,\n\t\t\t});\n\t\t} finally {\n\t\t\tthis._autoCompactionAbortController = undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Toggle auto-compaction setting.\n\t */\n\tsetAutoCompactionEnabled(enabled: boolean): void {\n\t\tconst previous = this.settingsManager.getCompactionEnabled();\n\t\tthis.settingsManager.setCompactionEnabled(enabled);\n\t\tif (previous !== enabled) {\n\t\t\tthis._emitConfigChange({\n\t\t\t\tkey: \"auto_compaction_enabled\",\n\t\t\t\tprevious,\n\t\t\t\tcurrent: enabled,\n\t\t\t});\n\t\t}\n\t}\n\n\t/** Whether auto-compaction is enabled */\n\tget autoCompactionEnabled(): boolean {\n\t\treturn this.settingsManager.getCompactionEnabled();\n\t}\n\n\tasync bindExtensions(bindings: ExtensionBindings): Promise<void> {\n\t\tif (bindings.uiContext !== undefined) {\n\t\t\tthis._extensionUIContext = bindings.uiContext;\n\t\t}\n\t\tif (bindings.commandContextActions !== undefined) {\n\t\t\tthis._extensionCommandContextActions = bindings.commandContextActions;\n\t\t}\n\t\tif (bindings.shutdownHandler !== undefined) {\n\t\t\tthis._extensionShutdownHandler = bindings.shutdownHandler;\n\t\t}\n\t\tif (bindings.onError !== undefined) {\n\t\t\tthis._extensionErrorListener = bindings.onError;\n\t\t}\n\n\t\tif (this._extensionRunner) {\n\t\t\tthis._applyExtensionBindings(this._extensionRunner);\n\t\t\tawait this._extensionRunner.emit({ type: \"session_start\" });\n\t\t\tawait this.extendResourcesFromExtensions(\"startup\");\n\t\t}\n\t}\n\n\tprivate async extendResourcesFromExtensions(reason: \"startup\" | \"reload\"): Promise<void> {\n\t\tif (!this._extensionRunner?.hasHandlers(\"resources_discover\")) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst { skillPaths, promptPaths, themePaths } = await this._extensionRunner.emitResourcesDiscover(\n\t\t\tthis._cwd,\n\t\t\treason,\n\t\t);\n\n\t\tif (skillPaths.length === 0 && promptPaths.length === 0 && themePaths.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst extensionPaths: ResourceExtensionPaths = {\n\t\t\tskillPaths: this.buildExtensionResourcePaths(skillPaths),\n\t\t\tpromptPaths: this.buildExtensionResourcePaths(promptPaths),\n\t\t\tthemePaths: this.buildExtensionResourcePaths(themePaths),\n\t\t};\n\n\t\tthis._resourceLoader.extendResources(extensionPaths);\n\t\tthis._baseSystemPrompt = this._rebuildSystemPrompt(this.getActiveToolNames());\n\t\tthis.agent.setSystemPrompt(this._baseSystemPrompt);\n\t}\n\n\tprivate buildExtensionResourcePaths(entries: Array<{ path: string; extensionPath: string }>): Array<{\n\t\tpath: string;\n\t\tmetadata: { source: string; scope: \"temporary\"; origin: \"top-level\"; baseDir?: string };\n\t}> {\n\t\treturn entries.map((entry) => {\n\t\t\tconst source = this.getExtensionSourceLabel(entry.extensionPath);\n\t\t\tconst baseDir = entry.extensionPath.startsWith(\"<\") ? undefined : dirname(entry.extensionPath);\n\t\t\treturn {\n\t\t\t\tpath: entry.path,\n\t\t\t\tmetadata: {\n\t\t\t\t\tsource,\n\t\t\t\t\tscope: \"temporary\",\n\t\t\t\t\torigin: \"top-level\",\n\t\t\t\t\tbaseDir,\n\t\t\t\t},\n\t\t\t};\n\t\t});\n\t}\n\n\tprivate getExtensionSourceLabel(extensionPath: string): string {\n\t\tif (extensionPath.startsWith(\"<\")) {\n\t\t\treturn `extension:${extensionPath.replace(/[<>]/g, \"\")}`;\n\t\t}\n\t\tconst base = basename(extensionPath);\n\t\tconst name = base.replace(/\\.(ts|js)$/, \"\");\n\t\treturn `extension:${name}`;\n\t}\n\n\tprivate _applyExtensionBindings(runner: ExtensionRunner): void {\n\t\trunner.setUIContext(this._extensionUIContext);\n\t\trunner.bindCommandContext(this._extensionCommandContextActions);\n\n\t\tthis._extensionErrorUnsubscriber?.();\n\t\tthis._extensionErrorUnsubscriber = this._extensionErrorListener\n\t\t\t? runner.onError(this._extensionErrorListener)\n\t\t\t: undefined;\n\t}\n\n\tprivate _bindExtensionCore(runner: ExtensionRunner): void {\n\t\tconst normalizeLocation = (source: string): SlashCommandLocation | undefined => {\n\t\t\tif (source === \"user\" || source === \"project\" || source === \"path\") {\n\t\t\t\treturn source;\n\t\t\t}\n\t\t\treturn undefined;\n\t\t};\n\n\t\tconst reservedBuiltins = new Set(BUILTIN_SLASH_COMMANDS.map((command) => command.name));\n\n\t\tconst getCommands = (): SlashCommandInfo[] => {\n\t\t\tconst extensionCommands: SlashCommandInfo[] = runner\n\t\t\t\t.getRegisteredCommandsWithPaths()\n\t\t\t\t.filter(({ command }) => !reservedBuiltins.has(command.name))\n\t\t\t\t.map(({ command, extensionPath }) => ({\n\t\t\t\t\tname: command.name,\n\t\t\t\t\tdescription: command.description,\n\t\t\t\t\tsource: \"extension\",\n\t\t\t\t\tpath: extensionPath,\n\t\t\t\t}));\n\n\t\t\tconst templates: SlashCommandInfo[] = this.promptTemplates.map((template) => ({\n\t\t\t\tname: template.name,\n\t\t\t\tdescription: template.description,\n\t\t\t\tsource: \"prompt\",\n\t\t\t\tlocation: normalizeLocation(template.source),\n\t\t\t\tpath: template.filePath,\n\t\t\t}));\n\n\t\t\tconst skills: SlashCommandInfo[] = this._resourceLoader.getSkills().skills.map((skill) => ({\n\t\t\t\tname: `skill:${skill.name}`,\n\t\t\t\tdescription: skill.description,\n\t\t\t\tsource: \"skill\",\n\t\t\t\tlocation: normalizeLocation(skill.source),\n\t\t\t\tpath: skill.filePath,\n\t\t\t}));\n\n\t\t\treturn [...extensionCommands, ...templates, ...skills];\n\t\t};\n\n\t\trunner.bindCore(\n\t\t\t{\n\t\t\t\tsendMessage: (message, options) => {\n\t\t\t\t\tthis.sendCustomMessage(message, options).catch((err) => {\n\t\t\t\t\t\trunner.emitError({\n\t\t\t\t\t\t\textensionPath: \"<runtime>\",\n\t\t\t\t\t\t\tevent: \"send_message\",\n\t\t\t\t\t\t\terror: err instanceof Error ? err.message : String(err),\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tsendUserMessage: (content, options) => {\n\t\t\t\t\tthis.sendUserMessage(content, options).catch((err) => {\n\t\t\t\t\t\trunner.emitError({\n\t\t\t\t\t\t\textensionPath: \"<runtime>\",\n\t\t\t\t\t\t\tevent: \"send_user_message\",\n\t\t\t\t\t\t\terror: err instanceof Error ? err.message : String(err),\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tappendEntry: (customType, data) => {\n\t\t\t\t\tthis.sessionManager.appendCustomEntry(customType, data);\n\t\t\t\t},\n\t\t\t\tsetSessionName: (name) => {\n\t\t\t\t\tthis.sessionManager.appendSessionInfo(name);\n\t\t\t\t},\n\t\t\t\tgetSessionName: () => {\n\t\t\t\t\treturn this.sessionManager.getSessionName();\n\t\t\t\t},\n\t\t\t\tsetLabel: (entryId, label) => {\n\t\t\t\t\tthis.sessionManager.appendLabelChange(entryId, label);\n\t\t\t\t},\n\t\t\t\tgetActiveTools: () => this.getActiveToolNames(),\n\t\t\t\tgetAllTools: () => this.getAllTools(),\n\t\t\t\tsetActiveTools: (toolNames) => this.setActiveToolsByName(toolNames),\n\t\t\t\trefreshTools: () => this._refreshToolRegistry(),\n\t\t\t\tgetCommands,\n\t\t\t\tsetModel: async (model) => {\n\t\t\t\t\tconst key = await this.modelRegistry.getApiKey(model);\n\t\t\t\t\tif (!key) return false;\n\t\t\t\t\tawait this.setModel(model);\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\t\t\t\tgetThinkingLevel: () => this.thinkingLevel,\n\t\t\t\tsetThinkingLevel: (level) => this.setThinkingLevel(level),\n\t\t\t},\n\t\t\t{\n\t\t\t\tgetModel: () => this.model,\n\t\t\t\tisIdle: () => !this.isStreaming,\n\t\t\t\tabort: () => this.abort(),\n\t\t\t\thasPendingMessages: () => this.pendingMessageCount > 0,\n\t\t\t\tshutdown: () => {\n\t\t\t\t\tthis._extensionShutdownHandler?.();\n\t\t\t\t},\n\t\t\t\tgetContextUsage: () => this.getContextUsage(),\n\t\t\t\tcompact: (options) => {\n\t\t\t\t\tvoid (async () => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst result = await this.compact(options?.customInstructions);\n\t\t\t\t\t\t\toptions?.onComplete?.(result);\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tconst err = error instanceof Error ? error : new Error(String(error));\n\t\t\t\t\t\t\toptions?.onError?.(err);\n\t\t\t\t\t\t}\n\t\t\t\t\t})();\n\t\t\t\t},\n\t\t\t\tgetSystemPrompt: () => this.systemPrompt,\n\t\t\t},\n\t\t);\n\t}\n\n\tprivate _refreshToolRegistry(options?: { activeToolNames?: string[]; includeAllExtensionTools?: boolean }): void {\n\t\tconst previousRegistryNames = new Set(this._toolRegistry.keys());\n\t\tconst previousActiveToolNames = this.getActiveToolNames();\n\t\tconst enforceExtensionToolPermissions = this.settingsManager.getPermissionExtensionToolEnforcement();\n\n\t\tconst registeredTools = this._extensionRunner?.getAllRegisteredTools() ?? [];\n\t\tconst allCustomTools = [\n\t\t\t...registeredTools,\n\t\t\t...this._customTools.map((def) => ({ definition: def, extensionPath: \"<sdk>\" })),\n\t\t];\n\t\tconst requiredPermissionEntries = Object.entries(BUILTIN_TOOL_REQUIRED_PERMISSIONS).map(\n\t\t\t([name, permission]) => [name, permission] as const,\n\t\t);\n\t\tthis._toolRequiredPermissions = new Map(requiredPermissionEntries);\n\t\tfor (const registeredTool of allCustomTools) {\n\t\t\tconst existing = this._toolRequiredPermissions.get(registeredTool.definition.name);\n\t\t\tthis._toolRequiredPermissions.set(\n\t\t\t\tregisteredTool.definition.name,\n\t\t\t\tregisteredTool.definition.requiredPermission ?? existing,\n\t\t\t);\n\t\t}\n\t\tthis._toolPromptSnippets = new Map(\n\t\t\tallCustomTools\n\t\t\t\t.map((registeredTool) => {\n\t\t\t\t\tconst snippet = this._normalizePromptSnippet(\n\t\t\t\t\t\tregisteredTool.definition.promptSnippet ?? registeredTool.definition.description,\n\t\t\t\t\t);\n\t\t\t\t\treturn snippet ? ([registeredTool.definition.name, snippet] as const) : undefined;\n\t\t\t\t})\n\t\t\t\t.filter((entry): entry is readonly [string, string] => entry !== undefined),\n\t\t);\n\t\tthis._toolPromptGuidelines = new Map(\n\t\t\tallCustomTools\n\t\t\t\t.map((registeredTool) => {\n\t\t\t\t\tconst guidelines = this._normalizePromptGuidelines(registeredTool.definition.promptGuidelines);\n\t\t\t\t\treturn guidelines.length > 0 ? ([registeredTool.definition.name, guidelines] as const) : undefined;\n\t\t\t\t})\n\t\t\t\t.filter((entry): entry is readonly [string, string[]] => entry !== undefined),\n\t\t);\n\t\tconst wrappedExtensionTools = this._extensionRunner\n\t\t\t? wrapRegisteredTools(allCustomTools, this._extensionRunner, (registeredTool) => {\n\t\t\t\t\tconst toolSource = registeredTool.extensionPath === \"<sdk>\" ? \"custom\" : \"extension\";\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttoolSource,\n\t\t\t\t\t\tpermissionPolicy: {\n\t\t\t\t\t\t\tenabled: enforceExtensionToolPermissions && toolSource === \"extension\",\n\t\t\t\t\t\t\tguard: async (request) => this._evaluateToolPermission(request),\n\t\t\t\t\t\t\tcreateRequest: ({ toolName, params, requiredPermission, toolSource: source }) => ({\n\t\t\t\t\t\t\t\ttoolName,\n\t\t\t\t\t\t\t\tcwd: this._cwd,\n\t\t\t\t\t\t\t\tinput: params,\n\t\t\t\t\t\t\t\tsummary: `Extension tool ${toolName} ${this._summarizeToolPermissionInput(params)}`,\n\t\t\t\t\t\t\t\trequiredPermission,\n\t\t\t\t\t\t\t\ttoolSource: source,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t})\n\t\t\t: [];\n\n\t\tconst toolRegistry = new Map(this._baseToolRegistry);\n\t\tfor (const tool of wrappedExtensionTools as AgentTool[]) {\n\t\t\ttoolRegistry.set(tool.name, tool);\n\t\t}\n\n\t\tif (this._extensionRunner) {\n\t\t\tconst wrappedAllTools = wrapToolsWithExtensions(Array.from(toolRegistry.values()), this._extensionRunner);\n\t\t\tthis._toolRegistry = new Map(wrappedAllTools.map((tool) => [tool.name, tool]));\n\t\t} else {\n\t\t\tthis._toolRegistry = toolRegistry;\n\t\t}\n\n\t\tconst nextActiveToolNames = options?.activeToolNames\n\t\t\t? [...options.activeToolNames]\n\t\t\t: [...previousActiveToolNames];\n\n\t\tif (options?.includeAllExtensionTools) {\n\t\t\tfor (const tool of wrappedExtensionTools) {\n\t\t\t\tnextActiveToolNames.push(tool.name);\n\t\t\t}\n\t\t} else if (!options?.activeToolNames) {\n\t\t\tfor (const toolName of this._toolRegistry.keys()) {\n\t\t\t\tif (!previousRegistryNames.has(toolName)) {\n\t\t\t\t\tnextActiveToolNames.push(toolName);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.setActiveToolsByName([...new Set(nextActiveToolNames)]);\n\t}\n\n\tprivate _buildRuntime(options: {\n\t\tactiveToolNames?: string[];\n\t\tflagValues?: Map<string, boolean | string>;\n\t\tincludeAllExtensionTools?: boolean;\n\t}): void {\n\t\tconst autoResizeImages = this.settingsManager.getImageAutoResize();\n\t\tconst shellCommandPrefix = this.settingsManager.getShellCommandPrefix();\n\t\tconst baseTools = this._baseToolsOverride\n\t\t\t? this._baseToolsOverride\n\t\t\t\t\t: createAllTools(this._cwd, {\n\t\t\t\t\t\tread: { autoResizeImages },\n\t\t\t\t\t\tbash: {\n\t\t\t\t\t\t\tcommandPrefix: shellCommandPrefix,\n\t\t\t\t\t\t\tpermissionGuard: async (request) => this._evaluateToolPermission(request),\n\t\t\t\t\t\t},\n\t\t\t\t\t\tedit: {\n\t\t\t\t\t\t\tpermissionGuard: async (request) => this._evaluateToolPermission(request),\n\t\t\t\t\t\t},\n\t\t\t\t\t\twrite: {\n\t\t\t\t\t\t\tpermissionGuard: async (request) => this._evaluateToolPermission(request),\n\t\t\t\t\t\t},\n\t\t\t\t\t\tapplyPatch: {\n\t\t\t\t\t\t\tpermissionGuard: async (request) => this._evaluateToolPermission(request),\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsemantic: {\n\t\t\t\t\t\t\tauthStorage: this._modelRegistry.authStorage,\n\t\t\t\t\t\t},\n\t\t\t\t\tfetch: {\n\t\t\t\t\t\tresolveAllowedMethods: () => getAllowedFetchMethodsForProfile(this._profileName),\n\t\t\t\t\t\tpermissionGuard: async (request) => this._evaluateToolPermission(request),\n\t\t\t\t\t},\n\t\t\t\t\twebSearch: {\n\t\t\t\t\t\tresolveRuntimeConfig: () => ({\n\t\t\t\t\t\t\tenabled: this.settingsManager.getWebSearchEnabled(),\n\t\t\t\t\t\t\tproviderMode: this.settingsManager.getWebSearchProviderMode(),\n\t\t\t\t\t\t\tfallbackMode: this.settingsManager.getWebSearchFallbackMode(),\n\t\t\t\t\t\t\tsafeSearch: this.settingsManager.getWebSearchSafeSearch(),\n\t\t\t\t\t\t\tmaxResults: this.settingsManager.getWebSearchMaxResults(),\n\t\t\t\t\t\t\ttimeoutSeconds: this.settingsManager.getWebSearchTimeoutSeconds(),\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tresolveTavilyApiKey: () => this.settingsManager.getWebSearchTavilyApiKey(),\n\t\t\t\t\t\tresolveSearxngBaseUrl: () => this.settingsManager.getWebSearchSearxngUrl(),\n\t\t\t\t\t\tpermissionGuard: async (request) => this._evaluateToolPermission(request),\n\t\t\t\t\t},\n\t\t\t\t\tgitWrite: {\n\t\t\t\t\t\tresolveRuntimeConfig: () => ({\n\t\t\t\t\t\t\tnetworkEnabled: this.settingsManager.getGithubToolsNetworkEnabled(),\n\t\t\t\t\t\t}),\n\t\t\t\t\t\tresolveGithubToken: () => this.settingsManager.getGithubToolsToken(),\n\t\t\t\t\t\tpermissionGuard: async (request) => this._evaluateToolPermission(request),\n\t\t\t\t\t},\n\t\t\t\t\tfsOps: {\n\t\t\t\t\t\tpermissionGuard: async (request) => this._evaluateToolPermission(request),\n\t\t\t\t\t},\n\t\t\t\t\t\tdbRun: {\n\t\t\t\t\t\t\tresolveRuntimeConfig: () => this.settingsManager.getDbToolsSettings(),\n\t\t\t\t\t\t\tpermissionGuard: async (request) => this._evaluateToolPermission(request),\n\t\t\t\t\t\t},\n\t\t\t\t\t\ttoolCatalog: {\n\t\t\t\t\t\t\tresolveCatalog: () => {\n\t\t\t\t\t\t\t\tconst activeToolNames = new Set(this.getActiveToolNames());\n\t\t\t\t\t\t\t\treturn this.getAllTools().map((tool) => ({\n\t\t\t\t\t\t\t\t\tname: tool.name,\n\t\t\t\t\t\t\t\t\tdescription: tool.description,\n\t\t\t\t\t\t\t\t\tactive: activeToolNames.has(tool.name),\n\t\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\n\t\tthis._baseToolRegistry = new Map(Object.entries(baseTools).map(([name, tool]) => [name, tool as AgentTool]));\n\n\t\tconst extensionsResult = this._resourceLoader.getExtensions();\n\t\tif (options.flagValues) {\n\t\t\tfor (const [name, value] of options.flagValues) {\n\t\t\t\textensionsResult.runtime.flagValues.set(name, value);\n\t\t\t}\n\t\t}\n\n\t\tconst hasExtensions = extensionsResult.extensions.length > 0;\n\t\tconst hasCustomTools = this._customTools.length > 0;\n\t\tthis._extensionRunner =\n\t\t\thasExtensions || hasCustomTools\n\t\t\t\t? new ExtensionRunner(\n\t\t\t\t\t\textensionsResult.extensions,\n\t\t\t\t\t\textensionsResult.runtime,\n\t\t\t\t\t\tthis._cwd,\n\t\t\t\t\t\tthis.sessionManager,\n\t\t\t\t\t\tthis._modelRegistry,\n\t\t\t\t\t)\n\t\t\t\t: undefined;\n\t\tif (this._extensionRunnerRef) {\n\t\t\tthis._extensionRunnerRef.current = this._extensionRunner;\n\t\t}\n\t\tif (this._extensionRunner) {\n\t\t\tthis._bindExtensionCore(this._extensionRunner);\n\t\t\tthis._applyExtensionBindings(this._extensionRunner);\n\t\t}\n\n\t\tconst defaultActiveToolNames = this._baseToolsOverride\n\t\t\t? Object.keys(this._baseToolsOverride)\n\t\t\t: [\"read\", \"bash\", \"edit\", \"write\"];\n\t\tconst baseActiveToolNames = options.activeToolNames ?? defaultActiveToolNames;\n\t\tthis._refreshToolRegistry({\n\t\t\tactiveToolNames: baseActiveToolNames,\n\t\t\tincludeAllExtensionTools: options.includeAllExtensionTools,\n\t\t});\n\t}\n\n\tasync reload(): Promise<void> {\n\t\tconst previousFlagValues = this._extensionRunner?.getFlagValues();\n\t\tawait this._extensionRunner?.emit({ type: \"session_shutdown\" });\n\t\tthis.settingsManager.reload();\n\t\tresetApiProviders();\n\t\tawait this._resourceLoader.reload();\n\t\tthis._hooksConfig = this._resourceLoader.getHooks?.() ?? emptyHooksConfig();\n\t\tthis._buildRuntime({\n\t\t\tactiveToolNames: this.getActiveToolNames(),\n\t\t\tflagValues: previousFlagValues,\n\t\t\tincludeAllExtensionTools: true,\n\t\t});\n\n\t\tconst hasBindings =\n\t\t\tthis._extensionUIContext ||\n\t\t\tthis._extensionCommandContextActions ||\n\t\t\tthis._extensionShutdownHandler ||\n\t\t\tthis._extensionErrorListener;\n\t\tif (this._extensionRunner && hasBindings) {\n\t\t\tawait this._extensionRunner.emit({ type: \"session_start\" });\n\t\t\tawait this.extendResourcesFromExtensions(\"reload\");\n\t\t}\n\t}\n\n\t// =========================================================================\n\t// Auto-Retry\n\t// =========================================================================\n\n\t/**\n\t * Check if an error is retryable (overloaded, rate limit, server errors).\n\t * Context overflow errors are NOT retryable (handled by compaction instead).\n\t */\n\tprivate _isRetryableError(message: AssistantMessage): boolean {\n\t\tif (message.stopReason !== \"error\" || !message.errorMessage) return false;\n\n\t\t// Context overflow is handled by compaction, not retry\n\t\tconst contextWindow = this.model?.contextWindow ?? 0;\n\t\tif (isContextOverflow(message, contextWindow)) return false;\n\n\t\tconst err = message.errorMessage;\n\t\t// Match: overloaded_error, rate limit, 429, 500, 502, 503, 504, service unavailable, connection errors, fetch failed, terminated, retry delay exceeded\n\t\treturn /overloaded|rate.?limit|too many requests|429|500|502|503|504|service.?unavailable|server error|internal error|connection.?error|connection.?refused|other side closed|fetch failed|upstream.?connect|reset before headers|terminated|retry delay/i.test(\n\t\t\terr,\n\t\t);\n\t}\n\n\t/**\n\t * Handle retryable errors with exponential backoff.\n\t * @returns true if retry was initiated, false if max retries exceeded or disabled\n\t */\n\tprivate async _handleRetryableError(message: AssistantMessage): Promise<boolean> {\n\t\tconst settings = this.settingsManager.getRetrySettings();\n\t\tif (!settings.enabled) {\n\t\t\tthis._resolveRetry();\n\t\t\treturn false;\n\t\t}\n\n\t\t// Retry promise is created synchronously in _handleAgentEvent for agent_end.\n\t\t// Keep a defensive fallback here in case a future refactor bypasses that path.\n\t\tif (!this._retryPromise) {\n\t\t\tthis._retryPromise = new Promise((resolve) => {\n\t\t\t\tthis._retryResolve = resolve;\n\t\t\t});\n\t\t}\n\n\t\tthis._retryAttempt++;\n\n\t\tif (this._retryAttempt > settings.maxRetries) {\n\t\t\t// Max retries exceeded, emit final failure and reset\n\t\t\tthis._emit({\n\t\t\t\ttype: \"auto_retry_end\",\n\t\t\t\tsuccess: false,\n\t\t\t\tattempt: this._retryAttempt - 1,\n\t\t\t\tfinalError: message.errorMessage,\n\t\t\t});\n\t\t\tthis._retryAttempt = 0;\n\t\t\tthis._resolveRetry(); // Resolve so waitForRetry() completes\n\t\t\treturn false;\n\t\t}\n\n\t\tconst delayMs = settings.baseDelayMs * 2 ** (this._retryAttempt - 1);\n\n\t\tthis._emit({\n\t\t\ttype: \"auto_retry_start\",\n\t\t\tattempt: this._retryAttempt,\n\t\t\tmaxAttempts: settings.maxRetries,\n\t\t\tdelayMs,\n\t\t\terrorMessage: message.errorMessage || \"Unknown error\",\n\t\t});\n\n\t\t// Remove error message from agent state (keep in session for history)\n\t\tconst messages = this.agent.state.messages;\n\t\tif (messages.length > 0 && messages[messages.length - 1].role === \"assistant\") {\n\t\t\tthis.agent.replaceMessages(messages.slice(0, -1));\n\t\t}\n\n\t\t// Wait with exponential backoff (abortable)\n\t\tthis._retryAbortController = new AbortController();\n\t\ttry {\n\t\t\tawait sleep(delayMs, this._retryAbortController.signal);\n\t\t} catch {\n\t\t\t// Aborted during sleep - emit end event so UI can clean up\n\t\t\tconst attempt = this._retryAttempt;\n\t\t\tthis._retryAttempt = 0;\n\t\t\tthis._retryAbortController = undefined;\n\t\t\tthis._emit({\n\t\t\t\ttype: \"auto_retry_end\",\n\t\t\t\tsuccess: false,\n\t\t\t\tattempt,\n\t\t\t\tfinalError: \"Retry cancelled\",\n\t\t\t});\n\t\t\tthis._resolveRetry();\n\t\t\treturn false;\n\t\t}\n\t\tthis._retryAbortController = undefined;\n\n\t\t// Retry via continue() - use setTimeout to break out of event handler chain\n\t\tsetTimeout(() => {\n\t\t\tthis.agent.continue().catch(() => {\n\t\t\t\t// Retry failed - will be caught by next agent_end\n\t\t\t});\n\t\t}, 0);\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Cancel in-progress retry.\n\t */\n\tabortRetry(): void {\n\t\tthis._retryAbortController?.abort();\n\t\t// Note: _retryAttempt is reset in the catch block of _autoRetry\n\t\tthis._resolveRetry();\n\t}\n\n\t/**\n\t * Wait for any in-progress retry to complete.\n\t * Returns immediately if no retry is in progress.\n\t */\n\tprivate async waitForRetry(): Promise<void> {\n\t\tif (this._retryPromise) {\n\t\t\tawait this._retryPromise;\n\t\t}\n\t}\n\n\t/** Whether auto-retry is currently in progress */\n\tget isRetrying(): boolean {\n\t\treturn this._retryPromise !== undefined;\n\t}\n\n\t/** Whether auto-retry is enabled */\n\tget autoRetryEnabled(): boolean {\n\t\treturn this.settingsManager.getRetryEnabled();\n\t}\n\n\t/**\n\t * Toggle auto-retry setting.\n\t */\n\tsetAutoRetryEnabled(enabled: boolean): void {\n\t\tconst previous = this.settingsManager.getRetryEnabled();\n\t\tthis.settingsManager.setRetryEnabled(enabled);\n\t\tif (previous !== enabled) {\n\t\t\tthis._emitConfigChange({\n\t\t\t\tkey: \"retry_enabled\",\n\t\t\t\tprevious,\n\t\t\t\tcurrent: enabled,\n\t\t\t});\n\t\t}\n\t}\n\n\t// =========================================================================\n\t// Bash Execution\n\t// =========================================================================\n\n\t/**\n\t * Execute a bash command.\n\t * Adds result to agent context and session.\n\t * @param command The bash command to execute\n\t * @param onChunk Optional streaming callback for output\n\t * @param options.excludeFromContext If true, command output won't be sent to LLM (!! prefix)\n\t * @param options.operations Custom BashOperations for remote execution\n\t */\n\tasync executeBash(\n\t\tcommand: string,\n\t\tonChunk?: (chunk: string) => void,\n\t\toptions?: { excludeFromContext?: boolean; operations?: BashOperations; runInBackground?: boolean },\n\t): Promise<BashResult> {\n\t\tif (isReadOnlyProfileName(this._profileName)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Bash execution is disabled in ${this._profileName} profile. Switch to full/meta/iosm for command execution.`,\n\t\t\t);\n\t\t}\n\t\tthis._appendSessionTrace({\n\t\t\ttype: \"bash_start\",\n\t\t\tcommand,\n\t\t\texcludeFromContext: options?.excludeFromContext ?? false,\n\t\t});\n\t\tthis._bashAbortController = new AbortController();\n\n\t\t// Apply command prefix if configured (e.g., \"shopt -s expand_aliases\" for alias support)\n\t\tconst prefix = this.settingsManager.getShellCommandPrefix();\n\t\tconst resolvedCommand = prefix ? `${prefix}\\n${command}` : command;\n\n\t\ttry {\n\t\t\tlet result: BashResult;\n\t\t\tif (options?.runInBackground) {\n\t\t\t\tif (options.operations) {\n\t\t\t\t\tthrow new Error(\"Background bash is not supported with custom execution operations.\");\n\t\t\t\t}\n\t\t\t\tconst background = startBackgroundProcess({\n\t\t\t\t\trootCwd: this._cwd,\n\t\t\t\t\tcwd: this._cwd,\n\t\t\t\t\tcommand: resolvedCommand,\n\t\t\t\t\tsource: \"interactive\",\n\t\t\t\t});\n\t\t\t\tresult = {\n\t\t\t\t\toutput: `Started background process ${background.id} (pid ${background.pid}). Use /bg status ${background.id}, /bg logs ${background.id}, or /bg stop ${background.id}.`,\n\t\t\t\t\texitCode: undefined,\n\t\t\t\t\tcancelled: false,\n\t\t\t\t\ttruncated: false,\n\t\t\t\t\tbackgroundTaskId: background.id,\n\t\t\t\t\tbackgroundStatusPath: background.metaPath,\n\t\t\t\t\tbackgroundLogPath: background.logPath,\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tresult = options?.operations\n\t\t\t\t\t? await executeBashWithOperations(resolvedCommand, this._cwd, options.operations, {\n\t\t\t\t\t\t\tonChunk,\n\t\t\t\t\t\t\tsignal: this._bashAbortController.signal,\n\t\t\t\t\t\t})\n\t\t\t\t\t: await executeBashCommand(resolvedCommand, {\n\t\t\t\t\t\t\tcwd: this._cwd,\n\t\t\t\t\t\t\tonChunk,\n\t\t\t\t\t\t\tsignal: this._bashAbortController.signal,\n\t\t\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.recordBashResult(command, result, options);\n\t\t\tthis._appendSessionTrace({\n\t\t\t\ttype: \"bash_end\",\n\t\t\t\tcommand,\n\t\t\t\texitCode: result.exitCode,\n\t\t\t\tcancelled: result.cancelled,\n\t\t\t\ttruncated: result.truncated,\n\t\t\t\tbackgroundTaskId: result.backgroundTaskId ?? null,\n\t\t\t});\n\t\t\treturn result;\n\t\t} finally {\n\t\t\tthis._bashAbortController = undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Record a bash execution result in session history.\n\t * Used by executeBash and by extensions that handle bash execution themselves.\n\t */\n\trecordBashResult(command: string, result: BashResult, options?: { excludeFromContext?: boolean }): void {\n\t\tconst bashMessage: BashExecutionMessage = {\n\t\t\trole: \"bashExecution\",\n\t\t\tcommand,\n\t\t\toutput: result.output,\n\t\t\texitCode: result.exitCode,\n\t\t\tcancelled: result.cancelled,\n\t\t\ttruncated: result.truncated,\n\t\t\tfullOutputPath: result.fullOutputPath,\n\t\t\ttimestamp: Date.now(),\n\t\t\texcludeFromContext: options?.excludeFromContext,\n\t\t};\n\n\t\t// If agent is streaming, defer adding to avoid breaking tool_use/tool_result ordering\n\t\tif (this.isStreaming) {\n\t\t\t// Queue for later - will be flushed on agent_end\n\t\t\tthis._pendingBashMessages.push(bashMessage);\n\t\t} else {\n\t\t\t// Add to agent state immediately\n\t\t\tthis.agent.appendMessage(bashMessage);\n\n\t\t\t// Save to session\n\t\t\tthis.sessionManager.appendMessage(bashMessage);\n\t\t}\n\t}\n\n\t/**\n\t * Cancel running bash command.\n\t */\n\tabortBash(): void {\n\t\tthis._bashAbortController?.abort();\n\t}\n\n\t/** Whether a bash command is currently running */\n\tget isBashRunning(): boolean {\n\t\treturn this._bashAbortController !== undefined;\n\t}\n\n\t/** Whether there are pending bash messages waiting to be flushed */\n\tget hasPendingBashMessages(): boolean {\n\t\treturn this._pendingBashMessages.length > 0;\n\t}\n\n\t/**\n\t * Flush pending bash messages to agent state and session.\n\t * Called after agent turn completes to maintain proper message ordering.\n\t */\n\tprivate _flushPendingBashMessages(): void {\n\t\tif (this._pendingBashMessages.length === 0) return;\n\n\t\tfor (const bashMessage of this._pendingBashMessages) {\n\t\t\t// Add to agent state\n\t\t\tthis.agent.appendMessage(bashMessage);\n\n\t\t\t// Save to session\n\t\t\tthis.sessionManager.appendMessage(bashMessage);\n\t\t}\n\n\t\tthis._pendingBashMessages = [];\n\t}\n\n\t// =========================================================================\n\t// Session Management\n\t// =========================================================================\n\n\t/**\n\t * Switch to a different session file.\n\t * Aborts current operation, loads messages, restores model/thinking.\n\t * Listeners are preserved and will continue receiving events.\n\t * @returns true if switch completed, false if cancelled by extension\n\t */\n\tasync switchSession(sessionPath: string): Promise<boolean> {\n\t\tconst previousSessionFile = this.sessionManager.getSessionFile();\n\t\tthis._appendSessionTrace({\n\t\t\ttype: \"session_switch_start\",\n\t\t\tpreviousSessionFile: previousSessionFile ?? null,\n\t\t\ttargetSessionFile: sessionPath,\n\t\t});\n\n\t\t// Emit session_before_switch event (can be cancelled)\n\t\tif (this._extensionRunner?.hasHandlers(\"session_before_switch\")) {\n\t\t\tconst result = (await this._extensionRunner.emit({\n\t\t\t\ttype: \"session_before_switch\",\n\t\t\t\treason: \"resume\",\n\t\t\t\ttargetSessionFile: sessionPath,\n\t\t\t})) as SessionBeforeSwitchResult | undefined;\n\n\t\t\tif (result?.cancel) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tthis._disconnectFromAgent();\n\t\t\tawait this.abort();\n\t\t\tthis._steeringMessages = [];\n\t\t\tthis._followUpMessages = [];\n\t\t\tthis._metaMessages = [];\n\t\t\tthis._metaAppliedStep = 0;\n\t\t\tthis._pendingNextTurnMessages = [];\n\n\t\t// Set new session\n\t\tthis.sessionManager.setSessionFile(sessionPath);\n\t\tthis.agent.sessionId = this.sessionManager.getSessionId();\n\t\tthis._refreshSessionTracePath(\"switch_session\");\n\n\t\t// Reload messages\n\t\tconst sessionContext = this.sessionManager.buildSessionContext();\n\n\t\t// Emit session_switch event to extensions\n\t\tif (this._extensionRunner) {\n\t\t\tawait this._extensionRunner.emit({\n\t\t\t\ttype: \"session_switch\",\n\t\t\t\treason: \"resume\",\n\t\t\t\tpreviousSessionFile,\n\t\t\t});\n\t\t}\n\n\t\t// Emit session event to custom tools\n\n\t\tthis.agent.replaceMessages(sessionContext.messages);\n\n\t\t// Restore model if saved\n\t\tif (sessionContext.model) {\n\t\t\tconst previousModel = this.model;\n\t\t\tconst availableModels = await this._modelRegistry.getAvailable();\n\t\t\tconst match = availableModels.find(\n\t\t\t\t(m) => m.provider === sessionContext.model!.provider && m.id === sessionContext.model!.modelId,\n\t\t\t);\n\t\t\tif (match) {\n\t\t\t\tthis.agent.setModel(match);\n\t\t\t\tawait this._emitModelSelect(match, previousModel, \"restore\");\n\t\t\t}\n\t\t}\n\n\t\tconst hasThinkingEntry = this.sessionManager.getBranch().some((entry) => entry.type === \"thinking_level_change\");\n\t\tconst defaultThinkingLevel = this.settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL;\n\n\t\tif (hasThinkingEntry) {\n\t\t\t// Restore thinking level if saved (setThinkingLevel clamps to model capabilities)\n\t\t\tthis.setThinkingLevel(sessionContext.thinkingLevel as ThinkingLevel);\n\t\t} else {\n\t\t\tconst availableLevels = this.getAvailableThinkingLevels();\n\t\t\tconst effectiveLevel = availableLevels.includes(defaultThinkingLevel)\n\t\t\t\t? defaultThinkingLevel\n\t\t\t\t: this._clampThinkingLevel(defaultThinkingLevel, availableLevels);\n\t\t\tthis.agent.setThinkingLevel(effectiveLevel);\n\t\t\tthis.sessionManager.appendThinkingLevelChange(effectiveLevel);\n\t\t}\n\n\t\tthis._reconnectToAgent();\n\t\tthis._appendSessionTrace({\n\t\t\ttype: \"session_switch_complete\",\n\t\t\tsessionId: this.sessionManager.getSessionId(),\n\t\t\tsessionFile: this.sessionFile ?? null,\n\t\t});\n\t\treturn true;\n\t}\n\n\t/**\n\t * Set a display name for the current session.\n\t */\n\tsetSessionName(name: string): void {\n\t\tthis.sessionManager.appendSessionInfo(name);\n\t}\n\n\t/**\n\t * Create a fork from a specific entry.\n\t * Emits before_fork/fork session events to extensions.\n\t *\n\t * @param entryId ID of the entry to fork from\n\t * @returns Object with:\n\t * - selectedText: The text of the selected user message (for editor pre-fill)\n\t * - cancelled: True if an extension cancelled the fork\n\t */\n\tasync fork(entryId: string): Promise<{ selectedText: string; cancelled: boolean }> {\n\t\tconst previousSessionFile = this.sessionFile;\n\t\tthis._appendSessionTrace({\n\t\t\ttype: \"session_fork_start\",\n\t\t\tentryId,\n\t\t\tpreviousSessionFile: previousSessionFile ?? null,\n\t\t});\n\t\tconst selectedEntry = this.sessionManager.getEntry(entryId);\n\n\t\tif (!selectedEntry || selectedEntry.type !== \"message\" || selectedEntry.message.role !== \"user\") {\n\t\t\tthrow new Error(\"Invalid entry ID for forking\");\n\t\t}\n\n\t\tconst selectedText = this._extractUserMessageText(selectedEntry.message.content);\n\n\t\tlet skipConversationRestore = false;\n\n\t\t// Emit session_before_fork event (can be cancelled)\n\t\tif (this._extensionRunner?.hasHandlers(\"session_before_fork\")) {\n\t\t\tconst result = (await this._extensionRunner.emit({\n\t\t\t\ttype: \"session_before_fork\",\n\t\t\t\tentryId,\n\t\t\t})) as SessionBeforeForkResult | undefined;\n\n\t\t\tif (result?.cancel) {\n\t\t\t\treturn { selectedText, cancelled: true };\n\t\t\t}\n\t\t\tskipConversationRestore = result?.skipConversationRestore ?? false;\n\t\t}\n\n\t\t// Clear pending messages (bound to old session state)\n\t\tthis._pendingNextTurnMessages = [];\n\n\t\tif (!selectedEntry.parentId) {\n\t\t\tthis.sessionManager.newSession({ parentSession: previousSessionFile });\n\t\t} else {\n\t\t\tthis.sessionManager.createBranchedSession(selectedEntry.parentId);\n\t\t}\n\t\tthis.agent.sessionId = this.sessionManager.getSessionId();\n\t\tthis._refreshSessionTracePath(\"fork_session\");\n\n\t\t// Reload messages from entries (works for both file and in-memory mode)\n\t\tconst sessionContext = this.sessionManager.buildSessionContext();\n\n\t\t// Emit session_fork event to extensions (after fork completes)\n\t\tif (this._extensionRunner) {\n\t\t\tawait this._extensionRunner.emit({\n\t\t\t\ttype: \"session_fork\",\n\t\t\t\tpreviousSessionFile,\n\t\t\t});\n\t\t}\n\n\t\t// Emit session event to custom tools (with reason \"fork\")\n\n\t\tif (!skipConversationRestore) {\n\t\t\tthis.agent.replaceMessages(sessionContext.messages);\n\t\t}\n\n\t\tthis._appendSessionTrace({\n\t\t\ttype: \"session_fork_complete\",\n\t\t\tsessionId: this.sessionManager.getSessionId(),\n\t\t\tsessionFile: this.sessionFile ?? null,\n\t\t});\n\n\t\treturn { selectedText, cancelled: false };\n\t}\n\n\t// =========================================================================\n\t// Tree Navigation\n\t// =========================================================================\n\n\t/**\n\t * Navigate to a different node in the session tree.\n\t * Unlike fork() which creates a new session file, this stays in the same file.\n\t *\n\t * @param targetId The entry ID to navigate to\n\t * @param options.summarize Whether user wants to summarize abandoned branch\n\t * @param options.customInstructions Custom instructions for summarizer\n\t * @param options.replaceInstructions If true, customInstructions replaces the default prompt\n\t * @param options.label Label to attach to the branch summary entry\n\t * @returns Result with editorText (if user message) and cancelled status\n\t */\n\tasync navigateTree(\n\t\ttargetId: string,\n\t\toptions: { summarize?: boolean; customInstructions?: string; replaceInstructions?: boolean; label?: string } = {},\n\t): Promise<{ editorText?: string; cancelled: boolean; aborted?: boolean; summaryEntry?: BranchSummaryEntry }> {\n\t\tconst oldLeafId = this.sessionManager.getLeafId();\n\n\t\t// No-op if already at target\n\t\tif (targetId === oldLeafId) {\n\t\t\treturn { cancelled: false };\n\t\t}\n\n\t\t// Model required for summarization\n\t\tif (options.summarize && !this.model) {\n\t\t\tthrow new Error(\"No model available for summarization\");\n\t\t}\n\n\t\tconst targetEntry = this.sessionManager.getEntry(targetId);\n\t\tif (!targetEntry) {\n\t\t\tthrow new Error(`Entry ${targetId} not found`);\n\t\t}\n\n\t\t// Collect entries to summarize (from old leaf to common ancestor)\n\t\tconst { entries: entriesToSummarize, commonAncestorId } = collectEntriesForBranchSummary(\n\t\t\tthis.sessionManager,\n\t\t\toldLeafId,\n\t\t\ttargetId,\n\t\t);\n\n\t\t// Prepare event data - mutable so extensions can override\n\t\tlet customInstructions = options.customInstructions;\n\t\tlet replaceInstructions = options.replaceInstructions;\n\t\tlet label = options.label;\n\n\t\tconst preparation: TreePreparation = {\n\t\t\ttargetId,\n\t\t\toldLeafId,\n\t\t\tcommonAncestorId,\n\t\t\tentriesToSummarize,\n\t\t\tuserWantsSummary: options.summarize ?? false,\n\t\t\tcustomInstructions,\n\t\t\treplaceInstructions,\n\t\t\tlabel,\n\t\t};\n\n\t\t// Set up abort controller for summarization\n\t\tthis._branchSummaryAbortController = new AbortController();\n\t\tlet extensionSummary: { summary: string; details?: unknown } | undefined;\n\t\tlet fromExtension = false;\n\n\t\t// Emit session_before_tree event\n\t\tif (this._extensionRunner?.hasHandlers(\"session_before_tree\")) {\n\t\t\tconst result = (await this._extensionRunner.emit({\n\t\t\t\ttype: \"session_before_tree\",\n\t\t\t\tpreparation,\n\t\t\t\tsignal: this._branchSummaryAbortController.signal,\n\t\t\t})) as SessionBeforeTreeResult | undefined;\n\n\t\t\tif (result?.cancel) {\n\t\t\t\treturn { cancelled: true };\n\t\t\t}\n\n\t\t\tif (result?.summary && options.summarize) {\n\t\t\t\textensionSummary = result.summary;\n\t\t\t\tfromExtension = true;\n\t\t\t}\n\n\t\t\t// Allow extensions to override instructions and label\n\t\t\tif (result?.customInstructions !== undefined) {\n\t\t\t\tcustomInstructions = result.customInstructions;\n\t\t\t}\n\t\t\tif (result?.replaceInstructions !== undefined) {\n\t\t\t\treplaceInstructions = result.replaceInstructions;\n\t\t\t}\n\t\t\tif (result?.label !== undefined) {\n\t\t\t\tlabel = result.label;\n\t\t\t}\n\t\t}\n\n\t\t// Run default summarizer if needed\n\t\tlet summaryText: string | undefined;\n\t\tlet summaryDetails: unknown;\n\t\tif (options.summarize && entriesToSummarize.length > 0 && !extensionSummary) {\n\t\t\tconst model = this.model!;\n\t\t\tconst apiKey = await this._modelRegistry.getApiKey(model);\n\t\t\tif (!apiKey) {\n\t\t\t\tthrow new Error(`No API key for ${model.provider}`);\n\t\t\t}\n\t\t\tconst branchSummarySettings = this.settingsManager.getBranchSummarySettings();\n\t\t\tconst result = await generateBranchSummary(entriesToSummarize, {\n\t\t\t\tmodel,\n\t\t\t\tapiKey,\n\t\t\t\tsignal: this._branchSummaryAbortController.signal,\n\t\t\t\tcustomInstructions,\n\t\t\t\treplaceInstructions,\n\t\t\t\treserveTokens: branchSummarySettings.reserveTokens,\n\t\t\t});\n\t\t\tthis._branchSummaryAbortController = undefined;\n\t\t\tif (result.aborted) {\n\t\t\t\treturn { cancelled: true, aborted: true };\n\t\t\t}\n\t\t\tif (result.error) {\n\t\t\t\tthrow new Error(result.error);\n\t\t\t}\n\t\t\tsummaryText = result.summary;\n\t\t\tsummaryDetails = {\n\t\t\t\treadFiles: result.readFiles || [],\n\t\t\t\tmodifiedFiles: result.modifiedFiles || [],\n\t\t\t};\n\t\t} else if (extensionSummary) {\n\t\t\tsummaryText = extensionSummary.summary;\n\t\t\tsummaryDetails = extensionSummary.details;\n\t\t}\n\n\t\t// Determine the new leaf position based on target type\n\t\tlet newLeafId: string | null;\n\t\tlet editorText: string | undefined;\n\n\t\tif (targetEntry.type === \"message\" && targetEntry.message.role === \"user\") {\n\t\t\t// User message: leaf = parent (null if root), text goes to editor\n\t\t\tnewLeafId = targetEntry.parentId;\n\t\t\teditorText = this._extractUserMessageText(targetEntry.message.content);\n\t\t} else if (targetEntry.type === \"custom_message\") {\n\t\t\t// Custom message: leaf = parent (null if root), text goes to editor\n\t\t\tnewLeafId = targetEntry.parentId;\n\t\t\teditorText =\n\t\t\t\ttypeof targetEntry.content === \"string\"\n\t\t\t\t\t? targetEntry.content\n\t\t\t\t\t: targetEntry.content\n\t\t\t\t\t\t\t.filter((c): c is { type: \"text\"; text: string } => c.type === \"text\")\n\t\t\t\t\t\t\t.map((c) => c.text)\n\t\t\t\t\t\t\t.join(\"\");\n\t\t} else {\n\t\t\t// Non-user message: leaf = selected node\n\t\t\tnewLeafId = targetId;\n\t\t}\n\n\t\t// Switch leaf (with or without summary)\n\t\t// Summary is attached at the navigation target position (newLeafId), not the old branch\n\t\tlet summaryEntry: BranchSummaryEntry | undefined;\n\t\tif (summaryText) {\n\t\t\t// Create summary at target position (can be null for root)\n\t\t\tconst summaryId = this.sessionManager.branchWithSummary(newLeafId, summaryText, summaryDetails, fromExtension);\n\t\t\tsummaryEntry = this.sessionManager.getEntry(summaryId) as BranchSummaryEntry;\n\n\t\t\t// Attach label to the summary entry\n\t\t\tif (label) {\n\t\t\t\tthis.sessionManager.appendLabelChange(summaryId, label);\n\t\t\t}\n\t\t} else if (newLeafId === null) {\n\t\t\t// No summary, navigating to root - reset leaf\n\t\t\tthis.sessionManager.resetLeaf();\n\t\t} else {\n\t\t\t// No summary, navigating to non-root\n\t\t\tthis.sessionManager.branch(newLeafId);\n\t\t}\n\n\t\t// Attach label to target entry when not summarizing (no summary entry to label)\n\t\tif (label && !summaryText) {\n\t\t\tthis.sessionManager.appendLabelChange(targetId, label);\n\t\t}\n\n\t\t// Update agent state\n\t\tconst sessionContext = this.sessionManager.buildSessionContext();\n\t\tthis.agent.replaceMessages(sessionContext.messages);\n\n\t\t// Emit session_tree event\n\t\tif (this._extensionRunner) {\n\t\t\tawait this._extensionRunner.emit({\n\t\t\t\ttype: \"session_tree\",\n\t\t\t\tnewLeafId: this.sessionManager.getLeafId(),\n\t\t\t\toldLeafId,\n\t\t\t\tsummaryEntry,\n\t\t\t\tfromExtension: summaryText ? fromExtension : undefined,\n\t\t\t});\n\t\t}\n\n\t\t// Emit to custom tools\n\n\t\tthis._branchSummaryAbortController = undefined;\n\t\treturn { editorText, cancelled: false, summaryEntry };\n\t}\n\n\t/**\n\t * Get all user messages from session for fork selector.\n\t */\n\tgetUserMessagesForForking(): Array<{ entryId: string; text: string }> {\n\t\tconst entries = this.sessionManager.getEntries();\n\t\tconst result: Array<{ entryId: string; text: string }> = [];\n\n\t\tfor (const entry of entries) {\n\t\t\tif (entry.type !== \"message\") continue;\n\t\t\tif (entry.message.role !== \"user\") continue;\n\n\t\t\tconst text = this._extractUserMessageText(entry.message.content);\n\t\t\tif (text) {\n\t\t\t\tresult.push({ entryId: entry.id, text });\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tprivate _extractUserMessageText(content: string | Array<{ type: string; text?: string }>): string {\n\t\tif (typeof content === \"string\") return content;\n\t\tif (Array.isArray(content)) {\n\t\t\treturn content\n\t\t\t\t.filter((c): c is { type: \"text\"; text: string } => c.type === \"text\")\n\t\t\t\t.map((c) => c.text)\n\t\t\t\t.join(\"\");\n\t\t}\n\t\treturn \"\";\n\t}\n\n\t/**\n\t * Get session statistics.\n\t */\n\tgetSessionStats(): SessionStats {\n\t\tconst state = this.state;\n\t\tconst userMessages = state.messages.filter((m) => m.role === \"user\").length;\n\t\tconst assistantMessages = state.messages.filter((m) => m.role === \"assistant\").length;\n\t\tconst toolResults = state.messages.filter((m) => m.role === \"toolResult\").length;\n\n\t\tlet toolCalls = 0;\n\t\tlet totalInput = 0;\n\t\tlet totalOutput = 0;\n\t\tlet totalCacheRead = 0;\n\t\tlet totalCacheWrite = 0;\n\t\tlet totalCost = 0;\n\n\t\tfor (const message of state.messages) {\n\t\t\tif (message.role === \"assistant\") {\n\t\t\t\tconst assistantMsg = message as AssistantMessage;\n\t\t\t\ttoolCalls += assistantMsg.content.filter((c) => c.type === \"toolCall\").length;\n\t\t\t\ttotalInput += assistantMsg.usage.input;\n\t\t\t\ttotalOutput += assistantMsg.usage.output;\n\t\t\t\ttotalCacheRead += assistantMsg.usage.cacheRead;\n\t\t\t\ttotalCacheWrite += assistantMsg.usage.cacheWrite;\n\t\t\t\ttotalCost += resolveAssistantCostWithOpenRouterFallback(assistantMsg, (provider, modelId) =>\n\t\t\t\t\tthis.modelRegistry.find(provider, modelId),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tsessionFile: this.sessionFile,\n\t\t\tsessionId: this.sessionId,\n\t\t\tuserMessages,\n\t\t\tassistantMessages,\n\t\t\ttoolCalls,\n\t\t\ttoolResults,\n\t\t\ttotalMessages: state.messages.length,\n\t\t\ttokens: {\n\t\t\t\tinput: totalInput,\n\t\t\t\toutput: totalOutput,\n\t\t\t\tcacheRead: totalCacheRead,\n\t\t\t\tcacheWrite: totalCacheWrite,\n\t\t\t\ttotal: totalInput + totalOutput + totalCacheRead + totalCacheWrite,\n\t\t\t},\n\t\t\tcost: totalCost,\n\t\t};\n\t}\n\n\tgetContextUsage(): ContextUsage | undefined {\n\t\tconst model = this.model;\n\t\tif (!model) return undefined;\n\n\t\tconst contextWindow = model.contextWindow ?? 0;\n\t\tif (contextWindow <= 0) return undefined;\n\n\t\t// After compaction, the last assistant usage reflects pre-compaction context size.\n\t\t// We can only trust usage from an assistant that responded after the latest compaction.\n\t\t// If no such assistant exists, context token count is unknown until the next LLM response.\n\t\tconst branchEntries = this.sessionManager.getBranch();\n\t\tconst latestCompaction = getLatestCompactionEntry(branchEntries);\n\n\t\tif (latestCompaction) {\n\t\t\t// Check if there's a valid assistant usage after the compaction boundary\n\t\t\tconst compactionIndex = branchEntries.lastIndexOf(latestCompaction);\n\t\t\tlet hasPostCompactionUsage = false;\n\t\t\tfor (let i = branchEntries.length - 1; i > compactionIndex; i--) {\n\t\t\t\tconst entry = branchEntries[i];\n\t\t\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\t\t\tconst assistant = entry.message;\n\t\t\t\t\tif (assistant.stopReason !== \"aborted\" && assistant.stopReason !== \"error\") {\n\t\t\t\t\t\tconst contextTokens = calculateContextTokens(assistant.usage);\n\t\t\t\t\t\tif (contextTokens > 0) {\n\t\t\t\t\t\t\thasPostCompactionUsage = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!hasPostCompactionUsage) {\n\t\t\t\treturn { tokens: null, contextWindow, percent: null };\n\t\t\t}\n\t\t}\n\n\t\tconst estimate = estimateContextTokens(this.messages);\n\t\tconst percent = (estimate.tokens / contextWindow) * 100;\n\n\t\treturn {\n\t\t\ttokens: estimate.tokens,\n\t\t\tcontextWindow,\n\t\t\tpercent,\n\t\t};\n\t}\n\n\t/**\n\t * Export session to HTML.\n\t * @param outputPath Optional output path (defaults to session directory)\n\t * @returns Path to exported file\n\t */\n\tasync exportToHtml(outputPath?: string): Promise<string> {\n\t\tconst themeName = this.settingsManager.getTheme();\n\n\t\t// Create tool renderer if we have an extension runner (for custom tool HTML rendering)\n\t\tlet toolRenderer: ToolHtmlRenderer | undefined;\n\t\tif (this._extensionRunner) {\n\t\t\ttoolRenderer = createToolHtmlRenderer({\n\t\t\t\tgetToolDefinition: (name) => this._extensionRunner!.getToolDefinition(name),\n\t\t\t\ttheme,\n\t\t\t});\n\t\t}\n\n\t\treturn await exportSessionToHtml(this.sessionManager, this.state, {\n\t\t\toutputPath,\n\t\t\tthemeName,\n\t\t\ttoolRenderer,\n\t\t});\n\t}\n\n\t// =========================================================================\n\t// Utilities\n\t// =========================================================================\n\n\t/**\n\t * Get text content of last assistant message.\n\t * Useful for /copy command.\n\t * @returns Text content, or undefined if no assistant message exists\n\t */\n\tgetLastAssistantText(): string | undefined {\n\t\tconst lastAssistant = this.messages\n\t\t\t.slice()\n\t\t\t.reverse()\n\t\t\t.find((m) => {\n\t\t\t\tif (m.role !== \"assistant\") return false;\n\t\t\t\tconst msg = m as AssistantMessage;\n\t\t\t\t// Skip aborted messages with no content\n\t\t\t\tif (msg.stopReason === \"aborted\" && msg.content.length === 0) return false;\n\t\t\t\treturn true;\n\t\t\t});\n\n\t\tif (!lastAssistant) return undefined;\n\n\t\tlet text = \"\";\n\t\tfor (const content of (lastAssistant as AssistantMessage).content) {\n\t\t\tif (content.type === \"text\") {\n\t\t\t\ttext += content.text;\n\t\t\t}\n\t\t}\n\n\t\treturn text.trim() || undefined;\n\t}\n\n\t// =========================================================================\n\t// Extension System\n\t// =========================================================================\n\n\t/**\n\t * Check if extensions have handlers for a specific event type.\n\t */\n\thasExtensionHandlers(eventType: string): boolean {\n\t\treturn this._extensionRunner?.hasHandlers(eventType) ?? false;\n\t}\n\n\t/**\n\t * Get the extension runner (for setting UI context and error handlers).\n\t */\n\tget extensionRunner(): ExtensionRunner | undefined {\n\t\treturn this._extensionRunner;\n\t}\n}\n"]}
|