@evolvingmachines/sdk 0.0.51 → 0.0.52-project-sable.20260726.6e95f36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-IHBQMTA4.js +6 -0
- package/dist/hosted/cli.cjs +89 -0
- package/dist/hosted/cli.d.cts +56 -0
- package/dist/hosted/cli.d.ts +56 -0
- package/dist/hosted/cli.js +84 -0
- package/dist/index.cjs +444 -63
- package/dist/index.d.cts +880 -365
- package/dist/index.d.ts +880 -365
- package/dist/index.js +439 -63
- package/dist/tar-WPIXS3E6.js +1 -0
- package/dist/types-BeJrn1lR.d.cts +1351 -0
- package/dist/types-BeJrn1lR.d.ts +1351 -0
- package/package.json +15 -7
package/dist/index.js
CHANGED
|
@@ -1,52 +1,52 @@
|
|
|
1
|
-
import {EventEmitter}from'events';import Es from'ajv';import {randomBytes,randomUUID,publicEncrypt,constants,createHash}from'crypto';import gi from'zod-to-json-schema';import*as $ from'fs';import {createWriteStream}from'fs';import*as ae from'path';import {join,dirname,isAbsolute,normalize,resolve,relative}from'path';import {mkdir,appendFile,rm,readFile,writeFile,unlink,copyFile}from'fs/promises';import {homedir,tmpdir}from'os';import {exec,execFile}from'child_process';import {promisify}from'util';import {z as z$1}from'zod';export{E2BProvider,createE2BProvider}from'@evolvingmachines/e2b';export{DaytonaProvider,createDaytonaProvider}from'@evolvingmachines/daytona';export{ModalProvider,createModalProvider}from'@evolvingmachines/modal';import {Readable}from'stream';import {pipeline}from'stream/promises';var Ar={CLAUDE:"claude",CODEX:"codex",GEMINI:"gemini",QWEN:"qwen",KIMI:"kimi",OPENCODE:"opencode",DROID:"droid"},qe={strict:{coerceTypes:false,removeAdditional:false,useDefaults:false,allErrors:true},loose:{coerceTypes:"array",removeAdditional:false,useDefaults:true,allErrors:true}};function ne(t){return t!=="off"&&t!=="none"&&t!=="minimal"&&t!=="no-thinking"}function Ye(t){if(!(t==="off"||t==="none"||t==="no-thinking"))return !t||t==="thinking"||t==="medium"?"medium":t==="low"||t==="minimal"?"minimal":t==="xhigh"?"max":t}function Mr(t){let e=Ye(t);return e?` --variant ${e} --thinking`:""}var Qe={claude:{image:"evolve-all",apiKeyEnv:"ANTHROPIC_API_KEY",oauthEnv:"CLAUDE_CODE_OAUTH_TOKEN",baseUrlEnv:"ANTHROPIC_BASE_URL",customHeadersEnv:"ANTHROPIC_CUSTOM_HEADERS",defaultModel:"opus",models:[{alias:"fable",modelId:"claude-fable-5",description:"Highest capability, long-horizon agentic work"},{alias:"opus",modelId:"claude-opus-4-8",description:"Complex reasoning, R&D, architecting"},{alias:"sonnet",modelId:"claude-sonnet-4-6",description:"Daily coding, features, tests"},{alias:"haiku",modelId:"claude-haiku-4-5-20251001",description:"Quick tasks, syntax correction"},{alias:"opus[1m]",modelId:"opus[1m]",description:"Complex reasoning with 1M context window"},{alias:"sonnet[1m]",modelId:"sonnet[1m]",description:"Daily coding with 1M context window"}],systemPromptFile:"CLAUDE.md",mcpConfig:{settingsDir:"~/.claude",filename:"settings.json",format:"json",projectConfig:true},skillsConfig:{sourceDir:"/home/user/.evolve/skills",targetDir:"/home/user/.claude/skills"},buildCommand:({prompt:t,model:e,isResume:n,reasoningEffort:r})=>{let s=n?"--continue ":"",a=r?` --effort ${r}`:"";return `echo "${t}" | claude -p ${s}--model ${e}${a} --output-format stream-json --verbose --dangerously-skip-permissions`}},codex:{image:"evolve-all",apiKeyEnv:"OPENAI_API_KEY",oauthEnv:"CODEX_OAUTH_FILE_PATH",oauthFileName:"auth.json",baseUrlEnv:"OPENAI_BASE_URL",defaultModel:"gpt-5.4",models:[{alias:"gpt-5.5",modelId:"gpt-5.5",description:"Newest frontier model"},{alias:"gpt-5.4",modelId:"gpt-5.4",description:"Flagship for professional work"},{alias:"gpt-5.4-mini",modelId:"gpt-5.4-mini",description:"Fast, efficient mini model"},{alias:"gpt-5.3-codex",modelId:"gpt-5.3-codex",description:"Industry-leading code-optimized"},{alias:"gpt-5.2",modelId:"gpt-5.2",description:"Previous general-purpose model"}],systemPromptFile:"AGENTS.md",mcpConfig:{settingsDir:"~/.codex",filename:"config.toml",format:"toml"},skillsConfig:{sourceDir:"/home/user/.evolve/skills",targetDir:"/home/user/.codex/skills"},spendTrackingEnvs:{sessionTagEnv:"EVOLVE_LITELLM_CUSTOMER_ID",runTagEnv:"EVOLVE_LITELLM_TAGS"},setupCommand:`printf '%s\\n' "$OPENAI_API_KEY" | codex login --with-api-key`,buildCommand:({prompt:t,model:e,isResume:n,reasoningEffort:r})=>{let s=r?` -c model_reasoning_effort="${r}"`:"";return `printf '%s' "${t}" | codex exec --model ${e}${s} --dangerously-bypass-approvals-and-sandbox --skip-git-repo-check --json${n?" resume --last":""}`}},gemini:{image:"evolve-all",apiKeyEnv:"GEMINI_API_KEY",oauthEnv:"GEMINI_OAUTH_FILE_PATH",oauthFileName:"oauth_creds.json",oauthActivationEnv:{key:"GOOGLE_GENAI_USE_GCA",value:"true"},baseUrlEnv:"GOOGLE_GEMINI_BASE_URL",defaultModel:"gemini-3.1-pro-preview",models:[{alias:"gemini-3.1-pro-preview",modelId:"gemini-3.1-pro-preview",description:"Latest pro, complex agentic + coding"},{alias:"gemini-3.1-flash-lite-preview",modelId:"gemini-3.1-flash-lite-preview",description:"Cost-efficient, low latency"},{alias:"gemini-3.5-flash",modelId:"gemini-3.5-flash",description:"Latest Flash model"},{alias:"gemini-3-flash-preview",modelId:"gemini-3-flash-preview",description:"Frontier flash performance"},{alias:"gemini-2.5-pro",modelId:"gemini-2.5-pro",description:"Complex tasks, deep reasoning"},{alias:"gemini-2.5-flash",modelId:"gemini-2.5-flash",description:"Balance speed/reasoning"},{alias:"gemini-2.5-flash-lite",modelId:"gemini-2.5-flash-lite",description:"Simple tasks, fastest"}],systemPromptFile:"GEMINI.md",mcpConfig:{settingsDir:"~/.gemini",filename:"settings.json",format:"json"},skillsConfig:{sourceDir:"/home/user/.evolve/skills",targetDir:"/home/user/.gemini/skills"},customHeadersEnv:"GEMINI_CLI_CUSTOM_HEADERS",customHeadersFormat:"comma",gatewayPath:"/gemini",buildCommand:({prompt:t,model:e,isResume:n})=>`gemini "${t}" ${n?"--resume latest ":""}--model ${e} --yolo --output-format stream-json`},qwen:{image:"evolve-all",apiKeyEnv:"OPENAI_API_KEY",baseUrlEnv:"OPENAI_BASE_URL",defaultModel:"qwen3.7-max",models:[{alias:"qwen3.7-max",modelId:"qwen3.7-max",description:"Strongest reasoning and coding option"},{alias:"qwen3.7-plus",modelId:"qwen3.7-plus",description:"Latest balanced Qwen Cloud recommendation"},{alias:"qwen3.6-flash",modelId:"qwen3.6-flash",description:"Fast and cost-effective option"},{alias:"qwen3.6-plus",modelId:"qwen3.6-plus",description:"Compatibility model used in Qwen Code examples"}],systemPromptFile:"QWEN.md",mcpConfig:{settingsDir:"~/.qwen",filename:"settings.json",format:"json"},skillsConfig:{sourceDir:"/home/user/.evolve/skills",targetDir:"/home/user/.qwen/skills"},spendTrackingJsonConfig:{headersPath:"model.generationConfig.customHeaders"},gatewayModelAliases:{"qwen3.7-max":"dashscope/qwen3.7-max","qwen3.7-plus":"dashscope/qwen3.7-plus","qwen3.6-flash":"dashscope/qwen3.6-flash","qwen3.6-plus":"dashscope/qwen3.6-plus"},defaultBaseUrl:"https://dashscope-intl.aliyuncs.com/compatible-mode/v1",buildCommand:({prompt:t,model:e,isResume:n,isDirectMode:r})=>{let s=n?"--continue ":"",a=r||e.startsWith("dashscope/")?e:`dashscope/${e}`;return `qwen "${t}" ${s}--auth-type openai --model ${a} --yolo --output-format stream-json`}},kimi:{image:"evolve-all",apiKeyEnv:"KIMI_API_KEY",baseUrlEnv:"KIMI_BASE_URL",defaultModel:"kimi-k2.6",models:[{alias:"kimi-k2.6",modelId:"moonshot/kimi-k2.6",description:"Latest: long-horizon coding, swarm orchestration"},{alias:"kimi-k2p6-raptor",modelId:"kimi-k2p6-raptor",description:"Evolve-managed Kimi K2.6 Raptor route for latency-sensitive agent runs"},{alias:"kimi-k2p7-code-raptor",modelId:"kimi-k2p7-code-raptor",description:"Evolve-managed Kimi K2.7 Code Raptor route for latency-sensitive agent runs"},{alias:"kimi-k2.5",modelId:"moonshot/kimi-k2.5",description:"Previous multimodal flagship"}],systemPromptFile:"AGENTS.md",mcpConfig:{settingsDir:"~/.kimi-code",filename:"mcp.json",format:"json"},skillsConfig:{sourceDir:"/home/user/.evolve/skills",targetDir:"/home/user/.kimi-code/skills"},defaultBaseUrl:"https://api.moonshot.ai/v1",spendTrackingTomlProvider:{configPath:"~/.kimi-code/config.toml",providerName:"evolve-gateway",modelName:"evolve-default",maxContextSize:262144},checkpointExcludes:[".kimi-code/config.toml"],gatewayModelAliases:{"kimi-k2.6":"moonshot/kimi-k2.6","kimi-k2p6-raptor":"kimi-k2p6-raptor","kimi-k2p7-code-raptor":"kimi-k2p7-code-raptor","kimi-k2.5":"moonshot/kimi-k2.5"},buildCommand:({prompt:t,isResume:e,reasoningEffort:n})=>{let r=e?"--continue ":"",s=ke(t),a="--config-file /home/user/.kimi-code/config.toml",o="$(if [ -f /home/user/.kimi-code/mcp.json ]; then printf ' --mcp-config-file /home/user/.kimi-code/mcp.json'; fi)",c=ne(n)?"":" --no-thinking";return `if kimi --help 2>&1 | grep -q -- '--print'; then kimi --print ${r}${a}${o}${c} -p ${s} --output-format stream-json; else kimi ${r}-p ${s} --output-format stream-json; fi`}},opencode:{image:"evolve-all",apiKeyEnv:"OPENROUTER_API_KEY",baseUrlEnv:"OPENAI_BASE_URL",defaultModel:"openrouter/anthropic/claude-sonnet-4.6",providerEnvMap:{openrouter:{keyEnv:"OPENROUTER_API_KEY"}},gatewayConfigEnv:"OPENCODE_CONFIG_CONTENT",models:[{alias:"openrouter/anthropic/claude-fable-5",modelId:"openrouter/anthropic/claude-fable-5",description:"Anthropic Fable via OpenRouter"},{alias:"openrouter/anthropic/claude-sonnet-4.6",modelId:"openrouter/anthropic/claude-sonnet-4.6",description:"Anthropic Sonnet via OpenRouter"},{alias:"openrouter/anthropic/claude-opus-4.8",modelId:"openrouter/anthropic/claude-opus-4.8",description:"Anthropic Opus via OpenRouter"},{alias:"openrouter/anthropic/claude-haiku-4.5",modelId:"openrouter/anthropic/claude-haiku-4.5",description:"Anthropic Haiku via OpenRouter"},{alias:"openrouter/openai/gpt-5.5",modelId:"openrouter/openai/gpt-5.5",description:"OpenAI GPT-5.5 via OpenRouter"},{alias:"openrouter/openai/gpt-5.4",modelId:"openrouter/openai/gpt-5.4",description:"OpenAI GPT-5.4 via OpenRouter"},{alias:"openrouter/openai/gpt-5.4-mini",modelId:"openrouter/openai/gpt-5.4-mini",description:"OpenAI GPT-5.4 Mini via OpenRouter"},{alias:"openrouter/openai/gpt-5.3-codex",modelId:"openrouter/openai/gpt-5.3-codex",description:"OpenAI Codex via OpenRouter"},{alias:"openrouter/openai/gpt-5.2",modelId:"openrouter/openai/gpt-5.2",description:"OpenAI GPT-5.2 via OpenRouter"},{alias:"openrouter/google/gemini-3.1-pro-preview",modelId:"openrouter/google/gemini-3.1-pro-preview",description:"Gemini 3.1 Pro via OpenRouter"},{alias:"openrouter/google/gemini-3.5-flash",modelId:"openrouter/google/gemini-3.5-flash",description:"Gemini 3.5 Flash via OpenRouter"},{alias:"openrouter/google/gemini-3-flash-preview",modelId:"openrouter/google/gemini-3-flash-preview",description:"Gemini 3 Flash via OpenRouter"},{alias:"openrouter/qwen/qwen3-coder-next",modelId:"openrouter/qwen/qwen3-coder-next",description:"Qwen Coder Next via OpenRouter"},{alias:"openrouter/qwen/qwen3-coder-plus",modelId:"openrouter/qwen/qwen3-coder-plus",description:"Qwen Coder via OpenRouter"},{alias:"openrouter/moonshotai/kimi-k2.6",modelId:"openrouter/moonshotai/kimi-k2.6",description:"Kimi K2.6 via OpenRouter"},{alias:"openrouter/moonshotai/kimi-k2.5",modelId:"openrouter/moonshotai/kimi-k2.5",description:"Kimi K2.5 via OpenRouter"},{alias:"openrouter/z-ai/glm-5",modelId:"openrouter/z-ai/glm-5",description:"Zhipu GLM-5 via OpenRouter"}],systemPromptFile:"AGENTS.md",mcpConfig:{settingsDir:".",filename:"opencode.json",format:"json"},skillsConfig:{sourceDir:"/home/user/.evolve/skills",targetDir:"/home/user/.agents/skills"},checkpointDirs:["~/.local/share/opencode","~/.config/opencode","~/.local/state/opencode"],buildCommand:({prompt:t,model:e,isResume:n,isDirectMode:r,reasoningEffort:s})=>{let a=n?"--continue ":"",o=e.startsWith("openrouter/")?e:`openrouter/${e}`,c=Mr(s);return r?`OPENCODE_PERMISSION='{"*":"allow"}' opencode run ${a}--model ${o} --format json${c} "${t}" < /dev/null`:`OPENCODE_PERMISSION='{"*":"allow"}' opencode run ${a}--model litellm/${o} --format json${c} "${t}" < /dev/null`}},droid:{image:"evolve-all",apiKeyEnv:"FACTORY_API_KEY",defaultModel:"gpt-5.5",models:[{alias:"claude-opus-4-8",modelId:"claude-opus-4-8",description:"Factory-managed Claude Opus 4.8"},{alias:"claude-opus-4-8-fast",modelId:"claude-opus-4-8-fast",description:"Factory-managed Claude Opus 4.8 Fast Mode"},{alias:"claude-sonnet-4-6",modelId:"claude-sonnet-4-6",description:"Factory-managed Claude Sonnet 4.6"},{alias:"claude-opus-4-6",modelId:"claude-opus-4-6",description:"Factory-managed Claude Opus 4.6"},{alias:"claude-opus-4-6-fast",modelId:"claude-opus-4-6-fast",description:"Factory-managed Claude Opus 4.6 Fast Mode"},{alias:"claude-opus-4-5",modelId:"claude-opus-4-5-20251101",description:"Factory-managed Claude Opus 4.5"},{alias:"claude-sonnet-4-5",modelId:"claude-sonnet-4-5-20250929",description:"Factory-managed Claude Sonnet 4.5"},{alias:"claude-haiku-4-5",modelId:"claude-haiku-4-5-20251001",description:"Factory-managed Claude Haiku 4.5"},{alias:"gpt-5.5",modelId:"gpt-5.5",description:"Factory-managed GPT-5.5"},{alias:"gpt-5.5-fast",modelId:"gpt-5.5-fast",description:"Factory-managed GPT-5.5 Fast Mode"},{alias:"gpt-5.5-pro",modelId:"gpt-5.5-pro",description:"Factory-managed GPT-5.5 Pro"},{alias:"gpt-5.4",modelId:"gpt-5.4",description:"Factory-managed GPT-5.4"},{alias:"gpt-5.4-fast",modelId:"gpt-5.4-fast",description:"Factory-managed GPT-5.4 Fast Mode"},{alias:"gpt-5.4-mini",modelId:"gpt-5.4-mini",description:"Factory-managed GPT-5.4 Mini"},{alias:"gpt-5.3-codex",modelId:"gpt-5.3-codex",description:"Factory-managed GPT-5.3-Codex"},{alias:"gpt-5.3-codex-fast",modelId:"gpt-5.3-codex-fast",description:"Factory-managed GPT-5.3-Codex Fast"},{alias:"gpt-5.2",modelId:"gpt-5.2",description:"Factory-managed GPT-5.2"},{alias:"gpt-5.2-codex",modelId:"gpt-5.2-codex",description:"Factory-managed GPT-5.2-Codex"},{alias:"gemini-3.1-pro-preview",modelId:"gemini-3.1-pro-preview",description:"Factory-managed Gemini 3.1 Pro"},{alias:"gemini-3-pro-preview",modelId:"gemini-3-pro-preview",description:"Factory-managed Gemini 3 Pro"},{alias:"gemini-3-flash-preview",modelId:"gemini-3-flash-preview",description:"Factory-managed Gemini 3 Flash"},{alias:"kimi-k2.6",modelId:"kimi-k2.6",description:"Factory-managed Droid Core Kimi K2.6"},{alias:"kimi-k2.5",modelId:"kimi-k2.5",description:"Factory-managed Droid Core Kimi K2.5"},{alias:"deepseek-v4-pro",modelId:"deepseek-v4-pro",description:"Factory-managed Droid Core DeepSeek V4 Pro"},{alias:"minimax-m2.7",modelId:"minimax-m2.7",description:"Factory-managed Droid Core MiniMax M2.7"},{alias:"minimax-m2.5",modelId:"minimax-m2.5",description:"Factory-managed Droid Core MiniMax M2.5"},{alias:"glm-5.1",modelId:"glm-5.1",description:"Factory-managed Droid Core GLM-5.1"}],systemPromptFile:"AGENTS.md",mcpConfig:{settingsDir:"~/.factory",filename:"mcp.json",format:"json"},skillsConfig:{sourceDir:"/home/user/.evolve/skills",targetDir:"/home/user/.factory/skills"},skipApiKeyEnvInGateway:true,gatewayModelAliases:{"kimi-k2.6":"moonshot/kimi-k2.6","kimi-k2.5":"moonshot/kimi-k2.5","deepseek-v4-pro":"deepseek/deepseek-v4-pro","minimax-m2.7":"minimax/minimax-m2.7","minimax-m2.5":"minimax/minimax-m2.5","glm-5.1":"openrouter/z-ai/glm-5.1"},droidGatewaySettings:{settingsPath:"~/.factory/evolve-settings.json",displayName:"Evolve Gateway",provider:"generic-chat-completion-api",maxOutputTokens:32768},checkpointDirs:["~/.factory"],buildCommand:({prompt:t,model:e,isResume:n,sessionId:r,reasoningEffort:s,isDirectMode:a})=>{let o=a?"":"--settings /home/user/.factory/evolve-settings.json ",c=a?e:"custom:Evolve-Gateway-0",l=s?` --reasoning-effort ${s}`:"",d=n&&r?`--session-id ${ke(r)} `:"";return `printf '%s' ${ke(t)} | droid ${o}exec ${d}--skip-permissions-unsafe --cwd /home/user/workspace --output-format stream-json --model ${ke(c)}${l}`}}};function D(t){let e=Qe[t];if(!e)throw new Error(`Unknown agent type: ${t}`);return e}function $r(t){return t in Qe}function V(t){return t.replace(/^~/,"/home/user")}function ke(t){return `'${t.replace(/'/g,"'\\''")}'`}function U(t){let e=D(t);return `${V(e.mcpConfig.settingsDir)}/${e.mcpConfig.filename}`}function B(t){let e=D(t);return V(e.mcpConfig.settingsDir)}function A(t){if(t instanceof Error){let e=t.message.toLowerCase();return e.includes("not found")||e.includes("enoent")||e.includes("no such file")||e.includes("does not exist")}return false}function Ze(t,e){let n=[e.command,e.url].filter(Boolean);if(n.length===0)throw new Error(`MCP server "${t}" must specify command or url`);if(n.length>1)throw new Error(`MCP server "${t}" cannot specify both command and url`)}function re(t){for(let[e,n]of Object.entries(t))Ze(e,n);}function ie(t){return t.type?t.type:t.command?"stdio":"sse"}function Dr(t){let e=ie(t);return {...t,type:e}}function Ur(t){let{type:e,url:n,...r}=t;return ie(t)==="http"&&n?{httpUrl:n,...r}:n?{url:n,...r}:r}function Br(t){return {type:ie(t),...t}}function Lr(t){let{type:e,...n}=t;return n.command?{...n,transport:"stdio"}:n.url&&(e==="http"||e==="sse")?{...n,transport:e}:n}function Fr(t){let e=ie(t),{type:n,httpHeaders:r,envHttpHeaders:s,bearerTokenEnvVar:a,envVars:o,...c}=t;if(e==="stdio"&&t.command)return {type:"stdio",...c};if(t.url){let l={...c,type:e==="sse"?"sse":"http",url:t.url},d=t.headers??r;return d&&Object.keys(d).length>0&&(l.headers=d),l}return {type:e==="stdio"?"stdio":"http",...c}}async function Xe(t,e,n,r){re(n);let s=B(e),a=U(e);await t.files.makeDir(s);let o={};try{let l=await t.files.read(a);typeof l=="string"&&(o=JSON.parse(l));}catch(l){if(!A(l))throw l}let c=Object.fromEntries(Object.entries(n).map(([l,d])=>[l,r(d)]));await t.files.write(a,JSON.stringify({...o,mcpServers:c},null,2));}async function Se(t,e,n){re(n);let r=B("claude"),s=U("claude"),a=Object.fromEntries(Object.entries(n).map(([c,l])=>[c,Br(l)]));await t.files.write(`${e}/.mcp.json`,JSON.stringify({mcpServers:a},null,2)),await t.files.makeDir(r);let o={};try{let c=await t.files.read(s);typeof c=="string"&&(o=JSON.parse(c));}catch(c){if(!A(c))throw c}o.enableAllProjectMcpServers=true,await t.files.write(s,JSON.stringify(o,null,2));}async function xe(t,e){await Xe(t,"gemini",e,Dr);}async function Ce(t,e){await Xe(t,"qwen",e,Ur);}async function _e(t,e,n,r){let s=B(e),a=U(e);await t.files.makeDir(s);let o={};try{let p=await t.files.read(a);typeof p=="string"&&(o=JSON.parse(p));}catch(p){if(!A(p))throw p}let c=n.split("."),l=o;for(let p=0;p<c.length-1;p++){let u=c[p];(typeof l[u]!="object"||l[u]===null)&&(l[u]={}),l=l[u];}let d=c[c.length-1],i=typeof l[d]=="object"&&l[d]!==null?l[d]:{};l[d]={...i,...r},await t.files.write(a,JSON.stringify(o,null,2));}async function et(t,e){let n=B("qwen"),r=U("qwen");await t.files.makeDir(n);let s={};try{let l=await t.files.read(r);typeof l=="string"&&(s=JSON.parse(l));}catch(l){if(!A(l))throw l}let a=s.model??{},o=a.generationConfig??{},c=o.extra_body??{};s.model={...a,generationConfig:{...o,extra_body:{...c,enable_thinking:e}}},await t.files.write(r,JSON.stringify(s,null,2));}async function tt(t,e){await Xe(t,"kimi",e,Lr);}async function Ee(t,e,n){re(n);let r=`${e}/.factory`,s=`${r}/mcp.json`;await t.files.makeDir(r);let a={};try{let c=await t.files.read(s);typeof c=="string"&&(a=JSON.parse(c));}catch(c){if(!A(c))throw c}let o=Object.fromEntries(Object.entries(n).map(([c,l])=>[c,Fr(l)]));await t.files.write(s,JSON.stringify({...a,mcpServers:o},null,2));}async function Re(t,e,n){let r=V(e.settingsPath),s=r.slice(0,r.lastIndexOf("/"));await t.files.makeDir(s);let a={cloudSessionSync:false,customModels:[{model:e.model,displayName:e.displayName,baseUrl:e.baseUrl,apiKey:`\${${e.apiKeyEnv}}`,provider:e.provider,...e.maxOutputTokens!==void 0&&{maxOutputTokens:e.maxOutputTokens},extraHeaders:n}]};await t.files.write(r,JSON.stringify(a,null,2));}async function nt(t,e,n){re(n);let r=`${e}/opencode.json`,s={};try{let o=await t.files.read(r);typeof o=="string"&&(s=JSON.parse(o));}catch(o){if(!A(o))throw o}let a=Object.fromEntries(Object.entries(n).map(([o,c])=>[o,Nr(c)]));await t.files.write(r,JSON.stringify({...s,mcp:a},null,2));}function Nr(t){let e=ie(t);if(e==="stdio"&&t.command){let r={type:"local",command:t.args?[t.command,...t.args]:[t.command]};return t.env&&Object.keys(t.env).length>0&&(r.environment=t.env),r}if(t.url){let n={type:"remote",url:t.url};return t.headers&&Object.keys(t.headers).length>0&&(n.headers=t.headers),n}return {type:e==="stdio"?"local":"remote",...t}}function G(t=""){let e=process.env.EVOLVE_GATEWAY_URL||"https://swarmkit-gateway-692833842999.us-central1.run.app";if(!t)return e;let n=t.startsWith("/")?t:`/${t}`;return `${e}${n}`}function Te(t=""){let e=process.env.EVOLVE_DASHBOARD_URL||_;if(!t)return e;let n=t.startsWith("/")?t:`/${t}`;return `${e.replace(/\/$/,"")}${n}`}function rt(){return Te("/api/managed/e2b")}function zt(t){return {"browser-use":{type:"http",url:G("/browser_use/mcp"),headers:{"x-litellm-api-key":`Bearer ${t}`}}}}var T="EVOLVE_API_KEY",Pe="E2B_API_KEY",Ie="DAYTONA_API_KEY",Oe="MODAL_TOKEN_ID",it="MODAL_TOKEN_SECRET",Jt="claude",se=36e5,Ht=4,st=100,qt="/home/user/workspace",_=process.env.EVOLVE_DASHBOARD_URL||"https://dashboard.evolvingmachines.ai",O="x-litellm-customer-id",L="x-litellm-tags",W="run:",Yt=".evolve-sdk/observability/sessions",Qt=100,Zt=5e3,Ae=3,ot=1e3;function E(t){return typeof t=="string"?`"${t.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`:Array.isArray(t)?`[${t.map(e=>E(e)).join(", ")}]`:typeof t=="object"&&t!==null?`{ ${Object.entries(t).map(([n,r])=>`${n} = ${E(r)}`).join(", ")} }`:typeof t=="boolean"?t?"true":"false":String(t)}async function Me(t,e){for(let[l,d]of Object.entries(e))Ze(l,d);let n=B("codex"),r=U("codex");await t.files.makeDir(n);let s="";try{let l=await t.files.read(r);typeof l=="string"&&(s=l);}catch(l){if(!A(l))throw l}let a=[],o=[];s.includes("experimental_use_rmcp_client")||(a.push("# Enable improved RMCP client (recommended)"),a.push("experimental_use_rmcp_client = true")),s.includes("[mcp_servers]")||o.push("[mcp_servers]","");for(let[l,d]of Object.entries(e)){if(s.includes(`[mcp_servers.${l}]`))continue;o.push(`[mcp_servers.${l}]`);let i=d.type??(d.command?"stdio":"http");if(i==="http"||i==="sse"||!!d.url){if(!d.url)throw new Error(`MCP server "${l}" is missing url for ${i} transport`);o.push(`url = ${E(d.url)}`),d.bearerTokenEnvVar&&o.push(`bearer_token_env_var = ${E(d.bearerTokenEnvVar)}`);let u=d.httpHeaders??d.headers;u&&Object.keys(u).length>0&&o.push(`http_headers = ${E(u)}`),d.envHttpHeaders&&Object.keys(d.envHttpHeaders).length>0&&o.push(`env_http_headers = ${E(d.envHttpHeaders)}`);}else o.push(`command = ${E(d.command)}`),d.args&&d.args.length>0&&o.push(`args = ${E(d.args)}`),d.cwd&&o.push(`cwd = ${E(d.cwd)}`);d.env&&Object.keys(d.env).length>0&&o.push(`env = ${E(d.env)}`),d.envVars&&d.envVars.length>0&&o.push(`env_vars = ${E(d.envVars)}`),o.push("");}let c=[s.trim(),a.join(`
|
|
2
|
-
`),
|
|
3
|
-
`)].filter(
|
|
1
|
+
import {w,o,p,n,g,s,m,h,c,e,d,f,i,j as j$1,k,l,r,q as q$1,a,t,v,u,b,x as x$1,y,z as z$1,A as A$1}from'./chunk-IHBQMTA4.js';export{D as EvolveApiError,B as HOSTED_ERROR_CODES,c as MANAGED_SANDBOX_PROVIDERS,E as NoActiveVersionError,F as benchmarks,G as customHarnesses,I as hosted,C as isHostedErrorCode,H as jobs,J as meta}from'./chunk-IHBQMTA4.js';import {EventEmitter}from'events';import Do from'ajv';import {randomBytes,randomUUID,publicEncrypt,constants,createHash}from'crypto';import ps from'zod-to-json-schema';import*as B from'fs';import {createWriteStream}from'fs';import*as fe from'path';import {join,posix,dirname,isAbsolute,normalize,resolve,relative}from'path';import {mkdir,appendFile,rm,readFile,writeFile,unlink,copyFile}from'fs/promises';import {homedir,tmpdir}from'os';import {exec,execFile}from'child_process';import {promisify}from'util';import {z}from'zod';export{E2BProvider,createE2BProvider}from'@evolvingmachines/e2b';export{DaytonaProvider,createDaytonaProvider}from'@evolvingmachines/daytona';export{ModalProvider,createModalProvider}from'@evolvingmachines/modal';import {Readable}from'stream';import {pipeline}from'stream/promises';var Ii={CLAUDE:"claude",CODEX:"codex",GEMINI:"gemini",QWEN:"qwen",KIMI:"kimi",OPENCODE:"opencode",DROID:"droid"},vt={strict:{coerceTypes:false,removeAdditional:false,useDefaults:false,allErrors:true},loose:{coerceTypes:"array",removeAdditional:false,useDefaults:true,allErrors:true}};function de(t){return t!=="off"&&t!=="none"&&t!=="minimal"&&t!=="no-thinking"}function bt(t){if(!(t==="off"||t==="none"||t==="no-thinking"))return !t||t==="thinking"||t==="medium"?"medium":t==="low"||t==="minimal"?"minimal":t==="xhigh"?"max":t}function Oi(t){let e=bt(t);return e?` --variant ${e} --thinking`:""}var St={claude:{image:"evolve-all",apiKeyEnv:"ANTHROPIC_API_KEY",oauthEnv:"CLAUDE_CODE_OAUTH_TOKEN",baseUrlEnv:"ANTHROPIC_BASE_URL",customHeadersEnv:"ANTHROPIC_CUSTOM_HEADERS",defaultModel:"opus",models:[{alias:"fable",modelId:"claude-fable-5",description:"Highest capability, long-horizon agentic work"},{alias:"opus",modelId:"claude-opus-4-8",description:"Complex reasoning, R&D, architecting"},{alias:"sonnet",modelId:"claude-sonnet-4-6",description:"Daily coding, features, tests"},{alias:"haiku",modelId:"claude-haiku-4-5-20251001",description:"Quick tasks, syntax correction"},{alias:"opus[1m]",modelId:"opus[1m]",description:"Complex reasoning with 1M context window"},{alias:"sonnet[1m]",modelId:"sonnet[1m]",description:"Daily coding with 1M context window"}],systemPromptFile:"CLAUDE.md",mcpConfig:{settingsDir:"~/.claude",filename:"settings.json",format:"json",projectConfig:true},skillsConfig:{sourceDir:"~/.evolve/skills",targetDir:"~/.claude/skills"},buildCommand:({prompt:t,model:e,isResume:n,reasoningEffort:r})=>{let i=n?"--continue ":"",o=r?` --effort ${r}`:"";return `echo "${t}" | claude -p ${i}--model ${e}${o} --output-format stream-json --verbose --dangerously-skip-permissions`}},codex:{image:"evolve-all",apiKeyEnv:"OPENAI_API_KEY",oauthEnv:"CODEX_OAUTH_FILE_PATH",oauthFileName:"auth.json",baseUrlEnv:"OPENAI_BASE_URL",defaultModel:"gpt-5.4",models:[{alias:"gpt-5.5",modelId:"gpt-5.5",description:"Newest frontier model"},{alias:"gpt-5.4",modelId:"gpt-5.4",description:"Flagship for professional work"},{alias:"gpt-5.4-mini",modelId:"gpt-5.4-mini",description:"Fast, efficient mini model"},{alias:"gpt-5.3-codex",modelId:"gpt-5.3-codex",description:"Industry-leading code-optimized"},{alias:"gpt-5.2",modelId:"gpt-5.2",description:"Previous general-purpose model"}],systemPromptFile:"AGENTS.md",mcpConfig:{settingsDir:"~/.codex",filename:"config.toml",format:"toml"},skillsConfig:{sourceDir:"~/.evolve/skills",targetDir:"~/.codex/skills"},spendTrackingEnvs:{sessionTagEnv:"EVOLVE_LITELLM_CUSTOMER_ID",runTagEnv:"EVOLVE_LITELLM_TAGS"},setupCommand:`printf '%s\\n' "$OPENAI_API_KEY" | codex login --with-api-key`,buildCommand:({prompt:t,model:e,isResume:n,reasoningEffort:r})=>{let i=r?` -c model_reasoning_effort="${r}"`:"";return `printf '%s' "${t}" | codex exec --model ${e}${i} --dangerously-bypass-approvals-and-sandbox --skip-git-repo-check --json${n?" resume --last":""}`}},gemini:{image:"evolve-all",apiKeyEnv:"GEMINI_API_KEY",oauthEnv:"GEMINI_OAUTH_FILE_PATH",oauthFileName:"oauth_creds.json",oauthActivationEnv:{key:"GOOGLE_GENAI_USE_GCA",value:"true"},baseUrlEnv:"GOOGLE_GEMINI_BASE_URL",defaultModel:"gemini-3.1-pro-preview",models:[{alias:"gemini-3.1-pro-preview",modelId:"gemini-3.1-pro-preview",description:"Latest pro, complex agentic + coding"},{alias:"gemini-3.1-flash-lite-preview",modelId:"gemini-3.1-flash-lite-preview",description:"Cost-efficient, low latency"},{alias:"gemini-3.5-flash",modelId:"gemini-3.5-flash",description:"Latest Flash model"},{alias:"gemini-3-flash-preview",modelId:"gemini-3-flash-preview",description:"Frontier flash performance"},{alias:"gemini-2.5-pro",modelId:"gemini-2.5-pro",description:"Complex tasks, deep reasoning"},{alias:"gemini-2.5-flash",modelId:"gemini-2.5-flash",description:"Balance speed/reasoning"},{alias:"gemini-2.5-flash-lite",modelId:"gemini-2.5-flash-lite",description:"Simple tasks, fastest"}],systemPromptFile:"GEMINI.md",mcpConfig:{settingsDir:"~/.gemini",filename:"settings.json",format:"json"},skillsConfig:{sourceDir:"~/.evolve/skills",targetDir:"~/.gemini/skills"},customHeadersEnv:"GEMINI_CLI_CUSTOM_HEADERS",customHeadersFormat:"comma",gatewayPath:"/gemini",buildCommand:({prompt:t,model:e,isResume:n})=>`gemini ${n?"--resume latest ":""}--prompt ${le(t)} --model ${e} --yolo --output-format stream-json`},qwen:{image:"evolve-all",apiKeyEnv:"OPENAI_API_KEY",baseUrlEnv:"OPENAI_BASE_URL",defaultModel:"qwen3.7-max",models:[{alias:"qwen3.7-max",modelId:"qwen3.7-max",description:"Strongest reasoning and coding option"},{alias:"qwen3.7-plus",modelId:"qwen3.7-plus",description:"Latest balanced Qwen Cloud recommendation"},{alias:"qwen3.6-flash",modelId:"qwen3.6-flash",description:"Fast and cost-effective option"},{alias:"qwen3.6-plus",modelId:"qwen3.6-plus",description:"Compatibility model used in Qwen Code examples"}],systemPromptFile:"QWEN.md",mcpConfig:{settingsDir:"~/.qwen",filename:"settings.json",format:"json"},skillsConfig:{sourceDir:"~/.evolve/skills",targetDir:"~/.qwen/skills"},spendTrackingJsonConfig:{headersPath:"model.generationConfig.customHeaders"},gatewayModelAliases:{"qwen3.7-max":"dashscope/qwen3.7-max","qwen3.7-plus":"dashscope/qwen3.7-plus","qwen3.6-flash":"dashscope/qwen3.6-flash","qwen3.6-plus":"dashscope/qwen3.6-plus"},defaultBaseUrl:"https://dashscope-intl.aliyuncs.com/compatible-mode/v1",buildCommand:({prompt:t,model:e,isResume:n,isDirectMode:r})=>{let i=n?"--continue ":"",o=r||e.startsWith("dashscope/")?e:`dashscope/${e}`;return `qwen "${t}" ${i}--auth-type openai --model ${o} --yolo --output-format stream-json`}},kimi:{image:"evolve-all",apiKeyEnv:"KIMI_API_KEY",baseUrlEnv:"KIMI_BASE_URL",defaultModel:"kimi-k2.6",models:[{alias:"kimi-k2.6",modelId:"moonshot/kimi-k2.6",description:"Latest: long-horizon coding, swarm orchestration"},{alias:"kimi-k2p6-raptor",modelId:"kimi-k2p6-raptor",description:"Evolve-managed Kimi K2.6 Raptor route for latency-sensitive agent runs"},{alias:"kimi-k2p7-code-raptor",modelId:"kimi-k2p7-code-raptor",description:"Evolve-managed Kimi K2.7 Code Raptor route for latency-sensitive agent runs"},{alias:"kimi-k2.5",modelId:"moonshot/kimi-k2.5",description:"Previous multimodal flagship"}],systemPromptFile:"AGENTS.md",mcpConfig:{settingsDir:"~/.kimi-code",filename:"mcp.json",format:"json"},skillsConfig:{sourceDir:"~/.evolve/skills",targetDir:"~/.kimi-code/skills"},defaultBaseUrl:"https://api.moonshot.ai/v1",spendTrackingTomlProvider:{configPath:"~/.kimi-code/config.toml",providerName:"evolve-gateway",modelName:"evolve-default",maxContextSize:262144},checkpointExcludes:[".kimi-code/config.toml"],gatewayModelAliases:{"kimi-k2.6":"moonshot/kimi-k2.6","kimi-k2p6-raptor":"kimi-k2p6-raptor","kimi-k2p7-code-raptor":"kimi-k2p7-code-raptor","kimi-k2.5":"moonshot/kimi-k2.5"},buildCommand:({prompt:t,isResume:e,reasoningEffort:n,homeDir:r=q$1})=>{let i=e?"--continue ":"",o=le(t),c=`--config-file ${r}/.kimi-code/config.toml`,a=`$(if [ -f ${r}/.kimi-code/mcp.json ]; then printf ' --mcp-config-file ${r}/.kimi-code/mcp.json'; fi)`,l=de(n)?"":" --no-thinking";return `if kimi --help 2>&1 | grep -q -- '--print'; then kimi --print ${i}${c}${a}${l} -p ${o} --output-format stream-json; else kimi ${i}-p ${o} --output-format stream-json; fi`}},opencode:{image:"evolve-all",apiKeyEnv:"OPENROUTER_API_KEY",baseUrlEnv:"OPENAI_BASE_URL",defaultModel:"openrouter/anthropic/claude-sonnet-4.6",providerEnvMap:{openrouter:{keyEnv:"OPENROUTER_API_KEY"}},gatewayConfigEnv:"OPENCODE_CONFIG_CONTENT",models:[{alias:"openrouter/anthropic/claude-fable-5",modelId:"openrouter/anthropic/claude-fable-5",description:"Anthropic Fable via OpenRouter"},{alias:"openrouter/anthropic/claude-sonnet-4.6",modelId:"openrouter/anthropic/claude-sonnet-4.6",description:"Anthropic Sonnet via OpenRouter"},{alias:"openrouter/anthropic/claude-opus-4.8",modelId:"openrouter/anthropic/claude-opus-4.8",description:"Anthropic Opus via OpenRouter"},{alias:"openrouter/anthropic/claude-haiku-4.5",modelId:"openrouter/anthropic/claude-haiku-4.5",description:"Anthropic Haiku via OpenRouter"},{alias:"openrouter/openai/gpt-5.5",modelId:"openrouter/openai/gpt-5.5",description:"OpenAI GPT-5.5 via OpenRouter"},{alias:"openrouter/openai/gpt-5.4",modelId:"openrouter/openai/gpt-5.4",description:"OpenAI GPT-5.4 via OpenRouter"},{alias:"openrouter/openai/gpt-5.4-mini",modelId:"openrouter/openai/gpt-5.4-mini",description:"OpenAI GPT-5.4 Mini via OpenRouter"},{alias:"openrouter/openai/gpt-5.3-codex",modelId:"openrouter/openai/gpt-5.3-codex",description:"OpenAI Codex via OpenRouter"},{alias:"openrouter/openai/gpt-5.2",modelId:"openrouter/openai/gpt-5.2",description:"OpenAI GPT-5.2 via OpenRouter"},{alias:"openrouter/google/gemini-3.1-pro-preview",modelId:"openrouter/google/gemini-3.1-pro-preview",description:"Gemini 3.1 Pro via OpenRouter"},{alias:"openrouter/google/gemini-3.5-flash",modelId:"openrouter/google/gemini-3.5-flash",description:"Gemini 3.5 Flash via OpenRouter"},{alias:"openrouter/google/gemini-3-flash-preview",modelId:"openrouter/google/gemini-3-flash-preview",description:"Gemini 3 Flash via OpenRouter"},{alias:"openrouter/qwen/qwen3-coder-next",modelId:"openrouter/qwen/qwen3-coder-next",description:"Qwen Coder Next via OpenRouter"},{alias:"openrouter/qwen/qwen3-coder-plus",modelId:"openrouter/qwen/qwen3-coder-plus",description:"Qwen Coder via OpenRouter"},{alias:"openrouter/moonshotai/kimi-k2.6",modelId:"openrouter/moonshotai/kimi-k2.6",description:"Kimi K2.6 via OpenRouter"},{alias:"openrouter/moonshotai/kimi-k2.5",modelId:"openrouter/moonshotai/kimi-k2.5",description:"Kimi K2.5 via OpenRouter"},{alias:"openrouter/z-ai/glm-5",modelId:"openrouter/z-ai/glm-5",description:"Zhipu GLM-5 via OpenRouter"}],systemPromptFile:"AGENTS.md",mcpConfig:{settingsDir:".",filename:"opencode.json",format:"json"},skillsConfig:{sourceDir:"~/.evolve/skills",targetDir:"~/.agents/skills"},checkpointDirs:["~/.local/share/opencode","~/.config/opencode","~/.local/state/opencode"],buildCommand:({prompt:t,model:e,isResume:n,isDirectMode:r,isExternalGateway:i,reasoningEffort:o})=>{let c=n?"--continue ":"",a=Oi(o);if(i)return `OPENCODE_PERMISSION='{"*":"allow"}' opencode run ${c}--model litellm/${e} --format json${a} "${t}" < /dev/null`;let l=e.startsWith("openrouter/")?e:`openrouter/${e}`;return r?`OPENCODE_PERMISSION='{"*":"allow"}' opencode run ${c}--model ${l} --format json${a} "${t}" < /dev/null`:`OPENCODE_PERMISSION='{"*":"allow"}' opencode run ${c}--model litellm/${l} --format json${a} "${t}" < /dev/null`}},droid:{image:"evolve-all",apiKeyEnv:"FACTORY_API_KEY",defaultModel:"gpt-5.5",models:[{alias:"claude-opus-4-8",modelId:"claude-opus-4-8",description:"Factory-managed Claude Opus 4.8"},{alias:"claude-opus-4-8-fast",modelId:"claude-opus-4-8-fast",description:"Factory-managed Claude Opus 4.8 Fast Mode"},{alias:"claude-sonnet-4-6",modelId:"claude-sonnet-4-6",description:"Factory-managed Claude Sonnet 4.6"},{alias:"claude-opus-4-6",modelId:"claude-opus-4-6",description:"Factory-managed Claude Opus 4.6"},{alias:"claude-opus-4-6-fast",modelId:"claude-opus-4-6-fast",description:"Factory-managed Claude Opus 4.6 Fast Mode"},{alias:"claude-opus-4-5",modelId:"claude-opus-4-5-20251101",description:"Factory-managed Claude Opus 4.5"},{alias:"claude-sonnet-4-5",modelId:"claude-sonnet-4-5-20250929",description:"Factory-managed Claude Sonnet 4.5"},{alias:"claude-haiku-4-5",modelId:"claude-haiku-4-5-20251001",description:"Factory-managed Claude Haiku 4.5"},{alias:"gpt-5.5",modelId:"gpt-5.5",description:"Factory-managed GPT-5.5"},{alias:"gpt-5.5-fast",modelId:"gpt-5.5-fast",description:"Factory-managed GPT-5.5 Fast Mode"},{alias:"gpt-5.5-pro",modelId:"gpt-5.5-pro",description:"Factory-managed GPT-5.5 Pro"},{alias:"gpt-5.4",modelId:"gpt-5.4",description:"Factory-managed GPT-5.4"},{alias:"gpt-5.4-fast",modelId:"gpt-5.4-fast",description:"Factory-managed GPT-5.4 Fast Mode"},{alias:"gpt-5.4-mini",modelId:"gpt-5.4-mini",description:"Factory-managed GPT-5.4 Mini"},{alias:"gpt-5.3-codex",modelId:"gpt-5.3-codex",description:"Factory-managed GPT-5.3-Codex"},{alias:"gpt-5.3-codex-fast",modelId:"gpt-5.3-codex-fast",description:"Factory-managed GPT-5.3-Codex Fast"},{alias:"gpt-5.2",modelId:"gpt-5.2",description:"Factory-managed GPT-5.2"},{alias:"gpt-5.2-codex",modelId:"gpt-5.2-codex",description:"Factory-managed GPT-5.2-Codex"},{alias:"gemini-3.1-pro-preview",modelId:"gemini-3.1-pro-preview",description:"Factory-managed Gemini 3.1 Pro"},{alias:"gemini-3-pro-preview",modelId:"gemini-3-pro-preview",description:"Factory-managed Gemini 3 Pro"},{alias:"gemini-3-flash-preview",modelId:"gemini-3-flash-preview",description:"Factory-managed Gemini 3 Flash"},{alias:"kimi-k2.6",modelId:"kimi-k2.6",description:"Factory-managed Droid Core Kimi K2.6"},{alias:"kimi-k2.5",modelId:"kimi-k2.5",description:"Factory-managed Droid Core Kimi K2.5"},{alias:"deepseek-v4-pro",modelId:"deepseek-v4-pro",description:"Factory-managed Droid Core DeepSeek V4 Pro"},{alias:"minimax-m2.7",modelId:"minimax-m2.7",description:"Factory-managed Droid Core MiniMax M2.7"},{alias:"minimax-m2.5",modelId:"minimax-m2.5",description:"Factory-managed Droid Core MiniMax M2.5"},{alias:"glm-5.1",modelId:"glm-5.1",description:"Factory-managed Droid Core GLM-5.1"}],systemPromptFile:"AGENTS.md",mcpConfig:{settingsDir:"~/.factory",filename:"mcp.json",format:"json"},skillsConfig:{sourceDir:"~/.evolve/skills",targetDir:"~/.factory/skills"},skipApiKeyEnvInGateway:true,gatewayModelAliases:{"kimi-k2.6":"moonshot/kimi-k2.6","kimi-k2.5":"moonshot/kimi-k2.5","deepseek-v4-pro":"deepseek/deepseek-v4-pro","minimax-m2.7":"minimax/minimax-m2.7","minimax-m2.5":"minimax/minimax-m2.5","glm-5.1":"openrouter/z-ai/glm-5.1"},droidGatewaySettings:{settingsPath:"~/.factory/evolve-settings.json",displayName:"Evolve Gateway",provider:"generic-chat-completion-api",maxOutputTokens:32768},checkpointDirs:["~/.factory"],buildCommand:({prompt:t,model:e,isResume:n,sessionId:r,reasoningEffort:i,isDirectMode:o,isExternalGateway:c,homeDir:a=q$1})=>{let l=!o||c,d=l?`--settings ${a}/.factory/evolve-settings.json `:"",s=l?"custom:Evolve-Gateway-0":e,p=i?` --reasoning-effort ${i}`:"",u=n&&r?`--session-id ${le(r)} `:"";return `printf '%s' ${le(t)} | droid ${d}exec ${u}--skip-permissions-unsafe --cwd ${a}/workspace --output-format stream-json --model ${le(s)}${p}`}}};function D(t){let e=St[t];if(!e)throw new Error(`Unknown agent type: ${t}`);return e}function Ai(t){return t in St}function O(t,e=q$1){return t.replace(/^~/,e)}function le(t){return `'${t.replace(/'/g,"'\\''")}'`}function F(t,e=q$1){let n=D(t);return `${O(n.mcpConfig.settingsDir,e)}/${n.mcpConfig.filename}`}function K(t,e=q$1){let n=D(t);return O(n.mcpConfig.settingsDir,e)}function $(t){if(t instanceof Error){let e=t.message.toLowerCase();return e.includes("not found")||e.includes("enoent")||e.includes("no such file")||e.includes("does not exist")}return false}function kt(t,e){let n=[e.command,e.url].filter(Boolean);if(n.length===0)throw new Error(`MCP server "${t}" must specify command or url`);if(n.length>1)throw new Error(`MCP server "${t}" cannot specify both command and url`)}function pe(t){for(let[e,n]of Object.entries(t))kt(e,n);}function ue(t){return t.type?t.type:t.command?"stdio":"sse"}function Mi(t){let e=ue(t);return {...t,type:e}}function Di(t){let{type:e,url:n,...r}=t;return ue(t)==="http"&&n?{httpUrl:n,...r}:n?{url:n,...r}:r}function $i(t){return {type:ue(t),...t}}function Ui(t){let{type:e,...n}=t;return n.command?{...n,transport:"stdio"}:n.url&&(e==="http"||e==="sse")?{...n,transport:e}:n}function Bi(t){let e=ue(t),{type:n,httpHeaders:r,envHttpHeaders:i,bearerTokenEnvVar:o,envVars:c,...a}=t;if(e==="stdio"&&t.command)return {type:"stdio",...a};if(t.url){let l={...a,type:e==="sse"?"sse":"http",url:t.url},d=t.headers??r;return d&&Object.keys(d).length>0&&(l.headers=d),l}return {type:e==="stdio"?"stdio":"http",...a}}async function xt(t,e,n,r,i){pe(n);let o=K(e,i),c=F(e,i);await t.files.makeDir(o);let a={};try{let d=await t.files.read(c);typeof d=="string"&&(a=JSON.parse(d));}catch(d){if(!$(d))throw d}let l=Object.fromEntries(Object.entries(n).map(([d,s])=>[d,r(s)]));await t.files.write(c,JSON.stringify({...a,mcpServers:l},null,2));}async function Le(t,e,n,r){pe(n);let i=K("claude",r),o=F("claude",r),c=Object.fromEntries(Object.entries(n).map(([l,d])=>[l,$i(d)]));await t.files.write(`${e}/.mcp.json`,JSON.stringify({mcpServers:c},null,2)),await t.files.makeDir(i);let a={};try{let l=await t.files.read(o);typeof l=="string"&&(a=JSON.parse(l));}catch(l){if(!$(l))throw l}a.enableAllProjectMcpServers=true,await t.files.write(o,JSON.stringify(a,null,2));}async function Ne(t,e,n){await xt(t,"gemini",e,Mi,n);}async function Fe(t,e,n){await xt(t,"qwen",e,Di,n);}async function Ke(t,e,n,r,i){let o=K(e,i),c=F(e,i);await t.files.makeDir(o);let a={};try{let u=await t.files.read(c);typeof u=="string"&&(a=JSON.parse(u));}catch(u){if(!$(u))throw u}let l=n.split("."),d=a;for(let u=0;u<l.length-1;u++){let g=l[u];(typeof d[g]!="object"||d[g]===null)&&(d[g]={}),d=d[g];}let s=l[l.length-1],p=typeof d[s]=="object"&&d[s]!==null?d[s]:{};d[s]={...p,...r},await t.files.write(c,JSON.stringify(a,null,2));}async function Ct(t,e,n){let r=K("qwen",n),i=F("qwen",n);await t.files.makeDir(r);let o={};try{let d=await t.files.read(i);typeof d=="string"&&(o=JSON.parse(d));}catch(d){if(!$(d))throw d}let c=o.model??{},a=c.generationConfig??{},l=a.extra_body??{};o.model={...c,generationConfig:{...a,extra_body:{...l,enable_thinking:e}}},await t.files.write(i,JSON.stringify(o,null,2));}async function Et(t,e,n){await xt(t,"kimi",e,Ui,n);}async function je(t,e,n){pe(n);let r=`${e}/.factory`,i=`${r}/mcp.json`;await t.files.makeDir(r);let o={};try{let a=await t.files.read(i);typeof a=="string"&&(o=JSON.parse(a));}catch(a){if(!$(a))throw a}let c=Object.fromEntries(Object.entries(n).map(([a,l])=>[a,Bi(l)]));await t.files.write(i,JSON.stringify({...o,mcpServers:c},null,2));}async function Ge(t,e,n,r){let i=O(e.settingsPath,r),o=i.slice(0,i.lastIndexOf("/"));await t.files.makeDir(o);let c={cloudSessionSync:false,customModels:[{model:e.model,displayName:e.displayName,baseUrl:e.baseUrl,apiKey:`\${${e.apiKeyEnv}}`,provider:e.provider,...e.maxOutputTokens!==void 0&&{maxOutputTokens:e.maxOutputTokens},extraHeaders:n}]};await t.files.write(i,JSON.stringify(c,null,2));}async function _t(t,e,n){pe(n);let r=`${e}/opencode.json`,i={};try{let c=await t.files.read(r);typeof c=="string"&&(i=JSON.parse(c));}catch(c){if(!$(c))throw c}let o=Object.fromEntries(Object.entries(n).map(([c,a])=>[c,Li(a)]));await t.files.write(r,JSON.stringify({...i,mcp:o},null,2));}function Li(t){let e=ue(t);if(e==="stdio"&&t.command){let r={type:"local",command:t.args?[t.command,...t.args]:[t.command]};return t.env&&Object.keys(t.env).length>0&&(r.environment=t.env),r}if(t.url){let n={type:"remote",url:t.url};return t.headers&&Object.keys(t.headers).length>0&&(n.headers=t.headers),n}return {type:e==="stdio"?"local":"remote",...t}}function _(t){return typeof t=="string"?`"${t.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`:Array.isArray(t)?`[${t.map(e=>_(e)).join(", ")}]`:typeof t=="object"&&t!==null?`{ ${Object.entries(t).map(([n,r])=>`${n} = ${_(r)}`).join(", ")} }`:typeof t=="boolean"?t?"true":"false":String(t)}async function Ve(t,e,n){for(let[d,s]of Object.entries(e))kt(d,s);let r=K("codex",n),i=F("codex",n);await t.files.makeDir(r);let o="";try{let d=await t.files.read(i);typeof d=="string"&&(o=d);}catch(d){if(!$(d))throw d}let c=[],a=[];o.includes("experimental_use_rmcp_client")||(c.push("# Enable improved RMCP client (recommended)"),c.push("experimental_use_rmcp_client = true")),o.includes("[mcp_servers]")||a.push("[mcp_servers]","");for(let[d,s]of Object.entries(e)){if(o.includes(`[mcp_servers.${d}]`))continue;a.push(`[mcp_servers.${d}]`);let p=s.type??(s.command?"stdio":"http");if(p==="http"||p==="sse"||!!s.url){if(!s.url)throw new Error(`MCP server "${d}" is missing url for ${p} transport`);a.push(`url = ${_(s.url)}`),s.bearerTokenEnvVar&&a.push(`bearer_token_env_var = ${_(s.bearerTokenEnvVar)}`);let g=s.httpHeaders??s.headers;g&&Object.keys(g).length>0&&a.push(`http_headers = ${_(g)}`),s.envHttpHeaders&&Object.keys(s.envHttpHeaders).length>0&&a.push(`env_http_headers = ${_(s.envHttpHeaders)}`);}else a.push(`command = ${_(s.command)}`),s.args&&s.args.length>0&&a.push(`args = ${_(s.args)}`),s.cwd&&a.push(`cwd = ${_(s.cwd)}`);s.env&&Object.keys(s.env).length>0&&a.push(`env = ${_(s.env)}`),s.envVars&&s.envVars.length>0&&a.push(`env_vars = ${_(s.envVars)}`),a.push("");}let l=[o.trim(),c.join(`
|
|
2
|
+
`),a.join(`
|
|
3
|
+
`)].filter(d=>d.length>0);await t.files.write(i,l.join(`
|
|
4
4
|
|
|
5
5
|
`)+`
|
|
6
|
-
`);}async function
|
|
7
|
-
`);if(
|
|
6
|
+
`);}async function ze(t$1,e,n,r={},i){let o=K("codex",i),c=F("codex",i);await t$1.files.makeDir(o);let a="";try{let b=await t$1.files.read(c);typeof b=="string"&&(a=b);}catch(b){if(!$(b))throw b}let l=a.search(/^\[/m),d=l>=0?a.slice(0,l):a,s=l>=0?a.slice(l):"",p=a.includes("[model_providers.evolve-gateway]"),u$1=/^model_provider\s*=\s*"evolve-gateway"/m.test(d),g={...n?{[t]:n.sessionTagEnv,[u]:n.runTagEnv}:{},...r},f=["[model_providers.evolve-gateway]",'name = "Evolve Gateway"',`base_url = ${_(e)}`,'env_key = "OPENAI_API_KEY"','wire_api = "responses"',...Object.keys(g).length>0?[`env_http_headers = ${_(g)}`]:[]].join(`
|
|
7
|
+
`);if(p&&u$1&&a.includes(f))return;a=(d.replace(/^model_provider\s*=\s*.*$/m,"").replace(/\n{3,}/g,`
|
|
8
8
|
|
|
9
|
-
`)+
|
|
9
|
+
`)+s).replace(/\n?\[model_providers\.evolve-gateway\][\s\S]*?(?=\n\[|\s*$)/,"").replace(/^\n+/,"");let h='model_provider = "evolve-gateway"',y=f,w;if(!a.trim())w=y?`${h}
|
|
10
10
|
|
|
11
|
-
${
|
|
12
|
-
`:`${
|
|
13
|
-
`;else {let
|
|
11
|
+
${y}
|
|
12
|
+
`:`${h}
|
|
13
|
+
`;else {let b=a.search(/^\[/m);b>0?w=a.slice(0,b)+h+`
|
|
14
14
|
|
|
15
|
-
`+
|
|
15
|
+
`+a.slice(b).trimEnd():b===0?w=h+`
|
|
16
16
|
|
|
17
|
-
`+
|
|
17
|
+
`+a.trimEnd():w=a.trimEnd()+`
|
|
18
18
|
|
|
19
|
-
`+
|
|
19
|
+
`+h,y&&(w=w.trimEnd()+`
|
|
20
20
|
|
|
21
|
-
`+
|
|
22
|
-
`;}await t.files.write(
|
|
21
|
+
`+y),w+=`
|
|
22
|
+
`;}await t$1.files.write(c,w);}async function Tt(t,e,n,r,i){let o=O(e.configPath,i),c=o.slice(0,o.lastIndexOf("/"));await t.files.makeDir(c);let a=[`default_model = ${_(e.modelName)}`,`default_thinking = ${_(r.defaultThinking)}`,'default_permission_mode = "auto"',"","[thinking]",`mode = ${_(r.defaultThinking?"on":"off")}`];r.defaultThinking&&r.thinkingEffort&&a.push(`effort = ${_(r.thinkingEffort)}`),a.push("",`[providers.${e.providerName}]`,'type = "kimi"',`base_url = ${_(r.baseUrl)}`,`api_key = ${_(r.apiKey)}`,`custom_headers = ${_(n)}`,"",`[models.${e.modelName}]`,`provider = ${_(e.providerName)}`,`model = ${_(r.model)}`,`max_context_size = ${e.maxContextSize}`,`capabilities = ${_(["image_in","thinking"])}`);let l=a.join(`
|
|
23
23
|
`)+`
|
|
24
|
-
`;await t.files.write(
|
|
24
|
+
`;await t.files.write(o,l);}async function Rt(t,e,n,r,i){if(!(!r||Object.keys(r).length===0))switch(t){case "claude":await Le(e,n,r,i);break;case "codex":await Ve(e,r,i);break;case "gemini":await Ne(e,r,i);break;case "qwen":await Fe(e,r,i);break;case "kimi":await Et(e,r,i);break;case "opencode":await _t(e,n,r);break;case "droid":await je(e,n,r);break;default:throw new Error(`Unknown agent type for MCP config: ${t}`)}}function He(){let t={};return function(d){let s;try{s=JSON.parse(d);}catch{return null}if(s._meta||s._prompt)return null;let p=s.session_id;switch(s.type){case "system":return null;case "assistant":return e(s.message?.content,"assistant",p);case "user":{let u=s.message?.content;return typeof u=="string"||Array.isArray(u)&&u.length===1&&u[0].type==="text"?null:e(u,"user",p)}case "result":return null;default:return null}};function e(l,d,s){if(typeof l=="string")return d==="user"?null:[{sessionId:s,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:l}}}];if(!l||!Array.isArray(l))return null;let p=[];for(let u of l){let g=null;switch(u.type){case "text":case "text_delta":if(d==="user")break;g={sessionUpdate:"agent_message_chunk",content:{type:"text",text:u.text}};break;case "image":if(d==="user")break;g={sessionUpdate:"agent_message_chunk",content:{type:"image",data:u.source?.type==="base64"?u.source.data:"",mimeType:u.source?.type==="base64"?u.source.media_type:"",uri:u.source?.type==="url"?u.source.url:void 0}};break;case "thinking":case "thinking_delta":g={sessionUpdate:"agent_thought_chunk",content:{type:"text",text:u.thinking}};break;case "tool_use":case "server_tool_use":case "mcp_tool_use":{if(t[u.id]=u,u.name==="TodoWrite")Array.isArray(u.input?.todos)&&(g={sessionUpdate:"plan",entries:c(u.input)});else {let f=n(u);g={sessionUpdate:"tool_call",toolCallId:u.id,status:"pending",...f};}break}case "tool_result":case "tool_search_tool_result":case "web_fetch_tool_result":case "web_search_tool_result":case "code_execution_tool_result":case "bash_code_execution_tool_result":case "text_editor_code_execution_tool_result":case "mcp_tool_result":{let f=t[u.tool_use_id];if(!f||(delete t[u.tool_use_id],f.name==="TodoWrite"))break;g={sessionUpdate:"tool_call_update",toolCallId:u.tool_use_id,status:"is_error"in u&&u.is_error?"failed":"completed",...r(u,f)};break}}g&&p.push({sessionId:s,update:g});}return p.length>0?p:null}function n(l){let d=l.name,s=l.input||{};switch(d){case "Task":return {title:s.description||"Task",kind:"think",content:s.prompt?[{type:"content",content:{type:"text",text:s.prompt}}]:[],rawInput:s};case "NotebookRead":return {title:s.notebook_path?`Read Notebook ${s.notebook_path}`:"Read Notebook",kind:"read",content:[],locations:s.notebook_path?[{path:s.notebook_path}]:[],rawInput:s};case "NotebookEdit":return {title:s.notebook_path?`Edit Notebook ${s.notebook_path}`:"Edit Notebook",kind:"edit",content:s.new_source?[{type:"content",content:{type:"text",text:s.new_source}}]:[],locations:s.notebook_path?[{path:s.notebook_path}]:[],rawInput:s};case "Bash":return {title:s.command?"`"+s.command.replaceAll("`","\\`")+"`":"Terminal",kind:"execute",content:s.description?[{type:"content",content:{type:"text",text:s.description}}]:[],rawInput:s};case "BashOutput":return {title:"Tail Logs",kind:"execute",content:[],rawInput:s};case "KillShell":return {title:"Kill Process",kind:"execute",content:[],rawInput:s};case "Read":{let p="";return s.limit?p=" ("+((s.offset??0)+1)+" - "+((s.offset??0)+s.limit)+")":s.offset&&(p=" (from line "+(s.offset+1)+")"),{title:"Read "+(s.file_path??"File")+p,kind:"read",content:[],locations:s.file_path?[{path:s.file_path,line:s.offset??0}]:[],rawInput:s}}case "LS":return {title:s.path?`List \`${s.path}\` directory`:"List current directory",kind:"search",content:[],locations:[],rawInput:s};case "Edit":{let p=s.file_path;return {title:p?`Edit \`${p}\``:"Edit",kind:"edit",content:p?[{type:"diff",path:p,oldText:s.old_string??null,newText:s.new_string??""}]:[],locations:p?[{path:p}]:[],rawInput:s}}case "Write":return {title:s.file_path?`Write ${s.file_path}`:"Write",kind:"edit",content:s.file_path?[{type:"diff",path:s.file_path,oldText:null,newText:s.content??""}]:[],locations:s.file_path?[{path:s.file_path}]:[],rawInput:s};case "Glob":{let p="Find";return s.path&&(p+=` \`${s.path}\``),s.pattern&&(p+=` \`${s.pattern}\``),{title:p,kind:"search",content:[],locations:s.path?[{path:s.path}]:[],rawInput:s}}case "Grep":{let p="grep";return s["-i"]&&(p+=" -i"),s["-n"]&&(p+=" -n"),s["-A"]!==void 0&&(p+=` -A ${s["-A"]}`),s["-B"]!==void 0&&(p+=` -B ${s["-B"]}`),s["-C"]!==void 0&&(p+=` -C ${s["-C"]}`),s.output_mode==="files_with_matches"?p+=" -l":s.output_mode==="count"&&(p+=" -c"),s.head_limit!==void 0&&(p+=` | head -${s.head_limit}`),s.glob&&(p+=` --include="${s.glob}"`),s.type&&(p+=` --type=${s.type}`),s.multiline&&(p+=" -P"),p+=` "${s.pattern??""}"`,s.path&&(p+=` ${s.path}`),{title:p,kind:"search",content:[],rawInput:s}}case "WebFetch":return {title:s.url?`Fetch ${s.url}`:"Fetch",kind:"fetch",content:s.prompt?[{type:"content",content:{type:"text",text:s.prompt}}]:[],rawInput:s};case "WebSearch":{let p=`"${s.query??""}"`;return s.allowed_domains?.length>0&&(p+=` (allowed: ${s.allowed_domains.join(", ")})`),s.blocked_domains?.length>0&&(p+=` (blocked: ${s.blocked_domains.join(", ")})`),{title:p,kind:"fetch",content:[],rawInput:s}}case "TodoWrite":return {title:Array.isArray(s.todos)?`Update TODOs: ${s.todos.map(p=>p.content).join(", ")}`:"Update TODOs",kind:"think",content:[],rawInput:s};case "ExitPlanMode":return {title:"Ready to code?",kind:"switch_mode",content:s.plan?[{type:"content",content:{type:"text",text:s.plan}}]:[],rawInput:s};default:if(d?.startsWith("mcp__")){let p=d.split("__"),u=p[1]||"mcp",g=p.slice(2).join("__")||d;return {title:`${u}: ${g}`,kind:"other",content:[],rawInput:s}}return {title:d||"Unknown Tool",kind:"other",content:[],rawInput:s}}}function r(l,d){let s=l.content;switch(d?.name){case "Read":return Array.isArray(s)&&s.length>0?{content:s.map(p=>({type:"content",content:p.type==="text"?{type:"text",text:a(p.text)}:o(p,false)}))}:typeof s=="string"&&s.length>0?{content:[{type:"content",content:{type:"text",text:a(s)}}]}:{};case "Edit":case "Write":case "Bash":return i(s,l.is_error||false);case "ExitPlanMode":return {title:"Exited Plan Mode"};default:return i(s,"is_error"in l?l.is_error:false)}}function i(l,d=false){return Array.isArray(l)&&l.length>0?{content:l.map(s=>({type:"content",content:o(s,d)}))}:typeof l=="string"&&l.length>0?{content:[{type:"content",content:{type:"text",text:d?"```\n"+l+"\n```":l}}]}:{}}function o(l,d){if(l.type==="text")return d?{type:"text",text:"```\n"+l.text+"\n```"}:{type:"text",text:l.text};if(l.type==="image"){if(l.data&&l.mimeType)return {type:"image",data:l.data,mimeType:l.mimeType};if(l.source?.type==="base64")return {type:"image",data:l.source.data||"",mimeType:l.source.media_type||""};if(l.source?.type==="url")return {type:"image",data:"",mimeType:"",uri:l.source.url}}return l}function c(l){return l.todos.map(d=>({content:d.content,status:d.status||"pending",priority:"medium"}))}function a(l){let d="```",s=Array.from(l.matchAll(/^```+/gm));for(let[p]of s)for(;p.length>=d.length;)d+="`";return d+`
|
|
25
25
|
`+l+(l.endsWith(`
|
|
26
26
|
`)?"":`
|
|
27
|
-
`)+d}}function
|
|
28
|
-
`)??
|
|
29
|
-
`)??""}};case "agent_message":return {sessionUpdate:"agent_message_chunk",content:{type:"text",text:
|
|
27
|
+
`)+d}}function We(){return function(l){let d;try{d=JSON.parse(l);}catch{return null}if(d._meta||d._prompt)return null;let s=[];switch(d.type){case "thread.started":case "turn.started":case "turn.completed":return null;case "error":{let p=typeof d.message=="string"?d.message:JSON.stringify(d);s.push({update:{sessionUpdate:"error",message:p,fatal:false}});break}case "turn.failed":{let p=typeof d.error?.message=="string"?d.error.message:JSON.stringify(d.error??d);s.push({update:{sessionUpdate:"error",message:p,fatal:true}});break}case "item.started":{let p=d.item;if(!p)return null;let u=e(p);u&&s.push({update:u});break}case "item.updated":{let p=d.item;if(!p)return null;let u=n(p);u&&s.push({update:u});break}case "item.completed":{let p=d.item;if(!p)return null;let u=r(p);u&&s.push({update:u});break}default:return null}return s.length>0?s:null};function e(a){let l=a.id;switch(a.type){case "mcp_tool_call":return {type:"mcp_tool_call",name:`${a.server}:${a.tool}`},{sessionUpdate:"tool_call",toolCallId:l,title:`${a.server}: ${a.tool}`,kind:"other",status:"in_progress",rawInput:a.arguments,content:[]};case "command_execution":return {type:"command_execution",name:a.command},{sessionUpdate:"tool_call",toolCallId:l,title:a.command?`\`${a.command}\``:"Execute Command",kind:"execute",status:"in_progress",rawInput:{command:a.command},content:[]};case "web_search":return {type:"web_search",name:a.query},{sessionUpdate:"tool_call",toolCallId:l,title:`Search: ${a.query??""}`,kind:"fetch",status:"in_progress",content:[]};case "todo_list":return {sessionUpdate:"plan",entries:c(a.items)};default:return null}}function n(a){return a.type==="todo_list"?{sessionUpdate:"plan",entries:c(a.items)}:null}function r(a){let l=a.id;switch(a.type){case "error":return {sessionUpdate:"error",message:typeof a.message=="string"?a.message:JSON.stringify(a),fatal:false};case "reasoning":return {sessionUpdate:"agent_thought_chunk",content:{type:"text",text:a.text??a.summary?.join(`
|
|
28
|
+
`)??a.content?.join(`
|
|
29
|
+
`)??""}};case "agent_message":return {sessionUpdate:"agent_message_chunk",content:{type:"text",text:a.text??""}};case "mcp_tool_call":{let s=i(a.result),p=a.status==="failed"||a.error?"failed":"completed";return {sessionUpdate:"tool_call_update",toolCallId:l,status:p,content:s}}case "command_execution":{let s=a.aggregated_output?[{type:"content",content:{type:"text",text:a.aggregated_output}}]:[],p=a.status==="completed"||a.exit_code===0?"completed":"failed";return {sessionUpdate:"tool_call_update",toolCallId:l,status:p,content:s}}case "file_change":{let s=a.changes??[],p=s.map(g=>({path:g.path})),u=s.length===1?`${s[0].kind==="add"?"Create":"Edit"} ${s[0].path}`:`Edit ${s.length} files`;return {sessionUpdate:"tool_call",toolCallId:l,title:u,kind:"edit",status:a.status==="completed"?"completed":"failed",content:s.map(g=>({type:"diff",path:g.path,oldText:g.kind==="add"?null:"",newText:""})),locations:p}}case "web_search":return {sessionUpdate:"tool_call",toolCallId:l,title:`Search: ${a.query??""}`,kind:"fetch",status:"completed",content:[]};case "todo_list":return {sessionUpdate:"plan",entries:c(a.items)};default:return null}}function i(a){return a?.content?Array.isArray(a.content)?a.content.map(l=>({type:"content",content:o(l)})):typeof a.content=="string"?[{type:"content",content:{type:"text",text:a.content}}]:[]:[]}function o(a){return a.type==="text"?{type:"text",text:a.text??""}:a.type==="image"?{type:"image",data:a.data??"",mimeType:a.mime_type??a.mimeType??"",uri:a.uri}:a}function c(a){if(!Array.isArray(a))return [];let l=false;return a.map(d=>{let s;return d.completed?s="completed":l?s="pending":(s="in_progress",l=true),{content:d.text??"",status:s,priority:"medium"}})}}var Ni={applypatch:"edit",apply_patch:"edit",create:"edit",edit:"edit",grep:"search",glob:"search",ls:"search",read:"read",write:"edit",execute:"execute",execute_cli:"execute",fetchurl:"fetch",fetch_url:"fetch",webfetch:"fetch",web_fetch:"fetch",websearch:"fetch",web_search:"fetch",skill:"execute",task:"think",todowrite:"other",todo_write:"other"},Fi=new Set(["assistant_text_complete","thinking_text_complete","droid_working_state_changed","permission_resolved","settings_updated","session_title_updated","mcp_status_changed","session_token_usage_changed","mission_state_changed","mission_features_changed","mission_progress_entry","mission_heartbeat","mission_worker_started","mission_worker_completed","mcp_auth_required","mcp_auth_completed","structured_output"]);function qe(){let t=new Map,e,n=false,r="",i;return function(c){let a;try{a=JSON.parse(c);}catch{return null}if(!Cn(a))return null;let l=Ki(a);if(l.sessionId&&(e=l.sessionId),l.errorText)return [H(e,l.errorText)];if(l.resultText)return r=l.resultText,n=true,[H(e,l.resultText)];if(l.handled)return null;let s=ji(a)??a,p=xn(s);p&&(e=p);let u=[],g=x(s,"type");switch(g){case "system":return null;case "message":{let f=x(s,"role"),m=x(s,"text")||It(s.content);if(!m)break;f==="assistant"&&(n=true,r=m,u.push(H(e,m)));break}case "completion":{let f=x(s,"finalText")||x(s,"result");f&&(!n||f!==r)&&(n=true,r=f,u.push(H(e,f)));break}case "assistant_text_delta":{let f=x(s,"textDelta")||x(s,"text");f&&(n=true,r+=f,u.push(H(e,f)));break}case "thinking_text_delta":{let f=x(s,"textDelta")||x(s,"text");if(f){let m=Sn(s,f,i);m&&(i=m.signature,u.push({sessionId:e,update:m.event}));}break}case "reasoning":{let f=x(s,"text");if(f){let m=Sn(s,f,i);m&&(i=m.signature,u.push({sessionId:e,update:m.event}));}break}case "assistant":{let f=x(s,"text")||It(P(s.message)?.content);f&&(n=true,r=f,u.push(H(e,f)));break}case "tool_call":case "tool_call_delta":{let f=P(s.toolUse)??P(s.tool_use)??s,m=kn(f,t);m&&u.push({sessionId:e,update:m});break}case "tool_result":{let f=Vi(s,t);f&&u.push({sessionId:e,update:f});break}case "tool_progress_update":case "tool_progress":{let f=zi(s);f&&u.push({sessionId:e,update:f});break}case "create_message":{for(let f of Gi(s,t)){if(f.sessionUpdate==="agent_message_chunk"){let m=f.content.type==="text"?f.content.text:"";if(n&&m===r)continue;n=true,r=m;}u.push({sessionId:e,update:f});}break}case "result":{let f=ge(s.result??s.text??s.error);f&&(n=true,r=f,u.push(H(e,f)));break}case "error":{let f=ge(s.message??s.error??s);f&&u.push(H(e,f));break}default:if(g&&!Fi.has(g))return null}return u.length>0&&g!=="reasoning"&&g!=="thinking_text_delta"&&(i=void 0),u.length>0?u:null}}function Sn(t,e,n){let r=Pt(t,"id")||Pt(t,"messageId"),i=Pt(t,"blockIndex"),o=`${x(t,"type")}:${r}:${i}:${e}`;return o===n?null:{signature:o,event:{sessionUpdate:"agent_thought_chunk",content:{type:"text",text:e}}}}function Ki(t){if(t.type!=="response")return {handled:false};let e=P(t.result),n=P(t.error),r=xn(e??t);if(n)return {handled:true,sessionId:r,errorText:ge(n.message??n)};let i=e?x(e,"finalText")||x(e,"result"):"";return {handled:true,sessionId:r,resultText:i}}function ji(t){return t.method!=="droid.session_notification"?null:P(P(t.params)?.notification)}function Gi(t,e){let n=P(t.message);if(!n)return [];let r=[],i=n.content;if(Array.isArray(i))for(let o of i){let c=P(o);if(c&&c.type==="tool_use"){let a=kn(c,e);a&&r.push(a);}}if(n.role==="assistant"){let o=It(i);o&&r.push({sessionUpdate:"agent_message_chunk",content:{type:"text",text:o}});}return r}function kn(t,e){let n=x(t,"id")||x(t,"toolUseId")||x(t,"tool_use_id"),r=x(t,"name")||x(t,"toolName")||x(t,"tool_name")||"Tool";if(!n)return null;e.set(n,r);let i=P(t.input)??P(t.toolInput)??P(t.arguments)??{};if(En(r)==="todowrite"){let d=Hi(i);if(d)return d}let{title:o,kind:c,content:a,locations:l}=Wi(r,i);return {sessionUpdate:"tool_call",toolCallId:n,title:o,kind:c,status:"pending",rawInput:i,content:a,locations:l}}function Vi(t,e){let n=x(t,"toolUseId")||x(t,"tool_use_id")||x(t,"tool_id");if(!n)return null;let r=x(t,"toolName")||x(t,"tool_name")||e.get(n);return e.delete(n),{sessionUpdate:"tool_call_update",toolCallId:n,status:t.isError===true||t.is_error===true?"failed":"completed",title:r,content:Ot(t.content??t.result??t.error)}}function zi(t){let e=x(t,"toolUseId")||x(t,"tool_use_id")||x(t,"tool_id");if(!e)return null;let n=P(t.update),r=ge(t.content??n?.text??n?.status??n?.details);return {sessionUpdate:"tool_call_update",toolCallId:e,status:"in_progress",content:r?Ot(r):void 0}}function Hi(t){let e=t.todos;if(!Array.isArray(e))return null;let n=e.flatMap(r=>{let i=P(r);if(!i)return [];let o=x(i,"content"),c=qi(x(i,"status")),a=Ji(x(i,"priority"));return o?[{content:o,status:c,priority:a}]:[]});return n.length>0?{sessionUpdate:"plan",entries:n}:null}function Wi(t,e){let n=Ni[En(t)]||"other",r=x(e,"path")||x(e,"filePath")||x(e,"file_path")||x(e,"absolute_path"),i=x(e,"command"),o=x(e,"url"),c=r||i||o;return {title:c?`${t} ${c}`:t,kind:n,content:Object.keys(e).length>0?Ot(e):[],locations:r?[{path:r}]:[]}}function xn(t){if(t)return x(t,"session_id")||x(t,"sessionId")}function H(t,e){return {sessionId:t,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:e}}}}function It(t){return typeof t=="string"?t:Array.isArray(t)?t.map(e=>{let n=P(e);return n?x(n,"text")||x(n,"content"):""}).filter(Boolean).join(""):""}function Ot(t){let e=ge(t);return e?[{type:"content",content:{type:"text",text:e}}]:[]}function ge(t){if(typeof t=="string")return t;if(t==null)return "";try{return JSON.stringify(t)}catch{return String(t)}}function Cn(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function P(t){return Cn(t)?t:null}function x(t,e){let n=t[e];return typeof n=="string"?n:""}function Pt(t,e){let n=t[e];return typeof n=="string"||typeof n=="number"||typeof n=="boolean"?String(n):""}function En(t){return t.replace(/[-_\s]/g,"").toLowerCase()}function qi(t){return t==="in_progress"||t==="completed"?t:"pending"}function Ji(t){return t==="high"||t==="low"?t:"medium"}var Yi={read_file:"read",read_many_files:"read",write_file:"edit",replace:"edit",edit_file:"edit",run_shell_command:"execute",shell:"execute",glob:"search",grep:"search",search_file_content:"search",list_directory:"search",brave_web_search:"fetch",web_search:"fetch",google_web_search:"fetch",web_fetch:"fetch",delegate_to_agent:"think",write_todos:"other",save_memory:"other",activate_skill:"other"};function Je(){return function(c){let a;try{a=JSON.parse(c);}catch{return null}if(a._meta||a._prompt)return null;let l=a.session_id,d=[];switch(a.type){case "init":case "result":return null;case "message":{let s=t(a);s&&d.push({sessionId:l,update:s});break}case "tool_use":{let s=e(a);s&&d.push({sessionId:l,update:s});break}case "tool_result":{let s=n(a);s&&d.push({sessionId:l,update:s});break}case "error":{let s=r(a);s&&d.push({sessionId:l,update:s});break}default:return null}return d.length>0?d:null};function t(o){let c=o.role,a=o.content;return a?c==="assistant"?{sessionUpdate:"agent_message_chunk",content:{type:"text",text:a}}:c==="user"?{sessionUpdate:"user_message_chunk",content:{type:"text",text:a}}:null:null}function e(o){let c=o.tool_id,a=o.tool_name,l=o.parameters||{},{title:d,kind:s,content:p,locations:u}=i(a,l);return {sessionUpdate:"tool_call",toolCallId:c,title:d,kind:s,status:"pending",rawInput:l,content:p,locations:u}}function n(o){let c=o.tool_id,a=o.status,l=o.output,d=o.error,s=[];return l&&typeof l=="string"&&l.length>0&&s.push({type:"content",content:{type:"text",text:a==="error"?`\`\`\`
|
|
30
30
|
${l}
|
|
31
|
-
\`\`\``:l}}),d?.message&&!l&&
|
|
31
|
+
\`\`\``:l}}),d?.message&&!l&&s.push({type:"content",content:{type:"text",text:`\`\`\`
|
|
32
32
|
${d.message}
|
|
33
|
-
\`\`\``}}),{sessionUpdate:"tool_call_update",toolCallId:o,status:c==="success"?"completed":"failed",content:i}}function r(a){let o=a.severity,c=a.message;return c?{sessionUpdate:"agent_message_chunk",content:{type:"text",text:`${o==="warning"?"\u26A0\uFE0F Warning":"\u274C Error"}: ${c}`}}:null}function s(a,o){let c=Zr[a]||"other",l=[],d=[],i=a;switch(a){case "read_file":i=`Read ${o.absolute_path||o.file_path||"file"}`,(o.absolute_path||o.file_path)&&d.push({path:o.absolute_path||o.file_path});break;case "write_file":i=`Write ${o.file_path||"file"}`,o.file_path&&(d.push({path:o.file_path}),l.push({type:"diff",path:o.file_path,oldText:null,newText:o.content||""}));break;case "edit_file":i=`Edit ${o.file_path||"file"}`,o.file_path&&d.push({path:o.file_path});break;case "replace":i=`Edit ${o.file_path||"file"}`,o.file_path&&(d.push({path:o.file_path}),(o.old_string!==void 0||o.new_string!==void 0)&&l.push({type:"diff",path:o.file_path,oldText:o.old_string||"",newText:o.new_string||""}));break;case "run_shell_command":case "shell":i=o.command?`\`${o.command}\``:"Run command",o.description&&l.push({type:"content",content:{type:"text",text:o.description}});break;case "brave_web_search":case "web_search":case "google_web_search":i=o.query?`"${o.query}"`:"Web search";break;case "web_fetch":i=o.prompt?`Fetch: ${o.prompt.substring(0,50)}...`:"Web fetch";break;case "glob":i=`Find ${o.pattern||"files"}`,o.dir_path&&d.push({path:o.dir_path});break;case "grep":case "search_file_content":i=`grep "${o.pattern||o.query||""}"`;break;case "list_directory":i=`List ${o.dir_path||o.path||"directory"}`,(o.dir_path||o.path)&&d.push({path:o.dir_path||o.path});break;case "read_many_files":i=`Read ${o.include?.length||"multiple"} files`,Array.isArray(o.include)&&o.include.forEach(p=>d.push({path:p}));break;case "delegate_to_agent":i=o.agent_name?`Agent: ${o.agent_name}`:"Delegate to agent";break;case "write_todos":i="Update todos";break;case "save_memory":i=o.fact?`Remember: "${o.fact.substring(0,40)}..."`:"Save memory";break;case "activate_skill":i=o.name?`Activate skill: ${o.name}`:"Activate skill";break;default:i=a;}return {title:i,kind:c,content:l,locations:d}}}var Xr={Read:"read",ReadFile:"read",ReadMediaFile:"read",Write:"edit",WriteFile:"edit",Edit:"edit",StrReplaceFile:"edit",Bash:"execute",Shell:"execute",Glob:"search",Grep:"search",WebSearch:"fetch",SearchWeb:"fetch",FetchURL:"fetch",Agent:"think",AgentSwarm:"think",Task:"think",Think:"think",CreateSubagent:"think",TodoList:"other",SetTodoList:"other"};function sn(t){return t==="TodoList"||t==="SetTodoList"}function ft(t){return /<system>\s*ERROR:/i.test(t)||t.includes("<error>")||t.includes("ToolError")}function an(t){let e=/^data:([^;,]+)((?:;[^,]*)*),(.+)$/i.exec(t);if(!e)return null;let n=e[1]||"",r=e[2]||"",s=e[3]||"";return /;base64/i.test(r)?{mimeType:n,data:s}:null}function mt(t){if(!t||typeof t!="object")return null;if(t.type==="text"&&typeof t.text=="string"&&t.text.length>0)return {type:"content",content:{type:"text",text:t.text}};if(t.type==="image_url"&&typeof t.image_url?.url=="string"){let e=t.image_url.url,n=an(e);return n?{type:"content",content:{type:"image",data:n.data,mimeType:n.mimeType}}:{type:"content",content:{type:"image",data:"",mimeType:"",uri:e}}}return t.type==="video_url"&&typeof t.video_url?.url=="string"?{type:"content",content:{type:"text",text:`[video] ${t.video_url.url}`}}:t.type==="audio_url"&&typeof t.audio_url?.url=="string"?{type:"content",content:{type:"text",text:`[audio] ${t.audio_url.url}`}}:null}function gt(t){let e=[];if(typeof t=="string")return t.length>0&&e.push({type:"content",content:{type:"text",text:t}}),e;if(Array.isArray(t)){for(let n of t){if(typeof n=="string"&&n.length>0){e.push({type:"content",content:{type:"text",text:n}});continue}let r=mt(n);r&&e.push(r);}return e}if(t&&typeof t=="object"){let n=mt(t);n&&e.push(n);}return e}function ei(t){return t.some(e=>e.type==="content"&&e.content.type==="text"&&ft(e.content.text))}function ti(t){if(!t||typeof t!="object")return null;if(t.type==="think"&&typeof t.think=="string"&&t.think.length>0)return {update:{sessionUpdate:"agent_thought_chunk",content:{type:"text",text:t.think}}};if(t.type==="text"&&typeof t.text=="string"&&t.text.length>0)return {update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:t.text}}};if(t.type==="image_url"&&typeof t.image_url?.url=="string"){let e=t.image_url.url,n=an(e);return n?{update:{sessionUpdate:"agent_message_chunk",content:{type:"image",data:n.data,mimeType:n.mimeType}}}:{update:{sessionUpdate:"agent_message_chunk",content:{type:"image",data:"",mimeType:"",uri:e}}}}return t.type==="video_url"&&typeof t.video_url?.url=="string"?{update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:`[video] ${t.video_url.url}`}}}:t.type==="audio_url"&&typeof t.audio_url?.url=="string"?{update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:`[audio] ${t.audio_url.url}`}}}:null}function ni(t){return t==="in_progress"?"in_progress":t==="done"||t==="completed"?"completed":"pending"}function on(t){if(!t||typeof t!="object")return [];let e=t.todos;return Array.isArray(e)?e.map(n=>{if(!n||typeof n!="object")return null;let r=n.title;if(typeof r!="string"||r.length===0)return null;let s=n.status;return {content:r,status:ni(s),priority:"medium"}}).filter(n=>n!==null):[]}function ht(){let t=new Set,e=0;function n(c,l){return typeof c=="string"&&c.length>0?c:(e+=1,`kimi_${l.replace(/[^a-zA-Z0-9_]/g,"_")||"tool"}_${e}`)}return function(l){let d;try{d=JSON.parse(l);}catch{return null}if(!d||typeof d!="object")return null;let i=d.role;return "_meta"in d||"_prompt"in d||i==="meta"?null:i==="assistant"?r(d):i==="tool"?s(d):typeof d.type=="string"&&"payload"in d?a(d):null};function r(c){let l=[],d=c.content,i=c.tool_calls;if(typeof d=="string"&&d.length>0)l.push({update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:d}}});else if(Array.isArray(d))for(let p of d){let u=ti(p);u&&l.push(u);}if(Array.isArray(i))for(let p of i){if(!p||typeof p!="object")continue;let u=p.function;if(!u)continue;let g=u.name??"",f=n(p.id,g),m;try{m=u.arguments?JSON.parse(u.arguments):{};}catch{m=u.arguments;}if(sn(g)){let k=on(m);k.length>0&&l.push({update:{sessionUpdate:"plan",entries:k}}),t.add(f);continue}let{title:h,kind:y,toolContent:w,locations:S}=o(g,typeof m=="object"&&m!==null?m:{});l.push({update:{sessionUpdate:"tool_call",toolCallId:f,title:h,kind:y,status:"pending",rawInput:m,content:w,locations:S}});}return l.length>0?l:null}function s(c){let l=c.tool_call_id;if(typeof l!="string"||l.length===0)return null;if(t.has(l))return t.delete(l),null;let d=c.content,i=[],p=false;if(typeof d=="string")p=ft(d),d.length>0&&i.push({type:"content",content:{type:"text",text:d}});else if(Array.isArray(d))for(let u of d){let g=mt(u);g&&(g.type==="content"&&g.content.type==="text"&&ft(g.content.text)&&(p=true),i.push(g));}return [{update:{sessionUpdate:"tool_call_update",toolCallId:l,status:p?"failed":"completed",content:i}}]}function a(c){let l=c.type,d=c.payload??{},i=[];switch(l){case "TextPart":{let p=d.text;typeof p=="string"&&p.length>0&&i.push({update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:p}}});break}case "ThinkPart":{let p=d.think;typeof p=="string"&&p.length>0&&i.push({update:{sessionUpdate:"agent_thought_chunk",content:{type:"text",text:p}}});break}case "ToolCall":{let p=d.function?.name??"",u=n(d.id,p),g=d.function;if(!g)break;let f;try{f=g.arguments?JSON.parse(g.arguments):{};}catch{f=g.arguments;}if(sn(p)){let S=on(f);S.length>0&&i.push({update:{sessionUpdate:"plan",entries:S}}),t.add(u);break}let{title:m,kind:h,toolContent:y,locations:w}=o(p,typeof f=="object"&&f!==null?f:{});i.push({update:{sessionUpdate:"tool_call",toolCallId:u,title:m,kind:h,status:"pending",rawInput:f,content:y,locations:w}});break}case "ToolResult":{let p=d.tool_call_id;if(typeof p!="string"||p.length===0)break;if(t.has(p)){t.delete(p);break}let u=d.return_value??d.content,g=[],f=d.is_error===true;if(u&&typeof u=="object"&&!Array.isArray(u)){let m=u;f=f||m.type==="ToolError"||m.is_error===true,g.push(...gt(m.output)),g.length===0&&typeof m.message=="string"&&m.message.length>0&&g.push({type:"content",content:{type:"text",text:m.message}}),g.length===0&&g.push(...gt(u));}else g.push(...gt(u));f=f||ei(g),i.push({update:{sessionUpdate:"tool_call_update",toolCallId:p,status:f?"failed":"completed",content:g}});break}default:return null}return i.length>0?i:null}function o(c,l){let d=Xr[c]||"other",i=[],p=[],u=c;switch(c){case "Read":case "ReadFile":{let g=l.path??l.file_path;u=`Read ${g||"file"}`,g&&p.push({path:g});break}case "ReadMediaFile":{let g=l.path??l.file_path;u=`Read media ${g||"file"}`,g&&p.push({path:g});break}case "Write":case "WriteFile":{let g=l.path??l.file_path;u=`Write ${g||"file"}`,g&&(p.push({path:g}),typeof l.content=="string"&&i.push({type:"diff",path:g,oldText:null,newText:l.content}));break}case "Edit":case "StrReplaceFile":{let g=l.path??l.file_path;u=`Edit ${g||"file"}`,g&&p.push({path:g});break}case "Bash":case "Shell":u=l.command?`\`${l.command}\``:"Run command";break;case "Glob":u=`Find ${l.pattern||"files"}`,l.path&&p.push({path:l.path});break;case "Grep":u=`grep "${l.pattern||""}"`,l.path&&p.push({path:l.path});break;case "WebSearch":case "SearchWeb":u=l.query?`"${l.query}"`:"Web search";break;case "FetchURL":u=l.url?`Fetch ${l.url}`:"Web fetch";break;case "Agent":case "AgentSwarm":case "Task":u=l.description||"Subagent task";break;case "Think":u=l.thought||"Thinking";break;case "CreateSubagent":u=l.name?`Subagent: ${l.name}`:"Create subagent";break;case "TodoList":case "SetTodoList":u="Update todos";break;default:u=c;}return {title:u,kind:d,toolContent:i,locations:p}}}var ri={read:"read",write:"edit",edit:"edit",multiedit:"edit",apply_patch:"edit",bash:"execute",glob:"search",grep:"search",list:"search",codesearch:"search",lsp:"search",webfetch:"fetch",websearch:"fetch",task:"think",batch:"think",plan_enter:"switch_mode",plan_exit:"switch_mode",todoread:"other",todowrite:"other",skill:"other",question:"other"};function ii(t){let e=/^data:([^;,]+)?((?:;[^,]+)*),(.*)$/s.exec(t);if(!e)return null;let n=e[1]||"",r=e[2]||"",s=e[3]||"";return /;base64/i.test(r)?{mimeType:n,data:s}:null}function si(t){if(typeof t!="string")return "pending";switch(t.toLowerCase()){case "in_progress":case "in-progress":case "running":return "in_progress";case "completed":case "done":case "cancelled":return "completed";default:return "pending"}}function oi(t){return t==="high"||t==="medium"||t==="low"?t:"medium"}function cn(t){return Array.isArray(t)?t.map(e=>{if(!e||typeof e!="object")return null;let n=e.content;return typeof n!="string"||n.length===0?null:{content:n,status:si(e.status),priority:oi(e.priority)}}).filter(e=>e!==null):[]}function ai(t){if(!t||typeof t!="object")return null;let e=t,n=typeof e.mime=="string"?e.mime:"",r=typeof e.url=="string"?e.url:"";if(n.startsWith("image/")){if(r.length>0){let c=ii(r);return c?{type:"content",content:{type:"image",data:c.data,mimeType:c.mimeType||n}}:{type:"content",content:{type:"image",data:"",mimeType:n,uri:r}}}return null}return {type:"content",content:{type:"text",text:`[attachment] ${(typeof e.filename=="string"?e.filename:"")||"attachment"} (${n||"file"})`}}}function ci(t,e){if(t==="error")return typeof e.error=="string"?e.error:null;if(typeof e.output=="string")return e.output;if(e.output===void 0||e.output===null)return null;try{return JSON.stringify(e.output)}catch{return String(e.output)}}function li(t,e){return t==="error"?"failed":t==="running"?"in_progress":t==="pending"?"pending":typeof e=="number"&&e!==0?"failed":"completed"}function yt(){return function(o){let c;try{c=JSON.parse(o);}catch{return null}if(!c||typeof c!="object")return null;let l=c.sessionID,d=[];switch(c.type){case "step_start":case "step_finish":return null;case "text":{let i=t(c);i&&d.push({sessionId:l,update:i});break}case "reasoning":{let i=e(c);i&&d.push({sessionId:l,update:i});break}case "tool_use":{let i=n(c);for(let p of i)d.push({sessionId:l,update:p});break}case "error":{let i=r(c);i&&d.push({sessionId:l,update:i});break}default:return null}return d.length>0?d:null};function t(a){let o=a.part?.text;return typeof o!="string"||o.length===0?null:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:o}}}function e(a){let o=a.part?.text;return typeof o!="string"||o.length===0?null:{sessionUpdate:"agent_thought_chunk",content:{type:"text",text:o}}}function n(a){let o=a.part;if(!o)return [];let c=typeof o.callID=="string"?o.callID:"";if(c.length===0)return [];let l=typeof o.tool=="string"?o.tool.toLowerCase():"",d=typeof o.state=="object"&&o.state?o.state:{},i=typeof d.input=="object"&&d.input?d.input:{},p=d.status,u=d.title??d.metadata?.description??l,g=d.metadata?.exit,{kind:f,content:m,locations:h}=s(l,i),y=[];if(y.push({sessionUpdate:"tool_call",toolCallId:c,title:u,kind:f,status:"pending",rawInput:i,content:m,locations:h}),l==="todowrite"){let v=cn(i.todos);if(v.length===0&&typeof d.output=="string")try{v=cn(JSON.parse(d.output));}catch{}v.length>0&&y.push({sessionUpdate:"plan",entries:v});}let w=li(p,g);if(w==="pending")return y;let S=ci(p,d),k=[];if(typeof S=="string"&&S.length>0&&k.push({type:"content",content:{type:"text",text:w==="failed"?`\`\`\`
|
|
34
|
-
${
|
|
35
|
-
\`\`\``:
|
|
33
|
+
\`\`\``}}),{sessionUpdate:"tool_call_update",toolCallId:c,status:a==="success"?"completed":"failed",content:s}}function r(o){let c=o.severity,a=o.message;return a?{sessionUpdate:"agent_message_chunk",content:{type:"text",text:`${c==="warning"?"\u26A0\uFE0F Warning":"\u274C Error"}: ${a}`}}:null}function i(o,c){let a=Yi[o]||"other",l=[],d=[],s=o;switch(o){case "read_file":s=`Read ${c.absolute_path||c.file_path||"file"}`,(c.absolute_path||c.file_path)&&d.push({path:c.absolute_path||c.file_path});break;case "write_file":s=`Write ${c.file_path||"file"}`,c.file_path&&(d.push({path:c.file_path}),l.push({type:"diff",path:c.file_path,oldText:null,newText:c.content||""}));break;case "edit_file":s=`Edit ${c.file_path||"file"}`,c.file_path&&d.push({path:c.file_path});break;case "replace":s=`Edit ${c.file_path||"file"}`,c.file_path&&(d.push({path:c.file_path}),(c.old_string!==void 0||c.new_string!==void 0)&&l.push({type:"diff",path:c.file_path,oldText:c.old_string||"",newText:c.new_string||""}));break;case "run_shell_command":case "shell":s=c.command?`\`${c.command}\``:"Run command",c.description&&l.push({type:"content",content:{type:"text",text:c.description}});break;case "brave_web_search":case "web_search":case "google_web_search":s=c.query?`"${c.query}"`:"Web search";break;case "web_fetch":s=c.prompt?`Fetch: ${c.prompt.substring(0,50)}...`:"Web fetch";break;case "glob":s=`Find ${c.pattern||"files"}`,c.dir_path&&d.push({path:c.dir_path});break;case "grep":case "search_file_content":s=`grep "${c.pattern||c.query||""}"`;break;case "list_directory":s=`List ${c.dir_path||c.path||"directory"}`,(c.dir_path||c.path)&&d.push({path:c.dir_path||c.path});break;case "read_many_files":s=`Read ${c.include?.length||"multiple"} files`,Array.isArray(c.include)&&c.include.forEach(p=>d.push({path:p}));break;case "delegate_to_agent":s=c.agent_name?`Agent: ${c.agent_name}`:"Delegate to agent";break;case "write_todos":s="Update todos";break;case "save_memory":s=c.fact?`Remember: "${c.fact.substring(0,40)}..."`:"Save memory";break;case "activate_skill":s=c.name?`Activate skill: ${c.name}`:"Activate skill";break;default:s=o;}return {title:s,kind:a,content:l,locations:d}}}var Xi={Read:"read",ReadFile:"read",ReadMediaFile:"read",Write:"edit",WriteFile:"edit",Edit:"edit",StrReplaceFile:"edit",Bash:"execute",Shell:"execute",Glob:"search",Grep:"search",WebSearch:"fetch",SearchWeb:"fetch",FetchURL:"fetch",Agent:"think",AgentSwarm:"think",Task:"think",Think:"think",CreateSubagent:"think",TodoList:"other",SetTodoList:"other"};function _n(t){return t==="TodoList"||t==="SetTodoList"}function Mt(t){return /<system>\s*ERROR:/i.test(t)||t.includes("<error>")||t.includes("ToolError")}function Rn(t){let e=/^data:([^;,]+)((?:;[^,]*)*),(.+)$/i.exec(t);if(!e)return null;let n=e[1]||"",r=e[2]||"",i=e[3]||"";return /;base64/i.test(r)?{mimeType:n,data:i}:null}function Dt(t){if(!t||typeof t!="object")return null;if(t.type==="text"&&typeof t.text=="string"&&t.text.length>0)return {type:"content",content:{type:"text",text:t.text}};if(t.type==="image_url"&&typeof t.image_url?.url=="string"){let e=t.image_url.url,n=Rn(e);return n?{type:"content",content:{type:"image",data:n.data,mimeType:n.mimeType}}:{type:"content",content:{type:"image",data:"",mimeType:"",uri:e}}}return t.type==="video_url"&&typeof t.video_url?.url=="string"?{type:"content",content:{type:"text",text:`[video] ${t.video_url.url}`}}:t.type==="audio_url"&&typeof t.audio_url?.url=="string"?{type:"content",content:{type:"text",text:`[audio] ${t.audio_url.url}`}}:null}function At(t){let e=[];if(typeof t=="string")return t.length>0&&e.push({type:"content",content:{type:"text",text:t}}),e;if(Array.isArray(t)){for(let n of t){if(typeof n=="string"&&n.length>0){e.push({type:"content",content:{type:"text",text:n}});continue}let r=Dt(n);r&&e.push(r);}return e}if(t&&typeof t=="object"){let n=Dt(t);n&&e.push(n);}return e}function Qi(t){return t.some(e=>e.type==="content"&&e.content.type==="text"&&Mt(e.content.text))}function Zi(t){if(!t||typeof t!="object")return null;if(t.type==="think"&&typeof t.think=="string"&&t.think.length>0)return {update:{sessionUpdate:"agent_thought_chunk",content:{type:"text",text:t.think}}};if(t.type==="text"&&typeof t.text=="string"&&t.text.length>0)return {update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:t.text}}};if(t.type==="image_url"&&typeof t.image_url?.url=="string"){let e=t.image_url.url,n=Rn(e);return n?{update:{sessionUpdate:"agent_message_chunk",content:{type:"image",data:n.data,mimeType:n.mimeType}}}:{update:{sessionUpdate:"agent_message_chunk",content:{type:"image",data:"",mimeType:"",uri:e}}}}return t.type==="video_url"&&typeof t.video_url?.url=="string"?{update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:`[video] ${t.video_url.url}`}}}:t.type==="audio_url"&&typeof t.audio_url?.url=="string"?{update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:`[audio] ${t.audio_url.url}`}}}:null}function es(t){return t==="in_progress"?"in_progress":t==="done"||t==="completed"?"completed":"pending"}function Tn(t){if(!t||typeof t!="object")return [];let e=t.todos;return Array.isArray(e)?e.map(n=>{if(!n||typeof n!="object")return null;let r=n.title;if(typeof r!="string"||r.length===0)return null;let i=n.status;return {content:r,status:es(i),priority:"medium"}}).filter(n=>n!==null):[]}function $t(){let t=new Set,e=0;function n(a,l){return typeof a=="string"&&a.length>0?a:(e+=1,`kimi_${l.replace(/[^a-zA-Z0-9_]/g,"_")||"tool"}_${e}`)}return function(l){let d;try{d=JSON.parse(l);}catch{return null}if(!d||typeof d!="object")return null;let s=d.role;return "_meta"in d||"_prompt"in d||s==="meta"?null:s==="assistant"?r(d):s==="tool"?i(d):typeof d.type=="string"&&"payload"in d?o(d):null};function r(a){let l=[],d=a.content,s=a.tool_calls;if(typeof d=="string"&&d.length>0)l.push({update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:d}}});else if(Array.isArray(d))for(let p of d){let u=Zi(p);u&&l.push(u);}if(Array.isArray(s))for(let p of s){if(!p||typeof p!="object")continue;let u=p.function;if(!u)continue;let g=u.name??"",f=n(p.id,g),m;try{m=u.arguments?JSON.parse(u.arguments):{};}catch{m=u.arguments;}if(_n(g)){let k=Tn(m);k.length>0&&l.push({update:{sessionUpdate:"plan",entries:k}}),t.add(f);continue}let{title:h,kind:y,toolContent:w,locations:b}=c(g,typeof m=="object"&&m!==null?m:{});l.push({update:{sessionUpdate:"tool_call",toolCallId:f,title:h,kind:y,status:"pending",rawInput:m,content:w,locations:b}});}return l.length>0?l:null}function i(a){let l=a.tool_call_id;if(typeof l!="string"||l.length===0)return null;if(t.has(l))return t.delete(l),null;let d=a.content,s=[],p=false;if(typeof d=="string")p=Mt(d),d.length>0&&s.push({type:"content",content:{type:"text",text:d}});else if(Array.isArray(d))for(let u of d){let g=Dt(u);g&&(g.type==="content"&&g.content.type==="text"&&Mt(g.content.text)&&(p=true),s.push(g));}return [{update:{sessionUpdate:"tool_call_update",toolCallId:l,status:p?"failed":"completed",content:s}}]}function o(a){let l=a.type,d=a.payload??{},s=[];switch(l){case "TextPart":{let p=d.text;typeof p=="string"&&p.length>0&&s.push({update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:p}}});break}case "ThinkPart":{let p=d.think;typeof p=="string"&&p.length>0&&s.push({update:{sessionUpdate:"agent_thought_chunk",content:{type:"text",text:p}}});break}case "ToolCall":{let p=d.function?.name??"",u=n(d.id,p),g=d.function;if(!g)break;let f;try{f=g.arguments?JSON.parse(g.arguments):{};}catch{f=g.arguments;}if(_n(p)){let b=Tn(f);b.length>0&&s.push({update:{sessionUpdate:"plan",entries:b}}),t.add(u);break}let{title:m,kind:h,toolContent:y,locations:w}=c(p,typeof f=="object"&&f!==null?f:{});s.push({update:{sessionUpdate:"tool_call",toolCallId:u,title:m,kind:h,status:"pending",rawInput:f,content:y,locations:w}});break}case "ToolResult":{let p=d.tool_call_id;if(typeof p!="string"||p.length===0)break;if(t.has(p)){t.delete(p);break}let u=d.return_value??d.content,g=[],f=d.is_error===true;if(u&&typeof u=="object"&&!Array.isArray(u)){let m=u;f=f||m.type==="ToolError"||m.is_error===true,g.push(...At(m.output)),g.length===0&&typeof m.message=="string"&&m.message.length>0&&g.push({type:"content",content:{type:"text",text:m.message}}),g.length===0&&g.push(...At(u));}else g.push(...At(u));f=f||Qi(g),s.push({update:{sessionUpdate:"tool_call_update",toolCallId:p,status:f?"failed":"completed",content:g}});break}default:return null}return s.length>0?s:null}function c(a,l){let d=Xi[a]||"other",s=[],p=[],u=a;switch(a){case "Read":case "ReadFile":{let g=l.path??l.file_path;u=`Read ${g||"file"}`,g&&p.push({path:g});break}case "ReadMediaFile":{let g=l.path??l.file_path;u=`Read media ${g||"file"}`,g&&p.push({path:g});break}case "Write":case "WriteFile":{let g=l.path??l.file_path;u=`Write ${g||"file"}`,g&&(p.push({path:g}),typeof l.content=="string"&&s.push({type:"diff",path:g,oldText:null,newText:l.content}));break}case "Edit":case "StrReplaceFile":{let g=l.path??l.file_path;u=`Edit ${g||"file"}`,g&&p.push({path:g});break}case "Bash":case "Shell":u=l.command?`\`${l.command}\``:"Run command";break;case "Glob":u=`Find ${l.pattern||"files"}`,l.path&&p.push({path:l.path});break;case "Grep":u=`grep "${l.pattern||""}"`,l.path&&p.push({path:l.path});break;case "WebSearch":case "SearchWeb":u=l.query?`"${l.query}"`:"Web search";break;case "FetchURL":u=l.url?`Fetch ${l.url}`:"Web fetch";break;case "Agent":case "AgentSwarm":case "Task":u=l.description||"Subagent task";break;case "Think":u=l.thought||"Thinking";break;case "CreateSubagent":u=l.name?`Subagent: ${l.name}`:"Create subagent";break;case "TodoList":case "SetTodoList":u="Update todos";break;default:u=a;}return {title:u,kind:d,toolContent:s,locations:p}}}var ts={read:"read",write:"edit",edit:"edit",multiedit:"edit",apply_patch:"edit",bash:"execute",glob:"search",grep:"search",list:"search",codesearch:"search",lsp:"search",webfetch:"fetch",websearch:"fetch",task:"think",batch:"think",plan_enter:"switch_mode",plan_exit:"switch_mode",todoread:"other",todowrite:"other",skill:"other",question:"other"};function ns(t){let e=/^data:([^;,]+)?((?:;[^,]+)*),(.*)$/s.exec(t);if(!e)return null;let n=e[1]||"",r=e[2]||"",i=e[3]||"";return /;base64/i.test(r)?{mimeType:n,data:i}:null}function rs(t){if(typeof t!="string")return "pending";switch(t.toLowerCase()){case "in_progress":case "in-progress":case "running":return "in_progress";case "completed":case "done":case "cancelled":return "completed";default:return "pending"}}function is(t){return t==="high"||t==="medium"||t==="low"?t:"medium"}function Pn(t){return Array.isArray(t)?t.map(e=>{if(!e||typeof e!="object")return null;let n=e.content;return typeof n!="string"||n.length===0?null:{content:n,status:rs(e.status),priority:is(e.priority)}}).filter(e=>e!==null):[]}function ss(t){if(!t||typeof t!="object")return null;let e=t,n=typeof e.mime=="string"?e.mime:"",r=typeof e.url=="string"?e.url:"";if(n.startsWith("image/")){if(r.length>0){let a=ns(r);return a?{type:"content",content:{type:"image",data:a.data,mimeType:a.mimeType||n}}:{type:"content",content:{type:"image",data:"",mimeType:n,uri:r}}}return null}return {type:"content",content:{type:"text",text:`[attachment] ${(typeof e.filename=="string"?e.filename:"")||"attachment"} (${n||"file"})`}}}function os(t,e){if(t==="error")return typeof e.error=="string"?e.error:null;if(typeof e.output=="string")return e.output;if(e.output===void 0||e.output===null)return null;try{return JSON.stringify(e.output)}catch{return String(e.output)}}function as(t,e){return t==="error"?"failed":t==="running"?"in_progress":t==="pending"?"pending":typeof e=="number"&&e!==0?"failed":"completed"}function Ut(){return function(c){let a;try{a=JSON.parse(c);}catch{return null}if(!a||typeof a!="object")return null;let l=a.sessionID,d=[];switch(a.type){case "step_start":case "step_finish":return null;case "text":{let s=t(a);s&&d.push({sessionId:l,update:s});break}case "reasoning":{let s=e(a);s&&d.push({sessionId:l,update:s});break}case "tool_use":{let s=n(a);for(let p of s)d.push({sessionId:l,update:p});break}case "error":{let s=r(a);s&&d.push({sessionId:l,update:s});break}default:return null}return d.length>0?d:null};function t(o){let c=o.part?.text;return typeof c!="string"||c.length===0?null:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:c}}}function e(o){let c=o.part?.text;return typeof c!="string"||c.length===0?null:{sessionUpdate:"agent_thought_chunk",content:{type:"text",text:c}}}function n(o){let c=o.part;if(!c)return [];let a=typeof c.callID=="string"?c.callID:"";if(a.length===0)return [];let l=typeof c.tool=="string"?c.tool.toLowerCase():"",d=typeof c.state=="object"&&c.state?c.state:{},s=typeof d.input=="object"&&d.input?d.input:{},p=d.status,u=d.title??d.metadata?.description??l,g=d.metadata?.exit,{kind:f,content:m,locations:h}=i(l,s),y=[];if(y.push({sessionUpdate:"tool_call",toolCallId:a,title:u,kind:f,status:"pending",rawInput:s,content:m,locations:h}),l==="todowrite"){let v=Pn(s.todos);if(v.length===0&&typeof d.output=="string")try{v=Pn(JSON.parse(d.output));}catch{}v.length>0&&y.push({sessionUpdate:"plan",entries:v});}let w=as(p,g);if(w==="pending")return y;let b=os(p,d),k=[];if(typeof b=="string"&&b.length>0&&k.push({type:"content",content:{type:"text",text:w==="failed"?`\`\`\`
|
|
34
|
+
${b}
|
|
35
|
+
\`\`\``:b}}),Array.isArray(d.attachments))for(let v of d.attachments){let S=ss(v);S&&k.push(S);}return y.push({sessionUpdate:"tool_call_update",toolCallId:a,status:w,content:k}),y}function r(o){let c=o.error?.name??"Error",a=o.error?.data?.message??o.error?.message??"Unknown error";return {sessionUpdate:"agent_message_chunk",content:{type:"text",text:`\u274C ${c}: ${a}`}}}function i(o,c){let a=ts[o]||"other",l=[],d=[];switch(o){case "read":{let s=c.filePath??c.path;if(s){let p=c.offset;d.push({path:s,line:typeof p=="number"&&Number.isFinite(p)?Math.max(0,p-1):void 0});}break}case "write":{let s=c.filePath??c.path;s&&(d.push({path:s}),typeof c.content=="string"&&l.push({type:"diff",path:s,oldText:null,newText:c.content}));break}case "edit":case "multiedit":{let s=c.filePath??c.path;s&&(d.push({path:s}),o==="edit"&&(c.oldString!==void 0||c.newString!==void 0)&&l.push({type:"diff",path:s,oldText:c.oldString??"",newText:c.newString??""}));break}case "apply_patch":break;case "bash":{let s=c.command;s&&c.description?l.push({type:"content",content:{type:"text",text:c.description}}):s&&l.push({type:"content",content:{type:"text",text:s}});break}case "glob":case "list":{let s=c.path;s&&d.push({path:s});break}case "grep":{let s=c.path;s&&d.push({path:s});break}case "codesearch":case "websearch":{let s=c.query;s&&l.push({type:"content",content:{type:"text",text:s}});break}case "webfetch":{let s=c.url;s&&l.push({type:"content",content:{type:"text",text:s}});break}case "task":{let s=c.description;s&&l.push({type:"content",content:{type:"text",text:s}});break}}return {kind:a,content:l,locations:d}}}var cs={Read:"read",read_file:"read",Write:"edit",Edit:"edit",write_file:"edit",edit_file:"edit",Bash:"execute",BashOutput:"execute",KillShell:"execute",shell:"execute",run_shell_command:"execute",WebFetch:"fetch",WebSearch:"fetch",brave_web_search:"fetch",Glob:"search",Grep:"search",LS:"search",list_directory:"search",Task:"think",TodoWrite:"other",ExitPlanMode:"switch_mode"};function Ye(){let t=new Map,e=new Map;return function(s){let p;try{p=JSON.parse(s);}catch{return null}if(!p||typeof p!="object")return null;let u=p;if("_meta"in u||"_prompt"in u)return null;let g=u.session_id||void 0,f=[];switch(u.type){case "assistant":{let m=n(u);for(let h of m)f.push({sessionId:g,update:h});break}case "stream_event":{let m=r(u);for(let h of m)f.push({sessionId:g,update:h});break}case "user":{let m=i(u);for(let h of m)f.push({sessionId:g,update:h});break}case "system":case "result":return null;default:return null}return f.length>0?f:null};function n(d){let s=[],p=d.message?.content;if(!Array.isArray(p))return s;for(let u of p){let g=o(u);s.push(...g);}return s}function r(d){let s=[],p=d.event;if(!p)return s;switch(p.type){case "content_block_start":{let u=p.index??0,g=p.content_block;g&&(t.set(u,g),g.type==="tool_use"&&e.set(u,""));break}case "content_block_delta":{let u=p.index??0,g=p.delta,f=t.get(u);if(g?.type==="text_delta"&&g.text)s.push({sessionUpdate:"agent_message_chunk",content:{type:"text",text:g.text}});else if(g?.type==="thinking_delta"&&g.thinking)s.push({sessionUpdate:"agent_thought_chunk",content:{type:"text",text:g.thinking}});else if(g?.type==="input_json_delta"&&g.partial_json&&f?.type==="tool_use"){let m=e.get(u)||"";e.set(u,m+g.partial_json);}break}case "content_block_stop":{let u=p.index??0,g=t.get(u);if(g&&!(g.type==="text"&&g.text)){if(!(g.type==="thinking"&&g.thinking)){if(g.type==="tool_use"){let f=g,m=e.get(u)||"";e.delete(u);let h=f.input;if(m)try{h=JSON.parse(m);}catch{}let y={...f,input:h},w=c(y);w&&s.push(w);}else if(g.type==="tool_result"){let f=a(g);f&&s.push(f);}}}t.delete(u);break}}return s}function i(d){let s=d.message?.content,p=[];if(typeof s=="string")return p.push({sessionUpdate:"user_message_chunk",content:{type:"text",text:s}}),p;if(Array.isArray(s)){for(let u of s)if(u.type==="text")p.push({sessionUpdate:"user_message_chunk",content:{type:"text",text:u.text}});else if(u.type==="tool_result"){let g=a(u);g&&p.push(g);}}return p}function o(d){switch(d.type){case "text":return d.text?[{sessionUpdate:"agent_message_chunk",content:{type:"text",text:d.text}}]:[];case "thinking":return d.thinking?[{sessionUpdate:"agent_thought_chunk",content:{type:"text",text:d.thinking}}]:[];case "tool_use":{let s=c(d);return s?[s]:[]}case "tool_result":{let s=a(d);return s?[s]:[]}}}function c(d){let s=d.id,p=d.name,u=d.input;if(p==="TodoWrite"&&Array.isArray(u?.todos))return {sessionUpdate:"plan",entries:u.todos.map(y=>({content:y.content,status:y.status||"pending",priority:"medium"}))};let{title:g,kind:f,content:m,locations:h}=l(p,u||{});return {sessionUpdate:"tool_call",toolCallId:s,title:g,kind:f,status:"pending",rawInput:u,content:m,locations:h}}function a(d){let s=d.tool_use_id,p=d.is_error??false,u=d.content,g=[];if(typeof u=="string"&&u.length>0)g.push({type:"content",content:{type:"text",text:p?`\`\`\`
|
|
36
36
|
${u}
|
|
37
37
|
\`\`\``:u}});else if(Array.isArray(u)){for(let f of u)if(f.type==="text"){let m=f.text;g.push({type:"content",content:{type:"text",text:p?`\`\`\`
|
|
38
38
|
${m}
|
|
39
|
-
\`\`\``:m}});}}return {sessionUpdate:"tool_call_update",toolCallId:
|
|
40
|
-
`),
|
|
41
|
-
Try
|
|
42
|
-
Try
|
|
43
|
-
Try installing: npm install @evolvingmachines/
|
|
44
|
-
Try
|
|
45
|
-
1. Set ${
|
|
46
|
-
2. Set ${
|
|
47
|
-
3. Set ${
|
|
48
|
-
4. Set ${
|
|
49
|
-
5. Pass sandbox explicitly: .withSandbox(provider)`)}function
|
|
39
|
+
\`\`\``:m}});}}return {sessionUpdate:"tool_call_update",toolCallId:s,status:p?"failed":"completed",content:g}}function l(d,s){let p=cs[d]||"other",u=[],g=[],f=d;switch(d){case "Read":case "read_file":f=`Read ${s.file_path||s.absolute_path||"file"}`,(s.file_path||s.absolute_path)&&g.push({path:s.file_path||s.absolute_path});break;case "Write":case "write_file":f=`Write ${s.file_path||"file"}`,s.file_path&&(g.push({path:s.file_path}),u.push({type:"diff",path:s.file_path,oldText:null,newText:s.content||""}));break;case "Edit":case "edit_file":f=`Edit ${s.file_path||"file"}`,s.file_path&&g.push({path:s.file_path});break;case "Bash":case "shell":case "run_shell_command":f=s.command?`\`${s.command}\``:"Run command",s.description&&u.push({type:"content",content:{type:"text",text:s.description}});break;case "WebFetch":f=s.url?`Fetch ${s.url}`:"Web fetch";break;case "WebSearch":case "brave_web_search":f=s.query?`"${s.query}"`:"Web search";break;case "Glob":f=`Find ${s.pattern||"files"}`,s.path&&g.push({path:s.path});break;case "Grep":f=`grep "${s.pattern||""}"`;break;case "LS":case "list_directory":f=`List ${s.path||"directory"}`,s.path&&g.push({path:s.path});break;case "Task":f=s.description||"Subagent task";break;case "TodoWrite":f="Update todos";break;case "ExitPlanMode":f="Exit plan mode";break;default:f=d;}return {title:f,kind:p,content:u,locations:g}}}function In(t){return Ye()(t)}function On(t){return !!t&&t.sessionUpdate!=="error"}function q(t){switch(t){case "claude":return He();case "codex":return We();case "gemini":return Je();case "qwen":return Ye();case "kimi":return $t();case "opencode":return Ut();case "droid":return qe();default:return ()=>null}}function ls(t,e){let n=e.trim();return n?q(t)(n):null}function ds(t,e){let n=[],r=e.split(`
|
|
40
|
+
`),i=q(t);for(let o of r){let c=o.trim();if(!c)continue;let a=i(c);a&&n.push(...a);}return n}function U(t){return t!==null&&typeof t=="object"&&"safeParse"in t&&typeof t.safeParse=="function"}function Q(t){return JSON.stringify(ps(t,{target:"jsonSchema7"}),null,2)}function Z(t){return JSON.stringify(t,null,2)}function An(t,e=false){let n={};function r(i,o){for(let c of B.readdirSync(i)){let a=fe.join(i,c),l=o?`${o}/${c}`:c;B.statSync(a).isDirectory()?e&&r(a,l):n[l]=B.readFileSync(a);}}return r(t,""),n}function Mn(t,e){for(let[n,r]of Object.entries(e)){let i=fe.join(t,n),o=fe.dirname(i);B.mkdirSync(o,{recursive:true});let c;r instanceof ArrayBuffer||r instanceof Uint8Array?c=Buffer.from(r):c=r,B.writeFileSync(i,c);}}function Qe(t){if(t.externalGateway){if(t.providerApiKey||t.providerBaseUrl||t.oauthToken)throw new Error("externalGateway cannot be combined with providerApiKey/providerBaseUrl/oauthToken (direct mode)");if(t.apiKey)throw new Error("externalGateway cannot be combined with apiKey (Evolve gateway mode)")}}function us(t){let e=t.replace(/^~/,process.env.HOME||"");if(!B.existsSync(e))throw new Error(`OAuth file not found: ${e}`);return B.readFileSync(e,"utf-8")}function Ze(t){let e=t?.type??m,n=D(e);if(t?.externalGateway){Qe(t);let{apiKey:c,baseUrl:a,revoke:l}=t.externalGateway;if(!c||!a||typeof l!="function")throw new Error("externalGateway requires apiKey, baseUrl, and a revoke() function");return {type:e,apiKey:c,baseUrl:a,isDirectMode:true,externalGateway:{revoke:l},model:t.model,reasoningEffort:t.reasoningEffort,maxContextSize:t.maxContextSize}}if(t?.oauthToken){if(e!=="claude")throw new Error(`oauthToken is only supported for claude agent (Claude Max subscription), not ${e}. Use providerApiKey for ${e} instead.`);return {type:e,apiKey:t.oauthToken,isDirectMode:true,isOAuth:true,model:t.model,reasoningEffort:t.reasoningEffort,maxContextSize:t.maxContextSize}}if(t?.providerApiKey){let c=n.baseUrlEnv?process.env[n.baseUrlEnv]:void 0,a=t.providerBaseUrl??c??n.defaultBaseUrl;return {type:e,apiKey:t.providerApiKey,baseUrl:a,isDirectMode:true,model:t.model,reasoningEffort:t.reasoningEffort,maxContextSize:t.maxContextSize}}if(t?.apiKey)return {type:e,apiKey:t.apiKey,isDirectMode:false,model:t.model,reasoningEffort:t.reasoningEffort,maxContextSize:t.maxContextSize};let r=process.env[h];if(r)return {type:e,apiKey:r,isDirectMode:false,model:t?.model,reasoningEffort:t?.reasoningEffort,maxContextSize:t?.maxContextSize};if(n.providerEnvMap){let a=(t?.model??n.defaultModel)?.split("/")[0],l=a?n.providerEnvMap[a]:void 0,d=l?process.env[l.keyEnv]:void 0;if(d){let p=(n.baseUrlEnv?process.env[n.baseUrlEnv]:void 0)??n.defaultBaseUrl;return {type:e,apiKey:d,baseUrl:p,isDirectMode:true,model:t?.model,reasoningEffort:t?.reasoningEffort,maxContextSize:t?.maxContextSize}}}let i=process.env[n.apiKeyEnv];if(i){let a=(n.baseUrlEnv?process.env[n.baseUrlEnv]:void 0)??n.defaultBaseUrl;return {type:e,apiKey:i,baseUrl:a,isDirectMode:true,model:t?.model,reasoningEffort:t?.reasoningEffort,maxContextSize:t?.maxContextSize}}if(n.oauthEnv){let c=process.env[n.oauthEnv];if(c){if(n.oauthFileName){let a=us(c);return {type:e,apiKey:"__oauth_file__",isDirectMode:true,isOAuth:true,oauthFileContent:a,model:t?.model,reasoningEffort:t?.reasoningEffort,maxContextSize:t?.maxContextSize}}return {type:e,apiKey:c,isDirectMode:true,isOAuth:true,model:t?.model,reasoningEffort:t?.reasoningEffort,maxContextSize:t?.maxContextSize}}}let o=n.oauthEnv?n.oauthFileName?`, or ${n.oauthEnv}`:`, oauthToken, or ${n.oauthEnv}`:"";throw new Error(`No API key found for ${e}. Set apiKey (gateway), providerApiKey (direct)${o}, or ${h} / ${n.apiKeyEnv} env var.`)}function gs(t){return `e2b_${Buffer.from(t,"utf8").toString("hex")}`}var Bn=new WeakSet;function Dn(t){return Bn.add(t),t}function me(t){return Bn.has(t)}function $n(t,e){return new Error(`${h} is set but ${t} failed to load.
|
|
41
|
+
Try installing: ${e}`)}function Un(t){return t.message?.includes("Cannot find module")||t.message?.includes("MODULE_NOT_FOUND")}async function he(t,e$1="e2b"){let n=t||process.env[h];if(!n)throw new Error(`${h} is required for Evolve-managed sandbox features`);if(!c.includes(e$1))throw new Error(`Unknown managed sandbox provider "${e$1}". Supported: ${c.join(", ")}`);if(e$1==="daytona")try{let{createDaytonaProvider:r}=await import('@evolvingmachines/daytona');return Dn(r({apiKey:n,apiUrl:d("daytona"),managedToolboxUrl:e()}))}catch(r){let i=r;throw Un(i)?$n("@evolvingmachines/daytona","npm install @evolvingmachines/daytona"):i}if(e$1==="modal")throw new Error('Managed Modal sandboxes are not available yet: the managed Modal API serves create/list/get/kill/exec and has no filesystem operations, which an agent session requires. Use managedSandbox("e2b") or managedSandbox("daytona"), or pass Modal tokens for direct mode.');try{let{createE2BProvider:r}=await import('@evolvingmachines/e2b');return Dn(r({apiKey:gs(n),apiUrl:f()}))}catch(r){let i=r;throw Un(i)?$n("@evolvingmachines/e2b","npm install @evolvingmachines/sdk"):i}}function fs(t="e2b",e){return he(e,t)}async function Bt(){let t=process.env[i];if(t)try{let{createE2BProvider:o}=await import('@evolvingmachines/e2b');return process.env.E2B_API_URL===f()&&delete process.env.E2B_API_URL,o({apiKey:t})}catch(o){let c=o;throw c.message?.includes("Cannot find module")||c.message?.includes("MODULE_NOT_FOUND")?new Error(`${i} is set but @evolvingmachines/e2b failed to load.
|
|
42
|
+
Try reinstalling: npm install @evolvingmachines/sdk`):c}let e=process.env[j$1];if(e)try{let{createDaytonaProvider:o}=await import('@evolvingmachines/daytona');return o({apiKey:e})}catch(o){let c=o;throw c.message?.includes("Cannot find module")||c.message?.includes("MODULE_NOT_FOUND")?new Error(`${j$1} is set but @evolvingmachines/daytona failed to load.
|
|
43
|
+
Try installing: npm install @evolvingmachines/daytona`):c}let n=process.env[k],r=process.env[l];if(n&&r)try{let{createModalProvider:o}=await import('@evolvingmachines/modal');return o({tokenId:n,tokenSecret:r})}catch(o){let c=o;throw c.message?.includes("Cannot find module")||c.message?.includes("MODULE_NOT_FOUND")?new Error(`${k} is set but @evolvingmachines/modal failed to load.
|
|
44
|
+
Try installing: npm install @evolvingmachines/modal`):c}let i$1=process.env[h];if(i$1)return he(i$1);throw new Error(`No sandbox provider configured. Either:
|
|
45
|
+
1. Set ${h} environment variable (recommended, get key at https://dashboard.evolvingmachines.ai)
|
|
46
|
+
2. Set ${i} environment variable (direct E2B access, get key at https://e2b.dev)
|
|
47
|
+
3. Set ${j$1} environment variable (direct Daytona access, get key at https://app.daytona.io)
|
|
48
|
+
4. Set ${k} and ${l} environment variables (direct Modal access, get tokens at https://modal.com/settings/tokens)
|
|
49
|
+
5. Pass sandbox explicitly: .withSandbox(provider)`)}function ms(t){return new Promise(e=>setTimeout(e,t))}async function A(t,e,n=0){let r=hs(e),i=e?.onItemRetry,o=null,c=0,a=r.backoffMs;for(;c<r.maxAttempts;){if(c++,o=await t(c),!r.retryOn(o))return o;if(c>=r.maxAttempts)break;if(i){let l=o.error??"Unknown error";i(n,c,l);}await ms(a),a*=r.backoffMultiplier;}return o}function hs(t){return {maxAttempts:t?.maxAttempts??3,backoffMs:t?.backoffMs??1e3,backoffMultiplier:t?.backoffMultiplier??2,retryOn:t?.retryOn??(e=>e.status==="error")}}var Ln=`## FILESYSTEM INSTRUCTIONS:
|
|
50
50
|
|
|
51
51
|
You are running in a sandbox environment.
|
|
52
52
|
|
|
@@ -79,7 +79,7 @@ Examples:
|
|
|
79
79
|
- "Generate a bar chart" \u2192 \`output/revenue_chart.png\`
|
|
80
80
|
- "Write a Python script" \u2192 \`output/parser.py\`
|
|
81
81
|
- "Convert this to JSON" \u2192 \`output/data.json\`
|
|
82
|
-
`;var
|
|
82
|
+
`;var Nn=`## FILESYSTEM INSTRUCTIONS:
|
|
83
83
|
|
|
84
84
|
You are running in a sandbox environment.
|
|
85
85
|
|
|
@@ -113,9 +113,9 @@ Examples:
|
|
|
113
113
|
- "Generate a bar chart" \u2192 \`output/revenue_chart.png\`
|
|
114
114
|
- "Write a Python script" \u2192 \`output/parser.py\`
|
|
115
115
|
- "Convert this to JSON" \u2192 \`output/data.json\`
|
|
116
|
-
`;var
|
|
116
|
+
`;var Fn=`## SYSTEM PROMPT
|
|
117
117
|
|
|
118
|
-
{{systemPrompt}}`;var
|
|
118
|
+
{{systemPrompt}}`;var Kn=`## STRUCTURED OUTPUT
|
|
119
119
|
|
|
120
120
|
Your final result MUST be saved to \`output/result.json\` following this schema:
|
|
121
121
|
|
|
@@ -133,13 +133,13 @@ You are free to:
|
|
|
133
133
|
But your final \`output/result.json\` MUST conform to the schema above.
|
|
134
134
|
|
|
135
135
|
### OUTPUT RESULTS (DELIVERABLES) MUST BE WRITTEN to \`output/result.json\` as files.
|
|
136
|
-
### Never just state results as text.`;var
|
|
136
|
+
### Never just state results as text.`;var jn=`## BROWSER AUTOMATION
|
|
137
137
|
|
|
138
138
|
Actionbook is preconfigured for remote browser automation in this environment. When browser automation is needed, start sessions with \`actionbook browser start --session s1\`, then use normal Actionbook browser commands. Do not override the configured browser mode or browser endpoint unless the user explicitly asks.
|
|
139
|
-
`;var
|
|
139
|
+
`;var Gn=`## Browser Automation
|
|
140
140
|
|
|
141
141
|
The agent-browser CDP connection is already configured. Use normal \`agent-browser\` commands when browser automation is needed.
|
|
142
|
-
`;var
|
|
142
|
+
`;var Vn=`### 1. YOUR ROLE: BEST OF N JUDGE
|
|
143
143
|
|
|
144
144
|
You are a judge. {{candidateCount}} AI workers attempted the same task independently. Your job is to analyze their solution attempts and pick the best one based on the evaluation criteria below.
|
|
145
145
|
|
|
@@ -169,7 +169,7 @@ You must judge their work based on:
|
|
|
169
169
|
5. Pick the best candidate (0-indexed)
|
|
170
170
|
|
|
171
171
|
**IMPORTANT:** Be thorough. Do not skip steps. Your judgment must be evidence-based \u2014 cite specific files, outputs, or discrepancies to justify your decision.
|
|
172
|
-
`;var
|
|
172
|
+
`;var zn=`### 1. YOUR ROLE: OUTPUT VERIFIER
|
|
173
173
|
|
|
174
174
|
You are a quality verifier. An AI worker produced output for a task. Your job is to verify whether the output meets the specified quality criteria.
|
|
175
175
|
|
|
@@ -202,14 +202,14 @@ The output must satisfy:
|
|
|
202
202
|
**IMPORTANT:** Be thorough and fair. Cite specific evidence. If the output generally achieves the goal with minor issues, consider passing. Only fail if there are significant problems that violate the criteria.
|
|
203
203
|
|
|
204
204
|
If failing, provide specific, actionable feedback explaining what needs to be fixed.
|
|
205
|
-
`;var
|
|
205
|
+
`;var Hn=`### CONTEXT STRUCTURE
|
|
206
206
|
|
|
207
207
|
\`\`\`
|
|
208
208
|
{{fileTree}}
|
|
209
209
|
\`\`\`
|
|
210
210
|
|
|
211
211
|
Examine all files within each item folder before producing your output.
|
|
212
|
-
`;var
|
|
212
|
+
`;var Wn="Evaluate the candidates and select the best one. You MUST save your decision to the file `output/result.json`.\n";var qn="Verify the worker output against the criteria. You MUST save your decision to the file `output/result.json`.\n";var Jn=`{{originalPrompt}}
|
|
213
213
|
|
|
214
214
|
## IMPORTANT: Previous Attempt Failed Verification
|
|
215
215
|
|
|
@@ -218,38 +218,414 @@ Your previous attempt did not pass quality verification. Please address this fee
|
|
|
218
218
|
{{feedback}}
|
|
219
219
|
|
|
220
220
|
Make sure your output addresses all the feedback points above.
|
|
221
|
-
`;var
|
|
221
|
+
`;var Yn=Ln,Xn=Nn,Qn=Fn,Zn=Kn,Lt=jn,er=Gn,Nt=Vn,tr=Wn,Ft=zn,nr=qn,rr=Hn,Kt=Jn;function j(t,e){let n=t;for(let[r,i]of Object.entries(e))n=n.replace(new RegExp(`\\{\\{${r}\\}\\}`,"g"),i);return n}function jt(t){let e=t.mode==="swe"?Xn:Yn,n=j(e,{workingDir:t.workingDir}).trim();if(t.browserPrompt&&(n+=`
|
|
222
222
|
|
|
223
223
|
|
|
224
224
|
${t.browserPrompt.trim()}`),t.systemPrompt&&(n+=`
|
|
225
225
|
|
|
226
226
|
|
|
227
|
-
${
|
|
227
|
+
${j(Qn,{systemPrompt:t.systemPrompt}).trim()}`),t.schema){let r=U(t.schema)?Q(t.schema):Z(t.schema);n+=`
|
|
228
228
|
|
|
229
229
|
|
|
230
|
-
${
|
|
231
|
-
(empty)`;let n="worker_task/system_prompt.txt"in t,r="worker_task/schema.json"in t,
|
|
232
|
-
`)}var
|
|
230
|
+
${j(Zn,{schema:r}).trim()}`;}return n}function et(t){let e=[...new Set(Object.keys(t).map(l=>l.split("/")[0]))].sort((l,d)=>l==="worker_task"?-1:d==="worker_task"?1:l.localeCompare(d));if(!e.length)return `context/
|
|
231
|
+
(empty)`;let n="worker_task/system_prompt.txt"in t,r="worker_task/schema.json"in t,i=Object.keys(t).some(l=>l.startsWith("worker_task/input/")),o=[];e.forEach((l,d)=>{let s=d===e.length-1,p=s?"\u2514\u2500\u2500 ":"\u251C\u2500\u2500 ",u=s?" ":"\u2502 ";if(l==="worker_task"){o.push({line:`${p}${l}/`,comment:"task given to worker"});let g=[];n&&g.push({name:"system_prompt.txt",comment:"worker system prompt"}),g.push({name:"user_prompt.txt",comment:"worker task prompt"}),r&&g.push({name:"schema.json",comment:"expected output schema"}),i&&g.push({name:"input/",comment:"worker input files"}),g.forEach((f,m)=>{let y=m===g.length-1?"\u2514\u2500\u2500 ":"\u251C\u2500\u2500 ";o.push({line:`${u}${y}${f.name}`,comment:f.comment});});}else if(l.startsWith("candidate_")){let g=l.replace("candidate_","");o.push({line:`${p}${l}/`,comment:`worker ${g} solution`});}else if(l==="worker_output")o.push({line:`${p}${l}/`,comment:"output to verify"});else if(l.startsWith("item_")){let g=l.replace("item_","");o.push({line:`${p}${l}/`,comment:`input ${g}`});}else o.push({line:`${p}${l}/`,comment:""});});let c=Math.max(...o.map(l=>l.line.length)),a=["context/"];for(let l of o)if(l.comment){let d=" ".repeat(c-l.line.length+3);a.push(`${l.line}${d}# ${l.comment}`);}else a.push(l.line);return a.join(`
|
|
232
|
+
`)}var ir=join(homedir(),w),ye=class{tag;timestamp;provider;agent;model;sandboxId;apiKey;dashboardUrl;localFilePath;observability;parser;isClosed=false;metaWritten=false;localQueue=Promise.resolve();dirReady=mkdir(ir,{recursive:true}).catch(()=>{});eventBuffer=[];dashboardQueue=Promise.resolve();flushTimer;constructor(e){this.validateConfig(e),this.provider=e.provider,this.agent=e.agent,this.model=e.model,this.sandboxId=e.sandboxId,this.apiKey=e.apiKey,this.dashboardUrl=b(),this.observability=e.observability,this.tag=e.tag||`${e.tagPrefix||"evolve"}-${randomBytes(8).toString("hex")}`,this.timestamp=new Date().toISOString();let n=this.timestamp.replace(/[:.]/g,"-"),r=`${this.tag}_${this.provider}_${this.sandboxId}_${this.agent}_${n}.jsonl`;this.localFilePath=join(ir,r),this.parser=q(e.agent);}getTag(){return this.tag}getTimestamp(){return this.timestamp}writePrompt(e){this.isClosed||this.write({_prompt:{text:e}});}writeEventParsed(e,n){if(!this.isClosed&&(this.writeLocalLine(e),this.apiKey&&n))for(let r of n)this.bufferForDashboard(r);}writeEvent(e){if(!this.isClosed&&(this.writeLocalLine(e),this.apiKey)){let n=this.parser(e);if(n)for(let r of n)this.bufferForDashboard(r);}}async flush(){await this.localQueue,await this.dashboardQueue,this.apiKey&&this.eventBuffer.length>0&&(this.flushDashboard(),await this.dashboardQueue);}async close(){this.isClosed||(this.flushTimer&&(clearTimeout(this.flushTimer),this.flushTimer=void 0),this.write({_sessionEnd:{timestamp:new Date().toISOString()}}),this.isClosed=true,await this.flush());}writeLocalLine(e){this.metaWritten||this.writeMeta();let n=e.endsWith(`
|
|
233
233
|
`)?e:e+`
|
|
234
234
|
`;this.localQueue=this.localQueue.then(()=>this.appendLocal(n)).catch(()=>{});}bufferForDashboard(e){this.eventBuffer.push(e),this.scheduleFlush();}write(e){this.metaWritten||this.writeMeta();let n=JSON.stringify(e)+`
|
|
235
235
|
`;this.localQueue=this.localQueue.then(()=>this.appendLocal(n)).catch(()=>{}),this.apiKey&&(this.eventBuffer.push(e),this.scheduleFlush());}writeMeta(){let e={_meta:{tag:this.tag,provider:this.provider,agent:this.agent,model:this.model,sandbox_id:this.sandboxId,timestamp:this.timestamp,...this.filterUndefined(this.observability)}},n=JSON.stringify(e)+`
|
|
236
|
-
`;this.localQueue=this.localQueue.then(()=>this.appendLocal(n)).catch(()=>{}),this.apiKey&&this.eventBuffer.push(e),this.metaWritten=true;}async appendLocal(e){try{await this.dirReady,await appendFile(this.localFilePath,e,"utf-8");}catch(n){console.debug("[SessionLogger] Local write failed:",n);}}scheduleFlush(){if(this.eventBuffer.length>=Qt){this.flushDashboard();return}!this.flushTimer&&!this.isClosed&&(this.flushTimer=setTimeout(()=>{this.flushTimer=void 0,this.flushDashboard();},Zt));}flushDashboard(){if(!this.apiKey||this.eventBuffer.length===0)return;let e=this.eventBuffer.splice(0);this.dashboardQueue=this.dashboardQueue.then(()=>this.sendToDashboard(e)).catch(()=>{});}async sendToDashboard(e){let n={tag:this.tag,provider:this.provider,agent:this.agent,model:this.model,sandboxId:this.sandboxId,timestamp:this.timestamp,...this.filterUndefined(this.observability),events:e};for(let r=1;r<=Ae;r++)try{let s=await fetch(`${this.dashboardUrl}/api/sessions/ingest`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`},body:JSON.stringify(n),signal:AbortSignal.timeout(1e4)});if(s.ok)return;if(s.status===429||s.status===401||s.status>=500){if(r===Ae){console.debug(`[SessionLogger] Dashboard ${s.status} after ${r} retries, requeueing`),this.requeueEvents(e);return}await this.delay(ot*r);continue}console.debug(`[SessionLogger] Dashboard ${s.status}, dropping events`);return}catch(s){r===Ae?(console.debug("[SessionLogger] Dashboard sync failed after retries, requeueing:",s),this.requeueEvents(e)):await this.delay(ot*r);}}requeueEvents(e){this.eventBuffer.unshift(...e);}validateConfig(e){let n=Te();if(e.apiKey&&!n.startsWith("https://")&&!n.includes("localhost")&&!n.includes("127.0.0.1"))throw new Error("Dashboard URL must use HTTPS when API key is provided")}delay(e){return new Promise(n=>setTimeout(n,e))}filterUndefined(e){return e?Object.fromEntries(Object.entries(e).filter(([,n])=>n!==void 0)):{}}};function le(t){return (t||process.env.EVOLVE_DASHBOARD_URL||_).replace(/\/$/,"")}function de(t){let e=t||process.env.EVOLVE_API_KEY;if(!e)throw new Error("EVOLVE_API_KEY is required for managed integrations");return e}async function pe(t){return await t.text().catch(()=>"")}function Ct(t){let e=t?.trim();if(!e)throw new Error('Integration userId is required; use "root" for dashboard-owned accounts');return e}function $i(t){let e=Array.from(new Set((t??[]).map(n=>n.trim()).filter(Boolean)));if(e.length===0)throw new Error("withIntegrations() requires at least one app");return e}async function $n(t){let e=await fetch(`${le(t.dashboardUrl)}/api/integration-sessions`,{method:"POST",headers:{Authorization:`Bearer ${de(t.apiKey)}`,"content-type":"application/json",accept:"application/json"},body:JSON.stringify({userId:Ct(t.userId),apps:$i(t.apps),tools:t.tools,accounts:t.accounts,keys:t.keys,authConfigs:t.authConfigs,sessionTag:t.sessionTag}),signal:AbortSignal.timeout(3e4)});if(!e.ok)throw new Error(`Managed integrations session create failed (${e.status}): ${await pe(e)}`);let n=await e.json();if(!n.mcp?.url)throw new Error("Managed integrations response missing mcp.url");return {url:n.mcp.url,headers:n.mcp.headers??{}}}async function Di(t){let e=await fetch(`${le(t.dashboardUrl)}/api/integrations/connect`,{method:"POST",headers:{Authorization:`Bearer ${de(t.apiKey)}`,"content-type":"application/json",accept:"application/json"},body:JSON.stringify({userId:Ct(t.userId),app:t.app,accountLabel:t.accountLabel}),signal:AbortSignal.timeout(3e4)});if(!e.ok)throw new Error(`Managed integration connect failed (${e.status}): ${await pe(e)}`);return await e.json()}async function Ui(t){let e=Array.from(new Set((t.userIds??[]).map(o=>Ct(o))));if(e.length===0)throw new Error("Integration accounts.list() requires at least one userId");let n=new URLSearchParams({userIds:e.join(",")});t.app&&n.set("app",t.app),t.statuses?.length&&n.set("statuses",t.statuses.join(","));let r={Authorization:`Bearer ${de(t.apiKey)}`,accept:"application/json"},s=await fetch(`${le(t.dashboardUrl)}/api/integrations/status?${n}`,{headers:r,signal:AbortSignal.timeout(3e4)});if(!s.ok)throw new Error(`Managed integration status failed (${s.status}): ${await pe(s)}`);return ((await s.json()).accounts??[]).map(o=>({userId:String(o.userId??""),app:String(o.app??""),appName:typeof o.appName=="string"?o.appName:void 0,appIcon:typeof o.appIcon=="string"?o.appIcon:void 0,accountLabel:typeof o.accountLabel=="string"?o.accountLabel:void 0,status:String(o.status??""),accountId:typeof o.accountId=="string"?o.accountId:void 0,updatedAt:typeof o.updatedAt=="string"?o.updatedAt:void 0}))}async function Bi(t){let e=await fetch(`${le(t.dashboardUrl)}/api/integrations/accounts/update`,{method:"POST",headers:{Authorization:`Bearer ${de(t.apiKey)}`,"content-type":"application/json",accept:"application/json"},body:JSON.stringify({accountId:t.accountId,accountLabel:t.accountLabel}),signal:AbortSignal.timeout(3e4)});if(!e.ok)throw new Error(`Managed integration account update failed (${e.status}): ${await pe(e)}`);return await e.json()}async function Li(t){let e=await fetch(`${le(t.dashboardUrl)}/api/integrations/disconnect`,{method:"POST",headers:{Authorization:`Bearer ${de(t.apiKey)}`,"content-type":"application/json",accept:"application/json"},body:JSON.stringify({accountId:t.accountId}),signal:AbortSignal.timeout(3e4)});if(!e.ok)throw new Error(`Managed integration account delete failed (${e.status}): ${await pe(e)}`);return await e.json()}var Dn={auth:Di,accounts:{list:Ui,update:Bi,delete:Li}};promisify(exec);var Pt=promisify(execFile),Ln=Symbol.for("evolve:awsSdkCache"),Fn=Symbol.for("evolve:s3ClientCache");var qi=3600,Yi=["node_modules","__pycache__","*.pyc",".cache",".npm",".pip",".venv","venv"];function Qi(t){if(t.startsWith("s3://")){let s=t.slice(5),a=s.indexOf("/");return a===-1?{bucket:s,prefix:""}:{bucket:s.slice(0,a),prefix:s.slice(a+1).replace(/\/+$/,"")}}let e=new URL(t),n=e.hostname,r=e.pathname.split("/").filter(Boolean);if(n.includes(".s3.")&&n.endsWith(".amazonaws.com"))return {bucket:n.split(".s3.")[0],prefix:r.join("/")};if(r.length===0)throw new Error(`Invalid storage URL: no bucket in path. Expected https://endpoint/bucket/prefix, got ${t}`);return {bucket:r[0],prefix:r.slice(1).join("/"),endpoint:`${e.protocol}//${e.host}`}}function Ve(t,e,n,r){if(!t?.url&&!t?.bucket){if(!e)throw new Error("Storage requires either a URL (BYOK mode) or gateway API key. Use .withStorage({ url: 's3://bucket/prefix' }) or configure EVOLVE_API_KEY for gateway mode.");return {bucket:"",prefix:"",region:t?.region||"us-east-1",mode:"gateway",gatewayUrl:n,gatewayApiKey:r}}let s=t?.bucket||"",a=t?.prefix||"",o=t?.endpoint;if(t?.url){let c=Qi(t.url);s=s||c.bucket,a=a||c.prefix,o=o||c.endpoint;}if(!s)throw new Error("Storage bucket is required. Provide url (s3://bucket/prefix) or explicit bucket name.");return {bucket:s,prefix:a,region:t?.region||process.env.AWS_REGION||"us-east-1",endpoint:o,credentials:t?.credentials,mode:"byok"}}function _t(t){if(t.includes(".."))throw new Error(`settingsDir must not contain '..': ${t}`);let e;if(t.startsWith("~/"))e=t.slice(2);else if(t.startsWith("/home/user/"))e=t.slice(11);else if(t.startsWith("."))e=t;else throw new Error(`Unexpected settingsDir: ${t}. Expected ~/ or /home/user/ prefix.`);if(!e||e.startsWith("/"))throw new Error(`settingsDir resolves to invalid path: ${t}`);return e}function Zi(t){if(t.includes(".."))throw new Error(`workingDir must not contain '..': ${t}`);if(!t.startsWith("/home/user/"))throw new Error(`Unexpected workingDir: ${t}. Must start with /home/user/.`);let e=t.slice(11).replace(/\/+$/,"");if(!e||e.startsWith("/")||e.includes("//"))throw new Error(`workingDir resolves to invalid path: ${t}`);return e}function ue(t){return "'"+t.replace(/'/g,"'\\''")+"'"}function Xi(t,e){let n=D(t),r=Zi(e),s=n.checkpointDirs?.length?n.checkpointDirs.map(c=>_t(c)):[_t(n.mcpConfig.settingsDir)],a=[...Yi.map(c=>`--exclude=${ue(c)}`),`--exclude=${ue(r+"/temp")}`,...(n.checkpointExcludes??[]).map(c=>`--exclude=${ue(_t(c))}`)].join(" "),o=[ue(r+"/"),...s.map(c=>ue(c+"/"))].join(" ");return [`tar -czf /tmp/evolve-ckpt.tar.gz -C /home/user ${a} ${o}`,"sha256sum /tmp/evolve-ckpt.tar.gz | awk '{print $1}'"].join(" && ")}async function Z(){let t=globalThis[Ln];if(t)return t;let e="@aws-sdk/client-s3",n="@aws-sdk/s3-request-presigner";try{let[r,s]=await Promise.all([Function("m","return import(m)")(e),Function("m","return import(m)")(n)]);return globalThis[Ln]={s3:r,presigner:s},{s3:r,presigner:s}}catch{throw new Error("Storage requires @aws-sdk/client-s3 and @aws-sdk/s3-request-presigner. Install: npm i @aws-sdk/client-s3 @aws-sdk/s3-request-presigner")}}async function fe(t){let e=t.credentials?`${t.credentials.accessKeyId}:${t.credentials.secretAccessKey.slice(-4)}`:"env",n=`${t.bucket}:${t.region}:${t.endpoint||""}:${e}`,r=globalThis[Fn];if(r?.key===n)return r.client;let{s3:s}=await Z(),a=new s.S3Client({region:t.region,...t.endpoint&&{endpoint:t.endpoint,forcePathStyle:true},...t.credentials&&{credentials:t.credentials}});return globalThis[Fn]={client:a,key:n},a}async function Hn(t,e,n){let{s3:r,presigner:s}=await Z(),a=await fe(t),o=n==="put"?new r.PutObjectCommand({Bucket:t.bucket,Key:e,ContentType:"application/gzip"}):new r.GetObjectCommand({Bucket:t.bucket,Key:e});return s.getSignedUrl(a,o,{expiresIn:qi})}async function Nn(t,e){let{s3:n}=await Z(),r=await fe(t);try{return await r.send(new n.HeadObjectCommand({Bucket:t.bucket,Key:e})),!0}catch(s){let a=s?.name||s?.message||"";if(s?.$metadata?.httpStatusCode===404||a==="NotFound"||a==="NoSuchKey")return false;throw s}}async function qn(t,e){let{s3:n}=await Z(),a=await(await(await fe(t)).send(new n.GetObjectCommand({Bucket:t.bucket,Key:e}))).Body?.transformToString();if(!a)throw new Error(`Empty response from S3 key: ${e}`);return JSON.parse(a)}async function es(t,e,n){let{s3:r}=await Z();await(await fe(t)).send(new r.PutObjectCommand({Bucket:t.bucket,Key:e,Body:JSON.stringify(n,null,2),ContentType:"application/json"}));}function Yn(t,e){return `${t.prefix?`${t.prefix}/`:""}data/${e}/archive.tar.gz`}function Qn(t,e){return `${t.prefix?`${t.prefix}/`:""}checkpoints/${e}.json`}function ts(){let t=Date.now().toString(36),e=Math.random().toString(36).slice(2,10);return `ckpt_${t}_${e}`}async function Zn(t,e,n,r){let s=await fetch(`${t.gatewayUrl}/api/checkpoints/presign`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t.gatewayApiKey}`},body:JSON.stringify({tag:e,hash:n,action:r})});if(!s.ok){let a=await s.text().catch(()=>"");throw new Error(`Gateway presign failed (${s.status}): ${a}`)}return s.json()}async function ns(t,e){let n=await fetch(`${t.gatewayUrl}/api/checkpoints`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t.gatewayApiKey}`},body:JSON.stringify(e)});if(!n.ok){let r=await n.text().catch(()=>"");throw new Error(`Gateway checkpoint create failed (${n.status}): ${r}`)}return n.json()}async function rs(t,e){let n=await fetch(`${t.gatewayUrl}/api/checkpoints/${encodeURIComponent(e)}`,{method:"GET",headers:{Authorization:`Bearer ${t.gatewayApiKey}`}});if(!n.ok){if(n.status===404)throw new Error(`Checkpoint ${e} not found`);let r=await n.text().catch(()=>"");throw new Error(`Gateway checkpoint get failed (${n.status}): ${r}`)}return n.json()}async function It(t,e,n,r,s){let a=new Date().toISOString(),o=Xi(n,r),c=await t.commands.run(o,{timeoutMs:12e4});if(c.exitCode!==0)throw new Error(`Checkpoint tar failed: ${c.stderr}`);let l=c.stdout.trim().split(`
|
|
237
|
-
`).pop()?.trim();if(!l||l.length!==64)throw new Error(`Invalid checkpoint hash: ${l}`);let d=await t.commands.run("stat -c '%s' /tmp/evolve-ckpt.tar.gz 2>/dev/null || stat -f '%z' /tmp/evolve-ckpt.tar.gz",{timeoutMs:1e4}),
|
|
238
|
-
`).pop()?.trim();if(l!==
|
|
239
|
-
`)){if(!
|
|
240
|
-
${n}`)}function
|
|
236
|
+
`;this.localQueue=this.localQueue.then(()=>this.appendLocal(n)).catch(()=>{}),this.apiKey&&this.eventBuffer.push(e),this.metaWritten=true;}async appendLocal(e){try{await this.dirReady,await appendFile(this.localFilePath,e,"utf-8");}catch(n){console.debug("[SessionLogger] Local write failed:",n);}}scheduleFlush(){if(this.eventBuffer.length>=x$1){this.flushDashboard();return}!this.flushTimer&&!this.isClosed&&(this.flushTimer=setTimeout(()=>{this.flushTimer=void 0,this.flushDashboard();},y));}flushDashboard(){if(!this.apiKey||this.eventBuffer.length===0)return;let e=this.eventBuffer.splice(0);this.dashboardQueue=this.dashboardQueue.then(()=>this.sendToDashboard(e)).catch(()=>{});}async sendToDashboard(e){let n={tag:this.tag,provider:this.provider,agent:this.agent,model:this.model,sandboxId:this.sandboxId,timestamp:this.timestamp,...this.filterUndefined(this.observability),events:e};for(let r=1;r<=z$1;r++)try{let i=await fetch(`${this.dashboardUrl}/api/sessions/ingest`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`},body:JSON.stringify(n),signal:AbortSignal.timeout(1e4)});if(i.ok)return;if(i.status===429||i.status===401||i.status>=500){if(r===z$1){console.debug(`[SessionLogger] Dashboard ${i.status} after ${r} retries, requeueing`),this.requeueEvents(e);return}await this.delay(A$1*r);continue}console.debug(`[SessionLogger] Dashboard ${i.status}, dropping events`);return}catch(i){r===z$1?(console.debug("[SessionLogger] Dashboard sync failed after retries, requeueing:",i),this.requeueEvents(e)):await this.delay(A$1*r);}}requeueEvents(e){this.eventBuffer.unshift(...e);}validateConfig(e){let n=b();if(e.apiKey&&!n.startsWith("https://")&&!n.includes("localhost")&&!n.includes("127.0.0.1"))throw new Error("Dashboard URL must use HTTPS when API key is provided")}delay(e){return new Promise(n=>setTimeout(n,e))}filterUndefined(e){return e?Object.fromEntries(Object.entries(e).filter(([,n])=>n!==void 0)):{}}};function we(t){return (t||process.env.EVOLVE_DASHBOARD_URL||s).replace(/\/$/,"")}function ve(t){let e=t||process.env.EVOLVE_API_KEY;if(!e)throw new Error("EVOLVE_API_KEY is required for managed integrations");return e}async function be(t){return await t.text().catch(()=>"")}function Gt(t){let e=t?.trim();if(!e)throw new Error('Integration userId is required; use "root" for dashboard-owned accounts');return e}function Ms(t){let e=Array.from(new Set((t??[]).map(n=>n.trim()).filter(Boolean)));if(e.length===0)throw new Error("withIntegrations() requires at least one app");return e}async function or(t){let e=await fetch(`${we(t.dashboardUrl)}/api/integration-sessions`,{method:"POST",headers:{Authorization:`Bearer ${ve(t.apiKey)}`,"content-type":"application/json",accept:"application/json"},body:JSON.stringify({userId:Gt(t.userId),apps:Ms(t.apps),tools:t.tools,accounts:t.accounts,keys:t.keys,authConfigs:t.authConfigs,sessionTag:t.sessionTag}),signal:AbortSignal.timeout(3e4)});if(!e.ok)throw new Error(`Managed integrations session create failed (${e.status}): ${await be(e)}`);let n=await e.json();if(!n.mcp?.url)throw new Error("Managed integrations response missing mcp.url");return {url:n.mcp.url,headers:n.mcp.headers??{}}}async function Ds(t){let e=await fetch(`${we(t.dashboardUrl)}/api/integrations/connect`,{method:"POST",headers:{Authorization:`Bearer ${ve(t.apiKey)}`,"content-type":"application/json",accept:"application/json"},body:JSON.stringify({userId:Gt(t.userId),app:t.app,accountLabel:t.accountLabel}),signal:AbortSignal.timeout(3e4)});if(!e.ok)throw new Error(`Managed integration connect failed (${e.status}): ${await be(e)}`);return await e.json()}async function $s(t){let e=Array.from(new Set((t.userIds??[]).map(c=>Gt(c))));if(e.length===0)throw new Error("Integration accounts.list() requires at least one userId");let n=new URLSearchParams({userIds:e.join(",")});t.app&&n.set("app",t.app),t.statuses?.length&&n.set("statuses",t.statuses.join(","));let r={Authorization:`Bearer ${ve(t.apiKey)}`,accept:"application/json"},i=await fetch(`${we(t.dashboardUrl)}/api/integrations/status?${n}`,{headers:r,signal:AbortSignal.timeout(3e4)});if(!i.ok)throw new Error(`Managed integration status failed (${i.status}): ${await be(i)}`);return ((await i.json()).accounts??[]).map(c=>({userId:String(c.userId??""),app:String(c.app??""),appName:typeof c.appName=="string"?c.appName:void 0,appIcon:typeof c.appIcon=="string"?c.appIcon:void 0,accountLabel:typeof c.accountLabel=="string"?c.accountLabel:void 0,status:String(c.status??""),accountId:typeof c.accountId=="string"?c.accountId:void 0,updatedAt:typeof c.updatedAt=="string"?c.updatedAt:void 0}))}async function Us(t){let e=await fetch(`${we(t.dashboardUrl)}/api/integrations/accounts/update`,{method:"POST",headers:{Authorization:`Bearer ${ve(t.apiKey)}`,"content-type":"application/json",accept:"application/json"},body:JSON.stringify({accountId:t.accountId,accountLabel:t.accountLabel}),signal:AbortSignal.timeout(3e4)});if(!e.ok)throw new Error(`Managed integration account update failed (${e.status}): ${await be(e)}`);return await e.json()}async function Bs(t){let e=await fetch(`${we(t.dashboardUrl)}/api/integrations/disconnect`,{method:"POST",headers:{Authorization:`Bearer ${ve(t.apiKey)}`,"content-type":"application/json",accept:"application/json"},body:JSON.stringify({accountId:t.accountId}),signal:AbortSignal.timeout(3e4)});if(!e.ok)throw new Error(`Managed integration account delete failed (${e.status}): ${await be(e)}`);return await e.json()}var ar={auth:Ds,accounts:{list:$s,update:Us,delete:Bs}};promisify(exec);var qt=promisify(execFile),dr=Symbol.for("evolve:awsSdkCache"),pr=Symbol.for("evolve:s3ClientCache");var qs=3600,Js=["node_modules","__pycache__","*.pyc",".cache",".npm",".pip",".venv","venv"];function Ys(t){if(t.startsWith("s3://")){let i=t.slice(5),o=i.indexOf("/");return o===-1?{bucket:i,prefix:""}:{bucket:i.slice(0,o),prefix:i.slice(o+1).replace(/\/+$/,"")}}let e=new URL(t),n=e.hostname,r=e.pathname.split("/").filter(Boolean);if(n.includes(".s3.")&&n.endsWith(".amazonaws.com"))return {bucket:n.split(".s3.")[0],prefix:r.join("/")};if(r.length===0)throw new Error(`Invalid storage URL: no bucket in path. Expected https://endpoint/bucket/prefix, got ${t}`);return {bucket:r[0],prefix:r.slice(1).join("/"),endpoint:`${e.protocol}//${e.host}`}}function nt(t,e,n,r){if(!t?.url&&!t?.bucket){if(!e)throw new Error("Storage requires either a URL (BYOK mode) or gateway API key. Use .withStorage({ url: 's3://bucket/prefix' }) or configure EVOLVE_API_KEY for gateway mode.");return {bucket:"",prefix:"",region:t?.region||"us-east-1",mode:"gateway",gatewayUrl:n,gatewayApiKey:r}}let i=t?.bucket||"",o=t?.prefix||"",c=t?.endpoint;if(t?.url){let a=Ys(t.url);i=i||a.bucket,o=o||a.prefix,c=c||a.endpoint;}if(!i)throw new Error("Storage bucket is required. Provide url (s3://bucket/prefix) or explicit bucket name.");return {bucket:i,prefix:o,region:t?.region||process.env.AWS_REGION||"us-east-1",endpoint:c,credentials:t?.credentials,mode:"byok"}}function Vt(t){if(t.includes(".."))throw new Error(`settingsDir must not contain '..': ${t}`);let e;if(t.startsWith("~/"))e=t.slice(2);else if(t.startsWith("/home/user/"))e=t.slice(11);else if(t.startsWith("."))e=t;else throw new Error(`Unexpected settingsDir: ${t}. Expected ~/ or /home/user/ prefix.`);if(!e||e.startsWith("/"))throw new Error(`settingsDir resolves to invalid path: ${t}`);return e}function Xs(t){if(t.includes(".."))throw new Error(`workingDir must not contain '..': ${t}`);if(!t.startsWith("/home/user/"))throw new Error(`Unexpected workingDir: ${t}. Must start with /home/user/.`);let e=t.slice(11).replace(/\/+$/,"");if(!e||e.startsWith("/")||e.includes("//"))throw new Error(`workingDir resolves to invalid path: ${t}`);return e}function Se(t){return "'"+t.replace(/'/g,"'\\''")+"'"}function Qs(t,e){let n=D(t),r=Xs(e),i=n.checkpointDirs?.length?n.checkpointDirs.map(a=>Vt(a)):[Vt(n.mcpConfig.settingsDir)],o=[...Js.map(a=>`--exclude=${Se(a)}`),`--exclude=${Se(r+"/temp")}`,...(n.checkpointExcludes??[]).map(a=>`--exclude=${Se(Vt(a))}`)].join(" "),c=[Se(r+"/"),...i.map(a=>Se(a+"/"))].join(" ");return [`tar -czf /tmp/evolve-ckpt.tar.gz -C /home/user ${o} ${c}`,"sha256sum /tmp/evolve-ckpt.tar.gz | awk '{print $1}'"].join(" && ")}async function te(){let t=globalThis[dr];if(t)return t;let e="@aws-sdk/client-s3",n="@aws-sdk/s3-request-presigner";try{let[r,i]=await Promise.all([Function("m","return import(m)")(e),Function("m","return import(m)")(n)]);return globalThis[dr]={s3:r,presigner:i},{s3:r,presigner:i}}catch{throw new Error("Storage requires @aws-sdk/client-s3 and @aws-sdk/s3-request-presigner. Install: npm i @aws-sdk/client-s3 @aws-sdk/s3-request-presigner")}}async function xe(t){let e=t.credentials?`${t.credentials.accessKeyId}:${t.credentials.secretAccessKey.slice(-4)}`:"env",n=`${t.bucket}:${t.region}:${t.endpoint||""}:${e}`,r=globalThis[pr];if(r?.key===n)return r.client;let{s3:i}=await te(),o=new i.S3Client({region:t.region,...t.endpoint&&{endpoint:t.endpoint,forcePathStyle:true},...t.credentials&&{credentials:t.credentials}});return globalThis[pr]={client:o,key:n},o}async function br(t,e,n){let{s3:r,presigner:i}=await te(),o=await xe(t),c=n==="put"?new r.PutObjectCommand({Bucket:t.bucket,Key:e,ContentType:"application/gzip"}):new r.GetObjectCommand({Bucket:t.bucket,Key:e});return i.getSignedUrl(o,c,{expiresIn:qs})}async function ur(t,e){let{s3:n}=await te(),r=await xe(t);try{return await r.send(new n.HeadObjectCommand({Bucket:t.bucket,Key:e})),!0}catch(i){let o=i?.name||i?.message||"";if(i?.$metadata?.httpStatusCode===404||o==="NotFound"||o==="NoSuchKey")return false;throw i}}async function Sr(t,e){let{s3:n}=await te(),o=await(await(await xe(t)).send(new n.GetObjectCommand({Bucket:t.bucket,Key:e}))).Body?.transformToString();if(!o)throw new Error(`Empty response from S3 key: ${e}`);return JSON.parse(o)}async function Zs(t,e,n){let{s3:r}=await te();await(await xe(t)).send(new r.PutObjectCommand({Bucket:t.bucket,Key:e,Body:JSON.stringify(n,null,2),ContentType:"application/json"}));}function kr(t,e){return `${t.prefix?`${t.prefix}/`:""}data/${e}/archive.tar.gz`}function xr(t,e){return `${t.prefix?`${t.prefix}/`:""}checkpoints/${e}.json`}function eo(){let t=Date.now().toString(36),e=Math.random().toString(36).slice(2,10);return `ckpt_${t}_${e}`}async function Cr(t,e,n,r){let i=await fetch(`${t.gatewayUrl}/api/checkpoints/presign`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t.gatewayApiKey}`},body:JSON.stringify({tag:e,hash:n,action:r})});if(!i.ok){let o=await i.text().catch(()=>"");throw new Error(`Gateway presign failed (${i.status}): ${o}`)}return i.json()}async function to(t,e){let n=await fetch(`${t.gatewayUrl}/api/checkpoints`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t.gatewayApiKey}`},body:JSON.stringify(e)});if(!n.ok){let r=await n.text().catch(()=>"");throw new Error(`Gateway checkpoint create failed (${n.status}): ${r}`)}return n.json()}async function no(t,e){let n=await fetch(`${t.gatewayUrl}/api/checkpoints/${encodeURIComponent(e)}`,{method:"GET",headers:{Authorization:`Bearer ${t.gatewayApiKey}`}});if(!n.ok){if(n.status===404)throw new Error(`Checkpoint ${e} not found`);let r=await n.text().catch(()=>"");throw new Error(`Gateway checkpoint get failed (${n.status}): ${r}`)}return n.json()}async function Jt(t,e,n,r,i){let o=new Date().toISOString(),c=Qs(n,r),a=await t.commands.run(c,{timeoutMs:12e4});if(a.exitCode!==0)throw new Error(`Checkpoint tar failed: ${a.stderr}`);let l=a.stdout.trim().split(`
|
|
237
|
+
`).pop()?.trim();if(!l||l.length!==64)throw new Error(`Invalid checkpoint hash: ${l}`);let d=await t.commands.run("stat -c '%s' /tmp/evolve-ckpt.tar.gz 2>/dev/null || stat -f '%z' /tmp/evolve-ckpt.tar.gz",{timeoutMs:1e4}),s=parseInt(d.stdout.trim(),10),p=Number.isNaN(s)?void 0:s,u;try{if(e.mode==="byok"){let g=kr(e,l);if(!await ur(e,g)){let h=await br(e,g,"put"),y=await t.commands.run(`curl -sf -X PUT -H "Content-Type: application/gzip" --upload-file /tmp/evolve-ckpt.tar.gz "${h}"`,{timeoutMs:3e5});if(y.exitCode!==0)throw new Error(`Checkpoint upload failed: ${y.stderr}`);if(!await ur(e,g))throw new Error("Checkpoint upload verification failed (HeadObject)")}u=eo();let m={id:u,hash:l,tag:i.tag,timestamp:o,sizeBytes:p,agentType:n,model:i.model,workspaceMode:i.workspaceMode,parentId:i.parentId,comment:i.comment,sandboxId:t.sandboxId};await Zs(e,xr(e,u),m);}else {let g=await Cr(e,i.tag,l,"put");if(!g.alreadyExists){let m=await t.commands.run(`curl -sf -X PUT -H "Content-Type: application/gzip" --upload-file /tmp/evolve-ckpt.tar.gz "${g.url}"`,{timeoutMs:3e5});if(m.exitCode!==0)throw new Error(`Checkpoint upload failed: ${m.stderr}`)}u=(await to(e,{tag:i.tag,hash:l,sizeBytes:p??0,agentType:n,model:i.model,workspaceMode:i.workspaceMode,parentId:i.parentId,comment:i.comment})).id;}}finally{await t.commands.run("rm -f /tmp/evolve-ckpt.tar.gz",{timeoutMs:1e4});}return {id:u,hash:l,tag:i.tag,timestamp:o,sizeBytes:p,agentType:n,model:i.model,workspaceMode:i.workspaceMode,parentId:i.parentId,comment:i.comment}}async function Er(t,e,n){let r=await Xt(e,n),i=r.hash,o={agentType:r.agentType,workspaceMode:r.workspaceMode},c=await Pr(e,r),a=await t.commands.run(`curl -sf -o /tmp/evolve-restore.tar.gz "${c}" && sha256sum /tmp/evolve-restore.tar.gz | awk '{print $1}'`,{timeoutMs:3e5});if(a.exitCode!==0)throw new Error(`Checkpoint download failed: ${a.stderr}`);let l=a.stdout.trim().split(`
|
|
238
|
+
`).pop()?.trim();if(l!==i)throw await t.commands.run("rm -f /tmp/evolve-restore.tar.gz",{timeoutMs:1e4}),new Error(`Checkpoint integrity check failed (expected ${i}, got ${l})`);let d=await t.commands.run("tar -xzf /tmp/evolve-restore.tar.gz -C /home/user && rm -f /tmp/evolve-restore.tar.gz",{timeoutMs:12e4});if(d.exitCode!==0)throw new Error(`Checkpoint extraction failed: ${d.stderr}`);return o}function _r(t,e){let n=e?.gatewayApiKey||process.env.EVOLVE_API_KEY,r=e?.gatewayUrl||s,i=!t.url&&!t.bucket&&!!n;return nt(t,i,r,n)}async function Tr(t,e){let{s3:n}=await te(),r=await xe(t),o=`${t.prefix?`${t.prefix}/`:""}checkpoints/`,c=[],a;do{let u={Bucket:t.bucket,Prefix:o,...a&&{ContinuationToken:a}},g=await r.send(new n.ListObjectsV2Command(u));if(g.Contents)for(let f of g.Contents)f.Key?.endsWith(".json")&&f.LastModified&&c.push({key:f.Key,lastModified:f.LastModified});a=g.IsTruncated?g.NextContinuationToken:void 0;}while(a);if(c.length===0)return [];c.sort((u,g)=>{let f=g.lastModified.getTime()-u.lastModified.getTime();return f!==0?f:g.key<u.key?-1:g.key>u.key?1:0});let d=!!e?.tag?c:e?.limit?c.slice(0,e.limit):c,p=(await Promise.all(d.map(async u=>{try{return await Sr(t,u.key)}catch{return null}}))).filter(u=>u!==null);return e?.tag&&(p=p.filter(u=>u.tag===e.tag)),e?.limit&&p.length>e.limit&&(p=p.slice(0,e.limit)),p}async function Rr(t,e){let n=new URLSearchParams;e?.limit&&n.set("limit",String(e.limit)),e?.tag&&n.set("tag",e.tag);let r=`${t.gatewayUrl}/api/checkpoints${n.toString()?`?${n}`:""}`,i=await fetch(r,{method:"GET",headers:{Authorization:`Bearer ${t.gatewayApiKey}`}});if(!i.ok){let o=await i.text().catch(()=>"");throw new Error(`Gateway list checkpoints failed (${i.status}): ${o}`)}return i.json()}function ro(t){return t&&t>0?Math.min(t,500):100}async function Yt(t,e){return t.mode==="byok"?(await Tr(t,{limit:1,tag:e?.tag}))[0]??null:(await Rr(t,{limit:1,tag:e?.tag}))[0]??null}async function Xt(t,e){if(t.mode==="byok"){let n=xr(t,e);try{return await Sr(t,n)}catch(r){throw io(r)?new Error(`Checkpoint ${e} not found`):r}}else return await no(t,e)}async function gr(t,e,n){if(e==="latest"){let r=await Yt(t,{tag:n});if(!r)throw new Error("No checkpoints found");return r.id}return e}async function Pr(t,e){if(t.mode==="byok")return br(t,kr(t,e.hash),"get");{let n=await Cr(t,e.tag,e.hash,"get");if(!n.url)throw new Error("Gateway presign returned no download URL");return n.url}}function Ir(t){return !(!t||isAbsolute(t)||t.startsWith("-")||normalize(t).startsWith("..")||t.includes("\0"))}function fr(t,e){let n=resolve(t,e),r=resolve(t),i=relative(r,n);if(i.startsWith("..")||isAbsolute(i))throw new Error(`Path traversal detected: "${e}" resolves outside target directory`)}function io(t){let e=t.name,n=t.message;return t?.$metadata?.httpStatusCode===404||e==="NoSuchKey"||e==="NotFound"||n==="NoSuchKey"}function zt(t){let e=t.filter(n=>!Ir(n));if(e.length>0)throw new Error(`Archive contains unsafe path(s): ${e.slice(0,3).join(", ")}`);return t}var Or=10*1024*1024,mr=false;async function Ar(){if(!mr)try{await qt("tar",["--version"]),mr=!0;}catch{throw new Error("The 'tar' command is not available on this system. Storage download/extract requires tar (available on macOS, Linux, and Windows with Git Bash or WSL).")}}async function hr(t,e){let n=await Xt(t,e),r=await Pr(t,n),i=e.replace(/[^a-zA-Z0-9_-]/g,"_"),o=join(tmpdir(),`evolve-dl-${i}-${Date.now()}.tar.gz`),c=await fetch(r);if(!c.ok)throw new Error(`Checkpoint download failed (${c.status})`);if(!c.body)throw new Error("Checkpoint download returned empty body");let a=createHash("sha256"),l=createWriteStream(o);try{let s=c.body.getReader();await new Promise((p,u)=>{l.on("error",u),l.on("finish",p);async function g(){for(;;){let{done:f,value:m}=await s.read();if(f){l.end();break}a.update(m),l.write(m)||await new Promise(h=>l.once("drain",h));}}g().catch(u);});}catch(s){throw l.destroy(),await unlink(o).catch(()=>{}),s}let d=a.digest("hex");if(d!==n.hash)throw await unlink(o).catch(()=>{}),new Error(`Checkpoint integrity check failed (expected ${n.hash}, got ${d})`);return {tmpPath:o,metadata:n}}async function yr(t){await Ar();let{stdout:e}=await qt("tar",["-tvzf",t],{maxBuffer:Or}),n=new Set,r=[],i=[];for(let o of e.trim().split(`
|
|
239
|
+
`)){if(!o||o.startsWith("total "))continue;let c=o[0];if(c!=="-"&&c!=="d"&&c!=="l")throw new Error(`Archive contains unsupported entry type: "${c}"`);let a=o.match(/\d{2}:\d{2}\s+(.+)/)??o.match(/[A-Z][a-z]{2}\s+\d{1,2}\s+\d{4}\s+(.+)/);if(!a)continue;let l=a[1];if(c==="l"){let d=l.indexOf(" -> ");d!==-1&&(l=l.slice(0,d)),n.add(l);}else c==="d"?r.push(l.replace(/\/$/,"")):i.push(l);}return zt(r),zt([...n]),zt(i)}async function Ht(t,e,n){await Ar(),await mkdir(e,{recursive:true});let r=["-xzf",t,"--no-same-owner","--no-same-permissions","-C",e];n?.length&&r.push("--",...n),await qt("tar",r,{maxBuffer:Or});}function so(t){let e="^",n=0;for(;n<t.length;){let r=t[n];r==="*"&&t[n+1]==="*"?t[n+2]==="/"?(e+="(?:.*/)?",n+=3):(e+=".*",n+=2):r==="*"?(e+="[^/]*",n++):r==="?"?(e+="[^/]",n++):".+^${}()|[]\\".includes(r)?(e+="\\"+r,n++):(e+=r,n++);}return e+="$",new RegExp(e)}function Qt(t,e){let n=_r(t,e);return Mr(n)}function oo(t){let e=_r(t||{});return Mr(e)}function Mr(t){return {async listCheckpoints(e){let n=ro(e?.limit);return t.mode==="byok"?Tr(t,{limit:n,tag:e?.tag}):Rr(t,{limit:n,tag:e?.tag})},async getCheckpoint(e){return Xt(t,e)},async downloadCheckpoint(e,n){let r=n?.extract!==false,i=n?.to||process.cwd(),o=await gr(t,e),{tmpPath:c,metadata:a}=await hr(t,o);try{if(r)return await mkdir(i,{recursive:!0}),await yr(c),await Ht(c,i),i;{await mkdir(i,{recursive:!0});let l=join(i,`checkpoint-${a.id}.tar.gz`);return await copyFile(c,l),l}}finally{await unlink(c).catch(()=>{});}},async downloadFiles(e,n){let r=await gr(t,e),{tmpPath:i}=await hr(t,r),o;try{let c=await yr(i),a;if(n?.files){let d=n.files.filter(p=>!Ir(p));if(d.length>0)throw new Error(`Unsafe file path requested: ${d[0]}`);let s=new Set(n.files);a=c.filter(p=>s.has(p));}else if(n?.glob){let d=n.glob.map(so);a=c.filter(s=>d.some(p=>p.test(s)));}else a=c;if(a.length===0)return {};o=join(tmpdir(),`evolve-extract-${Date.now()}`);try{await Ht(i,o,a);}catch(d){let s=d?.message??"";if(!s.includes("E2BIG")&&!s.includes("Argument list too long")&&!s.includes("ENAMETOOLONG"))throw d;await rm(o,{recursive:!0,force:!0}).catch(()=>{}),o=join(tmpdir(),`evolve-extract-${Date.now()}`),await Ht(i,o);}let l={};return await Promise.all(a.map(async d=>{fr(o,d),l[d]=await readFile(join(o,d));})),n?.to&&(await mkdir(n.to,{recursive:!0}),await Promise.all(Object.entries(l).map(async([d,s])=>{fr(n.to,d);let p=join(n.to,d);await mkdir(dirname(p),{recursive:!0}),await writeFile(p,s);}))),l}finally{o&&await rm(o,{recursive:true,force:true}).catch(()=>{}),await unlink(i).catch(()=>{});}}}}function G(t){return `'${t.replace(/'/g,"'\\''")}'`}function rt(t){return typeof t=="string"&&t.length>0}function ne(t,e,n){let r=t[e];if(!rt(r))throw new Error(`withPlugins() for ${n} requires ${e}`);return r}function ao(t,e){let n=e.stderr||e.stdout||`exit code ${e.exitCode}`;return new Error(`Plugin setup failed while running: ${t}
|
|
240
|
+
${n}`)}function co(t,e){switch(t){case "droid":{let n=ne(e,"marketplace",t),r=ne(e,"plugin",t);return [`droid plugin marketplace add ${G(n)}`,`droid plugin install ${G(r)} --scope user`]}case "claude":{let n=ne(e,"marketplace",t),r=ne(e,"plugin",t);return [`claude plugin marketplace add ${G(n)} --scope user`,`claude plugin install ${G(r)} --scope user`]}case "gemini":{let n=ne(e,"source",t),r=e,i=[`gemini extensions install ${G(n)}`];return rt(r.ref)&&i.push(`--ref ${G(r.ref)}`),r.autoUpdate===true&&i.push("--auto-update"),r.preRelease===true&&i.push("--pre-release"),i.push("--consent"),r.skipSettings===true&&i.push("--skip-settings"),[i.join(" ")]}case "codex":{if("plugin"in e)throw new Error("withPlugins() for codex registers marketplaces only; codex has no plugin install command");let n=ne(e,"marketplace",t),r=e,i=[`codex plugin marketplace add ${G(n)}`];if(rt(r.ref)&&i.push(`--ref ${G(r.ref)}`),Array.isArray(r.sparse))for(let o of r.sparse){if(!rt(o))throw new Error("withPlugins() for codex requires sparse entries to be non-empty strings");i.push(`--sparse ${G(o)}`);}return [i.join(" ")]}default:throw new Error(`withPlugins() is not supported for ${t}`)}}async function Dr(t,e,n){if(n?.length)for(let r of n){let i=co(t,r);for(let o of i){let c=await e.commands.run(o,{timeoutMs:12e4});if(c.exitCode!==0)throw ao(o,c)}}}var lo=["actionbook","active-research","extract"],po=["agent-browser"],uo={actionbook:lo,"agent-browser":po},Lr="/home/user/.agent-browser",$r=`${Lr}/config.json`,Nr="/home/user/.actionbook",go=`${Nr}/config.toml`;function Ur(t){return t==="actionbook"||t==="agent-browser"}function fo(t){return t.remote===true}function Br(t){if(t==null)return;if(typeof t!="string")throw new Error("browser profile must be a string");let e=t.trim();if(!e)throw new Error("browser profile cannot be empty");return e}function Fr(t){if(typeof t=="string"){if(t==="browser-use")return {provider:"browser-use",managed:false};if(Ur(t))return {provider:t,managed:false};throw new Error("Unsupported browser configuration")}if(t.provider===void 0)return {provider:"agent-browser",managed:t.remote!==false,profile:Br(t.profile)};if(Ur(t.provider))return {provider:t.provider,managed:fo(t),profile:Br(t.profile)};throw new Error("Unsupported browser configuration")}function Kr(t,e){return Array.from(new Set([...e??[],...uo[t]]))}function Zt(t,e){return t==="actionbook"?{envs:{},files:[{path:go,data:`version = 1
|
|
241
241
|
|
|
242
242
|
[browser]
|
|
243
243
|
mode = "cloud"
|
|
244
244
|
cdp_endpoint = ${JSON.stringify(e.cdpUrl)}
|
|
245
|
-
`}],directories:[
|
|
246
|
-
`}],directories:[
|
|
247
|
-
`)}var Is=262144,Os=new Set(["low","medium","high","xhigh","max"]);function Rr(t){if(t)return Os.has(t)?t:void 0}function As(t){let e=t.replace(/\/+$/,"");return e.endsWith("/v1")?e:`${e}/v1`}var ye=class{agentConfig;options;sandbox;hasRun=false;workingDir;lastRunTimestamp;registry;sessionTag;previousSessionTag;sessionLogger;activeCommand;activeProcessId=null;activeOperationId=null;activeOperationKind=null;nextOperationId=0;interruptedOperations=new Set;sandboxState;agentState="idle";droidSessionId;managedBrowserSession;providerRuntimeToken;skills;storage;lastCheckpointId;zodSchema;jsonSchema;schemaOptions;compiledValidator;constructor(e,n={}){if(this.agentConfig=e,this.options=n,this.workingDir=n.workingDirectory||qt,this.sandboxState=n.sandboxId?"ready":"stopped",this.skills=n.skills,this.storage=n.storage,n.schema)if(M(n.schema))this.zodSchema=n.schema,n.schemaOptions&&console.warn("[Evolve] schemaOptions ignored for Zod schemas - use .passthrough(), .strip(), z.coerce instead");else {this.jsonSchema=n.schema,this.schemaOptions=n.schemaOptions;try{let r=this.createAjvValidator();this.compiledValidator=r.compile(this.jsonSchema);}catch(r){throw new Error(`Invalid JSON Schema: ${r.message}`)}}this.registry=D(e.type),this.sessionTag=Er(n.sessionTagPrefix||"evolve");}browserRuntimeInfo(){if(this.managedBrowserSession)return {liveUrl:this.managedBrowserSession.liveUrl,sessionId:this.managedBrowserSession.sessionId,sessionTag:this.managedBrowserSession.sessionTag}}browserResponseInfo(){if(this.managedBrowserSession)return {liveUrl:this.managedBrowserSession.liveUrl}}emitLifecycle(e,n){let r=this.browserRuntimeInfo();e?.onLifecycle?.({sandboxId:this.getSession(),sandbox:this.sandboxState,agent:this.agentState,timestamp:new Date().toISOString(),reason:n,...r?{browser:r}:{}});}invalidateActiveOperation(){this.activeCommand=void 0,this.activeProcessId=null,this.activeOperationId=null,this.activeOperationKind=null;}beginOperation(e,n,r,s){let a=++this.nextOperationId;return this.activeOperationId=a,this.activeOperationKind=e,this.activeCommand=n,this.activeProcessId=n.processId,this.sandboxState="running",this.agentState="running",this.emitLifecycle(r,s),a}finalizeOperation(e,n,r,s="idle",a="ready"){return this.activeOperationId!==e?false:(this.invalidateActiveOperation(),this.sandboxState=a,this.agentState=s,this.emitLifecycle(n,r),true)}watchBackgroundOperation(e,n,r,s,a){let o=n==="run"?"run_background_complete":"command_background_complete",c=n==="run"?"run_background_failed":"command_background_failed",l=n==="run"?"run_interrupted":"command_interrupted";r.wait().then(async d=>{if(this.interruptedOperations.delete(e)||d.exitCode===130){this.finalizeOperation(e,s,l,"interrupted");return}n==="run"&&a&&await this.writeDroidSessionState(a);let p=d.exitCode===0?o:c,u=d.exitCode===0?"idle":"error";this.finalizeOperation(e,s,p,u);}).catch(()=>{this.interruptedOperations.delete(e),this.finalizeOperation(e,s,c,"error");});}createAjvValidator(){let n={...qe[this.schemaOptions?.mode||"loose"],...this.schemaOptions?.coerceTypes!==void 0&&{coerceTypes:this.schemaOptions.coerceTypes},...this.schemaOptions?.removeAdditional!==void 0&&{removeAdditional:this.schemaOptions.removeAdditional},...this.schemaOptions?.useDefaults!==void 0&&{useDefaults:this.schemaOptions.useDefaults},...this.schemaOptions?.allErrors!==void 0&&{allErrors:this.schemaOptions.allErrors}};return new Es({...n,strict:false})}async getSandbox(e){if(this.sandbox)return this.sandbox;if(!this.options.sandboxProvider)throw new Error("No sandbox provider configured");let n=this.options.sandboxProvider;this.sandboxState="booting",this.emitLifecycle(e,"sandbox_boot");let r=false;try{if(this.options.sandboxId)(this.options.mcpServers||this.options.integrations||this.options.plugins||this.options.context||this.options.files||this.options.systemPrompt||this.options.managedBrowser||this.options.browserCredentials)&&console.warn("[Evolve] Connecting to existing sandbox - ignoring mcpServers, integrations, plugins, context, files, systemPrompt, managed browser setup, and browser credentials"),this.sandbox=await n.connect(this.options.sandboxId),this.hasRun=!0,await this.loadDroidSessionState(this.sandbox),this.sandboxState="ready",this.agentState="idle",this.emitLifecycle(e,"sandbox_connected");else {await this.ensureManagedBrowserSession(e),await this.ensureProviderRuntimeToken();let s=this.buildEnvironmentVariables();this.sandbox=await n.create({envs:s,workingDirectory:this.workingDir}),r=!0,await this.bindProviderRuntimeToken(this.sandbox.sandboxId),await this.setupManagedBrowser(this.sandbox),await this.setupAgentAuth(this.sandbox),await this.setupAgentPlugins(this.sandbox),await this.setupWorkspace(this.sandbox),this.sandboxState="ready",this.agentState="idle",this.emitLifecycle(e,"sandbox_ready");}}catch(s){throw r&&this.sandbox&&(await this.sandbox.kill().catch(()=>{}),this.sandbox=void 0),await this.closeManagedBrowserSession().catch(()=>{}),await this.closeProviderRuntimeToken().catch(()=>{}),this.sandboxState="error",this.agentState="error",this.emitLifecycle(e,"sandbox_error"),s}return this.sandbox}buildEnvironmentVariables(){let e={},n=this.validatedUserSecretsForEnvironment();if(this.agentConfig.type==="kimi"&&this.agentConfig.isDirectMode){let r=ne(this.agentConfig.reasoningEffort),s=Rr(this.agentConfig.reasoningEffort);e.KIMI_MODEL_NAME=this.resolveCommandModel(this.agentConfig.model||this.registry.defaultModel),e.KIMI_MODEL_API_KEY=this.agentConfig.apiKey,e.KIMI_MODEL_PROVIDER_TYPE="kimi",e.KIMI_MODEL_MAX_CONTEXT_SIZE=String(this.registry.spendTrackingTomlProvider?.maxContextSize??Is),e.KIMI_MODEL_DEFAULT_THINKING=r?"true":"false",e.KIMI_MODEL_THINKING_MODE=r?"on":"off",s&&(e.KIMI_MODEL_THINKING_EFFORT=s),this.agentConfig.baseUrl&&(e.KIMI_MODEL_BASE_URL=this.agentConfig.baseUrl);}else if(this.agentConfig.oauthFileContent)this.registry.oauthActivationEnv&&(e[this.registry.oauthActivationEnv.key]=this.registry.oauthActivationEnv.value);else if(!(this.agentConfig.type==="kimi"&&!this.agentConfig.isDirectMode)){if(!(this.registry.skipApiKeyEnvInGateway&&!this.agentConfig.isDirectMode))if(this.registry.providerEnvMap&&!this.agentConfig.isDirectMode)for(let r of Object.values(this.registry.providerEnvMap))e[r.keyEnv]=this.agentConfig.apiKey;else {let r=this.agentConfig.model?.split("/")[0],s=r?this.registry.providerEnvMap?.[r]:void 0,a=s?s.keyEnv:this.registry.apiKeyEnv,o=this.agentConfig.isOAuth&&this.registry.oauthEnv?this.registry.oauthEnv:a;e[o]=this.agentConfig.apiKey;}}if(this.agentConfig.isDirectMode&&!this.agentConfig.isOAuth&&this.agentConfig.type!=="kimi")this.agentConfig.baseUrl&&this.registry.baseUrlEnv&&(e[this.registry.baseUrlEnv]=this.agentConfig.baseUrl);else if(!this.agentConfig.isDirectMode){let r=G(this.registry.gatewayPath),s=this.activeProviderRuntimeToken();if(this.registry.gatewayConfigEnv?e[this.registry.gatewayConfigEnv]=this.buildGatewayConfigJson({[O]:this.sessionTag}):this.registry.baseUrlEnv&&this.agentConfig.type!=="kimi"&&(e[this.registry.baseUrlEnv]=s?.baseUrl??r),s&&(e[this.registry.apiKeyEnv]=s.token,this.registry.spendTrackingEnvs&&(e[Ft]=s.bindingSecret)),!s){if(Nt(this.agentConfig.type))throw new Error(`${this.agentConfig.type} gateway mode requires a Dashboard runtime token before sandbox setup`);e[T]=this.agentConfig.apiKey;}}if(this.managedBrowserSession&&this.options.managedBrowser&&Object.assign(e,$t(this.options.managedBrowser.provider,this.managedBrowserSession).envs),n&&Object.assign(e,n),!this.agentConfig.isDirectMode&&this.registry.customHeadersEnv){let r=this.registry.customHeadersEnv,s=this.registry.customHeadersFormat||"newline";e[r]=Kt(e[r],{[O]:this.sessionTag,...this.providerRuntimeHeaderUpdates()},s);}return !this.agentConfig.isDirectMode&&this.registry.spendTrackingEnvs&&(e[this.registry.spendTrackingEnvs.sessionTagEnv]=this.sessionTag),e}validatedUserSecretsForEnvironment(){if(!this.options.secrets)return;let e=new Set([T]),n=s=>{s&&e.add(s);};n(this.registry.apiKeyEnv),n(this.registry.baseUrlEnv);for(let s of Object.values(this.registry.providerEnvMap??{}))n(s.keyEnv);let r={};for(let[s,a]of Object.entries(this.options.secrets)){if(e.has(s))throw new Error(`${s} is reserved for Evolve-managed sandbox services and cannot be set with secrets`);s!==this.registry.gatewayConfigEnv&&(r[s]=a);}return r}async ensureManagedBrowserSession(e){this.managedBrowserSession||!this.options.managedBrowser||(this.managedBrowserSession=await wr(this.options.managedBrowser,this.sessionTag,{browserCredentials:this.options.browserCredentials!==void 0}),this.emitLifecycle(e,"browser_ready"));}async ensureProviderRuntimeToken(){let e=Nt(this.agentConfig.type);if(this.agentConfig.isDirectMode||!e||!this.options.providerRouting||this.providerRuntimeToken)return;let n;try{n=await Sr(this.options.providerRouting,{provider:e,sessionTag:this.sessionTag});}catch(r){throw kr(r)?new Error(`${e} runtime token endpoint is required in gateway mode: ${r.message}`):r}this.providerRuntimeToken=n,this.providerRuntimeToken&&this.sandbox?.sandboxId&&await this.bindProviderRuntimeToken(this.sandbox.sandboxId);}async bindProviderRuntimeToken(e){if(!this.providerRuntimeToken||!this.options.providerRouting)return;if(!await xr(this.options.providerRouting,{token:this.providerRuntimeToken.token,sandboxId:e}))throw new Error("Failed to bind provider runtime token to sandbox")}async setupManagedBrowser(e){if(!this.managedBrowserSession||!this.options.managedBrowser)return;let n=$t(this.options.managedBrowser.provider,this.managedBrowserSession);for(let r of n.directories)await e.files.makeDir(r);for(let r of n.files)await e.files.write(r.path,r.data);}async closeManagedBrowserSession(){if(!this.managedBrowserSession||!this.options.managedBrowser)return;let e=this.managedBrowserSession;this.managedBrowserSession=void 0;try{await vr(this.options.managedBrowser,e);}catch(n){console.warn(`[Evolve] Managed browser cleanup failed: ${n.message}`);}}async closeProviderRuntimeToken(){if(!this.providerRuntimeToken||!this.options.providerRouting)return;let e=this.providerRuntimeToken,n;try{for(let r=0;r<3;r++)try{if(!await Cr(this.options.providerRouting,{token:e.token}))throw new Error("Dashboard returned ok=false");return}catch(s){n=s,r<2&&await new Promise(a=>setTimeout(a,100*(r+1)));}console.warn(`[Evolve] Provider runtime token cleanup failed: ${n.message}`);}finally{this.providerRuntimeToken=void 0;}}buildGatewayConfigJson(e){let n=G(this.registry.gatewayPath),r=this.resolveCommandModel(this.agentConfig.model||this.registry.defaultModel),s={},a=this.options.secrets?.[this.registry.gatewayConfigEnv];if(a)try{s=JSON.parse(a);}catch{}let o=s.provider??{},c=o.litellm??{},l=c.options??{},d=c.models??{},i=d[r]??{},p=i.headers??{},u=this.agentConfig.type==="opencode"?Ye(this.agentConfig.reasoningEffort):void 0,g=i.variants??{},f=u?g[u]??{}:void 0;return s.provider={...o,litellm:{...c,npm:"@ai-sdk/openai-compatible",options:{...l,baseURL:`${n}/v1`,apiKey:this.agentConfig.apiKey},models:{...d,[r]:{...i,name:r,headers:{...p,...e},...u?{variants:{...g,[u]:{...f,reasoningEffort:u}}}:{}}}}},JSON.stringify(s)}activeProviderRuntimeToken(){let e=Nt(this.agentConfig.type);return e&&this.providerRuntimeToken?.provider===e?this.providerRuntimeToken:void 0}ensureSessionLogger(e){if(this.sessionLogger)return;let n=this.options.sandboxProvider;this.sessionLogger=new ce({provider:n?.name||n?.providerType||"unknown",agent:this.agentConfig.type,model:this.agentConfig.model||this.registry.defaultModel,sandboxId:e.sandboxId,tag:this.sessionTag,apiKey:this.agentConfig.isDirectMode?void 0:this.agentConfig.apiKey,observability:{...this.options.observability,...this.managedBrowserSession&&this.options.managedBrowser?{browser_provider:this.options.managedBrowser.provider,browser_session_id:this.managedBrowserSession.id,dashboard_session_id:this.managedBrowserSession.sessionId,browser_session_tag:this.managedBrowserSession.sessionTag,browser_live_url:this.managedBrowserSession.liveUrl}:{}}});}async flushSessionLoggerWithTimeout(e=2e3){this.sessionLogger&&await Promise.race([this.sessionLogger.flush(),new Promise(n=>setTimeout(n,e))]);}providerRuntimeHeaderUpdates(){let e=this.activeProviderRuntimeToken();return e?{[Bt]:e.bindingSecret}:{}}buildProviderRuntimeProcessEnvs(){let e=this.activeProviderRuntimeToken();if(!e)return {};let n={[this.registry.apiKeyEnv]:e.token};if(this.registry.baseUrlEnv&&(n[this.registry.baseUrlEnv]=e.baseUrl),this.registry.spendTrackingEnvs&&(n[Ft]=e.bindingSecret),this.registry.customHeadersEnv){let r=this.registry.customHeadersEnv,s=this.registry.customHeadersFormat||"newline";n[r]=Kt(this.options.secrets?.[r],this.providerRuntimeHeaderUpdates(),s);}return n}buildRunEnvs(e){if(this.agentConfig.isDirectMode)return;let n=this.buildProviderRuntimeProcessEnvs(),r=this.registry.customHeadersEnv;if(r){let a=this.options.secrets?.[r],o=this.registry.customHeadersFormat||"newline";return n[r]=Kt(a,{[O]:this.sessionTag,[L]:`${W}${e}`,...this.providerRuntimeHeaderUpdates()},o),n}let s=this.registry.spendTrackingEnvs;return s?{...n,[s.sessionTagEnv]:this.sessionTag,[s.runTagEnv]:`${W}${e}`}:this.registry.gatewayConfigEnv?{...n,[this.registry.gatewayConfigEnv]:this.buildGatewayConfigJson({[O]:this.sessionTag,[L]:`${W}${e}`})}:Object.keys(n).length>0?n:void 0}async writeCodexGatewayProviderConfig(e){this.agentConfig.isDirectMode||!this.registry.spendTrackingEnvs||this.agentConfig.type!=="codex"||await at(e,this.activeProviderRuntimeToken()?.baseUrl||this.agentConfig.baseUrl||G(),this.registry.spendTrackingEnvs,this.activeProviderRuntimeToken()?{[Bt]:Ft}:void 0);}captureDroidSession(e,n){if(this.agentConfig.type!=="droid")return;let r=n?.find(a=>typeof a.sessionId=="string"&&a.sessionId.length>0)?.sessionId;if(r){this.droidSessionId=r;return}let s=this.extractDroidSessionId(e);s&&(this.droidSessionId=s);}extractDroidSessionId(e){try{return this.findDroidSessionId(JSON.parse(e))}catch{return}}findDroidSessionId(e){if(!e||typeof e!="object"||Array.isArray(e))return;let n=e,r=n.sessionId??n.session_id;return typeof r=="string"&&r.length>0?r:this.findDroidSessionId(n.result)??this.findDroidSessionId(n.params)??this.findDroidSessionId(n.notification)}async loadDroidSessionState(e){if(!(this.agentConfig.type!=="droid"||this.droidSessionId))try{let n=await e.files.read(_r);if(typeof n!="string")return;let r=JSON.parse(n);typeof r.sessionId=="string"&&r.sessionId.length>0&&(this.droidSessionId=r.sessionId);}catch{}}async writeDroidSessionState(e){this.agentConfig.type!=="droid"||!this.droidSessionId||(await e.files.makeDir("/home/user/.factory"),await e.files.write(_r,JSON.stringify({sessionId:this.droidSessionId},null,2)));}resolveGatewayModel(e){return this.agentConfig.isDirectMode?e:this.registry.gatewayModelAliases?.[e]??e}resolveCommandModel(e){return (this.agentConfig.isDirectMode?this.registry.directModelAliases:this.registry.gatewayModelAliases)?.[e]??e}async setupAgentAuth(e){if(this.agentConfig.oauthFileContent&&this.registry.oauthFileName){let n=this.registry.mcpConfig.settingsDir.replace(/^~/,"/home/user");await e.files.makeDir(n),await e.files.write(`${n}/${this.registry.oauthFileName}`,this.agentConfig.oauthFileContent);return}this.registry.setupCommand&&await e.commands.run(this.registry.setupCommand,{timeoutMs:3e4});}async setupAgentPlugins(e){await cr(this.agentConfig.type,e,this.options.plugins);}assertProviderRuntimeDoesNotExposeGatewayKey(e){if(!this.activeProviderRuntimeToken())return;let n=this.agentConfig.apiKey;for(let[r,s]of Object.entries(e))for(let a of Object.values(s.headers||{}))if(a.includes(n))throw new Error(`MCP server "${r}" would expose the Evolve API key inside the sandbox. Use managed agent-browser or remove this gateway-authenticated MCP server.`)}async setupWorkspace(e,n){let r=this.options.workspaceMode||"knowledge",s=r==="swe"?`${this.workingDir}/repo ${this.workingDir}/context ${this.workingDir}/scripts ${this.workingDir}/temp ${this.workingDir}/output`:`${this.workingDir}/context ${this.workingDir}/scripts ${this.workingDir}/temp ${this.workingDir}/output`;if(await e.commands.run(`mkdir -p ${s}`,{timeoutMs:3e4}),!n?.skipSystemPrompt){let o=xt({workingDir:this.workingDir,systemPrompt:this.options.systemPrompt,browserPrompt:this.options.browserPrompt,schema:this.zodSchema||this.jsonSchema,mode:r}),c=`${this.workingDir}/${this.registry.systemPromptFile}`;await e.files.write(c,o);}this.options.context&&await this.uploadContextFiles(e,this.options.context),this.options.files&&await this.uploadWorkspaceFiles(e,this.options.files);let a={...this.options.mcpServers};if(this.options.integrations){let o=await $n({...this.options.integrations,sessionTag:this.sessionTag});a={...a,integrations:{type:"http",url:o.url,headers:o.headers}};}if(this.options.browserCredentials){if(!this.options.managedBrowser||this.options.managedBrowser.provider!=="agent-browser")throw new Error("Browser credentials require managed remote agent-browser.");if(!this.managedBrowserSession?.id||!this.managedBrowserSession.sessionTag||!this.managedBrowserSession.browserAuthGrantToken)throw new Error("Managed browser session is missing browser credential grant data.");let o=await br({apiKey:this.options.browserCredentials.apiKey,dashboardUrl:this.options.browserCredentials.dashboardUrl,browserSessionId:this.managedBrowserSession.id,sessionTag:this.managedBrowserSession.sessionTag,grantToken:this.managedBrowserSession.browserAuthGrantToken,config:this.options.browserCredentials.config});a={...a,[Dt]:o};}Object.keys(a).length>0&&(this.assertProviderRuntimeDoesNotExposeGatewayKey(a),await lt(this.agentConfig.type,e,this.workingDir,a)),!this.agentConfig.isDirectMode&&this.registry.spendTrackingEnvs&&this.agentConfig.type==="codex"&&await this.writeCodexGatewayProviderConfig(e),!this.agentConfig.isDirectMode&&this.registry.spendTrackingJsonConfig&&await _e(e,this.agentConfig.type,this.registry.spendTrackingJsonConfig.headersPath,{[O]:this.sessionTag}),this.skills?.length&&await this.setupSkills(e);}async setupSkills(e){if(!this.skills?.length)return;let{skillsConfig:n}=this.registry,{sourceDir:r,targetDir:s}=n;await e.files.makeDir(s);for(let a of this.skills){let o=`cp -r ${r}/${a} ${s}/ 2>/dev/null || true`;await e.commands.run(o,{timeoutMs:3e4});}}async uploadContextFiles(e,n){let r=Object.entries(n).map(([a,o])=>({path:`${this.workingDir}/context/${a}`,data:o}));if(r.length===0)return;let s=new Set(r.map(a=>a.path.substring(0,a.path.lastIndexOf("/"))).filter(Boolean));s.size>0&&await e.commands.run(`mkdir -p ${Array.from(s).join(" ")}`,{timeoutMs:3e4}),await e.files.writeBatch(r);}async uploadWorkspaceFiles(e,n){let r=Object.entries(n).map(([a,o])=>({path:a.startsWith("/")?a:`${this.workingDir}/${a}`,data:o}));if(r.length===0)return;let s=new Set(r.map(a=>a.path.substring(0,a.path.lastIndexOf("/"))).filter(Boolean));s.size>0&&await e.commands.run(`mkdir -p ${Array.from(s).join(" ")}`,{timeoutMs:3e4}),await e.files.writeBatch(r);}buildCommand(e){return this.registry.buildCommand({prompt:this.agentConfig.type==="droid"?e:Ps(e),model:this.resolveCommandModel(this.agentConfig.model||this.registry.defaultModel),isResume:this.hasRun,sessionId:this.agentConfig.type==="droid"?this.droidSessionId:void 0,reasoningEffort:this.agentConfig.reasoningEffort,isDirectMode:this.agentConfig.isDirectMode,skills:this.skills})}async run(e,n){let{prompt:r,timeoutMs:s=se,background:a=false,checkpointComment:o}=e,{from:c}=e;if(this.activeCommand)throw new Error("Agent is already running. Call interrupt(), wait for the active/background run to finish, or create a new Evolve instance.");if(c&&(this.sandbox||this.options.sandboxId))throw new Error("Cannot restore into existing sandbox. Call kill() first, or create a new Evolve instance.");if(c==="latest"){if(!this.storage)throw new Error('Storage not configured. Call .withStorage() before using from: "latest".');let v=await Ot(this.storage);if(!v)throw new Error('No checkpoints found for from: "latest".');c=v.id;}if(c){if(!this.storage)throw new Error("Storage not configured. Call .withStorage() before using 'from'.");if(!this.options.sandboxProvider)throw new Error("No sandbox provider configured");await this.ensureManagedBrowserSession(n),await this.ensureProviderRuntimeToken();let v=this.buildEnvironmentVariables();this.sandboxState="booting",this.emitLifecycle(n,"sandbox_boot");try{this.sandbox=await this.options.sandboxProvider.create({envs:v,workingDirectory:this.workingDir}),await this.bindProviderRuntimeToken(this.sandbox.sandboxId);let b=await Xn(this.sandbox,this.storage,c);if(await this.setupManagedBrowser(this.sandbox),b.agentType&&b.agentType!==this.agentConfig.type)throw new Error(`Cannot restore checkpoint: agent type mismatch (checkpoint: ${b.agentType}, current: ${this.agentConfig.type})`);let C=this.options.workspaceMode||"knowledge";if(b.workspaceMode&&b.workspaceMode!==C)throw new Error(`Cannot restore checkpoint: workspace mode mismatch (checkpoint: ${b.workspaceMode}, current: ${C})`);await this.setupAgentAuth(this.sandbox),await this.setupAgentPlugins(this.sandbox);let R=!!(this.options.systemPrompt||this.options.browserPrompt||this.zodSchema||this.jsonSchema);await this.setupWorkspace(this.sandbox,{skipSystemPrompt:!R}),await this.loadDroidSessionState(this.sandbox),this.hasRun=!0,this.lastCheckpointId=c,this.sandboxState="ready",this.agentState="idle",this.emitLifecycle(n,"sandbox_ready");}catch(b){throw this.sandbox&&(await this.sandbox.kill().catch(()=>{}),this.sandbox=void 0),await this.closeManagedBrowserSession().catch(()=>{}),await this.closeProviderRuntimeToken().catch(()=>{}),this.sandboxState="error",this.agentState="error",this.emitLifecycle(n,"sandbox_error"),b}}let l=await this.getSandbox(n);await this.ensureProviderRuntimeToken(),await this.loadDroidSessionState(l),this.lastRunTimestamp=Date.now(),this.ensureSessionLogger(l),this.sessionLogger?.writePrompt(r),this.activeProviderRuntimeToken()&&await this.flushSessionLoggerWithTimeout();let d=this.buildCommand(r),i=randomUUID(),p=this.buildRunEnvs(i);await this.writeCodexGatewayProviderConfig(l),!this.agentConfig.isDirectMode&&this.registry.spendTrackingJsonConfig&&await _e(l,this.agentConfig.type,this.registry.spendTrackingJsonConfig.headersPath,{[O]:this.sessionTag,[L]:`${W}${i}`}),this.agentConfig.type==="qwen"&&await et(l,ne(this.agentConfig.reasoningEffort)),!this.agentConfig.isDirectMode&&this.registry.spendTrackingTomlProvider&&await ct(l,this.registry.spendTrackingTomlProvider,{[O]:this.sessionTag,[L]:`${W}${i}`},{baseUrl:As(G(this.registry.gatewayPath)),apiKey:this.agentConfig.apiKey,model:this.resolveCommandModel(this.agentConfig.model||this.registry.defaultModel),defaultThinking:ne(this.agentConfig.reasoningEffort),thinkingEffort:Rr(this.agentConfig.reasoningEffort)}),!this.agentConfig.isDirectMode&&this.registry.droidGatewaySettings&&await Re(l,{...this.registry.droidGatewaySettings,model:this.resolveCommandModel(this.agentConfig.model||this.registry.defaultModel),baseUrl:`${G()}/v1`,apiKeyEnv:"EVOLVE_API_KEY"},{[O]:this.sessionTag,[L]:`${W}${i}`});let u="",g=z(this.agentConfig.type),f=v=>{u+=v;let b=u.split(`
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
`).filter(Boolean),c=this.lastRunTimestamp?Math.floor(this.lastRunTimestamp/1e3)-2:0,l=[],d=`${r}/`;for(let f of o){let[m,h]=f.split("|");if(!m||!h)continue;let y=parseInt(h,10);c>0&&y<c||l.push(m);}let i={},p=await Promise.all(l.map(async f=>{try{let m=await n.files.read(f);return {relativePath:f.startsWith(d)?f.slice(d.length):f.split("/").pop()||f,content:m}}catch{return null}}));for(let f of p)f&&(i[f.relativePath]=f.content);if(!this.zodSchema&&!this.jsonSchema)return {files:i,data:null};let u=i["result.json"];if(!u)return {files:i,data:null,error:"Schema provided but agent did not create output/result.json"};let g=typeof u=="string"?u:new TextDecoder().decode(u);try{let f=JSON.parse(g);if(this.zodSchema){let m=this.zodSchema.safeParse(f);return m.success?{files:i,data:m.data}:{files:i,data:null,error:`Schema validation failed: ${m.error.message}`,rawData:g}}if(this.compiledValidator){if(this.compiledValidator(f))return {files:i,data:f};{let h=this.compiledValidator.errors?.map(y=>`${y.instancePath} ${y.message}`).join(", ")||"Unknown validation error";return {files:i,data:null,error:`Schema validation failed: ${h}`,rawData:g}}}return {files:i,data:null}}catch(f){return {files:i,data:null,error:`Failed to parse result.json: ${f.message}`,rawData:g}}}async checkpoint(e){if(!this.storage)throw new Error("Storage not configured. Call .withStorage().");if(!this.sandbox)throw new Error("No active sandbox. Call run() first.");let n=await It(this.sandbox,this.storage,this.agentConfig.type,this.workingDir,{tag:this.sessionTag,model:this.agentConfig.model||this.registry.defaultModel,workspaceMode:this.options.workspaceMode||"knowledge",comment:e?.comment,parentId:this.lastCheckpointId});return this.lastCheckpointId=n.id,n}getSession(){return this.sandbox?.sandboxId||this.options.sandboxId||null}async setSession(e){if(this.activeCommand&&!await this.interrupt())throw new Error("Cannot switch session while an active process is running and could not be interrupted.");await this.rotateSession(),await this.closeProviderRuntimeToken(),await this.closeManagedBrowserSession(),this.options.sandboxId=e,this.sandbox=void 0,this.interruptedOperations.clear(),this.invalidateActiveOperation(),this.sandboxState="ready",this.agentState="idle",this.hasRun=true,this.lastCheckpointId=void 0;}async pause(e){this.sandbox&&(this.activeCommand&&await this.interrupt(e),await this.sandbox.pause(),this.sandboxState="paused",this.agentState="idle",this.emitLifecycle(e,"sandbox_pause"));}async resume(e){this.sandbox&&this.options.sandboxProvider&&(this.sandbox=await this.options.sandboxProvider.connect(this.sandbox.sandboxId),this.sandboxState="ready",this.agentState="idle",this.emitLifecycle(e,"sandbox_resume"));}async interrupt(e){if(!this.activeCommand&&!this.activeProcessId)return false;let n=this.activeOperationId,r=this.activeOperationKind,s=false;try{this.activeCommand?s=await this.activeCommand.kill():this.sandbox&&this.activeProcessId&&(s=await this.sandbox.commands.kill(this.activeProcessId));}catch{s=false;}if(!s)return this.sandboxState="running",this.agentState="running",false;n!==null&&this.interruptedOperations.add(n),this.invalidateActiveOperation(),this.sandboxState="ready",this.agentState="interrupted";let a=r==="run"?"run_interrupted":"command_interrupted";return this.emitLifecycle(e,a),s}status(){let e=this.browserRuntimeInfo();return {sandboxId:this.getSession(),sandbox:this.sandboxState,agent:this.agentState,activeProcessId:this.activeProcessId,hasRun:this.hasRun,timestamp:new Date().toISOString(),...e?{browser:e}:{}}}async kill(e){await this.rotateSession();let n;try{this.activeCommand&&await this.interrupt(e),this.sandbox&&(await this.sandbox.kill(),this.sandbox=void 0);}catch(r){n=r;}finally{await this.closeProviderRuntimeToken(),await this.closeManagedBrowserSession();}if(n)throw n;this.options.sandboxId=void 0,this.interruptedOperations.clear(),this.invalidateActiveOperation(),this.sandboxState="stopped",this.agentState="idle",this.hasRun=false,this.lastCheckpointId=void 0,this.emitLifecycle(e,"sandbox_killed");}async getHost(e){return (await this.getSandbox()).getHost(e)}getAgentType(){return this.agentConfig.type}getSessionTag(){return !this.sandbox&&!this.sessionLogger?null:this.sessionTag}getSessionTimestamp(){return this.sessionLogger?.getTimestamp()||null}async flushObservability(){await this.sessionLogger?.flush();}async rotateSession(){let e=!!this.sessionLogger;this.sessionLogger&&(await this.sessionLogger.close(),this.sessionLogger=void 0),e&&(this.previousSessionTag=this.sessionTag),this.sessionTag=Er(this.options.sessionTagPrefix||"evolve");}async fetchSpend(e){if(this.agentConfig.isDirectMode)throw new Error("Cost tracking requires gateway mode (set EVOLVE_API_KEY).");let n=this.agentConfig.apiKey;if(!n)throw new Error("Cost tracking requires an API key.");let r=process.env.EVOLVE_DASHBOARD_URL||_,s=await fetch(`${r}/api/sessions/spend?${e}`,{headers:{Authorization:`Bearer ${n}`},signal:AbortSignal.timeout(1e4)});if(!s.ok){let a=await s.text().catch(()=>"");throw new Error(`Spend query failed (${s.status}): ${a}`)}return s}resolveSpendTag(){if(this.sandbox||this.sessionLogger)return this.sessionTag;if(this.previousSessionTag)return this.previousSessionTag;throw new Error("No session to query. Call run() first.")}normalizeRunCost(e,n){return {...e,asOf:e.asOf??n.asOf,isComplete:e.isComplete??n.isComplete,truncated:e.truncated??n.truncated}}normalizeSessionCost(e){let n={asOf:e.asOf,isComplete:e.isComplete,truncated:e.truncated};return {...e,runs:e.runs.map(r=>this.normalizeRunCost(r,n))}}async getSessionCost(){let e=this.resolveSpendTag(),n=new URLSearchParams({tag:e}),s=await(await this.fetchSpend(n)).json();return this.normalizeSessionCost(s)}async getRunCost(e){let n=this.resolveSpendTag();if("runId"in e){let o=new URLSearchParams({tag:n,runId:e.runId}),l=await(await this.fetchSpend(o)).json();return this.normalizeRunCost(l,{asOf:new Date().toISOString(),isComplete:false,truncated:false})}let r=await this.getSessionCost(),s=e.index>0?e.index-1:r.runs.length+e.index,a=r.runs[s];if(!a)throw new Error(`Run index ${e.index} out of range. Session has ${r.runs.length} run(s).`);return a}};function Ms(t){return (t||process.env.EVOLVE_DASHBOARD_URL||_).replace(/\/$/,"")}function $s(t){let e=t||process.env.EVOLVE_API_KEY;if(!e)throw new Error("Browser profiles require EVOLVE_API_KEY or an explicit apiKey");return e}async function Ds(t){return await t.text().catch(()=>"")}async function Tr(t,e,n={}){let r=await fetch(`${Ms(t?.dashboardUrl)}${e}`,{...n,headers:{Authorization:`Bearer ${$s(t?.apiKey)}`,accept:"application/json",...n.body?{"content-type":"application/json"}:{},...n.headers||{}}});if(!r.ok)throw new Error(`Browser profiles request failed (${r.status}): ${await Ds(r)}`);return r.status===204?{}:await r.json()}var ze=class{constructor(e={}){this.config=e;}toMetadata(e){return {id:e.id,profile:e.profile,createdAt:e.createdAt||e.created_at||"",updatedAt:e.updatedAt||e.updated_at||"",lastUsedAt:e.lastUsedAt??e.last_used_at??null}}async list(){return {profiles:(await Tr(this.config,"/api/browser-profiles")).profiles.map(n=>this.toMetadata(n))}}async delete(e){return await Tr(this.config,"/api/browser-profiles",{method:"DELETE",body:JSON.stringify(e)})}};function jt(t={}){return new ze(t)}var we=class extends EventEmitter{config={};agent;fallbackSandboxState="stopped";fallbackAgentState="idle";fallbackHasRun=false;constructor(){super();}on(e,n){return super.on(e,n)}off(e,n){return super.off(e,n)}emit(e,...n){return super.emit(e,...n)}withAgent(e){return e&&(this.config.agent=e,this._cachedGatewayOverrides=null),this}withSandbox(e){return this.config.sandbox=e,this}withWorkingDirectory(e){return this.config.workingDirectory=e,this}withWorkspaceMode(e){return this.config.workspaceMode=e,this}withSecrets(e){if(Object.prototype.hasOwnProperty.call(e,T))throw new Error(`${T} is reserved for Evolve-managed sandbox services and cannot be set with withSecrets()`);return this.config.secrets={...this.config.secrets,...e},this}withSession(e){return this.config.sandboxId=e,this.agent||(this.fallbackSandboxState="ready",this.fallbackAgentState="idle",this.fallbackHasRun=true),this}withSystemPrompt(e){return this.config.systemPrompt=e,this}withContext(e){return this.config.context={...this.config.context,...e},this}withFiles(e){return this.config.files={...this.config.files,...e},this}withMcpServers(e){return this.config.mcpServers={...this.config.mcpServers,...e},this}withBrowser(e={provider:"agent-browser",remote:true}){return e===false?delete this.config.browser:this.config.browser=e,this}withBrowserCredentials(e={}){return this.config.browserCredentials=e,this}withPlugins(e){let n=Array.isArray(e)?e:[e];return this.config.plugins=[...this.config.plugins??[],...n],this}withSkills(e){return this.config.skills=e,this}withSchema(e,n){return this.config.schema=e,n&&(M(e)?console.warn("[Evolve] schemaOptions ignored for Zod schemas - use .passthrough(), .strip(), z.coerce instead"):this.config.schemaOptions=n),this}withSessionTagPrefix(e){return this.config.sessionTagPrefix=e,this}withObservability(e){return this.config.observability={...this.config.observability,...e},this}withIntegrations(e){return this.config.integrations=e,this}withStorage(e){return this.config.storage=e||{},this}static integrations=Dn;static browserCredentials=Ut;static browserProfiles=jt;async initializeAgent(){let e=Ne(this.config.agent),n=this.config.sandbox??await wt();if(this.config.integrations&&e.isDirectMode)throw new Error("withIntegrations() is available only in gateway mode with EVOLVE_API_KEY");let r={},s,a,o=this.config.skills,c;if(this.config.browser){let i=fr(this.config.browser);if(c=i,i.provider==="browser-use"){if(e.isDirectMode)throw new Error('withBrowser("browser-use") requires gateway mode. Use apiKey/EVOLVE_API_KEY instead of providerApiKey/direct mode.');r=zt(e.apiKey);}if((i.provider==="actionbook"||i.provider==="agent-browser")&&(o=mr(i.provider,o),i.managed)){if(e.isDirectMode)throw new Error(`Managed browser provider "${i.provider}" requires gateway mode. Use apiKey/EVOLVE_API_KEY instead of providerApiKey/direct mode.`);s=i.provider==="actionbook"?vt:Tn,a={provider:i.provider,apiKey:e.apiKey,dashboardUrl:process.env.EVOLVE_DASHBOARD_URL||_,...i.profile?{profile:i.profile}:{}};}if(i.profile&&!i.managed)throw new Error('withBrowser({ profile }) requires managed remote browser mode. Use .withBrowser({ profile }) or .withBrowser({ provider: "agent-browser", remote: true, profile }).')}if(this.config.browserCredentials!==void 0){if(this.config.sandboxId)throw new Error("withBrowserCredentials() cannot be used with withSession(); browser login tokens are run-scoped.");if(e.isDirectMode)throw new Error("withBrowserCredentials() requires gateway mode. Use apiKey/EVOLVE_API_KEY instead of providerApiKey/direct mode.");if(!c||c.provider!=="agent-browser"||!c.managed)throw new Error('withBrowserCredentials() requires .withBrowser() or .withBrowser({ provider: "agent-browser", remote: true }).');if(this.config.mcpServers?.["browser-login"])throw new Error('withBrowserCredentials() reserves the "browser-login" MCP server name.')}let l=this.config.storage!==void 0?Ve(this.config.storage,!e.isDirectMode,_,e.isDirectMode?void 0:e.apiKey):void 0,d={sandboxProvider:n,secrets:this.config.secrets,sandboxId:this.config.sandboxId,workingDirectory:this.config.workingDirectory,workspaceMode:this.config.workspaceMode,systemPrompt:this.config.systemPrompt,context:this.config.context,files:this.config.files,mcpServers:{...r,...this.config.mcpServers},browserPrompt:s,managedBrowser:a,browserCredentials:this.config.browserCredentials!==void 0?{apiKey:e.apiKey,dashboardUrl:process.env.EVOLVE_DASHBOARD_URL||_,config:this.config.browserCredentials}:void 0,plugins:this.config.plugins,skills:o,schema:this.config.schema,schemaOptions:this.config.schemaOptions,sessionTagPrefix:this.config.sessionTagPrefix,observability:this.config.observability,integrations:this.config.integrations?{...this.config.integrations,apiKey:e.apiKey,dashboardUrl:process.env.EVOLVE_DASHBOARD_URL||_}:void 0,providerRouting:e.isDirectMode?void 0:{apiKey:e.apiKey,dashboardUrl:process.env.EVOLVE_DASHBOARD_URL||_},storage:l};this.agent=new ye(e,d);}createStreamCallbacks(){let e=this.listenerCount("stdout")>0,n=this.listenerCount("stderr")>0,r=this.listenerCount("content")>0,s=this.listenerCount("lifecycle")>0;return {onStdout:e?a=>this.emit("stdout",a):void 0,onStderr:n?a=>this.emit("stderr",a):void 0,onContent:r?a=>this.emit("content",a):void 0,onLifecycle:s?a=>this.emit("lifecycle",a):void 0}}emitLifecycleFromStatus(e){if(this.listenerCount("lifecycle")===0)return;let n=this.status();this.emit("lifecycle",{sandboxId:n.sandboxId,sandbox:n.sandbox,agent:n.agent,timestamp:new Date().toISOString(),reason:e,...n.browser?{browser:n.browser}:{}});}async run({prompt:e,timeoutMs:n,background:r,from:s,checkpointComment:a}){if(s&&this.config.sandboxId)throw new Error("Cannot use 'from' with 'withSession()' \u2014 restore requires a fresh sandbox.");this.agent||await this.initializeAgent();let o=this.createStreamCallbacks();return this.agent.run({prompt:e,timeoutMs:n,background:r,from:s,checkpointComment:a},o)}async executeCommand(e,n={}){this.agent||await this.initializeAgent();let r=this.createStreamCallbacks();return this.agent.executeCommand(e,n,r)}async interrupt(){if(!this.agent)return false;let e=this.createStreamCallbacks();return this.agent.interrupt(e)}async uploadContext(e){return this.agent||await this.initializeAgent(),this.agent.uploadContext(e)}async uploadFiles(e){return this.agent||await this.initializeAgent(),this.agent.uploadFiles(e)}async getOutputFiles(e=false){if(!this.agent)throw new Error("Agent not initialized. Call run() first.");return this.agent.getOutputFiles(e)}async checkpoint(e){if(!this.agent)throw new Error("Agent not initialized. Call run() first.");return this.agent.checkpoint(e)}_cachedGatewayOverrides=null;resolveGatewayOverrides(){if(this._cachedGatewayOverrides!==null)return this._cachedGatewayOverrides||void 0;try{let e=Ne(this.config.agent);if(!e.isDirectMode)return this._cachedGatewayOverrides={gatewayUrl:_,gatewayApiKey:e.apiKey},this._cachedGatewayOverrides}catch{}this._cachedGatewayOverrides=void 0;}async listCheckpoints(e){if(this.config.storage===void 0)throw new Error("Storage not configured. Call .withStorage().");return Mt(this.config.storage,this.resolveGatewayOverrides()||{}).listCheckpoints(e)}storage(){if(this.config.storage===void 0)throw new Error("Storage not configured. Call .withStorage().");return Mt(this.config.storage,this.resolveGatewayOverrides()||{})}getSession(){return this.agent?this.agent.getSession():this.config.sandboxId??null}async setSession(e){this.agent?await this.agent.setSession(e):(this.fallbackSandboxState="ready",this.fallbackAgentState="idle",this.fallbackHasRun=true),this.config.sandboxId=e;}status(){return this.agent?this.agent.status():{sandboxId:this.config.sandboxId??null,sandbox:this.fallbackSandboxState,agent:this.fallbackAgentState,activeProcessId:null,hasRun:this.fallbackHasRun,timestamp:new Date().toISOString()}}async pause(){if(this.agent){let e=this.createStreamCallbacks();await this.agent.pause(e);return}this.config.sandboxId&&this.config.sandbox&&(await(await this.config.sandbox.connect(this.config.sandboxId)).pause(),this.fallbackSandboxState="paused",this.fallbackAgentState="idle",this.emitLifecycleFromStatus("sandbox_pause"));}async resume(){if(this.agent){let e=this.createStreamCallbacks();await this.agent.resume(e);return}this.config.sandboxId&&this.config.sandbox&&(await this.config.sandbox.connect(this.config.sandboxId),this.fallbackSandboxState="ready",this.fallbackAgentState="idle",this.emitLifecycleFromStatus("sandbox_resume"));}async kill(){if(this.agent){let e=this.createStreamCallbacks();await this.agent.kill(e),this.config.sandboxId=void 0,this.fallbackSandboxState="stopped",this.fallbackAgentState="idle",this.fallbackHasRun=false;return}this.config.sandboxId&&this.config.sandbox&&(await(await this.config.sandbox.connect(this.config.sandboxId)).kill(),this.fallbackSandboxState="stopped",this.fallbackAgentState="idle",this.fallbackHasRun=false,this.emitLifecycleFromStatus("sandbox_killed"),this.config.sandboxId=void 0);}async getHost(e){return this.agent||await this.initializeAgent(),this.agent.getHost(e)}getSessionTag(){return this.agent?.getSessionTag()||null}getSessionTimestamp(){return this.agent?.getSessionTimestamp()||null}async flushObservability(){await this.agent?.flushObservability();}async getSessionCost(){if(!this.agent)throw new Error("No agent initialized. Call run() first.");return this.agent.getSessionCost()}async getRunCost(e){if(!this.agent)throw new Error("No agent initialized. Call run() first.");return this.agent.getRunCost(e)}};var ee=class{permits;queue=[];constructor(e){if(e<1)throw new Error("Semaphore max must be >= 1");this.permits=e;}async use(e){await this.acquire();try{return await e()}finally{this.release();}}acquire(){return this.permits>0?(this.permits--,Promise.resolve()):new Promise(e=>this.queue.push(e))}release(){this.queue.length>0?this.queue.shift()():this.permits++;}};var J=Symbol.for("evolve.SwarmResult"),te=class t extends Array{get success(){return this.filter(e=>e.status==="success")}get filtered(){return this.filter(e=>e.status==="filtered")}get error(){return this.filter(e=>e.status==="error")}static from(e){let n=new t;return n.push(...e),n}};var Vt=class t{config;semaphore;constructor(e={}){let n=e.concurrency??Ht;if(n>st)throw new Error(`concurrency=${n} exceeds max ${st}. For higher parallelism, scale horizontally with multiple processes.`);this.config={agent:e.agent,sandbox:e.sandbox,tag:e.tag??"swarm",concurrency:n,timeoutMs:e.timeoutMs??se,workspaceMode:e.workspaceMode??"knowledge",retry:e.retry,mcpServers:e.mcpServers,skills:e.skills,integrations:e.integrations},this.semaphore=new ee(this.config.concurrency);}async map(e){let{items:n,prompt:r,bestOf:s,verify:a}=e,o=e.retry??this.config.retry,c=this.generateOperationId(),l=e.timeoutMs??this.config.timeoutMs;if(s&&a)throw new Error("map() cannot use both bestOf and verify options simultaneously");let d=await Promise.all(n.map((i,p)=>s?this.executeMapItemWithBestOf(i,r,p,c,e,l,o):a?this.executeMapItemWithVerify(i,r,p,c,e,l,o):o?I(u=>this.executeMapItem(i,r,p,c,e,l,u),o,p):this.executeMapItem(i,r,p,c,e,l)));return te.from(d)}async filter(e){let{items:n,prompt:r,condition:s,verify:a}=e,o=e.retry??this.config.retry,c=this.generateOperationId(),l=e.timeoutMs??this.config.timeoutMs,d=await Promise.all(n.map((p,u)=>a?this.executeFilterItemWithVerify(p,r,u,c,e,l,o):o?I(g=>this.executeFilterItem(p,r,u,c,e,l,g),o,u):this.executeFilterItem(p,r,u,c,e,l))),i=[];for(let p of d)if(p.status==="error")i.push(p);else if(p.data!==null)try{s(p.data)?i.push(p):i.push({...p,status:"filtered"});}catch(u){i.push({...p,status:"error",data:null,error:`Condition function threw: ${u.message}`});}return te.from(i)}async reduce(e){let{items:n,prompt:r,verify:s}=e,a=e.retry??this.config.retry,o=this.generateOperationId(),c=e.timeoutMs??this.config.timeoutMs,l=[],d=[];n.forEach((k,v)=>{l.push(this.getFiles(k)),d.push(this.getIndex(k,v));});let i={};l.forEach((k,v)=>{Object.entries(k).forEach(([b,C])=>{i[`item_${d[v]}/${b}`]=C;});});let p=Ke(i),u=F(On,{fileTree:p}),g=e.systemPrompt?`${u}
|
|
252
|
-
|
|
253
|
-
${e.systemPrompt}`:u,f=(k,v,b)=>({operationId:o,operation:"reduce",tag:k.tag,sandboxId:k.sandboxId,swarmName:this.config.tag,operationName:e.name,inputCount:n.length,inputIndices:d,errorRetry:v,verifyRetry:b,...this.pipelineContextToMeta(e._pipelineContext)}),m=e.mcpServers??this.config.mcpServers,h=e.skills??this.config.skills,y=e.integrations??this.config.integrations,w=async(k,v,b,C)=>{let R=await this.semaphore.use(()=>this.execute(i,k,{systemPrompt:g,schema:e.schema,schemaOptions:e.schemaOptions,agent:e.agent,mcpServers:m,skills:h,integrations:y,tagPrefix:v,timeoutMs:c,observability:{swarmName:this.config.tag,operationName:e.name,operationId:o,operation:"reduce",role:"worker",errorRetry:b,verifyRetry:C&&C>1?C-1:void 0,...this.pipelineContextToObservability(e._pipelineContext)}})),K=f(R,b,C&&C>1?C-1:void 0);return R.error?{status:"error",data:null,files:R.files,meta:K,error:R.error,rawData:R.rawData}:{status:"success",data:R.data,files:R.files,meta:K}},S=`${this.config.tag}-reduce`;return s?this.runWithVerification((k,v,b)=>w(k,v,void 0,b),{originalPrompt:r,inputFiles:i,verifyConfig:s,timeoutMs:c,systemPrompt:g,schema:e.schema,mcpServers:m,skills:h,integrations:y,operationId:o,baseTag:S,retry:a,operation:"reduce",_pipelineContext:e._pipelineContext}):a?I(k=>{let v=k>1?k-1:void 0,b=v?`${S}-er${v}`:S;return w(r,b,v)},a):w(r,S)}async bestOf(e){let{item:n,prompt:r,config:s}=e,a=e.retry??this.config.retry,o=s.n??s.taskAgents?.length;if(o===void 0)throw new Error("bestOf requires n or taskAgents");if(o<2)throw new Error("bestOf requires n >= 2");let c=this.generateOperationId(),l=e.timeoutMs??this.config.timeoutMs,d=this.getFiles(n),i=s.mcpServers??this.config.mcpServers,p=s.judgeMcpServers??s.mcpServers??this.config.mcpServers,u=s.skills??this.config.skills,g=s.judgeSkills??s.skills??this.config.skills,f=s.integrations??this.config.integrations,m=s.judgeIntegrations??s.integrations??this.config.integrations,h=await Promise.all(Array.from({length:o},async(v,b)=>{let C=a?await I(R=>this.executeBestOfCandidate({inputFiles:d,prompt:r,candidateIndex:b,operationId:c,config:s,systemPrompt:e.systemPrompt,schema:e.schema,schemaOptions:e.schemaOptions,mcpServers:i,skills:u,integrations:f,timeoutMs:l,attempt:R}),a,b):await this.executeBestOfCandidate({inputFiles:d,prompt:r,candidateIndex:b,operationId:c,config:s,systemPrompt:e.systemPrompt,schema:e.schema,schemaOptions:e.schemaOptions,mcpServers:i,skills:u,integrations:f,timeoutMs:l});return s.onCandidateComplete?.(0,b,C.status==="success"?"success":"error"),C})),y=a?await I(v=>this.executeBestOfJudge({inputFiles:d,taskPrompt:r,candidates:h,config:s,timeoutMs:l,operationId:c,systemPrompt:e.systemPrompt,schema:e.schema,schemaOptions:e.schemaOptions,mcpServers:p,skills:g,integrations:m,attempt:v}),{...a,retryOn:void 0},0):await this.executeBestOfJudge({inputFiles:d,taskPrompt:r,candidates:h,config:s,timeoutMs:l,operationId:c,systemPrompt:e.systemPrompt,schema:e.schema,schemaOptions:e.schemaOptions,mcpServers:p,skills:g,integrations:m}),w=h.findIndex(v=>v.status==="success"),S=y.decision?.winner??(w>=0?w:0);s.onJudgeComplete?.(0,S,y.decision?.reasoning??"Judge failed to provide reasoning");let k={operationId:c,operation:"bestof-judge",tag:y.tag,sandboxId:y.sandboxId,swarmName:this.config.tag,operationName:e.name,candidateCount:o};return {winner:h[S]??h[0],winnerIndex:S,judgeReasoning:y.decision?.reasoning??"Judge failed to provide reasoning",judgeMeta:k,candidates:h}}async execute(e,n,r){let s=null,a="",o=r.tagPrefix,c={},l=null,d,i,p={...this.config.agent,...r.agent};try{s=new we().withAgent(p).withSandbox(this.config.sandbox).withWorkspaceMode(this.config.workspaceMode).withSessionTagPrefix(r.tagPrefix),r.schema&&s.withSchema(r.schema,r.schemaOptions),r.systemPrompt&&s.withSystemPrompt(r.systemPrompt),r.mcpServers&&s.withMcpServers(r.mcpServers),r.skills?.length&&s.withSkills(r.skills),r.integrations&&s.withIntegrations(r.integrations),r.observability&&s.withObservability(r.observability),Object.keys(e).length>0&&s.withContext(e);let u=await s.run({prompt:n,timeoutMs:r.timeoutMs});a=u.sandboxId,o=s.getSessionTag()??r.tagPrefix;let g=null;try{g=await s.getOutputFiles(!0),c=g.files;}catch{}u.exitCode!==0?d=`Agent exited with code ${u.exitCode}`:r.schema?g?(l=g.data,g.error&&(d=g.error),g.rawData&&(i=g.rawData)):d="Failed to read output files from sandbox":l=c;}catch(u){if(d=u.message,s){o=s.getSessionTag()??r.tagPrefix;try{c=(await s.getOutputFiles(!0)).files;}catch{}}}finally{s&&await s.kill().catch(()=>{});}return {files:c,data:l,tag:o,sandboxId:a,error:d,rawData:i}}async executeMapItem(e,n,r,s,a,o,c=1){let l=this.getFiles(e),d=c>1?`${this.config.tag}-map-${r}-er${c-1}`:`${this.config.tag}-map-${r}`,i=this.evaluatePrompt(n,l,r);if(i instanceof Error)return this.buildErrorResult(`Prompt function threw: ${i.message}`,{operationId:s,operation:"map",tag:d,sandboxId:"",itemIndex:r});let p=a.mcpServers??this.config.mcpServers,u=a.skills??this.config.skills,g=a.integrations??this.config.integrations,f=await this.semaphore.use(()=>this.execute(l,i,{systemPrompt:a.systemPrompt,schema:a.schema,schemaOptions:a.schemaOptions,agent:a.agent,mcpServers:p,skills:u,integrations:g,tagPrefix:d,timeoutMs:o,observability:{swarmName:this.config.tag,operationName:a.name,operationId:s,operation:"map",itemIndex:r,role:"worker",errorRetry:c>1?c-1:void 0,...this.pipelineContextToObservability(a._pipelineContext)}})),m={operationId:s,operation:"map",tag:f.tag,sandboxId:f.sandboxId,swarmName:this.config.tag,operationName:a.name,itemIndex:r,errorRetry:c>1?c-1:void 0,...this.pipelineContextToMeta(a._pipelineContext)};return this.buildResult(f,m)}async executeMapItemWithVerify(e,n,r,s,a,o,c){let l=this.getFiles(e),d=`${this.config.tag}-map-${r}`,i=a.verify,p=a.mcpServers??this.config.mcpServers,u=a.skills??this.config.skills,g=a.integrations??this.config.integrations,f=this.evaluatePrompt(n,l,r);if(f instanceof Error)return this.buildErrorResult(`Prompt function threw: ${f.message}`,{operationId:s,operation:"map",tag:d,sandboxId:"",itemIndex:r});let m=async(h,y,w)=>{let S=await this.semaphore.use(()=>this.execute(l,h,{systemPrompt:a.systemPrompt,schema:a.schema,schemaOptions:a.schemaOptions,agent:a.agent,mcpServers:p,skills:u,integrations:g,tagPrefix:y,timeoutMs:o,observability:{swarmName:this.config.tag,operationName:a.name,operationId:s,operation:"map",itemIndex:r,role:"worker",verifyRetry:w&&w>1?w-1:void 0,...this.pipelineContextToObservability(a._pipelineContext)}})),k={operationId:s,operation:"map",tag:S.tag,sandboxId:S.sandboxId,swarmName:this.config.tag,operationName:a.name,itemIndex:r,verifyRetry:w&&w>1?w-1:void 0,...this.pipelineContextToMeta(a._pipelineContext)};return this.buildResult(S,k)};return this.runWithVerification(m,{originalPrompt:f,inputFiles:l,verifyConfig:i,timeoutMs:o,systemPrompt:a.systemPrompt,schema:a.schema,mcpServers:p,skills:u,integrations:g,operationId:s,baseTag:d,retry:c,itemIndex:r,operation:"map",_pipelineContext:a._pipelineContext})}async executeMapItemWithBestOf(e,n,r,s,a,o,c){let l=this.getFiles(e),d=`${this.config.tag}-map-${r}`,i=this.evaluatePrompt(n,l,r);if(i instanceof Error)return this.buildErrorResult(`Prompt function threw: ${i.message}`,{operationId:s,operation:"map",tag:d,sandboxId:"",itemIndex:r});let p=a.bestOf,u=p.n??p.taskAgents?.length;if(u===void 0||u<2)return this.buildErrorResult("bestOf requires n >= 2 or taskAgents with at least 2 elements",{operationId:s,operation:"map",tag:d,sandboxId:"",itemIndex:r});let g=a.mcpServers??this.config.mcpServers,f=p.mcpServers??g,m=p.judgeMcpServers??p.mcpServers??g,h=a.skills??this.config.skills,y=p.skills??h,w=p.judgeSkills??p.skills??h,S=a.integrations??this.config.integrations,k=p.integrations??S,v=p.judgeIntegrations??p.integrations??S,b=await Promise.all(Array.from({length:u},async(ve,be)=>{let Wt=c?await I(Or=>this.executeBestOfCandidate({inputFiles:l,prompt:i,candidateIndex:be,operationId:s,config:p,systemPrompt:a.systemPrompt,schema:a.schema,schemaOptions:a.schemaOptions,mcpServers:f,skills:y,integrations:k,timeoutMs:o,parentIndex:r,attempt:Or,_pipelineContext:a._pipelineContext}),c,be):await this.executeBestOfCandidate({inputFiles:l,prompt:i,candidateIndex:be,operationId:s,config:p,systemPrompt:a.systemPrompt,schema:a.schema,schemaOptions:a.schemaOptions,mcpServers:f,skills:y,integrations:k,timeoutMs:o,parentIndex:r,_pipelineContext:a._pipelineContext});return p.onCandidateComplete?.(r,be,Wt.status==="success"?"success":"error"),Wt})),C=c?await I(ve=>this.executeBestOfJudge({inputFiles:l,taskPrompt:i,candidates:b,config:p,timeoutMs:o,operationId:s,systemPrompt:a.systemPrompt,schema:a.schema,schemaOptions:a.schemaOptions,mcpServers:m,skills:w,integrations:v,parentIndex:r,attempt:ve,_pipelineContext:a._pipelineContext}),{...c,retryOn:void 0},0):await this.executeBestOfJudge({inputFiles:l,taskPrompt:i,candidates:b,config:p,timeoutMs:o,operationId:s,systemPrompt:a.systemPrompt,schema:a.schema,schemaOptions:a.schemaOptions,mcpServers:m,skills:w,integrations:v,parentIndex:r,_pipelineContext:a._pipelineContext}),R=b.findIndex(ve=>ve.status==="success"),K=C.decision?.winner??(R>=0?R:0),Gt=b[K]??b[0];p.onJudgeComplete?.(r,K,C.decision?.reasoning??"Judge failed to provide reasoning");let Ir={operationId:s,operation:"bestof-judge",tag:C.tag,sandboxId:C.sandboxId,swarmName:this.config.tag,operationName:a.name,candidateCount:u,...this.pipelineContextToMeta(a._pipelineContext)};return {...Gt,meta:{...Gt.meta,operation:"map",swarmName:this.config.tag,operationName:a.name,itemIndex:r,...this.pipelineContextToMeta(a._pipelineContext)},bestOf:{winnerIndex:K,judgeReasoning:C.decision?.reasoning??"Judge failed to provide reasoning",judgeMeta:Ir,candidates:b}}}async executeFilterItem(e,n,r,s,a,o,c=1){let l=this.getFiles(e),d=c>1?`${this.config.tag}-filter-${r}-er${c-1}`:`${this.config.tag}-filter-${r}`,i=a.mcpServers??this.config.mcpServers,p=a.skills??this.config.skills,u=a.integrations??this.config.integrations,g=await this.semaphore.use(()=>this.execute(l,n,{systemPrompt:a.systemPrompt,schema:a.schema,schemaOptions:a.schemaOptions,agent:a.agent,mcpServers:i,skills:p,integrations:u,tagPrefix:d,timeoutMs:o,observability:{swarmName:this.config.tag,operationName:a.name,operationId:s,operation:"filter",itemIndex:r,role:"worker",errorRetry:c>1?c-1:void 0,...this.pipelineContextToObservability(a._pipelineContext)}})),f={operationId:s,operation:"filter",tag:g.tag,sandboxId:g.sandboxId,swarmName:this.config.tag,operationName:a.name,itemIndex:r,errorRetry:c>1?c-1:void 0,...this.pipelineContextToMeta(a._pipelineContext)};return this.buildResult(g,f,l)}async executeFilterItemWithVerify(e,n,r,s,a,o,c){let l=this.getFiles(e),d=`${this.config.tag}-filter-${r}`,i=a.verify,p=a.mcpServers??this.config.mcpServers,u=a.skills??this.config.skills,g=a.integrations??this.config.integrations,f=async(m,h,y)=>{let w=await this.semaphore.use(()=>this.execute(l,m,{systemPrompt:a.systemPrompt,schema:a.schema,schemaOptions:a.schemaOptions,agent:a.agent,mcpServers:p,skills:u,integrations:g,tagPrefix:h,timeoutMs:o,observability:{swarmName:this.config.tag,operationName:a.name,operationId:s,operation:"filter",itemIndex:r,role:"worker",verifyRetry:y&&y>1?y-1:void 0,...this.pipelineContextToObservability(a._pipelineContext)}})),S={operationId:s,operation:"filter",tag:w.tag,sandboxId:w.sandboxId,swarmName:this.config.tag,operationName:a.name,itemIndex:r,verifyRetry:y&&y>1?y-1:void 0,...this.pipelineContextToMeta(a._pipelineContext)};return this.buildResult(w,S,l)};return this.runWithVerification(f,{originalPrompt:n,inputFiles:l,verifyConfig:i,timeoutMs:o,systemPrompt:a.systemPrompt,schema:a.schema,mcpServers:p,skills:u,integrations:g,operationId:s,baseTag:d,retry:c,itemIndex:r,operation:"filter",_pipelineContext:a._pipelineContext})}async executeBestOfCandidate(e){let{inputFiles:n,prompt:r,candidateIndex:s,operationId:a,config:o,timeoutMs:c,parentIndex:l,attempt:d=1,_pipelineContext:i}=e,p=l!==void 0?`${this.config.tag}-map-${l}-bestof-cand-${s}`:`${this.config.tag}-bestof-cand-${s}`,u=d>1?`${p}-er${d-1}`:p,g=await this.semaphore.use(()=>this.execute(n,r,{systemPrompt:e.systemPrompt,schema:e.schema,schemaOptions:e.schemaOptions,agent:o.taskAgents?.[s],mcpServers:e.mcpServers,skills:e.skills,integrations:e.integrations,tagPrefix:u,timeoutMs:c,observability:{swarmName:this.config.tag,operationId:a,operation:"map",itemIndex:l,role:"candidate",candidateIndex:s,errorRetry:d>1?d-1:void 0,...this.pipelineContextToObservability(i)}})),f={operationId:a,operation:"bestof-cand",tag:g.tag,sandboxId:g.sandboxId,swarmName:this.config.tag,itemIndex:s,errorRetry:d>1?d-1:void 0,candidateIndex:s,...this.pipelineContextToMeta(i)};return this.buildResult(g,f)}buildJudgeContext(e){let n=this.buildEvaluatorContext({inputFiles:e.inputFiles,taskPrompt:e.taskPrompt,systemPrompt:e.systemPrompt,schema:e.schema});return e.candidates.forEach((r,s)=>{r.status==="error"&&(n[`candidate_${s}/_failed.txt`]=`STATUS: FAILED
|
|
254
|
-
|
|
255
|
-
Error: ${r.error??"Unknown error"}`),Object.entries(r.files).forEach(([a,o])=>{n[`candidate_${s}/${a}`]=o;});}),n}async executeBestOfJudge(e){let{candidates:n,config:r,timeoutMs:s,operationId:a,parentIndex:o,attempt:c=1,_pipelineContext:l}=e,d=o!==void 0?`${this.config.tag}-map-${o}-bestof-judge`:`${this.config.tag}-bestof-judge`,i=c>1?`${d}-er${c-1}`:d,p=this.buildJudgeContext({inputFiles:e.inputFiles,taskPrompt:e.taskPrompt,candidates:n,systemPrompt:e.systemPrompt,schema:e.schema}),u=Ke(p),g=F(bt,{candidateCount:String(n.length),criteria:r.judgeCriteria,fileTree:u}),f=z$1.object({winner:z$1.number().min(0).max(n.length-1),reasoning:z$1.string()}),m=await this.semaphore.use(()=>this.execute(p,Pn,{systemPrompt:g,schema:f,agent:r.judgeAgent,mcpServers:e.mcpServers,skills:e.skills,integrations:e.integrations,tagPrefix:i,timeoutMs:s,observability:{swarmName:this.config.tag,operationId:a,operation:"map",itemIndex:o,role:"judge",errorRetry:c>1?c-1:void 0,...this.pipelineContextToObservability(l)}})),h=null;if(m.data&&!m.error)h=m.data;else if(m.rawData)try{let y=JSON.parse(m.rawData);console.warn(`Judge returned invalid winner ${y.winner}, defaulting to candidate 0`),h={winner:0,reasoning:y.reasoning??"Judge failed to provide reasoning"};}catch{console.warn(`Judge validation failed: ${m.error}`);}return {status:h?"success":"error",decision:h,tag:m.tag,sandboxId:m.sandboxId,error:h?void 0:"Judge failed to produce valid decision"}}static DEFAULT_VERIFY_MAX_ATTEMPTS=3;static VerifyDecisionSchema=z$1.object({passed:z$1.boolean(),reasoning:z$1.string(),feedback:z$1.string().optional()});buildVerifyContext(e){let n=this.buildEvaluatorContext({inputFiles:e.inputFiles,taskPrompt:e.taskPrompt,systemPrompt:e.systemPrompt,schema:e.schema});return Object.entries(e.outputFiles).forEach(([r,s])=>{n[`worker_output/${r}`]=s;}),n}async executeVerify(e){let{config:n,timeoutMs:r,operationId:s,workerTag:a,retryAttempt:o=1,operation:c,itemIndex:l,attemptIndex:d,_pipelineContext:i}=e,p=o>1?`${a}-verifier-er${o-1}`:`${a}-verifier`,u=n.verifierMcpServers??e.mcpServers,g=n.verifierSkills??e.skills,f=n.verifierIntegrations??e.integrations,m=this.buildVerifyContext({inputFiles:e.inputFiles,taskPrompt:e.taskPrompt,outputFiles:e.outputFiles,systemPrompt:e.systemPrompt,schema:e.schema}),h=Ke(m),y=F(kt,{criteria:n.criteria,fileTree:h}),w=await this.semaphore.use(()=>this.execute(m,In,{systemPrompt:y,schema:t.VerifyDecisionSchema,agent:n.verifierAgent,mcpServers:u,skills:g,integrations:f,tagPrefix:p,timeoutMs:r,observability:{swarmName:this.config.tag,operationId:s,operation:c,itemIndex:l,role:"verifier",verifyRetry:d&&d>1?d-1:void 0,errorRetry:o>1?o-1:void 0,...this.pipelineContextToObservability(i)}})),S=null;if(w.data&&!w.error)S=w.data;else if(w.rawData)try{let k=JSON.parse(w.rawData);S={passed:!!k.passed,reasoning:k.reasoning??"Verification completed",feedback:k.feedback};}catch{console.warn(`Verify validation failed: ${w.error}`);}return {status:S?"success":"error",decision:S,tag:w.tag,sandboxId:w.sandboxId,error:S?void 0:"Verifier failed to produce valid decision"}}static buildRetryPromptWithFeedback(e,n){return F(St,{originalPrompt:e,feedback:n})}async runWithVerification(e,n){let{originalPrompt:r,inputFiles:s,verifyConfig:a,timeoutMs:o,operationId:c,baseTag:l,retry:d,itemIndex:i=0,operation:p,_pipelineContext:u}=n,g=a.maxAttempts??t.DEFAULT_VERIFY_MAX_ATTEMPTS,f=r,m=null,h=0;for(;h<g;){h++;let w=h>1?`${l}-vr${h-1}`:l,S=d?await I(b=>e(f,b>1?`${w}-er${b-1}`:w,h),d,i):await e(f,w,h);if(a.onWorkerComplete?.(i,h,S.status==="error"?"error":"success"),S.status==="error")return S;m=S;let k=d?await I(b=>this.executeVerify({inputFiles:s,outputFiles:S.files,taskPrompt:f,config:a,timeoutMs:o,systemPrompt:n.systemPrompt,schema:n.schema,mcpServers:n.mcpServers,skills:n.skills,integrations:n.integrations,operationId:c,workerTag:w,retryAttempt:b,operation:p,itemIndex:i,attemptIndex:h,_pipelineContext:u}),{...d,retryOn:void 0}):await this.executeVerify({inputFiles:s,outputFiles:S.files,taskPrompt:f,config:a,timeoutMs:o,systemPrompt:n.systemPrompt,schema:n.schema,mcpServers:n.mcpServers,skills:n.skills,integrations:n.integrations,operationId:c,workerTag:w,operation:p,itemIndex:i,attemptIndex:h,_pipelineContext:u}),v={operationId:c,operation:"verify",tag:k.tag,sandboxId:k.sandboxId,swarmName:this.config.tag,attempts:h,...this.pipelineContextToMeta(u)};if(a.onVerifierComplete?.(i,h,k.decision?.passed??false,k.decision?.feedback),k.decision?.passed)return {...S,verify:{passed:true,reasoning:k.decision.reasoning,verifyMeta:v,attempts:h}};if(h<g){let b=k.decision?.feedback??k.decision?.reasoning??"Output did not meet criteria";f=t.buildRetryPromptWithFeedback(r,b);}}let y=h>1?`${l}-vr${h-1}`:l;return {...m,status:"error",verify:{passed:false,reasoning:"Max verification retries exceeded",verifyMeta:{operationId:c,operation:"verify",tag:`${y}-verifier`,sandboxId:"",swarmName:this.config.tag,attempts:h,...this.pipelineContextToMeta(u)},attempts:h}}}generateOperationId(){return randomBytes(8).toString("hex")}pipelineContextToObservability(e){return e?{pipelineRunId:e.pipelineRunId,pipelineStepIndex:e.pipelineStepIndex}:{}}pipelineContextToMeta(e){return {pipelineRunId:e?.pipelineRunId,pipelineStepIndex:e?.pipelineStepIndex}}evaluatePrompt(e,n,r){if(typeof e=="string")return e;try{return e(n,r)}catch(s){return s}}buildEvaluatorContext(e){let n={};return e.systemPrompt&&(n["worker_task/system_prompt.txt"]=e.systemPrompt),n["worker_task/user_prompt.txt"]=e.taskPrompt,e.schema&&(n["worker_task/schema.json"]=M(e.schema)?q(e.schema):Y(e.schema)),Object.entries(e.inputFiles).forEach(([r,s])=>{n[`worker_task/input/${r}`]=s;}),n}isSwarmResult(e){return typeof e=="object"&&e!==null&&J in e&&e[J]===true}getFiles(e){if(this.isSwarmResult(e)){let n={...e.files};return n["result.json"]&&(n["data.json"]=n["result.json"],delete n["result.json"]),n}return e}getIndex(e,n){return this.isSwarmResult(e)?e.meta.itemIndex:n}buildResult(e,n,r){let s=r??e.files;return e.error?{[J]:true,status:"error",data:null,files:s,meta:n,error:e.error,rawData:e.rawData}:{[J]:true,status:"success",data:e.data,files:s,meta:n}}buildErrorResult(e,n){return {[J]:true,status:"error",data:null,files:{},meta:n,error:e}}};var Je=class t{swarm;steps;events;constructor(e,n=[],r={}){this.swarm=e,this.steps=n,this.events=r;}map(e){return new t(this.swarm,[...this.steps,{type:"map",config:e}],this.events)}filter(e){return new t(this.swarm,[...this.steps,{type:"filter",config:e}],this.events)}reduce(e){return new He(this.swarm,[...this.steps,{type:"reduce",config:e}],this.events)}on(e,n){if(typeof e=="string"){let r=`on${e.charAt(0).toUpperCase()}${e.slice(1)}`;return new t(this.swarm,this.steps,{...this.events,[r]:n})}return new t(this.swarm,this.steps,{...this.events,...e})}async run(e){let n=randomBytes(8).toString("hex"),r=[],s=e,a=Date.now();for(let c=0;c<this.steps.length;c++){let l=this.steps[c],d=l.config.name,i=Date.now();this.events.onStepStart?.({type:l.type,index:c,name:d,itemCount:s.length});let p={pipelineRunId:n,pipelineStepIndex:c};try{let u=await this.executeStep(l,s,c,d,p),g=Date.now()-i;if(r.push({type:l.type,index:c,durationMs:g,results:u.output}),this.events.onStepComplete?.({type:l.type,index:c,name:d,durationMs:g,successCount:u.successCount,errorCount:u.errorCount,filteredCount:u.filteredCount}),l.type==="reduce")return {pipelineRunId:n,steps:r,output:u.output,totalDurationMs:Date.now()-a};s=u.nextItems;}catch(u){throw this.events.onStepError?.({type:l.type,index:c,name:d,error:u instanceof Error?u:new Error(String(u))}),u}}let o=r[r.length-1];return {pipelineRunId:n,steps:r,output:o?.results??[],totalDurationMs:Date.now()-a}}async executeStep(e,n,r,s,a){if(e.type==="map"){let l=e.config,d=await this.swarm.map({items:n,...l,_pipelineContext:a,retry:this.wrapRetry(l.retry,r,s),verify:this.wrapVerify(l.verify,r,s),bestOf:this.wrapBestOf(l.bestOf,r,s)});return {output:[...d],nextItems:d.success,successCount:d.success.length,errorCount:d.error.length,filteredCount:0}}if(e.type==="filter"){let l=e.config,d=await this.swarm.filter({items:n,...l,_pipelineContext:a,retry:this.wrapRetry(l.retry,r,s),verify:this.wrapVerify(l.verify,r,s)}),i=l.emit??"success",p=i==="success"?d.success:i==="filtered"?d.filtered:[...d.success,...d.filtered];return {output:[...d],nextItems:p,successCount:d.success.length,errorCount:d.error.length,filteredCount:d.filtered.length}}let o=e.config,c=await this.swarm.reduce({items:n,...o,_pipelineContext:a,retry:this.wrapRetry(o.retry,r,s),verify:this.wrapVerify(o.verify,r,s)});return {output:c,nextItems:[],successCount:c.status==="success"?1:0,errorCount:c.status==="error"?1:0,filteredCount:0}}wrapRetry(e,n,r){if(e)return {...e,onItemRetry:(s,a,o)=>{e.onItemRetry?.(s,a,o),this.events.onItemRetry?.({stepIndex:n,stepName:r,itemIndex:s,attempt:a,error:o});}}}wrapVerify(e,n,r){if(e)return {...e,onWorkerComplete:(s,a,o)=>{e.onWorkerComplete?.(s,a,o),this.events.onWorkerComplete?.({stepIndex:n,stepName:r,itemIndex:s,attempt:a,status:o});},onVerifierComplete:(s,a,o,c)=>{e.onVerifierComplete?.(s,a,o,c),this.events.onVerifierComplete?.({stepIndex:n,stepName:r,itemIndex:s,attempt:a,passed:o,feedback:c});}}}wrapBestOf(e,n,r){if(e)return {...e,onCandidateComplete:(s,a,o)=>{e.onCandidateComplete?.(s,a,o),this.events.onCandidateComplete?.({stepIndex:n,stepName:r,itemIndex:s,candidateIndex:a,status:o});},onJudgeComplete:(s,a,o)=>{e.onJudgeComplete?.(s,a,o),this.events.onJudgeComplete?.({stepIndex:n,stepName:r,itemIndex:s,winnerIndex:a,reasoning:o});}}}},He=class t extends Je{constructor(e,n,r){super(e,n,r);}on(e,n){if(typeof e=="string"){let r=`on${e.charAt(0).toUpperCase()}${e.slice(1)}`;return new t(this.swarm,this.steps,{...this.events,[r]:n})}return new t(this.swarm,this.steps,{...this.events,...e})}map(){throw new Error("Cannot add steps after reduce")}filter(){throw new Error("Cannot add steps after reduce")}reduce(){throw new Error("Cannot add steps after reduce")}};var Gs=6e5,Ws=5e3;function Pr(t,e,n){let r=e??n;if(!Number.isFinite(r)||r<=0)throw new Error(`${t} must be a positive number`);return r}function zs(t){let e=t?.apiKey||process.env[T];if(!e)throw new Error(`sessions() requires an API key. Set ${T} or pass { apiKey } in config.`);let n=t?.dashboardUrl||_;async function r(c,l){let d=await fetch(`${n}${c}`,{...l,headers:{Authorization:`Bearer ${e}`,...l?.headers}});if(!d.ok){let i=await d.text().catch(()=>"");throw new Error(`Dashboard API error (${d.status}): ${i||d.statusText}`)}return d}function s(c){return {id:c.id,tag:c.tag,agent:c.agent,model:c.model||null,provider:c.provider,sandboxId:c.sandboxId||null,state:c.isEnded?"ended":"live",runtimeStatus:c.runtimeStatus||"unknown",cost:typeof c.cost=="number"?c.cost:null,createdAt:c.createdAt,endedAt:c.endedAt||null,stepCount:c.stepCount||0,toolStats:c.toolStats||null}}function a(c,l){if(c.status!=="ready")throw new Error(`Browser replay is not ready (status: ${String(c.status||"unknown")})`);if(typeof c.replayUrl!="string"||typeof c.downloadUrl!="string")throw new Error("Browser replay response missing replayUrl or downloadUrl");return {sessionId:c.sessionId||l,status:"ready",replayUrl:c.replayUrl,downloadUrl:c.downloadUrl,suggestedStartSeconds:typeof c.suggestedStartSeconds=="number"?c.suggestedStartSeconds:void 0,sizeBytes:typeof c.sizeBytes=="number"?c.sizeBytes:void 0,readyAt:typeof c.readyAt=="string"?c.readyAt:void 0}}let o=c=>new Promise(l=>setTimeout(l,c));return {async list(c){let l=new URLSearchParams({paginationMode:"cursor",pageSize:String(Math.min(c?.limit??20,200)),paginated:"true"});if(c?.cursor&&l.set("cursor",c.cursor),c?.state&&c.state!=="all"&&l.set("state",c.state),c?.agent&&l.set("agent",c.agent),c?.tagPrefix&&l.set("tagPrefix",c.tagPrefix),c?.sort){let p={newest:"desc",oldest:"asc",cost:"desc"};l.set("sortDirection",p[c.sort]),c.sort==="cost"?l.set("sortField","cost"):l.set("sortField","timestamp");}let i=await(await r(`/api/sessions?${l}`)).json();return {items:(i.items||[]).map(s),nextCursor:i.nextCursor||null,hasMore:!!i.hasMore}},async get(c){let d=await(await r(`/api/sessions/${encodeURIComponent(c)}`)).json();return s(d)},async events(c,l){let d=new URLSearchParams;l?.since!=null&&d.set("since",String(l.since));let i=d.toString();return (await(await r(`/api/sessions/${encodeURIComponent(c)}/events${i?`?${i}`:""}`)).json()).events||[]},async download(c,l){let p=(await(await r(`/api/sessions/${encodeURIComponent(c)}`)).json()).tag||c,u=await fetch(`${n}/api/sessions/${encodeURIComponent(c)}/download`,{headers:{Authorization:`Bearer ${e}`},redirect:"follow"});if(!u.ok){let h=await u.text().catch(()=>"");throw new Error(`Download failed (${u.status}): ${h||u.statusText}`)}let g=l?.to||process.cwd();await mkdir(g,{recursive:true});let f=join(g,`${p}.jsonl`);if(!u.body)throw new Error("Download response has no body");let m=Readable.fromWeb(u.body);return await pipeline(m,createWriteStream(f)),f},async browserReplay(c,l){let d=Pr("timeoutMs",l?.timeoutMs,Gs),i=Pr("intervalMs",l?.intervalMs,Ws),p=Date.now()+d,u=`/api/sessions/${encodeURIComponent(c)}/browser-replay`;for(;;){let g=p-Date.now();if(g<=0)throw new Error(`Browser replay timed out after ${d}ms`);let f;try{f=await fetch(`${n}${u}`,{headers:{Authorization:`Bearer ${e}`,accept:"application/json"},signal:AbortSignal.timeout(Math.max(1,g))});}catch(h){let y=h.name;throw y==="AbortError"||y==="TimeoutError"?new Error(`Browser replay timed out after ${d}ms`):h}let m={};if(f.ok)m=await f.json();else {let h=await f.text().catch(()=>"");throw new Error(`Dashboard API error (${f.status}): ${h||f.statusText}`)}if(m.status==="ready")return a(m,c);if(m.status==="failed"){let h=typeof m.error=="string"?m.error:"unknown error";throw new Error(`Browser replay failed: ${h}`)}if(Date.now()>=p)throw new Error(`Browser replay timed out after ${d}ms`);await o(Math.min(i,Math.max(0,p-Date.now())));}}}}export{Qe as AGENT_REGISTRY,Ar as AGENT_TYPES,ye as Agent,vt as BROWSER_ACTIONBOOK_PROMPT,Dt as BROWSER_LOGIN_MCP_SERVER_NAME,We as BrowserCredentialsClient,ze as BrowserProfilesClient,we as Evolve,bt as JUDGE_PROMPT,Je as Pipeline,St as RETRY_FEEDBACK_PROMPT,Rn as SCHEMA_PROMPT,J as SWARM_RESULT_BRAND,En as SYSTEM_PROMPT,ee as Semaphore,Vt as Swarm,te as SwarmResultList,He as TerminalPipeline,qe as VALIDATION_PRESETS,kt as VERIFY_PROMPT,Cn as WORKSPACE_PROMPT,_n as WORKSPACE_SWE_PROMPT,F as applyTemplate,Ut as browserCredentials,jt as browserProfiles,xt as buildWorkerSystemPrompt,z as createAgentParser,$e as createClaudeParser,De as createCodexParser,Ue as createDroidParser,Be as createGeminiParser,I as executeWithRetry,V as expandPath,D as getAgentConfig,B as getMcpSettingsDir,U as getMcpSettingsPath,$r as isValidAgentType,M as isZodSchema,Y as jsonSchemaToString,pi as parseNdjsonLine,ui as parseNdjsonOutput,ln as parseQwenOutput,dn as readLocalDir,Ve as resolveStorageConfig,pn as saveLocalDir,zs as sessions,as as storage,Se as writeClaudeMcpConfig,Me as writeCodexMcpConfig,Re as writeDroidGatewaySettings,Ee as writeDroidMcpConfig,xe as writeGeminiMcpConfig,lt as writeMcpConfig,Ce as writeQwenMcpConfig,q as zodSchemaToJson};
|
|
245
|
+
`}],directories:[Nr]}:{envs:{AGENT_BROWSER_CONFIG:$r},files:[{path:$r,data:`${JSON.stringify({cdp:e.cdpUrl},null,2)}
|
|
246
|
+
`}],directories:[Lr]}}function jr(t){return (t?.dashboardUrl||s).replace(/\/$/,"")}async function Gr(t){return await t.text().catch(()=>"")}async function Vr(t,e,n={}){let r=await fetch(`${jr(t)}/api/browser-sessions`,{method:"POST",headers:{Authorization:`Bearer ${t.apiKey}`,"content-type":"application/json",accept:"application/json"},body:JSON.stringify({sessionTag:e,options:{remote:true},browserAuth:n.browserCredentials===true,...t.profile?{profile:t.profile}:{}}),signal:AbortSignal.timeout(3e4)});if(!r.ok)throw new Error(`Managed browser session create failed (${r.status}): ${await Gr(r)}`);let i=await r.json();if(!i.id||!i.sessionId||!i.cdpUrl||!i.liveUrl)throw new Error("Managed browser session response missing id, sessionId, cdpUrl, or liveUrl");return {id:i.id,sessionId:i.sessionId,sessionTag:i.sessionTag,cdpUrl:i.cdpUrl,liveUrl:i.liveUrl,browserAuthGrantToken:i.browserAuthGrantToken}}async function zr(t,e){let n=await fetch(`${jr(t)}/api/browser-sessions/${encodeURIComponent(e.id)}`,{method:"DELETE",headers:{Authorization:`Bearer ${t.apiKey}`,accept:"application/json"},signal:AbortSignal.timeout(5e3)});if(!n.ok&&n.status!==404)throw new Error(`Managed browser session stop failed (${n.status}): ${await Gr(n)}`)}var yo="RSA-OAEP-256",en="browser-login";function wo(t){return (t||process.env.EVOLVE_DASHBOARD_URL||s).replace(/\/$/,"")}function vo(t){let e=t||process.env.EVOLVE_API_KEY;if(!e)throw new Error("Browser credentials require EVOLVE_API_KEY or an explicit apiKey");return e}async function bo(t){return await t.text().catch(()=>"")}async function Ce(t,e,n={}){let r=await fetch(`${wo(t?.dashboardUrl)}${e}`,{...n,headers:{Authorization:`Bearer ${vo(t?.apiKey)}`,accept:"application/json",...n.body?{"content-type":"application/json"}:{},...n.headers||{}}});if(!r.ok)throw new Error(`Browser credentials request failed (${r.status}): ${await bo(r)}`);return await r.json()}async function So(t,e){let n=await Ce(t,"/api/browser-credentials/public-key"),r=publicEncrypt({key:n.publicKey,padding:constants.RSA_PKCS1_OAEP_PADDING,oaepHash:"sha256"},Buffer.from(e,"utf8"));return {algorithm:yo,keyId:n.id,ciphertext:r.toString("base64url")}}var it=class{constructor(e={}){this.config=e;}toMetadata(e){let{account_label:n,...r}=e;return {...r,accountLabel:n}}async list(e={}){let n=new URLSearchParams;e.website&&n.set("website",e.website),e.limit!==void 0&&n.set("limit",String(e.limit)),e.offset!==void 0&&n.set("offset",String(e.offset));let r=n.toString()?`?${n.toString()}`:"",i=await Ce(this.config,`/api/browser-credentials${r}`);return {credentials:i.credentials.map(o=>this.toMetadata(o)),total:i.total,count:i.count,offset:i.offset,hasMore:i.has_more??i.offset+i.count<i.total}}async create(e){let n=await So(this.config,e.password),r=await Ce(this.config,"/api/browser-credentials",{method:"POST",body:JSON.stringify({website:e.website,account_label:e.accountLabel,email:e.email,encryptedPassword:n})});return {status:r.status,credential:this.toMetadata(r.credential)}}async delete(e){let n="id"in e?e:{website:e.website,account_label:e.accountLabel};return await Ce(this.config,"/api/browser-credentials",{method:"DELETE",body:JSON.stringify(n)})}};function tn(t={}){return new it(t)}async function Hr(t){return (await Ce({apiKey:t.apiKey,dashboardUrl:t.dashboardUrl},"/api/browser-login/mcp-config",{method:"POST",body:JSON.stringify({browserSessionId:t.browserSessionId,sessionTag:t.sessionTag,grantToken:t.grantToken,allow:ko(t.config)})})).server}function ko(t){return t?.allow?.map(e=>({website:e.website,...e.accountLabel||e.account_label?{account_label:e.accountLabel||e.account_label}:{}}))}var nn="x-evolve-provider-runtime-binding";function xo(t){return (t||process.env.EVOLVE_DASHBOARD_URL||s).replace(/\/$/,"")}async function Co(t){return await t.text().catch(()=>"")}var Ee=class extends Error{constructor(n,r){super(r);this.status=n;this.name="ProviderRuntimeTokenRequestError";}};function Wr(t){return t instanceof Ee&&t.status===404}async function rn(t,e,n={}){let r=await fetch(`${xo(t.dashboardUrl)}${e}`,{...n,headers:{Authorization:`Bearer ${t.apiKey}`,accept:"application/json",...n.body?{"content-type":"application/json"}:{},...n.headers||{}}});if(!r.ok)throw new Ee(r.status,`Provider runtime token request failed (${r.status}): ${await Co(r)}`);return await r.json()}function Eo(t){if(!t||typeof t!="object"||Array.isArray(t))return false;let e=t;return e.enabled===true&&(e.provider==="anthropic"||e.provider==="openai"||e.provider==="gemini"||e.provider==="dashscope"||e.provider==="kimi"||e.provider==="openrouter"||e.provider==="droid")&&(e.credentialMode==="provider_key"||e.credentialMode==="evolve_key")&&typeof e.token=="string"&&e.token.length>0&&typeof e.bindingSecret=="string"&&e.bindingSecret.length>0&&typeof e.baseUrl=="string"&&e.baseUrl.length>0&&typeof e.expiresAt=="string"&&e.expiresAt.length>0}async function qr(t,e){let n=await rn(t,"/api/provider-secrets/runtime-token",{method:"POST",body:JSON.stringify(e)});if(!Eo(n))throw new Ee(502,"Provider runtime token response was invalid");return n}async function Jr(t,e){return (await rn(t,"/api/provider-secrets/runtime-token",{method:"PATCH",body:JSON.stringify(e)})).ok}async function Yr(t,e){return (await rn(t,"/api/provider-secrets/runtime-token",{method:"DELETE",body:JSON.stringify(e)})).ok}var ot=18181,I="/tmp/evolve-managed-secrets",_e=`${I}/proxy.py`,ie=`${I}/config.json`,J=`${I}/ca.crt`,st=`${I}/ca.key`,re=`${I}/ca-bundle.crt`,Zr=["HTTP_PROXY","HTTPS_PROXY","ALL_PROXY","http_proxy","https_proxy","all_proxy","NO_PROXY","no_proxy","NODE_EXTRA_CA_CERTS","SSL_CERT_FILE","REQUESTS_CA_BUNDLE","CURL_CA_BUNDLE","GIT_SSL_CAINFO"];function ei(){return [...Zr]}var ti=String.raw`#!/usr/bin/env python3
|
|
247
|
+
import base64
|
|
248
|
+
import json
|
|
249
|
+
import os
|
|
250
|
+
import select
|
|
251
|
+
import secrets
|
|
252
|
+
import socket
|
|
253
|
+
import ssl
|
|
254
|
+
import subprocess
|
|
255
|
+
import sys
|
|
256
|
+
import tempfile
|
|
257
|
+
import threading
|
|
258
|
+
import urllib.error
|
|
259
|
+
import urllib.request
|
|
260
|
+
|
|
261
|
+
for key in ["HTTP_PROXY", "HTTPS_PROXY", "ALL_PROXY", "http_proxy", "https_proxy", "all_proxy"]:
|
|
262
|
+
os.environ.pop(key, None)
|
|
263
|
+
|
|
264
|
+
CONFIG_PATH = sys.argv[1]
|
|
265
|
+
with open(CONFIG_PATH, "r", encoding="utf-8") as f:
|
|
266
|
+
CONFIG = json.load(f)
|
|
267
|
+
try:
|
|
268
|
+
os.unlink(CONFIG_PATH)
|
|
269
|
+
except FileNotFoundError:
|
|
270
|
+
pass
|
|
271
|
+
|
|
272
|
+
MAX_BODY_BYTES = int(CONFIG.get("max_body_bytes", 10 * 1024 * 1024))
|
|
273
|
+
CONNECT_TIMEOUT_SECONDS = 15
|
|
274
|
+
SOCKET_TIMEOUT_SECONDS = 130
|
|
275
|
+
MAX_WORKERS = 100
|
|
276
|
+
WORKERS = threading.BoundedSemaphore(MAX_WORKERS)
|
|
277
|
+
HOST_PATTERNS = [h.lower() for h in CONFIG["hosts"]]
|
|
278
|
+
PLACEHOLDERS = set(CONFIG["placeholders"])
|
|
279
|
+
PLACEHOLDER_BYTES = [p.encode("utf-8") for p in CONFIG["placeholders"]]
|
|
280
|
+
BASE_DIR = CONFIG["base_dir"]
|
|
281
|
+
CERT_DIR = os.path.join(BASE_DIR, "certs")
|
|
282
|
+
os.makedirs(CERT_DIR, exist_ok=True)
|
|
283
|
+
CHANNEL_SECRET = secrets.token_urlsafe(32)
|
|
284
|
+
|
|
285
|
+
def register_channel():
|
|
286
|
+
payload = json.dumps({}).encode("utf-8")
|
|
287
|
+
req = urllib.request.Request(
|
|
288
|
+
CONFIG["channel_url"],
|
|
289
|
+
data=payload,
|
|
290
|
+
method="POST",
|
|
291
|
+
headers={
|
|
292
|
+
"content-type": "application/json",
|
|
293
|
+
"accept": "application/json",
|
|
294
|
+
"x-evolve-managed-secret-token": CONFIG["token"],
|
|
295
|
+
"x-evolve-managed-secret-binding": CONFIG["binding"],
|
|
296
|
+
"x-evolve-managed-secret-channel": CHANNEL_SECRET,
|
|
297
|
+
},
|
|
298
|
+
)
|
|
299
|
+
with urllib.request.urlopen(req, timeout=30) as resp:
|
|
300
|
+
if resp.status < 200 or resp.status >= 300:
|
|
301
|
+
raise RuntimeError("managed secret channel registration failed")
|
|
302
|
+
|
|
303
|
+
def host_matches(pattern, host):
|
|
304
|
+
host = host.lower()
|
|
305
|
+
if pattern.startswith("*."):
|
|
306
|
+
base = pattern[2:]
|
|
307
|
+
return host != base and host.endswith("." + base)
|
|
308
|
+
return host == pattern
|
|
309
|
+
|
|
310
|
+
def is_managed_host(host):
|
|
311
|
+
clean = host.split(":", 1)[0].strip("[]").lower()
|
|
312
|
+
return any(host_matches(pattern, clean) for pattern in HOST_PATTERNS)
|
|
313
|
+
|
|
314
|
+
def safe_name(host):
|
|
315
|
+
return "".join(ch if ch.isalnum() or ch in "._-" else "_" for ch in host)[:180]
|
|
316
|
+
|
|
317
|
+
def ensure_cert(host):
|
|
318
|
+
name = safe_name(host)
|
|
319
|
+
cert = os.path.join(CERT_DIR, name + ".crt")
|
|
320
|
+
key = os.path.join(CERT_DIR, name + ".key")
|
|
321
|
+
if os.path.exists(cert) and os.path.exists(key):
|
|
322
|
+
return cert, key
|
|
323
|
+
csr = os.path.join(CERT_DIR, name + ".csr")
|
|
324
|
+
ext = os.path.join(CERT_DIR, name + ".ext")
|
|
325
|
+
san = "IP:" + host if host.replace(".", "").isdigit() else "DNS:" + host
|
|
326
|
+
with open(ext, "w", encoding="utf-8") as f:
|
|
327
|
+
f.write("basicConstraints=critical,CA:FALSE\n")
|
|
328
|
+
f.write("keyUsage=critical,digitalSignature,keyEncipherment\n")
|
|
329
|
+
f.write("subjectAltName=" + san + "\n")
|
|
330
|
+
f.write("extendedKeyUsage=serverAuth\n")
|
|
331
|
+
subprocess.run(
|
|
332
|
+
["openssl", "req", "-newkey", "rsa:2048", "-nodes", "-keyout", key, "-subj", "/CN=" + host, "-out", csr],
|
|
333
|
+
check=True,
|
|
334
|
+
stdout=subprocess.DEVNULL,
|
|
335
|
+
stderr=subprocess.DEVNULL,
|
|
336
|
+
)
|
|
337
|
+
subprocess.run(
|
|
338
|
+
[
|
|
339
|
+
"openssl", "x509", "-req", "-in", csr,
|
|
340
|
+
"-CA", CONFIG["ca_cert"], "-CAkey", CONFIG["ca_key"], "-CAcreateserial",
|
|
341
|
+
"-out", cert, "-days", "30", "-sha256", "-extfile", ext,
|
|
342
|
+
],
|
|
343
|
+
check=True,
|
|
344
|
+
stdout=subprocess.DEVNULL,
|
|
345
|
+
stderr=subprocess.DEVNULL,
|
|
346
|
+
)
|
|
347
|
+
return cert, key
|
|
348
|
+
|
|
349
|
+
def pipe_raw(client, host, port):
|
|
350
|
+
upstream = socket.create_connection((host, port), timeout=CONNECT_TIMEOUT_SECONDS)
|
|
351
|
+
client.settimeout(SOCKET_TIMEOUT_SECONDS)
|
|
352
|
+
upstream.settimeout(SOCKET_TIMEOUT_SECONDS)
|
|
353
|
+
try:
|
|
354
|
+
client.sendall(b"HTTP/1.1 200 Connection Established\r\n\r\n")
|
|
355
|
+
sockets = [client, upstream]
|
|
356
|
+
while True:
|
|
357
|
+
readable, _, _ = select.select(sockets, [], [], 120)
|
|
358
|
+
if not readable:
|
|
359
|
+
break
|
|
360
|
+
for sock in readable:
|
|
361
|
+
data = sock.recv(65536)
|
|
362
|
+
if not data:
|
|
363
|
+
return
|
|
364
|
+
(upstream if sock is client else client).sendall(data)
|
|
365
|
+
finally:
|
|
366
|
+
upstream.close()
|
|
367
|
+
|
|
368
|
+
def recv_until(sock, marker, limit=65536):
|
|
369
|
+
data = b""
|
|
370
|
+
while marker not in data:
|
|
371
|
+
chunk = sock.recv(4096)
|
|
372
|
+
if not chunk:
|
|
373
|
+
break
|
|
374
|
+
data += chunk
|
|
375
|
+
if len(data) > limit:
|
|
376
|
+
raise RuntimeError("request headers too large")
|
|
377
|
+
return data
|
|
378
|
+
|
|
379
|
+
def parse_headers(blob):
|
|
380
|
+
head, rest = blob.split(b"\r\n\r\n", 1)
|
|
381
|
+
lines = head.decode("iso-8859-1").split("\r\n")
|
|
382
|
+
request_line = lines[0]
|
|
383
|
+
headers = {}
|
|
384
|
+
for line in lines[1:]:
|
|
385
|
+
if not line or ":" not in line:
|
|
386
|
+
continue
|
|
387
|
+
name, value = line.split(":", 1)
|
|
388
|
+
headers[name.strip()] = value.strip()
|
|
389
|
+
return request_line, headers, rest
|
|
390
|
+
|
|
391
|
+
def header_value(headers, name):
|
|
392
|
+
wanted = name.lower()
|
|
393
|
+
for key, value in headers.items():
|
|
394
|
+
if key.lower() == wanted:
|
|
395
|
+
return value
|
|
396
|
+
return None
|
|
397
|
+
|
|
398
|
+
def read_chunked_body(sock, initial):
|
|
399
|
+
data = initial
|
|
400
|
+
body = b""
|
|
401
|
+
while True:
|
|
402
|
+
while b"\r\n" not in data:
|
|
403
|
+
chunk = sock.recv(4096)
|
|
404
|
+
if not chunk:
|
|
405
|
+
raise RuntimeError("incomplete chunked request")
|
|
406
|
+
data += chunk
|
|
407
|
+
line, data = data.split(b"\r\n", 1)
|
|
408
|
+
size = int((line.split(b";", 1)[0].strip() or b"0"), 16)
|
|
409
|
+
if size == 0:
|
|
410
|
+
return body
|
|
411
|
+
if len(body) + size > MAX_BODY_BYTES:
|
|
412
|
+
raise RuntimeError("request body too large")
|
|
413
|
+
while len(data) < size + 2:
|
|
414
|
+
chunk = sock.recv(65536)
|
|
415
|
+
if not chunk:
|
|
416
|
+
raise RuntimeError("incomplete chunked request")
|
|
417
|
+
data += chunk
|
|
418
|
+
body += data[:size]
|
|
419
|
+
data = data[size + 2:]
|
|
420
|
+
|
|
421
|
+
def read_request(tls_sock):
|
|
422
|
+
blob = recv_until(tls_sock, b"\r\n\r\n")
|
|
423
|
+
if not blob:
|
|
424
|
+
return None
|
|
425
|
+
request_line, headers, rest = parse_headers(blob)
|
|
426
|
+
transfer_encoding = (header_value(headers, "Transfer-Encoding") or "").lower()
|
|
427
|
+
if "chunked" in transfer_encoding:
|
|
428
|
+
return request_line, headers, read_chunked_body(tls_sock, rest)
|
|
429
|
+
length = int(header_value(headers, "Content-Length") or "0")
|
|
430
|
+
if length > MAX_BODY_BYTES:
|
|
431
|
+
raise RuntimeError("request body too large")
|
|
432
|
+
body = rest
|
|
433
|
+
while len(body) < length:
|
|
434
|
+
chunk = tls_sock.recv(min(65536, length - len(body)))
|
|
435
|
+
if not chunk:
|
|
436
|
+
break
|
|
437
|
+
body += chunk
|
|
438
|
+
return request_line, headers, body[:length]
|
|
439
|
+
|
|
440
|
+
def uses_placeholder(path, headers, body):
|
|
441
|
+
if any(ph in path for ph in PLACEHOLDERS):
|
|
442
|
+
return True
|
|
443
|
+
if any(ph in value for ph in PLACEHOLDERS for value in headers.values()):
|
|
444
|
+
return True
|
|
445
|
+
return any(ph_b in body for ph_b in PLACEHOLDER_BYTES)
|
|
446
|
+
|
|
447
|
+
def call_dashboard(method, url, headers, body):
|
|
448
|
+
payload = json.dumps({
|
|
449
|
+
"method": method,
|
|
450
|
+
"url": url,
|
|
451
|
+
"headers": headers,
|
|
452
|
+
"bodyBase64": base64.b64encode(body).decode("ascii") if body else "",
|
|
453
|
+
}).encode("utf-8")
|
|
454
|
+
req = urllib.request.Request(
|
|
455
|
+
CONFIG["egress_url"],
|
|
456
|
+
data=payload,
|
|
457
|
+
method="POST",
|
|
458
|
+
headers={
|
|
459
|
+
"content-type": "application/json",
|
|
460
|
+
"accept": "application/json",
|
|
461
|
+
"x-evolve-managed-secret-token": CONFIG["token"],
|
|
462
|
+
"x-evolve-managed-secret-binding": CONFIG["binding"],
|
|
463
|
+
"x-evolve-managed-secret-channel": CHANNEL_SECRET,
|
|
464
|
+
},
|
|
465
|
+
)
|
|
466
|
+
try:
|
|
467
|
+
with urllib.request.urlopen(req, timeout=130) as resp:
|
|
468
|
+
return resp.status, resp.reason, json.loads(resp.read().decode("utf-8"))
|
|
469
|
+
except urllib.error.HTTPError as err:
|
|
470
|
+
text = err.read().decode("utf-8", "replace")
|
|
471
|
+
return err.code, "Managed Secret Egress Error", {"headers": {"content-type": "application/json"}, "bodyBase64": base64.b64encode(text.encode()).decode("ascii")}
|
|
472
|
+
|
|
473
|
+
def read_limited_response(stream):
|
|
474
|
+
chunks = []
|
|
475
|
+
total = 0
|
|
476
|
+
while True:
|
|
477
|
+
chunk = stream.read(65536)
|
|
478
|
+
if not chunk:
|
|
479
|
+
break
|
|
480
|
+
total += len(chunk)
|
|
481
|
+
if total > MAX_BODY_BYTES:
|
|
482
|
+
raise RuntimeError("response body too large")
|
|
483
|
+
chunks.append(chunk)
|
|
484
|
+
return b"".join(chunks)
|
|
485
|
+
|
|
486
|
+
def call_direct(method, url, headers, body):
|
|
487
|
+
hop_by_hop = {"connection", "proxy-connection", "keep-alive", "transfer-encoding", "upgrade", "host", "content-length"}
|
|
488
|
+
request_headers = {k: v for k, v in headers.items() if k.lower() not in hop_by_hop}
|
|
489
|
+
req = urllib.request.Request(
|
|
490
|
+
url,
|
|
491
|
+
data=body if body else None,
|
|
492
|
+
method=method,
|
|
493
|
+
headers=request_headers,
|
|
494
|
+
)
|
|
495
|
+
try:
|
|
496
|
+
with urllib.request.urlopen(req, timeout=130) as resp:
|
|
497
|
+
return resp.status, resp.reason, {
|
|
498
|
+
"headers": dict(resp.headers.items()),
|
|
499
|
+
"bodyBase64": base64.b64encode(read_limited_response(resp)).decode("ascii"),
|
|
500
|
+
}
|
|
501
|
+
except urllib.error.HTTPError as err:
|
|
502
|
+
return err.code, err.reason, {
|
|
503
|
+
"headers": dict(err.headers.items()),
|
|
504
|
+
"bodyBase64": base64.b64encode(read_limited_response(err)).decode("ascii"),
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
def send_response(tls_sock, status, reason, result):
|
|
508
|
+
body = base64.b64decode(result.get("bodyBase64") or "")
|
|
509
|
+
headers = {str(k): str(v) for k, v in (result.get("headers") or {}).items()}
|
|
510
|
+
headers["content-length"] = str(len(body))
|
|
511
|
+
headers["connection"] = "close"
|
|
512
|
+
status_line = ("HTTP/1.1 %d %s\r\n" % (status, reason or "")).encode("ascii", "replace")
|
|
513
|
+
header_blob = b"".join((name + ": " + value + "\r\n").encode("iso-8859-1", "replace") for name, value in headers.items())
|
|
514
|
+
tls_sock.sendall(status_line + header_blob + b"\r\n" + body)
|
|
515
|
+
|
|
516
|
+
def dispatch_managed_request(method, url, headers, body):
|
|
517
|
+
if uses_placeholder(url, headers, body):
|
|
518
|
+
return call_dashboard(method, url, headers, body)
|
|
519
|
+
return call_direct(method, url, headers, body)
|
|
520
|
+
|
|
521
|
+
def handle_managed_connect(client, host, port):
|
|
522
|
+
client.sendall(b"HTTP/1.1 200 Connection Established\r\n\r\n")
|
|
523
|
+
cert, key = ensure_cert(host)
|
|
524
|
+
ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
|
|
525
|
+
ctx.load_cert_chain(cert, key)
|
|
526
|
+
client.settimeout(SOCKET_TIMEOUT_SECONDS)
|
|
527
|
+
tls_sock = ctx.wrap_socket(client, server_side=True)
|
|
528
|
+
tls_sock.settimeout(SOCKET_TIMEOUT_SECONDS)
|
|
529
|
+
try:
|
|
530
|
+
request = read_request(tls_sock)
|
|
531
|
+
if not request:
|
|
532
|
+
return
|
|
533
|
+
request_line, headers, body = request
|
|
534
|
+
parts = request_line.split()
|
|
535
|
+
if len(parts) < 2:
|
|
536
|
+
raise RuntimeError("bad request line")
|
|
537
|
+
method, path = parts[0].upper(), parts[1]
|
|
538
|
+
if path.startswith("http://") or path.startswith("https://"):
|
|
539
|
+
url = path
|
|
540
|
+
else:
|
|
541
|
+
url = "https://%s%s" % (host if port == 443 else host + ":" + str(port), path)
|
|
542
|
+
status, reason, result = dispatch_managed_request(method, url, headers, body)
|
|
543
|
+
send_response(tls_sock, status, reason, result)
|
|
544
|
+
finally:
|
|
545
|
+
try:
|
|
546
|
+
tls_sock.close()
|
|
547
|
+
except Exception:
|
|
548
|
+
pass
|
|
549
|
+
|
|
550
|
+
def handle_client(client):
|
|
551
|
+
try:
|
|
552
|
+
client.settimeout(SOCKET_TIMEOUT_SECONDS)
|
|
553
|
+
blob = recv_until(client, b"\r\n\r\n")
|
|
554
|
+
if not blob:
|
|
555
|
+
return
|
|
556
|
+
request_line, headers, rest = parse_headers(blob)
|
|
557
|
+
parts = request_line.split()
|
|
558
|
+
if len(parts) < 3:
|
|
559
|
+
return
|
|
560
|
+
if parts[0].upper() == "CONNECT":
|
|
561
|
+
target = parts[1]
|
|
562
|
+
if ":" in target:
|
|
563
|
+
host, port_s = target.rsplit(":", 1)
|
|
564
|
+
port = int(port_s)
|
|
565
|
+
else:
|
|
566
|
+
host, port = target, 443
|
|
567
|
+
host = host.strip("[]")
|
|
568
|
+
if is_managed_host(host):
|
|
569
|
+
handle_managed_connect(client, host, port)
|
|
570
|
+
else:
|
|
571
|
+
pipe_raw(client, host, port)
|
|
572
|
+
return
|
|
573
|
+
client.sendall(b"HTTP/1.1 501 Not Implemented\r\ncontent-length: 0\r\nconnection: close\r\n\r\n")
|
|
574
|
+
except Exception as exc:
|
|
575
|
+
try:
|
|
576
|
+
body = json.dumps({"error": str(exc)}).encode("utf-8")
|
|
577
|
+
client.sendall(b"HTTP/1.1 502 Bad Gateway\r\ncontent-type: application/json\r\ncontent-length: " + str(len(body)).encode() + b"\r\nconnection: close\r\n\r\n" + body)
|
|
578
|
+
except Exception:
|
|
579
|
+
pass
|
|
580
|
+
finally:
|
|
581
|
+
try:
|
|
582
|
+
client.close()
|
|
583
|
+
except Exception:
|
|
584
|
+
pass
|
|
585
|
+
|
|
586
|
+
def serve():
|
|
587
|
+
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
588
|
+
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
|
589
|
+
server.bind(("127.0.0.1", int(CONFIG["port"])))
|
|
590
|
+
server.listen(100)
|
|
591
|
+
while True:
|
|
592
|
+
client, _ = server.accept()
|
|
593
|
+
if not WORKERS.acquire(blocking=False):
|
|
594
|
+
try:
|
|
595
|
+
client.sendall(b"HTTP/1.1 503 Service Unavailable\r\ncontent-length: 0\r\nconnection: close\r\n\r\n")
|
|
596
|
+
except Exception:
|
|
597
|
+
pass
|
|
598
|
+
client.close()
|
|
599
|
+
continue
|
|
600
|
+
def run_client():
|
|
601
|
+
try:
|
|
602
|
+
handle_client(client)
|
|
603
|
+
finally:
|
|
604
|
+
WORKERS.release()
|
|
605
|
+
thread = threading.Thread(target=run_client, daemon=True)
|
|
606
|
+
thread.start()
|
|
607
|
+
|
|
608
|
+
if __name__ == "__main__":
|
|
609
|
+
register_channel()
|
|
610
|
+
serve()
|
|
611
|
+
`;function _o(t){return (t||process.env.EVOLVE_DASHBOARD_URL||s).replace(/\/$/,"")}function To(t){let e=t.apiKey||process.env.EVOLVE_API_KEY;if(!e)throw new Error("EVOLVE_API_KEY is required for managed secrets");return e}async function Ro(t){return await t.text().catch(()=>"")}async function at(t,e,n={}){let r=await fetch(`${_o(t.dashboardUrl)}${e}`,{...n,headers:{Authorization:`Bearer ${To(t)}`,accept:"application/json",...n.body?{"content-type":"application/json"}:{},...n.headers||{}}});if(!r.ok)throw new Error(`Managed secrets request failed (${r.status}): ${await Ro(r)}`);return await r.json()}function sn(t={}){return {async list(){return (await at(t,"/api/managed-secrets")).secrets??[]}}}function Po(t){return Array.isArray(t)&&t.every(e=>typeof e=="string")}function Xr(t){try{return new URL(t).protocol==="https:"}catch{return false}}function Io(t){if(!t||typeof t!="object"||Array.isArray(t))return false;let e=t;return typeof e.token=="string"&&e.token.startsWith("evrt_")&&typeof e.bindingSecret=="string"&&e.bindingSecret.startsWith("evrb_")&&typeof e.egressUrl=="string"&&Xr(e.egressUrl)&&typeof e.channelUrl=="string"&&Xr(e.channelUrl)&&typeof e.expiresAt=="string"&&Array.isArray(e.env)&&e.env.every(n=>{if(!n||typeof n!="object"||Array.isArray(n))return false;let r=n;return typeof r.name=="string"&&typeof r.envName=="string"&&typeof r.placeholder=="string"&&r.placeholder.startsWith("evsec_")&&Po(r.allowedHosts)})}async function ni(t,e){let n=await at(t,"/api/managed-secrets/runtime-token",{method:"POST",body:JSON.stringify(e)});if(!Io(n))throw new Error("Invalid managed secret runtime token response");return n}async function ri(t,e){return (await at(t,"/api/managed-secrets/runtime-token",{method:"PATCH",body:JSON.stringify(e)})).ok}async function ii(t,e){return (await at(t,"/api/managed-secrets/runtime-token",{method:"DELETE",body:JSON.stringify(e)})).ok}function Oo(t){if(!Array.isArray(t)||t.length===0)throw new Error("withManagedSecrets() requires at least one secret");return t.map((e,n)=>{if(!e||typeof e!="object"||Array.isArray(e))throw new Error(`managedSecrets[${n}] must be an object with a name`);let r=Qr(e.name,`managedSecrets[${n}].name`),i=e.as===void 0?void 0:Qr(e.as,`managedSecrets[${n}].as`);return i?{name:r,as:i}:{name:r}})}function Qr(t,e){if(typeof t!="string"||!t.trim())throw new Error(`${e} is required`);let n=t.trim().toUpperCase();if(!/^[A-Z_][A-Z0-9_]{0,127}$/.test(n))throw new Error(`${e} must be a valid environment variable name`);if(n.startsWith("EVOLVE_"))throw new Error(`${e} cannot use the reserved EVOLVE_ prefix`);return n}function Ao(t){let e=new Set(["EVOLVE_API_KEY","EVOLVE_PROVIDER_RUNTIME_BINDING","GEMINI_DEFAULT_AUTH_TYPE",...Zr]),n=r=>{r&&e.add(r);};n(t.apiKeyEnv),n(t.baseUrlEnv),n(t.customHeadersEnv),n(t.gatewayConfigEnv),t.spendTrackingEnvs&&(n(t.spendTrackingEnvs.sessionTagEnv),n(t.spendTrackingEnvs.runTagEnv));for(let r of Object.values(t.providerEnvMap??{}))n(r.keyEnv);return e}function si(t,e){if(!t)return;let n=Oo(t),r=Ao(e),i=new Set;for(let o of n){let c=o.as||o.name;if(r.has(c))throw new Error(`${c} is reserved for Evolve-managed sandbox services and cannot be used as a managed secret env var`);if(i.has(c))throw new Error(`duplicate managed secret env var: ${c}`);i.add(c);}return n}function oi(t){let e={};for(let i of t.env)e[i.envName]=i.placeholder;let n=`http://127.0.0.1:${ot}`;e.HTTPS_PROXY=n,e.https_proxy=n,e.NODE_EXTRA_CA_CERTS=J,e.SSL_CERT_FILE=re,e.REQUESTS_CA_BUNDLE=re,e.CURL_CA_BUNDLE=re,e.GIT_SSL_CAINFO=re;let r=new URL(t.egressUrl).hostname;return e.NO_PROXY=`localhost,127.0.0.1,::1,${r}`,e.no_proxy=e.NO_PROXY,e}function ai(t){let e=Array.from(new Set(t.env.flatMap(n=>n.allowedHosts)));return JSON.stringify({egress_url:t.egressUrl,channel_url:t.channelUrl,token:t.token,binding:t.bindingSecret,hosts:e,placeholders:t.env.map(n=>n.placeholder),base_dir:I,ca_cert:J,ca_key:st,port:ot,max_body_bytes:10*1024*1024},null,2)}function ci(){return ["umask 077",`mkdir -p ${I}/certs`,`chmod 700 ${I} ${I}/certs`,`chmod 700 ${_e} 2>/dev/null || true`,`chmod 600 ${ie} 2>/dev/null || true`,`if [ ! -f ${st} ]; then openssl genrsa -out ${st} 2048 >/dev/null 2>&1; fi`,`if [ ! -f ${J} ]; then openssl req -x509 -new -nodes -key ${st} -sha256 -days 30 -subj "/CN=Evolve Managed Secrets" -addext "basicConstraints=critical,CA:TRUE" -addext "keyUsage=critical,keyCertSign,cRLSign" -out ${J} >/dev/null 2>&1; fi`,`SYSTEM_CA_BUNDLE=""; for p in /etc/ssl/certs/ca-certificates.crt /etc/pki/tls/certs/ca-bundle.crt /etc/ssl/ca-bundle.pem; do if [ -f "$p" ]; then SYSTEM_CA_BUNDLE="$p"; break; fi; done; if [ -n "$SYSTEM_CA_BUNDLE" ]; then cat "$SYSTEM_CA_BUNDLE" ${J} > ${re}; else cp ${J} ${re}; fi`,`if command -v update-ca-certificates >/dev/null 2>&1; then cp ${J} /usr/local/share/ca-certificates/evolve-managed-secrets.crt 2>/dev/null && update-ca-certificates >/dev/null 2>&1 || true; fi`].join(" && ")}function li(){return `umask 077 && exec python3 ${_e} ${ie}`}function di(){return `rm -f ${ie}`}var ct=256,pi=100*1024*1024,ui=500*1024*1024;function Te(t){return `'${t.replaceAll("'",`'"'"'`)}'`}function Mo(t){let e=t.trim();if(e==="")return [];let n=Buffer.from(e,"base64"),r=[],i=0;for(let o=0;o<n.length;o++)n[o]===0&&(r.push(n.toString("utf8",i,o)),i=o+1);return i<n.length&&r.push(n.toString("utf8",i,n.length)),r}async function gi(t,e,n){if(n.length===0||n.length>ct)throw new Error(`collectArtifacts() requires between 1 and ${ct} paths.`);let r=n.map(p=>{if(!p||p.includes("\0"))throw new Error(`Invalid artifact path: ${JSON.stringify(p)}`);let u=posix.normalize(p);if(!posix.isAbsolute(u)&&(u===".."||u.startsWith("../")))throw new Error(`Artifact path escapes the working directory: ${p}`);return posix.isAbsolute(u)?u:posix.join(e,u)}),o=(await t.commands.run(r.map(p=>`if [ ! -e ${Te(p)} ]; then echo MISSING ${Te(p)}; elif [ ! -r ${Te(p)} ]; then echo UNREADABLE ${Te(p)}; fi`).join("; "),{cwd:e,timeoutMs:15e3})).stdout.split(`
|
|
612
|
+
`).map(p=>p.trim()).filter(Boolean);if(o.length>0)throw new Error(`Artifact roots are not collectable: ${o.join("; ")}`);let c;try{c=await t.commands.run(`set -o pipefail 2>/dev/null; find -- ${r.map(Te).join(" ")} -type f -printf '%p\\0%s\\0' | base64 -w0`,{cwd:e,timeoutMs:3e4});}catch(p){throw new Error(`Artifact listing failed: ${p.message}`)}if(c.exitCode!==0)throw new Error(`Artifact listing failed (exit ${c.exitCode}): ${(c.stderr||"").slice(0,500)}`);let a=Mo(c.stdout);if(a.length%2!==0)throw new Error("Sandbox returned malformed artifact metadata.");let l=new Map,d=0;for(let p=0;p<a.length;p+=2){let u=a[p],g=Number(a[p+1]);if(!Number.isSafeInteger(g)||g<0)throw new Error(`Sandbox returned an invalid artifact size: ${u}`);if(g>pi)throw new Error(`Artifact exceeds ${pi} bytes: ${u}`);l.has(u)||(l.set(u,g),d+=g);}if(l.size>ct)throw new Error(`Artifact collection exceeds ${ct} files.`);if(d>ui)throw new Error(`Artifact collection exceeds ${ui} bytes.`);let s={};for(let p of [...l.keys()].sort()){let u=r.some(m=>p===m||p.startsWith(`${m.replace(/\/$/,"")}/`));if(!posix.isAbsolute(p)||!u)throw new Error(`Sandbox returned an invalid artifact path: ${p}`);let g=posix.relative(e,p),f=g&&g!==".."&&!g.startsWith("../")?g:p;s[f]=await t.files.read(p);}return s}var lt="EVOLVE_PROVIDER_RUNTIME_BINDING",on="gemini-api-key";function Re(t){switch(t){case "claude":return "anthropic";case "codex":return "openai";case "gemini":return "gemini";case "qwen":return "dashscope";case "kimi":return "kimi";case "opencode":return "openrouter";case "droid":return "droid";default:return null}}function Bo(t){return t.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\$/g,"\\$").replace(/`/g,"\\`")}function fi(t){return `${t}-${randomBytes(8).toString("hex")}`}function an(t,e,n="newline"){let r=new Map;if(t){let i=n==="comma"?t.split(/,(?=\s*[^,:]+:)/):t.split(/\r?\n/);for(let o of i){let c=o.trim();if(!c)continue;let a=c.indexOf(":");if(a<=0)continue;let l=c.slice(0,a).trim(),d=c.slice(a+1).trim();r.set(l.toLowerCase(),`${l}: ${d}`);}}for(let[i,o]of Object.entries(e)){let c=i.toLowerCase();if(c===u&&r.has(c)&&n==="newline"){let a=r.get(c),l=a.slice(a.indexOf(":")+1).trim();r.set(c,`${i}: ${l},${o}`);}else r.set(c,`${i}: ${o}`);}return Array.from(r.values()).join(n==="comma"?", ":`
|
|
613
|
+
`)}var Lo=262144,No=128e3;function mi(t,e){if(t.models.some(i=>i.alias===e||i.modelId===e))return true;let n=t.gatewayModelAliases;if(n&&(e in n||Object.values(n).includes(e)))return true;let r=t.directModelAliases;return !!(r&&(e in r||Object.values(r).includes(e)))}var Fo=new Set(["low","medium","high","xhigh","max"]);function hi(t){if(t)return Fo.has(t)?t:void 0}function dt(t){let e=t.replace(/\/+$/,"");return e.endsWith("/v1")?e:`${e}/v1`}var Pe=class{agentConfig;options;sandbox;hasRun=false;workingDir;homeDir;lastRunTimestamp;registry;sessionTag;previousSessionTag;sessionLogger;activeCommand;activeProcessId=null;activeOperationId=null;activeOperationKind=null;nextOperationId=0;interruptedOperations=new Set;sandboxState;agentState="idle";droidSessionId;managedBrowserSession;providerRuntimeToken;managedSecretRuntimeToken;managedSecretProxy;credentialsSealed=false;skills;storage;lastCheckpointId;zodSchema;jsonSchema;schemaOptions;compiledValidator;constructor(e,n={}){if(n.managedSecrets){if(e.isDirectMode)throw new Error("managed secrets are available only in gateway mode with EVOLVE_API_KEY");if(n.sandboxId)throw new Error("managed secrets cannot be used with an existing sandbox; grants are sandbox-scoped.");if(n.sandboxProvider&&!me(n.sandboxProvider))throw new Error("managed secrets require an Evolve-managed sandbox provider")}if(this.agentConfig=e,this.options=n,n.sandboxId&&n.sandboxCreateOptions?.user)throw new Error("sandbox user cannot be enforced when attaching to an existing sandbox; create a fresh sandbox with the user instead");if(this.homeDir=r(n.sandboxCreateOptions?.user,n.sandboxCreateOptions?.homeDir),this.homeDir!==q$1){if(n.storage)throw new Error("Checkpoint storage requires the default /home/user sandbox home directory; remove sandbox user/homeDir or storage");if(n.managedBrowser||n.browserCredentials)throw new Error("Managed browser features require the default /home/user sandbox home directory")}if(this.workingDir=n.workingDirectory||n.sandboxCreateOptions?.workingDirectory||`${this.homeDir}/workspace`,this.sandboxState=n.sandboxId?"ready":"stopped",n.workspaceMode==="task"&&[n.context,n.files,n.systemPrompt,n.browserPrompt,n.schema].some(Boolean))throw new Error('workspaceMode "task" cannot be combined with context, files, systemPrompt, browserPrompt, or schema; the task owns the working directory');if(this.skills=n.skills,this.storage=n.storage,n.schema)if(U(n.schema))this.zodSchema=n.schema,n.schemaOptions&&console.warn("[Evolve] schemaOptions ignored for Zod schemas - use .passthrough(), .strip(), z.coerce instead");else {this.jsonSchema=n.schema,this.schemaOptions=n.schemaOptions;try{let r=this.createAjvValidator();this.compiledValidator=r.compile(this.jsonSchema);}catch(r){throw new Error(`Invalid JSON Schema: ${r.message}`)}}this.registry=D(e.type),this.sessionTag=fi(n.sessionTagPrefix||"evolve");}browserRuntimeInfo(){if(this.managedBrowserSession)return {liveUrl:this.managedBrowserSession.liveUrl,sessionId:this.managedBrowserSession.sessionId,sessionTag:this.managedBrowserSession.sessionTag}}browserResponseInfo(){if(this.managedBrowserSession)return {liveUrl:this.managedBrowserSession.liveUrl}}emitLifecycle(e,n){let r=this.browserRuntimeInfo();e?.onLifecycle?.({sandboxId:this.getSession(),sandbox:this.sandboxState,agent:this.agentState,timestamp:new Date().toISOString(),reason:n,...r?{browser:r}:{}});}invalidateActiveOperation(){this.activeCommand=void 0,this.activeProcessId=null,this.activeOperationId=null,this.activeOperationKind=null;}beginOperation(e,n,r,i){let o=++this.nextOperationId;return this.activeOperationId=o,this.activeOperationKind=e,this.activeCommand=n,this.activeProcessId=n.processId,this.sandboxState="running",this.agentState="running",this.emitLifecycle(r,i),o}finalizeOperation(e,n,r,i="idle",o="ready"){return this.activeOperationId!==e?false:(this.invalidateActiveOperation(),this.sandboxState=o,this.agentState=i,this.emitLifecycle(n,r),true)}watchBackgroundOperation(e,n,r,i,o){let c=n==="run"?"run_background_complete":"command_background_complete",a=n==="run"?"run_background_failed":"command_background_failed",l=n==="run"?"run_interrupted":"command_interrupted";r.wait().then(async d=>{if(this.interruptedOperations.delete(e)||d.exitCode===130){this.finalizeOperation(e,i,l,"interrupted");return}n==="run"&&o&&await this.writeDroidSessionState(o);let p=d.exitCode===0?c:a,u=d.exitCode===0?"idle":"error";this.finalizeOperation(e,i,p,u);}).catch(()=>{this.interruptedOperations.delete(e),this.finalizeOperation(e,i,a,"error");});}createAjvValidator(){let n={...vt[this.schemaOptions?.mode||"loose"],...this.schemaOptions?.coerceTypes!==void 0&&{coerceTypes:this.schemaOptions.coerceTypes},...this.schemaOptions?.removeAdditional!==void 0&&{removeAdditional:this.schemaOptions.removeAdditional},...this.schemaOptions?.useDefaults!==void 0&&{useDefaults:this.schemaOptions.useDefaults},...this.schemaOptions?.allErrors!==void 0&&{allErrors:this.schemaOptions.allErrors}};return new Do({...n,strict:false})}async getSandbox(e){if(this.sandbox)return this.sandbox;if(this.credentialsSealed)throw new Error("Agent credentials are sealed and this Evolve instance cannot create or attach another sandbox");if(!this.options.sandboxProvider)throw new Error("No sandbox provider configured");let n=this.options.sandboxProvider;this.sandboxState="booting",this.emitLifecycle(e,"sandbox_boot");let r=false;try{if(this.options.sandboxId)(this.options.mcpServers||this.options.integrations||this.options.plugins||this.options.context||this.options.files||this.options.systemPrompt||this.options.managedBrowser||this.options.browserCredentials)&&console.warn("[Evolve] Connecting to existing sandbox - ignoring mcpServers, integrations, plugins, context, files, systemPrompt, managed browser setup, and browser credentials"),this.sandbox=await n.connect(this.options.sandboxId),this.hasRun=!0,await this.loadDroidSessionState(this.sandbox),this.sandboxState="ready",this.agentState="idle",this.emitLifecycle(e,"sandbox_connected");else {await this.ensureManagedBrowserSession(e),await this.ensureProviderRuntimeToken(),await this.ensureManagedSecretRuntimeToken();let i=this.buildEnvironmentVariables();this.sandbox=await n.create(this.buildSandboxCreateOptions(i)),r=!0,await this.bindProviderRuntimeToken(this.sandbox.sandboxId),await this.bindManagedSecretRuntimeToken(this.sandbox.sandboxId),await this.setupManagedSecretEgress(this.sandbox),await this.setupManagedBrowser(this.sandbox),await this.setupAgentAuth(this.sandbox),await this.setupAgentPlugins(this.sandbox),await this.setupWorkspace(this.sandbox),this.sandboxState="ready",this.agentState="idle",this.emitLifecycle(e,"sandbox_ready");}}catch(i){throw r&&this.sandbox&&(await this.sandbox.kill().catch(()=>{}),this.sandbox=void 0),await this.closeManagedBrowserSession().catch(()=>{}),await this.closeProviderRuntimeToken().catch(()=>{}),await this.closeManagedSecretRuntimeToken().catch(()=>{}),this.sandboxState="error",this.agentState="error",this.emitLifecycle(e,"sandbox_error"),i}return this.sandbox}resolveKimiMaxContextSize(){if(typeof this.agentConfig.maxContextSize=="number")return this.agentConfig.maxContextSize;let e=this.agentConfig.model||this.registry.defaultModel;return mi(this.registry,e)||mi(this.registry,this.resolveCommandModel(e))?this.registry.spendTrackingTomlProvider?.maxContextSize??Lo:No}buildKimiDirectModelEnvs(){let e=de(this.agentConfig.reasoningEffort),n=hi(this.agentConfig.reasoningEffort),r={KIMI_MODEL_NAME:this.resolveCommandModel(this.agentConfig.model||this.registry.defaultModel),KIMI_MODEL_API_KEY:this.agentConfig.apiKey,KIMI_MODEL_PROVIDER_TYPE:"kimi",KIMI_MODEL_MAX_CONTEXT_SIZE:String(this.resolveKimiMaxContextSize()),KIMI_MODEL_DEFAULT_THINKING:e?"true":"false",KIMI_MODEL_THINKING_MODE:e?"on":"off"};return n&&(r.KIMI_MODEL_THINKING_EFFORT=n),this.agentConfig.baseUrl&&(r.KIMI_MODEL_BASE_URL=this.agentConfig.baseUrl),r}buildEnvironmentVariables(){let e={},n=this.validatedUserSecretsForEnvironment();if(this.agentConfig.type==="kimi"&&this.agentConfig.isDirectMode)Object.assign(e,this.buildKimiDirectModelEnvs());else if(this.agentConfig.oauthFileContent)this.registry.oauthActivationEnv&&(e[this.registry.oauthActivationEnv.key]=this.registry.oauthActivationEnv.value);else if(!(this.agentConfig.type==="kimi"&&!this.agentConfig.isDirectMode)){if(!(!this.agentConfig.isDirectMode&&Re(this.agentConfig.type))){if(!(this.registry.skipApiKeyEnvInGateway&&!this.agentConfig.isDirectMode))if(this.registry.providerEnvMap&&!this.agentConfig.isDirectMode)for(let r of Object.values(this.registry.providerEnvMap))e[r.keyEnv]=this.agentConfig.apiKey;else {let r=this.agentConfig.model?.split("/")[0],i=r?this.registry.providerEnvMap?.[r]:void 0,o=i?i.keyEnv:this.registry.apiKeyEnv,c=this.agentConfig.isOAuth&&this.registry.oauthEnv?this.registry.oauthEnv:o;e[c]=this.agentConfig.apiKey;}}}if(this.agentConfig.isDirectMode&&!this.agentConfig.isOAuth&&this.agentConfig.type!=="kimi")this.agentConfig.baseUrl&&this.registry.baseUrlEnv&&(e[this.registry.baseUrlEnv]=this.agentConfig.baseUrl);else if(!this.agentConfig.isDirectMode){let r=a(this.registry.gatewayPath),i=this.requireActiveProviderRuntimeToken();if(this.registry.gatewayConfigEnv?e[this.registry.gatewayConfigEnv]=this.buildGatewayConfigJson({[t]:this.sessionTag,...this.providerRuntimeHeaderUpdates()}):this.registry.baseUrlEnv&&this.agentConfig.type!=="kimi"&&(e[this.registry.baseUrlEnv]=i?.baseUrl??r),i&&(this.shouldExposeProviderRuntimeTokenEnv()&&(e[this.registry.apiKeyEnv]=i.token),this.agentConfig.type==="gemini"&&(e.GEMINI_DEFAULT_AUTH_TYPE=on),this.registry.spendTrackingEnvs&&(e[lt]=i.bindingSecret)),!i){if(Re(this.agentConfig.type))throw new Error(`${this.agentConfig.type} gateway mode requires a Dashboard runtime token before sandbox setup`);e[h]=this.agentConfig.apiKey;}}if(this.agentConfig.externalGateway&&this.registry.gatewayConfigEnv&&(e[this.registry.gatewayConfigEnv]=this.buildGatewayConfigJson({})),this.agentConfig.externalGateway&&this.agentConfig.type==="gemini"&&(e.GEMINI_CLI_TRUST_WORKSPACE="true"),this.agentConfig.type==="claude"&&(e.IS_SANDBOX="1"),this.managedBrowserSession&&this.options.managedBrowser&&Object.assign(e,Zt(this.options.managedBrowser.provider,this.managedBrowserSession).envs),this.managedSecretRuntimeToken&&Object.assign(e,oi(this.managedSecretRuntimeToken)),n&&Object.assign(e,n),!this.agentConfig.isDirectMode&&this.registry.customHeadersEnv){let r=this.registry.customHeadersEnv,i=this.registry.customHeadersFormat||"newline";e[r]=an(e[r],{[t]:this.sessionTag,...this.providerRuntimeHeaderUpdates()},i);}return !this.agentConfig.isDirectMode&&this.registry.spendTrackingEnvs&&(e[this.registry.spendTrackingEnvs.sessionTagEnv]=this.sessionTag),e}buildSandboxCreateOptions(e){return {...this.options.sandboxCreateOptions,envs:e,workingDirectory:this.workingDir}}validatedUserSecretsForEnvironment(){let e={...this.options.sandboxCreateOptions?.envs,...this.options.secrets};if(Object.keys(e).length===0)return;let n=new Set;this.agentConfig.isDirectMode||(n.add(h),n.add(lt),this.agentConfig.type==="gemini"&&n.add("GEMINI_DEFAULT_AUTH_TYPE"));let r=o=>{o&&n.add(o);};r(this.registry.apiKeyEnv),r(this.registry.baseUrlEnv);for(let o of Object.values(this.registry.providerEnvMap??{}))r(o.keyEnv);if(this.managedSecretRuntimeToken)for(let o of ei())n.add(o);for(let o of this.managedSecretRuntimeToken?.env??[])r(o.envName);let i={};for(let[o,c]of Object.entries(e)){if(n.has(o))throw new Error(`${o} is reserved for Evolve-managed sandbox services and cannot be set with secrets`);o!==this.registry.gatewayConfigEnv&&(i[o]=c);}return i}async ensureManagedBrowserSession(e){this.managedBrowserSession||!this.options.managedBrowser||(this.managedBrowserSession=await Vr(this.options.managedBrowser,this.sessionTag,{browserCredentials:this.options.browserCredentials!==void 0}),this.emitLifecycle(e,"browser_ready"));}async ensureProviderRuntimeToken(){let e=Re(this.agentConfig.type);if(this.agentConfig.isDirectMode||!e||!this.options.providerRouting||this.providerRuntimeToken)return;let n;try{n=await qr(this.options.providerRouting,{provider:e,sessionTag:this.sessionTag});}catch(r){throw Wr(r)?new Error(`${e} runtime token endpoint is required in gateway mode: ${r.message}`):r}this.providerRuntimeToken=n,this.providerRuntimeToken&&this.sandbox?.sandboxId&&await this.bindProviderRuntimeToken(this.sandbox.sandboxId);}async bindProviderRuntimeToken(e){if(!this.providerRuntimeToken||!this.options.providerRouting)return;if(!await Jr(this.options.providerRouting,{token:this.providerRuntimeToken.token,sandboxId:e}))throw new Error("Failed to bind provider runtime token to sandbox")}async setupManagedBrowser(e){if(!this.managedBrowserSession||!this.options.managedBrowser)return;let n=Zt(this.options.managedBrowser.provider,this.managedBrowserSession);for(let r of n.directories)await e.files.makeDir(r);for(let r of n.files)await e.files.write(r.path,r.data);}async closeManagedBrowserSession(){if(!this.managedBrowserSession||!this.options.managedBrowser)return;let e=this.managedBrowserSession;this.managedBrowserSession=void 0;try{await zr(this.options.managedBrowser,e);}catch(n){console.warn(`[Evolve] Managed browser cleanup failed: ${n.message}`);}}async closeProviderRuntimeToken(e=false){if(!this.providerRuntimeToken||!this.options.providerRouting)return;let n=this.providerRuntimeToken,r;for(let o=0;o<3;o++)try{if(!await Yr(this.options.providerRouting,{token:n.token}))throw new Error("Dashboard returned ok=false");this.providerRuntimeToken=void 0;return}catch(c){r=c,o<2&&await new Promise(a=>setTimeout(a,100*(o+1)));}let i=`Provider runtime token cleanup failed: ${r.message}`;if(e)throw new Error(i);console.warn(`[Evolve] ${i}`),this.providerRuntimeToken=void 0;}async ensureManagedSecretRuntimeToken(){this.managedSecretRuntimeToken||!this.options.managedSecrets||(this.managedSecretRuntimeToken=await ni({apiKey:this.options.managedSecrets.apiKey,dashboardUrl:this.options.managedSecrets.dashboardUrl},{sessionTag:this.sessionTag,secrets:this.options.managedSecrets.secrets}));}async bindManagedSecretRuntimeToken(e){if(!this.managedSecretRuntimeToken||!this.options.managedSecrets)return;if(!await ri({apiKey:this.options.managedSecrets.apiKey,dashboardUrl:this.options.managedSecrets.dashboardUrl},{token:this.managedSecretRuntimeToken.token,sandboxId:e}))throw new Error("Failed to bind managed secret runtime token to sandbox")}async setupManagedSecretEgress(e){if(!this.managedSecretRuntimeToken)return;if(await e.files.makeDir(I),await e.commands.run(`umask 077 && mkdir -p ${I}/certs && chmod 700 ${I} ${I}/certs`,{timeoutMs:5e3}),await e.files.write(_e,ti),await e.files.write(ie,ai(this.managedSecretRuntimeToken)),await e.commands.run(`chmod 700 ${_e} && chmod 600 ${ie}`,{timeoutMs:5e3}),await e.commands.run(ci(),{timeoutMs:3e4}),this.managedSecretProxy=await e.commands.spawn(li(),{timeoutMs:3e4}),(await e.commands.run(`python3 - <<'PY'
|
|
614
|
+
import socket, sys, time
|
|
615
|
+
for _ in range(50):
|
|
616
|
+
try:
|
|
617
|
+
s = socket.create_connection(("127.0.0.1", ${ot}), timeout=0.2)
|
|
618
|
+
s.close()
|
|
619
|
+
sys.exit(0)
|
|
620
|
+
except OSError:
|
|
621
|
+
time.sleep(0.1)
|
|
622
|
+
sys.exit(1)
|
|
623
|
+
PY`,{timeoutMs:1e4})).exitCode!==0)throw new Error("Managed secret egress proxy failed to start");await e.commands.run(di(),{timeoutMs:5e3});}async closeManagedSecretRuntimeToken(){let e=this.managedSecretProxy;if(this.managedSecretProxy=void 0,e&&await e.kill().catch(()=>false),!this.managedSecretRuntimeToken||!this.options.managedSecrets)return;let n=this.managedSecretRuntimeToken,r;try{for(let i=0;i<3;i++)try{if(!await ii({apiKey:this.options.managedSecrets.apiKey,dashboardUrl:this.options.managedSecrets.dashboardUrl},{token:n.token}))throw new Error("Dashboard returned ok=false");return}catch(o){r=o,i<2&&await new Promise(c=>setTimeout(c,100*(i+1)));}console.warn(`[Evolve] Managed secret runtime token cleanup failed: ${r.message}`);}finally{this.managedSecretRuntimeToken=void 0;}}buildGatewayConfigJson(e){let n=this.requireActiveProviderRuntimeToken(),r=this.agentConfig.externalGateway?this.agentConfig.baseUrl??dt(a(this.registry.gatewayPath)):n?.baseUrl??dt(a(this.registry.gatewayPath)),i=this.resolveCommandModel(this.agentConfig.model||this.registry.defaultModel),o={},c=this.options.secrets?.[this.registry.gatewayConfigEnv];if(c)try{o=JSON.parse(c);}catch{}let a$1=o.provider??{},l=a$1.litellm??{},d=l.options??{},s=l.models??{},p=s[i]??{},u=p.headers??{},g=this.agentConfig.type==="opencode"?bt(this.agentConfig.reasoningEffort):void 0,f=p.variants??{},m=g?f[g]??{}:void 0;return o.provider={...a$1,litellm:{...l,npm:"@ai-sdk/openai-compatible",options:{...d,baseURL:r,apiKey:n?.token??this.agentConfig.apiKey},models:{...s,[i]:{...p,name:i,headers:{...u,...e},...g?{variants:{...f,[g]:{...m,reasoningEffort:g}}}:{}}}}},JSON.stringify(o)}activeProviderRuntimeToken(){let e=Re(this.agentConfig.type);return e&&this.providerRuntimeToken?.provider===e?this.providerRuntimeToken:void 0}requireActiveProviderRuntimeToken(){let e=Re(this.agentConfig.type),n=this.activeProviderRuntimeToken();if(!this.agentConfig.isDirectMode&&e&&!n)throw new Error(`${this.agentConfig.type} gateway mode requires a Dashboard runtime token before sandbox setup`);return n}ensureSessionLogger(e){if(this.sessionLogger)return;let n=this.options.sandboxProvider;this.sessionLogger=new ye({provider:n?.name||n?.providerType||"unknown",agent:this.agentConfig.type,model:this.agentConfig.model||this.registry.defaultModel,sandboxId:e.sandboxId,tag:this.sessionTag,apiKey:this.agentConfig.isDirectMode?void 0:this.agentConfig.apiKey,observability:{...this.options.observability,...this.managedBrowserSession&&this.options.managedBrowser?{browser_provider:this.options.managedBrowser.provider,browser_session_id:this.managedBrowserSession.id,dashboard_session_id:this.managedBrowserSession.sessionId,browser_session_tag:this.managedBrowserSession.sessionTag,browser_live_url:this.managedBrowserSession.liveUrl}:{}}});}async flushSessionLoggerWithTimeout(e=2e3){this.sessionLogger&&await Promise.race([this.sessionLogger.flush(),new Promise(n=>setTimeout(n,e))]);}requiresPreRunDashboardIngest(){return !!(this.activeProviderRuntimeToken()||this.managedSecretRuntimeToken)}providerRuntimeHeaderUpdates(){let e=this.activeProviderRuntimeToken();return e?{[nn]:e.bindingSecret}:{}}shouldExposeProviderRuntimeTokenEnv(){return this.agentConfig.type!=="kimi"&&!this.registry.gatewayConfigEnv}buildProviderRuntimeProcessEnvs(){if(this.agentConfig.externalGateway){if(this.agentConfig.type==="kimi")return this.buildKimiDirectModelEnvs();let r={[this.registry.apiKeyEnv]:this.agentConfig.apiKey};return this.registry.baseUrlEnv&&this.agentConfig.baseUrl&&(r[this.registry.baseUrlEnv]=this.agentConfig.baseUrl),this.registry.gatewayConfigEnv&&(r[this.registry.gatewayConfigEnv]=this.buildGatewayConfigJson({})),this.agentConfig.type==="gemini"&&(r.GEMINI_CLI_TRUST_WORKSPACE="true"),r}let e=this.activeProviderRuntimeToken();if(!e)return {};let n={};if(this.shouldExposeProviderRuntimeTokenEnv()&&(n[this.registry.apiKeyEnv]=e.token),this.agentConfig.type==="gemini"&&(n.GEMINI_DEFAULT_AUTH_TYPE=on),this.registry.baseUrlEnv&&this.shouldExposeProviderRuntimeTokenEnv()&&(n[this.registry.baseUrlEnv]=e.baseUrl),this.registry.spendTrackingEnvs&&(n[lt]=e.bindingSecret),this.registry.customHeadersEnv){let r=this.registry.customHeadersEnv,i=this.registry.customHeadersFormat||"newline";n[r]=an(this.options.secrets?.[r],this.providerRuntimeHeaderUpdates(),i);}return n}buildRunEnvs(e){if(this.agentConfig.externalGateway)return this.buildProviderRuntimeProcessEnvs();if(this.agentConfig.isDirectMode)return;let n=this.buildProviderRuntimeProcessEnvs(),r=this.registry.customHeadersEnv;if(r){let o=this.options.secrets?.[r],c=this.registry.customHeadersFormat||"newline";return n[r]=an(o,{[t]:this.sessionTag,[u]:`${v}${e}`,...this.providerRuntimeHeaderUpdates()},c),n}let i=this.registry.spendTrackingEnvs;return i?{...n,[i.sessionTagEnv]:this.sessionTag,[i.runTagEnv]:`${v}${e}`}:this.registry.gatewayConfigEnv?{...n,[this.registry.gatewayConfigEnv]:this.buildGatewayConfigJson({[t]:this.sessionTag,[u]:`${v}${e}`,...this.providerRuntimeHeaderUpdates()})}:Object.keys(n).length>0?n:void 0}async writeCodexGatewayProviderConfig(e){if(this.agentConfig.type==="codex"){if(this.agentConfig.externalGateway){await ze(e,this.agentConfig.baseUrl||a(),void 0,void 0,this.homeDir);return}this.agentConfig.isDirectMode||!this.registry.spendTrackingEnvs||await ze(e,this.activeProviderRuntimeToken()?.baseUrl||this.agentConfig.baseUrl||a(),this.registry.spendTrackingEnvs,this.activeProviderRuntimeToken()?{[nn]:lt}:void 0,this.homeDir);}}captureDroidSession(e,n){if(this.agentConfig.type!=="droid")return;let r=n?.find(o=>typeof o.sessionId=="string"&&o.sessionId.length>0)?.sessionId;if(r){this.droidSessionId=r;return}let i=this.extractDroidSessionId(e);i&&(this.droidSessionId=i);}extractDroidSessionId(e){try{return this.findDroidSessionId(JSON.parse(e))}catch{return}}findDroidSessionId(e){if(!e||typeof e!="object"||Array.isArray(e))return;let n=e,r=n.sessionId??n.session_id;return typeof r=="string"&&r.length>0?r:this.findDroidSessionId(n.result)??this.findDroidSessionId(n.params)??this.findDroidSessionId(n.notification)}droidSessionStatePath(){return `${this.homeDir}/.factory/evolve-session.json`}async loadDroidSessionState(e){if(!(this.agentConfig.type!=="droid"||this.droidSessionId))try{let n=await e.files.read(this.droidSessionStatePath());if(typeof n!="string")return;let r=JSON.parse(n);typeof r.sessionId=="string"&&r.sessionId.length>0&&(this.droidSessionId=r.sessionId);}catch{}}async writeDroidSessionState(e){this.agentConfig.type!=="droid"||!this.droidSessionId||(await e.files.makeDir(`${this.homeDir}/.factory`),await e.files.write(this.droidSessionStatePath(),JSON.stringify({sessionId:this.droidSessionId},null,2)));}resolveGatewayModel(e){return this.agentConfig.isDirectMode?e:this.registry.gatewayModelAliases?.[e]??e}resolveCommandModel(e){return (this.agentConfig.isDirectMode?this.registry.directModelAliases:this.registry.gatewayModelAliases)?.[e]??e}async setupAgentAuth(e){if(this.agentConfig.oauthFileContent&&this.registry.oauthFileName){let n=O(this.registry.mcpConfig.settingsDir,this.homeDir);await e.files.makeDir(n),await e.files.write(`${n}/${this.registry.oauthFileName}`,this.agentConfig.oauthFileContent);return}this.agentConfig.type==="gemini"&&(!this.agentConfig.isDirectMode||this.agentConfig.externalGateway)&&await this.writeGeminiGatewayAuthSettings(e),this.registry.setupCommand&&await e.commands.run(this.registry.setupCommand,{timeoutMs:3e4});}async writeGeminiGatewayAuthSettings(e){let n=O(this.registry.mcpConfig.settingsDir,this.homeDir),r=`${n}/${this.registry.mcpConfig.filename}`;await e.files.makeDir(n);let i={};try{let a=await e.files.read(r);typeof a=="string"&&a.trim()&&(i=JSON.parse(a));}catch(a){let l=a.message||"";if(!/not found|no such file|does not exist/i.test(l))throw a}let o=typeof i.security=="object"&&i.security!==null?i.security:{},c=typeof o.auth=="object"&&o.auth!==null?o.auth:{};i.security={...o,auth:{...c,selectedType:on}},await e.files.write(r,JSON.stringify(i,null,2));}async setupAgentPlugins(e){await Dr(this.agentConfig.type,e,this.options.plugins);}assertProviderRuntimeDoesNotExposeGatewayKey(e){if(!this.activeProviderRuntimeToken())return;let n=this.agentConfig.apiKey;for(let[r,i]of Object.entries(e))for(let o of Object.values(i.headers||{}))if(o.includes(n))throw new Error(`MCP server "${r}" would expose the Evolve API key inside the sandbox. Use managed agent-browser or remove this gateway-authenticated MCP server.`)}async setupWorkspace(e,n){let r=this.options.workspaceMode||"knowledge";if(r!=="task"){let o=r==="swe"?`${this.workingDir}/repo ${this.workingDir}/context ${this.workingDir}/scripts ${this.workingDir}/temp ${this.workingDir}/output`:`${this.workingDir}/context ${this.workingDir}/scripts ${this.workingDir}/temp ${this.workingDir}/output`;if(await e.commands.run(`mkdir -p ${o}`,{timeoutMs:3e4}),!n?.skipSystemPrompt){let c=jt({workingDir:this.workingDir,systemPrompt:this.options.systemPrompt,browserPrompt:this.options.browserPrompt,schema:this.zodSchema||this.jsonSchema,mode:r}),a=`${this.workingDir}/${this.registry.systemPromptFile}`;await e.files.write(a,c);}this.options.context&&await this.uploadContextFiles(e,this.options.context),this.options.files&&await this.uploadWorkspaceFiles(e,this.options.files);}let i={...this.options.mcpServers};if(this.options.integrations){let o=await or({...this.options.integrations,sessionTag:this.sessionTag});i={...i,integrations:{type:"http",url:o.url,headers:o.headers}};}if(this.options.browserCredentials){if(!this.options.managedBrowser||this.options.managedBrowser.provider!=="agent-browser")throw new Error("Browser credentials require managed remote agent-browser.");if(!this.managedBrowserSession?.id||!this.managedBrowserSession.sessionTag||!this.managedBrowserSession.browserAuthGrantToken)throw new Error("Managed browser session is missing browser credential grant data.");let o=await Hr({apiKey:this.options.browserCredentials.apiKey,dashboardUrl:this.options.browserCredentials.dashboardUrl,browserSessionId:this.managedBrowserSession.id,sessionTag:this.managedBrowserSession.sessionTag,grantToken:this.managedBrowserSession.browserAuthGrantToken,config:this.options.browserCredentials.config});i={...i,[en]:o};}Object.keys(i).length>0&&(this.assertProviderRuntimeDoesNotExposeGatewayKey(i),await Rt(this.agentConfig.type,e,this.workingDir,i,this.homeDir)),await this.writeCodexGatewayProviderConfig(e),!this.agentConfig.isDirectMode&&this.registry.spendTrackingJsonConfig&&await Ke(e,this.agentConfig.type,this.registry.spendTrackingJsonConfig.headersPath,{[t]:this.sessionTag,...this.providerRuntimeHeaderUpdates()},this.homeDir),this.skills?.length&&await this.setupSkills(e);}async setupSkills(e){if(!this.skills?.length)return;let{skillsConfig:n}=this.registry,r=O(n.sourceDir,this.homeDir),i=O(n.targetDir,this.homeDir);await e.files.makeDir(i);for(let o of this.skills){let c=`cp -r ${r}/${o} ${i}/ 2>/dev/null || true`;await e.commands.run(c,{timeoutMs:3e4});}}async uploadContextFiles(e,n){let r=Object.entries(n).map(([o,c])=>({path:`${this.workingDir}/context/${o}`,data:c}));if(r.length===0)return;let i=new Set(r.map(o=>o.path.substring(0,o.path.lastIndexOf("/"))).filter(Boolean));i.size>0&&await e.commands.run(`mkdir -p ${Array.from(i).join(" ")}`,{timeoutMs:3e4}),await e.files.writeBatch(r);}async uploadWorkspaceFiles(e,n){let r=Object.entries(n).map(([o,c])=>({path:o.startsWith("/")?o:`${this.workingDir}/${o}`,data:c}));if(r.length===0)return;let i=new Set(r.map(o=>o.path.substring(0,o.path.lastIndexOf("/"))).filter(Boolean));i.size>0&&await e.commands.run(`mkdir -p ${Array.from(i).join(" ")}`,{timeoutMs:3e4}),await e.files.writeBatch(r);}buildCommand(e){return this.registry.buildCommand({prompt:this.agentConfig.type==="droid"?e:Bo(e),model:this.resolveCommandModel(this.agentConfig.model||this.registry.defaultModel),isResume:this.hasRun,sessionId:this.agentConfig.type==="droid"?this.droidSessionId:void 0,reasoningEffort:this.agentConfig.reasoningEffort,isDirectMode:this.agentConfig.isDirectMode,isExternalGateway:!!this.agentConfig.externalGateway,skills:this.skills,homeDir:this.homeDir})}async run(e,n$1){if(this.credentialsSealed)throw new Error("Agent credentials are sealed; this Evolve instance cannot run the agent again");let{prompt:r,timeoutMs:i=n,background:o=false,checkpointComment:c}=e,{from:a$1}=e;if(this.activeCommand)throw new Error("Agent is already running. Call interrupt(), wait for the active/background run to finish, or create a new Evolve instance.");if(a$1&&(this.sandbox||this.options.sandboxId))throw new Error("Cannot restore into existing sandbox. Call kill() first, or create a new Evolve instance.");if(a$1==="latest"){if(!this.storage)throw new Error('Storage not configured. Call .withStorage() before using from: "latest".');let v=await Yt(this.storage);if(!v)throw new Error('No checkpoints found for from: "latest".');a$1=v.id;}if(a$1){if(!this.storage)throw new Error("Storage not configured. Call .withStorage() before using 'from'.");if(!this.options.sandboxProvider)throw new Error("No sandbox provider configured");await this.ensureManagedBrowserSession(n$1),await this.ensureProviderRuntimeToken(),await this.ensureManagedSecretRuntimeToken();let v=this.buildEnvironmentVariables();this.sandboxState="booting",this.emitLifecycle(n$1,"sandbox_boot");try{this.sandbox=await this.options.sandboxProvider.create(this.buildSandboxCreateOptions(v)),await this.bindProviderRuntimeToken(this.sandbox.sandboxId),await this.bindManagedSecretRuntimeToken(this.sandbox.sandboxId),await this.setupManagedSecretEgress(this.sandbox);let S=await Er(this.sandbox,this.storage,a$1);if(await this.setupManagedBrowser(this.sandbox),S.agentType&&S.agentType!==this.agentConfig.type)throw new Error(`Cannot restore checkpoint: agent type mismatch (checkpoint: ${S.agentType}, current: ${this.agentConfig.type})`);let C=this.options.workspaceMode||"knowledge";if(S.workspaceMode&&S.workspaceMode!==C)throw new Error(`Cannot restore checkpoint: workspace mode mismatch (checkpoint: ${S.workspaceMode}, current: ${C})`);await this.setupAgentAuth(this.sandbox),await this.setupAgentPlugins(this.sandbox);let T=!!(this.options.systemPrompt||this.options.browserPrompt||this.zodSchema||this.jsonSchema);await this.setupWorkspace(this.sandbox,{skipSystemPrompt:!T}),await this.loadDroidSessionState(this.sandbox),this.hasRun=!0,this.lastCheckpointId=a$1,this.sandboxState="ready",this.agentState="idle",this.emitLifecycle(n$1,"sandbox_ready");}catch(S){throw this.sandbox&&(await this.sandbox.kill().catch(()=>{}),this.sandbox=void 0),await this.closeManagedBrowserSession().catch(()=>{}),await this.closeProviderRuntimeToken().catch(()=>{}),await this.closeManagedSecretRuntimeToken().catch(()=>{}),this.sandboxState="error",this.agentState="error",this.emitLifecycle(n$1,"sandbox_error"),S}}let l=await this.getSandbox(n$1);await this.ensureProviderRuntimeToken(),await this.loadDroidSessionState(l),this.lastRunTimestamp=Date.now(),this.ensureSessionLogger(l),this.sessionLogger?.writePrompt(r),this.requiresPreRunDashboardIngest()&&await this.flushSessionLoggerWithTimeout();let d=this.buildCommand(r),s=randomUUID(),p=this.buildRunEnvs(s);if(await this.writeCodexGatewayProviderConfig(l),!this.agentConfig.isDirectMode&&this.registry.spendTrackingJsonConfig&&await Ke(l,this.agentConfig.type,this.registry.spendTrackingJsonConfig.headersPath,{[t]:this.sessionTag,[u]:`${v}${s}`,...this.providerRuntimeHeaderUpdates()},this.homeDir),this.agentConfig.type==="qwen"&&await Ct(l,de(this.agentConfig.reasoningEffort),this.homeDir),!this.agentConfig.isDirectMode&&this.registry.spendTrackingTomlProvider){let v$1=this.requireActiveProviderRuntimeToken();await Tt(l,{...this.registry.spendTrackingTomlProvider,maxContextSize:this.resolveKimiMaxContextSize()},{[t]:this.sessionTag,[u]:`${v}${s}`,...this.providerRuntimeHeaderUpdates()},{baseUrl:dt(v$1?.baseUrl??a(this.registry.gatewayPath)),apiKey:v$1?.token??this.agentConfig.apiKey,model:this.resolveCommandModel(this.agentConfig.model||this.registry.defaultModel),defaultThinking:de(this.agentConfig.reasoningEffort),thinkingEffort:hi(this.agentConfig.reasoningEffort)},this.homeDir);}if((!this.agentConfig.isDirectMode||this.agentConfig.externalGateway)&&this.registry.droidGatewaySettings){let v$1=!!this.agentConfig.externalGateway,S=v$1?void 0:this.requireActiveProviderRuntimeToken();await Ge(l,{...this.registry.droidGatewaySettings,model:this.resolveCommandModel(this.agentConfig.model||this.registry.defaultModel),baseUrl:v$1?this.agentConfig.baseUrl??a():dt(S?.baseUrl??a()),apiKeyEnv:this.registry.apiKeyEnv},v$1?{}:{[t]:this.sessionTag,[u]:`${v}${s}`,...this.providerRuntimeHeaderUpdates()},this.homeDir);}let u$1="",g=q(this.agentConfig.type),f=v=>{u$1+=v;let S=u$1.split(`
|
|
624
|
+
`);u$1=S.pop()??"";for(let C of S){if(!C.trim())continue;let T=g(C);if(this.captureDroidSession(C,T),this.sessionLogger?.writeEventParsed(C,T),n$1?.onStdout?.(C+`
|
|
625
|
+
`),T&&n$1?.onContent)for(let V of T)n$1.onContent(V);}},m=v=>{n$1?.onStderr?.(v);},h=await l.commands.spawn(d,{cwd:this.workingDir,timeoutMs:i,envs:p,onStdout:f,onStderr:m}),y=this.beginOperation("run",h,n$1,"run_start");if(this.hasRun=true,o)return this.watchBackgroundOperation(y,"run",h,n$1,l),{sandboxId:l.sandboxId,sessionId:this.managedBrowserSession?.sessionId,browser:this.browserResponseInfo(),runId:s,exitCode:0,stdout:`Background process started with ID ${h.processId}`,stderr:""};let w;try{w=await h.wait();}catch(v){throw this.interruptedOperations.delete(y),this.finalizeOperation(y,n$1,"run_failed","error"),v}if(this.interruptedOperations.delete(y)||w.exitCode===130?this.finalizeOperation(y,n$1,"run_interrupted","interrupted"):w.exitCode===0?this.finalizeOperation(y,n$1,"run_complete","idle"):this.finalizeOperation(y,n$1,"run_failed","error"),u$1.trim()){let v=g(u$1);if(this.captureDroidSession(u$1,v),this.sessionLogger?.writeEventParsed(u$1,v),n$1?.onStdout?.(u$1+`
|
|
626
|
+
`),v&&n$1?.onContent)for(let S of v)n$1.onContent(S);}await this.writeDroidSessionState(l),this.sessionLogger&&!o&&await this.flushSessionLoggerWithTimeout();let k;if(this.storage&&!o&&w.exitCode===0)try{k=await Jt(l,this.storage,this.agentConfig.type,this.workingDir,{tag:this.sessionTag,model:this.agentConfig.model||this.registry.defaultModel,workspaceMode:this.options.workspaceMode||"knowledge",comment:c,parentId:this.lastCheckpointId}),this.lastCheckpointId=k.id;}catch(v){console.warn(`[Evolve] Auto-checkpoint failed: ${v.message}`);}return {sandboxId:l.sandboxId,sessionId:this.managedBrowserSession?.sessionId,browser:this.browserResponseInfo(),runId:s,exitCode:w.exitCode,stdout:w.stdout,stderr:w.stderr,checkpoint:k}}async executeCommand(e,n$1={},r){let{timeoutMs:i=n,background:o=false}=n$1;if(this.activeCommand)throw new Error("Agent is already running. Call interrupt(), wait for the active/background command to finish, or create a new Evolve instance.");let c=await this.getSandbox(r);this.credentialsSealed||await this.ensureProviderRuntimeToken(),this.lastRunTimestamp=Date.now(),this.requiresPreRunDashboardIngest()&&(this.ensureSessionLogger(c),this.sessionLogger?.writePrompt(e),await this.flushSessionLoggerWithTimeout());let a="",l="",d=h=>{a+=h,r?.onStdout?.(h);},s=h=>{l+=h,r?.onStderr?.(h);},p=this.credentialsSealed?{}:this.buildProviderRuntimeProcessEnvs(),u=await c.commands.spawn(e,{cwd:this.workingDir,timeoutMs:i,envs:Object.keys(p).length>0?p:void 0,onStdout:d,onStderr:s}),g=this.beginOperation("command",u,r,"command_start");if(o)return this.watchBackgroundOperation(g,"command",u,r),{sandboxId:c.sandboxId,sessionId:this.managedBrowserSession?.sessionId,browser:this.browserResponseInfo(),exitCode:0,stdout:`Background process started with ID ${u.processId}`,stderr:""};let f;try{f=await u.wait();}catch(h){throw this.interruptedOperations.delete(g),this.finalizeOperation(g,r,"command_failed","error"),h}return this.interruptedOperations.delete(g)||f.exitCode===130?this.finalizeOperation(g,r,"command_interrupted","interrupted"):f.exitCode===0?this.finalizeOperation(g,r,"command_complete","idle"):this.finalizeOperation(g,r,"command_failed","error"),{sandboxId:c.sandboxId,sessionId:this.managedBrowserSession?.sessionId,browser:this.browserResponseInfo(),exitCode:f.exitCode,stdout:a||f.stdout||"",stderr:l||f.stderr||""}}async sealCredentials(){if(this.credentialsSealed)return;if(!this.sandbox)throw new Error("No active sandbox. Call run() or executeCommand() first.");if(this.activeCommand)throw new Error("Cannot seal credentials while a process is running.");if(this.agentConfig.isDirectMode&&!this.agentConfig.externalGateway)throw new Error("Credential sealing requires gateway mode; direct provider credentials cannot be revoked by Evolve");if([this.options.secrets&&Object.keys(this.options.secrets).length>0,this.options.sandboxCreateOptions?.envs&&Object.keys(this.options.sandboxCreateOptions.envs).length>0,this.options.managedSecrets,this.options.integrations,this.options.mcpServers&&Object.keys(this.options.mcpServers).length>0,this.options.managedBrowser,this.options.browserCredentials].some(Boolean))throw new Error("Credential sealing requires a credential-minimal sandbox: omit secrets, managed secrets, integrations, MCP servers, and browser credentials");if(this.agentConfig.externalGateway){await this.agentConfig.externalGateway.revoke(),this.credentialsSealed=true;return}if(!this.providerRuntimeToken||!this.options.providerRouting)throw new Error("Cannot seal credentials: no active provider runtime token to revoke. Without a gateway-issued runtime token the sandbox may hold credentials Evolve cannot revoke, so sealing would be a false guarantee.");await this.closeProviderRuntimeToken(true),this.credentialsSealed=true;}isSealed(){return this.credentialsSealed}async collectArtifacts(e){if(!this.credentialsSealed)throw new Error("Call sealCredentials() before collecting artifacts.");if(!this.sandbox)throw new Error("No active sandbox.");if(this.activeCommand)throw new Error("Cannot collect artifacts while a process is running.");return gi(this.sandbox,this.workingDir,e)}async uploadContext(e){let n=await this.getSandbox();await this.uploadContextFiles(n,e);}async uploadFiles(e){let n=await this.getSandbox();await this.uploadWorkspaceFiles(n,e);}async uploadFileFromPath(e,n){let r=await this.getSandbox(),i=e.startsWith("/")?e:`${this.workingDir}/${e}`,o=i.substring(0,i.lastIndexOf("/"));if(o&&await r.commands.run(`mkdir -p ${o}`,{timeoutMs:3e4}),r.files.writeFromPath){await r.files.writeFromPath(i,n);return}let{readFile:c}=await import('fs/promises');await r.files.write(i,await c(n));}async getOutputFiles(e=false){let n=await this.getSandbox(),r=`${this.workingDir}/output`,i=e?"":"-maxdepth 1",c=(await n.commands.run(`find ${r} ${i} -type f -exec stat -c '%n|%Z' {} \\; 2>/dev/null || true`,{timeoutMs:3e4})).stdout.split(`
|
|
627
|
+
`).filter(Boolean),a=this.lastRunTimestamp?Math.floor(this.lastRunTimestamp/1e3)-2:0,l=[],d=`${r}/`;for(let f of c){let[m,h]=f.split("|");if(!m||!h)continue;let y=parseInt(h,10);a>0&&y<a||l.push(m);}let s={},p=await Promise.all(l.map(async f=>{try{let m=await n.files.read(f);return {relativePath:f.startsWith(d)?f.slice(d.length):f.split("/").pop()||f,content:m}}catch{return null}}));for(let f of p)f&&(s[f.relativePath]=f.content);if(!this.zodSchema&&!this.jsonSchema)return {files:s,data:null};let u=s["result.json"];if(!u)return {files:s,data:null,error:"Schema provided but agent did not create output/result.json"};let g=typeof u=="string"?u:new TextDecoder().decode(u);try{let f=JSON.parse(g);if(this.zodSchema){let m=this.zodSchema.safeParse(f);return m.success?{files:s,data:m.data}:{files:s,data:null,error:`Schema validation failed: ${m.error.message}`,rawData:g}}if(this.compiledValidator){if(this.compiledValidator(f))return {files:s,data:f};{let h=this.compiledValidator.errors?.map(y=>`${y.instancePath} ${y.message}`).join(", ")||"Unknown validation error";return {files:s,data:null,error:`Schema validation failed: ${h}`,rawData:g}}}return {files:s,data:null}}catch(f){return {files:s,data:null,error:`Failed to parse result.json: ${f.message}`,rawData:g}}}async checkpoint(e){if(!this.storage)throw new Error("Storage not configured. Call .withStorage().");if(!this.sandbox)throw new Error("No active sandbox. Call run() first.");let n=await Jt(this.sandbox,this.storage,this.agentConfig.type,this.workingDir,{tag:this.sessionTag,model:this.agentConfig.model||this.registry.defaultModel,workspaceMode:this.options.workspaceMode||"knowledge",comment:e?.comment,parentId:this.lastCheckpointId});return this.lastCheckpointId=n.id,n}getSession(){return this.sandbox?.sandboxId||this.options.sandboxId||null}async setSession(e){if(this.credentialsSealed)throw new Error("Agent credentials are sealed and this Evolve instance cannot switch sandboxes");if(this.options.managedSecrets)throw new Error("setSession() cannot be used with managed secrets; managed secret grants are sandbox-scoped.");if(this.options.sandboxCreateOptions?.user)throw new Error("setSession() cannot be used with a configured sandbox user; the user cannot be enforced on an existing sandbox.");if(this.activeCommand&&!await this.interrupt())throw new Error("Cannot switch session while an active process is running and could not be interrupted.");await this.rotateSession(),await this.closeProviderRuntimeToken(),await this.closeManagedSecretRuntimeToken(),await this.closeManagedBrowserSession(),this.options.sandboxId=e,this.sandbox=void 0,this.interruptedOperations.clear(),this.invalidateActiveOperation(),this.sandboxState="ready",this.agentState="idle",this.hasRun=true,this.lastCheckpointId=void 0;}async pause(e){this.sandbox&&(this.activeCommand&&await this.interrupt(e),await this.sandbox.pause(),this.sandboxState="paused",this.agentState="idle",this.emitLifecycle(e,"sandbox_pause"));}async resume(e){this.sandbox&&this.options.sandboxProvider&&(this.sandbox=await this.options.sandboxProvider.connect(this.sandbox.sandboxId),this.sandboxState="ready",this.agentState="idle",this.emitLifecycle(e,"sandbox_resume"));}async interrupt(e){if(!this.activeCommand&&!this.activeProcessId)return false;let n=this.activeOperationId,r=this.activeOperationKind,i=false;try{this.activeCommand?i=await this.activeCommand.kill():this.sandbox&&this.activeProcessId&&(i=await this.sandbox.commands.kill(this.activeProcessId));}catch{i=false;}if(!i)return this.sandboxState="running",this.agentState="running",false;n!==null&&this.interruptedOperations.add(n),this.invalidateActiveOperation(),this.sandboxState="ready",this.agentState="interrupted";let o=r==="run"?"run_interrupted":"command_interrupted";return this.emitLifecycle(e,o),i}status(){let e=this.browserRuntimeInfo();return {sandboxId:this.getSession(),sandbox:this.sandboxState,agent:this.agentState,activeProcessId:this.activeProcessId,hasRun:this.hasRun,timestamp:new Date().toISOString(),...e?{browser:e}:{}}}async kill(e){await this.rotateSession();let n;try{this.activeCommand&&await this.interrupt(e),this.sandbox&&(await this.sandbox.kill(),this.sandbox=void 0);}catch(r){n=r;}finally{await this.closeProviderRuntimeToken(),await this.closeManagedSecretRuntimeToken(),await this.closeManagedBrowserSession();}if(n)throw n;this.options.sandboxId=void 0,this.interruptedOperations.clear(),this.invalidateActiveOperation(),this.sandboxState="stopped",this.agentState="idle",this.hasRun=false,this.lastCheckpointId=void 0,this.emitLifecycle(e,"sandbox_killed");}async getHost(e){return (await this.getSandbox()).getHost(e)}getAgentType(){return this.agentConfig.type}getSessionTag(){return !this.sandbox&&!this.sessionLogger?null:this.sessionTag}getSessionTimestamp(){return this.sessionLogger?.getTimestamp()||null}async flushObservability(){await this.sessionLogger?.flush();}async rotateSession(){let e=!!this.sessionLogger;this.sessionLogger&&(await this.sessionLogger.close(),this.sessionLogger=void 0),e&&(this.previousSessionTag=this.sessionTag),this.sessionTag=fi(this.options.sessionTagPrefix||"evolve");}async fetchSpend(e){if(this.agentConfig.isDirectMode)throw new Error("Cost tracking requires gateway mode (set EVOLVE_API_KEY).");let n=this.agentConfig.apiKey;if(!n)throw new Error("Cost tracking requires an API key.");let r=process.env.EVOLVE_DASHBOARD_URL||s,i=await fetch(`${r}/api/sessions/spend?${e}`,{headers:{Authorization:`Bearer ${n}`},signal:AbortSignal.timeout(1e4)});if(!i.ok){let o=await i.text().catch(()=>"");throw new Error(`Spend query failed (${i.status}): ${o}`)}return i}resolveSpendTag(){if(this.sandbox||this.sessionLogger)return this.sessionTag;if(this.previousSessionTag)return this.previousSessionTag;throw new Error("No session to query. Call run() first.")}normalizeRunCost(e,n){return {...e,asOf:e.asOf??n.asOf,isComplete:e.isComplete??n.isComplete,truncated:e.truncated??n.truncated}}normalizeSessionCost(e){let n={asOf:e.asOf,isComplete:e.isComplete,truncated:e.truncated};return {...e,runs:e.runs.map(r=>this.normalizeRunCost(r,n))}}async getSessionCost(){let e=this.resolveSpendTag(),n=new URLSearchParams({tag:e}),i=await(await this.fetchSpend(n)).json();return this.normalizeSessionCost(i)}async getRunCost(e){let n=this.resolveSpendTag();if("runId"in e){let c=new URLSearchParams({tag:n,runId:e.runId}),l=await(await this.fetchSpend(c)).json();return this.normalizeRunCost(l,{asOf:new Date().toISOString(),isComplete:false,truncated:false})}let r=await this.getSessionCost(),i=e.index>0?e.index-1:r.runs.length+e.index,o=r.runs[i];if(!o)throw new Error(`Run index ${e.index} out of range. Session has ${r.runs.length} run(s).`);return o}};function Ko(t){return (t||process.env.EVOLVE_DASHBOARD_URL||s).replace(/\/$/,"")}function jo(t){let e=t||process.env.EVOLVE_API_KEY;if(!e)throw new Error("Browser profiles require EVOLVE_API_KEY or an explicit apiKey");return e}async function Go(t){return await t.text().catch(()=>"")}async function yi(t,e,n={}){let r=await fetch(`${Ko(t?.dashboardUrl)}${e}`,{...n,headers:{Authorization:`Bearer ${jo(t?.apiKey)}`,accept:"application/json",...n.body?{"content-type":"application/json"}:{},...n.headers||{}}});if(!r.ok)throw new Error(`Browser profiles request failed (${r.status}): ${await Go(r)}`);return r.status===204?{}:await r.json()}var pt=class{constructor(e={}){this.config=e;}toMetadata(e){return {id:e.id,profile:e.profile,createdAt:e.createdAt||e.created_at||"",updatedAt:e.updatedAt||e.updated_at||"",lastUsedAt:e.lastUsedAt??e.last_used_at??null}}async list(){return {profiles:(await yi(this.config,"/api/browser-profiles")).profiles.map(n=>this.toMetadata(n))}}async delete(e){return await yi(this.config,"/api/browser-profiles",{method:"DELETE",body:JSON.stringify(e)})}};function cn(t={}){return new pt(t)}var Ie=class extends EventEmitter{config={};agent;fallbackSandboxState="stopped";fallbackAgentState="idle";fallbackHasRun=false;constructor(){super();}on(e,n){return super.on(e,n)}off(e,n){return super.off(e,n)}emit(e,...n){return super.emit(e,...n)}withAgent(e){return e&&(Qe(e),this.config.agent=e,this._cachedGatewayOverrides=null),this}withSandbox(e){return this.config.sandbox=e,this}withSandboxCreateOptions(e){return this.config.sandboxCreateOptions={...e,envs:e.envs?{...e.envs}:void 0,metadata:e.metadata?{...e.metadata}:void 0},this}withWorkingDirectory(e){return this.config.workingDirectory=e,this}withWorkspaceMode(e){return this.config.workspaceMode=e,this}withSecrets(e){return this.config.secrets={...this.config.secrets,...e},this}withManagedSecrets(e){return this.config.managedSecrets=e,this}withSession(e){return this.config.sandboxId=e,this.agent||(this.fallbackSandboxState="ready",this.fallbackAgentState="idle",this.fallbackHasRun=true),this}withSystemPrompt(e){return this.config.systemPrompt=e,this}withContext(e){return this.config.context={...this.config.context,...e},this}withFiles(e){return this.config.files={...this.config.files,...e},this}withMcpServers(e){return this.config.mcpServers={...this.config.mcpServers,...e},this}withBrowser(e={provider:"agent-browser",remote:true}){return e===false?delete this.config.browser:this.config.browser=e,this}withBrowserCredentials(e={}){return this.config.browserCredentials=e,this}withPlugins(e){let n=Array.isArray(e)?e:[e];return this.config.plugins=[...this.config.plugins??[],...n],this}withSkills(e){return this.config.skills=e,this}withSchema(e,n){return this.config.schema=e,n&&(U(e)?console.warn("[Evolve] schemaOptions ignored for Zod schemas - use .passthrough(), .strip(), z.coerce instead"):this.config.schemaOptions=n),this}withSessionTagPrefix(e){return this.config.sessionTagPrefix=e,this}withObservability(e){return this.config.observability={...this.config.observability,...e},this}withIntegrations(e){return this.config.integrations=e,this}withStorage(e){return this.config.storage=e||{},this}static integrations=ar;static browserCredentials=tn;static browserProfiles=cn;static managedSecrets=sn;async initializeAgent(){let e=Ze(this.config.agent),n=D(e.type);if(this.config.integrations&&e.isDirectMode)throw new Error("withIntegrations() is available only in gateway mode with EVOLVE_API_KEY");if(this.config.managedSecrets&&e.isDirectMode)throw new Error("withManagedSecrets() is available only in gateway mode with EVOLVE_API_KEY");if(this.config.managedSecrets&&this.config.sandboxId)throw new Error("withManagedSecrets() cannot be used with withSession(); managed secret grants are sandbox-scoped.");let r=si(this.config.managedSecrets,n);if(r&&this.config.sandbox&&!me(this.config.sandbox))throw new Error("withManagedSecrets() requires an Evolve-managed sandbox; remove withSandbox() or pass a managed sandbox provider.");let i=this.config.sandbox??(r?await he(e.apiKey):await Bt()),o={},c,a,l=this.config.skills,d;if(this.config.browser){let u=Fr(this.config.browser);if(d=u,u.provider==="browser-use"){if(e.isDirectMode)throw new Error('withBrowser("browser-use") requires gateway mode. Use apiKey/EVOLVE_API_KEY instead of providerApiKey/direct mode.');o=g(e.apiKey);}if((u.provider==="actionbook"||u.provider==="agent-browser")&&(l=Kr(u.provider,l),u.managed)){if(e.isDirectMode)throw new Error(`Managed browser provider "${u.provider}" requires gateway mode. Use apiKey/EVOLVE_API_KEY instead of providerApiKey/direct mode.`);c=u.provider==="actionbook"?Lt:er,a={provider:u.provider,apiKey:e.apiKey,dashboardUrl:process.env.EVOLVE_DASHBOARD_URL||s,...u.profile?{profile:u.profile}:{}};}if(u.profile&&!u.managed)throw new Error('withBrowser({ profile }) requires managed remote browser mode. Use .withBrowser({ profile }) or .withBrowser({ provider: "agent-browser", remote: true, profile }).')}if(this.config.browserCredentials!==void 0){if(this.config.sandboxId)throw new Error("withBrowserCredentials() cannot be used with withSession(); browser login tokens are run-scoped.");if(e.isDirectMode)throw new Error("withBrowserCredentials() requires gateway mode. Use apiKey/EVOLVE_API_KEY instead of providerApiKey/direct mode.");if(!d||d.provider!=="agent-browser"||!d.managed)throw new Error('withBrowserCredentials() requires .withBrowser() or .withBrowser({ provider: "agent-browser", remote: true }).');if(this.config.mcpServers?.["browser-login"])throw new Error('withBrowserCredentials() reserves the "browser-login" MCP server name.')}let s$1=this.config.storage!==void 0?nt(this.config.storage,!e.isDirectMode,s,e.isDirectMode?void 0:e.apiKey):void 0,p={sandboxProvider:i,sandboxCreateOptions:this.config.sandboxCreateOptions,secrets:this.config.secrets,managedSecrets:r?{secrets:r,apiKey:e.apiKey,dashboardUrl:process.env.EVOLVE_DASHBOARD_URL||s}:void 0,sandboxId:this.config.sandboxId,workingDirectory:this.config.workingDirectory,workspaceMode:this.config.workspaceMode,systemPrompt:this.config.systemPrompt,context:this.config.context,files:this.config.files,mcpServers:{...o,...this.config.mcpServers},browserPrompt:c,managedBrowser:a,browserCredentials:this.config.browserCredentials!==void 0?{apiKey:e.apiKey,dashboardUrl:process.env.EVOLVE_DASHBOARD_URL||s,config:this.config.browserCredentials}:void 0,plugins:this.config.plugins,skills:l,schema:this.config.schema,schemaOptions:this.config.schemaOptions,sessionTagPrefix:this.config.sessionTagPrefix,observability:this.config.observability,integrations:this.config.integrations?{...this.config.integrations,apiKey:e.apiKey,dashboardUrl:process.env.EVOLVE_DASHBOARD_URL||s}:void 0,providerRouting:e.isDirectMode?void 0:{apiKey:e.apiKey,dashboardUrl:process.env.EVOLVE_DASHBOARD_URL||s},storage:s$1};this.agent=new Pe(e,p);}createStreamCallbacks(){let e=this.listenerCount("stdout")>0,n=this.listenerCount("stderr")>0,r=this.listenerCount("content")>0,i=this.listenerCount("lifecycle")>0;return {onStdout:e?o=>this.emit("stdout",o):void 0,onStderr:n?o=>this.emit("stderr",o):void 0,onContent:r?o=>this.emit("content",o):void 0,onLifecycle:i?o=>this.emit("lifecycle",o):void 0}}emitLifecycleFromStatus(e){if(this.listenerCount("lifecycle")===0)return;let n=this.status();this.emit("lifecycle",{sandboxId:n.sandboxId,sandbox:n.sandbox,agent:n.agent,timestamp:new Date().toISOString(),reason:e,...n.browser?{browser:n.browser}:{}});}async run({prompt:e,timeoutMs:n,background:r,from:i,checkpointComment:o}){if(i&&this.config.sandboxId)throw new Error("Cannot use 'from' with 'withSession()' \u2014 restore requires a fresh sandbox.");this.agent||await this.initializeAgent();let c=this.createStreamCallbacks();return this.agent.run({prompt:e,timeoutMs:n,background:r,from:i,checkpointComment:o},c)}async executeCommand(e,n={}){this.agent||await this.initializeAgent();let r=this.createStreamCallbacks();return this.agent.executeCommand(e,n,r)}async prepareSandbox(){this.agent||await this.initializeAgent();let e=this.createStreamCallbacks();return (await this.agent.getSandbox(e)).sandboxId}async sealCredentials(){if(!this.agent)throw new Error("Agent not initialized. Call run() or executeCommand() first.");await this.agent.sealCredentials();}isSealed(){return this.agent?.isSealed()??false}async collectArtifacts(e){if(!this.agent)throw new Error("Agent not initialized. Call run() or executeCommand() first.");return this.agent.collectArtifacts(e)}async interrupt(){if(!this.agent)return false;let e=this.createStreamCallbacks();return this.agent.interrupt(e)}async uploadContext(e){return this.agent||await this.initializeAgent(),this.agent.uploadContext(e)}async uploadFiles(e){return this.agent||await this.initializeAgent(),this.agent.uploadFiles(e)}async uploadFileFromPath(e,n){return this.agent||await this.initializeAgent(),this.agent.uploadFileFromPath(e,n)}async getOutputFiles(e=false){if(!this.agent)throw new Error("Agent not initialized. Call run() first.");return this.agent.getOutputFiles(e)}async checkpoint(e){if(!this.agent)throw new Error("Agent not initialized. Call run() first.");return this.agent.checkpoint(e)}_cachedGatewayOverrides=null;resolveGatewayOverrides(){if(this._cachedGatewayOverrides!==null)return this._cachedGatewayOverrides||void 0;try{let e=Ze(this.config.agent);if(!e.isDirectMode)return this._cachedGatewayOverrides={gatewayUrl:s,gatewayApiKey:e.apiKey},this._cachedGatewayOverrides}catch{}this._cachedGatewayOverrides=void 0;}async listCheckpoints(e){if(this.config.storage===void 0)throw new Error("Storage not configured. Call .withStorage().");return Qt(this.config.storage,this.resolveGatewayOverrides()||{}).listCheckpoints(e)}storage(){if(this.config.storage===void 0)throw new Error("Storage not configured. Call .withStorage().");return Qt(this.config.storage,this.resolveGatewayOverrides()||{})}getSession(){return this.agent?this.agent.getSession():this.config.sandboxId??null}async setSession(e){if(this.config.managedSecrets)throw new Error("setSession() cannot be used with withManagedSecrets(); managed secret grants are sandbox-scoped.");this.agent?await this.agent.setSession(e):(this.fallbackSandboxState="ready",this.fallbackAgentState="idle",this.fallbackHasRun=true),this.config.sandboxId=e;}status(){return this.agent?this.agent.status():{sandboxId:this.config.sandboxId??null,sandbox:this.fallbackSandboxState,agent:this.fallbackAgentState,activeProcessId:null,hasRun:this.fallbackHasRun,timestamp:new Date().toISOString()}}async pause(){if(this.agent){let e=this.createStreamCallbacks();await this.agent.pause(e);return}this.config.sandboxId&&this.config.sandbox&&(await(await this.config.sandbox.connect(this.config.sandboxId)).pause(),this.fallbackSandboxState="paused",this.fallbackAgentState="idle",this.emitLifecycleFromStatus("sandbox_pause"));}async resume(){if(this.agent){let e=this.createStreamCallbacks();await this.agent.resume(e);return}this.config.sandboxId&&this.config.sandbox&&(await this.config.sandbox.connect(this.config.sandboxId),this.fallbackSandboxState="ready",this.fallbackAgentState="idle",this.emitLifecycleFromStatus("sandbox_resume"));}async kill(){if(this.agent){let e=this.createStreamCallbacks();await this.agent.kill(e),this.config.sandboxId=void 0,this.fallbackSandboxState="stopped",this.fallbackAgentState="idle",this.fallbackHasRun=false;return}this.config.sandboxId&&this.config.sandbox&&(await(await this.config.sandbox.connect(this.config.sandboxId)).kill(),this.fallbackSandboxState="stopped",this.fallbackAgentState="idle",this.fallbackHasRun=false,this.emitLifecycleFromStatus("sandbox_killed"),this.config.sandboxId=void 0);}async getHost(e){return this.agent||await this.initializeAgent(),this.agent.getHost(e)}getSessionTag(){return this.agent?.getSessionTag()||null}getSessionTimestamp(){return this.agent?.getSessionTimestamp()||null}async flushObservability(){await this.agent?.flushObservability();}async getSessionCost(){if(!this.agent)throw new Error("No agent initialized. Call run() first.");return this.agent.getSessionCost()}async getRunCost(e){if(!this.agent)throw new Error("No agent initialized. Call run() first.");return this.agent.getRunCost(e)}};var oe=class{permits;queue=[];constructor(e){if(e<1)throw new Error("Semaphore max must be >= 1");this.permits=e;}async use(e){await this.acquire();try{return await e()}finally{this.release();}}acquire(){return this.permits>0?(this.permits--,Promise.resolve()):new Promise(e=>this.queue.push(e))}release(){this.queue.length>0?this.queue.shift()():this.permits++;}};var Y=Symbol.for("evolve.SwarmResult"),ae=class t extends Array{get success(){return this.filter(e=>e.status==="success")}get filtered(){return this.filter(e=>e.status==="filtered")}get error(){return this.filter(e=>e.status==="error")}static from(e){let n=new t;return n.push(...e),n}};var ln=class t{config;semaphore;constructor(e={}){let n$1=e.concurrency??o;if(n$1>p)throw new Error(`concurrency=${n$1} exceeds max ${p}. For higher parallelism, scale horizontally with multiple processes.`);this.config={agent:e.agent,sandbox:e.sandbox,tag:e.tag??"swarm",concurrency:n$1,timeoutMs:e.timeoutMs??n,workspaceMode:e.workspaceMode??"knowledge",retry:e.retry,mcpServers:e.mcpServers,skills:e.skills,integrations:e.integrations},this.semaphore=new oe(this.config.concurrency);}async map(e){let{items:n,prompt:r,bestOf:i,verify:o}=e,c=e.retry??this.config.retry,a=this.generateOperationId(),l=e.timeoutMs??this.config.timeoutMs;if(i&&o)throw new Error("map() cannot use both bestOf and verify options simultaneously");let d=await Promise.all(n.map((s,p)=>i?this.executeMapItemWithBestOf(s,r,p,a,e,l,c):o?this.executeMapItemWithVerify(s,r,p,a,e,l,c):c?A(u=>this.executeMapItem(s,r,p,a,e,l,u),c,p):this.executeMapItem(s,r,p,a,e,l)));return ae.from(d)}async filter(e){let{items:n,prompt:r,condition:i,verify:o}=e,c=e.retry??this.config.retry,a=this.generateOperationId(),l=e.timeoutMs??this.config.timeoutMs,d=await Promise.all(n.map((p,u)=>o?this.executeFilterItemWithVerify(p,r,u,a,e,l,c):c?A(g=>this.executeFilterItem(p,r,u,a,e,l,g),c,u):this.executeFilterItem(p,r,u,a,e,l))),s=[];for(let p of d)if(p.status==="error")s.push(p);else if(p.data!==null)try{i(p.data)?s.push(p):s.push({...p,status:"filtered"});}catch(u){s.push({...p,status:"error",data:null,error:`Condition function threw: ${u.message}`});}return ae.from(s)}async reduce(e){let{items:n,prompt:r,verify:i}=e,o=e.retry??this.config.retry,c=this.generateOperationId(),a=e.timeoutMs??this.config.timeoutMs,l=[],d=[];n.forEach((k,v)=>{l.push(this.getFiles(k)),d.push(this.getIndex(k,v));});let s={};l.forEach((k,v)=>{Object.entries(k).forEach(([S,C])=>{s[`item_${d[v]}/${S}`]=C;});});let p=et(s),u=j(rr,{fileTree:p}),g=e.systemPrompt?`${u}
|
|
628
|
+
|
|
629
|
+
${e.systemPrompt}`:u,f=(k,v,S)=>({operationId:c,operation:"reduce",tag:k.tag,sandboxId:k.sandboxId,swarmName:this.config.tag,operationName:e.name,inputCount:n.length,inputIndices:d,errorRetry:v,verifyRetry:S,...this.pipelineContextToMeta(e._pipelineContext)}),m=e.mcpServers??this.config.mcpServers,h=e.skills??this.config.skills,y=e.integrations??this.config.integrations,w=async(k,v,S,C)=>{let T=await this.semaphore.use(()=>this.execute(s,k,{systemPrompt:g,schema:e.schema,schemaOptions:e.schemaOptions,agent:e.agent,mcpServers:m,skills:h,integrations:y,tagPrefix:v,timeoutMs:a,observability:{swarmName:this.config.tag,operationName:e.name,operationId:c,operation:"reduce",role:"worker",errorRetry:S,verifyRetry:C&&C>1?C-1:void 0,...this.pipelineContextToObservability(e._pipelineContext)}})),V=f(T,S,C&&C>1?C-1:void 0);return T.error?{status:"error",data:null,files:T.files,meta:V,error:T.error,rawData:T.rawData}:{status:"success",data:T.data,files:T.files,meta:V}},b=`${this.config.tag}-reduce`;return i?this.runWithVerification((k,v,S)=>w(k,v,void 0,S),{originalPrompt:r,inputFiles:s,verifyConfig:i,timeoutMs:a,systemPrompt:g,schema:e.schema,mcpServers:m,skills:h,integrations:y,operationId:c,baseTag:b,retry:o,operation:"reduce",_pipelineContext:e._pipelineContext}):o?A(k=>{let v=k>1?k-1:void 0,S=v?`${b}-er${v}`:b;return w(r,S,v)},o):w(r,b)}async bestOf(e){let{item:n,prompt:r,config:i}=e,o=e.retry??this.config.retry,c=i.n??i.taskAgents?.length;if(c===void 0)throw new Error("bestOf requires n or taskAgents");if(c<2)throw new Error("bestOf requires n >= 2");let a=this.generateOperationId(),l=e.timeoutMs??this.config.timeoutMs,d=this.getFiles(n),s=i.mcpServers??this.config.mcpServers,p=i.judgeMcpServers??i.mcpServers??this.config.mcpServers,u=i.skills??this.config.skills,g=i.judgeSkills??i.skills??this.config.skills,f=i.integrations??this.config.integrations,m=i.judgeIntegrations??i.integrations??this.config.integrations,h=await Promise.all(Array.from({length:c},async(v,S)=>{let C=o?await A(T=>this.executeBestOfCandidate({inputFiles:d,prompt:r,candidateIndex:S,operationId:a,config:i,systemPrompt:e.systemPrompt,schema:e.schema,schemaOptions:e.schemaOptions,mcpServers:s,skills:u,integrations:f,timeoutMs:l,attempt:T}),o,S):await this.executeBestOfCandidate({inputFiles:d,prompt:r,candidateIndex:S,operationId:a,config:i,systemPrompt:e.systemPrompt,schema:e.schema,schemaOptions:e.schemaOptions,mcpServers:s,skills:u,integrations:f,timeoutMs:l});return i.onCandidateComplete?.(0,S,C.status==="success"?"success":"error"),C})),y=o?await A(v=>this.executeBestOfJudge({inputFiles:d,taskPrompt:r,candidates:h,config:i,timeoutMs:l,operationId:a,systemPrompt:e.systemPrompt,schema:e.schema,schemaOptions:e.schemaOptions,mcpServers:p,skills:g,integrations:m,attempt:v}),{...o,retryOn:void 0},0):await this.executeBestOfJudge({inputFiles:d,taskPrompt:r,candidates:h,config:i,timeoutMs:l,operationId:a,systemPrompt:e.systemPrompt,schema:e.schema,schemaOptions:e.schemaOptions,mcpServers:p,skills:g,integrations:m}),w=h.findIndex(v=>v.status==="success"),b=y.decision?.winner??(w>=0?w:0);i.onJudgeComplete?.(0,b,y.decision?.reasoning??"Judge failed to provide reasoning");let k={operationId:a,operation:"bestof-judge",tag:y.tag,sandboxId:y.sandboxId,swarmName:this.config.tag,operationName:e.name,candidateCount:c};return {winner:h[b]??h[0],winnerIndex:b,judgeReasoning:y.decision?.reasoning??"Judge failed to provide reasoning",judgeMeta:k,candidates:h}}async execute(e,n,r){let i=null,o="",c=r.tagPrefix,a={},l=null,d,s,p={...this.config.agent,...r.agent};try{i=new Ie().withAgent(p).withSandbox(this.config.sandbox).withWorkspaceMode(this.config.workspaceMode).withSessionTagPrefix(r.tagPrefix),r.schema&&i.withSchema(r.schema,r.schemaOptions),r.systemPrompt&&i.withSystemPrompt(r.systemPrompt),r.mcpServers&&i.withMcpServers(r.mcpServers),r.skills?.length&&i.withSkills(r.skills),r.integrations&&i.withIntegrations(r.integrations),r.observability&&i.withObservability(r.observability),Object.keys(e).length>0&&i.withContext(e);let u=await i.run({prompt:n,timeoutMs:r.timeoutMs});o=u.sandboxId,c=i.getSessionTag()??r.tagPrefix;let g=null;try{g=await i.getOutputFiles(!0),a=g.files;}catch{}u.exitCode!==0?d=`Agent exited with code ${u.exitCode}`:r.schema?g?(l=g.data,g.error&&(d=g.error),g.rawData&&(s=g.rawData)):d="Failed to read output files from sandbox":l=a;}catch(u){if(d=u.message,i){c=i.getSessionTag()??r.tagPrefix;try{a=(await i.getOutputFiles(!0)).files;}catch{}}}finally{i&&await i.kill().catch(()=>{});}return {files:a,data:l,tag:c,sandboxId:o,error:d,rawData:s}}async executeMapItem(e,n,r,i,o,c,a=1){let l=this.getFiles(e),d=a>1?`${this.config.tag}-map-${r}-er${a-1}`:`${this.config.tag}-map-${r}`,s=this.evaluatePrompt(n,l,r);if(s instanceof Error)return this.buildErrorResult(`Prompt function threw: ${s.message}`,{operationId:i,operation:"map",tag:d,sandboxId:"",itemIndex:r});let p=o.mcpServers??this.config.mcpServers,u=o.skills??this.config.skills,g=o.integrations??this.config.integrations,f=await this.semaphore.use(()=>this.execute(l,s,{systemPrompt:o.systemPrompt,schema:o.schema,schemaOptions:o.schemaOptions,agent:o.agent,mcpServers:p,skills:u,integrations:g,tagPrefix:d,timeoutMs:c,observability:{swarmName:this.config.tag,operationName:o.name,operationId:i,operation:"map",itemIndex:r,role:"worker",errorRetry:a>1?a-1:void 0,...this.pipelineContextToObservability(o._pipelineContext)}})),m={operationId:i,operation:"map",tag:f.tag,sandboxId:f.sandboxId,swarmName:this.config.tag,operationName:o.name,itemIndex:r,errorRetry:a>1?a-1:void 0,...this.pipelineContextToMeta(o._pipelineContext)};return this.buildResult(f,m)}async executeMapItemWithVerify(e,n,r,i,o,c,a){let l=this.getFiles(e),d=`${this.config.tag}-map-${r}`,s=o.verify,p=o.mcpServers??this.config.mcpServers,u=o.skills??this.config.skills,g=o.integrations??this.config.integrations,f=this.evaluatePrompt(n,l,r);if(f instanceof Error)return this.buildErrorResult(`Prompt function threw: ${f.message}`,{operationId:i,operation:"map",tag:d,sandboxId:"",itemIndex:r});let m=async(h,y,w)=>{let b=await this.semaphore.use(()=>this.execute(l,h,{systemPrompt:o.systemPrompt,schema:o.schema,schemaOptions:o.schemaOptions,agent:o.agent,mcpServers:p,skills:u,integrations:g,tagPrefix:y,timeoutMs:c,observability:{swarmName:this.config.tag,operationName:o.name,operationId:i,operation:"map",itemIndex:r,role:"worker",verifyRetry:w&&w>1?w-1:void 0,...this.pipelineContextToObservability(o._pipelineContext)}})),k={operationId:i,operation:"map",tag:b.tag,sandboxId:b.sandboxId,swarmName:this.config.tag,operationName:o.name,itemIndex:r,verifyRetry:w&&w>1?w-1:void 0,...this.pipelineContextToMeta(o._pipelineContext)};return this.buildResult(b,k)};return this.runWithVerification(m,{originalPrompt:f,inputFiles:l,verifyConfig:s,timeoutMs:c,systemPrompt:o.systemPrompt,schema:o.schema,mcpServers:p,skills:u,integrations:g,operationId:i,baseTag:d,retry:a,itemIndex:r,operation:"map",_pipelineContext:o._pipelineContext})}async executeMapItemWithBestOf(e,n,r,i,o,c,a){let l=this.getFiles(e),d=`${this.config.tag}-map-${r}`,s=this.evaluatePrompt(n,l,r);if(s instanceof Error)return this.buildErrorResult(`Prompt function threw: ${s.message}`,{operationId:i,operation:"map",tag:d,sandboxId:"",itemIndex:r});let p=o.bestOf,u=p.n??p.taskAgents?.length;if(u===void 0||u<2)return this.buildErrorResult("bestOf requires n >= 2 or taskAgents with at least 2 elements",{operationId:i,operation:"map",tag:d,sandboxId:"",itemIndex:r});let g=o.mcpServers??this.config.mcpServers,f=p.mcpServers??g,m=p.judgeMcpServers??p.mcpServers??g,h=o.skills??this.config.skills,y=p.skills??h,w=p.judgeSkills??p.skills??h,b=o.integrations??this.config.integrations,k=p.integrations??b,v=p.judgeIntegrations??p.integrations??b,S=await Promise.all(Array.from({length:u},async(Oe,Ae)=>{let pn=a?await A(bi=>this.executeBestOfCandidate({inputFiles:l,prompt:s,candidateIndex:Ae,operationId:i,config:p,systemPrompt:o.systemPrompt,schema:o.schema,schemaOptions:o.schemaOptions,mcpServers:f,skills:y,integrations:k,timeoutMs:c,parentIndex:r,attempt:bi,_pipelineContext:o._pipelineContext}),a,Ae):await this.executeBestOfCandidate({inputFiles:l,prompt:s,candidateIndex:Ae,operationId:i,config:p,systemPrompt:o.systemPrompt,schema:o.schema,schemaOptions:o.schemaOptions,mcpServers:f,skills:y,integrations:k,timeoutMs:c,parentIndex:r,_pipelineContext:o._pipelineContext});return p.onCandidateComplete?.(r,Ae,pn.status==="success"?"success":"error"),pn})),C=a?await A(Oe=>this.executeBestOfJudge({inputFiles:l,taskPrompt:s,candidates:S,config:p,timeoutMs:c,operationId:i,systemPrompt:o.systemPrompt,schema:o.schema,schemaOptions:o.schemaOptions,mcpServers:m,skills:w,integrations:v,parentIndex:r,attempt:Oe,_pipelineContext:o._pipelineContext}),{...a,retryOn:void 0},0):await this.executeBestOfJudge({inputFiles:l,taskPrompt:s,candidates:S,config:p,timeoutMs:c,operationId:i,systemPrompt:o.systemPrompt,schema:o.schema,schemaOptions:o.schemaOptions,mcpServers:m,skills:w,integrations:v,parentIndex:r,_pipelineContext:o._pipelineContext}),T=S.findIndex(Oe=>Oe.status==="success"),V=C.decision?.winner??(T>=0?T:0),dn=S[V]??S[0];p.onJudgeComplete?.(r,V,C.decision?.reasoning??"Judge failed to provide reasoning");let vi={operationId:i,operation:"bestof-judge",tag:C.tag,sandboxId:C.sandboxId,swarmName:this.config.tag,operationName:o.name,candidateCount:u,...this.pipelineContextToMeta(o._pipelineContext)};return {...dn,meta:{...dn.meta,operation:"map",swarmName:this.config.tag,operationName:o.name,itemIndex:r,...this.pipelineContextToMeta(o._pipelineContext)},bestOf:{winnerIndex:V,judgeReasoning:C.decision?.reasoning??"Judge failed to provide reasoning",judgeMeta:vi,candidates:S}}}async executeFilterItem(e,n,r,i,o,c,a=1){let l=this.getFiles(e),d=a>1?`${this.config.tag}-filter-${r}-er${a-1}`:`${this.config.tag}-filter-${r}`,s=o.mcpServers??this.config.mcpServers,p=o.skills??this.config.skills,u=o.integrations??this.config.integrations,g=await this.semaphore.use(()=>this.execute(l,n,{systemPrompt:o.systemPrompt,schema:o.schema,schemaOptions:o.schemaOptions,agent:o.agent,mcpServers:s,skills:p,integrations:u,tagPrefix:d,timeoutMs:c,observability:{swarmName:this.config.tag,operationName:o.name,operationId:i,operation:"filter",itemIndex:r,role:"worker",errorRetry:a>1?a-1:void 0,...this.pipelineContextToObservability(o._pipelineContext)}})),f={operationId:i,operation:"filter",tag:g.tag,sandboxId:g.sandboxId,swarmName:this.config.tag,operationName:o.name,itemIndex:r,errorRetry:a>1?a-1:void 0,...this.pipelineContextToMeta(o._pipelineContext)};return this.buildResult(g,f,l)}async executeFilterItemWithVerify(e,n,r,i,o,c,a){let l=this.getFiles(e),d=`${this.config.tag}-filter-${r}`,s=o.verify,p=o.mcpServers??this.config.mcpServers,u=o.skills??this.config.skills,g=o.integrations??this.config.integrations,f=async(m,h,y)=>{let w=await this.semaphore.use(()=>this.execute(l,m,{systemPrompt:o.systemPrompt,schema:o.schema,schemaOptions:o.schemaOptions,agent:o.agent,mcpServers:p,skills:u,integrations:g,tagPrefix:h,timeoutMs:c,observability:{swarmName:this.config.tag,operationName:o.name,operationId:i,operation:"filter",itemIndex:r,role:"worker",verifyRetry:y&&y>1?y-1:void 0,...this.pipelineContextToObservability(o._pipelineContext)}})),b={operationId:i,operation:"filter",tag:w.tag,sandboxId:w.sandboxId,swarmName:this.config.tag,operationName:o.name,itemIndex:r,verifyRetry:y&&y>1?y-1:void 0,...this.pipelineContextToMeta(o._pipelineContext)};return this.buildResult(w,b,l)};return this.runWithVerification(f,{originalPrompt:n,inputFiles:l,verifyConfig:s,timeoutMs:c,systemPrompt:o.systemPrompt,schema:o.schema,mcpServers:p,skills:u,integrations:g,operationId:i,baseTag:d,retry:a,itemIndex:r,operation:"filter",_pipelineContext:o._pipelineContext})}async executeBestOfCandidate(e){let{inputFiles:n,prompt:r,candidateIndex:i,operationId:o,config:c,timeoutMs:a,parentIndex:l,attempt:d=1,_pipelineContext:s}=e,p=l!==void 0?`${this.config.tag}-map-${l}-bestof-cand-${i}`:`${this.config.tag}-bestof-cand-${i}`,u=d>1?`${p}-er${d-1}`:p,g=await this.semaphore.use(()=>this.execute(n,r,{systemPrompt:e.systemPrompt,schema:e.schema,schemaOptions:e.schemaOptions,agent:c.taskAgents?.[i],mcpServers:e.mcpServers,skills:e.skills,integrations:e.integrations,tagPrefix:u,timeoutMs:a,observability:{swarmName:this.config.tag,operationId:o,operation:"map",itemIndex:l,role:"candidate",candidateIndex:i,errorRetry:d>1?d-1:void 0,...this.pipelineContextToObservability(s)}})),f={operationId:o,operation:"bestof-cand",tag:g.tag,sandboxId:g.sandboxId,swarmName:this.config.tag,itemIndex:i,errorRetry:d>1?d-1:void 0,candidateIndex:i,...this.pipelineContextToMeta(s)};return this.buildResult(g,f)}buildJudgeContext(e){let n=this.buildEvaluatorContext({inputFiles:e.inputFiles,taskPrompt:e.taskPrompt,systemPrompt:e.systemPrompt,schema:e.schema});return e.candidates.forEach((r,i)=>{r.status==="error"&&(n[`candidate_${i}/_failed.txt`]=`STATUS: FAILED
|
|
630
|
+
|
|
631
|
+
Error: ${r.error??"Unknown error"}`),Object.entries(r.files).forEach(([o,c])=>{n[`candidate_${i}/${o}`]=c;});}),n}async executeBestOfJudge(e){let{candidates:n,config:r,timeoutMs:i,operationId:o,parentIndex:c,attempt:a=1,_pipelineContext:l}=e,d=c!==void 0?`${this.config.tag}-map-${c}-bestof-judge`:`${this.config.tag}-bestof-judge`,s=a>1?`${d}-er${a-1}`:d,p=this.buildJudgeContext({inputFiles:e.inputFiles,taskPrompt:e.taskPrompt,candidates:n,systemPrompt:e.systemPrompt,schema:e.schema}),u=et(p),g=j(Nt,{candidateCount:String(n.length),criteria:r.judgeCriteria,fileTree:u}),f=z.object({winner:z.number().min(0).max(n.length-1),reasoning:z.string()}),m=await this.semaphore.use(()=>this.execute(p,tr,{systemPrompt:g,schema:f,agent:r.judgeAgent,mcpServers:e.mcpServers,skills:e.skills,integrations:e.integrations,tagPrefix:s,timeoutMs:i,observability:{swarmName:this.config.tag,operationId:o,operation:"map",itemIndex:c,role:"judge",errorRetry:a>1?a-1:void 0,...this.pipelineContextToObservability(l)}})),h=null;if(m.data&&!m.error)h=m.data;else if(m.rawData)try{let y=JSON.parse(m.rawData);console.warn(`Judge returned invalid winner ${y.winner}, defaulting to candidate 0`),h={winner:0,reasoning:y.reasoning??"Judge failed to provide reasoning"};}catch{console.warn(`Judge validation failed: ${m.error}`);}return {status:h?"success":"error",decision:h,tag:m.tag,sandboxId:m.sandboxId,error:h?void 0:"Judge failed to produce valid decision"}}static DEFAULT_VERIFY_MAX_ATTEMPTS=3;static VerifyDecisionSchema=z.object({passed:z.boolean(),reasoning:z.string(),feedback:z.string().optional()});buildVerifyContext(e){let n=this.buildEvaluatorContext({inputFiles:e.inputFiles,taskPrompt:e.taskPrompt,systemPrompt:e.systemPrompt,schema:e.schema});return Object.entries(e.outputFiles).forEach(([r,i])=>{n[`worker_output/${r}`]=i;}),n}async executeVerify(e){let{config:n,timeoutMs:r,operationId:i,workerTag:o,retryAttempt:c=1,operation:a,itemIndex:l,attemptIndex:d,_pipelineContext:s}=e,p=c>1?`${o}-verifier-er${c-1}`:`${o}-verifier`,u=n.verifierMcpServers??e.mcpServers,g=n.verifierSkills??e.skills,f=n.verifierIntegrations??e.integrations,m=this.buildVerifyContext({inputFiles:e.inputFiles,taskPrompt:e.taskPrompt,outputFiles:e.outputFiles,systemPrompt:e.systemPrompt,schema:e.schema}),h=et(m),y=j(Ft,{criteria:n.criteria,fileTree:h}),w=await this.semaphore.use(()=>this.execute(m,nr,{systemPrompt:y,schema:t.VerifyDecisionSchema,agent:n.verifierAgent,mcpServers:u,skills:g,integrations:f,tagPrefix:p,timeoutMs:r,observability:{swarmName:this.config.tag,operationId:i,operation:a,itemIndex:l,role:"verifier",verifyRetry:d&&d>1?d-1:void 0,errorRetry:c>1?c-1:void 0,...this.pipelineContextToObservability(s)}})),b=null;if(w.data&&!w.error)b=w.data;else if(w.rawData)try{let k=JSON.parse(w.rawData);b={passed:!!k.passed,reasoning:k.reasoning??"Verification completed",feedback:k.feedback};}catch{console.warn(`Verify validation failed: ${w.error}`);}return {status:b?"success":"error",decision:b,tag:w.tag,sandboxId:w.sandboxId,error:b?void 0:"Verifier failed to produce valid decision"}}static buildRetryPromptWithFeedback(e,n){return j(Kt,{originalPrompt:e,feedback:n})}async runWithVerification(e,n){let{originalPrompt:r,inputFiles:i,verifyConfig:o,timeoutMs:c,operationId:a,baseTag:l,retry:d,itemIndex:s=0,operation:p,_pipelineContext:u}=n,g=o.maxAttempts??t.DEFAULT_VERIFY_MAX_ATTEMPTS,f=r,m=null,h=0;for(;h<g;){h++;let w=h>1?`${l}-vr${h-1}`:l,b=d?await A(S=>e(f,S>1?`${w}-er${S-1}`:w,h),d,s):await e(f,w,h);if(o.onWorkerComplete?.(s,h,b.status==="error"?"error":"success"),b.status==="error")return b;m=b;let k=d?await A(S=>this.executeVerify({inputFiles:i,outputFiles:b.files,taskPrompt:f,config:o,timeoutMs:c,systemPrompt:n.systemPrompt,schema:n.schema,mcpServers:n.mcpServers,skills:n.skills,integrations:n.integrations,operationId:a,workerTag:w,retryAttempt:S,operation:p,itemIndex:s,attemptIndex:h,_pipelineContext:u}),{...d,retryOn:void 0}):await this.executeVerify({inputFiles:i,outputFiles:b.files,taskPrompt:f,config:o,timeoutMs:c,systemPrompt:n.systemPrompt,schema:n.schema,mcpServers:n.mcpServers,skills:n.skills,integrations:n.integrations,operationId:a,workerTag:w,operation:p,itemIndex:s,attemptIndex:h,_pipelineContext:u}),v={operationId:a,operation:"verify",tag:k.tag,sandboxId:k.sandboxId,swarmName:this.config.tag,attempts:h,...this.pipelineContextToMeta(u)};if(o.onVerifierComplete?.(s,h,k.decision?.passed??false,k.decision?.feedback),k.decision?.passed)return {...b,verify:{passed:true,reasoning:k.decision.reasoning,verifyMeta:v,attempts:h}};if(h<g){let S=k.decision?.feedback??k.decision?.reasoning??"Output did not meet criteria";f=t.buildRetryPromptWithFeedback(r,S);}}let y=h>1?`${l}-vr${h-1}`:l;return {...m,status:"error",verify:{passed:false,reasoning:"Max verification retries exceeded",verifyMeta:{operationId:a,operation:"verify",tag:`${y}-verifier`,sandboxId:"",swarmName:this.config.tag,attempts:h,...this.pipelineContextToMeta(u)},attempts:h}}}generateOperationId(){return randomBytes(8).toString("hex")}pipelineContextToObservability(e){return e?{pipelineRunId:e.pipelineRunId,pipelineStepIndex:e.pipelineStepIndex}:{}}pipelineContextToMeta(e){return {pipelineRunId:e?.pipelineRunId,pipelineStepIndex:e?.pipelineStepIndex}}evaluatePrompt(e,n,r){if(typeof e=="string")return e;try{return e(n,r)}catch(i){return i}}buildEvaluatorContext(e){let n={};return e.systemPrompt&&(n["worker_task/system_prompt.txt"]=e.systemPrompt),n["worker_task/user_prompt.txt"]=e.taskPrompt,e.schema&&(n["worker_task/schema.json"]=U(e.schema)?Q(e.schema):Z(e.schema)),Object.entries(e.inputFiles).forEach(([r,i])=>{n[`worker_task/input/${r}`]=i;}),n}isSwarmResult(e){return typeof e=="object"&&e!==null&&Y in e&&e[Y]===true}getFiles(e){if(this.isSwarmResult(e)){let n={...e.files};return n["result.json"]&&(n["data.json"]=n["result.json"],delete n["result.json"]),n}return e}getIndex(e,n){return this.isSwarmResult(e)?e.meta.itemIndex:n}buildResult(e,n,r){let i=r??e.files;return e.error?{[Y]:true,status:"error",data:null,files:i,meta:n,error:e.error,rawData:e.rawData}:{[Y]:true,status:"success",data:e.data,files:i,meta:n}}buildErrorResult(e,n){return {[Y]:true,status:"error",data:null,files:{},meta:n,error:e}}};var ut=class t{swarm;steps;events;constructor(e,n=[],r={}){this.swarm=e,this.steps=n,this.events=r;}map(e){return new t(this.swarm,[...this.steps,{type:"map",config:e}],this.events)}filter(e){return new t(this.swarm,[...this.steps,{type:"filter",config:e}],this.events)}reduce(e){return new gt(this.swarm,[...this.steps,{type:"reduce",config:e}],this.events)}on(e,n){if(typeof e=="string"){let r=`on${e.charAt(0).toUpperCase()}${e.slice(1)}`;return new t(this.swarm,this.steps,{...this.events,[r]:n})}return new t(this.swarm,this.steps,{...this.events,...e})}async run(e){let n=randomBytes(8).toString("hex"),r=[],i=e,o=Date.now();for(let a=0;a<this.steps.length;a++){let l=this.steps[a],d=l.config.name,s=Date.now();this.events.onStepStart?.({type:l.type,index:a,name:d,itemCount:i.length});let p={pipelineRunId:n,pipelineStepIndex:a};try{let u=await this.executeStep(l,i,a,d,p),g=Date.now()-s;if(r.push({type:l.type,index:a,durationMs:g,results:u.output}),this.events.onStepComplete?.({type:l.type,index:a,name:d,durationMs:g,successCount:u.successCount,errorCount:u.errorCount,filteredCount:u.filteredCount}),l.type==="reduce")return {pipelineRunId:n,steps:r,output:u.output,totalDurationMs:Date.now()-o};i=u.nextItems;}catch(u){throw this.events.onStepError?.({type:l.type,index:a,name:d,error:u instanceof Error?u:new Error(String(u))}),u}}let c=r[r.length-1];return {pipelineRunId:n,steps:r,output:c?.results??[],totalDurationMs:Date.now()-o}}async executeStep(e,n,r,i,o){if(e.type==="map"){let l=e.config,d=await this.swarm.map({items:n,...l,_pipelineContext:o,retry:this.wrapRetry(l.retry,r,i),verify:this.wrapVerify(l.verify,r,i),bestOf:this.wrapBestOf(l.bestOf,r,i)});return {output:[...d],nextItems:d.success,successCount:d.success.length,errorCount:d.error.length,filteredCount:0}}if(e.type==="filter"){let l=e.config,d=await this.swarm.filter({items:n,...l,_pipelineContext:o,retry:this.wrapRetry(l.retry,r,i),verify:this.wrapVerify(l.verify,r,i)}),s=l.emit??"success",p=s==="success"?d.success:s==="filtered"?d.filtered:[...d.success,...d.filtered];return {output:[...d],nextItems:p,successCount:d.success.length,errorCount:d.error.length,filteredCount:d.filtered.length}}let c=e.config,a=await this.swarm.reduce({items:n,...c,_pipelineContext:o,retry:this.wrapRetry(c.retry,r,i),verify:this.wrapVerify(c.verify,r,i)});return {output:a,nextItems:[],successCount:a.status==="success"?1:0,errorCount:a.status==="error"?1:0,filteredCount:0}}wrapRetry(e,n,r){if(e)return {...e,onItemRetry:(i,o,c)=>{e.onItemRetry?.(i,o,c),this.events.onItemRetry?.({stepIndex:n,stepName:r,itemIndex:i,attempt:o,error:c});}}}wrapVerify(e,n,r){if(e)return {...e,onWorkerComplete:(i,o,c)=>{e.onWorkerComplete?.(i,o,c),this.events.onWorkerComplete?.({stepIndex:n,stepName:r,itemIndex:i,attempt:o,status:c});},onVerifierComplete:(i,o,c,a)=>{e.onVerifierComplete?.(i,o,c,a),this.events.onVerifierComplete?.({stepIndex:n,stepName:r,itemIndex:i,attempt:o,passed:c,feedback:a});}}}wrapBestOf(e,n,r){if(e)return {...e,onCandidateComplete:(i,o,c)=>{e.onCandidateComplete?.(i,o,c),this.events.onCandidateComplete?.({stepIndex:n,stepName:r,itemIndex:i,candidateIndex:o,status:c});},onJudgeComplete:(i,o,c)=>{e.onJudgeComplete?.(i,o,c),this.events.onJudgeComplete?.({stepIndex:n,stepName:r,itemIndex:i,winnerIndex:o,reasoning:c});}}}},gt=class t extends ut{constructor(e,n,r){super(e,n,r);}on(e,n){if(typeof e=="string"){let r=`on${e.charAt(0).toUpperCase()}${e.slice(1)}`;return new t(this.swarm,this.steps,{...this.events,[r]:n})}return new t(this.swarm,this.steps,{...this.events,...e})}map(){throw new Error("Cannot add steps after reduce")}filter(){throw new Error("Cannot add steps after reduce")}reduce(){throw new Error("Cannot add steps after reduce")}};var Qo=6e5,Zo=5e3;function wi(t,e,n){let r=e??n;if(!Number.isFinite(r)||r<=0)throw new Error(`${t} must be a positive number`);return r}function ea(t){let e=t?.apiKey||process.env[h];if(!e)throw new Error(`sessions() requires an API key. Set ${h} or pass { apiKey } in config.`);let n=t?.dashboardUrl||s;async function r(a,l){let d=await fetch(`${n}${a}`,{...l,headers:{Authorization:`Bearer ${e}`,...l?.headers}});if(!d.ok){let s=await d.text().catch(()=>"");throw new Error(`Dashboard API error (${d.status}): ${s||d.statusText}`)}return d}function i(a){return {id:a.id,tag:a.tag,agent:a.agent,model:a.model||null,provider:a.provider,sandboxId:a.sandboxId||null,state:a.isEnded?"ended":"live",runtimeStatus:a.runtimeStatus||"unknown",cost:typeof a.cost=="number"?a.cost:null,createdAt:a.createdAt,endedAt:a.endedAt||null,stepCount:a.stepCount||0,toolStats:a.toolStats||null}}function o(a,l){if(a.status!=="ready")throw new Error(`Browser replay is not ready (status: ${String(a.status||"unknown")})`);if(typeof a.replayUrl!="string"||typeof a.downloadUrl!="string")throw new Error("Browser replay response missing replayUrl or downloadUrl");return {sessionId:a.sessionId||l,status:"ready",replayUrl:a.replayUrl,downloadUrl:a.downloadUrl,suggestedStartSeconds:typeof a.suggestedStartSeconds=="number"?a.suggestedStartSeconds:void 0,sizeBytes:typeof a.sizeBytes=="number"?a.sizeBytes:void 0,readyAt:typeof a.readyAt=="string"?a.readyAt:void 0}}let c=a=>new Promise(l=>setTimeout(l,a));return {async list(a){let l=new URLSearchParams({paginationMode:"cursor",pageSize:String(Math.min(a?.limit??20,200)),paginated:"true"});if(a?.cursor&&l.set("cursor",a.cursor),a?.state&&a.state!=="all"&&l.set("state",a.state),a?.agent&&l.set("agent",a.agent),a?.tagPrefix&&l.set("tagPrefix",a.tagPrefix),a?.sort){let p={newest:"desc",oldest:"asc",cost:"desc"};l.set("sortDirection",p[a.sort]),a.sort==="cost"?l.set("sortField","cost"):l.set("sortField","timestamp");}let s=await(await r(`/api/sessions?${l}`)).json();return {items:(s.items||[]).map(i),nextCursor:s.nextCursor||null,hasMore:!!s.hasMore}},async get(a){let d=await(await r(`/api/sessions/${encodeURIComponent(a)}`)).json();return i(d)},async events(a,l){let d=new URLSearchParams;l?.since!=null&&d.set("since",String(l.since));let s=d.toString();return (await(await r(`/api/sessions/${encodeURIComponent(a)}/events${s?`?${s}`:""}`)).json()).events||[]},async download(a,l){let p=(await(await r(`/api/sessions/${encodeURIComponent(a)}`)).json()).tag||a,u=await fetch(`${n}/api/sessions/${encodeURIComponent(a)}/download`,{headers:{Authorization:`Bearer ${e}`},redirect:"follow"});if(!u.ok){let h=await u.text().catch(()=>"");throw new Error(`Download failed (${u.status}): ${h||u.statusText}`)}let g=l?.to||process.cwd();await mkdir(g,{recursive:true});let f=join(g,`${p}.jsonl`);if(!u.body)throw new Error("Download response has no body");let m=Readable.fromWeb(u.body);return await pipeline(m,createWriteStream(f)),f},async browserReplay(a,l){let d=wi("timeoutMs",l?.timeoutMs,Qo),s=wi("intervalMs",l?.intervalMs,Zo),p=Date.now()+d,u=`/api/sessions/${encodeURIComponent(a)}/browser-replay`;for(;;){let g=p-Date.now();if(g<=0)throw new Error(`Browser replay timed out after ${d}ms`);let f;try{f=await fetch(`${n}${u}`,{headers:{Authorization:`Bearer ${e}`,accept:"application/json"},signal:AbortSignal.timeout(Math.max(1,g))});}catch(h){let y=h.name;throw y==="AbortError"||y==="TimeoutError"?new Error(`Browser replay timed out after ${d}ms`):h}let m={};if(f.ok)m=await f.json();else {let h=await f.text().catch(()=>"");throw new Error(`Dashboard API error (${f.status}): ${h||f.statusText}`)}if(m.status==="ready")return o(m,a);if(m.status==="failed"){let h=typeof m.error=="string"?m.error:"unknown error";throw new Error(`Browser replay failed: ${h}`)}if(Date.now()>=p)throw new Error(`Browser replay timed out after ${d}ms`);await c(Math.min(s,Math.max(0,p-Date.now())));}}}}export{St as AGENT_REGISTRY,Ii as AGENT_TYPES,Pe as Agent,Lt as BROWSER_ACTIONBOOK_PROMPT,en as BROWSER_LOGIN_MCP_SERVER_NAME,it as BrowserCredentialsClient,pt as BrowserProfilesClient,Ie as Evolve,Nt as JUDGE_PROMPT,ut as Pipeline,Kt as RETRY_FEEDBACK_PROMPT,Zn as SCHEMA_PROMPT,Y as SWARM_RESULT_BRAND,Qn as SYSTEM_PROMPT,oe as Semaphore,ln as Swarm,ae as SwarmResultList,gt as TerminalPipeline,vt as VALIDATION_PRESETS,Ft as VERIFY_PROMPT,Yn as WORKSPACE_PROMPT,Xn as WORKSPACE_SWE_PROMPT,j as applyTemplate,tn as browserCredentials,cn as browserProfiles,jt as buildWorkerSystemPrompt,q as createAgentParser,He as createClaudeParser,We as createCodexParser,qe as createDroidParser,Je as createGeminiParser,A as executeWithRetry,O as expandPath,D as getAgentConfig,K as getMcpSettingsDir,F as getMcpSettingsPath,On as isAgentWorkUpdate,Ai as isValidAgentType,U as isZodSchema,Z as jsonSchemaToString,fs as managedSandbox,sn as managedSecrets,ls as parseNdjsonLine,ds as parseNdjsonOutput,In as parseQwenOutput,An as readLocalDir,nt as resolveStorageConfig,Mn as saveLocalDir,ea as sessions,oo as storage,Le as writeClaudeMcpConfig,Ve as writeCodexMcpConfig,Ge as writeDroidGatewaySettings,je as writeDroidMcpConfig,Ne as writeGeminiMcpConfig,Rt as writeMcpConfig,Fe as writeQwenMcpConfig,Q as zodSchemaToJson};
|