vibemux-worker 0.1.5 → 0.1.11

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,88 +1,107 @@
1
- import pi from"dotenv";import{existsSync as rr,readFileSync as nr}from"node:fs";import ne from"node:path";import{fileURLToPath as mi}from"node:url";var Zt=null,er=null,tr=null,fi=e=>{try{let t=JSON.parse(nr(e,"utf8"));return!!(t.name&&t.version)}catch{return!1}},hi=()=>{let e=process.env.VIBEMUX_RUNTIME_ROOT?.trim();if(e)return ne.resolve(e);let t=ne.dirname(mi(import.meta.url));for(;;){let r=ne.join(t,"package.json");if(rr(r)&&fi(r))return t;let n=ne.dirname(t);if(n===t)return process.cwd();t=n}},X=()=>(Zt||(Zt=hi()),Zt),he=()=>{if(!er){let e=ne.join(X(),"package.json");er=rr(e)?JSON.parse(nr(e,"utf8")):{}}return er},Pe=()=>{if(!tr){let e=ne.join(X(),"runtime","worker-release.json");tr=rr(e)?JSON.parse(nr(e,"utf8")):{}}return tr},Z=()=>he().version?.trim()||process.env.npm_package_version?.trim()||"0.0.0",Ue=()=>ne.join(X(),"dist-worker","apps","worker","src","index.js"),pn=()=>ne.join(X(),"dist-worker","apps","worker","web"),ut=()=>{let e=process.platform==="win32"?"vibemux-worker.cmd":"vibemux-worker";return ne.join(X(),"bin",e)};import{existsSync as ft,mkdirSync as mn,readFileSync as ht,rmSync as Bi,writeFileSync as fn}from"node:fs";import{randomUUID as _i}from"node:crypto";import Ge from"node:os";import j from"node:path";var ee=e=>{let t=e?.trim();if(!t)return{};try{let r=JSON.parse(t);return r&&typeof r=="object"?r:{}}catch(r){throw new Error(r instanceof Error?`OpenCode \u914D\u7F6E JSON \u65E0\u6548\uFF1A${r.message}`:"OpenCode \u914D\u7F6E JSON \u65E0\u6548")}};var ke="built-in://vibemux",or=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),ki=(e,t,r)=>{let n=t.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"")||`${e}-${r+1}`;return`${e}-${r+1}-${n}`};var yi=e=>e.replace(/\/+$/,""),wi=e=>e.startsWith("sse://")?`http://${e.slice(6)}`:e,xi=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:`${yi(e.cloudUrl)}/mcp/executor`,enabled:!0,headers:t}},Ci=e=>{let t=e.replace(/^stdio:\/\//,"").trim();return t?{command:t}:null},Si=e=>{let t=wi(e).trim();return t?{type:"remote",url:t,enabled:!0}:null},De=(e,t)=>e.filter(r=>r.enabled).reduce((r,n,o)=>{let s=n.id?.trim()||ki("mcp",n.name,o),i=n.target===ke?xi(t):n.transport==="stdio"||n.target.startsWith("stdio://")?Ci(n.target):Si(n.target);return i&&(r[s]=i),r},{}),pt=(e,t,r)=>{let n=ee(e),o=or(n)?{...n}:{},s=or(o.mcp)?{...o.mcp}:or(o.mcpServers)?{...o.mcpServers}:{},i=De(t,r),{mcpServers:a,...l}=o,c={...l,mcp:{...s,...i}};return JSON.stringify(c,null,2)};var bi={defaultModel:"",agent:"",permissionPolicy:""},vi={defaultModel:"gpt-5.4",sandbox:"workspace-write",approval:"never",reasoningEffort:"medium",reasoningSummary:"auto"},Pi={defaultModel:"sonnet",permissionMode:"bypassPermissions",planMode:!1},Ii={OpenCode:bi,Codex:vi,ClaudeCode:Pi};var Ti=e=>({OpenCode:{...e.OpenCode},Codex:{...e.Codex},ClaudeCode:{...e.ClaudeCode}}),Ne=(e,t)=>{let r=Ti(Ii);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}),!r.OpenCode.defaultModel.trim()&&t?.trim()&&(r.OpenCode.defaultModel=t.trim()),r};var gt=null,Ei=()=>gt||(gt=Pe(),gt),Le=()=>process.env.VIBEMUX_WORKER_RELEASE_CHANNEL?.trim()||Ei().channel?.trim()||"production",Ri=e=>e==="preview"?"vibemux-worker-preview":"vibemux-worker",Ai=e=>e==="preview"?"preview":"latest",Mi=()=>(process.env.npm_config_registry?.trim()||"https://registry.npmjs.org").replace(/\/$/,""),Oi=async e=>{let t=await fetch(`${Mi()}/${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()},ye=async()=>{let e=Z(),t=Le(),r=he().name?.trim()||"",n=Ri(t),o=Ai(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 Oi(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 kt=j.join(Ge.homedir(),".vibemux"),Wi=j.join(kt,"worker"),$i=j.join(kt,"worker-dev"),Ui=j.join(kt,"worker-dev-preview"),Di=j.join(kt,"worker-preview"),Ni="http://127.0.0.1:8989",Li=48100,Gi=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"]),hn=()=>!!process.env.VIBEMUX_CLOUD_URL?.trim(),mt=()=>process.env.VIBEMUX_CLOUD_URL?.trim()||Pe().defaultCloudUrl?.trim()||Ni,ji=e=>{if(process.env.NODE_ENV==="development"||hn())return!1;let t=Pe().defaultCloudUrl?.trim();if(!t)return!1;if(Gi.has(e?.trim()||""))return!0;let r=t.includes("preview.vibemux.com"),n=e?.includes("preview.vibemux.com");return r!==n},Hi=()=>{let e=mt(),t=Le();return process.env.NODE_ENV==="development"?e.includes("preview.vibemux.com")?Ui:$i:t==="preview"||e.includes("preview.vibemux.com")?Di:Wi},qi=()=>{let e=Number(process.env.VIBEMUX_WORKER_PORT?.trim());if(Number.isFinite(e)&&e>0)return e;let t=Pe().defaultLocalServerPort;return Number.isFinite(t)&&t?t:Li},Fi=()=>process.env.OPENCODE_CONFIG_PATH?.trim()||j.join(Ge.homedir(),".config","opencode","opencode.json"),Ji=()=>{let e=process.env.CODEX_HOME?.trim()||j.join(Ge.homedir(),".codex");return j.join(e,"config.toml")},zi=()=>{let e=process.env.CLAUDE_HOME?.trim()||j.join(Ge.homedir(),".claude");return j.join(e,"settings.json")},Vi=()=>{let e=Fi();if(!ft(e))return{opencodeConfigContent:"",defaultModel:""};try{let t=ht(e,"utf8").trim();if(!t)return{opencodeConfigContent:"",defaultModel:""};let r=ee(t),n=Object.entries(r.default??{}).find(([,o])=>!!o?.trim());return{opencodeConfigContent:t,defaultModel:n?`${n[0]}/${n[1]}`:""}}catch{return{opencodeConfigContent:"",defaultModel:""}}},gn=e=>{if(!ft(e))return"";try{return ht(e,"utf8").trim()}catch{return""}},Ki=()=>{let e=process.env.VIBEMUX_WORKER_HOME?.trim();if(e)return e;let t=process.env.VIBEMUX_HOME?.trim();return t?j.join(t,"worker"):Hi()},we=()=>j.resolve(Ki()),sr=()=>j.join(we(),"config.json"),Xi=()=>j.join(we(),"machine-id"),Yi=()=>{let e=we(),t=Xi();if(ft(t)){let n=ht(t,"utf8").trim();if(n)return n}mn(e,{recursive:!0});let r=_i();return fn(t,`${r}
2
- `,"utf8"),r},Qi=()=>({cloudUrl:mt(),machineId:Yi(),machineName:Ge.hostname(),opencodeConfigContent:"",codexConfigContent:"",claudeCodeConfigContent:"",defaultModel:"",agentSettings:Ne(),mcpServers:[],workspaceRoot:j.join(we(),"workspace"),maxConcurrency:5,labels:[],capabilities:["code-execution","git-operations"],localServerPort:Number(process.env.VIBEMUX_WORKER_PORT||qi()),projectBindings:[]}),b=()=>{let e=sr(),t=ft(e)?JSON.parse(ht(e,"utf8")):{},r={...Qi(),...t},n=Vi();hn()&&(r.cloudUrl=mt()),ji(r.cloudUrl)&&(r.cloudUrl=mt());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=gn(Ji())),r.claudeCodeConfigContent?.trim()||(r.claudeCodeConfigContent=gn(zi())),r.defaultModel?.trim()||(r.defaultModel=n.defaultModel),r.agentSettings=Ne(r.agentSettings,r.defaultModel),r},Ie=e=>{let t=we();mn(t,{recursive:!0}),fn(sr(),`${JSON.stringify(e,null,2)}
3
- `,"utf8")},Te=(e=b(),t)=>pt(e.opencodeConfigContent,e.mcpServers??[],{cloudUrl:e.cloudUrl,executorToken:e.executorToken,actingUserId:t}),yt=()=>{Bi(sr(),{force:!0})},wt=()=>{let e={...b(),executorName:void 0,executorId:void 0,executorToken:void 0};return Ie(e),e};import{existsSync as Ct}from"node:fs";import{stdin as In,stdout as Tn}from"node:process";import St from"node:path";import{createInterface as wa}from"node:readline/promises";import{existsSync as ca}from"node:fs";import la from"node:os";import wn from"node:path";import{spawn as da}from"node:child_process";import{accessSync as Zi,constants as ea,existsSync as ta}from"node:fs";import{delimiter as ir,dirname as ra,isAbsolute as na,join as oa}from"node:path";import{spawnSync as sa}from"node:child_process";var U=(e,t,r)=>{let n=sa(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}},B=(e,t)=>e.stdout||e.stderr||e.error||t,_=(e,t=["--version"])=>U(e,t).ok,ia=e=>{let t=process.env.PATH??"";t.split(ir).filter(Boolean).includes(e)||(process.env.PATH=t?`${e}${ir}${t}`:e)},ar=e=>{if(!ta(e))return!1;try{return Zi(e,ea.X_OK),!0}catch{return!1}},yn=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 ar(e)?e:null;for(let r of t){let n=`${e}${r}`;if(ar(n))return n}return null},kn=e=>process.platform==="win32"?yn(e):ar(e)?e:null,oe=e=>{if(e.includes("/")||e.includes("\\")||na(e))return kn(e);for(let t of(process.env.PATH??"").split(ir).filter(Boolean)){let r=oa(t,e),n=process.platform==="win32"?yn(r):kn(r);if(n)return ia(ra(n)),n}return null},aa=(e,t,r)=>typeof process.getuid=="function"&&process.getuid()===0?{command:e,args:t}:_("sudo")?r?.interactiveAuth?{command:"sudo",args:[e,...t]}:_("sudo",["-n","true"])?{command:"sudo",args:["-n",e,...t]}:null:null,se=(e,t,r,n)=>{let o=aa(e,t,n);return o?U(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 je=900*1e3,xn=15e3,ua=()=>process.env.CLAUDE_HOME?.trim()||wn.join(la.homedir(),".claude"),pa=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,xt=(e,t,r)=>({id:e,label:pa(e),ok:r.ok,changed:r.changed,detail:r.detail,skipped:r.skipped,installer:t?.installer,commandSummary:t?.commandSummary}),Cn=(e,t,r,n,o,s)=>{let i={installer:r,commandSummary:t},a=U("npm",["install","-g",e],{streamOutput:s?.streamOutput,timeout:je});return!a.ok&&process.platform!=="win32"&&(a=se("npm",["install","-g",e],je,s)),xt(n,i,{ok:a.ok,changed:a.ok,detail:B(a,o)})},Sn=()=>_("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 Cn("@openai/codex","npm install -g @openai/codex","npm","codex-cli","\u5B89\u88C5 Codex CLI \u5931\u8D25",e)}}:null,bn=()=>process.platform==="darwin"&&_("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=U("brew",["install","--cask","claude-code"],{streamOutput:e?.streamOutput,timeout:je});return xt("claude-cli",t,{ok:r.ok,changed:r.ok,detail:B(r,"\u5B89\u88C5 Claude Code CLI \u5931\u8D25")})}}:process.platform==="win32"&&_("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=U("winget",["install","--id","Anthropic.ClaudeCode","--exact","--source","winget","--accept-package-agreements","--accept-source-agreements"],{streamOutput:e?.streamOutput,timeout:je});return xt("claude-cli",t,{ok:r.ok,changed:r.ok,detail:B(r,"\u5B89\u88C5 Claude Code CLI \u5931\u8D25")})}}:process.platform!=="win32"&&_("bash")?{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=U("bash",["-lc","curl -fsSL https://claude.ai/install.sh | bash"],{streamOutput:e?.streamOutput,timeout:je});return xt("claude-cli",t,{ok:r.ok,changed:r.ok,detail:B(r,"\u5B89\u88C5 Claude Code CLI \u5931\u8D25")})}}:_("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 Cn("@anthropic-ai/claude-code","npm install -g @anthropic-ai/claude-code","npm","claude-cli","\u5B89\u88C5 Claude Code CLI \u5931\u8D25",e)}}:null,ga=()=>{let e=oe("codex"),t=e?U(e,["--version"]):null,r=Sn();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"}},ma=async()=>{let e=oe("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=await new Promise(r=>{let n=da(e,["app-server"],{env:process.env,stdio:["pipe","pipe","pipe"]}),o="",s="",i=!1,a=0,l=-1,c=-1,u=h=>{i||(i=!0,clearTimeout(w),n.killed||n.kill("SIGTERM"),r(h))},d=h=>{n.stdin.write(`${JSON.stringify(h)}
4
- `)},w=setTimeout(()=>{u({ok:!1,detail:"Codex \u767B\u5F55\u72B6\u6001\u68C0\u67E5\u8D85\u65F6\u3002"})},xn),p=()=>{a+=1,c=a,d({jsonrpc:"2.0",id:a,method:"account/read",params:{refreshToken:!1}})},x=h=>{let m=h.trim();if(m)try{let k=JSON.parse(m);if(k.error?.message){u({ok:!1,detail:k.error.message});return}if(!k.result||typeof k.id>"u")return;if(k.id===l){d({jsonrpc:"2.0",method:"initialized"}),p();return}if(k.id!==c)return;if(k.result.requiresOpenaiAuth&&!k.result.account){u({ok:!1,detail:"Codex \u672A\u767B\u5F55\uFF0C\u8BF7\u5148\u8FD0\u884C `codex` \u5B8C\u6210\u8BA4\u8BC1\u3002"});return}u({ok:!0,detail:"Codex \u767B\u5F55\u72B6\u6001\u6B63\u5E38\u3002"})}catch{return}};n.stdout.on("data",h=>{o+=h.toString();let m=o.split(`
5
- `);o=m.pop()??"";for(let k of m)x(k)}),n.stderr.on("data",h=>{s+=h.toString()}),n.on("error",h=>{u({ok:!1,detail:h instanceof Error?h.message:"Codex \u767B\u5F55\u68C0\u67E5\u5931\u8D25\u3002"})}),n.on("close",()=>{if(i)return;let h=s.trim().split(`
6
- `).filter(Boolean).at(-1)||"Codex \u767B\u5F55\u68C0\u67E5\u5931\u8D25\u3002";u({ok:!1,detail:h})}),a+=1,l=a,d({jsonrpc:"2.0",id:l,method:"initialize",params:{clientInfo:{name:"vibemux-worker",version:"0.1.1"},capabilities:{experimentalApi:!0}}})});return{id:"codex-auth",label:"Codex \u767B\u5F55",ok:t.ok,detail:t.detail,autoInstallable:!1,hint:t.ok?void 0:"\u8BF7\u5148\u8FD0\u884C `codex`\uFF0C\u6309\u63D0\u793A\u5B8C\u6210\u767B\u5F55\u540E\u518D\u91CD\u8BD5\u3002"}},fa=()=>{let e=oe("claude"),t=e?U(e,["--version"]):null,r=bn();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"}},ha=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}},ka=()=>{if(process.env.ANTHROPIC_API_KEY?.trim()||process.env.ANTHROPIC_AUTH_TOKEN?.trim()||ca(wn.join(ua(),".credentials.json")))return!0;try{return ha(b().claudeCodeConfigContent??"")}catch{return!1}},ya=()=>{let e=oe("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(ka())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=U(e,["doctor"],{timeout:xn});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":B(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"}},vn=async e=>e==="codex-cli"?ga():e==="codex-auth"?ma():e==="claude-cli"?fa():e==="claude-auth"?ya():null,Pn=e=>e==="codex-cli"?Sn():e==="claude-cli"?bn():null;var z=900*1e3,xe=X(),xa=e=>{let t=process.env.PATH??"";t.split(St.delimiter).filter(Boolean).includes(e)||(process.env.PATH=t?`${e}${St.delimiter}${t}`:e)},ur=()=>{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=St.join(r,...n);if(Ct(o))return xa(St.dirname(o)),o}return null},En=e=>e==="git"?"Git":e==="opencode"?"Worker \u4F9D\u8D56":e==="codex-cli"?"Codex CLI":e==="codex-auth"?"Codex \u767B\u5F55":e==="claude-cli"?"Claude Code CLI":"Claude Code \u767B\u5F55",J=(e,t,r)=>({id:e,label:En(e),ok:r.ok,changed:r.changed,detail:r.detail,skipped:r.skipped,installer:t?.installer,commandSummary:t?.commandSummary}),Rn=()=>{if(process.platform==="win32")return _("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=U("winget",["install","--id","Git.Git","--exact","--source","winget","--accept-package-agreements","--accept-source-agreements"],{streamOutput:e?.streamOutput,timeout:z});return r.ok&&ur(),J("git",t,{ok:r.ok,changed:r.ok,detail:B(r,"winget install Git.Git \u5931\u8D25")})}}:_("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=U("choco",["install","git","-y"],{streamOutput:e?.streamOutput,timeout:z});return r.ok&&ur(),J("git",t,{ok:r.ok,changed:r.ok,detail:B(r,"choco install git \u5931\u8D25")})}}:null;if(process.platform==="darwin")return _("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=U("brew",["install","git"],{streamOutput:e?.streamOutput,timeout:z});return J("git",t,{ok:r.ok,changed:r.ok,detail:B(r,"brew install git \u5931\u8D25")})}}:null;if(process.platform==="linux"){if(_("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=se("apt-get",["update"],z,e);if(!r.ok)return J("git",t,{ok:!1,changed:!1,detail:B(r,"apt-get update \u5931\u8D25")});let n=se("apt-get",["install","-y","git"],z,e);return J("git",t,{ok:n.ok,changed:n.ok,detail:B(n,"apt-get install git \u5931\u8D25")})}};if(_("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=se("dnf",["install","-y","git"],z,e);return J("git",t,{ok:r.ok,changed:r.ok,detail:B(r,"dnf install git \u5931\u8D25")})}};if(_("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=se("yum",["install","-y","git"],z,e);return J("git",t,{ok:r.ok,changed:r.ok,detail:B(r,"yum install git \u5931\u8D25")})}};if(_("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=se("pacman",["-Sy","--noconfirm","git"],z,e);return J("git",t,{ok:r.ok,changed:r.ok,detail:B(r,"pacman \u5B89\u88C5 git \u5931\u8D25")})}};if(_("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=se("apk",["add","git"],z,e);return J("git",t,{ok:r.ok,changed:r.ok,detail:B(r,"apk add git \u5931\u8D25")})}}}return null},An=()=>Ct(`${xe}/package.json`)?Ct(`${xe}/pnpm-lock.yaml`)&&_("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` \u53EF\u88AB\u5F53\u524D Node \u8FD0\u884C\u65F6\u52A0\u8F7D\u3002",run(e){let t={installer:"pnpm",commandSummary:"pnpm install --frozen-lockfile"},r=U("pnpm",["install","--frozen-lockfile"],{cwd:xe,streamOutput:e?.streamOutput,timeout:z});return J("opencode",t,{ok:r.ok,changed:r.ok,detail:B(r,"pnpm install \u5931\u8D25")})}}:Ct(`${xe}/package-lock.json`)&&_("npm")?{installer:"npm",commandSummary:"npm ci",manualHint:"\u8BF7\u5728 worker \u6839\u76EE\u5F55\u6267\u884C `npm ci`\uFF0C\u786E\u4FDD `@opencode-ai/sdk` \u53EF\u88AB\u5F53\u524D Node \u8FD0\u884C\u65F6\u52A0\u8F7D\u3002",run(e){let t={installer:"npm",commandSummary:"npm ci"},r=U("npm",["ci"],{cwd:xe,streamOutput:e?.streamOutput,timeout:z});return J("opencode",t,{ok:r.ok,changed:r.ok,detail:B(r,"npm ci \u5931\u8D25")})}}:_("npm")?{installer:"npm",commandSummary:"npm install",manualHint:"\u8BF7\u5728 worker \u6839\u76EE\u5F55\u6267\u884C `npm install`\uFF0C\u786E\u4FDD `@opencode-ai/sdk` \u53EF\u88AB\u5F53\u524D Node \u8FD0\u884C\u65F6\u52A0\u8F7D\u3002",run(e){let t={installer:"npm",commandSummary:"npm install"},r=U("npm",["install"],{cwd:xe,streamOutput:e?.streamOutput,timeout:z});return J("opencode",t,{ok:r.ok,changed:r.ok,detail:B(r,"npm install \u5931\u8D25")})}}:null:null,Ca=e=>e==="git"?Rn():e==="opencode"?An():Pn(e),Sa=()=>{ur();let e=U("git",["--version"]),t=Rn();return{id:"git",label:"Git",ok:e.ok,detail:B(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"}},ba=()=>{let e=U(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:xe}),t=An();return{id:"opencode",label:"Worker \u4F9D\u8D56",ok:e.ok,detail:e.ok?"@opencode-ai/sdk \u5DF2\u5B89\u88C5":B(e,"OpenCode SDK \u4E0D\u53EF\u7528"),autoInstallable:!!t,installer:t?.installer,installCommand:t?.commandSummary,hint:t?.manualHint||"\u8BF7\u68C0\u67E5\u4F9D\u8D56\u5B89\u88C5\u72B6\u6001\uFF0C\u786E\u8BA4 `@opencode-ai/sdk` \u53EF\u88AB\u5F53\u524D Node \u8FD0\u884C\u65F6\u52A0\u8F7D\u3002"}},Mn=async e=>{if(e==="git")return Sa();if(e==="opencode")return ba();let t=await vn(e);return t||{id:e,label:En(e),ok:!1,detail:"\u672A\u77E5\u68C0\u67E5\u9879\u3002",autoInstallable:!1}},va=e=>e==="all"?["git","opencode","codex-cli","codex-auth","claude-cli","claude-auth"]:e==="Codex"?["git","codex-cli","codex-auth"]:e==="ClaudeCode"?["git","claude-cli","claude-auth"]:["git","opencode"],Pa=e=>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\u3001Codex\u3001Claude Code \u8FD0\u884C\u73AF\u5883\u5DF2\u5C31\u7EEA\u3002":"Git \u4E0E OpenCode \u8FD0\u884C\u65F6\u5DF2\u5C31\u7EEA\u3002",On=(e,t)=>{let r=e.filter(o=>!o.ok),n=r.length===0;return{ok:n,target:t,items:e,missingItems:r,message:n?Pa(t):`\u8FD0\u884C\u73AF\u5883\u7F3A\u5931\uFF1A${r.map(o=>o.label).join("\u3001")}`}},pr=async(e="base")=>{let t=await Promise.all(va(e).map(r=>Mn(r)));return On(t,e)},bt=(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:`\u81EA\u52A8\u51C6\u5907\u5931\u8D25\uFF1A${e.missingItems.map(s=>s.label).join("\u3001")}`}},cr=(e,t,r)=>{console.log(`[${e}/${t}] ${r}`)},lr=(e,t)=>{console.log(` ${e} - ${t}`)},Bn=async(e,t)=>{if(e.ok)return bt(e);let r=[],n=e.missingItems.length*2+1,o=1;for(let i of e.missingItems){let a=Ca(i.id),l=a?`\u5B89\u88C5 ${i.label}\uFF08${a.installer}\uFF09`:`\u5B89\u88C5 ${i.label}`;t?.printProgress&&cr(o,n,l);let c=a?a.run(t):J(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(c),t?.printProgress&&lr(c.ok?"\u6210\u529F":c.skipped?"\u8DF3\u8FC7":"\u5931\u8D25",c.detail),o+=1;let u=await Mn(i.id);t?.printProgress&&(cr(o,n,`\u6821\u9A8C ${i.label}`),lr(u.ok?"\u6210\u529F":"\u5931\u8D25",u.detail)),o+=1}let s=await pr(e.target);return t?.printProgress&&(cr(o,n,"\u6700\u7EC8\u590D\u68C0"),lr(s.ok?"\u6210\u529F":"\u5931\u8D25",s.message)),bt(s,r)},Ia=e=>e.missingItems.map(t=>{let r=t.installCommand?`\uFF1B\u81EA\u52A8\u5B89\u88C5\uFF1A${t.installCommand}`:"";return`- ${t.label}: ${t.detail}${r}`}).join(`
7
- `),dr=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"}`)},Ta=()=>!!(In.isTTY&&Tn.isTTY),Ea=e=>{let t=e.trim().toLowerCase();return t==="y"||t==="yes"||t==="\u662F"},ie=async e=>{let t=await pr(e?.target??"base");return t.ok||!e?.autoInstall?bt(t):Bn(t,e)},_n=async(e,t="base")=>{let r=await pr(t),n=bt(r);if(r.ok)return{status:"ready",report:n,message:n.message};if(console.log(`[worker] \u547D\u4EE4 ${e} \u8FD0\u884C\u524D\u68C0\u6D4B\u5230\u7F3A\u5931\u4F9D\u8D56\uFF1A`),console.log(Ia(r)),!Ta()){let i="\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] ${i}`),dr(r),{status:"non_interactive_blocked",report:n,message:i}}let o=wa({input:In,output:Tn});try{let i=await o.question("\u662F\u5426\u73B0\u5728\u81EA\u52A8\u5B89\u88C5\u7F3A\u5931\u4F9D\u8D56\uFF1F[y/N] ");if(!Ea(i)){let a="\u7528\u6237\u62D2\u7EDD\u81EA\u52A8\u5B89\u88C5\uFF0CWorker \u5DF2\u9000\u51FA\u3002";return console.error(`[worker] ${a}`),dr(r),{status:"declined",report:n,message:a}}}finally{o.close()}let s=await Bn(r,{interactiveAuth:!0,printProgress:!0,streamOutput:!0});return s.ok?{status:"ready",report:s,message:s.message}:(dr(On(s.items,t)),{status:"failed",report:s,message:s.message})};var vt={daemonMode:"idle",paired:!1,connected:!1,runningTaskIds:[],queuedTaskIds:[]},He=()=>({...vt,runningTaskIds:[...vt.runningTaskIds],queuedTaskIds:[...vt.queuedTaskIds]}),gr=e=>({...e,executorToken:e.executorToken?.trim()?"[redacted]":void 0,opencodeConfigContent:e.opencodeConfigContent?.trim()?"[redacted]":"",mcpServers:e.mcpServers?.map(t=>({...t,target:t.target?.trim()?"[redacted]":t.target}))}),Ee=()=>{let e=He();return{...e,config:e.config?gr(e.config):void 0}},O=e=>{Object.assign(vt,e)};import{mkdtemp as Ra,readFile as Aa,rm as Ma}from"node:fs/promises";import Oa from"node:os";import Pt from"node:path";var le=e=>e.replace(/\/+$/,""),Wn=e=>{let t=le(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`};var Ce=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 $n=async e=>Ce({url:`${le(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."}),Un=async e=>Ce({url:`${le(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 Dn=12,Nn=12,Ln=1500,Gn=e=>{let t=e?.trim();if(t)return t.length>Ln?`${t.slice(0,Ln)}\u2026`:t},Ba=e=>{if(e!==void 0)try{return Gn(JSON.stringify(e,null,2))}catch{return}},_a=(e,t)=>`data:${t};base64,${e.toString("base64")}`,It=async e=>{let{chromium:t}=await import("playwright"),r=null,n=null,o="",s,i=0,a=0,l="playwright",c=0,u=0,d=async p=>{let x=p.level??"info";(x==="error"||x==="warning")&&(a+=1),i+=1,await $n({cloudUrl:e.cloudUrl,executorToken:e.executorToken,taskId:e.taskId,workspaceId:e.workspaceId,workspaceSessionId:e.workspaceSessionId,kind:p.kind,level:x,title:p.title,detail:Gn(p.detail),url:p.url,attachments:p.attachments,metadata:p.metadata}).catch(()=>{})},w=async(p,x)=>{let h=Pt.join(o,`${Date.now()}-${x}.png`);await p.screenshot({path:h,fullPage:!0});let m=await Aa(h),k=await Un({cloudUrl:e.cloudUrl,executorToken:e.executorToken,taskId:e.taskId,filename:Pt.basename(h),image:_a(m,"image/png")});s=k.url,await d({kind:"screenshot",level:"info",title:`\u9875\u9762\u622A\u56FE \xB7 ${x}`,detail:`\u5F53\u524D\u9875\u9762: ${p.url()}`,url:k.url,attachments:[{id:k.id,url:k.url,filename:Pt.basename(h),contentType:"image/png"}],metadata:{label:x}})};try{o=await Ra(Pt.join(Oa.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",k=>{let S=k.type();if(S==="error"||S==="warning"){if(c>=Dn)return;c+=1,d({kind:"browser-console",level:S==="error"?"error":"warning",title:`Console ${S}`,detail:[k.text(),Ba(k.location())].filter(Boolean).join(`
8
- `),url:p.url()||e.appUrl,metadata:{type:S,location:k.location()}})}}),p.on("pageerror",k=>{c>=Dn||(c+=1,d({kind:"browser-console",level:"error",title:"\u9875\u9762\u811A\u672C\u5F02\u5E38",detail:k.message,url:p.url()||e.appUrl}))}),p.on("requestfailed",k=>{u>=Nn||(u+=1,d({kind:"network",level:"error",title:`\u8BF7\u6C42\u5931\u8D25 \xB7 ${k.method()} ${k.resourceType()}`,detail:[k.url(),k.failure()?.errorText].filter(Boolean).join(`
9
- `),url:k.url(),metadata:{method:k.method(),resourceType:k.resourceType(),failure:k.failure()}}))}),p.on("response",k=>{k.ok()||u>=Nn||(u+=1,d({kind:"network",level:k.status()>=500?"error":"warning",title:`\u54CD\u5E94\u5F02\u5E38 \xB7 ${k.status()} ${k.request().method()}`,detail:[k.url(),k.statusText()].filter(Boolean).join(`
10
- `),url:k.url(),metadata:{method:k.request().method(),status:k.status(),statusText:k.statusText()}}))}),await d({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(`
11
- `),url:e.appUrl}),e.healthUrl?.trim()){let k=await fetch(e.healthUrl,{redirect:"follow"}).catch(S=>({ok:!1,status:0,statusText:S instanceof Error?S.message:"health request failed"}));await d({kind:"network",level:k.ok?"success":"warning",title:k.ok?"\u5065\u5EB7\u68C0\u67E5\u901A\u8FC7":"\u5065\u5EB7\u68C0\u67E5\u5F02\u5E38",detail:`${e.healthUrl}
12
- ${k.status} ${k.statusText}`,url:e.healthUrl,metadata:{status:k.status,statusText:k.statusText}})}let x=await p.goto(e.appUrl,{waitUntil:"domcontentloaded",timeout:3e4});await p.waitForLoadState("networkidle",{timeout:1e4}).catch(()=>{}),await d({kind:"action",level:x?.ok()?"success":"warning",title:x?.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()}`,x?`HTTP ${x.status()} ${x.statusText()}`:"\u672A\u83B7\u5F97\u9996\u4E2A\u5BFC\u822A\u54CD\u5E94"].join(`
13
- `),url:p.url()}),await w(p,"initial");let h=e.goal?.trim();h&&await d({kind:"action",level:"info",title:"\u5DF2\u8BB0\u5F55\u6D4B\u8BD5\u76EE\u6807",detail:h,url:p.url()});let m=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 d({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:[m,`\u4F7F\u7528\u6A21\u5F0F: ${l}`,`\u6700\u7EC8\u9875\u9762: ${p.url()}`,`\u89C2\u6D4B\u6570\u91CF: ${i}`].join(`
14
- `),url:p.url(),metadata:{usedMode:l,observationsCount:i,issueCount:a,consoleCount:c,networkCount:u}}),{ok:!0,message:m,summary:m,usedMode:l,finalUrl:p.url(),screenshotUrl:s,observationsCount:i,issueCount:a,at:new Date().toISOString()}}catch(p){let x=p instanceof Error?p.message:"\u6D4F\u89C8\u5668\u5DE1\u68C0\u5931\u8D25\u3002";return await d({kind:"action",level:"error",title:"\u6D4F\u89C8\u5668\u5DE1\u68C0\u5931\u8D25",detail:x,url:e.appUrl}),{ok:!1,message:x,summary:x,usedMode:l,finalUrl:e.appUrl,screenshotUrl:s,observationsCount:i,issueCount:a,at:new Date().toISOString()}}finally{await n?.close().catch(()=>{}),await r?.close().catch(()=>{}),o&&await Ma(o,{recursive:!0,force:!0}).catch(()=>{})}};var Et=e=>{let t=process.argv.slice(3),r=t.findIndex(n=>n===e);if(!(r<0))return t[r+1]?.trim()||void 0},Tt=e=>{let t=Et(e);if(!t)throw new Error(`\u7F3A\u5C11\u5FC5\u586B\u53C2\u6570 ${e}\u3002`);return t},jn=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 It({cloudUrl:e.cloudUrl,executorToken:t,taskId:Tt("--task-id"),workspaceId:Tt("--workspace-id"),workspaceSessionId:Tt("--workspace-session-id"),cwd:Et("--cwd")?.trim()||process.cwd(),appUrl:Tt("--app-url"),healthUrl:Et("--health-url")?.trim()||void 0,goal:Et("--goal")?.trim()||void 0,mode:"playwright"});console.log(JSON.stringify(r,null,2)),r.ok||(process.exitCode=1)};import{spawn as Fu}from"node:child_process";var mr=async e=>Ce({url:`${le(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 fr=async(e,t)=>Ce({url:`${le(t)}/api/control-plane/executors/pair`,method:"POST",body:e,errorMessage:"Pair request failed."});var Wa=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():"",Hn=async e=>{let t=await Wa(e);return JSON.parse(t)};var hr=(e,t)=>{if(!e.executorToken)throw new Error("Worker is not paired yet.");let r=`${Wn(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 Hn(o.data);try{t.onMessage?.(s)}catch(i){t.onError?.(`\u63A7\u5236\u9762\u6D88\u606F\u5904\u7406\u5931\u8D25\u3002${i instanceof Error?` ${i.message}`:""}`)}}catch(s){t.onError?.(`\u63A7\u5236\u9762\u8FD4\u56DE\u4E86\u65E0\u6CD5\u89E3\u6790\u7684\u6D88\u606F\u3002${s instanceof Error?` ${s.message}`:""}`)}}),n.addEventListener("error",()=>{t.onError?.(`\u65E0\u6CD5\u8FDE\u63A5\u5230 \u2601\uFE0F \u4E91\u7AEF WebSocket: ${r}`)}),n.addEventListener("close",o=>{t.onClose?.(o)}),{socket:n,send(o){n.send(JSON.stringify(o))}}};import{mkdirSync as $a}from"node:fs";import qe from"node:path";var Rt=e=>{let t={root:e,reposDir:qe.join(e,"repos"),worktreesDir:qe.join(e,"worktrees"),artifactsDir:qe.join(e,"artifacts"),cacheDir:qe.join(e,"cache")};for(let r of Object.values(t))$a(r,{recursive:!0});return t},qn=(e,t,r)=>qe.join(e,"worktrees",r?.trim()||t);import{existsSync as Tc,readFileSync as Ec}from"node:fs";import Rc from"node:http";import Er from"node:path";import{closeSync as Ua,existsSync as Fn,openSync as Da,readFileSync as kr,readSync as Na,readdirSync as La,statSync as Ga}from"node:fs";import ja from"node:os";import q from"node:path";var Mt=ja.homedir(),Ha=48*1024,qa=2e4,Jn=q.join(Mt,".claude","projects"),At=q.join(Mt,".local","share","opencode","storage","message"),Fa=q.join(Mt,".local","share","opencode","storage","part"),zn=q.join(Mt,".codex","sessions"),Ja=()=>({claude:0,opencode:0,codex:0}),N=e=>!!e&&typeof e=="object"&&!Array.isArray(e),Ot=e=>{try{return La(e,{withFileTypes:!0})}catch{return[]}},Fe=e=>{try{return Ga(e)}catch{return null}},Vn=(e,t=Ha)=>{let r=Da(e,"r"),n=Buffer.alloc(t);try{let o=Na(r,n,0,t,0);return n.subarray(0,o).toString("utf8")}finally{Ua(r)}},Kn=e=>{try{return JSON.parse(kr(e,"utf8"))}catch{return null}},Bt=e=>e.split(`
15
- `).map(t=>t.trim()).filter(Boolean).flatMap(t=>{try{return[JSON.parse(t)]}catch{return[]}}),_t=(e,t)=>{if(!Fn(e))return[];let r=[],n=[e];for(;n.length>0;){let o=n.pop();if(o)for(let s of Ot(o)){let i=q.join(o,s.name);if(s.isDirectory()){n.push(i);continue}s.isFile()&&i.endsWith(t)&&r.push(i)}}return r},V=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()}},Xn=(e,t=240)=>{let r=e.replace(/\s+/g," ").trim();return r?r.length<=t?r:`${r.slice(0,t-1)}\u2026`:""},Re=(e,t=qa)=>{let r=e.trim();return r?r.length<=t?r:`${r.slice(0,t)}
16
-
17
- \u2026\uFF08\u5185\u5BB9\u8FC7\u957F\uFF0C\u5DF2\u6309\u5B89\u5168\u4E0A\u9650\u622A\u65AD\uFF09`:""},yr=e=>typeof e=="string"?e.trim():Array.isArray(e)?e.flatMap(t=>typeof t=="string"?[t]:N(t)?typeof t.text=="string"?[t.text]:typeof t.content=="string"?[t.content]:[]:[]).join(`
18
-
19
- `).trim():"",Je=e=>e.includes("# AGENTS.md instructions")||e.includes("<environment_context>")||e.includes("<INSTRUCTIONS>")||e.includes("<local-command-caveat>")||e.includes("<local-command-stdout>"),ze=e=>({...e,title:Xn(e.title||"\u672A\u547D\u540D\u4F1A\u8BDD",96),cwd:e.cwd||"\u2014"}),za=()=>_t(Jn,".jsonl").flatMap(e=>{let t=Fe(e);if(!t)return[];let r=Bt(Vn(e)),n=q.basename(e,".jsonl"),o=r.map(a=>V(a.timestamp)).find(Boolean),s=r.map(a=>typeof a.cwd=="string"?a.cwd:"").find(Boolean)||"",i=r.flatMap(a=>{let l=N(a.message)?a.message:null;if(!l||l.role!=="user")return[];let c=yr(l.content);return!c||Je(c)?[]:[c]}).find(Boolean)||"Claude Code \u4F1A\u8BDD";return[ze({id:n,source:"claude",title:i,cwd:s,startedAt:o,lastUpdatedAt:t.mtime.toISOString(),entryCount:0})]}),Va=e=>{let t=N(e.message)?e.message:null;if(!t||e.isMeta===!0)return[];let r=V(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=yr(o);return!s||Je(s)?[]:[{id:`${String(e.uuid||e.sessionId||r||Math.random())}`,role:n==="user"?"user":"system",text:Re(s),timestamp:r}]}return n!=="assistant"||!Array.isArray(o)?[]:o.flatMap((s,i)=>N(s)?typeof s.text=="string"&&s.type==="text"?[{id:`${String(e.uuid||e.sessionId||r||i)}-${i}`,role:"assistant",text:Re(s.text),timestamp:r}]:s.type==="tool_use"&&typeof s.name=="string"?[{id:`${String(e.uuid||e.sessionId||r||i)}-${i}`,role:"tool",text:Re(`\u8C03\u7528\u5DE5\u5177\uFF1A${s.name}`),timestamp:r}]:[]:[])},Ka=e=>{let r=_t(Jn,".jsonl").filter(c=>q.basename(c,".jsonl")===e)[0];if(!r)return null;let n=Bt(kr(r,"utf8")),o=Fe(r),s=n.map(c=>typeof c.cwd=="string"?c.cwd:"").find(Boolean)||"",i=n.flatMap(c=>{let u=N(c.message)?c.message:null;if(!u||u.role!=="user")return[];let d=yr(u.content);return!d||Je(d)?[]:[d]}).find(Boolean)||"Claude Code \u4F1A\u8BDD",a=n.map(c=>V(c.timestamp)).find(Boolean),l=n.flatMap(Va);return{...ze({id:e,source:"claude",title:i,cwd:s,startedAt:a,lastUpdatedAt:o?.mtime.toISOString()||new Date().toISOString(),entryCount:l.length}),entries:l}},Xa=()=>_t(zn,".jsonl").flatMap(e=>{let t=Fe(e);if(!t)return[];let r=Bt(Vn(e)),n=r.find(l=>l.type==="session_meta"),o=N(n?.payload)?n.payload:null,s=typeof o?.cwd=="string"?o.cwd:"",i=V(o?.timestamp)||r.map(l=>V(l.timestamp)).find(Boolean),a=r.flatMap(l=>Yn(l,!0)).map(l=>l.text).find(l=>!Je(l))||"Codex \u4F1A\u8BDD";return[ze({id:q.basename(e,".jsonl"),source:"codex",title:a,cwd:s,startedAt:i,lastUpdatedAt:t.mtime.toISOString(),entryCount:0})]}),Yn=(e,t=!1)=>{if(e.type!=="response_item")return[];let r=N(e.payload)?e.payload:null;if(!r)return[];let n=V(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(l=>N(l)?typeof l.text=="string"&&(l.type==="input_text"||l.type==="text"||l.type==="output_text"||l.type==="summary_text")?[l.text]:!t&&l.type==="tool_use"&&typeof l.name=="string"?[`\u8C03\u7528\u5DE5\u5177\uFF1A${l.name}`]:[]:[]).join(`
20
-
21
- `).trim():"";return a?t&&i!=="user"?[]:[{id:`${String(e.timestamp||Math.random())}-${i}`,role:i,text:Re(a),timestamp:n}]:[]}if(t||r.type!=="function_call")return[];let o=typeof r.name=="string"?r.name:"tool",s=Xn(typeof r.arguments=="string"?r.arguments:"");return[{id:`${String(e.timestamp||Math.random())}-tool`,role:"tool",text:Re(s?`\u8C03\u7528 ${o}
22
- ${s}`:`\u8C03\u7528 ${o}`),timestamp:n}]},Ya=e=>{let r=_t(zn,".jsonl").filter(d=>q.basename(d,".jsonl")===e)[0];if(!r)return null;let n=Bt(kr(r,"utf8")),o=Fe(r),s=n.find(d=>d.type==="session_meta"),i=N(s?.payload)?s.payload:null,a=typeof i?.cwd=="string"?i.cwd:"",l=V(i?.timestamp)||n.map(d=>V(d.timestamp)).find(Boolean),c=n.flatMap(d=>Yn(d)),u=c.find(d=>d.role==="user"&&!Je(d.text))?.text||"Codex \u4F1A\u8BDD";return{...ze({id:e,source:"codex",title:u,cwd:a,startedAt:l,lastUpdatedAt:o?.mtime.toISOString()||new Date().toISOString(),entryCount:c.length}),entries:c}},Qa=e=>{let t=q.join(Fa,e);return Ot(t).filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>Kn(q.join(t,r.name))).filter(r=>!!r).sort((r,n)=>{let o=N(r.time)&&typeof r.time.start=="number"?r.time.start:0,s=N(n.time)&&typeof n.time.start=="number"?n.time.start:0;return o-s})},Qn=e=>{let t=Qa(String(e.id)).flatMap(n=>n.type==="text"&&typeof n.text=="string"?[n.text.trim()]:[]).filter(Boolean).join(`
23
-
24
- `);if(t)return t;let r=N(e.summary)?e.summary:null;return typeof r?.title=="string"?r.title.replace(/^Title:\s*/i,"").trim():""},Zn=e=>{let t=q.join(At,e);return Ot(t).filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>Kn(q.join(t,r.name))).filter(r=>!!r).sort((r,n)=>{let o=N(r.time)&&typeof r.time.created=="number"?r.time.created:0,s=N(n.time)&&typeof n.time.created=="number"?n.time.created:0;return o-s})},eo=e=>{let t=q.join(At,e),r=Fe(t),n=Zn(e);if(n.length===0)return null;let o=n.flatMap(l=>{let c=N(l.path)?l.path:null;return typeof c?.cwd=="string"?[c.cwd]:[]}).find(Boolean)||"",s=n.map(l=>V(N(l.time)?l.time.created:void 0)).find(Boolean),i=n.map(l=>{let c=N(l.time)?l.time:null;return V(c?.completed)||V(c?.created)}).filter(Boolean).pop()||r?.mtime.toISOString()||new Date().toISOString(),a=n.filter(l=>l.role==="user").map(Qn).find(Boolean)||"OpenCode \u4F1A\u8BDD";return ze({id:e,source:"opencode",title:a,cwd:o,startedAt:s,lastUpdatedAt:i,entryCount:n.length})},Za=()=>Fn(At)?Ot(At).filter(e=>e.isDirectory()).flatMap(e=>{let t=eo(e.name);return t?[t]:[]}):[],ec=e=>{let t=eo(e);if(!t)return null;let r=Zn(e).flatMap(n=>{let o=n.role;if(o!=="user"&&o!=="assistant")return[];let s=Qn(n);if(!s)return[];let i=N(n.time)?n.time:null;return[{id:String(n.id),role:o,text:Re(s),timestamp:V(i?.created)}]});return{...t,entryCount:r.length,entries:r}},to=()=>{let e=[...za(),...Za(),...Xa()].sort((r,n)=>n.lastUpdatedAt.localeCompare(r.lastUpdatedAt)),t=e.reduce((r,n)=>(r[n.source]+=1,r),Ja());return{sessions:e,counts:t}},ro=(e,t)=>e==="claude"?Ka(t):e==="opencode"?ec(t):Ya(t);import{existsSync as ao,mkdirSync as co,readdirSync as gc,renameSync as Sr,rmSync as br,writeFileSync as mc}from"node:fs";import fc from"node:os";import Se from"node:path";import{spawn as Ir,spawnSync as hc}from"node:child_process";import{chmodSync as no,mkdirSync as tc,rmSync as rc,writeFileSync as oo}from"node:fs";import nc from"node:os";import xr from"node:path";var wr=e=>e.replace(/\\/g,"\\\\").replace(/`/g,"\\`").replace(/\$/g,"\\$"),oc=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}},sc=e=>{let t=oc(e);if(!t)return null;try{return new URL(`ssh://${t}`).hostname.toLowerCase()}catch{return t.toLowerCase().replace(/:\d+$/,"")}},so=e=>{let t=sc(e);return t?t==="github.com"||t.endsWith(".github.com")?"github":t==="gitlab.com"||t.endsWith(".gitlab.com")||t.includes("gitlab")?"gitlab":"generic":null},ic=(e,t)=>{let r=t.provider??so(e);return r==="github"?"x-access-token":r==="gitlab"?"oauth2":t.email?.trim()||t.name?.trim()||"git"},ac=e=>{let t=so(e);return t==="github"?"GitHub":t==="gitlab"?"GitLab":"Git"},cc=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},H=(e,t)=>{let r=e instanceof Error?e.message:typeof e=="string"?e:"";if(!cc(r))return e instanceof Error?e:new Error(r||"Git \u64CD\u4F5C\u5931\u8D25\u3002");let n=ac(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`)},lc=(e,t,r)=>{let n=ic(r,t),o=t.credentialToken||"",s=xr.join(e,"git-askpass.js"),i=`#!/usr/bin/env node
1
+ import lc from"dotenv";var ke=e=>e.replace(/\/+$/,""),wo=e=>{let t=ke(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`};var Oe=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 dt=async(e,t)=>Oe({url:`${ke(t)}/api/control-plane/executors/pair`,method:"POST",body:e,errorMessage:"Pair request failed."});var pc=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."]]),gc=new Set(["This pairing code has already been used.","This pairing code has expired.","This pairing code does not exist."]),So=e=>{let t=e.trim();return pc.get(t)||t},mc=e=>gc.has(So(e)),xo=()=>"This worker is already paired locally. If you only want to reconnect after a restart, start the worker again without `connect --pairing-code ...`.",Dt=(e,t)=>{let r=So(e);return!t||!mc(r)?r:`${r} ${xo()}`},Co=e=>e?`${xo()} 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 Mr,readFileSync as Or}from"node:fs";import ce from"node:path";import{fileURLToPath as fc}from"node:url";var Rr=null,Tr=null,Ar=null,hc=e=>{try{let t=JSON.parse(Or(e,"utf8"));return!!(t.name&&t.version)}catch{return!1}},kc=()=>{let e=process.env.VIBEMUX_RUNTIME_ROOT?.trim();if(e)return ce.resolve(e);let t=ce.dirname(fc(import.meta.url));for(;;){let r=ce.join(t,"package.json");if(Mr(r)&&hc(r))return t;let n=ce.dirname(t);if(n===t)return process.cwd();t=n}},Z=()=>(Rr||(Rr=kc()),Rr),_e=()=>{if(!Tr){let e=ce.join(Z(),"package.json");Tr=Mr(e)?JSON.parse(Or(e,"utf8")):{}}return Tr},He=()=>{if(!Ar){let e=ce.join(Z(),"runtime","worker-release.json");Ar=Mr(e)?JSON.parse(Or(e,"utf8")):{}}return Ar},X=()=>_e().version?.trim()||process.env.npm_package_version?.trim()||"0.0.0",pt=()=>ce.join(Z(),"dist-worker","apps","worker","src","index.js"),Po=()=>ce.join(Z(),"dist-worker","apps","worker","web"),Bt=()=>{let e=process.platform==="win32"?"vibemux-worker.cmd":"vibemux-worker";return ce.join(Z(),"bin",e)};import{cpSync as bo,existsSync as we,mkdirSync as Br,readFileSync as Lt,rmSync as Nc,writeFileSync as Nr}from"node:fs";import{randomUUID as $c}from"node:crypto";import le from"node:os";import b from"node:path";var yc=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},wc=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},Sc=e=>wc(yc(e)),ee=e=>{let t=e?.trim();if(!t)return{};try{let r=JSON.parse(Sc(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 We="built-in://vibemux",_r=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),xc=(e,t,r)=>{let n=t.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"")||`${e}-${r+1}`;return`${e}-${r+1}-${n}`};var Cc=e=>e.replace(/\/+$/,""),Pc=e=>e.startsWith("sse://")?`http://${e.slice(6)}`:e,vc=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:`${Cc(e.cloudUrl)}/mcp/executor`,enabled:!0,headers:t}},Ic=e=>{let t=e.replace(/^stdio:\/\//,"").trim();return t?{command:t}:null},bc=e=>{let t=Pc(e).trim();return t?{type:"remote",url:t,enabled:!0}:null},De=(e,t)=>e.filter(r=>r.enabled).reduce((r,n,o)=>{let s=n.id?.trim()||xc("mcp",n.name,o),i=n.target===We?vc(t):n.transport==="stdio"||n.target.startsWith("stdio://")?Ic(n.target):bc(n.target);return i&&(r[s]=i),r},{}),Nt=(e,t,r)=>{let n=ee(e),o=_r(n)?{...n}:{},s=_r(o.mcp)?{...o.mcp}:_r(o.mcpServers)?{...o.mcpServers}:{},i=De(t,r),{mcpServers:a,...c}=o,l={...c,mcp:{...s,...i}};return JSON.stringify(l,null,2)};var Ec={defaultModel:"",agent:"",permissionPolicy:""},Rc={defaultModel:"gpt-5.4",sandbox:"workspace-write",approval:"never",reasoningEffort:"medium",reasoningSummary:"auto"},Tc={defaultModel:"sonnet",permissionMode:"bypassPermissions",planMode:!1},Ac={defaultModel:"",agentDir:""},vo={OpenCode:Ec,Codex:Rc,ClaudeCode:Tc,Pi:Ac},Lh={...vo};var Mc=e=>({OpenCode:{...e.OpenCode},Codex:{...e.Codex},ClaudeCode:{...e.ClaudeCode},Pi:{...e.Pi}}),gt=(e,t)=>{let r=Mc(vo);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 $t=null,Oc=()=>$t||($t=He(),$t),ye=()=>process.env.VIBEMUX_WORKER_RELEASE_CHANNEL?.trim()||Oc().channel?.trim()||"production",_c=e=>e==="preview"?"vibemux-worker-preview":"vibemux-worker",Wc=e=>e==="preview"?"preview":"latest",Dc=()=>(process.env.npm_config_registry?.trim()||"https://registry.npmjs.org").replace(/\/$/,""),Bc=async e=>{let t=await fetch(`${Dc()}/${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()},Be=async()=>{let e=X(),t=ye(),r=_e().name?.trim()||"",n=_c(t),o=Wc(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 Bc(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 Eo=b.join(le.homedir(),".vibemux"),Uc=b.join(le.homedir(),".vibemux-dev"),Lc=b.join(le.homedir(),".vibemux-preview"),jc="http://127.0.0.1:8989",Gc=48100,qc=["config.json","machine-id","workspace","runtime"],zc=["config.json","machine-id","runtime"],Fc=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"]),Ro=()=>!!process.env.VIBEMUX_CLOUD_URL?.trim(),Ut=()=>process.env.VIBEMUX_CLOUD_URL?.trim()||He().defaultCloudUrl?.trim()||jc,Wr=e=>e.includes("preview.vibemux.com"),Hc=e=>{if(process.env.NODE_ENV==="development"||Ro())return!1;let t=He().defaultCloudUrl?.trim();if(!t)return!1;if(Fc.has(e?.trim()||""))return!0;let r=Wr(t),n=Wr(e||"");return r!==n},To=()=>{let e=Ut();return ye()==="preview"||Wr(e)?"preview":process.env.NODE_ENV==="development"?"development":"production"},Jc=()=>{switch(To()){case"development":return Uc;case"preview":return Lc;default:return Eo}},Vc=()=>{let e=Eo;switch(To()){case"development":return[b.join(e,"worker-dev")];case"preview":return process.env.NODE_ENV==="development"?[b.join(e,"worker-dev-preview"),b.join(e,"worker-preview")]:[b.join(e,"worker-preview"),b.join(e,"worker-dev-preview")];default:return[b.join(e,"worker")]}},Io=e=>zc.some(t=>we(b.join(e,t))),Kc=(e,t)=>{let r=b.join(e,"config.json");if(we(r))try{let n=JSON.parse(Lt(r,"utf8"));(n.workspaceRoot?.trim()||"")===b.join(e,"workspace")&&(n.workspaceRoot=b.join(t,"workspace")),Nr(b.join(t,"config.json"),`${JSON.stringify(n,null,2)}
3
+ `,"utf8")}catch{bo(r,b.join(t,"config.json"))}},Xc=e=>{if(Io(e))return;let t=Vc().find(r=>r!==e&&Io(r));if(t){Br(e,{recursive:!0});for(let r of qc){if(r==="config.json")continue;let n=b.join(t,r),o=b.join(e,r);!we(n)||we(o)||bo(n,o,{recursive:!0})}we(b.join(e,"config.json"))||Kc(t,e)}},Yc=()=>{let e=Number(process.env.VIBEMUX_WORKER_PORT?.trim());if(Number.isFinite(e)&&e>0)return e;let t=He().defaultLocalServerPort;return Number.isFinite(t)&&t?t:Gc},Qc=()=>{let e=process.env.OPENCODE_CONFIG_PATH?.trim();if(e)return[e];let t=b.join(le.homedir(),".config","opencode");return[b.join(t,"opencode.json"),b.join(t,"opencode.jsonc")]},Ao=()=>{let e=process.env.CODEX_HOME?.trim()||b.join(le.homedir(),".codex");return b.join(e,"config.toml")},Mo=()=>{let e=process.env.CODEX_HOME?.trim()||b.join(le.homedir(),".codex");return b.join(e,"auth.json")},Zc=()=>{let e=process.env.CLAUDE_HOME?.trim()||b.join(le.homedir(),".claude");return[b.join(e,"settings.json"),b.join(e,"config.json")]},Oo=()=>process.env.PI_AGENT_DIR?.trim()||b.join(le.homedir(),".pi","agent"),Je=e=>{if(!we(e))return"";try{return Lt(e,"utf8").trim()}catch{return""}},Dr=e=>!!e&&typeof e=="object"&&!Array.isArray(e),_o=(e,t)=>Object.entries(t).reduce((r,[n,o])=>{let s=r[n];return Dr(s)&&Dr(o)?(r[n]=_o({...s},o),r):(r[n]=o,r)},{...e}),Wo=()=>{let e=Qc().map(t=>({path:t,content:Je(t)})).filter(t=>t.content.trim());if(e.length===0)return{opencodeConfigContent:"",defaultModel:"",sourcePaths:[]};try{if(e.length===1){let o=ee(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=ee(s.content);return _o(o,i)},{}),r=Dr(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)}}},el=()=>{let e=Wo();return{opencodeConfigContent:e.opencodeConfigContent,defaultModel:e.defaultModel}},tl=()=>{let e=process.env.VIBEMUX_WORKER_HOME?.trim();if(e)return e;let t=process.env.VIBEMUX_HOME?.trim();return t?b.join(t,"worker"):Jc()},ne=()=>{let e=b.resolve(tl());return!process.env.VIBEMUX_WORKER_HOME?.trim()&&!process.env.VIBEMUX_HOME?.trim()&&Xc(e),e},$r=()=>b.join(ne(),"config.json"),rl=()=>b.join(ne(),"machine-id"),nl=()=>{let e=ne(),t=rl();if(we(t)){let n=Lt(t,"utf8").trim();if(n)return n}Br(e,{recursive:!0});let r=$c();return Nr(t,`${r}
4
+ `,"utf8"),r},ol=()=>({cloudUrl:Ut(),machineId:nl(),machineName:le.hostname(),opencodeConfigContent:"",codexConfigContent:"",codexAuthContent:"",claudeCodeConfigContent:"",piAgentDir:Oo(),defaultModel:"",agentSettings:gt(),mcpServers:[],workspaceRoot:b.join(ne(),"workspace"),maxConcurrency:5,labels:[],capabilities:["code-execution","git-operations"],localServerPort:Number(process.env.VIBEMUX_WORKER_PORT||Yc()),projectBindings:[]}),P=()=>{let e=$r(),t=we(e)?JSON.parse(Lt(e,"utf8")):{},r={...ol(),...t},n=el();Ro()&&(r.cloudUrl=Ut()),Hc(r.cloudUrl)&&(r.cloudUrl=Ut());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=Je(Ao())),r.codexAuthContent?.trim()||(r.codexAuthContent=Je(Mo())),r.claudeCodeConfigContent?.trim()||(r.claudeCodeConfigContent=Ur()),r.piAgentDir?.trim()||(r.piAgentDir=Oo()),r.defaultModel?.trim()||(r.defaultModel=n.defaultModel),r.agentSettings=gt(r.agentSettings,r.defaultModel),r},Se=e=>{let t=ne();Br(t,{recursive:!0}),Nr($r(),`${JSON.stringify(e,null,2)}
5
+ `,"utf8")},Do=()=>Wo().opencodeConfigContent,Bo=()=>Je(Ao()),No=()=>Je(Mo()),Ur=()=>{for(let e of Zc()){let t=Je(e);if(t.trim())return t}return""},jt=(e=P(),t)=>Nt(e.opencodeConfigContent,e.mcpServers??[],{cloudUrl:e.cloudUrl,executorToken:e.executorToken,actingUserId:t}),Gt=()=>{Nc($r(),{force:!0})},qt=()=>{let e={...P(),executorName:void 0,executorId:void 0,executorToken:void 0};return Se(e),e};import{existsSync as Ft}from"node:fs";import{stdin as Jo,stdout as Vo}from"node:process";import Ht from"node:path";import{createInterface as Il}from"node:readline/promises";import{existsSync as ml}from"node:fs";import fl from"node:os";import Lo from"node:path";import{spawn as hl}from"node:child_process";import{accessSync as sl,constants as il,existsSync as al}from"node:fs";import{delimiter as Lr,dirname as cl,isAbsolute as ll,join as ul}from"node:path";import{spawnSync as dl}from"node:child_process";var L=(e,t,r)=>{let n=dl(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}},B=(e,t)=>e.stdout||e.stderr||e.error||t,U=(e,t=["--version"])=>L(e,t).ok,pl=e=>{let t=process.env.PATH??"";t.split(Lr).filter(Boolean).includes(e)||(process.env.PATH=t?`${e}${Lr}${t}`:e)},jr=e=>{if(!al(e))return!1;try{return sl(e,il.X_OK),!0}catch{return!1}},Uo=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 jr(e)?e:null;for(let r of t){let n=`${e}${r}`;if(jr(n))return n}return null},$o=e=>process.platform==="win32"?Uo(e):jr(e)?e:null,ue=e=>{if(e.includes("/")||e.includes("\\")||ll(e))return $o(e);for(let t of(process.env.PATH??"").split(Lr).filter(Boolean)){let r=ul(t,e),n=process.platform==="win32"?Uo(r):$o(r);if(n)return pl(cl(n)),n}return null},gl=(e,t,r)=>typeof process.getuid=="function"&&process.getuid()===0?{command:e,args:t}:U("sudo")?r?.interactiveAuth?{command:"sudo",args:[e,...t]}:U("sudo",["-n","true"])?{command:"sudo",args:["-n",e,...t]}:null:null,de=(e,t,r,n)=>{let o=gl(e,t,n);return o?L(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 mt=900*1e3,jo=15e3,kl=()=>process.env.CLAUDE_HOME?.trim()||Lo.join(fl.homedir(),".claude"),yl=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,zt=(e,t,r)=>({id:e,label:yl(e),ok:r.ok,changed:r.changed,detail:r.detail,skipped:r.skipped,installer:t?.installer,commandSummary:t?.commandSummary}),Go=(e,t,r,n,o,s)=>{let i={installer:r,commandSummary:t},a=L("npm",["install","-g",e],{streamOutput:s?.streamOutput,timeout:mt});return!a.ok&&process.platform!=="win32"&&(a=de("npm",["install","-g",e],mt,s)),zt(n,i,{ok:a.ok,changed:a.ok,detail:B(a,o)})},qo=()=>U("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 Go("@openai/codex","npm install -g @openai/codex","npm","codex-cli","\u5B89\u88C5 Codex CLI \u5931\u8D25",e)}}:null,zo=()=>process.platform==="darwin"&&U("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=L("brew",["install","--cask","claude-code"],{streamOutput:e?.streamOutput,timeout:mt});return zt("claude-cli",t,{ok:r.ok,changed:r.ok,detail:B(r,"\u5B89\u88C5 Claude Code CLI \u5931\u8D25")})}}:process.platform==="win32"&&U("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=L("winget",["install","--id","Anthropic.ClaudeCode","--exact","--source","winget","--accept-package-agreements","--accept-source-agreements"],{streamOutput:e?.streamOutput,timeout:mt});return zt("claude-cli",t,{ok:r.ok,changed:r.ok,detail:B(r,"\u5B89\u88C5 Claude Code CLI \u5931\u8D25")})}}:process.platform!=="win32"&&U("bash")?{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=L("bash",["-lc","curl -fsSL https://claude.ai/install.sh | bash"],{streamOutput:e?.streamOutput,timeout:mt});return zt("claude-cli",t,{ok:r.ok,changed:r.ok,detail:B(r,"\u5B89\u88C5 Claude Code CLI \u5931\u8D25")})}}:U("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 Go("@anthropic-ai/claude-code","npm install -g @anthropic-ai/claude-code","npm","claude-cli","\u5B89\u88C5 Claude Code CLI \u5931\u8D25",e)}}:null,wl=()=>{let e=ue("codex"),t=e?L(e,["--version"]):null,r=qo();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"}},Sl=async()=>{let e=ue("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=await new Promise(r=>{let n=hl(e,["app-server"],{env:process.env,stdio:["pipe","pipe","pipe"]}),o="",s="",i=!1,a=0,c=-1,l=-1,u=k=>{i||(i=!0,clearTimeout(S),n.killed||n.kill("SIGTERM"),r(k))},d=k=>{n.stdin.write(`${JSON.stringify(k)}
6
+ `)},S=setTimeout(()=>{u({ok:!1,detail:"Codex \u767B\u5F55\u72B6\u6001\u68C0\u67E5\u8D85\u65F6\u3002"})},jo),p=()=>{a+=1,l=a,d({jsonrpc:"2.0",id:a,method:"account/read",params:{refreshToken:!1}})},m=k=>{let g=k.trim();if(g)try{let w=JSON.parse(g);if(w.error?.message){u({ok:!1,detail:w.error.message});return}if(!w.result||typeof w.id>"u")return;if(w.id===c){d({jsonrpc:"2.0",method:"initialized"}),p();return}if(w.id!==l)return;if(w.result.requiresOpenaiAuth&&!w.result.account){u({ok:!1,detail:"Codex \u672A\u767B\u5F55\uFF0C\u8BF7\u5148\u8FD0\u884C `codex` \u5B8C\u6210\u8BA4\u8BC1\u3002"});return}u({ok:!0,detail:"Codex \u767B\u5F55\u72B6\u6001\u6B63\u5E38\u3002"})}catch{return}};n.stdout.on("data",k=>{o+=k.toString();let g=o.split(`
7
+ `);o=g.pop()??"";for(let w of g)m(w)}),n.stderr.on("data",k=>{s+=k.toString()}),n.on("error",k=>{u({ok:!1,detail:k instanceof Error?k.message:"Codex \u767B\u5F55\u68C0\u67E5\u5931\u8D25\u3002"})}),n.on("close",()=>{if(i)return;let k=s.trim().split(`
8
+ `).filter(Boolean).at(-1)||"Codex \u767B\u5F55\u68C0\u67E5\u5931\u8D25\u3002";u({ok:!1,detail:k})}),a+=1,c=a,d({jsonrpc:"2.0",id:c,method:"initialize",params:{clientInfo:{name:"vibemux-worker",version:"0.1.1"},capabilities:{experimentalApi:!0}}})});return{id:"codex-auth",label:"Codex \u767B\u5F55",ok:t.ok,detail:t.detail,autoInstallable:!1,hint:t.ok?void 0:"\u8BF7\u5148\u8FD0\u884C `codex`\uFF0C\u6309\u63D0\u793A\u5B8C\u6210\u767B\u5F55\u540E\u518D\u91CD\u8BD5\u3002"}},xl=()=>{let e=ue("claude"),t=e?L(e,["--version"]):null,r=zo();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"}},Cl=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}},Pl=()=>{if(process.env.ANTHROPIC_API_KEY?.trim()||process.env.ANTHROPIC_AUTH_TOKEN?.trim()||ml(Lo.join(kl(),".credentials.json")))return!0;try{return Cl(P().claudeCodeConfigContent??"")}catch{return!1}},vl=()=>{let e=ue("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(Pl())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=L(e,["doctor"],{timeout:jo});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":B(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"}},Fo=async e=>e==="codex-cli"?wl():e==="codex-auth"?Sl():e==="claude-cli"?xl():e==="claude-auth"?vl():null,Ho=e=>e==="codex-cli"?qo():e==="claude-cli"?zo():null;var Y=900*1e3,xe=Z(),bl=e=>{let t=process.env.PATH??"";t.split(Ht.delimiter).filter(Boolean).includes(e)||(process.env.PATH=t?`${e}${Ht.delimiter}${t}`:e)},Fr=()=>{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=Ht.join(r,...n);if(Ft(o))return bl(Ht.dirname(o)),o}return null},Ko=e=>e==="git"?"Git":e==="opencode"?"Worker \u4F9D\u8D56":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",V=(e,t,r)=>({id:e,label:Ko(e),ok:r.ok,changed:r.changed,detail:r.detail,skipped:r.skipped,installer:t?.installer,commandSummary:t?.commandSummary}),Xo=()=>{if(process.platform==="win32")return U("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=L("winget",["install","--id","Git.Git","--exact","--source","winget","--accept-package-agreements","--accept-source-agreements"],{streamOutput:e?.streamOutput,timeout:Y});return r.ok&&Fr(),V("git",t,{ok:r.ok,changed:r.ok,detail:B(r,"winget install Git.Git \u5931\u8D25")})}}:U("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=L("choco",["install","git","-y"],{streamOutput:e?.streamOutput,timeout:Y});return r.ok&&Fr(),V("git",t,{ok:r.ok,changed:r.ok,detail:B(r,"choco install git \u5931\u8D25")})}}:null;if(process.platform==="darwin")return U("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=L("brew",["install","git"],{streamOutput:e?.streamOutput,timeout:Y});return V("git",t,{ok:r.ok,changed:r.ok,detail:B(r,"brew install git \u5931\u8D25")})}}:null;if(process.platform==="linux"){if(U("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"],Y,e);if(!r.ok)return V("git",t,{ok:!1,changed:!1,detail:B(r,"apt-get update \u5931\u8D25")});let n=de("apt-get",["install","-y","git"],Y,e);return V("git",t,{ok:n.ok,changed:n.ok,detail:B(n,"apt-get install git \u5931\u8D25")})}};if(U("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"],Y,e);return V("git",t,{ok:r.ok,changed:r.ok,detail:B(r,"dnf install git \u5931\u8D25")})}};if(U("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"],Y,e);return V("git",t,{ok:r.ok,changed:r.ok,detail:B(r,"yum install git \u5931\u8D25")})}};if(U("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"],Y,e);return V("git",t,{ok:r.ok,changed:r.ok,detail:B(r,"pacman \u5B89\u88C5 git \u5931\u8D25")})}};if(U("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"],Y,e);return V("git",t,{ok:r.ok,changed:r.ok,detail:B(r,"apk add git \u5931\u8D25")})}}}return null},Yo=()=>Ft(`${xe}/package.json`)?Ft(`${xe}/pnpm-lock.yaml`)&&U("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` \u53EF\u88AB\u5F53\u524D Node \u8FD0\u884C\u65F6\u52A0\u8F7D\u3002",run(e){let t={installer:"pnpm",commandSummary:"pnpm install --frozen-lockfile"},r=L("pnpm",["install","--frozen-lockfile"],{cwd:xe,streamOutput:e?.streamOutput,timeout:Y});return V("opencode",t,{ok:r.ok,changed:r.ok,detail:B(r,"pnpm install \u5931\u8D25")})}}:Ft(`${xe}/package-lock.json`)&&U("npm")?{installer:"npm",commandSummary:"npm ci",manualHint:"\u8BF7\u5728 worker \u6839\u76EE\u5F55\u6267\u884C `npm ci`\uFF0C\u786E\u4FDD `@opencode-ai/sdk` \u53EF\u88AB\u5F53\u524D Node \u8FD0\u884C\u65F6\u52A0\u8F7D\u3002",run(e){let t={installer:"npm",commandSummary:"npm ci"},r=L("npm",["ci"],{cwd:xe,streamOutput:e?.streamOutput,timeout:Y});return V("opencode",t,{ok:r.ok,changed:r.ok,detail:B(r,"npm ci \u5931\u8D25")})}}:U("npm")?{installer:"npm",commandSummary:"npm install",manualHint:"\u8BF7\u5728 worker \u6839\u76EE\u5F55\u6267\u884C `npm install`\uFF0C\u786E\u4FDD `@opencode-ai/sdk` \u53EF\u88AB\u5F53\u524D Node \u8FD0\u884C\u65F6\u52A0\u8F7D\u3002",run(e){let t={installer:"npm",commandSummary:"npm install"},r=L("npm",["install"],{cwd:xe,streamOutput:e?.streamOutput,timeout:Y});return V("opencode",t,{ok:r.ok,changed:r.ok,detail:B(r,"npm install \u5931\u8D25")})}}:null:null,El=e=>e==="git"?Xo():e==="opencode"?Yo():Ho(e),Rl=()=>{Fr();let e=L("git",["--version"]),t=Xo();return{id:"git",label:"Git",ok:e.ok,detail:B(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"}},Tl=()=>{let e=L(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:xe}),t=Yo();return{id:"opencode",label:"Worker \u4F9D\u8D56",ok:e.ok,detail:e.ok?"@opencode-ai/sdk \u5DF2\u5B89\u88C5":B(e,"OpenCode SDK \u4E0D\u53EF\u7528"),autoInstallable:!!t,installer:t?.installer,installCommand:t?.commandSummary,hint:t?.manualHint||"\u8BF7\u68C0\u67E5\u4F9D\u8D56\u5B89\u88C5\u72B6\u6001\uFF0C\u786E\u8BA4 `@opencode-ai/sdk` \u53EF\u88AB\u5F53\u524D Node \u8FD0\u884C\u65F6\u52A0\u8F7D\u3002"}},Al=()=>{let e=L(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:xe});return{id:"pi-runtime",label:"Pi runtime",ok:e.ok,detail:e.ok?"@mariozechner/pi-coding-agent \u5DF2\u5B89\u88C5":B(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"}},Qo=async e=>{if(e==="git")return Rl();if(e==="opencode")return Tl();if(e==="pi-runtime")return Al();let t=await Fo(e);return t||{id:e,label:Ko(e),ok:!1,detail:"\u672A\u77E5\u68C0\u67E5\u9879\u3002",autoInstallable:!1}},Ml=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"],Ol=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",Zo=(e,t)=>{let r=e.filter(o=>!o.ok),n=r.length===0;return{ok:n,target:t,items:e,missingItems:r,message:n?Ol(t):`\u8FD0\u884C\u73AF\u5883\u7F3A\u5931\uFF1A${r.map(o=>o.label).join("\u3001")}`}},_l=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(`
9
+ `);return n?`${r}
10
+ ${n}`:r},Hr=async(e="base")=>{let t=await Promise.all(Ml(e).map(r=>Qo(r)));return Zo(t,e)},Jt=(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:_l(o)}},Gr=(e,t,r)=>{console.log(`[${e}/${t}] ${r}`)},qr=(e,t)=>{console.log(` ${e} - ${t}`)},es=async(e,t)=>{if(e.ok)return Jt(e);let r=[],n=e.missingItems.length*2+1,o=1;for(let i of e.missingItems){let a=El(i.id),c=a?`\u5B89\u88C5 ${i.label}\uFF08${a.installer}\uFF09`:`\u5B89\u88C5 ${i.label}`;t?.printProgress&&Gr(o,n,c);let l=a?a.run(t):V(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&&qr(l.ok?"\u6210\u529F":l.skipped?"\u8DF3\u8FC7":"\u5931\u8D25",l.detail),o+=1;let u=await Qo(i.id);t?.printProgress&&(Gr(o,n,`\u6821\u9A8C ${i.label}`),qr(u.ok?"\u6210\u529F":"\u5931\u8D25",u.detail)),o+=1}let s=await Hr(e.target);return t?.printProgress&&(Gr(o,n,"\u6700\u7EC8\u590D\u68C0"),qr(s.ok?"\u6210\u529F":"\u5931\u8D25",s.message)),Jt(s,r)},Wl=e=>e.missingItems.map(t=>{let r=t.installCommand?`\uFF1B\u81EA\u52A8\u5B89\u88C5\uFF1A${t.installCommand}`:"";return`- ${t.label}: ${t.detail}${r}`}).join(`
11
+ `),zr=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"}`)},Dl=()=>!!(Jo.isTTY&&Vo.isTTY),Bl=e=>{let t=e.trim().toLowerCase();return t==="y"||t==="yes"||t==="\u662F"},pe=async e=>{let t=await Hr(e?.target??"base");return t.ok||!e?.autoInstall?Jt(t):es(t,e)},ts=async(e,t="base")=>{let r=await Hr(t),n=Jt(r);if(r.ok)return{status:"ready",report:n,message:n.message};if(console.log(`[worker] \u547D\u4EE4 ${e} \u8FD0\u884C\u524D\u68C0\u6D4B\u5230\u7F3A\u5931\u4F9D\u8D56\uFF1A`),console.log(Wl(r)),!Dl()){let i="\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] ${i}`),zr(r),{status:"non_interactive_blocked",report:n,message:i}}let o=Il({input:Jo,output:Vo});try{let i=await o.question("\u662F\u5426\u73B0\u5728\u81EA\u52A8\u5B89\u88C5\u7F3A\u5931\u4F9D\u8D56\uFF1F[y/N] ");if(!Bl(i)){let a="\u7528\u6237\u62D2\u7EDD\u81EA\u52A8\u5B89\u88C5\uFF0CWorker \u5DF2\u9000\u51FA\u3002";return console.error(`[worker] ${a}`),zr(r),{status:"declined",report:n,message:a}}}finally{o.close()}let s=await es(r,{interactiveAuth:!0,printProgress:!0,streamOutput:!0});return s.ok?{status:"ready",report:s,message:s.message}:(zr(Zo(s.items,t)),{status:"failed",report:s,message:s.message})};var Vt={daemonMode:"idle",paired:!1,connected:!1,runningTaskIds:[],queuedTaskIds:[]},ft=()=>({...Vt,runningTaskIds:[...Vt.runningTaskIds],queuedTaskIds:[...Vt.queuedTaskIds]}),Jr=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}))}),Ve=()=>{let e=ft();return{...e,config:e.config?Jr(e.config):void 0}},D=e=>{Object.assign(Vt,e)};import{mkdtemp as Nl,readFile as $l,rm as Ul}from"node:fs/promises";import Ll from"node:os";import Kt from"node:path";var rs=async e=>Oe({url:`${ke(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."}),ns=async e=>Oe({url:`${ke(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 os=12,ss=12,is=1500,as=e=>{let t=e?.trim();if(t)return t.length>is?`${t.slice(0,is)}\u2026`:t},jl=e=>{if(e!==void 0)try{return as(JSON.stringify(e,null,2))}catch{return}},Gl=(e,t)=>`data:${t};base64,${e.toString("base64")}`,Xt=async e=>{let{chromium:t}=await import("playwright"),r=null,n=null,o="",s,i=0,a=0,c="playwright",l=0,u=0,d=async p=>{let m=p.level??"info";(m==="error"||m==="warning")&&(a+=1),i+=1,await rs({cloudUrl:e.cloudUrl,executorToken:e.executorToken,taskId:e.taskId,workspaceId:e.workspaceId,workspaceSessionId:e.workspaceSessionId,kind:p.kind,level:m,title:p.title,detail:as(p.detail),url:p.url,attachments:p.attachments,metadata:p.metadata}).catch(()=>{})},S=async(p,m)=>{let k=Kt.join(o,`${Date.now()}-${m}.png`);await p.screenshot({path:k,fullPage:!0});let g=await $l(k),w=await ns({cloudUrl:e.cloudUrl,executorToken:e.executorToken,taskId:e.taskId,filename:Kt.basename(k),image:Gl(g,"image/png")});s=w.url,await d({kind:"screenshot",level:"info",title:`\u9875\u9762\u622A\u56FE \xB7 ${m}`,detail:`\u5F53\u524D\u9875\u9762: ${p.url()}`,url:w.url,attachments:[{id:w.id,url:w.url,filename:Kt.basename(k),contentType:"image/png"}],metadata:{label:m}})};try{o=await Nl(Kt.join(Ll.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",w=>{let v=w.type();if(v==="error"||v==="warning"){if(l>=os)return;l+=1,d({kind:"browser-console",level:v==="error"?"error":"warning",title:`Console ${v}`,detail:[w.text(),jl(w.location())].filter(Boolean).join(`
12
+ `),url:p.url()||e.appUrl,metadata:{type:v,location:w.location()}})}}),p.on("pageerror",w=>{l>=os||(l+=1,d({kind:"browser-console",level:"error",title:"\u9875\u9762\u811A\u672C\u5F02\u5E38",detail:w.message,url:p.url()||e.appUrl}))}),p.on("requestfailed",w=>{u>=ss||(u+=1,d({kind:"network",level:"error",title:`\u8BF7\u6C42\u5931\u8D25 \xB7 ${w.method()} ${w.resourceType()}`,detail:[w.url(),w.failure()?.errorText].filter(Boolean).join(`
13
+ `),url:w.url(),metadata:{method:w.method(),resourceType:w.resourceType(),failure:w.failure()}}))}),p.on("response",w=>{w.ok()||u>=ss||(u+=1,d({kind:"network",level:w.status()>=500?"error":"warning",title:`\u54CD\u5E94\u5F02\u5E38 \xB7 ${w.status()} ${w.request().method()}`,detail:[w.url(),w.statusText()].filter(Boolean).join(`
14
+ `),url:w.url(),metadata:{method:w.request().method(),status:w.status(),statusText:w.statusText()}}))}),await d({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(`
15
+ `),url:e.appUrl}),e.healthUrl?.trim()){let w=await fetch(e.healthUrl,{redirect:"follow"}).catch(v=>({ok:!1,status:0,statusText:v instanceof Error?v.message:"health request failed"}));await d({kind:"network",level:w.ok?"success":"warning",title:w.ok?"\u5065\u5EB7\u68C0\u67E5\u901A\u8FC7":"\u5065\u5EB7\u68C0\u67E5\u5F02\u5E38",detail:`${e.healthUrl}
16
+ ${w.status} ${w.statusText}`,url:e.healthUrl,metadata:{status:w.status,statusText:w.statusText}})}let m=await p.goto(e.appUrl,{waitUntil:"domcontentloaded",timeout:3e4});await p.waitForLoadState("networkidle",{timeout:1e4}).catch(()=>{}),await d({kind:"action",level:m?.ok()?"success":"warning",title:m?.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()}`,m?`HTTP ${m.status()} ${m.statusText()}`:"\u672A\u83B7\u5F97\u9996\u4E2A\u5BFC\u822A\u54CD\u5E94"].join(`
17
+ `),url:p.url()}),await S(p,"initial");let k=e.goal?.trim();k&&await d({kind:"action",level:"info",title:"\u5DF2\u8BB0\u5F55\u6D4B\u8BD5\u76EE\u6807",detail:k,url:p.url()});let g=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 d({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:[g,`\u4F7F\u7528\u6A21\u5F0F: ${c}`,`\u6700\u7EC8\u9875\u9762: ${p.url()}`,`\u89C2\u6D4B\u6570\u91CF: ${i}`].join(`
18
+ `),url:p.url(),metadata:{usedMode:c,observationsCount:i,issueCount:a,consoleCount:l,networkCount:u}}),{ok:!0,message:g,summary:g,usedMode:c,finalUrl:p.url(),screenshotUrl:s,observationsCount:i,issueCount:a,at:new Date().toISOString()}}catch(p){let m=p instanceof Error?p.message:"\u6D4F\u89C8\u5668\u5DE1\u68C0\u5931\u8D25\u3002";return await d({kind:"action",level:"error",title:"\u6D4F\u89C8\u5668\u5DE1\u68C0\u5931\u8D25",detail:m,url:e.appUrl}),{ok:!1,message:m,summary:m,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 Ul(o,{recursive:!0,force:!0}).catch(()=>{})}};var Qt=e=>{let t=process.argv.slice(3),r=t.findIndex(n=>n===e);if(!(r<0))return t[r+1]?.trim()||void 0},Yt=e=>{let t=Qt(e);if(!t)throw new Error(`\u7F3A\u5C11\u5FC5\u586B\u53C2\u6570 ${e}\u3002`);return t},cs=async()=>{let e=P(),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 Xt({cloudUrl:e.cloudUrl,executorToken:t,taskId:Yt("--task-id"),workspaceId:Yt("--workspace-id"),workspaceSessionId:Yt("--workspace-session-id"),cwd:Qt("--cwd")?.trim()||process.cwd(),appUrl:Yt("--app-url"),healthUrl:Qt("--health-url")?.trim()||void 0,goal:Qt("--goal")?.trim()||void 0,mode:"playwright"});console.log(JSON.stringify(r,null,2)),r.ok||(process.exitCode=1)};import{spawn as hh}from"node:child_process";var Vr=async e=>Oe({url:`${ke(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 ql=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():"",ls=async e=>{let t=await ql(e);return JSON.parse(t)};var zl=e=>e.readyState===WebSocket.OPEN,Kr=(e,t)=>{if(!e.executorToken)throw new Error("Worker is not paired yet.");let r=`${wo(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 ls(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(!zl(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}}}};import{mkdirSync as Fl}from"node:fs";import ht from"node:path";var Zt=e=>{let t={root:e,reposDir:ht.join(e,"repos"),worktreesDir:ht.join(e,"worktrees"),artifactsDir:ht.join(e,"artifacts"),cacheDir:ht.join(e,"cache")};for(let r of Object.values(t))Fl(r,{recursive:!0});return t},us=(e,t,r)=>ht.join(e,"worktrees",r?.trim()||t);import{existsSync as Lu,readFileSync as ju}from"node:fs";import Gu from"node:http";import un from"node:path";import{closeSync as Hl,existsSync as tr,openSync as Jl,readFileSync as kt,readSync as Vl,readdirSync as Kl,statSync as Xl}from"node:fs";import Yl from"node:os";import _ from"node:path";var Ne=Yl.homedir(),Ql=48*1024,Zl=2e4,ds=_.join(Ne,".claude","projects"),er=_.join(Ne,".local","share","opencode","storage","message"),eu=_.join(Ne,".local","share","opencode","storage","part"),ps=_.join(Ne,".codex","sessions"),tu=_.join(Ne,".pi","agent"),ru=()=>({claude:0,opencode:0,codex:0,pi:0}),N=e=>!!e&&typeof e=="object"&&!Array.isArray(e),rr=e=>{try{return Kl(e,{withFileTypes:!0})}catch{return[]}},Ke=e=>{try{return Xl(e)}catch{return null}},gs=(e,t=Ql)=>{let r=Jl(e,"r"),n=Buffer.alloc(t);try{let o=Vl(r,n,0,t,0);return n.subarray(0,o).toString("utf8")}finally{Hl(r)}},Yr=e=>{try{return JSON.parse(kt(e,"utf8"))}catch{return null}},ms=e=>{let t=e.trim();return t?t==="~"?Ne:t.startsWith("~/")?_.join(Ne,t.slice(2)):t:""},nu=()=>{let e=P().piAgentDir?.trim();return _.resolve(ms(e||process.env.PI_AGENT_DIR?.trim()||tu))},fs=()=>{let e=nu(),t=Yr(_.join(e,"settings.json")),r=typeof t?.sessionDir=="string"?ms(t.sessionDir):"",n=r?_.isAbsolute(r)?_.resolve(r):_.resolve(e,r):_.join(e,"sessions");return Array.from(new Set([n,_.join(e,"sessions"),_.join(e,"sessions-vibemux")]))},Xe=e=>e.split(`
19
+ `).map(t=>t.trim()).filter(Boolean).flatMap(t=>{try{return[JSON.parse(t)]}catch{return[]}}),Ye=(e,t)=>{if(!tr(e))return[];let r=[],n=[e];for(;n.length>0;){let o=n.pop();if(o)for(let s of rr(o)){let i=_.join(o,s.name);if(s.isDirectory()){n.push(i);continue}s.isFile()&&i.endsWith(t)&&r.push(i)}}return r},z=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()}},Qr=(e,t=240)=>{let r=e.replace(/\s+/g," ").trim();return r?r.length<=t?r:`${r.slice(0,t-1)}\u2026`:""},K=(e,t=Zl)=>{let r=e.trim();return r?r.length<=t?r:`${r.slice(0,t)}
20
+
21
+ \u2026\uFF08\u5185\u5BB9\u8FC7\u957F\uFF0C\u5DF2\u6309\u5B89\u5168\u4E0A\u9650\u622A\u65AD\uFF09`:""},Zr=e=>typeof e=="string"?e.trim():Array.isArray(e)?e.flatMap(t=>typeof t=="string"?[t]:N(t)?typeof t.text=="string"?[t.text]:typeof t.content=="string"?[t.content]:[]:[]).join(`
22
+
23
+ `).trim():"",$e=e=>e.includes("# AGENTS.md instructions")||e.includes("<environment_context>")||e.includes("<INSTRUCTIONS>")||e.includes("<local-command-caveat>")||e.includes("<local-command-stdout>"),Qe=e=>({...e,title:Qr(e.title||"\u672A\u547D\u540D\u4F1A\u8BDD",96),cwd:e.cwd||"\u2014"}),ou=()=>Ye(ds,".jsonl").flatMap(e=>{let t=Ke(e);if(!t)return[];let r=Xe(gs(e)),n=_.basename(e,".jsonl"),o=r.map(a=>z(a.timestamp)).find(Boolean),s=r.map(a=>typeof a.cwd=="string"?a.cwd:"").find(Boolean)||"",i=r.flatMap(a=>{let c=N(a.message)?a.message:null;if(!c||c.role!=="user")return[];let l=Zr(c.content);return!l||$e(l)?[]:[l]}).find(Boolean)||"Claude Code \u4F1A\u8BDD";return[Qe({id:n,source:"claude",title:i,cwd:s,startedAt:o,lastUpdatedAt:t.mtime.toISOString(),entryCount:0})]}),su=e=>{let t=N(e.message)?e.message:null;if(!t||e.isMeta===!0)return[];let r=z(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=Zr(o);return!s||$e(s)?[]:[{id:`${String(e.uuid||e.sessionId||r||Math.random())}`,role:n==="user"?"user":"system",text:K(s),timestamp:r}]}return n!=="assistant"||!Array.isArray(o)?[]:o.flatMap((s,i)=>N(s)?typeof s.text=="string"&&s.type==="text"?[{id:`${String(e.uuid||e.sessionId||r||i)}-${i}`,role:"assistant",text:K(s.text),timestamp:r}]:s.type==="tool_use"&&typeof s.name=="string"?[{id:`${String(e.uuid||e.sessionId||r||i)}-${i}`,role:"tool",text:K(`\u8C03\u7528\u5DE5\u5177\uFF1A${s.name}`),timestamp:r}]:[]:[])},iu=e=>{let r=Ye(ds,".jsonl").filter(l=>_.basename(l,".jsonl")===e)[0];if(!r)return null;let n=Xe(kt(r,"utf8")),o=Ke(r),s=n.map(l=>typeof l.cwd=="string"?l.cwd:"").find(Boolean)||"",i=n.flatMap(l=>{let u=N(l.message)?l.message:null;if(!u||u.role!=="user")return[];let d=Zr(u.content);return!d||$e(d)?[]:[d]}).find(Boolean)||"Claude Code \u4F1A\u8BDD",a=n.map(l=>z(l.timestamp)).find(Boolean),c=n.flatMap(su);return{...Qe({id:e,source:"claude",title:i,cwd:s,startedAt:a,lastUpdatedAt:o?.mtime.toISOString()||new Date().toISOString(),entryCount:c.length}),entries:c}},au=()=>Ye(ps,".jsonl").flatMap(e=>{let t=Ke(e);if(!t)return[];let r=Xe(gs(e)),n=r.find(c=>c.type==="session_meta"),o=N(n?.payload)?n.payload:null,s=typeof o?.cwd=="string"?o.cwd:"",i=z(o?.timestamp)||r.map(c=>z(c.timestamp)).find(Boolean),a=r.flatMap(c=>hs(c,!0)).map(c=>c.text).find(c=>!$e(c))||"Codex \u4F1A\u8BDD";return[Qe({id:_.basename(e,".jsonl"),source:"codex",title:a,cwd:s,startedAt:i,lastUpdatedAt:t.mtime.toISOString(),entryCount:0})]}),hs=(e,t=!1)=>{if(e.type!=="response_item")return[];let r=N(e.payload)?e.payload:null;if(!r)return[];let n=z(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=>N(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(`
24
+
25
+ `).trim():"";return a?t&&i!=="user"?[]:[{id:`${String(e.timestamp||Math.random())}-${i}`,role:i,text:K(a),timestamp:n}]:[]}if(t||r.type!=="function_call")return[];let o=typeof r.name=="string"?r.name:"tool",s=Qr(typeof r.arguments=="string"?r.arguments:"");return[{id:`${String(e.timestamp||Math.random())}-tool`,role:"tool",text:K(s?`\u8C03\u7528 ${o}
26
+ ${s}`:`\u8C03\u7528 ${o}`),timestamp:n}]},cu=e=>{let r=Ye(ps,".jsonl").filter(d=>_.basename(d,".jsonl")===e)[0];if(!r)return null;let n=Xe(kt(r,"utf8")),o=Ke(r),s=n.find(d=>d.type==="session_meta"),i=N(s?.payload)?s.payload:null,a=typeof i?.cwd=="string"?i.cwd:"",c=z(i?.timestamp)||n.map(d=>z(d.timestamp)).find(Boolean),l=n.flatMap(d=>hs(d)),u=l.find(d=>d.role==="user"&&!$e(d.text))?.text||"Codex \u4F1A\u8BDD";return{...Qe({id:e,source:"codex",title:u,cwd:a,startedAt:c,lastUpdatedAt:o?.mtime.toISOString()||new Date().toISOString(),entryCount:l.length}),entries:l}},lu=e=>{let t=_.join(eu,e);return rr(t).filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>Yr(_.join(t,r.name))).filter(r=>!!r).sort((r,n)=>{let o=N(r.time)&&typeof r.time.start=="number"?r.time.start:0,s=N(n.time)&&typeof n.time.start=="number"?n.time.start:0;return o-s})},ks=e=>{let t=lu(String(e.id)).flatMap(n=>n.type==="text"&&typeof n.text=="string"?[n.text.trim()]:[]).filter(Boolean).join(`
27
+
28
+ `);if(t)return t;let r=N(e.summary)?e.summary:null;return typeof r?.title=="string"?r.title.replace(/^Title:\s*/i,"").trim():""},Xr=e=>typeof e=="string"?e.trim():Array.isArray(e)?e.flatMap(t=>N(t)?t.type==="text"&&typeof t.text=="string"?[t.text]:typeof t.text=="string"?[t.text]:[]:[]).join(`
29
+
30
+ `).trim():"",ys=e=>{if(e.type!=="message")return[];let t=N(e.message)?e.message:null;if(!t)return[];let r=typeof t.role=="string"?t.role:"system",n=z(e.timestamp)||z(t.timestamp),o=typeof e.id=="string"?e.id:String(e.timestamp||Math.random());if(r==="user"){let s=Xr(t.content);return!s||$e(s)?[]:[{id:o,role:"user",text:K(s),timestamp:n}]}if(r==="assistant"){let s=Array.isArray(t.content)?t.content:[],i=s.flatMap(c=>N(c)?c.type==="text"&&typeof c.text=="string"?[c.text]:[]:[]).join(`
31
+
32
+ `).trim(),a=s.flatMap((c,l)=>{if(!N(c)||c.type!=="toolCall"||typeof c.name!="string")return[];let u=Qr(JSON.stringify(c.arguments??{},null,2),600);return[{id:`${o}-tool-${l}`,role:"tool",text:K(u&&u!=="{}"?`\u8C03\u7528\u5DE5\u5177\uFF1A${c.name}
33
+ ${u}`:`\u8C03\u7528\u5DE5\u5177\uFF1A${c.name}`),timestamp:n}]});return[...i?[{id:`${o}-assistant`,role:"assistant",text:K(i),timestamp:n}]:[],...a]}if(r==="toolResult"){let s=typeof t.toolName=="string"?t.toolName:"tool",i=Xr(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:K(i?`${a}
34
+ ${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:K(i?`${a}
35
+ ${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:K(s),timestamp:n}]:[]}if(r==="custom"){let s=Xr(t.content);return s?[{id:`${o}-custom`,role:"system",text:K(s),timestamp:n}]:[]}return[]},ws=e=>{let t=Ke(e);if(!t)return null;let r=Xe(kt(e,"utf8")),n=r.find(c=>c.type==="session"),o=typeof n?.cwd=="string"?n.cwd:"",s=z(n?.timestamp)||r.map(c=>z(c.timestamp)).find(Boolean),i=r.flatMap(ys),a=i.find(c=>c.role==="user"&&!$e(c.text))?.text||"Pi \u4F1A\u8BDD";return Qe({id:_.basename(e,".jsonl"),source:"pi",title:a,cwd:o,startedAt:s,lastUpdatedAt:t.mtime.toISOString(),entryCount:i.length})},Ss=e=>{let t=_.join(er,e);return rr(t).filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>Yr(_.join(t,r.name))).filter(r=>!!r).sort((r,n)=>{let o=N(r.time)&&typeof r.time.created=="number"?r.time.created:0,s=N(n.time)&&typeof n.time.created=="number"?n.time.created:0;return o-s})},xs=e=>{let t=_.join(er,e),r=Ke(t),n=Ss(e);if(n.length===0)return null;let o=n.flatMap(c=>{let l=N(c.path)?c.path:null;return typeof l?.cwd=="string"?[l.cwd]:[]}).find(Boolean)||"",s=n.map(c=>z(N(c.time)?c.time.created:void 0)).find(Boolean),i=n.map(c=>{let l=N(c.time)?c.time:null;return z(l?.completed)||z(l?.created)}).filter(Boolean).pop()||r?.mtime.toISOString()||new Date().toISOString(),a=n.filter(c=>c.role==="user").map(ks).find(Boolean)||"OpenCode \u4F1A\u8BDD";return Qe({id:e,source:"opencode",title:a,cwd:o,startedAt:s,lastUpdatedAt:i,entryCount:n.length})},uu=()=>tr(er)?rr(er).filter(e=>e.isDirectory()).flatMap(e=>{let t=xs(e.name);return t?[t]:[]}):[],du=()=>{let e=new Set;return fs().flatMap(r=>tr(r)?Ye(r,".jsonl"):[]).filter(r=>e.has(r)?!1:(e.add(r),!0)).flatMap(r=>{let n=ws(r);return n?[n]:[]})},pu=e=>{let t=xs(e);if(!t)return null;let r=Ss(e).flatMap(n=>{let o=n.role;if(o!=="user"&&o!=="assistant")return[];let s=ks(n);if(!s)return[];let i=N(n.time)?n.time:null;return[{id:String(n.id),role:o,text:K(s),timestamp:z(i?.created)}]});return{...t,entryCount:r.length,entries:r}},gu=e=>{let r=fs().flatMap(i=>tr(i)?Ye(i,".jsonl"):[]).filter(i=>_.basename(i,".jsonl")===e)[0];if(!r)return null;let n=ws(r);if(!n)return null;let s=Xe(kt(r,"utf8")).flatMap(ys);return{...n,entryCount:s.length,entries:s}},nr=()=>{let e=[...ou(),...uu(),...au(),...du()].sort((r,n)=>n.lastUpdatedAt.localeCompare(r.lastUpdatedAt)),t=e.reduce((r,n)=>(r[n.source]+=1,r),ru());return{ok:!0,sessions:e,counts:t}},or=(e,t)=>e==="claude"?iu(t):e==="opencode"?pu(t):e==="pi"?gu(t):cu(t);import{existsSync as bs,mkdirSync as Es,readdirSync as bu,renameSync as nn,rmSync as on,writeFileSync as Eu}from"node:fs";import Ru from"node:os";import Ue from"node:path";import{spawn as cn,spawnSync as Tu}from"node:child_process";import{chmodSync as Cs,mkdirSync as mu,rmSync as fu,writeFileSync as Ps}from"node:fs";import hu from"node:os";import tn from"node:path";var en=e=>e.replace(/\\/g,"\\\\").replace(/`/g,"\\`").replace(/\$/g,"\\$"),ku=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}},yu=e=>{let t=ku(e);if(!t)return null;try{return new URL(`ssh://${t}`).hostname.toLowerCase()}catch{return t.toLowerCase().replace(/:\d+$/,"")}},vs=e=>{let t=yu(e);return t?t==="github.com"||t.endsWith(".github.com")?"github":t==="gitlab.com"||t.endsWith(".gitlab.com")||t.includes("gitlab")?"gitlab":"generic":null},wu=(e,t)=>{let r=t.provider??vs(e);return r==="github"?"x-access-token":r==="gitlab"?"oauth2":t.email?.trim()||t.name?.trim()||"git"},Su=e=>{let t=vs(e);return t==="github"?"GitHub":t==="gitlab"?"GitLab":"Git"},xu=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},F=(e,t)=>{let r=e instanceof Error?e.message:typeof e=="string"?e:"";if(!xu(r))return e instanceof Error?e:new Error(r||"Git \u64CD\u4F5C\u5931\u8D25\u3002");let n=Su(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`)},Cu=(e,t,r)=>{let n=wu(r,t),o=t.credentialToken||"",s=tn.join(e,"git-askpass.js"),i=`#!/usr/bin/env node
25
36
  const prompt = (process.argv[2] || '').toLowerCase()
26
37
  if (prompt.includes('username')) {
27
- process.stdout.write(\`${wr(n)}\`)
38
+ process.stdout.write(\`${en(n)}\`)
28
39
  process.exit(0)
29
40
  }
30
41
  if (prompt.includes('password')) {
31
- process.stdout.write(\`${wr(o)}\`)
42
+ process.stdout.write(\`${en(o)}\`)
32
43
  process.exit(0)
33
44
  }
34
- process.stdout.write(\`${wr(o)}\`)
35
- `;return oo(s,i,{encoding:"utf8",mode:448}),no(s,448),s},dc=e=>`ssh -i "${e}" -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null`,uc=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"]),pc=e=>{let t=e.toUpperCase();return uc.has(t)||t.startsWith("GIT_CONFIG_KEY_")||t.startsWith("GIT_CONFIG_VALUE_")},Cr=(e=process.env)=>{let t={};for(let[r,n]of Object.entries(e))n!==void 0&&!pc(r)&&(t[r]=n);return t},de=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}:{}},io=e=>{let t=xr.join(nc.tmpdir(),"vibemux-git",e.taskId);tc(t,{recursive:!0});let r=Cr();if(r.GIT_TERMINAL_PROMPT="0",e.identity.authMode==="ssh"&&e.identity.credentialToken){let n=xr.join(t,"id_ed25519");oo(n,e.identity.credentialToken,{encoding:"utf8",mode:384}),no(n,384),r.GIT_SSH_COMMAND=dc(n)}else e.identity.credentialToken&&(r.GIT_ASKPASS=lc(t,e.identity,e.repoUrl));return{env:r,tempDir:t,cleanup(){rc(t,{recursive:!0,force:!0})}}};var kc=e=>new Promise(t=>setTimeout(t,e)),vr=!1,Pr=null,yc=()=>ao(ut())&&ao(Ue()),wc=()=>{let e=he().name?.trim()||"";return e==="vibemux-worker"||e==="vibemux-worker-preview"},xc=()=>process.platform==="win32"?"npx.cmd":"npx",Cc=()=>{let e=process.env.VIBEMUX_WORKER_RESTART_STRATEGY?.trim().toLowerCase();return e==="pm2"||e==="supervisor"?!0:!!process.env.pm_id?.trim()},Sc=(e,t)=>{let r=Cr(process.env);Ir(xc(),["-y",`${e}@${t}`,"daemon"],{detached:!0,stdio:"ignore",env:r}).unref()},bc=async e=>{for(let t=0;t<120;t+=1)try{process.kill(e,0),await kc(500)}catch{return}throw new Error(`\u7B49\u5F85\u65E7 Worker \u9000\u51FA\u8D85\u65F6: ${e}`)},vc=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=Se.join(fc.tmpdir(),"vibemux-worker-updates");co(n,{recursive:!0});let o=Se.join(n,`worker-${Date.now()}.tar.gz`);return mc(o,r),o},Pc=(e,t)=>{let r=hc("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")},Ic=e=>{Ir(Se.join(e,"bin","vibemux-worker"),["daemon"],{detached:!0,stdio:"ignore"}).unref()},Wt=async e=>{let t=e??await ye();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"}:wc()?Cc()?{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`}:(Sc(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(!yc())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 vc(t.asset.url);return Ir(process.execPath,[Ue(),"apply-update-internal",r,X(),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`}},Tr=async e=>{let t=process.env.VIBEMUX_WORKER_AUTO_UPDATE?.trim().toLowerCase();if(t==="0"||t==="false"||t==="off"||vr)return!1;vr=!0;try{let r=e??await ye();return!r.ok||!r.available||!r.latestVersion?(Pr=null,!1):Pr===r.latestVersion?!1:(Pr=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{vr=!1}},lo=async(e,t,r)=>{await bc(r);let n=Se.dirname(t),o=Se.join(n,`.vibemux-worker-stage-${Date.now()}`),s=Se.join(n,`.vibemux-worker-backup-${Date.now()}`);co(o,{recursive:!0}),Pc(e,o);let[i]=gc(o);if(!i)throw new Error("\u66F4\u65B0\u5305\u5185\u5BB9\u4E3A\u7A7A");let a=Se.join(o,i);Sr(t,s);try{Sr(a,t)}catch(l){throw Sr(s,t),l}Ic(t),br(s,{recursive:!0,force:!0}),br(o,{recursive:!0,force:!0}),br(e,{force:!0})};var Ac=e=>new URL(e.url||"/","http://127.0.0.1"),uo=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"))},D=(e,t,r)=>{e.statusCode=t,e.setHeader("Content-Type","application/json; charset=utf-8"),e.end(`${JSON.stringify(r)}
36
- `)},Mc=(e,t)=>{let r=Er.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(Ec(t))},Oc=e=>{let t=pn(),r=e==="/"?Er.join(t,"index.html"):Er.join(t,e.replace(/^\//,""));return r.startsWith(t)?r:null},Bc=(e,t)=>{let r=Oc(e);if(!r||!Tc(r)){D(t,404,{message:"not found"});return}Mc(t,r)},_c=()=>{let e=He(),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}},Wc=e=>e==="claude"||e==="opencode"||e==="codex"?e:null,$c=()=>{let e=b(),t=e.mcpServers??[],r=!!e.executorToken?.trim(),n=t.map(l=>{let c=De([l],{cloudUrl:e.cloudUrl,executorToken:e.executorToken,actingUserId:l.target===ke&&r?"__dynamic__":void 0}),u=Object.keys(c)[0],d=u?c[u]:null,w=l.target===ke;return{id:l.id,name:l.name,target:l.target,transport:l.transport,capabilityMode:l.capabilityMode,enabled:l.enabled,materialized:!!d,kind:w?"builtin":l.transport==="stdio"||l.target.startsWith("stdio://")?"stdio":l.transport==="http"||l.transport==="sse"?"remote":"custom",endpoint:typeof d?.url=="string"?d.url:void 0,command:typeof d?.command=="string"?d.command:void 0,headerKeys:d&&typeof d=="object"&&d.headers&&typeof d.headers=="object"?Object.keys(d.headers):[],actingUserScoped:w&&r}}),o=n.filter(l=>l.enabled),i=!!n.find(l=>l.target===ke)?.enabled,a=i&&r;return{configuredCount:n.length,enabledCount:o.length,materializedCount:o.filter(l=>l.materialized).length,builtinEnabled:i,builtinReady:a,actingUserMode:i?a?"request-scoped":"pairing-required":"disabled",servers:n}},Uc=(e,t)=>e.code==="EADDRINUSE"?`\u672C\u5730\u63A7\u5236\u53F0\u7AEF\u53E3 ${t} \u5DF2\u88AB\u5360\u7528\uFF0C\u8BF7\u8BBE\u7F6E VIBEMUX_WORKER_PORT \u540E\u91CD\u8BD5\u3002`:e.code==="EPERM"?`\u6CA1\u6709\u6743\u9650\u76D1\u542C\u672C\u5730\u63A7\u5236\u53F0\u7AEF\u53E3 ${t}\uFF0C\u8BF7\u6362\u4E00\u4E2A VIBEMUX_WORKER_PORT \u6216\u68C0\u67E5\u7CFB\u7EDF\u6743\u9650\u3002`:`\u672C\u5730\u63A7\u5236\u53F0\u542F\u52A8\u5931\u8D25\uFF1A${e.message||"listen failed"}`,Dc=()=>{setTimeout(()=>{try{process.kill(process.pid,"SIGTERM")}catch{process.exit(0)}},250)},Ar=()=>{let e=b(),t=Rc.createServer(async(r,n)=>{try{let o=Ac(r);if(r.method==="GET"&&(o.pathname==="/"||o.pathname.startsWith("/assets/"))){Bc(o.pathname,n);return}if(r.method==="GET"&&(o.pathname==="/health"||o.pathname==="/api/health")){D(n,200,_c());return}if(r.method==="GET"&&o.pathname==="/api/config"){D(n,200,{config:b()});return}if(r.method==="GET"&&o.pathname==="/api/status"){D(n,200,{runtime:Ee(),mcp:$c()});return}if(r.method==="GET"&&o.pathname==="/api/doctor"){D(n,200,await $t());return}if(r.method==="GET"&&o.pathname==="/api/agent-sessions"){D(n,200,to());return}if(r.method==="GET"&&o.pathname==="/api/agent-sessions/detail"){let s=Wc(o.searchParams.get("source")),i=o.searchParams.get("id")?.trim();if(!s||!i){D(n,400,{message:"source and id are required"});return}let a=ro(s,i);if(!a){D(n,404,{message:"session not found"});return}D(n,200,{session:a});return}if(r.method==="GET"&&o.pathname==="/api/update"){D(n,200,await ye());return}if(r.method==="POST"&&o.pathname==="/api/bootstrap-runtime"){let s=await ie({autoInstall:!0,target:"all"});D(n,200,{report:s,doctor:await $t()});return}if(r.method==="PUT"&&o.pathname==="/api/config"){let s=await uo(r),i={...b(),...s};Ie(i),O({config:i,paired:!!(i.executorId&&i.executorToken),executorId:i.executorId}),D(n,200,{config:i,message:"saved"});return}if(r.method==="POST"&&o.pathname==="/api/pair"){let s=await uo(r),i=b(),a=await fr({pairingCode:s.pairingCode,machineId:i.machineId,machineName:i.machineName,name:s.name?.trim()||`worker-${process.pid}`,workspaceRoot:i.workspaceRoot,maxConcurrency:i.maxConcurrency,labels:i.labels,capabilities:i.capabilities,platform:process.platform,version:Z()},i.cloudUrl),l={...i,executorName:s.name?.trim()||`worker-${process.pid}`,executorId:a.executorId,executorToken:a.executorToken};Ie(l),O({paired:!0,executorId:a.executorId,config:l,daemonMode:"starting"}),Rr(),D(n,200,{config:l,executor:a.executor,message:"Pairing complete. Connecting to the control plane."});return}if(r.method==="POST"&&o.pathname==="/api/reset"){yt(),O({daemonMode:"idle",paired:!1,connected:!1,executorId:void 0,config:b(),runningTaskIds:[],queuedTaskIds:[],lastError:void 0}),D(n,200,{config:b(),message:"reset"});return}if(r.method==="POST"&&o.pathname==="/api/disconnect"){po(),D(n,200,{runtime:Ee(),message:"Disconnected from the control plane."});return}if(r.method==="POST"&&o.pathname==="/api/connect"){Rr(),D(n,200,{runtime:Ee(),message:"Control plane connection requested."});return}if(r.method==="POST"&&o.pathname==="/api/update"){let s=await Wt();D(n,s.applied?202:200,s),s.applied&&Dc();return}D(n,404,{message:"not found"})}catch(o){D(n,500,{message:o instanceof Error?o.message:"worker local server error"})}});return t.once("error",r=>{let n=Uc(r,e.localServerPort);O({daemonMode:"disconnected",connected:!1,lastError:n}),console.error(`[worker] ${n}`),process.exitCode=1,setTimeout(()=>process.exit(1),20)}),t.listen(e.localServerPort,"127.0.0.1",()=>{console.log(`[worker] local console http://127.0.0.1:${e.localServerPort}`)}),t};import{accessSync as Nc,constants as Lc,mkdirSync as Gc}from"node:fs";var jc=e=>{try{return Gc(e,{recursive:!0}),Nc(e,Lc.W_OK),{ok:!0,detail:`\u53EF\u5199: ${e}`}}catch(t){return{ok:!1,detail:t instanceof Error?t.message:"path access failed"}}},Hc=e=>{try{return{ok:!0,detail:`\u5DF2\u5C31\u7EEA: ${Rt(e).root}`}}catch(t){return{ok:!1,detail:t instanceof Error?t.message:"workspace setup failed"}}},qc=async e=>{try{let t=await fetch(e,{method:"GET",signal:AbortSignal.timeout(5e3)});return{ok:!0,status:t.status,message:`\u63A7\u5236\u9762\u53EF\u8FBE\uFF0CHTTP ${t.status}`}}catch(t){return{ok:!1,status:void 0,message:t instanceof Error?t.message:"cloud probe failed"}}},Fc=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?`\u5B98\u7F51\u53EF\u8FBE\uFF0CHTTP ${e.status}`:`\u5B98\u7F51\u8FD4\u56DE\u5F02\u5E38\uFF0CHTTP ${e.status}`}}catch(e){return{ok:!1,status:void 0,url:"https://opencode.ai",message:e instanceof Error?e.message:"official site probe failed"}}},Jc=e=>{let t=e.filter(n=>n.ok).length,r=e.length-t;return{total:e.length,passed:t,failed:r,ok:r===0}},go=async()=>{let e=b(),[t,r,n]=await Promise.all([qc(e.cloudUrl),Fc(),ie({target:"all"})]),o=jc(we()),s=Hc(e.workspaceRoot),i=n.items.find(m=>m.id==="git")??{ok:!1,detail:"git \u72B6\u6001\u672A\u77E5"},a=n.items.find(m=>m.id==="opencode")??{ok:!1,detail:"OpenCode SDK \u72B6\u6001\u672A\u77E5"},l=n.items.find(m=>m.id==="codex-cli")??{ok:!1,detail:"Codex CLI \u72B6\u6001\u672A\u77E5"},c=n.items.find(m=>m.id==="codex-auth")??{ok:!1,detail:"Codex \u767B\u5F55\u72B6\u6001\u672A\u77E5"},u=n.items.find(m=>m.id==="claude-cli")??{ok:!1,detail:"Claude Code CLI \u72B6\u6001\u672A\u77E5"},d=n.items.find(m=>m.id==="claude-auth")??{ok:!1,detail:"Claude Code \u8BA4\u8BC1\u72B6\u6001\u672A\u77E5"},w=!!e.opencodeConfigContent?.trim(),p=!!e.codexConfigContent?.trim(),x=!!e.claudeCodeConfigContent?.trim(),h=[{id:"git",category:"tooling",label:"Git",ok:i.ok,detail:i.detail,hint:i.ok?void 0:"\u8BF7\u5148\u5B89\u88C5 git\uFF0C\u5E76\u786E\u8BA4\u5B83\u5728 PATH \u4E2D\u53EF\u6267\u884C\u3002"},{id:"opencode",category:"tooling",label:"OpenCode SDK",ok:a.ok,detail:a.detail,hint:a.ok?void 0:"\u68C0\u67E5\u4F9D\u8D56\u5B89\u88C5\u72B6\u6001\uFF0C\u786E\u8BA4 `@opencode-ai/sdk` \u53EF\u88AB\u5F53\u524D Node \u8FD0\u884C\u65F6\u52A0\u8F7D\u3002"},{id:"codex-cli",category:"tooling",label:"Codex CLI",ok:l.ok,detail:l.detail,hint:l.ok?void 0:"\u8BF7\u5148\u5B89\u88C5 Codex CLI\uFF1Bworker \u53EF\u81EA\u52A8\u6267\u884C `npm install -g @openai/codex`\u3002"},{id:"codex-auth",category:"tooling",label:"Codex \u767B\u5F55",ok:c.ok,detail:c.detail,hint:c.ok?void 0:"\u8BF7\u5148\u8FD0\u884C `codex` \u5B8C\u6210\u767B\u5F55\u540E\u518D\u91CD\u8BD5\u3002"},{id:"claude-cli",category:"tooling",label:"Claude Code CLI",ok:u.ok,detail:u.detail,hint:u.ok?void 0:"\u8BF7\u5148\u5B89\u88C5 Claude Code CLI\uFF1Bworker \u4F1A\u4F18\u5148\u5C1D\u8BD5\u5B98\u65B9\u539F\u751F\u5B89\u88C5\u65B9\u5F0F\u3002"},{id:"claude-auth",category:"tooling",label:"Claude Code \u8BA4\u8BC1",ok:d.ok,detail:d.detail,hint:d.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"},{id:"opencode-config",category:"config",label:"OpenCode \u914D\u7F6E",ok:w,detail:w?"\u5DF2\u52A0\u8F7D OpenCode providers \u914D\u7F6E\u3002":"\u672A\u68C0\u6D4B\u5230 OpenCode providers \u914D\u7F6E\u3002",hint:w?void 0:"\u53EF\u5728\u7CFB\u7EDF\u8BBE\u7F6E\u6216\u5DE5\u4F5C\u7AD9\u672C\u5730\u914D\u7F6E\u4E2D\u8865\u5145 OpenCode providers JSON\u3002"},{id:"codex-config",category:"config",label:"Codex \u914D\u7F6E",ok:p,detail:p?"\u5DF2\u52A0\u8F7D Codex config.toml\u3002":"\u672A\u68C0\u6D4B\u5230 Codex config.toml\u3002",hint:p?void 0:"\u53EF\u5728\u7CFB\u7EDF\u8BBE\u7F6E\u96C6\u4E2D\u4E0B\u53D1\uFF0C\u6216\u5728 worker \u672C\u673A\u51C6\u5907 `~/.codex/config.toml`\u3002"},{id:"claude-config",category:"config",label:"Claude Code \u914D\u7F6E",ok:x,detail:x?"\u5DF2\u52A0\u8F7D Claude Code settings.json\u3002":"\u672A\u68C0\u6D4B\u5230 Claude Code settings.json\u3002",hint:x?void 0:"\u53EF\u5728\u7CFB\u7EDF\u8BBE\u7F6E\u96C6\u4E2D\u4E0B\u53D1\uFF0C\u6216\u5728 worker \u672C\u673A\u51C6\u5907 `~/.claude/settings.json`\u3002"},{id:"worker-home",category:"filesystem",label:"Worker Home",ok:o.ok,detail:o.detail,hint:o.ok?void 0:"\u8BF7\u68C0\u67E5\u76EE\u5F55\u6743\u9650\uFF0C\u786E\u4FDD worker home \u53EF\u521B\u5EFA\u4E14\u53EF\u5199\u3002"},{id:"workspace",category:"filesystem",label:"Workspace",ok:s.ok,detail:s.detail,hint:s.ok?void 0:"\u8BF7\u786E\u8BA4 workspace root \u8DEF\u5F84\u6709\u6548\uFF0C\u5E76\u5141\u8BB8\u5F53\u524D\u7528\u6237\u5199\u5165\u3002"},{id:"machine-id",category:"config",label:"Machine ID",ok:!!e.machineId,detail:e.machineId?`\u5DF2\u914D\u7F6E: ${e.machineId}`:"\u672A\u914D\u7F6E machineId",hint:e.machineId?void 0:"\u91CD\u7F6E\u672C\u5730\u914D\u7F6E\u540E\u91CD\u65B0\u542F\u52A8 worker\uFF0C\u53EF\u81EA\u52A8\u751F\u6210 machineId\u3002"},{id:"pairing",category:"config",label:"Pairing",ok:!!(e.executorId&&e.executorToken),detail:e.executorId?`\u5DF2\u914D\u5BF9: ${e.executorId}`:"\u672A\u5B8C\u6210 pairing",hint:e.executorId?void 0:"\u5728\u5DE5\u4F5C\u7AD9\u63A7\u5236\u53F0\u4E2D\u8F93\u5165 pairing code \u5B8C\u6210\u914D\u5BF9\u3002"},{id:"cloud-url",category:"network",label:"Control Plane URL",ok:!!e.cloudUrl?.trim(),detail:e.cloudUrl?.trim()||"\u672A\u914D\u7F6E cloudUrl",hint:e.cloudUrl?.trim()?void 0:"\u8BF7\u5148\u586B\u5199\u63A7\u5236\u9762\u7684 Cloud URL\u3002"},{id:"cloud-reachable",category:"network",label:"Control Plane Reachability",ok:t.ok,detail:t.message,hint:t.ok?void 0:"\u8BF7\u786E\u8BA4\u63A7\u5236\u9762\u670D\u52A1\u5DF2\u542F\u52A8\uFF0C\u4E14\u5F53\u524D\u673A\u5668\u53EF\u4EE5\u8BBF\u95EE\u8BE5\u5730\u5740\u3002"},{id:"official-site",category:"network",label:"OpenCode \u5B98\u7F51",ok:r.ok,detail:r.message,hint:r.ok?void 0:"\u5982\u679C\u5B98\u7F51\u4E0D\u53EF\u8FBE\uFF0C\u901A\u5E38\u610F\u5473\u7740\u5F53\u524D\u7F51\u7EDC\u5B58\u5728\u5916\u7F51\u8BBF\u95EE\u9650\u5236\u3002"}];return{config:gr(e),checks:{git:i.ok,opencodeAvailable:a.ok,codexCliAvailable:l.ok,codexAuthenticated:c.ok,claudeCliAvailable:u.ok,claudeAuthenticated:d.ok,opencodeConfigLoaded:w,codexConfigLoaded:p,claudeConfigLoaded:x,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:h,summary:Jc(h),cloudProbe:t,officialSiteProbe:r,runtime:Ee()}},Mr=async()=>{console.log(JSON.stringify(await go(),null,2))},$t=()=>go();import{existsSync as zc,statfsSync as Vc}from"node:fs";import Y from"node:os";import mo from"node:path";var fo=null,ho=(e,t=1)=>{let r=10**t;return Math.round(e*r)/r},Kc=()=>Y.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}),Xc=()=>{let e=Y.cpus(),t=Kc(),r=fo;fo=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 ho((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:Y.loadavg().map(s=>ho(s,2)),usagePercent:o}},Yc=()=>{let e=Y.totalmem(),t=Y.freemem();return{totalBytes:e,freeBytes:t,usedBytes:Math.max(0,e-t)}},Qc=e=>{let t=mo.resolve(e||process.cwd());for(;!zc(t);){let r=mo.dirname(t);if(r===t)return process.cwd();t=r}return t},Zc=e=>{try{let t=Qc(e),r=Vc(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,l=Math.max(0,s*n),c=Math.max(0,i*n);return{path:t,totalBytes:a,freeBytes:l,availableBytes:c,usedBytes:Math.max(0,a-l)}}catch{return}},el=e=>({platform:process.platform,arch:Y.arch(),hostname:Y.hostname(),release:Y.release(),version:typeof Y.version=="function"?Y.version():void 0,nodeVersion:process.version,workerVersion:e,systemUptimeSec:Math.max(0,Math.round(Y.uptime())),processUptimeSec:Math.max(0,Math.round(process.uptime()))}),Ut=e=>({capturedAt:new Date().toISOString(),cpu:Xc(),memory:Yc(),disk:Zc(e.workspaceRoot),system:el(e.workerVersion)});import tl from"node:net";import{createOpencode as rl,createOpencodeClient as vo}from"@opencode-ai/sdk";var L=(e,t)=>{console.log(`[worker-opencode] ${e}`,JSON.stringify(t))},Q=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"},ko=e=>{if(!e)return;let[t,...r]=e.split("/"),n=r.join("/");if(!(!t||!n))return{providerID:t,modelID:n}},Ve=e=>Array.isArray(e)?e:[],Dt=e=>e.filter(t=>t.type==="text").map(t=>t.text?.trim()??"").filter(Boolean).join(`
45
+ process.stdout.write(\`${en(o)}\`)
46
+ `;return Ps(s,i,{encoding:"utf8",mode:448}),Cs(s,448),s},Pu=e=>`ssh -i "${e}" -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null`,vu=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"]),Iu=e=>{let t=e.toUpperCase();return vu.has(t)||t.startsWith("GIT_CONFIG_KEY_")||t.startsWith("GIT_CONFIG_VALUE_")},rn=(e=process.env)=>{let t={};for(let[r,n]of Object.entries(e))n!==void 0&&!Iu(r)&&(t[r]=n);return t},Ce=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}:{}},Is=e=>{let t=tn.join(hu.tmpdir(),"vibemux-git",e.taskId);mu(t,{recursive:!0});let r=rn();if(r.GIT_TERMINAL_PROMPT="0",e.identity.authMode==="ssh"&&e.identity.credentialToken){let n=tn.join(t,"id_ed25519");Ps(n,e.identity.credentialToken,{encoding:"utf8",mode:384}),Cs(n,384),r.GIT_SSH_COMMAND=Pu(n)}else e.identity.credentialToken&&(r.GIT_ASKPASS=Cu(t,e.identity,e.repoUrl));return{env:r,tempDir:t,cleanup(){fu(t,{recursive:!0,force:!0})}}};var Au=e=>new Promise(t=>setTimeout(t,e)),sn=!1,an=null,Mu=()=>bs(Bt())&&bs(pt()),Ou=()=>{let e=_e().name?.trim()||"";return e==="vibemux-worker"||e==="vibemux-worker-preview"},_u=()=>process.platform==="win32"?"npx.cmd":"npx",Wu=()=>{let e=process.env.VIBEMUX_WORKER_RESTART_STRATEGY?.trim().toLowerCase();return e==="pm2"||e==="supervisor"?!0:!!process.env.pm_id?.trim()},Du=(e,t)=>{let r=rn(process.env);cn(_u(),["-y",`${e}@${t}`,"daemon"],{detached:!0,stdio:"ignore",env:r}).unref()},Bu=async e=>{for(let t=0;t<120;t+=1)try{process.kill(e,0),await Au(500)}catch{return}throw new Error(`\u7B49\u5F85\u65E7 Worker \u9000\u51FA\u8D85\u65F6: ${e}`)},Nu=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=Ue.join(Ru.tmpdir(),"vibemux-worker-updates");Es(n,{recursive:!0});let o=Ue.join(n,`worker-${Date.now()}.tar.gz`);return Eu(o,r),o},$u=(e,t)=>{let r=Tu("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")},Uu=e=>{cn(Ue.join(e,"bin","vibemux-worker"),["daemon"],{detached:!0,stdio:"ignore"}).unref()},sr=async e=>{let t=e??await Be();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"}:Ou()?Wu()?{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`}:(Du(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(!Mu())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 Nu(t.asset.url);return cn(process.execPath,[pt(),"apply-update-internal",r,Z(),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`}},ln=async e=>{let t=process.env.VIBEMUX_WORKER_AUTO_UPDATE?.trim().toLowerCase();if(t==="0"||t==="false"||t==="off"||sn)return!1;sn=!0;try{let r=e??await Be();return!r.ok||!r.available||!r.latestVersion?(an=null,!1):an===r.latestVersion?!1:(an=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{sn=!1}},Rs=async(e,t,r)=>{await Bu(r);let n=Ue.dirname(t),o=Ue.join(n,`.vibemux-worker-stage-${Date.now()}`),s=Ue.join(n,`.vibemux-worker-backup-${Date.now()}`);Es(o,{recursive:!0}),$u(e,o);let[i]=bu(o);if(!i)throw new Error("\u66F4\u65B0\u5305\u5185\u5BB9\u4E3A\u7A7A");let a=Ue.join(o,i);nn(t,s);try{nn(a,t)}catch(c){throw nn(s,t),c}Uu(t),on(s,{recursive:!0,force:!0}),on(o,{recursive:!0,force:!0}),on(e,{force:!0})};var qu=e=>new URL(e.url||"/","http://127.0.0.1"),Ts=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"))},j=(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)}
47
+ `)},zu=(e,t)=>{let r=un.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(ju(t))},Fu=e=>{let t=Po(),r=e==="/"?un.join(t,"index.html"):un.join(t,e.replace(/^\//,""));return r.startsWith(t)?r:null},Hu=(e,t)=>{let r=Fu(e);if(!r||!Lu(r)){j(t,404,{message:"not found"});return}zu(t,r)},Ju=()=>{let e=ft(),t=P();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}},Vu=e=>e==="claude"||e==="opencode"||e==="codex"||e==="pi"?e:null,Ku=()=>{let e=P(),t=e.mcpServers??[],r=!!e.executorToken?.trim(),n=t.map(c=>{let l=De([c],{cloudUrl:e.cloudUrl,executorToken:e.executorToken,actingUserId:c.target===We&&r?"__dynamic__":void 0}),u=Object.keys(l)[0],d=u?l[u]:null,S=c.target===We;return{id:c.id,name:c.name,target:c.target,transport:c.transport,capabilityMode:c.capabilityMode,enabled:c.enabled,materialized:!!d,kind:S?"builtin":c.transport==="stdio"||c.target.startsWith("stdio://")?"stdio":c.transport==="http"||c.transport==="sse"?"remote":"custom",endpoint:typeof d?.url=="string"?d.url:void 0,command:typeof d?.command=="string"?d.command:void 0,headerKeys:d&&typeof d=="object"&&d.headers&&typeof d.headers=="object"?Object.keys(d.headers):[],actingUserScoped:S&&r}}),o=n.filter(c=>c.enabled),i=!!n.find(c=>c.target===We)?.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}},Xu=(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"}`,Yu=()=>{setTimeout(()=>{try{process.kill(process.pid,"SIGTERM")}catch{process.exit(0)}},250)},pn=()=>{let e=P(),t=Gu.createServer(async(r,n)=>{try{let o=qu(r);if(r.method==="GET"&&(o.pathname==="/"||o.pathname.startsWith("/assets/"))){Hu(o.pathname,n);return}if(r.method==="GET"&&(o.pathname==="/health"||o.pathname==="/api/health")){j(n,200,Ju());return}if(r.method==="GET"&&o.pathname==="/api/config"){j(n,200,{config:P()});return}if(r.method==="GET"&&o.pathname==="/api/status"){j(n,200,{runtime:Ve(),mcp:Ku()});return}if(r.method==="GET"&&o.pathname==="/api/doctor"){j(n,200,await Ze());return}if(r.method==="GET"&&o.pathname==="/api/agent-sessions"){j(n,200,nr());return}if(r.method==="GET"&&o.pathname==="/api/agent-sessions/detail"){let s=Vu(o.searchParams.get("source")),i=o.searchParams.get("id")?.trim();if(!s||!i){j(n,400,{message:"source and id are required"});return}let a=or(s,i);if(!a){j(n,404,{message:"session not found"});return}j(n,200,{session:a});return}if(r.method==="GET"&&o.pathname==="/api/update"){j(n,200,await Be());return}if(r.method==="POST"&&o.pathname==="/api/bootstrap-runtime"){let s=await pe({autoInstall:!0,target:"all"});j(n,200,{report:s,doctor:await Ze()});return}if(r.method==="PUT"&&o.pathname==="/api/config"){let s=await Ts(r),i={...P(),...s};Se(i),D({config:i,paired:!!(i.executorId&&i.executorToken),executorId:i.executorId}),j(n,200,{config:i,message:"saved"});return}if(r.method==="POST"&&o.pathname==="/api/pair"){let s=await Ts(r),i=P(),a;try{a=await dt({pairingCode:s.pairingCode,machineId:i.machineId,machineName:i.machineName,name:s.name?.trim()||`worker-${process.pid}`,workspaceRoot:i.workspaceRoot,maxConcurrency:i.maxConcurrency,labels:i.labels,capabilities:i.capabilities,platform:process.platform,version:X()},i.cloudUrl)}catch(l){let u=l instanceof Error?l.message:"Pair request failed.";j(n,400,{message:Dt(u,!!(i.executorId&&i.executorToken))});return}let c={...i,executorName:s.name?.trim()||`worker-${process.pid}`,executorId:a.executorId,executorToken:a.executorToken};Se(c),D({paired:!0,executorId:a.executorId,config:c,daemonMode:"starting"}),dn(),j(n,200,{config:c,executor:a.executor,message:"Pairing complete. Connecting to the control plane."});return}if(r.method==="POST"&&o.pathname==="/api/reset"){Gt(),D({daemonMode:"idle",paired:!1,connected:!1,executorId:void 0,config:P(),runningTaskIds:[],queuedTaskIds:[],lastError:void 0}),j(n,200,{config:P(),message:"reset"});return}if(r.method==="POST"&&o.pathname==="/api/disconnect"){As(),j(n,200,{runtime:Ve(),message:"Disconnected from the control plane."});return}if(r.method==="POST"&&o.pathname==="/api/connect"){dn(),j(n,200,{runtime:Ve(),message:"Control plane connection requested."});return}if(r.method==="POST"&&o.pathname==="/api/update"){let s=await sr();j(n,s.applied?202:200,s),s.applied&&Yu();return}j(n,404,{message:"not found"})}catch(o){j(n,500,{message:o instanceof Error?o.message:"worker local server error"})}});return t.once("error",r=>{let n=Xu(r,e.localServerPort);D({daemonMode:"disconnected",connected:!1,lastError:n}),console.error(`[worker] ${n}`),process.exitCode=1,setTimeout(()=>process.exit(1),20)}),t.listen(e.localServerPort,"127.0.0.1",()=>{console.log(`[worker] local console http://127.0.0.1:${e.localServerPort}`)}),t};import{accessSync as Qu,constants as Zu,mkdirSync as ed}from"node:fs";var td=()=>ye()==="preview"?"vibemux-worker-preview":"vibemux-worker",rd=e=>{try{return ed(e,{recursive:!0}),Qu(e,Zu.W_OK),{ok:!0,detail:`Writable: ${e}`}}catch(t){return{ok:!1,detail:t instanceof Error?t.message:"path access failed"}}},nd=e=>{try{return{ok:!0,detail:`Ready: ${Zt(e).root}`}}catch(t){return{ok:!1,detail:t instanceof Error?t.message:"workspace setup failed"}}},od=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"}}},sd=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"}}},id=e=>{let t=e.filter(n=>n.ok).length,r=e.length-t;return{total:e.length,passed:t,failed:r,ok:r===0}},Ms=async()=>{let e=P(),[t,r,n]=await Promise.all([od(e.cloudUrl),sd(),pe({target:"all"})]),o=rd(ne()),s=nd(e.workspaceRoot),i=n.items.find(g=>g.id==="git")??{ok:!1,detail:"Git status is unknown."},a=n.items.find(g=>g.id==="opencode")??{ok:!1,detail:"OpenCode SDK status is unknown."},c=n.items.find(g=>g.id==="codex-cli")??{ok:!1,detail:"Codex CLI status is unknown."},l=n.items.find(g=>g.id==="codex-auth")??{ok:!1,detail:"Codex sign-in status is unknown."},u=n.items.find(g=>g.id==="claude-cli")??{ok:!1,detail:"Claude Code CLI status is unknown."},d=n.items.find(g=>g.id==="claude-auth")??{ok:!1,detail:"Claude Code authentication status is unknown."},S=!!e.opencodeConfigContent?.trim(),p=!!e.codexConfigContent?.trim(),m=!!e.claudeCodeConfigContent?.trim(),k=[{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 SDK",ok:a.ok,detail:a.detail,hint:a.ok?void 0:"Check the dependency installation and confirm `@opencode-ai/sdk` can be loaded by the current Node runtime."},{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:u.ok,detail:u.detail,hint:u.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:d.ok,detail:d.detail,hint:d.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:S,detail:S?"Loaded the OpenCode providers configuration.":"OpenCode providers configuration was not found.",hint:S?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:m,detail:m?"Loaded `Claude Code settings.json`.":"`Claude Code settings.json` was not found.",hint:m?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 ${td()} 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:Jr(e),checks:{git:i.ok,opencodeAvailable:a.ok,codexCliAvailable:c.ok,codexAuthenticated:l.ok,claudeCliAvailable:u.ok,claudeAuthenticated:d.ok,opencodeConfigLoaded:S,codexConfigLoaded:p,claudeConfigLoaded:m,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:k,summary:id(k),cloudProbe:t,officialSiteProbe:r,runtime:Ve()}},gn=async()=>{console.log(JSON.stringify(await Ms(),null,2))},Ze=()=>Ms();import{existsSync as ad,statfsSync as cd}from"node:fs";import te from"node:os";import Os from"node:path";var _s=null,Ws=(e,t=1)=>{let r=10**t;return Math.round(e*r)/r},ld=()=>te.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}),ud=()=>{let e=te.cpus(),t=ld(),r=_s;_s=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 Ws((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:te.loadavg().map(s=>Ws(s,2)),usagePercent:o}},dd=()=>{let e=te.totalmem(),t=te.freemem();return{totalBytes:e,freeBytes:t,usedBytes:Math.max(0,e-t)}},pd=e=>{let t=Os.resolve(e||process.cwd());for(;!ad(t);){let r=Os.dirname(t);if(r===t)return process.cwd();t=r}return t},gd=e=>{try{let t=pd(e),r=cd(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}},md=e=>({platform:process.platform,arch:te.arch(),hostname:te.hostname(),release:te.release(),version:typeof te.version=="function"?te.version():void 0,nodeVersion:process.version,workerVersion:e,systemUptimeSec:Math.max(0,Math.round(te.uptime())),processUptimeSec:Math.max(0,Math.round(process.uptime()))}),ir=e=>({capturedAt:new Date().toISOString(),cpu:ud(),memory:dd(),disk:gd(e.workspaceRoot),system:md(e.workerVersion)});import fd from"node:net";import{createOpencode as hd,createOpencodeClient as Gs}from"@opencode-ai/sdk";var q=(e,t)=>{console.log(`[worker-opencode] ${e}`,JSON.stringify(t))},re=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"},Ds=e=>{if(!e)return;let[t,...r]=e.split("/"),n=r.join("/");if(!(!t||!n))return{providerID:t,modelID:n}},yt=e=>Array.isArray(e)?e:[],ar=e=>e.filter(t=>t.type==="text").map(t=>t.text?.trim()??"").filter(Boolean).join(`
37
48
 
38
- `),yo=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:Ve(t.parts).map(r=>r.type),textPreview:Dt(Ve(t.parts)).slice(0,160)})),wo=(e,t)=>{let r=t?e.find(s=>s.info?.id===t):void 0,n=Dt(Ve(r?.parts));if(n)return n;let o=[...e].filter(s=>s.info?.role==="assistant").sort((s,i)=>(i.info?.time?.created??0)-(s.info?.time?.created??0)).find(s=>Dt(Ve(s.parts)));return o?Dt(Ve(o.parts)):""},Or=e=>!!e?.info?.time?.completed||!!e?.info?.error,xo=e=>[...e.values()].join("").trim(),Co=(e,t)=>{let r=e.get(t);if(r)return r;let n=new Map;return e.set(t,n),n},So=async e=>new Promise(t=>setTimeout(t,e)),Br=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 Br(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}}},bo=e=>e&&"permissionPolicy"in e?e:void 0;var _r=new Map,nl=async()=>new Promise((e,t)=>{let r=tl.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)})})}),ol=async e=>{let t=await nl();return(await rl({port:t,timeout:15e3,config:ee(e)})).server},Po=async e=>{let t=e?.trim()||"{}",r=_r.get(t);if(r)return r;let n=ol(e).catch(o=>{throw _r.delete(t),o});return _r.set(t,n),n},Io=async(e,t)=>{let r=await Po(t);return vo({baseUrl:r.url,directory:e})},To=async e=>{let t=await Po(e);return vo({baseUrl:t.url})},Eo=async(e,t,r)=>{L("session:create:start",{cwd:t,title:r});let n;try{n=await e.session.create({body:{title:r},query:{directory:t}})}catch(o){throw L("session:create:error",{cwd:t,title:r,error:Q(o)}),o}if(L("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=Q(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};var sl=(e,t,r)=>({id:`${e}/${t}`,label:`${e}/${t}`,providerId:e,modelId:t,isDefault:r===`${e}/${t}`}),il=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),al=(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?il(s.models).map(a=>sl(i,a,t)):[]}).sort((s,i)=>s.isDefault?-1:i.isDefault?1:s.label.localeCompare(i.label))},Wr=async()=>{let e=b(),t=Te(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 To(t)).config.providers(),s="data"in o?o.data:o,i=Object.entries(s?.default??{}).find(([,l])=>!!l),a=i?`${i[0]}/${i[1]}`:r;return{models:al(s,a),defaultModel:a,message:void 0}}catch(n){return L("models:error",{error:Q(n)}),{models:[],defaultModel:r,message:Q(n)}}};import{existsSync as cl}from"node:fs";var ll=async(e,t,r)=>{try{let n=await e.session.messages({path:{id:r},query:{directory:t,limit:20}});return yo(Array.isArray(n.data)?n.data:[])}catch(n){return[{snapshotError:Q(n)}]}},dl=e=>{let r={...ee(e.baseConfigContent)},n=e.agent?.trim()||void 0,o=Br(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)},ul=e=>{let t=b(),r=bo(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),c=[...e.mcpServers??t.mcpServers??[],...e.opencodeConfig?.mcpServers??[]],u=a||e.opencodeConfig?.mcpServers?.length?pt(t.opencodeConfigContent,c,{cloudUrl:t.cloudUrl,executorToken:t.executorToken,actingUserId:e.actingUserId}).trim():Te(t,e.actingUserId).trim();return{agent:n,variant:o,executionModel:i,configContent:dl({baseConfigContent:u,agent:n,permissionPolicy:s,variant:o})}},Ro=async e=>{if(!cl(e.cwd))throw new Error(`\u5DE5\u4F5C\u76EE\u5F55\u4E0D\u5B58\u5728: ${e.cwd}`);let t=ul({actingUserId:e.actingUserId,executionModel:e.executionModel,agentSettings:e.agentSettings,opencodeConfig:e.opencodeConfig,mcpServers:e.mcpServers}),r=await Io(e.cwd,t.configContent),n=await Eo(r,e.cwd,e.title),o=!1,s=null,i=new Map,a=!1,l="",c=new AbortController,u=()=>{o=!0,c.abort(),r.session.abort({path:{id:n},query:{directory:e.cwd}}).catch(()=>{})};e.signal?.addEventListener("abort",u,{once:!0});try{L("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 d=await r.event.subscribe({signal:c.signal});L("prompt:subscribed",{cwd:e.cwd,sessionId:n});let w=r.session.promptAsync({path:{id:n},query:{directory:e.cwd},body:{model:ko(t.executionModel),agent:t.agent,parts:[{type:"text",text:e.prompt}]}}).catch(x=>{o||e.signal?.aborted||(s=x instanceof Error?x:new Error(Q(x)),L("prompt:async-error",{cwd:e.cwd,sessionId:n,error:s.message}),c.abort())});for await(let x of d.stream){if(o||e.signal?.aborted)throw new Error("\u4EFB\u52A1\u5DF2\u53D6\u6D88");let h=x;if(!(!h.type||!h.properties)){if(h.type==="permission.updated"&&e.onEvent?.({type:"permission.updated",properties:h.properties}),h.type==="session.status"){e.onEvent?.({type:"session.status",properties:h.properties}),h.properties.sessionID===n&&(a=!0,L("event:session-status",{sessionId:n,status:h.properties.status}));continue}if(h.type==="message.updated"){e.onEvent?.({type:"message.updated",properties:h.properties});let m=h.properties.info;if(m.sessionID!==n||m.role!=="assistant"||!m.id)continue;l=m.id,a=!0,L("event:message-updated",{sessionId:n,assistantMessageId:l,role:m.role});continue}if(h.type==="message.part.updated"){e.onEvent?.({type:"message.part.updated",properties:h.properties});let m=h.properties.part;if(m.sessionID!==n||l&&m.messageID!==l)continue;a=!0,L("event:message-part",{sessionId:n,assistantMessageId:l,partId:m.id,messageId:m.messageID,partType:m.type,textPreview:(m.text??"").slice(0,120)}),m.type==="text"&&m.messageID&&Co(i,m.messageID).set(m.id,m.text??"");continue}if(h.type==="session.error"){e.onEvent?.({type:"session.error",properties:h.properties});let m=h.properties;if(m.sessionID!==n)continue;throw L("event:session-error",{sessionId:n,error:m.error}),new Error(Q(m.error))}if(h.type==="session.idle"&&(e.onEvent?.({type:"session.idle",properties:h.properties}),h.properties.sessionID===n&&a)){L("event:session-idle",{sessionId:n,assistantMessageId:l,textPartCount:l?i.get(l)?.size??0:0});break}}}if(c.abort(),await w,o||e.signal?.aborted)throw new Error("\u4EFB\u52A1\u5DF2\u53D6\u6D88");if(s)throw s;let p=l?xo(i.get(l)??new Map):"";if(!p)for(let x=0;x<10;x+=1){x>0&&await So(300);let h=await r.session.messages({path:{id:n},query:{directory:e.cwd,limit:20}}),m=Array.isArray(h.data)?h.data:[];if(p=wo(m,l),p)break;let k=l?m.find(S=>S.info?.id===l):void 0;if(l&&k&&Or(k)||!l&&m.some(Or))break}return L("prompt:finish",{cwd:e.cwd,sessionId:n,assistantMessageId:l,outputPreview:(p||"OpenCode \u672A\u8FD4\u56DE\u6587\u672C\u8F93\u51FA\u3002").slice(0,200)}),{sessionId:n,output:p||"OpenCode \u672A\u8FD4\u56DE\u6587\u672C\u8F93\u51FA\u3002"}}catch(d){throw L("prompt:error",{cwd:e.cwd,sessionId:n,assistantMessageId:l,aborted:o,error:Q(d),snapshot:await ll(r,e.cwd,n)}),d}finally{e.signal?.removeEventListener("abort",u)}},$r=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(`
39
- `);return Ro({actingUserId:e.actingUserId,cwd:e.cwd,title:`Task: ${e.title}`,prompt:t,executionModel:e.executionModel,agentSettings:e.agentSettings,opencodeConfig:e.opencodeConfig,mcpServers:e.mcpServers,signal:e.signal})},Ur=async e=>Ro({actingUserId:e.actingUserId,cwd:e.cwd,title:e.title,prompt:e.prompt,executionModel:e.executionModel,agentSettings:e.agentSettings,opencodeConfig:e.opencodeConfig,mcpServers:e.mcpServers,signal:e.signal,onEvent:e.onEvent});var pl=e=>{let t=e.trim().match(/^\$\{([A-Z0-9_]+)\}$/i);return t?process.env[t[1]]?.trim()||"":e.trim()},Ao=e=>typeof e!="string"?"":pl(e).trim(),Nt=(e,t)=>{for(let r of t){let n=Ao(e[r]);if(n)return n}return""},gl=(e,t)=>{let r=ee(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,l=Nt(a,["baseURL","baseUrl","base_url","url","endpoint"]),c=Nt(a,["apiKey","api_key","token","authToken","apiToken"]);o.set(s,{...l?{baseUrl:l}:{},...c?{apiToken:c}:{}})}return t.map(s=>({providerId:s.providerId,modelId:s.modelId,label:`OpenCode \xB7 ${s.id}`,...o.get(s.providerId),runtimeSettings:{defaultModel:s.id}}))},Ke=(e,t)=>{let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return e.match(new RegExp(`^\\s*${r}\\s*=\\s*["']([^"']+)["']`,"mi"))?.[1]?.trim()||""},ml=e=>{let t=e.codexConfigContent?.trim()||"",r=Ke(t,"model");if(!r)return[];let n=Ke(t,"base_url")||Ke(t,"openai_base_url")||Ke(t,"OPENAI_BASE_URL")||process.env.OPENAI_BASE_URL?.trim()||"",o=Ke(t,"OPENAI_API_KEY")||process.env.OPENAI_API_KEY?.trim()||"";return[{providerId:"openai",modelId:r,label:`Codex \xB7 openai/${r}`,...n?{baseUrl:n}:{},...o?{apiToken:o}:{},runtimeSettings:{defaultModel:r}}]},fl=e=>{let t=e.claudeCodeConfigContent?.trim()||"";if(!t)return[];try{let r=JSON.parse(t),n=Ao(r.model);if(!n)return[];let o=r.env&&typeof r.env=="object"?r.env:{},s=Nt(o,["ANTHROPIC_BASE_URL","ANTHROPIC_API_URL"])||process.env.ANTHROPIC_BASE_URL?.trim()||"",i=Nt(o,["ANTHROPIC_AUTH_TOKEN","ANTHROPIC_API_KEY"])||process.env.ANTHROPIC_AUTH_TOKEN?.trim()||process.env.ANTHROPIC_API_KEY?.trim()||"";return[{providerId:"anthropic",modelId:n,label:`ClaudeCode \xB7 anthropic/${n}`,...s?{baseUrl:s}:{},...i?{apiToken:i}:{},runtimeSettings:{defaultModel:n}}]}catch{return[]}},Mo=e=>e.agentType==="OpenCode"?gl(e.config,e.availableModels):e.agentType==="Codex"?ml(e.config):e.agentType==="ClaudeCode"?fl(e.config):[];var Dr=e=>{let t=b(),r=e.opencodeConfigContent?.trim()?e.opencodeConfigContent:t.opencodeConfigContent,n=e.codexConfigContent?.trim()?e.codexConfigContent:t.codexConfigContent,o=e.claudeCodeConfigContent?.trim()?e.claudeCodeConfigContent:t.claudeCodeConfigContent,s=e.defaultModel?.trim()?e.defaultModel:t.defaultModel,i={...t,opencodeConfigContent:r,codexConfigContent:n,claudeCodeConfigContent:o,defaultModel:s,agentSettings:Ne(e.agentSettings??t.agentSettings,s),mcpServers:e.mcpServers??t.mcpServers??[],maxConcurrency:Math.max(1,e.maxConcurrency??t.maxConcurrency)};return Ie(i),O({config:i}),i};var Oo=(e,t)=>{let r=t.getConfig(),n=t.getConnection();if(e.type==="control-plane.ready")return r=Dr({opencodeConfigContent:e.opencodeConfigContent,codexConfigContent:e.codexConfigContent,claudeCodeConfigContent:e.claudeCodeConfigContent,defaultModel:e.defaultModel,agentSettings:e.agentSettings,mcpServers:e.mcpServers,maxConcurrency:e.maxConcurrency}),t.setConfig(r),O({config:r,executorId:r.executorId}),!0;if(e.type==="config.sync")return r=Dr({opencodeConfigContent:e.opencodeConfigContent,codexConfigContent:e.codexConfigContent,claudeCodeConfigContent:e.claudeCodeConfigContent,defaultModel:e.defaultModel,agentSettings:e.agentSettings,mcpServers:e.mcpServers,maxConcurrency:e.maxConcurrency}),t.setConfig(r),O({config:r}),!0;if(e.type==="executor.unpair"){let o=wt();return t.setConfig(o),O({daemonMode:"unpaired",paired:!1,connected:!1,executorId:void 0,config:o,lastError:e.reason||"This worker was removed from the control plane."}),!0}return e.type==="config.export.request"?(r=b(),t.setConfig(r),Wr().then(o=>{n?.send({type:"config.export.response",executorId:r.executorId,requestId:e.requestId,opencodeConfigContent:Te(r),codexConfigContent:r.codexConfigContent,claudeCodeConfigContent:r.claudeCodeConfigContent,defaultModel:o.defaultModel??r.defaultModel,availableModels:o.models,resolvedModelBindings:e.includeResolvedModelBindings?Mo({config:r,agentType:e.agentType,availableModels:o.models}):void 0,modelsMessage:o.message,at:new Date().toISOString()})}),!0):e.type==="executor.telemetry.request"?(r=b(),t.setConfig(r),n?.send({type:"executor.telemetry.response",executorId:r.executorId,requestId:e.requestId,telemetry:Ut({workspaceRoot:r.workspaceRoot,workerVersion:Z()}),at:new Date().toISOString()}),!0):!1};var hl=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,Bo=()=>AbortSignal.timeout(8e3),_o=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(/\/+$/,"")}},kl=e=>{let t=_o(e);return!t||t==="github.com"?"https://api.github.com/user":`https://${t}/api/v3/user`},yl=e=>`https://${_o(e)||"gitlab.com"}/api/v4/user`,wl=async(e,t)=>{try{let r=await fetch(kl(t),{headers:{Accept:"application/vnd.github+json",Authorization:`Bearer ${e}`,"User-Agent":"vibemux-pat-check"},signal:Bo()});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"}}},xl=async(e,t)=>{try{let r=await fetch(yl(t),{headers:{"PRIVATE-TOKEN":e,"User-Agent":"vibemux-pat-check"},signal:Bo()});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"}}},Wo=async(e,t,r)=>{let n=e.trim();if(!n)return{ok:!1,message:"PAT \u4E0D\u80FD\u4E3A\u7A7A\u3002"};let o=hl(n),s=t?[t]:o?[o]:["github","gitlab"];for(let i of s){let a=i==="github"?await wl(n,r):await xl(n,r);if(a.ok){let l=i==="github"&&a.scopes?`\uFF0Cscopes\uFF1A${a.scopes}`:"",c=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}${l}${c}\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 Uo from"node:os";import Do from"node:path";import{simpleGit as Sl}from"simple-git";import{spawnSync as Cl}from"node:child_process";var Xe=(e,t,r)=>{let n=Cl("git",t,{cwd:e,env:r,encoding:"utf8"});if(n.status!==0)throw new Error((n.stderr||n.stdout||"git command failed").trim())},Lt=(e,t,r)=>{try{Xe(e,t,r)}catch{return}},ae=e=>{let t=io({taskId:e.taskId,identity:e.identity,repoUrl:e.repoUrl});return{env:t.env,tempDir:t.tempDir,configureRepo(r){e.identity.name&&e.identity.email&&(Xe(r,["config","--local","user.name",e.identity.name],t.env),Xe(r,["config","--local","user.email",e.identity.email],t.env)),t.env.GIT_SSH_COMMAND&&Xe(r,["config","--local","core.sshCommand",t.env.GIT_SSH_COMMAND],t.env),t.env.GIT_ASKPASS&&Xe(r,["config","--local","core.askPass",t.env.GIT_ASKPASS],t.env)},cleanup(r){r&&(e.identity.name&&e.identity.email&&(Lt(r,["config","--local","--unset-all","user.name"],t.env),Lt(r,["config","--local","--unset-all","user.email"],t.env)),Lt(r,["config","--local","--unset-all","core.askPass"],t.env),Lt(r,["config","--local","--unset-all","core.sshCommand"],t.env)),t.cleanup()}}},$o=e=>{let t=ae({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 Ye="main",bl=e=>{let t=e.trim();return t?t==="~"?Uo.homedir():t.startsWith("~/")?Do.join(Uo.homedir(),t.slice(2)):t:""},vl=e=>Do.resolve(bl(e)),Pl=(e,t)=>{let r={...de(t),...e?{baseDir:e}:{}};return Sl(r).env(t??{})},ue=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},No=(e,t)=>{let r=new Map;for(let n of t.split(`
49
+ `),Bs=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:yt(t.parts).map(r=>r.type),textPreview:ar(yt(t.parts)).slice(0,160)})),Ns=(e,t)=>{let r=t?e.find(s=>s.info?.id===t):void 0,n=ar(yt(r?.parts));if(n)return n;let o=[...e].filter(s=>s.info?.role==="assistant").sort((s,i)=>(i.info?.time?.created??0)-(s.info?.time?.created??0)).find(s=>ar(yt(s.parts)));return o?ar(yt(o.parts)):""},mn=e=>!!e?.info?.time?.completed||!!e?.info?.error,$s=e=>[...e.values()].join("").trim(),Us=(e,t)=>{let r=e.get(t);if(r)return r;let n=new Map;return e.set(t,n),n},Ls=async e=>new Promise(t=>setTimeout(t,e)),fn=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 fn(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}}},js=e=>e&&"permissionPolicy"in e?e:void 0;var hn=new Map,kd=async()=>new Promise((e,t)=>{let r=fd.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)})})}),yd=async e=>{let t=await kd();return(await hd({port:t,timeout:15e3,config:ee(e)})).server},qs=async e=>{let t=e?.trim()||"{}",r=hn.get(t);if(r)return r;let n=yd(e).catch(o=>{throw hn.delete(t),o});return hn.set(t,n),n},zs=async(e,t)=>{let r=await qs(t);return Gs({baseUrl:r.url,directory:e})},Fs=async e=>{let t=await qs(e);return Gs({baseUrl:t.url})},kn=async(e,t,r)=>{q("session:create:start",{cwd:t,title:r});let n;try{n=await e.session.create({body:{title:r},query:{directory:t}})}catch(o){throw q("session:create:error",{cwd:t,title:r,error:re(o)}),o}if(q("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=re(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},Hs=async(e,t,r,n)=>{let o=r?.trim();if(!o)return kn(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):kn(e,t,n)}catch{return kn(e,t,n)}};var wd=(e,t,r)=>({id:`${e}/${t}`,label:`${e}/${t}`,providerId:e,modelId:t,isDefault:r===`${e}/${t}`}),Sd=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),xd=(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?Sd(s.models).map(a=>wd(i,a,t)):[]}).sort((s,i)=>s.isDefault?-1:i.isDefault?1:s.label.localeCompare(i.label))},yn=async()=>{let e=P(),t=jt(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 Fs(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:xd(s,a),defaultModel:a,message:void 0}}catch(n){return q("models:error",{error:re(n)}),{models:[],defaultModel:r,message:re(n)}}};import{existsSync as Cd}from"node:fs";var Pd=async(e,t,r)=>{try{let n=await e.session.messages({path:{id:r},query:{directory:t,limit:20}});return Bs(Array.isArray(n.data)?n.data:[])}catch(n){return[{snapshotError:re(n)}]}},vd=e=>{let r={...ee(e.baseConfigContent)},n=e.agent?.trim()||void 0,o=fn(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)},Id=e=>{let t=P(),r=js(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??[]],u=a||e.opencodeConfig?.mcpServers?.length?Nt(t.opencodeConfigContent,l,{cloudUrl:t.cloudUrl,executorToken:t.executorToken,actingUserId:e.actingUserId}).trim():jt(t,e.actingUserId).trim();return{agent:n,variant:o,executionModel:i,configContent:vd({baseConfigContent:u,agent:n,permissionPolicy:s,variant:o})}},Js=async e=>{if(!Cd(e.cwd))throw new Error(`\u5DE5\u4F5C\u76EE\u5F55\u4E0D\u5B58\u5728: ${e.cwd}`);let t=Id({actingUserId:e.actingUserId,executionModel:e.executionModel,agentSettings:e.agentSettings,opencodeConfig:e.opencodeConfig,mcpServers:e.mcpServers}),r=await zs(e.cwd,t.configContent),n=await Hs(r,e.cwd,e.resumeSessionId,e.title),o=!1,s=null,i=new Map,a=!1,c="",l=new AbortController,u=()=>{o=!0,l.abort(),r.session.abort({path:{id:n},query:{directory:e.cwd}}).catch(()=>{})};e.signal?.addEventListener("abort",u,{once:!0});try{q("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 d=await r.event.subscribe({signal:l.signal});q("prompt:subscribed",{cwd:e.cwd,sessionId:n});let S=r.session.promptAsync({path:{id:n},query:{directory:e.cwd},body:{model:Ds(t.executionModel),agent:t.agent,parts:[{type:"text",text:e.prompt}]}}).catch(m=>{o||e.signal?.aborted||(s=m instanceof Error?m:new Error(re(m)),q("prompt:async-error",{cwd:e.cwd,sessionId:n,error:s.message}),l.abort())});for await(let m of d.stream){if(o||e.signal?.aborted)throw new Error("\u4EFB\u52A1\u5DF2\u53D6\u6D88");let k=m;if(!(!k.type||!k.properties)){if(k.type==="permission.updated"&&e.onEvent?.({type:"permission.updated",properties:k.properties}),k.type==="session.status"){e.onEvent?.({type:"session.status",properties:k.properties}),k.properties.sessionID===n&&(a=!0,q("event:session-status",{sessionId:n,status:k.properties.status}));continue}if(k.type==="message.updated"){e.onEvent?.({type:"message.updated",properties:k.properties});let g=k.properties.info;if(g.sessionID!==n||g.role!=="assistant"||!g.id)continue;c=g.id,a=!0,q("event:message-updated",{sessionId:n,assistantMessageId:c,role:g.role});continue}if(k.type==="message.part.updated"){e.onEvent?.({type:"message.part.updated",properties:k.properties});let g=k.properties.part;if(g.sessionID!==n||c&&g.messageID!==c)continue;a=!0,q("event:message-part",{sessionId:n,assistantMessageId:c,partId:g.id,messageId:g.messageID,partType:g.type,textPreview:(g.text??"").slice(0,120)}),g.type==="text"&&g.messageID&&Us(i,g.messageID).set(g.id,g.text??"");continue}if(k.type==="session.error"){e.onEvent?.({type:"session.error",properties:k.properties});let g=k.properties;if(g.sessionID!==n)continue;throw q("event:session-error",{sessionId:n,error:g.error}),new Error(re(g.error))}if(k.type==="session.idle"&&(e.onEvent?.({type:"session.idle",properties:k.properties}),k.properties.sessionID===n&&a)){q("event:session-idle",{sessionId:n,assistantMessageId:c,textPartCount:c?i.get(c)?.size??0:0});break}}}if(l.abort(),await S,o||e.signal?.aborted)throw new Error("\u4EFB\u52A1\u5DF2\u53D6\u6D88");if(s)throw s;let p=c?$s(i.get(c)??new Map):"";if(!p)for(let m=0;m<10;m+=1){m>0&&await Ls(300);let k=await r.session.messages({path:{id:n},query:{directory:e.cwd,limit:20}}),g=Array.isArray(k.data)?k.data:[];if(p=Ns(g,c),p)break;let w=c?g.find(v=>v.info?.id===c):void 0;if(c&&w&&mn(w)||!c&&g.some(mn))break}return q("prompt:finish",{cwd:e.cwd,sessionId:n,assistantMessageId:c,outputPreview:(p||"OpenCode \u672A\u8FD4\u56DE\u6587\u672C\u8F93\u51FA\u3002").slice(0,200)}),{sessionId:n,output:p||"OpenCode \u672A\u8FD4\u56DE\u6587\u672C\u8F93\u51FA\u3002"}}catch(d){throw q("prompt:error",{cwd:e.cwd,sessionId:n,assistantMessageId:c,aborted:o,error:re(d),snapshot:await Pd(r,e.cwd,n)}),d}finally{e.signal?.removeEventListener("abort",u)}},wn=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(`
50
+ `);return Js({actingUserId:e.actingUserId,cwd:e.cwd,title:`Task: ${e.title}`,prompt:t,executionModel:e.executionModel,agentSettings:e.agentSettings,opencodeConfig:e.opencodeConfig,mcpServers:e.mcpServers,signal:e.signal})},Sn=async e=>Js({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,signal:e.signal,onEvent:e.onEvent});import{existsSync as bd,readFileSync as Ed}from"node:fs";import Vs from"node:os";import cr from"node:path";var Rd=e=>{let t=e.trim().match(/^\$\{([A-Z0-9_]+)\}$/i);return t?process.env[t[1]]?.trim()||"":e.trim()},lr=e=>typeof e!="string"?"":Rd(e).trim(),Pe=e=>!!e&&typeof e=="object"&&!Array.isArray(e),et=(e,t)=>{for(let r of t){let n=lr(e[r]);if(n)return n}return""},Ks=e=>{if(!bd(e))return null;try{let t=JSON.parse(Ed(e,"utf8"));return Pe(t)?t:null}catch{return null}},Td=e=>{let t=e.trim();return t?t==="~"?Vs.homedir():t.startsWith("~/")?cr.join(Vs.homedir(),t.slice(2)):t:""},Ad=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},Md=e=>{let t=lr(e.model);if(t)return t;let r=e.env&&typeof e.env=="object"?e.env:{};return et(r,["ANTHROPIC_MODEL","ANTHROPIC_DEFAULT_SONNET_MODEL","ANTHROPIC_DEFAULT_OPUS_MODEL","ANTHROPIC_DEFAULT_HAIKU_MODEL"])},Od=(e,t)=>{let r=ee(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=et(a,["baseURL","baseUrl","base_url","url","endpoint"]),l=et(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}}))},wt=(e,t)=>{let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return e.match(new RegExp(`^\\s*${r}\\s*=\\s*["']([^"']+)["']`,"mi"))?.[1]?.trim()||""},xn=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}},_d=new Map([["claude","anthropic"],["dashscope","qwen"],["gemini","google"],["glm","zhipu"],["grok","xai"],["kimi","moonshot"],["volcengine","doubao"]]),Xs=new Set(["anthropic","baichuan","deepseek","doubao","google","groq","minimax","minimax-cn","mistral","moonshot","openai","openrouter","pi","qwen","xai","zhipu"]),Wd=[{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"}],Ys=e=>e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,""),Dd=e=>{let t=e?.trim()||"";if(!t)return"";let r=Ys(t);return _d.get(r)||(Xs.has(r)?r:t)},Bd=(e,t)=>e===t||e.endsWith(`.${t}`),Nd=e=>Wd.find(r=>Bd(e,r.hostname))?.providerId||"",$d=e=>{let t=e?.trim();if(!t)return"";try{let n=new URL(t).hostname.toLowerCase(),o=Nd(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(u=>n.includes(u));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(u=>!c.has(u));return l?Ys(l):""}catch{return""}},Ud=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":"":""},Ld=(e,t)=>!e||!t||e===t||!Xs.has(t)?!1:e==="openai"||e==="anthropic"?!0:e==="minimax"&&t==="minimax-cn",Cn=e=>{let t=Dd(e.explicitProviderId),r=$d(e.baseUrl);return Ld(t,r)?r:t||r||Ud(e.modelId)||e.fallbackProviderId.trim()},jd=(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 Pe(o)?{providerId:n,config:o}:null;return null},Qs=(e,t)=>{let r=e.trim(),n=t.trim();return!r||!n?n||r:n.toLowerCase().startsWith(`${r.toLowerCase()}/`)?n:`${r}/${n}`},Pn=(e,t,r)=>`${e} \xB7 ${Qs(t,r)}`,Gd=e=>{let t=e.codexConfigContent?.trim()||"",r=wt(t,"model");if(!r)return[];let n=wt(t,"base_url")||wt(t,"openai_base_url")||wt(t,"OPENAI_BASE_URL")||process.env.OPENAI_BASE_URL?.trim()||"",o=wt(t,"OPENAI_API_KEY")||process.env.OPENAI_API_KEY?.trim()||"",s=xn(r)?.providerId,i=Cn({explicitProviderId:s,baseUrl:n,modelId:r,fallbackProviderId:"openai"});return[{providerId:i,modelId:r,label:Pn("Codex",i,r),...n?{baseUrl:n}:{},...o?{apiToken:o}:{},runtimeSettings:{defaultModel:r}}]},qd=e=>{let t=e.claudeCodeConfigContent?.trim()||"";if(!t)return[];try{let r=JSON.parse(t),n=Md(r);if(!n)return[];let o=r.env&&typeof r.env=="object"?r.env:{},s=et(o,["ANTHROPIC_BASE_URL","ANTHROPIC_API_URL"])||process.env.ANTHROPIC_BASE_URL?.trim()||"",i=et(o,["ANTHROPIC_AUTH_TOKEN","ANTHROPIC_API_KEY"])||process.env.ANTHROPIC_AUTH_TOKEN?.trim()||process.env.ANTHROPIC_API_KEY?.trim()||"",a=xn(n)?.providerId,c=Cn({explicitProviderId:a,baseUrl:s,modelId:n,fallbackProviderId:"anthropic"});return[{providerId:c,modelId:n,label:Pn("ClaudeCode",c,n),...s?{baseUrl:s}:{},...i?{apiToken:i}:{},runtimeSettings:{defaultModel:n}}]}catch{return[]}},zd=e=>{if(!Pe(e.agentSettings))return"";let t=Pe(e.agentSettings.Pi)?e.agentSettings.Pi:null;return typeof t?.defaultModel=="string"?t.defaultModel.trim():""},Fd=e=>Pe(e.agentSettings.Pi)&&typeof e.agentSettings.Pi.agentDir=="string"&&e.agentSettings.Pi.agentDir.trim()?e.agentSettings.Pi.agentDir.trim():"",Hd=(e,t)=>{for(let[r,n]of Object.entries(e)){if(!Pe(n)||!Array.isArray(n.models))continue;if(n.models.some(s=>Pe(s)&&lr(s.id)===t))return r}return""},Jd=e=>{let t=zd(e);if(!t)return[];let r=Fd(e),n=r?cr.resolve(Td(r)):"",o=n?Ks(cr.join(n,"settings.json")):null,s=n?Ks(cr.join(n,"models.json")):null,i=Pe(s?.providers)?s.providers:{},a=xn(t),c=a?.providerId||"",l=a?.modelId||t,u=c?"":lr(o?.defaultProvider),d=u||c?"":Hd(i,l),p=[u,c,d].filter(Boolean).map(M=>jd(i,M)).find(M=>!!M)??null,m=p?.config??null,k=m?et(m,["baseUrl","baseURL","base_url","url","endpoint"]):"",g=m?Ad(m.apiKey):"",w=Cn({explicitProviderId:u||c||d||p?.providerId,baseUrl:k,modelId:l,fallbackProviderId:"pi"}),v=Qs(w,l);return[{providerId:w,modelId:l,label:Pn("Pi",w,l),...k?{baseUrl:k}:{},...g?{apiToken:g}:{},runtimeSettings:{defaultModel:v,...n?{agentDir:n}:{}}}]},Zs=e=>e.agentType==="OpenCode"?Od(e.config,e.availableModels):e.agentType==="Codex"?Gd(e.config):e.agentType==="ClaudeCode"?qd(e.config):e.agentType==="Pi"?Jd(e.config):[];var vn=e=>{let t=P(),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:gt(e.agentSettings??t.agentSettings,i),mcpServers:e.mcpServers??t.mcpServers??[],maxConcurrency:Math.max(1,e.maxConcurrency??t.maxConcurrency)};return Se(a),D({config:a}),a};var ei=(e,t)=>{let r=t.getConfig();if(e.type==="control-plane.ready")return r=vn({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),D({config:r,executorId:r.executorId}),!0;if(e.type==="config.sync")return r=vn({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),D({config:r}),!0;if(e.type==="executor.unpair"){let n=qt();return t.setConfig(n),D({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=P(),t.setConfig(r),yn().then(n=>{let o=Do(),s=Bo(),i=No(),a=Ur();t.send({type:"config.export.response",executorId:r.executorId,requestId:e.requestId,opencodeConfigContent:o||r.opencodeConfigContent,codexConfigContent:s||r.codexConfigContent,codexAuthContent:i||r.codexAuthContent,claudeCodeConfigContent:a||r.claudeCodeConfigContent,defaultModel:n.defaultModel??r.defaultModel,agentSettings:r.agentSettings,availableModels:n.models,resolvedModelBindings:e.includeResolvedModelBindings?Zs({config:r,agentType:e.agentType,availableModels:n.models}):void 0,modelsMessage:n.message,at:new Date().toISOString()})}),!0):e.type==="executor.telemetry.request"?(r=P(),t.setConfig(r),t.send({type:"executor.telemetry.response",executorId:r.executorId,requestId:e.requestId,telemetry:ir({workspaceRoot:r.workspaceRoot,workerVersion:X()}),at:new Date().toISOString()}),!0):!1};import{readFileSync as lg}from"node:fs";import{basename as ug}from"node:path";var Vd=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,ti=()=>AbortSignal.timeout(8e3),ri=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(/\/+$/,"")}},Kd=e=>{let t=ri(e);return!t||t==="github.com"?"https://api.github.com/user":`https://${t}/api/v3/user`},Xd=e=>`https://${ri(e)||"gitlab.com"}/api/v4/user`,Yd=async(e,t)=>{try{let r=await fetch(Kd(t),{headers:{Accept:"application/vnd.github+json",Authorization:`Bearer ${e}`,"User-Agent":"vibemux-pat-check"},signal:ti()});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"}}},Qd=async(e,t)=>{try{let r=await fetch(Xd(t),{headers:{"PRIVATE-TOKEN":e,"User-Agent":"vibemux-pat-check"},signal:ti()});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"}}},ni=async(e,t,r)=>{let n=e.trim();if(!n)return{ok:!1,message:"PAT \u4E0D\u80FD\u4E3A\u7A7A\u3002"};let o=Vd(n),s=t?[t]:o?[o]:["github","gitlab"];for(let i of s){let a=i==="github"?await Yd(n,r):await Qd(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 Zd}from"node:crypto";import{accessSync as oi,existsSync as rt,mkdirSync as ep,readdirSync as ii,readFileSync as bn,rmSync as tp,statSync as En,unlinkSync as rp,writeFileSync as np}from"node:fs";import op from"node:os";import $ from"node:path";var In=1,ur=1,sp=64*1024*1024,ip=200*1024,ap=e=>e?.trim()||process.env.VIBEMUX_AGENT_HOME?.trim()||$.join(op.homedir(),".vibemux"),Rn=e=>e.replace(/\\/g,"/").replace(/^\/+/,"").split("/").filter(t=>t&&t!==".").join("/"),cp=(e,t)=>{let r=$.relative(e,t);return r===""||!r.startsWith("..")&&!$.isAbsolute(r)},lp=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,"-")},oe=e=>{rt(e)||ep(e,{recursive:!0})},ai=e=>{if(!rt(e))return null;try{return JSON.parse(bn(e,"utf8"))}catch{return null}},Tn=(e,t)=>{np(e,`${JSON.stringify(t,null,2)}
51
+ `,"utf8")},si=e=>new Date(e).toISOString(),up=(e,t)=>{if(!(t>sp))return Zd("sha256").update(bn(e)).digest("hex")},ci=(e,t)=>{let r=lp(e),n=$.join(ap(t),"agents",r),o=$.join(n,"workdir"),s=$.join(n,".system"),i=$.join(s,"manifest.json"),a=$.join(s,"snapshots"),c=$.join(a,"current.json"),l=$.join(s,"sessions"),u=$.join(s,"runtime"),d=$.join(u,"temp"),S=$.join(s,"logs");return{rootPath:n,workDirPath:o,systemPath:s,manifestPath:i,snapshotsDir:a,snapshotPath:c,sessionsDir:l,runtimeDir:u,runtimeTempDir:d,logsDir:S}},dp=(e,t,r)=>{let n=new Date().toISOString();return{version:In,agentId:e.trim(),rootPath:t.rootPath,workDirPath:t.workDirPath,status:"ready",storageVersion:In,snapshotVersion:ur,createdAt:r?.createdAt||n,updatedAt:n,lastUsedAt:r?.lastUsedAt,lastSessionId:r?.lastSessionId,lastScannedAt:r?.lastScannedAt}},ve=(e,t)=>{let r=ci(e,t);return{paths:r,manifest:ai(r.manifestPath)}},An=(e,t,r)=>{let{paths:n,manifest:o}=ve(e,t),s={...dp(e,n,o),...r,updatedAt:new Date().toISOString()};return Tn(n.manifestPath,s),s},Le=(e,t)=>{let{paths:r}=ve(e,t);return ai(r.snapshotPath)},tt=(e,t,r,n,o)=>{let{paths:s}=ve(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??In,snapshotVersion:n?.snapshotVersion??ur}},Mn=(e,t)=>{let{paths:r,manifest:n}=ve(e,t);if(!rt(r.workDirPath)||!rt(r.systemPath))return{paths:r,manifest:n,summary:tt(e,t,"missing",n,Le(e,t))};try{return oi(r.workDirPath),oi(r.systemPath),{paths:r,manifest:n,summary:tt(e,t,"ready",n,Le(e,t))}}catch{return{paths:r,manifest:n,summary:tt(e,t,"error",n,Le(e,t))}}},li=(e,t="")=>{let r=t?$.join(e,t):e,n=ii(r,{withFileTypes:!0}),o=[];for(let s of n){let i=Rn($.join(t,s.name)),a=$.join(r,s.name),c=En(a);if(s.isDirectory()){o.push({path:i,type:"directory",sizeBytes:0,modifiedAt:si(c.mtimeMs)}),o.push(...li(e,i));continue}s.isFile()&&o.push({path:i,type:"file",sizeBytes:c.size,modifiedAt:si(c.mtimeMs),sha256:up(a,c.size)})}return o},dr=(e,t)=>{let r=ci(e,t);oe(r.rootPath),oe(r.workDirPath),oe(r.systemPath),oe(r.snapshotsDir),oe($.join(r.snapshotsDir,"history")),oe(r.sessionsDir),oe(r.runtimeDir),oe(r.runtimeTempDir),oe($.join(r.runtimeDir,"locks")),oe(r.logsDir);let n=An(e,t);return{summary:tt(e,t,"ready",n,Le(e,t)),files:Le(e,t)?.files??[]}},ui=(e,t)=>(dr(e,t),On(e,t)),On=(e,t)=>{let{summary:r}=Mn(e,t);if(r.status!=="ready")return{summary:r,files:[]};let{paths:n}=ve(e,t),o=new Date().toISOString(),s=li(n.workDirPath).sort((a,c)=>a.path.localeCompare(c.path));Tn(n.snapshotPath,{version:ur,agentId:e.trim(),scannedAt:o,files:s});let i=An(e,t,{lastScannedAt:o,status:"ready"});return{summary:tt(e,t,"ready",i,{version:ur,agentId:e.trim(),scannedAt:o,files:s}),files:s}},St=(e,t)=>{let{manifest:r,summary:n}=Mn(e,t);return n.status!=="ready"?n:tt(e,t,"ready",r,Le(e,t))},nt=(e,t=!1,r)=>t?On(e,r):{summary:St(e,r),files:Le(e,r)?.files??[]},di=(e,t,r)=>{dr(e,r);let{paths:n}=ve(e,r),o=new Date().toISOString();An(e,r,{lastUsedAt:o,lastSessionId:t.trim()||void 0}),Tn($.join(n.sessionsDir,`${t.trim()||"session"}.json`),{sessionId:t.trim()||"session",cwd:n.workDirPath,lastUsedAt:o})},pi=(e,t)=>{let{paths:r}=ve(e,t);if(rt(r.runtimeTempDir))for(let n of ii(r.runtimeTempDir))tp($.join(r.runtimeTempDir,n),{force:!0,recursive:!0});return St(e,t)},pr=(e,t,r)=>{let{summary:n}=Mn(e,r);if(n.status!=="ready")throw new Error("Agent \u5DE5\u4F5C\u76EE\u5F55\u5C1A\u672A\u521D\u59CB\u5316\u3002");let o=Rn(t);if(!o)throw new Error("\u6587\u4EF6\u8DEF\u5F84\u4E0D\u80FD\u4E3A\u7A7A\u3002");let{paths:s}=ve(e,r),i=$.resolve(s.workDirPath,o);if(!cp(s.workDirPath,i))throw new Error("\u6587\u4EF6\u8DEF\u5F84\u8D8A\u754C\u3002");if(!rt(i)||!En(i).isFile())throw new Error("\u6587\u4EF6\u4E0D\u5B58\u5728\u3002");return{absolutePath:i,relativePath:o}},gi=(e,t,r)=>{let n=pr(e,t,r);return rp(n.absolutePath),On(e,r)},mi=(e,t,r)=>{try{let n=pr(e,t,r),o=En(n.absolutePath);if(!o.isFile())return{ok:!1,relativePath:n.relativePath,message:"\u5F53\u524D\u8DEF\u5F84\u4E0D\u662F\u6587\u4EF6\u3002"};if(o.size>ip)return{ok:!1,relativePath:n.relativePath,sizeBytes:o.size,message:"\u6587\u4EF6\u8FC7\u5927\uFF0C\u6682\u4E0D\u652F\u6301\u9884\u89C8\u3002"};let s=bn(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:Rn(t),message:n instanceof Error?n.message:"\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25\u3002"}}};import hi from"node:os";import ki from"node:path";import{simpleGit as gp}from"simple-git";import{spawnSync as pp}from"node:child_process";var xt=(e,t,r)=>{let n=pp("git",t,{cwd:e,env:r,encoding:"utf8"});if(n.status!==0)throw new Error((n.stderr||n.stdout||"git command failed").trim())},gr=(e,t,r)=>{try{xt(e,t,r)}catch{return}},ge=e=>{let t=Is({taskId:e.taskId,identity:e.identity,repoUrl:e.repoUrl});return{env:t.env,tempDir:t.tempDir,configureRepo(r){e.identity.name&&e.identity.email&&(xt(r,["config","--local","user.name",e.identity.name],t.env),xt(r,["config","--local","user.email",e.identity.email],t.env)),t.env.GIT_SSH_COMMAND&&xt(r,["config","--local","core.sshCommand",t.env.GIT_SSH_COMMAND],t.env),t.env.GIT_ASKPASS&&xt(r,["config","--local","core.askPass",t.env.GIT_ASKPASS],t.env)},cleanup(r){r&&(e.identity.name&&e.identity.email&&(gr(r,["config","--local","--unset-all","user.name"],t.env),gr(r,["config","--local","--unset-all","user.email"],t.env)),gr(r,["config","--local","--unset-all","core.askPass"],t.env),gr(r,["config","--local","--unset-all","core.sshCommand"],t.env)),t.cleanup()}}},fi=e=>{let t=ge({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 Ct="main",mp=e=>{let t=e.trim();return t?t==="~"?hi.homedir():t.startsWith("~/")?ki.join(hi.homedir(),t.slice(2)):t:""},fp=e=>ki.resolve(mp(e)),hp=(e,t)=>{let r={...Ce(t),...e?{baseDir:e}:{}};return gp(r).env(t??{})},Ie=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},yi=(e,t)=>{let r=new Map;for(let n of t.split(`
40
52
  `).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(`
41
- `).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)},Lo=async(e,t)=>{let r=ue(t)||Ye;try{await e.fetch(["origin",`${r}:refs/remotes/origin/${r}`])}catch{}let n=[`refs/remotes/origin/${r}`,`origin/${r}`,`refs/heads/${r}`,r];for(let o of n)try{return await e.raw(["rev-parse","--verify",o]),{baseBranch:r,baseRef:o}}catch{}throw new Error(`\u627E\u4E0D\u5230\u57FA\u7EBF\u5206\u652F ${r}\u3002`)},Qe=async e=>{let t=await e.branchLocal();return ue(t.current)||"HEAD"},Il=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}},Tl=async(e,t)=>{try{return(await e.raw(["rev-list","--parents","-n","1",t])).trim().split(/\s+/).filter(Boolean)[1]}catch{return}},El=async e=>{try{return(await e.raw(["diff","--name-only","--diff-filter=U"])).split(`
42
- `).map(r=>r.trim()).filter(Boolean)}catch{return[]}},Rl=e=>{let t=e.trim();return!t.startsWith("(")||!t.endsWith(")")?[]:t.slice(1,-1).split(",").map(r=>r.trim()).filter(Boolean)},Al=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},Ml=e=>e.split("").map(t=>t.trim()).filter(Boolean).map(t=>{let[r="",n="",o="",s="",i="",a=""]=t.split(""),l=Rl(o);return{sha:r,shortSha:r.slice(0,7),parents:n.split(" ").map(c=>c.trim()).filter(Boolean),subject:s.trim(),authorDate:i.trim(),authorName:a.trim(),refs:l,isHead:l.some(c=>c.startsWith("HEAD"))}}),Ae=async e=>{let t=vl(e.worktreePath),r=ae({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=Pl(t,r.env);return await e.run(n)}finally{r.cleanup(t)}},Go=async e=>{try{return await Ae({...e,taskKey:"git-diff",run:async t=>{let{baseBranch:r,baseRef:n}=await Lo(t,e.baseBranch),o=await Qe(t),[s,i,a,l]=await Promise.all([t.raw(["diff","--numstat","--find-renames","--merge-base",n,"HEAD"]),t.raw(["diff","--name-status","--find-renames","--merge-base",n,"HEAD"]),t.raw(["diff","--find-renames","--merge-base",n,"HEAD"]),Il(t,n)]),c=No(s,i);return{ok:!0,message:c.length>0?`\u5DF2\u751F\u6210\u76F8\u5BF9 ${r} \u7684\u5DEE\u5F02\u3002`:`\u5F53\u524D\u5206\u652F\u76F8\u5BF9 ${r} \u6CA1\u6709\u5DEE\u5F02\u3002`,baseBranch:r,currentBranch:o,aheadCommits:l,files:c,patch:a}}})}catch(t){let r=H(t,e.repoUrl);return{ok:!1,message:r instanceof Error?r.message:"\u8BFB\u53D6 Git diff \u5931\u8D25\u3002",baseBranch:ue(e.baseBranch)||Ye,currentBranch:"HEAD",aheadCommits:0,files:[],patch:""}}},jo=async e=>{try{return await Ae({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 Tl(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=No(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=H(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:""}}},Ho=async e=>{try{return await Ae({...e,taskKey:"git-rebase",run:async t=>{let{baseBranch:r,baseRef:n}=await Lo(t,e.baseBranch),o=await Qe(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 El(t),a=H(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=H(t,e.repoUrl);return{ok:!1,message:r instanceof Error?r.message:"\u6267\u884C rebase \u5931\u8D25\u3002",baseBranch:ue(e.baseBranch)||Ye,currentBranch:"HEAD",conflicts:!1,conflictedFiles:[]}}},qo=async e=>{let t=Math.min(120,Math.max(10,e.limit??40));try{return await Ae({...e,taskKey:"git-graph",run:async r=>{let n=await Qe(r),o=ue(e.baseBranch)||Ye,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=Ml(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=H(r,e.repoUrl);return{ok:!1,message:n instanceof Error?n.message:"\u8BFB\u53D6 Git graph \u5931\u8D25\u3002",baseBranch:ue(e.baseBranch)||Ye,currentBranch:"HEAD",limit:t,commitCount:0,graph:"",commits:[]}}},Fo=async e=>{try{return await Ae({...e,taskKey:"git-push",run:async t=>{let r=e.branchName?.trim()||await Qe(t),n=ue(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=H(t,e.repoUrl);return{ok:!1,message:r instanceof Error?r.message:"\u63A8\u9001\u5206\u652F\u5931\u8D25\u3002",branchName:e.branchName?.trim()||"",remoteBranch:""}}},Jo=async e=>{try{return await Ae({worktreePath:e.worktreePath,repoUrl:e.repoUrl,gitIdentity:e.gitIdentity,taskKey:"git-pull-request",run:async t=>{let r=Al(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 Qe(t),o=ue(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 l=Array.isArray(a.errors)?a.errors.map(c=>c.message).filter(Boolean).join("\uFF1B"):"";return{ok:!1,message:[a.message,l].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=H(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{readdir as Ol,stat as Nr}from"node:fs/promises";import zo from"node:os";import be from"node:path";import{simpleGit as Vo}from"simple-git";var ce="main",Bl=e=>{let t=e.trim();return t?t==="~"?zo.homedir():t.startsWith("~/")?be.join(zo.homedir(),t.slice(2)):t:""},Gt=e=>be.resolve(Bl(e)),_l=(e,t)=>{let r=be.relative(e,t);return r===""||!r.startsWith("..")&&!be.isAbsolute(r)},Wl=(e,t)=>{let r=Gt(e),n=t?.trim()?Gt(t):r;return{resolvedRootPath:r,requestedPath:n}},te=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},jt=(e,t)=>{let r={...de(t),...e?{baseDir:e}:{}};return Vo(r).env(t??{})},Ko=async(e,t,r)=>{let n=jt(e,r),[o,s]=await Promise.all([n.branch(["-a"]),n.branchLocal()]),i="";try{i=te(await n.raw(["symbolic-ref","--quiet","--short","refs/remotes/origin/HEAD"]))}catch{i=""}let a=Array.from(new Set(o.all.map(te).filter(Boolean))).sort((d,w)=>d.localeCompare(w)),l=te(t??""),c=te(s.current),u=[i,l,c,a[0],ce].find(d=>d&&(d===ce||a.includes(d)))??ce;return{branches:a,defaultBranch:u}},$l=e=>{for(let t of e.split(`
43
- `)){let r=t.trim();if(!r.startsWith("ref: "))continue;let[n]=r.split(" ");return te(n.slice(5))}return""},Ul=e=>Array.from(new Set(e.split(`
44
- `).map(t=>t.trim()).filter(Boolean).map(t=>t.split(" ")[1]||"").map(te).filter(Boolean))).sort((t,r)=>t.localeCompare(r)),Dl=async(e,t,r)=>{if(t?.trim())return t.trim();let n=jt(e,r);return await n.checkIsRepo()&&(await n.getRemotes(!0)).find(s=>s.name==="origin")?.refs.fetch?.trim()||""},Nl=async(e,t,r,n)=>{let o=await Dl(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=jt(void 0,n),[i,a]=await Promise.all([s.raw(["ls-remote","--heads",o]),s.raw(["ls-remote","--symref",o,"HEAD"])]),l=Ul(i),c=$l(a),u=te(r??""),d=[c,u,l[0],ce].find(w=>w&&(w===ce||l.includes(w)))??ce;return{branches:l,defaultBranch:d,remoteTarget:o}},Xo=async e=>{let t=Gt(e);try{if(!(await Nr(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=be.basename(t);try{let n=Vo(t);if(!await n.checkIsRepo())return{ok:!0,path:t,name:r,versionControl:"none",message:"\u76EE\u5F55\u65E0 Git \u4ED3\u5E93"};let i=(await n.getRemotes(!0)).find(d=>d.name==="origin"),a=await Ko(t),l=a.branches.length,c=i?.refs.fetch?.trim()||"",u=c?"git-remote":"git-local";return{ok:!0,path:t,name:r,versionControl:u,gitUrl:c,defaultBranch:a.defaultBranch,message:l>0?u==="git-remote"?`\u5DF2\u68C0\u6D4B\u5230 Git \u4ED3\u5E93\uFF0C\u5171 ${l} \u4E2A\u5206\u652F`:`\u5DF2\u68C0\u6D4B\u5230\u672C\u5730 Git \u4ED3\u5E93\uFF08\u672A\u7ED1\u5B9A\u8FDC\u7AEF\uFF09\uFF0C\u5171 ${l} \u4E2A\u5206\u652F`:u==="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"}}},Yo=async(e,t)=>{let{resolvedRootPath:r,requestedPath:n}=Wl(e,t);if(!_l(r,n))return{ok:!1,path:r,rootPath:r,entries:[],message:"\u53EA\u80FD\u6D4F\u89C8\u8BE5\u5DE5\u4F5C\u7AD9 workspace \u5185\u7684\u76EE\u5F55\u3002"};try{if(!(await Nr(n)).isDirectory())return{ok:!1,path:n,rootPath:r,entries:[],message:"\u5F53\u524D\u8DEF\u5F84\u4E0D\u662F\u76EE\u5F55\u3002"}}catch{return{ok:!1,path:n,rootPath:r,entries:[],message:"\u76EE\u5F55\u4E0D\u5B58\u5728\u3002"}}try{let s=(await Ol(n,{withFileTypes:!0})).filter(i=>i.isDirectory()).map(i=>({name:i.name,path:be.join(n,i.name)})).sort((i,a)=>i.name.localeCompare(a.name,"zh-Hans-CN"));return{ok:!0,path:n,rootPath:r,parentPath:n===r?void 0:be.dirname(n),entries:s,message:s.length>0?`\u5171\u627E\u5230 ${s.length} \u4E2A\u6587\u4EF6\u5939\u3002`:"\u5F53\u524D\u76EE\u5F55\u4E0B\u6CA1\u6709\u5B50\u6587\u4EF6\u5939\u3002"}}catch(o){return{ok:!1,path:n,rootPath:r,entries:[],message:o instanceof Error?o.message:"\u8BFB\u53D6\u76EE\u5F55\u5931\u8D25\u3002"}}},Qo=async(e,t,r,n)=>{let o=Gt(e),s=ae({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{let i=await Nl(o,t,r,s.env);return console.log("[worker] [repo-branches] remote snapshot resolved",JSON.stringify({localPath:o,remoteTarget:i.remoteTarget,branchCount:i.branches.length,defaultBranch:i.defaultBranch})),{ok:!0,branches:i.branches,defaultBranch:i.defaultBranch}}catch(i){let a=H(i,t);console.log("[worker] [repo-branches] remote snapshot failed",JSON.stringify({localPath:o,error:a instanceof Error?a.message:"unknown"}));try{if(!(await Nr(o)).isDirectory())return{ok:!1,branches:[],defaultBranch:te(r??"")||ce,message:a instanceof Error?a.message:"\u8BFB\u53D6\u5206\u652F\u5217\u8868\u5931\u8D25\u3002"};if(!await jt(o,s.env).checkIsRepo())return console.log("[worker] [repo-branches] fallback skipped: path is not repo",JSON.stringify({localPath:o})),{ok:!1,branches:[],defaultBranch:te(r??"")||ce,message:a instanceof Error?a.message:"\u8BFB\u53D6\u5206\u652F\u5217\u8868\u5931\u8D25\u3002"};let u=await Ko(o,r,s.env);return console.log("[worker] [repo-branches] local fallback resolved",JSON.stringify({localPath:o,branchCount:u.branches.length,defaultBranch:u.defaultBranch})),{ok:!0,branches:u.branches,defaultBranch:u.defaultBranch}}catch(l){let c=H(l,t);console.log("[worker] [repo-branches] local fallback failed",JSON.stringify({localPath:o,error:c instanceof Error?c.message:"unknown"}))}return{ok:!1,branches:[],defaultBranch:te(r??"")||ce,message:a instanceof Error?a.message:"\u8BFB\u53D6\u5206\u652F\u5217\u8868\u5931\u8D25\u3002"}}finally{s.cleanup()}};import{readdir as ns,readFile as os,stat as es}from"node:fs/promises";import ts from"node:os";import K from"node:path";var Zo=e=>(e??"").trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||null;var Ll=["skills",".agents/skills",".codex/skills",".claude/skills",".cursor/skills",".opencode/skills"],Gl=new Set([".md",".txt",".json",".yml",".yaml",".ts",".tsx",".js",".jsx",".mjs",".cjs",".sh",".py",".rb"]),jl=e=>{let t=e.trim();return t?t==="~"?ts.homedir():t.startsWith("~/")?K.join(ts.homedir(),t.slice(2)):t:""},rs=e=>K.resolve(jl(e)),Hl=(e,t)=>{let r=K.relative(e,t);return r===""||!r.startsWith("..")&&!K.isAbsolute(r)},ql=e=>{let t=e.match(/^---\n([\s\S]*?)\n---/);if(!t)return{};let r={};for(let n of t[1].split(`
45
- `)){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},Fl=(e,t)=>{let r=ql(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:K.basename(t),description:r.description?.trim()||null}},Jl=e=>{let t=e.replace(/\\/g,"/");return t==="SKILL.md"?"skill":t.startsWith("references/")?"reference":t.startsWith("scripts/")?"script":t.startsWith("assets/")?"asset":"other"},zl=e=>e==="SKILL.md"?!0:Gl.has(K.extname(e).toLowerCase()),Vl=e=>e.some(t=>t.kind==="script")?"scripts_executables":e.some(t=>t.kind==="asset")?"assets":"markdown_only",ss=async e=>{let t=await ns(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 ss(K.join(e,n.name)));return r},Kl=async e=>{let t={},r=[],n=async o=>{let s=await ns(o,{withFileTypes:!0}).catch(()=>[]);for(let i of s){let a=K.join(o,i.name),l=K.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:l,kind:Jl(l)}),!zl(i.name))continue;let c=await os(a,"utf8").catch(()=>null);typeof c=="string"&&(t[l]=c)}};return await n(e),{files:t,inventory:r.sort((o,s)=>o.path.localeCompare(s.path))}},Xl=async e=>{let t=await os(K.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=Fl(t,e),{files:n,inventory:o}=await Kl(e);return{skill:{name:r.name,slug:Zo(r.name)??K.basename(e),description:r.description,markdown:t,sourceLocator:e,trustLevel:Vl(o),fileInventory:o,files:n}}},is=async(e,t)=>{let r=rs(e),n=rs(t);if(!Hl(r,n))return{ok:!1,rootPath:n,packages:[],warnings:[],message:"\u53EA\u80FD\u626B\u63CF\u8BE5\u6267\u884C\u8282\u70B9 workspace \u5185\u7684\u4ED3\u5E93\u76EE\u5F55\u3002"};try{if(!(await es(n)).isDirectory())return{ok:!1,rootPath:n,packages:[],warnings:[],message:"\u5F53\u524D\u8DEF\u5F84\u4E0D\u662F\u76EE\u5F55\u3002"}}catch{return{ok:!1,rootPath:n,packages:[],warnings:[],message:"\u76EE\u5F55\u4E0D\u5B58\u5728\u3002"}}let o=[],s=[];for(let i of Ll){let a=K.join(n,i);if(await es(a).then(c=>c.isDirectory()).catch(()=>!1))for(let c of await ss(a)){let{skill:u,warning:d}=await Xl(c);if(d){s.push(d);continue}u&&o.push(u)}}return o.sort((i,a)=>i.slug.localeCompare(a.slug)||i.sourceLocator.localeCompare(a.sourceLocator)),{ok:!0,rootPath: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"}};import{createHash as Yl}from"node:crypto";import{existsSync as ls,mkdirSync as Lr,rmSync as Ql}from"node:fs";import as from"node:os";import pe from"node:path";import{simpleGit as ds}from"simple-git";var Me="main",Zl=e=>{let t=e.trim();return t?t==="~"?as.homedir():t.startsWith("~/")?pe.join(as.homedir(),t.slice(2)):t:""},Ze=e=>pe.resolve(Zl(e)),us=e=>e==="original-dir"?"original-dir":"worktree",ed=e=>e.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"repo",td=e=>Yl("sha1").update(e).digest("hex").slice(0,12),ps=(e,t)=>{let r=t?pe.basename(t).replace(/\.git$/i,""):"repo";return pe.join(Ze(e),"repos",`${ed(r)}-${td(t||r)}`)},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},ge=(e,t)=>{let r={...de(t),...e?{baseDir:e}:{}};return ds(r).env(t??{})},rd=async(e,t,r)=>{let n=ge(e,r),[o,s]=await Promise.all([n.branch(["-a"]),n.branchLocal()]),i="";try{i=re(await n.raw(["symbolic-ref","--quiet","--short","refs/remotes/origin/HEAD"]))}catch{i=""}let a=Array.from(new Set(o.all.map(re).filter(Boolean))).sort((d,w)=>d.localeCompare(w)),l=re(t??""),c=re(s.current),u=[i,l,c,a[0],Me].find(d=>d&&(d===Me||a.includes(d)))??Me;return{branches:a,defaultBranch:u}},nd=e=>{for(let t of e.split(`
46
- `)){let r=t.trim();if(!r.startsWith("ref: "))continue;let[n]=r.split(" ");return re(n.slice(5))}return""},od=e=>Array.from(new Set(e.split(`
47
- `).map(t=>t.trim()).filter(Boolean).map(t=>t.split(" ")[1]||"").map(re).filter(Boolean))).sort((t,r)=>t.localeCompare(r)),sd=async(e,t,r)=>{if(t?.trim())return t.trim();let n=ge(e,r);return await n.checkIsRepo()&&(await n.getRemotes(!0)).find(s=>s.name==="origin")?.refs.fetch?.trim()||""},id=async(e,t,r,n)=>{let o=await sd(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=ge(void 0,n),[i,a]=await Promise.all([s.raw(["ls-remote","--heads",o]),s.raw(["ls-remote","--symref",o,"HEAD"])]),l=od(i),c=nd(a),u=re(r??""),d=[c,u,l[0],Me].find(w=>w&&(w===Me||l.includes(w)))??Me;return{branches:l,defaultBranch:d,remoteTarget:o}},ad=async(e,t,r,n)=>{try{let o=ge(e,n);if(await o.checkIsRepo())return console.log("[worker] [worktree] fetching target branch only",JSON.stringify({repoPath:e,remoteTarget:t,startPoint:r})),await o.fetch(["origin",`${r}:refs/remotes/origin/${r}`]),!0}catch{}return Lr(pe.dirname(e),{recursive:!0}),console.log("[worker] [worktree] cloning target branch only",JSON.stringify({repoPath:e,remoteTarget:t,startPoint:r})),await ge(void 0,n).clone(t,e,["--no-checkout","--single-branch","--branch",r]),!0},cd=async e=>{let t=ge(e.repoPath,e.env);if(!ls(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}},ld=async e=>{let t=await e.raw(["worktree","list","--porcelain"]),r=[],n=null;for(let o of t.split(`
48
- `)){if(o.startsWith("worktree ")){n&&r.push(n),n={path:pe.resolve(o.slice(9).trim())};continue}o.startsWith("branch ")&&n&&(n.branch=o.slice(7).trim())}return n&&r.push(n),r},dd=async(e,t)=>(await e.branchLocal()).all.includes(t),gs=e=>{Ql(e,{recursive:!0,force:!0,maxRetries:5,retryDelay:100})},cs=async(e,t,r)=>{let n=pe.resolve(t),o=`refs/heads/${r}`;try{await e.raw(["worktree","prune"])}catch{}let i=(await ld(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(gs(n),await dd(e,r))try{await e.deleteLocalBranch(r,!0)}catch{}try{await e.raw(["worktree","prune"])}catch{}Lr(pe.dirname(n),{recursive:!0})},ms=async e=>{let t=us(e.workingDirectoryMode),r=Ze(e.worktreePath),n=Ze(e.repoPath?.trim()||ps(e.workspaceRoot,e.repoUrl)),o=ae({taskId:`worktree-${Buffer.from(r).toString("base64url").slice(0,24)}`,identity:e.gitIdentity??{mode:"personal"},repoUrl:e.repoUrl});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")try{return await cd({repoPath:n,repoUrl:e.repoUrl,preferredBranch:e.preferredBranch,branchName:e.branchName,env:o.env})}catch(s){let i=H(s,e.repoUrl);return{ok:!1,message:i instanceof Error?i.message:"\u539F\u59CB\u76EE\u5F55\u51C6\u5907\u5931\u8D25\u3002",worktreePath:n}}finally{o.cleanup()}if(!e.repoPath?.trim()&&!e.repoUrl?.trim())return Lr(r,{recursive:!0}),{ok:!0,message:`\u5DF2\u51C6\u5907\u9879\u76EE\u76EE\u5F55 ${r}\u3002`,worktreePath:r};try{let s=await id(n,e.repoUrl,e.preferredBranch,o.env),i=re(e.preferredBranch??"")||s.defaultBranch,a=s.branches.includes(i)?i:s.defaultBranch;if(!s.branches.includes(a))return console.log("[worker] [worktree] ensure worktree skipped: branch not found",JSON.stringify({startPoint:a,availableBranches:s.branches})),{ok:!1,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`};console.log("[worker] [worktree] resolved remote start point",JSON.stringify({repoPath:n,remoteTarget:s.remoteTarget,requestedStartPoint:i,startPoint:a})),await ad(n,s.remoteTarget,a,o.env);let l=ge(n,o.env),c=`refs/remotes/origin/${a}`;return console.log("[worker] [worktree] creating fresh worktree",JSON.stringify({worktreePath:r,branchName:e.branchName,startPoint:a,startPointRef:c})),await cs(l,r,e.branchName),await l.raw(["worktree","add","--force","-B",e.branchName,r,c]),console.log("[worker] [worktree] worktree created",JSON.stringify({worktreePath:r,branchName:e.branchName,startPoint:a,startPointRef:c})),{ok:!0,message:`\u5DF2\u57FA\u4E8E ${a} \u521B\u5EFA worktree ${r} \u5E76\u5207\u51FA\u5206\u652F ${e.branchName}\u3002`,worktreePath:r}}catch(s){let i=H(s,e.repoUrl);console.log("[worker] [worktree] remote prepare failed",JSON.stringify({worktreePath:r,repoPath:n,error:i instanceof Error?i.message:"unknown"}));try{let a=ge(n,o.env);if(!await a.checkIsRepo())throw i instanceof Error?i:new Error("\u521B\u5EFA worktree \u5931\u8D25\u3002");let l=await rd(n,e.preferredBranch,o.env),c=re(e.preferredBranch??"")||l.defaultBranch,u=l.branches.includes(c)?c:l.defaultBranch;return l.branches.includes(u)?(console.log("[worker] [worktree] local fallback creating worktree",JSON.stringify({worktreePath:r,branchName:e.branchName,startPoint:u})),await cs(a,r,e.branchName),await a.raw(["worktree","add","--force","-B",e.branchName,r,u]),console.log("[worker] [worktree] local fallback worktree created",JSON.stringify({worktreePath:r,branchName:e.branchName,startPoint:u})),{ok:!0,message:`\u5DF2\u57FA\u4E8E ${u} \u521B\u5EFA worktree ${r} \u5E76\u5207\u51FA\u5206\u652F ${e.branchName}\u3002`,worktreePath:r}):(console.log("[worker] [worktree] local fallback skipped: branch not found",JSON.stringify({startPoint:u,availableBranches:l.branches})),{ok:!1,message:l.branches.length>0?`\u8D77\u59CB\u5206\u652F ${u} \u4E0D\u5B58\u5728\u3002\u5F53\u524D\u4ED3\u5E93\u5206\u652F\uFF1A${l.branches.join(", ")}`:`\u8D77\u59CB\u5206\u652F ${u} \u4E0D\u5B58\u5728\u3002`})}catch(a){let l=H(a,e.repoUrl);return console.log("[worker] [worktree] ensure worktree failed",JSON.stringify({worktreePath:r,error:l instanceof Error?l.message:"unknown"})),{ok:!1,message:l instanceof Error?l.message:"\u521B\u5EFA worktree \u5931\u8D25\u3002",worktreePath:r}}}finally{o.cleanup()}},fs=async e=>{let t=us(e.workingDirectoryMode),r=Ze(e.worktreePath),n=Ze(e.repoPath?.trim()||ps(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(ls(n)){let o=ds(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})),gs(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 ud=(e,t)=>{},et=e=>`prompt:${e}`,Gr=e=>e.workingDirectoryMode==="original-dir"?"original-dir":"worktree",hs=e=>{let{connection:t,executorId:r,sessionId:n,stream:o,chunk:s}=e;t.send({type:"executor.terminal.session.output",executorId:r,output:{sessionId:n,stream:o,chunk:s,at:new Date().toISOString()}})},me=ud;var ks=(e,t)=>{let r=t.getConfig(),n=t.getConnection(),o=()=>(r=b(),t.setConfig(r),r);return e.type==="executor.repo-probe.request"?(o(),Xo(e.localPath).then(s=>{n?.send({type:"executor.repo-probe.response",executorId:r.executorId,requestId:e.requestId,result:s,at:new Date().toISOString()})}),!0):e.type==="executor.git.pat.verify.request"?(o(),Wo(e.patToken,e.provider,e.host).then(s=>{n?.send({type:"executor.git.pat.verify.response",executorId:r.executorId,requestId:e.requestId,result:s,at:new Date().toISOString()})}),!0):e.type==="executor.directory-browse.request"?(o(),Yo(e.rootPath||r.workspaceRoot,e.directoryPath).then(s=>{n?.send({type:"executor.directory-browse.response",executorId:r.executorId,requestId:e.requestId,result:s,at:new Date().toISOString()})}),!0):e.type==="executor.skills.scan.request"?(o(),is(r.workspaceRoot,e.rootPath).then(s=>{n?.send({type:"executor.skills.scan.response",executorId:r.executorId,requestId:e.requestId,result:s,at:new Date().toISOString()})}),!0):e.type==="executor.repo-branches.request"?(o(),console.log("[worker] [repo-branches] request received",JSON.stringify({requestId:e.requestId,executorId:r.executorId,localPath:e.localPath,repoUrl:e.repoUrl,preferredBranch:e.preferredBranch})),Qo(e.localPath,e.repoUrl,e.preferredBranch,e.gitIdentity).then(s=>{console.log("[worker] [repo-branches] request resolved",JSON.stringify({requestId:e.requestId,executorId:r.executorId,ok:s.ok,branchCount:s.branches.length,defaultBranch:s.defaultBranch,message:s.message})),n?.send({type:"executor.repo-branches.response",executorId:r.executorId,requestId:e.requestId,result:s,at:new Date().toISOString()})}),!0):e.type==="executor.git.diff.request"?(o(),Go({worktreePath:e.worktreePath,repoUrl:e.repoUrl,baseBranch:e.baseBranch,gitIdentity:e.gitIdentity}).then(s=>{n?.send({type:"executor.git.diff.response",executorId:r.executorId,requestId:e.requestId,result:s,at:new Date().toISOString()})}),!0):e.type==="executor.git.commit-diff.request"?(o(),jo({worktreePath:e.worktreePath,repoUrl:e.repoUrl,commitSha:e.commitSha,gitIdentity:e.gitIdentity}).then(s=>{n?.send({type:"executor.git.commit-diff.response",executorId:r.executorId,requestId:e.requestId,result:s,at:new Date().toISOString()})}),!0):e.type==="executor.git.rebase.request"?(o(),Ho({worktreePath:e.worktreePath,repoUrl:e.repoUrl,baseBranch:e.baseBranch,gitIdentity:e.gitIdentity}).then(s=>{n?.send({type:"executor.git.rebase.response",executorId:r.executorId,requestId:e.requestId,result:s,at:new Date().toISOString()})}),!0):e.type==="executor.git.graph.request"?(o(),qo({worktreePath:e.worktreePath,repoUrl:e.repoUrl,baseBranch:e.baseBranch,limit:e.limit,gitIdentity:e.gitIdentity}).then(s=>{n?.send({type:"executor.git.graph.response",executorId:r.executorId,requestId:e.requestId,result:s,at:new Date().toISOString()})}),!0):e.type==="executor.git.push.request"?(o(),Fo({worktreePath:e.worktreePath,repoUrl:e.repoUrl,branchName:e.branchName,gitIdentity:e.gitIdentity}).then(s=>{n?.send({type:"executor.git.push.response",executorId:r.executorId,requestId:e.requestId,result:s,at:new Date().toISOString()})}),!0):e.type==="executor.git.pull-request.request"?(o(),Jo({worktreePath:e.worktreePath,repoUrl:e.repoUrl,title:e.title,body:e.body,baseBranch:e.baseBranch,compareBranch:e.compareBranch,gitIdentity:e.gitIdentity}).then(s=>{n?.send({type:"executor.git.pull-request.response",executorId:r.executorId,requestId:e.requestId,result:s,at:new Date().toISOString()})}),!0):e.type==="executor.worktree.ensure.request"?(o(),ms({workspaceRoot:r.workspaceRoot,repoPath:e.repoPath,repoUrl:e.repoUrl,preferredBranch:e.preferredBranch,branchName:e.branchName,worktreePath:e.worktreePath,gitIdentity:e.gitIdentity,workingDirectoryMode:Gr(e)}).then(s=>{n?.send({type:"executor.worktree.ensure.response",executorId:r.executorId,requestId:e.requestId,result:s,at:new Date().toISOString()})}),!0):e.type==="executor.worktree.cleanup.request"?(o(),fs({workspaceRoot:r.workspaceRoot,repoPath:e.repoPath,repoUrl:e.repoUrl,worktreePath:e.worktreePath,workingDirectoryMode:Gr(e)}).then(s=>{n?.send({type:"executor.worktree.cleanup.response",executorId:r.executorId,requestId:e.requestId,result:s,at:new Date().toISOString()})}),!0):e.type==="executor.browser.run.request"?(o(),r.executorToken?.trim()?(It({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(s=>{n?.send({type:"executor.browser.run.response",executorId:r.executorId,requestId:e.requestId,result:s,at:new Date().toISOString()})}),!0):(n?.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};import{randomUUID as jr}from"node:crypto";import{spawn as md}from"node:child_process";import{existsSync as tt}from"node:fs";import pd from"node:path";var gd=()=>{let e=ut(),t=Ue();if(tt(t))return{launcherPath:tt(e)?e:void 0,runnerPath:process.execPath,entryPath:t};let r=oe("tsx"),n=pd.join(X(),"apps","worker","src","index.ts");return r&&tt(n)?{launcherPath:tt(e)?e:void 0,runnerPath:r,entryPath:n}:{launcherPath:tt(e)?e:void 0,runnerPath:void 0,entryPath:void 0}},Ht=()=>{let e=gd();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 qt=e=>oe(e),rt=e=>{try{return JSON.parse(e)}catch{return null}},M=(e,t,r)=>{t?.({agentType:e,...r})},nt=()=>{let e=new Error("\u4EFB\u52A1\u5DF2\u53D6\u6D88");return e.name="AbortError",e},Oe=e=>{let t=e?.trim();if(!(!t||t==="default"))return t};var fd=new Set(["Glob","Grep","LS","NotebookRead","Read","Task","TodoRead"]),hd=new Set(["Edit","MultiEdit","TodoWrite","Write"]),kd=e=>e.split("(")[0]?.trim()||e.trim(),yd=e=>e?.planMode?"plan":e?.permissionMode??"bypassPermissions",wd=e=>e==="bypassPermissions"&&typeof process.getuid=="function"&&process.getuid()===0?"acceptEdits":e,xd=(e,t)=>{let r=kd(t);return!!(e==="bypassPermissions"||fd.has(r)||e==="acceptEdits"&&hd.has(r))},ot=(e,t)=>{e.write(`${JSON.stringify(t)}
49
- `)},ys=async e=>{let t=qt("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)??Oe(r?.defaultModel),o=yd(r),s=wd(o),i=["-p","--output-format=stream-json","--input-format=stream-json","--verbose","--include-partial-messages","--replay-user-messages","--permission-mode",s,...e.runtimeArgs??[]];return n&&i.push("--model",n),new Promise((a,l)=>{let c=md(t,i,{cwd:e.cwd,env:{...Ht(),...e.runtimeEnv??{}},stdio:["pipe","pipe","pipe"]}),u="",d="",w="",p="",x="",h="",m=!1,k=new Map,S=new Map,E=()=>(p=p||`${w||"claude"}:assistant`,M("ClaudeCode",e.onEvent,{type:"message.updated",properties:{info:{id:p,role:"assistant"}}}),p),G=(P,A,$,g)=>{M("ClaudeCode",e.onEvent,{type:"message.part.updated",properties:{part:{id:A,messageID:E(),type:P,text:$},delta:g}})},F=P=>{ot(c.stdin,{type:"control_response",response:P})},R=P=>{if(P.type!=="control_request")return;if(P.request.subtype==="hook_callback"){F({subtype:"success",request_id:P.request_id,response:{}});return}let A=P.request.tool_name,$=xd(s,A);$||M("ClaudeCode",e.onEvent,{type:"permission.updated",properties:{title:A}}),F({subtype:"success",request_id:P.request_id,response:$?{behavior:"allow",updatedInput:P.request.input}:{behavior:"deny",message:`\u5F53\u524D\u4F1A\u8BDD\u672A\u542F\u7528 ${A} \u6743\u9650\u3002`,interrupt:!1}})},C=()=>{ot(c.stdin,{type:"control_request",request_id:jr(),request:{subtype:"interrupt"}}),setTimeout(()=>{c.killed||c.kill("SIGTERM")},250)};e.signal?.addEventListener("abort",C,{once:!0});let v=P=>{let A=P.trim();if(!A)return;let $=rt(A);if($?.type==="control_request"||$?.type==="control_cancel_request"){R($);return}let g=rt(A);if(g){if(g.session_id&&(w=g.session_id),g.type==="system"&&g.subtype==="init"){M("ClaudeCode",e.onEvent,{type:"session.status",properties:{status:{type:"busy",message:"Claude Code \u4F1A\u8BDD\u5DF2\u5C31\u7EEA"}}});return}if(g.type==="stream_event"){let y=g.event,f=`${w||"claude"}:${y.index??0}`;if(y.type==="content_block_delta"&&y.delta?.type==="thinking_delta"){let T=`${S.get(f)??""}${y.delta.thinking??""}`;S.set(f,T),G("reasoning",`${f}:thinking`,T,y.delta.thinking??"");return}if(y.type==="content_block_delta"&&y.delta?.type==="text_delta"){let T=`${k.get(f)??""}${y.delta.text??""}`;k.set(f,T),x=T.trim()||x,G("text",`${f}:text`,T,y.delta.text??"");return}y.type==="content_block_start"&&y.content_block?.type==="tool_use"&&M("ClaudeCode",e.onEvent,{type:"message.part.updated",properties:{part:{id:y.content_block.id??`${f}:tool`,messageID:E(),type:"tool",tool:y.content_block.name??"tool",state:{status:"running"}}}});return}if(g.type==="assistant"){w=g.session_id??w,p=g.message?.id??E();let y=Array.isArray(g.message?.content)?g.message.content:[];for(let f of y)f.type==="text"&&f.text?.trim()&&(x=f.text.trim(),G("text",`${p}:final`,x)),f.type==="tool_use"&&M("ClaudeCode",e.onEvent,{type:"message.part.updated",properties:{part:{id:f.id??`${p}:tool`,messageID:E(),type:"tool",tool:f.name??"tool",state:{status:"running",raw:f.input?JSON.stringify(f.input,null,2):void 0}}}});return}if(g.type==="user"){let y=Array.isArray(g.message?.content)?g.message.content:[],f=y.find(T=>T.tool_use_id)?.tool_use_id;if(!f)return;M("ClaudeCode",e.onEvent,{type:"message.part.updated",properties:{part:{id:f,messageID:E(),type:"tool",tool:"tool",state:{status:"completed",output:y.find(T=>T.tool_use_id===f)?.content}}}});return}if(g.type==="result"){if(m=!g.is_error,g.result?.trim()&&(x=g.result.trim()),g.is_error){h=g.result?.trim()||"Claude Code \u6267\u884C\u5931\u8D25",M("ClaudeCode",e.onEvent,{type:"session.error",properties:{error:h}});return}M("ClaudeCode",e.onEvent,{type:"session.status",properties:{status:{type:"idle",message:"Claude Code \u5DF2\u5B8C\u6210"}}}),c.killed||c.kill("SIGTERM")}}};c.stdout.on("data",P=>{u+=P.toString();let A=u.split(`
50
- `);u=A.pop()??"";for(let $ of A)v($)}),c.stderr.on("data",P=>{d+=P.toString()}),c.on("error",P=>{e.signal?.removeEventListener("abort",C),l(P)}),c.on("close",P=>{if(e.signal?.removeEventListener("abort",C),u.trim()&&v(u),e.signal?.aborted){l(nt());return}if(!m&&P!==0||h){l(new Error(h||d.trim().split(`
51
- `).filter(Boolean).at(-1)||`Claude Code \u6267\u884C\u5931\u8D25\uFF08\u9000\u51FA\u7801 ${P??-1}\uFF09`));return}a({output:x||d.trim().split(`
52
- `).filter(Boolean).at(-1)||"Claude Code \u672A\u8FD4\u56DE\u6587\u672C\u8F93\u51FA\u3002",sessionId:w||void 0})}),ot(c.stdin,{type:"control_request",request_id:jr(),request:{subtype:"initialize"}}),ot(c.stdin,{type:"control_request",request_id:jr(),request:{subtype:"set_permission_mode",mode:s}}),ot(c.stdin,{type:"user",message:{role:"user",content:e.prompt}})})};import{spawn as Cd}from"node:child_process";var Sd=(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:!1}},bd=e=>({mode:"default",settings:{model:e,reasoning_effort:null,developer_instructions:null}}),vd=e=>e==="never"?{command:"acceptForSession",fileChange:"acceptForSession"}:{command:"decline",fileChange:"decline"},Pd=e=>{let t=e.error?.message?.trim();if(t)return t;let r=e.error?.details?.trim();return r||(e.status==="failed"?"Codex \u6267\u884C\u5931\u8D25":"")},ws=(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}})},xs=(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}})},Cs=(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}}}})},Hr=(e,t)=>{e.stdin.write(`${JSON.stringify(t)}
53
- `)},Ss=async e=>{let t=qt("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)??Oe(r?.defaultModel),o=vd(r?.approval);return new Promise((s,i)=>{let a=Cd(t,["app-server",...e.runtimeArgs??[]],{cwd:e.cwd,env:{...Ht(),...e.runtimeEnv??{}},stdio:["pipe","pipe","pipe"]}),l=1,c="",u="",d="",w="",p="",x=!1,h="",m=new Map,k=new Map,S=new Map,E=g=>{for(let y of m.values())y.reject(g);m.clear()},G=(g,y)=>{let f=l++;return Hr(a,{jsonrpc:"2.0",id:f,method:g,params:y}),new Promise((T,dt)=>{m.set(f,{resolve:gi=>T(gi),reject:dt})})},F=(g,y)=>{Hr(a,{jsonrpc:"2.0",id:g,result:y})},R=()=>{a.killed||a.kill("SIGTERM")},C=()=>{R()};e.signal?.addEventListener("abort",C,{once:!0});let v=g=>{if(g.method==="item/commandExecution/requestApproval"){let y=g.params??{};o.command==="decline"&&M("Codex",e.onEvent,{type:"permission.updated",properties:{title:y.reason?.trim()||y.command?.trim()||"\u547D\u4EE4\u6267\u884C\u6743\u9650"}}),F(g.id,{decision:o.command});return}if(g.method==="item/fileChange/requestApproval"){let y=g.params??{};o.fileChange==="decline"&&M("Codex",e.onEvent,{type:"permission.updated",properties:{title:y.reason?.trim()||"\u6587\u4EF6\u4FEE\u6539\u6743\u9650"}}),F(g.id,{decision:o.fileChange});return}if(g.method==="item/tool/requestUserInput"){let y=g.params??{};M("Codex",e.onEvent,{type:"permission.updated",properties:{title:y.questions?.[0]?.header?.trim()||y.questions?.[0]?.question?.trim()||"\u7B49\u5F85\u7528\u6237\u8F93\u5165"}}),F(g.id,{answers:{}});return}F(g.id,null)},P=(g,y)=>{if(g.type==="agentMessage"){let f=g;h=f.id,k.set(f.id,f.text),f.text.trim()&&(w=f.text.trim()),ws(e,f.id,f.text);return}if(g.type==="reasoning"){let f=g,T=f.summary?.join("")||f.content?.join("")||"";T&&(S.set(f.id,T),xs(e,h||`${d||"codex"}:assistant`,`${f.id}:reasoning`,T));return}if(g.type==="commandExecution"){let f=g,T=y==="started"?"running":f.status==="completed"?"completed":"error";Cs(e,h||void 0,f,T,f.aggregatedOutput??void 0,f.status==="failed"||f.status==="declined"?f.aggregatedOutput||`\u547D\u4EE4\u5931\u8D25\uFF08\u9000\u51FA\u7801 ${f.exitCode??-1}\uFF09`:void 0);return}if(g.type==="fileChange"){let f=g,T=y==="started"?"running":f.status==="success"?"completed":"error";Cs(e,h||void 0,f,T,JSON.stringify(f.changes??[],null,2),f.status==="failed"||f.status==="declined"?"\u6587\u4EF6\u4FEE\u6539\u672A\u5B8C\u6210":void 0)}},A=async g=>{if(g.method==="thread/started"){d=g.params.thread.id;return}if(g.method==="turn/started"){let y=g.params;d=d||y.threadId,M("Codex",e.onEvent,{type:"session.status",properties:{status:{type:"busy",message:"Codex \u6B63\u5728\u5904\u7406\u8BF7\u6C42"}}});return}if(g.method==="item/started"){P(g.params.item,"started");return}if(g.method==="item/completed"){P(g.params.item,"completed");return}if(g.method==="item/agentMessage/delta"){let y=g.params;h=y.itemId;let f=`${k.get(y.itemId)??""}${y.delta??""}`;k.set(y.itemId,f),f.trim()&&(w=f.trim()),ws(e,y.itemId,f,y.delta);return}if(g.method==="item/reasoning/textDelta"||g.method==="item/reasoning/summaryTextDelta"){let y=g.params,f=g.method==="item/reasoning/textDelta"?`content:${y.contentIndex??0}`:`summary:${y.summaryIndex??0}`,T=`${y.itemId}:reasoning:${f}`,dt=`${S.get(T)??""}${y.delta??""}`;S.set(T,dt),xs(e,h||`${d||"codex"}:assistant`,T,dt,y.delta);return}if(g.method==="turn/completed"){let y=g.params;d=d||y.threadId,x=y.turn.status==="completed",y.turn.status==="failed"?(p=Pd(y.turn)||"Codex \u6267\u884C\u5931\u8D25",M("Codex",e.onEvent,{type:"session.error",properties:{error:p}})):M("Codex",e.onEvent,{type:"session.status",properties:{status:{type:"idle",message:"Codex \u5DF2\u5B8C\u6210"}}}),R();return}g.method==="error"&&(p=g.params.message?.trim()||"Codex \u6267\u884C\u5931\u8D25",M("Codex",e.onEvent,{type:"session.error",properties:{error:p}}),R())},$=g=>{let y=g.trim();if(!y)return;let f=rt(y);if(f){if(typeof f.id<"u"&&(typeof f.result<"u"||typeof f.error<"u")){let T=m.get(f.id);if(!T)return;if(m.delete(f.id),f.error){T.reject(new Error(f.error.message||"Codex app-server \u8BF7\u6C42\u5931\u8D25"));return}T.resolve(f.result);return}if(typeof f.id<"u"&&typeof f.method=="string"){v(f);return}typeof f.method=="string"&&A(f)}};a.stdout.on("data",g=>{c+=g.toString();let y=c.split(`
54
- `);c=y.pop()??"";for(let f of y)$(f)}),a.stderr.on("data",g=>{u+=g.toString()}),a.on("error",g=>{e.signal?.removeEventListener("abort",C),E(g),i(g)}),a.on("close",g=>{if(e.signal?.removeEventListener("abort",C),c.trim()&&$(c),e.signal?.aborted){E(nt()),i(nt());return}if(!x||p){let y=new Error(p||u.trim().split(`
55
- `).filter(Boolean).at(-1)||`Codex \u6267\u884C\u5931\u8D25\uFF08\u9000\u51FA\u7801 ${g??-1}\uFF09`);E(y),i(y);return}E(new Error("Codex \u4F1A\u8BDD\u5DF2\u7ED3\u675F")),s({output:w||"Codex \u672A\u8FD4\u56DE\u6587\u672C\u8F93\u51FA\u3002",sessionId:d||void 0})}),(async()=>{try{await G("initialize",{clientInfo:{name:"vibemux-worker",version:"0.1.1"},capabilities:{experimentalApi:!0}}),Hr(a,{jsonrpc:"2.0",method:"initialized"});let g=await G("account/read",{refreshToken:!1});if(g.requiresOpenaiAuth&&!g.account)throw new Error("Codex \u9700\u8981\u5148\u767B\u5F55\u540E\u624D\u80FD\u6267\u884C\u3002");let y=await G("thread/start",Sd(e.cwd,n,r));d=y.thread.id,await G("turn/start",{threadId:d,input:[{type:"text",text:e.prompt,text_elements:[]}],collaborationMode:bd(y.model)})}catch(g){p=g instanceof Error?g.message:"Codex \u521D\u59CB\u5316\u5931\u8D25",M("Codex",e.onEvent,{type:"session.error",properties:{error:p}}),R()}})()})};import{mkdtemp as Id,mkdir as Td,rm as bs,writeFile as Ed}from"node:fs/promises";import Rd from"node:os";import st from"node:path";var Ad={"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"},Md=(e,t)=>{let r=st.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}`},Od=(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()},Bd=(e,t)=>{let r=st.extname(e);return r||t&&Ad[t]||""},vs=async e=>{let t=e.attachments??[];if(t.length===0)return{attachments:[],cleanup:async()=>{}};let r=st.join(Rd.tmpdir(),"vibemux-task-chat-attachments-");await Td(st.dirname(r),{recursive:!0});let n=await Id(r);try{return{attachments:await Promise.all(t.map(async(s,i)=>{let a=Od(e.cloudUrl,s.url),l=await fetch(a,{signal:e.signal});if(!l.ok)throw new Error(`\u56FE\u7247\u9644\u4EF6\u4E0B\u8F7D\u5931\u8D25\uFF1A${s.filename}`);let c=l.headers.get("content-type")?.split(";")[0]?.trim()||s.contentType,u=Bd(s.filename,c),d=Md(`${i+1}-${s.filename||`image-${i+1}`}${u&&!s.filename.endsWith(u)?u:""}`,`image-${i+1}`),w=st.join(n,d),p=Buffer.from(await l.arrayBuffer());return await Ed(w,p),{...s,contentType:c,absoluteUrl:a,localPath:w}})),cleanup:async()=>{await bs(n,{recursive:!0,force:!0})}}}catch(o){throw await bs(n,{recursive:!0,force:!0}).catch(()=>{}),o}},Ps=(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(`
56
- `)};import{copyFileSync as _d,existsSync as Be,mkdirSync as Ft,mkdtempSync as Is,readFileSync as Jr,rmSync as it,writeFileSync as Ts}from"node:fs";import qr from"node:os";import W from"node:path";var Es=".vibemux-managed.json",Wd="VIBEMUX_CODEX_MCP_TOKEN_",Rs={OpenCode:".opencode/skills",Codex:".codex/skills",ClaudeCode:".claude/skills"},ve=e=>e.replace(/\\/g,"\\\\").replace(/"/g,'\\"'),Fr=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("/")},$d=e=>e.startsWith("sse://")?`http://${e.slice(6)}`:e.trim(),Ud=e=>/^https?:\/\//i.test(e)||/^sse:\/\//i.test(e),zr=(e,t)=>{Ft(W.dirname(e),{recursive:!0}),Ts(e,`${JSON.stringify(t,null,2)}
57
- `,"utf8")},Jt=(e,t)=>{Ft(W.dirname(e),{recursive:!0}),Ts(e,t,"utf8")},Dd=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}},Nd=(e,t)=>{if(typeof t=="string"){Jt(e,t);return}it(e,{force:!0})},Ld=e=>{let t=W.join(e,Es);if(!Be(t))return[];try{let r=JSON.parse(Jr(t,"utf8"));return Array.isArray(r.slugs)?r.slugs.filter(n=>typeof n=="string"&&n.trim().length>0):[]}catch{return[]}},Gd=(e,t)=>{zr(W.join(e,Es),{slugs:t})},jd=(e,t,r)=>{let n=Rs[e],o=W.join(t,n);Ft(o,{recursive:!0});for(let i of Ld(o))it(W.join(o,i),{recursive:!0,force:!0});let s=[];for(let i of r){let a=Fr(i.slug);if(!a)continue;s.push(a);let l=W.join(o,a);it(l,{recursive:!0,force:!0}),Ft(l,{recursive:!0});for(let[c,u]of Object.entries(i.files)){let d=Fr(c);if(!d)continue;let w=W.resolve(l,d);w!==l&&!w.startsWith(`${l}${W.sep}`)||Jt(w,u)}Be(W.join(l,"SKILL.md"))||Jt(W.join(l,"SKILL.md"),i.markdown)}Gd(o,s)},Hd=(e,t)=>{if(t.length===0)return"";let r=Rs[e].replace(/\\/g,"/");return["\u5F53\u524D\u4F1A\u8BDD\u53EF\u8BBF\u95EE\u4EE5\u4E0B Vibemux Skills\uFF1A",...t.map(n=>`- ${n.name} (@${n.slug}) -> ${r}/${n.slug}/SKILL.md`),"\u4EC5\u5728\u7528\u6237\u660E\u786E\u63D0\u5230\u67D0\u4E2A skill \u540D\u79F0\u6216 @slug\uFF0C\u6216\u5F53\u524D\u4EFB\u52A1\u4E0E\u8BE5 skill \u660E\u663E\u5339\u914D\u65F6\uFF0C\u518D\u8BFB\u53D6\u5BF9\u5E94 SKILL.md \u4E0E\u9644\u52A0\u6587\u4EF6\u3002","\u4E0D\u8981\u4E3A\u4E86\u8BFB\u53D6 skill \u800C\u8BFB\u53D6\uFF1B\u4E0D\u76F8\u5173\u65F6\u6309\u5E38\u89C4\u65B9\u5F0F\u56DE\u7B54\u6216\u6267\u884C\u3002"].join(`
58
- `)},qd=e=>{let t=(e.mcpServers??[]).filter(r=>r.enabled);return t.length===0?"":["\u5F53\u524D\u4F1A\u8BDD\u5DF2\u542F\u7528\u4EE5\u4E0B\u5168\u5C40 MCP\uFF1A",...t.map(r=>`- ${r.name}`),"\u4EC5\u5728\u9700\u8981\u771F\u5B9E\u9879\u76EE\u72B6\u6001\u3001\u5916\u90E8\u8D44\u6E90\u3001\u7CFB\u7EDF\u64CD\u4F5C\uFF0C\u6216\u7528\u6237\u660E\u786E\u8981\u6C42\u4F7F\u7528\u67D0\u4E2A MCP \u65F6\uFF0C\u518D\u8C03\u7528\u5BF9\u5E94\u5DE5\u5177\u3002","\u7EAF\u89E3\u91CA\u3001\u603B\u7ED3\u3001\u666E\u901A\u5BF9\u8BDD\u4E0D\u9700\u8981\u4E3A\u4E86\u8C03\u7528\u800C\u8C03\u7528 MCP\u3002"].join(`
59
- `)},Fd=e=>{let t=[],r={},n=0;for(let o of e.mcpServers??[]){if(!o.enabled)continue;let s=Fr(o.id||o.name).replace(/\//g,"-");if(!s)continue;if(o.transport==="stdio"||o.target.startsWith("stdio://")){let a=o.target.replace(/^stdio:\/\//,"").trim();if(!a)continue;t.push(`[mcp_servers."${ve(s)}"]`,'command = "sh"',`args = ["-lc", "${ve(a)}"]`,"");continue}if(o.target===ke){if(!e.executorToken?.trim())continue;let a=`${Wd}${n}`;n+=1,r[a]=e.executorToken.trim(),t.push(`[mcp_servers."${ve(s)}"]`,`url = "${ve(`${e.cloudUrl.replace(/\/+$/,"")}/mcp/executor`)}"`,`bearer_token_env_var = "${a}"`,"");continue}if(!Ud(o.target))continue;let i=$d(o.target);i&&t.push(`[mcp_servers."${ve(s)}"]`,`url = "${ve(i)}"`,"")}return{configText:t.join(`
60
- `),env:r}},Jd=(e,t)=>{let r=De(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)},{})}},zd=(e,t)=>{let r=Is(W.join(qr.tmpdir(),"vibemux-codex-")),n=process.env.CODEX_HOME?.trim()||W.join(qr.homedir(),".codex"),o=W.join(n,"config.toml"),s=W.join(n,"auth.json"),i=W.join(r,"config.toml"),a=W.join(r,"auth.json");Be(s)&&_d(s,a);let l=t.codexConfigContent?.trim()||(Be(o)?Jr(o,"utf8").trim():""),c=[`[projects."${ve(e)}"]`,'trust_level = "trusted"'].join(`
61
- `),u=Fd(t),d=[l,c,u.configText].filter(w=>w.trim());return Jt(i,`${d.join(`
53
+ `).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)},wi=async(e,t)=>{let r=Ie(t)||Ct;try{await e.fetch(["origin",`${r}:refs/remotes/origin/${r}`])}catch{}let n=[`refs/remotes/origin/${r}`,`origin/${r}`,`refs/heads/${r}`,r];for(let o of n)try{return await e.raw(["rev-parse","--verify",o]),{baseBranch:r,baseRef:o}}catch{}throw new Error(`\u627E\u4E0D\u5230\u57FA\u7EBF\u5206\u652F ${r}\u3002`)},Pt=async e=>{let t=await e.branchLocal();return Ie(t.current)||"HEAD"},kp=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}},yp=async(e,t)=>{try{return(await e.raw(["rev-list","--parents","-n","1",t])).trim().split(/\s+/).filter(Boolean)[1]}catch{return}},wp=async e=>{try{return(await e.raw(["diff","--name-only","--diff-filter=U"])).split(`
54
+ `).map(r=>r.trim()).filter(Boolean)}catch{return[]}},Sp=e=>{let t=e.trim();return!t.startsWith("(")||!t.endsWith(")")?[]:t.slice(1,-1).split(",").map(r=>r.trim()).filter(Boolean)},xp=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},Cp=e=>e.split("").map(t=>t.trim()).filter(Boolean).map(t=>{let[r="",n="",o="",s="",i="",a=""]=t.split(""),c=Sp(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"))}}),ot=async e=>{let t=fp(e.worktreePath),r=ge({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=hp(t,r.env);return await e.run(n)}finally{r.cleanup(t)}},Si=async e=>{try{return await ot({...e,taskKey:"git-diff",run:async t=>{let{baseBranch:r,baseRef:n}=await wi(t,e.baseBranch),o=await Pt(t),[s,i,a,c]=await Promise.all([t.raw(["diff","--numstat","--find-renames","--merge-base",n,"HEAD"]),t.raw(["diff","--name-status","--find-renames","--merge-base",n,"HEAD"]),t.raw(["diff","--find-renames","--merge-base",n,"HEAD"]),kp(t,n)]),l=yi(s,i);return{ok:!0,message:l.length>0?`\u5DF2\u751F\u6210\u76F8\u5BF9 ${r} \u7684\u5DEE\u5F02\u3002`:`\u5F53\u524D\u5206\u652F\u76F8\u5BF9 ${r} \u6CA1\u6709\u5DEE\u5F02\u3002`,baseBranch:r,currentBranch:o,aheadCommits:c,files:l,patch:a}}})}catch(t){let r=F(t,e.repoUrl);return{ok:!1,message:r instanceof Error?r.message:"\u8BFB\u53D6 Git diff \u5931\u8D25\u3002",baseBranch:Ie(e.baseBranch)||Ct,currentBranch:"HEAD",aheadCommits:0,files:[],patch:""}}},xi=async e=>{try{return await ot({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 yp(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=yi(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=F(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:""}}},Ci=async e=>{try{return await ot({...e,taskKey:"git-rebase",run:async t=>{let{baseBranch:r,baseRef:n}=await wi(t,e.baseBranch),o=await Pt(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 wp(t),a=F(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=F(t,e.repoUrl);return{ok:!1,message:r instanceof Error?r.message:"\u6267\u884C rebase \u5931\u8D25\u3002",baseBranch:Ie(e.baseBranch)||Ct,currentBranch:"HEAD",conflicts:!1,conflictedFiles:[]}}},Pi=async e=>{let t=Math.min(120,Math.max(10,e.limit??40));try{return await ot({...e,taskKey:"git-graph",run:async r=>{let n=await Pt(r),o=Ie(e.baseBranch)||Ct,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=Cp(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=F(r,e.repoUrl);return{ok:!1,message:n instanceof Error?n.message:"\u8BFB\u53D6 Git graph \u5931\u8D25\u3002",baseBranch:Ie(e.baseBranch)||Ct,currentBranch:"HEAD",limit:t,commitCount:0,graph:"",commits:[]}}},vi=async e=>{try{return await ot({...e,taskKey:"git-push",run:async t=>{let r=e.branchName?.trim()||await Pt(t),n=Ie(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=F(t,e.repoUrl);return{ok:!1,message:r instanceof Error?r.message:"\u63A8\u9001\u5206\u652F\u5931\u8D25\u3002",branchName:e.branchName?.trim()||"",remoteBranch:""}}},Ii=async e=>{try{return await ot({worktreePath:e.worktreePath,repoUrl:e.repoUrl,gitIdentity:e.gitIdentity,taskKey:"git-pull-request",run:async t=>{let r=xp(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 Pt(t),o=Ie(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=F(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 Pp,readdir as vp,stat as mr}from"node:fs/promises";import _n from"node:os";import je from"node:path";import{simpleGit as bi}from"simple-git";var me="main",Ip=e=>{let t=e.trim();return t?t==="~"?_n.homedir():t.startsWith("~/")?je.join(_n.homedir(),t.slice(2)):t:""},be=e=>je.resolve(Ip(e)),Dn=(e,t)=>{let r=je.relative(e,t);return r===""||!r.startsWith("..")&&!je.isAbsolute(r)},bp=e=>{let t=be(e),r=be(_n.homedir());return Dn(r,t)?r:t},Ep=(e,t)=>{let r=be(e),n=t?.trim()?be(t):r;return{resolvedRootPath:r,requestedPath:n}},se=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},vt=(e,t)=>{let r={...Ce(t),...e?{baseDir:e}:{}};return bi(r).env(t??{})},Wn=async(e,t,r)=>{let n=vt(e,r),[o,s]=await Promise.all([n.branch(["-a"]),n.branchLocal()]),i="";try{i=se(await n.raw(["symbolic-ref","--quiet","--short","refs/remotes/origin/HEAD"]))}catch{i=""}let a=Array.from(new Set(o.all.map(se).filter(Boolean))).sort((d,S)=>d.localeCompare(S)),c=se(t??""),l=se(s.current),u=[i,c,l,a[0],me].find(d=>d&&(d===me||a.includes(d)))??me;return{branches:a,defaultBranch:u}},Rp=e=>{for(let t of e.split(`
55
+ `)){let r=t.trim();if(!r.startsWith("ref: "))continue;let[n]=r.split(" ");return se(n.slice(5))}return""},Tp=e=>Array.from(new Set(e.split(`
56
+ `).map(t=>t.trim()).filter(Boolean).map(t=>t.split(" ")[1]||"").map(se).filter(Boolean))).sort((t,r)=>t.localeCompare(r)),Ap=async(e,t,r)=>{if(t?.trim())return t.trim();let n=vt(e,r);return await n.checkIsRepo()&&(await n.getRemotes(!0)).find(s=>s.name==="origin")?.refs.fetch?.trim()||""},Mp=async(e,t,r)=>{if(t?.trim())return!1;let n=vt(e,r);return await n.checkIsRepo().catch(()=>!1)?!(await n.getRemotes(!0).catch(()=>[])).some(s=>s.name==="origin"&&s.refs.fetch?.trim()):!1},Op=async(e,t,r,n)=>{let o=await Ap(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=vt(void 0,n),[i,a]=await Promise.all([s.raw(["ls-remote","--heads",o]),s.raw(["ls-remote","--symref",o,"HEAD"])]),c=Tp(i),l=Rp(a),u=se(r??""),d=[l,u,c[0],me].find(S=>S&&(S===me||c.includes(S)))??me;return{branches:c,defaultBranch:d,remoteTarget:o}},Ei=async e=>{let t=be(e);try{if(!(await mr(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=je.basename(t);try{let n=bi(t);if(!await n.checkIsRepo())return{ok:!0,path:t,name:r,versionControl:"none",message:"\u76EE\u5F55\u65E0 Git \u4ED3\u5E93"};let i=(await n.getRemotes(!0)).find(d=>d.name==="origin"),a=await Wn(t),c=a.branches.length,l=i?.refs.fetch?.trim()||"",u=l?"git-remote":"git-local";return{ok:!0,path:t,name:r,versionControl:u,gitUrl:l,defaultBranch:a.defaultBranch,message:c>0?u==="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`:u==="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"}}},Ri=async(e,t)=>{let r=bp(e),n=be(e),o=t?.trim()?be(t):n;if(!Dn(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 mr(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 vp(o,{withFileTypes:!0})).filter(a=>a.isDirectory()||a.isFile()).map(a=>({name:a.name,path:je.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:je.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"}}},_p=200*1024,Ti=async(e,t)=>{let{resolvedRootPath:r,requestedPath:n}=Ep(e,t);if(!Dn(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 mr(n);if(!o.isFile())return{ok:!1,path:n,rootPath:r,message:"\u5F53\u524D\u8DEF\u5F84\u4E0D\u662F\u6587\u4EF6\u3002"};if(o.size>_p)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 Pp(n);return s.includes(0)?{ok:!1,path:n,rootPath:r,sizeBytes:o.size,message:"\u6682\u4E0D\u652F\u6301\u9884\u89C8\u4E8C\u8FDB\u5236\u6587\u4EF6\u3002"}:{ok:!0,path:n,rootPath:r,content:s.toString("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"}}},Ai=async(e,t,r,n)=>{let o=be(e),s=ge({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 Mp(o,t,s.env)){let a=await Wn(o,r,s.env);return console.log("[worker] [repo-branches] local-only snapshot resolved",JSON.stringify({localPath:o,branchCount:a.branches.length,defaultBranch:a.defaultBranch})),{ok:!0,branches:a.branches,defaultBranch:a.defaultBranch}}let i=await Op(o,t,r,s.env);return console.log("[worker] [repo-branches] remote snapshot resolved",JSON.stringify({localPath:o,remoteTarget:i.remoteTarget,branchCount:i.branches.length,defaultBranch:i.defaultBranch})),{ok:!0,branches:i.branches,defaultBranch:i.defaultBranch}}catch(i){let a=F(i,t);console.log("[worker] [repo-branches] remote snapshot failed",JSON.stringify({localPath:o,error:a instanceof Error?a.message:"unknown"}));try{if(!(await mr(o)).isDirectory())return{ok:!1,branches:[],defaultBranch:se(r??"")||me,message:a instanceof Error?a.message:"\u8BFB\u53D6\u5206\u652F\u5217\u8868\u5931\u8D25\u3002"};if(!await vt(o,s.env).checkIsRepo())return console.log("[worker] [repo-branches] fallback skipped: path is not repo",JSON.stringify({localPath:o})),{ok:!1,branches:[],defaultBranch:se(r??"")||me,message:a instanceof Error?a.message:"\u8BFB\u53D6\u5206\u652F\u5217\u8868\u5931\u8D25\u3002"};let u=await Wn(o,r,s.env);return console.log("[worker] [repo-branches] local fallback resolved",JSON.stringify({localPath:o,branchCount:u.branches.length,defaultBranch:u.defaultBranch})),{ok:!0,branches:u.branches,defaultBranch:u.defaultBranch}}catch(c){let l=F(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:se(r??"")||me,message:a instanceof Error?a.message:"\u8BFB\u53D6\u5206\u652F\u5217\u8868\u5931\u8D25\u3002"}}finally{s.cleanup()}};import{readdir as Oi,readFile as _i,stat as Wi}from"node:fs/promises";import Bn from"node:os";import ie from"node:path";var Mi=e=>(e??"").trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||null;var Wp=["skills",".agents/skills",".codex/skills",".claude/skills",".cursor/skills",".opencode/skills",".pi/skills"],Dp=["~/.claude/skills","~/.agents/skills","~/.codex/skills","~/.config/opencode/skills"],Bp=new Set([".md",".txt",".json",".yml",".yaml",".ts",".tsx",".js",".jsx",".mjs",".cjs",".sh",".py",".rb"]),Np=e=>{let t=e.trim();return t?t==="~"?Bn.homedir():t.startsWith("~/")?ie.join(Bn.homedir(),t.slice(2)):t:""},Nn=e=>ie.resolve(Np(e)),$p=e=>{let t=e.match(/^---\n([\s\S]*?)\n---/);if(!t)return{};let r={};for(let n of t[1].split(`
57
+ `)){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},Up=(e,t)=>{let r=$p(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:ie.basename(t),description:r.description?.trim()||null}},Lp=e=>{let t=e.replace(/\\/g,"/");return t==="SKILL.md"?"skill":t.startsWith("references/")?"reference":t.startsWith("scripts/")?"script":t.startsWith("assets/")?"asset":"other"},jp=e=>e==="SKILL.md"?!0:Bp.has(ie.extname(e).toLowerCase()),Gp=e=>e.some(t=>t.kind==="script")?"scripts_executables":e.some(t=>t.kind==="asset")?"assets":"markdown_only",Di=async e=>{let t=await Oi(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 Di(ie.join(e,n.name)));return r},qp=async e=>{let t={},r=[],n=async o=>{let s=await Oi(o,{withFileTypes:!0}).catch(()=>[]);for(let i of s){let a=ie.join(o,i.name),c=ie.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:Lp(c)}),!jp(i.name))continue;let l=await _i(a,"utf8").catch(()=>null);typeof l=="string"&&(t[c]=l)}};return await n(e),{files:t,inventory:r.sort((o,s)=>o.path.localeCompare(s.path))}},zp=async e=>{let t=await _i(ie.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=Up(t,e),{files:n,inventory:o}=await qp(e);return{skill:{name:r.name,slug:Mi(r.name)??ie.basename(e),description:r.description,markdown:t,sourceLocator:e,trustLevel:Gp(o),fileInventory:o,files:n}}},Bi=async e=>{let t=[],r=[],n=[];for(let o of e){let s=Nn(o);if(!(t.includes(s)||(t.push(s),!await Wi(s).then(a=>a.isDirectory()).catch(()=>!1))))for(let a of await Di(s)){let{skill:c,warning:l}=await zp(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}},Fp=async(e,t)=>{let r=Nn(t);try{if(!(await Wi(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 Bi(Wp.map(i=>ie.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"}},Hp=async()=>{let e=Nn(Bn.homedir()),{scannedRoots:t,packages:r,warnings:n}=await Bi([...Dp]);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"}},Ni=async e=>e.scanMode==="global"?Hp():Fp(e.workspaceRoot,e.rootPath||e.workspaceRoot);import{createHash as Jp}from"node:crypto";import{existsSync as $n,mkdirSync as Un,rmSync as Vp}from"node:fs";import $i from"node:os";import Ee from"node:path";import{simpleGit as Li}from"simple-git";var st="main",Kp=e=>{let t=e.trim();return t?t==="~"?$i.homedir():t.startsWith("~/")?Ee.join($i.homedir(),t.slice(2)):t:""},Ge=e=>Ee.resolve(Kp(e)),ji=e=>e==="original-dir"?"original-dir":"worktree",Xp=e=>e.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"repo",Yp=e=>Jp("sha1").update(e).digest("hex").slice(0,12),Gi=(e,t)=>{let r=t?Ee.basename(t).replace(/\.git$/i,""):"repo";return Ee.join(Ge(e),"repos",`${Xp(r)}-${Yp(t||r)}`)},Qp=e=>{let t=[e.repoPath?.trim(),e.worktreePath.trim()].filter(n=>!!n).map(n=>Ge(n));return t.find(n=>$n(n))||t[0]||Ge(e.worktreePath)},ae=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},Re=(e,t)=>{let r={...Ce(t),...e?{baseDir:e}:{}};return Li(r).env(t??{})},Zp=async(e,t,r)=>{let n=Re(e,r),[o,s]=await Promise.all([n.branch(["-a"]),n.branchLocal()]),i="";try{i=ae(await n.raw(["symbolic-ref","--quiet","--short","refs/remotes/origin/HEAD"]))}catch{i=""}let a=Array.from(new Set(o.all.map(ae).filter(Boolean))).sort((d,S)=>d.localeCompare(S)),c=ae(t??""),l=ae(s.current),u=[i,c,l,a[0],st].find(d=>d&&(d===st||a.includes(d)))??st;return{branches:a,defaultBranch:u}},eg=e=>{for(let t of e.split(`
58
+ `)){let r=t.trim();if(!r.startsWith("ref: "))continue;let[n]=r.split(" ");return ae(n.slice(5))}return""},tg=e=>Array.from(new Set(e.split(`
59
+ `).map(t=>t.trim()).filter(Boolean).map(t=>t.split(" ")[1]||"").map(ae).filter(Boolean))).sort((t,r)=>t.localeCompare(r)),rg=async(e,t,r)=>{if(t?.trim())return t.trim();let n=Re(e,r);return await n.checkIsRepo()&&(await n.getRemotes(!0)).find(s=>s.name==="origin")?.refs.fetch?.trim()||""},ng=async(e,t,r,n)=>{let o=await rg(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=Re(void 0,n),[i,a]=await Promise.all([s.raw(["ls-remote","--heads",o]),s.raw(["ls-remote","--symref",o,"HEAD"])]),c=tg(i),l=eg(a),u=ae(r??""),d=[l,u,c[0],st].find(S=>S&&(S===st||c.includes(S)))??st;return{branches:c,defaultBranch:d,remoteTarget:o}},og=async(e,t,r,n)=>{try{let o=Re(e,n);if(await o.checkIsRepo())return console.log("[worker] [worktree] fetching target branch only",JSON.stringify({repoPath:e,remoteTarget:t,startPoint:r})),await o.fetch(["origin",`${r}:refs/remotes/origin/${r}`]),!0}catch{}return Un(Ee.dirname(e),{recursive:!0}),console.log("[worker] [worktree] cloning target branch only",JSON.stringify({repoPath:e,remoteTarget:t,startPoint:r})),await Re(void 0,n).clone(t,e,["--no-checkout","--single-branch","--branch",r]),!0},sg=async e=>{let t=Re(e.repoPath,e.env);if(!$n(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=ae((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}},ig=async e=>{let t=await e.raw(["worktree","list","--porcelain"]),r=[],n=null;for(let o of t.split(`
60
+ `)){if(o.startsWith("worktree ")){n&&r.push(n),n={path:Ee.resolve(o.slice(9).trim())};continue}o.startsWith("branch ")&&n&&(n.branch=o.slice(7).trim())}return n&&r.push(n),r},ag=async(e,t)=>(await e.branchLocal()).all.includes(t),qi=e=>{Vp(e,{recursive:!0,force:!0,maxRetries:5,retryDelay:100})},zi=async(e,t,r)=>{let n=Ee.resolve(t),o=`refs/heads/${r}`;try{await e.raw(["worktree","prune"])}catch{}let i=(await ig(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(qi(n),await ag(e,r))try{await e.deleteLocalBranch(r,!0)}catch{}try{await e.raw(["worktree","prune"])}catch{}Un(Ee.dirname(n),{recursive:!0})},Ui=async e=>{let t=Re(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 Zp(e.repoPath,e.preferredBranch,e.env),n=ae(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 zi(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}},Fi=async e=>{let t=ji(e.workingDirectoryMode),r=Ge(e.worktreePath),n=Ge(e.repoPath?.trim()||Gi(e.workspaceRoot,e.repoUrl)),o=ge({taskId:`worktree-${Buffer.from(r).toString("base64url").slice(0,24)}`,identity:e.gitIdentity??{mode:"personal"},repoUrl:e.repoUrl});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 s=Qp({repoPath:e.repoPath,worktreePath:e.worktreePath});try{return await sg({repoPath:s,repoUrl:e.repoUrl,preferredBranch:e.preferredBranch,branchName:e.branchName,env:o.env})}catch(i){let a=F(i,e.repoUrl);return{ok:!1,message:a instanceof Error?a.message:"\u539F\u59CB\u76EE\u5F55\u51C6\u5907\u5931\u8D25\u3002",worktreePath:n}}finally{o.cleanup()}}if(!e.repoPath?.trim()&&!e.repoUrl?.trim())return Un(r,{recursive:!0}),{ok:!0,message:`\u5DF2\u51C6\u5907\u9879\u76EE\u76EE\u5F55 ${r}\u3002`,worktreePath:r};if(!e.repoUrl?.trim())try{return await Ui({repoPath:n,worktreePath:r,branchName:e.branchName,preferredBranch:e.preferredBranch,env:o.env})}catch(s){let i=F(s,e.repoUrl);return{ok:!1,message:i instanceof Error?i.message:"\u521B\u5EFA worktree \u5931\u8D25\u3002",worktreePath:r}}finally{o.cleanup()}try{let s=await ng(n,e.repoUrl,e.preferredBranch,o.env),i=ae(e.preferredBranch??"")||s.defaultBranch,a=s.branches.includes(i)?i:s.defaultBranch;if(!s.branches.includes(a))return console.log("[worker] [worktree] ensure worktree skipped: branch not found",JSON.stringify({startPoint:a,availableBranches:s.branches})),{ok:!1,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`};console.log("[worker] [worktree] resolved remote start point",JSON.stringify({repoPath:n,remoteTarget:s.remoteTarget,requestedStartPoint:i,startPoint:a})),await og(n,s.remoteTarget,a,o.env);let c=Re(n,o.env),l=`refs/remotes/origin/${a}`;return console.log("[worker] [worktree] creating fresh worktree",JSON.stringify({worktreePath:r,branchName:e.branchName,startPoint:a,startPointRef:l})),await zi(c,r,e.branchName),await c.raw(["worktree","add","--force","-B",e.branchName,r,l]),console.log("[worker] [worktree] worktree created",JSON.stringify({worktreePath:r,branchName:e.branchName,startPoint:a,startPointRef:l})),{ok:!0,message:`\u5DF2\u57FA\u4E8E ${a} \u521B\u5EFA worktree ${r} \u5E76\u5207\u51FA\u5206\u652F ${e.branchName}\u3002`,worktreePath:r}}catch(s){let i=F(s,e.repoUrl);console.log("[worker] [worktree] remote prepare failed",JSON.stringify({worktreePath:r,repoPath:n,error:i instanceof Error?i.message:"unknown"}));try{return await Ui({repoPath:n,worktreePath:r,branchName:e.branchName,preferredBranch:e.preferredBranch,env:o.env})}catch(a){let c=F(a,e.repoUrl);return console.log("[worker] [worktree] ensure worktree failed",JSON.stringify({worktreePath:r,error:c instanceof Error?c.message:"unknown"})),{ok:!1,message:c instanceof Error?c.message:"\u521B\u5EFA worktree \u5931\u8D25\u3002",worktreePath:r}}}finally{o.cleanup()}},Hi=async e=>{let t=ji(e.workingDirectoryMode),r=Ge(e.worktreePath),n=Ge(e.repoPath?.trim()||Gi(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($n(n)){let o=Li(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})),qi(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 cg=(e,t)=>{},It=e=>`prompt:${e}`,Ln=e=>e.workingDirectoryMode==="original-dir"?"original-dir":"worktree",Ji=e=>{let{send:t,executorId:r,sessionId:n,stream:o,chunk:s}=e;t({type:"executor.terminal.session.output",executorId:r,output:{sessionId:n,stream:o,chunk:s,at:new Date().toISOString()}})},Te=cg;var Vi=(e,t)=>{let r=t.getConfig(),n=()=>(r=P(),t.setConfig(r),r);return e.type==="executor.repo-probe.request"?(n(),Ei(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(),ni(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(),Ze().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(),Ri(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(),Ti(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.agent.workdir.request"?(n(),Promise.resolve().then(()=>{if(e.action==="ensure"){let o=ui(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=nt(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:pi(e.agentId),files:nt(e.agentId).files,message:"\u5DF2\u6E05\u7406 Agent \u7CFB\u7EDF\u4E34\u65F6\u76EE\u5F55\u3002"};if(e.action==="delete"){let o=gi(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=nt(e.agentId,e.refresh===!0);return{ok:!0,workdir:o.summary,files:o.files}}return{ok:!0,workdir:St(e.agentId),files:nt(e.agentId).files}}).catch(o=>({ok:!1,workdir:St(e.agentId),files:nt(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=pr(e.agentId,e.relativePath);return{ok:!0,relativePath:o.relativePath,filename:ug(o.relativePath),contentBase64:lg(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(()=>mi(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(()=>nr()).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=or(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(),Ni({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})),Ai(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.diff.request"?(n(),Si({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.commit-diff.request"?(n(),xi({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(),Ci({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(),Pi({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(),vi({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(),Ii({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(),Fi({workspaceRoot:r.workspaceRoot,repoPath:e.repoPath,repoUrl:e.repoUrl,preferredBranch:e.preferredBranch,branchName:e.branchName,worktreePath:e.worktreePath,gitIdentity:e.gitIdentity,workingDirectoryMode:Ln(e)}).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(),Hi({workspaceRoot:r.workspaceRoot,repoPath:e.repoPath,repoUrl:e.repoUrl,worktreePath:e.worktreePath,workingDirectoryMode:Ln(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()?(Xt({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 Ki=["Pi","OpenCode","Codex","ClaudeCode"];var dg=[...Ki],uS=new Set(Ki),dS=new Set(dg);var bt=e=>e;import{randomUUID as jn}from"node:crypto";import{spawn as mg}from"node:child_process";import{existsSync as Et}from"node:fs";import pg from"node:path";var gg=()=>{let e=Bt(),t=pt();if(Et(t))return{launcherPath:Et(e)?e:void 0,runnerPath:process.execPath,entryPath:t};let r=ue("tsx"),n=pg.join(Z(),"apps","worker","src","index.ts");return r&&Et(n)?{launcherPath:Et(e)?e:void 0,runnerPath:r,entryPath:n}:{launcherPath:Et(e)?e:void 0,runnerPath:void 0,entryPath:void 0}},it=()=>{let e=gg();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 fr=e=>ue(e),Rt=e=>{try{return JSON.parse(e)}catch{return null}},R=(e,t,r)=>{t?.({agentType:e,...r})},Ae=()=>{let e=new Error("\u4EFB\u52A1\u5DF2\u53D6\u6D88");return e.name="AbortError",e},fe=e=>{let t=e?.trim();if(!(!t||t==="default"))return t};var fg=new Set(["Glob","Grep","LS","NotebookRead","Read","Task","TodoRead"]),hg=new Set(["Edit","MultiEdit","TodoWrite","Write"]),kg=e=>e.split("(")[0]?.trim()||e.trim(),yg=e=>e?.planMode?"plan":e?.permissionMode??"bypassPermissions",wg=e=>e==="bypassPermissions"&&typeof process.getuid=="function"&&process.getuid()===0?"acceptEdits":e,Sg=(e,t)=>{let r=kg(t);return!!(e==="bypassPermissions"||fg.has(r)||e==="acceptEdits"&&hg.has(r))},Tt=(e,t)=>{e.write(`${JSON.stringify(t)}
61
+ `)},Xi=async e=>{let t=fr("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=fe(e.executionModel)??fe(r?.defaultModel),o=yg(r),s=wg(o),i=["-p","--output-format=stream-json","--input-format=stream-json","--verbose","--include-partial-messages","--replay-user-messages","--permission-mode",s,...e.runtimeArgs??[]];n&&i.push("--model",n);let a=e.resumeSessionId?.trim();return a&&i.push("--resume",a),new Promise((c,l)=>{let u=mg(t,i,{cwd:e.cwd,env:{...it(),...e.runtimeEnv??{}},stdio:["pipe","pipe","pipe"]}),d="",S="",p="",m="",k="",g="",w=!1,v=new Map,M=new Map,O=()=>(m=m||`${p||"claude"}:assistant`,R("ClaudeCode",e.onEvent,{type:"message.updated",properties:{info:{id:m,role:"assistant"}}}),m),J=(C,T,f,h)=>{R("ClaudeCode",e.onEvent,{type:"message.part.updated",properties:{part:{id:T,messageID:O(),type:C,text:f},delta:h}})},H=C=>{Tt(u.stdin,{type:"control_response",response:C})},Q=C=>{if(C.type!=="control_request")return;if(C.request.subtype==="hook_callback"){H({subtype:"success",request_id:C.request_id,response:{}});return}let T=C.request.tool_name,f=Sg(s,T);f||R("ClaudeCode",e.onEvent,{type:"permission.updated",properties:{title:T}}),H({subtype:"success",request_id:C.request_id,response:f?{behavior:"allow",updatedInput:C.request.input}:{behavior:"deny",message:`\u5F53\u524D\u4F1A\u8BDD\u672A\u542F\u7528 ${T} \u6743\u9650\u3002`,interrupt:!1}})},W=()=>{Tt(u.stdin,{type:"control_request",request_id:jn(),request:{subtype:"interrupt"}}),setTimeout(()=>{u.killed||u.kill("SIGTERM")},250)};e.signal?.addEventListener("abort",W,{once:!0});let x=C=>{let T=C.trim();if(!T)return;let f=Rt(T);if(f?.type==="control_request"||f?.type==="control_cancel_request"){Q(f);return}let h=Rt(T);if(h){if(h.session_id&&(p=h.session_id),h.type==="system"&&h.subtype==="init"){R("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 y=h.event,I=`${p||"claude"}:${y.index??0}`;if(y.type==="content_block_delta"&&y.delta?.type==="thinking_delta"){let G=`${M.get(I)??""}${y.delta.thinking??""}`;M.set(I,G),J("reasoning",`${I}:thinking`,G,y.delta.thinking??"");return}if(y.type==="content_block_delta"&&y.delta?.type==="text_delta"){let G=`${v.get(I)??""}${y.delta.text??""}`;v.set(I,G),k=G.trim()||k,J("text",`${I}:text`,G,y.delta.text??"");return}y.type==="content_block_start"&&y.content_block?.type==="tool_use"&&R("ClaudeCode",e.onEvent,{type:"message.part.updated",properties:{part:{id:y.content_block.id??`${I}:tool`,messageID:O(),type:"tool",tool:y.content_block.name??"tool",state:{status:"running"}}}});return}if(h.type==="assistant"){p=h.session_id??p,m=h.message?.id??O();let y=Array.isArray(h.message?.content)?h.message.content:[];for(let I of y)I.type==="text"&&I.text?.trim()&&(k=I.text.trim(),J("text",`${m}:final`,k)),I.type==="tool_use"&&R("ClaudeCode",e.onEvent,{type:"message.part.updated",properties:{part:{id:I.id??`${m}:tool`,messageID:O(),type:"tool",tool:I.name??"tool",state:{status:"running",raw:I.input?JSON.stringify(I.input,null,2):void 0}}}});return}if(h.type==="user"){let y=Array.isArray(h.message?.content)?h.message.content:[],I=y.find(G=>G.tool_use_id)?.tool_use_id;if(!I)return;R("ClaudeCode",e.onEvent,{type:"message.part.updated",properties:{part:{id:I,messageID:O(),type:"tool",tool:"tool",state:{status:"completed",output:y.find(G=>G.tool_use_id===I)?.content}}}});return}if(h.type==="result"){if(w=!h.is_error,h.result?.trim()&&(k=h.result.trim()),h.is_error){g=h.result?.trim()||"Claude Code \u6267\u884C\u5931\u8D25",R("ClaudeCode",e.onEvent,{type:"session.error",properties:{error:g}});return}R("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",C=>{d+=C.toString();let T=d.split(`
62
+ `);d=T.pop()??"";for(let f of T)x(f)}),u.stderr.on("data",C=>{S+=C.toString()}),u.on("error",C=>{e.signal?.removeEventListener("abort",W),l(C)}),u.on("close",C=>{if(e.signal?.removeEventListener("abort",W),d.trim()&&x(d),e.signal?.aborted){l(Ae());return}if(!w&&C!==0||g){l(new Error(g||S.trim().split(`
63
+ `).filter(Boolean).at(-1)||`Claude Code \u6267\u884C\u5931\u8D25\uFF08\u9000\u51FA\u7801 ${C??-1}\uFF09`));return}c({output:k||S.trim().split(`
64
+ `).filter(Boolean).at(-1)||"Claude Code \u672A\u8FD4\u56DE\u6587\u672C\u8F93\u51FA\u3002",sessionId:p||void 0})}),Tt(u.stdin,{type:"control_request",request_id:jn(),request:{subtype:"initialize"}}),Tt(u.stdin,{type:"control_request",request_id:jn(),request:{subtype:"set_permission_mode",mode:s}}),Tt(u.stdin,{type:"user",message:{role:"user",content:e.prompt}})})};import{spawn as xg}from"node:child_process";var Yi=(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}},Cg=(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}},Pg=e=>({mode:"default",settings:{model:e,reasoning_effort:null,developer_instructions:null}}),vg=e=>e==="never"?{command:"acceptForSession",fileChange:"acceptForSession"}:{command:"decline",fileChange:"decline"},Ig=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},bg=e=>{let t=e.error?.message?.trim();if(t)return t;let r=e.error?.details?.trim();return r||(e.status==="failed"?"Codex \u6267\u884C\u5931\u8D25":"")},Qi=(e,t,r,n)=>{R("Codex",e.onEvent,{type:"message.updated",properties:{info:{id:t,role:"assistant"}}}),R("Codex",e.onEvent,{type:"message.part.updated",properties:{part:{id:`${t}:text`,messageID:t,type:"text",text:r},delta:n}})},Zi=(e,t,r,n,o)=>{R("Codex",e.onEvent,{type:"message.part.updated",properties:{part:{id:r,messageID:t,type:"reasoning",text:n},delta:o}})},ea=(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;R("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}}}})},Gn=(e,t)=>{e.stdin.write(`${JSON.stringify(t)}
65
+ `)},ta=async e=>{let t=fr("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=fe(e.executionModel)??fe(r?.defaultModel),o=vg(r?.approval);return new Promise((s,i)=>{let a=xg(t,["app-server",...e.runtimeArgs??[]],{cwd:e.cwd,env:{...it(),...e.runtimeEnv??{}},stdio:["pipe","pipe","pipe"]}),c=1,l="",u="",d="",S="",p="",m=!1,k="",g=new Map,w=new Map,v=new Map,M=f=>{for(let h of g.values())h.reject(f);g.clear()},O=(f,h)=>{let y=c++;return Gn(a,{jsonrpc:"2.0",id:y,method:f,params:h}),new Promise((I,G)=>{g.set(y,{resolve:dc=>I(dc),reject:G})})},J=(f,h)=>{Gn(a,{jsonrpc:"2.0",id:f,result:h})},H=()=>{a.killed||a.kill("SIGTERM")},Q=()=>{H()};e.signal?.addEventListener("abort",Q,{once:!0});let W=f=>{if(f.method==="item/commandExecution/requestApproval"){let h=f.params??{};o.command==="decline"&&R("Codex",e.onEvent,{type:"permission.updated",properties:{title:h.reason?.trim()||h.command?.trim()||"\u547D\u4EE4\u6267\u884C\u6743\u9650"}}),J(f.id,{decision:o.command});return}if(f.method==="item/fileChange/requestApproval"){let h=f.params??{};o.fileChange==="decline"&&R("Codex",e.onEvent,{type:"permission.updated",properties:{title:h.reason?.trim()||"\u6587\u4EF6\u4FEE\u6539\u6743\u9650"}}),J(f.id,{decision:o.fileChange});return}if(f.method==="item/tool/requestUserInput"){let h=f.params??{};R("Codex",e.onEvent,{type:"permission.updated",properties:{title:h.questions?.[0]?.header?.trim()||h.questions?.[0]?.question?.trim()||"\u7B49\u5F85\u7528\u6237\u8F93\u5165"}}),J(f.id,{answers:{}});return}J(f.id,null)},x=(f,h)=>{if(f.type==="agentMessage"){let y=f;k=y.id,w.set(y.id,y.text),y.text.trim()&&(S=y.text.trim()),Qi(e,y.id,y.text);return}if(f.type==="reasoning"){let y=f,I=y.summary?.join("")||y.content?.join("")||"";I&&(v.set(y.id,I),Zi(e,k||`${d||"codex"}:assistant`,`${y.id}:reasoning`,I));return}if(f.type==="commandExecution"){let y=f,I=h==="started"?"running":y.status==="completed"?"completed":"error";ea(e,k||void 0,y,I,y.aggregatedOutput??void 0,y.status==="failed"||y.status==="declined"?y.aggregatedOutput||`\u547D\u4EE4\u5931\u8D25\uFF08\u9000\u51FA\u7801 ${y.exitCode??-1}\uFF09`:void 0);return}if(f.type==="fileChange"){let y=f,I=h==="started"?"running":y.status==="success"?"completed":"error";ea(e,k||void 0,y,I,JSON.stringify(y.changes??[],null,2),y.status==="failed"||y.status==="declined"?"\u6587\u4EF6\u4FEE\u6539\u672A\u5B8C\u6210":void 0)}},C=async f=>{if(f.method==="thread/started"){d=f.params.thread.id;return}if(f.method==="turn/started"){let h=f.params;d=d||h.threadId,R("Codex",e.onEvent,{type:"session.status",properties:{status:{type:"busy",message:"Codex \u6B63\u5728\u5904\u7406\u8BF7\u6C42"}}});return}if(f.method==="item/started"){x(f.params.item,"started");return}if(f.method==="item/completed"){x(f.params.item,"completed");return}if(f.method==="item/agentMessage/delta"){let h=f.params;k=h.itemId;let y=`${w.get(h.itemId)??""}${h.delta??""}`;w.set(h.itemId,y),y.trim()&&(S=y.trim()),Qi(e,h.itemId,y,h.delta);return}if(f.method==="item/reasoning/textDelta"||f.method==="item/reasoning/summaryTextDelta"){let h=f.params,y=f.method==="item/reasoning/textDelta"?`content:${h.contentIndex??0}`:`summary:${h.summaryIndex??0}`,I=`${h.itemId}:reasoning:${y}`,G=`${v.get(I)??""}${h.delta??""}`;v.set(I,G),Zi(e,k||`${d||"codex"}:assistant`,I,G,h.delta);return}if(f.method==="turn/completed"){let h=f.params;d=d||h.threadId,m=h.turn.status==="completed",h.turn.status==="failed"?(p=bg(h.turn)||"Codex \u6267\u884C\u5931\u8D25",R("Codex",e.onEvent,{type:"session.error",properties:{error:p}})):R("Codex",e.onEvent,{type:"session.status",properties:{status:{type:"idle",message:"Codex \u5DF2\u5B8C\u6210"}}}),H();return}f.method==="error"&&(p=f.params.message?.trim()||"Codex \u6267\u884C\u5931\u8D25",R("Codex",e.onEvent,{type:"session.error",properties:{error:p}}),H())},T=f=>{let h=f.trim();if(!h)return;let y=Rt(h);if(y){if(typeof y.id<"u"&&(typeof y.result<"u"||typeof y.error<"u")){let I=g.get(y.id);if(!I)return;if(g.delete(y.id),y.error){I.reject(new Error(y.error.message||"Codex app-server \u8BF7\u6C42\u5931\u8D25"));return}I.resolve(y.result);return}if(typeof y.id<"u"&&typeof y.method=="string"){W(y);return}typeof y.method=="string"&&C(y)}};a.stdout.on("data",f=>{l+=f.toString();let h=l.split(`
66
+ `);l=h.pop()??"";for(let y of h)T(y)}),a.stderr.on("data",f=>{u+=f.toString()}),a.on("error",f=>{e.signal?.removeEventListener("abort",Q),M(f),i(f)}),a.on("close",f=>{if(e.signal?.removeEventListener("abort",Q),l.trim()&&T(l),e.signal?.aborted){M(Ae()),i(Ae());return}if(!m||p){let h=new Error(p||u.trim().split(`
67
+ `).filter(Boolean).at(-1)||`Codex \u6267\u884C\u5931\u8D25\uFF08\u9000\u51FA\u7801 ${f??-1}\uFF09`);M(h),i(h);return}M(new Error("Codex \u4F1A\u8BDD\u5DF2\u7ED3\u675F")),s({output:S||"Codex \u672A\u8FD4\u56DE\u6587\u672C\u8F93\u51FA\u3002",sessionId:d||void 0})}),(async()=>{try{await O("initialize",{clientInfo:{name:"vibemux-worker",version:"0.1.1"},capabilities:{experimentalApi:!0}}),Gn(a,{jsonrpc:"2.0",method:"initialized"});let f=await O("account/read",{refreshToken:!1});if(f.requiresOpenaiAuth&&!f.account)throw new Error("Codex \u9700\u8981\u5148\u767B\u5F55\u540E\u624D\u80FD\u6267\u884C\u3002");let h=e.resumeSessionId?.trim(),y;if(h)try{y=await O("thread/resume",Cg(e.cwd,h,n,r))}catch(I){if(!Ig(I))throw I;y=await O("thread/start",Yi(e.cwd,n,r))}else y=await O("thread/start",Yi(e.cwd,n,r));d=y.thread.id,await O("turn/start",{threadId:d,input:[{type:"text",text:e.prompt,text_elements:[]}],collaborationMode:Pg(y.model)})}catch(f){p=f instanceof Error?f.message:"Codex \u521D\u59CB\u5316\u5931\u8D25",R("Codex",e.onEvent,{type:"session.error",properties:{error:p}}),H()}})()})};import{readFile as Im}from"node:fs/promises";import{createAgentSession as bm,DefaultResourceLoader as Em}from"@mariozechner/pi-coding-agent";import{Client as Eg}from"@modelcontextprotocol/sdk/client/index.js";import{SSEClientTransport as Rg}from"@modelcontextprotocol/sdk/client/sse.js";import{StdioClientTransport as Tg}from"@modelcontextprotocol/sdk/client/stdio.js";import{StreamableHTTPClientTransport as Ag}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{defineTool as Mg}from"@mariozechner/pi-coding-agent";var Og="__",ra=e=>e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/^_+|_+$/g,""),_g=(e,t,r)=>{let n=[ra(e),ra(t)].filter(Boolean).join(Og)||"mcp_tool",o=n,s=2;for(;r.has(o);)o=`${n}_${s}`,s+=1;return r.add(o),o},Wg=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]":""},Dg=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(Wg).filter(Boolean).join(`
68
+
69
+ `).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")},Bg=e=>{if(typeof e.command=="string"&&e.command.trim())return new Tg({command:"sh",args:["-lc",e.command.trim()],env:it()});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 Rg(r,{requestInit:Object.keys(t).length>0?{headers:t}:void 0}):new Ag(r,{requestInit:Object.keys(t).length>0?{headers:t}:void 0})},Ng=e=>{let t=`${e.serverName} \xB7 ${e.toolName}`;return Mg({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=Dg(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}}}})},$g=async e=>{let t=Bg(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 Eg({name:"vibemux-pi-mcp",version:"0.1.8"});await r.connect(t);let o=(await r.listTools()).tools.map(s=>Ng({client:r,serverName:e.serverPolicy.name,toolName:s.name,description:s.description,inputSchema:s.inputSchema,exposedToolName:_g(e.serverPolicy.name,s.name,e.exposedToolNames)}));return{client:r,tools:o,warning:void 0}},na=async e=>{let t=e.workerConfig??P(),r=new Set,n=[],o=[],s=[],i=e.mcpServers?.filter(c=>c.enabled&&c.capabilityMode==="resources+tools")??[],a=De(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 u=await $g({exposedToolNames:r,materializedServer:l,serverPolicy:c});u.warning&&n.push(u.warning),u.client&&o.push(u.client),s.push(...u.tools)}catch(u){n.push(`${c.name} MCP bridge \u8FDE\u63A5\u5931\u8D25\uFF1A${u instanceof Error?u.message:"unknown error"}`)}}return{tools:s,cleanup:async()=>{await Promise.allSettled(o.map(c=>c.close()))},warnings:n}};import{mkdtemp as Ug,mkdir as Lg,rm as oa,writeFile as jg}from"node:fs/promises";import Gg from"node:os";import At from"node:path";var qg={"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"},zg=(e,t)=>{let r=At.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}`},Fg=(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()},Hg=(e,t)=>{let r=At.extname(e);return r||t&&qg[t]||""},hr=async e=>{let t=e.attachments??[];if(t.length===0)return{attachments:[],cleanup:async()=>{}};let r=At.join(Gg.tmpdir(),"vibemux-task-chat-attachments-");await Lg(At.dirname(r),{recursive:!0});let n=await Ug(r);try{return{attachments:await Promise.all(t.map(async(s,i)=>{let a=Fg(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,u=Hg(s.filename,l),d=zg(`${i+1}-${s.filename||`image-${i+1}`}${u&&!s.filename.endsWith(u)?u:""}`,`image-${i+1}`),S=At.join(n,d),p=Buffer.from(await c.arrayBuffer());return await jg(S,p),{...s,contentType:l,absoluteUrl:a,localPath:S}})),cleanup:async()=>{await oa(n,{recursive:!0,force:!0})}}}catch(o){throw await oa(n,{recursive:!0,force:!0}).catch(()=>{}),o}},sa=(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(`
70
+ `)};import{createHash as Jg,randomUUID as Vg}from"node:crypto";import{existsSync as ia,mkdirSync as zn,readFileSync as Kg,rmSync as Xg,writeFileSync as Yg}from"node:fs";import aa from"node:os";import qe from"node:path";import{AuthStorage as Qg,ModelRegistry as ca,SessionManager as Mt,SettingsManager as Zg}from"@mariozechner/pi-coding-agent";var em=["text"],tm={input:0,output:0,cacheRead:0,cacheWrite:0},rm=new Map([["claude","anthropic"],["dashscope","qwen"],["gemini","google"],["glm","zhipu"],["grok","xai"],["kimi","moonshot"],["volcengine","doubao"]]),nm=e=>{let t=e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return rm.get(t)||t},om=e=>e.trim().toUpperCase().replace(/[^A-Z0-9]+/g,"_").replace(/^_+|_+$/g,"")||"MODEL",sm=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":om(e)},im=e=>{let t=e?.trim()||"";if(!t)return null;let r=t.indexOf("/");if(r<0)return null;let n=nm(t.slice(0,r)),o=t.slice(r+1).trim();return!n||!o?null:{providerId:n,modelId:o}},am=(e,t)=>{let r=t?.VIBEMUX_PI_AGENT_DIR?.trim();if(r)return r;let n=e?.agentDir?.trim()||P().piAgentDir?.trim();return n||qe.join(aa.homedir(),".pi","agent")},cm=(e,t)=>{let r=Jg("sha1").update(`${t}::${e}`).digest("hex").slice(0,16);return qe.join(t,"sessions-vibemux",r)},lm=(e,t)=>{let r=sm(e.providerId);return{apiKey:t?.[`${r}_API_KEY`]?.trim()||"",baseUrl:t?.[`${r}_BASE_URL`]?.trim()||""}},um=(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"},dm=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")},pm=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"]:[...em]},gm=e=>{if(!ia(e))return{};try{let t=JSON.parse(Kg(e,"utf8"));return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}catch{return{}}},mm=e=>{let t=qe.join(e.agentDir,"models.json"),r=gm(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??um(e.model,e.baseUrl),models:[{id:e.model.modelId,name:o?.name??e.model.modelId,reasoning:o?.reasoning??dm(e.model),input:o?.input??pm(e.model),contextWindow:o?.contextWindow??128e3,maxTokens:o?.maxTokens??16384,cost:o?.cost??tm,...o?.headers?{headers:o.headers}:{},...o?.compat?{compat:o.compat}:{}}]};return{providers:{...n,[e.model.providerId]:s}}},fm=e=>{let t=qe.join(aa.tmpdir(),`vibemux-pi-models-${Vg()}`);zn(t,{recursive:!0});let r=mm({agentDir:e.agentDir,baseRegistry:e.baseRegistry,model:e.model,apiKey:e.apiKey,baseUrl:e.baseUrl}),n=qe.join(t,"models.json");return Yg(n,`${JSON.stringify(r,null,2)}
71
+ `,"utf8"),{modelRegistry:ca.create(e.authStorage,n),cleanup:()=>{Xg(t,{recursive:!0,force:!0})}}},hm=async e=>{let t=cm(e.cwd,e.agentDir);zn(t,{recursive:!0});let r=e.resumeSessionId?.trim();if(!r){let i=Mt.continueRecent(e.cwd,t);return qn(i),i}if(ia(r)){let i=Mt.open(r,t,e.cwd);return qn(i),i}let o=(await Mt.list(e.cwd,t)).find(i=>i.id===r),s=o?Mt.open(o.path,t,e.cwd):Mt.continueRecent(e.cwd,t);return qn(s),s},kr=e=>!!(e&&typeof e=="object"&&!Array.isArray(e)),km=e=>typeof e=="string"?e.trim().length>0:Array.isArray(e)?e.some(t=>kr(t)&&t.type==="text"&&typeof t.text=="string"&&t.text.trim().length>0):!1,ym=e=>Array.isArray(e)?e.some(t=>kr(t)&&t.type==="toolCall"&&(typeof t.id!="string"||!t.id.trim()||typeof t.name!="string"||!t.name.trim())):!1,wm=e=>e?.role!=="user"&&e?.role!=="toolResult"||!Array.isArray(e.content)?!1:e.content.some(t=>kr(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"||kr(t.source):!1),Sm=e=>e?.role==="toolResult"&&(typeof e.toolCallId!="string"||!e.toolCallId.trim()||typeof e.toolName!="string"||!e.toolName.trim()),xm=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"))},Cm=e=>{if(e.type!=="message")return!1;let t=e.message;return ym(t?.content)||wm(t)||Sm(t)||xm(t)},Pm=e=>{let t=e.message;return e.type==="message"&&!!e.id&&t?.role==="assistant"&&t.stopReason!=="error"&&km(t.content)},vm=e=>{let t="";for(let r of e){if(Cm(r))return t||null;Pm(r)&&(t=r.id??"")}},qn=e=>{let t=vm(e.getBranch());return t===void 0?!1:(t?e.createBranchedSession(t):e.newSession(),!0)},la=async e=>{let t=am(e.settings,e.runtimeEnv);zn(t,{recursive:!0});let r=Qg.create(qe.join(t,"auth.json")),n=im(e.executionModel),o=n?lm(n,e.runtimeEnv):{apiKey:"",baseUrl:""};n&&o.apiKey&&r.setRuntimeApiKey(n.providerId,o.apiKey);let s=ca.create(r,qe.join(t,"models.json")),i=n&&(o.baseUrl||!s.find(n.providerId,n.modelId))?fm({agentDir:t,authStorage:r,baseRegistry:s,model:n,apiKey:o.apiKey||void 0,baseUrl:o.baseUrl||void 0}):null,a=i?.modelRegistry??s,c=Zg.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 hm({agentDir:t,cwd:e.cwd,resumeSessionId:e.resumeSessionId}),settingsManager:c,cleanup:()=>{i?.cleanup()}}};var Sr=e=>!!(e&&typeof e=="object"&&!Array.isArray(e)),Rm=e=>Sr(e)&&e.type==="toolCall",ua=e=>!!(e.id?.trim()&&e.name?.trim()),Tm=e=>Sr(e)&&Object.keys(e).length>0,Am=(e,t)=>({...Sr(e)?e:{},...Sr(t)?t:{}}),wr=e=>{if(e.role!=="assistant"||!Array.isArray(e.content))return e;let t=[],r,n=!1;for(let o of e.content){if(!Rm(o)){t.push(o),r=void 0;continue}if(ua(o)){let s={...o};t.push(s),r=s,s!==o&&(n=!0);continue}if(r&&Tm(o.arguments)){r.arguments=Am(r.arguments,o.arguments),n=!0;continue}n=!0}return n?{...e,content:t}:e},Mm=e=>{let t={...e};return e.partial&&(t.partial=wr(e.partial)),e.message&&(t.message=wr(e.message)),e.error&&(t.error=wr(e.error)),e.toolCall&&!ua(e.toolCall)&&delete t.toolCall,t},Om=e=>{let t;return{async*[Symbol.asyncIterator](){for await(let r of e){let n=Mm(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?wr(r):{role:"assistant",content:[]}}}},_m=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:Om(s)},()=>{t.streamFn=r})},da=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[]}):[]},pa=e=>da(e).filter(t=>t.type==="text").map(t=>t.text).join(`
72
+
73
+ `).trim(),ga=e=>{let t=e;return t?.role!=="assistant"||t.stopReason!=="error"?"":typeof t.errorMessage=="string"?t.errorMessage.trim():""},Wm=e=>{for(let t of[...e].reverse())if(t?.role==="assistant")return t},ma=(e,t)=>{R("Pi",e.onEvent,{type:"message.updated",properties:{info:{id:t.activeAssistantMessageId,role:"assistant"}}})},Jn=(e,t,r,n,o,s)=>{let i=r==="text"?t.textParts:t.reasoningParts;(i.get(n)??"")!==o&&(i.set(n,o),ma(e,t),R("Pi",e.onEvent,{type:"message.part.updated",properties:{part:{id:`${t.activeAssistantMessageId}:${r}:${n}`,messageID:t.activeAssistantMessageId,type:r,text:o},delta:s}}))},Dm=(e,t,r,n)=>{let o=`${t.textParts.get(r)??""}${n}`;Jn(e,t,"text",r,o,n)},Bm=(e,t,r,n)=>{let o=`${t.reasoningParts.get(r)??""}${n}`;Jn(e,t,"reasoning",r,o,n)},yr=(e,t,r)=>{t.latestAssistantMessage=r;for(let n of da(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;Jn(e,t,n.type==="text"?"text":"reasoning",n.index,n.text,s)}},Fn=(e,t,r)=>{ma(e,t),R("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}}}})},Hn=e=>!!(e.toolCallId?.trim()&&e.toolName?.trim()),Nm=(e,t,r)=>{if(r.type==="agent_start"){R("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"&&Dm(e,t,r.assistantMessageEvent.contentIndex,r.assistantMessageEvent.delta),r.assistantMessageEvent.type==="thinking_delta"&&Bm(e,t,r.assistantMessageEvent.contentIndex,r.assistantMessageEvent.delta),(r.assistantMessageEvent.type==="text_end"||r.assistantMessageEvent.type==="thinking_end"||r.assistantMessageEvent.type==="done")&&yr(e,t,r.message);return}if(r.type==="message_end"&&r.message.role==="assistant"){yr(e,t,r.message);return}if(r.type==="turn_end"&&r.message.role==="assistant"){yr(e,t,r.message);return}if(r.type==="tool_execution_start"){if(!Hn(r))return;Fn(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(!Hn(r))return;Fn(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(!Hn(r))return;Fn(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=Wm(r.messages);n&&yr(e,t,n),R("Pi",e.onEvent,{type:"session.idle",properties:{}})}},$m=e=>{for(let t of[...e].reverse()){let r=pa(t)||ga(t);if(r)return r}return""},Um=e=>[...e.textParts.entries()].sort((t,r)=>t[0]-r[0]).map(([,t])=>t.trim()).filter(Boolean).join(`
74
+
75
+ `).trim(),Lm=(e,t,r)=>{let n=pa(r.latestAssistantMessage)||ga(r.latestAssistantMessage);if(n)return n;let o=$m(e.slice(t));return o||Um(r)},jm=async e=>{for(await e.agent?.waitForIdle?.();;){let t=e._agentEventQueue;if(await t,t===e._agentEventQueue)return}},Gm=async e=>Promise.all(e.filter(t=>t.contentType?.startsWith("image/")).map(async t=>({type:"image",data:await Im(t.localPath,"base64"),mimeType:t.contentType||"image/png"}))),fa=async e=>{let t=e.agentSettings&&"agentDir"in e.agentSettings?e.agentSettings:void 0,r=fe(e.executionModel)??fe(t?.defaultModel),n=P(),o=await la({cwd:e.cwd,executionModel:r,resumeSessionId:e.resumeSessionId,runtimeEnv:e.runtimeEnv,settings:t}),s=await na({actingUserId:e.actingUserId,mcpServers:e.mcpServers,workerConfig:n}),i=e.runtimeEnv?.VIBEMUX_PI_SKILL_PATHS?.split(`
76
+ `).map(g=>g.trim()).filter(Boolean)??[],a=new Em({cwd:e.cwd,agentDir:o.agentDir,settingsManager:o.settingsManager,additionalSkillPaths:i});await a.reload();let{session:c}=await bm({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(`
77
+ `);l&&R("Pi",e.onEvent,{type:"session.status",properties:{status:{type:"busy",message:l}}});let u={activeAssistantMessageId:"pi:0",assistantCounter:0,reasoningParts:new Map,textParts:new Map},d=c.messages.length,S=c.subscribe(g=>{Nm(e,u,g)}),p=_m(c),m=()=>{c.abort()};e.signal?.addEventListener("abort",m,{once:!0});let k={attachments:[],cleanup:async()=>{}};try{k=e.preparedAttachments?{attachments:e.preparedAttachments,cleanup:async()=>{}}:await hr({attachments:e.attachments,cloudUrl:n.cloudUrl,signal:e.signal});let g=await Gm(k.attachments);if(await c.prompt(e.prompt,g.length>0?{images:g}:void 0),await jm(c),e.signal?.aborted)throw Ae();return{output:Lm(c.messages,d,u),sessionId:c.sessionId}}catch(g){throw e.signal?.aborted||g instanceof Error&&g.name==="AbortError"?Ae():(R("Pi",e.onEvent,{type:"session.error",properties:{error:g instanceof Error?g.message:"Pi \u6267\u884C\u5931\u8D25",message:g instanceof Error?g.message:"Pi \u6267\u884C\u5931\u8D25"}}),g)}finally{e.signal?.removeEventListener("abort",m),S(),p(),c.dispose(),await k.cleanup(),await s.cleanup(),o.cleanup()}};import{createHash as qm}from"node:crypto";import{copyFileSync as wa,existsSync as he,mkdirSync as Fe,mkdtempSync as zm,readFileSync as Xn,rmSync as at,writeFileSync as Sa}from"node:fs";import Yn from"node:os";import A from"node:path";var xa=".vibemux-managed.json",Fm="VIBEMUX_CODEX_MCP_TOKEN_",Hm="vibemux-task-runtime-",Jm=[".credentials.json"],Vm={OpenCode:{skillRoot:".opencode/skills"},Codex:{skillRoot:".codex/skills"},ClaudeCode:{skillRoot:".claude/skills"},Pi:{skillRoot:".pi/skills"}},Ca=e=>Vm[bt(e)].skillRoot,ze=e=>e.replace(/\\/g,"\\\\").replace(/"/g,'\\"'),ha=e=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),Km=e=>/^[A-Za-z0-9_-]+$/.test(e),Pa=(e,t)=>{if(!e.trim()||t.length===0)return!1;let r=t.map(n=>{let o=`"${ha(n)}"`;return Km(n)?`(?:${ha(n)}|${o})`:o}).join("\\s*\\.\\s*");return new RegExp(`^\\s*\\[\\s*${r}\\s*\\]\\s*$`,"m").test(e)},Vn=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("/")},Xm=e=>e.startsWith("sse://")?`http://${e.slice(6)}`:e.trim(),Ym=e=>/^https?:\/\//i.test(e)||/^sse:\/\//i.test(e),Kn=(e,t)=>{Fe(A.dirname(e),{recursive:!0}),Sa(e,`${JSON.stringify(t,null,2)}
78
+ `,"utf8")},xr=(e,t)=>{Fe(A.dirname(e),{recursive:!0}),Sa(e,t,"utf8")},Qm=(e,t)=>{let r=qm("sha1").update(t).digest("hex").slice(0,16);return A.join(ne(),"runtime",e,r)},Qn=e=>{let t=A.join(ne(),"runtime",e);return Fe(t,{recursive:!0}),zm(A.join(t,`${e}-`))},ka=e=>e.replace(/\\/g,"/").split("/").some(t=>t.startsWith(Hm)),Zm=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}},ef=e=>{let t=A.join(e,xa);if(!he(t))return[];try{let r=JSON.parse(Xn(t,"utf8"));return Array.isArray(r.slugs)?r.slugs.filter(n=>typeof n=="string"&&n.trim().length>0):[]}catch{return[]}},tf=(e,t)=>{Kn(A.join(e,xa),{slugs:t})},rf=e=>{let t=Qn(`skills-${e.toLowerCase()}`),r=A.join(t,Ca(e));return Fe(r,{recursive:!0}),{rootPath:r,promptRoot:r.replace(/\\/g,"/"),cleanup:()=>{at(t,{recursive:!0,force:!0})}}},ya=(e,t)=>{for(let n of ef(e))at(A.join(e,n),{recursive:!0,force:!0});let r=[];for(let n of t){let o=Vn(n.slug);if(!o)continue;r.push(o);let s=A.join(e,o);at(s,{recursive:!0,force:!0}),Fe(s,{recursive:!0});for(let[i,a]of Object.entries(n.files)){let c=Vn(i);if(!c)continue;let l=A.resolve(s,c);l!==s&&!l.startsWith(`${s}${A.sep}`)||xr(l,a)}he(A.join(s,"SKILL.md"))||xr(A.join(s,"SKILL.md"),n.markdown)}tf(e,r)},nf=(e,t,r)=>{if(r.length===0)return null;let n;try{let o=rf(e);try{return ya(o.rootPath,r),{promptRoot:o.promptRoot,cleanup:o.cleanup}}catch(s){throw o.cleanup(),s}}catch(o){n=o;let s=Ca(e),i=A.join(t,s);try{return Fe(i,{recursive:!0}),ya(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")}}},of=(e,t)=>{if(t.length===0)return"";let r=e?.trim();return r?["\u5F53\u524D\u4F1A\u8BDD\u53EF\u8BBF\u95EE\u4EE5\u4E0B Vibemux Skills\uFF1A",...t.map(n=>`- ${n.name} (@${n.slug}) -> ${r}/${n.slug}/SKILL.md`),"\u4EC5\u5728\u7528\u6237\u660E\u786E\u63D0\u5230\u67D0\u4E2A skill \u540D\u79F0\u6216 @slug\uFF0C\u6216\u5F53\u524D\u4EFB\u52A1\u4E0E\u8BE5 skill \u660E\u663E\u5339\u914D\u65F6\uFF0C\u518D\u8BFB\u53D6\u5BF9\u5E94 SKILL.md \u4E0E\u9644\u52A0\u6587\u4EF6\u3002","\u4E0D\u8981\u4E3A\u4E86\u8BFB\u53D6 skill \u800C\u8BFB\u53D6\uFF1B\u4E0D\u76F8\u5173\u65F6\u6309\u5E38\u89C4\u65B9\u5F0F\u56DE\u7B54\u6216\u6267\u884C\u3002"].join(`
79
+ `):""},sf=(e,t="")=>{let r=[],n={},o=0;for(let s of e.mcpServers??[]){if(!s.enabled)continue;let i=Vn(s.id||s.name).replace(/\//g,"-");if(!i||Pa(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."${ze(i)}"]`,'command = "sh"',`args = ["-lc", "${ze(c)}"]`,"");continue}if(s.target===We){if(!e.executorToken?.trim())continue;let c=`${Fm}${o}`;o+=1,n[c]=e.executorToken.trim(),r.push(`[mcp_servers."${ze(i)}"]`,`url = "${ze(`${e.cloudUrl.replace(/\/+$/,"")}/mcp/executor`)}"`,`bearer_token_env_var = "${c}"`,"");continue}if(!Ym(s.target))continue;let a=Xm(s.target);a&&r.push(`[mcp_servers."${ze(i)}"]`,`url = "${ze(a)}"`,"")}return{configText:r.join(`
80
+ `),env:n}},af=(e,t)=>{let r=De(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)},{})}},cf=(e,t)=>{let r=ka(e)?Qn("codex-home"):Qm("codex-home",e),n=process.env.CODEX_HOME?.trim()||A.join(Yn.homedir(),".codex"),o=A.join(n,"config.toml"),s=A.join(n,"auth.json"),i=A.join(r,"config.toml"),a=A.join(r,"auth.json");Fe(r,{recursive:!0});let c=t.codexConfigContent?.trim()||(he(o)?Xn(o,"utf8").trim():""),l=Pa(c,["projects",e])?"":[`[projects."${ze(e)}"]`,'trust_level = "trusted"'].join(`
81
+ `),u=sf(t,c),d=[c,l,u.configText].filter(p=>p.trim());xr(i,`${d.join(`
62
82
 
63
83
  `)}
64
- `),{runtimeEnv:{CODEX_HOME:r,...u.env},cleanup:()=>{it(r,{recursive:!0,force:!0})}}},Vd=(e,t)=>{let r=Is(W.join(qr.tmpdir(),"vibemux-claude-")),n=W.join(r,"mcp.json");return zr(n,Jd(e,t)),{runtimeArgs:["--mcp-config",n],cleanup:()=>{it(r,{recursive:!0,force:!0})}}},Kd=(e,t,r)=>{let n=Vd(t,r),o=W.join(e,".claude","settings.local.json"),s=Be(o)?Jr(o,"utf8"):void 0,i=t.claudeCodeConfigContent?.trim(),a=i?Dd(i):null;if(i){if(!a)throw n.cleanup(),new Error("Claude Code settings.json \u683C\u5F0F\u4E0D\u6B63\u786E\u3002");zr(o,a.settings)}return{runtimeArgs:n.runtimeArgs,runtimeEnv:a?.runtimeEnv??{},cleanup:()=>{i&&Nd(o,s),n.cleanup()}}},zt=(e,t)=>{let r=t.trim();return r?[r,"",e].join(`
65
- `):e},Vr=e=>{let t=e.workerConfig??b(),r=e.mcpServers?{...t,mcpServers:e.mcpServers}:t,n=e.runtimeSkillPackages??[];Be(e.cwd)&&jd(e.agentType,e.cwd,n);let o=Hd(e.agentType,n),s=qd(r),i=[o,s].filter(Boolean).join(`
66
-
67
- `);if(e.agentType==="Codex"){let a=zd(e.cwd,r);return{promptPrefix:i,runtimeEnv:a.runtimeEnv,runtimeArgs:[],cleanup:a.cleanup}}if(e.agentType==="ClaudeCode"){let a=Kd(e.cwd,r,e.actingUserId);return{promptPrefix:i,runtimeEnv:a.runtimeEnv,runtimeArgs:a.runtimeArgs,cleanup:a.cleanup}}return{promptPrefix:i,runtimeEnv:{},runtimeArgs:[],cleanup:()=>{}}};var Xd=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(`
68
- `),Kr=async e=>{if(!e.skipRuntimeCheck){let s=await ie({autoInstall:!0,target:e.agentType});if(!s.ok)throw new Error(s.message)}let t=await vs({attachments:e.attachments,cloudUrl:e.cloudUrl,signal:e.signal}),r=e.runtimePrepared?{promptPrefix:"",runtimeEnv:e.runtimeEnv??{},runtimeArgs:e.runtimeArgs??[],cleanup:()=>{}}:Vr({agentType:e.agentType,cwd:e.cwd,actingUserId:e.actingUserId,runtimeSkillPackages:e.runtimeSkillPackages,mcpServers:e.mcpServers}),n={...r.runtimeEnv,...e.runtimeEnv??{}},o=Ps(zt(e.prompt,r.promptPrefix),t.attachments);try{return e.agentType==="OpenCode"?await Ur({actingUserId:e.actingUserId,cwd:e.cwd,title:e.title,prompt:o,executionModel:e.executionModel,agentSettings:e.agentSettings,opencodeConfig:e.opencodeConfig,mcpServers:e.mcpServers,runtimeEnv:n,runtimeArgs:r.runtimeArgs,signal:e.signal,onEvent:s=>{M("OpenCode",e.onEvent,s)}}):e.agentType==="Codex"?await Ss({...e,prompt:o,runtimeEnv:n,runtimeArgs:r.runtimeArgs}):await ys({...e,prompt:o,runtimeEnv:n,runtimeArgs:r.runtimeArgs})}finally{await t.cleanup(),r.cleanup()}},Xr=async e=>{if(!e.skipRuntimeCheck&&e.agentType==="OpenCode"){let n=await ie({autoInstall:!0,target:e.agentType});if(!n.ok)throw new Error(n.message)}let t=Vr({agentType:e.agentType,cwd:e.cwd,actingUserId:e.actingUserId,runtimeSkillPackages:e.runtimeSkillPackages,mcpServers:e.mcpServers}),r={...t.runtimeEnv,...e.runtimeEnv??{}};if(e.agentType==="OpenCode")try{return await $r({actingUserId:e.actingUserId,cwd:e.cwd,title:e.title,description:zt(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 Kr({agentType:e.agentType,actingUserId:e.actingUserId,cwd:e.cwd,title:e.title,prompt:zt(Xd(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 As=e=>{let t=new Map,r=new Map,n=[],o=c=>{let u=n.indexOf(c);u!==-1&&n.splice(u,1),e.setQueuedTaskIds(e.getQueuedTaskIds().filter(d=>d!==et(c)))},s=c=>{t.delete(c),r.delete(c),e.setRunningTaskIds(e.getRunningTaskIds().filter(u=>u!==et(c))),e.syncRuntimeState(),e.drainExecutionQueue()},i=c=>{let u=b();e.setConfig(u),o(c.requestId),e.setRunningTaskIds([...e.getRunningTaskIds(),et(c.requestId)]),e.syncRuntimeState(),console.log("[worker-agent] prompt request",JSON.stringify({requestId:c.requestId,agentType:c.agentType,cwd:c.cwd,title:c.title,executionModel:c.executionModel??"default",attachmentCount:c.attachments?.length??0,promptPreview:c.prompt.slice(0,160)}));let d=new AbortController;r.set(c.requestId,d);let w=e.getConnection();Kr({agentType:c.agentType,actingUserId:c.actingUserId,cwd:c.cwd,title:c.title,prompt:c.prompt,attachments:c.attachments,cloudUrl:u.cloudUrl,executionModel:c.executionModel,agentSettings:c.agentSettings??u.agentSettings[c.agentType],opencodeConfig:c.opencodeConfig,mcpServers:c.mcpServers,runtimeSkillPackages:c.runtimeSkillPackages,runtimeEnv:c.runtimeEnv,signal:d.signal,onEvent:p=>{u=e.getConfig(),e.getConnection()?.send({type:"executor.agent.prompt.event",executorId:u.executorId,requestId:c.requestId,event:p,at:new Date().toISOString()})}}).then(p=>{u=e.getConfig(),console.log("[worker-agent] prompt response",JSON.stringify({requestId:c.requestId,ok:!0,sessionId:p.sessionId,outputPreview:p.output.slice(0,200)})),w?.send({type:"executor.agent.prompt.response",executorId:u.executorId,requestId:c.requestId,result:{ok:!0,output:p.output,sessionId:p.sessionId},at:new Date().toISOString()})}).catch(p=>{u=e.getConfig(),console.log("[worker-agent] prompt response",JSON.stringify({requestId:c.requestId,ok:!1,error:p instanceof Error?p.message:`${c.agentType} \u6267\u884C\u5931\u8D25\u3002`})),w?.send({type:"executor.agent.prompt.response",executorId:u.executorId,requestId:c.requestId,result:{ok:!1,output:p instanceof Error?p.message:`${c.agentType} \u6267\u884C\u5931\u8D25\u3002`},at:new Date().toISOString()})}).finally(()=>{s(c.requestId)})},a=()=>{let c=b();for(e.setConfig(c);e.getRunningTaskIds().length<Math.max(1,c.maxConcurrency)&&n.length>0;){let u=n[0];if(!u)break;let d=t.get(u);if(!d){o(u);continue}i(d),c=e.getConfig()}};return{drainPromptQueue:a,handlePromptMessage:c=>c.type==="executor.agent.prompt.request"?(t.has(c.requestId)||(t.set(c.requestId,c),n.push(c.requestId),e.setQueuedTaskIds([...e.getQueuedTaskIds(),et(c.requestId)]),e.syncRuntimeState()),a(),!0):(o(c.requestId),t.delete(c.requestId),e.syncRuntimeState(),r.get(c.requestId)?.abort(),r.delete(c.requestId),e.drainExecutionQueue(),!0)}};var Yd=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"task",at=e=>`task/${Yd(e)}`;var Qd=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."},Zd=e=>{let t=Qd(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(`
69
- `)},eu=(e,t)=>{let r=(e?.trim()||t?.trim()||"Worker delivery update").replace(/\s+/g," ");return r.length>72?`${r.slice(0,69)}...`:r},tu=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||at(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||at(e.taskId),n=e.filesChanged.length>0&&!!e.commitShas?.length;t.pullRequest={ready:n,remoteReady:!!e.remoteBranchName,repoUrl:e.repoUrl,title:n?eu(e.taskTitle,e.taskDescription):void 0,description:n?Zd({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},_e=(e,t)=>({...e,delivery:tu({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{mkdirSync as vu}from"node:fs";import{simpleGit as ru}from"simple-git";var nu=async e=>{let t=await e.status();return Array.from(new Set(t.files.map(r=>r.path))).sort()},ou=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}},Ms=async(e,t,r)=>{let n=ru(t),o=await nu(n),s=await ou(n,e);return{filesChanged:o,commitShas:void 0,patchArtifact:s,remoteBranchName:e.returnMode==="branch"?r:void 0}};import{spawn as su}from"node:child_process";var iu=["&&","||","|",";",">","<","$(","`"],au=(e,t=1600)=>{let r=e.trim();return r?r.length>t?`${r.slice(0,t)}
70
- ...\uFF08\u5DF2\u622A\u65AD\uFF09`:r:""},cu=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},lu=e=>{let t=e.trim();if(!t)throw new Error("\u73AF\u5883\u6A21\u677F\u547D\u4EE4\u4E0D\u80FD\u4E3A\u7A7A\u3002");if(iu.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=cu(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}},Os=(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},du=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):[],Yr=e=>{let t=du(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(`
71
- `)},Bs=async e=>{let t=lu(e.commandText);return await new Promise((r,n)=>{let o=su(t.command,t.args,{cwd:e.cwd,env:{...e.env??process.env,...t.env},stdio:["ignore","pipe","pipe"]}),s="",i="",a=!1,l=()=>{a=!0,o.kill("SIGTERM")};e.signal?.addEventListener("abort",l,{once:!0}),o.stdout.on("data",c=>{s+=c.toString()}),o.stderr.on("data",c=>{i+=c.toString()}),o.on("error",c=>{e.signal?.removeEventListener("abort",l),n(new Error(`${e.label} \u542F\u52A8\u5931\u8D25\uFF1A${c.message}`))}),o.on("close",(c,u)=>{if(e.signal?.removeEventListener("abort",l),a){n(new Error(`${e.label} \u5DF2\u53D6\u6D88\u3002`));return}let d=au([s,i].filter(Boolean).join(`
72
- `));if(c===0){r({output:d});return}let w=u?`\u4FE1\u53F7 ${u}`:`\u9000\u51FA\u7801 ${c??"unknown"}`;n(new Error([`${e.label} \u6267\u884C\u5931\u8D25\uFF08${w}\uFF09\u3002`,d].filter(Boolean).join(`
73
-
74
- `)))})})},Qr=async e=>{let t=Os(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 Bs({cwd:e.cwd,label:r,commandText:t,signal:e.signal,env:e.env});return e.emit("executing",n.output?`${r} \u5DF2\u5B8C\u6210\u3002
75
- ${n.output}`:`${r} \u5DF2\u5B8C\u6210\u3002`),`${r}\uFF1A${t}`},Zr=e=>{let t=Os(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:Bs({cwd:e.cwd,label:r,commandText:t,signal:e.signal,env:e.env})}},en=async(e,t)=>{let r=await e.promise;return t("executing",r.output?`${e.label} \u5DF2\u5B8C\u6210\u3002
76
- ${r.output}`:`${e.label} \u5DF2\u5B8C\u6210\u3002`),`${e.label}\uFF1A${e.commandText}`};import{createHash as uu}from"node:crypto";import{existsSync as _s,mkdirSync as Ws,rmSync as pu}from"node:fs";import $e from"node:path";import{simpleGit as We}from"simple-git";var gu="main",mu=(e,t)=>{let r={...de(t),...e?{baseDir:e}:{}};return We(r).env(t??{})},fu=e=>uu("sha1").update(e).digest("hex").slice(0,12),hu=e=>e.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"repo",ku=(e,t)=>{let r=$e.basename(t).replace(/\.git$/i,"");return $e.join(e,"repos",`${hu(r)}-${fu(t)}`)},$s=e=>e.baseCommit?.trim()||e.defaultBranch?.trim()||gu,rn=e=>`origin/${e}`,yu=async(e,t,r)=>(await mu(void 0,r).raw(["ls-remote","--heads",e,t])).trim().length>0,tn=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}`])},Us=async(e,t)=>(await e.branch(["-r"])).all.includes(rn(t)),wu=async(e,t)=>{await tn(e,t),await Us(e,t)&&await e.rebase([rn(t)])},Ds=e=>e.gitIdentity??{mode:e.gitIdentityMode??"personal"},Ns=e=>e.workingDirectoryMode==="original-dir"?"original-dir":"worktree",xu=(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,Cu=async e=>{let t=await e.raw(["worktree","list","--porcelain"]),r=[],n=null;for(let o of t.split(`
77
- `)){if(o.startsWith("worktree ")){n&&r.push(n),n={path:$e.resolve(o.slice(9).trim())};continue}o.startsWith("branch ")&&n&&(n.branch=o.slice(7).trim())}return n&&r.push(n),r},Su=async(e,t)=>(await e.branchLocal()).all.includes(t),bu=e=>{pu(e,{recursive:!0,force:!0,maxRetries:5,retryDelay:100})},Ls=async(e,t,r)=>{let n=We(e),o=$e.resolve(t),s=`refs/heads/${r}`;try{await n.raw(["worktree","prune"])}catch{}let a=(await Cu(n)).find(l=>l.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(bu(o),await Su(n,r))try{await n.deleteLocalBranch(r,!0)}catch{}try{await n.raw(["worktree","prune"])}catch{}Ws($e.dirname(o),{recursive:!0})},Gs=async e=>{let t=xu(e.bindings,e.task)||ku(e.workspaceRoot,e.task.repoUrl),r=$s(e.task);if(Ws($e.dirname(t),{recursive:!0}),e.task.versionControl==="git-local"){let s=We(t).env(e.env??{});if(!_s(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}}_s(t)||(console.log("[worker] [task-worktree] cloning target branch only",JSON.stringify({repoDir:t,repoUrl:e.task.repoUrl,startPoint:r})),await We().env(e.env??{}).clone(e.task.repoUrl,t,["--no-checkout","--single-branch","--branch",r]));let n=We(t).env(e.env??{});await tn(n,r);let o=await yu(e.task.repoUrl,e.branchName,e.env);return o&&e.branchName!==r&&await tn(n,e.branchName),{repoDir:t,git:n,taskBranchExists:o}},js=async e=>{let t=e.taskBranchExists||await Us(e.git,e.branchName)?rn(e.branchName):$s(e.task);return await e.git.checkout(["-B",e.branchName,t]),t},Hs=async e=>{let t=We(e.worktreePath),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(),s,i="\u5DF2\u521B\u5EFA\u672C\u5730\u63D0\u4EA4\u3002";return e.identity.credentialToken?(await wu(t,e.branchName),await t.push(["-u","origin",e.branchName]),s=e.branchName,i=`\u5DF2\u63A8\u9001\u8FDC\u7AEF\u5206\u652F ${e.branchName}\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 qs=async e=>{let t=new Date().toISOString(),r=at(e.task.id),n=qn(e.workspaceRoot,e.task.id,e.task.workspaceId),o=Ns(e.task),s=null,i=null;try{e.emit("preparing","\u68C0\u67E5 Worker \u8FD0\u884C\u73AF\u5883");let a=await ie({autoInstall:!0,target:e.task.agentType});if(!a.ok)throw new Error(a.message);if(e.emit("preparing","\u8FD0\u884C\u73AF\u5883\u5DF2\u5C31\u7EEA"),e.task.versionControl==="none"){let R=e.task.rootPath?.trim()||n;vu(R,{recursive:!0}),e.emit("preparing",`\u9879\u76EE\u76EE\u5F55\u5DF2\u5C31\u7EEA\uFF1A${R}`);let C=Zr({step:"install",task:e.task,cwd:R,signal:e.signal,emit:e.emit}),v=[];C&&v.push(await en(C,e.emit)),e.emit("executing",`\u5F00\u59CB\u8C03\u7528 ${e.task.agentType} \u6267\u884C\u4EFB\u52A1`);let P=await Xr({agentType:e.task.agentType,actingUserId:e.task.requestedByUserId,cwd:R,title:`Distributed Task ${e.task.id}`,description:Yr(e.task),executionModel:e.task.executionModel??e.task.opencodeConfig?.model,agentSettings:e.task.agentSettings,opencodeConfig:e.task.opencodeConfig,skipRuntimeCheck:!0,runtimeSkillPackages:e.task.runtimeSkillPackages,runtimeEnv:e.task.runtimeEnv,signal:e.signal});for(let g of["build","test","lint"]){let y=await Qr({step:g,task:e.task,cwd:R,signal:e.signal,emit:e.emit});y&&v.push(y)}let A=new Date().toISOString(),$=_e({taskId:e.task.id,status:"completed",returnMode:e.task.returnMode,summary:[v.length>0?`\u5DF2\u6267\u884C\u9879\u76EE\u9884\u8BBE\u547D\u4EE4\uFF1A
78
- ${v.map(g=>`- ${g}`).join(`
79
- `)}`:void 0,P.output].filter(Boolean).join(`
80
-
81
- `),output:P.output,filesChanged:[],startedAt:t,completedAt:A,durationSec:Math.max(0,Math.round((new Date(A).getTime()-new Date(t).getTime())/1e3)),executorNodeId:e.executorId,agentSessionId:P.sessionId,opencodeSessionId:P.sessionId},{repoUrl:e.task.repoUrl,baseBranch:e.task.defaultBranch,taskDescription:e.task.description});return{task:{...e.task,status:"completed",startedAt:t,completedAt:A,updatedAt:A,result:$}}}let l=Ds(e.task);i=ae({taskId:e.task.id,identity:l,repoUrl:e.task.repoUrl}),e.emit("preparing","\u51C6\u5907\u672C\u5730\u4ED3\u5E93");let{repoDir:c,git:u,taskBranchExists:d}=await Gs({workspaceRoot:e.workspaceRoot,task:e.task,branchName:r,bindings:e.projectBindings,env:i.env});e.emit("preparing",`\u4ED3\u5E93\u5DF2\u5C31\u7EEA\uFF1A${c}`);let w=o==="original-dir"?e.task.rootPath?.trim()||c:n;if(o==="worktree"){await Ls(c,n,r);let R=d||await u.branch(["-r"]).then(C=>C.all.includes(`origin/${r}`))?`origin/${r}`:e.task.baseCommit?.trim()||e.task.defaultBranch?.trim()||"main";await u.raw(["worktree","add","--force","-B",r,n,R]),e.emit("executing",`\u5DF2\u521B\u5EFA worktree\uFF1A${n}`)}else{let R=await js({git:u,task:e.task,branchName:r,taskBranchExists:d});e.emit("executing",`\u5DF2\u5728\u539F\u59CB\u76EE\u5F55 ${w} \u5207\u6362\u5230 ${R} \u5E76\u5F00\u59CB\u6267\u884C`)}s=$o({taskId:e.task.id,worktreePath:w,identity:l,repoUrl:e.task.repoUrl});let p=s.env,x=Zr({step:"install",task:e.task,cwd:w,signal:e.signal,env:p,emit:e.emit}),h=[];x&&h.push(await en(x,e.emit)),e.emit("executing",`\u5F00\u59CB\u8C03\u7528 ${e.task.agentType} \u6267\u884C\u4EFB\u52A1`);let m=await Xr({agentType:e.task.agentType,actingUserId:e.task.requestedByUserId,cwd:w,title:`Distributed Task ${e.task.id}`,description:Yr(e.task),executionModel:e.task.executionModel??e.task.opencodeConfig?.model,agentSettings:e.task.agentSettings,opencodeConfig:e.task.opencodeConfig,skipRuntimeCheck:!0,runtimeSkillPackages:e.task.runtimeSkillPackages,runtimeEnv:e.task.runtimeEnv,signal:e.signal});for(let R of["build","test","lint"]){let C=await Qr({step:R,task:e.task,cwd:w,signal:e.signal,env:p,emit:e.emit});C&&h.push(C)}let k=await Hs({task:e.task,worktreePath:w,branchName:r,identity:l}),S=await Ms(e.task,w,r),E;S.patchArtifact&&e.uploadPatchArtifact&&(e.emit("syncing_back","\u6B63\u5728\u4E0A\u4F20 patch \u4EA7\u7269\u5230\u63A7\u5236\u9762"),E=(await e.uploadPatchArtifact({taskId:e.task.id,filename:S.patchArtifact.filename,content:S.patchArtifact.content})).artifactId);let G=new Date().toISOString(),F=_e({taskId:e.task.id,status:"completed",returnMode:e.task.returnMode,summary:[h.length>0?`\u5DF2\u6267\u884C\u9879\u76EE\u9884\u8BBE\u547D\u4EE4\uFF1A
82
- ${h.map(R=>`- ${R}`).join(`
83
- `)}`:void 0,m.output,k.pushMessage].filter(Boolean).join(`
84
-
85
- `),output:m.output,filesChanged:k.changedFiles.length>0?k.changedFiles:S.filesChanged,remoteBranchName:k.remoteBranchName,commitShas:k.commitShas??S.commitShas,patchArtifactId:E,startedAt:t,completedAt:G,durationSec:Math.max(0,Math.round((new Date(G).getTime()-new Date(t).getTime())/1e3)),executorNodeId:e.executorId,agentSessionId:m.sessionId,opencodeSessionId:m.sessionId},{repoUrl:e.task.repoUrl,baseBranch:e.task.defaultBranch,taskDescription:e.task.description});return{task:{...e.task,status:"completed",startedAt:t,completedAt:G,updatedAt:G,result:F}}}catch(a){let l=new Date().toISOString(),c=a instanceof Error?a.message:"worker task execution failed";return{task:{...e.task,status:"failed",startedAt:t,completedAt:l,updatedAt:l,errorMessage:c,result:_e({taskId:e.task.id,status:"failed",returnMode:e.task.returnMode,summary:c,output:c,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{s?.cleanup(),i?.cleanup()}};var nn=new Map,on=e=>{let t=nn.get(e);if(t){for(let r of t)clearTimeout(r);nn.delete(e)}},Fs=(e,t,r)=>{let n=new Date().toISOString();return{...e,status:"cancelled",executorNodeId:t,completedAt:n,updatedAt:n,result:_e({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})}},Js=on,zs=e=>{let{task:t,executorId:r,workspaceRoot:n,projectBindings:o,uploadPatchArtifact:s,connection:i}=e,a=new AbortController,l=[setTimeout(()=>{e.onStart(t.id),qs({task:t,executorId:r,workspaceRoot:n,projectBindings:o,signal:a.signal,uploadPatchArtifact:s,emit(c,u){a.signal.aborted||i.send({type:"task.event",taskId:t.id,idempotencyKey:t.idempotencyKey,executorId:r,status:c,message:u,at:new Date().toISOString()})}}).then(({task:c})=>{a.signal.aborted||(e.onFinish(t.id),i.send({type:"task.result",executorId:r,task:c}),on(t.id))})},20)];return nn.set(t.id,l),{abort(){a.abort(),e.onFinish(t.id),on(t.id)}}};var Vs=(e,t)=>{let r=t.getConfig(),n=t.getConnection();if(e.type==="task.assign"){let o=t.getRunningTaskIds(),s=t.getQueuedTaskIds();return t.assignedTasks.has(e.task.id)||o.includes(e.task.id)||s.includes(e.task.id)?(t.assignedTasks.set(e.task.id,e.task),!0):(t.assignedTasks.set(e.task.id,e.task),t.setQueuedTaskIds([...s,e.task.id]),t.syncRuntimeState(),n?.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 o=t.assignedTasks.get(e.taskId);return t.activeExecutions.get(e.taskId)?.abort(),t.activeExecutions.delete(e.taskId),Js(e.taskId),t.assignedTasks.delete(e.taskId),t.setQueuedTaskIds(t.getQueuedTaskIds().filter(s=>s!==e.taskId)),t.setRunningTaskIds(t.getRunningTaskIds().filter(s=>s!==e.taskId)),t.syncRuntimeState(),t.drainExecutionQueue(),o&&n?.send({type:"task.result",executorId:r.executorId,task:Fs(o,r.executorId,e.reason)}),!0}return!1};var Ks=(e,t)=>{let r=t.getConfig(),n=t.getConnection(),o=()=>(r=b(),t.setConfig(r),r);if(e.type==="executor.terminal.request")return o(),me("received one-shot terminal request",{requestId:e.requestId,command:e.command,cwd:e.cwd||r.workspaceRoot}),t.runTerminalCommand(e.command,e.cwd||r.workspaceRoot).then(s=>{n?.send({type:"executor.terminal.response",executorId:r.executorId,requestId:e.requestId,result:s})}),!0;if(e.type==="executor.terminal.session.open"){o();let s=e.cwd||r.workspaceRoot;me("received terminal session open",{sessionId:e.sessionId,cwd:s});let i=t.openTerminalSession({cwd:s,onExit:a=>{t.terminalSessions.delete(e.sessionId),n?.send({type:"executor.terminal.session.exit",executorId:r.executorId,sessionId:e.sessionId,exitCode:a,at:new Date().toISOString()})},onLog:(a,l)=>{me(a,{sessionId:e.sessionId,...l})},onOutput:(a,l)=>{!n||!r.executorId||hs({connection:n,executorId:r.executorId,sessionId:e.sessionId,stream:a,chunk:l})},onReady:(a,l)=>{n?.send({type:"executor.terminal.session.ready",executorId:r.executorId,sessionId:e.sessionId,cwd:s,mode:a,at:new Date().toISOString()}),me("terminal session ready",{sessionId:e.sessionId,cwd:s,mode:a,backend:l})}});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 s=t.terminalSessions.get(e.sessionId);return s&&(s.kill(),t.terminalSessions.delete(e.sessionId)),!0}return!1};var Xs=e=>{let t=As(e);return{handleMessage:n=>{if(e.getCurrentSocket()===e.expectedSocket&&!Oo(n,e)&&!ks(n,e)){if(n.type==="executor.agent.prompt.request"||n.type==="executor.agent.prompt.cancel"){t.handlePromptMessage(n);return}Ks(n,e)||Vs(n,e)}},drainPromptQueue:t.drainPromptQueue}};import{existsSync as sn,mkdirSync as Pu,readFileSync as Ys}from"node:fs";import{spawnSync as Iu}from"node:child_process";import Tu from"node:os";import Vt from"node:path";var Qs=Vt.join(Tu.homedir(),".ssh"),Eu=["id_ed25519.pub","id_rsa.pub","id_ecdsa.pub"],Ru="vibemux_worker_ed25519",Au=e=>{Pu(Vt.dirname(e),{recursive:!0});let t=Iu("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())},an=()=>{try{for(let r of Eu){let n=Vt.join(Qs,r);if(sn(n))return Ys(n,"utf8").trim()}let e=Vt.join(Qs,Ru),t=`${e}.pub`;return sn(t)||Au(e),sn(t)?Ys(t,"utf8").trim():void 0}catch{return}};import{spawn as cn,spawnSync as Mu}from"node:child_process";import{accessSync as Ou,constants as Bu}from"node:fs";import Zs from"node:os";import{createRequire as _u}from"node:module";import Wu from"node:path";import{StringDecoder as ei}from"node:string_decoder";var ri=120,ni=32,ln="xterm-256color",$u=250,Uu=_u(import.meta.url),Du=String.raw`
84
+ `);let S=t.codexAuthContent?.trim();return S?xr(a,`${S}
85
+ `):he(s)&&!he(a)&&wa(s,a),{runtimeEnv:{CODEX_HOME:r,...u.env},cleanup:()=>{ka(e)&&at(r,{recursive:!0,force:!0})}}},lf=(e,t)=>{let r=Qn("claude-home"),n=A.join(r,"mcp.json"),o=process.env.CLAUDE_HOME?.trim()||A.join(Yn.homedir(),".claude"),i=[A.join(o,"settings.json"),A.join(o,"config.json")].reduce((l,u)=>{if(l.trim()||!he(u))return l;try{return Xn(u,"utf8").trim()}catch{return l}},""),a=e.claudeCodeConfigContent?.trim()||i,c=a?Zm(a):null;if(a){if(!c)throw at(r,{recursive:!0,force:!0}),new Error("Claude Code settings.json \u683C\u5F0F\u4E0D\u6B63\u786E\u3002");Kn(A.join(r,"settings.json"),c.settings)}for(let l of Jm){let u=A.join(o,l),d=A.join(r,l);he(u)&&!he(d)&&wa(u,d)}return Kn(n,af(e,t)),{runtimeArgs:["--mcp-config",n],runtimeEnv:{CLAUDE_HOME:r,...c?.runtimeEnv??{}},cleanup:()=>{at(r,{recursive:!0,force:!0})}}},uf=(e,t)=>{let r=lf(e,t);return{runtimeArgs:r.runtimeArgs,runtimeEnv:r.runtimeEnv,cleanup:()=>{r.cleanup()}}},Cr=(e,t)=>{let r=t.trim();return r?[r,"",e].join(`
86
+ `):e},va=e=>({promptPrefix:e.promptPrefix,runtimeEnv:{},runtimeArgs:[],cleanup:()=>{e.runtimeSkills?.cleanup()}}),df=e=>{let t=cf(e.cwd,e.effectiveConfig);return{promptPrefix:e.promptPrefix,runtimeEnv:t.runtimeEnv,runtimeArgs:[],cleanup:()=>{e.runtimeSkills?.cleanup(),t.cleanup()}}},pf=e=>{let t=uf(e.effectiveConfig,e.actingUserId);return{promptPrefix:e.promptPrefix,runtimeEnv:t.runtimeEnv,runtimeArgs:t.runtimeArgs,cleanup:()=>{e.runtimeSkills?.cleanup(),t.cleanup()}}},gf=e=>{let t=e.effectiveConfig.agentSettings.Pi.agentDir?.trim()||e.effectiveConfig.piAgentDir?.trim()||A.join(Yn.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()}}},mf={OpenCode:va,Codex:df,ClaudeCode:pf,Pi:gf},Zn=e=>{let t=e.workerConfig??P(),r=e.mcpServers?{...t,mcpServers:e.mcpServers}:t,n=e.runtimeSkillPackages??[],o=he(e.cwd)?nf(e.agentType,e.cwd,n):null,i=of(o?.promptRoot,n),a=bt(e.agentType);return(mf[a]??va)({agentType:e.agentType,actingUserId:e.actingUserId,cwd:e.cwd,effectiveConfig:r,promptPrefix:i,runtimeSkills:o})};var ff=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(`
87
+ `),hf={OpenCode:async({params:e,prompt:t,runtimeEnv:r,runtimeArgs:n})=>Sn({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=>{R("OpenCode",e.onEvent,o)}}),Codex:async({params:e,prompt:t,runtimeEnv:r,runtimeArgs:n})=>ta({...e,prompt:t,runtimeEnv:r,runtimeArgs:n}),ClaudeCode:async({params:e,prompt:t,runtimeEnv:r,runtimeArgs:n})=>Xi({...e,prompt:t,runtimeEnv:r,runtimeArgs:n}),Pi:async({params:e,prompt:t,runtimeEnv:r})=>fa({...e,prompt:t,runtimeEnv:r})},eo=async e=>{if(!e.skipRuntimeCheck){let s=await pe({autoInstall:!0,target:e.agentType});if(!s.ok)throw new Error(s.message)}let t=await hr({attachments:e.attachments,cloudUrl:e.cloudUrl,signal:e.signal}),r=e.runtimePrepared?{promptPrefix:"",runtimeEnv:e.runtimeEnv??{},runtimeArgs:e.runtimeArgs??[],cleanup:()=>{}}:Zn({agentType:e.agentType,cwd:e.cwd,actingUserId:e.actingUserId,runtimeSkillPackages:e.runtimeSkillPackages,mcpServers:e.mcpServers}),n={...r.runtimeEnv,...e.runtimeEnv??{}},o=sa(Cr(e.prompt,r.promptPrefix),t.attachments);try{let s=bt(e.agentType),i=hf[s];if(!i)throw new Error(`\u6682\u672A\u914D\u7F6E ${s} prompt runner\u3002`);return await i({params:{...e,preparedAttachments:t.attachments},prompt:o,runtimeEnv:n,runtimeArgs:r.runtimeArgs})}finally{await t.cleanup(),r.cleanup()}},to=async e=>{if(!e.skipRuntimeCheck&&e.agentType==="OpenCode"){let n=await pe({autoInstall:!0,target:e.agentType});if(!n.ok)throw new Error(n.message)}let t=Zn({agentType:e.agentType,cwd:e.cwd,actingUserId:e.actingUserId,runtimeSkillPackages:e.runtimeSkillPackages,mcpServers:e.mcpServers}),r={...t.runtimeEnv,...e.runtimeEnv??{}};if(e.agentType==="OpenCode")try{return await wn({actingUserId:e.actingUserId,cwd:e.cwd,title:e.title,description:Cr(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 eo({agentType:e.agentType,actingUserId:e.actingUserId,cwd:e.cwd,title:e.title,prompt:Cr(ff(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 Ia=e=>{let t=new Map,r=new Map,n=[],o=u=>{let d=n.indexOf(u);d!==-1&&n.splice(d,1),e.setQueuedTaskIds(e.getQueuedTaskIds().filter(S=>S!==It(u)))},s=u=>{t.delete(u),r.delete(u),e.setRunningTaskIds(e.getRunningTaskIds().filter(d=>d!==It(u))),e.syncRuntimeState(),e.drainExecutionQueue()},i=u=>{let d=P();e.setConfig(d),o(u.requestId),e.setRunningTaskIds([...e.getRunningTaskIds(),It(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 S=u.agentWorkdir?.agentId?(()=>{let m=dr(u.agentWorkdir.agentId);return di(u.agentWorkdir.agentId,u.agentWorkdir.sessionId?.trim()||u.requestId),m.summary.workDirPath})():u.cwd,p=new AbortController;r.set(u.requestId,p),eo({agentType:u.agentType,actingUserId:u.actingUserId,resumeSessionId:u.resumeSessionId,cwd:S,title:u.title,prompt:u.prompt,attachments:u.attachments,cloudUrl:d.cloudUrl,executionModel:u.executionModel,agentSettings:u.agentSettings??d.agentSettings[u.agentType],opencodeConfig:u.opencodeConfig,mcpServers:u.mcpServers,runtimeSkillPackages:u.runtimeSkillPackages,runtimeEnv:u.runtimeEnv,signal:p.signal,onEvent:m=>{d=e.getConfig(),e.getConnection()?.send({type:"executor.agent.prompt.event",executorId:d.executorId,requestId:u.requestId,event:m,at:new Date().toISOString()})}}).then(m=>{d=e.getConfig(),console.log("[worker-agent] prompt response",JSON.stringify({requestId:u.requestId,ok:!0,sessionId:m.sessionId,outputPreview:m.output.slice(0,200)})),e.send({type:"executor.agent.prompt.response",executorId:d.executorId,requestId:u.requestId,result:{ok:!0,output:m.output,sessionId:m.sessionId},at:new Date().toISOString()})}).catch(m=>{d=e.getConfig(),console.log("[worker-agent] prompt response",JSON.stringify({requestId:u.requestId,ok:!1,error:m instanceof Error?m.message:`${u.agentType} \u6267\u884C\u5931\u8D25\u3002`})),e.send({type:"executor.agent.prompt.response",executorId:d.executorId,requestId:u.requestId,result:{ok:!1,output:m instanceof Error?m.message:`${u.agentType} \u6267\u884C\u5931\u8D25\u3002`},at:new Date().toISOString()})}).finally(()=>{s(u.requestId)})},a=()=>{let u=P();for(e.setConfig(u);e.getRunningTaskIds().length<Math.max(1,u.maxConcurrency)&&n.length>0;){let d=n[0];if(!d)break;let S=t.get(d);if(!S){o(d);continue}i(S),u=e.getConfig()}};return{abortActivePrompts:()=>{let u=[...t.keys()];if(u.length!==0){for(let d of u)o(d),t.delete(d),r.get(d)?.abort(),r.delete(d);e.syncRuntimeState()}},drainPromptQueue:a,handlePromptMessage:u=>u.type==="executor.agent.prompt.request"?(t.has(u.requestId)||(t.set(u.requestId,u),n.push(u.requestId),e.setQueuedTaskIds([...e.getQueuedTaskIds(),It(u.requestId)]),e.syncRuntimeState()),a(),!0):(o(u.requestId),t.delete(u.requestId),e.syncRuntimeState(),r.get(u.requestId)?.abort(),r.delete(u.requestId),e.drainExecutionQueue(),!0)}};var kf=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"task",Ot=e=>`task/${kf(e)}`;var yf=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."},wf=e=>{let t=yf(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(`
88
+ `)},Sf=(e,t)=>{let r=(e?.trim()||t?.trim()||"Worker delivery update").replace(/\s+/g," ");return r.length>72?`${r.slice(0,69)}...`:r},xf=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||Ot(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||Ot(e.taskId),n=e.filesChanged.length>0&&!!e.commitShas?.length;t.pullRequest={ready:n,remoteReady:!!e.remoteBranchName,repoUrl:e.repoUrl,title:n?Sf(e.taskTitle,e.taskDescription):void 0,description:n?wf({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},ct=(e,t)=>({...e,delivery:xf({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 zf,mkdirSync as Ff,rmSync as Ua,symlinkSync as Hf}from"node:fs";import Jf from"node:os";import La from"node:path";import{simpleGit as Cf}from"simple-git";var Pf=async e=>{let t=await e.status();return Array.from(new Set(t.files.map(r=>r.path))).sort()},vf=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}},ba=async(e,t,r)=>{let n=Cf(t),o=await Pf(n),s=await vf(n,e);return{filesChanged:o,commitShas:void 0,patchArtifact:s,remoteBranchName:e.returnMode==="branch"?r:void 0}};import{spawn as If}from"node:child_process";var bf=["&&","||","|",";",">","<","$(","`"],Ef=(e,t=1600)=>{let r=e.trim();return r?r.length>t?`${r.slice(0,t)}
89
+ ...\uFF08\u5DF2\u622A\u65AD\uFF09`:r:""},Rf=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},Tf=e=>{let t=e.trim();if(!t)throw new Error("\u73AF\u5883\u6A21\u677F\u547D\u4EE4\u4E0D\u80FD\u4E3A\u7A7A\u3002");if(bf.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=Rf(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}},Ea=(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},Af=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):[],ro=e=>{let t=Af(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(`
90
+ `)},Ra=async e=>{let t=Tf(e.commandText);return await new Promise((r,n)=>{let o=If(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,u)=>{if(e.signal?.removeEventListener("abort",c),a){n(new Error(`${e.label} \u5DF2\u53D6\u6D88\u3002`));return}let d=Ef([s,i].filter(Boolean).join(`
91
+ `));if(l===0){r({output:d});return}let S=u?`\u4FE1\u53F7 ${u}`:`\u9000\u51FA\u7801 ${l??"unknown"}`;n(new Error([`${e.label} \u6267\u884C\u5931\u8D25\uFF08${S}\uFF09\u3002`,d].filter(Boolean).join(`
92
+
93
+ `)))})})},no=async e=>{let t=Ea(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 Ra({cwd:e.cwd,label:r,commandText:t,signal:e.signal,env:e.env});return e.emit("executing",n.output?`${r} \u5DF2\u5B8C\u6210\u3002
94
+ ${n.output}`:`${r} \u5DF2\u5B8C\u6210\u3002`),`${r}\uFF1A${t}`},oo=e=>{let t=Ea(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:Ra({cwd:e.cwd,label:r,commandText:t,signal:e.signal,env:e.env})}},so=async(e,t)=>{let r=await e.promise;return t("executing",r.output?`${e.label} \u5DF2\u5B8C\u6210\u3002
95
+ ${r.output}`:`${e.label} \u5DF2\u5B8C\u6210\u3002`),`${e.label}\uFF1A${e.commandText}`};import{createHash as Mf}from"node:crypto";import{existsSync as Ta,mkdirSync as Aa,rmSync as Of}from"node:fs";import ut from"node:path";import{simpleGit as lt}from"simple-git";var _f="main",Wf=(e,t)=>{let r={...Ce(t),...e?{baseDir:e}:{}};return lt(r).env(t??{})},Df=e=>Mf("sha1").update(e).digest("hex").slice(0,12),Bf=e=>e.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"repo",Nf=(e,t)=>{let r=ut.basename(t).replace(/\.git$/i,"");return ut.join(e,"repos",`${Bf(r)}-${Df(t)}`)},Ma=e=>e.baseCommit?.trim()||e.defaultBranch?.trim()||_f,ao=e=>`origin/${e}`,$f=async(e,t,r)=>(await Wf(void 0,r).raw(["ls-remote","--heads",e,t])).trim().length>0,io=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}`])},Oa=async(e,t)=>(await e.branch(["-r"])).all.includes(ao(t)),Uf=async(e,t)=>{await io(e,t),await Oa(e,t)&&await e.rebase([ao(t)])},_a=e=>e.gitIdentity??{mode:e.gitIdentityMode??"personal"},Wa=e=>e.workingDirectoryMode==="original-dir"?"original-dir":"worktree",Lf=(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,jf=async e=>{let t=await e.raw(["worktree","list","--porcelain"]),r=[],n=null;for(let o of t.split(`
96
+ `)){if(o.startsWith("worktree ")){n&&r.push(n),n={path:ut.resolve(o.slice(9).trim())};continue}o.startsWith("branch ")&&n&&(n.branch=o.slice(7).trim())}return n&&r.push(n),r},Gf=async(e,t)=>(await e.branchLocal()).all.includes(t),qf=e=>{Of(e,{recursive:!0,force:!0,maxRetries:5,retryDelay:100})},Da=async(e,t,r)=>{let n=lt(e),o=ut.resolve(t),s=`refs/heads/${r}`;try{await n.raw(["worktree","prune"])}catch{}let a=(await jf(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(qf(o),await Gf(n,r))try{await n.deleteLocalBranch(r,!0)}catch{}try{await n.raw(["worktree","prune"])}catch{}Aa(ut.dirname(o),{recursive:!0})},Ba=async e=>{let t=Lf(e.bindings,e.task)||Nf(e.workspaceRoot,e.task.repoUrl),r=Ma(e.task);if(Aa(ut.dirname(t),{recursive:!0}),e.task.versionControl==="git-local"){let s=lt(t).env(e.env??{});if(!Ta(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}}Ta(t)||(console.log("[worker] [task-worktree] cloning target branch only",JSON.stringify({repoDir:t,repoUrl:e.task.repoUrl,startPoint:r})),await lt().env(e.env??{}).clone(e.task.repoUrl,t,["--no-checkout","--single-branch","--branch",r]));let n=lt(t).env(e.env??{});await io(n,r);let o=await $f(e.task.repoUrl,e.branchName,e.env);return o&&e.branchName!==r&&await io(n,e.branchName),{repoDir:t,git:n,taskBranchExists:o}},Na=async e=>{let t=e.taskBranchExists||await Oa(e.git,e.branchName)?ao(e.branchName):Ma(e.task);return await e.git.checkout(["-B",e.branchName,t]),t},$a=async e=>{let t=lt(e.worktreePath),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(),s,i="\u5DF2\u521B\u5EFA\u672C\u5730\u63D0\u4EA4\u3002";return e.identity.credentialToken?(await Uf(t,e.branchName),await t.push(["-u","origin",e.branchName]),s=e.branchName,i=`\u5DF2\u63A8\u9001\u8FDC\u7AEF\u5206\u652F ${e.branchName}\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 Vf="vibemux-task-runtime-",Kf=e=>e==="Codex"||e==="ClaudeCode",ja=(e,t)=>{if(!Kf(e.agentType))return{cwd:t,cleanup:()=>{}};let r=zf(La.join(Jf.tmpdir(),`${Vf}${e.id.slice(0,8)}-`)),n=La.join(r,"workspace");try{return Hf(t,n,process.platform==="win32"?"junction":"dir"),{cwd:n,cleanup:()=>{Ua(r,{recursive:!0,force:!0})}}}catch{return Ua(r,{recursive:!0,force:!0}),{cwd:t,cleanup:()=>{}}}},Ga=async e=>{let t=new Date().toISOString(),r=Ot(e.task.id),n=us(e.workspaceRoot,e.task.id,e.task.workspaceId),o=Wa(e.task),s=null,i=null,a=null;try{e.emit("preparing","\u68C0\u67E5 Worker \u8FD0\u884C\u73AF\u5883");let c=await pe({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 W=e.task.rootPath?.trim()||n;Ff(W,{recursive:!0}),e.emit("preparing",`\u9879\u76EE\u76EE\u5F55\u5DF2\u5C31\u7EEA\uFF1A${W}`);let x=ja(e.task,W);a=x.cleanup;let C=oo({step:"install",task:e.task,cwd:W,signal:e.signal,emit:e.emit}),T=[];C&&T.push(await so(C,e.emit)),e.emit("executing",`\u5F00\u59CB\u8C03\u7528 ${e.task.agentType} \u6267\u884C\u4EFB\u52A1`);let f=await to({agentType:e.task.agentType,actingUserId:e.task.requestedByUserId,cwd:x.cwd,title:`Distributed Task ${e.task.id}`,description:ro(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 I of["build","test","lint"]){let G=await no({step:I,task:e.task,cwd:W,signal:e.signal,emit:e.emit});G&&T.push(G)}let h=new Date().toISOString(),y=ct({taskId:e.task.id,status:"completed",returnMode:e.task.returnMode,summary:[T.length>0?`\u5DF2\u6267\u884C\u9879\u76EE\u9884\u8BBE\u547D\u4EE4\uFF1A
97
+ ${T.map(I=>`- ${I}`).join(`
98
+ `)}`:void 0,f.output].filter(Boolean).join(`
99
+
100
+ `),output:f.output,filesChanged:[],startedAt:t,completedAt:h,durationSec:Math.max(0,Math.round((new Date(h).getTime()-new Date(t).getTime())/1e3)),executorNodeId:e.executorId,agentSessionId:f.sessionId,opencodeSessionId:f.sessionId},{repoUrl:e.task.repoUrl,baseBranch:e.task.defaultBranch,taskDescription:e.task.description});return{task:{...e.task,status:"completed",startedAt:t,completedAt:h,updatedAt:h,result:y}}}let l=_a(e.task);i=ge({taskId:e.task.id,identity:l,repoUrl:e.task.repoUrl}),e.emit("preparing","\u51C6\u5907\u672C\u5730\u4ED3\u5E93");let{repoDir:u,git:d,taskBranchExists:S}=await Ba({workspaceRoot:e.workspaceRoot,task:e.task,branchName:r,bindings:e.projectBindings,env:i.env});e.emit("preparing",`\u4ED3\u5E93\u5DF2\u5C31\u7EEA\uFF1A${u}`);let p=o==="original-dir"?e.task.rootPath?.trim()||u:n;if(o==="worktree"){await Da(u,n,r);let W=S||await d.branch(["-r"]).then(x=>x.all.includes(`origin/${r}`))?`origin/${r}`:e.task.baseCommit?.trim()||e.task.defaultBranch?.trim()||"main";await d.raw(["worktree","add","--force","-B",r,n,W]),e.emit("executing",`\u5DF2\u521B\u5EFA worktree\uFF1A${n}`)}else{let W=await Na({git:d,task:e.task,branchName:r,taskBranchExists:S});e.emit("executing",`\u5DF2\u5728\u539F\u59CB\u76EE\u5F55 ${p} \u5207\u6362\u5230 ${W} \u5E76\u5F00\u59CB\u6267\u884C`)}s=fi({taskId:e.task.id,worktreePath:p,identity:l,repoUrl:e.task.repoUrl});let m=s.env,k=ja(e.task,p);a=k.cleanup;let g=oo({step:"install",task:e.task,cwd:p,signal:e.signal,env:m,emit:e.emit}),w=[];g&&w.push(await so(g,e.emit)),e.emit("executing",`\u5F00\u59CB\u8C03\u7528 ${e.task.agentType} \u6267\u884C\u4EFB\u52A1`);let v=await to({agentType:e.task.agentType,actingUserId:e.task.requestedByUserId,cwd:k.cwd,title:`Distributed Task ${e.task.id}`,description:ro(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 W of["build","test","lint"]){let x=await no({step:W,task:e.task,cwd:p,signal:e.signal,env:m,emit:e.emit});x&&w.push(x)}let M=await $a({task:e.task,worktreePath:p,branchName:r,identity:l}),O=await ba(e.task,p,r),J;O.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:O.patchArtifact.filename,content:O.patchArtifact.content})).artifactId);let H=new Date().toISOString(),Q=ct({taskId:e.task.id,status:"completed",returnMode:e.task.returnMode,summary:[w.length>0?`\u5DF2\u6267\u884C\u9879\u76EE\u9884\u8BBE\u547D\u4EE4\uFF1A
101
+ ${w.map(W=>`- ${W}`).join(`
102
+ `)}`:void 0,v.output,M.pushMessage].filter(Boolean).join(`
103
+
104
+ `),output:v.output,filesChanged:M.changedFiles.length>0?M.changedFiles:O.filesChanged,remoteBranchName:M.remoteBranchName,commitShas:M.commitShas??O.commitShas,patchArtifactId:J,startedAt:t,completedAt:H,durationSec:Math.max(0,Math.round((new Date(H).getTime()-new Date(t).getTime())/1e3)),executorNodeId:e.executorId,agentSessionId:v.sessionId,opencodeSessionId:v.sessionId},{repoUrl:e.task.repoUrl,baseBranch:e.task.defaultBranch,taskDescription:e.task.description});return{task:{...e.task,status:"completed",startedAt:t,completedAt:H,updatedAt:H,result:Q}}}catch(c){let l=new Date().toISOString(),u=c instanceof Error?c.message:"worker task execution failed";return{task:{...e.task,status:"failed",startedAt:t,completedAt:l,updatedAt:l,errorMessage:u,result:ct({taskId:e.task.id,status:"failed",returnMode:e.task.returnMode,summary:u,output:u,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 co=new Map,lo=e=>{let t=co.get(e);if(t){for(let r of t)clearTimeout(r);co.delete(e)}},qa=(e,t,r)=>{let n=new Date().toISOString();return{...e,status:"cancelled",executorNodeId:t,completedAt:n,updatedAt:n,result:ct({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})}},za=lo,Fa=e=>{let{task:t,executorId:r,workspaceRoot:n,projectBindings:o,uploadPatchArtifact:s,send:i}=e,a=new AbortController,c=[setTimeout(()=>{e.onStart(t.id),Ga({task:t,executorId:r,workspaceRoot:n,projectBindings:o,signal:a.signal,uploadPatchArtifact:s,emit(l,u){a.signal.aborted||i({type:"task.event",taskId:t.id,idempotencyKey:t.idempotencyKey,executorId:r,status:l,message:u,at:new Date().toISOString()})}}).then(({task:l})=>{a.signal.aborted||(e.onFinish(t.id),i({type:"task.result",executorId:r,task:l}),lo(t.id))})},20)];return co.set(t.id,c),{abort(){a.abort(),e.onFinish(t.id),lo(t.id)}}};var Ha=(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,e.task),!0):(t.assignedTasks.set(e.task.id,e.task),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),za(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:qa(n,r.executorId,e.reason)}),!0}return!1};var Ja=(e,t)=>{let r=t.getConfig(),n=()=>(r=P(),t.setConfig(r),r);if(e.type==="executor.terminal.request")return n(),Te("received one-shot terminal request",{requestId:e.requestId,command:e.command,cwd:e.cwd||r.workspaceRoot}),t.runTerminalCommand(e.command,e.cwd||r.workspaceRoot).then(o=>{t.send({type:"executor.terminal.response",executorId:r.executorId,requestId:e.requestId,result:o})}),!0;if(e.type==="executor.terminal.session.open"){n();let o=e.cwd||r.workspaceRoot;Te("received terminal session open",{sessionId:e.sessionId,cwd:o});let s=t.openTerminalSession({cwd:o,onExit:i=>{t.terminalSessions.delete(e.sessionId),t.send({type:"executor.terminal.session.exit",executorId:r.executorId,sessionId:e.sessionId,exitCode:i,at:new Date().toISOString()})},onLog:(i,a)=>{Te(i,{sessionId:e.sessionId,...a})},onOutput:(i,a)=>{r.executorId&&Ji({send:t.send,executorId:r.executorId,sessionId:e.sessionId,stream:i,chunk:a})},onReady:(i,a)=>{t.send({type:"executor.terminal.session.ready",executorId:r.executorId,sessionId:e.sessionId,cwd:o,mode:i,at:new Date().toISOString()}),Te("terminal session ready",{sessionId:e.sessionId,cwd:o,mode:i,backend:a})}});return t.terminalSessions.set(e.sessionId,s),!0}if(e.type==="executor.terminal.session.input")return Te("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 Te("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"){Te("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 Va=e=>{let t=Ia(e),r=n=>{if(e.getCurrentSocket()===e.expectedSocket&&!ei(n,e)&&!Vi(n,e)){if(n.type==="executor.agent.prompt.request"||n.type==="executor.agent.prompt.cancel"){t.handlePromptMessage(n);return}Ja(n,e)||Ha(n,e)}};return{abortActivePrompts:t.abortActivePrompts,handleMessage:r,drainPromptQueue:t.drainPromptQueue}};import{existsSync as uo,mkdirSync as Xf,readFileSync as Ka}from"node:fs";import{spawnSync as Yf}from"node:child_process";import Qf from"node:os";import Pr from"node:path";var Xa=Pr.join(Qf.homedir(),".ssh"),Zf=["id_ed25519.pub","id_rsa.pub","id_ecdsa.pub"],eh="vibemux_worker_ed25519",th=e=>{Xf(Pr.dirname(e),{recursive:!0});let t=Yf("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())},po=()=>{try{for(let r of Zf){let n=Pr.join(Xa,r);if(uo(n))return Ka(n,"utf8").trim()}let e=Pr.join(Xa,eh),t=`${e}.pub`;return uo(t)||th(e),uo(t)?Ka(t,"utf8").trim():void 0}catch{return}};import{spawn as go,spawnSync as rh}from"node:child_process";import{accessSync as nh,constants as oh}from"node:fs";import Ya from"node:os";import{createRequire as sh}from"node:module";import ih from"node:path";import{StringDecoder as Qa}from"node:string_decoder";var ec=120,tc=32,mo="xterm-256color",ah=250,ch=sh(import.meta.url),lh=String.raw`
86
105
  import base64
87
106
  import errno
88
107
  import fcntl
@@ -221,11 +240,11 @@ except OSError:
221
240
  pass
222
241
 
223
242
  sys.exit(exit_code)
224
- `,fe,ct,Nu=["-i","-l"],lt=e=>{let t=e?.trim();return t?t==="~"?Zs.homedir():t.startsWith("~/")?Wu.join(Zs.homedir(),t.slice(2)):t:process.cwd()},Kt=e=>{if(!e?.trim())return!1;try{return Ou(e,Bu.X_OK),!0}catch{return!1}},ti=e=>{let t=e.end();return t.length>0?t:""},dn=(e,t,r)=>{let n=!1,o=setTimeout(()=>{n||(n=!0,e(t,r))},$u);return{markReady:()=>{n||(n=!0,clearTimeout(o),e(t,r))},dispose:()=>{clearTimeout(o)}}},Lu=()=>{if(fe!==void 0)return fe;let e=["/usr/bin/python3","/opt/homebrew/bin/python3"];for(let r of e)if(Kt(r))return fe=r,fe;let t=["python3","python"];for(let r of t){let n=Mu(r,["-c","import sys"],{stdio:"ignore"});if(!n.error&&n.status===0)return fe=r,fe}return fe=null,fe},Gu=()=>{if(ct!==void 0)return ct;try{ct=Uu("node-pty")}catch{ct=null}return ct},Xt=()=>{let e=process.env.SHELL?.trim();return e&&!e.includes("fish")&&Kt(e)?e:process.platform==="darwin"&&Kt("/bin/zsh")?"/bin/zsh":Kt("/bin/bash")?"/bin/bash":"sh"},oi=(e,t)=>new Promise(r=>{let n=Xt(),o=lt(t),s=cn(n,["-l","-c",e],{cwd:o,env:process.env}),i="",a="";s.stdout.on("data",l=>{i+=l.toString()}),s.stderr.on("data",l=>{a+=l.toString()}),s.on("close",l=>{r({command:e,cwd:o,stdout:i,stderr:a,exitCode:l??0,at:new Date().toISOString()})}),s.on("error",l=>{r({command:e,cwd:o,stdout:i,stderr:`${a}${l.message}`,exitCode:1,at:new Date().toISOString()})})}),ju=e=>{let{cols:t=ri,cwd:r,onExit:n,onLog:o,onOutput:s,onReady:i,rows:a=ni,shell:l=Xt()}=e,c=lt(r),u=Gu();if(!u)throw new Error("node-pty \u4E0D\u53EF\u7528\uFF0C\u65E0\u6CD5\u542F\u52A8\u539F\u751F PTY\u3002");let d=u.spawn(l,Nu,{cwd:c,env:process.env,cols:t,rows:a,name:ln}),w=dn(i,"pty","node-pty");return d.onData(p=>{w.markReady(),o("pty output",{backend:"node-pty",chunkLength:p.length,preview:p.slice(0,120)}),s("stdout",p)}),d.onExit(({exitCode:p})=>{w.dispose(),o("pty exit",{backend:"node-pty",exitCode:p}),n(p??0)}),{backend:"node-pty",mode:"pty",write:p=>d.write(p),resize:(p,x)=>d.resize(Math.max(1,p),Math.max(1,x)),kill:()=>d.kill("SIGTERM")}},Hu=e=>{let{cols:t=ri,cwd:r,onExit:n,onLog:o,onOutput:s,onReady:i,rows:a=ni,shell:l=Xt()}=e,c=lt(r),u=Lu();if(!u)throw new Error("python3 \u4E0D\u53EF\u7528\uFF0C\u65E0\u6CD5\u542F\u52A8 PTY fallback\u3002");let d=cn(u,["-u","-c",Du],{cwd:c,env:{...process.env,DEVKANBAN_COLS:String(Math.max(1,t)),DEVKANBAN_CWD:c,DEVKANBAN_ROWS:String(Math.max(1,a)),DEVKANBAN_SHELL:l,DEVKANBAN_TERM_NAME:ln},stdio:["pipe","pipe","pipe"]}),w=d.stdin;if(!w)throw d.kill("SIGTERM"),new Error("python PTY control pipe \u4E0D\u53EF\u7528\u3002");let p=new ei("utf8"),x=new ei("utf8"),h=dn(i,"pty","python-pty"),m=(S,E)=>{E.length!==0&&(S==="stdout"&&h.markReady(),o("pty output",{backend:"python-pty",chunkLength:E.length,preview:E.slice(0,120),stream:S}),s(S,E))};d.stdout.on("data",S=>{m("stdout",p.write(S))}),d.stderr.on("data",S=>{m("system",x.write(S))}),d.on("error",S=>{o("python pty error",{message:S.message}),s("system",`\r
225
- [python-pty error] ${S.message}\r
226
- `)}),d.on("close",S=>{h.dispose(),m("stdout",ti(p)),m("system",ti(x)),o("pty exit",{backend:"python-pty",exitCode:S??0}),n(S??0)});let k=S=>{w.destroyed||w.write(`${JSON.stringify(S)}
227
- `)};return{backend:"python-pty",mode:"pty",write:S=>{k({type:"input",data:Buffer.from(S,"utf8").toString("base64")})},resize:(S,E)=>{k({type:"resize",cols:Math.max(1,S),rows:Math.max(1,E)})},kill:()=>{k({type:"close"}),w.end(),d.kill("SIGTERM")}}},qu=e=>{let{cwd:t,onExit:r,onLog:n,onOutput:o,onReady:s}=e,i=lt(t),a=cn("/bin/bash",["-il"],{cwd:i,env:{...process.env,BASH_SILENCE_DEPRECATION_WARNING:"1",TERM:process.env.TERM||ln},stdio:"pipe"});a.stdin.setDefaultEncoding("utf8"),a.stdout.setEncoding("utf8"),a.stderr.setEncoding("utf8");let l=dn(s,"pipe","pipe");return a.stdout.on("data",c=>{l.markReady(),n("fallback shell stdout",{backend:"pipe",chunkLength:c.length,preview:c.slice(0,120)}),o("stdout",c)}),a.stderr.on("data",c=>{l.markReady(),n("fallback shell stderr",{backend:"pipe",chunkLength:c.length,preview:c.slice(0,120)}),o("stderr",c)}),a.on("error",c=>{n("fallback shell error",{message:c.message}),o("system",`\r
228
- [fallback shell error] ${c.message}\r
229
- `)}),a.on("close",c=>{l.dispose(),n("fallback shell exit",{backend:"pipe",exitCode:c??0}),r(c??0)}),a.stdin.write(`export PS1="$ "
230
- `),{backend:"pipe",mode:"pipe",write:c=>{a.stdin.destroyed||a.stdin.write(c.replace(/\r/g,`
231
- `))},resize:()=>{},kill:()=>a.kill("SIGTERM")}},si=e=>{let{cwd:t,onLog:r}=e,n=lt(t),o=e.shell??Xt();r("opening pty session",{cwd:n,shell:o});try{return ju({...e,cwd:n,shell:o})}catch(s){r("node-pty spawn failed, falling back to python pty",{cwd:n,shell:o,error:s instanceof Error?s.message:"unknown"})}try{return Hu({...e,cwd:n,shell:o})}catch(s){r("python pty spawn failed, falling back to pipe shell",{cwd:n,shell:o,error:s instanceof Error?s.message:"unknown"})}return qu({...e,cwd:n})};var I={connection:null,reconnectTimer:null,stopped:!1,connect:null},un=new Map,ii=e=>Ut({workspaceRoot:e,workerVersion:Z()}),ai=e=>{let t=process.platform==="darwin"?["open",e]:process.platform==="win32"?["cmd","/c","start","",e]:["xdg-open",e];Fu(t[0],t.slice(1),{detached:!0,stdio:"ignore"}).unref()},ci=async()=>{let e=Z(),t=await ye();return{currentVersion:e,latestVersion:t.latestVersion||e,check:t}},li=(e,t,r,n)=>{let o=n.check.channel||Le(),s=o==="preview"?"Vibemux Worker Preview":"Vibemux Worker",i=process.env.VIBEMUX_WORKER_AUTO_UPDATE?.trim().toLowerCase(),a=i!=="0"&&i!=="false"&&i!=="off",l=[["Mode",e],["Channel",o],["Current",n.currentVersion],["Latest",n.latestVersion],["Update Check",a?"enabled":"disabled"],["Cloud",t],["Local",r]],c=e==="open"?"Opening cloud and local consoles in your browser...":"Worker daemon is ready and waiting for tasks.",u=Math.max(...l.map(([x])=>x.length)),d=[s,"",...l.map(([x,h])=>`${x.padEnd(u)} : ${h}`),"",c],w=Math.max(...d.map(x=>x.length)),p=`+${"-".repeat(w+2)}+`;console.log(p);for(let x of d)console.log(`| ${x.padEnd(w)} |`);console.log(p)},di=()=>{let e=b();Ar();let t=`http://127.0.0.1:${e.localServerPort}`;ci().then(r=>{li("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(()=>{ai(e.cloudUrl),ai(t)},250)};var po=()=>{I.stopped=!0,I.reconnectTimer&&(clearTimeout(I.reconnectTimer),I.reconnectTimer=null),I.connection?.socket?.close(1e3,"manual disconnect"),I.connection=null,O({daemonMode:"disconnected",connected:!1,lastDisconnectAt:new Date().toISOString(),lastError:"Control plane connection was disconnected manually."})},Rr=()=>{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.");I.stopped=!1,I.reconnectTimer&&(clearTimeout(I.reconnectTimer),I.reconnectTimer=null),I.connection?.socket?.close(1e3,"manual reconnect"),I.connection=null,I.connect?.()},ui=()=>{I.stopped=!1;let e=b(),t=[],r=[],n=new Map,o=new Map,s=null,i=null,a=!1,l=!1,c=null,u=null,d=new Date().toISOString();O({daemonMode:"starting",paired:!!(e.executorId&&e.executorToken),executorId:e.executorId,config:e,startedAt:d,lastConnectAttemptAt:d,lastError:void 0});let w=`http://127.0.0.1:${e.localServerPort}`;ci().then(C=>(li("daemon",e.cloudUrl,w,C),Tr(C.check))).catch(C=>{let v=C instanceof Error?C.message:"worker startup banner failed";console.error("[worker] startup banner failed",v)}),Rt(e.workspaceRoot);let p=Ar(),x=async C=>{await new Promise(v=>{C.close(()=>v())})},h=async C=>{if(!l){l=!0,I.stopped=!0,a=!0,i&&(clearTimeout(i),i=null),I.reconnectTimer&&(clearTimeout(I.reconnectTimer),I.reconnectTimer=null),O({daemonMode:"disconnected",connected:!1,lastDisconnectAt:new Date().toISOString(),lastError:C==="manual"?"Worker shutting down.":`Worker shutting down by ${C}.`});for(let v of o.values())v.abort();o.clear();for(let v of un.values())v.kill();un.clear(),s?.socket?.close(1e3,`worker shutdown: ${C}`),I.connection?.socket?.close(1e3,`worker shutdown: ${C}`),s=null,I.connection=null,c&&(clearInterval(c),c=null),u&&(clearInterval(u),u=null),await x(p)}},m=C=>{h(C).finally(()=>process.exit(0))};process.once("SIGINT",m),process.once("SIGTERM",m),process.once("SIGHUP",m);let k=()=>{O({queuedTaskIds:r,runningTaskIds:t,lastTaskAt:new Date().toISOString()})},S=()=>{for(e=b();t.length<Math.max(1,e.maxConcurrency)&&r.length>0;){let C=r[0];r=r.slice(1);let v=n.get(C);if(!v)continue;t=[...t,C],k();let P=zs({task:v,executorId:e.executorId,workspaceRoot:e.workspaceRoot,projectBindings:e.projectBindings,uploadPatchArtifact:e.executorToken?({taskId:A,filename:$,content:g})=>mr({cloudUrl:e.cloudUrl,executorToken:e.executorToken,taskId:A,filename:$,content:g}):void 0,connection:s??I.connection,onStart(){},onFinish(A){n.delete(A),o.delete(A),t=t.filter($=>$!==A),k(),G()}});o.set(C,P)}},E=null,G=()=>{S(),E?.drainPromptQueue()},F=C=>{a=I.stopped,!(a||i)&&(i=setTimeout(()=>{i=null,I.reconnectTimer=null,R()},5e3),I.reconnectTimer=i,O({daemonMode:"disconnected",connected:!1,paired:!0,lastDisconnectAt:new Date().toISOString(),lastError:C}))},R=()=>{if(!I.stopped){if(e=b(),!e.executorId||!e.executorToken){O({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}O({daemonMode:"starting",connected:!1,paired:!0,executorId:e.executorId,config:e,lastConnectAttemptAt:new Date().toISOString()});try{let C=hr(e,{onOpen(){I.connection?.socket===C.socket&&(e=b(),O({daemonMode:"running",paired:!0,connected:!0,executorId:e.executorId,config:e,lastError:void 0}),console.log("[worker] \u2601\uFE0F \u5DF2\u8FDE\u63A5\u5DF2\u914D\u5BF9"),C.send({type:"executor.register",executorId:e.executorId,capabilities:e.capabilities,labels:e.labels,workspaceRoot:e.workspaceRoot,maxConcurrency:e.maxConcurrency,sshPubkey:an(),platform:process.platform,version:Z(),telemetry:ii(e.workspaceRoot)}))},onMessage(v){I.connection?.socket===C.socket&&E?.handleMessage(v)},onError(v){I.connection?.socket===C.socket&&(E=null,console.error("[worker] websocket error",v),F(v))},onClose(v){if(I.connection?.socket!==C.socket)return;E=null;let P=v.reason?.trim()||`code=${v.code}`;console.log("[worker] websocket disconnected from control plane",P),F(`Control plane connection closed (${P})`)}});s=C,I.connection=C,E=Xs({expectedSocket:C.socket,getConnection:()=>s,getCurrentSocket:()=>I.connection?.socket,openTerminalSession:si,runTerminalCommand:oi,terminalSessions:un,assignedTasks:n,activeExecutions:o,getConfig:()=>e,setConfig:v=>{e=v},getQueuedTaskIds:()=>r,setQueuedTaskIds:v=>{r=v},getRunningTaskIds:()=>t,setRunningTaskIds:v=>{t=v},syncRuntimeState:k,drainExecutionQueue:G})}catch(C){let v=C instanceof Error?C.message:"worker websocket init failed";console.error("[worker] failed to start websocket connection",v),F(v)}}};I.connect=R,!e.executorId||!e.executorToken?(O({daemonMode:"unpaired",paired:!1,connected:!1}),console.log("[worker] not paired yet; open the local setup page and exchange a pairing code first")):R(),c=setInterval(()=>{t.length>0||r.length>0||Tr().catch(C=>{let v=C instanceof Error?C.message:"worker auto update failed";console.error("[worker] auto update failed",v)})},1e4),u=setInterval(()=>{if(!s||!He().connected)return;let C=new Date().toISOString();O({daemonMode:"running",connected:!0,paired:!0,lastHeartbeatAt:C,queuedTaskIds:r,runningTaskIds:t}),s.send({type:"executor.heartbeat",executorId:e.executorId,runningTaskIds:t,queuedTaskIds:r,sshPubkey:an(),at:C,telemetry:ii(e.workspaceRoot)})},15e3)};var Ju=()=>{let e=process.env.DOTENV_CONFIG_PATH?.trim();if(e){pi.config({path:e});return}he().name?.trim()==="vibemux"&&pi.config()};Ju();var Yt=b();O({daemonMode:"idle",paired:!!(Yt.executorId&&Yt.executorToken),connected:!1,executorId:Yt.executorId,config:Yt});var Qt=process.argv[2]||"daemon",zu=new Set(["daemon","open","doctor"]),Vu=()=>{setTimeout(()=>{try{process.kill(process.pid,"SIGTERM")}catch{process.exit(0)}},250)},Ku=async()=>{if(zu.has(Qt)&&(await _n(Qt)).status!=="ready"){process.exitCode=1;return}switch(Qt){case"daemon":{ui();return}case"open":{di();return}case"doctor":{await Mr();return}case"browser-inspect":{await jn();return}case"reset":{yt(),console.log("[worker] local config cleared");return}case"unpair":{wt(),console.log("[worker] pairing cleared");return}case"update":{let e=await Wt();console.log(`[worker] ${e.message}`),e.applied&&Vu();return}case"apply-update-internal":{let e=process.argv[3],t=process.argv[4],r=Number(process.argv[5]||"0");await lo(e,t,r);return}default:console.error(`Unknown worker command: ${Qt}`),process.exitCode=1}};Ku().catch(e=>{console.error(e instanceof Error?e.message:"worker command failed"),process.exitCode=1});
243
+ `,Me,_t,uh=["-i","-l"],Wt=e=>{let t=e?.trim();return t?t==="~"?Ya.homedir():t.startsWith("~/")?ih.join(Ya.homedir(),t.slice(2)):t:process.cwd()},vr=e=>{if(!e?.trim())return!1;try{return nh(e,oh.X_OK),!0}catch{return!1}},Za=e=>{let t=e.end();return t.length>0?t:""},fo=(e,t,r)=>{let n=!1,o=setTimeout(()=>{n||(n=!0,e(t,r))},ah);return{markReady:()=>{n||(n=!0,clearTimeout(o),e(t,r))},dispose:()=>{clearTimeout(o)}}},dh=()=>{if(Me!==void 0)return Me;let e=["/usr/bin/python3","/opt/homebrew/bin/python3"];for(let r of e)if(vr(r))return Me=r,Me;let t=["python3","python"];for(let r of t){let n=rh(r,["-c","import sys"],{stdio:"ignore"});if(!n.error&&n.status===0)return Me=r,Me}return Me=null,Me},ph=()=>{if(_t!==void 0)return _t;try{_t=ch("node-pty")}catch{_t=null}return _t},Ir=()=>{let e=process.env.SHELL?.trim();return e&&!e.includes("fish")&&vr(e)?e:process.platform==="darwin"&&vr("/bin/zsh")?"/bin/zsh":vr("/bin/bash")?"/bin/bash":"sh"},rc=(e,t)=>new Promise(r=>{let n=Ir(),o=Wt(t),s=go(n,["-l","-c",e],{cwd:o,env:process.env}),i="",a="";s.stdout.on("data",c=>{i+=c.toString()}),s.stderr.on("data",c=>{a+=c.toString()}),s.on("close",c=>{r({command:e,cwd:o,stdout:i,stderr:a,exitCode:c??0,at:new Date().toISOString()})}),s.on("error",c=>{r({command:e,cwd:o,stdout:i,stderr:`${a}${c.message}`,exitCode:1,at:new Date().toISOString()})})}),gh=e=>{let{cols:t=ec,cwd:r,onExit:n,onLog:o,onOutput:s,onReady:i,rows:a=tc,shell:c=Ir()}=e,l=Wt(r),u=ph();if(!u)throw new Error("node-pty \u4E0D\u53EF\u7528\uFF0C\u65E0\u6CD5\u542F\u52A8\u539F\u751F PTY\u3002");let d=u.spawn(c,uh,{cwd:l,env:process.env,cols:t,rows:a,name:mo}),S=fo(i,"pty","node-pty");return d.onData(p=>{S.markReady(),o("pty output",{backend:"node-pty",chunkLength:p.length,preview:p.slice(0,120)}),s("stdout",p)}),d.onExit(({exitCode:p})=>{S.dispose(),o("pty exit",{backend:"node-pty",exitCode:p}),n(p??0)}),{backend:"node-pty",mode:"pty",write:p=>d.write(p),resize:(p,m)=>d.resize(Math.max(1,p),Math.max(1,m)),kill:()=>d.kill("SIGTERM")}},mh=e=>{let{cols:t=ec,cwd:r,onExit:n,onLog:o,onOutput:s,onReady:i,rows:a=tc,shell:c=Ir()}=e,l=Wt(r),u=dh();if(!u)throw new Error("python3 \u4E0D\u53EF\u7528\uFF0C\u65E0\u6CD5\u542F\u52A8 PTY fallback\u3002");let d=go(u,["-u","-c",lh],{cwd:l,env:{...process.env,DEVKANBAN_COLS:String(Math.max(1,t)),DEVKANBAN_CWD:l,DEVKANBAN_ROWS:String(Math.max(1,a)),DEVKANBAN_SHELL:c,DEVKANBAN_TERM_NAME:mo},stdio:["pipe","pipe","pipe"]}),S=d.stdin;if(!S)throw d.kill("SIGTERM"),new Error("python PTY control pipe \u4E0D\u53EF\u7528\u3002");let p=new Qa("utf8"),m=new Qa("utf8"),k=fo(i,"pty","python-pty"),g=(v,M)=>{M.length!==0&&(v==="stdout"&&k.markReady(),o("pty output",{backend:"python-pty",chunkLength:M.length,preview:M.slice(0,120),stream:v}),s(v,M))};d.stdout.on("data",v=>{g("stdout",p.write(v))}),d.stderr.on("data",v=>{g("system",m.write(v))}),d.on("error",v=>{o("python pty error",{message:v.message}),s("system",`\r
244
+ [python-pty error] ${v.message}\r
245
+ `)}),d.on("close",v=>{k.dispose(),g("stdout",Za(p)),g("system",Za(m)),o("pty exit",{backend:"python-pty",exitCode:v??0}),n(v??0)});let w=v=>{S.destroyed||S.write(`${JSON.stringify(v)}
246
+ `)};return{backend:"python-pty",mode:"pty",write:v=>{w({type:"input",data:Buffer.from(v,"utf8").toString("base64")})},resize:(v,M)=>{w({type:"resize",cols:Math.max(1,v),rows:Math.max(1,M)})},kill:()=>{w({type:"close"}),S.end(),d.kill("SIGTERM")}}},fh=e=>{let{cwd:t,onExit:r,onLog:n,onOutput:o,onReady:s}=e,i=Wt(t),a=go("/bin/bash",["-il"],{cwd:i,env:{...process.env,BASH_SILENCE_DEPRECATION_WARNING:"1",TERM:process.env.TERM||mo},stdio:"pipe"});a.stdin.setDefaultEncoding("utf8"),a.stdout.setEncoding("utf8"),a.stderr.setEncoding("utf8");let c=fo(s,"pipe","pipe");return a.stdout.on("data",l=>{c.markReady(),n("fallback shell stdout",{backend:"pipe",chunkLength:l.length,preview:l.slice(0,120)}),o("stdout",l)}),a.stderr.on("data",l=>{c.markReady(),n("fallback shell stderr",{backend:"pipe",chunkLength:l.length,preview:l.slice(0,120)}),o("stderr",l)}),a.on("error",l=>{n("fallback shell error",{message:l.message}),o("system",`\r
247
+ [fallback shell error] ${l.message}\r
248
+ `)}),a.on("close",l=>{c.dispose(),n("fallback shell exit",{backend:"pipe",exitCode:l??0}),r(l??0)}),a.stdin.write(`export PS1="$ "
249
+ `),{backend:"pipe",mode:"pipe",write:l=>{a.stdin.destroyed||a.stdin.write(l.replace(/\r/g,`
250
+ `))},resize:()=>{},kill:()=>a.kill("SIGTERM")}},nc=e=>{let{cwd:t,onLog:r}=e,n=Wt(t),o=e.shell??Ir();r("opening pty session",{cwd:n,shell:o});try{return gh({...e,cwd:n,shell:o})}catch(s){r("node-pty spawn failed, falling back to python pty",{cwd:n,shell:o,error:s instanceof Error?s.message:"unknown"})}try{return mh({...e,cwd:n,shell:o})}catch(s){r("python pty spawn failed, falling back to pipe shell",{cwd:n,shell:o,error:s instanceof Error?s.message:"unknown"})}return fh({...e,cwd:n})};var E={connection:null,reconnectTimer:null,stopped:!1,connect:null},ho=new Map,kh=()=>ye()==="preview"?"vibemux-worker-preview":"vibemux-worker",oc=e=>ir({workspaceRoot:e,workerVersion:X()}),sc=e=>{let t=process.platform==="darwin"?["open",e]:process.platform==="win32"?["cmd","/c","start","",e]:["xdg-open",e];hh(t[0],t.slice(1),{detached:!0,stdio:"ignore"}).unref()},ic=async()=>{let e=X(),t=await Be();return{currentVersion:e,latestVersion:t.latestVersion||e,check:t}},ac=(e,t,r,n)=>{let o=n.check.channel||ye(),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.",u=Math.max(...c.map(([m])=>m.length)),d=[s,"",...c.map(([m,k])=>`${m.padEnd(u)} : ${k}`),"",l],S=Math.max(...d.map(m=>m.length)),p=`+${"-".repeat(S+2)}+`;console.log(p);for(let m of d)console.log(`| ${m.padEnd(S)} |`);console.log(p)},cc=()=>{let e=P();pn();let t=`http://127.0.0.1:${e.localServerPort}`;ic().then(r=>{ac("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(()=>{sc(e.cloudUrl),sc(t)},250)};var As=()=>{E.stopped=!0,E.reconnectTimer&&(clearTimeout(E.reconnectTimer),E.reconnectTimer=null),E.connection?.socket?.close(1e3,"manual disconnect"),E.connection=null,D({daemonMode:"disconnected",connected:!1,lastDisconnectAt:new Date().toISOString(),lastError:"Control plane connection was disconnected manually."})},dn=()=>{let e=P();if(!e.executorId||!e.executorToken)throw new Error("This worker is not paired yet, so it cannot connect to the control plane.");E.stopped=!1,E.reconnectTimer&&(clearTimeout(E.reconnectTimer),E.reconnectTimer=null),E.connection?.socket?.close(1e3,"manual reconnect"),E.connection=null,E.connect?.()},ko=()=>{E.stopped=!1;let e=P(),t=[],r=[],n=new Map,o=new Map,s=null,i=null,a=!1,c=!1,l=null,u=null,d=new Date().toISOString();D({daemonMode:"starting",paired:!!(e.executorId&&e.executorToken),executorId:e.executorId,config:e,startedAt:d,lastConnectAttemptAt:d,lastError:void 0});let S=`http://127.0.0.1:${e.localServerPort}`;ic().then(x=>(ac("daemon",e.cloudUrl,S,x),ln(x.check))).catch(x=>{let C=x instanceof Error?x.message:"worker startup banner failed";console.error("[worker] startup banner failed",C)}),Zt(e.workspaceRoot);let p=pn(),m=async x=>{await new Promise(C=>{x.close(()=>C())})},k=async(x,C)=>{if(!c){c=!0,E.stopped=!0,a=!0,i&&(clearTimeout(i),i=null),E.reconnectTimer&&(clearTimeout(E.reconnectTimer),E.reconnectTimer=null),D({daemonMode:"disconnected",connected:!1,lastDisconnectAt:new Date().toISOString(),lastError:C||(x==="manual"?"Worker shutting down.":`Worker shutting down by ${x}.`)});for(let T of o.values())T.abort();o.clear();for(let T of ho.values())T.kill();ho.clear(),s?.socket?.close(1e3,C||`worker shutdown: ${x}`),E.connection?.socket?.close(1e3,C||`worker shutdown: ${x}`),s=null,E.connection=null,l&&(clearInterval(l),l=null),u&&(clearInterval(u),u=null),await m(p)}},g=x=>{k(x).finally(()=>process.exit(0))},w=x=>{console.log(`[worker] ${x||"control plane requested worker shutdown"}`),k("manual",x).finally(()=>process.exit(0))};process.once("SIGINT",g),process.once("SIGTERM",g),process.once("SIGHUP",g);let v=()=>{D({queuedTaskIds:r,runningTaskIds:t,lastTaskAt:new Date().toISOString()})},M=()=>{for(e=P();t.length<Math.max(1,e.maxConcurrency)&&r.length>0;){let x=r[0];r=r.slice(1);let C=n.get(x);if(!C)continue;t=[...t,x],v();let T=Fa({task:C,executorId:e.executorId,workspaceRoot:e.workspaceRoot,projectBindings:e.projectBindings,uploadPatchArtifact:e.executorToken?({taskId:f,filename:h,content:y})=>Vr({cloudUrl:e.cloudUrl,executorToken:e.executorToken,taskId:f,filename:h,content:y}):void 0,send:H,onStart(){},onFinish(f){n.delete(f),o.delete(f),t=t.filter(h=>h!==f),v(),J()}});o.set(x,T)}},O=null,J=()=>{M(),O?.drainPromptQueue()},H=x=>E.connection?.send(x)??!1,Q=x=>{a=E.stopped,!(a||i)&&(i=setTimeout(()=>{i=null,E.reconnectTimer=null,W()},5e3),E.reconnectTimer=i,D({daemonMode:"disconnected",connected:!1,paired:!0,lastDisconnectAt:new Date().toISOString(),lastError:x}))},W=()=>{if(!E.stopped){if(e=P(),!e.executorId||!e.executorToken){D({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}D({daemonMode:"starting",connected:!1,paired:!0,executorId:e.executorId,config:e,lastConnectAttemptAt:new Date().toISOString()});try{let x=Kr(e,{onOpen(){E.connection?.socket===x.socket&&(e=P(),D({daemonMode:"running",paired:!0,connected:!0,executorId:e.executorId,config:e,lastError:void 0}),console.log("[worker] connected to the control plane"),x.send({type:"executor.register",executorId:e.executorId,capabilities:e.capabilities,labels:e.labels,workspaceRoot:e.workspaceRoot,maxConcurrency:e.maxConcurrency,projectBindings:e.projectBindings,sshPubkey:po(),platform:process.platform,version:X(),telemetry:oc(e.workspaceRoot)}))},onMessage(C){E.connection?.socket===x.socket&&O?.handleMessage(C)},onError(C){E.connection?.socket===x.socket&&(O?.abortActivePrompts(),s=null,E.connection=null,O=null,console.error("[worker] websocket error",C),Q(C))},onClose(C){if(E.connection?.socket!==x.socket)return;O?.abortActivePrompts(),s=null,E.connection=null,O=null;let T=C.reason?.trim()||`code=${C.code}`;console.log("[worker] websocket disconnected from control plane",T),Q(`Control plane connection closed (${T})`)}});s=x,E.connection=x,O=Va({expectedSocket:x.socket,getConnection:()=>s,getCurrentSocket:()=>E.connection?.socket,send:H,requestShutdown:w,openTerminalSession:nc,runTerminalCommand:rc,terminalSessions:ho,assignedTasks:n,activeExecutions:o,getConfig:()=>e,setConfig:C=>{e=C},getQueuedTaskIds:()=>r,setQueuedTaskIds:C=>{r=C},getRunningTaskIds:()=>t,setRunningTaskIds:C=>{t=C},syncRuntimeState:v,drainExecutionQueue:J})}catch(x){let C=x instanceof Error?x.message:"worker websocket init failed";console.error("[worker] failed to start websocket connection",C),Q(C)}}};E.connect=W,!e.executorId||!e.executorToken?(D({daemonMode:"unpaired",paired:!1,connected:!1}),console.log(`[worker] not paired yet; run \`npx ${kh()} connect --pairing-code <CODE>\` or use the local setup page first`)):W(),l=setInterval(()=>{t.length>0||r.length>0||ln().catch(x=>{let C=x instanceof Error?x.message:"worker auto update failed";console.error("[worker] auto update failed",C)})},1e4),u=setInterval(()=>{if(!s||!ft().connected)return;let x=new Date().toISOString();D({daemonMode:"running",connected:!0,paired:!0,lastHeartbeatAt:x,queuedTaskIds:r,runningTaskIds:t}),s.send({type:"executor.heartbeat",executorId:e.executorId,runningTaskIds:t,queuedTaskIds:r,projectBindings:e.projectBindings,sshPubkey:po(),at:x,telemetry:oc(e.workspaceRoot)})},15e3)};var yh=()=>{let e=process.env.DOTENV_CONFIG_PATH?.trim();if(e){lc.config({path:e});return}_e().name?.trim()==="vibemux"&&lc.config()};yh();var br=P();D({daemonMode:"idle",paired:!!(br.executorId&&br.executorToken),connected:!1,executorId:br.executorId,config:br});var Er=process.argv[2]||"daemon",wh=process.argv.slice(3),Sh=new Set(["connect","daemon","open","doctor"]),xh=()=>{setTimeout(()=>{try{process.kill(process.pid,"SIGTERM")}catch{process.exit(0)}},250)},Ch=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},yo=(e,t)=>{let r=e.get(t);return typeof r=="string"?r.trim():""},uc=e=>!!(e.executorId?.trim()&&e.executorToken?.trim()),Ph=async e=>{let t=Ch(e),r=yo(t,"pairing-code"),n=yo(t,"server-url"),o=yo(t,"name"),s=P();if(!r)throw new Error(Co(uc(s)));let i=o||s.executorName?.trim()||`worker-${process.pid}`,a={...s,cloudUrl:n||s.cloudUrl},c;try{c=await dt({pairingCode:r,machineId:a.machineId,machineName:a.machineName,name:i,workspaceRoot:a.workspaceRoot,maxConcurrency:a.maxConcurrency,labels:a.labels,capabilities:a.capabilities,platform:process.platform,version:X()},a.cloudUrl)}catch(u){let d=u instanceof Error?u.message:"Pair request failed.";throw new Error(Dt(d,uc(s)))}let l={...a,executorName:i,executorId:c.executorId,executorToken:c.executorToken};Se(l),D({daemonMode:"starting",paired:!0,connected:!1,executorId:c.executorId,config:l,lastError:void 0}),console.log(`[worker] paired ${l.machineName} to ${l.cloudUrl} as ${i}`),ko()},vh=async()=>{if(Sh.has(Er)&&(await ts(Er)).status!=="ready"){process.exitCode=1;return}switch(Er){case"connect":{await Ph(wh);return}case"daemon":{ko();return}case"open":{cc();return}case"doctor":{await gn();return}case"browser-inspect":{await cs();return}case"reset":{Gt(),console.log("[worker] local config cleared");return}case"unpair":{qt(),console.log("[worker] pairing cleared");return}case"update":{let e=await sr();console.log(`[worker] ${e.message}`),e.applied&&xh();return}case"apply-update-internal":{let e=process.argv[3],t=process.argv[4],r=Number(process.argv[5]||"0");await Rs(e,t,r);return}default:console.error(`Unknown worker command: ${Er}`),process.exitCode=1}};vh().catch(e=>{console.error(e instanceof Error?e.message:"worker command failed"),process.exitCode=1});