@hyperspaceai/eva-cli
Version:
A multi-provider conversational AI CLI tool with intelligent text editor capabilities and tool usage.
65 lines (48 loc) • 342 kB
JavaScript
#!/usr/bin/env node
"use strict";var wu=Object.create;var cn=Object.defineProperty;var bu=Object.getOwnPropertyDescriptor;var xu=Object.getOwnPropertyNames;var Su=Object.getPrototypeOf,Cu=Object.prototype.hasOwnProperty;var M=(s,t)=>()=>(s&&(t=s(s=0)),t);var ct=(s,t)=>{for(var e in t)cn(s,e,{get:t[e],enumerable:!0})},zi=(s,t,e,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of xu(t))!Cu.call(s,r)&&r!==e&&cn(s,r,{get:()=>t[r],enumerable:!(o=bu(t,r))||o.enumerable});return s};var I=(s,t,e)=>(e=s!=null?wu(Su(s)):{},zi(t||!s||!s.__esModule?cn(e,"default",{value:s,enumerable:!0}):e,s)),Tu=s=>zi(cn({},"__esModule",{value:!0}),s);var f=M(()=>{"use strict"});var ws={};ct(ws,{ensureConfigDirectory:()=>vs,getProviderConfigPath:()=>ku,loadProviderConfig:()=>ot,saveProviderConfig:()=>ln});function vs(){zt.existsSync(hs)||zt.mkdirSync(hs,{recursive:!0})}function ot(){vs();let s=ji.filter(o=>["openai","anthropic","google"].includes(o.provider));if(zt.existsSync(xr))try{let o=zt.readFileSync(xr,"utf8"),r=JSON.parse(o),n=new Map(r.map(i=>[i.provider,i]));s=ji.map(i=>{let a=n.get(i.provider);return a?{...i,...a}:i})}catch(o){process.stderr.write("Failed to load provider config, using defaults:"+o+`
`)}s=s.filter(o=>["openai","anthropic","google"].includes(o.provider)),s=s.map(o=>{let r={...o};switch(o.provider){case"openai":process.env.OPENAI_API_KEY&&(r.apiKey=process.env.OPENAI_API_KEY,r.enabled=!0),process.env.OPENAI_ORG_ID&&(r.organizationId=process.env.OPENAI_ORG_ID);break;case"anthropic":process.env.ANTHROPIC_API_KEY&&(r.apiKey=process.env.ANTHROPIC_API_KEY,r.enabled=!0);break;case"google":process.env.GOOGLE_API_KEY&&(r.apiKey=process.env.GOOGLE_API_KEY,r.enabled=!0);break}return r});let t={openai:new Set(["o4-mini","gpt-4.1","gpt-5","gpt-5-mini","gpt-5-nano"]),anthropic:void 0,google:new Set(["gemini-2.5-pro","gemini-2.5-flash"])},e=0;return s=s.map(o=>{let r=t[o.provider];if(r){let n=o.models.length;o.models=o.models.filter(i=>r.has(i.id)),e+=n-o.models.length}return o}),(!zt.existsSync(xr)||e>0)&&ln(s),s}function ln(s){vs();try{let t=JSON.stringify(s,null,2);zt.writeFileSync(xr,t,"utf8")}catch(t){process.stderr.write("Failed to save provider config:"+t+`
`)}}function ku(){return xr}var zt,ys,qi,hs,xr,ji,Ao=M(()=>{"use strict";f();zt=I(require("fs-extra")),ys=I(require("path")),qi=I(require("os")),hs=ys.join(qi.homedir(),".eva-prompt"),xr=ys.join(hs,"provider-config.json"),ji=[{provider:"openai",enabled:!1,models:[{id:"o4-mini",name:"o4-Mini",provider:"openai",description:"Small size, big performance - successor to o3-mini with enhanced capabilities",maxTokens:65536,supportsFunctions:!0,supportsStreaming:!0,contextWindow:2e5,inputPricing:.003,outputPricing:.012},{id:"gpt-4.1",name:"GPT-4.1",provider:"openai",description:"Latest iteration of GPT-4 with enhanced capabilities and 1M context window",maxTokens:32768,supportsFunctions:!0,supportsStreaming:!0,contextWindow:1e6,inputPricing:.003,outputPricing:.012},{id:"gpt-5",name:"GPT-5",provider:"openai",description:"Most advanced OpenAI model with superior reasoning and multimodal capabilities",maxTokens:65536,supportsFunctions:!0,supportsStreaming:!0,contextWindow:2e6,inputPricing:.00125,outputPricing:.01},{id:"gpt-5-mini",name:"GPT-5 Mini",provider:"openai",description:"Efficient GPT-5 variant optimized for speed and cost-effectiveness",maxTokens:32768,supportsFunctions:!0,supportsStreaming:!0,contextWindow:1e6,inputPricing:25e-5,outputPricing:.002},{id:"gpt-5-nano",name:"GPT-5 Nano",provider:"openai",description:"Ultra-lightweight GPT-5 model for fast responses and edge deployment",maxTokens:16384,supportsFunctions:!0,supportsStreaming:!0,contextWindow:128e3,inputPricing:5e-5,outputPricing:4e-4}]},{provider:"anthropic",enabled:!0,models:[{id:"claude-sonnet-4-20250514",name:"Claude Sonnet 4",provider:"anthropic",description:"High-performance model with exceptional reasoning and efficiency",maxTokens:64e3,supportsFunctions:!0,supportsStreaming:!0,contextWindow:2e5,inputPricing:.003,outputPricing:.015},{id:"claude-opus-4-20250514",name:"Claude Opus 4",provider:"anthropic",description:"Our most capable and intelligent model yet with superior reasoning capabilities",maxTokens:32e3,supportsFunctions:!0,supportsStreaming:!0,contextWindow:2e5,inputPricing:.015,outputPricing:.075},{id:"claude-3-7-sonnet-20250219",name:"Claude 3.7 Sonnet",provider:"anthropic",description:"High-performance model with early extended thinking capabilities",maxTokens:64e3,supportsFunctions:!0,supportsStreaming:!0,contextWindow:2e5,inputPricing:.003,outputPricing:.015}]},{provider:"google",enabled:!1,models:[{id:"gemini-2.5-pro",name:"Gemini 2.5 Pro",provider:"google",description:'"The best LLM ever" - state-of-the-art performance on most benchmarks, superior reasoning and multimodal capabilities',maxTokens:8192,supportsFunctions:!0,supportsStreaming:!0,contextWindow:1e6,inputPricing:.00125,outputPricing:.005},{id:"gemini-2.5-flash",name:"Gemini 2.5 Flash",provider:"google",description:"Ultra-fast streaming responses with controllable reasoning budget and MoE architecture",maxTokens:8192,supportsFunctions:!0,supportsStreaming:!0,contextWindow:1e6,inputPricing:75e-6,outputPricing:3e-4}]}]});function Pe(){return oo.getUserWorkingDirectory()}function Le(...s){return oo.getEvaPath(...s)}var wt,bs,oo,Ue=M(()=>{"use strict";f();wt=I(require("path")),bs=class s{constructor(){this.userWorkingDirectory=process.cwd(),this.evaConfigDirectory=wt.join(require("os").homedir(),".eva-prompt")}static getInstance(){return s.instance||(s.instance=new s),s.instance}setUserWorkingDirectory(t){this.userWorkingDirectory=wt.resolve(t)}getUserWorkingDirectory(){return this.userWorkingDirectory}getEvaConfigDirectory(){return this.evaConfigDirectory}getUserPath(...t){return wt.join(this.userWorkingDirectory,...t)}getEvaPath(...t){return wt.join(this.evaConfigDirectory,...t)}isWithinUserDirectory(t){let e=wt.resolve(t),o=wt.resolve(this.userWorkingDirectory);return e.startsWith(o)}getRelativeToUser(t){return wt.relative(this.userWorkingDirectory,t)}getDirectoryInfo(){return{userWorkingDirectory:this.userWorkingDirectory,evaConfigDirectory:this.evaConfigDirectory,relativePath:wt.basename(this.userWorkingDirectory)}}},oo=bs.getInstance()});var Cs={};ct(Cs,{getSetting:()=>X,loadSettings:()=>xs,saveSettings:()=>Ss,setSetting:()=>Tt,updateSetting:()=>Lo});function Gi(){return Le(Pu)}function Ki(){let s=Le();Zo.default.existsSync(s)||Zo.default.mkdirSync(s,{recursive:!0})}function xs(){try{Ki();let s=Gi();if(!Zo.default.existsSync(s))return Ss(Wi),Wi;let t=Zo.default.readFileSync(s,"utf-8");return JSON.parse(t)}catch(s){return console.warn("Failed to load settings:",s),{}}}function Ss(s){try{Ki();let t=Gi();Zo.default.writeFileSync(t,JSON.stringify(s,null,2))}catch(t){console.error("Failed to save settings:",t)}}function Lo(s,t){let e=xs();e[s]=t,Ss(e)}function X(s){return xs()[s]}var Zo,Pu,Wi,Tt,ze=M(()=>{"use strict";f();Zo=I(require("fs"));Ue();Pu="user-settings.json";Wi={selectedModel:"claude-sonnet-4-20250514",useAISDKv5:!0,feedbackCollection:{enabled:!0,skipForSession:!1,autoSkipParallel:!1,collectOnFailure:!0},ui:{showToolFailuresPanel:!0}};Tt=Lo});function Ts(){return X("proxyBaseUrl")||Eu}function un(){return X("useProxy")===!0}function Io(){return X("nectarSession")}function dn(s){return Hi.some(t=>t.provider===s)}function mn(s,t){let e={};return s&&(e["x-aios-nectar"]=s),t&&(e["x-aios-nonce"]=t),e}function Sr(s){return un()&&dn(s)&&!!Io()}function Mu(s){return Hi.find(t=>t.provider===s)}function pn(s,t){if(!Sr(s)||!Mu(s))return t;let o=Ts();switch(s){case"anthropic":return`${o}/anthropic/v1`;case"openai":return`${o}/openai/v1`;case"google":return`${o}/generativelanguage/v1beta`;default:return t}}var Eu,Hi,gn=M(()=>{"use strict";f();ze();Eu="https://provider-proxy.hyper.space",Hi=[{pathSegment:"anthropic",target:"https://api.anthropic.com",provider:"anthropic"},{pathSegment:"openai",target:"https://api.openai.com",provider:"openai"},{pathSegment:"generativelanguage",target:"https://generativelanguage.googleapis.com",provider:"google"}]});var ro,ks=M(()=>{"use strict";f();ro=class{static formatMessages(t,e){switch(e){case"anthropic":return this.formatAnthropicMessages(t);case"openai":return this.formatOpenAIMessages(t);case"google":return this.formatGoogleMessages(t);default:return t}}static formatAnthropicMessages(t){let e=[];for(let o of t)if(o.role!=="system")if(o.role==="user")e.push({role:"user",content:o.content});else if(o.role==="assistant")if(o.tool_calls&&o.tool_calls.length>0){let r=[];o.content&&r.push({type:"text",text:o.content});for(let n of o.tool_calls)r.push({type:"tool_use",id:n.id,name:n.function.name,input:n.function.arguments&&n.function.arguments.trim()?JSON.parse(n.function.arguments):{}});e.push({role:"assistant",content:r})}else e.push({role:"assistant",content:o.content});else o.role==="tool"&&e.push({role:"user",content:[{type:"tool_result",tool_use_id:o.tool_call_id,content:o.content}]});return e}static formatOpenAIMessages(t){return t.map(e=>({role:e.role,content:e.content||null,tool_calls:e.tool_calls,tool_call_id:e.tool_call_id,name:e.name}))}static formatGoogleMessages(t){let e=[],o=[];for(let r of t)if(r.role==="system")o.push(r.content||"");else if(r.role==="user"){let n=r.content||"";o.length>0&&(n=`${o.join(`
`)}
${n}`,o=[]),e.push({role:"user",parts:[{text:n}]})}else if(r.role==="assistant")if(r.tool_calls&&r.tool_calls.length>0){let n=[];r.content&&n.push({text:r.content});for(let i of r.tool_calls)try{let a=i.function.arguments&&i.function.arguments.trim()?JSON.parse(i.function.arguments):{};n.push({functionCall:{name:i.function.name,args:a}})}catch(a){console.warn("Failed to parse tool call arguments:",i.function.arguments,a),n.push({functionCall:{name:i.function.name,args:{}}})}e.push({role:"model",parts:n})}else e.push({role:"model",parts:[{text:r.content||""}]});else r.role==="tool"&&e.push({role:"function",parts:[{functionResponse:{name:r.name||"unknown",response:{content:r.content||""}}}]});return o.length>0&&e.unshift({role:"user",parts:[{text:o.join(`
`)}]}),e}static createToolResultMessage(t,e,o,r){switch(o){case"anthropic":case"openai":return{role:"tool",content:e,tool_call_id:t};case"google":return{role:"tool",content:e,tool_call_id:t,name:r};default:return{role:"tool",content:e,tool_call_id:t}}}}});var Ms={};ct(Ms,{filterAllowedTools:()=>Es,normalizeToolChoice:()=>Ps});function Ps(s,t){if(t!=null){if(typeof t=="string"){let e=t.trim();return/^(function)+$/i.test(e)?"auto":e}if(typeof t=="object"){let e={...t};return typeof e.type=="string"&&/^(function)+$/i.test(e.type)&&(e.type="function"),e}}}function Es(s,t){if(!s||!Array.isArray(s)||!t||!Array.isArray(t))return s;let e=new Set(t.filter(o=>typeof o=="string"));return e.size===0?s:s.filter(o=>o.function?.name&&e.has(o.function.name))}var fn=M(()=>{"use strict";f()});var Vi,er,As=M(()=>{"use strict";f();Vi=I(require("@anthropic-ai/sdk"));Ao();gn();ks();er=class{constructor(){this.client=null}getClient(){if(!this.client){let e=ot().find(a=>a.provider==="anthropic");if(!e?.apiKey)throw new Error("Anthropic API key not configured");let o=Sr("anthropic"),r=o?pn("anthropic",e.baseURL):e.baseURL,n=Io(),i={apiKey:o?"unused":e.apiKey,baseURL:r,timeout:6e4};o&&n&&(i.defaultHeaders||(i.defaultHeaders={}),Object.assign(i.defaultHeaders,mn(n))),this.client=new Vi.default(i)}return this.client}async chat(t){let e=this.getClient(),o=ro.formatMessages(t.messages,"anthropic"),r=t.messages.find(c=>c.role==="system")?.content||"",n=t.tools?.map(c=>({name:c.function.name,description:c.function.description,input_schema:c.function.parameters})),i={model:t.model,messages:o,system:r,max_tokens:t.max_tokens||4e3,temperature:t.temperature||.7,tools:n};if(n&&n.length>0&&t.tool_choice!==void 0){let{normalizeToolChoice:c}=await Promise.resolve().then(()=>(fn(),Ms)),l=c("anthropic",t.tool_choice);l==="auto"||l==="any"?i.tool_choice={type:l}:l==="none"?delete i.tools:l&&typeof l=="object"&&(i.tool_choice=l)}let a=await e.messages.create(i);return{choices:[{message:{role:"assistant",content:this.extractTextContent(a.content),tool_calls:this.extractToolCalls(a.content)},finish_reason:a.stop_reason||"stop"}],usage:a.usage?{prompt_tokens:a.usage.input_tokens,completion_tokens:a.usage.output_tokens,total_tokens:a.usage.input_tokens+a.usage.output_tokens}:void 0}}async*chatStream(t){let e=this.getClient(),o=ro.formatMessages(t.messages,"anthropic"),r=t.messages.find(u=>u.role==="system")?.content||"",n=t.tools?.map(u=>({name:u.function.name,description:u.function.description,input_schema:u.function.parameters})),i={model:t.model,messages:o,system:r,max_tokens:t.max_tokens||4e3,temperature:t.temperature||.7,tools:n,stream:!0};if(n&&n.length>0&&t.tool_choice!==void 0){let{normalizeToolChoice:u}=await Promise.resolve().then(()=>(fn(),Ms)),d=u("anthropic",t.tool_choice);d==="auto"||d==="any"?i.tool_choice={type:d}:d==="none"?delete i.tools:d&&typeof d=="object"&&(i.tool_choice=d)}let a=await e.messages.create(i),c=[],l=null;for await(let u of a)u.type==="content_block_start"?u.content_block.type==="tool_use"&&(l={id:u.content_block.id,type:"function",function:{name:u.content_block.name,arguments:""}}):u.type==="content_block_delta"?u.delta.type==="text_delta"?yield{choices:[{delta:{content:u.delta.text}}]}:u.delta.type==="input_json_delta"&&l&&(l.function.arguments+=u.delta.partial_json):u.type==="content_block_stop"&&l&&(c.push(l),yield{choices:[{delta:{tool_calls:[l]}}]},l=null)}formatMessages(t){return ro.formatMessages(t,"anthropic")}extractTextContent(t){return Array.isArray(t)?t.filter(e=>e.type==="text").map(e=>e.text).join(""):""}extractToolCalls(t){if(!Array.isArray(t))return;let e=t.filter(o=>o.type==="tool_use").map(o=>({id:o.id,type:"function",function:{name:o.name,arguments:JSON.stringify(o.input)}}));return e.length>0?e:void 0}async getModels(){return ot().find(o=>o.provider==="anthropic")?.models||[]}async testConnection(){try{return!!(await this.getClient().messages.create({model:"claude-3-5-haiku-20241022",messages:[{role:"user",content:"test"}],max_tokens:5})).content?.[0]}catch{return!1}}}});var Ji,hn,Yi=M(()=>{"use strict";f();Ji=I(require("openai"));Ao();hn=class{constructor(){this.client=null;this.embeddingCache=new Map}getClient(){if(!this.client){let e=ot().find(o=>o.provider==="openai");if(!e?.apiKey)throw new Error("OpenAI API key not configured for embeddings");this.client=new Ji.default({apiKey:e.apiKey,baseURL:e.baseURL,timeout:3e4})}return this.client}async generateEmbedding(t){let e=this.embeddingCache.get(t);if(e)return e;try{let n=(await this.getClient().embeddings.create({model:"text-embedding-3-small",input:t,encoding_format:"float"})).data[0].embedding;if(this.embeddingCache.set(t,n),this.embeddingCache.size>1e3){let i=this.embeddingCache.keys().next();!i.done&&typeof i.value=="string"&&this.embeddingCache.delete(i.value)}return n}catch(o){return console.warn("Failed to generate embeddings, falling back to text similarity:",o),[]}}cosineSimilarity(t,e){if(t.length!==e.length)return 0;let o=0,r=0,n=0;for(let i=0;i<t.length;i++)o+=t[i]*e[i],r+=t[i]*t[i],n+=e[i]*e[i];return r=Math.sqrt(r),n=Math.sqrt(n),r===0||n===0?0:o/(r*n)}async isAvailable(){try{return!!ot().find(o=>o.provider==="openai")?.apiKey}catch{return!1}}}});var Qi={};ct(Qi,{MemoryStore:()=>Cr});var tr,Is,$s,Cr,Rs=M(()=>{"use strict";f();tr=I(require("fs")),Is=I(require("path")),$s=I(require("crypto"));Yi();Ue();Cr=class{constructor(t){this.memories=new Map;this.useEmbeddings=!1;this.memoryPath=Is.default.join(t||Pe(),".eva-prompt","healing-memory","memory-store.json"),this.embeddingService=new hn,this.loadMemories(),this.initializeEmbeddings()}async initializeEmbeddings(){this.useEmbeddings=await this.embeddingService.isAvailable(),this.useEmbeddings&&process.env.EVA_QUIET!=="1"&&console.log("\u{1F9E0} Using OpenAI embeddings for memory similarity matching")}loadMemories(){try{if(tr.default.existsSync(this.memoryPath)){let t=tr.default.readFileSync(this.memoryPath,"utf-8");JSON.parse(t).forEach(o=>{o.appliedAt=new Date(o.appliedAt),this.memories.set(o.id,o)})}}catch(t){console.warn("Failed to load healing memories:",t)}}saveMemories(){try{let t=Is.default.dirname(this.memoryPath);tr.default.existsSync(t)||tr.default.mkdirSync(t,{recursive:!0});let e=Array.from(this.memories.values());tr.default.writeFileSync(this.memoryPath,JSON.stringify(e,null,2))}catch(t){console.error("Failed to save healing memories:",t)}}async calculateSimilarity(t,e,o,r){if(this.useEmbeddings&&o&&r&&o.length>0&&r.length>0)return this.embeddingService.cosineSimilarity(o,r);let n=t.toLowerCase().split(/\s+/),i=e.toLowerCase().split(/\s+/),a=new Set(n),c=new Set(i),l=new Set([...a].filter(d=>c.has(d))),u=new Set([...a,...c]);return l.size/u.size}generateHash(t){return $s.default.createHash("sha256").update(t).digest("hex").substring(0,16)}async add(t,e,o,r){let n=`${t.provider}:${t.error instanceof Error?t.error.message:String(t.error)}`,i=this.generateHash(n),a=[];this.useEmbeddings&&(a=await this.embeddingService.generateEmbedding(n));let c=await this.search(n,t.provider,.7);if(c.length>0){let l=c[0].memory;return r?(l.successCount++,l.metadata.confidence=l.successCount/(l.successCount+l.failureCount),o!==l.fix&&(l.fix=o,l.metadata.fixHash=this.generateHash(o)),a.length>0&&(l.metadata.embedding=a)):(l.failureCount++,l.metadata.confidence=l.successCount/(l.successCount+l.failureCount)),l.appliedAt=new Date,this.memories.set(l.id,l),this.saveMemories(),l}else{let l={id:$s.default.randomUUID(),provider:t.provider,errorPattern:n,diagnosis:e,fix:o,appliedAt:new Date,successCount:r?1:0,failureCount:r?0:1,metadata:{errorHash:i,fixHash:this.generateHash(o),confidence:r?1:0,embedding:a.length>0?a:void 0}};return this.memories.set(l.id,l),this.saveMemories(),l}}async search(t,e,o=.5){let r=[],n=[];this.useEmbeddings&&(n=await this.embeddingService.generateEmbedding(t));for(let i of this.memories.values()){if(e&&i.provider!==e)continue;let a=await this.calculateSimilarity(t,i.errorPattern,n,i.metadata.embedding);a>=o&&r.push({memory:i,similarity:a})}return r.sort((i,a)=>{let c=i.similarity*i.memory.metadata.confidence;return a.similarity*a.memory.metadata.confidence-c}),r.slice(0,10)}async getAll(t){return t?Array.from(this.memories.values()).filter(e=>e.provider===t):Array.from(this.memories.values())}async delete(t){let e=this.memories.delete(t);return e&&this.saveMemories(),e}async deleteAll(){this.memories.clear(),this.saveMemories()}getStats(){let t={totalMemories:this.memories.size,byProvider:{},averageConfidence:0},e=0;for(let o of this.memories.values())t.byProvider[o.provider]=(t.byProvider[o.provider]||0)+1,e+=o.metadata.confidence;return t.averageConfidence=this.memories.size>0?e/this.memories.size:0,t}}});var lt,yn,Xi,Zi,Au,vn,ea=M(()=>{"use strict";f();As();Rs();lt=I(require("fs")),yn=I(require("path")),Xi=require("child_process"),Zi=require("util");Ue();Au=(0,Zi.promisify)(Xi.exec),vn=class{constructor(t){this.recentErrors=new Map;this.config={enabled:!0,maxAttempts:50,stableProvider:"anthropic",stableModel:"claude-3-sonnet-20240229",backoffMultiplier:1.5,initialDelayMs:1e3,...t},this.stableProvider=new er,this.memoryStore=new Cr}async healAPIError(t){if(!this.config.enabled)return{success:!1,totalAttempts:0,healingHistory:[],finalError:"Self-healing is disabled"};let e=`${t.provider}-${t.error instanceof Error?t.error.message:String(t.error)}`,o=this.recentErrors.get(e),r=Date.now();if(o&&r-o<3e4)return console.log("\u26A0\uFE0F Skipping self-healing: Same error seen recently (possible loop)"),{success:!1,totalAttempts:0,healingHistory:[],finalError:"Error loop detected - skipping healing"};this.recentErrors.set(e,r);for(let[l,u]of this.recentErrors.entries())r-u>6e4&&this.recentErrors.delete(l);let n=[];console.log("\u{1F9E0} Checking memory for existing fixes...");let i=await this.memoryStore.search(t.error instanceof Error?t.error.message:String(t.error),t.provider,.6);if(i.length>0&&i[0].memory.metadata.confidence>.7){console.log(`\u{1F4A1} Found high-confidence fix in memory (confidence: ${(i[0].memory.metadata.confidence*100).toFixed(0)}%)`);let l=i[0].memory,u=await this.applyFix(t.provider,l.fix),d=await this.testFix(t);await this.memoryStore.add(t,l.diagnosis,l.fix,d);let m={attemptNumber:1,error:t,diagnosis:l.diagnosis,proposedFix:l.fix,webSearchResults:["Applied from memory"],success:d,appliedChanges:u};if(n.push(m),d)return console.log("\u2705 Memory-based fix successful!"),{success:!0,totalAttempts:1,healingHistory:n};console.log("\u274C Memory-based fix failed, proceeding with discovery...")}let a=this.config.initialDelayMs,c=i.length>0;for(let l=1;l<=this.config.maxAttempts;l++)try{c&&console.log(`\u{1F527} Self-healing attempt ${l}/${this.config.maxAttempts} for ${t.provider}...`);let u=await this.diagnoseError(t),d=await this.searchForSolution(t,u),m=await this.generateFix(t,u,d),p=await this.applyFix(t.provider,m),g=await this.testFix(t);await this.memoryStore.add(t,u,m,g);let h={attemptNumber:l+(i.length>0?1:0),error:t,diagnosis:u,proposedFix:m,webSearchResults:d,success:g,appliedChanges:p};if(n.push(h),g)return console.log(`\u2705 Self-healing successful after ${l} discovery attempts!`),{success:!0,totalAttempts:l+(i.length>0?1:0),healingHistory:n};c=!0,await this.delay(a),a*=this.config.backoffMultiplier}catch(u){c&&console.error(`\u274C Healing attempt ${l} failed:`,u),n.push({attemptNumber:l+(i.length>0?1:0),error:t,diagnosis:"Failed to diagnose",proposedFix:"",success:!1})}return{success:!1,totalAttempts:this.config.maxAttempts+(i.length>0?1:0),healingHistory:n,finalError:"Maximum healing attempts reached"}}async diagnoseError(t){let e=`You are an AI API expert. Analyze this error and provide a diagnosis:
Provider: ${t.provider}
Operation: ${t.context.operation}
Model: ${t.context.model}
Error: ${JSON.stringify(t.error,null,2)}
${t.context.options?`Request Options: ${JSON.stringify(t.context.options,null,2)}`:""}
Analyze what's wrong and why this error occurred. Focus on:
1. Tool/function calling format issues
2. Parameter naming or structure problems
3. Missing or extra fields
4. Type mismatches
5. API version incompatibilities
Provide a concise diagnosis of the issue.`;return(await this.stableProvider.chat({model:this.config.stableModel,messages:[{role:"user",content:e}],temperature:.3,max_tokens:1e3})).choices[0].message.content||"Unable to diagnose"}async searchForSolution(t,e){let o=[`${t.provider} API ${t.error instanceof Error?t.error.message:"error"} solution 2024`,`${t.provider} tool_choice ${t.context.operation} format documentation`,`${t.provider} function calling updated API changes`],r=[];try{let n=global;if(n.web_search&&typeof n.web_search=="function")for(let i of o)try{console.log(`\u{1F50D} Searching web for: ${i}`);let a=await n.web_search({search_term:i});a&&r.push(a)}catch{console.warn(`Web search failed for query: ${i}`)}}catch{}return r.length===0&&r.push(`Based on common ${t.provider} API patterns:
- Check tool_choice parameter: should be 'auto', 'none', 'required', or specific function
- Ensure tools array has proper format: [{type: 'function', function: {...}}]
- Verify all required fields are present in the request
- Check for deprecated parameters or methods
- Consider API version compatibility`),r}async generateFix(t,e,o){let r=await this.getProviderCode(t.provider),n=`You are an expert at fixing AI provider API integration issues.
CURRENT ERROR:
Provider: ${t.provider}
Diagnosis: ${e}
Error Details: ${JSON.stringify(t.error,null,2)}
CURRENT CODE:
${r}
WEB SEARCH RESULTS (Latest API Documentation):
${o.join(`
---
`)}
Generate a precise fix for this issue. Return ONLY the code changes needed in this format:
FILE: <filepath>
CHANGE: <description of what to change>
\`\`\`typescript
<new code>
\`\`\`
Focus on fixing:
1. Tool/function calling format
2. Parameter structure
3. Type definitions
4. API compatibility
Make minimal changes to fix the specific issue.`;return(await this.stableProvider.chat({model:this.config.stableModel,messages:[{role:"user",content:n}],temperature:.2,max_tokens:2e3})).choices[0].message.content||""}async applyFix(t,e){let o=[],r=/FILE:\s*(.+?)\nCHANGE:\s*(.+?)\n```typescript\n([\s\S]+?)```/g,n;for(;(n=r.exec(e))!==null;){let[,i,a,c]=n;try{let l=yn.default.join(Pe(),i.trim()),u=`${l}.backup-${Date.now()}`;if(lt.default.existsSync(l)){lt.default.copyFileSync(l,u);let d=lt.default.readFileSync(l,"utf-8"),m=d;if(c.includes("import")&&c.includes("export"))m=c;else{let h=a.match(/(?:function|method|class)\s+(\w+)/);if(h){let k=h[1],C=new RegExp(`((?:async\\s+)?(?:function\\s+)?${k}[^{]*{[^}]*})`,"gs");C.test(d)?m=d.replace(C,c):m=d+`
`+c}else m=c}lt.default.writeFileSync(l,m),o.push(`Applied fix to ${i}: ${a}`),console.log("\u{1F528} Rebuilding project...");let{stdout:p,stderr:g}=await Au("npm run build");if(g&&!g.includes("warning"))throw console.log("\u274C Build failed, restoring backup..."),lt.default.copyFileSync(u,l),lt.default.unlinkSync(u),new Error(`Build failed: ${g}`);lt.default.unlinkSync(u),console.log("\u2705 Build successful!")}}catch(l){console.error(`Failed to apply fix to ${i}:`,l)}}return o}async testFix(t){try{Object.keys(require.cache).forEach(i=>{i.includes("ai/providers")&&delete require.cache[i]});let{AIProviderManager:e}=await Promise.resolve().then(()=>(no(),ta)),o=new e;return o.getProviderConfig(t.provider)?.enabled?await o.testProvider(t.provider):!1}catch{return!1}}async getProviderCode(t){let e=yn.default.join(Pe(),"src","ai","providers",`${t}-provider.ts`);return lt.default.existsSync(e)?lt.default.readFileSync(e,"utf-8"):"Provider code not found"}delay(t){return new Promise(e=>setTimeout(e,t))}async logHealingResult(t,e){let o=Le("healing-logs");lt.default.existsSync(o)||lt.default.mkdirSync(o,{recursive:!0});let r=yn.default.join(o,`${e}-${Date.now()}.json`);lt.default.writeFileSync(r,JSON.stringify(t,null,2)),console.log(`\u{1F4DD} Healing log saved to: ${r}`)}}});var wn,oa=M(()=>{"use strict";f();ea();ze();wn=class{constructor(t,e){this.isHealing=!1;this.provider=t,this.providerName=e,this.healingService=new vn({enabled:X("selfHealingEnabled")!==!1,maxAttempts:X("selfHealingMaxAttempts")||50})}async chat(t){try{return await this.provider.chat(t)}catch(e){if(this.isHealableError(e)&&!this.isHealing)return await this.handleErrorWithHealing(e,"chat",t);throw e}}async*chatStream(t){try{yield*this.provider.chatStream(t)}catch(e){if(this.isHealableError(e)&&!this.isHealing&&await this.attemptHealing(e,"chatStream",t)){yield*this.provider.chatStream(t);return}throw e}}async getModels(){try{return await this.provider.getModels()}catch(t){if(this.isHealableError(t)&&!this.isHealing&&await this.attemptHealing(t,"getModels"))return await this.provider.getModels();throw t}}async testConnection(){try{return await this.provider.testConnection()}catch(t){if(this.isHealableError(t)&&!this.isHealing&&await this.attemptHealing(t,"testConnection"))return await this.provider.testConnection();throw t}}isHealableError(t){let e=t.message||t.toString();return["tool_use_id found in tool_result","Each tool_result block must have","corresponding tool_use block","message sequencing","previous message","conversation history","rate limit","quota exceeded","authentication","network error","timeout","ECONNREFUSED","ETIMEDOUT"].some(n=>e.toLowerCase().includes(n.toLowerCase()))?!1:["tool_choice","tools","function","Invalid value","parameter","format","schema","required","type","expected","Unrecognized","not supported","deprecated"].some(n=>e.toLowerCase().includes(n.toLowerCase()))}async handleErrorWithHealing(t,e,o){let r={provider:this.providerName,error:{message:t.message,stack:t.stack,response:t.response,status:t.status},timestamp:new Date,context:{model:o?.model||"unknown",operation:e,options:o}};console.log(`
\u{1F527} Attempting self-healing for ${this.providerName} ${e} error...`),this.isHealing=!0;try{let n=await this.healingService.healAPIError(r);if(n.success)switch(console.log(`\u2705 Self-healing successful! Retrying ${e}...`),await this.healingService.logHealingResult(n,this.providerName),process.stdout.write("\x1B[2K\r"),e){case"chat":return await this.provider.chat(o);case"chatStream":return!0;case"getModels":return await this.provider.getModels();case"testConnection":return await this.provider.testConnection()}else throw n.totalAttempts>0&&console.log(`\u274C Self-healing failed after ${n.totalAttempts} attempts`),await this.healingService.logHealingResult(n,this.providerName),t}finally{this.isHealing=!1}}async attemptHealing(t,e,o){let r={provider:this.providerName,error:{message:t.message,stack:t.stack,response:t.response,status:t.status},timestamp:new Date,context:{model:o?.model||"unknown",operation:e,options:o}};this.isHealing=!0;try{let n=await this.healingService.healAPIError(r);return n.success?(await this.healingService.logHealingResult(n,this.providerName),!0):(await this.healingService.logHealingResult(n,this.providerName),!1)}finally{this.isHealing=!1}}}});function ra(s){try{return Tr(s)}catch{return kt.z.unknown()}}function Tr(s){if(!s||typeof s!="object")return kt.z.unknown();if(Array.isArray(s.enum)&&s.enum.length>0){let e=s.enum.filter(o=>o!=null).map(o=>kt.z.literal(o));if(e.length>0){let o=e[0];for(let r=1;r<e.length;r++)o=o.or(e[r]);return Uo(o,s.description)}}switch(Array.isArray(s.type)?s.type.find(e=>e&&e!=="null"):s.type){case"string":return Uo(kt.z.string(),s.description);case"number":case"integer":return Uo(kt.z.number(),s.description);case"boolean":return Uo(kt.z.boolean(),s.description);case"array":{let e=s.items?Tr(s.items):kt.z.unknown();return Uo(kt.z.array(e),s.description)}case"object":{let e={},o=new Set((s.required||[]).filter(i=>typeof i=="string")),r=s.properties||{};for(let[i,a]of Object.entries(r)){let c=Tr(a);e[i]=o.has(i)?c:c.optional()}let n=kt.z.object(e).passthrough();return Uo(n,s.description)}default:return s.properties?Tr({...s,type:"object"}):s.items?Tr({...s,type:"array"}):Uo(kt.z.unknown(),s.description)}}function Uo(s,t){return t?s.describe(t):s}var kt,na=M(()=>{"use strict";f();kt=require("zod")});var kr,bn,xn,Sn,sa,or,ia=M(()=>{"use strict";f();kr=require("ai"),bn=require("@ai-sdk/openai"),xn=require("@ai-sdk/anthropic"),Sn=require("@ai-sdk/google");Ao();gn();na();sa=I(require("crypto")),or=class{constructor(t="openai"){this.currentProvider="openai";this.currentProvider=t}getProvider(){let e=ot().find(c=>c.provider===this.currentProvider),o=Sr(this.currentProvider),r=pn(this.currentProvider,e?.baseURL),n=Io(),i=o&&n?mn(n):void 0;if(this.currentProvider==="openai"){let c={apiKey:o?"unused":e?.apiKey,baseURL:r,headers:i,organization:o?void 0:e?.organizationId,name:"openai"};return e?.apiKey||o?(0,bn.createOpenAI)(c):bn.openai}if(this.currentProvider==="anthropic"){let c={apiKey:o?"unused":e?.apiKey,baseURL:r,headers:i,name:"anthropic"};return e?.apiKey||o?(0,xn.createAnthropic)(c):xn.anthropic}let a={apiKey:o?"unused":e?.apiKey,baseURL:r,headers:i,name:"google"};return e?.apiKey||o?(0,Sn.createGoogleGenerativeAI)(a):Sn.google}buildToolSet(t){if(!t||t.length===0)return;let e={};for(let o of t){let r=o.function?.name;if(!r)continue;let n=o.function?.parameters||{type:"object",properties:{},required:[]},i=ra(n);e[r]={description:o.function?.description,inputSchema:i}}return Object.keys(e).length>0?e:void 0}mapToolChoice(t,e,o){if(!(!o||Object.keys(o).length===0)&&e!=null){if(e==="auto"||e==="none"||e==="required")return e;if(typeof e=="string")return{type:"tool",toolName:e};if(typeof e=="object"){if(t==="openai"&&e.type==="function"&&e.function?.name)return{type:"tool",toolName:e.function.name};if(t==="anthropic"&&(e.type==="tool"||e.type==="any"||e.type==="auto")){if(e.name)return{type:"tool",toolName:e.name};if(e.type==="any"||e.type==="auto")return"auto"}}}}buildModelMessages(t,e){let o=t.messages||[],r=a=>{if(a)for(let c=o.length-1;c>=0;c--){let l=o[c];if(l.role==="assistant"&&Array.isArray(l.tool_calls)){let u=l.tool_calls.find(d=>d.id===a);if(u?.function?.name)return u.function.name}}},n=[],i=a=>{if(!a)return;let c=String(a);return c.length<=48?c:sa.default.createHash("sha256").update(c).digest("hex").slice(0,48)};for(let a of o){let c=a?.content,l=typeof c=="string"?c.trim():c==null?"":String(c).trim();if(a.role==="system")l.length>0&&n.push({role:"system",content:l});else if(a.role==="user")l.length>0&&n.push({role:"user",content:l});else if(a.role==="assistant"){let u=[];if(l.length>0&&u.push({type:"text",text:l}),Array.isArray(a.tool_calls))for(let d of a.tool_calls){let m={};try{m=d.function?.arguments?JSON.parse(d.function.arguments):{}}catch{}u.push({type:"tool-call",toolCallId:i(d.id),toolName:d.function?.name||"unknown",input:m})}u.length>0?n.push({role:"assistant",content:u}):l.length>0&&n.push({role:"assistant",content:l})}else if(a.role==="tool"){let u=a.tool_call_id,d=r(u)||a.name||"unknown",m=l.length>0;n.push({role:"tool",content:[{type:"tool-result",toolCallId:i(u)||"unknown",toolName:d,output:m?{type:"text",value:l}:{type:"json",value:{}}}]})}}return n}async chat(t){let e=this.getProvider(),o=this.buildToolSet(t.tools),r=this.buildModelMessages(t,o),n=this.mapToolChoice(this.currentProvider,t.tool_choice,o),i=await(0,kr.generateText)({model:e(t.model),messages:r,tools:o,toolChoice:n,...t.temperature!==void 0?{temperature:t.temperature}:{},...t.max_tokens!==void 0?{maxOutputTokens:t.max_tokens}:{}}),a=i.text??"",c=(i.toolCalls||[]).map(l=>({id:l.toolCallId,type:"function",function:{name:l.toolName,arguments:JSON.stringify(l.input??{})}}));return{choices:[{message:{role:"assistant",content:a,tool_calls:c.length?c:void 0},finish_reason:i.finishReason||"stop"}],usage:i.usage?{prompt_tokens:i.usage.inputTokens??0,completion_tokens:i.usage.outputTokens??0,total_tokens:i.usage.totalTokens??(i.usage.inputTokens??0)+(i.usage.outputTokens??0)}:void 0}}async*chatStream(t){let e=this.getProvider(),o=this.buildToolSet(t.tools),r=this.mapToolChoice(this.currentProvider,t.tool_choice,o),n=this.buildModelMessages(t,o),i=(0,kr.streamText)({model:e(t.model),messages:n,tools:o,toolChoice:r,...t.temperature!==void 0?{temperature:t.temperature}:{},...t.max_tokens!==void 0?{maxOutputTokens:t.max_tokens}:{}});for await(let a of i.fullStream)a.type==="text-delta"?yield{choices:[{delta:{content:a.text}}]}:a.type==="tool-call"&&(yield{choices:[{delta:{tool_calls:[{id:a.toolCallId,type:"function",function:{name:a.toolName,arguments:JSON.stringify(a.input??{})}}]}}]})}async getModels(){return ot().find(o=>o.provider===this.currentProvider)?.models||[]}async testConnection(){try{let t=this.getProvider();return!!(await(0,kr.generateText)({model:t("gpt-4o"),prompt:"test"})).text}catch{return!1}}}});var Ds,Cn,aa=M(()=>{"use strict";f();Ds=class{constructor(){this.middlewares=[]}register(t){this.middlewares.push(t),this.middlewares.sort((e,o)=>e.order-o.order)}async apply(t,e){let o=t;for(let r of this.middlewares)o=await r.transform(o,e);return o}},Cn=new Ds});var ca,la=M(()=>{"use strict";f();fn();ca={name:"tool-choice-normalizer",order:10,async transform(s,t){let e={...s};if(!e.tools||e.tools.length===0){let{tool_choice:r,...n}=e;return n}let o=Ps(t.provider,e.tool_choice);if(o&&typeof o=="object"&&o.type==="allowed_tools")e.tools=Es(e.tools,o.tools),e.tool_choice="auto";else if(o==="none"){let{tools:r,tool_choice:n,...i}=e;return i}else e.tool_choice=o;return e}}});var ga={};ct(ga,{addBrowserCredential:()=>_u,cleanupStaleBrowsers:()=>zo,createBrowserProfile:()=>Ru,deleteBrowserProfile:()=>Du,deleteCredentialFromKeychain:()=>ma,ensureBrowserConfigDirectory:()=>Fs,generateIsolatedProfilePath:()=>pa,generatePlaywrightArgs:()=>Bs,getCredentialFromKeychain:()=>$u,isKeychainAvailable:()=>An,isProfileInUse:()=>Pr,loadBrowserConfig:()=>Pt,removeBrowserCredential:()=>Ou,saveBrowserConfig:()=>rr,storeCredentialInKeychain:()=>Iu,updatePlaywrightMCPConfig:()=>Fu});function Fs(){ue.existsSync(kn)||ue.mkdirSync(kn,{recursive:!0}),ue.existsSync(Pn)||ue.mkdirSync(Pn,{recursive:!0})}function Pt(){if(Fs(),ue.existsSync(_s))try{let t=ue.readFileSync(_s,"utf8"),e=JSON.parse(t);return e.profiles.forEach(o=>{ue.existsSync(o.userDataDir)||ue.mkdirSync(o.userDataDir,{recursive:!0})}),{...Tn,...e}}catch(t){console.warn("Failed to load browser config, using defaults:",t)}let s=Tn.profiles[0];return ue.existsSync(s.userDataDir)||ue.mkdirSync(s.userDataDir,{recursive:!0}),rr(Tn),Tn}function rr(s){Fs();try{let t=JSON.stringify(s,null,2);ue.writeFileSync(_s,t,"utf8")}catch(t){console.error("Failed to save browser config:",t)}}async function An(){if(En.platform()!=="darwin")return!1;try{return await Mn("which security"),!0}catch{return!1}}async function Iu(s,t){if(!await An())return!1;try{let e=`${s.domain}:${s.username}`;return await Mn(`security add-internet-password -a "${e}" -s "${Os}" -w "${t}" -U`),!0}catch(e){return console.error("Failed to store credential in keychain:",e),!1}}async function $u(s){if(!await An())return null;try{let t=`${s.domain}:${s.username}`,{stdout:e}=await Mn(`security find-internet-password -a "${t}" -s "${Os}" -w`);return e.trim()}catch{return null}}async function ma(s){if(!await An())return!1;try{let t=`${s.domain}:${s.username}`;return await Mn(`security delete-internet-password -a "${t}" -s "${Os}"`),!0}catch{return!1}}function Ru(s,t,e){let o=`profile_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,r=so.join(Pn,o);return ue.existsSync(r)||ue.mkdirSync(r,{recursive:!0}),{id:o,name:s,description:t,userDataDir:r,viewport:e||{width:1280,height:720},isDefault:!1,createdAt:new Date}}function Du(s){try{let t=Pt(),e=t.profiles.find(o=>o.id===s);return!e||e.isDefault?!1:(ue.existsSync(e.userDataDir)&&ue.removeSync(e.userDataDir),t.profiles=t.profiles.filter(o=>o.id!==s),rr(t),!0)}catch{return!1}}function _u(s,t,e,o){let r={id:`cred_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,domain:s,username:t,description:e,profileId:o,createdAt:new Date},n=Pt();return n.credentials.push(r),rr(n),r}function Ou(s){try{let t=Pt(),e=t.credentials.find(o=>o.id===s);return e?(ma(e),t.credentials=t.credentials.filter(o=>o.id!==s),rr(t),!0):!1}catch{return!1}}function Bs(s,t=!1){let e=Pt(),o=s||e.profiles.find(i=>i.isDefault)||e.profiles[0],r=t||Pr(o),n=["-y","@playwright/mcp@latest","--user-data-dir",r?pa(o):o.userDataDir,"--viewport-size",`${o.viewport.width},${o.viewport.height}`];return r&&(n.push("--isolated"),console.log("\u{1F504} Using isolated browser profile to avoid conflicts")),e.settings.headless&&n.push("--headless"),e.settings.ignoreHTTPSErrors&&n.push("--ignore-https-errors"),e.settings.saveTraces&&(n.push("--save-trace"),n.push("--output-dir","./playwright-output")),e.settings.saveSession&&n.push("--save-session"),e.settings.capabilities.length>0&&n.push("--caps",e.settings.capabilities.join(",")),o.userAgent&&n.push("--user-agent",o.userAgent),o.proxy?.server&&(n.push("--proxy-server",o.proxy.server),o.proxy.bypass&&n.push("--proxy-bypass",o.proxy.bypass.join(","))),n}function Pr(s){try{let{execSync:t}=require("child_process");return t(`lsof +D "${s.userDataDir}" 2>/dev/null || true`,{encoding:"utf8"}).trim().length>0}catch{return!1}}function pa(s){let t=Date.now(),e=`${s.userDataDir}-isolated-${t}`;return ue.existsSync(e)||ue.mkdirSync(e,{recursive:!0}),e}function zo(){try{console.log("\u{1F9F9} Cleaning up stale browser processes...");let{execSync:s}=require("child_process");try{s('pkill -f "playwright" 2>/dev/null || true',{stdio:"ignore"}),s('pkill -f "chromium" 2>/dev/null || true',{stdio:"ignore"}),s('pkill -f "chrome" 2>/dev/null || true',{stdio:"ignore"})}catch{}let t=Pt();for(let e of t.profiles){let o=so.dirname(e.userDataDir);if(ue.existsSync(o)){let r=ue.readdirSync(o);for(let n of r)if(n.includes("-isolated-")){let i=so.join(o,n),a=ue.statSync(i);if(Date.now()-a.mtime.getTime()>36e5)try{ue.rmSync(i,{recursive:!0,force:!0}),console.log(`\u{1F5D1}\uFE0F Cleaned up old isolated profile: ${n}`)}catch{}}}}console.log("\u2705 Browser cleanup completed")}catch(s){console.warn("\u26A0\uFE0F Browser cleanup had some issues:",s instanceof Error?s.message:String(s))}}function Fu(s){let t=Pt(),e=s?t.profiles.find(o=>o.id===s):t.profiles.find(o=>o.isDefault);e&&(e.lastUsed=new Date,rr(t))}var ue,so,En,ua,da,Mn,kn,_s,Pn,Os,Tn,In=M(()=>{"use strict";f();ue=I(require("fs-extra")),so=I(require("path")),En=I(require("os")),ua=require("child_process"),da=require("util"),Mn=(0,da.promisify)(ua.exec),kn=so.join(En.homedir(),".eva-prompt"),_s=so.join(kn,"browser-config.json"),Pn=so.join(kn,"browser-profiles"),Os="EVA-CLI-Browser",Tn={profiles:[{id:"default",name:"Default Profile",description:"Default browser profile for general use",userDataDir:so.join(Pn,"default"),viewport:{width:1280,height:720},isDefault:!0,createdAt:new Date}],credentials:[],settings:{defaultBrowser:"playwright",headless:!0,ignoreHTTPSErrors:!0,saveTraces:!0,saveSession:!0,capabilities:["vision","pdf"]}}});var Wt={};ct(Wt,{PREDEFINED_SERVERS:()=>Me,addMCPServer:()=>jo,getBrowserMCPConfig:()=>zs,getCleanBrowserMCPConfig:()=>Nu,getMCPServer:()=>Bu,loadMCPConfig:()=>qt,removeMCPServer:()=>qo,restartBrowserWithIsolation:()=>js,saveMCPConfig:()=>Ls});function Er(){try{if(!jt.existsSync($n))return{};let s=jt.readFileSync($n,"utf8");return JSON.parse(s)}catch(s){return console.warn("Failed to load settings:",s),{}}}function Us(s){try{jt.existsSync(Ns)||jt.mkdirSync(Ns,{recursive:!0}),jt.writeFileSync($n,JSON.stringify(s,null,2))}catch(t){throw console.error("Failed to save settings:",t),t}}function qt(){let s=Er(),t=s.mcpServers?Object.values(s.mcpServers):[];if(t.length>0){let e=JSON.stringify(t);t=t.filter(i=>i.name==="playwright"||i.name==="memory");let o=t.some(i=>i.name==="playwright"),r=t.some(i=>i.name==="memory");!o&&Me.playwright&&t.push(Me.playwright),!r&&Me.memory&&t.push(Me.memory),JSON.stringify(t)!==e&&Ls({servers:t})}return t.length===0&&(t=["playwright","memory"].map(o=>Me[o]).filter(Boolean),t.length>0&&(Ls({servers:t}),jt.existsSync($n)||console.log("\u2713 Configured minimal MCP: Playwright + Memory"))),{servers:t}}function Ls(s){let t=Er();t.mcpServers={};for(let e of s.servers)t.mcpServers[e.name]=e;Us(t)}function jo(s){let t=Er();t.mcpServers||(t.mcpServers={}),t.mcpServers[s.name]=s,Us(t)}function qo(s){let t=Er();t.mcpServers&&(delete t.mcpServers[s],Us(t))}function Bu(s){return Er().mcpServers?.[s]}function zs(s,t=!1){let e=Me.playwright,r=Bs(void 0,t).slice(2);return{...e,transport:{...e.transport,args:r}}}async function Nu(s){return console.log("\u{1F9F9} Preparing browser configuration..."),zo(),await new Promise(t=>setTimeout(t,1e3)),zs(s,!1)}async function js(s){return console.log("\u{1F504} Restarting browser with isolation..."),zo(),await new Promise(t=>setTimeout(t,2e3)),zs(s,!0)}var jt,fa,Ns,$n,Me,Be=M(()=>{"use strict";f();jt=I(require("fs")),fa=I(require("path"));Ue();In();Ns=Le(),$n=fa.join(Ns,"mcp-settings.json");Me={"desktop-automation":{name:"desktop-automation",transport:{type:"stdio",command:"npx",args:["-y","mcp-desktop-automation"],env:{}}},"macos-automator":{name:"macos-automator",transport:{type:"stdio",command:"npx",args:["-y","@steipete/macos-automator-mcp"],env:{}}},vscode:{name:"vscode",transport:{type:"stdio",command:"npx",args:["-y","vscode-mcp-server"],env:{}}},"apple-shortcuts":{name:"apple-shortcuts",transport:{type:"stdio",command:"npx",args:["-y","mcp-server-apple-shortcuts"],env:{}}},"macos-everything":{name:"macos-everything",transport:{type:"stdio",command:"npx",args:["-y","@modelcontextprotocol/server-everything"],env:{}}},"android-debug":{name:"android-debug",transport:{type:"stdio",command:"npx",args:["-y","@hyperdrive-eng/mcp-nodejs-debugger"],env:{}}},"package-versions":{name:"package-versions",transport:{type:"stdio",command:"npx",args:["-y","mcp-package-version"],env:{}}},"mcp-installer":{name:"mcp-installer",transport:{type:"stdio",command:"npx",args:["-y","@anaisbetts/mcp-installer"],env:{}}},git:{name:"git",transport:{type:"stdio",command:"npx",args:["-y","@modelcontextprotocol/server-git","--repository",Pe()],env:{}}},github:{name:"github",transport:{type:"stdio",command:"npx",args:["-y","@modelcontextprotocol/server-github"],env:{GITHUB_PERSONAL_ACCESS_TOKEN:process.env.GITHUB_TOKEN||""}}},postgres:{name:"postgres",transport:{type:"stdio",command:"npx",args:["-y","@modelcontextprotocol/server-postgres"],env:{POSTGRES_CONNECTION_STRING:process.env.DATABASE_URL||process.env.POSTGRES_URL||""}}},sqlite:{name:"sqlite",transport:{type:"stdio",command:"npx",args:["-y","@modelcontextprotocol/server-sqlite"],env:{}}},brave_search:{name:"brave_search",transport:{type:"stdio",command:"npx",args:["-y","@modelcontextprotocol/server-brave-search"],env:{BRAVE_API_KEY:process.env.BRAVE_API_KEY||""}}},gdrive:{name:"gdrive",transport:{type:"stdio",command:"npx",args:["-y","@modelcontextprotocol/server-gdrive"],env:{GOOGLE_APPLICATION_CREDENTIALS:process.env.GOOGLE_APPLICATION_CREDENTIALS||""}}},gmail:{name:"gmail",transport:{type:"stdio",command:"npx",args:["-y","@modelcontextprotocol/server-gmail"],env:{GOOGLE_APPLICATION_CREDENTIALS:process.env.GOOGLE_APPLICATION_CREDENTIALS||""}}},slack:{name:"slack",transport:{type:"stdio",command:"npx",args:["-y","@modelcontextprotocol/server-slack"],env:{SLACK_BOT_TOKEN:process.env.SLACK_BOT_TOKEN||"",SLACK_TEAM_ID:process.env.SLACK_TEAM_ID||""}}},memory:{name:"memory",transport:{type:"stdio",command:"npx",args:["-y","@modelcontextprotocol/server-memory"],env:{}}},puppeteer:{name:"puppeteer",transport:{type:"stdio",command:"npx",args:["-y","@modelcontextprotocol/server-puppeteer"],env:{}}},time:{name:"time",transport:{type:"stdio",command:"npx",args:["-y","@modelcontextprotocol/server-time"],env:{}}},everything:{name:"everything",transport:{type:"stdio",command:"npx",args:["-y","@modelcontextprotocol/server-everything"],env:{}}},sequential_thinking:{name:"sequential_thinking",transport:{type:"stdio",command:"npx",args:["-y","@modelcontextprotocol/server-sequential-thinking"],env:{}}},playwright:{name:"playwright",transport:{type:"stdio",command:"npx",args:["-y","@playwright/mcp","--headless"],env:{}}}}});var ut,qs=M(()=>{"use strict";f();Be();ut=class{static getRecommendedServersForProvider(t){let e=["git","memory","time"],o=["playwright","puppeteer"];switch(t){case"openai":return[...e,...o,"github","brave_search","sequential_thinking","postgres","sqlite"];case"anthropic":return[...e,...o,"github","brave_search","sequential_thinking","gdrive","gmail"];case"google":return[...e,...o,"gdrive","gmail","brave_search","postgres"];default:return[...e,...o]}}static getProviderSpecificServers(t){let e={};return this.getRecommendedServersForProvider(t).forEach(r=>{Me[r]&&(e[r]=Me[r])}),e}static createProviderConfig(t){let e=Object.values(this.getProviderSpecificServers(t)),o=this.getProviderCapabilities(t),r=this.getProviderPriority(t);return{servers:e,capabilities:o,priority:r}}static getProviderCapabilities(t){switch(t){case"openai":return["function_calling","code_execution","web_search","file_operations","database_queries","git_operations","api_requests"];case"anthropic":return["function_calling","reasoning","file_operations","web_search","document_analysis","git_operations"];case"google":return["function_calling","multimodal","web_search","google_services","file_operations"];default:return["basic_tools"]}}static getProviderPriority(t){switch(t){case"openai":return 10;case"anthropic":return 9;case"google":return 7;default:return 1}}static autoConfigureFromEnvironment(){let t=[],e={github:process.env.GITHUB_TOKEN,postgres:process.env.DATABASE_URL||process.env.POSTGRES_URL,brave_search:process.env.BRAVE_API_KEY,gdrive:process.env.GOOGLE_APPLICATION_CREDENTIALS,gmail:process.env.GOOGLE_APPLICATION_CREDENTIALS,slack:process.env.SLACK_BOT_TOKEN&&process.env.SLACK_TEAM_ID};return t.push("git","memory","time","playwright","puppeteer","sqlite","sequential_thinking"),Object.entries(e).forEach(([o,r])=>{r&&t.push(o)}),process.platform==="win32"&&t.push("everything"),t}}});function ya(s){switch(s.type){case"stdio":return new Ws(s);case"http":return new Gs(s);case"sse":return new Ks(s);case"streamable_http":return new Js(s);case"websocket":throw new Error("WebSocket transport not yet implemented");default:throw new Error(`Unsupported transport type: ${s.type}`)}}var ha,Wo,Qs,Ws,Gs,Ks,Hs,Vs,Js,Ys,va=M(()=>{"use strict";f();ha=require("@modelcontextprotocol/sdk/client/stdio.js"),Wo=require("events"),Qs=I(require("axios")),Ws=class{constructor(t){this.config=t;if(!t.command)throw new Error("Command is required for stdio transport")}async connect(){let t={...process.env,...this.config.env,MCP_REMOTE_QUIET:"1",MCP_REMOTE_SILENT:"1",DEBUG:"",NODE_ENV:"production"};return this.transport=new ha.StdioClientTransport({command:this.config.command,args:this.config.args||[],env:t}),this.transport}async disconnect(){this.transport&&(await this.transport.close(),this.transport=void 0),this.process&&(this.process.kill(),this.process=void 0)}getType(){return"stdio"}},Gs=class extends Wo.EventEmitter{constructor(e){super();this.config=e;this.connected=!1;if(!e.url)throw new Error("URL is required for HTTP transport")}async connect(){this.client=Qs.default.create({baseURL:this.config.url,headers:{"Content-Type":"application/json",...this.config.headers}});try{await this.client.get("/health"),this.connected=!0}catch{this.connected=!0}return new Hs(this.client)}async disconnect(){this.connected=!1,this.client=void 0}getType(){return"http"}},Ks=class extends Wo.EventEmitter{constructor(e){super();this.config=e;this.connected=!1;if(!e.url)throw new Error("URL is required for SSE transport")}async connect(){return new Promise((e,o)=>{try{this.connected=!0,e(new Vs(this.config.url))}catch(r){o(r)}})}async disconnect(){this.connected=!1}getType(){return"sse"}},Hs=class extends Wo.EventEmitter{constructor(e){super();this.client=e}async start(){}async close(){}async send(e){try{return(await this.clien