UNPKG

warp-task-master

Version:

BETA: Experimental Task Master fork with Warp AI integration and human-readable profile names. For production use, see task-master-ai.

51 lines (39 loc) 42.5 kB
import{getClaudeCodeSettingsForCommand as e,getGrokCliSettingsForCommand as t,log as n}from"./utils-Can7ymw4.js";import{join as r}from"path";import{promises as i}from"fs";import{spawn as a}from"child_process";import{homedir as o}from"os";import{createAnthropic as s}from"@ai-sdk/anthropic";import{JSONParseError as c,NoObjectGeneratedError as l,generateObject as u,generateText as d,streamObject as f,streamText as p,zodSchema as m}from"ai";import{jsonrepair as h}from"jsonrepair";import{createPerplexity as ee}from"@ai-sdk/perplexity";import{createGoogleGenerativeAI as te}from"@ai-sdk/google";import{createOpenAI as ne}from"@ai-sdk/openai";import{createXai as re}from"@ai-sdk/xai";import{createGroq as g}from"@ai-sdk/groq";import{createOpenRouter as _}from"@openrouter/ai-sdk-provider";import{createOllama as v}from"ollama-ai-provider";import{createAmazonBedrock as y}from"@ai-sdk/amazon-bedrock";import{fromNodeProviderChain as b}from"@aws-sdk/credential-providers";import{createAzure as x}from"@ai-sdk/azure";import{createVertex as S}from"@ai-sdk/google-vertex";import{APICallError as C,LoadAPIKeyError as w,NoSuchModelError as T}from"@ai-sdk/provider";import{generateId as E}from"@ai-sdk/provider-utils";import{parse as ie}from"jsonc-parser";import{execSync as ae,spawn as oe}from"node:child_process";var D=class e{constructor(){if(this.constructor===e)throw Error(`BaseAIProvider cannot be instantiated directly`);this.name=this.constructor.name}validateAuth(e){if(!e.apiKey)throw Error(`${this.name} API key is required`)}validateParams(e){if(this.validateAuth(e),!e.modelId)throw Error(`${this.name} Model ID is required`);this.validateOptionalParams(e)}validateOptionalParams(e){if(e.temperature!==void 0&&(e.temperature<0||e.temperature>1))throw Error(`Temperature must be between 0 and 1`);if(e.maxTokens!==void 0){let t=Number(e.maxTokens);if(!Number.isFinite(t)||t<=0)throw Error(`maxTokens must be a finite number greater than 0`)}}validateMessages(e){if(!e||!Array.isArray(e)||e.length===0)throw Error(`Invalid or empty messages array provided`);for(let t of e)if(!t.role||!t.content)throw Error(`Invalid message format. Each message must have role and content`)}handleError(e,t){let r=t.message||`Unknown error occurred`;throw n(`error`,`${this.name} ${e} failed: ${r}`,{error:t}),Error(`${this.name} API error during ${e}: ${r}`)}getClient(e){throw Error(`getClient must be implemented by provider`)}isRequiredApiKey(){return!0}getRequiredApiKeyName(){throw Error(`getRequiredApiKeyName must be implemented by provider`)}requiresMaxCompletionTokens(e){return!1}prepareTokenParam(e,t){if(t===void 0)return{};let n=Math.floor(Number(t));return this.requiresMaxCompletionTokens(e)?{max_completion_tokens:n}:{maxTokens:n}}async generateText(e){try{this.validateParams(e),this.validateMessages(e.messages),n(`debug`,`Generating ${this.name} text with model: ${e.modelId}`);let t=await this.getClient(e),r=await d({model:t(e.modelId),messages:e.messages,...this.prepareTokenParam(e.modelId,e.maxTokens),temperature:e.temperature});return n(`debug`,`${this.name} generateText completed successfully for model: ${e.modelId}`),{text:r.text,usage:{inputTokens:r.usage?.promptTokens,outputTokens:r.usage?.completionTokens,totalTokens:r.usage?.totalTokens}}}catch(e){this.handleError(`text generation`,e)}}async streamText(e){try{this.validateParams(e),this.validateMessages(e.messages),n(`debug`,`Streaming ${this.name} text with model: ${e.modelId}`);let t=await this.getClient(e),r=await p({model:t(e.modelId),messages:e.messages,...this.prepareTokenParam(e.modelId,e.maxTokens),temperature:e.temperature});return n(`debug`,`${this.name} streamText initiated successfully for model: ${e.modelId}`),r}catch(e){this.handleError(`text streaming`,e)}}async streamObject(e){try{if(this.validateParams(e),this.validateMessages(e.messages),!e.schema)throw Error(`Schema is required for object streaming`);n(`debug`,`Streaming ${this.name} object with model: ${e.modelId}`);let t=await this.getClient(e),r=await f({model:t(e.modelId),messages:e.messages,schema:m(e.schema),mode:e.mode||`auto`,maxTokens:e.maxTokens,temperature:e.temperature});return n(`debug`,`${this.name} streamObject initiated successfully for model: ${e.modelId}`),r}catch(e){this.handleError(`object streaming`,e)}}async generateObject(e){try{if(this.validateParams(e),this.validateMessages(e.messages),!e.schema)throw Error(`Schema is required for object generation`);if(!e.objectName)throw Error(`Object name is required for object generation`);n(`debug`,`Generating ${this.name} object ('${e.objectName}') with model: ${e.modelId}`);let t=await this.getClient(e),r=await u({model:t(e.modelId),messages:e.messages,schema:m(e.schema),mode:e.mode||`auto`,...this.prepareTokenParam(e.modelId,e.maxTokens),temperature:e.temperature});return n(`debug`,`${this.name} generateObject completed successfully for model: ${e.modelId}`),{object:r.object,usage:{inputTokens:r.usage?.promptTokens,outputTokens:r.usage?.completionTokens,totalTokens:r.usage?.totalTokens}}}catch(e){if(l.isInstance(e)&&c.isInstance(e.cause)&&e.cause.text){n(`warn`,`${this.name} generated malformed JSON, attempting to repair...`);try{let t=h(e.cause.text),r=JSON.parse(t);return n(`info`,`Successfully repaired ${this.name} JSON output`),{object:r,usage:{inputTokens:e.usage?.promptTokens||0,outputTokens:e.usage?.completionTokens||0,totalTokens:e.usage?.totalTokens||0}}}catch(e){n(`error`,`Failed to repair ${this.name} JSON: ${e.message}`)}}this.handleError(`object generation`,e)}}},se=class extends D{constructor(){super(),this.name=`Anthropic`}getRequiredApiKeyName(){return`ANTHROPIC_API_KEY`}getClient(e){try{let{apiKey:t,baseURL:n}=e;if(!t)throw Error(`Anthropic API key is required.`);return s({apiKey:t,...n&&{baseURL:n},headers:{"anthropic-beta":`output-128k-2025-02-19`}})}catch(e){this.handleError(`client initialization`,e)}}},ce=class extends D{constructor(){super(),this.name=`Perplexity`}getRequiredApiKeyName(){return`PERPLEXITY_API_KEY`}getClient(e){try{let{apiKey:t,baseURL:n}=e;if(!t)throw Error(`Perplexity API key is required.`);return ee({apiKey:t,baseURL:n||`https://api.perplexity.ai`})}catch(e){this.handleError(`client initialization`,e)}}async generateObject(e){return super.generateObject({...e,mode:`json`})}},le=class extends D{constructor(){super(),this.name=`Google`}getRequiredApiKeyName(){return`GOOGLE_API_KEY`}getClient(e){try{let{apiKey:t,baseURL:n}=e;if(!t)throw Error(`Google API key is required.`);return te({apiKey:t,...n&&{baseURL:n}})}catch(e){this.handleError(`client initialization`,e)}}},ue=class extends D{constructor(){super(),this.name=`OpenAI`}getRequiredApiKeyName(){return`OPENAI_API_KEY`}requiresMaxCompletionTokens(e){return e&&e.startsWith(`gpt-5`)}getClient(e){try{let{apiKey:t,baseURL:n}=e;if(!t)throw Error(`OpenAI API key is required.`);return ne({apiKey:t,...n&&{baseURL:n}})}catch(e){this.handleError(`client initialization`,e)}}},de=class extends D{constructor(){super(),this.name=`xAI`}getRequiredApiKeyName(){return`XAI_API_KEY`}getClient(e){try{let{apiKey:t,baseURL:n}=e;if(!t)throw Error(`xAI API key is required.`);return re({apiKey:t,baseURL:n||`https://api.x.ai/v1`})}catch(e){this.handleError(`client initialization`,e)}}},fe=class extends D{constructor(){super(),this.name=`Groq`}getRequiredApiKeyName(){return`GROQ_API_KEY`}getClient(e){try{let{apiKey:t,baseURL:n}=e;if(!t)throw Error(`Groq API key is required.`);return g({apiKey:t,...n&&{baseURL:n}})}catch(e){this.handleError(`client initialization`,e)}}},pe=class extends D{constructor(){super(),this.name=`OpenRouter`}getRequiredApiKeyName(){return`OPENROUTER_API_KEY`}getClient(e){try{let{apiKey:t,baseURL:n}=e;if(!t)throw Error(`OpenRouter API key is required.`);return _({apiKey:t,...n&&{baseURL:n}})}catch(e){this.handleError(`client initialization`,e)}}},me=class extends D{constructor(){super(),this.name=`Ollama`}validateAuth(e){}getClient(e){try{let{baseURL:t}=e;return v({...t&&{baseURL:t}})}catch(e){this.handleError(`client initialization`,e)}}isRequiredApiKey(){return!1}getRequiredApiKeyName(){return`OLLAMA_API_KEY`}},he=class extends D{constructor(){super(),this.name=`Bedrock`}isRequiredApiKey(){return!1}getRequiredApiKeyName(){return`AWS_ACCESS_KEY_ID`}validateAuth(e){}getClient(e){try{let e=b();return y({credentialProvider:e})}catch(e){this.handleError(`client initialization`,e)}}},ge=class extends D{constructor(){super(),this.name=`Azure OpenAI`}getRequiredApiKeyName(){return`AZURE_OPENAI_API_KEY`}validateAuth(e){if(!e.apiKey)throw Error(`Azure API key is required`);if(!e.baseURL)throw Error(`Azure endpoint URL is required. Set it in .taskmasterconfig global.azureBaseURL or models.[role].baseURL`)}getClient(e){try{let{apiKey:t,baseURL:n}=e;return x({apiKey:t,baseURL:n})}catch(e){this.handleError(`client initialization`,e)}}},O=class extends Error{constructor(e){super(e),this.name=`VertexAuthError`,this.code=`vertex_auth_error`}},k=class extends Error{constructor(e){super(e),this.name=`VertexConfigError`,this.code=`vertex_config_error`}},A=class extends Error{constructor(e,t){super(e),this.name=`VertexApiError`,this.code=`vertex_api_error`,this.statusCode=t}},j=class extends D{constructor(){super(),this.name=`Google Vertex AI`}getRequiredApiKeyName(){return`GOOGLE_API_KEY`}validateAuth(e){let{apiKey:t,projectId:n,location:r,credentials:i}=e;if(!t&&!i)throw new O(`Either Google API key (GOOGLE_API_KEY) or service account credentials (GOOGLE_APPLICATION_CREDENTIALS) is required for Vertex AI`);if(!n)throw new k(`Google Cloud project ID is required for Vertex AI. Set VERTEX_PROJECT_ID environment variable.`);if(!r)throw new k(`Google Cloud location is required for Vertex AI. Set VERTEX_LOCATION environment variable (e.g., "us-central1").`)}getClient(e){try{this.validateAuth(e);let{apiKey:t,projectId:n,location:r,credentials:i,baseURL:a}=e,o={};return t?o.apiKey=t:i&&(o.googleAuthOptions=i),S({...o,projectId:n,location:r,...a&&{baseURL:a}})}catch(e){this.handleError(`client initialization`,e)}}handleError(e,t){if(n(`error`,`Vertex AI ${e} error:`,t),t.name===`VertexAuthError`||t.name===`VertexConfigError`||t.name===`VertexApiError`)throw t;if(t.response){let e=t.response.status,n=t.response.data?.error?.message||t.message;throw e===401||e===403?new O(`Authentication failed: ${n}`):e===400?new k(`Invalid request: ${n}`):new A(`API error (${e}): ${n}`,e)}throw Error(`Vertex AI ${e} failed: ${t.message}`)}};function M(e,t){let n=[],r;for(let t of e)switch(t.role){case`system`:r=t.content;break;case`user`:if(typeof t.content==`string`)n.push(t.content);else{let e=t.content.filter(e=>e.type===`text`).map(e=>e.text).join(` `);e&&n.push(e),t.content.filter(e=>e.type===`image`).length>0&&console.warn(`Claude Code CLI does not support image inputs. Images will be ignored.`)}break;case`assistant`:if(typeof t.content==`string`)n.push(`Assistant: ${t.content}`);else{let e=t.content.filter(e=>e.type===`text`).map(e=>e.text).join(` `);e&&n.push(`Assistant: ${e}`),t.content.filter(e=>e.type===`tool-call`).length>0&&n.push(`Assistant: [Tool calls made]`)}break;case`tool`:n.push(`Tool Result (${t.content[0].toolName}): ${JSON.stringify(t.content[0].result)}`);break}let i=``;if(r&&(i=r),n.length===0)return{messagesPrompt:i,systemPrompt:r};let a=[];for(let e=0;e<n.length;e++){let t=n[e];t.startsWith(`Assistant:`)||t.startsWith(`Tool Result`)?a.push(t):a.push(`Human: ${t}`)}return i=i?i+` `+a.join(` `):a.join(` `),t?.type===`object-json`&&(i=`${i} CRITICAL INSTRUCTION: You MUST respond with ONLY valid JSON. Follow these rules EXACTLY: 1. Start your response with an opening brace { 2. End your response with a closing brace } 3. Do NOT include any text before the opening brace 4. Do NOT include any text after the closing brace 5. Do NOT use markdown code blocks or backticks 6. Do NOT include explanations or commentary 7. The ENTIRE response must be valid JSON that can be parsed with JSON.parse() Begin your response with { and end with }`),{messagesPrompt:i,systemPrompt:r}}function N(e){let t=e.trim();t=t.replace(/^```json\s*/gm,``),t=t.replace(/^```\s*/gm,``),t=t.replace(/```\s*$/gm,``),t=t.replace(/^const\s+\w+\s*=\s*/,``),t=t.replace(/^let\s+\w+\s*=\s*/,``),t=t.replace(/^var\s+\w+\s*=\s*/,``),t=t.replace(/;?\s*$/,``);let n=t.match(/{[\s\S]*}/),r=t.match(/\[[\s\S]*\]/);n?t=n[0]:r&&(t=r[0]);try{return JSON.parse(t),t}catch{try{let e=t.replace(/([{,]\s*)([a-zA-Z_$][a-zA-Z0-9_$]*)\s*:/g,`$1"$2":`).replace(/'/g,`"`);return JSON.parse(e),e}catch{return e}}}function P({message:e,code:t,exitCode:n,stderr:r,promptExcerpt:i,isRetryable:a=!1}){return new C({message:e,isRetryable:a,url:`claude-code-cli://command`,requestBodyValues:i?{prompt:i}:void 0,data:{code:t,exitCode:n,stderr:r,promptExcerpt:i}})}function F({message:e}){return new w({message:e||`Authentication failed. Please ensure Claude Code CLI is properly authenticated.`})}let I,L;async function R(){if(!I||!L)try{let e=await import(`@anthropic-ai/claude-code`);I=e.query,L=e.AbortError}catch(e){throw Error(`Claude Code SDK is not installed. Please install '@anthropic-ai/claude-code' to use the claude-code provider.`)}}const _e={opus:`opus`,sonnet:`sonnet`};var ve=class{specificationVersion=`v1`;defaultObjectGenerationMode=`json`;supportsImageUrls=!1;supportsStructuredOutputs=!1;modelId;settings;sessionId;constructor(e){if(this.modelId=e.id,this.settings=e.settings??{},!this.modelId||typeof this.modelId!=`string`||this.modelId.trim()===``)throw new T({modelId:this.modelId,modelType:`languageModel`})}get provider(){return`claude-code`}getModel(){return _e[this.modelId]??this.modelId}generateUnsupportedWarnings(e){let t=[],n=[];if(e.temperature!==void 0&&n.push(`temperature`),e.maxTokens!==void 0&&n.push(`maxTokens`),e.topP!==void 0&&n.push(`topP`),e.topK!==void 0&&n.push(`topK`),e.presencePenalty!==void 0&&n.push(`presencePenalty`),e.frequencyPenalty!==void 0&&n.push(`frequencyPenalty`),e.stopSequences!==void 0&&e.stopSequences.length>0&&n.push(`stopSequences`),e.seed!==void 0&&n.push(`seed`),n.length>0)for(let e of n)t.push({type:`unsupported-setting`,setting:e,details:`Claude Code CLI does not support the ${e} parameter. It will be ignored.`});return t}async doGenerate(e){await R();let{messagesPrompt:t}=M(e.prompt,e.mode),n=new AbortController;e.abortSignal&&e.abortSignal.addEventListener(`abort`,()=>n.abort());let r={model:this.getModel(),abortController:n,resume:this.sessionId,pathToClaudeCodeExecutable:this.settings.pathToClaudeCodeExecutable,customSystemPrompt:this.settings.customSystemPrompt,appendSystemPrompt:this.settings.appendSystemPrompt,maxTurns:this.settings.maxTurns,maxThinkingTokens:this.settings.maxThinkingTokens,cwd:this.settings.cwd,executable:this.settings.executable,executableArgs:this.settings.executableArgs,permissionMode:this.settings.permissionMode,permissionPromptToolName:this.settings.permissionPromptToolName,continue:this.settings.continue,allowedTools:this.settings.allowedTools,disallowedTools:this.settings.disallowedTools,mcpServers:this.settings.mcpServers},i=``,a={promptTokens:0,completionTokens:0},o=`stop`,s,c,l,u=this.generateUnsupportedWarnings(e);try{if(!I)throw Error(`Claude Code SDK is not installed. Please install '@anthropic-ai/claude-code' to use the claude-code provider.`);let e=I({prompt:t,options:r});for await(let t of e)t.type===`assistant`?i+=t.message.content.map(e=>e.type===`text`?e.text:``).join(``):t.type===`result`?(this.sessionId=t.session_id,s=t.total_cost_usd,c=t.duration_ms,`usage`in t&&(l=t.usage,a={promptTokens:(t.usage.cache_creation_input_tokens??0)+(t.usage.cache_read_input_tokens??0)+(t.usage.input_tokens??0),completionTokens:t.usage.output_tokens??0}),t.subtype===`error_max_turns`?o=`length`:t.subtype===`error_during_execution`&&(o=`error`)):t.type===`system`&&t.subtype===`init`&&(this.sessionId=t.session_id)}catch(n){if(n instanceof SyntaxError&&/JSON/i.test(n.message||``)&&(n.message.includes(`position`)||n.message.includes(`Unexpected end`))&&i&&i.length>0)u.push({type:`provider-warning`,details:`Claude Code SDK emitted a JSON parse error but Task Master recovered buffered text (possible CLI truncation).`}),o=`truncated`;else throw L&&n instanceof L?e.abortSignal?.aborted?e.abortSignal.reason:n:n.message?.includes(`not logged in`)||n.message?.includes(`authentication`)||n.exitCode===401?F({message:n.message||`Authentication failed. Please ensure Claude Code CLI is properly authenticated.`}):P({message:n.message||`Claude Code CLI error`,code:n.code,exitCode:n.exitCode,stderr:n.stderr,promptExcerpt:t.substring(0,200),isRetryable:n.code===`ENOENT`||n.code===`ECONNREFUSED`})}return e.mode?.type===`object-json`&&i&&(i=N(i)),{text:i||void 0,usage:a,finishReason:o,rawCall:{rawPrompt:t,rawSettings:r},warnings:u.length>0?u:void 0,response:{id:E(),timestamp:new Date,modelId:this.modelId},request:{body:t},providerMetadata:{"claude-code":{...this.sessionId!==void 0&&{sessionId:this.sessionId},...s!==void 0&&{costUsd:s},...c!==void 0&&{durationMs:c},...l!==void 0&&{rawUsage:l}}}}}async doStream(e){await R();let{messagesPrompt:t}=M(e.prompt,e.mode),n=new AbortController;e.abortSignal&&e.abortSignal.addEventListener(`abort`,()=>n.abort());let r={model:this.getModel(),abortController:n,resume:this.sessionId,pathToClaudeCodeExecutable:this.settings.pathToClaudeCodeExecutable,customSystemPrompt:this.settings.customSystemPrompt,appendSystemPrompt:this.settings.appendSystemPrompt,maxTurns:this.settings.maxTurns,maxThinkingTokens:this.settings.maxThinkingTokens,cwd:this.settings.cwd,executable:this.settings.executable,executableArgs:this.settings.executableArgs,permissionMode:this.settings.permissionMode,permissionPromptToolName:this.settings.permissionPromptToolName,continue:this.settings.continue,allowedTools:this.settings.allowedTools,disallowedTools:this.settings.disallowedTools,mcpServers:this.settings.mcpServers},i=this.generateUnsupportedWarnings(e);return{stream:new ReadableStream({start:async n=>{try{if(!I)throw Error(`Claude Code SDK is not installed. Please install '@anthropic-ai/claude-code' to use the claude-code provider.`);let i=I({prompt:t,options:r}),a={promptTokens:0,completionTokens:0},o=``;for await(let t of i)if(t.type===`assistant`){let r=t.message.content.map(e=>e.type===`text`?e.text:``).join(``);r&&(o+=r,e.mode?.type!==`object-json`&&n.enqueue({type:`text-delta`,textDelta:r}))}else if(t.type===`result`){let r;`usage`in t&&(r=t.usage,a={promptTokens:(t.usage.cache_creation_input_tokens??0)+(t.usage.cache_read_input_tokens??0)+(t.usage.input_tokens??0),completionTokens:t.usage.output_tokens??0});let i=`stop`;if(t.subtype===`error_max_turns`?i=`length`:t.subtype===`error_during_execution`&&(i=`error`),this.sessionId=t.session_id,e.mode?.type===`object-json`&&o){let e=N(o);n.enqueue({type:`text-delta`,textDelta:e})}n.enqueue({type:`finish`,finishReason:i,usage:a,providerMetadata:{"claude-code":{sessionId:t.session_id,...t.total_cost_usd!==void 0&&{costUsd:t.total_cost_usd},...t.duration_ms!==void 0&&{durationMs:t.duration_ms},...r!==void 0&&{rawUsage:r}}}})}else t.type===`system`&&t.subtype===`init`&&(this.sessionId=t.session_id,n.enqueue({type:`response-metadata`,id:t.session_id,timestamp:new Date,modelId:this.modelId}));if(error instanceof SyntaxError&&/JSON/i.test(error.message||``)&&(error.message.includes(`position`)||error.message.includes(`Unexpected end`))&&o&&o.length>0){let t=e.mode?.type===`object-json`?N(o):o;n.enqueue({type:`text-delta`,textDelta:t}),n.enqueue({type:`finish`,finishReason:`truncated`,usage:a,providerMetadata:{"claude-code":{truncated:!0}},warnings:[{type:`provider-warning`,details:`Claude Code SDK JSON truncation detected; stream recovered.`}]}),n.close();return}n.close()}catch(r){let i;i=L&&r instanceof L?e.abortSignal?.aborted?e.abortSignal.reason:r:r.message?.includes(`not logged in`)||r.message?.includes(`authentication`)||r.exitCode===401?F({message:r.message||`Authentication failed. Please ensure Claude Code CLI is properly authenticated.`}):P({message:r.message||`Claude Code CLI error`,code:r.code,exitCode:r.exitCode,stderr:r.stderr,promptExcerpt:t.substring(0,200),isRetryable:r.code===`ENOENT`||r.code===`ECONNREFUSED`}),n.enqueue({type:`error`,error:i}),n.close()}}}),rawCall:{rawPrompt:t,rawSettings:r},warnings:i.length>0?i:void 0,request:{body:t}}}};function z(e={}){let t=(t,n={})=>new ve({id:t,settings:{...e.defaultSettings,...n}}),n=function(e,n){if(new.target)throw Error(`The Claude Code model function cannot be called with the new keyword.`);return t(e,n)};return n.languageModel=t,n.chat=t,n.textEmbeddingModel=e=>{throw new T({modelId:e,modelType:`textEmbeddingModel`})},n}z();var ye=class extends D{constructor(){super(),this.name=`Claude Code`}getRequiredApiKeyName(){return`CLAUDE_CODE_API_KEY`}isRequiredApiKey(){return!1}validateAuth(e){}getClient(t){try{return z({defaultSettings:e(t?.commandName)})}catch(e){this.handleError(`client initialization`,e)}}};let B;async function be(){if(!B)try{B=(await import(`ai-sdk-provider-gemini-cli`)).createGeminiProvider}catch(e){throw Error(`Gemini CLI SDK is not installed. Please install 'ai-sdk-provider-gemini-cli' to use the gemini-cli provider.`)}}var xe=class extends D{constructor(){super(),this.name=`Gemini CLI`}validateAuth(e){}async getClient(e){try{await be();let t={};return t=e.apiKey&&e.apiKey!==`gemini-cli-no-key-required`?{authType:`api-key`,apiKey:e.apiKey}:{authType:`oauth-personal`},e.baseURL&&(t.baseURL=e.baseURL),B(t)}catch(e){this.handleError(`client initialization`,e)}}_extractSystemMessage(e,t={}){if(!e||!Array.isArray(e))return{systemPrompt:void 0,messages:e||[]};let n=e.filter(e=>e.role===`system`),r=e.filter(e=>e.role!==`system`),i=n.length>0?n.map(e=>e.content).join(` `):void 0;if(t.enforceJsonOutput){let e=this._getJsonEnforcementPrompt();i=i?`${i}\n\n${e}`:e}return{systemPrompt:i,messages:r}}_getJsonEnforcementPrompt(){return`CRITICAL: You MUST respond with ONLY valid JSON. Do not include any explanatory text, markdown formatting, code block markers, or conversational phrases like "Here is" or "Of course". Your entire response must be parseable JSON that starts with { or [ and ends with } or ]. No exceptions.`}_isValidJson(e){if(!e||typeof e!=`string`)return!1;try{return JSON.parse(e.trim()),!0}catch{return!1}}_detectJsonRequest(e){let t=e.filter(e=>e.role===`user`).map(e=>e.content).join(` `).toLowerCase();return[`json`,`respond only with`,`return only`,`output only`,`format:`,`structure:`,`schema:`,`{"`,`[{`,`subtasks`,`array`,`object`].some(e=>t.includes(e))}_simplifyJsonPrompts(e){let t=e.find(e=>e.role===`system`);if(!(t&&t.content.includes(`You are an AI assistant helping with task breakdown. Generate exactly`)))return e;let r=t.content.match(/Generate exactly (\d+) subtasks/),i=r?r[1]:`10`;return n(`debug`,`${this.name} detected expand-task operation, simplifying for ${i} subtasks`),e.map(e=>{if(e.role!==`user`)return e;let t=`Generate exactly ${i} subtasks in the following JSON format. CRITICAL INSTRUCTION: You must respond with ONLY valid JSON. No explanatory text, no "Here is", no "Of course", no markdown - just the JSON object. Required JSON structure: { "subtasks": [ { "id": 1, "title": "Specific actionable task title", "description": "Clear task description", "dependencies": [], "details": "Implementation details and guidance", "testStrategy": "Testing approach" } ] } Generate ${i} subtasks based on the original task context. Return ONLY the JSON object.`;return n(`debug`,`${this.name} simplified user prompt for better JSON compliance`),{...e,content:t}})}extractJson(e){if(!e||typeof e!=`string`)return e;let t=e.trim();if(t.length<2)return e;t=t.replace(/^.*?```(?:json)?\s*([\s\S]*?)\s*```.*$/i,`$1`).replace(/^\s*(?:const|let|var)\s+\w+\s*=\s*([\s\S]*?)(?:;|\s*)$/i,`$1`).replace(/^(?:Here's|The)\s+(?:the\s+)?JSON.*?[:]\s*/i,``).trim();let n=t.indexOf(`{`),r=t.indexOf(`[`);if(n===-1&&r===-1)return e;let i=r===-1?n:n===-1?r:Math.min(n,r);t=t.slice(i);let a=e=>{if(!e||e.length<2)return;let t=[];try{let n=ie(e,t,{allowTrailingComma:!0,allowEmptyContent:!1});if(t.length===0&&n!==void 0)return JSON.stringify(n,null,2)}catch{}},o=a(t);if(o!==void 0)return o;let s=t[0],c=s===`{`?`}`:`]`,l=0,u=!1,d=!1,f=-1;for(let e=0;e<t.length&&e<1e4;e++){let n=t[e];if(d){d=!1;continue}if(n===`\\`){d=!0;continue}if(n===`"`){u=!u;continue}if(!u){if(n===s)l++;else if(n===c&&(l--,l===0)){f=e+1;let n=t.slice(0,f),r=a(n);if(r!==void 0)return r}}}if(f>0){let e=Math.min(5,Math.floor(f/100));for(let n=0;n<e;n++){let e=Math.max(f-n*50,Math.floor(f*.8)),r=t.slice(0,e),i=a(r);if(i!==void 0)return i}}return e}async generateText(e){try{this.validateParams(e),this.validateMessages(e.messages),n(`debug`,`Generating ${this.name} text with model: ${e.modelId}`);let t=this._detectJsonRequest(e.messages);n(`debug`,`${this.name} JSON detection analysis:`,{enforceJsonOutput:t,messageCount:e.messages.length,messages:e.messages.map(e=>({role:e.role,contentPreview:e.content?e.content.substring(0,200)+`...`:`empty`}))}),t&&n(`debug`,`${this.name} detected JSON request - applying strict JSON enforcement system prompt`);let r=e.messages;t&&(r=this._simplifyJsonPrompts(e.messages));let{systemPrompt:i,messages:a}=this._extractSystemMessage(r,{enforceJsonOutput:t});n(`debug`,`${this.name} final system prompt:`,{systemPromptLength:i?i.length:0,systemPromptPreview:i?i.substring(0,300)+`...`:`none`,finalMessageCount:a.length});let o=await this.getClient(e),s=await d({model:o(e.modelId),system:i,messages:a,maxTokens:e.maxTokens,temperature:e.temperature}),c=s.text;if(t&&s.text&&!this._isValidJson(s.text)){n(`debug`,`${this.name} response appears conversational, attempting JSON extraction`),n(`debug`,`${this.name} raw response preview:`,{responseLength:s.text.length,responseStart:s.text.substring(0,1e3)});let e=this.extractJson(s.text);this._isValidJson(e)?(n(`debug`,`${this.name} successfully extracted JSON from conversational response`),c=e):(n(`debug`,`${this.name} JSON extraction failed, returning original response`),n(`debug`,`${this.name} extraction result preview:`,{extractedLength:e?e.length:0,extractedStart:e?e.substring(0,500):`null`}))}return n(`debug`,`${this.name} generateText completed successfully for model: ${e.modelId}`),{text:c,usage:{inputTokens:s.usage?.promptTokens,outputTokens:s.usage?.completionTokens,totalTokens:s.usage?.totalTokens}}}catch(e){this.handleError(`text generation`,e)}}async streamText(e){try{this.validateParams(e),this.validateMessages(e.messages),n(`debug`,`Streaming ${this.name} text with model: ${e.modelId}`);let t=this._detectJsonRequest(e.messages);n(`debug`,`${this.name} JSON detection analysis:`,{enforceJsonOutput:t,messageCount:e.messages.length,messages:e.messages.map(e=>({role:e.role,contentPreview:e.content?e.content.substring(0,200)+`...`:`empty`}))}),t&&n(`debug`,`${this.name} detected JSON request - applying strict JSON enforcement system prompt`);let{systemPrompt:r,messages:i}=this._extractSystemMessage(e.messages,{enforceJsonOutput:t}),a=await this.getClient(e),o=await p({model:a(e.modelId),system:r,messages:i,maxTokens:e.maxTokens,temperature:e.temperature});return n(`debug`,`${this.name} streamText initiated successfully for model: ${e.modelId}`),o}catch(e){this.handleError(`text streaming`,e)}}async generateObject(e){try{return await super.generateObject(e)}catch(t){if(t.message?.includes(`JSON`)||t.message?.includes(`parse`)){n(`debug`,`Gemini CLI generateObject failed with parsing error, attempting manual extraction`);try{if(this.validateParams(e),this.validateMessages(e.messages),!e.schema)throw Error(`Schema is required for object generation`);if(!e.objectName)throw Error(`Object name is required for object generation`);let{systemPrompt:t,messages:r}=this._extractSystemMessage(e.messages,{enforceJsonOutput:!0}),i=await this.getClient(e),a=await u({model:i(e.modelId),system:t,messages:r,schema:e.schema,mode:`json`,maxTokens:e.maxTokens,temperature:e.temperature});if(a.rawResponse?.text&&!a.object){let e=this.extractJson(a.rawResponse.text);try{a.object=JSON.parse(e)}catch(t){throw n(`error`,`Failed to parse extracted JSON: ${t.message}`),n(`debug`,`Extracted JSON: ${e.substring(0,500)}...`),Error(`Gemini CLI returned invalid JSON that could not be parsed: ${t.message}`)}}return{object:a.object,usage:{inputTokens:a.usage?.promptTokens,outputTokens:a.usage?.completionTokens,totalTokens:a.usage?.totalTokens}}}catch(e){throw n(`error`,`Gemini CLI manual JSON extraction failed: ${e.message}`),Error(`${this.name} failed to generate valid JSON object: ${t.message}`)}}throw t}}getRequiredApiKeyName(){return`GEMINI_API_KEY`}isRequiredApiKey(){return!1}};function Se(e){return e.map(e=>{let t=``;return typeof e.content==`string`?t=e.content:Array.isArray(e.content)?t=e.content.filter(e=>e.type===`text`).map(e=>e.text).join(` `):e.content&&typeof e.content==`object`&&(t=e.content.text||JSON.stringify(e.content)),{role:e.role,content:t.trim()}})}function Ce(e){try{let t=e.trim().split(` `).filter(e=>e.trim()),n=[];for(let e of t)try{let t=JSON.parse(e);n.push(t)}catch(e){continue}let r=n.filter(e=>e.role===`assistant`).pop();return r&&r.content?{text:r.content,usage:r.usage?{promptTokens:r.usage.prompt_tokens||0,completionTokens:r.usage.completion_tokens||0,totalTokens:r.usage.total_tokens||0}:void 0}:{text:e.trim(),usage:void 0}}catch(t){return{text:e.trim(),usage:void 0}}}function V(e){return Se(e).map(e=>{switch(e.role){case`system`:return`System: ${e.content}`;case`user`:return`User: ${e.content}`;case`assistant`:return`Assistant: ${e.content}`;default:return`${e.role}: ${e.content}`}}).join(` `)}function we(e){return typeof e!=`string`&&(e=String(e)),`'`+e.replace(/'/g,`'\\''`)+`'`}function Te(e){let t=e.trim();t=t.replace(/^```json\s*/gm,``),t=t.replace(/^```\s*/gm,``),t=t.replace(/```\s*$/gm,``),t=t.replace(/^const\s+\w+\s*=\s*/,``),t=t.replace(/^let\s+\w+\s*=\s*/,``),t=t.replace(/^var\s+\w+\s*=\s*/,``),t=t.replace(/;?\s*$/,``);let n=t.match(/{[\s\S]*}/),r=t.match(/\[[\s\S]*\]/);n?t=n[0]:r&&(t=r[0]);try{return JSON.parse(t),t}catch{try{let e=t.replace(/([{,]\s*)([a-zA-Z_$][a-zA-Z0-9_$]*)\s*:/g,`$1"$2":`).replace(/'/g,`"`);return JSON.parse(e),e}catch{return e}}}function H({message:e,code:t,exitCode:n,stderr:r,stdout:i,promptExcerpt:a,isRetryable:o=!1}){return new C({message:e,isRetryable:o,url:`grok-cli://command`,requestBodyValues:a?{prompt:a}:void 0,data:{code:t,exitCode:n,stderr:r,stdout:i,promptExcerpt:a}})}function U({message:e}){return new w({message:e||`Authentication failed. Please ensure Grok CLI is properly configured with API key.`})}function Ee({message:e,promptExcerpt:t,timeoutMs:n}){return new C({message:e,isRetryable:!0,url:`grok-cli://command`,requestBodyValues:t?{prompt:t}:void 0,data:{code:`TIMEOUT`,promptExcerpt:t,timeoutMs:n}})}function W({message:e}){return new C({message:e||`Grok CLI is not installed or not found in PATH. Please install with: npm install -g @vibe-kit/grok-cli`,isRetryable:!1,url:`grok-cli://installation`})}var De=class{specificationVersion=`v1`;defaultObjectGenerationMode=`json`;supportsImageUrls=!1;supportsStructuredOutputs=!1;modelId;settings;constructor(e){if(this.modelId=e.id,this.settings=e.settings??{},!this.modelId||typeof this.modelId!=`string`||this.modelId.trim()===``)throw new T({modelId:this.modelId,modelType:`languageModel`})}get provider(){return`grok-cli`}async checkGrokCliInstallation(){return new Promise(e=>{let t=a(`grok`,[`--version`],{stdio:`pipe`});t.on(`error`,()=>e(!1)),t.on(`exit`,t=>e(t===0))})}async getApiKey(){if(this.settings.apiKey)return this.settings.apiKey;if(process.env.GROK_CLI_API_KEY)return process.env.GROK_CLI_API_KEY;try{let e=r(o(),`.grok`,`user-settings.json`),t=await i.readFile(e,`utf8`);return JSON.parse(t).apiKey||null}catch(e){return null}}async executeGrokCli(e,t={}){let n=t.timeout||this.settings.timeout||12e4;return new Promise((t,r)=>{let i=a(`grok`,e,{stdio:`pipe`,cwd:this.settings.workingDirectory||process.cwd()}),o=``,s=``,c;n>0&&(c=setTimeout(()=>{i.kill(`SIGTERM`),r(Ee({message:`Grok CLI command timed out after ${n}ms`,timeoutMs:n,promptExcerpt:e.join(` `).substring(0,200)}))},n)),i.stdout.on(`data`,e=>{o+=e.toString()}),i.stderr.on(`data`,e=>{s+=e.toString()}),i.on(`error`,e=>{c&&clearTimeout(c),e.code===`ENOENT`?r(W({})):r(H({message:`Failed to execute Grok CLI: ${e.message}`,code:e.code,stderr:e.message,isRetryable:!1}))}),i.on(`exit`,e=>{c&&clearTimeout(c),t({stdout:o.trim(),stderr:s.trim(),exitCode:e||0})})})}generateUnsupportedWarnings(e){let t=[],n=[];if(e.topP!==void 0&&n.push(`topP`),e.topK!==void 0&&n.push(`topK`),e.presencePenalty!==void 0&&n.push(`presencePenalty`),e.frequencyPenalty!==void 0&&n.push(`frequencyPenalty`),e.stopSequences!==void 0&&e.stopSequences.length>0&&n.push(`stopSequences`),e.seed!==void 0&&n.push(`seed`),n.length>0)for(let e of n)t.push({type:`unsupported-setting`,setting:e,details:`Grok CLI does not support the ${e} parameter. It will be ignored.`});return t}async doGenerate(e){if(!await this.checkGrokCliInstallation())throw W({});let t=await this.getApiKey();if(!t)throw U({message:`Grok CLI API key not found. Set GROK_CLI_API_KEY environment variable or configure grok-cli.`});let n=V(e.prompt),r=this.generateUnsupportedWarnings(e),i=[`--prompt`,we(n)];this.modelId&&this.modelId!==`default`&&i.push(`--model`,this.modelId),t&&i.push(`--api-key`,t),this.settings.baseURL&&i.push(`--base-url`,this.settings.baseURL),this.settings.workingDirectory&&i.push(`--directory`,this.settings.workingDirectory);try{let t=await this.executeGrokCli(i,{timeout:this.settings.timeout});if(t.exitCode!==0)throw t.stderr.toLowerCase().includes(`unauthorized`)||t.stderr.toLowerCase().includes(`authentication`)?U({message:`Grok CLI authentication failed: ${t.stderr}`}):H({message:`Grok CLI failed with exit code ${t.exitCode}: ${t.stderr||`Unknown error`}`,exitCode:t.exitCode,stderr:t.stderr,stdout:t.stdout,promptExcerpt:n.substring(0,200),isRetryable:!1});let a=Ce(t.stdout),o=a.text||``;return e.mode?.type===`object-json`&&o&&(o=Te(o)),{text:o||void 0,usage:a.usage||{promptTokens:0,completionTokens:0},finishReason:`stop`,rawCall:{rawPrompt:n,rawSettings:i},warnings:r.length>0?r:void 0,response:{id:E(),timestamp:new Date,modelId:this.modelId},request:{body:n},providerMetadata:{"grok-cli":{exitCode:t.exitCode,stderr:t.stderr||void 0}}}}catch(e){throw e.name===`APICallError`||e.name===`LoadAPIKeyError`?e:H({message:`Grok CLI execution failed: ${e.message}`,code:e.code,promptExcerpt:n.substring(0,200),isRetryable:!1})}}async doStream(e){let t=this.generateUnsupportedWarnings(e);return{stream:new ReadableStream({start:async t=>{try{let n=await this.doGenerate(e);t.enqueue({type:`response-metadata`,id:n.response.id,timestamp:n.response.timestamp,modelId:n.response.modelId});let r=n.text||``;for(let e=0;e<r.length;e+=50){let n=r.slice(e,e+50);t.enqueue({type:`text-delta`,textDelta:n}),await new Promise(e=>setTimeout(e,20))}t.enqueue({type:`finish`,finishReason:n.finishReason,usage:n.usage,providerMetadata:n.providerMetadata}),t.close()}catch(e){t.enqueue({type:`error`,error:e}),t.close()}}}),rawCall:{rawPrompt:V(e.prompt),rawSettings:{}},warnings:t.length>0?t:void 0,request:{body:V(e.prompt)}}}};function G(e={}){let t=(t,n={})=>new De({id:t,settings:{...e.defaultSettings,...n}}),n=function(e,n){if(new.target)throw Error(`The Grok CLI model function cannot be called with the new keyword.`);return t(e,n)};return n.languageModel=t,n.chat=t,n.textEmbeddingModel=e=>{throw new T({modelId:e,modelType:`textEmbeddingModel`})},n}G();var K=class extends D{constructor(){super(),this.name=`Grok CLI`}getRequiredApiKeyName(){return`GROK_CLI_API_KEY`}isRequiredApiKey(){return!1}validateAuth(e){}getClient(e){try{let{apiKey:n,baseURL:r,workingDirectory:i,timeout:a,commandName:o}=e,s=t(o);return G({defaultSettings:{apiKey:n,baseURL:r,workingDirectory:i||s.workingDirectory,timeout:a||s.timeout,defaultModel:s.defaultModel}})}catch(e){this.handleError(`client initialization`,e)}}},Oe=class{constructor(e={}){this.settings={pathToWarpExecutable:e.pathToWarpExecutable||`warp-preview`,customSystemPrompt:e.customSystemPrompt,cwd:e.cwd||process.cwd(),profile:e.profile,mcpServers:e.mcpServers||[],outputFormat:e.outputFormat||`text`,debug:e.debug||!1,...e}}get provider(){return`warp`}get modelId(){return this.settings.profile||`default`}get defaultObjectGenerationMode(){return`json`}get specificationVersion(){return`v1`}async doGenerate(e){let{prompt:t,mode:n}=e,r=[`agent`,`run`],i=this._formatPrompt(t);r.push(`--prompt`,i);let a=n?.type===`object-json`?`json`:`text`;r.push(`--output-format`,a),this.settings.cwd&&r.push(`-C`,this.settings.cwd),this.settings.profile&&r.push(`--profile`,this.settings.profile);for(let e of this.settings.mcpServers)r.push(`--mcp-server`,e);this.settings.debug&&r.push(`--debug`);let o=Date.now();try{let e=await this._executeCommand(r);Date.now()-o;let{text:t,debugId:s}=this._parseResponse(e,a),c=t;if(n?.type===`object-json`&&(c=this._extractJson(t),this.settings.debug))try{JSON.parse(c)}catch(e){console.error(`[Warp JSON Extraction Failed]`),console.error(`Raw response:`,t.substring(0,500)),console.error(`Extracted:`,c.substring(0,500)),console.error(`Parse error:`,e.message)}return{text:c,usage:{promptTokens:this._estimateTokens(i),completionTokens:this._estimateTokens(c)},finishReason:`stop`,rawCall:{rawPrompt:i,rawSettings:this.settings},warnings:[],request:{body:JSON.stringify({prompt:i,...this.settings})},response:{id:s,timestamp:new Date,modelId:this.modelId},logprobs:void 0}}catch(e){throw this._handleError(e)}}async doStream(e){let t=await this.doGenerate(e);return{stream:(async function*(){yield{type:`text-delta`,textDelta:t.text},yield{type:`finish`,finishReason:t.finishReason,usage:t.usage,logprobs:t.logprobs}})(),rawCall:t.rawCall,rawResponse:t.response,warnings:t.warnings,request:t.request}}_formatPrompt(e){let t=Array.isArray(e)?e:e.messages||[],n=this.settings.customSystemPrompt||``,r=t.filter(e=>e.role===`system`).map(e=>e.content).join(` `);r&&(n=n?`${n}\n\n${r}`:r);let i=t.filter(e=>e.role!==`system`).map(e=>`${e.role===`user`?`User`:`Assistant`}: ${e.content}`).join(` `);return n?`${n}\n\n---\n\n${i}`:i}_executeCommand(e){return new Promise((t,n)=>{let r=oe(this.settings.pathToWarpExecutable,e,{cwd:this.settings.cwd,stdio:[`ignore`,`pipe`,`pipe`]}),i=``,a=``;r.stdout.on(`data`,e=>{i+=e.toString()}),r.stderr.on(`data`,e=>{a+=e.toString()}),r.on(`error`,e=>{n(Error(`Failed to execute Warp CLI: ${e.message}`))}),r.on(`close`,e=>{e===0?t(i):n(Error(`Warp CLI exited with code ${e}: ${a}`))});let o=this.settings.timeout||3e5,s=setTimeout(()=>{r.kill(),n(Error(`Warp CLI command timed out after ${o/1e3} seconds`))},o);r.on(`close`,()=>{clearTimeout(s)})})}_parseResponse(e,t){let n=e.split(` `).filter(e=>e.trim()),r,i=``;if(t===`json`){for(let e of n)try{let t=JSON.parse(e);if(t.type===`system`&&t.conversation_id&&(r=t.conversation_id),t.type===`agent`&&t.text){i=t.text;break}}catch(t){let n=e.match(/debug ID: ([a-f0-9-]+)/);n&&(r=n[1])}i||(i=n.filter(e=>{try{return JSON.parse(e),!1}catch{return!e.startsWith(`debug ID:`)}}).join(` `))}else{let t=e.match(/debug ID: ([a-f0-9-]+)/);t?(r=t[1],i=e.replace(/debug ID: [a-f0-9-]+\n/,``).trim()):i=e.trim()}return{text:i,debugId:r}}_extractJson(e){let t=e.match(/```(?:json)?\s*([\s\S]*?)\s*```/);if(t){let e=t[1].trim();try{return JSON.parse(e),e}catch(e){}}let n=e.match(/\{[\s\S]*\}/);if(n){let e=n[0];try{return JSON.parse(e),e}catch(e){}}try{return JSON.parse(e),e}catch(e){}return e}_estimateTokens(e){return Math.ceil(e.length/4)}_handleError(e){return e.message.includes(`ENOENT`)||e.message.includes(`not found`)?Error(`Warp CLI not found. Please install it via Homebrew: brew tap warpdotdev/warp && brew install --cask warp-cli`):e.message.includes(`authentication`)||e.message.includes(`unauthorized`)?Error(`Warp authentication failed. Please ensure you have a valid Warp subscription and are logged in via: warp-preview login`):e}};function ke(e={}){return new Oe(e)}const q={vjeK7FeKGX9tL48KvFrn4C:`Default`,eOGia6hxKDujsDTKOn3qwh:`GPT-5 + Sonnet 4.5`,"4SM7QEB6PSpcMwUHEcl6V3":`Sonnet 4.5`,xzKhoE2wvMQN8OEA8ElhKK:`YOLO Code`},J=Object.entries(q).reduce((e,[t,n])=>(e[n]=t,e[n.toLowerCase()]=t,e[n.toLowerCase().replace(/\s+/g,``)]=t,e[n.toLowerCase().replace(/\s+/g,`-`)]=t,e),{});let Y=null,X=null;function Z(){try{if(Y&&X&&Date.now()-X<3e5)return Y;let e=ae(`warp-preview agent profile list`,{encoding:`utf-8`,stdio:[`ignore`,`pipe`,`ignore`]}),t={},n=e.split(` `);for(let e of n){if(e.includes(`+===`)||e.includes(`+---`)||!e.includes(`|`)||e.includes(`| ID`)&&e.includes(`| Name`))continue;let n=e.split(`|`).map(e=>e.trim());if(n.length>=3&&n[1]&&n[2]){let e=n[1],r=n[2];e&&r&&e.length===22&&(t[e]=r)}}return Object.keys(t).length>0?(Y=t,X=Date.now(),t):null}catch(e){return null}}function Q(){return Z()||q}function $(e){if(!e)return null;if(e.length===22&&/^[a-zA-Z0-9]+$/.test(e))return e;let t=[e,e.toLowerCase(),e.toLowerCase().replace(/\s+/g,``),e.toLowerCase().replace(/\s+/g,`-`),e.toLowerCase().replace(/[^a-z0-9]/g,``),e.toLowerCase().replace(/[^a-z0-9]/g,`-`)];for(let e of t)if(J[e])return J[e];let n=Z();if(n){for(let[e,r]of Object.entries(n))for(let n of t)if([r,r.toLowerCase(),r.toLowerCase().replace(/\s+/g,``),r.toLowerCase().replace(/\s+/g,`-`),r.toLowerCase().replace(/[^a-z0-9]/g,``),r.toLowerCase().replace(/[^a-z0-9]/g,`-`)].includes(n))return e}return null}function Ae(){let e=Q();return Object.entries(e).map(([e,t])=>({id:e,name:t}))}function je(){Y=null,X=null}var Me=class extends D{constructor(){super(),this.name=`Warp`}getRequiredApiKeyName(){return`WARP_API_KEY`}isRequiredApiKey(){return!1}validateAuth(e){}getClient(e){try{let t=e.modelId?.includes(`:`)?e.modelId.split(`:`)[1]:e.modelId,n=$(t);n||(n=t),(n===`default`||!n)&&(n=`vjeK7FeKGX9tL48KvFrn4C`);let r=ke({profile:n,cwd:e.cwd,mcpServers:e.mcpServers||[],debug:e.debug||!1,timeout:e.timeout||3e5});return()=>r}catch(e){this.handleError(`client initialization`,e)}}};export{se as AnthropicAIProvider,ge as AzureProvider,D as BaseAIProvider,he as BedrockAIProvider,ye as ClaudeCodeProvider,xe as GeminiCliProvider,le as GoogleAIProvider,K as GrokCliProvider,fe as GroqProvider,me as OllamaAIProvider,ue as OpenAIProvider,pe as OpenRouterAIProvider,ce as PerplexityAIProvider,j as VertexAIProvider,Me as WarpProvider,de as XAIProvider,je as clearProfileCache,Q as getProfileMap,Ae as listProfiles,$ as profileNameToId};