@quantum-ai/roo-code-cli 0.5.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +131 -0
- package/dist/index.mjs +20421 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types/api.ts","../src/types/model.ts","../src/types/codebase-index.ts","../src/types/providers/anthropic.ts","../src/types/providers/baseten.ts","../src/types/providers/bedrock.ts","../src/types/providers/deepseek.ts","../src/types/providers/fireworks.ts","../src/types/providers/gemini.ts","../src/types/providers/lite-llm.ts","../src/types/providers/lm-studio.ts","../src/types/providers/mistral.ts","../src/types/providers/moonshot.ts","../src/types/providers/ollama.ts","../src/types/providers/openai.ts","../src/types/providers/openai-codex.ts","../src/types/providers/openai-codex-rate-limits.ts","../src/types/providers/openrouter.ts","../src/types/providers/poe.ts","../src/types/providers/qwen-code.ts","../src/types/providers/requesty.ts","../src/types/providers/sambanova.ts","../src/types/providers/unbound.ts","../src/types/providers/vertex.ts","../src/types/providers/vscode-llm.ts","../src/types/providers/xai.ts","../src/types/providers/vercel-ai-gateway.ts","../src/types/providers/zai.ts","../src/types/providers/minimax.ts","../src/types/providers/index.ts","../src/types/provider-settings.ts","../src/types/history.ts","../src/types/experiment.ts","../src/types/tool.ts","../src/types/mode.ts","../src/types/vscode.ts","../src/types/global-settings.ts","../src/types/cli.ts","../src/types/organization.ts","../src/types/context-management.ts","../src/types/cookie-consent.ts","../src/types/custom-tool.ts","../src/types/embedding.ts","../src/types/message.ts","../src/types/events.ts","../src/types/followup.ts","../src/types/git.ts","../src/types/image-generation.ts","../src/types/ipc.ts","../src/types/mcp.ts","../src/types/task.ts","../src/types/todo.ts","../src/types/skills.ts","../src/types/terminal.ts","../src/types/tool-params.ts","../src/types/type-fu.ts","../src/types/vscode-extension-host.ts","../src/types/worktree.ts","../src/types/index.ts","../src/cli/types/types.ts","../src/cli/types/json-events.ts","../src/cli/types/index.ts","../src/cli/types/constants.ts","../src/cli/lib/storage/config-dir.ts","../src/core/task-history/index.ts","../src/core/debug-log/index.ts","../src/core/utils/path.ts","../src/core/utils/index.ts","../src/core/message-utils/consolidateTokenUsage.ts","../src/core/message-utils/consolidateApiRequests.ts","../src/core/message-utils/safeJsonParse.ts","../src/core/message-utils/consolidateCommands.ts","../src/core/message-utils/index.ts","../src/lib/utils/index.ts","../src/cli/ui/components/Select.tsx","../src/cli/lib/utils/commands.ts","../src/cli/lib/utils/path.ts","../src/cli/lib/utils/context-window.ts","../src/cli/ui/theme.ts","../src/cli/ui/store.ts","../src/cli/ui/stores/uiStateStore.ts","../src/cli/ui/hooks/useTerminalSize.ts","../src/cli/ui/hooks/TerminalSizeContext.tsx","../src/cli/ui/hooks/useToast.ts","../src/cli/lib/storage/history.ts","../src/cli/ui/hooks/useInputHistory.ts","../src/cli/ui/hooks/useFollowupCountdown.ts","../src/cli/ui/hooks/useFocusManagement.ts","../src/cli/ui/utils/tools.ts","../src/cli/ui/hooks/useMessageHandlers.ts","../src/cli/ui/hooks/useExtensionHost.ts","../src/cli/ui/hooks/useTaskSubmit.ts","../src/cli/lib/utils/input.ts","../src/cli/ui/hooks/useGlobalInput.ts","../src/cli/ui/hooks/usePickerHandlers.ts","../src/cli/ui/hooks/index.ts","../src/cli/ui/utils/views.ts","../src/cli/ui/utils/index.ts","../src/cli/ui/components/ProgressBar.tsx","../src/cli/ui/components/MetricsDisplay.tsx","../src/cli/ui/components/Header.tsx","../src/cli/ui/components/Icon.tsx","../src/cli/ui/components/TodoDisplay.tsx","../src/cli/ui/components/tools/types.ts","../src/cli/ui/components/tools/utils.ts","../src/cli/ui/components/tools/FileReadTool.tsx","../src/cli/ui/components/tools/FileWriteTool.tsx","../src/cli/ui/components/tools/SearchTool.tsx","../src/cli/ui/components/tools/CommandTool.tsx","../src/cli/ui/components/tools/ModeTool.tsx","../src/cli/ui/components/tools/CompletionTool.tsx","../src/cli/ui/components/tools/GenericTool.tsx","../src/cli/ui/components/tools/index.ts","../src/cli/ui/components/ChatHistoryItem.tsx","../node_modules/cli-spinners/spinners.json","../node_modules/cli-spinners/index.js","../src/cli/ui/components/LoadingText.tsx","../src/cli/ui/components/ToastDisplay.tsx","../src/cli/ui/components/HorizontalLine.tsx","../src/cli/ui/components/MultilineTextInput.tsx","../src/cli/ui/components/autocomplete/useAutocompletePicker.ts","../src/cli/ui/components/autocomplete/AutocompleteInput.tsx","../src/cli/ui/components/autocomplete/PickerSelect.tsx","../src/cli/ui/components/autocomplete/types.ts","../src/cli/ui/components/autocomplete/triggers/FileTrigger.tsx","../src/cli/ui/components/autocomplete/triggers/SlashCommandTrigger.tsx","../src/cli/ui/components/autocomplete/triggers/ModeTrigger.tsx","../src/cli/ui/components/autocomplete/triggers/HelpTrigger.tsx","../src/cli/ui/components/autocomplete/triggers/HistoryTrigger.tsx","../src/cli/ui/components/autocomplete/triggers/index.ts","../src/cli/ui/components/autocomplete/index.ts","../src/cli/ui/components/ScrollArea.tsx","../src/cli/ui/components/ScrollIndicator.tsx","../src/cli/ui/App.tsx","../src/cli/index.ts","../src/cli/lib/utils/version.ts","../src/cli/commands/cli/run.ts","../src/core/vscode-shim/classes/Position.ts","../src/core/vscode-shim/classes/Range.ts","../src/core/vscode-shim/classes/Selection.ts","../src/core/vscode-shim/classes/Uri.ts","../src/core/vscode-shim/classes/EventEmitter.ts","../src/core/vscode-shim/classes/TextEdit.ts","../src/core/vscode-shim/classes/Additional.ts","../src/core/vscode-shim/classes/CancellationToken.ts","../src/core/vscode-shim/utils/logger.ts","../src/core/vscode-shim/classes/OutputChannel.ts","../src/core/vscode-shim/classes/StatusBarItem.ts","../src/core/vscode-shim/classes/TextEditorDecorationType.ts","../src/core/vscode-shim/context/ExtensionContext.ts","../src/core/vscode-shim/storage/Memento.ts","../src/core/vscode-shim/utils/paths.ts","../src/core/vscode-shim/storage/SecretStorage.ts","../src/core/vscode-shim/api/FileSystemAPI.ts","../src/core/vscode-shim/api/WorkspaceConfiguration.ts","../src/core/vscode-shim/types.ts","../src/core/vscode-shim/api/WorkspaceAPI.ts","../src/core/vscode-shim/api/TabGroupsAPI.ts","../src/core/vscode-shim/api/WindowAPI.ts","../src/core/vscode-shim/api/CommandsAPI.ts","../src/core/vscode-shim/utils/machine-id.ts","../src/core/vscode-shim/api/create-vscode-api-mock.ts","../src/cli/agent/agent-state.ts","../src/cli/agent/json-event-emitter.ts","../src/cli/lib/storage/index.ts","../src/cli/lib/storage/settings.ts","../src/cli/lib/storage/ephemeral.ts","../src/cli/lib/task-history/index.ts","../src/cli/lib/utils/provider.ts","../src/cli/lib/utils/shell.ts","../src/cli/lib/utils/extension.ts","../src/cli/lib/utils/session-id.ts","../src/cli/agent/extension-host.ts","../src/cli/agent/events.ts","../src/cli/agent/state-store.ts","../src/cli/agent/message-processor.ts","../src/cli/agent/extension-client.ts","../src/cli/agent/output-manager.ts","../src/cli/agent/prompt-manager.ts","../src/cli/agent/ask-dispatcher.ts","../src/cli/commands/cli/cancellation.ts","../src/cli/commands/cli/stdin-stream.ts","../src/cli/lib/utils/guards.ts","../src/cli/commands/cli/list.ts","../src/cli/commands/cli/upgrade.ts"],"sourcesContent":["import type { EventEmitter } from \"events\"\nimport type { Socket } from \"net\"\n\nimport type { RooCodeEvents } from \"./events.js\"\nimport type { RooCodeSettings } from \"./global-settings.js\"\nimport type { ProviderSettingsEntry, ProviderSettings } from \"./provider-settings.js\"\nimport type { IpcMessage, IpcServerEvents } from \"./ipc.js\"\n\nexport type RooCodeAPIEvents = RooCodeEvents\n\nexport interface RooCodeAPI extends EventEmitter<RooCodeAPIEvents> {\n\t/**\n\t * Starts a new task with an optional initial message and images.\n\t * @param task Optional initial task message.\n\t * @param images Optional array of image data URIs (e.g., \"data:image/webp;base64,...\").\n\t * @returns The ID of the new task.\n\t */\n\tstartNewTask({\n\t\tconfiguration,\n\t\ttext,\n\t\timages,\n\t\tnewTab,\n\t}: {\n\t\tconfiguration?: RooCodeSettings\n\t\ttext?: string\n\t\timages?: string[]\n\t\tnewTab?: boolean\n\t}): Promise<string>\n\t/**\n\t * Resumes a task with the given ID.\n\t * @param taskId The ID of the task to resume.\n\t * @throws Error if the task is not found in the task history.\n\t */\n\tresumeTask(taskId: string): Promise<void>\n\t/**\n\t * Checks if a task with the given ID is in the task history.\n\t * @param taskId The ID of the task to check.\n\t * @returns True if the task is in the task history, false otherwise.\n\t */\n\tisTaskInHistory(taskId: string): Promise<boolean>\n\t/**\n\t * Returns the current task stack.\n\t * @returns An array of task IDs.\n\t */\n\tgetCurrentTaskStack(): string[]\n\t/**\n\t * Clears the current task.\n\t */\n\tclearCurrentTask(lastMessage?: string): Promise<void>\n\t/**\n\t * Cancels the current task.\n\t */\n\tcancelCurrentTask(): Promise<void>\n\t/**\n\t * Sends a message to the current task.\n\t * @param message Optional message to send.\n\t * @param images Optional array of image data URIs (e.g., \"data:image/webp;base64,...\").\n\t */\n\tsendMessage(message?: string, images?: string[]): Promise<void>\n\t/**\n\t * Simulates pressing the primary button in the chat interface.\n\t */\n\tpressPrimaryButton(): Promise<void>\n\t/**\n\t * Simulates pressing the secondary button in the chat interface.\n\t */\n\tpressSecondaryButton(): Promise<void>\n\t/**\n\t * Returns true if the API is ready to use.\n\t */\n\tisReady(): boolean\n\t/**\n\t * Returns the current configuration.\n\t * @returns The current configuration.\n\t */\n\tgetConfiguration(): RooCodeSettings\n\t/**\n\t * Sets the configuration for the current task.\n\t * @param values An object containing key-value pairs to set.\n\t */\n\tsetConfiguration(values: RooCodeSettings): Promise<void>\n\t/**\n\t * Returns a list of all configured profile names\n\t * @returns Array of profile names\n\t */\n\tgetProfiles(): string[]\n\t/**\n\t * Returns the profile entry for a given name\n\t * @param name The name of the profile\n\t * @returns The profile entry, or undefined if the profile does not exist\n\t */\n\tgetProfileEntry(name: string): ProviderSettingsEntry | undefined\n\t/**\n\t * Creates a new API configuration profile\n\t * @param name The name of the profile\n\t * @param profile The profile to create; defaults to an empty object\n\t * @param activate Whether to activate the profile after creation; defaults to true\n\t * @returns The ID of the created profile\n\t * @throws Error if the profile already exists\n\t */\n\tcreateProfile(name: string, profile?: ProviderSettings, activate?: boolean): Promise<string>\n\t/**\n\t * Updates an existing API configuration profile\n\t * @param name The name of the profile\n\t * @param profile The profile to update\n\t * @param activate Whether to activate the profile after update; defaults to true\n\t * @returns The ID of the updated profile\n\t * @throws Error if the profile does not exist\n\t */\n\tupdateProfile(name: string, profile: ProviderSettings, activate?: boolean): Promise<string | undefined>\n\t/**\n\t * Creates a new API configuration profile or updates an existing one\n\t * @param name The name of the profile\n\t * @param profile The profile to create or update; defaults to an empty object\n\t * @param activate Whether to activate the profile after upsert; defaults to true\n\t * @returns The ID of the upserted profile\n\t */\n\tupsertProfile(name: string, profile: ProviderSettings, activate?: boolean): Promise<string | undefined>\n\t/**\n\t * Deletes a profile by name\n\t * @param name The name of the profile to delete\n\t * @throws Error if the profile does not exist\n\t */\n\tdeleteProfile(name: string): Promise<void>\n\t/**\n\t * Returns the name of the currently active profile\n\t * @returns The profile name, or undefined if no profile is active\n\t */\n\tgetActiveProfile(): string | undefined\n\t/**\n\t * Changes the active API configuration profile\n\t * @param name The name of the profile to activate\n\t * @throws Error if the profile does not exist\n\t */\n\tsetActiveProfile(name: string): Promise<string | undefined>\n}\n\nexport interface RooCodeIpcServer extends EventEmitter<IpcServerEvents> {\n\tlisten(): void\n\tbroadcast(message: IpcMessage): void\n\tsend(client: string | Socket, message: IpcMessage): void\n\tget socketPath(): string\n\tget isListening(): boolean\n}\n","import { z } from \"zod\"\nimport { DynamicProvider, LocalProvider } from \"./provider-settings.js\"\n\n/**\n * ReasoningEffort\n */\n\nexport const reasoningEfforts = [\"low\", \"medium\", \"high\"] as const\n\nexport const reasoningEffortsSchema = z.enum(reasoningEfforts)\n\nexport type ReasoningEffort = z.infer<typeof reasoningEffortsSchema>\n\n/**\n * ReasoningEffortWithMinimal\n */\n\nexport const reasoningEffortWithMinimalSchema = z.union([reasoningEffortsSchema, z.literal(\"minimal\")])\n\nexport type ReasoningEffortWithMinimal = z.infer<typeof reasoningEffortWithMinimalSchema>\n\n/**\n * Extended Reasoning Effort (includes \"none\" and \"minimal\")\n * Note: \"disable\" is a UI/control value, not a value sent as effort\n */\nexport const reasoningEffortsExtended = [\"none\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\"] as const\n\nexport const reasoningEffortExtendedSchema = z.enum(reasoningEffortsExtended)\n\nexport type ReasoningEffortExtended = z.infer<typeof reasoningEffortExtendedSchema>\n\n/**\n * Reasoning Effort user setting (includes \"disable\")\n */\nexport const reasoningEffortSettingValues = [\"disable\", \"none\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\"] as const\nexport const reasoningEffortSettingSchema = z.enum(reasoningEffortSettingValues)\n\n/**\n * Verbosity\n */\n\nexport const verbosityLevels = [\"low\", \"medium\", \"high\"] as const\n\nexport const verbosityLevelsSchema = z.enum(verbosityLevels)\n\nexport type VerbosityLevel = z.infer<typeof verbosityLevelsSchema>\n\n/**\n * Service tiers (OpenAI Responses API)\n */\nexport const serviceTiers = [\"default\", \"flex\", \"priority\"] as const\nexport const serviceTierSchema = z.enum(serviceTiers)\nexport type ServiceTier = z.infer<typeof serviceTierSchema>\n\n/**\n * ModelParameter\n */\n\nexport const modelParameters = [\"max_tokens\", \"temperature\", \"reasoning\", \"include_reasoning\"] as const\n\nexport const modelParametersSchema = z.enum(modelParameters)\n\nexport type ModelParameter = z.infer<typeof modelParametersSchema>\n\nexport const isModelParameter = (value: string): value is ModelParameter =>\n\tmodelParameters.includes(value as ModelParameter)\n\n/**\n * ModelInfo\n */\n\nexport const modelInfoSchema = z.object({\n\tmaxTokens: z.number().nullish(),\n\tmaxThinkingTokens: z.number().nullish(),\n\tcontextWindow: z.number(),\n\tsupportsImages: z.boolean().optional(),\n\tsupportsPromptCache: z.boolean(),\n\t// Optional default prompt cache retention policy for providers that support it.\n\t// When set to \"24h\", extended prompt caching will be requested; when omitted\n\t// or set to \"in_memory\", the default in‑memory cache is used.\n\tpromptCacheRetention: z.enum([\"in_memory\", \"24h\"]).optional(),\n\t// Capability flag to indicate whether the model supports an output verbosity parameter\n\tsupportsVerbosity: z.boolean().optional(),\n\tsupportsReasoningBudget: z.boolean().optional(),\n\t// Capability flag to indicate whether the model supports simple on/off binary reasoning\n\tsupportsReasoningBinary: z.boolean().optional(),\n\t// Capability flag to indicate whether the model supports temperature parameter\n\tsupportsTemperature: z.boolean().optional(),\n\tdefaultTemperature: z.number().optional(),\n\trequiredReasoningBudget: z.boolean().optional(),\n\tsupportsReasoningEffort: z\n\t\t.union([z.boolean(), z.array(z.enum([\"disable\", \"none\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\"]))])\n\t\t.optional(),\n\trequiredReasoningEffort: z.boolean().optional(),\n\tpreserveReasoning: z.boolean().optional(),\n\tsupportedParameters: z.array(modelParametersSchema).optional(),\n\tinputPrice: z.number().optional(),\n\toutputPrice: z.number().optional(),\n\tcacheWritesPrice: z.number().optional(),\n\tcacheReadsPrice: z.number().optional(),\n\tlongContextPricing: z\n\t\t.object({\n\t\t\tthresholdTokens: z.number(),\n\t\t\tinputPriceMultiplier: z.number().optional(),\n\t\t\toutputPriceMultiplier: z.number().optional(),\n\t\t\tcacheWritesPriceMultiplier: z.number().optional(),\n\t\t\tcacheReadsPriceMultiplier: z.number().optional(),\n\t\t\tappliesToServiceTiers: z.array(serviceTierSchema).optional(),\n\t\t})\n\t\t.optional(),\n\tdescription: z.string().optional(),\n\t// Default effort value for models that support reasoning effort\n\treasoningEffort: reasoningEffortExtendedSchema.optional(),\n\tminTokensPerCachePoint: z.number().optional(),\n\tmaxCachePoints: z.number().optional(),\n\tcachableFields: z.array(z.string()).optional(),\n\t// Flag to indicate if the model is deprecated and should not be used\n\tdeprecated: z.boolean().optional(),\n\t// Flag to indicate if the model should hide vendor/company identity in responses\n\tisStealthModel: z.boolean().optional(),\n\t// Flag to indicate if the model is free (no cost)\n\tisFree: z.boolean().optional(),\n\t// Exclude specific native tools from being available (only applies to native protocol)\n\t// These tools will be removed from the set of tools available to the model\n\texcludedTools: z.array(z.string()).optional(),\n\t// Include specific native tools (only applies to native protocol)\n\t// These tools will be added if they belong to an allowed group in the current mode\n\t// Cannot force-add tools from groups the mode doesn't allow\n\tincludedTools: z.array(z.string()).optional(),\n\t/**\n\t * Service tiers with pricing information.\n\t * Each tier can have a name (for OpenAI service tiers) and pricing overrides.\n\t * The top-level input/output/cache* fields represent the default/standard tier.\n\t */\n\ttiers: z\n\t\t.array(\n\t\t\tz.object({\n\t\t\t\tname: serviceTierSchema.optional(), // Service tier name (flex, priority, etc.)\n\t\t\t\tcontextWindow: z.number(),\n\t\t\t\tinputPrice: z.number().optional(),\n\t\t\t\toutputPrice: z.number().optional(),\n\t\t\t\tcacheWritesPrice: z.number().optional(),\n\t\t\t\tcacheReadsPrice: z.number().optional(),\n\t\t\t}),\n\t\t)\n\t\t.optional(),\n})\n\nexport type ModelInfo = z.infer<typeof modelInfoSchema>\n\nexport type ModelRecord = Record<string, ModelInfo>\n\nexport type RouterModels = Record<DynamicProvider | LocalProvider, ModelRecord>\n","import { z } from \"zod\"\n\n/**\n * Codebase Index Constants\n */\nexport const CODEBASE_INDEX_DEFAULTS = {\n\tMIN_SEARCH_RESULTS: 10,\n\tMAX_SEARCH_RESULTS: 200,\n\tDEFAULT_SEARCH_RESULTS: 50,\n\tSEARCH_RESULTS_STEP: 10,\n\tMIN_SEARCH_SCORE: 0,\n\tMAX_SEARCH_SCORE: 1,\n\tDEFAULT_SEARCH_MIN_SCORE: 0.4,\n\tSEARCH_SCORE_STEP: 0.05,\n} as const\n\n/**\n * CodebaseIndexConfig\n */\n\nexport const codebaseIndexConfigSchema = z.object({\n\tcodebaseIndexEnabled: z.boolean().optional(),\n\tcodebaseIndexQdrantUrl: z.string().optional(),\n\tcodebaseIndexEmbedderProvider: z\n\t\t.enum([\n\t\t\t\"openai\",\n\t\t\t\"ollama\",\n\t\t\t\"openai-compatible\",\n\t\t\t\"gemini\",\n\t\t\t\"mistral\",\n\t\t\t\"vercel-ai-gateway\",\n\t\t\t\"bedrock\",\n\t\t\t\"openrouter\",\n\t\t])\n\t\t.optional(),\n\tcodebaseIndexEmbedderBaseUrl: z.string().optional(),\n\tcodebaseIndexEmbedderModelId: z.string().optional(),\n\tcodebaseIndexEmbedderModelDimension: z.number().optional(),\n\tcodebaseIndexSearchMinScore: z.number().min(0).max(1).optional(),\n\tcodebaseIndexSearchMaxResults: z\n\t\t.number()\n\t\t.min(CODEBASE_INDEX_DEFAULTS.MIN_SEARCH_RESULTS)\n\t\t.max(CODEBASE_INDEX_DEFAULTS.MAX_SEARCH_RESULTS)\n\t\t.optional(),\n\t// OpenAI Compatible specific fields\n\tcodebaseIndexOpenAiCompatibleBaseUrl: z.string().optional(),\n\tcodebaseIndexOpenAiCompatibleModelDimension: z.number().optional(),\n\t// Bedrock specific fields\n\tcodebaseIndexBedrockRegion: z.string().optional(),\n\tcodebaseIndexBedrockProfile: z.string().optional(),\n\t// OpenRouter specific fields\n\tcodebaseIndexOpenRouterSpecificProvider: z.string().optional(),\n})\n\nexport type CodebaseIndexConfig = z.infer<typeof codebaseIndexConfigSchema>\n\n/**\n * CodebaseIndexModels\n */\n\nexport const codebaseIndexModelsSchema = z.object({\n\topenai: z.record(z.string(), z.object({ dimension: z.number() })).optional(),\n\tollama: z.record(z.string(), z.object({ dimension: z.number() })).optional(),\n\t\"openai-compatible\": z.record(z.string(), z.object({ dimension: z.number() })).optional(),\n\tgemini: z.record(z.string(), z.object({ dimension: z.number() })).optional(),\n\tmistral: z.record(z.string(), z.object({ dimension: z.number() })).optional(),\n\t\"vercel-ai-gateway\": z.record(z.string(), z.object({ dimension: z.number() })).optional(),\n\topenrouter: z.record(z.string(), z.object({ dimension: z.number() })).optional(),\n\tbedrock: z.record(z.string(), z.object({ dimension: z.number() })).optional(),\n})\n\nexport type CodebaseIndexModels = z.infer<typeof codebaseIndexModelsSchema>\n\n/**\n * CdebaseIndexProvider\n */\n\nexport const codebaseIndexProviderSchema = z.object({\n\tcodeIndexOpenAiKey: z.string().optional(),\n\tcodeIndexQdrantApiKey: z.string().optional(),\n\tcodebaseIndexOpenAiCompatibleBaseUrl: z.string().optional(),\n\tcodebaseIndexOpenAiCompatibleApiKey: z.string().optional(),\n\tcodebaseIndexOpenAiCompatibleModelDimension: z.number().optional(),\n\tcodebaseIndexGeminiApiKey: z.string().optional(),\n\tcodebaseIndexMistralApiKey: z.string().optional(),\n\tcodebaseIndexVercelAiGatewayApiKey: z.string().optional(),\n\tcodebaseIndexOpenRouterApiKey: z.string().optional(),\n})\n\nexport type CodebaseIndexProvider = z.infer<typeof codebaseIndexProviderSchema>\n","import type { ModelInfo } from \"../model.js\"\n\n// https://docs.anthropic.com/en/docs/about-claude/models\n// https://platform.claude.com/docs/en/about-claude/pricing\n\nexport type AnthropicModelId = keyof typeof anthropicModels\nexport const anthropicDefaultModelId: AnthropicModelId = \"claude-sonnet-4-5\"\n\nexport const anthropicModels = {\n\t\"claude-sonnet-4-6\": {\n\t\tmaxTokens: 64_000, // Overridden to 8k if `enableReasoningEffort` is false.\n\t\tcontextWindow: 200_000, // Default 200K, extendable to 1M with beta flag 'context-1m-2025-08-07'\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 3.0, // $3 per million input tokens (≤200K context)\n\t\toutputPrice: 15.0, // $15 per million output tokens (≤200K context)\n\t\tcacheWritesPrice: 3.75, // $3.75 per million tokens\n\t\tcacheReadsPrice: 0.3, // $0.30 per million tokens\n\t\tsupportsReasoningBudget: true,\n\t\t// Tiered pricing for extended context (requires beta flag 'context-1m-2025-08-07')\n\t\ttiers: [\n\t\t\t{\n\t\t\t\tcontextWindow: 1_000_000, // 1M tokens with beta flag\n\t\t\t\tinputPrice: 6.0, // $6 per million input tokens (>200K context)\n\t\t\t\toutputPrice: 22.5, // $22.50 per million output tokens (>200K context)\n\t\t\t\tcacheWritesPrice: 7.5, // $7.50 per million tokens (>200K context)\n\t\t\t\tcacheReadsPrice: 0.6, // $0.60 per million tokens (>200K context)\n\t\t\t},\n\t\t],\n\t},\n\t\"claude-sonnet-4-5\": {\n\t\tmaxTokens: 64_000, // Overridden to 8k if `enableReasoningEffort` is false.\n\t\tcontextWindow: 200_000, // Default 200K, extendable to 1M with beta flag 'context-1m-2025-08-07'\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 3.0, // $3 per million input tokens (≤200K context)\n\t\toutputPrice: 15.0, // $15 per million output tokens (≤200K context)\n\t\tcacheWritesPrice: 3.75, // $3.75 per million tokens\n\t\tcacheReadsPrice: 0.3, // $0.30 per million tokens\n\t\tsupportsReasoningBudget: true,\n\t\t// Tiered pricing for extended context (requires beta flag 'context-1m-2025-08-07')\n\t\ttiers: [\n\t\t\t{\n\t\t\t\tcontextWindow: 1_000_000, // 1M tokens with beta flag\n\t\t\t\tinputPrice: 6.0, // $6 per million input tokens (>200K context)\n\t\t\t\toutputPrice: 22.5, // $22.50 per million output tokens (>200K context)\n\t\t\t\tcacheWritesPrice: 7.5, // $7.50 per million tokens (>200K context)\n\t\t\t\tcacheReadsPrice: 0.6, // $0.60 per million tokens (>200K context)\n\t\t\t},\n\t\t],\n\t},\n\t\"claude-sonnet-4-20250514\": {\n\t\tmaxTokens: 64_000, // Overridden to 8k if `enableReasoningEffort` is false.\n\t\tcontextWindow: 200_000, // Default 200K, extendable to 1M with beta flag 'context-1m-2025-08-07'\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 3.0, // $3 per million input tokens (≤200K context)\n\t\toutputPrice: 15.0, // $15 per million output tokens (≤200K context)\n\t\tcacheWritesPrice: 3.75, // $3.75 per million tokens\n\t\tcacheReadsPrice: 0.3, // $0.30 per million tokens\n\t\tsupportsReasoningBudget: true,\n\t\t// Tiered pricing for extended context (requires beta flag 'context-1m-2025-08-07')\n\t\ttiers: [\n\t\t\t{\n\t\t\t\tcontextWindow: 1_000_000, // 1M tokens with beta flag\n\t\t\t\tinputPrice: 6.0, // $6 per million input tokens (>200K context)\n\t\t\t\toutputPrice: 22.5, // $22.50 per million output tokens (>200K context)\n\t\t\t\tcacheWritesPrice: 7.5, // $7.50 per million tokens (>200K context)\n\t\t\t\tcacheReadsPrice: 0.6, // $0.60 per million tokens (>200K context)\n\t\t\t},\n\t\t],\n\t},\n\t\"claude-opus-4-6\": {\n\t\tmaxTokens: 128_000, // Overridden to 8k if `enableReasoningEffort` is false.\n\t\tcontextWindow: 200_000, // Default 200K, extendable to 1M with beta flag\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 5.0, // $5 per million input tokens (≤200K context)\n\t\toutputPrice: 25.0, // $25 per million output tokens (≤200K context)\n\t\tcacheWritesPrice: 6.25, // $6.25 per million tokens\n\t\tcacheReadsPrice: 0.5, // $0.50 per million tokens\n\t\tsupportsReasoningBudget: true,\n\t\t// Tiered pricing for extended context (requires beta flag)\n\t\ttiers: [\n\t\t\t{\n\t\t\t\tcontextWindow: 1_000_000, // 1M tokens with beta flag\n\t\t\t\tinputPrice: 10.0, // $10 per million input tokens (>200K context)\n\t\t\t\toutputPrice: 37.5, // $37.50 per million output tokens (>200K context)\n\t\t\t\tcacheWritesPrice: 12.5, // $12.50 per million tokens (>200K context)\n\t\t\t\tcacheReadsPrice: 1.0, // $1.00 per million tokens (>200K context)\n\t\t\t},\n\t\t],\n\t},\n\t\"claude-opus-4-5-20251101\": {\n\t\tmaxTokens: 32_000, // Overridden to 8k if `enableReasoningEffort` is false.\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 5.0, // $5 per million input tokens\n\t\toutputPrice: 25.0, // $25 per million output tokens\n\t\tcacheWritesPrice: 6.25, // $6.25 per million tokens\n\t\tcacheReadsPrice: 0.5, // $0.50 per million tokens\n\t\tsupportsReasoningBudget: true,\n\t},\n\t\"claude-opus-4-1-20250805\": {\n\t\tmaxTokens: 32_000, // Overridden to 8k if `enableReasoningEffort` is false.\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 15.0, // $15 per million input tokens\n\t\toutputPrice: 75.0, // $75 per million output tokens\n\t\tcacheWritesPrice: 18.75, // $18.75 per million tokens\n\t\tcacheReadsPrice: 1.5, // $1.50 per million tokens\n\t\tsupportsReasoningBudget: true,\n\t},\n\t\"claude-opus-4-20250514\": {\n\t\tmaxTokens: 32_000, // Overridden to 8k if `enableReasoningEffort` is false.\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 15.0, // $15 per million input tokens\n\t\toutputPrice: 75.0, // $75 per million output tokens\n\t\tcacheWritesPrice: 18.75, // $18.75 per million tokens\n\t\tcacheReadsPrice: 1.5, // $1.50 per million tokens\n\t\tsupportsReasoningBudget: true,\n\t},\n\t\"claude-3-7-sonnet-20250219:thinking\": {\n\t\tmaxTokens: 128_000, // Unlocked by passing `beta` flag to the model. Otherwise, it's 64k.\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 3.0, // $3 per million input tokens\n\t\toutputPrice: 15.0, // $15 per million output tokens\n\t\tcacheWritesPrice: 3.75, // $3.75 per million tokens\n\t\tcacheReadsPrice: 0.3, // $0.30 per million tokens\n\t\tsupportsReasoningBudget: true,\n\t\trequiredReasoningBudget: true,\n\t},\n\t\"claude-3-7-sonnet-20250219\": {\n\t\tmaxTokens: 8192, // Since we already have a `:thinking` virtual model we aren't setting `supportsReasoningBudget: true` here.\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 3.0, // $3 per million input tokens\n\t\toutputPrice: 15.0, // $15 per million output tokens\n\t\tcacheWritesPrice: 3.75, // $3.75 per million tokens\n\t\tcacheReadsPrice: 0.3, // $0.30 per million tokens\n\t},\n\t\"claude-3-5-sonnet-20241022\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 3.0, // $3 per million input tokens\n\t\toutputPrice: 15.0, // $15 per million output tokens\n\t\tcacheWritesPrice: 3.75, // $3.75 per million tokens\n\t\tcacheReadsPrice: 0.3, // $0.30 per million tokens\n\t},\n\t\"claude-3-5-haiku-20241022\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 1.0,\n\t\toutputPrice: 5.0,\n\t\tcacheWritesPrice: 1.25,\n\t\tcacheReadsPrice: 0.1,\n\t},\n\t\"claude-3-opus-20240229\": {\n\t\tmaxTokens: 4096,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 15.0,\n\t\toutputPrice: 75.0,\n\t\tcacheWritesPrice: 18.75,\n\t\tcacheReadsPrice: 1.5,\n\t},\n\t\"claude-3-haiku-20240307\": {\n\t\tmaxTokens: 4096,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0.25,\n\t\toutputPrice: 1.25,\n\t\tcacheWritesPrice: 0.3,\n\t\tcacheReadsPrice: 0.03,\n\t},\n\t\"claude-haiku-4-5-20251001\": {\n\t\tmaxTokens: 64_000,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 1.0,\n\t\toutputPrice: 5.0,\n\t\tcacheWritesPrice: 1.25,\n\t\tcacheReadsPrice: 0.1,\n\t\tsupportsReasoningBudget: true,\n\t\tdescription:\n\t\t\t\"Claude Haiku 4.5 delivers near-frontier intelligence at lightning speeds with extended thinking, vision, and multilingual support.\",\n\t},\n} as const satisfies Record<string, ModelInfo>\n\nexport const ANTHROPIC_DEFAULT_MAX_TOKENS = 8192\n","import type { ModelInfo } from \"../model.js\"\n\n// Baseten\n// https://baseten.co/products/model-apis/\n\nexport const basetenModels = {\n\t\"moonshotai/Kimi-K2-Thinking\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 262_000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.6,\n\t\toutputPrice: 2.5,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0,\n\t\tdescription: \"Kimi K2 Thinking - A model with enhanced reasoning capabilities from Kimi K2\",\n\t},\n\t\"zai-org/GLM-4.6\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.6,\n\t\toutputPrice: 2.2,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0,\n\t\tdescription: \"Frontier open model with advanced agentic, reasoning and coding capabilities\",\n\t},\n\t\"deepseek-ai/DeepSeek-R1\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 163_840,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 2.55,\n\t\toutputPrice: 5.95,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0,\n\t\tdescription: \"DeepSeek's first-generation reasoning model\",\n\t},\n\t\"deepseek-ai/DeepSeek-R1-0528\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 163_840,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 2.55,\n\t\toutputPrice: 5.95,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0,\n\t\tdescription: \"The latest revision of DeepSeek's first-generation reasoning model\",\n\t},\n\t\"deepseek-ai/DeepSeek-V3-0324\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 163_840,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.77,\n\t\toutputPrice: 0.77,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0,\n\t\tdescription: \"Fast general-purpose LLM with enhanced reasoning capabilities\",\n\t},\n\t\"deepseek-ai/DeepSeek-V3.1\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 163_840,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.5,\n\t\toutputPrice: 1.5,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0,\n\t\tdescription:\n\t\t\t\"Extremely capable general-purpose LLM with hybrid reasoning capabilities and advanced tool calling\",\n\t},\n\t\"deepseek-ai/DeepSeek-V3.2\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 163_840,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.3,\n\t\toutputPrice: 0.45,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0,\n\t\tdescription:\n\t\t\t\"DeepSeek's hybrid reasoning model with efficient long context scaling with GPT-5 level performance\",\n\t},\n\t\"openai/gpt-oss-120b\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 128_072,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.1,\n\t\toutputPrice: 0.5,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0,\n\t\tdescription: \"Extremely capable general-purpose LLM with strong, controllable reasoning capabilities\",\n\t},\n\t\"Qwen/Qwen3-235B-A22B-Instruct-2507\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 262_144,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.22,\n\t\toutputPrice: 0.8,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0,\n\t\tdescription: \"Mixture-of-experts LLM with math and reasoning capabilities\",\n\t},\n\t\"Qwen/Qwen3-Coder-480B-A35B-Instruct\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 262_144,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.38,\n\t\toutputPrice: 1.53,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0,\n\t\tdescription: \"Mixture-of-experts LLM with advanced coding and reasoning capabilities\",\n\t},\n\t\"moonshotai/Kimi-K2-Instruct-0905\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 262_000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.6,\n\t\toutputPrice: 2.5,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0,\n\t\tdescription: \"State of the art language model for agentic and coding tasks. September Update.\",\n\t},\n} as const satisfies Record<string, ModelInfo>\n\nexport type BasetenModelId = keyof typeof basetenModels\n\nexport const basetenDefaultModelId = \"zai-org/GLM-4.6\" satisfies BasetenModelId\n","import type { ModelInfo } from \"../model.js\"\n\n// https://docs.aws.amazon.com/bedrock/latest/userguide/conversation-inference.html\n\nexport type BedrockModelId = keyof typeof bedrockModels\n\nexport const bedrockDefaultModelId: BedrockModelId = \"anthropic.claude-sonnet-4-5-20250929-v1:0\"\n\nexport const bedrockDefaultPromptRouterModelId: BedrockModelId = \"anthropic.claude-3-sonnet-20240229-v1:0\"\n\n// March, 12 2025 - updated prices to match US-West-2 list price shown at\n// https://aws.amazon.com/bedrock/pricing, including older models that are part\n// of the default prompt routers AWS enabled for GA of the promot router\n// feature.\nexport const bedrockModels = {\n\t\"anthropic.claude-sonnet-4-5-20250929-v1:0\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningBudget: true,\n\t\tinputPrice: 3.0,\n\t\toutputPrice: 15.0,\n\t\tcacheWritesPrice: 3.75,\n\t\tcacheReadsPrice: 0.3,\n\t\tminTokensPerCachePoint: 1024,\n\t\tmaxCachePoints: 4,\n\t\tcachableFields: [\"system\", \"messages\", \"tools\"],\n\t},\n\t\"anthropic.claude-sonnet-4-6\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 200_000, // Default 200K, extendable to 1M with beta flag 'context-1m-2025-08-07'\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningBudget: true,\n\t\tinputPrice: 3.0, // $3 per million input tokens (≤200K context)\n\t\toutputPrice: 15.0, // $15 per million output tokens (≤200K context)\n\t\tcacheWritesPrice: 3.75, // $3.75 per million tokens\n\t\tcacheReadsPrice: 0.3, // $0.30 per million tokens\n\t\tminTokensPerCachePoint: 1024,\n\t\tmaxCachePoints: 4,\n\t\tcachableFields: [\"system\", \"messages\", \"tools\"],\n\t\t// Tiered pricing for extended context (requires beta flag 'context-1m-2025-08-07')\n\t\ttiers: [\n\t\t\t{\n\t\t\t\tcontextWindow: 1_000_000, // 1M tokens with beta flag\n\t\t\t\tinputPrice: 6.0, // $6 per million input tokens (>200K context)\n\t\t\t\toutputPrice: 22.5, // $22.50 per million output tokens (>200K context)\n\t\t\t\tcacheWritesPrice: 7.5, // $7.50 per million tokens (>200K context)\n\t\t\t\tcacheReadsPrice: 0.6, // $0.60 per million tokens (>200K context)\n\t\t\t},\n\t\t],\n\t},\n\t\"amazon.nova-pro-v1:0\": {\n\t\tmaxTokens: 5000,\n\t\tcontextWindow: 300_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0.8,\n\t\toutputPrice: 3.2,\n\t\tcacheWritesPrice: 0.8, // per million tokens\n\t\tcacheReadsPrice: 0.2, // per million tokens\n\t\tminTokensPerCachePoint: 1,\n\t\tmaxCachePoints: 1,\n\t\tcachableFields: [\"system\"],\n\t},\n\t\"amazon.nova-pro-latency-optimized-v1:0\": {\n\t\tmaxTokens: 5000,\n\t\tcontextWindow: 300_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 1.0,\n\t\toutputPrice: 4.0,\n\t\tcacheWritesPrice: 1.0, // per million tokens\n\t\tcacheReadsPrice: 0.25, // per million tokens\n\t\tdescription: \"Amazon Nova Pro with latency optimized inference\",\n\t},\n\t\"amazon.nova-lite-v1:0\": {\n\t\tmaxTokens: 5000,\n\t\tcontextWindow: 300_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0.06,\n\t\toutputPrice: 0.24,\n\t\tcacheWritesPrice: 0.06, // per million tokens\n\t\tcacheReadsPrice: 0.015, // per million tokens\n\t\tminTokensPerCachePoint: 1,\n\t\tmaxCachePoints: 1,\n\t\tcachableFields: [\"system\"],\n\t},\n\t\"amazon.nova-2-lite-v1:0\": {\n\t\tmaxTokens: 65_535,\n\t\tcontextWindow: 1_000_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0.33,\n\t\toutputPrice: 2.75,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0.0825, // 75% less than input price\n\t\tminTokensPerCachePoint: 1,\n\t\tmaxCachePoints: 1,\n\t\tcachableFields: [\"system\"],\n\t\tdescription: \"Amazon Nova 2 Lite - Comparable to Claude Haiku 4.5\",\n\t},\n\t\"amazon.nova-micro-v1:0\": {\n\t\tmaxTokens: 5000,\n\t\tcontextWindow: 128_000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0.035,\n\t\toutputPrice: 0.14,\n\t\tcacheWritesPrice: 0.035, // per million tokens\n\t\tcacheReadsPrice: 0.00875, // per million tokens\n\t\tminTokensPerCachePoint: 1,\n\t\tmaxCachePoints: 1,\n\t\tcachableFields: [\"system\"],\n\t},\n\t\"anthropic.claude-sonnet-4-20250514-v1:0\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningBudget: true,\n\t\tinputPrice: 3.0,\n\t\toutputPrice: 15.0,\n\t\tcacheWritesPrice: 3.75,\n\t\tcacheReadsPrice: 0.3,\n\t\tminTokensPerCachePoint: 1024,\n\t\tmaxCachePoints: 4,\n\t\tcachableFields: [\"system\", \"messages\", \"tools\"],\n\t},\n\t\"anthropic.claude-opus-4-1-20250805-v1:0\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningBudget: true,\n\t\tinputPrice: 15.0,\n\t\toutputPrice: 75.0,\n\t\tcacheWritesPrice: 18.75,\n\t\tcacheReadsPrice: 1.5,\n\t\tminTokensPerCachePoint: 1024,\n\t\tmaxCachePoints: 4,\n\t\tcachableFields: [\"system\", \"messages\", \"tools\"],\n\t},\n\t\"anthropic.claude-opus-4-6-v1\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 200_000, // Default 200K, extendable to 1M with beta flag 'context-1m-2025-08-07'\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningBudget: true,\n\t\tinputPrice: 5.0, // $5 per million input tokens (≤200K context)\n\t\toutputPrice: 25.0, // $25 per million output tokens (≤200K context)\n\t\tcacheWritesPrice: 6.25, // $6.25 per million tokens\n\t\tcacheReadsPrice: 0.5, // $0.50 per million tokens\n\t\tminTokensPerCachePoint: 1024,\n\t\tmaxCachePoints: 4,\n\t\tcachableFields: [\"system\", \"messages\", \"tools\"],\n\t\t// Tiered pricing for extended context (requires beta flag 'context-1m-2025-08-07')\n\t\ttiers: [\n\t\t\t{\n\t\t\t\tcontextWindow: 1_000_000, // 1M tokens with beta flag\n\t\t\t\tinputPrice: 10.0, // $10 per million input tokens (>200K context)\n\t\t\t\toutputPrice: 37.5, // $37.50 per million output tokens (>200K context)\n\t\t\t\tcacheWritesPrice: 12.5, // $12.50 per million tokens (>200K context)\n\t\t\t\tcacheReadsPrice: 1.0, // $1.00 per million tokens (>200K context)\n\t\t\t},\n\t\t],\n\t},\n\t\"anthropic.claude-opus-4-5-20251101-v1:0\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningBudget: true,\n\t\tinputPrice: 5.0,\n\t\toutputPrice: 25.0,\n\t\tcacheWritesPrice: 6.25,\n\t\tcacheReadsPrice: 0.5,\n\t\tminTokensPerCachePoint: 1024,\n\t\tmaxCachePoints: 4,\n\t\tcachableFields: [\"system\", \"messages\", \"tools\"],\n\t},\n\t\"anthropic.claude-opus-4-20250514-v1:0\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningBudget: true,\n\t\tinputPrice: 15.0,\n\t\toutputPrice: 75.0,\n\t\tcacheWritesPrice: 18.75,\n\t\tcacheReadsPrice: 1.5,\n\t\tminTokensPerCachePoint: 1024,\n\t\tmaxCachePoints: 4,\n\t\tcachableFields: [\"system\", \"messages\", \"tools\"],\n\t},\n\t\"anthropic.claude-3-7-sonnet-20250219-v1:0\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningBudget: true,\n\t\tinputPrice: 3.0,\n\t\toutputPrice: 15.0,\n\t\tcacheWritesPrice: 3.75,\n\t\tcacheReadsPrice: 0.3,\n\t\tminTokensPerCachePoint: 1024,\n\t\tmaxCachePoints: 4,\n\t\tcachableFields: [\"system\", \"messages\", \"tools\"],\n\t},\n\t\"anthropic.claude-3-5-sonnet-20241022-v2:0\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 3.0,\n\t\toutputPrice: 15.0,\n\t\tcacheWritesPrice: 3.75,\n\t\tcacheReadsPrice: 0.3,\n\t\tminTokensPerCachePoint: 1024,\n\t\tmaxCachePoints: 4,\n\t\tcachableFields: [\"system\", \"messages\", \"tools\"],\n\t},\n\t\"anthropic.claude-3-5-haiku-20241022-v1:0\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0.8,\n\t\toutputPrice: 4.0,\n\t\tcacheWritesPrice: 1.0,\n\t\tcacheReadsPrice: 0.08,\n\t\tminTokensPerCachePoint: 2048,\n\t\tmaxCachePoints: 4,\n\t\tcachableFields: [\"system\", \"messages\", \"tools\"],\n\t},\n\t\"anthropic.claude-haiku-4-5-20251001-v1:0\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningBudget: true,\n\t\tinputPrice: 1.0,\n\t\toutputPrice: 5.0,\n\t\tcacheWritesPrice: 1.25, // 5m cache writes\n\t\tcacheReadsPrice: 0.1, // cache hits / refreshes\n\t\tminTokensPerCachePoint: 2048,\n\t\tmaxCachePoints: 4,\n\t\tcachableFields: [\"system\", \"messages\", \"tools\"],\n\t},\n\t\"anthropic.claude-3-5-sonnet-20240620-v1:0\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 3.0,\n\t\toutputPrice: 15.0,\n\t},\n\t\"anthropic.claude-3-opus-20240229-v1:0\": {\n\t\tmaxTokens: 4096,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 15.0,\n\t\toutputPrice: 75.0,\n\t},\n\t\"anthropic.claude-3-sonnet-20240229-v1:0\": {\n\t\tmaxTokens: 4096,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 3.0,\n\t\toutputPrice: 15.0,\n\t},\n\t\"anthropic.claude-3-haiku-20240307-v1:0\": {\n\t\tmaxTokens: 4096,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.25,\n\t\toutputPrice: 1.25,\n\t},\n\t\"deepseek.r1-v1:0\": {\n\t\tmaxTokens: 32_768,\n\t\tcontextWindow: 128_000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 1.35,\n\t\toutputPrice: 5.4,\n\t},\n\t\"openai.gpt-oss-20b-1:0\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 128_000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.5,\n\t\toutputPrice: 1.5,\n\t\tdescription: \"GPT-OSS 20B - Optimized for low latency and local/specialized use cases\",\n\t},\n\t\"openai.gpt-oss-120b-1:0\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 128_000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 2.0,\n\t\toutputPrice: 6.0,\n\t\tdescription: \"GPT-OSS 120B - Production-ready, general-purpose, high-reasoning model\",\n\t},\n\t\"meta.llama3-3-70b-instruct-v1:0\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 128_000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.72,\n\t\toutputPrice: 0.72,\n\t\tdescription: \"Llama 3.3 Instruct (70B)\",\n\t},\n\t\"meta.llama3-2-90b-instruct-v1:0\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 128_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.72,\n\t\toutputPrice: 0.72,\n\t\tdescription: \"Llama 3.2 Instruct (90B)\",\n\t},\n\t\"meta.llama3-2-11b-instruct-v1:0\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 128_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.16,\n\t\toutputPrice: 0.16,\n\t\tdescription: \"Llama 3.2 Instruct (11B)\",\n\t},\n\t\"meta.llama3-2-3b-instruct-v1:0\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 128_000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.15,\n\t\toutputPrice: 0.15,\n\t\tdescription: \"Llama 3.2 Instruct (3B)\",\n\t},\n\t\"meta.llama3-2-1b-instruct-v1:0\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 128_000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.1,\n\t\toutputPrice: 0.1,\n\t\tdescription: \"Llama 3.2 Instruct (1B)\",\n\t},\n\t\"meta.llama3-1-405b-instruct-v1:0\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 128_000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 2.4,\n\t\toutputPrice: 2.4,\n\t\tdescription: \"Llama 3.1 Instruct (405B)\",\n\t},\n\t\"meta.llama3-1-70b-instruct-v1:0\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 128_000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.72,\n\t\toutputPrice: 0.72,\n\t\tdescription: \"Llama 3.1 Instruct (70B)\",\n\t},\n\t\"meta.llama3-1-70b-instruct-latency-optimized-v1:0\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 128_000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.9,\n\t\toutputPrice: 0.9,\n\t\tdescription: \"Llama 3.1 Instruct (70B) (w/ latency optimized inference)\",\n\t},\n\t\"meta.llama3-1-8b-instruct-v1:0\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 8_000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.22,\n\t\toutputPrice: 0.22,\n\t\tdescription: \"Llama 3.1 Instruct (8B)\",\n\t},\n\t\"meta.llama3-70b-instruct-v1:0\": {\n\t\tmaxTokens: 2048,\n\t\tcontextWindow: 8_000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 2.65,\n\t\toutputPrice: 3.5,\n\t},\n\t\"meta.llama3-8b-instruct-v1:0\": {\n\t\tmaxTokens: 2048,\n\t\tcontextWindow: 4_000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.3,\n\t\toutputPrice: 0.6,\n\t},\n\t\"amazon.titan-text-lite-v1:0\": {\n\t\tmaxTokens: 4096,\n\t\tcontextWindow: 8_000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.15,\n\t\toutputPrice: 0.2,\n\t\tdescription: \"Amazon Titan Text Lite\",\n\t},\n\t\"amazon.titan-text-express-v1:0\": {\n\t\tmaxTokens: 4096,\n\t\tcontextWindow: 8_000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.2,\n\t\toutputPrice: 0.6,\n\t\tdescription: \"Amazon Titan Text Express\",\n\t},\n\t\"moonshot.kimi-k2-thinking\": {\n\t\tmaxTokens: 32_000,\n\t\tcontextWindow: 262_144,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tpreserveReasoning: true,\n\t\tinputPrice: 0.6,\n\t\toutputPrice: 2.5,\n\t\tdescription: \"Kimi K2 Thinking (1T parameter MoE model with 32B active parameters)\",\n\t},\n\t\"minimax.minimax-m2\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 196_608,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tpreserveReasoning: true,\n\t\tinputPrice: 0.3,\n\t\toutputPrice: 1.2,\n\t\tdescription: \"MiniMax M2 (230B parameter MoE model with 10B active parameters)\",\n\t},\n\t\"qwen.qwen3-next-80b-a3b\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 262_144,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.15,\n\t\toutputPrice: 1.2,\n\t\tdescription: \"Qwen3 Next 80B (MoE model with 3B active parameters)\",\n\t},\n\t\"qwen.qwen3-coder-480b-a35b-v1:0\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 262_144,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.45,\n\t\toutputPrice: 1.8,\n\t\tdescription: \"Qwen3 Coder 480B (MoE model with 35B active parameters)\",\n\t},\n} as const satisfies Record<string, ModelInfo>\n\nexport const BEDROCK_DEFAULT_TEMPERATURE = 0.3\n\nexport const BEDROCK_MAX_TOKENS = 4096\n\nexport const BEDROCK_DEFAULT_CONTEXT = 128_000\n\n// Amazon Bedrock Inference Profile mapping based on official documentation\n// https://docs.aws.amazon.com/bedrock/latest/userguide/inference-profiles-support.html\n// This mapping is pre-ordered by pattern length (descending) to ensure more specific patterns match first\nexport const AWS_INFERENCE_PROFILE_MAPPING: Array<[string, string]> = [\n\t// Australia regions (Sydney and Melbourne) → au. inference profile (most specific - 14 chars)\n\t[\"ap-southeast-2\", \"au.\"],\n\t[\"ap-southeast-4\", \"au.\"],\n\t// Japan regions (Tokyo and Osaka) → jp. inference profile (13 chars)\n\t[\"ap-northeast-\", \"jp.\"],\n\t// US Government Cloud → ug. inference profile (7 chars)\n\t[\"us-gov-\", \"ug.\"],\n\t// Americas regions → us. inference profile (3 chars)\n\t[\"us-\", \"us.\"],\n\t// Europe regions → eu. inference profile (3 chars)\n\t[\"eu-\", \"eu.\"],\n\t// Asia Pacific regions → apac. inference profile (3 chars)\n\t[\"ap-\", \"apac.\"],\n\t// Canada regions → ca. inference profile (3 chars)\n\t[\"ca-\", \"ca.\"],\n\t// South America regions → sa. inference profile (3 chars)\n\t[\"sa-\", \"sa.\"],\n]\n\n// Amazon Bedrock supported regions for the regions dropdown\n// Based on official AWS documentation\nexport const BEDROCK_REGIONS = [\n\t{ value: \"us-east-1\", label: \"us-east-1\" },\n\t{ value: \"us-east-2\", label: \"us-east-2\" },\n\t{ value: \"us-west-1\", label: \"us-west-1\" },\n\t{ value: \"us-west-2\", label: \"us-west-2\" },\n\t{ value: \"ap-northeast-1\", label: \"ap-northeast-1\" },\n\t{ value: \"ap-northeast-2\", label: \"ap-northeast-2\" },\n\t{ value: \"ap-northeast-3\", label: \"ap-northeast-3\" },\n\t{ value: \"ap-south-1\", label: \"ap-south-1\" },\n\t{ value: \"ap-south-2\", label: \"ap-south-2\" },\n\t{ value: \"ap-southeast-1\", label: \"ap-southeast-1\" },\n\t{ value: \"ap-southeast-2\", label: \"ap-southeast-2\" },\n\t{ value: \"ap-east-1\", label: \"ap-east-1\" },\n\t{ value: \"eu-central-1\", label: \"eu-central-1\" },\n\t{ value: \"eu-central-2\", label: \"eu-central-2\" },\n\t{ value: \"eu-west-1\", label: \"eu-west-1\" },\n\t{ value: \"eu-west-2\", label: \"eu-west-2\" },\n\t{ value: \"eu-west-3\", label: \"eu-west-3\" },\n\t{ value: \"eu-north-1\", label: \"eu-north-1\" },\n\t{ value: \"eu-south-1\", label: \"eu-south-1\" },\n\t{ value: \"eu-south-2\", label: \"eu-south-2\" },\n\t{ value: \"ca-central-1\", label: \"ca-central-1\" },\n\t{ value: \"sa-east-1\", label: \"sa-east-1\" },\n\t{ value: \"us-gov-east-1\", label: \"us-gov-east-1\" },\n\t{ value: \"us-gov-west-1\", label: \"us-gov-west-1\" },\n].sort((a, b) => a.value.localeCompare(b.value))\n\nexport const BEDROCK_1M_CONTEXT_MODEL_IDS = [\n\t\"anthropic.claude-sonnet-4-20250514-v1:0\",\n\t\"anthropic.claude-sonnet-4-5-20250929-v1:0\",\n\t\"anthropic.claude-sonnet-4-6\",\n\t\"anthropic.claude-opus-4-6-v1\",\n] as const\n\n// Amazon Bedrock models that support Global Inference profiles\n// As of Nov 2025, AWS supports Global Inference for:\n// - Claude Sonnet 4\n// - Claude Sonnet 4.5\n// - Claude Sonnet 4.6\n// - Claude Haiku 4.5\n// - Claude Opus 4.5\n// - Claude Opus 4.6\nexport const BEDROCK_GLOBAL_INFERENCE_MODEL_IDS = [\n\t\"anthropic.claude-sonnet-4-20250514-v1:0\",\n\t\"anthropic.claude-sonnet-4-5-20250929-v1:0\",\n\t\"anthropic.claude-sonnet-4-6\",\n\t\"anthropic.claude-haiku-4-5-20251001-v1:0\",\n\t\"anthropic.claude-opus-4-5-20251101-v1:0\",\n\t\"anthropic.claude-opus-4-6-v1\",\n] as const\n\n// Amazon Bedrock Service Tier types\nexport type BedrockServiceTier = \"STANDARD\" | \"FLEX\" | \"PRIORITY\"\n\n// Models that support service tiers based on AWS documentation\n// https://docs.aws.amazon.com/bedrock/latest/userguide/service-tiers-inference.html\nexport const BEDROCK_SERVICE_TIER_MODEL_IDS = [\n\t// Amazon Nova models\n\t\"amazon.nova-lite-v1:0\",\n\t\"amazon.nova-2-lite-v1:0\",\n\t\"amazon.nova-pro-v1:0\",\n\t\"amazon.nova-pro-latency-optimized-v1:0\",\n\t// DeepSeek models\n\t\"deepseek.r1-v1:0\",\n\t// Qwen models\n\t\"qwen.qwen3-next-80b-a3b\",\n\t\"qwen.qwen3-coder-480b-a35b-v1:0\",\n\t// OpenAI GPT-OSS models\n\t\"openai.gpt-oss-20b-1:0\",\n\t\"openai.gpt-oss-120b-1:0\",\n] as const\n\n// Service tier pricing multipliers\nexport const BEDROCK_SERVICE_TIER_PRICING = {\n\tSTANDARD: 1.0, // Base price\n\tFLEX: 0.5, // 50% discount from standard\n\tPRIORITY: 1.75, // 75% premium over standard\n} as const\n","import type { ModelInfo } from \"../model.js\"\n\n// https://platform.deepseek.com/docs/api\n// preserveReasoning enables interleaved thinking mode for tool calls:\n// DeepSeek requires reasoning_content to be passed back during tool call\n// continuation within the same turn. See: https://api-docs.deepseek.com/guides/thinking_mode\nexport type DeepSeekModelId = keyof typeof deepSeekModels\n\nexport const deepSeekDefaultModelId: DeepSeekModelId = \"deepseek-chat\"\n\nexport const deepSeekModels = {\n\t\"deepseek-chat\": {\n\t\tmaxTokens: 8192, // 8K max output\n\t\tcontextWindow: 128_000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0.28, // $0.28 per million tokens (cache miss) - Updated Dec 9, 2025\n\t\toutputPrice: 0.42, // $0.42 per million tokens - Updated Dec 9, 2025\n\t\tcacheWritesPrice: 0.28, // $0.28 per million tokens (cache miss) - Updated Dec 9, 2025\n\t\tcacheReadsPrice: 0.028, // $0.028 per million tokens (cache hit) - Updated Dec 9, 2025\n\t\tdescription: `DeepSeek-V3.2 (Non-thinking Mode) achieves a significant breakthrough in inference speed over previous models. It tops the leaderboard among open-source models and rivals the most advanced closed-source models globally. Supports JSON output, tool calls, chat prefix completion (beta), and FIM completion (beta).`,\n\t},\n\t\"deepseek-reasoner\": {\n\t\tmaxTokens: 8192, // 8K max output\n\t\tcontextWindow: 128_000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tpreserveReasoning: true,\n\t\tinputPrice: 0.28, // $0.28 per million tokens (cache miss) - Updated Dec 9, 2025\n\t\toutputPrice: 0.42, // $0.42 per million tokens - Updated Dec 9, 2025\n\t\tcacheWritesPrice: 0.28, // $0.28 per million tokens (cache miss) - Updated Dec 9, 2025\n\t\tcacheReadsPrice: 0.028, // $0.028 per million tokens (cache hit) - Updated Dec 9, 2025\n\t\tdescription: `DeepSeek-V3.2 (Thinking Mode) achieves performance comparable to OpenAI-o1 across math, code, and reasoning tasks. Supports Chain of Thought reasoning with up to 8K output tokens. Supports JSON output, tool calls, and chat prefix completion (beta).`,\n\t},\n} as const satisfies Record<string, ModelInfo>\n\n// https://api-docs.deepseek.com/quick_start/parameter_settings\nexport const DEEP_SEEK_DEFAULT_TEMPERATURE = 0.3\n","import type { ModelInfo } from \"../model.js\"\n\nexport type FireworksModelId =\n\t| \"accounts/fireworks/models/kimi-k2-instruct\"\n\t| \"accounts/fireworks/models/kimi-k2-instruct-0905\"\n\t| \"accounts/fireworks/models/kimi-k2-thinking\"\n\t| \"accounts/fireworks/models/kimi-k2p5\"\n\t| \"accounts/fireworks/models/minimax-m2\"\n\t| \"accounts/fireworks/models/minimax-m2p1\"\n\t| \"accounts/fireworks/models/qwen3-235b-a22b-instruct-2507\"\n\t| \"accounts/fireworks/models/qwen3-coder-480b-a35b-instruct\"\n\t| \"accounts/fireworks/models/deepseek-r1-0528\"\n\t| \"accounts/fireworks/models/deepseek-v3\"\n\t| \"accounts/fireworks/models/deepseek-v3p1\"\n\t| \"accounts/fireworks/models/deepseek-v3p2\"\n\t| \"accounts/fireworks/models/glm-4p5\"\n\t| \"accounts/fireworks/models/glm-4p5-air\"\n\t| \"accounts/fireworks/models/glm-4p6\"\n\t| \"accounts/fireworks/models/glm-4p7\"\n\t| \"accounts/fireworks/models/gpt-oss-20b\"\n\t| \"accounts/fireworks/models/gpt-oss-120b\"\n\t| \"accounts/fireworks/models/llama-v3p3-70b-instruct\"\n\t| \"accounts/fireworks/models/llama4-maverick-instruct-basic\"\n\t| \"accounts/fireworks/models/llama4-scout-instruct-basic\"\n\nexport const fireworksDefaultModelId: FireworksModelId = \"accounts/fireworks/models/kimi-k2-instruct-0905\"\n\nexport const fireworksModels = {\n\t\"accounts/fireworks/models/kimi-k2-instruct-0905\": {\n\t\tmaxTokens: 16384,\n\t\tcontextWindow: 262144,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0.6,\n\t\toutputPrice: 2.5,\n\t\tcacheReadsPrice: 0.15,\n\t\tdescription:\n\t\t\t\"Kimi K2 model gets a new version update: Agentic coding: more accurate, better generalization across scaffolds. Frontend coding: improved aesthetics and functionalities on web, 3d, and other tasks. Context length: extended from 128k to 256k, providing better long-horizon support.\",\n\t},\n\t\"accounts/fireworks/models/kimi-k2-instruct\": {\n\t\tmaxTokens: 16384,\n\t\tcontextWindow: 128000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.6,\n\t\toutputPrice: 2.5,\n\t\tdescription:\n\t\t\t\"Kimi K2 is a state-of-the-art mixture-of-experts (MoE) language model with 32 billion activated parameters and 1 trillion total parameters. Trained with the Muon optimizer, Kimi K2 achieves exceptional performance across frontier knowledge, reasoning, and coding tasks while being meticulously optimized for agentic capabilities.\",\n\t},\n\t\"accounts/fireworks/models/kimi-k2-thinking\": {\n\t\tmaxTokens: 16000,\n\t\tcontextWindow: 256000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tsupportsTemperature: true,\n\t\tpreserveReasoning: true,\n\t\tdefaultTemperature: 1.0,\n\t\tinputPrice: 0.6,\n\t\toutputPrice: 2.5,\n\t\tcacheReadsPrice: 0.15,\n\t\tdescription:\n\t\t\t\"The kimi-k2-thinking model is a general-purpose agentic reasoning model developed by Moonshot AI. Thanks to its strength in deep reasoning and multi-turn tool use, it can solve even the hardest problems.\",\n\t},\n\t\"accounts/fireworks/models/kimi-k2p5\": {\n\t\tmaxTokens: 16384,\n\t\tcontextWindow: 262144,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0.6,\n\t\toutputPrice: 3.0,\n\t\tcacheReadsPrice: 0.1,\n\t\tdescription:\n\t\t\t\"Kimi K2.5 is Moonshot AI's flagship agentic model and a new SOTA open model. It unifies vision and text, thinking and non-thinking modes, and single-agent and multi-agent execution into one model. Fireworks enables users to control the reasoning behavior and inspect its reasoning history for greater transparency.\",\n\t},\n\t\"accounts/fireworks/models/minimax-m2\": {\n\t\tmaxTokens: 4096,\n\t\tcontextWindow: 204800,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.3,\n\t\toutputPrice: 1.2,\n\t\tdescription:\n\t\t\t\"MiniMax M2 is a high-performance language model with 204.8K context window, optimized for long-context understanding and generation tasks.\",\n\t},\n\t\"accounts/fireworks/models/qwen3-235b-a22b-instruct-2507\": {\n\t\tmaxTokens: 32768,\n\t\tcontextWindow: 256000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.22,\n\t\toutputPrice: 0.88,\n\t\tdescription: \"Latest Qwen3 thinking model, competitive against the best closed source models in Jul 2025.\",\n\t},\n\t\"accounts/fireworks/models/qwen3-coder-480b-a35b-instruct\": {\n\t\tmaxTokens: 32768,\n\t\tcontextWindow: 256000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.45,\n\t\toutputPrice: 1.8,\n\t\tdescription: \"Qwen3's most agentic code model to date.\",\n\t},\n\t\"accounts/fireworks/models/deepseek-r1-0528\": {\n\t\tmaxTokens: 20480,\n\t\tcontextWindow: 160000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 3,\n\t\toutputPrice: 8,\n\t\tdescription:\n\t\t\t\"05/28 updated checkpoint of Deepseek R1. Its overall performance is now approaching that of leading models, such as O3 and Gemini 2.5 Pro. Compared to the previous version, the upgraded model shows significant improvements in handling complex reasoning tasks, and this version also offers a reduced hallucination rate, enhanced support for function calling, and better experience for vibe coding. Note that fine-tuning for this model is only available through contacting fireworks at https://fireworks.ai/company/contact-us.\",\n\t},\n\t\"accounts/fireworks/models/deepseek-v3\": {\n\t\tmaxTokens: 16384,\n\t\tcontextWindow: 128000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.9,\n\t\toutputPrice: 0.9,\n\t\tdescription:\n\t\t\t\"A strong Mixture-of-Experts (MoE) language model with 671B total parameters with 37B activated for each token from Deepseek. Note that fine-tuning for this model is only available through contacting fireworks at https://fireworks.ai/company/contact-us.\",\n\t},\n\t\"accounts/fireworks/models/deepseek-v3p1\": {\n\t\tmaxTokens: 16384,\n\t\tcontextWindow: 163840,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.56,\n\t\toutputPrice: 1.68,\n\t\tdescription:\n\t\t\t\"DeepSeek v3.1 is an improved version of the v3 model with enhanced performance, better reasoning capabilities, and improved code generation. This Mixture-of-Experts (MoE) model maintains the same 671B total parameters with 37B activated per token.\",\n\t},\n\t\"accounts/fireworks/models/glm-4p5\": {\n\t\tmaxTokens: 16384,\n\t\tcontextWindow: 128000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.55,\n\t\toutputPrice: 2.19,\n\t\tdescription:\n\t\t\t\"Z.ai GLM-4.5 with 355B total parameters and 32B active parameters. Features unified reasoning, coding, and intelligent agent capabilities.\",\n\t},\n\t\"accounts/fireworks/models/glm-4p5-air\": {\n\t\tmaxTokens: 16384,\n\t\tcontextWindow: 128000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.55,\n\t\toutputPrice: 2.19,\n\t\tdescription:\n\t\t\t\"Z.ai GLM-4.5-Air with 106B total parameters and 12B active parameters. Features unified reasoning, coding, and intelligent agent capabilities.\",\n\t},\n\t\"accounts/fireworks/models/glm-4p6\": {\n\t\tmaxTokens: 25344,\n\t\tcontextWindow: 198000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.55,\n\t\toutputPrice: 2.19,\n\t\tdescription:\n\t\t\t\"Z.ai GLM-4.6 is an advanced coding model with exceptional performance on complex programming tasks. Features improved reasoning capabilities and enhanced code generation quality, making it ideal for software development workflows.\",\n\t},\n\t\"accounts/fireworks/models/gpt-oss-20b\": {\n\t\tmaxTokens: 16384,\n\t\tcontextWindow: 128000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.07,\n\t\toutputPrice: 0.3,\n\t\tdescription:\n\t\t\t\"OpenAI gpt-oss-20b: Compact model for local/edge deployments. Optimized for low-latency and resource-constrained environments with chain-of-thought output, adjustable reasoning, and agentic workflows.\",\n\t},\n\t\"accounts/fireworks/models/gpt-oss-120b\": {\n\t\tmaxTokens: 16384,\n\t\tcontextWindow: 128000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.15,\n\t\toutputPrice: 0.6,\n\t\tdescription:\n\t\t\t\"OpenAI gpt-oss-120b: Production-grade, general-purpose model that fits on a single H100 GPU. Features complex reasoning, configurable effort, full chain-of-thought transparency, and supports function calling, tool use, and structured outputs.\",\n\t},\n\t\"accounts/fireworks/models/minimax-m2p1\": {\n\t\tmaxTokens: 4096,\n\t\tcontextWindow: 204800,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.3,\n\t\toutputPrice: 1.2,\n\t\tdescription:\n\t\t\t\"MiniMax M2.1 is an upgraded version of M2 with improved performance on complex reasoning, coding, and long-context understanding tasks.\",\n\t},\n\t\"accounts/fireworks/models/deepseek-v3p2\": {\n\t\tmaxTokens: 16384,\n\t\tcontextWindow: 163840,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.56,\n\t\toutputPrice: 1.68,\n\t\tdescription:\n\t\t\t\"DeepSeek V3.2 is the latest iteration of the V3 model family with enhanced reasoning capabilities, improved code generation, and better instruction following.\",\n\t},\n\t\"accounts/fireworks/models/glm-4p7\": {\n\t\tmaxTokens: 25344,\n\t\tcontextWindow: 198000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.55,\n\t\toutputPrice: 2.19,\n\t\tdescription:\n\t\t\t\"Z.ai GLM-4.7 is the latest coding model with exceptional performance on complex programming tasks. Features improved reasoning capabilities and enhanced code generation quality.\",\n\t},\n\t\"accounts/fireworks/models/llama-v3p3-70b-instruct\": {\n\t\tmaxTokens: 16384,\n\t\tcontextWindow: 131072,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.9,\n\t\toutputPrice: 0.9,\n\t\tdescription:\n\t\t\t\"Meta Llama 3.3 70B Instruct is a highly capable instruction-tuned model with strong reasoning, coding, and general task performance.\",\n\t},\n\t\"accounts/fireworks/models/llama4-maverick-instruct-basic\": {\n\t\tmaxTokens: 16384,\n\t\tcontextWindow: 131072,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.22,\n\t\toutputPrice: 0.88,\n\t\tdescription:\n\t\t\t\"Llama 4 Maverick is Meta's latest multimodal model with vision capabilities, optimized for instruction following and coding tasks.\",\n\t},\n\t\"accounts/fireworks/models/llama4-scout-instruct-basic\": {\n\t\tmaxTokens: 16384,\n\t\tcontextWindow: 131072,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.15,\n\t\toutputPrice: 0.6,\n\t\tdescription:\n\t\t\t\"Llama 4 Scout is a smaller, faster variant of Llama 4 with multimodal capabilities, ideal for quick iterations and cost-effective deployments.\",\n\t},\n} as const satisfies Record<string, ModelInfo>\n","import type { ModelInfo } from \"../model.js\"\n\n// https://ai.google.dev/gemini-api/docs/models/gemini\nexport type GeminiModelId = keyof typeof geminiModels\n\nexport const geminiDefaultModelId: GeminiModelId = \"gemini-3.1-pro-preview\"\n\nexport const geminiModels = {\n\t\"gemini-3.1-pro-preview\": {\n\t\tmaxTokens: 65_536,\n\t\tcontextWindow: 1_048_576,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningEffort: [\"low\", \"medium\", \"high\"],\n\t\treasoningEffort: \"low\",\n\n\t\tsupportsTemperature: true,\n\t\tdefaultTemperature: 1,\n\t\tinputPrice: 4.0,\n\t\toutputPrice: 18.0,\n\t\tcacheReadsPrice: 0.4,\n\t\tcacheWritesPrice: 4.5,\n\t\ttiers: [\n\t\t\t{\n\t\t\t\tcontextWindow: 200_000,\n\t\t\t\tinputPrice: 2.0,\n\t\t\t\toutputPrice: 12.0,\n\t\t\t\tcacheReadsPrice: 0.2,\n\t\t\t},\n\t\t\t{\n\t\t\t\tcontextWindow: Infinity,\n\t\t\t\tinputPrice: 4.0,\n\t\t\t\toutputPrice: 18.0,\n\t\t\t\tcacheReadsPrice: 0.4,\n\t\t\t},\n\t\t],\n\t},\n\t\"gemini-3.1-pro-preview-customtools\": {\n\t\tmaxTokens: 65_536,\n\t\tcontextWindow: 1_048_576,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningEffort: [\"low\", \"medium\", \"high\"],\n\t\treasoningEffort: \"low\",\n\n\t\tsupportsTemperature: true,\n\t\tdefaultTemperature: 1,\n\t\tinputPrice: 4.0,\n\t\toutputPrice: 18.0,\n\t\tcacheReadsPrice: 0.4,\n\t\tcacheWritesPrice: 4.5,\n\t\ttiers: [\n\t\t\t{\n\t\t\t\tcontextWindow: 200_000,\n\t\t\t\tinputPrice: 2.0,\n\t\t\t\toutputPrice: 12.0,\n\t\t\t\tcacheReadsPrice: 0.2,\n\t\t\t},\n\t\t\t{\n\t\t\t\tcontextWindow: Infinity,\n\t\t\t\tinputPrice: 4.0,\n\t\t\t\toutputPrice: 18.0,\n\t\t\t\tcacheReadsPrice: 0.4,\n\t\t\t},\n\t\t],\n\t},\n\t\"gemini-3-pro-preview\": {\n\t\tmaxTokens: 65_536,\n\t\tcontextWindow: 1_048_576,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningEffort: [\"low\", \"high\"],\n\t\treasoningEffort: \"low\",\n\n\t\tsupportsTemperature: true,\n\t\tdefaultTemperature: 1,\n\t\tinputPrice: 4.0,\n\t\toutputPrice: 18.0,\n\t\tcacheReadsPrice: 0.4,\n\t\ttiers: [\n\t\t\t{\n\t\t\t\tcontextWindow: 200_000,\n\t\t\t\tinputPrice: 2.0,\n\t\t\t\toutputPrice: 12.0,\n\t\t\t\tcacheReadsPrice: 0.2,\n\t\t\t},\n\t\t\t{\n\t\t\t\tcontextWindow: Infinity,\n\t\t\t\tinputPrice: 4.0,\n\t\t\t\toutputPrice: 18.0,\n\t\t\t\tcacheReadsPrice: 0.4,\n\t\t\t},\n\t\t],\n\t},\n\t\"gemini-3-flash-preview\": {\n\t\tmaxTokens: 65_536,\n\t\tcontextWindow: 1_048_576,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningEffort: [\"minimal\", \"low\", \"medium\", \"high\"],\n\t\treasoningEffort: \"medium\",\n\n\t\tsupportsTemperature: true,\n\t\tdefaultTemperature: 1,\n\t\tinputPrice: 0.5,\n\t\toutputPrice: 3.0,\n\t\tcacheReadsPrice: 0.05,\n\t},\n\t// 2.5 Pro models\n\t\"gemini-2.5-pro\": {\n\t\tmaxTokens: 64_000,\n\t\tcontextWindow: 1_048_576,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\n\t\tinputPrice: 2.5, // This is the pricing for prompts above 200k tokens.\n\t\toutputPrice: 15,\n\t\tcacheReadsPrice: 0.625,\n\t\tcacheWritesPrice: 4.5,\n\t\tmaxThinkingTokens: 32_768,\n\t\tsupportsReasoningBudget: true,\n\t\trequiredReasoningBudget: true,\n\t\ttiers: [\n\t\t\t{\n\t\t\t\tcontextWindow: 200_000,\n\t\t\t\tinputPrice: 1.25,\n\t\t\t\toutputPrice: 10,\n\t\t\t\tcacheReadsPrice: 0.31,\n\t\t\t},\n\t\t\t{\n\t\t\t\tcontextWindow: Infinity,\n\t\t\t\tinputPrice: 2.5,\n\t\t\t\toutputPrice: 15,\n\t\t\t\tcacheReadsPrice: 0.625,\n\t\t\t},\n\t\t],\n\t},\n\t\"gemini-2.5-pro-preview-06-05\": {\n\t\tmaxTokens: 65_535,\n\t\tcontextWindow: 1_048_576,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\n\t\tinputPrice: 2.5, // This is the pricing for prompts above 200k tokens.\n\t\toutputPrice: 15,\n\t\tcacheReadsPrice: 0.625,\n\t\tcacheWritesPrice: 4.5,\n\t\tmaxThinkingTokens: 32_768,\n\t\tsupportsReasoningBudget: true,\n\t\ttiers: [\n\t\t\t{\n\t\t\t\tcontextWindow: 200_000,\n\t\t\t\tinputPrice: 1.25,\n\t\t\t\toutputPrice: 10,\n\t\t\t\tcacheReadsPrice: 0.31,\n\t\t\t},\n\t\t\t{\n\t\t\t\tcontextWindow: Infinity,\n\t\t\t\tinputPrice: 2.5,\n\t\t\t\toutputPrice: 15,\n\t\t\t\tcacheReadsPrice: 0.625,\n\t\t\t},\n\t\t],\n\t},\n\t\"gemini-2.5-pro-preview-05-06\": {\n\t\tmaxTokens: 65_535,\n\t\tcontextWindow: 1_048_576,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\n\t\tinputPrice: 2.5, // This is the pricing for prompts above 200k tokens.\n\t\toutputPrice: 15,\n\t\tcacheReadsPrice: 0.625,\n\t\tcacheWritesPrice: 4.5,\n\t\ttiers: [\n\t\t\t{\n\t\t\t\tcontextWindow: 200_000,\n\t\t\t\tinputPrice: 1.25,\n\t\t\t\toutputPrice: 10,\n\t\t\t\tcacheReadsPrice: 0.31,\n\t\t\t},\n\t\t\t{\n\t\t\t\tcontextWindow: Infinity,\n\t\t\t\tinputPrice: 2.5,\n\t\t\t\toutputPrice: 15,\n\t\t\t\tcacheReadsPrice: 0.625,\n\t\t\t},\n\t\t],\n\t},\n\t\"gemini-2.5-pro-preview-03-25\": {\n\t\tmaxTokens: 65_535,\n\t\tcontextWindow: 1_048_576,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\n\t\tinputPrice: 2.5, // This is the pricing for prompts above 200k tokens.\n\t\toutputPrice: 15,\n\t\tcacheReadsPrice: 0.625,\n\t\tcacheWritesPrice: 4.5,\n\t\tmaxThinkingTokens: 32_768,\n\t\tsupportsReasoningBudget: true,\n\t\ttiers: [\n\t\t\t{\n\t\t\t\tcontextWindow: 200_000,\n\t\t\t\tinputPrice: 1.25,\n\t\t\t\toutputPrice: 10,\n\t\t\t\tcacheReadsPrice: 0.31,\n\t\t\t},\n\t\t\t{\n\t\t\t\tcontextWindow: Infinity,\n\t\t\t\tinputPrice: 2.5,\n\t\t\t\toutputPrice: 15,\n\t\t\t\tcacheReadsPrice: 0.625,\n\t\t\t},\n\t\t],\n\t},\n\n\t// 2.5 Flash models\n\t\"gemini-flash-latest\": {\n\t\tmaxTokens: 65_536,\n\t\tcontextWindow: 1_048_576,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\n\t\tinputPrice: 0.3,\n\t\toutputPrice: 2.5,\n\t\tcacheReadsPrice: 0.075,\n\t\tcacheWritesPrice: 1.0,\n\t\tmaxThinkingTokens: 24_576,\n\t\tsupportsReasoningBudget: true,\n\t},\n\t\"gemini-2.5-flash-preview-09-2025\": {\n\t\tmaxTokens: 65_536,\n\t\tcontextWindow: 1_048_576,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\n\t\tinputPrice: 0.3,\n\t\toutputPrice: 2.5,\n\t\tcacheReadsPrice: 0.075,\n\t\tcacheWritesPrice: 1.0,\n\t\tmaxThinkingTokens: 24_576,\n\t\tsupportsReasoningBudget: true,\n\t},\n\t\"gemini-2.5-flash\": {\n\t\tmaxTokens: 64_000,\n\t\tcontextWindow: 1_048_576,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\n\t\tinputPrice: 0.3,\n\t\toutputPrice: 2.5,\n\t\tcacheReadsPrice: 0.075,\n\t\tcacheWritesPrice: 1.0,\n\t\tmaxThinkingTokens: 24_576,\n\t\tsupportsReasoningBudget: true,\n\t},\n\n\t// 2.5 Flash Lite models\n\t\"gemini-flash-lite-latest\": {\n\t\tmaxTokens: 65_536,\n\t\tcontextWindow: 1_048_576,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\n\t\tinputPrice: 0.1,\n\t\toutputPrice: 0.4,\n\t\tcacheReadsPrice: 0.025,\n\t\tcacheWritesPrice: 1.0,\n\t\tsupportsReasoningBudget: true,\n\t\tmaxThinkingTokens: 24_576,\n\t},\n\t\"gemini-2.5-flash-lite-preview-09-2025\": {\n\t\tmaxTokens: 65_536,\n\t\tcontextWindow: 1_048_576,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\n\t\tinputPrice: 0.1,\n\t\toutputPrice: 0.4,\n\t\tcacheReadsPrice: 0.025,\n\t\tcacheWritesPrice: 1.0,\n\t\tsupportsReasoningBudget: true,\n\t\tmaxThinkingTokens: 24_576,\n\t},\n} as const satisfies Record<string, ModelInfo>\n","import type { ModelInfo } from \"../model.js\"\n\n// https://docs.litellm.ai/\nexport const litellmDefaultModelId = \"claude-3-7-sonnet-20250219\"\n\nexport const litellmDefaultModelInfo: ModelInfo = {\n\tmaxTokens: 8192,\n\tcontextWindow: 200_000,\n\tsupportsImages: true,\n\tsupportsPromptCache: true,\n\tinputPrice: 3.0,\n\toutputPrice: 15.0,\n\tcacheWritesPrice: 3.75,\n\tcacheReadsPrice: 0.3,\n}\n","import type { ModelInfo } from \"../model.js\"\n\nexport const LMSTUDIO_DEFAULT_TEMPERATURE = 0\n\n// LM Studio\n// https://lmstudio.ai/docs/cli/ls\nexport const lMStudioDefaultModelId = \"mistralai/devstral-small-2505\"\nexport const lMStudioDefaultModelInfo: ModelInfo = {\n\tmaxTokens: 8192,\n\tcontextWindow: 200_000,\n\tsupportsImages: true,\n\tsupportsPromptCache: true,\n\tinputPrice: 0,\n\toutputPrice: 0,\n\tcacheWritesPrice: 0,\n\tcacheReadsPrice: 0,\n\tdescription: \"LM Studio hosted models\",\n}\n","import type { ModelInfo } from \"../model.js\"\n\n// https://docs.mistral.ai/getting-started/models/models_overview/\nexport type MistralModelId = keyof typeof mistralModels\n\nexport const mistralDefaultModelId: MistralModelId = \"codestral-latest\"\n\nexport const mistralModels = {\n\t\"magistral-medium-latest\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 128_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 2.0,\n\t\toutputPrice: 5.0,\n\t},\n\t\"devstral-medium-latest\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 131_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.4,\n\t\toutputPrice: 2.0,\n\t},\n\t\"mistral-medium-latest\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 131_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.4,\n\t\toutputPrice: 2.0,\n\t},\n\t\"codestral-latest\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 256_000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.3,\n\t\toutputPrice: 0.9,\n\t},\n\t\"mistral-large-latest\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 131_000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 2.0,\n\t\toutputPrice: 6.0,\n\t},\n\t\"ministral-8b-latest\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 131_000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.1,\n\t\toutputPrice: 0.1,\n\t},\n\t\"ministral-3b-latest\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 131_000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.04,\n\t\toutputPrice: 0.04,\n\t},\n\t\"mistral-small-latest\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 32_000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.2,\n\t\toutputPrice: 0.6,\n\t},\n\t\"pixtral-large-latest\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 131_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 2.0,\n\t\toutputPrice: 6.0,\n\t},\n} as const satisfies Record<string, ModelInfo>\n\nexport const MISTRAL_DEFAULT_TEMPERATURE = 1\n","import type { ModelInfo } from \"../model.js\"\n\n// https://platform.moonshot.ai/\nexport type MoonshotModelId = keyof typeof moonshotModels\n\nexport const moonshotDefaultModelId: MoonshotModelId = \"kimi-k2-0905-preview\"\n\nexport const moonshotModels = {\n\t\"kimi-k2-0711-preview\": {\n\t\tmaxTokens: 32_000,\n\t\tcontextWindow: 131_072,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0.6, // $0.60 per million tokens (cache miss)\n\t\toutputPrice: 2.5, // $2.50 per million tokens\n\t\tcacheWritesPrice: 0, // $0 per million tokens (cache miss)\n\t\tcacheReadsPrice: 0.15, // $0.15 per million tokens (cache hit)\n\t\tdescription: `Kimi K2 is a state-of-the-art mixture-of-experts (MoE) language model with 32 billion activated parameters and 1 trillion total parameters.`,\n\t},\n\t\"kimi-k2-0905-preview\": {\n\t\tmaxTokens: 16384,\n\t\tcontextWindow: 262144,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0.6,\n\t\toutputPrice: 2.5,\n\t\tcacheReadsPrice: 0.15,\n\t\tdescription:\n\t\t\t\"Kimi K2 model gets a new version update: Agentic coding: more accurate, better generalization across scaffolds. Frontend coding: improved aesthetics and functionalities on web, 3d, and other tasks. Context length: extended from 128k to 256k, providing better long-horizon support.\",\n\t},\n\t\"kimi-k2-turbo-preview\": {\n\t\tmaxTokens: 32_000,\n\t\tcontextWindow: 262_144,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 2.4, // $2.40 per million tokens (cache miss)\n\t\toutputPrice: 10, // $10.00 per million tokens\n\t\tcacheWritesPrice: 0, // $0 per million tokens (cache miss)\n\t\tcacheReadsPrice: 0.6, // $0.60 per million tokens (cache hit)\n\t\tdescription: `Kimi K2 Turbo is a high-speed version of the state-of-the-art Kimi K2 mixture-of-experts (MoE) language model, with the same 32 billion activated parameters and 1 trillion total parameters, optimized for output speeds of up to 60 tokens per second, peaking at 100 tokens per second.`,\n\t},\n\t\"kimi-k2-thinking\": {\n\t\tmaxTokens: 16_000, // Recommended ≥ 16,000\n\t\tcontextWindow: 262_144, // 262,144 tokens\n\t\tsupportsImages: false, // Text-only (no image/vision support)\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0.6, // $0.60 per million tokens (cache miss)\n\t\toutputPrice: 2.5, // $2.50 per million tokens\n\t\tcacheWritesPrice: 0, // $0 per million tokens (cache miss)\n\t\tcacheReadsPrice: 0.15, // $0.15 per million tokens (cache hit)\n\t\tsupportsTemperature: true, // Default temperature: 1.0\n\t\tpreserveReasoning: true,\n\t\tdefaultTemperature: 1.0,\n\t\tdescription: `The kimi-k2-thinking model is a general-purpose agentic reasoning model developed by Moonshot AI. Thanks to its strength in deep reasoning and multi-turn tool use, it can solve even the hardest problems.`,\n\t},\n\t\"kimi-k2.5\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 262_144,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0.6, // $0.60 per million tokens (cache miss)\n\t\toutputPrice: 3.0, // $3.00 per million tokens\n\t\tcacheReadsPrice: 0.1, // $0.10 per million tokens (cache hit)\n\t\tsupportsTemperature: true,\n\t\tdefaultTemperature: 1.0,\n\t\tdescription:\n\t\t\t\"Kimi K2.5 is the latest generation of Moonshot AI's Kimi series, featuring improved reasoning capabilities and enhanced performance across diverse tasks.\",\n\t},\n} as const satisfies Record<string, ModelInfo>\n\nexport const MOONSHOT_DEFAULT_TEMPERATURE = 0.6\n","import type { ModelInfo } from \"../model.js\"\n\n// Ollama\n// https://ollama.com/models\nexport const ollamaDefaultModelId = \"devstral:24b\"\nexport const ollamaDefaultModelInfo: ModelInfo = {\n\tmaxTokens: 4096,\n\tcontextWindow: 200_000,\n\tsupportsImages: true,\n\tsupportsPromptCache: true,\n\tinputPrice: 0,\n\toutputPrice: 0,\n\tcacheWritesPrice: 0,\n\tcacheReadsPrice: 0,\n\tdescription: \"Ollama hosted models\",\n}\n","import type { ModelInfo } from \"../model.js\"\n\n// https://openai.com/api/pricing/\nexport type OpenAiNativeModelId = keyof typeof openAiNativeModels\n\nexport const openAiNativeDefaultModelId: OpenAiNativeModelId = \"gpt-5.1-codex-max\"\n\nexport const openAiNativeModels = {\n\t\"gpt-5.1-codex-max\": {\n\t\tmaxTokens: 128000,\n\t\tcontextWindow: 400000,\n\t\tincludedTools: [\"apply_patch\"],\n\t\texcludedTools: [\"apply_diff\", \"write_to_file\"],\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tpromptCacheRetention: \"24h\",\n\t\tsupportsReasoningEffort: [\"low\", \"medium\", \"high\", \"xhigh\"],\n\t\treasoningEffort: \"xhigh\",\n\t\tinputPrice: 1.25,\n\t\toutputPrice: 10.0,\n\t\tcacheReadsPrice: 0.125,\n\t\tsupportsTemperature: false,\n\t\ttiers: [{ name: \"priority\", contextWindow: 400000, inputPrice: 2.5, outputPrice: 20.0, cacheReadsPrice: 0.25 }],\n\t\tdescription:\n\t\t\t\"GPT-5.1 Codex Max: Our most intelligent coding model optimized for long-horizon, agentic coding tasks\",\n\t},\n\t\"gpt-5.4\": {\n\t\tmaxTokens: 128000,\n\t\tcontextWindow: 1_050_000,\n\t\tincludedTools: [\"apply_patch\"],\n\t\texcludedTools: [\"apply_diff\", \"write_to_file\"],\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningEffort: [\"none\", \"low\", \"medium\", \"high\", \"xhigh\"],\n\t\treasoningEffort: \"none\",\n\t\tinputPrice: 2.5,\n\t\toutputPrice: 15.0,\n\t\tcacheReadsPrice: 0.25,\n\t\tlongContextPricing: {\n\t\t\tthresholdTokens: 272_000,\n\t\t\tinputPriceMultiplier: 2,\n\t\t\toutputPriceMultiplier: 1.5,\n\t\t\tappliesToServiceTiers: [\"default\", \"flex\"],\n\t\t},\n\t\tsupportsVerbosity: true,\n\t\tsupportsTemperature: false,\n\t\ttiers: [\n\t\t\t{ name: \"flex\", contextWindow: 1_050_000, inputPrice: 1.25, outputPrice: 7.5, cacheReadsPrice: 0.125 },\n\t\t\t{ name: \"priority\", contextWindow: 1_050_000, inputPrice: 5.0, outputPrice: 30.0, cacheReadsPrice: 0.5 },\n\t\t],\n\t\tdescription: \"GPT-5.4: Our most capable model for professional work\",\n\t},\n\t\"gpt-5.4-mini\": {\n\t\tmaxTokens: 128000,\n\t\tcontextWindow: 400000,\n\t\tincludedTools: [\"apply_patch\"],\n\t\texcludedTools: [\"apply_diff\", \"write_to_file\"],\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningEffort: [\"none\", \"low\", \"medium\", \"high\", \"xhigh\"],\n\t\treasoningEffort: \"none\",\n\t\tinputPrice: 0.75,\n\t\toutputPrice: 4.5,\n\t\tcacheReadsPrice: 0.075,\n\t\tsupportsVerbosity: true,\n\t\tsupportsTemperature: false,\n\t\ttiers: [\n\t\t\t{ name: \"flex\", contextWindow: 400000, inputPrice: 0.375, outputPrice: 2.25, cacheReadsPrice: 0.0375 },\n\t\t\t{ name: \"priority\", contextWindow: 400000, inputPrice: 1.5, outputPrice: 9.0, cacheReadsPrice: 0.15 },\n\t\t],\n\t\tdescription: \"GPT-5.4 Mini: A faster, lower-cost GPT-5.4 model for coding and agentic workflows\",\n\t},\n\t\"gpt-5.4-nano\": {\n\t\tmaxTokens: 128000,\n\t\tcontextWindow: 400000,\n\t\tincludedTools: [\"apply_patch\"],\n\t\texcludedTools: [\"apply_diff\", \"write_to_file\"],\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningEffort: [\"none\", \"low\", \"medium\", \"high\", \"xhigh\"],\n\t\treasoningEffort: \"none\",\n\t\tinputPrice: 0.2,\n\t\toutputPrice: 1.25,\n\t\tcacheReadsPrice: 0.02,\n\t\tsupportsVerbosity: true,\n\t\tsupportsTemperature: false,\n\t\ttiers: [{ name: \"flex\", contextWindow: 400000, inputPrice: 0.1, outputPrice: 0.625, cacheReadsPrice: 0.01 }],\n\t\tdescription: \"GPT-5.4 Nano: The smallest GPT-5.4 model for high-volume, low-latency tasks\",\n\t},\n\t\"gpt-5.2\": {\n\t\tmaxTokens: 128000,\n\t\tcontextWindow: 400000,\n\t\tincludedTools: [\"apply_patch\"],\n\t\texcludedTools: [\"apply_diff\", \"write_to_file\"],\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tpromptCacheRetention: \"24h\",\n\t\tsupportsReasoningEffort: [\"none\", \"low\", \"medium\", \"high\", \"xhigh\"],\n\t\treasoningEffort: \"medium\",\n\t\tinputPrice: 1.75,\n\t\toutputPrice: 14.0,\n\t\tcacheReadsPrice: 0.175,\n\t\tsupportsVerbosity: true,\n\t\tsupportsTemperature: false,\n\t\ttiers: [\n\t\t\t{ name: \"flex\", contextWindow: 400000, inputPrice: 0.875, outputPrice: 7.0, cacheReadsPrice: 0.0875 },\n\t\t\t{ name: \"priority\", contextWindow: 400000, inputPrice: 3.5, outputPrice: 28.0, cacheReadsPrice: 0.35 },\n\t\t],\n\t\tdescription: \"GPT-5.2: Our flagship model for coding and agentic tasks across industries\",\n\t},\n\t\"gpt-5.2-codex\": {\n\t\tmaxTokens: 128000,\n\t\tcontextWindow: 400000,\n\t\tincludedTools: [\"apply_patch\"],\n\t\texcludedTools: [\"apply_diff\", \"write_to_file\"],\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tpromptCacheRetention: \"24h\",\n\t\tsupportsReasoningEffort: [\"low\", \"medium\", \"high\", \"xhigh\"],\n\t\treasoningEffort: \"medium\",\n\t\tinputPrice: 1.75,\n\t\toutputPrice: 14.0,\n\t\tcacheReadsPrice: 0.175,\n\t\tsupportsTemperature: false,\n\t\ttiers: [{ name: \"priority\", contextWindow: 400000, inputPrice: 3.5, outputPrice: 28.0, cacheReadsPrice: 0.35 }],\n\t\tdescription:\n\t\t\t\"GPT-5.2 Codex: Our most intelligent coding model optimized for long-horizon, agentic coding tasks\",\n\t},\n\t\"gpt-5.3-codex\": {\n\t\tmaxTokens: 128000,\n\t\tcontextWindow: 400000,\n\t\tincludedTools: [\"apply_patch\"],\n\t\texcludedTools: [\"apply_diff\", \"write_to_file\"],\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tpromptCacheRetention: \"24h\",\n\t\tsupportsReasoningEffort: [\"low\", \"medium\", \"high\", \"xhigh\"],\n\t\treasoningEffort: \"medium\",\n\t\tinputPrice: 1.75,\n\t\toutputPrice: 14.0,\n\t\tcacheReadsPrice: 0.175,\n\t\tsupportsTemperature: false,\n\t\ttiers: [{ name: \"priority\", contextWindow: 400000, inputPrice: 3.5, outputPrice: 28.0, cacheReadsPrice: 0.35 }],\n\t\tdescription:\n\t\t\t\"GPT-5.3 Codex: Our most intelligent coding model optimized for long-horizon, agentic coding tasks\",\n\t},\n\t\"gpt-5.2-chat-latest\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 128_000,\n\t\tincludedTools: [\"apply_patch\"],\n\t\texcludedTools: [\"apply_diff\", \"write_to_file\"],\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 1.75,\n\t\toutputPrice: 14.0,\n\t\tcacheReadsPrice: 0.175,\n\t\tdescription: \"GPT-5.2 Chat: Optimized for conversational AI and chat use cases\",\n\t},\n\t\"gpt-5.3-chat-latest\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 128_000,\n\t\tincludedTools: [\"apply_patch\"],\n\t\texcludedTools: [\"apply_diff\", \"write_to_file\"],\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 1.75,\n\t\toutputPrice: 14.0,\n\t\tcacheReadsPrice: 0.175,\n\t\tdescription: \"GPT-5.3 Chat: Optimized for conversational AI and chat use cases\",\n\t},\n\t\"gpt-5.1\": {\n\t\tmaxTokens: 128000,\n\t\tcontextWindow: 400000,\n\t\tincludedTools: [\"apply_patch\"],\n\t\texcludedTools: [\"apply_diff\", \"write_to_file\"],\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tpromptCacheRetention: \"24h\",\n\t\tsupportsReasoningEffort: [\"none\", \"low\", \"medium\", \"high\"],\n\t\treasoningEffort: \"medium\",\n\t\tinputPrice: 1.25,\n\t\toutputPrice: 10.0,\n\t\tcacheReadsPrice: 0.125,\n\t\tsupportsVerbosity: true,\n\t\tsupportsTemperature: false,\n\t\ttiers: [\n\t\t\t{ name: \"flex\", contextWindow: 400000, inputPrice: 0.625, outputPrice: 5.0, cacheReadsPrice: 0.0625 },\n\t\t\t{ name: \"priority\", contextWindow: 400000, inputPrice: 2.5, outputPrice: 20.0, cacheReadsPrice: 0.25 },\n\t\t],\n\t\tdescription: \"GPT-5.1: The best model for coding and agentic tasks across domains\",\n\t},\n\t\"gpt-5.1-codex\": {\n\t\tmaxTokens: 128000,\n\t\tcontextWindow: 400000,\n\t\tincludedTools: [\"apply_patch\"],\n\t\texcludedTools: [\"apply_diff\", \"write_to_file\"],\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tpromptCacheRetention: \"24h\",\n\t\tsupportsReasoningEffort: [\"low\", \"medium\", \"high\"],\n\t\treasoningEffort: \"medium\",\n\t\tinputPrice: 1.25,\n\t\toutputPrice: 10.0,\n\t\tcacheReadsPrice: 0.125,\n\t\tsupportsTemperature: false,\n\t\ttiers: [{ name: \"priority\", contextWindow: 400000, inputPrice: 2.5, outputPrice: 20.0, cacheReadsPrice: 0.25 }],\n\t\tdescription: \"GPT-5.1 Codex: A version of GPT-5.1 optimized for agentic coding in Codex\",\n\t},\n\t\"gpt-5.1-codex-mini\": {\n\t\tmaxTokens: 128000,\n\t\tcontextWindow: 400000,\n\t\tincludedTools: [\"apply_patch\"],\n\t\texcludedTools: [\"apply_diff\", \"write_to_file\"],\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tpromptCacheRetention: \"24h\",\n\t\tsupportsReasoningEffort: [\"low\", \"medium\", \"high\"],\n\t\treasoningEffort: \"medium\",\n\t\tinputPrice: 0.25,\n\t\toutputPrice: 2.0,\n\t\tcacheReadsPrice: 0.025,\n\t\tsupportsTemperature: false,\n\t\tdescription: \"GPT-5.1 Codex mini: A version of GPT-5.1 optimized for agentic coding in Codex\",\n\t},\n\t\"gpt-5\": {\n\t\tmaxTokens: 128000,\n\t\tcontextWindow: 400000,\n\t\tincludedTools: [\"apply_patch\"],\n\t\texcludedTools: [\"apply_diff\", \"write_to_file\"],\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningEffort: [\"minimal\", \"low\", \"medium\", \"high\"],\n\t\treasoningEffort: \"medium\",\n\t\tinputPrice: 1.25,\n\t\toutputPrice: 10.0,\n\t\tcacheReadsPrice: 0.125,\n\t\tsupportsVerbosity: true,\n\t\tsupportsTemperature: false,\n\t\ttiers: [\n\t\t\t{ name: \"flex\", contextWindow: 400000, inputPrice: 0.625, outputPrice: 5.0, cacheReadsPrice: 0.0625 },\n\t\t\t{ name: \"priority\", contextWindow: 400000, inputPrice: 2.5, outputPrice: 20.0, cacheReadsPrice: 0.25 },\n\t\t],\n\t\tdescription: \"GPT-5: The best model for coding and agentic tasks across domains\",\n\t},\n\t\"gpt-5-mini\": {\n\t\tmaxTokens: 128000,\n\t\tcontextWindow: 400000,\n\t\tincludedTools: [\"apply_patch\"],\n\t\texcludedTools: [\"apply_diff\", \"write_to_file\"],\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningEffort: [\"minimal\", \"low\", \"medium\", \"high\"],\n\t\treasoningEffort: \"medium\",\n\t\tinputPrice: 0.25,\n\t\toutputPrice: 2.0,\n\t\tcacheReadsPrice: 0.025,\n\t\tsupportsVerbosity: true,\n\t\tsupportsTemperature: false,\n\t\ttiers: [\n\t\t\t{ name: \"flex\", contextWindow: 400000, inputPrice: 0.125, outputPrice: 1.0, cacheReadsPrice: 0.0125 },\n\t\t\t{ name: \"priority\", contextWindow: 400000, inputPrice: 0.45, outputPrice: 3.6, cacheReadsPrice: 0.045 },\n\t\t],\n\t\tdescription: \"GPT-5 Mini: A faster, more cost-efficient version of GPT-5 for well-defined tasks\",\n\t},\n\t\"gpt-5-codex\": {\n\t\tmaxTokens: 128000,\n\t\tcontextWindow: 400000,\n\t\tincludedTools: [\"apply_patch\"],\n\t\texcludedTools: [\"apply_diff\", \"write_to_file\"],\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningEffort: [\"low\", \"medium\", \"high\"],\n\t\treasoningEffort: \"medium\",\n\t\tinputPrice: 1.25,\n\t\toutputPrice: 10.0,\n\t\tcacheReadsPrice: 0.125,\n\t\tsupportsTemperature: false,\n\t\ttiers: [{ name: \"priority\", contextWindow: 400000, inputPrice: 2.5, outputPrice: 20.0, cacheReadsPrice: 0.25 }],\n\t\tdescription: \"GPT-5-Codex: A version of GPT-5 optimized for agentic coding in Codex\",\n\t},\n\t\"gpt-5-nano\": {\n\t\tmaxTokens: 128000,\n\t\tcontextWindow: 400000,\n\t\tincludedTools: [\"apply_patch\"],\n\t\texcludedTools: [\"apply_diff\", \"write_to_file\"],\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningEffort: [\"minimal\", \"low\", \"medium\", \"high\"],\n\t\treasoningEffort: \"medium\",\n\t\tinputPrice: 0.05,\n\t\toutputPrice: 0.4,\n\t\tcacheReadsPrice: 0.005,\n\t\tsupportsVerbosity: true,\n\t\tsupportsTemperature: false,\n\t\ttiers: [{ name: \"flex\", contextWindow: 400000, inputPrice: 0.025, outputPrice: 0.2, cacheReadsPrice: 0.0025 }],\n\t\tdescription: \"GPT-5 Nano: Fastest, most cost-efficient version of GPT-5\",\n\t},\n\t\"gpt-5-chat-latest\": {\n\t\tmaxTokens: 128000,\n\t\tcontextWindow: 400000,\n\t\tincludedTools: [\"apply_patch\"],\n\t\texcludedTools: [\"apply_diff\", \"write_to_file\"],\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 1.25,\n\t\toutputPrice: 10.0,\n\t\tcacheReadsPrice: 0.125,\n\t\tdescription: \"GPT-5 Chat: Optimized for conversational AI and non-reasoning tasks\",\n\t},\n\t\"gpt-4.1\": {\n\t\tmaxTokens: 32_768,\n\t\tcontextWindow: 1_047_576,\n\t\tincludedTools: [\"apply_patch\"],\n\t\texcludedTools: [\"apply_diff\", \"write_to_file\"],\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 2,\n\t\toutputPrice: 8,\n\t\tcacheReadsPrice: 0.5,\n\t\tsupportsTemperature: true,\n\t\ttiers: [\n\t\t\t{ name: \"priority\", contextWindow: 1_047_576, inputPrice: 3.5, outputPrice: 14.0, cacheReadsPrice: 0.875 },\n\t\t],\n\t},\n\t\"gpt-4.1-mini\": {\n\t\tmaxTokens: 32_768,\n\t\tcontextWindow: 1_047_576,\n\t\tincludedTools: [\"apply_patch\"],\n\t\texcludedTools: [\"apply_diff\", \"write_to_file\"],\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0.4,\n\t\toutputPrice: 1.6,\n\t\tcacheReadsPrice: 0.1,\n\t\tsupportsTemperature: true,\n\t\ttiers: [\n\t\t\t{ name: \"priority\", contextWindow: 1_047_576, inputPrice: 0.7, outputPrice: 2.8, cacheReadsPrice: 0.175 },\n\t\t],\n\t},\n\t\"gpt-4.1-nano\": {\n\t\tmaxTokens: 32_768,\n\t\tcontextWindow: 1_047_576,\n\t\tincludedTools: [\"apply_patch\"],\n\t\texcludedTools: [\"apply_diff\", \"write_to_file\"],\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0.1,\n\t\toutputPrice: 0.4,\n\t\tcacheReadsPrice: 0.025,\n\t\tsupportsTemperature: true,\n\t\ttiers: [\n\t\t\t{ name: \"priority\", contextWindow: 1_047_576, inputPrice: 0.2, outputPrice: 0.8, cacheReadsPrice: 0.05 },\n\t\t],\n\t},\n\to3: {\n\t\tmaxTokens: 100_000,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 2.0,\n\t\toutputPrice: 8.0,\n\t\tcacheReadsPrice: 0.5,\n\t\tsupportsReasoningEffort: [\"low\", \"medium\", \"high\"],\n\t\treasoningEffort: \"medium\",\n\t\tsupportsTemperature: false,\n\t\ttiers: [\n\t\t\t{ name: \"flex\", contextWindow: 200_000, inputPrice: 1.0, outputPrice: 4.0, cacheReadsPrice: 0.25 },\n\t\t\t{ name: \"priority\", contextWindow: 200_000, inputPrice: 3.5, outputPrice: 14.0, cacheReadsPrice: 0.875 },\n\t\t],\n\t},\n\t\"o3-high\": {\n\t\tmaxTokens: 100_000,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 2.0,\n\t\toutputPrice: 8.0,\n\t\tcacheReadsPrice: 0.5,\n\t\treasoningEffort: \"high\",\n\t\tsupportsTemperature: false,\n\t},\n\t\"o3-low\": {\n\t\tmaxTokens: 100_000,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 2.0,\n\t\toutputPrice: 8.0,\n\t\tcacheReadsPrice: 0.5,\n\t\treasoningEffort: \"low\",\n\t\tsupportsTemperature: false,\n\t},\n\t\"o4-mini\": {\n\t\tmaxTokens: 100_000,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 1.1,\n\t\toutputPrice: 4.4,\n\t\tcacheReadsPrice: 0.275,\n\t\tsupportsReasoningEffort: [\"low\", \"medium\", \"high\"],\n\t\treasoningEffort: \"medium\",\n\t\tsupportsTemperature: false,\n\t\ttiers: [\n\t\t\t{ name: \"flex\", contextWindow: 200_000, inputPrice: 0.55, outputPrice: 2.2, cacheReadsPrice: 0.138 },\n\t\t\t{ name: \"priority\", contextWindow: 200_000, inputPrice: 2.0, outputPrice: 8.0, cacheReadsPrice: 0.5 },\n\t\t],\n\t},\n\t\"o4-mini-high\": {\n\t\tmaxTokens: 100_000,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 1.1,\n\t\toutputPrice: 4.4,\n\t\tcacheReadsPrice: 0.275,\n\t\treasoningEffort: \"high\",\n\t\tsupportsTemperature: false,\n\t},\n\t\"o4-mini-low\": {\n\t\tmaxTokens: 100_000,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 1.1,\n\t\toutputPrice: 4.4,\n\t\tcacheReadsPrice: 0.275,\n\t\treasoningEffort: \"low\",\n\t\tsupportsTemperature: false,\n\t},\n\t\"o3-mini\": {\n\t\tmaxTokens: 100_000,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 1.1,\n\t\toutputPrice: 4.4,\n\t\tcacheReadsPrice: 0.55,\n\t\tsupportsReasoningEffort: [\"low\", \"medium\", \"high\"],\n\t\treasoningEffort: \"medium\",\n\t\tsupportsTemperature: false,\n\t},\n\t\"o3-mini-high\": {\n\t\tmaxTokens: 100_000,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 1.1,\n\t\toutputPrice: 4.4,\n\t\tcacheReadsPrice: 0.55,\n\t\treasoningEffort: \"high\",\n\t\tsupportsTemperature: false,\n\t},\n\t\"o3-mini-low\": {\n\t\tmaxTokens: 100_000,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 1.1,\n\t\toutputPrice: 4.4,\n\t\tcacheReadsPrice: 0.55,\n\t\treasoningEffort: \"low\",\n\t\tsupportsTemperature: false,\n\t},\n\to1: {\n\t\tmaxTokens: 100_000,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 15,\n\t\toutputPrice: 60,\n\t\tcacheReadsPrice: 7.5,\n\t\tsupportsTemperature: false,\n\t},\n\t\"o1-preview\": {\n\t\tmaxTokens: 32_768,\n\t\tcontextWindow: 128_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 15,\n\t\toutputPrice: 60,\n\t\tcacheReadsPrice: 7.5,\n\t\tsupportsTemperature: false,\n\t},\n\t\"o1-mini\": {\n\t\tmaxTokens: 65_536,\n\t\tcontextWindow: 128_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 1.1,\n\t\toutputPrice: 4.4,\n\t\tcacheReadsPrice: 0.55,\n\t\tsupportsTemperature: false,\n\t},\n\t\"gpt-4o\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 128_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 2.5,\n\t\toutputPrice: 10,\n\t\tcacheReadsPrice: 1.25,\n\t\tsupportsTemperature: true,\n\t\ttiers: [\n\t\t\t{ name: \"priority\", contextWindow: 128_000, inputPrice: 4.25, outputPrice: 17.0, cacheReadsPrice: 2.125 },\n\t\t],\n\t},\n\t\"gpt-4o-mini\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 128_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0.15,\n\t\toutputPrice: 0.6,\n\t\tcacheReadsPrice: 0.075,\n\t\tsupportsTemperature: true,\n\t\ttiers: [\n\t\t\t{ name: \"priority\", contextWindow: 128_000, inputPrice: 0.25, outputPrice: 1.0, cacheReadsPrice: 0.125 },\n\t\t],\n\t},\n\t\"codex-mini-latest\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 1.5,\n\t\toutputPrice: 6,\n\t\tcacheReadsPrice: 0.375,\n\t\tsupportsTemperature: false,\n\t\tdescription:\n\t\t\t\"Codex Mini: Cloud-based software engineering agent powered by codex-1, a version of o3 optimized for coding tasks. Trained with reinforcement learning to generate human-style code, adhere to instructions, and iteratively run tests.\",\n\t},\n\t// Dated clones (snapshots) preserved for backward compatibility\n\t\"gpt-5-2025-08-07\": {\n\t\tmaxTokens: 128000,\n\t\tcontextWindow: 400000,\n\t\tincludedTools: [\"apply_patch\"],\n\t\texcludedTools: [\"apply_diff\", \"write_to_file\"],\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningEffort: [\"minimal\", \"low\", \"medium\", \"high\"],\n\t\treasoningEffort: \"medium\",\n\t\tinputPrice: 1.25,\n\t\toutputPrice: 10.0,\n\t\tcacheReadsPrice: 0.125,\n\t\tsupportsVerbosity: true,\n\t\tsupportsTemperature: false,\n\t\ttiers: [\n\t\t\t{ name: \"flex\", contextWindow: 400000, inputPrice: 0.625, outputPrice: 5.0, cacheReadsPrice: 0.0625 },\n\t\t\t{ name: \"priority\", contextWindow: 400000, inputPrice: 2.5, outputPrice: 20.0, cacheReadsPrice: 0.25 },\n\t\t],\n\t\tdescription: \"GPT-5: The best model for coding and agentic tasks across domains\",\n\t},\n\t\"gpt-5-mini-2025-08-07\": {\n\t\tmaxTokens: 128000,\n\t\tcontextWindow: 400000,\n\t\tincludedTools: [\"apply_patch\"],\n\t\texcludedTools: [\"apply_diff\", \"write_to_file\"],\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningEffort: [\"minimal\", \"low\", \"medium\", \"high\"],\n\t\treasoningEffort: \"medium\",\n\t\tinputPrice: 0.25,\n\t\toutputPrice: 2.0,\n\t\tcacheReadsPrice: 0.025,\n\t\tsupportsVerbosity: true,\n\t\tsupportsTemperature: false,\n\t\ttiers: [\n\t\t\t{ name: \"flex\", contextWindow: 400000, inputPrice: 0.125, outputPrice: 1.0, cacheReadsPrice: 0.0125 },\n\t\t\t{ name: \"priority\", contextWindow: 400000, inputPrice: 0.45, outputPrice: 3.6, cacheReadsPrice: 0.045 },\n\t\t],\n\t\tdescription: \"GPT-5 Mini: A faster, more cost-efficient version of GPT-5 for well-defined tasks\",\n\t},\n\t\"gpt-5-nano-2025-08-07\": {\n\t\tmaxTokens: 128000,\n\t\tcontextWindow: 400000,\n\t\tincludedTools: [\"apply_patch\"],\n\t\texcludedTools: [\"apply_diff\", \"write_to_file\"],\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningEffort: [\"minimal\", \"low\", \"medium\", \"high\"],\n\t\treasoningEffort: \"medium\",\n\t\tinputPrice: 0.05,\n\t\toutputPrice: 0.4,\n\t\tcacheReadsPrice: 0.005,\n\t\tsupportsVerbosity: true,\n\t\tsupportsTemperature: false,\n\t\ttiers: [{ name: \"flex\", contextWindow: 400000, inputPrice: 0.025, outputPrice: 0.2, cacheReadsPrice: 0.0025 }],\n\t\tdescription: \"GPT-5 Nano: Fastest, most cost-efficient version of GPT-5\",\n\t},\n} as const satisfies Record<string, ModelInfo>\n\nexport const openAiModelInfoSaneDefaults: ModelInfo = {\n\tmaxTokens: -1,\n\tcontextWindow: 128_000,\n\tsupportsImages: true,\n\tsupportsPromptCache: false,\n\tinputPrice: 0,\n\toutputPrice: 0,\n}\n\n// https://learn.microsoft.com/en-us/azure/ai-services/openai/api-version-deprecation\n// https://learn.microsoft.com/en-us/azure/ai-services/openai/reference#api-specs\nexport const azureOpenAiDefaultApiVersion = \"2024-08-01-preview\"\n\nexport const OPENAI_NATIVE_DEFAULT_TEMPERATURE = 0\n\nexport const OPENAI_AZURE_AI_INFERENCE_PATH = \"/models/chat/completions\"\n","import type { ModelInfo } from \"../model.js\"\n\n/**\n * OpenAI Codex Provider\n *\n * This provider uses OAuth authentication via ChatGPT Plus/Pro subscription\n * instead of direct API keys. Requests are routed to the Codex backend at\n * https://chatgpt.com/backend-api/codex/responses\n *\n * Key differences from openai-native:\n * - Uses OAuth Bearer tokens instead of API keys\n * - Subscription-based pricing (no per-token costs)\n * - Limited model subset available\n * - Custom routing to Codex backend\n */\n\nexport type OpenAiCodexModelId = keyof typeof openAiCodexModels\n\nexport const openAiCodexDefaultModelId: OpenAiCodexModelId = \"gpt-5.3-codex\"\n\n/**\n * Models available through the Codex OAuth flow.\n * These models are accessible to ChatGPT Plus/Pro subscribers.\n * Costs are 0 as they are covered by the subscription.\n */\nexport const openAiCodexModels = {\n\t\"gpt-5.1-codex-max\": {\n\t\tmaxTokens: 128000,\n\t\tcontextWindow: 400000,\n\t\tincludedTools: [\"apply_patch\"],\n\t\texcludedTools: [\"apply_diff\", \"write_to_file\"],\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningEffort: [\"low\", \"medium\", \"high\", \"xhigh\"],\n\t\treasoningEffort: \"xhigh\",\n\t\t// Subscription-based: no per-token costs\n\t\tinputPrice: 0,\n\t\toutputPrice: 0,\n\t\tsupportsTemperature: false,\n\t\tdescription: \"GPT-5.1 Codex Max: Maximum capability coding model via ChatGPT subscription\",\n\t},\n\t\"gpt-5.1-codex\": {\n\t\tmaxTokens: 128000,\n\t\tcontextWindow: 400000,\n\t\tincludedTools: [\"apply_patch\"],\n\t\texcludedTools: [\"apply_diff\", \"write_to_file\"],\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningEffort: [\"low\", \"medium\", \"high\"],\n\t\treasoningEffort: \"medium\",\n\t\t// Subscription-based: no per-token costs\n\t\tinputPrice: 0,\n\t\toutputPrice: 0,\n\t\tsupportsTemperature: false,\n\t\tdescription: \"GPT-5.1 Codex: GPT-5.1 optimized for agentic coding via ChatGPT subscription\",\n\t},\n\t\"gpt-5.3-codex\": {\n\t\tmaxTokens: 128000,\n\t\tcontextWindow: 400000,\n\t\tincludedTools: [\"apply_patch\"],\n\t\texcludedTools: [\"apply_diff\", \"write_to_file\"],\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningEffort: [\"low\", \"medium\", \"high\", \"xhigh\"],\n\t\treasoningEffort: \"medium\",\n\t\tinputPrice: 0,\n\t\toutputPrice: 0,\n\t\tsupportsTemperature: false,\n\t\tdescription: \"GPT-5.3 Codex: OpenAI's flagship coding model via ChatGPT subscription\",\n\t},\n\t\"gpt-5.3-codex-spark\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 128000,\n\t\tincludedTools: [\"apply_patch\"],\n\t\texcludedTools: [\"apply_diff\", \"write_to_file\"],\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningEffort: [\"low\", \"medium\", \"high\", \"xhigh\"],\n\t\treasoningEffort: \"medium\",\n\t\tinputPrice: 0,\n\t\toutputPrice: 0,\n\t\tsupportsTemperature: false,\n\t\tdescription: \"GPT-5.3 Codex Spark: Fast, text-only coding model via ChatGPT subscription\",\n\t},\n\t\"gpt-5.2-codex\": {\n\t\tmaxTokens: 128000,\n\t\tcontextWindow: 400000,\n\t\tincludedTools: [\"apply_patch\"],\n\t\texcludedTools: [\"apply_diff\", \"write_to_file\"],\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningEffort: [\"low\", \"medium\", \"high\", \"xhigh\"],\n\t\treasoningEffort: \"medium\",\n\t\tinputPrice: 0,\n\t\toutputPrice: 0,\n\t\tsupportsTemperature: false,\n\t\tdescription: \"GPT-5.2 Codex: OpenAI's flagship coding model via ChatGPT subscription\",\n\t},\n\t\"gpt-5.1\": {\n\t\tmaxTokens: 128000,\n\t\tcontextWindow: 400000,\n\t\tincludedTools: [\"apply_patch\"],\n\t\texcludedTools: [\"apply_diff\", \"write_to_file\"],\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningEffort: [\"none\", \"low\", \"medium\", \"high\"],\n\t\treasoningEffort: \"medium\",\n\t\t// Subscription-based: no per-token costs\n\t\tinputPrice: 0,\n\t\toutputPrice: 0,\n\t\tsupportsVerbosity: true,\n\t\tsupportsTemperature: false,\n\t\tdescription: \"GPT-5.1: General GPT-5.1 model via ChatGPT subscription\",\n\t},\n\t\"gpt-5\": {\n\t\tmaxTokens: 128000,\n\t\tcontextWindow: 400000,\n\t\tincludedTools: [\"apply_patch\"],\n\t\texcludedTools: [\"apply_diff\", \"write_to_file\"],\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningEffort: [\"minimal\", \"low\", \"medium\", \"high\"],\n\t\treasoningEffort: \"medium\",\n\t\t// Subscription-based: no per-token costs\n\t\tinputPrice: 0,\n\t\toutputPrice: 0,\n\t\tsupportsVerbosity: true,\n\t\tsupportsTemperature: false,\n\t\tdescription: \"GPT-5: General GPT-5 model via ChatGPT subscription\",\n\t},\n\t\"gpt-5-codex\": {\n\t\tmaxTokens: 128000,\n\t\tcontextWindow: 400000,\n\t\tincludedTools: [\"apply_patch\"],\n\t\texcludedTools: [\"apply_diff\", \"write_to_file\"],\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningEffort: [\"low\", \"medium\", \"high\"],\n\t\treasoningEffort: \"medium\",\n\t\t// Subscription-based: no per-token costs\n\t\tinputPrice: 0,\n\t\toutputPrice: 0,\n\t\tsupportsTemperature: false,\n\t\tdescription: \"GPT-5 Codex: GPT-5 optimized for agentic coding via ChatGPT subscription\",\n\t},\n\t\"gpt-5-codex-mini\": {\n\t\tmaxTokens: 128000,\n\t\tcontextWindow: 400000,\n\t\tincludedTools: [\"apply_patch\"],\n\t\texcludedTools: [\"apply_diff\", \"write_to_file\"],\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningEffort: [\"low\", \"medium\", \"high\"],\n\t\treasoningEffort: \"medium\",\n\t\t// Subscription-based: no per-token costs\n\t\tinputPrice: 0,\n\t\toutputPrice: 0,\n\t\tsupportsTemperature: false,\n\t\tdescription: \"GPT-5 Codex Mini: Faster coding model via ChatGPT subscription\",\n\t},\n\t\"gpt-5.1-codex-mini\": {\n\t\tmaxTokens: 128000,\n\t\tcontextWindow: 400000,\n\t\tincludedTools: [\"apply_patch\"],\n\t\texcludedTools: [\"apply_diff\", \"write_to_file\"],\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningEffort: [\"low\", \"medium\", \"high\"],\n\t\treasoningEffort: \"medium\",\n\t\tinputPrice: 0,\n\t\toutputPrice: 0,\n\t\tsupportsTemperature: false,\n\t\tdescription: \"GPT-5.1 Codex Mini: Faster version for coding tasks via ChatGPT subscription\",\n\t},\n\t\"gpt-5.5\": {\n\t\tmaxTokens: 128000,\n\t\tcontextWindow: 1_050_000,\n\t\tincludedTools: [\"apply_patch\"],\n\t\texcludedTools: [\"apply_diff\", \"write_to_file\"],\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningEffort: [\"none\", \"low\", \"medium\", \"high\", \"xhigh\"],\n\t\treasoningEffort: \"none\",\n\t\tinputPrice: 0,\n\t\toutputPrice: 0,\n\t\tsupportsVerbosity: true,\n\t\tsupportsTemperature: false,\n\t\tdescription: \"GPT-5.5: Most capable model via ChatGPT subscription\",\n\t},\n\t\"gpt-5.4\": {\n\t\tmaxTokens: 128000,\n\t\tcontextWindow: 1_050_000,\n\t\tincludedTools: [\"apply_patch\"],\n\t\texcludedTools: [\"apply_diff\", \"write_to_file\"],\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningEffort: [\"none\", \"low\", \"medium\", \"high\", \"xhigh\"],\n\t\treasoningEffort: \"none\",\n\t\tinputPrice: 0,\n\t\toutputPrice: 0,\n\t\tsupportsVerbosity: true,\n\t\tsupportsTemperature: false,\n\t\tdescription: \"GPT-5.4: Formerly most capable model via ChatGPT subscription\",\n\t},\n\t\"gpt-5.4-mini\": {\n\t\tmaxTokens: 128000,\n\t\tcontextWindow: 400000,\n\t\tincludedTools: [\"apply_patch\"],\n\t\texcludedTools: [\"apply_diff\", \"write_to_file\"],\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningEffort: [\"none\", \"low\", \"medium\", \"high\", \"xhigh\"],\n\t\treasoningEffort: \"none\",\n\t\tinputPrice: 0,\n\t\toutputPrice: 0,\n\t\tsupportsVerbosity: true,\n\t\tsupportsTemperature: false,\n\t\tdescription: \"GPT-5.4 Mini: Lower-cost GPT-5.4 model via ChatGPT subscription\",\n\t},\n\t\"gpt-5.2\": {\n\t\tmaxTokens: 128000,\n\t\tcontextWindow: 400000,\n\t\tincludedTools: [\"apply_patch\"],\n\t\texcludedTools: [\"apply_diff\", \"write_to_file\"],\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningEffort: [\"none\", \"low\", \"medium\", \"high\", \"xhigh\"],\n\t\treasoningEffort: \"medium\",\n\t\tinputPrice: 0,\n\t\toutputPrice: 0,\n\t\tsupportsTemperature: false,\n\t\tdescription: \"GPT-5.2: Latest GPT model via ChatGPT subscription\",\n\t},\n} as const satisfies Record<string, ModelInfo>\n","/**\n * OpenAI Codex usage/rate limit information (ChatGPT subscription)\n */\nexport interface OpenAiCodexRateLimitInfo {\n\tprimary?: {\n\t\t/** Used percent in 0–100 */\n\t\tusedPercent: number\n\t\t/** Window length in minutes, when provided */\n\t\twindowMinutes?: number\n\t\t/** Reset time (unix ms since epoch), when provided */\n\t\tresetsAt?: number\n\t}\n\tsecondary?: {\n\t\t/** Used percent in 0–100 */\n\t\tusedPercent: number\n\t\t/** Window length in minutes, when provided */\n\t\twindowMinutes?: number\n\t\t/** Reset time (unix ms since epoch), when provided */\n\t\tresetsAt?: number\n\t}\n\tcredits?: {\n\t\thasCredits: boolean\n\t\tunlimited: boolean\n\t\tbalance?: string\n\t}\n\tplanType?: string\n\t/** Timestamp when this was fetched (unix ms since epoch) */\n\tfetchedAt: number\n}\n","import type { ModelInfo } from \"../model.js\"\n\n// https://openrouter.ai/models?order=newest&supported_parameters=tools\nexport const openRouterDefaultModelId = \"anthropic/claude-sonnet-4.5\"\n\nexport const openRouterDefaultModelInfo: ModelInfo = {\n\tmaxTokens: 8192,\n\tcontextWindow: 200_000,\n\tsupportsImages: true,\n\tsupportsPromptCache: true,\n\tinputPrice: 3.0,\n\toutputPrice: 15.0,\n\tcacheWritesPrice: 3.75,\n\tcacheReadsPrice: 0.3,\n\tdescription:\n\t\t\"Claude 3.7 Sonnet is an advanced large language model with improved reasoning, coding, and problem-solving capabilities. It introduces a hybrid reasoning approach, allowing users to choose between rapid responses and extended, step-by-step processing for complex tasks. The model demonstrates notable improvements in coding, particularly in front-end development and full-stack updates, and excels in agentic workflows, where it can autonomously navigate multi-step processes. Claude 3.7 Sonnet maintains performance parity with its predecessor in standard mode while offering an extended reasoning mode for enhanced accuracy in math, coding, and instruction-following tasks. Read more at the [blog post here](https://www.anthropic.com/news/claude-3-7-sonnet)\",\n}\n\nexport const OPENROUTER_DEFAULT_PROVIDER_NAME = \"[default]\"\n\nexport const OPEN_ROUTER_PROMPT_CACHING_MODELS = new Set([\n\t\"anthropic/claude-3-haiku\",\n\t\"anthropic/claude-3-haiku:beta\",\n\t\"anthropic/claude-3-opus\",\n\t\"anthropic/claude-3-opus:beta\",\n\t\"anthropic/claude-3-sonnet\",\n\t\"anthropic/claude-3-sonnet:beta\",\n\t\"anthropic/claude-3.5-haiku\",\n\t\"anthropic/claude-3.5-haiku-20241022\",\n\t\"anthropic/claude-3.5-haiku-20241022:beta\",\n\t\"anthropic/claude-3.5-haiku:beta\",\n\t\"anthropic/claude-3.5-sonnet\",\n\t\"anthropic/claude-3.5-sonnet-20240620\",\n\t\"anthropic/claude-3.5-sonnet-20240620:beta\",\n\t\"anthropic/claude-3.5-sonnet:beta\",\n\t\"anthropic/claude-3.7-sonnet\",\n\t\"anthropic/claude-3.7-sonnet:beta\",\n\t\"anthropic/claude-3.7-sonnet:thinking\",\n\t\"anthropic/claude-sonnet-4\",\n\t\"anthropic/claude-sonnet-4.5\",\n\t\"anthropic/claude-sonnet-4.6\",\n\t\"anthropic/claude-opus-4\",\n\t\"anthropic/claude-opus-4.1\",\n\t\"anthropic/claude-opus-4.5\",\n\t\"anthropic/claude-opus-4.6\",\n\t\"anthropic/claude-haiku-4.5\",\n\t\"google/gemini-2.5-flash-preview\",\n\t\"google/gemini-2.5-flash-preview:thinking\",\n\t\"google/gemini-2.5-flash-preview-05-20\",\n\t\"google/gemini-2.5-flash-preview-05-20:thinking\",\n\t\"google/gemini-2.5-flash\",\n\t\"google/gemini-2.5-flash-lite-preview-06-17\",\n\t\"google/gemini-2.0-flash-001\",\n\t\"google/gemini-flash-1.5\",\n\t\"google/gemini-flash-1.5-8b\",\n])\n\n// When we first launched these models we didn't have support for\n// enabling/disabling the reasoning budget for hybrid models. Now that we\n// do support this we should give users the option to enable/disable it\n// whenever possible. However these particular (virtual) model ids with the\n// `:thinking` suffix always require the reasoning budget to be enabled, so\n// for backwards compatibility we should still require it.\n// We should *not* be adding new models to this set.\nexport const OPEN_ROUTER_REQUIRED_REASONING_BUDGET_MODELS = new Set([\n\t\"anthropic/claude-3.7-sonnet:thinking\",\n\t\"google/gemini-2.5-pro\",\n\t\"google/gemini-2.5-flash-preview-05-20:thinking\",\n])\n\nexport const OPEN_ROUTER_REASONING_BUDGET_MODELS = new Set([\n\t\"anthropic/claude-3.7-sonnet:beta\",\n\t\"anthropic/claude-opus-4\",\n\t\"anthropic/claude-opus-4.1\",\n\t\"anthropic/claude-opus-4.5\",\n\t\"anthropic/claude-opus-4.6\",\n\t\"anthropic/claude-sonnet-4\",\n\t\"anthropic/claude-sonnet-4.5\",\n\t\"anthropic/claude-sonnet-4.6\",\n\t\"anthropic/claude-haiku-4.5\",\n\t\"google/gemini-2.5-pro-preview\",\n\t\"google/gemini-2.5-pro\",\n\t\"google/gemini-2.5-flash-preview-05-20\",\n\t\"google/gemini-2.5-flash\",\n\t\"google/gemini-2.5-flash-lite-preview-06-17\",\n\t// Also include the models that require the reasoning budget to be enabled\n\t// even though `OPEN_ROUTER_REQUIRED_REASONING_BUDGET_MODELS` takes precedence.\n\t\"anthropic/claude-3.7-sonnet:thinking\",\n\t\"google/gemini-2.5-flash-preview-05-20:thinking\",\n])\n","export { poeDefaultModelId, POE_DEFAULT_BASE_URL, getPoeDefaultModelInfo } from \"ai-sdk-provider-poe/code\"\nexport type { PoeDefaultModelInfo } from \"ai-sdk-provider-poe/code\"\n","import type { ModelInfo } from \"../model.js\"\n\nexport type QwenCodeModelId = \"qwen3-coder-plus\" | \"qwen3-coder-flash\"\n\nexport const qwenCodeDefaultModelId: QwenCodeModelId = \"qwen3-coder-plus\"\n\nexport const qwenCodeModels = {\n\t\"qwen3-coder-plus\": {\n\t\tmaxTokens: 65_536,\n\t\tcontextWindow: 1_000_000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0,\n\t\toutputPrice: 0,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0,\n\t\tdescription: \"Qwen3 Coder Plus - High-performance coding model with 1M context window for large codebases\",\n\t},\n\t\"qwen3-coder-flash\": {\n\t\tmaxTokens: 65_536,\n\t\tcontextWindow: 1_000_000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0,\n\t\toutputPrice: 0,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0,\n\t\tdescription: \"Qwen3 Coder Flash - Fast coding model with 1M context window optimized for speed\",\n\t},\n} as const satisfies Record<QwenCodeModelId, ModelInfo>\n","import type { ModelInfo } from \"../model.js\"\n\n// Requesty\n// https://requesty.ai/router-2\nexport const requestyDefaultModelId = \"coding/claude-4-sonnet\"\n\nexport const requestyDefaultModelInfo: ModelInfo = {\n\tmaxTokens: 8192,\n\tcontextWindow: 200_000,\n\tsupportsImages: true,\n\tsupportsPromptCache: true,\n\tinputPrice: 3.0,\n\toutputPrice: 15.0,\n\tcacheWritesPrice: 3.75,\n\tcacheReadsPrice: 0.3,\n\tdescription:\n\t\t\"The best coding model, optimized by Requesty, and automatically routed to the fastest provider. Claude 4 Sonnet is an advanced large language model with improved reasoning, coding, and problem-solving capabilities.\",\n}\n","import type { ModelInfo } from \"../model.js\"\n\n// https://docs.sambanova.ai/cloud/docs/get-started/supported-models\nexport type SambaNovaModelId =\n\t| \"Meta-Llama-3.1-8B-Instruct\"\n\t| \"Meta-Llama-3.3-70B-Instruct\"\n\t| \"DeepSeek-R1\"\n\t| \"DeepSeek-V3-0324\"\n\t| \"DeepSeek-V3.1\"\n\t| \"Llama-4-Maverick-17B-128E-Instruct\"\n\t| \"Qwen3-32B\"\n\t| \"gpt-oss-120b\"\n\nexport const sambaNovaDefaultModelId: SambaNovaModelId = \"Meta-Llama-3.3-70B-Instruct\"\n\nexport const sambaNovaModels = {\n\t\"Meta-Llama-3.1-8B-Instruct\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 16384,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.1,\n\t\toutputPrice: 0.2,\n\t\tdescription: \"Meta Llama 3.1 8B Instruct model with 16K context window.\",\n\t},\n\t\"Meta-Llama-3.3-70B-Instruct\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 131072,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.6,\n\t\toutputPrice: 1.2,\n\t\tdescription: \"Meta Llama 3.3 70B Instruct model with 128K context window.\",\n\t},\n\t\"DeepSeek-R1\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 32768,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tsupportsReasoningBudget: true,\n\t\tinputPrice: 5.0,\n\t\toutputPrice: 7.0,\n\t\tdescription: \"DeepSeek R1 reasoning model with 32K context window.\",\n\t},\n\t\"DeepSeek-V3-0324\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 32768,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 3.0,\n\t\toutputPrice: 4.5,\n\t\tdescription: \"DeepSeek V3 model with 32K context window.\",\n\t},\n\t\"DeepSeek-V3.1\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 32768,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 3.0,\n\t\toutputPrice: 4.5,\n\t\tdescription: \"DeepSeek V3.1 model with 32K context window.\",\n\t},\n\t\"Llama-4-Maverick-17B-128E-Instruct\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 131072,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.63,\n\t\toutputPrice: 1.8,\n\t\tdescription: \"Meta Llama 4 Maverick 17B 128E Instruct model with 128K context window.\",\n\t},\n\t\"Qwen3-32B\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 8192,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.4,\n\t\toutputPrice: 0.8,\n\t\tdescription: \"Alibaba Qwen 3 32B model with 8K context window.\",\n\t},\n\t\"gpt-oss-120b\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 131072,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.22,\n\t\toutputPrice: 0.59,\n\t\tdescription: \"OpenAI gpt oss 120b model with 128k context window.\",\n\t},\n} as const satisfies Record<string, ModelInfo>\n","import type { ModelInfo } from \"../model.js\"\n\n// Unbound\n// https://gateway.getunbound.ai\nexport const unboundDefaultModelId = \"anthropic/claude-sonnet-4-5\"\n\nexport const unboundDefaultModelInfo: ModelInfo = {\n\tmaxTokens: 8192,\n\tcontextWindow: 200_000,\n\tsupportsImages: true,\n\tsupportsPromptCache: true,\n\tinputPrice: 3.0,\n\toutputPrice: 15.0,\n\tcacheWritesPrice: 3.75,\n\tcacheReadsPrice: 0.3,\n}\n","import type { ModelInfo } from \"../model.js\"\n\n// https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/use-claude\nexport type VertexModelId = keyof typeof vertexModels\n\nexport const vertexDefaultModelId: VertexModelId = \"claude-sonnet-4-5@20250929\"\n\nexport const vertexModels = {\n\t\"gemini-3.1-pro-preview\": {\n\t\tmaxTokens: 65_536,\n\t\tcontextWindow: 1_048_576,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningEffort: [\"low\", \"medium\", \"high\"],\n\t\treasoningEffort: \"low\",\n\n\t\tsupportsTemperature: true,\n\t\tdefaultTemperature: 1,\n\t\tinputPrice: 4.0,\n\t\toutputPrice: 18.0,\n\t\tcacheReadsPrice: 0.4,\n\t\tcacheWritesPrice: 4.5,\n\t\ttiers: [\n\t\t\t{\n\t\t\t\tcontextWindow: 200_000,\n\t\t\t\tinputPrice: 2.0,\n\t\t\t\toutputPrice: 12.0,\n\t\t\t\tcacheReadsPrice: 0.2,\n\t\t\t},\n\t\t\t{\n\t\t\t\tcontextWindow: Infinity,\n\t\t\t\tinputPrice: 4.0,\n\t\t\t\toutputPrice: 18.0,\n\t\t\t\tcacheReadsPrice: 0.4,\n\t\t\t},\n\t\t],\n\t},\n\t\"gemini-3.1-pro-preview-customtools\": {\n\t\tmaxTokens: 65_536,\n\t\tcontextWindow: 1_048_576,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningEffort: [\"low\", \"medium\", \"high\"],\n\t\treasoningEffort: \"low\",\n\n\t\tsupportsTemperature: true,\n\t\tdefaultTemperature: 1,\n\t\tinputPrice: 4.0,\n\t\toutputPrice: 18.0,\n\t\tcacheReadsPrice: 0.4,\n\t\tcacheWritesPrice: 4.5,\n\t\ttiers: [\n\t\t\t{\n\t\t\t\tcontextWindow: 200_000,\n\t\t\t\tinputPrice: 2.0,\n\t\t\t\toutputPrice: 12.0,\n\t\t\t\tcacheReadsPrice: 0.2,\n\t\t\t},\n\t\t\t{\n\t\t\t\tcontextWindow: Infinity,\n\t\t\t\tinputPrice: 4.0,\n\t\t\t\toutputPrice: 18.0,\n\t\t\t\tcacheReadsPrice: 0.4,\n\t\t\t},\n\t\t],\n\t},\n\t\"gemini-3-pro-preview\": {\n\t\tmaxTokens: 65_536,\n\t\tcontextWindow: 1_048_576,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningEffort: [\"low\", \"high\"],\n\t\treasoningEffort: \"low\",\n\n\t\tsupportsTemperature: true,\n\t\tdefaultTemperature: 1,\n\t\tinputPrice: 4.0,\n\t\toutputPrice: 18.0,\n\t\tcacheReadsPrice: 0.4,\n\t\ttiers: [\n\t\t\t{\n\t\t\t\tcontextWindow: 200_000,\n\t\t\t\tinputPrice: 2.0,\n\t\t\t\toutputPrice: 12.0,\n\t\t\t\tcacheReadsPrice: 0.2,\n\t\t\t},\n\t\t\t{\n\t\t\t\tcontextWindow: Infinity,\n\t\t\t\tinputPrice: 4.0,\n\t\t\t\toutputPrice: 18.0,\n\t\t\t\tcacheReadsPrice: 0.4,\n\t\t\t},\n\t\t],\n\t},\n\t\"gemini-3-flash-preview\": {\n\t\tmaxTokens: 65_536,\n\t\tcontextWindow: 1_048_576,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningEffort: [\"minimal\", \"low\", \"medium\", \"high\"],\n\t\treasoningEffort: \"medium\",\n\n\t\tsupportsTemperature: true,\n\t\tdefaultTemperature: 1,\n\t\tinputPrice: 0.5,\n\t\toutputPrice: 3.0,\n\t\tcacheReadsPrice: 0.05,\n\t},\n\t\"gemini-2.5-flash-preview-05-20:thinking\": {\n\t\tmaxTokens: 65_535,\n\t\tcontextWindow: 1_048_576,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\n\t\tinputPrice: 0.15,\n\t\toutputPrice: 3.5,\n\t\tmaxThinkingTokens: 24_576,\n\t\tsupportsReasoningBudget: true,\n\t\trequiredReasoningBudget: true,\n\t},\n\t\"gemini-2.5-flash-preview-05-20\": {\n\t\tmaxTokens: 65_535,\n\t\tcontextWindow: 1_048_576,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\n\t\tinputPrice: 0.15,\n\t\toutputPrice: 0.6,\n\t},\n\t\"gemini-2.5-flash\": {\n\t\tmaxTokens: 64_000,\n\t\tcontextWindow: 1_048_576,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\n\t\tinputPrice: 0.3,\n\t\toutputPrice: 2.5,\n\t\tcacheReadsPrice: 0.075,\n\t\tcacheWritesPrice: 1.0,\n\t\tmaxThinkingTokens: 24_576,\n\t\tsupportsReasoningBudget: true,\n\t},\n\t\"gemini-2.5-flash-preview-04-17:thinking\": {\n\t\tmaxTokens: 65_535,\n\t\tcontextWindow: 1_048_576,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: false,\n\n\t\tinputPrice: 0.15,\n\t\toutputPrice: 3.5,\n\t\tmaxThinkingTokens: 24_576,\n\t\tsupportsReasoningBudget: true,\n\t\trequiredReasoningBudget: true,\n\t},\n\t\"gemini-2.5-flash-preview-04-17\": {\n\t\tmaxTokens: 65_535,\n\t\tcontextWindow: 1_048_576,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: false,\n\n\t\tinputPrice: 0.15,\n\t\toutputPrice: 0.6,\n\t},\n\t\"gemini-2.5-pro-preview-03-25\": {\n\t\tmaxTokens: 65_535,\n\t\tcontextWindow: 1_048_576,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\n\t\tinputPrice: 2.5,\n\t\toutputPrice: 15,\n\t},\n\t\"gemini-2.5-pro-preview-05-06\": {\n\t\tmaxTokens: 65_535,\n\t\tcontextWindow: 1_048_576,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\n\t\tinputPrice: 2.5,\n\t\toutputPrice: 15,\n\t},\n\t\"gemini-2.5-pro-preview-06-05\": {\n\t\tmaxTokens: 65_535,\n\t\tcontextWindow: 1_048_576,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\n\t\tinputPrice: 2.5,\n\t\toutputPrice: 15,\n\t\tmaxThinkingTokens: 32_768,\n\t\tsupportsReasoningBudget: true,\n\t},\n\t\"gemini-2.5-pro\": {\n\t\tmaxTokens: 64_000,\n\t\tcontextWindow: 1_048_576,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\n\t\tinputPrice: 2.5,\n\t\toutputPrice: 15,\n\t\tmaxThinkingTokens: 32_768,\n\t\tsupportsReasoningBudget: true,\n\t\trequiredReasoningBudget: true,\n\t\ttiers: [\n\t\t\t{\n\t\t\t\tcontextWindow: 200_000,\n\t\t\t\tinputPrice: 1.25,\n\t\t\t\toutputPrice: 10,\n\t\t\t\tcacheReadsPrice: 0.31,\n\t\t\t},\n\t\t\t{\n\t\t\t\tcontextWindow: Infinity,\n\t\t\t\tinputPrice: 2.5,\n\t\t\t\toutputPrice: 15,\n\t\t\t\tcacheReadsPrice: 0.625,\n\t\t\t},\n\t\t],\n\t},\n\t\"gemini-2.5-pro-exp-03-25\": {\n\t\tmaxTokens: 65_535,\n\t\tcontextWindow: 1_048_576,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: false,\n\n\t\tinputPrice: 0,\n\t\toutputPrice: 0,\n\t},\n\t\"gemini-2.0-pro-exp-02-05\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 2_097_152,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: false,\n\n\t\tinputPrice: 0,\n\t\toutputPrice: 0,\n\t},\n\t\"gemini-2.0-flash-001\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 1_048_576,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\n\t\tinputPrice: 0.15,\n\t\toutputPrice: 0.6,\n\t},\n\t\"gemini-2.0-flash-lite-001\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 1_048_576,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: false,\n\n\t\tinputPrice: 0.075,\n\t\toutputPrice: 0.3,\n\t},\n\t\"gemini-2.0-flash-thinking-exp-01-21\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 32_768,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: false,\n\n\t\tinputPrice: 0,\n\t\toutputPrice: 0,\n\t},\n\t\"gemini-1.5-flash-002\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 1_048_576,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\n\t\tinputPrice: 0.075,\n\t\toutputPrice: 0.3,\n\t},\n\t\"gemini-1.5-pro-002\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 2_097_152,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: false,\n\n\t\tinputPrice: 1.25,\n\t\toutputPrice: 5,\n\t},\n\t\"claude-sonnet-4@20250514\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 200_000, // Default 200K, extendable to 1M with beta flag 'context-1m-2025-08-07'\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 3.0, // $3 per million input tokens (≤200K context)\n\t\toutputPrice: 15.0, // $15 per million output tokens (≤200K context)\n\t\tcacheWritesPrice: 3.75, // $3.75 per million tokens\n\t\tcacheReadsPrice: 0.3, // $0.30 per million tokens\n\t\tsupportsReasoningBudget: true,\n\t\t// Tiered pricing for extended context (requires beta flag 'context-1m-2025-08-07')\n\t\ttiers: [\n\t\t\t{\n\t\t\t\tcontextWindow: 1_000_000, // 1M tokens with beta flag\n\t\t\t\tinputPrice: 6.0, // $6 per million input tokens (>200K context)\n\t\t\t\toutputPrice: 22.5, // $22.50 per million output tokens (>200K context)\n\t\t\t\tcacheWritesPrice: 7.5, // $7.50 per million tokens (>200K context)\n\t\t\t\tcacheReadsPrice: 0.6, // $0.60 per million tokens (>200K context)\n\t\t\t},\n\t\t],\n\t},\n\t\"claude-sonnet-4-5@20250929\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 200_000, // Default 200K, extendable to 1M with beta flag 'context-1m-2025-08-07'\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 3.0, // $3 per million input tokens (≤200K context)\n\t\toutputPrice: 15.0, // $15 per million output tokens (≤200K context)\n\t\tcacheWritesPrice: 3.75, // $3.75 per million tokens\n\t\tcacheReadsPrice: 0.3, // $0.30 per million tokens\n\t\tsupportsReasoningBudget: true,\n\t\t// Tiered pricing for extended context (requires beta flag 'context-1m-2025-08-07')\n\t\ttiers: [\n\t\t\t{\n\t\t\t\tcontextWindow: 1_000_000, // 1M tokens with beta flag\n\t\t\t\tinputPrice: 6.0, // $6 per million input tokens (>200K context)\n\t\t\t\toutputPrice: 22.5, // $22.50 per million output tokens (>200K context)\n\t\t\t\tcacheWritesPrice: 7.5, // $7.50 per million tokens (>200K context)\n\t\t\t\tcacheReadsPrice: 0.6, // $0.60 per million tokens (>200K context)\n\t\t\t},\n\t\t],\n\t},\n\t\"claude-sonnet-4-6\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 200_000, // Default 200K, extendable to 1M with beta flag 'context-1m-2025-08-07'\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 3.0, // $3 per million input tokens (≤200K context)\n\t\toutputPrice: 15.0, // $15 per million output tokens (≤200K context)\n\t\tcacheWritesPrice: 3.75, // $3.75 per million tokens\n\t\tcacheReadsPrice: 0.3, // $0.30 per million tokens\n\t\tsupportsReasoningBudget: true,\n\t\t// Tiered pricing for extended context (requires beta flag 'context-1m-2025-08-07')\n\t\ttiers: [\n\t\t\t{\n\t\t\t\tcontextWindow: 1_000_000, // 1M tokens with beta flag\n\t\t\t\tinputPrice: 6.0, // $6 per million input tokens (>200K context)\n\t\t\t\toutputPrice: 22.5, // $22.50 per million output tokens (>200K context)\n\t\t\t\tcacheWritesPrice: 7.5, // $7.50 per million tokens (>200K context)\n\t\t\t\tcacheReadsPrice: 0.6, // $0.60 per million tokens (>200K context)\n\t\t\t},\n\t\t],\n\t},\n\t\"claude-haiku-4-5@20251001\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 1.0,\n\t\toutputPrice: 5.0,\n\t\tcacheWritesPrice: 1.25,\n\t\tcacheReadsPrice: 0.1,\n\t\tsupportsReasoningBudget: true,\n\t},\n\t\"claude-opus-4-6\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 200_000, // Default 200K, extendable to 1M with beta flag 'context-1m-2025-08-07'\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 5.0, // $5 per million input tokens (≤200K context)\n\t\toutputPrice: 25.0, // $25 per million output tokens (≤200K context)\n\t\tcacheWritesPrice: 6.25, // $6.25 per million tokens\n\t\tcacheReadsPrice: 0.5, // $0.50 per million tokens\n\t\tsupportsReasoningBudget: true,\n\t\t// Tiered pricing for extended context (requires beta flag 'context-1m-2025-08-07')\n\t\ttiers: [\n\t\t\t{\n\t\t\t\tcontextWindow: 1_000_000, // 1M tokens with beta flag\n\t\t\t\tinputPrice: 10.0, // $10 per million input tokens (>200K context)\n\t\t\t\toutputPrice: 37.5, // $37.50 per million output tokens (>200K context)\n\t\t\t\tcacheWritesPrice: 12.5, // $12.50 per million tokens (>200K context)\n\t\t\t\tcacheReadsPrice: 1.0, // $1.00 per million tokens (>200K context)\n\t\t\t},\n\t\t],\n\t},\n\t\"claude-opus-4-7\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 200_000, // Default 200K, extendable to 1M with beta flag 'context-1m-2025-08-07'\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 5.0, // $5 per million input tokens (≤200K context)\n\t\toutputPrice: 25.0, // $25 per million output tokens (≤200K context)\n\t\tcacheWritesPrice: 6.25, // $6.25 per million tokens\n\t\tcacheReadsPrice: 0.5, // $0.50 per million tokens\n\t\tsupportsReasoningBudget: true,\n\t\t// Tiered pricing for extended context (requires beta flag 'context-1m-2025-08-07')\n\t\ttiers: [\n\t\t\t{\n\t\t\t\tcontextWindow: 1_000_000, // 1M tokens with beta flag\n\t\t\t\tinputPrice: 10.0, // $10 per million input tokens (>200K context)\n\t\t\t\toutputPrice: 37.5, // $37.50 per million output tokens (>200K context)\n\t\t\t\tcacheWritesPrice: 12.5, // $12.50 per million tokens (>200K context)\n\t\t\t\tcacheReadsPrice: 1.0, // $1.00 per million tokens (>200K context)\n\t\t\t},\n\t\t],\n\t},\n\t\"claude-opus-4-5@20251101\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 5.0,\n\t\toutputPrice: 25.0,\n\t\tcacheWritesPrice: 6.25,\n\t\tcacheReadsPrice: 0.5,\n\t\tsupportsReasoningBudget: true,\n\t},\n\t\"claude-opus-4-1@20250805\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 15.0,\n\t\toutputPrice: 75.0,\n\t\tcacheWritesPrice: 18.75,\n\t\tcacheReadsPrice: 1.5,\n\t\tsupportsReasoningBudget: true,\n\t},\n\t\"claude-opus-4@20250514\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 15.0,\n\t\toutputPrice: 75.0,\n\t\tcacheWritesPrice: 18.75,\n\t\tcacheReadsPrice: 1.5,\n\t},\n\t\"claude-3-7-sonnet@20250219:thinking\": {\n\t\tmaxTokens: 64_000,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 3.0,\n\t\toutputPrice: 15.0,\n\t\tcacheWritesPrice: 3.75,\n\t\tcacheReadsPrice: 0.3,\n\t\tsupportsReasoningBudget: true,\n\t\trequiredReasoningBudget: true,\n\t},\n\t\"claude-3-7-sonnet@20250219\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 3.0,\n\t\toutputPrice: 15.0,\n\t\tcacheWritesPrice: 3.75,\n\t\tcacheReadsPrice: 0.3,\n\t},\n\t\"claude-3-5-sonnet-v2@20241022\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 3.0,\n\t\toutputPrice: 15.0,\n\t\tcacheWritesPrice: 3.75,\n\t\tcacheReadsPrice: 0.3,\n\t},\n\t\"claude-3-5-sonnet@20240620\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 3.0,\n\t\toutputPrice: 15.0,\n\t\tcacheWritesPrice: 3.75,\n\t\tcacheReadsPrice: 0.3,\n\t},\n\t\"claude-3-5-haiku@20241022\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 1.0,\n\t\toutputPrice: 5.0,\n\t\tcacheWritesPrice: 1.25,\n\t\tcacheReadsPrice: 0.1,\n\t},\n\t\"claude-3-opus@20240229\": {\n\t\tmaxTokens: 4096,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 15.0,\n\t\toutputPrice: 75.0,\n\t\tcacheWritesPrice: 18.75,\n\t\tcacheReadsPrice: 1.5,\n\t},\n\t\"claude-3-haiku@20240307\": {\n\t\tmaxTokens: 4096,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0.25,\n\t\toutputPrice: 1.25,\n\t\tcacheWritesPrice: 0.3,\n\t\tcacheReadsPrice: 0.03,\n\t},\n\t\"gemini-2.5-flash-lite-preview-06-17\": {\n\t\tmaxTokens: 64_000,\n\t\tcontextWindow: 1_048_576,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\n\t\tinputPrice: 0.1,\n\t\toutputPrice: 0.4,\n\t\tcacheReadsPrice: 0.025,\n\t\tcacheWritesPrice: 1.0,\n\t\tmaxThinkingTokens: 24_576,\n\t\tsupportsReasoningBudget: true,\n\t},\n\t\"llama-4-maverick-17b-128e-instruct-maas\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 131072,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.35,\n\t\toutputPrice: 1.15,\n\t\tdescription: \"Meta Llama 4 Maverick 17B Instruct model, 128K context.\",\n\t},\n\t\"deepseek-r1-0528-maas\": {\n\t\tmaxTokens: 32_768,\n\t\tcontextWindow: 163_840,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 1.35,\n\t\toutputPrice: 5.4,\n\t\tdescription: \"DeepSeek R1 (0528). Available in us-central1\",\n\t},\n\t\"deepseek-v3.1-maas\": {\n\t\tmaxTokens: 32_768,\n\t\tcontextWindow: 163_840,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.6,\n\t\toutputPrice: 1.7,\n\t\tdescription: \"DeepSeek V3.1. Available in us-west2\",\n\t},\n\t\"gpt-oss-120b-maas\": {\n\t\tmaxTokens: 32_768,\n\t\tcontextWindow: 131_072,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.15,\n\t\toutputPrice: 0.6,\n\t\tdescription: \"OpenAI gpt-oss 120B. Available in us-central1\",\n\t},\n\t\"gpt-oss-20b-maas\": {\n\t\tmaxTokens: 32_768,\n\t\tcontextWindow: 131_072,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.075,\n\t\toutputPrice: 0.3,\n\t\tdescription: \"OpenAI gpt-oss 20B. Available in us-central1\",\n\t},\n\t\"qwen3-coder-480b-a35b-instruct-maas\": {\n\t\tmaxTokens: 32_768,\n\t\tcontextWindow: 262_144,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 1.0,\n\t\toutputPrice: 4.0,\n\t\tdescription: \"Qwen3 Coder 480B A35B Instruct. Available in us-south1\",\n\t},\n\t\"qwen3-235b-a22b-instruct-2507-maas\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 262_144,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.25,\n\t\toutputPrice: 1.0,\n\t\tdescription: \"Qwen3 235B A22B Instruct. Available in us-south1\",\n\t},\n\t\"moonshotai/kimi-k2-thinking-maas\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 262_144,\n\t\tsupportsPromptCache: false,\n\t\tsupportsImages: false,\n\t\tinputPrice: 0.6,\n\t\toutputPrice: 2.5,\n\t\tdescription: \"Kimi K2 Thinking Model with 256K context window.\",\n\t},\n} as const satisfies Record<string, ModelInfo>\n\n// Vertex AI models that support 1M context window beta\n// Uses the same beta header 'context-1m-2025-08-07' as Anthropic and Bedrock\nexport const VERTEX_1M_CONTEXT_MODEL_IDS = [\n\t\"claude-sonnet-4@20250514\",\n\t\"claude-sonnet-4-5@20250929\",\n\t\"claude-sonnet-4-6\",\n\t\"claude-opus-4-6\",\n\t\"claude-opus-4-7\",\n] as const\n\nexport const VERTEX_REGIONS = [\n\t{ value: \"global\", label: \"global\" },\n\t{ value: \"us-central1\", label: \"us-central1\" },\n\t{ value: \"us-east1\", label: \"us-east1\" },\n\t{ value: \"us-east4\", label: \"us-east4\" },\n\t{ value: \"us-east5\", label: \"us-east5\" },\n\t{ value: \"us-south1\", label: \"us-south1\" },\n\t{ value: \"us-west1\", label: \"us-west1\" },\n\t{ value: \"us-west2\", label: \"us-west2\" },\n\t{ value: \"us-west3\", label: \"us-west3\" },\n\t{ value: \"us-west4\", label: \"us-west4\" },\n\t{ value: \"northamerica-northeast1\", label: \"northamerica-northeast1\" },\n\t{ value: \"northamerica-northeast2\", label: \"northamerica-northeast2\" },\n\t{ value: \"southamerica-east1\", label: \"southamerica-east1\" },\n\t{ value: \"europe-west1\", label: \"europe-west1\" },\n\t{ value: \"europe-west2\", label: \"europe-west2\" },\n\t{ value: \"europe-west3\", label: \"europe-west3\" },\n\t{ value: \"europe-west4\", label: \"europe-west4\" },\n\t{ value: \"europe-west6\", label: \"europe-west6\" },\n\t{ value: \"europe-central2\", label: \"europe-central2\" },\n\t{ value: \"asia-east1\", label: \"asia-east1\" },\n\t{ value: \"asia-east2\", label: \"asia-east2\" },\n\t{ value: \"asia-northeast1\", label: \"asia-northeast1\" },\n\t{ value: \"asia-northeast2\", label: \"asia-northeast2\" },\n\t{ value: \"asia-northeast3\", label: \"asia-northeast3\" },\n\t{ value: \"asia-south1\", label: \"asia-south1\" },\n\t{ value: \"asia-south2\", label: \"asia-south2\" },\n\t{ value: \"asia-southeast1\", label: \"asia-southeast1\" },\n\t{ value: \"asia-southeast2\", label: \"asia-southeast2\" },\n\t{ value: \"australia-southeast1\", label: \"australia-southeast1\" },\n\t{ value: \"australia-southeast2\", label: \"australia-southeast2\" },\n\t{ value: \"me-west1\", label: \"me-west1\" },\n\t{ value: \"me-central1\", label: \"me-central1\" },\n\t{ value: \"africa-south1\", label: \"africa-south1\" },\n]\n","import type { ModelInfo } from \"../model.js\"\n\nexport type VscodeLlmModelId = keyof typeof vscodeLlmModels\n\nexport const vscodeLlmDefaultModelId: VscodeLlmModelId = \"claude-3.5-sonnet\"\n\n// https://docs.cline.bot/provider-config/vscode-language-model-api\nexport const vscodeLlmModels = {\n\t\"gpt-3.5-turbo\": {\n\t\tcontextWindow: 12114,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0,\n\t\toutputPrice: 0,\n\t\tfamily: \"gpt-3.5-turbo\",\n\t\tversion: \"gpt-3.5-turbo-0613\",\n\t\tname: \"GPT 3.5 Turbo\",\n\t\tsupportsToolCalling: true,\n\t\tmaxInputTokens: 12114,\n\t},\n\t\"gpt-4o-mini\": {\n\t\tcontextWindow: 12115,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0,\n\t\toutputPrice: 0,\n\t\tfamily: \"gpt-4o-mini\",\n\t\tversion: \"gpt-4o-mini-2024-07-18\",\n\t\tname: \"GPT-4o mini\",\n\t\tsupportsToolCalling: true,\n\t\tmaxInputTokens: 12115,\n\t},\n\t\"gpt-4\": {\n\t\tcontextWindow: 28501,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0,\n\t\toutputPrice: 0,\n\t\tfamily: \"gpt-4\",\n\t\tversion: \"gpt-4-0613\",\n\t\tname: \"GPT 4\",\n\t\tsupportsToolCalling: true,\n\t\tmaxInputTokens: 28501,\n\t},\n\t\"gpt-4-0125-preview\": {\n\t\tcontextWindow: 63826,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0,\n\t\toutputPrice: 0,\n\t\tfamily: \"gpt-4-turbo\",\n\t\tversion: \"gpt-4-0125-preview\",\n\t\tname: \"GPT 4 Turbo\",\n\t\tsupportsToolCalling: true,\n\t\tmaxInputTokens: 63826,\n\t},\n\t\"gpt-4o\": {\n\t\tcontextWindow: 63827,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0,\n\t\toutputPrice: 0,\n\t\tfamily: \"gpt-4o\",\n\t\tversion: \"gpt-4o-2024-11-20\",\n\t\tname: \"GPT-4o\",\n\t\tsupportsToolCalling: true,\n\t\tmaxInputTokens: 63827,\n\t},\n\to1: {\n\t\tcontextWindow: 19827,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0,\n\t\toutputPrice: 0,\n\t\tfamily: \"o1-ga\",\n\t\tversion: \"o1-2024-12-17\",\n\t\tname: \"o1 (Preview)\",\n\t\tsupportsToolCalling: true,\n\t\tmaxInputTokens: 19827,\n\t},\n\t\"o3-mini\": {\n\t\tcontextWindow: 63827,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0,\n\t\toutputPrice: 0,\n\t\tfamily: \"o3-mini\",\n\t\tversion: \"o3-mini-2025-01-31\",\n\t\tname: \"o3-mini\",\n\t\tsupportsToolCalling: true,\n\t\tmaxInputTokens: 63827,\n\t},\n\t\"claude-3.5-sonnet\": {\n\t\tcontextWindow: 81638,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0,\n\t\toutputPrice: 0,\n\t\tfamily: \"claude-3.5-sonnet\",\n\t\tversion: \"claude-3.5-sonnet\",\n\t\tname: \"Claude 3.5 Sonnet\",\n\t\tsupportsToolCalling: true,\n\t\tmaxInputTokens: 81638,\n\t},\n\t\"claude-4-sonnet\": {\n\t\tcontextWindow: 128000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0,\n\t\toutputPrice: 0,\n\t\tfamily: \"claude-sonnet-4\",\n\t\tversion: \"claude-sonnet-4\",\n\t\tname: \"Claude Sonnet 4\",\n\t\tsupportsToolCalling: true,\n\t\tmaxInputTokens: 111836,\n\t},\n\t\"gemini-2.0-flash-001\": {\n\t\tcontextWindow: 127827,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0,\n\t\toutputPrice: 0,\n\t\tfamily: \"gemini-2.0-flash\",\n\t\tversion: \"gemini-2.0-flash-001\",\n\t\tname: \"Gemini 2.0 Flash\",\n\t\tsupportsToolCalling: false,\n\t\tmaxInputTokens: 127827,\n\t},\n\t\"gemini-2.5-pro\": {\n\t\tcontextWindow: 128000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0,\n\t\toutputPrice: 0,\n\t\tfamily: \"gemini-2.5-pro\",\n\t\tversion: \"gemini-2.5-pro-preview-03-25\",\n\t\tname: \"Gemini 2.5 Pro (Preview)\",\n\t\tsupportsToolCalling: true,\n\t\tmaxInputTokens: 108637,\n\t},\n\t\"o4-mini\": {\n\t\tcontextWindow: 128000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0,\n\t\toutputPrice: 0,\n\t\tfamily: \"o4-mini\",\n\t\tversion: \"o4-mini-2025-04-16\",\n\t\tname: \"o4-mini (Preview)\",\n\t\tsupportsToolCalling: true,\n\t\tmaxInputTokens: 111452,\n\t},\n\t\"gpt-4.1\": {\n\t\tcontextWindow: 128000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0,\n\t\toutputPrice: 0,\n\t\tfamily: \"gpt-4.1\",\n\t\tversion: \"gpt-4.1-2025-04-14\",\n\t\tname: \"GPT-4.1 (Preview)\",\n\t\tsupportsToolCalling: true,\n\t\tmaxInputTokens: 111452,\n\t},\n\t\"gpt-5-mini\": {\n\t\tcontextWindow: 128000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0,\n\t\toutputPrice: 0,\n\t\tfamily: \"gpt-5-mini\",\n\t\tversion: \"gpt-5-mini\",\n\t\tname: \"GPT-5 mini (Preview)\",\n\t\tsupportsToolCalling: true,\n\t\tmaxInputTokens: 108637,\n\t},\n\t\"gpt-5\": {\n\t\tcontextWindow: 128000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0,\n\t\toutputPrice: 0,\n\t\tfamily: \"gpt-5\",\n\t\tversion: \"gpt-5\",\n\t\tname: \"GPT-5 (Preview)\",\n\t\tsupportsToolCalling: true,\n\t\tmaxInputTokens: 108637,\n\t},\n} as const satisfies Record<\n\tstring,\n\tModelInfo & {\n\t\tfamily: string\n\t\tversion: string\n\t\tname: string\n\t\tsupportsToolCalling: boolean\n\t\tmaxInputTokens: number\n\t}\n>\n","import type { ModelInfo } from \"../model.js\"\n\n// https://docs.x.ai/docs/api-reference\nexport type XAIModelId = keyof typeof xaiModels\n\nexport const xaiDefaultModelId: XAIModelId = \"grok-4.20\"\n\nexport const xaiModels = {\n\t\"grok-4.20\": {\n\t\tmaxTokens: 65_536,\n\t\tcontextWindow: 2_000_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 2.0,\n\t\toutputPrice: 6.0,\n\t\tcacheWritesPrice: 0.5,\n\t\tcacheReadsPrice: 0.5,\n\t\tdescription: \"xAI's flagship Grok 4.20 model with 2M context and reasoning support via Responses API.\",\n\t\tincludedTools: [\"search_replace\"],\n\t\texcludedTools: [\"apply_diff\"],\n\t},\n\t\"grok-code-fast-1\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 256_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0.2,\n\t\toutputPrice: 1.5,\n\t\tcacheWritesPrice: 0.02,\n\t\tcacheReadsPrice: 0.02,\n\t\tdescription: \"xAI's Grok Code Fast model with 256K context window\",\n\t\tincludedTools: [\"search_replace\"],\n\t\texcludedTools: [\"apply_diff\"],\n\t},\n\t\"grok-4-1-fast-reasoning\": {\n\t\tmaxTokens: 65_536,\n\t\tcontextWindow: 2_000_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0.2,\n\t\toutputPrice: 0.5,\n\t\tcacheWritesPrice: 0.05,\n\t\tcacheReadsPrice: 0.05,\n\t\tdescription:\n\t\t\t\"xAI's Grok 4.1 Fast model with 2M context window, optimized for high-performance agentic tool calling with reasoning\",\n\t\tincludedTools: [\"search_replace\"],\n\t\texcludedTools: [\"apply_diff\"],\n\t},\n\t\"grok-4-1-fast-non-reasoning\": {\n\t\tmaxTokens: 65_536,\n\t\tcontextWindow: 2_000_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0.2,\n\t\toutputPrice: 0.5,\n\t\tcacheWritesPrice: 0.05,\n\t\tcacheReadsPrice: 0.05,\n\t\tdescription:\n\t\t\t\"xAI's Grok 4.1 Fast model with 2M context window, optimized for high-performance agentic tool calling\",\n\t\tincludedTools: [\"search_replace\"],\n\t\texcludedTools: [\"apply_diff\"],\n\t},\n\t\"grok-4-fast-reasoning\": {\n\t\tmaxTokens: 65_536,\n\t\tcontextWindow: 2_000_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0.2,\n\t\toutputPrice: 0.5,\n\t\tcacheWritesPrice: 0.05,\n\t\tcacheReadsPrice: 0.05,\n\t\tdescription:\n\t\t\t\"xAI's Grok 4 Fast model with 2M context window, optimized for high-performance agentic tool calling with reasoning\",\n\t\tincludedTools: [\"search_replace\"],\n\t\texcludedTools: [\"apply_diff\"],\n\t},\n\t\"grok-4-fast-non-reasoning\": {\n\t\tmaxTokens: 65_536,\n\t\tcontextWindow: 2_000_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0.2,\n\t\toutputPrice: 0.5,\n\t\tcacheWritesPrice: 0.05,\n\t\tcacheReadsPrice: 0.05,\n\t\tdescription:\n\t\t\t\"xAI's Grok 4 Fast model with 2M context window, optimized for high-performance agentic tool calling\",\n\t\tincludedTools: [\"search_replace\"],\n\t\texcludedTools: [\"apply_diff\"],\n\t},\n\t\"grok-4-0709\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 256_000,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 3.0,\n\t\toutputPrice: 15.0,\n\t\tcacheWritesPrice: 0.75,\n\t\tcacheReadsPrice: 0.75,\n\t\tdescription: \"xAI's Grok-4 model with 256K context window\",\n\t\tincludedTools: [\"search_replace\"],\n\t\texcludedTools: [\"apply_diff\"],\n\t},\n\t\"grok-3-mini\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 131072,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0.3,\n\t\toutputPrice: 0.5,\n\t\tcacheWritesPrice: 0.07,\n\t\tcacheReadsPrice: 0.07,\n\t\tdescription: \"xAI's Grok-3 mini model with 128K context window\",\n\t\tsupportsReasoningEffort: [\"low\", \"high\"],\n\t\treasoningEffort: \"low\",\n\t\tincludedTools: [\"search_replace\"],\n\t\texcludedTools: [\"apply_diff\"],\n\t},\n\t\"grok-3\": {\n\t\tmaxTokens: 8192,\n\t\tcontextWindow: 131072,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 3.0,\n\t\toutputPrice: 15.0,\n\t\tcacheWritesPrice: 0.75,\n\t\tcacheReadsPrice: 0.75,\n\t\tdescription: \"xAI's Grok-3 model with 128K context window\",\n\t\tincludedTools: [\"search_replace\"],\n\t\texcludedTools: [\"apply_diff\"],\n\t},\n} as const satisfies Record<string, ModelInfo>\n","import type { ModelInfo } from \"../model.js\"\n\n// https://ai-gateway.vercel.sh/v1/\nexport const vercelAiGatewayDefaultModelId = \"anthropic/claude-sonnet-4\"\n\nexport const VERCEL_AI_GATEWAY_PROMPT_CACHING_MODELS = new Set([\n\t\"anthropic/claude-3-haiku\",\n\t\"anthropic/claude-3-opus\",\n\t\"anthropic/claude-3.5-haiku\",\n\t\"anthropic/claude-3.5-sonnet\",\n\t\"anthropic/claude-3.7-sonnet\",\n\t\"anthropic/claude-opus-4\",\n\t\"anthropic/claude-opus-4.1\",\n\t\"anthropic/claude-opus-4.5\",\n\t\"anthropic/claude-opus-4.6\",\n\t\"anthropic/claude-sonnet-4\",\n\t\"anthropic/claude-sonnet-4.6\",\n\t\"openai/gpt-4.1\",\n\t\"openai/gpt-4.1-mini\",\n\t\"openai/gpt-4.1-nano\",\n\t\"openai/gpt-4o\",\n\t\"openai/gpt-4o-mini\",\n\t\"openai/gpt-5\",\n\t\"openai/gpt-5-mini\",\n\t\"openai/gpt-5-nano\",\n\t\"openai/o1\",\n\t\"openai/o3\",\n\t\"openai/o3-mini\",\n\t\"openai/o4-mini\",\n])\n\nexport const VERCEL_AI_GATEWAY_VISION_ONLY_MODELS = new Set([\n\t\"alibaba/qwen-3-14b\",\n\t\"alibaba/qwen-3-235b\",\n\t\"alibaba/qwen-3-30b\",\n\t\"alibaba/qwen-3-32b\",\n\t\"alibaba/qwen3-coder\",\n\t\"amazon/nova-pro\",\n\t\"anthropic/claude-3.5-haiku\",\n\t\"google/gemini-1.5-flash-8b\",\n\t\"google/gemini-2.0-flash-thinking\",\n\t\"google/gemma-3-27b\",\n\t\"mistral/devstral-small\",\n\t\"xai/grok-vision-beta\",\n])\n\nexport const VERCEL_AI_GATEWAY_VISION_AND_TOOLS_MODELS = new Set([\n\t\"amazon/nova-lite\",\n\t\"anthropic/claude-3-haiku\",\n\t\"anthropic/claude-3-opus\",\n\t\"anthropic/claude-3-sonnet\",\n\t\"anthropic/claude-3.5-sonnet\",\n\t\"anthropic/claude-3.7-sonnet\",\n\t\"anthropic/claude-opus-4\",\n\t\"anthropic/claude-opus-4.1\",\n\t\"anthropic/claude-opus-4.5\",\n\t\"anthropic/claude-opus-4.6\",\n\t\"anthropic/claude-sonnet-4\",\n\t\"anthropic/claude-sonnet-4.6\",\n\t\"google/gemini-1.5-flash\",\n\t\"google/gemini-1.5-pro\",\n\t\"google/gemini-2.0-flash\",\n\t\"google/gemini-2.0-flash-lite\",\n\t\"google/gemini-2.0-pro\",\n\t\"google/gemini-2.5-flash\",\n\t\"google/gemini-2.5-flash-lite\",\n\t\"google/gemini-2.5-pro\",\n\t\"google/gemini-exp\",\n\t\"meta/llama-3.2-11b\",\n\t\"meta/llama-3.2-90b\",\n\t\"meta/llama-3.3\",\n\t\"meta/llama-4-maverick\",\n\t\"meta/llama-4-scout\",\n\t\"mistral/pixtral-12b\",\n\t\"mistral/pixtral-large\",\n\t\"moonshotai/kimi-k2\",\n\t\"openai/gpt-4-turbo\",\n\t\"openai/gpt-4.1\",\n\t\"openai/gpt-4.1-mini\",\n\t\"openai/gpt-4.1-nano\",\n\t\"openai/gpt-4.5-preview\",\n\t\"openai/gpt-4o\",\n\t\"openai/gpt-4o-mini\",\n\t\"openai/gpt-oss-120b\",\n\t\"openai/gpt-oss-20b\",\n\t\"openai/o3\",\n\t\"openai/o3-pro\",\n\t\"openai/o4-mini\",\n\t\"vercel/v0-1.0-md\",\n\t\"xai/grok-2-vision\",\n\t\"zai/glm-4.5v\",\n])\n\nexport const vercelAiGatewayDefaultModelInfo: ModelInfo = {\n\tmaxTokens: 64000,\n\tcontextWindow: 200000,\n\tsupportsImages: true,\n\tsupportsPromptCache: true,\n\tinputPrice: 3,\n\toutputPrice: 15,\n\tcacheWritesPrice: 3.75,\n\tcacheReadsPrice: 0.3,\n\tdescription:\n\t\t\"Claude Sonnet 4 significantly improves on Sonnet 3.7's industry-leading capabilities, excelling in coding with a state-of-the-art 72.7% on SWE-bench. The model balances performance and efficiency for internal and external use cases, with enhanced steerability for greater control over implementations. While not matching Opus 4 in most domains, it delivers an optimal mix of capability and practicality.\",\n}\n\nexport const VERCEL_AI_GATEWAY_DEFAULT_TEMPERATURE = 0.7\n","import type { ModelInfo } from \"../model.js\"\nimport { ZaiApiLine } from \"../provider-settings.js\"\n\n// Z AI\n// https://docs.z.ai/guides/llm/glm-4-32b-0414-128k\n// https://docs.z.ai/guides/llm/glm-4.5\n// https://docs.z.ai/guides/llm/glm-4.6\n// https://docs.z.ai/guides/overview/pricing\n// https://bigmodel.cn/pricing\n\nexport type InternationalZAiModelId = keyof typeof internationalZAiModels\nexport const internationalZAiDefaultModelId: InternationalZAiModelId = \"glm-4.6\"\nexport const internationalZAiModels = {\n\t\"glm-4.5\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 131_072,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0.6,\n\t\toutputPrice: 2.2,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0.11,\n\t\tdescription:\n\t\t\t\"GLM-4.5 is Zhipu's latest featured model. Its comprehensive capabilities in reasoning, coding, and agent reach the state-of-the-art (SOTA) level among open-source models, with a context length of up to 128k.\",\n\t},\n\t\"glm-4.5-air\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 131_072,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0.2,\n\t\toutputPrice: 1.1,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0.03,\n\t\tdescription:\n\t\t\t\"GLM-4.5-Air is the lightweight version of GLM-4.5. It balances performance and cost-effectiveness, and can flexibly switch to hybrid thinking models.\",\n\t},\n\t\"glm-4.5-x\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 131_072,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 2.2,\n\t\toutputPrice: 8.9,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0.45,\n\t\tdescription:\n\t\t\t\"GLM-4.5-X is a high-performance variant optimized for strong reasoning with ultra-fast responses.\",\n\t},\n\t\"glm-4.5-airx\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 131_072,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 1.1,\n\t\toutputPrice: 4.5,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0.22,\n\t\tdescription: \"GLM-4.5-AirX is a lightweight, ultra-fast variant delivering strong performance with lower cost.\",\n\t},\n\t\"glm-4.5-flash\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 131_072,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0,\n\t\toutputPrice: 0,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0,\n\t\tdescription: \"GLM-4.5-Flash is a free, high-speed model excellent for reasoning, coding, and agentic tasks.\",\n\t},\n\t\"glm-4.5v\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 131_072,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0.6,\n\t\toutputPrice: 1.8,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0.11,\n\t\tdescription:\n\t\t\t\"GLM-4.5V is Z.AI's multimodal visual reasoning model (image/video/text/file input), optimized for GUI tasks, grounding, and document/video understanding.\",\n\t},\n\t\"glm-4.6v\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 131_072,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0.3,\n\t\toutputPrice: 0.9,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0.05,\n\t\tdescription:\n\t\t\t\"GLM-4.6V is an advanced multimodal vision model with improved performance and cost-efficiency for visual understanding tasks.\",\n\t},\n\t\"glm-4.6\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0.6,\n\t\toutputPrice: 2.2,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0.11,\n\t\tdescription:\n\t\t\t\"GLM-4.6 is Zhipu's newest model with an extended context window of up to 200k tokens, providing enhanced capabilities for processing longer documents and conversations.\",\n\t},\n\t\"glm-4.7\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningEffort: [\"disable\", \"medium\"],\n\t\treasoningEffort: \"medium\",\n\t\tpreserveReasoning: true,\n\t\tinputPrice: 0.6,\n\t\toutputPrice: 2.2,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0.11,\n\t\tdescription:\n\t\t\t\"GLM-4.7 is Zhipu's latest model with built-in thinking capabilities enabled by default. It provides enhanced reasoning for complex tasks while maintaining fast response times.\",\n\t},\n\t\"glm-5\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 202_752,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningEffort: [\"disable\", \"medium\"],\n\t\treasoningEffort: \"medium\",\n\t\tpreserveReasoning: true,\n\t\tinputPrice: 0.6,\n\t\toutputPrice: 2.2,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0.11,\n\t\tdescription:\n\t\t\t\"GLM-5 is Zhipu's next-generation model with a 202k context window and built-in thinking capabilities. It delivers state-of-the-art reasoning, coding, and agentic performance.\",\n\t},\n\t\"glm-4.7-flash\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0,\n\t\toutputPrice: 0,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0,\n\t\tdescription:\n\t\t\t\"GLM-4.7-Flash is a free, high-speed variant of GLM-4.7 offering fast responses for reasoning and coding tasks.\",\n\t},\n\t\"glm-4.7-flashx\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 200_000,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0.07,\n\t\toutputPrice: 0.4,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0.01,\n\t\tdescription:\n\t\t\t\"GLM-4.7-FlashX is an ultra-fast variant of GLM-4.7 with exceptional speed and cost-effectiveness for high-throughput applications.\",\n\t},\n\t\"glm-4.6v-flash\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 131_072,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0,\n\t\toutputPrice: 0,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0,\n\t\tdescription:\n\t\t\t\"GLM-4.6V-Flash is a free, high-speed multimodal vision model for rapid image understanding and visual reasoning tasks.\",\n\t},\n\t\"glm-4.6v-flashx\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 131_072,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0.04,\n\t\toutputPrice: 0.4,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0.004,\n\t\tdescription:\n\t\t\t\"GLM-4.6V-FlashX is an ultra-fast multimodal vision model optimized for high-speed visual processing at low cost.\",\n\t},\n\t\"glm-4-32b-0414-128k\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 131_072,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: false,\n\t\tinputPrice: 0.1,\n\t\toutputPrice: 0.1,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0,\n\t\tdescription: \"GLM-4-32B is a 32 billion parameter model with 128k context length, optimized for efficiency.\",\n\t},\n} as const satisfies Record<string, ModelInfo>\n\nexport type MainlandZAiModelId = keyof typeof mainlandZAiModels\nexport const mainlandZAiDefaultModelId: MainlandZAiModelId = \"glm-4.6\"\nexport const mainlandZAiModels = {\n\t\"glm-4.5\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 131_072,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0.29,\n\t\toutputPrice: 1.14,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0.057,\n\t\tdescription:\n\t\t\t\"GLM-4.5 is Zhipu's latest featured model. Its comprehensive capabilities in reasoning, coding, and agent reach the state-of-the-art (SOTA) level among open-source models, with a context length of up to 128k.\",\n\t},\n\t\"glm-4.5-air\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 131_072,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0.1,\n\t\toutputPrice: 0.6,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0.02,\n\t\tdescription:\n\t\t\t\"GLM-4.5-Air is the lightweight version of GLM-4.5. It balances performance and cost-effectiveness, and can flexibly switch to hybrid thinking models.\",\n\t},\n\t\"glm-4.5-x\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 131_072,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0.29,\n\t\toutputPrice: 1.14,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0.057,\n\t\tdescription:\n\t\t\t\"GLM-4.5-X is a high-performance variant optimized for strong reasoning with ultra-fast responses.\",\n\t},\n\t\"glm-4.5-airx\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 131_072,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0.1,\n\t\toutputPrice: 0.6,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0.02,\n\t\tdescription: \"GLM-4.5-AirX is a lightweight, ultra-fast variant delivering strong performance with lower cost.\",\n\t},\n\t\"glm-4.5-flash\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 131_072,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0,\n\t\toutputPrice: 0,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0,\n\t\tdescription: \"GLM-4.5-Flash is a free, high-speed model excellent for reasoning, coding, and agentic tasks.\",\n\t},\n\t\"glm-4.5v\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 131_072,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0.29,\n\t\toutputPrice: 0.93,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0.057,\n\t\tdescription:\n\t\t\t\"GLM-4.5V is Z.AI's multimodal visual reasoning model (image/video/text/file input), optimized for GUI tasks, grounding, and document/video understanding.\",\n\t},\n\t\"glm-4.6\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 204_800,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0.29,\n\t\toutputPrice: 1.14,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0.057,\n\t\tdescription:\n\t\t\t\"GLM-4.6 is Zhipu's newest model with an extended context window of up to 200k tokens, providing enhanced capabilities for processing longer documents and conversations.\",\n\t},\n\t\"glm-4.7\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 204_800,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningEffort: [\"disable\", \"medium\"],\n\t\treasoningEffort: \"medium\",\n\t\tpreserveReasoning: true,\n\t\tinputPrice: 0.29,\n\t\toutputPrice: 1.14,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0.057,\n\t\tdescription:\n\t\t\t\"GLM-4.7 is Zhipu's latest model with built-in thinking capabilities enabled by default. It provides enhanced reasoning for complex tasks while maintaining fast response times.\",\n\t},\n\t\"glm-5\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 202_752,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tsupportsReasoningEffort: [\"disable\", \"medium\"],\n\t\treasoningEffort: \"medium\",\n\t\tpreserveReasoning: true,\n\t\tinputPrice: 0.29,\n\t\toutputPrice: 1.14,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0.057,\n\t\tdescription:\n\t\t\t\"GLM-5 is Zhipu's next-generation model with a 202k context window and built-in thinking capabilities. It delivers state-of-the-art reasoning, coding, and agentic performance.\",\n\t},\n\t\"glm-4.7-flash\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 204_800,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0,\n\t\toutputPrice: 0,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0,\n\t\tdescription:\n\t\t\t\"GLM-4.7-Flash is a free, high-speed variant of GLM-4.7 offering fast responses for reasoning and coding tasks.\",\n\t},\n\t\"glm-4.7-flashx\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 204_800,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0.035,\n\t\toutputPrice: 0.2,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0.005,\n\t\tdescription:\n\t\t\t\"GLM-4.7-FlashX is an ultra-fast variant of GLM-4.7 with exceptional speed and cost-effectiveness for high-throughput applications.\",\n\t},\n\t\"glm-4.6v\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 131_072,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0.15,\n\t\toutputPrice: 0.45,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0.025,\n\t\tdescription:\n\t\t\t\"GLM-4.6V is an advanced multimodal vision model with improved performance and cost-efficiency for visual understanding tasks.\",\n\t},\n\t\"glm-4.6v-flash\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 131_072,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0,\n\t\toutputPrice: 0,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0,\n\t\tdescription:\n\t\t\t\"GLM-4.6V-Flash is a free, high-speed multimodal vision model for rapid image understanding and visual reasoning tasks.\",\n\t},\n\t\"glm-4.6v-flashx\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 131_072,\n\t\tsupportsImages: true,\n\t\tsupportsPromptCache: true,\n\t\tinputPrice: 0.02,\n\t\toutputPrice: 0.2,\n\t\tcacheWritesPrice: 0,\n\t\tcacheReadsPrice: 0.002,\n\t\tdescription:\n\t\t\t\"GLM-4.6V-FlashX is an ultra-fast multimodal vision model optimized for high-speed visual processing at low cost.\",\n\t},\n} as const satisfies Record<string, ModelInfo>\n\nexport const ZAI_DEFAULT_TEMPERATURE = 0.6\n\nexport const zaiApiLineConfigs = {\n\tinternational_coding: {\n\t\tname: \"International Coding\",\n\t\tbaseUrl: \"https://api.z.ai/api/coding/paas/v4\",\n\t\tisChina: false,\n\t},\n\tchina_coding: {\n\t\tname: \"China Coding\",\n\t\tbaseUrl: \"https://open.bigmodel.cn/api/coding/paas/v4\",\n\t\tisChina: true,\n\t},\n\tinternational_api: {\n\t\tname: \"International API\",\n\t\tbaseUrl: \"https://api.z.ai/api/paas/v4\",\n\t\tisChina: false,\n\t},\n\tchina_api: {\n\t\tname: \"China API\",\n\t\tbaseUrl: \"https://open.bigmodel.cn/api/paas/v4\",\n\t\tisChina: true,\n\t},\n} satisfies Record<ZaiApiLine, { name: string; baseUrl: string; isChina: boolean }>\n","import type { ModelInfo } from \"../model.js\"\n\n// Minimax\n// https://platform.minimax.io/docs/guides/models-intro\n// https://platform.minimax.io/docs/guides/pricing-paygo\n// https://platform.minimax.io/docs/guides/pricing-tokenplan\nexport type MinimaxModelId = keyof typeof minimaxModels\nexport const minimaxDefaultModelId: MinimaxModelId = \"MiniMax-M2.7\"\n\nexport const minimaxModels = {\n\t\"MiniMax-M2.5\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 204_800,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tincludedTools: [\"search_and_replace\"],\n\t\texcludedTools: [\"apply_diff\"],\n\t\tpreserveReasoning: true,\n\t\tinputPrice: 0.3,\n\t\toutputPrice: 1.2,\n\t\tcacheWritesPrice: 0.375,\n\t\tcacheReadsPrice: 0.03,\n\t\tdescription:\n\t\t\t\"MiniMax M2.5, the latest MiniMax model with enhanced coding and agentic capabilities, building on the strengths of the M2 series. See pricing at https://platform.minimax.io/docs/guides/pricing-paygo. Note: When using TokenPlan, usage is billed per request, not per token.\",\n\t},\n\t\"MiniMax-M2.5-highspeed\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 204_800,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tincludedTools: [\"search_and_replace\"],\n\t\texcludedTools: [\"apply_diff\"],\n\t\tpreserveReasoning: true,\n\t\tinputPrice: 0.6,\n\t\toutputPrice: 2.4,\n\t\tcacheWritesPrice: 0.375,\n\t\tcacheReadsPrice: 0.03,\n\t\tdescription:\n\t\t\t\"MiniMax M2.5 highspeed: same performance as M2.5 but with faster response (approximately 100 tps vs 60 tps). See pricing at https://platform.minimax.io/docs/guides/pricing-paygo. Requires TokenPlan High-Speed subscription for use with TokenPlan keys. Note: When using TokenPlan, usage is billed per request, not per token.\",\n\t},\n\t\"MiniMax-M2.7\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 204_800,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tincludedTools: [\"search_and_replace\"],\n\t\texcludedTools: [\"apply_diff\"],\n\t\tpreserveReasoning: true,\n\t\tinputPrice: 0.3,\n\t\toutputPrice: 1.2,\n\t\tcacheWritesPrice: 0.375,\n\t\tcacheReadsPrice: 0.06,\n\t\tdescription:\n\t\t\t\"MiniMax M2.7, the latest MiniMax model with recursive self-improvement capabilities. See pricing at https://platform.minimax.io/docs/guides/pricing-paygo. Note: When using TokenPlan, usage is billed per request, not per token.\",\n\t},\n\t\"MiniMax-M2.7-highspeed\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 204_800,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tincludedTools: [\"search_and_replace\"],\n\t\texcludedTools: [\"apply_diff\"],\n\t\tpreserveReasoning: true,\n\t\tinputPrice: 0.6,\n\t\toutputPrice: 2.4,\n\t\tcacheWritesPrice: 0.375,\n\t\tcacheReadsPrice: 0.06,\n\t\tdescription:\n\t\t\t\"MiniMax M2.7 highspeed: same performance as M2.7 but with faster response (approximately 100 tps vs 60 tps). See pricing at https://platform.minimax.io/docs/guides/pricing-paygo. Requires TokenPlan High-Speed subscription for use with TokenPlan keys. Note: When using TokenPlan, usage is billed per request, not per token.\",\n\t},\n\t\"MiniMax-M2\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 204_800,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tincludedTools: [\"search_and_replace\"],\n\t\texcludedTools: [\"apply_diff\"],\n\t\tpreserveReasoning: true,\n\t\tinputPrice: 0.3,\n\t\toutputPrice: 1.2,\n\t\tcacheWritesPrice: 0.375,\n\t\tcacheReadsPrice: 0.03,\n\t\tdescription:\n\t\t\t\"MiniMax M2, a model born for Agents and code, featuring Top-tier Coding Capabilities, Powerful Agentic Performance, and Ultimate Cost-Effectiveness & Speed. See pricing at https://platform.minimax.io/docs/guides/pricing-paygo. Note: When using TokenPlan, usage is billed per request, not per token.\",\n\t},\n\t\"MiniMax-M2-Stable\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 204_800,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tincludedTools: [\"search_and_replace\"],\n\t\texcludedTools: [\"apply_diff\"],\n\t\tpreserveReasoning: true,\n\t\tinputPrice: 0.3,\n\t\toutputPrice: 1.2,\n\t\tcacheWritesPrice: 0.375,\n\t\tcacheReadsPrice: 0.03,\n\t\tdescription:\n\t\t\t\"MiniMax M2 Stable (High Concurrency, Commercial Use), a model born for Agents and code, featuring Top-tier Coding Capabilities, Powerful Agentic Performance, and Ultimate Cost-Effectiveness & Speed. See pricing at https://platform.minimax.io/docs/guides/pricing-paygo. Note: When using TokenPlan, usage is billed per request, not per token.\",\n\t},\n\t\"MiniMax-M2.1\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 204_800,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tincludedTools: [\"search_and_replace\"],\n\t\texcludedTools: [\"apply_diff\"],\n\t\tpreserveReasoning: true,\n\t\tinputPrice: 0.3,\n\t\toutputPrice: 1.2,\n\t\tcacheWritesPrice: 0.375,\n\t\tcacheReadsPrice: 0.03,\n\t\tdescription:\n\t\t\t\"MiniMax M2.1 builds on M2 with improved overall performance for agentic coding tasks and significantly faster response times. See pricing at https://platform.minimax.io/docs/guides/pricing-paygo. Note: When using TokenPlan, usage is billed per request, not per token.\",\n\t},\n\t\"MiniMax-M2.1-highspeed\": {\n\t\tmaxTokens: 16_384,\n\t\tcontextWindow: 204_800,\n\t\tsupportsImages: false,\n\t\tsupportsPromptCache: true,\n\t\tincludedTools: [\"search_and_replace\"],\n\t\texcludedTools: [\"apply_diff\"],\n\t\tpreserveReasoning: true,\n\t\tinputPrice: 0.6,\n\t\toutputPrice: 2.4,\n\t\tcacheWritesPrice: 0.375,\n\t\tcacheReadsPrice: 0.03,\n\t\tdescription:\n\t\t\t\"MiniMax M2.1 highspeed: same performance as M2.1 but with faster response (approximately 100 tps vs 60 tps). See pricing at https://platform.minimax.io/docs/guides/pricing-paygo. Requires TokenPlan High-Speed subscription for use with TokenPlan keys. Note: When using TokenPlan, usage is billed per request, not per token.\",\n\t},\n} as const satisfies Record<string, ModelInfo>\n\nexport const minimaxDefaultModelInfo: ModelInfo = minimaxModels[minimaxDefaultModelId]\n\nexport const MINIMAX_DEFAULT_MAX_TOKENS = 16_384\nexport const MINIMAX_DEFAULT_TEMPERATURE = 1.0\n","export * from \"./anthropic.js\"\nexport * from \"./baseten.js\"\nexport * from \"./bedrock.js\"\nexport * from \"./deepseek.js\"\nexport * from \"./fireworks.js\"\nexport * from \"./gemini.js\"\nexport * from \"./lite-llm.js\"\nexport * from \"./lm-studio.js\"\nexport * from \"./mistral.js\"\nexport * from \"./moonshot.js\"\nexport * from \"./ollama.js\"\nexport * from \"./openai.js\"\nexport * from \"./openai-codex.js\"\nexport * from \"./openai-codex-rate-limits.js\"\nexport * from \"./openrouter.js\"\nexport * from \"./poe.js\"\nexport * from \"./qwen-code.js\"\nexport * from \"./requesty.js\"\nexport * from \"./sambanova.js\"\nexport * from \"./unbound.js\"\nexport * from \"./vertex.js\"\nexport * from \"./vscode-llm.js\"\nexport * from \"./xai.js\"\nexport * from \"./vercel-ai-gateway.js\"\nexport * from \"./zai.js\"\nexport * from \"./minimax.js\"\n\nimport { anthropicDefaultModelId } from \"./anthropic.js\"\nimport { basetenDefaultModelId } from \"./baseten.js\"\nimport { bedrockDefaultModelId } from \"./bedrock.js\"\nimport { deepSeekDefaultModelId } from \"./deepseek.js\"\nimport { fireworksDefaultModelId } from \"./fireworks.js\"\nimport { geminiDefaultModelId } from \"./gemini.js\"\nimport { litellmDefaultModelId } from \"./lite-llm.js\"\nimport { mistralDefaultModelId } from \"./mistral.js\"\nimport { moonshotDefaultModelId } from \"./moonshot.js\"\nimport { openAiCodexDefaultModelId } from \"./openai-codex.js\"\nimport { openRouterDefaultModelId } from \"./openrouter.js\"\nimport { poeDefaultModelId } from \"./poe.js\"\nimport { qwenCodeDefaultModelId } from \"./qwen-code.js\"\nimport { requestyDefaultModelId } from \"./requesty.js\"\nimport { sambaNovaDefaultModelId } from \"./sambanova.js\"\nimport { unboundDefaultModelId } from \"./unbound.js\"\nimport { vertexDefaultModelId } from \"./vertex.js\"\nimport { vscodeLlmDefaultModelId } from \"./vscode-llm.js\"\nimport { xaiDefaultModelId } from \"./xai.js\"\nimport { vercelAiGatewayDefaultModelId } from \"./vercel-ai-gateway.js\"\nimport { internationalZAiDefaultModelId, mainlandZAiDefaultModelId } from \"./zai.js\"\nimport { minimaxDefaultModelId } from \"./minimax.js\"\n\n// Import the ProviderName type from provider-settings to avoid duplication\nimport type { ProviderName } from \"../provider-settings.js\"\n\n/**\n * Get the default model ID for a given provider.\n * This function returns only the provider's default model ID, without considering user configuration.\n * Used as a fallback when provider models are still loading.\n */\nexport function getProviderDefaultModelId(\n\tprovider: ProviderName,\n\toptions: { isChina?: boolean } = { isChina: false },\n): string {\n\tswitch (provider) {\n\t\tcase \"openrouter\":\n\t\t\treturn openRouterDefaultModelId\n\t\tcase \"requesty\":\n\t\t\treturn requestyDefaultModelId\n\t\tcase \"litellm\":\n\t\t\treturn litellmDefaultModelId\n\t\tcase \"xai\":\n\t\t\treturn xaiDefaultModelId\n\t\tcase \"baseten\":\n\t\t\treturn basetenDefaultModelId\n\t\tcase \"bedrock\":\n\t\t\treturn bedrockDefaultModelId\n\t\tcase \"vertex\":\n\t\t\treturn vertexDefaultModelId\n\t\tcase \"gemini\":\n\t\t\treturn geminiDefaultModelId\n\t\tcase \"deepseek\":\n\t\t\treturn deepSeekDefaultModelId\n\t\tcase \"moonshot\":\n\t\t\treturn moonshotDefaultModelId\n\t\tcase \"minimax\":\n\t\t\treturn minimaxDefaultModelId\n\t\tcase \"zai\":\n\t\t\treturn options?.isChina ? mainlandZAiDefaultModelId : internationalZAiDefaultModelId\n\t\tcase \"openai-native\":\n\t\t\treturn \"gpt-4o\" // Based on openai-native patterns\n\t\tcase \"openai-codex\":\n\t\t\treturn openAiCodexDefaultModelId\n\t\tcase \"mistral\":\n\t\t\treturn mistralDefaultModelId\n\t\tcase \"openai\":\n\t\t\treturn \"\" // OpenAI provider uses custom model configuration\n\t\tcase \"ollama\":\n\t\t\treturn \"\" // Ollama uses dynamic model selection\n\t\tcase \"lmstudio\":\n\t\t\treturn \"\" // LMStudio uses dynamic model selection\n\t\tcase \"vscode-lm\":\n\t\t\treturn vscodeLlmDefaultModelId\n\t\tcase \"sambanova\":\n\t\t\treturn sambaNovaDefaultModelId\n\t\tcase \"fireworks\":\n\t\t\treturn fireworksDefaultModelId\n\t\tcase \"qwen-code\":\n\t\t\treturn qwenCodeDefaultModelId\n\t\tcase \"poe\":\n\t\t\treturn poeDefaultModelId\n\t\tcase \"unbound\":\n\t\t\treturn unboundDefaultModelId\n\t\tcase \"vercel-ai-gateway\":\n\t\t\treturn vercelAiGatewayDefaultModelId\n\t\tcase \"anthropic\":\n\t\tcase \"gemini-cli\":\n\t\tcase \"fake-ai\":\n\t\tdefault:\n\t\t\treturn anthropicDefaultModelId\n\t}\n}\n","import { z } from \"zod\"\n\nimport { modelInfoSchema, reasoningEffortSettingSchema, verbosityLevelsSchema, serviceTierSchema } from \"./model.js\"\nimport { codebaseIndexProviderSchema } from \"./codebase-index.js\"\nimport {\n\tanthropicModels,\n\tbasetenModels,\n\tbedrockModels,\n\tdeepSeekModels,\n\tfireworksModels,\n\tgeminiModels,\n\tmistralModels,\n\tmoonshotModels,\n\topenAiCodexModels,\n\topenAiNativeModels,\n\tqwenCodeModels,\n\tsambaNovaModels,\n\tvertexModels,\n\tvscodeLlmModels,\n\txaiModels,\n\tinternationalZAiModels,\n\tminimaxModels,\n} from \"./providers/index.js\"\n\n/**\n * constants\n */\n\nexport const DEFAULT_CONSECUTIVE_MISTAKE_LIMIT = 3\n\n/**\n * DynamicProvider\n *\n * Dynamic provider requires external API calls in order to get the model list.\n */\n\nexport const dynamicProviders = [\"openrouter\", \"vercel-ai-gateway\", \"litellm\", \"requesty\", \"unbound\", \"poe\"] as const\n\nexport type DynamicProvider = (typeof dynamicProviders)[number]\n\nexport const isDynamicProvider = (key: string): key is DynamicProvider =>\n\tdynamicProviders.includes(key as DynamicProvider)\n\n/**\n * LocalProvider\n *\n * Local providers require localhost API calls in order to get the model list.\n */\n\nexport const localProviders = [\"ollama\", \"lmstudio\"] as const\n\nexport type LocalProvider = (typeof localProviders)[number]\n\nexport const isLocalProvider = (key: string): key is LocalProvider => localProviders.includes(key as LocalProvider)\n\n/**\n * InternalProvider\n *\n * Internal providers require internal VSCode API calls in order to get the\n * model list.\n */\n\nexport const internalProviders = [\"vscode-lm\"] as const\n\nexport type InternalProvider = (typeof internalProviders)[number]\n\nexport const isInternalProvider = (key: string): key is InternalProvider =>\n\tinternalProviders.includes(key as InternalProvider)\n\n/**\n * CustomProvider\n *\n * Custom providers are completely configurable within Roo Code settings.\n */\n\nexport const customProviders = [\"openai\"] as const\n\nexport type CustomProvider = (typeof customProviders)[number]\n\nexport const isCustomProvider = (key: string): key is CustomProvider => customProviders.includes(key as CustomProvider)\n\n/**\n * FauxProvider\n *\n * Faux providers do not make external inference calls and therefore do not have\n * model lists.\n */\n\nexport const fauxProviders = [\"fake-ai\"] as const\n\nexport type FauxProvider = (typeof fauxProviders)[number]\n\nexport const isFauxProvider = (key: string): key is FauxProvider => fauxProviders.includes(key as FauxProvider)\n\n/**\n * ProviderName\n */\n\nexport const providerNames = [\n\t...dynamicProviders,\n\t...localProviders,\n\t...internalProviders,\n\t...customProviders,\n\t...fauxProviders,\n\t\"anthropic\",\n\t\"bedrock\",\n\t\"baseten\",\n\t\"deepseek\",\n\t\"fireworks\",\n\t\"gemini\",\n\t\"gemini-cli\",\n\t\"mistral\",\n\t\"moonshot\",\n\t\"minimax\",\n\t\"openai-codex\",\n\t\"openai-native\",\n\t\"qwen-code\",\n\t\"sambanova\",\n\t\"vertex\",\n\t\"xai\",\n\t\"zai\",\n] as const\n\nexport const providerNamesSchema = z.enum(providerNames)\n\nexport type ProviderName = z.infer<typeof providerNamesSchema>\n\nexport const isProviderName = (key: unknown): key is ProviderName =>\n\ttypeof key === \"string\" && providerNames.includes(key as ProviderName)\n\n/**\n * RetiredProviderName\n */\n\nexport const retiredProviderNames = [\n\t\"cerebras\",\n\t\"chutes\",\n\t\"deepinfra\",\n\t\"doubao\",\n\t\"featherless\",\n\t\"groq\",\n\t\"huggingface\",\n\t\"io-intelligence\",\n\t\"roo\",\n] as const\n\nexport const retiredProviderNamesSchema = z.enum(retiredProviderNames)\n\nexport type RetiredProviderName = z.infer<typeof retiredProviderNamesSchema>\n\nexport const isRetiredProvider = (value: string): value is RetiredProviderName =>\n\tretiredProviderNames.includes(value as RetiredProviderName)\n\nexport const providerNamesWithRetiredSchema = z.union([providerNamesSchema, retiredProviderNamesSchema])\n\nexport type ProviderNameWithRetired = z.infer<typeof providerNamesWithRetiredSchema>\n\n/**\n * ProviderSettingsEntry\n */\n\nexport const providerSettingsEntrySchema = z.object({\n\tid: z.string(),\n\tname: z.string(),\n\tapiProvider: providerNamesWithRetiredSchema.optional(),\n\tmodelId: z.string().optional(),\n})\n\nexport type ProviderSettingsEntry = z.infer<typeof providerSettingsEntrySchema>\n\n/**\n * ProviderSettings\n */\n\nconst baseProviderSettingsSchema = z.object({\n\tincludeMaxTokens: z.boolean().optional(),\n\ttodoListEnabled: z.boolean().optional(),\n\tmodelTemperature: z.number().nullish(),\n\trateLimitSeconds: z.number().optional(),\n\tconsecutiveMistakeLimit: z.number().min(0).optional(),\n\n\t// Model reasoning.\n\tenableReasoningEffort: z.boolean().optional(),\n\treasoningEffort: reasoningEffortSettingSchema.optional(),\n\tmodelMaxTokens: z.number().optional(),\n\tmodelMaxThinkingTokens: z.number().optional(),\n\n\t// Model verbosity.\n\tverbosity: verbosityLevelsSchema.optional(),\n})\n\n// Several of the providers share common model config properties.\nconst apiModelIdProviderModelSchema = baseProviderSettingsSchema.extend({\n\tapiModelId: z.string().optional(),\n})\n\nconst anthropicSchema = apiModelIdProviderModelSchema.extend({\n\tapiKey: z.string().optional(),\n\tanthropicBaseUrl: z.string().optional(),\n\tanthropicUseAuthToken: z.boolean().optional(),\n\tanthropicBeta1MContext: z.boolean().optional(), // Enable 'context-1m-2025-08-07' beta for 1M context window.\n})\n\nconst openRouterSchema = baseProviderSettingsSchema.extend({\n\topenRouterApiKey: z.string().optional(),\n\topenRouterModelId: z.string().optional(),\n\topenRouterBaseUrl: z.string().optional(),\n\topenRouterSpecificProvider: z.string().optional(),\n})\n\nconst bedrockSchema = apiModelIdProviderModelSchema.extend({\n\tawsAccessKey: z.string().optional(),\n\tawsSecretKey: z.string().optional(),\n\tawsSessionToken: z.string().optional(),\n\tawsRegion: z.string().optional(),\n\tawsUseCrossRegionInference: z.boolean().optional(),\n\tawsUseGlobalInference: z.boolean().optional(), // Enable Global Inference profile routing when supported\n\tawsUsePromptCache: z.boolean().optional(),\n\tawsProfile: z.string().optional(),\n\tawsUseProfile: z.boolean().optional(),\n\tawsApiKey: z.string().optional(),\n\tawsUseApiKey: z.boolean().optional(),\n\tawsCustomArn: z.string().optional(),\n\tawsModelContextWindow: z.number().optional(),\n\tawsBedrockEndpointEnabled: z.boolean().optional(),\n\tawsBedrockEndpoint: z.string().optional(),\n\tawsBedrock1MContext: z.boolean().optional(), // Enable 'context-1m-2025-08-07' beta for 1M context window.\n\tawsBedrockServiceTier: z.enum([\"STANDARD\", \"FLEX\", \"PRIORITY\"]).optional(), // AWS Bedrock service tier selection\n})\n\nconst vertexSchema = apiModelIdProviderModelSchema.extend({\n\tvertexKeyFile: z.string().optional(),\n\tvertexJsonCredentials: z.string().optional(),\n\tvertexProjectId: z.string().optional(),\n\tvertexRegion: z.string().optional(),\n\tvertex1MContext: z.boolean().optional(), // Enable 'context-1m-2025-08-07' beta for 1M context window.\n})\n\nconst openAiSchema = baseProviderSettingsSchema.extend({\n\topenAiBaseUrl: z.string().optional(),\n\topenAiApiKey: z.string().optional(),\n\topenAiR1FormatEnabled: z.boolean().optional(),\n\topenAiModelId: z.string().optional(),\n\topenAiCustomModelInfo: modelInfoSchema.nullish(),\n\topenAiUseAzure: z.boolean().optional(),\n\tazureApiVersion: z.string().optional(),\n\topenAiStreamingEnabled: z.boolean().optional(),\n\topenAiHostHeader: z.string().optional(), // Keep temporarily for backward compatibility during migration.\n\topenAiHeaders: z.record(z.string(), z.string()).optional(),\n})\n\nconst ollamaSchema = baseProviderSettingsSchema.extend({\n\tollamaModelId: z.string().optional(),\n\tollamaBaseUrl: z.string().optional(),\n\tollamaApiKey: z.string().optional(),\n\tollamaNumCtx: z.number().int().min(128).optional(),\n})\n\nconst vsCodeLmSchema = baseProviderSettingsSchema.extend({\n\tvsCodeLmModelSelector: z\n\t\t.object({\n\t\t\tvendor: z.string().optional(),\n\t\t\tfamily: z.string().optional(),\n\t\t\tversion: z.string().optional(),\n\t\t\tid: z.string().optional(),\n\t\t})\n\t\t.optional(),\n})\n\nconst lmStudioSchema = baseProviderSettingsSchema.extend({\n\tlmStudioModelId: z.string().optional(),\n\tlmStudioBaseUrl: z.string().optional(),\n\tlmStudioDraftModelId: z.string().optional(),\n\tlmStudioSpeculativeDecodingEnabled: z.boolean().optional(),\n})\n\nconst geminiSchema = apiModelIdProviderModelSchema.extend({\n\tgeminiApiKey: z.string().optional(),\n\tgoogleGeminiBaseUrl: z.string().optional(),\n})\n\nconst geminiCliSchema = apiModelIdProviderModelSchema.extend({\n\tgeminiCliOAuthPath: z.string().optional(),\n\tgeminiCliProjectId: z.string().optional(),\n})\n\nconst openAiCodexSchema = apiModelIdProviderModelSchema.extend({\n\t// No additional settings needed - uses OAuth authentication\n})\n\nconst openAiNativeSchema = apiModelIdProviderModelSchema.extend({\n\topenAiNativeApiKey: z.string().optional(),\n\topenAiNativeBaseUrl: z.string().optional(),\n\t// OpenAI Responses API service tier for openai-native provider only.\n\t// UI should only expose this when the selected model supports flex/priority.\n\topenAiNativeServiceTier: serviceTierSchema.optional(),\n})\n\nconst mistralSchema = apiModelIdProviderModelSchema.extend({\n\tmistralApiKey: z.string().optional(),\n\tmistralCodestralUrl: z.string().optional(),\n})\n\nconst deepSeekSchema = apiModelIdProviderModelSchema.extend({\n\tdeepSeekBaseUrl: z.string().optional(),\n\tdeepSeekApiKey: z.string().optional(),\n})\n\nconst poeSchema = apiModelIdProviderModelSchema.extend({\n\tpoeApiKey: z.string().optional(),\n\tpoeBaseUrl: z.string().optional(),\n})\n\nconst moonshotSchema = apiModelIdProviderModelSchema.extend({\n\tmoonshotBaseUrl: z\n\t\t.union([z.literal(\"https://api.moonshot.ai/v1\"), z.literal(\"https://api.moonshot.cn/v1\")])\n\t\t.optional(),\n\tmoonshotApiKey: z.string().optional(),\n})\n\nconst minimaxSchema = apiModelIdProviderModelSchema.extend({\n\tminimaxBaseUrl: z\n\t\t.union([z.literal(\"https://api.minimax.io/v1\"), z.literal(\"https://api.minimaxi.com/v1\")])\n\t\t.optional(),\n\tminimaxApiKey: z.string().optional(),\n})\n\nconst requestySchema = baseProviderSettingsSchema.extend({\n\trequestyBaseUrl: z.string().optional(),\n\trequestyApiKey: z.string().optional(),\n\trequestyModelId: z.string().optional(),\n})\n\nconst unboundSchema = baseProviderSettingsSchema.extend({\n\tunboundApiKey: z.string().optional(),\n\tunboundModelId: z.string().optional(),\n})\n\nconst fakeAiSchema = baseProviderSettingsSchema.extend({\n\tfakeAi: z.unknown().optional(),\n})\n\nconst xaiSchema = apiModelIdProviderModelSchema.extend({\n\txaiApiKey: z.string().optional(),\n})\n\nconst litellmSchema = baseProviderSettingsSchema.extend({\n\tlitellmBaseUrl: z.string().optional(),\n\tlitellmApiKey: z.string().optional(),\n\tlitellmModelId: z.string().optional(),\n\tlitellmUsePromptCache: z.boolean().optional(),\n})\n\nconst sambaNovaSchema = apiModelIdProviderModelSchema.extend({\n\tsambaNovaApiKey: z.string().optional(),\n})\n\nexport const zaiApiLineSchema = z.enum([\"international_coding\", \"china_coding\", \"international_api\", \"china_api\"])\n\nexport type ZaiApiLine = z.infer<typeof zaiApiLineSchema>\n\nconst zaiSchema = apiModelIdProviderModelSchema.extend({\n\tzaiApiKey: z.string().optional(),\n\tzaiApiLine: zaiApiLineSchema.optional(),\n})\n\nconst fireworksSchema = apiModelIdProviderModelSchema.extend({\n\tfireworksApiKey: z.string().optional(),\n})\n\nconst qwenCodeSchema = apiModelIdProviderModelSchema.extend({\n\tqwenCodeOauthPath: z.string().optional(),\n})\n\nconst vercelAiGatewaySchema = baseProviderSettingsSchema.extend({\n\tvercelAiGatewayApiKey: z.string().optional(),\n\tvercelAiGatewayModelId: z.string().optional(),\n})\n\nconst basetenSchema = apiModelIdProviderModelSchema.extend({\n\tbasetenApiKey: z.string().optional(),\n})\n\nconst defaultSchema = z.object({\n\tapiProvider: z.undefined(),\n})\n\nexport const providerSettingsSchemaDiscriminated = z.discriminatedUnion(\"apiProvider\", [\n\tanthropicSchema.merge(z.object({ apiProvider: z.literal(\"anthropic\") })),\n\topenRouterSchema.merge(z.object({ apiProvider: z.literal(\"openrouter\") })),\n\tbedrockSchema.merge(z.object({ apiProvider: z.literal(\"bedrock\") })),\n\tvertexSchema.merge(z.object({ apiProvider: z.literal(\"vertex\") })),\n\topenAiSchema.merge(z.object({ apiProvider: z.literal(\"openai\") })),\n\tollamaSchema.merge(z.object({ apiProvider: z.literal(\"ollama\") })),\n\tvsCodeLmSchema.merge(z.object({ apiProvider: z.literal(\"vscode-lm\") })),\n\tlmStudioSchema.merge(z.object({ apiProvider: z.literal(\"lmstudio\") })),\n\tgeminiSchema.merge(z.object({ apiProvider: z.literal(\"gemini\") })),\n\tgeminiCliSchema.merge(z.object({ apiProvider: z.literal(\"gemini-cli\") })),\n\topenAiCodexSchema.merge(z.object({ apiProvider: z.literal(\"openai-codex\") })),\n\topenAiNativeSchema.merge(z.object({ apiProvider: z.literal(\"openai-native\") })),\n\tmistralSchema.merge(z.object({ apiProvider: z.literal(\"mistral\") })),\n\tdeepSeekSchema.merge(z.object({ apiProvider: z.literal(\"deepseek\") })),\n\tpoeSchema.merge(z.object({ apiProvider: z.literal(\"poe\") })),\n\tmoonshotSchema.merge(z.object({ apiProvider: z.literal(\"moonshot\") })),\n\tminimaxSchema.merge(z.object({ apiProvider: z.literal(\"minimax\") })),\n\trequestySchema.merge(z.object({ apiProvider: z.literal(\"requesty\") })),\n\tunboundSchema.merge(z.object({ apiProvider: z.literal(\"unbound\") })),\n\tfakeAiSchema.merge(z.object({ apiProvider: z.literal(\"fake-ai\") })),\n\txaiSchema.merge(z.object({ apiProvider: z.literal(\"xai\") })),\n\tbasetenSchema.merge(z.object({ apiProvider: z.literal(\"baseten\") })),\n\tlitellmSchema.merge(z.object({ apiProvider: z.literal(\"litellm\") })),\n\tsambaNovaSchema.merge(z.object({ apiProvider: z.literal(\"sambanova\") })),\n\tzaiSchema.merge(z.object({ apiProvider: z.literal(\"zai\") })),\n\tfireworksSchema.merge(z.object({ apiProvider: z.literal(\"fireworks\") })),\n\tqwenCodeSchema.merge(z.object({ apiProvider: z.literal(\"qwen-code\") })),\n\tvercelAiGatewaySchema.merge(z.object({ apiProvider: z.literal(\"vercel-ai-gateway\") })),\n\tdefaultSchema,\n])\n\nexport const providerSettingsSchema = z.object({\n\tapiProvider: providerNamesWithRetiredSchema.optional(),\n\t...anthropicSchema.shape,\n\t...openRouterSchema.shape,\n\t...bedrockSchema.shape,\n\t...vertexSchema.shape,\n\t...openAiSchema.shape,\n\t...ollamaSchema.shape,\n\t...vsCodeLmSchema.shape,\n\t...lmStudioSchema.shape,\n\t...geminiSchema.shape,\n\t...geminiCliSchema.shape,\n\t...openAiCodexSchema.shape,\n\t...openAiNativeSchema.shape,\n\t...mistralSchema.shape,\n\t...deepSeekSchema.shape,\n\t...poeSchema.shape,\n\t...moonshotSchema.shape,\n\t...minimaxSchema.shape,\n\t...requestySchema.shape,\n\t...unboundSchema.shape,\n\t...fakeAiSchema.shape,\n\t...xaiSchema.shape,\n\t...basetenSchema.shape,\n\t...litellmSchema.shape,\n\t...sambaNovaSchema.shape,\n\t...zaiSchema.shape,\n\t...fireworksSchema.shape,\n\t...qwenCodeSchema.shape,\n\t...vercelAiGatewaySchema.shape,\n\t...codebaseIndexProviderSchema.shape,\n})\n\nexport type ProviderSettings = z.infer<typeof providerSettingsSchema>\n\nexport const providerSettingsWithIdSchema = providerSettingsSchema.extend({ id: z.string().optional() })\n\nexport const discriminatedProviderSettingsWithIdSchema = providerSettingsSchemaDiscriminated.and(\n\tz.object({ id: z.string().optional() }),\n)\n\nexport type ProviderSettingsWithId = z.infer<typeof providerSettingsWithIdSchema>\n\nexport const PROVIDER_SETTINGS_KEYS = providerSettingsSchema.keyof().options\n\n/**\n * ModelIdKey\n */\n\nexport const modelIdKeys = [\n\t\"apiModelId\",\n\t\"openRouterModelId\",\n\t\"openAiModelId\",\n\t\"ollamaModelId\",\n\t\"lmStudioModelId\",\n\t\"lmStudioDraftModelId\",\n\t\"requestyModelId\",\n\t\"unboundModelId\",\n\t\"litellmModelId\",\n\t\"vercelAiGatewayModelId\",\n] as const satisfies readonly (keyof ProviderSettings)[]\n\nexport type ModelIdKey = (typeof modelIdKeys)[number]\n\nexport const getModelId = (settings: ProviderSettings): string | undefined => {\n\tconst modelIdKey = modelIdKeys.find((key) => settings[key])\n\treturn modelIdKey ? settings[modelIdKey] : undefined\n}\n\n/**\n * TypicalProvider\n */\n\nexport type TypicalProvider = Exclude<ProviderName, InternalProvider | CustomProvider | FauxProvider>\n\nexport const isTypicalProvider = (key: unknown): key is TypicalProvider =>\n\tisProviderName(key) && !isInternalProvider(key) && !isCustomProvider(key) && !isFauxProvider(key)\n\nexport const modelIdKeysByProvider: Record<TypicalProvider, ModelIdKey> = {\n\tanthropic: \"apiModelId\",\n\topenrouter: \"openRouterModelId\",\n\tbedrock: \"apiModelId\",\n\tvertex: \"apiModelId\",\n\t\"openai-codex\": \"apiModelId\",\n\t\"openai-native\": \"openAiModelId\",\n\tollama: \"ollamaModelId\",\n\tlmstudio: \"lmStudioModelId\",\n\tgemini: \"apiModelId\",\n\t\"gemini-cli\": \"apiModelId\",\n\tmistral: \"apiModelId\",\n\tmoonshot: \"apiModelId\",\n\tminimax: \"apiModelId\",\n\tdeepseek: \"apiModelId\",\n\tpoe: \"apiModelId\",\n\t\"qwen-code\": \"apiModelId\",\n\trequesty: \"requestyModelId\",\n\tunbound: \"unboundModelId\",\n\txai: \"apiModelId\",\n\tbaseten: \"apiModelId\",\n\tlitellm: \"litellmModelId\",\n\tsambanova: \"apiModelId\",\n\tzai: \"apiModelId\",\n\tfireworks: \"apiModelId\",\n\t\"vercel-ai-gateway\": \"vercelAiGatewayModelId\",\n}\n\n/**\n * ANTHROPIC_STYLE_PROVIDERS\n */\n\n// Providers that use Anthropic-style API protocol.\nexport const ANTHROPIC_STYLE_PROVIDERS: ProviderName[] = [\"anthropic\", \"bedrock\", \"minimax\"]\n\nexport const getApiProtocol = (provider: ProviderName | undefined, modelId?: string): \"anthropic\" | \"openai\" => {\n\tif (provider && ANTHROPIC_STYLE_PROVIDERS.includes(provider)) {\n\t\treturn \"anthropic\"\n\t}\n\n\tif (provider && provider === \"vertex\" && modelId && modelId.toLowerCase().includes(\"claude\")) {\n\t\treturn \"anthropic\"\n\t}\n\n\t// Vercel AI Gateway uses anthropic protocol for anthropic models.\n\tif (provider && provider === \"vercel-ai-gateway\" && modelId && modelId.toLowerCase().startsWith(\"anthropic/\")) {\n\t\treturn \"anthropic\"\n\t}\n\n\treturn \"openai\"\n}\n\n/**\n * MODELS_BY_PROVIDER\n */\n\nexport const MODELS_BY_PROVIDER: Record<\n\tExclude<ProviderName, \"fake-ai\" | \"gemini-cli\" | \"openai\">,\n\t{ id: ProviderName; label: string; models: string[] }\n> = {\n\tanthropic: {\n\t\tid: \"anthropic\",\n\t\tlabel: \"Anthropic\",\n\t\tmodels: Object.keys(anthropicModels),\n\t},\n\tbedrock: {\n\t\tid: \"bedrock\",\n\t\tlabel: \"Amazon Bedrock\",\n\t\tmodels: Object.keys(bedrockModels),\n\t},\n\tdeepseek: {\n\t\tid: \"deepseek\",\n\t\tlabel: \"DeepSeek\",\n\t\tmodels: Object.keys(deepSeekModels),\n\t},\n\tfireworks: {\n\t\tid: \"fireworks\",\n\t\tlabel: \"Fireworks\",\n\t\tmodels: Object.keys(fireworksModels),\n\t},\n\tgemini: {\n\t\tid: \"gemini\",\n\t\tlabel: \"Google Gemini\",\n\t\tmodels: Object.keys(geminiModels),\n\t},\n\tmistral: {\n\t\tid: \"mistral\",\n\t\tlabel: \"Mistral\",\n\t\tmodels: Object.keys(mistralModels),\n\t},\n\tmoonshot: {\n\t\tid: \"moonshot\",\n\t\tlabel: \"Moonshot\",\n\t\tmodels: Object.keys(moonshotModels),\n\t},\n\tminimax: {\n\t\tid: \"minimax\",\n\t\tlabel: \"MiniMax\",\n\t\tmodels: Object.keys(minimaxModels),\n\t},\n\t\"openai-codex\": {\n\t\tid: \"openai-codex\",\n\t\tlabel: \"OpenAI - ChatGPT Plus/Pro\",\n\t\tmodels: Object.keys(openAiCodexModels),\n\t},\n\t\"openai-native\": {\n\t\tid: \"openai-native\",\n\t\tlabel: \"OpenAI\",\n\t\tmodels: Object.keys(openAiNativeModels),\n\t},\n\t\"qwen-code\": { id: \"qwen-code\", label: \"Qwen Code\", models: Object.keys(qwenCodeModels) },\n\tsambanova: {\n\t\tid: \"sambanova\",\n\t\tlabel: \"SambaNova\",\n\t\tmodels: Object.keys(sambaNovaModels),\n\t},\n\tvertex: {\n\t\tid: \"vertex\",\n\t\tlabel: \"GCP Vertex AI\",\n\t\tmodels: Object.keys(vertexModels),\n\t},\n\t\"vscode-lm\": {\n\t\tid: \"vscode-lm\",\n\t\tlabel: \"VS Code LM API\",\n\t\tmodels: Object.keys(vscodeLlmModels),\n\t},\n\txai: { id: \"xai\", label: \"xAI (Grok)\", models: Object.keys(xaiModels) },\n\tzai: { id: \"zai\", label: \"Z.ai\", models: Object.keys(internationalZAiModels) },\n\tbaseten: { id: \"baseten\", label: \"Baseten\", models: Object.keys(basetenModels) },\n\n\t// Dynamic providers; models pulled from remote APIs.\n\tpoe: { id: \"poe\", label: \"Poe\", models: [] },\n\tlitellm: { id: \"litellm\", label: \"LiteLLM\", models: [] },\n\topenrouter: { id: \"openrouter\", label: \"OpenRouter\", models: [] },\n\trequesty: { id: \"requesty\", label: \"Requesty\", models: [] },\n\tunbound: { id: \"unbound\", label: \"Unbound\", models: [] },\n\t\"vercel-ai-gateway\": { id: \"vercel-ai-gateway\", label: \"Vercel AI Gateway\", models: [] },\n\n\t// Local providers; models discovered from localhost endpoints.\n\tlmstudio: { id: \"lmstudio\", label: \"LM Studio\", models: [] },\n\tollama: { id: \"ollama\", label: \"Ollama\", models: [] },\n}\n","import { z } from \"zod\"\n\n/**\n * HistoryItem\n */\n\nexport const historyItemSchema = z.object({\n\tid: z.string(),\n\trootTaskId: z.string().optional(),\n\tparentTaskId: z.string().optional(),\n\tnumber: z.number(),\n\tts: z.number(),\n\ttask: z.string(),\n\ttokensIn: z.number(),\n\ttokensOut: z.number(),\n\tcacheWrites: z.number().optional(),\n\tcacheReads: z.number().optional(),\n\ttotalCost: z.number(),\n\tsize: z.number().optional(),\n\tworkspace: z.string().optional(),\n\tmode: z.string().optional(),\n\tapiConfigName: z.string().optional(), // Provider profile name for sticky profile feature\n\tstatus: z.enum([\"active\", \"completed\", \"delegated\"]).optional(),\n\tdelegatedToId: z.string().optional(), // Last child this parent delegated to\n\tchildIds: z.array(z.string()).optional(), // All children spawned by this task\n\tawaitingChildId: z.string().optional(), // Child currently awaited (set when delegated)\n\tcompletedByChildId: z.string().optional(), // Child that completed and resumed this parent\n\tcompletionResultSummary: z.string().optional(), // Summary from completed child\n})\n\nexport type HistoryItem = z.infer<typeof historyItemSchema>\n","import { z } from \"zod\"\n\nimport type { Keys, Equals, AssertEqual } from \"./type-fu.js\"\n\n/**\n * ExperimentId\n */\n\nexport const experimentIds = [\"preventFocusDisruption\", \"imageGeneration\", \"runSlashCommand\", \"customTools\"] as const\n\nexport const experimentIdsSchema = z.enum(experimentIds)\n\nexport type ExperimentId = z.infer<typeof experimentIdsSchema>\n\n/**\n * Experiments\n */\n\nexport const experimentsSchema = z.object({\n\tpreventFocusDisruption: z.boolean().optional(),\n\timageGeneration: z.boolean().optional(),\n\trunSlashCommand: z.boolean().optional(),\n\tcustomTools: z.boolean().optional(),\n})\n\nexport type Experiments = z.infer<typeof experimentsSchema>\n\ntype _AssertExperiments = AssertEqual<Equals<ExperimentId, Keys<Experiments>>>\n","import { z } from \"zod\"\n\n/**\n * ToolGroup\n */\n\nexport const toolGroups = [\"read\", \"edit\", \"command\", \"mcp\", \"modes\"] as const\n\nexport const toolGroupsSchema = z.enum(toolGroups)\n\n/**\n * Tool groups that have been removed but may still exist in user config files.\n * Used by schema preprocessing to silently strip these before validation,\n * preventing errors for users with older configs.\n */\nexport const deprecatedToolGroups: readonly string[] = [\"browser\"]\n\nexport type ToolGroup = z.infer<typeof toolGroupsSchema>\n\n/**\n * ToolName\n */\n\nexport const toolNames = [\n\t\"execute_command\",\n\t\"read_file\",\n\t\"read_command_output\",\n\t\"write_to_file\",\n\t\"apply_diff\",\n\t\"edit\",\n\t\"search_and_replace\",\n\t\"search_replace\",\n\t\"edit_file\",\n\t\"apply_patch\",\n\t\"search_files\",\n\t\"list_files\",\n\t\"use_mcp_tool\",\n\t\"access_mcp_resource\",\n\t\"ask_followup_question\",\n\t\"attempt_completion\",\n\t\"switch_mode\",\n\t\"new_task\",\n\t\"codebase_search\",\n\t\"update_todo_list\",\n\t\"run_slash_command\",\n\t\"skill\",\n\t\"generate_image\",\n\t\"custom_tool\",\n] as const\n\nexport const toolNamesSchema = z.enum(toolNames)\n\nexport type ToolName = z.infer<typeof toolNamesSchema>\n\n/**\n * ToolUsage\n */\n\nexport const toolUsageSchema = z.record(\n\ttoolNamesSchema,\n\tz.object({\n\t\tattempts: z.number(),\n\t\tfailures: z.number(),\n\t}),\n)\n\nexport type ToolUsage = z.infer<typeof toolUsageSchema>\n","import { z } from \"zod\"\n\nimport { deprecatedToolGroups, toolGroupsSchema } from \"./tool.js\"\n\n/**\n * GroupOptions\n */\n\nexport const groupOptionsSchema = z.object({\n\tfileRegex: z\n\t\t.string()\n\t\t.optional()\n\t\t.refine(\n\t\t\t(pattern) => {\n\t\t\t\tif (!pattern) {\n\t\t\t\t\treturn true // Optional, so empty is valid.\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tnew RegExp(pattern)\n\t\t\t\t\treturn true\n\t\t\t\t} catch {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ message: \"Invalid regular expression pattern\" },\n\t\t),\n\tdescription: z.string().optional(),\n})\n\nexport type GroupOptions = z.infer<typeof groupOptionsSchema>\n\n/**\n * GroupEntry\n */\n\nexport const groupEntrySchema = z.union([toolGroupsSchema, z.tuple([toolGroupsSchema, groupOptionsSchema])])\n\nexport type GroupEntry = z.infer<typeof groupEntrySchema>\n\n/**\n * ModeConfig\n */\n\n/**\n * Checks if a group entry references a deprecated tool group.\n * Handles both string entries (\"browser\") and tuple entries ([\"browser\", { ... }]).\n */\nfunction isDeprecatedGroupEntry(entry: unknown): boolean {\n\tif (typeof entry === \"string\") {\n\t\treturn deprecatedToolGroups.includes(entry)\n\t}\n\tif (Array.isArray(entry) && entry.length >= 1 && typeof entry[0] === \"string\") {\n\t\treturn deprecatedToolGroups.includes(entry[0])\n\t}\n\treturn false\n}\n\n/**\n * Raw schema for validating group entries after deprecated groups are stripped.\n */\nconst rawGroupEntryArraySchema = z.array(groupEntrySchema).refine(\n\t(groups) => {\n\t\tconst seen = new Set()\n\n\t\treturn groups.every((group) => {\n\t\t\t// For tuples, check the group name (first element).\n\t\t\tconst groupName = Array.isArray(group) ? group[0] : group\n\n\t\t\tif (seen.has(groupName)) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tseen.add(groupName)\n\t\t\treturn true\n\t\t})\n\t},\n\t{ message: \"Duplicate groups are not allowed\" },\n)\n\n/**\n * Schema for mode group entries. Preprocesses the input to strip deprecated\n * tool groups (e.g., \"browser\") before validation, ensuring backward compatibility\n * with older user configs.\n *\n * The type assertion to `z.ZodType<GroupEntry[], z.ZodTypeDef, GroupEntry[]>` is\n * required because `z.preprocess` erases the input type to `unknown`, which\n * propagates through `modeConfigSchema → rooCodeSettingsSchema → createRunSchema`\n * and breaks `zodResolver` generic inference in downstream consumers.\n */\nexport const groupEntryArraySchema = z.preprocess((val) => {\n\tif (!Array.isArray(val)) return val\n\treturn val.filter((entry) => !isDeprecatedGroupEntry(entry))\n}, rawGroupEntryArraySchema) as z.ZodType<GroupEntry[], z.ZodTypeDef, GroupEntry[]>\n\nexport const modeConfigSchema = z.object({\n\tslug: z.string().regex(/^[a-zA-Z0-9-]+$/, \"Slug must contain only letters numbers and dashes\"),\n\tname: z.string().min(1, \"Name is required\"),\n\troleDefinition: z.string().min(1, \"Role definition is required\"),\n\twhenToUse: z.string().optional(),\n\tdescription: z.string().optional(),\n\tcustomInstructions: z.string().optional(),\n\tgroups: groupEntryArraySchema,\n\tsource: z.enum([\"global\", \"project\"]).optional(),\n})\n\nexport type ModeConfig = z.infer<typeof modeConfigSchema>\n\n/**\n * CustomModesSettings\n */\n\nexport const customModesSettingsSchema = z.object({\n\tcustomModes: z.array(modeConfigSchema).refine(\n\t\t(modes) => {\n\t\t\tconst slugs = new Set()\n\n\t\t\treturn modes.every((mode) => {\n\t\t\t\tif (slugs.has(mode.slug)) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\n\t\t\t\tslugs.add(mode.slug)\n\t\t\t\treturn true\n\t\t\t})\n\t\t},\n\t\t{\n\t\t\tmessage: \"Duplicate mode slugs are not allowed\",\n\t\t},\n\t),\n})\n\nexport type CustomModesSettings = z.infer<typeof customModesSettingsSchema>\n\n/**\n * PromptComponent\n */\n\nexport const promptComponentSchema = z.object({\n\troleDefinition: z.string().optional(),\n\twhenToUse: z.string().optional(),\n\tdescription: z.string().optional(),\n\tcustomInstructions: z.string().optional(),\n})\n\nexport type PromptComponent = z.infer<typeof promptComponentSchema>\n\n/**\n * CustomModePrompts\n */\n\nexport const customModePromptsSchema = z.record(z.string(), promptComponentSchema.optional())\n\nexport type CustomModePrompts = z.infer<typeof customModePromptsSchema>\n\n/**\n * CustomSupportPrompts\n */\n\nexport const customSupportPromptsSchema = z.record(z.string(), z.string().optional())\n\nexport type CustomSupportPrompts = z.infer<typeof customSupportPromptsSchema>\n\n/**\n * DEFAULT_MODES\n */\n\nexport const DEFAULT_MODES: readonly ModeConfig[] = [\n\t{\n\t\tslug: \"architect\",\n\t\tname: \"🏗️ Architect\",\n\t\troleDefinition:\n\t\t\t\"You are Roo, an experienced technical leader who is inquisitive and an excellent planner. Your goal is to gather information and get context to create a detailed plan for accomplishing the user's task, which the user will review and approve before they switch into another mode to implement the solution.\",\n\t\twhenToUse:\n\t\t\t\"Use this mode when you need to plan, design, or strategize before implementation. Perfect for breaking down complex problems, creating technical specifications, designing system architecture, or brainstorming solutions before coding.\",\n\t\tdescription: \"Plan and design before implementation\",\n\t\tgroups: [\"read\", [\"edit\", { fileRegex: \"\\\\.md$\", description: \"Markdown files only\" }], \"mcp\"],\n\t\tcustomInstructions:\n\t\t\t\"1. Do some information gathering (using provided tools) to get more context about the task.\\n\\n2. You should also ask the user clarifying questions to get a better understanding of the task.\\n\\n3. Once you've gained more context about the user's request, break down the task into clear, actionable steps and create a todo list using the `update_todo_list` tool. Each todo item should be:\\n - Specific and actionable\\n - Listed in logical execution order\\n - Focused on a single, well-defined outcome\\n - Clear enough that another mode could execute it independently\\n\\n **Note:** If the `update_todo_list` tool is not available, write the plan to a markdown file (e.g., `plan.md` or `todo.md`) instead.\\n\\n4. As you gather more information or discover new requirements, update the todo list to reflect the current understanding of what needs to be accomplished.\\n\\n5. Ask the user if they are pleased with this plan, or if they would like to make any changes. Think of this as a brainstorming session where you can discuss the task and refine the todo list.\\n\\n6. Include Mermaid diagrams if they help clarify complex workflows or system architecture. Please avoid using double quotes (\\\"\\\") and parentheses () inside square brackets ([]) in Mermaid diagrams, as this can cause parsing errors.\\n\\n7. Use the switch_mode tool to request that the user switch to another mode to implement the solution.\\n\\n**IMPORTANT: Focus on creating clear, actionable todo lists rather than lengthy markdown documents. Use the todo list as your primary planning tool to track and organize the work that needs to be done.**\\n\\n**CRITICAL: Never provide level of effort time estimates (e.g., hours, days, weeks) for tasks. Focus solely on breaking down the work into clear, actionable steps without estimating how long they will take.**\\n\\nUnless told otherwise, if you want to save a plan file, put it in the /plans directory\",\n\t},\n\t{\n\t\tslug: \"code\",\n\t\tname: \"💻 Code\",\n\t\troleDefinition:\n\t\t\t\"You are Roo, a highly skilled software engineer with extensive knowledge in many programming languages, frameworks, design patterns, and best practices.\",\n\t\twhenToUse:\n\t\t\t\"Use this mode when you need to write, modify, or refactor code. Ideal for implementing features, fixing bugs, creating new files, or making code improvements across any programming language or framework.\",\n\t\tdescription: \"Write, modify, and refactor code\",\n\t\tgroups: [\"read\", \"edit\", \"command\", \"mcp\"],\n\t},\n\t{\n\t\tslug: \"ask\",\n\t\tname: \"❓ Ask\",\n\t\troleDefinition:\n\t\t\t\"You are Roo, a knowledgeable technical assistant focused on answering questions and providing information about software development, technology, and related topics.\",\n\t\twhenToUse:\n\t\t\t\"Use this mode when you need explanations, documentation, or answers to technical questions. Best for understanding concepts, analyzing existing code, getting recommendations, or learning about technologies without making changes.\",\n\t\tdescription: \"Get answers and explanations\",\n\t\tgroups: [\"read\", \"mcp\"],\n\t\tcustomInstructions:\n\t\t\t\"You can analyze code, explain concepts, and access external resources. Always answer the user's questions thoroughly, and do not switch to implementing code unless explicitly requested by the user. Include Mermaid diagrams when they clarify your response.\",\n\t},\n\t{\n\t\tslug: \"debug\",\n\t\tname: \"🪲 Debug\",\n\t\troleDefinition:\n\t\t\t\"You are Roo, an expert software debugger specializing in systematic problem diagnosis and resolution.\",\n\t\twhenToUse:\n\t\t\t\"Use this mode when you're troubleshooting issues, investigating errors, or diagnosing problems. Specialized in systematic debugging, adding logging, analyzing stack traces, and identifying root causes before applying fixes.\",\n\t\tdescription: \"Diagnose and fix software issues\",\n\t\tgroups: [\"read\", \"edit\", \"command\", \"mcp\"],\n\t\tcustomInstructions:\n\t\t\t\"Reflect on 5-7 different possible sources of the problem, distill those down to 1-2 most likely sources, and then add logs to validate your assumptions. Explicitly ask the user to confirm the diagnosis before fixing the problem.\",\n\t},\n\t{\n\t\tslug: \"orchestrator\",\n\t\tname: \"🪃 Orchestrator\",\n\t\troleDefinition:\n\t\t\t\"You are Roo, a strategic workflow orchestrator who coordinates complex tasks by delegating them to appropriate specialized modes. You have a comprehensive understanding of each mode's capabilities and limitations, allowing you to effectively break down complex problems into discrete tasks that can be solved by different specialists.\",\n\t\twhenToUse:\n\t\t\t\"Use this mode for complex, multi-step projects that require coordination across different specialties. Ideal when you need to break down large tasks into subtasks, manage workflows, or coordinate work that spans multiple domains or expertise areas.\",\n\t\tdescription: \"Coordinate tasks across multiple modes\",\n\t\tgroups: [],\n\t\tcustomInstructions:\n\t\t\t\"Your role is to coordinate complex workflows by delegating tasks to specialized modes. As an orchestrator, you should:\\n\\n1. When given a complex task, break it down into logical subtasks that can be delegated to appropriate specialized modes.\\n\\n2. For each subtask, use the `new_task` tool to delegate. Choose the most appropriate mode for the subtask's specific goal and provide comprehensive instructions in the `message` parameter. These instructions must include:\\n * All necessary context from the parent task or previous subtasks required to complete the work.\\n * A clearly defined scope, specifying exactly what the subtask should accomplish.\\n * An explicit statement that the subtask should *only* perform the work outlined in these instructions and not deviate.\\n * An instruction for the subtask to signal completion by using the `attempt_completion` tool, providing a concise yet thorough summary of the outcome in the `result` parameter, keeping in mind that this summary will be the source of truth used to keep track of what was completed on this project.\\n * A statement that these specific instructions supersede any conflicting general instructions the subtask's mode might have.\\n\\n3. Track and manage the progress of all subtasks. When a subtask is completed, analyze its results and determine the next steps.\\n\\n4. Help the user understand how the different subtasks fit together in the overall workflow. Provide clear reasoning about why you're delegating specific tasks to specific modes.\\n\\n5. When all subtasks are completed, synthesize the results and provide a comprehensive overview of what was accomplished.\\n\\n6. Ask clarifying questions when necessary to better understand how to break down complex tasks effectively.\\n\\n7. Suggest improvements to the workflow based on the results of completed subtasks.\\n\\nUse subtasks to maintain clarity. If a request significantly shifts focus or requires a different expertise (mode), consider creating a subtask rather than overloading the current one.\",\n\t},\n] as const\n","import { z } from \"zod\"\r\n\r\n/**\r\n * CodeAction\r\n */\r\n\r\nexport const codeActionIds = [\"explainCode\", \"fixCode\", \"improveCode\", \"addToContext\", \"newTask\"] as const\r\n\r\nexport type CodeActionId = (typeof codeActionIds)[number]\r\n\r\nexport type CodeActionName = \"EXPLAIN\" | \"FIX\" | \"IMPROVE\" | \"ADD_TO_CONTEXT\" | \"NEW_TASK\"\r\n\r\n/**\r\n * TerminalAction\r\n */\r\n\r\nexport const terminalActionIds = [\"terminalAddToContext\", \"terminalFixCommand\", \"terminalExplainCommand\"] as const\r\n\r\nexport type TerminalActionId = (typeof terminalActionIds)[number]\r\n\r\nexport type TerminalActionName = \"ADD_TO_CONTEXT\" | \"FIX\" | \"EXPLAIN\"\r\n\r\nexport type TerminalActionPromptType = `TERMINAL_${TerminalActionName}`\r\n\r\n/**\r\n * Command\r\n */\r\n\r\nexport const commandIds = [\n\t\"activationCompleted\",\n\n\t\"plusButtonClicked\",\n\t\"historyButtonClicked\",\n\t\"popoutButtonClicked\",\n\t\"settingsButtonClicked\",\n\n\t\"openInNewTab\",\n\n\t\"newTask\",\n\n\t\"setCustomStoragePath\",\n\t\"importSettings\",\n\n\t\"focusInput\",\n\t\"acceptInput\",\n\t\"focusPanel\",\n\t\"toggleAutoApprove\",\n\t\"readFile\"\n] as const\n\r\nexport type CommandId = (typeof commandIds)[number]\r\n\r\n/**\r\n * Language\r\n */\r\n\r\nexport const languages = [\n\t\"ca\",\n\t\"de\",\n\t\"en\",\n\t\"es\",\n\t\"fr\",\n\t\"hi\",\n\t\"id\",\n\t\"it\",\n\t\"ja\",\n\t\"ko\",\n\t\"nl\",\n\t\"pl\",\n\t\"pt-BR\",\n\t\"ru\",\n\t\"tr\",\n\t\"vi\",\n\t\"zh-CN\",\n\t\"zh-TW\",\n] as const\n\r\nexport const languagesSchema = z.enum(languages)\r\n\r\nexport type Language = z.infer<typeof languagesSchema>\r\n\r\nexport const isLanguage = (value: string): value is Language => languages.includes(value as Language)\r\n","import { z } from \"zod\"\n\nimport { type Keys } from \"./type-fu.js\"\nimport {\n\ttype ProviderSettings,\n\tPROVIDER_SETTINGS_KEYS,\n\tproviderSettingsEntrySchema,\n\tproviderSettingsSchema,\n} from \"./provider-settings.js\"\nimport { historyItemSchema } from \"./history.js\"\nimport { codebaseIndexModelsSchema, codebaseIndexConfigSchema } from \"./codebase-index.js\"\nimport { experimentsSchema } from \"./experiment.js\"\nimport { modeConfigSchema } from \"./mode.js\"\nimport { customModePromptsSchema, customSupportPromptsSchema } from \"./mode.js\"\nimport { toolNamesSchema } from \"./tool.js\"\nimport { languagesSchema } from \"./vscode.js\"\n\n/**\n * Default delay in milliseconds after writes to allow diagnostics to detect potential problems.\n * This delay is particularly important for Go and other languages where tools like goimports\n * need time to automatically clean up unused imports.\n */\nexport const DEFAULT_WRITE_DELAY_MS = 1000\n\n/**\n * Terminal output preview size options for persisted command output.\n *\n * Controls how much command output is kept in memory as a \"preview\" before\n * the LLM decides to retrieve more via `read_command_output`. Larger previews\n * mean more immediate context but consume more of the context window.\n *\n * - `small`: 5KB preview - Best for long-running commands with verbose output\n * - `medium`: 10KB preview - Balanced default for most use cases\n * - `large`: 20KB preview - Best when commands produce critical info early\n *\n * @see OutputInterceptor - Uses this setting to determine when to spill to disk\n * @see PersistedCommandOutput - Contains the resulting preview and artifact reference\n */\nexport type TerminalOutputPreviewSize = \"small\" | \"medium\" | \"large\"\n\n/**\n * Byte limits for each terminal output preview size.\n *\n * Maps preview size names to their corresponding byte thresholds.\n * When command output exceeds these thresholds, the excess is persisted\n * to disk and made available via the `read_command_output` tool.\n */\nexport const TERMINAL_PREVIEW_BYTES: Record<TerminalOutputPreviewSize, number> = {\n\tsmall: 5 * 1024, // 5KB\n\tmedium: 10 * 1024, // 10KB\n\tlarge: 20 * 1024, // 20KB\n}\n\n/**\n * Default terminal output preview size.\n * The \"medium\" (10KB) setting provides a good balance between immediate\n * visibility and context window conservation for most use cases.\n */\nexport const DEFAULT_TERMINAL_OUTPUT_PREVIEW_SIZE: TerminalOutputPreviewSize = \"medium\"\n\n/**\n * Minimum checkpoint timeout in seconds.\n */\nexport const MIN_CHECKPOINT_TIMEOUT_SECONDS = 10\n\n/**\n * Maximum checkpoint timeout in seconds.\n */\nexport const MAX_CHECKPOINT_TIMEOUT_SECONDS = 60\n\n/**\n * Default checkpoint timeout in seconds.\n */\nexport const DEFAULT_CHECKPOINT_TIMEOUT_SECONDS = 15\n\n/**\n * GlobalSettings\n */\n\nexport const globalSettingsSchema = z.object({\n\tcurrentApiConfigName: z.string().optional(),\n\tlistApiConfigMeta: z.array(providerSettingsEntrySchema).optional(),\n\tpinnedApiConfigs: z.record(z.string(), z.boolean()).optional(),\n\n\tlastShownAnnouncementId: z.string().optional(),\n\tcustomInstructions: z.string().optional(),\n\ttaskHistory: z.array(historyItemSchema).optional(),\n\tdismissedUpsells: z.array(z.string()).optional(),\n\n\t// Image generation settings (experimental) - flattened for simplicity\n\timageGenerationProvider: z.enum([\"openrouter\"]).optional(),\n\topenRouterImageApiKey: z.string().optional(),\n\topenRouterImageGenerationSelectedModel: z.string().optional(),\n\n\tcustomCondensingPrompt: z.string().optional(),\n\n\tautoApprovalEnabled: z.boolean().optional(),\n\talwaysAllowReadOnly: z.boolean().optional(),\n\talwaysAllowReadOnlyOutsideWorkspace: z.boolean().optional(),\n\talwaysAllowWrite: z.boolean().optional(),\n\talwaysAllowWriteOutsideWorkspace: z.boolean().optional(),\n\talwaysAllowWriteProtected: z.boolean().optional(),\n\twriteDelayMs: z.number().min(0).optional(),\n\trequestDelaySeconds: z.number().optional(),\n\talwaysAllowMcp: z.boolean().optional(),\n\talwaysAllowModeSwitch: z.boolean().optional(),\n\talwaysAllowSubtasks: z.boolean().optional(),\n\talwaysAllowExecute: z.boolean().optional(),\n\talwaysAllowFollowupQuestions: z.boolean().optional(),\n\tfollowupAutoApproveTimeoutMs: z.number().optional(),\n\tallowedCommands: z.array(z.string()).optional(),\n\tdeniedCommands: z.array(z.string()).optional(),\n\tcommandExecutionTimeout: z.number().optional(),\n\tcommandTimeoutAllowlist: z.array(z.string()).optional(),\n\tpreventCompletionWithOpenTodos: z.boolean().optional(),\n\tallowedMaxRequests: z.number().nullish(),\n\tallowedMaxCost: z.number().nullish(),\n\tautoCondenseContext: z.boolean().optional(),\n\tautoCondenseContextPercent: z.number().optional(),\n\n\t/**\n\t * Whether to include current time in the environment details\n\t * @default true\n\t */\n\tincludeCurrentTime: z.boolean().optional(),\n\t/**\n\t * Whether to include current cost in the environment details\n\t * @default true\n\t */\n\tincludeCurrentCost: z.boolean().optional(),\n\t/**\n\t * Maximum number of git status file entries to include in the environment details.\n\t * Set to 0 to disable git status. The header (branch, commits) is always included when > 0.\n\t * @default 0\n\t */\n\tmaxGitStatusFiles: z.number().optional(),\n\n\t/**\n\t * Whether to include diagnostic messages (errors, warnings) in tool outputs\n\t * @default true\n\t */\n\tincludeDiagnosticMessages: z.boolean().optional(),\n\t/**\n\t * Maximum number of diagnostic messages to include in tool outputs\n\t * @default 50\n\t */\n\tmaxDiagnosticMessages: z.number().optional(),\n\n\tenableCheckpoints: z.boolean().optional(),\n\tcheckpointTimeout: z\n\t\t.number()\n\t\t.int()\n\t\t.min(MIN_CHECKPOINT_TIMEOUT_SECONDS)\n\t\t.max(MAX_CHECKPOINT_TIMEOUT_SECONDS)\n\t\t.optional(),\n\n\tttsEnabled: z.boolean().optional(),\n\tttsSpeed: z.number().optional(),\n\tsoundEnabled: z.boolean().optional(),\n\tsoundVolume: z.number().optional(),\n\n\tmaxOpenTabsContext: z.number().optional(),\n\tmaxWorkspaceFiles: z.number().optional(),\n\tshowRooIgnoredFiles: z.boolean().optional(),\n\tenableSubfolderRules: z.boolean().optional(),\n\tmaxImageFileSize: z.number().optional(),\n\tmaxTotalImageSize: z.number().optional(),\n\n\tterminalOutputPreviewSize: z.enum([\"small\", \"medium\", \"large\"]).optional(),\n\tterminalShellIntegrationTimeout: z.number().optional(),\n\tterminalShellIntegrationDisabled: z.boolean().optional(),\n\tterminalCommandDelay: z.number().optional(),\n\tterminalPowershellCounter: z.boolean().optional(),\n\tterminalZshClearEolMark: z.boolean().optional(),\n\tterminalZshOhMy: z.boolean().optional(),\n\tterminalZshP10k: z.boolean().optional(),\n\tterminalZdotdir: z.boolean().optional(),\n\texecaShellPath: z.string().optional(),\n\n\tdiagnosticsEnabled: z.boolean().optional(),\n\n\trateLimitSeconds: z.number().optional(),\n\texperiments: experimentsSchema.optional(),\n\n\tcodebaseIndexModels: codebaseIndexModelsSchema.optional(),\n\tcodebaseIndexConfig: codebaseIndexConfigSchema.optional(),\n\n\tlanguage: languagesSchema.optional(),\n\n\tmcpEnabled: z.boolean().optional(),\n\n\tmode: z.string().optional(),\n\tmodeApiConfigs: z.record(z.string(), z.string()).optional(),\n\tcustomModes: z.array(modeConfigSchema).optional(),\n\tcustomModePrompts: customModePromptsSchema.optional(),\n\tcustomSupportPrompts: customSupportPromptsSchema.optional(),\n\tenhancementApiConfigId: z.string().optional(),\n\tincludeTaskHistoryInEnhance: z.boolean().optional(),\n\thistoryPreviewCollapsed: z.boolean().optional(),\n\treasoningBlockCollapsed: z.boolean().optional(),\n\t/**\n\t * Controls the keyboard behavior for sending messages in the chat input.\n\t * - \"send\": Enter sends message, Shift+Enter creates newline (default)\n\t * - \"newline\": Enter creates newline, Shift+Enter/Ctrl+Enter sends message\n\t * @default \"send\"\n\t */\n\tenterBehavior: z.enum([\"send\", \"newline\"]).optional(),\n\tprofileThresholds: z.record(z.string(), z.number()).optional(),\n\thasOpenedModeSelector: z.boolean().optional(),\n\tlastModeExportPath: z.string().optional(),\n\tlastModeImportPath: z.string().optional(),\n\tlastSettingsExportPath: z.string().optional(),\n\tlastTaskExportPath: z.string().optional(),\n\tlastImageSavePath: z.string().optional(),\n\n\t/**\n\t * Path to worktree to auto-open after switching workspaces.\n\t * Used by the worktree feature to open the Roo Code sidebar in a new window.\n\t */\n\tworktreeAutoOpenPath: z.string().optional(),\n\t/**\n\t * Whether to show the worktree selector in the home screen.\n\t * @default true\n\t */\n\tshowWorktreesInHomeScreen: z.boolean().optional(),\n\n\t/**\n\t * List of native tool names to globally disable.\n\t * Tools in this list will be excluded from prompt generation and rejected at execution time.\n\t */\n\tdisabledTools: z.array(toolNamesSchema).optional(),\n})\n\nexport type GlobalSettings = z.infer<typeof globalSettingsSchema>\n\nexport const GLOBAL_SETTINGS_KEYS = globalSettingsSchema.keyof().options\n\n/**\n * RooCodeSettings\n */\n\nexport const rooCodeSettingsSchema = providerSettingsSchema.merge(globalSettingsSchema)\n\nexport type RooCodeSettings = GlobalSettings & ProviderSettings\n\n/**\n * SecretState\n */\nexport const SECRET_STATE_KEYS = [\n\t\"apiKey\",\n\t\"openRouterApiKey\",\n\t\"awsAccessKey\",\n\t\"awsApiKey\",\n\t\"awsSecretKey\",\n\t\"awsSessionToken\",\n\t\"openAiApiKey\",\n\t\"ollamaApiKey\",\n\t\"geminiApiKey\",\n\t\"openAiNativeApiKey\",\n\t\"deepSeekApiKey\",\n\t\"moonshotApiKey\",\n\t\"mistralApiKey\",\n\t\"minimaxApiKey\",\n\t\"requestyApiKey\",\n\t\"unboundApiKey\",\n\t\"xaiApiKey\",\n\t\"litellmApiKey\",\n\t\"codeIndexOpenAiKey\",\n\t\"codeIndexQdrantApiKey\",\n\t\"codebaseIndexOpenAiCompatibleApiKey\",\n\t\"codebaseIndexGeminiApiKey\",\n\t\"codebaseIndexMistralApiKey\",\n\t\"codebaseIndexVercelAiGatewayApiKey\",\n\t\"codebaseIndexOpenRouterApiKey\",\n\t\"sambaNovaApiKey\",\n\t\"zaiApiKey\",\n\t\"fireworksApiKey\",\n\t\"vercelAiGatewayApiKey\",\n\t\"basetenApiKey\",\n] as const\n\n// Global secrets that are part of GlobalSettings (not ProviderSettings)\nexport const GLOBAL_SECRET_KEYS = [\n\t\"openRouterImageApiKey\", // For image generation\n] as const\n\n// Type for the actual secret storage keys\ntype ProviderSecretKey = (typeof SECRET_STATE_KEYS)[number]\ntype GlobalSecretKey = (typeof GLOBAL_SECRET_KEYS)[number]\n\n// Type representing all secrets that can be stored\nexport type SecretState = Pick<ProviderSettings, Extract<ProviderSecretKey, keyof ProviderSettings>> & {\n\t[K in GlobalSecretKey]?: string\n}\n\nexport const isSecretStateKey = (key: string): key is Keys<SecretState> =>\n\tSECRET_STATE_KEYS.includes(key as ProviderSecretKey) || GLOBAL_SECRET_KEYS.includes(key as GlobalSecretKey)\n\n/**\n * GlobalState\n */\n\nexport type GlobalState = Omit<RooCodeSettings, Keys<SecretState>>\n\nexport const GLOBAL_STATE_KEYS = [...GLOBAL_SETTINGS_KEYS, ...PROVIDER_SETTINGS_KEYS].filter(\n\t(key: Keys<RooCodeSettings>) => !isSecretStateKey(key),\n) as Keys<GlobalState>[]\n\nexport const isGlobalStateKey = (key: string): key is Keys<GlobalState> =>\n\tGLOBAL_STATE_KEYS.includes(key as Keys<GlobalState>)\n","import { z } from \"zod\"\n\nimport { rooCodeSettingsSchema } from \"./global-settings.js\"\n\n/**\n * Roo CLI stdin commands\n */\n\nexport const rooCliCommandNames = [\"start\", \"message\", \"cancel\", \"ping\", \"shutdown\"] as const\n\nexport const rooCliCommandNameSchema = z.enum(rooCliCommandNames)\n\nexport type RooCliCommandName = z.infer<typeof rooCliCommandNameSchema>\n\nexport const rooCliCommandBaseSchema = z.object({\n\tcommand: rooCliCommandNameSchema,\n\trequestId: z.string().min(1),\n})\n\nexport type RooCliCommandBase = z.infer<typeof rooCliCommandBaseSchema>\n\nconst rooCliSessionIdSchema = z\n\t.string()\n\t.trim()\n\t.regex(/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i)\n\nexport const rooCliStartCommandSchema = rooCliCommandBaseSchema.extend({\n\tcommand: z.literal(\"start\"),\n\tprompt: z.string(),\n\ttaskId: rooCliSessionIdSchema.optional(),\n\timages: z.array(z.string()).optional(),\n\tconfiguration: rooCodeSettingsSchema.optional(),\n})\n\nexport type RooCliStartCommand = z.infer<typeof rooCliStartCommandSchema>\n\nexport const rooCliMessageCommandSchema = rooCliCommandBaseSchema.extend({\n\tcommand: z.literal(\"message\"),\n\tprompt: z.string(),\n\timages: z.array(z.string()).optional(),\n})\n\nexport type RooCliMessageCommand = z.infer<typeof rooCliMessageCommandSchema>\n\nexport const rooCliCancelCommandSchema = rooCliCommandBaseSchema.extend({\n\tcommand: z.literal(\"cancel\"),\n})\n\nexport type RooCliCancelCommand = z.infer<typeof rooCliCancelCommandSchema>\n\nexport const rooCliPingCommandSchema = rooCliCommandBaseSchema.extend({\n\tcommand: z.literal(\"ping\"),\n})\n\nexport type RooCliPingCommand = z.infer<typeof rooCliPingCommandSchema>\n\nexport const rooCliShutdownCommandSchema = rooCliCommandBaseSchema.extend({\n\tcommand: z.literal(\"shutdown\"),\n})\n\nexport type RooCliShutdownCommand = z.infer<typeof rooCliShutdownCommandSchema>\n\nexport const rooCliInputCommandSchema = z.discriminatedUnion(\"command\", [\n\trooCliStartCommandSchema,\n\trooCliMessageCommandSchema,\n\trooCliCancelCommandSchema,\n\trooCliPingCommandSchema,\n\trooCliShutdownCommandSchema,\n])\n\nexport type RooCliInputCommand = z.infer<typeof rooCliInputCommandSchema>\n\n/**\n * Roo CLI stream-json output\n */\n\nexport const rooCliOutputFormats = [\"text\", \"json\", \"stream-json\"] as const\n\nexport const rooCliOutputFormatSchema = z.enum(rooCliOutputFormats)\n\nexport type RooCliOutputFormat = z.infer<typeof rooCliOutputFormatSchema>\n\nexport const rooCliEventTypes = [\n\t\"system\",\n\t\"control\",\n\t\"queue\",\n\t\"assistant\",\n\t\"user\",\n\t\"tool_use\",\n\t\"tool_result\",\n\t\"thinking\",\n\t\"error\",\n\t\"result\",\n] as const\n\nexport const rooCliEventTypeSchema = z.enum(rooCliEventTypes)\n\nexport type RooCliEventType = z.infer<typeof rooCliEventTypeSchema>\n\nexport const rooCliControlSubtypes = [\"ack\", \"done\", \"error\"] as const\n\nexport const rooCliControlSubtypeSchema = z.enum(rooCliControlSubtypes)\n\nexport type RooCliControlSubtype = z.infer<typeof rooCliControlSubtypeSchema>\n\nexport const rooCliQueueItemSchema = z.object({\n\tid: z.string().min(1),\n\ttext: z.string().optional(),\n\timageCount: z.number().optional(),\n\ttimestamp: z.number().optional(),\n})\n\nexport type RooCliQueueItem = z.infer<typeof rooCliQueueItemSchema>\n\nexport const rooCliToolUseSchema = z.object({\n\tname: z.string(),\n\tinput: z.record(z.unknown()).optional(),\n})\n\nexport type RooCliToolUse = z.infer<typeof rooCliToolUseSchema>\n\nexport const rooCliToolResultSchema = z.object({\n\tname: z.string(),\n\toutput: z.string().optional(),\n\terror: z.string().optional(),\n\texitCode: z.number().optional(),\n})\n\nexport type RooCliToolResult = z.infer<typeof rooCliToolResultSchema>\n\nexport const rooCliCostSchema = z.object({\n\ttotalCost: z.number().optional(),\n\tinputTokens: z.number().optional(),\n\toutputTokens: z.number().optional(),\n\tcacheWrites: z.number().optional(),\n\tcacheReads: z.number().optional(),\n})\n\nexport type RooCliCost = z.infer<typeof rooCliCostSchema>\n\nexport const rooCliStreamEventSchema = z\n\t.object({\n\t\ttype: rooCliEventTypeSchema.optional(),\n\t\tsubtype: z.string().optional(),\n\t\trequestId: z.string().optional(),\n\t\tcommand: rooCliCommandNameSchema.optional(),\n\t\ttaskId: z.string().optional(),\n\t\tcode: z.string().optional(),\n\t\tcontent: z.string().optional(),\n\t\tsuccess: z.boolean().optional(),\n\t\tid: z.number().optional(),\n\t\tdone: z.boolean().optional(),\n\t\tqueueDepth: z.number().optional(),\n\t\tqueue: z.array(rooCliQueueItemSchema).optional(),\n\t\tschemaVersion: z.number().optional(),\n\t\tprotocol: z.string().optional(),\n\t\tcapabilities: z.array(z.string()).optional(),\n\t\ttool_use: rooCliToolUseSchema.optional(),\n\t\ttool_result: rooCliToolResultSchema.optional(),\n\t\tcost: rooCliCostSchema.optional(),\n\t})\n\t.passthrough()\n\nexport type RooCliStreamEvent = z.infer<typeof rooCliStreamEventSchema>\n\nexport const rooCliControlEventSchema = rooCliStreamEventSchema.extend({\n\ttype: z.literal(\"control\"),\n\tsubtype: rooCliControlSubtypeSchema,\n\trequestId: z.string().min(1),\n})\n\nexport type RooCliControlEvent = z.infer<typeof rooCliControlEventSchema>\n\nexport const rooCliFinalOutputSchema = z.object({\n\ttype: z.literal(\"result\"),\n\tsuccess: z.boolean(),\n\tcontent: z.string().optional(),\n\tcost: rooCliCostSchema.optional(),\n\tevents: z.array(rooCliStreamEventSchema),\n})\n\nexport type RooCliFinalOutput = z.infer<typeof rooCliFinalOutputSchema>\n","import { z } from \"zod\"\n\nexport const organizationAllowListSchema = z.object({\n\tallowAll: z.boolean(),\n\tproviders: z.record(\n\t\tz.object({\n\t\t\tallowAll: z.boolean(),\n\t\t\tmodels: z.array(z.string()).optional(),\n\t\t}),\n\t),\n})\n\nexport type OrganizationAllowList = z.infer<typeof organizationAllowListSchema>\n\nexport const ORGANIZATION_ALLOW_ALL: OrganizationAllowList = {\n\tallowAll: true,\n\tproviders: {},\n}\n","/**\n * Context Management Types\n *\n * This module provides type definitions for context management events.\n * These events are used to handle different strategies for managing conversation context\n * when approaching token limits.\n *\n * Event Types:\n * - `condense_context`: Context was condensed using AI summarization\n * - `condense_context_error`: An error occurred during context condensation\n * - `sliding_window_truncation`: Context was truncated using sliding window strategy\n */\n\n/**\n * Array of all context management event types.\n * Used for runtime type checking.\n */\nexport const CONTEXT_MANAGEMENT_EVENTS = [\n\t\"condense_context\",\n\t\"condense_context_error\",\n\t\"sliding_window_truncation\",\n] as const\n\n/**\n * Union type representing all possible context management event types.\n */\nexport type ContextManagementEvent = (typeof CONTEXT_MANAGEMENT_EVENTS)[number]\n\n/**\n * Type guard function to check if a value is a valid context management event.\n */\nexport function isContextManagementEvent(value: unknown): value is ContextManagementEvent {\n\treturn typeof value === \"string\" && (CONTEXT_MANAGEMENT_EVENTS as readonly string[]).includes(value)\n}\n","/**\n * Cookie consent constants and types\n * Shared across all Roo Code repositories\n */\n\n/**\n * The name of the cookie that stores user's consent preference\n * Used by react-cookie-consent library\n */\nexport const CONSENT_COOKIE_NAME = \"roo-code-cookie-consent\"\n\n/**\n * Possible values for the consent cookie\n */\nexport type ConsentCookieValue = \"true\" | \"false\"\n\n/**\n * Cookie consent event names for communication between components\n */\nexport const COOKIE_CONSENT_EVENTS = {\n\tCHANGED: \"cookieConsentChanged\",\n} as const\n","import type { ZodType, z } from \"zod/v4\"\n\nimport { TaskLike } from \"./task.js\"\n\n// Re-export from Zod for convenience.\n\nexport { z as parametersSchema } from \"zod/v4\"\n\nexport type CustomToolParametersSchema = ZodType\n\nexport type SerializedCustomToolParameters = z.core.JSONSchema.JSONSchema\n\n/**\n * Context provided to tool execute functions.\n */\nexport interface CustomToolContext {\n\tmode: string\n\ttask: TaskLike\n}\n\n/**\n * Definition structure for a custom tool.\n *\n * Note: This interface uses simple types to avoid TypeScript performance issues\n * with Zod's complex type inference. For type-safe parameter inference, use\n * the `defineCustomTool` helper function instead of annotating with this interface.\n */\nexport interface CustomToolDefinition {\n\t/**\n\t * The name of the tool.\n\t * This is used to identify the tool in the prompt and in the tool registry.\n\t */\n\tname: string\n\n\t/**\n\t * A description of what the tool does.\n\t * This is shown to the AI model to help it decide when to use the tool.\n\t */\n\tdescription: string\n\n\t/**\n\t * Optional Zod schema defining the tool's parameters.\n\t * Use `z.object({})` to define the shape of arguments.\n\t */\n\tparameters?: CustomToolParametersSchema\n\n\t/**\n\t * The function that executes the tool.\n\t *\n\t * @param args - The validated arguments\n\t * @param context - Execution context with session and message info\n\t * @returns A string result to return to the AI\n\t */\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\texecute: (args: any, context: CustomToolContext) => Promise<string>\n}\n\nexport interface SerializedCustomToolDefinition {\n\tname: string\n\tdescription: string\n\tparameters?: SerializedCustomToolParameters\n\tsource?: string\n}\n\n/**\n * Type-safe definition structure for a custom tool with inferred parameter types.\n * Use this with `defineCustomTool` for full type inference.\n *\n * @template T - The Zod schema type for parameters\n */\nexport interface TypedCustomToolDefinition<T extends CustomToolParametersSchema>\n\textends Omit<CustomToolDefinition, \"execute\" | \"parameters\"> {\n\tparameters?: T\n\texecute: (args: z.infer<T>, context: CustomToolContext) => Promise<string>\n}\n\n/**\n * Helper function to define a custom tool with proper type inference.\n *\n * This is optional - you can also just export a plain object that matches\n * the CustomToolDefinition interface.\n *\n * @example\n * ```ts\n * import { parametersSchema as z, defineCustomTool } from \"@quantum-ai/types\"\n *\n * export default defineCustomTool({\n * name: \"add_numbers\",\n * description: \"Add two numbers\",\n * parameters: z.object({\n * a: z.number().describe(\"First number\"),\n * b: z.number().describe(\"Second number\"),\n * }),\n * async execute({ a, b }) {\n * return `The sum is ${a + b}`\n * }\n * })\n * ```\n */\nexport function defineCustomTool<T extends CustomToolParametersSchema>(\n\tdefinition: TypedCustomToolDefinition<T>,\n): TypedCustomToolDefinition<T> {\n\treturn definition\n}\n","export type EmbedderProvider =\n\t| \"openai\"\n\t| \"ollama\"\n\t| \"openai-compatible\"\n\t| \"gemini\"\n\t| \"mistral\"\n\t| \"vercel-ai-gateway\"\n\t| \"bedrock\"\n\t| \"openrouter\" // Add other providers as needed.\n\nexport interface EmbeddingModelProfile {\n\tdimension: number\n\tscoreThreshold?: number // Model-specific minimum score threshold for semantic search.\n\tqueryPrefix?: string // Optional prefix required by the model for queries.\n\t// Add other model-specific properties if needed, e.g., context window size.\n}\n\nexport type EmbeddingModelProfiles = {\n\t[provider in EmbedderProvider]?: {\n\t\t[modelId: string]: EmbeddingModelProfile\n\t}\n}\n","import { z } from \"zod\"\n\n/**\n * ClineAsk\n */\n\n/**\n * Array of possible ask types that the LLM can use to request user interaction or approval.\n * These represent different scenarios where the assistant needs user input to proceed.\n *\n * @constant\n * @readonly\n *\n * Ask type descriptions:\n * - `followup`: LLM asks a clarifying question to gather more information needed to complete the task\n * - `command`: Permission to execute a terminal/shell command\n * - `command_output`: Permission to read the output from a previously executed command\n * - `completion_result`: Task has been completed, awaiting user feedback or a new task\n * - `tool`: Permission to use a tool for file operations (read, write, search, etc.)\n * - `api_req_failed`: API request failed, asking user whether to retry\n * - `resume_task`: Confirmation needed to resume a previously paused task\n * - `resume_completed_task`: Confirmation needed to resume a task that was already marked as completed\n * - `mistake_limit_reached`: Too many errors encountered, needs user guidance on how to proceed\n * - `use_mcp_server`: Permission to use Model Context Protocol (MCP) server functionality\n * - `auto_approval_max_req_reached`: Auto-approval limit has been reached, manual approval required\n */\nexport const clineAsks = [\n\t\"followup\",\n\t\"command\",\n\t\"command_output\",\n\t\"completion_result\",\n\t\"tool\",\n\t\"api_req_failed\",\n\t\"resume_task\",\n\t\"resume_completed_task\",\n\t\"mistake_limit_reached\",\n\t\"use_mcp_server\",\n\t\"auto_approval_max_req_reached\",\n] as const\n\nexport const clineAskSchema = z.enum(clineAsks)\n\nexport type ClineAsk = z.infer<typeof clineAskSchema>\n/**\n * IdleAsk\n *\n * Asks that put the task into an \"idle\" state.\n */\n\nexport const idleAsks = [\n\t\"completion_result\",\n\t\"api_req_failed\",\n\t\"resume_completed_task\",\n\t\"mistake_limit_reached\",\n\t\"auto_approval_max_req_reached\",\n] as const satisfies readonly ClineAsk[]\n\nexport type IdleAsk = (typeof idleAsks)[number]\n\nexport function isIdleAsk(ask: ClineAsk): ask is IdleAsk {\n\treturn (idleAsks as readonly ClineAsk[]).includes(ask)\n}\n\n/**\n * ResumableAsk\n *\n * Asks that put the task into an \"resumable\" state.\n */\n\nexport const resumableAsks = [\"resume_task\"] as const satisfies readonly ClineAsk[]\n\nexport type ResumableAsk = (typeof resumableAsks)[number]\n\nexport function isResumableAsk(ask: ClineAsk): ask is ResumableAsk {\n\treturn (resumableAsks as readonly ClineAsk[]).includes(ask)\n}\n\n/**\n * InteractiveAsk\n *\n * Asks that put the task into an \"user interaction required\" state.\n */\n\nexport const interactiveAsks = [\"followup\", \"command\", \"tool\", \"use_mcp_server\"] as const satisfies readonly ClineAsk[]\n\nexport type InteractiveAsk = (typeof interactiveAsks)[number]\n\nexport function isInteractiveAsk(ask: ClineAsk): ask is InteractiveAsk {\n\treturn (interactiveAsks as readonly ClineAsk[]).includes(ask)\n}\n\n/**\n * NonBlockingAsk\n *\n * Asks that are not associated with an actual approval, and are only used\n * to update chat messages.\n */\n\nexport const nonBlockingAsks = [\"command_output\"] as const satisfies readonly ClineAsk[]\n\nexport type NonBlockingAsk = (typeof nonBlockingAsks)[number]\n\nexport function isNonBlockingAsk(ask: ClineAsk): ask is NonBlockingAsk {\n\treturn (nonBlockingAsks as readonly ClineAsk[]).includes(ask)\n}\n\n/**\n * ClineSay\n */\n\n/**\n * Array of possible say types that represent different kinds of messages the assistant can send.\n * These are used to categorize and handle various types of communication from the LLM to the user.\n *\n * @constant\n * @readonly\n *\n * Say type descriptions:\n * - `error`: General error message\n * - `api_req_started`: Indicates an API request has been initiated\n * - `api_req_finished`: Indicates an API request has completed successfully\n * - `api_req_retried`: Indicates an API request is being retried after a failure\n * - `api_req_retry_delayed`: Indicates an API request retry has been delayed\n * - `api_req_rate_limit_wait`: Indicates a configured rate-limit wait (not an error)\n * - `api_req_deleted`: Indicates an API request has been deleted/cancelled\n * - `text`: General text message or assistant response\n * - `reasoning`: Assistant's reasoning or thought process (often hidden from user)\n * - `completion_result`: Final result of task completion\n * - `user_feedback`: Message containing user feedback\n * - `user_feedback_diff`: Diff-formatted feedback from user showing requested changes\n * - `command_output`: Output from an executed command\n * - `shell_integration_warning`: Warning about shell integration issues or limitations\n * - `mcp_server_request_started`: MCP server request has been initiated\n * - `mcp_server_response`: Response received from MCP server\n * - `subtask_result`: Result of a completed subtask\n * - `checkpoint_saved`: Indicates a checkpoint has been saved\n * - `rooignore_error`: Error related to .rooignore file processing\n * - `diff_error`: Error occurred while applying a diff/patch\n * - `condense_context`: Context condensation/summarization has started\n * - `condense_context_error`: Error occurred during context condensation\n * - `codebase_search_result`: Results from searching the codebase\n * - `too_many_tools_warning`: Warning that too many MCP tools are enabled, which may confuse the LLM\n */\nexport const clineSays = [\n\t\"error\",\n\t\"api_req_started\",\n\t\"api_req_finished\",\n\t\"api_req_retried\",\n\t\"api_req_retry_delayed\",\n\t\"api_req_rate_limit_wait\",\n\t\"api_req_deleted\",\n\t\"text\",\n\t\"image\",\n\t\"reasoning\",\n\t\"completion_result\",\n\t\"user_feedback\",\n\t\"user_feedback_diff\",\n\t\"command_output\",\n\t\"shell_integration_warning\",\n\t\"mcp_server_request_started\",\n\t\"mcp_server_response\",\n\t\"subtask_result\",\n\t\"checkpoint_saved\",\n\t\"rooignore_error\",\n\t\"diff_error\",\n\t\"condense_context\",\n\t\"condense_context_error\",\n\t\"sliding_window_truncation\",\n\t\"codebase_search_result\",\n\t\"user_edit_todos\",\n\t\"too_many_tools_warning\",\n\t\"tool\",\n] as const\n\nexport const clineSaySchema = z.enum(clineSays)\n\nexport type ClineSay = z.infer<typeof clineSaySchema>\n\n/**\n * ToolProgressStatus\n */\n\nexport const toolProgressStatusSchema = z.object({\n\ticon: z.string().optional(),\n\ttext: z.string().optional(),\n})\n\nexport type ToolProgressStatus = z.infer<typeof toolProgressStatusSchema>\n\n/**\n * ContextCondense\n *\n * Data associated with a successful context condensation event.\n * This is attached to messages with `say: \"condense_context\"` when\n * the condensation operation completes successfully.\n *\n * @property cost - The API cost incurred for the condensation operation\n * @property prevContextTokens - Token count before condensation\n * @property newContextTokens - Token count after condensation\n * @property summary - The condensed summary that replaced the original context\n * @property condenseId - Optional unique identifier for this condensation operation\n */\nexport const contextCondenseSchema = z.object({\n\tcost: z.number(),\n\tprevContextTokens: z.number(),\n\tnewContextTokens: z.number(),\n\tsummary: z.string(),\n\tcondenseId: z.string().optional(),\n})\n\nexport type ContextCondense = z.infer<typeof contextCondenseSchema>\n\n/**\n * ContextTruncation\n *\n * Data associated with a sliding window truncation event.\n * This is attached to messages with `say: \"sliding_window_truncation\"` when\n * messages are removed from the conversation history to stay within token limits.\n *\n * Unlike condensation, truncation simply removes older messages without\n * summarizing them. This is a faster but less context-preserving approach.\n *\n * @property truncationId - Unique identifier for this truncation operation\n * @property messagesRemoved - Number of conversation messages that were removed\n * @property prevContextTokens - Token count before truncation occurred\n * @property newContextTokens - Token count after truncation occurred\n */\nexport const contextTruncationSchema = z.object({\n\ttruncationId: z.string(),\n\tmessagesRemoved: z.number(),\n\tprevContextTokens: z.number(),\n\tnewContextTokens: z.number(),\n})\n\nexport type ContextTruncation = z.infer<typeof contextTruncationSchema>\n\n/**\n * ClineMessage\n *\n * The main message type used for communication between the extension and webview.\n * Messages can either be \"ask\" (requiring user response) or \"say\" (informational).\n *\n * Context Management Fields:\n * - `contextCondense`: Present when `say: \"condense_context\"` and condensation succeeded\n * - `contextTruncation`: Present when `say: \"sliding_window_truncation\"` and truncation occurred\n *\n * Note: These fields are mutually exclusive - a message will have at most one of them.\n */\nexport const clineMessageSchema = z.object({\n\tts: z.number(),\n\ttype: z.union([z.literal(\"ask\"), z.literal(\"say\")]),\n\task: clineAskSchema.optional(),\n\tsay: clineSaySchema.optional(),\n\ttext: z.string().optional(),\n\timages: z.array(z.string()).optional(),\n\tpartial: z.boolean().optional(),\n\treasoning: z.string().optional(),\n\tconversationHistoryIndex: z.number().optional(),\n\tcheckpoint: z.record(z.string(), z.unknown()).optional(),\n\tprogressStatus: toolProgressStatusSchema.optional(),\n\t/**\n\t * Data for successful context condensation.\n\t * Present when `say: \"condense_context\"` and `partial: false`.\n\t */\n\tcontextCondense: contextCondenseSchema.optional(),\n\t/**\n\t * Data for sliding window truncation.\n\t * Present when `say: \"sliding_window_truncation\"`.\n\t */\n\tcontextTruncation: contextTruncationSchema.optional(),\n\tisProtected: z.boolean().optional(),\n\tapiProtocol: z.union([z.literal(\"openai\"), z.literal(\"anthropic\")]).optional(),\n\tisAnswered: z.boolean().optional(),\n})\n\nexport type ClineMessage = z.infer<typeof clineMessageSchema>\n\n/**\n * TokenUsage\n */\n\nexport const tokenUsageSchema = z.object({\n\ttotalTokensIn: z.number(),\n\ttotalTokensOut: z.number(),\n\ttotalCacheWrites: z.number().optional(),\n\ttotalCacheReads: z.number().optional(),\n\ttotalCost: z.number(),\n\tcontextTokens: z.number(),\n})\n\nexport type TokenUsage = z.infer<typeof tokenUsageSchema>\n\n/**\n * QueuedMessage\n */\n\nexport const queuedMessageSchema = z.object({\n\ttimestamp: z.number(),\n\tid: z.string(),\n\ttext: z.string(),\n\timages: z.array(z.string()).optional(),\n})\n\nexport type QueuedMessage = z.infer<typeof queuedMessageSchema>\n","import { z } from \"zod\"\n\nimport { clineMessageSchema, queuedMessageSchema, tokenUsageSchema } from \"./message.js\"\nimport { modelInfoSchema } from \"./model.js\"\nimport { toolNamesSchema, toolUsageSchema } from \"./tool.js\"\n\n/**\n * RooCodeEventName\n */\n\nexport enum RooCodeEventName {\n\t// Task Provider Lifecycle\n\tTaskCreated = \"taskCreated\",\n\n\t// Task Lifecycle\n\tTaskStarted = \"taskStarted\",\n\tTaskCompleted = \"taskCompleted\",\n\tTaskAborted = \"taskAborted\",\n\tTaskFocused = \"taskFocused\",\n\tTaskUnfocused = \"taskUnfocused\",\n\tTaskActive = \"taskActive\",\n\tTaskInteractive = \"taskInteractive\",\n\tTaskResumable = \"taskResumable\",\n\tTaskIdle = \"taskIdle\",\n\n\t// Subtask Lifecycle\n\tTaskPaused = \"taskPaused\",\n\tTaskUnpaused = \"taskUnpaused\",\n\tTaskSpawned = \"taskSpawned\",\n\tTaskDelegated = \"taskDelegated\",\n\tTaskDelegationCompleted = \"taskDelegationCompleted\",\n\tTaskDelegationResumed = \"taskDelegationResumed\",\n\n\t// Task Execution\n\tMessage = \"message\",\n\tTaskModeSwitched = \"taskModeSwitched\",\n\tTaskAskResponded = \"taskAskResponded\",\n\tTaskUserMessage = \"taskUserMessage\",\n\tQueuedMessagesUpdated = \"queuedMessagesUpdated\",\n\n\t// Task Analytics\n\tTaskTokenUsageUpdated = \"taskTokenUsageUpdated\",\n\tTaskToolFailed = \"taskToolFailed\",\n\n\t// Configuration Changes\n\tModeChanged = \"modeChanged\",\n\tProviderProfileChanged = \"providerProfileChanged\",\n\n\t// Query Responses\n\tCommandsResponse = \"commandsResponse\",\n\tModesResponse = \"modesResponse\",\n\tModelsResponse = \"modelsResponse\",\n}\n\n/**\n * RooCodeEvents\n */\n\nexport const rooCodeEventsSchema = z.object({\n\t[RooCodeEventName.TaskCreated]: z.tuple([z.string()]),\n\n\t[RooCodeEventName.TaskStarted]: z.tuple([z.string()]),\n\t[RooCodeEventName.TaskCompleted]: z.tuple([\n\t\tz.string(),\n\t\ttokenUsageSchema,\n\t\ttoolUsageSchema,\n\t\tz.object({\n\t\t\tisSubtask: z.boolean(),\n\t\t}),\n\t]),\n\t[RooCodeEventName.TaskAborted]: z.tuple([z.string()]),\n\t[RooCodeEventName.TaskFocused]: z.tuple([z.string()]),\n\t[RooCodeEventName.TaskUnfocused]: z.tuple([z.string()]),\n\t[RooCodeEventName.TaskActive]: z.tuple([z.string()]),\n\t[RooCodeEventName.TaskInteractive]: z.tuple([z.string()]),\n\t[RooCodeEventName.TaskResumable]: z.tuple([z.string()]),\n\t[RooCodeEventName.TaskIdle]: z.tuple([z.string()]),\n\n\t[RooCodeEventName.TaskPaused]: z.tuple([z.string()]),\n\t[RooCodeEventName.TaskUnpaused]: z.tuple([z.string()]),\n\t[RooCodeEventName.TaskSpawned]: z.tuple([z.string(), z.string()]),\n\t[RooCodeEventName.TaskDelegated]: z.tuple([\n\t\tz.string(), // parentTaskId\n\t\tz.string(), // childTaskId\n\t]),\n\t[RooCodeEventName.TaskDelegationCompleted]: z.tuple([\n\t\tz.string(), // parentTaskId\n\t\tz.string(), // childTaskId\n\t\tz.string(), // completionResultSummary\n\t]),\n\t[RooCodeEventName.TaskDelegationResumed]: z.tuple([\n\t\tz.string(), // parentTaskId\n\t\tz.string(), // childTaskId\n\t]),\n\n\t[RooCodeEventName.Message]: z.tuple([\n\t\tz.object({\n\t\t\ttaskId: z.string(),\n\t\t\taction: z.union([z.literal(\"created\"), z.literal(\"updated\")]),\n\t\t\tmessage: clineMessageSchema,\n\t\t}),\n\t]),\n\t[RooCodeEventName.TaskModeSwitched]: z.tuple([z.string(), z.string()]),\n\t[RooCodeEventName.TaskAskResponded]: z.tuple([z.string()]),\n\t[RooCodeEventName.TaskUserMessage]: z.tuple([z.string()]),\n\t[RooCodeEventName.QueuedMessagesUpdated]: z.tuple([z.string(), z.array(queuedMessageSchema)]),\n\n\t[RooCodeEventName.TaskToolFailed]: z.tuple([z.string(), toolNamesSchema, z.string()]),\n\t[RooCodeEventName.TaskTokenUsageUpdated]: z.tuple([z.string(), tokenUsageSchema, toolUsageSchema]),\n\n\t[RooCodeEventName.ModeChanged]: z.tuple([z.string()]),\n\t[RooCodeEventName.ProviderProfileChanged]: z.tuple([z.object({ name: z.string(), provider: z.string() })]),\n\n\t[RooCodeEventName.CommandsResponse]: z.tuple([\n\t\tz.array(\n\t\t\tz.object({\n\t\t\t\tname: z.string(),\n\t\t\t\tsource: z.enum([\"global\", \"project\", \"built-in\"]),\n\t\t\t\tfilePath: z.string().optional(),\n\t\t\t\tdescription: z.string().optional(),\n\t\t\t\targumentHint: z.string().optional(),\n\t\t\t}),\n\t\t),\n\t]),\n\t[RooCodeEventName.ModesResponse]: z.tuple([z.array(z.object({ slug: z.string(), name: z.string() }))]),\n\t[RooCodeEventName.ModelsResponse]: z.tuple([z.record(z.string(), modelInfoSchema)]),\n})\n\nexport type RooCodeEvents = z.infer<typeof rooCodeEventsSchema>\n\n/**\n * TaskEvent\n */\n\nexport const taskEventSchema = z.discriminatedUnion(\"eventName\", [\n\t// Task Provider Lifecycle\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.TaskCreated),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.TaskCreated],\n\t\ttaskId: z.number().optional(),\n\t}),\n\n\t// Task Lifecycle\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.TaskStarted),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.TaskStarted],\n\t\ttaskId: z.number().optional(),\n\t}),\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.TaskCompleted),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.TaskCompleted],\n\t\ttaskId: z.number().optional(),\n\t}),\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.TaskAborted),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.TaskAborted],\n\t\ttaskId: z.number().optional(),\n\t}),\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.TaskFocused),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.TaskFocused],\n\t\ttaskId: z.number().optional(),\n\t}),\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.TaskUnfocused),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.TaskUnfocused],\n\t\ttaskId: z.number().optional(),\n\t}),\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.TaskActive),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.TaskActive],\n\t\ttaskId: z.number().optional(),\n\t}),\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.TaskInteractive),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.TaskInteractive],\n\t\ttaskId: z.number().optional(),\n\t}),\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.TaskResumable),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.TaskResumable],\n\t\ttaskId: z.number().optional(),\n\t}),\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.TaskIdle),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.TaskIdle],\n\t\ttaskId: z.number().optional(),\n\t}),\n\n\t// Subtask Lifecycle\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.TaskPaused),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.TaskPaused],\n\t\ttaskId: z.number().optional(),\n\t}),\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.TaskUnpaused),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.TaskUnpaused],\n\t\ttaskId: z.number().optional(),\n\t}),\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.TaskSpawned),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.TaskSpawned],\n\t\ttaskId: z.number().optional(),\n\t}),\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.TaskDelegated),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.TaskDelegated],\n\t\ttaskId: z.number().optional(),\n\t}),\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.TaskDelegationCompleted),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.TaskDelegationCompleted],\n\t\ttaskId: z.number().optional(),\n\t}),\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.TaskDelegationResumed),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.TaskDelegationResumed],\n\t\ttaskId: z.number().optional(),\n\t}),\n\n\t// Task Execution\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.Message),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.Message],\n\t\ttaskId: z.number().optional(),\n\t}),\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.TaskModeSwitched),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.TaskModeSwitched],\n\t\ttaskId: z.number().optional(),\n\t}),\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.TaskAskResponded),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.TaskAskResponded],\n\t\ttaskId: z.number().optional(),\n\t}),\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.QueuedMessagesUpdated),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.QueuedMessagesUpdated],\n\t\ttaskId: z.number().optional(),\n\t}),\n\n\t// Task Analytics\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.TaskToolFailed),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.TaskToolFailed],\n\t\ttaskId: z.number().optional(),\n\t}),\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.TaskTokenUsageUpdated),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.TaskTokenUsageUpdated],\n\t\ttaskId: z.number().optional(),\n\t}),\n\n\t// Query Responses\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.CommandsResponse),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.CommandsResponse],\n\t\ttaskId: z.number().optional(),\n\t}),\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.ModesResponse),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.ModesResponse],\n\t\ttaskId: z.number().optional(),\n\t}),\n\tz.object({\n\t\teventName: z.literal(RooCodeEventName.ModelsResponse),\n\t\tpayload: rooCodeEventsSchema.shape[RooCodeEventName.ModelsResponse],\n\t\ttaskId: z.number().optional(),\n\t}),\n])\n\nexport type TaskEvent = z.infer<typeof taskEventSchema>\n","import { z } from \"zod\"\n\n/**\n * Interface for follow-up data structure used in follow-up questions\n * This represents the data structure for follow-up questions that the LLM can ask\n * to gather more information needed to complete a task.\n */\nexport interface FollowUpData {\n\t/** The question being asked by the LLM */\n\tquestion?: string\n\t/** Array of suggested answers that the user can select */\n\tsuggest?: Array<SuggestionItem>\n}\n\n/**\n * Interface for a suggestion item with optional mode switching\n */\nexport interface SuggestionItem {\n\t/** The text of the suggestion */\n\tanswer: string\n\t/** Optional mode to switch to when selecting this suggestion */\n\tmode?: string\n}\n\n/**\n * Zod schema for SuggestionItem\n */\nexport const suggestionItemSchema = z.object({\n\tanswer: z.string(),\n\tmode: z.string().optional(),\n})\n\n/**\n * Zod schema for FollowUpData\n */\nexport const followUpDataSchema = z.object({\n\tquestion: z.string().optional(),\n\tsuggest: z.array(suggestionItemSchema).optional(),\n})\n\nexport type FollowUpDataType = z.infer<typeof followUpDataSchema>\n","export interface GitRepositoryInfo {\n\trepositoryUrl?: string\n\trepositoryName?: string\n\tdefaultBranch?: string\n}\n\nexport interface GitCommit {\n\thash: string\n\tshortHash: string\n\tsubject: string\n\tauthor: string\n\tdate: string\n}\n","/**\n * Image generation model constants\n */\n\n/**\n * API method used for image generation\n */\nexport type ImageGenerationApiMethod = \"chat_completions\" | \"images_api\"\n\nexport interface ImageGenerationModel {\n\tvalue: string\n\tlabel: string\n\tprovider: ImageGenerationProvider\n\tapiMethod?: ImageGenerationApiMethod\n}\n\nexport const IMAGE_GENERATION_MODELS: ImageGenerationModel[] = [\n\t// OpenRouter models\n\t{ value: \"google/gemini-2.5-flash-image\", label: \"Gemini 2.5 Flash Image\", provider: \"openrouter\" },\n\t{ value: \"google/gemini-3-pro-image-preview\", label: \"Gemini 3 Pro Image Preview\", provider: \"openrouter\" },\n\t{ value: \"openai/gpt-5-image\", label: \"GPT-5 Image\", provider: \"openrouter\" },\n\t{ value: \"openai/gpt-5-image-mini\", label: \"GPT-5 Image Mini\", provider: \"openrouter\" },\n\t{ value: \"black-forest-labs/flux.2-flex\", label: \"Black Forest Labs FLUX.2 Flex\", provider: \"openrouter\" },\n\t{ value: \"black-forest-labs/flux.2-pro\", label: \"Black Forest Labs FLUX.2 Pro\", provider: \"openrouter\" },\n]\n\n/**\n * Get array of model values only (for backend validation)\n */\nexport const IMAGE_GENERATION_MODEL_IDS = IMAGE_GENERATION_MODELS.map((m) => m.value)\n\n/**\n * Image generation provider type\n */\nexport type ImageGenerationProvider = \"openrouter\"\n\n/**\n * Get the image generation provider with backwards compatibility\n * - If provider is explicitly set, use it\n * - If a model is already configured (existing users), default to \"openrouter\"\n * - Otherwise default to \"openrouter\" (new users)\n */\nexport function getImageGenerationProvider(\n\texplicitProvider: ImageGenerationProvider | undefined,\n\t_hasExistingModel: boolean,\n): ImageGenerationProvider {\n\treturn explicitProvider !== undefined ? explicitProvider : \"openrouter\"\n}\n","import { z } from \"zod\"\n\nimport { type TaskEvent, taskEventSchema } from \"./events.js\"\nimport { rooCodeSettingsSchema } from \"./global-settings.js\"\n\n/**\n * IpcMessageType\n */\n\nexport enum IpcMessageType {\n\tConnect = \"Connect\",\n\tDisconnect = \"Disconnect\",\n\tAck = \"Ack\",\n\tTaskCommand = \"TaskCommand\",\n\tTaskEvent = \"TaskEvent\",\n}\n\n/**\n * IpcOrigin\n */\n\nexport enum IpcOrigin {\n\tClient = \"client\",\n\tServer = \"server\",\n}\n\n/**\n * Ack\n */\n\nexport const ackSchema = z.object({\n\tclientId: z.string(),\n\tpid: z.number(),\n\tppid: z.number(),\n})\n\nexport type Ack = z.infer<typeof ackSchema>\n\n/**\n * TaskCommandName\n */\n\nexport enum TaskCommandName {\n\tStartNewTask = \"StartNewTask\",\n\tCancelTask = \"CancelTask\",\n\tCloseTask = \"CloseTask\",\n\tResumeTask = \"ResumeTask\",\n\tSendMessage = \"SendMessage\",\n\tGetCommands = \"GetCommands\",\n\tGetModes = \"GetModes\",\n\tGetModels = \"GetModels\",\n\tDeleteQueuedMessage = \"DeleteQueuedMessage\",\n}\n\n/**\n * TaskCommand\n */\n\nexport const taskCommandSchema = z.discriminatedUnion(\"commandName\", [\n\tz.object({\n\t\tcommandName: z.literal(TaskCommandName.StartNewTask),\n\t\tdata: z.object({\n\t\t\tconfiguration: rooCodeSettingsSchema,\n\t\t\ttext: z.string(),\n\t\t\timages: z.array(z.string()).optional(),\n\t\t\tnewTab: z.boolean().optional(),\n\t\t}),\n\t}),\n\tz.object({\n\t\tcommandName: z.literal(TaskCommandName.CancelTask),\n\t}),\n\tz.object({\n\t\tcommandName: z.literal(TaskCommandName.CloseTask),\n\t}),\n\tz.object({\n\t\tcommandName: z.literal(TaskCommandName.ResumeTask),\n\t\tdata: z.string(),\n\t}),\n\tz.object({\n\t\tcommandName: z.literal(TaskCommandName.SendMessage),\n\t\tdata: z.object({\n\t\t\ttext: z.string().optional(),\n\t\t\timages: z.array(z.string()).optional(),\n\t\t}),\n\t}),\n\tz.object({\n\t\tcommandName: z.literal(TaskCommandName.GetCommands),\n\t}),\n\tz.object({\n\t\tcommandName: z.literal(TaskCommandName.GetModes),\n\t}),\n\tz.object({\n\t\tcommandName: z.literal(TaskCommandName.GetModels),\n\t}),\n\tz.object({\n\t\tcommandName: z.literal(TaskCommandName.DeleteQueuedMessage),\n\t\tdata: z.string(), // messageId\n\t}),\n])\n\nexport type TaskCommand = z.infer<typeof taskCommandSchema>\n\n/**\n * IpcMessage\n */\n\nexport const ipcMessageSchema = z.discriminatedUnion(\"type\", [\n\tz.object({\n\t\ttype: z.literal(IpcMessageType.Ack),\n\t\torigin: z.literal(IpcOrigin.Server),\n\t\tdata: ackSchema,\n\t}),\n\tz.object({\n\t\ttype: z.literal(IpcMessageType.TaskCommand),\n\t\torigin: z.literal(IpcOrigin.Client),\n\t\tclientId: z.string(),\n\t\tdata: taskCommandSchema,\n\t}),\n\tz.object({\n\t\ttype: z.literal(IpcMessageType.TaskEvent),\n\t\torigin: z.literal(IpcOrigin.Server),\n\t\trelayClientId: z.string().optional(),\n\t\tdata: taskEventSchema,\n\t}),\n])\n\nexport type IpcMessage = z.infer<typeof ipcMessageSchema>\n\n/**\n * IpcClientEvents\n */\n\nexport type IpcClientEvents = {\n\t[IpcMessageType.Connect]: []\n\t[IpcMessageType.Disconnect]: []\n\t[IpcMessageType.Ack]: [data: Ack]\n\t[IpcMessageType.TaskCommand]: [data: TaskCommand]\n\t[IpcMessageType.TaskEvent]: [data: TaskEvent]\n}\n\n/**\n * IpcServerEvents\n */\n\nexport type IpcServerEvents = {\n\t[IpcMessageType.Connect]: [clientId: string]\n\t[IpcMessageType.Disconnect]: [clientId: string]\n\t[IpcMessageType.TaskCommand]: [clientId: string, data: TaskCommand]\n\t[IpcMessageType.TaskEvent]: [relayClientId: string | undefined, data: TaskEvent]\n}\n","import { z } from \"zod\"\n\n/**\n * Maximum number of MCP tools that can be enabled before showing a warning.\n * LLMs tend to perform poorly when given too many tools to choose from.\n */\nexport const MAX_MCP_TOOLS_THRESHOLD = 60\n\n/**\n * McpServerUse\n */\n\nexport interface McpServerUse {\n\ttype: string\n\tserverName: string\n\ttoolName?: string\n\turi?: string\n}\n\n/**\n * McpExecutionStatus\n */\n\nexport const mcpExecutionStatusSchema = z.discriminatedUnion(\"status\", [\n\tz.object({\n\t\texecutionId: z.string(),\n\t\tstatus: z.literal(\"started\"),\n\t\tserverName: z.string(),\n\t\ttoolName: z.string(),\n\t}),\n\tz.object({\n\t\texecutionId: z.string(),\n\t\tstatus: z.literal(\"output\"),\n\t\tresponse: z.string(),\n\t}),\n\tz.object({\n\t\texecutionId: z.string(),\n\t\tstatus: z.literal(\"completed\"),\n\t\tresponse: z.string().optional(),\n\t}),\n\tz.object({\n\t\texecutionId: z.string(),\n\t\tstatus: z.literal(\"error\"),\n\t\terror: z.string().optional(),\n\t}),\n])\n\nexport type McpExecutionStatus = z.infer<typeof mcpExecutionStatusSchema>\n\n/**\n * McpServer\n */\n\nexport type McpServer = {\n\tname: string\n\tconfig: string\n\tstatus: \"connected\" | \"connecting\" | \"disconnected\"\n\terror?: string\n\terrorHistory?: McpErrorEntry[]\n\ttools?: McpTool[]\n\tresources?: McpResource[]\n\tresourceTemplates?: McpResourceTemplate[]\n\tdisabled?: boolean\n\ttimeout?: number\n\tsource?: \"global\" | \"project\"\n\tprojectPath?: string\n\tinstructions?: string\n}\n\nexport type McpTool = {\n\tname: string\n\tdescription?: string\n\tinputSchema?: object\n\talwaysAllow?: boolean\n\tenabledForPrompt?: boolean\n}\n\nexport type McpResource = {\n\turi: string\n\tname: string\n\tmimeType?: string\n\tdescription?: string\n}\n\nexport type McpResourceTemplate = {\n\turiTemplate: string\n\tname: string\n\tdescription?: string\n\tmimeType?: string\n}\n\nexport type McpResourceResponse = {\n\t_meta?: Record<string, any> // eslint-disable-line @typescript-eslint/no-explicit-any\n\tcontents: Array<{\n\t\turi: string\n\t\tmimeType?: string\n\t\ttext?: string\n\t\tblob?: string\n\t}>\n}\n\nexport type McpToolCallResponse = {\n\t_meta?: Record<string, any> // eslint-disable-line @typescript-eslint/no-explicit-any\n\tcontent: Array<\n\t\t| {\n\t\t\t\ttype: \"text\"\n\t\t\t\ttext: string\n\t\t }\n\t\t| {\n\t\t\t\ttype: \"image\"\n\t\t\t\tdata: string\n\t\t\t\tmimeType: string\n\t\t }\n\t\t| {\n\t\t\t\ttype: \"audio\"\n\t\t\t\tdata: string\n\t\t\t\tmimeType: string\n\t\t }\n\t\t| {\n\t\t\t\ttype: \"resource\"\n\t\t\t\tresource: {\n\t\t\t\t\turi: string\n\t\t\t\t\tmimeType?: string\n\t\t\t\t\ttext?: string\n\t\t\t\t\tblob?: string\n\t\t\t\t}\n\t\t }\n\t>\n\tisError?: boolean\n}\n\nexport type McpErrorEntry = {\n\tmessage: string\n\ttimestamp: number\n\tlevel: \"error\" | \"warn\" | \"info\"\n}\n\n/**\n * Result of counting enabled MCP tools across servers.\n */\nexport interface EnabledMcpToolsCount {\n\t/** Number of enabled and connected MCP servers */\n\tenabledServerCount: number\n\t/** Total number of enabled tools across all enabled servers */\n\tenabledToolCount: number\n}\n\n/**\n * Count the number of enabled MCP tools across all enabled and connected servers.\n * This is a pure function that can be used in both backend and frontend contexts.\n *\n * @param servers - Array of MCP server objects\n * @returns Object with enabledToolCount and enabledServerCount\n *\n * @example\n * const { enabledToolCount, enabledServerCount } = countEnabledMcpTools(mcpServers)\n * if (enabledToolCount > MAX_MCP_TOOLS_THRESHOLD) {\n * // Show warning\n * }\n */\nexport function countEnabledMcpTools(servers: McpServer[]): EnabledMcpToolsCount {\n\tlet serverCount = 0\n\tlet toolCount = 0\n\n\tfor (const server of servers) {\n\t\t// Skip disabled servers\n\t\tif (server.disabled) continue\n\n\t\t// Skip servers that are not connected\n\t\tif (server.status !== \"connected\") continue\n\n\t\tserverCount++\n\n\t\t// Count enabled tools on this server\n\t\tif (server.tools) {\n\t\t\tfor (const tool of server.tools) {\n\t\t\t\t// Tool is enabled if enabledForPrompt is undefined (default) or true\n\t\t\t\tif (tool.enabledForPrompt !== false) {\n\t\t\t\t\ttoolCount++\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { enabledToolCount: toolCount, enabledServerCount: serverCount }\n}\n","import { z } from \"zod\"\n\nimport { RooCodeEventName } from \"./events.js\"\nimport type { RooCodeSettings } from \"./global-settings.js\"\nimport type { ClineMessage, QueuedMessage, TokenUsage } from \"./message.js\"\nimport type { ToolUsage, ToolName } from \"./tool.js\"\nimport type { TodoItem } from \"./todo.js\"\n\n/**\n * TaskProviderLike\n */\n\nexport interface TaskProviderLike {\n\t// Tasks\n\tgetCurrentTask(): TaskLike | undefined\n\tgetRecentTasks(): string[]\n\tcreateTask(\n\t\ttext?: string,\n\t\timages?: string[],\n\t\tparentTask?: TaskLike,\n\t\toptions?: CreateTaskOptions,\n\t\tconfiguration?: RooCodeSettings,\n\t): Promise<TaskLike>\n\tcancelTask(): Promise<void>\n\tclearTask(): Promise<void>\n\tresumeTask(taskId: string): void\n\n\t// Modes\n\tgetModes(): Promise<{ slug: string; name: string }[]>\n\tgetMode(): Promise<string>\n\tsetMode(mode: string): Promise<void>\n\n\t// Provider Profiles\n\tgetProviderProfiles(): Promise<{ name: string; provider?: string }[]>\n\tgetProviderProfile(): Promise<string>\n\tsetProviderProfile(providerProfile: string): Promise<void>\n\n\treadonly cwd: string\n\n\t// Event Emitter\n\ton<K extends keyof TaskProviderEvents>(\n\t\tevent: K,\n\t\tlistener: (...args: TaskProviderEvents[K]) => void | Promise<void>,\n\t): this\n\n\toff<K extends keyof TaskProviderEvents>(\n\t\tevent: K,\n\t\tlistener: (...args: TaskProviderEvents[K]) => void | Promise<void>,\n\t): this\n\n\t// @TODO: Find a better way to do this.\n\tpostStateToWebview(): Promise<void>\n}\n\nexport type TaskProviderEvents = {\n\t[RooCodeEventName.TaskCreated]: [task: TaskLike]\n\t[RooCodeEventName.TaskStarted]: [taskId: string]\n\t[RooCodeEventName.TaskCompleted]: [taskId: string, tokenUsage: TokenUsage, toolUsage: ToolUsage]\n\t[RooCodeEventName.TaskAborted]: [taskId: string]\n\t[RooCodeEventName.TaskFocused]: [taskId: string]\n\t[RooCodeEventName.TaskUnfocused]: [taskId: string]\n\t[RooCodeEventName.TaskActive]: [taskId: string]\n\t[RooCodeEventName.TaskInteractive]: [taskId: string]\n\t[RooCodeEventName.TaskResumable]: [taskId: string]\n\t[RooCodeEventName.TaskIdle]: [taskId: string]\n\n\t[RooCodeEventName.TaskPaused]: [taskId: string]\n\t[RooCodeEventName.TaskUnpaused]: [taskId: string]\n\t[RooCodeEventName.TaskSpawned]: [taskId: string]\n\t[RooCodeEventName.TaskDelegated]: [parentTaskId: string, childTaskId: string]\n\t[RooCodeEventName.TaskDelegationCompleted]: [parentTaskId: string, childTaskId: string, summary: string]\n\t[RooCodeEventName.TaskDelegationResumed]: [parentTaskId: string, childTaskId: string]\n\n\t[RooCodeEventName.TaskUserMessage]: [taskId: string]\n\n\t[RooCodeEventName.TaskTokenUsageUpdated]: [taskId: string, tokenUsage: TokenUsage, toolUsage: ToolUsage]\n\n\t[RooCodeEventName.ModeChanged]: [mode: string]\n\t[RooCodeEventName.ProviderProfileChanged]: [config: { name: string; provider?: string }]\n}\n\n/**\n * TaskLike\n */\n\nexport interface CreateTaskOptions {\n\ttaskId?: string\n\tenableCheckpoints?: boolean\n\tconsecutiveMistakeLimit?: number\n\texperiments?: Record<string, boolean>\n\tinitialTodos?: TodoItem[]\n\t/** Initial status for the task's history item (e.g., \"active\" for child tasks) */\n\tinitialStatus?: \"active\" | \"delegated\" | \"completed\"\n\t/** Whether to start the task loop immediately (default: true).\n\t * When false, the caller must invoke `task.start()` manually. */\n\tstartTask?: boolean\n}\n\nexport enum TaskStatus {\n\tRunning = \"running\",\n\tInteractive = \"interactive\",\n\tResumable = \"resumable\",\n\tIdle = \"idle\",\n\tNone = \"none\",\n}\n\nexport const taskMetadataSchema = z.object({\n\ttask: z.string().optional(),\n\timages: z.array(z.string()).optional(),\n})\n\nexport type TaskMetadata = z.infer<typeof taskMetadataSchema>\n\nexport interface TaskLike {\n\treadonly taskId: string\n\treadonly rootTaskId?: string\n\treadonly parentTaskId?: string\n\treadonly childTaskId?: string\n\treadonly metadata: TaskMetadata\n\treadonly taskStatus: TaskStatus\n\treadonly taskAsk: ClineMessage | undefined\n\treadonly queuedMessages: QueuedMessage[]\n\treadonly tokenUsage: TokenUsage | undefined\n\n\ton<K extends keyof TaskEvents>(event: K, listener: (...args: TaskEvents[K]) => void | Promise<void>): this\n\toff<K extends keyof TaskEvents>(event: K, listener: (...args: TaskEvents[K]) => void | Promise<void>): this\n\n\tapproveAsk(options?: { text?: string; images?: string[] }): void\n\tdenyAsk(options?: { text?: string; images?: string[] }): void\n\tsubmitUserMessage(text: string, images?: string[], mode?: string, providerProfile?: string): Promise<void>\n\tabortTask(): void\n}\n\nexport type TaskEvents = {\n\t// Task Lifecycle\n\t[RooCodeEventName.TaskStarted]: []\n\t[RooCodeEventName.TaskCompleted]: [taskId: string, tokenUsage: TokenUsage, toolUsage: ToolUsage]\n\t[RooCodeEventName.TaskAborted]: []\n\t[RooCodeEventName.TaskFocused]: []\n\t[RooCodeEventName.TaskUnfocused]: []\n\t[RooCodeEventName.TaskActive]: [taskId: string]\n\t[RooCodeEventName.TaskInteractive]: [taskId: string]\n\t[RooCodeEventName.TaskResumable]: [taskId: string]\n\t[RooCodeEventName.TaskIdle]: [taskId: string]\n\n\t// Subtask Lifecycle\n\t[RooCodeEventName.TaskPaused]: [taskId: string]\n\t[RooCodeEventName.TaskUnpaused]: [taskId: string]\n\t[RooCodeEventName.TaskSpawned]: [taskId: string]\n\n\t// Task Execution\n\t[RooCodeEventName.Message]: [{ action: \"created\" | \"updated\"; message: ClineMessage }]\n\t[RooCodeEventName.TaskModeSwitched]: [taskId: string, mode: string]\n\t[RooCodeEventName.TaskAskResponded]: []\n\t[RooCodeEventName.TaskUserMessage]: [taskId: string]\n\t[RooCodeEventName.QueuedMessagesUpdated]: [taskId: string, messages: QueuedMessage[]]\n\n\t// Task Analytics\n\t[RooCodeEventName.TaskToolFailed]: [taskId: string, tool: ToolName, error: string]\n\t[RooCodeEventName.TaskTokenUsageUpdated]: [taskId: string, tokenUsage: TokenUsage, toolUsage: ToolUsage]\n}\n","import { z } from \"zod\"\n\n/**\n * TodoStatus\n */\nexport const todoStatusSchema = z.enum([\"pending\", \"in_progress\", \"completed\"] as const)\n\nexport type TodoStatus = z.infer<typeof todoStatusSchema>\n\n/**\n * TodoItem\n */\nexport const todoItemSchema = z.object({\n\tid: z.string(),\n\tcontent: z.string(),\n\tstatus: todoStatusSchema,\n})\n\nexport type TodoItem = z.infer<typeof todoItemSchema>\n","/**\n * Skill metadata for discovery (loaded at startup)\n * Only name and description are required for now\n */\nexport interface SkillMetadata {\n\tname: string // Required: skill identifier\n\tdescription: string // Required: when to use this skill\n\tpath: string // Absolute path to SKILL.md\n\tsource: \"global\" | \"project\" // Where the skill was discovered\n\t/**\n\t * @deprecated Use modeSlugs instead. Kept for backward compatibility.\n\t * If set, skill is only available in this mode.\n\t */\n\tmode?: string\n\t/**\n\t * Mode slugs where this skill is available.\n\t * - undefined or empty array means the skill is available in all modes (\"Any mode\").\n\t * - An array with one or more mode slugs restricts the skill to those modes.\n\t */\n\tmodeSlugs?: string[]\n}\n\n/**\n * Skill name validation constants per agentskills.io specification:\n * https://agentskills.io/specification\n *\n * Name constraints:\n * - 1-64 characters\n * - Lowercase letters, numbers, and hyphens only\n * - Must not start or end with a hyphen\n * - Must not contain consecutive hyphens\n */\nexport const SKILL_NAME_MIN_LENGTH = 1\nexport const SKILL_NAME_MAX_LENGTH = 64\n\n/**\n * Regex pattern for valid skill names.\n * Matches: lowercase letters/numbers, optionally followed by groups of hyphen + lowercase letters/numbers.\n * This ensures no leading/trailing hyphens and no consecutive hyphens.\n */\nexport const SKILL_NAME_REGEX = /^[a-z0-9]+(?:-[a-z0-9]+)*$/\n\n/**\n * Error codes for skill name validation.\n * These can be mapped to translation keys in the frontend or error messages in the backend.\n */\nexport enum SkillNameValidationError {\n\tEmpty = \"empty\",\n\tTooLong = \"too_long\",\n\tInvalidFormat = \"invalid_format\",\n}\n\n/**\n * Result of skill name validation.\n */\nexport interface SkillNameValidationResult {\n\tvalid: boolean\n\terror?: SkillNameValidationError\n}\n\n/**\n * Validate a skill name according to agentskills.io specification.\n *\n * @param name - The skill name to validate\n * @returns Validation result with error code if invalid\n */\nexport function validateSkillName(name: string): SkillNameValidationResult {\n\tif (!name || name.length < SKILL_NAME_MIN_LENGTH) {\n\t\treturn { valid: false, error: SkillNameValidationError.Empty }\n\t}\n\n\tif (name.length > SKILL_NAME_MAX_LENGTH) {\n\t\treturn { valid: false, error: SkillNameValidationError.TooLong }\n\t}\n\n\tif (!SKILL_NAME_REGEX.test(name)) {\n\t\treturn { valid: false, error: SkillNameValidationError.InvalidFormat }\n\t}\n\n\treturn { valid: true }\n}\n","import { z } from \"zod\"\n\n/**\n * CommandExecutionStatus\n */\n\nexport const commandExecutionStatusSchema = z.discriminatedUnion(\"status\", [\n\tz.object({\n\t\texecutionId: z.string(),\n\t\tstatus: z.literal(\"started\"),\n\t\tpid: z.number().optional(),\n\t\tcommand: z.string(),\n\t}),\n\tz.object({\n\t\texecutionId: z.string(),\n\t\tstatus: z.literal(\"output\"),\n\t\toutput: z.string(),\n\t}),\n\tz.object({\n\t\texecutionId: z.string(),\n\t\tstatus: z.literal(\"exited\"),\n\t\texitCode: z.number().optional(),\n\t}),\n\tz.object({\n\t\texecutionId: z.string(),\n\t\tstatus: z.literal(\"fallback\"),\n\t}),\n\tz.object({\n\t\texecutionId: z.string(),\n\t\tstatus: z.literal(\"timeout\"),\n\t}),\n])\n\nexport type CommandExecutionStatus = z.infer<typeof commandExecutionStatusSchema>\n\n/**\n * PersistedCommandOutput\n *\n * Represents the result of a terminal command execution that may have been\n * truncated and persisted to disk.\n *\n * When command output exceeds the configured preview threshold, the full\n * output is saved to a disk artifact file. The LLM receives this structure\n * which contains:\n * - A preview of the output (for immediate display in context)\n * - Metadata about the full output (size, truncation status)\n * - A path to the artifact file for later retrieval via `read_command_output`\n *\n * ## Usage in execute_command Response\n *\n * The response format depends on whether truncation occurred:\n *\n * **Not truncated** (output fits in preview):\n * ```json\n * {\n * \"preview\": \"full output here...\",\n * \"totalBytes\": 1234,\n * \"artifactPath\": null,\n * \"truncated\": false\n * }\n * ```\n *\n * **Truncated** (output exceeded threshold):\n * ```json\n * {\n * \"preview\": \"first 4KB of output...\",\n * \"totalBytes\": 1048576,\n * \"artifactPath\": \"/path/to/tasks/123/command-output/cmd-1706119234567.txt\",\n * \"truncated\": true\n * }\n * ```\n *\n * @see OutputInterceptor - Creates these results during command execution\n * @see ReadCommandOutputTool - Retrieves full content from artifact files\n */\nexport interface PersistedCommandOutput {\n\t/**\n\t * Preview of the command output, truncated to the preview threshold.\n\t * Always contains the beginning of the output, even if truncated.\n\t */\n\tpreview: string\n\n\t/**\n\t * Total size of the command output in bytes.\n\t * Useful for determining if additional reads are needed.\n\t */\n\ttotalBytes: number\n\n\t/**\n\t * Absolute path to the artifact file containing full output.\n\t * `null` if output wasn't truncated (no artifact was created).\n\t */\n\tartifactPath: string | null\n\n\t/**\n\t * Whether the output was truncated (exceeded preview threshold).\n\t * When `true`, use `read_command_output` to retrieve full content.\n\t */\n\ttruncated: boolean\n}\n","/**\n * Tool parameter type definitions for native protocol\n */\n\n/**\n * Read mode for the read_file tool.\n * - \"slice\": Simple offset/limit reading (default)\n * - \"indentation\": Semantic block extraction based on code structure\n */\nexport type ReadFileMode = \"slice\" | \"indentation\"\n\n/**\n * Indentation-mode configuration for the read_file tool.\n */\nexport interface IndentationParams {\n\t/** 1-based line number to anchor indentation extraction (defaults to offset) */\n\tanchor_line?: number\n\t/** Maximum indentation levels to include above anchor (0 = unlimited) */\n\tmax_levels?: number\n\t/** Include sibling blocks at the same indentation level */\n\tinclude_siblings?: boolean\n\t/** Include file header (imports, comments at top) */\n\tinclude_header?: boolean\n\t/** Hard cap on lines returned for indentation mode */\n\tmax_lines?: number\n}\n\n/**\n * Parameters for the read_file tool (new format).\n *\n * NOTE: This is the canonical, single-file-per-call shape.\n */\nexport interface ReadFileParams {\n\t/** Path to the file, relative to workspace */\n\tpath: string\n\t/** Reading mode: \"slice\" (default) or \"indentation\" */\n\tmode?: ReadFileMode\n\t/** 1-based line number to start reading from (slice mode, default: 1) */\n\toffset?: number\n\t/** Maximum number of lines to read (default: 2000) */\n\tlimit?: number\n\t/** Indentation-mode configuration (only used when mode === \"indentation\") */\n\tindentation?: IndentationParams\n}\n\n// ─── Legacy Format Types (Backward Compatibility) ─────────────────────────────\n\n/**\n * Line range specification for legacy read_file format.\n * Represents a contiguous range of lines [start, end] (1-based, inclusive).\n */\nexport interface LineRange {\n\tstart: number\n\tend: number\n}\n\n/**\n * File entry for legacy read_file format.\n * Supports reading multiple disjoint line ranges from a single file.\n */\nexport interface FileEntry {\n\t/** Path to the file, relative to workspace */\n\tpath: string\n\t/** Optional list of line ranges to read (if omitted, reads entire file) */\n\tlineRanges?: LineRange[]\n}\n\n/**\n * Legacy parameters for the read_file tool (pre-refactor format).\n * Supports reading multiple files in a single call with optional line ranges.\n *\n * @deprecated Use ReadFileParams instead. This format is maintained for\n * backward compatibility with existing chat histories.\n */\nexport interface LegacyReadFileParams {\n\t/** Array of file entries to read */\n\tfiles: FileEntry[]\n\t/** Discriminant flag for type narrowing */\n\t_legacyFormat: true\n}\n\n/**\n * Union type for read_file tool parameters.\n * Supports both new single-file format and legacy multi-file format.\n */\nexport type ReadFileToolParams = ReadFileParams | LegacyReadFileParams\n\n/**\n * Type guard to check if params are in legacy format.\n */\nexport function isLegacyReadFileParams(params: ReadFileToolParams): params is LegacyReadFileParams {\n\treturn \"_legacyFormat\" in params && params._legacyFormat === true\n}\n\nexport interface Coordinate {\n\tx: number\n\ty: number\n}\n\nexport interface Size {\n\twidth: number\n\theight: number\n}\n\nexport interface GenerateImageParams {\n\tprompt: string\n\tpath: string\n\timage?: string\n}\n","/**\n * TS\n */\n\nexport type Keys<T> = keyof T\n\nexport type Values<T> = T[keyof T]\n\nexport type Equals<X, Y> = (<T>() => T extends X ? 1 : 2) extends <T>() => T extends Y ? 1 : 2 ? true : false\n\nexport type AssertEqual<T extends true> = T\n","import { z } from \"zod\"\n\nimport type { GlobalSettings, RooCodeSettings } from \"./global-settings.js\"\nimport type { ProviderSettings, ProviderSettingsEntry } from \"./provider-settings.js\"\nimport type { HistoryItem } from \"./history.js\"\nimport type { ModeConfig, PromptComponent } from \"./mode.js\"\nimport type { Experiments } from \"./experiment.js\"\nimport type { ClineMessage, QueuedMessage } from \"./message.js\"\nimport type { TodoItem } from \"./todo.js\"\nimport type { OrganizationAllowList } from \"./organization.js\"\nimport type { SerializedCustomToolDefinition } from \"./custom-tool.js\"\nimport type { GitCommit } from \"./git.js\"\nimport type { McpServer } from \"./mcp.js\"\nimport type { ModelRecord, RouterModels } from \"./model.js\"\nimport type { OpenAiCodexRateLimitInfo } from \"./providers/openai-codex-rate-limits.js\"\nimport type { SkillMetadata } from \"./skills.js\"\nimport type { WorktreeIncludeStatus } from \"./worktree.js\"\n\n/**\n * ExtensionMessage\n * Extension -> Webview | CLI\n */\nexport interface ExtensionMessage {\n\ttype:\n\t\t| \"action\"\n\t\t| \"state\"\n\t\t| \"taskHistoryUpdated\"\n\t\t| \"taskHistoryItemUpdated\"\n\t\t| \"selectedImages\"\n\t\t| \"theme\"\n\t\t| \"workspaceUpdated\"\n\t\t| \"invoke\"\n\t\t| \"messageUpdated\"\n\t\t| \"mcpServers\"\n\t\t| \"enhancedPrompt\"\n\t\t| \"commitSearchResults\"\n\t\t| \"listApiConfig\"\n\t\t| \"routerModels\"\n\t\t| \"openAiModels\"\n\t\t| \"ollamaModels\"\n\t\t| \"lmStudioModels\"\n\t\t| \"vsCodeLmModels\"\n\t\t| \"vsCodeLmApiAvailable\"\n\t\t| \"updatePrompt\"\n\t\t| \"systemPrompt\"\n\t\t| \"autoApprovalEnabled\"\n\t\t| \"updateCustomMode\"\n\t\t| \"deleteCustomMode\"\n\t\t| \"exportModeResult\"\n\t\t| \"importModeResult\"\n\t\t| \"checkRulesDirectoryResult\"\n\t\t| \"deleteCustomModeCheck\"\n\t\t| \"currentCheckpointUpdated\"\n\t\t| \"checkpointInitWarning\"\n\t\t| \"ttsStart\"\n\t\t| \"ttsStop\"\n\t\t| \"fileSearchResults\"\n\t\t| \"toggleApiConfigPin\"\n\t\t| \"acceptInput\"\n\t\t| \"setHistoryPreviewCollapsed\"\n\t\t| \"commandExecutionStatus\"\n\t\t| \"mcpExecutionStatus\"\n\t\t| \"vsCodeSetting\"\n\t\t| \"authenticatedUser\"\n\t\t| \"condenseTaskContextStarted\"\n\t\t| \"condenseTaskContextResponse\"\n\t\t| \"singleRouterModelFetchResponse\"\n\t\t| \"rooCreditBalance\"\n\t\t| \"indexingStatusUpdate\"\n\t\t| \"indexCleared\"\n\t\t| \"codebaseIndexConfig\"\n\t\t| \"codeIndexSettingsSaved\"\n\t\t| \"codeIndexSecretStatus\"\n\t\t| \"showDeleteMessageDialog\"\n\t\t| \"showEditMessageDialog\"\n\t\t| \"commands\"\n\t\t| \"insertTextIntoTextarea\"\n\t\t| \"dismissedUpsells\"\n\t\t| \"interactionRequired\"\n\t\t| \"customToolsResult\"\n\t\t| \"modes\"\n\t\t| \"taskWithAggregatedCosts\"\n\t\t| \"openAiCodexRateLimits\"\n\t\t// Worktree response types\n\t\t| \"worktreeList\"\n\t\t| \"worktreeResult\"\n\t\t| \"worktreeCopyProgress\"\n\t\t| \"branchList\"\n\t\t| \"worktreeDefaults\"\n\t\t| \"worktreeIncludeStatus\"\n\t\t| \"branchWorktreeIncludeResult\"\n\t\t| \"folderSelected\"\n\t\t| \"skills\"\n\t\t| \"fileContent\"\n\ttext?: string\n\t/** For fileContent: { path, content, error? } */\n\tfileContent?: { path: string; content: string | null; error?: string }\n\tpayload?: any // eslint-disable-line @typescript-eslint/no-explicit-any\n\tcheckpointWarning?: {\n\t\ttype: \"WAIT_TIMEOUT\" | \"INIT_TIMEOUT\"\n\t\ttimeout: number\n\t}\n\taction?:\n\t\t| \"chatButtonClicked\"\n\t\t| \"settingsButtonClicked\"\n\t\t| \"historyButtonClicked\"\n\t\t| \"didBecomeVisible\"\n\t\t| \"focusInput\"\n\t\t| \"switchTab\"\n\t\t| \"toggleAutoApprove\"\n\tinvoke?: \"newChat\" | \"sendMessage\" | \"primaryButtonClick\" | \"secondaryButtonClick\" | \"setChatBoxMessage\"\n\t/**\n\t * Partial state updates are allowed to reduce message size (e.g. omit large fields like taskHistory).\n\t * The webview is responsible for merging.\n\t */\n\tstate?: Partial<ExtensionState>\n\timages?: string[]\n\tfilePaths?: string[]\n\topenedTabs?: Array<{\n\t\tlabel: string\n\t\tisActive: boolean\n\t\tpath?: string\n\t}>\n\tclineMessage?: ClineMessage\n\trouterModels?: RouterModels\n\topenAiModels?: string[]\n\tollamaModels?: ModelRecord\n\tlmStudioModels?: ModelRecord\n\tvsCodeLmModels?: { vendor?: string; family?: string; version?: string; id?: string }[]\n\tmcpServers?: McpServer[]\n\tcommits?: GitCommit[]\n\tlistApiConfig?: ProviderSettingsEntry[]\n\tmode?: string\n\tcustomMode?: ModeConfig\n\tslug?: string\n\tsuccess?: boolean\n\t/** Generic payload for extension messages that use `values` */\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tvalues?: Record<string, any>\n\trequestId?: string\n\tpromptText?: string\n\tresults?:\n\t\t| { path: string; type: \"file\" | \"folder\"; label?: string }[]\n\t\t| { name: string; description?: string; argumentHint?: string; source: \"global\" | \"project\" | \"built-in\" }[]\n\terror?: string\n\tsetting?: string\n\tvalue?: any // eslint-disable-line @typescript-eslint/no-explicit-any\n\thasContent?: boolean\n\torganizationAllowList?: OrganizationAllowList\n\ttab?: string\n\terrors?: string[]\n\trulesFolderPath?: string\n\tsettings?: any // eslint-disable-line @typescript-eslint/no-explicit-any\n\tmessageTs?: number\n\thasCheckpoint?: boolean\n\tcontext?: string\n\tcommands?: Command[]\n\tqueuedMessages?: QueuedMessage[]\n\tlist?: string[] // For dismissedUpsells\n\ttools?: SerializedCustomToolDefinition[] // For customToolsResult\n\tskills?: SkillMetadata[] // For skills response\n\tmodes?: { slug: string; name: string }[] // For modes response\n\taggregatedCosts?: {\n\t\t// For taskWithAggregatedCosts response\n\t\ttotalCost: number\n\t\townCost: number\n\t\tchildrenCost: number\n\t}\n\thistoryItem?: HistoryItem\n\ttaskHistory?: HistoryItem[] // For taskHistoryUpdated: full sorted task history\n\t/** For taskHistoryItemUpdated: single updated/added history item */\n\ttaskHistoryItem?: HistoryItem\n\t// Worktree response properties\n\tworktrees?: Array<{\n\t\tpath: string\n\t\tbranch: string\n\t\tcommitHash: string\n\t\tisCurrent: boolean\n\t\tisBare: boolean\n\t\tisDetached: boolean\n\t\tisLocked: boolean\n\t\tlockReason?: string\n\t}>\n\tisGitRepo?: boolean\n\tisMultiRoot?: boolean\n\tisSubfolder?: boolean\n\tgitRootPath?: string\n\tworktreeResult?: {\n\t\tsuccess: boolean\n\t\tmessage: string\n\t\tworktree?: {\n\t\t\tpath: string\n\t\t\tbranch: string\n\t\t\tcommitHash: string\n\t\t\tisCurrent: boolean\n\t\t\tisBare: boolean\n\t\t\tisDetached: boolean\n\t\t\tisLocked: boolean\n\t\t\tlockReason?: string\n\t\t}\n\t}\n\tlocalBranches?: string[]\n\tremoteBranches?: string[]\n\tcurrentBranch?: string\n\tsuggestedBranch?: string\n\tsuggestedPath?: string\n\tworktreeIncludeExists?: boolean\n\tworktreeIncludeStatus?: WorktreeIncludeStatus\n\thasGitignore?: boolean\n\tgitignoreContent?: string\n\t// branchWorktreeIncludeResult\n\tbranch?: string\n\thasWorktreeInclude?: boolean\n\t// worktreeCopyProgress (size-based)\n\tcopyProgressBytesCopied?: number\n\tcopyProgressTotalBytes?: number\n\tcopyProgressItemName?: string\n\t// folderSelected\n\tpath?: string\n}\n\nexport interface OpenAiCodexRateLimitsMessage {\n\ttype: \"openAiCodexRateLimits\"\n\tvalues?: OpenAiCodexRateLimitInfo\n\terror?: string\n}\n\nexport type ExtensionState = Pick<\n\tGlobalSettings,\n\t| \"currentApiConfigName\"\n\t| \"listApiConfigMeta\"\n\t| \"pinnedApiConfigs\"\n\t| \"customInstructions\"\n\t| \"dismissedUpsells\"\n\t| \"autoApprovalEnabled\"\n\t| \"alwaysAllowReadOnly\"\n\t| \"alwaysAllowReadOnlyOutsideWorkspace\"\n\t| \"alwaysAllowWrite\"\n\t| \"alwaysAllowWriteOutsideWorkspace\"\n\t| \"alwaysAllowWriteProtected\"\n\t| \"alwaysAllowMcp\"\n\t| \"alwaysAllowModeSwitch\"\n\t| \"alwaysAllowSubtasks\"\n\t| \"alwaysAllowFollowupQuestions\"\n\t| \"alwaysAllowExecute\"\n\t| \"followupAutoApproveTimeoutMs\"\n\t| \"allowedCommands\"\n\t| \"deniedCommands\"\n\t| \"allowedMaxRequests\"\n\t| \"allowedMaxCost\"\n\t| \"ttsEnabled\"\n\t| \"ttsSpeed\"\n\t| \"soundEnabled\"\n\t| \"soundVolume\"\n\t| \"terminalOutputPreviewSize\"\n\t| \"terminalShellIntegrationTimeout\"\n\t| \"terminalShellIntegrationDisabled\"\n\t| \"terminalCommandDelay\"\n\t| \"terminalPowershellCounter\"\n\t| \"terminalZshClearEolMark\"\n\t| \"terminalZshOhMy\"\n\t| \"terminalZshP10k\"\n\t| \"terminalZdotdir\"\n\t| \"execaShellPath\"\n\t| \"diagnosticsEnabled\"\n\t| \"language\"\n\t| \"modeApiConfigs\"\n\t| \"customModePrompts\"\n\t| \"customSupportPrompts\"\n\t| \"enhancementApiConfigId\"\n\t| \"customCondensingPrompt\"\n\t| \"codebaseIndexConfig\"\n\t| \"codebaseIndexModels\"\n\t| \"profileThresholds\"\n\t| \"includeDiagnosticMessages\"\n\t| \"maxDiagnosticMessages\"\n\t| \"imageGenerationProvider\"\n\t| \"openRouterImageGenerationSelectedModel\"\n\t| \"includeTaskHistoryInEnhance\"\n\t| \"reasoningBlockCollapsed\"\n\t| \"enterBehavior\"\n\t| \"includeCurrentTime\"\n\t| \"includeCurrentCost\"\n\t| \"maxGitStatusFiles\"\n\t| \"requestDelaySeconds\"\n\t| \"showWorktreesInHomeScreen\"\n\t| \"disabledTools\"\n> & {\n\tlockApiConfigAcrossModes?: boolean\n\tversion: string\n\tclineMessages: ClineMessage[]\n\tcurrentTaskId?: string\n\tcurrentTaskItem?: HistoryItem\n\tcurrentTaskTodos?: TodoItem[] // Initial todos for the current task\n\tapiConfiguration: ProviderSettings\n\turiScheme?: string\n\tshouldShowAnnouncement: boolean\n\n\ttaskHistory: HistoryItem[]\n\n\twriteDelayMs: number\n\n\tenableCheckpoints: boolean\n\tcheckpointTimeout: number // Timeout for checkpoint initialization in seconds (default: 15)\n\tmaxOpenTabsContext: number // Maximum number of VSCode open tabs to include in context (0-500)\n\tmaxWorkspaceFiles: number // Maximum number of files to include in current working directory details (0-500)\n\tshowRooIgnoredFiles: boolean // Whether to show .rooignore'd files in listings\n\tenableSubfolderRules: boolean // Whether to load rules from subdirectories\n\tmaxReadFileLine?: number // Maximum line limit for read_file tool (-1 for default)\n\tmaxImageFileSize: number // Maximum size of image files to process in MB\n\tmaxTotalImageSize: number // Maximum total size for all images in a single read operation in MB\n\n\texperiments: Experiments // Map of experiment IDs to their enabled state\n\n\tmcpEnabled: boolean\n\n\tmode: string\n\tcustomModes: ModeConfig[]\n\ttoolRequirements?: Record<string, boolean> // Map of tool names to their requirements (e.g. {\"apply_diff\": true})\n\n\tcwd?: string // Current working directory\n\trenderContext: \"sidebar\" | \"editor\"\n\tsettingsImportedAt?: number\n\thistoryPreviewCollapsed?: boolean\n\n\torganizationAllowList: OrganizationAllowList\n\n\tautoCondenseContext: boolean\n\tautoCondenseContextPercent: number\n\tprofileThresholds: Record<string, number>\n\thasOpenedModeSelector: boolean\n\topenRouterImageApiKey?: string\n\tmessageQueue?: QueuedMessage[]\n\tlastShownAnnouncementId?: string\n\tapiModelId?: string\n\tmcpServers?: McpServer[]\n\topenAiCodexIsAuthenticated?: boolean\n\tdebug?: boolean\n\n\t/**\n\t * Monotonically increasing sequence number for clineMessages state pushes.\n\t * When present, the frontend should only apply clineMessages from a state push\n\t * if its seq is greater than the last applied seq. This prevents stale state\n\t * (captured during async getStateToPostToWebview) from overwriting newer messages.\n\t */\n\tclineMessagesSeq?: number\n}\n\nexport interface Command {\n\tname: string\n\tsource: \"global\" | \"project\" | \"built-in\"\n\tfilePath?: string\n\tdescription?: string\n\targumentHint?: string\n}\n\n/**\n * WebviewMessage\n * Webview | CLI -> Extension\n */\n\nexport type ClineAskResponse = \"yesButtonClicked\" | \"noButtonClicked\" | \"messageResponse\" | \"objectResponse\"\n\nexport type AudioType = \"notification\" | \"celebration\" | \"progress_loop\"\n\nexport interface UpdateTodoListPayload {\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\ttodos: any[]\n}\n\nexport type EditQueuedMessagePayload = Pick<QueuedMessage, \"id\" | \"text\" | \"images\">\n\nexport interface WebviewMessage {\n\ttype:\n\t\t| \"updateTodoList\"\n\t\t| \"deleteMultipleTasksWithIds\"\n\t\t| \"currentApiConfigName\"\n\t\t| \"saveApiConfiguration\"\n\t\t| \"upsertApiConfiguration\"\n\t\t| \"deleteApiConfiguration\"\n\t\t| \"loadApiConfiguration\"\n\t\t| \"loadApiConfigurationById\"\n\t\t| \"renameApiConfiguration\"\n\t\t| \"getListApiConfiguration\"\n\t\t| \"customInstructions\"\n\t\t| \"webviewDidLaunch\"\n\t\t| \"newTask\"\n\t\t| \"askResponse\"\n\t\t| \"terminalOperation\"\n\t\t| \"clearTask\"\n\t\t| \"didShowAnnouncement\"\n\t\t| \"selectImages\"\n\t\t| \"exportCurrentTask\"\n\t\t| \"showTaskWithId\"\n\t\t| \"deleteTaskWithId\"\n\t\t| \"exportTaskWithId\"\n\t\t| \"importSettings\"\n\t\t| \"exportSettings\"\n\t\t| \"resetState\"\n\t\t| \"flushRouterModels\"\n\t\t| \"requestRouterModels\"\n\t\t| \"requestOpenAiModels\"\n\t\t| \"requestOllamaModels\"\n\t\t| \"requestLmStudioModels\"\n\t\t| \"requestVsCodeLmModels\"\n\t\t| \"openImage\"\n\t\t| \"saveImage\"\n\t\t| \"openFile\"\n\t\t| \"readFileContent\"\n\t\t| \"openMention\"\n\t\t| \"cancelTask\"\n\t\t| \"cancelAutoApproval\"\n\t\t| \"updateVSCodeSetting\"\n\t\t| \"getVSCodeSetting\"\n\t\t| \"vsCodeSetting\"\n\t\t| \"updateCondensingPrompt\"\n\t\t| \"playSound\"\n\t\t| \"playTts\"\n\t\t| \"stopTts\"\n\t\t| \"ttsEnabled\"\n\t\t| \"ttsSpeed\"\n\t\t| \"openKeyboardShortcuts\"\n\t\t| \"openMcpSettings\"\n\t\t| \"openProjectMcpSettings\"\n\t\t| \"restartMcpServer\"\n\t\t| \"refreshAllMcpServers\"\n\t\t| \"toggleToolAlwaysAllow\"\n\t\t| \"toggleToolEnabledForPrompt\"\n\t\t| \"toggleMcpServer\"\n\t\t| \"updateMcpTimeout\"\n\t\t| \"enhancePrompt\"\n\t\t| \"enhancedPrompt\"\n\t\t| \"draggedImages\"\n\t\t| \"deleteMessage\"\n\t\t| \"deleteMessageConfirm\"\n\t\t| \"submitEditedMessage\"\n\t\t| \"editMessageConfirm\"\n\t\t| \"searchCommits\"\n\t\t| \"setApiConfigPassword\"\n\t\t| \"mode\"\n\t\t| \"updatePrompt\"\n\t\t| \"getSystemPrompt\"\n\t\t| \"copySystemPrompt\"\n\t\t| \"systemPrompt\"\n\t\t| \"enhancementApiConfigId\"\n\t\t| \"autoApprovalEnabled\"\n\t\t| \"updateCustomMode\"\n\t\t| \"deleteCustomMode\"\n\t\t| \"setopenAiCustomModelInfo\"\n\t\t| \"openCustomModesSettings\"\n\t\t| \"checkpointDiff\"\n\t\t| \"checkpointRestore\"\n\t\t| \"deleteMcpServer\"\n\t\t| \"codebaseIndexEnabled\"\n\t\t| \"searchFiles\"\n\t\t| \"toggleApiConfigPin\"\n\t\t| \"hasOpenedModeSelector\"\n\t\t| \"lockApiConfigAcrossModes\"\n\t\t| \"openAiCodexSignIn\"\n\t\t| \"openAiCodexSignOut\"\n\t\t| \"condenseTaskContextRequest\"\n\t\t| \"requestIndexingStatus\"\n\t\t| \"startIndexing\"\n\t\t| \"stopIndexing\"\n\t\t| \"clearIndexData\"\n\t\t| \"indexingStatusUpdate\"\n\t\t| \"indexCleared\"\n\t\t| \"toggleWorkspaceIndexing\"\n\t\t| \"setAutoEnableDefault\"\n\t\t| \"focusPanelRequest\"\n\t\t| \"openExternal\"\n\t\t| \"switchTab\"\n\t\t| \"exportMode\"\n\t\t| \"exportModeResult\"\n\t\t| \"importMode\"\n\t\t| \"importModeResult\"\n\t\t| \"checkRulesDirectory\"\n\t\t| \"checkRulesDirectoryResult\"\n\t\t| \"saveCodeIndexSettingsAtomic\"\n\t\t| \"requestCodeIndexSecretStatus\"\n\t\t| \"requestCommands\"\n\t\t| \"openCommandFile\"\n\t\t| \"deleteCommand\"\n\t\t| \"createCommand\"\n\t\t| \"insertTextIntoTextarea\"\n\t\t| \"imageGenerationSettings\"\n\t\t| \"queueMessage\"\n\t\t| \"removeQueuedMessage\"\n\t\t| \"editQueuedMessage\"\n\t\t| \"dismissUpsell\"\n\t\t| \"getDismissedUpsells\"\n\t\t| \"openMarkdownPreview\"\n\t\t| \"updateSettings\"\n\t\t| \"allowedCommands\"\n\t\t| \"getTaskWithAggregatedCosts\"\n\t\t| \"deniedCommands\"\n\t\t| \"openDebugApiHistory\"\n\t\t| \"openDebugUiHistory\"\n\t\t| \"downloadErrorDiagnostics\"\n\t\t| \"requestOpenAiCodexRateLimits\"\n\t\t| \"refreshCustomTools\"\n\t\t| \"requestModes\"\n\t\t| \"switchMode\"\n\t\t| \"debugSetting\"\n\t\t// Worktree messages\n\t\t| \"listWorktrees\"\n\t\t| \"createWorktree\"\n\t\t| \"deleteWorktree\"\n\t\t| \"switchWorktree\"\n\t\t| \"getAvailableBranches\"\n\t\t| \"getWorktreeDefaults\"\n\t\t| \"getWorktreeIncludeStatus\"\n\t\t| \"checkBranchWorktreeInclude\"\n\t\t| \"createWorktreeInclude\"\n\t\t| \"checkoutBranch\"\n\t\t| \"browseForWorktreePath\"\n\t\t// Skills messages\n\t\t| \"requestSkills\"\n\t\t| \"createSkill\"\n\t\t| \"deleteSkill\"\n\t\t| \"moveSkill\"\n\t\t| \"updateSkillModes\"\n\t\t| \"openSkillFile\"\n\ttext?: string\n\ttaskId?: string\n\teditedMessageContent?: string\n\ttab?: \"settings\" | \"history\" | \"mcp\" | \"modes\" | \"chat\"\n\tdisabled?: boolean\n\tcontext?: string\n\tdataUri?: string\n\taskResponse?: ClineAskResponse\n\tapiConfiguration?: ProviderSettings\n\timages?: string[]\n\tbool?: boolean\n\tvalue?: number\n\tstepIndex?: number\n\tisLaunchAction?: boolean\n\tforceShow?: boolean\n\tcommands?: string[]\n\taudioType?: AudioType\n\tserverName?: string\n\ttoolName?: string\n\talwaysAllow?: boolean\n\tisEnabled?: boolean\n\tmode?: string\n\tpromptMode?: string | \"enhance\"\n\tcustomPrompt?: PromptComponent\n\tdataUrls?: string[]\n\t/** Generic payload for webview messages that use `values` */\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tvalues?: Record<string, any>\n\tquery?: string\n\tsetting?: string\n\tslug?: string\n\tmodeConfig?: ModeConfig\n\ttimeout?: number\n\tpayload?: WebViewMessagePayload\n\tsource?: \"global\" | \"project\"\n\tskillName?: string // For skill operations (createSkill, deleteSkill, moveSkill, openSkillFile)\n\t/** @deprecated Use skillModeSlugs instead */\n\tskillMode?: string // For skill operations (current mode restriction)\n\t/** @deprecated Use newSkillModeSlugs instead */\n\tnewSkillMode?: string // For moveSkill (target mode)\n\tskillDescription?: string // For createSkill (skill description)\n\t/** Mode slugs for skill operations. undefined/empty = any mode */\n\tskillModeSlugs?: string[] // For skill operations (mode restrictions)\n\t/** Target mode slugs for updateSkillModes */\n\tnewSkillModeSlugs?: string[] // For updateSkillModes (new mode restrictions)\n\trequestId?: string\n\tids?: string[]\n\tterminalOperation?: \"continue\" | \"abort\"\n\tmessageTs?: number\n\trestoreCheckpoint?: boolean\n\thistoryPreviewCollapsed?: boolean\n\tfilters?: { type?: string; search?: string; tags?: string[] }\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tsettings?: any\n\turl?: string // For openExternal\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tconfig?: Record<string, any> // Add config to the payload\n\thasContent?: boolean // For checkRulesDirectoryResult\n\tcheckOnly?: boolean // For deleteCustomMode check\n\tupsellId?: string // For dismissUpsell\n\tlist?: string[] // For dismissedUpsells response\n\torganizationId?: string | null // For organization switching\n\tcodeIndexSettings?: {\n\t\t// Global state settings\n\t\tcodebaseIndexEnabled: boolean\n\t\tcodebaseIndexQdrantUrl: string\n\t\tcodebaseIndexEmbedderProvider:\n\t\t\t| \"openai\"\n\t\t\t| \"ollama\"\n\t\t\t| \"openai-compatible\"\n\t\t\t| \"gemini\"\n\t\t\t| \"mistral\"\n\t\t\t| \"vercel-ai-gateway\"\n\t\t\t| \"bedrock\"\n\t\t\t| \"openrouter\"\n\t\tcodebaseIndexEmbedderBaseUrl?: string\n\t\tcodebaseIndexEmbedderModelId: string\n\t\tcodebaseIndexEmbedderModelDimension?: number // Generic dimension for all providers\n\t\tcodebaseIndexOpenAiCompatibleBaseUrl?: string\n\t\tcodebaseIndexBedrockRegion?: string\n\t\tcodebaseIndexBedrockProfile?: string\n\t\tcodebaseIndexSearchMaxResults?: number\n\t\tcodebaseIndexSearchMinScore?: number\n\t\tcodebaseIndexOpenRouterSpecificProvider?: string // OpenRouter provider routing\n\n\t\t// Secret settings\n\t\tcodeIndexOpenAiKey?: string\n\t\tcodeIndexQdrantApiKey?: string\n\t\tcodebaseIndexOpenAiCompatibleApiKey?: string\n\t\tcodebaseIndexGeminiApiKey?: string\n\t\tcodebaseIndexMistralApiKey?: string\n\t\tcodebaseIndexVercelAiGatewayApiKey?: string\n\t\tcodebaseIndexOpenRouterApiKey?: string\n\t}\n\tupdatedSettings?: RooCodeSettings\n\t/** Task configuration applied via `createTask()`. */\n\ttaskConfiguration?: RooCodeSettings\n\t// Worktree properties\n\tworktreePath?: string\n\tworktreeBranch?: string\n\tworktreeBaseBranch?: string\n\tworktreeCreateNewBranch?: boolean\n\tworktreeForce?: boolean\n\tworktreeNewWindow?: boolean\n\tworktreeIncludeContent?: string\n}\n\nexport interface RequestOpenAiCodexRateLimitsMessage {\n\ttype: \"requestOpenAiCodexRateLimits\"\n}\n\nexport const checkoutDiffPayloadSchema = z.object({\n\tts: z.number().optional(),\n\tpreviousCommitHash: z.string().optional(),\n\tcommitHash: z.string(),\n\tmode: z.enum([\"full\", \"checkpoint\", \"from-init\", \"to-current\"]),\n})\n\nexport type CheckpointDiffPayload = z.infer<typeof checkoutDiffPayloadSchema>\n\nexport const checkoutRestorePayloadSchema = z.object({\n\tts: z.number(),\n\tcommitHash: z.string(),\n\tmode: z.enum([\"preview\", \"restore\"]),\n})\n\nexport type CheckpointRestorePayload = z.infer<typeof checkoutRestorePayloadSchema>\n\nexport interface IndexingStatusPayload {\n\tstate: \"Standby\" | \"Indexing\" | \"Indexed\" | \"Error\" | \"Stopping\"\n\tmessage: string\n}\n\nexport interface IndexClearedPayload {\n\tsuccess: boolean\n\terror?: string\n}\n\nexport type WebViewMessagePayload =\n\t| CheckpointDiffPayload\n\t| CheckpointRestorePayload\n\t| IndexingStatusPayload\n\t| IndexClearedPayload\n\t| UpdateTodoListPayload\n\t| EditQueuedMessagePayload\n\nexport interface IndexingStatus {\n\tsystemStatus: string\n\tmessage?: string\n\tprocessedItems: number\n\ttotalItems: number\n\tcurrentItemUnit?: string\n\tworkspacePath?: string\n\tworkspaceEnabled?: boolean\n\tautoEnableDefault?: boolean\n}\n\nexport interface IndexingStatusUpdateMessage {\n\ttype: \"indexingStatusUpdate\"\n\tvalues: IndexingStatus\n}\n\nexport interface LanguageModelChatSelector {\n\tvendor?: string\n\tfamily?: string\n\tversion?: string\n\tid?: string\n}\n\nexport interface ClineSayTool {\n\ttool:\n\t\t| \"editedExistingFile\"\n\t\t| \"appliedDiff\"\n\t\t| \"newFileCreated\"\n\t\t| \"codebaseSearch\"\n\t\t| \"readFile\"\n\t\t| \"readCommandOutput\"\n\t\t| \"listFilesTopLevel\"\n\t\t| \"listFilesRecursive\"\n\t\t| \"searchFiles\"\n\t\t| \"switchMode\"\n\t\t| \"newTask\"\n\t\t| \"finishTask\"\n\t\t| \"generateImage\"\n\t\t| \"imageGenerated\"\n\t\t| \"runSlashCommand\"\n\t\t| \"updateTodoList\"\n\t\t| \"skill\"\n\tpath?: string\n\t// For readCommandOutput\n\treadStart?: number\n\treadEnd?: number\n\ttotalBytes?: number\n\tsearchPattern?: string\n\tmatchCount?: number\n\tdiff?: string\n\tcontent?: string\n\t// Original file content before first edit (for merged diff display in FileChangesPanel)\n\toriginalContent?: string\n\t// Unified diff statistics computed by the extension\n\tdiffStats?: { added: number; removed: number }\n\tregex?: string\n\tfilePattern?: string\n\tmode?: string\n\treason?: string\n\tisOutsideWorkspace?: boolean\n\tisProtected?: boolean\n\tadditionalFileCount?: number // Number of additional files in the same read_file request\n\tlineNumber?: number\n\tstartLine?: number // Starting line for read_file operations (for navigation on click)\n\tquery?: string\n\tbatchFiles?: Array<{\n\t\tpath: string\n\t\tlineSnippet: string\n\t\tisOutsideWorkspace?: boolean\n\t\tkey: string\n\t\tcontent?: string\n\t}>\n\tbatchDiffs?: Array<{\n\t\tpath: string\n\t\tchangeCount: number\n\t\tkey: string\n\t\tcontent: string\n\t\t// Per-file unified diff statistics computed by the extension\n\t\tdiffStats?: { added: number; removed: number }\n\t\tdiffs?: Array<{\n\t\t\tcontent: string\n\t\t\tstartLine?: number\n\t\t}>\n\t}>\n\tbatchDirs?: Array<{\n\t\tpath: string\n\t\trecursive: boolean\n\t\tisOutsideWorkspace?: boolean\n\t\tkey: string\n\t}>\n\tquestion?: string\n\timageData?: string // Base64 encoded image data for generated images\n\t// Properties for runSlashCommand tool\n\tcommand?: string\n\targs?: string\n\tsource?: string\n\tdescription?: string\n\t// Properties for skill tool\n\tskill?: string\n}\n\nexport interface ClineAskUseMcpServer {\n\tserverName: string\n\ttype: \"use_mcp_tool\" | \"access_mcp_resource\"\n\ttoolName?: string\n\targuments?: string\n\turi?: string\n\tresponse?: string\n}\n\nexport interface ClineApiReqInfo {\n\trequest?: string\n\ttokensIn?: number\n\ttokensOut?: number\n\tcacheWrites?: number\n\tcacheReads?: number\n\tcost?: number\n\tcancelReason?: ClineApiReqCancelReason\n\tstreamingFailedMessage?: string\n\tapiProtocol?: \"anthropic\" | \"openai\"\n}\n\nexport type ClineApiReqCancelReason = \"streaming_failed\" | \"user_cancelled\"\n","/**\n * Worktree Types\n *\n * Platform-agnostic type definitions for git worktree operations.\n * These types are decoupled from VSCode and can be used by any consumer.\n */\n\n/**\n * Represents a git worktree\n */\nexport interface Worktree {\n\t/** Absolute path to the worktree directory */\n\tpath: string\n\t/** Branch name - empty string if detached HEAD */\n\tbranch: string\n\t/** Current commit hash */\n\tcommitHash: string\n\t/** Whether this is the current worktree (matches cwd) */\n\tisCurrent: boolean\n\t/** Whether this is the bare/main repository */\n\tisBare: boolean\n\t/** Whether HEAD is detached (not on a branch) */\n\tisDetached: boolean\n\t/** Whether the worktree is locked */\n\tisLocked: boolean\n\t/** Reason for lock if locked */\n\tlockReason?: string\n}\n\n/**\n * Result of a worktree operation (create, delete, etc.)\n */\nexport interface WorktreeResult {\n\t/** Whether the operation succeeded */\n\tsuccess: boolean\n\t/** Human-readable message describing the result */\n\tmessage: string\n\t/** The worktree that was affected (if applicable) */\n\tworktree?: Worktree\n}\n\n/**\n * Branch information for worktree creation\n */\nexport interface BranchInfo {\n\t/** Local branches available */\n\tlocalBranches: string[]\n\t/** Remote branches available */\n\tremoteBranches: string[]\n\t/** Currently checked out branch */\n\tcurrentBranch: string\n}\n\n/**\n * Options for creating a worktree\n */\nexport interface CreateWorktreeOptions {\n\t/** Path where the worktree will be created */\n\tpath: string\n\t/** Branch name to checkout or create */\n\tbranch?: string\n\t/** Base branch to create new branch from */\n\tbaseBranch?: string\n\t/** If true, create a new branch; if false, checkout existing branch */\n\tcreateNewBranch?: boolean\n}\n\n/**\n * Status of .worktreeinclude file\n */\nexport interface WorktreeIncludeStatus {\n\t/** Whether .worktreeinclude exists in the directory */\n\texists: boolean\n\t/** Whether .gitignore exists in the directory */\n\thasGitignore: boolean\n\t/** Content of .gitignore (for creating .worktreeinclude) */\n\tgitignoreContent?: string\n}\n\n/**\n * Response for listWorktrees handler\n */\nexport interface WorktreeListResponse {\n\tworktrees: Worktree[]\n\tisGitRepo: boolean\n\terror?: string\n\tisMultiRoot: boolean\n\tisSubfolder: boolean\n\tgitRootPath: string\n}\n\n/**\n * Response for worktree defaults\n */\nexport interface WorktreeDefaultsResponse {\n\tsuggestedBranch: string\n\tsuggestedPath: string\n\terror?: string\n}\n","export * from \"./api.js\"\nexport * from \"./cli.js\"\nexport * from \"./organization.js\"\nexport * from \"./codebase-index.js\"\nexport * from \"./context-management.js\"\nexport * from \"./cookie-consent.js\"\nexport * from \"./custom-tool.js\"\nexport * from \"./embedding.js\"\nexport * from \"./events.js\"\nexport * from \"./experiment.js\"\nexport * from \"./followup.js\"\nexport * from \"./git.js\"\nexport * from \"./global-settings.js\"\nexport * from \"./history.js\"\nexport * from \"./image-generation.js\"\nexport * from \"./ipc.js\"\nexport * from \"./mcp.js\"\nexport * from \"./message.js\"\nexport * from \"./mode.js\"\nexport * from \"./model.js\"\nexport * from \"./provider-settings.js\"\nexport * from \"./task.js\"\nexport * from \"./todo.js\"\nexport * from \"./skills.js\"\nexport * from \"./terminal.js\"\nexport * from \"./tool.js\"\nexport * from \"./tool-params.js\"\nexport * from \"./type-fu.js\"\nexport * from \"./vscode-extension-host.js\"\nexport * from \"./vscode.js\"\nexport * from \"./worktree.js\"\n\nexport * from \"./providers/index.js\"\n","import type { ProviderName, ReasoningEffortExtended } from \"../types\"\r\nimport type { OutputFormat } from \"./json-events.js\"\r\n\r\nexport const supportedProviders = [\r\n\t\"anthropic\",\r\n\t\"openai-native\",\r\n\t\"openai\",\r\n\t\"gemini\",\r\n\t\"openrouter\",\r\n\t\"vercel-ai-gateway\",\r\n] as const satisfies ProviderName[]\r\n\r\nexport type SupportedProvider = (typeof supportedProviders)[number]\r\n\r\nexport function isSupportedProvider(provider: string): provider is SupportedProvider {\r\n\treturn supportedProviders.includes(provider as SupportedProvider)\r\n}\r\n\r\nexport type ReasoningEffortFlagOptions = ReasoningEffortExtended | \"unspecified\" | \"disabled\"\r\n\r\nexport type FlagOptions = {\r\n\tprompt?: string\r\n\tpromptFile?: string\r\n\tcreateWithSessionId?: string\r\n\tsessionId?: string\r\n\tcontinue: boolean\r\n\tworkspace?: string\r\n\tprint: boolean\r\n\tstdinPromptStream: boolean\r\n\tsignalOnlyExit: boolean\r\n\textension?: string\r\n\tdebug: boolean\r\n\trequireApproval: boolean\r\n\texitOnError: boolean\r\n\tapiKey?: string\r\n\tprovider?: SupportedProvider\r\n\tmodel?: string\r\n\tmode?: string\r\n\tterminalShell?: string\r\n\treasoningEffort?: ReasoningEffortFlagOptions\r\n\tconsecutiveMistakeLimit?: number\r\n\tephemeral: boolean\r\n\toneshot: boolean\r\n\toutputFormat?: OutputFormat\r\n/** YOLO mode - auto-approve all tool calls (bypass security) */\n\tyolo?: boolean\n\t/** Approval mode: 'yolo' for auto-approve, 'normal' for manual approval */\n\tapprovalMode?: string\n\t/** TUI mode - force enable Text User Interface */\n\ttui?: boolean\n}\n\r\nexport enum OnboardingProviderChoice {\r\n\tByok = \"byok\",\r\n}\r\n\r\nexport interface OnboardingResult {\r\n\tchoice: OnboardingProviderChoice\r\n\ttoken?: string\r\n\tskipped: boolean\r\n}\r\n\r\nexport interface CliSettings {\r\n\tonboardingProviderChoice?: OnboardingProviderChoice\r\n\t/** Default mode to use (e.g., \"code\", \"architect\", \"ask\", \"debug\") */\r\n\tmode?: string\r\n\t/** Default provider to use */\r\n\tprovider?: SupportedProvider\r\n\t/** Default model to use */\r\n\tmodel?: string\r\n\t/** Default reasoning effort level */\r\n\treasoningEffort?: ReasoningEffortFlagOptions\r\n\t/** Default consecutive error/repetition limit before guidance prompts */\r\n\tconsecutiveMistakeLimit?: number\r\n\t/** Require manual approval for tools/commands/browser/MCP actions */\r\n\trequireApproval?: boolean\r\n\t/** @deprecated Legacy inverse setting kept for backward compatibility */\r\n\tdangerouslySkipPermissions?: boolean\r\n\t/** Exit upon task completion */\r\n\toneshot?: boolean\r\n}\r\n","import {\r\n\trooCliOutputFormats,\r\n\ttype RooCliCost,\r\n\ttype RooCliEventType,\r\n\ttype RooCliFinalOutput,\r\n\ttype RooCliOutputFormat,\r\n\ttype RooCliQueueItem,\r\n\ttype RooCliStreamEvent,\r\n\ttype RooCliToolResult,\r\n\ttype RooCliToolUse,\r\n} from \"../types\"\r\n\r\n/**\r\n * JSON Event Types for Structured CLI Output\r\n *\r\n * This module defines the types for structured JSON output from the CLI.\r\n * The output format is NDJSON (newline-delimited JSON) for stream-json mode,\r\n * or a single JSON object for json mode.\r\n *\r\n * Schema is optimized for efficiency with high message volume:\r\n * - Minimal fields per event\r\n * - No redundant wrappers\r\n * - `done` flag instead of partial:false\r\n */\r\n\r\n/**\r\n * Output format options for the CLI.\r\n */\r\nexport const OUTPUT_FORMATS = rooCliOutputFormats\r\n\r\nexport type OutputFormat = RooCliOutputFormat\r\n\r\nexport function isValidOutputFormat(format: string): format is OutputFormat {\r\n\treturn (OUTPUT_FORMATS as readonly string[]).includes(format)\r\n}\r\n\r\n/**\r\n * Event type discriminators for JSON output.\r\n */\r\nexport type JsonEventType = RooCliEventType\r\n\r\nexport type JsonEventQueueItem = RooCliQueueItem\r\n\r\n/**\r\n * Tool use information for tool_use events.\r\n */\r\nexport type JsonEventToolUse = RooCliToolUse\r\n\r\n/**\r\n * Tool result information for tool_result events.\r\n */\r\nexport type JsonEventToolResult = RooCliToolResult\r\n\r\n/**\r\n * Cost and token usage information.\r\n */\r\nexport type JsonEventCost = RooCliCost\r\n\r\n/**\r\n * Base JSON event structure.\r\n * Optimized for minimal payload size.\r\n *\r\n * For streaming deltas:\r\n * - Each delta includes `id` for easy correlation\r\n * - Final message has `done: true`\r\n */\r\nexport type JsonEvent = RooCliStreamEvent & {\r\n\t/** Event type discriminator */\r\n\ttype: JsonEventType\r\n\t/** Protocol schema version (included on system.init) */\r\n\tschemaVersion?: number\r\n\t/** Transport protocol identifier (included on system.init) */\r\n\tprotocol?: string\r\n\t/** Capability names supported by the current process */\r\n\tcapabilities?: string[]\r\n\t/** Message ID - included on first delta and final message */\r\n\tid?: number\r\n\t/** Active task ID when available */\r\n\ttaskId?: string\r\n\t/** Request ID for correlating streamed output to stdin commands */\r\n\trequestId?: string\r\n\t/** Command name for control events */\r\n\tcommand?: string\r\n\t/** Content text (for text-based events) */\r\n\tcontent?: string\r\n\t/** True when this is the final message (stream complete) */\r\n\tdone?: boolean\r\n\t/** Optional subtype for more specific categorization */\r\n\tsubtype?: string\r\n\t/** Optional machine-readable status/error code */\r\n\tcode?: string\r\n\t/** Current queue depth (for queue events) */\r\n\tqueueDepth?: number\r\n\t/** Queue item snapshots (for queue events) */\r\n\tqueue?: JsonEventQueueItem[]\r\n\t/** Tool use information (for tool_use events) */\r\n\ttool_use?: JsonEventToolUse\r\n\t/** Tool result information (for tool_result events) */\r\n\ttool_result?: JsonEventToolResult\r\n\t/** Whether the task succeeded (for result events) */\r\n\tsuccess?: boolean\r\n\t/** Cost and token usage (for result events) */\r\n\tcost?: JsonEventCost\r\n}\r\n\r\n/**\r\n * Final JSON output for \"json\" mode (single object at end).\r\n * Contains the result and accumulated messages.\r\n */\r\nexport type JsonFinalOutput = RooCliFinalOutput & {\r\n\t/** Final result type */\r\n\ttype: \"result\"\r\n\t/** Whether the task succeeded */\r\n\tsuccess: boolean\r\n\t/** Result content/message */\r\n\tcontent?: string\r\n\t/** Cost and token usage */\r\n\tcost?: JsonEventCost\r\n\t/** All events that occurred during the task */\r\n\tevents: JsonEvent[]\r\n}\r\n","// Re-export everything from src/types that json-events.ts and constants.ts need\nexport * from \"../../types\"\n\n// Re-export from local barrel files for CLI-specific types\nexport * from \"./types.js\"\nexport * from \"./constants.js\"\nexport * from \"./json-events.js\"","import { reasoningEffortsExtended } from \"../types\"\r\n\r\nexport const DEFAULT_FLAGS = {\r\n\tmode: \"code\",\r\n\treasoningEffort: \"medium\" as const,\r\n\tmodel: \"stepfun-ai/step-3.5-flash\",\r\n\tconsecutiveMistakeLimit: 10,\r\n}\r\n\r\nexport const REASONING_EFFORTS = [...reasoningEffortsExtended, \"unspecified\", \"disabled\"]\r\n\r\n/**\r\n * Default timeout in seconds for auto-approving followup questions.\r\n * Used in both the TUI (App.tsx) and the extension host (extension-host.ts).\r\n */\r\nexport const FOLLOWUP_TIMEOUT_SECONDS = 60\r\n\r\nexport const ASCII_ROO = ` _,' ___\r\n <__\\\\__/ \\\\\r\n \\\\_ / _\\\\\r\n \\\\,\\\\ / \\\\\\\\\r\n // \\\\\\\\\r\n ,/' \\`\\\\_,`\r\n","import fs from \"fs/promises\"\nimport os from \"os\"\nimport path from \"path\"\n\nconst CONFIG_DIR = path.join(os.homedir(), \".roo\")\n\nexport function getConfigDir(): string {\n\treturn CONFIG_DIR\n}\n\nexport async function ensureConfigDir(): Promise<void> {\n\ttry {\n\t\tawait fs.mkdir(CONFIG_DIR, { recursive: true })\n\t} catch (err) {\n\t\t// Directory may already exist, that's fine.\n\t\tconst error = err as NodeJS.ErrnoException\n\n\t\tif (error.code !== \"EEXIST\") {\n\t\t\tthrow err\n\t\t}\n\t}\n}\n","import * as fs from \"fs/promises\"\nimport * as path from \"path\"\n\nimport type { HistoryItem } from \"@roo-code/types\"\n\nconst HISTORY_ITEM_FILENAME = \"history_item.json\"\nconst HISTORY_INDEX_FILENAME = \"_index.json\"\n\nexport interface TaskSessionEntry {\n\tid: string\n\ttask: string\n\tts: number\n\tworkspace?: string\n\tmode?: string\n\tstatus?: HistoryItem[\"status\"]\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null\n}\n\nfunction extractSessionEntry(value: unknown): TaskSessionEntry | undefined {\n\tif (!isRecord(value)) {\n\t\treturn undefined\n\t}\n\n\tconst id = value.id\n\tconst task = value.task\n\tconst ts = value.ts\n\tconst workspace = value.workspace\n\tconst mode = value.mode\n\tconst status = value.status\n\n\tif (typeof id !== \"string\" || typeof task !== \"string\" || typeof ts !== \"number\") {\n\t\treturn undefined\n\t}\n\n\treturn {\n\t\tid,\n\t\ttask,\n\t\tts,\n\t\tworkspace: typeof workspace === \"string\" ? workspace : undefined,\n\t\tmode: typeof mode === \"string\" ? mode : undefined,\n\t\tstatus: status === \"active\" || status === \"completed\" || status === \"delegated\" ? status : undefined,\n\t}\n}\n\nasync function readJsonFile(filePath: string): Promise<unknown | undefined> {\n\ttry {\n\t\tconst raw = await fs.readFile(filePath, \"utf8\")\n\t\treturn JSON.parse(raw)\n\t} catch {\n\t\treturn undefined\n\t}\n}\n\nexport async function readTaskSessionsFromStoragePath(storageBasePath: string): Promise<TaskSessionEntry[]> {\n\tconst tasksDir = path.join(storageBasePath, \"tasks\")\n\tconst sessionsById = new Map<string, TaskSessionEntry>()\n\n\tconst historyIndex = await readJsonFile(path.join(tasksDir, HISTORY_INDEX_FILENAME))\n\tconst indexEntries = isRecord(historyIndex) && Array.isArray(historyIndex.entries) ? historyIndex.entries : []\n\n\tfor (const entry of indexEntries) {\n\t\tconst session = extractSessionEntry(entry)\n\t\tif (session) {\n\t\t\tsessionsById.set(session.id, session)\n\t\t}\n\t}\n\n\tlet taskDirs: string[] = []\n\n\ttry {\n\t\tconst entries = await fs.readdir(tasksDir, { withFileTypes: true })\n\t\ttaskDirs = entries\n\t\t\t.filter((entry) => entry.isDirectory() && !entry.name.startsWith(\"_\") && !entry.name.startsWith(\".\"))\n\t\t\t.map((entry) => entry.name)\n\t} catch {\n\t\t// No tasks directory; return index-derived entries only.\n\t}\n\n\tfor (const taskId of taskDirs) {\n\t\tif (sessionsById.has(taskId)) {\n\t\t\tcontinue\n\t\t}\n\n\t\tconst historyItem = await readJsonFile(path.join(tasksDir, taskId, HISTORY_ITEM_FILENAME))\n\t\tconst session = extractSessionEntry(historyItem)\n\n\t\tif (session) {\n\t\t\tsessionsById.set(session.id, session)\n\t\t}\n\t}\n\n\tif (taskDirs.length > 0) {\n\t\tconst onDiskIds = new Set(taskDirs)\n\t\tfor (const sessionId of sessionsById.keys()) {\n\t\t\tif (!onDiskIds.has(sessionId)) {\n\t\t\t\tsessionsById.delete(sessionId)\n\t\t\t}\n\t\t}\n\t}\n\n\treturn Array.from(sessionsById.values()).sort((a, b) => b.ts - a.ts)\n}\n","/**\n * File-based debug logging utility\n *\n * This writes logs to ~/.roo/cli-debug.log, avoiding stdout/stderr\n * which would break TUI applications. The log format is timestamped JSON.\n *\n * Usage:\n * import { debugLog, DebugLogger } from \"@quantum-ai/core/cli\"\n *\n * // Simple logging\n * debugLog(\"handleModeSwitch\", { mode: newMode, configId })\n *\n * // Or create a named logger for a component\n * const log = new DebugLogger(\"ClineProvider\")\n * log.info(\"handleModeSwitch\", { mode: newMode })\n */\n\nimport * as fs from \"fs\"\nimport * as path from \"path\"\nimport * as os from \"os\"\n\nconst DEBUG_LOG_PATH = path.join(os.homedir(), \".roo\", \"cli-debug.log\")\n\nlet debugLogEnabled = false\n\n/**\n * Enable or disable file-based debug logging.\n * Logging is disabled by default and should only be enabled in dev/debug mode.\n */\nexport function setDebugLogEnabled(enabled: boolean): void {\n\tdebugLogEnabled = enabled\n}\n\n/**\n * Simple file-based debug log function.\n * Writes timestamped entries to ~/.roo/cli-debug.log\n * Only writes when enabled via setDebugLogEnabled(true).\n */\nexport function debugLog(message: string, data?: unknown): void {\n\tif (!debugLogEnabled) {\n\t\treturn\n\t}\n\ttry {\n\t\tconst logDir = path.dirname(DEBUG_LOG_PATH)\n\n\t\tif (!fs.existsSync(logDir)) {\n\t\t\tfs.mkdirSync(logDir, { recursive: true })\n\t\t}\n\n\t\tconst timestamp = new Date().toISOString()\n\n\t\tconst entry = data\n\t\t\t? `[${timestamp}] ${message}: ${JSON.stringify(data, null, 2)}\\n`\n\t\t\t: `[${timestamp}] ${message}\\n`\n\n\t\tfs.appendFileSync(DEBUG_LOG_PATH, entry)\n\t} catch {\n\t\t// NO-OP - don't let logging errors break functionality\n\t}\n}\n\n/**\n * Debug logger with component context.\n * Prefixes all messages with the component name.\n */\nexport class DebugLogger {\n\tprivate component: string\n\n\tconstructor(component: string) {\n\t\tthis.component = component\n\t}\n\n\t/**\n\t * Log a debug message with optional data\n\t */\n\tdebug(message: string, data?: unknown): void {\n\t\tdebugLog(`[${this.component}] ${message}`, data)\n\t}\n\n\t/**\n\t * Alias for debug\n\t */\n\tinfo(message: string, data?: unknown): void {\n\t\tthis.debug(message, data)\n\t}\n\n\t/**\n\t * Log a warning\n\t */\n\twarn(message: string, data?: unknown): void {\n\t\tdebugLog(`[${this.component}] WARN: ${message}`, data)\n\t}\n\n\t/**\n\t * Log an error\n\t */\n\terror(message: string, data?: unknown): void {\n\t\tdebugLog(`[${this.component}] ERROR: ${message}`, data)\n\t}\n}\n\n/**\n * Pre-configured logger for provider/mode debugging\n */\nexport const providerDebugLog = new DebugLogger(\"ProviderSettings\")\n","import * as path from \"path\"\n\n/**\n * Normalize a path by removing trailing slashes and converting separators.\n * This handles cross-platform path comparison issues.\n */\nexport function normalizePath(p: string): string {\n\t// Remove trailing slashes\n\tlet normalized = p.replace(/[/\\\\]+$/, \"\")\n\t// Convert to consistent separators using path.normalize\n\tnormalized = path.normalize(normalized)\n\treturn normalized\n}\n\n/**\n * Compare two paths for equality, handling:\n * - Trailing slashes\n * - Path separator differences\n * - Case sensitivity (case-insensitive on Windows/macOS)\n */\nexport function arePathsEqual(path1?: string, path2?: string): boolean {\n\tif (!path1 || !path2) {\n\t\treturn false\n\t}\n\n\tconst normalizedPath1 = normalizePath(path1)\n\tconst normalizedPath2 = normalizePath(path2)\n\n\t// On Windows and macOS, file paths are case-insensitive\n\tif (process.platform === \"win32\" || process.platform === \"darwin\") {\n\t\treturn normalizedPath1.toLowerCase() === normalizedPath2.toLowerCase()\n\t}\n\n\treturn normalizedPath1 === normalizedPath2\n}\n","export * from \"./path.ts\"","import type { TokenUsage, ToolUsage, ToolName, ClineMessage } from \"@quantum-ai/types\"\n\nexport type ParsedApiReqStartedTextType = {\n\ttokensIn: number\n\ttokensOut: number\n\tcacheWrites: number\n\tcacheReads: number\n\tcost?: number // Only present if consolidateApiRequests has been called\n\tapiProtocol?: \"anthropic\" | \"openai\"\n}\n\n/**\n * Consolidates token usage metrics from an array of ClineMessages.\n *\n * This function processes 'condense_context' messages and 'api_req_started' messages that have been\n * consolidated with their corresponding 'api_req_finished' messages by the consolidateApiRequests function.\n * It extracts and sums up the tokensIn, tokensOut, cacheWrites, cacheReads, and cost from these messages.\n *\n * @param messages - An array of ClineMessage objects to process.\n * @returns A TokenUsage object containing totalTokensIn, totalTokensOut, totalCacheWrites, totalCacheReads, totalCost, and contextTokens.\n *\n * @example\n * const messages = [\n * { type: \"say\", say: \"api_req_started\", text: '{\"request\":\"GET /api/data\",\"tokensIn\":10,\"tokensOut\":20,\"cost\":0.005}', ts: 1000 }\n * ];\n * const { totalTokensIn, totalTokensOut, totalCost } = consolidateTokenUsage(messages);\n * // Result: { totalTokensIn: 10, totalTokensOut: 20, totalCost: 0.005 }\n */\nexport function consolidateTokenUsage(messages: ClineMessage[]): TokenUsage {\n\tconst result: TokenUsage = {\n\t\ttotalTokensIn: 0,\n\t\ttotalTokensOut: 0,\n\t\ttotalCacheWrites: undefined,\n\t\ttotalCacheReads: undefined,\n\t\ttotalCost: 0,\n\t\tcontextTokens: 0,\n\t}\n\n\t// Calculate running totals.\n\tmessages.forEach((message) => {\n\t\tif (message.type === \"say\" && message.say === \"api_req_started\" && message.text) {\n\t\t\ttry {\n\t\t\t\tconst parsedText: ParsedApiReqStartedTextType = JSON.parse(message.text)\n\t\t\t\tconst { tokensIn, tokensOut, cacheWrites, cacheReads, cost } = parsedText\n\n\t\t\t\tif (typeof tokensIn === \"number\") {\n\t\t\t\t\tresult.totalTokensIn += tokensIn\n\t\t\t\t}\n\n\t\t\t\tif (typeof tokensOut === \"number\") {\n\t\t\t\t\tresult.totalTokensOut += tokensOut\n\t\t\t\t}\n\n\t\t\t\tif (typeof cacheWrites === \"number\") {\n\t\t\t\t\tresult.totalCacheWrites = (result.totalCacheWrites ?? 0) + cacheWrites\n\t\t\t\t}\n\n\t\t\t\tif (typeof cacheReads === \"number\") {\n\t\t\t\t\tresult.totalCacheReads = (result.totalCacheReads ?? 0) + cacheReads\n\t\t\t\t}\n\n\t\t\t\tif (typeof cost === \"number\") {\n\t\t\t\t\tresult.totalCost += cost\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\"Error parsing JSON:\", error)\n\t\t\t}\n\t\t} else if (message.type === \"say\" && message.say === \"condense_context\") {\n\t\t\tresult.totalCost += message.contextCondense?.cost ?? 0\n\t\t}\n\t})\n\n\t// Calculate context tokens, from the last API request started or condense\n\t// context message.\n\tresult.contextTokens = 0\n\n\tfor (let i = messages.length - 1; i >= 0; i--) {\n\t\tconst message = messages[i]\n\t\tif (!message) continue\n\n\t\tif (message.type === \"say\" && message.say === \"api_req_started\" && message.text) {\n\t\t\ttry {\n\t\t\t\tconst parsedText: ParsedApiReqStartedTextType = JSON.parse(message.text)\n\t\t\t\tconst { tokensIn, tokensOut } = parsedText\n\n\t\t\t\t// Since tokensIn now stores TOTAL input tokens (including cache tokens),\n\t\t\t\t// we no longer need to add cacheWrites and cacheReads separately.\n\t\t\t\t// This applies to both Anthropic and OpenAI protocols.\n\t\t\t\tresult.contextTokens = (tokensIn || 0) + (tokensOut || 0)\n\t\t\t} catch {\n\t\t\t\t// Ignore JSON parse errors\n\t\t\t\tcontinue\n\t\t\t}\n\t\t} else if (message.type === \"say\" && message.say === \"condense_context\") {\n\t\t\tresult.contextTokens = message.contextCondense?.newContextTokens ?? 0\n\t\t}\n\t\tif (result.contextTokens) {\n\t\t\tbreak\n\t\t}\n\t}\n\n\treturn result\n}\n\n/**\n * Check if token usage has changed by comparing relevant properties.\n * @param current - Current token usage data\n * @param snapshot - Previous snapshot to compare against\n * @returns true if any relevant property has changed or snapshot is undefined\n */\nexport function hasTokenUsageChanged(current: TokenUsage, snapshot?: TokenUsage): boolean {\n\tif (!snapshot) {\n\t\treturn true\n\t}\n\n\tconst keysToCompare: (keyof TokenUsage)[] = [\n\t\t\"totalTokensIn\",\n\t\t\"totalTokensOut\",\n\t\t\"totalCacheWrites\",\n\t\t\"totalCacheReads\",\n\t\t\"totalCost\",\n\t\t\"contextTokens\",\n\t]\n\n\treturn keysToCompare.some((key) => current[key] !== snapshot[key])\n}\n\n/**\n * Check if tool usage has changed by comparing attempts and failures.\n * @param current - Current tool usage data\n * @param snapshot - Previous snapshot to compare against (undefined treated as empty)\n * @returns true if any tool's attempts/failures have changed between current and snapshot\n */\nexport function hasToolUsageChanged(current: ToolUsage, snapshot?: ToolUsage): boolean {\n\t// Treat undefined snapshot as empty object for consistent comparison\n\tconst effectiveSnapshot = snapshot ?? {}\n\n\tconst currentKeys = Object.keys(current) as ToolName[]\n\tconst snapshotKeys = Object.keys(effectiveSnapshot) as ToolName[]\n\n\t// Check if number of tools changed\n\tif (currentKeys.length !== snapshotKeys.length) {\n\t\treturn true\n\t}\n\n\t// Check if any tool's stats changed\n\treturn currentKeys.some((key) => {\n\t\tconst currentTool = current[key]\n\t\tconst snapshotTool = effectiveSnapshot[key]\n\n\t\tif (!snapshotTool || !currentTool) {\n\t\t\treturn true\n\t\t}\n\n\t\treturn currentTool.attempts !== snapshotTool.attempts || currentTool.failures !== snapshotTool.failures\n\t})\n}\n","import type { ClineMessage } from \"@quantum-ai/types\"\n\n/**\n * Consolidates API request start and finish messages in an array of ClineMessages.\n *\n * This function looks for pairs of 'api_req_started' and 'api_req_finished' messages.\n * When it finds a pair, it consolidates them into a single message.\n * The JSON data in the text fields of both messages are merged.\n *\n * @param messages - An array of ClineMessage objects to process.\n * @returns A new array of ClineMessage objects with API requests consolidated.\n *\n * @example\n * const messages = [\n * { type: \"say\", say: \"api_req_started\", text: '{\"request\":\"GET /api/data\"}', ts: 1000 },\n * { type: \"say\", say: \"api_req_finished\", text: '{\"cost\":0.005}', ts: 1001 }\n * ];\n * const result = consolidateApiRequests(messages);\n * // Result: [{ type: \"say\", say: \"api_req_started\", text: '{\"request\":\"GET /api/data\",\"cost\":0.005}', ts: 1000 }]\n */\nexport function consolidateApiRequests(messages: ClineMessage[]): ClineMessage[] {\n\tif (messages.length === 0) {\n\t\treturn []\n\t}\n\n\tif (messages.length === 1) {\n\t\treturn messages\n\t}\n\n\tlet isMergeNecessary = false\n\n\tfor (const msg of messages) {\n\t\tif (msg.type === \"say\" && (msg.say === \"api_req_started\" || msg.say === \"api_req_finished\")) {\n\t\t\tisMergeNecessary = true\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif (!isMergeNecessary) {\n\t\treturn messages\n\t}\n\n\tconst result: ClineMessage[] = []\n\tconst startedIndices: number[] = []\n\n\tfor (const message of messages) {\n\t\tif (message.type !== \"say\" || (message.say !== \"api_req_started\" && message.say !== \"api_req_finished\")) {\n\t\t\tresult.push(message)\n\t\t\tcontinue\n\t\t}\n\n\t\tif (message.say === \"api_req_started\") {\n\t\t\t// Add to result and track the index.\n\t\t\tresult.push(message)\n\t\t\tstartedIndices.push(result.length - 1)\n\t\t\tcontinue\n\t\t}\n\n\t\t// Find the most recent api_req_started that hasn't been consolidated.\n\t\tconst startIndex = startedIndices.length > 0 ? startedIndices.pop() : undefined\n\n\t\tif (startIndex !== undefined) {\n\t\t\tconst startMessage = result[startIndex]\n\t\t\tif (!startMessage) continue\n\n\t\t\tlet startData = {}\n\t\t\tlet finishData = {}\n\n\t\t\ttry {\n\t\t\t\tif (startMessage.text) {\n\t\t\t\t\tstartData = JSON.parse(startMessage.text)\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Ignore JSON parse errors\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tif (message.text) {\n\t\t\t\t\tfinishData = JSON.parse(message.text)\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Ignore JSON parse errors\n\t\t\t}\n\n\t\t\tresult[startIndex] = { ...startMessage, text: JSON.stringify({ ...startData, ...finishData }) }\n\t\t}\n\t}\n\n\treturn result\n}\n","/**\n * Safely parses JSON without crashing on invalid input.\n *\n * @param jsonString The string to parse\n * @param defaultValue Value to return if parsing fails\n * @returns Parsed JSON object or defaultValue if parsing fails\n */\nexport function safeJsonParse<T>(jsonString: string | null | undefined, defaultValue?: T): T | undefined {\n\tif (!jsonString) {\n\t\treturn defaultValue\n\t}\n\n\ttry {\n\t\treturn JSON.parse(jsonString) as T\n\t} catch (error) {\n\t\t// Log the error to the console for debugging.\n\t\tconsole.error(\"Error parsing JSON:\", error)\n\t\treturn defaultValue\n\t}\n}\n","import type { ClineMessage } from \"@quantum-ai/types\"\n\nimport { safeJsonParse } from \"./safeJsonParse.js\"\n\nexport const COMMAND_OUTPUT_STRING = \"Output:\"\n\n/**\n * Consolidates sequences of command and command_output messages in an array of ClineMessages.\n * Also consolidates sequences of use_mcp_server and mcp_server_response messages.\n *\n * This function processes an array of ClineMessages objects, looking for sequences\n * where a 'command' message is followed by one or more 'command_output' messages,\n * or where a 'use_mcp_server' message is followed by one or more 'mcp_server_response' messages.\n * When such a sequence is found, it consolidates them into a single message, merging\n * their text contents.\n *\n * @param messages - An array of ClineMessage objects to process.\n * @returns A new array of ClineMessage objects with command and MCP sequences consolidated.\n *\n * @example\n * const messages: ClineMessage[] = [\n * { type: 'ask', ask: 'command', text: 'ls', ts: 1625097600000 },\n * { type: 'ask', ask: 'command_output', text: 'file1.txt', ts: 1625097601000 },\n * { type: 'ask', ask: 'command_output', text: 'file2.txt', ts: 1625097602000 }\n * ];\n * const result = consolidateCommands(messages);\n * // Result: [{ type: 'ask', ask: 'command', text: 'ls\\nfile1.txt\\nfile2.txt', ts: 1625097600000 }]\n */\nexport function consolidateCommands(messages: ClineMessage[]): ClineMessage[] {\n\tconst consolidatedMessages = new Map<number, ClineMessage>()\n\tconst processedIndices = new Set<number>()\n\n\t// Single pass through all messages\n\tfor (let i = 0; i < messages.length; i++) {\n\t\tconst msg = messages[i]\n\t\tif (!msg) continue\n\n\t\t// Handle MCP server requests\n\t\tif (msg.type === \"ask\" && msg.ask === \"use_mcp_server\") {\n\t\t\t// Look ahead for MCP responses\n\t\t\tconst responses: string[] = []\n\t\t\tlet j = i + 1\n\n\t\t\twhile (j < messages.length) {\n\t\t\t\tconst nextMsg = messages[j]\n\t\t\t\tif (!nextMsg) {\n\t\t\t\t\tj++\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tif (nextMsg.say === \"mcp_server_response\") {\n\t\t\t\t\tresponses.push(nextMsg.text || \"\")\n\t\t\t\t\tprocessedIndices.add(j)\n\t\t\t\t\tj++\n\t\t\t\t} else if (nextMsg.type === \"ask\" && nextMsg.ask === \"use_mcp_server\") {\n\t\t\t\t\t// Stop if we encounter another MCP request\n\t\t\t\t\tbreak\n\t\t\t\t} else {\n\t\t\t\t\tj++\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (responses.length > 0) {\n\t\t\t\t// Parse the JSON from the message text\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t\t\tconst jsonObj = safeJsonParse<any>(msg.text || \"{}\", {})\n\n\t\t\t\t// Add the response to the JSON object\n\t\t\t\tjsonObj.response = responses.join(\"\\n\")\n\n\t\t\t\t// Stringify the updated JSON object\n\t\t\t\tconst consolidatedText = JSON.stringify(jsonObj)\n\n\t\t\t\tconsolidatedMessages.set(msg.ts, { ...msg, text: consolidatedText })\n\t\t\t} else {\n\t\t\t\t// If there's no response, just keep the original message\n\t\t\t\tconsolidatedMessages.set(msg.ts, { ...msg })\n\t\t\t}\n\t\t}\n\t\t// Handle command sequences\n\t\telse if (msg.type === \"ask\" && msg.ask === \"command\") {\n\t\t\tlet consolidatedText = msg.text || \"\"\n\t\t\tlet j = i + 1\n\t\t\tlet previous: { type: \"ask\" | \"say\"; text: string } | undefined\n\t\t\tlet lastProcessedIndex = i\n\n\t\t\twhile (j < messages.length) {\n\t\t\t\tconst currentMsg = messages[j]\n\t\t\t\tif (!currentMsg) {\n\t\t\t\t\tj++\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tconst { type, ask, say, text = \"\" } = currentMsg\n\n\t\t\t\tif (type === \"ask\" && ask === \"command\") {\n\t\t\t\t\tbreak // Stop if we encounter the next command.\n\t\t\t\t}\n\n\t\t\t\tif (ask === \"command_output\" || say === \"command_output\") {\n\t\t\t\t\tif (!previous) {\n\t\t\t\t\t\tconsolidatedText += `\\n${COMMAND_OUTPUT_STRING}`\n\t\t\t\t\t}\n\n\t\t\t\t\tconst isDuplicate = previous && previous.type !== type && previous.text === text\n\n\t\t\t\t\tif (text.length > 0 && !isDuplicate) {\n\t\t\t\t\t\t// Add a newline before adding the text if there's already content\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tprevious &&\n\t\t\t\t\t\t\tconsolidatedText.length >\n\t\t\t\t\t\t\t\tconsolidatedText.indexOf(COMMAND_OUTPUT_STRING) + COMMAND_OUTPUT_STRING.length\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tconsolidatedText += \"\\n\"\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconsolidatedText += text\n\t\t\t\t\t}\n\n\t\t\t\t\tprevious = { type, text }\n\t\t\t\t\tprocessedIndices.add(j)\n\t\t\t\t\tlastProcessedIndex = j\n\t\t\t\t}\n\n\t\t\t\tj++\n\t\t\t}\n\n\t\t\tconsolidatedMessages.set(msg.ts, { ...msg, text: consolidatedText })\n\n\t\t\t// Only skip ahead if we actually processed command outputs\n\t\t\tif (lastProcessedIndex > i) {\n\t\t\t\ti = lastProcessedIndex\n\t\t\t}\n\t\t}\n\t}\n\n\t// Build final result: filter out processed messages and use consolidated versions\n\tconst result: ClineMessage[] = []\n\tfor (let i = 0; i < messages.length; i++) {\n\t\tconst msg = messages[i]\n\t\tif (!msg) continue\n\n\t\t// Skip messages that were processed as outputs/responses\n\t\tif (processedIndices.has(i)) {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Skip command_output and mcp_server_response messages\n\t\tif (msg.ask === \"command_output\" || msg.say === \"command_output\" || msg.say === \"mcp_server_response\") {\n\t\t\tcontinue\n\t\t}\n\n\t\t// Use consolidated version if available\n\t\tconst consolidatedMsg = consolidatedMessages.get(msg.ts)\n\t\tif (consolidatedMsg) {\n\t\t\tresult.push(consolidatedMsg)\n\t\t} else {\n\t\t\tresult.push(msg)\n\t\t}\n\t}\n\n\treturn result\n}\n","export {\n\ttype ParsedApiReqStartedTextType,\n\tconsolidateTokenUsage,\n\thasTokenUsageChanged,\n\thasToolUsageChanged,\n} from \"./consolidateTokenUsage.ts\"\n\nexport { consolidateApiRequests } from \"./consolidateApiRequests.ts\"\n\nexport { consolidateCommands, COMMAND_OUTPUT_STRING } from \"./consolidateCommands.ts\"\n\nexport { safeJsonParse } from \"./safeJsonParse.ts\"\n","// Re-export debug utilities from core\nexport { debugLog, DebugLogger, setDebugLogEnabled, providerDebugLog } from \"../../core/debug-log/index.js\"\n\n// Re-export task history utilities\nexport { readTaskSessionsFromStoragePath, type TaskSessionEntry } from \"../../core/task-history/index.js\"\n\n// Re-export path utilities from core/utils\nexport { normalizePath, arePathsEqual } from \"../../core/utils/index.js\"\n\n// Re-export message utilities\nexport {\n\tconsolidateTokenUsage,\n\tconsolidateApiRequests,\n\tconsolidateCommands,\n\tCOMMAND_OUTPUT_STRING,\n} from \"../../core/message-utils/index.js\"","import React, { useState, useCallback } from 'react'\nimport { Box, Text, useInput } from 'ink'\n\nexport interface SelectOption {\n\tlabel: string\n\tvalue: string\n}\n\nexport interface SelectProps {\n\toptions: SelectOption[]\n\tonChange: (value: string) => void\n}\n\n/**\n * Simple select component for ink.\n * Allows selection via up/down arrows and Enter.\n */\nexport default function Select({ options, onChange }: SelectProps) {\n\tconst [selectedIndex, setSelectedIndex] = useState(0)\n\n\tconst handleInput = useCallback(\n\t\t(_input: string, key: { upArrow?: boolean; downArrow?: boolean; return?: boolean }) => {\n\t\t\tif (key.upArrow) {\n\t\t\t\tsetSelectedIndex((prev) => (prev > 0 ? prev - 1 : options.length - 1))\n\t\t\t} else if (key.downArrow) {\n\t\t\t\tsetSelectedIndex((prev) => (prev < options.length - 1 ? prev + 1 : 0))\n\t\t\t} else if (key.return) {\n\t\t\t\tconst opt = options[selectedIndex]\n\t\t\t\tif (opt) {\n\t\t\t\t\tonChange(opt.value)\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[selectedIndex, options, onChange],\n\t)\n\n\t// Activate keyboard input only when there are options\n\tuseInput(handleInput, { isActive: options.length > 0 })\n\n\tif (options.length === 0) {\n\t\treturn null\n\t}\n\n\treturn (\n\t\t<Box flexDirection=\"column\">\n\t\t\t{options.map((opt, idx) => (\n\t\t\t\t<Box key={opt.value}>\n\t\t\t\t\t<Text color={idx === selectedIndex ? 'cyan' : undefined}>\n\t\t\t\t\t\t{idx === selectedIndex ? '> ' : ' '}\n\t\t\t\t\t\t{opt.label}\n\t\t\t\t\t</Text>\n\t\t\t\t</Box>\n\t\t\t))}\n\t\t</Box>\n\t)\n}\n","/**\n * CLI-specific global slash commands\n *\n * These commands are handled entirely within the CLI and trigger actions\n * by sending messages to the extension host. They are separate from the\n * extension's built-in commands which expand into prompt content.\n */\n\n/**\n * Action types that can be triggered by global commands.\n * Each action corresponds to a message type sent to the extension host.\n */\nexport type GlobalCommandAction = \"clearTask\"\n\n/**\n * Definition of a CLI global command\n */\nexport interface GlobalCommand {\n\t/** Command name (without the leading /) */\n\tname: string\n\t/** Description shown in the autocomplete picker */\n\tdescription: string\n\t/** Action to trigger when the command is executed */\n\taction: GlobalCommandAction\n}\n\n/**\n * CLI-specific global slash commands\n * These commands trigger actions rather than expanding into prompt content.\n */\nexport const GLOBAL_COMMANDS: GlobalCommand[] = [\n\t{\n\t\tname: \"new\",\n\t\tdescription: \"Start a new task\",\n\t\taction: \"clearTask\",\n\t},\n]\n\n/**\n * Get a global command by name\n */\nexport function getGlobalCommand(name: string): GlobalCommand | undefined {\n\treturn GLOBAL_COMMANDS.find((cmd) => cmd.name === name)\n}\n\n/**\n * Get global commands formatted for autocomplete\n * Returns commands in the SlashCommandResult format expected by the autocomplete trigger\n */\nexport function getGlobalCommandsForAutocomplete(): Array<{\n\tname: string\n\tdescription?: string\n\tsource: \"global\" | \"project\" | \"built-in\"\n\taction?: string\n}> {\n\treturn GLOBAL_COMMANDS.map((cmd) => ({\n\t\tname: cmd.name,\n\t\tdescription: cmd.description,\n\t\tsource: \"global\" as const,\n\t\taction: cmd.action,\n\t}))\n}\n","import * as path from \"path\"\n\n/**\n * Normalize a path by removing trailing slashes and converting separators.\n * This handles cross-platform path comparison issues.\n */\nexport function normalizePath(p: string): string {\n\t// Remove trailing slashes\n\tlet normalized = p.replace(/[/\\\\]+$/, \"\")\n\t// Convert to consistent separators using path.normalize\n\tnormalized = path.normalize(normalized)\n\treturn normalized\n}\n\n/**\n * Compare two paths for equality, handling:\n * - Trailing slashes\n * - Path separator differences\n * - Case sensitivity (case-insensitive on Windows/macOS)\n */\nexport function arePathsEqual(path1?: string, path2?: string): boolean {\n\tif (!path1 || !path2) {\n\t\treturn false\n\t}\n\n\tconst normalizedPath1 = normalizePath(path1)\n\tconst normalizedPath2 = normalizePath(path2)\n\n\t// On Windows and macOS, file paths are case-insensitive\n\tif (process.platform === \"win32\" || process.platform === \"darwin\") {\n\t\treturn normalizedPath1.toLowerCase() === normalizedPath2.toLowerCase()\n\t}\n\n\treturn normalizedPath1 === normalizedPath2\n}\n","import type { ProviderSettings } from \"../../types\"\r\n\r\nimport type { RouterModels } from \"../../ui/store.js\"\r\n\r\nconst DEFAULT_CONTEXT_WINDOW = 200_000\r\n\r\n/**\r\n * Looks up the context window size for the current model from routerModels.\r\n *\r\n * @param routerModels - The router models data containing model info per provider\r\n * @param apiConfiguration - The current API configuration with provider and model ID\r\n * @returns The context window size, or DEFAULT_CONTEXT_WINDOW (200K) if not found\r\n */\r\nexport function getContextWindow(routerModels: RouterModels | null, apiConfiguration: ProviderSettings | null): number {\r\n\tif (!routerModels || !apiConfiguration) {\r\n\t\treturn DEFAULT_CONTEXT_WINDOW\r\n\t}\r\n\r\n\tconst provider = apiConfiguration.apiProvider\r\n\tconst modelId = getModelIdForProvider(apiConfiguration)\r\n\r\n\tif (!provider || !modelId) {\r\n\t\treturn DEFAULT_CONTEXT_WINDOW\r\n\t}\r\n\r\n\tconst providerModels = routerModels[provider]\r\n\tconst modelInfo = providerModels?.[modelId]\r\n\r\n\treturn modelInfo?.contextWindow ?? DEFAULT_CONTEXT_WINDOW\r\n}\r\n\r\n/**\r\n * Gets the model ID from the API configuration based on the provider type.\r\n *\r\n * Different providers store their model ID in different fields of ProviderSettings.\r\n */\r\nfunction getModelIdForProvider(config: ProviderSettings): string | undefined {\r\n\tswitch (config.apiProvider) {\r\n\t\tcase \"openrouter\":\r\n\t\t\treturn config.openRouterModelId\r\n\t\tcase \"ollama\":\r\n\t\t\treturn config.ollamaModelId\r\n\t\tcase \"lmstudio\":\r\n\t\t\treturn config.lmStudioModelId\r\n\t\tcase \"openai\":\r\n\t\t\treturn config.openAiModelId\r\n\t\tcase \"requesty\":\r\n\t\t\treturn config.requestyModelId\r\n\t\tcase \"unbound\":\r\n\t\t\treturn config.unboundModelId\r\n\t\tcase \"litellm\":\r\n\t\t\treturn config.litellmModelId\r\n\t\tcase \"vercel-ai-gateway\":\r\n\t\t\treturn config.vercelAiGatewayModelId\r\n\t\tdefault:\r\n\t\t\t// For anthropic, bedrock, vertex, gemini, xai, etc.\r\n\t\t\treturn config.apiModelId\r\n\t}\r\n}\r\n\r\nexport { DEFAULT_CONTEXT_WINDOW }\r\n","/**\n * Theme configuration for Roo Code CLI TUI\n * Using Hardcore color scheme\n */\n\n// Hardcore palette\nconst hardcore = {\n\t// Accent colors\n\tpink: \"#F92672\",\n\tpinkLight: \"#FF669D\",\n\tgreen: \"#A6E22E\",\n\tgreenLight: \"#BEED5F\",\n\torange: \"#FD971F\",\n\tyellow: \"#E6DB74\",\n\tcyan: \"#66D9EF\",\n\tpurple: \"#9E6FFE\",\n\n\t// Text colors\n\ttext: \"#F8F8F2\",\n\tsubtext1: \"#CCCCC6\",\n\tsubtext0: \"#A3BABF\",\n\n\t// Overlay colors\n\toverlay2: \"#A3BABF\",\n\toverlay1: \"#5E7175\",\n\toverlay0: \"#505354\",\n\n\t// Surface colors\n\tsurface2: \"#505354\",\n\tsurface1: \"#383a3e\",\n\tsurface0: \"#2d2e2e\",\n\n\t// Base colors\n\tbase: \"#1B1D1E\",\n\tmantle: \"#161819\",\n\tcrust: \"#101112\",\n}\n\n// Title and branding colors\nexport const titleColor = hardcore.orange // Orange for title\nexport const welcomeText = hardcore.text // Standard text\nexport const asciiColor = hardcore.cyan // Cyan for ASCII art\n\n// Tips section colors\nexport const tipsHeader = hardcore.orange // Orange for tips headers\nexport const tipsText = hardcore.subtext0 // Subtle text for tips\n\n// Header text colors (for messages)\nexport const userHeader = hardcore.purple // Purple for user header\nexport const rooHeader = hardcore.yellow // Yellow for roo\nexport const toolHeader = hardcore.cyan // Cyan for tool headers\nexport const thinkingHeader = hardcore.overlay1 // Subtle gray for thinking header\n\n// Message text colors\nexport const userText = hardcore.text // Standard text for user\nexport const rooText = hardcore.text // Standard text for roo\nexport const toolText = hardcore.subtext0 // Subtle text for tool output\nexport const thinkingText = hardcore.overlay2 // Subtle gray for thinking text\n\n// UI element colors\nexport const borderColor = hardcore.surface1 // Surface color for borders\nexport const borderColorActive = hardcore.purple // Active/focused border color\nexport const dimText = hardcore.overlay1 // Dim text\nexport const promptColor = hardcore.overlay2 // Prompt indicator\nexport const promptColorActive = hardcore.cyan // Active prompt color\nexport const placeholderColor = hardcore.overlay0 // Placeholder text\n\n// Status colors\nexport const successColor = hardcore.green // Green for success\nexport const errorColor = hardcore.pink // Pink for errors\nexport const warningColor = hardcore.yellow // Yellow for warnings\n\n// Focus indicator colors\nexport const focusColor = hardcore.cyan // Focus indicator (cyan accent)\nexport const scrollActiveColor = hardcore.purple // Scroll area active indicator (purple)\nexport const scrollTrackColor = hardcore.surface1 // Muted scrollbar track color\n\n// Base text color\nexport const text = hardcore.text // Standard text color\n","import { create } from \"zustand\"\r\n\r\nimport type { TokenUsage, ProviderSettings, TodoItem } from \"../../types\"\r\n\r\nimport type { TUIMessage, PendingAsk, TaskHistoryItem } from \"./types.js\"\r\nimport type { FileResult, SlashCommandResult, ModeResult } from \"./components/autocomplete/index.js\"\r\n\r\n/**\r\n * Shallow array equality check - compares array length and element references.\r\n * Used to prevent unnecessary state updates when array content hasn't changed.\r\n */\r\nfunction shallowArrayEqual<T>(a: T[], b: T[]): boolean {\r\n\tif (a === b) return true\r\n\tif (a.length !== b.length) return false\r\n\tfor (let i = 0; i < a.length; i++) {\r\n\t\tif (a[i] !== b[i]) return false\r\n\t}\r\n\treturn true\r\n}\r\n\r\n/**\r\n * Streaming message debounce configuration.\r\n * Batches rapid partial message updates to reduce re-renders during streaming.\r\n * Higher values = fewer renders but text appears more \"chunky\"\r\n * Lower values = smoother text but more renders\r\n */\r\nconst STREAMING_DEBOUNCE_MS = 150 // 150ms debounce for aggressive batching\r\n\r\n// Pending streaming updates - batched and flushed after debounce interval\r\ninterface PendingStreamUpdate {\r\n\tid: string\r\n\tcontent: string\r\n\tpartial: boolean\r\n\ttimestamp: number\r\n}\r\n\r\nconst pendingStreamUpdates: Map<string, PendingStreamUpdate> = new Map()\r\nlet streamingDebounceTimer: ReturnType<typeof setTimeout> | null = null\r\n\r\n/**\r\n * RouterModels type for context window lookup.\r\n * Simplified version - we only need contextWindow from ModelInfo.\r\n */\r\nexport type RouterModels = Record<string, Record<string, { contextWindow?: number }>>\r\n\r\n/**\r\n * CLI application state.\r\n *\r\n * Note: Autocomplete picker UI state (isOpen, selectedIndex) is now managed\r\n * by the useAutocompletePicker hook. The store only holds data that needs\r\n * to be shared between components or persisted (like search results from API).\r\n */\r\ninterface CLIState {\r\n\t// Message history\r\n\tmessages: TUIMessage[]\r\n\tpendingAsk: PendingAsk | null\r\n\r\n\t// Task state\r\n\tisLoading: boolean\r\n\tisComplete: boolean\r\n\thasStartedTask: boolean\r\n\terror: string | null\r\n\r\n\t// Task resumption flag - true when resuming a task from history\r\n\t// Used to modify message processing behavior (e.g., don't skip first text message)\r\n\tisResumingTask: boolean\r\n\r\n\t// Autocomplete data (from API/extension)\r\n\tfileSearchResults: FileResult[]\r\n\tallSlashCommands: SlashCommandResult[]\r\n\tavailableModes: ModeResult[]\r\n\r\n\t// Task history (for resuming previous tasks)\r\n\ttaskHistory: TaskHistoryItem[]\r\n\r\n\t// Current task ID (for detecting same-task reselection)\r\n\tcurrentTaskId: string | null\r\n\r\n\t// Current mode (updated reactively when mode changes)\r\n\tcurrentMode: string | null\r\n\r\n\t// Token usage metrics (from getApiMetrics)\r\n\ttokenUsage: TokenUsage | null\r\n\r\n\t// Model info for context window lookup\r\n\trouterModels: RouterModels | null\r\n\tapiConfiguration: ProviderSettings | null\r\n\r\n\t// Todo list tracking\r\n\tcurrentTodos: TodoItem[]\r\n\tpreviousTodos: TodoItem[]\r\n}\r\n\r\ninterface CLIActions {\r\n\t// Message actions\r\n\taddMessage: (msg: TUIMessage) => void\r\n\tupdateMessage: (id: string, content: string, partial?: boolean) => void\r\n\r\n\t// Task actions\r\n\tsetPendingAsk: (ask: PendingAsk | null) => void\r\n\tsetLoading: (loading: boolean) => void\r\n\tsetComplete: (complete: boolean) => void\r\n\tsetHasStartedTask: (started: boolean) => void\r\n\tsetError: (error: string | null) => void\r\n\treset: () => void\r\n\t/** Reset for task switching - preserves global state (taskHistory, modes, commands) */\r\n\tresetForTaskSwitch: () => void\r\n\t/** Set the isResumingTask flag - used when resuming a task from history */\r\n\tsetIsResumingTask: (isResuming: boolean) => void\r\n\r\n\t// Autocomplete data actions\r\n\tsetFileSearchResults: (results: FileResult[]) => void\r\n\tsetAllSlashCommands: (commands: SlashCommandResult[]) => void\r\n\tsetAvailableModes: (modes: ModeResult[]) => void\r\n\r\n\t// Task history action\r\n\tsetTaskHistory: (history: TaskHistoryItem[]) => void\r\n\r\n\t// Current task ID action\r\n\tsetCurrentTaskId: (taskId: string | null) => void\r\n\r\n\t// Current mode action\r\n\tsetCurrentMode: (mode: string | null) => void\r\n\r\n\t// Metrics actions\r\n\tsetTokenUsage: (usage: TokenUsage | null) => void\r\n\tsetRouterModels: (models: RouterModels | null) => void\r\n\tsetApiConfiguration: (config: ProviderSettings | null) => void\r\n\r\n\t// Todo actions\r\n\tsetTodos: (todos: TodoItem[]) => void\r\n}\r\n\r\nconst initialState: CLIState = {\r\n\tmessages: [],\r\n\tpendingAsk: null,\r\n\tisLoading: false,\r\n\tisComplete: false,\r\n\thasStartedTask: false,\r\n\terror: null,\r\n\tisResumingTask: false,\r\n\tfileSearchResults: [],\r\n\tallSlashCommands: [],\r\n\tavailableModes: [],\r\n\ttaskHistory: [],\r\n\tcurrentTaskId: null,\r\n\tcurrentMode: null,\r\n\ttokenUsage: null,\r\n\trouterModels: null,\r\n\tapiConfiguration: null,\r\n\tcurrentTodos: [],\r\n\tpreviousTodos: [],\r\n}\r\n\r\nexport const useCLIStore = create<CLIState & CLIActions>((set, get) => ({\r\n\t...initialState,\r\n\r\n\taddMessage: (msg) => {\r\n\t\tconst state = get()\r\n\t\t// Check if message already exists (by ID).\r\n\t\tconst existingIndex = state.messages.findIndex((m) => m.id === msg.id)\r\n\r\n\t\t// For NEW messages (not updates) - always apply immediately\r\n\t\tif (existingIndex === -1) {\r\n\t\t\tset({ messages: [...state.messages, msg] })\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\t// For UPDATES to existing messages:\r\n\t\t// If partial (streaming) and message exists, debounce the update\r\n\t\tif (msg.partial) {\r\n\t\t\t// Queue the update\r\n\t\t\tpendingStreamUpdates.set(msg.id, {\r\n\t\t\t\tid: msg.id,\r\n\t\t\t\tcontent: msg.content,\r\n\t\t\t\tpartial: true,\r\n\t\t\t\ttimestamp: Date.now(),\r\n\t\t\t})\r\n\r\n\t\t\t// Schedule flush if not already scheduled\r\n\t\t\tif (!streamingDebounceTimer) {\r\n\t\t\t\tstreamingDebounceTimer = setTimeout(() => {\r\n\t\t\t\t\t// Flush all pending updates as a single batch\r\n\t\t\t\t\tconst currentState = get()\r\n\t\t\t\t\tconst updates = Array.from(pendingStreamUpdates.values())\r\n\t\t\t\t\tpendingStreamUpdates.clear()\r\n\t\t\t\t\tstreamingDebounceTimer = null\r\n\r\n\t\t\t\t\tif (updates.length === 0) return\r\n\r\n\t\t\t\t\t// Apply all pending updates in one state change\r\n\t\t\t\t\tconst newMessages = [...currentState.messages]\r\n\t\t\t\t\tlet hasChanges = false\r\n\r\n\t\t\t\t\tfor (const update of updates) {\r\n\t\t\t\t\t\tconst idx = newMessages.findIndex((m) => m.id === update.id)\r\n\t\t\t\t\t\tif (idx !== -1 && newMessages[idx]) {\r\n\t\t\t\t\t\t\tnewMessages[idx] = {\r\n\t\t\t\t\t\t\t\t...newMessages[idx],\r\n\t\t\t\t\t\t\t\tcontent: update.content,\r\n\t\t\t\t\t\t\t\tpartial: update.partial,\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\thasChanges = true\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (hasChanges) {\r\n\t\t\t\t\t\tset({ messages: newMessages })\r\n\t\t\t\t\t}\r\n\t\t\t\t}, STREAMING_DEBOUNCE_MS)\r\n\t\t\t}\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\t// Non-partial update (final message) - apply immediately and clear any pending\r\n\t\t// This ensures the final complete message is always shown\r\n\t\tpendingStreamUpdates.delete(msg.id)\r\n\r\n\t\tconst updated = [...state.messages]\r\n\t\tupdated[existingIndex] = msg\r\n\t\tset({ messages: updated })\r\n\t},\r\n\r\n\tupdateMessage: (id, content, partial) =>\r\n\t\tset((state) => {\r\n\t\t\tconst index = state.messages.findIndex((m) => m.id === id)\r\n\r\n\t\t\tif (index === -1) {\r\n\t\t\t\treturn state\r\n\t\t\t}\r\n\r\n\t\t\tconst existing = state.messages[index]\r\n\r\n\t\t\tif (!existing) {\r\n\t\t\t\treturn state\r\n\t\t\t}\r\n\r\n\t\t\tconst updated = [...state.messages]\r\n\r\n\t\t\tupdated[index] = {\r\n\t\t\t\t...existing,\r\n\t\t\t\tcontent,\r\n\t\t\t\tpartial: partial !== undefined ? partial : existing.partial,\r\n\t\t\t}\r\n\r\n\t\t\treturn { messages: updated }\r\n\t\t}),\r\n\r\n\tsetPendingAsk: (ask) => set({ pendingAsk: ask }),\r\n\tsetLoading: (loading) => set({ isLoading: loading }),\r\n\tsetComplete: (complete) => set({ isComplete: complete }),\r\n\tsetHasStartedTask: (started) => set({ hasStartedTask: started }),\r\n\tsetError: (error) => set({ error }),\r\n\treset: () => set(initialState),\r\n\tresetForTaskSwitch: () =>\r\n\t\tset((state) => ({\r\n\t\t\t// Clear task-specific state\r\n\t\t\tmessages: [],\r\n\t\t\tpendingAsk: null,\r\n\t\t\tisLoading: false,\r\n\t\t\tisComplete: false,\r\n\t\t\thasStartedTask: false,\r\n\t\t\terror: null,\r\n\t\t\tisResumingTask: false,\r\n\t\t\ttokenUsage: null,\r\n\t\t\tcurrentTodos: [],\r\n\t\t\tpreviousTodos: [],\r\n\t\t\t// currentTaskId is preserved - will be updated to new task ID by caller\r\n\t\t\tcurrentTaskId: state.currentTaskId,\r\n\t\t\t// PRESERVE global state - don't clear these\r\n\t\t\ttaskHistory: state.taskHistory,\r\n\t\t\tavailableModes: state.availableModes,\r\n\t\t\tallSlashCommands: state.allSlashCommands,\r\n\t\t\tfileSearchResults: state.fileSearchResults,\r\n\t\t\tcurrentMode: state.currentMode,\r\n\t\t\trouterModels: state.routerModels,\r\n\t\t\tapiConfiguration: state.apiConfiguration,\r\n\t\t})),\r\n\tsetIsResumingTask: (isResuming) => set({ isResumingTask: isResuming }),\r\n\t// Use shallow equality to prevent unnecessary re-renders when array content is the same\r\n\tsetFileSearchResults: (results) =>\r\n\t\tset((state) => (shallowArrayEqual(state.fileSearchResults, results) ? state : { fileSearchResults: results })),\r\n\tsetAllSlashCommands: (commands) =>\r\n\t\tset((state) => (shallowArrayEqual(state.allSlashCommands, commands) ? state : { allSlashCommands: commands })),\r\n\tsetAvailableModes: (modes) =>\r\n\t\tset((state) => (shallowArrayEqual(state.availableModes, modes) ? state : { availableModes: modes })),\r\n\tsetTaskHistory: (history) =>\r\n\t\tset((state) => (shallowArrayEqual(state.taskHistory, history) ? state : { taskHistory: history })),\r\n\tsetCurrentTaskId: (taskId) => set({ currentTaskId: taskId }),\r\n\tsetCurrentMode: (mode) => set({ currentMode: mode }),\r\n\tsetTokenUsage: (usage) => set({ tokenUsage: usage }),\r\n\tsetRouterModels: (models) => set({ routerModels: models }),\r\n\tsetApiConfiguration: (config) => set({ apiConfiguration: config }),\r\n\tsetTodos: (todos) => set((state) => ({ previousTodos: state.currentTodos, currentTodos: todos })),\r\n}))\r\n","import { create } from \"zustand\"\nimport type { AutocompletePickerState } from \"../components/autocomplete/types.js\"\n\n/**\n * UI-specific state that doesn't need to persist across task switches.\n * This separates UI state from task/message state in the main CLI store.\n */\ninterface UIState {\n\t// Exit handling state\n\tshowExitHint: boolean\n\tpendingExit: boolean\n\n\t// Countdown timer for auto-accepting followup questions\n\tcountdownSeconds: number | null\n\n\t// Custom input mode for followup questions\n\tshowCustomInput: boolean\n\tisTransitioningToCustomInput: boolean\n\n\t// Focus management for scroll area vs input\n\tmanualFocus: \"scroll\" | \"input\" | null\n\n\t// TODO viewer overlay\n\tshowTodoViewer: boolean\n\n\t// Autocomplete picker state\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tpickerState: AutocompletePickerState<any>\n}\n\ninterface UIActions {\n\t// Exit handling actions\n\tsetShowExitHint: (show: boolean) => void\n\tsetPendingExit: (pending: boolean) => void\n\n\t// Countdown timer actions\n\tsetCountdownSeconds: (seconds: number | null) => void\n\n\t// Custom input mode actions\n\tsetShowCustomInput: (show: boolean) => void\n\tsetIsTransitioningToCustomInput: (transitioning: boolean) => void\n\n\t// Focus management actions\n\tsetManualFocus: (focus: \"scroll\" | \"input\" | null) => void\n\n\t// TODO viewer actions\n\tsetShowTodoViewer: (show: boolean) => void\n\n\t// Picker state actions\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tsetPickerState: (state: AutocompletePickerState<any>) => void\n\n\t// Reset all UI state to defaults\n\tresetUIState: () => void\n}\n\nconst initialState: UIState = {\n\tshowExitHint: false,\n\tpendingExit: false,\n\tcountdownSeconds: null,\n\tshowCustomInput: false,\n\tisTransitioningToCustomInput: false,\n\tmanualFocus: null,\n\tshowTodoViewer: false,\n\tpickerState: {\n\t\tactiveTrigger: null,\n\t\tresults: [],\n\t\tselectedIndex: 0,\n\t\tisOpen: false,\n\t\tisLoading: false,\n\t\ttriggerInfo: null,\n\t},\n}\n\nexport const useUIStateStore = create<UIState & UIActions>((set) => ({\n\t...initialState,\n\n\tsetShowExitHint: (show) => set({ showExitHint: show }),\n\tsetPendingExit: (pending) => set({ pendingExit: pending }),\n\tsetCountdownSeconds: (seconds) => set({ countdownSeconds: seconds }),\n\tsetShowCustomInput: (show) => set({ showCustomInput: show }),\n\tsetIsTransitioningToCustomInput: (transitioning) => set({ isTransitioningToCustomInput: transitioning }),\n\tsetManualFocus: (focus) => set({ manualFocus: focus }),\n\tsetShowTodoViewer: (show) => set({ showTodoViewer: show }),\n\tsetPickerState: (state) => set({ pickerState: state }),\n\tresetUIState: () => set(initialState),\n}))\n","/**\n * useTerminalSize - Hook that tracks terminal dimensions and re-renders on resize\n * Includes debouncing to prevent rendering issues during rapid resizing\n */\n\nimport { useState, useEffect, useRef } from \"react\"\n\ninterface TerminalSize {\n\tcolumns: number\n\trows: number\n}\n\n/**\n * Returns the current terminal size and re-renders when it changes\n * Debounces resize events to prevent rendering artifacts\n */\nexport function useTerminalSize(): TerminalSize {\n\t// Get initial size synchronously - this is the value used for first render\n\tconst [size, setSize] = useState<TerminalSize>(() => ({\n\t\tcolumns: process.stdout.columns || 80,\n\t\trows: process.stdout.rows || 24,\n\t}))\n\n\tconst debounceTimer = useRef<NodeJS.Timeout | null>(null)\n\n\tuseEffect(() => {\n\t\tconst handleResize = () => {\n\t\t\t// Clear any pending debounce\n\t\t\tif (debounceTimer.current) {\n\t\t\t\tclearTimeout(debounceTimer.current)\n\t\t\t}\n\n\t\t\t// Debounce resize events by 50ms\n\t\t\tdebounceTimer.current = setTimeout(() => {\n\t\t\t\t// Clear the terminal before updating size to prevent artifacts\n\t\t\t\tprocess.stdout.write(\"\\x1b[2J\\x1b[H\")\n\n\t\t\t\tsetSize({\n\t\t\t\t\tcolumns: process.stdout.columns || 80,\n\t\t\t\t\trows: process.stdout.rows || 24,\n\t\t\t\t})\n\t\t\t\tdebounceTimer.current = null\n\t\t\t}, 50)\n\t\t}\n\n\t\t// Listen for resize events\n\t\tprocess.stdout.on(\"resize\", handleResize)\n\n\t\t// Cleanup\n\t\treturn () => {\n\t\t\tprocess.stdout.off(\"resize\", handleResize)\n\t\t\tif (debounceTimer.current) {\n\t\t\t\tclearTimeout(debounceTimer.current)\n\t\t\t}\n\t\t}\n\t}, [])\n\n\treturn size\n}\n","/**\n * TerminalSizeContext - Provides terminal dimensions via React Context\n * This ensures only one instance of useTerminalSize exists in the app\n */\n\nimport { createContext, useContext, ReactNode } from \"react\"\nimport { useTerminalSize as useTerminalSizeHook } from \"./useTerminalSize.js\"\n\ninterface TerminalSizeContextValue {\n\tcolumns: number\n\trows: number\n}\n\nconst TerminalSizeContext = createContext<TerminalSizeContextValue | null>(null)\n\ninterface TerminalSizeProviderProps {\n\tchildren: ReactNode\n}\n\n/**\n * Provider component that wraps the app and provides terminal size to all children\n */\nexport function TerminalSizeProvider({ children }: TerminalSizeProviderProps) {\n\tconst size = useTerminalSizeHook()\n\treturn <TerminalSizeContext.Provider value={size}>{children}</TerminalSizeContext.Provider>\n}\n\n/**\n * Hook to access terminal size from context\n * Must be used within a TerminalSizeProvider\n */\nexport function useTerminalSize(): TerminalSizeContextValue {\n\tconst context = useContext(TerminalSizeContext)\n\tif (!context) {\n\t\tthrow new Error(\"useTerminalSize must be used within a TerminalSizeProvider\")\n\t}\n\treturn context\n}\n","import { create } from \"zustand\"\nimport { useEffect, useCallback, useRef } from \"react\"\n\n/**\n * Toast message types for different visual styles\n */\nexport type ToastType = \"info\" | \"success\" | \"warning\" | \"error\"\n\n/**\n * A single toast message in the queue\n */\nexport interface Toast {\n\tid: string\n\tmessage: string\n\ttype: ToastType\n\t/** Duration in milliseconds before auto-dismiss (default: 3000) */\n\tduration: number\n\t/** Timestamp when the toast was created */\n\tcreatedAt: number\n}\n\n/**\n * Toast queue store state\n */\ninterface ToastState {\n\t/** Queue of active toasts (FIFO - first one is displayed) */\n\ttoasts: Toast[]\n\t/** Add a toast to the queue */\n\taddToast: (message: string, type?: ToastType, duration?: number) => string\n\t/** Remove a specific toast by ID */\n\tremoveToast: (id: string) => void\n\t/** Clear all toasts */\n\tclearToasts: () => void\n}\n\n/**\n * Default toast duration in milliseconds\n */\nconst DEFAULT_DURATION = 3000\n\n/**\n * Generate a unique ID for toasts\n */\nlet toastIdCounter = 0\nfunction generateToastId(): string {\n\treturn `toast-${Date.now()}-${++toastIdCounter}`\n}\n\n/**\n * Zustand store for toast queue management\n */\nexport const useToastStore = create<ToastState>((set) => ({\n\ttoasts: [],\n\n\taddToast: (message: string, type: ToastType = \"info\", duration: number = DEFAULT_DURATION) => {\n\t\tconst id = generateToastId()\n\t\tconst toast: Toast = {\n\t\t\tid,\n\t\t\tmessage,\n\t\t\ttype,\n\t\t\tduration,\n\t\t\tcreatedAt: Date.now(),\n\t\t}\n\n\t\t// Replace any existing toasts - new toast shows immediately\n\t\t// This provides better UX as users see the most recent message right away\n\t\tset(() => ({\n\t\t\ttoasts: [toast],\n\t\t}))\n\n\t\treturn id\n\t},\n\n\tremoveToast: (id: string) => {\n\t\tset((state) => ({\n\t\t\ttoasts: state.toasts.filter((t) => t.id !== id),\n\t\t}))\n\t},\n\n\tclearToasts: () => {\n\t\tset({ toasts: [] })\n\t},\n}))\n\n/**\n * Hook for displaying and managing toasts with auto-expiry.\n * Returns the current toast (if any) and utility functions.\n *\n * The hook handles auto-dismissal of toasts after their duration expires.\n */\nexport function useToast() {\n\tconst { toasts, addToast, removeToast, clearToasts } = useToastStore()\n\n\t// Track active timers for cleanup\n\tconst timersRef = useRef<Map<string, NodeJS.Timeout>>(new Map())\n\n\t// Get the current toast to display (first in queue)\n\tconst currentToast = toasts.length > 0 ? toasts[0] : null\n\n\t// Set up auto-dismissal timer for current toast\n\tuseEffect(() => {\n\t\tif (!currentToast) {\n\t\t\treturn\n\t\t}\n\n\t\t// Check if timer already exists for this toast\n\t\tif (timersRef.current.has(currentToast.id)) {\n\t\t\treturn\n\t\t}\n\n\t\t// Calculate remaining time (accounts for time already elapsed)\n\t\tconst elapsed = Date.now() - currentToast.createdAt\n\t\tconst remainingTime = Math.max(0, currentToast.duration - elapsed)\n\n\t\tconst timer = setTimeout(() => {\n\t\t\tremoveToast(currentToast.id)\n\t\t\ttimersRef.current.delete(currentToast.id)\n\t\t}, remainingTime)\n\n\t\ttimersRef.current.set(currentToast.id, timer)\n\n\t\treturn () => {\n\t\t\t// Clean up timer if toast is removed before expiry\n\t\t\tconst existingTimer = timersRef.current.get(currentToast.id)\n\t\t\tif (existingTimer) {\n\t\t\t\tclearTimeout(existingTimer)\n\t\t\t\ttimersRef.current.delete(currentToast.id)\n\t\t\t}\n\t\t}\n\t}, [currentToast?.id, currentToast?.createdAt, currentToast?.duration, removeToast])\n\n\t// Cleanup all timers on unmount\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\ttimersRef.current.forEach((timer) => clearTimeout(timer))\n\t\t\ttimersRef.current.clear()\n\t\t}\n\t}, [])\n\n\t// Convenience methods for different toast types\n\tconst showToast = useCallback(\n\t\t(message: string, type?: ToastType, duration?: number) => {\n\t\t\treturn addToast(message, type, duration)\n\t\t},\n\t\t[addToast],\n\t)\n\n\tconst showInfo = useCallback(\n\t\t(message: string, duration?: number) => {\n\t\t\treturn addToast(message, \"info\", duration)\n\t\t},\n\t\t[addToast],\n\t)\n\n\tconst showSuccess = useCallback(\n\t\t(message: string, duration?: number) => {\n\t\t\treturn addToast(message, \"success\", duration)\n\t\t},\n\t\t[addToast],\n\t)\n\n\tconst showWarning = useCallback(\n\t\t(message: string, duration?: number) => {\n\t\t\treturn addToast(message, \"warning\", duration)\n\t\t},\n\t\t[addToast],\n\t)\n\n\tconst showError = useCallback(\n\t\t(message: string, duration?: number) => {\n\t\t\treturn addToast(message, \"error\", duration)\n\t\t},\n\t\t[addToast],\n\t)\n\n\treturn {\n\t\t/** Current toast being displayed (first in queue) */\n\t\tcurrentToast,\n\t\t/** All toasts in the queue */\n\t\ttoasts,\n\t\t/** Generic toast display method */\n\t\tshowToast,\n\t\t/** Show an info toast */\n\t\tshowInfo,\n\t\t/** Show a success toast */\n\t\tshowSuccess,\n\t\t/** Show a warning toast */\n\t\tshowWarning,\n\t\t/** Show an error toast */\n\t\tshowError,\n\t\t/** Remove a specific toast by ID */\n\t\tremoveToast,\n\t\t/** Clear all toasts */\n\t\tclearToasts,\n\t}\n}\n","import * as fs from \"fs/promises\"\nimport * as path from \"path\"\n\nimport { ensureConfigDir, getConfigDir } from \"./config-dir.js\"\n\n/** Maximum number of history entries to keep */\nexport const MAX_HISTORY_ENTRIES = 500\n\n/** History file format version for future migrations */\nconst HISTORY_VERSION = 1\n\ninterface HistoryData {\n\tversion: number\n\tentries: string[]\n}\n\n/**\n * Get the path to the history file\n */\nexport function getHistoryFilePath(): string {\n\treturn path.join(getConfigDir(), \"cli-history.json\")\n}\n\n/**\n * Load history entries from file\n * Returns empty array if file doesn't exist or is invalid\n */\nexport async function loadHistory(): Promise<string[]> {\n\tconst filePath = getHistoryFilePath()\n\n\ttry {\n\t\tconst content = await fs.readFile(filePath, \"utf-8\")\n\t\tconst data: HistoryData = JSON.parse(content)\n\n\t\t// Validate structure\n\t\tif (!data || typeof data !== \"object\") {\n\t\t\treturn []\n\t\t}\n\n\t\tif (!Array.isArray(data.entries)) {\n\t\t\treturn []\n\t\t}\n\n\t\t// Filter to only valid strings\n\t\treturn data.entries.filter((entry): entry is string => typeof entry === \"string\" && entry.trim().length > 0)\n\t} catch (err) {\n\t\tconst error = err as NodeJS.ErrnoException\n\t\t// File doesn't exist - that's expected on first run\n\t\tif (error.code === \"ENOENT\") {\n\t\t\treturn []\n\t\t}\n\n\t\t// JSON parse error or other issue - log and return empty\n\t\tconsole.error(\"Warning: Could not load CLI history:\", error.message)\n\t\treturn []\n\t}\n}\n\n/**\n * Save history entries to file\n * Creates the .roo directory if needed\n * Trims to MAX_HISTORY_ENTRIES\n */\nexport async function saveHistory(entries: string[]): Promise<void> {\n\tconst filePath = getHistoryFilePath()\n\n\t// Trim to max entries (keep most recent)\n\tconst trimmedEntries = entries.slice(-MAX_HISTORY_ENTRIES)\n\n\tconst data: HistoryData = {\n\t\tversion: HISTORY_VERSION,\n\t\tentries: trimmedEntries,\n\t}\n\n\ttry {\n\t\tawait ensureConfigDir()\n\t\tawait fs.writeFile(filePath, JSON.stringify(data, null, \"\\t\"), \"utf-8\")\n\t} catch (err) {\n\t\tconst error = err as NodeJS.ErrnoException\n\t\t// Log but don't throw - history persistence is not critical\n\t\tconsole.error(\"Warning: Could not save CLI history:\", error.message)\n\t}\n}\n\n/**\n * Add a new entry to history and save\n * Avoids adding consecutive duplicates or empty entries\n * Returns the updated history array\n */\nexport async function addToHistory(entry: string): Promise<string[]> {\n\tconst trimmed = entry.trim()\n\n\t// Don't add empty entries\n\tif (!trimmed) {\n\t\treturn await loadHistory()\n\t}\n\n\tconst history = await loadHistory()\n\n\t// Don't add consecutive duplicates\n\tif (history.length > 0 && history[history.length - 1] === trimmed) {\n\t\treturn history\n\t}\n\n\tconst updated = [...history, trimmed]\n\tawait saveHistory(updated)\n\n\treturn updated.slice(-MAX_HISTORY_ENTRIES)\n}\n","import { useState, useEffect, useCallback, useRef } from \"react\"\n\nimport { loadHistory, addToHistory } from \"../../lib/storage/history.js\"\n\nexport interface UseInputHistoryOptions {\n\tisActive?: boolean\n\tgetCurrentInput?: () => string\n}\n\nexport interface UseInputHistoryReturn {\n\taddEntry: (entry: string) => Promise<void>\n\thistoryValue: string | null\n\tisBrowsing: boolean\n\tresetBrowsing: (currentInput?: string) => void\n\thistory: string[]\n\tdraft: string\n\tsetDraft: (value: string) => void\n\tnavigateUp: () => void\n\tnavigateDown: () => void\n}\n\nexport function useInputHistory(options: UseInputHistoryOptions = {}): UseInputHistoryReturn {\n\tconst { isActive = true, getCurrentInput } = options\n\n\t// All history entries (oldest first, newest at end)\n\tconst [history, setHistory] = useState<string[]>([])\n\n\t// Current position in history (-1 = not browsing, 0 = oldest, history.length-1 = newest)\n\tconst [historyIndex, setHistoryIndex] = useState(-1)\n\n\t// The user's typed text before they started navigating history\n\tconst [draft, setDraft] = useState(\"\")\n\n\t// Flag to track if history has been loaded\n\tconst historyLoaded = useRef(false)\n\n\t// Load history on mount\n\tuseEffect(() => {\n\t\tif (!historyLoaded.current) {\n\t\t\thistoryLoaded.current = true\n\t\t\tloadHistory()\n\t\t\t\t.then(setHistory)\n\t\t\t\t.catch(() => {\n\t\t\t\t\t// Ignore load errors - history is not critical\n\t\t\t\t})\n\t\t}\n\t}, [])\n\n\t// Navigate to older history entry\n\tconst navigateUp = useCallback(() => {\n\t\tif (!isActive) return\n\t\tif (history.length === 0) return\n\n\t\tif (historyIndex === -1) {\n\t\t\t// Starting to browse - save current input as draft\n\t\t\tif (getCurrentInput) {\n\t\t\t\tsetDraft(getCurrentInput())\n\t\t\t}\n\t\t\t// Go to newest entry\n\t\t\tsetHistoryIndex(history.length - 1)\n\t\t} else if (historyIndex > 0) {\n\t\t\t// Go to older entry\n\t\t\tsetHistoryIndex(historyIndex - 1)\n\t\t}\n\t\t// At oldest entry - stay there\n\t}, [isActive, history, historyIndex, getCurrentInput])\n\n\t// Navigate to newer history entry\n\tconst navigateDown = useCallback(() => {\n\t\tif (!isActive) return\n\t\tif (historyIndex === -1) return // Not browsing\n\n\t\tif (historyIndex < history.length - 1) {\n\t\t\t// Go to newer entry\n\t\t\tsetHistoryIndex(historyIndex + 1)\n\t\t} else {\n\t\t\t// At newest entry - return to draft\n\t\t\tsetHistoryIndex(-1)\n\t\t}\n\t}, [isActive, historyIndex, history.length])\n\n\t// Add new entry to history\n\tconst addEntry = useCallback(async (entry: string) => {\n\t\tconst trimmed = entry.trim()\n\t\tif (!trimmed) return\n\n\t\ttry {\n\t\t\tconst updated = await addToHistory(trimmed)\n\t\t\tsetHistory(updated)\n\t\t} catch {\n\t\t\t// Ignore save errors - history is not critical\n\t\t}\n\n\t\t// Reset navigation state\n\t\tsetHistoryIndex(-1)\n\t\tsetDraft(\"\")\n\t}, [])\n\n\t// Reset browsing state\n\tconst resetBrowsing = useCallback((currentInput?: string) => {\n\t\tsetHistoryIndex(-1)\n\t\tif (currentInput !== undefined) {\n\t\t\tsetDraft(currentInput)\n\t\t}\n\t}, [])\n\n\t// Calculate the current history value to display\n\t// When browsing, show history entry; when returning from browsing, show draft\n\tlet historyValue: string | null = null\n\tif (historyIndex >= 0 && historyIndex < history.length) {\n\t\thistoryValue = history[historyIndex] ?? null\n\t}\n\n\tconst isBrowsing = historyIndex !== -1\n\n\treturn {\n\t\taddEntry,\n\t\thistoryValue,\n\t\tisBrowsing,\n\t\tresetBrowsing,\n\t\thistory,\n\t\tdraft,\n\t\tsetDraft,\n\t\tnavigateUp,\n\t\tnavigateDown,\n\t}\n}\n","import { useEffect, useRef } from \"react\"\nimport { FOLLOWUP_TIMEOUT_SECONDS } from \"../../types/constants.js\"\nimport { useUIStateStore } from \"../stores/uiStateStore.js\"\nimport type { PendingAsk } from \"../types.js\"\n\nexport interface UseFollowupCountdownOptions {\n\tpendingAsk: PendingAsk | null\n\tonAutoSubmit: (text: string) => void\n}\n\n/**\n * Hook to manage auto-accept countdown timer for followup questions with suggestions.\n *\n * When a followup question appears with suggestions (and not in custom input mode),\n * starts a countdown timer that auto-submits the first suggestion when it reaches zero.\n *\n * The countdown can be canceled by:\n * - User navigating with arrow keys\n * - User switching to custom input mode\n * - Followup question changing/disappearing\n */\nexport function useFollowupCountdown({ pendingAsk, onAutoSubmit }: UseFollowupCountdownOptions) {\n\tconst { showCustomInput, countdownSeconds, setCountdownSeconds } = useUIStateStore()\n\tconst countdownIntervalRef = useRef<NodeJS.Timeout | null>(null)\n\n\t// Use ref for onAutoSubmit to avoid stale closure issues without needing it in dependencies\n\tconst onAutoSubmitRef = useRef(onAutoSubmit)\n\tuseEffect(() => {\n\t\tonAutoSubmitRef.current = onAutoSubmit\n\t}, [onAutoSubmit])\n\n\t// Cleanup interval on unmount\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tif (countdownIntervalRef.current) {\n\t\t\t\tclearInterval(countdownIntervalRef.current)\n\t\t\t}\n\t\t}\n\t}, [])\n\n\t// Start countdown when a followup question with suggestions appears\n\tuseEffect(() => {\n\t\t// Clear any existing countdown\n\t\tif (countdownIntervalRef.current) {\n\t\t\tclearInterval(countdownIntervalRef.current)\n\t\t\tcountdownIntervalRef.current = null\n\t\t}\n\n\t\t// Only start countdown for followup questions with suggestions (not custom input mode)\n\t\tif (\n\t\t\tpendingAsk?.type === \"followup\" &&\n\t\t\tpendingAsk.suggestions &&\n\t\t\tpendingAsk.suggestions.length > 0 &&\n\t\t\t!showCustomInput\n\t\t) {\n\t\t\t// Start countdown\n\t\t\tsetCountdownSeconds(FOLLOWUP_TIMEOUT_SECONDS)\n\n\t\t\tcountdownIntervalRef.current = setInterval(() => {\n\t\t\t\tconst currentSeconds = useUIStateStore.getState().countdownSeconds\n\t\t\t\tif (currentSeconds === null || currentSeconds <= 1) {\n\t\t\t\t\t// Time's up! Auto-select first option\n\t\t\t\t\tif (countdownIntervalRef.current) {\n\t\t\t\t\t\tclearInterval(countdownIntervalRef.current)\n\t\t\t\t\t\tcountdownIntervalRef.current = null\n\t\t\t\t\t}\n\t\t\t\t\tsetCountdownSeconds(null)\n\t\t\t\t\t// Auto-submit the first suggestion\n\t\t\t\t\tif (pendingAsk?.suggestions && pendingAsk.suggestions.length > 0) {\n\t\t\t\t\t\tconst firstSuggestion = pendingAsk.suggestions[0]\n\t\t\t\t\t\tif (firstSuggestion) {\n\t\t\t\t\t\t\tonAutoSubmitRef.current(firstSuggestion.answer)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tsetCountdownSeconds(currentSeconds - 1)\n\t\t\t\t}\n\t\t\t}, 1000)\n\t\t} else {\n\t\t\t// Only set to null if not already null to prevent unnecessary state updates\n\t\t\t// This is critical to avoid infinite render loops\n\t\t\tif (countdownSeconds !== null) {\n\t\t\t\tsetCountdownSeconds(null)\n\t\t\t}\n\t\t}\n\n\t\treturn () => {\n\t\t\tif (countdownIntervalRef.current) {\n\t\t\t\tclearInterval(countdownIntervalRef.current)\n\t\t\t\tcountdownIntervalRef.current = null\n\t\t\t}\n\t\t}\n\t\t// Note: countdownSeconds is intentionally NOT in deps - we only read it to avoid\n\t\t// unnecessary state updates, not to react to its changes\n\t}, [pendingAsk?.id, pendingAsk?.type, showCustomInput, setCountdownSeconds])\n\n\t/**\n\t * Cancel the countdown timer (called when user interacts with the menu)\n\t */\n\tconst cancelCountdown = () => {\n\t\tif (countdownIntervalRef.current) {\n\t\t\tclearInterval(countdownIntervalRef.current)\n\t\t\tcountdownIntervalRef.current = null\n\t\t}\n\t\tsetCountdownSeconds(null)\n\t}\n\n\treturn {\n\t\tcountdownSeconds,\n\t\tcancelCountdown,\n\t}\n}\n","import { useEffect } from \"react\"\nimport { useUIStateStore } from \"../stores/uiStateStore.js\"\nimport type { PendingAsk } from \"../types.js\"\n\nexport interface UseFocusManagementOptions {\n\tshowApprovalPrompt: boolean\n\tpendingAsk: PendingAsk | null\n}\n\nexport interface UseFocusManagementReturn {\n\t/** Whether focus can be toggled between scroll and input areas */\n\tcanToggleFocus: boolean\n\t/** Whether scroll area should capture keyboard input */\n\tisScrollAreaActive: boolean\n\t/** Whether input area is active (for visual focus indicator) */\n\tisInputAreaActive: boolean\n\t/** Manual focus override */\n\tmanualFocus: \"scroll\" | \"input\" | null\n\t/** Set manual focus override */\n\tsetManualFocus: (focus: \"scroll\" | \"input\" | null) => void\n\t/** Toggle focus between scroll and input */\n\ttoggleFocus: () => void\n}\n\n/**\n * Hook to manage focus state between scroll area and input area.\n *\n * Focus can be toggled when text input is available (not showing approval prompt).\n * The hook automatically resets manual focus when the view changes.\n */\nexport function useFocusManagement({\n\tshowApprovalPrompt,\n\tpendingAsk,\n}: UseFocusManagementOptions): UseFocusManagementReturn {\n\tconst { showCustomInput, manualFocus, setManualFocus } = useUIStateStore()\n\n\t// Determine if we're in a mode where focus can be toggled (text input is available)\n\tconst canToggleFocus =\n\t\t!showApprovalPrompt &&\n\t\t(!pendingAsk || // Initial input or task complete or loading\n\t\t\tpendingAsk.type === \"followup\" || // Followup question with suggestions or custom input\n\t\t\tshowCustomInput) // Custom input mode\n\n\t// Determine if scroll area should capture keyboard input\n\tconst isScrollAreaActive: boolean =\n\t\tmanualFocus === \"scroll\" ? true : manualFocus === \"input\" ? false : Boolean(showApprovalPrompt)\n\n\t// Determine if input area is active (for visual focus indicator)\n\tconst isInputAreaActive: boolean =\n\t\tmanualFocus === \"input\" ? true : manualFocus === \"scroll\" ? false : !showApprovalPrompt\n\n\t// Reset manual focus when view changes (e.g., agent starts responding)\n\tuseEffect(() => {\n\t\tif (!canToggleFocus) {\n\t\t\tsetManualFocus(null)\n\t\t}\n\t}, [canToggleFocus, setManualFocus])\n\n\t/**\n\t * Toggle focus between scroll and input areas\n\t */\n\tconst toggleFocus = () => {\n\t\tif (!canToggleFocus) {\n\t\t\treturn\n\t\t}\n\n\t\tconst prev = manualFocus\n\t\tif (prev === \"scroll\") {\n\t\t\tsetManualFocus(\"input\")\n\t\t} else if (prev === \"input\") {\n\t\t\tsetManualFocus(\"scroll\")\n\t\t} else {\n\t\t\tsetManualFocus(isScrollAreaActive ? \"input\" : \"scroll\")\n\t\t}\n\t}\n\n\treturn {\n\t\tcanToggleFocus,\n\t\tisScrollAreaActive,\n\t\tisInputAreaActive,\n\t\tmanualFocus,\n\t\tsetManualFocus,\n\t\ttoggleFocus,\n\t}\n}\n","import type { TodoItem } from \"../../types\"\r\n\r\nimport type { ToolData } from \"../types.js\"\r\n\r\n/**\r\n * Extract structured ToolData from parsed tool JSON\r\n * This provides rich data for tool-specific renderers\r\n */\r\nexport function extractToolData(toolInfo: Record<string, unknown>): ToolData {\r\n\tconst toolName = (toolInfo.tool as string) || \"unknown\"\r\n\r\n\t// Base tool data with common fields\r\n\tconst toolData: ToolData = {\r\n\t\ttool: toolName,\r\n\t\tpath: toolInfo.path as string | undefined,\r\n\t\tisOutsideWorkspace: toolInfo.isOutsideWorkspace as boolean | undefined,\r\n\t\tisProtected: toolInfo.isProtected as boolean | undefined,\r\n\t\tcontent: toolInfo.content as string | undefined,\r\n\t\treason: toolInfo.reason as string | undefined,\r\n\t}\r\n\r\n\t// Extract diff-related fields\r\n\tif (toolInfo.diff !== undefined) {\r\n\t\ttoolData.diff = toolInfo.diff as string\r\n\t}\r\n\tif (toolInfo.diffStats !== undefined) {\r\n\t\tconst stats = toolInfo.diffStats as { added?: number; removed?: number }\r\n\t\tif (typeof stats.added === \"number\" && typeof stats.removed === \"number\") {\r\n\t\t\ttoolData.diffStats = { added: stats.added, removed: stats.removed }\r\n\t\t}\r\n\t}\r\n\r\n\t// Extract search-related fields\r\n\tif (toolInfo.regex !== undefined) {\r\n\t\ttoolData.regex = toolInfo.regex as string\r\n\t}\r\n\tif (toolInfo.filePattern !== undefined) {\r\n\t\ttoolData.filePattern = toolInfo.filePattern as string\r\n\t}\r\n\tif (toolInfo.query !== undefined) {\r\n\t\ttoolData.query = toolInfo.query as string\r\n\t}\r\n\r\n\t// Extract mode-related fields\r\n\tif (toolInfo.mode !== undefined) {\r\n\t\ttoolData.mode = toolInfo.mode as string\r\n\t}\r\n\tif (toolInfo.mode_slug !== undefined) {\r\n\t\ttoolData.mode = toolInfo.mode_slug as string\r\n\t}\r\n\r\n\t// Extract command-related fields\r\n\tif (toolInfo.command !== undefined) {\r\n\t\ttoolData.command = toolInfo.command as string\r\n\t}\r\n\tif (toolInfo.output !== undefined) {\r\n\t\ttoolData.output = toolInfo.output as string\r\n\t}\r\n\r\n\t// Extract batch file operations\r\n\tif (Array.isArray(toolInfo.files)) {\r\n\t\ttoolData.batchFiles = (toolInfo.files as Array<Record<string, unknown>>).map((f) => ({\r\n\t\t\tpath: (f.path as string) || \"\",\r\n\t\t\tlineSnippet: f.lineSnippet as string | undefined,\r\n\t\t\tisOutsideWorkspace: f.isOutsideWorkspace as boolean | undefined,\r\n\t\t\tkey: f.key as string | undefined,\r\n\t\t\tcontent: f.content as string | undefined,\r\n\t\t}))\r\n\t}\r\n\r\n\t// Extract batch diff operations\r\n\tif (Array.isArray(toolInfo.batchDiffs)) {\r\n\t\ttoolData.batchDiffs = (toolInfo.batchDiffs as Array<Record<string, unknown>>).map((d) => ({\r\n\t\t\tpath: (d.path as string) || \"\",\r\n\t\t\tchangeCount: d.changeCount as number | undefined,\r\n\t\t\tkey: d.key as string | undefined,\r\n\t\t\tcontent: d.content as string | undefined,\r\n\t\t\tdiffStats: d.diffStats as { added: number; removed: number } | undefined,\r\n\t\t\tdiffs: d.diffs as Array<{ content: string; startLine?: number }> | undefined,\r\n\t\t}))\r\n\t}\r\n\r\n\t// Extract question/completion fields\r\n\tif (toolInfo.question !== undefined) {\r\n\t\ttoolData.question = toolInfo.question as string\r\n\t}\r\n\tif (toolInfo.result !== undefined) {\r\n\t\ttoolData.result = toolInfo.result as string\r\n\t}\r\n\r\n\t// Extract additional display hints\r\n\tif (toolInfo.lineNumber !== undefined) {\r\n\t\ttoolData.lineNumber = toolInfo.lineNumber as number\r\n\t}\r\n\tif (toolInfo.additionalFileCount !== undefined) {\r\n\t\ttoolData.additionalFileCount = toolInfo.additionalFileCount as number\r\n\t}\r\n\r\n\treturn toolData\r\n}\r\n\r\n/**\r\n * Format tool output for display (used in the message body, header shows tool name separately)\r\n */\r\nexport function formatToolOutput(toolInfo: Record<string, unknown>): string {\r\n\tconst toolName = (toolInfo.tool as string) || \"unknown\"\r\n\r\n\tswitch (toolName) {\r\n\t\tcase \"switchMode\": {\r\n\t\t\tconst mode = (toolInfo.mode as string) || \"unknown\"\r\n\t\t\tconst reason = toolInfo.reason as string\r\n\t\t\treturn `→ ${mode} mode${reason ? `\\n ${reason}` : \"\"}`\r\n\t\t}\r\n\r\n\t\tcase \"switch_mode\": {\r\n\t\t\tconst mode = (toolInfo.mode_slug as string) || (toolInfo.mode as string) || \"unknown\"\r\n\t\t\tconst reason = toolInfo.reason as string\r\n\t\t\treturn `→ ${mode} mode${reason ? `\\n ${reason}` : \"\"}`\r\n\t\t}\r\n\r\n\t\tcase \"execute_command\": {\r\n\t\t\tconst command = toolInfo.command as string\r\n\t\t\treturn `$ ${command || \"(no command)\"}`\r\n\t\t}\r\n\r\n\t\tcase \"read_file\": {\r\n\t\t\tconst files = toolInfo.files as Array<{ path: string }> | undefined\r\n\t\t\tconst path = toolInfo.path as string\r\n\t\t\tif (files && files.length > 0) {\r\n\t\t\t\treturn files.map((f) => `📄 ${f.path}`).join(\"\\n\")\r\n\t\t\t}\r\n\t\t\treturn `📄 ${path || \"(no path)\"}`\r\n\t\t}\r\n\r\n\t\tcase \"write_to_file\": {\r\n\t\t\tconst writePath = toolInfo.path as string\r\n\t\t\treturn `📝 ${writePath || \"(no path)\"}`\r\n\t\t}\r\n\r\n\t\tcase \"apply_diff\": {\r\n\t\t\tconst diffPath = toolInfo.path as string\r\n\t\t\treturn `✏️ ${diffPath || \"(no path)\"}`\r\n\t\t}\r\n\r\n\t\tcase \"search_files\": {\r\n\t\t\tconst searchPath = toolInfo.path as string\r\n\t\t\tconst regex = toolInfo.regex as string\r\n\t\t\treturn `🔍 \"${regex}\" in ${searchPath || \".\"}`\r\n\t\t}\r\n\r\n\t\tcase \"list_files\": {\r\n\t\t\tconst listPath = toolInfo.path as string\r\n\t\t\tconst recursive = toolInfo.recursive as boolean\r\n\t\t\treturn `📁 ${listPath || \".\"}${recursive ? \" (recursive)\" : \"\"}`\r\n\t\t}\r\n\r\n\t\tcase \"attempt_completion\": {\r\n\t\t\tconst result = toolInfo.result as string\r\n\t\t\tif (result) {\r\n\t\t\t\tconst truncated = result.length > 100 ? result.substring(0, 100) + \"...\" : result\r\n\t\t\t\treturn `✅ ${truncated}`\r\n\t\t\t}\r\n\t\t\treturn \"✅ Task completed\"\r\n\t\t}\r\n\r\n\t\tcase \"ask_followup_question\": {\r\n\t\t\tconst question = toolInfo.question as string\r\n\t\t\treturn `❓ ${question || \"(no question)\"}`\r\n\t\t}\r\n\r\n\t\tcase \"new_task\": {\r\n\t\t\tconst taskMode = toolInfo.mode as string\r\n\t\t\treturn `📋 Creating subtask${taskMode ? ` in ${taskMode} mode` : \"\"}`\r\n\t\t}\r\n\r\n\t\tcase \"update_todo_list\":\r\n\t\tcase \"updateTodoList\": {\r\n\t\t\t// Special marker - actual rendering is handled by TodoChangeDisplay component\r\n\t\t\treturn \"☑ TODO list updated\"\r\n\t\t}\r\n\r\n\t\tdefault: {\r\n\t\t\tconst params = Object.entries(toolInfo)\r\n\t\t\t\t.filter(([key]) => key !== \"tool\")\r\n\t\t\t\t.map(([key, value]) => {\r\n\t\t\t\t\tconst displayValue = typeof value === \"string\" ? value : JSON.stringify(value)\r\n\t\t\t\t\tconst truncated = displayValue.length > 100 ? displayValue.substring(0, 100) + \"...\" : displayValue\r\n\t\t\t\t\treturn `${key}: ${truncated}`\r\n\t\t\t\t})\r\n\t\t\t\t.join(\"\\n\")\r\n\t\t\treturn params || \"(no parameters)\"\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * Format tool ask message for user approval prompt\r\n */\r\nexport function formatToolAskMessage(toolInfo: Record<string, unknown>): string {\r\n\tconst toolName = (toolInfo.tool as string) || \"unknown\"\r\n\r\n\tswitch (toolName) {\r\n\t\tcase \"switchMode\":\r\n\t\tcase \"switch_mode\": {\r\n\t\t\tconst mode = (toolInfo.mode as string) || (toolInfo.mode_slug as string) || \"unknown\"\r\n\t\t\tconst reason = toolInfo.reason as string\r\n\t\t\treturn `Switch to ${mode} mode?${reason ? `\\nReason: ${reason}` : \"\"}`\r\n\t\t}\r\n\r\n\t\tcase \"execute_command\": {\r\n\t\t\tconst command = toolInfo.command as string\r\n\t\t\treturn `Run command?\\n$ ${command || \"(no command)\"}`\r\n\t\t}\r\n\r\n\t\tcase \"read_file\": {\r\n\t\t\tconst files = toolInfo.files as Array<{ path: string }> | undefined\r\n\t\t\tconst path = toolInfo.path as string\r\n\t\t\tif (files && files.length > 0) {\r\n\t\t\t\treturn `Read ${files.length} file(s)?\\n${files.map((f) => ` ${f.path}`).join(\"\\n\")}`\r\n\t\t\t}\r\n\t\t\treturn `Read file: ${path || \"(no path)\"}`\r\n\t\t}\r\n\r\n\t\tcase \"write_to_file\": {\r\n\t\t\tconst writePath = toolInfo.path as string\r\n\t\t\treturn `Write to file: ${writePath || \"(no path)\"}`\r\n\t\t}\r\n\r\n\t\tcase \"apply_diff\": {\r\n\t\t\tconst diffPath = toolInfo.path as string\r\n\t\t\treturn `Apply changes to: ${diffPath || \"(no path)\"}`\r\n\t\t}\r\n\r\n\t\tdefault: {\r\n\t\t\tconst params = Object.entries(toolInfo)\r\n\t\t\t\t.filter(([key]) => key !== \"tool\")\r\n\t\t\t\t.map(([key, value]) => {\r\n\t\t\t\t\tconst displayValue = typeof value === \"string\" ? value : JSON.stringify(value)\r\n\t\t\t\t\tconst truncated = displayValue.length > 80 ? displayValue.substring(0, 80) + \"...\" : displayValue\r\n\t\t\t\t\treturn ` ${key}: ${truncated}`\r\n\t\t\t\t})\r\n\t\t\t\t.join(\"\\n\")\r\n\t\t\treturn `${toolName}${params ? `\\n${params}` : \"\"}`\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * Parse TODO items from tool info\r\n * Handles both array format and markdown checklist string format\r\n */\r\nexport function parseTodosFromToolInfo(toolInfo: Record<string, unknown>): TodoItem[] | null {\r\n\t// Try to get todos directly as an array\r\n\tconst todosArray = toolInfo.todos as unknown[] | undefined\r\n\tif (Array.isArray(todosArray)) {\r\n\t\treturn todosArray\r\n\t\t\t.map((item, index) => {\r\n\t\t\t\tif (typeof item === \"object\" && item !== null) {\r\n\t\t\t\t\tconst todo = item as Record<string, unknown>\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tid: (todo.id as string) || `todo-${index}`,\r\n\t\t\t\t\t\tcontent: (todo.content as string) || \"\",\r\n\t\t\t\t\t\tstatus: ((todo.status as string) || \"pending\") as TodoItem[\"status\"],\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn null\r\n\t\t\t})\r\n\t\t\t.filter((item): item is TodoItem => item !== null)\r\n\t}\r\n\r\n\t// Try to parse markdown checklist format from todos string\r\n\tconst todosString = toolInfo.todos as string | undefined\r\n\tif (typeof todosString === \"string\") {\r\n\t\treturn parseMarkdownChecklist(todosString)\r\n\t}\r\n\r\n\treturn null\r\n}\r\n\r\n/**\r\n * Parse a markdown checklist string into TodoItem array\r\n * Format:\r\n * [ ] pending item\r\n * [-] in progress item\r\n * [x] completed item\r\n */\r\nexport function parseMarkdownChecklist(markdown: string): TodoItem[] {\r\n\tconst lines = markdown.split(\"\\n\")\r\n\tconst todos: TodoItem[] = []\r\n\r\n\tfor (let i = 0; i < lines.length; i++) {\r\n\t\tconst line = lines[i]\r\n\r\n\t\tif (!line) {\r\n\t\t\tcontinue\r\n\t\t}\r\n\r\n\t\tconst trimmedLine = line.trim()\r\n\r\n\t\tif (!trimmedLine) {\r\n\t\t\tcontinue\r\n\t\t}\r\n\r\n\t\t// Match markdown checkbox patterns\r\n\t\tconst checkboxMatch = trimmedLine.match(/^\\[([x\\-\\s])\\]\\s*(.+)$/i)\r\n\r\n\t\tif (checkboxMatch) {\r\n\t\t\tconst statusChar = checkboxMatch[1] ?? \" \"\r\n\t\t\tconst content = checkboxMatch[2] ?? \"\"\r\n\t\t\tlet status: TodoItem[\"status\"] = \"pending\"\r\n\r\n\t\t\tif (statusChar.toLowerCase() === \"x\") {\r\n\t\t\t\tstatus = \"completed\"\r\n\t\t\t} else if (statusChar === \"-\") {\r\n\t\t\t\tstatus = \"in_progress\"\r\n\t\t\t}\r\n\r\n\t\t\ttodos.push({ id: `todo-${i}`, content: content.trim(), status })\r\n\t\t}\r\n\t}\r\n\r\n\treturn todos\r\n}\r\n","import { useCallback, useRef } from \"react\"\nimport type { ExtensionMessage, ClineMessage, ClineAsk, ClineSay, TodoItem } from \"../../types\"\nimport { consolidateTokenUsage, consolidateApiRequests, consolidateCommands } from \"@roo-code/core/utils\"\n\nimport type { TUIMessage, ToolData } from \"../types.js\"\nimport type { FileResult, SlashCommandResult, ModeResult } from \"../components/autocomplete/index.js\"\nimport { useCLIStore } from \"../store.js\"\nimport { extractToolData, formatToolOutput, formatToolAskMessage, parseTodosFromToolInfo } from \"../utils/tools.js\"\n\nexport interface UseMessageHandlersOptions {\n\tnonInteractive: boolean\n}\n\nexport interface UseMessageHandlersReturn {\n\thandleExtensionMessage: (msg: ExtensionMessage) => void\n\tseenMessageIds: React.MutableRefObject<Set<string>>\n\tpendingCommandRef: React.MutableRefObject<string | null>\n\tfirstTextMessageSkipped: React.MutableRefObject<boolean>\n}\n\n/**\n * Hook to handle messages from the extension.\n *\n * Processes three types of messages:\n * 1. \"say\" messages - Information from the agent (text, tool output, reasoning)\n * 2. \"ask\" messages - Requests for user input (approvals, followup questions)\n * 3. Extension state updates - Mode changes, task history, file search results\n *\n * Transforms ClineMessage format to TUIMessage format and updates the store.\n */\nexport function useMessageHandlers({ nonInteractive }: UseMessageHandlersOptions): UseMessageHandlersReturn {\n\tconst {\n\t\taddMessage,\n\t\tsetPendingAsk,\n\t\tsetComplete,\n\t\tsetLoading,\n\t\tsetHasStartedTask,\n\t\tsetFileSearchResults,\n\t\tsetAllSlashCommands,\n\t\tsetAvailableModes,\n\t\tsetCurrentMode,\n\t\tsetTokenUsage,\n\t\tsetRouterModels,\n\t\tsetTaskHistory,\n\t\tcurrentTodos,\n\t\tsetTodos,\n\t} = useCLIStore()\n\n\t// Track seen message timestamps to filter duplicates and the prompt echo\n\tconst seenMessageIds = useRef<Set<string>>(new Set())\n\tconst firstTextMessageSkipped = useRef(false)\n\n\t// Track pending command for injecting into command_output toolData\n\tconst pendingCommandRef = useRef<string | null>(null)\n\n\t/**\n\t * Map extension \"say\" messages to TUI messages\n\t */\n\tconst handleSayMessage = useCallback(\n\t\t(ts: number, say: ClineSay, text: string, partial: boolean) => {\n\t\t\tconst messageId = ts.toString()\n\t\t\tconst isResuming = useCLIStore.getState().isResumingTask\n\n\t\t\tif (say === \"checkpoint_saved\") {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (say === \"api_req_started\") {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (say === \"user_feedback\") {\n\t\t\t\tseenMessageIds.current.add(messageId)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Skip first text message ONLY for new tasks, not resumed tasks\n\t\t\t// When resuming, we want to show all historical messages including the first one\n\t\t\tif (say === \"text\" && !firstTextMessageSkipped.current && !isResuming) {\n\t\t\t\tfirstTextMessageSkipped.current = true\n\t\t\t\tseenMessageIds.current.add(messageId)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (seenMessageIds.current.has(messageId) && !partial) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tlet role: TUIMessage[\"role\"] = \"assistant\"\n\t\t\tlet toolName: string | undefined\n\t\t\tlet toolDisplayName: string | undefined\n\t\t\tlet toolDisplayOutput: string | undefined\n\t\t\tlet toolData: ToolData | undefined\n\n\t\t\tif (say === \"command_output\") {\n\t\t\t\trole = \"tool\"\n\t\t\t\ttoolName = \"execute_command\"\n\t\t\t\ttoolDisplayName = \"bash\"\n\t\t\t\ttoolDisplayOutput = text\n\t\t\t\tconst trackedCommand = pendingCommandRef.current\n\t\t\t\ttoolData = { tool: \"execute_command\", command: trackedCommand || undefined, output: text }\n\t\t\t\tpendingCommandRef.current = null\n\t\t\t} else if (say === \"reasoning\") {\n\t\t\t\trole = \"thinking\"\n\t\t\t}\n\n\t\t\tseenMessageIds.current.add(messageId)\n\n\t\t\taddMessage({\n\t\t\t\tid: messageId,\n\t\t\t\trole,\n\t\t\t\tcontent: text || \"\",\n\t\t\t\ttoolName,\n\t\t\t\ttoolDisplayName,\n\t\t\t\ttoolDisplayOutput,\n\t\t\t\tpartial,\n\t\t\t\toriginalType: say,\n\t\t\t\ttoolData,\n\t\t\t})\n\t\t},\n\t\t[addMessage],\n\t)\n\n\t/**\n\t * Handle extension \"ask\" messages\n\t */\n\tconst handleAskMessage = useCallback(\n\t\t(ts: number, ask: ClineAsk, text: string, partial: boolean) => {\n\t\t\tconst messageId = ts.toString()\n\n\t\t\tif (partial) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (seenMessageIds.current.has(messageId)) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (ask === \"command_output\") {\n\t\t\t\tseenMessageIds.current.add(messageId)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Handle resume_task and resume_completed_task - stop loading and show text input\n\t\t\t// Do not set pendingAsk - just stop loading so user sees normal input to type new message\n\t\t\tif (ask === \"resume_task\" || ask === \"resume_completed_task\") {\n\t\t\t\tseenMessageIds.current.add(messageId)\n\t\t\t\tsetLoading(false)\n\t\t\t\t// Mark that a task has been started so subsequent messages continue the task\n\t\t\t\t// (instead of starting a brand new task via runTask)\n\t\t\t\tsetHasStartedTask(true)\n\t\t\t\t// Clear the resuming flag since we're now ready for interaction\n\t\t\t\t// Historical messages should already be displayed from state processing\n\t\t\t\tuseCLIStore.getState().setIsResumingTask(false)\n\t\t\t\t// Do not set pendingAsk - let the normal text input appear\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (ask === \"completion_result\") {\n\t\t\t\tseenMessageIds.current.add(messageId)\n\t\t\t\tsetComplete(true)\n\t\t\t\tsetLoading(false)\n\n\t\t\t\t// Parse the completion result and add a message for CompletionTool to render\n\t\t\t\ttry {\n\t\t\t\t\tconst completionInfo = JSON.parse(text) as Record<string, unknown>\n\t\t\t\t\tconst toolData: ToolData = {\n\t\t\t\t\t\ttool: \"attempt_completion\",\n\t\t\t\t\t\tresult: completionInfo.result as string | undefined,\n\t\t\t\t\t\tcontent: completionInfo.result as string | undefined,\n\t\t\t\t\t}\n\n\t\t\t\t\taddMessage({\n\t\t\t\t\t\tid: messageId,\n\t\t\t\t\t\trole: \"tool\",\n\t\t\t\t\t\tcontent: text,\n\t\t\t\t\t\ttoolName: \"attempt_completion\",\n\t\t\t\t\t\ttoolDisplayName: \"Task Complete\",\n\t\t\t\t\t\ttoolDisplayOutput: formatToolOutput({ tool: \"attempt_completion\", ...completionInfo }),\n\t\t\t\t\t\toriginalType: ask,\n\t\t\t\t\t\ttoolData,\n\t\t\t\t\t})\n\t\t\t\t} catch {\n\t\t\t\t\t// If parsing fails, still add a basic completion message\n\t\t\t\t\taddMessage({\n\t\t\t\t\t\tid: messageId,\n\t\t\t\t\t\trole: \"tool\",\n\t\t\t\t\t\tcontent: text || \"Task completed\",\n\t\t\t\t\t\ttoolName: \"attempt_completion\",\n\t\t\t\t\t\ttoolDisplayName: \"Task Complete\",\n\t\t\t\t\t\ttoolDisplayOutput: \"✅ Task completed\",\n\t\t\t\t\t\toriginalType: ask,\n\t\t\t\t\t\ttoolData: {\n\t\t\t\t\t\t\ttool: \"attempt_completion\",\n\t\t\t\t\t\t\tcontent: text,\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Track pending command BEFORE nonInteractive handling\n\t\t\t// This ensures we capture the command text for later injection into command_output toolData\n\t\t\tif (ask === \"command\") {\n\t\t\t\tpendingCommandRef.current = text\n\t\t\t}\n\n\t\t\tif (nonInteractive && ask !== \"followup\") {\n\t\t\t\tseenMessageIds.current.add(messageId)\n\n\t\t\t\tif (ask === \"tool\") {\n\t\t\t\t\tlet toolName: string | undefined\n\t\t\t\t\tlet toolDisplayName: string | undefined\n\t\t\t\t\tlet toolDisplayOutput: string | undefined\n\t\t\t\t\tlet formattedContent = text || \"\"\n\t\t\t\t\tlet toolData: ToolData | undefined\n\t\t\t\t\tlet todos: TodoItem[] | undefined\n\t\t\t\t\tlet previousTodos: TodoItem[] | undefined\n\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst toolInfo = JSON.parse(text) as Record<string, unknown>\n\t\t\t\t\t\ttoolName = toolInfo.tool as string\n\t\t\t\t\t\ttoolDisplayName = toolInfo.tool as string\n\t\t\t\t\t\ttoolDisplayOutput = formatToolOutput(toolInfo)\n\t\t\t\t\t\tformattedContent = formatToolAskMessage(toolInfo)\n\t\t\t\t\t\t// Extract structured toolData for rich rendering\n\t\t\t\t\t\ttoolData = extractToolData(toolInfo)\n\n\t\t\t\t\t\t// Special handling for update_todo_list tool - extract todos\n\t\t\t\t\t\tif (toolName === \"update_todo_list\" || toolName === \"updateTodoList\") {\n\t\t\t\t\t\t\tconst parsedTodos = parseTodosFromToolInfo(toolInfo)\n\t\t\t\t\t\t\tif (parsedTodos && parsedTodos.length > 0) {\n\t\t\t\t\t\t\t\ttodos = parsedTodos\n\t\t\t\t\t\t\t\t// Capture previous todos before updating global state\n\t\t\t\t\t\t\t\tpreviousTodos = [...currentTodos]\n\t\t\t\t\t\t\t\tsetTodos(parsedTodos)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Use raw text if not valid JSON\n\t\t\t\t\t}\n\n\t\t\t\t\taddMessage({\n\t\t\t\t\t\tid: messageId,\n\t\t\t\t\t\trole: \"tool\",\n\t\t\t\t\t\tcontent: formattedContent,\n\t\t\t\t\t\ttoolName,\n\t\t\t\t\t\ttoolDisplayName,\n\t\t\t\t\t\ttoolDisplayOutput,\n\t\t\t\t\t\toriginalType: ask,\n\t\t\t\t\t\ttoolData,\n\t\t\t\t\t\ttodos,\n\t\t\t\t\t\tpreviousTodos,\n\t\t\t\t\t})\n\t\t\t\t} else {\n\t\t\t\t\taddMessage({\n\t\t\t\t\t\tid: messageId,\n\t\t\t\t\t\trole: \"assistant\",\n\t\t\t\t\t\tcontent: text || \"\",\n\t\t\t\t\t\toriginalType: ask,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tlet suggestions: Array<{ answer: string; mode?: string | null }> | undefined\n\t\t\tlet questionText = text\n\n\t\t\tif (ask === \"followup\") {\n\t\t\t\ttry {\n\t\t\t\t\tconst data = JSON.parse(text)\n\t\t\t\t\tquestionText = data.question || text\n\t\t\t\t\tsuggestions = Array.isArray(data.suggest) ? data.suggest : undefined\n\t\t\t\t} catch {\n\t\t\t\t\t// Use raw text\n\t\t\t\t}\n\t\t\t} else if (ask === \"tool\") {\n\t\t\t\ttry {\n\t\t\t\t\tconst toolInfo = JSON.parse(text) as Record<string, unknown>\n\t\t\t\t\tquestionText = formatToolAskMessage(toolInfo)\n\t\t\t\t} catch {\n\t\t\t\t\t// Use raw text if not valid JSON\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Note: ask === \"command\" is handled above before the nonInteractive block\n\n\t\t\tseenMessageIds.current.add(messageId)\n\n\t\t\tsetPendingAsk({\n\t\t\t\tid: messageId,\n\t\t\t\ttype: ask,\n\t\t\t\tcontent: questionText,\n\t\t\t\tsuggestions,\n\t\t\t})\n\t\t},\n\t\t[addMessage, setPendingAsk, setComplete, setLoading, setHasStartedTask, nonInteractive, currentTodos, setTodos],\n\t)\n\n\t/**\n\t * Handle all extension messages\n\t */\n\tconst handleExtensionMessage = useCallback(\n\t\t(msg: ExtensionMessage) => {\n\t\t\tif (msg.type === \"state\") {\n\t\t\t\tconst state = msg.state\n\n\t\t\t\tif (!state) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// Extract and update current mode from state\n\t\t\t\tconst newMode = state.mode\n\n\t\t\t\tif (newMode) {\n\t\t\t\t\tsetCurrentMode(newMode)\n\t\t\t\t}\n\n\t\t\t\t// Extract and update task history from state\n\t\t\t\tconst newTaskHistory = state.taskHistory\n\n\t\t\t\tif (newTaskHistory && Array.isArray(newTaskHistory)) {\n\t\t\t\t\tsetTaskHistory(newTaskHistory)\n\t\t\t\t}\n\n\t\t\t\tconst clineMessages = state.clineMessages\n\n\t\t\t\tif (clineMessages) {\n\t\t\t\t\tfor (const clineMsg of clineMessages) {\n\t\t\t\t\t\tconst ts = clineMsg.ts\n\t\t\t\t\t\tconst type = clineMsg.type\n\t\t\t\t\t\tconst say = clineMsg.say\n\t\t\t\t\t\tconst ask = clineMsg.ask\n\t\t\t\t\t\tconst text = clineMsg.text || \"\"\n\t\t\t\t\t\tconst partial = clineMsg.partial || false\n\n\t\t\t\t\t\tif (type === \"say\" && say) {\n\t\t\t\t\t\t\thandleSayMessage(ts, say, text, partial)\n\t\t\t\t\t\t} else if (type === \"ask\" && ask) {\n\t\t\t\t\t\t\thandleAskMessage(ts, ask, text, partial)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Compute token usage metrics from clineMessages\n\t\t\t\t\t// Skip first message (task prompt) as per webview UI pattern\n\t\t\t\t\tif (clineMessages.length > 1) {\n\t\t\t\t\t\tconst processed = consolidateApiRequests(\n\t\t\t\t\t\t\tconsolidateCommands(clineMessages.slice(1) as ClineMessage[]),\n\t\t\t\t\t\t)\n\n\t\t\t\t\t\tconst metrics = consolidateTokenUsage(processed)\n\t\t\t\t\t\tsetTokenUsage(metrics)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// After processing state, clear the resuming flag if it was set\n\t\t\t\t// This ensures the flag is cleared even if no resume_task ask message is received\n\t\t\t\tif (useCLIStore.getState().isResumingTask) {\n\t\t\t\t\tuseCLIStore.getState().setIsResumingTask(false)\n\t\t\t\t}\n\t\t\t} else if (msg.type === \"messageUpdated\") {\n\t\t\t\tconst clineMessage = msg.clineMessage\n\n\t\t\t\tif (!clineMessage) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tconst ts = clineMessage.ts\n\t\t\t\tconst type = clineMessage.type\n\t\t\t\tconst say = clineMessage.say\n\t\t\t\tconst ask = clineMessage.ask\n\t\t\t\tconst text = clineMessage.text || \"\"\n\t\t\t\tconst partial = clineMessage.partial || false\n\n\t\t\t\tif (type === \"say\" && say) {\n\t\t\t\t\thandleSayMessage(ts, say, text, partial)\n\t\t\t\t} else if (type === \"ask\" && ask) {\n\t\t\t\t\thandleAskMessage(ts, ask, text, partial)\n\t\t\t\t}\n\t\t\t} else if (msg.type === \"fileSearchResults\") {\n\t\t\t\tsetFileSearchResults((msg.results as FileResult[]) || [])\n\t\t\t} else if (msg.type === \"commands\") {\n\t\t\t\tsetAllSlashCommands((msg.commands as SlashCommandResult[]) || [])\n\t\t\t} else if (msg.type === \"modes\") {\n\t\t\t\tsetAvailableModes((msg.modes as ModeResult[]) || [])\n\t\t\t} else if (msg.type === \"routerModels\") {\n\t\t\t\tif (msg.routerModels) {\n\t\t\t\t\tsetRouterModels(msg.routerModels)\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[\n\t\t\thandleSayMessage,\n\t\t\thandleAskMessage,\n\t\t\tsetFileSearchResults,\n\t\t\tsetAllSlashCommands,\n\t\t\tsetAvailableModes,\n\t\t\tsetCurrentMode,\n\t\t\tsetTokenUsage,\n\t\t\tsetRouterModels,\n\t\t\tsetTaskHistory,\n\t\t],\n\t)\n\n\treturn {\n\t\thandleExtensionMessage,\n\t\tseenMessageIds,\n\t\tpendingCommandRef,\n\t\tfirstTextMessageSkipped,\n\t}\n}\n","import { useEffect, useRef, useCallback, useMemo } from \"react\"\r\nimport { useApp } from \"ink\"\r\nimport { randomUUID } from \"crypto\"\r\nimport pWaitFor from \"p-wait-for\"\r\nimport type { ExtensionMessage, HistoryItem, WebviewMessage } from \"../../types\"\r\n\r\nimport { ExtensionHostInterface, ExtensionHostOptions } from \"../../agent/index.js\"\r\nimport { arePathsEqual } from \"../../lib/utils/path.js\"\r\n\r\nimport { useCLIStore } from \"../store.js\"\r\n\r\nconst TASK_HISTORY_WAIT_TIMEOUT_MS = 2_000\r\n\r\nfunction extractTaskHistory(message: ExtensionMessage): HistoryItem[] | undefined {\r\n\tif (message.type === \"state\" && Array.isArray(message.state?.taskHistory)) {\r\n\t\treturn message.state.taskHistory as HistoryItem[]\r\n\t}\r\n\r\n\tif (message.type === \"taskHistoryUpdated\" && Array.isArray(message.taskHistory)) {\r\n\t\treturn message.taskHistory as HistoryItem[]\r\n\t}\r\n\r\n\treturn undefined\r\n}\r\n\r\nfunction getMostRecentTaskId(taskHistory: HistoryItem[], workspacePath: string): string | undefined {\r\n\tconst workspaceTasks = taskHistory.filter(\r\n\t\t(item) => typeof item.workspace === \"string\" && arePathsEqual(item.workspace, workspacePath),\r\n\t)\r\n\r\n\tif (workspaceTasks.length === 0) {\r\n\t\treturn undefined\r\n\t}\r\n\r\n\tconst sorted = [...workspaceTasks].sort((a, b) => b.ts - a.ts)\r\n\treturn sorted[0]?.id\r\n}\r\n\r\n// TODO: Unify with TUIAppProps?\r\nexport interface UseExtensionHostOptions extends ExtensionHostOptions {\r\n\tinitialPrompt?: string\r\n\tinitialTaskId?: string\r\n\tinitialSessionId?: string\r\n\tcontinueSession?: boolean\r\n\tonExtensionMessage: (msg: ExtensionMessage) => void\r\n\tcreateExtensionHost: (options: ExtensionHostOptions) => ExtensionHostInterface\r\n}\r\n\r\nexport interface UseExtensionHostReturn {\r\n\tisReady: boolean\r\n\tsendToExtension: ((msg: WebviewMessage) => void) | null\r\n\trunTask: ((prompt: string) => Promise<void>) | null\r\n\tcleanup: () => Promise<void>\r\n}\r\n\r\n/**\r\n * Hook to manage the extension host lifecycle.\r\n *\r\n * Responsibilities:\r\n * - Initialize the extension host\r\n * - Set up event listeners for messages, task completion, and errors\r\n * - Handle cleanup/disposal\r\n * - Expose methods for sending messages and running tasks\r\n */\r\nexport function useExtensionHost({\r\n\tinitialPrompt,\r\n\tinitialTaskId,\r\n\tinitialSessionId,\r\n\tcontinueSession,\r\n\tmode,\r\n\treasoningEffort,\r\n\tuser,\r\n\tprovider,\r\n\tapiKey,\r\n\tmodel,\r\n\tworkspacePath,\r\n\textensionPath,\r\n\tnonInteractive,\r\n\tephemeral,\r\n\tdebug,\r\n\texitOnComplete,\r\n\tonExtensionMessage,\r\n\tcreateExtensionHost,\r\n}: UseExtensionHostOptions): UseExtensionHostReturn {\r\n\tconst { exit } = useApp()\r\n\tconst { addMessage, setComplete, setLoading, setHasStartedTask, setError, setCurrentTaskId, setIsResumingTask } =\r\n\t\tuseCLIStore()\r\n\r\n\tconst hostRef = useRef<ExtensionHostInterface | null>(null)\r\n\tconst isReadyRef = useRef(false)\r\n\tconst pendingInitialTaskIdRef = useRef<string | undefined>(initialTaskId?.trim() || undefined)\r\n\r\n\tconst cleanup = useCallback(async () => {\r\n\t\tif (hostRef.current) {\r\n\t\t\tawait hostRef.current.dispose()\r\n\t\t\thostRef.current = null\r\n\t\t\tisReadyRef.current = false\r\n\t\t}\r\n\t}, [])\r\n\r\n\tuseEffect(() => {\r\n\t\tconst init = async () => {\r\n\t\t\ttry {\r\n\t\t\t\tconst requestedSessionId = initialSessionId?.trim()\r\n\t\t\t\tlet taskHistorySnapshot: HistoryItem[] = []\r\n\t\t\t\tlet hasReceivedTaskHistory = false\r\n\r\n\t\t\t\tconst host = createExtensionHost({\r\n\t\t\t\t\tmode,\r\n\t\t\t\t\tuser,\r\n\t\t\t\t\treasoningEffort,\r\n\t\t\t\t\tprovider,\r\n\t\t\t\t\tapiKey,\r\n\t\t\t\t\tmodel,\r\n\t\t\t\t\tworkspacePath,\r\n\t\t\t\t\textensionPath,\r\n\t\t\t\t\tnonInteractive,\r\n\t\t\t\t\tephemeral,\r\n\t\t\t\t\tdebug,\r\n\t\t\t\t\texitOnComplete,\r\n\t\t\t\t\tdisableOutput: true,\r\n\t\t\t\t})\r\n\r\n\t\t\t\thostRef.current = host\r\n\t\t\t\tisReadyRef.current = true\r\n\r\n\t\t\t\thost.on(\"extensionWebviewMessage\", (msg) => {\r\n\t\t\t\t\tconst extensionMessage = msg as ExtensionMessage\r\n\t\t\t\t\tconst taskHistory = extractTaskHistory(extensionMessage)\r\n\r\n\t\t\t\t\tif (taskHistory) {\r\n\t\t\t\t\t\ttaskHistorySnapshot = taskHistory\r\n\t\t\t\t\t\thasReceivedTaskHistory = true\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tonExtensionMessage(extensionMessage)\r\n\t\t\t\t})\r\n\r\n\t\t\t\thost.client.on(\"taskCompleted\", async () => {\r\n\t\t\t\t\tsetComplete(true)\r\n\t\t\t\t\tsetLoading(false)\r\n\r\n\t\t\t\t\tif (exitOnComplete) {\r\n\t\t\t\t\t\tawait cleanup()\r\n\t\t\t\t\t\texit()\r\n\t\t\t\t\t\tsetTimeout(() => process.exit(0), 100)\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\r\n\t\t\t\thost.client.on(\"error\", (err: Error) => {\r\n\t\t\t\t\tsetError(err.message)\r\n\t\t\t\t\tsetLoading(false)\r\n\t\t\t\t})\r\n\r\n\t\t\t\tawait host.activate()\r\n\r\n\t\t\t\t// Request initial state from extension (triggers\r\n\t\t\t\t// postStateToWebview which includes taskHistory).\r\n\t\t\t\thost.sendToExtension({ type: \"requestCommands\" })\r\n\t\t\t\thost.sendToExtension({ type: \"requestModes\" })\r\n\r\n\t\t\t\tif (requestedSessionId || continueSession) {\r\n\t\t\t\t\tawait pWaitFor(() => hasReceivedTaskHistory, {\r\n\t\t\t\t\t\tinterval: 25,\r\n\t\t\t\t\t\ttimeout: TASK_HISTORY_WAIT_TIMEOUT_MS,\r\n\t\t\t\t\t}).catch(() => undefined)\r\n\r\n\t\t\t\t\tif (requestedSessionId && hasReceivedTaskHistory) {\r\n\t\t\t\t\t\tconst hasRequestedTask = taskHistorySnapshot.some((item) => item.id === requestedSessionId)\r\n\r\n\t\t\t\t\t\tif (!hasRequestedTask) {\r\n\t\t\t\t\t\t\tthrow new Error(`Session not found in task history: ${requestedSessionId}`)\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tconst resolvedSessionId =\r\n\t\t\t\t\t\trequestedSessionId || getMostRecentTaskId(taskHistorySnapshot, workspacePath)\r\n\r\n\t\t\t\t\tif (continueSession && !resolvedSessionId) {\r\n\t\t\t\t\t\tthrow new Error(\"No previous tasks found to continue in this workspace.\")\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (resolvedSessionId) {\r\n\t\t\t\t\t\tsetCurrentTaskId(resolvedSessionId)\r\n\t\t\t\t\t\tsetIsResumingTask(true)\r\n\t\t\t\t\t\tsetHasStartedTask(true)\r\n\t\t\t\t\t\tsetLoading(true)\r\n\t\t\t\t\t\thost.sendToExtension({ type: \"showTaskWithId\", text: resolvedSessionId })\r\n\t\t\t\t\t\treturn\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tsetLoading(false)\r\n\r\n\t\t\t\tif (initialPrompt) {\r\n\t\t\t\t\tsetHasStartedTask(true)\r\n\t\t\t\t\tsetLoading(true)\r\n\t\t\t\t\taddMessage({ id: randomUUID(), role: \"user\", content: initialPrompt })\r\n\t\t\t\t\tconst taskId = pendingInitialTaskIdRef.current\r\n\t\t\t\t\tpendingInitialTaskIdRef.current = undefined\r\n\t\t\t\t\tawait host.runTask(initialPrompt, taskId)\r\n\t\t\t\t}\r\n\t\t\t} catch (err) {\r\n\t\t\t\tsetError(err instanceof Error ? err.message : String(err))\r\n\t\t\t\tsetLoading(false)\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tinit()\r\n\r\n\t\treturn () => {\r\n\t\t\tcleanup()\r\n\t\t}\r\n\t}, []) // Run once on mount\r\n\r\n\t// Stable sendToExtension - uses ref to always access current host.\r\n\t// This function reference never changes, preventing downstream\r\n\t// useCallback/useMemo invalidations.\r\n\tconst sendToExtension = useCallback((msg: WebviewMessage) => {\r\n\t\thostRef.current?.sendToExtension(msg)\r\n\t}, [])\r\n\r\n\t// Stable runTask - uses ref to always access current host.\r\n\tconst runTask = useCallback((prompt: string): Promise<void> => {\r\n\t\tif (!hostRef.current) {\r\n\t\t\treturn Promise.reject(new Error(\"Extension host not ready\"))\r\n\t\t}\r\n\r\n\t\tconst taskId = pendingInitialTaskIdRef.current\r\n\t\tpendingInitialTaskIdRef.current = undefined\r\n\t\treturn hostRef.current.runTask(prompt, taskId)\r\n\t}, [])\r\n\r\n\t// Memoized return object to prevent unnecessary re-renders in consumers.\r\n\treturn useMemo(\r\n\t\t() => ({ isReady: isReadyRef.current, sendToExtension, runTask, cleanup }),\r\n\t\t[sendToExtension, runTask, cleanup],\r\n\t)\r\n}\r\n","import { useCallback } from \"react\"\r\nimport { randomUUID } from \"crypto\"\r\nimport type { WebviewMessage } from \"../../types\"\r\n\r\nimport { getGlobalCommand } from \"../../lib/utils/commands.js\"\r\n\r\nimport { useCLIStore } from \"../store.js\"\r\nimport { useUIStateStore } from \"../stores/uiStateStore.js\"\r\n\r\nexport interface UseTaskSubmitOptions {\r\n\tsendToExtension: ((msg: WebviewMessage) => void) | null\r\n\trunTask: ((prompt: string) => Promise<void>) | null\r\n\tseenMessageIds: React.MutableRefObject<Set<string>>\r\n\tfirstTextMessageSkipped: React.MutableRefObject<boolean>\r\n}\r\n\r\nexport interface UseTaskSubmitReturn {\r\n\thandleSubmit: (text: string) => Promise<void>\r\n\thandleApprove: () => void\r\n\thandleReject: () => void\r\n}\r\n\r\n/**\r\n * Hook to handle task submission, user responses, and approvals.\r\n *\r\n * Responsibilities:\r\n * - Process user message submissions\r\n * - Detect and handle global commands (like /new)\r\n * - Handle pending ask responses\r\n * - Start new tasks or continue existing ones\r\n * - Handle Y/N approval responses\r\n */\r\nexport function useTaskSubmit({\r\n\tsendToExtension,\r\n\trunTask,\r\n\tseenMessageIds,\r\n\tfirstTextMessageSkipped,\r\n}: UseTaskSubmitOptions): UseTaskSubmitReturn {\r\n\tconst {\r\n\t\tpendingAsk,\r\n\t\thasStartedTask,\r\n\t\tisComplete,\r\n\t\taddMessage,\r\n\t\tsetPendingAsk,\r\n\t\tsetHasStartedTask,\r\n\t\tsetLoading,\r\n\t\tsetComplete,\r\n\t\tsetError,\r\n\t} = useCLIStore()\r\n\r\n\tconst { setShowCustomInput, setIsTransitioningToCustomInput } = useUIStateStore()\r\n\r\n\t/**\r\n\t * Handle user text submission (from input or followup question)\r\n\t */\r\n\tconst handleSubmit = useCallback(\r\n\t\tasync (text: string) => {\r\n\t\t\tif (!sendToExtension || !text.trim()) {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\tconst trimmedText = text.trim()\r\n\r\n\t\t\tif (trimmedText === \"__CUSTOM__\") {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\t// If the task is already completed, ignore further submissions to prevent infinite loop.\r\n\t\t\t// Users can use /new to explicitly start a fresh task.\r\n\t\t\tif (isComplete) {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\t// Check for CLI global action commands (e.g., /new)\r\n\t\t\tif (trimmedText.startsWith(\"/\")) {\r\n\t\t\t\tconst commandMatch = trimmedText.match(/^\\/(\\w+)(?:\\s|$)/)\r\n\r\n\t\t\t\tif (commandMatch && commandMatch[1]) {\r\n\t\t\t\t\tconst globalCommand = getGlobalCommand(commandMatch[1])\r\n\r\n\t\t\t\t\tif (globalCommand?.action === \"clearTask\") {\r\n\t\t\t\t\t\t// Reset CLI state and send clearTask to extension.\r\n\t\t\t\t\t\tuseCLIStore.getState().reset()\r\n\r\n\t\t\t\t\t\t// Reset component-level refs to avoid stale message tracking.\r\n\t\t\t\t\t\tseenMessageIds.current.clear()\r\n\t\t\t\t\t\tfirstTextMessageSkipped.current = false\r\n\t\t\t\t\t\tsendToExtension({ type: \"clearTask\" })\r\n\r\n\t\t\t\t\t\t// Re-request state, commands and modes since reset() cleared them.\r\n\t\t\t\t\t\tsendToExtension({ type: \"requestCommands\" })\r\n\t\t\t\t\t\tsendToExtension({ type: \"requestModes\" })\r\n\t\t\t\t\t\treturn\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (pendingAsk) {\r\n\t\t\t\taddMessage({ id: randomUUID(), role: \"user\", content: trimmedText })\r\n\r\n\t\t\t\tsendToExtension({\r\n\t\t\t\t\ttype: \"askResponse\",\r\n\t\t\t\t\taskResponse: \"messageResponse\",\r\n\t\t\t\t\ttext: trimmedText,\r\n\t\t\t\t})\r\n\r\n\t\t\t\tsetPendingAsk(null)\r\n\t\t\t\tsetShowCustomInput(false)\r\n\t\t\t\tsetIsTransitioningToCustomInput(false)\r\n\t\t\t\tsetLoading(true)\r\n\t\t\t} else if (!hasStartedTask) {\r\n\t\t\t\tsetHasStartedTask(true)\r\n\t\t\t\tsetLoading(true)\r\n\t\t\t\taddMessage({ id: randomUUID(), role: \"user\", content: trimmedText })\r\n\r\n\t\t\t\ttry {\r\n\t\t\t\t\tif (runTask) {\r\n\t\t\t\t\t\tawait runTask(trimmedText)\r\n\t\t\t\t\t}\r\n\t\t\t\t} catch (err) {\r\n\t\t\t\t\tsetError(err instanceof Error ? err.message : String(err))\r\n\t\t\t\t\tsetLoading(false)\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\r\n\t\t\t\tsetLoading(true)\r\n\t\t\t\taddMessage({ id: randomUUID(), role: \"user\", content: trimmedText })\r\n\r\n\t\t\t\tsendToExtension({\r\n\t\t\t\t\ttype: \"askResponse\",\r\n\t\t\t\t\taskResponse: \"messageResponse\",\r\n\t\t\t\t\ttext: trimmedText,\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t},\r\n\t\t[\r\n\t\t\tsendToExtension,\r\n\t\t\trunTask,\r\n\t\t\tpendingAsk,\r\n\t\t\thasStartedTask,\r\n\t\t\tisComplete,\r\n\t\t\taddMessage,\r\n\t\t\tsetPendingAsk,\r\n\t\t\tsetHasStartedTask,\r\n\t\t\tsetLoading,\r\n\t\t\tsetComplete,\r\n\t\t\tsetError,\r\n\t\t\tsetShowCustomInput,\r\n\t\t\tsetIsTransitioningToCustomInput,\r\n\t\t\tseenMessageIds,\r\n\t\t\tfirstTextMessageSkipped,\r\n\t\t],\r\n\t)\r\n\r\n\t/**\r\n\t * Handle approval (Y key)\r\n\t */\r\n\tconst handleApprove = useCallback(() => {\r\n\t\tif (!sendToExtension) {\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tsendToExtension({ type: \"askResponse\", askResponse: \"yesButtonClicked\" })\r\n\t\tsetPendingAsk(null)\r\n\t\tsetLoading(true)\r\n\t}, [sendToExtension, setPendingAsk, setLoading])\r\n\r\n\t/**\r\n\t * Handle rejection (N key)\r\n\t */\r\n\tconst handleReject = useCallback(() => {\r\n\t\tif (!sendToExtension) {\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tsendToExtension({ type: \"askResponse\", askResponse: \"noButtonClicked\" })\r\n\t\tsetPendingAsk(null)\r\n\t\tsetLoading(true)\r\n\t}, [sendToExtension, setPendingAsk, setLoading])\r\n\r\n\treturn {\r\n\t\thandleSubmit,\r\n\t\thandleApprove,\r\n\t\thandleReject,\r\n\t}\r\n}\r\n","/**\n * Global Input Sequences Registry\n *\n * This module centralizes the definition of input sequences that should be\n * handled at the App level (or other top-level components) and ignored by\n * child components like MultilineTextInput.\n *\n * When adding new global shortcuts:\n * 1. Add the sequence definition to GLOBAL_INPUT_SEQUENCES\n * 2. The App.tsx useInput handler should check for and handle the sequence\n * 3. Child components automatically ignore these via isGlobalInputSequence()\n */\n\nimport type { Key } from \"ink\"\n\n/**\n * Definition of a global input sequence\n */\nexport interface GlobalInputSequence {\n\t/** Unique identifier for the sequence */\n\tid: string\n\t/** Human-readable description */\n\tdescription: string\n\t/**\n\t * Matcher function - returns true if the input matches this sequence.\n\t * @param input - The raw input string from useInput\n\t * @param key - The parsed key object from useInput\n\t */\n\tmatches: (input: string, key: Key) => boolean\n}\n\n/**\n * Registry of all global input sequences that should be handled at the App level\n * and ignored by child components (like MultilineTextInput).\n *\n * Add new global shortcuts here to ensure they're properly handled throughout\n * the application.\n */\nexport const GLOBAL_INPUT_SEQUENCES: GlobalInputSequence[] = [\n\t{\n\t\tid: \"ctrl-c\",\n\t\tdescription: \"Exit application (with confirmation)\",\n\t\tmatches: (input, key) => key.ctrl && input === \"c\",\n\t},\n\t{\n\t\tid: \"ctrl-m\",\n\t\tdescription: \"Cycle through modes\",\n\t\tmatches: (input, key) => {\n\t\t\t// Standard Ctrl+M detection\n\t\t\tif (key.ctrl && input === \"m\") return true\n\t\t\t// CSI u encoding: ESC [ 109 ; 5 u (kitty keyboard protocol)\n\t\t\t// 109 = 'm' ASCII code, 5 = Ctrl modifier\n\t\t\tif (input === \"\\x1b[109;5u\") return true\n\t\t\tif (input.endsWith(\"[109;5u\")) return true\n\t\t\treturn false\n\t\t},\n\t},\n\t{\n\t\tid: \"ctrl-t\",\n\t\tdescription: \"Toggle TODO list viewer\",\n\t\tmatches: (input, key) => {\n\t\t\t// Standard Ctrl+T detection\n\t\t\tif (key.ctrl && input === \"t\") return true\n\t\t\t// CSI u encoding: ESC [ 116 ; 5 u (kitty keyboard protocol)\n\t\t\t// 116 = 't' ASCII code, 5 = Ctrl modifier\n\t\t\tif (input === \"\\x1b[116;5u\") return true\n\t\t\tif (input.endsWith(\"[116;5u\")) return true\n\t\t\treturn false\n\t\t},\n\t},\n\t// Add more global sequences here as needed:\n\t// {\n\t// id: \"ctrl-n\",\n\t// description: \"New task\",\n\t// matches: (input, key) => key.ctrl && input === \"n\",\n\t// },\n]\n\n/**\n * Check if an input matches any global input sequence.\n *\n * Use this in child components (like MultilineTextInput) to determine\n * if input should be ignored because it will be handled by a parent component.\n *\n * @param input - The raw input string from useInput\n * @param key - The parsed key object from useInput\n * @returns The matching GlobalInputSequence, or undefined if no match\n *\n * @example\n * ```tsx\n * useInput((input, key) => {\n * // Ignore inputs handled at App level\n * if (isGlobalInputSequence(input, key)) {\n * return\n * }\n * // Handle component-specific input...\n * })\n * ```\n */\nexport function isGlobalInputSequence(input: string, key: Key): GlobalInputSequence | undefined {\n\treturn GLOBAL_INPUT_SEQUENCES.find((seq) => seq.matches(input, key))\n}\n\n/**\n * Check if an input matches a specific global input sequence by ID.\n *\n * @param input - The raw input string from useInput\n * @param key - The parsed key object from useInput\n * @param id - The sequence ID to check for\n * @returns true if the input matches the specified sequence\n *\n * @example\n * ```tsx\n * if (matchesGlobalSequence(input, key, \"ctrl-m\")) {\n * // Handle mode cycling\n * }\n * ```\n */\nexport function matchesGlobalSequence(input: string, key: Key, id: string): boolean {\n\tconst seq = GLOBAL_INPUT_SEQUENCES.find((s) => s.id === id)\n\treturn seq ? seq.matches(input, key) : false\n}\n","import { useEffect, useRef } from \"react\"\r\nimport { useInput } from \"ink\"\r\nimport type { WebviewMessage } from \"../../types\"\r\n\r\nimport { matchesGlobalSequence } from \"../../lib/utils/input.js\"\r\n\r\nimport type { ModeResult } from \"../components/autocomplete/index.js\"\r\nimport { useUIStateStore } from \"../stores/uiStateStore.js\"\r\nimport { useCLIStore } from \"../store.js\"\r\n\r\nexport interface UseGlobalInputOptions {\r\n\tcanToggleFocus: boolean\r\n\tisScrollAreaActive: boolean\r\n\tpickerIsOpen: boolean\r\n\tavailableModes: ModeResult[]\r\n\tcurrentMode: string | null\r\n\tmode: string\r\n\tsendToExtension: ((msg: WebviewMessage) => void) | null\r\n\tshowInfo: (msg: string, duration?: number) => void\r\n\texit: () => void\r\n\tcleanup: () => Promise<void>\r\n\ttoggleFocus: () => void\r\n\tclosePicker: () => void\r\n}\r\n\r\n/**\r\n * Hook to handle global keyboard shortcuts.\r\n *\r\n * Shortcuts:\r\n * - Ctrl+C: Double-press to exit\r\n * - Tab: Toggle focus between scroll area and input\r\n * - Ctrl+M: Cycle through available modes\r\n * - Ctrl+T: Toggle TODO list viewer\r\n * - Escape: Cancel task (when loading) or close TODO viewer\r\n */\r\nexport function useGlobalInput({\r\n\tcanToggleFocus,\r\n\tisScrollAreaActive: _isScrollAreaActive,\r\n\tpickerIsOpen,\r\n\tavailableModes,\r\n\tcurrentMode,\r\n\tmode,\r\n\tsendToExtension,\r\n\tshowInfo,\r\n\texit,\r\n\tcleanup,\r\n\ttoggleFocus,\r\n\tclosePicker,\r\n}: UseGlobalInputOptions): void {\r\n\tconst { isLoading, currentTodos } = useCLIStore()\r\n\tconst {\r\n\t\tshowTodoViewer,\r\n\t\tsetShowTodoViewer,\r\n\t\tshowExitHint: _showExitHint,\r\n\t\tsetShowExitHint,\r\n\t\tpendingExit,\r\n\t\tsetPendingExit,\r\n\t} = useUIStateStore()\r\n\r\n\t// Track Ctrl+C presses for \"press again to exit\" behavior\r\n\tconst exitHintTimeout = useRef<NodeJS.Timeout | null>(null)\r\n\r\n\t// Cleanup timeout on unmount\r\n\tuseEffect(() => {\r\n\t\treturn () => {\r\n\t\t\tif (exitHintTimeout.current) {\r\n\t\t\t\tclearTimeout(exitHintTimeout.current)\r\n\t\t\t}\r\n\t\t}\r\n\t}, [])\r\n\r\n\t// Handle global keyboard shortcuts\r\n\tuseInput((input, key) => {\r\n\t\t// Tab to toggle focus between scroll area and input (only when input is available)\r\n\t\tif (key.tab && canToggleFocus && !pickerIsOpen) {\r\n\t\t\ttoggleFocus()\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\t// Ctrl+M to cycle through modes (only when not loading and we have available modes)\r\n\t\t// Uses centralized global input sequence detection\r\n\t\tif (matchesGlobalSequence(input, key, \"ctrl-m\")) {\r\n\t\t\t// Don't allow mode switching while a task is in progress (loading)\r\n\t\t\tif (isLoading) {\r\n\t\t\t\tshowInfo(\"Cannot switch modes while task is in progress\", 2000)\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\t// Need at least 2 modes to cycle\r\n\t\t\tif (availableModes.length < 2) {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\t// Find current mode index\r\n\t\t\tconst currentModeSlug = currentMode || mode\r\n\t\t\tconst currentIndex = availableModes.findIndex((m) => m.slug === currentModeSlug)\r\n\t\t\tconst nextIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % availableModes.length\r\n\t\t\tconst nextMode = availableModes[nextIndex]\r\n\r\n\t\t\tif (nextMode && sendToExtension) {\r\n\t\t\t\tsendToExtension({ type: \"mode\", text: nextMode.slug })\r\n\t\t\t\tshowInfo(`Switched to ${nextMode.name}`, 2000)\r\n\t\t\t}\r\n\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\t// Ctrl+T to toggle TODO list viewer\r\n\t\tif (matchesGlobalSequence(input, key, \"ctrl-t\")) {\r\n\t\t\t// Close picker if open\r\n\t\t\tif (pickerIsOpen) {\r\n\t\t\t\tclosePicker()\r\n\t\t\t}\r\n\t\t\t// Toggle TODO viewer\r\n\t\t\tsetShowTodoViewer(!showTodoViewer)\r\n\t\t\tif (!showTodoViewer && currentTodos.length === 0) {\r\n\t\t\t\tshowInfo(\"No TODO list available\", 2000)\r\n\t\t\t\tsetShowTodoViewer(false)\r\n\t\t\t}\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\t// Escape key to close TODO viewer\r\n\t\tif (key.escape && showTodoViewer) {\r\n\t\t\tsetShowTodoViewer(false)\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\t// Escape key to cancel/pause task when loading (streaming)\r\n\t\tif (key.escape && isLoading && sendToExtension) {\r\n\t\t\t// If picker is open, let the picker handle escape first\r\n\t\t\tif (pickerIsOpen) {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\t\t\t// Send cancel message to extension (same as webview-ui Cancel button)\r\n\t\t\tsendToExtension({ type: \"cancelTask\" })\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\t// Ctrl+C to exit\r\n\t\tif (key.ctrl && input === \"c\") {\r\n\t\t\t// If picker is open, close it first\r\n\t\t\tif (pickerIsOpen) {\r\n\t\t\t\tclosePicker()\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\tif (pendingExit) {\r\n\t\t\t\t// Second press - exit immediately\r\n\t\t\t\tif (exitHintTimeout.current) {\r\n\t\t\t\t\tclearTimeout(exitHintTimeout.current)\r\n\t\t\t\t}\r\n\t\t\t\tcleanup().finally(() => {\r\n\t\t\t\t\texit()\r\n\t\t\t\t\tprocess.exit(0)\r\n\t\t\t\t})\r\n\t\t\t} else {\r\n\t\t\t\t// First press - show hint and wait for second press\r\n\t\t\t\tsetPendingExit(true)\r\n\t\t\t\tsetShowExitHint(true)\r\n\r\n\t\t\t\texitHintTimeout.current = setTimeout(() => {\r\n\t\t\t\t\tsetPendingExit(false)\r\n\t\t\t\t\tsetShowExitHint(false)\r\n\t\t\t\t\texitHintTimeout.current = null\r\n\t\t\t\t}, 2000)\r\n\t\t\t}\r\n\t\t}\r\n\t})\r\n}\r\n","import { useCallback } from \"react\"\r\nimport type { WebviewMessage } from \"../../types\"\r\n\r\nimport type {\r\n\tAutocompletePickerState,\r\n\tAutocompleteInputHandle,\r\n\tModeResult,\r\n\tHistoryResult,\r\n} from \"../components/autocomplete/index.js\"\r\nimport { useCLIStore } from \"../store.js\"\r\nimport { useUIStateStore } from \"../stores/uiStateStore.js\"\r\n\r\nexport interface UsePickerHandlersOptions {\r\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n\tautocompleteRef: React.RefObject<AutocompleteInputHandle<any>>\r\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n\tfollowupAutocompleteRef: React.RefObject<AutocompleteInputHandle<any>>\r\n\tsendToExtension: ((msg: WebviewMessage) => void) | null\r\n\tshowInfo: (msg: string, duration?: number) => void\r\n\tseenMessageIds: React.MutableRefObject<Set<string>>\r\n\tfirstTextMessageSkipped: React.MutableRefObject<boolean>\r\n}\r\n\r\nexport interface UsePickerHandlersReturn {\r\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n\thandlePickerStateChange: (state: AutocompletePickerState<any>) => void\r\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n\thandlePickerSelect: (item: any) => void\r\n\thandlePickerClose: () => void\r\n\thandlePickerIndexChange: (index: number) => void\r\n}\r\n\r\n/**\r\n * Hook to handle autocomplete picker interactions.\r\n *\r\n * Responsibilities:\r\n * - Handle picker state changes from AutocompleteInput\r\n * - Handle item selection (special handling for modes and history items)\r\n * - Handle mode switching via picker\r\n * - Handle task switching via history picker\r\n * - Handle picker close and index change\r\n */\r\nexport function usePickerHandlers({\r\n\tautocompleteRef,\r\n\tfollowupAutocompleteRef,\r\n\tsendToExtension,\r\n\tshowInfo,\r\n\tseenMessageIds,\r\n\tfirstTextMessageSkipped,\r\n}: UsePickerHandlersOptions): UsePickerHandlersReturn {\r\n\tconst { isLoading, currentTaskId, setCurrentTaskId } = useCLIStore()\r\n\tconst { pickerState, setPickerState } = useUIStateStore()\r\n\r\n\t/**\r\n\t * Handle picker state changes from AutocompleteInput\r\n\t */\r\n\tconst handlePickerStateChange = useCallback(\r\n\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n\t\t(state: AutocompletePickerState<any>) => {\r\n\t\t\tsetPickerState(state)\r\n\t\t},\r\n\t\t[setPickerState],\r\n\t)\r\n\r\n\t/**\r\n\t * Handle item selection from external PickerSelect\r\n\t */\r\n\tconst handlePickerSelect = useCallback(\r\n\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n\t\t(item: any) => {\r\n\t\t\t// Check if this is a mode selection.\r\n\t\t\tif (pickerState.activeTrigger?.id === \"mode\" && item && typeof item === \"object\" && \"slug\" in item) {\r\n\t\t\t\tconst modeItem = item as ModeResult\r\n\r\n\t\t\t\tif (sendToExtension) {\r\n\t\t\t\t\tsendToExtension({ type: \"mode\", text: modeItem.slug })\r\n\t\t\t\t}\r\n\r\n\t\t\t\tautocompleteRef.current?.closePicker()\r\n\t\t\t\tfollowupAutocompleteRef.current?.closePicker()\r\n\t\t\t}\r\n\t\t\t// Check if this is a history item selection.\r\n\t\t\telse if (pickerState.activeTrigger?.id === \"history\" && item && typeof item === \"object\" && \"id\" in item) {\r\n\t\t\t\tconst historyItem = item as HistoryResult\r\n\r\n\t\t\t\t// Don't allow task switching while a task is in progress (loading).\r\n\t\t\t\tif (isLoading) {\r\n\t\t\t\t\tshowInfo(\"Cannot switch tasks while task is in progress\", 2000)\r\n\t\t\t\t\tautocompleteRef.current?.closePicker()\r\n\t\t\t\t\tfollowupAutocompleteRef.current?.closePicker()\r\n\t\t\t\t\treturn\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// If selecting the same task that's already loaded, just close the picker.\r\n\t\t\t\tif (historyItem.id === currentTaskId) {\r\n\t\t\t\t\tautocompleteRef.current?.closePicker()\r\n\t\t\t\t\tfollowupAutocompleteRef.current?.closePicker()\r\n\t\t\t\t\treturn\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Send showTaskWithId message to extension to resume the task\r\n\t\t\t\tif (sendToExtension) {\r\n\t\t\t\t\t// Use selective reset that preserves global state (taskHistory, modes, commands)\r\n\t\t\t\t\tuseCLIStore.getState().resetForTaskSwitch()\r\n\t\t\t\t\t// Set the resuming flag so message handlers know we're resuming\r\n\t\t\t\t\t// This prevents skipping the first text message (which is historical)\r\n\t\t\t\t\tuseCLIStore.getState().setIsResumingTask(true)\r\n\t\t\t\t\t// Track which task we're switching to\r\n\t\t\t\t\tsetCurrentTaskId(historyItem.id)\r\n\t\t\t\t\t// Reset refs to avoid stale state across task switches\r\n\t\t\t\t\tseenMessageIds.current.clear()\r\n\t\t\t\t\tfirstTextMessageSkipped.current = false\r\n\r\n\t\t\t\t\t// Send message to resume the selected task\r\n\t\t\t\t\t// This triggers createTaskWithHistoryItem -> postStateToWebview\r\n\t\t\t\t\t// which includes clineMessages and handles mode restoration\r\n\t\t\t\t\tsendToExtension({ type: \"showTaskWithId\", text: historyItem.id })\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Close the picker\r\n\t\t\t\tautocompleteRef.current?.closePicker()\r\n\t\t\t\tfollowupAutocompleteRef.current?.closePicker()\r\n\t\t\t} else {\r\n\t\t\t\t// Handle other item selections normally\r\n\t\t\t\tautocompleteRef.current?.handleItemSelect(item)\r\n\t\t\t\tfollowupAutocompleteRef.current?.handleItemSelect(item)\r\n\t\t\t}\r\n\t\t},\r\n\t\t[\r\n\t\t\tpickerState.activeTrigger,\r\n\t\t\tisLoading,\r\n\t\t\tshowInfo,\r\n\t\t\tcurrentTaskId,\r\n\t\t\tsetCurrentTaskId,\r\n\t\t\tsendToExtension,\r\n\t\t\tautocompleteRef,\r\n\t\t\tfollowupAutocompleteRef,\r\n\t\t\tseenMessageIds,\r\n\t\t\tfirstTextMessageSkipped,\r\n\t\t],\r\n\t)\r\n\r\n\t/**\r\n\t * Handle picker close from external PickerSelect\r\n\t */\r\n\tconst handlePickerClose = useCallback(() => {\r\n\t\tautocompleteRef.current?.closePicker()\r\n\t\tfollowupAutocompleteRef.current?.closePicker()\r\n\t}, [autocompleteRef, followupAutocompleteRef])\r\n\r\n\t/**\r\n\t * Handle picker index change from external PickerSelect\r\n\t */\r\n\tconst handlePickerIndexChange = useCallback(\r\n\t\t(index: number) => {\r\n\t\t\tautocompleteRef.current?.handleIndexChange(index)\r\n\t\t\tfollowupAutocompleteRef.current?.handleIndexChange(index)\r\n\t\t},\r\n\t\t[autocompleteRef, followupAutocompleteRef],\r\n\t)\r\n\r\n\treturn {\r\n\t\thandlePickerStateChange,\r\n\t\thandlePickerSelect,\r\n\t\thandlePickerClose,\r\n\t\thandlePickerIndexChange,\r\n\t}\r\n}\r\n","// Export existing hooks\nexport { TerminalSizeProvider, useTerminalSize } from \"./TerminalSizeContext.js\"\nexport { useToast, useToastStore } from \"./useToast.js\"\nexport { useInputHistory } from \"./useInputHistory.js\"\n\n// Export new extracted hooks\nexport { useFollowupCountdown } from \"./useFollowupCountdown.js\"\nexport { useFocusManagement } from \"./useFocusManagement.js\"\nexport { useMessageHandlers } from \"./useMessageHandlers.js\"\nexport { useExtensionHost } from \"./useExtensionHost.js\"\nexport { useTaskSubmit } from \"./useTaskSubmit.js\"\nexport { useGlobalInput } from \"./useGlobalInput.js\"\nexport { usePickerHandlers } from \"./usePickerHandlers.js\"\n\n// Export types\nexport type { UseFollowupCountdownOptions } from \"./useFollowupCountdown.js\"\nexport type { UseFocusManagementOptions, UseFocusManagementReturn } from \"./useFocusManagement.js\"\nexport type { UseMessageHandlersOptions, UseMessageHandlersReturn } from \"./useMessageHandlers.js\"\nexport type { UseExtensionHostOptions, UseExtensionHostReturn } from \"./useExtensionHost.js\"\nexport type { UseTaskSubmitOptions, UseTaskSubmitReturn } from \"./useTaskSubmit.js\"\nexport type { UseGlobalInputOptions } from \"./useGlobalInput.js\"\nexport type { UsePickerHandlersOptions, UsePickerHandlersReturn } from \"./usePickerHandlers.js\"\n","import type { TUIMessage, PendingAsk, View } from \"../types.js\"\n\n/**\n * Determine the current view state based on messages and pending asks\n */\nexport function getView(messages: TUIMessage[], pendingAsk: PendingAsk | null, isLoading: boolean): View {\n\t// If there's a pending ask requiring text input, show input\n\tif (pendingAsk?.type === \"followup\") {\n\t\treturn \"UserInput\"\n\t}\n\n\t// If there's any pending ask (approval), don't show thinking\n\tif (pendingAsk) {\n\t\treturn \"UserInput\"\n\t}\n\n\t// Initial state or empty - awaiting user input\n\tif (messages.length === 0) {\n\t\treturn \"UserInput\"\n\t}\n\n\tconst lastMessage = messages.at(-1)\n\tif (!lastMessage) {\n\t\treturn \"UserInput\"\n\t}\n\n\t// User just sent a message, waiting for response\n\tif (lastMessage.role === \"user\") {\n\t\treturn \"AgentResponse\"\n\t}\n\n\t// Assistant replied\n\tif (lastMessage.role === \"assistant\") {\n\t\tif (lastMessage.hasPendingToolCalls) {\n\t\t\treturn \"ToolUse\"\n\t\t}\n\n\t\t// If loading, still waiting for more\n\t\tif (isLoading) {\n\t\t\treturn \"AgentResponse\"\n\t\t}\n\n\t\treturn \"UserInput\"\n\t}\n\n\t// Tool result received, waiting for next assistant response\n\tif (lastMessage.role === \"tool\") {\n\t\treturn \"AgentResponse\"\n\t}\n\n\treturn \"Default\"\n}\n","export * from \"./tools.js\"\nexport * from \"./views.js\"\n","import { memo } from \"react\"\nimport { Text } from \"ink\"\n\nimport * as theme from \"../theme.js\"\n\ninterface ProgressBarProps {\n\t/** Current value (e.g., contextTokens) */\n\tvalue: number\n\t/** Maximum value (e.g., contextWindow) */\n\tmax: number\n\t/** Width of the bar in characters (default: 16) */\n\twidth?: number\n}\n\n/**\n * A progress bar component with color gradient based on fill percentage.\n *\n * Colors:\n * - 0-50%: Green (safe zone)\n * - 50-75%: Yellow (warning zone)\n * - 75-100%: Red (danger zone)\n *\n * Visual example: [████████░░░░░░░░] 50%\n */\nfunction ProgressBar({ value, max, width = 16 }: ProgressBarProps) {\n\t// Calculate percentage, clamped to 0-100\n\tconst percentage = max > 0 ? Math.min(100, Math.max(0, (value / max) * 100)) : 0\n\n\t// Calculate how many blocks to fill\n\tconst filledBlocks = Math.round((percentage / 100) * width)\n\tconst emptyBlocks = width - filledBlocks\n\n\t// Determine color based on percentage\n\tlet barColor: string\n\tif (percentage <= 50) {\n\t\tbarColor = theme.successColor // Green\n\t} else if (percentage <= 75) {\n\t\tbarColor = theme.warningColor // Yellow\n\t} else {\n\t\tbarColor = theme.errorColor // Red\n\t}\n\n\t// Unicode block characters for smooth appearance\n\tconst filledChar = \"█\"\n\tconst emptyChar = \"░\"\n\n\tconst filledPart = filledChar.repeat(filledBlocks)\n\tconst emptyPart = emptyChar.repeat(emptyBlocks)\n\n\treturn (\n\t\t<Text>\n\t\t\t<Text color={theme.dimText}>[</Text>\n\t\t\t<Text color={barColor}>{filledPart}</Text>\n\t\t\t<Text color={theme.dimText}>\n\t\t\t\t{emptyPart}] {Math.round(percentage)}%\n\t\t\t</Text>\n\t\t</Text>\n\t)\n}\n\nexport default memo(ProgressBar)\n","import { memo } from \"react\"\r\nimport { Text, Box } from \"ink\"\r\n\r\nimport type { TokenUsage } from \"../../types\"\r\n\r\nimport * as theme from \"../theme.js\"\r\nimport ProgressBar from \"./ProgressBar.js\"\r\n\r\ninterface MetricsDisplayProps {\r\n\ttokenUsage: TokenUsage\r\n\tcontextWindow: number\r\n}\r\n\r\n/**\r\n * Formats a large number with K (thousands) or M (millions) suffix.\r\n *\r\n * Examples:\r\n * - 1234 -> \"1.2K\"\r\n * - 1234567 -> \"1.2M\"\r\n * - 500 -> \"500\"\r\n */\r\nfunction formatNumber(num: number): string {\r\n\tif (num >= 1_000_000) {\r\n\t\treturn `${(num / 1_000_000).toFixed(1)}M`\r\n\t}\r\n\tif (num >= 1_000) {\r\n\t\treturn `${(num / 1_000).toFixed(1)}K`\r\n\t}\r\n\treturn num.toString()\r\n}\r\n\r\n/**\r\n * Formats cost as currency with $ prefix.\r\n *\r\n * Examples:\r\n * - 0.12345 -> \"$0.12\"\r\n * - 1.5 -> \"$1.50\"\r\n */\r\nfunction formatCost(cost: number): string {\r\n\treturn `$${cost.toFixed(2)}`\r\n}\r\n\r\n/**\r\n * Displays task metrics in a compact format:\r\n * $0.12 │ ↓45.2K │ ↑8.7K │ [████████░░░░] 62%\r\n */\r\nfunction MetricsDisplay({ tokenUsage, contextWindow }: MetricsDisplayProps) {\r\n\tconst { totalCost, totalTokensIn, totalTokensOut, contextTokens } = tokenUsage\r\n\r\n\treturn (\r\n\t\t<Box>\r\n\t\t\t<Text color={theme.text}>{formatCost(totalCost)}</Text>\r\n\t\t\t<Text color={theme.dimText}> • </Text>\r\n\t\t\t<Text color={theme.dimText}>\r\n\t\t\t\t↓ <Text color={theme.text}>{formatNumber(totalTokensIn)}</Text>\r\n\t\t\t</Text>\r\n\t\t\t<Text color={theme.dimText}> • </Text>\r\n\t\t\t<Text color={theme.dimText}>\r\n\t\t\t\t↑ <Text color={theme.text}>{formatNumber(totalTokensOut)}</Text>\r\n\t\t\t</Text>\r\n\t\t\t<Text color={theme.dimText}> • </Text>\r\n\t\t\t<ProgressBar value={contextTokens} max={contextWindow} width={12} />\r\n\t\t</Box>\r\n\t)\r\n}\r\n\r\nexport default memo(MetricsDisplay)\r\nexport { formatNumber, formatCost }\r\n","import { memo } from \"react\"\r\nimport { Text, Box } from \"ink\"\r\n\r\nimport type { TokenUsage } from \"../../types\"\r\n\r\nimport { ASCII_ROO } from \"../../types/constants.js\"\r\n\r\nimport { ExtensionHostOptions } from \"../../agent/index.js\"\r\nimport { useTerminalSize } from \"../hooks/TerminalSizeContext.js\"\r\nimport * as theme from \"../theme.js\"\r\n\r\nimport MetricsDisplay from \"./MetricsDisplay.js\"\r\n\r\ninterface HeaderProps extends ExtensionHostOptions {\r\n\tversion: string\r\n\ttokenUsage?: TokenUsage | null\r\n\tcontextWindow?: number\r\n}\r\n\r\nfunction Header({\r\n\tworkspacePath,\r\n\tuser,\r\n\tprovider,\r\n\tmodel,\r\n\tmode,\r\n\treasoningEffort,\r\n\tnonInteractive,\r\n\tversion,\r\n\ttokenUsage,\r\n\tcontextWindow,\r\n}: HeaderProps) {\r\n\tconst { columns } = useTerminalSize()\r\n\r\n\tconst homeDir = process.env.HOME || process.env.USERPROFILE || \"\"\r\n\tconst title = `Roo Code CLI v${version}`\r\n\tconst remainingDashes = Math.max(0, columns - `── ${title} `.length)\r\n\r\n\treturn (\r\n\t\t<Box flexDirection=\"column\" width={columns}>\r\n\t\t\t<Text color={theme.borderColor}>\r\n\t\t\t\t── <Text color={theme.titleColor}>{title}</Text> {\"─\".repeat(remainingDashes)}\r\n\t\t\t</Text>\r\n\t\t\t<Box width={columns}>\r\n\t\t\t\t<Box flexDirection=\"row\">\r\n\t\t\t\t\t<Box marginY={1}>\r\n\t\t\t\t\t\t<Text color=\"magenta\">{ASCII_ROO}</Text>\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t\t<Box flexDirection=\"column\" marginLeft={1} marginTop={1}>\r\n\t\t\t\t\t\t{user && <Text color={theme.dimText}>Welcome back, {user.name}</Text>}\r\n\t\t\t\t\t\t<Text color={theme.dimText}>\r\n\t\t\t\t\t\t\tcwd:{\" \"}\r\n\t\t\t\t\t\t\t{workspacePath.startsWith(homeDir) ? workspacePath.replace(homeDir, \"~\") : workspacePath}\r\n\t\t\t\t\t\t</Text>\r\n\t\t\t\t\t\t<Text color={theme.dimText}>\r\n\t\t\t\t\t\t\t{provider}: {model} [{reasoningEffort}]\r\n\t\t\t\t\t\t</Text>\r\n\t\t\t\t\t\t<Text color={theme.dimText}>\r\n\t\t\t\t\t\t\tmode: {mode}\r\n\t\t\t\t\t\t\t{nonInteractive && \" (YOLO)\"}\r\n\t\t\t\t\t\t</Text>\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t</Box>\r\n\t\t\t</Box>\r\n\t\t\t{tokenUsage && contextWindow && contextWindow > 0 && (\r\n\t\t\t\t<Box alignSelf=\"flex-end\" marginTop={-1}>\r\n\t\t\t\t\t<MetricsDisplay tokenUsage={tokenUsage} contextWindow={contextWindow} />\r\n\t\t\t\t</Box>\r\n\t\t\t)}\r\n\t\t\t<Text color={theme.borderColor}>{\"─\".repeat(columns)}</Text>\r\n\t\t</Box>\r\n\t)\r\n}\r\n\r\nexport default memo(Header)\r\n","import { Box, Text } from \"ink\"\nimport type { TextProps } from \"ink\"\n\n/**\n * Icon names supported by the Icon component.\n * Each icon has a Nerd Font glyph and an ASCII fallback.\n */\nexport type IconName =\n\t| \"folder\"\n\t| \"file\"\n\t| \"file-edit\"\n\t| \"check\"\n\t| \"cross\"\n\t| \"arrow-right\"\n\t| \"bullet\"\n\t| \"spinner\"\n\t// Tool-related icons\n\t| \"search\"\n\t| \"terminal\"\n\t| \"browser\"\n\t| \"switch\"\n\t| \"question\"\n\t| \"gear\"\n\t| \"diff\"\n\t// TODO-related icons\n\t| \"checkbox\"\n\t| \"checkbox-checked\"\n\t| \"checkbox-progress\"\n\t| \"todo-list\"\n\n/**\n * Icon definitions with Nerd Font glyph and ASCII fallback.\n * Nerd Font glyphs are surrogate pairs (2 JS chars, 1 visual char).\n */\nconst ICONS: Record<IconName, { nerd: string; fallback: string }> = {\n\tfolder: { nerd: \"\\uf413\", fallback: \"▼\" },\n\tfile: { nerd: \"\\uf4a5\", fallback: \"●\" },\n\t\"file-edit\": { nerd: \"\\uf4d2\", fallback: \"✎\" },\n\tcheck: { nerd: \"\\uf42e\", fallback: \"✓\" },\n\tcross: { nerd: \"\\uf517\", fallback: \"✗\" },\n\t\"arrow-right\": { nerd: \"\\uf432\", fallback: \"→\" },\n\tbullet: { nerd: \"\\uf444\", fallback: \"•\" },\n\tspinner: { nerd: \"\\uf4e3\", fallback: \"*\" },\n\t// Tool-related icons\n\tsearch: { nerd: \"\\uf422\", fallback: \"🔍\" },\n\tterminal: { nerd: \"\\uf489\", fallback: \"$\" },\n\tbrowser: { nerd: \"\\uf488\", fallback: \"🌐\" },\n\tswitch: { nerd: \"\\uf443\", fallback: \"⇄\" },\n\tquestion: { nerd: \"\\uf420\", fallback: \"?\" },\n\tgear: { nerd: \"\\uf423\", fallback: \"⚙\" },\n\tdiff: { nerd: \"\\uf4d2\", fallback: \"±\" },\n\t// TODO-related icons\n\tcheckbox: { nerd: \"\\uf4aa\", fallback: \"○\" }, // Empty checkbox\n\t\"checkbox-checked\": { nerd: \"\\uf4a4\", fallback: \"✓\" }, // Checked checkbox\n\t\"checkbox-progress\": { nerd: \"\\uf4aa\", fallback: \"→\" }, // In progress (dot circle)\n\t\"todo-list\": { nerd: \"\\uf45e\", fallback: \"☑\" }, // List icon for TODO header\n}\n\n/**\n * Check if a string contains surrogate pairs (characters outside BMP).\n * Surrogate pairs have .length of 2 but render as 1 visual character.\n */\nfunction containsSurrogatePair(str: string): boolean {\n\t// Surrogate pairs are in the range U+D800 to U+DFFF\n\treturn /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/.test(str)\n}\n\n/**\n * Detect if Nerd Font icons are likely supported.\n *\n * Users can override this with the ROOCODE_NERD_FONT environment variable:\n * - ROOCODE_NERD_FONT=0 to force ASCII fallbacks (if icons don't render correctly)\n * - ROOCODE_NERD_FONT=1 to force Nerd Font icons\n *\n * Defaults to true because:\n * 1. Nerd Fonts are common in developer terminal setups\n * 2. Modern terminals handle missing glyphs gracefully\n * 3. Users can easily disable if icons don't render correctly\n */\nfunction detectNerdFontSupport(): boolean {\n\t// Allow explicit override via environment variable\n\tconst envOverride = process.env.ROOCODE_NERD_FONT\n\tif (envOverride === \"0\" || envOverride === \"false\") return false\n\tif (envOverride === \"1\" || envOverride === \"true\") return true\n\n\t// Default to Nerd Font icons - they're common in developer setups\n\t// and users can set ROOCODE_NERD_FONT=0 if needed\n\treturn true\n}\n\n// Cache the detection result\nlet nerdFontSupported: boolean | null = null\n\n/**\n * Get whether Nerd Font icons are supported (cached).\n */\nexport function isNerdFontSupported(): boolean {\n\tif (nerdFontSupported === null) {\n\t\tnerdFontSupported = detectNerdFontSupport()\n\t}\n\treturn nerdFontSupported\n}\n\n/**\n * Reset the Nerd Font detection cache (useful for testing).\n */\nexport function resetNerdFontCache(): void {\n\tnerdFontSupported = null\n}\n\nexport interface IconProps extends Omit<TextProps, \"children\"> {\n\t/** The icon to display */\n\tname: IconName\n\t/** Override the automatic Nerd Font detection */\n\tuseNerdFont?: boolean\n\t/** Custom width for the icon container (default: 2) */\n\twidth?: number\n}\n\n/**\n * Icon component that renders Nerd Font icons with ASCII fallbacks.\n *\n * Renders icons in a fixed-width Box to handle surrogate pair width\n * calculation issues in Ink. Surrogate pairs (like Nerd Font glyphs)\n * have .length of 2 in JavaScript but render as 1 visual character.\n *\n * @example\n * ```tsx\n * <Icon name=\"folder\" color=\"blue\" />\n * <Icon name=\"file\" />\n * <Icon name=\"check\" color=\"green\" useNerdFont={false} />\n * ```\n */\nexport function Icon({ name, useNerdFont, width = 2, color, ...textProps }: IconProps) {\n\tconst iconDef = ICONS[name]\n\tif (!iconDef) {\n\t\treturn null\n\t}\n\n\tconst shouldUseNerdFont = useNerdFont ?? isNerdFontSupported()\n\tconst icon = shouldUseNerdFont ? iconDef.nerd : iconDef.fallback\n\n\t// Use fixed-width Box to isolate surrogate pair width calculation\n\t// from surrounding text. This prevents the off-by-one truncation bug.\n\tconst needsWidthFix = containsSurrogatePair(icon)\n\n\tif (needsWidthFix) {\n\t\treturn (\n\t\t\t<Box width={width}>\n\t\t\t\t<Text color={color} {...textProps}>\n\t\t\t\t\t{icon}\n\t\t\t\t</Text>\n\t\t\t</Box>\n\t\t)\n\t}\n\n\t// For BMP characters (no surrogate pairs), render directly\n\treturn (\n\t\t<Text color={color} {...textProps}>\n\t\t\t{icon}\n\t\t</Text>\n\t)\n}\n\n/**\n * Get the raw icon character (useful for string concatenation).\n */\nexport function getIconChar(name: IconName, useNerdFont?: boolean): string {\n\tconst iconDef = ICONS[name]\n\tif (!iconDef) return \"\"\n\n\tconst shouldUseNerdFont = useNerdFont ?? isNerdFontSupported()\n\treturn shouldUseNerdFont ? iconDef.nerd : iconDef.fallback\n}\n","import { memo } from \"react\"\r\nimport { Box, Text } from \"ink\"\r\n\r\nimport type { TodoItem } from \"../../types\"\r\n\r\nimport * as theme from \"../theme.js\"\r\nimport ProgressBar from \"./ProgressBar.js\"\r\nimport { Icon, type IconName } from \"./Icon.js\"\r\n\r\n/**\r\n * Map TODO status to Icon names\r\n */\r\nconst STATUS_ICON_NAMES: Record<TodoItem[\"status\"], IconName> = {\r\n\tcompleted: \"checkbox-checked\",\r\n\tin_progress: \"checkbox-progress\",\r\n\tpending: \"checkbox\",\r\n}\r\n\r\n/**\r\n * Get the color for a TODO status\r\n */\r\nfunction getStatusColor(status: TodoItem[\"status\"]): string {\r\n\tswitch (status) {\r\n\t\tcase \"completed\":\r\n\t\t\treturn theme.successColor\r\n\t\tcase \"in_progress\":\r\n\t\t\treturn theme.warningColor\r\n\t\tcase \"pending\":\r\n\t\tdefault:\r\n\t\t\treturn theme.dimText\r\n\t}\r\n}\r\n\r\ninterface TodoDisplayProps {\r\n\t/** List of TODO items to display */\r\n\ttodos: TodoItem[]\r\n\t/** Previous TODO list for diff comparison (optional) */\r\n\tpreviousTodos?: TodoItem[]\r\n\t/** Whether to show the progress bar (default: true) */\r\n\tshowProgress?: boolean\r\n\t/** Whether to show only changed items (default: false) */\r\n\tshowChangesOnly?: boolean\r\n\t/** Title to display in the header (default: \"Progress\") */\r\n\ttitle?: string\r\n}\r\n\r\n/**\r\n * TodoDisplay component for CLI\r\n *\r\n * Renders a beautiful TODO list visualization with:\r\n * - Nerd Font icons (or ASCII fallbacks) for status\r\n * - Color-coded items based on status (green/yellow/gray)\r\n * - Progress bar showing completion percentage\r\n * - Optional diff mode showing only changed items\r\n * - Change indicators ([done], [started], [new])\r\n *\r\n * Visual example (with fallback icons):\r\n * ```\r\n * ☑ Progress [████████░░░░░░░░] 2/5\r\n * ✓ Analyze requirements [done]\r\n * ✓ Design architecture [done]\r\n * → Implement core logic\r\n * ○ Write tests\r\n * ○ Update documentation [new]\r\n * ```\r\n */\r\nfunction TodoDisplay({\r\n\ttodos,\r\n\tpreviousTodos = [],\r\n\tshowProgress = true,\r\n\tshowChangesOnly = false,\r\n\ttitle = \"Progress\",\r\n}: TodoDisplayProps) {\r\n\tif (!todos || todos.length === 0) {\r\n\t\treturn null\r\n\t}\r\n\r\n\t// Determine which todos to display\r\n\tlet displayTodos: TodoItem[]\r\n\r\n\tif (showChangesOnly && previousTodos.length > 0) {\r\n\t\t// Filter to only show items that changed status\r\n\t\tdisplayTodos = todos.filter((todo) => {\r\n\t\t\tconst previousTodo = previousTodos.find((p) => p.id === todo.id || p.content === todo.content)\r\n\t\t\tif (!previousTodo) {\r\n\t\t\t\t// New item\r\n\t\t\t\treturn true\r\n\t\t\t}\r\n\t\t\t// Status changed\r\n\t\t\treturn previousTodo.status !== todo.status\r\n\t\t})\r\n\t} else {\r\n\t\tdisplayTodos = todos\r\n\t}\r\n\r\n\t// If filtering and nothing changed, don't render\r\n\tif (showChangesOnly && displayTodos.length === 0) {\r\n\t\treturn null\r\n\t}\r\n\r\n\t// Calculate progress statistics\r\n\tconst totalCount = todos.length\r\n\tconst completedCount = todos.filter((t) => t.status === \"completed\").length\r\n\r\n\treturn (\r\n\t\t<Box flexDirection=\"column\" paddingX={1} marginBottom={1}>\r\n\t\t\t{/* Header with progress bar on same line */}\r\n\t\t\t<Box>\r\n\t\t\t\t<Icon name=\"todo-list\" color={theme.toolHeader} />\r\n\t\t\t\t<Text color={theme.toolHeader} bold>\r\n\t\t\t\t\t{\" \"}\r\n\t\t\t\t\t{title}\r\n\t\t\t\t</Text>\r\n\t\t\t\t{showProgress && (\r\n\t\t\t\t\t<>\r\n\t\t\t\t\t\t<Text> </Text>\r\n\t\t\t\t\t\t<ProgressBar value={completedCount} max={totalCount} width={16} />\r\n\t\t\t\t\t</>\r\n\t\t\t\t)}\r\n\t\t\t</Box>\r\n\r\n\t\t\t{/* TODO items */}\r\n\t\t\t<Box flexDirection=\"column\" paddingLeft={1} marginTop={1}>\r\n\t\t\t\t{displayTodos.map((todo, index) => {\r\n\t\t\t\t\tconst iconName = STATUS_ICON_NAMES[todo.status] || STATUS_ICON_NAMES.pending\r\n\t\t\t\t\tconst color = getStatusColor(todo.status)\r\n\r\n\t\t\t\t\t// Check if this item changed status\r\n\t\t\t\t\tconst previousTodo = previousTodos.find((p) => p.id === todo.id || p.content === todo.content)\r\n\t\t\t\t\tconst statusChanged = previousTodo && previousTodo.status !== todo.status\r\n\t\t\t\t\tconst isNew = previousTodos.length > 0 && !previousTodo\r\n\r\n\t\t\t\t\treturn (\r\n\t\t\t\t\t\t<Box key={todo.id || `todo-${index}`}>\r\n\t\t\t\t\t\t\t<Icon name={iconName} color={color} />\r\n\t\t\t\t\t\t\t<Text color={color}> {todo.content}</Text>\r\n\t\t\t\t\t\t\t{statusChanged && (\r\n\t\t\t\t\t\t\t\t<Text color={theme.dimText} dimColor>\r\n\t\t\t\t\t\t\t\t\t{\" \"}\r\n\t\t\t\t\t\t\t\t\t[\r\n\t\t\t\t\t\t\t\t\t{todo.status === \"completed\"\r\n\t\t\t\t\t\t\t\t\t\t? \"done\"\r\n\t\t\t\t\t\t\t\t\t\t: todo.status === \"in_progress\"\r\n\t\t\t\t\t\t\t\t\t\t\t? \"started\"\r\n\t\t\t\t\t\t\t\t\t\t\t: \"reset\"}\r\n\t\t\t\t\t\t\t\t\t]\r\n\t\t\t\t\t\t\t\t</Text>\r\n\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t{isNew && (\r\n\t\t\t\t\t\t\t\t<Text color={theme.dimText} dimColor>\r\n\t\t\t\t\t\t\t\t\t{\" \"}\r\n\t\t\t\t\t\t\t\t\t[new]\r\n\t\t\t\t\t\t\t\t</Text>\r\n\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t)\r\n\t\t\t\t})}\r\n\t\t\t</Box>\r\n\t\t</Box>\r\n\t)\r\n}\r\n\r\nexport default memo(TodoDisplay)\r\n","import type { ToolData } from \"../../types.js\"\n\nexport interface ToolRendererProps {\n\ttoolData: ToolData\n\trawContent?: string\n}\n\nexport type ToolCategory = \"file-read\" | \"file-write\" | \"search\" | \"command\" | \"mode\" | \"completion\" | \"other\"\n\nexport function getToolCategory(toolName: string): ToolCategory {\n\tconst fileReadTools = [\"readFile\", \"read_file\", \"skill\", \"listFilesTopLevel\", \"listFilesRecursive\", \"list_files\"]\n\n\tconst fileWriteTools = [\n\t\t\"editedExistingFile\",\n\t\t\"appliedDiff\",\n\t\t\"apply_diff\",\n\t\t\"newFileCreated\",\n\t\t\"write_to_file\",\n\t\t\"writeToFile\",\n\t]\n\n\tconst searchTools = [\"searchFiles\", \"search_files\", \"codebaseSearch\", \"codebase_search\"]\n\tconst commandTools = [\"execute_command\", \"executeCommand\"]\n\tconst modeTools = [\"switchMode\", \"switch_mode\", \"newTask\", \"new_task\", \"finishTask\"]\n\tconst completionTools = [\"attempt_completion\", \"attemptCompletion\", \"ask_followup_question\", \"askFollowupQuestion\"]\n\n\tif (fileReadTools.includes(toolName)) return \"file-read\"\n\tif (fileWriteTools.includes(toolName)) return \"file-write\"\n\tif (searchTools.includes(toolName)) return \"search\"\n\tif (commandTools.includes(toolName)) return \"command\"\n\tif (modeTools.includes(toolName)) return \"mode\"\n\tif (completionTools.includes(toolName)) return \"completion\"\n\treturn \"other\"\n}\n","import type { IconName } from \"../Icon.js\"\n\n/**\n * Truncate text and return truncation info\n */\nexport function truncateText(\n\ttext: string,\n\tmaxLines: number = 10,\n): { text: string; truncated: boolean; totalLines: number; hiddenLines: number } {\n\tconst lines = text.split(\"\\n\")\n\tconst totalLines = lines.length\n\n\tif (lines.length <= maxLines) {\n\t\treturn { text, truncated: false, totalLines, hiddenLines: 0 }\n\t}\n\n\tconst truncatedText = lines.slice(0, maxLines).join(\"\\n\")\n\treturn {\n\t\ttext: truncatedText,\n\t\ttruncated: true,\n\t\ttotalLines,\n\t\thiddenLines: totalLines - maxLines,\n\t}\n}\n\n/**\n * Sanitize content for terminal display\n * - Replaces tabs with spaces\n * - Strips carriage returns\n */\nexport function sanitizeContent(text: string): string {\n\treturn text.replace(/\\t/g, \" \").replace(/\\r/g, \"\")\n}\n\n/**\n * Format diff stats as a colored string representation\n */\nexport function formatDiffStats(stats: { added: number; removed: number }): { added: string; removed: string } {\n\treturn {\n\t\tadded: `+${stats.added}`,\n\t\tremoved: `-${stats.removed}`,\n\t}\n}\n\n/**\n * Get a friendly display name for a tool\n */\nexport function getToolDisplayName(toolName: string): string {\n\tconst displayNames: Record<string, string> = {\n\t\t// File read operations\n\t\treadFile: \"Read\",\n\t\tread_file: \"Read\",\n\t\tskill: \"Load Skill\",\n\t\tlistFilesTopLevel: \"List Files\",\n\t\tlistFilesRecursive: \"List Files (Recursive)\",\n\t\tlist_files: \"List Files\",\n\n\t\t// File write operations\n\t\teditedExistingFile: \"Edit\",\n\t\tappliedDiff: \"Diff\",\n\t\tapply_diff: \"Diff\",\n\t\tnewFileCreated: \"Create File\",\n\t\twrite_to_file: \"Write File\",\n\t\twriteToFile: \"Write File\",\n\n\t\t// Search operations\n\t\tsearchFiles: \"Search Files\",\n\t\tsearch_files: \"Search Files\",\n\t\tcodebaseSearch: \"Codebase Search\",\n\t\tcodebase_search: \"Codebase Search\",\n\n\t\t// Command operations\n\t\texecute_command: \"Execute Command\",\n\t\texecuteCommand: \"Execute Command\",\n\n\t\t// Mode operations\n\t\tswitchMode: \"Switch Mode\",\n\t\tswitch_mode: \"Switch Mode\",\n\t\tnewTask: \"New Task\",\n\t\tnew_task: \"New Task\",\n\t\tfinishTask: \"Finish Task\",\n\n\t\t// Completion operations\n\t\tattempt_completion: \"Task Complete\",\n\t\tattemptCompletion: \"Task Complete\",\n\t\task_followup_question: \"Question\",\n\t\taskFollowupQuestion: \"Question\",\n\n\t\t// TODO operations\n\t\tupdate_todo_list: \"Update TODO List\",\n\t\tupdateTodoList: \"Update TODO List\",\n\t}\n\n\treturn displayNames[toolName] || toolName\n}\n\n/**\n * Get the IconName for a tool (for use with Icon component)\n */\nexport function getToolIconName(toolName: string): IconName {\n\tconst iconNames: Record<string, IconName> = {\n\t\t// File read operations\n\t\treadFile: \"file\",\n\t\tread_file: \"file\",\n\t\tskill: \"file\",\n\t\tlistFilesTopLevel: \"folder\",\n\t\tlistFilesRecursive: \"folder\",\n\t\tlist_files: \"folder\",\n\n\t\t// File write operations\n\t\teditedExistingFile: \"file-edit\",\n\t\tappliedDiff: \"diff\",\n\t\tapply_diff: \"diff\",\n\t\tnewFileCreated: \"file-edit\",\n\t\twrite_to_file: \"file-edit\",\n\t\twriteToFile: \"file-edit\",\n\n\t\t// Search operations\n\t\tsearchFiles: \"search\",\n\t\tsearch_files: \"search\",\n\t\tcodebaseSearch: \"search\",\n\t\tcodebase_search: \"search\",\n\n\t\t// Command operations\n\t\texecute_command: \"terminal\",\n\t\texecuteCommand: \"terminal\",\n\n\t\t// Mode operations\n\t\tswitchMode: \"switch\",\n\t\tswitch_mode: \"switch\",\n\t\tnewTask: \"switch\",\n\t\tnew_task: \"switch\",\n\t\tfinishTask: \"check\",\n\n\t\t// Completion operations\n\t\tattempt_completion: \"check\",\n\t\tattemptCompletion: \"check\",\n\t\task_followup_question: \"question\",\n\t\taskFollowupQuestion: \"question\",\n\n\t\t// TODO operations\n\t\tupdate_todo_list: \"check\",\n\t\tupdateTodoList: \"check\",\n\t}\n\n\treturn iconNames[toolName] || \"gear\"\n}\n\n/**\n * Format a file path for display, optionally with workspace indicator\n */\nexport function formatPath(path: string, isOutsideWorkspace?: boolean, isProtected?: boolean): string {\n\tlet result = path\n\tconst badges: string[] = []\n\n\tif (isOutsideWorkspace) {\n\t\tbadges.push(\"outside workspace\")\n\t}\n\n\tif (isProtected) {\n\t\tbadges.push(\"protected\")\n\t}\n\n\tif (badges.length > 0) {\n\t\tresult += ` (${badges.join(\", \")})`\n\t}\n\n\treturn result\n}\n\n/**\n * Parse diff content into structured hunks for rendering\n */\nexport interface DiffHunk {\n\theader: string\n\tlines: Array<{\n\t\ttype: \"context\" | \"added\" | \"removed\" | \"header\"\n\t\tcontent: string\n\t\tlineNumber?: number\n\t}>\n}\n\nexport function parseDiff(diffContent: string): DiffHunk[] {\n\tconst hunks: DiffHunk[] = []\n\tconst lines = diffContent.split(\"\\n\")\n\n\tlet currentHunk: DiffHunk | null = null\n\n\tfor (const line of lines) {\n\t\tif (line.startsWith(\"@@\")) {\n\t\t\t// New hunk header\n\t\t\tif (currentHunk) {\n\t\t\t\thunks.push(currentHunk)\n\t\t\t}\n\t\t\tcurrentHunk = { header: line, lines: [] }\n\t\t} else if (currentHunk) {\n\t\t\tif (line.startsWith(\"+\") && !line.startsWith(\"+++\")) {\n\t\t\t\tcurrentHunk.lines.push({ type: \"added\", content: line.substring(1) })\n\t\t\t} else if (line.startsWith(\"-\") && !line.startsWith(\"---\")) {\n\t\t\t\tcurrentHunk.lines.push({ type: \"removed\", content: line.substring(1) })\n\t\t\t} else if (line.startsWith(\" \") || line === \"\") {\n\t\t\t\tcurrentHunk.lines.push({ type: \"context\", content: line.substring(1) || \"\" })\n\t\t\t}\n\t\t}\n\t}\n\n\tif (currentHunk) {\n\t\thunks.push(currentHunk)\n\t}\n\n\treturn hunks\n}\n","import { Box, Text } from \"ink\"\n\nimport * as theme from \"../../theme.js\"\nimport { Icon } from \"../Icon.js\"\n\nimport type { ToolRendererProps } from \"./types.js\"\nimport { truncateText, sanitizeContent, getToolDisplayName, getToolIconName } from \"./utils.js\"\n\nconst MAX_PREVIEW_LINES = 12\n\n/**\n * Check if content looks like actual file content vs just path info\n * File content typically has newlines or is longer than a typical path\n */\nfunction isActualContent(content: string, path: string): boolean {\n\tif (!content) return false\n\t// If content equals path or is just the path, it's not actual content\n\tif (content === path || content.endsWith(path)) return false\n\t// Check if it looks like a plain path (no newlines, starts with / or drive letter)\n\tif (!content.includes(\"\\n\") && (content.startsWith(\"/\") || /^[A-Z]:\\\\/.test(content))) return false\n\t// Has newlines or doesn't look like a path - treat as content\n\treturn content.includes(\"\\n\") || content.length > 200\n}\n\nexport function FileReadTool({ toolData }: ToolRendererProps) {\n\tconst iconName = getToolIconName(toolData.tool)\n\tconst displayName = getToolDisplayName(toolData.tool)\n\tconst path = toolData.path || \"\"\n\tconst rawContent = toolData.content ? sanitizeContent(toolData.content) : \"\"\n\tconst isOutsideWorkspace = toolData.isOutsideWorkspace\n\tconst isList = toolData.tool.includes(\"list\") || toolData.tool.includes(\"List\")\n\n\t// Only show content if it's actual file content, not just path info\n\tconst content = isActualContent(rawContent, path) ? rawContent : \"\"\n\n\t// Handle batch file reads\n\tif (toolData.batchFiles && toolData.batchFiles.length > 0) {\n\t\treturn (\n\t\t\t<Box flexDirection=\"column\" paddingX={1}>\n\t\t\t\t{/* Header */}\n\t\t\t\t<Box>\n\t\t\t\t\t<Icon name={iconName} color={theme.toolHeader} />\n\t\t\t\t\t<Text bold color={theme.toolHeader}>\n\t\t\t\t\t\t{\" \"}\n\t\t\t\t\t\t{displayName}\n\t\t\t\t\t</Text>\n\t\t\t\t\t<Text color={theme.dimText}> ({toolData.batchFiles.length} files)</Text>\n\t\t\t\t</Box>\n\n\t\t\t\t{/* File list */}\n\t\t\t\t<Box flexDirection=\"column\" marginLeft={2} marginTop={1}>\n\t\t\t\t\t{toolData.batchFiles.slice(0, 10).map((file, index) => (\n\t\t\t\t\t\t<Box key={index}>\n\t\t\t\t\t\t\t<Text color={theme.text} bold>\n\t\t\t\t\t\t\t\t{file.path}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t{file.lineSnippet && <Text color={theme.dimText}> ({file.lineSnippet})</Text>}\n\t\t\t\t\t\t\t{file.isOutsideWorkspace && (\n\t\t\t\t\t\t\t\t<Text color={theme.warningColor} dimColor>\n\t\t\t\t\t\t\t\t\t{\" \"}\n\t\t\t\t\t\t\t\t\t⚠ outside workspace\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</Box>\n\t\t\t\t\t))}\n\t\t\t\t\t{toolData.batchFiles.length > 10 && (\n\t\t\t\t\t\t<Text color={theme.dimText}>... and {toolData.batchFiles.length - 10} more files</Text>\n\t\t\t\t\t)}\n\t\t\t\t</Box>\n\t\t\t</Box>\n\t\t)\n\t}\n\n\t// Single file read\n\tconst { text: previewContent, truncated, hiddenLines } = truncateText(content, MAX_PREVIEW_LINES)\n\n\treturn (\n\t\t<Box flexDirection=\"column\" paddingX={1} marginBottom={1}>\n\t\t\t{/* Header with path on same line for single file */}\n\t\t\t<Box>\n\t\t\t\t<Icon name={iconName} color={theme.toolHeader} />\n\t\t\t\t<Text bold color={theme.toolHeader}>\n\t\t\t\t\t{displayName}\n\t\t\t\t</Text>\n\t\t\t\t{path && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<Text color={theme.dimText}> · </Text>\n\t\t\t\t\t\t<Text color={theme.text} bold>\n\t\t\t\t\t\t\t{path}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t{isOutsideWorkspace && (\n\t\t\t\t\t\t\t<Text color={theme.warningColor} dimColor>\n\t\t\t\t\t\t\t\t{\" \"}\n\t\t\t\t\t\t\t\t⚠ outside workspace\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</Box>\n\n\t\t\t{/* Content preview - only if we have actual file content */}\n\t\t\t{previewContent && (\n\t\t\t\t<Box flexDirection=\"column\" marginLeft={2} marginTop={1}>\n\t\t\t\t\t{isList ? (\n\t\t\t\t\t\t// Directory listing - show as tree-like structure\n\t\t\t\t\t\t<Box flexDirection=\"column\">\n\t\t\t\t\t\t\t{previewContent.split(\"\\n\").map((line, i) => (\n\t\t\t\t\t\t\t\t<Text key={i} color={theme.toolText}>\n\t\t\t\t\t\t\t\t\t{line}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</Box>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t// File content - show in a box\n\t\t\t\t\t\t<Box flexDirection=\"column\">\n\t\t\t\t\t\t\t<Box borderStyle=\"single\" borderColor={theme.borderColor} paddingX={1}>\n\t\t\t\t\t\t\t\t<Text color={theme.toolText}>{previewContent}</Text>\n\t\t\t\t\t\t\t</Box>\n\t\t\t\t\t\t</Box>\n\t\t\t\t\t)}\n\n\t\t\t\t\t{truncated && (\n\t\t\t\t\t\t<Text color={theme.dimText} dimColor>\n\t\t\t\t\t\t\t... ({hiddenLines} more lines)\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t)}\n\t\t\t\t</Box>\n\t\t\t)}\n\t\t</Box>\n\t)\n}\n","import { Box, Text } from \"ink\"\n\nimport * as theme from \"../../theme.js\"\nimport { Icon } from \"../Icon.js\"\n\nimport type { ToolRendererProps } from \"./types.js\"\nimport { truncateText, sanitizeContent, getToolDisplayName, getToolIconName, parseDiff } from \"./utils.js\"\n\nconst MAX_DIFF_LINES = 15\n\nexport function FileWriteTool({ toolData }: ToolRendererProps) {\n\tconst iconName = getToolIconName(toolData.tool)\n\tconst displayName = getToolDisplayName(toolData.tool)\n\tconst path = toolData.path || \"\"\n\tconst diffStats = toolData.diffStats\n\tconst diff = toolData.diff ? sanitizeContent(toolData.diff) : \"\"\n\tconst isProtected = toolData.isProtected\n\tconst isOutsideWorkspace = toolData.isOutsideWorkspace\n\tconst isNewFile = toolData.tool === \"newFileCreated\" || toolData.tool === \"write_to_file\"\n\n\t// Handle batch diff operations\n\tif (toolData.batchDiffs && toolData.batchDiffs.length > 0) {\n\t\treturn (\n\t\t\t<Box flexDirection=\"column\" paddingX={1}>\n\t\t\t\t{/* Header */}\n\t\t\t\t<Box>\n\t\t\t\t\t<Icon name={iconName} color={theme.toolHeader} />\n\t\t\t\t\t<Text bold color={theme.toolHeader}>\n\t\t\t\t\t\t{\" \"}\n\t\t\t\t\t\t{displayName}\n\t\t\t\t\t</Text>\n\t\t\t\t\t<Text color={theme.dimText}> ({toolData.batchDiffs.length} files)</Text>\n\t\t\t\t</Box>\n\n\t\t\t\t{/* File list with stats */}\n\t\t\t\t<Box flexDirection=\"column\" marginLeft={2} marginTop={1}>\n\t\t\t\t\t{toolData.batchDiffs.slice(0, 8).map((file, index) => (\n\t\t\t\t\t\t<Box key={index}>\n\t\t\t\t\t\t\t<Text color={theme.text} bold>\n\t\t\t\t\t\t\t\t{file.path}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t{file.diffStats && (\n\t\t\t\t\t\t\t\t<Box marginLeft={1}>\n\t\t\t\t\t\t\t\t\t<Text color={theme.successColor}>+{file.diffStats.added}</Text>\n\t\t\t\t\t\t\t\t\t<Text color={theme.dimText}> / </Text>\n\t\t\t\t\t\t\t\t\t<Text color={theme.errorColor}>-{file.diffStats.removed}</Text>\n\t\t\t\t\t\t\t\t</Box>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</Box>\n\t\t\t\t\t))}\n\t\t\t\t\t{toolData.batchDiffs.length > 8 && (\n\t\t\t\t\t\t<Text color={theme.dimText}>... and {toolData.batchDiffs.length - 8} more files</Text>\n\t\t\t\t\t)}\n\t\t\t\t</Box>\n\t\t\t</Box>\n\t\t)\n\t}\n\n\t// Single file write\n\tconst { text: previewDiff, truncated, hiddenLines } = truncateText(diff, MAX_DIFF_LINES)\n\tconst diffHunks = diff ? parseDiff(diff) : []\n\n\treturn (\n\t\t<Box flexDirection=\"column\" paddingX={1} marginBottom={1}>\n\t\t\t{/* Header row with path on same line */}\n\t\t\t<Box>\n\t\t\t\t<Icon name={iconName} color={theme.toolHeader} />\n\t\t\t\t<Text bold color={theme.toolHeader}>\n\t\t\t\t\t{displayName}\n\t\t\t\t</Text>\n\t\t\t\t{path && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<Text color={theme.dimText}> · </Text>\n\t\t\t\t\t\t<Text color={theme.text} bold>\n\t\t\t\t\t\t\t{path}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t\t{isNewFile && (\n\t\t\t\t\t<Text color={theme.successColor} bold>\n\t\t\t\t\t\t{\" \"}\n\t\t\t\t\t\tNEW\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\n\t\t\t\t{/* Diff stats badge */}\n\t\t\t\t{diffStats && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<Text color={theme.dimText}> </Text>\n\t\t\t\t\t\t<Text color={theme.successColor} bold>\n\t\t\t\t\t\t\t+{diffStats.added}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t<Text color={theme.dimText}>/</Text>\n\t\t\t\t\t\t<Text color={theme.errorColor} bold>\n\t\t\t\t\t\t\t-{diffStats.removed}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\n\t\t\t\t{/* Warning badges */}\n\t\t\t\t{isProtected && <Text color={theme.errorColor}> 🔒 protected</Text>}\n\t\t\t\t{isOutsideWorkspace && (\n\t\t\t\t\t<Text color={theme.warningColor} dimColor>\n\t\t\t\t\t\t{\" \"}\n\t\t\t\t\t\t⚠ outside workspace\n\t\t\t\t\t</Text>\n\t\t\t\t)}\n\t\t\t</Box>\n\n\t\t\t{/* Diff preview */}\n\t\t\t{diffHunks.length > 0 && (\n\t\t\t\t<Box flexDirection=\"column\" marginLeft={2} marginTop={1}>\n\t\t\t\t\t{diffHunks.slice(0, 2).map((hunk, hunkIndex) => (\n\t\t\t\t\t\t<Box key={hunkIndex} flexDirection=\"column\">\n\t\t\t\t\t\t\t{/* Hunk header */}\n\t\t\t\t\t\t\t<Text color={theme.focusColor} dimColor>\n\t\t\t\t\t\t\t\t{hunk.header}\n\t\t\t\t\t\t\t</Text>\n\n\t\t\t\t\t\t\t{/* Diff lines */}\n\t\t\t\t\t\t\t{hunk.lines.slice(0, 8).map((line, lineIndex) => (\n\t\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\t\tkey={lineIndex}\n\t\t\t\t\t\t\t\t\tcolor={\n\t\t\t\t\t\t\t\t\t\tline.type === \"added\"\n\t\t\t\t\t\t\t\t\t\t\t? theme.successColor\n\t\t\t\t\t\t\t\t\t\t\t: line.type === \"removed\"\n\t\t\t\t\t\t\t\t\t\t\t\t? theme.errorColor\n\t\t\t\t\t\t\t\t\t\t\t\t: theme.toolText\n\t\t\t\t\t\t\t\t\t}>\n\t\t\t\t\t\t\t\t\t{line.type === \"added\" ? \"+\" : line.type === \"removed\" ? \"-\" : \" \"}\n\t\t\t\t\t\t\t\t\t{line.content}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t))}\n\n\t\t\t\t\t\t\t{hunk.lines.length > 8 && (\n\t\t\t\t\t\t\t\t<Text color={theme.dimText} dimColor>\n\t\t\t\t\t\t\t\t\t... ({hunk.lines.length - 8} more lines in hunk)\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</Box>\n\t\t\t\t\t))}\n\n\t\t\t\t\t{diffHunks.length > 2 && (\n\t\t\t\t\t\t<Text color={theme.dimText} dimColor>\n\t\t\t\t\t\t\t... ({diffHunks.length - 2} more hunks)\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t)}\n\t\t\t\t</Box>\n\t\t\t)}\n\n\t\t\t{/* Fallback to raw diff if no hunks parsed */}\n\t\t\t{diffHunks.length === 0 && previewDiff && (\n\t\t\t\t<Box flexDirection=\"column\" marginLeft={2} marginTop={1}>\n\t\t\t\t\t<Text color={theme.toolText}>{previewDiff}</Text>\n\t\t\t\t\t{truncated && (\n\t\t\t\t\t\t<Text color={theme.dimText} dimColor>\n\t\t\t\t\t\t\t... ({hiddenLines} more lines)\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t)}\n\t\t\t\t</Box>\n\t\t\t)}\n\t\t</Box>\n\t)\n}\n","import { Box, Text } from \"ink\"\n\nimport * as theme from \"../../theme.js\"\nimport { Icon } from \"../Icon.js\"\n\nimport type { ToolRendererProps } from \"./types.js\"\nimport { truncateText, sanitizeContent, getToolDisplayName, getToolIconName } from \"./utils.js\"\n\nconst MAX_RESULT_LINES = 15\n\nexport function SearchTool({ toolData }: ToolRendererProps) {\n\tconst iconName = getToolIconName(toolData.tool)\n\tconst displayName = getToolDisplayName(toolData.tool)\n\tconst regex = toolData.regex || \"\"\n\tconst query = toolData.query || \"\"\n\tconst filePattern = toolData.filePattern || \"\"\n\tconst path = toolData.path || \"\"\n\tconst content = toolData.content ? sanitizeContent(toolData.content) : \"\"\n\n\t// Parse search results if content looks like results.\n\tconst resultLines = content.split(\"\\n\").filter((line) => line.trim())\n\tconst matchCount = resultLines.length\n\n\tconst { text: previewContent, truncated, hiddenLines } = truncateText(content, MAX_RESULT_LINES)\n\n\treturn (\n\t\t<Box flexDirection=\"column\" paddingX={1}>\n\t\t\t{/* Header */}\n\t\t\t<Box>\n\t\t\t\t<Icon name={iconName} color={theme.toolHeader} />\n\t\t\t\t<Text bold color={theme.toolHeader}>\n\t\t\t\t\t{\" \"}\n\t\t\t\t\t{displayName}\n\t\t\t\t</Text>\n\t\t\t\t{matchCount > 0 && <Text color={theme.dimText}> ({matchCount} matches)</Text>}\n\t\t\t</Box>\n\n\t\t\t{/* Search parameters */}\n\t\t\t<Box flexDirection=\"column\" marginLeft={2}>\n\t\t\t\t{/* Regex/Query */}\n\t\t\t\t{regex && (\n\t\t\t\t\t<Box>\n\t\t\t\t\t\t<Text color={theme.dimText}>regex: </Text>\n\t\t\t\t\t\t<Text color={theme.warningColor} bold>\n\t\t\t\t\t\t\t{regex}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t</Box>\n\t\t\t\t)}\n\t\t\t\t{query && (\n\t\t\t\t\t<Box>\n\t\t\t\t\t\t<Text color={theme.dimText}>query: </Text>\n\t\t\t\t\t\t<Text color={theme.warningColor} bold>\n\t\t\t\t\t\t\t{query}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t</Box>\n\t\t\t\t)}\n\n\t\t\t\t{/* Search scope */}\n\t\t\t\t<Box>\n\t\t\t\t\t{path && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<Text color={theme.dimText}>path: </Text>\n\t\t\t\t\t\t\t<Text color={theme.text}>{path}</Text>\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t\t{filePattern && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<Text color={theme.dimText}> pattern: </Text>\n\t\t\t\t\t\t\t<Text color={theme.text}>{filePattern}</Text>\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t</Box>\n\t\t\t</Box>\n\n\t\t\t{/* Results */}\n\t\t\t{previewContent && (\n\t\t\t\t<Box flexDirection=\"column\" marginLeft={2} marginTop={1}>\n\t\t\t\t\t<Text color={theme.dimText} bold>\n\t\t\t\t\t\tResults:\n\t\t\t\t\t</Text>\n\t\t\t\t\t<Box flexDirection=\"column\" marginTop={0}>\n\t\t\t\t\t\t{previewContent.split(\"\\n\").map((line, i) => {\n\t\t\t\t\t\t\t// Try to highlight file:line patterns\n\t\t\t\t\t\t\tconst match = line.match(/^([^:]+):(\\d+):(.*)$/)\n\t\t\t\t\t\t\tif (match) {\n\t\t\t\t\t\t\t\tconst [, file, lineNum, context] = match\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<Box key={i}>\n\t\t\t\t\t\t\t\t\t\t<Text color={theme.focusColor}>{file}</Text>\n\t\t\t\t\t\t\t\t\t\t<Text color={theme.dimText}>:</Text>\n\t\t\t\t\t\t\t\t\t\t<Text color={theme.warningColor}>{lineNum}</Text>\n\t\t\t\t\t\t\t\t\t\t<Text color={theme.dimText}>:</Text>\n\t\t\t\t\t\t\t\t\t\t<Text color={theme.toolText}>{context}</Text>\n\t\t\t\t\t\t\t\t\t</Box>\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<Text key={i} color={theme.toolText}>\n\t\t\t\t\t\t\t\t\t{line}\n\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t})}\n\t\t\t\t\t</Box>\n\t\t\t\t\t{truncated && (\n\t\t\t\t\t\t<Text color={theme.dimText} dimColor>\n\t\t\t\t\t\t\t... ({hiddenLines} more results)\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t)}\n\t\t\t\t</Box>\n\t\t\t)}\n\t\t</Box>\n\t)\n}\n","import { Box, Text } from \"ink\"\n\nimport * as theme from \"../../theme.js\"\nimport { Icon } from \"../Icon.js\"\n\nimport type { ToolRendererProps } from \"./types.js\"\nimport { truncateText, sanitizeContent, getToolIconName } from \"./utils.js\"\n\nconst MAX_OUTPUT_LINES = 10\n\nexport function CommandTool({ toolData }: ToolRendererProps) {\n\tconst iconName = getToolIconName(toolData.tool)\n\tconst command = toolData.command || \"\"\n\tconst output = toolData.output ? sanitizeContent(toolData.output) : \"\"\n\tconst content = toolData.content ? sanitizeContent(toolData.content) : \"\"\n\tconst displayOutput = output || content\n\tconst { text: previewOutput, truncated, hiddenLines } = truncateText(displayOutput, MAX_OUTPUT_LINES)\n\n\treturn (\n\t\t<Box flexDirection=\"column\" paddingX={1} marginBottom={1}>\n\t\t\t<Box>\n\t\t\t\t<Icon name={iconName} color={theme.toolHeader} />\n\t\t\t\t{command && (\n\t\t\t\t\t<Box marginLeft={1}>\n\t\t\t\t\t\t<Text color={theme.successColor}>$ </Text>\n\t\t\t\t\t\t<Text color={theme.text} bold>\n\t\t\t\t\t\t\t{command}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t</Box>\n\t\t\t\t)}\n\t\t\t</Box>\n\t\t\t{previewOutput && (\n\t\t\t\t<Box flexDirection=\"column\">\n\t\t\t\t\t<Box flexDirection=\"column\" borderStyle=\"single\" borderColor={theme.borderColor} paddingX={1}>\n\t\t\t\t\t\t{previewOutput.split(\"\\n\").map((line, i) => (\n\t\t\t\t\t\t\t<Text key={i} color={theme.toolText}>\n\t\t\t\t\t\t\t\t{line}\n\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</Box>\n\t\t\t\t\t{truncated && (\n\t\t\t\t\t\t<Text color={theme.dimText} dimColor>\n\t\t\t\t\t\t\t... ({hiddenLines} more lines)\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t)}\n\t\t\t\t</Box>\n\t\t\t)}\n\t\t</Box>\n\t)\n}\n","import { Box, Text } from \"ink\"\n\nimport * as theme from \"../../theme.js\"\nimport { Icon } from \"../Icon.js\"\n\nimport type { ToolRendererProps } from \"./types.js\"\nimport { getToolIconName } from \"./utils.js\"\n\nexport function ModeTool({ toolData }: ToolRendererProps) {\n\tconst iconName = getToolIconName(toolData.tool)\n\tconst mode = toolData.mode || \"\"\n\tconst isSwitch = toolData.tool.includes(\"switch\") || toolData.tool.includes(\"Switch\")\n\n\treturn (\n\t\t<Box flexDirection=\"row\" gap={1} paddingX={1} marginBottom={1}>\n\t\t\t<Icon name={iconName} color={theme.toolHeader} />\n\t\t\t{isSwitch && mode && (\n\t\t\t\t<Box gap={1}>\n\t\t\t\t\t<Text color={theme.dimText}>Switching to</Text>\n\t\t\t\t\t<Text color={theme.userHeader} bold>\n\t\t\t\t\t\t{mode}\n\t\t\t\t\t</Text>\n\t\t\t\t\t<Text color={theme.dimText}>mode</Text>\n\t\t\t\t</Box>\n\t\t\t)}\n\t\t</Box>\n\t)\n}\n","import { Box, Text } from \"ink\"\n\nimport * as theme from \"../../theme.js\"\n\nimport type { ToolRendererProps } from \"./types.js\"\nimport { truncateText, sanitizeContent } from \"./utils.js\"\n\nconst MAX_CONTENT_LINES = 15\n\nexport function CompletionTool({ toolData }: ToolRendererProps) {\n\tconst result = toolData.result ? sanitizeContent(toolData.result) : \"\"\n\tconst question = toolData.question ? sanitizeContent(toolData.question) : \"\"\n\tconst content = toolData.content ? sanitizeContent(toolData.content) : \"\"\n\tconst isQuestion = toolData.tool.includes(\"question\") || toolData.tool.includes(\"Question\")\n\tconst displayContent = result || question || content\n\tconst { text: previewContent, truncated, hiddenLines } = truncateText(displayContent, MAX_CONTENT_LINES)\n\n\treturn previewContent ? (\n\t\t<Box flexDirection=\"column\" paddingX={1} marginBottom={1}>\n\t\t\t{isQuestion ? (\n\t\t\t\t<Box flexDirection=\"column\">\n\t\t\t\t\t<Text color={theme.text}>{previewContent}</Text>\n\t\t\t\t</Box>\n\t\t\t) : (\n\t\t\t\t<Box flexDirection=\"column\">\n\t\t\t\t\t{previewContent.split(\"\\n\").map((line, i) => (\n\t\t\t\t\t\t<Text key={i} color={theme.toolText}>\n\t\t\t\t\t\t\t{line}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t))}\n\t\t\t\t</Box>\n\t\t\t)}\n\t\t\t{truncated && (\n\t\t\t\t<Text color={theme.dimText} dimColor>\n\t\t\t\t\t... ({hiddenLines} more lines)\n\t\t\t\t</Text>\n\t\t\t)}\n\t\t</Box>\n\t) : null\n}\n","import { Box, Text } from \"ink\"\n\nimport * as theme from \"../../theme.js\"\nimport { Icon } from \"../Icon.js\"\n\nimport type { ToolRendererProps } from \"./types.js\"\nimport { truncateText, sanitizeContent, getToolDisplayName, getToolIconName } from \"./utils.js\"\n\nconst MAX_CONTENT_LINES = 12\n\nexport function GenericTool({ toolData, rawContent }: ToolRendererProps) {\n\tconst iconName = getToolIconName(toolData.tool)\n\tconst displayName = getToolDisplayName(toolData.tool)\n\n\t// Gather all available information\n\tconst path = toolData.path\n\tconst content = toolData.content ? sanitizeContent(toolData.content) : \"\"\n\tconst reason = toolData.reason ? sanitizeContent(toolData.reason) : \"\"\n\tconst mode = toolData.mode\n\n\t// Build display content from available fields\n\tlet displayContent = content || reason || \"\"\n\n\t// If we have no structured content but have raw content, try to parse it\n\tif (!displayContent && rawContent) {\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(rawContent)\n\t\t\t// Extract any content-like fields\n\t\t\tdisplayContent = sanitizeContent(parsed.content || parsed.output || parsed.result || parsed.reason || \"\")\n\t\t} catch {\n\t\t\t// Use raw content as-is if not JSON\n\t\t\tdisplayContent = sanitizeContent(rawContent)\n\t\t}\n\t}\n\n\tconst { text: previewContent, truncated, hiddenLines } = truncateText(displayContent, MAX_CONTENT_LINES)\n\n\treturn (\n\t\t<Box flexDirection=\"column\" paddingX={1}>\n\t\t\t{/* Header */}\n\t\t\t<Box>\n\t\t\t\t<Icon name={iconName} color={theme.toolHeader} />\n\t\t\t\t<Text bold color={theme.toolHeader}>\n\t\t\t\t\t{\" \"}\n\t\t\t\t\t{displayName}\n\t\t\t\t</Text>\n\t\t\t</Box>\n\n\t\t\t{/* Path if present */}\n\t\t\t{path && (\n\t\t\t\t<Box marginLeft={2}>\n\t\t\t\t\t<Text color={theme.dimText}>path: </Text>\n\t\t\t\t\t<Text color={theme.text} bold>\n\t\t\t\t\t\t{path}\n\t\t\t\t\t</Text>\n\t\t\t\t\t{toolData.isOutsideWorkspace && (\n\t\t\t\t\t\t<Text color={theme.warningColor} dimColor>\n\t\t\t\t\t\t\t{\" \"}\n\t\t\t\t\t\t\t⚠ outside workspace\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t)}\n\t\t\t\t\t{toolData.isProtected && <Text color={theme.errorColor}> 🔒 protected</Text>}\n\t\t\t\t</Box>\n\t\t\t)}\n\n\t\t\t{/* Mode if present */}\n\t\t\t{mode && (\n\t\t\t\t<Box marginLeft={2}>\n\t\t\t\t\t<Text color={theme.dimText}>mode: </Text>\n\t\t\t\t\t<Text color={theme.userHeader} bold>\n\t\t\t\t\t\t{mode}\n\t\t\t\t\t</Text>\n\t\t\t\t</Box>\n\t\t\t)}\n\n\t\t\t{/* Content */}\n\t\t\t{previewContent && (\n\t\t\t\t<Box flexDirection=\"column\" marginLeft={2} marginTop={path || mode ? 1 : 0}>\n\t\t\t\t\t{previewContent.split(\"\\n\").map((line, i) => (\n\t\t\t\t\t\t<Text key={i} color={theme.toolText}>\n\t\t\t\t\t\t\t{line}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t))}\n\t\t\t\t\t{truncated && (\n\t\t\t\t\t\t<Text color={theme.dimText} dimColor>\n\t\t\t\t\t\t\t... ({hiddenLines} more lines)\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t)}\n\t\t\t\t</Box>\n\t\t\t)}\n\t\t</Box>\n\t)\n}\n","/**\n * Tool renderer components for CLI TUI\n *\n * Each tool type has a specialized renderer that optimizes the display\n * of its unique data structure.\n */\n\nimport type React from \"react\"\n\nimport type { ToolRendererProps } from \"./types.js\"\nimport { getToolCategory } from \"./types.js\"\n\n// Import all renderers\nimport { FileReadTool } from \"./FileReadTool.js\"\nimport { FileWriteTool } from \"./FileWriteTool.js\"\nimport { SearchTool } from \"./SearchTool.js\"\nimport { CommandTool } from \"./CommandTool.js\"\nimport { ModeTool } from \"./ModeTool.js\"\nimport { CompletionTool } from \"./CompletionTool.js\"\nimport { GenericTool } from \"./GenericTool.js\"\n\n// Re-export types\nexport type { ToolRendererProps } from \"./types.js\"\nexport { getToolCategory } from \"./types.js\"\n\n// Re-export utilities\nexport * from \"./utils.js\"\n\n// Re-export individual components for direct usage\nexport { FileReadTool } from \"./FileReadTool.js\"\nexport { FileWriteTool } from \"./FileWriteTool.js\"\nexport { SearchTool } from \"./SearchTool.js\"\nexport { CommandTool } from \"./CommandTool.js\"\nexport { ModeTool } from \"./ModeTool.js\"\nexport { CompletionTool } from \"./CompletionTool.js\"\nexport { GenericTool } from \"./GenericTool.js\"\n\n/**\n * Map of tool categories to their renderer components\n */\nconst CATEGORY_RENDERERS: Record<string, React.FC<ToolRendererProps>> = {\n\t\"file-read\": FileReadTool,\n\t\"file-write\": FileWriteTool,\n\tsearch: SearchTool,\n\tcommand: CommandTool,\n\tmode: ModeTool,\n\tcompletion: CompletionTool,\n\tother: GenericTool,\n}\n\n/**\n * Get the appropriate renderer component for a tool\n *\n * @param toolName - The tool name/identifier\n * @returns The renderer component for this tool type\n */\nexport function getToolRenderer(toolName: string): React.FC<ToolRendererProps> {\n\tconst category = getToolCategory(toolName)\n\treturn CATEGORY_RENDERERS[category] || GenericTool\n}\n","import { memo } from \"react\"\nimport { Box, Newline, Text } from \"ink\"\n\nimport type { TUIMessage } from \"../types.js\"\nimport * as theme from \"../theme.js\"\n\nimport TodoDisplay from \"./TodoDisplay.js\"\nimport { getToolRenderer } from \"./tools/index.js\"\n\n/**\n * Tool categories for styling\n */\ntype ToolCategory = \"file\" | \"directory\" | \"search\" | \"command\" | \"mode\" | \"completion\" | \"other\"\n\nfunction getToolCategory(toolName: string): ToolCategory {\n\tconst fileTools = [\"readFile\", \"read_file\", \"writeToFile\", \"write_to_file\", \"applyDiff\", \"apply_diff\"]\n\tconst dirTools = [\"listFiles\", \"list_files\", \"listFilesRecursive\", \"listFilesTopLevel\"]\n\tconst searchTools = [\"searchFiles\", \"search_files\"]\n\tconst commandTools = [\"executeCommand\", \"execute_command\"]\n\tconst modeTools = [\"switchMode\", \"switch_mode\", \"newTask\", \"new_task\"]\n\tconst completionTools = [\"attemptCompletion\", \"attempt_completion\", \"askFollowupQuestion\", \"ask_followup_question\"]\n\n\tif (fileTools.includes(toolName)) return \"file\"\n\tif (dirTools.includes(toolName)) return \"directory\"\n\tif (searchTools.includes(toolName)) return \"search\"\n\tif (commandTools.includes(toolName)) return \"command\"\n\tif (modeTools.includes(toolName)) return \"mode\"\n\tif (completionTools.includes(toolName)) return \"completion\"\n\treturn \"other\"\n}\n\n/**\n * Category colors for tool types\n */\nconst CATEGORY_COLORS: Record<ToolCategory, string> = {\n\tfile: theme.toolHeader,\n\tdirectory: theme.toolHeader,\n\tsearch: theme.warningColor,\n\tcommand: theme.successColor,\n\tmode: theme.userHeader,\n\tcompletion: theme.successColor,\n\tother: theme.toolHeader,\n}\n\n/**\n * Sanitize content for terminal display by:\n * - Replacing tab characters with spaces (tabs expand to variable widths in terminals)\n * - Stripping carriage returns that could cause display issues\n */\nfunction sanitizeContent(text: string): string {\n\treturn text.replace(/\\t/g, \" \").replace(/\\r/g, \"\")\n}\n\n/**\n * Truncate content for display, showing line count\n */\nfunction truncateContent(\n\tcontent: string,\n\tmaxLines: number = 10,\n): { text: string; truncated: boolean; totalLines: number } {\n\tconst lines = content.split(\"\\n\")\n\tconst totalLines = lines.length\n\n\tif (lines.length <= maxLines) {\n\t\treturn { text: content, truncated: false, totalLines }\n\t}\n\n\tconst truncatedText = lines.slice(0, maxLines).join(\"\\n\")\n\treturn { text: truncatedText, truncated: true, totalLines }\n}\n\n/**\n * Parse tool info from raw JSON content\n */\nfunction parseToolInfo(content: string): Record<string, unknown> | null {\n\ttry {\n\t\treturn JSON.parse(content)\n\t} catch {\n\t\treturn null\n\t}\n}\n\n/**\n * Render tool display component\n */\nfunction ToolDisplay({ message }: { message: TUIMessage }) {\n\tconst toolName = message.toolName || \"unknown\"\n\tconst category = getToolCategory(toolName)\n\tconst categoryColor = CATEGORY_COLORS[category]\n\n\t// Try to parse the raw content for additional tool info\n\tconst toolInfo = parseToolInfo(message.content || \"\")\n\n\t// Extract key fields from tool info\n\tconst path = toolInfo?.path as string | undefined\n\tconst isOutsideWorkspace = toolInfo?.isOutsideWorkspace as boolean | undefined\n\tconst reason = toolInfo?.reason as string | undefined\n\tconst rawContent = toolInfo?.content as string | undefined\n\n\t// Get the display output (formatted by App.tsx) - already sanitized\n\tconst toolDisplayOutput = message.toolDisplayOutput ? sanitizeContent(message.toolDisplayOutput) : undefined\n\n\t// Sanitize raw content if present\n\tconst sanitizedRawContent = rawContent ? sanitizeContent(rawContent) : undefined\n\n\t// Format the header\n\tconst headerText = message.toolDisplayName || toolName\n\n\treturn (\n\t\t<Box flexDirection=\"column\" paddingX={1}>\n\t\t\t{/* Tool Header */}\n\t\t\t<Text bold color={categoryColor}>\n\t\t\t\t{headerText}\n\t\t\t</Text>\n\n\t\t\t{/* Path indicator for file/directory operations */}\n\t\t\t{path && (\n\t\t\t\t<Box marginLeft={2}>\n\t\t\t\t\t<Text color={theme.dimText}>\n\t\t\t\t\t\t{category === \"file\" ? \"file: \" : category === \"directory\" ? \"dir: \" : \"path: \"}\n\t\t\t\t\t</Text>\n\t\t\t\t\t<Text color={theme.text} bold>\n\t\t\t\t\t\t{path}\n\t\t\t\t\t</Text>\n\t\t\t\t\t{isOutsideWorkspace && (\n\t\t\t\t\t\t<Text color={theme.warningColor} dimColor>\n\t\t\t\t\t\t\t{\" (outside workspace)\"}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t)}\n\t\t\t\t</Box>\n\t\t\t)}\n\n\t\t\t{/* Reason/explanation if present */}\n\t\t\t{reason && (\n\t\t\t\t<Box marginLeft={2}>\n\t\t\t\t\t<Text color={theme.dimText} italic>\n\t\t\t\t\t\t{reason}\n\t\t\t\t\t</Text>\n\t\t\t\t</Box>\n\t\t\t)}\n\n\t\t\t{/* Content display */}\n\t\t\t{(toolDisplayOutput || sanitizedRawContent) && (\n\t\t\t\t<Box flexDirection=\"column\" marginLeft={2} marginTop={0}>\n\t\t\t\t\t{(() => {\n\t\t\t\t\t\tconst contentToDisplay = toolDisplayOutput || sanitizedRawContent || \"\"\n\t\t\t\t\t\tconst { text, truncated, totalLines } = truncateContent(contentToDisplay, 15)\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<Text color={theme.toolText}>{text}</Text>\n\t\t\t\t\t\t\t\t{truncated && (\n\t\t\t\t\t\t\t\t\t<Text color={theme.dimText} dimColor>\n\t\t\t\t\t\t\t\t\t\t{`... (${totalLines - 15} more lines)`}\n\t\t\t\t\t\t\t\t\t</Text>\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\t\t\t\t</Box>\n\t\t\t)}\n\n\t\t\t<Text>\n\t\t\t\t<Newline />\n\t\t\t</Text>\n\t\t</Box>\n\t)\n}\n\ninterface ChatHistoryItemProps {\n\tmessage: TUIMessage\n}\n\nfunction ChatHistoryItem({ message }: ChatHistoryItemProps) {\n\tconst content = sanitizeContent(message.content || \"...\")\n\n\tswitch (message.role) {\n\t\tcase \"user\":\n\t\t\treturn (\n\t\t\t\t<Box flexDirection=\"column\" paddingX={1}>\n\t\t\t\t\t<Text bold color=\"magenta\">\n\t\t\t\t\t\tYou said:\n\t\t\t\t\t</Text>\n\t\t\t\t\t<Text color={theme.userText}>\n\t\t\t\t\t\t{content}\n\t\t\t\t\t\t<Newline />\n\t\t\t\t\t</Text>\n\t\t\t\t</Box>\n\t\t\t)\n\t\tcase \"assistant\":\n\t\t\treturn (\n\t\t\t\t<Box flexDirection=\"column\" paddingX={1}>\n\t\t\t\t\t<Text bold color=\"yellow\">\n\t\t\t\t\t\tRoo said:\n\t\t\t\t\t</Text>\n\t\t\t\t\t<Text color={theme.rooText}>\n\t\t\t\t\t\t{content}\n\t\t\t\t\t\t<Newline />\n\t\t\t\t\t</Text>\n\t\t\t\t</Box>\n\t\t\t)\n\t\tcase \"thinking\":\n\t\t\treturn (\n\t\t\t\t<Box flexDirection=\"column\" paddingX={1}>\n\t\t\t\t\t<Text bold color={theme.thinkingHeader} dimColor>\n\t\t\t\t\t\tRoo is thinking:\n\t\t\t\t\t</Text>\n\t\t\t\t\t<Text color={theme.thinkingText} dimColor>\n\t\t\t\t\t\t{content}\n\t\t\t\t\t\t<Newline />\n\t\t\t\t\t</Text>\n\t\t\t\t</Box>\n\t\t\t)\n\t\tcase \"tool\": {\n\t\t\t// Special rendering for update_todo_list tool - show full TODO list\n\t\t\tif (\n\t\t\t\t(message.toolName === \"update_todo_list\" || message.toolName === \"updateTodoList\") &&\n\t\t\t\tmessage.todos &&\n\t\t\t\tmessage.todos.length > 0\n\t\t\t) {\n\t\t\t\treturn <TodoDisplay todos={message.todos} previousTodos={message.previousTodos} showProgress={true} />\n\t\t\t}\n\n\t\t\t// Use the new structured tool renderers when toolData is available\n\t\t\tif (message.toolData) {\n\t\t\t\tconst ToolRenderer = getToolRenderer(message.toolData.tool)\n\t\t\t\treturn <ToolRenderer toolData={message.toolData} rawContent={message.content} />\n\t\t\t}\n\n\t\t\t// Fallback to generic ToolDisplay for messages without toolData\n\t\t\treturn <ToolDisplay message={message} />\n\t\t}\n\t\tcase \"system\":\n\t\t\t// System messages are typically rendered as Header, not here.\n\t\t\t// But if they appear, show them subtly.\n\t\t\treturn (\n\t\t\t\t<Box flexDirection=\"column\" paddingX={1}>\n\t\t\t\t\t<Text color=\"gray\" dimColor>\n\t\t\t\t\t\t{content}\n\t\t\t\t\t\t<Newline />\n\t\t\t\t\t</Text>\n\t\t\t\t</Box>\n\t\t\t)\n\t\tdefault:\n\t\t\treturn null\n\t}\n}\n\nexport default memo(ChatHistoryItem)\n","{\n\t\"dots\": {\n\t\t\"interval\": 80,\n\t\t\"frames\": [\n\t\t\t\"⠋\",\n\t\t\t\"⠙\",\n\t\t\t\"⠹\",\n\t\t\t\"⠸\",\n\t\t\t\"⠼\",\n\t\t\t\"⠴\",\n\t\t\t\"⠦\",\n\t\t\t\"⠧\",\n\t\t\t\"⠇\",\n\t\t\t\"⠏\"\n\t\t]\n\t},\n\t\"dots2\": {\n\t\t\"interval\": 80,\n\t\t\"frames\": [\n\t\t\t\"⣾\",\n\t\t\t\"⣽\",\n\t\t\t\"⣻\",\n\t\t\t\"⢿\",\n\t\t\t\"⡿\",\n\t\t\t\"⣟\",\n\t\t\t\"⣯\",\n\t\t\t\"⣷\"\n\t\t]\n\t},\n\t\"dots3\": {\n\t\t\"interval\": 80,\n\t\t\"frames\": [\n\t\t\t\"⠋\",\n\t\t\t\"⠙\",\n\t\t\t\"⠚\",\n\t\t\t\"⠞\",\n\t\t\t\"⠖\",\n\t\t\t\"⠦\",\n\t\t\t\"⠴\",\n\t\t\t\"⠲\",\n\t\t\t\"⠳\",\n\t\t\t\"⠓\"\n\t\t]\n\t},\n\t\"dots4\": {\n\t\t\"interval\": 80,\n\t\t\"frames\": [\n\t\t\t\"⠄\",\n\t\t\t\"⠆\",\n\t\t\t\"⠇\",\n\t\t\t\"⠋\",\n\t\t\t\"⠙\",\n\t\t\t\"⠸\",\n\t\t\t\"⠰\",\n\t\t\t\"⠠\",\n\t\t\t\"⠰\",\n\t\t\t\"⠸\",\n\t\t\t\"⠙\",\n\t\t\t\"⠋\",\n\t\t\t\"⠇\",\n\t\t\t\"⠆\"\n\t\t]\n\t},\n\t\"dots5\": {\n\t\t\"interval\": 80,\n\t\t\"frames\": [\n\t\t\t\"⠋\",\n\t\t\t\"⠙\",\n\t\t\t\"⠚\",\n\t\t\t\"⠒\",\n\t\t\t\"⠂\",\n\t\t\t\"⠂\",\n\t\t\t\"⠒\",\n\t\t\t\"⠲\",\n\t\t\t\"⠴\",\n\t\t\t\"⠦\",\n\t\t\t\"⠖\",\n\t\t\t\"⠒\",\n\t\t\t\"⠐\",\n\t\t\t\"⠐\",\n\t\t\t\"⠒\",\n\t\t\t\"⠓\",\n\t\t\t\"⠋\"\n\t\t]\n\t},\n\t\"dots6\": {\n\t\t\"interval\": 80,\n\t\t\"frames\": [\n\t\t\t\"⠁\",\n\t\t\t\"⠉\",\n\t\t\t\"⠙\",\n\t\t\t\"⠚\",\n\t\t\t\"⠒\",\n\t\t\t\"⠂\",\n\t\t\t\"⠂\",\n\t\t\t\"⠒\",\n\t\t\t\"⠲\",\n\t\t\t\"⠴\",\n\t\t\t\"⠤\",\n\t\t\t\"⠄\",\n\t\t\t\"⠄\",\n\t\t\t\"⠤\",\n\t\t\t\"⠴\",\n\t\t\t\"⠲\",\n\t\t\t\"⠒\",\n\t\t\t\"⠂\",\n\t\t\t\"⠂\",\n\t\t\t\"⠒\",\n\t\t\t\"⠚\",\n\t\t\t\"⠙\",\n\t\t\t\"⠉\",\n\t\t\t\"⠁\"\n\t\t]\n\t},\n\t\"dots7\": {\n\t\t\"interval\": 80,\n\t\t\"frames\": [\n\t\t\t\"⠈\",\n\t\t\t\"⠉\",\n\t\t\t\"⠋\",\n\t\t\t\"⠓\",\n\t\t\t\"⠒\",\n\t\t\t\"⠐\",\n\t\t\t\"⠐\",\n\t\t\t\"⠒\",\n\t\t\t\"⠖\",\n\t\t\t\"⠦\",\n\t\t\t\"⠤\",\n\t\t\t\"⠠\",\n\t\t\t\"⠠\",\n\t\t\t\"⠤\",\n\t\t\t\"⠦\",\n\t\t\t\"⠖\",\n\t\t\t\"⠒\",\n\t\t\t\"⠐\",\n\t\t\t\"⠐\",\n\t\t\t\"⠒\",\n\t\t\t\"⠓\",\n\t\t\t\"⠋\",\n\t\t\t\"⠉\",\n\t\t\t\"⠈\"\n\t\t]\n\t},\n\t\"dots8\": {\n\t\t\"interval\": 80,\n\t\t\"frames\": [\n\t\t\t\"⠁\",\n\t\t\t\"⠁\",\n\t\t\t\"⠉\",\n\t\t\t\"⠙\",\n\t\t\t\"⠚\",\n\t\t\t\"⠒\",\n\t\t\t\"⠂\",\n\t\t\t\"⠂\",\n\t\t\t\"⠒\",\n\t\t\t\"⠲\",\n\t\t\t\"⠴\",\n\t\t\t\"⠤\",\n\t\t\t\"⠄\",\n\t\t\t\"⠄\",\n\t\t\t\"⠤\",\n\t\t\t\"⠠\",\n\t\t\t\"⠠\",\n\t\t\t\"⠤\",\n\t\t\t\"⠦\",\n\t\t\t\"⠖\",\n\t\t\t\"⠒\",\n\t\t\t\"⠐\",\n\t\t\t\"⠐\",\n\t\t\t\"⠒\",\n\t\t\t\"⠓\",\n\t\t\t\"⠋\",\n\t\t\t\"⠉\",\n\t\t\t\"⠈\",\n\t\t\t\"⠈\"\n\t\t]\n\t},\n\t\"dots9\": {\n\t\t\"interval\": 80,\n\t\t\"frames\": [\n\t\t\t\"⢹\",\n\t\t\t\"⢺\",\n\t\t\t\"⢼\",\n\t\t\t\"⣸\",\n\t\t\t\"⣇\",\n\t\t\t\"⡧\",\n\t\t\t\"⡗\",\n\t\t\t\"⡏\"\n\t\t]\n\t},\n\t\"dots10\": {\n\t\t\"interval\": 80,\n\t\t\"frames\": [\n\t\t\t\"⢄\",\n\t\t\t\"⢂\",\n\t\t\t\"⢁\",\n\t\t\t\"⡁\",\n\t\t\t\"⡈\",\n\t\t\t\"⡐\",\n\t\t\t\"⡠\"\n\t\t]\n\t},\n\t\"dots11\": {\n\t\t\"interval\": 100,\n\t\t\"frames\": [\n\t\t\t\"⠁\",\n\t\t\t\"⠂\",\n\t\t\t\"⠄\",\n\t\t\t\"⡀\",\n\t\t\t\"⢀\",\n\t\t\t\"⠠\",\n\t\t\t\"⠐\",\n\t\t\t\"⠈\"\n\t\t]\n\t},\n\t\"dots12\": {\n\t\t\"interval\": 80,\n\t\t\"frames\": [\n\t\t\t\"⢀⠀\",\n\t\t\t\"⡀⠀\",\n\t\t\t\"⠄⠀\",\n\t\t\t\"⢂⠀\",\n\t\t\t\"⡂⠀\",\n\t\t\t\"⠅⠀\",\n\t\t\t\"⢃⠀\",\n\t\t\t\"⡃⠀\",\n\t\t\t\"⠍⠀\",\n\t\t\t\"⢋⠀\",\n\t\t\t\"⡋⠀\",\n\t\t\t\"⠍⠁\",\n\t\t\t\"⢋⠁\",\n\t\t\t\"⡋⠁\",\n\t\t\t\"⠍⠉\",\n\t\t\t\"⠋⠉\",\n\t\t\t\"⠋⠉\",\n\t\t\t\"⠉⠙\",\n\t\t\t\"⠉⠙\",\n\t\t\t\"⠉⠩\",\n\t\t\t\"⠈⢙\",\n\t\t\t\"⠈⡙\",\n\t\t\t\"⢈⠩\",\n\t\t\t\"⡀⢙\",\n\t\t\t\"⠄⡙\",\n\t\t\t\"⢂⠩\",\n\t\t\t\"⡂⢘\",\n\t\t\t\"⠅⡘\",\n\t\t\t\"⢃⠨\",\n\t\t\t\"⡃⢐\",\n\t\t\t\"⠍⡐\",\n\t\t\t\"⢋⠠\",\n\t\t\t\"⡋⢀\",\n\t\t\t\"⠍⡁\",\n\t\t\t\"⢋⠁\",\n\t\t\t\"⡋⠁\",\n\t\t\t\"⠍⠉\",\n\t\t\t\"⠋⠉\",\n\t\t\t\"⠋⠉\",\n\t\t\t\"⠉⠙\",\n\t\t\t\"⠉⠙\",\n\t\t\t\"⠉⠩\",\n\t\t\t\"⠈⢙\",\n\t\t\t\"⠈⡙\",\n\t\t\t\"⠈⠩\",\n\t\t\t\"⠀⢙\",\n\t\t\t\"⠀⡙\",\n\t\t\t\"⠀⠩\",\n\t\t\t\"⠀⢘\",\n\t\t\t\"⠀⡘\",\n\t\t\t\"⠀⠨\",\n\t\t\t\"⠀⢐\",\n\t\t\t\"⠀⡐\",\n\t\t\t\"⠀⠠\",\n\t\t\t\"⠀⢀\",\n\t\t\t\"⠀⡀\"\n\t\t]\n\t},\n\t\"dots8Bit\": {\n\t\t\"interval\": 80,\n\t\t\"frames\": [\n\t\t\t\"⠀\",\n\t\t\t\"⠁\",\n\t\t\t\"⠂\",\n\t\t\t\"⠃\",\n\t\t\t\"⠄\",\n\t\t\t\"⠅\",\n\t\t\t\"⠆\",\n\t\t\t\"⠇\",\n\t\t\t\"⡀\",\n\t\t\t\"⡁\",\n\t\t\t\"⡂\",\n\t\t\t\"⡃\",\n\t\t\t\"⡄\",\n\t\t\t\"⡅\",\n\t\t\t\"⡆\",\n\t\t\t\"⡇\",\n\t\t\t\"⠈\",\n\t\t\t\"⠉\",\n\t\t\t\"⠊\",\n\t\t\t\"⠋\",\n\t\t\t\"⠌\",\n\t\t\t\"⠍\",\n\t\t\t\"⠎\",\n\t\t\t\"⠏\",\n\t\t\t\"⡈\",\n\t\t\t\"⡉\",\n\t\t\t\"⡊\",\n\t\t\t\"⡋\",\n\t\t\t\"⡌\",\n\t\t\t\"⡍\",\n\t\t\t\"⡎\",\n\t\t\t\"⡏\",\n\t\t\t\"⠐\",\n\t\t\t\"⠑\",\n\t\t\t\"⠒\",\n\t\t\t\"⠓\",\n\t\t\t\"⠔\",\n\t\t\t\"⠕\",\n\t\t\t\"⠖\",\n\t\t\t\"⠗\",\n\t\t\t\"⡐\",\n\t\t\t\"⡑\",\n\t\t\t\"⡒\",\n\t\t\t\"⡓\",\n\t\t\t\"⡔\",\n\t\t\t\"⡕\",\n\t\t\t\"⡖\",\n\t\t\t\"⡗\",\n\t\t\t\"⠘\",\n\t\t\t\"⠙\",\n\t\t\t\"⠚\",\n\t\t\t\"⠛\",\n\t\t\t\"⠜\",\n\t\t\t\"⠝\",\n\t\t\t\"⠞\",\n\t\t\t\"⠟\",\n\t\t\t\"⡘\",\n\t\t\t\"⡙\",\n\t\t\t\"⡚\",\n\t\t\t\"⡛\",\n\t\t\t\"⡜\",\n\t\t\t\"⡝\",\n\t\t\t\"⡞\",\n\t\t\t\"⡟\",\n\t\t\t\"⠠\",\n\t\t\t\"⠡\",\n\t\t\t\"⠢\",\n\t\t\t\"⠣\",\n\t\t\t\"⠤\",\n\t\t\t\"⠥\",\n\t\t\t\"⠦\",\n\t\t\t\"⠧\",\n\t\t\t\"⡠\",\n\t\t\t\"⡡\",\n\t\t\t\"⡢\",\n\t\t\t\"⡣\",\n\t\t\t\"⡤\",\n\t\t\t\"⡥\",\n\t\t\t\"⡦\",\n\t\t\t\"⡧\",\n\t\t\t\"⠨\",\n\t\t\t\"⠩\",\n\t\t\t\"⠪\",\n\t\t\t\"⠫\",\n\t\t\t\"⠬\",\n\t\t\t\"⠭\",\n\t\t\t\"⠮\",\n\t\t\t\"⠯\",\n\t\t\t\"⡨\",\n\t\t\t\"⡩\",\n\t\t\t\"⡪\",\n\t\t\t\"⡫\",\n\t\t\t\"⡬\",\n\t\t\t\"⡭\",\n\t\t\t\"⡮\",\n\t\t\t\"⡯\",\n\t\t\t\"⠰\",\n\t\t\t\"⠱\",\n\t\t\t\"⠲\",\n\t\t\t\"⠳\",\n\t\t\t\"⠴\",\n\t\t\t\"⠵\",\n\t\t\t\"⠶\",\n\t\t\t\"⠷\",\n\t\t\t\"⡰\",\n\t\t\t\"⡱\",\n\t\t\t\"⡲\",\n\t\t\t\"⡳\",\n\t\t\t\"⡴\",\n\t\t\t\"⡵\",\n\t\t\t\"⡶\",\n\t\t\t\"⡷\",\n\t\t\t\"⠸\",\n\t\t\t\"⠹\",\n\t\t\t\"⠺\",\n\t\t\t\"⠻\",\n\t\t\t\"⠼\",\n\t\t\t\"⠽\",\n\t\t\t\"⠾\",\n\t\t\t\"⠿\",\n\t\t\t\"⡸\",\n\t\t\t\"⡹\",\n\t\t\t\"⡺\",\n\t\t\t\"⡻\",\n\t\t\t\"⡼\",\n\t\t\t\"⡽\",\n\t\t\t\"⡾\",\n\t\t\t\"⡿\",\n\t\t\t\"⢀\",\n\t\t\t\"⢁\",\n\t\t\t\"⢂\",\n\t\t\t\"⢃\",\n\t\t\t\"⢄\",\n\t\t\t\"⢅\",\n\t\t\t\"⢆\",\n\t\t\t\"⢇\",\n\t\t\t\"⣀\",\n\t\t\t\"⣁\",\n\t\t\t\"⣂\",\n\t\t\t\"⣃\",\n\t\t\t\"⣄\",\n\t\t\t\"⣅\",\n\t\t\t\"⣆\",\n\t\t\t\"⣇\",\n\t\t\t\"⢈\",\n\t\t\t\"⢉\",\n\t\t\t\"⢊\",\n\t\t\t\"⢋\",\n\t\t\t\"⢌\",\n\t\t\t\"⢍\",\n\t\t\t\"⢎\",\n\t\t\t\"⢏\",\n\t\t\t\"⣈\",\n\t\t\t\"⣉\",\n\t\t\t\"⣊\",\n\t\t\t\"⣋\",\n\t\t\t\"⣌\",\n\t\t\t\"⣍\",\n\t\t\t\"⣎\",\n\t\t\t\"⣏\",\n\t\t\t\"⢐\",\n\t\t\t\"⢑\",\n\t\t\t\"⢒\",\n\t\t\t\"⢓\",\n\t\t\t\"⢔\",\n\t\t\t\"⢕\",\n\t\t\t\"⢖\",\n\t\t\t\"⢗\",\n\t\t\t\"⣐\",\n\t\t\t\"⣑\",\n\t\t\t\"⣒\",\n\t\t\t\"⣓\",\n\t\t\t\"⣔\",\n\t\t\t\"⣕\",\n\t\t\t\"⣖\",\n\t\t\t\"⣗\",\n\t\t\t\"⢘\",\n\t\t\t\"⢙\",\n\t\t\t\"⢚\",\n\t\t\t\"⢛\",\n\t\t\t\"⢜\",\n\t\t\t\"⢝\",\n\t\t\t\"⢞\",\n\t\t\t\"⢟\",\n\t\t\t\"⣘\",\n\t\t\t\"⣙\",\n\t\t\t\"⣚\",\n\t\t\t\"⣛\",\n\t\t\t\"⣜\",\n\t\t\t\"⣝\",\n\t\t\t\"⣞\",\n\t\t\t\"⣟\",\n\t\t\t\"⢠\",\n\t\t\t\"⢡\",\n\t\t\t\"⢢\",\n\t\t\t\"⢣\",\n\t\t\t\"⢤\",\n\t\t\t\"⢥\",\n\t\t\t\"⢦\",\n\t\t\t\"⢧\",\n\t\t\t\"⣠\",\n\t\t\t\"⣡\",\n\t\t\t\"⣢\",\n\t\t\t\"⣣\",\n\t\t\t\"⣤\",\n\t\t\t\"⣥\",\n\t\t\t\"⣦\",\n\t\t\t\"⣧\",\n\t\t\t\"⢨\",\n\t\t\t\"⢩\",\n\t\t\t\"⢪\",\n\t\t\t\"⢫\",\n\t\t\t\"⢬\",\n\t\t\t\"⢭\",\n\t\t\t\"⢮\",\n\t\t\t\"⢯\",\n\t\t\t\"⣨\",\n\t\t\t\"⣩\",\n\t\t\t\"⣪\",\n\t\t\t\"⣫\",\n\t\t\t\"⣬\",\n\t\t\t\"⣭\",\n\t\t\t\"⣮\",\n\t\t\t\"⣯\",\n\t\t\t\"⢰\",\n\t\t\t\"⢱\",\n\t\t\t\"⢲\",\n\t\t\t\"⢳\",\n\t\t\t\"⢴\",\n\t\t\t\"⢵\",\n\t\t\t\"⢶\",\n\t\t\t\"⢷\",\n\t\t\t\"⣰\",\n\t\t\t\"⣱\",\n\t\t\t\"⣲\",\n\t\t\t\"⣳\",\n\t\t\t\"⣴\",\n\t\t\t\"⣵\",\n\t\t\t\"⣶\",\n\t\t\t\"⣷\",\n\t\t\t\"⢸\",\n\t\t\t\"⢹\",\n\t\t\t\"⢺\",\n\t\t\t\"⢻\",\n\t\t\t\"⢼\",\n\t\t\t\"⢽\",\n\t\t\t\"⢾\",\n\t\t\t\"⢿\",\n\t\t\t\"⣸\",\n\t\t\t\"⣹\",\n\t\t\t\"⣺\",\n\t\t\t\"⣻\",\n\t\t\t\"⣼\",\n\t\t\t\"⣽\",\n\t\t\t\"⣾\",\n\t\t\t\"⣿\"\n\t\t]\n\t},\n\t\"line\": {\n\t\t\"interval\": 130,\n\t\t\"frames\": [\n\t\t\t\"-\",\n\t\t\t\"\\\\\",\n\t\t\t\"|\",\n\t\t\t\"/\"\n\t\t]\n\t},\n\t\"line2\": {\n\t\t\"interval\": 100,\n\t\t\"frames\": [\n\t\t\t\"⠂\",\n\t\t\t\"-\",\n\t\t\t\"–\",\n\t\t\t\"—\",\n\t\t\t\"–\",\n\t\t\t\"-\"\n\t\t]\n\t},\n\t\"pipe\": {\n\t\t\"interval\": 100,\n\t\t\"frames\": [\n\t\t\t\"┤\",\n\t\t\t\"┘\",\n\t\t\t\"┴\",\n\t\t\t\"└\",\n\t\t\t\"├\",\n\t\t\t\"┌\",\n\t\t\t\"┬\",\n\t\t\t\"┐\"\n\t\t]\n\t},\n\t\"simpleDots\": {\n\t\t\"interval\": 400,\n\t\t\"frames\": [\n\t\t\t\". \",\n\t\t\t\".. \",\n\t\t\t\"...\",\n\t\t\t\" \"\n\t\t]\n\t},\n\t\"simpleDotsScrolling\": {\n\t\t\"interval\": 200,\n\t\t\"frames\": [\n\t\t\t\". \",\n\t\t\t\".. \",\n\t\t\t\"...\",\n\t\t\t\" ..\",\n\t\t\t\" .\",\n\t\t\t\" \"\n\t\t]\n\t},\n\t\"star\": {\n\t\t\"interval\": 70,\n\t\t\"frames\": [\n\t\t\t\"✶\",\n\t\t\t\"✸\",\n\t\t\t\"✹\",\n\t\t\t\"✺\",\n\t\t\t\"✹\",\n\t\t\t\"✷\"\n\t\t]\n\t},\n\t\"star2\": {\n\t\t\"interval\": 80,\n\t\t\"frames\": [\n\t\t\t\"+\",\n\t\t\t\"x\",\n\t\t\t\"*\"\n\t\t]\n\t},\n\t\"flip\": {\n\t\t\"interval\": 70,\n\t\t\"frames\": [\n\t\t\t\"_\",\n\t\t\t\"_\",\n\t\t\t\"_\",\n\t\t\t\"-\",\n\t\t\t\"`\",\n\t\t\t\"`\",\n\t\t\t\"'\",\n\t\t\t\"´\",\n\t\t\t\"-\",\n\t\t\t\"_\",\n\t\t\t\"_\",\n\t\t\t\"_\"\n\t\t]\n\t},\n\t\"hamburger\": {\n\t\t\"interval\": 100,\n\t\t\"frames\": [\n\t\t\t\"☱\",\n\t\t\t\"☲\",\n\t\t\t\"☴\"\n\t\t]\n\t},\n\t\"growVertical\": {\n\t\t\"interval\": 120,\n\t\t\"frames\": [\n\t\t\t\"▁\",\n\t\t\t\"▃\",\n\t\t\t\"▄\",\n\t\t\t\"▅\",\n\t\t\t\"▆\",\n\t\t\t\"▇\",\n\t\t\t\"▆\",\n\t\t\t\"▅\",\n\t\t\t\"▄\",\n\t\t\t\"▃\"\n\t\t]\n\t},\n\t\"growHorizontal\": {\n\t\t\"interval\": 120,\n\t\t\"frames\": [\n\t\t\t\"▏\",\n\t\t\t\"▎\",\n\t\t\t\"▍\",\n\t\t\t\"▌\",\n\t\t\t\"▋\",\n\t\t\t\"▊\",\n\t\t\t\"▉\",\n\t\t\t\"▊\",\n\t\t\t\"▋\",\n\t\t\t\"▌\",\n\t\t\t\"▍\",\n\t\t\t\"▎\"\n\t\t]\n\t},\n\t\"balloon\": {\n\t\t\"interval\": 140,\n\t\t\"frames\": [\n\t\t\t\" \",\n\t\t\t\".\",\n\t\t\t\"o\",\n\t\t\t\"O\",\n\t\t\t\"@\",\n\t\t\t\"*\",\n\t\t\t\" \"\n\t\t]\n\t},\n\t\"balloon2\": {\n\t\t\"interval\": 120,\n\t\t\"frames\": [\n\t\t\t\".\",\n\t\t\t\"o\",\n\t\t\t\"O\",\n\t\t\t\"°\",\n\t\t\t\"O\",\n\t\t\t\"o\",\n\t\t\t\".\"\n\t\t]\n\t},\n\t\"noise\": {\n\t\t\"interval\": 100,\n\t\t\"frames\": [\n\t\t\t\"▓\",\n\t\t\t\"▒\",\n\t\t\t\"░\"\n\t\t]\n\t},\n\t\"bounce\": {\n\t\t\"interval\": 120,\n\t\t\"frames\": [\n\t\t\t\"⠁\",\n\t\t\t\"⠂\",\n\t\t\t\"⠄\",\n\t\t\t\"⠂\"\n\t\t]\n\t},\n\t\"boxBounce\": {\n\t\t\"interval\": 120,\n\t\t\"frames\": [\n\t\t\t\"▖\",\n\t\t\t\"▘\",\n\t\t\t\"▝\",\n\t\t\t\"▗\"\n\t\t]\n\t},\n\t\"boxBounce2\": {\n\t\t\"interval\": 100,\n\t\t\"frames\": [\n\t\t\t\"▌\",\n\t\t\t\"▀\",\n\t\t\t\"▐\",\n\t\t\t\"▄\"\n\t\t]\n\t},\n\t\"triangle\": {\n\t\t\"interval\": 50,\n\t\t\"frames\": [\n\t\t\t\"◢\",\n\t\t\t\"◣\",\n\t\t\t\"◤\",\n\t\t\t\"◥\"\n\t\t]\n\t},\n\t\"arc\": {\n\t\t\"interval\": 100,\n\t\t\"frames\": [\n\t\t\t\"◜\",\n\t\t\t\"◠\",\n\t\t\t\"◝\",\n\t\t\t\"◞\",\n\t\t\t\"◡\",\n\t\t\t\"◟\"\n\t\t]\n\t},\n\t\"circle\": {\n\t\t\"interval\": 120,\n\t\t\"frames\": [\n\t\t\t\"◡\",\n\t\t\t\"⊙\",\n\t\t\t\"◠\"\n\t\t]\n\t},\n\t\"squareCorners\": {\n\t\t\"interval\": 180,\n\t\t\"frames\": [\n\t\t\t\"◰\",\n\t\t\t\"◳\",\n\t\t\t\"◲\",\n\t\t\t\"◱\"\n\t\t]\n\t},\n\t\"circleQuarters\": {\n\t\t\"interval\": 120,\n\t\t\"frames\": [\n\t\t\t\"◴\",\n\t\t\t\"◷\",\n\t\t\t\"◶\",\n\t\t\t\"◵\"\n\t\t]\n\t},\n\t\"circleHalves\": {\n\t\t\"interval\": 50,\n\t\t\"frames\": [\n\t\t\t\"◐\",\n\t\t\t\"◓\",\n\t\t\t\"◑\",\n\t\t\t\"◒\"\n\t\t]\n\t},\n\t\"squish\": {\n\t\t\"interval\": 100,\n\t\t\"frames\": [\n\t\t\t\"╫\",\n\t\t\t\"╪\"\n\t\t]\n\t},\n\t\"toggle\": {\n\t\t\"interval\": 250,\n\t\t\"frames\": [\n\t\t\t\"⊶\",\n\t\t\t\"⊷\"\n\t\t]\n\t},\n\t\"toggle2\": {\n\t\t\"interval\": 80,\n\t\t\"frames\": [\n\t\t\t\"▫\",\n\t\t\t\"▪\"\n\t\t]\n\t},\n\t\"toggle3\": {\n\t\t\"interval\": 120,\n\t\t\"frames\": [\n\t\t\t\"□\",\n\t\t\t\"■\"\n\t\t]\n\t},\n\t\"toggle4\": {\n\t\t\"interval\": 100,\n\t\t\"frames\": [\n\t\t\t\"■\",\n\t\t\t\"□\",\n\t\t\t\"▪\",\n\t\t\t\"▫\"\n\t\t]\n\t},\n\t\"toggle5\": {\n\t\t\"interval\": 100,\n\t\t\"frames\": [\n\t\t\t\"▮\",\n\t\t\t\"▯\"\n\t\t]\n\t},\n\t\"toggle6\": {\n\t\t\"interval\": 300,\n\t\t\"frames\": [\n\t\t\t\"ဝ\",\n\t\t\t\"၀\"\n\t\t]\n\t},\n\t\"toggle7\": {\n\t\t\"interval\": 80,\n\t\t\"frames\": [\n\t\t\t\"⦾\",\n\t\t\t\"⦿\"\n\t\t]\n\t},\n\t\"toggle8\": {\n\t\t\"interval\": 100,\n\t\t\"frames\": [\n\t\t\t\"◍\",\n\t\t\t\"◌\"\n\t\t]\n\t},\n\t\"toggle9\": {\n\t\t\"interval\": 100,\n\t\t\"frames\": [\n\t\t\t\"◉\",\n\t\t\t\"◎\"\n\t\t]\n\t},\n\t\"toggle10\": {\n\t\t\"interval\": 100,\n\t\t\"frames\": [\n\t\t\t\"㊂\",\n\t\t\t\"㊀\",\n\t\t\t\"㊁\"\n\t\t]\n\t},\n\t\"toggle11\": {\n\t\t\"interval\": 50,\n\t\t\"frames\": [\n\t\t\t\"⧇\",\n\t\t\t\"⧆\"\n\t\t]\n\t},\n\t\"toggle12\": {\n\t\t\"interval\": 120,\n\t\t\"frames\": [\n\t\t\t\"☗\",\n\t\t\t\"☖\"\n\t\t]\n\t},\n\t\"toggle13\": {\n\t\t\"interval\": 80,\n\t\t\"frames\": [\n\t\t\t\"=\",\n\t\t\t\"*\",\n\t\t\t\"-\"\n\t\t]\n\t},\n\t\"arrow\": {\n\t\t\"interval\": 100,\n\t\t\"frames\": [\n\t\t\t\"←\",\n\t\t\t\"↖\",\n\t\t\t\"↑\",\n\t\t\t\"↗\",\n\t\t\t\"→\",\n\t\t\t\"↘\",\n\t\t\t\"↓\",\n\t\t\t\"↙\"\n\t\t]\n\t},\n\t\"arrow2\": {\n\t\t\"interval\": 80,\n\t\t\"frames\": [\n\t\t\t\"⬆️ \",\n\t\t\t\"↗️ \",\n\t\t\t\"➡️ \",\n\t\t\t\"↘️ \",\n\t\t\t\"⬇️ \",\n\t\t\t\"↙️ \",\n\t\t\t\"⬅️ \",\n\t\t\t\"↖️ \"\n\t\t]\n\t},\n\t\"arrow3\": {\n\t\t\"interval\": 120,\n\t\t\"frames\": [\n\t\t\t\"▹▹▹▹▹\",\n\t\t\t\"▸▹▹▹▹\",\n\t\t\t\"▹▸▹▹▹\",\n\t\t\t\"▹▹▸▹▹\",\n\t\t\t\"▹▹▹▸▹\",\n\t\t\t\"▹▹▹▹▸\"\n\t\t]\n\t},\n\t\"bouncingBar\": {\n\t\t\"interval\": 80,\n\t\t\"frames\": [\n\t\t\t\"[ ]\",\n\t\t\t\"[= ]\",\n\t\t\t\"[== ]\",\n\t\t\t\"[=== ]\",\n\t\t\t\"[ ===]\",\n\t\t\t\"[ ==]\",\n\t\t\t\"[ =]\",\n\t\t\t\"[ ]\",\n\t\t\t\"[ =]\",\n\t\t\t\"[ ==]\",\n\t\t\t\"[ ===]\",\n\t\t\t\"[====]\",\n\t\t\t\"[=== ]\",\n\t\t\t\"[== ]\",\n\t\t\t\"[= ]\"\n\t\t]\n\t},\n\t\"bouncingBall\": {\n\t\t\"interval\": 80,\n\t\t\"frames\": [\n\t\t\t\"( ● )\",\n\t\t\t\"( ● )\",\n\t\t\t\"( ● )\",\n\t\t\t\"( ● )\",\n\t\t\t\"( ●)\",\n\t\t\t\"( ● )\",\n\t\t\t\"( ● )\",\n\t\t\t\"( ● )\",\n\t\t\t\"( ● )\",\n\t\t\t\"(● )\"\n\t\t]\n\t},\n\t\"smiley\": {\n\t\t\"interval\": 200,\n\t\t\"frames\": [\n\t\t\t\"😄 \",\n\t\t\t\"😝 \"\n\t\t]\n\t},\n\t\"monkey\": {\n\t\t\"interval\": 300,\n\t\t\"frames\": [\n\t\t\t\"🙈 \",\n\t\t\t\"🙈 \",\n\t\t\t\"🙉 \",\n\t\t\t\"🙊 \"\n\t\t]\n\t},\n\t\"hearts\": {\n\t\t\"interval\": 100,\n\t\t\"frames\": [\n\t\t\t\"💛 \",\n\t\t\t\"💙 \",\n\t\t\t\"💜 \",\n\t\t\t\"💚 \",\n\t\t\t\"❤️ \"\n\t\t]\n\t},\n\t\"clock\": {\n\t\t\"interval\": 100,\n\t\t\"frames\": [\n\t\t\t\"🕛 \",\n\t\t\t\"🕐 \",\n\t\t\t\"🕑 \",\n\t\t\t\"🕒 \",\n\t\t\t\"🕓 \",\n\t\t\t\"🕔 \",\n\t\t\t\"🕕 \",\n\t\t\t\"🕖 \",\n\t\t\t\"🕗 \",\n\t\t\t\"🕘 \",\n\t\t\t\"🕙 \",\n\t\t\t\"🕚 \"\n\t\t]\n\t},\n\t\"earth\": {\n\t\t\"interval\": 180,\n\t\t\"frames\": [\n\t\t\t\"🌍 \",\n\t\t\t\"🌎 \",\n\t\t\t\"🌏 \"\n\t\t]\n\t},\n\t\"material\": {\n\t\t\"interval\": 17,\n\t\t\"frames\": [\n\t\t\t\"█▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁\",\n\t\t\t\"██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁\",\n\t\t\t\"███▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁\",\n\t\t\t\"████▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁\",\n\t\t\t\"██████▁▁▁▁▁▁▁▁▁▁▁▁▁▁\",\n\t\t\t\"██████▁▁▁▁▁▁▁▁▁▁▁▁▁▁\",\n\t\t\t\"███████▁▁▁▁▁▁▁▁▁▁▁▁▁\",\n\t\t\t\"████████▁▁▁▁▁▁▁▁▁▁▁▁\",\n\t\t\t\"█████████▁▁▁▁▁▁▁▁▁▁▁\",\n\t\t\t\"█████████▁▁▁▁▁▁▁▁▁▁▁\",\n\t\t\t\"██████████▁▁▁▁▁▁▁▁▁▁\",\n\t\t\t\"███████████▁▁▁▁▁▁▁▁▁\",\n\t\t\t\"█████████████▁▁▁▁▁▁▁\",\n\t\t\t\"██████████████▁▁▁▁▁▁\",\n\t\t\t\"██████████████▁▁▁▁▁▁\",\n\t\t\t\"▁██████████████▁▁▁▁▁\",\n\t\t\t\"▁██████████████▁▁▁▁▁\",\n\t\t\t\"▁██████████████▁▁▁▁▁\",\n\t\t\t\"▁▁██████████████▁▁▁▁\",\n\t\t\t\"▁▁▁██████████████▁▁▁\",\n\t\t\t\"▁▁▁▁█████████████▁▁▁\",\n\t\t\t\"▁▁▁▁██████████████▁▁\",\n\t\t\t\"▁▁▁▁██████████████▁▁\",\n\t\t\t\"▁▁▁▁▁██████████████▁\",\n\t\t\t\"▁▁▁▁▁██████████████▁\",\n\t\t\t\"▁▁▁▁▁██████████████▁\",\n\t\t\t\"▁▁▁▁▁▁██████████████\",\n\t\t\t\"▁▁▁▁▁▁██████████████\",\n\t\t\t\"▁▁▁▁▁▁▁█████████████\",\n\t\t\t\"▁▁▁▁▁▁▁█████████████\",\n\t\t\t\"▁▁▁▁▁▁▁▁████████████\",\n\t\t\t\"▁▁▁▁▁▁▁▁████████████\",\n\t\t\t\"▁▁▁▁▁▁▁▁▁███████████\",\n\t\t\t\"▁▁▁▁▁▁▁▁▁███████████\",\n\t\t\t\"▁▁▁▁▁▁▁▁▁▁██████████\",\n\t\t\t\"▁▁▁▁▁▁▁▁▁▁██████████\",\n\t\t\t\"▁▁▁▁▁▁▁▁▁▁▁▁████████\",\n\t\t\t\"▁▁▁▁▁▁▁▁▁▁▁▁▁███████\",\n\t\t\t\"▁▁▁▁▁▁▁▁▁▁▁▁▁▁██████\",\n\t\t\t\"▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████\",\n\t\t\t\"▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████\",\n\t\t\t\"█▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████\",\n\t\t\t\"██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███\",\n\t\t\t\"██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███\",\n\t\t\t\"███▁▁▁▁▁▁▁▁▁▁▁▁▁▁███\",\n\t\t\t\"████▁▁▁▁▁▁▁▁▁▁▁▁▁▁██\",\n\t\t\t\"█████▁▁▁▁▁▁▁▁▁▁▁▁▁▁█\",\n\t\t\t\"█████▁▁▁▁▁▁▁▁▁▁▁▁▁▁█\",\n\t\t\t\"██████▁▁▁▁▁▁▁▁▁▁▁▁▁█\",\n\t\t\t\"████████▁▁▁▁▁▁▁▁▁▁▁▁\",\n\t\t\t\"█████████▁▁▁▁▁▁▁▁▁▁▁\",\n\t\t\t\"█████████▁▁▁▁▁▁▁▁▁▁▁\",\n\t\t\t\"█████████▁▁▁▁▁▁▁▁▁▁▁\",\n\t\t\t\"█████████▁▁▁▁▁▁▁▁▁▁▁\",\n\t\t\t\"███████████▁▁▁▁▁▁▁▁▁\",\n\t\t\t\"████████████▁▁▁▁▁▁▁▁\",\n\t\t\t\"████████████▁▁▁▁▁▁▁▁\",\n\t\t\t\"██████████████▁▁▁▁▁▁\",\n\t\t\t\"██████████████▁▁▁▁▁▁\",\n\t\t\t\"▁██████████████▁▁▁▁▁\",\n\t\t\t\"▁██████████████▁▁▁▁▁\",\n\t\t\t\"▁▁▁█████████████▁▁▁▁\",\n\t\t\t\"▁▁▁▁▁████████████▁▁▁\",\n\t\t\t\"▁▁▁▁▁████████████▁▁▁\",\n\t\t\t\"▁▁▁▁▁▁███████████▁▁▁\",\n\t\t\t\"▁▁▁▁▁▁▁▁█████████▁▁▁\",\n\t\t\t\"▁▁▁▁▁▁▁▁█████████▁▁▁\",\n\t\t\t\"▁▁▁▁▁▁▁▁▁█████████▁▁\",\n\t\t\t\"▁▁▁▁▁▁▁▁▁█████████▁▁\",\n\t\t\t\"▁▁▁▁▁▁▁▁▁▁█████████▁\",\n\t\t\t\"▁▁▁▁▁▁▁▁▁▁▁████████▁\",\n\t\t\t\"▁▁▁▁▁▁▁▁▁▁▁████████▁\",\n\t\t\t\"▁▁▁▁▁▁▁▁▁▁▁▁███████▁\",\n\t\t\t\"▁▁▁▁▁▁▁▁▁▁▁▁███████▁\",\n\t\t\t\"▁▁▁▁▁▁▁▁▁▁▁▁▁███████\",\n\t\t\t\"▁▁▁▁▁▁▁▁▁▁▁▁▁███████\",\n\t\t\t\"▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████\",\n\t\t\t\"▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████\",\n\t\t\t\"▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████\",\n\t\t\t\"▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████\",\n\t\t\t\"▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███\",\n\t\t\t\"▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███\",\n\t\t\t\"▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██\",\n\t\t\t\"▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██\",\n\t\t\t\"▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██\",\n\t\t\t\"▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█\",\n\t\t\t\"▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█\",\n\t\t\t\"▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█\",\n\t\t\t\"▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁\",\n\t\t\t\"▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁\",\n\t\t\t\"▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁\",\n\t\t\t\"▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁\"\n\t\t]\n\t},\n\t\"moon\": {\n\t\t\"interval\": 80,\n\t\t\"frames\": [\n\t\t\t\"🌑 \",\n\t\t\t\"🌒 \",\n\t\t\t\"🌓 \",\n\t\t\t\"🌔 \",\n\t\t\t\"🌕 \",\n\t\t\t\"🌖 \",\n\t\t\t\"🌗 \",\n\t\t\t\"🌘 \"\n\t\t]\n\t},\n\t\"runner\": {\n\t\t\"interval\": 140,\n\t\t\"frames\": [\n\t\t\t\"🚶 \",\n\t\t\t\"🏃 \"\n\t\t]\n\t},\n\t\"pong\": {\n\t\t\"interval\": 80,\n\t\t\"frames\": [\n\t\t\t\"▐⠂ ▌\",\n\t\t\t\"▐⠈ ▌\",\n\t\t\t\"▐ ⠂ ▌\",\n\t\t\t\"▐ ⠠ ▌\",\n\t\t\t\"▐ ⡀ ▌\",\n\t\t\t\"▐ ⠠ ▌\",\n\t\t\t\"▐ ⠂ ▌\",\n\t\t\t\"▐ ⠈ ▌\",\n\t\t\t\"▐ ⠂ ▌\",\n\t\t\t\"▐ ⠠ ▌\",\n\t\t\t\"▐ ⡀ ▌\",\n\t\t\t\"▐ ⠠ ▌\",\n\t\t\t\"▐ ⠂ ▌\",\n\t\t\t\"▐ ⠈ ▌\",\n\t\t\t\"▐ ⠂▌\",\n\t\t\t\"▐ ⠠▌\",\n\t\t\t\"▐ ⡀▌\",\n\t\t\t\"▐ ⠠ ▌\",\n\t\t\t\"▐ ⠂ ▌\",\n\t\t\t\"▐ ⠈ ▌\",\n\t\t\t\"▐ ⠂ ▌\",\n\t\t\t\"▐ ⠠ ▌\",\n\t\t\t\"▐ ⡀ ▌\",\n\t\t\t\"▐ ⠠ ▌\",\n\t\t\t\"▐ ⠂ ▌\",\n\t\t\t\"▐ ⠈ ▌\",\n\t\t\t\"▐ ⠂ ▌\",\n\t\t\t\"▐ ⠠ ▌\",\n\t\t\t\"▐ ⡀ ▌\",\n\t\t\t\"▐⠠ ▌\"\n\t\t]\n\t},\n\t\"shark\": {\n\t\t\"interval\": 120,\n\t\t\"frames\": [\n\t\t\t\"▐|\\\\____________▌\",\n\t\t\t\"▐_|\\\\___________▌\",\n\t\t\t\"▐__|\\\\__________▌\",\n\t\t\t\"▐___|\\\\_________▌\",\n\t\t\t\"▐____|\\\\________▌\",\n\t\t\t\"▐_____|\\\\_______▌\",\n\t\t\t\"▐______|\\\\______▌\",\n\t\t\t\"▐_______|\\\\_____▌\",\n\t\t\t\"▐________|\\\\____▌\",\n\t\t\t\"▐_________|\\\\___▌\",\n\t\t\t\"▐__________|\\\\__▌\",\n\t\t\t\"▐___________|\\\\_▌\",\n\t\t\t\"▐____________|\\\\▌\",\n\t\t\t\"▐____________/|▌\",\n\t\t\t\"▐___________/|_▌\",\n\t\t\t\"▐__________/|__▌\",\n\t\t\t\"▐_________/|___▌\",\n\t\t\t\"▐________/|____▌\",\n\t\t\t\"▐_______/|_____▌\",\n\t\t\t\"▐______/|______▌\",\n\t\t\t\"▐_____/|_______▌\",\n\t\t\t\"▐____/|________▌\",\n\t\t\t\"▐___/|_________▌\",\n\t\t\t\"▐__/|__________▌\",\n\t\t\t\"▐_/|___________▌\",\n\t\t\t\"▐/|____________▌\"\n\t\t]\n\t},\n\t\"dqpb\": {\n\t\t\"interval\": 100,\n\t\t\"frames\": [\n\t\t\t\"d\",\n\t\t\t\"q\",\n\t\t\t\"p\",\n\t\t\t\"b\"\n\t\t]\n\t},\n\t\"weather\": {\n\t\t\"interval\": 100,\n\t\t\"frames\": [\n\t\t\t\"☀️ \",\n\t\t\t\"☀️ \",\n\t\t\t\"☀️ \",\n\t\t\t\"🌤 \",\n\t\t\t\"⛅️ \",\n\t\t\t\"🌥 \",\n\t\t\t\"☁️ \",\n\t\t\t\"🌧 \",\n\t\t\t\"🌨 \",\n\t\t\t\"🌧 \",\n\t\t\t\"🌨 \",\n\t\t\t\"🌧 \",\n\t\t\t\"🌨 \",\n\t\t\t\"⛈ \",\n\t\t\t\"🌨 \",\n\t\t\t\"🌧 \",\n\t\t\t\"🌨 \",\n\t\t\t\"☁️ \",\n\t\t\t\"🌥 \",\n\t\t\t\"⛅️ \",\n\t\t\t\"🌤 \",\n\t\t\t\"☀️ \",\n\t\t\t\"☀️ \"\n\t\t]\n\t},\n\t\"christmas\": {\n\t\t\"interval\": 400,\n\t\t\"frames\": [\n\t\t\t\"🌲\",\n\t\t\t\"🎄\"\n\t\t]\n\t},\n\t\"grenade\": {\n\t\t\"interval\": 80,\n\t\t\"frames\": [\n\t\t\t\"، \",\n\t\t\t\"′ \",\n\t\t\t\" ´ \",\n\t\t\t\" ‾ \",\n\t\t\t\" ⸌\",\n\t\t\t\" ⸊\",\n\t\t\t\" |\",\n\t\t\t\" ⁎\",\n\t\t\t\" ⁕\",\n\t\t\t\" ෴ \",\n\t\t\t\" ⁓\",\n\t\t\t\" \",\n\t\t\t\" \",\n\t\t\t\" \"\n\t\t]\n\t},\n\t\"point\": {\n\t\t\"interval\": 125,\n\t\t\"frames\": [\n\t\t\t\"∙∙∙\",\n\t\t\t\"●∙∙\",\n\t\t\t\"∙●∙\",\n\t\t\t\"∙∙●\",\n\t\t\t\"∙∙∙\"\n\t\t]\n\t},\n\t\"layer\": {\n\t\t\"interval\": 150,\n\t\t\"frames\": [\n\t\t\t\"-\",\n\t\t\t\"=\",\n\t\t\t\"≡\"\n\t\t]\n\t},\n\t\"betaWave\": {\n\t\t\"interval\": 80,\n\t\t\"frames\": [\n\t\t\t\"ρββββββ\",\n\t\t\t\"βρβββββ\",\n\t\t\t\"ββρββββ\",\n\t\t\t\"βββρβββ\",\n\t\t\t\"ββββρββ\",\n\t\t\t\"βββββρβ\",\n\t\t\t\"ββββββρ\"\n\t\t]\n\t},\n\t\"fingerDance\": {\n\t\t\"interval\": 160,\n\t\t\"frames\": [\n\t\t\t\"🤘 \",\n\t\t\t\"🤟 \",\n\t\t\t\"🖖 \",\n\t\t\t\"✋ \",\n\t\t\t\"🤚 \",\n\t\t\t\"👆 \"\n\t\t]\n\t},\n\t\"fistBump\": {\n\t\t\"interval\": 80,\n\t\t\"frames\": [\n\t\t\t\"🤜\\u3000\\u3000\\u3000\\u3000🤛 \",\n\t\t\t\"🤜\\u3000\\u3000\\u3000\\u3000🤛 \",\n\t\t\t\"🤜\\u3000\\u3000\\u3000\\u3000🤛 \",\n\t\t\t\"\\u3000🤜\\u3000\\u3000🤛\\u3000 \",\n\t\t\t\"\\u3000\\u3000🤜🤛\\u3000\\u3000 \",\n\t\t\t\"\\u3000🤜✨🤛\\u3000\\u3000 \",\n\t\t\t\"🤜\\u3000✨\\u3000🤛\\u3000 \"\n\t\t]\n\t},\n\t\"soccerHeader\": {\n\t\t\"interval\": 80,\n\t\t\"frames\": [\n\t\t\t\" 🧑⚽️ 🧑 \",\n\t\t\t\"🧑 ⚽️ 🧑 \",\n\t\t\t\"🧑 ⚽️ 🧑 \",\n\t\t\t\"🧑 ⚽️ 🧑 \",\n\t\t\t\"🧑 ⚽️ 🧑 \",\n\t\t\t\"🧑 ⚽️ 🧑 \",\n\t\t\t\"🧑 ⚽️🧑 \",\n\t\t\t\"🧑 ⚽️ 🧑 \",\n\t\t\t\"🧑 ⚽️ 🧑 \",\n\t\t\t\"🧑 ⚽️ 🧑 \",\n\t\t\t\"🧑 ⚽️ 🧑 \",\n\t\t\t\"🧑 ⚽️ 🧑 \"\n\t\t]\n\t},\n\t\"mindblown\": {\n\t\t\"interval\": 160,\n\t\t\"frames\": [\n\t\t\t\"😐 \",\n\t\t\t\"😐 \",\n\t\t\t\"😮 \",\n\t\t\t\"😮 \",\n\t\t\t\"😦 \",\n\t\t\t\"😦 \",\n\t\t\t\"😧 \",\n\t\t\t\"😧 \",\n\t\t\t\"🤯 \",\n\t\t\t\"💥 \",\n\t\t\t\"✨ \",\n\t\t\t\"\\u3000 \",\n\t\t\t\"\\u3000 \",\n\t\t\t\"\\u3000 \"\n\t\t]\n\t},\n\t\"speaker\": {\n\t\t\"interval\": 160,\n\t\t\"frames\": [\n\t\t\t\"🔈 \",\n\t\t\t\"🔉 \",\n\t\t\t\"🔊 \",\n\t\t\t\"🔉 \"\n\t\t]\n\t},\n\t\"orangePulse\": {\n\t\t\"interval\": 100,\n\t\t\"frames\": [\n\t\t\t\"🔸 \",\n\t\t\t\"🔶 \",\n\t\t\t\"🟠 \",\n\t\t\t\"🟠 \",\n\t\t\t\"🔶 \"\n\t\t]\n\t},\n\t\"bluePulse\": {\n\t\t\"interval\": 100,\n\t\t\"frames\": [\n\t\t\t\"🔹 \",\n\t\t\t\"🔷 \",\n\t\t\t\"🔵 \",\n\t\t\t\"🔵 \",\n\t\t\t\"🔷 \"\n\t\t]\n\t},\n\t\"orangeBluePulse\": {\n\t\t\"interval\": 100,\n\t\t\"frames\": [\n\t\t\t\"🔸 \",\n\t\t\t\"🔶 \",\n\t\t\t\"🟠 \",\n\t\t\t\"🟠 \",\n\t\t\t\"🔶 \",\n\t\t\t\"🔹 \",\n\t\t\t\"🔷 \",\n\t\t\t\"🔵 \",\n\t\t\t\"🔵 \",\n\t\t\t\"🔷 \"\n\t\t]\n\t},\n\t\"timeTravel\": {\n\t\t\"interval\": 100,\n\t\t\"frames\": [\n\t\t\t\"🕛 \",\n\t\t\t\"🕚 \",\n\t\t\t\"🕙 \",\n\t\t\t\"🕘 \",\n\t\t\t\"🕗 \",\n\t\t\t\"🕖 \",\n\t\t\t\"🕕 \",\n\t\t\t\"🕔 \",\n\t\t\t\"🕓 \",\n\t\t\t\"🕒 \",\n\t\t\t\"🕑 \",\n\t\t\t\"🕐 \"\n\t\t]\n\t},\n\t\"aesthetic\": {\n\t\t\"interval\": 80,\n\t\t\"frames\": [\n\t\t\t\"▰▱▱▱▱▱▱\",\n\t\t\t\"▰▰▱▱▱▱▱\",\n\t\t\t\"▰▰▰▱▱▱▱\",\n\t\t\t\"▰▰▰▰▱▱▱\",\n\t\t\t\"▰▰▰▰▰▱▱\",\n\t\t\t\"▰▰▰▰▰▰▱\",\n\t\t\t\"▰▰▰▰▰▰▰\",\n\t\t\t\"▰▱▱▱▱▱▱\"\n\t\t]\n\t}\n}\n","'use strict';\n\nconst spinners = Object.assign({}, require('./spinners.json'));\n\nconst spinnersList = Object.keys(spinners);\n\nObject.defineProperty(spinners, 'random', {\n\tget() {\n\t\tconst randomIndex = Math.floor(Math.random() * spinnersList.length);\n\t\tconst spinnerName = spinnersList[randomIndex];\n\t\treturn spinners[spinnerName];\n\t}\n});\n\nmodule.exports = spinners;\n// TODO: Remove this for the next major release\nmodule.exports.default = spinners;\n","import { Box, Text } from \"ink\"\nimport { useEffect, useState } from \"react\"\nimport spinners from \"cli-spinners\"\n\nconst THINKING_PHRASES = [\n\t\"Thinking\",\n\t\"Pondering\",\n\t\"Contemplating\",\n\t\"Reticulating\",\n\t\"Marinating\",\n\t\"Actualizing\",\n\t\"Crunching\",\n\t\"Untangling\",\n\t\"Summoning\",\n\t\"Conjuring\",\n\t\"Materializing\",\n\t\"Synthesizing\",\n\t\"Assembling\",\n\t\"Percolating\",\n\t\"Brewing\",\n\t\"Manifesting\",\n\t\"Cogitating\",\n]\n\ninterface LoadingTextProps {\n\tchildren?: React.ReactNode\n}\n\nfunction LoadingText({ children }: LoadingTextProps) {\n\tconst [frameIndex, setFrameIndex] = useState(0)\n\tconst spinner = spinners.dots\n\n\tuseEffect(() => {\n\t\tconst interval = setInterval(() => {\n\t\t\tsetFrameIndex((i) => i + 1)\n\t\t}, spinner.interval)\n\t\treturn () => clearInterval(interval)\n\t}, [spinner.interval])\n\n\tconst randomPhrase = THINKING_PHRASES[Math.floor(Math.random() * THINKING_PHRASES.length)]\n\tconst childrenStr = children ? String(children) : \"\"\n\tconst useRandomPhrase = !children || childrenStr === \"Thinking\"\n\tconst label = useRandomPhrase ? `${randomPhrase}...` : `${childrenStr}...`\n\n\tconst frame = spinner.frames[frameIndex % spinner.frames.length]\n\n\treturn (\n\t\t<Box>\n\t\t\t<Text>{frame} </Text>\n\t\t\t<Text>{label}</Text>\n\t\t</Box>\n\t)\n}\n\nexport default LoadingText\n","import { memo } from \"react\"\nimport { Text, Box } from \"ink\"\n\nimport * as theme from \"../theme.js\"\nimport type { Toast, ToastType } from \"../hooks/useToast.js\"\n\ninterface ToastDisplayProps {\n\ttoast: Toast | null\n}\n\nfunction getToastColor(type: ToastType): string {\n\tswitch (type) {\n\t\tcase \"success\":\n\t\t\treturn theme.successColor\n\t\tcase \"warning\":\n\t\t\treturn theme.warningColor\n\t\tcase \"error\":\n\t\t\treturn theme.errorColor\n\t\tcase \"info\":\n\t\tdefault:\n\t\t\treturn theme.focusColor // cyan for info\n\t}\n}\n\nfunction getToastIcon(type: ToastType): string {\n\tswitch (type) {\n\t\tcase \"success\":\n\t\t\treturn \"✓\"\n\t\tcase \"warning\":\n\t\t\treturn \"⚠\"\n\t\tcase \"error\":\n\t\t\treturn \"✗\"\n\t\tcase \"info\":\n\t\tdefault:\n\t\t\treturn \"ℹ\"\n\t}\n}\n\nfunction ToastDisplay({ toast }: ToastDisplayProps) {\n\tif (!toast) {\n\t\treturn null\n\t}\n\n\tconst color = getToastColor(toast.type)\n\tconst icon = getToastIcon(toast.type)\n\n\treturn (\n\t\t<Box>\n\t\t\t<Text color={color}>\n\t\t\t\t{icon} {toast.message}\n\t\t\t</Text>\n\t\t</Box>\n\t)\n}\n\nexport default memo(ToastDisplay)\n","import { Text } from \"ink\"\n\nimport * as theme from \"../theme.js\"\nimport { useTerminalSize } from \"../hooks/TerminalSizeContext.js\"\n\ninterface HorizontalLineProps {\n\tactive?: boolean\n}\n\nexport function HorizontalLine({ active = false }: HorizontalLineProps) {\n\tconst { columns } = useTerminalSize()\n\tconst color = active ? theme.borderColorActive : theme.borderColor\n\treturn <Text color={color}>{\"─\".repeat(columns)}</Text>\n}\n","/**\r\n * MultilineTextInput Component\r\n *\r\n * A multi-line text input for Ink CLI applications.\r\n * Based on ink-multiline-input but simplified for our needs.\r\n *\r\n * Key behaviors:\r\n * - Option+Enter (macOS) / Alt+Enter: Add new line (works reliably)\r\n * - Shift+Enter: Add new line (requires terminal support for kitty keyboard protocol)\r\n * - Enter: Submit\r\n * - Backspace at start of line: Merge with previous line\r\n * - Escape: Clear all lines\r\n * - Arrow keys: Navigate within and between lines\r\n */\r\n\r\nimport { useState, useEffect, useMemo, useCallback, useRef } from \"react\"\r\nimport { Box, Text, useInput, type Key } from \"ink\"\r\n\r\nimport { isGlobalInputSequence } from \"../../lib/utils/input.js\"\r\n\r\nexport interface MultilineTextInputProps {\r\n\t/**\r\n\t * Current value (can contain newlines)\r\n\t */\r\n\tvalue: string\r\n\t/**\r\n\t * Called when the value changes\r\n\t */\r\n\tonChange: (value: string) => void\r\n\t/**\r\n\t * Called when user submits (Enter)\r\n\t */\r\n\tonSubmit?: (value: string) => void\r\n\t/**\r\n\t * Called when user presses Escape\r\n\t */\r\n\tonEscape?: () => void\r\n\t/**\r\n\t * Called when up arrow is pressed while cursor is on the first line\r\n\t * Use this to trigger history navigation\r\n\t */\r\n\tonUpAtFirstLine?: () => void\r\n\t/**\r\n\t * Called when down arrow is pressed while cursor is on the last line\r\n\t * Use this to trigger history navigation\r\n\t */\r\n\tonDownAtLastLine?: () => void\r\n\t/**\r\n\t * Placeholder text when empty\r\n\t */\r\n\tplaceholder?: string\r\n\t/**\r\n\t * Whether the input is active/focused\r\n\t */\r\n\tisActive?: boolean\r\n\t/**\r\n\t * Whether to show the cursor\r\n\t */\r\n\tshowCursor?: boolean\r\n\t/**\r\n\t * Prompt character for the first line\r\n\t */\r\n\tprompt?: string\r\n\t/**\r\n\t * Terminal width in columns - used for proper line wrapping\r\n\t * If not provided, lines won't be wrapped\r\n\t */\r\n\tcolumns?: number\r\n}\r\n\r\n/**\r\n * Normalize line endings to LF (\\n)\r\n */\r\nfunction normalizeLineEndings(text: string): string {\r\n\tif (text == null) return \"\"\r\n\treturn text.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\")\r\n}\r\n\r\n/**\r\n * Calculate line and column position from cursor index\r\n */\r\nfunction getCursorPosition(value: string, cursorIndex: number): { line: number; col: number } {\r\n\tconst lines = value.split(\"\\n\")\r\n\tlet pos = 0\r\n\tfor (let i = 0; i < lines.length; i++) {\r\n\t\tconst line = lines[i]!\r\n\t\tconst lineEnd = pos + line.length\r\n\t\tif (cursorIndex <= lineEnd) {\r\n\t\t\treturn { line: i, col: cursorIndex - pos }\r\n\t\t}\r\n\t\tpos = lineEnd + 1 // +1 for newline\r\n\t}\r\n\t// Cursor at very end\r\n\treturn { line: lines.length - 1, col: (lines[lines.length - 1] || \"\").length }\r\n}\r\n\r\n/**\r\n * Calculate cursor index from line and column position\r\n */\r\nfunction getIndexFromPosition(value: string, line: number, col: number): number {\r\n\tconst lines = value.split(\"\\n\")\r\n\tlet index = 0\r\n\tfor (let i = 0; i < line && i < lines.length; i++) {\r\n\t\tindex += lines[i]!.length + 1 // +1 for newline\r\n\t}\r\n\tconst targetLine = lines[line] || \"\"\r\n\tindex += Math.min(col, targetLine.length)\r\n\treturn index\r\n}\r\n\r\n/**\r\n * Represents a visual row after wrapping a logical line\r\n */\r\ninterface VisualRow {\r\n\ttext: string\r\n\tlogicalLineIndex: number\r\n\tisFirstRowOfLine: boolean\r\n\tstartCol: number // column offset in the logical line\r\n}\r\n\r\n/**\r\n * Wrap a logical line into visual rows based on available width.\r\n * Uses word-boundary wrapping: prefers to break at spaces rather than\r\n * in the middle of words.\r\n */\r\nfunction wrapLine(lineText: string, logicalLineIndex: number, availableWidth: number): VisualRow[] {\r\n\tif (availableWidth <= 0 || lineText.length < availableWidth) {\r\n\t\treturn [\r\n\t\t\t{\r\n\t\t\t\ttext: lineText,\r\n\t\t\t\tlogicalLineIndex,\r\n\t\t\t\tisFirstRowOfLine: true,\r\n\t\t\t\tstartCol: 0,\r\n\t\t\t},\r\n\t\t]\r\n\t}\r\n\r\n\tconst rows: VisualRow[] = []\r\n\tlet remaining = lineText\r\n\tlet startCol = 0\r\n\tlet isFirst = true\r\n\r\n\twhile (remaining.length > 0) {\r\n\t\tif (remaining.length < availableWidth) {\r\n\t\t\t// Remaining text fits in one row\r\n\t\t\trows.push({\r\n\t\t\t\ttext: remaining,\r\n\t\t\t\tlogicalLineIndex,\r\n\t\t\t\tisFirstRowOfLine: isFirst,\r\n\t\t\t\tstartCol,\r\n\t\t\t})\r\n\t\t\tbreak\r\n\t\t}\r\n\r\n\t\t// Find a good break point - prefer breaking at a space\r\n\t\tlet breakPoint = availableWidth\r\n\r\n\t\t// Look backwards from availableWidth for a space\r\n\t\tconst searchStart = Math.min(availableWidth, remaining.length)\r\n\t\tlet spaceIndex = -1\r\n\t\tfor (let i = searchStart - 1; i >= 0; i--) {\r\n\t\t\tif (remaining[i] === \" \") {\r\n\t\t\t\tspaceIndex = i\r\n\t\t\t\tbreak\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (spaceIndex > 0) {\r\n\t\t\t// Found a space - break after it (include the space in this row)\r\n\t\t\tbreakPoint = spaceIndex + 1\r\n\t\t}\r\n\t\t// else: no space found, break at availableWidth (mid-word break as fallback)\r\n\r\n\t\tconst chunk = remaining.slice(0, breakPoint)\r\n\t\trows.push({\r\n\t\t\ttext: chunk,\r\n\t\t\tlogicalLineIndex,\r\n\t\t\tisFirstRowOfLine: isFirst,\r\n\t\t\tstartCol,\r\n\t\t})\r\n\r\n\t\tremaining = remaining.slice(breakPoint)\r\n\t\tstartCol += breakPoint\r\n\t\tisFirst = false\r\n\t}\r\n\r\n\treturn rows\r\n}\r\n\r\nexport function MultilineTextInput({\r\n\tvalue,\r\n\tonChange,\r\n\tonSubmit,\r\n\tonEscape,\r\n\tonUpAtFirstLine,\r\n\tonDownAtLastLine,\r\n\tplaceholder = \"\",\r\n\tisActive = true,\r\n\tshowCursor = true,\r\n\tprompt = \"> \",\r\n\tcolumns,\r\n}: MultilineTextInputProps) {\r\n\tconst [cursorIndex, setCursorIndex] = useState(value.length)\r\n\r\n\t// Use refs to track the latest values for use in the useInput callback.\r\n\t// This prevents stale closure issues when multiple keystrokes arrive\r\n\t// faster than React can re-render.\r\n\tconst valueRef = useRef(value)\r\n\tconst cursorIndexRef = useRef(cursorIndex)\r\n\r\n\t// Track the previous value prop to detect actual changes from the parent\r\n\tconst prevValuePropRef = useRef(value)\r\n\r\n\t// Only sync valueRef when the value prop actually changes from the parent.\r\n\t// This prevents overwriting our optimistic updates during re-renders\r\n\t// triggered by internal state changes (like setCursorIndex) before the\r\n\t// parent has processed our onChange call.\r\n\tif (value !== prevValuePropRef.current) {\r\n\t\tvalueRef.current = value\r\n\t\tprevValuePropRef.current = value\r\n\t}\r\n\t// cursorIndex is internal state, safe to sync on every render\r\n\tcursorIndexRef.current = cursorIndex\r\n\r\n\t// Clamp cursor if value changes externally\r\n\tuseEffect(() => {\r\n\t\tif (cursorIndex > value.length) {\r\n\t\t\tsetCursorIndex(value.length)\r\n\t\t}\r\n\t}, [value, cursorIndex])\r\n\r\n\t// Handle keyboard input\r\n\tuseInput(\r\n\t\t(input: string, key: Key) => {\r\n\t\t\t// Read from refs to get the latest values, not stale closure captures\r\n\t\t\tconst currentValue = valueRef.current\r\n\t\t\tconst currentCursorIndex = cursorIndexRef.current\r\n\r\n\t\t\t// Escape: clear all\r\n\t\t\tif (key.escape) {\r\n\t\t\t\tonEscape?.()\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\t// Ignore inputs that are handled at the App level (global shortcuts)\r\n\t\t\t// This includes Ctrl+C (exit), Ctrl+M (mode toggle), etc.\r\n\t\t\tif (isGlobalInputSequence(input, key)) {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\t// Option+Enter (macOS) / Alt+Enter / Shift+Enter: add new line\r\n\t\t\t// When Option/Alt is held, the terminal sends \\r but key.return is false.\r\n\t\t\t// This allows us to distinguish it from a regular Enter.\r\n\t\t\t// Also support various terminal encodings for Shift+Enter.\r\n\t\t\tconst isModifiedEnter =\r\n\t\t\t\t(input === \"\\r\" && !key.return) || // Option+Enter on macOS sends \\r but key.return=false\r\n\t\t\t\t(key.return && key.shift) || // Shift+Enter if terminal reports modifiers\r\n\t\t\t\tinput === \"\\x1b[13;2u\" || // CSI u encoding for Shift+Enter\r\n\t\t\t\tinput === \"\\x1b[27;2;13~\" || // xterm modifyOtherKeys encoding for Shift+Enter\r\n\t\t\t\tinput === \"\\x1b\\r\" || // Some terminals send ESC+CR for Shift+Enter\r\n\t\t\t\tinput === \"\\x1bOM\" || // Some terminals\r\n\t\t\t\t(input.startsWith(\"\\x1b[\") && input.includes(\";2\") && input.endsWith(\"u\")) // General CSI u with shift modifier\r\n\r\n\t\t\tif (isModifiedEnter) {\r\n\t\t\t\tconst newValue =\r\n\t\t\t\t\tcurrentValue.slice(0, currentCursorIndex) + \"\\n\" + currentValue.slice(currentCursorIndex)\r\n\t\t\t\tconst newCursorIndex = currentCursorIndex + 1\r\n\t\t\t\t// Update refs immediately for next keystroke\r\n\t\t\t\tvalueRef.current = newValue\r\n\t\t\t\tcursorIndexRef.current = newCursorIndex\r\n\t\t\t\tonChange(newValue)\r\n\t\t\t\tsetCursorIndex(newCursorIndex)\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\t// Enter: submit\r\n\t\t\tif (key.return) {\r\n\t\t\t\tonSubmit?.(currentValue)\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\t// Tab: ignore for now\r\n\t\t\tif (key.tab) {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\t// Arrow up: move cursor up one line, or trigger history if on first line\r\n\t\t\tif (key.upArrow) {\r\n\t\t\t\tif (!showCursor) return\r\n\t\t\t\tconst lines = currentValue.split(\"\\n\")\r\n\t\t\t\tconst { line, col } = getCursorPosition(currentValue, currentCursorIndex)\r\n\r\n\t\t\t\tif (line > 0) {\r\n\t\t\t\t\t// Move to previous line\r\n\t\t\t\t\tconst targetLine = lines[line - 1]!\r\n\t\t\t\t\tconst newCol = Math.min(col, targetLine.length)\r\n\t\t\t\t\tconst newCursorIndex = getIndexFromPosition(currentValue, line - 1, newCol)\r\n\t\t\t\t\tcursorIndexRef.current = newCursorIndex\r\n\t\t\t\t\tsetCursorIndex(newCursorIndex)\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// On first line - trigger history navigation callback\r\n\t\t\t\t\tonUpAtFirstLine?.()\r\n\t\t\t\t}\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\t// Arrow down: move cursor down one line, or trigger history if on last line\r\n\t\t\tif (key.downArrow) {\r\n\t\t\t\tif (!showCursor) return\r\n\t\t\t\tconst lines = currentValue.split(\"\\n\")\r\n\t\t\t\tconst { line, col } = getCursorPosition(currentValue, currentCursorIndex)\r\n\r\n\t\t\t\tif (line < lines.length - 1) {\r\n\t\t\t\t\t// Move to next line\r\n\t\t\t\t\tconst targetLine = lines[line + 1]!\r\n\t\t\t\t\tconst newCol = Math.min(col, targetLine.length)\r\n\t\t\t\t\tconst newCursorIndex = getIndexFromPosition(currentValue, line + 1, newCol)\r\n\t\t\t\t\tcursorIndexRef.current = newCursorIndex\r\n\t\t\t\t\tsetCursorIndex(newCursorIndex)\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// On last line - trigger history navigation callback\r\n\t\t\t\t\tonDownAtLastLine?.()\r\n\t\t\t\t}\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\t// Arrow left: move cursor left\r\n\t\t\tif (key.leftArrow) {\r\n\t\t\t\tif (!showCursor) return\r\n\t\t\t\tconst newCursorIndex = Math.max(0, currentCursorIndex - 1)\r\n\t\t\t\tcursorIndexRef.current = newCursorIndex\r\n\t\t\t\tsetCursorIndex(newCursorIndex)\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\t// Arrow right: move cursor right\r\n\t\t\tif (key.rightArrow) {\r\n\t\t\t\tif (!showCursor) return\r\n\t\t\t\tconst newCursorIndex = Math.min(currentValue.length, currentCursorIndex + 1)\r\n\t\t\t\tcursorIndexRef.current = newCursorIndex\r\n\t\t\t\tsetCursorIndex(newCursorIndex)\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\t// Backspace/Delete\r\n\t\t\tif (key.backspace || key.delete) {\r\n\t\t\t\tif (currentCursorIndex > 0) {\r\n\t\t\t\t\tconst newValue =\r\n\t\t\t\t\t\tcurrentValue.slice(0, currentCursorIndex - 1) + currentValue.slice(currentCursorIndex)\r\n\t\t\t\t\tconst newCursorIndex = currentCursorIndex - 1\r\n\t\t\t\t\t// Update refs immediately for next keystroke\r\n\t\t\t\t\tvalueRef.current = newValue\r\n\t\t\t\t\tcursorIndexRef.current = newCursorIndex\r\n\t\t\t\t\tonChange(newValue)\r\n\t\t\t\t\tsetCursorIndex(newCursorIndex)\r\n\t\t\t\t}\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\t// Normal character input\r\n\t\t\tif (input) {\r\n\t\t\t\tconst normalized = normalizeLineEndings(input)\r\n\t\t\t\tconst newValue =\r\n\t\t\t\t\tcurrentValue.slice(0, currentCursorIndex) + normalized + currentValue.slice(currentCursorIndex)\r\n\t\t\t\tconst newCursorIndex = currentCursorIndex + normalized.length\r\n\t\t\t\t// Update refs immediately for next keystroke\r\n\t\t\t\tvalueRef.current = newValue\r\n\t\t\t\tcursorIndexRef.current = newCursorIndex\r\n\t\t\t\tonChange(newValue)\r\n\t\t\t\tsetCursorIndex(newCursorIndex)\r\n\t\t\t}\r\n\t\t},\r\n\t\t{ isActive },\r\n\t)\r\n\r\n\t// Split value into lines for rendering\r\n\tconst lines = useMemo(() => {\r\n\t\tif (!value && !isActive) {\r\n\t\t\treturn [placeholder]\r\n\t\t}\r\n\t\tif (!value) {\r\n\t\t\treturn [\"\"]\r\n\t\t}\r\n\t\treturn value.split(\"\\n\")\r\n\t}, [value, placeholder, isActive])\r\n\r\n\t// Determine which line and column the cursor is on\r\n\tconst cursorPosition = useMemo(() => {\r\n\t\tif (!showCursor || !isActive) return null\r\n\t\treturn getCursorPosition(value, cursorIndex)\r\n\t}, [value, cursorIndex, showCursor, isActive])\r\n\r\n\t// Calculate visual rows with wrapping\r\n\tconst visualRows = useMemo(() => {\r\n\t\tconst rows: VisualRow[] = []\r\n\t\tconst promptLen = prompt.length\r\n\r\n\t\tfor (let i = 0; i < lines.length; i++) {\r\n\t\t\tconst lineText = lines[i]!\r\n\t\t\t// All rows use the same prefix width (prompt length) for consistent alignment\r\n\t\t\tconst prefixLen = promptLen\r\n\t\t\t// Calculate available width for text (terminal width minus prefix)\r\n\t\t\t// Use a large number if columns is not provided\r\n\t\t\tconst availableWidth = columns ? Math.max(1, columns - prefixLen) : 10000\r\n\r\n\t\t\tconst lineRows = wrapLine(lineText, i, availableWidth)\r\n\t\t\trows.push(...lineRows)\r\n\t\t}\r\n\r\n\t\treturn rows\r\n\t}, [lines, columns, prompt.length])\r\n\r\n\t// Render a visual row with optional cursor\r\n\t// Uses a two-column flex layout to ensure all text is vertically aligned:\r\n\t// - Column 1: Fixed width for the prompt (only shown on first row)\r\n\t// - Column 2: Text content\r\n\tconst renderVisualRow = useCallback(\r\n\t\t(row: VisualRow, rowIndex: number) => {\r\n\t\t\tconst isPlaceholder = !value && !isActive && row.logicalLineIndex === 0\r\n\t\t\tconst promptWidth = prompt.length\r\n\t\t\t// Only show the prompt on the very first visual row (first row of first line)\r\n\t\t\tconst showPrompt = row.logicalLineIndex === 0 && row.isFirstRowOfLine\r\n\r\n\t\t\t// Check if cursor is on this visual row\r\n\t\t\tlet hasCursor = false\r\n\t\t\tlet cursorColInRow = -1\r\n\r\n\t\t\tif (cursorPosition && cursorPosition.line === row.logicalLineIndex && isActive) {\r\n\t\t\t\tconst cursorCol = cursorPosition.col\r\n\t\t\t\t// Check if cursor falls within this visual row's range\r\n\t\t\t\tif (cursorCol >= row.startCol && cursorCol < row.startCol + row.text.length) {\r\n\t\t\t\t\thasCursor = true\r\n\t\t\t\t\tcursorColInRow = cursorCol - row.startCol\r\n\t\t\t\t}\r\n\t\t\t\t// Cursor at the end of this row (for the last row of a line)\r\n\t\t\t\telse if (cursorCol === row.startCol + row.text.length) {\r\n\t\t\t\t\t// Check if this is the last visual row for this logical line\r\n\t\t\t\t\tconst nextRow = visualRows[rowIndex + 1]\r\n\t\t\t\t\tif (!nextRow || nextRow.logicalLineIndex !== row.logicalLineIndex) {\r\n\t\t\t\t\t\thasCursor = true\r\n\t\t\t\t\t\tcursorColInRow = row.text.length\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (hasCursor) {\r\n\t\t\t\tconst beforeCursor = row.text.slice(0, cursorColInRow)\r\n\t\t\t\tconst cursorAtEnd = cursorColInRow >= row.text.length\r\n\t\t\t\tconst cursorChar = cursorAtEnd ? \" \" : row.text[cursorColInRow]!\r\n\t\t\t\tconst afterCursor = cursorAtEnd ? \"\" : row.text.slice(cursorColInRow + 1)\r\n\r\n\t\t\t\t// Check if adding cursor space at end would overflow the line width.\r\n\t\t\t\t// When cursor is at the end of a max-width row, rendering an extra space\r\n\t\t\t\t// would push the content beyond the terminal width, causing visual shift.\r\n\t\t\t\tconst wouldOverflow =\r\n\t\t\t\t\tcolumns !== undefined && cursorAtEnd && promptWidth + row.text.length + 1 > columns\r\n\r\n\t\t\t\tif (wouldOverflow) {\r\n\t\t\t\t\t// Don't add extra space - cursor will appear at start of next row when text wraps\r\n\t\t\t\t\treturn (\r\n\t\t\t\t\t\t<Box key={rowIndex} flexDirection=\"row\">\r\n\t\t\t\t\t\t\t<Box width={promptWidth}>{showPrompt && <Text>{prompt}</Text>}</Box>\r\n\t\t\t\t\t\t\t<Text>{row.text}</Text>\r\n\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t)\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn (\r\n\t\t\t\t\t<Box key={rowIndex} flexDirection=\"row\">\r\n\t\t\t\t\t\t<Box width={promptWidth}>{showPrompt && <Text>{prompt}</Text>}</Box>\r\n\t\t\t\t\t\t<Text>{beforeCursor}</Text>\r\n\t\t\t\t\t\t<Text inverse>{cursorChar}</Text>\r\n\t\t\t\t\t\t<Text>{afterCursor}</Text>\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t)\r\n\t\t\t}\r\n\r\n\t\t\t// For rows without cursor, use a space for empty text to ensure the row has height\r\n\t\t\t// This fixes the issue where empty newlines don't expand the component height\r\n\t\t\tconst displayText = row.text.length === 0 ? \" \" : row.text\r\n\r\n\t\t\treturn (\r\n\t\t\t\t<Box key={rowIndex} flexDirection=\"row\">\r\n\t\t\t\t\t<Box width={promptWidth}>{showPrompt && <Text>{prompt}</Text>}</Box>\r\n\t\t\t\t\t<Text dimColor={isPlaceholder}>{displayText}</Text>\r\n\t\t\t\t</Box>\r\n\t\t\t)\r\n\t\t},\r\n\t\t[prompt, cursorPosition, value, isActive, visualRows, columns],\r\n\t)\r\n\r\n\treturn <Box flexDirection=\"column\">{visualRows.map((row, index) => renderVisualRow(row, index))}</Box>\r\n}\r\n","import { useState, useCallback, useRef, useEffect } from \"react\"\n\nimport type {\n\tAutocompleteItem,\n\tAutocompleteTrigger,\n\tAutocompletePickerState,\n\tAutocompletePickerActions,\n\tTriggerDetectionResult,\n} from \"./types.js\"\n\nconst DEFAULT_DEBOUNCE_MS = 150\n\n/**\n * Hook that manages autocomplete picker state and logic.\n *\n * This hook supports two types of triggers:\n * 1. **Sync triggers** (e.g., slash commands, modes): `search()` returns results directly\n * 2. **Async triggers** (e.g., file search): `search()` triggers an API call and returns `[]`,\n * then `forceRefresh()` is called when external data arrives\n *\n * For async triggers (those with `refreshResults` defined), the hook preserves existing\n * results during the loading state to prevent UI flickering.\n *\n * @template T - The type of autocomplete items\n * @param triggers - Array of autocomplete triggers to check\n * @returns Picker state and actions\n */\nexport function useAutocompletePicker<T extends AutocompleteItem>(\n\ttriggers: AutocompleteTrigger<T>[],\n): [AutocompletePickerState<T>, AutocompletePickerActions<T>] {\n\tconst [state, setState] = useState<AutocompletePickerState<T>>({\n\t\tactiveTrigger: null,\n\t\tresults: [],\n\t\tselectedIndex: 0,\n\t\tisOpen: false,\n\t\tisLoading: false,\n\t\ttriggerInfo: null,\n\t})\n\n\t// Debounce timer refs for each trigger\n\tconst debounceTimersRef = useRef<Map<string, NodeJS.Timeout>>(new Map())\n\tconst lastQueriesRef = useRef<Map<string, string>>(new Map())\n\n\t// Cleanup debounce timers on unmount\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tdebounceTimersRef.current.forEach((timer) => clearTimeout(timer))\n\t\t}\n\t}, [])\n\n\t/**\n\t * Get the last line from the input value\n\t */\n\tconst getLastLine = useCallback((value: string): string => {\n\t\tconst lines = value.split(\"\\n\")\n\t\treturn lines[lines.length - 1] || \"\"\n\t}, [])\n\n\t/**\n\t * Get the input value with the trigger character removed.\n\t * Used when a trigger has consumeTrigger: true.\n\t */\n\tconst getConsumedValue = useCallback((value: string, lastLine: string, triggerIndex: number): string => {\n\t\tconst lines = value.split(\"\\n\")\n\t\tconst lastLineIndex = lines.length - 1\n\t\t// Remove the trigger character from the last line\n\t\tconst newLastLine = lastLine.slice(0, triggerIndex) + lastLine.slice(triggerIndex + 1)\n\t\tlines[lastLineIndex] = newLastLine\n\t\treturn lines.join(\"\\n\")\n\t}, [])\n\n\t/**\n\t * Handle input value changes - detects triggers and initiates search.\n\t * Returns an object indicating if the input should be modified (for consumeTrigger).\n\t */\n\tconst handleInputChange = useCallback(\n\t\t(value: string, lineText?: string): { consumedValue?: string } => {\n\t\t\tconst lastLine = lineText ?? getLastLine(value)\n\n\t\t\t// Check each trigger for activation\n\t\t\tlet foundTrigger: AutocompleteTrigger<T> | null = null\n\t\t\tlet foundTriggerInfo: TriggerDetectionResult | null = null\n\n\t\t\tfor (const trigger of triggers) {\n\t\t\t\tconst detection = trigger.detectTrigger(lastLine)\n\t\t\t\tif (detection) {\n\t\t\t\t\tfoundTrigger = trigger\n\t\t\t\t\tfoundTriggerInfo = detection\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// No trigger found - close picker\n\t\t\tif (!foundTrigger || !foundTriggerInfo) {\n\t\t\t\tif (state.isOpen) {\n\t\t\t\t\tsetState((prev) => ({\n\t\t\t\t\t\t...prev,\n\t\t\t\t\t\tactiveTrigger: null,\n\t\t\t\t\t\tresults: [],\n\t\t\t\t\t\tselectedIndex: 0,\n\t\t\t\t\t\tisOpen: false,\n\t\t\t\t\t\tisLoading: false,\n\t\t\t\t\t\ttriggerInfo: null,\n\t\t\t\t\t}))\n\t\t\t\t}\n\t\t\t\treturn {}\n\t\t\t}\n\n\t\t\tconst { query } = foundTriggerInfo\n\t\t\tconst debounceMs = foundTrigger.debounceMs ?? DEFAULT_DEBOUNCE_MS\n\n\t\t\t// Clear existing debounce timer for this trigger\n\t\t\tconst existingTimer = debounceTimersRef.current.get(foundTrigger.id)\n\t\t\tif (existingTimer) {\n\t\t\t\tclearTimeout(existingTimer)\n\t\t\t}\n\n\t\t\t// Check if query has changed\n\t\t\tconst lastQuery = lastQueriesRef.current.get(foundTrigger.id)\n\n\t\t\tif (query === lastQuery && state.isOpen && state.activeTrigger?.id === foundTrigger.id) {\n\t\t\t\t// Same query, same trigger - no need to search again\n\t\t\t\t// Still return consumed value if trigger consumes input\n\t\t\t\tif (foundTrigger.consumeTrigger) {\n\t\t\t\t\treturn { consumedValue: getConsumedValue(value, lastLine, foundTriggerInfo.triggerIndex) }\n\t\t\t\t}\n\t\t\t\treturn {}\n\t\t\t}\n\n\t\t\t// Determine if this is an async trigger (has refreshResults for external data)\n\t\t\tconst isAsyncTrigger = !!foundTrigger.refreshResults\n\n\t\t\t// For async triggers, immediately get cached results filtered by new query\n\t\t\t// This prevents the \"empty state flash\" when reopening picker with different query\n\t\t\tlet initialResults: T[] = []\n\n\t\t\tif (isAsyncTrigger && foundTrigger.refreshResults) {\n\t\t\t\ttry {\n\t\t\t\t\tconst cached = foundTrigger.refreshResults(query)\n\t\t\t\t\tif (!(cached instanceof Promise)) {\n\t\t\t\t\t\tinitialResults = cached\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore errors, will use empty array\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set loading state immediately and open picker\n\t\t\t// For async triggers with cached results, show them immediately to prevent flickering\n\t\t\t// Only set isLoading if we have no cached results to show\n\t\t\tconst hasResults = initialResults.length > 0\n\n\t\t\tsetState((prev) => {\n\t\t\t\treturn {\n\t\t\t\t\t...prev,\n\t\t\t\t\tactiveTrigger: foundTrigger,\n\t\t\t\t\t// Only show loading state if we have no results to display\n\t\t\t\t\tisLoading: !hasResults,\n\t\t\t\t\tisOpen: true,\n\t\t\t\t\ttriggerInfo: foundTriggerInfo,\n\t\t\t\t\t// Use initial cached results if available, otherwise preserve previous\n\t\t\t\t\tresults: initialResults.length > 0 ? initialResults : prev.results,\n\t\t\t\t\tselectedIndex: initialResults.length > 0 ? 0 : prev.selectedIndex,\n\t\t\t\t}\n\t\t\t})\n\n\t\t\t// Debounce the search\n\t\t\tconst timer = setTimeout(async () => {\n\t\t\t\tlastQueriesRef.current.set(foundTrigger.id, query)\n\n\t\t\t\ttry {\n\t\t\t\t\tconst results = await foundTrigger.search(query)\n\n\t\t\t\t\tsetState((prev) => {\n\t\t\t\t\t\t// Only update if this is still the active trigger\n\t\t\t\t\t\tif (prev.activeTrigger?.id !== foundTrigger.id) {\n\t\t\t\t\t\t\treturn prev\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// For async triggers (those with refreshResults like file search):\n\t\t\t\t\t\t// - NEVER update results from search() - it always returns []\n\t\t\t\t\t\t// - Keep existing results and stay in loading state\n\t\t\t\t\t\t// - Results will be updated via forceRefresh() when async data arrives\n\t\t\t\t\t\tif (isAsyncTrigger && results.length === 0) {\n\t\t\t\t\t\t\t// Don't change results or loading state - forceRefresh will handle it\n\t\t\t\t\t\t\treturn prev\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...prev,\n\t\t\t\t\t\t\tresults,\n\t\t\t\t\t\t\tselectedIndex: 0,\n\t\t\t\t\t\t\tisOpen: true,\n\t\t\t\t\t\t\tisLoading: false,\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t} catch (_error) {\n\t\t\t\t\t// On error, close picker\n\t\t\t\t\tsetState((prev) => ({\n\t\t\t\t\t\t...prev,\n\t\t\t\t\t\tresults: [],\n\t\t\t\t\t\tisOpen: false,\n\t\t\t\t\t\tisLoading: false,\n\t\t\t\t\t}))\n\t\t\t\t}\n\t\t\t}, debounceMs)\n\n\t\t\tdebounceTimersRef.current.set(foundTrigger.id, timer)\n\n\t\t\t// Return consumed value if trigger consumes input\n\t\t\tif (foundTrigger.consumeTrigger) {\n\t\t\t\treturn { consumedValue: getConsumedValue(value, lastLine, foundTriggerInfo.triggerIndex) }\n\t\t\t}\n\n\t\t\treturn {}\n\t\t},\n\t\t[triggers, state.isOpen, state.activeTrigger?.id, getLastLine, getConsumedValue],\n\t)\n\n\t/**\n\t * Handle item selection - returns the new input value with the selection inserted\n\t */\n\tconst handleSelect = useCallback(\n\t\t(item: T, fullValue: string, lineText?: string): string => {\n\t\t\tconst { activeTrigger, triggerInfo } = state\n\n\t\t\tif (!activeTrigger || !triggerInfo) {\n\t\t\t\treturn fullValue\n\t\t\t}\n\n\t\t\t// Get the lines\n\t\t\tconst lines = fullValue.split(\"\\n\")\n\t\t\tconst lastLineIndex = lines.length - 1\n\t\t\tconst lastLine = lineText ?? lines[lastLineIndex] ?? \"\"\n\n\t\t\t// Get replacement text from trigger\n\t\t\tconst newLastLine = activeTrigger.getReplacementText(item, lastLine, triggerInfo.triggerIndex)\n\n\t\t\t// Replace the last line\n\t\t\tlines[lastLineIndex] = newLastLine\n\t\t\tconst newValue = lines.join(\"\\n\")\n\n\t\t\t// Reset state\n\t\t\tsetState({\n\t\t\t\tactiveTrigger: null,\n\t\t\t\tresults: [],\n\t\t\t\tselectedIndex: 0,\n\t\t\t\tisOpen: false,\n\t\t\t\tisLoading: false,\n\t\t\t\ttriggerInfo: null,\n\t\t\t})\n\n\t\t\t// Clear last query for this trigger\n\t\t\tlastQueriesRef.current.delete(activeTrigger.id)\n\n\t\t\treturn newValue\n\t\t},\n\t\t[state],\n\t)\n\n\t/**\n\t * Close the picker\n\t */\n\tconst handleClose = useCallback(() => {\n\t\t// Clear any pending debounce timers\n\t\tdebounceTimersRef.current.forEach((timer) => clearTimeout(timer))\n\t\tdebounceTimersRef.current.clear()\n\n\t\tsetState({\n\t\t\tactiveTrigger: null,\n\t\t\tresults: [],\n\t\t\tselectedIndex: 0,\n\t\t\tisOpen: false,\n\t\t\tisLoading: false,\n\t\t\ttriggerInfo: null,\n\t\t})\n\t}, [])\n\n\t/**\n\t * Update selected index\n\t */\n\tconst handleIndexChange = useCallback((index: number) => {\n\t\tsetState((prev) => ({\n\t\t\t...prev,\n\t\t\tselectedIndex: index,\n\t\t}))\n\t}, [])\n\n\t/**\n\t * Navigate selection up (with wrap-around)\n\t */\n\tconst navigateUp = useCallback(() => {\n\t\tsetState((prev) => {\n\t\t\tif (prev.results.length === 0) return prev\n\t\t\tconst newIndex = prev.selectedIndex > 0 ? prev.selectedIndex - 1 : prev.results.length - 1\n\t\t\treturn { ...prev, selectedIndex: newIndex }\n\t\t})\n\t}, [])\n\n\t/**\n\t * Navigate selection down (with wrap-around)\n\t */\n\tconst navigateDown = useCallback(() => {\n\t\tsetState((prev) => {\n\t\t\tif (prev.results.length === 0) return prev\n\t\t\tconst newIndex = prev.selectedIndex < prev.results.length - 1 ? prev.selectedIndex + 1 : 0\n\t\t\treturn { ...prev, selectedIndex: newIndex }\n\t\t})\n\t}, [])\n\n\t/**\n\t * Force refresh the current search results.\n\t * This is used when external async data (like file search results) arrives\n\t * after the initial search returned empty.\n\t * Uses refreshResults if available to avoid triggering new API calls.\n\t *\n\t * IMPORTANT: We must find the current trigger from the `triggers` array,\n\t * not use `state.activeTrigger`, because the triggers array is recreated\n\t * with fresh closures when external data changes.\n\t */\n\tconst forceRefresh = useCallback(() => {\n\t\tconst { activeTrigger, triggerInfo } = state\n\n\t\t// Only refresh if picker is open and we have an active trigger\n\t\tif (!activeTrigger || !triggerInfo) {\n\t\t\treturn\n\t\t}\n\n\t\t// CRITICAL: Find the CURRENT trigger from the triggers array\n\t\t// The state.activeTrigger holds a stale closure, but triggers array has fresh closures\n\t\tconst currentTrigger = triggers.find((t) => t.id === activeTrigger.id)\n\t\tif (!currentTrigger) {\n\t\t\treturn\n\t\t}\n\n\t\tconst { query } = triggerInfo\n\n\t\t// Use refreshResults if available (doesn't trigger new API call)\n\t\t// Fall back to search() if refreshResults is not implemented\n\t\tconst refreshFn = currentTrigger.refreshResults ?? currentTrigger.search\n\n\t\ttry {\n\t\t\tconst results = refreshFn(query)\n\n\t\t\t// Handle both sync and async search results\n\t\t\tif (results instanceof Promise) {\n\t\t\t\tresults.then((asyncResults) => {\n\t\t\t\t\tsetState((prev) => {\n\t\t\t\t\t\t// Only update if still the same trigger\n\t\t\t\t\t\tif (prev.activeTrigger?.id !== activeTrigger.id) {\n\t\t\t\t\t\t\treturn prev\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Only update if results actually changed to avoid unnecessary re-renders\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tprev.results.length === asyncResults.length &&\n\t\t\t\t\t\t\tprev.results.every((r, i) => r.key === asyncResults[i]?.key)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\treturn { ...prev, isLoading: false }\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...prev,\n\t\t\t\t\t\t\tresults: asyncResults,\n\t\t\t\t\t\t\t// Preserve selectedIndex if within bounds, otherwise reset to 0\n\t\t\t\t\t\t\tselectedIndex: prev.selectedIndex < asyncResults.length ? prev.selectedIndex : 0,\n\t\t\t\t\t\t\tisLoading: false,\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tsetState((prev) => {\n\t\t\t\t\t// Only update if still the same trigger\n\t\t\t\t\tif (prev.activeTrigger?.id !== activeTrigger.id) {\n\t\t\t\t\t\treturn prev\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only update if results actually changed to avoid unnecessary re-renders\n\t\t\t\t\tif (\n\t\t\t\t\t\tprev.results.length === results.length &&\n\t\t\t\t\t\tprev.results.every((r, i) => r.key === results[i]?.key)\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn { ...prev, isLoading: false }\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...prev,\n\t\t\t\t\t\tresults,\n\t\t\t\t\t\t// Preserve selectedIndex if within bounds, otherwise reset to 0\n\t\t\t\t\t\tselectedIndex: prev.selectedIndex < results.length ? prev.selectedIndex : 0,\n\t\t\t\t\t\tisLoading: false,\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t} catch (_error) {\n\t\t\t// Silently fail on refresh errors.\n\t\t}\n\t}, [state, triggers])\n\n\tconst actions: AutocompletePickerActions<T> = {\n\t\thandleInputChange,\n\t\thandleSelect,\n\t\thandleClose,\n\t\thandleIndexChange,\n\t\tnavigateUp,\n\t\tnavigateDown,\n\t\tforceRefresh,\n\t}\n\n\treturn [state, actions]\n}\n","import { useInput } from \"ink\"\nimport { useState, useCallback, useEffect, useImperativeHandle, forwardRef, useRef, type Ref } from \"react\"\n\nimport { useInputHistory } from \"../../hooks/useInputHistory.js\"\nimport { useTerminalSize } from \"../../hooks/TerminalSizeContext.js\"\nimport { MultilineTextInput } from \"../MultilineTextInput.js\"\n\nimport type { AutocompleteItem, AutocompleteTrigger, AutocompletePickerState } from \"./types.js\"\nimport { useAutocompletePicker } from \"./useAutocompletePicker.js\"\n\nexport interface AutocompleteInputProps<T extends AutocompleteItem = AutocompleteItem> {\n\t/** Placeholder text when input is empty */\n\tplaceholder?: string\n\t/** Called when user submits text (Enter without picker open) */\n\tonSubmit: (value: string) => void\n\t/** Whether the input is active/focused */\n\tisActive?: boolean\n\t/** Array of autocomplete triggers to enable */\n\ttriggers: AutocompleteTrigger<T>[]\n\t/** Called when an item is selected from the picker */\n\tonSelect?: (item: T) => void\n\t/** Called when picker state changes - use this to render PickerSelect externally */\n\tonPickerStateChange?: (state: AutocompletePickerState<T>) => void\n\t/** Prompt character for the first line (default: \"> \") */\n\tprompt?: string\n}\n\n/**\n * Ref handle for AutocompleteInput - allows parent to access picker state and actions\n */\nexport interface AutocompleteInputHandle<T extends AutocompleteItem = AutocompleteItem> {\n\t/** Current picker state */\n\tpickerState: AutocompletePickerState<T>\n\t/** Handle item selection from external picker */\n\thandleItemSelect: (item: T) => void\n\t/** Handle index change from external picker */\n\thandleIndexChange: (index: number) => void\n\t/** Close the picker */\n\tclosePicker: () => void\n\t/** Force refresh search results (used when async data arrives after initial search) */\n\trefreshSearch: () => void\n}\n\n/**\n * Inner component implementation\n */\nfunction AutocompleteInputInner<T extends AutocompleteItem>(\n\t{\n\t\tplaceholder = \"Type your message...\",\n\t\tonSubmit,\n\t\tisActive = true,\n\t\ttriggers,\n\t\tonSelect,\n\t\tonPickerStateChange,\n\t\tprompt = \"> \",\n\t}: AutocompleteInputProps<T>,\n\tref: Ref<AutocompleteInputHandle<T>>,\n) {\n\tconst [inputValue, setInputValue] = useState(\"\")\n\n\t// Counter to force re-mount of MultilineTextInput to move cursor to end\n\tconst [inputKeyCounter, setInputKeyCounter] = useState(0)\n\n\t// Get terminal size for proper line wrapping\n\tconst { columns } = useTerminalSize()\n\n\t// Autocomplete picker state\n\tconst [pickerState, pickerActions] = useAutocompletePicker(triggers)\n\n\t// Input history\n\tconst { addEntry, historyValue, isBrowsing, resetBrowsing, history, draft, setDraft, navigateUp, navigateDown } =\n\t\tuseInputHistory({\n\t\t\tisActive: isActive && !pickerState.isOpen,\n\t\t\tgetCurrentInput: () => inputValue,\n\t\t})\n\n\tconst [wasBrowsing, setWasBrowsing] = useState(false)\n\n\t// Track previous picker state values to avoid unnecessary parent updates\n\tconst prevPickerStateRef = useRef({\n\t\tisOpen: pickerState.isOpen,\n\t\tresultsLength: pickerState.results.length,\n\t\tselectedIndex: pickerState.selectedIndex,\n\t\tisLoading: pickerState.isLoading,\n\t})\n\n\t// Notify parent of picker state changes only when relevant properties change\n\t// This prevents double renders from cascading state updates\n\tuseEffect(() => {\n\t\tconst prev = prevPickerStateRef.current\n\t\tconst curr = {\n\t\t\tisOpen: pickerState.isOpen,\n\t\t\tresultsLength: pickerState.results.length,\n\t\t\tselectedIndex: pickerState.selectedIndex,\n\t\t\tisLoading: pickerState.isLoading,\n\t\t}\n\n\t\t// Only notify if something visually relevant changed\n\t\tif (\n\t\t\tprev.isOpen !== curr.isOpen ||\n\t\t\tprev.resultsLength !== curr.resultsLength ||\n\t\t\tprev.selectedIndex !== curr.selectedIndex ||\n\t\t\tprev.isLoading !== curr.isLoading\n\t\t) {\n\t\t\tprevPickerStateRef.current = curr\n\t\t\tonPickerStateChange?.(pickerState)\n\t\t}\n\t}, [pickerState, onPickerStateChange])\n\n\t// Handle history navigation\n\tuseEffect(() => {\n\t\tif (isBrowsing && !wasBrowsing) {\n\t\t\tif (historyValue !== null) {\n\t\t\t\tsetInputValue(historyValue)\n\t\t\t}\n\t\t} else if (!isBrowsing && wasBrowsing) {\n\t\t\tsetInputValue(draft)\n\t\t} else if (isBrowsing && historyValue !== null && historyValue !== inputValue) {\n\t\t\tsetInputValue(historyValue)\n\t\t}\n\n\t\tsetWasBrowsing(isBrowsing)\n\t}, [isBrowsing, wasBrowsing, historyValue, draft, inputValue])\n\n\t/**\n\t * Get the last line from input value\n\t */\n\tconst getLastLine = useCallback((value: string): string => {\n\t\tconst lines = value.split(\"\\n\")\n\t\treturn lines[lines.length - 1] || \"\"\n\t}, [])\n\n\t/**\n\t * Handle input value changes\n\t */\n\tconst handleChange = useCallback(\n\t\t(value: string) => {\n\t\t\t// Check for trigger activation\n\t\t\tconst lastLine = getLastLine(value)\n\t\t\tconst result = pickerActions.handleInputChange(value, lastLine)\n\n\t\t\t// If trigger consumes its character, use the consumed value instead\n\t\t\tconst effectiveValue = result.consumedValue ?? value\n\n\t\t\tsetInputValue(effectiveValue)\n\n\t\t\t// If user types while browsing history, exit browsing mode\n\t\t\t// This prevents the history effect from overwriting their edits\n\t\t\tif (isBrowsing) {\n\t\t\t\tresetBrowsing(effectiveValue)\n\t\t\t} else {\n\t\t\t\tsetDraft(effectiveValue)\n\t\t\t}\n\t\t},\n\t\t[pickerActions, isBrowsing, setDraft, getLastLine, resetBrowsing],\n\t)\n\n\t/**\n\t * Handle item selection from picker\n\t */\n\tconst handleItemSelect = useCallback(\n\t\t(item: T) => {\n\t\t\tconst lastLine = getLastLine(inputValue)\n\t\t\tconst newValue = pickerActions.handleSelect(item, inputValue, lastLine)\n\n\t\t\tsetInputValue(newValue)\n\t\t\tsetDraft(newValue)\n\t\t\t// Increment counter to force re-mount and move cursor to end\n\t\t\tsetInputKeyCounter((c) => c + 1)\n\n\t\t\t// Notify parent\n\t\t\tonSelect?.(item)\n\t\t},\n\t\t[inputValue, pickerActions, setDraft, getLastLine, onSelect],\n\t)\n\n\t/**\n\t * Handle form submission\n\t */\n\tconst handleSubmit = useCallback(\n\t\tasync (text: string) => {\n\t\t\tconst trimmed = text.trim()\n\n\t\t\tif (!trimmed) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Don't submit if picker is open\n\t\t\tif (pickerState.isOpen) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tawait addEntry(trimmed)\n\n\t\t\tresetBrowsing(\"\")\n\t\t\tsetInputValue(\"\")\n\n\t\t\tonSubmit(trimmed)\n\t\t},\n\t\t[pickerState.isOpen, addEntry, resetBrowsing, onSubmit],\n\t)\n\n\t/**\n\t * Handle escape key\n\t */\n\tconst handleEscape = useCallback(() => {\n\t\t// If picker is open, close it without clearing text\n\t\tif (pickerState.isOpen) {\n\t\t\tpickerActions.handleClose()\n\t\t\treturn\n\t\t}\n\n\t\t// Clear all input on Escape when picker is not open\n\t\tsetInputValue(\"\")\n\t\tsetDraft(\"\")\n\t\tresetBrowsing(\"\")\n\t}, [pickerState.isOpen, pickerActions, setDraft, resetBrowsing])\n\n\t// Handle picker selection with Enter or Tab\n\tuseInput(\n\t\t(_input, key) => {\n\t\t\tif (!isActive || !pickerState.isOpen) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// Select current item on Enter or Tab\n\t\t\tif (key.return || key.tab) {\n\t\t\t\tconst selected = pickerState.results[pickerState.selectedIndex]\n\n\t\t\t\tif (selected) {\n\t\t\t\t\thandleItemSelect(selected)\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t{ isActive: isActive && pickerState.isOpen },\n\t)\n\n\t// Expose handle to parent via ref\n\tuseImperativeHandle(\n\t\tref,\n\t\t() => ({\n\t\t\tpickerState,\n\t\t\thandleItemSelect,\n\t\t\thandleIndexChange: pickerActions.handleIndexChange,\n\t\t\tclosePicker: pickerActions.handleClose,\n\t\t\trefreshSearch: pickerActions.forceRefresh,\n\t\t}),\n\t\t[\n\t\t\tpickerState,\n\t\t\thandleItemSelect,\n\t\t\tpickerActions.handleIndexChange,\n\t\t\tpickerActions.handleClose,\n\t\t\tpickerActions.forceRefresh,\n\t\t],\n\t)\n\n\treturn (\n\t\t<MultilineTextInput\n\t\t\tkey={`autocomplete-input-${history.length}-${inputKeyCounter}`}\n\t\t\tvalue={inputValue}\n\t\t\tonChange={handleChange}\n\t\t\tonSubmit={handleSubmit}\n\t\t\tonEscape={handleEscape}\n\t\t\tonUpAtFirstLine={navigateUp}\n\t\t\tonDownAtLastLine={navigateDown}\n\t\t\tplaceholder={placeholder}\n\t\t\tisActive={isActive}\n\t\t\tshowCursor={true}\n\t\t\tprompt={prompt}\n\t\t\tcolumns={columns}\n\t\t/>\n\t)\n}\n\n/**\n * A multiline text input with autocomplete support.\n *\n * Features:\n * - Multiline text editing with history\n * - Trigger-based autocomplete (e.g., @ for files, / for commands)\n * - Keyboard navigation in picker\n * - Exposes picker state via ref for external picker rendering\n *\n * @template T - The type of autocomplete items\n *\n * @example\n * ```tsx\n * const inputRef = useRef<AutocompleteInputHandle<MyItem>>(null)\n *\n * <AutocompleteInput\n * ref={inputRef}\n * triggers={myTriggers}\n * onSubmit={handleSubmit}\n * onPickerStateChange={(state) => setPickerState(state)}\n * />\n *\n * {pickerState.isOpen && (\n * <PickerSelect\n * results={pickerState.results}\n * selectedIndex={pickerState.selectedIndex}\n * onSelect={inputRef.current?.handleItemSelect}\n * // ...\n * />\n * )}\n * ```\n */\nexport const AutocompleteInput = forwardRef(AutocompleteInputInner) as <T extends AutocompleteItem>(\n\tprops: AutocompleteInputProps<T> & { ref?: Ref<AutocompleteInputHandle<T>> },\n) => ReturnType<typeof AutocompleteInputInner>\n\n/**\n * Re-export types and hook for convenience\n */\nexport { useAutocompletePicker } from \"./useAutocompletePicker.js\"\nexport type {\n\tAutocompleteItem,\n\tAutocompleteTrigger,\n\tAutocompletePickerState,\n\tAutocompletePickerActions,\n\tTriggerDetectionResult,\n} from \"./types.js\"\n","import { useRef, useMemo, type ReactNode } from \"react\"\nimport { Box, Text, useInput } from \"ink\"\n\nimport type { AutocompleteItem } from \"./types.js\"\n\nexport interface PickerSelectProps<T extends AutocompleteItem> {\n\t/** Results to display in the picker */\n\tresults: T[]\n\t/** Currently selected index */\n\tselectedIndex: number\n\t/** Maximum number of visible items */\n\tmaxVisible?: number\n\t/** Called when an item is selected */\n\tonSelect: (item: T) => void\n\t/** Called when escape is pressed */\n\tonEscape: () => void\n\t/** Called when selection index changes */\n\tonIndexChange: (index: number) => void\n\t/** Render function for each item */\n\trenderItem: (item: T, isSelected: boolean) => ReactNode\n\t/** Message shown when results are empty */\n\temptyMessage?: string\n\t/** Whether the picker accepts keyboard input */\n\tisActive?: boolean\n\t/** Whether search is in progress */\n\tisLoading?: boolean\n}\n\n/**\n * Compute visible window based on selected index.\n * The window \"follows\" the selection, keeping it visible.\n * Uses a ref to track the previous window position for smooth scrolling.\n */\nfunction computeVisibleWindow(\n\tselectedIndex: number,\n\ttotalItems: number,\n\tmaxVisible: number,\n\tprevWindow: { from: number; to: number },\n): { from: number; to: number } {\n\tif (totalItems === 0) {\n\t\treturn { from: 0, to: 0 }\n\t}\n\n\tconst visibleCount = Math.min(maxVisible, totalItems)\n\n\t// If previous window was empty (fresh results), compute initial window\n\t// This handles the case when results first appear\n\tif (prevWindow.to === 0 || prevWindow.to <= prevWindow.from) {\n\t\tconst newFrom = Math.max(0, selectedIndex)\n\t\tconst newTo = Math.min(totalItems, newFrom + visibleCount)\n\t\treturn { from: newFrom, to: newTo }\n\t}\n\n\t// If selected index is within current window, keep the window\n\tif (selectedIndex >= prevWindow.from && selectedIndex < prevWindow.to) {\n\t\t// But clamp the window to valid bounds (in case totalItems changed)\n\t\tconst clampedFrom = Math.max(0, Math.min(prevWindow.from, totalItems - visibleCount))\n\t\tconst clampedTo = Math.min(totalItems, clampedFrom + visibleCount)\n\t\treturn { from: clampedFrom, to: clampedTo }\n\t}\n\n\t// If selected is below window, scroll down to show it at bottom\n\tif (selectedIndex >= prevWindow.to) {\n\t\tconst newTo = Math.min(totalItems, selectedIndex + 1)\n\t\tconst newFrom = Math.max(0, newTo - visibleCount)\n\t\treturn { from: newFrom, to: newTo }\n\t}\n\n\t// If selected is above window, scroll up to show it at top\n\tif (selectedIndex < prevWindow.from) {\n\t\tconst newFrom = Math.max(0, selectedIndex)\n\t\tconst newTo = Math.min(totalItems, newFrom + visibleCount)\n\t\treturn { from: newFrom, to: newTo }\n\t}\n\n\treturn prevWindow\n}\n\n/**\n * Generic picker dropdown component for autocomplete.\n * Uses windowing approach (like @inkjs/ui) - only renders visible items.\n * This eliminates flickering caused by ScrollArea's margin-based scrolling.\n *\n * @template T - The type of items to display\n */\nexport function PickerSelect<T extends AutocompleteItem>({\n\tresults,\n\tselectedIndex,\n\tmaxVisible = 10,\n\tonSelect,\n\tonEscape,\n\tonIndexChange,\n\trenderItem,\n\temptyMessage = \"No results found\",\n\tisActive = true,\n\tisLoading = false,\n}: PickerSelectProps<T>) {\n\t// Track previous window position for smooth scrolling\n\tconst prevWindowRef = useRef({ from: 0, to: Math.min(maxVisible, results.length) })\n\n\t// Compute visible window SYNCHRONOUSLY during render (no state, no useEffect)\n\t// This ensures the correct items are rendered in a single pass\n\tconst visibleWindow = useMemo(() => {\n\t\tconst window = computeVisibleWindow(selectedIndex, results.length, maxVisible, prevWindowRef.current)\n\t\t// Update ref for next render\n\t\tprevWindowRef.current = window\n\t\treturn window\n\t}, [selectedIndex, results.length, maxVisible])\n\n\t// Handle keyboard input\n\tuseInput(\n\t\t(_input, key) => {\n\t\t\tif (!isActive) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (key.escape) {\n\t\t\t\tonEscape()\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (key.return) {\n\t\t\t\tconst selected = results[selectedIndex]\n\t\t\t\tif (selected) {\n\t\t\t\t\tonSelect(selected)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (key.upArrow) {\n\t\t\t\tconst newIndex = selectedIndex > 0 ? selectedIndex - 1 : results.length - 1\n\t\t\t\tonIndexChange(newIndex)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (key.downArrow) {\n\t\t\t\tconst newIndex = selectedIndex < results.length - 1 ? selectedIndex + 1 : 0\n\t\t\t\tonIndexChange(newIndex)\n\t\t\t\treturn\n\t\t\t}\n\t\t},\n\t\t{ isActive },\n\t)\n\n\t// Compute visible items (the key optimization - only render what's visible)\n\tconst visibleItems = useMemo(() => {\n\t\treturn results.slice(visibleWindow.from, visibleWindow.to)\n\t}, [results, visibleWindow.from, visibleWindow.to])\n\n\t// Empty state - maintain consistent height\n\tif (results.length === 0) {\n\t\tconst message = isLoading ? \"Searching...\" : emptyMessage\n\t\treturn (\n\t\t\t<Box paddingLeft={2} height={maxVisible}>\n\t\t\t\t<Text dimColor>{message}</Text>\n\t\t\t</Box>\n\t\t)\n\t}\n\n\t// Calculate if we need scroll indicators\n\tconst hasMoreAbove = visibleWindow.from > 0\n\tconst hasMoreBelow = visibleWindow.to < results.length\n\n\t// Render only visible items (windowing approach)\n\treturn (\n\t\t<Box flexDirection=\"column\" height={maxVisible}>\n\t\t\t{/* Scroll indicator - more items above */}\n\t\t\t{hasMoreAbove && (\n\t\t\t\t<Box paddingLeft={2}>\n\t\t\t\t\t<Text dimColor>↑ {visibleWindow.from} more</Text>\n\t\t\t\t</Box>\n\t\t\t)}\n\n\t\t\t{/* Visible items */}\n\t\t\t{visibleItems.map((result, visibleIndex) => {\n\t\t\t\tconst actualIndex = visibleWindow.from + visibleIndex\n\t\t\t\tconst isSelected = actualIndex === selectedIndex\n\t\t\t\treturn <Box key={result.key}>{renderItem(result, isSelected)}</Box>\n\t\t\t})}\n\n\t\t\t{/* Scroll indicator - more items below */}\n\t\t\t{hasMoreBelow && (\n\t\t\t\t<Box paddingLeft={2}>\n\t\t\t\t\t<Text dimColor>↓ {results.length - visibleWindow.to} more</Text>\n\t\t\t\t</Box>\n\t\t\t)}\n\t\t</Box>\n\t)\n}\n","import type { ReactNode } from \"react\"\n\n/**\n * Represents a single autocomplete result item.\n * All result types must extend this with a unique key.\n */\nexport interface AutocompleteItem {\n\t/** Unique identifier for this item */\n\tkey: string\n}\n\n/**\n * Result from trigger detection.\n */\nexport interface TriggerDetectionResult {\n\t/** The search query extracted from the input */\n\tquery: string\n\t/** Position of trigger character in the line */\n\ttriggerIndex: number\n}\n\n/**\n * Configuration for an autocomplete trigger.\n * Each trigger defines how to detect, search, and render autocomplete options.\n *\n * @template T - The type of items this trigger produces\n */\nexport interface AutocompleteTrigger<T extends AutocompleteItem = AutocompleteItem> {\n\t/**\n\t * Unique identifier for this trigger.\n\t * Used to track which trigger is active.\n\t */\n\tid: string\n\n\t/**\n\t * The character(s) that activate this trigger.\n\t * Examples: \"@\", \"/\", \"#\"\n\t */\n\ttriggerChar: string\n\n\t/**\n\t * Where the trigger must appear to activate.\n\t * - 'anywhere': Can appear anywhere in the line (e.g., @ for file mentions)\n\t * - 'line-start': Must be at start of line, optionally after whitespace (e.g., / for commands)\n\t */\n\tposition: \"anywhere\" | \"line-start\"\n\n\t/**\n\t * Detect if this trigger is active and extract the search query.\n\t * @param lineText - The current line of text\n\t * @returns Detection result with query and position, or null if trigger not active\n\t */\n\tdetectTrigger: (lineText: string) => TriggerDetectionResult | null\n\n\t/**\n\t * Search/filter results based on query.\n\t * Can be synchronous (local filtering) or asynchronous (API call).\n\t * @param query - The search query\n\t * @returns Array of matching items\n\t */\n\tsearch: (query: string) => T[] | Promise<T[]>\n\n\t/**\n\t * Get current results without triggering a new search.\n\t * Used for refreshing results when async data arrives.\n\t * If not provided, forceRefresh will fall back to search().\n\t * @param query - The search query for filtering\n\t * @returns Array of matching items from current data\n\t */\n\trefreshResults?: (query: string) => T[] | Promise<T[]>\n\n\t/**\n\t * Render a single item in the picker dropdown.\n\t * @param item - The item to render\n\t * @param isSelected - Whether this item is currently selected\n\t * @returns React node to render\n\t */\n\trenderItem: (item: T, isSelected: boolean) => ReactNode\n\n\t/**\n\t * Generate the replacement text when an item is selected.\n\t * @param item - The selected item\n\t * @param lineText - The current line text\n\t * @param triggerIndex - Position of trigger character in line\n\t * @returns The new line text with selection inserted\n\t */\n\tgetReplacementText: (item: T, lineText: string, triggerIndex: number) => string\n\n\t/**\n\t * Message to show when no results match.\n\t * @default \"No results found\"\n\t */\n\temptyMessage?: string\n\n\t/**\n\t * Debounce delay in milliseconds for search.\n\t * @default 150\n\t */\n\tdebounceMs?: number\n\n\t/**\n\t * Whether the trigger character should be consumed (not shown in input).\n\t * When true, the trigger character is treated as a control character\n\t * that activates the picker but doesn't appear in the text input.\n\t * @default false\n\t */\n\tconsumeTrigger?: boolean\n}\n\n/**\n * State for the active autocomplete picker.\n */\nexport interface AutocompletePickerState<T extends AutocompleteItem = AutocompleteItem> {\n\t/** Which trigger is currently active (by id) */\n\tactiveTrigger: AutocompleteTrigger<T> | null\n\t/** Current search results */\n\tresults: T[]\n\t/** Currently selected index */\n\tselectedIndex: number\n\t/** Whether picker is visible */\n\tisOpen: boolean\n\t/** Loading state for async searches */\n\tisLoading: boolean\n\t/** The detected trigger info */\n\ttriggerInfo: TriggerDetectionResult | null\n}\n\n/**\n * Result from handleInputChange indicating if input should be modified.\n */\nexport interface InputChangeResult {\n\t/** If set, the input value should be replaced with this value (trigger char consumed) */\n\tconsumedValue?: string\n}\n\n/**\n * Actions returned by the useAutocompletePicker hook.\n */\nexport interface AutocompletePickerActions<T extends AutocompleteItem> {\n\t/** Handle input value changes - detects triggers and initiates search */\n\thandleInputChange: (value: string, lineText: string) => InputChangeResult\n\t/** Handle item selection - returns the new input value */\n\thandleSelect: (item: T, fullValue: string, lineText: string) => string\n\t/** Close the picker */\n\thandleClose: () => void\n\t/** Update selected index */\n\thandleIndexChange: (index: number) => void\n\t/** Navigate selection up */\n\tnavigateUp: () => void\n\t/** Navigate selection down */\n\tnavigateDown: () => void\n\t/** Force refresh the current search results (for async data that arrived after initial search) */\n\tforceRefresh: () => void\n}\n","import { Box, Text } from \"ink\"\nimport Fuzzysort from \"fuzzysort\"\n\nimport { Icon } from \"../../Icon.js\"\nimport type { AutocompleteTrigger, AutocompleteItem, TriggerDetectionResult } from \"../types.js\"\n\nexport interface FileResult extends AutocompleteItem {\n\tpath: string\n\ttype: \"file\" | \"folder\"\n\tlabel?: string\n}\n\n/**\n * Props for creating a file trigger\n */\nexport interface FileTriggerConfig {\n\t/**\n\t * Called when a search should be performed.\n\t * This typically triggers an API call to search files.\n\t */\n\tonSearch: (query: string) => void\n\t/**\n\t * Current search results from the store/API.\n\t * Results are provided externally because file search is async.\n\t */\n\tgetResults: () => FileResult[]\n}\n\n/**\n * Create a file trigger for @ mentions.\n *\n * This trigger activates when the user types @ followed by text,\n * and allows selecting files to insert as @/path references.\n *\n * The file trigger uses async data fetching:\n * - search() triggers the API call and returns [] immediately\n * - When API responds, App.tsx calls forceRefresh()\n * - refreshResults() then returns the actual results from the store\n *\n * @param config - Configuration for the trigger\n * @returns AutocompleteTrigger for file mentions\n */\nexport function createFileTrigger(config: FileTriggerConfig): AutocompleteTrigger<FileResult> {\n\tconst { onSearch, getResults } = config\n\n\t// Helper function to get results and apply fuzzy sorting\n\tfunction getResultsWithFuzzySort(query: string): FileResult[] {\n\t\tconst results = getResults()\n\n\t\t// Sort results by fuzzy match score (best matches first)\n\t\tif (!query || results.length === 0) {\n\t\t\treturn results\n\t\t}\n\n\t\tconst fuzzyResults = Fuzzysort.go(query, results, {\n\t\t\tkey: \"path\",\n\t\t\tthreshold: -10000, // Include all results\n\t\t})\n\n\t\treturn fuzzyResults.map((result) => result.obj)\n\t}\n\n\treturn {\n\t\tid: \"file\",\n\t\ttriggerChar: \"@\",\n\t\tposition: \"anywhere\",\n\n\t\tdetectTrigger: (lineText: string): TriggerDetectionResult | null => {\n\t\t\t// Find the last @ in the line\n\t\t\tconst atIndex = lineText.lastIndexOf(\"@\")\n\n\t\t\tif (atIndex === -1) {\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\t// Extract query after @\n\t\t\tconst query = lineText.substring(atIndex + 1)\n\n\t\t\t// Close picker if query contains space (user finished typing)\n\t\t\tif (query.includes(\" \")) {\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\t// Unlike other triggers that only work at line-start, @ can appear anywhere\n\t\t\t// and should show results even with an empty query (just \"@\" typed)\n\t\t\treturn { query, triggerIndex: atIndex }\n\t\t},\n\n\t\tsearch: (query: string): FileResult[] => {\n\t\t\t// Trigger the external async search\n\t\t\tonSearch(query)\n\n\t\t\t// Return empty immediately - don't bother calling getResults() since\n\t\t\t// we know the async API hasn't responded yet.\n\t\t\t// When results arrive, App.tsx will call forceRefresh() which uses\n\t\t\t// refreshResults() to get the actual data from the store.\n\t\t\treturn []\n\t\t},\n\n\t\t// refreshResults: Get current results without triggering a new API call\n\t\t// This is used by forceRefresh when async results arrive\n\t\trefreshResults: (query: string): FileResult[] => {\n\t\t\treturn getResultsWithFuzzySort(query)\n\t\t},\n\n\t\trenderItem: (item: FileResult, isSelected: boolean) => {\n\t\t\tconst iconName = item.type === \"folder\" ? \"folder\" : \"file\"\n\t\t\tconst color = isSelected ? \"cyan\" : item.type === \"folder\" ? \"blue\" : undefined\n\n\t\t\treturn (\n\t\t\t\t<Box paddingLeft={2}>\n\t\t\t\t\t<Icon name={iconName} color={color} />\n\t\t\t\t\t<Text> </Text>\n\t\t\t\t\t<Text color={color}>{item.path}</Text>\n\t\t\t\t</Box>\n\t\t\t)\n\t\t},\n\n\t\tgetReplacementText: (item: FileResult, lineText: string, triggerIndex: number): string => {\n\t\t\tconst beforeAt = lineText.substring(0, triggerIndex)\n\t\t\treturn `${beforeAt}@/${item.path} `\n\t\t},\n\n\t\temptyMessage: \"No matching files found\",\n\t\tdebounceMs: 150,\n\t}\n}\n\n/**\n * Convert external FileSearchResult to FileResult.\n * Use this to adapt results from the store to the trigger's expected type.\n */\nexport function toFileResult(result: { path: string; type: \"file\" | \"folder\"; label?: string }): FileResult {\n\treturn {\n\t\tkey: result.path,\n\t\tpath: result.path,\n\t\ttype: result.type,\n\t\tlabel: result.label,\n\t}\n}\n","import { Box, Text } from \"ink\"\r\nimport fuzzysort from \"fuzzysort\"\r\n\r\nimport { GlobalCommandAction } from \"../../../../lib/utils/commands.js\"\r\n\r\nimport type { AutocompleteTrigger, AutocompleteItem, TriggerDetectionResult } from \"../types.js\"\r\n\r\nexport interface SlashCommandResult extends AutocompleteItem {\r\n\tname: string\r\n\tdescription?: string\r\n\targumentHint?: string\r\n\tsource: \"global\" | \"project\" | \"built-in\"\r\n\t/** Action to trigger for CLI global commands (e.g., clearTask for /new) */\r\n\taction?: GlobalCommandAction\r\n}\r\n\r\nexport interface SlashCommandTriggerConfig {\r\n\tgetCommands: () => SlashCommandResult[]\r\n\tmaxResults?: number\r\n}\r\n\r\n/**\r\n * Create a slash command trigger for / commands.\r\n *\r\n * This trigger activates when the user types / at the start of a line,\r\n * and allows selecting commands with local fuzzy filtering.\r\n *\r\n * @param config - Configuration for the trigger\r\n * @returns AutocompleteTrigger for slash commands\r\n */\r\nexport function createSlashCommandTrigger(config: SlashCommandTriggerConfig): AutocompleteTrigger<SlashCommandResult> {\r\n\tconst { getCommands, maxResults = 20 } = config\r\n\r\n\treturn {\r\n\t\tid: \"slash-command\",\r\n\t\ttriggerChar: \"/\",\r\n\t\tposition: \"line-start\",\r\n\r\n\t\tdetectTrigger: (lineText: string): TriggerDetectionResult | null => {\r\n\t\t\t// Check if line starts with / (after optional whitespace)\r\n\t\t\tconst trimmed = lineText.trimStart()\r\n\r\n\t\t\tif (!trimmed.startsWith(\"/\")) {\r\n\t\t\t\treturn null\r\n\t\t\t}\r\n\r\n\t\t\t// Extract query after /\r\n\t\t\tconst query = trimmed.substring(1)\r\n\r\n\t\t\t// Close picker if query contains space (command complete)\r\n\t\t\tif (query.includes(\" \")) {\r\n\t\t\t\treturn null\r\n\t\t\t}\r\n\r\n\t\t\t// Calculate trigger index (position of / in original line)\r\n\t\t\tconst triggerIndex = lineText.length - trimmed.length\r\n\r\n\t\t\treturn { query, triggerIndex }\r\n\t\t},\r\n\r\n\t\tsearch: (query: string): SlashCommandResult[] => {\r\n\t\t\tconst allCommands = getCommands()\r\n\r\n\t\t\tif (query.length === 0) {\r\n\t\t\t\t// Show all commands when just \"/\" is typed\r\n\t\t\t\treturn allCommands.slice(0, maxResults)\r\n\t\t\t}\r\n\r\n\t\t\t// Fuzzy search by command name\r\n\t\t\tconst results = fuzzysort.go(query, allCommands, {\r\n\t\t\t\tkey: \"name\",\r\n\t\t\t\tlimit: maxResults,\r\n\t\t\t\tthreshold: -10000, // Be lenient with matching\r\n\t\t\t})\r\n\r\n\t\t\treturn results.map((result) => result.obj)\r\n\t\t},\r\n\r\n\t\trenderItem: (item: SlashCommandResult, isSelected: boolean) => {\r\n\t\t\t// Source indicator icons:\r\n\t\t\t// ⚙️ for action commands (CLI global), ⚡ built-in, 📁 project, 🌐 global (content)\r\n\t\t\tconst sourceIcon = item.action\r\n\t\t\t\t? \"⚙️\"\r\n\t\t\t\t: item.source === \"built-in\"\r\n\t\t\t\t\t? \"⚡\"\r\n\t\t\t\t\t: item.source === \"project\"\r\n\t\t\t\t\t\t? \"📁\"\r\n\t\t\t\t\t\t: \"🌐\"\r\n\r\n\t\t\treturn (\r\n\t\t\t\t<Box paddingLeft={2}>\r\n\t\t\t\t\t<Text color={isSelected ? \"cyan\" : undefined}>\r\n\t\t\t\t\t\t{sourceIcon} /{item.name}\r\n\t\t\t\t\t\t{item.description && <Text dimColor> - {item.description}</Text>}\r\n\t\t\t\t\t</Text>\r\n\t\t\t\t</Box>\r\n\t\t\t)\r\n\t\t},\r\n\r\n\t\tgetReplacementText: (item: SlashCommandResult, lineText: string, triggerIndex: number): string => {\r\n\t\t\tconst beforeSlash = lineText.substring(0, triggerIndex)\r\n\t\t\treturn `${beforeSlash}/${item.name} `\r\n\t\t},\r\n\r\n\t\temptyMessage: \"No matching commands found\",\r\n\t\tdebounceMs: 150,\r\n\t}\r\n}\r\n\r\n/**\r\n * Convert external command data to SlashCommandResult.\r\n * Use this to adapt commands from the store to the trigger's expected type.\r\n */\r\nexport function toSlashCommandResult(command: {\r\n\tname: string\r\n\tdescription?: string\r\n\targumentHint?: string\r\n\tsource: \"global\" | \"project\" | \"built-in\"\r\n\taction?: string\r\n}): SlashCommandResult {\r\n\treturn {\r\n\t\tkey: command.name,\r\n\t\tname: command.name,\r\n\t\tdescription: command.description,\r\n\t\targumentHint: command.argumentHint,\r\n\t\tsource: command.source,\r\n\t\taction: command.action as GlobalCommandAction | undefined,\r\n\t}\r\n}\r\n","import { Box, Text } from \"ink\"\nimport fuzzysort from \"fuzzysort\"\n\nimport type { AutocompleteTrigger, AutocompleteItem, TriggerDetectionResult } from \"../types.js\"\n\nexport interface ModeResult extends AutocompleteItem {\n\tslug: string\n\tname: string\n\tdescription?: string\n\ticon?: string\n}\n\nexport interface ModeTriggerConfig {\n\tgetModes: () => ModeResult[]\n\tmaxResults?: number\n}\n\n/**\n * Create a mode trigger for ! mode switching.\n *\n * This trigger activates when the user types ! at the start of a line,\n * and allows selecting modes with local fuzzy filtering.\n *\n * @param config - Configuration for the trigger\n * @returns AutocompleteTrigger for mode switching\n */\nexport function createModeTrigger(config: ModeTriggerConfig): AutocompleteTrigger<ModeResult> {\n\tconst { getModes, maxResults = 20 } = config\n\n\treturn {\n\t\tid: \"mode\",\n\t\ttriggerChar: \"!\",\n\t\tposition: \"line-start\",\n\n\t\tdetectTrigger: (lineText: string): TriggerDetectionResult | null => {\n\t\t\t// Check if line starts with ! (after optional whitespace)\n\t\t\tconst trimmed = lineText.trimStart()\n\n\t\t\tif (!trimmed.startsWith(\"!\")) {\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\t// Extract query after !\n\t\t\tconst query = trimmed.substring(1)\n\n\t\t\t// Close picker if query contains space (mode selection complete)\n\t\t\tif (query.includes(\" \")) {\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\t// Calculate trigger index (position of ! in original line)\n\t\t\tconst triggerIndex = lineText.length - trimmed.length\n\n\t\t\treturn { query, triggerIndex }\n\t\t},\n\n\t\tsearch: (query: string): ModeResult[] => {\n\t\t\tconst allModes = getModes()\n\n\t\t\tif (query.length === 0) {\n\t\t\t\t// Show all modes when just \"!\" is typed\n\t\t\t\treturn allModes.slice(0, maxResults)\n\t\t\t}\n\n\t\t\t// Fuzzy search by mode name and slug\n\t\t\tconst results = fuzzysort.go(query, allModes, {\n\t\t\t\tkeys: [\"name\", \"slug\"],\n\t\t\t\tlimit: maxResults,\n\t\t\t\tthreshold: -10000, // Be lenient with matching\n\t\t\t})\n\n\t\t\treturn results.map((result) => result.obj)\n\t\t},\n\n\t\trenderItem: (item: ModeResult, isSelected: boolean) => {\n\t\t\treturn (\n\t\t\t\t<Box paddingLeft={2}>\n\t\t\t\t\t<Text color={isSelected ? \"cyan\" : undefined}>\n\t\t\t\t\t\t{item.name}\n\t\t\t\t\t\t{item.description && <Text dimColor> - {item.description}</Text>}\n\t\t\t\t\t</Text>\n\t\t\t\t</Box>\n\t\t\t)\n\t\t},\n\n\t\tgetReplacementText: (_item: ModeResult, _lineText: string, _triggerIndex: number): string => {\n\t\t\t// Replace the entire input with just a space (mode will be switched via message)\n\t\t\t// This clears the picker trigger from the input\n\t\t\treturn \"\"\n\t\t},\n\n\t\temptyMessage: \"No matching modes found\",\n\t\tdebounceMs: 150,\n\t}\n}\n\n/**\n * Convert external mode data to ModeTriggerResult.\n * Use this to adapt modes from the store to the trigger's expected type.\n */\nexport function toModeResult(mode: { slug: string; name: string; description?: string; icon?: string }): ModeResult {\n\treturn {\n\t\tkey: mode.slug,\n\t\tslug: mode.slug,\n\t\tname: mode.name,\n\t\tdescription: mode.description,\n\t\ticon: mode.icon,\n\t}\n}\n","import { Box, Text } from \"ink\"\n\nimport type { AutocompleteTrigger, AutocompleteItem, TriggerDetectionResult } from \"../types.js\"\n\n/**\n * Help shortcut result type.\n * Represents a keyboard shortcut or trigger hint.\n */\nexport interface HelpShortcutResult extends AutocompleteItem {\n\t/** The shortcut key or trigger character */\n\tshortcut: string\n\t/** Description of what the shortcut does */\n\tdescription: string\n}\n\n/**\n * Built-in shortcuts to display in the help menu.\n */\nconst HELP_SHORTCUTS: HelpShortcutResult[] = [\n\t{ key: \"slash\", shortcut: \"/\", description: \"for commands\" },\n\t{ key: \"at\", shortcut: \"@\", description: \"for file paths\" },\n\t{ key: \"bang\", shortcut: \"!\", description: \"for modes\" },\n\t{ key: \"hash\", shortcut: \"#\", description: \"for task history\" },\n\t{ key: \"newline\", shortcut: \"shift + ⏎\", description: \"for newline\" },\n\t{ key: \"focus\", shortcut: \"tab\", description: \"to toggle focus\" },\n\t{ key: \"mode\", shortcut: \"ctrl + m\", description: \"to cycle modes\" },\n\t{ key: \"todos\", shortcut: \"ctrl + t\", description: \"to view TODO list\" },\n\t{ key: \"quit\", shortcut: \"ctrl + c\", description: \"to quit\" },\n]\n\n/**\n * Create a help trigger for ? shortcuts menu.\n *\n * This trigger activates when the user types ? at the start of a line,\n * and displays a menu of available keyboard shortcuts.\n *\n * @returns AutocompleteTrigger for help shortcuts\n */\nexport function createHelpTrigger(): AutocompleteTrigger<HelpShortcutResult> {\n\treturn {\n\t\tid: \"help\",\n\t\ttriggerChar: \"?\",\n\t\tposition: \"line-start\",\n\t\tconsumeTrigger: true,\n\n\t\tdetectTrigger: (lineText: string): TriggerDetectionResult | null => {\n\t\t\t// Check if line starts with ? (after optional whitespace)\n\t\t\tconst trimmed = lineText.trimStart()\n\n\t\t\tif (!trimmed.startsWith(\"?\")) {\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\t// Extract query after ?\n\t\t\tconst query = trimmed.substring(1)\n\n\t\t\t// Close picker if query contains space\n\t\t\tif (query.includes(\" \")) {\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\t// Calculate trigger index (position of ? in original line)\n\t\t\tconst triggerIndex = lineText.length - trimmed.length\n\n\t\t\treturn { query, triggerIndex }\n\t\t},\n\n\t\tsearch: (query: string): HelpShortcutResult[] => {\n\t\t\tif (query.length === 0) {\n\t\t\t\t// Show all shortcuts when just \"?\" is typed\n\t\t\t\treturn HELP_SHORTCUTS\n\t\t\t}\n\n\t\t\t// Filter shortcuts based on query\n\t\t\tconst lowerQuery = query.toLowerCase()\n\t\t\treturn HELP_SHORTCUTS.filter(\n\t\t\t\t(item) =>\n\t\t\t\t\titem.shortcut.toLowerCase().includes(lowerQuery) ||\n\t\t\t\t\titem.description.toLowerCase().includes(lowerQuery),\n\t\t\t)\n\t\t},\n\n\t\trenderItem: (item: HelpShortcutResult, isSelected: boolean) => {\n\t\t\treturn (\n\t\t\t\t<Box paddingLeft={2}>\n\t\t\t\t\t<Text color={isSelected ? \"cyan\" : undefined}>\n\t\t\t\t\t\t<Text bold color={isSelected ? \"cyan\" : \"yellow\"}>\n\t\t\t\t\t\t\t{item.shortcut}\n\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t<Text> {item.description}</Text>\n\t\t\t\t\t</Text>\n\t\t\t\t</Box>\n\t\t\t)\n\t\t},\n\n\t\tgetReplacementText: (item: HelpShortcutResult, _lineText: string, _triggerIndex: number): string => {\n\t\t\t// When a shortcut is selected, replace with the trigger character\n\t\t\t// For action shortcuts (tab, ctrl+c, shift+enter, ctrl+t), just clear the input\n\t\t\tif ([\"newline\", \"focus\", \"quit\", \"todos\"].includes(item.key)) {\n\t\t\t\treturn \"\"\n\t\t\t}\n\t\t\t// For trigger shortcuts (/, @, !), insert the trigger character\n\t\t\treturn item.shortcut\n\t\t},\n\n\t\temptyMessage: \"No matching shortcuts\",\n\t\tdebounceMs: 0, // No debounce needed for static list\n\t}\n}\n","import { Box, Text } from \"ink\"\nimport fuzzysort from \"fuzzysort\"\n\nimport type { AutocompleteTrigger, AutocompleteItem, TriggerDetectionResult } from \"../types.js\"\n\n/**\n * History result type.\n * Extends AutocompleteItem with task history properties.\n */\nexport interface HistoryResult extends AutocompleteItem {\n\t/** Task ID */\n\tid: string\n\t/** Task prompt/description */\n\ttask: string\n\t/** Timestamp when task was created */\n\tts: number\n\t/** Total cost of the task */\n\ttotalCost?: number\n\t/** Workspace path where task was run */\n\tworkspace?: string\n\t/** Mode the task was run in */\n\tmode?: string\n\t/** Task status */\n\tstatus?: \"active\" | \"completed\" | \"delegated\"\n}\n\n/**\n * Props for creating a history trigger\n */\nexport interface HistoryTriggerConfig {\n\t/**\n\t * Get all available history items for filtering.\n\t * Items are filtered locally using fuzzy search.\n\t */\n\tgetHistory: () => HistoryResult[]\n\t/**\n\t * Callback when a history item is selected.\n\t * Used to resume the task.\n\t */\n\tonSelect?: (item: HistoryResult) => void\n\t/**\n\t * Maximum number of results to show.\n\t * @default 15\n\t */\n\tmaxResults?: number\n}\n\n/**\n * Format a timestamp as a relative time string\n */\nfunction formatRelativeTime(ts: number): string {\n\tconst now = Date.now()\n\tconst diff = now - ts\n\n\tconst seconds = Math.floor(diff / 1000)\n\tconst minutes = Math.floor(seconds / 60)\n\tconst hours = Math.floor(minutes / 60)\n\tconst days = Math.floor(hours / 24)\n\n\tif (days > 0) {\n\t\treturn days === 1 ? \"1 day ago\" : `${days} days ago`\n\t}\n\tif (hours > 0) {\n\t\treturn hours === 1 ? \"1 hour ago\" : `${hours} hours ago`\n\t}\n\tif (minutes > 0) {\n\t\treturn minutes === 1 ? \"1 min ago\" : `${minutes} mins ago`\n\t}\n\treturn \"just now\"\n}\n\n/**\n * Truncate text to a maximum length with ellipsis\n */\nfunction truncate(text: string, maxLength: number): string {\n\tif (text.length <= maxLength) {\n\t\treturn text\n\t}\n\treturn text.substring(0, maxLength - 1) + \"…\"\n}\n\n/**\n * Create a history trigger for # task history.\n *\n * This trigger activates when the user types # at the start of a line,\n * and allows selecting from task history with local fuzzy filtering.\n *\n * @param config - Configuration for the trigger\n * @returns AutocompleteTrigger for history\n */\nexport function createHistoryTrigger(config: HistoryTriggerConfig): AutocompleteTrigger<HistoryResult> {\n\tconst { getHistory, maxResults = 15 } = config\n\n\treturn {\n\t\tid: \"history\",\n\t\ttriggerChar: \"#\",\n\t\tposition: \"line-start\",\n\n\t\tdetectTrigger: (lineText: string): TriggerDetectionResult | null => {\n\t\t\t// Check if line starts with # (after optional whitespace)\n\t\t\tconst trimmed = lineText.trimStart()\n\n\t\t\tif (!trimmed.startsWith(\"#\")) {\n\t\t\t\treturn null\n\t\t\t}\n\n\t\t\t// Extract query after #\n\t\t\tconst query = trimmed.substring(1)\n\n\t\t\t// Calculate trigger index (position of # in original line)\n\t\t\tconst triggerIndex = lineText.length - trimmed.length\n\n\t\t\treturn { query, triggerIndex }\n\t\t},\n\n\t\tsearch: (query: string): HistoryResult[] => {\n\t\t\tconst allHistory = getHistory()\n\n\t\t\tif (query.length === 0) {\n\t\t\t\t// Show most recent items when just \"#\" is typed (sorted by timestamp, newest first)\n\t\t\t\treturn allHistory.sort((a, b) => b.ts - a.ts).slice(0, maxResults)\n\t\t\t}\n\n\t\t\t// Fuzzy search by task description\n\t\t\tconst results = fuzzysort.go(query, allHistory, {\n\t\t\t\tkey: \"task\",\n\t\t\t\tlimit: maxResults,\n\t\t\t\tthreshold: -10000, // Be lenient with matching\n\t\t\t})\n\n\t\t\treturn results.map((result) => result.obj)\n\t\t},\n\n\t\trenderItem: (item: HistoryResult, isSelected: boolean) => {\n\t\t\t// Status indicator\n\t\t\tconst statusIcon = item.status === \"completed\" ? \"✓\" : item.status === \"active\" ? \"●\" : \"○\"\n\t\t\tconst statusColor = item.status === \"completed\" ? \"green\" : item.status === \"active\" ? \"yellow\" : \"gray\"\n\n\t\t\t// Mode indicator (if available)\n\t\t\tconst modeText = item.mode ? ` [${item.mode}]` : \"\"\n\n\t\t\t// Time ago\n\t\t\tconst timeAgo = formatRelativeTime(item.ts)\n\n\t\t\t// Truncate task to fit in picker\n\t\t\tconst truncatedTask = truncate(item.task.replace(/\\n/g, \" \"), 50)\n\n\t\t\treturn (\n\t\t\t\t<Box paddingLeft={2} flexDirection=\"row\">\n\t\t\t\t\t<Text color={isSelected ? \"cyan\" : undefined}>\n\t\t\t\t\t\t<Text color={statusColor}>{statusIcon}</Text> {truncatedTask}\n\t\t\t\t\t\t<Text dimColor>{modeText}</Text>\n\t\t\t\t\t\t<Text dimColor> • {timeAgo}</Text>\n\t\t\t\t\t</Text>\n\t\t\t\t</Box>\n\t\t\t)\n\t\t},\n\n\t\tgetReplacementText: (_item: HistoryResult, _lineText: string, _triggerIndex: number): string => {\n\t\t\t// Return empty string - we don't want to insert any text\n\t\t\t// The actual task resumption is handled via the onSelect callback\n\t\t\treturn \"\"\n\t\t},\n\n\t\temptyMessage: \"No task history found\",\n\t\tdebounceMs: 100,\n\t}\n}\n\n/**\n * Convert HistoryItem from @roo-code/types to HistoryResult.\n * Use this to adapt history items from the store to the trigger's expected type.\n */\nexport function toHistoryResult(item: {\n\tid: string\n\ttask: string\n\tts: number\n\ttotalCost?: number\n\tworkspace?: string\n\tmode?: string\n\tstatus?: \"active\" | \"completed\" | \"delegated\"\n}): HistoryResult {\n\treturn {\n\t\tkey: item.id, // Use task ID as the unique key\n\t\tid: item.id,\n\t\ttask: item.task,\n\t\tts: item.ts,\n\t\ttotalCost: item.totalCost,\n\t\tworkspace: item.workspace,\n\t\tmode: item.mode,\n\t\tstatus: item.status,\n\t}\n}\n","export { type FileResult, type FileTriggerConfig, createFileTrigger, toFileResult } from \"./FileTrigger.js\"\n\nexport {\n\ttype SlashCommandResult,\n\ttype SlashCommandTriggerConfig,\n\tcreateSlashCommandTrigger,\n\ttoSlashCommandResult,\n} from \"./SlashCommandTrigger.js\"\n\nexport { type ModeResult, type ModeTriggerConfig, createModeTrigger, toModeResult } from \"./ModeTrigger.js\"\n\nexport { type HelpShortcutResult, createHelpTrigger } from \"./HelpTrigger.js\"\n\nexport {\n\ttype HistoryResult,\n\ttype HistoryTriggerConfig,\n\tcreateHistoryTrigger,\n\ttoHistoryResult,\n} from \"./HistoryTrigger.js\"\n","/**\n * Autocomplete system for CLI input.\n *\n * This module provides a generic, extensible autocomplete system that supports\n * multiple trigger patterns (like @ for files, / for commands) through a\n * plugin-like trigger architecture.\n *\n * @example\n * ```tsx\n * import {\n * AutocompleteInput,\n * PickerSelect,\n * useAutocompletePicker,\n * createFileTrigger,\n * createSlashCommandTrigger,\n * } from './autocomplete'\n *\n * const triggers = [\n * createFileTrigger({ onSearch, getResults }),\n * createSlashCommandTrigger({ getCommands }),\n * ]\n *\n * <AutocompleteInput\n * triggers={triggers}\n * onSubmit={handleSubmit}\n * />\n * ```\n */\n\n// Main components\nexport { type AutocompleteInputProps, type AutocompleteInputHandle, AutocompleteInput } from \"./AutocompleteInput.js\"\nexport { type PickerSelectProps, PickerSelect } from \"./PickerSelect.js\"\n\n// Hook\nexport { useAutocompletePicker } from \"./useAutocompletePicker.js\"\n\n// Types\nexport * from \"./types.js\"\n\n// Triggers\nexport * from \"./triggers/index.js\"\n","import { Box, DOMElement, measureElement, Text, useInput } from \"ink\"\nimport { useEffect, useReducer, useRef, useCallback, useMemo, useState } from \"react\"\n\nimport * as theme from \"../theme.js\"\n\ninterface ScrollAreaState {\n\tinnerHeight: number\n\theight: number\n\tscrollTop: number\n\tautoScroll: boolean\n}\n\nfunction calculateScrollbar(\n\tviewportHeight: number,\n\tcontentHeight: number,\n\tscrollTop: number,\n): { handleStart: number; handleHeight: number; maxScroll: number } {\n\tconst maxScroll = Math.max(0, contentHeight - viewportHeight)\n\n\tif (contentHeight <= viewportHeight || maxScroll === 0) {\n\t\t// No scrolling needed - handle fills entire track\n\t\treturn { handleStart: 0, handleHeight: viewportHeight, maxScroll: 0 }\n\t}\n\n\t// Calculate handle height as ratio of viewport to content (minimum 1 line)\n\tconst handleHeight = Math.max(1, Math.round((viewportHeight / contentHeight) * viewportHeight))\n\n\t// Calculate handle position\n\tconst trackSpace = viewportHeight - handleHeight\n\tconst scrollRatio = maxScroll > 0 ? scrollTop / maxScroll : 0\n\tconst handleStart = Math.round(scrollRatio * trackSpace)\n\n\treturn { handleStart, handleHeight, maxScroll }\n}\n\ntype ScrollAreaAction =\n\t| { type: \"SET_INNER_HEIGHT\"; innerHeight: number }\n\t| { type: \"SET_HEIGHT\"; height: number }\n\t| { type: \"SCROLL_DOWN\"; amount?: number }\n\t| { type: \"SCROLL_UP\"; amount?: number }\n\t| { type: \"SCROLL_TO_BOTTOM\" }\n\t| { type: \"SCROLL_TO_LINE\"; line: number }\n\t| { type: \"SET_AUTO_SCROLL\"; autoScroll: boolean }\n\nfunction reducer(state: ScrollAreaState, action: ScrollAreaAction): ScrollAreaState {\n\tconst maxScroll = Math.max(0, state.innerHeight - state.height)\n\n\tswitch (action.type) {\n\t\tcase \"SET_INNER_HEIGHT\": {\n\t\t\tconst newMaxScroll = Math.max(0, action.innerHeight - state.height)\n\t\t\t// If auto-scroll is enabled and content grew, scroll to bottom\n\t\t\tif (state.autoScroll && action.innerHeight > state.innerHeight) {\n\t\t\t\treturn {\n\t\t\t\t\t...state,\n\t\t\t\t\tinnerHeight: action.innerHeight,\n\t\t\t\t\tscrollTop: newMaxScroll,\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Clamp scrollTop to valid range\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tinnerHeight: action.innerHeight,\n\t\t\t\tscrollTop: Math.min(state.scrollTop, newMaxScroll),\n\t\t\t}\n\t\t}\n\n\t\tcase \"SET_HEIGHT\": {\n\t\t\tconst newMaxScroll = Math.max(0, state.innerHeight - action.height)\n\t\t\t// If auto-scroll is enabled, stay at bottom\n\t\t\tif (state.autoScroll) {\n\t\t\t\treturn {\n\t\t\t\t\t...state,\n\t\t\t\t\theight: action.height,\n\t\t\t\t\tscrollTop: newMaxScroll,\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Clamp scrollTop to valid range\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\theight: action.height,\n\t\t\t\tscrollTop: Math.min(state.scrollTop, newMaxScroll),\n\t\t\t}\n\t\t}\n\n\t\tcase \"SCROLL_DOWN\": {\n\t\t\tconst amount = action.amount || 1\n\t\t\tconst newScrollTop = Math.min(maxScroll, state.scrollTop + amount)\n\t\t\t// If we scroll to the bottom, re-enable auto-scroll\n\t\t\tconst atBottom = newScrollTop >= maxScroll\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tscrollTop: newScrollTop,\n\t\t\t\tautoScroll: atBottom,\n\t\t\t}\n\t\t}\n\n\t\tcase \"SCROLL_UP\": {\n\t\t\tconst amount = action.amount || 1\n\t\t\tconst newScrollTop = Math.max(0, state.scrollTop - amount)\n\t\t\t// Disable auto-scroll when user scrolls up\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tscrollTop: newScrollTop,\n\t\t\t\tautoScroll: newScrollTop >= maxScroll,\n\t\t\t}\n\t\t}\n\n\t\tcase \"SCROLL_TO_BOTTOM\":\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tscrollTop: maxScroll,\n\t\t\t\tautoScroll: true,\n\t\t\t}\n\n\t\tcase \"SCROLL_TO_LINE\": {\n\t\t\t// Scroll to make a specific line visible\n\t\t\t// If line is above viewport, scroll up to show it at the top\n\t\t\t// If line is below viewport, scroll down to show it at the bottom\n\t\t\tconst line = action.line\n\t\t\tconst viewportBottom = state.scrollTop + state.height - 1\n\n\t\t\tif (line < state.scrollTop) {\n\t\t\t\t// Line is above viewport - scroll up to show it at the top\n\t\t\t\treturn {\n\t\t\t\t\t...state,\n\t\t\t\t\tscrollTop: Math.max(0, line),\n\t\t\t\t\tautoScroll: false,\n\t\t\t\t}\n\t\t\t} else if (line > viewportBottom) {\n\t\t\t\t// Line is below viewport - scroll down to show it at the bottom\n\t\t\t\tconst newScrollTop = Math.min(maxScroll, line - state.height + 1)\n\t\t\t\treturn {\n\t\t\t\t\t...state,\n\t\t\t\t\tscrollTop: newScrollTop,\n\t\t\t\t\tautoScroll: newScrollTop >= maxScroll,\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Line is already visible - no change needed\n\t\t\treturn state\n\t\t}\n\n\t\tcase \"SET_AUTO_SCROLL\":\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tautoScroll: action.autoScroll,\n\t\t\t\tscrollTop: action.autoScroll ? maxScroll : state.scrollTop,\n\t\t\t}\n\n\t\tdefault:\n\t\t\treturn state\n\t}\n}\n\nexport interface ScrollAreaProps {\n\theight?: number\n\tchildren: React.ReactNode\n\tisActive?: boolean\n\tonScroll?: (scrollTop: number, maxScroll: number, isAtBottom: boolean) => void\n\tshowBorder?: boolean\n\tscrollToBottomTrigger?: number\n\tscrollToLine?: number\n\tscrollToLineTrigger?: number\n\tshowScrollbar?: boolean\n\t/** Whether to auto-scroll to bottom when content grows. Default: true */\n\tautoScroll?: boolean\n}\n\nexport function ScrollArea({\n\theight: heightProp,\n\tchildren,\n\tisActive = true,\n\tonScroll,\n\tshowBorder = false,\n\tscrollToBottomTrigger,\n\tscrollToLine,\n\tscrollToLineTrigger,\n\tshowScrollbar = true,\n\tautoScroll: autoScrollProp = true,\n}: ScrollAreaProps) {\n\t// Ref for measuring outer container height when not provided\n\tconst outerRef = useRef<DOMElement>(null)\n\tconst [measuredHeight, setMeasuredHeight] = useState(0)\n\n\t// Use provided height or measured height\n\tconst height = heightProp ?? measuredHeight\n\n\tconst [state, dispatch] = useReducer(reducer, {\n\t\theight: height,\n\t\tscrollTop: 0,\n\t\tinnerHeight: 0,\n\t\tautoScroll: autoScrollProp,\n\t})\n\n\tconst innerRef = useRef<DOMElement>(null)\n\tconst lastMeasuredHeight = useRef<number>(0)\n\t// Track previous scrollToLineTrigger to detect actual changes (allows scrolling to index 0)\n\tconst prevScrollToLineTriggerRef = useRef<number | undefined>(undefined)\n\n\t// Update height when prop changes\n\tuseEffect(() => {\n\t\tif (height > 0) {\n\t\t\tdispatch({ type: \"SET_HEIGHT\", height })\n\t\t}\n\t}, [height])\n\n\t// Measure outer container height when no height prop is provided\n\tuseEffect(() => {\n\t\tif (heightProp !== undefined) return // Skip if height is provided\n\n\t\tconst measureOuter = () => {\n\t\t\tif (!outerRef.current) return\n\t\t\tconst dimensions = measureElement(outerRef.current)\n\t\t\tif (dimensions.height !== measuredHeight && dimensions.height > 0) {\n\t\t\t\tsetMeasuredHeight(dimensions.height)\n\t\t\t}\n\t\t}\n\n\t\t// Initial measurement\n\t\tmeasureOuter()\n\n\t\t// Re-measure periodically to catch layout changes\n\t\tconst interval = setInterval(measureOuter, 100)\n\n\t\treturn () => {\n\t\t\tclearInterval(interval)\n\t\t}\n\t}, [heightProp, measuredHeight])\n\n\t// Scroll to bottom when trigger changes\n\tuseEffect(() => {\n\t\tif (scrollToBottomTrigger !== undefined && scrollToBottomTrigger > 0) {\n\t\t\tdispatch({ type: \"SCROLL_TO_BOTTOM\" })\n\t\t}\n\t}, [scrollToBottomTrigger])\n\n\t// Scroll to specific line when trigger changes\n\t// FIX: Use ref to detect actual changes instead of `> 0` check, which broke scrolling to index 0\n\tuseEffect(() => {\n\t\tconst prevTrigger = prevScrollToLineTriggerRef.current\n\t\tconst triggerChanged = scrollToLineTrigger !== prevTrigger\n\n\t\t// Only dispatch if trigger actually changed and we have valid values\n\t\t// This allows scrolling to index 0 (which was broken by the old `> 0` check)\n\t\tif (triggerChanged && scrollToLineTrigger !== undefined && scrollToLine !== undefined) {\n\t\t\tdispatch({ type: \"SCROLL_TO_LINE\", line: scrollToLine })\n\t\t}\n\n\t\t// Update the ref to track the current trigger value\n\t\tprevScrollToLineTriggerRef.current = scrollToLineTrigger\n\t}, [scrollToLineTrigger, scrollToLine])\n\n\t// Measure inner content height - use MutationObserver pattern for dynamic content\n\tuseEffect(() => {\n\t\tif (!innerRef.current) return\n\n\t\tconst measureAndUpdate = () => {\n\t\t\tif (!innerRef.current) return\n\t\t\tconst dimensions = measureElement(innerRef.current)\n\t\t\tif (dimensions.height !== lastMeasuredHeight.current) {\n\t\t\t\tlastMeasuredHeight.current = dimensions.height\n\t\t\t\tdispatch({ type: \"SET_INNER_HEIGHT\", innerHeight: dimensions.height })\n\t\t\t}\n\t\t}\n\n\t\t// Initial measurement\n\t\tmeasureAndUpdate()\n\n\t\t// Re-measure periodically while component is mounted\n\t\t// This handles streaming content that changes size\n\t\tconst interval = setInterval(measureAndUpdate, 100)\n\n\t\treturn () => {\n\t\t\tclearInterval(interval)\n\t\t}\n\t}, [children])\n\n\t// Notify parent of scroll changes\n\tuseEffect(() => {\n\t\tif (onScroll) {\n\t\t\tconst maxScroll = Math.max(0, state.innerHeight - state.height)\n\t\t\tconst isAtBottom = state.scrollTop >= maxScroll || maxScroll === 0\n\t\t\tonScroll(state.scrollTop, maxScroll, isAtBottom)\n\t\t}\n\t}, [state.scrollTop, state.innerHeight, state.height, onScroll])\n\n\t// Handle keyboard input for scrolling\n\tuseInput(\n\t\t(_input, key) => {\n\t\t\tif (!isActive) return\n\n\t\t\tif (key.downArrow) {\n\t\t\t\tdispatch({ type: \"SCROLL_DOWN\" })\n\t\t\t}\n\n\t\t\tif (key.upArrow) {\n\t\t\t\tdispatch({ type: \"SCROLL_UP\" })\n\t\t\t}\n\n\t\t\tif (key.pageDown) {\n\t\t\t\tdispatch({ type: \"SCROLL_DOWN\", amount: Math.floor(state.height / 2) })\n\t\t\t}\n\n\t\t\tif (key.pageUp) {\n\t\t\t\tdispatch({ type: \"SCROLL_UP\", amount: Math.floor(state.height / 2) })\n\t\t\t}\n\n\t\t\t// Home - scroll to top\n\t\t\tif (key.ctrl && _input === \"a\") {\n\t\t\t\tdispatch({ type: \"SCROLL_UP\", amount: state.scrollTop })\n\t\t\t}\n\n\t\t\t// End - scroll to bottom\n\t\t\tif (key.ctrl && _input === \"e\") {\n\t\t\t\tdispatch({ type: \"SCROLL_TO_BOTTOM\" })\n\t\t\t}\n\t\t},\n\t\t{ isActive },\n\t)\n\n\t// Calculate scrollbar dimensions\n\tconst scrollbar = useMemo(() => {\n\t\treturn calculateScrollbar(state.height, state.innerHeight, state.scrollTop)\n\t}, [state.height, state.innerHeight, state.scrollTop])\n\n\t// Determine if scrollbar should be visible\n\t// Show scrollbar when: there's content to scroll, OR when focused (to indicate focus state)\n\t// Hide scrollbar only when: not focused AND nothing to scroll\n\tconst showScrollbarVisible = showScrollbar && (scrollbar.maxScroll > 0 || isActive)\n\n\t// Scrollbar colors based on focus state\n\t// When active: handle is bright purple, track is muted\n\t// When inactive: handle is dim gray, track is more muted\n\tconst handleColor = isActive ? theme.scrollActiveColor : theme.dimText\n\tconst trackColor = theme.scrollTrackColor\n\n\t// When no height prop is provided, use flexGrow to fill available space\n\tconst useFlexGrow = heightProp === undefined\n\n\treturn (\n\t\t<Box\n\t\t\tref={outerRef}\n\t\t\tflexDirection=\"row\"\n\t\t\theight={useFlexGrow ? undefined : height}\n\t\t\tflexGrow={useFlexGrow ? 1 : undefined}\n\t\t\tflexShrink={useFlexGrow ? 1 : undefined}\n\t\t\toverflow=\"hidden\">\n\t\t\t{/* Scroll content area */}\n\t\t\t<Box\n\t\t\t\theight={useFlexGrow ? undefined : height}\n\t\t\t\tborderStyle={showBorder ? \"single\" : undefined}\n\t\t\t\tflexDirection=\"column\"\n\t\t\t\tflexGrow={1}\n\t\t\t\tflexShrink={1}\n\t\t\t\toverflow=\"hidden\">\n\t\t\t\t<Box ref={innerRef} flexShrink={0} flexDirection=\"column\" marginTop={-state.scrollTop}>\n\t\t\t\t\t{children}\n\t\t\t\t</Box>\n\t\t\t</Box>\n\n\t\t\t{/* Scrollbar - rendered with separate colors for handle and track */}\n\t\t\t{showScrollbar && (\n\t\t\t\t<Box flexDirection=\"column\" width={1} flexShrink={0} overflow=\"hidden\">\n\t\t\t\t\t{showScrollbarVisible &&\n\t\t\t\t\t\theight > 0 &&\n\t\t\t\t\t\tArray(height)\n\t\t\t\t\t\t\t.fill(null)\n\t\t\t\t\t\t\t.map((_, i) => {\n\t\t\t\t\t\t\t\tconst isHandle =\n\t\t\t\t\t\t\t\t\ti >= scrollbar.handleStart && i < scrollbar.handleStart + scrollbar.handleHeight\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<Text key={i} color={isHandle ? handleColor : trackColor}>\n\t\t\t\t\t\t\t\t\t\t{isHandle ? \"┃\" : \"│\"}\n\t\t\t\t\t\t\t\t\t</Text>\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t})}\n\t\t\t\t</Box>\n\t\t\t)}\n\t\t</Box>\n\t)\n}\n\n/**\n * Hook to use with ScrollArea for external control\n */\nexport function useScrollToBottom() {\n\tconst triggerRef = useRef(0)\n\tconst [, forceUpdate] = useReducer((x) => x + 1, 0)\n\n\tconst scrollToBottom = useCallback(() => {\n\t\ttriggerRef.current += 1\n\t\tforceUpdate()\n\t}, [])\n\n\treturn {\n\t\tscrollToBottomTrigger: triggerRef.current,\n\t\tscrollToBottom,\n\t}\n}\n","import { Box, Text } from \"ink\"\nimport { memo } from \"react\"\n\nimport * as theme from \"../theme.js\"\n\ninterface ScrollIndicatorProps {\n\tscrollTop: number\n\tmaxScroll: number\n\tisScrollFocused?: boolean\n}\n\nfunction ScrollIndicator({ scrollTop, maxScroll, isScrollFocused = false }: ScrollIndicatorProps) {\n\t// Calculate percentage - show 100% when at bottom or no scrolling needed.\n\tconst percentage = maxScroll > 0 ? Math.round((scrollTop / maxScroll) * 100) : 100\n\n\t// Color changes based on focus state.\n\tconst color = isScrollFocused ? theme.scrollActiveColor : theme.dimText\n\n\treturn (\n\t\t<Box>\n\t\t\t<Text color={color}>{percentage}% • ↑↓ scroll • Ctrl+E end</Text>\n\t\t</Box>\n\t)\n}\n\nexport default memo(ScrollIndicator)\n","import { Box, Text, useApp, useInput } from \"ink\"\r\nimport Select from \"./components/Select.js\"\r\nimport { useState, useEffect, useCallback, useRef, useMemo } from \"react\"\r\n\r\nimport { ExtensionHostInterface, ExtensionHostOptions } from \"../agent/index.js\"\r\n\r\nimport { getGlobalCommandsForAutocomplete } from \"../lib/utils/commands.js\"\r\nimport { arePathsEqual } from \"../lib/utils/path.js\"\r\nimport { getContextWindow } from \"../lib/utils/context-window.js\"\r\n\r\nimport * as theme from \"./theme.js\"\r\nimport { useCLIStore } from \"./store.js\"\r\nimport { useUIStateStore } from \"./stores/uiStateStore.js\"\r\n\r\n// Import extracted hooks.\r\nimport {\r\n\tTerminalSizeProvider,\r\n\tuseTerminalSize,\r\n\tuseToast,\r\n\tuseExtensionHost,\r\n\tuseMessageHandlers,\r\n\tuseTaskSubmit,\r\n\tuseGlobalInput,\r\n\tuseFollowupCountdown,\r\n\tuseFocusManagement,\r\n\tusePickerHandlers,\r\n} from \"./hooks/index.js\"\r\n\r\n// Import extracted utilities.\r\nimport { getView } from \"./utils/index.js\"\r\n\r\n// Import components.\r\nimport Header from \"./components/Header.js\"\r\nimport ChatHistoryItem from \"./components/ChatHistoryItem.js\"\r\nimport LoadingText from \"./components/LoadingText.js\"\r\nimport ToastDisplay from \"./components/ToastDisplay.js\"\r\nimport TodoDisplay from \"./components/TodoDisplay.js\"\r\nimport { HorizontalLine } from \"./components/HorizontalLine.js\"\r\nimport {\r\n\ttype AutocompleteInputHandle,\r\n\ttype AutocompleteTrigger,\r\n\ttype FileResult,\r\n\ttype SlashCommandResult,\r\n\tAutocompleteInput,\r\n\tPickerSelect,\r\n\tcreateFileTrigger,\r\n\tcreateSlashCommandTrigger,\r\n\tcreateModeTrigger,\r\n\tcreateHelpTrigger,\r\n\tcreateHistoryTrigger,\r\n\ttoFileResult,\r\n\ttoSlashCommandResult,\r\n\ttoModeResult,\r\n\ttoHistoryResult,\r\n} from \"./components/autocomplete/index.js\"\r\nimport { ScrollArea, useScrollToBottom } from \"./components/ScrollArea.js\"\r\nimport ScrollIndicator from \"./components/ScrollIndicator.js\"\r\n\r\nconst PICKER_HEIGHT = 10\r\n\r\nexport interface TUIAppProps extends ExtensionHostOptions {\r\n\tinitialPrompt?: string\r\n\tinitialTaskId?: string\r\n\tinitialSessionId?: string\r\n\tcontinueSession?: boolean\r\n\tversion: string\r\n\t// Create extension host factory for dependency injection.\r\n\tcreateExtensionHost: (options: ExtensionHostOptions) => ExtensionHostInterface\r\n}\r\n\r\n/**\r\n * Inner App component that uses the terminal size context\r\n */\r\nfunction AppInner({ createExtensionHost, ...extensionHostOptions }: TUIAppProps) {\r\n\tconst {\r\n\t\tinitialPrompt,\r\n\t\tinitialTaskId,\r\n\t\tinitialSessionId,\r\n\t\tcontinueSession,\r\n\t\tworkspacePath,\r\n\t\textensionPath,\r\n\t\tuser,\r\n\t\tprovider,\r\n\t\tapiKey,\r\n\t\tmodel,\r\n\t\tmode,\r\n\t\tnonInteractive = false,\r\n\t\tdebug,\r\n\t\texitOnComplete,\r\n\t\treasoningEffort,\r\n\t\tephemeral,\r\n\t\tversion,\r\n\t} = extensionHostOptions\r\n\r\n\tconst { exit } = useApp()\r\n\r\n\tconst {\r\n\t\tmessages,\r\n\t\tpendingAsk,\r\n\t\tisLoading,\r\n\t\tisComplete,\r\n\t\thasStartedTask: _hasStartedTask,\r\n\t\terror,\r\n\t\tfileSearchResults,\r\n\t\tallSlashCommands,\r\n\t\tavailableModes,\r\n\t\ttaskHistory,\r\n\t\tcurrentMode,\r\n\t\ttokenUsage,\r\n\t\trouterModels,\r\n\t\tapiConfiguration,\r\n\t\tcurrentTodos,\r\n\t} = useCLIStore()\r\n\r\n\t// Access UI state from the UI store\r\n\tconst {\r\n\t\tshowExitHint,\r\n\t\tcountdownSeconds,\r\n\t\tshowCustomInput,\r\n\t\tisTransitioningToCustomInput,\r\n\t\tshowTodoViewer,\r\n\t\tpickerState,\r\n\t\tsetIsTransitioningToCustomInput,\r\n\t} = useUIStateStore()\r\n\r\n\t// Compute context window from router models and API configuration\r\n\tconst contextWindow = useMemo(() => {\r\n\t\treturn getContextWindow(routerModels, apiConfiguration)\r\n\t}, [routerModels, apiConfiguration])\r\n\r\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n\tconst autocompleteRef = useRef<AutocompleteInputHandle<any>>(null)\r\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n\tconst followupAutocompleteRef = useRef<AutocompleteInputHandle<any>>(null)\r\n\r\n\t// Stable refs for autocomplete data - prevents useMemo from recreating triggers on every data change\r\n\tconst fileSearchResultsRef = useRef(fileSearchResults)\r\n\tconst allSlashCommandsRef = useRef(allSlashCommands)\r\n\tconst availableModesRef = useRef(availableModes)\r\n\tconst taskHistoryRef = useRef(taskHistory)\r\n\r\n\t// Keep refs in sync with current state\r\n\tuseEffect(() => {\r\n\t\tfileSearchResultsRef.current = fileSearchResults\r\n\t}, [fileSearchResults])\r\n\tuseEffect(() => {\r\n\t\tallSlashCommandsRef.current = allSlashCommands\r\n\t}, [allSlashCommands])\r\n\tuseEffect(() => {\r\n\t\tavailableModesRef.current = availableModes\r\n\t}, [availableModes])\r\n\tuseEffect(() => {\r\n\t\ttaskHistoryRef.current = taskHistory\r\n\t}, [taskHistory])\r\n\r\n\t// Scroll area state\r\n\tconst { rows } = useTerminalSize()\r\n\tconst [scrollState, setScrollState] = useState({ scrollTop: 0, maxScroll: 0, isAtBottom: true })\r\n\tconst { scrollToBottomTrigger, scrollToBottom } = useScrollToBottom()\r\n\r\n\t// RAF-style throttle refs for scroll updates (prevents multiple state updates per event loop tick).\r\n\tconst rafIdRef = useRef<NodeJS.Immediate | null>(null)\r\n\tconst pendingScrollRef = useRef<{ scrollTop: number; maxScroll: number; isAtBottom: boolean } | null>(null)\r\n\r\n\t// Toast notifications for ephemeral messages (e.g., mode changes).\r\n\tconst { currentToast, showInfo } = useToast()\r\n\r\n\tconst {\r\n\t\thandleExtensionMessage,\r\n\t\tseenMessageIds,\r\n\t\tpendingCommandRef: _pendingCommandRef,\r\n\t\tfirstTextMessageSkipped,\r\n\t} = useMessageHandlers({\r\n\t\tnonInteractive,\r\n\t})\r\n\r\n\tconst { sendToExtension, runTask, cleanup } = useExtensionHost({\r\n\t\tinitialPrompt,\r\n\t\tinitialTaskId,\r\n\t\tinitialSessionId,\r\n\t\tcontinueSession,\r\n\t\tmode,\r\n\t\treasoningEffort,\r\n\t\tuser,\r\n\t\tprovider,\r\n\t\tapiKey,\r\n\t\tmodel,\r\n\t\tworkspacePath,\r\n\t\textensionPath,\r\n\t\tdebug,\r\n\t\tnonInteractive,\r\n\t\tephemeral,\r\n\t\texitOnComplete,\r\n\t\tonExtensionMessage: handleExtensionMessage,\r\n\t\tcreateExtensionHost,\r\n\t})\r\n\r\n\t// Initialize task submit hook\r\n\tconst { handleSubmit, handleApprove, handleReject } = useTaskSubmit({\r\n\t\tsendToExtension,\r\n\t\trunTask,\r\n\t\tseenMessageIds,\r\n\t\tfirstTextMessageSkipped,\r\n\t})\r\n\r\n\t// Initialize focus management hook\r\n\tconst { canToggleFocus, isScrollAreaActive, isInputAreaActive, toggleFocus } = useFocusManagement({\r\n\t\tshowApprovalPrompt: Boolean(pendingAsk && pendingAsk.type !== \"followup\"),\r\n\t\tpendingAsk,\r\n\t})\r\n\r\n\t// Initialize countdown hook for followup auto-accept\r\n\tconst { cancelCountdown } = useFollowupCountdown({\r\n\t\tpendingAsk,\r\n\t\tonAutoSubmit: handleSubmit,\r\n\t})\r\n\r\n\t// Initialize picker handlers hook\r\n\tconst { handlePickerStateChange, handlePickerSelect, handlePickerClose, handlePickerIndexChange } =\r\n\t\tusePickerHandlers({\r\n\t\t\tautocompleteRef,\r\n\t\t\tfollowupAutocompleteRef,\r\n\t\t\tsendToExtension,\r\n\t\t\tshowInfo,\r\n\t\t\tseenMessageIds,\r\n\t\t\tfirstTextMessageSkipped,\r\n\t\t})\r\n\r\n\t// Initialize global input hook\r\n\tuseGlobalInput({\r\n\t\tcanToggleFocus,\r\n\t\tisScrollAreaActive,\r\n\t\tpickerIsOpen: pickerState.isOpen,\r\n\t\tavailableModes,\r\n\t\tcurrentMode,\r\n\t\tmode,\r\n\t\tsendToExtension,\r\n\t\tshowInfo,\r\n\t\texit,\r\n\t\tcleanup,\r\n\t\ttoggleFocus,\r\n\t\tclosePicker: handlePickerClose,\r\n\t})\r\n\r\n\t// Determine current view\r\n\tconst view = getView(messages, pendingAsk, isLoading)\r\n\r\n\t// Determine if we should show the approval prompt (Y/N) instead of text input\r\n\tconst showApprovalPrompt = pendingAsk && pendingAsk.type !== \"followup\"\r\n\r\n\t// Display all messages including partial (streaming) ones\r\n\tconst displayMessages = useMemo(() => {\r\n\t\treturn messages\r\n\t}, [messages])\r\n\r\n\t// Scroll to bottom when new messages arrive (if auto-scroll is enabled)\r\n\tconst prevMessageCount = useRef(messages.length)\r\n\tuseEffect(() => {\r\n\t\tif (messages.length > prevMessageCount.current && scrollState.isAtBottom) {\r\n\t\t\tscrollToBottom()\r\n\t\t}\r\n\t\tprevMessageCount.current = messages.length\r\n\t}, [messages.length, scrollState.isAtBottom, scrollToBottom])\r\n\r\n\t// Handle scroll state changes from ScrollArea (RAF-throttled to coalesce rapid updates)\r\n\tconst handleScroll = useCallback((scrollTop: number, maxScroll: number, isAtBottom: boolean) => {\r\n\t\t// Store the latest scroll values in ref\r\n\t\tpendingScrollRef.current = { scrollTop, maxScroll, isAtBottom }\r\n\r\n\t\t// Only schedule one update per event loop tick\r\n\t\tif (rafIdRef.current === null) {\r\n\t\t\trafIdRef.current = setImmediate(() => {\r\n\t\t\t\trafIdRef.current = null\r\n\t\t\t\tconst pending = pendingScrollRef.current\r\n\t\t\t\tif (pending) {\r\n\t\t\t\t\tsetScrollState(pending)\r\n\t\t\t\t\tpendingScrollRef.current = null\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t}\r\n\t}, [])\r\n\r\n\t// Cleanup RAF-style timer on unmount\r\n\tuseEffect(() => {\r\n\t\treturn () => {\r\n\t\t\tif (rafIdRef.current !== null) {\r\n\t\t\t\tclearImmediate(rafIdRef.current)\r\n\t\t\t}\r\n\t\t}\r\n\t}, [])\r\n\r\n\t// Auto-respond to followup prompts in YOLO mode or skip \"Get started\" when no initial prompt provided\r\n\tuseEffect(() => {\r\n\t\tif (pendingAsk && pendingAsk.type === \"followup\") {\r\n\t\t\tconst content = pendingAsk.content.trim().toLowerCase()\r\n\t\t\tconst isGetStartedMessage = content.includes(\"get started\")\r\n\t\t\tconst shouldAutoRespond =\r\n\t\t\t\t(nonInteractive && pendingAsk.type === \"followup\") || (!initialPrompt && isGetStartedMessage)\r\n\r\n\t\t\tif (shouldAutoRespond) {\r\n\t\t\t\tconst autoResponse = pendingAsk.suggestions && pendingAsk.suggestions.length > 0\r\n\t\t\t\t\t? pendingAsk.suggestions[0].answer\r\n\t\t\t\t\t: \"\"\r\n\t\t\t\t// Submit the auto-response without waiting for user input\r\n\t\t\t\thandleSubmit(autoResponse).catch((err) => {\r\n\t\t\t\t\tconsole.error(\"[CLI] Auto-respond failed:\", err)\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t}\r\n\t}, [pendingAsk, nonInteractive, initialPrompt, handleSubmit])\r\n\r\n\t// Auto-approve tool calls in YOLO mode (nonInteractive)\r\n\tuseEffect(() => {\r\n\t\tif (pendingAsk && nonInteractive && pendingAsk.type !== \"followup\") {\r\n\t\t\t// Automatically approve the tool call\r\n\t\t\thandleApprove().catch((err) => {\r\n\t\t\t\tconsole.error(\"[CLI] Auto-approve failed:\", err)\r\n\t\t\t})\r\n\t\t}\r\n\t}, [pendingAsk, nonInteractive, handleApprove])\r\n\r\n\t// File search handler for the file trigger\r\n\tconst handleFileSearch = useCallback(\r\n\t\t(query: string) => {\r\n\t\t\tif (!sendToExtension) {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\t\t\tsendToExtension({ type: \"searchFiles\", query })\r\n\t\t},\r\n\t\t[sendToExtension],\r\n\t)\r\n\r\n\t// Create autocomplete triggers\r\n\t// Using 'any' to allow mixing different trigger types (FileResult, SlashCommandResult, ModeResult, HelpShortcutResult, HistoryResult)\r\n\t// IMPORTANT: We use refs here to avoid recreating triggers every time data changes.\r\n\t// This prevents the UI flash caused by: data change -> memo recreation -> re-render with stale state\r\n\t// The getResults/getCommands/getModes/getHistory callbacks always read from refs to get fresh data.\r\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n\tconst autocompleteTriggers = useMemo((): AutocompleteTrigger<any>[] => {\r\n\t\tconst fileTrigger = createFileTrigger({\r\n\t\t\tonSearch: handleFileSearch,\r\n\t\t\tgetResults: () => {\r\n\t\t\t\tconst results = fileSearchResultsRef.current\r\n\t\t\t\treturn results.map(toFileResult)\r\n\t\t\t},\r\n\t\t})\r\n\r\n\t\tconst slashCommandTrigger = createSlashCommandTrigger({\r\n\t\t\tgetCommands: () => {\r\n\t\t\t\t// Merge CLI global commands with extension commands\r\n\t\t\t\tconst extensionCommands = allSlashCommandsRef.current.map(toSlashCommandResult)\r\n\t\t\t\tconst globalCommands = getGlobalCommandsForAutocomplete().map(toSlashCommandResult)\r\n\t\t\t\t// Global commands appear first, then extension commands\r\n\t\t\t\treturn [...globalCommands, ...extensionCommands]\r\n\t\t\t},\r\n\t\t})\r\n\r\n\t\tconst modeTrigger = createModeTrigger({\r\n\t\t\tgetModes: () => availableModesRef.current.map(toModeResult),\r\n\t\t})\r\n\r\n\t\tconst helpTrigger = createHelpTrigger()\r\n\r\n\t\t// History trigger - type # to search and resume previous tasks\r\n\t\tconst historyTrigger = createHistoryTrigger({\r\n\t\t\tgetHistory: () => {\r\n\t\t\t\t// Filter to only show tasks for the current workspace\r\n\t\t\t\t// Use arePathsEqual for proper cross-platform path comparison\r\n\t\t\t\t// (handles trailing slashes, separators, and case sensitivity)\r\n\t\t\t\tconst history = taskHistoryRef.current\r\n\t\t\t\tconst filtered = history.filter((item) => arePathsEqual(item.workspace, workspacePath))\r\n\t\t\t\treturn filtered.map(toHistoryResult)\r\n\t\t\t},\r\n\t\t})\r\n\r\n\t\treturn [fileTrigger, slashCommandTrigger, modeTrigger, helpTrigger, historyTrigger]\r\n\t}, [handleFileSearch, workspacePath]) // Only depend on handleFileSearch and workspacePath - data accessed via refs\r\n\r\n\t// Refresh search results when fileSearchResults changes while file picker is open\r\n\t// This handles the async timing where API results arrive after initial search\r\n\t// IMPORTANT: Only run when fileSearchResults array identity changes (new API response)\r\n\t// We use a ref to track this and avoid depending on pickerState in the effect\r\n\tconst prevFileSearchResultsRef = useRef(fileSearchResults)\r\n\tconst pickerStateRef = useRef(pickerState)\r\n\tpickerStateRef.current = pickerState\r\n\r\n\tuseEffect(() => {\r\n\t\t// Only run if fileSearchResults actually changed (different array reference)\r\n\t\tif (fileSearchResults === prevFileSearchResultsRef.current) {\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tconst currentPickerState = pickerStateRef.current\r\n\t\tconst willRefresh =\r\n\t\t\tcurrentPickerState.isOpen && currentPickerState.activeTrigger?.id === \"file\" && fileSearchResults.length > 0\r\n\r\n\t\tprevFileSearchResultsRef.current = fileSearchResults\r\n\r\n\t\t// Only refresh when file picker is open and we have new results\r\n\t\tif (willRefresh) {\r\n\t\t\tautocompleteRef.current?.refreshSearch()\r\n\t\t\tfollowupAutocompleteRef.current?.refreshSearch()\r\n\t\t}\r\n\t}, [fileSearchResults]) // Only depend on fileSearchResults - read pickerState from ref\r\n\r\n\t// Handle Y/N input for approval prompts\r\n\tuseInput((input) => {\r\n\t\tif (pendingAsk && pendingAsk.type !== \"followup\") {\r\n\t\t\tconst lower = input.toLowerCase()\r\n\r\n\t\t\tif (lower === \"y\") {\r\n\t\t\t\thandleApprove()\r\n\t\t\t} else if (lower === \"n\") {\r\n\t\t\t\thandleReject()\r\n\t\t\t}\r\n\t\t}\r\n\t})\r\n\r\n\t// Cancel countdown timer when user navigates in the followup suggestion menu\r\n\t// This provides better UX - any user interaction cancels the auto-accept timer\r\n\tconst showFollowupSuggestions =\r\n\t\tpendingAsk?.type === \"followup\" &&\r\n\t\tpendingAsk.suggestions &&\r\n\t\tpendingAsk.suggestions.length > 0 &&\r\n\t\t!showCustomInput\r\n\r\n\tuseInput((_input, key) => {\r\n\t\t// Only handle when followup suggestions are shown and countdown is active\r\n\t\tif (showFollowupSuggestions && countdownSeconds !== null) {\r\n\t\t\t// Cancel countdown on any arrow key navigation\r\n\t\t\tif (key.upArrow || key.downArrow) {\r\n\t\t\t\tcancelCountdown()\r\n\t\t\t}\r\n\t\t}\r\n\t})\r\n\r\n\t// Exit the TUI when the task is completed and exitOnComplete is true\r\n\tuseEffect(() => {\r\n\t\tif (isComplete && extensionHostOptions.exitOnComplete) {\r\n\t\t\t// Small delay to ensure final output is rendered\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\texit()\r\n\t\t\t}, 100)\r\n\t\t}\r\n\t}, [isComplete, extensionHostOptions.exitOnComplete, exit])\r\n\r\n\t// Error display\r\n\tif (error) {\r\n\t\treturn (\r\n\t\t\t<Box flexDirection=\"column\" padding={1}>\r\n\t\t\t\t<Text color=\"red\" bold>\r\n\t\t\t\t\tError: {error}\r\n\t\t\t\t</Text>\r\n\t\t\t\t<Text color=\"gray\" dimColor>\r\n\t\t\t\t\tPress Ctrl+C to exit\r\n\t\t\t\t</Text>\r\n\t\t\t</Box>\r\n\t\t)\r\n\t}\r\n\r\n\t// Status bar content\r\n\t// Priority: Toast > Exit hint > Loading > Scroll indicator > Input hint\r\n\t// Don't show spinner when waiting for user input (pendingAsk is set)\r\n\tconst statusBarMessage = currentToast ? (\r\n\t\t<ToastDisplay toast={currentToast} />\r\n\t) : showExitHint ? (\r\n\t\t<Text color=\"yellow\">Press Ctrl+C again to exit</Text>\r\n\t) : isLoading && !pendingAsk ? (\r\n\t\t<Box>\r\n\t\t\t<LoadingText>{view === \"ToolUse\" ? \"Using tool\" : \"Thinking\"}</LoadingText>\r\n\t\t\t<Text color={theme.dimText}> • </Text>\r\n\t\t\t<Text color={theme.dimText}>Esc to cancel</Text>\r\n\t\t\t{isScrollAreaActive && (\r\n\t\t\t\t<>\r\n\t\t\t\t\t<Text color={theme.dimText}> • </Text>\r\n\t\t\t\t\t<ScrollIndicator\r\n\t\t\t\t\t\tscrollTop={scrollState.scrollTop}\r\n\t\t\t\t\t\tmaxScroll={scrollState.maxScroll}\r\n\t\t\t\t\t\tisScrollFocused={true}\r\n\t\t\t\t\t/>\r\n\t\t\t\t</>\r\n\t\t\t)}\r\n\t\t</Box>\r\n\t) : isScrollAreaActive ? (\r\n\t\t<ScrollIndicator scrollTop={scrollState.scrollTop} maxScroll={scrollState.maxScroll} isScrollFocused={true} />\r\n\t) : isInputAreaActive ? (\r\n\t\t<Text color={theme.dimText}>? for shortcuts</Text>\r\n\t) : null\r\n\r\n\tconst getPickerRenderItem = () => {\r\n\t\tif (pickerState.activeTrigger) {\r\n\t\t\treturn pickerState.activeTrigger.renderItem\r\n\t\t}\r\n\r\n\t\treturn (item: FileResult | SlashCommandResult, isSelected: boolean) => (\r\n\t\t\t<Box paddingLeft={2}>\r\n\t\t\t\t<Text color={isSelected ? \"cyan\" : undefined}>{item.key}</Text>\r\n\t\t\t</Box>\r\n\t\t)\r\n\t}\r\n\r\n\treturn (\r\n\t\t<Box flexDirection=\"column\" height={rows - 1}>\r\n\t\t\t{/* Header - fixed size */}\r\n\t\t\t<Box flexShrink={0}>\r\n\t\t\t\t<Header\r\n\t\t\t\t\t{...extensionHostOptions}\r\n\t\t\t\t\tmode={currentMode || mode}\r\n\t\t\t\t\tversion={version}\r\n\t\t\t\t\ttokenUsage={tokenUsage}\r\n\t\t\t\t\tcontextWindow={contextWindow}\r\n\t\t\t\t/>\r\n\t\t\t</Box>\r\n\r\n\t\t\t{/* Scrollable message history area - fills remaining space via flexGrow */}\r\n\t\t\t<ScrollArea\r\n\t\t\t\tisActive={isScrollAreaActive}\r\n\t\t\t\tonScroll={handleScroll}\r\n\t\t\t\tscrollToBottomTrigger={scrollToBottomTrigger}>\r\n\t\t\t\t{displayMessages.map((message) => (\r\n\t\t\t\t\t<ChatHistoryItem key={message.id} message={message} />\r\n\t\t\t\t))}\r\n\t\t\t</ScrollArea>\r\n\r\n\t\t\t{/* Input area - with borders like Claude Code - fixed size */}\r\n\t\t\t<Box flexDirection=\"column\" flexShrink={0}>\r\n\t\t\t\t{pendingAsk?.type === \"followup\" ? (\r\n\t\t\t\t\t<Box flexDirection=\"column\">\r\n\t\t\t\t\t\t<Text color={theme.rooHeader}>{pendingAsk.content}</Text>\r\n\t\t\t\t\t\t{pendingAsk.suggestions && pendingAsk.suggestions.length > 0 && !showCustomInput ? (\r\n\t\t\t\t\t\t\t<Box flexDirection=\"column\" marginTop={1}>\r\n\t\t\t\t\t\t\t\t<HorizontalLine active={true} />\r\n\t\t\t\t\t\t\t\t<Select\r\n\t\t\t\t\t\t\t\t\toptions={[\r\n\t\t\t\t\t\t\t\t\t\t...pendingAsk.suggestions.map((s) => ({\r\n\t\t\t\t\t\t\t\t\t\t\tlabel: s.answer,\r\n\t\t\t\t\t\t\t\t\t\t\tvalue: s.answer,\r\n\t\t\t\t\t\t\t\t\t\t})),\r\n\t\t\t\t\t\t\t\t\t\t{ label: \"Type something...\", value: \"__CUSTOM__\" },\r\n\t\t\t\t\t\t\t\t\t]}\r\n\t\t\t\t\t\t\t\t\tonChange={(value) => {\r\n\t\t\t\t\t\t\t\t\t\tif (!value || typeof value !== \"string\") return\r\n\t\t\t\t\t\t\t\t\t\tif (showCustomInput || isTransitioningToCustomInput) return\r\n\r\n\t\t\t\t\t\t\t\t\t\tif (value === \"__CUSTOM__\") {\r\n\t\t\t\t\t\t\t\t\t\t\t// Clear countdown timer and switch to custom input\r\n\t\t\t\t\t\t\t\t\t\t\tcancelCountdown()\r\n\t\t\t\t\t\t\t\t\t\t\tsetIsTransitioningToCustomInput(true)\r\n\t\t\t\t\t\t\t\t\t\t\tuseUIStateStore.getState().setShowCustomInput(true)\r\n\t\t\t\t\t\t\t\t\t\t} else if (value.trim()) {\r\n\t\t\t\t\t\t\t\t\t\t\thandleSubmit(value)\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t<HorizontalLine active={true} />\r\n\t\t\t\t\t\t\t\t<Text color={theme.dimText}>\r\n\t\t\t\t\t\t\t\t\t↑↓ navigate • Enter select\r\n\t\t\t\t\t\t\t\t\t{countdownSeconds !== null && (\r\n\t\t\t\t\t\t\t\t\t\t<Text color=\"yellow\"> • Auto-select in {countdownSeconds}s</Text>\r\n\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t</Text>\r\n\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t<Box flexDirection=\"column\" marginTop={1}>\r\n\t\t\t\t\t\t\t\t<HorizontalLine active={isInputAreaActive} />\r\n\t\t\t\t\t\t\t\t<AutocompleteInput\r\n\t\t\t\t\t\t\t\t\tref={followupAutocompleteRef}\r\n\t\t\t\t\t\t\t\t\tplaceholder=\"Type your response...\"\r\n\t\t\t\t\t\t\t\t\tonSubmit={(text: string) => {\r\n\t\t\t\t\t\t\t\t\t\tif (text && text.trim()) {\r\n\t\t\t\t\t\t\t\t\t\t\thandleSubmit(text)\r\n\t\t\t\t\t\t\t\t\t\t\tuseUIStateStore.getState().setShowCustomInput(false)\r\n\t\t\t\t\t\t\t\t\t\t\tsetIsTransitioningToCustomInput(false)\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\t\tisActive={true}\r\n\t\t\t\t\t\t\t\t\ttriggers={autocompleteTriggers}\r\n\t\t\t\t\t\t\t\t\tonPickerStateChange={handlePickerStateChange}\r\n\t\t\t\t\t\t\t\t\tprompt=\"> \"\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t<HorizontalLine active={isInputAreaActive} />\r\n\t\t\t\t\t\t\t\t{pickerState.isOpen ? (\r\n\t\t\t\t\t\t\t\t\t<Box flexDirection=\"column\" height={PICKER_HEIGHT}>\r\n\t\t\t\t\t\t\t\t\t\t<PickerSelect\r\n\t\t\t\t\t\t\t\t\t\t\tresults={pickerState.results}\r\n\t\t\t\t\t\t\t\t\t\t\tselectedIndex={pickerState.selectedIndex}\r\n\t\t\t\t\t\t\t\t\t\t\tmaxVisible={PICKER_HEIGHT - 1}\r\n\t\t\t\t\t\t\t\t\t\t\tonSelect={handlePickerSelect}\r\n\t\t\t\t\t\t\t\t\t\t\tonEscape={handlePickerClose}\r\n\t\t\t\t\t\t\t\t\t\t\tonIndexChange={handlePickerIndexChange}\r\n\t\t\t\t\t\t\t\t\t\t\trenderItem={getPickerRenderItem()}\r\n\t\t\t\t\t\t\t\t\t\t\temptyMessage={pickerState.activeTrigger?.emptyMessage}\r\n\t\t\t\t\t\t\t\t\t\t\tisActive={isInputAreaActive && pickerState.isOpen}\r\n\t\t\t\t\t\t\t\t\t\t\tisLoading={pickerState.isLoading}\r\n\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\t\t<Box height={1}>{statusBarMessage}</Box>\r\n\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t) : showApprovalPrompt ? (\r\n\t\t\t\t\t<Box flexDirection=\"column\">\r\n\t\t\t\t\t\t<Text color={theme.rooHeader}>{pendingAsk?.content}</Text>\r\n\t\t\t\t\t\t<Text color={theme.dimText}>\r\n\t\t\t\t\t\t\tPress <Text color={theme.successColor}>Y</Text> to approve,{\" \"}\r\n\t\t\t\t\t\t\t<Text color={theme.errorColor}>N</Text> to reject\r\n\t\t\t\t\t\t</Text>\r\n\t\t\t\t\t\t<Box height={1}>{statusBarMessage}</Box>\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t) : (\r\n\t\t\t\t\t<Box flexDirection=\"column\">\r\n\t\t\t\t\t\t<HorizontalLine active={isInputAreaActive} />\r\n\t\t\t\t\t\t<AutocompleteInput\r\n\t\t\t\t\t\t\tref={autocompleteRef}\r\n\t\t\t\t\t\t\tplaceholder={isComplete ? \"Type to continue...\" : \"\"}\r\n\t\t\t\t\t\t\tonSubmit={handleSubmit}\r\n\t\t\t\t\t\t\tisActive={isInputAreaActive}\r\n\t\t\t\t\t\t\ttriggers={autocompleteTriggers}\r\n\t\t\t\t\t\t\tonPickerStateChange={handlePickerStateChange}\r\n\t\t\t\t\t\t\tprompt=\"› \"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t<HorizontalLine active={isInputAreaActive} />\r\n\t\t\t\t\t\t{showTodoViewer ? (\r\n\t\t\t\t\t\t\t<Box flexDirection=\"column\" height={PICKER_HEIGHT}>\r\n\t\t\t\t\t\t\t\t<TodoDisplay todos={currentTodos} showProgress={true} title=\"TODO List\" />\r\n\t\t\t\t\t\t\t\t<Box height={1}>\r\n\t\t\t\t\t\t\t\t\t<Text color={theme.dimText}>Ctrl+T to close</Text>\r\n\t\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t) : pickerState.isOpen ? (\r\n\t\t\t\t\t\t\t<Box flexDirection=\"column\" height={PICKER_HEIGHT}>\r\n\t\t\t\t\t\t\t\t<PickerSelect\r\n\t\t\t\t\t\t\t\t\tresults={pickerState.results}\r\n\t\t\t\t\t\t\t\t\tselectedIndex={pickerState.selectedIndex}\r\n\t\t\t\t\t\t\t\t\tmaxVisible={PICKER_HEIGHT - 1}\r\n\t\t\t\t\t\t\t\t\tonSelect={handlePickerSelect}\r\n\t\t\t\t\t\t\t\t\tonEscape={handlePickerClose}\r\n\t\t\t\t\t\t\t\t\tonIndexChange={handlePickerIndexChange}\r\n\t\t\t\t\t\t\t\t\trenderItem={getPickerRenderItem()}\r\n\t\t\t\t\t\t\t\t\temptyMessage={pickerState.activeTrigger?.emptyMessage}\r\n\t\t\t\t\t\t\t\t\tisActive={isInputAreaActive && pickerState.isOpen}\r\n\t\t\t\t\t\t\t\t\tisLoading={pickerState.isLoading}\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t</Box>\r\n\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t<Box height={1}>{statusBarMessage}</Box>\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t</Box>\r\n\t\t\t\t)}\r\n\t\t\t</Box>\r\n\t\t</Box>\r\n\t)\r\n}\r\n\r\n/**\r\n * Main TUI Application Component - wraps with TerminalSizeProvider\r\n */\r\nexport function App(props: TUIAppProps) {\r\n\treturn (\r\n\t\t<TerminalSizeProvider>\r\n\t\t\t<AppInner {...props} />\r\n\t\t</TerminalSizeProvider>\r\n\t)\r\n}\r\n","import { Command } from \"commander\"\n\nimport { DEFAULT_FLAGS } from \"./types/constants.js\"\nimport { VERSION } from \"./lib/utils/version.js\"\nimport { run, listCommands, listModes, listModels, listSessions, upgrade } from \"./commands/index.js\"\n\nconst program = new Command()\n\nprogram\n\t.name(\"roo\")\n\t.description(\"Roo Code CLI - starts an interactive session by default, use -p/--print for non-interactive output\")\n\t.version(VERSION)\n\t.enablePositionalOptions()\n\t.passThroughOptions()\n\nprogram\n\t.option(\"--prompt <prompt>\", \"Your prompt\")\n\t.option(\"--prompt-file <path>\", \"Read prompt from a file instead of command line argument\")\n\t.argument(\"[prompt]\", \"Your prompt\")\n\t.option(\"--create-with-session-id <session-id>\", \"Create a new task with a specific session ID (must be a UUID)\")\n\t.option(\"--session-id <session-id>\", \"Resume a specific task by session ID\")\n\t.option(\"-c, --continue\", \"Resume the most recent task in the current workspace\", false)\n\t.option(\"-w, --workspace <path>\", \"Workspace directory path (defaults to current working directory)\")\n\t.option(\"-p, --print\", \"Print response and exit (non-interactive mode)\", false)\n\t.option(\n\t\t\"--stdin-prompt-stream\",\n\t\t\"Read NDJSON commands from stdin (requires --print and --output-format stream-json)\",\n\t\tfalse,\n\t)\n\t.option(\n\t\t\"--signal-only-exit\",\n\t\t\"Do not exit from normal completion/errors; only terminate on SIGINT/SIGTERM (intended for stdin stream harnesses)\",\n\t\tfalse,\n\t)\n\t.option(\"-e, --extension <path>\", \"Path to the extension bundle directory\")\n\t.option(\"-d, --debug\", \"Enable debug output (includes detailed debug information)\", false)\n\t.option(\"-a, --require-approval\", \"Require manual approval for actions\", false)\n\t.option(\"--yolo\", \"Auto-approve all tool calls (YOLO mode)\", false)\n\t.option(\"--approval-mode <mode>\", \"Approval mode: 'normal' or 'yolo'\")\n\t.option(\"--tui\", \"Force enable TUI mode (Text User Interface)\", false)\n\t.option(\"-k, --api-key <key>\", \"API key for the LLM provider\")\n\t.option(\"--provider <provider>\", \"API provider (anthropic, openai, openrouter, etc.)\")\n\t.option(\"-m, --model <model>\", \"Model to use\", DEFAULT_FLAGS.model)\n\t.option(\"--mode <mode>\", \"Mode to start in (code, architect, ask, debug, etc.)\", DEFAULT_FLAGS.mode)\n\t.option(\"--terminal-shell <path>\", \"Absolute path to shell executable for inline terminal commands\")\n\t.option(\n\t\t\"-r, --reasoning-effort <effort>\",\n\t\t\"Reasoning effort level (unspecified, disabled, none, minimal, low, medium, high, xhigh)\",\n\t\tDEFAULT_FLAGS.reasoningEffort,\n\t)\n\t.option(\n\t\t\"--consecutive-mistake-limit <limit>\",\n\t\t\"Consecutive error/repetition limit before guidance prompt (0 disables the limit)\",\n\t\t(value) => Number.parseInt(value, 10),\n\t)\n\t.option(\"--exit-on-error\", \"Exit on API request errors instead of retrying\", false)\n\t.option(\"--ephemeral\", \"Run without persisting state (uses temporary storage)\", false)\n\t.option(\"--oneshot\", \"Exit upon task completion\", false)\n\t.option(\n\t\t\"--output-format <format>\",\n\t\t'Output format (only works with --print): \"text\" (default), \"json\" (single result), or \"stream-json\" (realtime streaming)',\n\t\t\"text\",\n\t)\n\t.action(run)\n\nconst listCommand = program\n\t.command(\"list\")\n\t.description(\"List commands, modes, models, or sessions\")\n\t.enablePositionalOptions()\n\t.passThroughOptions()\n\nconst applyListOptions = (command: Command) =>\n\tcommand\n\t\t.option(\"-w, --workspace <path>\", \"Workspace directory path (defaults to current working directory)\")\n\t\t.option(\"-e, --extension <path>\", \"Path to the extension bundle directory\")\n\t\t.option(\"-k, --api-key <key>\", \"API key for the LLM provider\")\n\t\t.option(\"--format <format>\", 'Output format: \"json\" (default) or \"text\"', \"json\")\n\t\t.option(\"-d, --debug\", \"Enable debug output\", false)\n\nconst runListAction = async (action: () => Promise<void>) => {\n\ttry {\n\t\tawait action()\n\t\tprocess.exit(0)\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error)\n\t\tconsole.error(`[CLI] Error: ${message}`)\n\t\tprocess.exit(1)\n\t}\n}\n\nconst runUpgradeAction = async (action: () => Promise<void>) => {\n\ttry {\n\t\tawait action()\n\t\tprocess.exit(0)\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error)\n\t\tconsole.error(`[CLI] Error: ${message}`)\n\t\tprocess.exit(1)\n\t}\n}\n\napplyListOptions(listCommand.command(\"commands\").description(\"List available slash commands\")).action(\n\tasync (options: Parameters<typeof listCommands>[0]) => {\n\t\tawait runListAction(() => listCommands(options))\n\t},\n)\n\napplyListOptions(listCommand.command(\"modes\").description(\"List available modes\")).action(\n\tasync (options: Parameters<typeof listModes>[0]) => {\n\t\tawait runListAction(() => listModes(options))\n\t},\n)\n\napplyListOptions(listCommand.command(\"models\").description(\"List available models\")).action(\n\tasync (options: Parameters<typeof listModels>[0]) => {\n\t\tawait runListAction(() => listModels(options))\n\t},\n)\n\napplyListOptions(listCommand.command(\"sessions\").description(\"List task sessions\")).action(\n\tasync (options: Parameters<typeof listSessions>[0]) => {\n\t\tawait runListAction(() => listSessions(options))\n\t},\n)\n\nprogram\n\t.command(\"upgrade\")\n\t.description(\"Upgrade Roo Code CLI to the latest version\")\n\t.action(async () => {\n\t\tawait runUpgradeAction(() => upgrade())\n\t})\n\nprogram.parse()\n","import fs from \"fs\"\nimport path from \"path\"\nimport { fileURLToPath } from \"url\"\n\n// Walk up from the current file to find the nearest package.json.\n// This works whether running from source (tsx src/lib/utils/) or bundle (dist/).\nfunction findVersion(): string {\n\tlet dir = path.dirname(fileURLToPath(import.meta.url))\n\n\twhile (dir !== path.dirname(dir)) {\n\t\tconst candidate = path.join(dir, \"package.json\")\n\n\t\tif (fs.existsSync(candidate)) {\n\t\t\tconst packageJson = JSON.parse(fs.readFileSync(candidate, \"utf-8\"))\n\t\t\treturn packageJson.version\n\t\t}\n\n\t\tdir = path.dirname(dir)\n\t}\n\n\treturn \"0.0.0\"\n}\n\nexport const VERSION = findVersion()\n","import fs from \"fs\"\r\nimport path from \"path\"\r\nimport { fileURLToPath } from \"url\"\r\n\r\nimport { createElement } from \"react\"\r\nimport pWaitFor from \"p-wait-for\"\r\n\r\nimport { setLogger } from \"@roo-code/vscode-shim\"\r\n\r\nimport {\r\n\tFlagOptions,\r\n\tisSupportedProvider,\r\n\tsupportedProviders,\r\n\tDEFAULT_FLAGS,\r\n\tREASONING_EFFORTS,\r\n\tOutputFormat,\r\n} from \"../../types/index.js\"\nimport { isValidOutputFormat } from \"../../types/json-events.js\"\nimport { JsonEventEmitter } from \"../../agent/json-event-emitter.js\"\r\n\r\nimport { loadSettings, saveSettings } from \"../../lib/storage/index.js\"\r\nimport { readWorkspaceTaskSessions, resolveWorkspaceResumeSessionId } from \"../../lib/task-history/index.js\"\r\nimport { getEnvVarName, getApiKeyFromEnv } from \"../../lib/utils/provider.js\"\r\nimport { validateTerminalShellPath } from \"../../lib/utils/shell.js\"\r\nimport { getDefaultExtensionPath } from \"../../lib/utils/extension.js\"\r\nimport { isValidSessionId } from \"../../lib/utils/session-id.js\"\r\nimport { VERSION } from \"../../lib/utils/version.js\"\r\n\r\nimport { ExtensionHost, ExtensionHostOptions } from \"../../agent/index.js\"\r\nimport { isExpectedControlFlowError } from \"./cancellation.js\"\r\nimport { runStdinStreamMode } from \"./stdin-stream.js\"\r\n\r\nconst __dirname = path.dirname(fileURLToPath(import.meta.url))\r\nconst SIGNAL_ONLY_EXIT_KEEPALIVE_MS = 60_000\r\nconst STREAM_RESUME_WAIT_TIMEOUT_MS = 2_000\r\n\r\nasync function bootstrapResumeForStdinStream(host: ExtensionHost, sessionId: string): Promise<void> {\r\n\thost.sendToExtension({ type: \"showTaskWithId\", text: sessionId })\r\n\r\n\t// Best-effort wait so early stdin \"message\" commands can target the resumed task.\r\n\tawait pWaitFor(() => host.client.hasActiveTask() || host.isWaitingForInput(), {\r\n\t\tinterval: 25,\r\n\t\ttimeout: STREAM_RESUME_WAIT_TIMEOUT_MS,\r\n\t}).catch(() => undefined)\r\n}\r\n\r\nfunction normalizeError(error: unknown): Error {\r\n\treturn error instanceof Error ? error : new Error(String(error))\r\n}\r\n\r\nexport async function run(promptArg: string | undefined, flagOptions: FlagOptions) {\r\n\tsetLogger({\r\n\t\tinfo: () => {},\r\n\t\twarn: () => {},\r\n\t\terror: () => {},\r\n\t\tdebug: () => {},\r\n\t})\r\n\r\n\t// Determine prompt from --prompt flag, positional argument, or --prompt-file (in that order)\r\n\tlet prompt = flagOptions.prompt ?? promptArg\r\n\r\n\tif (flagOptions.promptFile) {\r\n\t\tif (!fs.existsSync(flagOptions.promptFile)) {\r\n\t\t\tconsole.error(`[CLI] Error: Prompt file does not exist: ${flagOptions.promptFile}`)\r\n\t\t\tprocess.exit(1)\r\n\t\t}\r\n\r\n\t\tprompt = fs.readFileSync(flagOptions.promptFile, \"utf-8\")\r\n\t}\r\n\r\n\tconst requestedSessionId = flagOptions.sessionId?.trim()\r\n\tconst requestedCreateSessionId = flagOptions.createWithSessionId?.trim()\r\n\tconst shouldContinueSession = flagOptions.continue\r\n\tconst isResumeRequested = Boolean(requestedSessionId || shouldContinueSession)\r\n\r\n\tif (flagOptions.createWithSessionId !== undefined && !requestedCreateSessionId) {\r\n\t\tconsole.error(\"[CLI] Error: --create-with-session-id requires a non-empty session id\")\r\n\t\tprocess.exit(1)\r\n\t}\r\n\r\n\tif (flagOptions.sessionId !== undefined && !requestedSessionId) {\r\n\t\tconsole.error(\"[CLI] Error: --session-id requires a non-empty session id\")\r\n\t\tprocess.exit(1)\r\n\t}\r\n\r\n\tif (requestedCreateSessionId && !isValidSessionId(requestedCreateSessionId)) {\r\n\t\tconsole.error(\"[CLI] Error: --create-with-session-id must be a valid UUID session id\")\r\n\t\tprocess.exit(1)\r\n\t}\r\n\r\n\tif (requestedSessionId && !isValidSessionId(requestedSessionId)) {\r\n\t\tconsole.error(\"[CLI] Error: --session-id must be a valid UUID session id\")\r\n\t\tprocess.exit(1)\r\n\t}\r\n\r\n\tif (requestedCreateSessionId && isResumeRequested) {\r\n\t\tconsole.error(\"[CLI] Error: cannot use --create-with-session-id with --session-id/--continue\")\r\n\t\tprocess.exit(1)\r\n\t}\r\n\r\n\tif (requestedSessionId && shouldContinueSession) {\r\n\t\tconsole.error(\"[CLI] Error: cannot use --session-id with --continue\")\r\n\t\tprocess.exit(1)\r\n\t}\r\n\r\n\tif (isResumeRequested && prompt) {\r\n\t\tconsole.error(\"[CLI] Error: cannot use prompt or --prompt-file with --session-id/--continue\")\r\n\t\tconsole.error(\"[CLI] Usage: roo [--session-id <session-id> | --continue] [options]\")\r\n\t\tprocess.exit(1)\r\n\t}\r\n\r\n\t// Options\r\n\r\n\tconst settings = await loadSettings()\r\n\r\nconst isTuiSupported = process.stdin.isTTY && process.stdout.isTTY\n\tconst isTuiEnabled = flagOptions.tui || (!flagOptions.print && isTuiSupported)\n\r\n\t// Determine effective values: CLI flags > settings file > DEFAULT_FLAGS.\r\n// Auto-configure OpenAI from environment if not explicitly set\r\nconst openAiEnvKey = process.env.OPENAI_API_KEY?.trim();\r\nconst openAiEnvBaseUrl = process.env.OPENAI_BASE_URL?.trim();\r\nconst openAiEnvModel = process.env.OPENAI_MODEL?.trim();\r\n// Auto-skip onboarding if environment variables for OpenAI native provider are set\r\nif (openAiEnvKey && openAiEnvBaseUrl && openAiEnvModel && !settings.onboardingProviderChoice) {\r\n await saveSettings({ onboardingProviderChoice: \"byok\" })\r\n settings.onboardingProviderChoice = \"byok\"\r\n}\r\n\r\nconst effectiveMode = flagOptions.mode || settings.mode || DEFAULT_FLAGS.mode\r\nconst effectiveReasoningEffort =\r\n\tflagOptions.reasoningEffort || settings.reasoningEffort || DEFAULT_FLAGS.reasoningEffort\r\nlet effectiveModel = flagOptions.model ?? settings.model ?? DEFAULT_FLAGS.model;\r\nif (openAiEnvKey && openAiEnvModel && !flagOptions.model && flagOptions.model === undefined) {\r\n\teffectiveModel = openAiEnvModel;\r\n}\r\n\tlet effectiveProvider = flagOptions.provider ?? (openAiEnvKey ? \"openai-native\" : (settings.provider ?? \"openai-native\"));\r\n\t// Use the base URL as-is from environment variable (no normalization for NVIDIA)\r\n\tconst openAiBaseUrlForSettings = effectiveProvider === \"openai-native\" ? openAiEnvBaseUrl : undefined;\r\nconst effectiveWorkspacePath = flagOptions.workspace ? path.resolve(flagOptions.workspace) : process.cwd()\r\n\r\n// Determine effective approval mode\r\nconst legacyRequireApprovalFromSettings =\r\n\tsettings.requireApproval ??\r\n\t(settings.dangerouslySkipPermissions === undefined ? undefined : !settings.dangerouslySkipPermissions)\r\nlet effectiveRequireApproval: boolean;\r\nif (flagOptions.yolo || flagOptions.approvalMode === \"yolo\") {\r\n\teffectiveRequireApproval = false;\r\n} else if (flagOptions.approvalMode === \"normal\") {\r\n\teffectiveRequireApproval = true;\r\n} else {\r\n\teffectiveRequireApproval = flagOptions.requireApproval || legacyRequireApprovalFromSettings || false;\r\n}\r\n\r\nconst effectiveExitOnComplete = flagOptions.print || flagOptions.oneshot || settings.oneshot || false\r\nconst rawConsecutiveMistakeLimit =\r\n\tflagOptions.consecutiveMistakeLimit ?? settings.consecutiveMistakeLimit ?? DEFAULT_FLAGS.consecutiveMistakeLimit\r\nconst effectiveConsecutiveMistakeLimit = Number(rawConsecutiveMistakeLimit)\r\n\r\nif (!Number.isInteger(effectiveConsecutiveMistakeLimit) || effectiveConsecutiveMistakeLimit < 0) {\r\n\t\tconsole.error(\r\n\t\t\t`[CLI] Error: Invalid consecutive mistake limit: ${rawConsecutiveMistakeLimit}; must be a non-negative integer`,\r\n\t\t)\r\n\t\tprocess.exit(1)\r\n\t}\r\n\r\n\tlet terminalShell: string | undefined\r\n\tif (flagOptions.terminalShell !== undefined) {\r\n\t\tconst validatedTerminalShell = await validateTerminalShellPath(flagOptions.terminalShell)\r\n\r\n\t\tif (!validatedTerminalShell.valid) {\r\n\t\t\tconsole.error(\r\n\t\t\t\t`[CLI] Warning: ignoring --terminal-shell \"${flagOptions.terminalShell}\" (${validatedTerminalShell.reason})`,\r\n\t\t\t)\r\n\t\t} else {\r\n\t\t\tterminalShell = validatedTerminalShell.shellPath\r\n\t\t}\r\n\t}\r\n\r\nconst extensionHostOptions: ExtensionHostOptions = {\n\t\tmode: effectiveMode,\n\t\treasoningEffort: effectiveReasoningEffort === \"unspecified\" ? undefined : effectiveReasoningEffort,\n\t\tconsecutiveMistakeLimit: effectiveConsecutiveMistakeLimit,\n\t\tuser: null,\n\t\tprovider: effectiveProvider,\n\t\topenAiBaseUrl: openAiBaseUrlForSettings,\n\t\tmodel: effectiveModel,\n\t\tworkspacePath: effectiveWorkspacePath,\n\t\textensionPath: getDefaultExtensionPath(__dirname),\n\t\tnonInteractive: !effectiveRequireApproval,\n\t\texitOnError: flagOptions.exitOnError,\n\t\tephemeral: flagOptions.ephemeral,\n\t\tdebug: flagOptions.debug,\n\t\texitOnComplete: effectiveExitOnComplete,\n\t\tterminalShell,\n\t\t// Skip waiting for isReady in non-TUI mode (print mode) since there's no webview\n\t\tskipIsReadyWait: !isTuiEnabled,\n\t}\n\r\n\t// Validations\r\n\t// TODO: Validate the API key for the chosen provider.\r\n\t// TODO: Validate the model for the chosen provider.\r\n\r\n\tif (!isSupportedProvider(extensionHostOptions.provider)) {\r\n\t\tconsole.error(\r\n\t\t\t`[CLI] Error: Invalid provider: ${extensionHostOptions.provider}; must be one of: ${supportedProviders.join(\", \")}`,\r\n\t\t)\r\n\t\tprocess.exit(1)\r\n\t}\r\n\r\n\textensionHostOptions.apiKey =\r\n\t\textensionHostOptions.apiKey || flagOptions.apiKey || getApiKeyFromEnv(extensionHostOptions.provider)\r\n\r\n\tif (!extensionHostOptions.apiKey) {\r\n\t\tconsole.error(`[CLI] Error: No API key provided. Use --api-key or set the appropriate environment variable.`)\r\n\t\tconsole.error(`[CLI] For ${extensionHostOptions.provider}, set ${getEnvVarName(extensionHostOptions.provider)}`)\r\n\r\n\t\tprocess.exit(1)\r\n\t}\r\n\r\n\tif (!fs.existsSync(extensionHostOptions.workspacePath)) {\r\n\t\tconsole.error(`[CLI] Error: Workspace path does not exist: ${extensionHostOptions.workspacePath}`)\r\n\t\tprocess.exit(1)\r\n\t}\r\n\r\n\tif (extensionHostOptions.reasoningEffort && !REASONING_EFFORTS.includes(extensionHostOptions.reasoningEffort)) {\r\n\t\tconsole.error(\r\n\t\t\t`[CLI] Error: Invalid reasoning effort: ${extensionHostOptions.reasoningEffort}, must be one of: ${REASONING_EFFORTS.join(\", \")}`,\r\n\t\t)\r\n\t\tprocess.exit(1)\r\n\t}\r\n\r\n\t// Validate output format\r\n\tconst outputFormat: OutputFormat = (flagOptions.outputFormat as OutputFormat) || \"text\"\r\n\r\n\tif (!isValidOutputFormat(outputFormat)) {\r\n\t\tconsole.error(\r\n\t\t\t`[CLI] Error: Invalid output format: ${flagOptions.outputFormat}; must be one of: text, json, stream-json`,\r\n\t\t)\r\n\t\tprocess.exit(1)\r\n\t}\r\n\r\n\t// Output format only works with --print mode\r\n\tif (outputFormat !== \"text\" && !flagOptions.print && isTuiSupported) {\r\n\t\tconsole.error(\"[CLI] Error: --output-format requires --print mode\")\r\n\t\tconsole.error(\"[CLI] Usage: roo --print --output-format json\")\r\n\t\tprocess.exit(1)\r\n\t}\r\n\r\n\tif (flagOptions.stdinPromptStream && !flagOptions.print) {\r\n\t\tconsole.error(\"[CLI] Error: --stdin-prompt-stream requires --print mode\")\r\n\t\tconsole.error(\"[CLI] Usage: roo --print --output-format stream-json --stdin-prompt-stream [options]\")\r\n\t\tprocess.exit(1)\r\n\t}\r\n\r\n\tif (flagOptions.signalOnlyExit && !flagOptions.stdinPromptStream) {\r\n\t\tconsole.error(\"[CLI] Error: --signal-only-exit requires --stdin-prompt-stream\")\r\n\t\tconsole.error(\"[CLI] Usage: roo --print --output-format stream-json --stdin-prompt-stream --signal-only-exit\")\r\n\t\tprocess.exit(1)\r\n\t}\r\n\r\n\tif (flagOptions.stdinPromptStream && outputFormat !== \"stream-json\") {\r\n\t\tconsole.error(\"[CLI] Error: --stdin-prompt-stream requires --output-format=stream-json\")\r\n\t\tconsole.error(\"[CLI] Usage: roo --print --output-format stream-json --stdin-prompt-stream [options]\")\r\n\t\tprocess.exit(1)\r\n\t}\r\n\r\n\tif (flagOptions.stdinPromptStream && process.stdin.isTTY) {\r\n\t\tconsole.error(\"[CLI] Error: --stdin-prompt-stream requires piped stdin\")\r\n\t\tconsole.error(\r\n\t\t\t'[CLI] Example: printf \\'{\"command\":\"start\",\"requestId\":\"1\",\"prompt\":\"1+1=?\"}\\\\n\\' | roo --print --output-format stream-json --stdin-prompt-stream [options]',\r\n\t\t)\r\n\t\tprocess.exit(1)\r\n\t}\r\n\r\n\tif (flagOptions.stdinPromptStream && prompt) {\r\n\t\tconsole.error(\"[CLI] Error: cannot use positional prompt or --prompt-file with --stdin-prompt-stream\")\r\n\t\tconsole.error(\"[CLI] Usage: roo --print --output-format stream-json --stdin-prompt-stream [options]\")\r\n\t\tprocess.exit(1)\r\n\t}\r\n\r\n\tif (flagOptions.stdinPromptStream && requestedCreateSessionId) {\r\n\t\tconsole.error(\"[CLI] Error: --create-with-session-id is not supported with --stdin-prompt-stream\")\r\n\t\tconsole.error('[CLI] Use per-request \"taskId\" in stdin start commands instead.')\r\n\t\tprocess.exit(1)\r\n\t}\r\n\r\n\tconst useStdinPromptStream = flagOptions.stdinPromptStream\r\n\tlet resolvedResumeSessionId: string | undefined\r\n\r\n\tif (isResumeRequested) {\r\n\t\tconst workspaceSessions = await readWorkspaceTaskSessions(effectiveWorkspacePath)\r\n\t\ttry {\r\n\t\t\tresolvedResumeSessionId = resolveWorkspaceResumeSessionId(workspaceSessions, requestedSessionId)\r\n\t\t} catch (error) {\r\n\t\t\tconst message = error instanceof Error ? error.message : String(error)\r\n\t\t\tconsole.error(`[CLI] Error: ${message}`)\r\n\t\t\tprocess.exit(1)\r\n\t\t}\r\n\t}\r\n\r\n\t// If TUI is enabled (interactive mode), prompt is optional when auto-start env vars are set\r\n\tif (!isTuiEnabled && !useStdinPromptStream && !isResumeRequested) {\r\n\t\tif (!prompt) {\r\n\t\t\tif (flagOptions.print) {\r\n\t\t\t\tconsole.error(\"[CLI] Error: no prompt provided\")\r\n\t\t\t\tconsole.error(\"[CLI] Usage: roo --print [options] <prompt>\")\r\n\t\t\t\tconsole.error(\r\n\t\t\t\t\t\"[CLI] For stdin control mode: roo --print --output-format stream-json --stdin-prompt-stream [options]\",\r\n\t\t\t\t)\r\n\t\t\t} else {\r\n\t\t\t\tconsole.error(\"[CLI] Error: prompt is required in non-interactive mode\")\r\n\t\t\t\tconsole.error(\"[CLI] Usage: roo <prompt> [options]\")\r\n\t\t\t\tconsole.error(\"[CLI] Run without -p for interactive mode\")\r\n\t\t\t}\r\n\r\n\t\t\tprocess.exit(1)\r\n\t\t}\r\n\t}\r\n\r\n\tif (!isTuiEnabled && !flagOptions.print) {\r\n\t\tconsole.warn(\"[CLI] TUI disabled (no TTY support), falling back to print mode\")\r\n\t}\r\n\r\n\t// Run!\r\n\r\n\tif (isTuiEnabled) {\r\n\t\ttry {\r\n\t\t\tconst { render } = await import(\"ink\")\r\n\t\t\tconst { App } = await import(\"../../ui/App.js\")\r\n\r\n\t\t\trender(\r\n\t\t\t\tcreateElement(App, {\r\n\t\t\t\t\t...extensionHostOptions,\r\n\t\t\t\t\tinitialPrompt: prompt,\r\n\t\t\t\t\tinitialTaskId: requestedCreateSessionId,\r\n\t\t\t\t\tinitialSessionId: resolvedResumeSessionId,\r\n\t\t\t\t\tcontinueSession: false,\r\n\t\t\t\t\tversion: VERSION,\r\n\t\t\t\t\tcreateExtensionHost: (opts: ExtensionHostOptions) => new ExtensionHost(opts),\r\n\t\t\t\t}),\r\n\t\t\t\t// Handle Ctrl+C in App component for double-press exit.\r\n\t\t\t\t{ exitOnCtrlC: false },\r\n\t\t\t)\r\n\t\t} catch (error) {\r\n\t\t\tconsole.error(\"[CLI] Failed to start TUI:\", error instanceof Error ? error.message : String(error))\r\n\r\n\t\t\tif (error instanceof Error) {\r\n\t\t\t\tconsole.error(error.stack)\r\n\t\t\t}\r\n\r\n\t\t\tprocess.exit(1)\r\n\t\t}\r\n\t} else {\r\n\t\tconst useJsonOutput = outputFormat === \"json\" || outputFormat === \"stream-json\"\r\n\t\tconst signalOnlyExit = flagOptions.signalOnlyExit\r\n\r\n\t\textensionHostOptions.disableOutput = useJsonOutput\r\n\r\n\t\tconst host = new ExtensionHost(extensionHostOptions)\r\n\t\tlet streamRequestId: string | undefined\r\n\t\tlet keepAliveInterval: NodeJS.Timeout | undefined\r\n\t\tlet isShuttingDown = false\r\n\t\tlet hostDisposed = false\r\n\r\n\t\tconst jsonEmitter = useJsonOutput\r\n\t\t\t? new JsonEventEmitter({\r\n\t\t\t\t\tmode: outputFormat as \"json\" | \"stream-json\",\r\n\t\t\t\t\trequestIdProvider: () => streamRequestId,\r\n\t\t\t\t})\r\n\t\t\t: null\r\n\r\n\t\tconst emitRuntimeError = (error: Error, source?: string) => {\r\n\t\t\tconst errorMessage = source ? `${source}: ${error.message}` : error.message\r\n\r\n\t\t\tif (useJsonOutput) {\r\n\t\t\t\tconst errorEvent = { type: \"error\", id: Date.now(), content: errorMessage }\r\n\t\t\t\tprocess.stdout.write(JSON.stringify(errorEvent) + \"\\n\")\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\tconsole.error(\"[CLI] Error:\", errorMessage)\r\n\t\t\tconsole.error(error.stack)\r\n\t\t}\r\n\r\n\t\tconst clearKeepAliveInterval = () => {\r\n\t\t\tif (!keepAliveInterval) {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\tclearInterval(keepAliveInterval)\r\n\t\t\tkeepAliveInterval = undefined\r\n\t\t}\r\n\r\n\t\tconst flushStdout = async () => {\r\n\t\t\ttry {\r\n\t\t\t\tif (!process.stdout.writable || process.stdout.destroyed) {\r\n\t\t\t\t\treturn\r\n\t\t\t\t}\r\n\r\n\t\t\t\tawait new Promise<void>((resolve, reject) => {\r\n\t\t\t\t\tprocess.stdout.write(\"\", (error?: Error | null) => {\r\n\t\t\t\t\t\tif (error) {\r\n\t\t\t\t\t\t\treject(error)\r\n\t\t\t\t\t\t\treturn\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tresolve()\r\n\t\t\t\t\t})\r\n\t\t\t\t})\r\n\t\t\t} catch {\r\n\t\t\t\t// Best effort: shutdown should proceed even if stdout flush fails.\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst ensureKeepAliveInterval = () => {\r\n\t\t\tif (!signalOnlyExit || keepAliveInterval) {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\tkeepAliveInterval = setInterval(() => {}, SIGNAL_ONLY_EXIT_KEEPALIVE_MS)\r\n\t\t}\r\n\r\n\t\tconst disposeHost = async () => {\r\n\t\t\tif (hostDisposed) {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\thostDisposed = true\r\n\t\t\tjsonEmitter?.detach()\r\n\t\t\tawait host.dispose()\r\n\t\t}\r\n\r\n\t\tconst onSigint = () => {\r\n\t\t\tvoid shutdown(\"SIGINT\", 130)\r\n\t\t}\r\n\r\n\t\tconst onSigterm = () => {\r\n\t\t\tvoid shutdown(\"SIGTERM\", 143)\r\n\t\t}\r\n\r\n\t\tconst onUncaughtException = (error: Error) => {\r\n\t\t\tif (\r\n\t\t\t\tisExpectedControlFlowError(error, {\r\n\t\t\t\t\tstdinStreamMode: useStdinPromptStream,\r\n\t\t\t\t\tshuttingDown: isShuttingDown,\r\n\t\t\t\t\toperation: \"runtime\",\r\n\t\t\t\t})\r\n\t\t\t) {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\temitRuntimeError(error, \"uncaughtException\")\r\n\r\n\t\t\tif (signalOnlyExit) {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\tvoid shutdown(\"uncaughtException\", 1)\r\n\t\t}\r\n\r\n\t\tconst onUnhandledRejection = (reason: unknown) => {\r\n\t\t\tif (\r\n\t\t\t\tisExpectedControlFlowError(reason, {\r\n\t\t\t\t\tstdinStreamMode: useStdinPromptStream,\r\n\t\t\t\t\tshuttingDown: isShuttingDown,\r\n\t\t\t\t\toperation: \"runtime\",\r\n\t\t\t\t})\r\n\t\t\t) {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\tconst error = normalizeError(reason)\r\n\t\t\temitRuntimeError(error, \"unhandledRejection\")\r\n\r\n\t\t\tif (signalOnlyExit) {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\tvoid shutdown(\"unhandledRejection\", 1)\r\n\t\t}\r\n\r\n\t\tconst parkUntilSignal = async (reason: string): Promise<never> => {\r\n\t\t\tensureKeepAliveInterval()\r\n\r\n\t\t\tif (!useJsonOutput) {\r\n\t\t\t\tconsole.error(`[CLI] ${reason} (--signal-only-exit active; waiting for SIGINT/SIGTERM).`)\r\n\t\t\t}\r\n\r\n\t\t\tawait new Promise<void>(() => {})\r\n\t\t\tthrow new Error(\"unreachable\")\r\n\t\t}\r\n\r\n\t\tasync function shutdown(signal: string, exitCode: number): Promise<void> {\r\n\t\t\tif (isShuttingDown) {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\tisShuttingDown = true\r\n\t\t\tprocess.off(\"SIGINT\", onSigint)\r\n\t\t\tprocess.off(\"SIGTERM\", onSigterm)\r\n\t\t\tprocess.off(\"uncaughtException\", onUncaughtException)\r\n\t\t\tprocess.off(\"unhandledRejection\", onUnhandledRejection)\r\n\t\t\tclearKeepAliveInterval()\r\n\r\n\t\t\tif (!useJsonOutput) {\r\n\t\t\t\tconsole.log(`\\n[CLI] Received ${signal}, shutting down...`)\r\n\t\t\t}\r\n\r\n\t\t\tawait disposeHost()\r\n\t\t\tif (jsonEmitter) {\r\n\t\t\t\tawait jsonEmitter.flush()\r\n\t\t\t}\r\n\t\t\tawait flushStdout()\r\n\t\t\tprocess.exit(exitCode)\r\n\t\t}\r\n\r\n\t\tprocess.on(\"SIGINT\", onSigint)\r\n\t\tprocess.on(\"SIGTERM\", onSigterm)\r\n\t\tprocess.on(\"uncaughtException\", onUncaughtException)\r\n\t\tprocess.on(\"unhandledRejection\", onUnhandledRejection)\r\n\r\n\t\ttry {\r\n\t\t\tawait host.activate()\r\n\r\n\t\t\tif (jsonEmitter) {\r\n\t\t\t\tjsonEmitter.attachToClient(host.client)\r\n\t\t\t}\r\n\r\n\t\t\tif (useStdinPromptStream) {\r\n\t\t\t\tif (!jsonEmitter || outputFormat !== \"stream-json\") {\r\n\t\t\t\t\tthrow new Error(\"--stdin-prompt-stream requires --output-format=stream-json to emit control events\")\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (isResumeRequested) {\r\n\t\t\t\t\tawait bootstrapResumeForStdinStream(host, resolvedResumeSessionId!)\r\n\t\t\t\t}\r\n\r\n\t\t\t\tawait runStdinStreamMode({\r\n\t\t\t\t\thost,\r\n\t\t\t\t\tjsonEmitter,\r\n\t\t\t\t\tsetStreamRequestId: (id) => {\r\n\t\t\t\t\t\tstreamRequestId = id\r\n\t\t\t\t\t},\r\n\t\t\t\t})\r\n\t\t\t} else {\r\n\t\t\t\tif (isResumeRequested) {\r\n\t\t\t\t\tawait host.resumeTask(resolvedResumeSessionId!)\r\n\t\t\t\t} else {\r\n\t\t\t\t\tawait host.runTask(prompt!, requestedCreateSessionId)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tawait disposeHost()\r\n\t\t\tif (jsonEmitter) {\r\n\t\t\t\tawait jsonEmitter.flush()\r\n\t\t\t}\r\n\t\t\tawait flushStdout()\r\n\r\n\t\t\tif (signalOnlyExit) {\r\n\t\t\t\tawait parkUntilSignal(\"Task loop completed\")\r\n\t\t\t}\r\n\r\n\t\t\tprocess.off(\"SIGINT\", onSigint)\r\n\t\t\tprocess.off(\"SIGTERM\", onSigterm)\r\n\t\t\tprocess.off(\"uncaughtException\", onUncaughtException)\r\n\t\t\tprocess.off(\"unhandledRejection\", onUnhandledRejection)\r\n\t\t\tprocess.exit(0)\r\n\t\t} catch (error) {\r\n\t\t\temitRuntimeError(normalizeError(error))\r\n\t\t\tawait disposeHost()\r\n\t\t\tif (jsonEmitter) {\r\n\t\t\t\tawait jsonEmitter.flush()\r\n\t\t\t}\r\n\t\t\tawait flushStdout()\r\n\r\n\t\t\tif (signalOnlyExit) {\r\n\t\t\t\tawait parkUntilSignal(\"Task loop failed\")\r\n\t\t\t}\r\n\r\n\t\t\tprocess.off(\"SIGINT\", onSigint)\r\n\t\t\tprocess.off(\"SIGTERM\", onSigterm)\r\n\t\t\tprocess.off(\"uncaughtException\", onUncaughtException)\r\n\t\t\tprocess.off(\"unhandledRejection\", onUnhandledRejection)\r\n\t\t\tprocess.exit(1)\r\n\t\t}\r\n\t}\r\n}\r\n\r\n","import type { IPosition } from \"../types.js\"\n\n/**\n * Represents a position in a text document\n *\n * A position is defined by a zero-based line number and a zero-based character offset.\n * This class is immutable - all methods that modify the position return a new instance.\n *\n * @example\n * ```typescript\n * const pos = new Position(5, 10) // Line 5, character 10\n * const next = pos.translate(1, 0) // Line 6, character 10\n * ```\n */\nexport class Position implements IPosition {\n\t/**\n\t * The zero-based line number\n\t */\n\tpublic readonly line: number\n\n\t/**\n\t * The zero-based character offset\n\t */\n\tpublic readonly character: number\n\n\t/**\n\t * Create a new Position\n\t *\n\t * @param line - The zero-based line number\n\t * @param character - The zero-based character offset\n\t */\n\tconstructor(line: number, character: number) {\n\t\tif (line < 0) {\n\t\t\tthrow new Error(\"Line number must be non-negative\")\n\t\t}\n\t\tif (character < 0) {\n\t\t\tthrow new Error(\"Character offset must be non-negative\")\n\t\t}\n\t\tthis.line = line\n\t\tthis.character = character\n\t}\n\n\t/**\n\t * Check if this position is equal to another position\n\t */\n\tisEqual(other: IPosition): boolean {\n\t\treturn this.line === other.line && this.character === other.character\n\t}\n\n\t/**\n\t * Check if this position is before another position\n\t */\n\tisBefore(other: IPosition): boolean {\n\t\tif (this.line < other.line) {\n\t\t\treturn true\n\t\t}\n\t\tif (this.line === other.line) {\n\t\t\treturn this.character < other.character\n\t\t}\n\t\treturn false\n\t}\n\n\t/**\n\t * Check if this position is before or equal to another position\n\t */\n\tisBeforeOrEqual(other: IPosition): boolean {\n\t\treturn this.isBefore(other) || this.isEqual(other)\n\t}\n\n\t/**\n\t * Check if this position is after another position\n\t */\n\tisAfter(other: IPosition): boolean {\n\t\treturn !this.isBeforeOrEqual(other)\n\t}\n\n\t/**\n\t * Check if this position is after or equal to another position\n\t */\n\tisAfterOrEqual(other: IPosition): boolean {\n\t\treturn !this.isBefore(other)\n\t}\n\n\t/**\n\t * Compare this position to another\n\t *\n\t * @returns -1 if this position is before, 0 if equal, 1 if after\n\t */\n\tcompareTo(other: IPosition): number {\n\t\tif (this.line < other.line) {\n\t\t\treturn -1\n\t\t}\n\t\tif (this.line > other.line) {\n\t\t\treturn 1\n\t\t}\n\t\tif (this.character < other.character) {\n\t\t\treturn -1\n\t\t}\n\t\tif (this.character > other.character) {\n\t\t\treturn 1\n\t\t}\n\t\treturn 0\n\t}\n\n\t/**\n\t * Create a new position relative to this position\n\t *\n\t * @param lineDelta - The line delta (default: 0)\n\t * @param characterDelta - The character delta (default: 0)\n\t * @returns A new Position\n\t */\n\ttranslate(lineDelta?: number, characterDelta?: number): Position\n\ttranslate(change: { lineDelta?: number; characterDelta?: number }): Position\n\ttranslate(\n\t\tlineDeltaOrChange?: number | { lineDelta?: number; characterDelta?: number },\n\t\tcharacterDelta?: number,\n\t): Position {\n\t\tif (typeof lineDeltaOrChange === \"object\") {\n\t\t\treturn new Position(\n\t\t\t\tthis.line + (lineDeltaOrChange.lineDelta || 0),\n\t\t\t\tthis.character + (lineDeltaOrChange.characterDelta || 0),\n\t\t\t)\n\t\t}\n\t\treturn new Position(this.line + (lineDeltaOrChange || 0), this.character + (characterDelta || 0))\n\t}\n\n\t/**\n\t * Create a new position with changed line or character\n\t *\n\t * @param line - The new line number (or undefined to keep current)\n\t * @param character - The new character offset (or undefined to keep current)\n\t * @returns A new Position\n\t */\n\twithChanges(line?: number, character?: number): Position\n\twithChanges(change: { line?: number; character?: number }): Position\n\twithChanges(lineOrChange?: number | { line?: number; character?: number }, character?: number): Position {\n\t\tif (typeof lineOrChange === \"object\") {\n\t\t\treturn new Position(\n\t\t\t\tlineOrChange.line !== undefined ? lineOrChange.line : this.line,\n\t\t\t\tlineOrChange.character !== undefined ? lineOrChange.character : this.character,\n\t\t\t)\n\t\t}\n\t\treturn new Position(\n\t\t\tlineOrChange !== undefined ? lineOrChange : this.line,\n\t\t\tcharacter !== undefined ? character : this.character,\n\t\t)\n\t}\n}\n","import { Position } from \"./Position.js\"\nimport type { IRange, IPosition } from \"../types.js\"\n\n/**\n * Represents a range in a text document\n *\n * A range is defined by two positions: a start and an end position.\n * This class is immutable - all methods that modify the range return a new instance.\n *\n * @example\n * ```typescript\n * // Create a range from line 0 to line 5\n * const range = new Range(\n * new Position(0, 0),\n * new Position(5, 10)\n * )\n *\n * // Or use the overload with line/character numbers\n * const range2 = new Range(0, 0, 5, 10)\n * ```\n */\nexport class Range implements IRange {\n\tpublic readonly start: Position\n\tpublic readonly end: Position\n\n\t/**\n\t * Create a new Range\n\t *\n\t * @param start - The start position\n\t * @param end - The end position\n\t */\n\tconstructor(start: IPosition, end: IPosition)\n\t/**\n\t * Create a new Range from line and character numbers\n\t *\n\t * @param startLine - The start line number\n\t * @param startCharacter - The start character offset\n\t * @param endLine - The end line number\n\t * @param endCharacter - The end character offset\n\t */\n\tconstructor(startLine: number, startCharacter: number, endLine: number, endCharacter: number)\n\tconstructor(\n\t\tstartOrStartLine: IPosition | number,\n\t\tendOrStartCharacter: IPosition | number,\n\t\tendLine?: number,\n\t\tendCharacter?: number,\n\t) {\n\t\tif (typeof startOrStartLine === \"number\") {\n\t\t\tthis.start = new Position(startOrStartLine, endOrStartCharacter as number)\n\t\t\tthis.end = new Position(endLine!, endCharacter!)\n\t\t} else {\n\t\t\tthis.start = startOrStartLine as Position\n\t\t\tthis.end = endOrStartCharacter as Position\n\t\t}\n\t}\n\n\t/**\n\t * Check if this range is empty (start equals end)\n\t */\n\tget isEmpty(): boolean {\n\t\treturn this.start.isEqual(this.end)\n\t}\n\n\t/**\n\t * Check if this range is on a single line\n\t */\n\tget isSingleLine(): boolean {\n\t\treturn this.start.line === this.end.line\n\t}\n\n\t/**\n\t * Check if this range contains a position or range\n\t *\n\t * @param positionOrRange - The position or range to check\n\t * @returns true if the position/range is within this range\n\t */\n\tcontains(positionOrRange: IPosition | IRange): boolean {\n\t\tif (\"start\" in positionOrRange && \"end\" in positionOrRange) {\n\t\t\t// It's a range\n\t\t\treturn this.contains(positionOrRange.start) && this.contains(positionOrRange.end)\n\t\t}\n\t\t// It's a position\n\t\treturn positionOrRange.isAfterOrEqual(this.start) && positionOrRange.isBeforeOrEqual(this.end)\n\t}\n\n\t/**\n\t * Check if this range is equal to another range\n\t */\n\tisEqual(other: IRange): boolean {\n\t\treturn this.start.isEqual(other.start) && this.end.isEqual(other.end)\n\t}\n\n\t/**\n\t * Get the intersection of this range with another range\n\t *\n\t * @param other - The other range\n\t * @returns The intersection range, or undefined if they don't intersect\n\t */\n\tintersection(other: IRange): Range | undefined {\n\t\tconst start = this.start.isAfter(other.start) ? this.start : other.start\n\t\tconst end = this.end.isBefore(other.end) ? this.end : other.end\n\t\tif (start.isAfter(end)) {\n\t\t\treturn undefined\n\t\t}\n\t\treturn new Range(start, end)\n\t}\n\n\t/**\n\t * Get the union of this range with another range\n\t *\n\t * @param other - The other range\n\t * @returns A new range that spans both ranges\n\t */\n\tunion(other: IRange): Range {\n\t\tconst start = this.start.isBefore(other.start) ? this.start : other.start\n\t\tconst end = this.end.isAfter(other.end) ? this.end : other.end\n\t\treturn new Range(start, end)\n\t}\n\n\t/**\n\t * Create a new range with modified start or end positions\n\t *\n\t * @param start - The new start position (or undefined to keep current)\n\t * @param end - The new end position (or undefined to keep current)\n\t * @returns A new Range\n\t */\n\twithChanges(start?: IPosition, end?: IPosition): Range\n\twithChanges(change: { start?: IPosition; end?: IPosition }): Range\n\twithChanges(startOrChange?: IPosition | { start?: IPosition; end?: IPosition }, end?: IPosition): Range {\n\t\t// Check if it's a change object (has start or end property, but not line/character like a Position)\n\t\tif (startOrChange && typeof startOrChange === \"object\" && !(\"line\" in startOrChange)) {\n\t\t\tconst change = startOrChange as { start?: IPosition; end?: IPosition }\n\t\t\treturn new Range(change.start || this.start, change.end || this.end)\n\t\t}\n\t\treturn new Range((startOrChange as IPosition) || this.start, end || this.end)\n\t}\n}\n","import { Range } from \"./Range.js\"\nimport { Position } from \"./Position.js\"\nimport type { ISelection, IPosition } from \"../types.js\"\n\n/**\n * Represents a text selection in an editor\n *\n * A selection extends Range with anchor and active positions.\n * The anchor is where the selection starts, and the active is where it ends.\n * The selection can be reversed if the active position is before the anchor.\n *\n * @example\n * ```typescript\n * // Create a selection from position 0,0 to 5,10\n * const selection = new Selection(\n * new Position(0, 0),\n * new Position(5, 10)\n * )\n *\n * console.log(selection.isReversed) // false\n * ```\n */\nexport class Selection extends Range implements ISelection {\n\t/**\n\t * The anchor position (where the selection started)\n\t */\n\tpublic readonly anchor: Position\n\n\t/**\n\t * The active position (where the selection currently ends)\n\t */\n\tpublic readonly active: Position\n\n\t/**\n\t * Create a new Selection\n\t *\n\t * @param anchor - The anchor position\n\t * @param active - The active position\n\t */\n\tconstructor(anchor: IPosition, active: IPosition)\n\t/**\n\t * Create a new Selection from line and character numbers\n\t *\n\t * @param anchorLine - The anchor line number\n\t * @param anchorCharacter - The anchor character offset\n\t * @param activeLine - The active line number\n\t * @param activeCharacter - The active character offset\n\t */\n\tconstructor(anchorLine: number, anchorCharacter: number, activeLine: number, activeCharacter: number)\n\tconstructor(\n\t\tanchorOrAnchorLine: IPosition | number,\n\t\tactiveOrAnchorCharacter: IPosition | number,\n\t\tactiveLine?: number,\n\t\tactiveCharacter?: number,\n\t) {\n\t\tlet anchor: Position\n\t\tlet active: Position\n\n\t\tif (typeof anchorOrAnchorLine === \"number\") {\n\t\t\tanchor = new Position(anchorOrAnchorLine, activeOrAnchorCharacter as number)\n\t\t\tactive = new Position(activeLine!, activeCharacter!)\n\t\t} else {\n\t\t\tanchor = anchorOrAnchorLine as Position\n\t\t\tactive = activeOrAnchorCharacter as Position\n\t\t}\n\n\t\tsuper(anchor, active)\n\t\tthis.anchor = anchor\n\t\tthis.active = active\n\t}\n\n\t/**\n\t * Check if the selection is reversed\n\t * A reversed selection has the active position before the anchor position\n\t */\n\tget isReversed(): boolean {\n\t\treturn this.anchor.isAfter(this.active)\n\t}\n}\n","import * as path from \"path\"\n\n/**\n * Uniform Resource Identifier (URI) implementation\n *\n * Represents a URI following the RFC 3986 standard.\n * This class is compatible with VSCode's Uri class and provides\n * file system path handling for cross-platform compatibility.\n *\n * @example\n * ```typescript\n * // Create a file URI\n * const fileUri = Uri.file('/path/to/file.txt')\n * console.log(fileUri.fsPath) // '/path/to/file.txt'\n *\n * // Parse a URI string\n * const uri = Uri.parse('https://example.com/path?query=1#fragment')\n * console.log(uri.scheme) // 'https'\n * console.log(uri.path) // '/path'\n * ```\n */\nexport class Uri {\n\tpublic readonly scheme: string\n\tpublic readonly authority: string\n\tpublic readonly path: string\n\tpublic readonly query: string\n\tpublic readonly fragment: string\n\n\tconstructor(scheme: string, authority: string, path: string, query: string, fragment: string) {\n\t\tthis.scheme = scheme\n\t\tthis.authority = authority\n\t\tthis.path = path\n\t\tthis.query = query\n\t\tthis.fragment = fragment\n\t}\n\n\t/**\n\t * Create a URI from a file system path\n\t *\n\t * @param path - The file system path\n\t * @returns A new Uri instance with 'file' scheme\n\t */\n\tstatic file(fsPath: string): Uri {\n\t\treturn new Uri(\"file\", \"\", fsPath, \"\", \"\")\n\t}\n\n\t/**\n\t * Parse a URI string\n\t *\n\t * @param value - The URI string to parse\n\t * @returns A new Uri instance\n\t */\n\tstatic parse(value: string): Uri {\n\t\ttry {\n\t\t\tconst url = new URL(value)\n\t\t\treturn new Uri(\n\t\t\t\turl.protocol.slice(0, -1),\n\t\t\t\turl.hostname,\n\t\t\t\turl.pathname,\n\t\t\t\turl.search.slice(1),\n\t\t\t\turl.hash.slice(1),\n\t\t\t)\n\t\t} catch {\n\t\t\t// If URL parsing fails, treat as file path\n\t\t\treturn Uri.file(value)\n\t\t}\n\t}\n\n\t/**\n\t * Join a URI with path segments\n\t *\n\t * @param base - The base URI\n\t * @param pathSegments - Path segments to join\n\t * @returns A new Uri with the joined path\n\t */\n\tstatic joinPath(base: Uri, ...pathSegments: string[]): Uri {\n\t\tconst joinedPath = path.join(base.path, ...pathSegments)\n\t\treturn new Uri(base.scheme, base.authority, joinedPath, base.query, base.fragment)\n\t}\n\n\t/**\n\t * Create a new URI with modifications\n\t *\n\t * @param change - The changes to apply\n\t * @returns A new Uri instance with the changes applied\n\t */\n\twith(change: { scheme?: string; authority?: string; path?: string; query?: string; fragment?: string }): Uri {\n\t\treturn new Uri(\n\t\t\tchange.scheme !== undefined ? change.scheme : this.scheme,\n\t\t\tchange.authority !== undefined ? change.authority : this.authority,\n\t\t\tchange.path !== undefined ? change.path : this.path,\n\t\t\tchange.query !== undefined ? change.query : this.query,\n\t\t\tchange.fragment !== undefined ? change.fragment : this.fragment,\n\t\t)\n\t}\n\n\t/**\n\t * Get the file system path representation\n\t * Compatible with both Unix and Windows paths\n\t */\n\tget fsPath(): string {\n\t\treturn this.path\n\t}\n\n\t/**\n\t * Convert the URI to a string representation\n\t */\n\ttoString(): string {\n\t\treturn `${this.scheme}://${this.authority}${this.path}${this.query ? \"?\" + this.query : \"\"}${this.fragment ? \"#\" + this.fragment : \"\"}`\n\t}\n\n\t/**\n\t * Convert to JSON representation\n\t */\n\ttoJSON(): object {\n\t\treturn {\n\t\t\tscheme: this.scheme,\n\t\t\tauthority: this.authority,\n\t\t\tpath: this.path,\n\t\t\tquery: this.query,\n\t\t\tfragment: this.fragment,\n\t\t}\n\t}\n}\n","import type { Disposable, Event } from \"../types.js\"\n\n/**\n * VSCode-compatible EventEmitter implementation\n *\n * Provides a type-safe event emitter that matches VSCode's EventEmitter API.\n * Listeners can subscribe to events and will be notified when events are fired.\n *\n * @example\n * ```typescript\n * const emitter = new EventEmitter<string>()\n *\n * // Subscribe to events\n * const disposable = emitter.event((value) => {\n * console.log('Event fired:', value)\n * })\n *\n * // Fire an event\n * emitter.fire('Hello, world!')\n *\n * // Clean up\n * disposable.dispose()\n * emitter.dispose()\n * ```\n */\nexport class EventEmitter<T> {\n\treadonly #listeners = new Set<(e: T) => void>()\n\n\t/**\n\t * The event that listeners can subscribe to\n\t *\n\t * @param listener - The callback function to invoke when the event fires\n\t * @param thisArgs - Optional 'this' context for the listener\n\t * @param disposables - Optional array to add the disposable to\n\t * @returns A disposable to unsubscribe from the event\n\t */\n\tevent: Event<T> = (listener: (e: T) => void, thisArgs?: unknown, disposables?: Disposable[]): Disposable => {\n\t\tconst fn = thisArgs ? listener.bind(thisArgs) : listener\n\t\tthis.#listeners.add(fn)\n\n\t\tconst disposable: Disposable = {\n\t\t\tdispose: () => {\n\t\t\t\tthis.#listeners.delete(fn)\n\t\t\t},\n\t\t}\n\n\t\tif (disposables) {\n\t\t\tdisposables.push(disposable)\n\t\t}\n\n\t\treturn disposable\n\t}\n\n\t/**\n\t * Fire the event, notifying all subscribers\n\t *\n\t * Failure of one or more listeners will not fail this function call.\n\t * Failed listeners will be caught and ignored to prevent one listener\n\t * from breaking others.\n\t *\n\t * @param data - The event data to pass to listeners\n\t */\n\tfire(data: T): void {\n\t\tfor (const listener of this.#listeners) {\n\t\t\ttry {\n\t\t\t\tlistener(data)\n\t\t\t} catch (error) {\n\t\t\t\t// Silently ignore listener errors to prevent one failing listener\n\t\t\t\t// from affecting others. Consumers can add error handling in their listeners.\n\t\t\t\tconsole.error(\"EventEmitter listener error:\", error)\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Dispose this event emitter and remove all listeners\n\t */\n\tdispose(): void {\n\t\tthis.#listeners.clear()\n\t}\n\n\t/**\n\t * Get the current number of listeners (useful for debugging)\n\t */\n\tget listenerCount(): number {\n\t\treturn this.#listeners.size\n\t}\n}\n","import { Position } from \"./Position.js\"\nimport { Range } from \"./Range.js\"\nimport type { IRange, IPosition } from \"../types.js\"\n\n/**\n * Represents a text edit operation\n *\n * A text edit replaces text in a specific range with new text.\n * This is used to modify documents programmatically.\n *\n * @example\n * ```typescript\n * // Replace text in a range\n * const edit = TextEdit.replace(\n * new Range(0, 0, 0, 5),\n * 'Hello'\n * )\n *\n * // Insert text at a position\n * const insert = TextEdit.insert(\n * new Position(0, 0),\n * 'New text'\n * )\n *\n * // Delete text in a range\n * const deletion = TextEdit.delete(\n * new Range(0, 0, 0, 10)\n * )\n * ```\n */\nexport class TextEdit {\n\t/**\n\t * The range to replace\n\t */\n\tpublic readonly range: Range\n\n\t/**\n\t * The new text (empty string for deletion)\n\t */\n\tpublic readonly newText: string\n\n\t/**\n\t * Create a new TextEdit\n\t *\n\t * @param range - The range to replace\n\t * @param newText - The new text\n\t */\n\tconstructor(range: IRange, newText: string) {\n\t\tthis.range = range as Range\n\t\tthis.newText = newText\n\t}\n\n\t/**\n\t * Create a replace edit\n\t *\n\t * @param range - The range to replace\n\t * @param newText - The new text\n\t * @returns A new TextEdit\n\t */\n\tstatic replace(range: IRange, newText: string): TextEdit {\n\t\treturn new TextEdit(range, newText)\n\t}\n\n\t/**\n\t * Create an insert edit\n\t *\n\t * @param position - The position to insert at\n\t * @param newText - The text to insert\n\t * @returns A new TextEdit\n\t */\n\tstatic insert(position: IPosition, newText: string): TextEdit {\n\t\treturn new TextEdit(new Range(position, position), newText)\n\t}\n\n\t/**\n\t * Create a delete edit\n\t *\n\t * @param range - The range to delete\n\t * @returns A new TextEdit\n\t */\n\tstatic delete(range: IRange): TextEdit {\n\t\treturn new TextEdit(range, \"\")\n\t}\n\n\t/**\n\t * Create an edit to set the end of line sequence\n\t *\n\t * @returns A new TextEdit (simplified implementation)\n\t */\n\tstatic setEndOfLine(): TextEdit {\n\t\treturn new TextEdit(new Range(new Position(0, 0), new Position(0, 0)), \"\")\n\t}\n}\n\n/**\n * Represents a collection of text edits for a document\n *\n * A WorkspaceEdit can contain edits for multiple documents.\n *\n * @example\n * ```typescript\n * const edit = new WorkspaceEdit()\n *\n * // Add edits for a file\n * edit.set(uri, [\n * TextEdit.replace(range1, 'new text'),\n * TextEdit.insert(pos, 'inserted')\n * ])\n *\n * // Apply the edit\n * await vscode.workspace.applyEdit(edit)\n * ```\n */\nexport class WorkspaceEdit {\n\tprivate _edits: Map<string, TextEdit[]> = new Map()\n\n\t/**\n\t * Set edits for a specific URI\n\t *\n\t * @param uri - The document URI\n\t * @param edits - Array of text edits\n\t */\n\tset(uri: { toString(): string }, edits: TextEdit[]): void {\n\t\tthis._edits.set(uri.toString(), edits)\n\t}\n\n\t/**\n\t * Get edits for a specific URI\n\t *\n\t * @param uri - The document URI\n\t * @returns Array of text edits, or empty array if none\n\t */\n\tget(uri: { toString(): string }): TextEdit[] {\n\t\treturn this._edits.get(uri.toString()) || []\n\t}\n\n\t/**\n\t * Check if edits exist for a URI\n\t *\n\t * @param uri - The document URI\n\t * @returns true if edits exist\n\t */\n\thas(uri: { toString(): string }): boolean {\n\t\treturn this._edits.has(uri.toString())\n\t}\n\n\t/**\n\t * Add a delete edit for a range\n\t *\n\t * @param uri - The document URI\n\t * @param range - The range to delete\n\t */\n\tdelete(uri: { toString(): string }, range: IRange): void {\n\t\tconst key = uri.toString()\n\t\tif (!this._edits.has(key)) {\n\t\t\tthis._edits.set(key, [])\n\t\t}\n\t\tthis._edits.get(key)!.push(TextEdit.delete(range))\n\t}\n\n\t/**\n\t * Add an insert edit\n\t *\n\t * @param uri - The document URI\n\t * @param position - The position to insert at\n\t * @param newText - The text to insert\n\t */\n\tinsert(uri: { toString(): string }, position: IPosition, newText: string): void {\n\t\tconst key = uri.toString()\n\t\tif (!this._edits.has(key)) {\n\t\t\tthis._edits.set(key, [])\n\t\t}\n\t\tthis._edits.get(key)!.push(TextEdit.insert(position, newText))\n\t}\n\n\t/**\n\t * Add a replace edit\n\t *\n\t * @param uri - The document URI\n\t * @param range - The range to replace\n\t * @param newText - The new text\n\t */\n\treplace(uri: { toString(): string }, range: IRange, newText: string): void {\n\t\tconst key = uri.toString()\n\t\tif (!this._edits.has(key)) {\n\t\t\tthis._edits.set(key, [])\n\t\t}\n\t\tthis._edits.get(key)!.push(TextEdit.replace(range, newText))\n\t}\n\n\t/**\n\t * Get the number of documents with edits\n\t */\n\tget size(): number {\n\t\treturn this._edits.size\n\t}\n\n\t/**\n\t * Get all URI and edits pairs\n\t *\n\t * @returns Array of [URI, TextEdit[]] pairs\n\t */\n\tentries(): [{ toString(): string; fsPath: string }, TextEdit[]][] {\n\t\treturn Array.from(this._edits.entries()).map(([uriString, edits]) => {\n\t\t\t// Parse the URI string back to a URI-like object\n\t\t\treturn [{ toString: () => uriString, fsPath: uriString.replace(/^file:\\/\\//, \"\") }, edits]\n\t\t})\n\t}\n}\n","/**\n * Additional VSCode API classes for extension support\n *\n * This file contains supplementary classes and types that extensions may need.\n */\n\nimport { Range } from \"./Range.js\"\nimport type { IUri, IRange, IPosition, DiagnosticSeverity, DiagnosticTag } from \"../types.js\"\n\n/**\n * Represents a location in source code (URI + Range or Position)\n */\nexport class Location {\n\tconstructor(\n\t\tpublic uri: IUri,\n\t\tpublic range: IRange | IPosition,\n\t) {}\n}\n\n/**\n * Related diagnostic information\n */\nexport class DiagnosticRelatedInformation {\n\tconstructor(\n\t\tpublic location: Location,\n\t\tpublic message: string,\n\t) {}\n}\n\n/**\n * Represents a diagnostic (error, warning, etc.)\n */\nexport class Diagnostic {\n\trange: Range\n\tmessage: string\n\tseverity: DiagnosticSeverity\n\tsource?: string\n\tcode?: string | number | { value: string | number; target: IUri }\n\trelatedInformation?: DiagnosticRelatedInformation[]\n\ttags?: DiagnosticTag[]\n\n\tconstructor(range: IRange, message: string, severity?: DiagnosticSeverity) {\n\t\tthis.range = range as Range\n\t\tthis.message = message\n\t\tthis.severity = severity !== undefined ? severity : 0 // Error\n\t}\n}\n\n/**\n * Theme color reference\n */\nexport class ThemeColor {\n\tconstructor(public id: string) {}\n}\n\n/**\n * Theme icon reference\n */\nexport class ThemeIcon {\n\tconstructor(\n\t\tpublic id: string,\n\t\tpublic color?: ThemeColor,\n\t) {}\n}\n\n/**\n * Code action kind for categorizing code actions\n */\nexport class CodeActionKind {\n\tstatic readonly Empty = new CodeActionKind(\"\")\n\tstatic readonly QuickFix = new CodeActionKind(\"quickfix\")\n\tstatic readonly Refactor = new CodeActionKind(\"refactor\")\n\tstatic readonly RefactorExtract = new CodeActionKind(\"refactor.extract\")\n\tstatic readonly RefactorInline = new CodeActionKind(\"refactor.inline\")\n\tstatic readonly RefactorRewrite = new CodeActionKind(\"refactor.rewrite\")\n\tstatic readonly Source = new CodeActionKind(\"source\")\n\tstatic readonly SourceOrganizeImports = new CodeActionKind(\"source.organizeImports\")\n\n\tconstructor(public value: string) {}\n\n\tappend(parts: string): CodeActionKind {\n\t\treturn new CodeActionKind(this.value ? `${this.value}.${parts}` : parts)\n\t}\n\n\tintersects(other: CodeActionKind): boolean {\n\t\treturn this.contains(other) || other.contains(this)\n\t}\n\n\tcontains(other: CodeActionKind): boolean {\n\t\treturn this.value === other.value || other.value.startsWith(this.value + \".\")\n\t}\n}\n\n/**\n * Code lens for displaying inline information\n */\nexport class CodeLens {\n\tpublic range: Range\n\tpublic command?: { command: string; title: string; arguments?: unknown[] } | undefined\n\tpublic isResolved: boolean = false\n\n\tconstructor(range: IRange, command?: { command: string; title: string; arguments?: unknown[] } | undefined) {\n\t\tthis.range = range as Range\n\t\tthis.command = command\n\t}\n}\n\n/**\n * Language Model API parts\n */\nexport class LanguageModelTextPart {\n\tconstructor(public value: string) {}\n}\n\nexport class LanguageModelToolCallPart {\n\tconstructor(\n\t\tpublic callId: string,\n\t\tpublic name: string,\n\t\tpublic input: unknown,\n\t) {}\n}\n\nexport class LanguageModelToolResultPart {\n\tconstructor(\n\t\tpublic callId: string,\n\t\tpublic content: unknown[],\n\t) {}\n}\n\n/**\n * File system error with specific error codes\n */\nexport class FileSystemError extends Error {\n\tpublic code: string\n\n\tconstructor(message: string, code: string = \"Unknown\") {\n\t\tsuper(message)\n\t\tthis.name = \"FileSystemError\"\n\t\tthis.code = code\n\t}\n\n\tstatic FileNotFound(messageOrUri?: string | IUri): FileSystemError {\n\t\tconst message =\n\t\t\ttypeof messageOrUri === \"string\" ? messageOrUri : `File not found: ${messageOrUri?.fsPath || \"unknown\"}`\n\t\treturn new FileSystemError(message, \"FileNotFound\")\n\t}\n\n\tstatic FileExists(messageOrUri?: string | IUri): FileSystemError {\n\t\tconst message =\n\t\t\ttypeof messageOrUri === \"string\" ? messageOrUri : `File exists: ${messageOrUri?.fsPath || \"unknown\"}`\n\t\treturn new FileSystemError(message, \"FileExists\")\n\t}\n\n\tstatic FileNotADirectory(messageOrUri?: string | IUri): FileSystemError {\n\t\tconst message =\n\t\t\ttypeof messageOrUri === \"string\"\n\t\t\t\t? messageOrUri\n\t\t\t\t: `File is not a directory: ${messageOrUri?.fsPath || \"unknown\"}`\n\t\treturn new FileSystemError(message, \"FileNotADirectory\")\n\t}\n\n\tstatic FileIsADirectory(messageOrUri?: string | IUri): FileSystemError {\n\t\tconst message =\n\t\t\ttypeof messageOrUri === \"string\"\n\t\t\t\t? messageOrUri\n\t\t\t\t: `File is a directory: ${messageOrUri?.fsPath || \"unknown\"}`\n\t\treturn new FileSystemError(message, \"FileIsADirectory\")\n\t}\n\n\tstatic NoPermissions(messageOrUri?: string | IUri): FileSystemError {\n\t\tconst message =\n\t\t\ttypeof messageOrUri === \"string\" ? messageOrUri : `No permissions: ${messageOrUri?.fsPath || \"unknown\"}`\n\t\treturn new FileSystemError(message, \"NoPermissions\")\n\t}\n\n\tstatic Unavailable(messageOrUri?: string | IUri): FileSystemError {\n\t\tconst message =\n\t\t\ttypeof messageOrUri === \"string\" ? messageOrUri : `Unavailable: ${messageOrUri?.fsPath || \"unknown\"}`\n\t\treturn new FileSystemError(message, \"Unavailable\")\n\t}\n}\n","/**\n * CancellationToken and CancellationTokenSource for VSCode API\n */\n\nimport { EventEmitter } from \"./EventEmitter.js\"\nimport type { Disposable } from \"../interfaces/workspace.js\"\n\n/**\n * Cancellation token interface\n */\nexport interface CancellationToken {\n\tisCancellationRequested: boolean\n\tonCancellationRequested: (listener: (e: unknown) => void) => Disposable\n}\n\n/**\n * CancellationTokenSource creates and controls a CancellationToken\n */\nexport class CancellationTokenSource {\n\tprivate _token: CancellationToken\n\tprivate _isCancelled = false\n\tprivate _onCancellationRequestedEmitter = new EventEmitter<void>()\n\n\tconstructor() {\n\t\tthis._token = {\n\t\t\tisCancellationRequested: false,\n\t\t\tonCancellationRequested: this._onCancellationRequestedEmitter.event,\n\t\t}\n\t}\n\n\tget token(): CancellationToken {\n\t\treturn this._token\n\t}\n\n\tcancel(): void {\n\t\tif (!this._isCancelled) {\n\t\t\tthis._isCancelled = true\n\t\t\t// Type assertion needed to modify readonly property\n\t\t\t;(this._token as { isCancellationRequested: boolean }).isCancellationRequested = true\n\t\t\tthis._onCancellationRequestedEmitter.fire(undefined)\n\t\t}\n\t}\n\n\tdispose(): void {\n\t\tthis.cancel()\n\t\tthis._onCancellationRequestedEmitter.dispose()\n\t}\n}\n","/**\n * Simple logger stub for VSCode mock\n * Users can provide their own logger by calling setLogger()\n */\n\nexport interface Logger {\n\tinfo(message: string, context?: string, meta?: unknown): void\n\twarn(message: string, context?: string, meta?: unknown): void\n\terror(message: string, context?: string, meta?: unknown): void\n\tdebug(message: string, context?: string, meta?: unknown): void\n}\n\nclass ConsoleLogger implements Logger {\n\tinfo(message: string, context?: string, _meta?: unknown): void {\n\t\tconsole.log(`[${context || \"INFO\"}] ${message}`)\n\t}\n\n\twarn(message: string, context?: string, _meta?: unknown): void {\n\t\tconsole.warn(`[${context || \"WARN\"}] ${message}`)\n\t}\n\n\terror(message: string, context?: string, _meta?: unknown): void {\n\t\tconsole.error(`[${context || \"ERROR\"}] ${message}`)\n\t}\n\n\tdebug(message: string, context?: string, _meta?: unknown): void {\n\t\tif (process.env.DEBUG) {\n\t\t\tconsole.debug(`[${context || \"DEBUG\"}] ${message}`)\n\t\t}\n\t}\n}\n\nlet logger: Logger = new ConsoleLogger()\n\n/**\n * Set a custom logger\n *\n * @param customLogger - Your logger implementation\n */\nexport function setLogger(customLogger: Logger): void {\n\tlogger = customLogger\n}\n\n/**\n * Get the current logger\n */\nexport const logs = {\n\tinfo: (message: string, context?: string, meta?: unknown) => logger.info(message, context, meta),\n\twarn: (message: string, context?: string, meta?: unknown) => logger.warn(message, context, meta),\n\terror: (message: string, context?: string, meta?: unknown) => logger.error(message, context, meta),\n\tdebug: (message: string, context?: string, meta?: unknown) => logger.debug(message, context, meta),\n}\n","/**\n * OutputChannel class for VSCode API\n */\n\nimport { logs } from \"../utils/logger.js\"\nimport type { Disposable } from \"../interfaces/workspace.js\"\n\n/**\n * Output channel mock for CLI mode\n * Logs output to the configured logger instead of VSCode's output panel\n */\nexport class OutputChannel implements Disposable {\n\tprivate _name: string\n\n\tconstructor(name: string) {\n\t\tthis._name = name\n\t}\n\n\tget name(): string {\n\t\treturn this._name\n\t}\n\n\tappend(value: string): void {\n\t\tlogs.info(`[${this._name}] ${value}`, \"VSCode.OutputChannel\")\n\t}\n\n\tappendLine(value: string): void {\n\t\tlogs.info(`[${this._name}] ${value}`, \"VSCode.OutputChannel\")\n\t}\n\n\tclear(): void {\n\t\t// No-op for CLI\n\t}\n\n\tshow(): void {\n\t\t// No-op for CLI\n\t}\n\n\thide(): void {\n\t\t// No-op for CLI\n\t}\n\n\tdispose(): void {\n\t\t// No-op for CLI\n\t}\n}\n","/**\n * StatusBarItem class for VSCode API\n */\n\nimport { StatusBarAlignment } from \"../types.js\"\nimport type { Disposable } from \"../interfaces/workspace.js\"\n\n/**\n * Status bar item mock for CLI mode\n */\nexport class StatusBarItem implements Disposable {\n\tprivate _text: string = \"\"\n\tprivate _tooltip: string | undefined\n\tprivate _command: string | undefined\n\tprivate _color: string | undefined\n\tprivate _backgroundColor: string | undefined\n\tprivate _isVisible: boolean = false\n\n\tconstructor(\n\t\tpublic readonly alignment: StatusBarAlignment,\n\t\tpublic readonly priority?: number,\n\t) {}\n\n\tget text(): string {\n\t\treturn this._text\n\t}\n\n\tset text(value: string) {\n\t\tthis._text = value\n\t}\n\n\tget tooltip(): string | undefined {\n\t\treturn this._tooltip\n\t}\n\n\tset tooltip(value: string | undefined) {\n\t\tthis._tooltip = value\n\t}\n\n\tget command(): string | undefined {\n\t\treturn this._command\n\t}\n\n\tset command(value: string | undefined) {\n\t\tthis._command = value\n\t}\n\n\tget color(): string | undefined {\n\t\treturn this._color\n\t}\n\n\tset color(value: string | undefined) {\n\t\tthis._color = value\n\t}\n\n\tget backgroundColor(): string | undefined {\n\t\treturn this._backgroundColor\n\t}\n\n\tset backgroundColor(value: string | undefined) {\n\t\tthis._backgroundColor = value\n\t}\n\n\tget isVisible(): boolean {\n\t\treturn this._isVisible\n\t}\n\n\tshow(): void {\n\t\tthis._isVisible = true\n\t}\n\n\thide(): void {\n\t\tthis._isVisible = false\n\t}\n\n\tdispose(): void {\n\t\tthis._isVisible = false\n\t}\n}\n","/**\n * TextEditorDecorationType class for VSCode API\n */\n\nimport type { Disposable } from \"../interfaces/workspace.js\"\n\n/**\n * Text editor decoration type mock for CLI mode\n */\nexport class TextEditorDecorationType implements Disposable {\n\tpublic key: string\n\n\tconstructor(key: string) {\n\t\tthis.key = key\n\t}\n\n\tdispose(): void {\n\t\t// No-op for CLI\n\t}\n}\n","import * as path from \"path\"\nimport * as fs from \"fs\"\nimport { Uri } from \"../classes/Uri.js\"\nimport { FileMemento } from \"../storage/Memento.js\"\nimport { FileSecretStorage } from \"../storage/SecretStorage.js\"\nimport { hashWorkspacePath, ensureDirectoryExists } from \"../utils/paths.js\"\nimport type {\n\tExtensionContext,\n\tExtension,\n\tDisposable,\n\tMemento,\n\tSecretStorage,\n\tExtensionMode,\n\tExtensionKind,\n} from \"../types.js\"\n\n/**\n * Options for creating an ExtensionContext\n */\nexport interface ExtensionContextOptions {\n\t/**\n\t * Path to the extension's root directory\n\t */\n\textensionPath: string\n\n\t/**\n\t * Path to the workspace directory\n\t */\n\tworkspacePath: string\n\n\t/**\n\t * Optional custom storage directory (defaults to ~/.vscode-mock)\n\t */\n\tstorageDir?: string\n\n\t/**\n\t * Extension mode (Production, Development, or Test)\n\t */\n\textensionMode?: ExtensionMode\n}\n\n/**\n * Implementation of VSCode's ExtensionContext\n *\n * Provides the context object passed to extension activation functions.\n * This includes state storage, secrets, and extension metadata.\n *\n * @example\n * ```typescript\n * const context = new ExtensionContextImpl({\n * extensionPath: '/path/to/extension',\n * workspacePath: '/path/to/workspace'\n * })\n *\n * // Use in extension activation\n * const api = await extension.activate(context)\n * ```\n */\nexport class ExtensionContextImpl implements ExtensionContext {\n\tpublic subscriptions: Disposable[] = []\n\tpublic workspaceState: Memento\n\tpublic globalState: Memento & { setKeysForSync(keys: readonly string[]): void }\n\tpublic secrets: SecretStorage\n\tpublic extensionUri: Uri\n\tpublic extensionPath: string\n\tpublic environmentVariableCollection: Record<string, unknown> = {}\n\tpublic storageUri: Uri | undefined\n\tpublic storagePath: string | undefined\n\tpublic globalStorageUri: Uri\n\tpublic globalStoragePath: string\n\tpublic logUri: Uri\n\tpublic logPath: string\n\tpublic extensionMode: ExtensionMode\n\tpublic extension: Extension<unknown> | undefined\n\n\tconstructor(options: ExtensionContextOptions) {\n\t\tthis.extensionPath = options.extensionPath\n\t\tthis.extensionUri = Uri.file(options.extensionPath)\n\t\tthis.extensionMode = options.extensionMode || 1 // Default to Production\n\n\t\t// Setup storage paths\n\t\tconst baseStorageDir =\n\t\t\toptions.storageDir || path.join(process.env.HOME || process.env.USERPROFILE || \".\", \".vscode-mock\")\n\t\tconst workspaceHash = hashWorkspacePath(options.workspacePath)\n\n\t\tthis.globalStoragePath = path.join(baseStorageDir, \"global-storage\")\n\t\tthis.globalStorageUri = Uri.file(this.globalStoragePath)\n\n\t\tconst workspaceStoragePath = path.join(baseStorageDir, \"workspace-storage\", workspaceHash)\n\t\tthis.storagePath = workspaceStoragePath\n\t\tthis.storageUri = Uri.file(workspaceStoragePath)\n\n\t\tthis.logPath = path.join(baseStorageDir, \"logs\")\n\t\tthis.logUri = Uri.file(this.logPath)\n\n\t\t// Ensure directories exist\n\t\tensureDirectoryExists(this.globalStoragePath)\n\t\tensureDirectoryExists(workspaceStoragePath)\n\t\tensureDirectoryExists(this.logPath)\n\n\t\t// Initialize state storage\n\t\tthis.workspaceState = new FileMemento(path.join(workspaceStoragePath, \"workspace-state.json\"))\n\n\t\tconst globalMemento = new FileMemento(path.join(this.globalStoragePath, \"global-state.json\"))\n\t\tthis.globalState = Object.assign(globalMemento, {\n\t\t\tsetKeysForSync: (_keys: readonly string[]) => {\n\t\t\t\t// No-op for mock implementation\n\t\t\t},\n\t\t})\n\n\t\tthis.secrets = new FileSecretStorage(this.globalStoragePath)\n\n\t\t// Load extension metadata (packageJSON)\n\t\tthis.extension = this.loadExtensionMetadata()\n\t}\n\n\t/**\n\t * Load extension metadata from package.json\n\t */\n\tprivate loadExtensionMetadata(): Extension<unknown> | undefined {\n\t\ttry {\n\t\t\t// Try to load package.json from extension path\n\t\t\tconst packageJsonPath = path.join(this.extensionPath, \"package.json\")\n\t\t\tif (fs.existsSync(packageJsonPath)) {\n\t\t\t\tconst packageJSON = JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\"))\n\t\t\t\tconst extensionId = `${packageJSON.publisher || \"unknown\"}.${packageJSON.name || \"unknown\"}`\n\n\t\t\t\treturn {\n\t\t\t\t\tid: extensionId,\n\t\t\t\t\textensionUri: this.extensionUri,\n\t\t\t\t\textensionPath: this.extensionPath,\n\t\t\t\t\tisActive: true,\n\t\t\t\t\tpackageJSON,\n\t\t\t\t\texports: undefined,\n\t\t\t\t\textensionKind: 1 as ExtensionKind, // UI\n\t\t\t\t\tactivate: () => Promise.resolve(undefined),\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore errors loading package.json\n\t\t}\n\t\treturn undefined\n\t}\n\n\t/**\n\t * Dispose all subscriptions\n\t */\n\tdispose(): void {\n\t\tfor (const subscription of this.subscriptions) {\n\t\t\ttry {\n\t\t\t\tsubscription.dispose()\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(\"Error disposing subscription:\", error)\n\t\t\t}\n\t\t}\n\t\tthis.subscriptions = []\n\t}\n}\n","import * as fs from \"fs\"\nimport * as path from \"path\"\nimport { ensureDirectoryExists } from \"../utils/paths.js\"\nimport type { Memento } from \"../types.js\"\n\n/**\n * File-based implementation of VSCode's Memento interface\n *\n * Provides persistent key-value storage backed by a JSON file.\n * This implementation automatically loads from and saves to disk.\n *\n * @example\n * ```typescript\n * const memento = new FileMemento('/path/to/state.json')\n *\n * // Store a value\n * await memento.update('lastOpenFile', '/path/to/file.txt')\n *\n * // Retrieve a value\n * const file = memento.get<string>('lastOpenFile')\n *\n * // With default value\n * const count = memento.get<number>('count', 0)\n * ```\n */\nexport class FileMemento implements Memento {\n\tprivate data: Record<string, unknown> = {}\n\tprivate filePath: string\n\n\t/**\n\t * Create a new FileMemento\n\t *\n\t * @param filePath - Path to the JSON file for persistence\n\t */\n\tconstructor(filePath: string) {\n\t\tthis.filePath = filePath\n\t\tthis.loadFromFile()\n\t}\n\n\t/**\n\t * Load data from the JSON file\n\t */\n\tprivate loadFromFile(): void {\n\t\ttry {\n\t\t\tif (fs.existsSync(this.filePath)) {\n\t\t\t\tconst content = fs.readFileSync(this.filePath, \"utf-8\")\n\t\t\t\tthis.data = JSON.parse(content)\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.warn(`Failed to load state from ${this.filePath}:`, error)\n\t\t\tthis.data = {}\n\t\t}\n\t}\n\n\t/**\n\t * Save data to the JSON file\n\t */\n\tprivate saveToFile(): void {\n\t\ttry {\n\t\t\t// Ensure directory exists\n\t\t\tconst dir = path.dirname(this.filePath)\n\t\t\tensureDirectoryExists(dir)\n\t\t\tfs.writeFileSync(this.filePath, JSON.stringify(this.data, null, 2))\n\t\t} catch (error) {\n\t\t\tconsole.warn(`Failed to save state to ${this.filePath}:`, error)\n\t\t}\n\t}\n\n\t/**\n\t * Get a value from storage\n\t *\n\t * @param key - The key to retrieve\n\t * @param defaultValue - Optional default value if key doesn't exist\n\t * @returns The stored value or default value\n\t */\n\tget<T>(key: string): T | undefined\n\tget<T>(key: string, defaultValue: T): T\n\tget<T>(key: string, defaultValue?: T): T | undefined {\n\t\tconst value = this.data[key]\n\t\treturn value !== undefined && value !== null ? (value as T) : defaultValue\n\t}\n\n\t/**\n\t * Update a value in storage\n\t *\n\t * @param key - The key to update\n\t * @param value - The value to store (undefined to delete)\n\t * @returns A promise that resolves when the update is complete\n\t */\n\tasync update(key: string, value: unknown): Promise<void> {\n\t\tif (value === undefined) {\n\t\t\tdelete this.data[key]\n\t\t} else {\n\t\t\tthis.data[key] = value\n\t\t}\n\t\tthis.saveToFile()\n\t}\n\n\t/**\n\t * Get all keys in storage\n\t *\n\t * @returns An array of all keys\n\t */\n\tkeys(): readonly string[] {\n\t\treturn Object.keys(this.data)\n\t}\n\n\t/**\n\t * Clear all data from storage\n\t */\n\tclear(): void {\n\t\tthis.data = {}\n\t\tthis.saveToFile()\n\t}\n}\n","/**\n * Path utilities for VSCode mock storage\n */\n\nimport * as fs from \"fs\"\nimport * as path from \"path\"\n\nconst STORAGE_BASE_DIR = \".vscode-mock\"\n\n/**\n * Get the base storage directory\n */\nfunction getBaseStorageDir(): string {\n\tconst homeDir = process.env.HOME || process.env.USERPROFILE || \".\"\n\treturn path.join(homeDir, STORAGE_BASE_DIR)\n}\n\n/**\n * Hash a workspace path to create a unique directory name\n *\n * @param workspacePath - The workspace path to hash\n * @returns A hexadecimal hash string\n */\nexport function hashWorkspacePath(workspacePath: string): string {\n\tlet hash = 0\n\tfor (let i = 0; i < workspacePath.length; i++) {\n\t\tconst char = workspacePath.charCodeAt(i)\n\t\thash = (hash << 5) - hash + char\n\t\thash = hash & hash // Convert to 32-bit integer\n\t}\n\treturn Math.abs(hash).toString(16)\n}\n\n/**\n * Ensure a directory exists, creating it if necessary\n *\n * @param dirPath - The directory path to ensure exists\n */\nexport function ensureDirectoryExists(dirPath: string): void {\n\ttry {\n\t\tif (!fs.existsSync(dirPath)) {\n\t\t\tfs.mkdirSync(dirPath, { recursive: true })\n\t\t}\n\t} catch (error) {\n\t\tconsole.warn(`Failed to create directory ${dirPath}:`, error)\n\t}\n}\n\n/**\n * Initialize workspace directories\n */\nexport function initializeWorkspace(workspacePath: string): void {\n\tconst dirs = [getGlobalStorageDir(), getWorkspaceStorageDir(workspacePath), getLogsDir()]\n\n\tfor (const dir of dirs) {\n\t\tif (!fs.existsSync(dir)) {\n\t\t\tfs.mkdirSync(dir, { recursive: true })\n\t\t}\n\t}\n}\n\n/**\n * Get global storage directory\n */\nexport function getGlobalStorageDir(): string {\n\treturn path.join(getBaseStorageDir(), \"global-storage\")\n}\n\n/**\n * Get workspace-specific storage directory\n */\nexport function getWorkspaceStorageDir(workspacePath: string): string {\n\tconst hash = hashWorkspacePath(workspacePath)\n\treturn path.join(getBaseStorageDir(), \"workspace-storage\", hash)\n}\n\n/**\n * Get logs directory\n */\nexport function getLogsDir(): string {\n\treturn path.join(getBaseStorageDir(), \"logs\")\n}\n\nexport const VSCodeMockPaths = {\n\tinitializeWorkspace,\n\tgetGlobalStorageDir,\n\tgetWorkspaceStorageDir,\n\tgetLogsDir,\n}\n","import * as fs from \"fs\"\nimport * as path from \"path\"\nimport { EventEmitter } from \"../classes/EventEmitter.js\"\nimport { ensureDirectoryExists } from \"../utils/paths.js\"\nimport type { SecretStorage, SecretStorageChangeEvent } from \"../types.js\"\n\n/**\n * File-based implementation of VSCode's SecretStorage interface\n *\n * Stores secrets in a JSON file on disk. While not encrypted like VSCode's\n * native keychain integration, this provides a simple, cross-platform solution\n * suitable for CLI applications.\n *\n * **Security Notes:**\n * - Secrets are stored as plain JSON (not encrypted)\n * - File permissions should be set restrictive (0600)\n * - For production, consider using environment variables instead\n * - Suitable for development and non-critical secrets\n *\n * @example\n * ```typescript\n * const storage = new FileSecretStorage('/path/to/secrets.json')\n *\n * // Store a secret\n * await storage.store('apiKey', 'sk-...')\n *\n * // Retrieve a secret\n * const key = await storage.get('apiKey')\n *\n * // Listen for changes\n * storage.onDidChange((e) => {\n * console.log(`Secret ${e.key} changed`)\n * })\n * ```\n */\nexport class FileSecretStorage implements SecretStorage {\n\tprivate secrets: Record<string, string> = {}\n\tprivate _onDidChange = new EventEmitter<SecretStorageChangeEvent>()\n\tprivate filePath: string\n\n\t/**\n\t * Create a new FileSecretStorage\n\t *\n\t * @param storagePath - Directory path where secrets.json will be stored\n\t */\n\tconstructor(storagePath: string) {\n\t\tthis.filePath = path.join(storagePath, \"secrets.json\")\n\t\tthis.loadFromFile()\n\t}\n\n\t/**\n\t * Load secrets from the JSON file\n\t */\n\tprivate loadFromFile(): void {\n\t\ttry {\n\t\t\tif (fs.existsSync(this.filePath)) {\n\t\t\t\tconst content = fs.readFileSync(this.filePath, \"utf-8\")\n\t\t\t\tthis.secrets = JSON.parse(content)\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.warn(`Failed to load secrets from ${this.filePath}:`, error)\n\t\t\tthis.secrets = {}\n\t\t}\n\t}\n\n\t/**\n\t * Save secrets to the JSON file with restrictive permissions\n\t */\n\tprivate saveToFile(): void {\n\t\ttry {\n\t\t\t// Ensure directory exists\n\t\t\tconst dir = path.dirname(this.filePath)\n\t\t\tensureDirectoryExists(dir)\n\n\t\t\t// Write the file\n\t\t\tfs.writeFileSync(this.filePath, JSON.stringify(this.secrets, null, 2))\n\n\t\t\t// Set restrictive permissions (owner read/write only) on Unix-like systems\n\t\t\tif (process.platform !== \"win32\") {\n\t\t\t\ttry {\n\t\t\t\t\tfs.chmodSync(this.filePath, 0o600)\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore chmod errors (might not be supported on some filesystems)\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.warn(`Failed to save secrets to ${this.filePath}:`, error)\n\t\t}\n\t}\n\n\t/**\n\t * Retrieve a secret by key\n\t *\n\t * @param key - The secret key\n\t * @returns The secret value or undefined if not found\n\t */\n\tasync get(key: string): Promise<string | undefined> {\n\t\treturn this.secrets[key]\n\t}\n\n\t/**\n\t * Store a secret\n\t *\n\t * @param key - The secret key\n\t * @param value - The secret value\n\t */\n\tasync store(key: string, value: string): Promise<void> {\n\t\tthis.secrets[key] = value\n\t\tthis.saveToFile()\n\t\tthis._onDidChange.fire({ key })\n\t}\n\n\t/**\n\t * Delete a secret\n\t *\n\t * @param key - The secret key to delete\n\t */\n\tasync delete(key: string): Promise<void> {\n\t\tdelete this.secrets[key]\n\t\tthis.saveToFile()\n\t\tthis._onDidChange.fire({ key })\n\t}\n\n\t/**\n\t * Event fired when a secret changes\n\t */\n\tget onDidChange() {\n\t\treturn this._onDidChange.event\n\t}\n\n\t/**\n\t * Clear all secrets (useful for testing)\n\t */\n\tclearAll(): void {\n\t\tthis.secrets = {}\n\t\tthis.saveToFile()\n\t}\n}\n","/**\n * FileSystemAPI class for VSCode API\n */\n\nimport * as fs from \"fs\"\nimport * as path from \"path\"\nimport { Uri } from \"../classes/Uri.js\"\nimport { FileSystemError } from \"../classes/Additional.js\"\nimport { ensureDirectoryExists } from \"../utils/paths.js\"\nimport type { FileStat } from \"../types.js\"\n\n/**\n * File system API mock for CLI mode\n * Provides file operations using Node.js fs module\n */\nexport class FileSystemAPI {\n\tasync stat(uri: Uri): Promise<FileStat> {\n\t\ttry {\n\t\t\tconst stats = fs.statSync(uri.fsPath)\n\t\t\treturn {\n\t\t\t\ttype: stats.isDirectory() ? 2 : 1, // Directory = 2, File = 1\n\t\t\t\tctime: stats.ctimeMs,\n\t\t\t\tmtime: stats.mtimeMs,\n\t\t\t\tsize: stats.size,\n\t\t\t}\n\t\t} catch {\n\t\t\t// If file doesn't exist, assume it's a file for CLI purposes\n\t\t\treturn {\n\t\t\t\ttype: 1, // File\n\t\t\t\tctime: Date.now(),\n\t\t\t\tmtime: Date.now(),\n\t\t\t\tsize: 0,\n\t\t\t}\n\t\t}\n\t}\n\n\tasync readFile(uri: Uri): Promise<Uint8Array> {\n\t\ttry {\n\t\t\tconst content = fs.readFileSync(uri.fsPath)\n\t\t\treturn new Uint8Array(content)\n\t\t} catch (error) {\n\t\t\t// Check if it's a file not found error (ENOENT)\n\t\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n\t\t\t\tthrow FileSystemError.FileNotFound(uri)\n\t\t\t}\n\t\t\t// For other errors, throw a generic FileSystemError\n\t\t\tthrow new FileSystemError(`Failed to read file: ${uri.fsPath}`)\n\t\t}\n\t}\n\n\tasync writeFile(uri: Uri, content: Uint8Array): Promise<void> {\n\t\ttry {\n\t\t\t// Ensure directory exists\n\t\t\tconst dir = path.dirname(uri.fsPath)\n\t\t\tensureDirectoryExists(dir)\n\t\t\tfs.writeFileSync(uri.fsPath, content)\n\t\t} catch {\n\t\t\tthrow new Error(`Failed to write file: ${uri.fsPath}`)\n\t\t}\n\t}\n\n\tasync delete(uri: Uri): Promise<void> {\n\t\ttry {\n\t\t\tfs.unlinkSync(uri.fsPath)\n\t\t} catch {\n\t\t\tthrow new Error(`Failed to delete file: ${uri.fsPath}`)\n\t\t}\n\t}\n\n\tasync createDirectory(uri: Uri): Promise<void> {\n\t\ttry {\n\t\t\tfs.mkdirSync(uri.fsPath, { recursive: true })\n\t\t} catch {\n\t\t\tthrow new Error(`Failed to create directory: ${uri.fsPath}`)\n\t\t}\n\t}\n}\n","/**\n * MockWorkspaceConfiguration class for VSCode API\n */\n\nimport * as path from \"path\"\nimport { logs } from \"../utils/logger.js\"\nimport { VSCodeMockPaths, ensureDirectoryExists } from \"../utils/paths.js\"\nimport { FileMemento } from \"../storage/Memento.ts\"\nimport { ConfigurationTarget } from \"../types.js\"\nimport type { ConfigurationInspect } from \"../types.js\"\nimport type { WorkspaceConfiguration } from \"../interfaces/workspace.js\"\nimport type { ExtensionContextImpl } from \"../context/ExtensionContext.js\"\n\n/**\n * In-memory runtime configuration store shared across all MockWorkspaceConfiguration instances.\n * This allows configuration to be updated at runtime (e.g., from CLI settings) without\n * persisting to disk. Values in this store take precedence over disk-based mementos.\n */\nconst runtimeConfig: Map<string, unknown> = new Map()\n\n/**\n * Set a runtime configuration value.\n * @param section The configuration section (e.g., \"roo-cline\")\n * @param key The configuration key (e.g., \"commandExecutionTimeout\")\n * @param value The value to set\n */\nexport function setRuntimeConfig(section: string, key: string, value: unknown): void {\n\tconst fullKey = `${section}.${key}`\n\truntimeConfig.set(fullKey, value)\n\tlogs.debug(`Runtime config set: ${fullKey} = ${JSON.stringify(value)}`, \"VSCode.MockWorkspaceConfiguration\")\n}\n\n/**\n * Set multiple runtime configuration values at once.\n * @param section The configuration section (e.g., \"roo-cline\")\n * @param values Object containing key-value pairs to set\n */\nexport function setRuntimeConfigValues(section: string, values: Record<string, unknown>): void {\n\tfor (const [key, value] of Object.entries(values)) {\n\t\tif (value !== undefined) {\n\t\t\tsetRuntimeConfig(section, key, value)\n\t\t}\n\t}\n}\n\n/**\n * Clear all runtime configuration values.\n */\nexport function clearRuntimeConfig(): void {\n\truntimeConfig.clear()\n\tlogs.debug(\"Runtime config cleared\", \"VSCode.MockWorkspaceConfiguration\")\n}\n\n/**\n * Get a runtime configuration value.\n * @param fullKey The full configuration key (e.g., \"roo-cline.commandExecutionTimeout\")\n * @returns The value or undefined if not set\n */\nexport function getRuntimeConfig(fullKey: string): unknown {\n\treturn runtimeConfig.get(fullKey)\n}\n\n/**\n * Mock workspace configuration for CLI mode\n * Persists configuration to JSON files\n */\nexport class MockWorkspaceConfiguration implements WorkspaceConfiguration {\n\tprivate section: string | undefined\n\tprivate globalMemento: FileMemento\n\tprivate workspaceMemento: FileMemento\n\n\tconstructor(section?: string, context?: ExtensionContextImpl) {\n\t\tthis.section = section\n\n\t\tif (context) {\n\t\t\t// Use the extension context's mementos\n\t\t\tthis.globalMemento = context.globalState as unknown as FileMemento\n\t\t\tthis.workspaceMemento = context.workspaceState as unknown as FileMemento\n\t\t} else {\n\t\t\t// Fallback: create our own mementos (shouldn't happen in normal usage)\n\t\t\tconst globalStoragePath = VSCodeMockPaths.getGlobalStorageDir()\n\t\t\tconst workspaceStoragePath = VSCodeMockPaths.getWorkspaceStorageDir(process.cwd())\n\n\t\t\tensureDirectoryExists(globalStoragePath)\n\t\t\tensureDirectoryExists(workspaceStoragePath)\n\n\t\t\tthis.globalMemento = new FileMemento(path.join(globalStoragePath, \"configuration.json\"))\n\t\t\tthis.workspaceMemento = new FileMemento(path.join(workspaceStoragePath, \"configuration.json\"))\n\t\t}\n\t}\n\n\tget<T>(section: string, defaultValue?: T): T | undefined {\n\t\tconst fullSection = this.section ? `${this.section}.${section}` : section\n\n\t\t// Check runtime configuration first (highest priority - set by CLI at runtime)\n\t\tconst runtimeValue = runtimeConfig.get(fullSection)\n\t\tif (runtimeValue !== undefined) {\n\t\t\treturn runtimeValue as T\n\t\t}\n\n\t\t// Check workspace configuration (persisted to disk)\n\t\tconst workspaceValue = this.workspaceMemento.get(fullSection)\n\t\tif (workspaceValue !== undefined && workspaceValue !== null) {\n\t\t\treturn workspaceValue as T\n\t\t}\n\n\t\t// Check global configuration (persisted to disk)\n\t\tconst globalValue = this.globalMemento.get(fullSection)\n\t\tif (globalValue !== undefined && globalValue !== null) {\n\t\t\treturn globalValue as T\n\t\t}\n\n\t\t// Return default value\n\t\treturn defaultValue\n\t}\n\n\thas(section: string): boolean {\n\t\tconst fullSection = this.section ? `${this.section}.${section}` : section\n\t\treturn this.workspaceMemento.get(fullSection) !== undefined || this.globalMemento.get(fullSection) !== undefined\n\t}\n\n\tinspect<T>(section: string): ConfigurationInspect<T> | undefined {\n\t\tconst fullSection = this.section ? `${this.section}.${section}` : section\n\t\tconst workspaceValue = this.workspaceMemento.get(fullSection)\n\t\tconst globalValue = this.globalMemento.get(fullSection)\n\n\t\tif (workspaceValue !== undefined || globalValue !== undefined) {\n\t\t\treturn {\n\t\t\t\tkey: fullSection,\n\t\t\t\tdefaultValue: undefined,\n\t\t\t\tglobalValue: globalValue as T | undefined,\n\t\t\t\tworkspaceValue: workspaceValue as T | undefined,\n\t\t\t\tworkspaceFolderValue: undefined,\n\t\t\t}\n\t\t}\n\n\t\treturn undefined\n\t}\n\n\tasync update(section: string, value: unknown, configurationTarget?: ConfigurationTarget): Promise<void> {\n\t\tconst fullSection = this.section ? `${this.section}.${section}` : section\n\n\t\ttry {\n\t\t\t// Determine which memento to use based on configuration target\n\t\t\tconst memento =\n\t\t\t\tconfigurationTarget === ConfigurationTarget.Workspace ? this.workspaceMemento : this.globalMemento\n\n\t\t\tconst scope = configurationTarget === ConfigurationTarget.Workspace ? \"workspace\" : \"global\"\n\n\t\t\t// Update the memento (this automatically persists to disk)\n\t\t\tawait memento.update(fullSection, value)\n\n\t\t\tlogs.debug(\n\t\t\t\t`Configuration updated: ${fullSection} = ${JSON.stringify(value)} (${scope})`,\n\t\t\t\t\"VSCode.MockWorkspaceConfiguration\",\n\t\t\t)\n\t\t} catch (error) {\n\t\t\tlogs.error(`Failed to update configuration: ${fullSection}`, \"VSCode.MockWorkspaceConfiguration\", {\n\t\t\t\terror,\n\t\t\t})\n\t\t\tthrow error\n\t\t}\n\t}\n\n\t// Additional method to reload configuration from disk\n\tpublic reload(): void {\n\t\t// FileMemento automatically loads from disk, so we don't need to do anything special\n\t\tlogs.debug(\"Configuration reload requested\", \"VSCode.MockWorkspaceConfiguration\")\n\t}\n\n\t// Method to get all configuration data (useful for debugging and generic config loading)\n\tpublic getAllConfig(): Record<string, unknown> {\n\t\tconst globalKeys = this.globalMemento.keys()\n\t\tconst workspaceKeys = this.workspaceMemento.keys()\n\t\tconst allConfig: Record<string, unknown> = {}\n\n\t\t// Add global settings first\n\t\tfor (const key of globalKeys) {\n\t\t\tconst value = this.globalMemento.get(key)\n\t\t\tif (value !== undefined && value !== null) {\n\t\t\t\tallConfig[key] = value\n\t\t\t}\n\t\t}\n\n\t\t// Add workspace settings (these override global)\n\t\tfor (const key of workspaceKeys) {\n\t\t\tconst value = this.workspaceMemento.get(key)\n\t\t\tif (value !== undefined && value !== null) {\n\t\t\t\tallConfig[key] = value\n\t\t\t}\n\t\t}\n\n\t\treturn allConfig\n\t}\n}\n","/**\n * Core VSCode API type definitions\n *\n * This file contains TypeScript type definitions that match the VSCode Extension API.\n * These types allow VSCode extensions to run in Node.js without VSCode installed.\n */\n\n/**\n * Represents a thenable (Promise-like) value\n */\nexport type Thenable<T> = Promise<T>\n\n/**\n * Represents a disposable resource that can be cleaned up\n */\nexport interface Disposable {\n\tdispose(): void\n}\n\n/**\n * Represents a Uniform Resource Identifier (URI)\n */\nexport interface IUri {\n\tscheme: string\n\tauthority: string\n\tpath: string\n\tquery: string\n\tfragment: string\n\tfsPath: string\n\ttoString(): string\n}\n\n/**\n * Represents a position in a text document (line and character)\n */\nexport interface IPosition {\n\tline: number\n\tcharacter: number\n\tisEqual(other: IPosition): boolean\n\tisBefore(other: IPosition): boolean\n\tisBeforeOrEqual(other: IPosition): boolean\n\tisAfter(other: IPosition): boolean\n\tisAfterOrEqual(other: IPosition): boolean\n\tcompareTo(other: IPosition): number\n}\n\n/**\n * Represents a range in a text document (start and end positions)\n */\nexport interface IRange {\n\tstart: IPosition\n\tend: IPosition\n\tisEmpty: boolean\n\tisSingleLine: boolean\n\tcontains(positionOrRange: IPosition | IRange): boolean\n\tisEqual(other: IRange): boolean\n\tintersection(other: IRange): IRange | undefined\n\tunion(other: IRange): IRange\n}\n\n/**\n * Represents a selection in a text editor (extends Range with anchor and active positions)\n */\nexport interface ISelection extends IRange {\n\tanchor: IPosition\n\tactive: IPosition\n\tisReversed: boolean\n}\n\n/**\n * Represents a line of text in a document\n */\nexport interface TextLine {\n\ttext: string\n\trange: IRange\n\trangeIncludingLineBreak: IRange\n\tfirstNonWhitespaceCharacterIndex: number\n\tisEmptyOrWhitespace: boolean\n}\n\n/**\n * Represents a text document\n */\nexport interface TextDocument {\n\turi: IUri\n\tfileName: string\n\tlanguageId: string\n\tversion: number\n\tisDirty: boolean\n\tisClosed: boolean\n\tlineCount: number\n\tgetText(range?: IRange): string\n\tlineAt(line: number): TextLine\n\toffsetAt(position: IPosition): number\n\tpositionAt(offset: number): IPosition\n\tsave(): Thenable<boolean>\n\tvalidateRange(range: IRange): IRange\n\tvalidatePosition(position: IPosition): IPosition\n}\n\n/**\n * Configuration target for settings\n */\nexport enum ConfigurationTarget {\n\tGlobal = 1,\n\tWorkspace = 2,\n\tWorkspaceFolder = 3,\n}\n\n/**\n * Workspace folder representation\n */\nexport interface WorkspaceFolder {\n\turi: IUri\n\tname: string\n\tindex: number\n}\n\n/**\n * Workspace configuration interface\n */\nexport interface WorkspaceConfiguration {\n\tget<T>(section: string): T | undefined\n\tget<T>(section: string, defaultValue: T): T\n\thas(section: string): boolean\n\tinspect<T>(section: string): ConfigurationInspect<T> | undefined\n\tupdate(section: string, value: unknown, configurationTarget?: ConfigurationTarget): Thenable<void>\n}\n\n/**\n * Configuration inspection result\n */\nexport interface ConfigurationInspect<T> {\n\tkey: string\n\tdefaultValue?: T\n\tglobalValue?: T\n\tworkspaceValue?: T\n\tworkspaceFolderValue?: T\n}\n\n/**\n * Memento (state storage) interface\n */\nexport interface Memento {\n\tget<T>(key: string): T | undefined\n\tget<T>(key: string, defaultValue: T): T\n\tupdate(key: string, value: unknown): Thenable<void>\n\tkeys(): readonly string[]\n}\n\n/**\n * Secret storage interface for secure credential storage\n */\nexport interface SecretStorage {\n\tget(key: string): Thenable<string | undefined>\n\tstore(key: string, value: string): Thenable<void>\n\tdelete(key: string): Thenable<void>\n\tonDidChange: Event<SecretStorageChangeEvent>\n}\n\n/**\n * Secret storage change event\n */\nexport interface SecretStorageChangeEvent {\n\tkey: string\n}\n\n/**\n * Represents an extension\n */\nexport interface Extension<T> {\n\tid: string\n\textensionUri: IUri\n\textensionPath: string\n\tisActive: boolean\n\tpackageJSON: Record<string, unknown>\n\texports: T\n\textensionKind: ExtensionKind\n\tactivate(): Thenable<T>\n}\n\n/**\n * Extension kind enum\n */\nexport enum ExtensionKind {\n\tUI = 1,\n\tWorkspace = 2,\n}\n\n/**\n * Extension context provided to extension activation\n */\nexport interface ExtensionContext {\n\tsubscriptions: Disposable[]\n\tworkspaceState: Memento\n\tglobalState: Memento & { setKeysForSync(keys: readonly string[]): void }\n\tsecrets: SecretStorage\n\textensionUri: IUri\n\textensionPath: string\n\tenvironmentVariableCollection: Record<string, unknown>\n\tstorageUri: IUri | undefined\n\tstoragePath: string | undefined\n\tglobalStorageUri: IUri\n\tglobalStoragePath: string\n\tlogUri: IUri\n\tlogPath: string\n\textensionMode: ExtensionMode\n\textension: Extension<unknown> | undefined\n}\n\n/**\n * Extension mode enum\n */\nexport enum ExtensionMode {\n\tProduction = 1,\n\tDevelopment = 2,\n\tTest = 3,\n}\n\n/**\n * Event emitter event type\n */\nexport type Event<T> = (listener: (e: T) => void, thisArgs?: unknown, disposables?: Disposable[]) => Disposable\n\n/**\n * Cancellation token for async operations\n */\nexport interface CancellationToken {\n\tisCancellationRequested: boolean\n\tonCancellationRequested: Event<unknown>\n}\n\n/**\n * File system file type enum\n */\nexport enum FileType {\n\tUnknown = 0,\n\tFile = 1,\n\tDirectory = 2,\n\tSymbolicLink = 64,\n}\n\n/**\n * File system stat information\n */\nexport interface FileStat {\n\ttype: FileType\n\tctime: number\n\tmtime: number\n\tsize: number\n}\n\n/**\n * Text editor options\n */\nexport interface TextEditorOptions {\n\ttabSize?: number\n\tinsertSpaces?: boolean\n\tcursorStyle?: number\n\tlineNumbers?: number\n}\n\n/**\n * View column enum for editor placement\n */\nexport enum ViewColumn {\n\tActive = -1,\n\tBeside = -2,\n\tOne = 1,\n\tTwo = 2,\n\tThree = 3,\n}\n\n/**\n * UI Kind enum\n */\nexport enum UIKind {\n\tDesktop = 1,\n\tWeb = 2,\n}\n\n/**\n * End of line sequence enum\n */\nexport enum EndOfLine {\n\tLF = 1,\n\tCRLF = 2,\n}\n\n/**\n * Status bar alignment\n */\nexport enum StatusBarAlignment {\n\tLeft = 1,\n\tRight = 2,\n}\n\n/**\n * Diagnostic severity levels\n */\nexport enum DiagnosticSeverity {\n\tError = 0,\n\tWarning = 1,\n\tInformation = 2,\n\tHint = 3,\n}\n\n/**\n * Diagnostic tags\n */\nexport enum DiagnosticTag {\n\tUnnecessary = 1,\n\tDeprecated = 2,\n}\n\n/**\n * Overview ruler lane\n */\nexport enum OverviewRulerLane {\n\tLeft = 1,\n\tCenter = 2,\n\tRight = 4,\n\tFull = 7,\n}\n\n/**\n * Decoration range behavior\n */\nexport enum DecorationRangeBehavior {\n\tOpenOpen = 0,\n\tClosedClosed = 1,\n\tOpenClosed = 2,\n\tClosedOpen = 3,\n}\n\n/**\n * Text editor reveal type\n */\nexport enum TextEditorRevealType {\n\tDefault = 0,\n\tInCenter = 1,\n\tInCenterIfOutsideViewport = 2,\n\tAtTop = 3,\n}\n","/**\n * WorkspaceAPI class for VSCode API\n */\n\nimport * as fs from \"fs\"\nimport * as path from \"path\"\nimport { logs } from \"../utils/logger.js\"\nimport { Uri } from \"../classes/Uri.js\"\nimport { Position } from \"../classes/Position.js\"\nimport { Range } from \"../classes/Range.js\"\nimport { EventEmitter } from \"../classes/EventEmitter.js\"\nimport { WorkspaceEdit } from \"../classes/TextEdit.js\"\nimport { FileSystemAPI } from \"./FileSystemAPI.js\"\nimport { MockWorkspaceConfiguration } from \"./WorkspaceConfiguration.js\"\nimport type { ExtensionContextImpl } from \"../context/ExtensionContext.js\"\nimport type {\n\tTextDocument,\n\tTextLine,\n\tWorkspaceFoldersChangeEvent,\n\tWorkspaceFolder,\n\tTextDocumentChangeEvent,\n\tConfigurationChangeEvent,\n\tTextDocumentContentProvider,\n\tFileSystemWatcher,\n\tRelativePattern,\n} from \"../interfaces/document.js\"\nimport type { Disposable, WorkspaceConfiguration } from \"../interfaces/workspace.js\"\nimport type { Thenable } from \"../types.js\"\n\n/**\n * Workspace API mock for CLI mode\n */\nexport class WorkspaceAPI {\n\tpublic workspaceFolders: WorkspaceFolder[] | undefined\n\tpublic name: string | undefined\n\tpublic workspaceFile: Uri | undefined\n\tpublic fs: FileSystemAPI\n\tpublic textDocuments: TextDocument[] = []\n\tprivate _onDidChangeWorkspaceFolders = new EventEmitter<WorkspaceFoldersChangeEvent>()\n\tprivate _onDidOpenTextDocument = new EventEmitter<TextDocument>()\n\tprivate _onDidChangeTextDocument = new EventEmitter<TextDocumentChangeEvent>()\n\tprivate _onDidCloseTextDocument = new EventEmitter<TextDocument>()\n\tprivate context: ExtensionContextImpl\n\n\tconstructor(workspacePath: string, context: ExtensionContextImpl) {\n\t\tthis.context = context\n\t\tthis.workspaceFolders = [\n\t\t\t{\n\t\t\t\turi: Uri.file(workspacePath),\n\t\t\t\tname: path.basename(workspacePath),\n\t\t\t\tindex: 0,\n\t\t\t},\n\t\t]\n\t\tthis.name = path.basename(workspacePath)\n\t\tthis.fs = new FileSystemAPI()\n\t}\n\n\tasRelativePath(pathOrUri: string | Uri, includeWorkspaceFolder?: boolean): string {\n\t\tconst fsPath = typeof pathOrUri === \"string\" ? pathOrUri : pathOrUri.fsPath\n\n\t\t// If no workspace folders, return the original path\n\t\tif (!this.workspaceFolders || this.workspaceFolders.length === 0) {\n\t\t\treturn fsPath\n\t\t}\n\n\t\t// Try to find a workspace folder that contains this path\n\t\tfor (const folder of this.workspaceFolders) {\n\t\t\tconst workspacePath = folder.uri.fsPath\n\n\t\t\t// Normalize paths for comparison (handle different path separators)\n\t\t\tconst normalizedFsPath = path.normalize(fsPath)\n\t\t\tconst normalizedWorkspacePath = path.normalize(workspacePath)\n\n\t\t\t// Check if the path is within this workspace folder\n\t\t\tif (normalizedFsPath.startsWith(normalizedWorkspacePath)) {\n\t\t\t\t// Get the relative path\n\t\t\t\tlet relativePath = path.relative(normalizedWorkspacePath, normalizedFsPath)\n\n\t\t\t\t// If includeWorkspaceFolder is true and there are multiple workspace folders,\n\t\t\t\t// prepend the workspace folder name\n\t\t\t\tif (includeWorkspaceFolder && this.workspaceFolders.length > 1) {\n\t\t\t\t\trelativePath = path.join(folder.name, relativePath)\n\t\t\t\t}\n\n\t\t\t\treturn relativePath\n\t\t\t}\n\t\t}\n\n\t\t// If not within any workspace folder, return the original path\n\t\treturn fsPath\n\t}\n\n\tonDidChangeWorkspaceFolders(listener: (event: WorkspaceFoldersChangeEvent) => void): Disposable {\n\t\treturn this._onDidChangeWorkspaceFolders.event(listener)\n\t}\n\n\tonDidChangeConfiguration(listener: (event: ConfigurationChangeEvent) => void): Disposable {\n\t\t// Create a mock configuration change event emitter\n\t\tconst emitter = new EventEmitter<ConfigurationChangeEvent>()\n\t\treturn emitter.event(listener)\n\t}\n\n\tonDidChangeTextDocument(listener: (event: TextDocumentChangeEvent) => void): Disposable {\n\t\treturn this._onDidChangeTextDocument.event(listener)\n\t}\n\n\tonDidOpenTextDocument(listener: (event: TextDocument) => void): Disposable {\n\t\tlogs.debug(\"Registering onDidOpenTextDocument listener\", \"VSCode.Workspace\")\n\t\treturn this._onDidOpenTextDocument.event(listener)\n\t}\n\n\tonDidCloseTextDocument(listener: (event: TextDocument) => void): Disposable {\n\t\treturn this._onDidCloseTextDocument.event(listener)\n\t}\n\n\tgetConfiguration(section?: string): WorkspaceConfiguration {\n\t\treturn new MockWorkspaceConfiguration(section, this.context)\n\t}\n\n\tfindFiles(_include: string, _exclude?: string): Thenable<Uri[]> {\n\t\t// Basic implementation - could be enhanced with glob patterns\n\t\treturn Promise.resolve([])\n\t}\n\n\tasync openTextDocument(uri: Uri): Promise<TextDocument> {\n\t\tlogs.debug(`openTextDocument called for: ${uri.fsPath}`, \"VSCode.Workspace\")\n\n\t\t// Read file content\n\t\tlet content = \"\"\n\t\ttry {\n\t\t\tcontent = fs.readFileSync(uri.fsPath, \"utf-8\")\n\t\t\tlogs.debug(`File content read successfully, length: ${content.length}`, \"VSCode.Workspace\")\n\t\t} catch (error) {\n\t\t\tlogs.warn(`Failed to read file: ${uri.fsPath}`, \"VSCode.Workspace\", { error })\n\t\t}\n\n\t\tconst lines = content.split(\"\\n\")\n\t\tconst document: TextDocument = {\n\t\t\turi,\n\t\t\tfileName: uri.fsPath,\n\t\t\tlanguageId: \"plaintext\",\n\t\t\tversion: 1,\n\t\t\tisDirty: false,\n\t\t\tisClosed: false,\n\t\t\tlineCount: lines.length,\n\t\t\tgetText: (range?: Range) => {\n\t\t\t\tif (!range) {\n\t\t\t\t\treturn content\n\t\t\t\t}\n\t\t\t\treturn lines.slice(range.start.line, range.end.line + 1).join(\"\\n\")\n\t\t\t},\n\t\t\tlineAt: (line: number): TextLine => {\n\t\t\t\tconst text = lines[line] || \"\"\n\t\t\t\treturn {\n\t\t\t\t\ttext,\n\t\t\t\t\trange: new Range(new Position(line, 0), new Position(line, text.length)),\n\t\t\t\t\trangeIncludingLineBreak: new Range(new Position(line, 0), new Position(line + 1, 0)),\n\t\t\t\t\tfirstNonWhitespaceCharacterIndex: text.search(/\\S/),\n\t\t\t\t\tisEmptyOrWhitespace: text.trim().length === 0,\n\t\t\t\t}\n\t\t\t},\n\t\t\toffsetAt: (position: Position) => {\n\t\t\t\tlet offset = 0\n\t\t\t\tfor (let i = 0; i < position.line && i < lines.length; i++) {\n\t\t\t\t\toffset += (lines[i]?.length || 0) + 1 // +1 for newline\n\t\t\t\t}\n\t\t\t\toffset += position.character\n\t\t\t\treturn offset\n\t\t\t},\n\t\t\tpositionAt: (offset: number) => {\n\t\t\t\tlet currentOffset = 0\n\t\t\t\tfor (let i = 0; i < lines.length; i++) {\n\t\t\t\t\tconst lineLength = (lines[i]?.length || 0) + 1 // +1 for newline\n\t\t\t\t\tif (currentOffset + lineLength > offset) {\n\t\t\t\t\t\treturn new Position(i, offset - currentOffset)\n\t\t\t\t\t}\n\t\t\t\t\tcurrentOffset += lineLength\n\t\t\t\t}\n\t\t\t\treturn new Position(lines.length - 1, lines[lines.length - 1]?.length || 0)\n\t\t\t},\n\t\t\tsave: () => Promise.resolve(true),\n\t\t\tvalidateRange: (range: Range) => range,\n\t\t\tvalidatePosition: (position: Position) => position,\n\t\t}\n\n\t\t// Add to textDocuments array\n\t\tthis.textDocuments.push(document)\n\t\tlogs.debug(`Document added to textDocuments array, total: ${this.textDocuments.length}`, \"VSCode.Workspace\")\n\n\t\t// Fire the event after a small delay to ensure listeners are fully registered\n\t\tlogs.debug(\"Waiting before firing onDidOpenTextDocument\", \"VSCode.Workspace\")\n\t\tawait new Promise((resolve) => setTimeout(resolve, 10))\n\t\tlogs.debug(\"Firing onDidOpenTextDocument event\", \"VSCode.Workspace\")\n\t\tthis._onDidOpenTextDocument.fire(document)\n\t\tlogs.debug(\"onDidOpenTextDocument event fired\", \"VSCode.Workspace\")\n\n\t\treturn document\n\t}\n\n\tasync applyEdit(edit: WorkspaceEdit): Promise<boolean> {\n\t\t// In CLI mode, we need to apply the edits to the actual files\n\t\ttry {\n\t\t\tfor (const [uri, edits] of edit.entries()) {\n\t\t\t\tlet filePath = uri.fsPath\n\n\t\t\t\t// On Windows, strip leading slash if present (e.g., /C:/path becomes C:/path)\n\t\t\t\tif (process.platform === \"win32\" && filePath.startsWith(\"/\")) {\n\t\t\t\t\tfilePath = filePath.slice(1)\n\t\t\t\t}\n\n\t\t\t\tlet content = \"\"\n\n\t\t\t\t// Read existing content if file exists\n\t\t\t\ttry {\n\t\t\t\t\tcontent = fs.readFileSync(filePath, \"utf-8\")\n\t\t\t\t} catch {\n\t\t\t\t\t// File doesn't exist, start with empty content\n\t\t\t\t}\n\n\t\t\t\t// Apply edits in reverse order to maintain correct positions\n\t\t\t\tconst sortedEdits = edits.sort((a, b) => {\n\t\t\t\t\tconst lineDiff = b.range.start.line - a.range.start.line\n\t\t\t\t\tif (lineDiff !== 0) return lineDiff\n\t\t\t\t\treturn b.range.start.character - a.range.start.character\n\t\t\t\t})\n\n\t\t\t\tconst lines = content.split(\"\\n\")\n\t\t\t\tfor (const textEdit of sortedEdits) {\n\t\t\t\t\tconst startLine = textEdit.range.start.line\n\t\t\t\t\tconst startChar = textEdit.range.start.character\n\t\t\t\t\tconst endLine = textEdit.range.end.line\n\t\t\t\t\tconst endChar = textEdit.range.end.character\n\n\t\t\t\t\tif (startLine === endLine) {\n\t\t\t\t\t\t// Single line edit\n\t\t\t\t\t\tconst line = lines[startLine] || \"\"\n\t\t\t\t\t\tlines[startLine] = line.substring(0, startChar) + textEdit.newText + line.substring(endChar)\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Multi-line edit\n\t\t\t\t\t\tconst firstLine = lines[startLine] || \"\"\n\t\t\t\t\t\tconst lastLine = lines[endLine] || \"\"\n\t\t\t\t\t\tconst newContent =\n\t\t\t\t\t\t\tfirstLine.substring(0, startChar) + textEdit.newText + lastLine.substring(endChar)\n\t\t\t\t\t\tlines.splice(startLine, endLine - startLine + 1, newContent)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Write back to file\n\t\t\t\tconst newContent = lines.join(\"\\n\")\n\t\t\t\tfs.writeFileSync(filePath, newContent, \"utf-8\")\n\n\t\t\t\t// Update the in-memory document object to reflect the new content\n\t\t\t\t// This is critical for CLI mode where DiffViewProvider reads from the document object\n\t\t\t\tconst document = this.textDocuments.find((doc: TextDocument) => doc.uri.fsPath === filePath)\n\t\t\t\tif (document) {\n\t\t\t\t\tconst newLines = newContent.split(\"\\n\")\n\n\t\t\t\t\t// Update document properties with new content\n\t\t\t\t\tdocument.lineCount = newLines.length\n\t\t\t\t\tdocument.getText = (range?: Range) => {\n\t\t\t\t\t\tif (!range) {\n\t\t\t\t\t\t\treturn newContent\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn newLines.slice(range.start.line, range.end.line + 1).join(\"\\n\")\n\t\t\t\t\t}\n\t\t\t\t\tdocument.lineAt = (line: number): TextLine => {\n\t\t\t\t\t\tconst text = newLines[line] || \"\"\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\ttext,\n\t\t\t\t\t\t\trange: new Range(new Position(line, 0), new Position(line, text.length)),\n\t\t\t\t\t\t\trangeIncludingLineBreak: new Range(new Position(line, 0), new Position(line + 1, 0)),\n\t\t\t\t\t\t\tfirstNonWhitespaceCharacterIndex: text.search(/\\S/),\n\t\t\t\t\t\t\tisEmptyOrWhitespace: text.trim().length === 0,\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdocument.offsetAt = (position: Position) => {\n\t\t\t\t\t\tlet offset = 0\n\t\t\t\t\t\tfor (let i = 0; i < position.line && i < newLines.length; i++) {\n\t\t\t\t\t\t\toffset += (newLines[i]?.length || 0) + 1 // +1 for newline\n\t\t\t\t\t\t}\n\t\t\t\t\t\toffset += position.character\n\t\t\t\t\t\treturn offset\n\t\t\t\t\t}\n\t\t\t\t\tdocument.positionAt = (offset: number) => {\n\t\t\t\t\t\tlet currentOffset = 0\n\t\t\t\t\t\tfor (let i = 0; i < newLines.length; i++) {\n\t\t\t\t\t\t\tconst lineLength = (newLines[i]?.length || 0) + 1 // +1 for newline\n\t\t\t\t\t\t\tif (currentOffset + lineLength > offset) {\n\t\t\t\t\t\t\t\treturn new Position(i, offset - currentOffset)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcurrentOffset += lineLength\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn new Position(newLines.length - 1, newLines[newLines.length - 1]?.length || 0)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true\n\t\t} catch (error) {\n\t\t\tlogs.error(\"Failed to apply workspace edit\", \"VSCode.Workspace\", { error })\n\t\t\treturn false\n\t\t}\n\t}\n\n\tcreateFileSystemWatcher(\n\t\t_globPattern?: string | RelativePattern,\n\t\t_ignoreCreateEvents?: boolean,\n\t\t_ignoreChangeEvents?: boolean,\n\t\t_ignoreDeleteEvents?: boolean,\n\t): FileSystemWatcher {\n\t\tconst emitter = new EventEmitter<Uri>()\n\t\treturn {\n\t\t\tonDidChange: (listener: (e: Uri) => void) => emitter.event(listener),\n\t\t\tonDidCreate: (listener: (e: Uri) => void) => emitter.event(listener),\n\t\t\tonDidDelete: (listener: (e: Uri) => void) => emitter.event(listener),\n\t\t\tdispose: () => emitter.dispose(),\n\t\t}\n\t}\n\n\tregisterTextDocumentContentProvider(_scheme: string, _provider: TextDocumentContentProvider): Disposable {\n\t\treturn { dispose: () => {} }\n\t}\n}\n","/**\n * TabGroupsAPI class for VSCode API\n */\n\nimport { EventEmitter } from \"../classes/EventEmitter.js\"\nimport type { Uri } from \"../classes/Uri.js\"\nimport type { Disposable } from \"../interfaces/workspace.js\"\n\n/**\n * Tab interface representing an open tab\n */\nexport interface Tab {\n\tinput: TabInputText | unknown\n\tlabel: string\n\tisActive: boolean\n\tisDirty: boolean\n}\n\n/**\n * Tab input for text files\n */\nexport interface TabInputText {\n\turi: Uri\n}\n\n/**\n * Tab group interface\n */\nexport interface TabGroup {\n\ttabs: Tab[]\n}\n\n/**\n * Tab groups API mock for CLI mode\n */\nexport class TabGroupsAPI {\n\tprivate _onDidChangeTabs = new EventEmitter<void>()\n\tprivate _tabGroups: TabGroup[] = []\n\n\tget all(): TabGroup[] {\n\t\treturn this._tabGroups\n\t}\n\n\tonDidChangeTabs(listener: () => void): Disposable {\n\t\treturn this._onDidChangeTabs.event(listener)\n\t}\n\n\tasync close(tab: Tab): Promise<boolean> {\n\t\t// Find and remove the tab from all groups\n\t\tfor (const group of this._tabGroups) {\n\t\t\tconst index = group.tabs.indexOf(tab)\n\t\t\tif (index !== -1) {\n\t\t\t\tgroup.tabs.splice(index, 1)\n\t\t\t\tthis._onDidChangeTabs.fire()\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t\treturn false\n\t}\n\n\t// Internal method to simulate tab changes for CLI\n\t_simulateTabChange(): void {\n\t\tthis._onDidChangeTabs.fire()\n\t}\n\n\tdispose(): void {\n\t\tthis._onDidChangeTabs.dispose()\n\t}\n}\n","/**\n * WindowAPI class for VSCode API\n */\n\nimport { logs } from \"../utils/logger.js\"\nimport { Uri } from \"../classes/Uri.js\"\nimport { Position } from \"../classes/Position.js\"\nimport { Range } from \"../classes/Range.js\"\nimport { Selection } from \"../classes/Selection.js\"\nimport { EventEmitter } from \"../classes/EventEmitter.js\"\nimport { ThemeIcon } from \"../classes/Additional.js\"\nimport { OutputChannel } from \"../classes/OutputChannel.js\"\nimport { StatusBarItem } from \"../classes/StatusBarItem.js\"\nimport { TextEditorDecorationType } from \"../classes/TextEditorDecorationType.js\"\nimport { TabGroupsAPI } from \"./TabGroupsAPI.js\"\nimport { StatusBarAlignment, ViewColumn } from \"../types.js\"\nimport type { WorkspaceAPI } from \"./WorkspaceAPI.js\"\nimport type { Thenable } from \"../types.js\"\nimport type {\n\tTextEditor,\n\tTextEditorSelectionChangeEvent,\n\tTextDocumentShowOptions,\n\tDecorationRenderOptions,\n} from \"../interfaces/editor.js\"\nimport type { TextDocument } from \"../interfaces/document.js\"\nimport type { Terminal, TerminalDimensionsChangeEvent, TerminalDataWriteEvent } from \"../interfaces/terminal.js\"\nimport type {\n\tWebviewViewProvider,\n\tWebviewView,\n\tWebview,\n\tViewBadge,\n\tWebviewViewProviderOptions,\n\tUriHandler,\n} from \"../interfaces/webview.js\"\nimport type { QuickPickOptions, InputBoxOptions, OpenDialogOptions, Disposable } from \"../interfaces/workspace.js\"\nimport type { CancellationToken } from \"../interfaces/document.js\"\n\n/**\n * Window API mock for CLI mode\n */\nexport class WindowAPI {\n\tpublic tabGroups: TabGroupsAPI\n\tpublic visibleTextEditors: TextEditor[] = []\n\tpublic _onDidChangeVisibleTextEditors = new EventEmitter<TextEditor[]>()\n\tprivate _workspace?: WorkspaceAPI\n\tprivate static _decorationCounter = 0\n\n\tconstructor() {\n\t\tthis.tabGroups = new TabGroupsAPI()\n\t}\n\n\tsetWorkspace(workspace: WorkspaceAPI) {\n\t\tthis._workspace = workspace\n\t}\n\n\tcreateOutputChannel(name: string): OutputChannel {\n\t\treturn new OutputChannel(name)\n\t}\n\n\tcreateStatusBarItem(alignment?: StatusBarAlignment, priority?: number): StatusBarItem\n\tcreateStatusBarItem(id?: string, alignment?: StatusBarAlignment, priority?: number): StatusBarItem\n\tcreateStatusBarItem(\n\t\tidOrAlignment?: string | StatusBarAlignment,\n\t\talignmentOrPriority?: StatusBarAlignment | number,\n\t\tpriority?: number,\n\t): StatusBarItem {\n\t\t// Handle overloaded signatures\n\t\tlet actualAlignment: StatusBarAlignment\n\t\tlet actualPriority: number | undefined\n\n\t\tif (typeof idOrAlignment === \"string\") {\n\t\t\t// Called with id, alignment, priority\n\t\t\tactualAlignment = (alignmentOrPriority as StatusBarAlignment) ?? StatusBarAlignment.Left\n\t\t\tactualPriority = priority\n\t\t} else {\n\t\t\t// Called with alignment, priority\n\t\t\tactualAlignment = (idOrAlignment as StatusBarAlignment) ?? StatusBarAlignment.Left\n\t\t\tactualPriority = alignmentOrPriority as number | undefined\n\t\t}\n\n\t\treturn new StatusBarItem(actualAlignment, actualPriority)\n\t}\n\n\tcreateTextEditorDecorationType(_options: DecorationRenderOptions): TextEditorDecorationType {\n\t\treturn new TextEditorDecorationType(`decoration-${++WindowAPI._decorationCounter}`)\n\t}\n\n\tcreateTerminal(options?: {\n\t\tname?: string\n\t\tshellPath?: string\n\t\tshellArgs?: string[]\n\t\tcwd?: string\n\t\tenv?: { [key: string]: string | null | undefined }\n\t\ticonPath?: ThemeIcon\n\t\thideFromUser?: boolean\n\t\tmessage?: string\n\t\tstrictEnv?: boolean\n\t}): Terminal {\n\t\t// Return a mock terminal object\n\t\treturn {\n\t\t\tname: options?.name || \"Terminal\",\n\t\t\tprocessId: Promise.resolve(undefined),\n\t\t\tcreationOptions: options || {},\n\t\t\texitStatus: undefined,\n\t\t\tstate: { isInteractedWith: false },\n\t\t\tsendText: (text: string, _addNewLine?: boolean) => {\n\t\t\t\tlogs.debug(`Terminal sendText: ${text}`, \"VSCode.Terminal\")\n\t\t\t},\n\t\t\tshow: (_preserveFocus?: boolean) => {\n\t\t\t\tlogs.debug(\"Terminal show called\", \"VSCode.Terminal\")\n\t\t\t},\n\t\t\thide: () => {\n\t\t\t\tlogs.debug(\"Terminal hide called\", \"VSCode.Terminal\")\n\t\t\t},\n\t\t\tdispose: () => {\n\t\t\t\tlogs.debug(\"Terminal disposed\", \"VSCode.Terminal\")\n\t\t\t},\n\t\t}\n\t}\n\n\tshowInformationMessage(message: string, ..._items: string[]): Thenable<string | undefined> {\n\t\tlogs.info(message, \"VSCode.Window\")\n\t\treturn Promise.resolve(undefined)\n\t}\n\n\tshowWarningMessage(message: string, ..._items: string[]): Thenable<string | undefined> {\n\t\tlogs.warn(message, \"VSCode.Window\")\n\t\treturn Promise.resolve(undefined)\n\t}\n\n\tshowErrorMessage(message: string, ..._items: string[]): Thenable<string | undefined> {\n\t\tlogs.error(message, \"VSCode.Window\")\n\t\treturn Promise.resolve(undefined)\n\t}\n\n\tshowQuickPick(items: string[], _options?: QuickPickOptions): Thenable<string | undefined> {\n\t\t// Return first item for CLI\n\t\treturn Promise.resolve(items[0])\n\t}\n\n\tshowInputBox(_options?: InputBoxOptions): Thenable<string | undefined> {\n\t\t// Return empty string for CLI\n\t\treturn Promise.resolve(\"\")\n\t}\n\n\tshowOpenDialog(_options?: OpenDialogOptions): Thenable<Uri[] | undefined> {\n\t\t// Return empty array for CLI\n\t\treturn Promise.resolve([])\n\t}\n\n\tasync showTextDocument(\n\t\tdocumentOrUri: TextDocument | Uri,\n\t\tcolumnOrOptions?: ViewColumn | TextDocumentShowOptions,\n\t\t_preserveFocus?: boolean,\n\t): Promise<TextEditor> {\n\t\t// Mock implementation for CLI\n\t\t// In a real VSCode environment, this would open the document in an editor\n\t\tconst uri = documentOrUri instanceof Uri ? documentOrUri : documentOrUri.uri\n\t\tlogs.debug(`showTextDocument called for: ${uri?.toString() || \"unknown\"}`, \"VSCode.Window\")\n\n\t\t// Create a placeholder editor first so it's in visibleTextEditors when onDidOpenTextDocument fires\n\t\tconst placeholderEditor: TextEditor = {\n\t\t\tdocument: { uri } as TextDocument,\n\t\t\tselection: new Selection(new Position(0, 0), new Position(0, 0)),\n\t\t\tselections: [new Selection(new Position(0, 0), new Position(0, 0))],\n\t\t\tvisibleRanges: [new Range(new Position(0, 0), new Position(0, 0))],\n\t\t\toptions: {},\n\t\t\tviewColumn: typeof columnOrOptions === \"number\" ? columnOrOptions : ViewColumn.One,\n\t\t\tedit: () => Promise.resolve(true),\n\t\t\tinsertSnippet: () => Promise.resolve(true),\n\t\t\tsetDecorations: () => {},\n\t\t\trevealRange: () => {},\n\t\t\tshow: () => {},\n\t\t\thide: () => {},\n\t\t}\n\n\t\t// Add placeholder to visible editors BEFORE opening document\n\t\tthis.visibleTextEditors.push(placeholderEditor)\n\t\tlogs.debug(\n\t\t\t`Placeholder editor added to visibleTextEditors, total: ${this.visibleTextEditors.length}`,\n\t\t\t\"VSCode.Window\",\n\t\t)\n\n\t\t// If we have a URI, open the document (this will fire onDidOpenTextDocument)\n\t\tlet document: TextDocument | Uri = documentOrUri\n\t\tif (documentOrUri instanceof Uri && this._workspace) {\n\t\t\tlogs.debug(\"Opening document via workspace.openTextDocument\", \"VSCode.Window\")\n\t\t\tdocument = await this._workspace.openTextDocument(uri)\n\t\t\tlogs.debug(\"Document opened successfully\", \"VSCode.Window\")\n\n\t\t\t// Update the placeholder editor with the real document\n\t\t\tplaceholderEditor.document = document\n\t\t}\n\n\t\t// Fire events immediately using setImmediate\n\t\tsetImmediate(() => {\n\t\t\tlogs.debug(\"Firing onDidChangeVisibleTextEditors event\", \"VSCode.Window\")\n\t\t\tthis._onDidChangeVisibleTextEditors.fire(this.visibleTextEditors)\n\t\t\tlogs.debug(\"onDidChangeVisibleTextEditors event fired\", \"VSCode.Window\")\n\t\t})\n\n\t\tlogs.debug(\"Returning editor from showTextDocument\", \"VSCode.Window\")\n\t\treturn placeholderEditor\n\t}\n\n\tregisterWebviewViewProvider(\n\t\tviewId: string,\n\t\tprovider: WebviewViewProvider,\n\t\t_options?: WebviewViewProviderOptions,\n\t): Disposable {\n\t\t// Store the provider for later use by ExtensionHost\n\t\tconsole.error(\"[DEBUG] WindowAPI.registerWebviewViewProvider called for viewId:\", viewId)\n\t\tif ((global as unknown as { __extensionHost?: unknown }).__extensionHost) {\n\t\t\tconst extensionHost = (\n\t\t\t\tglobal as unknown as {\n\t\t\t\t\t__extensionHost: {\n\t\t\t\t\t\tregisterWebviewProvider: (viewId: string, provider: WebviewViewProvider) => void\n\t\t\t\t\t\tisInInitialSetup: () => boolean\n\t\t\t\t\t\tmarkWebviewReady: () => void\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t).__extensionHost\n\t\t\textensionHost.registerWebviewProvider(viewId, provider)\n\n\t\t\t// Set up webview mock that captures messages from the extension\n\t\t\tconst mockWebview = {\n\t\t\t\tpostMessage: (message: unknown): Thenable<boolean> => {\n\t\t\t\t\t// Forward extension messages to ExtensionHost for CLI consumption\n\t\t\t\t\tif ((global as unknown as { __extensionHost?: unknown }).__extensionHost) {\n\t\t\t\t\t\t;(\n\t\t\t\t\t\t\tglobal as unknown as {\n\t\t\t\t\t\t\t\t__extensionHost: { emit: (event: string, message: unknown) => void }\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t).__extensionHost.emit(\"extensionWebviewMessage\", message)\n\t\t\t\t\t}\n\t\t\t\t\treturn Promise.resolve(true)\n\t\t\t\t},\n\t\t\t\tonDidReceiveMessage: (listener: (message: unknown) => void) => {\n\t\t\t\t\t// This is how the extension listens for messages from the webview\n\t\t\t\t\t// We need to connect this to our message bridge\n\t\t\t\t\tif ((global as unknown as { __extensionHost?: unknown }).__extensionHost) {\n\t\t\t\t\t\t;(\n\t\t\t\t\t\t\tglobal as unknown as {\n\t\t\t\t\t\t\t\t__extensionHost: { on: (event: string, listener: (message: unknown) => void) => void }\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t).__extensionHost.on(\"webviewMessage\", listener)\n\t\t\t\t\t}\n\t\t\t\t\treturn { dispose: () => {} }\n\t\t\t\t},\n\t\t\t\tasWebviewUri: (uriArg: Uri) => {\n\t\t\t\t\t// Convert file URIs to webview-compatible URIs\n\t\t\t\t\t// For CLI, we can just return a mock webview URI\n\t\t\t\t\treturn Uri.parse(`vscode-webview://webview/${uriArg.path}`)\n\t\t\t\t},\n\t\t\t\thtml: \"\",\n\t\t\t\toptions: {},\n\t\t\t\tcspSource: \"vscode-webview:\",\n\t\t\t}\n\n\t\t\t// Provide the mock webview to the provider\n\t\t\tif (provider.resolveWebviewView) {\n\t\t\t\tconst mockWebviewView = {\n\t\t\t\t\twebview: mockWebview as Webview,\n\t\t\t\t\tviewType: viewId,\n\t\t\t\t\ttitle: viewId,\n\t\t\t\t\tdescription: undefined as string | undefined,\n\t\t\t\t\tbadge: undefined as ViewBadge | undefined,\n\t\t\t\t\tshow: () => {},\n\t\t\t\t\tonDidChangeVisibility: () => ({ dispose: () => {} }),\n\t\t\t\t\tonDidDispose: () => ({ dispose: () => {} }),\n\t\t\t\t\tvisible: true,\n\t\t\t\t}\n\t\t\t\tconsole.error(\"[DEBUG] WindowAPI: Calling resolveWebviewView for viewId:\", viewId)\n\n\t\t\t\t// Call resolveWebviewView immediately with initialization context\n\t\t\t\t// No setTimeout needed - use event-based synchronization instead\n\t\t\t\t;(async () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// Pass isInitialSetup flag in context to prevent task abortion\n\t\t\t\t\t\tconst context = {\n\t\t\t\t\t\t\tpreserveFocus: false,\n\t\t\t\t\t\t\tisInitialSetup: extensionHost.isInInitialSetup(),\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlogs.debug(\n\t\t\t\t\t\t\t`Calling resolveWebviewView with isInitialSetup=${context.isInitialSetup}`,\n\t\t\t\t\t\t\t\"VSCode.Window\",\n\t\t\t\t\t\t)\n\n\t\t\t\t\t\t// Await the result to ensure webview is fully initialized before marking ready\n\t\t\t\t\t\tawait provider.resolveWebviewView(mockWebviewView as WebviewView, {}, {} as CancellationToken)\n\t\t\t\t\t\tconsole.error(\"[DEBUG] WindowAPI: resolveWebviewView completed successfully\")\n\n\t\t\t\t\t\t// Mark webview as ready after resolution completes\n\t\t\t\t\t\textensionHost.markWebviewReady()\n\t\t\t\t\t\tlogs.debug(\"Webview resolution complete, marked as ready\", \"VSCode.Window\")\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconsole.error(\"[DEBUG] WindowAPI: Error resolving webview view:\", error instanceof Error ? error.message : String(error))\n\t\t\t\t\t\tlogs.error(\"Error resolving webview view\", \"VSCode.Window\", { error })\n\t\t\t\t\t}\n\t\t\t\t})()\n\t\t\t} else {\n\t\t\t\tconsole.error(\"[DEBUG] WindowAPI: provider.resolveWebviewView is undefined, not calling it\")\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tdispose: () => {\n\t\t\t\tif ((global as unknown as { __extensionHost?: unknown }).__extensionHost) {\n\t\t\t\t\t;(\n\t\t\t\t\t\tglobal as unknown as {\n\t\t\t\t\t\t\t__extensionHost: { unregisterWebviewProvider: (viewId: string) => void }\n\t\t\t\t\t\t}\n\t\t\t\t\t).__extensionHost.unregisterWebviewProvider(viewId)\n\t\t\t\t}\n\t\t\t},\n\t\t}\n\t}\n\n\tregisterUriHandler(_handler: UriHandler): Disposable {\n\t\t// Store the URI handler for later use\n\t\treturn {\n\t\t\tdispose: () => {},\n\t\t}\n\t}\n\n\tonDidChangeTextEditorSelection(listener: (event: TextEditorSelectionChangeEvent) => void): Disposable {\n\t\tconst emitter = new EventEmitter<TextEditorSelectionChangeEvent>()\n\t\treturn emitter.event(listener)\n\t}\n\n\tonDidChangeActiveTextEditor(listener: (event: TextEditor | undefined) => void): Disposable {\n\t\tconst emitter = new EventEmitter<TextEditor | undefined>()\n\t\treturn emitter.event(listener)\n\t}\n\n\tonDidChangeVisibleTextEditors(listener: (editors: TextEditor[]) => void): Disposable {\n\t\treturn this._onDidChangeVisibleTextEditors.event(listener)\n\t}\n\n\t// Terminal event handlers\n\tonDidCloseTerminal(_listener: (terminal: Terminal) => void): Disposable {\n\t\treturn { dispose: () => {} }\n\t}\n\n\tonDidOpenTerminal(_listener: (terminal: Terminal) => void): Disposable {\n\t\treturn { dispose: () => {} }\n\t}\n\n\tonDidChangeActiveTerminal(_listener: (terminal: Terminal | undefined) => void): Disposable {\n\t\treturn { dispose: () => {} }\n\t}\n\n\tonDidChangeTerminalDimensions(_listener: (event: TerminalDimensionsChangeEvent) => void): Disposable {\n\t\treturn { dispose: () => {} }\n\t}\n\n\tonDidWriteTerminalData(_listener: (event: TerminalDataWriteEvent) => void): Disposable {\n\t\treturn { dispose: () => {} }\n\t}\n\n\tget activeTerminal(): Terminal | undefined {\n\t\treturn undefined\n\t}\n\n\tget terminals(): Terminal[] {\n\t\treturn []\n\t}\n}\n","/**\n * CommandsAPI class for VSCode API\n */\n\nimport { logs } from \"../utils/logger.js\"\nimport { Uri } from \"../classes/Uri.js\"\nimport { Position } from \"../classes/Position.js\"\nimport { Range } from \"../classes/Range.js\"\nimport { Selection } from \"../classes/Selection.js\"\nimport { ViewColumn, EndOfLine } from \"../types.js\"\nimport type { Thenable } from \"../types.js\"\nimport type { TextEditor, TextEditorEdit } from \"../interfaces/editor.js\"\nimport type { TextDocument } from \"../interfaces/document.js\"\nimport type { Disposable } from \"../interfaces/workspace.js\"\nimport type { WorkspaceAPI } from \"./WorkspaceAPI.js\"\nimport type { WindowAPI } from \"./WindowAPI.js\"\n\n/**\n * Commands API mock for CLI mode\n */\nexport class CommandsAPI {\n\tprivate commands: Map<string, (...args: unknown[]) => unknown> = new Map()\n\n\tregisterCommand(command: string, callback: (...args: unknown[]) => unknown): Disposable {\n\t\tthis.commands.set(command, callback)\n\t\treturn {\n\t\t\tdispose: () => {\n\t\t\t\tthis.commands.delete(command)\n\t\t\t},\n\t\t}\n\t}\n\n\texecuteCommand<T = unknown>(command: string, ...rest: unknown[]): Thenable<T> {\n\t\tconst handler = this.commands.get(command)\n\t\tif (handler) {\n\t\t\ttry {\n\t\t\t\tconst result = handler(...rest)\n\t\t\t\treturn Promise.resolve(result as T)\n\t\t\t} catch (error) {\n\t\t\t\treturn Promise.reject(error)\n\t\t\t}\n\t\t}\n\n\t\t// Handle built-in commands\n\t\tswitch (command) {\n\t\t\tcase \"workbench.action.files.saveFiles\":\n\t\t\tcase \"workbench.action.closeWindow\":\n\t\t\tcase \"workbench.action.reloadWindow\":\n\t\t\t\treturn Promise.resolve(undefined as T)\n\t\t\tcase \"vscode.diff\":\n\t\t\t\t// Simulate opening a diff view for the CLI\n\t\t\t\t// The extension's DiffViewProvider expects this to create a diff editor\n\t\t\t\treturn this.handleDiffCommand(\n\t\t\t\t\trest[0] as Uri,\n\t\t\t\t\trest[1] as Uri,\n\t\t\t\t\trest[2] as string | undefined,\n\t\t\t\t\trest[3],\n\t\t\t\t) as Thenable<T>\n\t\t\tdefault:\n\t\t\t\tlogs.warn(`Unknown command: ${command}`, \"VSCode.Commands\")\n\t\t\t\treturn Promise.resolve(undefined as T)\n\t\t}\n\t}\n\n\tprivate async handleDiffCommand(\n\t\toriginalUri: Uri,\n\t\tmodifiedUri: Uri,\n\t\ttitle?: string,\n\t\t_options?: unknown,\n\t): Promise<void> {\n\t\t// The DiffViewProvider is waiting for the modified document to appear in visibleTextEditors\n\t\t// We need to simulate this by opening the document and adding it to visible editors\n\n\t\tlogs.info(`[DIFF] Handling vscode.diff command`, \"VSCode.Commands\", {\n\t\t\toriginalUri: originalUri?.toString(),\n\t\t\tmodifiedUri: modifiedUri?.toString(),\n\t\t\ttitle,\n\t\t})\n\n\t\tif (!modifiedUri) {\n\t\t\tlogs.warn(\"[DIFF] vscode.diff called without modified URI\", \"VSCode.Commands\")\n\t\t\treturn\n\t\t}\n\n\t\t// Get the workspace API to open the document\n\t\tconst workspace = (global as unknown as { vscode?: { workspace?: WorkspaceAPI } }).vscode?.workspace\n\t\tconst window = (global as unknown as { vscode?: { window?: WindowAPI } }).vscode?.window\n\n\t\tif (!workspace || !window) {\n\t\t\tlogs.warn(\"[DIFF] VSCode APIs not available for diff command\", \"VSCode.Commands\")\n\t\t\treturn\n\t\t}\n\n\t\tlogs.info(\n\t\t\t`[DIFF] Current visibleTextEditors count: ${window.visibleTextEditors?.length || 0}`,\n\t\t\t\"VSCode.Commands\",\n\t\t)\n\n\t\ttry {\n\t\t\t// The document should already be open from the showTextDocument call\n\t\t\t// Find it in the existing textDocuments\n\t\t\tlogs.info(`[DIFF] Looking for already-opened document: ${modifiedUri.fsPath}`, \"VSCode.Commands\")\n\t\t\tlet document = workspace.textDocuments.find((doc: TextDocument) => doc.uri.fsPath === modifiedUri.fsPath)\n\n\t\t\tif (!document) {\n\t\t\t\t// If not found, open it now\n\t\t\t\tlogs.info(`[DIFF] Document not found, opening: ${modifiedUri.fsPath}`, \"VSCode.Commands\")\n\t\t\t\tdocument = await workspace.openTextDocument(modifiedUri)\n\t\t\t\tlogs.info(`[DIFF] Document opened successfully, lineCount: ${document.lineCount}`, \"VSCode.Commands\")\n\t\t\t} else {\n\t\t\t\tlogs.info(`[DIFF] Found existing document, lineCount: ${document.lineCount}`, \"VSCode.Commands\")\n\t\t\t}\n\n\t\t\t// Create a mock editor for the diff view\n\t\t\tconst mockEditor: TextEditor = {\n\t\t\t\tdocument,\n\t\t\t\tselection: new Selection(new Position(0, 0), new Position(0, 0)),\n\t\t\t\tselections: [new Selection(new Position(0, 0), new Position(0, 0))],\n\t\t\t\tvisibleRanges: [new Range(new Position(0, 0), new Position(0, 0))],\n\t\t\t\toptions: {},\n\t\t\t\tviewColumn: ViewColumn.One,\n\t\t\t\tedit: async (callback: (editBuilder: TextEditorEdit) => void) => {\n\t\t\t\t\t// Create a mock edit builder\n\t\t\t\t\tconst editBuilder: TextEditorEdit = {\n\t\t\t\t\t\treplace: (_range: Range | Position | Selection, _text: string) => {\n\t\t\t\t\t\t\t// In CLI mode, we don't actually edit here\n\t\t\t\t\t\t\t// The DiffViewProvider will handle the actual edits\n\t\t\t\t\t\t\tlogs.debug(\"Mock edit builder replace called\", \"VSCode.Commands\")\n\t\t\t\t\t\t},\n\t\t\t\t\t\tinsert: (_position: Position, _text: string) => {\n\t\t\t\t\t\t\tlogs.debug(\"Mock edit builder insert called\", \"VSCode.Commands\")\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdelete: (_range: Range | Selection) => {\n\t\t\t\t\t\t\tlogs.debug(\"Mock edit builder delete called\", \"VSCode.Commands\")\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsetEndOfLine: (_endOfLine: EndOfLine) => {\n\t\t\t\t\t\t\tlogs.debug(\"Mock edit builder setEndOfLine called\", \"VSCode.Commands\")\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t\tcallback(editBuilder)\n\t\t\t\t\treturn true\n\t\t\t\t},\n\t\t\t\tinsertSnippet: () => Promise.resolve(true),\n\t\t\t\tsetDecorations: () => {},\n\t\t\t\trevealRange: () => {},\n\t\t\t\tshow: () => {},\n\t\t\t\thide: () => {},\n\t\t\t}\n\n\t\t\t// Add the editor to visible editors\n\t\t\tif (!window.visibleTextEditors) {\n\t\t\t\twindow.visibleTextEditors = []\n\t\t\t}\n\n\t\t\t// Check if this editor is already in visibleTextEditors (from showTextDocument)\n\t\t\tconst existingEditor = window.visibleTextEditors.find(\n\t\t\t\t(e: TextEditor) => e.document.uri.fsPath === modifiedUri.fsPath,\n\t\t\t)\n\n\t\t\tif (existingEditor) {\n\t\t\t\tlogs.info(`[DIFF] Editor already in visibleTextEditors, updating it`, \"VSCode.Commands\")\n\t\t\t\t// Update the existing editor with the mock editor properties\n\t\t\t\tObject.assign(existingEditor, mockEditor)\n\t\t\t} else {\n\t\t\t\tlogs.info(`[DIFF] Adding new mock editor to visibleTextEditors`, \"VSCode.Commands\")\n\t\t\t\twindow.visibleTextEditors.push(mockEditor)\n\t\t\t}\n\n\t\t\tlogs.info(`[DIFF] visibleTextEditors count: ${window.visibleTextEditors.length}`, \"VSCode.Commands\")\n\n\t\t\t// The onDidChangeVisibleTextEditors event was already fired by showTextDocument\n\t\t\t// We don't need to fire it again here\n\t\t\tlogs.info(\n\t\t\t\t`[DIFF] Diff view simulation complete (events already fired by showTextDocument)`,\n\t\t\t\t\"VSCode.Commands\",\n\t\t\t)\n\t\t} catch (error) {\n\t\t\tlogs.error(\"[DIFF] Error simulating diff view\", \"VSCode.Commands\", { error })\n\t\t}\n\t}\n}\n","/**\n * Machine ID generation\n * Simple implementation to replace node-machine-id dependency\n */\n\nimport * as fs from \"fs\"\nimport * as path from \"path\"\nimport * as crypto from \"crypto\"\nimport * as os from \"os\"\nimport { ensureDirectoryExists } from \"./paths.js\"\n\n/**\n * Get or create a unique machine ID\n * Stores in ~/.vscode-mock/.machine-id for persistence\n */\nexport function machineIdSync(): string {\n\tconst homeDir = process.env.HOME || process.env.USERPROFILE || \".\"\n\tconst idPath = path.join(homeDir, \".vscode-mock\", \".machine-id\")\n\n\t// Try to read existing ID\n\ttry {\n\t\tif (fs.existsSync(idPath)) {\n\t\t\treturn fs.readFileSync(idPath, \"utf-8\").trim()\n\t\t}\n\t} catch {\n\t\t// Fall through to generate new ID\n\t}\n\n\t// Generate new ID based on hostname and random data\n\tconst hostname = os.hostname()\n\tconst randomData = crypto.randomBytes(16).toString(\"hex\")\n\tconst machineId = crypto.createHash(\"sha256\").update(`${hostname}-${randomData}`).digest(\"hex\")\n\n\t// Save for future use\n\ttry {\n\t\tconst dir = path.dirname(idPath)\n\t\tensureDirectoryExists(dir)\n\t\tfs.writeFileSync(idPath, machineId)\n\t} catch {\n\t\t// Ignore save errors\n\t}\n\n\treturn machineId\n}\n","/**\n * Main factory function for creating VSCode API mock\n */\n\nimport { machineIdSync } from \"../utils/machine-id.js\"\nimport { logs } from \"../utils/logger.js\"\n\n// Import classes\nimport { Uri } from \"../classes/Uri.js\"\nimport { Position } from \"../classes/Position.js\"\nimport { Range } from \"../classes/Range.js\"\nimport { Selection } from \"../classes/Selection.js\"\nimport { EventEmitter } from \"../classes/EventEmitter.js\"\nimport { TextEdit, WorkspaceEdit } from \"../classes/TextEdit.js\"\nimport {\n\tLocation,\n\tDiagnostic,\n\tDiagnosticRelatedInformation,\n\tThemeColor,\n\tThemeIcon,\n\tCodeActionKind,\n\tCodeLens,\n\tLanguageModelTextPart,\n\tLanguageModelToolCallPart,\n\tLanguageModelToolResultPart,\n\tFileSystemError,\n} from \"../classes/Additional.js\"\nimport { CancellationTokenSource } from \"../classes/CancellationToken.js\"\nimport { StatusBarItem } from \"../classes/StatusBarItem.js\"\nimport { ExtensionContextImpl } from \"../context/ExtensionContext.js\"\n\n// Import APIs\nimport { WorkspaceAPI } from \"./WorkspaceAPI.js\"\nimport { WindowAPI } from \"./WindowAPI.js\"\nimport { CommandsAPI } from \"./CommandsAPI.js\"\n\n// Import types and enums\nimport {\n\tConfigurationTarget,\n\tViewColumn,\n\tTextEditorRevealType,\n\tStatusBarAlignment,\n\tDiagnosticSeverity,\n\tDiagnosticTag,\n\tEndOfLine,\n\tUIKind,\n\tExtensionMode,\n\tFileType,\n\tDecorationRangeBehavior,\n\tOverviewRulerLane,\n} from \"../types.js\"\n\n// Import interfaces\nimport type { CancellationToken } from \"../interfaces/document.js\"\nimport type { Disposable, DiagnosticCollection, IdentityInfo } from \"../interfaces/workspace.js\"\nimport type { RelativePattern } from \"../interfaces/document.js\"\nimport type { UriHandler } from \"../interfaces/webview.js\"\n\n// Package version constant\nconst Package = { version: \"1.0.0\" }\n\n/**\n * Options for creating the VSCode API mock\n */\nexport interface VSCodeAPIMockOptions {\n\t/**\n\t * Custom app root path (for locating ripgrep and other VSCode resources).\n\t * Defaults to the directory containing this module.\n\t */\n\tappRoot?: string\n\n\t/**\n\t * Custom storage directory for persistent state.\n\t * Defaults to ~/.vscode-mock.\n\t * Set to a temp directory for ephemeral/no-persist mode.\n\t */\n\tstorageDir?: string\n}\n\n/**\n * Create a complete VSCode API mock for CLI mode\n */\nexport function createVSCodeAPIMock(\n\textensionRootPath: string,\n\tworkspacePath: string,\n\tidentity?: IdentityInfo,\n\toptions?: VSCodeAPIMockOptions,\n) {\n\tconst context = new ExtensionContextImpl({\n\t\textensionPath: extensionRootPath,\n\t\tworkspacePath: workspacePath,\n\t\tstorageDir: options?.storageDir,\n\t})\n\tconst workspace = new WorkspaceAPI(workspacePath, context)\n\tconst window = new WindowAPI()\n\tconst commands = new CommandsAPI()\n\n\t// Link window and workspace for cross-API calls\n\twindow.setWorkspace(workspace)\n\n\t// Environment mock with identity values\n\tconst env = {\n\t\tappName: `wrapper|cli|cli|${Package.version}`,\n\t\tappRoot: options?.appRoot || import.meta.dirname,\n\t\tlanguage: \"en\",\n\t\tmachineId: identity?.machineId || machineIdSync(),\n\t\tsessionId: identity?.sessionId || \"cli-session-id\",\n\t\tremoteName: undefined,\n\t\tshell: process.env.SHELL || \"/bin/bash\",\n\t\turiScheme: \"vscode\",\n\t\tuiKind: 1, // Desktop\n\t\topenExternal: async (uri: Uri): Promise<boolean> => {\n\t\t\tlogs.info(`Would open external URL: ${uri.toString()}`, \"VSCode.Env\")\n\t\t\treturn true\n\t\t},\n\t\tclipboard: {\n\t\t\treadText: async (): Promise<string> => {\n\t\t\t\tlogs.debug(\"Clipboard read requested\", \"VSCode.Clipboard\")\n\t\t\t\treturn \"\"\n\t\t\t},\n\t\t\twriteText: async (text: string): Promise<void> => {\n\t\t\t\tlogs.debug(\n\t\t\t\t\t`Clipboard write: ${text.substring(0, 100)}${text.length > 100 ? \"...\" : \"\"}`,\n\t\t\t\t\t\"VSCode.Clipboard\",\n\t\t\t\t)\n\t\t\t},\n\t\t},\n\t}\n\n\treturn {\n\t\tversion: \"1.84.0\",\n\t\tUri,\n\t\tEventEmitter,\n\t\tConfigurationTarget,\n\t\tViewColumn,\n\t\tTextEditorRevealType,\n\t\tStatusBarAlignment,\n\t\tDiagnosticSeverity,\n\t\tDiagnosticTag,\n\t\tPosition,\n\t\tRange,\n\t\tSelection,\n\t\tLocation,\n\t\tDiagnostic,\n\t\tDiagnosticRelatedInformation,\n\t\tTextEdit,\n\t\tWorkspaceEdit,\n\t\tEndOfLine,\n\t\tUIKind,\n\t\tExtensionMode,\n\t\tCodeActionKind,\n\t\tThemeColor,\n\t\tThemeIcon,\n\t\tDecorationRangeBehavior,\n\t\tOverviewRulerLane,\n\t\tStatusBarItem,\n\t\tCancellationToken: class CancellationTokenClass implements CancellationToken {\n\t\t\tisCancellationRequested = false\n\t\t\tonCancellationRequested = (_listener: (e: unknown) => void) => ({ dispose: () => {} })\n\t\t},\n\t\tCancellationTokenSource,\n\t\tCodeLens,\n\t\tLanguageModelTextPart,\n\t\tLanguageModelToolCallPart,\n\t\tLanguageModelToolResultPart,\n\t\tExtensionContext: ExtensionContextImpl,\n\t\tFileType,\n\t\tFileSystemError,\n\t\tDisposable: class DisposableClass implements Disposable {\n\t\t\tdispose(): void {\n\t\t\t\t// No-op for CLI\n\t\t\t}\n\n\t\t\tstatic from(...disposables: Disposable[]): Disposable {\n\t\t\t\treturn {\n\t\t\t\t\tdispose: () => {\n\t\t\t\t\t\tdisposables.forEach((d) => d.dispose())\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tTabInputText: class TabInputText {\n\t\t\tconstructor(public uri: Uri) {}\n\t\t},\n\t\tTabInputTextDiff: class TabInputTextDiff {\n\t\t\tconstructor(\n\t\t\t\tpublic original: Uri,\n\t\t\t\tpublic modified: Uri,\n\t\t\t) {}\n\t\t},\n\t\tworkspace,\n\t\twindow,\n\t\tcommands,\n\t\tenv,\n\t\tcontext,\n\t\t// Add more APIs as needed\n\t\tlanguages: {\n\t\t\tregisterCodeActionsProvider: () => ({ dispose: () => {} }),\n\t\t\tregisterCodeLensProvider: () => ({ dispose: () => {} }),\n\t\t\tregisterCompletionItemProvider: () => ({ dispose: () => {} }),\n\t\t\tregisterHoverProvider: () => ({ dispose: () => {} }),\n\t\t\tregisterDefinitionProvider: () => ({ dispose: () => {} }),\n\t\t\tregisterReferenceProvider: () => ({ dispose: () => {} }),\n\t\t\tregisterDocumentSymbolProvider: () => ({ dispose: () => {} }),\n\t\t\tregisterWorkspaceSymbolProvider: () => ({ dispose: () => {} }),\n\t\t\tregisterRenameProvider: () => ({ dispose: () => {} }),\n\t\t\tregisterDocumentFormattingEditProvider: () => ({ dispose: () => {} }),\n\t\t\tregisterDocumentRangeFormattingEditProvider: () => ({ dispose: () => {} }),\n\t\t\tregisterSignatureHelpProvider: () => ({ dispose: () => {} }),\n\t\t\tgetDiagnostics: (uri?: Uri): [Uri, Diagnostic[]][] | Diagnostic[] => {\n\t\t\t\t// In CLI mode, we don't have real diagnostics\n\t\t\t\t// Return empty array or empty diagnostics for the specific URI\n\t\t\t\tif (uri) {\n\t\t\t\t\treturn []\n\t\t\t\t}\n\t\t\t\treturn []\n\t\t\t},\n\t\t\tcreateDiagnosticCollection: (name?: string): DiagnosticCollection => {\n\t\t\t\tconst diagnostics = new Map<string, Diagnostic[]>()\n\t\t\t\tconst collection: DiagnosticCollection = {\n\t\t\t\t\tname: name || \"default\",\n\t\t\t\t\tset: (\n\t\t\t\t\t\turiOrEntries: Uri | [Uri, Diagnostic[] | undefined][],\n\t\t\t\t\t\tdiagnosticsOrUndefined?: Diagnostic[] | undefined,\n\t\t\t\t\t) => {\n\t\t\t\t\t\tif (Array.isArray(uriOrEntries)) {\n\t\t\t\t\t\t\t// Handle array of entries\n\t\t\t\t\t\t\tfor (const [uri, diags] of uriOrEntries) {\n\t\t\t\t\t\t\t\tif (diags === undefined) {\n\t\t\t\t\t\t\t\t\tdiagnostics.delete(uri.toString())\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tdiagnostics.set(uri.toString(), diags)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Handle single URI\n\t\t\t\t\t\t\tif (diagnosticsOrUndefined === undefined) {\n\t\t\t\t\t\t\t\tdiagnostics.delete(uriOrEntries.toString())\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tdiagnostics.set(uriOrEntries.toString(), diagnosticsOrUndefined)\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\tdelete: (uri: Uri) => {\n\t\t\t\t\t\tdiagnostics.delete(uri.toString())\n\t\t\t\t\t},\n\t\t\t\t\tclear: () => {\n\t\t\t\t\t\tdiagnostics.clear()\n\t\t\t\t\t},\n\t\t\t\t\tforEach: (\n\t\t\t\t\t\tcallback: (uri: Uri, diagnostics: Diagnostic[], collection: DiagnosticCollection) => void,\n\t\t\t\t\t\tthisArg?: unknown,\n\t\t\t\t\t) => {\n\t\t\t\t\t\tdiagnostics.forEach((diags, uriString) => {\n\t\t\t\t\t\t\tcallback.call(thisArg, Uri.parse(uriString), diags, collection)\n\t\t\t\t\t\t})\n\t\t\t\t\t},\n\t\t\t\t\tget: (uri: Uri) => {\n\t\t\t\t\t\treturn diagnostics.get(uri.toString())\n\t\t\t\t\t},\n\t\t\t\t\thas: (uri: Uri) => {\n\t\t\t\t\t\treturn diagnostics.has(uri.toString())\n\t\t\t\t\t},\n\t\t\t\t\tdispose: () => {\n\t\t\t\t\t\tdiagnostics.clear()\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t\treturn collection\n\t\t\t},\n\t\t},\n\t\tdebug: {\n\t\t\tonDidStartDebugSession: () => ({ dispose: () => {} }),\n\t\t\tonDidTerminateDebugSession: () => ({ dispose: () => {} }),\n\t\t},\n\t\ttasks: {\n\t\t\tonDidStartTask: () => ({ dispose: () => {} }),\n\t\t\tonDidEndTask: () => ({ dispose: () => {} }),\n\t\t},\n\t\textensions: {\n\t\t\tall: [],\n\t\t\tgetExtension: (extensionId: string) => {\n\t\t\t\t// Mock the extension object with extensionUri for theme loading\n\t\t\t\tif (extensionId === \"RooVeterinaryInc.roo-cline\") {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tid: extensionId,\n\t\t\t\t\t\textensionUri: context.extensionUri,\n\t\t\t\t\t\textensionPath: context.extensionPath,\n\t\t\t\t\t\tisActive: true,\n\t\t\t\t\t\tpackageJSON: {},\n\t\t\t\t\t\texports: undefined,\n\t\t\t\t\t\tactivate: () => Promise.resolve(),\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn undefined\n\t\t\t},\n\t\t\tonDidChange: () => ({ dispose: () => {} }),\n\t\t},\n\t\t// Add file system watcher\n\t\tFileSystemWatcher: class {\n\t\t\tonDidChange = () => ({ dispose: () => {} })\n\t\t\tonDidCreate = () => ({ dispose: () => {} })\n\t\t\tonDidDelete = () => ({ dispose: () => {} })\n\t\t\tdispose = () => {}\n\t\t},\n\t\t// Add relative pattern\n\t\tRelativePattern: class implements RelativePattern {\n\t\t\tconstructor(\n\t\t\t\tpublic base: string,\n\t\t\t\tpublic pattern: string,\n\t\t\t) {}\n\t\t},\n\t\t// Add progress location\n\t\tProgressLocation: {\n\t\t\tSourceControl: 1,\n\t\t\tWindow: 10,\n\t\t\tNotification: 15,\n\t\t},\n\t\t// Add URI handler\n\t\tUriHandler: class implements UriHandler {\n\t\t\thandleUri = (_uri: Uri) => {}\n\t\t},\n\t}\n}\n","/**\r\n * Agent Loop State Detection\r\n *\r\n * This module provides the core logic for detecting the current state of the\r\n * Roo Code agent loop. The state is determined by analyzing the clineMessages\r\n * array, specifically the last message's type and properties.\r\n *\r\n * Key insight: The agent loop stops whenever a message with `type: \"ask\"` arrives,\r\n * and the specific `ask` value determines what kind of response the agent is waiting for.\r\n */\r\n\r\nimport { ClineMessage, ClineAsk, isIdleAsk, isResumableAsk, isInteractiveAsk, isNonBlockingAsk } from \"../../types\"\r\n\r\n// =============================================================================\r\n// Agent Loop State Enum\r\n// =============================================================================\r\n\r\n/**\r\n * The possible states of the agent loop.\r\n *\r\n * State Machine:\r\n * ```\r\n * ┌─────────────────┐\r\n * │ NO_TASK │ (initial state)\r\n * └────────┬────────┘\r\n * │ newTask\r\n * ▼\r\n * ┌─────────────────────────────┐\r\n * ┌───▶│ RUNNING │◀───┐\r\n * │ └──────────┬──────────────────┘ │\r\n * │ │ │\r\n * │ ┌──────────┼──────────────┐ │\r\n * │ │ │ │ │\r\n * │ ▼ ▼ ▼ │\r\n * │ ┌──────┐ ┌─────────┐ ┌──────────┐ │\r\n * │ │STREAM│ │INTERACT │ │ IDLE │ │\r\n * │ │ ING │ │ IVE │ │ │ │\r\n * │ └──┬───┘ └────┬────┘ └────┬─────┘ │\r\n * │ │ │ │ │\r\n * │ │ done │ approved │ newTask │\r\n * └────┴───────────┴────────────┘ │\r\n * │\r\n * ┌──────────────┐ │\r\n * │ RESUMABLE │────────────────────────┘\r\n * └──────────────┘ resumed\r\n * ```\r\n */\r\nexport enum AgentLoopState {\r\n\t/**\r\n\t * No active task. This is the initial state before any task is started,\r\n\t * or after a task has been cleared.\r\n\t */\r\n\tNO_TASK = \"no_task\",\r\n\r\n\t/**\r\n\t * Agent is actively processing. This means:\r\n\t * - The last message is a \"say\" type (informational), OR\r\n\t * - The last message is a non-blocking ask (command_output)\r\n\t *\r\n\t * In this state, the agent may be:\r\n\t * - Executing tools\r\n\t * - Thinking/reasoning\r\n\t * - Processing between API calls\r\n\t */\r\n\tRUNNING = \"running\",\r\n\r\n\t/**\r\n\t * Agent is streaming a response. This is detected when:\r\n\t * - `partial === true` on the last message, OR\r\n\t * - The last `api_req_started` message has no `cost` in its text field\r\n\t *\r\n\t * Do NOT consider the agent \"waiting\" while streaming.\r\n\t */\r\n\tSTREAMING = \"streaming\",\r\n\r\n\t/**\r\n\t * Agent is waiting for user approval or input. This includes:\r\n\t * - Tool approvals (file operations)\r\n\t * - Command execution permission\r\n\t * - Browser action permission\r\n\t * - MCP server permission\r\n\t * - Follow-up questions\r\n\t *\r\n\t * User must approve, reject, or provide input to continue.\r\n\t */\r\n\tWAITING_FOR_INPUT = \"waiting_for_input\",\r\n\r\n\t/**\r\n\t * Task is in an idle/terminal state. This includes:\r\n\t * - Task completed successfully (completion_result)\r\n\t * - API request failed (api_req_failed)\r\n\t * - Too many errors (mistake_limit_reached)\r\n\t * - Auto-approval limit reached\r\n\t * - Completed task waiting to be resumed\r\n\t *\r\n\t * User can start a new task or retry.\r\n\t */\r\n\tIDLE = \"idle\",\r\n\r\n\t/**\r\n\t * Task is paused and can be resumed. This happens when:\r\n\t * - User navigated away from a task\r\n\t * - Extension was restarted mid-task\r\n\t *\r\n\t * User can resume or abandon the task.\r\n\t */\r\n\tRESUMABLE = \"resumable\",\r\n}\r\n\r\n// =============================================================================\r\n// Detailed State Info\r\n// =============================================================================\r\n\r\n/**\r\n * What action the user should/can take in the current state.\r\n */\r\nexport type RequiredAction =\r\n\t| \"none\" // No action needed (running/streaming)\r\n\t| \"approve\" // Can approve/reject (tool, command, mcp)\r\n\t| \"answer\" // Need to answer a question (followup)\r\n\t| \"retry_or_new_task\" // Can retry or start new task (api_req_failed)\r\n\t| \"proceed_or_new_task\" // Can proceed or start new task (mistake_limit)\r\n\t| \"start_task\" // Should start a new task (completion_result)\r\n\t| \"resume_or_abandon\" // Can resume or abandon (resume_task)\r\n\t| \"start_new_task\" // Should start new task (resume_completed_task, no_task)\r\n\t| \"continue_or_abort\" // Can continue or abort (command_output)\r\n\r\n/**\r\n * Detailed information about the current agent state.\r\n * Provides everything needed to render UI or make decisions.\r\n */\r\nexport interface AgentStateInfo {\r\n\t/** The high-level state of the agent loop */\r\n\tstate: AgentLoopState\r\n\r\n\t/** Whether the agent is waiting for user input/action */\r\n\tisWaitingForInput: boolean\r\n\r\n\t/** Whether the agent loop is actively processing */\r\n\tisRunning: boolean\r\n\r\n\t/** Whether content is being streamed */\r\n\tisStreaming: boolean\r\n\r\n\t/** The specific ask type if waiting on an ask, undefined otherwise */\r\n\tcurrentAsk?: ClineAsk\r\n\r\n\t/** What action the user should/can take */\r\n\trequiredAction: RequiredAction\r\n\r\n\t/** The timestamp of the last message, useful for tracking */\r\n\tlastMessageTs?: number\r\n\r\n\t/** The full last message for advanced usage */\r\n\tlastMessage?: ClineMessage\r\n\r\n\t/** Human-readable description of the current state */\r\n\tdescription: string\r\n}\r\n\r\n// =============================================================================\r\n// State Detection Functions\r\n// =============================================================================\r\n\r\n/**\r\n * Structure of the text field in api_req_started messages.\r\n * Used to determine if the API request has completed (cost is defined).\r\n */\r\nexport interface ApiReqStartedText {\r\n\tcost?: number // Undefined while streaming, defined when complete.\r\n\ttokensIn?: number\r\n\ttokensOut?: number\r\n\tcacheWrites?: number\r\n\tcacheReads?: number\r\n}\r\n\r\n/**\r\n * Check if an API request is still in progress (streaming).\r\n *\r\n * API requests are considered in-progress when:\r\n * - An api_req_started message exists\r\n * - Its text field, when parsed, has `cost: undefined`\r\n *\r\n * Once the request completes, the cost field will be populated.\r\n */\r\nfunction isApiRequestInProgress(messages: ClineMessage[]): boolean {\r\n\t// Find the last api_req_started message.\r\n\t// Using reverse iteration for efficiency (most recent first).\r\n\tfor (let i = messages.length - 1; i >= 0; i--) {\r\n\t\tconst message = messages[i]\r\n\r\n\t\tif (!message) {\r\n\t\t\tcontinue\r\n\t\t}\r\n\r\n\t\tif (message.say === \"api_req_started\") {\r\n\t\t\tif (!message.text) {\r\n\t\t\t\t// No text yet means still in progress.\r\n\t\t\t\treturn true\r\n\t\t\t}\r\n\r\n\t\t\ttry {\r\n\t\t\t\tconst data: ApiReqStartedText = JSON.parse(message.text)\r\n\t\t\t\t// cost is undefined while streaming, defined when complete.\r\n\t\t\t\treturn data.cost === undefined\r\n\t\t\t} catch {\r\n\t\t\t\t// Parse error - assume not in progress.\r\n\t\t\t\treturn false\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn false\r\n}\r\n\r\n/**\r\n * Determine the required action based on the current ask type.\r\n */\r\nfunction getRequiredAction(ask: ClineAsk): RequiredAction {\r\n\tswitch (ask) {\r\n\t\tcase \"followup\":\r\n\t\t\treturn \"answer\"\r\n\t\tcase \"command\":\r\n\t\tcase \"tool\":\r\n\t\tcase \"use_mcp_server\":\r\n\t\t\treturn \"approve\"\r\n\t\tcase \"command_output\":\r\n\t\t\treturn \"continue_or_abort\"\r\n\t\tcase \"api_req_failed\":\r\n\t\t\treturn \"retry_or_new_task\"\r\n\t\tcase \"mistake_limit_reached\":\r\n\t\t\treturn \"proceed_or_new_task\"\r\n\t\tcase \"completion_result\":\r\n\t\t\treturn \"start_task\"\r\n\t\tcase \"resume_task\":\r\n\t\t\treturn \"resume_or_abandon\"\r\n\t\tcase \"resume_completed_task\":\r\n\t\tcase \"auto_approval_max_req_reached\":\r\n\t\t\treturn \"start_new_task\"\r\n\t\tdefault:\r\n\t\t\treturn \"none\"\r\n\t}\r\n}\r\n\r\n/**\r\n * Get a human-readable description for the current state.\r\n */\r\nfunction getStateDescription(state: AgentLoopState, ask?: ClineAsk): string {\r\n\tswitch (state) {\r\n\t\tcase AgentLoopState.NO_TASK:\r\n\t\t\treturn \"No active task. Ready to start a new task.\"\r\n\r\n\t\tcase AgentLoopState.RUNNING:\r\n\t\t\treturn \"Agent is actively processing.\"\r\n\r\n\t\tcase AgentLoopState.STREAMING:\r\n\t\t\treturn \"Agent is streaming a response.\"\r\n\r\n\t\tcase AgentLoopState.WAITING_FOR_INPUT:\r\n\t\t\tswitch (ask) {\r\n\t\t\t\tcase \"followup\":\r\n\t\t\t\t\treturn \"Agent is asking a follow-up question. Please provide an answer.\"\r\n\t\t\t\tcase \"command\":\r\n\t\t\t\t\treturn \"Agent wants to execute a command. Approve or reject.\"\r\n\t\t\t\tcase \"tool\":\r\n\t\t\t\t\treturn \"Agent wants to perform a file operation. Approve or reject.\"\r\n\t\t\t\tcase \"use_mcp_server\":\r\n\t\t\t\t\treturn \"Agent wants to use an MCP server. Approve or reject.\"\r\n\t\t\t\tdefault:\r\n\t\t\t\t\treturn \"Agent is waiting for user input.\"\r\n\t\t\t}\r\n\r\n\t\tcase AgentLoopState.IDLE:\r\n\t\t\tswitch (ask) {\r\n\t\t\t\tcase \"completion_result\":\r\n\t\t\t\t\treturn \"Task completed successfully. You can provide feedback or start a new task.\"\r\n\t\t\t\tcase \"api_req_failed\":\r\n\t\t\t\t\treturn \"API request failed. You can retry or start a new task.\"\r\n\t\t\t\tcase \"mistake_limit_reached\":\r\n\t\t\t\t\treturn \"Too many errors encountered. You can proceed anyway or start a new task.\"\r\n\t\t\t\tcase \"auto_approval_max_req_reached\":\r\n\t\t\t\t\treturn \"Auto-approval limit reached. Manual approval required.\"\r\n\t\t\t\tcase \"resume_completed_task\":\r\n\t\t\t\t\treturn \"Previously completed task. Start a new task to continue.\"\r\n\t\t\t\tdefault:\r\n\t\t\t\t\treturn \"Task is idle.\"\r\n\t\t\t}\r\n\r\n\t\tcase AgentLoopState.RESUMABLE:\r\n\t\t\treturn \"Task is paused. You can resume or start a new task.\"\r\n\r\n\t\tdefault:\r\n\t\t\treturn \"Unknown state.\"\r\n\t}\r\n}\r\n\r\n/**\r\n * Detect the current state of the agent loop from the clineMessages array.\r\n *\r\n * This is the main state detection function. It analyzes the messages array\r\n * and returns detailed information about the current agent state.\r\n *\r\n * @param messages - The clineMessages array from extension state\r\n * @returns Detailed state information\r\n */\r\nexport function detectAgentState(messages: ClineMessage[]): AgentStateInfo {\r\n\t// No messages means no task\r\n\tif (!messages || messages.length === 0) {\r\n\t\treturn {\r\n\t\t\tstate: AgentLoopState.NO_TASK,\r\n\t\t\tisWaitingForInput: false,\r\n\t\t\tisRunning: false,\r\n\t\t\tisStreaming: false,\r\n\t\t\trequiredAction: \"start_new_task\",\r\n\t\t\tdescription: getStateDescription(AgentLoopState.NO_TASK),\r\n\t\t}\r\n\t}\r\n\r\n\tconst lastMessage = messages[messages.length - 1]\r\n\r\n\t// Guard against undefined (should never happen after length check, but TypeScript requires it)\r\n\tif (!lastMessage) {\r\n\t\treturn {\r\n\t\t\tstate: AgentLoopState.NO_TASK,\r\n\t\t\tisWaitingForInput: false,\r\n\t\t\tisRunning: false,\r\n\t\t\tisStreaming: false,\r\n\t\t\trequiredAction: \"start_new_task\",\r\n\t\t\tdescription: getStateDescription(AgentLoopState.NO_TASK),\r\n\t\t}\r\n\t}\r\n\r\n\t// Check if the message is still streaming (partial)\r\n\t// This is the PRIMARY indicator of streaming\r\n\tif (lastMessage.partial === true) {\r\n\t\treturn {\r\n\t\t\tstate: AgentLoopState.STREAMING,\r\n\t\t\tisWaitingForInput: false,\r\n\t\t\tisRunning: true,\r\n\t\t\tisStreaming: true,\r\n\t\t\tcurrentAsk: lastMessage.ask,\r\n\t\t\trequiredAction: \"none\",\r\n\t\t\tlastMessageTs: lastMessage.ts,\r\n\t\t\tlastMessage,\r\n\t\t\tdescription: getStateDescription(AgentLoopState.STREAMING),\r\n\t\t}\r\n\t}\r\n\r\n\t// Handle \"ask\" type messages\r\n\tif (lastMessage.type === \"ask\" && lastMessage.ask) {\r\n\t\tconst ask = lastMessage.ask\r\n\r\n\t\t// Non-blocking asks (command_output) - agent is running but can be interrupted\r\n\t\tif (isNonBlockingAsk(ask)) {\r\n\t\t\treturn {\r\n\t\t\t\tstate: AgentLoopState.RUNNING,\r\n\t\t\t\tisWaitingForInput: false,\r\n\t\t\t\tisRunning: true,\r\n\t\t\t\tisStreaming: false,\r\n\t\t\t\tcurrentAsk: ask,\r\n\t\t\t\trequiredAction: \"continue_or_abort\",\r\n\t\t\t\tlastMessageTs: lastMessage.ts,\r\n\t\t\t\tlastMessage,\r\n\t\t\t\tdescription: \"Command is running. You can continue or abort.\",\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Idle asks - task has stopped\r\n\t\tif (isIdleAsk(ask)) {\r\n\t\t\treturn {\r\n\t\t\t\tstate: AgentLoopState.IDLE,\r\n\t\t\t\tisWaitingForInput: true, // User needs to decide what to do next\r\n\t\t\t\tisRunning: false,\r\n\t\t\t\tisStreaming: false,\r\n\t\t\t\tcurrentAsk: ask,\r\n\t\t\t\trequiredAction: getRequiredAction(ask),\r\n\t\t\t\tlastMessageTs: lastMessage.ts,\r\n\t\t\t\tlastMessage,\r\n\t\t\t\tdescription: getStateDescription(AgentLoopState.IDLE, ask),\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Resumable asks - task is paused\r\n\t\tif (isResumableAsk(ask)) {\r\n\t\t\treturn {\r\n\t\t\t\tstate: AgentLoopState.RESUMABLE,\r\n\t\t\t\tisWaitingForInput: true,\r\n\t\t\t\tisRunning: false,\r\n\t\t\t\tisStreaming: false,\r\n\t\t\t\tcurrentAsk: ask,\r\n\t\t\t\trequiredAction: getRequiredAction(ask),\r\n\t\t\t\tlastMessageTs: lastMessage.ts,\r\n\t\t\t\tlastMessage,\r\n\t\t\t\tdescription: getStateDescription(AgentLoopState.RESUMABLE, ask),\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Interactive asks - waiting for approval/input\r\n\t\tif (isInteractiveAsk(ask)) {\r\n\t\t\treturn {\r\n\t\t\t\tstate: AgentLoopState.WAITING_FOR_INPUT,\r\n\t\t\t\tisWaitingForInput: true,\r\n\t\t\t\tisRunning: false,\r\n\t\t\t\tisStreaming: false,\r\n\t\t\t\tcurrentAsk: ask,\r\n\t\t\t\trequiredAction: getRequiredAction(ask),\r\n\t\t\t\tlastMessageTs: lastMessage.ts,\r\n\t\t\t\tlastMessage,\r\n\t\t\t\tdescription: getStateDescription(AgentLoopState.WAITING_FOR_INPUT, ask),\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// For \"say\" type messages, check if API request is in progress\r\n\tif (isApiRequestInProgress(messages)) {\r\n\t\treturn {\r\n\t\t\tstate: AgentLoopState.STREAMING,\r\n\t\t\tisWaitingForInput: false,\r\n\t\t\tisRunning: true,\r\n\t\t\tisStreaming: true,\r\n\t\t\trequiredAction: \"none\",\r\n\t\t\tlastMessageTs: lastMessage.ts,\r\n\t\t\tlastMessage,\r\n\t\t\tdescription: getStateDescription(AgentLoopState.STREAMING),\r\n\t\t}\r\n\t}\r\n\r\n\t// Default: agent is running\r\n\treturn {\r\n\t\tstate: AgentLoopState.RUNNING,\r\n\t\tisWaitingForInput: false,\r\n\t\tisRunning: true,\r\n\t\tisStreaming: false,\r\n\t\trequiredAction: \"none\",\r\n\t\tlastMessageTs: lastMessage.ts,\r\n\t\tlastMessage,\r\n\t\tdescription: getStateDescription(AgentLoopState.RUNNING),\r\n\t}\r\n}\r\n\r\n/**\r\n * Quick check: Is the agent waiting for user input?\r\n *\r\n * This is a convenience function for simple use cases where you just need\r\n * to know if user action is required.\r\n */\r\nexport function isAgentWaitingForInput(messages: ClineMessage[]): boolean {\r\n\treturn detectAgentState(messages).isWaitingForInput\r\n}\r\n\r\n/**\r\n * Quick check: Is the agent actively running (not waiting)?\r\n */\r\nexport function isAgentRunning(messages: ClineMessage[]): boolean {\r\n\tconst state = detectAgentState(messages)\r\n\treturn state.isRunning && !state.isWaitingForInput\r\n}\r\n\r\n/**\r\n * Quick check: Is content currently streaming?\r\n */\r\nexport function isContentStreaming(messages: ClineMessage[]): boolean {\r\n\treturn detectAgentState(messages).isStreaming\r\n}\r\n","/**\r\n * JsonEventEmitter - Handles structured JSON output for the CLI\r\n *\r\n * This class transforms internal CLI events (ClineMessage, state changes, etc.)\r\n * into structured JSON events and outputs them to stdout.\r\n *\r\n * Supports two output modes:\r\n * - \"stream-json\": NDJSON format (one JSON object per line) for real-time streaming\r\n * - \"json\": Single JSON object at the end with accumulated events\r\n *\r\n * Schema is optimized for efficiency with high message volume:\r\n * - Minimal fields per event\r\n * - No redundant wrappers\r\n * - `done` flag instead of partial:false\r\n */\r\n\r\nimport type { ClineMessage } from \"../../types\"\r\n\r\nimport type { JsonEvent, JsonEventCost, JsonEventQueueItem, JsonFinalOutput } from \"../types/json-events.js\"\r\n\r\nimport type { ExtensionClient } from \"./extension-client.js\"\r\nimport type { AgentStateChangeEvent, TaskCompletedEvent } from \"./events.js\"\r\nimport { AgentLoopState } from \"./agent-state.js\"\r\n\r\n/**\r\n * Options for JsonEventEmitter.\r\n */\r\nexport interface JsonEventEmitterOptions {\r\n\t/** Output mode: \"json\" or \"stream-json\" */\r\n\tmode: \"json\" | \"stream-json\"\r\n\t/** Output stream (defaults to process.stdout) */\r\n\tstdout?: NodeJS.WriteStream\r\n\t/** Optional request id provider for correlating stream events */\r\n\trequestIdProvider?: () => string | undefined\r\n\t/** Transport schema version emitted in system:init */\r\n\tschemaVersion?: number\r\n\t/** Transport protocol identifier emitted in system:init */\r\n\tprotocol?: string\r\n\t/** Supported stdin protocol capabilities emitted in system:init */\r\n\tcapabilities?: string[]\r\n}\r\n\r\n/**\r\n * Parse tool information from a ClineMessage text field.\r\n * Tool messages are JSON with a `tool` field containing the tool name.\r\n */\r\nfunction parseToolInfo(text: string | undefined): { name: string; input: Record<string, unknown> } | null {\r\n\tif (!text) return null\r\n\ttry {\r\n\t\tconst parsed = JSON.parse(text)\r\n\t\treturn parsed.tool ? { name: parsed.tool, input: parsed } : null\r\n\t} catch {\r\n\t\treturn null\r\n\t}\r\n}\r\n\r\n/**\r\n * Parse API request cost information from api_req_started message text.\r\n */\r\nfunction parseApiReqCost(text: string | undefined): JsonEventCost | undefined {\r\n\tif (!text) return undefined\r\n\ttry {\r\n\t\tconst parsed = JSON.parse(text)\r\n\t\treturn parsed.cost !== undefined\r\n\t\t\t? {\r\n\t\t\t\t\ttotalCost: parsed.cost,\r\n\t\t\t\t\tinputTokens: parsed.tokensIn,\r\n\t\t\t\t\toutputTokens: parsed.tokensOut,\r\n\t\t\t\t\tcacheWrites: parsed.cacheWrites,\r\n\t\t\t\t\tcacheReads: parsed.cacheReads,\r\n\t\t\t\t}\r\n\t\t\t: undefined\r\n\t} catch {\r\n\t\treturn undefined\r\n\t}\r\n}\r\n\r\n/** Internal events that should not be emitted */\r\nconst SKIP_SAY_TYPES = new Set([\r\n\t\"api_req_finished\",\r\n\t\"api_req_retried\",\r\n\t\"api_req_retry_delayed\",\r\n\t\"api_req_rate_limit_wait\",\r\n\t\"api_req_deleted\",\r\n\t\"checkpoint_saved\",\r\n\t\"condense_context\",\r\n\t\"condense_context_error\",\r\n\t\"sliding_window_truncation\",\r\n])\r\n\r\n/** Key offset for reasoning content to avoid collision with text content delta tracking */\r\nconst REASONING_KEY_OFFSET = 1_000_000_000\r\n/** Grace period to wait for final say:command_output after status:exited */\r\nconst COMMAND_OUTPUT_EXIT_GRACE_MS = 250\r\n\r\nexport class JsonEventEmitter {\r\n\tprivate mode: \"json\" | \"stream-json\"\r\n\tprivate stdout: NodeJS.WriteStream\r\n\tprivate events: JsonEvent[] = []\r\n\tprivate unsubscribers: (() => void)[] = []\r\n\tprivate pendingWrites = new Set<Promise<void>>()\r\n\tprivate lastCost: JsonEventCost | undefined\r\n\tprivate requestIdProvider: () => string | undefined\r\n\tprivate schemaVersion: number\r\n\tprivate protocol: string\r\n\tprivate capabilities: string[]\r\n\tprivate seenMessageIds = new Set<number>()\r\n\t// Track previous content for delta computation\r\n\tprivate previousContent = new Map<number, string>()\r\n\t// Track previous tool-use content for structured (non-append-only) delta computation.\r\n\tprivate previousToolUseContent = new Map<number, string>()\r\n\t// Track the currently active execute_command tool_use id for command_output correlation.\r\n\tprivate activeCommandToolUseId: number | undefined\r\n\t// Track command output snapshots by command tool-use id for delta computation.\r\n\tprivate previousCommandOutputByToolUseId = new Map<number, string>()\r\n\t// Track command ids whose output is being streamed from commandExecutionStatus updates.\r\n\tprivate statusDrivenCommandOutputIds = new Set<number>()\r\n\t// Track command ids that already emitted a terminal command_output done event.\r\n\tprivate completedCommandOutputIds = new Set<number>()\r\n\t// Track exited commands awaiting final say:command_output completion.\r\n\tprivate pendingCommandCompletionByToolUseId = new Map<number, { exitCode?: number; timer: NodeJS.Timeout }>()\r\n\t// Track the completion result content\r\n\tprivate completionResultContent: string | undefined\r\n\t// Track the latest assistant text as a fallback for result.content.\r\n\tprivate lastAssistantText: string | undefined\r\n\t// The first non-partial \"say:text\" per task is the echoed user prompt.\r\n\tprivate expectPromptEchoAsUser = true\r\n\r\n\tconstructor(options: JsonEventEmitterOptions) {\r\n\t\tthis.mode = options.mode\r\n\t\tthis.stdout = options.stdout ?? process.stdout\r\n\t\tthis.requestIdProvider = options.requestIdProvider ?? (() => undefined)\r\n\t\tthis.schemaVersion = options.schemaVersion ?? 1\r\n\t\tthis.protocol = options.protocol ?? \"roo-cli-stream\"\r\n\t\tthis.capabilities = options.capabilities ?? [\r\n\t\t\t\"stdin:start\",\r\n\t\t\t\"stdin:message\",\r\n\t\t\t\"stdin:cancel\",\r\n\t\t\t\"stdin:ping\",\r\n\t\t\t\"stdin:shutdown\",\r\n\t\t]\r\n\t}\r\n\r\n\t/**\r\n\t * Attach to an ExtensionClient and subscribe to its events.\r\n\t */\r\n\tattachToClient(client: ExtensionClient): void {\r\n\t\t// Subscribe to message events\r\n\t\tconst unsubMessage = client.on(\"message\", (msg) => this.handleMessage(msg, false))\r\n\t\tconst unsubMessageUpdated = client.on(\"messageUpdated\", (msg) => this.handleMessage(msg, true))\r\n\t\tconst unsubStateChange = client.on(\"stateChange\", (event) => this.handleStateChange(event))\r\n\t\tconst unsubTaskCompleted = client.on(\"taskCompleted\", (event) => this.handleTaskCompleted(event))\r\n\t\tconst unsubError = client.on(\"error\", (error) => this.handleError(error))\r\n\r\n\t\tthis.unsubscribers.push(unsubMessage, unsubMessageUpdated, unsubStateChange, unsubTaskCompleted, unsubError)\r\n\r\n\t\t// Emit init event\r\n\t\tthis.emitEvent({\r\n\t\t\ttype: \"system\",\r\n\t\t\tsubtype: \"init\",\r\n\t\t\tcontent: \"Task started\",\r\n\t\t\tschemaVersion: this.schemaVersion,\r\n\t\t\tprotocol: this.protocol,\r\n\t\t\tcapabilities: this.capabilities,\r\n\t\t})\r\n\t}\r\n\r\n\temitControl(event: {\r\n\t\tsubtype: \"ack\" | \"done\" | \"error\"\r\n\t\trequestId?: string\r\n\t\tcommand?: JsonEvent[\"command\"]\r\n\t\ttaskId?: string\r\n\t\tcontent?: string\r\n\t\tsuccess?: boolean\r\n\t\tcode?: string\r\n\t}): void {\r\n\t\tthis.emitEvent({\r\n\t\t\ttype: \"control\",\r\n\t\t\tsubtype: event.subtype,\r\n\t\t\trequestId: event.requestId,\r\n\t\t\tcommand: event.command,\r\n\t\t\ttaskId: event.taskId,\r\n\t\t\tcontent: event.content,\r\n\t\t\tsuccess: event.success,\r\n\t\t\tcode: event.code,\r\n\t\t\tdone: event.subtype === \"done\" ? true : undefined,\r\n\t\t})\r\n\t}\r\n\r\n\temitQueue(event: {\r\n\t\tsubtype: \"snapshot\" | \"enqueued\" | \"dequeued\" | \"drained\" | \"updated\"\r\n\t\ttaskId?: string\r\n\t\tcontent?: string\r\n\t\tqueueDepth: number\r\n\t\tqueue: JsonEventQueueItem[]\r\n\t}): void {\r\n\t\tthis.emitEvent({\r\n\t\t\ttype: \"queue\",\r\n\t\t\tsubtype: event.subtype,\r\n\t\t\ttaskId: event.taskId,\r\n\t\t\tcontent: event.content,\r\n\t\t\tqueueDepth: event.queueDepth,\r\n\t\t\tqueue: event.queue,\r\n\t\t})\r\n\t}\r\n\r\n\tprivate handleStateChange(event: AgentStateChangeEvent): void {\r\n\t\t// Only treat the next say:text as a prompt echo when a new task starts.\r\n\t\tif (\r\n\t\t\tevent.previousState.state === AgentLoopState.NO_TASK &&\r\n\t\t\tevent.currentState.state !== AgentLoopState.NO_TASK\r\n\t\t) {\r\n\t\t\tthis.expectPromptEchoAsUser = true\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Detach from the client and clean up subscriptions.\r\n\t */\r\n\tdetach(): void {\r\n\t\tfor (const unsub of this.unsubscribers) {\r\n\t\t\tunsub()\r\n\t\t}\r\n\t\tthis.unsubscribers = []\r\n\t}\r\n\r\n\t/**\r\n\t * Compute the delta (new content) for a streaming message.\r\n\t * Returns null if there's no new content.\r\n\t */\r\n\tprivate computeDelta(msgId: number, fullContent: string | undefined): string | null {\r\n\t\tif (!fullContent) return null\r\n\r\n\t\tconst previous = this.previousContent.get(msgId) || \"\"\r\n\t\tif (fullContent === previous) return null\r\n\r\n\t\tthis.previousContent.set(msgId, fullContent)\r\n\t\t// If content is appended, return only the new part\r\n\t\treturn fullContent.startsWith(previous) ? fullContent.slice(previous.length) : fullContent\r\n\t}\r\n\r\n\t/**\r\n\t * Compute a compact delta for structured strings (for tool_use snapshots).\r\n\t *\r\n\t * Unlike append-only text streams, tool-use payloads are often full snapshots\r\n\t * where edits happen before a stable suffix (e.g., inside JSON strings). This\r\n\t * extracts the inserted segment when possible; otherwise it falls back to the\r\n\t * full snapshot so consumers can recover.\r\n\t */\r\n\tprivate computeStructuredDelta(msgId: number, fullContent: string | undefined): string | null {\r\n\t\tif (!fullContent) {\r\n\t\t\treturn null\r\n\t\t}\r\n\r\n\t\tconst previous = this.previousToolUseContent.get(msgId) || \"\"\r\n\r\n\t\tif (fullContent === previous) {\r\n\t\t\treturn null\r\n\t\t}\r\n\r\n\t\tthis.previousToolUseContent.set(msgId, fullContent)\r\n\r\n\t\tif (previous.length === 0) {\r\n\t\t\treturn fullContent\r\n\t\t}\r\n\r\n\t\tif (fullContent.startsWith(previous)) {\r\n\t\t\treturn fullContent.slice(previous.length)\r\n\t\t}\r\n\r\n\t\tlet prefix = 0\r\n\r\n\t\twhile (prefix < previous.length && prefix < fullContent.length && previous[prefix] === fullContent[prefix]) {\r\n\t\t\tprefix++\r\n\t\t}\r\n\r\n\t\tlet suffix = 0\r\n\r\n\t\twhile (\r\n\t\t\tsuffix < previous.length - prefix &&\r\n\t\t\tsuffix < fullContent.length - prefix &&\r\n\t\t\tprevious[previous.length - 1 - suffix] === fullContent[fullContent.length - 1 - suffix]\r\n\t\t) {\r\n\t\t\tsuffix++\r\n\t\t}\r\n\r\n\t\tconst isPureInsertion = fullContent.length >= previous.length && prefix + suffix >= previous.length\r\n\r\n\t\tif (isPureInsertion) {\r\n\t\t\treturn fullContent.slice(prefix, fullContent.length - suffix)\r\n\t\t}\r\n\r\n\t\treturn fullContent\r\n\t}\r\n\r\n\t/**\r\n\t * Check if this is a streaming partial message with no new content.\r\n\t */\r\n\tprivate isEmptyStreamingDelta(content: string | null): boolean {\r\n\t\treturn this.mode === \"stream-json\" && content === null\r\n\t}\r\n\r\n\tprivate computeCommandOutputDelta(commandId: number, fullOutput: string | undefined): string | null {\r\n\t\tconst normalized = fullOutput ?? \"\"\r\n\t\tconst previous = this.previousCommandOutputByToolUseId.get(commandId) || \"\"\r\n\r\n\t\tif (normalized === previous) {\r\n\t\t\treturn null\r\n\t\t}\r\n\r\n\t\tthis.previousCommandOutputByToolUseId.set(commandId, normalized)\r\n\t\treturn normalized.startsWith(previous) ? normalized.slice(previous.length) : normalized\r\n\t}\r\n\r\n\tprivate emitCommandOutputEvent(\r\n\t\tcommandId: number,\r\n\t\tfullOutput: string | undefined,\r\n\t\tisDone: boolean,\r\n\t\texitCode?: number,\r\n\t): void {\r\n\t\tif (this.mode === \"stream-json\") {\r\n\t\t\tconst outputDelta = this.computeCommandOutputDelta(commandId, fullOutput)\r\n\t\t\tconst event: JsonEvent = {\r\n\t\t\t\ttype: \"tool_result\",\r\n\t\t\t\tid: commandId,\r\n\t\t\t\tsubtype: \"command\",\r\n\t\t\t\ttool_result: { name: \"execute_command\" },\r\n\t\t\t}\r\n\r\n\t\t\tif (outputDelta !== null && outputDelta.length > 0) {\r\n\t\t\t\tevent.tool_result = { name: \"execute_command\", output: outputDelta }\r\n\t\t\t}\r\n\r\n\t\t\tif (isDone && exitCode !== undefined) {\r\n\t\t\t\tevent.tool_result = {\r\n\t\t\t\t\t...(event.tool_result ?? { name: \"execute_command\" }),\r\n\t\t\t\t\texitCode,\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (isDone) {\r\n\t\t\t\tevent.done = true\r\n\t\t\t\tthis.clearPendingCommandCompletion(commandId)\r\n\t\t\t\tthis.previousCommandOutputByToolUseId.delete(commandId)\r\n\t\t\t\tthis.statusDrivenCommandOutputIds.delete(commandId)\r\n\t\t\t\tthis.completedCommandOutputIds.add(commandId)\r\n\t\t\t\tif (this.activeCommandToolUseId === commandId) {\r\n\t\t\t\t\tthis.activeCommandToolUseId = undefined\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Suppress empty partial updates that carry no delta.\r\n\t\t\tif (!isDone && outputDelta === null) {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\tthis.emitEvent(event)\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tthis.emitEvent({\r\n\t\t\ttype: \"tool_result\",\r\n\t\t\tid: commandId,\r\n\t\t\tsubtype: \"command\",\r\n\t\t\ttool_result: {\r\n\t\t\t\tname: \"execute_command\",\r\n\t\t\t\toutput: fullOutput,\r\n\t\t\t\t...(isDone && exitCode !== undefined ? { exitCode } : {}),\r\n\t\t\t},\r\n\t\t\t...(isDone ? { done: true } : {}),\r\n\t\t})\r\n\r\n\t\tif (isDone) {\r\n\t\t\tthis.clearPendingCommandCompletion(commandId)\r\n\t\t\tthis.previousCommandOutputByToolUseId.delete(commandId)\r\n\t\t\tthis.statusDrivenCommandOutputIds.delete(commandId)\r\n\t\t\tthis.completedCommandOutputIds.add(commandId)\r\n\t\t\tif (this.activeCommandToolUseId === commandId) {\r\n\t\t\t\tthis.activeCommandToolUseId = undefined\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tpublic emitCommandOutputChunk(outputSnapshot: string): void {\r\n\t\tconst commandId = this.activeCommandToolUseId\r\n\t\tif (commandId === undefined) {\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tthis.statusDrivenCommandOutputIds.add(commandId)\r\n\t\tthis.emitCommandOutputEvent(commandId, outputSnapshot, false)\r\n\t}\r\n\r\n\tpublic markCommandOutputExited(exitCode?: number): void {\r\n\t\tconst commandId = this.activeCommandToolUseId\r\n\t\tif (commandId === undefined) {\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tthis.statusDrivenCommandOutputIds.add(commandId)\r\n\t\tthis.clearPendingCommandCompletion(commandId)\r\n\r\n\t\tconst timer = setTimeout(() => {\r\n\t\t\t// Fallback close if final say:command_output never arrives.\r\n\t\t\tif (!this.pendingCommandCompletionByToolUseId.has(commandId)) {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\t\t\tthis.pendingCommandCompletionByToolUseId.delete(commandId)\r\n\t\t\tthis.emitCommandOutputEvent(commandId, undefined, true, exitCode)\r\n\t\t}, COMMAND_OUTPUT_EXIT_GRACE_MS)\r\n\t\ttimer.unref?.()\r\n\r\n\t\tthis.pendingCommandCompletionByToolUseId.set(commandId, { exitCode, timer })\r\n\t}\r\n\r\n\tpublic emitCommandOutputDone(exitCode?: number): void {\r\n\t\tconst commandId = this.activeCommandToolUseId\r\n\t\tif (commandId === undefined) {\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tthis.statusDrivenCommandOutputIds.add(commandId)\r\n\t\tthis.emitCommandOutputEvent(commandId, undefined, true, exitCode)\r\n\t}\r\n\r\n\tprivate clearPendingCommandCompletion(commandId: number): void {\r\n\t\tconst pending = this.pendingCommandCompletionByToolUseId.get(commandId)\r\n\t\tif (!pending) {\r\n\t\t\treturn\r\n\t\t}\r\n\t\tclearTimeout(pending.timer)\r\n\t\tthis.pendingCommandCompletionByToolUseId.delete(commandId)\r\n\t}\r\n\r\n\t/**\r\n\t * Get content to send for a message (delta for streaming, full for json mode).\r\n\t */\r\n\tprivate getContentToSend(msgId: number, text: string | undefined, isPartial: boolean): string | null {\r\n\t\tif (this.mode === \"stream-json\" && isPartial) {\r\n\t\t\treturn this.computeDelta(msgId, text)\r\n\t\t}\r\n\r\n\t\treturn text ?? null\r\n\t}\r\n\r\n\t/**\r\n\t * Build a base event with optional done flag.\r\n\t */\r\n\tprivate buildTextEvent(\r\n\t\ttype: \"assistant\" | \"thinking\" | \"user\",\r\n\t\tid: number,\r\n\t\tcontent: string | null,\r\n\t\tisDone: boolean,\r\n\t\tsubtype?: string,\r\n\t): JsonEvent {\r\n\t\tconst event: JsonEvent = { type, id }\r\n\r\n\t\tif (content !== null) {\r\n\t\t\tevent.content = content\r\n\t\t}\r\n\r\n\t\tif (subtype) {\r\n\t\t\tevent.subtype = subtype\r\n\t\t}\r\n\r\n\t\tif (isDone) {\r\n\t\t\tevent.done = true\r\n\t\t}\r\n\r\n\t\treturn event\r\n\t}\r\n\r\n\t/**\r\n\t * Handle a ClineMessage and emit the appropriate JSON event.\r\n\t */\r\n\tprivate handleMessage(msg: ClineMessage, _isUpdate: boolean): void {\r\n\t\tconst isDone = !msg.partial\r\n\r\n\t\t// In json mode, only emit complete (non-partial) messages\r\n\t\tif (this.mode === \"json\" && msg.partial) {\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\t// Skip duplicate complete messages\r\n\t\tif (isDone && this.seenMessageIds.has(msg.ts)) {\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tif (isDone) {\r\n\t\t\tthis.seenMessageIds.add(msg.ts)\r\n\t\t\tthis.previousContent.delete(msg.ts)\r\n\t\t\tthis.previousToolUseContent.delete(msg.ts)\r\n\t\t}\r\n\r\n\t\tif (msg.type === \"say\" && msg.say) {\r\n\t\t\tconst contentToSend = this.getContentToSend(msg.ts, msg.text, msg.partial ?? false)\r\n\r\n\t\t\t// Skip if no new content for streaming partial messages\r\n\t\t\tif (msg.partial && this.isEmptyStreamingDelta(contentToSend)) {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\tthis.handleSayMessage(msg, contentToSend, isDone)\r\n\t\t}\r\n\r\n\t\tif (msg.type === \"ask\" && msg.ask) {\r\n\t\t\tthis.handleAskMessage(msg, isDone)\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handle \"say\" type messages.\r\n\t */\r\n\tprivate handleSayMessage(msg: ClineMessage, contentToSend: string | null, isDone: boolean): void {\r\n\t\tswitch (msg.say) {\r\n\t\t\tcase \"text\":\r\n\t\t\t\tif (this.expectPromptEchoAsUser) {\r\n\t\t\t\t\tthis.emitEvent(this.buildTextEvent(\"user\", msg.ts, contentToSend, isDone))\r\n\t\t\t\t\tif (isDone) {\r\n\t\t\t\t\t\tthis.expectPromptEchoAsUser = false\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.emitEvent(this.buildTextEvent(\"assistant\", msg.ts, contentToSend, isDone))\r\n\t\t\t\t\tif (msg.text) {\r\n\t\t\t\t\t\tthis.lastAssistantText = msg.text\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tbreak\r\n\r\n\t\t\tcase \"reasoning\":\r\n\t\t\t\tthis.handleReasoningMessage(msg, isDone)\r\n\t\t\t\tbreak\r\n\r\n\t\t\tcase \"error\":\r\n\t\t\t\tthis.emitEvent({ type: \"error\", id: msg.ts, content: contentToSend ?? undefined })\r\n\t\t\t\tbreak\r\n\r\n\t\t\tcase \"command_output\":\r\n\t\t\t\tthis.handleCommandOutputMessage(msg, isDone)\r\n\t\t\t\tbreak\r\n\r\n\t\t\tcase \"user_feedback\":\r\n\t\t\tcase \"user_feedback_diff\":\r\n\t\t\t\tthis.emitEvent(this.buildTextEvent(\"user\", msg.ts, contentToSend, isDone))\r\n\t\t\t\tif (isDone) {\r\n\t\t\t\t\tthis.expectPromptEchoAsUser = false\r\n\t\t\t\t}\r\n\t\t\t\tbreak\r\n\r\n\t\t\tcase \"api_req_started\": {\r\n\t\t\t\tconst cost = parseApiReqCost(msg.text)\r\n\t\t\t\tif (cost) {\r\n\t\t\t\t\tthis.lastCost = cost\r\n\t\t\t\t}\r\n\t\t\t\tbreak\r\n\t\t\t}\r\n\r\n\t\t\tcase \"mcp_server_response\":\r\n\t\t\t\tthis.emitEvent({\r\n\t\t\t\t\ttype: \"tool_result\",\r\n\t\t\t\t\tsubtype: \"mcp\",\r\n\t\t\t\t\ttool_result: { name: \"mcp_server\", output: msg.text },\r\n\t\t\t\t})\r\n\t\t\t\tbreak\r\n\r\n\t\t\tcase \"completion_result\":\r\n\t\t\t\tif (msg.text && !msg.partial) {\r\n\t\t\t\t\tthis.completionResultContent = msg.text\r\n\t\t\t\t}\r\n\t\t\t\tbreak\r\n\r\n\t\t\tdefault:\r\n\t\t\t\tif (SKIP_SAY_TYPES.has(msg.say!)) {\r\n\t\t\t\t\tbreak\r\n\t\t\t\t}\r\n\t\t\t\tif (msg.text) {\r\n\t\t\t\t\tthis.emitEvent(this.buildTextEvent(\"assistant\", msg.ts, contentToSend, isDone, msg.say))\r\n\t\t\t\t}\r\n\t\t\t\tbreak\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handle reasoning/thinking messages with separate delta tracking.\r\n\t */\r\n\tprivate handleReasoningMessage(msg: ClineMessage, isDone: boolean): void {\r\n\t\tconst reasoningContent = msg.reasoning || msg.text\r\n\t\tconst reasoningKey = msg.ts + REASONING_KEY_OFFSET\r\n\t\tconst reasoningDelta = this.getContentToSend(reasoningKey, reasoningContent, msg.partial ?? false)\r\n\r\n\t\tif (msg.partial && this.isEmptyStreamingDelta(reasoningDelta)) {\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tif (!msg.partial) {\r\n\t\t\tthis.previousContent.delete(reasoningKey)\r\n\t\t}\r\n\r\n\t\tthis.emitEvent(this.buildTextEvent(\"thinking\", msg.ts, reasoningDelta, isDone))\r\n\t}\r\n\r\n\t/**\r\n\t * Handle \"ask\" type messages.\r\n\t */\r\n\tprivate handleAskMessage(msg: ClineMessage, isDone: boolean): void {\r\n\t\tswitch (msg.ask) {\r\n\t\t\tcase \"tool\":\r\n\t\t\t\tthis.handleToolUseAsk(msg, \"tool\", isDone)\r\n\t\t\t\tbreak\r\n\r\n\t\t\tcase \"command\":\r\n\t\t\t\tthis.handleToolUseAsk(msg, \"command\", isDone)\r\n\t\t\t\tbreak\r\n\r\n\t\t\tcase \"use_mcp_server\":\r\n\t\t\t\tthis.handleToolUseAsk(msg, \"mcp\", isDone)\r\n\t\t\t\tbreak\r\n\r\n\t\t\tcase \"followup\": {\r\n\t\t\t\tconst contentToSend = this.getContentToSend(msg.ts, msg.text, msg.partial ?? false)\r\n\r\n\t\t\t\t// Skip if no new content for streaming partial messages\r\n\t\t\t\tif (msg.partial && this.isEmptyStreamingDelta(contentToSend)) {\r\n\t\t\t\t\treturn\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.emitEvent(this.buildTextEvent(\"assistant\", msg.ts, contentToSend, isDone, \"followup\"))\r\n\t\t\t\tbreak\r\n\t\t\t}\r\n\r\n\t\t\tcase \"command_output\":\r\n\t\t\t\t// Handled in say type\r\n\t\t\t\tbreak\r\n\r\n\t\t\tcase \"completion_result\":\r\n\t\t\t\tif (msg.text && !msg.partial) {\r\n\t\t\t\t\tthis.completionResultContent = msg.text\r\n\t\t\t\t}\r\n\t\t\t\tbreak\r\n\r\n\t\t\tdefault:\r\n\t\t\t\tif (msg.text) {\r\n\t\t\t\t\tconst contentToSend = this.getContentToSend(msg.ts, msg.text, msg.partial ?? false)\r\n\r\n\t\t\t\t\t// Skip if no new content for streaming partial messages\r\n\t\t\t\t\tif (msg.partial && this.isEmptyStreamingDelta(contentToSend)) {\r\n\t\t\t\t\t\treturn\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tthis.emitEvent(this.buildTextEvent(\"assistant\", msg.ts, contentToSend, isDone, msg.ask))\r\n\t\t\t\t}\r\n\t\t\t\tbreak\r\n\t\t}\r\n\t}\r\n\r\n\tprivate handleToolUseAsk(msg: ClineMessage, subtype: \"tool\" | \"command\" | \"mcp\", isDone: boolean): void {\r\n\t\tconst isStreamingPartial = this.mode === \"stream-json\" && msg.partial === true\r\n\t\tconst toolInfo = parseToolInfo(msg.text)\r\n\r\n\t\tif (subtype === \"command\") {\r\n\t\t\tif (this.activeCommandToolUseId !== undefined && this.activeCommandToolUseId !== msg.ts) {\r\n\t\t\t\tconst previousCommandId = this.activeCommandToolUseId\r\n\t\t\t\tconst pending = this.pendingCommandCompletionByToolUseId.get(previousCommandId)\r\n\t\t\t\tif (pending) {\r\n\t\t\t\t\tclearTimeout(pending.timer)\r\n\t\t\t\t\tthis.pendingCommandCompletionByToolUseId.delete(previousCommandId)\r\n\t\t\t\t\tthis.emitCommandOutputEvent(previousCommandId, undefined, true, pending.exitCode)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.activeCommandToolUseId = msg.ts\r\n\t\t\tthis.completedCommandOutputIds.delete(msg.ts)\r\n\t\t\tthis.clearPendingCommandCompletion(msg.ts)\r\n\r\n\t\t\tif (isStreamingPartial) {\r\n\t\t\t\tconst commandDelta = this.computeStructuredDelta(msg.ts, msg.text)\r\n\t\t\t\tif (commandDelta === null) {\r\n\t\t\t\t\treturn\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.emitEvent({\r\n\t\t\t\t\ttype: \"tool_use\",\r\n\t\t\t\t\tid: msg.ts,\r\n\t\t\t\t\tsubtype: \"command\",\r\n\t\t\t\t\tcontent: commandDelta,\r\n\t\t\t\t\ttool_use: { name: \"execute_command\", input: { command: commandDelta } },\r\n\t\t\t\t})\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\tthis.emitEvent({\r\n\t\t\t\ttype: \"tool_use\",\r\n\t\t\t\tid: msg.ts,\r\n\t\t\t\tsubtype: \"command\",\r\n\t\t\t\ttool_use: { name: \"execute_command\", input: { command: msg.text } },\r\n\t\t\t\t...(isDone ? { done: true } : {}),\r\n\t\t\t})\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tif (subtype === \"mcp\") {\r\n\t\t\tif (isStreamingPartial) {\r\n\t\t\t\tconst mcpDelta = this.computeStructuredDelta(msg.ts, msg.text)\r\n\t\t\t\tif (mcpDelta === null) {\r\n\t\t\t\t\treturn\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.emitEvent({\r\n\t\t\t\t\ttype: \"tool_use\",\r\n\t\t\t\t\tid: msg.ts,\r\n\t\t\t\t\tsubtype: \"mcp\",\r\n\t\t\t\t\tcontent: mcpDelta,\r\n\t\t\t\t\ttool_use: { name: \"mcp_server\" },\r\n\t\t\t\t})\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\tthis.emitEvent({\r\n\t\t\t\ttype: \"tool_use\",\r\n\t\t\t\tid: msg.ts,\r\n\t\t\t\tsubtype: \"mcp\",\r\n\t\t\t\ttool_use: { name: \"mcp_server\", input: { raw: msg.text } },\r\n\t\t\t\t...(isDone ? { done: true } : {}),\r\n\t\t\t})\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tif (isStreamingPartial) {\r\n\t\t\tconst toolDelta = this.computeStructuredDelta(msg.ts, msg.text)\r\n\t\t\tif (toolDelta === null) {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\tthis.emitEvent({\r\n\t\t\t\ttype: \"tool_use\",\r\n\t\t\t\tid: msg.ts,\r\n\t\t\t\tsubtype: \"tool\",\r\n\t\t\t\tcontent: toolDelta,\r\n\t\t\t\ttool_use: { name: toolInfo?.name ?? \"unknown_tool\" },\r\n\t\t\t})\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tthis.emitEvent({\r\n\t\t\ttype: \"tool_use\",\r\n\t\t\tid: msg.ts,\r\n\t\t\tsubtype: \"tool\",\r\n\t\t\ttool_use: toolInfo ?? { name: \"unknown_tool\", input: { raw: msg.text } },\r\n\t\t\t...(isDone ? { done: true } : {}),\r\n\t\t})\r\n\t}\r\n\r\n\tprivate handleCommandOutputMessage(msg: ClineMessage, isDone: boolean): void {\r\n\t\tconst commandId = this.activeCommandToolUseId ?? msg.ts\r\n\t\tif (this.completedCommandOutputIds.has(commandId)) {\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tconst pending = this.pendingCommandCompletionByToolUseId.get(commandId)\r\n\t\tif (pending) {\r\n\t\t\tif (!isDone) {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\t\t\tclearTimeout(pending.timer)\r\n\t\t\tthis.pendingCommandCompletionByToolUseId.delete(commandId)\r\n\t\t\tthis.emitCommandOutputEvent(commandId, msg.text, true, pending.exitCode)\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tif (this.statusDrivenCommandOutputIds.has(commandId)) {\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tthis.emitCommandOutputEvent(commandId, msg.text, isDone)\r\n\t}\r\n\r\n\t/**\r\n\t * Handle task completion and emit result event.\r\n\t */\r\n\tprivate handleTaskCompleted(event: TaskCompletedEvent): void {\r\n\t\t// Prefer the completion payload from the current event. If it is empty,\r\n\t\t// fall back to the most recent tracked completion text, then assistant text.\r\n\t\tconst resultContent = event.message?.text || this.completionResultContent || this.lastAssistantText\r\n\r\n\t\tthis.emitEvent({\r\n\t\t\ttype: \"result\",\r\n\t\t\tid: event.message?.ts ?? Date.now(),\r\n\t\t\tcontent: resultContent,\r\n\t\t\tdone: true,\r\n\t\t\tsuccess: event.success,\r\n\t\t\tcost: this.lastCost,\r\n\t\t})\r\n\r\n\t\t// Prevent stale completion content from leaking into later turns.\r\n\t\tthis.completionResultContent = undefined\r\n\t\tthis.lastAssistantText = undefined\r\n\r\n\t\t// For \"json\" mode, output the final accumulated result\r\n\t\tif (this.mode === \"json\") {\r\n\t\t\tthis.outputFinalResult(event.success, resultContent)\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handle errors and emit error event.\r\n\t */\r\n\tprivate handleError(error: Error): void {\r\n\t\tthis.emitEvent({\r\n\t\t\ttype: \"error\",\r\n\t\t\tid: Date.now(),\r\n\t\t\tcontent: error.message,\r\n\t\t})\r\n\t}\r\n\r\n\t/**\r\n\t * Emit a JSON event.\r\n\t * For stream-json mode: immediately output to stdout\r\n\t * For json mode: accumulate for final output\r\n\t */\r\n\tprivate emitEvent(event: JsonEvent): void {\r\n\t\tconst requestId = event.requestId ?? this.requestIdProvider()\r\n\t\tconst payload = requestId ? { ...event, requestId } : event\r\n\r\n\t\tthis.events.push(payload)\r\n\r\n\t\tif (this.mode === \"stream-json\") {\r\n\t\t\tthis.outputLine(payload)\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Output a single JSON line (NDJSON format).\r\n\t */\r\n\tprivate outputLine(data: unknown): void {\r\n\t\tthis.writeToStdout(JSON.stringify(data) + \"\\n\")\r\n\t}\r\n\r\n\t/**\r\n\t * Output the final accumulated result (for \"json\" mode).\r\n\t */\r\n\tprivate outputFinalResult(success: boolean, content?: string): void {\r\n\t\tconst output: JsonFinalOutput = {\r\n\t\t\ttype: \"result\",\r\n\t\t\tsuccess,\r\n\t\t\tcontent,\r\n\t\t\tcost: this.lastCost,\r\n\t\t\tevents: this.events.filter((e) => e.type !== \"result\"), // Exclude the result event itself\r\n\t\t}\r\n\r\n\t\tthis.writeToStdout(JSON.stringify(output, null, 2) + \"\\n\")\r\n\t}\r\n\r\n\tprivate writeToStdout(content: string): void {\r\n\t\tconst writePromise = new Promise<void>((resolve, reject) => {\r\n\t\t\tthis.stdout.write(content, (error?: Error | null) => {\r\n\t\t\t\tif (error) {\r\n\t\t\t\t\treject(error)\r\n\t\t\t\t\treturn\r\n\t\t\t\t}\r\n\t\t\t\tresolve()\r\n\t\t\t})\r\n\t\t})\r\n\r\n\t\tthis.pendingWrites.add(writePromise)\r\n\r\n\t\tvoid writePromise.finally(() => {\r\n\t\t\tthis.pendingWrites.delete(writePromise)\r\n\t\t})\r\n\t}\r\n\r\n\tasync flush(): Promise<void> {\r\n\t\twhile (this.pendingWrites.size > 0) {\r\n\t\t\tawait Promise.all([...this.pendingWrites])\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Get accumulated events (for testing or external use).\r\n\t */\r\n\tgetEvents(): JsonEvent[] {\r\n\t\treturn [...this.events]\r\n\t}\r\n\r\n\t/**\r\n\t * Clear accumulated events and state.\r\n\t */\r\n\tclear(): void {\r\n\t\tthis.events = []\r\n\t\tthis.lastCost = undefined\r\n\t\tthis.seenMessageIds.clear()\r\n\t\tthis.previousContent.clear()\r\n\t\tthis.previousToolUseContent.clear()\r\n\t\tthis.activeCommandToolUseId = undefined\r\n\t\tthis.previousCommandOutputByToolUseId.clear()\r\n\t\tthis.statusDrivenCommandOutputIds.clear()\r\n\t\tthis.completedCommandOutputIds.clear()\r\n\t\tfor (const pending of this.pendingCommandCompletionByToolUseId.values()) {\r\n\t\t\tclearTimeout(pending.timer)\r\n\t\t}\r\n\t\tthis.pendingCommandCompletionByToolUseId.clear()\r\n\t\tthis.completionResultContent = undefined\r\n\t\tthis.lastAssistantText = undefined\r\n\t\tthis.expectPromptEchoAsUser = true\r\n\t}\r\n}\r\n","export * from \"./config-dir.js\"\nexport * from \"./settings.js\"\nexport * from \"./ephemeral.js\"\n","import fs from \"fs/promises\"\r\nimport path from \"path\"\r\n\r\nimport type { CliSettings } from \"../../types/index.js\"\r\n\r\nimport { getConfigDir } from \"./index.js\"\r\n\r\nexport function getSettingsPath(): string {\r\n\treturn path.join(getConfigDir(), \"cli-settings.json\")\r\n}\r\n\r\nexport async function loadSettings(): Promise<CliSettings> {\r\n\ttry {\r\n\t\tconst settingsPath = getSettingsPath()\r\n\t\tconst data = await fs.readFile(settingsPath, \"utf-8\")\r\n\t\treturn JSON.parse(data) as CliSettings\r\n\t} catch (error) {\r\n\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\r\n\t\t\treturn {}\r\n\t\t}\r\n\r\n\t\tthrow error\r\n\t}\r\n}\r\n\r\nexport async function saveSettings(settings: Partial<CliSettings>): Promise<void> {\r\n\tconst configDir = getConfigDir()\r\n\tawait fs.mkdir(configDir, { recursive: true })\r\n\r\n\tconst existing = await loadSettings()\r\n\tconst merged = { ...existing, ...settings }\r\n\r\n\tawait fs.writeFile(getSettingsPath(), JSON.stringify(merged, null, 2), {\r\n\t\tmode: 0o600,\r\n\t})\r\n}\r\n\r\nexport async function resetOnboarding(): Promise<void> {\r\n\tawait saveSettings({ onboardingProviderChoice: undefined })\r\n}\r\n","import path from \"path\"\nimport os from \"os\"\nimport fs from \"fs\"\n\nexport async function createEphemeralStorageDir(): Promise<string> {\n\tconst uniqueId = `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`\n\tconst tmpDir = path.join(os.tmpdir(), `roo-cli-${uniqueId}`)\n\tawait fs.promises.mkdir(tmpDir, { recursive: true })\n\treturn tmpDir\n}\n","import os from \"os\"\nimport path from \"path\"\n\nimport { readTaskSessionsFromStoragePath, type TaskSessionEntry } from \"@roo-code/core/task-history\"\n\nimport { arePathsEqual } from \"@roo-code/core/utils\"\n\nconst DEFAULT_CLI_TASK_STORAGE_PATH = path.join(os.homedir(), \".vscode-mock\", \"global-storage\")\n\nexport function getDefaultCliTaskStoragePath(): string {\n\treturn DEFAULT_CLI_TASK_STORAGE_PATH\n}\n\nexport function filterSessionsForWorkspace(sessions: TaskSessionEntry[], workspacePath: string): TaskSessionEntry[] {\n\treturn sessions\n\t\t.filter((session) => typeof session.workspace === \"string\" && arePathsEqual(session.workspace, workspacePath))\n\t\t.sort((a, b) => b.ts - a.ts)\n}\n\nexport async function readWorkspaceTaskSessions(\n\tworkspacePath: string,\n\tstoragePath = DEFAULT_CLI_TASK_STORAGE_PATH,\n): Promise<TaskSessionEntry[]> {\n\tconst sessions = await readTaskSessionsFromStoragePath(storagePath)\n\treturn filterSessionsForWorkspace(sessions, workspacePath)\n}\n\nexport function resolveWorkspaceResumeSessionId(sessions: TaskSessionEntry[], requestedSessionId?: string): string {\n\tif (requestedSessionId) {\n\t\tconst hasRequestedSession = sessions.some((session) => session.id === requestedSessionId)\n\t\tif (!hasRequestedSession) {\n\t\t\tthrow new Error(`Session not found in current workspace: ${requestedSessionId}`)\n\t\t}\n\n\t\treturn requestedSessionId\n\t}\n\n\tconst mostRecentSessionId = sessions[0]?.id\n\tif (!mostRecentSessionId) {\n\t\tthrow new Error(\"No previous tasks found to continue in this workspace.\")\n\t}\n\n\treturn mostRecentSessionId\n}\n","import { RooCodeSettings } from \"../../types\"\r\n\r\nimport type { SupportedProvider } from \"../../types/index.js\"\r\n\r\nconst envVarMap: Record<SupportedProvider, string> = {\r\n\tanthropic: \"ANTHROPIC_API_KEY\",\r\n\t\"openai-native\": \"OPENAI_API_KEY\",\r\n\topenai: \"OPENAI_API_KEY\",\r\n\tgemini: \"GOOGLE_API_KEY\",\r\n\topenrouter: \"OPENROUTER_API_KEY\",\r\n\t\"vercel-ai-gateway\": \"VERCEL_AI_GATEWAY_API_KEY\",\r\n}\r\n\r\nexport function getEnvVarName(provider: SupportedProvider): string {\r\n\treturn envVarMap[provider]\r\n}\r\n\r\nexport function getApiKeyFromEnv(provider: SupportedProvider): string | undefined {\r\n\tconst envVar = getEnvVarName(provider)\r\n\treturn process.env[envVar]\r\n}\r\n\r\nexport function getProviderSettings(\r\n\tprovider: SupportedProvider,\r\n\tapiKey: string | undefined,\r\n\tmodel: string | undefined,\r\n\tbaseUrl?: string,\r\n): RooCodeSettings {\r\n\tconst config: RooCodeSettings = { apiProvider: provider }\r\n\r\n\tswitch (provider) {\r\n\t\tcase \"anthropic\":\r\n\t\t\tif (apiKey) config.apiKey = apiKey\r\n\t\t\tif (model) config.apiModelId = model\r\n\t\t\tbreak\r\n\t\tcase \"openai-native\":\r\n\t\t\tif (apiKey) config.openAiNativeApiKey = apiKey\r\n\t\t\tif (model) config.apiModelId = model\r\n\t\t\tif (baseUrl) {\r\n\t\t\t\tconfig.openAiNativeBaseUrl = baseUrl\r\n\t\t\t\t// Also set openAiBaseUrl for compatibility with OpenAI-style client\r\n\t\t\t\tconfig.openAiBaseUrl = baseUrl\r\n\t\t\t}\r\n\t\t\tbreak\r\n\t\tcase \"openai\":\r\n\t\t\tif (apiKey) config.openAiApiKey = apiKey\r\n\t\t\tif (model) config.apiModelId = model\r\n\t\t\tif (baseUrl) config.openAiBaseUrl = baseUrl\r\n\t\t\tbreak\r\n\t\tcase \"gemini\":\r\n\t\t\tif (apiKey) config.geminiApiKey = apiKey\r\n\t\t\tif (model) config.apiModelId = model\r\n\t\t\tbreak\r\n\t\tcase \"openrouter\":\r\n\t\t\tif (apiKey) config.openRouterApiKey = apiKey\r\n\t\t\tif (model) config.openRouterModelId = model\r\n\t\t\tbreak\r\n\t\tcase \"vercel-ai-gateway\":\r\n\t\t\tif (apiKey) config.vercelAiGatewayApiKey = apiKey\r\n\t\t\tif (model) config.vercelAiGatewayModelId = model\r\n\t\t\tbreak\r\n\t}\r\n\r\n\treturn config\r\n}\r\n","import fs from \"fs/promises\"\nimport { constants as fsConstants } from \"fs\"\nimport path from \"path\"\n\nexport type TerminalShellValidationResult =\n\t| {\n\t\t\tvalid: true\n\t\t\tshellPath: string\n\t }\n\t| {\n\t\t\tvalid: false\n\t\t\treason: string\n\t }\n\nexport async function validateTerminalShellPath(rawShellPath: string): Promise<TerminalShellValidationResult> {\n\tconst shellPath = rawShellPath.trim()\n\n\tif (!shellPath) {\n\t\treturn { valid: false, reason: \"shell path cannot be empty\" }\n\t}\n\n\tif (!path.isAbsolute(shellPath)) {\n\t\treturn { valid: false, reason: \"shell path must be absolute\" }\n\t}\n\n\ttry {\n\t\tconst stats = await fs.stat(shellPath)\n\n\t\tif (!stats.isFile()) {\n\t\t\treturn { valid: false, reason: \"shell path must point to a file\" }\n\t\t}\n\n\t\tif (process.platform !== \"win32\") {\n\t\t\tawait fs.access(shellPath, fsConstants.X_OK)\n\t\t}\n\t} catch {\n\t\treturn {\n\t\t\tvalid: false,\n\t\t\treason:\n\t\t\t\tprocess.platform === \"win32\"\n\t\t\t\t\t? \"shell path does not exist or is not a file\"\n\t\t\t\t\t: \"shell path does not exist, is not a file, or is not executable\",\n\t\t}\n\t}\n\n\treturn { valid: true, shellPath }\n}\n","import path from \"path\"\nimport fs from \"fs\"\n\n/**\n * Get the default path to the extension bundle.\n * This assumes the CLI is installed alongside the built extension.\n *\n * @param dirname - The __dirname equivalent for the calling module\n */\nexport function getDefaultExtensionPath(dirname: string): string {\n\t// Check for environment variable first (set by install script)\n\tif (process.env.ROO_EXTENSION_PATH) {\n\t\tconst envPath = process.env.ROO_EXTENSION_PATH\n\n\t\tif (fs.existsSync(path.join(envPath, \"extension.js\"))) {\n\t\t\treturn envPath\n\t\t}\n\t}\n\n\t// Find the CLI package root (apps/cli) by walking up to the nearest package.json.\n\t// This works whether called from dist/ (bundled) or src/commands/cli/ (tsx dev).\n\tlet packageRoot = dirname\n\n\twhile (packageRoot !== path.dirname(packageRoot)) {\n\t\tif (fs.existsSync(path.join(packageRoot, \"package.json\"))) {\n\t\t\tbreak\n\t\t}\n\n\t\tpackageRoot = path.dirname(packageRoot)\n\t}\n\n// Check for bundled extension in dist/ (tsup built output)\n\tconst distPath = path.join(packageRoot, \"dist\")\n\tif (fs.existsSync(path.join(distPath, \"extension.js\"))) {\n\t\treturn distPath\n\t}\n\n\t// The extension is at src/dist relative to the project root (single-package structure)\n\t// Also supports monorepo structure (../../src/dist relative to apps/cli)\n\tconst singlePackagePath = path.join(packageRoot, \"src/dist\")\n\tconst monorepoPath = path.resolve(packageRoot, \"../../src/dist\")\n\n\t// Check single-package structure next (project root /src/dist)\n\tif (fs.existsSync(path.join(singlePackagePath, \"extension.js\"))) {\n\t\treturn singlePackagePath\n\t}\n\n\t// Fallback to monorepo structure\n\tif (fs.existsSync(path.join(monorepoPath, \"extension.js\"))) {\n\t\treturn monorepoPath\n\t}\n\n\t// Fallback: when installed via curl script, extension is at apps/cli/extension\n\tconst packagePath = path.resolve(packageRoot, \"extension\")\n\treturn packagePath\n}\n","const SESSION_ID_UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i\n\nexport function isValidSessionId(value: string): boolean {\n\treturn SESSION_ID_UUID_PATTERN.test(value)\n}\n","/**\r\n * ExtensionHost - Loads and runs the Roo Code extension in CLI mode\r\n *\r\n * This class is a thin coordination layer responsible for:\r\n * 1. Creating the vscode-shim mock\r\n * 2. Loading the extension bundle via require()\r\n * 3. Activating the extension\r\n * 4. Wiring up managers for output, prompting, and ask handling\r\n */\r\n\r\nimport { createRequire } from \"module\"\nimport path from \"path\"\nimport { fileURLToPath, pathToFileURL } from \"url\"\nimport fs from \"fs\"\r\nimport { EventEmitter } from \"events\"\r\n\r\nimport pWaitFor from \"p-wait-for\"\r\n\r\nimport type {\r\n\tClineMessage,\r\n\tExtensionMessage,\r\n\tReasoningEffortExtended,\r\n\tRooCodeSettings,\r\n\tWebviewMessage,\r\n} from \"../../types\"\r\nimport { createVSCodeAPI, IExtensionHost, ExtensionHostEventMap, setRuntimeConfigValues } from \"@roo-code/vscode-shim\"\r\nimport { DebugLogger, setDebugLogEnabled } from \"../../core/debug-log/index.js\"\r\n\r\nimport { DEFAULT_FLAGS, type SupportedProvider } from \"../types/index.js\"\r\nimport type { User } from \"../lib/sdk/index.js\"\r\nimport { getProviderSettings } from \"../lib/utils/provider.js\"\r\nimport { createEphemeralStorageDir } from \"../lib/storage/index.js\"\r\n\r\nimport type { WaitingForInputEvent, TaskCompletedEvent } from \"./events.js\"\r\nimport type { AgentStateInfo } from \"./agent-state.js\"\r\nimport { ExtensionClient } from \"./extension-client.js\"\r\nimport { OutputManager } from \"./output-manager.js\"\r\nimport { PromptManager } from \"./prompt-manager.js\"\r\nimport { AskDispatcher } from \"./ask-dispatcher.js\"\r\n\r\n// Pre-configured logger for CLI message activity debugging.\r\nconst cliLogger = new DebugLogger(\"CLI\")\r\n\r\n// Get the CLI package root directory (for finding node_modules/@vscode/ripgrep)\r\n// When running from a release tarball, ROO_CLI_ROOT is set by the wrapper script.\r\n// In development, we fall back to finding the CLI package root by walking up to package.json.\r\n// This works whether running from dist/ (bundled) or src/agent/ (tsx dev).\r\nconst __dirname = path.dirname(fileURLToPath(import.meta.url))\r\n\r\nfunction findCliPackageRoot(): string {\r\n\tlet dir = __dirname\r\n\r\n\twhile (dir !== path.dirname(dir)) {\r\n\t\tif (fs.existsSync(path.join(dir, \"package.json\"))) {\r\n\t\t\treturn dir\r\n\t\t}\r\n\r\n\t\tdir = path.dirname(dir)\r\n\t}\r\n\r\n\treturn path.resolve(__dirname, \"..\")\r\n}\r\n\r\nconst CLI_PACKAGE_ROOT = process.env.ROO_CLI_ROOT || findCliPackageRoot()\r\n\r\nexport interface ExtensionHostOptions {\n\tmode: string\n\treasoningEffort?: ReasoningEffortExtended | \"unspecified\" | \"disabled\"\n\tconsecutiveMistakeLimit?: number\n\tuser: User | null\n\tprovider: SupportedProvider\n\tapiKey?: string\n\topenAiBaseUrl?: string\n\tmodel: string\n\tworkspacePath: string\n\textensionPath: string\n\tnonInteractive?: boolean\n\t/**\n\t * When true, uses a temporary storage directory that is cleaned up on exit.\n\t */\n\tephemeral: boolean\n\tdebug: boolean\n\texitOnComplete: boolean\n\tterminalShell?: string\n\t/**\n\t * When true, exit the process on API request errors instead of retrying.\n\t */\n\texitOnError?: boolean\n\t/**\n\t * When true, completely disables all direct stdout/stderr output.\n\t * Use this when running in TUI mode where Ink controls the terminal.\n\t */\n\tdisableOutput?: boolean\n\t/**\n\t * When true, don't suppress node warnings and console output since we're\n\t * running in an integration test and we want to see the output.\n\t */\n\tintegrationTest?: boolean\n\t/**\n\t * When true, skip waiting for isReady and mark webview as ready immediately.\n\t * Use this for non-TUI (print) mode where there's no actual webview.\n\t */\n\tskipIsReadyWait?: boolean\n}\n\r\ninterface ExtensionModule {\r\n\tactivate: (context: unknown) => Promise<unknown>\r\n\tdeactivate?: () => Promise<void>\r\n}\r\n\r\ninterface WebviewViewProvider {\r\n\tresolveWebviewView?(webviewView: unknown, context: unknown, token: unknown): void | Promise<void>\r\n}\r\n\r\nexport interface ExtensionHostInterface extends IExtensionHost<ExtensionHostEventMap> {\r\n\tclient: ExtensionClient\r\n\tactivate(): Promise<void>\r\n\trunTask(prompt: string, taskId?: string, configuration?: RooCodeSettings, images?: string[]): Promise<void>\r\n\tresumeTask(taskId: string): Promise<void>\r\n\tsendToExtension(message: WebviewMessage): void\r\n\tdispose(): Promise<void>\r\n}\r\n\r\nexport class ExtensionHost extends EventEmitter implements ExtensionHostInterface {\r\n\t// Extension lifecycle.\r\n\tprivate vscode: ReturnType<typeof createVSCodeAPI> | null = null\r\n\tprivate extensionModule: ExtensionModule | null = null\r\n\tprivate extensionAPI: unknown = null\r\n\tprivate options: ExtensionHostOptions\r\n\tprivate isReady = false\r\n\tprivate messageListener: ((message: ExtensionMessage) => void) | null = null\r\n\tprivate initialSettings: RooCodeSettings\r\n\r\n\t// Console suppression.\r\n\tprivate originalConsole: {\r\n\t\tlog: typeof console.log\r\n\t\twarn: typeof console.warn\r\n\t\terror: typeof console.error\r\n\t\tdebug: typeof console.debug\r\n\t\tinfo: typeof console.info\r\n\t} | null = null\r\n\r\n\tprivate originalProcessEmitWarning: typeof process.emitWarning | null = null\r\n\r\n\t// Ephemeral storage.\r\n\tprivate ephemeralStorageDir: string | null = null\r\n\tprivate previousCliRuntimeEnv: string | undefined\r\n\r\n\t// ==========================================================================\r\n\t// Managers - These do all the heavy lifting\r\n\t// ==========================================================================\r\n\r\n\t/**\r\n\t * ExtensionClient: Single source of truth for agent loop state.\r\n\t * Handles message processing and state detection.\r\n\t */\r\n\tpublic readonly client: ExtensionClient\r\n\r\n\t/**\r\n\t * OutputManager: Handles all CLI output and streaming.\r\n\t * Uses Observable pattern internally for stream tracking.\r\n\t */\r\n\tprivate outputManager: OutputManager\r\n\r\n\t/**\r\n\t * PromptManager: Handles all user input collection.\r\n\t * Provides readline, yes/no, and timed prompts.\r\n\t */\r\n\tprivate promptManager: PromptManager\r\n\r\n\t/**\r\n\t * AskDispatcher: Routes asks to appropriate handlers.\r\n\t * Uses type guards (isIdleAsk, isInteractiveAsk, etc.) from client module.\r\n\t */\r\n\tprivate askDispatcher: AskDispatcher\r\n\r\n\t// ==========================================================================\r\n\t// Constructor\r\n\t// ==========================================================================\r\n\r\n\tconstructor(options: ExtensionHostOptions) {\r\n\t\tsuper()\r\n\r\n\t\tthis.options = options\r\n\t\t// Mark this process as CLI runtime so extension code can apply\r\n\t\t// CLI-specific behavior without affecting VS Code desktop usage.\r\n\t\tthis.previousCliRuntimeEnv = process.env.ROO_CLI_RUNTIME\r\n\t\tprocess.env.ROO_CLI_RUNTIME = \"1\"\r\n\r\n\t\t// Enable file-based debug logging only when --debug is passed.\r\n\t\tif (options.debug) {\r\n\t\t\tsetDebugLogEnabled(true)\r\n\t\t}\r\n\r\n\t\t// Set up quiet mode early, before any extension code runs.\r\n\t\t// This suppresses console output from the extension during load.\r\n\t\tthis.setupQuietMode()\r\n\r\n\t\t// Initialize client - single source of truth for agent state (including mode).\r\n\t\tthis.client = new ExtensionClient({\r\n\t\t\tsendMessage: (msg) => this.sendToExtension(msg),\r\n\t\t\tdebug: options.debug, // Enable debug logging in the client.\r\n\t\t})\r\n\r\n\t\t// Initialize output manager.\r\n\t\tthis.outputManager = new OutputManager({ disabled: options.disableOutput })\r\n\r\n\t\t// Initialize prompt manager with console mode callbacks.\r\n\t\tthis.promptManager = new PromptManager({\r\n\t\t\tonBeforePrompt: () => this.restoreConsole(),\r\n\t\t\tonAfterPrompt: () => this.setupQuietMode(),\r\n\t\t})\r\n\r\n\t\t// Initialize ask dispatcher.\r\n\t\tthis.askDispatcher = new AskDispatcher({\r\n\t\t\toutputManager: this.outputManager,\r\n\t\t\tpromptManager: this.promptManager,\r\n\t\t\tsendMessage: (msg) => this.sendToExtension(msg),\r\n\t\t\tnonInteractive: options.nonInteractive,\r\n\t\t\texitOnError: options.exitOnError,\r\n\t\t\tdisabled: options.disableOutput, // TUI mode handles asks directly.\r\n\t\t})\r\n\r\n\t\t// Wire up client events.\r\n\t\tthis.setupClientEventHandlers()\r\n\r\n\t\t// Populate initial settings.\r\n\t\tconst baseSettings: RooCodeSettings = {\r\n\t\t\tmode: this.options.mode,\r\n\t\t\tconsecutiveMistakeLimit: this.options.consecutiveMistakeLimit ?? DEFAULT_FLAGS.consecutiveMistakeLimit,\r\n\t\t\tcommandExecutionTimeout: 300,\r\n\t\t\tenableCheckpoints: false,\r\n\t\t\texperiments: {\r\n\t\t\t\tcustomTools: true,\r\n\t\t\t},\r\n\t\t\t...getProviderSettings(this.options.provider, this.options.apiKey, this.options.model, this.options.openAiBaseUrl),\r\n\t\t}\r\n\r\n\t\tthis.initialSettings = this.options.nonInteractive\r\n\t\t\t? {\r\n\t\t\t\t\tautoApprovalEnabled: true,\r\n\t\t\t\t\talwaysAllowReadOnly: true,\r\n\t\t\t\t\talwaysAllowReadOnlyOutsideWorkspace: true,\r\n\t\t\t\t\talwaysAllowWrite: true,\r\n\t\t\t\t\talwaysAllowWriteOutsideWorkspace: true,\r\n\t\t\t\t\talwaysAllowWriteProtected: true,\r\n\t\t\t\t\talwaysAllowMcp: true,\r\n\t\t\t\t\talwaysAllowModeSwitch: true,\r\n\t\t\t\t\talwaysAllowSubtasks: true,\r\n\t\t\t\t\talwaysAllowExecute: true,\r\n\t\t\t\t\tallowedCommands: [\"*\"],\r\n\t\t\t\t\t...baseSettings,\r\n\t\t\t\t}\r\n\t\t\t: {\r\n\t\t\t\t\tautoApprovalEnabled: false,\r\n\t\t\t\t\t...baseSettings,\r\n\t\t\t\t}\r\n\r\n\t\tif (this.options.reasoningEffort && this.options.reasoningEffort !== \"unspecified\") {\r\n\t\t\tif (this.options.reasoningEffort === \"disabled\") {\r\n\t\t\t\tthis.initialSettings.enableReasoningEffort = false\r\n\t\t\t} else {\r\n\t\t\t\tthis.initialSettings.enableReasoningEffort = true\r\n\t\t\t\tthis.initialSettings.reasoningEffort = this.options.reasoningEffort\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (this.options.terminalShell) {\r\n\t\t\tthis.initialSettings.terminalShellIntegrationDisabled = true\r\n\t\t\tthis.initialSettings.execaShellPath = this.options.terminalShell\r\n\t\t}\r\n\t}\r\n\r\n\t// ==========================================================================\r\n\t// Client Event Handlers\r\n\t// ==========================================================================\r\n\r\n\t/**\r\n\t * Wire up client events to managers.\r\n\t * The client emits events, managers handle them.\r\n\t */\r\n\tprivate setupClientEventHandlers(): void {\r\n\t\t// Handle new messages - delegate to OutputManager.\r\n\t\tthis.client.on(\"message\", (msg: ClineMessage) => {\r\n\t\t\tthis.logMessageDebug(msg, \"new\")\r\n\t\t\tthis.outputManager.outputMessage(msg)\r\n\t\t})\r\n\r\n\t\t// Handle message updates - delegate to OutputManager.\r\n\t\tthis.client.on(\"messageUpdated\", (msg: ClineMessage) => {\r\n\t\t\tthis.logMessageDebug(msg, \"updated\")\r\n\t\t\tthis.outputManager.outputMessage(msg)\r\n\t\t})\r\n\r\n\t\t// Handle waiting for input - delegate to AskDispatcher.\r\n\t\tthis.client.on(\"waitingForInput\", (event: WaitingForInputEvent) => {\r\n\t\t\tthis.askDispatcher.handleAsk(event.message)\r\n\t\t})\r\n\r\n\t\t// Handle task completion.\r\n\t\tthis.client.on(\"taskCompleted\", (event: TaskCompletedEvent) => {\r\n\t\t\t// Output completion message via OutputManager.\r\n\t\t\t// Note: completion_result is an \"ask\" type, not a \"say\" type.\r\n\t\t\tif (event.message && event.message.type === \"ask\" && event.message.ask === \"completion_result\") {\r\n\t\t\t\tthis.outputManager.outputCompletionResult(event.message.ts, event.message.text || \"\")\r\n\t\t\t}\r\n\t\t})\r\n\t}\r\n\r\n\t// ==========================================================================\r\n\t// Logging + Console Suppression\r\n\t// ==========================================================================\r\n\r\n\tprivate setupQuietMode(): void {\r\n\t\t// Skip if already set up or if integrationTest mode\r\n\t\tif (this.originalConsole || this.options.integrationTest) {\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\t// Suppress node warnings.\r\n\t\tthis.originalProcessEmitWarning = process.emitWarning\r\n\t\tprocess.emitWarning = () => {}\r\n\t\tprocess.on(\"warning\", () => {})\r\n\r\n\t\t// Suppress console output.\r\n\t\tthis.originalConsole = {\r\n\t\t\tlog: console.log,\r\n\t\t\twarn: console.warn,\r\n\t\t\terror: console.error,\r\n\t\t\tdebug: console.debug,\r\n\t\t\tinfo: console.info,\r\n\t\t}\r\n\r\n\t\tconsole.log = () => {}\r\n\t\tconsole.warn = () => {}\r\n\t\tconsole.debug = () => {}\r\n\t\tconsole.info = () => {}\r\n\t}\r\n\r\n\tprivate restoreConsole(): void {\r\n\t\tif (!this.originalConsole) {\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tconsole.log = this.originalConsole.log\r\n\t\tconsole.warn = this.originalConsole.warn\r\n\t\tconsole.error = this.originalConsole.error\r\n\t\tconsole.debug = this.originalConsole.debug\r\n\t\tconsole.info = this.originalConsole.info\r\n\t\tthis.originalConsole = null\r\n\r\n\t\tif (this.originalProcessEmitWarning) {\r\n\t\t\tprocess.emitWarning = this.originalProcessEmitWarning\r\n\t\t\tthis.originalProcessEmitWarning = null\r\n\t\t}\r\n\t}\r\n\r\n\tprivate logMessageDebug(msg: ClineMessage, type: \"new\" | \"updated\"): void {\r\n\t\tif (msg.partial) {\r\n\t\t\tif (!this.outputManager.hasLoggedFirstPartial(msg.ts)) {\r\n\t\t\t\tthis.outputManager.setLoggedFirstPartial(msg.ts)\r\n\t\t\t\tcliLogger.debug(\"message:start\", { ts: msg.ts, type: msg.say || msg.ask })\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tcliLogger.debug(`message:${type === \"new\" ? \"new\" : \"complete\"}`, { ts: msg.ts, type: msg.say || msg.ask })\r\n\t\t\tthis.outputManager.clearLoggedFirstPartial(msg.ts)\r\n\t\t}\r\n\t}\r\n\r\n\t// ==========================================================================\r\n\t// Extension Lifecycle\r\n\t// ==========================================================================\r\n\r\npublic async activate(): Promise<void> {\n\t\t// Resolve extensionPath to a filesystem path (handle file:// URLs from getDefaultExtensionPath)\n\t\tlet extensionFsPath = this.options.extensionPath;\n\t\tif (typeof extensionFsPath === 'string' && extensionFsPath.startsWith('file://')) {\n\t\t\textensionFsPath = fileURLToPath(extensionFsPath);\n\t\t}\n\n\t\tconst bundlePath = path.join(extensionFsPath, \"extension.js\")\n\t\tconst cjsPath = path.join(extensionFsPath, \"extension.cjs\")\n\n\t\tlet useStub = false;\n\t\tif (!fs.existsSync(cjsPath) && !fs.existsSync(bundlePath)) {\n\t\t\tthis.restoreConsole()\n\t\t\t// Use stub activation in CLI-only mode\n\t\t\tthis.extensionModule = {\n\t\t\t\tactivate: async () => { return {}; },\n\t\t\t\tdeactivate: async () => {}\n\t\t\t} as unknown as ExtensionModule\n\t\t\tthis.extensionAPI = {}\n\t\t\tthis.isReady = true; // Mark ready immediately in stub mode\n\t\t\tuseStub = true;\n\t\t} else {\n\t\t\tuseStub = false;\n\t\t}\n\n\t\tif (!useStub) {\n\t\t// Prefer .cjs (CommonJS) for require() compatibility with Module._resolveFilename/_load interception\n\t\t// ESM import() cannot be intercepted, so vscode mock won't work with .js bundle\n\t\tconst extPath = fs.existsSync(cjsPath) ? cjsPath : bundlePath\n\n\t\tlet storageDir: string | undefined\n\n\t\tif (this.options.ephemeral) {\n\t\t\tthis.ephemeralStorageDir = await createEphemeralStorageDir()\n\t\t\tstorageDir = this.ephemeralStorageDir\n\t\t}\n\n\t\t// Create VSCode API mock.\n\t\tthis.vscode = createVSCodeAPI(this.options.extensionPath, this.options.workspacePath, undefined, {\n\t\t\tappRoot: CLI_PACKAGE_ROOT,\n\t\t\tstorageDir,\n\t\t})\n\t\t;(global as Record<string, unknown>).vscode = this.vscode\n\t\t;(global as Record<string, unknown>).__extensionHost = this\n\n\t\t// Set up module resolution.\n\t\tconst require = createRequire(import.meta.url)\n\t\tconst Module = require(\"module\")\n\t\tconst originalResolve = Module._resolveFilename\n\t\tconst originalLoad = Module._load\n\n\t\tModule._resolveFilename = function (request: string, parent: unknown, isMain: boolean, options: unknown) {\n\t\t\tif (request === \"vscode\") {\n\t\t\t\tconsole.error(\"[DEBUG] Module._resolveFilename: intercepting 'vscode' request\")\n\t\t\t\treturn \"vscode-mock\"\n\t\t\t}\n\t\t\treturn originalResolve.call(this, request, parent, isMain, options)\n\t\t}\n\n\t\tModule._load = function (request: string, parent: unknown, isMain: boolean) {\n\t\t\tif (request === \"vscode-mock\") {\n\t\t\t\tconsole.error(\"[DEBUG] Module._load: loading 'vscode-mock', returning mock vscode\")\n\t\t\t\treturn this.vscode\n\t\t\t}\n\t\t\treturn originalLoad.call(this, request, parent, isMain)\n\t\t}.bind(this)\n\n\t\trequire.cache[\"vscode-mock\"] = {\n\t\t\tid: \"vscode-mock\",\n\t\t\tfilename: \"vscode-mock\",\n\t\t\tloaded: true,\n\t\t\texports: this.vscode,\n\t\t\tchildren: [],\n\t\t\tpaths: [],\n\t\t\tpath: \"\",\n\t\t\tisPreloading: false,\n\t\t\tparent: null,\n\t\t\trequire: require,\n\t\t} as unknown as NodeJS.Module\n\n\t\t// Also expose vscode globally for any code that might check global.vscode\n\t\t;(global as Record<string, unknown>).vscode = this.vscode\n\t\t;(global as Record<string, unknown>).__extensionHost = this\n\n\t\t// For CLI mode, we need to use dynamic import() to load ES modules in CommonJS context\n\t\t// This avoids the \"require() of ES Module\" error.\n\t\t// Use pathToFileURL on Windows to convert path to file:// URL for ESM compatibility.\n\t\tconsole.error(\"[DEBUG] ExtensionHost.activate: loading extension module...\")\n\t\tconsole.error(\"[DEBUG] ExtensionHost.activate: extensionPath =\", this.options.extensionPath)\n\t\tconsole.error(\"[DEBUG] ExtensionHost.activate: cjsPath exists:\", fs.existsSync(cjsPath), cjsPath)\n\t\tconsole.error(\"[DEBUG] ExtensionHost.activate: bundlePath exists:\", fs.existsSync(bundlePath), bundlePath)\n\n\t\t// Module, require, originalResolve, originalLoad already declared earlier in this function\n\t\t// Just add the vscode interception hooks\n\n\t\tModule._resolveFilename = function (request: string, parent: unknown, isMain: boolean, options: unknown) {\n\t\t\tif (request === \"vscode\") {\n\t\t\t\tconsole.error(\"[DEBUG] Module._resolveFilename: intercepting 'vscode' request\")\n\t\t\t\treturn \"vscode-mock\"\n\t\t\t}\n\t\t\treturn originalResolve.call(this, request, parent, isMain, options)\n\t\t}\n\n\t\tModule._load = function (request: string, parent: unknown, isMain: boolean) {\n\t\t\tif (request === \"vscode-mock\" || request === \"vscode\") {\n\t\t\t\tconsole.error(\"[DEBUG] Module._load: loading 'vscode', returning mock vscode directly\")\n\t\t\t\treturn this.vscode\n\t\t\t}\n\t\t\treturn originalLoad.call(this, request, parent, isMain)\n\t\t}.bind(this)\n\n\t\t// Pre-populate require.cache with vscode-mock pointing to our vscode mock\n\t\trequire.cache[\"vscode-mock\"] = {\n\t\t\tid: \"vscode-mock\",\n\t\t\tfilename: \"vscode-mock\",\n\t\t\tloaded: true,\n\t\t\texports: this.vscode,\n\t\t\tchildren: [],\n\t\t\tpaths: [],\n\t\t\tpath: \"\",\n\t\t\tisPreloading: false,\n\t\t\tparent: null,\n\t\t\trequire: require,\n\t\t} as unknown as NodeJS.Module\n\n\t\t// Also expose vscode globally for any code that might check global.vscode\n\t\t;(global as Record<string, unknown>).vscode = this.vscode\n\t\t;(global as Record<string, unknown>).__extensionHost = this\n\n\t\t// Use require() for .cjs files to ensure proper CJS module loading\n\t\t// that goes through Module._resolveFilename and Module._load\n\t\tif (extPath.endsWith(\".cjs\")) {\n\t\t\tconsole.error(\"[DEBUG] ExtensionHost.activate: using require() for .cjs\")\n\t\t\tthis.extensionModule = require(extPath) as unknown as ExtensionModule\n\t\t} else if (extPath.endsWith(\".js\")) {\n\t\t\tconsole.error(\"[DEBUG] ExtensionHost.activate: using import() for .js\")\n\t\t\tthis.extensionModule = await import(pathToFileURL(extPath).href) as unknown as ExtensionModule\n\t\t} else {\n\t\t\tthis.extensionModule = require(extPath) as unknown as ExtensionModule\n\t\t}\n\t\tconsole.error(\"[DEBUG] ExtensionHost.activate: calling extension.activate()...\")\n\n\t\tModule._resolveFilename = originalResolve\n\t\tModule._load = originalLoad\n\n\t\ttry {\n\t\t\tthis.extensionAPI = await this.extensionModule.activate(this.vscode.context)\n\t\t\tconsole.error(\"[DEBUG] ExtensionHost.activate: extension.activate() completed successfully\")\n\t\t} catch (error) {\n\t\t\tconsole.error(\"[DEBUG] ExtensionHost.activate: extension.activate() failed:\", error instanceof Error ? error.message : String(error), error instanceof Error ? error.stack : \"\")\n\t\t\tthrow new Error(`Failed to activate extension: ${error instanceof Error ? error.message : String(error)}`)\n\t\t}\n\n\t\t}\n\t\t// Set up message listener - forward all messages to client.\n// Set up message listener - forward all messages to client.\n\t\tthis.messageListener = (message: ExtensionMessage) => this.client.handleMessage(message)\n\t\tthis.on(\"extensionWebviewMessage\", this.messageListener)\n\n\t\t// For CLI non-TUI mode (print mode), skip waiting for isReady since there's no webview.\n\t\t// Just set isReady to true directly to unblock activation.\n\t\tif (this.options.skipIsReadyWait) {\n\t\t\tconsole.error(\"[DEBUG] ExtensionHost.activate: non-TUI mode, setting isReady=true directly\")\n\t\t\tthis.isReady = true\n\t\t\tconsole.error(\"[DEBUG] ExtensionHost.activate: waiting for isReady...\")\n\t\t} else {\n\t\t\tconsole.error(\"[DEBUG] ExtensionHost.activate: waiting for isReady...\")\n\t\t}\n\n\t\t// Also set up a fallback timeout to log if isReady doesn't become true\n\t\tconst isReadyTimeout = setTimeout(() => {\n\t\t\tif (!this.isReady) {\n\t\t\t\tconsole.error(\"[DEBUG] ExtensionHost.activate: TIMEOUT waiting for isReady - checking internal state...\")\n\t\t\t\tconsole.error(\"[DEBUG] ExtensionHost.activate: client state:\", this.client?.getAgentState ? JSON.stringify(this.client.getAgentState()) : \"no client\")\n\t\t\t}\n\t\t}, 30000)\n\n\t\tawait pWaitFor(() => this.isReady, { interval: 100, timeout: 60_000 })\n\t\tclearTimeout(isReadyTimeout)\n\t\tconsole.error(\"[DEBUG] ExtensionHost.activate: isReady became true!\")\n\t}\n\r\n\tpublic unregisterWebviewProvider(_viewId: string): void {}\n\n\tpublic registerWebviewProvider(_viewId: string, _provider: unknown): void {\n\t\t// Called by WindowAPI when extension registers a webview view provider.\n\t\t// The actual provider resolution is handled by WindowAPI.\n\t}\r\n\r\n\tpublic markWebviewReady(): void {\r\n\t\tthis.isReady = true\r\n\r\n\t\t// Apply CLI settings to the runtime config and context proxy BEFORE\r\n\t\t// sending webviewDidLaunch. This prevents a race condition where the\r\n\t\t// webviewDidLaunch handler's first-time init sync reads default state\r\n\t\t// instead of the CLI-provided settings.\r\n\t\tsetRuntimeConfigValues(\"roo-cline\", this.initialSettings as Record<string, unknown>)\r\n\t\tthis.sendToExtension({ type: \"updateSettings\", updatedSettings: this.initialSettings })\r\n\r\n\t\t// Now trigger extension initialization. The context proxy should already\r\n\t\t// have CLI-provided values when the webviewDidLaunch handler runs.\r\n\t\tthis.sendToExtension({ type: \"webviewDidLaunch\" })\r\n\t}\r\n\r\n\tpublic isInInitialSetup(): boolean {\r\n\t\treturn !this.isReady\r\n\t}\r\n\r\n\t// ==========================================================================\r\n\t// Message Handling\r\n\t// ==========================================================================\r\n\r\n\tpublic sendToExtension(message: WebviewMessage): void {\r\n\t\tif (!this.isReady) {\r\n\t\t\tthrow new Error(\"You cannot send messages to the extension before it is ready\")\r\n\t\t}\r\n\r\n\t\tthis.emit(\"webviewMessage\", message)\r\n\t}\r\n\r\n\t// ==========================================================================\r\n\t// Task Management\r\n\t// ==========================================================================\r\n\r\n\tprivate waitForTaskCompletion(): Promise<void> {\r\n\t\treturn new Promise((resolve, reject) => {\r\n\t\t\tconst completeHandler = () => {\r\n\t\t\t\tcleanup()\r\n\t\t\t\tresolve()\r\n\t\t\t}\r\n\r\n\t\t\tconst errorHandler = (error: Error) => {\r\n\t\t\t\tcleanup()\r\n\t\t\t\treject(error)\r\n\t\t\t}\r\n\r\n\t\t\tconst cleanup = () => {\r\n\t\t\t\tthis.client.off(\"taskCompleted\", completeHandler)\r\n\t\t\t\tthis.client.off(\"error\", errorHandler)\r\n\r\n\t\t\t\tif (messageHandler) {\r\n\t\t\t\t\tthis.client.off(\"message\", messageHandler)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// When exitOnError is enabled, listen for api_req_retry_delayed messages\r\n\t\t\t// (sent by Task.ts during auto-approval retry backoff) and exit immediately.\r\n\t\t\tlet messageHandler: ((msg: ClineMessage) => void) | null = null\r\n\r\n\t\t\tif (this.options.exitOnError) {\r\n\t\t\t\tmessageHandler = (msg: ClineMessage) => {\r\n\t\t\t\t\tif (msg.type === \"say\" && msg.say === \"api_req_retry_delayed\") {\r\n\t\t\t\t\t\tcleanup()\r\n\t\t\t\t\t\treject(new Error(msg.text?.split(\"\\n\")[0] || \"API request failed\"))\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.client.on(\"message\", messageHandler)\r\n\t\t\t}\r\n\r\n\t\t\tthis.client.once(\"taskCompleted\", completeHandler)\r\n\t\t\tthis.client.once(\"error\", errorHandler)\r\n\t\t})\r\n\t}\r\n\r\n\tpublic async runTask(\r\n\t\tprompt: string,\r\n\t\ttaskId?: string,\r\n\t\tconfiguration?: RooCodeSettings,\r\n\t\timages?: string[],\r\n\t): Promise<void> {\r\n\t\tthis.sendToExtension({\r\n\t\t\ttype: \"newTask\",\r\n\t\t\ttext: prompt,\r\n\t\t\ttaskId,\r\n\t\t\ttaskConfiguration: configuration,\r\n\t\t\t...(images !== undefined ? { images } : {}),\r\n\t\t})\r\n\t\treturn this.waitForTaskCompletion()\r\n\t}\r\n\r\n\tpublic async resumeTask(taskId: string): Promise<void> {\r\n\t\tthis.sendToExtension({ type: \"showTaskWithId\", text: taskId })\r\n\t\treturn this.waitForTaskCompletion()\r\n\t}\r\n\r\n\t// ==========================================================================\r\n\t// Public Agent State API\r\n\t// ==========================================================================\r\n\r\n\t/**\r\n\t * Get the current agent loop state.\r\n\t */\r\n\tpublic getAgentState(): AgentStateInfo {\r\n\t\treturn this.client.getAgentState()\r\n\t}\r\n\r\n\t/**\r\n\t * Check if the agent is currently waiting for user input.\r\n\t */\r\n\tpublic isWaitingForInput(): boolean {\r\n\t\treturn this.client.getAgentState().isWaitingForInput\r\n\t}\r\n\r\n\t// ==========================================================================\r\n\t// Cleanup\r\n\t// ==========================================================================\r\n\r\n\tasync dispose(): Promise<void> {\r\n\t\t// Clear managers.\r\n\t\tthis.outputManager.clear()\r\n\t\tthis.askDispatcher.clear()\r\n\r\n\t\t// Remove message listener.\r\n\t\tif (this.messageListener) {\r\n\t\t\tthis.off(\"extensionWebviewMessage\", this.messageListener)\r\n\t\t\tthis.messageListener = null\r\n\t\t}\r\n\r\n\t\t// Reset client.\r\n\t\tthis.client.reset()\r\n\r\n\t\t// Deactivate extension.\r\n\t\tif (this.extensionModule?.deactivate) {\r\n\t\t\ttry {\r\n\t\t\t\tawait this.extensionModule.deactivate()\r\n\t\t\t} catch {\r\n\t\t\t\t// NO-OP\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Clear references.\r\n\t\tthis.vscode = null\r\n\t\tthis.extensionModule = null\r\n\t\tthis.extensionAPI = null\r\n\r\n\t\t// Clear globals.\r\n\t\tdelete (global as Record<string, unknown>).vscode\r\n\t\tdelete (global as Record<string, unknown>).__extensionHost\r\n\r\n\t\t// Restore console.\r\n\t\tthis.restoreConsole()\r\n\r\n\t\t// Clean up ephemeral storage.\r\n\t\tif (this.ephemeralStorageDir) {\r\n\t\t\ttry {\r\n\t\t\t\tawait fs.promises.rm(this.ephemeralStorageDir, { recursive: true, force: true })\r\n\t\t\t\tthis.ephemeralStorageDir = null\r\n\t\t\t} catch {\r\n\t\t\t\t// NO-OP\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Restore previous CLI runtime marker for process hygiene in tests.\r\n\t\tif (this.previousCliRuntimeEnv === undefined) {\r\n\t\t\tdelete process.env.ROO_CLI_RUNTIME\r\n\t\t} else {\r\n\t\t\tprocess.env.ROO_CLI_RUNTIME = this.previousCliRuntimeEnv\r\n\t\t}\r\n\t}\r\n}\r\n","/**\r\n * Event System for Agent State Changes\r\n *\r\n * This module provides a strongly-typed event emitter specifically designed\r\n * for tracking agent state changes. It uses Node.js EventEmitter under the hood\r\n * but provides type safety for all events.\r\n */\r\n\r\nimport { EventEmitter } from \"events\"\r\n\r\nimport { ClineMessage, ClineAsk } from \"../../types\"\r\n\r\nimport type { AgentStateInfo } from \"./agent-state.js\"\r\n\r\n// =============================================================================\r\n// Event Types\r\n// =============================================================================\r\n\r\n/**\r\n * All events that can be emitted by the client.\r\n *\r\n * Design note: We use a string literal union type for event names to ensure\r\n * type safety when subscribing to events. The payload type is determined by\r\n * the event name.\r\n */\r\nexport interface ClientEventMap {\r\n\t/**\r\n\t * Emitted whenever the agent state changes.\r\n\t * This is the primary event for tracking state.\r\n\t */\r\n\tstateChange: AgentStateChangeEvent\r\n\r\n\t/**\r\n\t * Emitted when a new message is added to the message list.\r\n\t */\r\n\tmessage: ClineMessage\r\n\r\n\t/**\r\n\t * Emitted when an existing message is updated (e.g., partial -> complete).\r\n\t */\r\n\tmessageUpdated: ClineMessage\r\n\r\n\t/**\r\n\t * Emitted when the agent starts waiting for user input.\r\n\t * Convenience event - you can also use stateChange.\r\n\t */\r\n\twaitingForInput: WaitingForInputEvent\r\n\r\n\t/**\r\n\t * Emitted when the agent stops waiting and resumes running.\r\n\t */\r\n\tresumedRunning: void\r\n\r\n\t/**\r\n\t * Emitted when the agent starts streaming content.\r\n\t */\r\n\tstreamingStarted: void\r\n\r\n\t/**\r\n\t * Emitted when streaming ends.\r\n\t */\r\n\tstreamingEnded: void\r\n\r\n\t/**\r\n\t * Emitted when a task completes (either successfully or with error).\r\n\t */\r\n\ttaskCompleted: TaskCompletedEvent\r\n\r\n\t/**\r\n\t * Emitted when a task is cleared/cancelled.\r\n\t */\r\n\ttaskCleared: void\r\n\r\n\t/**\r\n\t * Emitted when the current mode changes.\r\n\t */\r\n\tmodeChanged: ModeChangedEvent\r\n\r\n\t/**\r\n\t * Emitted on any error during message processing.\r\n\t */\r\n\terror: Error\r\n}\r\n\r\n/**\r\n * Event payload for state changes.\r\n */\r\nexport interface AgentStateChangeEvent {\r\n\t/** The previous state info */\r\n\tpreviousState: AgentStateInfo\r\n\t/** The new/current state info */\r\n\tcurrentState: AgentStateInfo\r\n\t/** Whether this is a significant state transition (state enum changed) */\r\n\tisSignificantChange: boolean\r\n}\r\n\r\n/**\r\n * Event payload when agent starts waiting for input.\r\n */\r\nexport interface WaitingForInputEvent {\r\n\t/** The specific ask type */\r\n\task: ClineAsk\r\n\t/** Full state info for context */\r\n\tstateInfo: AgentStateInfo\r\n\t/** The message that triggered this wait */\r\n\tmessage: ClineMessage\r\n}\r\n\r\n/**\r\n * Event payload when a task completes.\r\n */\r\nexport interface TaskCompletedEvent {\r\n\t/** Whether the task completed successfully */\r\n\tsuccess: boolean\r\n\t/** The final state info */\r\n\tstateInfo: AgentStateInfo\r\n\t/** The completion message if available */\r\n\tmessage?: ClineMessage\r\n}\r\n\r\n/**\r\n * Event payload when mode changes.\r\n */\r\nexport interface ModeChangedEvent {\r\n\t/** The previous mode (undefined if first mode set) */\r\n\tpreviousMode: string | undefined\r\n\t/** The new/current mode */\r\n\tcurrentMode: string\r\n}\r\n\r\n// =============================================================================\r\n// Typed Event Emitter\r\n// =============================================================================\r\n\r\n/**\r\n * Type-safe event emitter for client events.\r\n *\r\n * Usage:\r\n * ```typescript\r\n * const emitter = new TypedEventEmitter()\r\n *\r\n * // Type-safe subscription\r\n * emitter.on('stateChange', (event) => {\r\n * console.log(event.currentState) // TypeScript knows this is AgentStateChangeEvent\r\n * })\r\n *\r\n * // Type-safe emission\r\n * emitter.emit('stateChange', { previousState, currentState, isSignificantChange })\r\n * ```\r\n */\r\nexport class TypedEventEmitter {\r\n\tprivate emitter = new EventEmitter()\r\n\r\n\t/**\r\n\t * Subscribe to an event.\r\n\t *\r\n\t * @param event - The event name\r\n\t * @param listener - The callback function\r\n\t * @returns Function to unsubscribe\r\n\t */\r\n\ton<K extends keyof ClientEventMap>(event: K, listener: (payload: ClientEventMap[K]) => void): () => void {\r\n\t\tthis.emitter.on(event, listener)\r\n\t\treturn () => this.emitter.off(event, listener)\r\n\t}\r\n\r\n\t/**\r\n\t * Subscribe to an event, but only once.\r\n\t *\r\n\t * @param event - The event name\r\n\t * @param listener - The callback function\r\n\t */\r\n\tonce<K extends keyof ClientEventMap>(event: K, listener: (payload: ClientEventMap[K]) => void): void {\r\n\t\tthis.emitter.once(event, listener)\r\n\t}\r\n\r\n\t/**\r\n\t * Unsubscribe from an event.\r\n\t *\r\n\t * @param event - The event name\r\n\t * @param listener - The callback function to remove\r\n\t */\r\n\toff<K extends keyof ClientEventMap>(event: K, listener: (payload: ClientEventMap[K]) => void): void {\r\n\t\tthis.emitter.off(event, listener)\r\n\t}\r\n\r\n\t/**\r\n\t * Emit an event.\r\n\t *\r\n\t * @param event - The event name\r\n\t * @param payload - The event payload\r\n\t */\r\n\temit<K extends keyof ClientEventMap>(event: K, payload: ClientEventMap[K]): void {\r\n\t\tthis.emitter.emit(event, payload)\r\n\t}\r\n\r\n\t/**\r\n\t * Remove all listeners for an event, or all events.\r\n\t *\r\n\t * @param event - Optional event name. If not provided, removes all listeners.\r\n\t */\r\n\tremoveAllListeners<K extends keyof ClientEventMap>(event?: K): void {\r\n\t\tif (event) {\r\n\t\t\tthis.emitter.removeAllListeners(event)\r\n\t\t} else {\r\n\t\t\tthis.emitter.removeAllListeners()\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Get the number of listeners for an event.\r\n\t */\r\n\tlistenerCount<K extends keyof ClientEventMap>(event: K): number {\r\n\t\treturn this.emitter.listenerCount(event)\r\n\t}\r\n}\r\n\r\n// =============================================================================\r\n// State Change Detector\r\n// =============================================================================\r\n\r\n/**\r\n * Helper to determine if a state change is \"significant\".\r\n *\r\n * A significant change is when the AgentLoopState enum value changes,\r\n * as opposed to just internal state updates within the same state.\r\n */\r\nexport function isSignificantStateChange(previous: AgentStateInfo, current: AgentStateInfo): boolean {\r\n\treturn previous.state !== current.state\r\n}\r\n\r\n/**\r\n * Helper to determine if we transitioned to waiting for input.\r\n */\r\nexport function transitionedToWaiting(previous: AgentStateInfo, current: AgentStateInfo): boolean {\r\n\treturn !previous.isWaitingForInput && current.isWaitingForInput\r\n}\r\n\r\n/**\r\n * Helper to determine if we transitioned from waiting to running.\r\n */\r\nexport function transitionedToRunning(previous: AgentStateInfo, current: AgentStateInfo): boolean {\r\n\treturn previous.isWaitingForInput && !current.isWaitingForInput && current.isRunning\r\n}\r\n\r\n/**\r\n * Helper to determine if streaming started.\r\n */\r\nexport function streamingStarted(previous: AgentStateInfo, current: AgentStateInfo): boolean {\r\n\treturn !previous.isStreaming && current.isStreaming\r\n}\r\n\r\n/**\r\n * Helper to determine if streaming ended.\r\n */\r\nexport function streamingEnded(previous: AgentStateInfo, current: AgentStateInfo): boolean {\r\n\treturn previous.isStreaming && !current.isStreaming\r\n}\r\n\r\n/**\r\n * Helper to determine if task completed.\r\n */\r\nexport function taskCompleted(previous: AgentStateInfo, current: AgentStateInfo): boolean {\r\n\tconst completionAsks = [\"completion_result\", \"resume_completed_task\"]\r\n\tconst wasNotComplete = !previous.currentAsk || !completionAsks.includes(previous.currentAsk)\r\n\tconst isNowComplete = current.currentAsk !== undefined && completionAsks.includes(current.currentAsk)\r\n\treturn wasNotComplete && isNowComplete\r\n}\r\n\r\n// =============================================================================\r\n// Observable Pattern (Alternative API)\r\n// =============================================================================\r\n\r\n/**\r\n * Subscription function type for observable pattern.\r\n */\r\nexport type Observer<T> = (value: T) => void\r\n\r\n/**\r\n * Unsubscribe function type.\r\n */\r\nexport type Unsubscribe = () => void\r\n\r\n/**\r\n * Simple observable for state.\r\n *\r\n * This provides an alternative to the event emitter pattern\r\n * for those who prefer a more functional approach.\r\n *\r\n * Usage:\r\n * ```typescript\r\n * const stateObservable = new Observable<AgentStateInfo>()\r\n *\r\n * const unsubscribe = stateObservable.subscribe((state) => {\r\n * console.log('New state:', state)\r\n * })\r\n *\r\n * // Later...\r\n * unsubscribe()\r\n * ```\r\n */\r\nexport class Observable<T> {\r\n\tprivate observers: Set<Observer<T>> = new Set()\r\n\tprivate currentValue: T | undefined\r\n\r\n\t/**\r\n\t * Create an observable with an optional initial value.\r\n\t */\r\n\tconstructor(initialValue?: T) {\r\n\t\tthis.currentValue = initialValue\r\n\t}\r\n\r\n\t/**\r\n\t * Subscribe to value changes.\r\n\t *\r\n\t * @param observer - Function called when value changes\r\n\t * @returns Unsubscribe function\r\n\t */\r\n\tsubscribe(observer: Observer<T>): Unsubscribe {\r\n\t\tthis.observers.add(observer)\r\n\r\n\t\t// Immediately emit current value if we have one\r\n\t\tif (this.currentValue !== undefined) {\r\n\t\t\tobserver(this.currentValue)\r\n\t\t}\r\n\r\n\t\treturn () => {\r\n\t\t\tthis.observers.delete(observer)\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Update the value and notify all subscribers.\r\n\t */\r\n\tnext(value: T): void {\r\n\t\tthis.currentValue = value\r\n\t\tfor (const observer of this.observers) {\r\n\t\t\ttry {\r\n\t\t\t\tobserver(value)\r\n\t\t\t} catch (error) {\r\n\t\t\t\tconsole.error(\"Error in observer:\", error)\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Get the current value without subscribing.\r\n\t */\r\n\tgetValue(): T | undefined {\r\n\t\treturn this.currentValue\r\n\t}\r\n\r\n\t/**\r\n\t * Check if there are any subscribers.\r\n\t */\r\n\thasSubscribers(): boolean {\r\n\t\treturn this.observers.size > 0\r\n\t}\r\n\r\n\t/**\r\n\t * Get the number of subscribers.\r\n\t */\r\n\tgetSubscriberCount(): number {\r\n\t\treturn this.observers.size\r\n\t}\r\n\r\n\t/**\r\n\t * Remove all subscribers.\r\n\t */\r\n\tclear(): void {\r\n\t\tthis.observers.clear()\r\n\t}\r\n}\r\n","/**\r\n * State Store\r\n *\r\n * This module manages the client's internal state, including:\r\n * - The clineMessages array (source of truth for agent state)\r\n * - The computed agent state info\r\n * - Any extension state we want to cache\r\n *\r\n * The store is designed to be:\r\n * - Immutable: State updates create new objects, not mutations\r\n * - Observable: Changes trigger notifications\r\n * - Queryable: Current state is always accessible\r\n */\r\n\r\nimport { ClineMessage, ExtensionState } from \"../../types\"\r\n\r\nimport { detectAgentState, AgentStateInfo, AgentLoopState } from \"./agent-state.js\"\r\nimport { Observable } from \"./events.js\"\r\n\r\n// =============================================================================\r\n// Store State Interface\r\n// =============================================================================\r\n\r\n/**\r\n * The complete state managed by the store.\r\n */\r\nexport interface StoreState {\r\n\t/**\r\n\t * The array of messages from the extension.\r\n\t * This is the primary data used to compute agent state.\r\n\t */\r\n\tmessages: ClineMessage[]\r\n\r\n\t/**\r\n\t * The computed agent state info.\r\n\t * Updated automatically when messages change.\r\n\t */\r\n\tagentState: AgentStateInfo\r\n\r\n\t/**\r\n\t * Whether we have received any state from the extension.\r\n\t * Useful to distinguish \"no task\" from \"not yet connected\".\r\n\t */\r\n\tisInitialized: boolean\r\n\r\n\t/**\r\n\t * The last time state was updated.\r\n\t */\r\n\tlastUpdatedAt: number\r\n\r\n\t/**\r\n\t * The current mode (e.g., \"code\", \"architect\", \"ask\").\r\n\t * Tracked from state messages received from the extension.\r\n\t */\r\n\tcurrentMode: string | undefined\r\n\r\n\t/**\r\n\t * Optional: Cache of extension state fields we might need.\r\n\t * This is a subset of the full ExtensionState.\r\n\t */\r\n\textensionState?: Partial<ExtensionState>\r\n}\r\n\r\n/**\r\n * Create the initial store state.\r\n */\r\nfunction createInitialState(): StoreState {\r\n\treturn {\r\n\t\tmessages: [],\r\n\t\tagentState: detectAgentState([]),\r\n\t\tisInitialized: false,\r\n\t\tlastUpdatedAt: Date.now(),\r\n\t\tcurrentMode: undefined,\r\n\t}\r\n}\r\n\r\n// =============================================================================\r\n// State Store Class\r\n// =============================================================================\r\n\r\n/**\r\n * StateStore manages all client state and provides reactive updates.\r\n *\r\n * Key features:\r\n * - Stores the clineMessages array\r\n * - Automatically computes agent state when messages change\r\n * - Provides observable pattern for state changes\r\n * - Tracks state history for debugging (optional)\r\n *\r\n * Usage:\r\n * ```typescript\r\n * const store = new StateStore()\r\n *\r\n * // Subscribe to state changes\r\n * store.subscribe((state) => {\r\n * console.log('New state:', state.agentState.state)\r\n * })\r\n *\r\n * // Update messages\r\n * store.setMessages(newMessages)\r\n *\r\n * // Query current state\r\n * const currentState = store.getState()\r\n * ```\r\n */\r\nexport class StateStore {\r\n\tprivate state: StoreState\r\n\tprivate stateObservable: Observable<StoreState>\r\n\tprivate agentStateObservable: Observable<AgentStateInfo>\r\n\r\n\t/**\r\n\t * Optional: Track state history for debugging.\r\n\t * Set maxHistorySize to enable.\r\n\t */\r\n\tprivate stateHistory: StoreState[] = []\r\n\tprivate maxHistorySize: number\r\n\r\n\tconstructor(options: { maxHistorySize?: number } = {}) {\r\n\t\tthis.state = createInitialState()\r\n\t\tthis.stateObservable = new Observable<StoreState>(this.state)\r\n\t\tthis.agentStateObservable = new Observable<AgentStateInfo>(this.state.agentState)\r\n\t\tthis.maxHistorySize = options.maxHistorySize ?? 0\r\n\t}\r\n\r\n\t// ===========================================================================\r\n\t// State Queries\r\n\t// ===========================================================================\r\n\r\n\t/**\r\n\t * Get the current complete state.\r\n\t */\r\n\tgetState(): StoreState {\r\n\t\treturn this.state\r\n\t}\r\n\r\n\t/**\r\n\t * Get just the agent state info.\r\n\t * This is a convenience method for the most common query.\r\n\t */\r\n\tgetAgentState(): AgentStateInfo {\r\n\t\treturn this.state.agentState\r\n\t}\r\n\r\n\t/**\r\n\t * Get the current messages array.\r\n\t */\r\n\tgetMessages(): ClineMessage[] {\r\n\t\treturn this.state.messages\r\n\t}\r\n\r\n\t/**\r\n\t * Get the last message, if any.\r\n\t */\r\n\tgetLastMessage(): ClineMessage | undefined {\r\n\t\treturn this.state.messages[this.state.messages.length - 1]\r\n\t}\r\n\r\n\t/**\r\n\t * Check if the store has been initialized with extension state.\r\n\t */\r\n\tisInitialized(): boolean {\r\n\t\treturn this.state.isInitialized\r\n\t}\r\n\r\n\t/**\r\n\t * Quick check: Is the agent currently waiting for input?\r\n\t */\r\n\tisWaitingForInput(): boolean {\r\n\t\treturn this.state.agentState.isWaitingForInput\r\n\t}\r\n\r\n\t/**\r\n\t * Quick check: Is the agent currently running?\r\n\t */\r\n\tisRunning(): boolean {\r\n\t\treturn this.state.agentState.isRunning\r\n\t}\r\n\r\n\t/**\r\n\t * Quick check: Is content currently streaming?\r\n\t */\r\n\tisStreaming(): boolean {\r\n\t\treturn this.state.agentState.isStreaming\r\n\t}\r\n\r\n\t/**\r\n\t * Get the current agent loop state enum value.\r\n\t */\r\n\tgetCurrentState(): AgentLoopState {\r\n\t\treturn this.state.agentState.state\r\n\t}\r\n\r\n\t/**\r\n\t * Get the current mode (e.g., \"code\", \"architect\", \"ask\").\r\n\t */\r\n\tgetCurrentMode(): string | undefined {\r\n\t\treturn this.state.currentMode\r\n\t}\r\n\r\n\t// ===========================================================================\r\n\t// State Updates\r\n\t// ===========================================================================\r\n\r\n\t/**\r\n\t * Set the complete messages array.\r\n\t * This is typically called when receiving a full state update from the extension.\r\n\t *\r\n\t * @param messages - The new messages array\r\n\t * @returns The previous agent state (for comparison)\r\n\t */\r\n\tsetMessages(messages: ClineMessage[]): AgentStateInfo {\r\n\t\tconst previousAgentState = this.state.agentState\r\n\t\tconst newAgentState = detectAgentState(messages)\r\n\r\n\t\tthis.updateState({\r\n\t\t\tmessages,\r\n\t\t\tagentState: newAgentState,\r\n\t\t\tisInitialized: true,\r\n\t\t\tlastUpdatedAt: Date.now(),\r\n\t\t\tcurrentMode: this.state.currentMode, // Preserve mode across message updates\r\n\t\t})\r\n\r\n\t\treturn previousAgentState\r\n\t}\r\n\r\n\t/**\r\n\t * Add a single message to the end of the messages array.\r\n\t * Useful when receiving incremental updates.\r\n\t *\r\n\t * @param message - The message to add\r\n\t * @returns The previous agent state\r\n\t */\r\n\taddMessage(message: ClineMessage): AgentStateInfo {\r\n\t\tconst newMessages = [...this.state.messages, message]\r\n\t\treturn this.setMessages(newMessages)\r\n\t}\r\n\r\n\t/**\r\n\t * Update a message in place (e.g., when partial becomes complete).\r\n\t * Finds the message by timestamp and replaces it.\r\n\t *\r\n\t * @param message - The updated message\r\n\t * @returns The previous agent state, or undefined if message not found\r\n\t */\r\n\tupdateMessage(message: ClineMessage): AgentStateInfo | undefined {\r\n\t\tconst index = this.state.messages.findIndex((m) => m.ts === message.ts)\r\n\t\tif (index === -1) {\r\n\t\t\t// Message not found, add it instead\r\n\t\t\treturn this.addMessage(message)\r\n\t\t}\r\n\r\n\t\tconst newMessages = [...this.state.messages]\r\n\t\tnewMessages[index] = message\r\n\t\treturn this.setMessages(newMessages)\r\n\t}\r\n\r\n\t/**\r\n\t * Clear all messages and reset to initial state.\r\n\t * Called when a task is cleared/cancelled.\r\n\t */\r\n\tclear(): void {\r\n\t\tthis.updateState({\r\n\t\t\tmessages: [],\r\n\t\t\tagentState: detectAgentState([]),\r\n\t\t\tisInitialized: true, // Still initialized, just empty\r\n\t\t\tlastUpdatedAt: Date.now(),\r\n\t\t\tcurrentMode: this.state.currentMode, // Preserve mode when clearing task\r\n\t\t\textensionState: undefined,\r\n\t\t})\r\n\t}\r\n\r\n\t/**\r\n\t * Set the current mode.\r\n\t * Called when mode changes are detected from extension state messages.\r\n\t *\r\n\t * @param mode - The new mode value\r\n\t */\r\n\tsetCurrentMode(mode: string | undefined): void {\r\n\t\tif (this.state.currentMode !== mode) {\r\n\t\t\tthis.updateState({\r\n\t\t\t\t...this.state,\r\n\t\t\t\tcurrentMode: mode,\r\n\t\t\t\tlastUpdatedAt: Date.now(),\r\n\t\t\t})\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Reset to completely uninitialized state.\r\n\t * Called on disconnect or reset.\r\n\t */\r\n\treset(): void {\r\n\t\tthis.state = createInitialState()\r\n\t\tthis.stateHistory = []\r\n\t\t// Don't notify on reset - we're starting fresh\r\n\t}\r\n\r\n\t/**\r\n\t * Update cached extension state.\r\n\t * This stores any additional extension state fields we might need.\r\n\t *\r\n\t * @param extensionState - The extension state to cache\r\n\t */\r\n\tsetExtensionState(extensionState: Partial<ExtensionState>): void {\r\n\t\t// Extract and store messages if present\r\n\t\tif (extensionState.clineMessages) {\r\n\t\t\tthis.setMessages(extensionState.clineMessages)\r\n\t\t}\r\n\r\n\t\t// Store the rest of the extension state\r\n\t\tthis.updateState({\r\n\t\t\t...this.state,\r\n\t\t\textensionState: {\r\n\t\t\t\t...this.state.extensionState,\r\n\t\t\t\t...extensionState,\r\n\t\t\t},\r\n\t\t})\r\n\t}\r\n\r\n\t// ===========================================================================\r\n\t// Subscriptions\r\n\t// ===========================================================================\r\n\r\n\t/**\r\n\t * Subscribe to all state changes.\r\n\t *\r\n\t * @param observer - Callback function receiving the new state\r\n\t * @returns Unsubscribe function\r\n\t */\r\n\tsubscribe(observer: (state: StoreState) => void): () => void {\r\n\t\treturn this.stateObservable.subscribe(observer)\r\n\t}\r\n\r\n\t/**\r\n\t * Subscribe to agent state changes only.\r\n\t * This is more efficient if you only care about agent state.\r\n\t *\r\n\t * @param observer - Callback function receiving the new agent state\r\n\t * @returns Unsubscribe function\r\n\t */\r\n\tsubscribeToAgentState(observer: (state: AgentStateInfo) => void): () => void {\r\n\t\treturn this.agentStateObservable.subscribe(observer)\r\n\t}\r\n\r\n\t// ===========================================================================\r\n\t// History (for debugging)\r\n\t// ===========================================================================\r\n\r\n\t/**\r\n\t * Get the state history (if enabled).\r\n\t */\r\n\tgetHistory(): StoreState[] {\r\n\t\treturn [...this.stateHistory]\r\n\t}\r\n\r\n\t/**\r\n\t * Clear the state history.\r\n\t */\r\n\tclearHistory(): void {\r\n\t\tthis.stateHistory = []\r\n\t}\r\n\r\n\t// ===========================================================================\r\n\t// Private Methods\r\n\t// ===========================================================================\r\n\r\n\t/**\r\n\t * Internal method to update state and notify observers.\r\n\t */\r\n\tprivate updateState(newState: StoreState): void {\r\n\t\t// Track history if enabled\r\n\t\tif (this.maxHistorySize > 0) {\r\n\t\t\tthis.stateHistory.push(this.state)\r\n\t\t\tif (this.stateHistory.length > this.maxHistorySize) {\r\n\t\t\t\tthis.stateHistory.shift()\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.state = newState\r\n\r\n\t\t// Notify observers\r\n\t\tthis.stateObservable.next(this.state)\r\n\t\tthis.agentStateObservable.next(this.state.agentState)\r\n\t}\r\n}\r\n\r\n// =============================================================================\r\n// Singleton Store (optional convenience)\r\n// =============================================================================\r\n\r\nlet defaultStore: StateStore | null = null\r\n\r\n/**\r\n * Get the default singleton store instance.\r\n * Useful for simple applications that don't need multiple stores.\r\n */\r\nexport function getDefaultStore(): StateStore {\r\n\tif (!defaultStore) {\r\n\t\tdefaultStore = new StateStore()\r\n\t}\r\n\r\n\treturn defaultStore\r\n}\r\n\r\n/**\r\n * Reset the default store instance.\r\n * Useful for testing or when you need a fresh start.\r\n */\r\nexport function resetDefaultStore(): void {\r\n\tif (defaultStore) {\r\n\t\tdefaultStore.reset()\r\n\t}\r\n\r\n\tdefaultStore = null\r\n}\r\n","/**\r\n * Message Processor\r\n *\r\n * This module handles incoming messages from the extension host and dispatches\r\n * appropriate state updates and events. It acts as the bridge between raw\r\n * extension messages and the client's internal state management.\r\n *\r\n * Message Flow:\r\n * ```\r\n * Extension Host ──▶ MessageProcessor ──▶ StateStore ──▶ Events\r\n * ```\r\n *\r\n * The processor handles different message types:\r\n * - \"state\": Full state update from extension\r\n * - \"messageUpdated\": Single message update\r\n * - \"action\": UI action triggers\r\n * - \"invoke\": Command invocations\r\n */\r\n\r\nimport { ExtensionMessage, ClineMessage } from \"../../types\"\r\nimport { debugLog } from \"@roo-code/core/utils\"\r\n\r\nimport type { StateStore } from \"./state-store.js\"\r\nimport type { TypedEventEmitter, AgentStateChangeEvent, WaitingForInputEvent, TaskCompletedEvent } from \"./events.js\"\r\nimport {\r\n\tisSignificantStateChange,\r\n\ttransitionedToWaiting,\r\n\ttransitionedToRunning,\r\n\tstreamingStarted,\r\n\tstreamingEnded,\r\n\ttaskCompleted,\r\n} from \"./events.js\"\r\nimport type { AgentStateInfo } from \"./agent-state.js\"\r\n\r\n// =============================================================================\r\n// Message Processor Options\r\n// =============================================================================\r\n\r\nexport interface MessageProcessorOptions {\r\n\t/**\r\n\t * Whether to emit events for every state change, or only significant ones.\r\n\t * Default: true (emit all changes)\r\n\t */\r\n\temitAllStateChanges?: boolean\r\n\r\n\t/**\r\n\t * Whether to log debug information.\r\n\t * Default: false\r\n\t */\r\n\tdebug?: boolean\r\n}\r\n\r\n// =============================================================================\r\n// Message Processor Class\r\n// =============================================================================\r\n\r\n/**\r\n * MessageProcessor handles incoming extension messages and updates state accordingly.\r\n *\r\n * It is responsible for:\r\n * 1. Parsing and validating incoming messages\r\n * 2. Updating the state store\r\n * 3. Emitting appropriate events\r\n *\r\n * Usage:\r\n * ```typescript\r\n * const store = new StateStore()\r\n * const emitter = new TypedEventEmitter()\r\n * const processor = new MessageProcessor(store, emitter)\r\n *\r\n * // Process a message from the extension\r\n * processor.processMessage(extensionMessage)\r\n * ```\r\n */\r\nexport class MessageProcessor {\r\n\tprivate store: StateStore\r\n\tprivate emitter: TypedEventEmitter\r\n\tprivate options: Required<MessageProcessorOptions>\r\n\r\n\tconstructor(store: StateStore, emitter: TypedEventEmitter, options: MessageProcessorOptions = {}) {\r\n\t\tthis.store = store\r\n\t\tthis.emitter = emitter\r\n\t\tthis.options = {\r\n\t\t\temitAllStateChanges: options.emitAllStateChanges ?? true,\r\n\t\t\tdebug: options.debug ?? false,\r\n\t\t}\r\n\t}\r\n\r\n\t// ===========================================================================\r\n\t// Main Processing Methods\r\n\t// ===========================================================================\r\n\r\n\t/**\r\n\t * Process an incoming message from the extension host.\r\n\t *\r\n\t * This is the main entry point for all extension messages.\r\n\t * It routes messages to the appropriate handler based on type.\r\n\t *\r\n\t * @param message - The raw message from the extension\r\n\t */\r\n\tprocessMessage(message: ExtensionMessage): void {\r\n\t\tif (this.options.debug) {\r\n\t\t\tdebugLog(\"[MessageProcessor] Received message\", { type: message.type })\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\tswitch (message.type) {\r\n\t\t\t\tcase \"state\":\r\n\t\t\t\t\tthis.handleStateMessage(message)\r\n\t\t\t\t\tbreak\r\n\r\n\t\t\t\tcase \"messageUpdated\":\r\n\t\t\t\t\tthis.handleMessageUpdated(message)\r\n\t\t\t\t\tbreak\r\n\r\n\t\t\t\tcase \"action\":\r\n\t\t\t\t\tthis.handleAction(message)\r\n\t\t\t\t\tbreak\r\n\r\n\t\t\t\tcase \"invoke\":\r\n\t\t\t\t\tthis.handleInvoke(message)\r\n\t\t\t\t\tbreak\r\n\r\n\t\t\t\tdefault:\r\n\t\t\t\t\t// Other message types are not relevant to state detection\r\n\t\t\t\t\tif (this.options.debug) {\r\n\t\t\t\t\t\tdebugLog(\"[MessageProcessor] Ignoring message\", { type: message.type })\r\n\t\t\t\t\t}\r\n\t\t\t}\r\n\t\t} catch (error) {\r\n\t\t\tconst err = error instanceof Error ? error : new Error(String(error))\r\n\t\t\tdebugLog(\"[MessageProcessor] Error processing message\", { error: err.message })\r\n\t\t\tthis.emitter.emit(\"error\", err)\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Process an array of messages (for batch updates).\r\n\t */\r\n\tprocessMessages(messages: ExtensionMessage[]): void {\r\n\t\tfor (const message of messages) {\r\n\t\t\tthis.processMessage(message)\r\n\t\t}\r\n\t}\r\n\r\n\t// ===========================================================================\r\n\t// Message Type Handlers\r\n\t// ===========================================================================\r\n\r\n\t/**\r\n\t * Handle a \"state\" message - full state update from extension.\r\n\t *\r\n\t * This is the most important message type for state detection.\r\n\t * It contains the complete clineMessages array which is the source of truth.\r\n\t */\r\n\tprivate handleStateMessage(message: ExtensionMessage): void {\r\n\t\tif (!message.state) {\r\n\t\t\tif (this.options.debug) {\r\n\t\t\t\tdebugLog(\"[MessageProcessor] State message missing state payload\")\r\n\t\t\t}\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tconst { clineMessages, mode } = message.state\r\n\r\n\t\t// Track mode changes.\r\n\t\tif (mode && typeof mode === \"string\") {\r\n\t\t\tconst previousMode = this.store.getCurrentMode()\r\n\r\n\t\t\tif (previousMode !== mode) {\r\n\t\t\t\tif (this.options.debug) {\r\n\t\t\t\t\tdebugLog(\"[MessageProcessor] Mode changed\", { from: previousMode, to: mode })\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.store.setCurrentMode(mode)\r\n\t\t\t\tthis.emitter.emit(\"modeChanged\", { previousMode, currentMode: mode })\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!clineMessages) {\r\n\t\t\tif (this.options.debug) {\r\n\t\t\t\tdebugLog(\"[MessageProcessor] State message missing clineMessages\")\r\n\t\t\t}\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\t// Get previous state for comparison.\r\n\t\tconst previousState = this.store.getAgentState()\r\n\r\n\t\t// Update the store with new messages\r\n\t\t// Note: We only call setMessages, NOT setExtensionState, to avoid\r\n\t\t// double processing (setExtensionState would call setMessages again)\r\n\t\tthis.store.setMessages(clineMessages)\r\n\r\n\t\t// Get new state after update\r\n\t\tconst currentState = this.store.getAgentState()\r\n\r\n\t\t// Debug logging for state message\r\n\t\tif (this.options.debug) {\r\n\t\t\tconst lastMsg = clineMessages[clineMessages.length - 1]\r\n\t\t\tconst lastMsgInfo = lastMsg\r\n\t\t\t\t? {\r\n\t\t\t\t\t\tmsgType: lastMsg.type === \"ask\" ? `ask:${lastMsg.ask}` : `say:${lastMsg.say}`,\r\n\t\t\t\t\t\tpartial: lastMsg.partial,\r\n\t\t\t\t\t\ttextPreview: lastMsg.text?.substring(0, 50),\r\n\t\t\t\t\t}\r\n\t\t\t\t: null\r\n\t\t\tdebugLog(\"[MessageProcessor] State update\", {\r\n\t\t\t\tmessageCount: clineMessages.length,\r\n\t\t\t\tlastMessage: lastMsgInfo,\r\n\t\t\t\tstateTransition: `${previousState.state} → ${currentState.state}`,\r\n\t\t\t\tcurrentAsk: currentState.currentAsk,\r\n\t\t\t\tisWaitingForInput: currentState.isWaitingForInput,\r\n\t\t\t\tisStreaming: currentState.isStreaming,\r\n\t\t\t\tisRunning: currentState.isRunning,\r\n\t\t\t})\r\n\t\t}\r\n\r\n\t\t// Emit events based on state changes\r\n\t\tthis.emitStateChangeEvents(previousState, currentState)\r\n\r\n\t\t// Emit new message events for any messages we haven't seen\r\n\t\tthis.emitNewMessageEvents(previousState, currentState, clineMessages)\r\n\t}\r\n\r\n\t/**\r\n\t * Handle a \"messageUpdated\" message - single message update.\r\n\t *\r\n\t * This is sent when a message is modified (e.g., partial -> complete).\r\n\t */\r\n\tprivate handleMessageUpdated(message: ExtensionMessage): void {\r\n\t\tif (!message.clineMessage) {\r\n\t\t\tif (this.options.debug) {\r\n\t\t\t\tdebugLog(\"[MessageProcessor] messageUpdated missing clineMessage\")\r\n\t\t\t}\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tconst clineMessage = message.clineMessage\r\n\t\tconst previousState = this.store.getAgentState()\r\n\r\n\t\t// Update the message in the store\r\n\t\tthis.store.updateMessage(clineMessage)\r\n\r\n\t\tconst currentState = this.store.getAgentState()\r\n\r\n\t\t// Emit message updated event\r\n\t\tthis.emitter.emit(\"messageUpdated\", clineMessage)\r\n\r\n\t\t// Emit state change events\r\n\t\tthis.emitStateChangeEvents(previousState, currentState)\r\n\t}\r\n\r\n\t/**\r\n\t * Handle an \"action\" message - UI action trigger.\r\n\t *\r\n\t * These are typically used to trigger UI behaviors and don't\r\n\t * directly affect agent state, but we can track them if needed.\r\n\t */\r\n\tprivate handleAction(message: ExtensionMessage): void {\r\n\t\tif (this.options.debug) {\r\n\t\t\tdebugLog(\"[MessageProcessor] Action\", { action: message.action })\r\n\t\t}\r\n\t\t// Actions don't affect agent state, but subclasses could override this\r\n\t}\r\n\r\n\t/**\r\n\t * Handle an \"invoke\" message - command invocation.\r\n\t *\r\n\t * These are commands that should trigger specific behaviors.\r\n\t */\r\n\tprivate handleInvoke(message: ExtensionMessage): void {\r\n\t\tif (this.options.debug) {\r\n\t\t\tdebugLog(\"[MessageProcessor] Invoke\", { invoke: message.invoke })\r\n\t\t}\r\n\t\t// Invokes don't directly affect state detection\r\n\t\t// But they might trigger state changes through subsequent messages\r\n\t}\r\n\r\n\t// ===========================================================================\r\n\t// Event Emission Helpers\r\n\t// ===========================================================================\r\n\r\n\t/**\r\n\t * Emit events based on state changes.\r\n\t */\r\n\tprivate emitStateChangeEvents(previousState: AgentStateInfo, currentState: AgentStateInfo): void {\r\n\t\tconst isSignificant = isSignificantStateChange(previousState, currentState)\r\n\r\n\t\t// Emit stateChange event\r\n\t\tif (this.options.emitAllStateChanges || isSignificant) {\r\n\t\t\tconst changeEvent: AgentStateChangeEvent = {\r\n\t\t\t\tpreviousState,\r\n\t\t\t\tcurrentState,\r\n\t\t\t\tisSignificantChange: isSignificant,\r\n\t\t\t}\r\n\t\t\tthis.emitter.emit(\"stateChange\", changeEvent)\r\n\t\t}\r\n\r\n\t\t// Emit specific transition events\r\n\r\n\t\t// Waiting for input\r\n\t\tif (transitionedToWaiting(previousState, currentState)) {\r\n\t\t\tif (currentState.currentAsk && currentState.lastMessage) {\r\n\t\t\t\tif (this.options.debug) {\r\n\t\t\t\t\tdebugLog(\"[MessageProcessor] EMIT waitingForInput\", {\r\n\t\t\t\t\t\task: currentState.currentAsk,\r\n\t\t\t\t\t\taction: currentState.requiredAction,\r\n\t\t\t\t\t})\r\n\t\t\t\t}\r\n\t\t\t\tconst waitingEvent: WaitingForInputEvent = {\r\n\t\t\t\t\task: currentState.currentAsk,\r\n\t\t\t\t\tstateInfo: currentState,\r\n\t\t\t\t\tmessage: currentState.lastMessage,\r\n\t\t\t\t}\r\n\t\t\t\tthis.emitter.emit(\"waitingForInput\", waitingEvent)\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Resumed running\r\n\t\tif (transitionedToRunning(previousState, currentState)) {\r\n\t\t\tif (this.options.debug) {\r\n\t\t\t\tdebugLog(\"[MessageProcessor] EMIT resumedRunning\")\r\n\t\t\t}\r\n\t\t\tthis.emitter.emit(\"resumedRunning\", undefined as void)\r\n\t\t}\r\n\r\n\t\t// Streaming started\r\n\t\tif (streamingStarted(previousState, currentState)) {\r\n\t\t\tif (this.options.debug) {\r\n\t\t\t\tdebugLog(\"[MessageProcessor] EMIT streamingStarted\")\r\n\t\t\t}\r\n\t\t\tthis.emitter.emit(\"streamingStarted\", undefined as void)\r\n\t\t}\r\n\r\n\t\t// Streaming ended\r\n\t\tif (streamingEnded(previousState, currentState)) {\r\n\t\t\tif (this.options.debug) {\r\n\t\t\t\tdebugLog(\"[MessageProcessor] EMIT streamingEnded\")\r\n\t\t\t}\r\n\t\t\tthis.emitter.emit(\"streamingEnded\", undefined as void)\r\n\t\t}\r\n\r\n\t\t// Task completed\r\n\t\tif (taskCompleted(previousState, currentState)) {\r\n\t\t\tconst completedSuccessfully =\r\n\t\t\t\tcurrentState.currentAsk === \"completion_result\" || currentState.currentAsk === \"resume_completed_task\"\r\n\r\n\t\t\tif (this.options.debug) {\r\n\t\t\t\tdebugLog(\"[MessageProcessor] EMIT taskCompleted\", {\r\n\t\t\t\t\tsuccess: completedSuccessfully,\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t\tconst completedEvent: TaskCompletedEvent = {\r\n\t\t\t\tsuccess: completedSuccessfully,\r\n\t\t\t\tstateInfo: currentState,\r\n\t\t\t\tmessage: currentState.lastMessage,\r\n\t\t\t}\r\n\t\t\tthis.emitter.emit(\"taskCompleted\", completedEvent)\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Emit events for new messages.\r\n\t *\r\n\t * We compare the previous and current message counts to find new messages.\r\n\t * This is a simple heuristic - for more accuracy, we'd track by timestamp.\r\n\t */\r\n\tprivate emitNewMessageEvents(\r\n\t\t_previousState: AgentStateInfo,\r\n\t\t_currentState: AgentStateInfo,\r\n\t\tmessages: ClineMessage[],\r\n\t): void {\r\n\t\t// For now, just emit the last message as new\r\n\t\t// A more sophisticated implementation would track seen message timestamps\r\n\t\tconst lastMessage = messages[messages.length - 1]\r\n\t\tif (lastMessage) {\r\n\t\t\tthis.emitter.emit(\"message\", lastMessage)\r\n\t\t}\r\n\t}\r\n\r\n\t// ===========================================================================\r\n\t// Utility Methods\r\n\t// ===========================================================================\r\n\r\n\t/**\r\n\t * Manually trigger a task cleared event.\r\n\t * Call this when you send a clearTask message to the extension.\r\n\t */\r\n\tnotifyTaskCleared(): void {\r\n\t\tthis.store.clear()\r\n\t\tthis.emitter.emit(\"taskCleared\", undefined as void)\r\n\t}\r\n\r\n\t/**\r\n\t * Enable or disable debug logging.\r\n\t */\r\n\tsetDebug(enabled: boolean): void {\r\n\t\tthis.options.debug = enabled\r\n\t}\r\n}\r\n\r\n// =============================================================================\r\n// Message Validation Helpers\r\n// =============================================================================\r\n\r\n/**\r\n * Check if a message is a valid ClineMessage.\r\n * Useful for validating messages before processing.\r\n */\r\nexport function isValidClineMessage(message: unknown): message is ClineMessage {\r\n\tif (!message || typeof message !== \"object\") {\r\n\t\treturn false\r\n\t}\r\n\r\n\tconst msg = message as Record<string, unknown>\r\n\r\n\t// Required fields\r\n\tif (typeof msg.ts !== \"number\") {\r\n\t\treturn false\r\n\t}\r\n\r\n\tif (msg.type !== \"ask\" && msg.type !== \"say\") {\r\n\t\treturn false\r\n\t}\r\n\r\n\treturn true\r\n}\r\n\r\n/**\r\n * Check if a message is a valid ExtensionMessage.\r\n */\r\nexport function isValidExtensionMessage(message: unknown): message is ExtensionMessage {\r\n\tif (!message || typeof message !== \"object\") {\r\n\t\treturn false\r\n\t}\r\n\r\n\tconst msg = message as Record<string, unknown>\r\n\r\n\t// Must have a type\r\n\tif (typeof msg.type !== \"string\") {\r\n\t\treturn false\r\n\t}\r\n\r\n\treturn true\r\n}\r\n\r\n// =============================================================================\r\n// Message Parsing Utilities\r\n// =============================================================================\r\n\r\n/**\r\n * Parse a JSON string into an ExtensionMessage.\r\n * Returns undefined if parsing fails.\r\n */\r\nexport function parseExtensionMessage(json: string): ExtensionMessage | undefined {\r\n\ttry {\r\n\t\tconst parsed = JSON.parse(json)\r\n\t\tif (isValidExtensionMessage(parsed)) {\r\n\t\t\treturn parsed\r\n\t\t}\r\n\t\treturn undefined\r\n\t} catch {\r\n\t\treturn undefined\r\n\t}\r\n}\r\n\r\n/**\r\n * Parse the text field of an api_req_started message.\r\n * Returns undefined if parsing fails or text is not present.\r\n */\r\nexport function parseApiReqStartedText(message: ClineMessage): { cost?: number } | undefined {\r\n\tif (message.say !== \"api_req_started\" || !message.text) {\r\n\t\treturn undefined\r\n\t}\r\n\r\n\ttry {\r\n\t\treturn JSON.parse(message.text)\r\n\t} catch {\r\n\t\treturn undefined\r\n\t}\r\n}\r\n","/**\r\n * Roo Code Client\r\n *\r\n * This is the main entry point for the client library. It provides a high-level\r\n * API for:\r\n * - Processing messages from the extension host\r\n * - Querying the current agent state\r\n * - Subscribing to state change events\r\n * - Sending responses back to the extension\r\n *\r\n * The client is designed to be transport-agnostic. You provide a way to send\r\n * messages to the extension, and you feed incoming messages to the client.\r\n *\r\n * Architecture:\r\n * ```\r\n * ┌───────────────────────────────────────────────┐\r\n * │ ExtensionClient │\r\n * │ │\r\n * Extension ──────▶ │ MessageProcessor ──▶ StateStore │\r\n * Messages │ │ │ │\r\n * │ ▼ ▼ │\r\n * │ TypedEventEmitter ◀── State/Events │\r\n * │ │ │\r\n * │ ▼ │\r\n * │ Your Event Handlers │\r\n * └───────────────────────────────────────────────┘\r\n * ```\r\n */\r\n\r\nimport type { ExtensionMessage, WebviewMessage, ClineAskResponse, ClineMessage, ClineAsk } from \"../../types\"\r\n\r\nimport { StateStore } from \"./state-store.js\"\r\nimport { MessageProcessor, parseExtensionMessage } from \"./message-processor.js\"\r\nimport {\r\n\tTypedEventEmitter,\r\n\ttype ClientEventMap,\r\n\ttype AgentStateChangeEvent,\r\n\ttype WaitingForInputEvent,\r\n\ttype ModeChangedEvent,\r\n} from \"./events.js\"\r\nimport { AgentLoopState, type AgentStateInfo } from \"./agent-state.js\"\r\n\r\n// =============================================================================\r\n// Extension Client Configuration\r\n// =============================================================================\r\n\r\n/**\r\n * Configuration options for the ExtensionClient.\r\n */\r\nexport interface ExtensionClientConfig {\r\n\t/**\r\n\t * Function to send messages to the extension host.\r\n\t * This is how the client communicates back to the extension.\r\n\t *\r\n\t * Example implementations:\r\n\t * - VSCode webview: (msg) => vscode.postMessage(msg)\r\n\t * - WebSocket: (msg) => socket.send(JSON.stringify(msg))\r\n\t * - IPC: (msg) => process.send(msg)\r\n\t */\r\n\tsendMessage: (message: WebviewMessage) => void\r\n\r\n\t/**\r\n\t * Whether to emit events for all state changes or only significant ones.\r\n\t * Default: true\r\n\t */\r\n\temitAllStateChanges?: boolean\r\n\r\n\t/**\r\n\t * Enable debug logging.\r\n\t * Default: false\r\n\t */\r\n\tdebug?: boolean\r\n\r\n\t/**\r\n\t * Maximum state history size (for debugging).\r\n\t * Set to 0 to disable history tracking.\r\n\t * Default: 0\r\n\t */\r\n\tmaxHistorySize?: number\r\n}\r\n\r\n// =============================================================================\r\n// Main Client Class\r\n// =============================================================================\r\n\r\n/**\r\n * ExtensionClient is the main interface for interacting with the Roo Code extension.\r\n *\r\n * Basic usage:\r\n * ```typescript\r\n * // Create client with message sender\r\n * const client = new ExtensionClient({\r\n * sendMessage: (msg) => vscode.postMessage(msg)\r\n * })\r\n *\r\n * // Subscribe to state changes\r\n * client.on('stateChange', (event) => {\r\n * console.log('State:', event.currentState.state)\r\n * })\r\n *\r\n * // Subscribe to specific events\r\n * client.on('waitingForInput', (event) => {\r\n * console.log('Waiting for:', event.ask)\r\n * })\r\n *\r\n * // Feed messages from extension\r\n * window.addEventListener('message', (e) => {\r\n * client.handleMessage(e.data)\r\n * })\r\n *\r\n * // Query state at any time\r\n * const state = client.getAgentState()\r\n * if (state.isWaitingForInput) {\r\n * // Show approval UI\r\n * }\r\n *\r\n * // Send responses\r\n * client.approve() // or client.reject() or client.respond('answer')\r\n * ```\r\n */\r\nexport class ExtensionClient {\r\n\tprivate store: StateStore\r\n\tprivate processor: MessageProcessor\r\n\tprivate emitter: TypedEventEmitter\r\n\tprivate sendMessage: (message: WebviewMessage) => void\r\n\tprivate debug: boolean\r\n\r\n\tconstructor(config: ExtensionClientConfig) {\r\n\t\tthis.sendMessage = config.sendMessage\r\n\t\tthis.debug = config.debug ?? false\r\n\t\tthis.store = new StateStore({ maxHistorySize: config.maxHistorySize ?? 0 })\r\n\t\tthis.emitter = new TypedEventEmitter()\r\n\r\n\t\tthis.processor = new MessageProcessor(this.store, this.emitter, {\r\n\t\t\temitAllStateChanges: config.emitAllStateChanges ?? true,\r\n\t\t\tdebug: config.debug ?? false,\r\n\t\t})\r\n\t}\r\n\r\n\t// ===========================================================================\r\n\t// Message Handling\r\n\t// ===========================================================================\r\n\r\n\t/**\r\n\t * Handle an incoming message from the extension host.\r\n\t *\r\n\t * Call this method whenever you receive a message from the extension.\r\n\t * The client will parse, validate, and process the message, updating\r\n\t * internal state and emitting appropriate events.\r\n\t *\r\n\t * @param message - The raw message (can be ExtensionMessage or JSON string)\r\n\t */\r\n\thandleMessage(message: ExtensionMessage | string): void {\r\n\t\tlet parsed: ExtensionMessage | undefined\r\n\r\n\t\tif (typeof message === \"string\") {\r\n\t\t\tparsed = parseExtensionMessage(message)\r\n\r\n\t\t\tif (!parsed) {\r\n\t\t\t\tif (this.debug) {\r\n\t\t\t\t\tconsole.log(\"[ExtensionClient] Failed to parse message:\", message)\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tparsed = message\r\n\t\t}\r\n\r\n\t\tthis.processor.processMessage(parsed)\r\n\t}\r\n\r\n\t/**\r\n\t * Handle multiple messages at once.\r\n\t */\r\n\thandleMessages(messages: (ExtensionMessage | string)[]): void {\r\n\t\tfor (const message of messages) {\r\n\t\t\tthis.handleMessage(message)\r\n\t\t}\r\n\t}\r\n\r\n\t// ===========================================================================\r\n\t// State Queries - Always know the current state\r\n\t// ===========================================================================\r\n\r\n\t/**\r\n\t * Get the complete agent state information.\r\n\t *\r\n\t * This returns everything you need to know about the current state:\r\n\t * - The high-level state (running, streaming, waiting, idle, etc.)\r\n\t * - Whether input is needed\r\n\t * - The specific ask type if waiting\r\n\t * - What action is required\r\n\t * - Human-readable description\r\n\t */\r\n\tgetAgentState(): AgentStateInfo {\r\n\t\treturn this.store.getAgentState()\r\n\t}\r\n\r\n\t/**\r\n\t * Get just the current state enum value.\r\n\t */\r\n\tgetCurrentState(): AgentLoopState {\r\n\t\treturn this.store.getCurrentState()\r\n\t}\r\n\r\n\t/**\r\n\t * Check if the agent is waiting for user input.\r\n\t */\r\n\tisWaitingForInput(): boolean {\r\n\t\treturn this.store.isWaitingForInput()\r\n\t}\r\n\r\n\t/**\r\n\t * Check if the agent is actively running.\r\n\t */\r\n\tisRunning(): boolean {\r\n\t\treturn this.store.isRunning()\r\n\t}\r\n\r\n\t/**\r\n\t * Check if content is currently streaming.\r\n\t */\r\n\tisStreaming(): boolean {\r\n\t\treturn this.store.isStreaming()\r\n\t}\r\n\r\n\t/**\r\n\t * Check if there is an active task.\r\n\t */\r\n\thasActiveTask(): boolean {\r\n\t\treturn this.store.getCurrentState() !== AgentLoopState.NO_TASK\r\n\t}\r\n\r\n\t/**\r\n\t * Get all messages in the current task.\r\n\t */\r\n\tgetMessages(): ClineMessage[] {\r\n\t\treturn this.store.getMessages()\r\n\t}\r\n\r\n\t/**\r\n\t * Get the last message.\r\n\t */\r\n\tgetLastMessage(): ClineMessage | undefined {\r\n\t\treturn this.store.getLastMessage()\r\n\t}\r\n\r\n\t/**\r\n\t * Get the current ask type if the agent is waiting for input.\r\n\t */\r\n\tgetCurrentAsk(): ClineAsk | undefined {\r\n\t\treturn this.store.getAgentState().currentAsk\r\n\t}\r\n\r\n\t/**\r\n\t * Check if the client has received any state from the extension.\r\n\t */\r\n\tisInitialized(): boolean {\r\n\t\treturn this.store.isInitialized()\r\n\t}\r\n\r\n\t/**\r\n\t * Get the current mode (e.g., \"code\", \"architect\", \"ask\").\r\n\t * Returns undefined if no mode has been received yet.\r\n\t */\r\n\tgetCurrentMode(): string | undefined {\r\n\t\treturn this.store.getCurrentMode()\r\n\t}\r\n\r\n\t// ===========================================================================\r\n\t// Event Subscriptions - Realtime notifications\r\n\t// ===========================================================================\r\n\r\n\t/**\r\n\t * Subscribe to an event.\r\n\t *\r\n\t * Returns an unsubscribe function for easy cleanup.\r\n\t *\r\n\t * @param event - The event to subscribe to\r\n\t * @param listener - The callback function\r\n\t * @returns Unsubscribe function\r\n\t *\r\n\t * @example\r\n\t * ```typescript\r\n\t * const unsubscribe = client.on('stateChange', (event) => {\r\n\t * console.log(event.currentState)\r\n\t * })\r\n\t *\r\n\t * // Later, to unsubscribe:\r\n\t * unsubscribe()\r\n\t * ```\r\n\t */\r\n\ton<K extends keyof ClientEventMap>(event: K, listener: (payload: ClientEventMap[K]) => void): () => void {\r\n\t\treturn this.emitter.on(event, listener)\r\n\t}\r\n\r\n\t/**\r\n\t * Subscribe to an event, triggered only once.\r\n\t */\r\n\tonce<K extends keyof ClientEventMap>(event: K, listener: (payload: ClientEventMap[K]) => void): void {\r\n\t\tthis.emitter.once(event, listener)\r\n\t}\r\n\r\n\t/**\r\n\t * Unsubscribe from an event.\r\n\t */\r\n\toff<K extends keyof ClientEventMap>(event: K, listener: (payload: ClientEventMap[K]) => void): void {\r\n\t\tthis.emitter.off(event, listener)\r\n\t}\r\n\r\n\t/**\r\n\t * Remove all listeners for an event, or all events.\r\n\t */\r\n\tremoveAllListeners<K extends keyof ClientEventMap>(event?: K): void {\r\n\t\tthis.emitter.removeAllListeners(event)\r\n\t}\r\n\r\n\t/**\r\n\t * Convenience method: Subscribe only to state changes.\r\n\t */\r\n\tonStateChange(listener: (event: AgentStateChangeEvent) => void): () => void {\r\n\t\treturn this.on(\"stateChange\", listener)\r\n\t}\r\n\r\n\t/**\r\n\t * Convenience method: Subscribe only to waiting events.\r\n\t */\r\n\tonWaitingForInput(listener: (event: WaitingForInputEvent) => void): () => void {\r\n\t\treturn this.on(\"waitingForInput\", listener)\r\n\t}\r\n\r\n\t/**\r\n\t * Convenience method: Subscribe only to mode changes.\r\n\t */\r\n\tonModeChanged(listener: (event: ModeChangedEvent) => void): () => void {\r\n\t\treturn this.on(\"modeChanged\", listener)\r\n\t}\r\n\r\n\t// ===========================================================================\r\n\t// Response Methods - Send actions to the extension\r\n\t// ===========================================================================\r\n\r\n\t/**\r\n\t * Approve the current action (tool, command, browser, MCP).\r\n\t *\r\n\t * Use when the agent is waiting for approval (interactive asks).\r\n\t */\r\n\tapprove(): void {\r\n\t\tthis.sendResponse(\"yesButtonClicked\")\r\n\t}\r\n\r\n\t/**\r\n\t * Reject the current action.\r\n\t *\r\n\t * Use when you want to deny a tool, command, or other action.\r\n\t */\r\n\treject(): void {\r\n\t\tthis.sendResponse(\"noButtonClicked\")\r\n\t}\r\n\r\n\t/**\r\n\t * Send a text response.\r\n\t *\r\n\t * Use for:\r\n\t * - Answering follow-up questions\r\n\t * - Providing additional context\r\n\t * - Giving feedback on completion\r\n\t *\r\n\t * @param text - The response text\r\n\t * @param images - Optional base64-encoded images\r\n\t */\r\n\trespond(text: string, images?: string[]): void {\r\n\t\tthis.sendResponse(\"messageResponse\", text, images)\r\n\t}\r\n\r\n\t/**\r\n\t * Generic method to send any ask response.\r\n\t *\r\n\t * @param response - The response type\r\n\t * @param text - Optional text content\r\n\t * @param images - Optional images\r\n\t */\r\n\tsendResponse(response: ClineAskResponse, text?: string, images?: string[]): void {\r\n\t\tconst message: WebviewMessage = {\r\n\t\t\ttype: \"askResponse\",\r\n\t\t\taskResponse: response,\r\n\t\t\ttext,\r\n\t\t\timages,\r\n\t\t}\r\n\t\tthis.sendMessage(message)\r\n\t}\r\n\r\n\t// ===========================================================================\r\n\t// Task Control Methods\r\n\t// ===========================================================================\r\n\r\n\t/**\r\n\t * Start a new task with the given prompt.\r\n\t *\r\n\t * @param text - The task description/prompt\r\n\t * @param images - Optional base64-encoded images\r\n\t */\r\n\tnewTask(text: string, images?: string[]): void {\r\n\t\tconst message: WebviewMessage = {\r\n\t\t\ttype: \"newTask\",\r\n\t\t\ttext,\r\n\t\t\timages,\r\n\t\t}\r\n\t\tthis.sendMessage(message)\r\n\t}\r\n\r\n\t/**\r\n\t * Clear the current task.\r\n\t *\r\n\t * This ends the current task and resets to a fresh state.\r\n\t */\r\n\tclearTask(): void {\r\n\t\tconst message: WebviewMessage = {\r\n\t\t\ttype: \"clearTask\",\r\n\t\t}\r\n\t\tthis.sendMessage(message)\r\n\t\tthis.processor.notifyTaskCleared()\r\n\t}\r\n\r\n\t/**\r\n\t * Cancel a running task.\r\n\t *\r\n\t * Use this to interrupt a task that is currently processing.\r\n\t */\r\n\tcancelTask(): void {\r\n\t\tconst message: WebviewMessage = {\r\n\t\t\ttype: \"cancelTask\",\r\n\t\t}\r\n\t\tthis.sendMessage(message)\r\n\t}\r\n\r\n\t/**\r\n\t * Resume a paused task.\r\n\t *\r\n\t * Use when the agent state is RESUMABLE (resume_task ask).\r\n\t */\r\n\tresumeTask(): void {\r\n\t\tthis.approve() // Resume uses the same response as approve\r\n\t}\r\n\r\n\t/**\r\n\t * Retry a failed API request.\r\n\t *\r\n\t * Use when the agent state shows api_req_failed.\r\n\t */\r\n\tretryApiRequest(): void {\r\n\t\tthis.approve() // Retry uses the same response as approve\r\n\t}\r\n\r\n\t// ===========================================================================\r\n\t// Terminal Operation Methods\r\n\t// ===========================================================================\r\n\r\n\t/**\r\n\t * Continue terminal output (don't wait for more output).\r\n\t *\r\n\t * Use when the agent is showing command_output and you want to proceed.\r\n\t */\r\n\tcontinueTerminal(): void {\r\n\t\tconst message: WebviewMessage = {\r\n\t\t\ttype: \"terminalOperation\",\r\n\t\t\tterminalOperation: \"continue\",\r\n\t\t}\r\n\t\tthis.sendMessage(message)\r\n\t}\r\n\r\n\t/**\r\n\t * Abort terminal command.\r\n\t *\r\n\t * Use when you want to kill a running terminal command.\r\n\t */\r\n\tabortTerminal(): void {\r\n\t\tconst message: WebviewMessage = {\r\n\t\t\ttype: \"terminalOperation\",\r\n\t\t\tterminalOperation: \"abort\",\r\n\t\t}\r\n\t\tthis.sendMessage(message)\r\n\t}\r\n\r\n\t// ===========================================================================\r\n\t// Utility Methods\r\n\t// ===========================================================================\r\n\r\n\t/**\r\n\t * Reset the client state.\r\n\t *\r\n\t * This clears all internal state and history.\r\n\t * Useful when disconnecting or starting fresh.\r\n\t */\r\n\treset(): void {\r\n\t\tthis.store.reset()\r\n\t\tthis.emitter.removeAllListeners()\r\n\t}\r\n\r\n\t/**\r\n\t * Get the state history (if history tracking is enabled).\r\n\t */\r\n\tgetStateHistory() {\r\n\t\treturn this.store.getHistory()\r\n\t}\r\n\r\n\t/**\r\n\t * Enable or disable debug mode.\r\n\t */\r\n\tsetDebug(enabled: boolean): void {\r\n\t\tthis.debug = enabled\r\n\t\tthis.processor.setDebug(enabled)\r\n\t}\r\n\r\n\t// ===========================================================================\r\n\t// Advanced: Direct Store Access\r\n\t// ===========================================================================\r\n\r\n\t/**\r\n\t * Get direct access to the state store.\r\n\t *\r\n\t * This is for advanced use cases where you need more control.\r\n\t * Most users should use the methods above instead.\r\n\t */\r\n\tgetStore(): StateStore {\r\n\t\treturn this.store\r\n\t}\r\n\r\n\t/**\r\n\t * Get direct access to the event emitter.\r\n\t */\r\n\tgetEmitter(): TypedEventEmitter {\r\n\t\treturn this.emitter\r\n\t}\r\n}\r\n\r\n// =============================================================================\r\n// Factory Functions\r\n// =============================================================================\r\n\r\n/**\r\n * Create a new ExtensionClient instance.\r\n *\r\n * This is a convenience function that creates a client with default settings.\r\n *\r\n * @param sendMessage - Function to send messages to the extension\r\n * @returns A new ExtensionClient instance\r\n */\r\nexport function createClient(sendMessage: (message: WebviewMessage) => void): ExtensionClient {\r\n\treturn new ExtensionClient({ sendMessage })\r\n}\r\n\r\n/**\r\n * Create a mock client for testing.\r\n *\r\n * The mock client captures all sent messages for verification.\r\n *\r\n * @returns An object with the client and captured messages\r\n */\r\nexport function createMockClient(): {\r\n\tclient: ExtensionClient\r\n\tsentMessages: WebviewMessage[]\r\n\tclearMessages: () => void\r\n} {\r\n\tconst sentMessages: WebviewMessage[] = []\r\n\r\n\tconst client = new ExtensionClient({\r\n\t\tsendMessage: (message) => sentMessages.push(message),\r\n\t\tdebug: false,\r\n\t})\r\n\r\n\treturn {\r\n\t\tclient,\r\n\t\tsentMessages,\r\n\t\tclearMessages: () => {\r\n\t\t\tsentMessages.length = 0\r\n\t\t},\r\n\t}\r\n}\r\n","/**\r\n * OutputManager - Handles all CLI output and streaming\r\n *\r\n * This manager is responsible for:\r\n * - Writing messages to stdout/stderr\r\n * - Tracking what's been displayed (to avoid duplicates)\r\n * - Managing streaming content with delta computation\r\n * - Formatting different message types appropriately\r\n *\r\n * Design notes:\r\n * - Uses the Observable pattern from client/events.ts for internal state\r\n * - Single responsibility: CLI output only (no prompting, no state detection)\r\n * - Can be disabled for TUI mode where Ink controls the terminal\r\n */\r\n\r\nimport { ClineMessage, ClineSay } from \"../../types\"\r\n\r\nimport { Observable } from \"./events.js\"\r\n\r\n// =============================================================================\r\n// Types\r\n// =============================================================================\r\n\r\n/**\r\n * Tracks what we've displayed for a specific message ts.\r\n */\r\nexport interface DisplayedMessage {\r\n\tts: number\r\n\ttext: string\r\n\tpartial: boolean\r\n}\r\n\r\n/**\r\n * Tracks streaming state for a message.\r\n */\r\nexport interface StreamState {\r\n\tts: number\r\n\ttext: string\r\n\theaderShown: boolean\r\n}\r\n\r\n/**\r\n * Configuration options for OutputManager.\r\n */\r\nexport interface OutputManagerOptions {\r\n\t/**\r\n\t * When true, completely disables all output.\r\n\t * Use for TUI mode where another system controls the terminal.\r\n\t */\r\n\tdisabled?: boolean\r\n\r\n\t/**\r\n\t * Stream for normal output (default: process.stdout).\r\n\t */\r\n\tstdout?: NodeJS.WriteStream\r\n\r\n\t/**\r\n\t * Stream for error output (default: process.stderr).\r\n\t */\r\n\tstderr?: NodeJS.WriteStream\r\n}\r\n\r\n// =============================================================================\r\n// OutputManager Class\r\n// =============================================================================\r\n\r\nexport class OutputManager {\r\n\tprivate disabled: boolean\r\n\tprivate stdout: NodeJS.WriteStream\r\n\tprivate stderr: NodeJS.WriteStream\r\n\r\n\t/**\r\n\t * Track displayed messages by ts to avoid duplicate output.\r\n\t * Observable pattern allows external systems to subscribe if needed.\r\n\t */\r\n\tprivate displayedMessages = new Map<number, DisplayedMessage>()\r\n\r\n\t/**\r\n\t * Track streamed content by ts for delta computation.\r\n\t */\r\n\tprivate streamedContent = new Map<number, StreamState>()\r\n\r\n\t/**\r\n\t * Track which ts is currently streaming (for newline management).\r\n\t */\r\n\tprivate currentlyStreamingTs: number | null = null\r\n\r\n\t/**\r\n\t * Track whether a say:completion_result has been streamed,\r\n\t * so the subsequent ask:completion_result doesn't duplicate the text.\r\n\t */\r\n\tprivate completionResultStreamed = false\r\n\r\n\t/**\r\n\t * Track first partial logs (for debugging first/last pattern).\r\n\t */\r\n\tprivate loggedFirstPartial = new Set<number>()\r\n\r\n\t/**\r\n\t * Observable for streaming state changes.\r\n\t * External systems can subscribe to know when streaming starts/ends.\r\n\t */\r\n\tpublic readonly streamingState = new Observable<{ ts: number | null; isStreaming: boolean }>({\r\n\t\tts: null,\r\n\t\tisStreaming: false,\r\n\t})\r\n\r\n\tconstructor(options: OutputManagerOptions = {}) {\r\n\t\tthis.disabled = options.disabled ?? false\r\n\t\tthis.stdout = options.stdout ?? process.stdout\r\n\t\tthis.stderr = options.stderr ?? process.stderr\r\n\t}\r\n\r\n\t// ===========================================================================\r\n\t// Public API\r\n\t// ===========================================================================\r\n\r\n\t/**\r\n\t * Output a ClineMessage based on its type.\r\n\t * This is the main entry point for message output.\r\n\t *\r\n\t * @param msg - The message to output\r\n\t * @param skipFirstUserMessage - If true, skip the first \"text\" message (user prompt echo)\r\n\t */\r\n\toutputMessage(msg: ClineMessage, skipFirstUserMessage = true): void {\r\n\t\tconst ts = msg.ts\r\n\t\tconst text = msg.text || \"\"\r\n\t\tconst isPartial = msg.partial === true\r\n\t\tconst previousDisplay = this.displayedMessages.get(ts)\r\n\t\tconst alreadyDisplayedComplete = previousDisplay && !previousDisplay.partial\r\n\r\n\t\tif (msg.type === \"say\" && msg.say) {\r\n\t\t\tthis.outputSayMessage(ts, msg.say, text, isPartial, alreadyDisplayedComplete, skipFirstUserMessage)\r\n\t\t} else if (msg.type === \"ask\" && msg.ask) {\r\n\t\t\t// For ask messages, we only output command_output here\r\n\t\t\t// Other asks are handled by AskDispatcher\r\n\t\t\tif (msg.ask === \"command_output\") {\r\n\t\t\t\tthis.outputCommandOutput(ts, text, isPartial, alreadyDisplayedComplete)\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Output a simple text line with a label.\r\n\t */\r\n\toutput(label: string, text?: string): void {\r\n\t\tif (this.disabled) return\r\n\t\tconst message = text ? `${label} ${text}\\n` : `${label}\\n`\r\n\t\tthis.stdout.write(message)\r\n\t}\r\n\r\n\t/**\r\n\t * Output an error message.\r\n\t */\r\n\toutputError(label: string, text?: string): void {\r\n\t\tif (this.disabled) return\r\n\t\tconst message = text ? `${label} ${text}\\n` : `${label}\\n`\r\n\t\tthis.stderr.write(message)\r\n\t}\r\n\r\n\t/**\r\n\t * Write raw text to stdout (for streaming).\r\n\t */\r\n\twriteRaw(text: string): void {\r\n\t\tif (this.disabled) return\r\n\t\tthis.stdout.write(text)\r\n\t}\r\n\r\n\t/**\r\n\t * Check if a message has already been fully displayed.\r\n\t */\r\n\tisAlreadyDisplayed(ts: number): boolean {\r\n\t\tconst displayed = this.displayedMessages.get(ts)\r\n\t\treturn displayed !== undefined && !displayed.partial\r\n\t}\r\n\r\n\t/**\r\n\t * Check if we're currently streaming any message.\r\n\t */\r\n\tisCurrentlyStreaming(): boolean {\r\n\t\treturn this.currentlyStreamingTs !== null\r\n\t}\r\n\r\n\t/**\r\n\t * Get the ts of the currently streaming message.\r\n\t */\r\n\tgetCurrentlyStreamingTs(): number | null {\r\n\t\treturn this.currentlyStreamingTs\r\n\t}\r\n\r\n\t/**\r\n\t * Mark a message as displayed (useful for external coordination).\r\n\t */\r\n\tmarkDisplayed(ts: number, text: string, partial: boolean): void {\r\n\t\tthis.displayedMessages.set(ts, { ts, text, partial })\r\n\t}\r\n\r\n\t/**\r\n\t * Clear all tracking state.\r\n\t * Call this when starting a new task.\r\n\t */\r\n\tclear(): void {\r\n\t\tthis.displayedMessages.clear()\r\n\t\tthis.streamedContent.clear()\r\n\t\tthis.currentlyStreamingTs = null\r\n\t\tthis.completionResultStreamed = false\r\n\t\tthis.loggedFirstPartial.clear()\r\n\t\tthis.streamingState.next({ ts: null, isStreaming: false })\r\n\t}\r\n\r\n\t/**\r\n\t * Get debugging info about first partial logging.\r\n\t */\r\n\thasLoggedFirstPartial(ts: number): boolean {\r\n\t\treturn this.loggedFirstPartial.has(ts)\r\n\t}\r\n\r\n\t/**\r\n\t * Record that we've logged the first partial for a ts.\r\n\t */\r\n\tsetLoggedFirstPartial(ts: number): void {\r\n\t\tthis.loggedFirstPartial.add(ts)\r\n\t}\r\n\r\n\t/**\r\n\t * Clear the first partial record (when complete).\r\n\t */\r\n\tclearLoggedFirstPartial(ts: number): void {\r\n\t\tthis.loggedFirstPartial.delete(ts)\r\n\t}\r\n\r\n\t// ===========================================================================\r\n\t// Say Message Output\r\n\t// ===========================================================================\r\n\r\n\tprivate outputSayMessage(\r\n\t\tts: number,\r\n\t\tsay: ClineSay,\r\n\t\ttext: string,\r\n\t\tisPartial: boolean,\r\n\t\talreadyDisplayedComplete: boolean | undefined,\r\n\t\tskipFirstUserMessage: boolean,\r\n\t): void {\r\n\t\tswitch (say) {\r\n\t\t\tcase \"text\":\r\n\t\t\t\tthis.outputTextMessage(ts, text, isPartial, alreadyDisplayedComplete, skipFirstUserMessage)\r\n\t\t\t\tbreak\r\n\r\n\t\t\t// case \"thinking\": - not a valid ClineSay type\r\n\t\t\tcase \"reasoning\":\r\n\t\t\t\tthis.outputReasoningMessage(ts, text, isPartial, alreadyDisplayedComplete)\r\n\t\t\t\tbreak\r\n\r\n\t\t\tcase \"command_output\":\r\n\t\t\t\tthis.outputCommandOutput(ts, text, isPartial, alreadyDisplayedComplete)\r\n\t\t\t\tbreak\r\n\r\n\t\t\tcase \"completion_result\":\r\n\t\t\t\t// completion_result can arrive as both a \"say\" (with streamed text)\r\n\t\t\t\t// and an \"ask\" (handled via TaskCompleted in extension-host.ts).\r\n\t\t\t\t// Stream the say variant here; the ask variant is handled by\r\n\t\t\t\t// outputCompletionResult which will skip if already displayed.\r\n\t\t\t\tthis.outputCompletionSayMessage(ts, text, isPartial, alreadyDisplayedComplete)\r\n\t\t\t\tbreak\r\n\r\n\t\t\tcase \"error\":\r\n\t\t\t\tif (!alreadyDisplayedComplete) {\r\n\t\t\t\t\tthis.outputError(\"\\n[error]\", text || \"Unknown error\")\r\n\t\t\t\t\tthis.displayedMessages.set(ts, { ts, text: text || \"\", partial: false })\r\n\t\t\t\t}\r\n\t\t\t\tbreak\r\n\r\n\t\t\tcase \"api_req_started\":\r\n\t\t\t\t// Silent - no output needed\r\n\t\t\t\tbreak\r\n\r\n\t\t\tdefault:\r\n\t\t\t\t// NO-OP for unknown say types\r\n\t\t\t\tbreak\r\n\t\t}\r\n\t}\r\n\r\n\tprivate outputTextMessage(\r\n\t\tts: number,\r\n\t\ttext: string,\r\n\t\tisPartial: boolean,\r\n\t\talreadyDisplayedComplete: boolean | undefined,\r\n\t\tskipFirstUserMessage: boolean,\r\n\t): void {\r\n\t\t// Skip the initial user prompt echo (first message with no prior messages)\r\n\t\tif (skipFirstUserMessage && this.displayedMessages.size === 0 && !this.displayedMessages.has(ts)) {\r\n\t\t\tthis.displayedMessages.set(ts, { ts, text, partial: !!isPartial })\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tif (isPartial && text) {\r\n\t\t\t// Stream partial content\r\n\t\t\tthis.streamContent(ts, text, \"[assistant]\")\r\n\t\t\tthis.displayedMessages.set(ts, { ts, text, partial: true })\r\n\t\t} else if (!isPartial && text && !alreadyDisplayedComplete) {\r\n\t\t\t// Message complete - ensure all content is output\r\n\t\t\tconst streamed = this.streamedContent.get(ts)\r\n\r\n\t\t\tif (streamed) {\r\n\t\t\t\t// We were streaming - output any remaining delta and finish\r\n\t\t\t\tif (text.length > streamed.text.length && text.startsWith(streamed.text)) {\r\n\t\t\t\t\tconst delta = text.slice(streamed.text.length)\r\n\t\t\t\t\tthis.writeRaw(delta)\r\n\t\t\t\t}\r\n\t\t\t\tthis.finishStream(ts)\r\n\t\t\t} else {\r\n\t\t\t\t// Not streamed yet - output complete message\r\n\t\t\t\tthis.output(\"\\n[assistant]\", text)\r\n\t\t\t}\r\n\r\n\t\t\tthis.displayedMessages.set(ts, { ts, text, partial: false })\r\n\t\t\tthis.streamedContent.set(ts, { ts, text, headerShown: true })\r\n\t\t}\r\n\t}\r\n\r\n\tprivate outputReasoningMessage(\r\n\t\tts: number,\r\n\t\ttext: string,\r\n\t\tisPartial: boolean,\r\n\t\talreadyDisplayedComplete: boolean | undefined,\r\n\t): void {\r\n\t\tif (isPartial && text) {\r\n\t\t\tthis.streamContent(ts, text, \"[reasoning]\")\r\n\t\t\tthis.displayedMessages.set(ts, { ts, text, partial: true })\r\n\t\t} else if (!isPartial && text && !alreadyDisplayedComplete) {\r\n\t\t\t// Reasoning complete - finish the stream\r\n\t\t\tconst streamed = this.streamedContent.get(ts)\r\n\r\n\t\t\tif (streamed) {\r\n\t\t\t\tif (text.length > streamed.text.length && text.startsWith(streamed.text)) {\r\n\t\t\t\t\tconst delta = text.slice(streamed.text.length)\r\n\t\t\t\t\tthis.writeRaw(delta)\r\n\t\t\t\t}\r\n\t\t\t\tthis.finishStream(ts)\r\n\t\t\t} else {\r\n\t\t\t\tthis.output(\"\\n[reasoning]\", text)\r\n\t\t\t}\r\n\r\n\t\t\tthis.displayedMessages.set(ts, { ts, text, partial: false })\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Output command_output (shared between say and ask types).\r\n\t */\r\n\toutputCommandOutput(\r\n\t\tts: number,\r\n\t\ttext: string,\r\n\t\tisPartial: boolean,\r\n\t\talreadyDisplayedComplete: boolean | undefined,\r\n\t): void {\r\n\t\tif (isPartial && text) {\r\n\t\t\tthis.streamContent(ts, text, \"[command output]\")\r\n\t\t\tthis.displayedMessages.set(ts, { ts, text, partial: true })\r\n\t\t} else if (!isPartial && text && !alreadyDisplayedComplete) {\r\n\t\t\tconst streamed = this.streamedContent.get(ts)\r\n\r\n\t\t\tif (streamed) {\r\n\t\t\t\tif (text.length > streamed.text.length && text.startsWith(streamed.text)) {\r\n\t\t\t\t\tconst delta = text.slice(streamed.text.length)\r\n\t\t\t\t\tthis.writeRaw(delta)\r\n\t\t\t\t}\r\n\t\t\t\tthis.finishStream(ts)\r\n\t\t\t} else {\r\n\t\t\t\tthis.writeRaw(\"\\n[command output] \")\r\n\t\t\t\tthis.writeRaw(text)\r\n\t\t\t\tthis.writeRaw(\"\\n\")\r\n\t\t\t}\r\n\r\n\t\t\tthis.displayedMessages.set(ts, { ts, text, partial: false })\r\n\t\t\tthis.streamedContent.set(ts, { ts, text, headerShown: true })\r\n\t\t}\r\n\t}\r\n\r\n\t// ===========================================================================\r\n\t// Streaming Helpers\r\n\t// ===========================================================================\r\n\r\n\t/**\r\n\t * Stream content with delta computation - only output new characters.\r\n\t */\r\n\tstreamContent(ts: number, text: string, header: string): void {\r\n\t\tconst previous = this.streamedContent.get(ts)\r\n\r\n\t\tif (!previous) {\r\n\t\t\t// First time seeing this message - output header and initial text\r\n\t\t\tthis.writeRaw(`\\n${header} `)\r\n\t\t\tthis.writeRaw(text)\r\n\t\t\tthis.streamedContent.set(ts, { ts, text, headerShown: true })\r\n\t\t\tthis.currentlyStreamingTs = ts\r\n\t\t\tthis.streamingState.next({ ts, isStreaming: true })\r\n\t\t} else if (text.length > previous.text.length && text.startsWith(previous.text)) {\r\n\t\t\t// Text has grown - output delta\r\n\t\t\tconst delta = text.slice(previous.text.length)\r\n\t\t\tthis.writeRaw(delta)\r\n\t\t\tthis.streamedContent.set(ts, { ts, text, headerShown: true })\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Finish streaming a message (add newline).\r\n\t */\r\n\tfinishStream(ts: number): void {\r\n\t\tif (this.currentlyStreamingTs === ts) {\r\n\t\t\tthis.writeRaw(\"\\n\")\r\n\t\t\tthis.currentlyStreamingTs = null\r\n\t\t\tthis.streamingState.next({ ts: null, isStreaming: false })\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Output a say:completion_result message (streamed text of the completion).\r\n\t * The subsequent ask:completion_result is handled by outputCompletionResult.\r\n\t */\r\n\tprivate outputCompletionSayMessage(\r\n\t\tts: number,\r\n\t\ttext: string,\r\n\t\tisPartial: boolean,\r\n\t\talreadyDisplayedComplete: boolean | undefined,\r\n\t): void {\r\n\t\tif (isPartial && text) {\r\n\t\t\tthis.streamContent(ts, text, \"[assistant]\")\r\n\t\t\tthis.displayedMessages.set(ts, { ts, text, partial: true })\r\n\t\t\tthis.completionResultStreamed = true\r\n\t\t} else if (!isPartial && text && !alreadyDisplayedComplete) {\r\n\t\t\tconst streamed = this.streamedContent.get(ts)\r\n\r\n\t\t\tif (streamed) {\r\n\t\t\t\tif (text.length > streamed.text.length && text.startsWith(streamed.text)) {\r\n\t\t\t\t\tconst delta = text.slice(streamed.text.length)\r\n\t\t\t\t\tthis.writeRaw(delta)\r\n\t\t\t\t}\r\n\t\t\t\tthis.finishStream(ts)\r\n\t\t\t} else {\r\n\t\t\t\tthis.output(\"\\n[assistant]\", text)\r\n\t\t\t}\r\n\r\n\t\t\tthis.displayedMessages.set(ts, { ts, text, partial: false })\r\n\t\t\tthis.completionResultStreamed = true\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Output completion message (called from TaskCompleted handler).\r\n\t */\r\n\toutputCompletionResult(ts: number, text: string): void {\r\n\t\tconst previousDisplay = this.displayedMessages.get(ts)\r\n\t\tif (!previousDisplay || previousDisplay.partial) {\r\n\t\t\tif (this.completionResultStreamed) {\r\n\t\t\t\t// Text was already streamed via say:completion_result.\r\n\t\t\t\tthis.output(\"\\n[task complete]\")\r\n\t\t\t} else {\r\n\t\t\t\tthis.output(\"\\n[task complete]\", text || \"\")\r\n\t\t\t}\r\n\t\t\tthis.displayedMessages.set(ts, { ts, text: text || \"\", partial: false })\r\n\t\t}\r\n\t}\r\n}\r\n","/**\n * PromptManager - Handles all user input collection\n *\n * This manager is responsible for:\n * - Collecting user input via readline\n * - Yes/No prompts with proper defaults\n * - Timed prompts that auto-select after timeout\n * - Raw mode input for character-by-character handling\n *\n * Design notes:\n * - Single responsibility: User input only (no output formatting)\n * - Returns Promises for all input operations\n * - Handles console mode switching (quiet mode restore)\n * - Can be disabled for programmatic (non-interactive) use\n */\n\nimport readline from \"readline\"\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Configuration options for PromptManager.\n */\nexport interface PromptManagerOptions {\n\t/**\n\t * Called before prompting to restore console output.\n\t * Used to exit quiet mode temporarily.\n\t */\n\tonBeforePrompt?: () => void\n\n\t/**\n\t * Called after prompting to re-enable quiet mode.\n\t */\n\tonAfterPrompt?: () => void\n\n\t/**\n\t * Stream for input (default: process.stdin).\n\t */\n\tstdin?: NodeJS.ReadStream\n\n\t/**\n\t * Stream for prompt output (default: process.stdout).\n\t */\n\tstdout?: NodeJS.WriteStream\n}\n\n/**\n * Result of a timed prompt.\n */\nexport interface TimedPromptResult {\n\t/** The user's input, or default if timed out */\n\tvalue: string\n\t/** Whether the result came from timeout */\n\ttimedOut: boolean\n\t/** Whether the user cancelled (Ctrl+C) */\n\tcancelled: boolean\n}\n\n// =============================================================================\n// PromptManager Class\n// =============================================================================\n\nexport class PromptManager {\n\tprivate onBeforePrompt?: () => void\n\tprivate onAfterPrompt?: () => void\n\tprivate stdin: NodeJS.ReadStream\n\tprivate stdout: NodeJS.WriteStream\n\n\t/**\n\t * Track if a prompt is currently active.\n\t */\n\tprivate isPrompting = false\n\n\tconstructor(options: PromptManagerOptions = {}) {\n\t\tthis.onBeforePrompt = options.onBeforePrompt\n\t\tthis.onAfterPrompt = options.onAfterPrompt\n\t\tthis.stdin = options.stdin ?? (process.stdin as NodeJS.ReadStream)\n\t\tthis.stdout = options.stdout ?? process.stdout\n\t}\n\n\t// ===========================================================================\n\t// Public API\n\t// ===========================================================================\n\n\t/**\n\t * Check if a prompt is currently active.\n\t */\n\tisActive(): boolean {\n\t\treturn this.isPrompting\n\t}\n\n\t/**\n\t * Prompt for text input using readline.\n\t *\n\t * @param prompt - The prompt text to display\n\t * @returns The user's input\n\t * @throws If input is cancelled or an error occurs\n\t */\n\tasync promptForInput(prompt: string): Promise<string> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.beforePrompt()\n\t\t\tthis.isPrompting = true\n\n\t\t\tconst rl = readline.createInterface({\n\t\t\t\tinput: this.stdin,\n\t\t\t\toutput: this.stdout,\n\t\t\t})\n\n\t\t\trl.question(prompt, (answer) => {\n\t\t\t\trl.close()\n\t\t\t\tthis.isPrompting = false\n\t\t\t\tthis.afterPrompt()\n\t\t\t\tresolve(answer)\n\t\t\t})\n\n\t\t\trl.on(\"close\", () => {\n\t\t\t\tthis.isPrompting = false\n\t\t\t\tthis.afterPrompt()\n\t\t\t})\n\n\t\t\trl.on(\"error\", (err) => {\n\t\t\t\trl.close()\n\t\t\t\tthis.isPrompting = false\n\t\t\t\tthis.afterPrompt()\n\t\t\t\treject(err)\n\t\t\t})\n\t\t})\n\t}\n\n\t/**\n\t * Prompt for yes/no input.\n\t *\n\t * @param prompt - The prompt text to display\n\t * @param defaultValue - Default value if empty input (default: false)\n\t * @returns true for yes, false for no\n\t */\n\tasync promptForYesNo(prompt: string, defaultValue = false): Promise<boolean> {\n\t\tconst answer = await this.promptForInput(prompt)\n\t\tconst normalized = answer.trim().toLowerCase()\n\t\tif (normalized === \"\" && defaultValue !== undefined) {\n\t\t\treturn defaultValue\n\t\t}\n\t\treturn normalized === \"y\" || normalized === \"yes\"\n\t}\n\n\t/**\n\t * Prompt for input with a timeout.\n\t * Uses raw mode for character-by-character input handling.\n\t *\n\t * @param prompt - The prompt text to display\n\t * @param timeoutMs - Timeout in milliseconds\n\t * @param defaultValue - Value to use if timed out\n\t * @returns TimedPromptResult with value, timedOut flag, and cancelled flag\n\t */\n\tasync promptWithTimeout(prompt: string, timeoutMs: number, defaultValue: string): Promise<TimedPromptResult> {\n\t\treturn new Promise((resolve) => {\n\t\t\tthis.beforePrompt()\n\t\t\tthis.isPrompting = true\n\n\t\t\t// Track the original raw mode state to restore it later\n\t\t\tconst wasRaw = this.stdin.isRaw\n\n\t\t\t// Enable raw mode for character-by-character input if TTY\n\t\t\tif (this.stdin.isTTY) {\n\t\t\t\tthis.stdin.setRawMode(true)\n\t\t\t}\n\n\t\t\tthis.stdin.resume()\n\n\t\t\tlet inputBuffer = \"\"\n\t\t\tlet timeoutCancelled = false\n\t\t\tlet resolved = false\n\n\t\t\t// Set up timeout\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\tif (!resolved) {\n\t\t\t\t\tresolved = true\n\t\t\t\t\tcleanup()\n\t\t\t\t\tthis.stdout.write(`\\n[Timeout - using default: ${defaultValue || \"(empty)\"}]\\n`)\n\t\t\t\t\tresolve({ value: defaultValue, timedOut: true, cancelled: false })\n\t\t\t\t}\n\t\t\t}, timeoutMs)\n\n\t\t\t// Display prompt\n\t\t\tthis.stdout.write(prompt)\n\n\t\t\t// Cleanup function to restore state\n\t\t\tconst cleanup = () => {\n\t\t\t\tclearTimeout(timeout)\n\t\t\t\tthis.stdin.removeListener(\"data\", onData)\n\n\t\t\t\tif (this.stdin.isTTY && wasRaw !== undefined) {\n\t\t\t\t\tthis.stdin.setRawMode(wasRaw)\n\t\t\t\t}\n\n\t\t\t\tthis.stdin.pause()\n\t\t\t\tthis.isPrompting = false\n\t\t\t\tthis.afterPrompt()\n\t\t\t}\n\n\t\t\t// Handle incoming data\n\t\t\tconst onData = (data: Buffer) => {\n\t\t\t\tconst char = data.toString()\n\n\t\t\t\t// Handle Ctrl+C\n\t\t\t\tif (char === \"\\x03\") {\n\t\t\t\t\tcleanup()\n\t\t\t\t\tresolved = true\n\t\t\t\t\tthis.stdout.write(\"\\n[cancelled]\\n\")\n\t\t\t\t\tresolve({ value: defaultValue, timedOut: false, cancelled: true })\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// Cancel timeout on first input\n\t\t\t\tif (!timeoutCancelled) {\n\t\t\t\t\ttimeoutCancelled = true\n\t\t\t\t\tclearTimeout(timeout)\n\t\t\t\t}\n\n\t\t\t\t// Handle Enter\n\t\t\t\tif (char === \"\\r\" || char === \"\\n\") {\n\t\t\t\t\tif (!resolved) {\n\t\t\t\t\t\tresolved = true\n\t\t\t\t\t\tcleanup()\n\t\t\t\t\t\tthis.stdout.write(\"\\n\")\n\t\t\t\t\t\tresolve({ value: inputBuffer, timedOut: false, cancelled: false })\n\t\t\t\t\t}\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// Handle Backspace\n\t\t\t\tif (char === \"\\x7f\" || char === \"\\b\") {\n\t\t\t\t\tif (inputBuffer.length > 0) {\n\t\t\t\t\t\tinputBuffer = inputBuffer.slice(0, -1)\n\t\t\t\t\t\tthis.stdout.write(\"\\b \\b\")\n\t\t\t\t\t}\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// Normal character - add to buffer and echo\n\t\t\t\tinputBuffer += char\n\t\t\t\tthis.stdout.write(char)\n\t\t\t}\n\n\t\t\tthis.stdin.on(\"data\", onData)\n\t\t})\n\t}\n\n\t/**\n\t * Prompt for yes/no with timeout.\n\t *\n\t * @param prompt - The prompt text to display\n\t * @param timeoutMs - Timeout in milliseconds\n\t * @param defaultValue - Default boolean value if timed out\n\t * @returns true for yes, false for no\n\t */\n\tasync promptForYesNoWithTimeout(prompt: string, timeoutMs: number, defaultValue: boolean): Promise<boolean> {\n\t\tconst result = await this.promptWithTimeout(prompt, timeoutMs, defaultValue ? \"y\" : \"n\")\n\t\tconst normalized = result.value.trim().toLowerCase()\n\t\tif (result.timedOut || result.cancelled || normalized === \"\") {\n\t\t\treturn defaultValue\n\t\t}\n\t\treturn normalized === \"y\" || normalized === \"yes\"\n\t}\n\n\t/**\n\t * Display a message on stdout (utility for prompting context).\n\t */\n\twrite(text: string): void {\n\t\tthis.stdout.write(text)\n\t}\n\n\t/**\n\t * Display a message with newline.\n\t */\n\twriteLine(text: string): void {\n\t\tthis.stdout.write(text + \"\\n\")\n\t}\n\n\t// ===========================================================================\n\t// Private Helpers\n\t// ===========================================================================\n\n\tprivate beforePrompt(): void {\n\t\tif (this.onBeforePrompt) {\n\t\t\tthis.onBeforePrompt()\n\t\t}\n\t}\n\n\tprivate afterPrompt(): void {\n\t\tif (this.onAfterPrompt) {\n\t\t\tthis.onAfterPrompt()\n\t\t}\n\t}\n}\n","/**\r\n * AskDispatcher - Routes ask messages to appropriate handlers\r\n *\r\n * This dispatcher is responsible for:\r\n * - Categorizing ask types using type guards from client module\r\n * - Routing to the appropriate handler based on ask category\r\n * - Coordinating between OutputManager and PromptManager\r\n * - Tracking which asks have been handled (to avoid duplicates)\r\n *\r\n * Design notes:\r\n * - Uses isIdleAsk, isInteractiveAsk, isResumableAsk, isNonBlockingAsk type guards\r\n * - Single responsibility: Ask routing and handling only\r\n * - Delegates output to OutputManager, input to PromptManager\r\n * - Sends responses back through a provided callback\r\n */\r\n\r\nimport {\r\n\ttype WebviewMessage,\r\n\ttype ClineMessage,\r\n\ttype ClineAsk,\r\n\ttype ClineAskResponse,\r\n\tisIdleAsk,\r\n\tisInteractiveAsk,\r\n\tisResumableAsk,\r\nisNonBlockingAsk,\n} from \"../../types\"\nimport { debugLog } from \"../../core/debug-log/index.js\"\n\nimport { FOLLOWUP_TIMEOUT_SECONDS } from \"../types/index.js\"\n\r\nimport type { OutputManager } from \"./output-manager.js\"\r\nimport type { PromptManager } from \"./prompt-manager.js\"\r\n\r\n// =============================================================================\r\n// Types\r\n// =============================================================================\r\n\r\n/**\r\n * Configuration for AskDispatcher.\r\n */\r\nexport interface AskDispatcherOptions {\r\n\t/**\r\n\t * OutputManager for displaying ask-related output.\r\n\t */\r\n\toutputManager: OutputManager\r\n\r\n\t/**\r\n\t * PromptManager for collecting user input.\r\n\t */\r\n\tpromptManager: PromptManager\r\n\r\n\t/**\r\n\t * Callback to send responses to the extension.\r\n\t */\r\n\tsendMessage: (message: WebviewMessage) => void\r\n\r\n\t/**\r\n\t * Whether running in non-interactive mode (auto-approve).\r\n\t */\r\n\tnonInteractive?: boolean\r\n\r\n\t/**\r\n\t * Whether to exit on API request errors instead of retrying.\r\n\t */\r\n\texitOnError?: boolean\r\n\r\n\t/**\r\n\t * Whether to disable ask handling (for TUI mode).\r\n\t * In TUI mode, the TUI handles asks directly.\r\n\t */\r\n\tdisabled?: boolean\r\n}\r\n\r\n/**\r\n * Result of handling an ask.\r\n */\r\nexport interface AskHandleResult {\r\n\t/** Whether the ask was handled */\r\n\thandled: boolean\r\n\t/** The response sent (if any) */\r\n\tresponse?: ClineAskResponse\r\n\t/** Any error that occurred */\r\n\terror?: Error\r\n}\r\n\r\n// =============================================================================\r\n// AskDispatcher Class\r\n// =============================================================================\r\n\r\nexport class AskDispatcher {\r\n\tprivate outputManager: OutputManager\r\n\tprivate promptManager: PromptManager\r\n\tprivate sendMessage: (message: WebviewMessage) => void\r\n\tprivate nonInteractive: boolean\r\n\tprivate exitOnError: boolean\r\n\tprivate disabled: boolean\r\n\r\n\t/**\r\n\t * Track which asks have been handled to avoid duplicates.\r\n\t * Key: message ts\r\n\t */\r\n\tprivate handledAsks = new Set<number>()\r\n\r\n\tconstructor(options: AskDispatcherOptions) {\r\n\t\tthis.outputManager = options.outputManager\r\n\t\tthis.promptManager = options.promptManager\r\n\t\tthis.sendMessage = options.sendMessage\r\n\t\tthis.nonInteractive = options.nonInteractive ?? false\r\n\t\tthis.exitOnError = options.exitOnError ?? false\r\n\t\tthis.disabled = options.disabled ?? false\r\n\t}\r\n\r\n\t// ===========================================================================\r\n\t// Public API\r\n\t// ===========================================================================\r\n\r\n\t/**\r\n\t * Handle an ask message.\r\n\t * Routes to the appropriate handler based on ask type.\r\n\t *\r\n\t * @param message - The ClineMessage with type=\"ask\"\r\n\t * @returns Promise<AskHandleResult>\r\n\t */\r\n\tasync handleAsk(message: ClineMessage): Promise<AskHandleResult> {\r\n\t\t// Disabled in TUI mode - TUI handles asks directly\r\n\t\tif (this.disabled) {\r\n\t\t\treturn { handled: false }\r\n\t\t}\r\n\r\n\t\tconst ts = message.ts\r\n\t\tconst ask = message.ask\r\n\t\tconst text = message.text || \"\"\r\n\r\n\t\t// Check if already handled\r\n\t\tif (this.handledAsks.has(ts)) {\r\n\t\t\treturn { handled: true }\r\n\t\t}\r\n\r\n\t\t// Must be an ask message\r\n\t\tif (message.type !== \"ask\" || !ask) {\r\n\t\t\treturn { handled: false }\r\n\t\t}\r\n\r\n\t\t// Skip partial messages (wait for complete)\r\n\t\tif (message.partial) {\r\n\t\t\treturn { handled: false }\r\n\t\t}\r\n\r\n\t\t// Mark as being handled\r\n\t\tthis.handledAsks.add(ts)\r\n\r\n\t\ttry {\r\n\t\t\t// Route based on ask category\r\n\t\t\tif (isNonBlockingAsk(ask)) {\r\n\t\t\t\treturn await this.handleNonBlockingAsk(ts, ask, text)\r\n\t\t\t}\r\n\r\n\t\t\tif (isIdleAsk(ask)) {\r\n\t\t\t\treturn await this.handleIdleAsk(ts, ask, text)\r\n\t\t\t}\r\n\r\n\t\t\tif (isResumableAsk(ask)) {\r\n\t\t\t\treturn await this.handleResumableAsk(ts, ask, text)\r\n\t\t\t}\r\n\r\n\t\t\tif (isInteractiveAsk(ask)) {\r\n\t\t\t\treturn await this.handleInteractiveAsk(ts, ask, text)\r\n\t\t\t}\r\n\r\n\t\t\t// Unknown ask type - log and handle generically\r\n\t\t\tdebugLog(\"[AskDispatcher] Unknown ask type\", { ask, ts })\r\n\t\t\treturn await this.handleUnknownAsk(ts, ask, text)\r\n\t\t} catch (error) {\r\n\t\t\t// Re-allow handling on error\r\n\t\t\tthis.handledAsks.delete(ts)\r\n\t\t\treturn {\r\n\t\t\t\thandled: false,\r\n\t\t\t\terror: error instanceof Error ? error : new Error(String(error)),\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Check if an ask has been handled.\r\n\t */\r\n\tisHandled(ts: number): boolean {\r\n\t\treturn this.handledAsks.has(ts)\r\n\t}\r\n\r\n\t/**\r\n\t * Clear handled asks (call when starting new task).\r\n\t */\r\n\tclear(): void {\r\n\t\tthis.handledAsks.clear()\r\n\t}\r\n\r\n\t// ===========================================================================\r\n\t// Category Handlers\r\n\t// ===========================================================================\r\n\r\n\t/**\r\n\t * Handle non-blocking asks (command_output).\r\n\t * These don't actually block the agent - just need acknowledgment.\r\n\t */\r\n\tprivate async handleNonBlockingAsk(_ts: number, _ask: ClineAsk, _text: string): Promise<AskHandleResult> {\r\n\t\t// command_output - output is handled by OutputManager\r\n\t\t// Just send approval to continue\r\n\t\tthis.sendApprovalResponse(true)\r\n\t\treturn { handled: true, response: \"yesButtonClicked\" }\r\n\t}\r\n\r\n\t/**\r\n\t * Handle idle asks (completion_result, api_req_failed, etc.).\r\n\t * These indicate the task has stopped.\r\n\t */\r\n\tprivate async handleIdleAsk(ts: number, ask: ClineAsk, text: string): Promise<AskHandleResult> {\r\n\t\tswitch (ask) {\r\n\t\t\tcase \"completion_result\":\r\n\t\t\t\t// Task complete - nothing to do here, TaskCompleted event handles it\r\n\t\t\t\treturn { handled: true }\r\n\r\n\t\t\tcase \"api_req_failed\":\r\n\t\t\t\treturn await this.handleApiFailedRetry(ts, text)\r\n\r\n\t\t\tcase \"mistake_limit_reached\":\r\n\t\t\t\treturn await this.handleMistakeLimitReached(ts, text)\r\n\r\n\t\t\tcase \"resume_completed_task\":\r\n\t\t\t\treturn await this.handleResumeTask(ts, ask, text)\r\n\r\n\t\t\tcase \"auto_approval_max_req_reached\":\r\n\t\t\t\treturn await this.handleAutoApprovalMaxReached(ts, text)\r\n\r\n\t\t\tdefault:\r\n\t\t\t\treturn { handled: false }\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handle resumable asks (resume_task).\r\n\t */\r\n\tprivate async handleResumableAsk(ts: number, ask: ClineAsk, text: string): Promise<AskHandleResult> {\r\n\t\treturn await this.handleResumeTask(ts, ask, text)\r\n\t}\r\n\r\n\t/**\r\n\t * Handle interactive asks (followup, command, tool, use_mcp_server).\r\n\t * These require user approval or input.\r\n\t */\r\n\tprivate async handleInteractiveAsk(ts: number, ask: ClineAsk, text: string): Promise<AskHandleResult> {\r\n\t\tswitch (ask) {\r\n\t\t\tcase \"followup\":\r\n\t\t\t\treturn await this.handleFollowupQuestion(ts, text)\r\n\r\n\t\t\tcase \"command\":\r\n\t\t\t\treturn await this.handleCommandApproval(ts, text)\r\n\r\n\t\t\tcase \"tool\":\r\n\t\t\t\treturn await this.handleToolApproval(ts, text)\r\n\r\n\t\t\tcase \"use_mcp_server\":\r\n\t\t\t\treturn await this.handleMcpApproval(ts, text)\r\n\r\n\t\t\tdefault:\r\n\t\t\t\treturn { handled: false }\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handle unknown ask types.\r\n\t */\r\n\tprivate async handleUnknownAsk(ts: number, ask: ClineAsk, text: string): Promise<AskHandleResult> {\r\n\t\tif (this.nonInteractive) {\r\n\t\t\tif (text) {\r\n\t\t\t\tthis.outputManager.output(`\\n[${ask}]`, text)\r\n\t\t\t}\r\n\t\t\treturn { handled: true }\r\n\t\t}\r\n\r\n\t\treturn await this.handleGenericApproval(ts, ask, text)\r\n\t}\r\n\r\n\t// ===========================================================================\r\n\t// Specific Ask Handlers\r\n\t// ===========================================================================\r\n\r\n\t/**\r\n\t * Handle followup questions - prompt for text input with suggestions.\r\n\t */\r\n\tprivate async handleFollowupQuestion(ts: number, text: string): Promise<AskHandleResult> {\r\n\t\tlet question = text\r\n\t\tlet suggestions: Array<{ answer: string; mode?: string | null }> = []\r\n\r\n\t\ttry {\r\n\t\t\tconst data = JSON.parse(text)\r\n\t\t\tquestion = data.question || text\r\n\t\t\tsuggestions = Array.isArray(data.suggest) ? data.suggest : []\r\n\t\t} catch {\r\n\t\t\t// Use raw text if not JSON\r\n\t\t}\r\n\r\n\t\tthis.outputManager.output(\"\\n[question]\", question)\r\n\r\n\t\tif (suggestions.length > 0) {\r\n\t\t\tthis.outputManager.output(\"\\nSuggested answers:\")\r\n\t\t\tsuggestions.forEach((suggestion, index) => {\r\n\t\t\t\tconst suggestionText = suggestion.answer || String(suggestion)\r\n\t\t\t\tconst modeHint = suggestion.mode ? ` (mode: ${suggestion.mode})` : \"\"\r\n\t\t\t\tthis.outputManager.output(` ${index + 1}. ${suggestionText}${modeHint}`)\r\n\t\t\t})\r\n\t\t\tthis.outputManager.output(\"\")\r\n\t\t}\r\n\r\n\t\tconst firstSuggestion = suggestions.length > 0 ? suggestions[0] : null\r\n\t\tconst defaultAnswer = firstSuggestion?.answer ?? \"\"\r\n\r\n\t\tif (this.nonInteractive) {\r\n\t\t\t// In non-interactive mode (YOLO), automatically respond with the default answer\r\n\t\t\t// without prompting the user. This ensures scripts and automation work smoothly.\r\n\t\t\tthis.sendFollowupResponse(defaultAnswer)\r\n\t\t\treturn { handled: true, response: \"messageResponse\" }\r\n\t\t}\r\n\r\n\t\t// Interactive mode\r\n\t\ttry {\r\n\t\t\tconst answer = await this.promptManager.promptForInput(\r\n\t\t\t\tsuggestions.length > 0\r\n\t\t\t\t\t? `Enter number (1-${suggestions.length}) or type your answer: `\r\n\t\t\t\t\t: \"Your answer: \",\r\n\t\t\t)\r\n\r\n\t\t\tlet responseText = answer.trim()\r\n\t\t\tresponseText = this.resolveNumberedSuggestion(responseText, suggestions)\r\n\r\n\t\t\tthis.sendFollowupResponse(responseText)\r\n\t\t\treturn { handled: true, response: \"messageResponse\" }\r\n\t\t} catch {\r\n\t\t\tthis.outputManager.output(`[Using default: ${defaultAnswer || \"(empty)\"}]`)\r\n\t\t\tthis.sendFollowupResponse(defaultAnswer)\r\n\t\t\treturn { handled: true, response: \"messageResponse\" }\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handle command execution approval.\r\n\t */\r\n\tprivate async handleCommandApproval(ts: number, text: string): Promise<AskHandleResult> {\r\n\t\tthis.outputManager.output(\"\\n[command request]\")\r\n\t\tthis.outputManager.output(` Command: ${text || \"(no command specified)\"}`)\r\n\t\tthis.outputManager.markDisplayed(ts, text || \"\", false)\r\n\r\n\t\tif (this.nonInteractive) {\r\n\t\t\t// Auto-approved by extension settings\r\n\t\t\treturn { handled: true }\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\tconst approved = await this.promptManager.promptForYesNo(\"Execute this command? (y/n): \")\r\n\t\t\tthis.sendApprovalResponse(approved)\r\n\t\t\treturn { handled: true, response: approved ? \"yesButtonClicked\" : \"noButtonClicked\" }\r\n\t\t} catch {\r\n\t\t\tthis.outputManager.output(\"[Defaulting to: no]\")\r\n\t\t\tthis.sendApprovalResponse(false)\r\n\t\t\treturn { handled: true, response: \"noButtonClicked\" }\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handle tool execution approval.\r\n\t */\r\n\tprivate async handleToolApproval(ts: number, text: string): Promise<AskHandleResult> {\r\n\t\tlet toolName = \"unknown\"\r\n\t\tlet toolInfo: Record<string, unknown> = {}\r\n\r\n\t\ttry {\r\n\t\t\ttoolInfo = JSON.parse(text) as Record<string, unknown>\r\n\t\t\ttoolName = (toolInfo.tool as string) || \"unknown\"\r\n\t\t} catch {\r\n\t\t\t// Use raw text if not JSON\r\n\t\t}\r\n\r\n\t\tconst isProtected = toolInfo.isProtected === true\r\n\r\n\t\tif (isProtected) {\r\n\t\t\tthis.outputManager.output(`\\n[Tool Request] ${toolName} [PROTECTED CONFIGURATION FILE]`)\r\n\t\t\tthis.outputManager.output(`⚠️ WARNING: This tool wants to modify a protected configuration file.`)\r\n\t\t\tthis.outputManager.output(\r\n\t\t\t\t` Protected files include .rooignore, .roo/*, and other sensitive config files.`,\r\n\t\t\t)\r\n\t\t} else {\r\n\t\t\tthis.outputManager.output(`\\n[Tool Request] ${toolName}`)\r\n\t\t}\r\n\r\n\t\t// Display tool details\r\n\t\tfor (const [key, value] of Object.entries(toolInfo)) {\r\n\t\t\tif (key === \"tool\" || key === \"isProtected\") continue\r\n\r\n\t\t\tlet displayValue: string\r\n\t\t\tif (typeof value === \"string\") {\r\n\t\t\t\tdisplayValue = value.length > 200 ? value.substring(0, 200) + \"...\" : value\r\n\t\t\t} else if (typeof value === \"object\" && value !== null) {\r\n\t\t\t\tconst json = JSON.stringify(value)\r\n\t\t\t\tdisplayValue = json.length > 200 ? json.substring(0, 200) + \"...\" : json\r\n\t\t\t} else {\r\n\t\t\t\tdisplayValue = String(value)\r\n\t\t\t}\r\n\r\n\t\t\tthis.outputManager.output(` ${key}: ${displayValue}`)\r\n\t\t}\r\n\r\n\t\tthis.outputManager.markDisplayed(ts, text || \"\", false)\r\n\r\n\t\tif (this.nonInteractive) {\r\n\t\t\t// Auto-approved by extension settings (unless protected)\r\n\t\t\treturn { handled: true }\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\tconst approved = await this.promptManager.promptForYesNo(\"Approve this action? (y/n): \")\r\n\t\t\tthis.sendApprovalResponse(approved)\r\n\t\t\treturn { handled: true, response: approved ? \"yesButtonClicked\" : \"noButtonClicked\" }\r\n\t\t} catch {\r\n\t\t\tthis.outputManager.output(\"[Defaulting to: no]\")\r\n\t\t\tthis.sendApprovalResponse(false)\r\n\t\t\treturn { handled: true, response: \"noButtonClicked\" }\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handle MCP server access approval.\r\n\t */\r\n\tprivate async handleMcpApproval(ts: number, text: string): Promise<AskHandleResult> {\r\n\t\tlet serverName = \"unknown\"\r\n\t\tlet toolName = \"\"\r\n\t\tlet resourceUri = \"\"\r\n\r\n\t\ttry {\r\n\t\t\tconst mcpInfo = JSON.parse(text)\r\n\t\t\tserverName = mcpInfo.server_name || \"unknown\"\r\n\r\n\t\t\tif (mcpInfo.type === \"use_mcp_tool\") {\r\n\t\t\t\ttoolName = mcpInfo.tool_name || \"\"\r\n\t\t\t} else if (mcpInfo.type === \"access_mcp_resource\") {\r\n\t\t\t\tresourceUri = mcpInfo.uri || \"\"\r\n\t\t\t}\r\n\t\t} catch {\r\n\t\t\t// Use raw text if not JSON\r\n\t\t}\r\n\r\n\t\tthis.outputManager.output(\"\\n[mcp request]\")\r\n\t\tthis.outputManager.output(` Server: ${serverName}`)\r\n\t\tif (toolName) {\r\n\t\t\tthis.outputManager.output(` Tool: ${toolName}`)\r\n\t\t}\r\n\t\tif (resourceUri) {\r\n\t\t\tthis.outputManager.output(` Resource: ${resourceUri}`)\r\n\t\t}\r\n\t\tthis.outputManager.markDisplayed(ts, text || \"\", false)\r\n\r\n\t\tif (this.nonInteractive) {\r\n\t\t\t// Auto-approved by extension settings\r\n\t\t\treturn { handled: true }\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\tconst approved = await this.promptManager.promptForYesNo(\"Allow MCP access? (y/n): \")\r\n\t\t\tthis.sendApprovalResponse(approved)\r\n\t\t\treturn { handled: true, response: approved ? \"yesButtonClicked\" : \"noButtonClicked\" }\r\n\t\t} catch {\r\n\t\t\tthis.outputManager.output(\"[Defaulting to: no]\")\r\n\t\t\tthis.sendApprovalResponse(false)\r\n\t\t\treturn { handled: true, response: \"noButtonClicked\" }\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handle API request failed - retry prompt.\r\n\t */\r\n\tprivate async handleApiFailedRetry(ts: number, text: string): Promise<AskHandleResult> {\r\n\t\tthis.outputManager.output(\"\\n[api request failed]\")\r\n\t\tthis.outputManager.output(` Error: ${text || \"Unknown error\"}`)\r\n\t\tthis.outputManager.markDisplayed(ts, text || \"\", false)\r\n\r\n\t\tif (this.exitOnError) {\r\n\t\t\tconsole.error(`[CLI] API request failed: ${text || \"Unknown error\"}`)\r\n\t\t\tprocess.exit(1)\r\n\t\t}\r\n\r\n\t\tif (this.nonInteractive) {\r\n\t\t\tthis.outputManager.output(\"\\n[retrying api request]\")\r\n\t\t\t// Auto-retry in non-interactive mode\r\n\t\t\treturn { handled: true }\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\tconst retry = await this.promptManager.promptForYesNo(\"Retry the request? (y/n): \")\r\n\t\t\tthis.sendApprovalResponse(retry)\r\n\t\t\treturn { handled: true, response: retry ? \"yesButtonClicked\" : \"noButtonClicked\" }\r\n\t\t} catch {\r\n\t\t\tthis.outputManager.output(\"[Defaulting to: no]\")\r\n\t\t\tthis.sendApprovalResponse(false)\r\n\t\t\treturn { handled: true, response: \"noButtonClicked\" }\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handle mistake limit reached.\r\n\t */\r\n\tprivate async handleMistakeLimitReached(ts: number, text: string): Promise<AskHandleResult> {\r\n\t\tthis.outputManager.output(\"\\n[mistake limit reached]\")\r\n\t\tif (text) {\r\n\t\t\tthis.outputManager.output(` Details: ${text}`)\r\n\t\t}\r\n\t\tthis.outputManager.markDisplayed(ts, text || \"\", false)\r\n\r\n\t\tif (this.nonInteractive) {\r\n\t\t\t// Auto-proceed in non-interactive mode\r\n\t\t\tthis.sendApprovalResponse(true)\r\n\t\t\treturn { handled: true, response: \"yesButtonClicked\" }\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\tconst proceed = await this.promptManager.promptForYesNo(\"Continue anyway? (y/n): \")\r\n\t\t\tthis.sendApprovalResponse(proceed)\r\n\t\t\treturn { handled: true, response: proceed ? \"yesButtonClicked\" : \"noButtonClicked\" }\r\n\t\t} catch {\r\n\t\t\tthis.outputManager.output(\"[Defaulting to: no]\")\r\n\t\t\tthis.sendApprovalResponse(false)\r\n\t\t\treturn { handled: true, response: \"noButtonClicked\" }\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handle auto-approval max reached.\r\n\t */\r\n\tprivate async handleAutoApprovalMaxReached(ts: number, text: string): Promise<AskHandleResult> {\r\n\t\tthis.outputManager.output(\"\\n[auto-approval limit reached]\")\r\n\t\tif (text) {\r\n\t\t\tthis.outputManager.output(` Details: ${text}`)\r\n\t\t}\r\n\t\tthis.outputManager.markDisplayed(ts, text || \"\", false)\r\n\r\n\t\tif (this.nonInteractive) {\r\n\t\t\t// Auto-proceed in non-interactive mode\r\n\t\t\tthis.sendApprovalResponse(true)\r\n\t\t\treturn { handled: true, response: \"yesButtonClicked\" }\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\tconst proceed = await this.promptManager.promptForYesNo(\"Continue with manual approval? (y/n): \")\r\n\t\t\tthis.sendApprovalResponse(proceed)\r\n\t\t\treturn { handled: true, response: proceed ? \"yesButtonClicked\" : \"noButtonClicked\" }\r\n\t\t} catch {\r\n\t\t\tthis.outputManager.output(\"[Defaulting to: no]\")\r\n\t\t\tthis.sendApprovalResponse(false)\r\n\t\t\treturn { handled: true, response: \"noButtonClicked\" }\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handle task resume prompt.\r\n\t */\r\n\tprivate async handleResumeTask(ts: number, ask: ClineAsk, text: string): Promise<AskHandleResult> {\r\n\t\tconst isCompleted = ask === \"resume_completed_task\"\r\n\t\tthis.outputManager.output(`\\n[Resume ${isCompleted ? \"Completed \" : \"\"}Task]`)\r\n\t\tif (text) {\r\n\t\t\tthis.outputManager.output(` ${text}`)\r\n\t\t}\r\n\t\tthis.outputManager.markDisplayed(ts, text || \"\", false)\r\n\r\n\t\tif (this.nonInteractive) {\r\n\t\t\tthis.outputManager.output(\"\\n[continuing task]\")\r\n\t\t\t// Auto-resume in non-interactive mode\r\n\t\t\tthis.sendApprovalResponse(true)\r\n\t\t\treturn { handled: true, response: \"yesButtonClicked\" }\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\tconst resume = await this.promptManager.promptForYesNo(\"Continue with this task? (y/n): \")\r\n\t\t\tthis.sendApprovalResponse(resume)\r\n\t\t\treturn { handled: true, response: resume ? \"yesButtonClicked\" : \"noButtonClicked\" }\r\n\t\t} catch {\r\n\t\t\tthis.outputManager.output(\"[Defaulting to: no]\")\r\n\t\t\tthis.sendApprovalResponse(false)\r\n\t\t\treturn { handled: true, response: \"noButtonClicked\" }\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Handle generic approval prompts for unknown ask types.\r\n\t */\r\n\tprivate async handleGenericApproval(ts: number, ask: ClineAsk, text: string): Promise<AskHandleResult> {\r\n\t\tthis.outputManager.output(`\\n[${ask}]`)\r\n\t\tif (text) {\r\n\t\t\tthis.outputManager.output(` ${text}`)\r\n\t\t}\r\n\t\tthis.outputManager.markDisplayed(ts, text || \"\", false)\r\n\r\n\t\ttry {\r\n\t\t\tconst approved = await this.promptManager.promptForYesNo(\"Approve? (y/n): \")\r\n\t\t\tthis.sendApprovalResponse(approved)\r\n\t\t\treturn { handled: true, response: approved ? \"yesButtonClicked\" : \"noButtonClicked\" }\r\n\t\t} catch {\r\n\t\t\tthis.outputManager.output(\"[Defaulting to: no]\")\r\n\t\t\tthis.sendApprovalResponse(false)\r\n\t\t\treturn { handled: true, response: \"noButtonClicked\" }\r\n\t\t}\r\n\t}\r\n\r\n\t// ===========================================================================\r\n\t// Response Helpers\r\n\t// ===========================================================================\r\n\r\n\t/**\r\n\t * Send a followup response (text answer) to the extension.\r\n\t */\r\n\tprivate sendFollowupResponse(text: string): void {\r\n\t\tthis.sendMessage({ type: \"askResponse\", askResponse: \"messageResponse\", text })\r\n\t}\r\n\r\n\t/**\r\n\t * Send an approval response (yes/no) to the extension.\r\n\t */\r\n\tprivate sendApprovalResponse(approved: boolean): void {\r\n\t\tthis.sendMessage({\r\n\t\t\ttype: \"askResponse\",\r\n\t\t\taskResponse: approved ? \"yesButtonClicked\" : \"noButtonClicked\",\r\n\t\t})\r\n\t}\r\n\r\n\t/**\r\n\t * Resolve a numbered suggestion selection.\r\n\t */\r\n\tprivate resolveNumberedSuggestion(\r\n\t\tinput: string,\r\n\t\tsuggestions: Array<{ answer: string; mode?: string | null }>,\r\n\t): string {\r\n\t\tconst num = parseInt(input, 10)\r\n\t\tif (!isNaN(num) && num >= 1 && num <= suggestions.length) {\r\n\t\t\tconst selectedSuggestion = suggestions[num - 1]\r\n\t\t\tif (selectedSuggestion) {\r\n\t\t\t\tconst selected = selectedSuggestion.answer || String(selectedSuggestion)\r\n\t\t\t\tthis.outputManager.output(`Selected: ${selected}`)\r\n\t\t\t\treturn selected\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn input\r\n\t}\r\n}\r\n","const CANCELLATION_ERROR_PATTERNS = [\"aborted\", \"aborterror\", \"cancelled\", \"canceled\"]\nconst CANCELLATION_ERROR_NAMES = new Set([\"aborterror\"])\nconst CANCELLATION_ERROR_CODES = new Set([\"ABORT_ERR\", \"ERR_CANCELED\", \"ERR_CANCELLED\"])\nconst NO_ACTIVE_TASK_PATTERNS = [\n\t\"no active task\",\n\t\"no task to cancel\",\n\t\"task not found\",\n\t\"unable to find task\",\n\t\"already completed\",\n\t\"already cancelled\",\n\t\"already canceled\",\n]\nconst STREAM_TEARDOWN_CODES = new Set([\"EPIPE\", \"ECONNRESET\", \"ERR_STREAM_DESTROYED\", \"ERR_STREAM_PREMATURE_CLOSE\"])\nconst STREAM_TEARDOWN_PATTERNS = [\n\t\"write after end\",\n\t\"stream destroyed\",\n\t\"premature close\",\n\t\"socket hang up\",\n\t\"broken pipe\",\n]\n\nexport interface ExpectedControlFlowErrorContext {\n\tstdinStreamMode: boolean\n\tcancelRequested?: boolean\n\tshuttingDown?: boolean\n\toperation?: \"runtime\" | \"client\" | \"cancel\" | \"shutdown\"\n}\n\ninterface ErrorMetadata {\n\tmessage: string\n\tnormalizedMessage: string\n\tname?: string\n\tnormalizedName?: string\n\tcode?: string\n}\n\nfunction getErrorMetadata(error: unknown): ErrorMetadata {\n\tif (error instanceof Error) {\n\t\tconst maybeCode = (error as Error & { code?: unknown }).code\n\t\tconst code = typeof maybeCode === \"string\" ? maybeCode : undefined\n\t\treturn {\n\t\t\tmessage: error.message,\n\t\t\tnormalizedMessage: error.message.toLowerCase(),\n\t\t\tname: error.name,\n\t\t\tnormalizedName: error.name.toLowerCase(),\n\t\t\tcode,\n\t\t}\n\t}\n\n\tif (typeof error === \"object\" && error !== null) {\n\t\tconst nameRaw = (error as { name?: unknown }).name\n\t\tconst messageRaw = (error as { message?: unknown }).message\n\t\tconst codeRaw = (error as { code?: unknown }).code\n\t\tconst message = typeof messageRaw === \"string\" ? messageRaw : String(error)\n\t\treturn {\n\t\t\tmessage,\n\t\t\tnormalizedMessage: message.toLowerCase(),\n\t\t\tname: typeof nameRaw === \"string\" ? nameRaw : undefined,\n\t\t\tnormalizedName: typeof nameRaw === \"string\" ? nameRaw.toLowerCase() : undefined,\n\t\t\tcode: typeof codeRaw === \"string\" ? codeRaw : undefined,\n\t\t}\n\t}\n\n\tconst message = String(error)\n\treturn {\n\t\tmessage,\n\t\tnormalizedMessage: message.toLowerCase(),\n\t}\n}\n\n/**\n * Best-effort classifier for cancellation/abort failures.\n */\nexport function isCancellationLikeError(error: unknown): boolean {\n\tconst details = getErrorMetadata(error)\n\n\tif (details.code && CANCELLATION_ERROR_CODES.has(details.code)) {\n\t\treturn true\n\t}\n\n\tif (details.normalizedName && CANCELLATION_ERROR_NAMES.has(details.normalizedName)) {\n\t\treturn true\n\t}\n\n\treturn CANCELLATION_ERROR_PATTERNS.some((pattern) => details.normalizedMessage.includes(pattern))\n}\n\nexport function isNoActiveTaskLikeError(error: unknown): boolean {\n\tconst details = getErrorMetadata(error)\n\treturn NO_ACTIVE_TASK_PATTERNS.some((pattern) => details.normalizedMessage.includes(pattern))\n}\n\nexport function isStreamTeardownLikeError(error: unknown): boolean {\n\tconst details = getErrorMetadata(error)\n\tif (details.code && STREAM_TEARDOWN_CODES.has(details.code)) {\n\t\treturn true\n\t}\n\n\treturn STREAM_TEARDOWN_PATTERNS.some((pattern) => details.normalizedMessage.includes(pattern))\n}\n\n/**\n * Classify errors that should be treated as expected control flow rather than\n * fatal failures while handling stdin stream tasks.\n */\nexport function isExpectedControlFlowError(error: unknown, context: ExpectedControlFlowErrorContext): boolean {\n\tif (!context.stdinStreamMode) {\n\t\treturn false\n\t}\n\n\tif (context.shuttingDown && isStreamTeardownLikeError(error)) {\n\t\treturn true\n\t}\n\n\tconst isCancelLike = isCancellationLikeError(error)\n\tif (isCancelLike && (context.cancelRequested || context.shuttingDown || context.operation === \"runtime\")) {\n\t\treturn true\n\t}\n\n\tif (\n\t\tisNoActiveTaskLikeError(error) &&\n\t\t(context.cancelRequested ||\n\t\t\tcontext.shuttingDown ||\n\t\t\tcontext.operation === \"cancel\" ||\n\t\t\tcontext.operation === \"shutdown\")\n\t) {\n\t\treturn true\n\t}\n\n\treturn false\n}\n","import { createInterface } from \"readline\"\r\nimport { randomUUID } from \"crypto\"\r\n\r\nimport {\r\n\trooCliCommandNames,\r\n\ttype RooCliCommandName,\r\n\ttype RooCliInputCommand,\r\n\ttype RooCliStartCommand,\r\n} from \"../../../types\"\r\n\r\nimport { isRecord } from \"../../lib/utils/guards.js\"\r\nimport { isValidSessionId } from \"../../lib/utils/session-id.js\"\r\nimport { isCancellationLikeError, isExpectedControlFlowError, isNoActiveTaskLikeError } from \"./cancellation.js\"\r\n\r\nimport type { ExtensionHost } from \"../../agent/index.js\"\r\nimport type { JsonEventEmitter } from \"../../agent/json-event-emitter.js\"\r\n\r\n// ---------------------------------------------------------------------------\r\n// Types\r\n// ---------------------------------------------------------------------------\r\n\r\nexport type StdinStreamCommandName = RooCliCommandName\r\n\r\nexport type StdinStreamCommand = RooCliInputCommand\r\n\r\n// ---------------------------------------------------------------------------\r\n// Parsing\r\n// ---------------------------------------------------------------------------\r\n\r\nexport const VALID_STDIN_COMMANDS = new Set<StdinStreamCommandName>(rooCliCommandNames)\r\n\r\nexport function parseStdinStreamCommand(line: string, lineNumber: number): StdinStreamCommand {\r\n\tlet parsed: unknown\r\n\r\n\ttry {\r\n\t\tparsed = JSON.parse(line)\r\n\t} catch {\r\n\t\tthrow new Error(`stdin command line ${lineNumber}: invalid JSON`)\r\n\t}\r\n\r\n\tif (!isRecord(parsed)) {\r\n\t\tthrow new Error(`stdin command line ${lineNumber}: expected JSON object`)\r\n\t}\r\n\r\n\tconst commandRaw = parsed.command\r\n\tconst requestIdRaw = parsed.requestId\r\n\r\n\tif (typeof commandRaw !== \"string\") {\r\n\t\tthrow new Error(`stdin command line ${lineNumber}: missing string \"command\"`)\r\n\t}\r\n\r\n\tif (!VALID_STDIN_COMMANDS.has(commandRaw as StdinStreamCommandName)) {\r\n\t\tthrow new Error(\r\n\t\t\t`stdin command line ${lineNumber}: unsupported command \"${commandRaw}\" (expected start|message|cancel|ping|shutdown)`,\r\n\t\t)\r\n\t}\r\n\r\n\tif (typeof requestIdRaw !== \"string\" || requestIdRaw.trim().length === 0) {\r\n\t\tthrow new Error(`stdin command line ${lineNumber}: missing non-empty string \"requestId\"`)\r\n\t}\r\n\r\n\tconst command = commandRaw as StdinStreamCommandName\r\n\tconst requestId = requestIdRaw.trim()\r\n\r\n\tif (command === \"start\" || command === \"message\") {\r\n\t\tconst promptRaw = parsed.prompt\r\n\r\n\t\tif (typeof promptRaw !== \"string\" || promptRaw.trim().length === 0) {\r\n\t\t\tthrow new Error(`stdin command line ${lineNumber}: \"${command}\" requires non-empty string \"prompt\"`)\r\n\t\t}\r\n\r\n\t\tconst imagesRaw = parsed.images\r\n\t\tlet images: string[] | undefined\r\n\r\n\t\tif (imagesRaw !== undefined) {\r\n\t\t\tif (!Array.isArray(imagesRaw) || !imagesRaw.every((image) => typeof image === \"string\")) {\r\n\t\t\t\tthrow new Error(`stdin command line ${lineNumber}: \"${command}\" images must be an array of strings`)\r\n\t\t\t}\r\n\r\n\t\t\timages = imagesRaw\r\n\t\t}\r\n\r\n\t\tif (command === \"start\") {\r\n\t\t\tconst taskIdRaw = parsed.taskId\r\n\t\t\tlet taskId: string | undefined\r\n\r\n\t\t\tif (taskIdRaw !== undefined) {\r\n\t\t\t\tif (typeof taskIdRaw !== \"string\" || taskIdRaw.trim().length === 0) {\r\n\t\t\t\t\tthrow new Error(`stdin command line ${lineNumber}: \"start\" taskId must be a non-empty string`)\r\n\t\t\t\t}\r\n\t\t\t\ttaskId = taskIdRaw.trim()\r\n\r\n\t\t\t\tif (!isValidSessionId(taskId)) {\r\n\t\t\t\t\tthrow new Error(`stdin command line ${lineNumber}: \"start\" taskId must be a valid UUID`)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (isRecord(parsed.configuration)) {\r\n\t\t\t\treturn {\r\n\t\t\t\t\tcommand,\r\n\t\t\t\t\trequestId,\r\n\t\t\t\t\tprompt: promptRaw,\r\n\t\t\t\t\t...(taskId !== undefined ? { taskId } : {}),\r\n\t\t\t\t\t...(images !== undefined ? { images } : {}),\r\n\t\t\t\t\tconfiguration: parsed.configuration as RooCliStartCommand[\"configuration\"],\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn {\r\n\t\t\t\tcommand,\r\n\t\t\t\trequestId,\r\n\t\t\t\tprompt: promptRaw,\r\n\t\t\t\t...(taskId !== undefined ? { taskId } : {}),\r\n\t\t\t\t...(images !== undefined ? { images } : {}),\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tcommand,\r\n\t\t\trequestId,\r\n\t\t\tprompt: promptRaw,\r\n\t\t\t...(images !== undefined ? { images } : {}),\r\n\t\t}\r\n\t}\r\n\r\n\treturn { command, requestId }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// NDJSON stdin reader\r\n// ---------------------------------------------------------------------------\r\n\r\nasync function* readCommandsFromStdinNdjson(): AsyncGenerator<StdinStreamCommand> {\r\n\tconst lineReader = createInterface({\r\n\t\tinput: process.stdin,\r\n\t\tcrlfDelay: Infinity,\r\n\t\tterminal: false,\r\n\t})\r\n\r\n\tlet lineNumber = 0\r\n\r\n\ttry {\r\n\t\tfor await (const line of lineReader) {\r\n\t\t\tlineNumber += 1\r\n\t\t\tconst trimmed = line.trim()\r\n\t\t\tif (!trimmed) {\r\n\t\t\t\tcontinue\r\n\t\t\t}\r\n\t\t\tyield parseStdinStreamCommand(trimmed, lineNumber)\r\n\t\t}\r\n\t} finally {\r\n\t\tlineReader.close()\r\n\t}\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Queue snapshot helpers\r\n// ---------------------------------------------------------------------------\r\n\r\ninterface StreamQueueItem {\r\n\tid: string\r\n\ttext?: string\r\n\timageCount: number\r\n\ttimestamp?: number\r\n}\r\n\r\nfunction normalizeQueueText(text: string | undefined): string | undefined {\r\n\tif (!text) {\r\n\t\treturn undefined\r\n\t}\r\n\r\n\tconst compact = text.replace(/\\s+/g, \" \").trim()\r\n\tif (!compact) {\r\n\t\treturn undefined\r\n\t}\r\n\r\n\treturn compact.length <= 180 ? compact : `${compact.slice(0, 177)}...`\r\n}\r\n\r\nfunction parseQueueSnapshot(rawQueue: unknown): StreamQueueItem[] | undefined {\r\n\tif (!Array.isArray(rawQueue)) {\r\n\t\treturn undefined\r\n\t}\r\n\r\n\tconst snapshot: StreamQueueItem[] = []\r\n\r\n\tfor (const entry of rawQueue) {\r\n\t\tif (!isRecord(entry)) {\r\n\t\t\tcontinue\r\n\t\t}\r\n\r\n\t\tconst idRaw = entry.id\r\n\t\tif (typeof idRaw !== \"string\" || idRaw.trim().length === 0) {\r\n\t\t\tcontinue\r\n\t\t}\r\n\r\n\t\tconst imagesRaw = entry.images\r\n\t\tconst timestampRaw = entry.timestamp\r\n\t\tconst imageCount = Array.isArray(imagesRaw) ? imagesRaw.length : 0\r\n\r\n\t\tsnapshot.push({\r\n\t\t\tid: idRaw,\r\n\t\t\ttext: normalizeQueueText(typeof entry.text === \"string\" ? entry.text : undefined),\r\n\t\t\timageCount,\r\n\t\t\ttimestamp: typeof timestampRaw === \"number\" ? timestampRaw : undefined,\r\n\t\t})\r\n\t}\r\n\r\n\treturn snapshot\r\n}\r\n\r\nfunction areStringArraysEqual(a: string[], b: string[]): boolean {\r\n\tif (a.length !== b.length) {\r\n\t\treturn false\r\n\t}\r\n\r\n\tfor (let i = 0; i < a.length; i++) {\r\n\t\tif (a[i] !== b[i]) {\r\n\t\t\treturn false\r\n\t\t}\r\n\t}\r\n\r\n\treturn true\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Orchestrator\r\n// ---------------------------------------------------------------------------\r\n\r\nexport interface StdinStreamModeOptions {\r\n\thost: ExtensionHost\r\n\tjsonEmitter: JsonEventEmitter\r\n\tsetStreamRequestId: (id: string | undefined) => void\r\n}\r\n\r\nconst RESUME_ASKS = new Set([\"resume_task\", \"resume_completed_task\"])\r\nconst CANCEL_RECOVERY_WAIT_TIMEOUT_MS = 8_000\r\nconst CANCEL_RECOVERY_POLL_INTERVAL_MS = 100\r\nconst STDIN_EOF_RESUME_WAIT_TIMEOUT_MS = 2_000\r\nconst STDIN_EOF_POLL_INTERVAL_MS = 100\r\nconst STDIN_EOF_IDLE_ASKS = new Set([\"completion_result\", \"resume_completed_task\"])\r\nconst STDIN_EOF_IDLE_STABLE_POLLS = 2\r\nconst MESSAGE_AS_ASK_RESPONSE_ASKS = new Set([\r\n\t\"followup\",\r\n\t\"tool\",\r\n\t\"command\",\r\n\t\"use_mcp_server\",\r\n\t\"completion_result\",\r\n\t\"resume_task\",\r\n\t\"resume_completed_task\",\r\n\t\"mistake_limit_reached\",\r\n])\r\n\r\nexport function shouldSendMessageAsAskResponse(waitingForInput: boolean, currentAsk: string | undefined): boolean {\r\n\treturn waitingForInput && typeof currentAsk === \"string\" && MESSAGE_AS_ASK_RESPONSE_ASKS.has(currentAsk)\r\n}\r\n\r\nfunction isResumableState(host: ExtensionHost): boolean {\r\n\tconst agentState = host.client.getAgentState()\r\n\treturn (\r\n\t\tagentState.isWaitingForInput &&\r\n\t\ttypeof agentState.currentAsk === \"string\" &&\r\n\t\tRESUME_ASKS.has(agentState.currentAsk)\r\n\t)\r\n}\r\n\r\nasync function waitForPostCancelRecovery(host: ExtensionHost): Promise<void> {\r\n\tconst deadline = Date.now() + CANCEL_RECOVERY_WAIT_TIMEOUT_MS\r\n\r\n\twhile (Date.now() < deadline) {\r\n\t\tif (isResumableState(host)) {\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tawait new Promise((resolve) => setTimeout(resolve, CANCEL_RECOVERY_POLL_INTERVAL_MS))\r\n\t}\r\n}\r\n\r\nasync function waitForTaskProgressAfterStdinClosed(\r\n\thost: ExtensionHost,\r\n\tgetQueueState: () => { hasSeenQueueState: boolean; queueDepth: number },\r\n): Promise<void> {\r\n\twhile (host.client.hasActiveTask()) {\r\n\t\tif (!host.isWaitingForInput()) {\r\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, STDIN_EOF_POLL_INTERVAL_MS))\r\n\t\t\tcontinue\r\n\t\t}\r\n\r\n\t\tconst deadline = Date.now() + STDIN_EOF_RESUME_WAIT_TIMEOUT_MS\r\n\r\n\t\twhile (Date.now() < deadline) {\r\n\t\t\tif (!host.client.hasActiveTask() || !host.isWaitingForInput()) {\r\n\t\t\t\tbreak\r\n\t\t\t}\r\n\r\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, STDIN_EOF_POLL_INTERVAL_MS))\r\n\t\t}\r\n\r\n\t\tif (host.client.hasActiveTask() && host.isWaitingForInput()) {\r\n\t\t\tconst currentAsk = host.client.getCurrentAsk()\r\n\t\t\tconst { hasSeenQueueState, queueDepth } = getQueueState()\r\n\r\n\t\t\t// EOF is allowed when the task has reached an idle completion boundary and\r\n\t\t\t// there is no queued user input waiting to be processed.\r\n\t\t\tif (\r\n\t\t\t\thasSeenQueueState &&\r\n\t\t\t\tqueueDepth === 0 &&\r\n\t\t\t\ttypeof currentAsk === \"string\" &&\r\n\t\t\t\tSTDIN_EOF_IDLE_ASKS.has(currentAsk)\r\n\t\t\t) {\r\n\t\t\t\tlet isStable = true\r\n\t\t\t\tfor (let i = 1; i < STDIN_EOF_IDLE_STABLE_POLLS; i++) {\r\n\t\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, STDIN_EOF_POLL_INTERVAL_MS))\r\n\r\n\t\t\t\t\tif (!host.client.hasActiveTask() || !host.isWaitingForInput()) {\r\n\t\t\t\t\t\tisStable = false\r\n\t\t\t\t\t\tbreak\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tconst nextAsk = host.client.getCurrentAsk()\r\n\t\t\t\t\tconst nextQueueState = getQueueState()\r\n\t\t\t\t\tif (\r\n\t\t\t\t\t\tnextAsk !== currentAsk ||\r\n\t\t\t\t\t\t!nextQueueState.hasSeenQueueState ||\r\n\t\t\t\t\t\tnextQueueState.queueDepth !== 0\r\n\t\t\t\t\t) {\r\n\t\t\t\t\t\tisStable = false\r\n\t\t\t\t\t\tbreak\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (isStable) {\r\n\t\t\t\t\treturn\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthrow new Error(`stdin ended while task was waiting for input (${currentAsk ?? \"unknown\"})`)\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport async function runStdinStreamMode({ host, jsonEmitter, setStreamRequestId }: StdinStreamModeOptions) {\r\n\tlet hasReceivedStdinCommand = false\r\n\tlet shouldShutdown = false\r\n\tlet activeTaskPromise: Promise<void> | null = null\r\n\tlet fatalStreamError: Error | null = null\r\n\tlet activeRequestId: string | undefined\r\n\tlet activeTaskCommand: \"start\" | undefined\r\n\tlet latestTaskId: string | undefined\r\n\tlet cancelRequestedForActiveTask = false\r\n\tlet awaitingPostCancelRecovery = false\r\n\tlet hasSeenQueueState = false\r\n\tlet lastQueueDepth = 0\r\n\tlet lastQueueMessageIds: string[] = []\r\n\tconst pendingQueuedMessageRequestIds: string[] = []\r\n\tconst queueMessageRequestIdByMessageId = new Map<string, string>()\r\n\r\n\tconst assignRequestIdsToNewQueueMessages = (queueMessageIds: string[]) => {\r\n\t\tfor (const messageId of queueMessageIds) {\r\n\t\t\tif (queueMessageRequestIdByMessageId.has(messageId)) {\r\n\t\t\t\tcontinue\r\n\t\t\t}\r\n\r\n\t\t\tconst requestId = pendingQueuedMessageRequestIds.shift()\r\n\t\t\tif (!requestId) {\r\n\t\t\t\tcontinue\r\n\t\t\t}\r\n\r\n\t\t\tqueueMessageRequestIdByMessageId.set(messageId, requestId)\r\n\t\t}\r\n\t}\r\n\r\n\tconst promoteRequestIdForDequeuedMessages = (queueMessageIds: string[]) => {\r\n\t\tif (lastQueueMessageIds.length === 0) {\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tconst remainingIds = new Set(queueMessageIds)\r\n\r\n\t\tfor (const dequeuedMessageId of lastQueueMessageIds) {\r\n\t\t\tif (remainingIds.has(dequeuedMessageId)) {\r\n\t\t\t\tcontinue\r\n\t\t\t}\r\n\r\n\t\t\tconst requestId = queueMessageRequestIdByMessageId.get(dequeuedMessageId)\r\n\t\t\tif (requestId) {\r\n\t\t\t\tsetStreamRequestId(requestId)\r\n\t\t\t}\r\n\t\t\tqueueMessageRequestIdByMessageId.delete(dequeuedMessageId)\r\n\t\t}\r\n\t}\r\n\r\n\tconst waitForPreviousTaskToSettle = async () => {\r\n\t\tif (!activeTaskPromise) {\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\tawait activeTaskPromise\r\n\t\t} catch {\r\n\t\t\t// Errors are emitted through control/error events.\r\n\t\t}\r\n\t}\r\n\r\n\tconst offClientError = host.client.on(\"error\", (error) => {\r\n\t\tif (\r\n\t\t\tisExpectedControlFlowError(error, {\r\n\t\t\t\tstdinStreamMode: true,\r\n\t\t\t\tcancelRequested: cancelRequestedForActiveTask,\r\n\t\t\t\tshuttingDown: shouldShutdown,\r\n\t\t\t\toperation: \"client\",\r\n\t\t\t})\r\n\t\t) {\r\n\t\t\tif (activeTaskCommand === \"start\" && (cancelRequestedForActiveTask || isCancellationLikeError(error))) {\r\n\t\t\t\tjsonEmitter.emitControl({\r\n\t\t\t\t\tsubtype: \"done\",\r\n\t\t\t\t\trequestId: activeRequestId,\r\n\t\t\t\t\tcommand: \"start\",\r\n\t\t\t\t\ttaskId: latestTaskId,\r\n\t\t\t\t\tcontent: \"task cancelled\",\r\n\t\t\t\t\tcode: \"task_aborted\",\r\n\t\t\t\t\tsuccess: false,\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t\tactiveTaskCommand = undefined\r\n\t\t\tactiveRequestId = undefined\r\n\t\t\tsetStreamRequestId(undefined)\r\n\t\t\tcancelRequestedForActiveTask = false\r\n\t\t\tawaitingPostCancelRecovery = false\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tfatalStreamError = error\r\n\t\tjsonEmitter.emitControl({\r\n\t\t\tsubtype: \"error\",\r\n\t\t\trequestId: activeRequestId,\r\n\t\t\tcommand: activeTaskCommand,\r\n\t\t\ttaskId: latestTaskId,\r\n\t\t\tcontent: error.message,\r\n\t\t\tcode: \"client_error\",\r\n\t\t\tsuccess: false,\r\n\t\t})\r\n\t})\r\n\r\n\tconst onExtensionMessage = (message: {\r\n\t\ttype?: string\r\n\t\ttext?: unknown\r\n\t\tstate?: {\r\n\t\t\tcurrentTaskId?: unknown\r\n\t\t\tcurrentTaskItem?: { id?: unknown }\r\n\t\t\tmessageQueue?: unknown\r\n\t\t}\r\n\t}) => {\r\n\t\tif (message.type === \"commandExecutionStatus\") {\r\n\t\t\tif (typeof message.text !== \"string\") {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\tlet parsedStatus: unknown\r\n\t\t\ttry {\r\n\t\t\t\tparsedStatus = JSON.parse(message.text)\r\n\t\t\t} catch {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\tif (!isRecord(parsedStatus) || typeof parsedStatus.status !== \"string\") {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\tif (parsedStatus.status === \"output\" && typeof parsedStatus.output === \"string\") {\r\n\t\t\t\tjsonEmitter.emitCommandOutputChunk(parsedStatus.output)\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\tif (parsedStatus.status === \"exited\") {\r\n\t\t\t\tconst exitCode =\r\n\t\t\t\t\tparsedStatus.status === \"exited\" && typeof parsedStatus.exitCode === \"number\"\r\n\t\t\t\t\t\t? parsedStatus.exitCode\r\n\t\t\t\t\t\t: undefined\r\n\r\n\t\t\t\tif (typeof parsedStatus.output === \"string\") {\r\n\t\t\t\t\tjsonEmitter.emitCommandOutputChunk(parsedStatus.output)\r\n\t\t\t\t}\r\n\r\n\t\t\t\tjsonEmitter.markCommandOutputExited(exitCode)\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\tif (parsedStatus.status === \"timeout\" || parsedStatus.status === \"fallback\") {\r\n\t\t\t\tjsonEmitter.emitCommandOutputDone(undefined)\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tif (message.type !== \"state\") {\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tconst currentTaskId = message.state?.currentTaskId ?? message.state?.currentTaskItem?.id\r\n\t\tif (typeof currentTaskId === \"string\" && currentTaskId.trim().length > 0) {\r\n\t\t\tlatestTaskId = currentTaskId\r\n\t\t}\r\n\r\n\t\tconst queueSnapshot = parseQueueSnapshot(message.state?.messageQueue)\r\n\t\tif (!queueSnapshot) {\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tconst queueDepth = queueSnapshot.length\r\n\t\tconst queueMessageIds = queueSnapshot.map((item) => item.id)\r\n\r\n\t\tif (!hasSeenQueueState) {\r\n\t\t\tassignRequestIdsToNewQueueMessages(queueMessageIds)\r\n\t\t\thasSeenQueueState = true\r\n\t\t\tlastQueueDepth = queueDepth\r\n\t\t\tlastQueueMessageIds = queueMessageIds\r\n\r\n\t\t\tif (queueDepth === 0) {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\tjsonEmitter.emitQueue({\r\n\t\t\t\tsubtype: \"snapshot\",\r\n\t\t\t\ttaskId: latestTaskId,\r\n\t\t\t\tcontent: `queue snapshot (${queueDepth} item${queueDepth === 1 ? \"\" : \"s\"})`,\r\n\t\t\t\tqueueDepth,\r\n\t\t\t\tqueue: queueSnapshot,\r\n\t\t\t})\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tconst depthChanged = queueDepth !== lastQueueDepth\r\n\t\tconst idsChanged = !areStringArraysEqual(queueMessageIds, lastQueueMessageIds)\r\n\r\n\t\tif (!depthChanged && !idsChanged) {\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tpromoteRequestIdForDequeuedMessages(queueMessageIds)\r\n\t\tassignRequestIdsToNewQueueMessages(queueMessageIds)\r\n\r\n\t\tconst subtype: \"enqueued\" | \"dequeued\" | \"drained\" | \"updated\" = depthChanged\r\n\t\t\t? queueDepth > lastQueueDepth\r\n\t\t\t\t? \"enqueued\"\r\n\t\t\t\t: queueDepth === 0\r\n\t\t\t\t\t? \"drained\"\r\n\t\t\t\t\t: \"dequeued\"\r\n\t\t\t: \"updated\"\r\n\r\n\t\tconst content =\r\n\t\t\tsubtype === \"drained\"\r\n\t\t\t\t? \"queue drained\"\r\n\t\t\t\t: `queue ${subtype} (${queueDepth} item${queueDepth === 1 ? \"\" : \"s\"})`\r\n\r\n\t\tjsonEmitter.emitQueue({\r\n\t\t\tsubtype,\r\n\t\t\ttaskId: latestTaskId,\r\n\t\t\tcontent,\r\n\t\t\tqueueDepth,\r\n\t\t\tqueue: queueSnapshot,\r\n\t\t})\r\n\r\n\t\tlastQueueDepth = queueDepth\r\n\t\tlastQueueMessageIds = queueMessageIds\r\n\t}\r\n\r\n\thost.on(\"extensionWebviewMessage\", onExtensionMessage)\r\n\r\n\tconst offTaskCompleted = host.client.on(\"taskCompleted\", (event) => {\r\n\t\tif (activeTaskCommand === \"start\") {\r\n\t\t\tconst completionCode = event.success\r\n\t\t\t\t? \"task_completed\"\r\n\t\t\t\t: cancelRequestedForActiveTask\r\n\t\t\t\t\t? \"task_aborted\"\r\n\t\t\t\t\t: \"task_failed\"\r\n\r\n\t\t\tjsonEmitter.emitControl({\r\n\t\t\t\tsubtype: \"done\",\r\n\t\t\t\trequestId: activeRequestId,\r\n\t\t\t\tcommand: \"start\",\r\n\t\t\t\ttaskId: latestTaskId,\r\n\t\t\t\tcontent: event.success\r\n\t\t\t\t\t? \"task completed\"\r\n\t\t\t\t\t: cancelRequestedForActiveTask\r\n\t\t\t\t\t\t? \"task cancelled\"\r\n\t\t\t\t\t\t: \"task failed\",\r\n\t\t\t\tcode: completionCode,\r\n\t\t\t\tsuccess: event.success,\r\n\t\t\t})\r\n\r\n\t\t\t// If user messages were queued while the task was still running, shift\r\n\t\t\t// event attribution to the oldest pending message request as soon as the\r\n\t\t\t// task turn completes so prompt echo/user feedback events are tagged.\r\n\t\t\tconst oldestQueuedMessageId = lastQueueMessageIds[0]\r\n\t\t\tconst nextQueuedRequestId =\r\n\t\t\t\tpendingQueuedMessageRequestIds[0] ??\r\n\t\t\t\t(oldestQueuedMessageId ? queueMessageRequestIdByMessageId.get(oldestQueuedMessageId) : undefined)\r\n\t\t\tif (nextQueuedRequestId) {\r\n\t\t\t\tsetStreamRequestId(nextQueuedRequestId)\r\n\t\t\t}\r\n\r\n\t\t\tactiveTaskCommand = undefined\r\n\t\t\tactiveRequestId = undefined\r\n\t\t\tcancelRequestedForActiveTask = false\r\n\t\t}\r\n\t})\r\n\r\n\ttry {\r\n\t\tfor await (const stdinCommand of readCommandsFromStdinNdjson()) {\r\n\t\t\thasReceivedStdinCommand = true\r\n\r\n\t\t\tif (fatalStreamError) {\r\n\t\t\t\tthrow fatalStreamError\r\n\t\t\t}\r\n\r\n\t\t\tswitch (stdinCommand.command) {\r\n\t\t\t\tcase \"start\": {\r\n\t\t\t\t\t// A task can emit completion events before runTask() finalizers run.\r\n\t\t\t\t\t// Wait for full settlement to avoid false \"task_busy\" on immediate next start.\r\n\t\t\t\t\t// Safe from races: `for await` processes stdin commands serially, so no\r\n\t\t\t\t\t// concurrent command can mutate state between the check and the await.\r\n\t\t\t\t\tif (activeTaskPromise && !host.client.hasActiveTask()) {\r\n\t\t\t\t\t\tawait waitForPreviousTaskToSettle()\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (activeTaskPromise || host.client.hasActiveTask()) {\r\n\t\t\t\t\t\tjsonEmitter.emitControl({\r\n\t\t\t\t\t\t\tsubtype: \"error\",\r\n\t\t\t\t\t\t\trequestId: stdinCommand.requestId,\r\n\t\t\t\t\t\t\tcommand: \"start\",\r\n\t\t\t\t\t\t\ttaskId: latestTaskId,\r\n\t\t\t\t\t\t\tcontent: \"cannot start a new task while another task is active\",\r\n\t\t\t\t\t\t\tcode: \"task_busy\",\r\n\t\t\t\t\t\t\tsuccess: false,\r\n\t\t\t\t\t\t})\r\n\r\n\t\t\t\t\t\tbreak\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tactiveRequestId = stdinCommand.requestId\r\n\t\t\t\t\tactiveTaskCommand = \"start\"\r\n\t\t\t\t\tsetStreamRequestId(stdinCommand.requestId)\r\n\t\t\t\t\tlatestTaskId = stdinCommand.taskId ?? randomUUID()\r\n\t\t\t\t\tcancelRequestedForActiveTask = false\r\n\t\t\t\t\tawaitingPostCancelRecovery = false\r\n\r\n\t\t\t\t\tjsonEmitter.emitControl({\r\n\t\t\t\t\t\tsubtype: \"ack\",\r\n\t\t\t\t\t\trequestId: stdinCommand.requestId,\r\n\t\t\t\t\t\tcommand: \"start\",\r\n\t\t\t\t\t\ttaskId: latestTaskId,\r\n\t\t\t\t\t\tcontent: \"starting task\",\r\n\t\t\t\t\t\tcode: \"accepted\",\r\n\t\t\t\t\t\tsuccess: true,\r\n\t\t\t\t\t})\r\n\r\n\t\t\t\t\t// In CLI stdin-stream mode, default to the execa terminal provider so\r\n\t\t\t\t\t// command output can be streamed deterministically. Explicit per-request\r\n\t\t\t\t\t// config still wins.\r\n\t\t\t\t\tconst taskConfiguration = {\r\n\t\t\t\t\t\tterminalShellIntegrationDisabled: true,\r\n\t\t\t\t\t\t...(stdinCommand.configuration ?? {}),\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tactiveTaskPromise = host\r\n\t\t\t\t\t\t.runTask(stdinCommand.prompt, latestTaskId, taskConfiguration, stdinCommand.images)\r\n\t\t\t\t\t\t.catch((error) => {\r\n\t\t\t\t\t\t\tconst message = error instanceof Error ? error.message : String(error)\r\n\r\n\t\t\t\t\t\t\tif (\r\n\t\t\t\t\t\t\t\tisExpectedControlFlowError(error, {\r\n\t\t\t\t\t\t\t\t\tstdinStreamMode: true,\r\n\t\t\t\t\t\t\t\t\tcancelRequested: cancelRequestedForActiveTask,\r\n\t\t\t\t\t\t\t\t\tshuttingDown: shouldShutdown,\r\n\t\t\t\t\t\t\t\t\toperation: \"client\",\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\t\tif (\r\n\t\t\t\t\t\t\t\t\tactiveTaskCommand === \"start\" &&\r\n\t\t\t\t\t\t\t\t\t(cancelRequestedForActiveTask || isCancellationLikeError(error))\r\n\t\t\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\t\t\tjsonEmitter.emitControl({\r\n\t\t\t\t\t\t\t\t\t\tsubtype: \"done\",\r\n\t\t\t\t\t\t\t\t\t\trequestId: stdinCommand.requestId,\r\n\t\t\t\t\t\t\t\t\t\tcommand: \"start\",\r\n\t\t\t\t\t\t\t\t\t\ttaskId: latestTaskId,\r\n\t\t\t\t\t\t\t\t\t\tcontent: \"task cancelled\",\r\n\t\t\t\t\t\t\t\t\t\tcode: \"task_aborted\",\r\n\t\t\t\t\t\t\t\t\t\tsuccess: false,\r\n\t\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\tactiveTaskCommand = undefined\r\n\t\t\t\t\t\t\t\tactiveRequestId = undefined\r\n\t\t\t\t\t\t\t\tsetStreamRequestId(undefined)\r\n\t\t\t\t\t\t\t\tcancelRequestedForActiveTask = false\r\n\t\t\t\t\t\t\t\tawaitingPostCancelRecovery = false\r\n\t\t\t\t\t\t\t\treturn\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tfatalStreamError = error instanceof Error ? error : new Error(message)\r\n\t\t\t\t\t\t\tactiveTaskCommand = undefined\r\n\t\t\t\t\t\t\tactiveRequestId = undefined\r\n\t\t\t\t\t\t\tsetStreamRequestId(undefined)\r\n\r\n\t\t\t\t\t\t\tjsonEmitter.emitControl({\r\n\t\t\t\t\t\t\t\tsubtype: \"error\",\r\n\t\t\t\t\t\t\t\trequestId: stdinCommand.requestId,\r\n\t\t\t\t\t\t\t\tcommand: \"start\",\r\n\t\t\t\t\t\t\t\ttaskId: latestTaskId,\r\n\t\t\t\t\t\t\t\tcontent: message,\r\n\t\t\t\t\t\t\t\tcode: \"task_error\",\r\n\t\t\t\t\t\t\t\tsuccess: false,\r\n\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t\t.finally(() => {\r\n\t\t\t\t\t\t\tactiveTaskPromise = null\r\n\t\t\t\t\t\t})\r\n\r\n\t\t\t\t\tbreak\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcase \"message\": {\r\n\t\t\t\t\t// If cancel was requested, wait briefly for the task to be rehydrated\r\n\t\t\t\t\t// so message prompts don't race into the pre-cancel task instance.\r\n\t\t\t\t\tif (awaitingPostCancelRecovery) {\r\n\t\t\t\t\t\tawait waitForPostCancelRecovery(host)\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tconst wasResumable = isResumableState(host)\r\n\t\t\t\t\tconst currentAsk = host.client.getCurrentAsk()\r\n\t\t\t\t\tconst shouldSendAsAskResponse = shouldSendMessageAsAskResponse(host.isWaitingForInput(), currentAsk)\r\n\r\n\t\t\t\t\tif (!host.client.hasActiveTask()) {\r\n\t\t\t\t\t\tjsonEmitter.emitControl({\r\n\t\t\t\t\t\t\tsubtype: \"error\",\r\n\t\t\t\t\t\t\trequestId: stdinCommand.requestId,\r\n\t\t\t\t\t\t\tcommand: \"message\",\r\n\t\t\t\t\t\t\ttaskId: latestTaskId,\r\n\t\t\t\t\t\t\tcontent: \"no active task; send a start command first\",\r\n\t\t\t\t\t\t\tcode: \"no_active_task\",\r\n\t\t\t\t\t\t\tsuccess: false,\r\n\t\t\t\t\t\t})\r\n\r\n\t\t\t\t\t\tbreak\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tjsonEmitter.emitControl({\r\n\t\t\t\t\t\tsubtype: \"ack\",\r\n\t\t\t\t\t\trequestId: stdinCommand.requestId,\r\n\t\t\t\t\t\tcommand: \"message\",\r\n\t\t\t\t\t\ttaskId: latestTaskId,\r\n\t\t\t\t\t\tcontent: \"message accepted\",\r\n\t\t\t\t\t\tcode: \"accepted\",\r\n\t\t\t\t\t\tsuccess: true,\r\n\t\t\t\t\t})\r\n\r\n\t\t\t\t\tif (shouldSendAsAskResponse) {\r\n\t\t\t\t\t\t// Match webview behavior: if there is an active ask, route message directly as an ask response.\r\n\t\t\t\t\t\thost.sendToExtension({\r\n\t\t\t\t\t\t\ttype: \"askResponse\",\r\n\t\t\t\t\t\t\taskResponse: \"messageResponse\",\r\n\t\t\t\t\t\t\ttext: stdinCommand.prompt,\r\n\t\t\t\t\t\t\timages: stdinCommand.images,\r\n\t\t\t\t\t\t})\r\n\r\n\t\t\t\t\t\tsetStreamRequestId(stdinCommand.requestId)\r\n\t\t\t\t\t\tjsonEmitter.emitControl({\r\n\t\t\t\t\t\t\tsubtype: \"done\",\r\n\t\t\t\t\t\t\trequestId: stdinCommand.requestId,\r\n\t\t\t\t\t\t\tcommand: \"message\",\r\n\t\t\t\t\t\t\ttaskId: latestTaskId,\r\n\t\t\t\t\t\t\tcontent: \"message sent to current ask\",\r\n\t\t\t\t\t\t\tcode: \"responded\",\r\n\t\t\t\t\t\t\tsuccess: true,\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t\tawaitingPostCancelRecovery = false\r\n\t\t\t\t\t\tbreak\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\thost.sendToExtension({\r\n\t\t\t\t\t\ttype: \"queueMessage\",\r\n\t\t\t\t\t\ttext: stdinCommand.prompt,\r\n\t\t\t\t\t\timages: stdinCommand.images,\r\n\t\t\t\t\t})\r\n\t\t\t\t\tpendingQueuedMessageRequestIds.push(stdinCommand.requestId)\r\n\t\t\t\t\tif (host.isWaitingForInput()) {\r\n\t\t\t\t\t\tsetStreamRequestId(stdinCommand.requestId)\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tjsonEmitter.emitControl({\r\n\t\t\t\t\t\tsubtype: \"done\",\r\n\t\t\t\t\t\trequestId: stdinCommand.requestId,\r\n\t\t\t\t\t\tcommand: \"message\",\r\n\t\t\t\t\t\ttaskId: latestTaskId,\r\n\t\t\t\t\t\tcontent: wasResumable ? \"resume message queued\" : \"message queued\",\r\n\t\t\t\t\t\tcode: wasResumable ? \"resumed\" : \"queued\",\r\n\t\t\t\t\t\tsuccess: true,\r\n\t\t\t\t\t})\r\n\r\n\t\t\t\t\tawaitingPostCancelRecovery = false\r\n\t\t\t\t\tbreak\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcase \"cancel\": {\r\n\t\t\t\t\tsetStreamRequestId(stdinCommand.requestId)\r\n\r\n\t\t\t\t\tconst hasTaskInFlight = Boolean(\r\n\t\t\t\t\t\tactiveTaskPromise || activeTaskCommand === \"start\" || host.client.hasActiveTask(),\r\n\t\t\t\t\t)\r\n\r\n\t\t\t\t\tif (!hasTaskInFlight) {\r\n\t\t\t\t\t\tjsonEmitter.emitControl({\r\n\t\t\t\t\t\t\tsubtype: \"ack\",\r\n\t\t\t\t\t\t\trequestId: stdinCommand.requestId,\r\n\t\t\t\t\t\t\tcommand: \"cancel\",\r\n\t\t\t\t\t\t\ttaskId: latestTaskId,\r\n\t\t\t\t\t\t\tcontent: \"no active task to cancel\",\r\n\t\t\t\t\t\t\tcode: \"accepted\",\r\n\t\t\t\t\t\t\tsuccess: true,\r\n\t\t\t\t\t\t})\r\n\r\n\t\t\t\t\t\tjsonEmitter.emitControl({\r\n\t\t\t\t\t\t\tsubtype: \"done\",\r\n\t\t\t\t\t\t\trequestId: stdinCommand.requestId,\r\n\t\t\t\t\t\t\tcommand: \"cancel\",\r\n\t\t\t\t\t\t\ttaskId: latestTaskId,\r\n\t\t\t\t\t\t\tcontent: \"cancel ignored (no active task)\",\r\n\t\t\t\t\t\t\tcode: \"no_active_task\",\r\n\t\t\t\t\t\t\tsuccess: true,\r\n\t\t\t\t\t\t})\r\n\r\n\t\t\t\t\t\tbreak\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tcancelRequestedForActiveTask = true\r\n\t\t\t\t\tawaitingPostCancelRecovery = true\r\n\r\n\t\t\t\t\tjsonEmitter.emitControl({\r\n\t\t\t\t\t\tsubtype: \"ack\",\r\n\t\t\t\t\t\trequestId: stdinCommand.requestId,\r\n\t\t\t\t\t\tcommand: \"cancel\",\r\n\t\t\t\t\t\ttaskId: latestTaskId,\r\n\t\t\t\t\t\tcontent: host.client.hasActiveTask() ? \"cancel requested\" : \"cancel requested (task starting)\",\r\n\t\t\t\t\t\tcode: \"accepted\",\r\n\t\t\t\t\t\tsuccess: true,\r\n\t\t\t\t\t})\r\n\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\thost.client.cancelTask()\r\n\r\n\t\t\t\t\t\tjsonEmitter.emitControl({\r\n\t\t\t\t\t\t\tsubtype: \"done\",\r\n\t\t\t\t\t\t\trequestId: stdinCommand.requestId,\r\n\t\t\t\t\t\t\tcommand: \"cancel\",\r\n\t\t\t\t\t\t\ttaskId: latestTaskId,\r\n\t\t\t\t\t\t\tcontent: \"cancel signal sent\",\r\n\t\t\t\t\t\t\tcode: \"cancel_requested\",\r\n\t\t\t\t\t\t\tsuccess: true,\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t} catch (error) {\r\n\t\t\t\t\t\tif (\r\n\t\t\t\t\t\t\tisExpectedControlFlowError(error, {\r\n\t\t\t\t\t\t\t\tstdinStreamMode: true,\r\n\t\t\t\t\t\t\t\tcancelRequested: true,\r\n\t\t\t\t\t\t\t\tshuttingDown: shouldShutdown,\r\n\t\t\t\t\t\t\t\toperation: \"cancel\",\r\n\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\tconst noActiveTask = isNoActiveTaskLikeError(error)\r\n\r\n\t\t\t\t\t\t\tjsonEmitter.emitControl({\r\n\t\t\t\t\t\t\t\tsubtype: \"done\",\r\n\t\t\t\t\t\t\t\trequestId: stdinCommand.requestId,\r\n\t\t\t\t\t\t\t\tcommand: \"cancel\",\r\n\t\t\t\t\t\t\t\ttaskId: latestTaskId,\r\n\t\t\t\t\t\t\t\tcontent: noActiveTask ? \"cancel ignored (task already settled)\" : \"cancel handled\",\r\n\t\t\t\t\t\t\t\tcode: noActiveTask ? \"no_active_task\" : \"cancel_requested\",\r\n\t\t\t\t\t\t\t\tsuccess: true,\r\n\t\t\t\t\t\t\t})\r\n\r\n\t\t\t\t\t\t\tif (noActiveTask) {\r\n\t\t\t\t\t\t\t\tawaitingPostCancelRecovery = false\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tcancelRequestedForActiveTask = false\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tconst message = error instanceof Error ? error.message : String(error)\r\n\t\t\t\t\t\t\tjsonEmitter.emitControl({\r\n\t\t\t\t\t\t\t\tsubtype: \"error\",\r\n\t\t\t\t\t\t\t\trequestId: stdinCommand.requestId,\r\n\t\t\t\t\t\t\t\tcommand: \"cancel\",\r\n\t\t\t\t\t\t\t\ttaskId: latestTaskId,\r\n\t\t\t\t\t\t\t\tcontent: message,\r\n\t\t\t\t\t\t\t\tcode: \"cancel_error\",\r\n\t\t\t\t\t\t\t\tsuccess: false,\r\n\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcase \"ping\":\r\n\t\t\t\t\tjsonEmitter.emitControl({\r\n\t\t\t\t\t\tsubtype: \"ack\",\r\n\t\t\t\t\t\trequestId: stdinCommand.requestId,\r\n\t\t\t\t\t\tcommand: \"ping\",\r\n\t\t\t\t\t\ttaskId: latestTaskId,\r\n\t\t\t\t\t\tcontent: \"pong\",\r\n\t\t\t\t\t\tcode: \"accepted\",\r\n\t\t\t\t\t\tsuccess: true,\r\n\t\t\t\t\t})\r\n\t\t\t\t\tjsonEmitter.emitControl({\r\n\t\t\t\t\t\tsubtype: \"done\",\r\n\t\t\t\t\t\trequestId: stdinCommand.requestId,\r\n\t\t\t\t\t\tcommand: \"ping\",\r\n\t\t\t\t\t\ttaskId: latestTaskId,\r\n\t\t\t\t\t\tcontent: \"pong\",\r\n\t\t\t\t\t\tcode: \"pong\",\r\n\t\t\t\t\t\tsuccess: true,\r\n\t\t\t\t\t})\r\n\t\t\t\t\tbreak\r\n\r\n\t\t\t\tcase \"shutdown\":\r\n\t\t\t\t\tjsonEmitter.emitControl({\r\n\t\t\t\t\t\tsubtype: \"ack\",\r\n\t\t\t\t\t\trequestId: stdinCommand.requestId,\r\n\t\t\t\t\t\tcommand: \"shutdown\",\r\n\t\t\t\t\t\ttaskId: latestTaskId,\r\n\t\t\t\t\t\tcontent: \"shutdown requested\",\r\n\t\t\t\t\t\tcode: \"accepted\",\r\n\t\t\t\t\t\tsuccess: true,\r\n\t\t\t\t\t})\r\n\t\t\t\t\tjsonEmitter.emitControl({\r\n\t\t\t\t\t\tsubtype: \"done\",\r\n\t\t\t\t\t\trequestId: stdinCommand.requestId,\r\n\t\t\t\t\t\tcommand: \"shutdown\",\r\n\t\t\t\t\t\ttaskId: latestTaskId,\r\n\t\t\t\t\t\tcontent: \"shutting down process\",\r\n\t\t\t\t\t\tcode: \"shutdown_requested\",\r\n\t\t\t\t\t\tsuccess: true,\r\n\t\t\t\t\t})\r\n\t\t\t\t\tshouldShutdown = true\r\n\t\t\t\t\tbreak\r\n\t\t\t}\r\n\r\n\t\t\tif (shouldShutdown) {\r\n\t\t\t\tbreak\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!hasReceivedStdinCommand) {\r\n\t\t\tthrow new Error(\"no stdin command provided\")\r\n\t\t}\r\n\r\n\t\tif (shouldShutdown && host.client.hasActiveTask()) {\r\n\t\t\thost.client.cancelTask()\r\n\t\t}\r\n\r\n\t\tif (!shouldShutdown) {\r\n\t\t\tif (activeTaskPromise) {\r\n\t\t\t\tawait activeTaskPromise\r\n\t\t\t} else if (host.client.hasActiveTask()) {\r\n\t\t\t\tawait waitForTaskProgressAfterStdinClosed(host, () => ({\r\n\t\t\t\t\thasSeenQueueState,\r\n\t\t\t\t\tqueueDepth: lastQueueDepth,\r\n\t\t\t\t}))\r\n\t\t\t}\r\n\t\t}\r\n\t} finally {\r\n\t\toffClientError()\r\n\t\thost.off(\"extensionWebviewMessage\", onExtensionMessage)\r\n\t\toffTaskCompleted()\r\n\t}\r\n}\r\n","export function isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null\n}\n","import fs from \"fs\"\r\nimport path from \"path\"\r\nimport { fileURLToPath } from \"url\"\r\n\r\nimport pWaitFor from \"p-wait-for\"\r\n\r\nimport type { TaskSessionEntry } from \"../../lib/utils\"\r\nimport type { Command, ModelRecord, WebviewMessage } from \"../../../types\"\r\nimport { openRouterDefaultModelId } from \"../../../types\"\r\n\r\nimport { ExtensionHost, type ExtensionHostOptions } from \"../../agent/index.js\"\r\nimport { readWorkspaceTaskSessions } from \"../../lib/task-history/index.js\"\r\nimport { getDefaultExtensionPath } from \"../../lib/utils/extension.js\"\r\nimport { getApiKeyFromEnv } from \"../../lib/utils/provider.js\"\r\nimport { isRecord } from \"../../lib/utils/guards.js\"\r\n\r\nconst __dirname = path.dirname(fileURLToPath(import.meta.url))\r\n\r\nconst REQUEST_TIMEOUT_MS = 10_000\r\n\r\ntype ListFormat = \"json\" | \"text\"\r\n\r\ntype BaseListOptions = {\r\n\tworkspace?: string\r\n\textension?: string\r\n\tapiKey?: string\r\n\tformat?: string\r\n\tdebug?: boolean\r\n}\r\n\r\ntype CommandLike = Pick<Command, \"name\" | \"source\" | \"filePath\" | \"description\" | \"argumentHint\">\r\ntype ModeLike = { slug: string; name: string }\r\ntype SessionLike = TaskSessionEntry\r\ntype ListHostOptions = { ephemeral: boolean }\r\n\r\nexport function parseFormat(rawFormat: string | undefined): ListFormat {\r\n\tconst format = (rawFormat ?? \"json\").toLowerCase()\r\n\tif (format === \"json\" || format === \"text\") {\r\n\t\treturn format\r\n\t}\r\n\r\n\tthrow new Error(`Invalid format: ${rawFormat}. Must be \"json\" or \"text\".`)\r\n}\r\n\r\nfunction resolveWorkspacePath(workspace: string | undefined): string {\r\n\tconst resolved = workspace ? path.resolve(workspace) : process.cwd()\r\n\r\n\tif (!fs.existsSync(resolved)) {\r\n\t\tthrow new Error(`Workspace path does not exist: ${resolved}`)\r\n\t}\r\n\r\n\treturn resolved\r\n}\r\n\r\nfunction resolveExtensionPath(extension: string | undefined): string {\r\n\tconst resolved = path.resolve(extension || getDefaultExtensionPath(__dirname))\r\n\r\n\tif (!fs.existsSync(path.join(resolved, \"extension.js\"))) {\r\n\t\tthrow new Error(`Extension bundle not found at: ${resolved}`)\r\n\t}\r\n\r\n\treturn resolved\r\n}\r\n\r\nfunction outputJson(data: unknown): void {\r\n\tprocess.stdout.write(JSON.stringify(data, null, 2) + \"\\n\")\r\n}\r\n\r\nfunction outputCommandsText(commands: CommandLike[]): void {\r\n\tfor (const command of commands) {\r\n\t\tconst description = command.description ? ` - ${command.description}` : \"\"\r\n\t\tprocess.stdout.write(`/${command.name} (${command.source})${description}\\n`)\r\n\t}\r\n}\r\n\r\nfunction outputModesText(modes: ModeLike[]): void {\r\n\tfor (const mode of modes) {\r\n\t\tprocess.stdout.write(`${mode.slug}\\t${mode.name}\\n`)\r\n\t}\r\n}\r\n\r\nfunction outputModelsText(models: ModelRecord): void {\r\n\tfor (const modelId of Object.keys(models).sort()) {\r\n\t\tprocess.stdout.write(`${modelId}\\n`)\r\n\t}\r\n}\r\n\r\nfunction formatSessionTitle(task: string): string {\r\n\tconst compact = task.replace(/\\s+/g, \" \").trim()\r\n\r\n\tif (!compact) {\r\n\t\treturn \"(untitled)\"\r\n\t}\r\n\r\n\treturn compact.length <= 120 ? compact : `${compact.slice(0, 117)}...`\r\n}\r\n\r\nfunction outputSessionsText(sessions: SessionLike[]): void {\r\n\tfor (const session of sessions) {\r\n\t\tconst startedAt = Number.isFinite(session.ts) ? new Date(session.ts).toISOString() : \"unknown-time\"\r\n\t\tprocess.stdout.write(`${session.id}\\t${startedAt}\\t${formatSessionTitle(session.task)}\\n`)\r\n\t}\r\n}\r\n\r\nasync function createListHost(options: BaseListOptions, hostOptions: ListHostOptions): Promise<ExtensionHost> {\r\n\tconst workspacePath = resolveWorkspacePath(options.workspace)\r\n\tconst extensionPath = resolveExtensionPath(options.extension)\r\n\tconst apiKey = options.apiKey || getApiKeyFromEnv(\"openrouter\")\r\n\r\n\tconst extensionHostOptions: ExtensionHostOptions = {\r\n\t\tmode: \"code\",\r\n\t\treasoningEffort: undefined,\r\n\t\tuser: null,\r\n\t\tprovider: \"openrouter\",\r\n\t\tmodel: openRouterDefaultModelId,\r\n\t\tapiKey,\r\n\t\tworkspacePath,\r\n\t\textensionPath,\r\n\t\tnonInteractive: true,\r\n\t\tephemeral: hostOptions.ephemeral,\r\n\t\tdebug: options.debug ?? false,\r\n\t\texitOnComplete: true,\r\n\t\texitOnError: false,\r\n\t\tdisableOutput: true,\r\n\t}\r\n\r\n\tconst host = new ExtensionHost(extensionHostOptions)\r\n\r\n\tawait host.activate()\r\n\r\n\t// Best effort wait; mode/commands requests can still succeed without this.\r\n\tawait pWaitFor(() => host.client.isInitialized(), {\r\n\t\tinterval: 25,\r\n\t\ttimeout: 2_000,\r\n\t}).catch(() => undefined)\r\n\r\n\treturn host\r\n}\r\n\r\n/**\r\n * Send a request to the extension and wait for a matching response message.\r\n * Returns `undefined` from `extract` to skip non-matching messages, or the\r\n * parsed value to resolve the promise.\r\n */\r\nfunction requestFromExtension<T>(\r\n\thost: ExtensionHost,\r\n\trequestType: WebviewMessage[\"type\"],\r\n\textract: (message: Record<string, unknown>) => T | undefined,\r\n): Promise<T> {\r\n\treturn new Promise<T>((resolve, reject) => {\r\n\t\tlet settled = false\r\n\r\n\t\tconst cleanup = () => {\r\n\t\t\tclearTimeout(timeoutId)\r\n\t\t\thost.off(\"extensionWebviewMessage\", onMessage)\r\n\t\t\toffError()\r\n\t\t}\r\n\r\n\t\tconst finish = (fn: () => void) => {\r\n\t\t\tif (settled) return\r\n\t\t\tsettled = true\r\n\t\t\tcleanup()\r\n\t\t\tfn()\r\n\t\t}\r\n\r\n\t\tconst onMessage = (message: unknown) => {\r\n\t\t\tif (!isRecord(message)) {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\tlet result: T | undefined\r\n\t\t\ttry {\r\n\t\t\t\tresult = extract(message)\r\n\t\t\t} catch (error) {\r\n\t\t\t\tfinish(() => reject(error instanceof Error ? error : new Error(String(error))))\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\tif (result !== undefined) {\r\n\t\t\t\tfinish(() => resolve(result))\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst offError = host.client.on(\"error\", (error) => {\r\n\t\t\tfinish(() => reject(error))\r\n\t\t})\r\n\r\n\t\tconst timeoutId = setTimeout(() => {\r\n\t\t\tfinish(() =>\r\n\t\t\t\treject(new Error(`Timed out waiting for ${requestType} response after ${REQUEST_TIMEOUT_MS}ms`)),\r\n\t\t\t)\r\n\t\t}, REQUEST_TIMEOUT_MS)\r\n\r\n\t\thost.on(\"extensionWebviewMessage\", onMessage)\r\n\t\thost.sendToExtension({ type: requestType })\r\n\t})\r\n}\r\n\r\nfunction requestCommands(host: ExtensionHost): Promise<CommandLike[]> {\r\n\treturn requestFromExtension(host, \"requestCommands\", (message) => {\r\n\t\tif (message.type !== \"commands\") {\r\n\t\t\treturn undefined\r\n\t\t}\r\n\t\treturn Array.isArray(message.commands) ? (message.commands as CommandLike[]) : []\r\n\t})\r\n}\r\n\r\nfunction requestModes(host: ExtensionHost): Promise<ModeLike[]> {\r\n\treturn requestFromExtension(host, \"requestModes\", (message) => {\r\n\t\tif (message.type !== \"modes\") {\r\n\t\t\treturn undefined\r\n\t\t}\r\n\t\treturn Array.isArray(message.modes) ? (message.modes as ModeLike[]) : []\r\n\t})\r\n}\r\n\r\nfunction requestOpenRouterModels(host: ExtensionHost): Promise<ModelRecord> {\r\n\treturn requestFromExtension(host, \"requestRouterModels\", (message) => {\r\n\t\tif (message.type !== \"routerModels\") {\r\n\t\t\treturn undefined\r\n\t\t}\r\n\r\n\t\tconst routerModels = isRecord(message.routerModels) ? message.routerModels : {}\r\n\t\tconst openRouterModels = routerModels.openrouter\r\n\t\treturn isRecord(openRouterModels) ? (openRouterModels as ModelRecord) : {}\r\n\t})\r\n}\r\n\r\nasync function withHostAndSignalHandlers<T>(\r\n\toptions: BaseListOptions,\r\n\thostOptions: ListHostOptions,\r\n\tfn: (host: ExtensionHost) => Promise<T>,\r\n): Promise<T> {\r\n\tconst host = await createListHost(options, hostOptions)\r\n\r\n\tconst shutdown = async (exitCode: number) => {\r\n\t\tawait host.dispose()\r\n\t\tprocess.exit(exitCode)\r\n\t}\r\n\r\n\tconst onSigint = () => void shutdown(130)\r\n\tconst onSigterm = () => void shutdown(143)\r\n\r\n\tprocess.on(\"SIGINT\", onSigint)\r\n\tprocess.on(\"SIGTERM\", onSigterm)\r\n\r\n\ttry {\r\n\t\treturn await fn(host)\r\n\t} finally {\r\n\t\tprocess.off(\"SIGINT\", onSigint)\r\n\t\tprocess.off(\"SIGTERM\", onSigterm)\r\n\t\tawait host.dispose()\r\n\t}\r\n}\r\n\r\nexport async function listCommands(options: BaseListOptions): Promise<void> {\r\n\tconst format = parseFormat(options.format)\r\n\r\n\tawait withHostAndSignalHandlers(options, { ephemeral: true }, async (host) => {\r\n\t\tconst commands = await requestCommands(host)\r\n\r\n\t\tif (format === \"json\") {\r\n\t\t\toutputJson({ commands })\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\toutputCommandsText(commands)\r\n\t})\r\n}\r\n\r\nexport async function listModes(options: BaseListOptions): Promise<void> {\r\n\tconst format = parseFormat(options.format)\r\n\r\n\tawait withHostAndSignalHandlers(options, { ephemeral: true }, async (host) => {\r\n\t\tconst modes = await requestModes(host)\r\n\r\n\t\tif (format === \"json\") {\r\n\t\t\toutputJson({ modes })\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\toutputModesText(modes)\r\n\t})\r\n}\r\n\r\nexport async function listModels(options: BaseListOptions): Promise<void> {\r\n\tconst format = parseFormat(options.format)\r\n\r\n\tawait withHostAndSignalHandlers(options, { ephemeral: true }, async (host) => {\r\n\t\tconst models = await requestOpenRouterModels(host)\r\n\r\n\t\tif (format === \"json\") {\r\n\t\t\toutputJson({ models })\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\toutputModelsText(models)\r\n\t})\r\n}\r\n\r\nexport async function listSessions(options: BaseListOptions): Promise<void> {\r\n\tconst format = parseFormat(options.format)\r\n\tconst workspacePath = resolveWorkspacePath(options.workspace)\r\n\tconst sessions = await readWorkspaceTaskSessions(workspacePath)\r\n\r\n\tif (format === \"json\") {\r\n\t\toutputJson({ workspace: workspacePath, sessions })\r\n\t\treturn\r\n\t}\r\n\r\n\toutputSessionsText(sessions)\r\n}\r\n","import { spawn } from \"child_process\"\r\n\r\nimport { VERSION } from \"../../lib/utils/version.js\"\r\nimport { isRecord } from \"../../lib/utils/guards.js\"\r\n\r\nconst RELEASES_URL = \"https://api.github.com/repos/RooCodeInc/Roo-Code/releases?per_page=100\"\r\nexport const INSTALL_SCRIPT_COMMAND =\r\n\t\"curl -fsSL https://raw.githubusercontent.com/RooCodeInc/Roo-Code/main/apps/cli/install.sh | sh\"\r\n\r\nexport interface UpgradeOptions {\r\n\tcurrentVersion?: string\r\n\tfetchImpl?: typeof fetch\r\n\trunInstaller?: () => Promise<void>\r\n}\r\n\r\nfunction parseVersion(version: string): number[] {\r\n\tconst cleaned = version\r\n\t\t.trim()\r\n\t\t.replace(/^cli-v/, \"\")\r\n\t\t.replace(/^v/, \"\")\r\n\tconst core = cleaned.split(\"+\", 1)[0]?.split(\"-\", 1)[0]\r\n\r\n\tif (!core) {\r\n\t\tthrow new Error(`Invalid version: ${version}`)\r\n\t}\r\n\r\n\tconst parts = core.split(\".\")\r\n\tif (parts.length === 0) {\r\n\t\tthrow new Error(`Invalid version: ${version}`)\r\n\t}\r\n\r\n\treturn parts.map((part) => {\r\n\t\tif (!/^\\d+$/.test(part)) {\r\n\t\t\tthrow new Error(`Invalid version: ${version}`)\r\n\t\t}\r\n\r\n\t\treturn Number.parseInt(part, 10)\r\n\t})\r\n}\r\n\r\n/**\r\n * Returns:\r\n * - 1 when `a > b`\r\n * - 0 when `a === b`\r\n * - -1 when `a < b`\r\n */\r\nexport function compareVersions(a: string, b: string): number {\r\n\tconst aParts = parseVersion(a)\r\n\tconst bParts = parseVersion(b)\r\n\tconst maxLength = Math.max(aParts.length, bParts.length)\r\n\r\n\tfor (let i = 0; i < maxLength; i++) {\r\n\t\tconst aPart = aParts[i] ?? 0\r\n\t\tconst bPart = bParts[i] ?? 0\r\n\r\n\t\tif (aPart > bPart) {\r\n\t\t\treturn 1\r\n\t\t}\r\n\r\n\t\tif (aPart < bPart) {\r\n\t\t\treturn -1\r\n\t\t}\r\n\t}\r\n\r\n\treturn 0\r\n}\r\n\r\nexport async function getLatestCliVersion(fetchImpl: typeof fetch = fetch): Promise<string> {\r\n\tconst response = await fetchImpl(RELEASES_URL, {\r\n\t\theaders: {\r\n\t\t\tAccept: \"application/vnd.github+json\",\r\n\t\t\t\"User-Agent\": \"roo-cli\",\r\n\t\t},\r\n\t})\r\n\r\n\tif (!response.ok) {\r\n\t\tthrow new Error(`Failed to check latest version (HTTP ${response.status})`)\r\n\t}\r\n\r\n\tconst releases = await response.json()\r\n\tif (!Array.isArray(releases)) {\r\n\t\tthrow new Error(\"Invalid release response from GitHub.\")\r\n\t}\r\n\r\n\tlet latestVersion: string | undefined\r\n\r\n\tfor (const release of releases) {\r\n\t\tif (!isRecord(release)) {\r\n\t\t\tcontinue\r\n\t\t}\r\n\r\n\t\tconst tagName = release.tag_name\r\n\t\tif (typeof tagName === \"string\" && tagName.startsWith(\"cli-v\")) {\r\n\t\t\tconst candidate = tagName.slice(\"cli-v\".length)\r\n\t\t\ttry {\r\n\t\t\t\tif (!latestVersion || compareVersions(candidate, latestVersion) > 0) {\r\n\t\t\t\t\tlatestVersion = candidate\r\n\t\t\t\t}\r\n\t\t\t} catch {\r\n\t\t\t\t// Ignore malformed CLI tags and keep scanning other releases.\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (latestVersion) {\r\n\t\treturn latestVersion\r\n\t}\r\n\r\n\tthrow new Error(\"Could not determine the latest CLI release version.\")\r\n}\r\n\r\nexport function runUpgradeInstaller(version?: string, spawnImpl: typeof spawn = spawn): Promise<void> {\r\n\treturn new Promise((resolve, reject) => {\r\n\t\tconst env = version ? { ...process.env, ROO_VERSION: version } : process.env\r\n\t\tconst child = spawnImpl(\"sh\", [\"-c\", INSTALL_SCRIPT_COMMAND], { stdio: \"inherit\", env })\r\n\r\n\t\tchild.once(\"error\", (error) => {\r\n\t\t\treject(error)\r\n\t\t})\r\n\r\n\t\tchild.once(\"close\", (code, signal) => {\r\n\t\t\tif (code === 0) {\r\n\t\t\t\tresolve()\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\tconst reason = signal ? `signal ${signal}` : `exit code ${code ?? \"unknown\"}`\r\n\t\t\treject(new Error(`Upgrade installer failed (${reason}).`))\r\n\t\t})\r\n\t})\r\n}\r\n\r\nexport async function upgrade(options: UpgradeOptions = {}): Promise<void> {\r\n\tconst currentVersion = options.currentVersion ?? VERSION\r\n\tconst fetchImpl = options.fetchImpl ?? fetch\r\n\tconst runInstaller = options.runInstaller\r\n\r\n\tconsole.log(`Current version: ${currentVersion}`)\r\n\r\n\tconst latestVersion = await getLatestCliVersion(fetchImpl)\r\n\tconsole.log(`Latest version: ${latestVersion}`)\r\n\r\n\tif (compareVersions(latestVersion, currentVersion) <= 0) {\r\n\t\tconsole.log(\"Roo CLI is already up to date.\")\r\n\t\treturn\r\n\t}\r\n\r\n\tconsole.log(`Upgrading Roo CLI from ${currentVersion} to ${latestVersion}...`)\r\n\tif (runInstaller) {\r\n\t\tawait runInstaller()\r\n\t} else {\r\n\t\tawait runUpgradeInstaller(latestVersion)\r\n\t}\r\n\tconsole.log(\"✓ Upgrade completed.\")\r\n}\r\n"],"mappings":"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;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACD;AAAA,MACD;AAAA,MACA,OAAS;AAAA,QACR,UAAY;AAAA,QACZ,QAAU;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACD;AAAA,MACD;AAAA,MACA,QAAU;AAAA,QACT,UAAY;AAAA,QACZ,QAAU;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACD;AAAA,MACD;AAAA,MACA,QAAU;AAAA,QACT,UAAY;AAAA,QACZ,QAAU;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACD;AAAA,MACD;AAAA,MACA,QAAU;AAAA,QACT,UAAY;AAAA,QACZ,QAAU;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACD;AAAA,MACD;AAAA,MACA,UAAY;AAAA,QACX,UAAY;AAAA,QACZ,QAAU;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA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AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACD;AAAA,MACD;AAAA,MACA,MAAQ;AAAA,QACP,UAAY;AAAA,QACZ,QAAU;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACD;AAAA,MACD;AAAA,MACA,QAAU;AAAA,QACT,UAAY;AAAA,QACZ,QAAU;AAAA,UACT;AAAA,UACA;AAAA,QACD;AAAA,MACD;AAAA,MACA,MAAQ;AAAA,QACP,UAAY;AAAA,QACZ,QAAU;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,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","names":["z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","init_types","init_types","init_types","init_types","fs","os","path","fs","path","fs","path","os","path","path2","text","init_utils","path","normalizePath","arePathsEqual","path2","init_path","create","initialState","useState","jsx","useTerminalSize","create","useEffect","useCallback","useRef","fs","path","init_history","useState","useEffect","useCallback","useRef","init_history","useEffect","useRef","useEffect","path","useCallback","useRef","text","init_utils","useEffect","useRef","useCallback","randomUUID","pWaitFor","arePathsEqual","init_path","useCallback","randomUUID","text","useEffect","useRef","useInput","useCallback","init_utils","Text","jsx","jsxs","memo","Text","Box","jsx","jsxs","memo","Text","Box","jsx","jsxs","useTerminalSize","Box","Text","jsx","memo","Box","Text","jsx","jsxs","init_types","text","init_utils","Box","Text","Fragment","jsx","jsxs","path","init_utils","Box","Text","Fragment","jsx","jsxs","path","init_utils","Box","Text","Fragment","jsx","jsxs","path","init_utils","Box","Text","jsx","jsxs","init_utils","Box","Text","jsx","jsxs","init_utils","Box","Text","jsx","jsxs","init_utils","Box","Text","jsx","jsxs","path","MAX_CONTENT_LINES","init_utils","init_tools","init_types","init_utils","memo","Box","Text","Fragment","jsx","jsxs","getToolCategory","sanitizeContent","text","parseToolInfo","path","init_tools","spinners","Box","Text","useEffect","useState","jsx","jsxs","spinners","memo","Text","Box","jsx","jsxs","Text","jsx","useTerminalSize","useState","useEffect","useMemo","useCallback","useRef","Box","Text","useInput","jsx","jsxs","text","lines","useState","useCallback","useRef","useEffect","useInput","useState","useCallback","useEffect","useRef","jsx","useTerminalSize","text","useRef","useMemo","Box","Text","useInput","jsx","jsxs","init_types","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","Box","Text","fuzzysort","jsx","jsxs","Box","Text","jsx","jsxs","Box","Text","fuzzysort","jsx","jsxs","text","init_types","Box","Text","useInput","useEffect","useRef","useCallback","useMemo","useState","jsx","jsxs","Box","Text","memo","jsx","jsxs","Box","Text","useApp","useInput","useState","useEffect","useCallback","useRef","useMemo","Fragment","jsx","jsxs","useTerminalSize","arePathsEqual","text","init_path","init_utils","fs","path","fileURLToPath","pWaitFor","path","path","fs","fs","path","fs","path","fs","path","fs","path","path","ConfigurationTarget","ExtensionMode","FileType","ViewColumn","UIKind","EndOfLine","StatusBarAlignment","DiagnosticSeverity","DiagnosticTag","OverviewRulerLane","DecorationRangeBehavior","TextEditorRevealType","fs","path","text","newContent","text","fs","path","hostname","text","init_types","text","fs","path","path","fs","path","os","fs","init_utils","os","path","fs","path","path","fs","dirname","path","fileURLToPath","fs","EventEmitter","init_types","EventEmitter","init_utils","text","text","text","text","path","fileURLToPath","fs","EventEmitter","require","message","isRecord","isRecord","text","__dirname","path","fileURLToPath","pWaitFor","fs","App","fs","path","fileURLToPath","pWaitFor","__dirname","path","fileURLToPath","fs","pWaitFor","isRecord","isRecord"]}
|