vibemux-worker 0.2.4 → 0.2.20

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.
@@ -1,140 +1,141 @@
1
- import Fd from"dotenv";var Oe=e=>e.replace(/\/+$/,""),Qi=e=>{let t=Oe(e);return t.startsWith("https://")?`${t.replace("https://","wss://")}/api/control-plane/executors/ws`:t.startsWith("http://")?`${t.replace("http://","ws://")}/api/control-plane/executors/ws`:`${t}/api/control-plane/executors/ws`},Zi=e=>{let t=Oe(e);return t.startsWith("https://")?`${t.replace("https://","wss://")}/api/preview-tunnels/ws`:t.startsWith("http://")?`${t.replace("http://","ws://")}/api/preview-tunnels/ws`:`${t}/api/preview-tunnels/ws`};var Ze=async e=>{let t=await fetch(e.url,{method:e.method??"GET",headers:{...e.body===void 0?{}:{"Content-Type":"application/json"},...e.headers??{}},body:e.body===void 0?void 0:JSON.stringify(e.body)});if(!t.ok){let r=await t.json().catch(()=>({message:e.errorMessage}));throw new Error(r.message||e.errorMessage)}return await t.json()};var Jt=async(e,t)=>Ze({url:`${Oe(t)}/api/control-plane/executors/pair`,method:"POST",body:e,errorMessage:"Pair request failed."});var gt=e=>e?.trim().toUpperCase()||"",ft=e=>!!(e.executorId?.trim()&&e.executorToken?.trim()),Ar=(e,t)=>{let r=gt(e);return!r||!ft(t)?!1:r===gt(t.lastPairedPairingCode)},Mr=()=>"This pairing code already completed on this worker. Reusing the saved executor token instead of pairing again.";var Gd=new Map([["\u914D\u5BF9\u7801\u5DF2\u4F7F\u7528\u3002","This pairing code has already been used."],["\u914D\u5BF9\u7801\u5DF2\u8FC7\u671F\u3002","This pairing code has expired."],["\u914D\u5BF9\u7801\u4E0D\u5B58\u5728\u3002","This pairing code does not exist."]]),Hd=new Set(["This pairing code has already been used.","This pairing code has expired.","This pairing code does not exist."]),es=e=>{let t=e.trim();return Gd.get(t)||t},zd=e=>Hd.has(es(e)),ts=()=>"This worker is already paired locally. If you only want to reconnect after a restart, start the worker again without `connect --pairing-code ...`.",Or=(e,t)=>{let r=es(e);return!t||!zd(r)?r:`${r} ${ts()}`},rs=e=>e?`${ts()} Use \`connect --pairing-code <CODE>\` only when you want to pair this machine for the first time or move it to a different account.`:"Missing required flag: --pairing-code";import{existsSync as Kn,readFileSync as Jn}from"node:fs";import ke from"node:path";import{fileURLToPath as ns}from"node:url";var Gn=null,Hn=null,zn=null,Kd=(e,t)=>{let r=ke.relative(t,e);return r===""||!r.startsWith("..")&&!ke.isAbsolute(r)},Jd=e=>{try{let t=JSON.parse(Jn(e,"utf8"));return!!(t.name&&t.version)}catch{return!1}},Vd=()=>{let e=process.env.VIBEMUX_RUNTIME_ROOT?.trim();if(e){let r=ke.resolve(e),n=ns(import.meta.url);if(Kd(n,r))return r}let t=ke.dirname(ns(import.meta.url));for(;;){let r=ke.join(t,"package.json");if(Kn(r)&&Jd(r))return t;let n=ke.dirname(t);if(n===t)return process.cwd();t=n}},se=()=>(Gn||(Gn=Vd()),Gn),et=()=>{if(!Hn){let e=ke.join(se(),"package.json");Hn=Kn(e)?JSON.parse(Jn(e,"utf8")):{}}return Hn},ht=()=>{if(!zn){let e=ke.join(se(),"runtime","worker-release.json");zn=Kn(e)?JSON.parse(Jn(e,"utf8")):{}}return zn},ue=()=>et().version?.trim()||process.env.npm_package_version?.trim()||"0.0.0",Vt=()=>ke.join(se(),"dist-worker","apps","worker","src","index.js"),os=()=>ke.join(se(),"dist-worker","apps","worker","web"),_r=()=>{let e=process.platform==="win32"?"vibemux-worker.cmd":"vibemux-worker";return ke.join(se(),"bin",e)};import{cpSync as ls,existsSync as He,mkdirSync as Zn,readFileSync as Ur,rmSync as xu,writeFileSync as eo}from"node:fs";import{randomUUID as Su}from"node:crypto";import We from"node:os";import W from"node:path";var Br=["Pi","OpenCode","Codex","ClaudeCode"];var Xd=[...Br],Yd=new Set(Br),nS=new Set(Xd),Qd={OpenCode:{id:"OpenCode",label:"OpenCode",transport:"SDK",modelIdStrategy:"canonical",workerOnly:!0,agentType:"OpenCode"},Codex:{id:"Codex",label:"Codex",transport:"STDIO",modelIdStrategy:"native",workerOnly:!0,agentType:"Codex"},ClaudeCode:{id:"ClaudeCode",label:"Claude Code",transport:"STDIO",modelIdStrategy:"native",workerOnly:!0,agentType:"ClaudeCode"},Pi:{id:"Pi",label:"Pi",transport:"SDK",modelIdStrategy:"canonical",workerOnly:!0,agentType:"Pi"}},is=e=>typeof e=="string"&&Yd.has(e);var Wr=e=>Qd[e],yt=e=>e;var Vn=(e,t)=>{let r=e.trim(),n=t.trim();return r&&n?`${r}/${n}`:""},kt=(e,t,r)=>Wr(e).modelIdStrategy==="canonical"?r?.trim()||"":Zd(t,r),_e=e=>{let t=e?.trim()||"";if(!t)return null;let[r,...n]=t.split("/"),o=n.join("/");return!r||!o?null:{providerId:r,modelId:o}},ss=e=>e?.trim().toLowerCase()||"",Zd=(e,t)=>{let r=t?.trim()||"";if(!r)return"";let n=_e(r);return n&&ss(n.providerId)===ss(e)?n.modelId:r};var eu=e=>{let t="",r=!1,n='"',o=!1;for(let i=0;i<e.length;i+=1){let s=e[i],a=e[i+1];if(r){if(t+=s,o){o=!1;continue}if(s==="\\"){o=!0;continue}s===n&&(r=!1);continue}if(s==='"'||s==="'"){r=!0,n=s,t+=s;continue}if(s==="/"&&a==="/"){for(i+=2;i<e.length&&e[i]!==`
2
- `;)i+=1;i<e.length&&(t+=e[i]);continue}if(s==="/"&&a==="*"){for(i+=2;i<e.length-1&&!(e[i]==="*"&&e[i+1]==="/");)i+=1;i+=1;continue}t+=s}return t},tu=e=>{let t="",r=!1,n='"',o=!1;for(let i=0;i<e.length;i+=1){let s=e[i];if(r){if(t+=s,o){o=!1;continue}if(s==="\\"){o=!0;continue}s===n&&(r=!1);continue}if(s==='"'||s==="'"){r=!0,n=s,t+=s;continue}if(s===","){let a=i+1;for(;a<e.length&&/\s/.test(e[a]);)a+=1;if(e[a]==="}"||e[a]==="]")continue}t+=s}return t},ru=e=>tu(eu(e)),pe=e=>{let t=e?.trim();if(!t)return{};try{let r=JSON.parse(ru(t));return r&&typeof r=="object"?r:{}}catch(r){throw new Error(r instanceof Error?`OpenCode \u914D\u7F6E JSON/JSONC \u65E0\u6548\uFF1A${r.message}`:"OpenCode \u914D\u7F6E JSON/JSONC \u65E0\u6548")}};var tt="built-in://vibemux",Xn=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),nu=(e,t,r)=>{let n=t.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"")||`${e}-${r+1}`;return`${e}-${r+1}-${n}`};var ou=e=>e.replace(/\/+$/,""),iu=e=>e.startsWith("sse://")?`http://${e.slice(6)}`:e,su=e=>{if(!e.executorToken?.trim())return null;let t={Authorization:`Bearer ${e.executorToken}`};return e.actingUserId?.trim()&&(t["x-vibemux-acting-user"]=e.actingUserId.trim()),{type:"remote",url:`${ou(e.cloudUrl)}/mcp/executor`,enabled:!0,headers:t}},au=e=>{let t=e.replace(/^stdio:\/\//,"").trim();return t?{command:t}:null},cu=e=>{let t=iu(e).trim();return t?{type:"remote",url:t,enabled:!0}:null},rt=(e,t)=>e.filter(r=>r.enabled).reduce((r,n,o)=>{let i=n.id?.trim()||nu("mcp",n.name,o),s=n.target===tt?su(t):n.transport==="stdio"||n.target.startsWith("stdio://")?au(n.target):cu(n.target);return s&&(r[i]=s),r},{}),Dr=(e,t,r)=>{let n=pe(e),o=Xn(n)?{...n}:{},i=Xn(o.mcp)?{...o.mcp}:Xn(o.mcpServers)?{...o.mcpServers}:{},s=rt(t,r),{mcpServers:a,...c}=o,l={...c,mcp:{...i,...s}};return JSON.stringify(l,null,2)};var wt=e=>`'${e.replace(/'/g,"'\\''")}'`,nt=(e,t=[])=>r=>`command -v ${e} >/dev/null 2>&1 && ${e}${t.length>0?` ${t.join(" ")}`:""} ${wt(r)}`,we=(e,t=[])=>r=>`[ -x "${e}" ] && "${e}"${t.length>0?` ${t.join(" ")}`:""} ${wt(r)}`,Be=e=>t=>`command -v open >/dev/null 2>&1 && open -Ra "${e}" && open -a "${e}" ${wt(t)}`,Xt=e=>t=>e?`command -v open >/dev/null 2>&1 && open -Ra "${e}" && open -a "${e}" ${wt(t)}`:`command -v open >/dev/null 2>&1 && open ${wt(t)}`,lu=e=>`command -v ghostty >/dev/null 2>&1 && ghostty --working-directory=${wt(e)}`;var dS={vscode:{label:"VS Code",description:"Visual Studio Code",commandBuilders:[nt("code",["--reuse-window"]),...["/opt/homebrew/bin/code","/usr/local/bin/code","/usr/bin/code","/snap/bin/code","/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code","$HOME/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code"].map(e=>we(e,["--reuse-window"])),Be("Visual Studio Code")]},"vscode-insiders":{label:"VS Code Insiders",description:"Visual Studio Code - Insiders",commandBuilders:[nt("code-insiders",["--reuse-window"]),...["/opt/homebrew/bin/code-insiders","/usr/local/bin/code-insiders","/usr/bin/code-insiders","/snap/bin/code-insiders","/Applications/Visual Studio Code - Insiders.app/Contents/Resources/app/bin/code-insiders","$HOME/Applications/Visual Studio Code - Insiders.app/Contents/Resources/app/bin/code-insiders"].map(e=>we(e,["--reuse-window"])),Be("Visual Studio Code - Insiders")]},cursor:{label:"Cursor",description:"Cursor editor",commandBuilders:[nt("cursor"),we("/Applications/Cursor.app/Contents/Resources/app/bin/cursor"),we("$HOME/Applications/Cursor.app/Contents/Resources/app/bin/cursor"),Be("Cursor")]},windsurf:{label:"Windsurf",description:"Windsurf editor",commandBuilders:[nt("windsurf"),we("/Applications/Windsurf.app/Contents/Resources/app/bin/windsurf"),we("$HOME/Applications/Windsurf.app/Contents/Resources/app/bin/windsurf"),Be("Windsurf")]},zed:{label:"Zed",description:"Zed editor",commandBuilders:[nt("zed"),we("/Applications/Zed.app/Contents/MacOS/zed"),we("$HOME/Applications/Zed.app/Contents/MacOS/zed"),Be("Zed")]},intellij:{label:"IntelliJ IDEA",description:"JetBrains IntelliJ IDEA",commandBuilders:[nt("idea"),Be("IntelliJ IDEA"),Be("IntelliJ IDEA CE")]},xcode:{label:"Xcode",description:"Xcode project editor",commandBuilders:[nt("xed"),we("/usr/bin/xed"),Be("Xcode")]},ghostty:{label:"Ghostty",description:"Ghostty terminal",commandBuilders:[lu,we("/Applications/Ghostty.app/Contents/MacOS/ghostty",["--working-directory"]),we("$HOME/Applications/Ghostty.app/Contents/MacOS/ghostty",["--working-directory"]),Be("Ghostty")]},finder:{label:"Finder",description:"Open the folder in Finder",commandBuilders:[Xt()]},terminal:{label:"Terminal",description:"Open the folder in Terminal.app",commandBuilders:[Xt("Terminal")]},iterm:{label:"iTerm",description:"Open the folder in iTerm",commandBuilders:[Xt("iTerm"),Xt("iTerm2")]},warp:{label:"Warp",description:"Open the folder in Warp",commandBuilders:[Xt("Warp")]}};var du={defaultModel:"",agent:"",permissionPolicy:""},uu={defaultModel:"gpt-5.4",sandbox:"workspace-write",approval:"never",reasoningEffort:"medium",reasoningSummary:"auto"},pu={defaultModel:"sonnet",permissionMode:"bypassPermissions",planMode:!1},mu={defaultModel:"",agentDir:""},as={OpenCode:du,Codex:uu,ClaudeCode:pu,Pi:mu},kS={...as};var gu=e=>({OpenCode:{...e.OpenCode},Codex:{...e.Codex},ClaudeCode:{...e.ClaudeCode},Pi:{...e.Pi}}),Yt=(e,t)=>{let r=gu(as);return e?.OpenCode&&(r.OpenCode={...r.OpenCode,...e.OpenCode}),e?.Codex&&(r.Codex={...r.Codex,...e.Codex}),e?.ClaudeCode&&(r.ClaudeCode={...r.ClaudeCode,...e.ClaudeCode}),e?.Pi&&(r.Pi={...r.Pi,...e.Pi}),!r.OpenCode.defaultModel.trim()&&t?.trim()&&(r.OpenCode.defaultModel=t.trim()),r};var Nr=null,fu=()=>Nr||(Nr=ht(),Nr),Ge=()=>process.env.VIBEMUX_WORKER_RELEASE_CHANNEL?.trim()||fu().channel?.trim()||"production",hu=e=>e==="preview"?"vibemux-worker-preview":"vibemux-worker",yu=e=>e==="preview"?"preview":"latest",ku=()=>(process.env.npm_config_registry?.trim()||"https://registry.npmjs.org").replace(/\/$/,""),wu=async e=>{let t=await fetch(`${ku()}/${e}`,{method:"GET",signal:AbortSignal.timeout(5e3)});if(!t.ok)throw new Error(`\u67E5\u8BE2 npm \u5305\u5931\u8D25\uFF0CHTTP ${t.status}`);return await t.json()},ot=async()=>{let e=ue(),t=Ge(),r=et().name?.trim()||"",n=hu(t),o=yu(t);if(r!==n)return{ok:!0,currentVersion:e,channel:t,available:!1,packageName:n,packageTag:o,message:"\u5F53\u524D\u662F\u6E90\u7801\u6A21\u5F0F\u6216\u975E npm Worker \u5305\uFF0C\u8DF3\u8FC7\u7248\u672C\u66F4\u65B0\u68C0\u67E5\u3002"};try{let s=(await wu(n))["dist-tags"]?.[o]?.trim();return s?s===e?{ok:!0,currentVersion:e,latestVersion:s,channel:t,available:!1,packageName:n,packageTag:o,message:`\u5F53\u524D\u5DF2\u662F\u6700\u65B0\u7248\u672C ${e}\u3002`}:{ok:!0,currentVersion:e,latestVersion:s,channel:t,available:!0,packageName:n,packageTag:o,message:`\u68C0\u6D4B\u5230\u65B0\u7248\u672C ${s}\u3002`}:{ok:!1,currentVersion:e,channel:t,available:!1,packageName:n,packageTag:o,message:`\u672A\u627E\u5230 npm dist-tag: ${o}`}}catch(i){return{ok:!1,currentVersion:e,channel:t,available:!1,packageName:n,packageTag:o,message:i instanceof Error?i.message:"\u67E5\u8BE2 npm \u66F4\u65B0\u5931\u8D25"}}};var ds=W.join(We.homedir(),".vibemux"),vu=W.join(We.homedir(),".vibemux-dev"),Cu=W.join(We.homedir(),".vibemux-preview"),Pu="http://127.0.0.1:8989",Eu=48100,Iu=["config.json","machine-id","workspace","runtime"],bu=["config.json","machine-id","runtime"],Ru=new Set(["http://127.0.0.1:8989","http://localhost:8989","http://127.0.0.1:18989","http://localhost:18989","ws://127.0.0.1:8989","ws://localhost:8989","ws://127.0.0.1:18989","ws://localhost:18989"]),us=()=>!!process.env.VIBEMUX_CLOUD_URL?.trim(),$r=()=>process.env.VIBEMUX_CLOUD_URL?.trim()||ht().defaultCloudUrl?.trim()||Pu,Tu=["vibemux.xyz"],Yn=e=>Tu.some(t=>e.includes(t)),Au=e=>{if(process.env.NODE_ENV==="development"||us())return!1;let t=ht().defaultCloudUrl?.trim();if(!t)return!1;if(Ru.has(e?.trim()||""))return!0;let r=Yn(t),n=Yn(e||"");return r!==n},ps=()=>{let e=$r();return Ge()==="preview"||Yn(e)?"preview":process.env.NODE_ENV==="development"?"development":"production"},Mu=()=>{switch(ps()){case"development":return vu;case"preview":return Cu;default:return ds}},Ou=()=>{let e=ds;switch(ps()){case"development":return[W.join(e,"worker-dev")];case"preview":return process.env.NODE_ENV==="development"?[W.join(e,"worker-dev-preview"),W.join(e,"worker-preview")]:[W.join(e,"worker-preview"),W.join(e,"worker-dev-preview")];default:return[W.join(e,"worker")]}},cs=e=>bu.some(t=>He(W.join(e,t))),_u=(e,t)=>{let r=W.join(e,"config.json");if(He(r))try{let n=JSON.parse(Ur(r,"utf8"));(n.workspaceRoot?.trim()||"")===W.join(e,"workspace")&&(n.workspaceRoot=W.join(t,"workspace")),eo(W.join(t,"config.json"),`${JSON.stringify(n,null,2)}
3
- `,"utf8")}catch{ls(r,W.join(t,"config.json"))}},Bu=e=>{if(cs(e))return;let t=Ou().find(r=>r!==e&&cs(r));if(t){Zn(e,{recursive:!0});for(let r of Iu){if(r==="config.json")continue;let n=W.join(t,r),o=W.join(e,r);!He(n)||He(o)||ls(n,o,{recursive:!0})}He(W.join(e,"config.json"))||_u(t,e)}},Wu=()=>{let e=Number(process.env.VIBEMUX_WORKER_PORT?.trim());if(Number.isFinite(e)&&e>0)return e;let t=ht().defaultLocalServerPort;return Number.isFinite(t)&&t?t:Eu},Du=()=>{let e=process.env.OPENCODE_CONFIG_PATH?.trim();if(e)return[e];let t=W.join(We.homedir(),".config","opencode");return[W.join(t,"opencode.json"),W.join(t,"opencode.jsonc")]},ms=()=>{let e=process.env.CODEX_HOME?.trim()||W.join(We.homedir(),".codex");return W.join(e,"config.toml")},gs=()=>{let e=process.env.CODEX_HOME?.trim()||W.join(We.homedir(),".codex");return W.join(e,"auth.json")},Nu=()=>{let e=process.env.CLAUDE_HOME?.trim()||W.join(We.homedir(),".claude");return[W.join(e,"settings.json"),W.join(e,"config.json")]},fs=()=>process.env.PI_AGENT_DIR?.trim()||W.join(We.homedir(),".pi","agent"),xt=e=>{if(!He(e))return"";try{return Ur(e,"utf8").trim()}catch{return""}},Qn=e=>!!e&&typeof e=="object"&&!Array.isArray(e),hs=(e,t)=>Object.entries(t).reduce((r,[n,o])=>{let i=r[n];return Qn(i)&&Qn(o)?(r[n]=hs({...i},o),r):(r[n]=o,r)},{...e}),ys=()=>{let e=Du().map(t=>({path:t,content:xt(t)})).filter(t=>t.content.trim());if(e.length===0)return{opencodeConfigContent:"",defaultModel:"",sourcePaths:[]};try{if(e.length===1){let o=pe(e[0].content),i=Object.entries(o.default??{}).find(([,s])=>typeof s=="string"&&s.trim());return{opencodeConfigContent:e[0].content,defaultModel:i?`${i[0]}/${String(i[1]).trim()}`:"",sourcePaths:e.map(s=>s.path)}}let t=e.reduce((o,i)=>{let s=pe(i.content);return hs(o,s)},{}),r=Qn(t.default)?t.default:{},n=Object.entries(r).find(([,o])=>typeof o=="string"&&o.trim());return{opencodeConfigContent:JSON.stringify(t,null,2),defaultModel:n?`${n[0]}/${String(n[1]).trim()}`:"",sourcePaths:e.map(o=>o.path)}}catch{return{opencodeConfigContent:"",defaultModel:"",sourcePaths:e.map(t=>t.path)}}},$u=()=>{let e=ys();return{opencodeConfigContent:e.opencodeConfigContent,defaultModel:e.defaultModel}},Uu=()=>{let e=process.env.VIBEMUX_WORKER_HOME?.trim();if(e)return e;let t=process.env.VIBEMUX_HOME?.trim();return t?W.join(t,"worker"):Mu()},Ee=()=>{let e=W.resolve(Uu());return!process.env.VIBEMUX_WORKER_HOME?.trim()&&!process.env.VIBEMUX_HOME?.trim()&&Bu(e),e},to=()=>W.join(Ee(),"config.json"),Lu=()=>W.join(Ee(),"machine-id"),ju=()=>{let e=Ee(),t=Lu();if(He(t)){let n=Ur(t,"utf8").trim();if(n)return n}Zn(e,{recursive:!0});let r=Su();return eo(t,`${r}
4
- `,"utf8"),r},Fu=()=>({cloudUrl:$r(),machineId:ju(),machineName:We.hostname(),opencodeConfigContent:"",codexConfigContent:"",codexAuthContent:"",claudeCodeConfigContent:"",piAgentDir:fs(),defaultModel:"",agentSettings:Yt(),mcpServers:[],workspaceRoot:W.join(Ee(),"workspace"),maxConcurrency:5,labels:[],capabilities:["code-execution","git-operations"],localServerPort:Number(process.env.VIBEMUX_WORKER_PORT||Wu()),projectBindings:[]}),b=()=>{let e=to(),t=He(e)?JSON.parse(Ur(e,"utf8")):{},r={...Fu(),...t},n=$u();us()&&(r.cloudUrl=$r()),Au(r.cloudUrl)&&(r.cloudUrl=$r());let o=Number(process.env.VIBEMUX_WORKER_PORT?.trim());return Number.isFinite(o)&&o>0&&(r.localServerPort=o),r.opencodeConfigContent?.trim()||(r.opencodeConfigContent=n.opencodeConfigContent),r.codexConfigContent?.trim()||(r.codexConfigContent=xt(ms())),r.codexAuthContent?.trim()||(r.codexAuthContent=xt(gs())),r.claudeCodeConfigContent?.trim()||(r.claudeCodeConfigContent=ro()),r.piAgentDir?.trim()||(r.piAgentDir=fs()),r.defaultModel?.trim()||(r.defaultModel=n.defaultModel),r.agentSettings=Yt(r.agentSettings,r.defaultModel),r},Ie=e=>{let t=Ee();Zn(t,{recursive:!0}),eo(to(),`${JSON.stringify(e,null,2)}
5
- `,"utf8")},ks=()=>ys().opencodeConfigContent,Lr=()=>xt(ms()),jr=()=>xt(gs()),ro=()=>{for(let e of Nu()){let t=xt(e);if(t.trim())return t}return""},Fr=(e=b(),t)=>Dr(e.opencodeConfigContent,e.mcpServers??[],{cloudUrl:e.cloudUrl,executorToken:e.executorToken,actingUserId:t}),qr=()=>{xu(to(),{force:!0})},Gr=()=>{let e={...b(),executorName:void 0,executorId:void 0,executorToken:void 0,lastPairedPairingCode:void 0};return Ie(e),e};import{existsSync as Vr}from"node:fs";import{stdin as Ws,stdout as Ds}from"node:process";import er from"node:path";import{createInterface as wp}from"node:readline/promises";import{existsSync as sp,mkdtempSync as ap,rmSync as cp,writeFileSync as bs}from"node:fs";import Rs from"node:os";import Qt from"node:path";import{spawn as lp}from"node:child_process";import{accessSync as qu,constants as Gu,existsSync as Hu}from"node:fs";import{delimiter as no,dirname as zu,isAbsolute as Ku,join as Ju}from"node:path";import{spawnSync as Vu}from"node:child_process";var V=(e,t,r)=>{let n=Vu(e,t,{cwd:r?.cwd,encoding:"utf8",env:r?.env,stdio:r?.streamOutput?"inherit":"pipe",timeout:r?.timeout??12e4});return{ok:n.status===0,stdout:n.stdout?.trim()??"",stderr:n.stderr?.trim()??"",error:n.error instanceof Error?n.error.message:void 0}},z=(e,t)=>e.stdout||e.stderr||e.error||t,J=(e,t=["--version"])=>V(e,t).ok,Xu=e=>{let t=process.env.PATH??"";t.split(no).filter(Boolean).includes(e)||(process.env.PATH=t?`${e}${no}${t}`:e)},oo=e=>{if(!Hu(e))return!1;try{return qu(e,Gu.X_OK),!0}catch{return!1}},xs=e=>{let t=(process.env.PATHEXT??".COM;.EXE;.BAT;.CMD").split(";").map(r=>r.trim().toLowerCase()).filter(Boolean);if(t.some(r=>e.toLowerCase().endsWith(r)))return oo(e)?e:null;for(let r of t){let n=`${e}${r}`;if(oo(n))return n}return null},ws=e=>process.platform==="win32"?xs(e):oo(e)?e:null,ne=e=>{if(e.includes("/")||e.includes("\\")||Ku(e))return ws(e);for(let t of(process.env.PATH??"").split(no).filter(Boolean)){let r=Ju(t,e),n=process.platform==="win32"?xs(r):ws(r);if(n)return Xu(zu(n)),n}return null},Yu=(e,t,r)=>typeof process.getuid=="function"&&process.getuid()===0?{command:e,args:t}:J("sudo")?r?.interactiveAuth?{command:"sudo",args:[e,...t]}:J("sudo",["-n","true"])?{command:"sudo",args:["-n",e,...t]}:null:null,De=(e,t,r,n)=>{let o=Yu(e,t,n);return o?V(o.command,o.args,{streamOutput:n?.streamOutput,timeout:r}):{ok:!1,stdout:"",stderr:"",error:n?.interactiveAuth?"\u7F3A\u5C11 sudo \u80FD\u529B\uFF0C\u65E0\u6CD5\u81EA\u52A8\u5B89\u88C5\u3002":"\u7F3A\u5C11 root \u6216\u514D\u5BC6 sudo \u6743\u9650\uFF0C\u65E0\u6CD5\u81EA\u52A8\u5B89\u88C5\u3002"}};var Qu="openai",io="OPENAI_API_KEY",Ss=1e4,Hr=e=>!!e&&typeof e=="object"&&!Array.isArray(e),me=e=>typeof e=="string"?e.trim():"",Ps=e=>e.replace(/\\/g,"\\\\").replace(/"/g,'\\"'),Es=e=>e.split(".").map(t=>t.trim().replace(/^"(.*)"$/,"$1")).join("."),it=e=>{let t=e?.trim()||"";if(!t)return{};try{let r=JSON.parse(t);if(!Hr(r))return{};let n=Object.entries(r).reduce((i,[s,a])=>(typeof a=="string"&&a.trim()&&(i[s]=a.trim()),i),{}),o=me(r.access_token)||me(r.accessToken);return o&&!n.CODEX_ACCESS_TOKEN&&(n.CODEX_ACCESS_TOKEN=o),n}catch{return{}}},zr=e=>{let t=e?.trim()||"";if(!t)return!1;try{let r=JSON.parse(t);return!Hr(r)||!!!(me(r.access_token)||me(r.accessToken))?!1:!Object.keys(r).some(i=>/^[A-Z0-9_]+$/.test(i.trim()))}catch{return!1}},St=(e,t)=>{let r=t?.trim();if(!e.trim()||!r)return{content:e,changed:!1};let n=`model_providers.${r}`,o=[],i="",s=!1,a=!1,c=!1,l=()=>{s&&(a||(o.push(`name = "${Ps(r)}"`),c=!0),s=!1,a=!1)};for(let d of e.split(/\r?\n/)){let m=d.trim(),u=m.match(/^\[([^\]]+)\]$/);if(u){l(),i=Es(u[1]??""),s=i===n,o.push(d);continue}s&&m.match(/^([A-Za-z0-9_.-]+)\s*=/)?.[1]==="name"&&(a=!0),o.push(d)}return l(),{content:c?o.join(`
6
- `):e,changed:c}},vt=(e,t,r)=>{let n=t?.trim(),o=r?.trim();if(!e.trim()||!n||!o)return{content:e,changed:!1};let i=`model_providers.${n}`,s=[],a="",c=!1,l=!1,d=!1,m=()=>{c&&(l||(s.push(`env_key = "${Ps(o)}"`),d=!0),c=!1,l=!1)};for(let u of e.split(/\r?\n/)){let p=u.trim(),f=p.match(/^\[([^\]]+)\]$/);if(f){m(),a=Es(f[1]??""),c=a===i,s.push(u);continue}c&&p.match(/^([A-Za-z0-9_.-]+)\s*=/)?.[1]==="env_key"&&(l=!0),s.push(u)}return m(),{content:d?s.join(`
7
- `):e,changed:d}},Zu=e=>e.match(/^[A-Za-z0-9_.-]+\s*=\s*["']([^"']+)["']/)?.[1]?.trim()||"",ep=e=>{let t=e.indexOf("/");return t<0?"":e.slice(0,t).trim()},tp=e=>{if(!e)return"";try{let r=new URL(e).hostname.toLowerCase().split(".").filter(Boolean),n=new Set(["api","www","cn","com","net","org","io","ai"]);return r.find(o=>!n.has(o))||""}catch{return""}},rp=e=>{let t=e??b();return{authContent:jr()||t.codexAuthContent,configContent:Lr()||t.codexConfigContent,fallbackDefaultModel:t.agentSettings?.Codex?.defaultModel?.trim()||""}},ae=e=>{let t=(e.configContent?.trim()||"").split(/\r?\n/),r=it(e.authContent),n=e.env??process.env,o="",i="",s="",a="",c="",l="";for(let p of t){let f=p.trim();if(!f||f.startsWith("#"))continue;let x=f.match(/^\[([^\]]+)\]$/);if(x){o=x[1]?.trim()||"";continue}let g=f.match(/^([A-Za-z0-9_.-]+)\s*=\s*["'][^"']+["']/)?.[1]?.trim()||"",R=Zu(f);if(!(!g||!R)){if(!o){g==="model"?i=R:g==="model_provider"?s=R:(g==="base_url"||g==="openai_base_url")&&(a=R);continue}o===`model_providers.${s}`&&(g==="base_url"?c=R:g==="env_key"&&(l=R))}}let d=s||ep(i)||tp(c||a)||Qu,m=l||io;return{apiToken:me(r[m])||me(n[m])||me(r[io])||me(n[io])||me(r.CODEX_ACCESS_TOKEN)||me(n.CODEX_ACCESS_TOKEN),baseUrl:c||a||me(n.OPENAI_BASE_URL),providerId:d,configuredModel:i,envKey:m}},np=e=>{let t=e.trim().replace(/\/+$/g,"");return t?t.endsWith("/models")?t:`${t}/models`:""},vs=(e,t,r)=>({id:Vn(e,t),label:`${e}/${t}`,providerId:e,modelId:t,isDefault:t===r}),Cs=(e,t)=>{let r=new Set;return(t?.trim()?[t.trim(),...e]:e).filter(o=>{let i=o.trim();return!i||r.has(i)?!1:(r.add(i),!0)})},op=e=>!Hr(e)||!Array.isArray(e.data)?[]:e.data.map(t=>Hr(t)?me(t.id):"").filter(Boolean),ip=async(e,t={})=>{let r=ae({authContent:e.authContent,configContent:e.configContent}),n=r.configuredModel||e.fallbackDefaultModel?.trim()||void 0,o=Cs(n?[n]:[],n).map(l=>vs(r.providerId,l,n));if(!e.configContent?.trim())return{models:o,defaultModel:n,message:"worker \u672A\u914D\u7F6E Codex \u6A21\u578B\u3002"};let i=np(r.baseUrl),s=r.apiToken;if(!i||!s)return{models:o,defaultModel:n,message:o.length>0?"Codex provider \u672A\u58F0\u660E\u53EF\u8BFB\u53D6\u7684\u6A21\u578B\u5217\u8868\uFF0C\u5DF2\u56DE\u9000\u4E3A\u5F53\u524D\u9ED8\u8BA4\u6A21\u578B\u3002":"Codex provider \u7F3A\u5C11 Base URL \u6216 API Key\uFF0C\u65E0\u6CD5\u8BFB\u53D6\u6A21\u578B\u5217\u8868\u3002"};let a=new AbortController,c=setTimeout(()=>a.abort(),Ss);try{let l=await(t.fetchImpl??fetch)(i,{headers:{Authorization:`Bearer ${s}`},method:"GET",signal:a.signal});if(!l.ok)throw new Error(`HTTP ${l.status}`);let d=await l.json().catch(()=>null),u=Cs(op(d),n).map(p=>vs(r.providerId,p,n));return{models:u.length>0?u:o,defaultModel:n,message:u.length>0?"\u5DF2\u4ECE Codex provider \u8BFB\u53D6\u6A21\u578B\u5217\u8868\u3002":"Codex provider \u672A\u8FD4\u56DE\u6A21\u578B\u5217\u8868\uFF0C\u5DF2\u56DE\u9000\u4E3A\u5F53\u524D\u9ED8\u8BA4\u6A21\u578B\u3002"}}catch(l){let d=l instanceof Error&&l.name==="AbortError"?`\u8BFB\u53D6 Codex provider \u6A21\u578B\u8D85\u65F6\uFF08>${Ss}ms\uFF09\u3002`:l instanceof Error?l.message:"\u8BFB\u53D6 Codex provider \u6A21\u578B\u5931\u8D25\u3002";return{models:o,defaultModel:n,message:o.length>0?`\u8BFB\u53D6 Codex provider \u6A21\u578B\u5931\u8D25\uFF0C\u5DF2\u56DE\u9000\u4E3A\u5F53\u524D\u9ED8\u8BA4\u6A21\u578B\uFF1A${d}`:`\u8BFB\u53D6 Codex provider \u6A21\u578B\u5931\u8D25\uFF1A${d}`}}finally{clearTimeout(c)}},Is=async e=>{let t=rp(e);return ip(t)};var Zt=900*1e3,Ts=15e3,dp=()=>process.env.CLAUDE_HOME?.trim()||Qt.join(Rs.homedir(),".claude"),ge=(e,t)=>{console.log("[worker-codex-bootstrap]",e,JSON.stringify(t))},up=()=>{let e=b(),t=it(e.codexAuthContent),r=Object.keys(t).sort(),n=e.codexConfigContent?.trim()||"",o=ae({configContent:n,authContent:e.codexAuthContent}),i=St(n,o.providerId),s=vt(i.content,o.providerId,o.envKey),a=zr(e.codexAuthContent);if(r.length===0)return ge("auth-probe:env-skipped",{providerId:o.providerId,providerEnvKey:o.envKey,configPresent:!!n,providerNameAdded:i.changed,providerEnvKeyAdded:s.changed,managedCredentialEnvKeys:r,usingLegacyAuthJson:a,reason:"no-managed-credential-env"}),null;let c=ap(Qt.join(Rs.tmpdir(),"vibemux-codex-auth-"));s.content&&bs(Qt.join(c,"config.toml"),`${s.content}
8
- `,"utf8"),a&&bs(Qt.join(c,"auth.json"),`${e.codexAuthContent?.trim()||""}
9
- `,"utf8");let l={providerId:o.providerId,providerEnvKey:o.envKey,configPresent:!!n,providerNameAdded:i.changed,providerEnvKeyAdded:s.changed,managedCredentialEnvKeys:r,usingLegacyAuthJson:a};return ge("auth-probe:env-created",{...l,runtimeRoot:c}),{env:{...process.env,CODEX_HOME:c,...t},metadata:l,cleanup:()=>{cp(c,{recursive:!0,force:!0})}}},pp=e=>e==="codex-cli"?"Codex CLI":e==="codex-auth"?"Codex \u767B\u5F55":e==="claude-cli"?"Claude Code CLI":e==="claude-auth"?"Claude Code \u8BA4\u8BC1":e,Kr=(e,t,r)=>({id:e,label:pp(e),ok:r.ok,changed:r.changed,detail:r.detail,skipped:r.skipped,installer:t?.installer,commandSummary:t?.commandSummary}),As=(e,t,r,n,o,i)=>{let s={installer:r,commandSummary:t},a=V("npm",["install","-g",e],{streamOutput:i?.streamOutput,timeout:Zt});return!a.ok&&process.platform!=="win32"&&(a=De("npm",["install","-g",e],Zt,i)),Kr(n,s,{ok:a.ok,changed:a.ok,detail:z(a,o)})},Ms=()=>J("npm")?{installer:"npm",commandSummary:"npm install -g @openai/codex",manualHint:"\u8BF7\u5148\u5B89\u88C5 Node.js/npm\uFF0C\u7136\u540E\u6267\u884C `npm install -g @openai/codex`\u3002",run(e){return As("@openai/codex","npm install -g @openai/codex","npm","codex-cli","\u5B89\u88C5 Codex CLI \u5931\u8D25",e)}}:null,Os=()=>process.platform==="darwin"&&J("brew")?{installer:"brew",commandSummary:"brew install --cask claude-code",manualHint:"\u8BF7\u5148\u6267\u884C `brew install --cask claude-code`\uFF0C\u7136\u540E\u8FD0\u884C `claude` \u5B8C\u6210\u767B\u5F55\u3002",run(e){let t={installer:"brew",commandSummary:"brew install --cask claude-code"},r=V("brew",["install","--cask","claude-code"],{streamOutput:e?.streamOutput,timeout:Zt});return Kr("claude-cli",t,{ok:r.ok,changed:r.ok,detail:z(r,"\u5B89\u88C5 Claude Code CLI \u5931\u8D25")})}}:process.platform==="win32"&&J("winget")?{installer:"winget",commandSummary:"winget install Anthropic.ClaudeCode",manualHint:"\u8BF7\u5148\u6267\u884C `winget install Anthropic.ClaudeCode`\uFF0C\u7136\u540E\u8FD0\u884C `claude` \u5B8C\u6210\u767B\u5F55\u3002",run(e){let t={installer:"winget",commandSummary:"winget install Anthropic.ClaudeCode"},r=V("winget",["install","--id","Anthropic.ClaudeCode","--exact","--source","winget","--accept-package-agreements","--accept-source-agreements"],{streamOutput:e?.streamOutput,timeout:Zt});return Kr("claude-cli",t,{ok:r.ok,changed:r.ok,detail:z(r,"\u5B89\u88C5 Claude Code CLI \u5931\u8D25")})}}:J("npm")?{installer:"npm",commandSummary:"npm install -g @anthropic-ai/claude-code",manualHint:"\u8BF7\u5148\u5B89\u88C5 Node.js/npm\uFF0C\u7136\u540E\u6267\u884C `npm install -g @anthropic-ai/claude-code`\u3002",run(e){return As("@anthropic-ai/claude-code","npm install -g @anthropic-ai/claude-code","npm","claude-cli","\u5B89\u88C5 Claude Code CLI \u5931\u8D25",e)}}:process.platform!=="win32"&&J("bash")&&J("curl")?{installer:"install.sh",commandSummary:"curl -fsSL https://claude.ai/install.sh | bash",manualHint:"\u8BF7\u6267\u884C `curl -fsSL https://claude.ai/install.sh | bash`\uFF0C\u7136\u540E\u8FD0\u884C `claude` \u5B8C\u6210\u767B\u5F55\u3002",run(e){let t={installer:"install.sh",commandSummary:"curl -fsSL https://claude.ai/install.sh | bash"},r=V("bash",["-lc","curl -fsSL https://claude.ai/install.sh | bash"],{streamOutput:e?.streamOutput,timeout:Zt});return Kr("claude-cli",t,{ok:r.ok,changed:r.ok,detail:z(r,"\u5B89\u88C5 Claude Code CLI \u5931\u8D25")})}}:null,mp=()=>{let e=ne("codex"),t=e?V(e,["--version"]):null,r=Ms();return{id:"codex-cli",label:"Codex CLI",ok:!!(e&&t?.ok),detail:e&&t?.ok?t.stdout||e:"\u672A\u68C0\u6D4B\u5230 `codex` \u53EF\u6267\u884C\u6587\u4EF6\u3002",autoInstallable:!!r,installer:r?.installer,installCommand:r?.commandSummary,hint:r?.manualHint||"\u8BF7\u5148\u5B89\u88C5 Codex CLI\uFF0C\u5E76\u786E\u8BA4 `codex` \u5DF2\u8FDB\u5165 PATH\u3002"}},gp=async()=>{let e=ne("codex");if(!e)return{id:"codex-auth",label:"Codex \u767B\u5F55",ok:!1,detail:"\u672A\u68C0\u6D4B\u5230 `codex`\uFF0C\u6682\u65F6\u65E0\u6CD5\u68C0\u67E5\u767B\u5F55\u72B6\u6001\u3002",autoInstallable:!1,hint:"\u8BF7\u5148\u5B89\u88C5 Codex CLI\uFF0C\u518D\u8FD0\u884C `codex` \u5B8C\u6210\u767B\u5F55\u3002"};let t=up(),r=t?.metadata.managedCredentialEnvKeys??[];ge("auth-probe:start",{executable:e,usingManagedProbeEnvironment:!!t,providerId:t?.metadata.providerId||"",providerEnvKey:t?.metadata.providerEnvKey||"",configPresent:t?.metadata.configPresent??!1,providerNameAdded:t?.metadata.providerNameAdded??!1,providerEnvKeyAdded:t?.metadata.providerEnvKeyAdded??!1,managedCredentialEnvKeys:r,usingLegacyAuthJson:t?.metadata.usingLegacyAuthJson??!1});let n=await(async()=>{try{return await new Promise(o=>{let i=lp(e,["app-server"],{env:t?.env??process.env,stdio:["pipe","pipe","pipe"]}),s="",a="",c=!1,l=0,d=-1,m=-1,u=g=>{c||(c=!0,clearTimeout(f),i.killed||i.kill("SIGTERM"),o(g))},p=g=>{i.stdin.write(`${JSON.stringify(g)}
10
- `)},f=setTimeout(()=>{ge("auth-probe:timeout",{providerId:t?.metadata.providerId||"",managedCredentialEnvKeys:r}),u({ok:!1,detail:"Codex \u767B\u5F55\u72B6\u6001\u68C0\u67E5\u8D85\u65F6\u3002"})},Ts),x=()=>{l+=1,m=l,p({jsonrpc:"2.0",id:l,method:"account/read",params:{refreshToken:!1}})},k=g=>{let R=g.trim();if(R)try{let C=JSON.parse(R);if(C.error?.message){ge("auth-probe:rpc-error",{requestId:C.id??null,message:C.error.message}),u({ok:!1,detail:C.error.message});return}if(!C.result||typeof C.id>"u")return;if(C.id===d){ge("auth-probe:initialized",{providerId:t?.metadata.providerId||""}),p({jsonrpc:"2.0",method:"initialized"}),x();return}if(C.id!==m)return;let E=!!C.result.account,j=!!C.result.requiresOpenaiAuth;if(ge("auth-probe:account-result",{providerId:t?.metadata.providerId||"",hasAccount:E,requiresOpenaiAuth:j,managedCredentialEnvKeys:r}),j&&!E){if(r.length>0){ge("auth-probe:decision",{ok:!0,reason:"managed-provider-credentials-present",providerId:t?.metadata.providerId||"",managedCredentialEnvKeys:r}),u({ok:!0,detail:"Codex \u5DF2\u68C0\u6D4B\u5230\u8FD0\u884C\u65F6 provider \u51ED\u8BC1\u3002"});return}ge("auth-probe:decision",{ok:!1,reason:"openai-auth-required-without-account",providerId:t?.metadata.providerId||""}),u({ok:!1,detail:"Codex \u672A\u767B\u5F55\uFF0C\u8BF7\u5148\u8FD0\u884C `codex` \u5B8C\u6210\u8BA4\u8BC1\u3002"});return}ge("auth-probe:decision",{ok:!0,reason:E?"account-present":"provider-auth-not-required",providerId:t?.metadata.providerId||"",managedCredentialEnvKeys:r}),u({ok:!0,detail:"Codex \u767B\u5F55\u72B6\u6001\u6B63\u5E38\u3002"})}catch{return}};i.stdout.on("data",g=>{s+=g.toString();let R=s.split(`
11
- `);s=R.pop()??"";for(let C of R)k(C)}),i.stderr.on("data",g=>{a+=g.toString()}),i.on("error",g=>{ge("auth-probe:process-error",{error:g instanceof Error?g.message:"Codex \u767B\u5F55\u68C0\u67E5\u5931\u8D25\u3002"}),u({ok:!1,detail:g instanceof Error?g.message:"Codex \u767B\u5F55\u68C0\u67E5\u5931\u8D25\u3002"})}),i.on("close",()=>{if(c)return;let g=a.trim().split(`
12
- `).filter(Boolean).at(-1)||"Codex \u767B\u5F55\u68C0\u67E5\u5931\u8D25\u3002";ge("auth-probe:process-close",{detail:g}),u({ok:!1,detail:g})}),l+=1,d=l,p({jsonrpc:"2.0",id:d,method:"initialize",params:{clientInfo:{name:"vibemux-worker",version:"0.1.1"},capabilities:{experimentalApi:!0}}})})}finally{t?.cleanup()}})();return{id:"codex-auth",label:"Codex \u767B\u5F55",ok:n.ok,detail:n.detail,autoInstallable:!1,hint:n.ok?void 0:"\u8BF7\u5148\u8FD0\u884C `codex`\uFF0C\u6309\u63D0\u793A\u5B8C\u6210\u767B\u5F55\u540E\u518D\u91CD\u8BD5\u3002"}},fp=()=>{let e=ne("claude"),t=e?V(e,["--version"]):null,r=Os();return{id:"claude-cli",label:"Claude Code CLI",ok:!!(e&&t?.ok),detail:e&&t?.ok?t.stdout||e:"\u672A\u68C0\u6D4B\u5230 `claude` \u53EF\u6267\u884C\u6587\u4EF6\u3002",autoInstallable:!!r,installer:r?.installer,installCommand:r?.commandSummary,hint:r?.manualHint||"\u8BF7\u5148\u5B89\u88C5 Claude Code CLI\uFF0C\u5E76\u786E\u8BA4 `claude` \u5DF2\u8FDB\u5165 PATH\u3002"}},hp=e=>{let t=e.trim();if(!t)return!1;try{let r=JSON.parse(t),n=r.env&&typeof r.env=="object"?r.env:void 0;return!!((typeof n?.ANTHROPIC_AUTH_TOKEN=="string"?n.ANTHROPIC_AUTH_TOKEN.trim():typeof n?.ANTHROPIC_API_KEY=="string"?n.ANTHROPIC_API_KEY.trim():"")||typeof r.apiKeyHelper=="string"&&r.apiKeyHelper.trim())}catch{return!1}},yp=()=>{if(process.env.ANTHROPIC_API_KEY?.trim()||process.env.ANTHROPIC_AUTH_TOKEN?.trim()||sp(Qt.join(dp(),".credentials.json")))return!0;try{return hp(b().claudeCodeConfigContent??"")}catch{return!1}},kp=()=>{let e=ne("claude");if(!e)return{id:"claude-auth",label:"Claude Code \u8BA4\u8BC1",ok:!1,detail:"\u672A\u68C0\u6D4B\u5230 `claude`\uFF0C\u6682\u65F6\u65E0\u6CD5\u68C0\u67E5\u8BA4\u8BC1\u72B6\u6001\u3002",autoInstallable:!1,hint:"\u8BF7\u5148\u5B89\u88C5 Claude Code CLI\uFF0C\u518D\u914D\u7F6E API \u51ED\u8BC1\u6216\u8FD0\u884C `claude` \u5B8C\u6210\u767B\u5F55\u3002"};if(yp())return{id:"claude-auth",label:"Claude Code \u8BA4\u8BC1",ok:!0,detail:"\u68C0\u6D4B\u5230 Claude Code API / \u51ED\u8BC1\u914D\u7F6E\u3002",autoInstallable:!1};let t=V(e,["doctor"],{timeout:Ts});return{id:"claude-auth",label:"Claude Code \u8BA4\u8BC1",ok:t.ok,detail:t.ok?t.stdout||"Claude Code doctor \u68C0\u67E5\u901A\u8FC7\u3002":z(t,"Claude Code doctor \u68C0\u67E5\u5931\u8D25\u3002"),autoInstallable:!1,hint:t.ok?void 0:"\u8BF7\u5148\u914D\u7F6E Claude Console / API \u51ED\u8BC1\uFF0C\u6216\u8FD0\u884C `claude` \u5B8C\u6210\u767B\u5F55\u540E\u518D\u91CD\u8BD5\u3002"}},_s=async e=>e==="codex-cli"?mp():e==="codex-auth"?gp():e==="claude-cli"?fp():e==="claude-auth"?kp():null,Bs=e=>e==="codex-cli"?Ms():e==="claude-cli"?Os():null;var fe=900*1e3,Ne=se(),xp=e=>{let t=process.env.PATH??"";t.split(er.delimiter).filter(Boolean).includes(e)||(process.env.PATH=t?`${e}${er.delimiter}${t}`:e)},co=()=>{if(process.platform!=="win32")return null;let e=[process.env.ProgramFiles,process.env.ProgramW6432,process.env.LocalAppData].filter(r=>!!r),t=[["Git","cmd","git.exe"],["Git","bin","git.exe"],["Programs","Git","cmd","git.exe"],["Programs","Git","bin","git.exe"]];for(let r of e)for(let n of t){let o=er.join(r,...n);if(Vr(o))return xp(er.dirname(o)),o}return null},Ns=e=>e==="git"?"Git":e==="opencode"?"OpenCode runtime":e==="pi-runtime"?"Pi runtime":e==="codex-cli"?"Codex CLI":e==="codex-auth"?"Codex \u767B\u5F55":e==="claude-cli"?"Claude Code CLI":"Claude Code \u767B\u5F55",ce=(e,t,r)=>({id:e,label:Ns(e),ok:r.ok,changed:r.changed,detail:r.detail,skipped:r.skipped,installer:t?.installer,commandSummary:t?.commandSummary});var $s=()=>{if(process.platform==="win32")return J("winget")?{installer:"winget",commandSummary:"winget install --id Git.Git --exact --source winget",manualHint:"\u8BF7\u5148\u5B89\u88C5 Git \u5E76\u786E\u8BA4\u5B83\u5728 PATH \u4E2D\u53EF\u6267\u884C\uFF1BWindows \u53EF\u4F18\u5148\u4F7F\u7528 winget \u5B89\u88C5\u3002",run(e){let t={installer:"winget",commandSummary:"winget install --id Git.Git --exact --source winget"},r=V("winget",["install","--id","Git.Git","--exact","--source","winget","--accept-package-agreements","--accept-source-agreements"],{streamOutput:e?.streamOutput,timeout:fe});return r.ok&&co(),ce("git",t,{ok:r.ok,changed:r.ok,detail:z(r,"winget install Git.Git \u5931\u8D25")})}}:J("choco")?{installer:"choco",commandSummary:"choco install git -y",manualHint:"\u8BF7\u5148\u5B89\u88C5 Git \u5E76\u786E\u8BA4\u5B83\u5728 PATH \u4E2D\u53EF\u6267\u884C\uFF1BWindows \u53EF\u4F7F\u7528 choco \u5B89\u88C5\u3002",run(e){let t={installer:"choco",commandSummary:"choco install git -y"},r=V("choco",["install","git","-y"],{streamOutput:e?.streamOutput,timeout:fe});return r.ok&&co(),ce("git",t,{ok:r.ok,changed:r.ok,detail:z(r,"choco install git \u5931\u8D25")})}}:null;if(process.platform==="darwin")return J("brew")?{installer:"brew",commandSummary:"brew install git",manualHint:"\u8BF7\u5148\u5B89\u88C5 Git \u5E76\u786E\u8BA4\u5B83\u5728 PATH \u4E2D\u53EF\u6267\u884C\uFF1BmacOS \u53EF\u6267\u884C `brew install git`\u3002",run(e){let t={installer:"brew",commandSummary:"brew install git"},r=V("brew",["install","git"],{streamOutput:e?.streamOutput,timeout:fe});return ce("git",t,{ok:r.ok,changed:r.ok,detail:z(r,"brew install git \u5931\u8D25")})}}:null;if(process.platform==="linux"){if(J("apt-get"))return{installer:"apt-get",commandSummary:"sudo apt-get update && sudo apt-get install -y git",manualHint:"\u8BF7\u5148\u5B89\u88C5 Git \u5E76\u786E\u8BA4\u5B83\u5728 PATH \u4E2D\u53EF\u6267\u884C\uFF1BDebian/Ubuntu \u53EF\u6267\u884C `sudo apt-get update && sudo apt-get install -y git`\u3002",run(e){let t={installer:"apt-get",commandSummary:"sudo apt-get update && sudo apt-get install -y git"},r=De("apt-get",["update"],fe,e);if(!r.ok)return ce("git",t,{ok:!1,changed:!1,detail:z(r,"apt-get update \u5931\u8D25")});let n=De("apt-get",["install","-y","git"],fe,e);return ce("git",t,{ok:n.ok,changed:n.ok,detail:z(n,"apt-get install git \u5931\u8D25")})}};if(J("dnf"))return{installer:"dnf",commandSummary:"sudo dnf install -y git",manualHint:"\u8BF7\u5148\u5B89\u88C5 Git \u5E76\u786E\u8BA4\u5B83\u5728 PATH \u4E2D\u53EF\u6267\u884C\uFF1BFedora \u53EF\u6267\u884C `sudo dnf install -y git`\u3002",run(e){let t={installer:"dnf",commandSummary:"sudo dnf install -y git"},r=De("dnf",["install","-y","git"],fe,e);return ce("git",t,{ok:r.ok,changed:r.ok,detail:z(r,"dnf install git \u5931\u8D25")})}};if(J("yum"))return{installer:"yum",commandSummary:"sudo yum install -y git",manualHint:"\u8BF7\u5148\u5B89\u88C5 Git \u5E76\u786E\u8BA4\u5B83\u5728 PATH \u4E2D\u53EF\u6267\u884C\uFF1BCentOS/RHEL \u53EF\u6267\u884C `sudo yum install -y git`\u3002",run(e){let t={installer:"yum",commandSummary:"sudo yum install -y git"},r=De("yum",["install","-y","git"],fe,e);return ce("git",t,{ok:r.ok,changed:r.ok,detail:z(r,"yum install git \u5931\u8D25")})}};if(J("pacman"))return{installer:"pacman",commandSummary:"sudo pacman -Sy --noconfirm git",manualHint:"\u8BF7\u5148\u5B89\u88C5 Git \u5E76\u786E\u8BA4\u5B83\u5728 PATH \u4E2D\u53EF\u6267\u884C\uFF1BArch \u53EF\u6267\u884C `sudo pacman -Sy --noconfirm git`\u3002",run(e){let t={installer:"pacman",commandSummary:"sudo pacman -Sy --noconfirm git"},r=De("pacman",["-Sy","--noconfirm","git"],fe,e);return ce("git",t,{ok:r.ok,changed:r.ok,detail:z(r,"pacman \u5B89\u88C5 git \u5931\u8D25")})}};if(J("apk"))return{installer:"apk",commandSummary:"sudo apk add git",manualHint:"\u8BF7\u5148\u5B89\u88C5 Git \u5E76\u786E\u8BA4\u5B83\u5728 PATH \u4E2D\u53EF\u6267\u884C\uFF1BAlpine \u53EF\u6267\u884C `sudo apk add git`\u3002",run(e){let t={installer:"apk",commandSummary:"sudo apk add git"},r=De("apk",["add","git"],fe,e);return ce("git",t,{ok:r.ok,changed:r.ok,detail:z(r,"apk add git \u5931\u8D25")})}}}return null},Us=()=>Vr(`${Ne}/package.json`)?Vr(`${Ne}/pnpm-lock.yaml`)&&J("pnpm")?{installer:"pnpm",commandSummary:"pnpm install --frozen-lockfile",manualHint:"\u8BF7\u5728 worker \u6839\u76EE\u5F55\u6267\u884C `pnpm install --frozen-lockfile`\uFF0C\u786E\u4FDD `@opencode-ai/sdk` \u4E0E `opencode-ai` runtime \u90FD\u5DF2\u5B89\u88C5\u3002",run(e){let t={installer:"pnpm",commandSummary:"pnpm install --frozen-lockfile"},r=V("pnpm",["install","--frozen-lockfile"],{cwd:Ne,streamOutput:e?.streamOutput,timeout:fe});return ce("opencode",t,{ok:r.ok,changed:r.ok,detail:z(r,"pnpm install \u5931\u8D25")})}}:Vr(`${Ne}/package-lock.json`)&&J("npm")?{installer:"npm",commandSummary:"npm ci",manualHint:"\u8BF7\u5728 worker \u6839\u76EE\u5F55\u6267\u884C `npm ci`\uFF0C\u786E\u4FDD `@opencode-ai/sdk` \u4E0E `opencode-ai` runtime \u90FD\u5DF2\u5B89\u88C5\u3002",run(e){let t={installer:"npm",commandSummary:"npm ci"},r=V("npm",["ci"],{cwd:Ne,streamOutput:e?.streamOutput,timeout:fe});return ce("opencode",t,{ok:r.ok,changed:r.ok,detail:z(r,"npm ci \u5931\u8D25")})}}:J("npm")?{installer:"npm",commandSummary:"npm install",manualHint:"\u8BF7\u5728 worker \u6839\u76EE\u5F55\u6267\u884C `npm install`\uFF0C\u786E\u4FDD `@opencode-ai/sdk` \u4E0E `opencode-ai` runtime \u90FD\u5DF2\u5B89\u88C5\u3002",run(e){let t={installer:"npm",commandSummary:"npm install"},r=V("npm",["install"],{cwd:Ne,streamOutput:e?.streamOutput,timeout:fe});return ce("opencode",t,{ok:r.ok,changed:r.ok,detail:z(r,"npm install \u5931\u8D25")})}}:null:null,Sp=e=>e==="git"?$s():e==="opencode"?Us():Bs(e),vp=()=>{co();let e=V("git",["--version"]),t=$s();return{id:"git",label:"Git",ok:e.ok,detail:z(e,"git \u4E0D\u53EF\u7528"),autoInstallable:!!t,installer:t?.installer,installCommand:t?.commandSummary,hint:t?.manualHint||"\u8BF7\u5148\u5B89\u88C5 Git\uFF0C\u5E76\u786E\u8BA4\u5B83\u5728 PATH \u4E2D\u53EF\u6267\u884C\u3002"}},Cp=()=>{let e=V(process.execPath,["-e",'import("@opencode-ai/sdk").then(() => console.log("ok")).catch((error) => { console.error(error instanceof Error ? error.message : String(error)); process.exit(1) })'],{cwd:Ne}),t=Us(),r=ne(er.join(Ne,"node_modules",".bin","opencode")),n=ne("opencode")||r,o=n?V(n,["--version"]):null,i=e.ok?n&&o?.ok?`@opencode-ai/sdk \u5DF2\u5B89\u88C5\uFF1B${o.stdout||n}`:"\u672A\u68C0\u6D4B\u5230\u53EF\u6267\u884C\u7684 OpenCode runtime\uFF08`opencode`\uFF09\u3002":z(e,"OpenCode runtime \u4F9D\u8D56\u4E0D\u53EF\u7528");return{id:"opencode",label:"OpenCode runtime",ok:e.ok&&!!(n&&o?.ok),detail:i,autoInstallable:!!t,installer:t?.installer,installCommand:t?.commandSummary,hint:t?.manualHint||"\u8BF7\u68C0\u67E5 worker \u4F9D\u8D56\u5B89\u88C5\u72B6\u6001\uFF0C\u5E76\u786E\u8BA4 `opencode-ai` \u5DF2\u968F worker \u4F9D\u8D56\u4E00\u8D77\u5B89\u88C5\u3002"}},Pp=()=>{let e=V(process.execPath,["-e",'import("@mariozechner/pi-coding-agent").then(() => console.log("ok")).catch((error) => { console.error(error instanceof Error ? error.message : String(error)); process.exit(1) })'],{cwd:Ne});return{id:"pi-runtime",label:"Pi runtime",ok:e.ok,detail:e.ok?"@mariozechner/pi-coding-agent \u5DF2\u5B89\u88C5":z(e,"Pi SDK \u4E0D\u53EF\u7528"),autoInstallable:!1,hint:"\u8BF7\u68C0\u67E5 worker \u4F9D\u8D56\u5B89\u88C5\u72B6\u6001\uFF0C\u5E76\u786E\u8BA4 `@mariozechner/pi-coding-agent` \u53EF\u88AB\u5F53\u524D Node \u8FD0\u884C\u65F6\u52A0\u8F7D\u3002"}},Ls=async e=>{if(e==="git")return vp();if(e==="opencode")return Cp();if(e==="pi-runtime")return Pp();let t=await _s(e);return t||{id:e,label:Ns(e),ok:!1,detail:"\u672A\u77E5\u68C0\u67E5\u9879\u3002",autoInstallable:!1}},Ep=e=>e==="all"?["git","opencode","pi-runtime","codex-cli","codex-auth","claude-cli","claude-auth"]:e==="Pi"?["pi-runtime"]:e==="Codex"?["git","codex-cli","codex-auth"]:e==="ClaudeCode"?["git","claude-cli","claude-auth"]:["git","opencode"],Ip=e=>e==="Pi"?"Pi \u8FD0\u884C\u73AF\u5883\u5DF2\u5C31\u7EEA\u3002":e==="Codex"?"Git\u3001Codex CLI \u4E0E\u767B\u5F55\u72B6\u6001\u5DF2\u5C31\u7EEA\u3002":e==="ClaudeCode"?"Git\u3001Claude Code CLI \u4E0E\u767B\u5F55\u72B6\u6001\u5DF2\u5C31\u7EEA\u3002":e==="all"?"Git\u3001OpenCode\u3001Pi\u3001Codex\u3001Claude Code \u8FD0\u884C\u73AF\u5883\u5DF2\u5C31\u7EEA\u3002":"Git \u4E0E OpenCode \u8FD0\u884C\u65F6\u5DF2\u5C31\u7EEA\u3002",lo=(e,t)=>{let r=e.filter(o=>!o.ok),n=r.length===0;return{ok:n,target:t,items:e,missingItems:r,message:n?Ip(t):`\u8FD0\u884C\u73AF\u5883\u7F3A\u5931\uFF1A${r.map(o=>o.label).join("\u3001")}`}},bp=e=>{let t=e.filter(o=>!o.ok);if(t.length===0)return"\u81EA\u52A8\u51C6\u5907\u5931\u8D25\u3002";let r=`\u81EA\u52A8\u51C6\u5907\u5931\u8D25\uFF1A${t.map(o=>o.label).join("\u3001")}`,n=t.map(o=>`- ${o.label}: ${o.detail}`).join(`
1
+ import mu from"dotenv";var Me=e=>e.replace(/\/+$/,""),ao=e=>e.trim().toLowerCase(),yi=e=>ao(e).endsWith(".localtest.me"),ki=e=>{let t=Me(e);return t.startsWith("https://")?`${t.replace("https://","wss://")}/api/control-plane/executors/ws`:t.startsWith("http://")?`${t.replace("http://","ws://")}/api/control-plane/executors/ws`:`${t}/api/control-plane/executors/ws`},fu=e=>{let t=Me(e);return t.startsWith("https://")?`${t.replace("https://","wss://")}/api/preview-tunnels/ws`:t.startsWith("http://")?`${t.replace("http://","ws://")}/api/preview-tunnels/ws`:`${t}/api/preview-tunnels/ws`},wi=e=>{let t=fu(e.cloudUrl),r=e.tunnelUrl?.trim();if(!r)return t;try{let n=new URL(r),o=new URL(t),s=ao(n.hostname),i=ao(o.hostname);if(yi(s)&&!yi(i))return t}catch{return t}return r};var tt=async e=>{let t=await fetch(e.url,{method:e.method??"GET",headers:{...e.body===void 0?{}:{"Content-Type":"application/json"},...e.headers??{}},body:e.body===void 0?void 0:JSON.stringify(e.body)});if(!t.ok){let r=await t.json().catch(()=>({message:e.errorMessage}));throw new Error(r.message||e.errorMessage)}return await t.json()};var or=async(e,t)=>tt({url:`${Me(t)}/api/control-plane/executors/pair`,method:"POST",body:e,errorMessage:"Pair request failed."});var kt=e=>e?.trim().toUpperCase()||"",wt=e=>!!(e.executorId?.trim()&&e.executorToken?.trim()),Lr=(e,t)=>{let r=kt(e);return!r||!wt(t)?!1:r===kt(t.lastPairedPairingCode)},jr=()=>"This pairing code already completed on this worker. Reusing the saved executor token instead of pairing again.";var hu=new Map([["\u914D\u5BF9\u7801\u5DF2\u4F7F\u7528\u3002","This pairing code has already been used."],["\u914D\u5BF9\u7801\u5DF2\u8FC7\u671F\u3002","This pairing code has expired."],["\u914D\u5BF9\u7801\u4E0D\u5B58\u5728\u3002","This pairing code does not exist."]]),yu=new Set(["This pairing code has already been used.","This pairing code has expired.","This pairing code does not exist."]),xi=e=>{let t=e.trim();return hu.get(t)||t},ku=e=>yu.has(xi(e)),Si=()=>"This worker is already paired locally. If you only want to reconnect after a restart, start the worker again without `connect --pairing-code ...`.",Fr=(e,t)=>{let r=xi(e);return!t||!ku(r)?r:`${r} ${Si()}`},Ci=e=>e?`${Si()} Use \`connect --pairing-code <CODE>\` only when you want to pair this machine for the first time or move it to a different account.`:"Missing required flag: --pairing-code";import{existsSync as po,readFileSync as mo}from"node:fs";import we from"node:path";import{fileURLToPath as vi}from"node:url";var co=null,lo=null,uo=null,wu=(e,t)=>{let r=we.relative(t,e);return r===""||!r.startsWith("..")&&!we.isAbsolute(r)},xu=e=>{try{let t=JSON.parse(mo(e,"utf8"));return!!(t.name&&t.version)}catch{return!1}},Su=()=>{let e=process.env.VIBEMUX_RUNTIME_ROOT?.trim();if(e){let r=we.resolve(e),n=vi(import.meta.url);if(wu(n,r))return r}let t=we.dirname(vi(import.meta.url));for(;;){let r=we.join(t,"package.json");if(po(r)&&xu(r))return t;let n=we.dirname(t);if(n===t)return process.cwd();t=n}},ce=()=>(co||(co=Su()),co),rt=()=>{if(!lo){let e=we.join(ce(),"package.json");lo=po(e)?JSON.parse(mo(e,"utf8")):{}}return lo},xt=()=>{if(!uo){let e=we.join(ce(),"runtime","worker-release.json");uo=po(e)?JSON.parse(mo(e,"utf8")):{}}return uo},pe=()=>rt().version?.trim()||process.env.npm_package_version?.trim()||"0.0.0",sr=()=>we.join(ce(),"dist-worker","apps","worker","src","index.js"),Pi=()=>we.join(ce(),"dist-worker","apps","worker","web"),qr=()=>{let e=process.platform==="win32"?"vibemux-worker.cmd":"vibemux-worker";return we.join(ce(),"bin",e)};import{cpSync as Ri,existsSync as He,mkdirSync as ko,readFileSync as Jr,rmSync as zu,writeFileSync as wo}from"node:fs";import{randomUUID as Ku}from"node:crypto";import Be from"node:os";import W from"node:path";var Hr=["Pi","OpenCode","Codex","ClaudeCode"];var Cu=[...Hr],vu=new Set(Hr),KS=new Set(Cu),Pu={OpenCode:{id:"OpenCode",label:"OpenCode",transport:"SDK",modelIdStrategy:"canonical",workerOnly:!0,agentType:"OpenCode"},Codex:{id:"Codex",label:"Codex",transport:"STDIO",modelIdStrategy:"native",workerOnly:!0,agentType:"Codex"},ClaudeCode:{id:"ClaudeCode",label:"Claude Code",transport:"STDIO",modelIdStrategy:"native",workerOnly:!0,agentType:"ClaudeCode"},Pi:{id:"Pi",label:"Pi",transport:"SDK",modelIdStrategy:"canonical",workerOnly:!0,agentType:"Pi"}},Ii=e=>typeof e=="string"&&vu.has(e);var Gr=e=>Pu[e],St=e=>e;var go=(e,t)=>{let r=e.trim(),n=t.trim();return r&&n?`${r}/${n}`:""},Ct=(e,t,r)=>Gr(e).modelIdStrategy==="canonical"?r?.trim()||"":Iu(t,r),Oe=e=>{let t=e?.trim()||"";if(!t)return null;let[r,...n]=t.split("/"),o=n.join("/");return!r||!o?null:{providerId:r,modelId:o}},Ei=e=>e?.trim().toLowerCase()||"",Iu=(e,t)=>{let r=t?.trim()||"";if(!r)return"";let n=Oe(r);return n&&Ei(n.providerId)===Ei(e)?n.modelId:r};var Eu=e=>{let t="",r=!1,n='"',o=!1;for(let s=0;s<e.length;s+=1){let i=e[s],a=e[s+1];if(r){if(t+=i,o){o=!1;continue}if(i==="\\"){o=!0;continue}i===n&&(r=!1);continue}if(i==='"'||i==="'"){r=!0,n=i,t+=i;continue}if(i==="/"&&a==="/"){for(s+=2;s<e.length&&e[s]!==`
2
+ `;)s+=1;s<e.length&&(t+=e[s]);continue}if(i==="/"&&a==="*"){for(s+=2;s<e.length-1&&!(e[s]==="*"&&e[s+1]==="/");)s+=1;s+=1;continue}t+=i}return t},bu=e=>{let t="",r=!1,n='"',o=!1;for(let s=0;s<e.length;s+=1){let i=e[s];if(r){if(t+=i,o){o=!1;continue}if(i==="\\"){o=!0;continue}i===n&&(r=!1);continue}if(i==='"'||i==="'"){r=!0,n=i,t+=i;continue}if(i===","){let a=s+1;for(;a<e.length&&/\s/.test(e[a]);)a+=1;if(e[a]==="}"||e[a]==="]")continue}t+=i}return t},Tu=e=>bu(Eu(e)),me=e=>{let t=e?.trim();if(!t)return{};try{let r=JSON.parse(Tu(t));return r&&typeof r=="object"?r:{}}catch(r){throw new Error(r instanceof Error?`OpenCode \u914D\u7F6E JSON/JSONC \u65E0\u6548\uFF1A${r.message}`:"OpenCode \u914D\u7F6E JSON/JSONC \u65E0\u6548")}};var nt="built-in://vibemux",fo=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Ru=(e,t,r)=>{let n=t.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"")||`${e}-${r+1}`;return`${e}-${r+1}-${n}`};var Au=e=>e.replace(/\/+$/,""),Mu=e=>e.startsWith("sse://")?`http://${e.slice(6)}`:e,Ou=e=>{if(!e.executorToken?.trim())return null;let t={Authorization:`Bearer ${e.executorToken}`};return e.actingUserId?.trim()&&(t["x-vibemux-acting-user"]=e.actingUserId.trim()),{type:"remote",url:`${Au(e.cloudUrl)}/mcp/executor`,enabled:!0,headers:t}},_u=e=>{let t=e.replace(/^stdio:\/\//,"").trim();return t?{command:t}:null},Bu=e=>{let t=Mu(e).trim();return t?{type:"remote",url:t,enabled:!0}:null},ot=(e,t)=>e.filter(r=>r.enabled).reduce((r,n,o)=>{let s=n.id?.trim()||Ru("mcp",n.name,o),i=n.target===nt?Ou(t):n.transport==="stdio"||n.target.startsWith("stdio://")?_u(n.target):Bu(n.target);return i&&(r[s]=i),r},{}),zr=(e,t,r)=>{let n=me(e),o=fo(n)?{...n}:{},s=fo(o.mcp)?{...o.mcp}:fo(o.mcpServers)?{...o.mcpServers}:{},i=ot(t,r),{mcpServers:a,...c}=o,l={...c,mcp:{...s,...i}};return JSON.stringify(l,null,2)};var vt=e=>`'${e.replace(/'/g,"'\\''")}'`,st=(e,t=[])=>r=>`command -v ${e} >/dev/null 2>&1 && ${e}${t.length>0?` ${t.join(" ")}`:""} ${vt(r)}`,xe=(e,t=[])=>r=>`[ -x "${e}" ] && "${e}"${t.length>0?` ${t.join(" ")}`:""} ${vt(r)}`,_e=e=>t=>`command -v open >/dev/null 2>&1 && open -Ra "${e}" && open -a "${e}" ${vt(t)}`,ir=e=>t=>e?`command -v open >/dev/null 2>&1 && open -Ra "${e}" && open -a "${e}" ${vt(t)}`:`command -v open >/dev/null 2>&1 && open ${vt(t)}`,Wu=e=>`command -v ghostty >/dev/null 2>&1 && ghostty --working-directory=${vt(e)}`;var eC={vscode:{label:"VS Code",description:"Visual Studio Code",commandBuilders:[st("code",["--reuse-window"]),...["/opt/homebrew/bin/code","/usr/local/bin/code","/usr/bin/code","/snap/bin/code","/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code","$HOME/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code"].map(e=>xe(e,["--reuse-window"])),_e("Visual Studio Code")]},"vscode-insiders":{label:"VS Code Insiders",description:"Visual Studio Code - Insiders",commandBuilders:[st("code-insiders",["--reuse-window"]),...["/opt/homebrew/bin/code-insiders","/usr/local/bin/code-insiders","/usr/bin/code-insiders","/snap/bin/code-insiders","/Applications/Visual Studio Code - Insiders.app/Contents/Resources/app/bin/code-insiders","$HOME/Applications/Visual Studio Code - Insiders.app/Contents/Resources/app/bin/code-insiders"].map(e=>xe(e,["--reuse-window"])),_e("Visual Studio Code - Insiders")]},cursor:{label:"Cursor",description:"Cursor editor",commandBuilders:[st("cursor"),xe("/Applications/Cursor.app/Contents/Resources/app/bin/cursor"),xe("$HOME/Applications/Cursor.app/Contents/Resources/app/bin/cursor"),_e("Cursor")]},windsurf:{label:"Windsurf",description:"Windsurf editor",commandBuilders:[st("windsurf"),xe("/Applications/Windsurf.app/Contents/Resources/app/bin/windsurf"),xe("$HOME/Applications/Windsurf.app/Contents/Resources/app/bin/windsurf"),_e("Windsurf")]},zed:{label:"Zed",description:"Zed editor",commandBuilders:[st("zed"),xe("/Applications/Zed.app/Contents/MacOS/zed"),xe("$HOME/Applications/Zed.app/Contents/MacOS/zed"),_e("Zed")]},intellij:{label:"IntelliJ IDEA",description:"JetBrains IntelliJ IDEA",commandBuilders:[st("idea"),_e("IntelliJ IDEA"),_e("IntelliJ IDEA CE")]},xcode:{label:"Xcode",description:"Xcode project editor",commandBuilders:[st("xed"),xe("/usr/bin/xed"),_e("Xcode")]},ghostty:{label:"Ghostty",description:"Ghostty terminal",commandBuilders:[Wu,xe("/Applications/Ghostty.app/Contents/MacOS/ghostty",["--working-directory"]),xe("$HOME/Applications/Ghostty.app/Contents/MacOS/ghostty",["--working-directory"]),_e("Ghostty")]},finder:{label:"Finder",description:"Open the folder in Finder",commandBuilders:[ir()]},terminal:{label:"Terminal",description:"Open the folder in Terminal.app",commandBuilders:[ir("Terminal")]},iterm:{label:"iTerm",description:"Open the folder in iTerm",commandBuilders:[ir("iTerm"),ir("iTerm2")]},warp:{label:"Warp",description:"Open the folder in Warp",commandBuilders:[ir("Warp")]}};var Du={defaultModel:"",agent:"",permissionPolicy:""},Nu={defaultModel:"gpt-5.4",sandbox:"workspace-write",approval:"never",reasoningEffort:"medium",reasoningSummary:"auto"},Uu={defaultModel:"sonnet",permissionMode:"bypassPermissions",planMode:!1},$u={defaultModel:"",agentDir:""},bi={OpenCode:Du,Codex:Nu,ClaudeCode:Uu,Pi:$u};var cC={...bi};var Lu=e=>({OpenCode:{...e.OpenCode},Codex:{...e.Codex},ClaudeCode:{...e.ClaudeCode},Pi:{...e.Pi}});var ar=(e,t)=>{let r=Lu(bi);return e?.OpenCode&&(r.OpenCode={...r.OpenCode,...e.OpenCode}),e?.Codex&&(r.Codex={...r.Codex,...e.Codex}),e?.ClaudeCode&&(r.ClaudeCode={...r.ClaudeCode,...e.ClaudeCode}),e?.Pi&&(r.Pi={...r.Pi,...e.Pi}),!r.OpenCode.defaultModel.trim()&&t?.trim()&&(r.OpenCode.defaultModel=t.trim()),r};var Kr=null,ju=()=>Kr||(Kr=xt(),Kr),qe=()=>process.env.VIBEMUX_WORKER_RELEASE_CHANNEL?.trim()||ju().channel?.trim()||"production",Fu=e=>e==="preview"?"vibemux-worker-preview":"vibemux-worker",qu=e=>e==="preview"?"preview":"latest",Hu=()=>(process.env.npm_config_registry?.trim()||"https://registry.npmjs.org").replace(/\/$/,""),Gu=async e=>{let t=await fetch(`${Hu()}/${e}`,{method:"GET",signal:AbortSignal.timeout(5e3)});if(!t.ok)throw new Error(`\u67E5\u8BE2 npm \u5305\u5931\u8D25\uFF0CHTTP ${t.status}`);return await t.json()},it=async()=>{let e=pe(),t=qe(),r=rt().name?.trim()||"",n=Fu(t),o=qu(t);if(r!==n)return{ok:!0,currentVersion:e,channel:t,available:!1,packageName:n,packageTag:o,message:"\u5F53\u524D\u662F\u6E90\u7801\u6A21\u5F0F\u6216\u975E npm Worker \u5305\uFF0C\u8DF3\u8FC7\u7248\u672C\u66F4\u65B0\u68C0\u67E5\u3002"};try{let i=(await Gu(n))["dist-tags"]?.[o]?.trim();return i?i===e?{ok:!0,currentVersion:e,latestVersion:i,channel:t,available:!1,packageName:n,packageTag:o,message:`\u5F53\u524D\u5DF2\u662F\u6700\u65B0\u7248\u672C ${e}\u3002`}:{ok:!0,currentVersion:e,latestVersion:i,channel:t,available:!0,packageName:n,packageTag:o,message:`\u68C0\u6D4B\u5230\u65B0\u7248\u672C ${i}\u3002`}:{ok:!1,currentVersion:e,channel:t,available:!1,packageName:n,packageTag:o,message:`\u672A\u627E\u5230 npm dist-tag: ${o}`}}catch(s){return{ok:!1,currentVersion:e,channel:t,available:!1,packageName:n,packageTag:o,message:s instanceof Error?s.message:"\u67E5\u8BE2 npm \u66F4\u65B0\u5931\u8D25"}}};var Ai=W.join(Be.homedir(),".vibemux"),Vu=W.join(Be.homedir(),".vibemux-dev"),Ju=W.join(Be.homedir(),".vibemux-preview"),Xu="http://127.0.0.1:8989",Yu=48121,Qu=48100,Zu=48123,ep=["config.json","machine-id","workspace","runtime"],tp=["config.json","machine-id","runtime"],rp=new Set(["http://127.0.0.1:8989","http://localhost:8989","http://127.0.0.1:18989","http://localhost:18989","ws://127.0.0.1:8989","ws://localhost:8989","ws://127.0.0.1:18989","ws://localhost:18989"]),Mi=()=>!!process.env.VIBEMUX_CLOUD_URL?.trim(),Vr=()=>process.env.VIBEMUX_CLOUD_URL?.trim()||xt().defaultCloudUrl?.trim()||Xu,np=["vibemux.xyz"],ho=e=>np.some(t=>e.includes(t)),op=e=>{if(process.env.NODE_ENV==="development"||Mi())return!1;let t=xt().defaultCloudUrl?.trim();if(!t)return!1;if(rp.has(e?.trim()||""))return!0;let r=ho(t),n=ho(e||"");return r!==n},xo=()=>{let e=Vr();return qe()==="preview"||ho(e)?"preview":process.env.NODE_ENV==="development"?"development":"production"},sp=()=>{switch(xo()){case"development":return Vu;case"preview":return Ju;default:return Ai}},ip=()=>{let e=Ai;switch(xo()){case"development":return[W.join(e,"worker-dev")];case"preview":return process.env.NODE_ENV==="development"?[W.join(e,"worker-dev-preview"),W.join(e,"worker-preview")]:[W.join(e,"worker-preview"),W.join(e,"worker-dev-preview")];default:return[W.join(e,"worker")]}},Ti=e=>tp.some(t=>He(W.join(e,t))),ap=(e,t)=>{let r=W.join(e,"config.json");if(He(r))try{let n=JSON.parse(Jr(r,"utf8"));(n.workspaceRoot?.trim()||"")===W.join(e,"workspace")&&(n.workspaceRoot=W.join(t,"workspace")),wo(W.join(t,"config.json"),`${JSON.stringify(n,null,2)}
3
+ `,"utf8")}catch{Ri(r,W.join(t,"config.json"))}},cp=e=>{if(Ti(e))return;let t=ip().find(r=>r!==e&&Ti(r));if(t){ko(e,{recursive:!0});for(let r of ep){if(r==="config.json")continue;let n=W.join(t,r),o=W.join(e,r);!He(n)||He(o)||Ri(n,o,{recursive:!0})}He(W.join(e,"config.json"))||ap(t,e)}},lp=()=>{let e=Number(process.env.VIBEMUX_WORKER_PORT?.trim());if(Number.isFinite(e)&&e>0)return e;let t=xt().defaultLocalServerPort;if(Number.isFinite(t)&&t)return t;switch(xo()){case"development":return Yu;case"preview":return Zu;default:return Qu}},dp=()=>{let e=process.env.OPENCODE_CONFIG_PATH?.trim();if(e)return[e];let t=W.join(Be.homedir(),".config","opencode");return[W.join(t,"opencode.json"),W.join(t,"opencode.jsonc")]},Oi=()=>{let e=process.env.CODEX_HOME?.trim()||W.join(Be.homedir(),".codex");return W.join(e,"config.toml")},_i=()=>{let e=process.env.CODEX_HOME?.trim()||W.join(Be.homedir(),".codex");return W.join(e,"auth.json")},up=()=>{let e=process.env.CLAUDE_HOME?.trim()||W.join(Be.homedir(),".claude");return W.join(e,"settings.json")},Bi=()=>process.env.PI_AGENT_DIR?.trim()||W.join(Be.homedir(),".pi","agent"),Pt=e=>{if(!He(e))return"";try{return Jr(e,"utf8").trim()}catch{return""}},yo=e=>!!e&&typeof e=="object"&&!Array.isArray(e),Wi=(e,t)=>Object.entries(t).reduce((r,[n,o])=>{let s=r[n];return yo(s)&&yo(o)?(r[n]=Wi({...s},o),r):(r[n]=o,r)},{...e}),Di=()=>{let e=dp().map(t=>({path:t,content:Pt(t)})).filter(t=>t.content.trim());if(e.length===0)return{opencodeConfigContent:"",defaultModel:"",sourcePaths:[]};try{if(e.length===1){let o=me(e[0].content),s=Object.entries(o.default??{}).find(([,i])=>typeof i=="string"&&i.trim());return{opencodeConfigContent:e[0].content,defaultModel:s?`${s[0]}/${String(s[1]).trim()}`:"",sourcePaths:e.map(i=>i.path)}}let t=e.reduce((o,s)=>{let i=me(s.content);return Wi(o,i)},{}),r=yo(t.default)?t.default:{},n=Object.entries(r).find(([,o])=>typeof o=="string"&&o.trim());return{opencodeConfigContent:JSON.stringify(t,null,2),defaultModel:n?`${n[0]}/${String(n[1]).trim()}`:"",sourcePaths:e.map(o=>o.path)}}catch{return{opencodeConfigContent:"",defaultModel:"",sourcePaths:e.map(t=>t.path)}}},pp=()=>{let e=Di();return{opencodeConfigContent:e.opencodeConfigContent,defaultModel:e.defaultModel}},mp=()=>{let e=process.env.VIBEMUX_WORKER_HOME?.trim();if(e)return e;let t=process.env.VIBEMUX_HOME?.trim();return t?W.join(t,"worker"):sp()},Ee=()=>{let e=W.resolve(mp());return!process.env.VIBEMUX_WORKER_HOME?.trim()&&!process.env.VIBEMUX_HOME?.trim()&&cp(e),e},So=()=>W.join(Ee(),"config.json"),gp=()=>W.join(Ee(),"machine-id"),fp=()=>{let e=Ee(),t=gp();if(He(t)){let n=Jr(t,"utf8").trim();if(n)return n}ko(e,{recursive:!0});let r=Ku();return wo(t,`${r}
4
+ `,"utf8"),r},hp=()=>({cloudUrl:Vr(),machineId:fp(),machineName:Be.hostname(),opencodeConfigContent:"",codexConfigContent:"",codexAuthContent:"",claudeCodeConfigContent:"",piAgentDir:Bi(),defaultModel:"",agentSettings:ar(),mcpServers:[],workspaceRoot:W.join(Ee(),"workspace"),maxConcurrency:5,labels:[],capabilities:["code-execution","git-operations"],localServerPort:Number(process.env.VIBEMUX_WORKER_PORT||lp()),projectBindings:[]}),T=()=>{let e=So(),t=He(e)?JSON.parse(Jr(e,"utf8")):{},r={...hp(),...t},n=pp();Mi()&&(r.cloudUrl=Vr()),op(r.cloudUrl)&&(r.cloudUrl=Vr());let o=Number(process.env.VIBEMUX_WORKER_PORT?.trim());return Number.isFinite(o)&&o>0&&(r.localServerPort=o),r.opencodeConfigContent?.trim()||(r.opencodeConfigContent=n.opencodeConfigContent),r.codexConfigContent?.trim()||(r.codexConfigContent=Pt(Oi())),r.codexAuthContent?.trim()||(r.codexAuthContent=Pt(_i())),r.claudeCodeConfigContent?.trim()||(r.claudeCodeConfigContent=Co()),r.piAgentDir?.trim()||(r.piAgentDir=Bi()),r.defaultModel?.trim()||(r.defaultModel=n.defaultModel),r.agentSettings=ar(r.agentSettings,r.defaultModel),r},be=e=>{let t=Ee();ko(t,{recursive:!0}),wo(So(),`${JSON.stringify(e,null,2)}
5
+ `,"utf8")},Ni=()=>Di().opencodeConfigContent,Xr=()=>Pt(Oi()),Yr=()=>Pt(_i()),Co=()=>Pt(up()),Qr=(e=T(),t)=>zr(e.opencodeConfigContent,e.mcpServers??[],{cloudUrl:e.cloudUrl,executorToken:e.executorToken,actingUserId:t}),Zr=()=>{zu(So(),{force:!0})},en=()=>{let e={...T(),executorName:void 0,executorId:void 0,executorToken:void 0,lastPairedPairingCode:void 0};return be(e),e};import{existsSync as sn}from"node:fs";import{stdin as ea,stdout as ta}from"node:process";import dr from"node:path";import{createInterface as Kp}from"node:readline/promises";import{existsSync as Bp,mkdtempSync as Wp,rmSync as Dp,writeFileSync as zi}from"node:fs";import Ki from"node:os";import cr from"node:path";import{spawn as Np}from"node:child_process";import{accessSync as yp,constants as kp,existsSync as wp}from"node:fs";import{delimiter as vo,dirname as xp,isAbsolute as Sp,join as Cp}from"node:path";import{spawnSync as vp}from"node:child_process";var Y=(e,t,r)=>{let n=vp(e,t,{cwd:r?.cwd,encoding:"utf8",env:r?.env,stdio:r?.streamOutput?"inherit":"pipe",timeout:r?.timeout??12e4});return{ok:n.status===0,stdout:n.stdout?.trim()??"",stderr:n.stderr?.trim()??"",error:n.error instanceof Error?n.error.message:void 0}},K=(e,t)=>e.stdout||e.stderr||e.error||t,X=(e,t=["--version"])=>Y(e,t).ok,Pp=e=>{let t=process.env.PATH??"";t.split(vo).filter(Boolean).includes(e)||(process.env.PATH=t?`${e}${vo}${t}`:e)},Po=e=>{if(!wp(e))return!1;try{return yp(e,kp.X_OK),!0}catch{return!1}},$i=e=>{let t=(process.env.PATHEXT??".COM;.EXE;.BAT;.CMD").split(";").map(r=>r.trim().toLowerCase()).filter(Boolean);if(t.some(r=>e.toLowerCase().endsWith(r)))return Po(e)?e:null;for(let r of t){let n=`${e}${r}`;if(Po(n))return n}return null},Ui=e=>process.platform==="win32"?$i(e):Po(e)?e:null,se=e=>{if(e.includes("/")||e.includes("\\")||Sp(e))return Ui(e);for(let t of(process.env.PATH??"").split(vo).filter(Boolean)){let r=Cp(t,e),n=process.platform==="win32"?$i(r):Ui(r);if(n)return Pp(xp(n)),n}return null},Ip=(e,t,r)=>typeof process.getuid=="function"&&process.getuid()===0?{command:e,args:t}:X("sudo")?r?.interactiveAuth?{command:"sudo",args:[e,...t]}:X("sudo",["-n","true"])?{command:"sudo",args:["-n",e,...t]}:null:null,We=(e,t,r,n)=>{let o=Ip(e,t,n);return o?Y(o.command,o.args,{streamOutput:n?.streamOutput,timeout:r}):{ok:!1,stdout:"",stderr:"",error:n?.interactiveAuth?"\u7F3A\u5C11 sudo \u80FD\u529B\uFF0C\u65E0\u6CD5\u81EA\u52A8\u5B89\u88C5\u3002":"\u7F3A\u5C11 root \u6216\u514D\u5BC6 sudo \u6743\u9650\uFF0C\u65E0\u6CD5\u81EA\u52A8\u5B89\u88C5\u3002"}};var Ep="openai",Io="OPENAI_API_KEY",Li=1e4,tn=e=>!!e&&typeof e=="object"&&!Array.isArray(e),ge=e=>typeof e=="string"?e.trim():"",qi=e=>e.replace(/\\/g,"\\\\").replace(/"/g,'\\"'),Hi=e=>e.split(".").map(t=>t.trim().replace(/^"(.*)"$/,"$1")).join("."),at=e=>{let t=e?.trim()||"";if(!t)return{};try{let r=JSON.parse(t);if(!tn(r))return{};let n=Object.entries(r).reduce((s,[i,a])=>(typeof a=="string"&&a.trim()&&(s[i]=a.trim()),s),{}),o=ge(r.access_token)||ge(r.accessToken);return o&&!n.CODEX_ACCESS_TOKEN&&(n.CODEX_ACCESS_TOKEN=o),n}catch{return{}}},rn=e=>{let t=e?.trim()||"";if(!t)return!1;try{let r=JSON.parse(t);return!tn(r)||!!!(ge(r.access_token)||ge(r.accessToken))?!1:!Object.keys(r).some(s=>/^[A-Z0-9_]+$/.test(s.trim()))}catch{return!1}},It=(e,t)=>{let r=t?.trim();if(!e.trim()||!r)return{content:e,changed:!1};let n=`model_providers.${r}`,o=[],s="",i=!1,a=!1,c=!1,l=()=>{i&&(a||(o.push(`name = "${qi(r)}"`),c=!0),i=!1,a=!1)};for(let d of e.split(/\r?\n/)){let p=d.trim(),u=p.match(/^\[([^\]]+)\]$/);if(u){l(),s=Hi(u[1]??""),i=s===n,o.push(d);continue}i&&p.match(/^([A-Za-z0-9_.-]+)\s*=/)?.[1]==="name"&&(a=!0),o.push(d)}return l(),{content:c?o.join(`
6
+ `):e,changed:c}},Et=(e,t,r)=>{let n=t?.trim(),o=r?.trim();if(!e.trim()||!n||!o)return{content:e,changed:!1};let s=`model_providers.${n}`,i=[],a="",c=!1,l=!1,d=!1,p=()=>{c&&(l||(i.push(`env_key = "${qi(o)}"`),d=!0),c=!1,l=!1)};for(let u of e.split(/\r?\n/)){let m=u.trim(),f=m.match(/^\[([^\]]+)\]$/);if(f){p(),a=Hi(f[1]??""),c=a===s,i.push(u);continue}c&&m.match(/^([A-Za-z0-9_.-]+)\s*=/)?.[1]==="env_key"&&(l=!0),i.push(u)}return p(),{content:d?i.join(`
7
+ `):e,changed:d}},bp=e=>e.match(/^[A-Za-z0-9_.-]+\s*=\s*["']([^"']+)["']/)?.[1]?.trim()||"",Tp=e=>{let t=e.indexOf("/");return t<0?"":e.slice(0,t).trim()},Rp=e=>{if(!e)return"";try{let r=new URL(e).hostname.toLowerCase().split(".").filter(Boolean),n=new Set(["api","www","cn","com","net","org","io","ai"]);return r.find(o=>!n.has(o))||""}catch{return""}},Ap=e=>{let t=e??T();return{authContent:Yr()||t.codexAuthContent,configContent:Xr()||t.codexConfigContent,fallbackDefaultModel:t.agentSettings?.Codex?.defaultModel?.trim()||""}},le=e=>{let t=(e.configContent?.trim()||"").split(/\r?\n/),r=at(e.authContent),n=e.env??process.env,o="",s="",i="",a="",c="",l="";for(let m of t){let f=m.trim();if(!f||f.startsWith("#"))continue;let S=f.match(/^\[([^\]]+)\]$/);if(S){o=S[1]?.trim()||"";continue}let g=f.match(/^([A-Za-z0-9_.-]+)\s*=\s*["'][^"']+["']/)?.[1]?.trim()||"",I=bp(f);if(!(!g||!I)){if(!o){g==="model"?s=I:g==="model_provider"?i=I:(g==="base_url"||g==="openai_base_url")&&(a=I);continue}o===`model_providers.${i}`&&(g==="base_url"?c=I:g==="env_key"&&(l=I))}}let d=i||Tp(s)||Rp(c||a)||Ep,p=l||Io;return{apiToken:ge(r[p])||ge(n[p])||ge(r[Io])||ge(n[Io])||ge(r.CODEX_ACCESS_TOKEN)||ge(n.CODEX_ACCESS_TOKEN),baseUrl:c||a||ge(n.OPENAI_BASE_URL),providerId:d,configuredModel:s,envKey:p}},Mp=e=>{let t=e.trim().replace(/\/+$/g,"");return t?t.endsWith("/models")?t:`${t}/models`:""},ji=(e,t,r)=>({id:go(e,t),label:`${e}/${t}`,providerId:e,modelId:t,isDefault:t===r}),Fi=(e,t)=>{let r=new Set;return(t?.trim()?[t.trim(),...e]:e).filter(o=>{let s=o.trim();return!s||r.has(s)?!1:(r.add(s),!0)})},Op=e=>!tn(e)||!Array.isArray(e.data)?[]:e.data.map(t=>tn(t)?ge(t.id):"").filter(Boolean),_p=async(e,t={})=>{let r=le({authContent:e.authContent,configContent:e.configContent}),n=r.configuredModel||e.fallbackDefaultModel?.trim()||void 0,o=Fi(n?[n]:[],n).map(l=>ji(r.providerId,l,n));if(!e.configContent?.trim())return{models:o,defaultModel:n,message:"worker \u672A\u914D\u7F6E Codex \u6A21\u578B\u3002"};let s=Mp(r.baseUrl),i=r.apiToken;if(!s||!i)return{models:o,defaultModel:n,message:o.length>0?"Codex provider \u672A\u58F0\u660E\u53EF\u8BFB\u53D6\u7684\u6A21\u578B\u5217\u8868\uFF0C\u5DF2\u56DE\u9000\u4E3A\u5F53\u524D\u9ED8\u8BA4\u6A21\u578B\u3002":"Codex provider \u7F3A\u5C11 Base URL \u6216 API Key\uFF0C\u65E0\u6CD5\u8BFB\u53D6\u6A21\u578B\u5217\u8868\u3002"};let a=new AbortController,c=setTimeout(()=>a.abort(),Li);try{let l=await(t.fetchImpl??fetch)(s,{headers:{Authorization:`Bearer ${i}`},method:"GET",signal:a.signal});if(!l.ok)throw new Error(`HTTP ${l.status}`);let d=await l.json().catch(()=>null),u=Fi(Op(d),n).map(m=>ji(r.providerId,m,n));return{models:u.length>0?u:o,defaultModel:n,message:u.length>0?"\u5DF2\u4ECE Codex provider \u8BFB\u53D6\u6A21\u578B\u5217\u8868\u3002":"Codex provider \u672A\u8FD4\u56DE\u6A21\u578B\u5217\u8868\uFF0C\u5DF2\u56DE\u9000\u4E3A\u5F53\u524D\u9ED8\u8BA4\u6A21\u578B\u3002"}}catch(l){let d=l instanceof Error&&l.name==="AbortError"?`\u8BFB\u53D6 Codex provider \u6A21\u578B\u8D85\u65F6\uFF08>${Li}ms\uFF09\u3002`:l instanceof Error?l.message:"\u8BFB\u53D6 Codex provider \u6A21\u578B\u5931\u8D25\u3002";return{models:o,defaultModel:n,message:o.length>0?`\u8BFB\u53D6 Codex provider \u6A21\u578B\u5931\u8D25\uFF0C\u5DF2\u56DE\u9000\u4E3A\u5F53\u524D\u9ED8\u8BA4\u6A21\u578B\uFF1A${d}`:`\u8BFB\u53D6 Codex provider \u6A21\u578B\u5931\u8D25\uFF1A${d}`}}finally{clearTimeout(c)}},Gi=async e=>{let t=Ap(e);return _p(t)};var lr=900*1e3,Vi=15e3,Up=()=>process.env.CLAUDE_HOME?.trim()||cr.join(Ki.homedir(),".claude"),fe=(e,t)=>{console.log("[worker-codex-bootstrap]",e,JSON.stringify(t))},$p=()=>{let e=T(),t=at(e.codexAuthContent),r=Object.keys(t).sort(),n=e.codexConfigContent?.trim()||"",o=le({configContent:n,authContent:e.codexAuthContent}),s=It(n,o.providerId),i=Et(s.content,o.providerId,o.envKey),a=rn(e.codexAuthContent);if(r.length===0)return fe("auth-probe:env-skipped",{providerId:o.providerId,providerEnvKey:o.envKey,configPresent:!!n,providerNameAdded:s.changed,providerEnvKeyAdded:i.changed,managedCredentialEnvKeys:r,usingLegacyAuthJson:a,reason:"no-managed-credential-env"}),null;let c=Wp(cr.join(Ki.tmpdir(),"vibemux-codex-auth-"));i.content&&zi(cr.join(c,"config.toml"),`${i.content}
8
+ `,"utf8"),a&&zi(cr.join(c,"auth.json"),`${e.codexAuthContent?.trim()||""}
9
+ `,"utf8");let l={providerId:o.providerId,providerEnvKey:o.envKey,configPresent:!!n,providerNameAdded:s.changed,providerEnvKeyAdded:i.changed,managedCredentialEnvKeys:r,usingLegacyAuthJson:a};return fe("auth-probe:env-created",{...l,runtimeRoot:c}),{env:{...process.env,CODEX_HOME:c,...t},metadata:l,cleanup:()=>{Dp(c,{recursive:!0,force:!0})}}},Lp=e=>e==="codex-cli"?"Codex CLI":e==="codex-auth"?"Codex \u767B\u5F55":e==="claude-cli"?"Claude Code CLI":e==="claude-auth"?"Claude Code \u8BA4\u8BC1":e,nn=(e,t,r)=>({id:e,label:Lp(e),ok:r.ok,changed:r.changed,detail:r.detail,skipped:r.skipped,installer:t?.installer,commandSummary:t?.commandSummary}),Ji=(e,t,r,n,o,s)=>{let i={installer:r,commandSummary:t},a=Y("npm",["install","-g",e],{streamOutput:s?.streamOutput,timeout:lr});return!a.ok&&process.platform!=="win32"&&(a=We("npm",["install","-g",e],lr,s)),nn(n,i,{ok:a.ok,changed:a.ok,detail:K(a,o)})},Xi=()=>X("npm")?{installer:"npm",commandSummary:"npm install -g @openai/codex",manualHint:"\u8BF7\u5148\u5B89\u88C5 Node.js/npm\uFF0C\u7136\u540E\u6267\u884C `npm install -g @openai/codex`\u3002",run(e){return Ji("@openai/codex","npm install -g @openai/codex","npm","codex-cli","\u5B89\u88C5 Codex CLI \u5931\u8D25",e)}}:null,Yi=()=>process.platform==="darwin"&&X("brew")?{installer:"brew",commandSummary:"brew install --cask claude-code",manualHint:"\u8BF7\u5148\u6267\u884C `brew install --cask claude-code`\uFF0C\u7136\u540E\u8FD0\u884C `claude` \u5B8C\u6210\u767B\u5F55\u3002",run(e){let t={installer:"brew",commandSummary:"brew install --cask claude-code"},r=Y("brew",["install","--cask","claude-code"],{streamOutput:e?.streamOutput,timeout:lr});return nn("claude-cli",t,{ok:r.ok,changed:r.ok,detail:K(r,"\u5B89\u88C5 Claude Code CLI \u5931\u8D25")})}}:process.platform==="win32"&&X("winget")?{installer:"winget",commandSummary:"winget install Anthropic.ClaudeCode",manualHint:"\u8BF7\u5148\u6267\u884C `winget install Anthropic.ClaudeCode`\uFF0C\u7136\u540E\u8FD0\u884C `claude` \u5B8C\u6210\u767B\u5F55\u3002",run(e){let t={installer:"winget",commandSummary:"winget install Anthropic.ClaudeCode"},r=Y("winget",["install","--id","Anthropic.ClaudeCode","--exact","--source","winget","--accept-package-agreements","--accept-source-agreements"],{streamOutput:e?.streamOutput,timeout:lr});return nn("claude-cli",t,{ok:r.ok,changed:r.ok,detail:K(r,"\u5B89\u88C5 Claude Code CLI \u5931\u8D25")})}}:X("npm")?{installer:"npm",commandSummary:"npm install -g @anthropic-ai/claude-code",manualHint:"\u8BF7\u5148\u5B89\u88C5 Node.js/npm\uFF0C\u7136\u540E\u6267\u884C `npm install -g @anthropic-ai/claude-code`\u3002",run(e){return Ji("@anthropic-ai/claude-code","npm install -g @anthropic-ai/claude-code","npm","claude-cli","\u5B89\u88C5 Claude Code CLI \u5931\u8D25",e)}}:process.platform!=="win32"&&X("bash")&&X("curl")?{installer:"install.sh",commandSummary:"curl -fsSL https://claude.ai/install.sh | bash",manualHint:"\u8BF7\u6267\u884C `curl -fsSL https://claude.ai/install.sh | bash`\uFF0C\u7136\u540E\u8FD0\u884C `claude` \u5B8C\u6210\u767B\u5F55\u3002",run(e){let t={installer:"install.sh",commandSummary:"curl -fsSL https://claude.ai/install.sh | bash"},r=Y("bash",["-lc","curl -fsSL https://claude.ai/install.sh | bash"],{streamOutput:e?.streamOutput,timeout:lr});return nn("claude-cli",t,{ok:r.ok,changed:r.ok,detail:K(r,"\u5B89\u88C5 Claude Code CLI \u5931\u8D25")})}}:null,jp=()=>{let e=se("codex"),t=e?Y(e,["--version"]):null,r=Xi();return{id:"codex-cli",label:"Codex CLI",ok:!!(e&&t?.ok),detail:e&&t?.ok?t.stdout||e:"\u672A\u68C0\u6D4B\u5230 `codex` \u53EF\u6267\u884C\u6587\u4EF6\u3002",autoInstallable:!!r,installer:r?.installer,installCommand:r?.commandSummary,hint:r?.manualHint||"\u8BF7\u5148\u5B89\u88C5 Codex CLI\uFF0C\u5E76\u786E\u8BA4 `codex` \u5DF2\u8FDB\u5165 PATH\u3002"}},Fp=async()=>{let e=se("codex");if(!e)return{id:"codex-auth",label:"Codex \u767B\u5F55",ok:!1,detail:"\u672A\u68C0\u6D4B\u5230 `codex`\uFF0C\u6682\u65F6\u65E0\u6CD5\u68C0\u67E5\u767B\u5F55\u72B6\u6001\u3002",autoInstallable:!1,hint:"\u8BF7\u5148\u5B89\u88C5 Codex CLI\uFF0C\u518D\u8FD0\u884C `codex` \u5B8C\u6210\u767B\u5F55\u3002"};let t=$p(),r=t?.metadata.managedCredentialEnvKeys??[];fe("auth-probe:start",{executable:e,usingManagedProbeEnvironment:!!t,providerId:t?.metadata.providerId||"",providerEnvKey:t?.metadata.providerEnvKey||"",configPresent:t?.metadata.configPresent??!1,providerNameAdded:t?.metadata.providerNameAdded??!1,providerEnvKeyAdded:t?.metadata.providerEnvKeyAdded??!1,managedCredentialEnvKeys:r,usingLegacyAuthJson:t?.metadata.usingLegacyAuthJson??!1});let n=await(async()=>{try{return await new Promise(o=>{let s=Np(e,["app-server"],{env:t?.env??process.env,stdio:["pipe","pipe","pipe"]}),i="",a="",c=!1,l=0,d=-1,p=-1,u=g=>{c||(c=!0,clearTimeout(f),s.killed||s.kill("SIGTERM"),o(g))},m=g=>{s.stdin.write(`${JSON.stringify(g)}
10
+ `)},f=setTimeout(()=>{fe("auth-probe:timeout",{providerId:t?.metadata.providerId||"",managedCredentialEnvKeys:r}),u({ok:!1,detail:"Codex \u767B\u5F55\u72B6\u6001\u68C0\u67E5\u8D85\u65F6\u3002"})},Vi),S=()=>{l+=1,p=l,m({jsonrpc:"2.0",id:l,method:"account/read",params:{refreshToken:!1}})},w=g=>{let I=g.trim();if(I)try{let v=JSON.parse(I);if(v.error?.message){fe("auth-probe:rpc-error",{requestId:v.id??null,message:v.error.message}),u({ok:!1,detail:v.error.message});return}if(!v.result||typeof v.id>"u")return;if(v.id===d){fe("auth-probe:initialized",{providerId:t?.metadata.providerId||""}),m({jsonrpc:"2.0",method:"initialized"}),S();return}if(v.id!==p)return;let E=!!v.result.account,F=!!v.result.requiresOpenaiAuth;if(fe("auth-probe:account-result",{providerId:t?.metadata.providerId||"",hasAccount:E,requiresOpenaiAuth:F,managedCredentialEnvKeys:r}),F&&!E){if(r.length>0){fe("auth-probe:decision",{ok:!0,reason:"managed-provider-credentials-present",providerId:t?.metadata.providerId||"",managedCredentialEnvKeys:r}),u({ok:!0,detail:"Codex \u5DF2\u68C0\u6D4B\u5230\u8FD0\u884C\u65F6 provider \u51ED\u8BC1\u3002"});return}fe("auth-probe:decision",{ok:!1,reason:"openai-auth-required-without-account",providerId:t?.metadata.providerId||""}),u({ok:!1,detail:"Codex \u672A\u767B\u5F55\uFF0C\u8BF7\u5148\u8FD0\u884C `codex` \u5B8C\u6210\u8BA4\u8BC1\u3002"});return}fe("auth-probe:decision",{ok:!0,reason:E?"account-present":"provider-auth-not-required",providerId:t?.metadata.providerId||"",managedCredentialEnvKeys:r}),u({ok:!0,detail:"Codex \u767B\u5F55\u72B6\u6001\u6B63\u5E38\u3002"})}catch{return}};s.stdout.on("data",g=>{i+=g.toString();let I=i.split(`
11
+ `);i=I.pop()??"";for(let v of I)w(v)}),s.stderr.on("data",g=>{a+=g.toString()}),s.on("error",g=>{fe("auth-probe:process-error",{error:g instanceof Error?g.message:"Codex \u767B\u5F55\u68C0\u67E5\u5931\u8D25\u3002"}),u({ok:!1,detail:g instanceof Error?g.message:"Codex \u767B\u5F55\u68C0\u67E5\u5931\u8D25\u3002"})}),s.on("close",()=>{if(c)return;let g=a.trim().split(`
12
+ `).filter(Boolean).at(-1)||"Codex \u767B\u5F55\u68C0\u67E5\u5931\u8D25\u3002";fe("auth-probe:process-close",{detail:g}),u({ok:!1,detail:g})}),l+=1,d=l,m({jsonrpc:"2.0",id:d,method:"initialize",params:{clientInfo:{name:"vibemux-worker",version:"0.1.1"},capabilities:{experimentalApi:!0}}})})}finally{t?.cleanup()}})();return{id:"codex-auth",label:"Codex \u767B\u5F55",ok:n.ok,detail:n.detail,autoInstallable:!1,hint:n.ok?void 0:"\u8BF7\u5148\u8FD0\u884C `codex`\uFF0C\u6309\u63D0\u793A\u5B8C\u6210\u767B\u5F55\u540E\u518D\u91CD\u8BD5\u3002"}},qp=()=>{let e=se("claude"),t=e?Y(e,["--version"]):null,r=Yi();return{id:"claude-cli",label:"Claude Code CLI",ok:!!(e&&t?.ok),detail:e&&t?.ok?t.stdout||e:"\u672A\u68C0\u6D4B\u5230 `claude` \u53EF\u6267\u884C\u6587\u4EF6\u3002",autoInstallable:!!r,installer:r?.installer,installCommand:r?.commandSummary,hint:r?.manualHint||"\u8BF7\u5148\u5B89\u88C5 Claude Code CLI\uFF0C\u5E76\u786E\u8BA4 `claude` \u5DF2\u8FDB\u5165 PATH\u3002"}},Hp=e=>{let t=e.trim();if(!t)return!1;try{let r=JSON.parse(t),n=r.env&&typeof r.env=="object"?r.env:void 0;return!!((typeof n?.ANTHROPIC_AUTH_TOKEN=="string"?n.ANTHROPIC_AUTH_TOKEN.trim():typeof n?.ANTHROPIC_API_KEY=="string"?n.ANTHROPIC_API_KEY.trim():"")||typeof r.apiKeyHelper=="string"&&r.apiKeyHelper.trim())}catch{return!1}},Gp=()=>{if(process.env.ANTHROPIC_API_KEY?.trim()||process.env.ANTHROPIC_AUTH_TOKEN?.trim()||Bp(cr.join(Up(),".credentials.json")))return!0;try{return Hp(T().claudeCodeConfigContent??"")}catch{return!1}},zp=()=>{let e=se("claude");if(!e)return{id:"claude-auth",label:"Claude Code \u8BA4\u8BC1",ok:!1,detail:"\u672A\u68C0\u6D4B\u5230 `claude`\uFF0C\u6682\u65F6\u65E0\u6CD5\u68C0\u67E5\u8BA4\u8BC1\u72B6\u6001\u3002",autoInstallable:!1,hint:"\u8BF7\u5148\u5B89\u88C5 Claude Code CLI\uFF0C\u518D\u914D\u7F6E API \u51ED\u8BC1\u6216\u8FD0\u884C `claude` \u5B8C\u6210\u767B\u5F55\u3002"};if(Gp())return{id:"claude-auth",label:"Claude Code \u8BA4\u8BC1",ok:!0,detail:"\u68C0\u6D4B\u5230 Claude Code API / \u51ED\u8BC1\u914D\u7F6E\u3002",autoInstallable:!1};let t=Y(e,["doctor"],{timeout:Vi});return{id:"claude-auth",label:"Claude Code \u8BA4\u8BC1",ok:t.ok,detail:t.ok?t.stdout||"Claude Code doctor \u68C0\u67E5\u901A\u8FC7\u3002":K(t,"Claude Code doctor \u68C0\u67E5\u5931\u8D25\u3002"),autoInstallable:!1,hint:t.ok?void 0:"\u8BF7\u5148\u914D\u7F6E Claude Console / API \u51ED\u8BC1\uFF0C\u6216\u8FD0\u884C `claude` \u5B8C\u6210\u767B\u5F55\u540E\u518D\u91CD\u8BD5\u3002"}},Qi=async e=>e==="codex-cli"?jp():e==="codex-auth"?Fp():e==="claude-cli"?qp():e==="claude-auth"?zp():null,Zi=e=>e==="codex-cli"?Xi():e==="claude-cli"?Yi():null;var he=900*1e3,De=ce(),Vp=e=>{let t=process.env.PATH??"";t.split(dr.delimiter).filter(Boolean).includes(e)||(process.env.PATH=t?`${e}${dr.delimiter}${t}`:e)},To=()=>{if(process.platform!=="win32")return null;let e=[process.env.ProgramFiles,process.env.ProgramW6432,process.env.LocalAppData].filter(r=>!!r),t=[["Git","cmd","git.exe"],["Git","bin","git.exe"],["Programs","Git","cmd","git.exe"],["Programs","Git","bin","git.exe"]];for(let r of e)for(let n of t){let o=dr.join(r,...n);if(sn(o))return Vp(dr.dirname(o)),o}return null},ra=e=>e==="git"?"Git":e==="opencode"?"OpenCode runtime":e==="pi-runtime"?"Pi runtime":e==="codex-cli"?"Codex CLI":e==="codex-auth"?"Codex \u767B\u5F55":e==="claude-cli"?"Claude Code CLI":"Claude Code \u767B\u5F55",de=(e,t,r)=>({id:e,label:ra(e),ok:r.ok,changed:r.changed,detail:r.detail,skipped:r.skipped,installer:t?.installer,commandSummary:t?.commandSummary});var na=()=>{if(process.platform==="win32")return X("winget")?{installer:"winget",commandSummary:"winget install --id Git.Git --exact --source winget",manualHint:"\u8BF7\u5148\u5B89\u88C5 Git \u5E76\u786E\u8BA4\u5B83\u5728 PATH \u4E2D\u53EF\u6267\u884C\uFF1BWindows \u53EF\u4F18\u5148\u4F7F\u7528 winget \u5B89\u88C5\u3002",run(e){let t={installer:"winget",commandSummary:"winget install --id Git.Git --exact --source winget"},r=Y("winget",["install","--id","Git.Git","--exact","--source","winget","--accept-package-agreements","--accept-source-agreements"],{streamOutput:e?.streamOutput,timeout:he});return r.ok&&To(),de("git",t,{ok:r.ok,changed:r.ok,detail:K(r,"winget install Git.Git \u5931\u8D25")})}}:X("choco")?{installer:"choco",commandSummary:"choco install git -y",manualHint:"\u8BF7\u5148\u5B89\u88C5 Git \u5E76\u786E\u8BA4\u5B83\u5728 PATH \u4E2D\u53EF\u6267\u884C\uFF1BWindows \u53EF\u4F7F\u7528 choco \u5B89\u88C5\u3002",run(e){let t={installer:"choco",commandSummary:"choco install git -y"},r=Y("choco",["install","git","-y"],{streamOutput:e?.streamOutput,timeout:he});return r.ok&&To(),de("git",t,{ok:r.ok,changed:r.ok,detail:K(r,"choco install git \u5931\u8D25")})}}:null;if(process.platform==="darwin")return X("brew")?{installer:"brew",commandSummary:"brew install git",manualHint:"\u8BF7\u5148\u5B89\u88C5 Git \u5E76\u786E\u8BA4\u5B83\u5728 PATH \u4E2D\u53EF\u6267\u884C\uFF1BmacOS \u53EF\u6267\u884C `brew install git`\u3002",run(e){let t={installer:"brew",commandSummary:"brew install git"},r=Y("brew",["install","git"],{streamOutput:e?.streamOutput,timeout:he});return de("git",t,{ok:r.ok,changed:r.ok,detail:K(r,"brew install git \u5931\u8D25")})}}:null;if(process.platform==="linux"){if(X("apt-get"))return{installer:"apt-get",commandSummary:"sudo apt-get update && sudo apt-get install -y git",manualHint:"\u8BF7\u5148\u5B89\u88C5 Git \u5E76\u786E\u8BA4\u5B83\u5728 PATH \u4E2D\u53EF\u6267\u884C\uFF1BDebian/Ubuntu \u53EF\u6267\u884C `sudo apt-get update && sudo apt-get install -y git`\u3002",run(e){let t={installer:"apt-get",commandSummary:"sudo apt-get update && sudo apt-get install -y git"},r=We("apt-get",["update"],he,e);if(!r.ok)return de("git",t,{ok:!1,changed:!1,detail:K(r,"apt-get update \u5931\u8D25")});let n=We("apt-get",["install","-y","git"],he,e);return de("git",t,{ok:n.ok,changed:n.ok,detail:K(n,"apt-get install git \u5931\u8D25")})}};if(X("dnf"))return{installer:"dnf",commandSummary:"sudo dnf install -y git",manualHint:"\u8BF7\u5148\u5B89\u88C5 Git \u5E76\u786E\u8BA4\u5B83\u5728 PATH \u4E2D\u53EF\u6267\u884C\uFF1BFedora \u53EF\u6267\u884C `sudo dnf install -y git`\u3002",run(e){let t={installer:"dnf",commandSummary:"sudo dnf install -y git"},r=We("dnf",["install","-y","git"],he,e);return de("git",t,{ok:r.ok,changed:r.ok,detail:K(r,"dnf install git \u5931\u8D25")})}};if(X("yum"))return{installer:"yum",commandSummary:"sudo yum install -y git",manualHint:"\u8BF7\u5148\u5B89\u88C5 Git \u5E76\u786E\u8BA4\u5B83\u5728 PATH \u4E2D\u53EF\u6267\u884C\uFF1BCentOS/RHEL \u53EF\u6267\u884C `sudo yum install -y git`\u3002",run(e){let t={installer:"yum",commandSummary:"sudo yum install -y git"},r=We("yum",["install","-y","git"],he,e);return de("git",t,{ok:r.ok,changed:r.ok,detail:K(r,"yum install git \u5931\u8D25")})}};if(X("pacman"))return{installer:"pacman",commandSummary:"sudo pacman -Sy --noconfirm git",manualHint:"\u8BF7\u5148\u5B89\u88C5 Git \u5E76\u786E\u8BA4\u5B83\u5728 PATH \u4E2D\u53EF\u6267\u884C\uFF1BArch \u53EF\u6267\u884C `sudo pacman -Sy --noconfirm git`\u3002",run(e){let t={installer:"pacman",commandSummary:"sudo pacman -Sy --noconfirm git"},r=We("pacman",["-Sy","--noconfirm","git"],he,e);return de("git",t,{ok:r.ok,changed:r.ok,detail:K(r,"pacman \u5B89\u88C5 git \u5931\u8D25")})}};if(X("apk"))return{installer:"apk",commandSummary:"sudo apk add git",manualHint:"\u8BF7\u5148\u5B89\u88C5 Git \u5E76\u786E\u8BA4\u5B83\u5728 PATH \u4E2D\u53EF\u6267\u884C\uFF1BAlpine \u53EF\u6267\u884C `sudo apk add git`\u3002",run(e){let t={installer:"apk",commandSummary:"sudo apk add git"},r=We("apk",["add","git"],he,e);return de("git",t,{ok:r.ok,changed:r.ok,detail:K(r,"apk add git \u5931\u8D25")})}}}return null},oa=()=>sn(`${De}/package.json`)?sn(`${De}/pnpm-lock.yaml`)&&X("pnpm")?{installer:"pnpm",commandSummary:"pnpm install --frozen-lockfile",manualHint:"\u8BF7\u5728 worker \u6839\u76EE\u5F55\u6267\u884C `pnpm install --frozen-lockfile`\uFF0C\u786E\u4FDD `@opencode-ai/sdk` \u4E0E `opencode-ai` runtime \u90FD\u5DF2\u5B89\u88C5\u3002",run(e){let t={installer:"pnpm",commandSummary:"pnpm install --frozen-lockfile"},r=Y("pnpm",["install","--frozen-lockfile"],{cwd:De,streamOutput:e?.streamOutput,timeout:he});return de("opencode",t,{ok:r.ok,changed:r.ok,detail:K(r,"pnpm install \u5931\u8D25")})}}:sn(`${De}/package-lock.json`)&&X("npm")?{installer:"npm",commandSummary:"npm ci",manualHint:"\u8BF7\u5728 worker \u6839\u76EE\u5F55\u6267\u884C `npm ci`\uFF0C\u786E\u4FDD `@opencode-ai/sdk` \u4E0E `opencode-ai` runtime \u90FD\u5DF2\u5B89\u88C5\u3002",run(e){let t={installer:"npm",commandSummary:"npm ci"},r=Y("npm",["ci"],{cwd:De,streamOutput:e?.streamOutput,timeout:he});return de("opencode",t,{ok:r.ok,changed:r.ok,detail:K(r,"npm ci \u5931\u8D25")})}}:X("npm")?{installer:"npm",commandSummary:"npm install",manualHint:"\u8BF7\u5728 worker \u6839\u76EE\u5F55\u6267\u884C `npm install`\uFF0C\u786E\u4FDD `@opencode-ai/sdk` \u4E0E `opencode-ai` runtime \u90FD\u5DF2\u5B89\u88C5\u3002",run(e){let t={installer:"npm",commandSummary:"npm install"},r=Y("npm",["install"],{cwd:De,streamOutput:e?.streamOutput,timeout:he});return de("opencode",t,{ok:r.ok,changed:r.ok,detail:K(r,"npm install \u5931\u8D25")})}}:null:null,Jp=e=>e==="git"?na():e==="opencode"?oa():Zi(e),Xp=()=>{To();let e=Y("git",["--version"]),t=na();return{id:"git",label:"Git",ok:e.ok,detail:K(e,"git \u4E0D\u53EF\u7528"),autoInstallable:!!t,installer:t?.installer,installCommand:t?.commandSummary,hint:t?.manualHint||"\u8BF7\u5148\u5B89\u88C5 Git\uFF0C\u5E76\u786E\u8BA4\u5B83\u5728 PATH \u4E2D\u53EF\u6267\u884C\u3002"}},Yp=()=>{let e=Y(process.execPath,["-e",'import("@opencode-ai/sdk").then(() => console.log("ok")).catch((error) => { console.error(error instanceof Error ? error.message : String(error)); process.exit(1) })'],{cwd:De}),t=oa(),r=se(dr.join(De,"node_modules",".bin","opencode")),n=se("opencode")||r,o=n?Y(n,["--version"]):null,s=e.ok?n&&o?.ok?`@opencode-ai/sdk \u5DF2\u5B89\u88C5\uFF1B${o.stdout||n}`:"\u672A\u68C0\u6D4B\u5230\u53EF\u6267\u884C\u7684 OpenCode runtime\uFF08`opencode`\uFF09\u3002":K(e,"OpenCode runtime \u4F9D\u8D56\u4E0D\u53EF\u7528");return{id:"opencode",label:"OpenCode runtime",ok:e.ok&&!!(n&&o?.ok),detail:s,autoInstallable:!!t,installer:t?.installer,installCommand:t?.commandSummary,hint:t?.manualHint||"\u8BF7\u68C0\u67E5 worker \u4F9D\u8D56\u5B89\u88C5\u72B6\u6001\uFF0C\u5E76\u786E\u8BA4 `opencode-ai` \u5DF2\u968F worker \u4F9D\u8D56\u4E00\u8D77\u5B89\u88C5\u3002"}},Qp=()=>{let e=Y(process.execPath,["-e",'import("@mariozechner/pi-coding-agent").then(() => console.log("ok")).catch((error) => { console.error(error instanceof Error ? error.message : String(error)); process.exit(1) })'],{cwd:De});return{id:"pi-runtime",label:"Pi runtime",ok:e.ok,detail:e.ok?"@mariozechner/pi-coding-agent \u5DF2\u5B89\u88C5":K(e,"Pi SDK \u4E0D\u53EF\u7528"),autoInstallable:!1,hint:"\u8BF7\u68C0\u67E5 worker \u4F9D\u8D56\u5B89\u88C5\u72B6\u6001\uFF0C\u5E76\u786E\u8BA4 `@mariozechner/pi-coding-agent` \u53EF\u88AB\u5F53\u524D Node \u8FD0\u884C\u65F6\u52A0\u8F7D\u3002"}},sa=async e=>{if(e==="git")return Xp();if(e==="opencode")return Yp();if(e==="pi-runtime")return Qp();let t=await Qi(e);return t||{id:e,label:ra(e),ok:!1,detail:"\u672A\u77E5\u68C0\u67E5\u9879\u3002",autoInstallable:!1}},Zp=e=>e==="all"?["git","opencode","pi-runtime","codex-cli","codex-auth","claude-cli","claude-auth"]:e==="Pi"?["pi-runtime"]:e==="Codex"?["git","codex-cli","codex-auth"]:e==="ClaudeCode"?["git","claude-cli","claude-auth"]:["git","opencode"],em=e=>e==="Pi"?"Pi \u8FD0\u884C\u73AF\u5883\u5DF2\u5C31\u7EEA\u3002":e==="Codex"?"Git\u3001Codex CLI \u4E0E\u767B\u5F55\u72B6\u6001\u5DF2\u5C31\u7EEA\u3002":e==="ClaudeCode"?"Git\u3001Claude Code CLI \u4E0E\u767B\u5F55\u72B6\u6001\u5DF2\u5C31\u7EEA\u3002":e==="all"?"Git\u3001OpenCode\u3001Pi\u3001Codex\u3001Claude Code \u8FD0\u884C\u73AF\u5883\u5DF2\u5C31\u7EEA\u3002":"Git \u4E0E OpenCode \u8FD0\u884C\u65F6\u5DF2\u5C31\u7EEA\u3002",Ro=(e,t)=>{let r=e.filter(o=>!o.ok),n=r.length===0;return{ok:n,target:t,items:e,missingItems:r,message:n?em(t):`\u8FD0\u884C\u73AF\u5883\u7F3A\u5931\uFF1A${r.map(o=>o.label).join("\u3001")}`}},tm=e=>{let t=e.filter(o=>!o.ok);if(t.length===0)return"\u81EA\u52A8\u51C6\u5907\u5931\u8D25\u3002";let r=`\u81EA\u52A8\u51C6\u5907\u5931\u8D25\uFF1A${t.map(o=>o.label).join("\u3001")}`,n=t.map(o=>`- ${o.label}: ${o.detail}`).join(`
13
13
  `);return n?`${r}
14
- ${n}`:r},po=async(e="base")=>{let t=await Promise.all(Ep(e).map(r=>Ls(r)));return lo(t,e)},Xr=(e,t=[])=>{let r=t.some(i=>i.changed),n=new Map(t.map(i=>[i.id,i.detail])),o=e.items.map(i=>{let s=n.get(i.id);return s?{...i,detail:`${i.detail}\uFF1B\u81EA\u52A8\u51C6\u5907\uFF1A${s}`}:i});return{ok:e.ok,changed:r,target:e.target,attempts:t,items:o,message:e.ok?r?`\u5DF2\u81EA\u52A8\u8865\u9F50${e.target==="base"?" Worker ":""}\u8FD0\u884C\u73AF\u5883\u3002`:e.message:bp(o)}},so=(e,t,r)=>{console.log(`[${e}/${t}] ${r}`)},ao=(e,t)=>{console.log(` ${e} - ${t}`)},uo=async(e,t)=>{if(e.ok)return Xr(e);let r=[],n=e.missingItems.length*2+1,o=1;for(let s of e.missingItems){let a=Sp(s.id),c=a?`\u5B89\u88C5 ${s.label}\uFF08${a.installer}\uFF09`:`\u5B89\u88C5 ${s.label}`;t?.printProgress&&so(o,n,c);let l=a?a.run(t):ce(s.id,null,{ok:!1,changed:!1,skipped:!0,detail:s.hint||`\u5F53\u524D\u73AF\u5883\u65E0\u6CD5\u81EA\u52A8\u5B89\u88C5 ${s.label}\u3002`});r.push(l),t?.printProgress&&ao(l.ok?"\u6210\u529F":l.skipped?"\u8DF3\u8FC7":"\u5931\u8D25",l.detail),o+=1;let d=await Ls(s.id);t?.printProgress&&(so(o,n,`\u6821\u9A8C ${s.label}`),ao(d.ok?"\u6210\u529F":"\u5931\u8D25",d.detail)),o+=1}let i=await po(e.target);return t?.printProgress&&(so(o,n,"\u6700\u7EC8\u590D\u68C0"),ao(i.ok?"\u6210\u529F":"\u5931\u8D25",i.message)),Xr(i,r)},Rp=e=>e.missingItems.map(t=>{let r=t.installCommand?`\uFF1B\u81EA\u52A8\u5B89\u88C5\uFF1A${t.installCommand}`:"";return`- ${t.label}: ${t.detail}${r}`}).join(`
15
- `),Jr=e=>{console.log("[worker] \u53EF\u624B\u52A8\u6267\u884C\u7684\u4FEE\u590D\u5EFA\u8BAE\uFF1A");for(let t of e.missingItems)console.log(`- ${t.label}: ${t.hint||"\u8BF7\u624B\u52A8\u5B89\u88C5\u540E\u91CD\u8BD5\u3002"}`)},js=()=>!!(Ws.isTTY&&Ds.isTTY),Tp=e=>{let t=e?.trim().toLowerCase();return t?["1","true","yes","on"].includes(t)?!0:["0","false","no","off"].includes(t)?!1:null:null},Ap=e=>{let t=e?.interactiveTerminal??js(),r=Tp(e?.autoInstallSetting??process.env.VIBEMUX_WORKER_AUTO_INSTALL);return r===!0?"auto":r===!1?t?"prompt":"block":t?"prompt":"auto"},Mp=e=>{let t=e.trim().toLowerCase();return t==="y"||t==="yes"||t==="\u662F"},xe=async e=>{let t=await po(e?.target??"base");return t.ok||!e?.autoInstall?Xr(t):uo(t,e)},Fs=async(e,t="base")=>{let r=await po(t),n=Xr(r);if(r.ok)return{status:"ready",report:n,message:n.message};console.log(`[worker] \u547D\u4EE4 ${e} \u8FD0\u884C\u524D\u68C0\u6D4B\u5230\u7F3A\u5931\u4F9D\u8D56\uFF1A`),console.log(Rp(r));let o=js(),i=Ap({interactiveTerminal:o});if(i==="auto"){console.log("[worker] \u5C06\u5C1D\u8BD5\u81EA\u52A8\u5B89\u88C5\u7F3A\u5931\u4F9D\u8D56\u3002");let c=await uo(r,{interactiveAuth:o,printProgress:!0,streamOutput:!0});return c.ok?{status:"ready",report:c,message:c.message}:(Jr(lo(c.items,t)),{status:"failed",report:c,message:c.message})}if(!o||i==="block"){let c="\u5F53\u524D\u7EC8\u7AEF\u4E0D\u53EF\u4EA4\u4E92\uFF0C\u65E0\u6CD5\u786E\u8BA4\u662F\u5426\u81EA\u52A8\u5B89\u88C5\u7F3A\u5931\u4F9D\u8D56\u3002";return console.error(`[worker] ${c}`),Jr(r),{status:"non_interactive_blocked",report:n,message:c}}let s=wp({input:Ws,output:Ds});try{let c=await s.question("\u662F\u5426\u73B0\u5728\u81EA\u52A8\u5B89\u88C5\u7F3A\u5931\u4F9D\u8D56\uFF1F[y/N] ");if(!Mp(c)){let l="\u7528\u6237\u62D2\u7EDD\u81EA\u52A8\u5B89\u88C5\uFF0CWorker \u5DF2\u9000\u51FA\u3002";return console.error(`[worker] ${l}`),Jr(r),{status:"declined",report:n,message:l}}}finally{s.close()}let a=await uo(r,{interactiveAuth:!0,printProgress:!0,streamOutput:!0});return a.ok?{status:"ready",report:a,message:a.message}:(Jr(lo(a.items,t)),{status:"failed",report:a,message:a.message})};var Yr={daemonMode:"idle",paired:!1,connected:!1,runningTaskIds:[],queuedTaskIds:[]},tr=()=>({...Yr,runningTaskIds:[...Yr.runningTaskIds],queuedTaskIds:[...Yr.queuedTaskIds]}),mo=e=>({...e,executorToken:e.executorToken?.trim()?"[redacted]":void 0,opencodeConfigContent:e.opencodeConfigContent?.trim()?"[redacted]":"",codexConfigContent:e.codexConfigContent?.trim()?"[redacted]":"",codexAuthContent:e.codexAuthContent?.trim()?"[redacted]":"",claudeCodeConfigContent:e.claudeCodeConfigContent?.trim()?"[redacted]":"",mcpServers:e.mcpServers?.map(t=>({...t,target:t.target?.trim()?"[redacted]":t.target}))}),Ct=()=>{let e=tr();return{...e,config:e.config?mo(e.config):void 0}},F=e=>{Object.assign(Yr,e)};import{mkdtemp as Op,readFile as _p,rm as Bp}from"node:fs/promises";import Wp from"node:os";import Qr from"node:path";var qs=async e=>Ze({url:`${Oe(e.cloudUrl)}/api/control-plane/executors/observations`,method:"POST",headers:{Authorization:`Bearer ${e.executorToken}`},body:{taskId:e.taskId,workspaceId:e.workspaceId,workspaceSessionId:e.workspaceSessionId,kind:e.kind,level:e.level,title:e.title,detail:e.detail,url:e.url,attachments:e.attachments,metadata:e.metadata},errorMessage:"Executor observation upload failed."}),Gs=async e=>Ze({url:`${Oe(e.cloudUrl)}/api/control-plane/executors/images`,method:"POST",headers:{Authorization:`Bearer ${e.executorToken}`},body:{taskId:e.taskId,filename:e.filename,image:e.image},errorMessage:"Executor image upload failed."});var Hs=12,zs=12,Ks=1500,Js=e=>{let t=e?.trim();if(t)return t.length>Ks?`${t.slice(0,Ks)}\u2026`:t},Dp=e=>{if(e!==void 0)try{return Js(JSON.stringify(e,null,2))}catch{return}},Np=(e,t)=>`data:${t};base64,${e.toString("base64")}`,Zr=async e=>{let{chromium:t}=await import("playwright"),r=null,n=null,o="",i,s=0,a=0,c="playwright",l=0,d=0,m=async p=>{let f=p.level??"info";(f==="error"||f==="warning")&&(a+=1),s+=1,await qs({cloudUrl:e.cloudUrl,executorToken:e.executorToken,taskId:e.taskId,workspaceId:e.workspaceId,workspaceSessionId:e.workspaceSessionId,kind:p.kind,level:f,title:p.title,detail:Js(p.detail),url:p.url,attachments:p.attachments,metadata:p.metadata}).catch(()=>{})},u=async(p,f)=>{let x=Qr.join(o,`${Date.now()}-${f}.png`);await p.screenshot({path:x,fullPage:!0});let k=await _p(x),g=await Gs({cloudUrl:e.cloudUrl,executorToken:e.executorToken,taskId:e.taskId,filename:Qr.basename(x),image:Np(k,"image/png")});i=g.url,await m({kind:"screenshot",level:"info",title:`\u9875\u9762\u622A\u56FE \xB7 ${f}`,detail:`\u5F53\u524D\u9875\u9762: ${p.url()}`,url:g.url,attachments:[{id:g.id,url:g.url,filename:Qr.basename(x),contentType:"image/png"}],metadata:{label:f}})};try{o=await Op(Qr.join(Wp.tmpdir(),"vibemux-browser-run-")),r=await t.launch({headless:!0}),n=await r.newContext({ignoreHTTPSErrors:!0,viewport:{width:1440,height:960}});let p=await n.newPage();if(p.on("console",g=>{let R=g.type();if(R==="error"||R==="warning"){if(l>=Hs)return;l+=1,m({kind:"browser-console",level:R==="error"?"error":"warning",title:`Console ${R}`,detail:[g.text(),Dp(g.location())].filter(Boolean).join(`
16
- `),url:p.url()||e.appUrl,metadata:{type:R,location:g.location()}})}}),p.on("pageerror",g=>{l>=Hs||(l+=1,m({kind:"browser-console",level:"error",title:"\u9875\u9762\u811A\u672C\u5F02\u5E38",detail:g.message,url:p.url()||e.appUrl}))}),p.on("requestfailed",g=>{d>=zs||(d+=1,m({kind:"network",level:"error",title:`\u8BF7\u6C42\u5931\u8D25 \xB7 ${g.method()} ${g.resourceType()}`,detail:[g.url(),g.failure()?.errorText].filter(Boolean).join(`
17
- `),url:g.url(),metadata:{method:g.method(),resourceType:g.resourceType(),failure:g.failure()}}))}),p.on("response",g=>{g.ok()||d>=zs||(d+=1,m({kind:"network",level:g.status()>=500?"error":"warning",title:`\u54CD\u5E94\u5F02\u5E38 \xB7 ${g.status()} ${g.request().method()}`,detail:[g.url(),g.statusText()].filter(Boolean).join(`
18
- `),url:g.url(),metadata:{method:g.request().method(),status:g.status(),statusText:g.statusText()}}))}),await m({kind:"action",level:"info",title:"\u5F00\u59CB\u6D4F\u89C8\u5668\u5DE1\u68C0",detail:["\u6A21\u5F0F: Playwright",`\u5DE5\u4F5C\u76EE\u5F55: ${e.cwd}`,`\u76EE\u6807\u5730\u5740: ${e.appUrl}`,e.goal?.trim()?`\u6D4B\u8BD5\u76EE\u6807: ${e.goal.trim()}`:""].filter(Boolean).join(`
19
- `),url:e.appUrl}),e.healthUrl?.trim()){let g=await fetch(e.healthUrl,{redirect:"follow"}).catch(R=>({ok:!1,status:0,statusText:R instanceof Error?R.message:"health request failed"}));await m({kind:"network",level:g.ok?"success":"warning",title:g.ok?"\u5065\u5EB7\u68C0\u67E5\u901A\u8FC7":"\u5065\u5EB7\u68C0\u67E5\u5F02\u5E38",detail:`${e.healthUrl}
20
- ${g.status} ${g.statusText}`,url:e.healthUrl,metadata:{status:g.status,statusText:g.statusText}})}let f=await p.goto(e.appUrl,{waitUntil:"domcontentloaded",timeout:3e4});await p.waitForLoadState("networkidle",{timeout:1e4}).catch(()=>{}),await m({kind:"action",level:f?.ok()?"success":"warning",title:f?.ok()?"\u9875\u9762\u5DF2\u6253\u5F00":"\u9875\u9762\u6253\u5F00\u5B8C\u6210\uFF0C\u4F46\u8FD4\u56DE\u72B6\u6001\u5F02\u5E38",detail:[`\u6700\u7EC8\u5730\u5740: ${p.url()}`,f?`HTTP ${f.status()} ${f.statusText()}`:"\u672A\u83B7\u5F97\u9996\u4E2A\u5BFC\u822A\u54CD\u5E94"].join(`
21
- `),url:p.url()}),await u(p,"initial");let x=e.goal?.trim();x&&await m({kind:"action",level:"info",title:"\u5DF2\u8BB0\u5F55\u6D4B\u8BD5\u76EE\u6807",detail:x,url:p.url()});let k=a>0?`\u6D4F\u89C8\u5668\u5DE1\u68C0\u5B8C\u6210\uFF0C\u53D1\u73B0 ${a} \u6761\u5F02\u5E38\u7EBF\u7D22\uFF0C\u5DF2\u56DE\u6D41\u5230\u6D4B\u8BD5\u4F1A\u8BDD\u3002`:"\u6D4F\u89C8\u5668\u5DE1\u68C0\u5B8C\u6210\uFF0C\u672A\u53D1\u73B0\u660E\u663E\u5F02\u5E38\u7EBF\u7D22\u3002";return await m({kind:"action",level:a>0?"warning":"success",title:a>0?"\u6D4F\u89C8\u5668\u5DE1\u68C0\u5B8C\u6210\uFF0C\u53D1\u73B0\u5F02\u5E38\u7EBF\u7D22":"\u6D4F\u89C8\u5668\u5DE1\u68C0\u5B8C\u6210",detail:[k,`\u4F7F\u7528\u6A21\u5F0F: ${c}`,`\u6700\u7EC8\u9875\u9762: ${p.url()}`,`\u89C2\u6D4B\u6570\u91CF: ${s}`].join(`
22
- `),url:p.url(),metadata:{usedMode:c,observationsCount:s,issueCount:a,consoleCount:l,networkCount:d}}),{ok:!0,message:k,summary:k,usedMode:c,finalUrl:p.url(),screenshotUrl:i,observationsCount:s,issueCount:a,at:new Date().toISOString()}}catch(p){let f=p instanceof Error?p.message:"\u6D4F\u89C8\u5668\u5DE1\u68C0\u5931\u8D25\u3002";return await m({kind:"action",level:"error",title:"\u6D4F\u89C8\u5668\u5DE1\u68C0\u5931\u8D25",detail:f,url:e.appUrl}),{ok:!1,message:f,summary:f,usedMode:c,finalUrl:e.appUrl,screenshotUrl:i,observationsCount:s,issueCount:a,at:new Date().toISOString()}}finally{await n?.close().catch(()=>{}),await r?.close().catch(()=>{}),o&&await Bp(o,{recursive:!0,force:!0}).catch(()=>{})}};var tn=e=>{let t=process.argv.slice(3),r=t.findIndex(n=>n===e);if(!(r<0))return t[r+1]?.trim()||void 0},en=e=>{let t=tn(e);if(!t)throw new Error(`\u7F3A\u5C11\u5FC5\u586B\u53C2\u6570 ${e}\u3002`);return t},Vs=async()=>{let e=b(),t=e.executorToken?.trim();if(!t)throw new Error("\u5F53\u524D worker \u672A\u5B8C\u6210\u914D\u5BF9\uFF0C\u7F3A\u5C11 executor token\u3002");let r=await Zr({cloudUrl:e.cloudUrl,executorToken:t,taskId:en("--task-id"),workspaceId:en("--workspace-id"),workspaceSessionId:en("--workspace-session-id"),cwd:tn("--cwd")?.trim()||process.cwd(),appUrl:en("--app-url"),healthUrl:tn("--health-url")?.trim()||void 0,goal:tn("--goal")?.trim()||void 0,mode:"playwright"});console.log(JSON.stringify(r,null,2)),r.ok||(process.exitCode=1)};import{spawn as Wx}from"node:child_process";var go=async e=>Ze({url:`${Oe(e.cloudUrl)}/api/control-plane/executors/artifacts/patch`,method:"POST",headers:{Authorization:`Bearer ${e.executorToken}`},body:{taskId:e.taskId,filename:e.filename,content:e.content},errorMessage:"Patch artifact upload failed."});var $p=async e=>typeof e=="string"?e:e instanceof ArrayBuffer?Buffer.from(e).toString("utf8"):typeof Blob<"u"&&e instanceof Blob?await e.text():e&&typeof e.toString=="function"?e.toString():"",Xs=async e=>{let t=await $p(e);return JSON.parse(t)};var Up=e=>e.readyState===WebSocket.OPEN,fo=(e,t)=>{if(!e.executorToken)throw new Error("Worker is not paired yet.");let r=`${Qi(e.cloudUrl)}?token=${encodeURIComponent(e.executorToken)}`,n=new WebSocket(r);return n.addEventListener("open",()=>{t.onOpen?.()}),n.addEventListener("message",async o=>{try{let i=await Xs(o.data);try{t.onMessage?.(i)}catch(s){t.onError?.(`Failed to process a control-plane message.${s instanceof Error?` ${s.message}`:""}`)}}catch(i){t.onError?.(`The control plane returned a message that could not be parsed.${i instanceof Error?` ${i.message}`:""}`)}}),n.addEventListener("error",()=>{t.onError?.(`Failed to connect to the control-plane WebSocket: ${r}`)}),n.addEventListener("close",o=>{t.onClose?.(o)}),{socket:n,send(o){if(!Up(n))return!1;try{return n.send(JSON.stringify(o)),!0}catch(i){return t.onError?.(`Failed to send a control-plane WebSocket message.${i instanceof Error?` ${i.message}`:""}`),!1}}}};var Ys="127.0.0.1",Lp=e=>e==="0.0.0.0"||e==="::"?Ys:e,jp=e=>e.includes(":")&&!e.startsWith("[")?`[${e}]`:e,ho=()=>process.env.VIBEMUX_WORKER_HOST?.trim()||Ys,rr=e=>{let t=Lp(ho());return`http://${jp(t)}:${e}`};import{mkdirSync as Fp}from"node:fs";import nr from"node:path";var rn=e=>{let t={root:e,reposDir:nr.join(e,"repos"),worktreesDir:nr.join(e,"worktrees"),artifactsDir:nr.join(e,"artifacts"),cacheDir:nr.join(e,"cache")};for(let r of Object.values(t))Fp(r,{recursive:!0});return t},Qs=(e,t,r)=>nr.join(e,"worktrees",r?.trim()||t);import{existsSync as Hm,readFileSync as zm}from"node:fs";import Km from"node:http";import Mo from"node:path";import{closeSync as Gp,existsSync as on,openSync as Hp,readFileSync as or,readSync as zp,readdirSync as Kp,statSync as Jp}from"node:fs";import Vp from"node:os";import q from"node:path";var qp=["# AGENTS.md instructions","<environment_context>","<INSTRUCTIONS>","<local-command-caveat>","<local-command-stdout>"],Se=e=>{let t=e.trim();return t?qp.some(r=>t.includes(r)):!1};var st=Vp.homedir(),Xp=48*1024,Yp=2e4,Zs=q.join(st,".claude","projects"),nn=q.join(st,".local","share","opencode","storage","message"),Qp=q.join(st,".local","share","opencode","storage","part"),ea=q.join(st,".codex","sessions"),Zp=q.join(st,".pi","agent"),em=()=>({claude:0,opencode:0,codex:0,pi:0}),G=e=>!!e&&typeof e=="object"&&!Array.isArray(e),sn=e=>{try{return Kp(e,{withFileTypes:!0})}catch{return[]}},Pt=e=>{try{return Jp(e)}catch{return null}},ta=(e,t=Xp)=>{let r=Hp(e,"r"),n=Buffer.alloc(t);try{let o=zp(r,n,0,t,0);return n.subarray(0,o).toString("utf8")}finally{Gp(r)}},wo=e=>{try{return JSON.parse(or(e,"utf8"))}catch{return null}},ra=e=>{let t=e.trim();return t?t==="~"?st:t.startsWith("~/")?q.join(st,t.slice(2)):t:""},tm=()=>{let e=b().piAgentDir?.trim();return q.resolve(ra(e||process.env.PI_AGENT_DIR?.trim()||Zp))},na=()=>{let e=tm(),t=wo(q.join(e,"settings.json")),r=typeof t?.sessionDir=="string"?ra(t.sessionDir):"",n=r?q.isAbsolute(r)?q.resolve(r):q.resolve(e,r):q.join(e,"sessions");return Array.from(new Set([n,q.join(e,"sessions"),q.join(e,"sessions-vibemux")]))},Et=e=>e.split(`
23
- `).map(t=>t.trim()).filter(Boolean).flatMap(t=>{try{return[JSON.parse(t)]}catch{return[]}}),It=(e,t)=>{if(!on(e))return[];let r=[],n=[e];for(;n.length>0;){let o=n.pop();if(o)for(let i of sn(o)){let s=q.join(o,i.name);if(i.isDirectory()){n.push(s);continue}i.isFile()&&s.endsWith(t)&&r.push(s)}}return r},Q=e=>{if(typeof e=="number"&&Number.isFinite(e))return new Date(e).toISOString();if(typeof e=="string"){let t=new Date(e);if(!Number.isNaN(t.getTime()))return t.toISOString()}},xo=(e,t=240)=>{let r=e.replace(/\s+/g," ").trim();return r?r.length<=t?r:`${r.slice(0,t-1)}\u2026`:""},ee=(e,t=Yp)=>{let r=e.trim();return r?r.length<=t?r:`${r.slice(0,t)}
14
+ ${n}`:r},Mo=async(e="base")=>{let t=await Promise.all(Zp(e).map(r=>sa(r)));return Ro(t,e)},an=(e,t=[])=>{let r=t.some(s=>s.changed),n=new Map(t.map(s=>[s.id,s.detail])),o=e.items.map(s=>{let i=n.get(s.id);return i?{...s,detail:`${s.detail}\uFF1B\u81EA\u52A8\u51C6\u5907\uFF1A${i}`}:s});return{ok:e.ok,changed:r,target:e.target,attempts:t,items:o,message:e.ok?r?`\u5DF2\u81EA\u52A8\u8865\u9F50${e.target==="base"?" Worker ":""}\u8FD0\u884C\u73AF\u5883\u3002`:e.message:tm(o)}},Eo=(e,t,r)=>{console.log(`[${e}/${t}] ${r}`)},bo=(e,t)=>{console.log(` ${e} - ${t}`)},Ao=async(e,t)=>{if(e.ok)return an(e);let r=[],n=e.missingItems.length*2+1,o=1;for(let i of e.missingItems){let a=Jp(i.id),c=a?`\u5B89\u88C5 ${i.label}\uFF08${a.installer}\uFF09`:`\u5B89\u88C5 ${i.label}`;t?.printProgress&&Eo(o,n,c);let l=a?a.run(t):de(i.id,null,{ok:!1,changed:!1,skipped:!0,detail:i.hint||`\u5F53\u524D\u73AF\u5883\u65E0\u6CD5\u81EA\u52A8\u5B89\u88C5 ${i.label}\u3002`});r.push(l),t?.printProgress&&bo(l.ok?"\u6210\u529F":l.skipped?"\u8DF3\u8FC7":"\u5931\u8D25",l.detail),o+=1;let d=await sa(i.id);t?.printProgress&&(Eo(o,n,`\u6821\u9A8C ${i.label}`),bo(d.ok?"\u6210\u529F":"\u5931\u8D25",d.detail)),o+=1}let s=await Mo(e.target);return t?.printProgress&&(Eo(o,n,"\u6700\u7EC8\u590D\u68C0"),bo(s.ok?"\u6210\u529F":"\u5931\u8D25",s.message)),an(s,r)},rm=e=>e.missingItems.map(t=>{let r=t.installCommand?`\uFF1B\u81EA\u52A8\u5B89\u88C5\uFF1A${t.installCommand}`:"";return`- ${t.label}: ${t.detail}${r}`}).join(`
15
+ `),on=e=>{console.log("[worker] \u53EF\u624B\u52A8\u6267\u884C\u7684\u4FEE\u590D\u5EFA\u8BAE\uFF1A");for(let t of e.missingItems)console.log(`- ${t.label}: ${t.hint||"\u8BF7\u624B\u52A8\u5B89\u88C5\u540E\u91CD\u8BD5\u3002"}`)},ia=()=>!!(ea.isTTY&&ta.isTTY),nm=e=>{let t=e?.trim().toLowerCase();return t?["1","true","yes","on"].includes(t)?!0:["0","false","no","off"].includes(t)?!1:null:null},om=e=>{let t=e?.interactiveTerminal??ia(),r=nm(e?.autoInstallSetting??process.env.VIBEMUX_WORKER_AUTO_INSTALL);return r===!0?"auto":r===!1?t?"prompt":"block":t?"prompt":"auto"},sm=e=>{let t=e.trim().toLowerCase();return t==="y"||t==="yes"||t==="\u662F"},Se=async e=>{let t=await Mo(e?.target??"base");return t.ok||!e?.autoInstall?an(t):Ao(t,e)},aa=async(e,t="base")=>{let r=await Mo(t),n=an(r);if(r.ok)return{status:"ready",report:n,message:n.message};console.log(`[worker] \u547D\u4EE4 ${e} \u8FD0\u884C\u524D\u68C0\u6D4B\u5230\u7F3A\u5931\u4F9D\u8D56\uFF1A`),console.log(rm(r));let o=ia(),s=om({interactiveTerminal:o});if(s==="auto"){console.log("[worker] \u5C06\u5C1D\u8BD5\u81EA\u52A8\u5B89\u88C5\u7F3A\u5931\u4F9D\u8D56\u3002");let c=await Ao(r,{interactiveAuth:o,printProgress:!0,streamOutput:!0});return c.ok?{status:"ready",report:c,message:c.message}:(on(Ro(c.items,t)),{status:"failed",report:c,message:c.message})}if(!o||s==="block"){let c="\u5F53\u524D\u7EC8\u7AEF\u4E0D\u53EF\u4EA4\u4E92\uFF0C\u65E0\u6CD5\u786E\u8BA4\u662F\u5426\u81EA\u52A8\u5B89\u88C5\u7F3A\u5931\u4F9D\u8D56\u3002";return console.error(`[worker] ${c}`),on(r),{status:"non_interactive_blocked",report:n,message:c}}let i=Kp({input:ea,output:ta});try{let c=await i.question("\u662F\u5426\u73B0\u5728\u81EA\u52A8\u5B89\u88C5\u7F3A\u5931\u4F9D\u8D56\uFF1F[y/N] ");if(!sm(c)){let l="\u7528\u6237\u62D2\u7EDD\u81EA\u52A8\u5B89\u88C5\uFF0CWorker \u5DF2\u9000\u51FA\u3002";return console.error(`[worker] ${l}`),on(r),{status:"declined",report:n,message:l}}}finally{i.close()}let a=await Ao(r,{interactiveAuth:!0,printProgress:!0,streamOutput:!0});return a.ok?{status:"ready",report:a,message:a.message}:(on(Ro(a.items,t)),{status:"failed",report:a,message:a.message})};var cn={daemonMode:"idle",paired:!1,connected:!1,runningTaskIds:[],queuedTaskIds:[]},ur=()=>({...cn,runningTaskIds:[...cn.runningTaskIds],queuedTaskIds:[...cn.queuedTaskIds]}),Oo=e=>({...e,executorToken:e.executorToken?.trim()?"[redacted]":void 0,opencodeConfigContent:e.opencodeConfigContent?.trim()?"[redacted]":"",codexConfigContent:e.codexConfigContent?.trim()?"[redacted]":"",codexAuthContent:e.codexAuthContent?.trim()?"[redacted]":"",claudeCodeConfigContent:e.claudeCodeConfigContent?.trim()?"[redacted]":"",mcpServers:e.mcpServers?.map(t=>({...t,target:t.target?.trim()?"[redacted]":t.target}))}),bt=()=>{let e=ur();return{...e,config:e.config?Oo(e.config):void 0}},q=e=>{Object.assign(cn,e)};import{mkdtemp as im,readFile as am,rm as cm}from"node:fs/promises";import lm from"node:os";import ln from"node:path";var ca=async e=>tt({url:`${Me(e.cloudUrl)}/api/control-plane/executors/observations`,method:"POST",headers:{Authorization:`Bearer ${e.executorToken}`},body:{taskId:e.taskId,workspaceId:e.workspaceId,workspaceSessionId:e.workspaceSessionId,kind:e.kind,level:e.level,title:e.title,detail:e.detail,url:e.url,attachments:e.attachments,metadata:e.metadata},errorMessage:"Executor observation upload failed."}),la=async e=>tt({url:`${Me(e.cloudUrl)}/api/control-plane/executors/images`,method:"POST",headers:{Authorization:`Bearer ${e.executorToken}`},body:{taskId:e.taskId,filename:e.filename,image:e.image},errorMessage:"Executor image upload failed."});var da=12,ua=12,pa=1500,ma=e=>{let t=e?.trim();if(t)return t.length>pa?`${t.slice(0,pa)}\u2026`:t},dm=e=>{if(e!==void 0)try{return ma(JSON.stringify(e,null,2))}catch{return}},um=(e,t)=>`data:${t};base64,${e.toString("base64")}`,dn=async e=>{let{chromium:t}=await import("playwright"),r=null,n=null,o="",s,i=0,a=0,c="playwright",l=0,d=0,p=async m=>{let f=m.level??"info";(f==="error"||f==="warning")&&(a+=1),i+=1,await ca({cloudUrl:e.cloudUrl,executorToken:e.executorToken,taskId:e.taskId,workspaceId:e.workspaceId,workspaceSessionId:e.workspaceSessionId,kind:m.kind,level:f,title:m.title,detail:ma(m.detail),url:m.url,attachments:m.attachments,metadata:m.metadata}).catch(()=>{})},u=async(m,f)=>{let S=ln.join(o,`${Date.now()}-${f}.png`);await m.screenshot({path:S,fullPage:!0});let w=await am(S),g=await la({cloudUrl:e.cloudUrl,executorToken:e.executorToken,taskId:e.taskId,filename:ln.basename(S),image:um(w,"image/png")});s=g.url,await p({kind:"screenshot",level:"info",title:`\u9875\u9762\u622A\u56FE \xB7 ${f}`,detail:`\u5F53\u524D\u9875\u9762: ${m.url()}`,url:g.url,attachments:[{id:g.id,url:g.url,filename:ln.basename(S),contentType:"image/png"}],metadata:{label:f}})};try{o=await im(ln.join(lm.tmpdir(),"vibemux-browser-run-")),r=await t.launch({headless:!0}),n=await r.newContext({ignoreHTTPSErrors:!0,viewport:{width:1440,height:960}});let m=await n.newPage();if(m.on("console",g=>{let I=g.type();if(I==="error"||I==="warning"){if(l>=da)return;l+=1,p({kind:"browser-console",level:I==="error"?"error":"warning",title:`Console ${I}`,detail:[g.text(),dm(g.location())].filter(Boolean).join(`
16
+ `),url:m.url()||e.appUrl,metadata:{type:I,location:g.location()}})}}),m.on("pageerror",g=>{l>=da||(l+=1,p({kind:"browser-console",level:"error",title:"\u9875\u9762\u811A\u672C\u5F02\u5E38",detail:g.message,url:m.url()||e.appUrl}))}),m.on("requestfailed",g=>{d>=ua||(d+=1,p({kind:"network",level:"error",title:`\u8BF7\u6C42\u5931\u8D25 \xB7 ${g.method()} ${g.resourceType()}`,detail:[g.url(),g.failure()?.errorText].filter(Boolean).join(`
17
+ `),url:g.url(),metadata:{method:g.method(),resourceType:g.resourceType(),failure:g.failure()}}))}),m.on("response",g=>{g.ok()||d>=ua||(d+=1,p({kind:"network",level:g.status()>=500?"error":"warning",title:`\u54CD\u5E94\u5F02\u5E38 \xB7 ${g.status()} ${g.request().method()}`,detail:[g.url(),g.statusText()].filter(Boolean).join(`
18
+ `),url:g.url(),metadata:{method:g.request().method(),status:g.status(),statusText:g.statusText()}}))}),await p({kind:"action",level:"info",title:"\u5F00\u59CB\u6D4F\u89C8\u5668\u5DE1\u68C0",detail:["\u6A21\u5F0F: Playwright",`\u5DE5\u4F5C\u76EE\u5F55: ${e.cwd}`,`\u76EE\u6807\u5730\u5740: ${e.appUrl}`,e.goal?.trim()?`\u6D4B\u8BD5\u76EE\u6807: ${e.goal.trim()}`:""].filter(Boolean).join(`
19
+ `),url:e.appUrl}),e.healthUrl?.trim()){let g=await fetch(e.healthUrl,{redirect:"follow"}).catch(I=>({ok:!1,status:0,statusText:I instanceof Error?I.message:"health request failed"}));await p({kind:"network",level:g.ok?"success":"warning",title:g.ok?"\u5065\u5EB7\u68C0\u67E5\u901A\u8FC7":"\u5065\u5EB7\u68C0\u67E5\u5F02\u5E38",detail:`${e.healthUrl}
20
+ ${g.status} ${g.statusText}`,url:e.healthUrl,metadata:{status:g.status,statusText:g.statusText}})}let f=await m.goto(e.appUrl,{waitUntil:"domcontentloaded",timeout:3e4});await m.waitForLoadState("networkidle",{timeout:1e4}).catch(()=>{}),await p({kind:"action",level:f?.ok()?"success":"warning",title:f?.ok()?"\u9875\u9762\u5DF2\u6253\u5F00":"\u9875\u9762\u6253\u5F00\u5B8C\u6210\uFF0C\u4F46\u8FD4\u56DE\u72B6\u6001\u5F02\u5E38",detail:[`\u6700\u7EC8\u5730\u5740: ${m.url()}`,f?`HTTP ${f.status()} ${f.statusText()}`:"\u672A\u83B7\u5F97\u9996\u4E2A\u5BFC\u822A\u54CD\u5E94"].join(`
21
+ `),url:m.url()}),await u(m,"initial");let S=e.goal?.trim();S&&await p({kind:"action",level:"info",title:"\u5DF2\u8BB0\u5F55\u6D4B\u8BD5\u76EE\u6807",detail:S,url:m.url()});let w=a>0?`\u6D4F\u89C8\u5668\u5DE1\u68C0\u5B8C\u6210\uFF0C\u53D1\u73B0 ${a} \u6761\u5F02\u5E38\u7EBF\u7D22\uFF0C\u5DF2\u56DE\u6D41\u5230\u6D4B\u8BD5\u4F1A\u8BDD\u3002`:"\u6D4F\u89C8\u5668\u5DE1\u68C0\u5B8C\u6210\uFF0C\u672A\u53D1\u73B0\u660E\u663E\u5F02\u5E38\u7EBF\u7D22\u3002";return await p({kind:"action",level:a>0?"warning":"success",title:a>0?"\u6D4F\u89C8\u5668\u5DE1\u68C0\u5B8C\u6210\uFF0C\u53D1\u73B0\u5F02\u5E38\u7EBF\u7D22":"\u6D4F\u89C8\u5668\u5DE1\u68C0\u5B8C\u6210",detail:[w,`\u4F7F\u7528\u6A21\u5F0F: ${c}`,`\u6700\u7EC8\u9875\u9762: ${m.url()}`,`\u89C2\u6D4B\u6570\u91CF: ${i}`].join(`
22
+ `),url:m.url(),metadata:{usedMode:c,observationsCount:i,issueCount:a,consoleCount:l,networkCount:d}}),{ok:!0,message:w,summary:w,usedMode:c,finalUrl:m.url(),screenshotUrl:s,observationsCount:i,issueCount:a,at:new Date().toISOString()}}catch(m){let f=m instanceof Error?m.message:"\u6D4F\u89C8\u5668\u5DE1\u68C0\u5931\u8D25\u3002";return await p({kind:"action",level:"error",title:"\u6D4F\u89C8\u5668\u5DE1\u68C0\u5931\u8D25",detail:f,url:e.appUrl}),{ok:!1,message:f,summary:f,usedMode:c,finalUrl:e.appUrl,screenshotUrl:s,observationsCount:i,issueCount:a,at:new Date().toISOString()}}finally{await n?.close().catch(()=>{}),await r?.close().catch(()=>{}),o&&await cm(o,{recursive:!0,force:!0}).catch(()=>{})}};var pn=e=>{let t=process.argv.slice(3),r=t.findIndex(n=>n===e);if(!(r<0))return t[r+1]?.trim()||void 0},un=e=>{let t=pn(e);if(!t)throw new Error(`\u7F3A\u5C11\u5FC5\u586B\u53C2\u6570 ${e}\u3002`);return t},ga=async()=>{let e=T(),t=e.executorToken?.trim();if(!t)throw new Error("\u5F53\u524D worker \u672A\u5B8C\u6210\u914D\u5BF9\uFF0C\u7F3A\u5C11 executor token\u3002");let r=await dn({cloudUrl:e.cloudUrl,executorToken:t,taskId:un("--task-id"),workspaceId:un("--workspace-id"),workspaceSessionId:un("--workspace-session-id"),cwd:pn("--cwd")?.trim()||process.cwd(),appUrl:un("--app-url"),healthUrl:pn("--health-url")?.trim()||void 0,goal:pn("--goal")?.trim()||void 0,mode:"playwright"});console.log(JSON.stringify(r,null,2)),r.ok||(process.exitCode=1)};import{spawn as IS}from"node:child_process";var _o=async e=>tt({url:`${Me(e.cloudUrl)}/api/control-plane/executors/artifacts/patch`,method:"POST",headers:{Authorization:`Bearer ${e.executorToken}`},body:{taskId:e.taskId,filename:e.filename,content:e.content},errorMessage:"Patch artifact upload failed."});var pm=async e=>typeof e=="string"?e:e instanceof ArrayBuffer?Buffer.from(e).toString("utf8"):typeof Blob<"u"&&e instanceof Blob?await e.text():e&&typeof e.toString=="function"?e.toString():"",fa=async e=>{let t=await pm(e);return JSON.parse(t)};var mm=e=>e.readyState===WebSocket.OPEN,Bo=(e,t)=>{if(!e.executorToken)throw new Error("Worker is not paired yet.");let r=`${ki(e.cloudUrl)}?token=${encodeURIComponent(e.executorToken)}`,n=new WebSocket(r);return n.addEventListener("open",()=>{t.onOpen?.()}),n.addEventListener("message",async o=>{try{let s=await fa(o.data);try{t.onMessage?.(s)}catch(i){t.onError?.(`Failed to process a control-plane message.${i instanceof Error?` ${i.message}`:""}`)}}catch(s){t.onError?.(`The control plane returned a message that could not be parsed.${s instanceof Error?` ${s.message}`:""}`)}}),n.addEventListener("error",()=>{t.onError?.(`Failed to connect to the control-plane WebSocket: ${r}`)}),n.addEventListener("close",o=>{t.onClose?.(o)}),{socket:n,send(o){if(!mm(n))return!1;try{return n.send(JSON.stringify(o)),!0}catch(s){return t.onError?.(`Failed to send a control-plane WebSocket message.${s instanceof Error?` ${s.message}`:""}`),!1}}}};var ha="127.0.0.1",gm=e=>e==="0.0.0.0"||e==="::"?ha:e,fm=e=>e.includes(":")&&!e.startsWith("[")?`[${e}]`:e,Wo=()=>process.env.VIBEMUX_WORKER_HOST?.trim()||ha,pr=e=>{let t=gm(Wo());return`http://${fm(t)}:${e}`};import{mkdirSync as hm}from"node:fs";import Tt from"node:path";var mn=e=>{let t={root:e,reposDir:Tt.join(e,"repos"),worktreesDir:Tt.join(e,"worktrees"),projectsDir:Tt.join(e,"projects"),artifactsDir:Tt.join(e,"artifacts"),cacheDir:Tt.join(e,"cache")};for(let r of Object.values(t))hm(r,{recursive:!0});return t},ya=(e,t,r)=>Tt.join(e,"worktrees",r?.trim()||t);import{existsSync as wg,readFileSync as xg}from"node:fs";import Sg from"node:http";import Xo from"node:path";import{closeSync as km,existsSync as fn,openSync as wm,readFileSync as mr,readSync as xm,readdirSync as Sm,statSync as Cm}from"node:fs";import vm from"node:os";import H from"node:path";var ym=["# AGENTS.md instructions","<environment_context>","<INSTRUCTIONS>","<local-command-caveat>","<local-command-stdout>"],Ce=e=>{let t=e.trim();return t?ym.some(r=>t.includes(r)):!1};var ct=vm.homedir(),Pm=48*1024,Im=2e4,ka=H.join(ct,".claude","projects"),gn=H.join(ct,".local","share","opencode","storage","message"),Em=H.join(ct,".local","share","opencode","storage","part"),wa=H.join(ct,".codex","sessions"),bm=H.join(ct,".pi","agent"),Tm=()=>({claude:0,opencode:0,codex:0,pi:0}),G=e=>!!e&&typeof e=="object"&&!Array.isArray(e),hn=e=>{try{return Sm(e,{withFileTypes:!0})}catch{return[]}},Rt=e=>{try{return Cm(e)}catch{return null}},xa=(e,t=Pm)=>{let r=wm(e,"r"),n=Buffer.alloc(t);try{let o=xm(r,n,0,t,0);return n.subarray(0,o).toString("utf8")}finally{km(r)}},Uo=e=>{try{return JSON.parse(mr(e,"utf8"))}catch{return null}},Sa=e=>{let t=e.trim();return t?t==="~"?ct:t.startsWith("~/")?H.join(ct,t.slice(2)):t:""},Rm=()=>{let e=T().piAgentDir?.trim();return H.resolve(Sa(e||process.env.PI_AGENT_DIR?.trim()||bm))},Ca=()=>{let e=Rm(),t=Uo(H.join(e,"settings.json")),r=typeof t?.sessionDir=="string"?Sa(t.sessionDir):"",n=r?H.isAbsolute(r)?H.resolve(r):H.resolve(e,r):H.join(e,"sessions");return Array.from(new Set([n,H.join(e,"sessions"),H.join(e,"sessions-vibemux")]))},At=e=>e.split(`
23
+ `).map(t=>t.trim()).filter(Boolean).flatMap(t=>{try{return[JSON.parse(t)]}catch{return[]}}),Mt=(e,t)=>{if(!fn(e))return[];let r=[],n=[e];for(;n.length>0;){let o=n.pop();if(o)for(let s of hn(o)){let i=H.join(o,s.name);if(s.isDirectory()){n.push(i);continue}s.isFile()&&i.endsWith(t)&&r.push(i)}}return r},ee=e=>{if(typeof e=="number"&&Number.isFinite(e))return new Date(e).toISOString();if(typeof e=="string"){let t=new Date(e);if(!Number.isNaN(t.getTime()))return t.toISOString()}},$o=(e,t=240)=>{let r=e.replace(/\s+/g," ").trim();return r?r.length<=t?r:`${r.slice(0,t-1)}\u2026`:""},ne=(e,t=Im)=>{let r=e.trim();return r?r.length<=t?r:`${r.slice(0,t)}
24
24
 
25
- \u2026\uFF08\u5185\u5BB9\u8FC7\u957F\uFF0C\u5DF2\u6309\u5B89\u5168\u4E0A\u9650\u622A\u65AD\uFF09`:""},So=e=>typeof e=="string"?e.trim():Array.isArray(e)?e.flatMap(t=>typeof t=="string"?[t]:G(t)?typeof t.text=="string"?[t.text]:typeof t.content=="string"?[t.content]:[]:[]).join(`
25
+ \u2026\uFF08\u5185\u5BB9\u8FC7\u957F\uFF0C\u5DF2\u6309\u5B89\u5168\u4E0A\u9650\u622A\u65AD\uFF09`:""},Lo=e=>typeof e=="string"?e.trim():Array.isArray(e)?e.flatMap(t=>typeof t=="string"?[t]:G(t)?typeof t.text=="string"?[t.text]:typeof t.content=="string"?[t.content]:[]:[]).join(`
26
26
 
27
- `).trim():"",bt=e=>({...e,title:xo(e.title||"\u672A\u547D\u540D\u4F1A\u8BDD",96),cwd:e.cwd||"\u2014"}),rm=()=>It(Zs,".jsonl").flatMap(e=>{let t=Pt(e);if(!t)return[];let r=Et(ta(e)),n=q.basename(e,".jsonl"),o=r.map(a=>Q(a.timestamp)).find(Boolean),i=r.map(a=>typeof a.cwd=="string"?a.cwd:"").find(Boolean)||"",s=r.flatMap(a=>{let c=G(a.message)?a.message:null;if(!c||c.role!=="user")return[];let l=So(c.content);return!l||Se(l)?[]:[l]}).find(Boolean)||"Claude Code \u4F1A\u8BDD";return[bt({id:n,source:"claude",title:s,cwd:i,startedAt:o,lastUpdatedAt:t.mtime.toISOString(),entryCount:0})]}),nm=e=>{let t=G(e.message)?e.message:null;if(!t||e.isMeta===!0)return[];let r=Q(e.timestamp),n=typeof t.role=="string"?t.role:typeof e.type=="string"?e.type:"system",o=t.content;if(n==="user"||n==="system"){let i=So(o);return!i||Se(i)?[]:[{id:`${String(e.uuid||e.sessionId||r||Math.random())}`,role:n==="user"?"user":"system",text:ee(i),timestamp:r}]}return n!=="assistant"||!Array.isArray(o)?[]:o.flatMap((i,s)=>G(i)?typeof i.text=="string"&&i.type==="text"?[{id:`${String(e.uuid||e.sessionId||r||s)}-${s}`,role:"assistant",text:ee(i.text),timestamp:r}]:i.type==="tool_use"&&typeof i.name=="string"?[{id:`${String(e.uuid||e.sessionId||r||s)}-${s}`,role:"tool",text:ee(`\u8C03\u7528\u5DE5\u5177\uFF1A${i.name}`),timestamp:r}]:[]:[])},om=e=>{let r=It(Zs,".jsonl").filter(l=>q.basename(l,".jsonl")===e)[0];if(!r)return null;let n=Et(or(r,"utf8")),o=Pt(r),i=n.map(l=>typeof l.cwd=="string"?l.cwd:"").find(Boolean)||"",s=n.flatMap(l=>{let d=G(l.message)?l.message:null;if(!d||d.role!=="user")return[];let m=So(d.content);return!m||Se(m)?[]:[m]}).find(Boolean)||"Claude Code \u4F1A\u8BDD",a=n.map(l=>Q(l.timestamp)).find(Boolean),c=n.flatMap(nm);return{...bt({id:e,source:"claude",title:s,cwd:i,startedAt:a,lastUpdatedAt:o?.mtime.toISOString()||new Date().toISOString(),entryCount:c.length}),entries:c}},im=()=>It(ea,".jsonl").flatMap(e=>{let t=Pt(e);if(!t)return[];let r=Et(ta(e)),n=r.find(c=>c.type==="session_meta"),o=G(n?.payload)?n.payload:null,i=typeof o?.cwd=="string"?o.cwd:"",s=Q(o?.timestamp)||r.map(c=>Q(c.timestamp)).find(Boolean),a=r.flatMap(c=>oa(c,!0)).map(c=>c.text).find(c=>!Se(c))||"Codex \u4F1A\u8BDD";return[bt({id:q.basename(e,".jsonl"),source:"codex",title:a,cwd:i,startedAt:s,lastUpdatedAt:t.mtime.toISOString(),entryCount:0})]}),oa=(e,t=!1)=>{if(e.type!=="response_item")return[];let r=G(e.payload)?e.payload:null;if(!r)return[];let n=Q(e.timestamp);if(r.type==="message"){let s=r.role;if(s!=="user"&&s!=="assistant")return[];let a=Array.isArray(r.content)?r.content.flatMap(c=>G(c)?typeof c.text=="string"&&(c.type==="input_text"||c.type==="text"||c.type==="output_text"||c.type==="summary_text")?[c.text]:!t&&c.type==="tool_use"&&typeof c.name=="string"?[`\u8C03\u7528\u5DE5\u5177\uFF1A${c.name}`]:[]:[]).join(`
27
+ `).trim():"",Ot=e=>({...e,title:$o(e.title||"\u672A\u547D\u540D\u4F1A\u8BDD",96),cwd:e.cwd||"\u2014"}),Am=()=>Mt(ka,".jsonl").flatMap(e=>{let t=Rt(e);if(!t)return[];let r=At(xa(e)),n=H.basename(e,".jsonl"),o=r.map(a=>ee(a.timestamp)).find(Boolean),s=r.map(a=>typeof a.cwd=="string"?a.cwd:"").find(Boolean)||"",i=r.flatMap(a=>{let c=G(a.message)?a.message:null;if(!c||c.role!=="user")return[];let l=Lo(c.content);return!l||Ce(l)?[]:[l]}).find(Boolean)||"Claude Code \u4F1A\u8BDD";return[Ot({id:n,source:"claude",title:i,cwd:s,startedAt:o,lastUpdatedAt:t.mtime.toISOString(),entryCount:0})]}),Mm=e=>{let t=G(e.message)?e.message:null;if(!t||e.isMeta===!0)return[];let r=ee(e.timestamp),n=typeof t.role=="string"?t.role:typeof e.type=="string"?e.type:"system",o=t.content;if(n==="user"||n==="system"){let s=Lo(o);return!s||Ce(s)?[]:[{id:`${String(e.uuid||e.sessionId||r||Math.random())}`,role:n==="user"?"user":"system",text:ne(s),timestamp:r}]}return n!=="assistant"||!Array.isArray(o)?[]:o.flatMap((s,i)=>G(s)?typeof s.text=="string"&&s.type==="text"?[{id:`${String(e.uuid||e.sessionId||r||i)}-${i}`,role:"assistant",text:ne(s.text),timestamp:r}]:s.type==="tool_use"&&typeof s.name=="string"?[{id:`${String(e.uuid||e.sessionId||r||i)}-${i}`,role:"tool",text:ne(`\u8C03\u7528\u5DE5\u5177\uFF1A${s.name}`),timestamp:r}]:[]:[])},Om=e=>{let r=Mt(ka,".jsonl").filter(l=>H.basename(l,".jsonl")===e)[0];if(!r)return null;let n=At(mr(r,"utf8")),o=Rt(r),s=n.map(l=>typeof l.cwd=="string"?l.cwd:"").find(Boolean)||"",i=n.flatMap(l=>{let d=G(l.message)?l.message:null;if(!d||d.role!=="user")return[];let p=Lo(d.content);return!p||Ce(p)?[]:[p]}).find(Boolean)||"Claude Code \u4F1A\u8BDD",a=n.map(l=>ee(l.timestamp)).find(Boolean),c=n.flatMap(Mm);return{...Ot({id:e,source:"claude",title:i,cwd:s,startedAt:a,lastUpdatedAt:o?.mtime.toISOString()||new Date().toISOString(),entryCount:c.length}),entries:c}},_m=()=>Mt(wa,".jsonl").flatMap(e=>{let t=Rt(e);if(!t)return[];let r=At(xa(e)),n=r.find(c=>c.type==="session_meta"),o=G(n?.payload)?n.payload:null,s=typeof o?.cwd=="string"?o.cwd:"",i=ee(o?.timestamp)||r.map(c=>ee(c.timestamp)).find(Boolean),a=r.flatMap(c=>va(c,!0)).map(c=>c.text).find(c=>!Ce(c))||"Codex \u4F1A\u8BDD";return[Ot({id:H.basename(e,".jsonl"),source:"codex",title:a,cwd:s,startedAt:i,lastUpdatedAt:t.mtime.toISOString(),entryCount:0})]}),va=(e,t=!1)=>{if(e.type!=="response_item")return[];let r=G(e.payload)?e.payload:null;if(!r)return[];let n=ee(e.timestamp);if(r.type==="message"){let i=r.role;if(i!=="user"&&i!=="assistant")return[];let a=Array.isArray(r.content)?r.content.flatMap(c=>G(c)?typeof c.text=="string"&&(c.type==="input_text"||c.type==="text"||c.type==="output_text"||c.type==="summary_text")?[c.text]:!t&&c.type==="tool_use"&&typeof c.name=="string"?[`\u8C03\u7528\u5DE5\u5177\uFF1A${c.name}`]:[]:[]).join(`
28
28
 
29
- `).trim():"";return a?s==="user"&&Se(a)?[]:t&&s!=="user"?[]:[{id:`${String(e.timestamp||Math.random())}-${s}`,role:s,text:ee(a),timestamp:n}]:[]}if(t||r.type!=="function_call")return[];let o=typeof r.name=="string"?r.name:"tool",i=xo(typeof r.arguments=="string"?r.arguments:"");return[{id:`${String(e.timestamp||Math.random())}-tool`,role:"tool",text:ee(i?`\u8C03\u7528 ${o}
30
- ${i}`:`\u8C03\u7528 ${o}`),timestamp:n}]},sm=e=>{let r=It(ea,".jsonl").filter(m=>q.basename(m,".jsonl")===e)[0];if(!r)return null;let n=Et(or(r,"utf8")),o=Pt(r),i=n.find(m=>m.type==="session_meta"),s=G(i?.payload)?i.payload:null,a=typeof s?.cwd=="string"?s.cwd:"",c=Q(s?.timestamp)||n.map(m=>Q(m.timestamp)).find(Boolean),l=n.flatMap(m=>oa(m)),d=l.find(m=>m.role==="user"&&!Se(m.text))?.text||"Codex \u4F1A\u8BDD";return{...bt({id:e,source:"codex",title:d,cwd:a,startedAt:c,lastUpdatedAt:o?.mtime.toISOString()||new Date().toISOString(),entryCount:l.length}),entries:l}},ia=e=>{let t=q.join(Qp,e);return sn(t).filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>wo(q.join(t,r.name))).filter(r=>!!r).sort((r,n)=>{let o=G(r.time)&&typeof r.time.start=="number"?r.time.start:0,i=G(n.time)&&typeof n.time.start=="number"?n.time.start:0;return o-i})},ko=e=>{let t=ia(String(e.id)).flatMap(n=>n.type==="text"&&typeof n.text=="string"?[n.text.trim()]:[]).filter(Boolean).join(`
29
+ `).trim():"";return a?i==="user"&&Ce(a)?[]:t&&i!=="user"?[]:[{id:`${String(e.timestamp||Math.random())}-${i}`,role:i,text:ne(a),timestamp:n}]:[]}if(t||r.type!=="function_call")return[];let o=typeof r.name=="string"?r.name:"tool",s=$o(typeof r.arguments=="string"?r.arguments:"");return[{id:`${String(e.timestamp||Math.random())}-tool`,role:"tool",text:ne(s?`\u8C03\u7528 ${o}
30
+ ${s}`:`\u8C03\u7528 ${o}`),timestamp:n}]},Bm=e=>{let r=Mt(wa,".jsonl").filter(p=>H.basename(p,".jsonl")===e)[0];if(!r)return null;let n=At(mr(r,"utf8")),o=Rt(r),s=n.find(p=>p.type==="session_meta"),i=G(s?.payload)?s.payload:null,a=typeof i?.cwd=="string"?i.cwd:"",c=ee(i?.timestamp)||n.map(p=>ee(p.timestamp)).find(Boolean),l=n.flatMap(p=>va(p)),d=l.find(p=>p.role==="user"&&!Ce(p.text))?.text||"Codex \u4F1A\u8BDD";return{...Ot({id:e,source:"codex",title:d,cwd:a,startedAt:c,lastUpdatedAt:o?.mtime.toISOString()||new Date().toISOString(),entryCount:l.length}),entries:l}},Pa=e=>{let t=H.join(Em,e);return hn(t).filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>Uo(H.join(t,r.name))).filter(r=>!!r).sort((r,n)=>{let o=G(r.time)&&typeof r.time.start=="number"?r.time.start:0,s=G(n.time)&&typeof n.time.start=="number"?n.time.start:0;return o-s})},No=e=>{let t=Pa(String(e.id)).flatMap(n=>n.type==="text"&&typeof n.text=="string"?[n.text.trim()]:[]).filter(Boolean).join(`
31
31
 
32
- `);if(t)return t;let r=G(e.summary)?e.summary:null;return typeof r?.title=="string"?r.title.replace(/^Title:\s*/i,"").trim():""},am=e=>{try{return JSON.stringify(e??{},null,2)}catch{return""}},cm=e=>{let t=e.trim();return!!(t&&t!=="{}"&&t!=="[]")},lm=e=>{let t=G(e.time)?e.time:null;return Q(t?.created)||Q(t?.completed)},dm=(e,t)=>{let r=G(e.time)?e.time:null;return Q(r?.start)||Q(r?.end)||t},um=e=>{let t=typeof e.tool=="string"&&e.tool.trim()?e.tool.trim():"tool",r=G(e.state)?e.state:null,n=typeof r?.raw=="string"?r.raw.trim():"",o=am(r?.input),i=n||(cm(o)?o:""),s=typeof r?.output=="string"?r.output.trim():"",a=typeof r?.error=="string"?r.error.trim():"",c=typeof r?.status=="string"?r.status:"";return[c==="error"?`\u5DE5\u5177\u62A5\u9519\uFF1A${t}`:c==="completed"?`\u5DE5\u5177\u7ED3\u679C\uFF1A${t}`:`\u8C03\u7528\u5DE5\u5177\uFF1A${t}`,i,c==="error"?a:s].filter(Boolean).join(`
33
- `)},pm=e=>{let t=e.role,r=typeof e.id=="string"||typeof e.id=="number"?String(e.id):`opencode-${Math.random()}`,n=lm(e);if(t==="user"){let s=ko(e);return!s||Se(s)?[]:[{id:r,role:"user",text:ee(s),timestamp:n}]}if(t!=="assistant")return[];let o=ia(r).flatMap((s,a)=>{let c=typeof s.id=="string"||typeof s.id=="number"?String(s.id):`${r}-part-${a}`,l=dm(s,n);if(s.type==="text"&&typeof s.text=="string"){let d=ee(s.text);return d?[{id:c,role:"assistant",text:d,timestamp:l}]:[]}if(s.type==="reasoning"&&typeof s.text=="string"){let d=ee(s.text);return d?[{id:c,role:"system",text:d,timestamp:l}]:[]}if(s.type==="tool"){let d=ee(um(s));return d?[{id:c,role:"tool",text:d,timestamp:l}]:[]}return[]});if(o.length>0)return o;let i=ko(e);return i?[{id:r,role:"assistant",text:ee(i),timestamp:n}]:[]},yo=e=>typeof e=="string"?e.trim():Array.isArray(e)?e.flatMap(t=>G(t)?t.type==="text"&&typeof t.text=="string"?[t.text]:typeof t.text=="string"?[t.text]:[]:[]).join(`
32
+ `);if(t)return t;let r=G(e.summary)?e.summary:null;return typeof r?.title=="string"?r.title.replace(/^Title:\s*/i,"").trim():""},Wm=e=>{try{return JSON.stringify(e??{},null,2)}catch{return""}},Dm=e=>{let t=e.trim();return!!(t&&t!=="{}"&&t!=="[]")},Nm=e=>{let t=G(e.time)?e.time:null;return ee(t?.created)||ee(t?.completed)},Um=(e,t)=>{let r=G(e.time)?e.time:null;return ee(r?.start)||ee(r?.end)||t},$m=e=>{let t=typeof e.tool=="string"&&e.tool.trim()?e.tool.trim():"tool",r=G(e.state)?e.state:null,n=typeof r?.raw=="string"?r.raw.trim():"",o=Wm(r?.input),s=n||(Dm(o)?o:""),i=typeof r?.output=="string"?r.output.trim():"",a=typeof r?.error=="string"?r.error.trim():"",c=typeof r?.status=="string"?r.status:"";return[c==="error"?`\u5DE5\u5177\u62A5\u9519\uFF1A${t}`:c==="completed"?`\u5DE5\u5177\u7ED3\u679C\uFF1A${t}`:`\u8C03\u7528\u5DE5\u5177\uFF1A${t}`,s,c==="error"?a:i].filter(Boolean).join(`
33
+ `)},Lm=e=>{let t=e.role,r=typeof e.id=="string"||typeof e.id=="number"?String(e.id):`opencode-${Math.random()}`,n=Nm(e);if(t==="user"){let i=No(e);return!i||Ce(i)?[]:[{id:r,role:"user",text:ne(i),timestamp:n}]}if(t!=="assistant")return[];let o=Pa(r).flatMap((i,a)=>{let c=typeof i.id=="string"||typeof i.id=="number"?String(i.id):`${r}-part-${a}`,l=Um(i,n);if(i.type==="text"&&typeof i.text=="string"){let d=ne(i.text);return d?[{id:c,role:"assistant",text:d,timestamp:l}]:[]}if(i.type==="reasoning"&&typeof i.text=="string"){let d=ne(i.text);return d?[{id:c,role:"system",text:d,timestamp:l}]:[]}if(i.type==="tool"){let d=ne($m(i));return d?[{id:c,role:"tool",text:d,timestamp:l}]:[]}return[]});if(o.length>0)return o;let s=No(e);return s?[{id:r,role:"assistant",text:ne(s),timestamp:n}]:[]},Do=e=>typeof e=="string"?e.trim():Array.isArray(e)?e.flatMap(t=>G(t)?t.type==="text"&&typeof t.text=="string"?[t.text]:typeof t.text=="string"?[t.text]:[]:[]).join(`
34
34
 
35
- `).trim():"",sa=e=>{if(e.type!=="message")return[];let t=G(e.message)?e.message:null;if(!t)return[];let r=typeof t.role=="string"?t.role:"system",n=Q(e.timestamp)||Q(t.timestamp),o=typeof e.id=="string"?e.id:String(e.timestamp||Math.random());if(r==="user"){let i=yo(t.content);return!i||Se(i)?[]:[{id:o,role:"user",text:ee(i),timestamp:n}]}if(r==="assistant"){let i=Array.isArray(t.content)?t.content:[],s=i.flatMap(c=>G(c)?c.type==="text"&&typeof c.text=="string"?[c.text]:[]:[]).join(`
35
+ `).trim():"",Ia=e=>{if(e.type!=="message")return[];let t=G(e.message)?e.message:null;if(!t)return[];let r=typeof t.role=="string"?t.role:"system",n=ee(e.timestamp)||ee(t.timestamp),o=typeof e.id=="string"?e.id:String(e.timestamp||Math.random());if(r==="user"){let s=Do(t.content);return!s||Ce(s)?[]:[{id:o,role:"user",text:ne(s),timestamp:n}]}if(r==="assistant"){let s=Array.isArray(t.content)?t.content:[],i=s.flatMap(c=>G(c)?c.type==="text"&&typeof c.text=="string"?[c.text]:[]:[]).join(`
36
36
 
37
- `).trim(),a=i.flatMap((c,l)=>{if(!G(c)||c.type!=="toolCall"||typeof c.name!="string")return[];let d=xo(JSON.stringify(c.arguments??{},null,2),600);return[{id:`${o}-tool-${l}`,role:"tool",text:ee(d&&d!=="{}"?`\u8C03\u7528\u5DE5\u5177\uFF1A${c.name}
38
- ${d}`:`\u8C03\u7528\u5DE5\u5177\uFF1A${c.name}`),timestamp:n}]});return[...s?[{id:`${o}-assistant`,role:"assistant",text:ee(s),timestamp:n}]:[],...a]}if(r==="toolResult"){let i=typeof t.toolName=="string"?t.toolName:"tool",s=yo(t.content),a=t.isError===!0?`\u5DE5\u5177\u62A5\u9519\uFF1A${i}`:`\u5DE5\u5177\u7ED3\u679C\uFF1A${i}`;return[{id:`${o}-tool-result`,role:"tool",text:ee(s?`${a}
39
- ${s}`:a),timestamp:n}]}if(r==="bashExecution"){let i=typeof t.command=="string"?t.command.trim():"",s=typeof t.output=="string"?t.output.trim():"",a=i?`\u6267\u884C\u547D\u4EE4\uFF1A${i}`:"\u6267\u884C\u547D\u4EE4";return[{id:`${o}-bash`,role:"tool",text:ee(s?`${a}
40
- ${s}`:a),timestamp:n}]}if(r==="branchSummary"||r==="compactionSummary"){let i=typeof t.summary=="string"?t.summary.trim():"";return i?[{id:`${o}-summary`,role:"system",text:ee(i),timestamp:n}]:[]}if(r==="custom"){let i=yo(t.content);return i?[{id:`${o}-custom`,role:"system",text:ee(i),timestamp:n}]:[]}return[]},aa=e=>{let t=Pt(e);if(!t)return null;let r=Et(or(e,"utf8")),n=r.find(c=>c.type==="session"),o=typeof n?.cwd=="string"?n.cwd:"",i=Q(n?.timestamp)||r.map(c=>Q(c.timestamp)).find(Boolean),s=r.flatMap(sa),a=s.find(c=>c.role==="user"&&!Se(c.text))?.text||"Pi \u4F1A\u8BDD";return bt({id:q.basename(e,".jsonl"),source:"pi",title:a,cwd:o,startedAt:i,lastUpdatedAt:t.mtime.toISOString(),entryCount:s.length})},ca=e=>{let t=q.join(nn,e);return sn(t).filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>wo(q.join(t,r.name))).filter(r=>!!r).sort((r,n)=>{let o=G(r.time)&&typeof r.time.created=="number"?r.time.created:0,i=G(n.time)&&typeof n.time.created=="number"?n.time.created:0;return o-i})},la=e=>{let t=q.join(nn,e),r=Pt(t),n=ca(e);if(n.length===0)return null;let o=n.flatMap(c=>{let l=G(c.path)?c.path:null;return typeof l?.cwd=="string"?[l.cwd]:[]}).find(Boolean)||"",i=n.map(c=>Q(G(c.time)?c.time.created:void 0)).find(Boolean),s=n.map(c=>{let l=G(c.time)?c.time:null;return Q(l?.completed)||Q(l?.created)}).filter(Boolean).pop()||r?.mtime.toISOString()||new Date().toISOString(),a=n.filter(c=>c.role==="user").map(ko).find(c=>!!c&&!Se(c))||"OpenCode \u4F1A\u8BDD";return bt({id:e,source:"opencode",title:a,cwd:o,startedAt:i,lastUpdatedAt:s,entryCount:n.length})},mm=()=>on(nn)?sn(nn).filter(e=>e.isDirectory()).flatMap(e=>{let t=la(e.name);return t?[t]:[]}):[],gm=()=>{let e=new Set;return na().flatMap(r=>on(r)?It(r,".jsonl"):[]).filter(r=>e.has(r)?!1:(e.add(r),!0)).flatMap(r=>{let n=aa(r);return n?[n]:[]})},fm=e=>{let t=la(e);if(!t)return null;let r=ca(e).flatMap(pm);return{...t,entryCount:r.length,entries:r}},hm=e=>{let r=na().flatMap(s=>on(s)?It(s,".jsonl"):[]).filter(s=>q.basename(s,".jsonl")===e)[0];if(!r)return null;let n=aa(r);if(!n)return null;let i=Et(or(r,"utf8")).flatMap(sa);return{...n,entryCount:i.length,entries:i}},an=()=>{let e=[...rm(),...mm(),...im(),...gm()].sort((r,n)=>n.lastUpdatedAt.localeCompare(r.lastUpdatedAt)),t=e.reduce((r,n)=>(r[n.source]+=1,r),em());return{ok:!0,sessions:e,counts:t}},cn=(e,t)=>e==="claude"?om(t):e==="opencode"?fm(t):e==="pi"?hm(t):sm(t);import{existsSync as wa,mkdirSync as xa,readdirSync as Mm,renameSync as Eo,rmSync as Io,writeFileSync as Om}from"node:fs";import _m from"node:os";import at from"node:path";import{spawn as To,spawnSync as Bm}from"node:child_process";import{chmodSync as pa,existsSync as ma,mkdirSync as ga,rmSync as ym,writeFileSync as Co}from"node:fs";import fa from"node:os";import ir from"node:path";import{rootCertificates as da}from"node:tls";var vo=e=>e.replace(/\\/g,"\\\\").replace(/`/g,"\\`").replace(/\$/g,"\\$"),km=e=>{let t=e?.trim()||"";if(!t)return null;let r=t.includes("://")?null:/^[^@/]+@([^:/?#]+):/i.exec(t);if(r?.[1])return r[1].toLowerCase();try{return new URL(t).host.toLowerCase()}catch{return null}},wm=e=>{let t=km(e);if(!t)return null;try{return new URL(`ssh://${t}`).hostname.toLowerCase()}catch{return t.toLowerCase().replace(/:\d+$/,"")}},ha=e=>{let t=wm(e);return t?t==="github.com"||t.endsWith(".github.com")?"github":t==="gitlab.com"||t.endsWith(".gitlab.com")||t.includes("gitlab")?"gitlab":"generic":null},xm=(e,t)=>{let r=t.provider??ha(e);return r==="github"?"x-access-token":r==="gitlab"?"oauth2":t.email?.trim()||t.name?.trim()||"git"},ua=e=>{let t=ha(e);return t==="github"?"GitHub":t==="gitlab"?"GitLab":"Git"},Sm=e=>{let t=e.trim().toLowerCase();return t?["terminal prompts disabled","could not read username","could not read password","authentication failed","http basic: access denied","invalid username or password","invalid username or token","support for password authentication was removed","permission denied (publickey)","write access to repository not granted","the requested url returned error: 403"].some(r=>t.includes(r)):!1},vm=e=>{let t=e.trim().toLowerCase();return t?["server certificate verification failed","ssl certificate problem","unable to get local issuer certificate","peer certificate cannot be authenticated","self-signed certificate","certificate has expired","schannel: "].some(r=>t.includes(r)):!1},Z=(e,t)=>{let r=e instanceof Error?e.message:typeof e=="string"?e:"";if(vm(r)){let o=ua(t);return new Error(`\u5F53\u524D\u8282\u70B9\u7684 Git \u65E0\u6CD5\u9A8C\u8BC1 ${o} \u4ED3\u5E93\u7684 HTTPS \u8BC1\u4E66\uFF0C\u8BF7\u68C0\u67E5\u8BE5\u8282\u70B9\u7684\u7CFB\u7EDF\u6839\u8BC1\u4E66\u3001Git \u7684 http.sslCAInfo / GIT_SSL_CAINFO / SSL_CERT_FILE \u914D\u7F6E\uFF0C\u6216\u6539\u7528 SSH \u4ED3\u5E93\u5730\u5740\u3002`)}if(!Sm(r))return e instanceof Error?e:new Error(r||"Git \u64CD\u4F5C\u5931\u8D25\u3002");let n=ua(t);return new Error(`\u5F53\u524D\u51ED\u8BC1\u65E0\u6CD5\u8BBF\u95EE ${n} \u4ED3\u5E93\uFF0C\u8BF7\u786E\u8BA4\u5DF2\u5728\u8BBE\u7F6E\u9875\u914D\u7F6E PAT\uFF08\u6216\u6FC0\u6D3B SSH \u6388\u6743\uFF09\uFF0C\u5E76\u4E14\u8BE5\u51ED\u8BC1\u5BF9\u76EE\u6807\u4ED3\u5E93\u6709\u8BFB\u53D6\u6743\u9650\u3002`)},Cm=(e,t,r)=>{let n=xm(r,t),o=t.credentialToken||"",i=ir.join(e,"git-askpass.js"),s=`#!/usr/bin/env node
37
+ `).trim(),a=s.flatMap((c,l)=>{if(!G(c)||c.type!=="toolCall"||typeof c.name!="string")return[];let d=$o(JSON.stringify(c.arguments??{},null,2),600);return[{id:`${o}-tool-${l}`,role:"tool",text:ne(d&&d!=="{}"?`\u8C03\u7528\u5DE5\u5177\uFF1A${c.name}
38
+ ${d}`:`\u8C03\u7528\u5DE5\u5177\uFF1A${c.name}`),timestamp:n}]});return[...i?[{id:`${o}-assistant`,role:"assistant",text:ne(i),timestamp:n}]:[],...a]}if(r==="toolResult"){let s=typeof t.toolName=="string"?t.toolName:"tool",i=Do(t.content),a=t.isError===!0?`\u5DE5\u5177\u62A5\u9519\uFF1A${s}`:`\u5DE5\u5177\u7ED3\u679C\uFF1A${s}`;return[{id:`${o}-tool-result`,role:"tool",text:ne(i?`${a}
39
+ ${i}`:a),timestamp:n}]}if(r==="bashExecution"){let s=typeof t.command=="string"?t.command.trim():"",i=typeof t.output=="string"?t.output.trim():"",a=s?`\u6267\u884C\u547D\u4EE4\uFF1A${s}`:"\u6267\u884C\u547D\u4EE4";return[{id:`${o}-bash`,role:"tool",text:ne(i?`${a}
40
+ ${i}`:a),timestamp:n}]}if(r==="branchSummary"||r==="compactionSummary"){let s=typeof t.summary=="string"?t.summary.trim():"";return s?[{id:`${o}-summary`,role:"system",text:ne(s),timestamp:n}]:[]}if(r==="custom"){let s=Do(t.content);return s?[{id:`${o}-custom`,role:"system",text:ne(s),timestamp:n}]:[]}return[]},Ea=e=>{let t=Rt(e);if(!t)return null;let r=At(mr(e,"utf8")),n=r.find(c=>c.type==="session"),o=typeof n?.cwd=="string"?n.cwd:"",s=ee(n?.timestamp)||r.map(c=>ee(c.timestamp)).find(Boolean),i=r.flatMap(Ia),a=i.find(c=>c.role==="user"&&!Ce(c.text))?.text||"Pi \u4F1A\u8BDD";return Ot({id:H.basename(e,".jsonl"),source:"pi",title:a,cwd:o,startedAt:s,lastUpdatedAt:t.mtime.toISOString(),entryCount:i.length})},ba=e=>{let t=H.join(gn,e);return hn(t).filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>Uo(H.join(t,r.name))).filter(r=>!!r).sort((r,n)=>{let o=G(r.time)&&typeof r.time.created=="number"?r.time.created:0,s=G(n.time)&&typeof n.time.created=="number"?n.time.created:0;return o-s})},Ta=e=>{let t=H.join(gn,e),r=Rt(t),n=ba(e);if(n.length===0)return null;let o=n.flatMap(c=>{let l=G(c.path)?c.path:null;return typeof l?.cwd=="string"?[l.cwd]:[]}).find(Boolean)||"",s=n.map(c=>ee(G(c.time)?c.time.created:void 0)).find(Boolean),i=n.map(c=>{let l=G(c.time)?c.time:null;return ee(l?.completed)||ee(l?.created)}).filter(Boolean).pop()||r?.mtime.toISOString()||new Date().toISOString(),a=n.filter(c=>c.role==="user").map(No).find(c=>!!c&&!Ce(c))||"OpenCode \u4F1A\u8BDD";return Ot({id:e,source:"opencode",title:a,cwd:o,startedAt:s,lastUpdatedAt:i,entryCount:n.length})},jm=()=>fn(gn)?hn(gn).filter(e=>e.isDirectory()).flatMap(e=>{let t=Ta(e.name);return t?[t]:[]}):[],Fm=()=>{let e=new Set;return Ca().flatMap(r=>fn(r)?Mt(r,".jsonl"):[]).filter(r=>e.has(r)?!1:(e.add(r),!0)).flatMap(r=>{let n=Ea(r);return n?[n]:[]})},qm=e=>{let t=Ta(e);if(!t)return null;let r=ba(e).flatMap(Lm);return{...t,entryCount:r.length,entries:r}},Hm=e=>{let r=Ca().flatMap(i=>fn(i)?Mt(i,".jsonl"):[]).filter(i=>H.basename(i,".jsonl")===e)[0];if(!r)return null;let n=Ea(r);if(!n)return null;let s=At(mr(r,"utf8")).flatMap(Ia);return{...n,entryCount:s.length,entries:s}},yn=()=>{let e=[...Am(),...jm(),..._m(),...Fm()].sort((r,n)=>n.lastUpdatedAt.localeCompare(r.lastUpdatedAt)),t=e.reduce((r,n)=>(r[n.source]+=1,r),Tm());return{ok:!0,sessions:e,counts:t}},kn=(e,t)=>e==="claude"?Om(t):e==="opencode"?qm(t):e==="pi"?Hm(t):Bm(t);import{existsSync as Ua,mkdirSync as $a,readdirSync as sg,renameSync as Ho,rmSync as Go,writeFileSync as ig}from"node:fs";import ag from"node:os";import lt from"node:path";import{spawn as Vo,spawnSync as cg}from"node:child_process";import{chmodSync as Ma,existsSync as Oa,mkdirSync as _a,rmSync as Gm,writeFileSync as Fo}from"node:fs";import Ba from"node:os";import gr from"node:path";import{rootCertificates as Ra}from"node:tls";var jo=e=>e.replace(/\\/g,"\\\\").replace(/`/g,"\\`").replace(/\$/g,"\\$"),zm=e=>{let t=e?.trim()||"";if(!t)return null;let r=t.includes("://")?null:/^[^@/]+@([^:/?#]+):/i.exec(t);if(r?.[1])return r[1].toLowerCase();try{return new URL(t).host.toLowerCase()}catch{return null}},Km=e=>{let t=zm(e);if(!t)return null;try{return new URL(`ssh://${t}`).hostname.toLowerCase()}catch{return t.toLowerCase().replace(/:\d+$/,"")}},Wa=e=>{let t=Km(e);return t?t==="github.com"||t.endsWith(".github.com")?"github":t==="gitlab.com"||t.endsWith(".gitlab.com")||t.includes("gitlab")?"gitlab":"generic":null},Vm=(e,t)=>{let r=t.provider??Wa(e);return r==="github"?"x-access-token":r==="gitlab"?"oauth2":t.email?.trim()||t.name?.trim()||"git"},Aa=e=>{let t=Wa(e);return t==="github"?"GitHub":t==="gitlab"?"GitLab":"Git"},Jm=e=>{let t=e.trim().toLowerCase();return t?["terminal prompts disabled","could not read username","could not read password","authentication failed","http basic: access denied","invalid username or password","invalid username or token","support for password authentication was removed","permission denied (publickey)","write access to repository not granted","the requested url returned error: 403"].some(r=>t.includes(r)):!1},Xm=e=>{let t=e.trim().toLowerCase();return t?["server certificate verification failed","ssl certificate problem","unable to get local issuer certificate","peer certificate cannot be authenticated","self-signed certificate","certificate has expired","schannel: "].some(r=>t.includes(r)):!1},te=(e,t)=>{let r=e instanceof Error?e.message:typeof e=="string"?e:"";if(Xm(r)){let o=Aa(t);return new Error(`\u5F53\u524D\u8282\u70B9\u7684 Git \u65E0\u6CD5\u9A8C\u8BC1 ${o} \u4ED3\u5E93\u7684 HTTPS \u8BC1\u4E66\uFF0C\u8BF7\u68C0\u67E5\u8BE5\u8282\u70B9\u7684\u7CFB\u7EDF\u6839\u8BC1\u4E66\u3001Git \u7684 http.sslCAInfo / GIT_SSL_CAINFO / SSL_CERT_FILE \u914D\u7F6E\uFF0C\u6216\u6539\u7528 SSH \u4ED3\u5E93\u5730\u5740\u3002`)}if(!Jm(r))return e instanceof Error?e:new Error(r||"Git \u64CD\u4F5C\u5931\u8D25\u3002");let n=Aa(t);return new Error(`\u5F53\u524D\u51ED\u8BC1\u65E0\u6CD5\u8BBF\u95EE ${n} \u4ED3\u5E93\uFF0C\u8BF7\u786E\u8BA4\u5DF2\u5728\u8BBE\u7F6E\u9875\u914D\u7F6E PAT\uFF08\u6216\u6FC0\u6D3B SSH \u6388\u6743\uFF09\uFF0C\u5E76\u4E14\u8BE5\u51ED\u8BC1\u5BF9\u76EE\u6807\u4ED3\u5E93\u6709\u8BFB\u53D6\u6743\u9650\u3002`)},Ym=(e,t,r)=>{let n=Vm(r,t),o=t.credentialToken||"",s=gr.join(e,"git-askpass.js"),i=`#!/usr/bin/env node
41
41
  const prompt = (process.argv[2] || '').toLowerCase()
42
42
  if (prompt.includes('username')) {
43
- process.stdout.write(\`${vo(n)}\`)
43
+ process.stdout.write(\`${jo(n)}\`)
44
44
  process.exit(0)
45
45
  }
46
46
  if (prompt.includes('password')) {
47
- process.stdout.write(\`${vo(o)}\`)
47
+ process.stdout.write(\`${jo(o)}\`)
48
48
  process.exit(0)
49
49
  }
50
- process.stdout.write(\`${vo(o)}\`)
51
- `;return Co(i,s,{encoding:"utf8",mode:448}),pa(i,448),i},Pm=e=>`ssh -i "${e}" -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null`,Em=new Set(["EDITOR","GIT_ASKPASS","GIT_CONFIG","GIT_CONFIG_COUNT","GIT_CONFIG_GLOBAL","GIT_CONFIG_SYSTEM","GIT_EDITOR","GIT_EXEC_PATH","GIT_EXTERNAL_DIFF","GIT_PAGER","GIT_PROXY_COMMAND","GIT_SEQUENCE_EDITOR","GIT_SSH","GIT_SSH_COMMAND","GIT_TEMPLATE_DIR","PAGER","PREFIX","SSH_ASKPASS"]),Im=["/etc/ssl/cert.pem","/etc/ssl/certs/ca-certificates.crt","/etc/pki/tls/certs/ca-bundle.crt","/etc/ssl/ca-bundle.pem","/usr/local/etc/openssl@3/cert.pem","/opt/homebrew/etc/openssl@3/cert.pem","/usr/local/etc/openssl/cert.pem","/opt/homebrew/etc/openssl/cert.pem"],ya=ir.join(fa.tmpdir(),"vibemux-git","generated-ca-bundle.pem"),bm=e=>{let t=e.toUpperCase();return Em.has(t)||t.startsWith("GIT_CONFIG_KEY_")||t.startsWith("GIT_CONFIG_VALUE_")},Rm=e=>!!(e.GIT_SSL_CAINFO?.trim()||e.SSL_CERT_FILE?.trim()||e.CURL_CA_BUNDLE?.trim()),Tm=(e=ya)=>ma(e)?e:da.length<1?"":(ga(ir.dirname(e),{recursive:!0}),Co(e,`${da.join(`
50
+ process.stdout.write(\`${jo(o)}\`)
51
+ `;return Fo(s,i,{encoding:"utf8",mode:448}),Ma(s,448),s},Qm=e=>`ssh -i "${e}" -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null`,Zm=new Set(["EDITOR","GIT_ASKPASS","GIT_CONFIG","GIT_CONFIG_COUNT","GIT_CONFIG_GLOBAL","GIT_CONFIG_SYSTEM","GIT_EDITOR","GIT_EXEC_PATH","GIT_EXTERNAL_DIFF","GIT_PAGER","GIT_PROXY_COMMAND","GIT_SEQUENCE_EDITOR","GIT_SSH","GIT_SSH_COMMAND","GIT_TEMPLATE_DIR","PAGER","PREFIX","SSH_ASKPASS"]),eg=["/etc/ssl/cert.pem","/etc/ssl/certs/ca-certificates.crt","/etc/pki/tls/certs/ca-bundle.crt","/etc/ssl/ca-bundle.pem","/usr/local/etc/openssl@3/cert.pem","/opt/homebrew/etc/openssl@3/cert.pem","/usr/local/etc/openssl/cert.pem","/opt/homebrew/etc/openssl/cert.pem"],Da=gr.join(Ba.tmpdir(),"vibemux-git","generated-ca-bundle.pem"),tg=e=>{let t=e.toUpperCase();return Zm.has(t)||t.startsWith("GIT_CONFIG_KEY_")||t.startsWith("GIT_CONFIG_VALUE_")},rg=e=>!!(e.GIT_SSL_CAINFO?.trim()||e.SSL_CERT_FILE?.trim()||e.CURL_CA_BUNDLE?.trim()),ng=(e=Da)=>Oa(e)?e:Ra.length<1?"":(_a(gr.dirname(e),{recursive:!0}),Fo(e,`${Ra.join(`
52
52
  `)}
53
- `,"utf8"),e),Am=(e=process.env,t=Im,r=ya)=>{if(Rm(e))return{};let n=t.find(o=>ma(o))||Tm(r);return n?{GIT_SSL_CAINFO:n,SSL_CERT_FILE:n,CURL_CA_BUNDLE:n}:{}},Po=(e=process.env)=>{let t={};for(let[r,n]of Object.entries(e))n!==void 0&&!bm(r)&&(t[r]=n);return Object.assign(t,Am(e)),t},Rt=e=>{let t={};return(e?.GIT_ASKPASS||e?.SSH_ASKPASS)&&(t.allowUnsafeAskPass=!0),(e?.GIT_SSH||e?.GIT_SSH_COMMAND)&&(t.allowUnsafeSshCommand=!0),Object.keys(t).length>0?{unsafe:t}:{}},ka=e=>{let t=ir.join(fa.tmpdir(),"vibemux-git",e.taskId);ga(t,{recursive:!0});let r=Po();if(r.GIT_TERMINAL_PROMPT="0",e.identity.authMode==="ssh"&&e.identity.credentialToken){let n=ir.join(t,"id_ed25519");Co(n,e.identity.credentialToken,{encoding:"utf8",mode:384}),pa(n,384),r.GIT_SSH_COMMAND=Pm(n)}else e.identity.credentialToken&&(r.GIT_ASKPASS=Cm(t,e.identity,e.repoUrl));return{env:r,tempDir:t,cleanup(){ym(t,{recursive:!0,force:!0})}}};var Wm=e=>new Promise(t=>setTimeout(t,e)),bo=!1,Ro=null,Dm=()=>wa(_r())&&wa(Vt()),Nm=()=>{let e=et().name?.trim()||"";return e==="vibemux-worker"||e==="vibemux-worker-preview"},$m=()=>process.platform==="win32"?"npx.cmd":"npx",Um=()=>{let e=process.env.VIBEMUX_WORKER_RESTART_STRATEGY?.trim().toLowerCase();return e==="pm2"||e==="supervisor"?!0:!!process.env.pm_id?.trim()},Lm=(e,t)=>{let r=Po(process.env);To($m(),["-y",`${e}@${t}`,"daemon"],{detached:!0,stdio:"ignore",env:r}).unref()},jm=async e=>{for(let t=0;t<120;t+=1)try{process.kill(e,0),await Wm(500)}catch{return}throw new Error(`\u7B49\u5F85\u65E7 Worker \u9000\u51FA\u8D85\u65F6: ${e}`)},Fm=async e=>{let t=await fetch(e,{method:"GET",signal:AbortSignal.timeout(3e4)});if(!t.ok)throw new Error(`\u4E0B\u8F7D\u66F4\u65B0\u5305\u5931\u8D25\uFF0CHTTP ${t.status}`);let r=Buffer.from(await t.arrayBuffer()),n=at.join(_m.tmpdir(),"vibemux-worker-updates");xa(n,{recursive:!0});let o=at.join(n,`worker-${Date.now()}.tar.gz`);return Om(o,r),o},qm=(e,t)=>{let r=Bm("tar",["-xzf",e,"-C",t],{encoding:"utf8"});if(r.status!==0)throw new Error(r.stderr?.trim()||r.error?.message||"\u89E3\u538B\u66F4\u65B0\u5305\u5931\u8D25")},Gm=e=>{To(at.join(e,"bin","vibemux-worker"),["daemon"],{detached:!0,stdio:"ignore"}).unref()},ln=async e=>{let t=e??await ot();if(!t.ok||!t.available)return{ok:t.ok,applied:!1,currentVersion:t.currentVersion,latestVersion:t.latestVersion,message:t.message};if(!t.asset)return!t.packageName||!t.latestVersion?{ok:!1,applied:!1,currentVersion:t.currentVersion,latestVersion:t.latestVersion,message:"\u7F3A\u5C11 npm \u66F4\u65B0\u76EE\u6807\u4FE1\u606F\uFF0C\u65E0\u6CD5\u81EA\u52A8\u66F4\u65B0\u3002"}:Nm()?Um()?{ok:!0,applied:!0,currentVersion:t.currentVersion,latestVersion:t.latestVersion,message:`\u68C0\u6D4B\u5230\u65B0\u7248\u672C ${t.latestVersion}\uFF0C\u5373\u5C06\u9000\u51FA\u5E76\u4EA4\u7ED9\u5916\u90E8 supervisor \u91CD\u542F\u3002`}:(Lm(t.packageName,t.latestVersion),{ok:!0,applied:!0,currentVersion:t.currentVersion,latestVersion:t.latestVersion,message:`\u5DF2\u5F00\u59CB\u901A\u8FC7 npx \u5207\u6362\u5230 ${t.latestVersion}\uFF0CWorker \u5373\u5C06\u91CD\u542F\u3002`}):{ok:!1,applied:!1,currentVersion:t.currentVersion,latestVersion:t.latestVersion,message:"\u5F53\u524D\u4E0D\u662F npm Worker \u5B89\u88C5\u65B9\u5F0F\uFF0C\u65E0\u6CD5\u901A\u8FC7 npx \u81EA\u52A8\u66F4\u65B0\u3002"};if(!Dm())return{ok:!1,applied:!1,currentVersion:t.currentVersion,latestVersion:t.latestVersion,message:"\u5F53\u524D\u4E0D\u662F\u4FBF\u643A Worker \u5B89\u88C5\u76EE\u5F55\uFF0C\u65E0\u6CD5\u6267\u884C\u81EA\u66F4\u65B0\u3002"};let r=await Fm(t.asset.url);return To(process.execPath,[Vt(),"apply-update-internal",r,se(),String(process.pid)],{detached:!0,stdio:"ignore"}).unref(),{ok:!0,applied:!0,currentVersion:t.currentVersion,latestVersion:t.latestVersion,message:`\u5DF2\u5F00\u59CB\u66F4\u65B0\u5230 ${t.latestVersion}\uFF0CWorker \u5373\u5C06\u91CD\u542F\u3002`}},Ao=async e=>{let t=process.env.VIBEMUX_WORKER_AUTO_UPDATE?.trim().toLowerCase();if(t==="0"||t==="false"||t==="off"||bo)return!1;bo=!0;try{let r=e??await ot();return!r.ok||!r.available||!r.latestVersion?(Ro=null,!1):Ro===r.latestVersion?!1:(Ro=r.latestVersion,console.log(`[worker] \u68C0\u6D4B\u5230\u65B0\u7248\u672C ${r.latestVersion}\uFF0C\u5F53\u524D\u4EC5\u63D0\u793A\uFF0C\u4E0D\u4F1A\u81EA\u52A8\u5347\u7EA7\u6216\u9000\u51FA\u3002`),!0)}finally{bo=!1}},Sa=async(e,t,r)=>{await jm(r);let n=at.dirname(t),o=at.join(n,`.vibemux-worker-stage-${Date.now()}`),i=at.join(n,`.vibemux-worker-backup-${Date.now()}`);xa(o,{recursive:!0}),qm(e,o);let[s]=Mm(o);if(!s)throw new Error("\u66F4\u65B0\u5305\u5185\u5BB9\u4E3A\u7A7A");let a=at.join(o,s);Eo(t,i);try{Eo(a,t)}catch(c){throw Eo(i,t),c}Gm(t),Io(i,{recursive:!0,force:!0}),Io(o,{recursive:!0,force:!0}),Io(e,{force:!0})};var Jm=e=>new URL(e.url||"/","http://127.0.0.1"),va=async e=>{let t=[];for await(let r of e)t.push(Buffer.isBuffer(r)?r:Buffer.from(r));return JSON.parse(Buffer.concat(t).toString("utf8"))},X=(e,t,r)=>{e.statusCode=t,e.setHeader("Content-Type","application/json; charset=utf-8"),e.setHeader("Cache-Control","no-store"),e.end(`${JSON.stringify(r)}
54
- `)},Vm=(e,t)=>{let r=Mo.extname(t),n=r===".css"?"text/css; charset=utf-8":r===".js"?"application/javascript; charset=utf-8":r===".map"?"application/json; charset=utf-8":"text/html; charset=utf-8";e.statusCode=200,e.setHeader("Content-Type",n),e.end(zm(t))},Xm=e=>{let t=os(),r=e==="/"?Mo.join(t,"index.html"):Mo.join(t,e.replace(/^\//,""));return r.startsWith(t)?r:null},Ym=(e,t)=>{let r=Xm(e);if(!r||!Hm(r)){X(t,404,{message:"not found"});return}Vm(t,r)},Qm=()=>{let e=tr(),t=b();return{ok:!0,service:"worker-local-server",daemonMode:e.daemonMode,paired:e.paired,connected:e.connected,executorId:e.executorId,runningTaskIds:e.runningTaskIds,queuedTaskIds:e.queuedTaskIds,localServerPort:t.localServerPort}},Zm=e=>e==="claude"||e==="opencode"||e==="codex"||e==="pi"?e:null,eg=()=>{let e=b(),t=e.mcpServers??[],r=!!e.executorToken?.trim(),n=t.map(c=>{let l=rt([c],{cloudUrl:e.cloudUrl,executorToken:e.executorToken,actingUserId:c.target===tt&&r?"__dynamic__":void 0}),d=Object.keys(l)[0],m=d?l[d]:null,u=c.target===tt;return{id:c.id,name:c.name,target:c.target,transport:c.transport,capabilityMode:c.capabilityMode,enabled:c.enabled,materialized:!!m,kind:u?"builtin":c.transport==="stdio"||c.target.startsWith("stdio://")?"stdio":c.transport==="http"||c.transport==="sse"?"remote":"custom",endpoint:typeof m?.url=="string"?m.url:void 0,command:typeof m?.command=="string"?m.command:void 0,headerKeys:m&&typeof m=="object"&&m.headers&&typeof m.headers=="object"?Object.keys(m.headers):[],actingUserScoped:u&&r}}),o=n.filter(c=>c.enabled),s=!!n.find(c=>c.target===tt)?.enabled,a=s&&r;return{configuredCount:n.length,enabledCount:o.length,materializedCount:o.filter(c=>c.materialized).length,builtinEnabled:s,builtinReady:a,actingUserMode:s?a?"request-scoped":"pairing-required":"disabled",servers:n}},tg=(e,t)=>e.code==="EADDRINUSE"?`Local console port ${t} is already in use. Set VIBEMUX_WORKER_PORT and try again.`:e.code==="EPERM"?`The worker does not have permission to listen on local console port ${t}. Choose a different VIBEMUX_WORKER_PORT or check system permissions.`:`Failed to start the local console: ${e.message||"listen failed"}`,rg=()=>{setTimeout(()=>{try{process.kill(process.pid,"SIGTERM")}catch{process.exit(0)}},250)},Oo=()=>{let e=b(),t=ho(),r=Km.createServer(async(n,o)=>{try{let i=Jm(n);if(n.method==="GET"&&(i.pathname==="/"||i.pathname.startsWith("/assets/"))){Ym(i.pathname,o);return}if(n.method==="GET"&&(i.pathname==="/health"||i.pathname==="/api/health")){X(o,200,Qm());return}if(n.method==="GET"&&i.pathname==="/api/config"){X(o,200,{config:b()});return}if(n.method==="GET"&&i.pathname==="/api/status"){X(o,200,{runtime:Ct(),mcp:eg()});return}if(n.method==="GET"&&i.pathname==="/api/doctor"){X(o,200,await Tt());return}if(n.method==="GET"&&i.pathname==="/api/agent-sessions"){X(o,200,an());return}if(n.method==="GET"&&i.pathname==="/api/agent-sessions/detail"){let s=Zm(i.searchParams.get("source")),a=i.searchParams.get("id")?.trim();if(!s||!a){X(o,400,{message:"source and id are required"});return}let c=cn(s,a);if(!c){X(o,404,{message:"session not found"});return}X(o,200,{session:c});return}if(n.method==="GET"&&i.pathname==="/api/update"){X(o,200,await ot());return}if(n.method==="POST"&&i.pathname==="/api/bootstrap-runtime"){let s=await xe({autoInstall:!0,target:"all"});X(o,200,{report:s,doctor:await Tt()});return}if(n.method==="PUT"&&i.pathname==="/api/config"){let s=await va(n),a={...b(),...s};Ie(a),F({config:a,paired:!!(a.executorId&&a.executorToken),executorId:a.executorId}),X(o,200,{config:a,message:"saved"});return}if(n.method==="POST"&&i.pathname==="/api/pair"){let s=await va(n),a=b(),c=gt(s.pairingCode);if(Ar(s.pairingCode,a)){let m={...a,executorName:s.name?.trim()||a.executorName?.trim()||`worker-${process.pid}`};Ie(m),F({paired:!0,executorId:m.executorId,config:m,daemonMode:"starting"}),dn(),X(o,200,{config:m,message:`${Mr()} Connecting to the control plane.`});return}let l;try{l=await Jt({pairingCode:s.pairingCode,machineId:a.machineId,machineName:a.machineName,name:s.name?.trim()||`worker-${process.pid}`,workspaceRoot:a.workspaceRoot,maxConcurrency:a.maxConcurrency,labels:a.labels,capabilities:a.capabilities,platform:process.platform,version:ue()},a.cloudUrl)}catch(m){let u=m instanceof Error?m.message:"Pair request failed.";X(o,400,{message:Or(u,ft(a))});return}let d={...a,executorName:s.name?.trim()||`worker-${process.pid}`,executorId:l.executorId,executorToken:l.executorToken,lastPairedPairingCode:c};Ie(d),F({paired:!0,executorId:l.executorId,config:d,daemonMode:"starting"}),dn(),X(o,200,{config:d,executor:l.executor,message:"Pairing complete. Connecting to the control plane."});return}if(n.method==="POST"&&i.pathname==="/api/reset"){qr(),F({daemonMode:"idle",paired:!1,connected:!1,executorId:void 0,config:b(),runningTaskIds:[],queuedTaskIds:[],lastError:void 0}),X(o,200,{config:b(),message:"reset"});return}if(n.method==="POST"&&i.pathname==="/api/disconnect"){Ca(),X(o,200,{runtime:Ct(),message:"Disconnected from the control plane."});return}if(n.method==="POST"&&i.pathname==="/api/connect"){dn(),X(o,200,{runtime:Ct(),message:"Control plane connection requested."});return}if(n.method==="POST"&&i.pathname==="/api/update"){let s=await ln();X(o,s.applied?202:200,s),s.applied&&rg();return}X(o,404,{message:"not found"})}catch(i){X(o,500,{message:i instanceof Error?i.message:"worker local server error"})}});return r.once("error",n=>{let o=tg(n,e.localServerPort);F({daemonMode:"disconnected",connected:!1,lastError:o}),console.error(`[worker] ${o}`),process.exitCode=1,setTimeout(()=>process.exit(1),20)}),r.listen(e.localServerPort,t,()=>{let n=rr(e.localServerPort),o=t==="127.0.0.1"?"":` (listening on ${t})`;console.log(`[worker] local console ${n}${o}`)}),r};var ng=new TextEncoder,og=new TextDecoder,ig=["preview.http.request.body.binary","preview.http.response.body.binary"],_o=e=>typeof e=="string"&&e.trim().length>0,sg=e=>{if(!e||typeof e!="object")return!1;let t=e;return!!(t.type&&ig.includes(t.type)&&_o(t.previewSessionId)&&_o(t.streamId)&&_o(t.sentAt)&&typeof t.seq=="number"&&Number.isInteger(t.seq)&&t.seq>=0)},Pa=(e,t)=>{let r=ng.encode(JSON.stringify(e)),n=new Uint8Array(4+r.byteLength+t.byteLength);return new DataView(n.buffer,n.byteOffset,4).setUint32(0,r.byteLength),n.set(r,4),n.set(t,4+r.byteLength),n},Ea=e=>{if(e.byteLength<4)return null;let t=new DataView(e.buffer,e.byteOffset,4).getUint32(0),r=4,n=r+t;if(t<=0||n>e.byteLength)return null;let o;try{o=JSON.parse(og.decode(e.subarray(r,n)))}catch{return null}return sg(o)?{header:o,payload:e.subarray(n)}:null};var ag=/^[A-Za-z]:[\\/]/u;var cg=e=>{let t=e?.trim();return t||void 0};var Ia=e=>{let t=cg(e);if(!t||t.startsWith("/")||t.startsWith("\\")||ag.test(t))return!1;let r=t.split(/[\\/]+/).filter(n=>n.length>0);return r.length===0?!1:r.every(n=>n!=="."&&n!=="..")};var lg=new Set(["connection","keep-alive","proxy-authenticate","proxy-authorization","te","trailer","transfer-encoding","upgrade","host","content-length"]),ba=32*1024,ct=new Map,Bo=new Map,sr=()=>new Date().toISOString(),At=(e,t)=>`${e}:${t}`,un=(e,t)=>{e.send(JSON.stringify(t))},dg=(e,t,r)=>{e.send(Pa(t,r))},ug=e=>!e||e==="/"?"":e.endsWith("/")?e.slice(0,-1):e,pg=(e,t)=>{let r=ug(e);return!r||t===r||t.startsWith(`${r}/`)?t||"/":`${r}${t||"/"}`},mg=(e,t)=>{let r=new URL(e),n=new URL(t,r);return n.pathname=pg(r.pathname,n.pathname),n.toString()},gg=e=>{let t=new Headers;for(let[r,n]of e)lg.has(r.toLowerCase())||t.set(r,n);return t},fg=e=>{if(e.binaryPayloads){dg(e.socket,{type:"preview.http.response.body.binary",previewSessionId:e.previewSessionId,streamId:e.streamId,sentAt:sr(),seq:e.seq},e.chunk);return}let t={type:"preview.http.response.body",previewSessionId:e.previewSessionId,streamId:e.streamId,sentAt:sr(),seq:e.seq,encoding:"base64",data:Buffer.from(e.chunk).toString("base64")};un(e.socket,t)},hg=e=>{let t=[],r=e.headers.getSetCookie;e.headers.forEach((n,o)=>{o.toLowerCase()!=="set-cookie"&&t.push([o,n])});for(let n of r?.call(e.headers)??[])t.push(["set-cookie",n]);return t},yg=e=>{kg(e)},kg=async e=>{let t=At(e.previewSessionId,e.streamId),r=new AbortController;Bo.set(t,r);try{let n=e.request.hasBody?new ReadableStream({start(a){e.request.bodyController=a}}):void 0,o=await fetch(mg(e.targetUrl,e.request.pathWithQuery),{method:e.request.method,headers:gg(e.request.headers),body:n,duplex:n?"half":void 0,signal:r.signal}),i={type:"preview.http.response.start",previewSessionId:e.previewSessionId,streamId:e.streamId,sentAt:sr(),status:o.status,headers:hg(o)};if(un(e.socket,i),o.body){let a=o.body.getReader(),c=0;for(;;){let{done:l,value:d}=await a.read();if(l)break;let m=d??new Uint8Array(0);for(let u=0;u<m.byteLength;u+=ba)fg({socket:e.socket,previewSessionId:e.previewSessionId,streamId:e.streamId,chunk:m.subarray(u,u+ba),seq:c,binaryPayloads:e.binaryPayloads}),c+=1}}let s={type:"preview.http.response.end",previewSessionId:e.previewSessionId,streamId:e.streamId,sentAt:sr()};un(e.socket,s)}catch(n){let o={type:"preview.http.abort",previewSessionId:e.previewSessionId,streamId:e.streamId,sentAt:sr(),code:r.signal.aborted?"client_closed":"upstream_connect_failed",message:n instanceof Error?n.message:"local preview upstream request failed"};un(e.socket,o)}finally{Bo.delete(t)}},Mt={handleStart(e){let t={method:e.frame.method,pathWithQuery:e.frame.pathWithQuery,headers:e.frame.headers,hasBody:e.frame.hasBody};ct.set(At(e.frame.previewSessionId,e.frame.streamId),t),yg({socket:e.socket,previewSessionId:e.frame.previewSessionId,streamId:e.frame.streamId,targetUrl:e.frame.targetUrl||e.targetUrl,request:t,binaryPayloads:e.binaryPayloads})},handleBody(e){let t=ct.get(At(e.previewSessionId,e.streamId));t&&t.bodyController?.enqueue(Buffer.from(e.data,"base64"))},handleBinaryBody(e,t){if(e.type!=="preview.http.request.body.binary")return;let r=ct.get(At(e.previewSessionId,e.streamId));r&&r.bodyController?.enqueue(t)},handleEnd(e){let t=At(e.frame.previewSessionId,e.frame.streamId),r=ct.get(t);r&&(ct.delete(t),r.bodyController?.close())},abort(e,t){let r=At(e,t),n=ct.get(r);ct.delete(r);try{n?.bodyController?.error(new Error("preview request aborted"))}catch{}Bo.get(r)?.abort()}};import{WebSocket as Ra}from"ws";var he=new Map,Ot=()=>new Date().toISOString(),Wo=(e,t)=>`${e}:${t}`,wg=e=>!e||e==="/"?"":e.endsWith("/")?e.slice(0,-1):e,xg=(e,t)=>{let r=wg(e);return!r||t===r||t.startsWith(`${r}/`)?t||"/":`${r}${t||"/"}`},Sg=(e,t)=>{let r=new URL(e),n=new URL(t,r);return n.protocol=r.protocol==="https:"?"wss:":"ws:",n.pathname=xg(r.pathname,n.pathname),n.toString()},vg=e=>{let t={};for(let[r,n]of e)t[r]=n;return t},ar=(e,t)=>{e.send(JSON.stringify(t))},Cg=e=>{if(!e.queuedFrames.length)return;let t=[...e.queuedFrames];e.queuedFrames.length=0;for(let r of t){if(r.opcode==="binary"){e.socket.send(Buffer.from(r.data,"base64"));continue}e.socket.send(r.data)}},pn=e=>{let t=Wo(e.previewSessionId,e.streamId),r=he.get(t);if(r){if(he.delete(t),e.notifyRemote!==!1){let n={type:"preview.ws.close",previewSessionId:e.previewSessionId,streamId:e.streamId,sentAt:Ot(),code:e.code,reason:e.reason};ar(r.tunnelSocket,n)}try{r.closedByControl=!0,r.socket.close(e.code,e.reason)}catch{r.socket.close()}}},Pg=e=>Buffer.isBuffer(e)?e.toString("base64"):Array.isArray(e)?Buffer.concat(e).toString("base64"):Buffer.from(e).toString("base64"),Eg=e=>typeof e=="string"?e:Buffer.isBuffer(e)?e.toString("utf8"):Array.isArray(e)?Buffer.concat(e).toString("utf8"):Buffer.from(new Uint8Array(e)).toString("utf8"),_t={open(e){let t=Wo(e.frame.previewSessionId,e.frame.streamId);pn({previewSessionId:e.frame.previewSessionId,streamId:e.frame.streamId,notifyRemote:!1});let r=new Ra(Sg(e.frame.targetUrl||e.targetUrl,e.frame.pathWithQuery),e.frame.subprotocols.length>0?e.frame.subprotocols:void 0,{headers:vg(e.frame.headers)}),n={previewSessionId:e.frame.previewSessionId,streamId:e.frame.streamId,socket:r,tunnelSocket:e.socket,opened:!1,nextSeq:0,queuedFrames:[],closedByControl:!1};he.set(t,n),r.on("open",()=>{let o=he.get(t);if(!o)return;o.opened=!0;let i={type:"preview.ws.opened",previewSessionId:o.previewSessionId,streamId:o.streamId,sentAt:Ot(),accepted:!0,selectedSubprotocol:o.socket.protocol||void 0};ar(o.tunnelSocket,i),Cg(o)}),r.on("message",(o,i)=>{let s=he.get(t);if(!s)return;let a=i?{type:"preview.ws.data",previewSessionId:s.previewSessionId,streamId:s.streamId,sentAt:Ot(),seq:s.nextSeq,opcode:"binary",encoding:"base64",data:Pg(o)}:{type:"preview.ws.data",previewSessionId:s.previewSessionId,streamId:s.streamId,sentAt:Ot(),seq:s.nextSeq,opcode:"text",encoding:"utf8",data:Eg(o)};s.nextSeq+=1,ar(s.tunnelSocket,a)}),r.on("close",(o,i)=>{let s=he.get(t);if(!s||(he.delete(t),s.closedByControl))return;let a={type:"preview.ws.close",previewSessionId:s.previewSessionId,streamId:s.streamId,sentAt:Ot(),code:o||void 0,reason:i.toString()||void 0};ar(s.tunnelSocket,a)}),r.on("error",()=>{let o=he.get(t);if(o&&!o.opened){he.delete(t);let i={type:"preview.ws.opened",previewSessionId:o.previewSessionId,streamId:o.streamId,sentAt:Ot(),accepted:!1,status:502,message:"local preview websocket connect failed"};ar(o.tunnelSocket,i)}})},handleData(e){let t=he.get(Wo(e.previewSessionId,e.streamId));if(t){if(!t.opened||t.socket.readyState!==Ra.OPEN){t.queuedFrames.push(e);return}if(e.opcode==="binary"){t.socket.send(Buffer.from(e.data,"base64"));return}t.socket.send(e.data)}},handleClose(e){pn({previewSessionId:e.previewSessionId,streamId:e.streamId,code:e.code,reason:e.reason,notifyRemote:!1})},closePreviewSession(e,t){for(let r of he.values())r.previewSessionId===e&&pn({previewSessionId:r.previewSessionId,streamId:r.streamId,code:1001,reason:t,notifyRemote:!1})},closeAll(e){for(let t of he.values())pn({previewSessionId:t.previewSessionId,streamId:t.streamId,code:1001,reason:e,notifyRemote:!1})}};var $e=new Map,Do=()=>new Date().toISOString(),Ig=e=>JSON.parse(e),bg=async e=>typeof e=="string"?null:e instanceof Uint8Array?e:e instanceof ArrayBuffer?new Uint8Array(e):typeof Blob<"u"&&e instanceof Blob?new Uint8Array(await e.arrayBuffer()):null,Bt=(e,t)=>{console.log("[preview-tunnel]",e,t)},Rg=e=>{try{let t=new URL(e);return`${t.protocol}//${t.host}${t.pathname}`}catch{return"invalid-url"}},Wt=e=>{e.send({type:"preview.tunnel.status",executorId:e.executorId,previewSessionId:e.previewSessionId,status:e.status,message:e.message,at:Do()})},mn=(e,t)=>{let r=$e.get(e);if(r){_t.closePreviewSession(e,t),r.closedByManager=!0;try{r.socket.close(1e3,t)}catch{r.socket.close()}$e.delete(e)}},Tg=e=>{if(e.frame.type==="preview.bind.ack"){let t=e.frame;if(!t.accepted){Bt("bind rejected",{previewSessionId:e.connection.previewSessionId,executorId:e.connection.executorId,reason:t.reason||"preview tunnel bind rejected"}),Wt({send:e.send,executorId:e.connection.executorId,previewSessionId:e.connection.previewSessionId,status:"error",message:t.reason||"preview tunnel bind rejected"}),mn(e.connection.previewSessionId,t.reason||"preview bind rejected");return}e.connection.binaryPayloads=t.binaryPayloads===!0,Bt("bind accepted",{previewSessionId:e.connection.previewSessionId,executorId:e.connection.executorId,publicHost:t.publicHost,binaryPayloads:e.connection.binaryPayloads}),Wt({send:e.send,executorId:e.connection.executorId,previewSessionId:e.connection.previewSessionId,status:"open"});return}if(e.frame.type==="preview.tunnel.ping"){let t=e.frame;e.connection.socket.send(JSON.stringify({type:"preview.tunnel.pong",previewSessionId:e.connection.previewSessionId,sentAt:Do(),pingId:t.pingId}));return}if(e.frame.type==="preview.http.request.start"){Mt.handleStart({frame:e.frame,socket:e.connection.socket,targetUrl:e.connection.targetUrl,binaryPayloads:e.connection.binaryPayloads});return}if(e.frame.type==="preview.http.request.body"){Mt.handleBody(e.frame);return}if(e.frame.type==="preview.http.request.end"){Mt.handleEnd({frame:e.frame});return}if(e.frame.type==="preview.http.abort"){Mt.abort(e.frame.previewSessionId,e.frame.streamId);return}if(e.frame.type==="preview.ws.open"){_t.open({frame:e.frame,socket:e.connection.socket,targetUrl:e.connection.targetUrl});return}if(e.frame.type==="preview.ws.data"){_t.handleData(e.frame);return}e.frame.type==="preview.ws.close"&&_t.handleClose(e.frame)},Ag=e=>{if(e.header.previewSessionId!==e.connection.previewSessionId){e.connection.socket.close(4410,"preview session mismatch");return}e.header.type==="preview.http.request.body.binary"&&Mt.handleBinaryBody(e.header,e.payload)},Dt={open(e,t,r){mn(e.previewSessionId,"replaced"),Wt({send:r,executorId:t.executorId,previewSessionId:e.previewSessionId,status:"connecting"});let n=e.tunnelUrl?.trim()||Zi(t.cloudUrl),o=`${n}?preview_session_id=${encodeURIComponent(e.previewSessionId)}&token=${encodeURIComponent(e.tunnelToken)}`,i=new WebSocket(o),s={socket:i,previewSessionId:e.previewSessionId,executorId:t.executorId,closedByManager:!1,targetUrl:e.targetUrl,binaryPayloads:!1};$e.set(e.previewSessionId,s),Bt("connecting",{previewSessionId:e.previewSessionId,executorId:t.executorId,tunnelUrl:Rg(n),targetUrl:e.targetUrl}),i.addEventListener("open",()=>{let a=$e.get(e.previewSessionId);if(!a||a.socket!==i)return;Bt("websocket open",{previewSessionId:e.previewSessionId,executorId:t.executorId});let c={type:"preview.bind",previewSessionId:e.previewSessionId,sentAt:Do(),protocolVersion:"preview-tunnel.v1",executorId:t.executorId,binaryPayloads:!0};i.send(JSON.stringify(c))}),i.addEventListener("message",a=>{let c=$e.get(e.previewSessionId);!c||c.socket!==i||(async()=>{let l=await bg(a.data);if(l){if(!c.binaryPayloads)throw new Error("preview tunnel binary payloads not negotiated");let d=Ea(l);if(!d)throw new Error("invalid preview tunnel binary frame");Ag({header:d.header,payload:d.payload,connection:c});return}Tg({frame:Ig(String(a.data)),connection:c,send:r})})().catch(l=>{Wt({send:r,executorId:t.executorId,previewSessionId:e.previewSessionId,status:"error",message:l instanceof Error?l.message:"invalid preview tunnel frame"})})}),i.addEventListener("error",()=>{let a=$e.get(e.previewSessionId);!a||a.socket!==i||(Bt("websocket error",{previewSessionId:e.previewSessionId,executorId:t.executorId}),Wt({send:r,executorId:t.executorId,previewSessionId:e.previewSessionId,status:"error",message:"preview tunnel websocket error"}))}),i.addEventListener("close",a=>{let c=$e.get(e.previewSessionId);!c||c.socket!==i||($e.delete(e.previewSessionId),Bt("websocket closed",{previewSessionId:e.previewSessionId,executorId:t.executorId,code:a.code,reason:a.reason?.trim()||void 0,closedByManager:c.closedByManager}),Wt({send:r,executorId:t.executorId,previewSessionId:e.previewSessionId,status:"closed",message:c.closedByManager?void 0:a.reason?.trim()||`code=${a.code}`}))})},close(e,t){mn(e,t)},closeAll(e){_t.closeAll(e);for(let t of $e.keys())mn(t,e)}};import{accessSync as Mg,constants as Og,mkdirSync as _g}from"node:fs";var Bg=()=>Ge()==="preview"?"vibemux-worker-preview":"vibemux-worker",Wg=e=>{try{return _g(e,{recursive:!0}),Mg(e,Og.W_OK),{ok:!0,detail:`Writable: ${e}`}}catch(t){return{ok:!1,detail:t instanceof Error?t.message:"path access failed"}}},Dg=e=>{try{return{ok:!0,detail:`Ready: ${rn(e).root}`}}catch(t){return{ok:!1,detail:t instanceof Error?t.message:"workspace setup failed"}}},Ng=async e=>{try{let t=await fetch(e,{method:"GET",signal:AbortSignal.timeout(5e3)});return{ok:!0,status:t.status,message:`Control plane reachable, HTTP ${t.status}`}}catch(t){return{ok:!1,status:void 0,message:t instanceof Error?t.message:"cloud probe failed"}}},$g=async()=>{try{let e=await fetch("https://opencode.ai",{method:"GET",signal:AbortSignal.timeout(5e3)});return{ok:e.ok,status:e.status,url:"https://opencode.ai",message:e.ok?`Official site reachable, HTTP ${e.status}`:`Official site returned an unexpected status, HTTP ${e.status}`}}catch(e){return{ok:!1,status:void 0,url:"https://opencode.ai",message:e instanceof Error?e.message:"official site probe failed"}}},Ug=e=>{let t=e.filter(n=>n.ok).length,r=e.length-t;return{total:e.length,passed:t,failed:r,ok:r===0}},Ta=async()=>{let e=b(),[t,r,n]=await Promise.all([Ng(e.cloudUrl),$g(),xe({target:"all"})]),o=Wg(Ee()),i=Dg(e.workspaceRoot),s=n.items.find(k=>k.id==="git")??{ok:!1,detail:"Git status is unknown."},a=n.items.find(k=>k.id==="opencode")??{ok:!1,detail:"OpenCode runtime status is unknown."},c=n.items.find(k=>k.id==="codex-cli")??{ok:!1,detail:"Codex CLI status is unknown."},l=n.items.find(k=>k.id==="codex-auth")??{ok:!1,detail:"Codex sign-in status is unknown."},d=n.items.find(k=>k.id==="claude-cli")??{ok:!1,detail:"Claude Code CLI status is unknown."},m=n.items.find(k=>k.id==="claude-auth")??{ok:!1,detail:"Claude Code authentication status is unknown."},u=!!e.opencodeConfigContent?.trim(),p=!!e.codexConfigContent?.trim(),f=!!e.claudeCodeConfigContent?.trim(),x=[{id:"git",category:"tooling",label:"Git",ok:s.ok,detail:s.detail,hint:s.ok?void 0:"Install Git first and confirm it is executable from PATH."},{id:"opencode",category:"tooling",label:"OpenCode Runtime",ok:a.ok,detail:a.detail,hint:a.ok?void 0:"Check the worker dependency installation and confirm both `@opencode-ai/sdk` and the local `opencode` runtime are available."},{id:"codex-cli",category:"tooling",label:"Codex CLI",ok:c.ok,detail:c.detail,hint:c.ok?void 0:"Install the Codex CLI first. The worker can also run `npm install -g @openai/codex` automatically."},{id:"codex-auth",category:"tooling",label:"Codex Sign-In",ok:l.ok,detail:l.detail,hint:l.ok?void 0:"Run `codex` and complete sign-in before trying again."},{id:"claude-cli",category:"tooling",label:"Claude Code CLI",ok:d.ok,detail:d.detail,hint:d.ok?void 0:"Install the Claude Code CLI first. The worker prefers the official native install flow."},{id:"claude-auth",category:"tooling",label:"Claude Code Authentication",ok:m.ok,detail:m.detail,hint:m.ok?void 0:"Configure Claude Console/API credentials, or run `claude` and complete sign-in before trying again."},{id:"opencode-config",category:"config",label:"OpenCode Configuration",ok:u,detail:u?"Loaded the OpenCode providers configuration.":"OpenCode providers configuration was not found.",hint:u?void 0:"Add the OpenCode providers JSON in central settings or on this worker machine."},{id:"codex-config",category:"config",label:"Codex Configuration",ok:p,detail:p?"Loaded `Codex config.toml`.":"`Codex config.toml` was not found.",hint:p?void 0:"Provide it through central settings, or prepare `~/.codex/config.toml` on this worker machine."},{id:"claude-config",category:"config",label:"Claude Code Configuration",ok:f,detail:f?"Loaded `Claude Code settings.json`.":"`Claude Code settings.json` was not found.",hint:f?void 0:"Provide it through central settings, or prepare `~/.claude/settings.json` on this worker machine."},{id:"worker-home",category:"filesystem",label:"Worker Home",ok:o.ok,detail:o.detail,hint:o.ok?void 0:"Check directory permissions and confirm the worker home can be created and written."},{id:"workspace",category:"filesystem",label:"Workspace",ok:i.ok,detail:i.detail,hint:i.ok?void 0:"Confirm the workspace root path is valid and writable by the current user."},{id:"machine-id",category:"config",label:"Machine ID",ok:!!e.machineId,detail:e.machineId?`Configured: ${e.machineId}`:"Machine ID is not configured.",hint:e.machineId?void 0:"Reset the local worker config and start the worker again to generate a fresh machine ID."},{id:"pairing",category:"config",label:"Pairing",ok:!!(e.executorId&&e.executorToken),detail:e.executorId?`Paired: ${e.executorId}`:"Pairing has not been completed.",hint:e.executorId?void 0:`Run \`npx -y ${Bg()} connect --pairing-code <CODE>\`, or enter the pairing code in the local worker console.`},{id:"cloud-url",category:"network",label:"Control Plane URL",ok:!!e.cloudUrl?.trim(),detail:e.cloudUrl?.trim()||"Cloud URL is not configured.",hint:e.cloudUrl?.trim()?void 0:"Enter the control-plane Cloud URL first."},{id:"cloud-reachable",category:"network",label:"Control Plane Reachability",ok:t.ok,detail:t.message,hint:t.ok?void 0:"Confirm the control-plane service is running and reachable from this machine."},{id:"official-site",category:"network",label:"OpenCode Official Site",ok:r.ok,detail:r.message,hint:r.ok?void 0:"If the official site is unreachable, the current network likely has outbound access restrictions."}];return{config:mo(e),checks:{git:s.ok,opencodeAvailable:a.ok,codexCliAvailable:c.ok,codexAuthenticated:l.ok,claudeCliAvailable:d.ok,claudeAuthenticated:m.ok,opencodeConfigLoaded:u,codexConfigLoaded:p,claudeConfigLoaded:f,workerHomeWritable:o.ok,workspaceConfigured:!!e.workspaceRoot,workspaceReady:i.ok,machineIdConfigured:!!e.machineId,paired:!!(e.executorId&&e.executorToken),cloudUrlConfigured:!!e.cloudUrl?.trim(),cloudReachable:t.ok,officialSiteReachable:r.ok},items:x,summary:Ug(x),cloudProbe:t,officialSiteProbe:r,runtime:Ct()}},No=async()=>{console.log(JSON.stringify(await Ta(),null,2))},Tt=()=>Ta();import{existsSync as Lg,statfsSync as jg}from"node:fs";import ve from"node:os";import Aa from"node:path";var Ma=null,Oa=(e,t=1)=>{let r=10**t;return Math.round(e*r)/r},Fg=()=>ve.cpus().reduce((e,t)=>{let r=t.times.user+t.times.nice+t.times.sys+t.times.idle+t.times.irq;return{idle:e.idle+t.times.idle,total:e.total+r}},{idle:0,total:0}),qg=()=>{let e=ve.cpus(),t=Fg(),r=Ma;Ma=t;let n=e.reduce((i,s)=>i+(Number.isFinite(s.speed)?s.speed:0),0),o=(()=>{if(!r)return;let i=t.total-r.total,s=t.idle-r.idle;if(!(i<=0))return Oa((1-s/i)*100,1)})();return{coreCount:e.length,model:e[0]?.model,averageSpeedMhz:e.length>0?Math.round(n/e.length):void 0,loadAverage:ve.loadavg().map(i=>Oa(i,2)),usagePercent:o}},Gg=()=>{let e=ve.totalmem(),t=ve.freemem();return{totalBytes:e,freeBytes:t,usedBytes:Math.max(0,e-t)}},Hg=e=>{let t=Aa.resolve(e||process.cwd());for(;!Lg(t);){let r=Aa.dirname(t);if(r===t)return process.cwd();t=r}return t},zg=e=>{try{let t=Hg(e),r=jg(t),n=Number(r.bsize),o=Number(r.blocks),i=Number(r.bfree),s=Number(r.bavail);if(!Number.isFinite(n)||!Number.isFinite(o)||n<=0||o<=0)return;let a=o*n,c=Math.max(0,i*n),l=Math.max(0,s*n);return{path:t,totalBytes:a,freeBytes:c,availableBytes:l,usedBytes:Math.max(0,a-c)}}catch{return}},Kg=e=>({platform:process.platform,arch:ve.arch(),hostname:ve.hostname(),release:ve.release(),version:typeof ve.version=="function"?ve.version():void 0,nodeVersion:process.version,workerVersion:e,systemUptimeSec:Math.max(0,Math.round(ve.uptime())),processUptimeSec:Math.max(0,Math.round(process.uptime()))}),gn=e=>({capturedAt:new Date().toISOString(),cpu:qg(),memory:Gg(),disk:zg(e.workspaceRoot),system:Kg(e.workerVersion)});import{createHash as Qg}from"node:crypto";import Zg from"node:net";import{spawn as ef}from"node:child_process";import{createOpencodeClient as Ga}from"@opencode-ai/sdk";var Jg=e=>Array.isArray(e)?e:[],Vg=e=>e.info?.role==="assistant",lr=e=>e.info?.time?.created??0,Xg=(e,t)=>t===void 0?!0:lr(e)>=t,$o=(e,t={})=>e.filter(r=>Vg(r)&&Xg(r,t.promptStartedAtMs)).sort((r,n)=>lr(n)-lr(r)),Ba=(e,t={})=>t.preferredMessageId?e.filter(r=>r.info?.id===t.preferredMessageId):$o(e,t).slice().sort((r,n)=>lr(r)-lr(n)),cr=e=>Jg(e).filter(t=>t.type==="text").map(t=>t.text?.trim()??"").filter(Boolean).join(`
55
-
56
- `),Wa=(e,t={})=>{let r=t.preferredMessageId?e.find(i=>i.info?.id===t.preferredMessageId):void 0,n=cr(r?.parts);if(n)return n;let o=$o(e,t).find(i=>cr(i.parts));return o?cr(o.parts):""},_a=e=>!!e?.info?.time?.completed||!!e?.info?.error,Da=(e,t={})=>{let r=t.preferredMessageId?e.find(n=>n.info?.id===t.preferredMessageId):void 0;return r&&_a(r)?!0:$o(e,t).some(n=>_a(n))};var te=(e,t)=>{console.log(`[worker-opencode] ${e}`,JSON.stringify(t))},Ce=e=>{if(e instanceof Error)return e.message;if(typeof e=="string")return e;if(e&&typeof e=="object"){let t=e;if(typeof t.message=="string"&&t.message.trim())return t.message;if(typeof t.data?.message=="string"&&t.data.message.trim())return t.data.message;if(typeof t.error?.message=="string"&&t.error.message.trim())return t.error.message;if(typeof t.error?.data?.message=="string"&&t.error.data.message.trim())return t.error.data.message}return"OpenCode \u6267\u884C\u5931\u8D25\u3002"},$a=e=>{if(!e)return;let[t,...r]=e.split("/"),n=r.join("/");if(!(!t||!n))return{providerID:t,modelID:n}},Na=e=>Array.isArray(e)?e:[],Yg=e=>cr(e),Ua=e=>e.map(t=>({id:t.info?.id,role:t.info?.role,created:t.info?.time?.created,completed:!!t.info?.time?.completed,error:!!t.info?.error,partTypes:Na(t.parts).map(r=>r.type),textPreview:Yg(Na(t.parts)).slice(0,160)})),Uo=(e,t,r)=>Wa(e,{preferredMessageId:t,promptStartedAtMs:r}),La=(e,t,r)=>Ba(e,{preferredMessageId:t,promptStartedAtMs:r}),Lo=(e,t,r)=>Da(e,{preferredMessageId:t,promptStartedAtMs:r}),ja=e=>[...e.values()].join("").trim(),Fa=(e,t)=>{let r=e.get(t);if(r)return r;let n=new Map;return e.set(t,n),n},jo=async e=>new Promise(t=>setTimeout(t,e)),Fo=e=>{let t=e?.trim();if(!(!t||t.toLowerCase()==="default")){if(t.startsWith("{")||t.startsWith("[")||t.startsWith('"'))try{let r=JSON.parse(t);if(typeof r=="string")return Fo(r);if(r&&typeof r=="object")return r}catch{}switch(t.toLowerCase()){case"auto":case"allow":case"approve":case"acceptedits":case"bypasspermissions":case"yolo":return"allow";case"ask":case"prompt":case"manual":return"ask";case"deny":case"disabled":case"forbid":return"deny";default:return}}},qa=e=>e&&"permissionPolicy"in e?e:void 0;var qo=new Map,tf=e=>Object.entries(e??{}).sort(([t],[r])=>t.localeCompare(r)),rf=(e,t)=>Qg("sha1").update(JSON.stringify({config:pe(e),runtimeEnv:tf(t)})).digest("hex"),nf=(e,t,r=process.env)=>({...r,...t??{},OPENCODE_CONFIG_CONTENT:JSON.stringify(pe(e))}),of=()=>{let e=ne(`${se()}/node_modules/.bin/opencode`),t=ne("opencode")||e;if(t)return{command:t,args:[],detail:t};let r=ne("npx");if(r)return{command:r,args:["-y","opencode-ai"],detail:`${r} -y opencode-ai`};throw new Error("\u672A\u68C0\u6D4B\u5230\u53EF\u6267\u884C\u7684 OpenCode runtime\uFF08`opencode`\uFF09\uFF0C\u65E0\u6CD5\u542F\u52A8 OpenCode \u4F1A\u8BDD\u3002")},sf=async()=>new Promise((e,t)=>{let r=Zg.createServer();r.on("error",t),r.listen(0,"127.0.0.1",()=>{let n=r.address();if(!n||typeof n=="string"){r.close(()=>t(new Error("\u65E0\u6CD5\u5206\u914D OpenCode \u7AEF\u53E3\u3002")));return}let{port:o}=n;r.close(i=>{if(i){t(i);return}e(o)})})}),af=async(e,t)=>{let r=await sf(),n=of(),o=ef(n.command,[...n.args,"serve","--hostname=127.0.0.1",`--port=${r}`],{env:nf(e,t),stdio:["ignore","pipe","pipe"]});return{url:await new Promise((s,a)=>{let c=setTimeout(()=>{a(new Error(`Timeout waiting for server to start after 15000ms via ${n.detail}`))},15e3),l="",d=!1,m=p=>{d||(d=!0,clearTimeout(c),p())},u=p=>{l+=p.toString();let f=l.split(`
57
- `);for(let x of f){if(!x.startsWith("opencode server listening"))continue;let k=x.match(/on\s+(https?:\/\/[^\s]+)/);if(!k){m(()=>a(new Error(`Failed to parse server url from output: ${x}`)));return}m(()=>s(k[1]));return}};o.stdout?.on("data",u),o.stderr?.on("data",u),o.on("error",p=>{m(()=>a(p))}),o.on("exit",p=>{m(()=>{let f=l.trim();a(new Error(f?`OpenCode server exited with code ${p}: ${f}`:`OpenCode server exited with code ${p}`))})})}),close(){o.kill()}}},Ha=async(e,t)=>{let r=rf(e,t),n=qo.get(r);if(n)return n;let o=af(e,t).catch(i=>{throw qo.delete(r),i});return qo.set(r,o),o},za=async(e,t,r)=>{let n=await Ha(t,r);return Ga({baseUrl:n.url,directory:e})},Ka=async(e,t)=>{let r=await Ha(e,t);return Ga({baseUrl:r.url})},Go=async(e,t,r)=>{te("session:create:start",{cwd:t,title:r});let n;try{n=await e.session.create({body:{title:r},query:{directory:t}})}catch(o){throw te("session:create:error",{cwd:t,title:r,error:Ce(o)}),o}if(te("session:create:result",{cwd:t,title:r,hasData:!!n.data,sessionId:n.data?.id,error:"error"in n?n.error:void 0,response:"response"in n?n.response:void 0}),!n.data?.id){let o=Ce(n);throw new Error(o==="OpenCode \u6267\u884C\u5931\u8D25\u3002"?"OpenCode \u4F1A\u8BDD\u521B\u5EFA\u5931\u8D25":`OpenCode \u4F1A\u8BDD\u521B\u5EFA\u5931\u8D25\uFF1A${o}`)}return n.data.id},Ja=async(e,t,r,n)=>{let o=r?.trim();if(!o)return Go(e,t,n);try{return(await e.session.get({path:{id:o},query:{directory:t}})).data?(await e.session.update({path:{id:o},body:{title:n},query:{directory:t}}),o):Go(e,t,n)}catch{return Go(e,t,n)}};var cf=(e,t,r)=>({id:`${e}/${t}`,label:`${e}/${t}`,providerId:e,modelId:t,isDefault:r===`${e}/${t}`}),lf=e=>Array.isArray(e)?e.map(t=>{if(!(!t||typeof t!="object"))return"id"in t&&typeof t.id=="string"?t.id:void 0}).filter(t=>!!t):!e||typeof e!="object"?[]:Object.entries(e).map(([t,r])=>!r||typeof r!="object"?t:"id"in r&&typeof r.id=="string"?r.id:t).filter(t=>!!t),df=(e,t)=>{if(!e||typeof e!="object")return[];let r=e,n=["cloudflare","cf Workers","cf"];return(Array.isArray(r.providers)?r.providers:[...Object.entries(r.providers??{}).map(([i,s])=>({id:s.id||s.name||i,models:s.models})),...Object.entries(r.provider??{}).map(([i,s])=>({id:s.id||s.name||i,models:s.models}))]).filter(i=>{let s=i.id?.toLowerCase()??"";return!n.some(a=>s.includes(a.toLowerCase()))}).flatMap(i=>{let s=i.id;return s?lf(i.models).map(a=>cf(s,a,t)):[]}).sort((i,s)=>i.isDefault?-1:s.isDefault?1:i.label.localeCompare(s.label))},Ho=async()=>{let e=b(),t=Fr(e).trim(),r=e.defaultModel?.trim()||void 0;if(!t)return{models:[],defaultModel:r,message:"worker \u672A\u914D\u7F6E OpenCode \u63D0\u4F9B\u5546\u3002"};try{let o=await(await Ka(t)).config.providers(),i="data"in o?o.data:o,s=Object.entries(i?.default??{}).find(([,c])=>!!c),a=s?`${s[0]}/${s[1]}`:r;return{models:df(i,a),defaultModel:a,message:void 0}}catch(n){return te("models:error",{error:Ce(n)}),{models:[],defaultModel:r,message:Ce(n)}}};import{existsSync as pf}from"node:fs";var Va=e=>{let t=e,r=t.payload&&typeof t.payload=="object"?t.payload:t;return!r.type||!r.properties?null:{type:r.type,properties:r.properties}};var fn=e=>ne(e),dr=e=>{try{return JSON.parse(e)}catch{return null}},M=(e,t,r)=>{t?.({agentType:e,...r})},Xa=e=>{let t=e?.reason;return typeof t=="string"?t:t&&typeof t=="object"&&"reason"in t&&typeof t.reason=="string"?t.reason:"unknown"},uf=e=>{let t=e?.reason;if(typeof t=="string")return t==="user_stop"?"\u5DF2\u505C\u6B62":"\u4EFB\u52A1\u5DF2\u53D6\u6D88";if(t&&typeof t=="object"&&"message"in t&&typeof t.message=="string"&&t.message.trim())return t.message;switch(Xa(e)){case"user_stop":return"\u5DF2\u505C\u6B62";case"server_timeout":return"\u8BF7\u6C42\u8D85\u65F6\uFF0C\u5DF2\u4E2D\u6B62\u672C\u6B21\u56DE\u590D\u3002";case"executor_disconnected":return"\u6267\u884C\u5668\u5FC3\u8DF3\u8D85\u65F6\uFF0C\u5DF2\u4E2D\u6B62\u672C\u6B21\u56DE\u590D\u3002";case"executor_reconnect":return"\u6267\u884C\u5668\u8FDE\u63A5\u5DF2\u65AD\u5F00\uFF0C\u5DF2\u4E2D\u6B62\u672C\u6B21\u56DE\u590D\u3002";case"control_plane_disconnect":return"\u6267\u884C\u5668\u4E0E\u63A7\u5236\u9762\u8FDE\u63A5\u5DF2\u65AD\u5F00\uFF0C\u672C\u6B21\u56DE\u590D\u5DF2\u4E2D\u6B62\u3002";case"server_abort":return"\u8BF7\u6C42\u5DF2\u4E2D\u6B62";default:return"\u4EFB\u52A1\u5DF2\u53D6\u6D88"}},Pe=e=>{let t=new Error(uf(e));return t.name="AbortError",t.abortReason=Xa(e),t},Ue=e=>{let t=e?.trim();if(!(!t||t==="default"))return t};var Ya=500,Qa=12e4,zo=1e3,Za=async(e,t,r)=>{try{let n=await e.session.messages({path:{id:r},query:{directory:t,limit:20}});return Ua(Array.isArray(n.data)?n.data:[])}catch(n){return[{snapshotError:Ce(n)}]}},mf=e=>{let r={...pe(e.baseConfigContent)},n=e.agent?.trim()||void 0,o=Fo(e.permissionPolicy),i=e.variant?.trim()||void 0;if(n&&typeof r.default_agent!="string"&&(r.default_agent=n),!o&&!i)return JSON.stringify(r);if(!n)return o&&(r.permission=o),JSON.stringify(r);let s=r.agent&&typeof r.agent=="object"&&!Array.isArray(r.agent)?r.agent:{},a=s[n];return r.agent={...s,[n]:a&&typeof a=="object"&&!Array.isArray(a)?{...a,...o?{permission:o}:{},...i?{variant:i}:{}}:{...o?{permission:o}:{},...i?{variant:i}:{}}},JSON.stringify(r)},gf=e=>{let t=b(),r=qa(e.agentSettings),n=e.opencodeConfig?.agent?.trim()||r?.agent?.trim()||void 0,o=e.opencodeConfig?.variant?.trim()||void 0,i=e.opencodeConfig?.permissionPolicy?.trim()||r?.permissionPolicy?.trim()||void 0,s=e.executionModel?.trim()||e.opencodeConfig?.model?.trim()||r?.defaultModel?.trim()||void 0,a=Array.isArray(e.mcpServers),l=[...e.mcpServers??t.mcpServers??[],...e.opencodeConfig?.mcpServers??[]],d=a||e.opencodeConfig?.mcpServers?.length?Dr(t.opencodeConfigContent,l,{cloudUrl:t.cloudUrl,executorToken:t.executorToken,actingUserId:e.actingUserId}).trim():Fr(t,e.actingUserId).trim();return{agent:n,variant:o,executionModel:s,configContent:mf({baseConfigContent:d,agent:n,permissionPolicy:i,variant:o})}},ec=e=>{let t=e instanceof Error?e.message:typeof e=="string"?e:"";return/\babort(ed|ing)?\b/i.test(t)},ff=(e,t)=>{let r=e?.data;if(!(!r||typeof r!="object"))return t in r?r[t]:void 0},tc=async e=>{if(!pf(e.cwd))throw new Error(`\u5DE5\u4F5C\u76EE\u5F55\u4E0D\u5B58\u5728: ${e.cwd}`);let t=gf({actingUserId:e.actingUserId,executionModel:e.executionModel,agentSettings:e.agentSettings,opencodeConfig:e.opencodeConfig,mcpServers:e.mcpServers}),r=await za(e.cwd,t.configContent,e.runtimeEnv),n=await Ja(r,e.cwd,e.resumeSessionId,e.title),o=Date.now(),i=!1,s=null,a=new Map,c=!1,l="",d=new AbortController,m=new Set,u=new Set,p=new Map,f=new Map,x="",k=!1,g=!1,R=()=>{i=!0,d.abort(),r.session.abort({path:{id:n},query:{directory:e.cwd}}).catch(()=>{})};e.signal?.addEventListener("abort",R,{once:!0});try{let C=(S,I)=>S.sessionID&&S.sessionID!==n||S.role!=="assistant"||!S.id?!1:S.time?.created!==void 0&&S.time.created<Math.max(0,o-zo)?(u.add(S.id),!1):(l=S.id,c=!0,I==="stream"&&te("event:message-updated",{sessionId:n,assistantMessageId:l,role:S.role}),!0),E=(S,I)=>S.sessionID&&S.sessionID!==n||S.messageID&&u.has(S.messageID)||(!l&&S.messageID&&(l=S.messageID),l&&S.messageID&&S.messageID!==l)?!1:(c=!0,I==="stream"&&te("event:message-part",{sessionId:n,assistantMessageId:l,partId:S.id,messageId:S.messageID,partType:S.type,textPreview:(S.text??"").slice(0,120)}),S.type==="text"&&S.messageID&&S.id&&Fa(a,S.messageID).set(S.id,S.text??""),!0),j=(S,I,A)=>{let h=I?.type?JSON.stringify(I):"";h&&h!==x&&(x=h,e.onEvent?.({type:"session.status",properties:{sessionID:n,status:I}}));let P=La(S,l,A).filter(T=>T.info?.role==="assistant"&&T.info?.id);for(let T of P){let y=T.info;if(y?.id){m.has(y.id)||(m.add(y.id),e.onEvent?.({type:"message.updated",properties:{info:y}})),C(y,"snapshot");for(let v of T.parts??[]){if(v.type!=="text"&&v.type!=="reasoning"&&v.type!=="tool")continue;let w=v.id?v:{...v,id:`${T.info?.id}:${v.type}:${v.tool??"part"}`},B=JSON.stringify({type:w.type,text:w.text??"",tool:w.tool??"",state:w.state??null,time:w.time??null});if(p.get(w.id)===B)continue;p.set(w.id,B);let de=f.get(w.id)??"",mt=w.text??"";(w.type==="text"||w.type==="reasoning")&&f.set(w.id,mt);let Yi=mt&&mt.startsWith(de)?mt.slice(de.length):void 0;e.onEvent?.({type:"message.part.updated",properties:Yi===void 0?{part:w}:{part:w,delta:Yi}}),E(w,"snapshot")}}}},O=async()=>{for(;!g&&!i&&!e.signal?.aborted&&Date.now()-o<Qa;){try{let[S,I]=await Promise.all([r.session.messages({path:{id:n},query:{directory:e.cwd,limit:20}}),r.session.status({query:{directory:e.cwd}}).catch(()=>null)]),A=Array.isArray(S.data)?S.data:[],h=ff(I,n),P=l?void 0:Math.max(0,o-zo),T=h?.type==="busy",y=Uo(A,l,P),v=Lo(A,l,P);if(j(A,h,P),y&&(c=!0),!T&&v){k||(k=!0,e.onEvent?.({type:"session.idle",properties:{sessionID:n}})),d.abort();break}}catch(S){if(g||i||e.signal?.aborted||ec(S))return}if(g||i||e.signal?.aborted)return;await jo(Ya)}};te("prompt:start",{cwd:e.cwd,title:e.title,executionModel:t.executionModel??"default",agent:t.agent??"default",variant:t.variant??"default",promptPreview:e.prompt.slice(0,200)});let H=await r.event.subscribe({signal:d.signal});te("prompt:subscribed",{cwd:e.cwd,sessionId:n});let D=r.session.promptAsync({path:{id:n},query:{directory:e.cwd},body:{model:$a(t.executionModel),agent:t.agent,parts:[{type:"text",text:e.prompt}]}}).catch(S=>{i||e.signal?.aborted||(s=S instanceof Error?S:new Error(Ce(S)),g=!0,te("prompt:async-error",{cwd:e.cwd,sessionId:n,error:s.message}),d.abort())}),U=O();try{for await(let S of H.stream){if(i||e.signal?.aborted)throw Pe(e.signal);let I=Va(S);if(I){if(I.type==="permission.updated"&&e.onEvent?.({type:"permission.updated",properties:I.properties}),I.type==="session.status"){e.onEvent?.({type:"session.status",properties:I.properties}),I.properties.sessionID===n&&(c=!0,te("event:session-status",{sessionId:n,status:I.properties.status}));continue}if(I.type==="message.updated"){e.onEvent?.({type:"message.updated",properties:I.properties});let A=I.properties.info;C(A,"stream");continue}if(I.type==="message.part.updated"){e.onEvent?.({type:"message.part.updated",properties:I.properties});let A=I.properties.part;E(A,"stream");continue}if(I.type==="session.error"){e.onEvent?.({type:"session.error",properties:I.properties});let A=I.properties;if(A.sessionID!==n)continue;throw te("event:session-error",{sessionId:n,error:A.error}),new Error(Ce(A.error))}if(I.type==="session.idle"&&(e.onEvent?.({type:"session.idle",properties:I.properties}),I.properties.sessionID===n&&c)){k=!0,te("event:session-idle",{sessionId:n,assistantMessageId:l,textPartCount:l?a.get(l)?.size??0:0});break}}}}catch(S){if(!(i||e.signal?.aborted||k||ec(S)))throw S}if(await U,g=!0,d.abort(),await D,i||e.signal?.aborted)throw Pe(e.signal);if(s)throw s;let L=l?ja(a.get(l)??new Map):"";if(!L)for(let S=0;S===0||Date.now()-o<Qa;S+=1){S>0&&await jo(Ya);let[I,A]=await Promise.all([r.session.messages({path:{id:n},query:{directory:e.cwd,limit:20}}),r.session.status({query:{directory:e.cwd}}).catch(()=>null)]),h=Array.isArray(I.data)?I.data:[],P=l?void 0:Math.max(0,o-zo),y=(A?.data&&typeof A.data=="object"&&n in A.data?A.data[n]:void 0)?.type==="busy";L=Uo(h,l,P);let v=Lo(h,l,P);if(L&&!y&&v||!y&&v)break}let K=L?void 0:await Za(r,e.cwd,n);return te("prompt:finish",{cwd:e.cwd,sessionId:n,assistantMessageId:l,sawRelevantActivity:c,snapshotSettled:k,emptyOutputSnapshot:K,outputPreview:(L||"OpenCode \u672A\u8FD4\u56DE\u6587\u672C\u8F93\u51FA\u3002").slice(0,200)}),{sessionId:n,output:L||"OpenCode \u672A\u8FD4\u56DE\u6587\u672C\u8F93\u51FA\u3002"}}catch(C){throw g=!0,te("prompt:error",{cwd:e.cwd,sessionId:n,assistantMessageId:l,aborted:i,error:Ce(C),snapshot:await Za(r,e.cwd,n)}),C}finally{e.signal?.removeEventListener("abort",R)}},Ko=async e=>{let t=[`\u4EFB\u52A1\u6807\u9898: ${e.title}`,`\u4EFB\u52A1\u63CF\u8FF0: ${e.description}`,"","\u8BF7\u76F4\u63A5\u5728\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u5B8C\u6210\u4EFB\u52A1\u6240\u9700\u4FEE\u6539\u3002","\u5982\u679C\u9700\u8981\u8BFB\u53D6\u4EE3\u7801\u3001\u7F16\u8F91\u6587\u4EF6\u3001\u8FD0\u884C\u6D4B\u8BD5\u6216\u751F\u6210\u8865\u4E01\uFF0C\u8BF7\u76F4\u63A5\u6267\u884C\u3002","\u5B8C\u6210\u540E\u8BF7\u8FD4\u56DE\u7B80\u6D01\u603B\u7ED3\uFF1A\u505A\u4E86\u4EC0\u4E48\u3001\u662F\u5426\u8FD8\u6709\u963B\u585E\u3002"].join(`
58
- `);return tc({actingUserId:e.actingUserId,cwd:e.cwd,title:`Task: ${e.title}`,prompt:t,executionModel:e.executionModel,agentSettings:e.agentSettings,opencodeConfig:e.opencodeConfig,mcpServers:e.mcpServers,runtimeEnv:e.runtimeEnv,signal:e.signal})},Jo=async e=>tc({actingUserId:e.actingUserId,resumeSessionId:e.resumeSessionId,cwd:e.cwd,title:e.title,prompt:e.prompt,executionModel:e.executionModel,agentSettings:e.agentSettings,opencodeConfig:e.opencodeConfig,mcpServers:e.mcpServers,runtimeEnv:e.runtimeEnv,signal:e.signal,onEvent:e.onEvent});var rc=async e=>{let t=b();return e==="Codex"?Is(t):Ho()};import{existsSync as hf,readFileSync as yf}from"node:fs";import nc from"node:os";import hn from"node:path";var kf=e=>{let t=e.trim().match(/^\$\{([A-Z0-9_]+)\}$/i);return t?process.env[t[1]]?.trim()||"":e.trim()},kn=e=>typeof e!="string"?"":kf(e).trim(),ze=e=>!!e&&typeof e=="object"&&!Array.isArray(e),Nt=(e,t)=>{for(let r of t){let n=kn(e[r]);if(n)return n}return""},oc=e=>{if(!hf(e))return null;try{let t=JSON.parse(yf(e,"utf8"));return ze(t)?t:null}catch{return null}},wf=e=>{let t=e.trim();return t?t==="~"?nc.homedir():t.startsWith("~/")?hn.join(nc.homedir(),t.slice(2)):t:""},xf=e=>{if(typeof e!="string")return"";let t=e.trim();return!t||t.startsWith("!")?"":/^[A-Z0-9_]+$/i.test(t)?process.env[t]?.trim()||"":t},Sf=e=>{let t=kn(e.model);if(t)return t;let r=e.env&&typeof e.env=="object"?e.env:{};return Nt(r,["ANTHROPIC_MODEL","ANTHROPIC_DEFAULT_SONNET_MODEL","ANTHROPIC_DEFAULT_OPUS_MODEL","ANTHROPIC_DEFAULT_HAIKU_MODEL"])},vf=(e,t)=>{let r=pe(e.opencodeConfigContent),n=Object.entries(r.provider??r.providers??{}),o=new Map;for(let[i,s]of n){if(!s||typeof s!="object")continue;let a=s,c=Nt(a,["baseURL","baseUrl","base_url","url","endpoint"]),l=Nt(a,["apiKey","api_key","token","authToken","apiToken"]);o.set(i,{...c?{baseUrl:c}:{},...l?{apiToken:l}:{}})}return t.map(i=>({providerId:i.providerId,modelId:i.modelId,label:`OpenCode \xB7 ${i.id}`,...o.get(i.providerId),runtimeSettings:{defaultModel:i.id}}))};var Vo=e=>{let t=e?.trim()||"";if(!t)return null;let r=t.indexOf("/");if(r<0)return null;let n=t.slice(0,r).trim(),o=t.slice(r+1).trim();return!n||!o?null:{providerId:n,modelId:o}},Cf=new Map([["claude","anthropic"],["dashscope","qwen"],["gemini","google"],["glm","zhipu"],["grok","xai"],["kimi","moonshot"],["volcengine","doubao"]]),ic=new Set(["anthropic","baichuan","deepseek","doubao","google","groq","minimax","minimax-cn","mistral","moonshot","openai","openrouter","pi","qwen","xai","zhipu"]),Pf=[{providerId:"anthropic",hostname:"api.anthropic.com"},{providerId:"deepseek",hostname:"api.deepseek.com"},{providerId:"google",hostname:"generativelanguage.googleapis.com"},{providerId:"groq",hostname:"api.groq.com"},{providerId:"minimax-cn",hostname:"api.minimaxi.com"},{providerId:"minimax",hostname:"api.minimax.io"},{providerId:"mistral",hostname:"api.mistral.ai"},{providerId:"moonshot",hostname:"api.moonshot.ai"},{providerId:"openai",hostname:"api.openai.com"},{providerId:"openrouter",hostname:"openrouter.ai"},{providerId:"qwen",hostname:"dashscope.aliyuncs.com"},{providerId:"xai",hostname:"x.ai"},{providerId:"zhipu",hostname:"open.bigmodel.cn"}],sc=e=>e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,""),Ef=e=>{let t=e?.trim()||"";if(!t)return"";let r=sc(t);return Cf.get(r)||(ic.has(r)?r:t)},If=(e,t)=>e===t||e.endsWith(`.${t}`),bf=e=>Pf.find(r=>If(e,r.hostname))?.providerId||"",Rf=e=>{let t=e?.trim();if(!t)return"";try{let n=new URL(t).hostname.toLowerCase(),o=bf(n);if(o)return o;let s=["minimax","openrouter","anthropic","openai","deepseek","moonshot","kimi","gemini","google","xai","grok","groq","qwen","dashscope","doubao","volcengine","baichuan","zhipu","glm","mistral"].find(d=>n.includes(d));if(s)return s==="kimi"?"moonshot":s==="gemini"?"google":s==="grok"?"xai":s==="dashscope"?"qwen":s==="volcengine"?"doubao":s==="glm"?"zhipu":s;let a=n.split(".").filter(Boolean),c=new Set(["api","www","chat","cn","com","net","org","io","ai"]),l=a.find(d=>!c.has(d));return l?sc(l):""}catch{return""}},Tf=e=>{let t=e?.trim().toLowerCase()||"";return t?t.includes("minimax")?"minimax":t.includes("claude")?"anthropic":t.includes("gpt")?"openai":t.includes("gemini")?"google":t.includes("deepseek")?"deepseek":t.includes("kimi")||t.includes("moonshot")?"moonshot":t.includes("grok")?"xai":t.includes("qwen")?"qwen":t.includes("doubao")?"doubao":t.includes("glm")?"zhipu":"":""},Af=(e,t)=>!e||!t||e===t||!ic.has(t)?!1:e==="openai"||e==="anthropic"?!0:e==="minimax"&&t==="minimax-cn",Xo=e=>{let t=Ef(e.explicitProviderId),r=Rf(e.baseUrl);return Af(t,r)?r:t||r||Tf(e.modelId)||e.fallbackProviderId.trim()},Mf=(e,t)=>{let r=t.trim().toLowerCase();if(!r)return null;for(let[n,o]of Object.entries(e))if(n.trim().toLowerCase()===r)return ze(o)?{providerId:n,config:o}:null;return null},ac=(e,t)=>{let r=e.trim(),n=t.trim();return!r||!n?n||r:n.toLowerCase().startsWith(`${r.toLowerCase()}/`)?n:`${r}/${n}`},yn=(e,t,r)=>`${e} \xB7 ${ac(t,r)}`,Of=(e,t)=>{let r=e.codexConfigContent?.trim()||"",n=ae({authContent:e.codexAuthContent,configContent:r}),o=n.configuredModel,i=n.baseUrl,s=n.apiToken,a=Vo(o)?.providerId||n.providerId,c=Xo({explicitProviderId:a,baseUrl:i,modelId:o,fallbackProviderId:"openai"}),l=t.filter(d=>d.providerId.trim().toLowerCase()===c.trim().toLowerCase());return l.length>0?l.map(d=>({providerId:c,modelId:d.modelId,label:yn("Codex",c,d.modelId),...i?{baseUrl:i}:{},...s?{apiToken:s}:{},runtimeSettings:{defaultModel:d.modelId}})):o?[{providerId:c,modelId:o,label:yn("Codex",c,o),...i?{baseUrl:i}:{},...s?{apiToken:s}:{},runtimeSettings:{defaultModel:o}}]:[]},_f=e=>{let t=e.claudeCodeConfigContent?.trim()||"";if(!t)return[];try{let r=JSON.parse(t),n=Sf(r);if(!n)return[];let o=r.env&&typeof r.env=="object"?r.env:{},i=Nt(o,["ANTHROPIC_BASE_URL","ANTHROPIC_API_URL"])||process.env.ANTHROPIC_BASE_URL?.trim()||"",s=Nt(o,["ANTHROPIC_AUTH_TOKEN","ANTHROPIC_API_KEY"])||process.env.ANTHROPIC_AUTH_TOKEN?.trim()||process.env.ANTHROPIC_API_KEY?.trim()||"",a=Vo(n)?.providerId,c=Xo({explicitProviderId:a,baseUrl:i,modelId:n,fallbackProviderId:"anthropic"});return[{providerId:c,modelId:n,label:yn("ClaudeCode",c,n),...i?{baseUrl:i}:{},...s?{apiToken:s}:{},runtimeSettings:{defaultModel:n}}]}catch{return[]}},Bf=e=>{if(!ze(e.agentSettings))return"";let t=ze(e.agentSettings.Pi)?e.agentSettings.Pi:null;return typeof t?.defaultModel=="string"?t.defaultModel.trim():""},Wf=e=>ze(e.agentSettings.Pi)&&typeof e.agentSettings.Pi.agentDir=="string"&&e.agentSettings.Pi.agentDir.trim()?e.agentSettings.Pi.agentDir.trim():"",Df=(e,t)=>{for(let[r,n]of Object.entries(e)){if(!ze(n)||!Array.isArray(n.models))continue;if(n.models.some(i=>ze(i)&&kn(i.id)===t))return r}return""},Nf=e=>{let t=Bf(e);if(!t)return[];let r=Wf(e),n=r?hn.resolve(wf(r)):"",o=n?oc(hn.join(n,"settings.json")):null,i=n?oc(hn.join(n,"models.json")):null,s=ze(i?.providers)?i.providers:{},a=Vo(t),c=a?.providerId||"",l=a?.modelId||t,d=c?"":kn(o?.defaultProvider),m=d||c?"":Df(s,l),p=[d,c,m].filter(Boolean).map(C=>Mf(s,C)).find(C=>!!C)??null,f=p?.config??null,x=f?Nt(f,["baseUrl","baseURL","base_url","url","endpoint"]):"",k=f?xf(f.apiKey):"",g=Xo({explicitProviderId:d||c||m||p?.providerId,baseUrl:x,modelId:l,fallbackProviderId:"pi"}),R=ac(g,l);return[{providerId:g,modelId:l,label:yn("Pi",g,l),...x?{baseUrl:x}:{},...k?{apiToken:k}:{},runtimeSettings:{defaultModel:R,...n?{agentDir:n}:{}}}]},cc=e=>e.agentType==="OpenCode"?vf(e.config,e.availableModels):e.agentType==="Codex"?Of(e.config,e.availableModels):e.agentType==="ClaudeCode"?_f(e.config):e.agentType==="Pi"?Nf(e.config):[];var lc=(e,t)=>{console.log("[worker-config-sync]",e,JSON.stringify(t))},dc=e=>{let t=e.codexConfigContent?.trim()||"",r=e.codexAuthContent?.trim()||"",n=ae({configContent:t,authContent:r});return{executorId:e.executorId||"",defaultModel:e.defaultModel||"",codexDefaultModel:e.agentSettings?.Codex?.defaultModel||"",hasOpencodeConfigContent:!!e.opencodeConfigContent?.trim(),opencodeConfigLength:e.opencodeConfigContent?.length??0,hasCodexConfigContent:!!t,codexConfigLength:t.length,hasCodexAuthContent:!!r,codexAuthLength:r.length,codexProviderId:n.providerId,codexConfiguredModel:n.configuredModel||"",codexManagedCredentialEnvKeys:Object.keys(it(r)).sort(),hasClaudeCodeConfigContent:!!e.claudeCodeConfigContent?.trim(),claudeCodeConfigLength:e.claudeCodeConfigContent?.length??0,mcpServerCount:e.mcpServers?.length??0,maxConcurrency:e.maxConcurrency}},Yo=e=>{let t=b(),r=e.opencodeConfigContent!==void 0?e.opencodeConfigContent:t.opencodeConfigContent,n=e.codexConfigContent!==void 0?e.codexConfigContent:t.codexConfigContent,o=e.codexAuthContent!==void 0?e.codexAuthContent:t.codexAuthContent,i=e.claudeCodeConfigContent!==void 0?e.claudeCodeConfigContent:t.claudeCodeConfigContent,s=e.defaultModel!==void 0?e.defaultModel:t.defaultModel,a={...t,opencodeConfigContent:r,codexConfigContent:n,codexAuthContent:o,claudeCodeConfigContent:i,defaultModel:s,agentSettings:Yt(e.agentSettings??t.agentSettings,s),mcpServers:e.mcpServers??t.mcpServers??[],maxConcurrency:Math.max(1,e.maxConcurrency??t.maxConcurrency)};return Ie(a),F({config:a}),a};var uc=(e,t)=>{let r=t.getConfig();if(e.type==="control-plane.ready")return r=Yo({opencodeConfigContent:e.opencodeConfigContent,codexConfigContent:e.codexConfigContent,codexAuthContent:e.codexAuthContent,claudeCodeConfigContent:e.claudeCodeConfigContent,defaultModel:e.defaultModel,agentSettings:e.agentSettings,mcpServers:e.mcpServers,maxConcurrency:e.maxConcurrency}),t.setConfig(r),F({config:r,executorId:r.executorId}),lc("control-plane.ready",dc(r)),!0;if(e.type==="config.sync")return r=Yo({opencodeConfigContent:e.opencodeConfigContent,codexConfigContent:e.codexConfigContent,codexAuthContent:e.codexAuthContent,claudeCodeConfigContent:e.claudeCodeConfigContent,defaultModel:e.defaultModel,agentSettings:e.agentSettings,mcpServers:e.mcpServers,maxConcurrency:e.maxConcurrency}),t.setConfig(r),F({config:r}),lc("config.sync",dc(r)),!0;if(e.type==="executor.unpair"){let n=Gr();return t.setConfig(n),F({daemonMode:"unpaired",paired:!1,connected:!1,executorId:void 0,config:n,lastError:e.reason||"This worker was removed from the control plane."}),!0}return e.type==="executor.shutdown"?(t.requestShutdown(e.reason||"Control plane requested worker shutdown."),!0):e.type==="config.export.request"?(r=b(),t.setConfig(r),rc(e.agentType).then(n=>{let o=ks(),i=Lr(),s=jr(),a=ro(),c={...r,opencodeConfigContent:o||r.opencodeConfigContent,codexConfigContent:i||r.codexConfigContent,codexAuthContent:s||r.codexAuthContent,claudeCodeConfigContent:a||r.claudeCodeConfigContent};t.send({type:"config.export.response",executorId:r.executorId,requestId:e.requestId,opencodeConfigContent:c.opencodeConfigContent,codexConfigContent:c.codexConfigContent,codexAuthContent:c.codexAuthContent,claudeCodeConfigContent:c.claudeCodeConfigContent,defaultModel:n.defaultModel??r.defaultModel,agentSettings:r.agentSettings,availableModels:n.models,resolvedModelBindings:e.includeResolvedModelBindings?cc({config:c,agentType:e.agentType,availableModels:n.models}):void 0,modelsMessage:n.message,at:new Date().toISOString()})}),!0):e.type==="executor.telemetry.request"?(r=b(),t.setConfig(r),t.send({type:"executor.telemetry.response",executorId:r.executorId,requestId:e.requestId,telemetry:gn({workspaceRoot:r.workspaceRoot,workerVersion:ue()}),at:new Date().toISOString()}),!0):!1};import{readFileSync as iy}from"node:fs";import{basename as sy}from"node:path";var $f=e=>e.startsWith("glpat-")?"gitlab":e.startsWith("ghp_")||e.startsWith("github_pat_")||e.startsWith("gho_")||e.startsWith("ghu_")||e.startsWith("ghs_")||e.startsWith("ghr_")?"github":null,pc=()=>AbortSignal.timeout(8e3),mc=e=>{let t=e?.trim().toLowerCase()||"";if(!t)return"";let r=t.includes("://")?void 0:/^[^@/]+@([^:/?#]+):/i.exec(t)?.[1];if(r)return r;try{return new URL(/^[a-z][a-z\d+.-]*:\/\//i.test(t)?t:`https://${t}`).host}catch{return t.replace(/^https?:\/\//,"").split(/[/?#]/)[0].replace(/\/+$/,"")}},Uf=e=>{let t=mc(e);return!t||t==="github.com"?"https://api.github.com/user":`https://${t}/api/v3/user`},Lf=e=>`https://${mc(e)||"gitlab.com"}/api/v4/user`,jf=async(e,t)=>{try{let r=await fetch(Uf(t),{headers:{Accept:"application/vnd.github+json",Authorization:`Bearer ${e}`,"User-Agent":"vibemux-pat-check"},signal:pc()});return r.status===401?{ok:!1,unauthorized:!0,message:"GitHub \u8FD4\u56DE 401\uFF0Ctoken \u4E0D\u53EF\u7528\u3002"}:r.ok?{ok:!0,account:(await r.json()).login||"unknown",scopes:r.headers.get("x-oauth-scopes")||void 0,message:"GitHub PAT \u53EF\u7528\u3002"}:{ok:!1,message:`GitHub \u6821\u9A8C\u5931\u8D25\uFF08HTTP ${r.status}\uFF09\u3002`}}catch(r){return{ok:!1,message:r instanceof Error?r.message:"GitHub \u6821\u9A8C\u5931\u8D25\u3002"}}},Ff=async(e,t)=>{try{let r=await fetch(Lf(t),{headers:{"PRIVATE-TOKEN":e,"User-Agent":"vibemux-pat-check"},signal:pc()});if(r.status===401)return{ok:!1,unauthorized:!0,message:"GitLab \u8FD4\u56DE 401\uFF0Ctoken \u4E0D\u53EF\u7528\u3002"};if(!r.ok)return{ok:!1,message:`GitLab \u6821\u9A8C\u5931\u8D25\uFF08HTTP ${r.status}\uFF09\u3002`};let n=await r.json();return{ok:!0,account:n.username||n.name||"unknown",message:"GitLab PAT \u53EF\u7528\u3002"}}catch(r){return{ok:!1,message:r instanceof Error?r.message:"GitLab \u6821\u9A8C\u5931\u8D25\u3002"}}},gc=async(e,t,r)=>{let n=e.trim();if(!n)return{ok:!1,message:"PAT \u4E0D\u80FD\u4E3A\u7A7A\u3002"};let o=$f(n),i=t?[t]:o?[o]:["github","gitlab"];for(let s of i){let a=s==="github"?await jf(n,r):await Ff(n,r);if(a.ok){let c=s==="github"&&a.scopes?`\uFF0Cscopes\uFF1A${a.scopes}`:"",l=s==="github"?"\u3002\u63D0\u793A\uFF1A\u6B64\u5904\u4EC5\u9A8C\u8BC1 token \u672C\u8EAB\uFF1B\u8BBF\u95EE\u79C1\u6709\u4ED3\u5E93\u8FD8\u9700\u8981\u8BE5 token \u88AB\u6388\u4E88\u76EE\u6807\u4ED3\u5E93\u8BFB\u53D6\u6743\u9650":"";return{ok:!0,provider:s,account:a.account,message:`${s==="github"?"GitHub":"GitLab"} \u6821\u9A8C\u901A\u8FC7\uFF0C\u5F53\u524D\u8D26\u53F7 ${a.account}${c}${l}\u3002`}}if(!a.unauthorized||o)return{ok:!1,provider:s,message:a.message}}return{ok:!1,message:"\u672A\u8BC6\u522B PAT \u5BF9\u5E94\u5E73\u53F0\uFF0C\u6216 token \u5DF2\u5931\u6548\u3002"}};import{createHash as qf}from"node:crypto";import{accessSync as fc,existsSync as Ut,mkdirSync as Gf,readdirSync as yc,readFileSync as Zo,rmSync as Hf,statSync as ei,unlinkSync as zf,writeFileSync as Kf}from"node:fs";import Jf from"node:os";import Y from"node:path";var Qo=1,wn=1,Vf=64*1024*1024,Xf=200*1024,Yf=e=>e?.trim()||process.env.VIBEMUX_AGENT_HOME?.trim()||Y.join(Jf.homedir(),".vibemux"),ti=e=>e.replace(/\\/g,"/").replace(/^\/+/,"").split("/").filter(t=>t&&t!==".").join("/"),Qf=(e,t)=>{let r=Y.relative(e,t);return r===""||!r.startsWith("..")&&!Y.isAbsolute(r)},Zf=e=>{let t=e.trim();if(!t)throw new Error("Agent ID \u4E0D\u80FD\u4E3A\u7A7A\u3002");return t.replace(/[^a-zA-Z0-9._-]+/g,"-")},be=e=>{Ut(e)||Gf(e,{recursive:!0})},kc=e=>{if(!Ut(e))return null;try{return JSON.parse(Zo(e,"utf8"))}catch{return null}},ri=(e,t)=>{Kf(e,`${JSON.stringify(t,null,2)}
59
- `,"utf8")},hc=e=>new Date(e).toISOString(),eh=(e,t)=>{if(!(t>Vf))return qf("sha256").update(Zo(e)).digest("hex")},wc=(e,t)=>{let r=Zf(e),n=Y.join(Yf(t),"agents",r),o=Y.join(n,"workdir"),i=Y.join(n,".system"),s=Y.join(i,"manifest.json"),a=Y.join(i,"snapshots"),c=Y.join(a,"current.json"),l=Y.join(i,"sessions"),d=Y.join(i,"runtime"),m=Y.join(d,"temp"),u=Y.join(i,"logs");return{rootPath:n,workDirPath:o,systemPath:i,manifestPath:s,snapshotsDir:a,snapshotPath:c,sessionsDir:l,runtimeDir:d,runtimeTempDir:m,logsDir:u}},th=(e,t,r)=>{let n=new Date().toISOString();return{version:Qo,agentId:e.trim(),rootPath:t.rootPath,workDirPath:t.workDirPath,status:"ready",storageVersion:Qo,snapshotVersion:wn,createdAt:r?.createdAt||n,updatedAt:n,lastUsedAt:r?.lastUsedAt,lastSessionId:r?.lastSessionId,lastScannedAt:r?.lastScannedAt}},Ke=(e,t)=>{let r=wc(e,t);return{paths:r,manifest:kc(r.manifestPath)}},ni=(e,t,r)=>{let{paths:n,manifest:o}=Ke(e,t),i={...th(e,n,o),...r,updatedAt:new Date().toISOString()};return ri(n.manifestPath,i),i},lt=(e,t)=>{let{paths:r}=Ke(e,t);return kc(r.snapshotPath)},$t=(e,t,r,n,o)=>{let{paths:i}=Ke(e,t),s=o?.files??[];return{agentId:e.trim(),rootPath:i.rootPath,workDirPath:i.workDirPath,systemPath:i.systemPath,status:r,totalFiles:s.filter(a=>a.type==="file").length,totalDirectories:s.filter(a=>a.type==="directory").length,totalSizeBytes:s.filter(a=>a.type==="file").reduce((a,c)=>a+c.sizeBytes,0),lastUsedAt:n?.lastUsedAt,lastSessionId:n?.lastSessionId,lastScannedAt:n?.lastScannedAt??o?.scannedAt,manifestVersion:n?.storageVersion??Qo,snapshotVersion:n?.snapshotVersion??wn}},oi=(e,t)=>{let{paths:r,manifest:n}=Ke(e,t);if(!Ut(r.workDirPath)||!Ut(r.systemPath))return{paths:r,manifest:n,summary:$t(e,t,"missing",n,lt(e,t))};try{return fc(r.workDirPath),fc(r.systemPath),{paths:r,manifest:n,summary:$t(e,t,"ready",n,lt(e,t))}}catch{return{paths:r,manifest:n,summary:$t(e,t,"error",n,lt(e,t))}}},xc=(e,t="")=>{let r=t?Y.join(e,t):e,n=yc(r,{withFileTypes:!0}),o=[];for(let i of n){let s=ti(Y.join(t,i.name)),a=Y.join(r,i.name),c=ei(a);if(i.isDirectory()){o.push({path:s,type:"directory",sizeBytes:0,modifiedAt:hc(c.mtimeMs)}),o.push(...xc(e,s));continue}i.isFile()&&o.push({path:s,type:"file",sizeBytes:c.size,modifiedAt:hc(c.mtimeMs),sha256:eh(a,c.size)})}return o},xn=(e,t)=>{let r=wc(e,t);be(r.rootPath),be(r.workDirPath),be(r.systemPath),be(r.snapshotsDir),be(Y.join(r.snapshotsDir,"history")),be(r.sessionsDir),be(r.runtimeDir),be(r.runtimeTempDir),be(Y.join(r.runtimeDir,"locks")),be(r.logsDir);let n=ni(e,t);return{summary:$t(e,t,"ready",n,lt(e,t)),files:lt(e,t)?.files??[]}},Sc=(e,t)=>(xn(e,t),ii(e,t)),ii=(e,t)=>{let{summary:r}=oi(e,t);if(r.status!=="ready")return{summary:r,files:[]};let{paths:n}=Ke(e,t),o=new Date().toISOString(),i=xc(n.workDirPath).sort((a,c)=>a.path.localeCompare(c.path));ri(n.snapshotPath,{version:wn,agentId:e.trim(),scannedAt:o,files:i});let s=ni(e,t,{lastScannedAt:o,status:"ready"});return{summary:$t(e,t,"ready",s,{version:wn,agentId:e.trim(),scannedAt:o,files:i}),files:i}},ur=(e,t)=>{let{manifest:r,summary:n}=oi(e,t);return n.status!=="ready"?n:$t(e,t,"ready",r,lt(e,t))},Lt=(e,t=!1,r)=>t?ii(e,r):{summary:ur(e,r),files:lt(e,r)?.files??[]},vc=(e,t,r)=>{xn(e,r);let{paths:n}=Ke(e,r),o=new Date().toISOString();ni(e,r,{lastUsedAt:o,lastSessionId:t.trim()||void 0}),ri(Y.join(n.sessionsDir,`${t.trim()||"session"}.json`),{sessionId:t.trim()||"session",cwd:n.workDirPath,lastUsedAt:o})},Cc=(e,t)=>{let{paths:r}=Ke(e,t);if(Ut(r.runtimeTempDir))for(let n of yc(r.runtimeTempDir))Hf(Y.join(r.runtimeTempDir,n),{force:!0,recursive:!0});return ur(e,t)},Sn=(e,t,r)=>{let{summary:n}=oi(e,r);if(n.status!=="ready")throw new Error("Agent \u5DE5\u4F5C\u76EE\u5F55\u5C1A\u672A\u521D\u59CB\u5316\u3002");let o=ti(t);if(!o)throw new Error("\u6587\u4EF6\u8DEF\u5F84\u4E0D\u80FD\u4E3A\u7A7A\u3002");let{paths:i}=Ke(e,r),s=Y.resolve(i.workDirPath,o);if(!Qf(i.workDirPath,s))throw new Error("\u6587\u4EF6\u8DEF\u5F84\u8D8A\u754C\u3002");if(!Ut(s)||!ei(s).isFile())throw new Error("\u6587\u4EF6\u4E0D\u5B58\u5728\u3002");return{absolutePath:s,relativePath:o}},Pc=(e,t,r)=>{let n=Sn(e,t,r);return zf(n.absolutePath),ii(e,r)},Ec=(e,t,r)=>{try{let n=Sn(e,t,r),o=ei(n.absolutePath);if(!o.isFile())return{ok:!1,relativePath:n.relativePath,message:"\u5F53\u524D\u8DEF\u5F84\u4E0D\u662F\u6587\u4EF6\u3002"};if(o.size>Xf)return{ok:!1,relativePath:n.relativePath,sizeBytes:o.size,message:"\u6587\u4EF6\u8FC7\u5927\uFF0C\u6682\u4E0D\u652F\u6301\u9884\u89C8\u3002"};let i=Zo(n.absolutePath);return i.includes(0)?{ok:!1,relativePath:n.relativePath,sizeBytes:o.size,message:"\u6682\u4E0D\u652F\u6301\u9884\u89C8\u4E8C\u8FDB\u5236\u6587\u4EF6\u3002"}:{ok:!0,relativePath:n.relativePath,content:i.toString("utf8"),sizeBytes:o.size,truncated:!1}}catch(n){return{ok:!1,relativePath:ti(t),message:n instanceof Error?n.message:"\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25\u3002"}}};import{readFile as nh}from"node:fs/promises";import bc from"node:os";import Cn from"node:path";import{simpleGit as oh}from"simple-git";import{spawnSync as rh}from"node:child_process";var pr=(e,t,r)=>{let n=rh("git",t,{cwd:e,env:r,encoding:"utf8"});if(n.status!==0)throw new Error((n.stderr||n.stdout||"git command failed").trim())},vn=(e,t,r)=>{try{pr(e,t,r)}catch{return}},Le=e=>{let t=ka({taskId:e.taskId,identity:e.identity,repoUrl:e.repoUrl});return{env:t.env,tempDir:t.tempDir,configureRepo(r){e.identity.name&&e.identity.email&&(pr(r,["config","--local","user.name",e.identity.name],t.env),pr(r,["config","--local","user.email",e.identity.email],t.env)),t.env.GIT_SSH_COMMAND&&pr(r,["config","--local","core.sshCommand",t.env.GIT_SSH_COMMAND],t.env),t.env.GIT_ASKPASS&&pr(r,["config","--local","core.askPass",t.env.GIT_ASKPASS],t.env)},cleanup(r){r&&(e.identity.name&&e.identity.email&&(vn(r,["config","--local","--unset-all","user.name"],t.env),vn(r,["config","--local","--unset-all","user.email"],t.env)),vn(r,["config","--local","--unset-all","core.askPass"],t.env),vn(r,["config","--local","--unset-all","core.sshCommand"],t.env)),t.cleanup()}}},Ic=e=>{let t=Le({taskId:e.taskId,identity:e.identity,repoUrl:e.repoUrl});return t.configureRepo(e.worktreePath),{tempDir:t.tempDir,env:t.env,cleanup(){t.cleanup(e.worktreePath)}}};var mr="main",ih=e=>{let t=e.trim();return t?t==="~"?bc.homedir():t.startsWith("~/")?Cn.join(bc.homedir(),t.slice(2)):t:""},si=e=>Cn.resolve(ih(e)),sh=(e,t)=>{let r={...Rt(t),...e?{baseDir:e}:{}};return oh(r).env(t??{})},ye=e=>{let t=e.trim();if(!t||t==="HEAD"||t.endsWith("/HEAD"))return"";let r=t.startsWith("refs/heads/")?t.slice(11):t,n=r.startsWith("remotes/")?r.slice(8):r;return n.startsWith("origin/")?n.slice(7):n},ah=e=>e.split("\0").map(t=>t.trim()).filter(Boolean),ch=e=>e.split(Cn.sep).join("/"),ai=(e,t)=>{let r=new Map;for(let n of t.split(`
60
- `).map(o=>o.trim()).filter(Boolean)){let o=n.split(" "),i=o[0]||"M",s=o.length>2?`${o[1]} \u2192 ${o[2]}`:o[1]||"";s&&r.set(s,i)}return e.split(`
61
- `).map(n=>n.trim()).filter(Boolean).map(n=>n.split(" ")).map(n=>{if(n.length<3)return null;let o=n[0]==="-"?0:Number(n[0]),i=n[1]==="-"?0:Number(n[1]),s=n.length>3?`${n[2]} \u2192 ${n[3]}`:n[2];return{path:s,status:r.get(s)||"M",additions:Number.isFinite(o)?o:0,deletions:Number.isFinite(i)?i:0}}).filter(n=>!!n)},lh=e=>{if(e.length===0||e.includes(0))return 0;let t=e.toString("utf8").replace(/\r\n/g,`
53
+ `,"utf8"),e),og=(e=process.env,t=eg,r=Da)=>{if(rg(e))return{};let n=t.find(o=>Oa(o))||ng(r);return n?{GIT_SSL_CAINFO:n,SSL_CERT_FILE:n,CURL_CA_BUNDLE:n}:{}},qo=(e=process.env)=>{let t={};for(let[r,n]of Object.entries(e))n!==void 0&&!tg(r)&&(t[r]=n);return Object.assign(t,og(e)),t},_t=e=>{let t={};return(e?.GIT_ASKPASS||e?.SSH_ASKPASS)&&(t.allowUnsafeAskPass=!0),(e?.GIT_SSH||e?.GIT_SSH_COMMAND)&&(t.allowUnsafeSshCommand=!0),Object.keys(t).length>0?{unsafe:t}:{}},Na=e=>{let t=gr.join(Ba.tmpdir(),"vibemux-git",e.taskId);_a(t,{recursive:!0});let r=qo();if(r.GIT_TERMINAL_PROMPT="0",e.identity.authMode==="ssh"&&e.identity.credentialToken){let n=gr.join(t,"id_ed25519");Fo(n,e.identity.credentialToken,{encoding:"utf8",mode:384}),Ma(n,384),r.GIT_SSH_COMMAND=Qm(n)}else e.identity.credentialToken&&(r.GIT_ASKPASS=Ym(t,e.identity,e.repoUrl));return{env:r,tempDir:t,cleanup(){Gm(t,{recursive:!0,force:!0})}}};var lg=e=>new Promise(t=>setTimeout(t,e)),zo=!1,Ko=null,dg=()=>Ua(qr())&&Ua(sr()),ug=()=>{let e=rt().name?.trim()||"";return e==="vibemux-worker"||e==="vibemux-worker-preview"},pg=()=>process.platform==="win32"?"npx.cmd":"npx",mg=()=>{let e=process.env.VIBEMUX_WORKER_RESTART_STRATEGY?.trim().toLowerCase();return e==="pm2"||e==="supervisor"?!0:!!process.env.pm_id?.trim()},gg=(e,t)=>{let r=qo(process.env);Vo(pg(),["-y",`${e}@${t}`,"daemon"],{detached:!0,stdio:"ignore",env:r}).unref()},fg=async e=>{for(let t=0;t<120;t+=1)try{process.kill(e,0),await lg(500)}catch{return}throw new Error(`\u7B49\u5F85\u65E7 Worker \u9000\u51FA\u8D85\u65F6: ${e}`)},hg=async e=>{let t=await fetch(e,{method:"GET",signal:AbortSignal.timeout(3e4)});if(!t.ok)throw new Error(`\u4E0B\u8F7D\u66F4\u65B0\u5305\u5931\u8D25\uFF0CHTTP ${t.status}`);let r=Buffer.from(await t.arrayBuffer()),n=lt.join(ag.tmpdir(),"vibemux-worker-updates");$a(n,{recursive:!0});let o=lt.join(n,`worker-${Date.now()}.tar.gz`);return ig(o,r),o},yg=(e,t)=>{let r=cg("tar",["-xzf",e,"-C",t],{encoding:"utf8"});if(r.status!==0)throw new Error(r.stderr?.trim()||r.error?.message||"\u89E3\u538B\u66F4\u65B0\u5305\u5931\u8D25")},kg=e=>{Vo(lt.join(e,"bin","vibemux-worker"),["daemon"],{detached:!0,stdio:"ignore"}).unref()},wn=async e=>{let t=e??await it();if(!t.ok||!t.available)return{ok:t.ok,applied:!1,currentVersion:t.currentVersion,latestVersion:t.latestVersion,message:t.message};if(!t.asset)return!t.packageName||!t.latestVersion?{ok:!1,applied:!1,currentVersion:t.currentVersion,latestVersion:t.latestVersion,message:"\u7F3A\u5C11 npm \u66F4\u65B0\u76EE\u6807\u4FE1\u606F\uFF0C\u65E0\u6CD5\u81EA\u52A8\u66F4\u65B0\u3002"}:ug()?mg()?{ok:!0,applied:!0,currentVersion:t.currentVersion,latestVersion:t.latestVersion,message:`\u68C0\u6D4B\u5230\u65B0\u7248\u672C ${t.latestVersion}\uFF0C\u5373\u5C06\u9000\u51FA\u5E76\u4EA4\u7ED9\u5916\u90E8 supervisor \u91CD\u542F\u3002`}:(gg(t.packageName,t.latestVersion),{ok:!0,applied:!0,currentVersion:t.currentVersion,latestVersion:t.latestVersion,message:`\u5DF2\u5F00\u59CB\u901A\u8FC7 npx \u5207\u6362\u5230 ${t.latestVersion}\uFF0CWorker \u5373\u5C06\u91CD\u542F\u3002`}):{ok:!1,applied:!1,currentVersion:t.currentVersion,latestVersion:t.latestVersion,message:"\u5F53\u524D\u4E0D\u662F npm Worker \u5B89\u88C5\u65B9\u5F0F\uFF0C\u65E0\u6CD5\u901A\u8FC7 npx \u81EA\u52A8\u66F4\u65B0\u3002"};if(!dg())return{ok:!1,applied:!1,currentVersion:t.currentVersion,latestVersion:t.latestVersion,message:"\u5F53\u524D\u4E0D\u662F\u4FBF\u643A Worker \u5B89\u88C5\u76EE\u5F55\uFF0C\u65E0\u6CD5\u6267\u884C\u81EA\u66F4\u65B0\u3002"};let r=await hg(t.asset.url);return Vo(process.execPath,[sr(),"apply-update-internal",r,ce(),String(process.pid)],{detached:!0,stdio:"ignore"}).unref(),{ok:!0,applied:!0,currentVersion:t.currentVersion,latestVersion:t.latestVersion,message:`\u5DF2\u5F00\u59CB\u66F4\u65B0\u5230 ${t.latestVersion}\uFF0CWorker \u5373\u5C06\u91CD\u542F\u3002`}},Jo=async e=>{let t=process.env.VIBEMUX_WORKER_AUTO_UPDATE?.trim().toLowerCase();if(t==="0"||t==="false"||t==="off"||zo)return!1;zo=!0;try{let r=e??await it();return!r.ok||!r.available||!r.latestVersion?(Ko=null,!1):Ko===r.latestVersion?!1:(Ko=r.latestVersion,console.log(`[worker] \u68C0\u6D4B\u5230\u65B0\u7248\u672C ${r.latestVersion}\uFF0C\u5F53\u524D\u4EC5\u63D0\u793A\uFF0C\u4E0D\u4F1A\u81EA\u52A8\u5347\u7EA7\u6216\u9000\u51FA\u3002`),!0)}finally{zo=!1}},La=async(e,t,r)=>{await fg(r);let n=lt.dirname(t),o=lt.join(n,`.vibemux-worker-stage-${Date.now()}`),s=lt.join(n,`.vibemux-worker-backup-${Date.now()}`);$a(o,{recursive:!0}),yg(e,o);let[i]=sg(o);if(!i)throw new Error("\u66F4\u65B0\u5305\u5185\u5BB9\u4E3A\u7A7A");let a=lt.join(o,i);Ho(t,s);try{Ho(a,t)}catch(c){throw Ho(s,t),c}kg(t),Go(s,{recursive:!0,force:!0}),Go(o,{recursive:!0,force:!0}),Go(e,{force:!0})};var Cg=e=>new URL(e.url||"/","http://127.0.0.1"),ja=async e=>{let t=[];for await(let r of e)t.push(Buffer.isBuffer(r)?r:Buffer.from(r));return JSON.parse(Buffer.concat(t).toString("utf8"))},Q=(e,t,r)=>{e.statusCode=t,e.setHeader("Content-Type","application/json; charset=utf-8"),e.setHeader("Cache-Control","no-store"),e.end(`${JSON.stringify(r)}
54
+ `)},vg=(e,t)=>{let r=Xo.extname(t),n=r===".css"?"text/css; charset=utf-8":r===".js"?"application/javascript; charset=utf-8":r===".map"?"application/json; charset=utf-8":"text/html; charset=utf-8";e.statusCode=200,e.setHeader("Content-Type",n),e.end(xg(t))},Pg=e=>{let t=Pi(),r=e==="/"?Xo.join(t,"index.html"):Xo.join(t,e.replace(/^\//,""));return r.startsWith(t)?r:null},Ig=(e,t)=>{let r=Pg(e);if(!r||!wg(r)){Q(t,404,{message:"not found"});return}vg(t,r)},Eg=()=>{let e=ur(),t=T();return{ok:!0,service:"worker-local-server",daemonMode:e.daemonMode,paired:e.paired,connected:e.connected,executorId:e.executorId,runningTaskIds:e.runningTaskIds,queuedTaskIds:e.queuedTaskIds,localServerPort:t.localServerPort}},bg=e=>e==="claude"||e==="opencode"||e==="codex"||e==="pi"?e:null,Tg=()=>{let e=T(),t=e.mcpServers??[],r=!!e.executorToken?.trim(),n=t.map(c=>{let l=ot([c],{cloudUrl:e.cloudUrl,executorToken:e.executorToken,actingUserId:c.target===nt&&r?"__dynamic__":void 0}),d=Object.keys(l)[0],p=d?l[d]:null,u=c.target===nt;return{id:c.id,name:c.name,target:c.target,transport:c.transport,capabilityMode:c.capabilityMode,enabled:c.enabled,materialized:!!p,kind:u?"builtin":c.transport==="stdio"||c.target.startsWith("stdio://")?"stdio":c.transport==="http"||c.transport==="sse"?"remote":"custom",endpoint:typeof p?.url=="string"?p.url:void 0,command:typeof p?.command=="string"?p.command:void 0,headerKeys:p&&typeof p=="object"&&p.headers&&typeof p.headers=="object"?Object.keys(p.headers):[],actingUserScoped:u&&r}}),o=n.filter(c=>c.enabled),i=!!n.find(c=>c.target===nt)?.enabled,a=i&&r;return{configuredCount:n.length,enabledCount:o.length,materializedCount:o.filter(c=>c.materialized).length,builtinEnabled:i,builtinReady:a,actingUserMode:i?a?"request-scoped":"pairing-required":"disabled",servers:n}},Rg=(e,t)=>e.code==="EADDRINUSE"?`Local console port ${t} is already in use. Set VIBEMUX_WORKER_PORT and try again.`:e.code==="EPERM"?`The worker does not have permission to listen on local console port ${t}. Choose a different VIBEMUX_WORKER_PORT or check system permissions.`:`Failed to start the local console: ${e.message||"listen failed"}`,Ag=()=>{setTimeout(()=>{try{process.kill(process.pid,"SIGTERM")}catch{process.exit(0)}},250)},Yo=()=>{let e=T(),t=Wo(),r=Sg.createServer(async(n,o)=>{try{let s=Cg(n);if(n.method==="GET"&&(s.pathname==="/"||s.pathname.startsWith("/assets/"))){Ig(s.pathname,o);return}if(n.method==="GET"&&(s.pathname==="/health"||s.pathname==="/api/health")){Q(o,200,Eg());return}if(n.method==="GET"&&s.pathname==="/api/config"){Q(o,200,{config:T()});return}if(n.method==="GET"&&s.pathname==="/api/status"){Q(o,200,{runtime:bt(),mcp:Tg()});return}if(n.method==="GET"&&s.pathname==="/api/doctor"){Q(o,200,await Bt());return}if(n.method==="GET"&&s.pathname==="/api/agent-sessions"){Q(o,200,yn());return}if(n.method==="GET"&&s.pathname==="/api/agent-sessions/detail"){let i=bg(s.searchParams.get("source")),a=s.searchParams.get("id")?.trim();if(!i||!a){Q(o,400,{message:"source and id are required"});return}let c=kn(i,a);if(!c){Q(o,404,{message:"session not found"});return}Q(o,200,{session:c});return}if(n.method==="GET"&&s.pathname==="/api/update"){Q(o,200,await it());return}if(n.method==="POST"&&s.pathname==="/api/bootstrap-runtime"){let i=await Se({autoInstall:!0,target:"all"});Q(o,200,{report:i,doctor:await Bt()});return}if(n.method==="PUT"&&s.pathname==="/api/config"){let i=await ja(n),a={...T(),...i};be(a),q({config:a,paired:!!(a.executorId&&a.executorToken),executorId:a.executorId}),Q(o,200,{config:a,message:"saved"});return}if(n.method==="POST"&&s.pathname==="/api/pair"){let i=await ja(n),a=T(),c=kt(i.pairingCode);if(Lr(i.pairingCode,a)){let p={...a,executorName:i.name?.trim()||a.executorName?.trim()||`worker-${process.pid}`};be(p),q({paired:!0,executorId:p.executorId,config:p,daemonMode:"starting"}),xn(),Q(o,200,{config:p,message:`${jr()} Connecting to the control plane.`});return}let l;try{l=await or({pairingCode:i.pairingCode,machineId:a.machineId,machineName:a.machineName,name:i.name?.trim()||`worker-${process.pid}`,workspaceRoot:a.workspaceRoot,maxConcurrency:a.maxConcurrency,labels:a.labels,capabilities:a.capabilities,platform:process.platform,version:pe()},a.cloudUrl)}catch(p){let u=p instanceof Error?p.message:"Pair request failed.";Q(o,400,{message:Fr(u,wt(a))});return}let d={...a,executorName:i.name?.trim()||`worker-${process.pid}`,executorId:l.executorId,executorToken:l.executorToken,lastPairedPairingCode:c};be(d),q({paired:!0,executorId:l.executorId,config:d,daemonMode:"starting"}),xn(),Q(o,200,{config:d,executor:l.executor,message:"Pairing complete. Connecting to the control plane."});return}if(n.method==="POST"&&s.pathname==="/api/reset"){Zr(),q({daemonMode:"idle",paired:!1,connected:!1,executorId:void 0,config:T(),runningTaskIds:[],queuedTaskIds:[],lastError:void 0}),Q(o,200,{config:T(),message:"reset"});return}if(n.method==="POST"&&s.pathname==="/api/disconnect"){Fa(),Q(o,200,{runtime:bt(),message:"Disconnected from the control plane."});return}if(n.method==="POST"&&s.pathname==="/api/connect"){xn(),Q(o,200,{runtime:bt(),message:"Control plane connection requested."});return}if(n.method==="POST"&&s.pathname==="/api/update"){let i=await wn();Q(o,i.applied?202:200,i),i.applied&&Ag();return}Q(o,404,{message:"not found"})}catch(s){Q(o,500,{message:s instanceof Error?s.message:"worker local server error"})}});return r.once("error",n=>{let o=Rg(n,e.localServerPort);q({daemonMode:"disconnected",connected:!1,lastError:o}),console.error(`[worker] ${o}`),process.exitCode=1,setTimeout(()=>process.exit(1),20)}),r.listen(e.localServerPort,t,()=>{let n=pr(e.localServerPort),o=t==="127.0.0.1"?"":` (listening on ${t})`;console.log(`[worker] local console ${n}${o}`)}),r};var qa="vibemux.preview.navigation";var Mg=new TextEncoder,Og=new TextDecoder,_g=["preview.http.request.body.binary","preview.http.response.body.binary"],Qo=e=>typeof e=="string"&&e.trim().length>0,Bg=e=>{if(!e||typeof e!="object")return!1;let t=e;return!!(t.type&&_g.includes(t.type)&&Qo(t.previewSessionId)&&Qo(t.streamId)&&Qo(t.sentAt)&&typeof t.seq=="number"&&Number.isInteger(t.seq)&&t.seq>=0)},Ha=(e,t)=>{let r=Mg.encode(JSON.stringify(e)),n=new Uint8Array(4+r.byteLength+t.byteLength);return new DataView(n.buffer,n.byteOffset,4).setUint32(0,r.byteLength),n.set(r,4),n.set(t,4+r.byteLength),n},Ga=e=>{if(e.byteLength<4)return null;let t=new DataView(e.buffer,e.byteOffset,4).getUint32(0),r=4,n=r+t;if(t<=0||n>e.byteLength)return null;let o;try{o=JSON.parse(Og.decode(e.subarray(r,n)))}catch{return null}return Bg(o)?{header:o,payload:e.subarray(n)}:null};var Wg=/^[A-Za-z]:[\\/]/u;var Dg=e=>{let t=e?.trim();return t||void 0};var za=e=>{let t=Dg(e);if(!t||t.startsWith("/")||t.startsWith("\\")||Wg.test(t))return!1;let r=t.split(/[\\/]+/).filter(n=>n.length>0);return r.length===0?!1:r.every(n=>n!=="."&&n!=="..")};var Zo=e=>e?.trim()||"",Wt=e=>[e.scope,Zo(e.executorId),Zo(e.workspaceId),Zo(e.terminalId)].join("::");var Ka=new Set(["connection","keep-alive","proxy-authenticate","proxy-authorization","te","trailer","transfer-encoding","upgrade","host","content-length"]),Ng=new Set([...Ka,"content-encoding"]),Cn=32*1024,Va="data-vibemux-preview-navigation-bridge",Ug=qa,es=`<script ${Va}>(()=>{if(window.__vibemuxPreviewNavigationBridgeInstalled)return;window.__vibemuxPreviewNavigationBridgeInstalled=true;const t=${JSON.stringify(Ug)};let e="";const n=o=>{const r=window.location.href;if(r===e)return;e=r;try{window.parent&&window.parent!==window&&window.parent.postMessage({type:t,href:r,navigationType:o},"*")}catch{}};const o=t=>window.setTimeout(()=>n(t),0);const r=window.history.pushState,i=window.history.replaceState;typeof r=="function"&&(window.history.pushState=function(...t){const e=r.apply(this,t);return o("push"),e});typeof i=="function"&&(window.history.replaceState=function(...t){const e=i.apply(this,t);return o("replace"),e});window.addEventListener("popstate",()=>o("pop"));window.addEventListener("hashchange",()=>o("hash"));window.addEventListener("pageshow",()=>o("pageshow"));n("load");})();</script>`,Ge=new Map,ts=new Map,fr=()=>new Date().toISOString(),dt=(e,t)=>`${e}:${t}`,Sn=(e,t)=>{e.send(JSON.stringify(t))},$g=(e,t,r)=>{e.send(Ha(t,r))},Lg=e=>!e||e==="/"?"":e.endsWith("/")?e.slice(0,-1):e,jg=(e,t)=>{let r=Lg(e);return!r||t===r||t.startsWith(`${r}/`)?t||"/":`${r}${t||"/"}`},Fg=(e,t)=>{let r=new URL(e),n=new URL(t,r);return n.pathname=jg(r.pathname,n.pathname),n.toString()},qg=e=>{let t=new Headers;for(let[r,n]of e){let o=r.toLowerCase();Ka.has(o)||o!=="accept-encoding"&&t.set(r,n)}return t.set("accept-encoding","identity"),t},Ja=e=>{if(e.binaryPayloads){$g(e.socket,{type:"preview.http.response.body.binary",previewSessionId:e.previewSessionId,streamId:e.streamId,sentAt:fr(),seq:e.seq},e.chunk);return}let t={type:"preview.http.response.body",previewSessionId:e.previewSessionId,streamId:e.streamId,sentAt:fr(),seq:e.seq,encoding:"base64",data:Buffer.from(e.chunk).toString("base64")};Sn(e.socket,t)},Hg=e=>{let t=[],r=e.headers.getSetCookie;e.headers.forEach((n,o)=>{let s=o.toLowerCase();s!=="set-cookie"&&(Ng.has(s)||t.push([o,n]))});for(let n of r?.call(e.headers)??[])t.push(["set-cookie",n]);return t},Gg=(e,t)=>e.method.toUpperCase()==="HEAD"||t.status===204||t.status===304?!1:t.headers.get("content-type")?.toLowerCase().includes("text/html")??!1,zg=e=>{if(!e||e.includes(Va))return e;let t=e.search(/<\/head\s*>/i);if(t>=0)return`${e.slice(0,t)}${es}${e.slice(t)}`;let r=e.search(/<\/body\s*>/i);return r>=0?`${e.slice(0,r)}${es}${e.slice(r)}`:`${e}${es}`},Kg=e=>{Xg(e)},Vg=e=>{let t=e.reduce((o,s)=>o+s.byteLength,0),r=new Uint8Array(t),n=0;for(let o of e)r.set(o,n),n+=o.byteLength;return r},Jg=e=>{let t=0;for(let r=0;r<e.body.byteLength;r+=Cn)Ja({socket:e.socket,previewSessionId:e.previewSessionId,streamId:e.streamId,chunk:e.body.subarray(r,r+Cn),seq:t,binaryPayloads:e.binaryPayloads}),t+=1},Xg=async e=>{let t=dt(e.previewSessionId,e.streamId),r=new AbortController;ts.set(t,r);let n=Fg(e.targetUrl,e.request.pathWithQuery);try{let o=e.request.hasBody?Vg(e.request.bodyChunks):void 0,s=await fetch(n,{method:e.request.method,headers:qg(e.request.headers),body:o,signal:r.signal}),i=Gg(e.request,s),a={type:"preview.http.response.start",previewSessionId:e.previewSessionId,streamId:e.streamId,sentAt:fr(),status:s.status,headers:Hg(s)};if(Sn(e.socket,a),i){let l=await s.text();Jg({socket:e.socket,previewSessionId:e.previewSessionId,streamId:e.streamId,body:new TextEncoder().encode(zg(l)),binaryPayloads:e.binaryPayloads})}else if(s.body){let l=s.body.getReader(),d=0;for(;;){let{done:p,value:u}=await l.read();if(p)break;let m=u??new Uint8Array(0);for(let f=0;f<m.byteLength;f+=Cn)Ja({socket:e.socket,previewSessionId:e.previewSessionId,streamId:e.streamId,chunk:m.subarray(f,f+Cn),seq:d,binaryPayloads:e.binaryPayloads}),d+=1}}let c={type:"preview.http.response.end",previewSessionId:e.previewSessionId,streamId:e.streamId,sentAt:fr()};Sn(e.socket,c)}catch(o){let s=o instanceof Error?o.message:"local preview upstream request failed",i=typeof o=="object"&&o&&"cause"in o?o.cause?.code:void 0,a={type:"preview.http.abort",previewSessionId:e.previewSessionId,streamId:e.streamId,sentAt:fr(),code:r.signal.aborted?"client_closed":"upstream_connect_failed",message:r.signal.aborted?`Preview upstream request was aborted: ${n}`:`Failed to reach preview upstream ${n}${i?` (${i})`:""}: ${s}`};Sn(e.socket,a)}finally{ts.delete(t)}},Dt={handleStart(e){let t={method:e.frame.method,pathWithQuery:e.frame.pathWithQuery,headers:e.frame.headers,hasBody:e.frame.hasBody,bodyChunks:[]};Ge.set(dt(e.frame.previewSessionId,e.frame.streamId),t),t.startRequest=()=>Kg({socket:e.socket,previewSessionId:e.frame.previewSessionId,streamId:e.frame.streamId,targetUrl:e.frame.targetUrl||e.targetUrl,request:t,binaryPayloads:e.binaryPayloads}),t.hasBody||(Ge.delete(dt(e.frame.previewSessionId,e.frame.streamId)),t.startRequest())},handleBody(e){let t=Ge.get(dt(e.previewSessionId,e.streamId));t&&t.bodyChunks.push(Buffer.from(e.data,"base64"))},handleBinaryBody(e,t){if(e.type!=="preview.http.request.body.binary")return;let r=Ge.get(dt(e.previewSessionId,e.streamId));r&&r.bodyChunks.push(t)},handleEnd(e){let t=dt(e.frame.previewSessionId,e.frame.streamId),r=Ge.get(t);r&&(Ge.delete(t),r.startRequest?.())},abort(e,t){let r=dt(e,t),n=Ge.get(r);Ge.delete(r),ts.get(r)?.abort()}};import{WebSocket as Xa}from"ws";var ye=new Map,Nt=()=>new Date().toISOString(),rs=(e,t)=>`${e}:${t}`,Yg=e=>!e||e==="/"?"":e.endsWith("/")?e.slice(0,-1):e,Qg=(e,t)=>{let r=Yg(e);return!r||t===r||t.startsWith(`${r}/`)?t||"/":`${r}${t||"/"}`},Zg=(e,t)=>{let r=new URL(e),n=new URL(t,r);return n.protocol=r.protocol==="https:"?"wss:":"ws:",n.pathname=Qg(r.pathname,n.pathname),n.toString()},ef=e=>{let t={};for(let[r,n]of e)t[r]=n;return t},hr=(e,t)=>{e.send(JSON.stringify(t))},tf=e=>{if(!e.queuedFrames.length)return;let t=[...e.queuedFrames];e.queuedFrames.length=0;for(let r of t){if(r.opcode==="binary"){e.socket.send(Buffer.from(r.data,"base64"));continue}e.socket.send(r.data)}},vn=e=>{let t=rs(e.previewSessionId,e.streamId),r=ye.get(t);if(r){if(ye.delete(t),e.notifyRemote!==!1){let n={type:"preview.ws.close",previewSessionId:e.previewSessionId,streamId:e.streamId,sentAt:Nt(),code:e.code,reason:e.reason};hr(r.tunnelSocket,n)}try{r.closedByControl=!0,r.socket.close(e.code,e.reason)}catch{r.socket.close()}}},rf=e=>Buffer.isBuffer(e)?e.toString("base64"):Array.isArray(e)?Buffer.concat(e).toString("base64"):Buffer.from(e).toString("base64"),nf=e=>typeof e=="string"?e:Buffer.isBuffer(e)?e.toString("utf8"):Array.isArray(e)?Buffer.concat(e).toString("utf8"):Buffer.from(new Uint8Array(e)).toString("utf8"),Ut={open(e){let t=rs(e.frame.previewSessionId,e.frame.streamId);vn({previewSessionId:e.frame.previewSessionId,streamId:e.frame.streamId,notifyRemote:!1});let r=new Xa(Zg(e.frame.targetUrl||e.targetUrl,e.frame.pathWithQuery),e.frame.subprotocols.length>0?e.frame.subprotocols:void 0,{headers:ef(e.frame.headers)}),n={previewSessionId:e.frame.previewSessionId,streamId:e.frame.streamId,socket:r,tunnelSocket:e.socket,opened:!1,nextSeq:0,queuedFrames:[],closedByControl:!1};ye.set(t,n),r.on("open",()=>{let o=ye.get(t);if(!o)return;o.opened=!0;let s={type:"preview.ws.opened",previewSessionId:o.previewSessionId,streamId:o.streamId,sentAt:Nt(),accepted:!0,selectedSubprotocol:o.socket.protocol||void 0};hr(o.tunnelSocket,s),tf(o)}),r.on("message",(o,s)=>{let i=ye.get(t);if(!i)return;let a=s?{type:"preview.ws.data",previewSessionId:i.previewSessionId,streamId:i.streamId,sentAt:Nt(),seq:i.nextSeq,opcode:"binary",encoding:"base64",data:rf(o)}:{type:"preview.ws.data",previewSessionId:i.previewSessionId,streamId:i.streamId,sentAt:Nt(),seq:i.nextSeq,opcode:"text",encoding:"utf8",data:nf(o)};i.nextSeq+=1,hr(i.tunnelSocket,a)}),r.on("close",(o,s)=>{let i=ye.get(t);if(!i||(ye.delete(t),i.closedByControl))return;let a={type:"preview.ws.close",previewSessionId:i.previewSessionId,streamId:i.streamId,sentAt:Nt(),code:o||void 0,reason:s.toString()||void 0};hr(i.tunnelSocket,a)}),r.on("error",()=>{let o=ye.get(t);if(o&&!o.opened){ye.delete(t);let s={type:"preview.ws.opened",previewSessionId:o.previewSessionId,streamId:o.streamId,sentAt:Nt(),accepted:!1,status:502,message:"local preview websocket connect failed"};hr(o.tunnelSocket,s)}})},handleData(e){let t=ye.get(rs(e.previewSessionId,e.streamId));if(t){if(!t.opened||t.socket.readyState!==Xa.OPEN){t.queuedFrames.push(e);return}if(e.opcode==="binary"){t.socket.send(Buffer.from(e.data,"base64"));return}t.socket.send(e.data)}},handleClose(e){vn({previewSessionId:e.previewSessionId,streamId:e.streamId,code:e.code,reason:e.reason,notifyRemote:!1})},closePreviewSession(e,t){for(let r of ye.values())r.previewSessionId===e&&vn({previewSessionId:r.previewSessionId,streamId:r.streamId,code:1001,reason:t,notifyRemote:!1})},closeAll(e){for(let t of ye.values())vn({previewSessionId:t.previewSessionId,streamId:t.streamId,code:1001,reason:e,notifyRemote:!1})}};var Ne=new Map,ns=()=>new Date().toISOString(),of=e=>JSON.parse(e),sf=async e=>typeof e=="string"?null:e instanceof Uint8Array?e:e instanceof ArrayBuffer?new Uint8Array(e):typeof Blob<"u"&&e instanceof Blob?new Uint8Array(await e.arrayBuffer()):null,$t=(e,t)=>{console.log("[preview-tunnel]",e,t)},af=e=>{try{let t=new URL(e);return`${t.protocol}//${t.host}${t.pathname}`}catch{return"invalid-url"}},Lt=e=>{e.send({type:"preview.tunnel.status",executorId:e.executorId,previewSessionId:e.previewSessionId,status:e.status,message:e.message,at:ns()})},Pn=(e,t)=>{let r=Ne.get(e);if(r){Ut.closePreviewSession(e,t),r.closedByManager=!0;try{r.socket.close(1e3,t)}catch{r.socket.close()}Ne.delete(e)}},cf=e=>{if(e.frame.type==="preview.bind.ack"){let t=e.frame;if(!t.accepted){$t("bind rejected",{previewSessionId:e.connection.previewSessionId,executorId:e.connection.executorId,reason:t.reason||"preview tunnel bind rejected"}),Lt({send:e.send,executorId:e.connection.executorId,previewSessionId:e.connection.previewSessionId,status:"error",message:t.reason||"preview tunnel bind rejected"}),Pn(e.connection.previewSessionId,t.reason||"preview bind rejected");return}e.connection.binaryPayloads=t.binaryPayloads===!0,$t("bind accepted",{previewSessionId:e.connection.previewSessionId,executorId:e.connection.executorId,publicHost:t.publicHost,binaryPayloads:e.connection.binaryPayloads}),Lt({send:e.send,executorId:e.connection.executorId,previewSessionId:e.connection.previewSessionId,status:"open"});return}if(e.frame.type==="preview.tunnel.ping"){let t=e.frame;e.connection.socket.send(JSON.stringify({type:"preview.tunnel.pong",previewSessionId:e.connection.previewSessionId,sentAt:ns(),pingId:t.pingId}));return}if(e.frame.type==="preview.http.request.start"){Dt.handleStart({frame:e.frame,socket:e.connection.socket,targetUrl:e.connection.targetUrl,binaryPayloads:e.connection.binaryPayloads});return}if(e.frame.type==="preview.http.request.body"){Dt.handleBody(e.frame);return}if(e.frame.type==="preview.http.request.end"){Dt.handleEnd({frame:e.frame});return}if(e.frame.type==="preview.http.abort"){Dt.abort(e.frame.previewSessionId,e.frame.streamId);return}if(e.frame.type==="preview.ws.open"){Ut.open({frame:e.frame,socket:e.connection.socket,targetUrl:e.connection.targetUrl});return}if(e.frame.type==="preview.ws.data"){Ut.handleData(e.frame);return}e.frame.type==="preview.ws.close"&&Ut.handleClose(e.frame)},lf=async e=>{let t=await sf(e.data);if(t){if(!e.connection.binaryPayloads)throw new Error("preview tunnel binary payloads not negotiated");let r=Ga(t);if(!r)throw new Error("invalid preview tunnel binary frame");uf({header:r.header,payload:r.payload,connection:e.connection});return}cf({frame:of(String(e.data)),connection:e.connection,send:e.send})},df=e=>{e.connection.messageQueue=e.connection.messageQueue.catch(()=>{}).then(()=>lf(e)).catch(t=>{Lt({send:e.send,executorId:e.connection.executorId,previewSessionId:e.connection.previewSessionId,status:"error",message:t instanceof Error?t.message:"invalid preview tunnel frame"})})},uf=e=>{if(e.header.previewSessionId!==e.connection.previewSessionId){e.connection.socket.close(4410,"preview session mismatch");return}e.header.type==="preview.http.request.body.binary"&&Dt.handleBinaryBody(e.header,e.payload)},jt={open(e,t,r){Pn(e.previewSessionId,"replaced"),Lt({send:r,executorId:t.executorId,previewSessionId:e.previewSessionId,status:"connecting"});let n=wi({cloudUrl:t.cloudUrl,tunnelUrl:e.tunnelUrl}),o=`${n}?preview_session_id=${encodeURIComponent(e.previewSessionId)}&token=${encodeURIComponent(e.tunnelToken)}`,s=new WebSocket(o),i={socket:s,previewSessionId:e.previewSessionId,executorId:t.executorId,closedByManager:!1,targetUrl:e.targetUrl,binaryPayloads:!1,messageQueue:Promise.resolve()};Ne.set(e.previewSessionId,i),$t("connecting",{previewSessionId:e.previewSessionId,executorId:t.executorId,tunnelUrl:af(n),targetUrl:e.targetUrl}),s.addEventListener("open",()=>{let a=Ne.get(e.previewSessionId);if(!a||a.socket!==s)return;$t("websocket open",{previewSessionId:e.previewSessionId,executorId:t.executorId});let c={type:"preview.bind",previewSessionId:e.previewSessionId,sentAt:ns(),protocolVersion:"preview-tunnel.v1",executorId:t.executorId,binaryPayloads:!0};s.send(JSON.stringify(c))}),s.addEventListener("message",a=>{let c=Ne.get(e.previewSessionId);!c||c.socket!==s||df({data:a.data,connection:c,send:r})}),s.addEventListener("error",()=>{let a=Ne.get(e.previewSessionId);!a||a.socket!==s||($t("websocket error",{previewSessionId:e.previewSessionId,executorId:t.executorId}),Lt({send:r,executorId:t.executorId,previewSessionId:e.previewSessionId,status:"error",message:"preview tunnel websocket error"}))}),s.addEventListener("close",a=>{let c=Ne.get(e.previewSessionId);!c||c.socket!==s||(Ne.delete(e.previewSessionId),$t("websocket closed",{previewSessionId:e.previewSessionId,executorId:t.executorId,code:a.code,reason:a.reason?.trim()||void 0,closedByManager:c.closedByManager}),Lt({send:r,executorId:t.executorId,previewSessionId:e.previewSessionId,status:"closed",message:c.closedByManager?void 0:a.reason?.trim()||`code=${a.code}`}))})},close(e,t){Pn(e,t)},closeAll(e){Ut.closeAll(e);for(let t of Ne.keys())Pn(t,e)}};import{createHash as hf}from"node:crypto";import yf from"node:net";import{spawn as kf}from"node:child_process";import{createOpencodeClient as cc}from"@opencode-ai/sdk";var pf=e=>Array.isArray(e)?e:[],mf=e=>e.info?.role==="assistant",kr=e=>e.info?.time?.created??0,gf=(e,t)=>t===void 0?!0:kr(e)>=t,os=(e,t={})=>e.filter(r=>mf(r)&&gf(r,t.promptStartedAtMs)).sort((r,n)=>kr(n)-kr(r)),Qa=(e,t={})=>t.preferredMessageId?e.filter(r=>r.info?.id===t.preferredMessageId):os(e,t).slice().sort((r,n)=>kr(r)-kr(n)),yr=e=>pf(e).filter(t=>t.type==="text").map(t=>t.text?.trim()??"").filter(Boolean).join(`
55
+
56
+ `),Za=(e,t={})=>{let r=t.preferredMessageId?e.find(s=>s.info?.id===t.preferredMessageId):void 0,n=yr(r?.parts);if(n)return n;let o=os(e,t).find(s=>yr(s.parts));return o?yr(o.parts):""},Ya=e=>!!e?.info?.time?.completed||!!e?.info?.error,ec=(e,t={})=>{let r=t.preferredMessageId?e.find(n=>n.info?.id===t.preferredMessageId):void 0;return r&&Ya(r)?!0:os(e,t).some(n=>Ya(n))};var re=(e,t)=>{console.log(`[worker-opencode] ${e}`,JSON.stringify(t))},ve=e=>{if(e instanceof Error)return e.message;if(typeof e=="string")return e;if(e&&typeof e=="object"){let t=e;if(typeof t.message=="string"&&t.message.trim())return t.message;if(typeof t.data?.message=="string"&&t.data.message.trim())return t.data.message;if(typeof t.error?.message=="string"&&t.error.message.trim())return t.error.message;if(typeof t.error?.data?.message=="string"&&t.error.data.message.trim())return t.error.data.message}return"OpenCode \u6267\u884C\u5931\u8D25\u3002"},rc=e=>{if(!e)return;let[t,...r]=e.split("/"),n=r.join("/");if(!(!t||!n))return{providerID:t,modelID:n}},tc=e=>Array.isArray(e)?e:[],ff=e=>yr(e),nc=e=>e.map(t=>({id:t.info?.id,role:t.info?.role,created:t.info?.time?.created,completed:!!t.info?.time?.completed,error:!!t.info?.error,partTypes:tc(t.parts).map(r=>r.type),textPreview:ff(tc(t.parts)).slice(0,160)})),ss=(e,t,r)=>Za(e,{preferredMessageId:t,promptStartedAtMs:r}),oc=(e,t,r)=>Qa(e,{preferredMessageId:t,promptStartedAtMs:r}),is=(e,t,r)=>ec(e,{preferredMessageId:t,promptStartedAtMs:r}),sc=e=>[...e.values()].join("").trim(),ic=(e,t)=>{let r=e.get(t);if(r)return r;let n=new Map;return e.set(t,n),n},as=async e=>new Promise(t=>setTimeout(t,e)),cs=e=>{let t=e?.trim();if(!(!t||t.toLowerCase()==="default")){if(t.startsWith("{")||t.startsWith("[")||t.startsWith('"'))try{let r=JSON.parse(t);if(typeof r=="string")return cs(r);if(r&&typeof r=="object")return r}catch{}switch(t.toLowerCase()){case"auto":case"allow":case"approve":case"acceptedits":case"bypasspermissions":case"yolo":return"allow";case"ask":case"prompt":case"manual":return"ask";case"deny":case"disabled":case"forbid":return"deny";default:return}}},ac=e=>e&&"permissionPolicy"in e?e:void 0;var Ft=new Map,wr=new Set,ds=new Set,lc=(e,t="SIGTERM")=>{if(!e.pid){e.kill(t);return}if(process.platform!=="win32")try{process.kill(-e.pid,t);return}catch{}e.kill(t)},dc=()=>{for(let e of Array.from(ds))lc(e)};process.once("exit",dc);var wf=e=>Object.entries(e??{}).sort(([t],[r])=>t.localeCompare(r)),xf=(e,t)=>hf("sha1").update(JSON.stringify({config:me(e),runtimeEnv:wf(t)})).digest("hex"),Sf=(e,t,r=process.env)=>({...r,...t??{},OPENCODE_CONFIG_CONTENT:JSON.stringify(me(e))}),Cf=()=>{let e=se(`${ce()}/node_modules/.bin/opencode`),t=se("opencode")||e;if(t)return{command:t,args:[],detail:t};let r=se("npx");if(r)return{command:r,args:["-y","opencode-ai"],detail:`${r} -y opencode-ai`};throw new Error("\u672A\u68C0\u6D4B\u5230\u53EF\u6267\u884C\u7684 OpenCode runtime\uFF08`opencode`\uFF09\uFF0C\u65E0\u6CD5\u542F\u52A8 OpenCode \u4F1A\u8BDD\u3002")},vf=async()=>new Promise((e,t)=>{let r=yf.createServer();r.on("error",t),r.listen(0,"127.0.0.1",()=>{let n=r.address();if(!n||typeof n=="string"){r.close(()=>t(new Error("\u65E0\u6CD5\u5206\u914D OpenCode \u7AEF\u53E3\u3002")));return}let{port:o}=n;r.close(s=>{if(s){t(s);return}e(o)})})}),Pf=async(e,t,r)=>{let n=await vf(),o=Cf(),s=kf(o.command,[...o.args,"serve","--hostname=127.0.0.1",`--port=${n}`],{detached:process.platform!=="win32",env:Sf(t,r),stdio:["ignore","pipe","pipe"]});ds.add(s);let i=null;s.once("exit",(l,d)=>{Ft.delete(e),ds.delete(s),i&&wr.delete(i),re("server:exit",{pid:s.pid,code:l,signal:d,port:n})});let a=await new Promise((l,d)=>{let p=setTimeout(()=>{d(new Error(`Timeout waiting for server to start after 15000ms via ${o.detail}`))},15e3),u="",m=!1,f=w=>{m||(m=!0,clearTimeout(p),w())},S=w=>{u+=w.toString();let g=u.split(`
57
+ `);for(let I of g){if(!I.startsWith("opencode server listening"))continue;let v=I.match(/on\s+(https?:\/\/[^\s]+)/);if(!v){f(()=>d(new Error(`Failed to parse server url from output: ${I}`)));return}f(()=>l(v[1]));return}};s.stdout?.on("data",S),s.stderr?.on("data",S),s.on("error",w=>{f(()=>d(w))}),s.on("exit",w=>{f(()=>{let g=u.trim();d(new Error(g?`OpenCode server exited with code ${w}: ${g}`:`OpenCode server exited with code ${w}`))})})}),c=!1;return i={url:a,close(){c||(c=!0,wr.delete(i),lc(s))}},wr.add(i),i},uc=async(e,t)=>{let r=xf(e,t),n=Ft.get(r);if(n)return n;let o=Pf(r,e,t).catch(s=>{throw Ft.delete(r),s});return Ft.set(r,o),o},pc=async()=>{let e=Array.from(Ft.values());Ft.clear(),dc();let t=await Promise.allSettled(e);for(let r of t)r.status==="fulfilled"&&r.value.close();for(let r of Array.from(wr))r.close();wr.clear()},mc=async(e,t,r)=>{let n=await uc(t,r);return cc({baseUrl:n.url,directory:e})},gc=async(e,t)=>{let r=await uc(e,t);return cc({baseUrl:r.url})},ls=async(e,t,r)=>{re("session:create:start",{cwd:t,title:r});let n;try{n=await e.session.create({body:{title:r},query:{directory:t}})}catch(o){throw re("session:create:error",{cwd:t,title:r,error:ve(o)}),o}if(re("session:create:result",{cwd:t,title:r,hasData:!!n.data,sessionId:n.data?.id,error:"error"in n?n.error:void 0,response:"response"in n?n.response:void 0}),!n.data?.id){let o=ve(n);throw new Error(o==="OpenCode \u6267\u884C\u5931\u8D25\u3002"?"OpenCode \u4F1A\u8BDD\u521B\u5EFA\u5931\u8D25":`OpenCode \u4F1A\u8BDD\u521B\u5EFA\u5931\u8D25\uFF1A${o}`)}return n.data.id},fc=async(e,t,r,n)=>{let o=r?.trim();if(!o)return ls(e,t,n);try{return(await e.session.get({path:{id:o},query:{directory:t}})).data?(await e.session.update({path:{id:o},body:{title:n},query:{directory:t}}),o):ls(e,t,n)}catch{return ls(e,t,n)}};import{accessSync as If,constants as Ef,mkdirSync as bf}from"node:fs";var Tf=()=>qe()==="preview"?"vibemux-worker-preview":"vibemux-worker",Rf=e=>{try{return bf(e,{recursive:!0}),If(e,Ef.W_OK),{ok:!0,detail:`Writable: ${e}`}}catch(t){return{ok:!1,detail:t instanceof Error?t.message:"path access failed"}}},Af=e=>{try{return{ok:!0,detail:`Ready: ${mn(e).root}`}}catch(t){return{ok:!1,detail:t instanceof Error?t.message:"workspace setup failed"}}},Mf=async e=>{try{let t=await fetch(e,{method:"GET",signal:AbortSignal.timeout(5e3)});return{ok:!0,status:t.status,message:`Control plane reachable, HTTP ${t.status}`}}catch(t){return{ok:!1,status:void 0,message:t instanceof Error?t.message:"cloud probe failed"}}},Of=async()=>{try{let e=await fetch("https://opencode.ai",{method:"GET",signal:AbortSignal.timeout(5e3)});return{ok:e.ok,status:e.status,url:"https://opencode.ai",message:e.ok?`Official site reachable, HTTP ${e.status}`:`Official site returned an unexpected status, HTTP ${e.status}`}}catch(e){return{ok:!1,status:void 0,url:"https://opencode.ai",message:e instanceof Error?e.message:"official site probe failed"}}},_f=e=>{let t=e.filter(n=>n.ok).length,r=e.length-t;return{total:e.length,passed:t,failed:r,ok:r===0}},hc=async()=>{let e=T(),[t,r,n]=await Promise.all([Mf(e.cloudUrl),Of(),Se({target:"all"})]),o=Rf(Ee()),s=Af(e.workspaceRoot),i=n.items.find(w=>w.id==="git")??{ok:!1,detail:"Git status is unknown."},a=n.items.find(w=>w.id==="opencode")??{ok:!1,detail:"OpenCode runtime status is unknown."},c=n.items.find(w=>w.id==="codex-cli")??{ok:!1,detail:"Codex CLI status is unknown."},l=n.items.find(w=>w.id==="codex-auth")??{ok:!1,detail:"Codex sign-in status is unknown."},d=n.items.find(w=>w.id==="claude-cli")??{ok:!1,detail:"Claude Code CLI status is unknown."},p=n.items.find(w=>w.id==="claude-auth")??{ok:!1,detail:"Claude Code authentication status is unknown."},u=!!e.opencodeConfigContent?.trim(),m=!!e.codexConfigContent?.trim(),f=!!e.claudeCodeConfigContent?.trim(),S=[{id:"git",category:"tooling",label:"Git",ok:i.ok,detail:i.detail,hint:i.ok?void 0:"Install Git first and confirm it is executable from PATH."},{id:"opencode",category:"tooling",label:"OpenCode Runtime",ok:a.ok,detail:a.detail,hint:a.ok?void 0:"Check the worker dependency installation and confirm both `@opencode-ai/sdk` and the local `opencode` runtime are available."},{id:"codex-cli",category:"tooling",label:"Codex CLI",ok:c.ok,detail:c.detail,hint:c.ok?void 0:"Install the Codex CLI first. The worker can also run `npm install -g @openai/codex` automatically."},{id:"codex-auth",category:"tooling",label:"Codex Sign-In",ok:l.ok,detail:l.detail,hint:l.ok?void 0:"Run `codex` and complete sign-in before trying again."},{id:"claude-cli",category:"tooling",label:"Claude Code CLI",ok:d.ok,detail:d.detail,hint:d.ok?void 0:"Install the Claude Code CLI first. The worker prefers the official native install flow."},{id:"claude-auth",category:"tooling",label:"Claude Code Authentication",ok:p.ok,detail:p.detail,hint:p.ok?void 0:"Configure Claude Console/API credentials, or run `claude` and complete sign-in before trying again."},{id:"opencode-config",category:"config",label:"OpenCode Configuration",ok:u,detail:u?"Loaded the OpenCode providers configuration.":"OpenCode providers configuration was not found.",hint:u?void 0:"Add the OpenCode providers JSON in central settings or on this worker machine."},{id:"codex-config",category:"config",label:"Codex Configuration",ok:m,detail:m?"Loaded `Codex config.toml`.":"`Codex config.toml` was not found.",hint:m?void 0:"Provide it through central settings, or prepare `~/.codex/config.toml` on this worker machine."},{id:"claude-config",category:"config",label:"Claude Code Configuration",ok:f,detail:f?"Loaded `Claude Code settings.json`.":"`Claude Code settings.json` was not found.",hint:f?void 0:"Provide it through central settings, or prepare `~/.claude/settings.json` on this worker machine."},{id:"worker-home",category:"filesystem",label:"Worker Home",ok:o.ok,detail:o.detail,hint:o.ok?void 0:"Check directory permissions and confirm the worker home can be created and written."},{id:"workspace",category:"filesystem",label:"Workspace",ok:s.ok,detail:s.detail,hint:s.ok?void 0:"Confirm the workspace root path is valid and writable by the current user."},{id:"machine-id",category:"config",label:"Machine ID",ok:!!e.machineId,detail:e.machineId?`Configured: ${e.machineId}`:"Machine ID is not configured.",hint:e.machineId?void 0:"Reset the local worker config and start the worker again to generate a fresh machine ID."},{id:"pairing",category:"config",label:"Pairing",ok:!!(e.executorId&&e.executorToken),detail:e.executorId?`Paired: ${e.executorId}`:"Pairing has not been completed.",hint:e.executorId?void 0:`Run \`npx -y ${Tf()} connect --pairing-code <CODE>\`, or enter the pairing code in the local worker console.`},{id:"cloud-url",category:"network",label:"Control Plane URL",ok:!!e.cloudUrl?.trim(),detail:e.cloudUrl?.trim()||"Cloud URL is not configured.",hint:e.cloudUrl?.trim()?void 0:"Enter the control-plane Cloud URL first."},{id:"cloud-reachable",category:"network",label:"Control Plane Reachability",ok:t.ok,detail:t.message,hint:t.ok?void 0:"Confirm the control-plane service is running and reachable from this machine."},{id:"official-site",category:"network",label:"OpenCode Official Site",ok:r.ok,detail:r.message,hint:r.ok?void 0:"If the official site is unreachable, the current network likely has outbound access restrictions."}];return{config:Oo(e),checks:{git:i.ok,opencodeAvailable:a.ok,codexCliAvailable:c.ok,codexAuthenticated:l.ok,claudeCliAvailable:d.ok,claudeAuthenticated:p.ok,opencodeConfigLoaded:u,codexConfigLoaded:m,claudeConfigLoaded:f,workerHomeWritable:o.ok,workspaceConfigured:!!e.workspaceRoot,workspaceReady:s.ok,machineIdConfigured:!!e.machineId,paired:!!(e.executorId&&e.executorToken),cloudUrlConfigured:!!e.cloudUrl?.trim(),cloudReachable:t.ok,officialSiteReachable:r.ok},items:S,summary:_f(S),cloudProbe:t,officialSiteProbe:r,runtime:bt()}},us=async()=>{console.log(JSON.stringify(await hc(),null,2))},Bt=()=>hc();import{existsSync as Bf,statfsSync as Wf}from"node:fs";import Pe from"node:os";import yc from"node:path";var kc=null,wc=(e,t=1)=>{let r=10**t;return Math.round(e*r)/r},Df=()=>Pe.cpus().reduce((e,t)=>{let r=t.times.user+t.times.nice+t.times.sys+t.times.idle+t.times.irq;return{idle:e.idle+t.times.idle,total:e.total+r}},{idle:0,total:0}),Nf=()=>{let e=Pe.cpus(),t=Df(),r=kc;kc=t;let n=e.reduce((s,i)=>s+(Number.isFinite(i.speed)?i.speed:0),0),o=(()=>{if(!r)return;let s=t.total-r.total,i=t.idle-r.idle;if(!(s<=0))return wc((1-i/s)*100,1)})();return{coreCount:e.length,model:e[0]?.model,averageSpeedMhz:e.length>0?Math.round(n/e.length):void 0,loadAverage:Pe.loadavg().map(s=>wc(s,2)),usagePercent:o}},Uf=()=>{let e=Pe.totalmem(),t=Pe.freemem();return{totalBytes:e,freeBytes:t,usedBytes:Math.max(0,e-t)}},$f=e=>{let t=yc.resolve(e||process.cwd());for(;!Bf(t);){let r=yc.dirname(t);if(r===t)return process.cwd();t=r}return t},Lf=e=>{try{let t=$f(e),r=Wf(t),n=Number(r.bsize),o=Number(r.blocks),s=Number(r.bfree),i=Number(r.bavail);if(!Number.isFinite(n)||!Number.isFinite(o)||n<=0||o<=0)return;let a=o*n,c=Math.max(0,s*n),l=Math.max(0,i*n);return{path:t,totalBytes:a,freeBytes:c,availableBytes:l,usedBytes:Math.max(0,a-c)}}catch{return}},jf=e=>({platform:process.platform,arch:Pe.arch(),hostname:Pe.hostname(),release:Pe.release(),version:typeof Pe.version=="function"?Pe.version():void 0,nodeVersion:process.version,workerVersion:e,systemUptimeSec:Math.max(0,Math.round(Pe.uptime())),processUptimeSec:Math.max(0,Math.round(process.uptime()))}),In=e=>({capturedAt:new Date().toISOString(),cpu:Nf(),memory:Uf(),disk:Lf(e.workspaceRoot),system:jf(e.workerVersion)});var Ff=(e,t,r)=>({id:`${e}/${t}`,label:`${e}/${t}`,providerId:e,modelId:t,isDefault:r===`${e}/${t}`}),qf=e=>Array.isArray(e)?e.map(t=>{if(!(!t||typeof t!="object"))return"id"in t&&typeof t.id=="string"?t.id:void 0}).filter(t=>!!t):!e||typeof e!="object"?[]:Object.entries(e).map(([t,r])=>!r||typeof r!="object"?t:"id"in r&&typeof r.id=="string"?r.id:t).filter(t=>!!t),Hf=(e,t)=>{if(!e||typeof e!="object")return[];let r=e,n=["cloudflare","cf Workers","cf"];return(Array.isArray(r.providers)?r.providers:[...Object.entries(r.providers??{}).map(([s,i])=>({id:i.id||i.name||s,models:i.models})),...Object.entries(r.provider??{}).map(([s,i])=>({id:i.id||i.name||s,models:i.models}))]).filter(s=>{let i=s.id?.toLowerCase()??"";return!n.some(a=>i.includes(a.toLowerCase()))}).flatMap(s=>{let i=s.id;return i?qf(s.models).map(a=>Ff(i,a,t)):[]}).sort((s,i)=>s.isDefault?-1:i.isDefault?1:s.label.localeCompare(i.label))},ps=async()=>{let e=T(),t=Qr(e).trim(),r=e.defaultModel?.trim()||void 0;if(!t)return{models:[],defaultModel:r,message:"worker \u672A\u914D\u7F6E OpenCode \u63D0\u4F9B\u5546\u3002"};try{let o=await(await gc(t)).config.providers(),s="data"in o?o.data:o,i=Object.entries(s?.default??{}).find(([,c])=>!!c),a=i?`${i[0]}/${i[1]}`:r;return{models:Hf(s,a),defaultModel:a,message:void 0}}catch(n){return re("models:error",{error:ve(n)}),{models:[],defaultModel:r,message:ve(n)}}};import{existsSync as zf}from"node:fs";var xc=e=>{let t=e,r=t.payload&&typeof t.payload=="object"?t.payload:t;return!r.type||!r.properties?null:{type:r.type,properties:r.properties}};var En=e=>se(e),xr=e=>{try{return JSON.parse(e)}catch{return null}},M=(e,t,r)=>{t?.({agentType:e,...r})},Sc=e=>{let t=e?.reason;return typeof t=="string"?t:t&&typeof t=="object"&&"reason"in t&&typeof t.reason=="string"?t.reason:"unknown"},Gf=e=>{let t=e?.reason;if(typeof t=="string")return t==="user_stop"?"\u5DF2\u505C\u6B62":"\u4EFB\u52A1\u5DF2\u53D6\u6D88";if(t&&typeof t=="object"&&"message"in t&&typeof t.message=="string"&&t.message.trim())return t.message;switch(Sc(e)){case"user_stop":return"\u5DF2\u505C\u6B62";case"server_timeout":return"\u8BF7\u6C42\u8D85\u65F6\uFF0C\u5DF2\u4E2D\u6B62\u672C\u6B21\u56DE\u590D\u3002";case"executor_disconnected":return"\u6267\u884C\u5668\u5FC3\u8DF3\u8D85\u65F6\uFF0C\u5DF2\u4E2D\u6B62\u672C\u6B21\u56DE\u590D\u3002";case"executor_reconnect":return"\u6267\u884C\u5668\u8FDE\u63A5\u5DF2\u65AD\u5F00\uFF0C\u5DF2\u4E2D\u6B62\u672C\u6B21\u56DE\u590D\u3002";case"control_plane_disconnect":return"\u6267\u884C\u5668\u4E0E\u63A7\u5236\u9762\u8FDE\u63A5\u5DF2\u65AD\u5F00\uFF0C\u672C\u6B21\u56DE\u590D\u5DF2\u4E2D\u6B62\u3002";case"server_abort":return"\u8BF7\u6C42\u5DF2\u4E2D\u6B62";default:return"\u4EFB\u52A1\u5DF2\u53D6\u6D88"}},Ie=e=>{let t=new Error(Gf(e));return t.name="AbortError",t.abortReason=Sc(e),t},Ue=e=>{let t=e?.trim();if(!(!t||t==="default"))return t};var Cc=500,vc=12e4,ms=1e3,Pc=async(e,t,r)=>{try{let n=await e.session.messages({path:{id:r},query:{directory:t,limit:20}});return nc(Array.isArray(n.data)?n.data:[])}catch(n){return[{snapshotError:ve(n)}]}},Kf=e=>{let r={...me(e.baseConfigContent)},n=e.agent?.trim()||void 0,o=cs(e.permissionPolicy),s=e.variant?.trim()||void 0;if(n&&typeof r.default_agent!="string"&&(r.default_agent=n),!o&&!s)return JSON.stringify(r);if(!n)return o&&(r.permission=o),JSON.stringify(r);let i=r.agent&&typeof r.agent=="object"&&!Array.isArray(r.agent)?r.agent:{},a=i[n];return r.agent={...i,[n]:a&&typeof a=="object"&&!Array.isArray(a)?{...a,...o?{permission:o}:{},...s?{variant:s}:{}}:{...o?{permission:o}:{},...s?{variant:s}:{}}},JSON.stringify(r)},Vf=e=>{let t=T(),r=ac(e.agentSettings),n=e.opencodeConfig?.agent?.trim()||r?.agent?.trim()||void 0,o=e.opencodeConfig?.variant?.trim()||void 0,s=e.opencodeConfig?.permissionPolicy?.trim()||r?.permissionPolicy?.trim()||void 0,i=e.executionModel?.trim()||e.opencodeConfig?.model?.trim()||r?.defaultModel?.trim()||void 0,a=Array.isArray(e.mcpServers),l=[...e.mcpServers??t.mcpServers??[],...e.opencodeConfig?.mcpServers??[]],d=a||e.opencodeConfig?.mcpServers?.length?zr(t.opencodeConfigContent,l,{cloudUrl:t.cloudUrl,executorToken:t.executorToken,actingUserId:e.actingUserId}).trim():Qr(t,e.actingUserId).trim();return{agent:n,variant:o,executionModel:i,configContent:Kf({baseConfigContent:d,agent:n,permissionPolicy:s,variant:o})}},Ic=e=>{let t=e instanceof Error?e.message:typeof e=="string"?e:"";return/\babort(ed|ing)?\b/i.test(t)},Jf=(e,t)=>{let r=e?.data;if(!(!r||typeof r!="object"))return t in r?r[t]:void 0},Ec=async e=>{if(!zf(e.cwd))throw new Error(`\u5DE5\u4F5C\u76EE\u5F55\u4E0D\u5B58\u5728: ${e.cwd}`);let t=Vf({actingUserId:e.actingUserId,executionModel:e.executionModel,agentSettings:e.agentSettings,opencodeConfig:e.opencodeConfig,mcpServers:e.mcpServers}),r=await mc(e.cwd,t.configContent,e.runtimeEnv),n=await fc(r,e.cwd,e.resumeSessionId,e.title),o=Date.now(),s=!1,i=null,a=new Map,c=!1,l="",d=new AbortController,p=new Set,u=new Set,m=new Map,f=new Map,S="",w=!1,g=!1,I=()=>{s=!0,d.abort(),r.session.abort({path:{id:n},query:{directory:e.cwd}}).catch(()=>{})};e.signal?.addEventListener("abort",I,{once:!0});try{let v=(x,b)=>x.sessionID&&x.sessionID!==n||x.role!=="assistant"||!x.id?!1:x.time?.created!==void 0&&x.time.created<Math.max(0,o-ms)?(u.add(x.id),!1):(l=x.id,c=!0,b==="stream"&&re("event:message-updated",{sessionId:n,assistantMessageId:l,role:x.role}),!0),E=(x,b)=>x.sessionID&&x.sessionID!==n||x.messageID&&u.has(x.messageID)||(!l&&x.messageID&&(l=x.messageID),l&&x.messageID&&x.messageID!==l)?!1:(c=!0,b==="stream"&&re("event:message-part",{sessionId:n,assistantMessageId:l,partId:x.id,messageId:x.messageID,partType:x.type,textPreview:(x.text??"").slice(0,120)}),x.type==="text"&&x.messageID&&x.id&&ic(a,x.messageID).set(x.id,x.text??""),!0),F=(x,b,A)=>{let h=b?.type?JSON.stringify(b):"";h&&h!==S&&(S=h,e.onEvent?.({type:"session.status",properties:{sessionID:n,status:b}}));let P=oc(x,l,A).filter(R=>R.info?.role==="assistant"&&R.info?.id);for(let R of P){let y=R.info;if(y?.id){p.has(y.id)||(p.add(y.id),e.onEvent?.({type:"message.updated",properties:{info:y}})),v(y,"snapshot");for(let C of R.parts??[]){if(C.type!=="text"&&C.type!=="reasoning"&&C.type!=="tool")continue;let k=C.id?C:{...C,id:`${R.info?.id}:${C.type}:${C.tool??"part"}`},B=JSON.stringify({type:k.type,text:k.text??"",tool:k.tool??"",state:k.state??null,time:k.time??null});if(m.get(k.id)===B)continue;m.set(k.id,B);let ue=f.get(k.id)??"",yt=k.text??"";(k.type==="text"||k.type==="reasoning")&&f.set(k.id,yt);let hi=yt&&yt.startsWith(ue)?yt.slice(ue.length):void 0;e.onEvent?.({type:"message.part.updated",properties:hi===void 0?{part:k}:{part:k,delta:hi}}),E(k,"snapshot")}}}},O=async()=>{for(;!g&&!s&&!e.signal?.aborted&&Date.now()-o<vc;){try{let[x,b]=await Promise.all([r.session.messages({path:{id:n},query:{directory:e.cwd,limit:20}}),r.session.status({query:{directory:e.cwd}}).catch(()=>null)]),A=Array.isArray(x.data)?x.data:[],h=Jf(b,n),P=l?void 0:Math.max(0,o-ms),R=h?.type==="busy",y=ss(A,l,P),C=is(A,l,P);if(F(A,h,P),y&&(c=!0),!R&&C){w||(w=!0,e.onEvent?.({type:"session.idle",properties:{sessionID:n}})),d.abort();break}}catch(x){if(g||s||e.signal?.aborted||Ic(x))return}if(g||s||e.signal?.aborted)return;await as(Cc)}};re("prompt:start",{cwd:e.cwd,title:e.title,executionModel:t.executionModel??"default",agent:t.agent??"default",variant:t.variant??"default",promptPreview:e.prompt.slice(0,200)});let z=await r.event.subscribe({signal:d.signal});re("prompt:subscribed",{cwd:e.cwd,sessionId:n});let D=r.session.promptAsync({path:{id:n},query:{directory:e.cwd},body:{model:rc(t.executionModel),agent:t.agent,parts:[{type:"text",text:e.prompt}]}}).catch(x=>{s||e.signal?.aborted||(i=x instanceof Error?x:new Error(ve(x)),g=!0,re("prompt:async-error",{cwd:e.cwd,sessionId:n,error:i.message}),d.abort())}),L=O();try{for await(let x of z.stream){if(s||e.signal?.aborted)throw Ie(e.signal);let b=xc(x);if(b){if(b.type==="permission.updated"&&e.onEvent?.({type:"permission.updated",properties:b.properties}),b.type==="session.status"){e.onEvent?.({type:"session.status",properties:b.properties}),b.properties.sessionID===n&&(c=!0,re("event:session-status",{sessionId:n,status:b.properties.status}));continue}if(b.type==="message.updated"){e.onEvent?.({type:"message.updated",properties:b.properties});let A=b.properties.info;v(A,"stream");continue}if(b.type==="message.part.updated"){e.onEvent?.({type:"message.part.updated",properties:b.properties});let A=b.properties.part;E(A,"stream");continue}if(b.type==="session.error"){e.onEvent?.({type:"session.error",properties:b.properties});let A=b.properties;if(A.sessionID!==n)continue;throw re("event:session-error",{sessionId:n,error:A.error}),new Error(ve(A.error))}if(b.type==="session.idle"&&(e.onEvent?.({type:"session.idle",properties:b.properties}),b.properties.sessionID===n&&c)){w=!0,re("event:session-idle",{sessionId:n,assistantMessageId:l,textPartCount:l?a.get(l)?.size??0:0});break}}}}catch(x){if(!(s||e.signal?.aborted||w||Ic(x)))throw x}if(await L,g=!0,d.abort(),await D,s||e.signal?.aborted)throw Ie(e.signal);if(i)throw i;let j=l?sc(a.get(l)??new Map):"";if(!j)for(let x=0;x===0||Date.now()-o<vc;x+=1){x>0&&await as(Cc);let[b,A]=await Promise.all([r.session.messages({path:{id:n},query:{directory:e.cwd,limit:20}}),r.session.status({query:{directory:e.cwd}}).catch(()=>null)]),h=Array.isArray(b.data)?b.data:[],P=l?void 0:Math.max(0,o-ms),y=(A?.data&&typeof A.data=="object"&&n in A.data?A.data[n]:void 0)?.type==="busy";j=ss(h,l,P);let C=is(h,l,P);if(j&&!y&&C||!y&&C)break}let J=j?void 0:await Pc(r,e.cwd,n);return re("prompt:finish",{cwd:e.cwd,sessionId:n,assistantMessageId:l,sawRelevantActivity:c,snapshotSettled:w,emptyOutputSnapshot:J,outputPreview:(j||"OpenCode \u672A\u8FD4\u56DE\u6587\u672C\u8F93\u51FA\u3002").slice(0,200)}),{sessionId:n,output:j||"OpenCode \u672A\u8FD4\u56DE\u6587\u672C\u8F93\u51FA\u3002"}}catch(v){throw g=!0,re("prompt:error",{cwd:e.cwd,sessionId:n,assistantMessageId:l,aborted:s,error:ve(v),snapshot:await Pc(r,e.cwd,n)}),v}finally{e.signal?.removeEventListener("abort",I)}},gs=async e=>{let t=[`\u4EFB\u52A1\u6807\u9898: ${e.title}`,`\u4EFB\u52A1\u63CF\u8FF0: ${e.description}`,"","\u8BF7\u76F4\u63A5\u5728\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u5B8C\u6210\u4EFB\u52A1\u6240\u9700\u4FEE\u6539\u3002","\u5982\u679C\u9700\u8981\u8BFB\u53D6\u4EE3\u7801\u3001\u7F16\u8F91\u6587\u4EF6\u3001\u8FD0\u884C\u6D4B\u8BD5\u6216\u751F\u6210\u8865\u4E01\uFF0C\u8BF7\u76F4\u63A5\u6267\u884C\u3002","\u5B8C\u6210\u540E\u8BF7\u8FD4\u56DE\u7B80\u6D01\u603B\u7ED3\uFF1A\u505A\u4E86\u4EC0\u4E48\u3001\u662F\u5426\u8FD8\u6709\u963B\u585E\u3002"].join(`
58
+ `);return Ec({actingUserId:e.actingUserId,cwd:e.cwd,title:`Task: ${e.title}`,prompt:t,executionModel:e.executionModel,agentSettings:e.agentSettings,opencodeConfig:e.opencodeConfig,mcpServers:e.mcpServers,runtimeEnv:e.runtimeEnv,signal:e.signal})},fs=async e=>Ec({actingUserId:e.actingUserId,resumeSessionId:e.resumeSessionId,cwd:e.cwd,title:e.title,prompt:e.prompt,executionModel:e.executionModel,agentSettings:e.agentSettings,opencodeConfig:e.opencodeConfig,mcpServers:e.mcpServers,runtimeEnv:e.runtimeEnv,signal:e.signal,onEvent:e.onEvent});var bc=async e=>{let t=T();return e==="Codex"?Gi(t):ps()};import{existsSync as Xf,readFileSync as Yf}from"node:fs";import Tc from"node:os";import bn from"node:path";var Qf=e=>{let t=e.trim().match(/^\$\{([A-Z0-9_]+)\}$/i);return t?process.env[t[1]]?.trim()||"":e.trim()},Rn=e=>typeof e!="string"?"":Qf(e).trim(),ze=e=>!!e&&typeof e=="object"&&!Array.isArray(e),qt=(e,t)=>{for(let r of t){let n=Rn(e[r]);if(n)return n}return""},Rc=e=>{if(!Xf(e))return null;try{let t=JSON.parse(Yf(e,"utf8"));return ze(t)?t:null}catch{return null}},Zf=e=>{let t=e.trim();return t?t==="~"?Tc.homedir():t.startsWith("~/")?bn.join(Tc.homedir(),t.slice(2)):t:""},eh=e=>{if(typeof e!="string")return"";let t=e.trim();return!t||t.startsWith("!")?"":/^[A-Z0-9_]+$/i.test(t)?process.env[t]?.trim()||"":t},th=e=>{let t=Rn(e.model);if(t)return t;let r=e.env&&typeof e.env=="object"?e.env:{};return qt(r,["ANTHROPIC_MODEL","ANTHROPIC_DEFAULT_SONNET_MODEL","ANTHROPIC_DEFAULT_OPUS_MODEL","ANTHROPIC_DEFAULT_HAIKU_MODEL"])},rh=(e,t)=>{let r=me(e.opencodeConfigContent),n=Object.entries(r.provider??r.providers??{}),o=new Map;for(let[s,i]of n){if(!i||typeof i!="object")continue;let a=i,c=qt(a,["baseURL","baseUrl","base_url","url","endpoint"]),l=qt(a,["apiKey","api_key","token","authToken","apiToken"]);o.set(s,{...c?{baseUrl:c}:{},...l?{apiToken:l}:{}})}return t.map(s=>({providerId:s.providerId,modelId:s.modelId,label:`OpenCode \xB7 ${s.id}`,...o.get(s.providerId),runtimeSettings:{defaultModel:s.id}}))};var hs=e=>{let t=e?.trim()||"";if(!t)return null;let r=t.indexOf("/");if(r<0)return null;let n=t.slice(0,r).trim(),o=t.slice(r+1).trim();return!n||!o?null:{providerId:n,modelId:o}},nh=new Map([["claude","anthropic"],["dashscope","qwen"],["gemini","google"],["glm","zhipu"],["grok","xai"],["kimi","moonshot"],["volcengine","doubao"]]),Ac=new Set(["anthropic","baichuan","deepseek","doubao","google","groq","minimax","minimax-cn","mistral","moonshot","openai","openrouter","pi","qwen","xai","zhipu"]),oh=[{providerId:"anthropic",hostname:"api.anthropic.com"},{providerId:"deepseek",hostname:"api.deepseek.com"},{providerId:"google",hostname:"generativelanguage.googleapis.com"},{providerId:"groq",hostname:"api.groq.com"},{providerId:"minimax-cn",hostname:"api.minimaxi.com"},{providerId:"minimax",hostname:"api.minimax.io"},{providerId:"mistral",hostname:"api.mistral.ai"},{providerId:"moonshot",hostname:"api.moonshot.ai"},{providerId:"openai",hostname:"api.openai.com"},{providerId:"openrouter",hostname:"openrouter.ai"},{providerId:"qwen",hostname:"dashscope.aliyuncs.com"},{providerId:"xai",hostname:"x.ai"},{providerId:"zhipu",hostname:"open.bigmodel.cn"}],Mc=e=>e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,""),sh=e=>{let t=e?.trim()||"";if(!t)return"";let r=Mc(t);return nh.get(r)||(Ac.has(r)?r:t)},ih=(e,t)=>e===t||e.endsWith(`.${t}`),ah=e=>oh.find(r=>ih(e,r.hostname))?.providerId||"",ch=e=>{let t=e?.trim();if(!t)return"";try{let n=new URL(t).hostname.toLowerCase(),o=ah(n);if(o)return o;let i=["minimax","openrouter","anthropic","openai","deepseek","moonshot","kimi","gemini","google","xai","grok","groq","qwen","dashscope","doubao","volcengine","baichuan","zhipu","glm","mistral"].find(d=>n.includes(d));if(i)return i==="kimi"?"moonshot":i==="gemini"?"google":i==="grok"?"xai":i==="dashscope"?"qwen":i==="volcengine"?"doubao":i==="glm"?"zhipu":i;let a=n.split(".").filter(Boolean),c=new Set(["api","www","chat","cn","com","net","org","io","ai"]),l=a.find(d=>!c.has(d));return l?Mc(l):""}catch{return""}},lh=e=>{let t=e?.trim().toLowerCase()||"";return t?t.includes("minimax")?"minimax":t.includes("claude")?"anthropic":t.includes("gpt")?"openai":t.includes("gemini")?"google":t.includes("deepseek")?"deepseek":t.includes("kimi")||t.includes("moonshot")?"moonshot":t.includes("grok")?"xai":t.includes("qwen")?"qwen":t.includes("doubao")?"doubao":t.includes("glm")?"zhipu":"":""},dh=(e,t)=>!e||!t||e===t||!Ac.has(t)?!1:e==="openai"||e==="anthropic"?!0:e==="minimax"&&t==="minimax-cn",ys=e=>{let t=sh(e.explicitProviderId),r=ch(e.baseUrl);return dh(t,r)?r:t||r||lh(e.modelId)||e.fallbackProviderId.trim()},uh=(e,t)=>{let r=t.trim().toLowerCase();if(!r)return null;for(let[n,o]of Object.entries(e))if(n.trim().toLowerCase()===r)return ze(o)?{providerId:n,config:o}:null;return null},Oc=(e,t)=>{let r=e.trim(),n=t.trim();return!r||!n?n||r:n.toLowerCase().startsWith(`${r.toLowerCase()}/`)?n:`${r}/${n}`},Tn=(e,t,r)=>`${e} \xB7 ${Oc(t,r)}`,ph=(e,t)=>{let r=e.codexConfigContent?.trim()||"",n=le({authContent:e.codexAuthContent,configContent:r}),o=n.configuredModel,s=n.baseUrl,i=n.apiToken,a=hs(o)?.providerId||n.providerId,c=ys({explicitProviderId:a,baseUrl:s,modelId:o,fallbackProviderId:"openai"}),l=t.filter(d=>d.providerId.trim().toLowerCase()===c.trim().toLowerCase());return l.length>0?l.map(d=>({providerId:c,modelId:d.modelId,label:Tn("Codex",c,d.modelId),...s?{baseUrl:s}:{},...i?{apiToken:i}:{},runtimeSettings:{defaultModel:d.modelId}})):o?[{providerId:c,modelId:o,label:Tn("Codex",c,o),...s?{baseUrl:s}:{},...i?{apiToken:i}:{},runtimeSettings:{defaultModel:o}}]:[]},mh=e=>{let t=e.claudeCodeConfigContent?.trim()||"";if(!t)return[];try{let r=JSON.parse(t),n=th(r);if(!n)return[];let o=r.env&&typeof r.env=="object"?r.env:{},s=qt(o,["ANTHROPIC_BASE_URL","ANTHROPIC_API_URL"])||process.env.ANTHROPIC_BASE_URL?.trim()||"",i=qt(o,["ANTHROPIC_AUTH_TOKEN","ANTHROPIC_API_KEY"])||process.env.ANTHROPIC_AUTH_TOKEN?.trim()||process.env.ANTHROPIC_API_KEY?.trim()||"",a=hs(n)?.providerId,c=ys({explicitProviderId:a,baseUrl:s,modelId:n,fallbackProviderId:"anthropic"});return[{providerId:c,modelId:n,label:Tn("ClaudeCode",c,n),...s?{baseUrl:s}:{},...i?{apiToken:i}:{},runtimeSettings:{defaultModel:n}}]}catch{return[]}},gh=e=>{if(!ze(e.agentSettings))return"";let t=ze(e.agentSettings.Pi)?e.agentSettings.Pi:null;return typeof t?.defaultModel=="string"?t.defaultModel.trim():""},fh=e=>ze(e.agentSettings.Pi)&&typeof e.agentSettings.Pi.agentDir=="string"&&e.agentSettings.Pi.agentDir.trim()?e.agentSettings.Pi.agentDir.trim():"",hh=(e,t)=>{for(let[r,n]of Object.entries(e)){if(!ze(n)||!Array.isArray(n.models))continue;if(n.models.some(s=>ze(s)&&Rn(s.id)===t))return r}return""},yh=e=>{let t=gh(e);if(!t)return[];let r=fh(e),n=r?bn.resolve(Zf(r)):"",o=n?Rc(bn.join(n,"settings.json")):null,s=n?Rc(bn.join(n,"models.json")):null,i=ze(s?.providers)?s.providers:{},a=hs(t),c=a?.providerId||"",l=a?.modelId||t,d=c?"":Rn(o?.defaultProvider),p=d||c?"":hh(i,l),m=[d,c,p].filter(Boolean).map(v=>uh(i,v)).find(v=>!!v)??null,f=m?.config??null,S=f?qt(f,["baseUrl","baseURL","base_url","url","endpoint"]):"",w=f?eh(f.apiKey):"",g=ys({explicitProviderId:d||c||p||m?.providerId,baseUrl:S,modelId:l,fallbackProviderId:"pi"}),I=Oc(g,l);return[{providerId:g,modelId:l,label:Tn("Pi",g,l),...S?{baseUrl:S}:{},...w?{apiToken:w}:{},runtimeSettings:{defaultModel:I,...n?{agentDir:n}:{}}}]},_c=e=>e.agentType==="OpenCode"?rh(e.config,e.availableModels):e.agentType==="Codex"?ph(e.config,e.availableModels):e.agentType==="ClaudeCode"?mh(e.config):e.agentType==="Pi"?yh(e.config):[];var Bc=(e,t)=>{console.log("[worker-config-sync]",e,JSON.stringify(t))},Wc=e=>{let t=e.codexConfigContent?.trim()||"",r=e.codexAuthContent?.trim()||"",n=le({configContent:t,authContent:r});return{executorId:e.executorId||"",defaultModel:e.defaultModel||"",codexDefaultModel:e.agentSettings?.Codex?.defaultModel||"",hasOpencodeConfigContent:!!e.opencodeConfigContent?.trim(),opencodeConfigLength:e.opencodeConfigContent?.length??0,hasCodexConfigContent:!!t,codexConfigLength:t.length,hasCodexAuthContent:!!r,codexAuthLength:r.length,codexProviderId:n.providerId,codexConfiguredModel:n.configuredModel||"",codexManagedCredentialEnvKeys:Object.keys(at(r)).sort(),hasClaudeCodeConfigContent:!!e.claudeCodeConfigContent?.trim(),claudeCodeConfigLength:e.claudeCodeConfigContent?.length??0,mcpServerCount:e.mcpServers?.length??0,maxConcurrency:e.maxConcurrency}},ks=e=>{let t=T(),r=e.opencodeConfigContent!==void 0?e.opencodeConfigContent:t.opencodeConfigContent,n=e.codexConfigContent!==void 0?e.codexConfigContent:t.codexConfigContent,o=e.codexAuthContent!==void 0?e.codexAuthContent:t.codexAuthContent,s=e.claudeCodeConfigContent!==void 0?e.claudeCodeConfigContent:t.claudeCodeConfigContent,i=e.defaultModel!==void 0?e.defaultModel:t.defaultModel,a={...t,opencodeConfigContent:r,codexConfigContent:n,codexAuthContent:o,claudeCodeConfigContent:s,defaultModel:i,agentSettings:ar(e.agentSettings??t.agentSettings,i),mcpServers:e.mcpServers??t.mcpServers??[],maxConcurrency:Math.max(1,e.maxConcurrency??t.maxConcurrency)};return be(a),q({config:a}),a};var Dc=(e,t)=>{let r=t.getConfig();if(e.type==="control-plane.ready")return r=ks({opencodeConfigContent:e.opencodeConfigContent,codexConfigContent:e.codexConfigContent,codexAuthContent:e.codexAuthContent,claudeCodeConfigContent:e.claudeCodeConfigContent,defaultModel:e.defaultModel,agentSettings:e.agentSettings,mcpServers:e.mcpServers,maxConcurrency:e.maxConcurrency}),t.setConfig(r),q({config:r,executorId:r.executorId}),Bc("control-plane.ready",Wc(r)),!0;if(e.type==="config.sync")return r=ks({opencodeConfigContent:e.opencodeConfigContent,codexConfigContent:e.codexConfigContent,codexAuthContent:e.codexAuthContent,claudeCodeConfigContent:e.claudeCodeConfigContent,defaultModel:e.defaultModel,agentSettings:e.agentSettings,mcpServers:e.mcpServers,maxConcurrency:e.maxConcurrency}),t.setConfig(r),q({config:r}),Bc("config.sync",Wc(r)),!0;if(e.type==="executor.unpair"){let n=en();return t.setConfig(n),q({daemonMode:"unpaired",paired:!1,connected:!1,executorId:void 0,config:n,lastError:e.reason||"This worker was removed from the control plane."}),!0}return e.type==="executor.shutdown"?(t.requestShutdown(e.reason||"Control plane requested worker shutdown."),!0):e.type==="config.export.request"?(r=T(),t.setConfig(r),bc(e.agentType).then(n=>{let o=Ni(),s=Xr(),i=Yr(),a=Co(),c={...r,opencodeConfigContent:o||r.opencodeConfigContent,codexConfigContent:s||r.codexConfigContent,codexAuthContent:i||r.codexAuthContent,claudeCodeConfigContent:a||r.claudeCodeConfigContent};t.send({type:"config.export.response",executorId:r.executorId,requestId:e.requestId,opencodeConfigContent:c.opencodeConfigContent,codexConfigContent:c.codexConfigContent,codexAuthContent:c.codexAuthContent,claudeCodeConfigContent:c.claudeCodeConfigContent,defaultModel:n.defaultModel??r.defaultModel,agentSettings:r.agentSettings,availableModels:n.models,resolvedModelBindings:e.includeResolvedModelBindings?_c({config:c,agentType:e.agentType,availableModels:n.models}):void 0,modelsMessage:n.message,at:new Date().toISOString()})}),!0):e.type==="executor.telemetry.request"?(r=T(),t.setConfig(r),t.send({type:"executor.telemetry.response",executorId:r.executorId,requestId:e.requestId,telemetry:In({workspaceRoot:r.workspaceRoot,workerVersion:pe()}),at:new Date().toISOString()}),!0):!1};import{readFileSync as Hy}from"node:fs";import{basename as Gy}from"node:path";var kh=e=>e.startsWith("glpat-")?"gitlab":e.startsWith("ghp_")||e.startsWith("github_pat_")||e.startsWith("gho_")||e.startsWith("ghu_")||e.startsWith("ghs_")||e.startsWith("ghr_")?"github":null,Nc=()=>AbortSignal.timeout(8e3),Uc=e=>{let t=e?.trim().toLowerCase()||"";if(!t)return"";let r=t.includes("://")?void 0:/^[^@/]+@([^:/?#]+):/i.exec(t)?.[1];if(r)return r;try{return new URL(/^[a-z][a-z\d+.-]*:\/\//i.test(t)?t:`https://${t}`).host}catch{return t.replace(/^https?:\/\//,"").split(/[/?#]/)[0].replace(/\/+$/,"")}},wh=e=>{let t=Uc(e);return!t||t==="github.com"?"https://api.github.com/user":`https://${t}/api/v3/user`},xh=e=>`https://${Uc(e)||"gitlab.com"}/api/v4/user`,Sh=async(e,t)=>{try{let r=await fetch(wh(t),{headers:{Accept:"application/vnd.github+json",Authorization:`Bearer ${e}`,"User-Agent":"vibemux-pat-check"},signal:Nc()});return r.status===401?{ok:!1,unauthorized:!0,message:"GitHub \u8FD4\u56DE 401\uFF0Ctoken \u4E0D\u53EF\u7528\u3002"}:r.ok?{ok:!0,account:(await r.json()).login||"unknown",scopes:r.headers.get("x-oauth-scopes")||void 0,message:"GitHub PAT \u53EF\u7528\u3002"}:{ok:!1,message:`GitHub \u6821\u9A8C\u5931\u8D25\uFF08HTTP ${r.status}\uFF09\u3002`}}catch(r){return{ok:!1,message:r instanceof Error?r.message:"GitHub \u6821\u9A8C\u5931\u8D25\u3002"}}},Ch=async(e,t)=>{try{let r=await fetch(xh(t),{headers:{"PRIVATE-TOKEN":e,"User-Agent":"vibemux-pat-check"},signal:Nc()});if(r.status===401)return{ok:!1,unauthorized:!0,message:"GitLab \u8FD4\u56DE 401\uFF0Ctoken \u4E0D\u53EF\u7528\u3002"};if(!r.ok)return{ok:!1,message:`GitLab \u6821\u9A8C\u5931\u8D25\uFF08HTTP ${r.status}\uFF09\u3002`};let n=await r.json();return{ok:!0,account:n.username||n.name||"unknown",message:"GitLab PAT \u53EF\u7528\u3002"}}catch(r){return{ok:!1,message:r instanceof Error?r.message:"GitLab \u6821\u9A8C\u5931\u8D25\u3002"}}},$c=async(e,t,r)=>{let n=e.trim();if(!n)return{ok:!1,message:"PAT \u4E0D\u80FD\u4E3A\u7A7A\u3002"};let o=kh(n),s=t?[t]:o?[o]:["github","gitlab"];for(let i of s){let a=i==="github"?await Sh(n,r):await Ch(n,r);if(a.ok){let c=i==="github"&&a.scopes?`\uFF0Cscopes\uFF1A${a.scopes}`:"",l=i==="github"?"\u3002\u63D0\u793A\uFF1A\u6B64\u5904\u4EC5\u9A8C\u8BC1 token \u672C\u8EAB\uFF1B\u8BBF\u95EE\u79C1\u6709\u4ED3\u5E93\u8FD8\u9700\u8981\u8BE5 token \u88AB\u6388\u4E88\u76EE\u6807\u4ED3\u5E93\u8BFB\u53D6\u6743\u9650":"";return{ok:!0,provider:i,account:a.account,message:`${i==="github"?"GitHub":"GitLab"} \u6821\u9A8C\u901A\u8FC7\uFF0C\u5F53\u524D\u8D26\u53F7 ${a.account}${c}${l}\u3002`}}if(!a.unauthorized||o)return{ok:!1,provider:i,message:a.message}}return{ok:!1,message:"\u672A\u8BC6\u522B PAT \u5BF9\u5E94\u5E73\u53F0\uFF0C\u6216 token \u5DF2\u5931\u6548\u3002"}};import{createHash as vh}from"node:crypto";import{accessSync as Lc,existsSync as Gt,mkdirSync as Ph,readdirSync as Fc,readFileSync as xs,rmSync as Ih,statSync as Ss,unlinkSync as Eh,writeFileSync as bh}from"node:fs";import Th from"node:os";import Z from"node:path";var ws=1,An=1,Rh=64*1024*1024,Ah=200*1024,Mh=e=>e?.trim()||process.env.VIBEMUX_AGENT_HOME?.trim()||Z.join(Th.homedir(),".vibemux"),Cs=e=>e.replace(/\\/g,"/").replace(/^\/+/,"").split("/").filter(t=>t&&t!==".").join("/"),Oh=(e,t)=>{let r=Z.relative(e,t);return r===""||!r.startsWith("..")&&!Z.isAbsolute(r)},_h=e=>{let t=e.trim();if(!t)throw new Error("Agent ID \u4E0D\u80FD\u4E3A\u7A7A\u3002");return t.replace(/[^a-zA-Z0-9._-]+/g,"-")},Te=e=>{Gt(e)||Ph(e,{recursive:!0})},qc=e=>{if(!Gt(e))return null;try{return JSON.parse(xs(e,"utf8"))}catch{return null}},vs=(e,t)=>{bh(e,`${JSON.stringify(t,null,2)}
59
+ `,"utf8")},jc=e=>new Date(e).toISOString(),Bh=(e,t)=>{if(!(t>Rh))return vh("sha256").update(xs(e)).digest("hex")},Hc=(e,t)=>{let r=_h(e),n=Z.join(Mh(t),"agents",r),o=Z.join(n,"workdir"),s=Z.join(n,".system"),i=Z.join(s,"manifest.json"),a=Z.join(s,"snapshots"),c=Z.join(a,"current.json"),l=Z.join(s,"sessions"),d=Z.join(s,"runtime"),p=Z.join(d,"temp"),u=Z.join(s,"logs");return{rootPath:n,workDirPath:o,systemPath:s,manifestPath:i,snapshotsDir:a,snapshotPath:c,sessionsDir:l,runtimeDir:d,runtimeTempDir:p,logsDir:u}},Wh=(e,t,r)=>{let n=new Date().toISOString();return{version:ws,agentId:e.trim(),rootPath:t.rootPath,workDirPath:t.workDirPath,status:"ready",storageVersion:ws,snapshotVersion:An,createdAt:r?.createdAt||n,updatedAt:n,lastUsedAt:r?.lastUsedAt,lastSessionId:r?.lastSessionId,lastScannedAt:r?.lastScannedAt}},Ke=(e,t)=>{let r=Hc(e,t);return{paths:r,manifest:qc(r.manifestPath)}},Ps=(e,t,r)=>{let{paths:n,manifest:o}=Ke(e,t),s={...Wh(e,n,o),...r,updatedAt:new Date().toISOString()};return vs(n.manifestPath,s),s},ut=(e,t)=>{let{paths:r}=Ke(e,t);return qc(r.snapshotPath)},Ht=(e,t,r,n,o)=>{let{paths:s}=Ke(e,t),i=o?.files??[];return{agentId:e.trim(),rootPath:s.rootPath,workDirPath:s.workDirPath,systemPath:s.systemPath,status:r,totalFiles:i.filter(a=>a.type==="file").length,totalDirectories:i.filter(a=>a.type==="directory").length,totalSizeBytes:i.filter(a=>a.type==="file").reduce((a,c)=>a+c.sizeBytes,0),lastUsedAt:n?.lastUsedAt,lastSessionId:n?.lastSessionId,lastScannedAt:n?.lastScannedAt??o?.scannedAt,manifestVersion:n?.storageVersion??ws,snapshotVersion:n?.snapshotVersion??An}},Is=(e,t)=>{let{paths:r,manifest:n}=Ke(e,t);if(!Gt(r.workDirPath)||!Gt(r.systemPath))return{paths:r,manifest:n,summary:Ht(e,t,"missing",n,ut(e,t))};try{return Lc(r.workDirPath),Lc(r.systemPath),{paths:r,manifest:n,summary:Ht(e,t,"ready",n,ut(e,t))}}catch{return{paths:r,manifest:n,summary:Ht(e,t,"error",n,ut(e,t))}}},Gc=(e,t="")=>{let r=t?Z.join(e,t):e,n=Fc(r,{withFileTypes:!0}),o=[];for(let s of n){let i=Cs(Z.join(t,s.name)),a=Z.join(r,s.name),c=Ss(a);if(s.isDirectory()){o.push({path:i,type:"directory",sizeBytes:0,modifiedAt:jc(c.mtimeMs)}),o.push(...Gc(e,i));continue}s.isFile()&&o.push({path:i,type:"file",sizeBytes:c.size,modifiedAt:jc(c.mtimeMs),sha256:Bh(a,c.size)})}return o},Mn=(e,t)=>{let r=Hc(e,t);Te(r.rootPath),Te(r.workDirPath),Te(r.systemPath),Te(r.snapshotsDir),Te(Z.join(r.snapshotsDir,"history")),Te(r.sessionsDir),Te(r.runtimeDir),Te(r.runtimeTempDir),Te(Z.join(r.runtimeDir,"locks")),Te(r.logsDir);let n=Ps(e,t);return{summary:Ht(e,t,"ready",n,ut(e,t)),files:ut(e,t)?.files??[]}},zc=(e,t)=>(Mn(e,t),Es(e,t)),Es=(e,t)=>{let{summary:r}=Is(e,t);if(r.status!=="ready")return{summary:r,files:[]};let{paths:n}=Ke(e,t),o=new Date().toISOString(),s=Gc(n.workDirPath).sort((a,c)=>a.path.localeCompare(c.path));vs(n.snapshotPath,{version:An,agentId:e.trim(),scannedAt:o,files:s});let i=Ps(e,t,{lastScannedAt:o,status:"ready"});return{summary:Ht(e,t,"ready",i,{version:An,agentId:e.trim(),scannedAt:o,files:s}),files:s}},Sr=(e,t)=>{let{manifest:r,summary:n}=Is(e,t);return n.status!=="ready"?n:Ht(e,t,"ready",r,ut(e,t))},zt=(e,t=!1,r)=>t?Es(e,r):{summary:Sr(e,r),files:ut(e,r)?.files??[]},Kc=(e,t,r)=>{Mn(e,r);let{paths:n}=Ke(e,r),o=new Date().toISOString();Ps(e,r,{lastUsedAt:o,lastSessionId:t.trim()||void 0}),vs(Z.join(n.sessionsDir,`${t.trim()||"session"}.json`),{sessionId:t.trim()||"session",cwd:n.workDirPath,lastUsedAt:o})},Vc=(e,t)=>{let{paths:r}=Ke(e,t);if(Gt(r.runtimeTempDir))for(let n of Fc(r.runtimeTempDir))Ih(Z.join(r.runtimeTempDir,n),{force:!0,recursive:!0});return Sr(e,t)},On=(e,t,r)=>{let{summary:n}=Is(e,r);if(n.status!=="ready")throw new Error("Agent \u5DE5\u4F5C\u76EE\u5F55\u5C1A\u672A\u521D\u59CB\u5316\u3002");let o=Cs(t);if(!o)throw new Error("\u6587\u4EF6\u8DEF\u5F84\u4E0D\u80FD\u4E3A\u7A7A\u3002");let{paths:s}=Ke(e,r),i=Z.resolve(s.workDirPath,o);if(!Oh(s.workDirPath,i))throw new Error("\u6587\u4EF6\u8DEF\u5F84\u8D8A\u754C\u3002");if(!Gt(i)||!Ss(i).isFile())throw new Error("\u6587\u4EF6\u4E0D\u5B58\u5728\u3002");return{absolutePath:i,relativePath:o}},Jc=(e,t,r)=>{let n=On(e,t,r);return Eh(n.absolutePath),Es(e,r)},Xc=(e,t,r)=>{try{let n=On(e,t,r),o=Ss(n.absolutePath);if(!o.isFile())return{ok:!1,relativePath:n.relativePath,message:"\u5F53\u524D\u8DEF\u5F84\u4E0D\u662F\u6587\u4EF6\u3002"};if(o.size>Ah)return{ok:!1,relativePath:n.relativePath,sizeBytes:o.size,message:"\u6587\u4EF6\u8FC7\u5927\uFF0C\u6682\u4E0D\u652F\u6301\u9884\u89C8\u3002"};let s=xs(n.absolutePath);return s.includes(0)?{ok:!1,relativePath:n.relativePath,sizeBytes:o.size,message:"\u6682\u4E0D\u652F\u6301\u9884\u89C8\u4E8C\u8FDB\u5236\u6587\u4EF6\u3002"}:{ok:!0,relativePath:n.relativePath,content:s.toString("utf8"),sizeBytes:o.size,truncated:!1}}catch(n){return{ok:!1,relativePath:Cs(t),message:n instanceof Error?n.message:"\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25\u3002"}}};import{readFile as Nh}from"node:fs/promises";import Qc from"node:os";import Bn from"node:path";import{simpleGit as Uh}from"simple-git";import{spawnSync as Dh}from"node:child_process";var Cr=(e,t,r)=>{let n=Dh("git",t,{cwd:e,env:r,encoding:"utf8"});if(n.status!==0)throw new Error((n.stderr||n.stdout||"git command failed").trim())},_n=(e,t,r)=>{try{Cr(e,t,r)}catch{return}},$e=e=>{let t=Na({taskId:e.taskId,identity:e.identity,repoUrl:e.repoUrl});return{env:t.env,tempDir:t.tempDir,configureRepo(r){e.identity.name&&e.identity.email&&(Cr(r,["config","--local","user.name",e.identity.name],t.env),Cr(r,["config","--local","user.email",e.identity.email],t.env)),t.env.GIT_SSH_COMMAND&&Cr(r,["config","--local","core.sshCommand",t.env.GIT_SSH_COMMAND],t.env),t.env.GIT_ASKPASS&&Cr(r,["config","--local","core.askPass",t.env.GIT_ASKPASS],t.env)},cleanup(r){r&&(e.identity.name&&e.identity.email&&(_n(r,["config","--local","--unset-all","user.name"],t.env),_n(r,["config","--local","--unset-all","user.email"],t.env)),_n(r,["config","--local","--unset-all","core.askPass"],t.env),_n(r,["config","--local","--unset-all","core.sshCommand"],t.env)),t.cleanup()}}},Yc=e=>{let t=$e({taskId:e.taskId,identity:e.identity,repoUrl:e.repoUrl});return t.configureRepo(e.worktreePath),{tempDir:t.tempDir,env:t.env,cleanup(){t.cleanup(e.worktreePath)}}};var vr="main",$h=e=>{let t=e.trim();return t?t==="~"?Qc.homedir():t.startsWith("~/")?Bn.join(Qc.homedir(),t.slice(2)):t:""},bs=e=>Bn.resolve($h(e)),Lh=(e,t)=>{let r={..._t(t),...e?{baseDir:e}:{}};return Uh(r).env(t??{})},ke=e=>{let t=e.trim();if(!t||t==="HEAD"||t.endsWith("/HEAD"))return"";let r=t.startsWith("refs/heads/")?t.slice(11):t,n=r.startsWith("remotes/")?r.slice(8):r;return n.startsWith("origin/")?n.slice(7):n},jh=e=>e.split("\0").map(t=>t.trim()).filter(Boolean),Fh=e=>e.split(Bn.sep).join("/"),Ts=(e,t)=>{let r=new Map;for(let n of t.split(`
60
+ `).map(o=>o.trim()).filter(Boolean)){let o=n.split(" "),s=o[0]||"M",i=o.length>2?`${o[1]} \u2192 ${o[2]}`:o[1]||"";i&&r.set(i,s)}return e.split(`
61
+ `).map(n=>n.trim()).filter(Boolean).map(n=>n.split(" ")).map(n=>{if(n.length<3)return null;let o=n[0]==="-"?0:Number(n[0]),s=n[1]==="-"?0:Number(n[1]),i=n.length>3?`${n[2]} \u2192 ${n[3]}`:n[2];return{path:i,status:r.get(i)||"M",additions:Number.isFinite(o)?o:0,deletions:Number.isFinite(s)?s:0}}).filter(n=>!!n)},qh=e=>{if(e.length===0||e.includes(0))return 0;let t=e.toString("utf8").replace(/\r\n/g,`
62
62
  `);if(!t)return 0;let r=t.split(`
63
63
  `).length;return t.endsWith(`
64
- `)?Math.max(0,r-1):r},dh=(e,t)=>{let r=ch(e),n=[`diff --git a/${r} b/${r}`,"new file mode 100644","--- /dev/null",`+++ b/${r}`];if(t.length===0)return`${n.join(`
64
+ `)?Math.max(0,r-1):r},Hh=(e,t)=>{let r=Fh(e),n=[`diff --git a/${r} b/${r}`,"new file mode 100644","--- /dev/null",`+++ b/${r}`];if(t.length===0)return`${n.join(`
65
65
  `)}
66
66
  `;if(t.includes(0))return`${n.join(`
67
67
  `)}
68
68
  Binary files /dev/null and b/${r} differ
69
69
  `;let o=t.toString("utf8").replace(/\r\n/g,`
70
- `),i=o.endsWith(`
70
+ `),s=o.endsWith(`
71
71
  `)?o.slice(0,-1).split(`
72
72
  `):o.split(`
73
- `),s=[`@@ -0,0 +1,${i.length} @@`,...i.map(a=>`+${a}`)];return o.endsWith(`
74
- `)||s.push("\"),`${n.join(`
73
+ `),i=[`@@ -0,0 +1,${s.length} @@`,...s.map(a=>`+${a}`)];return o.endsWith(`
74
+ `)||i.push("\"),`${n.join(`
75
75
  `)}
76
- ${s.join(`
76
+ ${i.join(`
77
77
  `)}
78
- `},Tc=async(e,t)=>Promise.all(ah(t).map(async r=>{let n=Cn.join(e,r),o=await nh(n).catch(()=>Buffer.alloc(0));return{file:{path:r,status:"??",additions:lh(o),deletions:0},patch:dh(r,o)}}));var Ac=e=>{let t=e.map(r=>r.trimEnd()).filter(Boolean);return t.length>0?`${t.join(`
78
+ `},el=async(e,t)=>Promise.all(jh(t).map(async r=>{let n=Bn.join(e,r),o=await Nh(n).catch(()=>Buffer.alloc(0));return{file:{path:r,status:"??",additions:qh(o),deletions:0},patch:Hh(r,o)}}));var tl=e=>{let t=e.map(r=>r.trimEnd()).filter(Boolean);return t.length>0?`${t.join(`
79
79
  `)}
80
- `:""},Rc=async(e,t)=>{let r=[`refs/remotes/origin/${t}`,`origin/${t}`,`refs/heads/${t}`,t];for(let n of r)try{return await e.raw(["rev-parse","--verify",n]),{baseBranch:t,baseRef:n}}catch{}return null},Mc=async(e,t,r)=>{let n=ye(t)||mr;if(r?.forceFetchFirst)try{await e.fetch(["origin",`${n}:refs/remotes/origin/${n}`])}catch{}let o=await Rc(e,n);if(o)return o;if(!r?.forceFetchFirst){try{await e.fetch(["origin",`${n}:refs/remotes/origin/${n}`])}catch{}let i=await Rc(e,n);if(i)return i}throw new Error(`\u627E\u4E0D\u5230\u57FA\u7EBF\u5206\u652F ${n}\u3002`)},Je=async e=>{let t=await e.branchLocal();return ye(t.current)||"HEAD"},uh=async(e,t)=>{try{let r=await e.raw(["rev-list","--count",`${t}..HEAD`]),n=Number(r.trim());return Number.isFinite(n)?n:0}catch{return 0}},ph=async e=>{try{return await e.raw(["rev-parse","--verify","HEAD"]),!0}catch{return!1}},mh=async(e,t)=>{try{return(await e.raw(["rev-list","--parents","-n","1",t])).trim().split(/\s+/).filter(Boolean)[1]}catch{return}},gh=async e=>{try{return(await e.raw(["diff","--name-only","--diff-filter=U"])).split(`
81
- `).map(r=>r.trim()).filter(Boolean)}catch{return[]}},fh=e=>{let t=e.trim();return!t.startsWith("(")||!t.endsWith(")")?[]:t.slice(1,-1).split(",").map(r=>r.trim()).filter(Boolean)},hh=e=>{let t=e.trim();if(!t)return null;let r=[/^https?:\/\/github\.com\/([^/]+)\/([^/.]+?)(?:\.git)?$/i,/^git@github\.com:([^/]+)\/([^/.]+?)(?:\.git)?$/i,/^ssh:\/\/git@github\.com\/([^/]+)\/([^/.]+?)(?:\.git)?$/i];for(let n of r){let o=t.match(n);if(o)return{owner:o[1],repo:o[2]}}return null},yh=e=>e.split("").map(t=>t.trim()).filter(Boolean).map(t=>{let[r="",n="",o="",i="",s="",a=""]=t.split(""),c=fh(o);return{sha:r,shortSha:r.slice(0,7),parents:n.split(" ").map(l=>l.trim()).filter(Boolean),subject:i.trim(),authorDate:s.trim(),authorName:a.trim(),refs:c,isHead:c.some(l=>l.startsWith("HEAD"))}}),Ve=async e=>{let t=si(e.worktreePath),r=Le({taskId:`${e.taskKey}-${Buffer.from(t).toString("base64url").slice(0,24)}`,identity:e.gitIdentity??{mode:"personal"},repoUrl:e.repoUrl});try{r.configureRepo(t);let n=sh(t,r.env);return await e.run(n)}finally{r.cleanup(t)}},Oc=async e=>{try{return await Ve({...e,taskKey:"git-diff",run:async t=>{let{baseBranch:r,baseRef:n}=await Mc(t,e.baseBranch),o=await Je(t),i=si(e.worktreePath),[s,a,c,l,d]=await Promise.all([t.raw(["diff","--numstat","--find-renames","--merge-base",n]),t.raw(["diff","--name-status","--find-renames","--merge-base",n]),t.raw(["diff","--find-renames","--merge-base",n]),uh(t,n),t.raw(["ls-files","--others","--exclude-standard","-z"])]),m=ai(s,a),u=new Set(m.map(g=>g.path)),p=await Tc(i,d),f=p.map(g=>g.file).filter(g=>!u.has(g.path)),x=m.concat(f),k=Ac([c,...p.map(g=>g.patch)]);return{ok:!0,message:x.length>0?`\u5DF2\u751F\u6210\u5F53\u524D\u5DE5\u4F5C\u533A\u76F8\u5BF9 ${r} \u7684\u5DEE\u5F02\u3002`:`\u5F53\u524D\u5DE5\u4F5C\u533A\u76F8\u5BF9 ${r} \u6CA1\u6709\u5DEE\u5F02\u3002`,baseBranch:r,currentBranch:o,aheadCommits:l,files:x,patch:k}}})}catch(t){let r=Z(t,e.repoUrl);return{ok:!1,message:r instanceof Error?r.message:"\u8BFB\u53D6 Git diff \u5931\u8D25\u3002",baseBranch:ye(e.baseBranch)||mr,currentBranch:"HEAD",aheadCommits:0,files:[],patch:""}}},_c=async e=>{try{return await Ve({...e,taskKey:"git-working-tree-diff",run:async t=>{let r=await Je(t),n=await ph(t),o=si(e.worktreePath),[i,s,a,c]=await Promise.all([n?t.raw(["diff","--numstat","--find-renames","HEAD"]):Promise.resolve(""),n?t.raw(["diff","--name-status","--find-renames","HEAD"]):Promise.resolve(""),n?t.raw(["diff","--find-renames","HEAD"]):Promise.resolve(""),t.raw(["ls-files","--others","--exclude-standard","-z"])]),l=n?ai(i,s):[],d=await Tc(o,c),m=d.map(x=>x.file),u=new Set(l.map(x=>x.path)),p=l.concat(m.filter(x=>!u.has(x.path))),f=Ac([a,...d.map(x=>x.patch)]);return{ok:!0,message:p.length>0?"\u5DF2\u751F\u6210\u5F53\u524D\u5DE5\u4F5C\u533A\u672A\u63D0\u4EA4\u6539\u52A8\u3002":"\u5F53\u524D\u5DE5\u4F5C\u533A\u6CA1\u6709\u672A\u63D0\u4EA4\u6539\u52A8\u3002",currentBranch:r,files:p,patch:f}}})}catch(t){let r=Z(t,e.repoUrl);return{ok:!1,message:r instanceof Error?r.message:"\u8BFB\u53D6\u5F53\u524D\u5DE5\u4F5C\u533A Git \u6539\u52A8\u5931\u8D25\u3002",currentBranch:"HEAD",files:[],patch:""}}},Bc=async e=>{try{return await Ve({worktreePath:e.worktreePath,repoUrl:e.repoUrl,gitIdentity:e.gitIdentity,taskKey:"git-commit-diff",run:async t=>{let r=e.commitSha.trim();if(!r)return{ok:!1,message:"\u7F3A\u5C11 commit SHA\u3002",commitSha:"",files:[],patch:""};await t.raw(["rev-parse","--verify",r]);let n=await mh(t,r),[o,i,s]=await Promise.all([t.raw(["show","--format=","--find-renames",r]),t.raw(["show","--format=","--numstat","--find-renames",r]),t.raw(["show","--format=","--name-status","--find-renames",r])]),a=ai(i,s);return{ok:!0,message:a.length>0?`\u5DF2\u52A0\u8F7D\u63D0\u4EA4 ${r.slice(0,7)} \u7684 diff\u3002`:`\u63D0\u4EA4 ${r.slice(0,7)} \u6CA1\u6709\u6587\u4EF6\u5DEE\u5F02\u3002`,commitSha:r,parentSha:n,files:a,patch:o}}})}catch(t){let r=Z(t,e.repoUrl);return{ok:!1,message:r instanceof Error?r.message:"\u8BFB\u53D6 commit diff \u5931\u8D25\u3002",commitSha:e.commitSha.trim(),files:[],patch:""}}},Wc=async e=>{try{return await Ve({...e,taskKey:"git-rebase",run:async t=>{let{baseBranch:r,baseRef:n}=await Mc(t,e.baseBranch,{forceFetchFirst:!0}),o=await Je(t);try{return await t.raw(["rebase",n]),{ok:!0,message:`\u5DF2\u5C06 ${o} rebase \u5230 ${r}\u3002`,baseBranch:r,currentBranch:o,conflicts:!1,conflictedFiles:[]}}catch(i){let s=await gh(t),a=Z(i,e.repoUrl);return{ok:!1,message:s.length>0?`rebase \u53D1\u751F\u51B2\u7A81\uFF0C\u8BF7\u5148\u89E3\u51B3\u51B2\u7A81\u540E\u518D\u7EE7\u7EED\u3002${a instanceof Error?` ${a.message}`:""}`.trim():a instanceof Error?a.message:"\u6267\u884C rebase \u5931\u8D25\u3002",baseBranch:r,currentBranch:o,conflicts:s.length>0,conflictedFiles:s}}}})}catch(t){let r=Z(t,e.repoUrl);return{ok:!1,message:r instanceof Error?r.message:"\u6267\u884C rebase \u5931\u8D25\u3002",baseBranch:ye(e.baseBranch)||mr,currentBranch:"HEAD",conflicts:!1,conflictedFiles:[]}}},Dc=async e=>{let t=Math.min(120,Math.max(10,e.limit??40));try{return await Ve({...e,taskKey:"git-graph",run:async r=>{let n=await Je(r),o=ye(e.baseBranch)||mr,i=await r.raw(["log","--decorate=short","--date=iso-local","--topo-order",`--max-count=${t}`,"--all","--format=%H%x1f%P%x1f%d%x1f%s%x1f%cd%x1f%an%x1e"]),s=await r.raw(["log","--graph","--decorate","--date=short",`--max-count=${t}`,"--all","--no-color","--pretty=format:%h %d %s (%cd)"]),a=yh(i);return{ok:!0,message:"\u5DF2\u52A0\u8F7D Git graph\u3002",baseBranch:o,currentBranch:n,limit:t,commitCount:a.length,graph:s,commits:a}}})}catch(r){let n=Z(r,e.repoUrl);return{ok:!1,message:n instanceof Error?n.message:"\u8BFB\u53D6 Git graph \u5931\u8D25\u3002",baseBranch:ye(e.baseBranch)||mr,currentBranch:"HEAD",limit:t,commitCount:0,graph:"",commits:[]}}},Nc=async e=>{try{return await Ve({...e,taskKey:"git-push",run:async t=>{let r=e.branchName?.trim()||await Je(t),n=ye(r);return n?(await t.push(["-u","origin",n]),{ok:!0,message:`\u5DF2\u63A8\u9001\u5206\u652F ${n} \u5230 origin\u3002`,branchName:n,remoteBranch:`origin/${n}`}):{ok:!1,message:"\u5F53\u524D worktree \u4E0D\u5728\u6709\u6548\u5206\u652F\u4E0A\uFF0C\u65E0\u6CD5\u63A8\u9001\u3002",branchName:r,remoteBranch:""}}})}catch(t){let r=Z(t,e.repoUrl);return{ok:!1,message:r instanceof Error?r.message:"\u63A8\u9001\u5206\u652F\u5931\u8D25\u3002",branchName:e.branchName?.trim()||"",remoteBranch:""}}},$c=async e=>{let t=ye(e.branchName);if(!t)return{ok:!1,message:"\u76EE\u6807\u5206\u652F\u4E0D\u80FD\u4E3A\u7A7A\u3002",currentBranch:""};try{return await Ve({...e,taskKey:"git-checkout",run:async r=>{let n=await Je(r);if(n===t)return{ok:!0,message:`\u5F53\u524D\u5DF2\u7ECF\u5728\u5206\u652F ${t}\u3002`,currentBranch:n};let o=await r.status();if(!o.isClean()){let u=o.files.map(p=>p.path).filter(Boolean);return{ok:!1,message:u.length>0?`\u5F53\u524D\u5DE5\u4F5C\u533A\u6709\u672A\u63D0\u4EA4\u6539\u52A8\uFF0C\u8BF7\u5148\u5904\u7406\u540E\u518D\u5207\u6362\u5206\u652F\uFF1A${u.slice(0,6).join(", ")}${u.length>6?"\u2026":""}`:"\u5F53\u524D\u5DE5\u4F5C\u533A\u6709\u672A\u63D0\u4EA4\u6539\u52A8\uFF0C\u8BF7\u5148\u5904\u7406\u540E\u518D\u5207\u6362\u5206\u652F\u3002",currentBranch:n}}let i=await r.branch(["-a"]);if(!new Set(i.all.map(ye).filter(Boolean)).has(t))try{await r.fetch(["origin",`${t}:refs/remotes/origin/${t}`])}catch{}let a=await r.branch(["-a"]),c=await r.branchLocal(),l=new Set(c.all.map(ye).filter(Boolean));if(!a.all.map(ye).filter(Boolean).includes(t)&&!l.has(t))return{ok:!1,message:`\u627E\u4E0D\u5230\u5206\u652F ${t}\u3002`,currentBranch:n};l.has(t)?await r.checkout(t):await r.checkout(["-B",t,`origin/${t}`]);let m=await Je(r);return{ok:!0,message:`\u5DF2\u5207\u6362\u5230\u5206\u652F ${m}\u3002`,currentBranch:m}}})}catch(r){let n=Z(r,e.repoUrl);return{ok:!1,message:n instanceof Error?n.message:"\u5207\u6362\u5206\u652F\u5931\u8D25\u3002",currentBranch:""}}},Uc=async e=>{try{return await Ve({worktreePath:e.worktreePath,repoUrl:e.repoUrl,gitIdentity:e.gitIdentity,taskKey:"git-pull-request",run:async t=>{let r=hh(e.repoUrl);if(!r)return{ok:!1,message:"\u5F53\u524D\u4EC5\u652F\u6301\u4E3A GitHub \u4ED3\u5E93\u521B\u5EFA PR\u3002",provider:null,title:e.title,body:e.body,baseBranch:e.baseBranch,compareBranch:e.compareBranch?.trim()||""};let n=e.compareBranch?.trim()||await Je(t),o=ye(n);if(!o)return{ok:!1,message:"\u5F53\u524D worktree \u4E0D\u5728\u6709\u6548\u5206\u652F\u4E0A\uFF0C\u65E0\u6CD5\u521B\u5EFA PR\u3002",provider:"github",title:e.title,body:e.body,baseBranch:e.baseBranch,compareBranch:n};await t.push(["-u","origin",o]);let i=e.gitIdentity?.credentialToken?.trim()||"";if(!i||e.gitIdentity?.authMode!=="pat")return{ok:!1,message:"\u521B\u5EFA PR \u76EE\u524D\u9700\u8981\u5DF2\u914D\u7F6E\u5E76\u6FC0\u6D3B GitHub PAT\u3002",provider:"github",title:e.title,body:e.body,baseBranch:e.baseBranch,compareBranch:o};let s=await fetch(`https://api.github.com/repos/${r.owner}/${r.repo}/pulls`,{method:"POST",headers:{Accept:"application/vnd.github+json",Authorization:`Bearer ${i}`,"Content-Type":"application/json","User-Agent":"Vibemux-Worker","X-GitHub-Api-Version":"2022-11-28"},body:JSON.stringify({title:e.title,body:e.body,base:e.baseBranch,head:o})}),a=await s.json().catch(()=>({}));if(!s.ok){let c=Array.isArray(a.errors)?a.errors.map(l=>l.message).filter(Boolean).join("\uFF1B"):"";return{ok:!1,message:[a.message,c].filter(Boolean).join("\uFF1B")||"\u521B\u5EFA GitHub PR \u5931\u8D25\u3002",provider:"github",title:e.title,body:e.body,baseBranch:e.baseBranch,compareBranch:o}}return{ok:!0,message:"PR \u5DF2\u521B\u5EFA\u3002",provider:"github",title:e.title,body:e.body,baseBranch:e.baseBranch,compareBranch:o,number:a.number,url:a.html_url,state:a.state}}})}catch(t){let r=Z(t,e.repoUrl);return{ok:!1,message:r instanceof Error?r.message:"\u521B\u5EFA PR \u5931\u8D25\u3002",provider:"github",title:e.title,body:e.body,baseBranch:e.baseBranch,compareBranch:e.compareBranch?.trim()||""}}};import{readFile as Eh,readdir as Ih,stat as Pn}from"node:fs/promises";import bh from"node:os";import jt from"node:path";import{mkdirSync as kh}from"node:fs";import{readdir as wh,stat as jc}from"node:fs/promises";import Lc from"node:os";import ci from"node:path";import{simpleGit as xh}from"simple-git";var Re="main",Sh=e=>{let t=e.trim();return t?t==="~"?Lc.homedir():t.startsWith("~/")?ci.join(Lc.homedir(),t.slice(2)):t:""},oe=e=>ci.resolve(Sh(e)),re=e=>{let t=e.trim();if(!t||t==="HEAD"||t.endsWith("/HEAD"))return"";let r=t.startsWith("refs/heads/")?t.slice(11):t,n=r.startsWith("remotes/")?r.slice(8):r;return n.startsWith("origin/")?n.slice(7):n},ie=(e,t)=>{let r={...Rt(t),...e?{baseDir:e}:{}};return xh(r).env(t??{})},dt=async(e,t,r)=>{let n=ie(e,r),[o,i]=await Promise.all([n.branch(["-a"]),n.branchLocal()]),s="";try{s=re(await n.raw(["symbolic-ref","--quiet","--short","refs/remotes/origin/HEAD"]))}catch{s=""}let a=Array.from(new Set(o.all.map(re).filter(Boolean))).sort((m,u)=>m.localeCompare(u)),c=re(t??""),l=re(i.current),d=[s,c,l,a[0],Re].find(m=>m&&(m===Re||a.includes(m)))??Re;return{branches:a,defaultBranch:d,currentBranch:l||void 0}},vh=e=>{for(let t of e.split(`
82
- `)){let r=t.trim();if(!r.startsWith("ref: "))continue;let[n]=r.split(" ");return re(n.slice(5))}return""},Ch=e=>Array.from(new Set(e.split(`
83
- `).map(t=>t.trim()).filter(Boolean).map(t=>t.split(" ")[1]||"").map(re).filter(Boolean))).sort((t,r)=>t.localeCompare(r)),Ph=async(e,t,r)=>{if(t?.trim())return t.trim();let n=ie(e,r);return await n.checkIsRepo()&&(await n.getRemotes(!0)).find(i=>i.name==="origin")?.refs.fetch?.trim()||""},Fc=async(e,t,r)=>{if(t?.trim())return!1;let n=ie(e,r);return await n.checkIsRepo().catch(()=>!1)?!(await n.getRemotes(!0).catch(()=>[])).some(i=>i.name==="origin"&&i.refs.fetch?.trim()):!1},gr=async(e,t,r,n)=>{let o=await Ph(e,t,n);if(!o)throw new Error("\u4ED3\u5E93\u672A\u914D\u7F6E origin\uFF0C\u4E14\u6CA1\u6709\u53EF\u7528\u7684\u8FDC\u7AEF\u4ED3\u5E93\u5730\u5740\u3002");let i=await jc(e).then(async p=>{if(!p.isDirectory())return;let f=ie(e,n);if(await f.checkIsRepo().catch(()=>!1))return f.branchLocal().then(x=>re(x.current)||void 0).catch(()=>{})}).catch(()=>{}),s=ie(void 0,n),[a,c]=await Promise.all([s.raw(["ls-remote","--heads",o]),s.raw(["ls-remote","--symref",o,"HEAD"])]),l=Ch(a),d=vh(c),m=re(r??""),u=[d,m,l[0],Re].find(p=>p&&(p===Re||l.includes(p)))??Re;return{branches:l,defaultBranch:u,currentBranch:i,remoteTarget:o}},fr=e=>{let t=re(e.preferredBranch??"")||e.defaultBranch;return e.branches.includes(t)?t:e.defaultBranch},hr=async e=>{let t=await jc(e.repoPath).catch(()=>null);if(t&&!t.isDirectory())throw new Error(`\u76EE\u6807\u8DEF\u5F84\u4E0D\u662F\u76EE\u5F55\uFF1A${e.repoPath}`);if(t){let r=ie(e.repoPath,e.env);if(await r.checkIsRepo().catch(()=>!1)){await r.fetch(["origin",`${e.startPoint}:refs/remotes/origin/${e.startPoint}`]);return}if((await wh(e.repoPath)).length>0)throw new Error(`\u76EE\u6807\u76EE\u5F55\u4E0D\u662F\u6709\u6548 Git \u4ED3\u5E93\uFF1A${e.repoPath}`)}else kh(ci.dirname(e.repoPath),{recursive:!0});await ie(void 0,e.env).clone(e.remoteTarget,e.repoPath,["--single-branch","--branch",e.startPoint])};var li=(e,t)=>{let r=jt.relative(e,t);return r===""||!r.startsWith("..")&&!jt.isAbsolute(r)},Gc=e=>{let t=oe(e),r=oe(bh.homedir());return li(r,t)?r:t};var Hc=async e=>{let t=oe(e);try{if(!(await Pn(t)).isDirectory())return{ok:!1,path:t,message:"\u8BF7\u9009\u62E9\u76EE\u5F55\u800C\u975E\u6587\u4EF6"}}catch{return{ok:!1,path:t,message:"\u76EE\u5F55\u4E0D\u5B58\u5728"}}let r=jt.basename(t);try{let n=ie(t);if(!await n.checkIsRepo())return{ok:!0,path:t,name:r,versionControl:"none",message:"\u76EE\u5F55\u65E0 Git \u4ED3\u5E93"};let s=(await n.getRemotes(!0)).find(m=>m.name==="origin"),a=await dt(t),c=a.branches.length,l=s?.refs.fetch?.trim()||"",d=l?"git-remote":"git-local";return{ok:!0,path:t,name:r,versionControl:d,gitUrl:l,defaultBranch:a.defaultBranch,message:c>0?d==="git-remote"?`\u5DF2\u68C0\u6D4B\u5230 Git \u4ED3\u5E93\uFF0C\u5171 ${c} \u4E2A\u5206\u652F`:`\u5DF2\u68C0\u6D4B\u5230\u672C\u5730 Git \u4ED3\u5E93\uFF08\u672A\u7ED1\u5B9A\u8FDC\u7AEF\uFF09\uFF0C\u5171 ${c} \u4E2A\u5206\u652F`:d==="git-remote"?"\u5DF2\u68C0\u6D4B\u5230 Git \u4ED3\u5E93":"\u5DF2\u68C0\u6D4B\u5230\u672C\u5730 Git \u4ED3\u5E93\uFF08\u672A\u7ED1\u5B9A\u8FDC\u7AEF\uFF09"}}catch{return{ok:!0,path:t,name:r,message:"\u65E0\u6CD5\u8BFB\u53D6 Git \u4FE1\u606F"}}},zc=async(e,t)=>{let r=Gc(e),n=oe(e),o=t?.trim()?oe(t):n;if(!li(r,o))return{ok:!1,path:o,rootPath:r,entries:[],message:"\u5F53\u524D\u8DEF\u5F84\u8D85\u51FA\u53EF\u6D4F\u89C8\u8303\u56F4\u3002"};try{if(!(await Pn(o)).isDirectory())return{ok:!1,path:o,rootPath:r,entries:[],message:"\u5F53\u524D\u8DEF\u5F84\u4E0D\u662F\u76EE\u5F55\u3002"}}catch{return{ok:!1,path:o,rootPath:r,entries:[],message:"\u76EE\u5F55\u4E0D\u5B58\u5728\u3002"}}try{let s=(await Ih(o,{withFileTypes:!0})).filter(a=>a.isDirectory()||a.isFile()).map(a=>({name:a.name,path:jt.join(o,a.name),kind:a.isDirectory()?"directory":"file"})).sort((a,c)=>a.kind!==c.kind?a.kind==="directory"?-1:1:a.name.localeCompare(c.name,"zh-Hans-CN"));return{ok:!0,path:o,rootPath:r,parentPath:o===r?void 0:jt.dirname(o),entries:s,message:s.length>0?`\u5171\u627E\u5230 ${s.length} \u4E2A\u6761\u76EE\u3002`:"\u5F53\u524D\u76EE\u5F55\u4E0B\u6CA1\u6709\u6587\u4EF6\u6216\u6587\u4EF6\u5939\u3002"}}catch(i){return{ok:!1,path:o,rootPath:r,entries:[],message:i instanceof Error?i.message:"\u8BFB\u53D6\u76EE\u5F55\u5931\u8D25\u3002"}}},Rh=200*1024,qc={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".svg":"image/svg+xml",".bmp":"image/bmp",".ico":"image/x-icon"},Th=new Set([".md",".markdown",".mdx"]),Ah=new Set([".json",".jsonc"]),Mh=e=>{let t=jt.extname(e).toLowerCase();return qc[t]?qc[t]:Th.has(t)?"text/markdown":Ah.has(t)?"application/json":"text/plain"},Kc=async(e,t)=>{let r=Gc(e),n=t?.trim()?oe(t):r;if(!li(r,n))return{ok:!1,path:n,rootPath:r,message:"\u53EA\u80FD\u8BFB\u53D6\u8BE5\u5DE5\u4F5C\u7AD9 workspace \u5185\u7684\u6587\u4EF6\u3002"};try{let o=await Pn(n);if(!o.isFile())return{ok:!1,path:n,rootPath:r,message:"\u5F53\u524D\u8DEF\u5F84\u4E0D\u662F\u6587\u4EF6\u3002"};if(o.size>Rh)return{ok:!1,path:n,rootPath:r,sizeBytes:o.size,message:"\u6587\u4EF6\u8FC7\u5927\uFF0C\u6682\u4E0D\u652F\u6301\u9884\u89C8\u3002"};let i=await Eh(n),s=Mh(n),a=s.startsWith("image/");return!a&&i.includes(0)?{ok:!1,path:n,rootPath:r,contentType:s,sizeBytes:o.size,message:"\u6682\u4E0D\u652F\u6301\u9884\u89C8\u4E8C\u8FDB\u5236\u6587\u4EF6\u3002"}:{ok:!0,path:n,rootPath:r,content:a?i.toString("base64"):i.toString("utf8"),contentType:s,encoding:a?"base64":"utf8",sizeBytes:o.size,truncated:!1}}catch(o){return{ok:!1,path:n,rootPath:r,message:o instanceof Error?o.message:"\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25\u3002"}}},Jc=async(e,t,r,n)=>{let o=oe(e),i=Le({taskId:`repo-branches-${Buffer.from(o).toString("base64url").slice(0,24)}`,identity:n??{mode:"personal"},repoUrl:t});console.log("[worker] [repo-branches] snapshot starting",JSON.stringify({localPath:o,repoUrl:t,preferredBranch:r}));try{if(await Fc(o,t,i.env)){let l=await dt(o,r,i.env);return console.log("[worker] [repo-branches] local-only snapshot resolved",JSON.stringify({localPath:o,branchCount:l.branches.length,defaultBranch:l.defaultBranch})),{ok:!0,branches:l.branches,defaultBranch:l.defaultBranch,currentBranch:l.currentBranch}}let s=await gr(o,t,r,i.env),a=fr({branches:s.branches,defaultBranch:s.defaultBranch,preferredBranch:r});if(!s.branches.includes(a))return{ok:!1,branches:[],defaultBranch:s.defaultBranch,message:s.branches.length>0?`\u8D77\u59CB\u5206\u652F ${a} \u4E0D\u5B58\u5728\u3002\u5F53\u524D\u4ED3\u5E93\u5206\u652F\uFF1A${s.branches.join(", ")}`:`\u8D77\u59CB\u5206\u652F ${a} \u4E0D\u5B58\u5728\u3002`};await hr({repoPath:o,remoteTarget:s.remoteTarget,startPoint:a,env:i.env}),console.log("[worker] [repo-branches] remote snapshot resolved",JSON.stringify({localPath:o,remoteTarget:s.remoteTarget,branchCount:s.branches.length,defaultBranch:s.defaultBranch}));let c=await dt(o,r,i.env).then(l=>l.currentBranch).catch(()=>s.currentBranch);return{ok:!0,branches:s.branches,defaultBranch:s.defaultBranch,currentBranch:c}}catch(s){let a=Z(s,t);console.log("[worker] [repo-branches] remote snapshot failed",JSON.stringify({localPath:o,error:a instanceof Error?a.message:"unknown"}));try{if(!(await Pn(o)).isDirectory())return{ok:!1,branches:[],defaultBranch:re(r??"")||Re,message:a instanceof Error?a.message:"\u8BFB\u53D6\u5206\u652F\u5217\u8868\u5931\u8D25\u3002"};if(!await ie(o,i.env).checkIsRepo())return console.log("[worker] [repo-branches] fallback skipped: path is not repo",JSON.stringify({localPath:o})),{ok:!1,branches:[],defaultBranch:re(r??"")||Re,message:a instanceof Error?a.message:"\u8BFB\u53D6\u5206\u652F\u5217\u8868\u5931\u8D25\u3002"};let d=await dt(o,r,i.env);return console.log("[worker] [repo-branches] local fallback resolved",JSON.stringify({localPath:o,branchCount:d.branches.length,defaultBranch:d.defaultBranch})),{ok:!0,branches:d.branches,defaultBranch:d.defaultBranch,currentBranch:d.currentBranch}}catch(c){let l=Z(c,t);console.log("[worker] [repo-branches] local fallback failed",JSON.stringify({localPath:o,error:l instanceof Error?l.message:"unknown"}))}return{ok:!1,branches:[],defaultBranch:re(r??"")||Re,message:a instanceof Error?a.message:"\u8BFB\u53D6\u5206\u652F\u5217\u8868\u5931\u8D25\u3002"}}finally{i.cleanup()}};import{readdir as Xc,readFile as di,stat as Yc}from"node:fs/promises";import ui from"node:os";import Te from"node:path";var Vc=e=>(e??"").trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||null;var Oh=["skills",".agents/skills",".codex/skills",".claude/skills",".cursor/skills",".opencode/skills",".pi/skills"],_h=["~/.claude/skills","~/.agents/skills","~/.codex/skills","~/.config/opencode/skills","~/.pi/skills"],Bh=new Set([".md",".txt",".json",".yml",".yaml",".ts",".tsx",".js",".jsx",".mjs",".cjs",".sh",".py",".rb"]),Wh=e=>{let t=e.trim();return t?t==="~"?ui.homedir():t.startsWith("~/")?Te.join(ui.homedir(),t.slice(2)):t:""},pi=e=>Te.resolve(Wh(e)),Dh=e=>{let t=e.match(/^---\n([\s\S]*?)\n---/);if(!t)return{};let r={};for(let n of t[1].split(`
84
- `)){let[o,...i]=n.split(":"),s=o.trim().toLowerCase(),a=i.join(":").trim().replace(/^"|"$/g,"");a&&(s==="name"&&(r.name=a),s==="description"&&(r.description=a))}return r},Nh=(e,t)=>{let r=Dh(e);if(r.name?.trim())return{name:r.name.trim(),description:r.description?.trim()||null};let n=e.match(/^#\s+(.+)$/m)?.[1]?.trim();return n?{name:n,description:r.description?.trim()||null}:{name:Te.basename(t),description:r.description?.trim()||null}},Qc=e=>{let t=e.replace(/\\/g,"/");return t==="SKILL.md"?"skill":t.startsWith("references/")?"reference":t.startsWith("scripts/")?"script":t.startsWith("assets/")?"asset":"other"},$h=e=>e==="SKILL.md"?!0:Bh.has(Te.extname(e).toLowerCase()),Uh=e=>Qc(e)==="asset",Lh=e=>e.some(t=>t.kind==="script")?"scripts_executables":e.some(t=>t.kind==="asset")?"assets":"markdown_only",Zc=async e=>{let t=await Xc(e,{withFileTypes:!0}).catch(()=>[]);if(t.some(n=>n.isFile()&&n.name==="SKILL.md"))return[e];let r=[];for(let n of t)!n.isDirectory()||n.name===".git"||n.name==="node_modules"||r.push(...await Zc(Te.join(e,n.name)));return r},jh=async e=>{let t={},r=[],n=async o=>{let i=await Xc(o,{withFileTypes:!0}).catch(()=>[]);for(let s of i){let a=Te.join(o,s.name),c=Te.relative(e,a).replace(/\\/g,"/");if(s.isDirectory()){if(s.name===".git"||s.name==="node_modules")continue;await n(a);continue}if(r.push({path:c,kind:Qc(c)}),$h(s.name)){let d=await di(a,"utf8").catch(()=>null);typeof d=="string"&&(t[c]={encoding:"utf8",content:d});continue}if(!Uh(c))continue;let l=await di(a).catch(()=>null);l&&(t[c]={encoding:"base64",content:l.toString("base64")})}};return await n(e),{files:t,inventory:r.sort((o,i)=>o.path.localeCompare(i.path))}},Fh=async e=>{let t=await di(Te.join(e,"SKILL.md"),"utf8").catch(()=>null);if(!t?.trim())return{warning:`\u8DF3\u8FC7 ${e}\uFF1ASKILL.md \u4E3A\u7A7A\u6216\u65E0\u6CD5\u8BFB\u53D6\u3002`};let r=Nh(t,e),{files:n,inventory:o}=await jh(e);return{skill:{name:r.name,slug:Vc(r.name)??Te.basename(e),description:r.description,markdown:t,sourceLocator:e,trustLevel:Lh(o),fileInventory:o,files:n}}},el=async e=>{let t=[],r=[],n=[];for(let o of e){let i=pi(o);if(!(t.includes(i)||(t.push(i),!await Yc(i).then(a=>a.isDirectory()).catch(()=>!1))))for(let a of await Zc(i)){let{skill:c,warning:l}=await Fh(a);if(l){n.push(l);continue}c&&r.push(c)}}return r.sort((o,i)=>o.slug.localeCompare(i.slug)||o.sourceLocator.localeCompare(i.sourceLocator)),{scannedRoots:t,packages:r,warnings:n}},qh=async(e,t)=>{let r=pi(t);try{if(!(await Yc(r)).isDirectory())return{ok:!1,scanMode:"project",rootPath:r,scannedRoots:[r],packages:[],warnings:[],message:"\u5F53\u524D\u8DEF\u5F84\u4E0D\u662F\u76EE\u5F55\u3002"}}catch{return{ok:!1,scanMode:"project",rootPath:r,scannedRoots:[r],packages:[],warnings:[],message:"\u76EE\u5F55\u4E0D\u5B58\u5728\u3002"}}let{scannedRoots:n,packages:o,warnings:i}=await el(Oh.map(s=>Te.join(r,s)));return{ok:!0,scanMode:"project",rootPath:r,scannedRoots:n,packages:o,warnings:i,message:o.length>0?`\u5171\u53D1\u73B0 ${o.length} \u4E2A\u6280\u80FD\u5305\u3002`:"\u672A\u53D1\u73B0 SKILL.md\u3002"}},Gh=async()=>{let e=pi(ui.homedir()),{scannedRoots:t,packages:r,warnings:n}=await el([..._h]);return{ok:!0,scanMode:"global",rootPath:e,scannedRoots:t,packages:r,warnings:n,message:r.length>0?`\u5171\u53D1\u73B0 ${r.length} \u4E2A\u6280\u80FD\u5305\u3002`:"\u672A\u53D1\u73B0\u5168\u5C40 SKILL.md\u3002"}},tl=async e=>e.scanMode==="global"?Gh():qh(e.workspaceRoot,e.rootPath||e.workspaceRoot);import{createHash as Jh}from"node:crypto";import{existsSync as mi,mkdirSync as ol,rmSync as Vh}from"node:fs";import yr from"node:path";import{simpleGit as Xh}from"simple-git";import{mkdirSync as Hh,writeFileSync as zh}from"node:fs";import En from"node:path";var Kh=(e,t)=>{if(!Ia(t))throw new Error(`\u8FD0\u884C\u65F6\u73AF\u5883\u53D8\u91CF\u6587\u4EF6\u540D\u4E0D\u5408\u6CD5\uFF1A${t}`);let r=En.resolve(e,t),n=En.relative(e,r);if(n.startsWith("..")||En.isAbsolute(n))throw new Error(`\u8FD0\u884C\u65F6\u73AF\u5883\u53D8\u91CF\u6587\u4EF6\u5FC5\u987B\u4F4D\u4E8E\u5DE5\u4F5C\u76EE\u5F55\u5185\uFF1A${t}`);return r},le=(e,t)=>{if(!t)return{env:{}};if(t.mode==="env-file"){let r=t.fileName?.trim();if(!r)throw new Error("\u73AF\u5883\u53D8\u91CF\u6587\u4EF6\u6A21\u5F0F\u7F3A\u5C11\u6587\u4EF6\u540D\u3002");let n=Kh(e,r);Hh(En.dirname(n),{recursive:!0}),zh(n,`${t.fileContent??""}${t.fileContent?`
85
- `:""}`,"utf8")}return{env:{...t.variables??{}}}},Ae=(e,t)=>({...e??process.env,...t?.variables??{}});var il=e=>e==="original-dir"?"original-dir":"worktree",Yh=e=>e.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"repo",Qh=e=>Jh("sha1").update(e).digest("hex").slice(0,12),sl=(e,t)=>{let r=t?yr.basename(t).replace(/\.git$/i,""):"repo";return yr.join(oe(e),"repos",`${Yh(r)}-${Qh(t||r)}`)},rl=e=>{let t=[e.repoPath?.trim(),e.worktreePath.trim()].filter(n=>!!n).map(n=>oe(n));return t.find(n=>mi(n))||t[0]||oe(e.worktreePath)},Zh=async e=>{if(e.repoUrl?.trim()){let n=await gr(e.repoPath,e.repoUrl,e.preferredBranch,e.env),o=fr({branches:n.branches,defaultBranch:n.defaultBranch,preferredBranch:e.preferredBranch});if(!n.branches.includes(o))return{ok:!1,message:n.branches.length>0?`\u8D77\u59CB\u5206\u652F ${o} \u4E0D\u5B58\u5728\u3002\u5F53\u524D\u4ED3\u5E93\u5206\u652F\uFF1A${n.branches.join(", ")}`:`\u8D77\u59CB\u5206\u652F ${o} \u4E0D\u5B58\u5728\u3002`,worktreePath:e.repoPath};console.log("[worker] [worktree] preparing original directory repository",JSON.stringify({repoPath:e.repoPath,remoteTarget:n.remoteTarget,startPoint:o})),await hr({repoPath:e.repoPath,remoteTarget:n.remoteTarget,startPoint:o,env:e.env})}let t=ie(e.repoPath,e.env);if(!mi(e.repoPath)||!await t.checkIsRepo().catch(()=>!1))return{ok:!1,message:`\u539F\u59CB\u76EE\u5F55\u6A21\u5F0F\u8981\u6C42\u76EE\u6807\u76EE\u5F55\u662F\u6709\u6548 Git \u4ED3\u5E93\uFF1A${e.repoPath}`,worktreePath:e.repoPath};let r=re((await t.branchLocal()).current);return{ok:!0,message:r?`\u5DF2\u590D\u7528\u539F\u59CB\u76EE\u5F55 ${e.repoPath}\uFF0C\u5F53\u524D\u5206\u652F ${r}\u3002`:`\u5DF2\u590D\u7528\u539F\u59CB\u76EE\u5F55 ${e.repoPath}\u3002`,worktreePath:e.repoPath}},ey=async e=>{let t=await e.raw(["worktree","list","--porcelain"]),r=[],n=null;for(let o of t.split(`
86
- `)){if(o.startsWith("worktree ")){n&&r.push(n),n={path:yr.resolve(o.slice(9).trim())};continue}o.startsWith("branch ")&&n&&(n.branch=o.slice(7).trim())}return n&&r.push(n),r},ty=async(e,t)=>(await e.branchLocal()).all.includes(t),al=e=>{Vh(e,{recursive:!0,force:!0,maxRetries:5,retryDelay:100})},cl=async(e,t,r)=>{let n=yr.resolve(t),o=`refs/heads/${r}`;try{await e.raw(["worktree","prune"])}catch{}let s=(await ey(e)).find(a=>a.branch===o);if(s&&s.path!==n)try{await e.raw(["worktree","remove","--force",s.path])}catch{}try{await e.raw(["worktree","remove","--force",n])}catch{}if(al(n),await ty(e,r))try{await e.deleteLocalBranch(r,!0)}catch{}try{await e.raw(["worktree","prune"])}catch{}ol(yr.dirname(n),{recursive:!0})},nl=async e=>{let t=ie(e.repoPath,e.env);if(!await t.checkIsRepo().catch(()=>!1))return{ok:!1,message:`\u76EE\u6807\u76EE\u5F55\u4E0D\u662F\u6709\u6548 Git \u4ED3\u5E93\uFF1A${e.repoPath}`,worktreePath:e.worktreePath};let r=await dt(e.repoPath,e.preferredBranch,e.env),n=re(e.preferredBranch??"")||r.defaultBranch,o=r.branches.includes(n)?n:r.defaultBranch;return r.branches.includes(o)?(console.log("[worker] [worktree] local repo creating worktree",JSON.stringify({repoPath:e.repoPath,worktreePath:e.worktreePath,branchName:e.branchName,startPoint:o})),await cl(t,e.worktreePath,e.branchName),await t.raw(["worktree","add","--force","-B",e.branchName,e.worktreePath,o]),{ok:!0,message:`\u5DF2\u57FA\u4E8E ${o} \u521B\u5EFA worktree ${e.worktreePath} \u5E76\u5207\u51FA\u5206\u652F ${e.branchName}\u3002`,worktreePath:e.worktreePath}):{ok:!1,message:r.branches.length>0?`\u8D77\u59CB\u5206\u652F ${o} \u4E0D\u5B58\u5728\u3002\u5F53\u524D\u4ED3\u5E93\u5206\u652F\uFF1A${r.branches.join(", ")}`:`\u8D77\u59CB\u5206\u652F ${o} \u4E0D\u5B58\u5728\u3002`,worktreePath:e.worktreePath}},ll=async e=>{let t=il(e.workingDirectoryMode),r=oe(e.worktreePath),n=oe(e.repoPath?.trim()||sl(e.workspaceRoot,e.repoUrl)),o=Le({taskId:`worktree-${Buffer.from(r).toString("base64url").slice(0,24)}`,identity:e.gitIdentity??{mode:"personal"},repoUrl:e.repoUrl}),i=t==="original-dir"?rl({repoPath:e.repoPath,worktreePath:e.worktreePath}):r;le(i,e.runtimeEnvironment);let s=Ae(o.env,e.runtimeEnvironment);if(console.log("[worker] [worktree] ensure worktree starting",JSON.stringify({worktreePath:r,repoPath:n,branchName:e.branchName,preferredBranch:e.preferredBranch,workingDirectoryMode:t})),t==="original-dir"){let a=rl({repoPath:e.repoPath,worktreePath:e.worktreePath});try{return await Zh({repoPath:a,repoUrl:e.repoUrl,preferredBranch:e.preferredBranch,branchName:e.branchName,env:s})}catch(c){let l=Z(c,e.repoUrl);return{ok:!1,message:l instanceof Error?l.message:"\u539F\u59CB\u76EE\u5F55\u51C6\u5907\u5931\u8D25\u3002",worktreePath:n}}finally{o.cleanup()}}if(!e.repoPath?.trim()&&!e.repoUrl?.trim())return ol(r,{recursive:!0}),{ok:!0,message:`\u5DF2\u51C6\u5907\u9879\u76EE\u76EE\u5F55 ${r}\u3002`,worktreePath:r};if(!e.repoUrl?.trim())try{return await nl({repoPath:n,worktreePath:r,branchName:e.branchName,preferredBranch:e.preferredBranch,env:s})}catch(a){let c=Z(a,e.repoUrl);return{ok:!1,message:c instanceof Error?c.message:"\u521B\u5EFA worktree \u5931\u8D25\u3002",worktreePath:r}}finally{o.cleanup()}try{let a=await gr(n,e.repoUrl,e.preferredBranch,s),c=re(e.preferredBranch??"")||a.defaultBranch,l=fr({branches:a.branches,defaultBranch:a.defaultBranch,preferredBranch:e.preferredBranch});if(!a.branches.includes(l))return console.log("[worker] [worktree] ensure worktree skipped: branch not found",JSON.stringify({startPoint:l,availableBranches:a.branches})),{ok:!1,message:a.branches.length>0?`\u8D77\u59CB\u5206\u652F ${l} \u4E0D\u5B58\u5728\u3002\u5F53\u524D\u4ED3\u5E93\u5206\u652F\uFF1A${a.branches.join(", ")}`:`\u8D77\u59CB\u5206\u652F ${l} \u4E0D\u5B58\u5728\u3002`};console.log("[worker] [worktree] resolved remote start point",JSON.stringify({repoPath:n,remoteTarget:a.remoteTarget,requestedStartPoint:c,startPoint:l})),await hr({repoPath:n,remoteTarget:a.remoteTarget,startPoint:l,env:s});let d=ie(n,s),m=`refs/remotes/origin/${l}`;return console.log("[worker] [worktree] creating fresh worktree",JSON.stringify({worktreePath:r,branchName:e.branchName,startPoint:l,startPointRef:m})),await cl(d,r,e.branchName),await d.raw(["worktree","add","--force","-B",e.branchName,r,m]),console.log("[worker] [worktree] worktree created",JSON.stringify({worktreePath:r,branchName:e.branchName,startPoint:l,startPointRef:m})),{ok:!0,message:`\u5DF2\u57FA\u4E8E ${l} \u521B\u5EFA worktree ${r} \u5E76\u5207\u51FA\u5206\u652F ${e.branchName}\u3002`,worktreePath:r}}catch(a){let c=Z(a,e.repoUrl);console.log("[worker] [worktree] remote prepare failed",JSON.stringify({worktreePath:r,repoPath:n,error:c instanceof Error?c.message:"unknown"}));try{return await nl({repoPath:n,worktreePath:r,branchName:e.branchName,preferredBranch:e.preferredBranch,env:s})}catch(l){let d=Z(l,e.repoUrl);return console.log("[worker] [worktree] ensure worktree failed",JSON.stringify({worktreePath:r,error:d instanceof Error?d.message:"unknown"})),{ok:!1,message:d instanceof Error?d.message:"\u521B\u5EFA worktree \u5931\u8D25\u3002",worktreePath:r}}}finally{o.cleanup()}},dl=async e=>{let t=il(e.workingDirectoryMode),r=oe(e.worktreePath),n=oe(e.repoPath?.trim()||sl(e.workspaceRoot,e.repoUrl));if(console.log("[worker] [worktree] cleanup worktree starting",JSON.stringify({worktreePath:r,repoPath:n,workingDirectoryMode:t})),t==="original-dir")return{ok:!0,message:`\u539F\u59CB\u76EE\u5F55\u6A21\u5F0F\u65E0\u9700\u6E05\u7406 worktree\uFF0C\u4FDD\u7559\u9879\u76EE\u76EE\u5F55 ${n}\u3002`,worktreePath:n};if(!e.repoPath?.trim()&&!e.repoUrl?.trim())return{ok:!0,message:`\u5F53\u524D\u76EE\u5F55\u9879\u76EE\u65E0\u9700\u6E05\u7406 worktree\uFF1A${r}\u3002`,worktreePath:r};try{if(mi(n)){let o=Xh(n);if(await o.checkIsRepo()){try{console.log("[worker] [worktree] removing worktree via git",JSON.stringify({worktreePath:r})),await o.raw(["worktree","remove","--force",r])}catch{console.log("[worker] [worktree] git worktree remove failed, falling through to local cleanup",JSON.stringify({worktreePath:r}))}try{await o.raw(["worktree","prune"])}catch{console.log("[worker] [worktree] git worktree prune failed, ignoring",JSON.stringify({worktreePath:r}))}}}return console.log("[worker] [worktree] removing worktree path",JSON.stringify({worktreePath:r})),al(r),console.log("[worker] [worktree] cleanup worktree done",JSON.stringify({worktreePath:r})),{ok:!0,message:`\u5DF2\u6E05\u7406 worktree ${r}\u3002`,worktreePath:r}}catch(o){return console.log("[worker] [worktree] cleanup worktree failed",JSON.stringify({worktreePath:r,error:o instanceof Error?o.message:"unknown"})),{ok:!1,message:o instanceof Error?o.message:"\u6E05\u7406 worktree \u5931\u8D25\u3002",worktreePath:r}}};var ul="[worker][terminal]",ry=["1","true","yes","on"].includes(process.env.VIBEMUX_TERMINAL_DEBUG?.trim().toLowerCase()||""),pl=e=>typeof e!="string"?e:e.trim().replace(/\s+/g," ").slice(0,160),ny=e=>{if(e)return Object.fromEntries(Object.entries(e).map(([t,r])=>t==="command"||t==="preview"?[t,pl(r)]:t==="stdout"||t==="stderr"?[t,pl(r)]:[t,r]))},oy=(e,t)=>{if(!ry)return;let r=ny(t);if(r){console.info(`${ul} ${e}`,r);return}console.info(`${ul} ${e}`)},kr=e=>`prompt:${e}`,gi=e=>e.workingDirectoryMode==="original-dir"?"original-dir":"worktree",ml=e=>{let{send:t,executorId:r,sessionId:n,stream:o,chunk:i}=e;t({type:"executor.terminal.session.output",executorId:r,output:{sessionId:n,stream:o,chunk:i,at:new Date().toISOString()}})},Me=oy;var ay=async(e,t=5e3)=>{let r=Date.now(),n=new AbortController,o=setTimeout(()=>{n.abort()},Math.max(500,t));try{let i=await fetch(e,{method:"GET",redirect:"follow",signal:n.signal,headers:{accept:"text/html,application/json;q=0.9,*/*;q=0.8"}});return await i.body?.cancel().catch(()=>{}),{ok:!0,reachable:!0,url:e,statusCode:i.status,finalUrl:i.url||e,responseTimeMs:Date.now()-r,at:new Date().toISOString()}}catch(i){let s=i instanceof Error?i.name==="AbortError"?`timed out after ${t}ms`:i.message:"environment probe failed";return{ok:!1,reachable:!1,url:e,error:s,responseTimeMs:Date.now()-r,at:new Date().toISOString()}}finally{clearTimeout(o)}},gl=(e,t)=>{let r=t.getConfig(),n=()=>(r=b(),t.setConfig(r),r);if(e.type==="executor.latency.ping"){if(!r.executorId||e.executorId!==r.executorId)return!0;let o=new Date().toISOString();return t.send({type:"executor.latency.pong",executorId:r.executorId,requestId:e.requestId,sentAt:e.sentAt,receivedAt:o,respondedAt:new Date().toISOString()}),!0}return e.type==="executor.repo-probe.request"?(n(),Hc(e.localPath).then(o=>{t.send({type:"executor.repo-probe.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.git.pat.verify.request"?(n(),gc(e.patToken,e.provider,e.host).then(o=>{t.send({type:"executor.git.pat.verify.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.doctor.request"?(n(),Tt().then(o=>{t.send({type:"executor.doctor.response",executorId:r.executorId,requestId:e.requestId,doctor:o,at:new Date().toISOString()})}),!0):e.type==="executor.directory-browse.request"?(n(),zc(e.rootPath||r.workspaceRoot,e.directoryPath).then(o=>{t.send({type:"executor.directory-browse.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.file-read.request"?(n(),Kc(e.rootPath||r.workspaceRoot,e.filePath).then(o=>{t.send({type:"executor.file-read.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.http.probe.request"?(n(),ay(e.url,e.timeoutMs).then(o=>{t.send({type:"executor.http.probe.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.agent.workdir.request"?(n(),Promise.resolve().then(()=>{if(e.action==="ensure"){let o=Sc(e.agentId);return{ok:!0,workdir:o.summary,files:o.files,message:"Agent \u5DE5\u4F5C\u76EE\u5F55\u5DF2\u521D\u59CB\u5316\u3002"}}if(e.action==="rescan"){let o=Lt(e.agentId,!0);return{ok:!0,workdir:o.summary,files:o.files,message:"Agent \u5DE5\u4F5C\u76EE\u5F55\u7D22\u5F15\u5DF2\u5237\u65B0\u3002"}}if(e.action==="cleanup")return{ok:!0,workdir:Cc(e.agentId),files:Lt(e.agentId).files,message:"\u5DF2\u6E05\u7406 Agent \u7CFB\u7EDF\u4E34\u65F6\u76EE\u5F55\u3002"};if(e.action==="delete"){let o=Pc(e.agentId,e.relativePath||"");return{ok:!0,workdir:o.summary,files:o.files,message:"\u6587\u4EF6\u5DF2\u5220\u9664\u3002"}}if(e.action==="list"){let o=Lt(e.agentId,e.refresh===!0);return{ok:!0,workdir:o.summary,files:o.files}}return{ok:!0,workdir:ur(e.agentId),files:Lt(e.agentId).files}}).catch(o=>({ok:!1,workdir:ur(e.agentId),files:Lt(e.agentId).files,message:o instanceof Error?o.message:"Agent \u5DE5\u4F5C\u76EE\u5F55\u8BF7\u6C42\u5931\u8D25\u3002"})).then(o=>{t.send({type:"executor.agent.workdir.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.agent.workdir.download.request"?(n(),Promise.resolve().then(()=>{let o=Sn(e.agentId,e.relativePath);return{ok:!0,relativePath:o.relativePath,filename:sy(o.relativePath),contentBase64:iy(o.absolutePath).toString("base64")}}).catch(o=>({ok:!1,relativePath:e.relativePath,message:o instanceof Error?o.message:"Agent \u5DE5\u4F5C\u76EE\u5F55\u6587\u4EF6\u4E0B\u8F7D\u5931\u8D25\u3002"})).then(o=>{t.send({type:"executor.agent.workdir.download.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.agent.workdir.read.request"?(n(),Promise.resolve().then(()=>Ec(e.agentId,e.relativePath)).catch(o=>({ok:!1,relativePath:e.relativePath,message:o instanceof Error?o.message:"Agent \u5DE5\u4F5C\u76EE\u5F55\u6587\u4EF6\u9884\u89C8\u5931\u8D25\u3002"})).then(o=>{t.send({type:"executor.agent.workdir.read.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.agent-sessions.list.request"?(n(),Promise.resolve().then(()=>an()).catch(o=>({ok:!1,sessions:[],counts:{claude:0,opencode:0,codex:0,pi:0},message:o instanceof Error?o.message:"\u8BFB\u53D6\u672C\u5730 Agent \u4F1A\u8BDD\u5931\u8D25\u3002"})).then(o=>{t.send({type:"executor.agent-sessions.list.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.agent-sessions.read.request"?(n(),Promise.resolve().then(()=>{let o=cn(e.source,e.sessionId);return o?{ok:!0,session:o}:{ok:!1,message:"\u4F1A\u8BDD\u4E0D\u5B58\u5728\u6216\u5DF2\u4E0D\u53EF\u8BFB\u3002"}}).catch(o=>({ok:!1,message:o instanceof Error?o.message:"\u8BFB\u53D6\u672C\u5730 Agent \u4F1A\u8BDD\u8BE6\u60C5\u5931\u8D25\u3002"})).then(o=>{t.send({type:"executor.agent-sessions.read.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.skills.scan.request"?(n(),tl({workspaceRoot:r.workspaceRoot,scanMode:e.scanMode,rootPath:e.rootPath}).then(o=>{t.send({type:"executor.skills.scan.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.repo-branches.request"?(n(),console.log("[worker] [repo-branches] request received",JSON.stringify({requestId:e.requestId,executorId:r.executorId,localPath:e.localPath,repoUrl:e.repoUrl,preferredBranch:e.preferredBranch})),Jc(e.localPath,e.repoUrl,e.preferredBranch,e.gitIdentity).then(o=>{console.log("[worker] [repo-branches] request resolved",JSON.stringify({requestId:e.requestId,executorId:r.executorId,ok:o.ok,branchCount:o.branches.length,defaultBranch:o.defaultBranch,message:o.message})),t.send({type:"executor.repo-branches.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.git.checkout.request"?(n(),$c({worktreePath:e.worktreePath,repoUrl:e.repoUrl,branchName:e.branchName,gitIdentity:e.gitIdentity}).then(o=>{t.send({type:"executor.git.checkout.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.git.diff.request"?(n(),Oc({worktreePath:e.worktreePath,repoUrl:e.repoUrl,baseBranch:e.baseBranch,gitIdentity:e.gitIdentity}).then(o=>{t.send({type:"executor.git.diff.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.git.working-tree-diff.request"?(n(),_c({worktreePath:e.worktreePath,repoUrl:e.repoUrl,gitIdentity:e.gitIdentity}).then(o=>{t.send({type:"executor.git.working-tree-diff.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.git.commit-diff.request"?(n(),Bc({worktreePath:e.worktreePath,repoUrl:e.repoUrl,commitSha:e.commitSha,gitIdentity:e.gitIdentity}).then(o=>{t.send({type:"executor.git.commit-diff.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.git.rebase.request"?(n(),Wc({worktreePath:e.worktreePath,repoUrl:e.repoUrl,baseBranch:e.baseBranch,gitIdentity:e.gitIdentity}).then(o=>{t.send({type:"executor.git.rebase.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.git.graph.request"?(n(),Dc({worktreePath:e.worktreePath,repoUrl:e.repoUrl,baseBranch:e.baseBranch,limit:e.limit,gitIdentity:e.gitIdentity}).then(o=>{t.send({type:"executor.git.graph.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.git.push.request"?(n(),Nc({worktreePath:e.worktreePath,repoUrl:e.repoUrl,branchName:e.branchName,gitIdentity:e.gitIdentity}).then(o=>{t.send({type:"executor.git.push.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.git.pull-request.request"?(n(),Uc({worktreePath:e.worktreePath,repoUrl:e.repoUrl,title:e.title,body:e.body,baseBranch:e.baseBranch,compareBranch:e.compareBranch,gitIdentity:e.gitIdentity}).then(o=>{t.send({type:"executor.git.pull-request.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.worktree.ensure.request"?(n(),ll({workspaceRoot:r.workspaceRoot,repoPath:e.repoPath,repoUrl:e.repoUrl,preferredBranch:e.preferredBranch,branchName:e.branchName,worktreePath:e.worktreePath,gitIdentity:e.gitIdentity,workingDirectoryMode:gi(e),runtimeEnvironment:e.runtimeEnvironment}).then(o=>{t.send({type:"executor.worktree.ensure.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.worktree.cleanup.request"?(n(),dl({workspaceRoot:r.workspaceRoot,repoPath:e.repoPath,repoUrl:e.repoUrl,worktreePath:e.worktreePath,workingDirectoryMode:gi(e)}).then(o=>{t.send({type:"executor.worktree.cleanup.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.browser.run.request"?(n(),r.executorToken?.trim()?(Zr({cloudUrl:r.cloudUrl,executorToken:r.executorToken,taskId:e.taskId,workspaceId:e.workspaceId,workspaceSessionId:e.workspaceSessionId,cwd:e.cwd,appUrl:e.appUrl,healthUrl:e.healthUrl,goal:e.goal,mode:e.mode}).then(o=>{t.send({type:"executor.browser.run.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):(t.send({type:"executor.browser.run.response",executorId:r.executorId,requestId:e.requestId,result:{ok:!1,message:"\u5F53\u524D worker \u672A\u5B8C\u6210\u914D\u5BF9\uFF0C\u7F3A\u5C11 executor token\u3002",summary:"\u5F53\u524D worker \u672A\u5B8C\u6210\u914D\u5BF9\uFF0C\u7F3A\u5C11 executor token\u3002",usedMode:e.mode??"playwright",finalUrl:e.appUrl,observationsCount:0,issueCount:1,at:new Date().toISOString()},at:new Date().toISOString()}),!0)):!1};var cy=e=>{try{let t=new URL(e);return`${t.protocol}//${t.host}${t.pathname}`}catch{return"invalid-url"}},fl=(e,t)=>{let r=t.getConfig();return e.type==="preview.tunnel.open"?(console.log("[preview-tunnel] control open received",{previewSessionId:e.previewSessionId,executorId:r.executorId,tunnelUrl:cy(e.tunnelUrl),targetUrl:e.targetUrl}),Dt.open(e,r,t.send),!0):e.type==="preview.tunnel.close"?(console.log("[preview-tunnel] control close received",{previewSessionId:e.previewSessionId,executorId:r.executorId}),Dt.close(e.previewSessionId,"closed by control plane"),!0):!1};import{stat as Pw}from"node:fs/promises";import{randomUUID as fi}from"node:crypto";import{spawn as uy}from"node:child_process";import{existsSync as wr}from"node:fs";import ly from"node:path";var dy=()=>{let e=_r(),t=Vt();if(wr(t))return{launcherPath:wr(e)?e:void 0,runnerPath:process.execPath,entryPath:t};let r=ne("tsx"),n=ly.join(se(),"apps","worker","src","index.ts");return r&&wr(n)?{launcherPath:wr(e)?e:void 0,runnerPath:r,entryPath:n}:{launcherPath:wr(e)?e:void 0,runnerPath:void 0,entryPath:void 0}},Ft=()=>{let e=dy();return{...process.env,...e.launcherPath?{VIBEMUX_WORKER_LAUNCHER:e.launcherPath}:{},...e.runnerPath?{VIBEMUX_WORKER_RUNNER:e.runnerPath}:{},...e.entryPath?{VIBEMUX_WORKER_ENTRY:e.entryPath}:{}}};var py=new Set(["Glob","Grep","LS","NotebookRead","Read","Task","TodoRead"]),my=new Set(["Edit","MultiEdit","TodoWrite","Write"]),gy=e=>e.split("(")[0]?.trim()||e.trim(),fy=e=>e?.planMode?"plan":e?.permissionMode??"bypassPermissions",hy=e=>e==="bypassPermissions"&&typeof process.getuid=="function"&&process.getuid()===0?"acceptEdits":e,yy=(e,t)=>{let r=gy(t);return!!(e==="bypassPermissions"||py.has(r)||e==="acceptEdits"&&my.has(r))},xr=(e,t)=>{e.write(`${JSON.stringify(t)}
87
- `)},hl=async e=>{let t=fn("claude");if(!t)throw new Error("\u672A\u68C0\u6D4B\u5230 `claude` \u53EF\u6267\u884C\u6587\u4EF6\u3002");let r=e.agentSettings&&"permissionMode"in e.agentSettings?e.agentSettings:void 0,n=_e(e.executionModel)?.providerId||"anthropic",o=_e(r?.defaultModel)?.providerId||"anthropic",i=Ue(kt("ClaudeCode",n,e.executionModel))??Ue(kt("ClaudeCode",o,r?.defaultModel)),s=fy(r),a=hy(s),c=["-p","--output-format=stream-json","--input-format=stream-json","--verbose","--include-partial-messages","--replay-user-messages","--permission-mode",a,...e.runtimeArgs??[]];i&&c.push("--model",i);let l=e.resumeSessionId?.trim();return l&&c.push("--resume",l),new Promise((d,m)=>{let u=uy(t,c,{cwd:e.cwd,env:{...Ft(),...e.runtimeEnv??{}},stdio:["pipe","pipe","pipe"]}),p="",f="",x="",k="",g="",R="",C=!1,E=new Map,j=new Map,O=()=>(k=k||`${x||"claude"}:assistant`,M("ClaudeCode",e.onEvent,{type:"message.updated",properties:{info:{id:k,role:"assistant"}}}),k),H=(S,I,A,h)=>{M("ClaudeCode",e.onEvent,{type:"message.part.updated",properties:{part:{id:I,messageID:O(),type:S,text:A},delta:h}})},D=S=>{xr(u.stdin,{type:"control_response",response:S})},U=S=>{if(S.type!=="control_request")return;if(S.request.subtype==="hook_callback"){D({subtype:"success",request_id:S.request_id,response:{}});return}let I=S.request.tool_name,A=yy(a,I);A||M("ClaudeCode",e.onEvent,{type:"permission.updated",properties:{title:I}}),D({subtype:"success",request_id:S.request_id,response:A?{behavior:"allow",updatedInput:S.request.input}:{behavior:"deny",message:`\u5F53\u524D\u4F1A\u8BDD\u672A\u542F\u7528 ${I} \u6743\u9650\u3002`,interrupt:!1}})},L=()=>{xr(u.stdin,{type:"control_request",request_id:fi(),request:{subtype:"interrupt"}}),setTimeout(()=>{u.killed||u.kill("SIGTERM")},250)};e.signal?.addEventListener("abort",L,{once:!0});let K=S=>{let I=S.trim();if(!I)return;let A=dr(I);if(A?.type==="control_request"||A?.type==="control_cancel_request"){U(A);return}let h=dr(I);if(h){if(h.session_id&&(x=h.session_id),h.type==="system"&&h.subtype==="init"){M("ClaudeCode",e.onEvent,{type:"session.status",properties:{status:{type:"busy",message:"Claude Code \u4F1A\u8BDD\u5DF2\u5C31\u7EEA"}}});return}if(h.type==="stream_event"){let P=h.event,T=`${x||"claude"}:${P.index??0}`;if(P.type==="content_block_delta"&&P.delta?.type==="thinking_delta"){let y=`${j.get(T)??""}${P.delta.thinking??""}`;j.set(T,y),H("reasoning",`${T}:thinking`,y,P.delta.thinking??"");return}if(P.type==="content_block_delta"&&P.delta?.type==="text_delta"){let y=`${E.get(T)??""}${P.delta.text??""}`;E.set(T,y),g=y.trim()||g,H("text",`${T}:text`,y,P.delta.text??"");return}P.type==="content_block_start"&&P.content_block?.type==="tool_use"&&M("ClaudeCode",e.onEvent,{type:"message.part.updated",properties:{part:{id:P.content_block.id??`${T}:tool`,messageID:O(),type:"tool",tool:P.content_block.name??"tool",state:{status:"running"}}}});return}if(h.type==="assistant"){x=h.session_id??x,k=h.message?.id??O();let P=Array.isArray(h.message?.content)?h.message.content:[];for(let T of P)T.type==="text"&&T.text?.trim()&&(g=T.text.trim(),H("text",`${k}:final`,g)),T.type==="tool_use"&&M("ClaudeCode",e.onEvent,{type:"message.part.updated",properties:{part:{id:T.id??`${k}:tool`,messageID:O(),type:"tool",tool:T.name??"tool",state:{status:"running",raw:T.input?JSON.stringify(T.input,null,2):void 0}}}});return}if(h.type==="user"){let P=Array.isArray(h.message?.content)?h.message.content:[],T=P.find(y=>y.tool_use_id)?.tool_use_id;if(!T)return;M("ClaudeCode",e.onEvent,{type:"message.part.updated",properties:{part:{id:T,messageID:O(),type:"tool",tool:"tool",state:{status:"completed",output:P.find(y=>y.tool_use_id===T)?.content}}}});return}if(h.type==="result"){if(C=!h.is_error,h.result?.trim()&&(g=h.result.trim()),h.is_error){R=h.result?.trim()||"Claude Code \u6267\u884C\u5931\u8D25",M("ClaudeCode",e.onEvent,{type:"session.error",properties:{error:R}});return}M("ClaudeCode",e.onEvent,{type:"session.status",properties:{status:{type:"idle",message:"Claude Code \u5DF2\u5B8C\u6210"}}}),u.killed||u.kill("SIGTERM")}}};u.stdout.on("data",S=>{p+=S.toString();let I=p.split(`
88
- `);p=I.pop()??"";for(let A of I)K(A)}),u.stderr.on("data",S=>{f+=S.toString()}),u.on("error",S=>{e.signal?.removeEventListener("abort",L),m(S)}),u.on("close",S=>{if(e.signal?.removeEventListener("abort",L),p.trim()&&K(p),e.signal?.aborted){m(Pe(e.signal));return}if(!C&&S!==0||R){m(new Error(R||f.trim().split(`
89
- `).filter(Boolean).at(-1)||`Claude Code \u6267\u884C\u5931\u8D25\uFF08\u9000\u51FA\u7801 ${S??-1}\uFF09`));return}d({output:g||f.trim().split(`
90
- `).filter(Boolean).at(-1)||"Claude Code \u672A\u8FD4\u56DE\u6587\u672C\u8F93\u51FA\u3002",sessionId:x||void 0})}),xr(u.stdin,{type:"control_request",request_id:fi(),request:{subtype:"initialize"}}),xr(u.stdin,{type:"control_request",request_id:fi(),request:{subtype:"set_permission_mode",mode:a}}),xr(u.stdin,{type:"user",message:{role:"user",content:e.prompt}})})};import{readFileSync as In,writeFileSync as yl}from"node:fs";import ky from"node:http";import{spawn as wy}from"node:child_process";import{once as xy}from"node:events";import bn from"node:path";var kl=(e,t,r)=>{let n={};return r?.reasoningEffort&&(n.model_reasoning_effort=r.reasoningEffort),r?.reasoningSummary&&(n.model_reasoning_summary=r.reasoningSummary),{model:t??null,cwd:e,approvalPolicy:r?.approval??"never",sandbox:r?.sandbox??"workspace-write",config:Object.keys(n).length>0?n:null,experimentalRawEvents:!1,persistExtendedHistory:!0}},Sy=(e,t,r,n)=>{let o={};return n?.reasoningEffort&&(o.model_reasoning_effort=n.reasoningEffort),n?.reasoningSummary&&(o.model_reasoning_summary=n.reasoningSummary),{threadId:t,cwd:e,model:r??null,approvalPolicy:n?.approval??"never",sandbox:n?.sandbox??"workspace-write",config:Object.keys(o).length>0?o:null,persistExtendedHistory:!0}},vy=e=>({mode:"default",settings:{model:e,reasoning_effort:null,developer_instructions:null}}),Cy=e=>e==="never"?{command:"acceptForSession",fileChange:"acceptForSession"}:{command:"decline",fileChange:"decline"},Py=e=>{let t=e instanceof Error?e.message.trim().toLowerCase():"";return t?t.includes("no rollout found for thread id")||t.includes("no thread found for id")||t.includes("thread/resume")&&t.includes("not found"):!1},Ey=new Set(["codex \u6267\u884C\u5931\u8D25","codex execution failed","execution failed","request failed","unknown error"]),ki=e=>e.split(`
80
+ `:""},Zc=async(e,t)=>{let r=[`refs/remotes/origin/${t}`,`origin/${t}`,`refs/heads/${t}`,t];for(let n of r)try{return await e.raw(["rev-parse","--verify",n]),{baseBranch:t,baseRef:n}}catch{}return null},rl=async(e,t,r)=>{let n=ke(t)||vr;if(r?.forceFetchFirst)try{await e.fetch(["origin",`${n}:refs/remotes/origin/${n}`])}catch{}let o=await Zc(e,n);if(o)return o;if(!r?.forceFetchFirst){try{await e.fetch(["origin",`${n}:refs/remotes/origin/${n}`])}catch{}let s=await Zc(e,n);if(s)return s}throw new Error(`\u627E\u4E0D\u5230\u57FA\u7EBF\u5206\u652F ${n}\u3002`)},Ve=async e=>{let t=await e.branchLocal();return ke(t.current)||"HEAD"},Gh=async(e,t)=>{try{let r=await e.raw(["rev-list","--count",`${t}..HEAD`]),n=Number(r.trim());return Number.isFinite(n)?n:0}catch{return 0}},zh=async e=>{try{return await e.raw(["rev-parse","--verify","HEAD"]),!0}catch{return!1}},Kh=async(e,t)=>{try{return(await e.raw(["rev-list","--parents","-n","1",t])).trim().split(/\s+/).filter(Boolean)[1]}catch{return}},Vh=async e=>{try{return(await e.raw(["diff","--name-only","--diff-filter=U"])).split(`
81
+ `).map(r=>r.trim()).filter(Boolean)}catch{return[]}},Jh=e=>{let t=e.trim();return!t.startsWith("(")||!t.endsWith(")")?[]:t.slice(1,-1).split(",").map(r=>r.trim()).filter(Boolean)},Xh=e=>{let t=e.trim();if(!t)return null;let r=[/^https?:\/\/github\.com\/([^/]+)\/([^/.]+?)(?:\.git)?$/i,/^git@github\.com:([^/]+)\/([^/.]+?)(?:\.git)?$/i,/^ssh:\/\/git@github\.com\/([^/]+)\/([^/.]+?)(?:\.git)?$/i];for(let n of r){let o=t.match(n);if(o)return{owner:o[1],repo:o[2]}}return null},Yh=e=>e.split("").map(t=>t.trim()).filter(Boolean).map(t=>{let[r="",n="",o="",s="",i="",a=""]=t.split(""),c=Jh(o);return{sha:r,shortSha:r.slice(0,7),parents:n.split(" ").map(l=>l.trim()).filter(Boolean),subject:s.trim(),authorDate:i.trim(),authorName:a.trim(),refs:c,isHead:c.some(l=>l.startsWith("HEAD"))}}),Je=async e=>{let t=bs(e.worktreePath),r=$e({taskId:`${e.taskKey}-${Buffer.from(t).toString("base64url").slice(0,24)}`,identity:e.gitIdentity??{mode:"personal"},repoUrl:e.repoUrl});try{r.configureRepo(t);let n=Lh(t,r.env);return await e.run(n)}finally{r.cleanup(t)}},nl=async e=>{try{return await Je({...e,taskKey:"git-diff",run:async t=>{let{baseBranch:r,baseRef:n}=await rl(t,e.baseBranch),o=await Ve(t),s=bs(e.worktreePath),[i,a,c,l,d]=await Promise.all([t.raw(["diff","--numstat","--find-renames","--merge-base",n]),t.raw(["diff","--name-status","--find-renames","--merge-base",n]),t.raw(["diff","--find-renames","--merge-base",n]),Gh(t,n),t.raw(["ls-files","--others","--exclude-standard","-z"])]),p=Ts(i,a),u=new Set(p.map(g=>g.path)),m=await el(s,d),f=m.map(g=>g.file).filter(g=>!u.has(g.path)),S=p.concat(f),w=tl([c,...m.map(g=>g.patch)]);return{ok:!0,message:S.length>0?`\u5DF2\u751F\u6210\u5F53\u524D\u5DE5\u4F5C\u533A\u76F8\u5BF9 ${r} \u7684\u5DEE\u5F02\u3002`:`\u5F53\u524D\u5DE5\u4F5C\u533A\u76F8\u5BF9 ${r} \u6CA1\u6709\u5DEE\u5F02\u3002`,baseBranch:r,currentBranch:o,aheadCommits:l,files:S,patch:w}}})}catch(t){let r=te(t,e.repoUrl);return{ok:!1,message:r instanceof Error?r.message:"\u8BFB\u53D6 Git diff \u5931\u8D25\u3002",baseBranch:ke(e.baseBranch)||vr,currentBranch:"HEAD",aheadCommits:0,files:[],patch:""}}},ol=async e=>{try{return await Je({...e,taskKey:"git-working-tree-diff",run:async t=>{let r=await Ve(t),n=await zh(t),o=bs(e.worktreePath),[s,i,a,c]=await Promise.all([n?t.raw(["diff","--numstat","--find-renames","HEAD"]):Promise.resolve(""),n?t.raw(["diff","--name-status","--find-renames","HEAD"]):Promise.resolve(""),n?t.raw(["diff","--find-renames","HEAD"]):Promise.resolve(""),t.raw(["ls-files","--others","--exclude-standard","-z"])]),l=n?Ts(s,i):[],d=await el(o,c),p=d.map(S=>S.file),u=new Set(l.map(S=>S.path)),m=l.concat(p.filter(S=>!u.has(S.path))),f=tl([a,...d.map(S=>S.patch)]);return{ok:!0,message:m.length>0?"\u5DF2\u751F\u6210\u5F53\u524D\u5DE5\u4F5C\u533A\u672A\u63D0\u4EA4\u6539\u52A8\u3002":"\u5F53\u524D\u5DE5\u4F5C\u533A\u6CA1\u6709\u672A\u63D0\u4EA4\u6539\u52A8\u3002",currentBranch:r,files:m,patch:f}}})}catch(t){let r=te(t,e.repoUrl);return{ok:!1,message:r instanceof Error?r.message:"\u8BFB\u53D6\u5F53\u524D\u5DE5\u4F5C\u533A Git \u6539\u52A8\u5931\u8D25\u3002",currentBranch:"HEAD",files:[],patch:""}}},sl=async e=>{try{return await Je({worktreePath:e.worktreePath,repoUrl:e.repoUrl,gitIdentity:e.gitIdentity,taskKey:"git-commit-diff",run:async t=>{let r=e.commitSha.trim();if(!r)return{ok:!1,message:"\u7F3A\u5C11 commit SHA\u3002",commitSha:"",files:[],patch:""};await t.raw(["rev-parse","--verify",r]);let n=await Kh(t,r),[o,s,i]=await Promise.all([t.raw(["show","--format=","--find-renames",r]),t.raw(["show","--format=","--numstat","--find-renames",r]),t.raw(["show","--format=","--name-status","--find-renames",r])]),a=Ts(s,i);return{ok:!0,message:a.length>0?`\u5DF2\u52A0\u8F7D\u63D0\u4EA4 ${r.slice(0,7)} \u7684 diff\u3002`:`\u63D0\u4EA4 ${r.slice(0,7)} \u6CA1\u6709\u6587\u4EF6\u5DEE\u5F02\u3002`,commitSha:r,parentSha:n,files:a,patch:o}}})}catch(t){let r=te(t,e.repoUrl);return{ok:!1,message:r instanceof Error?r.message:"\u8BFB\u53D6 commit diff \u5931\u8D25\u3002",commitSha:e.commitSha.trim(),files:[],patch:""}}},il=async e=>{try{return await Je({...e,taskKey:"git-rebase",run:async t=>{let{baseBranch:r,baseRef:n}=await rl(t,e.baseBranch,{forceFetchFirst:!0}),o=await Ve(t);try{return await t.raw(["rebase",n]),{ok:!0,message:`\u5DF2\u5C06 ${o} rebase \u5230 ${r}\u3002`,baseBranch:r,currentBranch:o,conflicts:!1,conflictedFiles:[]}}catch(s){let i=await Vh(t),a=te(s,e.repoUrl);return{ok:!1,message:i.length>0?`rebase \u53D1\u751F\u51B2\u7A81\uFF0C\u8BF7\u5148\u89E3\u51B3\u51B2\u7A81\u540E\u518D\u7EE7\u7EED\u3002${a instanceof Error?` ${a.message}`:""}`.trim():a instanceof Error?a.message:"\u6267\u884C rebase \u5931\u8D25\u3002",baseBranch:r,currentBranch:o,conflicts:i.length>0,conflictedFiles:i}}}})}catch(t){let r=te(t,e.repoUrl);return{ok:!1,message:r instanceof Error?r.message:"\u6267\u884C rebase \u5931\u8D25\u3002",baseBranch:ke(e.baseBranch)||vr,currentBranch:"HEAD",conflicts:!1,conflictedFiles:[]}}},al=async e=>{let t=Math.min(120,Math.max(10,e.limit??40));try{return await Je({...e,taskKey:"git-graph",run:async r=>{let n=await Ve(r),o=ke(e.baseBranch)||vr,s=await r.raw(["log","--decorate=short","--date=iso-local","--topo-order",`--max-count=${t}`,"--all","--format=%H%x1f%P%x1f%d%x1f%s%x1f%cd%x1f%an%x1e"]),i=await r.raw(["log","--graph","--decorate","--date=short",`--max-count=${t}`,"--all","--no-color","--pretty=format:%h %d %s (%cd)"]),a=Yh(s);return{ok:!0,message:"\u5DF2\u52A0\u8F7D Git graph\u3002",baseBranch:o,currentBranch:n,limit:t,commitCount:a.length,graph:i,commits:a}}})}catch(r){let n=te(r,e.repoUrl);return{ok:!1,message:n instanceof Error?n.message:"\u8BFB\u53D6 Git graph \u5931\u8D25\u3002",baseBranch:ke(e.baseBranch)||vr,currentBranch:"HEAD",limit:t,commitCount:0,graph:"",commits:[]}}},cl=async e=>{try{return await Je({...e,taskKey:"git-push",run:async t=>{let r=e.branchName?.trim()||await Ve(t),n=ke(r);return n?(await t.push(["-u","origin",n]),{ok:!0,message:`\u5DF2\u63A8\u9001\u5206\u652F ${n} \u5230 origin\u3002`,branchName:n,remoteBranch:`origin/${n}`}):{ok:!1,message:"\u5F53\u524D worktree \u4E0D\u5728\u6709\u6548\u5206\u652F\u4E0A\uFF0C\u65E0\u6CD5\u63A8\u9001\u3002",branchName:r,remoteBranch:""}}})}catch(t){let r=te(t,e.repoUrl);return{ok:!1,message:r instanceof Error?r.message:"\u63A8\u9001\u5206\u652F\u5931\u8D25\u3002",branchName:e.branchName?.trim()||"",remoteBranch:""}}},ll=async e=>{let t=ke(e.branchName);if(!t)return{ok:!1,message:"\u76EE\u6807\u5206\u652F\u4E0D\u80FD\u4E3A\u7A7A\u3002",currentBranch:""};try{return await Je({...e,taskKey:"git-checkout",run:async r=>{let n=await Ve(r);if(n===t)return{ok:!0,message:`\u5F53\u524D\u5DF2\u7ECF\u5728\u5206\u652F ${t}\u3002`,currentBranch:n};let o=await r.status();if(!o.isClean()){let u=o.files.map(m=>m.path).filter(Boolean);return{ok:!1,message:u.length>0?`\u5F53\u524D\u5DE5\u4F5C\u533A\u6709\u672A\u63D0\u4EA4\u6539\u52A8\uFF0C\u8BF7\u5148\u5904\u7406\u540E\u518D\u5207\u6362\u5206\u652F\uFF1A${u.slice(0,6).join(", ")}${u.length>6?"\u2026":""}`:"\u5F53\u524D\u5DE5\u4F5C\u533A\u6709\u672A\u63D0\u4EA4\u6539\u52A8\uFF0C\u8BF7\u5148\u5904\u7406\u540E\u518D\u5207\u6362\u5206\u652F\u3002",currentBranch:n}}let s=await r.branch(["-a"]);if(!new Set(s.all.map(ke).filter(Boolean)).has(t))try{await r.fetch(["origin",`${t}:refs/remotes/origin/${t}`])}catch{}let a=await r.branch(["-a"]),c=await r.branchLocal(),l=new Set(c.all.map(ke).filter(Boolean));if(!a.all.map(ke).filter(Boolean).includes(t)&&!l.has(t))return{ok:!1,message:`\u627E\u4E0D\u5230\u5206\u652F ${t}\u3002`,currentBranch:n};l.has(t)?await r.checkout(t):await r.checkout(["-B",t,`origin/${t}`]);let p=await Ve(r);return{ok:!0,message:`\u5DF2\u5207\u6362\u5230\u5206\u652F ${p}\u3002`,currentBranch:p}}})}catch(r){let n=te(r,e.repoUrl);return{ok:!1,message:n instanceof Error?n.message:"\u5207\u6362\u5206\u652F\u5931\u8D25\u3002",currentBranch:""}}},dl=async e=>{try{return await Je({worktreePath:e.worktreePath,repoUrl:e.repoUrl,gitIdentity:e.gitIdentity,taskKey:"git-pull-request",run:async t=>{let r=Xh(e.repoUrl);if(!r)return{ok:!1,message:"\u5F53\u524D\u4EC5\u652F\u6301\u4E3A GitHub \u4ED3\u5E93\u521B\u5EFA PR\u3002",provider:null,title:e.title,body:e.body,baseBranch:e.baseBranch,compareBranch:e.compareBranch?.trim()||""};let n=e.compareBranch?.trim()||await Ve(t),o=ke(n);if(!o)return{ok:!1,message:"\u5F53\u524D worktree \u4E0D\u5728\u6709\u6548\u5206\u652F\u4E0A\uFF0C\u65E0\u6CD5\u521B\u5EFA PR\u3002",provider:"github",title:e.title,body:e.body,baseBranch:e.baseBranch,compareBranch:n};await t.push(["-u","origin",o]);let s=e.gitIdentity?.credentialToken?.trim()||"";if(!s||e.gitIdentity?.authMode!=="pat")return{ok:!1,message:"\u521B\u5EFA PR \u76EE\u524D\u9700\u8981\u5DF2\u914D\u7F6E\u5E76\u6FC0\u6D3B GitHub PAT\u3002",provider:"github",title:e.title,body:e.body,baseBranch:e.baseBranch,compareBranch:o};let i=await fetch(`https://api.github.com/repos/${r.owner}/${r.repo}/pulls`,{method:"POST",headers:{Accept:"application/vnd.github+json",Authorization:`Bearer ${s}`,"Content-Type":"application/json","User-Agent":"Vibemux-Worker","X-GitHub-Api-Version":"2022-11-28"},body:JSON.stringify({title:e.title,body:e.body,base:e.baseBranch,head:o})}),a=await i.json().catch(()=>({}));if(!i.ok){let c=Array.isArray(a.errors)?a.errors.map(l=>l.message).filter(Boolean).join("\uFF1B"):"";return{ok:!1,message:[a.message,c].filter(Boolean).join("\uFF1B")||"\u521B\u5EFA GitHub PR \u5931\u8D25\u3002",provider:"github",title:e.title,body:e.body,baseBranch:e.baseBranch,compareBranch:o}}return{ok:!0,message:"PR \u5DF2\u521B\u5EFA\u3002",provider:"github",title:e.title,body:e.body,baseBranch:e.baseBranch,compareBranch:o,number:a.number,url:a.html_url,state:a.state}}})}catch(t){let r=te(t,e.repoUrl);return{ok:!1,message:r instanceof Error?r.message:"\u521B\u5EFA PR \u5931\u8D25\u3002",provider:"github",title:e.title,body:e.body,baseBranch:e.baseBranch,compareBranch:e.compareBranch?.trim()||""}}};import{mkdir as gl,readFile as iy,readdir as ay,stat as mt,writeFile as cy}from"node:fs/promises";import ly from"node:os";import gt from"node:path";import{mkdirSync as Qh}from"node:fs";import{readdir as Zh,stat as Wn}from"node:fs/promises";import ul from"node:os";import Rs from"node:path";import{simpleGit as ey}from"simple-git";var Re="main",ty=e=>{let t=e.trim();return t?t==="~"?ul.homedir():t.startsWith("~/")?Rs.join(ul.homedir(),t.slice(2)):t:""},U=e=>Rs.resolve(ty(e)),oe=e=>{let t=e.trim();if(!t||t==="HEAD"||t.endsWith("/HEAD"))return"";let r=t.startsWith("refs/heads/")?t.slice(11):t,n=r.startsWith("remotes/")?r.slice(8):r;return n.startsWith("origin/")?n.slice(7):n},ie=(e,t)=>{let r={..._t(t),...e?{baseDir:e}:{}};return ey(r).env(t??{})},pt=async(e,t,r)=>{let n=ie(e,r),[o,s]=await Promise.all([n.branch(["-a"]),n.branchLocal()]),i="";try{i=oe(await n.raw(["symbolic-ref","--quiet","--short","refs/remotes/origin/HEAD"]))}catch{i=""}let a=Array.from(new Set(o.all.map(oe).filter(Boolean))).sort((p,u)=>p.localeCompare(u)),c=oe(t??""),l=oe(s.current),d=[i,c,l,a[0],Re].find(p=>p&&(p===Re||a.includes(p)))??Re;return{branches:a,defaultBranch:d,currentBranch:l||void 0}},ry=e=>{for(let t of e.split(`
82
+ `)){let r=t.trim();if(!r.startsWith("ref: "))continue;let[n]=r.split(" ");return oe(n.slice(5))}return""},ny=e=>Array.from(new Set(e.split(`
83
+ `).map(t=>t.trim()).filter(Boolean).map(t=>t.split(" ")[1]||"").map(oe).filter(Boolean))).sort((t,r)=>t.localeCompare(r)),oy=async(e,t,r)=>{if(t?.trim())return t.trim();if(!(await Wn(e).catch(()=>null))?.isDirectory())return"";let o=ie(e,r);return await o.checkIsRepo()&&(await o.getRemotes(!0)).find(i=>i.name==="origin")?.refs.fetch?.trim()||""},pl=async(e,t,r)=>{if(t?.trim()||!(await Wn(e).catch(()=>null))?.isDirectory())return!1;let o=ie(e,r);return await o.checkIsRepo().catch(()=>!1)?!(await o.getRemotes(!0).catch(()=>[])).some(i=>i.name==="origin"&&i.refs.fetch?.trim()):!1},Kt=async(e,t,r,n)=>{let o=await oy(e,t,n);if(!o)throw new Error("\u4ED3\u5E93\u672A\u914D\u7F6E origin\uFF0C\u4E14\u6CA1\u6709\u53EF\u7528\u7684\u8FDC\u7AEF\u4ED3\u5E93\u5730\u5740\u3002");let s=await Wn(e).then(async m=>{if(!m.isDirectory())return;let f=ie(e,n);if(await f.checkIsRepo().catch(()=>!1))return f.branchLocal().then(S=>oe(S.current)||void 0).catch(()=>{})}).catch(()=>{}),i=ie(void 0,n),[a,c]=await Promise.all([i.raw(["ls-remote","--heads",o]),i.raw(["ls-remote","--symref",o,"HEAD"])]),l=ny(a),d=ry(c),p=oe(r??""),u=[d,p,l[0],Re].find(m=>m&&(m===Re||l.includes(m)))??Re;return{branches:l,defaultBranch:u,currentBranch:s,remoteTarget:o}},Vt=e=>{let t=oe(e.preferredBranch??"")||e.defaultBranch;return e.branches.includes(t)?t:e.defaultBranch},Jt=async e=>{let t=await Wn(e.repoPath).catch(()=>null);if(t&&!t.isDirectory())throw new Error(`\u76EE\u6807\u8DEF\u5F84\u4E0D\u662F\u76EE\u5F55\uFF1A${e.repoPath}`);if(t){let r=ie(e.repoPath,e.env);if(await r.checkIsRepo().catch(()=>!1)){await r.fetch(["origin",`${e.startPoint}:refs/remotes/origin/${e.startPoint}`]);return}if((await Zh(e.repoPath)).length>0)throw new Error(`\u76EE\u6807\u76EE\u5F55\u4E0D\u662F\u6709\u6548 Git \u4ED3\u5E93\uFF1A${e.repoPath}`)}else Qh(Rs.dirname(e.repoPath),{recursive:!0});await ie(void 0,e.env).clone(e.remoteTarget,e.repoPath,["--single-branch","--branch",e.startPoint])};import Pr from"node:path";var sy=(e,t)=>{let r=Pr.relative(e,t);return r===""||!r.startsWith("..")&&!Pr.isAbsolute(r)},Dn=(e,t)=>{let r=t?.trim();if(!r)return!1;let n=U(e),o=U(r),s=Pr.join(n,"projects");if(sy(s,o))return!0;let i=o.replace(/\\/g,"/");return/(?:^|\/)\.vibemux(?:-[^/]+)?\/workspace\/projects\/.+$/.test(i)},ae=(e,t)=>{let r=t?.trim();if(!r)return r;let n=U(e),o=U(r);if(o===n||o.startsWith(`${n}${Pr.sep}`))return o;let i=o.replace(/\\/g,"/").match(/(?:^|\/)\.vibemux(?:-[^/]+)?\/workspace\/projects\/(.+)$/);return i?Pr.join(n,"projects",...i[1].split("/").filter(Boolean)):o};var Nn=(e,t)=>{let r=gt.relative(e,t);return r===""||!r.startsWith("..")&&!gt.isAbsolute(r)},As=e=>{let t=U(e),r=U(ly.homedir());return Nn(r,t)?r:t};var fl=async e=>{let t=U(e);try{if(!(await mt(t)).isDirectory())return{ok:!1,path:t,message:"\u8BF7\u9009\u62E9\u76EE\u5F55\u800C\u975E\u6587\u4EF6"}}catch{return{ok:!1,path:t,message:"\u76EE\u5F55\u4E0D\u5B58\u5728"}}let r=gt.basename(t);try{let n=ie(t);if(!await n.checkIsRepo())return{ok:!0,path:t,name:r,versionControl:"none",message:"\u76EE\u5F55\u65E0 Git \u4ED3\u5E93"};let s=await n.revparse(["--verify","HEAD"]).then(u=>!!u.trim()).catch(()=>!1),c=(await n.getRemotes(!0)).find(u=>u.name==="origin")?.refs.fetch?.trim()||"";if(!s)return{ok:!0,path:t,name:r,versionControl:"none",gitUrl:c||void 0,message:c?"\u76EE\u5F55\u5DF2\u521D\u59CB\u5316 Git \u5E76\u914D\u7F6E\u8FDC\u7AEF\uFF0C\u4F46\u8FD8\u6CA1\u6709\u9996\u4E2A\u63D0\u4EA4\uFF1B\u5F53\u524D\u6309\u672C\u5730\u76EE\u5F55\u9879\u76EE\u5904\u7406\u3002":"\u76EE\u5F55\u5DF2\u521D\u59CB\u5316 Git\uFF0C\u4F46\u8FD8\u6CA1\u6709\u9996\u4E2A\u63D0\u4EA4\uFF1B\u5F53\u524D\u6309\u672C\u5730\u76EE\u5F55\u9879\u76EE\u5904\u7406\u3002"};let l=await pt(t),d=l.branches.length,p=c?"git-remote":"git-local";return{ok:!0,path:t,name:r,versionControl:p,gitUrl:c,defaultBranch:l.defaultBranch,message:d>0?p==="git-remote"?`\u5DF2\u68C0\u6D4B\u5230 Git \u4ED3\u5E93\uFF0C\u5171 ${d} \u4E2A\u5206\u652F`:`\u5DF2\u68C0\u6D4B\u5230\u672C\u5730 Git \u4ED3\u5E93\uFF08\u672A\u7ED1\u5B9A\u8FDC\u7AEF\uFF09\uFF0C\u5171 ${d} \u4E2A\u5206\u652F`:p==="git-remote"?"\u5DF2\u68C0\u6D4B\u5230 Git \u4ED3\u5E93":"\u5DF2\u68C0\u6D4B\u5230\u672C\u5730 Git \u4ED3\u5E93\uFF08\u672A\u7ED1\u5B9A\u8FDC\u7AEF\uFF09"}}catch{return{ok:!0,path:t,name:r,message:"\u65E0\u6CD5\u8BFB\u53D6 Git \u4FE1\u606F"}}},hl=async(e,t)=>{let r=As(e),n=U(e),o=t?.trim()?U(t):n;if(!Nn(r,o))return{ok:!1,path:o,rootPath:r,entries:[],message:"\u5F53\u524D\u8DEF\u5F84\u8D85\u51FA\u53EF\u6D4F\u89C8\u8303\u56F4\u3002"};try{if(!(await mt(o)).isDirectory())return{ok:!1,path:o,rootPath:r,entries:[],message:"\u5F53\u524D\u8DEF\u5F84\u4E0D\u662F\u76EE\u5F55\u3002"}}catch{if(Dn(e,o))try{await gl(o,{recursive:!0})}catch(s){return{ok:!1,path:o,rootPath:r,entries:[],message:s instanceof Error?`\u521B\u5EFA\u9879\u76EE\u76EE\u5F55\u5931\u8D25\uFF1A${s.message}`:"\u521B\u5EFA\u9879\u76EE\u76EE\u5F55\u5931\u8D25\u3002"}}else return{ok:!1,path:o,rootPath:r,entries:[],message:"\u76EE\u5F55\u4E0D\u5B58\u5728\u3002"}}try{if(!(await mt(o)).isDirectory())return{ok:!1,path:o,rootPath:r,entries:[],message:"\u5F53\u524D\u8DEF\u5F84\u4E0D\u662F\u76EE\u5F55\u3002"}}catch{return{ok:!1,path:o,rootPath:r,entries:[],message:"\u76EE\u5F55\u4E0D\u5B58\u5728\u3002"}}try{let i=(await ay(o,{withFileTypes:!0})).filter(a=>a.isDirectory()||a.isFile()).map(a=>({name:a.name,path:gt.join(o,a.name),kind:a.isDirectory()?"directory":"file"})).sort((a,c)=>a.kind!==c.kind?a.kind==="directory"?-1:1:a.name.localeCompare(c.name,"zh-Hans-CN"));return{ok:!0,path:o,rootPath:r,parentPath:o===r?void 0:gt.dirname(o),entries:i,message:i.length>0?`\u5171\u627E\u5230 ${i.length} \u4E2A\u6761\u76EE\u3002`:"\u5F53\u524D\u76EE\u5F55\u4E0B\u6CA1\u6709\u6587\u4EF6\u6216\u6587\u4EF6\u5939\u3002"}}catch(s){return{ok:!1,path:o,rootPath:r,entries:[],message:s instanceof Error?s.message:"\u8BFB\u53D6\u76EE\u5F55\u5931\u8D25\u3002"}}},dy=200*1024,ml={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".svg":"image/svg+xml",".bmp":"image/bmp",".ico":"image/x-icon"},uy=new Set([".md",".markdown",".mdx"]),py=new Set([".json",".jsonc"]),my=e=>{let t=gt.extname(e).toLowerCase();return ml[t]?ml[t]:uy.has(t)?"text/markdown":py.has(t)?"application/json":"text/plain"},yl=async(e,t)=>{let r=As(e),n=t?.trim()?U(t):r;if(!Nn(r,n))return{ok:!1,path:n,rootPath:r,message:"\u53EA\u80FD\u8BFB\u53D6\u8BE5\u5DE5\u4F5C\u7AD9 workspace \u5185\u7684\u6587\u4EF6\u3002"};try{let o=await mt(n);if(!o.isFile())return{ok:!1,path:n,rootPath:r,message:"\u5F53\u524D\u8DEF\u5F84\u4E0D\u662F\u6587\u4EF6\u3002"};if(o.size>dy)return{ok:!1,path:n,rootPath:r,sizeBytes:o.size,message:"\u6587\u4EF6\u8FC7\u5927\uFF0C\u6682\u4E0D\u652F\u6301\u9884\u89C8\u3002"};let s=await iy(n),i=my(n),a=i.startsWith("image/");return!a&&s.includes(0)?{ok:!1,path:n,rootPath:r,contentType:i,sizeBytes:o.size,message:"\u6682\u4E0D\u652F\u6301\u9884\u89C8\u4E8C\u8FDB\u5236\u6587\u4EF6\u3002"}:{ok:!0,path:n,rootPath:r,content:a?s.toString("base64"):s.toString("utf8"),contentType:i,encoding:a?"base64":"utf8",sizeBytes:o.size,truncated:!1}}catch(o){return{ok:!1,path:n,rootPath:r,message:o instanceof Error?o.message:"\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25\u3002"}}},kl=async(e,t,r)=>{let n=As(e),o=t?.trim()?U(t):n;if(!Nn(n,o))return{ok:!1,path:o,rootPath:n,message:"\u53EA\u80FD\u5199\u5165\u8BE5\u5DE5\u4F5C\u7AD9 workspace \u5185\u7684\u6587\u4EF6\u3002"};try{await gl(gt.dirname(o),{recursive:!0});let s=await mt(o).catch(()=>null);if(s&&!s.isFile())return{ok:!1,path:o,rootPath:n,message:"\u5F53\u524D\u8DEF\u5F84\u4E0D\u662F\u6587\u4EF6\u3002"};await cy(o,r,"utf8");let i=await mt(o);return{ok:!0,path:o,rootPath:n,sizeBytes:i.size,message:"\u6587\u4EF6\u5DF2\u5199\u5165\u3002"}}catch(s){return{ok:!1,path:o,rootPath:n,message:s instanceof Error?s.message:"\u5199\u5165\u6587\u4EF6\u5931\u8D25\u3002"}}},wl=async(e,t,r,n)=>{let o=U(e),s=$e({taskId:`repo-branches-${Buffer.from(o).toString("base64url").slice(0,24)}`,identity:n??{mode:"personal"},repoUrl:t});console.log("[worker] [repo-branches] snapshot starting",JSON.stringify({localPath:o,repoUrl:t,preferredBranch:r}));try{if(await pl(o,t,s.env)){let l=await pt(o,r,s.env);return console.log("[worker] [repo-branches] local-only snapshot resolved",JSON.stringify({localPath:o,branchCount:l.branches.length,defaultBranch:l.defaultBranch})),{ok:!0,branches:l.branches,defaultBranch:l.defaultBranch,currentBranch:l.currentBranch}}let i=await Kt(o,t,r,s.env),a=Vt({branches:i.branches,defaultBranch:i.defaultBranch,preferredBranch:r});if(!i.branches.includes(a))return{ok:!1,branches:[],defaultBranch:i.defaultBranch,message:i.branches.length>0?`\u8D77\u59CB\u5206\u652F ${a} \u4E0D\u5B58\u5728\u3002\u5F53\u524D\u4ED3\u5E93\u5206\u652F\uFF1A${i.branches.join(", ")}`:`\u8D77\u59CB\u5206\u652F ${a} \u4E0D\u5B58\u5728\u3002`};await Jt({repoPath:o,remoteTarget:i.remoteTarget,startPoint:a,env:s.env}),console.log("[worker] [repo-branches] remote snapshot resolved",JSON.stringify({localPath:o,remoteTarget:i.remoteTarget,branchCount:i.branches.length,defaultBranch:i.defaultBranch}));let c=await pt(o,r,s.env).then(l=>l.currentBranch).catch(()=>i.currentBranch);return{ok:!0,branches:i.branches,defaultBranch:i.defaultBranch,currentBranch:c}}catch(i){let a=te(i,t);console.log("[worker] [repo-branches] remote snapshot failed",JSON.stringify({localPath:o,error:a instanceof Error?a.message:"unknown"}));try{if(!(await mt(o)).isDirectory())return{ok:!1,branches:[],defaultBranch:oe(r??"")||Re,message:a instanceof Error?a.message:"\u8BFB\u53D6\u5206\u652F\u5217\u8868\u5931\u8D25\u3002"};if(!await ie(o,s.env).checkIsRepo())return console.log("[worker] [repo-branches] fallback skipped: path is not repo",JSON.stringify({localPath:o})),{ok:!1,branches:[],defaultBranch:oe(r??"")||Re,message:a instanceof Error?a.message:"\u8BFB\u53D6\u5206\u652F\u5217\u8868\u5931\u8D25\u3002"};let d=await pt(o,r,s.env);return console.log("[worker] [repo-branches] local fallback resolved",JSON.stringify({localPath:o,branchCount:d.branches.length,defaultBranch:d.defaultBranch})),{ok:!0,branches:d.branches,defaultBranch:d.defaultBranch,currentBranch:d.currentBranch}}catch(c){let l=te(c,t);console.log("[worker] [repo-branches] local fallback failed",JSON.stringify({localPath:o,error:l instanceof Error?l.message:"unknown"}))}return{ok:!1,branches:[],defaultBranch:oe(r??"")||Re,message:a instanceof Error?a.message:"\u8BFB\u53D6\u5206\u652F\u5217\u8868\u5931\u8D25\u3002"}}finally{s.cleanup()}};import{readdir as Sl,readFile as Ms,stat as Cl}from"node:fs/promises";import Os from"node:os";import Ae from"node:path";var xl=e=>(e??"").trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||null;var gy=["skills",".agents/skills",".codex/skills",".claude/skills",".cursor/skills",".opencode/skills",".pi/skills"],fy=["~/.claude/skills","~/.agents/skills","~/.codex/skills","~/.config/opencode/skills","~/.pi/skills"],hy=new Set([".md",".txt",".json",".yml",".yaml",".ts",".tsx",".js",".jsx",".mjs",".cjs",".sh",".py",".rb"]),yy=e=>{let t=e.trim();return t?t==="~"?Os.homedir():t.startsWith("~/")?Ae.join(Os.homedir(),t.slice(2)):t:""},_s=e=>Ae.resolve(yy(e)),ky=e=>{let t=e.match(/^---\n([\s\S]*?)\n---/);if(!t)return{};let r={};for(let n of t[1].split(`
84
+ `)){let[o,...s]=n.split(":"),i=o.trim().toLowerCase(),a=s.join(":").trim().replace(/^"|"$/g,"");a&&(i==="name"&&(r.name=a),i==="description"&&(r.description=a))}return r},wy=(e,t)=>{let r=ky(e);if(r.name?.trim())return{name:r.name.trim(),description:r.description?.trim()||null};let n=e.match(/^#\s+(.+)$/m)?.[1]?.trim();return n?{name:n,description:r.description?.trim()||null}:{name:Ae.basename(t),description:r.description?.trim()||null}},vl=e=>{let t=e.replace(/\\/g,"/");return t==="SKILL.md"?"skill":t.startsWith("references/")?"reference":t.startsWith("scripts/")?"script":t.startsWith("assets/")?"asset":"other"},xy=e=>e==="SKILL.md"?!0:hy.has(Ae.extname(e).toLowerCase()),Sy=e=>vl(e)==="asset",Cy=e=>e.some(t=>t.kind==="script")?"scripts_executables":e.some(t=>t.kind==="asset")?"assets":"markdown_only",Pl=async e=>{let t=await Sl(e,{withFileTypes:!0}).catch(()=>[]);if(t.some(n=>n.isFile()&&n.name==="SKILL.md"))return[e];let r=[];for(let n of t)!n.isDirectory()||n.name===".git"||n.name==="node_modules"||r.push(...await Pl(Ae.join(e,n.name)));return r},vy=async e=>{let t={},r=[],n=async o=>{let s=await Sl(o,{withFileTypes:!0}).catch(()=>[]);for(let i of s){let a=Ae.join(o,i.name),c=Ae.relative(e,a).replace(/\\/g,"/");if(i.isDirectory()){if(i.name===".git"||i.name==="node_modules")continue;await n(a);continue}if(r.push({path:c,kind:vl(c)}),xy(i.name)){let d=await Ms(a,"utf8").catch(()=>null);typeof d=="string"&&(t[c]={encoding:"utf8",content:d});continue}if(!Sy(c))continue;let l=await Ms(a).catch(()=>null);l&&(t[c]={encoding:"base64",content:l.toString("base64")})}};return await n(e),{files:t,inventory:r.sort((o,s)=>o.path.localeCompare(s.path))}},Py=async e=>{let t=await Ms(Ae.join(e,"SKILL.md"),"utf8").catch(()=>null);if(!t?.trim())return{warning:`\u8DF3\u8FC7 ${e}\uFF1ASKILL.md \u4E3A\u7A7A\u6216\u65E0\u6CD5\u8BFB\u53D6\u3002`};let r=wy(t,e),{files:n,inventory:o}=await vy(e);return{skill:{name:r.name,slug:xl(r.name)??Ae.basename(e),description:r.description,markdown:t,sourceLocator:e,trustLevel:Cy(o),fileInventory:o,files:n}}},Il=async e=>{let t=[],r=[],n=[];for(let o of e){let s=_s(o);if(!(t.includes(s)||(t.push(s),!await Cl(s).then(a=>a.isDirectory()).catch(()=>!1))))for(let a of await Pl(s)){let{skill:c,warning:l}=await Py(a);if(l){n.push(l);continue}c&&r.push(c)}}return r.sort((o,s)=>o.slug.localeCompare(s.slug)||o.sourceLocator.localeCompare(s.sourceLocator)),{scannedRoots:t,packages:r,warnings:n}},Iy=async(e,t)=>{let r=_s(t);try{if(!(await Cl(r)).isDirectory())return{ok:!1,scanMode:"project",rootPath:r,scannedRoots:[r],packages:[],warnings:[],message:"\u5F53\u524D\u8DEF\u5F84\u4E0D\u662F\u76EE\u5F55\u3002"}}catch{return{ok:!1,scanMode:"project",rootPath:r,scannedRoots:[r],packages:[],warnings:[],message:"\u76EE\u5F55\u4E0D\u5B58\u5728\u3002"}}let{scannedRoots:n,packages:o,warnings:s}=await Il(gy.map(i=>Ae.join(r,i)));return{ok:!0,scanMode:"project",rootPath:r,scannedRoots:n,packages:o,warnings:s,message:o.length>0?`\u5171\u53D1\u73B0 ${o.length} \u4E2A\u6280\u80FD\u5305\u3002`:"\u672A\u53D1\u73B0 SKILL.md\u3002"}},Ey=async()=>{let e=_s(Os.homedir()),{scannedRoots:t,packages:r,warnings:n}=await Il([...fy]);return{ok:!0,scanMode:"global",rootPath:e,scannedRoots:t,packages:r,warnings:n,message:r.length>0?`\u5171\u53D1\u73B0 ${r.length} \u4E2A\u6280\u80FD\u5305\u3002`:"\u672A\u53D1\u73B0\u5168\u5C40 SKILL.md\u3002"}},El=async e=>e.scanMode==="global"?Ey():Iy(e.workspaceRoot,e.rootPath||e.workspaceRoot);import{createHash as Ay}from"node:crypto";import{existsSync as Bs,mkdirSync as $n,rmSync as My}from"node:fs";import{stat as Oy}from"node:fs/promises";import Er from"node:path";import{simpleGit as _y}from"simple-git";import{mkdirSync as by,writeFileSync as Ty}from"node:fs";import Un from"node:path";var Ry=(e,t)=>{if(!za(t))throw new Error(`\u8FD0\u884C\u65F6\u73AF\u5883\u53D8\u91CF\u6587\u4EF6\u540D\u4E0D\u5408\u6CD5\uFF1A${t}`);let r=Un.resolve(e,t),n=Un.relative(e,r);if(n.startsWith("..")||Un.isAbsolute(n))throw new Error(`\u8FD0\u884C\u65F6\u73AF\u5883\u53D8\u91CF\u6587\u4EF6\u5FC5\u987B\u4F4D\u4E8E\u5DE5\u4F5C\u76EE\u5F55\u5185\uFF1A${t}`);return r},Xe=(e,t)=>{if(t&&t.mode==="env-file"){let r=t.fileName?.trim();if(!r)throw new Error("\u73AF\u5883\u53D8\u91CF\u6587\u4EF6\u6A21\u5F0F\u7F3A\u5C11\u6587\u4EF6\u540D\u3002");let n=Ry(e,r);by(Un.dirname(n),{recursive:!0}),Ty(n,`${t.fileContent??""}${t.fileContent?`
85
+ `:""}`,"utf8")}},Ir=(e,t)=>!t||t.mode!=="process-env"?{...e??process.env}:{...e??process.env,...t.variables??{}};var Tl=e=>e==="original-dir"?"original-dir":"worktree",By=e=>e?.mode==="env-file"?e:void 0,Wy=e=>e.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"repo",Dy=e=>Ay("sha1").update(e).digest("hex").slice(0,12),Rl=(e,t)=>{let r=t?Er.basename(t).replace(/\.git$/i,""):"repo";return Er.join(U(e),"repos",`${Wy(r)}-${Dy(t||r)}`)},Ny=e=>{let t=[e.repoPath?.trim(),e.worktreePath.trim()].filter(n=>!!n).map(n=>U(n));return t.find(n=>Bs(n))||t[0]||U(e.worktreePath)},Uy=async e=>{let t=await Oy(e.repoPath).catch(()=>null);if(t){if(!t.isDirectory())return{ok:!1,message:`\u76EE\u6807\u8DEF\u5F84\u4E0D\u662F\u76EE\u5F55\uFF1A${e.repoPath}`,worktreePath:e.repoPath}}else if(e.repoUrl?.trim()){let s=await Kt(e.repoPath,e.repoUrl,e.preferredBranch,e.env),i=Vt({branches:s.branches,defaultBranch:s.defaultBranch,preferredBranch:e.preferredBranch});if(!s.branches.includes(i))return{ok:!1,message:s.branches.length>0?`\u8D77\u59CB\u5206\u652F ${i} \u4E0D\u5B58\u5728\u3002\u5F53\u524D\u4ED3\u5E93\u5206\u652F\uFF1A${s.branches.join(", ")}`:`\u8D77\u59CB\u5206\u652F ${i} \u4E0D\u5B58\u5728\u3002`,worktreePath:e.repoPath};await Jt({repoPath:e.repoPath,remoteTarget:s.remoteTarget,startPoint:i,env:e.env})}else return $n(e.repoPath,{recursive:!0}),{ok:!0,message:`\u5DF2\u51C6\u5907\u672C\u5730\u9879\u76EE\u76EE\u5F55 ${e.repoPath}\u3002`,worktreePath:e.repoPath};if(e.repoUrl?.trim()){let s=await Kt(e.repoPath,e.repoUrl,e.preferredBranch,e.env),i=Vt({branches:s.branches,defaultBranch:s.defaultBranch,preferredBranch:e.preferredBranch});if(!s.branches.includes(i))return{ok:!1,message:s.branches.length>0?`\u8D77\u59CB\u5206\u652F ${i} \u4E0D\u5B58\u5728\u3002\u5F53\u524D\u4ED3\u5E93\u5206\u652F\uFF1A${s.branches.join(", ")}`:`\u8D77\u59CB\u5206\u652F ${i} \u4E0D\u5B58\u5728\u3002`,worktreePath:e.repoPath};console.log("[worker] [worktree] preparing original directory repository",JSON.stringify({repoPath:e.repoPath,remoteTarget:s.remoteTarget,startPoint:i})),await Jt({repoPath:e.repoPath,remoteTarget:s.remoteTarget,startPoint:i,env:e.env})}let r=ie(e.repoPath,e.env);if(!Bs(e.repoPath))return $n(e.repoPath,{recursive:!0}),{ok:!0,message:`\u5DF2\u51C6\u5907\u672C\u5730\u9879\u76EE\u76EE\u5F55 ${e.repoPath}\u3002`,worktreePath:e.repoPath};if(!await r.checkIsRepo().catch(()=>!1))return{ok:!0,message:`\u5DF2\u590D\u7528\u672C\u5730\u76EE\u5F55 ${e.repoPath}\u3002\u5F53\u524D\u76EE\u5F55\u8FD8\u6CA1\u6709 Git \u4ED3\u5E93\u3002`,worktreePath:e.repoPath};if(!await r.revparse(["--verify","HEAD"]).then(s=>!!s.trim()).catch(()=>!1))return{ok:!0,message:`\u5DF2\u590D\u7528\u539F\u59CB\u76EE\u5F55 ${e.repoPath}\u3002Git \u5DF2\u521D\u59CB\u5316\u4F46\u8FD8\u6CA1\u6709\u9996\u4E2A\u63D0\u4EA4\uFF0C\u6682\u4E0D\u521B\u5EFA\u9694\u79BB worktree\u3002`,worktreePath:e.repoPath};let o=oe((await r.branchLocal()).current);return{ok:!0,message:o?`\u5DF2\u590D\u7528\u539F\u59CB\u76EE\u5F55 ${e.repoPath}\uFF0C\u5F53\u524D\u5206\u652F ${o}\u3002`:`\u5DF2\u590D\u7528\u539F\u59CB\u76EE\u5F55 ${e.repoPath}\u3002`,worktreePath:e.repoPath}},$y=async e=>{let t=await e.raw(["worktree","list","--porcelain"]),r=[],n=null;for(let o of t.split(`
86
+ `)){if(o.startsWith("worktree ")){n&&r.push(n),n={path:Er.resolve(o.slice(9).trim())};continue}o.startsWith("branch ")&&n&&(n.branch=o.slice(7).trim())}return n&&r.push(n),r},Ly=async(e,t)=>(await e.branchLocal()).all.includes(t),Al=e=>{My(e,{recursive:!0,force:!0,maxRetries:5,retryDelay:100})},Ml=async(e,t,r)=>{let n=Er.resolve(t),o=`refs/heads/${r}`;try{await e.raw(["worktree","prune"])}catch{}let i=(await $y(e)).find(a=>a.branch===o);if(i&&i.path!==n)try{await e.raw(["worktree","remove","--force",i.path])}catch{}try{await e.raw(["worktree","remove","--force",n])}catch{}if(Al(n),await Ly(e,r))try{await e.deleteLocalBranch(r,!0)}catch{}try{await e.raw(["worktree","prune"])}catch{}$n(Er.dirname(n),{recursive:!0})},bl=async e=>{let t=ie(e.repoPath,e.env);if(!await t.checkIsRepo().catch(()=>!1))return{ok:!1,message:`\u76EE\u6807\u76EE\u5F55\u4E0D\u662F\u6709\u6548 Git \u4ED3\u5E93\uFF1A${e.repoPath}`,worktreePath:e.worktreePath};let r=await pt(e.repoPath,e.preferredBranch,e.env),n=oe(e.preferredBranch??"")||r.defaultBranch,o=r.branches.includes(n)?n:r.defaultBranch;return r.branches.includes(o)?(console.log("[worker] [worktree] local repo creating worktree",JSON.stringify({repoPath:e.repoPath,worktreePath:e.worktreePath,branchName:e.branchName,startPoint:o})),await Ml(t,e.worktreePath,e.branchName),await t.raw(["worktree","add","--force","-B",e.branchName,e.worktreePath,o]),{ok:!0,message:`\u5DF2\u57FA\u4E8E ${o} \u521B\u5EFA worktree ${e.worktreePath} \u5E76\u5207\u51FA\u5206\u652F ${e.branchName}\u3002`,worktreePath:e.worktreePath}):{ok:!1,message:r.branches.length>0?`\u8D77\u59CB\u5206\u652F ${o} \u4E0D\u5B58\u5728\u3002\u5F53\u524D\u4ED3\u5E93\u5206\u652F\uFF1A${r.branches.join(", ")}`:`\u8D77\u59CB\u5206\u652F ${o} \u4E0D\u5B58\u5728\u3002`,worktreePath:e.worktreePath}},Ol=async e=>{let t=Tl(e.workingDirectoryMode),r=ae(e.workspaceRoot,e.worktreePath)||U(e.worktreePath),n=e.repoPath?.trim()?ae(e.workspaceRoot,e.repoPath)||U(e.repoPath):t==="original-dir"?r:U(Rl(e.workspaceRoot,e.repoUrl)),o=$e({taskId:`worktree-${Buffer.from(r).toString("base64url").slice(0,24)}`,identity:e.gitIdentity??{mode:"personal"},repoUrl:e.repoUrl}),s=a=>{if(!a.ok)return a;let c=a.worktreePath?.trim();if(!c)return{...a,ok:!1,message:"\u9879\u76EE\u76EE\u5F55\u51C6\u5907\u5931\u8D25\uFF1A\u7F3A\u5C11\u5DE5\u4F5C\u76EE\u5F55\u8DEF\u5F84\u3002"};try{return Xe(c,By(e.runtimeEnvironment)),a}catch(l){return{ok:!1,message:l instanceof Error?`\u9879\u76EE\u76EE\u5F55\u51C6\u5907\u5931\u8D25\uFF1A${l.message}`:"\u9879\u76EE\u76EE\u5F55\u51C6\u5907\u5931\u8D25\u3002",worktreePath:c}}},i=o.env;if(console.log("[worker] [worktree] ensure worktree starting",JSON.stringify({worktreePath:r,repoPath:n,branchName:e.branchName,preferredBranch:e.preferredBranch,workingDirectoryMode:t})),t==="original-dir"){let a=Ny({repoPath:n,worktreePath:r});try{let c=await Uy({repoPath:a,repoUrl:e.repoUrl,preferredBranch:e.preferredBranch,branchName:e.branchName,env:i});return s(c)}catch(c){let l=te(c,e.repoUrl);return{ok:!1,message:l instanceof Error?l.message:"\u539F\u59CB\u76EE\u5F55\u51C6\u5907\u5931\u8D25\u3002",worktreePath:n}}finally{o.cleanup()}}if(!e.repoPath?.trim()&&!e.repoUrl?.trim())return $n(r,{recursive:!0}),s({ok:!0,message:`\u5DF2\u51C6\u5907\u9879\u76EE\u76EE\u5F55 ${r}\u3002`,worktreePath:r});if(!e.repoUrl?.trim())try{let a=await bl({repoPath:n,worktreePath:r,branchName:e.branchName,preferredBranch:e.preferredBranch,env:i});return s(a)}catch(a){let c=te(a,e.repoUrl);return{ok:!1,message:c instanceof Error?c.message:"\u521B\u5EFA worktree \u5931\u8D25\u3002",worktreePath:r}}finally{o.cleanup()}try{let a=await Kt(n,e.repoUrl,e.preferredBranch,i),c=oe(e.preferredBranch??"")||a.defaultBranch,l=Vt({branches:a.branches,defaultBranch:a.defaultBranch,preferredBranch:e.preferredBranch});if(!a.branches.includes(l))return console.log("[worker] [worktree] ensure worktree skipped: branch not found",JSON.stringify({startPoint:l,availableBranches:a.branches})),{ok:!1,message:a.branches.length>0?`\u8D77\u59CB\u5206\u652F ${l} \u4E0D\u5B58\u5728\u3002\u5F53\u524D\u4ED3\u5E93\u5206\u652F\uFF1A${a.branches.join(", ")}`:`\u8D77\u59CB\u5206\u652F ${l} \u4E0D\u5B58\u5728\u3002`};console.log("[worker] [worktree] resolved remote start point",JSON.stringify({repoPath:n,remoteTarget:a.remoteTarget,requestedStartPoint:c,startPoint:l})),await Jt({repoPath:n,remoteTarget:a.remoteTarget,startPoint:l,env:i});let d=ie(n,i),p=`refs/remotes/origin/${l}`;return console.log("[worker] [worktree] creating fresh worktree",JSON.stringify({worktreePath:r,branchName:e.branchName,startPoint:l,startPointRef:p})),await Ml(d,r,e.branchName),await d.raw(["worktree","add","--force","-B",e.branchName,r,p]),console.log("[worker] [worktree] worktree created",JSON.stringify({worktreePath:r,branchName:e.branchName,startPoint:l,startPointRef:p})),s({ok:!0,message:`\u5DF2\u57FA\u4E8E ${l} \u521B\u5EFA worktree ${r} \u5E76\u5207\u51FA\u5206\u652F ${e.branchName}\u3002`,worktreePath:r})}catch(a){let c=te(a,e.repoUrl);console.log("[worker] [worktree] remote prepare failed",JSON.stringify({worktreePath:r,repoPath:n,error:c instanceof Error?c.message:"unknown"}));try{let l=await bl({repoPath:n,worktreePath:r,branchName:e.branchName,preferredBranch:e.preferredBranch,env:i});return s(l)}catch(l){let d=te(l,e.repoUrl);return console.log("[worker] [worktree] ensure worktree failed",JSON.stringify({worktreePath:r,error:d instanceof Error?d.message:"unknown"})),{ok:!1,message:d instanceof Error?d.message:"\u521B\u5EFA worktree \u5931\u8D25\u3002",worktreePath:r}}}finally{o.cleanup()}},_l=async e=>{let t=Tl(e.workingDirectoryMode),r=U(e.worktreePath),n=U(e.repoPath?.trim()||Rl(e.workspaceRoot,e.repoUrl));if(console.log("[worker] [worktree] cleanup worktree starting",JSON.stringify({worktreePath:r,repoPath:n,workingDirectoryMode:t})),t==="original-dir")return{ok:!0,message:`\u539F\u59CB\u76EE\u5F55\u6A21\u5F0F\u65E0\u9700\u6E05\u7406 worktree\uFF0C\u4FDD\u7559\u9879\u76EE\u76EE\u5F55 ${n}\u3002`,worktreePath:n};if(!e.repoPath?.trim()&&!e.repoUrl?.trim())return{ok:!0,message:`\u5F53\u524D\u76EE\u5F55\u9879\u76EE\u65E0\u9700\u6E05\u7406 worktree\uFF1A${r}\u3002`,worktreePath:r};try{if(Bs(n)){let o=_y(n);if(await o.checkIsRepo()){try{console.log("[worker] [worktree] removing worktree via git",JSON.stringify({worktreePath:r})),await o.raw(["worktree","remove","--force",r])}catch{console.log("[worker] [worktree] git worktree remove failed, falling through to local cleanup",JSON.stringify({worktreePath:r}))}try{await o.raw(["worktree","prune"])}catch{console.log("[worker] [worktree] git worktree prune failed, ignoring",JSON.stringify({worktreePath:r}))}}}return console.log("[worker] [worktree] removing worktree path",JSON.stringify({worktreePath:r})),Al(r),console.log("[worker] [worktree] cleanup worktree done",JSON.stringify({worktreePath:r})),{ok:!0,message:`\u5DF2\u6E05\u7406 worktree ${r}\u3002`,worktreePath:r}}catch(o){return console.log("[worker] [worktree] cleanup worktree failed",JSON.stringify({worktreePath:r,error:o instanceof Error?o.message:"unknown"})),{ok:!1,message:o instanceof Error?o.message:"\u6E05\u7406 worktree \u5931\u8D25\u3002",worktreePath:r}}};var Bl="[worker][terminal]",jy=["1","true","yes","on"].includes(process.env.VIBEMUX_TERMINAL_DEBUG?.trim().toLowerCase()||""),Wl=e=>typeof e!="string"?e:e.trim().replace(/\s+/g," ").slice(0,160),Fy=e=>{if(e)return Object.fromEntries(Object.entries(e).map(([t,r])=>t==="command"||t==="preview"?[t,Wl(r)]:t==="stdout"||t==="stderr"?[t,Wl(r)]:[t,r]))},qy=(e,t)=>{if(!jy)return;let r=Fy(t);if(r){console.info(`${Bl} ${e}`,r);return}console.info(`${Bl} ${e}`)},br=e=>`prompt:${e}`,Ws=e=>e.workingDirectoryMode==="original-dir"?"original-dir":"worktree",Ln=qy;var zy=async(e,t=5e3)=>{let r=Date.now(),n=new AbortController,o=setTimeout(()=>{n.abort()},Math.max(500,t));try{let s=await fetch(e,{method:"GET",redirect:"follow",signal:n.signal,headers:{accept:"text/html,application/json;q=0.9,*/*;q=0.8"}});return await s.body?.cancel().catch(()=>{}),{ok:!0,reachable:!0,url:e,statusCode:s.status,finalUrl:s.url||e,responseTimeMs:Date.now()-r,at:new Date().toISOString()}}catch(s){let i=s instanceof Error?s.name==="AbortError"?`timed out after ${t}ms`:s.message:"environment probe failed";return{ok:!1,reachable:!1,url:e,error:i,responseTimeMs:Date.now()-r,at:new Date().toISOString()}}finally{clearTimeout(o)}},Dl=(e,t)=>{let r=t.getConfig(),n=()=>(r=T(),t.setConfig(r),r);if(e.type==="executor.latency.ping"){if(!r.executorId||e.executorId!==r.executorId)return!0;let o=new Date().toISOString();return t.send({type:"executor.latency.pong",executorId:r.executorId,requestId:e.requestId,sentAt:e.sentAt,receivedAt:o,respondedAt:new Date().toISOString()}),!0}if(e.type==="executor.repo-probe.request")return n(),fl(e.localPath).then(o=>{t.send({type:"executor.repo-probe.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0;if(e.type==="executor.git.pat.verify.request")return n(),$c(e.patToken,e.provider,e.host).then(o=>{t.send({type:"executor.git.pat.verify.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0;if(e.type==="executor.doctor.request")return n(),Bt().then(o=>{t.send({type:"executor.doctor.response",executorId:r.executorId,requestId:e.requestId,doctor:o,at:new Date().toISOString()})}),!0;if(e.type==="executor.directory-browse.request"){n();let o=ae(r.workspaceRoot,e.rootPath||r.workspaceRoot)||r.workspaceRoot,s=ae(r.workspaceRoot,e.directoryPath);return hl(o,s).then(i=>{t.send({type:"executor.directory-browse.response",executorId:r.executorId,requestId:e.requestId,result:i,at:new Date().toISOString()})}),!0}if(e.type==="executor.file-read.request"){n();let o=ae(r.workspaceRoot,e.rootPath||r.workspaceRoot)||r.workspaceRoot,s=ae(r.workspaceRoot,e.filePath)||e.filePath;return yl(o,s).then(i=>{t.send({type:"executor.file-read.response",executorId:r.executorId,requestId:e.requestId,result:i,at:new Date().toISOString()})}),!0}if(e.type==="executor.file-write.request"){n();let o=ae(r.workspaceRoot,e.rootPath||r.workspaceRoot)||r.workspaceRoot,s=ae(r.workspaceRoot,e.filePath)||e.filePath;return kl(o,s,e.content).then(i=>{t.send({type:"executor.file-write.response",executorId:r.executorId,requestId:e.requestId,result:i,at:new Date().toISOString()})}),!0}return e.type==="executor.http.probe.request"?(n(),zy(e.url,e.timeoutMs).then(o=>{t.send({type:"executor.http.probe.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.agent.workdir.request"?(n(),Promise.resolve().then(()=>{if(e.action==="ensure"){let o=zc(e.agentId);return{ok:!0,workdir:o.summary,files:o.files,message:"Agent \u5DE5\u4F5C\u76EE\u5F55\u5DF2\u521D\u59CB\u5316\u3002"}}if(e.action==="rescan"){let o=zt(e.agentId,!0);return{ok:!0,workdir:o.summary,files:o.files,message:"Agent \u5DE5\u4F5C\u76EE\u5F55\u7D22\u5F15\u5DF2\u5237\u65B0\u3002"}}if(e.action==="cleanup")return{ok:!0,workdir:Vc(e.agentId),files:zt(e.agentId).files,message:"\u5DF2\u6E05\u7406 Agent \u7CFB\u7EDF\u4E34\u65F6\u76EE\u5F55\u3002"};if(e.action==="delete"){let o=Jc(e.agentId,e.relativePath||"");return{ok:!0,workdir:o.summary,files:o.files,message:"\u6587\u4EF6\u5DF2\u5220\u9664\u3002"}}if(e.action==="list"){let o=zt(e.agentId,e.refresh===!0);return{ok:!0,workdir:o.summary,files:o.files}}return{ok:!0,workdir:Sr(e.agentId),files:zt(e.agentId).files}}).catch(o=>({ok:!1,workdir:Sr(e.agentId),files:zt(e.agentId).files,message:o instanceof Error?o.message:"Agent \u5DE5\u4F5C\u76EE\u5F55\u8BF7\u6C42\u5931\u8D25\u3002"})).then(o=>{t.send({type:"executor.agent.workdir.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.agent.workdir.download.request"?(n(),Promise.resolve().then(()=>{let o=On(e.agentId,e.relativePath);return{ok:!0,relativePath:o.relativePath,filename:Gy(o.relativePath),contentBase64:Hy(o.absolutePath).toString("base64")}}).catch(o=>({ok:!1,relativePath:e.relativePath,message:o instanceof Error?o.message:"Agent \u5DE5\u4F5C\u76EE\u5F55\u6587\u4EF6\u4E0B\u8F7D\u5931\u8D25\u3002"})).then(o=>{t.send({type:"executor.agent.workdir.download.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.agent.workdir.read.request"?(n(),Promise.resolve().then(()=>Xc(e.agentId,e.relativePath)).catch(o=>({ok:!1,relativePath:e.relativePath,message:o instanceof Error?o.message:"Agent \u5DE5\u4F5C\u76EE\u5F55\u6587\u4EF6\u9884\u89C8\u5931\u8D25\u3002"})).then(o=>{t.send({type:"executor.agent.workdir.read.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.agent-sessions.list.request"?(n(),Promise.resolve().then(()=>yn()).catch(o=>({ok:!1,sessions:[],counts:{claude:0,opencode:0,codex:0,pi:0},message:o instanceof Error?o.message:"\u8BFB\u53D6\u672C\u5730 Agent \u4F1A\u8BDD\u5931\u8D25\u3002"})).then(o=>{t.send({type:"executor.agent-sessions.list.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.agent-sessions.read.request"?(n(),Promise.resolve().then(()=>{let o=kn(e.source,e.sessionId);return o?{ok:!0,session:o}:{ok:!1,message:"\u4F1A\u8BDD\u4E0D\u5B58\u5728\u6216\u5DF2\u4E0D\u53EF\u8BFB\u3002"}}).catch(o=>({ok:!1,message:o instanceof Error?o.message:"\u8BFB\u53D6\u672C\u5730 Agent \u4F1A\u8BDD\u8BE6\u60C5\u5931\u8D25\u3002"})).then(o=>{t.send({type:"executor.agent-sessions.read.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.skills.scan.request"?(n(),El({workspaceRoot:r.workspaceRoot,scanMode:e.scanMode,rootPath:e.rootPath}).then(o=>{t.send({type:"executor.skills.scan.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.repo-branches.request"?(n(),console.log("[worker] [repo-branches] request received",JSON.stringify({requestId:e.requestId,executorId:r.executorId,localPath:e.localPath,repoUrl:e.repoUrl,preferredBranch:e.preferredBranch})),wl(e.localPath,e.repoUrl,e.preferredBranch,e.gitIdentity).then(o=>{console.log("[worker] [repo-branches] request resolved",JSON.stringify({requestId:e.requestId,executorId:r.executorId,ok:o.ok,branchCount:o.branches.length,defaultBranch:o.defaultBranch,message:o.message})),t.send({type:"executor.repo-branches.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.git.checkout.request"?(n(),ll({worktreePath:e.worktreePath,repoUrl:e.repoUrl,branchName:e.branchName,gitIdentity:e.gitIdentity}).then(o=>{t.send({type:"executor.git.checkout.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.git.diff.request"?(n(),nl({worktreePath:e.worktreePath,repoUrl:e.repoUrl,baseBranch:e.baseBranch,gitIdentity:e.gitIdentity}).then(o=>{t.send({type:"executor.git.diff.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.git.working-tree-diff.request"?(n(),ol({worktreePath:e.worktreePath,repoUrl:e.repoUrl,gitIdentity:e.gitIdentity}).then(o=>{t.send({type:"executor.git.working-tree-diff.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.git.commit-diff.request"?(n(),sl({worktreePath:e.worktreePath,repoUrl:e.repoUrl,commitSha:e.commitSha,gitIdentity:e.gitIdentity}).then(o=>{t.send({type:"executor.git.commit-diff.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.git.rebase.request"?(n(),il({worktreePath:e.worktreePath,repoUrl:e.repoUrl,baseBranch:e.baseBranch,gitIdentity:e.gitIdentity}).then(o=>{t.send({type:"executor.git.rebase.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.git.graph.request"?(n(),al({worktreePath:e.worktreePath,repoUrl:e.repoUrl,baseBranch:e.baseBranch,limit:e.limit,gitIdentity:e.gitIdentity}).then(o=>{t.send({type:"executor.git.graph.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.git.push.request"?(n(),cl({worktreePath:e.worktreePath,repoUrl:e.repoUrl,branchName:e.branchName,gitIdentity:e.gitIdentity}).then(o=>{t.send({type:"executor.git.push.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.git.pull-request.request"?(n(),dl({worktreePath:e.worktreePath,repoUrl:e.repoUrl,title:e.title,body:e.body,baseBranch:e.baseBranch,compareBranch:e.compareBranch,gitIdentity:e.gitIdentity}).then(o=>{t.send({type:"executor.git.pull-request.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.worktree.ensure.request"?(n(),Ol({workspaceRoot:r.workspaceRoot,repoPath:e.repoPath,repoUrl:e.repoUrl,preferredBranch:e.preferredBranch,branchName:e.branchName,worktreePath:e.worktreePath,gitIdentity:e.gitIdentity,workingDirectoryMode:Ws(e),runtimeEnvironment:e.runtimeEnvironment}).then(o=>{t.send({type:"executor.worktree.ensure.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.worktree.cleanup.request"?(n(),_l({workspaceRoot:r.workspaceRoot,repoPath:e.repoPath,repoUrl:e.repoUrl,worktreePath:e.worktreePath,workingDirectoryMode:Ws(e)}).then(o=>{t.send({type:"executor.worktree.cleanup.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.browser.run.request"?(n(),r.executorToken?.trim()?(dn({cloudUrl:r.cloudUrl,executorToken:r.executorToken,taskId:e.taskId,workspaceId:e.workspaceId,workspaceSessionId:e.workspaceSessionId,cwd:e.cwd,appUrl:e.appUrl,healthUrl:e.healthUrl,goal:e.goal,mode:e.mode}).then(o=>{t.send({type:"executor.browser.run.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):(t.send({type:"executor.browser.run.response",executorId:r.executorId,requestId:e.requestId,result:{ok:!1,message:"\u5F53\u524D worker \u672A\u5B8C\u6210\u914D\u5BF9\uFF0C\u7F3A\u5C11 executor token\u3002",summary:"\u5F53\u524D worker \u672A\u5B8C\u6210\u914D\u5BF9\uFF0C\u7F3A\u5C11 executor token\u3002",usedMode:e.mode??"playwright",finalUrl:e.appUrl,observationsCount:0,issueCount:1,at:new Date().toISOString()},at:new Date().toISOString()}),!0)):!1};var Ky=e=>{try{let t=new URL(e);return`${t.protocol}//${t.host}${t.pathname}`}catch{return"invalid-url"}},Nl=(e,t)=>{let r=t.getConfig();return e.type==="preview.tunnel.open"?(console.log("[preview-tunnel] control open received",{previewSessionId:e.previewSessionId,executorId:r.executorId,tunnelUrl:Ky(e.tunnelUrl),targetUrl:e.targetUrl}),jt.open(e,r,t.send),!0):e.type==="preview.tunnel.close"?(console.log("[preview-tunnel] control close received",{previewSessionId:e.previewSessionId,executorId:r.executorId}),jt.close(e.previewSessionId,"closed by control plane"),!0):!1};import{stat as ux}from"node:fs/promises";import{randomUUID as Ds}from"node:crypto";import{spawn as Xy}from"node:child_process";import{existsSync as Tr}from"node:fs";import Vy from"node:path";var Jy=()=>{let e=qr(),t=sr();if(Tr(t))return{launcherPath:Tr(e)?e:void 0,runnerPath:process.execPath,entryPath:t};let r=se("tsx"),n=Vy.join(ce(),"apps","worker","src","index.ts");return r&&Tr(n)?{launcherPath:Tr(e)?e:void 0,runnerPath:r,entryPath:n}:{launcherPath:Tr(e)?e:void 0,runnerPath:void 0,entryPath:void 0}},Xt=()=>{let e=Jy();return{...process.env,...e.launcherPath?{VIBEMUX_WORKER_LAUNCHER:e.launcherPath}:{},...e.runnerPath?{VIBEMUX_WORKER_RUNNER:e.runnerPath}:{},...e.entryPath?{VIBEMUX_WORKER_ENTRY:e.entryPath}:{}}};var Yy=new Set(["Glob","Grep","LS","NotebookRead","Read","Task","TodoRead"]),Qy=new Set(["Edit","MultiEdit","TodoWrite","Write"]),Zy=e=>e.split("(")[0]?.trim()||e.trim(),ek=e=>e?.planMode?"plan":e?.permissionMode??"bypassPermissions",tk=e=>e==="bypassPermissions"&&typeof process.getuid=="function"&&process.getuid()===0?"acceptEdits":e,rk=(e,t)=>{let r=Zy(t);return!!(e==="bypassPermissions"||Yy.has(r)||e==="acceptEdits"&&Qy.has(r))},Rr=(e,t)=>{e.write(`${JSON.stringify(t)}
87
+ `)},Ul=async e=>{let t=En("claude");if(!t)throw new Error("\u672A\u68C0\u6D4B\u5230 `claude` \u53EF\u6267\u884C\u6587\u4EF6\u3002");let r=e.agentSettings&&"permissionMode"in e.agentSettings?e.agentSettings:void 0,n=Oe(e.executionModel)?.providerId||"anthropic",o=Oe(r?.defaultModel)?.providerId||"anthropic",s=Ue(Ct("ClaudeCode",n,e.executionModel))??Ue(Ct("ClaudeCode",o,r?.defaultModel)),i=ek(r),a=tk(i),c=["-p","--output-format=stream-json","--input-format=stream-json","--verbose","--include-partial-messages","--replay-user-messages","--permission-mode",a,...e.runtimeArgs??[]];s&&c.push("--model",s);let l=e.resumeSessionId?.trim();return l&&c.push("--resume",l),new Promise((d,p)=>{let u=Xy(t,c,{cwd:e.cwd,env:{...Xt(),...e.runtimeEnv??{}},stdio:["pipe","pipe","pipe"]}),m="",f="",S="",w="",g="",I="",v=!1,E=new Map,F=new Map,O=()=>(w=w||`${S||"claude"}:assistant`,M("ClaudeCode",e.onEvent,{type:"message.updated",properties:{info:{id:w,role:"assistant"}}}),w),z=(x,b,A,h)=>{M("ClaudeCode",e.onEvent,{type:"message.part.updated",properties:{part:{id:b,messageID:O(),type:x,text:A},delta:h}})},D=x=>{Rr(u.stdin,{type:"control_response",response:x})},L=x=>{if(x.type!=="control_request")return;if(x.request.subtype==="hook_callback"){D({subtype:"success",request_id:x.request_id,response:{}});return}let b=x.request.tool_name,A=rk(a,b);A||M("ClaudeCode",e.onEvent,{type:"permission.updated",properties:{title:b}}),D({subtype:"success",request_id:x.request_id,response:A?{behavior:"allow",updatedInput:x.request.input}:{behavior:"deny",message:`\u5F53\u524D\u4F1A\u8BDD\u672A\u542F\u7528 ${b} \u6743\u9650\u3002`,interrupt:!1}})},j=()=>{Rr(u.stdin,{type:"control_request",request_id:Ds(),request:{subtype:"interrupt"}}),setTimeout(()=>{u.killed||u.kill("SIGTERM")},250)};e.signal?.addEventListener("abort",j,{once:!0});let J=x=>{let b=x.trim();if(!b)return;let A=xr(b);if(A?.type==="control_request"||A?.type==="control_cancel_request"){L(A);return}let h=xr(b);if(h){if(h.session_id&&(S=h.session_id),h.type==="system"&&h.subtype==="init"){M("ClaudeCode",e.onEvent,{type:"session.status",properties:{status:{type:"busy",message:"Claude Code \u4F1A\u8BDD\u5DF2\u5C31\u7EEA"}}});return}if(h.type==="stream_event"){let P=h.event,R=`${S||"claude"}:${P.index??0}`;if(P.type==="content_block_delta"&&P.delta?.type==="thinking_delta"){let y=`${F.get(R)??""}${P.delta.thinking??""}`;F.set(R,y),z("reasoning",`${R}:thinking`,y,P.delta.thinking??"");return}if(P.type==="content_block_delta"&&P.delta?.type==="text_delta"){let y=`${E.get(R)??""}${P.delta.text??""}`;E.set(R,y),g=y.trim()||g,z("text",`${R}:text`,y,P.delta.text??"");return}P.type==="content_block_start"&&P.content_block?.type==="tool_use"&&M("ClaudeCode",e.onEvent,{type:"message.part.updated",properties:{part:{id:P.content_block.id??`${R}:tool`,messageID:O(),type:"tool",tool:P.content_block.name??"tool",state:{status:"running"}}}});return}if(h.type==="assistant"){S=h.session_id??S,w=h.message?.id??O();let P=Array.isArray(h.message?.content)?h.message.content:[];for(let R of P)R.type==="text"&&R.text?.trim()&&(g=R.text.trim(),z("text",`${w}:final`,g)),R.type==="tool_use"&&M("ClaudeCode",e.onEvent,{type:"message.part.updated",properties:{part:{id:R.id??`${w}:tool`,messageID:O(),type:"tool",tool:R.name??"tool",state:{status:"running",raw:R.input?JSON.stringify(R.input,null,2):void 0}}}});return}if(h.type==="user"){let P=Array.isArray(h.message?.content)?h.message.content:[],R=P.find(y=>y.tool_use_id)?.tool_use_id;if(!R)return;M("ClaudeCode",e.onEvent,{type:"message.part.updated",properties:{part:{id:R,messageID:O(),type:"tool",tool:"tool",state:{status:"completed",output:P.find(y=>y.tool_use_id===R)?.content}}}});return}if(h.type==="result"){if(v=!h.is_error,h.result?.trim()&&(g=h.result.trim()),h.is_error){I=h.result?.trim()||"Claude Code \u6267\u884C\u5931\u8D25",M("ClaudeCode",e.onEvent,{type:"session.error",properties:{error:I}});return}M("ClaudeCode",e.onEvent,{type:"session.status",properties:{status:{type:"idle",message:"Claude Code \u5DF2\u5B8C\u6210"}}}),u.killed||u.kill("SIGTERM")}}};u.stdout.on("data",x=>{m+=x.toString();let b=m.split(`
88
+ `);m=b.pop()??"";for(let A of b)J(A)}),u.stderr.on("data",x=>{f+=x.toString()}),u.on("error",x=>{e.signal?.removeEventListener("abort",j),p(x)}),u.on("close",x=>{if(e.signal?.removeEventListener("abort",j),m.trim()&&J(m),e.signal?.aborted){p(Ie(e.signal));return}if(!v&&x!==0||I){p(new Error(I||f.trim().split(`
89
+ `).filter(Boolean).at(-1)||`Claude Code \u6267\u884C\u5931\u8D25\uFF08\u9000\u51FA\u7801 ${x??-1}\uFF09`));return}d({output:g||f.trim().split(`
90
+ `).filter(Boolean).at(-1)||"Claude Code \u672A\u8FD4\u56DE\u6587\u672C\u8F93\u51FA\u3002",sessionId:S||void 0})}),Rr(u.stdin,{type:"control_request",request_id:Ds(),request:{subtype:"initialize"}}),Rr(u.stdin,{type:"control_request",request_id:Ds(),request:{subtype:"set_permission_mode",mode:a}}),Rr(u.stdin,{type:"user",message:{role:"user",content:e.prompt}})})};import{readFileSync as jn,writeFileSync as $l}from"node:fs";import nk from"node:http";import{spawn as ok}from"node:child_process";import{once as sk}from"node:events";import Fn from"node:path";var Ll=(e,t,r)=>{let n={};return r?.reasoningEffort&&(n.model_reasoning_effort=r.reasoningEffort),r?.reasoningSummary&&(n.model_reasoning_summary=r.reasoningSummary),{model:t??null,cwd:e,approvalPolicy:r?.approval??"never",sandbox:r?.sandbox??"workspace-write",config:Object.keys(n).length>0?n:null,experimentalRawEvents:!1,persistExtendedHistory:!0}},ik=(e,t,r,n)=>{let o={};return n?.reasoningEffort&&(o.model_reasoning_effort=n.reasoningEffort),n?.reasoningSummary&&(o.model_reasoning_summary=n.reasoningSummary),{threadId:t,cwd:e,model:r??null,approvalPolicy:n?.approval??"never",sandbox:n?.sandbox??"workspace-write",config:Object.keys(o).length>0?o:null,persistExtendedHistory:!0}},ak=e=>({mode:"default",settings:{model:e,reasoning_effort:null,developer_instructions:null}}),ck=e=>e==="never"?{command:"acceptForSession",fileChange:"acceptForSession"}:{command:"decline",fileChange:"decline"},lk=e=>{let t=e instanceof Error?e.message.trim().toLowerCase():"";return t?t.includes("no rollout found for thread id")||t.includes("no thread found for id")||t.includes("thread/resume")&&t.includes("not found"):!1},dk=new Set(["codex \u6267\u884C\u5931\u8D25","codex execution failed","execution failed","request failed","unknown error"]),Qt=e=>e.split(`
91
91
  `).map(t=>t.trimEnd()).join(`
92
- `).trim(),Cl=e=>{let t=ki(e);return t?!Ey.has(t.toLowerCase()):!1},N=(e,t)=>{console.log("[worker-codex]",e,JSON.stringify(t))},je=e=>{if(e instanceof Error)return{name:e.name,message:e.message,stack:e.stack?.split(`
92
+ `).trim(),Gl=e=>{let t=Qt(e);return t?!dk.has(t.toLowerCase()):!1},N=(e,t)=>{console.log("[worker-codex]",e,JSON.stringify(t))},Le=e=>{if(e instanceof Error)return{name:e.name,message:e.message,stack:e.stack?.split(`
93
93
  `).slice(0,5).join(`
94
- `)||""};if(e==null)return e;if(typeof e=="string")return e.slice(0,240);if(Array.isArray(e))return{type:"array",length:e.length};if(typeof e!="object")return e;let t={};for(let[r,n]of Object.entries(e)){if(typeof n=="string"){t[r]=n.slice(0,240);continue}if(Array.isArray(n)){t[r]={type:"array",length:n.length};continue}if(n&&typeof n=="object"){t[r]=je(n);continue}t[r]=n}return t},Iy=e=>yi(e)||(e instanceof Error?e.message.trim():"")||"",qt=e=>e.replace(/\\/g,"\\\\").replace(/"/g,'\\"'),Pl=e=>e.split(".").map(t=>t.trim().replace(/^"(.*)"$/,"$1")).join("."),Xe=(e,t)=>`${e} = "${qt(t)}"`,by=(e,t,r)=>{if(!e.trim()||!t.trim()||!r.trim())return{content:e,changed:!1};let n="",o=!1,i=e.split(/\r?\n/).map(s=>{let c=s.trim().match(/^\[([^\]]+)\]$/);if(c)return n=Pl(c[1]??""),s;let l=s.match(/^(\s*)([A-Za-z0-9_.-]+)(\s*=\s*)["']([^"']*)["'](\s*(?:#.*)?)$/);if(!l)return s;let[,d,m,u,,p]=l;return!(n===`model_providers.${t}`)&&!(n==="")||m!=="base_url"&&m!=="openai_base_url"?s:(o=!0,`${d}${m}${u}"${qt(r)}"${p}`)});return{content:o?i.join(`
95
- `):e,changed:o}},Ry=(e,t)=>{if(!e.trim())return{content:e,changed:!1};let r=_e(t.executionModel),n=r?.providerId?.trim()||"",o=r?.modelId?.trim()||"",i=t.runtimeEnv?.OPENAI_BASE_URL?.trim()||"",s=t.runtimeEnv?.OPENAI_API_KEY?.trim()?"OPENAI_API_KEY":"";if(!n&&!o&&!i&&!s)return{content:e,changed:!1};let a=n?`model_providers.${n}`:"",c=[],l="",d=!1,m=!1,u=!1,p=!1,f=!1,x=!1,k=!1,g=!1,R=()=>{if(m)return;let E=[];o&&!u&&E.push(Xe("model",o)),n&&!p&&E.push(Xe("model_provider",n)),E.length>0&&(c.length>0&&c[c.length-1]?.trim()&&c.push(""),c.push(...E),d=!0),m=!0},C=()=>{if(!x)return;let E=[];i&&!k&&E.push(Xe("base_url",i)),s&&!g&&E.push(Xe("env_key",s)),!f&&n&&E.unshift(Xe("name",n)),E.length>0&&(c.push(...E),d=!0),x=!1};for(let E of e.split(/\r?\n/)){let O=E.trim().match(/^\[([^\]]+)\]$/);if(O){C(),R(),l=Pl(O[1]??""),l===a&&(f=!0,x=!0,k=!1,g=!1),c.push(E);continue}let H=E.match(/^(\s*)([A-Za-z0-9_.-]+)(\s*=\s*)["']([^"']*)["'](\s*(?:#.*)?)$/);if(!H){c.push(E);continue}let[,D,U,L,K,S]=H,I=l==="",A=l===a;if(I&&U==="model"&&o){u=!0,K!==o?(c.push(`${D}${U}${L}"${qt(o)}"${S}`),d=!0):c.push(E);continue}if(I&&U==="model_provider"&&n){p=!0,K!==n?(c.push(`${D}${U}${L}"${qt(n)}"${S}`),d=!0):c.push(E);continue}if(A&&U==="base_url"&&i){k=!0,K!==i?(c.push(`${D}${U}${L}"${qt(i)}"${S}`),d=!0):c.push(E);continue}if(A&&U==="env_key"&&s){g=!0,K!==s?(c.push(`${D}${U}${L}"${qt(s)}"${S}`),d=!0):c.push(E);continue}c.push(E)}return C(),R(),a&&!f&&(i||s)&&(c.length>0&&c[c.length-1]?.trim()&&c.push(""),c.push(`[model_providers.${n}]`),c.push(Xe("name",n)),i&&c.push(Xe("base_url",i)),s&&c.push(Xe("env_key",s)),d=!0),{content:d?c.join(`
96
- `):e,changed:d}},Ty=e=>{let t=e.trim();return/^https?:\/\//i.test(t)?!/^https?:\/\/(?:127\.0\.0\.1|localhost)(?::\d+)?(?:\/|$)/i.test(t):!1},Ay=async e=>{let t=[];for await(let r of e)t.push(typeof r=="string"?Buffer.from(r):r);if(t.length!==0)return Buffer.concat(t)},My=async(e,t)=>{if(!e.body){t.end();return}let r=e.body.getReader();try{for(;;){let{done:n,value:o}=await r.read();if(n)break;!o||o.byteLength===0||t.write(Buffer.from(o))||await xy(t,"drain")}t.end()}finally{r.releaseLock()}},Oy=async e=>{let t=e.trim().replace(/\/+$/,""),r=new URL(`${t}/`),n=ky.createServer(async(s,a)=>{try{let c=new URL(s.url||"/",r),l=new Headers;for(let[u,p]of Object.entries(s.headers))!p||u.toLowerCase()==="host"||u.toLowerCase()==="connection"||l.set(u,Array.isArray(p)?p.join(", "):p);let d=s.method==="GET"||s.method==="HEAD"?void 0:await Ay(s),m=await fetch(c,{method:s.method,headers:l,body:d,redirect:"manual"});if(a.statusCode=m.status,a.statusMessage=m.statusText,m.headers.forEach((u,p)=>{p.toLowerCase()==="connection"||p.toLowerCase()==="transfer-encoding"||a.setHeader(p,u)}),!m.body){a.end();return}await My(m,a)}catch(c){if(N("compatibility-proxy:error",{targetBaseUrl:t,requestUrl:s.url||"/",error:c instanceof Error?c.message:"Codex compatibility proxy failed."}),a.headersSent){a.destroy(c instanceof Error?c:new Error("Codex compatibility proxy failed."));return}a.statusCode=502,a.setHeader("Content-Type","text/plain; charset=utf-8"),a.end(c instanceof Error?c.message:"Codex compatibility proxy failed.")}}),o=await new Promise((s,a)=>{n.once("error",a),n.listen(0,"127.0.0.1",()=>{let c=n.address();if(!c||typeof c=="string"){a(new Error("Failed to allocate Codex compatibility proxy port."));return}s(c)})}),i=!1;return{proxiedBaseUrl:`http://127.0.0.1:${o.port}${r.pathname.replace(/\/$/,"")}`,close:()=>{i||(i=!0,n.close())}}},_y=async e=>{let t=e.runtimeEnv?.CODEX_HOME?.trim();if(!t)return N("launch-config:skipped",{reason:"missing-codex-home"}),null;let r=bn.join(t,"config.toml"),n=bn.join(t,"auth.json"),o="";try{o=In(r,"utf8")}catch{return N("launch-config:skipped",{reason:"config-unreadable",configPath:r}),null}let i=(()=>{try{return In(n,"utf8")}catch{return""}})(),s=o,a=Ry(o,{executionModel:e.executionModel,runtimeEnv:e.runtimeEnv});a.changed&&(s=a.content,N("launch-config:enabled",{executionModel:e.executionModel||"default",baseUrlOverride:e.runtimeEnv?.OPENAI_BASE_URL||""}));let c=ae({configContent:s,authContent:i,env:e.runtimeEnv}),l=_e(e.executionModel)?.providerId||c.providerId,d=St(s,l);d.changed&&(s=d.content,N("launch-config:provider-name-added",{providerId:l}));let m=vt(s,l,c.envKey);m.changed&&(s=m.content,N("launch-config:provider-env-key-added",{providerId:l,envKey:c.envKey}));let u=ae({configContent:s,authContent:i,env:e.runtimeEnv});N("launch-config:resolved",{providerId:u.providerId,configuredModel:u.configuredModel||"",baseUrl:u.baseUrl||"",envKey:u.envKey,hasApiToken:!!u.apiToken});let p=null;try{if(u.baseUrl&&Ty(u.baseUrl)){p=await Oy(u.baseUrl);let x=by(s,u.providerId,p.proxiedBaseUrl);x.changed?(s=x.content,N("compatibility-proxy:enabled",{providerId:u.providerId,upstreamBaseUrl:u.baseUrl,proxiedBaseUrl:p.proxiedBaseUrl})):(N("compatibility-proxy:skipped",{providerId:u.providerId,upstreamBaseUrl:u.baseUrl,reason:"config did not contain a rewritable base_url entry"}),p.close(),p=null)}if(s===o)return null;yl(r,s,"utf8");let f=!1;return{close:()=>{if(!f){f=!0;try{yl(r,o,"utf8")}finally{p?.close()}}}}}catch(f){throw p?.close(),f}},By=e=>{let t=e?.CODEX_HOME?.trim(),r=t?bn.join(t,"config.toml"):"",n=t?bn.join(t,"auth.json"):"",o=(()=>{if(!r)return"";try{return In(r,"utf8")}catch{return""}})(),i=(()=>{if(!n)return"";try{return In(n,"utf8")}catch{return""}})();return ae({configContent:o,authContent:i,env:e})},El=e=>{let t=ki(e);return t?/^reconnecting\.\.\.\s*\d+\/\d+$/i.test(t):!1},Fe=(e,t=new Set)=>{if(typeof e=="string"){let r=ki(e);if(!r)return[];try{let n=Fe(JSON.parse(r),t);return n.length>0?n:[r]}catch{return[r]}}return!e||typeof e!="object"?[]:t.has(e)?[]:(t.add(e),Array.isArray(e)?e.flatMap(r=>Fe(r,t)):Object.values(e).flatMap(r=>Fe(r,t)))},wi=e=>{let t=e.filter(Cl),r=t.find(n=>!El(n));return r||(t[0]?t[0]:e.find(Boolean)||"")},yi=e=>wi(Fe(e)),wl=e=>{let t=[...e.error?.details?Fe(e.error.details):[],...e.error?.message?Fe(e.error.message):[],...Fe(e.error)];return wi(t)||(e.status==="failed"?"Codex \u6267\u884C\u5931\u8D25":"")},Wy=(e,t,r)=>{let o=[...[...t.trim().split(`
97
- `).map(s=>s.trim()).filter(Boolean)].reverse().flatMap(s=>Fe(s)),...Fe(t)],i=wi(o);return i&&!Cl(e)?i:e||i||`Codex \u6267\u884C\u5931\u8D25\uFF08\u9000\u51FA\u7801 ${r??-1}\uFF09`},xl=(e,t,r,n)=>{M("Codex",e.onEvent,{type:"message.updated",properties:{info:{id:t,role:"assistant"}}}),M("Codex",e.onEvent,{type:"message.part.updated",properties:{part:{id:`${t}:text`,messageID:t,type:"text",text:r},delta:n}})},Sl=(e,t,r,n,o)=>{M("Codex",e.onEvent,{type:"message.part.updated",properties:{part:{id:r,messageID:t,type:"reasoning",text:n},delta:o}})},vl=(e,t,r,n,o,i)=>{let s=r.type==="fileChange"?"apply_patch":"shell",a=r.type==="commandExecution"?r.command:r.type==="fileChange"?JSON.stringify(r.changes??[],null,2):void 0;M("Codex",e.onEvent,{type:"message.part.updated",properties:{part:{id:r.id,messageID:t,type:"tool",tool:s,state:{status:n,raw:a,output:o,error:i}}}})},hi=(e,t)=>{e.stdin.write(`${JSON.stringify(t)}
98
- `)},Il=async e=>{let t=fn("codex");if(!t)throw new Error("\u672A\u68C0\u6D4B\u5230 `codex` \u53EF\u6267\u884C\u6587\u4EF6\u3002");let r=e.agentSettings&&"sandbox"in e.agentSettings?e.agentSettings:void 0,n=_e(e.executionModel)?.providerId||"openai",o=_e(r?.defaultModel)?.providerId||"openai",i=Ue(kt("Codex",n,e.executionModel))??Ue(kt("Codex",o,r?.defaultModel)),s=Cy(r?.approval),a=e.executionModel?.trim()||"",c=await _y({executionModel:a,runtimeEnv:e.runtimeEnv}),l={...Ft(),...e.runtimeEnv??{}},d=By(l);return N("launch:spawn",{cwd:e.cwd,executionModel:a||"default",selectedModel:i||"",requestedProviderId:n,defaultProviderId:o,codexHomePresent:!!l.CODEX_HOME?.trim(),runtimeArgCount:(e.runtimeArgs??[]).length,runtimeEnvKeys:Object.keys(e.runtimeEnv??{}).filter(m=>m.startsWith("OPENAI_")||m.startsWith("CODEX_")||m.startsWith("VIBEMUX_CODEX_")).sort(),runtimeHasOpenAiApiKey:!!l.OPENAI_API_KEY?.trim(),runtimeOpenAiBaseUrl:l.OPENAI_BASE_URL||"",runtimeProviderId:d.providerId,runtimeProviderEnvKey:d.envKey,runtimeHasProviderApiToken:!!d.apiToken,compatibilityProxyEnabled:!!c}),new Promise((m,u)=>{let p=wy(t,["app-server",...e.runtimeArgs??[]],{cwd:e.cwd,env:l,stdio:["pipe","pipe","pipe"]});N("launch:child-started",{pid:p.pid??null});let f=1,x="",k="",g="",R="",C="",E=!1,j="",O=new Map,H=new Map,D=new Map,U=y=>{for(let v of O.values())v.reject(y);O.clear()},L=(y,v)=>{let w=f++;return N("rpc:request",{id:w,method:y,params:je(v)}),hi(p,{jsonrpc:"2.0",id:w,method:y,params:v}),new Promise((B,de)=>{O.set(w,{method:y,resolve:mt=>B(mt),reject:de})})},K=(y,v)=>{N("rpc:response",{id:y,result:je(v)}),hi(p,{jsonrpc:"2.0",id:y,result:v})},S=()=>{p.killed||p.kill("SIGTERM")},I=()=>{S()};e.signal?.addEventListener("abort",I,{once:!0});let A=y=>{if(y.method==="item/commandExecution/requestApproval"){let v=y.params??{};s.command==="decline"&&M("Codex",e.onEvent,{type:"permission.updated",properties:{title:v.reason?.trim()||v.command?.trim()||"\u547D\u4EE4\u6267\u884C\u6743\u9650"}}),K(y.id,{decision:s.command});return}if(y.method==="item/fileChange/requestApproval"){let v=y.params??{};s.fileChange==="decline"&&M("Codex",e.onEvent,{type:"permission.updated",properties:{title:v.reason?.trim()||"\u6587\u4EF6\u4FEE\u6539\u6743\u9650"}}),K(y.id,{decision:s.fileChange});return}if(y.method==="item/tool/requestUserInput"){let v=y.params??{};M("Codex",e.onEvent,{type:"permission.updated",properties:{title:v.questions?.[0]?.header?.trim()||v.questions?.[0]?.question?.trim()||"\u7B49\u5F85\u7528\u6237\u8F93\u5165"}}),K(y.id,{answers:{}});return}K(y.id,null)},h=(y,v)=>{if(y.type==="agentMessage"){let w=y;j=w.id,H.set(w.id,w.text),w.text.trim()&&(R=w.text.trim()),xl(e,w.id,w.text);return}if(y.type==="reasoning"){let w=y,B=w.summary?.join("")||w.content?.join("")||"";B&&(D.set(w.id,B),Sl(e,j||`${g||"codex"}:assistant`,`${w.id}:reasoning`,B));return}if(y.type==="commandExecution"){let w=y,B=v==="started"?"running":w.status==="completed"?"completed":"error";vl(e,j||void 0,w,B,w.aggregatedOutput??void 0,w.status==="failed"||w.status==="declined"?w.aggregatedOutput||`\u547D\u4EE4\u5931\u8D25\uFF08\u9000\u51FA\u7801 ${w.exitCode??-1}\uFF09`:void 0);return}if(y.type==="fileChange"){let w=y,B=v==="started"?"running":w.status==="success"?"completed":"error";vl(e,j||void 0,w,B,JSON.stringify(w.changes??[],null,2),w.status==="failed"||w.status==="declined"?"\u6587\u4EF6\u4FEE\u6539\u672A\u5B8C\u6210":void 0)}},P=async y=>{if(y.method==="thread/started"){g=y.params.thread.id,N("notification:thread-started",{threadId:g});return}if(y.method==="turn/started"){let v=y.params;g=g||v.threadId,N("notification:turn-started",{threadId:v.threadId,turnId:v.turn.id}),M("Codex",e.onEvent,{type:"session.status",properties:{status:{type:"busy",message:"Codex \u6B63\u5728\u5904\u7406\u8BF7\u6C42"}}});return}if(y.method==="item/started"){h(y.params.item,"started");return}if(y.method==="item/completed"){h(y.params.item,"completed");return}if(y.method==="item/agentMessage/delta"){let v=y.params;j=v.itemId;let w=`${H.get(v.itemId)??""}${v.delta??""}`;H.set(v.itemId,w),w.trim()&&(R=w.trim()),xl(e,v.itemId,w,v.delta);return}if(y.method==="item/reasoning/textDelta"||y.method==="item/reasoning/summaryTextDelta"){let v=y.params,w=y.method==="item/reasoning/textDelta"?`content:${v.contentIndex??0}`:`summary:${v.summaryIndex??0}`,B=`${v.itemId}:reasoning:${w}`,de=`${D.get(B)??""}${v.delta??""}`;D.set(B,de),Sl(e,j||`${g||"codex"}:assistant`,B,de,v.delta);return}if(y.method==="turn/completed"){let v=y.params;g=g||v.threadId,E=v.turn.status==="completed",N("notification:turn-completed",{threadId:v.threadId,turnId:v.turn.id,status:v.turn.status,error:je(v.turn.error??null),extractedError:v.turn.status==="failed"?wl(v.turn)||"Codex \u6267\u884C\u5931\u8D25":""}),v.turn.status==="failed"?(C=wl(v.turn)||"Codex \u6267\u884C\u5931\u8D25",M("Codex",e.onEvent,{type:"session.error",properties:{error:C}})):M("Codex",e.onEvent,{type:"session.status",properties:{status:{type:"idle",message:"Codex \u5DF2\u5B8C\u6210"}}}),S();return}if(y.method==="error"){let v=y.params;N("notification:error",{threadId:v.threadId||"",turnId:v.turnId||"",willRetry:!!v.willRetry,message:v.error?.message||"",additionalDetails:v.error?.additionalDetails||"",codexErrorInfo:je(v.error?.codexErrorInfo??null)});let w=yi(y.params)||"Codex \u6267\u884C\u5931\u8D25";if(El(w)){M("Codex",e.onEvent,{type:"session.status",properties:{status:{type:"busy",message:w}}});return}C=w,M("Codex",e.onEvent,{type:"session.error",properties:{error:C}}),S()}},T=y=>{let v=y.trim();if(!v)return;let w=dr(v);if(!w){N("stdout:non-json",{line:v.slice(0,240)});return}if(typeof w.id<"u"&&(typeof w.result<"u"||typeof w.error<"u")){let B=O.get(w.id);if(!B){N("rpc:orphaned-response",{id:w.id,hasResult:typeof w.result<"u",error:je(w.error??null)});return}if(O.delete(w.id),w.error){N("rpc:error",{id:w.id,method:B.method,error:je(w.error)}),B.reject(new Error(yi(w.error)||"Codex app-server \u8BF7\u6C42\u5931\u8D25"));return}N("rpc:result",{id:w.id,method:B.method,result:je(w.result)}),B.resolve(w.result);return}if(typeof w.id<"u"&&typeof w.method=="string"){A(w);return}typeof w.method=="string"&&P(w)};p.stdout.on("data",y=>{x+=y.toString();let v=x.split(`
99
- `);x=v.pop()??"";for(let w of v)T(w)}),p.stderr.on("data",y=>{let v=y.toString();k+=v;for(let w of v.split(`
100
- `).map(B=>B.trim()).filter(Boolean))N("stderr",{line:w.slice(0,320)})}),p.on("error",y=>{c?.close(),e.signal?.removeEventListener("abort",I),N("launch:child-error",{error:y.message}),U(y),u(y)}),p.on("close",y=>{if(c?.close(),e.signal?.removeEventListener("abort",I),x.trim()&&T(x),e.signal?.aborted){N("launch:close",{code:y,aborted:!0,completed:E,lastError:C}),U(Pe(e.signal)),u(Pe(e.signal));return}if(!E||C){let v=new Error(Wy(C,k,y));N("launch:close",{code:y,aborted:!1,completed:E,lastError:C,finalError:v.message,stderrTail:k.trim().split(`
101
- `).filter(Boolean).slice(-5)}),U(v),u(v);return}N("launch:close",{code:y,aborted:!1,completed:E,lastError:C,sessionId:g||"",outputPreview:(R||"Codex \u672A\u8FD4\u56DE\u6587\u672C\u8F93\u51FA\u3002").slice(0,120)}),U(new Error("Codex \u4F1A\u8BDD\u5DF2\u7ED3\u675F")),m({output:R||"Codex \u672A\u8FD4\u56DE\u6587\u672C\u8F93\u51FA\u3002",sessionId:g||void 0})}),(async()=>{try{await L("initialize",{clientInfo:{name:"vibemux-worker",version:"0.1.1"},capabilities:{experimentalApi:!0}}),hi(p,{jsonrpc:"2.0",method:"initialized"});let y=await L("account/read",{refreshToken:!1}),v=!!d.apiToken;if(N("launch:account-read",{hasAccount:!!y.account,requiresOpenaiAuth:!!y.requiresOpenaiAuth,providerId:d.providerId,providerEnvKey:d.envKey,hasProviderCredential:v}),y.requiresOpenaiAuth&&!y.account){if(!v)throw N("launch:account-decision",{ok:!1,reason:"openai-auth-required-without-provider-credential",providerId:d.providerId,providerEnvKey:d.envKey}),new Error("Codex \u9700\u8981\u5148\u767B\u5F55\u540E\u624D\u80FD\u6267\u884C\u3002");N("launch:account-decision",{ok:!0,reason:"managed-provider-credentials-present",providerId:d.providerId,providerEnvKey:d.envKey})}else N("launch:account-decision",{ok:!0,reason:y.account?"account-present":"provider-auth-not-required",providerId:d.providerId,providerEnvKey:d.envKey});let w=e.resumeSessionId?.trim(),B;if(w)try{B=await L("thread/resume",Sy(e.cwd,w,i,r))}catch(de){if(!Py(de))throw de;B=await L("thread/start",kl(e.cwd,i,r))}else B=await L("thread/start",kl(e.cwd,i,r));g=B.thread.id,await L("turn/start",{threadId:g,input:[{type:"text",text:e.prompt,text_elements:[]}],collaborationMode:vy(B.model)})}catch(y){C=Iy(y)||"Codex \u521D\u59CB\u5316\u5931\u8D25",N("launch:init-error",{error:C,raw:je(y)}),M("Codex",e.onEvent,{type:"session.error",properties:{error:C}}),S()}})()})};import{readFile as Bk}from"node:fs/promises";import{createAgentSession as Wk,DefaultResourceLoader as Dk}from"@mariozechner/pi-coding-agent";import{Client as Dy}from"@modelcontextprotocol/sdk/client/index.js";import{SSEClientTransport as Ny}from"@modelcontextprotocol/sdk/client/sse.js";import{StdioClientTransport as $y}from"@modelcontextprotocol/sdk/client/stdio.js";import{StreamableHTTPClientTransport as Uy}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{defineTool as Ly}from"@mariozechner/pi-coding-agent";var jy="__",bl=e=>e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/^_+|_+$/g,""),Fy=(e,t,r)=>{let n=[bl(e),bl(t)].filter(Boolean).join(jy)||"mcp_tool",o=n,i=2;for(;r.has(o);)o=`${n}_${i}`,i+=1;return r.add(o),o},qy=e=>{if(!e||typeof e!="object")return"";let t=e;if(t.type==="text"&&typeof t.text=="string")return t.text.trim();if(t.type==="resource"&&t.resource&&typeof t.resource=="object"){let r=t.resource;if(typeof r.text=="string")return r.text.trim()}return t.type==="resource_link"&&typeof t.uri=="string"?[t.name,t.uri].filter(r=>typeof r=="string"&&r.trim().length>0).join(" - "):t.type==="image"?"[image]":t.type==="audio"?"[audio]":""},Gy=e=>{if("toolResult"in e)return typeof e.toolResult=="string"?e.toolResult.trim()||"\u5DE5\u5177\u5DF2\u6267\u884C\u5B8C\u6210\uFF0C\u4F46\u6CA1\u6709\u8FD4\u56DE\u53EF\u5C55\u793A\u7684\u6587\u672C\u7ED3\u679C\u3002":e.toolResult===void 0?"\u5DE5\u5177\u5DF2\u6267\u884C\u5B8C\u6210\uFF0C\u4F46\u6CA1\u6709\u8FD4\u56DE\u53EF\u5C55\u793A\u7684\u6587\u672C\u7ED3\u679C\u3002":JSON.stringify(e.toolResult,null,2);let t=Array.isArray(e.content)?e.content.map(qy).filter(Boolean).join(`
102
-
103
- `).trim():"";return t||("structuredContent"in e&&e.structuredContent!==void 0?JSON.stringify(e.structuredContent,null,2):"\u5DE5\u5177\u5DF2\u6267\u884C\u5B8C\u6210\uFF0C\u4F46\u6CA1\u6709\u8FD4\u56DE\u53EF\u5C55\u793A\u7684\u6587\u672C\u7ED3\u679C\u3002")},Hy=e=>{if(typeof e.command=="string"&&e.command.trim())return new $y({command:"sh",args:["-lc",e.command.trim()],env:Ft()});if(!e.url?.trim())return null;let t=e.headers??{},r=new URL(e.url);return e.type==="remote"&&/\/sse(?:$|[/?#])/i.test(r.pathname)?new Ny(r,{requestInit:Object.keys(t).length>0?{headers:t}:void 0}):new Uy(r,{requestInit:Object.keys(t).length>0?{headers:t}:void 0})},zy=e=>{let t=`${e.serverName} \xB7 ${e.toolName}`;return Ly({name:e.exposedToolName,label:t,description:e.description?.trim()||`${e.serverName} MCP tool: ${e.toolName}`,parameters:e.inputSchema??{type:"object",properties:{},additionalProperties:!0},execute:async(r,n)=>{let o=await e.client.callTool({name:e.toolName,arguments:n}),i=Gy(o);if(o.isError)throw new Error(i);return{content:[{type:"text",text:i}],details:{serverName:e.serverName,toolName:e.toolName,structuredContent:"structuredContent"in o?o.structuredContent:void 0}}}})},Ky=async e=>{let t=Hy(e.materializedServer);if(!t)return{client:null,tools:[],warning:`${e.serverPolicy.name} \u7F3A\u5C11\u53EF\u8FDE\u63A5\u7684 MCP transport\uFF0C\u5DF2\u8DF3\u8FC7\u3002`};let r=new Dy({name:"vibemux-pi-mcp",version:"0.1.8"});await r.connect(t);let o=(await r.listTools()).tools.map(i=>zy({client:r,serverName:e.serverPolicy.name,toolName:i.name,description:i.description,inputSchema:i.inputSchema,exposedToolName:Fy(e.serverPolicy.name,i.name,e.exposedToolNames)}));return{client:r,tools:o,warning:void 0}},Rl=async e=>{let t=e.workerConfig??b(),r=new Set,n=[],o=[],i=[],s=e.mcpServers?.filter(c=>c.enabled&&c.capabilityMode==="resources+tools")??[],a=rt(s,{cloudUrl:t.cloudUrl,executorToken:t.executorToken,actingUserId:e.actingUserId});for(let c of s){let l=a[c.id];if(!l){n.push(`${c.name} \u65E0\u6CD5\u7269\u5316\u4E3A Pi MCP bridge\uFF0C\u5DF2\u8DF3\u8FC7\u3002`);continue}try{let d=await Ky({exposedToolNames:r,materializedServer:l,serverPolicy:c});d.warning&&n.push(d.warning),d.client&&o.push(d.client),i.push(...d.tools)}catch(d){n.push(`${c.name} MCP bridge \u8FDE\u63A5\u5931\u8D25\uFF1A${d instanceof Error?d.message:"unknown error"}`)}}return{tools:i,cleanup:async()=>{await Promise.allSettled(o.map(c=>c.close()))},warnings:n}};import{mkdtemp as Jy,mkdir as Vy,rm as Tl,writeFile as Xy}from"node:fs/promises";import Yy from"node:os";import Sr from"node:path";var Qy={"image/avif":".avif","image/bmp":".bmp","image/gif":".gif","image/jpeg":".jpg","image/jpg":".jpg","image/png":".png","image/svg+xml":".svg","image/webp":".webp"},Zy=(e,t)=>{let r=Sr.parse(e),n=(r.name||t).replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,""),o=(r.ext||"").replace(/[^a-zA-Z0-9.]+/g,"");return`${n||t}${o}`},ek=(e,t)=>{let r=(e||"").replace(/^ws:/,"http:").replace(/^wss:/,"https:");if(/^https?:\/\//i.test(t))return t;if(!r)throw new Error("\u5F53\u524D worker \u672A\u914D\u7F6E cloudUrl\uFF0C\u65E0\u6CD5\u4E0B\u8F7D\u56FE\u7247\u9644\u4EF6\u3002");return new URL(t,r).toString()},tk=(e,t)=>{let r=Sr.extname(e);return r||t&&Qy[t]||""},Rn=async e=>{let t=e.attachments??[];if(t.length===0)return{attachments:[],cleanup:async()=>{}};let r=Sr.join(Yy.tmpdir(),"vibemux-task-chat-attachments-");await Vy(Sr.dirname(r),{recursive:!0});let n=await Jy(r);try{return{attachments:await Promise.all(t.map(async(i,s)=>{let a=ek(e.cloudUrl,i.url),c=await fetch(a,{signal:e.signal});if(!c.ok)throw new Error(`\u56FE\u7247\u9644\u4EF6\u4E0B\u8F7D\u5931\u8D25\uFF1A${i.filename}`);let l=c.headers.get("content-type")?.split(";")[0]?.trim()||i.contentType,d=tk(i.filename,l),m=Zy(`${s+1}-${i.filename||`image-${s+1}`}${d&&!i.filename.endsWith(d)?d:""}`,`image-${s+1}`),u=Sr.join(n,m),p=Buffer.from(await c.arrayBuffer());return await Xy(u,p),{...i,contentType:l,absoluteUrl:a,localPath:u}})),cleanup:async()=>{await Tl(n,{recursive:!0,force:!0})}}}catch(o){throw await Tl(n,{recursive:!0,force:!0}).catch(()=>{}),o}},Al=(e,t)=>{if(t.length===0)return e;let r="\u7528\u6237\u5728\u672C\u8F6E\u6D88\u606F\u4E2D\u9644\u5E26\u4E86\u56FE\u7247\u9644\u4EF6\uFF0C\u8BF7\u4F18\u5148\u7ED3\u5408\u8FD9\u4E9B\u56FE\u7247\u7EE7\u7EED\u5206\u6790\u548C\u56DE\u7B54\u3002",n=t.flatMap((o,i)=>[`\u9644\u4EF6 ${i+1}: ${o.filename}`,`- \u672C\u5730\u8DEF\u5F84: ${o.localPath}`,`- \u6765\u6E90 URL: ${o.absoluteUrl}`]);return[e.trim(),"",r,...n,"","\u8FD9\u4E9B\u9644\u4EF6\u4F4D\u4E8E\u5F53\u524D\u673A\u5668\u7684\u4E34\u65F6\u76EE\u5F55\uFF0C\u4E0D\u5C5E\u4E8E\u4ED3\u5E93\u6587\u4EF6\u3002"].filter(Boolean).join(`
104
- `)};import{createHash as rk,randomUUID as nk}from"node:crypto";import{existsSync as Ml,mkdirSync as Si,readFileSync as ok,rmSync as ik,writeFileSync as sk}from"node:fs";import Ol from"node:os";import ut from"node:path";import{AuthStorage as ak,ModelRegistry as _l,SessionManager as vr,SettingsManager as ck}from"@mariozechner/pi-coding-agent";var lk=["text"],dk={input:0,output:0,cacheRead:0,cacheWrite:0},uk=new Map([["claude","anthropic"],["dashscope","qwen"],["gemini","google"],["glm","zhipu"],["grok","xai"],["kimi","moonshot"],["volcengine","doubao"]]),pk=e=>{let t=e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return uk.get(t)||t},mk=e=>e.trim().toUpperCase().replace(/[^A-Z0-9]+/g,"_").replace(/^_+|_+$/g,"")||"MODEL",gk=e=>{let t=e.trim().toLowerCase();return t==="openai"?"OPENAI":t==="anthropic"||t==="claude"?"ANTHROPIC":t==="google"||t==="gemini"?"GOOGLE":t==="minimax"?"MINIMAX":t==="minimax-cn"?"MINIMAX_CN":mk(e)},fk=e=>{let t=e?.trim()||"";if(!t)return null;let r=t.indexOf("/");if(r<0)return null;let n=pk(t.slice(0,r)),o=t.slice(r+1).trim();return!n||!o?null:{providerId:n,modelId:o}},hk=(e,t)=>{let r=t?.VIBEMUX_PI_AGENT_DIR?.trim();if(r)return r;let n=e?.agentDir?.trim()||b().piAgentDir?.trim();return n||ut.join(Ol.homedir(),".pi","agent")},yk=(e,t)=>{let r=rk("sha1").update(`${t}::${e}`).digest("hex").slice(0,16);return ut.join(t,"sessions-vibemux",r)},kk=(e,t)=>{let r=gk(e.providerId);return{apiKey:t?.[`${r}_API_KEY`]?.trim()||"",baseUrl:t?.[`${r}_BASE_URL`]?.trim()||""}},wk=(e,t)=>{let r=`${e.providerId} ${e.modelId} ${t||""}`.toLowerCase();return r.includes("anthropic")||r.includes("claude")?"anthropic-messages":r.includes("google")||r.includes("gemini")?"google-generative-ai":"openai-completions"},xk=e=>{let t=`${e.providerId}/${e.modelId}`.toLowerCase();return t.includes("gpt-5")||t.includes("claude")||t.includes("gemini")||t.includes("deepseek")||t.includes("qwen")||t.includes("kimi")},Sk=e=>{let t=`${e.providerId}/${e.modelId}`.toLowerCase();return t.includes("vision")||t.includes("omni")||t.includes("gemini")||t.includes("claude")||t.includes("gpt-4")||t.includes("gpt-5")?["text","image"]:[...lk]},vk=e=>{if(!Ml(e))return{};try{let t=JSON.parse(ok(e,"utf8"));return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}catch{return{}}},Ck=e=>{let t=ut.join(e.agentDir,"models.json"),r=vk(t),n=r.providers&&typeof r.providers=="object"?r.providers:{},o=e.baseRegistry.find(e.model.providerId,e.model.modelId),i={...e.apiKey?{apiKey:e.apiKey}:{},...e.baseUrl?{baseUrl:e.baseUrl}:{},api:o?.api??wk(e.model,e.baseUrl),models:[{id:e.model.modelId,name:o?.name??e.model.modelId,reasoning:o?.reasoning??xk(e.model),input:o?.input??Sk(e.model),contextWindow:o?.contextWindow??128e3,maxTokens:o?.maxTokens??16384,cost:o?.cost??dk,...o?.headers?{headers:o.headers}:{},...o?.compat?{compat:o.compat}:{}}]};return{providers:{...n,[e.model.providerId]:i}}},Pk=e=>{let t=ut.join(Ol.tmpdir(),`vibemux-pi-models-${nk()}`);Si(t,{recursive:!0});let r=Ck({agentDir:e.agentDir,baseRegistry:e.baseRegistry,model:e.model,apiKey:e.apiKey,baseUrl:e.baseUrl}),n=ut.join(t,"models.json");return sk(n,`${JSON.stringify(r,null,2)}
105
- `,"utf8"),{modelRegistry:_l.create(e.authStorage,n),cleanup:()=>{ik(t,{recursive:!0,force:!0})}}},Ek=async e=>{let t=yk(e.cwd,e.agentDir);Si(t,{recursive:!0});let r=e.resumeSessionId?.trim();if(!r){let s=vr.continueRecent(e.cwd,t);return xi(s),s}if(Ml(r)){let s=vr.open(r,t,e.cwd);return xi(s),s}let o=(await vr.list(e.cwd,t)).find(s=>s.id===r),i=o?vr.open(o.path,t,e.cwd):vr.continueRecent(e.cwd,t);return xi(i),i},Tn=e=>!!(e&&typeof e=="object"&&!Array.isArray(e)),Ik=e=>typeof e=="string"?e.trim().length>0:Array.isArray(e)?e.some(t=>Tn(t)&&t.type==="text"&&typeof t.text=="string"&&t.text.trim().length>0):!1,bk=e=>Array.isArray(e)?e.some(t=>Tn(t)&&t.type==="toolCall"&&(typeof t.id!="string"||!t.id.trim()||typeof t.name!="string"||!t.name.trim())):!1,Rk=e=>e?.role!=="user"&&e?.role!=="toolResult"||!Array.isArray(e.content)?!1:e.content.some(t=>Tn(t)?t.type==="input_image"||t.type==="image_url"?!0:t.type!=="image"?!1:typeof t.data!="string"||!t.data.trim()||typeof t.mimeType!="string"||!t.mimeType.trim()||typeof t.url=="string"||typeof t.image_url=="string"||Tn(t.source):!1),Tk=e=>e?.role==="toolResult"&&(typeof e.toolCallId!="string"||!e.toolCallId.trim()||typeof e.toolName!="string"||!e.toolName.trim()),Ak=e=>{let t=e?.errorMessage?.trim().toLowerCase()||"";return e?.role==="assistant"&&e.stopReason==="error"&&(t.includes("call_id")&&t.includes("empty string")||t.includes("unknown parameter")&&t.includes("content[")&&t.includes(".url"))},Mk=e=>{if(e.type!=="message")return!1;let t=e.message;return bk(t?.content)||Rk(t)||Tk(t)||Ak(t)},Ok=e=>{let t=e.message;return e.type==="message"&&!!e.id&&t?.role==="assistant"&&t.stopReason!=="error"&&Ik(t.content)},_k=e=>{let t="";for(let r of e){if(Mk(r))return t||null;Ok(r)&&(t=r.id??"")}},xi=e=>{let t=_k(e.getBranch());return t===void 0?!1:(t?e.createBranchedSession(t):e.newSession(),!0)},Bl=async e=>{let t=hk(e.settings,e.runtimeEnv);Si(t,{recursive:!0});let r=ak.create(ut.join(t,"auth.json")),n=fk(e.executionModel),o=n?kk(n,e.runtimeEnv):{apiKey:"",baseUrl:""};n&&o.apiKey&&r.setRuntimeApiKey(n.providerId,o.apiKey);let i=_l.create(r,ut.join(t,"models.json")),s=n&&(o.baseUrl||!i.find(n.providerId,n.modelId))?Pk({agentDir:t,authStorage:r,baseRegistry:i,model:n,apiKey:o.apiKey||void 0,baseUrl:o.baseUrl||void 0}):null,a=s?.modelRegistry??i,c=ck.create(e.cwd,t);n&&c.applyOverrides({defaultProvider:n.providerId,defaultModel:n.modelId});let l=n?a.find(n.providerId,n.modelId):void 0;return l&&o.apiKey&&r.setRuntimeApiKey(l.provider,o.apiKey),{agentDir:t,authStorage:r,modelRegistry:a,selectedModel:l,sessionManager:await Ek({agentDir:t,cwd:e.cwd,resumeSessionId:e.resumeSessionId}),settingsManager:c,cleanup:()=>{s?.cleanup()}}};var On=e=>!!(e&&typeof e=="object"&&!Array.isArray(e)),Nk=e=>On(e)&&e.type==="toolCall",Wl=e=>!!(e.id?.trim()&&e.name?.trim()),$k=e=>On(e)&&Object.keys(e).length>0,Uk=(e,t)=>({...On(e)?e:{},...On(t)?t:{}}),Mn=e=>{if(e.role!=="assistant"||!Array.isArray(e.content))return e;let t=[],r,n=!1;for(let o of e.content){if(!Nk(o)){t.push(o),r=void 0;continue}if(Wl(o)){let i={...o};t.push(i),r=i,i!==o&&(n=!0);continue}if(r&&$k(o.arguments)){r.arguments=Uk(r.arguments,o.arguments),n=!0;continue}n=!0}return n?{...e,content:t}:e},Lk=e=>{let t={...e};return e.partial&&(t.partial=Mn(e.partial)),e.message&&(t.message=Mn(e.message)),e.error&&(t.error=Mn(e.error)),e.toolCall&&!Wl(e.toolCall)&&delete t.toolCall,t},jk=e=>{let t;return{async*[Symbol.asyncIterator](){for await(let r of e){let n=Lk(r);n.type==="done"&&n.message&&(t=n.message),n.type==="error"&&n.error&&(t=n.error),yield n}},result:async()=>{if(t)return t;let r=await e.result?.();return r?Mn(r):{role:"assistant",content:[]}}}},Fk=e=>{let t=e.agent,r=t?.streamFn;return!t||!r?()=>{}:(t.streamFn=async(...n)=>{let o=await r.apply(t,n);if(!o||typeof o!="object")return o;let i=o;return typeof i[Symbol.asyncIterator]!="function"?o:jk(i)},()=>{t.streamFn=r})},Dl=e=>{let t=e;if(t?.role!=="assistant")return[];if(typeof t.content=="string"){let r=t.content.trim();return r?[{index:0,text:r,type:"text"}]:[]}return Array.isArray(t.content)?t.content.flatMap((r,n)=>{let o=r;if(o.type==="text"){let i=typeof o.text=="string"?o.text.trim():typeof o.content=="string"?o.content.trim():"";return i?[{index:n,text:i,type:"text"}]:[]}if(o.type==="thinking"){let i=typeof o.thinking=="string"?o.thinking.trim():typeof o.text=="string"?o.text.trim():"";return i?[{index:n,text:i,type:"thinking"}]:[]}return[]}):[]},Nl=e=>Dl(e).filter(t=>t.type==="text").map(t=>t.text).join(`
106
-
107
- `).trim(),$l=e=>{let t=e;return t?.role!=="assistant"||t.stopReason!=="error"?"":typeof t.errorMessage=="string"?t.errorMessage.trim():""},qk=e=>{for(let t of[...e].reverse())if(t?.role==="assistant")return t},Ul=(e,t)=>{M("Pi",e.onEvent,{type:"message.updated",properties:{info:{id:t.activeAssistantMessageId,role:"assistant"}}})},Pi=(e,t,r,n,o,i)=>{let s=r==="text"?t.textParts:t.reasoningParts;(s.get(n)??"")!==o&&(s.set(n,o),Ul(e,t),M("Pi",e.onEvent,{type:"message.part.updated",properties:{part:{id:`${t.activeAssistantMessageId}:${r}:${n}`,messageID:t.activeAssistantMessageId,type:r,text:o},delta:i}}))},Gk=(e,t,r,n)=>{let o=`${t.textParts.get(r)??""}${n}`;Pi(e,t,"text",r,o,n)},Hk=(e,t,r,n)=>{let o=`${t.reasoningParts.get(r)??""}${n}`;Pi(e,t,"reasoning",r,o,n)},An=(e,t,r)=>{t.latestAssistantMessage=r;for(let n of Dl(r)){let o=(n.type==="text"?t.textParts:t.reasoningParts).get(n.index)??"",i=n.text.startsWith(o)&&n.text.slice(o.length)||void 0;Pi(e,t,n.type==="text"?"text":"reasoning",n.index,n.text,i)}},vi=(e,t,r)=>{Ul(e,t),M("Pi",e.onEvent,{type:"message.part.updated",properties:{part:{id:r.toolCallId,messageID:t.activeAssistantMessageId,type:"tool",tool:r.toolName,state:{status:r.status,raw:r.raw,output:r.output,error:r.error}}}})},Ci=e=>!!(e.toolCallId?.trim()&&e.toolName?.trim()),zk=(e,t,r)=>{if(r.type==="agent_start"){M("Pi",e.onEvent,{type:"session.status",properties:{status:{type:"busy",message:"Pi \u4F1A\u8BDD\u6267\u884C\u4E2D"}}});return}if(r.type==="turn_start"){t.assistantCounter+=1,t.activeAssistantMessageId=`pi:${t.assistantCounter}`,t.latestAssistantMessage=void 0,t.textParts.clear(),t.reasoningParts.clear();return}if(r.type==="message_update"){t.latestAssistantMessage=r.message,r.assistantMessageEvent.type==="text_delta"&&Gk(e,t,r.assistantMessageEvent.contentIndex,r.assistantMessageEvent.delta),r.assistantMessageEvent.type==="thinking_delta"&&Hk(e,t,r.assistantMessageEvent.contentIndex,r.assistantMessageEvent.delta),(r.assistantMessageEvent.type==="text_end"||r.assistantMessageEvent.type==="thinking_end"||r.assistantMessageEvent.type==="done")&&An(e,t,r.message);return}if(r.type==="message_end"&&r.message.role==="assistant"){An(e,t,r.message);return}if(r.type==="turn_end"&&r.message.role==="assistant"){An(e,t,r.message);return}if(r.type==="tool_execution_start"){if(!Ci(r))return;vi(e,t,{toolCallId:r.toolCallId,toolName:r.toolName,raw:JSON.stringify(r.args??{},null,2),status:"running"});return}if(r.type==="tool_execution_update"){if(!Ci(r))return;vi(e,t,{toolCallId:r.toolCallId,toolName:r.toolName,raw:JSON.stringify(r.args??{},null,2),output:JSON.stringify(r.partialResult??{},null,2),status:"running"});return}if(r.type==="tool_execution_end"){if(!Ci(r))return;vi(e,t,{toolCallId:r.toolCallId,toolName:r.toolName,output:JSON.stringify(r.result??{},null,2),error:r.isError?JSON.stringify(r.result??{},null,2):void 0,status:r.isError?"error":"completed"});return}if(r.type==="agent_end"){let n=qk(r.messages);n&&An(e,t,n),M("Pi",e.onEvent,{type:"session.idle",properties:{}})}},Kk=e=>{for(let t of[...e].reverse()){let r=Nl(t)||$l(t);if(r)return r}return""},Jk=e=>[...e.textParts.entries()].sort((t,r)=>t[0]-r[0]).map(([,t])=>t.trim()).filter(Boolean).join(`
108
-
109
- `).trim(),Vk=(e,t,r)=>{let n=Nl(r.latestAssistantMessage)||$l(r.latestAssistantMessage);if(n)return n;let o=Kk(e.slice(t));return o||Jk(r)},Xk=async e=>{for(await e.agent?.waitForIdle?.();;){let t=e._agentEventQueue;if(await t,t===e._agentEventQueue)return}},Yk=async e=>Promise.all(e.filter(t=>t.contentType?.startsWith("image/")).map(async t=>({type:"image",data:await Bk(t.localPath,"base64"),mimeType:t.contentType||"image/png"}))),Ll=async e=>{let t=e.agentSettings&&"agentDir"in e.agentSettings?e.agentSettings:void 0,r=Ue(e.executionModel)??Ue(t?.defaultModel),n=b(),o=await Bl({cwd:e.cwd,executionModel:r,resumeSessionId:e.resumeSessionId,runtimeEnv:e.runtimeEnv,settings:t}),i=await Rl({actingUserId:e.actingUserId,mcpServers:e.mcpServers,workerConfig:n}),s=e.runtimeEnv?.VIBEMUX_PI_SKILL_PATHS?.split(`
110
- `).map(k=>k.trim()).filter(Boolean)??[],a=new Dk({cwd:e.cwd,agentDir:o.agentDir,settingsManager:o.settingsManager,additionalSkillPaths:s});await a.reload();let{session:c}=await Wk({cwd:e.cwd,agentDir:o.agentDir,authStorage:o.authStorage,modelRegistry:o.modelRegistry,model:o.selectedModel,tools:["read","bash","edit","write","grep","find","ls"],customTools:i.tools,resourceLoader:a,sessionManager:o.sessionManager,settingsManager:o.settingsManager}),l=i.warnings.join(`
111
- `);l&&M("Pi",e.onEvent,{type:"session.status",properties:{status:{type:"busy",message:l}}});let d={activeAssistantMessageId:"pi:0",assistantCounter:0,reasoningParts:new Map,textParts:new Map},m=c.messages.length,u=c.subscribe(k=>{zk(e,d,k)}),p=Fk(c),f=()=>{c.abort()};e.signal?.addEventListener("abort",f,{once:!0});let x={attachments:[],cleanup:async()=>{}};try{x=e.preparedAttachments?{attachments:e.preparedAttachments,cleanup:async()=>{}}:await Rn({attachments:e.attachments,cloudUrl:n.cloudUrl,signal:e.signal});let k=await Yk(x.attachments);if(await c.prompt(e.prompt,k.length>0?{images:k}:void 0),await Xk(c),e.signal?.aborted)throw Pe(e.signal);return{output:Vk(c.messages,m,d),sessionId:c.sessionId}}catch(k){throw e.signal?.aborted||k instanceof Error&&k.name==="AbortError"?Pe(e.signal):(M("Pi",e.onEvent,{type:"session.error",properties:{error:k instanceof Error?k.message:"Pi \u6267\u884C\u5931\u8D25",message:k instanceof Error?k.message:"Pi \u6267\u884C\u5931\u8D25"}}),k)}finally{e.signal?.removeEventListener("abort",f),u(),p(),c.dispose(),await x.cleanup(),await i.cleanup(),o.cleanup()}};import{createHash as Qk}from"node:crypto";import{copyFileSync as ql,existsSync as qe,mkdirSync as Ye,mkdtempSync as Zk,readFileSync as Ri,rmSync as Gt,writeFileSync as Ti}from"node:fs";import Ai from"node:os";import $ from"node:path";var Gl=".vibemux-managed.json",ew="VIBEMUX_CODEX_MCP_TOKEN_",tw="vibemux-task-runtime-",rw=[".credentials.json"],nw={OpenCode:{skillRoot:".opencode/skills"},Codex:{skillRoot:".codex/skills"},ClaudeCode:{skillRoot:".claude/skills"},Pi:{skillRoot:".pi/skills"}},Hl=e=>nw[yt(e)].skillRoot,pt=e=>e.replace(/\\/g,"\\\\").replace(/"/g,'\\"'),jl=e=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),ow=e=>/^[A-Za-z0-9_-]+$/.test(e),iw=(e,t)=>{console.log("[worker-codex-runtime]",e,JSON.stringify(t))},zl=(e,t)=>{if(!e.trim()||t.length===0)return!1;let r=t.map(n=>{let o=`"${jl(n)}"`;return ow(n)?`(?:${jl(n)}|${o})`:o}).join("\\s*\\.\\s*");return new RegExp(`^\\s*\\[\\s*${r}\\s*\\]\\s*$`,"m").test(e)},Ii=e=>{let t=[];for(let r of e.replace(/\\/g,"/").replace(/^\/+/,"").split("/"))if(!(!r||r===".")){if(r===".."){t.length>0&&t.pop();continue}t.push(r)}return t.join("/")},sw=e=>e.startsWith("sse://")?`http://${e.slice(6)}`:e.trim(),aw=e=>/^https?:\/\//i.test(e)||/^sse:\/\//i.test(e),bi=(e,t)=>{Ye($.dirname(e),{recursive:!0}),Ti(e,`${JSON.stringify(t,null,2)}
112
- `,"utf8")},_n=(e,t)=>{Ye($.dirname(e),{recursive:!0}),Ti(e,t,"utf8")},cw=e=>typeof e=="string"?{encoding:"utf8",content:e}:!e||typeof e!="object"||typeof e.content!="string"?null:{encoding:e.encoding==="base64"?"base64":"utf8",content:e.content},lw=(e,t)=>{let r=Qk("sha1").update(t).digest("hex").slice(0,16);return $.join(Ee(),"runtime",e,r)},Mi=e=>{let t=$.join(Ee(),"runtime",e);return Ye(t,{recursive:!0}),Zk($.join(t,`${e}-`))},Ei=e=>e.replace(/\\/g,"/").split("/").some(t=>t.startsWith(tw)),dw=e=>{let t=e.trim();if(!t)return null;try{let r=JSON.parse(t),n=r.env&&typeof r.env=="object"?Object.entries(r.env).reduce((o,[i,s])=>(typeof s=="string"&&s.trim()&&(o[i]=s),o),{}):{};return{settings:r,runtimeEnv:n}}catch{return null}},uw=e=>{let t=$.join(e,Gl);if(!qe(t))return[];try{let r=JSON.parse(Ri(t,"utf8"));return Array.isArray(r.slugs)?r.slugs.filter(n=>typeof n=="string"&&n.trim().length>0):[]}catch{return[]}},pw=(e,t)=>{bi($.join(e,Gl),{slugs:t})},mw=e=>{let t=Mi(`skills-${e.toLowerCase()}`),r=$.join(t,Hl(e));return Ye(r,{recursive:!0}),{rootPath:r,promptRoot:r.replace(/\\/g,"/"),cleanup:()=>{Gt(t,{recursive:!0,force:!0})}}},Fl=(e,t)=>{for(let n of uw(e))Gt($.join(e,n),{recursive:!0,force:!0});let r=[];for(let n of t){let o=Ii(n.slug);if(!o)continue;r.push(o);let i=$.join(e,o);Gt(i,{recursive:!0,force:!0}),Ye(i,{recursive:!0});for(let[s,a]of Object.entries(n.files)){let c=Ii(s);if(!c)continue;let l=$.resolve(i,c);if(l!==i&&!l.startsWith(`${i}${$.sep}`))continue;let d=cw(a);if(d){if(Ye($.dirname(l),{recursive:!0}),d.encoding==="base64"){Ti(l,Buffer.from(d.content,"base64"));continue}_n(l,d.content)}}qe($.join(i,"SKILL.md"))||_n($.join(i,"SKILL.md"),n.markdown)}pw(e,r)},gw=(e,t,r)=>{if(r.length===0)return null;let n;try{let o=mw(e);try{return Fl(o.rootPath,r),{promptRoot:o.promptRoot,cleanup:o.cleanup}}catch(i){throw o.cleanup(),i}}catch(o){n=o;let i=Hl(e),s=$.join(t,i);try{return Ye(s,{recursive:!0}),Fl(s,r),{promptRoot:i.replace(/\\/g,"/"),cleanup:()=>{}}}catch(a){throw a instanceof Error?a:n instanceof Error?n:new Error("\u5199\u5165\u8FD0\u884C\u65F6\u6280\u80FD\u76EE\u5F55\u5931\u8D25\u3002")}}},fw=(e,t="")=>{let r=[],n={},o=0;for(let i of e.mcpServers??[]){if(!i.enabled)continue;let s=Ii(i.id||i.name).replace(/\//g,"-");if(!s||zl(t,["mcp_servers",s]))continue;if(i.transport==="stdio"||i.target.startsWith("stdio://")){let c=i.target.replace(/^stdio:\/\//,"").trim();if(!c)continue;r.push(`[mcp_servers."${pt(s)}"]`,'command = "sh"',`args = ["-lc", "${pt(c)}"]`,"");continue}if(i.target===tt){if(!e.executorToken?.trim())continue;let c=`${ew}${o}`;o+=1,n[c]=e.executorToken.trim(),r.push(`[mcp_servers."${pt(s)}"]`,`url = "${pt(`${e.cloudUrl.replace(/\/+$/,"")}/mcp/executor`)}"`,`bearer_token_env_var = "${c}"`,"");continue}if(!aw(i.target))continue;let a=sw(i.target);a&&r.push(`[mcp_servers."${pt(s)}"]`,`url = "${pt(a)}"`,"")}return{configText:r.join(`
113
- `),env:n}},hw=(e,t)=>{let r=rt(e.mcpServers??[],{cloudUrl:e.cloudUrl,executorToken:e.executorToken,actingUserId:t});return{mcpServers:Object.entries(r).reduce((o,[i,s])=>{let a=s;return typeof a.command=="string"&&a.command.trim()?(o[i]={command:"sh",args:["-lc",a.command.trim()]},o):(typeof a.url=="string"&&a.url.trim()&&(o[i]={type:"http",url:a.url.trim(),...a.headers&&typeof a.headers=="object"?{headers:a.headers}:{}}),o)},{})}},yw=(e,t)=>{let r=Ei(e)?Mi("codex-home"):lw("codex-home",e),n=process.env.CODEX_HOME?.trim()||$.join(Ai.homedir(),".codex"),o=$.join(n,"config.toml"),i=$.join(n,"auth.json"),s=$.join(r,"config.toml"),a=$.join(r,"auth.json"),c=qe(o)?Ri(o,"utf8").trim():"",l=qe(i);Ye(r,{recursive:!0});let d=t.codexConfigContent?.trim()||c,m=ae({configContent:d,authContent:t.codexAuthContent}),u=St(d,m.providerId),p=vt(u.content,m.providerId,m.envKey),f=p.content,x=zl(f,["projects",e])?"":[`[projects."${pt(e)}"]`,'trust_level = "trusted"'].join(`
114
- `),k=fw(t,f),g=[f,x,k.configText].filter(j=>j.trim());_n(s,`${g.join(`
94
+ `)||""};if(e==null)return e;if(typeof e=="string")return e.slice(0,240);if(Array.isArray(e))return{type:"array",length:e.length};if(typeof e!="object")return e;let t={};for(let[r,n]of Object.entries(e)){if(typeof n=="string"){t[r]=n.slice(0,240);continue}if(Array.isArray(n)){t[r]={type:"array",length:n.length};continue}if(n&&typeof n=="object"){t[r]=Le(n);continue}t[r]=n}return t},uk=e=>Us(e)||(e instanceof Error?e.message.trim():"")||"",Yt=e=>e.replace(/\\/g,"\\\\").replace(/"/g,'\\"'),zl=e=>e.split(".").map(t=>t.trim().replace(/^"(.*)"$/,"$1")).join("."),Ye=(e,t)=>`${e} = "${Yt(t)}"`,pk=(e,t,r)=>{if(!e.trim()||!t.trim()||!r.trim())return{content:e,changed:!1};let n="",o=!1,s=e.split(/\r?\n/).map(i=>{let c=i.trim().match(/^\[([^\]]+)\]$/);if(c)return n=zl(c[1]??""),i;let l=i.match(/^(\s*)([A-Za-z0-9_.-]+)(\s*=\s*)["']([^"']*)["'](\s*(?:#.*)?)$/);if(!l)return i;let[,d,p,u,,m]=l;return!(n===`model_providers.${t}`)&&!(n==="")||p!=="base_url"&&p!=="openai_base_url"?i:(o=!0,`${d}${p}${u}"${Yt(r)}"${m}`)});return{content:o?s.join(`
95
+ `):e,changed:o}},mk=(e,t)=>{if(!e.trim())return{content:e,changed:!1};let r=Oe(t.executionModel),n=r?.providerId?.trim()||"",o=r?.modelId?.trim()||"",s=t.runtimeEnv?.OPENAI_BASE_URL?.trim()||"",i=t.runtimeEnv?.OPENAI_API_KEY?.trim()?"OPENAI_API_KEY":"";if(!n&&!o&&!s&&!i)return{content:e,changed:!1};let a=n?`model_providers.${n}`:"",c=[],l="",d=!1,p=!1,u=!1,m=!1,f=!1,S=!1,w=!1,g=!1,I=()=>{if(p)return;let E=[];o&&!u&&E.push(Ye("model",o)),n&&!m&&E.push(Ye("model_provider",n)),E.length>0&&(c.length>0&&c[c.length-1]?.trim()&&c.push(""),c.push(...E),d=!0),p=!0},v=()=>{if(!S)return;let E=[];s&&!w&&E.push(Ye("base_url",s)),i&&!g&&E.push(Ye("env_key",i)),!f&&n&&E.unshift(Ye("name",n)),E.length>0&&(c.push(...E),d=!0),S=!1};for(let E of e.split(/\r?\n/)){let O=E.trim().match(/^\[([^\]]+)\]$/);if(O){v(),I(),l=zl(O[1]??""),l===a&&(f=!0,S=!0,w=!1,g=!1),c.push(E);continue}let z=E.match(/^(\s*)([A-Za-z0-9_.-]+)(\s*=\s*)["']([^"']*)["'](\s*(?:#.*)?)$/);if(!z){c.push(E);continue}let[,D,L,j,J,x]=z,b=l==="",A=l===a;if(b&&L==="model"&&o){u=!0,J!==o?(c.push(`${D}${L}${j}"${Yt(o)}"${x}`),d=!0):c.push(E);continue}if(b&&L==="model_provider"&&n){m=!0,J!==n?(c.push(`${D}${L}${j}"${Yt(n)}"${x}`),d=!0):c.push(E);continue}if(A&&L==="base_url"&&s){w=!0,J!==s?(c.push(`${D}${L}${j}"${Yt(s)}"${x}`),d=!0):c.push(E);continue}if(A&&L==="env_key"&&i){g=!0,J!==i?(c.push(`${D}${L}${j}"${Yt(i)}"${x}`),d=!0):c.push(E);continue}c.push(E)}return v(),I(),a&&!f&&(s||i)&&(c.length>0&&c[c.length-1]?.trim()&&c.push(""),c.push(`[model_providers.${n}]`),c.push(Ye("name",n)),s&&c.push(Ye("base_url",s)),i&&c.push(Ye("env_key",i)),d=!0),{content:d?c.join(`
96
+ `):e,changed:d}},gk=e=>{let t=e.trim();return/^https?:\/\//i.test(t)?!/^https?:\/\/(?:127\.0\.0\.1|localhost)(?::\d+)?(?:\/|$)/i.test(t):!1},fk=async e=>{let t=[];for await(let r of e)t.push(typeof r=="string"?Buffer.from(r):r);if(t.length!==0)return Buffer.concat(t)},hk=async(e,t)=>{if(!e.body){t.end();return}let r=e.body.getReader();try{for(;;){let{done:n,value:o}=await r.read();if(n)break;!o||o.byteLength===0||t.write(Buffer.from(o))||await sk(t,"drain")}t.end()}finally{r.releaseLock()}},yk=async e=>{let t=e.trim().replace(/\/+$/,""),r=new URL(`${t}/`),n=nk.createServer(async(i,a)=>{try{let c=new URL(i.url||"/",r),l=new Headers;for(let[u,m]of Object.entries(i.headers))!m||u.toLowerCase()==="host"||u.toLowerCase()==="connection"||l.set(u,Array.isArray(m)?m.join(", "):m);let d=i.method==="GET"||i.method==="HEAD"?void 0:await fk(i),p=await fetch(c,{method:i.method,headers:l,body:d,redirect:"manual"});if(a.statusCode=p.status,a.statusMessage=p.statusText,p.headers.forEach((u,m)=>{m.toLowerCase()==="connection"||m.toLowerCase()==="transfer-encoding"||a.setHeader(m,u)}),!p.body){a.end();return}await hk(p,a)}catch(c){if(N("compatibility-proxy:error",{targetBaseUrl:t,requestUrl:i.url||"/",error:c instanceof Error?c.message:"Codex compatibility proxy failed."}),a.headersSent){a.destroy(c instanceof Error?c:new Error("Codex compatibility proxy failed."));return}a.statusCode=502,a.setHeader("Content-Type","text/plain; charset=utf-8"),a.end(c instanceof Error?c.message:"Codex compatibility proxy failed.")}}),o=await new Promise((i,a)=>{n.once("error",a),n.listen(0,"127.0.0.1",()=>{let c=n.address();if(!c||typeof c=="string"){a(new Error("Failed to allocate Codex compatibility proxy port."));return}i(c)})}),s=!1;return{proxiedBaseUrl:`http://127.0.0.1:${o.port}${r.pathname.replace(/\/$/,"")}`,close:()=>{s||(s=!0,n.close())}}},kk=async e=>{let t=e.runtimeEnv?.CODEX_HOME?.trim();if(!t)return N("launch-config:skipped",{reason:"missing-codex-home"}),null;let r=Fn.join(t,"config.toml"),n=Fn.join(t,"auth.json"),o="";try{o=jn(r,"utf8")}catch{return N("launch-config:skipped",{reason:"config-unreadable",configPath:r}),null}let s=(()=>{try{return jn(n,"utf8")}catch{return""}})(),i=o,a=mk(o,{executionModel:e.executionModel,runtimeEnv:e.runtimeEnv});a.changed&&(i=a.content,N("launch-config:enabled",{executionModel:e.executionModel||"default",baseUrlOverride:e.runtimeEnv?.OPENAI_BASE_URL||""}));let c=le({configContent:i,authContent:s,env:e.runtimeEnv}),l=Oe(e.executionModel)?.providerId||c.providerId,d=It(i,l);d.changed&&(i=d.content,N("launch-config:provider-name-added",{providerId:l}));let p=Et(i,l,c.envKey);p.changed&&(i=p.content,N("launch-config:provider-env-key-added",{providerId:l,envKey:c.envKey}));let u=le({configContent:i,authContent:s,env:e.runtimeEnv});N("launch-config:resolved",{providerId:u.providerId,configuredModel:u.configuredModel||"",baseUrl:u.baseUrl||"",envKey:u.envKey,hasApiToken:!!u.apiToken});let m=null;try{if(u.baseUrl&&gk(u.baseUrl)){m=await yk(u.baseUrl);let S=pk(i,u.providerId,m.proxiedBaseUrl);S.changed?(i=S.content,N("compatibility-proxy:enabled",{providerId:u.providerId,upstreamBaseUrl:u.baseUrl,proxiedBaseUrl:m.proxiedBaseUrl})):(N("compatibility-proxy:skipped",{providerId:u.providerId,upstreamBaseUrl:u.baseUrl,reason:"config did not contain a rewritable base_url entry"}),m.close(),m=null)}if(i===o)return null;$l(r,i,"utf8");let f=!1;return{close:()=>{if(!f){f=!0;try{$l(r,o,"utf8")}finally{m?.close()}}}}}catch(f){throw m?.close(),f}},wk=e=>{let t=e?.CODEX_HOME?.trim(),r=t?Fn.join(t,"config.toml"):"",n=t?Fn.join(t,"auth.json"):"",o=(()=>{if(!r)return"";try{return jn(r,"utf8")}catch{return""}})(),s=(()=>{if(!n)return"";try{return jn(n,"utf8")}catch{return""}})();return le({configContent:o,authContent:s,env:e})},Kl=e=>{let t=Qt(e);return t?/^reconnecting\.\.\.\s*\d+\/\d+$/i.test(t):!1},xk=["stream disconnected before completion","stream closed before response.completed","websocket stream closed before response.completed"],Ar=e=>{let t=Qt(e);if(!t)return!1;let r=t.toLowerCase();return Kl(t)||xk.some(n=>r.includes(n))},Sk=e=>{let t=Qt(e);return t?Kl(t)?t:Ar(t)?"\u8FDE\u63A5\u77ED\u6682\u4E2D\u65AD\uFF0CCodex \u6B63\u5728\u91CD\u8BD5":`Codex \u6B63\u5728\u91CD\u8BD5\uFF1A${t.split(`
97
+ `).map(n=>n.trim()).find(Boolean)||t}`:"Codex \u6B63\u5728\u91CD\u8BD5"},je=(e,t=new Set)=>{if(typeof e=="string"){let r=Qt(e);if(!r)return[];try{let n=je(JSON.parse(r),t);return n.length>0?n:[r]}catch{return[r]}}return!e||typeof e!="object"?[]:t.has(e)?[]:(t.add(e),Array.isArray(e)?e.flatMap(r=>je(r,t)):Object.values(e).flatMap(r=>je(r,t)))},$s=e=>{let t=e.filter(Gl),r=t.find(n=>!Ar(n));return r||(t[0]?t[0]:e.find(Boolean)||"")},Us=e=>$s(je(e)),jl=e=>{let t=[...e.error?.details?je(e.error.details):[],...e.error?.message?je(e.error.message):[],...je(e.error)];return $s(t)||(e.status==="failed"?"Codex \u6267\u884C\u5931\u8D25":"")},Ck=(e,t,r)=>{let n=Qt(e),s=[...[...t.trim().split(`
98
+ `).map(a=>a.trim()).filter(Boolean)].reverse().flatMap(a=>je(a)),...je(t)],i=$s(s);return i&&!Gl(n)?i:n&&!Ar(n)?n:i&&!Ar(i)?i:n||i?"Codex \u8FDE\u63A5\u77ED\u6682\u4E2D\u65AD\uFF0C\u4F46\u8FDB\u7A0B\u5DF2\u9000\u51FA\u4E14\u672A\u6536\u5230\u5B8C\u6210\u4E8B\u4EF6\u3002\u8BF7\u91CD\u8BD5\u672C\u8F6E\u5DE5\u4F5C\u533A\u5BF9\u8BDD\u3002":`Codex \u6267\u884C\u5931\u8D25\uFF08\u9000\u51FA\u7801 ${r??-1}\uFF09`},Fl=(e,t,r,n)=>{M("Codex",e.onEvent,{type:"message.updated",properties:{info:{id:t,role:"assistant"}}}),M("Codex",e.onEvent,{type:"message.part.updated",properties:{part:{id:`${t}:text`,messageID:t,type:"text",text:r},delta:n}})},ql=(e,t,r,n,o)=>{M("Codex",e.onEvent,{type:"message.part.updated",properties:{part:{id:r,messageID:t,type:"reasoning",text:n},delta:o}})},Hl=(e,t,r,n,o,s)=>{let i=r.type==="fileChange"?"apply_patch":"shell",a=r.type==="commandExecution"?r.command:r.type==="fileChange"?JSON.stringify(r.changes??[],null,2):void 0;M("Codex",e.onEvent,{type:"message.part.updated",properties:{part:{id:r.id,messageID:t,type:"tool",tool:i,state:{status:n,raw:a,output:o,error:s}}}})},Ns=(e,t)=>{e.stdin.write(`${JSON.stringify(t)}
99
+ `)},Vl=async e=>{let t=En("codex");if(!t)throw new Error("\u672A\u68C0\u6D4B\u5230 `codex` \u53EF\u6267\u884C\u6587\u4EF6\u3002");let r=e.agentSettings&&"sandbox"in e.agentSettings?e.agentSettings:void 0,n=Oe(e.executionModel)?.providerId||"openai",o=Oe(r?.defaultModel)?.providerId||"openai",s=Ue(Ct("Codex",n,e.executionModel))??Ue(Ct("Codex",o,r?.defaultModel)),i=ck(r?.approval),a=e.executionModel?.trim()||"",c=await kk({executionModel:a,runtimeEnv:e.runtimeEnv}),l={...Xt(),...e.runtimeEnv??{}},d=wk(l);return N("launch:spawn",{cwd:e.cwd,executionModel:a||"default",selectedModel:s||"",requestedProviderId:n,defaultProviderId:o,codexHomePresent:!!l.CODEX_HOME?.trim(),runtimeArgCount:(e.runtimeArgs??[]).length,runtimeEnvKeys:Object.keys(e.runtimeEnv??{}).filter(p=>p.startsWith("OPENAI_")||p.startsWith("CODEX_")||p.startsWith("VIBEMUX_CODEX_")).sort(),runtimeHasOpenAiApiKey:!!l.OPENAI_API_KEY?.trim(),runtimeOpenAiBaseUrl:l.OPENAI_BASE_URL||"",runtimeProviderId:d.providerId,runtimeProviderEnvKey:d.envKey,runtimeHasProviderApiToken:!!d.apiToken,compatibilityProxyEnabled:!!c}),new Promise((p,u)=>{let m=ok(t,["app-server",...e.runtimeArgs??[]],{cwd:e.cwd,env:l,stdio:["pipe","pipe","pipe"]});N("launch:child-started",{pid:m.pid??null});let f=1,S="",w="",g="",I="",v="",E=!1,F="",O=new Map,z=new Map,D=new Map,L=y=>{for(let C of O.values())C.reject(y);O.clear()},j=(y,C)=>{let k=f++;return N("rpc:request",{id:k,method:y,params:Le(C)}),Ns(m,{jsonrpc:"2.0",id:k,method:y,params:C}),new Promise((B,ue)=>{O.set(k,{method:y,resolve:yt=>B(yt),reject:ue})})},J=(y,C)=>{N("rpc:response",{id:y,result:Le(C)}),Ns(m,{jsonrpc:"2.0",id:y,result:C})},x=()=>{m.killed||m.kill("SIGTERM")},b=()=>{x()};e.signal?.addEventListener("abort",b,{once:!0});let A=y=>{if(y.method==="item/commandExecution/requestApproval"){let C=y.params??{};i.command==="decline"&&M("Codex",e.onEvent,{type:"permission.updated",properties:{title:C.reason?.trim()||C.command?.trim()||"\u547D\u4EE4\u6267\u884C\u6743\u9650"}}),J(y.id,{decision:i.command});return}if(y.method==="item/fileChange/requestApproval"){let C=y.params??{};i.fileChange==="decline"&&M("Codex",e.onEvent,{type:"permission.updated",properties:{title:C.reason?.trim()||"\u6587\u4EF6\u4FEE\u6539\u6743\u9650"}}),J(y.id,{decision:i.fileChange});return}if(y.method==="item/tool/requestUserInput"){let C=y.params??{};M("Codex",e.onEvent,{type:"permission.updated",properties:{title:C.questions?.[0]?.header?.trim()||C.questions?.[0]?.question?.trim()||"\u7B49\u5F85\u7528\u6237\u8F93\u5165"}}),J(y.id,{answers:{}});return}J(y.id,null)},h=(y,C)=>{if(y.type==="agentMessage"){let k=y;F=k.id,z.set(k.id,k.text),k.text.trim()&&(I=k.text.trim()),Fl(e,k.id,k.text);return}if(y.type==="reasoning"){let k=y,B=k.summary?.join("")||k.content?.join("")||"";B&&(D.set(k.id,B),ql(e,F||`${g||"codex"}:assistant`,`${k.id}:reasoning`,B));return}if(y.type==="commandExecution"){let k=y,B=C==="started"?"running":k.status==="completed"?"completed":"error";Hl(e,F||void 0,k,B,k.aggregatedOutput??void 0,k.status==="failed"||k.status==="declined"?k.aggregatedOutput||`\u547D\u4EE4\u5931\u8D25\uFF08\u9000\u51FA\u7801 ${k.exitCode??-1}\uFF09`:void 0);return}if(y.type==="fileChange"){let k=y,B=C==="started"?"running":k.status==="success"?"completed":"error";Hl(e,F||void 0,k,B,JSON.stringify(k.changes??[],null,2),k.status==="failed"||k.status==="declined"?"\u6587\u4EF6\u4FEE\u6539\u672A\u5B8C\u6210":void 0)}},P=async y=>{if(y.method==="thread/started"){g=y.params.thread.id,N("notification:thread-started",{threadId:g});return}if(y.method==="turn/started"){let C=y.params;g=g||C.threadId,N("notification:turn-started",{threadId:C.threadId,turnId:C.turn.id}),M("Codex",e.onEvent,{type:"session.status",properties:{status:{type:"busy",message:"Codex \u6B63\u5728\u5904\u7406\u8BF7\u6C42"}}});return}if(y.method==="item/started"){h(y.params.item,"started");return}if(y.method==="item/completed"){h(y.params.item,"completed");return}if(y.method==="item/agentMessage/delta"){let C=y.params;F=C.itemId;let k=`${z.get(C.itemId)??""}${C.delta??""}`;z.set(C.itemId,k),k.trim()&&(I=k.trim()),Fl(e,C.itemId,k,C.delta);return}if(y.method==="item/reasoning/textDelta"||y.method==="item/reasoning/summaryTextDelta"){let C=y.params,k=y.method==="item/reasoning/textDelta"?`content:${C.contentIndex??0}`:`summary:${C.summaryIndex??0}`,B=`${C.itemId}:reasoning:${k}`,ue=`${D.get(B)??""}${C.delta??""}`;D.set(B,ue),ql(e,F||`${g||"codex"}:assistant`,B,ue,C.delta);return}if(y.method==="turn/completed"){let C=y.params;g=g||C.threadId,E=C.turn.status==="completed",N("notification:turn-completed",{threadId:C.threadId,turnId:C.turn.id,status:C.turn.status,error:Le(C.turn.error??null),extractedError:C.turn.status==="failed"?jl(C.turn)||"Codex \u6267\u884C\u5931\u8D25":""}),C.turn.status==="failed"?(v=jl(C.turn)||"Codex \u6267\u884C\u5931\u8D25",M("Codex",e.onEvent,{type:"session.error",properties:{error:v}})):M("Codex",e.onEvent,{type:"session.status",properties:{status:{type:"idle",message:"Codex \u5DF2\u5B8C\u6210"}}}),x();return}if(y.method==="error"){let C=y.params;N("notification:error",{threadId:C.threadId||"",turnId:C.turnId||"",willRetry:!!C.willRetry,message:C.error?.message||"",additionalDetails:C.error?.additionalDetails||"",codexErrorInfo:Le(C.error?.codexErrorInfo??null)});let k=Us(y.params)||"Codex \u6267\u884C\u5931\u8D25";if(C.willRetry||Ar(k)){M("Codex",e.onEvent,{type:"session.status",properties:{status:{type:"retry",message:Sk(k)}}});return}v=k,M("Codex",e.onEvent,{type:"session.error",properties:{error:v}}),x()}},R=y=>{let C=y.trim();if(!C)return;let k=xr(C);if(!k){N("stdout:non-json",{line:C.slice(0,240)});return}if(typeof k.id<"u"&&(typeof k.result<"u"||typeof k.error<"u")){let B=O.get(k.id);if(!B){N("rpc:orphaned-response",{id:k.id,hasResult:typeof k.result<"u",error:Le(k.error??null)});return}if(O.delete(k.id),k.error){N("rpc:error",{id:k.id,method:B.method,error:Le(k.error)}),B.reject(new Error(Us(k.error)||"Codex app-server \u8BF7\u6C42\u5931\u8D25"));return}N("rpc:result",{id:k.id,method:B.method,result:Le(k.result)}),B.resolve(k.result);return}if(typeof k.id<"u"&&typeof k.method=="string"){A(k);return}typeof k.method=="string"&&P(k)};m.stdout.on("data",y=>{S+=y.toString();let C=S.split(`
100
+ `);S=C.pop()??"";for(let k of C)R(k)}),m.stderr.on("data",y=>{let C=y.toString();w+=C;for(let k of C.split(`
101
+ `).map(B=>B.trim()).filter(Boolean))N("stderr",{line:k.slice(0,320)})}),m.on("error",y=>{c?.close(),e.signal?.removeEventListener("abort",b),N("launch:child-error",{error:y.message}),L(y),u(y)}),m.on("close",y=>{if(c?.close(),e.signal?.removeEventListener("abort",b),S.trim()&&R(S),e.signal?.aborted){N("launch:close",{code:y,aborted:!0,completed:E,lastError:v}),L(Ie(e.signal)),u(Ie(e.signal));return}if(!E||v){let C=new Error(Ck(v,w,y));N("launch:close",{code:y,aborted:!1,completed:E,lastError:v,finalError:C.message,stderrTail:w.trim().split(`
102
+ `).filter(Boolean).slice(-5)}),L(C),u(C);return}N("launch:close",{code:y,aborted:!1,completed:E,lastError:v,sessionId:g||"",outputPreview:(I||"Codex \u672A\u8FD4\u56DE\u6587\u672C\u8F93\u51FA\u3002").slice(0,120)}),L(new Error("Codex \u4F1A\u8BDD\u5DF2\u7ED3\u675F")),p({output:I||"Codex \u672A\u8FD4\u56DE\u6587\u672C\u8F93\u51FA\u3002",sessionId:g||void 0})}),(async()=>{try{await j("initialize",{clientInfo:{name:"vibemux-worker",version:"0.1.1"},capabilities:{experimentalApi:!0}}),Ns(m,{jsonrpc:"2.0",method:"initialized"});let y=await j("account/read",{refreshToken:!1}),C=!!d.apiToken;if(N("launch:account-read",{hasAccount:!!y.account,requiresOpenaiAuth:!!y.requiresOpenaiAuth,providerId:d.providerId,providerEnvKey:d.envKey,hasProviderCredential:C}),y.requiresOpenaiAuth&&!y.account){if(!C)throw N("launch:account-decision",{ok:!1,reason:"openai-auth-required-without-provider-credential",providerId:d.providerId,providerEnvKey:d.envKey}),new Error("Codex \u9700\u8981\u5148\u767B\u5F55\u540E\u624D\u80FD\u6267\u884C\u3002");N("launch:account-decision",{ok:!0,reason:"managed-provider-credentials-present",providerId:d.providerId,providerEnvKey:d.envKey})}else N("launch:account-decision",{ok:!0,reason:y.account?"account-present":"provider-auth-not-required",providerId:d.providerId,providerEnvKey:d.envKey});let k=e.resumeSessionId?.trim(),B;if(k)try{B=await j("thread/resume",ik(e.cwd,k,s,r))}catch(ue){if(!lk(ue))throw ue;B=await j("thread/start",Ll(e.cwd,s,r))}else B=await j("thread/start",Ll(e.cwd,s,r));g=B.thread.id,await j("turn/start",{threadId:g,input:[{type:"text",text:e.prompt,text_elements:[]}],collaborationMode:ak(B.model)})}catch(y){v=uk(y)||"Codex \u521D\u59CB\u5316\u5931\u8D25",N("launch:init-error",{error:v,raw:Le(y)}),M("Codex",e.onEvent,{type:"session.error",properties:{error:v}}),x()}})()})};import{readFile as Sw}from"node:fs/promises";import{createAgentSession as Cw,DefaultResourceLoader as vw}from"@mariozechner/pi-coding-agent";import{Client as vk}from"@modelcontextprotocol/sdk/client/index.js";import{SSEClientTransport as Pk}from"@modelcontextprotocol/sdk/client/sse.js";import{StdioClientTransport as Ik}from"@modelcontextprotocol/sdk/client/stdio.js";import{StreamableHTTPClientTransport as Ek}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{defineTool as bk}from"@mariozechner/pi-coding-agent";var Tk="__",Jl=e=>e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/^_+|_+$/g,""),Rk=(e,t,r)=>{let n=[Jl(e),Jl(t)].filter(Boolean).join(Tk)||"mcp_tool",o=n,s=2;for(;r.has(o);)o=`${n}_${s}`,s+=1;return r.add(o),o},Ak=e=>{if(!e||typeof e!="object")return"";let t=e;if(t.type==="text"&&typeof t.text=="string")return t.text.trim();if(t.type==="resource"&&t.resource&&typeof t.resource=="object"){let r=t.resource;if(typeof r.text=="string")return r.text.trim()}return t.type==="resource_link"&&typeof t.uri=="string"?[t.name,t.uri].filter(r=>typeof r=="string"&&r.trim().length>0).join(" - "):t.type==="image"?"[image]":t.type==="audio"?"[audio]":""},Mk=e=>{if("toolResult"in e)return typeof e.toolResult=="string"?e.toolResult.trim()||"\u5DE5\u5177\u5DF2\u6267\u884C\u5B8C\u6210\uFF0C\u4F46\u6CA1\u6709\u8FD4\u56DE\u53EF\u5C55\u793A\u7684\u6587\u672C\u7ED3\u679C\u3002":e.toolResult===void 0?"\u5DE5\u5177\u5DF2\u6267\u884C\u5B8C\u6210\uFF0C\u4F46\u6CA1\u6709\u8FD4\u56DE\u53EF\u5C55\u793A\u7684\u6587\u672C\u7ED3\u679C\u3002":JSON.stringify(e.toolResult,null,2);let t=Array.isArray(e.content)?e.content.map(Ak).filter(Boolean).join(`
103
+
104
+ `).trim():"";return t||("structuredContent"in e&&e.structuredContent!==void 0?JSON.stringify(e.structuredContent,null,2):"\u5DE5\u5177\u5DF2\u6267\u884C\u5B8C\u6210\uFF0C\u4F46\u6CA1\u6709\u8FD4\u56DE\u53EF\u5C55\u793A\u7684\u6587\u672C\u7ED3\u679C\u3002")},Ok=e=>{if(typeof e.command=="string"&&e.command.trim())return new Ik({command:"sh",args:["-lc",e.command.trim()],env:Xt()});if(!e.url?.trim())return null;let t=e.headers??{},r=new URL(e.url);return e.type==="remote"&&/\/sse(?:$|[/?#])/i.test(r.pathname)?new Pk(r,{requestInit:Object.keys(t).length>0?{headers:t}:void 0}):new Ek(r,{requestInit:Object.keys(t).length>0?{headers:t}:void 0})},_k=e=>{let t=`${e.serverName} \xB7 ${e.toolName}`;return bk({name:e.exposedToolName,label:t,description:e.description?.trim()||`${e.serverName} MCP tool: ${e.toolName}`,parameters:e.inputSchema??{type:"object",properties:{},additionalProperties:!0},execute:async(r,n)=>{let o=await e.client.callTool({name:e.toolName,arguments:n}),s=Mk(o);if(o.isError)throw new Error(s);return{content:[{type:"text",text:s}],details:{serverName:e.serverName,toolName:e.toolName,structuredContent:"structuredContent"in o?o.structuredContent:void 0}}}})},Bk=async e=>{let t=Ok(e.materializedServer);if(!t)return{client:null,tools:[],warning:`${e.serverPolicy.name} \u7F3A\u5C11\u53EF\u8FDE\u63A5\u7684 MCP transport\uFF0C\u5DF2\u8DF3\u8FC7\u3002`};let r=new vk({name:"vibemux-pi-mcp",version:"0.1.8"});await r.connect(t);let o=(await r.listTools()).tools.map(s=>_k({client:r,serverName:e.serverPolicy.name,toolName:s.name,description:s.description,inputSchema:s.inputSchema,exposedToolName:Rk(e.serverPolicy.name,s.name,e.exposedToolNames)}));return{client:r,tools:o,warning:void 0}},Xl=async e=>{let t=e.workerConfig??T(),r=new Set,n=[],o=[],s=[],i=e.mcpServers?.filter(c=>c.enabled&&c.capabilityMode==="resources+tools")??[],a=ot(i,{cloudUrl:t.cloudUrl,executorToken:t.executorToken,actingUserId:e.actingUserId});for(let c of i){let l=a[c.id];if(!l){n.push(`${c.name} \u65E0\u6CD5\u7269\u5316\u4E3A Pi MCP bridge\uFF0C\u5DF2\u8DF3\u8FC7\u3002`);continue}try{let d=await Bk({exposedToolNames:r,materializedServer:l,serverPolicy:c});d.warning&&n.push(d.warning),d.client&&o.push(d.client),s.push(...d.tools)}catch(d){n.push(`${c.name} MCP bridge \u8FDE\u63A5\u5931\u8D25\uFF1A${d instanceof Error?d.message:"unknown error"}`)}}return{tools:s,cleanup:async()=>{await Promise.allSettled(o.map(c=>c.close()))},warnings:n}};import{mkdtemp as Wk,mkdir as Dk,rm as Yl,writeFile as Nk}from"node:fs/promises";import Uk from"node:os";import Mr from"node:path";var $k={"image/avif":".avif","image/bmp":".bmp","image/gif":".gif","image/jpeg":".jpg","image/jpg":".jpg","image/png":".png","image/svg+xml":".svg","image/webp":".webp"},Lk=(e,t)=>{let r=Mr.parse(e),n=(r.name||t).replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,""),o=(r.ext||"").replace(/[^a-zA-Z0-9.]+/g,"");return`${n||t}${o}`},jk=(e,t)=>{let r=(e||"").replace(/^ws:/,"http:").replace(/^wss:/,"https:");if(/^https?:\/\//i.test(t))return t;if(!r)throw new Error("\u5F53\u524D worker \u672A\u914D\u7F6E cloudUrl\uFF0C\u65E0\u6CD5\u4E0B\u8F7D\u56FE\u7247\u9644\u4EF6\u3002");return new URL(t,r).toString()},Fk=(e,t)=>{let r=Mr.extname(e);return r||t&&$k[t]||""},qn=async e=>{let t=e.attachments??[];if(t.length===0)return{attachments:[],cleanup:async()=>{}};let r=Mr.join(Uk.tmpdir(),"vibemux-task-chat-attachments-");await Dk(Mr.dirname(r),{recursive:!0});let n=await Wk(r);try{return{attachments:await Promise.all(t.map(async(s,i)=>{let a=jk(e.cloudUrl,s.url),c=await fetch(a,{signal:e.signal});if(!c.ok)throw new Error(`\u56FE\u7247\u9644\u4EF6\u4E0B\u8F7D\u5931\u8D25\uFF1A${s.filename}`);let l=c.headers.get("content-type")?.split(";")[0]?.trim()||s.contentType,d=Fk(s.filename,l),p=Lk(`${i+1}-${s.filename||`image-${i+1}`}${d&&!s.filename.endsWith(d)?d:""}`,`image-${i+1}`),u=Mr.join(n,p),m=Buffer.from(await c.arrayBuffer());return await Nk(u,m),{...s,contentType:l,absoluteUrl:a,localPath:u}})),cleanup:async()=>{await Yl(n,{recursive:!0,force:!0})}}}catch(o){throw await Yl(n,{recursive:!0,force:!0}).catch(()=>{}),o}},Ql=(e,t)=>{if(t.length===0)return e;let r="\u7528\u6237\u5728\u672C\u8F6E\u6D88\u606F\u4E2D\u9644\u5E26\u4E86\u56FE\u7247\u9644\u4EF6\uFF0C\u8BF7\u4F18\u5148\u7ED3\u5408\u8FD9\u4E9B\u56FE\u7247\u7EE7\u7EED\u5206\u6790\u548C\u56DE\u7B54\u3002",n=t.flatMap((o,s)=>[`\u9644\u4EF6 ${s+1}: ${o.filename}`,`- \u672C\u5730\u8DEF\u5F84: ${o.localPath}`,`- \u6765\u6E90 URL: ${o.absoluteUrl}`]);return[e.trim(),"",r,...n,"","\u8FD9\u4E9B\u9644\u4EF6\u4F4D\u4E8E\u5F53\u524D\u673A\u5668\u7684\u4E34\u65F6\u76EE\u5F55\uFF0C\u4E0D\u5C5E\u4E8E\u4ED3\u5E93\u6587\u4EF6\u3002"].filter(Boolean).join(`
105
+ `)};import{createHash as qk,randomUUID as Hk}from"node:crypto";import{existsSync as Zl,mkdirSync as js,readFileSync as Gk,rmSync as zk,writeFileSync as Kk}from"node:fs";import ed from"node:os";import ft from"node:path";import{AuthStorage as Vk,ModelRegistry as td,SessionManager as Or,SettingsManager as Jk}from"@mariozechner/pi-coding-agent";var Xk=["text"],Yk={input:0,output:0,cacheRead:0,cacheWrite:0},Qk=new Map([["claude","anthropic"],["dashscope","qwen"],["gemini","google"],["glm","zhipu"],["grok","xai"],["kimi","moonshot"],["volcengine","doubao"]]),Zk=e=>{let t=e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return Qk.get(t)||t},ew=e=>e.trim().toUpperCase().replace(/[^A-Z0-9]+/g,"_").replace(/^_+|_+$/g,"")||"MODEL",tw=e=>{let t=e.trim().toLowerCase();return t==="openai"?"OPENAI":t==="anthropic"||t==="claude"?"ANTHROPIC":t==="google"||t==="gemini"?"GOOGLE":t==="minimax"?"MINIMAX":t==="minimax-cn"?"MINIMAX_CN":ew(e)},rw=e=>{let t=e?.trim()||"";if(!t)return null;let r=t.indexOf("/");if(r<0)return null;let n=Zk(t.slice(0,r)),o=t.slice(r+1).trim();return!n||!o?null:{providerId:n,modelId:o}},nw=(e,t)=>{let r=t?.VIBEMUX_PI_AGENT_DIR?.trim();if(r)return r;let n=e?.agentDir?.trim()||T().piAgentDir?.trim();return n||ft.join(ed.homedir(),".pi","agent")},ow=(e,t)=>{let r=qk("sha1").update(`${t}::${e}`).digest("hex").slice(0,16);return ft.join(t,"sessions-vibemux",r)},sw=(e,t)=>{let r=tw(e.providerId);return{apiKey:t?.[`${r}_API_KEY`]?.trim()||"",baseUrl:t?.[`${r}_BASE_URL`]?.trim()||""}},iw=(e,t)=>{let r=`${e.providerId} ${e.modelId} ${t||""}`.toLowerCase();return r.includes("anthropic")||r.includes("claude")?"anthropic-messages":r.includes("google")||r.includes("gemini")?"google-generative-ai":"openai-completions"},aw=e=>{let t=`${e.providerId}/${e.modelId}`.toLowerCase();return t.includes("gpt-5")||t.includes("claude")||t.includes("gemini")||t.includes("deepseek")||t.includes("qwen")||t.includes("kimi")},cw=e=>{let t=`${e.providerId}/${e.modelId}`.toLowerCase();return t.includes("vision")||t.includes("omni")||t.includes("gemini")||t.includes("claude")||t.includes("gpt-4")||t.includes("gpt-5")?["text","image"]:[...Xk]},lw=e=>{if(!Zl(e))return{};try{let t=JSON.parse(Gk(e,"utf8"));return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}catch{return{}}},dw=e=>{let t=ft.join(e.agentDir,"models.json"),r=lw(t),n=r.providers&&typeof r.providers=="object"?r.providers:{},o=e.baseRegistry.find(e.model.providerId,e.model.modelId),s={...e.apiKey?{apiKey:e.apiKey}:{},...e.baseUrl?{baseUrl:e.baseUrl}:{},api:o?.api??iw(e.model,e.baseUrl),models:[{id:e.model.modelId,name:o?.name??e.model.modelId,reasoning:o?.reasoning??aw(e.model),input:o?.input??cw(e.model),contextWindow:o?.contextWindow??128e3,maxTokens:o?.maxTokens??16384,cost:o?.cost??Yk,...o?.headers?{headers:o.headers}:{},...o?.compat?{compat:o.compat}:{}}]};return{providers:{...n,[e.model.providerId]:s}}},uw=e=>{let t=ft.join(ed.tmpdir(),`vibemux-pi-models-${Hk()}`);js(t,{recursive:!0});let r=dw({agentDir:e.agentDir,baseRegistry:e.baseRegistry,model:e.model,apiKey:e.apiKey,baseUrl:e.baseUrl}),n=ft.join(t,"models.json");return Kk(n,`${JSON.stringify(r,null,2)}
106
+ `,"utf8"),{modelRegistry:td.create(e.authStorage,n),cleanup:()=>{zk(t,{recursive:!0,force:!0})}}},pw=async e=>{let t=ow(e.cwd,e.agentDir);js(t,{recursive:!0});let r=e.resumeSessionId?.trim();if(!r){let i=Or.continueRecent(e.cwd,t);return Ls(i),i}if(Zl(r)){let i=Or.open(r,t,e.cwd);return Ls(i),i}let o=(await Or.list(e.cwd,t)).find(i=>i.id===r),s=o?Or.open(o.path,t,e.cwd):Or.continueRecent(e.cwd,t);return Ls(s),s},Hn=e=>!!(e&&typeof e=="object"&&!Array.isArray(e)),mw=e=>typeof e=="string"?e.trim().length>0:Array.isArray(e)?e.some(t=>Hn(t)&&t.type==="text"&&typeof t.text=="string"&&t.text.trim().length>0):!1,gw=e=>Array.isArray(e)?e.some(t=>Hn(t)&&t.type==="toolCall"&&(typeof t.id!="string"||!t.id.trim()||typeof t.name!="string"||!t.name.trim())):!1,fw=e=>e?.role!=="user"&&e?.role!=="toolResult"||!Array.isArray(e.content)?!1:e.content.some(t=>Hn(t)?t.type==="input_image"||t.type==="image_url"?!0:t.type!=="image"?!1:typeof t.data!="string"||!t.data.trim()||typeof t.mimeType!="string"||!t.mimeType.trim()||typeof t.url=="string"||typeof t.image_url=="string"||Hn(t.source):!1),hw=e=>e?.role==="toolResult"&&(typeof e.toolCallId!="string"||!e.toolCallId.trim()||typeof e.toolName!="string"||!e.toolName.trim()),yw=e=>{let t=e?.errorMessage?.trim().toLowerCase()||"";return e?.role==="assistant"&&e.stopReason==="error"&&(t.includes("call_id")&&t.includes("empty string")||t.includes("unknown parameter")&&t.includes("content[")&&t.includes(".url"))},kw=e=>{if(e.type!=="message")return!1;let t=e.message;return gw(t?.content)||fw(t)||hw(t)||yw(t)},ww=e=>{let t=e.message;return e.type==="message"&&!!e.id&&t?.role==="assistant"&&t.stopReason!=="error"&&mw(t.content)},xw=e=>{let t="";for(let r of e){if(kw(r))return t||null;ww(r)&&(t=r.id??"")}},Ls=e=>{let t=xw(e.getBranch());return t===void 0?!1:(t?e.createBranchedSession(t):e.newSession(),!0)},rd=async e=>{let t=nw(e.settings,e.runtimeEnv);js(t,{recursive:!0});let r=Vk.create(ft.join(t,"auth.json")),n=rw(e.executionModel),o=n?sw(n,e.runtimeEnv):{apiKey:"",baseUrl:""};n&&o.apiKey&&r.setRuntimeApiKey(n.providerId,o.apiKey);let s=td.create(r,ft.join(t,"models.json")),i=n&&(o.baseUrl||!s.find(n.providerId,n.modelId))?uw({agentDir:t,authStorage:r,baseRegistry:s,model:n,apiKey:o.apiKey||void 0,baseUrl:o.baseUrl||void 0}):null,a=i?.modelRegistry??s,c=Jk.create(e.cwd,t);n&&c.applyOverrides({defaultProvider:n.providerId,defaultModel:n.modelId});let l=n?a.find(n.providerId,n.modelId):void 0;return l&&o.apiKey&&r.setRuntimeApiKey(l.provider,o.apiKey),{agentDir:t,authStorage:r,modelRegistry:a,selectedModel:l,sessionManager:await pw({agentDir:t,cwd:e.cwd,resumeSessionId:e.resumeSessionId}),settingsManager:c,cleanup:()=>{i?.cleanup()}}};var Kn=e=>!!(e&&typeof e=="object"&&!Array.isArray(e)),Pw=e=>Kn(e)&&e.type==="toolCall",nd=e=>!!(e.id?.trim()&&e.name?.trim()),Iw=e=>Kn(e)&&Object.keys(e).length>0,Ew=(e,t)=>({...Kn(e)?e:{},...Kn(t)?t:{}}),zn=e=>{if(e.role!=="assistant"||!Array.isArray(e.content))return e;let t=[],r,n=!1;for(let o of e.content){if(!Pw(o)){t.push(o),r=void 0;continue}if(nd(o)){let s={...o};t.push(s),r=s,s!==o&&(n=!0);continue}if(r&&Iw(o.arguments)){r.arguments=Ew(r.arguments,o.arguments),n=!0;continue}n=!0}return n?{...e,content:t}:e},bw=e=>{let t={...e};return e.partial&&(t.partial=zn(e.partial)),e.message&&(t.message=zn(e.message)),e.error&&(t.error=zn(e.error)),e.toolCall&&!nd(e.toolCall)&&delete t.toolCall,t},Tw=e=>{let t;return{async*[Symbol.asyncIterator](){for await(let r of e){let n=bw(r);n.type==="done"&&n.message&&(t=n.message),n.type==="error"&&n.error&&(t=n.error),yield n}},result:async()=>{if(t)return t;let r=await e.result?.();return r?zn(r):{role:"assistant",content:[]}}}},Rw=e=>{let t=e.agent,r=t?.streamFn;return!t||!r?()=>{}:(t.streamFn=async(...n)=>{let o=await r.apply(t,n);if(!o||typeof o!="object")return o;let s=o;return typeof s[Symbol.asyncIterator]!="function"?o:Tw(s)},()=>{t.streamFn=r})},od=e=>{let t=e;if(t?.role!=="assistant")return[];if(typeof t.content=="string"){let r=t.content.trim();return r?[{index:0,text:r,type:"text"}]:[]}return Array.isArray(t.content)?t.content.flatMap((r,n)=>{let o=r;if(o.type==="text"){let s=typeof o.text=="string"?o.text.trim():typeof o.content=="string"?o.content.trim():"";return s?[{index:n,text:s,type:"text"}]:[]}if(o.type==="thinking"){let s=typeof o.thinking=="string"?o.thinking.trim():typeof o.text=="string"?o.text.trim():"";return s?[{index:n,text:s,type:"thinking"}]:[]}return[]}):[]},sd=e=>od(e).filter(t=>t.type==="text").map(t=>t.text).join(`
107
+
108
+ `).trim(),id=e=>{let t=e;return t?.role!=="assistant"||t.stopReason!=="error"?"":typeof t.errorMessage=="string"?t.errorMessage.trim():""},Aw=e=>{for(let t of[...e].reverse())if(t?.role==="assistant")return t},ad=(e,t)=>{M("Pi",e.onEvent,{type:"message.updated",properties:{info:{id:t.activeAssistantMessageId,role:"assistant"}}})},Hs=(e,t,r,n,o,s)=>{let i=r==="text"?t.textParts:t.reasoningParts;(i.get(n)??"")!==o&&(i.set(n,o),ad(e,t),M("Pi",e.onEvent,{type:"message.part.updated",properties:{part:{id:`${t.activeAssistantMessageId}:${r}:${n}`,messageID:t.activeAssistantMessageId,type:r,text:o},delta:s}}))},Mw=(e,t,r,n)=>{let o=`${t.textParts.get(r)??""}${n}`;Hs(e,t,"text",r,o,n)},Ow=(e,t,r,n)=>{let o=`${t.reasoningParts.get(r)??""}${n}`;Hs(e,t,"reasoning",r,o,n)},Gn=(e,t,r)=>{t.latestAssistantMessage=r;for(let n of od(r)){let o=(n.type==="text"?t.textParts:t.reasoningParts).get(n.index)??"",s=n.text.startsWith(o)&&n.text.slice(o.length)||void 0;Hs(e,t,n.type==="text"?"text":"reasoning",n.index,n.text,s)}},Fs=(e,t,r)=>{ad(e,t),M("Pi",e.onEvent,{type:"message.part.updated",properties:{part:{id:r.toolCallId,messageID:t.activeAssistantMessageId,type:"tool",tool:r.toolName,state:{status:r.status,raw:r.raw,output:r.output,error:r.error}}}})},qs=e=>!!(e.toolCallId?.trim()&&e.toolName?.trim()),_w=(e,t,r)=>{if(r.type==="agent_start"){M("Pi",e.onEvent,{type:"session.status",properties:{status:{type:"busy",message:"Pi \u4F1A\u8BDD\u6267\u884C\u4E2D"}}});return}if(r.type==="turn_start"){t.assistantCounter+=1,t.activeAssistantMessageId=`pi:${t.assistantCounter}`,t.latestAssistantMessage=void 0,t.textParts.clear(),t.reasoningParts.clear();return}if(r.type==="message_update"){t.latestAssistantMessage=r.message,r.assistantMessageEvent.type==="text_delta"&&Mw(e,t,r.assistantMessageEvent.contentIndex,r.assistantMessageEvent.delta),r.assistantMessageEvent.type==="thinking_delta"&&Ow(e,t,r.assistantMessageEvent.contentIndex,r.assistantMessageEvent.delta),(r.assistantMessageEvent.type==="text_end"||r.assistantMessageEvent.type==="thinking_end"||r.assistantMessageEvent.type==="done")&&Gn(e,t,r.message);return}if(r.type==="message_end"&&r.message.role==="assistant"){Gn(e,t,r.message);return}if(r.type==="turn_end"&&r.message.role==="assistant"){Gn(e,t,r.message);return}if(r.type==="tool_execution_start"){if(!qs(r))return;Fs(e,t,{toolCallId:r.toolCallId,toolName:r.toolName,raw:JSON.stringify(r.args??{},null,2),status:"running"});return}if(r.type==="tool_execution_update"){if(!qs(r))return;Fs(e,t,{toolCallId:r.toolCallId,toolName:r.toolName,raw:JSON.stringify(r.args??{},null,2),output:JSON.stringify(r.partialResult??{},null,2),status:"running"});return}if(r.type==="tool_execution_end"){if(!qs(r))return;Fs(e,t,{toolCallId:r.toolCallId,toolName:r.toolName,output:JSON.stringify(r.result??{},null,2),error:r.isError?JSON.stringify(r.result??{},null,2):void 0,status:r.isError?"error":"completed"});return}if(r.type==="agent_end"){let n=Aw(r.messages);n&&Gn(e,t,n),M("Pi",e.onEvent,{type:"session.idle",properties:{}})}},Bw=e=>{for(let t of[...e].reverse()){let r=sd(t)||id(t);if(r)return r}return""},Ww=e=>[...e.textParts.entries()].sort((t,r)=>t[0]-r[0]).map(([,t])=>t.trim()).filter(Boolean).join(`
109
+
110
+ `).trim(),Dw=(e,t,r)=>{let n=sd(r.latestAssistantMessage)||id(r.latestAssistantMessage);if(n)return n;let o=Bw(e.slice(t));return o||Ww(r)},Nw=async e=>{for(await e.agent?.waitForIdle?.();;){let t=e._agentEventQueue;if(await t,t===e._agentEventQueue)return}},Uw=async e=>Promise.all(e.filter(t=>t.contentType?.startsWith("image/")).map(async t=>({type:"image",data:await Sw(t.localPath,"base64"),mimeType:t.contentType||"image/png"}))),cd=async e=>{let t=e.agentSettings&&"agentDir"in e.agentSettings?e.agentSettings:void 0,r=Ue(e.executionModel)??Ue(t?.defaultModel),n=T(),o=await rd({cwd:e.cwd,executionModel:r,resumeSessionId:e.resumeSessionId,runtimeEnv:e.runtimeEnv,settings:t}),s=await Xl({actingUserId:e.actingUserId,mcpServers:e.mcpServers,workerConfig:n}),i=e.runtimeEnv?.VIBEMUX_PI_SKILL_PATHS?.split(`
111
+ `).map(w=>w.trim()).filter(Boolean)??[],a=new vw({cwd:e.cwd,agentDir:o.agentDir,settingsManager:o.settingsManager,additionalSkillPaths:i});await a.reload();let{session:c}=await Cw({cwd:e.cwd,agentDir:o.agentDir,authStorage:o.authStorage,modelRegistry:o.modelRegistry,model:o.selectedModel,tools:["read","bash","edit","write","grep","find","ls"],customTools:s.tools,resourceLoader:a,sessionManager:o.sessionManager,settingsManager:o.settingsManager}),l=s.warnings.join(`
112
+ `);l&&M("Pi",e.onEvent,{type:"session.status",properties:{status:{type:"busy",message:l}}});let d={activeAssistantMessageId:"pi:0",assistantCounter:0,reasoningParts:new Map,textParts:new Map},p=c.messages.length,u=c.subscribe(w=>{_w(e,d,w)}),m=Rw(c),f=()=>{c.abort()};e.signal?.addEventListener("abort",f,{once:!0});let S={attachments:[],cleanup:async()=>{}};try{S=e.preparedAttachments?{attachments:e.preparedAttachments,cleanup:async()=>{}}:await qn({attachments:e.attachments,cloudUrl:n.cloudUrl,signal:e.signal});let w=await Uw(S.attachments);if(await c.prompt(e.prompt,w.length>0?{images:w}:void 0),await Nw(c),e.signal?.aborted)throw Ie(e.signal);return{output:Dw(c.messages,p,d),sessionId:c.sessionId}}catch(w){throw e.signal?.aborted||w instanceof Error&&w.name==="AbortError"?Ie(e.signal):(M("Pi",e.onEvent,{type:"session.error",properties:{error:w instanceof Error?w.message:"Pi \u6267\u884C\u5931\u8D25",message:w instanceof Error?w.message:"Pi \u6267\u884C\u5931\u8D25"}}),w)}finally{e.signal?.removeEventListener("abort",f),u(),m(),c.dispose(),await S.cleanup(),await s.cleanup(),o.cleanup()}};import{createHash as $w}from"node:crypto";import{copyFileSync as ud,existsSync as Fe,mkdirSync as Qe,mkdtempSync as Lw,readFileSync as Vs,rmSync as Zt,writeFileSync as Js}from"node:fs";import Xs from"node:os";import $ from"node:path";var pd=".vibemux-managed.json",jw="VIBEMUX_CODEX_MCP_TOKEN_",Fw="vibemux-task-runtime-",qw=[".credentials.json"],Hw={OpenCode:{skillRoot:".opencode/skills"},Codex:{skillRoot:".codex/skills"},ClaudeCode:{skillRoot:".claude/skills"},Pi:{skillRoot:".pi/skills"}},md=e=>Hw[St(e)].skillRoot,ht=e=>e.replace(/\\/g,"\\\\").replace(/"/g,'\\"'),ld=e=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),Gw=e=>/^[A-Za-z0-9_-]+$/.test(e),zw=(e,t)=>{console.log("[worker-codex-runtime]",e,JSON.stringify(t))},gd=(e,t)=>{if(!e.trim()||t.length===0)return!1;let r=t.map(n=>{let o=`"${ld(n)}"`;return Gw(n)?`(?:${ld(n)}|${o})`:o}).join("\\s*\\.\\s*");return new RegExp(`^\\s*\\[\\s*${r}\\s*\\]\\s*$`,"m").test(e)},zs=e=>{let t=[];for(let r of e.replace(/\\/g,"/").replace(/^\/+/,"").split("/"))if(!(!r||r===".")){if(r===".."){t.length>0&&t.pop();continue}t.push(r)}return t.join("/")},Kw=e=>e.startsWith("sse://")?`http://${e.slice(6)}`:e.trim(),Vw=e=>/^https?:\/\//i.test(e)||/^sse:\/\//i.test(e),Ks=(e,t)=>{Qe($.dirname(e),{recursive:!0}),Js(e,`${JSON.stringify(t,null,2)}
113
+ `,"utf8")},Vn=(e,t)=>{Qe($.dirname(e),{recursive:!0}),Js(e,t,"utf8")},Jw=e=>typeof e=="string"?{encoding:"utf8",content:e}:!e||typeof e!="object"||typeof e.content!="string"?null:{encoding:e.encoding==="base64"?"base64":"utf8",content:e.content},Xw=(e,t)=>{let r=$w("sha1").update(t).digest("hex").slice(0,16);return $.join(Ee(),"runtime",e,r)},Ys=e=>{let t=$.join(Ee(),"runtime",e);return Qe(t,{recursive:!0}),Lw($.join(t,`${e}-`))},Gs=e=>e.replace(/\\/g,"/").split("/").some(t=>t.startsWith(Fw)),Yw=e=>{let t=e.trim();if(!t)return null;try{let r=JSON.parse(t),n=r.env&&typeof r.env=="object"?Object.entries(r.env).reduce((o,[s,i])=>(typeof i=="string"&&i.trim()&&(o[s]=i),o),{}):{};return{settings:r,runtimeEnv:n}}catch{return null}},Qw=e=>{let t=$.join(e,pd);if(!Fe(t))return[];try{let r=JSON.parse(Vs(t,"utf8"));return Array.isArray(r.slugs)?r.slugs.filter(n=>typeof n=="string"&&n.trim().length>0):[]}catch{return[]}},Zw=(e,t)=>{Ks($.join(e,pd),{slugs:t})},ex=e=>{let t=Ys(`skills-${e.toLowerCase()}`),r=$.join(t,md(e));return Qe(r,{recursive:!0}),{rootPath:r,promptRoot:r.replace(/\\/g,"/"),cleanup:()=>{Zt(t,{recursive:!0,force:!0})}}},dd=(e,t)=>{for(let n of Qw(e))Zt($.join(e,n),{recursive:!0,force:!0});let r=[];for(let n of t){let o=zs(n.slug);if(!o)continue;r.push(o);let s=$.join(e,o);Zt(s,{recursive:!0,force:!0}),Qe(s,{recursive:!0});for(let[i,a]of Object.entries(n.files)){let c=zs(i);if(!c)continue;let l=$.resolve(s,c);if(l!==s&&!l.startsWith(`${s}${$.sep}`))continue;let d=Jw(a);if(d){if(Qe($.dirname(l),{recursive:!0}),d.encoding==="base64"){Js(l,Buffer.from(d.content,"base64"));continue}Vn(l,d.content)}}Fe($.join(s,"SKILL.md"))||Vn($.join(s,"SKILL.md"),n.markdown)}Zw(e,r)},tx=(e,t,r)=>{if(r.length===0)return null;let n;try{let o=ex(e);try{return dd(o.rootPath,r),{promptRoot:o.promptRoot,cleanup:o.cleanup}}catch(s){throw o.cleanup(),s}}catch(o){n=o;let s=md(e),i=$.join(t,s);try{return Qe(i,{recursive:!0}),dd(i,r),{promptRoot:s.replace(/\\/g,"/"),cleanup:()=>{}}}catch(a){throw a instanceof Error?a:n instanceof Error?n:new Error("\u5199\u5165\u8FD0\u884C\u65F6\u6280\u80FD\u76EE\u5F55\u5931\u8D25\u3002")}}},rx=(e,t="")=>{let r=[],n={},o=0;for(let s of e.mcpServers??[]){if(!s.enabled)continue;let i=zs(s.id||s.name).replace(/\//g,"-");if(!i||gd(t,["mcp_servers",i]))continue;if(s.transport==="stdio"||s.target.startsWith("stdio://")){let c=s.target.replace(/^stdio:\/\//,"").trim();if(!c)continue;r.push(`[mcp_servers."${ht(i)}"]`,'command = "sh"',`args = ["-lc", "${ht(c)}"]`,"");continue}if(s.target===nt){if(!e.executorToken?.trim())continue;let c=`${jw}${o}`;o+=1,n[c]=e.executorToken.trim(),r.push(`[mcp_servers."${ht(i)}"]`,`url = "${ht(`${e.cloudUrl.replace(/\/+$/,"")}/mcp/executor`)}"`,`bearer_token_env_var = "${c}"`,"");continue}if(!Vw(s.target))continue;let a=Kw(s.target);a&&r.push(`[mcp_servers."${ht(i)}"]`,`url = "${ht(a)}"`,"")}return{configText:r.join(`
114
+ `),env:n}},nx=(e,t)=>{let r=ot(e.mcpServers??[],{cloudUrl:e.cloudUrl,executorToken:e.executorToken,actingUserId:t});return{mcpServers:Object.entries(r).reduce((o,[s,i])=>{let a=i;return typeof a.command=="string"&&a.command.trim()?(o[s]={command:"sh",args:["-lc",a.command.trim()]},o):(typeof a.url=="string"&&a.url.trim()&&(o[s]={type:"http",url:a.url.trim(),...a.headers&&typeof a.headers=="object"?{headers:a.headers}:{}}),o)},{})}},ox=(e,t)=>{let r=Gs(e)?Ys("codex-home"):Xw("codex-home",e),n=process.env.CODEX_HOME?.trim()||$.join(Xs.homedir(),".codex"),o=$.join(n,"config.toml"),s=$.join(n,"auth.json"),i=$.join(r,"config.toml"),a=$.join(r,"auth.json"),c=Fe(o)?Vs(o,"utf8").trim():"",l=Fe(s);Qe(r,{recursive:!0});let d=t.codexConfigContent?.trim()||c,p=le({configContent:d,authContent:t.codexAuthContent}),u=It(d,p.providerId),m=Et(u.content,p.providerId,p.envKey),f=m.content,S=gd(f,["projects",e])?"":[`[projects."${ht(e)}"]`,'trust_level = "trusted"'].join(`
115
+ `),w=rx(t,f),g=[f,S,w.configText].filter(F=>F.trim());Vn(i,`${g.join(`
115
116
 
116
117
  `)}
117
- `);let R=it(t.codexAuthContent),C=Object.keys(R).sort(),E="none";return zr(t.codexAuthContent)?(_n(a,`${t.codexAuthContent?.trim()||""}
118
- `),E="legacy-auth-json"):C.length>0?E="env-json":l&&!qe(a)&&(ql(i,a),E="local-auth-copy"),iw("runtime-created",{cwd:e,runtimeRoot:r,runtimeRootMode:Ei(e)?"isolated-temp":"stable-per-workspace",configSource:t.codexConfigContent?.trim()?"managed-config-sync":c?"local-codex-home":"empty",configPresent:!!f.trim(),providerId:m.providerId,configuredModel:m.configuredModel||"",providerNameAdded:u.changed,providerEnvKey:m.envKey,providerEnvKeyAdded:p.changed,credentialStrategy:E,managedCredentialEnvKeys:C,sourceAuthExists:l,trustAdded:!!x,mcpConfigAdded:!!k.configText.trim(),mcpEnvKeys:Object.keys(k.env).sort()}),{runtimeEnv:{CODEX_HOME:r,...k.env,...R},cleanup:()=>{Ei(e)&&Gt(r,{recursive:!0,force:!0})}}},kw=(e,t)=>{let r=Mi("claude-home"),n=$.join(r,"mcp.json"),o=process.env.CLAUDE_HOME?.trim()||$.join(Ai.homedir(),".claude"),s=[$.join(o,"settings.json"),$.join(o,"config.json")].reduce((l,d)=>{if(l.trim()||!qe(d))return l;try{return Ri(d,"utf8").trim()}catch{return l}},""),a=e.claudeCodeConfigContent?.trim()||s,c=a?dw(a):null;if(a){if(!c)throw Gt(r,{recursive:!0,force:!0}),new Error("Claude Code settings.json \u683C\u5F0F\u4E0D\u6B63\u786E\u3002");bi($.join(r,"settings.json"),c.settings)}for(let l of rw){let d=$.join(o,l),m=$.join(r,l);qe(d)&&!qe(m)&&ql(d,m)}return bi(n,hw(e,t)),{runtimeArgs:["--mcp-config",n],runtimeEnv:{CLAUDE_HOME:r,...c?.runtimeEnv??{}},cleanup:()=>{Gt(r,{recursive:!0,force:!0})}}},ww=(e,t)=>{let r=kw(e,t);return{runtimeArgs:r.runtimeArgs,runtimeEnv:r.runtimeEnv,cleanup:()=>{r.cleanup()}}},Bn=(e,t)=>{let r=t.trim();return r?[r,"",e].join(`
119
- `):e},Kl=e=>({promptPrefix:e.promptPrefix,runtimeEnv:{},runtimeArgs:[],cleanup:()=>{e.runtimeSkills?.cleanup()}}),xw=e=>{let t=yw(e.cwd,e.effectiveConfig);return{promptPrefix:e.promptPrefix,runtimeEnv:t.runtimeEnv,runtimeArgs:[],cleanup:()=>{e.runtimeSkills?.cleanup(),t.cleanup()}}},Sw=e=>{let t=ww(e.effectiveConfig,e.actingUserId);return{promptPrefix:e.promptPrefix,runtimeEnv:t.runtimeEnv,runtimeArgs:t.runtimeArgs,cleanup:()=>{e.runtimeSkills?.cleanup(),t.cleanup()}}},vw=e=>{let t=e.effectiveConfig.agentSettings.Pi.agentDir?.trim()||e.effectiveConfig.piAgentDir?.trim()||$.join(Ai.homedir(),".pi","agent"),r=e.runtimeSkills?.promptRoot?.trim();return{promptPrefix:e.promptPrefix,runtimeEnv:{VIBEMUX_PI_AGENT_DIR:t,...r?{VIBEMUX_PI_SKILL_PATHS:r}:{}},runtimeArgs:[],cleanup:()=>{e.runtimeSkills?.cleanup()}}},Cw={OpenCode:Kl,Codex:xw,ClaudeCode:Sw,Pi:vw},Oi=e=>{let t=e.workerConfig??b(),r=e.mcpServers?{...t,mcpServers:e.mcpServers}:t,n=e.runtimeSkillPackages??[],o=qe(e.cwd)?gw(e.agentType,e.cwd,n):null,i=yt(e.agentType);return(Cw[i]??Kl)({agentType:e.agentType,actingUserId:e.actingUserId,cwd:e.cwd,effectiveConfig:r,promptPrefix:"",runtimeSkills:o})};var Ew=e=>[`\u4EFB\u52A1\u6807\u9898: ${e.title}`,`\u4EFB\u52A1\u63CF\u8FF0: ${e.description}`,"","\u8BF7\u76F4\u63A5\u5728\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u5B8C\u6210\u4EFB\u52A1\u6240\u9700\u4FEE\u6539\u3002","\u5982\u9700\u8BFB\u5199\u6587\u4EF6\u3001\u8FD0\u884C\u547D\u4EE4\u6216\u9A8C\u8BC1\u7ED3\u679C\uFF0C\u8BF7\u76F4\u63A5\u6267\u884C\u3002","\u5B8C\u6210\u540E\u8BF7\u8FD4\u56DE\u7B80\u6D01\u603B\u7ED3\uFF1A\u505A\u4E86\u4EC0\u4E48\u3001\u662F\u5426\u8FD8\u6709\u963B\u585E\u3002"].join(`
120
- `),Cr=(e,t)=>{M(e.agentType,e.onEvent,{type:"session.status",properties:{status:{type:"busy",message:t}}})},Jl=(e,t)=>{M(e.agentType,e.onEvent,{type:"session.error",properties:{error:t,message:t}})},Iw=(e,t)=>t&&typeof t=="object"&&"code"in t&&t.code==="ENOENT"?`\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u4E0D\u5B58\u5728\uFF1A${e}`:t instanceof Error?`\u65E0\u6CD5\u8BBF\u95EE\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55 ${e}\uFF1A${t.message}`:`\u65E0\u6CD5\u8BBF\u95EE\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\uFF1A${e}`,bw=async e=>{if(!(await Pw(e)).isDirectory())throw new Error(`\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u4E0D\u662F\u76EE\u5F55\uFF1A${e}`)},Rw={OpenCode:async({params:e,prompt:t,runtimeEnv:r,runtimeArgs:n})=>Jo({actingUserId:e.actingUserId,resumeSessionId:e.resumeSessionId,cwd:e.cwd,title:e.title,prompt:t,executionModel:e.executionModel,agentSettings:e.agentSettings,opencodeConfig:e.opencodeConfig,mcpServers:e.mcpServers,runtimeEnv:r,runtimeArgs:n,signal:e.signal,onEvent:o=>{M("OpenCode",e.onEvent,o)}}),Codex:async({params:e,prompt:t,runtimeEnv:r,runtimeArgs:n})=>Il({...e,prompt:t,runtimeEnv:r,runtimeArgs:n}),ClaudeCode:async({params:e,prompt:t,runtimeEnv:r,runtimeArgs:n})=>hl({...e,prompt:t,runtimeEnv:r,runtimeArgs:n}),Pi:async({params:e,prompt:t,runtimeEnv:r})=>Ll({...e,prompt:t,runtimeEnv:r})},Pr=async e=>{Cr(e,"\u6B63\u5728\u68C0\u67E5\u5DE5\u4F5C\u76EE\u5F55...");try{await bw(e.cwd)}catch(i){let s=Iw(e.cwd,i);throw Jl(e,s),new Error(s)}if(!e.skipRuntimeCheck){Cr(e,"\u6B63\u5728\u68C0\u67E5\u8FD0\u884C\u73AF\u5883\uFF0C\u9996\u6B21\u8FD0\u884C\u53EF\u80FD\u9700\u8981\u4E00\u70B9\u65F6\u95F4...");let i=await xe({autoInstall:!0,target:e.agentType});if(!i.ok)throw Jl(e,i.message),new Error(i.message)}((e.attachments?.length??0)>0||(e.preparedAttachments?.length??0)>0)&&Cr(e,"\u6B63\u5728\u51C6\u5907\u9644\u4EF6...");let t=await Rn({attachments:e.attachments,cloudUrl:e.cloudUrl,signal:e.signal});le(e.cwd,e.runtimeEnvironment),Cr(e,"\u6B63\u5728\u51C6\u5907 Agent \u8FD0\u884C\u4E0A\u4E0B\u6587...");let r=e.runtimePrepared?{promptPrefix:"",runtimeEnv:e.runtimeEnv??{},runtimeArgs:e.runtimeArgs??[],cleanup:()=>{}}:Oi({agentType:e.agentType,cwd:e.cwd,actingUserId:e.actingUserId,runtimeSkillPackages:e.runtimeSkillPackages,mcpServers:e.mcpServers}),n={...r.runtimeEnv,...e.runtimeEnv??{}},o=Al(Bn(e.prompt,r.promptPrefix),t.attachments);try{let i=yt(e.agentType);Cr(e,`\u6B63\u5728\u542F\u52A8 ${Wr(i).label}...`);let s=Rw[i];if(!s)throw new Error(`\u6682\u672A\u914D\u7F6E ${i} prompt runner\u3002`);return await s({params:{...e,preparedAttachments:t.attachments},prompt:o,runtimeEnv:n,runtimeArgs:r.runtimeArgs})}finally{await t.cleanup(),r.cleanup()}},_i=async e=>{if(!e.skipRuntimeCheck&&e.agentType==="OpenCode"){let n=await xe({autoInstall:!0,target:e.agentType});if(!n.ok)throw new Error(n.message)}let t=Oi({agentType:e.agentType,cwd:e.cwd,actingUserId:e.actingUserId,runtimeSkillPackages:e.runtimeSkillPackages,mcpServers:e.mcpServers});le(e.cwd,e.runtimeEnvironment);let r={...t.runtimeEnv,...e.runtimeEnv??{}};if(e.agentType==="OpenCode")try{return await Ko({actingUserId:e.actingUserId,cwd:e.cwd,title:e.title,description:Bn(e.description,t.promptPrefix),executionModel:e.executionModel,agentSettings:e.agentSettings,opencodeConfig:e.opencodeConfig,mcpServers:e.mcpServers,runtimeEnv:r,runtimeArgs:t.runtimeArgs,signal:e.signal})}finally{t.cleanup()}try{return await Pr({agentType:e.agentType,actingUserId:e.actingUserId,cwd:e.cwd,title:e.title,prompt:Bn(Ew(e),t.promptPrefix),executionModel:e.executionModel,agentSettings:e.agentSettings,mcpServers:e.mcpServers,runtimeSkillPackages:e.runtimeSkillPackages,runtimeEnv:r,runtimeArgs:t.runtimeArgs,runtimePrepared:!0,signal:e.signal})}finally{t.cleanup()}};var Vl=e=>{let t=e.promptQueueState??Bi(),{pendingPromptRequests:r,pendingPromptAborts:n,queuedPromptRequestIds:o}=t,i=(u,p)=>{let f=e.getConfig();e.send({type:"executor.agent.prompt.event",executorId:f.executorId,requestId:u.requestId,event:{agentType:u.agentType,type:"session.status",properties:{status:{type:"busy",message:p}}},at:new Date().toISOString()})},s=u=>{let p=o.indexOf(u);p!==-1&&o.splice(p,1),e.setQueuedTaskIds(e.getQueuedTaskIds().filter(f=>f!==kr(u)))},a=u=>{r.delete(u),n.delete(u),e.setRunningTaskIds(e.getRunningTaskIds().filter(p=>p!==kr(u))),e.syncRuntimeState(),e.drainExecutionQueue()},c=u=>{let p=b();e.setConfig(p),s(u.requestId),e.setRunningTaskIds([...e.getRunningTaskIds(),kr(u.requestId)]),e.syncRuntimeState(),console.log("[worker-agent] prompt request",JSON.stringify({requestId:u.requestId,agentType:u.agentType,cwd:u.cwd,agentWorkdir:u.agentWorkdir?.agentId??null,title:u.title,executionModel:u.executionModel??"default",attachmentCount:u.attachments?.length??0,promptPreview:u.prompt.slice(0,160)}));let f=u.agentWorkdir?.agentId?(()=>{let k=xn(u.agentWorkdir.agentId);return vc(u.agentWorkdir.agentId,u.agentWorkdir.sessionId?.trim()||u.requestId),k.summary.workDirPath})():u.cwd,x=new AbortController;n.set(u.requestId,x),Pr({agentType:u.agentType,actingUserId:u.actingUserId,resumeSessionId:u.resumeSessionId,cwd:f,title:u.title,prompt:u.prompt,attachments:u.attachments,cloudUrl:p.cloudUrl,executionModel:u.executionModel,agentSettings:u.agentSettings??p.agentSettings[u.agentType],opencodeConfig:u.opencodeConfig,mcpServers:u.mcpServers,runtimeSkillPackages:u.runtimeSkillPackages,runtimeEnv:u.runtimeEnv,runtimeEnvironment:u.runtimeEnvironment,signal:x.signal,onEvent:k=>{p=e.getConfig(),e.send({type:"executor.agent.prompt.event",executorId:p.executorId,requestId:u.requestId,event:k,at:new Date().toISOString()})}}).then(k=>{p=e.getConfig(),console.log("[worker-agent] prompt response",JSON.stringify({requestId:u.requestId,ok:!0,sessionId:k.sessionId,outputPreview:k.output.slice(0,200)})),e.send({type:"executor.agent.prompt.response",executorId:p.executorId,requestId:u.requestId,result:{ok:!0,output:k.output,sessionId:k.sessionId},at:new Date().toISOString()})}).catch(k=>{p=e.getConfig(),console.log("[worker-agent] prompt response",JSON.stringify({requestId:u.requestId,ok:!1,error:k instanceof Error?k.message:`${u.agentType} \u6267\u884C\u5931\u8D25\u3002`})),e.send({type:"executor.agent.prompt.response",executorId:p.executorId,requestId:u.requestId,result:{ok:!1,output:k instanceof Error?k.message:`${u.agentType} \u6267\u884C\u5931\u8D25\u3002`},at:new Date().toISOString()})}).finally(()=>{a(u.requestId)})},l=()=>{let u=b();for(e.setConfig(u);e.getRunningTaskIds().length<Math.max(1,u.maxConcurrency)&&o.length>0;){let p=o[0];if(!p)break;let f=r.get(p);if(!f){s(p);continue}c(f),u=e.getConfig()}};return{abortActivePrompts:()=>{let u=[...r.keys()];if(u.length!==0){for(let p of u)s(p),r.delete(p),n.get(p)?.abort({reason:"control_plane_disconnect",message:"\u6267\u884C\u5668\u4E0E\u63A7\u5236\u9762\u8FDE\u63A5\u5DF2\u65AD\u5F00\uFF0C\u672C\u6B21\u56DE\u590D\u5DF2\u4E2D\u6B62\u3002"}),n.delete(p);e.syncRuntimeState()}},drainPromptQueue:l,handlePromptMessage:u=>{if(u.type==="executor.agent.prompt.request"){if(!r.has(u.requestId)){r.set(u.requestId,u),o.push(u.requestId),e.setQueuedTaskIds([...e.getQueuedTaskIds(),kr(u.requestId)]),e.syncRuntimeState();let p=e.getConfig();e.getRunningTaskIds().length>=Math.max(1,p.maxConcurrency)&&i(u,"\u5F53\u524D\u8282\u70B9\u6B63\u5728\u5904\u7406\u5176\u4ED6\u8BF7\u6C42\uFF0C\u5DF2\u8FDB\u5165\u6392\u961F\uFF0C\u7A0D\u540E\u4F1A\u81EA\u52A8\u5F00\u59CB\u3002")}return l(),!0}return s(u.requestId),r.delete(u.requestId),e.syncRuntimeState(),n.get(u.requestId)?.abort({reason:u.reason??"unknown",message:u.message}),n.delete(u.requestId),e.drainExecutionQueue(),!0}}},Bi=()=>({pendingPromptRequests:new Map,pendingPromptAborts:new Map,queuedPromptRequestIds:[]});var Tw=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"task",Er=e=>`task/${Tw(e)}`;var Aw=e=>{let t=e.split(/\r?\n/).map(r=>r.trim()).find(Boolean);return t?t.length>160?`${t.slice(0,157)}...`:t:"Worker completed the task."},Mw=e=>{let t=Aw(e.summary),r=(e.taskTitle?.trim()||e.taskDescription?.trim()||"Worker delivery update").replace(/\s+/g," "),n=e.filesChanged.length>0?e.filesChanged.join(", "):"none";return["## Summary",`- ${r}`,`- ${t}`,`- Changed files: ${n}`,"","## Delivery",`- Base branch: ${e.baseBranch}`,`- Compare branch: ${e.compareBranch}`,e.commitShas?.[0]?`- Commit: ${e.commitShas[0]}`:null].filter(Boolean).join(`
121
- `)},Ow=(e,t)=>{let r=(e?.trim()||t?.trim()||"Worker delivery update").replace(/\s+/g," ");return r.length>72?`${r.slice(0,69)}...`:r},_w=e=>{let t={mode:e.returnMode};if(e.returnMode==="patch"&&(t.patch=e.patchArtifactId?{artifactId:e.patchArtifactId,files:e.filesChanged,status:"ready"}:{artifactId:void 0,files:e.filesChanged,status:"blocked",reason:e.filesChanged.length===0?"\u672C\u6B21\u6267\u884C\u6CA1\u6709\u6587\u4EF6\u6539\u52A8\uFF0C\u672A\u751F\u6210 patch\u3002":"\u7F3A\u5C11 patch \u4EA7\u7269\uFF0C\u6682\u65F6\u65E0\u6CD5\u540C\u6B65\u5230\u672C\u5730\u4ED3\u5E93\u3002"},t.patch.status==="blocked"&&(t.syncFailureReason=t.patch.reason)),e.returnMode==="branch"||e.returnMode==="commit"){let r=e.remoteBranchName||Er(e.taskId),n=e.filesChanged.length>0&&!!e.commitShas?.length,o=!!e.remoteBranchName;t.branch={branchName:r,repoUrl:e.repoUrl,baseBranch:e.baseBranch,pushed:o,suggestedNextStep:n?o?e.returnMode==="commit"?"\u786E\u8BA4 PR \u51C6\u5907\u4FE1\u606F\u540E\u5373\u53EF\u53D1\u8D77 PR\u3002":"\u5230\u76EE\u6807\u4ED3\u5E93\u67E5\u770B\u8BE5\u5206\u652F\uFF0C\u5E76\u51B3\u5B9A\u662F\u5426\u7EE7\u7EED\u53D1\u8D77 PR\u3002":"\u5F53\u524D\u53EA\u6709\u672C\u5730 commit\uFF0C\u8865\u9F50\u51ED\u8BC1\u540E\u63A8\u9001\u8BE5\u5206\u652F\u3002":"\u672C\u6B21\u6267\u884C\u6CA1\u6709\u751F\u6210\u53EF\u4EA4\u4ED8\u5206\u652F\u3002",reason:n?o?void 0:"\u5206\u652F\u540D\u5DF2\u51C6\u5907\uFF0C\u4F46\u5F53\u524D\u7ED3\u679C\u91CC\u8FD8\u6CA1\u6709\u8FDC\u7AEF\u63A8\u9001\u8BB0\u5F55\u3002":e.filesChanged.length===0?"\u672C\u6B21\u6267\u884C\u6CA1\u6709\u4EE3\u7801\u6539\u52A8\uFF0C\u672A\u751F\u6210\u5206\u652F\u4EA4\u4ED8\u3002":"\u672A\u8BB0\u5F55 commit \u7ED3\u679C\uFF0C\u6682\u65F6\u65E0\u6CD5\u786E\u8BA4\u5206\u652F\u4EA4\u4ED8\u3002"},t.branch.reason&&!n&&(t.syncFailureReason=t.branch.reason)}if(e.returnMode==="commit"){let r=e.remoteBranchName||Er(e.taskId),n=e.filesChanged.length>0&&!!e.commitShas?.length;t.pullRequest={ready:n,remoteReady:!!e.remoteBranchName,repoUrl:e.repoUrl,title:n?Ow(e.taskTitle,e.taskDescription):void 0,description:n?Mw({summary:e.summary,taskTitle:e.taskTitle,taskDescription:e.taskDescription,filesChanged:e.filesChanged,baseBranch:e.baseBranch,compareBranch:r,commitShas:e.commitShas}):void 0,baseBranch:e.baseBranch,compareBranch:r,reason:n?e.remoteBranchName?void 0:"PR \u6587\u6848\u5DF2\u51C6\u5907\uFF0C\u4F46 compare branch \u8FD8\u6CA1\u6709\u63A8\u9001\u5230\u8FDC\u7AEF\u3002":e.filesChanged.length===0?"\u672C\u6B21\u6267\u884C\u6CA1\u6709\u4EE3\u7801\u6539\u52A8\uFF0C\u672A\u751F\u6210 PR \u51C6\u5907\u4FE1\u606F\u3002":"\u5F53\u524D\u7ED3\u679C\u91CC\u6CA1\u6709 commit \u4FE1\u606F\uFF0C\u6682\u65F6\u65E0\u6CD5\u51C6\u5907 PR\u3002"},t.pullRequest.ready||(t.syncFailureReason=t.pullRequest.reason)}return t},Ht=(e,t)=>({...e,delivery:_w({taskId:e.taskId,returnMode:e.returnMode,repoUrl:t.repoUrl,baseBranch:t.baseBranch,summary:e.summary,taskTitle:t.taskTitle,taskDescription:t.taskDescription,filesChanged:e.filesChanged,patchArtifactId:e.patchArtifactId,remoteBranchName:e.remoteBranchName,commitShas:e.commitShas})});import{mkdtempSync as tx,mkdirSync as rx,rmSync as ud,symlinkSync as nx}from"node:fs";import ox from"node:os";import pd from"node:path";import{simpleGit as Bw}from"simple-git";var Ww=async e=>{let t=await e.status();return Array.from(new Set(t.files.map(r=>r.path))).sort()},Dw=async(e,t)=>{if(t.returnMode!=="patch")return;await e.add(["--all"]);let r=await e.diff(["--cached","--binary",t.baseCommit]);if(r.trim())return{filename:`${t.id}.patch`,content:r}},Xl=async(e,t,r)=>{let n=Bw(t),o=await Ww(n),i=await Dw(n,e);return{filesChanged:o,commitShas:void 0,patchArtifact:i,remoteBranchName:e.returnMode==="branch"?r:void 0}};import{spawn as Nw}from"node:child_process";var $w=["&&","||","|",";",">","<","$(","`"],Uw=(e,t=1600)=>{let r=e.trim();return r?r.length>t?`${r.slice(0,t)}
122
- ...\uFF08\u5DF2\u622A\u65AD\uFF09`:r:""},Lw=e=>{let t=[],r="",n=null,o=!1;for(let i of e){if(o){r+=i,o=!1;continue}if(i==="\\"){o=!0;continue}if(n){i===n?n=null:r+=i;continue}if(i==='"'||i==="'"){n=i;continue}if(/\s/.test(i)){r&&(t.push(r),r="");continue}r+=i}if(o&&(r+="\\"),n)throw new Error("\u73AF\u5883\u6A21\u677F\u547D\u4EE4\u5B58\u5728\u672A\u95ED\u5408\u7684\u5F15\u53F7\u3002");return r&&t.push(r),t},jw=e=>{let t=e.trim();if(!t)throw new Error("\u73AF\u5883\u6A21\u677F\u547D\u4EE4\u4E0D\u80FD\u4E3A\u7A7A\u3002");if($w.some(i=>t.includes(i)))throw new Error("\u73AF\u5883\u6A21\u677F\u547D\u4EE4\u53EA\u652F\u6301\u5355\u6761\u547D\u4EE4\uFF0C\u4E0D\u652F\u6301 shell \u7BA1\u9053\u3001\u91CD\u5B9A\u5411\u6216\u4E32\u8054\u64CD\u4F5C\u3002");let r=Lw(t),n={};for(;r.length>0&&/^[A-Za-z_][A-Za-z0-9_]*=.*/.test(r[0]);){let i=r.shift(),s=i.indexOf("=");n[i.slice(0,s)]=i.slice(s+1)}let o=r.shift();if(!o)throw new Error("\u73AF\u5883\u6A21\u677F\u547D\u4EE4\u7F3A\u5C11\u53EF\u6267\u884C\u547D\u4EE4\u3002");return{command:o,args:r,env:n}},Yl=(e,t)=>{if(e)return t==="install"?e.installCommand?.trim()||void 0:t==="build"?e.buildCommand?.trim()||void 0:t==="test"?e.testCommand?.trim()||void 0:e.lintCommand?.trim()||void 0},Fw=e=>e?[e.installCommand?`install: ${e.installCommand}`:null,e.devCommand?`dev: ${e.devCommand}`:null,e.buildCommand?`build: ${e.buildCommand}`:null,e.testCommand?`test: ${e.testCommand}`:null,e.lintCommand?`lint: ${e.lintCommand}`:null,e.branchNamePattern?`branch: ${e.branchNamePattern}`:null].filter(t=>!!t):[],Wi=e=>{let t=Fw(e.commandPreset);return t.length===0?e.description:[e.description,"","\u9879\u76EE\u73AF\u5883\u6A21\u677F\u547D\u4EE4\uFF1A",...t.map(r=>`- ${r}`),"","\u6267\u884C\u8981\u6C42\uFF1A","- \u4F18\u5148\u9075\u5B88\u4E0A\u9762\u7684\u9879\u76EE\u73AF\u5883\u6A21\u677F\u547D\u4EE4\u3002","- install \u547D\u4EE4\u4F1A\u5728 worktree \u521B\u5EFA\u540E\u7ACB\u5373\u540E\u53F0\u542F\u52A8\u3002","- build / test / lint \u547D\u4EE4\u7531 worker \u5728\u6267\u884C\u540E\u81EA\u52A8\u6821\u9A8C\u3002"].join(`
123
- `)},Ql=async e=>{let t=jw(e.commandText);return await new Promise((r,n)=>{let o=Nw(t.command,t.args,{cwd:e.cwd,env:{...e.env??process.env,...t.env},stdio:["ignore","pipe","pipe"]}),i="",s="",a=!1,c=()=>{a=!0,o.kill("SIGTERM")};e.signal?.addEventListener("abort",c,{once:!0}),o.stdout.on("data",l=>{i+=l.toString()}),o.stderr.on("data",l=>{s+=l.toString()}),o.on("error",l=>{e.signal?.removeEventListener("abort",c),n(new Error(`${e.label} \u542F\u52A8\u5931\u8D25\uFF1A${l.message}`))}),o.on("close",(l,d)=>{if(e.signal?.removeEventListener("abort",c),a){n(new Error(`${e.label} \u5DF2\u53D6\u6D88\u3002`));return}let m=Uw([i,s].filter(Boolean).join(`
124
- `));if(l===0){r({output:m});return}let u=d?`\u4FE1\u53F7 ${d}`:`\u9000\u51FA\u7801 ${l??"unknown"}`;n(new Error([`${e.label} \u6267\u884C\u5931\u8D25\uFF08${u}\uFF09\u3002`,m].filter(Boolean).join(`
125
-
126
- `)))})})},Di=async e=>{let t=Yl(e.task.commandPreset,e.step);if(!t)return null;let r=`\u9879\u76EE\u9884\u8BBE ${e.step}`;e.emit("executing",`${r}\uFF1A${t}`);let n=await Ql({cwd:e.cwd,label:r,commandText:t,signal:e.signal,env:e.env});return e.emit("executing",n.output?`${r} \u5DF2\u5B8C\u6210\u3002
127
- ${n.output}`:`${r} \u5DF2\u5B8C\u6210\u3002`),`${r}\uFF1A${t}`},Ni=e=>{let t=Yl(e.task.commandPreset,e.step);if(!t)return null;let r=`\u9879\u76EE\u9884\u8BBE ${e.step}`;return e.emit("executing",`${r} \u5DF2\u5728\u540E\u53F0\u542F\u52A8\uFF1A${t}`),{commandText:t,label:r,promise:Ql({cwd:e.cwd,label:r,commandText:t,signal:e.signal,env:e.env})}},$i=async(e,t)=>{let r=await e.promise;return t("executing",r.output?`${e.label} \u5DF2\u5B8C\u6210\u3002
128
- ${r.output}`:`${e.label} \u5DF2\u5B8C\u6210\u3002`),`${e.label}\uFF1A${e.commandText}`};import{createHash as qw}from"node:crypto";import{existsSync as Zl,mkdirSync as td,rmSync as Gw}from"node:fs";import zt from"node:path";import{simpleGit as Ir}from"simple-git";var Hw="main",rd=(e,t)=>{let r={...Rt(t),...e?{baseDir:e}:{}};return Ir(r).env(t??{})},zw=e=>qw("sha1").update(e).digest("hex").slice(0,12),Kw=e=>e.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"repo",Jw=(e,t)=>{let r=zt.basename(t).replace(/\.git$/i,"");return zt.join(e,"repos",`${Kw(r)}-${zw(t)}`)},nd=e=>e.baseCommit?.trim()||e.defaultBranch?.trim()||Hw,Ui=e=>`origin/${e}`,Vw=async(e,t,r)=>(await rd(void 0,r).raw(["ls-remote","--heads",e,t])).trim().length>0,ed=async(e,t)=>{console.log("[worker] [task-worktree] fetching target branch only",JSON.stringify({branchName:t})),await e.fetch(["origin",`${t}:refs/remotes/origin/${t}`])},od=async(e,t)=>(await e.branch(["-r"])).all.includes(Ui(t)),Xw=async(e,t)=>{await e.fetch(["--all","--prune"]),await od(e,t)&&await e.rebase([Ui(t)])},id=e=>e.gitIdentity??{mode:e.gitIdentityMode??"personal"},sd=e=>e.workingDirectoryMode==="original-dir"?"original-dir":"worktree",Yw=(e,t)=>t.versionControl!=="git-remote"&&t.rootPath?.trim()?t.rootPath.trim():e?.find(r=>!!(r.projectId&&r.projectId===t.projectId||r.repoUrl&&r.repoUrl===t.repoUrl))?.localPath,Qw=async e=>{let t=await e.raw(["worktree","list","--porcelain"]),r=[],n=null;for(let o of t.split(`
129
- `)){if(o.startsWith("worktree ")){n&&r.push(n),n={path:zt.resolve(o.slice(9).trim())};continue}o.startsWith("branch ")&&n&&(n.branch=o.slice(7).trim())}return n&&r.push(n),r},Zw=async(e,t)=>(await e.branchLocal()).all.includes(t),ex=e=>{Gw(e,{recursive:!0,force:!0,maxRetries:5,retryDelay:100})},ad=async(e,t,r)=>{let n=Ir(e),o=zt.resolve(t),i=`refs/heads/${r}`;try{await n.raw(["worktree","prune"])}catch{}let a=(await Qw(n)).find(c=>c.branch===i);if(a&&a.path!==o)try{await n.raw(["worktree","remove","--force",a.path])}catch{}try{await n.raw(["worktree","remove","--force",o])}catch{}if(ex(o),await Zw(n,r))try{await n.deleteLocalBranch(r,!0)}catch{}try{await n.raw(["worktree","prune"])}catch{}td(zt.dirname(o),{recursive:!0})},cd=async e=>{let t=Yw(e.bindings,e.task)||Jw(e.workspaceRoot,e.task.repoUrl),r=nd(e.task);if(td(zt.dirname(t),{recursive:!0}),e.task.versionControl==="git-local"){let i=Ir(t).env(e.env??{});if(!Zl(t)||!await i.checkIsRepo().catch(()=>!1))throw new Error("\u672C\u5730 Git \u9879\u76EE\u76EE\u5F55\u672A\u521D\u59CB\u5316\uFF0C\u65E0\u6CD5\u521B\u5EFA\u4EFB\u52A1 worktree\u3002");return{repoDir:t,git:i,taskBranchExists:!1}}Zl(t)||(console.log("[worker] [task-worktree] cloning target branch only",JSON.stringify({repoDir:t,repoUrl:e.task.repoUrl,startPoint:r})),await Ir().env(e.env??{}).clone(e.task.repoUrl,t,["--no-checkout","--single-branch","--branch",r]));let n=Ir(t).env(e.env??{});await ed(n,r);let o=await Vw(e.task.repoUrl,e.branchName,e.env);return o&&e.branchName!==r&&await ed(n,e.branchName),{repoDir:t,git:n,taskBranchExists:o}},ld=async e=>{let t=e.taskBranchExists||await od(e.git,e.branchName)?Ui(e.branchName):nd(e.task);return await e.git.checkout(["-B",e.branchName,t]),t},dd=async e=>{let t=rd(e.worktreePath,e.env),r=await t.status(),n=Array.from(new Set(r.files.map(a=>a.path))).sort();if(n.length===0)return{changedFiles:n,commitShas:void 0,remoteBranchName:void 0,pushMessage:"\u6CA1\u6709\u6587\u4EF6\u6539\u52A8\uFF0C\u8DF3\u8FC7\u63D0\u4EA4\u4E0E\u63A8\u9001\u3002"};if(e.task.autoCommitEnabled===!1)return{changedFiles:n,commitShas:void 0,remoteBranchName:void 0,pushMessage:"\u5F53\u524D\u5DE5\u4F5C\u533A\u5DF2\u5173\u95ED\u81EA\u52A8\u63D0\u4EA4 / \u63A8\u9001\uFF0C\u6539\u52A8\u4FDD\u7559\u5728\u672C\u5730\u76EE\u5F55\u3002"};if(e.task.returnMode!=="branch"&&e.task.returnMode!=="commit")return{changedFiles:n,commitShas:void 0,remoteBranchName:void 0,pushMessage:void 0};if(!e.identity.name||!e.identity.email)throw new Error("\u5F53\u524D\u4EFB\u52A1\u7F3A\u5C11 Git \u7528\u6237\u540D\u6216\u90AE\u7BB1\uFF0C\u8BF7\u5148\u5728\u8BBE\u7F6E\u9875\u5B8C\u6210 Git \u6388\u6743\u914D\u7F6E\u3002");await t.add(["--all"]),await t.commit(`vibemux: ${e.task.id}`);let o=(await t.revparse(["HEAD"])).trim(),i,s="\u5DF2\u521B\u5EFA\u672C\u5730\u63D0\u4EA4\u3002";return e.identity.credentialToken?(await Xw(t,e.branchName),await t.push(["-u","origin",e.branchName]),i=e.branchName,s=`\u5DF2\u63A8\u9001\u8FDC\u7AEF\u5206\u652F ${e.branchName}\u3002`):(e.task.returnMode==="branch"||e.task.returnMode==="commit")&&(s="\u7F3A\u5C11 task \u7EA7\u4E34\u65F6\u51ED\u8BC1\uFF0C\u5DF2\u521B\u5EFA\u672C\u5730\u63D0\u4EA4\u4F46\u672A\u63A8\u9001\u8FDC\u7AEF\u3002"),{changedFiles:n,commitShas:o?[o]:void 0,remoteBranchName:i,pushMessage:s}};var ix="vibemux-task-runtime-",sx=e=>e==="Codex"||e==="ClaudeCode",md=(e,t)=>{if(!sx(e.agentType))return{cwd:t,cleanup:()=>{}};let r=tx(pd.join(ox.tmpdir(),`${ix}${e.id.slice(0,8)}-`)),n=pd.join(r,"workspace");try{return nx(t,n,process.platform==="win32"?"junction":"dir"),{cwd:n,cleanup:()=>{ud(r,{recursive:!0,force:!0})}}}catch{return ud(r,{recursive:!0,force:!0}),{cwd:t,cleanup:()=>{}}}},gd=async e=>{let t=new Date().toISOString(),r=Er(e.task.id),n=Qs(e.workspaceRoot,e.task.id,e.task.workspaceId),o=sd(e.task),i=null,s=null,a=null;try{e.emit("preparing","\u68C0\u67E5 Worker \u8FD0\u884C\u73AF\u5883");let c=await xe({autoInstall:!0,target:e.task.agentType});if(!c.ok)throw new Error(c.message);if(e.emit("preparing","\u8FD0\u884C\u73AF\u5883\u5DF2\u5C31\u7EEA"),e.task.versionControl==="none"){let D=e.task.rootPath?.trim()||n;rx(D,{recursive:!0}),le(D,e.runtimeEnvironment),e.emit("preparing",`\u9879\u76EE\u76EE\u5F55\u5DF2\u5C31\u7EEA\uFF1A${D}`);let U=md(e.task,D);a=U.cleanup;let L=Ni({step:"install",task:e.task,cwd:D,signal:e.signal,emit:e.emit}),K=[];L&&K.push(await $i(L,e.emit)),e.emit("executing",`\u5F00\u59CB\u8C03\u7528 ${e.task.agentType} \u6267\u884C\u4EFB\u52A1`);let S=await _i({agentType:e.task.agentType,actingUserId:e.task.requestedByUserId,cwd:U.cwd,title:`Distributed Task ${e.task.id}`,description:Wi(e.task),executionModel:e.task.executionModel??e.task.opencodeConfig?.model,agentSettings:e.task.agentSettings,opencodeConfig:e.task.opencodeConfig,mcpServers:e.task.mcpServers,skipRuntimeCheck:!0,runtimeSkillPackages:e.task.runtimeSkillPackages,runtimeEnv:e.task.runtimeEnv,runtimeEnvironment:e.runtimeEnvironment,signal:e.signal});for(let h of["build","test","lint"]){let P=await Di({step:h,task:e.task,cwd:D,signal:e.signal,emit:e.emit});P&&K.push(P)}let I=new Date().toISOString(),A=Ht({taskId:e.task.id,status:"completed",returnMode:e.task.returnMode,summary:[K.length>0?`\u5DF2\u6267\u884C\u9879\u76EE\u9884\u8BBE\u547D\u4EE4\uFF1A
130
- ${K.map(h=>`- ${h}`).join(`
131
- `)}`:void 0,S.output].filter(Boolean).join(`
132
-
133
- `),output:S.output,filesChanged:[],startedAt:t,completedAt:I,durationSec:Math.max(0,Math.round((new Date(I).getTime()-new Date(t).getTime())/1e3)),executorNodeId:e.executorId,agentSessionId:S.sessionId,opencodeSessionId:S.sessionId},{repoUrl:e.task.repoUrl,baseBranch:e.task.defaultBranch,taskDescription:e.task.description});return{task:{...e.task,status:"completed",startedAt:t,completedAt:I,updatedAt:I,result:A}}}let l=id(e.task);s=Le({taskId:e.task.id,identity:l,repoUrl:e.task.repoUrl}),e.emit("preparing","\u51C6\u5907\u672C\u5730\u4ED3\u5E93");let{repoDir:d,git:m,taskBranchExists:u}=await cd({workspaceRoot:e.workspaceRoot,task:e.task,branchName:r,bindings:e.projectBindings,env:Ae(s.env,e.runtimeEnvironment)});e.emit("preparing",`\u4ED3\u5E93\u5DF2\u5C31\u7EEA\uFF1A${d}`);let p=o==="original-dir"?e.task.rootPath?.trim()||d:n;if(o==="worktree"){await ad(d,n,r);let D=u||await m.branch(["-r"]).then(U=>U.all.includes(`origin/${r}`))?`origin/${r}`:e.task.baseCommit?.trim()||e.task.defaultBranch?.trim()||"main";await m.raw(["worktree","add","--force","-B",r,n,D]),e.emit("executing",`\u5DF2\u521B\u5EFA worktree\uFF1A${n}`)}else{let D=await ld({git:m,task:e.task,branchName:r,taskBranchExists:u});e.emit("executing",`\u5DF2\u5728\u539F\u59CB\u76EE\u5F55 ${p} \u5207\u6362\u5230 ${D} \u5E76\u5F00\u59CB\u6267\u884C`)}le(p,e.runtimeEnvironment),i=Ic({taskId:e.task.id,worktreePath:p,identity:l,repoUrl:e.task.repoUrl});let f=Ae(i.env,e.runtimeEnvironment),x=md(e.task,p);a=x.cleanup;let k=Ni({step:"install",task:e.task,cwd:p,signal:e.signal,env:f,emit:e.emit}),g=[];k&&g.push(await $i(k,e.emit)),e.emit("executing",`\u5F00\u59CB\u8C03\u7528 ${e.task.agentType} \u6267\u884C\u4EFB\u52A1`);let R=await _i({agentType:e.task.agentType,actingUserId:e.task.requestedByUserId,cwd:x.cwd,title:`Distributed Task ${e.task.id}`,description:Wi(e.task),executionModel:e.task.executionModel??e.task.opencodeConfig?.model,agentSettings:e.task.agentSettings,opencodeConfig:e.task.opencodeConfig,mcpServers:e.task.mcpServers,skipRuntimeCheck:!0,runtimeSkillPackages:e.task.runtimeSkillPackages,runtimeEnv:e.task.runtimeEnv,runtimeEnvironment:e.runtimeEnvironment,signal:e.signal});for(let D of["build","test","lint"]){let U=await Di({step:D,task:e.task,cwd:p,signal:e.signal,env:f,emit:e.emit});U&&g.push(U)}let C=await dd({task:e.task,worktreePath:p,branchName:r,identity:l,env:f}),E=await Xl(e.task,p,r),j;E.patchArtifact&&e.uploadPatchArtifact&&(e.emit("syncing_back","\u6B63\u5728\u4E0A\u4F20 patch \u4EA7\u7269\u5230\u63A7\u5236\u9762"),j=(await e.uploadPatchArtifact({taskId:e.task.id,filename:E.patchArtifact.filename,content:E.patchArtifact.content})).artifactId);let O=new Date().toISOString(),H=Ht({taskId:e.task.id,status:"completed",returnMode:e.task.returnMode,summary:[g.length>0?`\u5DF2\u6267\u884C\u9879\u76EE\u9884\u8BBE\u547D\u4EE4\uFF1A
118
+ `);let I=at(t.codexAuthContent),v=Object.keys(I).sort(),E="none";return rn(t.codexAuthContent)?(Vn(a,`${t.codexAuthContent?.trim()||""}
119
+ `),E="legacy-auth-json"):v.length>0?E="env-json":l&&!Fe(a)&&(ud(s,a),E="local-auth-copy"),zw("runtime-created",{cwd:e,runtimeRoot:r,runtimeRootMode:Gs(e)?"isolated-temp":"stable-per-workspace",configSource:t.codexConfigContent?.trim()?"managed-config-sync":c?"local-codex-home":"empty",configPresent:!!f.trim(),providerId:p.providerId,configuredModel:p.configuredModel||"",providerNameAdded:u.changed,providerEnvKey:p.envKey,providerEnvKeyAdded:m.changed,credentialStrategy:E,managedCredentialEnvKeys:v,sourceAuthExists:l,trustAdded:!!S,mcpConfigAdded:!!w.configText.trim(),mcpEnvKeys:Object.keys(w.env).sort()}),{runtimeEnv:{CODEX_HOME:r,...w.env,...I},cleanup:()=>{Gs(e)&&Zt(r,{recursive:!0,force:!0})}}},sx=(e,t)=>{let r=Ys("claude-home"),n=$.join(r,"mcp.json"),o=process.env.CLAUDE_HOME?.trim()||$.join(Xs.homedir(),".claude"),s=$.join(o,"settings.json"),i=Fe(s)?Vs(s,"utf8").trim():"",a=e.claudeCodeConfigContent?.trim()||i,c=a?Yw(a):null;if(a){if(!c)throw Zt(r,{recursive:!0,force:!0}),new Error("Claude Code settings.json \u683C\u5F0F\u4E0D\u6B63\u786E\u3002");Ks($.join(r,"settings.json"),c.settings)}for(let l of qw){let d=$.join(o,l),p=$.join(r,l);Fe(d)&&!Fe(p)&&ud(d,p)}return Ks(n,nx(e,t)),{runtimeArgs:["--mcp-config",n],runtimeEnv:{CLAUDE_HOME:r,...c?.runtimeEnv??{}},cleanup:()=>{Zt(r,{recursive:!0,force:!0})}}},ix=(e,t)=>{let r=sx(e,t);return{runtimeArgs:r.runtimeArgs,runtimeEnv:r.runtimeEnv,cleanup:()=>{r.cleanup()}}},Jn=(e,t)=>{let r=t.trim();return r?[r,"",e].join(`
120
+ `):e},fd=e=>({promptPrefix:e.promptPrefix,runtimeEnv:{},runtimeArgs:[],cleanup:()=>{e.runtimeSkills?.cleanup()}}),ax=e=>{let t=ox(e.cwd,e.effectiveConfig);return{promptPrefix:e.promptPrefix,runtimeEnv:t.runtimeEnv,runtimeArgs:[],cleanup:()=>{e.runtimeSkills?.cleanup(),t.cleanup()}}},cx=e=>{let t=ix(e.effectiveConfig,e.actingUserId);return{promptPrefix:e.promptPrefix,runtimeEnv:t.runtimeEnv,runtimeArgs:t.runtimeArgs,cleanup:()=>{e.runtimeSkills?.cleanup(),t.cleanup()}}},lx=e=>{let t=e.effectiveConfig.agentSettings.Pi.agentDir?.trim()||e.effectiveConfig.piAgentDir?.trim()||$.join(Xs.homedir(),".pi","agent"),r=e.runtimeSkills?.promptRoot?.trim();return{promptPrefix:e.promptPrefix,runtimeEnv:{VIBEMUX_PI_AGENT_DIR:t,...r?{VIBEMUX_PI_SKILL_PATHS:r}:{}},runtimeArgs:[],cleanup:()=>{e.runtimeSkills?.cleanup()}}},dx={OpenCode:fd,Codex:ax,ClaudeCode:cx,Pi:lx},Qs=e=>{let t=e.workerConfig??T(),r=e.mcpServers?{...t,mcpServers:e.mcpServers}:t,n=e.runtimeSkillPackages??[],o=Fe(e.cwd)?tx(e.agentType,e.cwd,n):null,s=St(e.agentType);return(dx[s]??fd)({agentType:e.agentType,actingUserId:e.actingUserId,cwd:e.cwd,effectiveConfig:r,promptPrefix:"",runtimeSkills:o})};var px=e=>[`\u4EFB\u52A1\u6807\u9898: ${e.title}`,`\u4EFB\u52A1\u63CF\u8FF0: ${e.description}`,"","\u8BF7\u76F4\u63A5\u5728\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u5B8C\u6210\u4EFB\u52A1\u6240\u9700\u4FEE\u6539\u3002","\u5982\u9700\u8BFB\u5199\u6587\u4EF6\u3001\u8FD0\u884C\u547D\u4EE4\u6216\u9A8C\u8BC1\u7ED3\u679C\uFF0C\u8BF7\u76F4\u63A5\u6267\u884C\u3002","\u5B8C\u6210\u540E\u8BF7\u8FD4\u56DE\u7B80\u6D01\u603B\u7ED3\uFF1A\u505A\u4E86\u4EC0\u4E48\u3001\u662F\u5426\u8FD8\u6709\u963B\u585E\u3002"].join(`
121
+ `),_r=(e,t)=>{M(e.agentType,e.onEvent,{type:"session.status",properties:{status:{type:"busy",message:t}}})},hd=(e,t)=>{M(e.agentType,e.onEvent,{type:"session.error",properties:{error:t,message:t}})},mx=(e,t)=>t&&typeof t=="object"&&"code"in t&&t.code==="ENOENT"?`\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u4E0D\u5B58\u5728\uFF1A${e}`:t instanceof Error?`\u65E0\u6CD5\u8BBF\u95EE\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55 ${e}\uFF1A${t.message}`:`\u65E0\u6CD5\u8BBF\u95EE\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\uFF1A${e}`,gx=async e=>{if(!(await ux(U(e))).isDirectory())throw new Error(`\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u4E0D\u662F\u76EE\u5F55\uFF1A${e}`)},fx={OpenCode:async({params:e,prompt:t,runtimeEnv:r,runtimeArgs:n})=>fs({actingUserId:e.actingUserId,resumeSessionId:e.resumeSessionId,cwd:e.cwd,title:e.title,prompt:t,executionModel:e.executionModel,agentSettings:e.agentSettings,opencodeConfig:e.opencodeConfig,mcpServers:e.mcpServers,runtimeEnv:r,runtimeArgs:n,signal:e.signal,onEvent:o=>{M("OpenCode",e.onEvent,o)}}),Codex:async({params:e,prompt:t,runtimeEnv:r,runtimeArgs:n})=>Vl({...e,prompt:t,runtimeEnv:r,runtimeArgs:n}),ClaudeCode:async({params:e,prompt:t,runtimeEnv:r,runtimeArgs:n})=>Ul({...e,prompt:t,runtimeEnv:r,runtimeArgs:n}),Pi:async({params:e,prompt:t,runtimeEnv:r})=>cd({...e,prompt:t,runtimeEnv:r})},Br=async e=>{let t=U(e.cwd);_r(e,"\u6B63\u5728\u68C0\u67E5\u5DE5\u4F5C\u76EE\u5F55...");try{await gx(t)}catch(i){let a=mx(t,i);throw hd(e,a),new Error(a)}if(!e.skipRuntimeCheck){_r(e,"\u6B63\u5728\u6267\u884C\u4E2D");let i=await Se({autoInstall:!0,target:e.agentType});if(!i.ok)throw hd(e,i.message),new Error(i.message)}((e.attachments?.length??0)>0||(e.preparedAttachments?.length??0)>0)&&_r(e,"\u6B63\u5728\u51C6\u5907\u9644\u4EF6...");let r=await qn({attachments:e.attachments,cloudUrl:e.cloudUrl,signal:e.signal});_r(e,"\u6B63\u5728\u51C6\u5907 Agent \u8FD0\u884C\u4E0A\u4E0B\u6587...");let n=e.runtimePrepared?{promptPrefix:"",runtimeEnv:e.runtimeEnv??{},runtimeArgs:e.runtimeArgs??[],cleanup:()=>{}}:Qs({agentType:e.agentType,cwd:t,actingUserId:e.actingUserId,runtimeSkillPackages:e.runtimeSkillPackages,mcpServers:e.mcpServers}),o={...n.runtimeEnv,...e.runtimeEnv??{}},s=Ql(Jn(e.prompt,n.promptPrefix),r.attachments);try{let i=St(e.agentType);_r(e,`\u6B63\u5728\u542F\u52A8 ${Gr(i).label}...`);let a=fx[i];if(!a)throw new Error(`\u6682\u672A\u914D\u7F6E ${i} prompt runner\u3002`);return await a({params:{...e,cwd:t,preparedAttachments:r.attachments},prompt:s,runtimeEnv:o,runtimeArgs:n.runtimeArgs})}finally{await r.cleanup(),n.cleanup()}},Zs=async e=>{let t=U(e.cwd);if(!e.skipRuntimeCheck&&e.agentType==="OpenCode"){let o=await Se({autoInstall:!0,target:e.agentType});if(!o.ok)throw new Error(o.message)}let r=Qs({agentType:e.agentType,cwd:t,actingUserId:e.actingUserId,runtimeSkillPackages:e.runtimeSkillPackages,mcpServers:e.mcpServers}),n={...r.runtimeEnv,...e.runtimeEnv??{}};if(e.agentType==="OpenCode")try{return await gs({actingUserId:e.actingUserId,cwd:t,title:e.title,description:Jn(e.description,r.promptPrefix),executionModel:e.executionModel,agentSettings:e.agentSettings,opencodeConfig:e.opencodeConfig,mcpServers:e.mcpServers,runtimeEnv:n,runtimeArgs:r.runtimeArgs,signal:e.signal})}finally{r.cleanup()}try{return await Br({agentType:e.agentType,actingUserId:e.actingUserId,cwd:t,title:e.title,prompt:Jn(px(e),r.promptPrefix),executionModel:e.executionModel,agentSettings:e.agentSettings,mcpServers:e.mcpServers,runtimeSkillPackages:e.runtimeSkillPackages,runtimeEnv:n,runtimeArgs:r.runtimeArgs,runtimePrepared:!0,signal:e.signal})}finally{r.cleanup()}};var yd=e=>{let t=e.promptQueueState??ei(),{pendingPromptRequests:r,pendingPromptAborts:n,queuedPromptRequestIds:o}=t,s=(u,m)=>{let f=e.getConfig();e.send({type:"executor.agent.prompt.event",executorId:f.executorId,requestId:u.requestId,event:{agentType:u.agentType,type:"session.status",properties:{status:{type:"busy",message:m}}},at:new Date().toISOString()})},i=u=>{let m=o.indexOf(u);m!==-1&&o.splice(m,1),e.setQueuedTaskIds(e.getQueuedTaskIds().filter(f=>f!==br(u)))},a=u=>{r.delete(u),n.delete(u),e.setRunningTaskIds(e.getRunningTaskIds().filter(m=>m!==br(u))),e.syncRuntimeState(),e.drainExecutionQueue()},c=u=>{let m=T();e.setConfig(m),i(u.requestId),e.setRunningTaskIds([...e.getRunningTaskIds(),br(u.requestId)]),e.syncRuntimeState(),console.log("[worker-agent] prompt request",JSON.stringify({requestId:u.requestId,agentType:u.agentType,cwd:u.cwd,agentWorkdir:u.agentWorkdir?.agentId??null,title:u.title,executionModel:u.executionModel??"default",attachmentCount:u.attachments?.length??0,promptPreview:u.prompt.slice(0,160)}));let f=u.agentWorkdir?.agentId?(()=>{let g=Mn(u.agentWorkdir.agentId);return Kc(u.agentWorkdir.agentId,u.agentWorkdir.sessionId?.trim()||u.requestId),g.summary.workDirPath})():u.cwd,S=ae(m.workspaceRoot,f)||f,w=new AbortController;n.set(u.requestId,w),Br({agentType:u.agentType,actingUserId:u.actingUserId,resumeSessionId:u.resumeSessionId,cwd:S,title:u.title,prompt:u.prompt,attachments:u.attachments,cloudUrl:m.cloudUrl,executionModel:u.executionModel,agentSettings:u.agentSettings??m.agentSettings[u.agentType],opencodeConfig:u.opencodeConfig,mcpServers:u.mcpServers,runtimeSkillPackages:u.runtimeSkillPackages,runtimeEnv:u.runtimeEnv,runtimeEnvironment:u.runtimeEnvironment,signal:w.signal,onEvent:g=>{m=e.getConfig(),e.send({type:"executor.agent.prompt.event",executorId:m.executorId,requestId:u.requestId,event:g,at:new Date().toISOString()})}}).then(g=>{m=e.getConfig(),console.log("[worker-agent] prompt response",JSON.stringify({requestId:u.requestId,ok:!0,sessionId:g.sessionId,outputPreview:g.output.slice(0,200)})),e.send({type:"executor.agent.prompt.response",executorId:m.executorId,requestId:u.requestId,result:{ok:!0,output:g.output,sessionId:g.sessionId},at:new Date().toISOString()})}).catch(g=>{m=e.getConfig(),console.log("[worker-agent] prompt response",JSON.stringify({requestId:u.requestId,ok:!1,error:g instanceof Error?g.message:`${u.agentType} \u6267\u884C\u5931\u8D25\u3002`})),e.send({type:"executor.agent.prompt.response",executorId:m.executorId,requestId:u.requestId,result:{ok:!1,output:g instanceof Error?g.message:`${u.agentType} \u6267\u884C\u5931\u8D25\u3002`},at:new Date().toISOString()})}).finally(()=>{a(u.requestId)})},l=()=>{let u=T();for(e.setConfig(u);e.getRunningTaskIds().length<Math.max(1,u.maxConcurrency)&&o.length>0;){let m=o[0];if(!m)break;let f=r.get(m);if(!f){i(m);continue}c(f),u=e.getConfig()}};return{abortActivePrompts:()=>{let u=[...r.keys()];if(u.length!==0){for(let m of u)i(m),r.delete(m),n.get(m)?.abort({reason:"control_plane_disconnect",message:"\u6267\u884C\u5668\u4E0E\u63A7\u5236\u9762\u8FDE\u63A5\u5DF2\u65AD\u5F00\uFF0C\u672C\u6B21\u56DE\u590D\u5DF2\u4E2D\u6B62\u3002"}),n.delete(m);e.syncRuntimeState()}},drainPromptQueue:l,handlePromptMessage:u=>{if(u.type==="executor.agent.prompt.request"){if(!r.has(u.requestId)){r.set(u.requestId,u),o.push(u.requestId),e.setQueuedTaskIds([...e.getQueuedTaskIds(),br(u.requestId)]),e.syncRuntimeState();let m=e.getConfig();e.getRunningTaskIds().length>=Math.max(1,m.maxConcurrency)&&s(u,"\u5F53\u524D\u8282\u70B9\u6B63\u5728\u5904\u7406\u5176\u4ED6\u8BF7\u6C42\uFF0C\u5DF2\u8FDB\u5165\u6392\u961F\uFF0C\u7A0D\u540E\u4F1A\u81EA\u52A8\u5F00\u59CB\u3002")}return l(),!0}return i(u.requestId),r.delete(u.requestId),e.syncRuntimeState(),n.get(u.requestId)?.abort({reason:u.reason??"unknown",message:u.message}),n.delete(u.requestId),e.drainExecutionQueue(),!0}}},ei=()=>({pendingPromptRequests:new Map,pendingPromptAborts:new Map,queuedPromptRequestIds:[]});var hx=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"task",Wr=e=>`task/${hx(e)}`;var yx=e=>{let t=e.split(/\r?\n/).map(r=>r.trim()).find(Boolean);return t?t.length>160?`${t.slice(0,157)}...`:t:"Worker completed the task."},kx=e=>{let t=yx(e.summary),r=(e.taskTitle?.trim()||e.taskDescription?.trim()||"Worker delivery update").replace(/\s+/g," "),n=e.filesChanged.length>0?e.filesChanged.join(", "):"none";return["## Summary",`- ${r}`,`- ${t}`,`- Changed files: ${n}`,"","## Delivery",`- Base branch: ${e.baseBranch}`,`- Compare branch: ${e.compareBranch}`,e.commitShas?.[0]?`- Commit: ${e.commitShas[0]}`:null].filter(Boolean).join(`
122
+ `)},wx=(e,t)=>{let r=(e?.trim()||t?.trim()||"Worker delivery update").replace(/\s+/g," ");return r.length>72?`${r.slice(0,69)}...`:r},xx=e=>{let t={mode:e.returnMode};if(e.returnMode==="patch"&&(t.patch=e.patchArtifactId?{artifactId:e.patchArtifactId,files:e.filesChanged,status:"ready"}:{artifactId:void 0,files:e.filesChanged,status:"blocked",reason:e.filesChanged.length===0?"\u672C\u6B21\u6267\u884C\u6CA1\u6709\u6587\u4EF6\u6539\u52A8\uFF0C\u672A\u751F\u6210 patch\u3002":"\u7F3A\u5C11 patch \u4EA7\u7269\uFF0C\u6682\u65F6\u65E0\u6CD5\u540C\u6B65\u5230\u672C\u5730\u4ED3\u5E93\u3002"},t.patch.status==="blocked"&&(t.syncFailureReason=t.patch.reason)),e.returnMode==="branch"||e.returnMode==="commit"){let r=e.remoteBranchName||Wr(e.taskId),n=e.filesChanged.length>0&&!!e.commitShas?.length,o=!!e.remoteBranchName;t.branch={branchName:r,repoUrl:e.repoUrl,baseBranch:e.baseBranch,pushed:o,suggestedNextStep:n?o?e.returnMode==="commit"?"\u786E\u8BA4 PR \u51C6\u5907\u4FE1\u606F\u540E\u5373\u53EF\u53D1\u8D77 PR\u3002":"\u5230\u76EE\u6807\u4ED3\u5E93\u67E5\u770B\u8BE5\u5206\u652F\uFF0C\u5E76\u51B3\u5B9A\u662F\u5426\u7EE7\u7EED\u53D1\u8D77 PR\u3002":"\u5F53\u524D\u53EA\u6709\u672C\u5730 commit\uFF0C\u8865\u9F50\u51ED\u8BC1\u540E\u63A8\u9001\u8BE5\u5206\u652F\u3002":"\u672C\u6B21\u6267\u884C\u6CA1\u6709\u751F\u6210\u53EF\u4EA4\u4ED8\u5206\u652F\u3002",reason:n?o?void 0:"\u5206\u652F\u540D\u5DF2\u51C6\u5907\uFF0C\u4F46\u5F53\u524D\u7ED3\u679C\u91CC\u8FD8\u6CA1\u6709\u8FDC\u7AEF\u63A8\u9001\u8BB0\u5F55\u3002":e.filesChanged.length===0?"\u672C\u6B21\u6267\u884C\u6CA1\u6709\u4EE3\u7801\u6539\u52A8\uFF0C\u672A\u751F\u6210\u5206\u652F\u4EA4\u4ED8\u3002":"\u672A\u8BB0\u5F55 commit \u7ED3\u679C\uFF0C\u6682\u65F6\u65E0\u6CD5\u786E\u8BA4\u5206\u652F\u4EA4\u4ED8\u3002"},t.branch.reason&&!n&&(t.syncFailureReason=t.branch.reason)}if(e.returnMode==="commit"){let r=e.remoteBranchName||Wr(e.taskId),n=e.filesChanged.length>0&&!!e.commitShas?.length;t.pullRequest={ready:n,remoteReady:!!e.remoteBranchName,repoUrl:e.repoUrl,title:n?wx(e.taskTitle,e.taskDescription):void 0,description:n?kx({summary:e.summary,taskTitle:e.taskTitle,taskDescription:e.taskDescription,filesChanged:e.filesChanged,baseBranch:e.baseBranch,compareBranch:r,commitShas:e.commitShas}):void 0,baseBranch:e.baseBranch,compareBranch:r,reason:n?e.remoteBranchName?void 0:"PR \u6587\u6848\u5DF2\u51C6\u5907\uFF0C\u4F46 compare branch \u8FD8\u6CA1\u6709\u63A8\u9001\u5230\u8FDC\u7AEF\u3002":e.filesChanged.length===0?"\u672C\u6B21\u6267\u884C\u6CA1\u6709\u4EE3\u7801\u6539\u52A8\uFF0C\u672A\u751F\u6210 PR \u51C6\u5907\u4FE1\u606F\u3002":"\u5F53\u524D\u7ED3\u679C\u91CC\u6CA1\u6709 commit \u4FE1\u606F\uFF0C\u6682\u65F6\u65E0\u6CD5\u51C6\u5907 PR\u3002"},t.pullRequest.ready||(t.syncFailureReason=t.pullRequest.reason)}return t},er=(e,t)=>({...e,delivery:xx({taskId:e.taskId,returnMode:e.returnMode,repoUrl:t.repoUrl,baseBranch:t.baseBranch,summary:e.summary,taskTitle:t.taskTitle,taskDescription:t.taskDescription,filesChanged:e.filesChanged,patchArtifactId:e.patchArtifactId,remoteBranchName:e.remoteBranchName,commitShas:e.commitShas})});import{mkdtempSync as Fx,mkdirSync as qx,rmSync as _d,symlinkSync as Hx}from"node:fs";import Gx from"node:os";import Bd from"node:path";import{simpleGit as Sx}from"simple-git";var Cx=async e=>{let t=await e.status();return Array.from(new Set(t.files.map(r=>r.path))).sort()},vx=async(e,t)=>{if(t.returnMode!=="patch")return;await e.add(["--all"]);let r=await e.diff(["--cached","--binary",t.baseCommit]);if(r.trim())return{filename:`${t.id}.patch`,content:r}},kd=async(e,t,r)=>{let n=Sx(t),o=await Cx(n),s=await vx(n,e);return{filesChanged:o,commitShas:void 0,patchArtifact:s,remoteBranchName:e.returnMode==="branch"?r:void 0}};import{spawn as Px}from"node:child_process";var Ix=["&&","||","|",";",">","<","$(","`"],Ex=(e,t=1600)=>{let r=e.trim();return r?r.length>t?`${r.slice(0,t)}
123
+ ...\uFF08\u5DF2\u622A\u65AD\uFF09`:r:""},bx=e=>{let t=[],r="",n=null,o=!1;for(let s of e){if(o){r+=s,o=!1;continue}if(s==="\\"){o=!0;continue}if(n){s===n?n=null:r+=s;continue}if(s==='"'||s==="'"){n=s;continue}if(/\s/.test(s)){r&&(t.push(r),r="");continue}r+=s}if(o&&(r+="\\"),n)throw new Error("\u73AF\u5883\u6A21\u677F\u547D\u4EE4\u5B58\u5728\u672A\u95ED\u5408\u7684\u5F15\u53F7\u3002");return r&&t.push(r),t},Tx=e=>{let t=e.trim();if(!t)throw new Error("\u73AF\u5883\u6A21\u677F\u547D\u4EE4\u4E0D\u80FD\u4E3A\u7A7A\u3002");if(Ix.some(s=>t.includes(s)))throw new Error("\u73AF\u5883\u6A21\u677F\u547D\u4EE4\u53EA\u652F\u6301\u5355\u6761\u547D\u4EE4\uFF0C\u4E0D\u652F\u6301 shell \u7BA1\u9053\u3001\u91CD\u5B9A\u5411\u6216\u4E32\u8054\u64CD\u4F5C\u3002");let r=bx(t),n={};for(;r.length>0&&/^[A-Za-z_][A-Za-z0-9_]*=.*/.test(r[0]);){let s=r.shift(),i=s.indexOf("=");n[s.slice(0,i)]=s.slice(i+1)}let o=r.shift();if(!o)throw new Error("\u73AF\u5883\u6A21\u677F\u547D\u4EE4\u7F3A\u5C11\u53EF\u6267\u884C\u547D\u4EE4\u3002");return{command:o,args:r,env:n}},wd=(e,t)=>{if(e)return t==="install"?e.installCommand?.trim()||void 0:t==="build"?e.buildCommand?.trim()||void 0:t==="test"?e.testCommand?.trim()||void 0:e.lintCommand?.trim()||void 0},Rx=e=>e?[e.installCommand?`install: ${e.installCommand}`:null,e.devCommand?`dev: ${e.devCommand}`:null,e.buildCommand?`build: ${e.buildCommand}`:null,e.testCommand?`test: ${e.testCommand}`:null,e.lintCommand?`lint: ${e.lintCommand}`:null,e.branchNamePattern?`branch: ${e.branchNamePattern}`:null].filter(t=>!!t):[],ti=e=>{let t=Rx(e.commandPreset);return t.length===0?e.description:[e.description,"","\u9879\u76EE\u73AF\u5883\u6A21\u677F\u547D\u4EE4\uFF1A",...t.map(r=>`- ${r}`),"","\u6267\u884C\u8981\u6C42\uFF1A","- \u4F18\u5148\u9075\u5B88\u4E0A\u9762\u7684\u9879\u76EE\u73AF\u5883\u6A21\u677F\u547D\u4EE4\u3002","- install \u547D\u4EE4\u4F1A\u5728 worktree \u521B\u5EFA\u540E\u7ACB\u5373\u540E\u53F0\u542F\u52A8\u3002","- build / test / lint \u547D\u4EE4\u7531 worker \u5728\u6267\u884C\u540E\u81EA\u52A8\u6821\u9A8C\u3002"].join(`
124
+ `)},xd=async e=>{let t=Tx(e.commandText);return await new Promise((r,n)=>{let o=Px(t.command,t.args,{cwd:e.cwd,env:{...e.env??process.env,...t.env},stdio:["ignore","pipe","pipe"]}),s="",i="",a=!1,c=()=>{a=!0,o.kill("SIGTERM")};e.signal?.addEventListener("abort",c,{once:!0}),o.stdout.on("data",l=>{s+=l.toString()}),o.stderr.on("data",l=>{i+=l.toString()}),o.on("error",l=>{e.signal?.removeEventListener("abort",c),n(new Error(`${e.label} \u542F\u52A8\u5931\u8D25\uFF1A${l.message}`))}),o.on("close",(l,d)=>{if(e.signal?.removeEventListener("abort",c),a){n(new Error(`${e.label} \u5DF2\u53D6\u6D88\u3002`));return}let p=Ex([s,i].filter(Boolean).join(`
125
+ `));if(l===0){r({output:p});return}let u=d?`\u4FE1\u53F7 ${d}`:`\u9000\u51FA\u7801 ${l??"unknown"}`;n(new Error([`${e.label} \u6267\u884C\u5931\u8D25\uFF08${u}\uFF09\u3002`,p].filter(Boolean).join(`
126
+
127
+ `)))})})},ri=async e=>{let t=wd(e.task.commandPreset,e.step);if(!t)return null;let r=`\u9879\u76EE\u9884\u8BBE ${e.step}`;e.emit("executing",`${r}\uFF1A${t}`);let n=await xd({cwd:e.cwd,label:r,commandText:t,signal:e.signal,env:e.env});return e.emit("executing",n.output?`${r} \u5DF2\u5B8C\u6210\u3002
128
+ ${n.output}`:`${r} \u5DF2\u5B8C\u6210\u3002`),`${r}\uFF1A${t}`},ni=e=>{let t=wd(e.task.commandPreset,e.step);if(!t)return null;let r=`\u9879\u76EE\u9884\u8BBE ${e.step}`;return e.emit("executing",`${r} \u5DF2\u5728\u540E\u53F0\u542F\u52A8\uFF1A${t}`),{commandText:t,label:r,promise:xd({cwd:e.cwd,label:r,commandText:t,signal:e.signal,env:e.env})}},oi=async(e,t)=>{let r=await e.promise;return t("executing",r.output?`${e.label} \u5DF2\u5B8C\u6210\u3002
129
+ ${r.output}`:`${e.label} \u5DF2\u5B8C\u6210\u3002`),`${e.label}\uFF1A${e.commandText}`};import{createHash as Ax}from"node:crypto";import{existsSync as Sd,mkdirSync as vd,rmSync as Mx}from"node:fs";import tr from"node:path";import{simpleGit as Dr}from"simple-git";var Ox="main",Pd=(e,t)=>{let r={..._t(t),...e?{baseDir:e}:{}};return Dr(r).env(t??{})},_x=e=>Ax("sha1").update(e).digest("hex").slice(0,12),Bx=e=>e.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"repo",Wx=(e,t)=>{let r=tr.basename(t).replace(/\.git$/i,"");return tr.join(e,"repos",`${Bx(r)}-${_x(t)}`)},Id=e=>e.baseCommit?.trim()||e.defaultBranch?.trim()||Ox,si=e=>`origin/${e}`,Dx=async(e,t,r)=>(await Pd(void 0,r).raw(["ls-remote","--heads",e,t])).trim().length>0,Cd=async(e,t)=>{console.log("[worker] [task-worktree] fetching target branch only",JSON.stringify({branchName:t})),await e.fetch(["origin",`${t}:refs/remotes/origin/${t}`])},Ed=async(e,t)=>(await e.branch(["-r"])).all.includes(si(t)),Nx=async(e,t)=>{await e.fetch(["--all","--prune"]),await Ed(e,t)&&await e.rebase([si(t)])},bd=e=>e.gitIdentity??{mode:e.gitIdentityMode??"personal"},Td=e=>e.workingDirectoryMode==="original-dir"?"original-dir":"worktree",Ux=(e,t)=>t.versionControl!=="git-remote"&&t.rootPath?.trim()?t.rootPath.trim():e?.find(r=>!!(r.projectId&&r.projectId===t.projectId||r.repoUrl&&r.repoUrl===t.repoUrl))?.localPath,$x=async e=>{let t=await e.raw(["worktree","list","--porcelain"]),r=[],n=null;for(let o of t.split(`
130
+ `)){if(o.startsWith("worktree ")){n&&r.push(n),n={path:tr.resolve(o.slice(9).trim())};continue}o.startsWith("branch ")&&n&&(n.branch=o.slice(7).trim())}return n&&r.push(n),r},Lx=async(e,t)=>(await e.branchLocal()).all.includes(t),jx=e=>{Mx(e,{recursive:!0,force:!0,maxRetries:5,retryDelay:100})},Rd=async(e,t,r)=>{let n=Dr(e),o=tr.resolve(t),s=`refs/heads/${r}`;try{await n.raw(["worktree","prune"])}catch{}let a=(await $x(n)).find(c=>c.branch===s);if(a&&a.path!==o)try{await n.raw(["worktree","remove","--force",a.path])}catch{}try{await n.raw(["worktree","remove","--force",o])}catch{}if(jx(o),await Lx(n,r))try{await n.deleteLocalBranch(r,!0)}catch{}try{await n.raw(["worktree","prune"])}catch{}vd(tr.dirname(o),{recursive:!0})},Ad=async e=>{let t=Ux(e.bindings,e.task)||Wx(e.workspaceRoot,e.task.repoUrl),r=Id(e.task);if(vd(tr.dirname(t),{recursive:!0}),e.task.versionControl==="git-local"){let s=Dr(t).env(e.env??{});if(!Sd(t)||!await s.checkIsRepo().catch(()=>!1))throw new Error("\u672C\u5730 Git \u9879\u76EE\u76EE\u5F55\u672A\u521D\u59CB\u5316\uFF0C\u65E0\u6CD5\u521B\u5EFA\u4EFB\u52A1 worktree\u3002");return{repoDir:t,git:s,taskBranchExists:!1}}Sd(t)||(console.log("[worker] [task-worktree] cloning target branch only",JSON.stringify({repoDir:t,repoUrl:e.task.repoUrl,startPoint:r})),await Dr().env(e.env??{}).clone(e.task.repoUrl,t,["--no-checkout","--single-branch","--branch",r]));let n=Dr(t).env(e.env??{});await Cd(n,r);let o=await Dx(e.task.repoUrl,e.branchName,e.env);return o&&e.branchName!==r&&await Cd(n,e.branchName),{repoDir:t,git:n,taskBranchExists:o}},Md=async e=>{let t=e.taskBranchExists||await Ed(e.git,e.branchName)?si(e.branchName):Id(e.task);return await e.git.checkout(["-B",e.branchName,t]),t},Od=async e=>{let t=Pd(e.worktreePath,e.env),r=await t.status(),n=Array.from(new Set(r.files.map(c=>c.path))).sort();if(n.length===0)return{changedFiles:n,commitShas:void 0,remoteBranchName:void 0,pushMessage:"\u6CA1\u6709\u6587\u4EF6\u6539\u52A8\uFF0C\u8DF3\u8FC7\u63D0\u4EA4\u4E0E\u63A8\u9001\u3002"};if(e.task.autoCommitEnabled===!1)return{changedFiles:n,commitShas:void 0,remoteBranchName:void 0,pushMessage:"\u5F53\u524D\u5DE5\u4F5C\u533A\u5DF2\u5173\u95ED\u81EA\u52A8\u63D0\u4EA4 / \u63A8\u9001\uFF0C\u6539\u52A8\u4FDD\u7559\u5728\u672C\u5730\u76EE\u5F55\u3002"};if(e.task.returnMode!=="branch"&&e.task.returnMode!=="commit")return{changedFiles:n,commitShas:void 0,remoteBranchName:void 0,pushMessage:void 0};if(!e.identity.name||!e.identity.email)throw new Error("\u5F53\u524D\u4EFB\u52A1\u7F3A\u5C11 Git \u7528\u6237\u540D\u6216\u90AE\u7BB1\uFF0C\u8BF7\u5148\u5728\u8BBE\u7F6E\u9875\u5B8C\u6210 Git \u6388\u6743\u914D\u7F6E\u3002");await t.add(["--all"]),await t.commit(`vibemux: ${e.task.id}`);let o=(await t.revparse(["HEAD"])).trim(),s,i="\u5DF2\u521B\u5EFA\u672C\u5730\u63D0\u4EA4\u3002",a=e.task.versionControl??(e.task.repoUrl.trim()?"git-remote":"none");return a==="git-remote"&&e.identity.credentialToken?(await Nx(t,e.branchName),await t.push(["-u","origin",e.branchName]),s=e.branchName,i=`\u5DF2\u63A8\u9001\u8FDC\u7AEF\u5206\u652F ${e.branchName}\u3002`):a==="git-local"?i="\u672C\u5730 Git \u9879\u76EE\u5DF2\u521B\u5EFA\u672C\u5730\u63D0\u4EA4\uFF0C\u672A\u5C1D\u8BD5\u63A8\u9001\u8FDC\u7AEF\u3002":(e.task.returnMode==="branch"||e.task.returnMode==="commit")&&(i="\u7F3A\u5C11 task \u7EA7\u4E34\u65F6\u51ED\u8BC1\uFF0C\u5DF2\u521B\u5EFA\u672C\u5730\u63D0\u4EA4\u4F46\u672A\u63A8\u9001\u8FDC\u7AEF\u3002"),{changedFiles:n,commitShas:o?[o]:void 0,remoteBranchName:s,pushMessage:i}};var zx="vibemux-task-runtime-",Wd=e=>e?.mode==="env-file"?e:void 0,Kx=e=>e==="Codex"||e==="ClaudeCode",Dd=(e,t)=>{if(!Kx(e.agentType))return{cwd:t,cleanup:()=>{}};let r=Fx(Bd.join(Gx.tmpdir(),`${zx}${e.id.slice(0,8)}-`)),n=Bd.join(r,"workspace");try{return Hx(t,n,process.platform==="win32"?"junction":"dir"),{cwd:n,cleanup:()=>{_d(r,{recursive:!0,force:!0})}}}catch{return _d(r,{recursive:!0,force:!0}),{cwd:t,cleanup:()=>{}}}},Nd=async e=>{let t=new Date().toISOString(),r=Wr(e.task.id),n=ya(e.workspaceRoot,e.task.id,e.task.workspaceId),o=Td(e.task),s=null,i=null,a=null;try{e.emit("preparing","\u68C0\u67E5 Worker \u8FD0\u884C\u73AF\u5883");let c=await Se({autoInstall:!0,target:e.task.agentType});if(!c.ok)throw new Error(c.message);if(e.emit("preparing","\u8FD0\u884C\u73AF\u5883\u5DF2\u5C31\u7EEA"),e.task.versionControl==="none"){let D=e.task.rootPath?.trim()||n;qx(D,{recursive:!0}),Xe(D,Wd(e.runtimeEnvironment)),e.emit("preparing",`\u9879\u76EE\u76EE\u5F55\u5DF2\u5C31\u7EEA\uFF1A${D}`);let L=Dd(e.task,D);a=L.cleanup;let j=ni({step:"install",task:e.task,cwd:D,signal:e.signal,emit:e.emit}),J=[];j&&J.push(await oi(j,e.emit)),e.emit("executing",`\u5F00\u59CB\u8C03\u7528 ${e.task.agentType} \u6267\u884C\u4EFB\u52A1`);let x=await Zs({agentType:e.task.agentType,actingUserId:e.task.requestedByUserId,cwd:L.cwd,title:`Distributed Task ${e.task.id}`,description:ti(e.task),executionModel:e.task.executionModel??e.task.opencodeConfig?.model,agentSettings:e.task.agentSettings,opencodeConfig:e.task.opencodeConfig,mcpServers:e.task.mcpServers,skipRuntimeCheck:!0,runtimeSkillPackages:e.task.runtimeSkillPackages,runtimeEnv:e.task.runtimeEnv,signal:e.signal});for(let h of["build","test","lint"]){let P=await ri({step:h,task:e.task,cwd:D,signal:e.signal,emit:e.emit});P&&J.push(P)}let b=new Date().toISOString(),A=er({taskId:e.task.id,status:"completed",returnMode:e.task.returnMode,summary:[J.length>0?`\u5DF2\u6267\u884C\u9879\u76EE\u9884\u8BBE\u547D\u4EE4\uFF1A
131
+ ${J.map(h=>`- ${h}`).join(`
132
+ `)}`:void 0,x.output].filter(Boolean).join(`
133
+
134
+ `),output:x.output,filesChanged:[],startedAt:t,completedAt:b,durationSec:Math.max(0,Math.round((new Date(b).getTime()-new Date(t).getTime())/1e3)),executorNodeId:e.executorId,agentSessionId:x.sessionId,opencodeSessionId:x.sessionId,usage:x.usage},{repoUrl:e.task.repoUrl,baseBranch:e.task.defaultBranch,taskDescription:e.task.description});return{task:{...e.task,status:"completed",startedAt:t,completedAt:b,updatedAt:b,result:A}}}let l=bd(e.task);i=$e({taskId:e.task.id,identity:l,repoUrl:e.task.repoUrl}),e.emit("preparing","\u51C6\u5907\u672C\u5730\u4ED3\u5E93");let{repoDir:d,git:p,taskBranchExists:u}=await Ad({workspaceRoot:e.workspaceRoot,task:e.task,branchName:r,bindings:e.projectBindings,env:i.env});e.emit("preparing",`\u4ED3\u5E93\u5DF2\u5C31\u7EEA\uFF1A${d}`);let m=o==="original-dir"?e.task.rootPath?.trim()||d:n;if(o==="worktree"){await Rd(d,n,r);let D=u||await p.branch(["-r"]).then(L=>L.all.includes(`origin/${r}`))?`origin/${r}`:e.task.baseCommit?.trim()||e.task.defaultBranch?.trim()||"main";await p.raw(["worktree","add","--force","-B",r,n,D]),e.emit("executing",`\u5DF2\u521B\u5EFA worktree\uFF1A${n}`)}else{let D=await Md({git:p,task:e.task,branchName:r,taskBranchExists:u});e.emit("executing",`\u5DF2\u5728\u539F\u59CB\u76EE\u5F55 ${m} \u5207\u6362\u5230 ${D} \u5E76\u5F00\u59CB\u6267\u884C`)}Xe(m,Wd(e.runtimeEnvironment)),s=Yc({taskId:e.task.id,worktreePath:m,identity:l,repoUrl:e.task.repoUrl});let f=s.env,S=Dd(e.task,m);a=S.cleanup;let w=ni({step:"install",task:e.task,cwd:m,signal:e.signal,env:f,emit:e.emit}),g=[];w&&g.push(await oi(w,e.emit)),e.emit("executing",`\u5F00\u59CB\u8C03\u7528 ${e.task.agentType} \u6267\u884C\u4EFB\u52A1`);let I=await Zs({agentType:e.task.agentType,actingUserId:e.task.requestedByUserId,cwd:S.cwd,title:`Distributed Task ${e.task.id}`,description:ti(e.task),executionModel:e.task.executionModel??e.task.opencodeConfig?.model,agentSettings:e.task.agentSettings,opencodeConfig:e.task.opencodeConfig,mcpServers:e.task.mcpServers,skipRuntimeCheck:!0,runtimeSkillPackages:e.task.runtimeSkillPackages,runtimeEnv:e.task.runtimeEnv,signal:e.signal});for(let D of["build","test","lint"]){let L=await ri({step:D,task:e.task,cwd:m,signal:e.signal,env:f,emit:e.emit});L&&g.push(L)}let v=await Od({task:e.task,worktreePath:m,branchName:r,identity:l,env:f}),E=await kd(e.task,m,r),F;E.patchArtifact&&e.uploadPatchArtifact&&(e.emit("syncing_back","\u6B63\u5728\u4E0A\u4F20 patch \u4EA7\u7269\u5230\u63A7\u5236\u9762"),F=(await e.uploadPatchArtifact({taskId:e.task.id,filename:E.patchArtifact.filename,content:E.patchArtifact.content})).artifactId);let O=new Date().toISOString(),z=er({taskId:e.task.id,status:"completed",returnMode:e.task.returnMode,summary:[g.length>0?`\u5DF2\u6267\u884C\u9879\u76EE\u9884\u8BBE\u547D\u4EE4\uFF1A
134
135
  ${g.map(D=>`- ${D}`).join(`
135
- `)}`:void 0,R.output,C.pushMessage].filter(Boolean).join(`
136
+ `)}`:void 0,I.output,v.pushMessage].filter(Boolean).join(`
136
137
 
137
- `),output:R.output,filesChanged:C.changedFiles.length>0?C.changedFiles:E.filesChanged,remoteBranchName:C.remoteBranchName,commitShas:C.commitShas??E.commitShas,patchArtifactId:j,startedAt:t,completedAt:O,durationSec:Math.max(0,Math.round((new Date(O).getTime()-new Date(t).getTime())/1e3)),executorNodeId:e.executorId,agentSessionId:R.sessionId,opencodeSessionId:R.sessionId},{repoUrl:e.task.repoUrl,baseBranch:e.task.defaultBranch,taskDescription:e.task.description});return{task:{...e.task,status:"completed",startedAt:t,completedAt:O,updatedAt:O,result:H}}}catch(c){let l=new Date().toISOString(),d=c instanceof Error?c.message:"worker task execution failed";return{task:{...e.task,status:"failed",startedAt:t,completedAt:l,updatedAt:l,errorMessage:d,result:Ht({taskId:e.task.id,status:"failed",returnMode:e.task.returnMode,summary:d,output:d,filesChanged:[],startedAt:t,completedAt:l,durationSec:Math.max(0,Math.round((new Date(l).getTime()-new Date(t).getTime())/1e3)),executorNodeId:e.executorId},{repoUrl:e.task.repoUrl,baseBranch:e.task.defaultBranch,taskDescription:e.task.description})}}}finally{a?.(),i?.cleanup(),s?.cleanup()}};var Li=new Map,ji=e=>{let t=Li.get(e);if(t){for(let r of t)clearTimeout(r);Li.delete(e)}},fd=(e,t,r)=>{let n=new Date().toISOString();return{...e,status:"cancelled",executorNodeId:t,completedAt:n,updatedAt:n,result:Ht({taskId:e.id,status:"cancelled",returnMode:e.returnMode,summary:r??"\u4EFB\u52A1\u5DF2\u53D6\u6D88",filesChanged:[],startedAt:e.startedAt??n,completedAt:n,durationSec:0,executorNodeId:t},{repoUrl:e.repoUrl,baseBranch:e.defaultBranch,taskDescription:e.description})}},hd=ji,yd=e=>{let{task:t,executorId:r,workspaceRoot:n,projectBindings:o,uploadPatchArtifact:i,send:s}=e,a=new AbortController,c=[setTimeout(()=>{e.onStart(t.id),gd({task:t,runtimeEnvironment:e.runtimeEnvironment,executorId:r,workspaceRoot:n,projectBindings:o,signal:a.signal,uploadPatchArtifact:i,emit(l,d){a.signal.aborted||s({type:"task.event",taskId:t.id,idempotencyKey:t.idempotencyKey,executorId:r,status:l,message:d,at:new Date().toISOString()})}}).then(({task:l})=>{a.signal.aborted||(e.onFinish(t.id),s({type:"task.result",executorId:r,task:l}),ji(t.id))})},20)];return Li.set(t.id,c),{abort(){a.abort(),e.onFinish(t.id),ji(t.id)}}};var kd=(e,t)=>{let r=t.getConfig();if(e.type==="task.assign"){let n=t.getRunningTaskIds(),o=t.getQueuedTaskIds();return t.assignedTasks.has(e.task.id)||n.includes(e.task.id)||o.includes(e.task.id)?(t.assignedTasks.set(e.task.id,{task:e.task,runtimeEnvironment:e.runtimeEnvironment}),!0):(t.assignedTasks.set(e.task.id,{task:e.task,runtimeEnvironment:e.runtimeEnvironment}),t.setQueuedTaskIds([...o,e.task.id]),t.syncRuntimeState(),t.send({type:"task.ack",taskId:e.task.id,idempotencyKey:e.task.idempotencyKey,executorId:r.executorId,accepted:!0}),t.drainExecutionQueue(),!0)}if(e.type==="task.cancel"){let n=t.assignedTasks.get(e.taskId);return t.activeExecutions.get(e.taskId)?.abort(),t.activeExecutions.delete(e.taskId),hd(e.taskId),t.assignedTasks.delete(e.taskId),t.setQueuedTaskIds(t.getQueuedTaskIds().filter(o=>o!==e.taskId)),t.setRunningTaskIds(t.getRunningTaskIds().filter(o=>o!==e.taskId)),t.syncRuntimeState(),t.drainExecutionQueue(),n&&t.send({type:"task.result",executorId:r.executorId,task:fd(n.task,r.executorId,e.reason)}),!0}return!1};var wd=(e,t)=>{let r=t.getConfig(),n=()=>(r=b(),t.setConfig(r),r);if(e.type==="executor.terminal.request"){n();let o=Date.now(),i=e.cwd||r.workspaceRoot;return Me("received one-shot terminal request",{requestId:e.requestId,command:e.command,cwd:i,mode:e.mode??"wait"}),t.runTerminalCommand(e.command,i,{mode:e.mode??"wait",runtimeEnvironment:e.runtimeEnvironment}).then(s=>{let a=Date.now()-o;Me("completed one-shot terminal request",{requestId:e.requestId,cwd:i,mode:e.mode??"wait",durationMs:a,exitCode:s.exitCode,detached:s.detached,pid:s.pid,stdout:s.stdout,stderr:s.stderr}),t.send({type:"executor.terminal.response",executorId:r.executorId,requestId:e.requestId,result:s})}).catch(s=>{Me("failed one-shot terminal request",{requestId:e.requestId,cwd:i,mode:e.mode??"wait",durationMs:Date.now()-o,error:s instanceof Error?s.message:String(s)})}),!0}if(e.type==="executor.terminal.session.open"){n();let o=e.cwd||r.workspaceRoot;Me("received terminal session open",{sessionId:e.sessionId,cwd:o});let i=t.openTerminalSession({cwd:o,runtimeEnvironment:e.runtimeEnvironment,onExit:s=>{t.terminalSessions.delete(e.sessionId),t.send({type:"executor.terminal.session.exit",executorId:r.executorId,sessionId:e.sessionId,exitCode:s,at:new Date().toISOString()})},onLog:(s,a)=>{Me(s,{sessionId:e.sessionId,...a})},onOutput:(s,a)=>{r.executorId&&ml({send:t.send,executorId:r.executorId,sessionId:e.sessionId,stream:s,chunk:a})},onReady:(s,a,c)=>{t.send({type:"executor.terminal.session.ready",executorId:r.executorId,sessionId:e.sessionId,cwd:c,mode:s,at:new Date().toISOString()}),Me("terminal session ready",{sessionId:e.sessionId,cwd:c,mode:s,backend:a})}});return t.terminalSessions.set(e.sessionId,i),!0}if(e.type==="executor.terminal.session.input")return Me("received terminal session input",{sessionId:e.sessionId,inputLength:e.input.length,preview:e.input.slice(0,80)}),t.terminalSessions.get(e.sessionId)?.write(e.input),!0;if(e.type==="executor.terminal.session.resize")return Me("received terminal session resize",{sessionId:e.sessionId,cols:e.cols,rows:e.rows}),t.terminalSessions.get(e.sessionId)?.resize(e.cols,e.rows),!0;if(e.type==="executor.terminal.session.close"){Me("received terminal session close",{sessionId:e.sessionId});let o=t.terminalSessions.get(e.sessionId);return o&&(o.kill(),t.terminalSessions.delete(e.sessionId)),!0}return!1};var xd=e=>{let t=Vl(e),r=n=>{if(e.getCurrentSocket()===e.expectedSocket&&!uc(n,e)&&!gl(n,e)&&!fl(n,e)){if(n.type==="executor.agent.prompt.request"||n.type==="executor.agent.prompt.cancel"){t.handlePromptMessage(n);return}wd(n,e)||kd(n,e)}};return{abortActivePrompts:t.abortActivePrompts,handleMessage:r,drainPromptQueue:t.drainPromptQueue}};import{existsSync as Fi,mkdirSync as ax,readFileSync as Sd}from"node:fs";import{spawnSync as cx}from"node:child_process";import lx from"node:os";import Wn from"node:path";var vd=Wn.join(lx.homedir(),".ssh"),dx=["id_ed25519.pub","id_rsa.pub","id_ecdsa.pub"],ux="vibemux_worker_ed25519",px=e=>{ax(Wn.dirname(e),{recursive:!0});let t=cx("ssh-keygen",["-t","ed25519","-C","vibemux-worker","-f",e,"-N",""],{encoding:"utf8"});if(t.status!==0)throw new Error((t.stderr||t.stdout||"ssh-keygen \u6267\u884C\u5931\u8D25\u3002").trim())},qi=()=>{try{for(let r of dx){let n=Wn.join(vd,r);if(Fi(n))return Sd(n,"utf8").trim()}let e=Wn.join(vd,ux),t=`${e}.pub`;return Fi(t)||px(e),Fi(t)?Sd(t,"utf8").trim():void 0}catch{return}};import{spawn as Nn,spawnSync as mx}from"node:child_process";import{accessSync as gx,constants as fx,mkdtempSync as hx,readFileSync as yx,rmSync as kx}from"node:fs";import Gi from"node:os";import{createRequire as wx}from"node:module";import Hi from"node:path";import{StringDecoder as Cd}from"node:string_decoder";var Ad=120,Md=32,zi="xterm-256color",xx=250,Sx=1500,Pd=24e3,vx=1500,Cx=wx(import.meta.url),Px=String.raw`
138
+ `),output:I.output,filesChanged:v.changedFiles.length>0?v.changedFiles:E.filesChanged,remoteBranchName:v.remoteBranchName,commitShas:v.commitShas??E.commitShas,patchArtifactId:F,startedAt:t,completedAt:O,durationSec:Math.max(0,Math.round((new Date(O).getTime()-new Date(t).getTime())/1e3)),executorNodeId:e.executorId,agentSessionId:I.sessionId,opencodeSessionId:I.sessionId,usage:I.usage},{repoUrl:e.task.repoUrl,baseBranch:e.task.defaultBranch,taskDescription:e.task.description});return{task:{...e.task,status:"completed",startedAt:t,completedAt:O,updatedAt:O,result:z}}}catch(c){let l=new Date().toISOString(),d=c instanceof Error?c.message:"worker task execution failed";return{task:{...e.task,status:"failed",startedAt:t,completedAt:l,updatedAt:l,errorMessage:d,result:er({taskId:e.task.id,status:"failed",returnMode:e.task.returnMode,summary:d,output:d,filesChanged:[],startedAt:t,completedAt:l,durationSec:Math.max(0,Math.round((new Date(l).getTime()-new Date(t).getTime())/1e3)),executorNodeId:e.executorId},{repoUrl:e.task.repoUrl,baseBranch:e.task.defaultBranch,taskDescription:e.task.description})}}}finally{a?.(),s?.cleanup(),i?.cleanup()}};var ii=new Map,ai=e=>{let t=ii.get(e);if(t){for(let r of t)clearTimeout(r);ii.delete(e)}},Ud=(e,t,r)=>{let n=new Date().toISOString();return{...e,status:"cancelled",executorNodeId:t,completedAt:n,updatedAt:n,result:er({taskId:e.id,status:"cancelled",returnMode:e.returnMode,summary:r??"\u4EFB\u52A1\u5DF2\u53D6\u6D88",filesChanged:[],startedAt:e.startedAt??n,completedAt:n,durationSec:0,executorNodeId:t},{repoUrl:e.repoUrl,baseBranch:e.defaultBranch,taskDescription:e.description})}},$d=ai,Ld=e=>{let{task:t,executorId:r,workspaceRoot:n,projectBindings:o,uploadPatchArtifact:s,send:i}=e,a=new AbortController,c=[setTimeout(()=>{e.onStart(t.id),Nd({task:t,runtimeEnvironment:e.runtimeEnvironment,executorId:r,workspaceRoot:n,projectBindings:o,signal:a.signal,uploadPatchArtifact:s,emit(l,d){a.signal.aborted||i({type:"task.event",taskId:t.id,idempotencyKey:t.idempotencyKey,executorId:r,status:l,message:d,at:new Date().toISOString()})}}).then(({task:l})=>{a.signal.aborted||(e.onFinish(t.id),i({type:"task.result",executorId:r,task:l}),ai(t.id))})},20)];return ii.set(t.id,c),{abort(){a.abort(),e.onFinish(t.id),ai(t.id)}}};var jd=(e,t)=>{let r=t.getConfig();if(e.type==="task.assign"){let n=t.getRunningTaskIds(),o=t.getQueuedTaskIds();return t.assignedTasks.has(e.task.id)||n.includes(e.task.id)||o.includes(e.task.id)?(t.assignedTasks.set(e.task.id,{task:e.task,runtimeEnvironment:e.runtimeEnvironment}),!0):(t.assignedTasks.set(e.task.id,{task:e.task,runtimeEnvironment:e.runtimeEnvironment}),t.setQueuedTaskIds([...o,e.task.id]),t.syncRuntimeState(),t.send({type:"task.ack",taskId:e.task.id,idempotencyKey:e.task.idempotencyKey,executorId:r.executorId,accepted:!0}),t.drainExecutionQueue(),!0)}if(e.type==="task.cancel"){let n=t.assignedTasks.get(e.taskId);return t.activeExecutions.get(e.taskId)?.abort(),t.activeExecutions.delete(e.taskId),$d(e.taskId),t.assignedTasks.delete(e.taskId),t.setQueuedTaskIds(t.getQueuedTaskIds().filter(o=>o!==e.taskId)),t.setRunningTaskIds(t.getRunningTaskIds().filter(o=>o!==e.taskId)),t.syncRuntimeState(),t.drainExecutionQueue(),n&&t.send({type:"task.result",executorId:r.executorId,task:Ud(n.task,r.executorId,e.reason)}),!0}return!1};import{mkdirSync as Vx}from"node:fs";var Jx=e=>{let t=e.title?.trim();return t||(e.scope==="workspace"?`Workspace ${e.terminalId}`:`Terminal ${e.terminalId}`)},Xx=(e,t)=>{let r=t.getConfig();t.send({type:"executor.terminal.sessions.list.response",executorId:r.executorId,requestId:e.requestId,result:{ok:!0,sessions:t.terminalSessions.list({executorId:r.executorId,scope:e.scope,workspaceId:e.workspaceId})},at:new Date().toISOString()})},Fd=(e,t)=>{let r=ae(e,t||e)||U(e);return Dn(e,r)&&Vx(r,{recursive:!0}),r},qd=(e,t)=>{let r=t.getConfig(),n=()=>(r=T(),t.setConfig(r),r);if(e.type==="executor.terminal.request"){n();let o=Date.now(),s;try{s=Fd(r.workspaceRoot,e.cwd)}catch(i){let a=i instanceof Error?`\u9879\u76EE\u76EE\u5F55\u51C6\u5907\u5931\u8D25\uFF1A${i.message}`:"\u9879\u76EE\u76EE\u5F55\u51C6\u5907\u5931\u8D25\u3002";return t.send({type:"executor.terminal.response",executorId:r.executorId,requestId:e.requestId,result:{command:e.command,cwd:e.cwd,stdout:"",stderr:a,exitCode:1,mode:e.mode??"wait",at:new Date().toISOString()}}),!0}return Ln("received one-shot terminal request",{requestId:e.requestId,command:e.command,cwd:s,mode:e.mode??"wait"}),t.runTerminalCommand(e.command,s,{mode:e.mode??"wait",runtimeEnvironment:e.runtimeEnvironment}).then(i=>{t.send({type:"executor.terminal.response",executorId:r.executorId,requestId:e.requestId,result:i}),Ln("completed one-shot terminal request",{requestId:e.requestId,durationMs:Date.now()-o,exitCode:i.exitCode})}).catch(i=>{Ln("failed one-shot terminal request",{requestId:e.requestId,durationMs:Date.now()-o,error:i instanceof Error?i.message:String(i)})}),!0}if(e.type==="executor.terminal.sessions.list.request")return n(),Xx(e,t),!0;if(e.type==="executor.terminal.session.create"){n();let o;try{o=Fd(r.workspaceRoot,e.cwd)}catch(a){return t.send({type:"executor.terminal.session.create.response",executorId:r.executorId,requestId:e.requestId,result:{ok:!1,created:!1,message:a instanceof Error?`\u9879\u76EE\u76EE\u5F55\u51C6\u5907\u5931\u8D25\uFF1A${a.message}`:"\u9879\u76EE\u76EE\u5F55\u51C6\u5907\u5931\u8D25\u3002"},at:new Date().toISOString()}),!0}let s=Jx(e),i=t.terminalSessions.ensure({executorId:r.executorId,scope:e.scope,terminalId:e.terminalId,workspaceId:e.workspaceId,title:s,cwd:o,ownerUserId:e.ownerUserId,cols:e.cols,rows:e.rows,runtimeEnvironment:e.runtimeEnvironment,onReady:a=>{t.send({type:"executor.terminal.session.ready",executorId:r.executorId,terminalId:a.terminalId,terminalKey:a.terminalKey,cwd:a.cwd,mode:a.mode,at:new Date().toISOString()})},onOutput:(a,c,l)=>{t.send({type:"executor.terminal.session.output",executorId:r.executorId,output:{terminalId:a.terminalId,terminalKey:a.terminalKey,stream:c,chunk:l,at:new Date().toISOString()}})},onExit:(a,c)=>{t.send({type:"executor.terminal.session.exit",executorId:r.executorId,terminalId:a.terminalId,terminalKey:a.terminalKey,exitCode:c,at:new Date().toISOString()})}});return t.send({type:"executor.terminal.session.create.response",executorId:r.executorId,requestId:e.requestId,result:{ok:!0,created:i.created,session:i.descriptor,sessions:t.terminalSessions.list({executorId:r.executorId,scope:e.scope,workspaceId:e.workspaceId})},at:new Date().toISOString()}),!0}if(e.type==="executor.terminal.session.attach"){n();let o=t.terminalSessions.attach({executorId:r.executorId,scope:e.scope,terminalId:e.terminalId,workspaceId:e.workspaceId,clientId:e.clientId});return o?(t.send({type:"executor.terminal.session.attach.response",executorId:r.executorId,requestId:e.requestId,result:{ok:!0,session:o.descriptor,snapshot:o.snapshot},at:new Date().toISOString()}),!0):(t.send({type:"executor.terminal.session.attach.response",executorId:r.executorId,requestId:e.requestId,result:{ok:!1,message:"\u7EC8\u7AEF\u4F1A\u8BDD\u4E0D\u5B58\u5728\u3002"},at:new Date().toISOString()}),!0)}if(e.type==="executor.terminal.session.detach")return n(),t.terminalSessions.detach({executorId:r.executorId,scope:e.scope,terminalId:e.terminalId,workspaceId:e.workspaceId,clientId:e.clientId}),!0;if(e.type==="executor.terminal.session.input")return n(),t.terminalSessions.write({executorId:r.executorId,scope:e.scope,terminalId:e.terminalId,workspaceId:e.workspaceId,input:e.input}),!0;if(e.type==="executor.terminal.session.resize")return n(),t.terminalSessions.resize({executorId:r.executorId,scope:e.scope,terminalId:e.terminalId,workspaceId:e.workspaceId,cols:e.cols,rows:e.rows}),!0;if(e.type==="executor.terminal.session.close"){n();let o=t.terminalSessions.close({executorId:r.executorId,scope:e.scope,terminalId:e.terminalId,workspaceId:e.workspaceId});return t.send({type:"executor.terminal.session.close.response",executorId:r.executorId,requestId:e.requestId,result:{ok:!0,closed:!!o,session:o??void 0},at:new Date().toISOString()}),!0}return!1};var Hd=e=>{let t=yd(e),r=n=>{if(e.getCurrentSocket()===e.expectedSocket&&!Dc(n,e)&&!Dl(n,e)&&!Nl(n,e)){if(n.type==="executor.agent.prompt.request"||n.type==="executor.agent.prompt.cancel"){t.handlePromptMessage(n);return}qd(n,e)||jd(n,e)}};return{abortActivePrompts:t.abortActivePrompts,handleMessage:r,drainPromptQueue:t.drainPromptQueue}};import{spawn as Yn,spawnSync as Yx}from"node:child_process";import{accessSync as Qx,constants as Zx,mkdtempSync as eS,readFileSync as tS,rmSync as rS}from"node:fs";import ci from"node:os";import{createRequire as nS}from"node:module";import li from"node:path";import{StringDecoder as Gd}from"node:string_decoder";var Qd=120,Zd=32,di="xterm-256color",oS=250,sS=1500,zd=24e3,iS=1500,aS=nS(import.meta.url),cS=String.raw`
138
139
  import base64
139
140
  import errno
140
141
  import fcntl
@@ -273,12 +274,12 @@ except OSError:
273
274
  pass
274
275
 
275
276
  sys.exit(exit_code)
276
- `,Qe,br,Kt=new Map,Ex=["-i","-l"],Ki=e=>{let t=e?.trim();return t?t==="~"?Gi.homedir():t.startsWith("~/")?Hi.join(Gi.homedir(),t.slice(2)):t:process.cwd()},Dn=e=>{if(!e?.trim())return!1;try{return gx(e,fx.X_OK),!0}catch{return!1}},Ed=e=>{let t=e.end();return t.length>0?t:""},Ix=()=>{let e=hx(Hi.join(Gi.tmpdir(),"vibemux-terminal-command-"));return{outputPath:Hi.join(e,"output.log"),cleanup:()=>{try{kx(e,{recursive:!0,force:!0})}catch{}}}},Id=e=>{try{let t=yx(e,"utf8");return t.length<=Pd?t:t.slice(0,Pd)}catch{return""}},bd=(e,t)=>new Promise(r=>{let n=!1,o=()=>{n||(n=!0,clearTimeout(s),e.off("exit",i),r())},i=()=>{o()},s=setTimeout(()=>{o()},Math.max(0,t));e.once("exit",i)}),Rd=(e,t)=>{try{return process.platform!=="win32"?process.kill(-e,t):process.kill(e,t),!0}catch(r){if((typeof r=="object"&&r&&"code"in r?String(r.code):"")==="ESRCH")return!1;throw r}},bx=e=>{Kt.set(e.pid,e),e.child.once("exit",()=>{Kt.delete(e.pid)})},Od=async()=>{let e=Array.from(Kt.values());if(e.length===0)return;for(let r of e)Rd(r.pid,"SIGTERM")||Kt.delete(r.pid);await Promise.all(e.map(r=>bd(r.child,vx)));let t=Array.from(Kt.values());for(let r of t)Rd(r.pid,"SIGKILL")||Kt.delete(r.pid);await Promise.all(t.map(r=>bd(r.child,250)))},Ji=(e,t,r,n)=>{let o=!1,i=setTimeout(()=>{o||(o=!0,e(t,r,n))},xx);return{markReady:()=>{o||(o=!0,clearTimeout(i),e(t,r,n))},dispose:()=>{clearTimeout(i)}}},Td=e=>{let t=mx(e,["-c","import sys"],{stdio:"ignore"});return!t.error&&t.status===0},Rx=()=>{if(Qe!==void 0)return Qe;let e=["/usr/bin/python3","/opt/homebrew/bin/python3"];for(let r of e)if(Dn(r)&&Td(r))return Qe=r,Qe;let t=["python3","python"];for(let r of t)if(Td(r))return Qe=r,Qe;return Qe=null,Qe},Tx=()=>{if(br!==void 0)return br;try{br=Cx("node-pty")}catch{br=null}return br},$n=()=>{let e=process.env.SHELL?.trim();return e&&Dn(e)?e:process.platform==="darwin"&&Dn("/bin/zsh")?"/bin/zsh":Dn("/bin/bash")?"/bin/bash":"sh"},Rr=e=>Ki(e),Ax=["VITE_","NEXT_PUBLIC_","NUXT_PUBLIC_","PUBLIC_"],Mx=new Set(["APP_URL","APP_BASE_URL","BETTER_AUTH_URL","BETTER_AUTH_TRUSTED_ORIGINS","VIBEMUX_PUBLIC_BASE_URL"]),Un=(e=process.env)=>{let t={};for(let[r,n]of Object.entries(e))typeof n>"u"||Mx.has(r)||Ax.some(o=>r.startsWith(o))||(t[r]=n);return t},_d=(e,t,r)=>new Promise(n=>{let o=$n(),i=Ki(t),s=Rr(i);le(s,r?.runtimeEnvironment);let a=Ae(Un(),r?.runtimeEnvironment),c=r?.mode??"wait";if(c==="background")try{let u=Ix(),p=Nn(o,["-l","-c",`exec >"$VIBEMUX_BACKGROUND_OUTPUT_PATH" 2>&1
277
- ${e}`],{cwd:s,env:{...a,VIBEMUX_BACKGROUND_OUTPUT_PATH:u.outputPath},detached:!0,stdio:"ignore"}),f=p.pid;if(!f){u.cleanup(),n({command:e,cwd:s,stdout:"",stderr:"\u540E\u53F0\u73AF\u5883\u547D\u4EE4\u542F\u52A8\u5931\u8D25\uFF1A\u672A\u83B7\u53D6\u5230\u5B50\u8FDB\u7A0B pid\u3002",exitCode:1,mode:c,detached:!1,at:new Date().toISOString()});return}let x=!1,k=()=>{p.off("error",C),p.off("exit",E)},g=()=>{x||(x=!0,clearTimeout(j),k(),p.unref(),bx({pid:f,child:p,command:e,cwd:s,startedAt:new Date().toISOString()}),u.cleanup(),n({command:e,cwd:s,stdout:"",stderr:"",exitCode:0,mode:c,detached:!0,pid:f,at:new Date().toISOString()}))},R=O=>{if(x)return;x=!0,clearTimeout(j),k();let H=Id(u.outputPath);u.cleanup(),n({command:e,cwd:s,stdout:"",stderr:H,exitCode:O,mode:c,detached:!1,pid:f,at:new Date().toISOString()})},C=O=>{let H=Id(u.outputPath);u.cleanup(),!x&&(x=!0,clearTimeout(j),k(),n({command:e,cwd:s,stdout:"",stderr:H||O.message,exitCode:1,mode:c,detached:!1,pid:f,at:new Date().toISOString()}))},E=O=>{R(O??0)},j=setTimeout(()=>{g()},Sx);p.on("error",C),p.on("exit",E);return}catch(u){n({command:e,cwd:s,stdout:"",stderr:u instanceof Error?u.message:"\u540E\u53F0\u73AF\u5883\u547D\u4EE4\u542F\u52A8\u5931\u8D25\u3002",exitCode:1,mode:c,detached:!1,at:new Date().toISOString()});return}let l=Nn(o,["-l","-c",e],{cwd:s,env:a}),d="",m="";l.stdout.on("data",u=>{d+=u.toString()}),l.stderr.on("data",u=>{m+=u.toString()}),l.on("close",u=>{n({command:e,cwd:s,stdout:d,stderr:m,exitCode:u??0,mode:c,at:new Date().toISOString()})}),l.on("error",u=>{n({command:e,cwd:s,stdout:d,stderr:`${m}${u.message}`,exitCode:1,mode:c,at:new Date().toISOString()})})}),Ox=e=>{let{cols:t=Ad,cwd:r,onExit:n,onLog:o,onOutput:i,onReady:s,rows:a=Md,shell:c=$n()}=e,l=Rr(r),d=Tx();le(l,e.runtimeEnvironment);let m=Ae(Un(),e.runtimeEnvironment);if(!d)throw new Error("node-pty \u4E0D\u53EF\u7528\uFF0C\u65E0\u6CD5\u542F\u52A8\u539F\u751F PTY\u3002");let u=d.spawn(c,Ex,{cwd:l,env:m,cols:t,rows:a,name:zi}),p=Ji(s,"pty","node-pty",l);return u.onData(f=>{p.markReady(),o("pty output",{backend:"node-pty",chunkLength:f.length,preview:f.slice(0,120)}),i("stdout",f)}),u.onExit(({exitCode:f})=>{p.dispose(),o("pty exit",{backend:"node-pty",exitCode:f}),n(f??0)}),{backend:"node-pty",mode:"pty",write:f=>u.write(f),resize:(f,x)=>u.resize(Math.max(1,f),Math.max(1,x)),kill:()=>u.kill("SIGTERM")}},_x=e=>{let{cols:t=Ad,cwd:r,onExit:n,onLog:o,onOutput:i,onReady:s,rows:a=Md,shell:c=$n()}=e,l=Rr(r),d=Rx();le(l,e.runtimeEnvironment);let m=Ae(Un(),e.runtimeEnvironment);if(!d)throw new Error("python3 \u4E0D\u53EF\u7528\uFF0C\u65E0\u6CD5\u542F\u52A8 PTY fallback\u3002");let u=Nn(d,["-u","-c",Px],{cwd:l,env:{...m,DEVKANBAN_COLS:String(Math.max(1,t)),DEVKANBAN_CWD:l,DEVKANBAN_ROWS:String(Math.max(1,a)),DEVKANBAN_SHELL:c,DEVKANBAN_TERM_NAME:zi},stdio:["pipe","pipe","pipe"]}),p=u.stdin;if(!p)throw u.kill("SIGTERM"),new Error("python PTY control pipe \u4E0D\u53EF\u7528\u3002");let f=new Cd("utf8"),x=new Cd("utf8"),k=Ji(s,"pty","python-pty",l),g=(C,E)=>{E.length!==0&&(C==="stdout"&&k.markReady(),o("pty output",{backend:"python-pty",chunkLength:E.length,preview:E.slice(0,120),stream:C}),i(C,E))};u.stdout.on("data",C=>{g("stdout",f.write(C))}),u.stderr.on("data",C=>{g("system",x.write(C))}),u.on("error",C=>{o("python pty error",{message:C.message}),i("system",`\r
278
- [python-pty error] ${C.message}\r
279
- `)}),u.on("close",C=>{k.dispose(),g("stdout",Ed(f)),g("system",Ed(x)),o("pty exit",{backend:"python-pty",exitCode:C??0}),n(C??0)});let R=C=>{p.destroyed||p.write(`${JSON.stringify(C)}
280
- `)};return{backend:"python-pty",mode:"pty",write:C=>{R({type:"input",data:Buffer.from(C,"utf8").toString("base64")})},resize:(C,E)=>{R({type:"resize",cols:Math.max(1,C),rows:Math.max(1,E)})},kill:()=>{R({type:"close"}),p.end(),u.kill("SIGTERM")}}},Bx=e=>{let{cwd:t,onExit:r,onLog:n,onOutput:o,onReady:i}=e,s=Rr(t);le(s,e.runtimeEnvironment);let a=Ae(Un(),e.runtimeEnvironment),c=Nn("/bin/bash",["-il"],{cwd:s,env:{...a,BASH_SILENCE_DEPRECATION_WARNING:"1",TERM:process.env.TERM||zi},stdio:"pipe"});c.stdin.setDefaultEncoding("utf8"),c.stdout.setEncoding("utf8"),c.stderr.setEncoding("utf8");let l=Ji(i,"pipe","pipe",s);return c.stdout.on("data",d=>{l.markReady(),n("fallback shell stdout",{backend:"pipe",chunkLength:d.length,preview:d.slice(0,120)}),o("stdout",d)}),c.stderr.on("data",d=>{l.markReady(),n("fallback shell stderr",{backend:"pipe",chunkLength:d.length,preview:d.slice(0,120)}),o("stderr",d)}),c.on("error",d=>{n("fallback shell error",{message:d.message}),o("system",`\r
277
+ `,Ze,Nr,rr=new Map,lS=["-i","-l"],ui=e=>{let t=e?.trim();return t?t==="~"?ci.homedir():t.startsWith("~/")?li.join(ci.homedir(),t.slice(2)):t:process.cwd()},Xn=e=>{if(!e?.trim())return!1;try{return Qx(e,Zx.X_OK),!0}catch{return!1}},Kd=e=>{let t=e.end();return t.length>0?t:""},dS=()=>{let e=eS(li.join(ci.tmpdir(),"vibemux-terminal-command-"));return{outputPath:li.join(e,"output.log"),cleanup:()=>{try{rS(e,{recursive:!0,force:!0})}catch{}}}},Vd=e=>{try{let t=tS(e,"utf8");return t.length<=zd?t:t.slice(0,zd)}catch{return""}},Jd=(e,t)=>new Promise(r=>{let n=!1,o=()=>{n||(n=!0,clearTimeout(i),e.off("exit",s),r())},s=()=>{o()},i=setTimeout(()=>{o()},Math.max(0,t));e.once("exit",s)}),Xd=(e,t)=>{try{return process.platform!=="win32"?process.kill(-e,t):process.kill(e,t),!0}catch(r){if((typeof r=="object"&&r&&"code"in r?String(r.code):"")==="ESRCH")return!1;throw r}},uS=e=>{rr.set(e.pid,e),e.child.once("exit",()=>{rr.delete(e.pid)})},eu=async()=>{let e=Array.from(rr.values());if(e.length===0)return;for(let r of e)Xd(r.pid,"SIGTERM")||rr.delete(r.pid);await Promise.all(e.map(r=>Jd(r.child,iS)));let t=Array.from(rr.values());for(let r of t)Xd(r.pid,"SIGKILL")||rr.delete(r.pid);await Promise.all(t.map(r=>Jd(r.child,250)))},pi=(e,t,r,n)=>{let o=!1,s=setTimeout(()=>{o||(o=!0,e(t,r,n))},oS);return{markReady:()=>{o||(o=!0,clearTimeout(s),e(t,r,n))},dispose:()=>{clearTimeout(s)}}},Yd=e=>{let t=Yx(e,["-c","import sys"],{stdio:"ignore"});return!t.error&&t.status===0},pS=()=>{if(Ze!==void 0)return Ze;let e=["/usr/bin/python3","/opt/homebrew/bin/python3"];for(let r of e)if(Xn(r)&&Yd(r))return Ze=r,Ze;let t=["python3","python"];for(let r of t)if(Yd(r))return Ze=r,Ze;return Ze=null,Ze},mS=()=>{if(Nr!==void 0)return Nr;try{Nr=aS("node-pty")}catch{Nr=null}return Nr},Qn=()=>{let e=process.env.SHELL?.trim();return e&&Xn(e)?e:process.platform==="darwin"&&Xn("/bin/zsh")?"/bin/zsh":Xn("/bin/bash")?"/bin/bash":"sh"},Ur=e=>ui(e),gS=["VITE_","NEXT_PUBLIC_","NUXT_PUBLIC_","PUBLIC_"],fS=new Set(["APP_URL","APP_BASE_URL","BETTER_AUTH_URL","BETTER_AUTH_TRUSTED_ORIGINS","VIBEMUX_PUBLIC_BASE_URL"]),Zn=(e=process.env)=>{let t={};for(let[r,n]of Object.entries(e))typeof n>"u"||fS.has(r)||gS.some(o=>r.startsWith(o))||(t[r]=n);return t},tu=(e,t,r)=>new Promise(n=>{let o=Qn(),s=ui(t),i=Ur(s),a=r?.mode??"wait";try{Xe(i,r?.runtimeEnvironment)}catch(u){n({command:e,cwd:i,stdout:"",stderr:u instanceof Error?`\u73AF\u5883\u53D8\u91CF\u6587\u4EF6\u5199\u5165\u5931\u8D25\uFF1A${u.message}`:"\u73AF\u5883\u53D8\u91CF\u6587\u4EF6\u5199\u5165\u5931\u8D25\u3002",exitCode:1,mode:a,detached:!1,at:new Date().toISOString()});return}let c=Ir(Zn(),r?.runtimeEnvironment);if(a==="background")try{let u=dS(),m=Yn(o,["-l","-c",`exec >"$VIBEMUX_BACKGROUND_OUTPUT_PATH" 2>&1
278
+ ${e}`],{cwd:i,env:{...c,VIBEMUX_BACKGROUND_OUTPUT_PATH:u.outputPath},detached:!0,stdio:"ignore"}),f=m.pid;if(!f){u.cleanup(),n({command:e,cwd:i,stdout:"",stderr:"\u540E\u53F0\u73AF\u5883\u547D\u4EE4\u542F\u52A8\u5931\u8D25\uFF1A\u672A\u83B7\u53D6\u5230\u5B50\u8FDB\u7A0B pid\u3002",exitCode:1,mode:a,detached:!1,at:new Date().toISOString()});return}let S=!1,w=()=>{m.off("error",v),m.off("exit",E)},g=()=>{S||(S=!0,clearTimeout(F),w(),m.unref(),uS({pid:f,child:m,command:e,cwd:i,startedAt:new Date().toISOString()}),u.cleanup(),n({command:e,cwd:i,stdout:"",stderr:"",exitCode:0,mode:a,detached:!0,pid:f,at:new Date().toISOString()}))},I=O=>{if(S)return;S=!0,clearTimeout(F),w();let z=Vd(u.outputPath);u.cleanup(),n({command:e,cwd:i,stdout:"",stderr:z,exitCode:O,mode:a,detached:!1,pid:f,at:new Date().toISOString()})},v=O=>{let z=Vd(u.outputPath);u.cleanup(),!S&&(S=!0,clearTimeout(F),w(),n({command:e,cwd:i,stdout:"",stderr:z||O.message,exitCode:1,mode:a,detached:!1,pid:f,at:new Date().toISOString()}))},E=O=>{I(O??0)},F=setTimeout(()=>{g()},sS);m.on("error",v),m.on("exit",E);return}catch(u){n({command:e,cwd:i,stdout:"",stderr:u instanceof Error?u.message:"\u540E\u53F0\u73AF\u5883\u547D\u4EE4\u542F\u52A8\u5931\u8D25\u3002",exitCode:1,mode:a,detached:!1,at:new Date().toISOString()});return}let l=Yn(o,["-l","-c",e],{cwd:i,env:c}),d="",p="";l.stdout.on("data",u=>{d+=u.toString()}),l.stderr.on("data",u=>{p+=u.toString()}),l.on("close",u=>{n({command:e,cwd:i,stdout:d,stderr:p,exitCode:u??0,mode:a,at:new Date().toISOString()})}),l.on("error",u=>{n({command:e,cwd:i,stdout:d,stderr:`${p}${u.message}`,exitCode:1,mode:a,at:new Date().toISOString()})})}),hS=e=>{let{cols:t=Qd,cwd:r,onExit:n,onLog:o,onOutput:s,onReady:i,rows:a=Zd,shell:c=Qn()}=e,l=Ur(r),d=mS(),p=Ir(Zn(),e.runtimeEnvironment);if(!d)throw new Error("node-pty \u4E0D\u53EF\u7528\uFF0C\u65E0\u6CD5\u542F\u52A8\u539F\u751F PTY\u3002");let u=d.spawn(c,lS,{cwd:l,env:p,cols:t,rows:a,name:di}),m=pi(i,"pty","node-pty",l);return u.onData(f=>{m.markReady(),o("pty output",{backend:"node-pty",chunkLength:f.length,preview:f.slice(0,120)}),s("stdout",f)}),u.onExit(({exitCode:f})=>{m.dispose(),o("pty exit",{backend:"node-pty",exitCode:f}),n(f??0)}),{backend:"node-pty",mode:"pty",write:f=>u.write(f),resize:(f,S)=>u.resize(Math.max(1,f),Math.max(1,S)),kill:()=>u.kill("SIGTERM")}},yS=e=>{let{cols:t=Qd,cwd:r,onExit:n,onLog:o,onOutput:s,onReady:i,rows:a=Zd,shell:c=Qn()}=e,l=Ur(r),d=pS(),p=Ir(Zn(),e.runtimeEnvironment);if(!d)throw new Error("python3 \u4E0D\u53EF\u7528\uFF0C\u65E0\u6CD5\u542F\u52A8 PTY fallback\u3002");let u=Yn(d,["-u","-c",cS],{cwd:l,env:{...p,DEVKANBAN_COLS:String(Math.max(1,t)),DEVKANBAN_CWD:l,DEVKANBAN_ROWS:String(Math.max(1,a)),DEVKANBAN_SHELL:c,DEVKANBAN_TERM_NAME:di},stdio:["pipe","pipe","pipe"]}),m=u.stdin;if(!m)throw u.kill("SIGTERM"),new Error("python PTY control pipe \u4E0D\u53EF\u7528\u3002");let f=new Gd("utf8"),S=new Gd("utf8"),w=pi(i,"pty","python-pty",l),g=(v,E)=>{E.length!==0&&(v==="stdout"&&w.markReady(),o("pty output",{backend:"python-pty",chunkLength:E.length,preview:E.slice(0,120),stream:v}),s(v,E))};u.stdout.on("data",v=>{g("stdout",f.write(v))}),u.stderr.on("data",v=>{g("system",S.write(v))}),u.on("error",v=>{o("python pty error",{message:v.message}),s("system",`\r
279
+ [python-pty error] ${v.message}\r
280
+ `)}),u.on("close",v=>{w.dispose(),g("stdout",Kd(f)),g("system",Kd(S)),o("pty exit",{backend:"python-pty",exitCode:v??0}),n(v??0)});let I=v=>{m.destroyed||m.write(`${JSON.stringify(v)}
281
+ `)};return{backend:"python-pty",mode:"pty",write:v=>{I({type:"input",data:Buffer.from(v,"utf8").toString("base64")})},resize:(v,E)=>{I({type:"resize",cols:Math.max(1,v),rows:Math.max(1,E)})},kill:()=>{I({type:"close"}),m.end(),u.kill("SIGTERM")}}},kS=e=>{let{cwd:t,onExit:r,onLog:n,onOutput:o,onReady:s}=e,i=Ur(t),a=Ir(Zn(),e.runtimeEnvironment),c=Yn("/bin/bash",["-il"],{cwd:i,env:{...a,BASH_SILENCE_DEPRECATION_WARNING:"1",TERM:process.env.TERM||di},stdio:"pipe"});c.stdin.setDefaultEncoding("utf8"),c.stdout.setEncoding("utf8"),c.stderr.setEncoding("utf8");let l=pi(s,"pipe","pipe",i);return c.stdout.on("data",d=>{l.markReady(),n("fallback shell stdout",{backend:"pipe",chunkLength:d.length,preview:d.slice(0,120)}),o("stdout",d)}),c.stderr.on("data",d=>{l.markReady(),n("fallback shell stderr",{backend:"pipe",chunkLength:d.length,preview:d.slice(0,120)}),o("stderr",d)}),c.on("error",d=>{n("fallback shell error",{message:d.message}),o("system",`\r
281
282
  [fallback shell error] ${d.message}\r
282
283
  `)}),c.on("close",d=>{l.dispose(),n("fallback shell exit",{backend:"pipe",exitCode:d??0}),r(d??0)}),c.stdin.write(`export PS1="$ "
283
284
  `),{backend:"pipe",mode:"pipe",write:d=>{c.stdin.destroyed||c.stdin.write(d.replace(/\r/g,`
284
- `))},resize:()=>{},kill:()=>c.kill("SIGTERM")}},Bd=e=>{let{cwd:t,onLog:r}=e,n=Ki(t),o=Rr(n),i=e.shell??$n();r("opening pty session",{requestedCwd:n,cwd:o,shell:i});try{return Ox({...e,cwd:o,shell:i})}catch(s){r("node-pty spawn failed, falling back to python pty",{cwd:o,shell:i,error:s instanceof Error?s.message:"unknown"})}try{return _x({...e,cwd:o,shell:i})}catch(s){r("python pty spawn failed, falling back to pipe shell",{cwd:o,shell:i,error:s instanceof Error?s.message:"unknown"})}return Bx({...e,cwd:o})};var _={connection:null,reconnectTimer:null,stopped:!1,connect:null},Vi=new Map,Dx=()=>Ge()==="preview"?"vibemux-worker-preview":"vibemux-worker",Wd=e=>gn({workspaceRoot:e,workerVersion:ue()}),Dd=e=>{let t=process.platform==="darwin"?["open",e]:process.platform==="win32"?["cmd","/c","start","",e]:["xdg-open",e];Wx(t[0],t.slice(1),{detached:!0,stdio:"ignore"}).unref()},Nd=async()=>{let e=ue(),t=await ot();return{currentVersion:e,latestVersion:t.latestVersion||e,check:t}},$d=(e,t,r,n)=>{let o=n.check.channel||Ge(),i=o==="preview"?"Vibemux Worker Preview":"Vibemux Worker",s=process.env.VIBEMUX_WORKER_AUTO_UPDATE?.trim().toLowerCase(),a=s!=="0"&&s!=="false"&&s!=="off",c=[["Mode",e],["Channel",o],["Current",n.currentVersion],["Latest",n.latestVersion],["Update Check",a?"enabled":"disabled"],["Cloud",t],["Local",r]],l=e==="open"?"Opening cloud and local consoles in your browser...":"Worker daemon is ready and waiting for tasks.",d=Math.max(...c.map(([f])=>f.length)),m=[i,"",...c.map(([f,x])=>`${f.padEnd(d)} : ${x}`),"",l],u=Math.max(...m.map(f=>f.length)),p=`+${"-".repeat(u+2)}+`;console.log(p);for(let f of m)console.log(`| ${f.padEnd(u)} |`);console.log(p)},Ud=()=>{let e=b();Oo();let t=rr(e.localServerPort);Nd().then(r=>{$d("open",e.cloudUrl,t,r)}).catch(r=>{let n=r instanceof Error?r.message:"worker version check failed";console.error("[worker] version check failed",n)}),setTimeout(()=>{Dd(e.cloudUrl),Dd(t)},250)};var Ca=()=>{_.stopped=!0,_.reconnectTimer&&(clearTimeout(_.reconnectTimer),_.reconnectTimer=null),_.connection?.socket?.close(1e3,"manual disconnect"),_.connection=null,F({daemonMode:"disconnected",connected:!1,lastDisconnectAt:new Date().toISOString(),lastError:"Control plane connection was disconnected manually."})},dn=()=>{let e=b();if(!e.executorId||!e.executorToken)throw new Error("This worker is not paired yet, so it cannot connect to the control plane.");_.stopped=!1,_.reconnectTimer&&(clearTimeout(_.reconnectTimer),_.reconnectTimer=null),_.connection?.socket?.close(1e3,"manual reconnect"),_.connection=null,_.connect?.()},Ln=()=>{_.stopped=!1;let e=b(),t=[],r=[],n=new Map,o=new Map,i=null,s=null,a=!1,c=!1,l=null,d=null,m=Bi(),u=[],p=new Date().toISOString();F({daemonMode:"starting",paired:!!(e.executorId&&e.executorToken),executorId:e.executorId,config:e,startedAt:p,lastConnectAttemptAt:p,lastError:void 0});let f=rr(e.localServerPort);Nd().then(h=>($d("daemon",e.cloudUrl,f,h),Ao(h.check))).catch(h=>{let P=h instanceof Error?h.message:"worker startup banner failed";console.error("[worker] startup banner failed",P)}),rn(e.workspaceRoot);let x=Oo(),k=async h=>{await new Promise(P=>{h.close(()=>P())})},g=async(h,P)=>{if(!c){c=!0,_.stopped=!0,a=!0,s&&(clearTimeout(s),s=null),_.reconnectTimer&&(clearTimeout(_.reconnectTimer),_.reconnectTimer=null),F({daemonMode:"disconnected",connected:!1,lastDisconnectAt:new Date().toISOString(),lastError:P||(h==="manual"?"Worker shutting down.":`Worker shutting down by ${h}.`)});for(let T of o.values())T.abort();o.clear();for(let T of Vi.values())T.kill();Vi.clear(),await Od(),i?.socket?.close(1e3,P||`worker shutdown: ${h}`),_.connection?.socket?.close(1e3,P||`worker shutdown: ${h}`),i=null,_.connection=null,l&&(clearInterval(l),l=null),d&&(clearInterval(d),d=null),await k(x)}},R=h=>{g(h).finally(()=>process.exit(0))},C=h=>{console.log(`[worker] ${h||"control plane requested worker shutdown"}`),g("manual",h).finally(()=>process.exit(0))};process.once("SIGINT",R),process.once("SIGTERM",R),process.once("SIGHUP",R);let E=()=>{F({queuedTaskIds:r,runningTaskIds:t,lastTaskAt:new Date().toISOString()})},j=()=>{for(e=b();t.length<Math.max(1,e.maxConcurrency)&&r.length>0;){let h=r[0];r=r.slice(1);let P=n.get(h);if(!P)continue;let{task:T,runtimeEnvironment:y}=P;t=[...t,h],E();let v=yd({task:T,runtimeEnvironment:y,executorId:e.executorId,workspaceRoot:e.workspaceRoot,projectBindings:e.projectBindings,uploadPatchArtifact:e.executorToken?({taskId:w,filename:B,content:de})=>go({cloudUrl:e.cloudUrl,executorToken:e.executorToken,taskId:w,filename:B,content:de}):void 0,send:S,onStart(){},onFinish(w){n.delete(w),o.delete(w),t=t.filter(B=>B!==w),E(),H()}});o.set(h,v)}},O=null,H=()=>{j(),O?.drainPromptQueue()},D=h=>h.type==="task.ack"||h.type==="task.event"||h.type==="task.result"||h.type==="executor.agent.prompt.event"||h.type==="executor.agent.prompt.response",U=h=>h.type==="task.ack"||h.type==="task.result"||h.type==="executor.agent.prompt.response",L=h=>{if(!D(h))return;if(u.length>=1e3){let T=u.findIndex(y=>!U(y));u.splice(T===-1?0:T,1)}u.push(h)},K=()=>{for(;u.length>0;){let h=u[0];if(!h||!_.connection?.send(h))return;u.shift()}},S=h=>{let P=_.connection?.send(h)??!1;return P||L(h),P},I=h=>{a=_.stopped,!(a||s)&&(s=setTimeout(()=>{s=null,_.reconnectTimer=null,A()},5e3),_.reconnectTimer=s,F({daemonMode:"disconnected",connected:!1,paired:!0,lastDisconnectAt:new Date().toISOString(),lastError:h}))},A=()=>{if(!_.stopped){if(e=b(),!e.executorId||!e.executorToken){F({daemonMode:"unpaired",paired:!1,connected:!1,executorId:void 0,config:e,lastError:"This worker is not paired yet, so it cannot connect to the control plane."});return}F({daemonMode:"starting",connected:!1,paired:!0,executorId:e.executorId,config:e,lastConnectAttemptAt:new Date().toISOString()});try{let h=fo(e,{onOpen(){_.connection?.socket===h.socket&&(e=b(),F({daemonMode:"running",paired:!0,connected:!0,executorId:e.executorId,config:e,lastError:void 0}),console.log("[worker] connected to the control plane"),h.send({type:"executor.register",executorId:e.executorId,capabilities:e.capabilities,labels:e.labels,workspaceRoot:e.workspaceRoot,maxConcurrency:e.maxConcurrency,projectBindings:e.projectBindings,sshPubkey:qi(),platform:process.platform,version:ue(),telemetry:Wd(e.workspaceRoot),runningTaskIds:t,queuedTaskIds:r}),K(),H())},onMessage(P){_.connection?.socket===h.socket&&O?.handleMessage(P)},onError(P){_.connection?.socket===h.socket&&(O?.abortActivePrompts(),Dt.closeAll("control plane websocket error"),i=null,_.connection=null,O=null,console.error("[worker] websocket error",P),I(P))},onClose(P){if(_.connection?.socket!==h.socket)return;O?.abortActivePrompts(),Dt.closeAll("control plane websocket closed"),i=null,_.connection=null,O=null;let T=P.reason?.trim()||`code=${P.code}`;console.log("[worker] websocket disconnected from control plane",T),I(`Control plane connection closed (${T})`)}});i=h,_.connection=h,O=xd({expectedSocket:h.socket,getConnection:()=>i,getCurrentSocket:()=>_.connection?.socket,send:S,requestShutdown:C,openTerminalSession:Bd,runTerminalCommand:_d,terminalSessions:Vi,assignedTasks:n,activeExecutions:o,getConfig:()=>e,setConfig:P=>{e=P},getQueuedTaskIds:()=>r,setQueuedTaskIds:P=>{r=P},getRunningTaskIds:()=>t,setRunningTaskIds:P=>{t=P},syncRuntimeState:E,drainExecutionQueue:H,promptQueueState:m})}catch(h){let P=h instanceof Error?h.message:"worker websocket init failed";console.error("[worker] failed to start websocket connection",P),I(P)}}};_.connect=A,!e.executorId||!e.executorToken?(F({daemonMode:"unpaired",paired:!1,connected:!1}),console.log(`[worker] not paired yet; run \`npx ${Dx()} connect --pairing-code <CODE>\` or use the local setup page first`)):A(),l=setInterval(()=>{t.length>0||r.length>0||Ao().catch(h=>{let P=h instanceof Error?h.message:"worker auto update failed";console.error("[worker] auto update failed",P)})},1e4),d=setInterval(()=>{if(!i||!tr().connected)return;let h=new Date().toISOString();F({daemonMode:"running",connected:!0,paired:!0,lastHeartbeatAt:h,queuedTaskIds:r,runningTaskIds:t}),i.send({type:"executor.heartbeat",executorId:e.executorId,runningTaskIds:t,queuedTaskIds:r,projectBindings:e.projectBindings,sshPubkey:qi(),at:h,telemetry:Wd(e.workspaceRoot)})},15e3)};var Nx=e=>{let t=new Map;for(let r=0;r<e.length;r+=1){let n=e[r];if(!n.startsWith("--"))continue;let o=n.slice(2),i=e[r+1];if(!i||i.startsWith("--")){t.set(o,!0);continue}t.set(o,i),r+=1}return t},Tr=(e,t)=>{let r=e.get(t);return typeof r=="string"?r.trim():""},Ld=(e,t)=>e.has(t),$x=e=>{if(is(e))return e;throw new Error(`Unknown agent type: ${e||"<empty>"}. Expected one of: ${Br.join(", ")}`)},jd=async e=>{let t=Nx(e),r=$x(Tr(t,"agent")),n=Tr(t,"prompt");if(!n)throw new Error("Missing required `--prompt` value.");let o=Tr(t,"cwd")||process.cwd(),i=Tr(t,"title")||`${r} Runtime Smoke`,s=Tr(t,"model")||void 0,a=b(),c=await Pr({agentType:r,cwd:o,title:i,prompt:n,executionModel:s,agentSettings:a.agentSettings[r],mcpServers:a.mcpServers,runtimeSkillPackages:a.runtimeSkillPackages,skipRuntimeCheck:Ld(t,"skip-runtime-check")}),l={ok:!0,agentType:r,cwd:o,title:i,executionModel:s??"",output:c.output,sessionId:c.sessionId??"",filesChanged:"filesChanged"in c?c.filesChanged??[]:[]};if(Ld(t,"json")){console.log(JSON.stringify(l,null,2));return}console.log(`[worker] ${r} runtime smoke succeeded`),console.log(c.output)};var Ux=()=>{let e=process.env.DOTENV_CONFIG_PATH?.trim();if(e){Fd.config({path:e});return}et().name?.trim()==="vibemux"&&Fd.config()};Ux();var jn=b();F({daemonMode:"idle",paired:!!(jn.executorId&&jn.executorToken),connected:!1,executorId:jn.executorId,config:jn});var Fn=process.argv[2]||"daemon",Xi=process.argv.slice(3),Lx=new Set(["connect","daemon","open","doctor"]),jx=()=>{setTimeout(()=>{try{process.kill(process.pid,"SIGTERM")}catch{process.exit(0)}},250)},qd=e=>{let t=new Map;for(let r=0;r<e.length;r+=1){let n=e[r];if(!n.startsWith("--"))continue;let o=n.slice(2),i=e[r+1];if(!i||i.startsWith("--")){t.set(o,!0);continue}t.set(o,i),r+=1}return t},qn=(e,t)=>{let r=e.get(t);return typeof r=="string"?r.trim():""},Fx=(e,t)=>e.has(t),qx=e=>{if(e==="all"||e==="base"||e==="Codex"||e==="ClaudeCode"||e==="Pi"||e==="OpenCode")return e;throw new Error(`Unknown bootstrap target: ${e}`)},Gx=async e=>{let t=qd(e),r=qn(t,"pairing-code"),n=qn(t,"server-url"),o=qn(t,"name"),i=b(),s=gt(r);if(!r)throw new Error(rs(ft(i)));if(Ar(r,i)){let m={...i,cloudUrl:n||i.cloudUrl,executorName:o||i.executorName?.trim()||`worker-${process.pid}`};Ie(m),F({daemonMode:"starting",paired:!0,connected:!1,executorId:m.executorId,config:m,lastError:void 0}),console.log(`[worker] ${Mr()}`),Ln();return}let a=o||i.executorName?.trim()||`worker-${process.pid}`,c={...i,cloudUrl:n||i.cloudUrl},l;try{l=await Jt({pairingCode:r,machineId:c.machineId,machineName:c.machineName,name:a,workspaceRoot:c.workspaceRoot,maxConcurrency:c.maxConcurrency,labels:c.labels,capabilities:c.capabilities,platform:process.platform,version:ue()},c.cloudUrl)}catch(m){let u=m instanceof Error?m.message:"Pair request failed.";throw new Error(Or(u,ft(i)))}let d={...c,executorName:a,executorId:l.executorId,executorToken:l.executorToken,lastPairedPairingCode:s};Ie(d),F({daemonMode:"starting",paired:!0,connected:!1,executorId:l.executorId,config:d,lastError:void 0}),console.log(`[worker] paired ${d.machineName} to ${d.cloudUrl} as ${a}`),Ln()},Hx=async()=>{if(Lx.has(Fn)&&(await Fs(Fn)).status!=="ready"){process.exitCode=1;return}switch(Fn){case"connect":{await Gx(Xi);return}case"daemon":{Ln();return}case"open":{Ud();return}case"doctor":{await No();return}case"bootstrap":{let e=qd(Xi),t=qx(qn(e,"target")||"base"),r=await xe({autoInstall:!0,target:t});if(Fx(e,"json"))console.log(JSON.stringify(r,null,2));else{console.log(`[worker] ${r.message}`);for(let n of r.items)console.log(`- ${n.label}: ${n.detail}`)}r.ok||(process.exitCode=1);return}case"browser-inspect":{await Vs();return}case"runtime-smoke":{await jd(Xi);return}case"reset":{qr(),console.log("[worker] local config cleared");return}case"unpair":{Gr(),console.log("[worker] pairing cleared");return}case"update":{let e=await ln();console.log(`[worker] ${e.message}`),e.applied&&jx();return}case"apply-update-internal":{let e=process.argv[3],t=process.argv[4],r=Number(process.argv[5]||"0");await Sa(e,t,r);return}default:console.error(`Unknown worker command: ${Fn}`),process.exitCode=1}};Hx().catch(e=>{console.error(e instanceof Error?e.message:"worker command failed"),process.exitCode=1});
285
+ `))},resize:()=>{},kill:()=>c.kill("SIGTERM")}},eo=e=>{let{cwd:t,onLog:r}=e,n=ui(t),o=Ur(n),s=e.shell??Qn();r("opening pty session",{requestedCwd:n,cwd:o,shell:s});try{Xe(o,e.runtimeEnvironment)}catch(i){throw r("runtime env file materialization failed",{cwd:o,error:i instanceof Error?i.message:"unknown"}),i}try{return hS({...e,cwd:o,shell:s})}catch(i){r("node-pty spawn failed, falling back to python pty",{cwd:o,shell:s,error:i instanceof Error?i.message:"unknown"})}try{return yS({...e,cwd:o,shell:s})}catch(i){r("python pty spawn failed, falling back to pipe shell",{cwd:o,shell:s,error:i instanceof Error?i.message:"unknown"})}return kS({...e,cwd:o})};var ru=4e3,V=e=>({...e,clientIds:[...e.clientIds]}),nu=e=>({session:V(e.session),chunks:e.chunks.map(t=>({...t}))}),et=(e,t)=>{let r=new Date().toISOString();return{...e,...t,lastActiveAt:t?.lastActiveAt??r}},to=class{constructor(t=eo){this.openSession=t}sessions=new Map;closingSessions=new Map;finalizeExit(t,r,n){let o=t.descriptor.terminalKey,s=this.sessions.get(o),i=this.closingSessions.get(o);if(s!==t&&i!==t)return null;let a=t.descriptor.exitedAt||new Date().toISOString();t.closing=!0,t.descriptor=et(t.descriptor,{exitCode:r,exitedAt:a}),t.snapshot.session=V(t.descriptor);let c=V(t.descriptor);return n?.(c,r),s===t&&this.sessions.delete(o),i===t&&this.closingSessions.delete(o),c}list(t){return(t?.includeClosing?[...this.sessions.values(),...this.closingSessions.values()]:Array.from(this.sessions.values())).map(n=>V(n.descriptor)).filter(n=>!(t?.executorId&&n.executorId!==t.executorId||t?.scope&&n.scope!==t.scope||typeof t?.workspaceId=="string"&&n.workspaceId!==t.workspaceId))}getByKey(t){let r=this.sessions.get(t);return r?{descriptor:V(r.descriptor),snapshot:nu(r.snapshot)}:null}ensure(t){let r=Wt({scope:t.scope,executorId:t.executorId,workspaceId:t.workspaceId,terminalId:t.terminalId}),n=this.sessions.get(r);if(n)return{created:!1,descriptor:V(n.descriptor)};let o=new Date().toISOString(),s={terminalId:t.terminalId,terminalKey:r,scope:t.scope,executorId:t.executorId,workspaceId:t.workspaceId,cwd:t.cwd,title:t.title,ownerUserId:t.ownerUserId,createdAt:o,lastActiveAt:o,attachCount:0,clientIds:[]},i={session:V(s),chunks:[]},a={session:null,descriptor:s,snapshot:i,clientIds:new Set,closing:!1},c=this.openSession({cwd:t.cwd,cols:t.cols,rows:t.rows,runtimeEnvironment:t.runtimeEnvironment,onExit:l=>{this.finalizeExit(a,l,t.onExit)},onLog:()=>{},onOutput:(l,d)=>{let p=this.sessions.get(r);if(!p)return;let u={stream:l,chunk:d,at:new Date().toISOString()};p.descriptor=et(p.descriptor),p.snapshot.session=V(p.descriptor),p.snapshot.chunks.push(u),p.snapshot.chunks.length>ru&&p.snapshot.chunks.splice(0,p.snapshot.chunks.length-ru),t.onOutput?.(V(p.descriptor),l,d)},onReady:l=>{let d=this.sessions.get(r);d&&(d.descriptor=et(d.descriptor,{mode:l}),d.snapshot.session=V(d.descriptor),t.onReady?.(V(d.descriptor)))}});return a.session=c,this.sessions.set(r,a),{created:!0,descriptor:V(s)}}attach(t){let r=Wt({scope:t.scope,executorId:t.executorId,workspaceId:t.workspaceId,terminalId:t.terminalId}),n=this.sessions.get(r);return n?(n.clientIds.add(t.clientId),n.descriptor=et(n.descriptor,{attachCount:n.clientIds.size,clientIds:Array.from(n.clientIds),lastAttachAt:new Date().toISOString()}),n.snapshot.session=V(n.descriptor),{descriptor:V(n.descriptor),snapshot:nu(n.snapshot)}):null}detach(t){let r=Wt({scope:t.scope,executorId:t.executorId,workspaceId:t.workspaceId,terminalId:t.terminalId}),n=this.sessions.get(r);return n?(n.clientIds.delete(t.clientId),n.descriptor=et(n.descriptor,{attachCount:n.clientIds.size,clientIds:Array.from(n.clientIds),lastDetachAt:new Date().toISOString()}),n.snapshot.session=V(n.descriptor),V(n.descriptor)):null}clearClientAttachments(t){let r=new Date().toISOString();for(let n of[...this.sessions.values(),...this.closingSessions.values()])t?.executorId&&n.descriptor.executorId!==t.executorId||n.clientIds.size===0&&n.descriptor.attachCount===0&&n.descriptor.clientIds.length===0||(n.clientIds.clear(),n.descriptor=et(n.descriptor,{attachCount:0,clientIds:[],lastDetachAt:r}),n.snapshot.session=V(n.descriptor))}write(t){let r=this.resolve(t);return r?(r.descriptor=et(r.descriptor),r.snapshot.session=V(r.descriptor),r.session.write(t.input),!0):!1}resize(t){let r=this.resolve(t);return r?(r.descriptor=et(r.descriptor),r.snapshot.session=V(r.descriptor),r.session.resize(t.cols,t.rows),!0):!1}close(t){let r=Wt({scope:t.scope,executorId:t.executorId,workspaceId:t.workspaceId,terminalId:t.terminalId}),n=this.sessions.get(r);if(!n){let o=this.closingSessions.get(r);return o?V(o.descriptor):null}return n.closing||(n.closing=!0,this.sessions.delete(r),this.closingSessions.set(r,n),n.session.kill()),V(n.descriptor)}closeAll(){for(let[t,r]of this.sessions.entries())r.closing=!0,this.sessions.delete(t),this.closingSessions.set(t,r),r.session.kill()}resolve(t){let r=Wt({scope:t.scope,executorId:t.executorId,workspaceId:t.workspaceId,terminalId:t.terminalId});return this.sessions.get(r)??null}};import{existsSync as mi,mkdirSync as wS,readFileSync as ou}from"node:fs";import{spawnSync as xS}from"node:child_process";import SS from"node:os";import ro from"node:path";var su=ro.join(SS.homedir(),".ssh"),CS=["id_ed25519.pub","id_rsa.pub","id_ecdsa.pub"],vS="vibemux_worker_ed25519",PS=e=>{wS(ro.dirname(e),{recursive:!0});let t=xS("ssh-keygen",["-t","ed25519","-C","vibemux-worker","-f",e,"-N",""],{encoding:"utf8"});if(t.status!==0)throw new Error((t.stderr||t.stdout||"ssh-keygen \u6267\u884C\u5931\u8D25\u3002").trim())},gi=()=>{try{for(let r of CS){let n=ro.join(su,r);if(mi(n))return ou(n,"utf8").trim()}let e=ro.join(su,vS),t=`${e}.pub`;return mi(t)||PS(e),mi(t)?ou(t,"utf8").trim():void 0}catch{return}};var _={connection:null,reconnectTimer:null,stopped:!1,connect:null},nr=new to,ES=()=>qe()==="preview"?"vibemux-worker-preview":"vibemux-worker",iu=e=>In({workspaceRoot:e,workerVersion:pe()}),au=e=>{let t=process.platform==="darwin"?["open",e]:process.platform==="win32"?["cmd","/c","start","",e]:["xdg-open",e];IS(t[0],t.slice(1),{detached:!0,stdio:"ignore"}).unref()},cu=async()=>{let e=pe(),t=await it();return{currentVersion:e,latestVersion:t.latestVersion||e,check:t}},lu=(e,t,r,n)=>{let o=n.check.channel||qe(),s=o==="preview"?"Vibemux Worker Preview":"Vibemux Worker",i=process.env.VIBEMUX_WORKER_AUTO_UPDATE?.trim().toLowerCase(),a=i!=="0"&&i!=="false"&&i!=="off",c=[["Mode",e],["Channel",o],["Current",n.currentVersion],["Latest",n.latestVersion],["Update Check",a?"enabled":"disabled"],["Cloud",t],["Local",r]],l=e==="open"?"Opening cloud and local consoles in your browser...":"Worker daemon is ready and waiting for tasks.",d=Math.max(...c.map(([f])=>f.length)),p=[s,"",...c.map(([f,S])=>`${f.padEnd(d)} : ${S}`),"",l],u=Math.max(...p.map(f=>f.length)),m=`+${"-".repeat(u+2)}+`;console.log(m);for(let f of p)console.log(`| ${f.padEnd(u)} |`);console.log(m)},du=()=>{let e=T();Yo();let t=pr(e.localServerPort);cu().then(r=>{lu("open",e.cloudUrl,t,r)}).catch(r=>{let n=r instanceof Error?r.message:"worker version check failed";console.error("[worker] version check failed",n)}),setTimeout(()=>{au(e.cloudUrl),au(t)},250)};var Fa=()=>{_.stopped=!0,_.reconnectTimer&&(clearTimeout(_.reconnectTimer),_.reconnectTimer=null),_.connection?.socket?.close(1e3,"manual disconnect"),_.connection=null,q({daemonMode:"disconnected",connected:!1,lastDisconnectAt:new Date().toISOString(),lastError:"Control plane connection was disconnected manually."})},xn=()=>{let e=T();if(!e.executorId||!e.executorToken)throw new Error("This worker is not paired yet, so it cannot connect to the control plane.");_.stopped=!1,_.reconnectTimer&&(clearTimeout(_.reconnectTimer),_.reconnectTimer=null),_.connection?.socket?.close(1e3,"manual reconnect"),_.connection=null,_.connect?.()},no=()=>{_.stopped=!1;let e=T(),t=[],r=[],n=new Map,o=new Map,s=null,i=null,a=!1,c=!1,l=null,d=null,p=ei(),u=[],m=new Date().toISOString();q({daemonMode:"starting",paired:!!(e.executorId&&e.executorToken),executorId:e.executorId,config:e,startedAt:m,lastConnectAttemptAt:m,lastError:void 0});let f=pr(e.localServerPort);cu().then(h=>(lu("daemon",e.cloudUrl,f,h),Jo(h.check))).catch(h=>{let P=h instanceof Error?h.message:"worker startup banner failed";console.error("[worker] startup banner failed",P)}),mn(e.workspaceRoot);let S=Yo(),w=async h=>{await new Promise(P=>{h.close(()=>P())})},g=async(h,P)=>{if(!c){c=!0,_.stopped=!0,a=!0,i&&(clearTimeout(i),i=null),_.reconnectTimer&&(clearTimeout(_.reconnectTimer),_.reconnectTimer=null),q({daemonMode:"disconnected",connected:!1,lastDisconnectAt:new Date().toISOString(),lastError:P||(h==="manual"?"Worker shutting down.":`Worker shutting down by ${h}.`)});for(let R of o.values())R.abort();o.clear(),nr.closeAll(),await eu(),await pc(),s?.socket?.close(1e3,P||`worker shutdown: ${h}`),_.connection?.socket?.close(1e3,P||`worker shutdown: ${h}`),s=null,_.connection=null,l&&(clearInterval(l),l=null),d&&(clearInterval(d),d=null),await w(S)}},I=h=>{g(h).finally(()=>process.exit(0))},v=h=>{console.log(`[worker] ${h||"control plane requested worker shutdown"}`),g("manual",h).finally(()=>process.exit(0))};process.once("SIGINT",I),process.once("SIGTERM",I),process.once("SIGHUP",I);let E=()=>{q({queuedTaskIds:r,runningTaskIds:t,lastTaskAt:new Date().toISOString()})},F=()=>{for(e=T();t.length<Math.max(1,e.maxConcurrency)&&r.length>0;){let h=r[0];r=r.slice(1);let P=n.get(h);if(!P)continue;let{task:R,runtimeEnvironment:y}=P;t=[...t,h],E();let C=Ld({task:R,runtimeEnvironment:y,executorId:e.executorId,workspaceRoot:e.workspaceRoot,projectBindings:e.projectBindings,uploadPatchArtifact:e.executorToken?({taskId:k,filename:B,content:ue})=>_o({cloudUrl:e.cloudUrl,executorToken:e.executorToken,taskId:k,filename:B,content:ue}):void 0,send:x,onStart(){},onFinish(k){n.delete(k),o.delete(k),t=t.filter(B=>B!==k),E(),z()}});o.set(h,C)}},O=null,z=()=>{F(),O?.drainPromptQueue()},D=h=>h.type==="task.ack"||h.type==="task.event"||h.type==="task.result"||h.type==="executor.agent.prompt.event"||h.type==="executor.agent.prompt.response",L=h=>h.type==="task.ack"||h.type==="task.result"||h.type==="executor.agent.prompt.response",j=h=>{if(!D(h))return;if(u.length>=1e3){let R=u.findIndex(y=>!L(y));u.splice(R===-1?0:R,1)}u.push(h)},J=()=>{for(;u.length>0;){let h=u[0];if(!h||!_.connection?.send(h))return;u.shift()}},x=h=>{let P=_.connection?.send(h)??!1;return P||j(h),P},b=h=>{a=_.stopped,!(a||i)&&(i=setTimeout(()=>{i=null,_.reconnectTimer=null,A()},5e3),_.reconnectTimer=i,q({daemonMode:"disconnected",connected:!1,paired:!0,lastDisconnectAt:new Date().toISOString(),lastError:h}))},A=()=>{if(!_.stopped){if(e=T(),!e.executorId||!e.executorToken){q({daemonMode:"unpaired",paired:!1,connected:!1,executorId:void 0,config:e,lastError:"This worker is not paired yet, so it cannot connect to the control plane."});return}q({daemonMode:"starting",connected:!1,paired:!0,executorId:e.executorId,config:e,lastConnectAttemptAt:new Date().toISOString()});try{let h=Bo(e,{onOpen(){_.connection?.socket===h.socket&&(e=T(),q({daemonMode:"running",paired:!0,connected:!0,executorId:e.executorId,config:e,lastError:void 0}),console.log("[worker] connected to the control plane"),h.send({type:"executor.register",executorId:e.executorId,capabilities:e.capabilities,labels:e.labels,workspaceRoot:e.workspaceRoot,maxConcurrency:e.maxConcurrency,projectBindings:e.projectBindings,sshPubkey:gi(),platform:process.platform,version:pe(),telemetry:iu(e.workspaceRoot),runningTaskIds:t,queuedTaskIds:r,terminalSessions:nr.list({executorId:e.executorId,includeClosing:!0})}),J(),z())},onMessage(P){_.connection?.socket===h.socket&&O?.handleMessage(P)},onError(P){_.connection?.socket===h.socket&&(e.executorId&&nr.clearClientAttachments({executorId:e.executorId}),O?.abortActivePrompts(),jt.closeAll("control plane websocket error"),s=null,_.connection=null,O=null,console.error("[worker] websocket error",P),b(P))},onClose(P){if(_.connection?.socket!==h.socket)return;e.executorId&&nr.clearClientAttachments({executorId:e.executorId}),O?.abortActivePrompts(),jt.closeAll("control plane websocket closed"),s=null,_.connection=null,O=null;let R=P.reason?.trim()||`code=${P.code}`;console.log("[worker] websocket disconnected from control plane",R),b(`Control plane connection closed (${R})`)}});s=h,_.connection=h,O=Hd({expectedSocket:h.socket,getConnection:()=>s,getCurrentSocket:()=>_.connection?.socket,send:x,requestShutdown:v,openTerminalSession:eo,runTerminalCommand:tu,terminalSessions:nr,assignedTasks:n,activeExecutions:o,getConfig:()=>e,setConfig:P=>{e=P},getQueuedTaskIds:()=>r,setQueuedTaskIds:P=>{r=P},getRunningTaskIds:()=>t,setRunningTaskIds:P=>{t=P},syncRuntimeState:E,drainExecutionQueue:z,promptQueueState:p})}catch(h){let P=h instanceof Error?h.message:"worker websocket init failed";console.error("[worker] failed to start websocket connection",P),b(P)}}};_.connect=A,!e.executorId||!e.executorToken?(q({daemonMode:"unpaired",paired:!1,connected:!1}),console.log(`[worker] not paired yet; run \`npx ${ES()} connect --pairing-code <CODE>\` or use the local setup page first`)):A(),l=setInterval(()=>{t.length>0||r.length>0||Jo().catch(h=>{let P=h instanceof Error?h.message:"worker auto update failed";console.error("[worker] auto update failed",P)})},1e4),d=setInterval(()=>{if(!s||!ur().connected)return;let h=new Date().toISOString();q({daemonMode:"running",connected:!0,paired:!0,lastHeartbeatAt:h,queuedTaskIds:r,runningTaskIds:t}),s.send({type:"executor.heartbeat",executorId:e.executorId,runningTaskIds:t,queuedTaskIds:r,projectBindings:e.projectBindings,sshPubkey:gi(),at:h,telemetry:iu(e.workspaceRoot),terminalSessions:nr.list({executorId:e.executorId,includeClosing:!0})})},15e3)};var bS=e=>{let t=new Map;for(let r=0;r<e.length;r+=1){let n=e[r];if(!n.startsWith("--"))continue;let o=n.slice(2),s=e[r+1];if(!s||s.startsWith("--")){t.set(o,!0);continue}t.set(o,s),r+=1}return t},$r=(e,t)=>{let r=e.get(t);return typeof r=="string"?r.trim():""},uu=(e,t)=>e.has(t),TS=e=>{if(Ii(e))return e;throw new Error(`Unknown agent type: ${e||"<empty>"}. Expected one of: ${Hr.join(", ")}`)},pu=async e=>{let t=bS(e),r=TS($r(t,"agent")),n=$r(t,"prompt");if(!n)throw new Error("Missing required `--prompt` value.");let o=$r(t,"cwd")||process.cwd(),s=$r(t,"title")||`${r} Runtime Smoke`,i=$r(t,"model")||void 0,a=T(),c=await Br({agentType:r,cwd:o,title:s,prompt:n,executionModel:i,agentSettings:a.agentSettings[r],mcpServers:a.mcpServers,runtimeSkillPackages:a.runtimeSkillPackages,skipRuntimeCheck:uu(t,"skip-runtime-check")}),l={ok:!0,agentType:r,cwd:o,title:s,executionModel:i??"",output:c.output,sessionId:c.sessionId??"",filesChanged:"filesChanged"in c?c.filesChanged??[]:[]};if(uu(t,"json")){console.log(JSON.stringify(l,null,2));return}console.log(`[worker] ${r} runtime smoke succeeded`),console.log(c.output)};var RS=()=>{let e=process.env.DOTENV_CONFIG_PATH?.trim();if(e){mu.config({path:e});return}rt().name?.trim()==="vibemux"&&mu.config()};RS();var oo=T();q({daemonMode:"idle",paired:!!(oo.executorId&&oo.executorToken),connected:!1,executorId:oo.executorId,config:oo});var so=process.argv[2]||"daemon",fi=process.argv.slice(3),AS=new Set(["connect","daemon","open","doctor"]),MS=()=>{setTimeout(()=>{try{process.kill(process.pid,"SIGTERM")}catch{process.exit(0)}},250)},gu=e=>{let t=new Map;for(let r=0;r<e.length;r+=1){let n=e[r];if(!n.startsWith("--"))continue;let o=n.slice(2),s=e[r+1];if(!s||s.startsWith("--")){t.set(o,!0);continue}t.set(o,s),r+=1}return t},io=(e,t)=>{let r=e.get(t);return typeof r=="string"?r.trim():""},OS=(e,t)=>e.has(t),_S=e=>{if(e==="all"||e==="base"||e==="Codex"||e==="ClaudeCode"||e==="Pi"||e==="OpenCode")return e;throw new Error(`Unknown bootstrap target: ${e}`)},BS=async e=>{let t=gu(e),r=io(t,"pairing-code"),n=io(t,"server-url"),o=io(t,"name"),s=T(),i=kt(r);if(!r)throw new Error(Ci(wt(s)));if(Lr(r,s)){let p={...s,cloudUrl:n||s.cloudUrl,executorName:o||s.executorName?.trim()||`worker-${process.pid}`};be(p),q({daemonMode:"starting",paired:!0,connected:!1,executorId:p.executorId,config:p,lastError:void 0}),console.log(`[worker] ${jr()}`),no();return}let a=o||s.executorName?.trim()||`worker-${process.pid}`,c={...s,cloudUrl:n||s.cloudUrl},l;try{l=await or({pairingCode:r,machineId:c.machineId,machineName:c.machineName,name:a,workspaceRoot:c.workspaceRoot,maxConcurrency:c.maxConcurrency,labels:c.labels,capabilities:c.capabilities,platform:process.platform,version:pe()},c.cloudUrl)}catch(p){let u=p instanceof Error?p.message:"Pair request failed.";throw new Error(Fr(u,wt(s)))}let d={...c,executorName:a,executorId:l.executorId,executorToken:l.executorToken,lastPairedPairingCode:i};be(d),q({daemonMode:"starting",paired:!0,connected:!1,executorId:l.executorId,config:d,lastError:void 0}),console.log(`[worker] paired ${d.machineName} to ${d.cloudUrl} as ${a}`),no()},WS=async()=>{if(AS.has(so)&&(await aa(so)).status!=="ready"){process.exitCode=1;return}switch(so){case"connect":{await BS(fi);return}case"daemon":{no();return}case"open":{du();return}case"doctor":{await us();return}case"bootstrap":{let e=gu(fi),t=_S(io(e,"target")||"base"),r=await Se({autoInstall:!0,target:t});if(OS(e,"json"))console.log(JSON.stringify(r,null,2));else{console.log(`[worker] ${r.message}`);for(let n of r.items)console.log(`- ${n.label}: ${n.detail}`)}r.ok||(process.exitCode=1);return}case"browser-inspect":{await ga();return}case"runtime-smoke":{await pu(fi);return}case"reset":{Zr(),console.log("[worker] local config cleared");return}case"unpair":{en(),console.log("[worker] pairing cleared");return}case"update":{let e=await wn();console.log(`[worker] ${e.message}`),e.applied&&MS();return}case"apply-update-internal":{let e=process.argv[3],t=process.argv[4],r=Number(process.argv[5]||"0");await La(e,t,r);return}default:console.error(`Unknown worker command: ${so}`),process.exitCode=1}};WS().catch(e=>{console.error(e instanceof Error?e.message:"worker command failed"),process.exitCode=1});