vibemux-worker-preview 0.1.3-preview.21 → 0.1.3-preview.23

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,88 @@
1
- import Di from"dotenv";import{existsSync as tr,readFileSync as rr}from"node:fs";import re from"node:path";import{fileURLToPath as Ni}from"node:url";var Qt=null,Zt=null,er=null,Li=e=>{try{let t=JSON.parse(rr(e,"utf8"));return!!(t.name&&t.version)}catch{return!1}},ji=()=>{let e=process.env.VIBEMUX_RUNTIME_ROOT?.trim();if(e)return re.resolve(e);let t=re.dirname(Ni(import.meta.url));for(;;){let r=re.join(t,"package.json");if(tr(r)&&Li(r))return t;let n=re.dirname(t);if(n===t)return process.cwd();t=n}},K=()=>(Qt||(Qt=ji()),Qt),me=()=>{if(!Zt){let e=re.join(K(),"package.json");Zt=tr(e)?JSON.parse(rr(e,"utf8")):{}}return Zt},be=()=>{if(!er){let e=re.join(K(),"runtime","worker-release.json");er=tr(e)?JSON.parse(rr(e,"utf8")):{}}return er},Y=()=>me().version?.trim()||process.env.npm_package_version?.trim()||"0.0.0",_e=()=>re.join(K(),"dist-worker","apps","worker","src","index.js"),Qr=()=>re.join(K(),"dist-worker","apps","worker","web"),pt=()=>{let e=process.platform==="win32"?"vibemux-worker.cmd":"vibemux-worker";return re.join(K(),"bin",e)};import{existsSync as ht,mkdirSync as en,readFileSync as kt,rmSync as os,writeFileSync as tn}from"node:fs";import{randomUUID as is}from"node:crypto";import Ne from"node:os";import N from"node:path";var ne=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 fe="built-in://vibemux",nr=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Gi=(e,t,r)=>{let n=t.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"")||`${e}-${r+1}`;return`${e}-${r+1}-${n}`};var qi=e=>e.replace(/\/+$/,""),Hi=e=>e.startsWith("sse://")?`http://${e.slice(6)}`:e,Ji=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:`${qi(e.cloudUrl)}/mcp/executor`,enabled:!0,headers:t}},Fi=e=>{let t=e.replace(/^stdio:\/\//,"").trim();return t?{command:t}:null},zi=e=>{let t=Hi(e).trim();return t?{type:"remote",url:t,enabled:!0}:null},$e=(e,t)=>e.filter(r=>r.enabled).reduce((r,n,o)=>{let s=n.id?.trim()||Gi("mcp",n.name,o),a=n.target===fe?Ji(t):n.transport==="stdio"||n.target.startsWith("stdio://")?Fi(n.target):zi(n.target);return a&&(r[s]=a),r},{}),gt=(e,t,r)=>{let n=ne(e),o=nr(n)?{...n}:{},s=nr(o.mcp)?{...o.mcp}:nr(o.mcpServers)?{...o.mcpServers}:{},a=$e(t,r),{mcpServers:c,...l}=o,i={...l,mcp:{...s,...a}};return JSON.stringify(i,null,2)};var Vi={defaultModel:"",agent:"",permissionPolicy:""},Ki={defaultModel:"gpt-5.4",sandbox:"workspace-write",approval:"never",reasoningEffort:"medium",reasoningSummary:"auto"},Xi={defaultModel:"sonnet",permissionMode:"bypassPermissions",planMode:!1},Yi={OpenCode:Vi,Codex:Ki,ClaudeCode:Xi};var Qi=e=>({OpenCode:{...e.OpenCode},Codex:{...e.Codex},ClaudeCode:{...e.ClaudeCode}}),De=(e,t)=>{let r=Qi(Yi);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 mt=null,Zi=()=>mt||(mt=be(),mt),Ue=()=>process.env.VIBEMUX_WORKER_RELEASE_CHANNEL?.trim()||Zi().channel?.trim()||"production",es=e=>e==="preview"?"vibemux-worker-preview":"vibemux-worker",ts=e=>e==="preview"?"preview":"latest",rs=()=>(process.env.npm_config_registry?.trim()||"https://registry.npmjs.org").replace(/\/$/,""),ns=async e=>{let t=await fetch(`${rs()}/${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()},ve=async()=>{let e=Y(),t=Ue(),r=me().name?.trim()||"",n=es(t),o=ts(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\u81EA\u52A8\u66F4\u65B0\u3002"};try{let a=(await ns(n))["dist-tags"]?.[o]?.trim();return a?a===e?{ok:!0,currentVersion:e,latestVersion:a,channel:t,available:!1,packageName:n,packageTag:o,message:`\u5F53\u524D\u5DF2\u662F\u6700\u65B0\u7248\u672C ${e}\u3002`}:{ok:!0,currentVersion:e,latestVersion:a,channel:t,available:!0,packageName:n,packageTag:o,message:`\u68C0\u6D4B\u5230\u65B0\u7248\u672C ${a}\uFF0C\u51C6\u5907\u901A\u8FC7 npx \u81EA\u52A8\u5207\u6362\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 yt=N.join(Ne.homedir(),".vibemux"),ss=N.join(yt,"worker"),as=N.join(yt,"worker-dev"),cs=N.join(yt,"worker-dev-preview"),ls=N.join(yt,"worker-preview"),ds="http://127.0.0.1:8989",us=48100,ps=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"]),rn=()=>!!process.env.VIBEMUX_CLOUD_URL?.trim(),ft=()=>process.env.VIBEMUX_CLOUD_URL?.trim()||be().defaultCloudUrl?.trim()||ds,gs=e=>process.env.NODE_ENV==="development"||rn()||!be().defaultCloudUrl?.trim()?!1:ps.has(e?.trim()||""),ms=()=>{let e=ft(),t=Ue();return process.env.NODE_ENV==="development"?e.includes("preview.vibemux.com")?cs:as:t==="preview"||e.includes("preview.vibemux.com")?ls:ss},fs=()=>{let e=Number(process.env.VIBEMUX_WORKER_PORT?.trim());if(Number.isFinite(e)&&e>0)return e;let t=be().defaultLocalServerPort;return Number.isFinite(t)&&t?t:us},hs=()=>process.env.OPENCODE_CONFIG_PATH?.trim()||N.join(Ne.homedir(),".config","opencode","opencode.json"),ks=()=>{let e=process.env.CODEX_HOME?.trim()||N.join(Ne.homedir(),".codex");return N.join(e,"config.toml")},ys=()=>{let e=process.env.CLAUDE_HOME?.trim()||N.join(Ne.homedir(),".claude");return N.join(e,"settings.json")},ws=()=>{let e=hs();if(!ht(e))return{opencodeConfigContent:"",defaultModel:""};try{let t=kt(e,"utf8").trim();if(!t)return{opencodeConfigContent:"",defaultModel:""};let r=ne(t),n=Object.entries(r.default??{}).find(([,o])=>!!o?.trim());return{opencodeConfigContent:t,defaultModel:n?`${n[0]}/${n[1]}`:""}}catch{return{opencodeConfigContent:"",defaultModel:""}}},Zr=e=>{if(!ht(e))return"";try{return kt(e,"utf8").trim()}catch{return""}},Cs=()=>{let e=process.env.VIBEMUX_WORKER_HOME?.trim();if(e)return e;let t=process.env.VIBEMUX_HOME?.trim();return t?N.join(t,"worker"):ms()},he=()=>N.resolve(Cs()),or=()=>N.join(he(),"config.json"),xs=()=>N.join(he(),"machine-id"),Ss=()=>{let e=he(),t=xs();if(ht(t)){let n=kt(t,"utf8").trim();if(n)return n}en(e,{recursive:!0});let r=is();return tn(t,`${r}
2
- `,"utf8"),r},bs=()=>({cloudUrl:ft(),machineId:Ss(),machineName:Ne.hostname(),opencodeConfigContent:"",codexConfigContent:"",claudeCodeConfigContent:"",defaultModel:"",agentSettings:De(),mcpServers:[],workspaceRoot:N.join(he(),"workspace"),maxConcurrency:1,labels:[],capabilities:["code-execution","git-operations"],localServerPort:Number(process.env.VIBEMUX_WORKER_PORT||fs()),projectBindings:[]}),x=()=>{let e=or(),t=ht(e)?JSON.parse(kt(e,"utf8")):{},r={...bs(),...t},n=ws();rn()&&(r.cloudUrl=ft()),gs(r.cloudUrl)&&(r.cloudUrl=ft());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=Zr(ks())),r.claudeCodeConfigContent?.trim()||(r.claudeCodeConfigContent=Zr(ys())),r.defaultModel?.trim()||(r.defaultModel=n.defaultModel),r.agentSettings=De(r.agentSettings,r.defaultModel),r},Ie=e=>{let t=he();en(t,{recursive:!0}),tn(or(),`${JSON.stringify(e,null,2)}
3
- `,"utf8")},Le=(e=x(),t)=>gt(e.opencodeConfigContent,e.mcpServers??[],{cloudUrl:e.cloudUrl,executorToken:e.executorToken,actingUserId:t}),wt=()=>{os(or(),{force:!0})},nn=()=>{let e={...x(),executorName:void 0,executorId:void 0,executorToken:void 0};return Ie(e),e};import{existsSync as xt}from"node:fs";import{stdin as mn,stdout as fn}from"node:process";import St from"node:path";import{createInterface as Hs}from"node:readline/promises";import{existsSync as Bs}from"node:fs";import Ws from"node:os";import an from"node:path";import{spawn as _s}from"node:child_process";import{accessSync as vs,constants as Is,existsSync as Ps}from"node:fs";import{delimiter as ir,dirname as Ts,isAbsolute as Es,join as Rs}from"node:path";import{spawnSync as As}from"node:child_process";var W=(e,t,r)=>{let n=As(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}},R=(e,t)=>e.stdout||e.stderr||e.error||t,M=(e,t=["--version"])=>W(e,t).ok,Ms=e=>{let t=process.env.PATH??"";t.split(ir).filter(Boolean).includes(e)||(process.env.PATH=t?`${e}${ir}${t}`:e)},sr=e=>{if(!Ps(e))return!1;try{return vs(e,Is.X_OK),!0}catch{return!1}},sn=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 sr(e)?e:null;for(let r of t){let n=`${e}${r}`;if(sr(n))return n}return null},on=e=>process.platform==="win32"?sn(e):sr(e)?e:null,oe=e=>{if(e.includes("/")||e.includes("\\")||Es(e))return on(e);for(let t of(process.env.PATH??"").split(ir).filter(Boolean)){let r=Rs(t,e),n=process.platform==="win32"?sn(r):on(r);if(n)return Ms(Ts(n)),n}return null},Os=(e,t,r)=>typeof process.getuid=="function"&&process.getuid()===0?{command:e,args:t}:M("sudo")?r?.interactiveAuth?{command:"sudo",args:[e,...t]}:M("sudo",["-n","true"])?{command:"sudo",args:["-n",e,...t]}:null:null,ie=(e,t,r,n)=>{let o=Os(e,t,n);return o?W(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,cn=15e3,$s=()=>process.env.CLAUDE_HOME?.trim()||an.join(Ws.homedir(),".claude"),Ds=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,Ct=(e,t,r)=>({id:e,label:Ds(e),ok:r.ok,changed:r.changed,detail:r.detail,skipped:r.skipped,installer:t?.installer,commandSummary:t?.commandSummary}),ln=(e,t,r,n,o,s)=>{let a={installer:r,commandSummary:t},c=W("npm",["install","-g",e],{streamOutput:s?.streamOutput,timeout:je});return!c.ok&&process.platform!=="win32"&&(c=ie("npm",["install","-g",e],je,s)),Ct(n,a,{ok:c.ok,changed:c.ok,detail:R(c,o)})},dn=()=>M("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 ln("@openai/codex","npm install -g @openai/codex","npm","codex-cli","\u5B89\u88C5 Codex CLI \u5931\u8D25",e)}}:null,un=()=>process.platform==="darwin"&&M("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=W("brew",["install","--cask","claude-code"],{streamOutput:e?.streamOutput,timeout:je});return Ct("claude-cli",t,{ok:r.ok,changed:r.ok,detail:R(r,"\u5B89\u88C5 Claude Code CLI \u5931\u8D25")})}}:process.platform==="win32"&&M("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=W("winget",["install","--id","Anthropic.ClaudeCode","--exact","--source","winget","--accept-package-agreements","--accept-source-agreements"],{streamOutput:e?.streamOutput,timeout:je});return Ct("claude-cli",t,{ok:r.ok,changed:r.ok,detail:R(r,"\u5B89\u88C5 Claude Code CLI \u5931\u8D25")})}}:process.platform!=="win32"&&M("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=W("bash",["-lc","curl -fsSL https://claude.ai/install.sh | bash"],{streamOutput:e?.streamOutput,timeout:je});return Ct("claude-cli",t,{ok:r.ok,changed:r.ok,detail:R(r,"\u5B89\u88C5 Claude Code CLI \u5931\u8D25")})}}:M("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 ln("@anthropic-ai/claude-code","npm install -g @anthropic-ai/claude-code","npm","claude-cli","\u5B89\u88C5 Claude Code CLI \u5931\u8D25",e)}}:null,Us=()=>{let e=oe("codex"),t=e?W(e,["--version"]):null,r=dn();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"}},Ns=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=_s(e,["app-server"],{env:process.env,stdio:["pipe","pipe","pipe"]}),o="",s="",a=!1,c=0,l=-1,i=-1,d=k=>{a||(a=!0,clearTimeout(p),n.killed||n.kill("SIGTERM"),r(k))},u=k=>{n.stdin.write(`${JSON.stringify(k)}
1
+ import Li from"dotenv";import{existsSync as tr,readFileSync as rr}from"node:fs";import re from"node:path";import{fileURLToPath as Gi}from"node:url";var Qt=null,Zt=null,er=null,qi=e=>{try{let t=JSON.parse(rr(e,"utf8"));return!!(t.name&&t.version)}catch{return!1}},Hi=()=>{let e=process.env.VIBEMUX_RUNTIME_ROOT?.trim();if(e)return re.resolve(e);let t=re.dirname(Gi(import.meta.url));for(;;){let r=re.join(t,"package.json");if(tr(r)&&qi(r))return t;let n=re.dirname(t);if(n===t)return process.cwd();t=n}},K=()=>(Qt||(Qt=Hi()),Qt),me=()=>{if(!Zt){let e=re.join(K(),"package.json");Zt=tr(e)?JSON.parse(rr(e,"utf8")):{}}return Zt},be=()=>{if(!er){let e=re.join(K(),"runtime","worker-release.json");er=tr(e)?JSON.parse(rr(e,"utf8")):{}}return er},Y=()=>me().version?.trim()||process.env.npm_package_version?.trim()||"0.0.0",_e=()=>re.join(K(),"dist-worker","apps","worker","src","index.js"),Qr=()=>re.join(K(),"dist-worker","apps","worker","web"),pt=()=>{let e=process.platform==="win32"?"vibemux-worker.cmd":"vibemux-worker";return re.join(K(),"bin",e)};import{existsSync as ht,mkdirSync as en,readFileSync as kt,rmSync as as,writeFileSync as tn}from"node:fs";import{randomUUID as cs}from"node:crypto";import Ne from"node:os";import N from"node:path";var ne=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 fe="built-in://vibemux",nr=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),zi=(e,t,r)=>{let n=t.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"")||`${e}-${r+1}`;return`${e}-${r+1}-${n}`};var Ji=e=>e.replace(/\/+$/,""),Fi=e=>e.startsWith("sse://")?`http://${e.slice(6)}`:e,Vi=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:`${Ji(e.cloudUrl)}/mcp/executor`,enabled:!0,headers:t}},Ki=e=>{let t=e.replace(/^stdio:\/\//,"").trim();return t?{command:t}:null},Xi=e=>{let t=Fi(e).trim();return t?{type:"remote",url:t,enabled:!0}:null},$e=(e,t)=>e.filter(r=>r.enabled).reduce((r,n,o)=>{let s=n.id?.trim()||zi("mcp",n.name,o),a=n.target===fe?Vi(t):n.transport==="stdio"||n.target.startsWith("stdio://")?Ki(n.target):Xi(n.target);return a&&(r[s]=a),r},{}),gt=(e,t,r)=>{let n=ne(e),o=nr(n)?{...n}:{},s=nr(o.mcp)?{...o.mcp}:nr(o.mcpServers)?{...o.mcpServers}:{},a=$e(t,r),{mcpServers:c,...l}=o,i={...l,mcp:{...s,...a}};return JSON.stringify(i,null,2)};var Yi={defaultModel:"",agent:"",permissionPolicy:""},Qi={defaultModel:"gpt-5.4",sandbox:"workspace-write",approval:"never",reasoningEffort:"medium",reasoningSummary:"auto"},Zi={defaultModel:"sonnet",permissionMode:"bypassPermissions",planMode:!1},es={OpenCode:Yi,Codex:Qi,ClaudeCode:Zi};var ts=e=>({OpenCode:{...e.OpenCode},Codex:{...e.Codex},ClaudeCode:{...e.ClaudeCode}}),Ue=(e,t)=>{let r=ts(es);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 mt=null,rs=()=>mt||(mt=be(),mt),De=()=>process.env.VIBEMUX_WORKER_RELEASE_CHANNEL?.trim()||rs().channel?.trim()||"production",ns=e=>e==="preview"?"vibemux-worker-preview":"vibemux-worker",os=e=>e==="preview"?"preview":"latest",is=()=>(process.env.npm_config_registry?.trim()||"https://registry.npmjs.org").replace(/\/$/,""),ss=async e=>{let t=await fetch(`${is()}/${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()},ve=async()=>{let e=Y(),t=De(),r=me().name?.trim()||"",n=ns(t),o=os(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\u81EA\u52A8\u66F4\u65B0\u3002"};try{let a=(await ss(n))["dist-tags"]?.[o]?.trim();return a?a===e?{ok:!0,currentVersion:e,latestVersion:a,channel:t,available:!1,packageName:n,packageTag:o,message:`\u5F53\u524D\u5DF2\u662F\u6700\u65B0\u7248\u672C ${e}\u3002`}:{ok:!0,currentVersion:e,latestVersion:a,channel:t,available:!0,packageName:n,packageTag:o,message:`\u68C0\u6D4B\u5230\u65B0\u7248\u672C ${a}\uFF0C\u51C6\u5907\u901A\u8FC7 npx \u81EA\u52A8\u5207\u6362\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 yt=N.join(Ne.homedir(),".vibemux"),ls=N.join(yt,"worker"),ds=N.join(yt,"worker-dev"),us=N.join(yt,"worker-dev-preview"),ps=N.join(yt,"worker-preview"),gs="http://127.0.0.1:8989",ms=48100,fs=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"]),rn=()=>!!process.env.VIBEMUX_CLOUD_URL?.trim(),ft=()=>process.env.VIBEMUX_CLOUD_URL?.trim()||be().defaultCloudUrl?.trim()||gs,hs=e=>process.env.NODE_ENV==="development"||rn()||!be().defaultCloudUrl?.trim()?!1:fs.has(e?.trim()||""),ks=()=>{let e=ft(),t=De();return process.env.NODE_ENV==="development"?e.includes("preview.vibemux.com")?us:ds:t==="preview"||e.includes("preview.vibemux.com")?ps:ls},ys=()=>{let e=Number(process.env.VIBEMUX_WORKER_PORT?.trim());if(Number.isFinite(e)&&e>0)return e;let t=be().defaultLocalServerPort;return Number.isFinite(t)&&t?t:ms},ws=()=>process.env.OPENCODE_CONFIG_PATH?.trim()||N.join(Ne.homedir(),".config","opencode","opencode.json"),Cs=()=>{let e=process.env.CODEX_HOME?.trim()||N.join(Ne.homedir(),".codex");return N.join(e,"config.toml")},xs=()=>{let e=process.env.CLAUDE_HOME?.trim()||N.join(Ne.homedir(),".claude");return N.join(e,"settings.json")},Ss=()=>{let e=ws();if(!ht(e))return{opencodeConfigContent:"",defaultModel:""};try{let t=kt(e,"utf8").trim();if(!t)return{opencodeConfigContent:"",defaultModel:""};let r=ne(t),n=Object.entries(r.default??{}).find(([,o])=>!!o?.trim());return{opencodeConfigContent:t,defaultModel:n?`${n[0]}/${n[1]}`:""}}catch{return{opencodeConfigContent:"",defaultModel:""}}},Zr=e=>{if(!ht(e))return"";try{return kt(e,"utf8").trim()}catch{return""}},bs=()=>{let e=process.env.VIBEMUX_WORKER_HOME?.trim();if(e)return e;let t=process.env.VIBEMUX_HOME?.trim();return t?N.join(t,"worker"):ks()},he=()=>N.resolve(bs()),or=()=>N.join(he(),"config.json"),vs=()=>N.join(he(),"machine-id"),Ps=()=>{let e=he(),t=vs();if(ht(t)){let n=kt(t,"utf8").trim();if(n)return n}en(e,{recursive:!0});let r=cs();return tn(t,`${r}
2
+ `,"utf8"),r},Is=()=>({cloudUrl:ft(),machineId:Ps(),machineName:Ne.hostname(),opencodeConfigContent:"",codexConfigContent:"",claudeCodeConfigContent:"",defaultModel:"",agentSettings:Ue(),mcpServers:[],workspaceRoot:N.join(he(),"workspace"),maxConcurrency:1,labels:[],capabilities:["code-execution","git-operations"],localServerPort:Number(process.env.VIBEMUX_WORKER_PORT||ys()),projectBindings:[]}),x=()=>{let e=or(),t=ht(e)?JSON.parse(kt(e,"utf8")):{},r={...Is(),...t},n=Ss();rn()&&(r.cloudUrl=ft()),hs(r.cloudUrl)&&(r.cloudUrl=ft());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=Zr(Cs())),r.claudeCodeConfigContent?.trim()||(r.claudeCodeConfigContent=Zr(xs())),r.defaultModel?.trim()||(r.defaultModel=n.defaultModel),r.agentSettings=Ue(r.agentSettings,r.defaultModel),r},Pe=e=>{let t=he();en(t,{recursive:!0}),tn(or(),`${JSON.stringify(e,null,2)}
3
+ `,"utf8")},Le=(e=x(),t)=>gt(e.opencodeConfigContent,e.mcpServers??[],{cloudUrl:e.cloudUrl,executorToken:e.executorToken,actingUserId:t}),wt=()=>{as(or(),{force:!0})},nn=()=>{let e={...x(),executorName:void 0,executorId:void 0,executorToken:void 0};return Pe(e),e};import{existsSync as xt}from"node:fs";import{stdin as mn,stdout as fn}from"node:process";import St from"node:path";import{createInterface as Fs}from"node:readline/promises";import{existsSync as $s}from"node:fs";import Us from"node:os";import an from"node:path";import{spawn as Ds}from"node:child_process";import{accessSync as Ts,constants as Es,existsSync as Rs}from"node:fs";import{delimiter as ir,dirname as As,isAbsolute as Ms,join as Os}from"node:path";import{spawnSync as Bs}from"node:child_process";var W=(e,t,r)=>{let n=Bs(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}},R=(e,t)=>e.stdout||e.stderr||e.error||t,M=(e,t=["--version"])=>W(e,t).ok,Ws=e=>{let t=process.env.PATH??"";t.split(ir).filter(Boolean).includes(e)||(process.env.PATH=t?`${e}${ir}${t}`:e)},sr=e=>{if(!Rs(e))return!1;try{return Ts(e,Es.X_OK),!0}catch{return!1}},sn=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 sr(e)?e:null;for(let r of t){let n=`${e}${r}`;if(sr(n))return n}return null},on=e=>process.platform==="win32"?sn(e):sr(e)?e:null,oe=e=>{if(e.includes("/")||e.includes("\\")||Ms(e))return on(e);for(let t of(process.env.PATH??"").split(ir).filter(Boolean)){let r=Os(t,e),n=process.platform==="win32"?sn(r):on(r);if(n)return Ws(As(n)),n}return null},_s=(e,t,r)=>typeof process.getuid=="function"&&process.getuid()===0?{command:e,args:t}:M("sudo")?r?.interactiveAuth?{command:"sudo",args:[e,...t]}:M("sudo",["-n","true"])?{command:"sudo",args:["-n",e,...t]}:null:null,ie=(e,t,r,n)=>{let o=_s(e,t,n);return o?W(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,cn=15e3,Ns=()=>process.env.CLAUDE_HOME?.trim()||an.join(Us.homedir(),".claude"),Ls=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,Ct=(e,t,r)=>({id:e,label:Ls(e),ok:r.ok,changed:r.changed,detail:r.detail,skipped:r.skipped,installer:t?.installer,commandSummary:t?.commandSummary}),ln=(e,t,r,n,o,s)=>{let a={installer:r,commandSummary:t},c=W("npm",["install","-g",e],{streamOutput:s?.streamOutput,timeout:je});return!c.ok&&process.platform!=="win32"&&(c=ie("npm",["install","-g",e],je,s)),Ct(n,a,{ok:c.ok,changed:c.ok,detail:R(c,o)})},dn=()=>M("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 ln("@openai/codex","npm install -g @openai/codex","npm","codex-cli","\u5B89\u88C5 Codex CLI \u5931\u8D25",e)}}:null,un=()=>process.platform==="darwin"&&M("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=W("brew",["install","--cask","claude-code"],{streamOutput:e?.streamOutput,timeout:je});return Ct("claude-cli",t,{ok:r.ok,changed:r.ok,detail:R(r,"\u5B89\u88C5 Claude Code CLI \u5931\u8D25")})}}:process.platform==="win32"&&M("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=W("winget",["install","--id","Anthropic.ClaudeCode","--exact","--source","winget","--accept-package-agreements","--accept-source-agreements"],{streamOutput:e?.streamOutput,timeout:je});return Ct("claude-cli",t,{ok:r.ok,changed:r.ok,detail:R(r,"\u5B89\u88C5 Claude Code CLI \u5931\u8D25")})}}:process.platform!=="win32"&&M("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=W("bash",["-lc","curl -fsSL https://claude.ai/install.sh | bash"],{streamOutput:e?.streamOutput,timeout:je});return Ct("claude-cli",t,{ok:r.ok,changed:r.ok,detail:R(r,"\u5B89\u88C5 Claude Code CLI \u5931\u8D25")})}}:M("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 ln("@anthropic-ai/claude-code","npm install -g @anthropic-ai/claude-code","npm","claude-cli","\u5B89\u88C5 Claude Code CLI \u5931\u8D25",e)}}:null,js=()=>{let e=oe("codex"),t=e?W(e,["--version"]):null,r=dn();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"}},Gs=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=Ds(e,["app-server"],{env:process.env,stdio:["pipe","pipe","pipe"]}),o="",s="",a=!1,c=0,l=-1,i=-1,d=k=>{a||(a=!0,clearTimeout(p),n.killed||n.kill("SIGTERM"),r(k))},u=k=>{n.stdin.write(`${JSON.stringify(k)}
4
4
  `)},p=setTimeout(()=>{d({ok:!1,detail:"Codex \u767B\u5F55\u72B6\u6001\u68C0\u67E5\u8D85\u65F6\u3002"})},cn),g=()=>{c+=1,i=c,u({jsonrpc:"2.0",id:c,method:"account/read",params:{refreshToken:!1}})},w=k=>{let m=k.trim();if(m)try{let f=JSON.parse(m);if(f.error?.message){d({ok:!1,detail:f.error.message});return}if(!f.result||typeof f.id>"u")return;if(f.id===l){u({jsonrpc:"2.0",method:"initialized"}),g();return}if(f.id!==i)return;if(f.result.requiresOpenaiAuth&&!f.result.account){d({ok:!1,detail:"Codex \u672A\u767B\u5F55\uFF0C\u8BF7\u5148\u8FD0\u884C `codex` \u5B8C\u6210\u8BA4\u8BC1\u3002"});return}d({ok:!0,detail:"Codex \u767B\u5F55\u72B6\u6001\u6B63\u5E38\u3002"})}catch{return}};n.stdout.on("data",k=>{o+=k.toString();let m=o.split(`
5
5
  `);o=m.pop()??"";for(let f of m)w(f)}),n.stderr.on("data",k=>{s+=k.toString()}),n.on("error",k=>{d({ok:!1,detail:k instanceof Error?k.message:"Codex \u767B\u5F55\u68C0\u67E5\u5931\u8D25\u3002"})}),n.on("close",()=>{if(a)return;let k=s.trim().split(`
6
- `).filter(Boolean).at(-1)||"Codex \u767B\u5F55\u68C0\u67E5\u5931\u8D25\u3002";d({ok:!1,detail:k})}),c+=1,l=c,u({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"}},Ls=()=>{let e=oe("claude"),t=e?W(e,["--version"]):null,r=un();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"}},js=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}},Gs=()=>{if(process.env.ANTHROPIC_API_KEY?.trim()||process.env.ANTHROPIC_AUTH_TOKEN?.trim()||Bs(an.join($s(),".credentials.json")))return!0;try{return js(x().claudeCodeConfigContent??"")}catch{return!1}},qs=()=>{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(Gs())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=W(e,["doctor"],{timeout:cn});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":R(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"}},pn=async e=>e==="codex-cli"?Us():e==="codex-auth"?Ns():e==="claude-cli"?Ls():e==="claude-auth"?qs():null,gn=e=>e==="codex-cli"?dn():e==="claude-cli"?un():null;var J=900*1e3,ke=K(),Js=e=>{let t=process.env.PATH??"";t.split(St.delimiter).filter(Boolean).includes(e)||(process.env.PATH=t?`${e}${St.delimiter}${t}`:e)},dr=()=>{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(xt(o))return Js(St.dirname(o)),o}return null},hn=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",H=(e,t,r)=>({id:e,label:hn(e),ok:r.ok,changed:r.changed,detail:r.detail,skipped:r.skipped,installer:t?.installer,commandSummary:t?.commandSummary}),kn=()=>{if(process.platform==="win32")return M("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=W("winget",["install","--id","Git.Git","--exact","--source","winget","--accept-package-agreements","--accept-source-agreements"],{streamOutput:e?.streamOutput,timeout:J});return r.ok&&dr(),H("git",t,{ok:r.ok,changed:r.ok,detail:R(r,"winget install Git.Git \u5931\u8D25")})}}:M("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=W("choco",["install","git","-y"],{streamOutput:e?.streamOutput,timeout:J});return r.ok&&dr(),H("git",t,{ok:r.ok,changed:r.ok,detail:R(r,"choco install git \u5931\u8D25")})}}:null;if(process.platform==="darwin")return M("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=W("brew",["install","git"],{streamOutput:e?.streamOutput,timeout:J});return H("git",t,{ok:r.ok,changed:r.ok,detail:R(r,"brew install git \u5931\u8D25")})}}:null;if(process.platform==="linux"){if(M("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=ie("apt-get",["update"],J,e);if(!r.ok)return H("git",t,{ok:!1,changed:!1,detail:R(r,"apt-get update \u5931\u8D25")});let n=ie("apt-get",["install","-y","git"],J,e);return H("git",t,{ok:n.ok,changed:n.ok,detail:R(n,"apt-get install git \u5931\u8D25")})}};if(M("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=ie("dnf",["install","-y","git"],J,e);return H("git",t,{ok:r.ok,changed:r.ok,detail:R(r,"dnf install git \u5931\u8D25")})}};if(M("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=ie("yum",["install","-y","git"],J,e);return H("git",t,{ok:r.ok,changed:r.ok,detail:R(r,"yum install git \u5931\u8D25")})}};if(M("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=ie("pacman",["-Sy","--noconfirm","git"],J,e);return H("git",t,{ok:r.ok,changed:r.ok,detail:R(r,"pacman \u5B89\u88C5 git \u5931\u8D25")})}};if(M("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=ie("apk",["add","git"],J,e);return H("git",t,{ok:r.ok,changed:r.ok,detail:R(r,"apk add git \u5931\u8D25")})}}}return null},yn=()=>xt(`${ke}/package.json`)?xt(`${ke}/pnpm-lock.yaml`)&&M("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=W("pnpm",["install","--frozen-lockfile"],{cwd:ke,streamOutput:e?.streamOutput,timeout:J});return H("opencode",t,{ok:r.ok,changed:r.ok,detail:R(r,"pnpm install \u5931\u8D25")})}}:xt(`${ke}/package-lock.json`)&&M("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=W("npm",["ci"],{cwd:ke,streamOutput:e?.streamOutput,timeout:J});return H("opencode",t,{ok:r.ok,changed:r.ok,detail:R(r,"npm ci \u5931\u8D25")})}}:M("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=W("npm",["install"],{cwd:ke,streamOutput:e?.streamOutput,timeout:J});return H("opencode",t,{ok:r.ok,changed:r.ok,detail:R(r,"npm install \u5931\u8D25")})}}:null:null,Fs=e=>e==="git"?kn():e==="opencode"?yn():gn(e),zs=()=>{dr();let e=W("git",["--version"]),t=kn();return{id:"git",label:"Git",ok:e.ok,detail:R(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"}},Vs=()=>{let e=W(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:ke}),t=yn();return{id:"opencode",label:"Worker \u4F9D\u8D56",ok:e.ok,detail:e.ok?"@opencode-ai/sdk \u5DF2\u5B89\u88C5":R(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"}},wn=async e=>{if(e==="git")return zs();if(e==="opencode")return Vs();let t=await pn(e);return t||{id:e,label:hn(e),ok:!1,detail:"\u672A\u77E5\u68C0\u67E5\u9879\u3002",autoInstallable:!1}},Ks=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"],Xs=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",Cn=(e,t)=>{let r=e.filter(o=>!o.ok),n=r.length===0;return{ok:n,target:t,items:e,missingItems:r,message:n?Xs(t):`\u8FD0\u884C\u73AF\u5883\u7F3A\u5931\uFF1A${r.map(o=>o.label).join("\u3001")}`}},ur=async(e="base")=>{let t=await Promise.all(Ks(e).map(r=>wn(r)));return Cn(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 a=n.get(s.id);return a?{...s,detail:`${s.detail}\uFF1B\u81EA\u52A8\u51C6\u5907\uFF1A${a}`}: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")}`}},ar=(e,t,r)=>{console.log(`[${e}/${t}] ${r}`)},cr=(e,t)=>{console.log(` ${e} - ${t}`)},xn=async(e,t)=>{if(e.ok)return bt(e);let r=[],n=e.missingItems.length*2+1,o=1;for(let a of e.missingItems){let c=Fs(a.id),l=c?`\u5B89\u88C5 ${a.label}\uFF08${c.installer}\uFF09`:`\u5B89\u88C5 ${a.label}`;t?.printProgress&&ar(o,n,l);let i=c?c.run(t):H(a.id,null,{ok:!1,changed:!1,skipped:!0,detail:a.hint||`\u5F53\u524D\u73AF\u5883\u65E0\u6CD5\u81EA\u52A8\u5B89\u88C5 ${a.label}\u3002`});r.push(i),t?.printProgress&&cr(i.ok?"\u6210\u529F":i.skipped?"\u8DF3\u8FC7":"\u5931\u8D25",i.detail),o+=1;let d=await wn(a.id);t?.printProgress&&(ar(o,n,`\u6821\u9A8C ${a.label}`),cr(d.ok?"\u6210\u529F":"\u5931\u8D25",d.detail)),o+=1}let s=await ur(e.target);return t?.printProgress&&(ar(o,n,"\u6700\u7EC8\u590D\u68C0"),cr(s.ok?"\u6210\u529F":"\u5931\u8D25",s.message)),bt(s,r)},Ys=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
- `),lr=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"}`)},Qs=()=>!!(mn.isTTY&&fn.isTTY),Zs=e=>{let t=e.trim().toLowerCase();return t==="y"||t==="yes"||t==="\u662F"},se=async e=>{let t=await ur(e?.target??"base");return t.ok||!e?.autoInstall?bt(t):xn(t,e)},Sn=async(e,t="base")=>{let r=await ur(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(Ys(r)),!Qs()){let a="\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] ${a}`),lr(r),{status:"non_interactive_blocked",report:n,message:a}}let o=Hs({input:mn,output:fn});try{let a=await o.question("\u662F\u5426\u73B0\u5728\u81EA\u52A8\u5B89\u88C5\u7F3A\u5931\u4F9D\u8D56\uFF1F[y/N] ");if(!Zs(a)){let c="\u7528\u6237\u62D2\u7EDD\u81EA\u52A8\u5B89\u88C5\uFF0CWorker \u5DF2\u9000\u51FA\u3002";return console.error(`[worker] ${c}`),lr(r),{status:"declined",report:n,message:c}}}finally{o.close()}let s=await xn(r,{interactiveAuth:!0,printProgress:!0,streamOutput:!0});return s.ok?{status:"ready",report:s,message:s.message}:(lr(Cn(s.items,t)),{status:"failed",report:s,message:s.message})};var vt={daemonMode:"idle",paired:!1,connected:!1,runningTaskIds:[],queuedTaskIds:[]},Ge=()=>({...vt,runningTaskIds:[...vt.runningTaskIds],queuedTaskIds:[...vt.queuedTaskIds]}),pr=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}))}),Pe=()=>{let e=Ge();return{...e,config:e.config?pr(e.config):void 0}},A=e=>{Object.assign(vt,e)};import{mkdtemp as ea,readFile as ta,rm as ra}from"node:fs/promises";import na from"node:os";import It from"node:path";var le=e=>e.replace(/\/+$/,""),bn=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 ye=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 vn=async e=>ye({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."}),In=async e=>ye({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 Pn=12,Tn=12,En=1500,Rn=e=>{let t=e?.trim();if(t)return t.length>En?`${t.slice(0,En)}\u2026`:t},oa=e=>{if(e!==void 0)try{return Rn(JSON.stringify(e,null,2))}catch{return}},ia=(e,t)=>`data:${t};base64,${e.toString("base64")}`,Pt=async e=>{let{chromium:t}=await import("playwright"),r=null,n=null,o="",s,a=0,c=0,l="playwright",i=0,d=0,u=async g=>{let w=g.level??"info";(w==="error"||w==="warning")&&(c+=1),a+=1,await vn({cloudUrl:e.cloudUrl,executorToken:e.executorToken,taskId:e.taskId,workspaceId:e.workspaceId,workspaceSessionId:e.workspaceSessionId,kind:g.kind,level:w,title:g.title,detail:Rn(g.detail),url:g.url,attachments:g.attachments,metadata:g.metadata}).catch(()=>{})},p=async(g,w)=>{let k=It.join(o,`${Date.now()}-${w}.png`);await g.screenshot({path:k,fullPage:!0});let m=await ta(k),f=await In({cloudUrl:e.cloudUrl,executorToken:e.executorToken,taskId:e.taskId,filename:It.basename(k),image:ia(m,"image/png")});s=f.url,await u({kind:"screenshot",level:"info",title:`\u9875\u9762\u622A\u56FE \xB7 ${w}`,detail:`\u5F53\u524D\u9875\u9762: ${g.url()}`,url:f.url,attachments:[{id:f.id,url:f.url,filename:It.basename(k),contentType:"image/png"}],metadata:{label:w}})};try{o=await ea(It.join(na.tmpdir(),"vibemux-browser-run-")),r=await t.launch({headless:!0}),n=await r.newContext({ignoreHTTPSErrors:!0,viewport:{width:1440,height:960}});let g=await n.newPage();if(g.on("console",f=>{let S=f.type();if(S==="error"||S==="warning"){if(i>=Pn)return;i+=1,u({kind:"browser-console",level:S==="error"?"error":"warning",title:`Console ${S}`,detail:[f.text(),oa(f.location())].filter(Boolean).join(`
8
- `),url:g.url()||e.appUrl,metadata:{type:S,location:f.location()}})}}),g.on("pageerror",f=>{i>=Pn||(i+=1,u({kind:"browser-console",level:"error",title:"\u9875\u9762\u811A\u672C\u5F02\u5E38",detail:f.message,url:g.url()||e.appUrl}))}),g.on("requestfailed",f=>{d>=Tn||(d+=1,u({kind:"network",level:"error",title:`\u8BF7\u6C42\u5931\u8D25 \xB7 ${f.method()} ${f.resourceType()}`,detail:[f.url(),f.failure()?.errorText].filter(Boolean).join(`
6
+ `).filter(Boolean).at(-1)||"Codex \u767B\u5F55\u68C0\u67E5\u5931\u8D25\u3002";d({ok:!1,detail:k})}),c+=1,l=c,u({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"}},qs=()=>{let e=oe("claude"),t=e?W(e,["--version"]):null,r=un();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"}},Hs=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}},zs=()=>{if(process.env.ANTHROPIC_API_KEY?.trim()||process.env.ANTHROPIC_AUTH_TOKEN?.trim()||$s(an.join(Ns(),".credentials.json")))return!0;try{return Hs(x().claudeCodeConfigContent??"")}catch{return!1}},Js=()=>{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(zs())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=W(e,["doctor"],{timeout:cn});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":R(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"}},pn=async e=>e==="codex-cli"?js():e==="codex-auth"?Gs():e==="claude-cli"?qs():e==="claude-auth"?Js():null,gn=e=>e==="codex-cli"?dn():e==="claude-cli"?un():null;var z=900*1e3,ke=K(),Vs=e=>{let t=process.env.PATH??"";t.split(St.delimiter).filter(Boolean).includes(e)||(process.env.PATH=t?`${e}${St.delimiter}${t}`:e)},dr=()=>{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(xt(o))return Vs(St.dirname(o)),o}return null},hn=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",H=(e,t,r)=>({id:e,label:hn(e),ok:r.ok,changed:r.changed,detail:r.detail,skipped:r.skipped,installer:t?.installer,commandSummary:t?.commandSummary}),kn=()=>{if(process.platform==="win32")return M("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=W("winget",["install","--id","Git.Git","--exact","--source","winget","--accept-package-agreements","--accept-source-agreements"],{streamOutput:e?.streamOutput,timeout:z});return r.ok&&dr(),H("git",t,{ok:r.ok,changed:r.ok,detail:R(r,"winget install Git.Git \u5931\u8D25")})}}:M("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=W("choco",["install","git","-y"],{streamOutput:e?.streamOutput,timeout:z});return r.ok&&dr(),H("git",t,{ok:r.ok,changed:r.ok,detail:R(r,"choco install git \u5931\u8D25")})}}:null;if(process.platform==="darwin")return M("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=W("brew",["install","git"],{streamOutput:e?.streamOutput,timeout:z});return H("git",t,{ok:r.ok,changed:r.ok,detail:R(r,"brew install git \u5931\u8D25")})}}:null;if(process.platform==="linux"){if(M("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=ie("apt-get",["update"],z,e);if(!r.ok)return H("git",t,{ok:!1,changed:!1,detail:R(r,"apt-get update \u5931\u8D25")});let n=ie("apt-get",["install","-y","git"],z,e);return H("git",t,{ok:n.ok,changed:n.ok,detail:R(n,"apt-get install git \u5931\u8D25")})}};if(M("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=ie("dnf",["install","-y","git"],z,e);return H("git",t,{ok:r.ok,changed:r.ok,detail:R(r,"dnf install git \u5931\u8D25")})}};if(M("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=ie("yum",["install","-y","git"],z,e);return H("git",t,{ok:r.ok,changed:r.ok,detail:R(r,"yum install git \u5931\u8D25")})}};if(M("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=ie("pacman",["-Sy","--noconfirm","git"],z,e);return H("git",t,{ok:r.ok,changed:r.ok,detail:R(r,"pacman \u5B89\u88C5 git \u5931\u8D25")})}};if(M("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=ie("apk",["add","git"],z,e);return H("git",t,{ok:r.ok,changed:r.ok,detail:R(r,"apk add git \u5931\u8D25")})}}}return null},yn=()=>xt(`${ke}/package.json`)?xt(`${ke}/pnpm-lock.yaml`)&&M("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=W("pnpm",["install","--frozen-lockfile"],{cwd:ke,streamOutput:e?.streamOutput,timeout:z});return H("opencode",t,{ok:r.ok,changed:r.ok,detail:R(r,"pnpm install \u5931\u8D25")})}}:xt(`${ke}/package-lock.json`)&&M("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=W("npm",["ci"],{cwd:ke,streamOutput:e?.streamOutput,timeout:z});return H("opencode",t,{ok:r.ok,changed:r.ok,detail:R(r,"npm ci \u5931\u8D25")})}}:M("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=W("npm",["install"],{cwd:ke,streamOutput:e?.streamOutput,timeout:z});return H("opencode",t,{ok:r.ok,changed:r.ok,detail:R(r,"npm install \u5931\u8D25")})}}:null:null,Ks=e=>e==="git"?kn():e==="opencode"?yn():gn(e),Xs=()=>{dr();let e=W("git",["--version"]),t=kn();return{id:"git",label:"Git",ok:e.ok,detail:R(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"}},Ys=()=>{let e=W(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:ke}),t=yn();return{id:"opencode",label:"Worker \u4F9D\u8D56",ok:e.ok,detail:e.ok?"@opencode-ai/sdk \u5DF2\u5B89\u88C5":R(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"}},wn=async e=>{if(e==="git")return Xs();if(e==="opencode")return Ys();let t=await pn(e);return t||{id:e,label:hn(e),ok:!1,detail:"\u672A\u77E5\u68C0\u67E5\u9879\u3002",autoInstallable:!1}},Qs=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"],Zs=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",Cn=(e,t)=>{let r=e.filter(o=>!o.ok),n=r.length===0;return{ok:n,target:t,items:e,missingItems:r,message:n?Zs(t):`\u8FD0\u884C\u73AF\u5883\u7F3A\u5931\uFF1A${r.map(o=>o.label).join("\u3001")}`}},ur=async(e="base")=>{let t=await Promise.all(Qs(e).map(r=>wn(r)));return Cn(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 a=n.get(s.id);return a?{...s,detail:`${s.detail}\uFF1B\u81EA\u52A8\u51C6\u5907\uFF1A${a}`}: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")}`}},ar=(e,t,r)=>{console.log(`[${e}/${t}] ${r}`)},cr=(e,t)=>{console.log(` ${e} - ${t}`)},xn=async(e,t)=>{if(e.ok)return bt(e);let r=[],n=e.missingItems.length*2+1,o=1;for(let a of e.missingItems){let c=Ks(a.id),l=c?`\u5B89\u88C5 ${a.label}\uFF08${c.installer}\uFF09`:`\u5B89\u88C5 ${a.label}`;t?.printProgress&&ar(o,n,l);let i=c?c.run(t):H(a.id,null,{ok:!1,changed:!1,skipped:!0,detail:a.hint||`\u5F53\u524D\u73AF\u5883\u65E0\u6CD5\u81EA\u52A8\u5B89\u88C5 ${a.label}\u3002`});r.push(i),t?.printProgress&&cr(i.ok?"\u6210\u529F":i.skipped?"\u8DF3\u8FC7":"\u5931\u8D25",i.detail),o+=1;let d=await wn(a.id);t?.printProgress&&(ar(o,n,`\u6821\u9A8C ${a.label}`),cr(d.ok?"\u6210\u529F":"\u5931\u8D25",d.detail)),o+=1}let s=await ur(e.target);return t?.printProgress&&(ar(o,n,"\u6700\u7EC8\u590D\u68C0"),cr(s.ok?"\u6210\u529F":"\u5931\u8D25",s.message)),bt(s,r)},ea=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
+ `),lr=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=()=>!!(mn.isTTY&&fn.isTTY),ra=e=>{let t=e.trim().toLowerCase();return t==="y"||t==="yes"||t==="\u662F"},se=async e=>{let t=await ur(e?.target??"base");return t.ok||!e?.autoInstall?bt(t):xn(t,e)},Sn=async(e,t="base")=>{let r=await ur(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(ea(r)),!ta()){let a="\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] ${a}`),lr(r),{status:"non_interactive_blocked",report:n,message:a}}let o=Fs({input:mn,output:fn});try{let a=await o.question("\u662F\u5426\u73B0\u5728\u81EA\u52A8\u5B89\u88C5\u7F3A\u5931\u4F9D\u8D56\uFF1F[y/N] ");if(!ra(a)){let c="\u7528\u6237\u62D2\u7EDD\u81EA\u52A8\u5B89\u88C5\uFF0CWorker \u5DF2\u9000\u51FA\u3002";return console.error(`[worker] ${c}`),lr(r),{status:"declined",report:n,message:c}}}finally{o.close()}let s=await xn(r,{interactiveAuth:!0,printProgress:!0,streamOutput:!0});return s.ok?{status:"ready",report:s,message:s.message}:(lr(Cn(s.items,t)),{status:"failed",report:s,message:s.message})};var vt={daemonMode:"idle",paired:!1,connected:!1,runningTaskIds:[],queuedTaskIds:[]},Ge=()=>({...vt,runningTaskIds:[...vt.runningTaskIds],queuedTaskIds:[...vt.queuedTaskIds]}),pr=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}))}),Ie=()=>{let e=Ge();return{...e,config:e.config?pr(e.config):void 0}},A=e=>{Object.assign(vt,e)};import{mkdtemp as na,readFile as oa,rm as ia}from"node:fs/promises";import sa from"node:os";import Pt from"node:path";var le=e=>e.replace(/\/+$/,""),bn=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 ye=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 vn=async e=>ye({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."}),Pn=async e=>ye({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 In=12,Tn=12,En=1500,Rn=e=>{let t=e?.trim();if(t)return t.length>En?`${t.slice(0,En)}\u2026`:t},aa=e=>{if(e!==void 0)try{return Rn(JSON.stringify(e,null,2))}catch{return}},ca=(e,t)=>`data:${t};base64,${e.toString("base64")}`,It=async e=>{let{chromium:t}=await import("playwright"),r=null,n=null,o="",s,a=0,c=0,l="playwright",i=0,d=0,u=async g=>{let w=g.level??"info";(w==="error"||w==="warning")&&(c+=1),a+=1,await vn({cloudUrl:e.cloudUrl,executorToken:e.executorToken,taskId:e.taskId,workspaceId:e.workspaceId,workspaceSessionId:e.workspaceSessionId,kind:g.kind,level:w,title:g.title,detail:Rn(g.detail),url:g.url,attachments:g.attachments,metadata:g.metadata}).catch(()=>{})},p=async(g,w)=>{let k=Pt.join(o,`${Date.now()}-${w}.png`);await g.screenshot({path:k,fullPage:!0});let m=await oa(k),f=await Pn({cloudUrl:e.cloudUrl,executorToken:e.executorToken,taskId:e.taskId,filename:Pt.basename(k),image:ca(m,"image/png")});s=f.url,await u({kind:"screenshot",level:"info",title:`\u9875\u9762\u622A\u56FE \xB7 ${w}`,detail:`\u5F53\u524D\u9875\u9762: ${g.url()}`,url:f.url,attachments:[{id:f.id,url:f.url,filename:Pt.basename(k),contentType:"image/png"}],metadata:{label:w}})};try{o=await na(Pt.join(sa.tmpdir(),"vibemux-browser-run-")),r=await t.launch({headless:!0}),n=await r.newContext({ignoreHTTPSErrors:!0,viewport:{width:1440,height:960}});let g=await n.newPage();if(g.on("console",f=>{let S=f.type();if(S==="error"||S==="warning"){if(i>=In)return;i+=1,u({kind:"browser-console",level:S==="error"?"error":"warning",title:`Console ${S}`,detail:[f.text(),aa(f.location())].filter(Boolean).join(`
8
+ `),url:g.url()||e.appUrl,metadata:{type:S,location:f.location()}})}}),g.on("pageerror",f=>{i>=In||(i+=1,u({kind:"browser-console",level:"error",title:"\u9875\u9762\u811A\u672C\u5F02\u5E38",detail:f.message,url:g.url()||e.appUrl}))}),g.on("requestfailed",f=>{d>=Tn||(d+=1,u({kind:"network",level:"error",title:`\u8BF7\u6C42\u5931\u8D25 \xB7 ${f.method()} ${f.resourceType()}`,detail:[f.url(),f.failure()?.errorText].filter(Boolean).join(`
9
9
  `),url:f.url(),metadata:{method:f.method(),resourceType:f.resourceType(),failure:f.failure()}}))}),g.on("response",f=>{f.ok()||d>=Tn||(d+=1,u({kind:"network",level:f.status()>=500?"error":"warning",title:`\u54CD\u5E94\u5F02\u5E38 \xB7 ${f.status()} ${f.request().method()}`,detail:[f.url(),f.statusText()].filter(Boolean).join(`
10
10
  `),url:f.url(),metadata:{method:f.request().method(),status:f.status(),statusText:f.statusText()}}))}),await u({kind:"action",level:"info",title:"\u5F00\u59CB\u6D4F\u89C8\u5668\u5DE1\u68C0",detail:[`\u6A21\u5F0F: ${e.mode==="midscene"?"Midscene \u4F18\u5148":"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
11
  `),url:e.appUrl}),e.healthUrl?.trim()){let f=await fetch(e.healthUrl,{redirect:"follow"}).catch(S=>({ok:!1,status:0,statusText:S instanceof Error?S.message:"health request failed"}));await u({kind:"network",level:f.ok?"success":"warning",title:f.ok?"\u5065\u5EB7\u68C0\u67E5\u901A\u8FC7":"\u5065\u5EB7\u68C0\u67E5\u5F02\u5E38",detail:`${e.healthUrl}
12
12
  ${f.status} ${f.statusText}`,url:e.healthUrl,metadata:{status:f.status,statusText:f.statusText}})}let w=await g.goto(e.appUrl,{waitUntil:"domcontentloaded",timeout:3e4});await g.waitForLoadState("networkidle",{timeout:1e4}).catch(()=>{}),await u({kind:"action",level:w?.ok()?"success":"warning",title:w?.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: ${g.url()}`,w?`HTTP ${w.status()} ${w.statusText()}`:"\u672A\u83B7\u5F97\u9996\u4E2A\u5BFC\u822A\u54CD\u5E94"].join(`
13
13
  `),url:g.url()}),await p(g,"initial");let k=e.goal?.trim();if(e.mode==="midscene"&&k)try{let f=await import("@midscene/web/playwright"),S=new f.PlaywrightAgent(g);l="midscene",await u({kind:"action",level:"info",title:"\u5F00\u59CB Midscene AI \u70B9\u51FB",detail:k,url:g.url()}),await S.aiAction(k),await g.waitForLoadState("networkidle",{timeout:1e4}).catch(()=>{}),await p(g,"after-midscene")}catch(f){await u({kind:"action",level:"warning",title:"Midscene \u6267\u884C\u5931\u8D25\uFF0C\u5DF2\u56DE\u9000\u4E3A Playwright \u5DE1\u68C0",detail:f instanceof Error?f.message:"Midscene \u672A\u6210\u529F\u6267\u884C\u3002",url:g.url()})}else k&&await u({kind:"action",level:"info",title:"\u5DF2\u8BB0\u5F55\u6D4B\u8BD5\u76EE\u6807",detail:k,url:g.url()});let m=c>0?`\u6D4F\u89C8\u5668\u5DE1\u68C0\u5B8C\u6210\uFF0C\u53D1\u73B0 ${c} \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 u({kind:"action",level:c>0?"warning":"success",title:c>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: ${g.url()}`,`\u89C2\u6D4B\u6570\u91CF: ${a}`].join(`
14
- `),url:g.url(),metadata:{usedMode:l,observationsCount:a,issueCount:c,consoleCount:i,networkCount:d}}),{ok:!0,message:m,summary:m,usedMode:l,finalUrl:g.url(),screenshotUrl:s,observationsCount:a,issueCount:c,at:new Date().toISOString()}}catch(g){let w=g instanceof Error?g.message:"\u6D4F\u89C8\u5668\u5DE1\u68C0\u5931\u8D25\u3002";return await u({kind:"action",level:"error",title:"\u6D4F\u89C8\u5668\u5DE1\u68C0\u5931\u8D25",detail:w,url:e.appUrl}),{ok:!1,message:w,summary:w,usedMode:l,finalUrl:e.appUrl,screenshotUrl:s,observationsCount:a,issueCount:c,at:new Date().toISOString()}}finally{await n?.close().catch(()=>{}),await r?.close().catch(()=>{}),o&&await ra(o,{recursive:!0,force:!0}).catch(()=>{})}};var qe=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=qe(e);if(!t)throw new Error(`\u7F3A\u5C11\u5FC5\u586B\u53C2\u6570 ${e}\u3002`);return t},sa=e=>e==="midscene"?"midscene":"playwright",An=async()=>{let e=x(),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 Pt({cloudUrl:e.cloudUrl,executorToken:t,taskId:Tt("--task-id"),workspaceId:Tt("--workspace-id"),workspaceSessionId:Tt("--workspace-session-id"),cwd:qe("--cwd")?.trim()||process.cwd(),appUrl:Tt("--app-url"),healthUrl:qe("--health-url")?.trim()||void 0,goal:qe("--goal")?.trim()||void 0,mode:sa(qe("--mode")?.trim())});console.log(JSON.stringify(r,null,2)),r.ok||(process.exitCode=1)};import{spawn as wu}from"node:child_process";var gr=async e=>ye({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 mr=async(e,t)=>ye({url:`${le(t)}/api/control-plane/executors/pair`,method:"POST",body:e,errorMessage:"Pair request failed."});var aa=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():"",Mn=async e=>{let t=await aa(e);return JSON.parse(t)};var fr=(e,t)=>{if(!e.executorToken)throw new Error("Worker is not paired yet.");let r=`${bn(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 Mn(o.data);try{t.onMessage?.(s)}catch(a){t.onError?.(`\u63A7\u5236\u9762\u6D88\u606F\u5904\u7406\u5931\u8D25\u3002${a instanceof Error?` ${a.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 ca}from"node:fs";import He from"node:path";var Et=e=>{let t={root:e,reposDir:He.join(e,"repos"),worktreesDir:He.join(e,"worktrees"),artifactsDir:He.join(e,"artifacts"),cacheDir:He.join(e,"cache")};for(let r of Object.values(t))ca(r,{recursive:!0});return t},On=(e,t,r)=>He.join(e,"worktrees",r?.trim()||t);import{existsSync as La,readFileSync as ja}from"node:fs";import Ga from"node:http";import br from"node:path";import{closeSync as la,existsSync as Bn,openSync as da,readFileSync as hr,readSync as ua,readdirSync as pa,statSync as ga}from"node:fs";import ma from"node:os";import j from"node:path";var At=ma.homedir(),fa=48*1024,ha=2e4,Wn=j.join(At,".claude","projects"),Rt=j.join(At,".local","share","opencode","storage","message"),ka=j.join(At,".local","share","opencode","storage","part"),_n=j.join(At,".codex","sessions"),ya=()=>({claude:0,opencode:0,codex:0}),$=e=>!!e&&typeof e=="object"&&!Array.isArray(e),Mt=e=>{try{return pa(e,{withFileTypes:!0})}catch{return[]}},Je=e=>{try{return ga(e)}catch{return null}},$n=(e,t=fa)=>{let r=da(e,"r"),n=Buffer.alloc(t);try{let o=ua(r,n,0,t,0);return n.subarray(0,o).toString("utf8")}finally{la(r)}},Dn=e=>{try{return JSON.parse(hr(e,"utf8"))}catch{return null}},Ot=e=>e.split(`
15
- `).map(t=>t.trim()).filter(Boolean).flatMap(t=>{try{return[JSON.parse(t)]}catch{return[]}}),Bt=(e,t)=>{if(!Bn(e))return[];let r=[],n=[e];for(;n.length>0;){let o=n.pop();if(o)for(let s of Mt(o)){let a=j.join(o,s.name);if(s.isDirectory()){n.push(a);continue}s.isFile()&&a.endsWith(t)&&r.push(a)}}return r},F=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()}},Un=(e,t=240)=>{let r=e.replace(/\s+/g," ").trim();return r?r.length<=t?r:`${r.slice(0,t-1)}\u2026`:""},Te=(e,t=ha)=>{let r=e.trim();return r?r.length<=t?r:`${r.slice(0,t)}
14
+ `),url:g.url(),metadata:{usedMode:l,observationsCount:a,issueCount:c,consoleCount:i,networkCount:d}}),{ok:!0,message:m,summary:m,usedMode:l,finalUrl:g.url(),screenshotUrl:s,observationsCount:a,issueCount:c,at:new Date().toISOString()}}catch(g){let w=g instanceof Error?g.message:"\u6D4F\u89C8\u5668\u5DE1\u68C0\u5931\u8D25\u3002";return await u({kind:"action",level:"error",title:"\u6D4F\u89C8\u5668\u5DE1\u68C0\u5931\u8D25",detail:w,url:e.appUrl}),{ok:!1,message:w,summary:w,usedMode:l,finalUrl:e.appUrl,screenshotUrl:s,observationsCount:a,issueCount:c,at:new Date().toISOString()}}finally{await n?.close().catch(()=>{}),await r?.close().catch(()=>{}),o&&await ia(o,{recursive:!0,force:!0}).catch(()=>{})}};var qe=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=qe(e);if(!t)throw new Error(`\u7F3A\u5C11\u5FC5\u586B\u53C2\u6570 ${e}\u3002`);return t},la=e=>e==="midscene"?"midscene":"playwright",An=async()=>{let e=x(),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:qe("--cwd")?.trim()||process.cwd(),appUrl:Tt("--app-url"),healthUrl:qe("--health-url")?.trim()||void 0,goal:qe("--goal")?.trim()||void 0,mode:la(qe("--mode")?.trim())});console.log(JSON.stringify(r,null,2)),r.ok||(process.exitCode=1)};import{spawn as Tu}from"node:child_process";var gr=async e=>ye({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 mr=async(e,t)=>ye({url:`${le(t)}/api/control-plane/executors/pair`,method:"POST",body:e,errorMessage:"Pair request failed."});var da=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():"",Mn=async e=>{let t=await da(e);return JSON.parse(t)};var fr=(e,t)=>{if(!e.executorToken)throw new Error("Worker is not paired yet.");let r=`${bn(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 Mn(o.data);try{t.onMessage?.(s)}catch(a){t.onError?.(`\u63A7\u5236\u9762\u6D88\u606F\u5904\u7406\u5931\u8D25\u3002${a instanceof Error?` ${a.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 ua}from"node:fs";import He from"node:path";var Et=e=>{let t={root:e,reposDir:He.join(e,"repos"),worktreesDir:He.join(e,"worktrees"),artifactsDir:He.join(e,"artifacts"),cacheDir:He.join(e,"cache")};for(let r of Object.values(t))ua(r,{recursive:!0});return t},On=(e,t,r)=>He.join(e,"worktrees",r?.trim()||t);import{existsSync as qa,readFileSync as Ha}from"node:fs";import za from"node:http";import br from"node:path";import{closeSync as pa,existsSync as Bn,openSync as ga,readFileSync as hr,readSync as ma,readdirSync as fa,statSync as ha}from"node:fs";import ka from"node:os";import j from"node:path";var At=ka.homedir(),ya=48*1024,wa=2e4,Wn=j.join(At,".claude","projects"),Rt=j.join(At,".local","share","opencode","storage","message"),Ca=j.join(At,".local","share","opencode","storage","part"),_n=j.join(At,".codex","sessions"),xa=()=>({claude:0,opencode:0,codex:0}),$=e=>!!e&&typeof e=="object"&&!Array.isArray(e),Mt=e=>{try{return fa(e,{withFileTypes:!0})}catch{return[]}},ze=e=>{try{return ha(e)}catch{return null}},$n=(e,t=ya)=>{let r=ga(e,"r"),n=Buffer.alloc(t);try{let o=ma(r,n,0,t,0);return n.subarray(0,o).toString("utf8")}finally{pa(r)}},Un=e=>{try{return JSON.parse(hr(e,"utf8"))}catch{return null}},Ot=e=>e.split(`
15
+ `).map(t=>t.trim()).filter(Boolean).flatMap(t=>{try{return[JSON.parse(t)]}catch{return[]}}),Bt=(e,t)=>{if(!Bn(e))return[];let r=[],n=[e];for(;n.length>0;){let o=n.pop();if(o)for(let s of Mt(o)){let a=j.join(o,s.name);if(s.isDirectory()){n.push(a);continue}s.isFile()&&a.endsWith(t)&&r.push(a)}}return r},J=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()}},Dn=(e,t=240)=>{let r=e.replace(/\s+/g," ").trim();return r?r.length<=t?r:`${r.slice(0,t-1)}\u2026`:""},Te=(e,t=wa)=>{let r=e.trim();return r?r.length<=t?r:`${r.slice(0,t)}
16
16
 
17
17
  \u2026\uFF08\u5185\u5BB9\u8FC7\u957F\uFF0C\u5DF2\u6309\u5B89\u5168\u4E0A\u9650\u622A\u65AD\uFF09`:""},kr=e=>typeof e=="string"?e.trim():Array.isArray(e)?e.flatMap(t=>typeof t=="string"?[t]:$(t)?typeof t.text=="string"?[t.text]:typeof t.content=="string"?[t.content]:[]:[]).join(`
18
18
 
19
- `).trim():"",Fe=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:Un(e.title||"\u672A\u547D\u540D\u4F1A\u8BDD",96),cwd:e.cwd||"\u2014"}),wa=()=>Bt(Wn,".jsonl").flatMap(e=>{let t=Je(e);if(!t)return[];let r=Ot($n(e)),n=j.basename(e,".jsonl"),o=r.map(c=>F(c.timestamp)).find(Boolean),s=r.map(c=>typeof c.cwd=="string"?c.cwd:"").find(Boolean)||"",a=r.flatMap(c=>{let l=$(c.message)?c.message:null;if(!l||l.role!=="user")return[];let i=kr(l.content);return!i||Fe(i)?[]:[i]}).find(Boolean)||"Claude Code \u4F1A\u8BDD";return[ze({id:n,source:"claude",title:a,cwd:s,startedAt:o,lastUpdatedAt:t.mtime.toISOString(),entryCount:0})]}),Ca=e=>{let t=$(e.message)?e.message:null;if(!t||e.isMeta===!0)return[];let r=F(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=kr(o);return!s||Fe(s)?[]:[{id:`${String(e.uuid||e.sessionId||r||Math.random())}`,role:n==="user"?"user":"system",text:Te(s),timestamp:r}]}return n!=="assistant"||!Array.isArray(o)?[]:o.flatMap((s,a)=>$(s)?typeof s.text=="string"&&s.type==="text"?[{id:`${String(e.uuid||e.sessionId||r||a)}-${a}`,role:"assistant",text:Te(s.text),timestamp:r}]:s.type==="tool_use"&&typeof s.name=="string"?[{id:`${String(e.uuid||e.sessionId||r||a)}-${a}`,role:"tool",text:Te(`\u8C03\u7528\u5DE5\u5177\uFF1A${s.name}`),timestamp:r}]:[]:[])},xa=e=>{let r=Bt(Wn,".jsonl").filter(i=>j.basename(i,".jsonl")===e)[0];if(!r)return null;let n=Ot(hr(r,"utf8")),o=Je(r),s=n.map(i=>typeof i.cwd=="string"?i.cwd:"").find(Boolean)||"",a=n.flatMap(i=>{let d=$(i.message)?i.message:null;if(!d||d.role!=="user")return[];let u=kr(d.content);return!u||Fe(u)?[]:[u]}).find(Boolean)||"Claude Code \u4F1A\u8BDD",c=n.map(i=>F(i.timestamp)).find(Boolean),l=n.flatMap(Ca);return{...ze({id:e,source:"claude",title:a,cwd:s,startedAt:c,lastUpdatedAt:o?.mtime.toISOString()||new Date().toISOString(),entryCount:l.length}),entries:l}},Sa=()=>Bt(_n,".jsonl").flatMap(e=>{let t=Je(e);if(!t)return[];let r=Ot($n(e)),n=r.find(l=>l.type==="session_meta"),o=$(n?.payload)?n.payload:null,s=typeof o?.cwd=="string"?o.cwd:"",a=F(o?.timestamp)||r.map(l=>F(l.timestamp)).find(Boolean),c=r.flatMap(l=>Nn(l,!0)).map(l=>l.text).find(l=>!Fe(l))||"Codex \u4F1A\u8BDD";return[ze({id:j.basename(e,".jsonl"),source:"codex",title:c,cwd:s,startedAt:a,lastUpdatedAt:t.mtime.toISOString(),entryCount:0})]}),Nn=(e,t=!1)=>{if(e.type!=="response_item")return[];let r=$(e.payload)?e.payload:null;if(!r)return[];let n=F(e.timestamp);if(r.type==="message"){let a=r.role;if(a!=="user"&&a!=="assistant")return[];let c=Array.isArray(r.content)?r.content.flatMap(l=>$(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(`
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>"),Fe=e=>({...e,title:Dn(e.title||"\u672A\u547D\u540D\u4F1A\u8BDD",96),cwd:e.cwd||"\u2014"}),Sa=()=>Bt(Wn,".jsonl").flatMap(e=>{let t=ze(e);if(!t)return[];let r=Ot($n(e)),n=j.basename(e,".jsonl"),o=r.map(c=>J(c.timestamp)).find(Boolean),s=r.map(c=>typeof c.cwd=="string"?c.cwd:"").find(Boolean)||"",a=r.flatMap(c=>{let l=$(c.message)?c.message:null;if(!l||l.role!=="user")return[];let i=kr(l.content);return!i||Je(i)?[]:[i]}).find(Boolean)||"Claude Code \u4F1A\u8BDD";return[Fe({id:n,source:"claude",title:a,cwd:s,startedAt:o,lastUpdatedAt:t.mtime.toISOString(),entryCount:0})]}),ba=e=>{let t=$(e.message)?e.message:null;if(!t||e.isMeta===!0)return[];let r=J(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=kr(o);return!s||Je(s)?[]:[{id:`${String(e.uuid||e.sessionId||r||Math.random())}`,role:n==="user"?"user":"system",text:Te(s),timestamp:r}]}return n!=="assistant"||!Array.isArray(o)?[]:o.flatMap((s,a)=>$(s)?typeof s.text=="string"&&s.type==="text"?[{id:`${String(e.uuid||e.sessionId||r||a)}-${a}`,role:"assistant",text:Te(s.text),timestamp:r}]:s.type==="tool_use"&&typeof s.name=="string"?[{id:`${String(e.uuid||e.sessionId||r||a)}-${a}`,role:"tool",text:Te(`\u8C03\u7528\u5DE5\u5177\uFF1A${s.name}`),timestamp:r}]:[]:[])},va=e=>{let r=Bt(Wn,".jsonl").filter(i=>j.basename(i,".jsonl")===e)[0];if(!r)return null;let n=Ot(hr(r,"utf8")),o=ze(r),s=n.map(i=>typeof i.cwd=="string"?i.cwd:"").find(Boolean)||"",a=n.flatMap(i=>{let d=$(i.message)?i.message:null;if(!d||d.role!=="user")return[];let u=kr(d.content);return!u||Je(u)?[]:[u]}).find(Boolean)||"Claude Code \u4F1A\u8BDD",c=n.map(i=>J(i.timestamp)).find(Boolean),l=n.flatMap(ba);return{...Fe({id:e,source:"claude",title:a,cwd:s,startedAt:c,lastUpdatedAt:o?.mtime.toISOString()||new Date().toISOString(),entryCount:l.length}),entries:l}},Pa=()=>Bt(_n,".jsonl").flatMap(e=>{let t=ze(e);if(!t)return[];let r=Ot($n(e)),n=r.find(l=>l.type==="session_meta"),o=$(n?.payload)?n.payload:null,s=typeof o?.cwd=="string"?o.cwd:"",a=J(o?.timestamp)||r.map(l=>J(l.timestamp)).find(Boolean),c=r.flatMap(l=>Nn(l,!0)).map(l=>l.text).find(l=>!Je(l))||"Codex \u4F1A\u8BDD";return[Fe({id:j.basename(e,".jsonl"),source:"codex",title:c,cwd:s,startedAt:a,lastUpdatedAt:t.mtime.toISOString(),entryCount:0})]}),Nn=(e,t=!1)=>{if(e.type!=="response_item")return[];let r=$(e.payload)?e.payload:null;if(!r)return[];let n=J(e.timestamp);if(r.type==="message"){let a=r.role;if(a!=="user"&&a!=="assistant")return[];let c=Array.isArray(r.content)?r.content.flatMap(l=>$(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
20
 
21
- `).trim():"";return c?t&&a!=="user"?[]:[{id:`${String(e.timestamp||Math.random())}-${a}`,role:a,text:Te(c),timestamp:n}]:[]}if(t||r.type!=="function_call")return[];let o=typeof r.name=="string"?r.name:"tool",s=Un(typeof r.arguments=="string"?r.arguments:"");return[{id:`${String(e.timestamp||Math.random())}-tool`,role:"tool",text:Te(s?`\u8C03\u7528 ${o}
22
- ${s}`:`\u8C03\u7528 ${o}`),timestamp:n}]},ba=e=>{let r=Bt(_n,".jsonl").filter(u=>j.basename(u,".jsonl")===e)[0];if(!r)return null;let n=Ot(hr(r,"utf8")),o=Je(r),s=n.find(u=>u.type==="session_meta"),a=$(s?.payload)?s.payload:null,c=typeof a?.cwd=="string"?a.cwd:"",l=F(a?.timestamp)||n.map(u=>F(u.timestamp)).find(Boolean),i=n.flatMap(u=>Nn(u)),d=i.find(u=>u.role==="user"&&!Fe(u.text))?.text||"Codex \u4F1A\u8BDD";return{...ze({id:e,source:"codex",title:d,cwd:c,startedAt:l,lastUpdatedAt:o?.mtime.toISOString()||new Date().toISOString(),entryCount:i.length}),entries:i}},va=e=>{let t=j.join(ka,e);return Mt(t).filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>Dn(j.join(t,r.name))).filter(r=>!!r).sort((r,n)=>{let o=$(r.time)&&typeof r.time.start=="number"?r.time.start:0,s=$(n.time)&&typeof n.time.start=="number"?n.time.start:0;return o-s})},Ln=e=>{let t=va(String(e.id)).flatMap(n=>n.type==="text"&&typeof n.text=="string"?[n.text.trim()]:[]).filter(Boolean).join(`
21
+ `).trim():"";return c?t&&a!=="user"?[]:[{id:`${String(e.timestamp||Math.random())}-${a}`,role:a,text:Te(c),timestamp:n}]:[]}if(t||r.type!=="function_call")return[];let o=typeof r.name=="string"?r.name:"tool",s=Dn(typeof r.arguments=="string"?r.arguments:"");return[{id:`${String(e.timestamp||Math.random())}-tool`,role:"tool",text:Te(s?`\u8C03\u7528 ${o}
22
+ ${s}`:`\u8C03\u7528 ${o}`),timestamp:n}]},Ia=e=>{let r=Bt(_n,".jsonl").filter(u=>j.basename(u,".jsonl")===e)[0];if(!r)return null;let n=Ot(hr(r,"utf8")),o=ze(r),s=n.find(u=>u.type==="session_meta"),a=$(s?.payload)?s.payload:null,c=typeof a?.cwd=="string"?a.cwd:"",l=J(a?.timestamp)||n.map(u=>J(u.timestamp)).find(Boolean),i=n.flatMap(u=>Nn(u)),d=i.find(u=>u.role==="user"&&!Je(u.text))?.text||"Codex \u4F1A\u8BDD";return{...Fe({id:e,source:"codex",title:d,cwd:c,startedAt:l,lastUpdatedAt:o?.mtime.toISOString()||new Date().toISOString(),entryCount:i.length}),entries:i}},Ta=e=>{let t=j.join(Ca,e);return Mt(t).filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>Un(j.join(t,r.name))).filter(r=>!!r).sort((r,n)=>{let o=$(r.time)&&typeof r.time.start=="number"?r.time.start:0,s=$(n.time)&&typeof n.time.start=="number"?n.time.start:0;return o-s})},Ln=e=>{let t=Ta(String(e.id)).flatMap(n=>n.type==="text"&&typeof n.text=="string"?[n.text.trim()]:[]).filter(Boolean).join(`
23
23
 
24
- `);if(t)return t;let r=$(e.summary)?e.summary:null;return typeof r?.title=="string"?r.title.replace(/^Title:\s*/i,"").trim():""},jn=e=>{let t=j.join(Rt,e);return Mt(t).filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>Dn(j.join(t,r.name))).filter(r=>!!r).sort((r,n)=>{let o=$(r.time)&&typeof r.time.created=="number"?r.time.created:0,s=$(n.time)&&typeof n.time.created=="number"?n.time.created:0;return o-s})},Gn=e=>{let t=j.join(Rt,e),r=Je(t),n=jn(e);if(n.length===0)return null;let o=n.flatMap(l=>{let i=$(l.path)?l.path:null;return typeof i?.cwd=="string"?[i.cwd]:[]}).find(Boolean)||"",s=n.map(l=>F($(l.time)?l.time.created:void 0)).find(Boolean),a=n.map(l=>{let i=$(l.time)?l.time:null;return F(i?.completed)||F(i?.created)}).filter(Boolean).pop()||r?.mtime.toISOString()||new Date().toISOString(),c=n.filter(l=>l.role==="user").map(Ln).find(Boolean)||"OpenCode \u4F1A\u8BDD";return ze({id:e,source:"opencode",title:c,cwd:o,startedAt:s,lastUpdatedAt:a,entryCount:n.length})},Ia=()=>Bn(Rt)?Mt(Rt).filter(e=>e.isDirectory()).flatMap(e=>{let t=Gn(e.name);return t?[t]:[]}):[],Pa=e=>{let t=Gn(e);if(!t)return null;let r=jn(e).flatMap(n=>{let o=n.role;if(o!=="user"&&o!=="assistant")return[];let s=Ln(n);if(!s)return[];let a=$(n.time)?n.time:null;return[{id:String(n.id),role:o,text:Te(s),timestamp:F(a?.created)}]});return{...t,entryCount:r.length,entries:r}},qn=()=>{let e=[...wa(),...Ia(),...Sa()].sort((r,n)=>n.lastUpdatedAt.localeCompare(r.lastUpdatedAt)),t=e.reduce((r,n)=>(r[n.source]+=1,r),ya());return{sessions:e,counts:t}},Hn=(e,t)=>e==="claude"?xa(t):e==="opencode"?Pa(t):ba(t);import{existsSync as Jn,mkdirSync as Fn,readdirSync as Ta,renameSync as yr,rmSync as wr,writeFileSync as Ea}from"node:fs";import Ra from"node:os";import we from"node:path";import{spawn as xr,spawnSync as Aa}from"node:child_process";var Ma=e=>new Promise(t=>setTimeout(t,e)),Cr=!1,Oa=()=>Jn(pt())&&Jn(_e()),Ba=()=>{let e=me().name?.trim()||"";return e==="vibemux-worker"||e==="vibemux-worker-preview"},Wa=()=>process.platform==="win32"?"npx.cmd":"npx",_a=(e,t)=>{xr(Wa(),["-y",`${e}@${t}`,"daemon"],{detached:!0,stdio:"ignore",env:{...process.env}}).unref()},$a=async e=>{for(let t=0;t<120;t+=1)try{process.kill(e,0),await Ma(500)}catch{return}throw new Error(`\u7B49\u5F85\u65E7 Worker \u9000\u51FA\u8D85\u65F6: ${e}`)},Da=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=we.join(Ra.tmpdir(),"vibemux-worker-updates");Fn(n,{recursive:!0});let o=we.join(n,`worker-${Date.now()}.tar.gz`);return Ea(o,r),o},Ua=(e,t)=>{let r=Aa("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")},Na=e=>{xr(we.join(e,"bin","vibemux-worker"),["daemon"],{detached:!0,stdio:"ignore"}).unref()},Ve=async e=>{let t=e??await ve();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"}:Ba()?(_a(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(!Oa())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 Da(t.asset.url);return xr(process.execPath,[_e(),"apply-update-internal",r,K(),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`}},Sr=async e=>{let t=process.env.VIBEMUX_WORKER_AUTO_UPDATE?.trim().toLowerCase();if(t==="0"||t==="false"||t==="off"||Cr)return!1;Cr=!0;try{let r=await Ve(e);return r.applied?(console.log(`[worker] ${r.message}`),setTimeout(()=>process.exit(0),250),!0):!1}finally{Cr=!1}},zn=async(e,t,r)=>{await $a(r);let n=we.dirname(t),o=we.join(n,`.vibemux-worker-stage-${Date.now()}`),s=we.join(n,`.vibemux-worker-backup-${Date.now()}`);Fn(o,{recursive:!0}),Ua(e,o);let[a]=Ta(o);if(!a)throw new Error("\u66F4\u65B0\u5305\u5185\u5BB9\u4E3A\u7A7A");let c=we.join(o,a);yr(t,s);try{yr(c,t)}catch(l){throw yr(s,t),l}Na(t),wr(s,{recursive:!0,force:!0}),wr(o,{recursive:!0,force:!0}),wr(e,{force:!0})};var qa=e=>new URL(e.url||"/","http://127.0.0.1"),Vn=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"))},_=(e,t,r)=>{e.statusCode=t,e.setHeader("Content-Type","application/json; charset=utf-8"),e.end(`${JSON.stringify(r)}
25
- `)},Ha=(e,t)=>{let r=br.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(ja(t))},Ja=e=>{let t=Qr(),r=e==="/"?br.join(t,"index.html"):br.join(t,e.replace(/^\//,""));return r.startsWith(t)?r:null},Fa=(e,t)=>{let r=Ja(e);if(!r||!La(r)){_(t,404,{message:"not found"});return}Ha(t,r)},za=()=>{let e=Ge(),t=x();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}},Va=e=>e==="claude"||e==="opencode"||e==="codex"?e:null,Ka=()=>{let e=x(),t=e.mcpServers??[],r=!!e.executorToken?.trim(),n=t.map(l=>{let i=$e([l],{cloudUrl:e.cloudUrl,executorToken:e.executorToken,actingUserId:l.target===fe&&r?"__dynamic__":void 0}),d=Object.keys(i)[0],u=d?i[d]:null,p=l.target===fe;return{id:l.id,name:l.name,target:l.target,transport:l.transport,capabilityMode:l.capabilityMode,enabled:l.enabled,materialized:!!u,kind:p?"builtin":l.transport==="stdio"||l.target.startsWith("stdio://")?"stdio":l.transport==="http"||l.transport==="sse"?"remote":"custom",endpoint:typeof u?.url=="string"?u.url:void 0,command:typeof u?.command=="string"?u.command:void 0,headerKeys:u&&typeof u=="object"&&u.headers&&typeof u.headers=="object"?Object.keys(u.headers):[],actingUserScoped:p&&r}}),o=n.filter(l=>l.enabled),a=!!n.find(l=>l.target===fe)?.enabled,c=a&&r;return{configuredCount:n.length,enabledCount:o.length,materializedCount:o.filter(l=>l.materialized).length,builtinEnabled:a,builtinReady:c,actingUserMode:a?c?"request-scoped":"pairing-required":"disabled",servers:n}},Xa=(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"}`,Ir=()=>{let e=x(),t=Ga.createServer(async(r,n)=>{try{let o=qa(r);if(r.method==="GET"&&(o.pathname==="/"||o.pathname.startsWith("/assets/"))){Fa(o.pathname,n);return}if(r.method==="GET"&&(o.pathname==="/health"||o.pathname==="/api/health")){_(n,200,za());return}if(r.method==="GET"&&o.pathname==="/api/config"){_(n,200,{config:x()});return}if(r.method==="GET"&&o.pathname==="/api/status"){_(n,200,{runtime:Pe(),mcp:Ka()});return}if(r.method==="GET"&&o.pathname==="/api/doctor"){_(n,200,await Wt());return}if(r.method==="GET"&&o.pathname==="/api/agent-sessions"){_(n,200,qn());return}if(r.method==="GET"&&o.pathname==="/api/agent-sessions/detail"){let s=Va(o.searchParams.get("source")),a=o.searchParams.get("id")?.trim();if(!s||!a){_(n,400,{message:"source and id are required"});return}let c=Hn(s,a);if(!c){_(n,404,{message:"session not found"});return}_(n,200,{session:c});return}if(r.method==="GET"&&o.pathname==="/api/update"){_(n,200,await ve());return}if(r.method==="POST"&&o.pathname==="/api/bootstrap-runtime"){let s=await se({autoInstall:!0,target:"all"});_(n,200,{report:s,doctor:await Wt()});return}if(r.method==="PUT"&&o.pathname==="/api/config"){let s=await Vn(r),a={...x(),...s};Ie(a),A({config:a,paired:!!(a.executorId&&a.executorToken),executorId:a.executorId}),_(n,200,{config:a,message:"saved"});return}if(r.method==="POST"&&o.pathname==="/api/pair"){let s=await Vn(r),a=x(),c=await mr({pairingCode:s.pairingCode,machineId:a.machineId,machineName:a.machineName,name:s.name?.trim()||`worker-${process.pid}`,workspaceRoot:a.workspaceRoot,maxConcurrency:a.maxConcurrency,labels:a.labels,capabilities:a.capabilities,platform:process.platform,version:Y()},a.cloudUrl),l={...a,executorName:s.name?.trim()||`worker-${process.pid}`,executorId:c.executorId,executorToken:c.executorToken};Ie(l),A({paired:!0,executorId:c.executorId,config:l,daemonMode:"starting"}),vr(),_(n,200,{config:l,executor:c.executor,message:"Pairing complete. Connecting to the control plane."});return}if(r.method==="POST"&&o.pathname==="/api/reset"){wt(),A({daemonMode:"idle",paired:!1,connected:!1,executorId:void 0,config:x(),runningTaskIds:[],queuedTaskIds:[],lastError:void 0}),_(n,200,{config:x(),message:"reset"});return}if(r.method==="POST"&&o.pathname==="/api/disconnect"){Kn(),_(n,200,{runtime:Pe(),message:"Disconnected from the control plane."});return}if(r.method==="POST"&&o.pathname==="/api/connect"){vr(),_(n,200,{runtime:Pe(),message:"Control plane connection requested."});return}if(r.method==="POST"&&o.pathname==="/api/update"){let s=await Ve();_(n,s.applied?202:200,s),s.applied&&setTimeout(()=>process.exit(0),250);return}_(n,404,{message:"not found"})}catch(o){_(n,500,{message:o instanceof Error?o.message:"worker local server error"})}});return t.once("error",r=>{let n=Xa(r,e.localServerPort);A({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 Ya,constants as Qa,mkdirSync as Za}from"node:fs";var ec=e=>{try{return Za(e,{recursive:!0}),Ya(e,Qa.W_OK),{ok:!0,detail:`\u53EF\u5199: ${e}`}}catch(t){return{ok:!1,detail:t instanceof Error?t.message:"path access failed"}}},tc=e=>{try{return{ok:!0,detail:`\u5DF2\u5C31\u7EEA: ${Et(e).root}`}}catch(t){return{ok:!1,detail:t instanceof Error?t.message:"workspace setup failed"}}},rc=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"}}},nc=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"}}},oc=e=>{let t=e.filter(n=>n.ok).length,r=e.length-t;return{total:e.length,passed:t,failed:r,ok:r===0}},Xn=async()=>{let e=x(),[t,r,n]=await Promise.all([rc(e.cloudUrl),nc(),se({target:"all"})]),o=ec(he()),s=tc(e.workspaceRoot),a=n.items.find(m=>m.id==="git")??{ok:!1,detail:"git \u72B6\u6001\u672A\u77E5"},c=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"},i=n.items.find(m=>m.id==="codex-auth")??{ok:!1,detail:"Codex \u767B\u5F55\u72B6\u6001\u672A\u77E5"},d=n.items.find(m=>m.id==="claude-cli")??{ok:!1,detail:"Claude Code CLI \u72B6\u6001\u672A\u77E5"},u=n.items.find(m=>m.id==="claude-auth")??{ok:!1,detail:"Claude Code \u8BA4\u8BC1\u72B6\u6001\u672A\u77E5"},p=!!e.opencodeConfigContent?.trim(),g=!!e.codexConfigContent?.trim(),w=!!e.claudeCodeConfigContent?.trim(),k=[{id:"git",category:"tooling",label:"Git",ok:a.ok,detail:a.detail,hint:a.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:c.ok,detail:c.detail,hint:c.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:i.ok,detail:i.detail,hint:i.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:d.ok,detail:d.detail,hint:d.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:u.ok,detail:u.detail,hint:u.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:p,detail:p?"\u5DF2\u52A0\u8F7D OpenCode providers \u914D\u7F6E\u3002":"\u672A\u68C0\u6D4B\u5230 OpenCode providers \u914D\u7F6E\u3002",hint:p?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:g,detail:g?"\u5DF2\u52A0\u8F7D Codex config.toml\u3002":"\u672A\u68C0\u6D4B\u5230 Codex config.toml\u3002",hint:g?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:w,detail:w?"\u5DF2\u52A0\u8F7D Claude Code settings.json\u3002":"\u672A\u68C0\u6D4B\u5230 Claude Code settings.json\u3002",hint:w?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:pr(e),checks:{git:a.ok,opencodeAvailable:c.ok,codexCliAvailable:l.ok,codexAuthenticated:i.ok,claudeCliAvailable:d.ok,claudeAuthenticated:u.ok,opencodeConfigLoaded:p,codexConfigLoaded:g,claudeConfigLoaded:w,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:oc(k),cloudProbe:t,officialSiteProbe:r,runtime:Pe()}},Pr=async()=>{console.log(JSON.stringify(await Xn(),null,2))},Wt=()=>Xn();import{existsSync as ic,statfsSync as sc}from"node:fs";import X from"node:os";import Yn from"node:path";var Qn=null,Zn=(e,t=1)=>{let r=10**t;return Math.round(e*r)/r},ac=()=>X.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}),cc=()=>{let e=X.cpus(),t=ac(),r=Qn;Qn=t;let n=e.reduce((s,a)=>s+(Number.isFinite(a.speed)?a.speed:0),0),o=(()=>{if(!r)return;let s=t.total-r.total,a=t.idle-r.idle;if(!(s<=0))return Zn((1-a/s)*100,1)})();return{coreCount:e.length,model:e[0]?.model,averageSpeedMhz:e.length>0?Math.round(n/e.length):void 0,loadAverage:X.loadavg().map(s=>Zn(s,2)),usagePercent:o}},lc=()=>{let e=X.totalmem(),t=X.freemem();return{totalBytes:e,freeBytes:t,usedBytes:Math.max(0,e-t)}},dc=e=>{let t=Yn.resolve(e||process.cwd());for(;!ic(t);){let r=Yn.dirname(t);if(r===t)return process.cwd();t=r}return t},uc=e=>{try{let t=dc(e),r=sc(t),n=Number(r.bsize),o=Number(r.blocks),s=Number(r.bfree),a=Number(r.bavail);if(!Number.isFinite(n)||!Number.isFinite(o)||n<=0||o<=0)return;let c=o*n,l=Math.max(0,s*n),i=Math.max(0,a*n);return{path:t,totalBytes:c,freeBytes:l,availableBytes:i,usedBytes:Math.max(0,c-l)}}catch{return}},pc=e=>({platform:process.platform,arch:X.arch(),hostname:X.hostname(),release:X.release(),version:typeof X.version=="function"?X.version():void 0,nodeVersion:process.version,workerVersion:e,systemUptimeSec:Math.max(0,Math.round(X.uptime())),processUptimeSec:Math.max(0,Math.round(process.uptime()))}),_t=e=>({capturedAt:new Date().toISOString(),cpu:cc(),memory:lc(),disk:uc(e.workspaceRoot),system:pc(e.workerVersion)});import gc from"node:net";import{existsSync as mc}from"node:fs";import{createOpencode as fc,createOpencodeClient as to}from"@opencode-ai/sdk";var Tr=new Map,hc=async()=>new Promise((e,t)=>{let r=gc.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)})})}),G=(e,t)=>{console.log(`[worker-opencode] ${e}`,JSON.stringify(t))},de=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"},kc=e=>{if(!e)return;let[t,...r]=e.split("/"),n=r.join("/");if(!(!t||!n))return{providerID:t,modelID:n}},yc=(e,t,r)=>({id:`${e}/${t}`,label:`${e}/${t}`,providerId:e,modelId:t,isDefault:r===`${e}/${t}`}),wc=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),Cc=(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,a])=>({id:a.id||a.name||s,models:a.models})),...Object.entries(r.provider??{}).map(([s,a])=>({id:a.id||a.name||s,models:a.models}))]).filter(s=>{let a=s.id?.toLowerCase()??"";return!n.some(c=>a.includes(c.toLowerCase()))}).flatMap(s=>{let a=s.id;return a?wc(s.models).map(c=>yc(a,c,t)):[]}).sort((s,a)=>s.isDefault?-1:a.isDefault?1:s.label.localeCompare(a.label))},xc=async e=>{let t=await hc();return(await fc({port:t,timeout:15e3,config:ne(e)})).server},ro=async e=>{let t=e?.trim()||"{}",r=Tr.get(t);if(r)return r;let n=xc(e).catch(o=>{throw Tr.delete(t),o});return Tr.set(t,n),n},Sc=async(e,t)=>{let r=await ro(t);return to({baseUrl:r.url,directory:e})},bc=async e=>{let t=await ro(e);return to({baseUrl:t.url})},vc=async(e,t,r)=>{G("session:create:start",{cwd:t,title:r});let n;try{n=await e.session.create({body:{title:r},query:{directory:t}})}catch(o){throw G("session:create:error",{cwd:t,title:r,error:de(o)}),o}if(G("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=de(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},no=async()=>{let e=x(),t=Le(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 bc(t)).config.providers(),s="data"in o?o.data:o,a=Object.entries(s?.default??{}).find(([,l])=>!!l),c=a?`${a[0]}/${a[1]}`:r;return{models:Cc(s,c),defaultModel:c,message:void 0}}catch(n){return G("models:error",{error:de(n)}),{models:[],defaultModel:r,message:de(n)}}},Ke=e=>Array.isArray(e)?e:[],Ic=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:Ke(t.parts).map(r=>r.type),textPreview:$t(Ke(t.parts)).slice(0,160)})),Pc=async(e,t,r)=>{try{let n=await e.session.messages({path:{id:r},query:{directory:t,limit:20}});return Ic(Array.isArray(n.data)?n.data:[])}catch(n){return[{snapshotError:de(n)}]}},Tc=(e,t)=>{let r=t?e.find(s=>s.info?.id===t):void 0,n=$t(Ke(r?.parts));if(n)return n;let o=[...e].filter(s=>s.info?.role==="assistant").sort((s,a)=>(a.info?.time?.created??0)-(s.info?.time?.created??0)).find(s=>$t(Ke(s.parts)));return o?$t(Ke(o.parts)):""},eo=e=>!!e?.info?.time?.completed||!!e?.info?.error,$t=e=>e.filter(t=>t.type==="text").map(t=>t.text?.trim()??"").filter(Boolean).join(`
24
+ `);if(t)return t;let r=$(e.summary)?e.summary:null;return typeof r?.title=="string"?r.title.replace(/^Title:\s*/i,"").trim():""},jn=e=>{let t=j.join(Rt,e);return Mt(t).filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>Un(j.join(t,r.name))).filter(r=>!!r).sort((r,n)=>{let o=$(r.time)&&typeof r.time.created=="number"?r.time.created:0,s=$(n.time)&&typeof n.time.created=="number"?n.time.created:0;return o-s})},Gn=e=>{let t=j.join(Rt,e),r=ze(t),n=jn(e);if(n.length===0)return null;let o=n.flatMap(l=>{let i=$(l.path)?l.path:null;return typeof i?.cwd=="string"?[i.cwd]:[]}).find(Boolean)||"",s=n.map(l=>J($(l.time)?l.time.created:void 0)).find(Boolean),a=n.map(l=>{let i=$(l.time)?l.time:null;return J(i?.completed)||J(i?.created)}).filter(Boolean).pop()||r?.mtime.toISOString()||new Date().toISOString(),c=n.filter(l=>l.role==="user").map(Ln).find(Boolean)||"OpenCode \u4F1A\u8BDD";return Fe({id:e,source:"opencode",title:c,cwd:o,startedAt:s,lastUpdatedAt:a,entryCount:n.length})},Ea=()=>Bn(Rt)?Mt(Rt).filter(e=>e.isDirectory()).flatMap(e=>{let t=Gn(e.name);return t?[t]:[]}):[],Ra=e=>{let t=Gn(e);if(!t)return null;let r=jn(e).flatMap(n=>{let o=n.role;if(o!=="user"&&o!=="assistant")return[];let s=Ln(n);if(!s)return[];let a=$(n.time)?n.time:null;return[{id:String(n.id),role:o,text:Te(s),timestamp:J(a?.created)}]});return{...t,entryCount:r.length,entries:r}},qn=()=>{let e=[...Sa(),...Ea(),...Pa()].sort((r,n)=>n.lastUpdatedAt.localeCompare(r.lastUpdatedAt)),t=e.reduce((r,n)=>(r[n.source]+=1,r),xa());return{sessions:e,counts:t}},Hn=(e,t)=>e==="claude"?va(t):e==="opencode"?Ra(t):Ia(t);import{existsSync as zn,mkdirSync as Jn,readdirSync as Aa,renameSync as yr,rmSync as wr,writeFileSync as Ma}from"node:fs";import Oa from"node:os";import we from"node:path";import{spawn as xr,spawnSync as Ba}from"node:child_process";var Wa=e=>new Promise(t=>setTimeout(t,e)),Cr=!1,_a=()=>zn(pt())&&zn(_e()),$a=()=>{let e=me().name?.trim()||"";return e==="vibemux-worker"||e==="vibemux-worker-preview"},Ua=()=>process.platform==="win32"?"npx.cmd":"npx",Da=(e,t)=>{xr(Ua(),["-y",`${e}@${t}`,"daemon"],{detached:!0,stdio:"ignore",env:{...process.env}}).unref()},Na=async e=>{for(let t=0;t<120;t+=1)try{process.kill(e,0),await Wa(500)}catch{return}throw new Error(`\u7B49\u5F85\u65E7 Worker \u9000\u51FA\u8D85\u65F6: ${e}`)},La=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=we.join(Oa.tmpdir(),"vibemux-worker-updates");Jn(n,{recursive:!0});let o=we.join(n,`worker-${Date.now()}.tar.gz`);return Ma(o,r),o},ja=(e,t)=>{let r=Ba("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")},Ga=e=>{xr(we.join(e,"bin","vibemux-worker"),["daemon"],{detached:!0,stdio:"ignore"}).unref()},Ve=async e=>{let t=e??await ve();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"}:$a()?(Da(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(!_a())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 La(t.asset.url);return xr(process.execPath,[_e(),"apply-update-internal",r,K(),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`}},Sr=async e=>{let t=process.env.VIBEMUX_WORKER_AUTO_UPDATE?.trim().toLowerCase();if(t==="0"||t==="false"||t==="off"||Cr)return!1;Cr=!0;try{let r=await Ve(e);return r.applied?(console.log(`[worker] ${r.message}`),setTimeout(()=>process.exit(0),250),!0):!1}finally{Cr=!1}},Fn=async(e,t,r)=>{await Na(r);let n=we.dirname(t),o=we.join(n,`.vibemux-worker-stage-${Date.now()}`),s=we.join(n,`.vibemux-worker-backup-${Date.now()}`);Jn(o,{recursive:!0}),ja(e,o);let[a]=Aa(o);if(!a)throw new Error("\u66F4\u65B0\u5305\u5185\u5BB9\u4E3A\u7A7A");let c=we.join(o,a);yr(t,s);try{yr(c,t)}catch(l){throw yr(s,t),l}Ga(t),wr(s,{recursive:!0,force:!0}),wr(o,{recursive:!0,force:!0}),wr(e,{force:!0})};var Ja=e=>new URL(e.url||"/","http://127.0.0.1"),Vn=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"))},_=(e,t,r)=>{e.statusCode=t,e.setHeader("Content-Type","application/json; charset=utf-8"),e.end(`${JSON.stringify(r)}
25
+ `)},Fa=(e,t)=>{let r=br.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(Ha(t))},Va=e=>{let t=Qr(),r=e==="/"?br.join(t,"index.html"):br.join(t,e.replace(/^\//,""));return r.startsWith(t)?r:null},Ka=(e,t)=>{let r=Va(e);if(!r||!qa(r)){_(t,404,{message:"not found"});return}Fa(t,r)},Xa=()=>{let e=Ge(),t=x();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}},Ya=e=>e==="claude"||e==="opencode"||e==="codex"?e:null,Qa=()=>{let e=x(),t=e.mcpServers??[],r=!!e.executorToken?.trim(),n=t.map(l=>{let i=$e([l],{cloudUrl:e.cloudUrl,executorToken:e.executorToken,actingUserId:l.target===fe&&r?"__dynamic__":void 0}),d=Object.keys(i)[0],u=d?i[d]:null,p=l.target===fe;return{id:l.id,name:l.name,target:l.target,transport:l.transport,capabilityMode:l.capabilityMode,enabled:l.enabled,materialized:!!u,kind:p?"builtin":l.transport==="stdio"||l.target.startsWith("stdio://")?"stdio":l.transport==="http"||l.transport==="sse"?"remote":"custom",endpoint:typeof u?.url=="string"?u.url:void 0,command:typeof u?.command=="string"?u.command:void 0,headerKeys:u&&typeof u=="object"&&u.headers&&typeof u.headers=="object"?Object.keys(u.headers):[],actingUserScoped:p&&r}}),o=n.filter(l=>l.enabled),a=!!n.find(l=>l.target===fe)?.enabled,c=a&&r;return{configuredCount:n.length,enabledCount:o.length,materializedCount:o.filter(l=>l.materialized).length,builtinEnabled:a,builtinReady:c,actingUserMode:a?c?"request-scoped":"pairing-required":"disabled",servers:n}},Za=(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"}`,Pr=()=>{let e=x(),t=za.createServer(async(r,n)=>{try{let o=Ja(r);if(r.method==="GET"&&(o.pathname==="/"||o.pathname.startsWith("/assets/"))){Ka(o.pathname,n);return}if(r.method==="GET"&&(o.pathname==="/health"||o.pathname==="/api/health")){_(n,200,Xa());return}if(r.method==="GET"&&o.pathname==="/api/config"){_(n,200,{config:x()});return}if(r.method==="GET"&&o.pathname==="/api/status"){_(n,200,{runtime:Ie(),mcp:Qa()});return}if(r.method==="GET"&&o.pathname==="/api/doctor"){_(n,200,await Wt());return}if(r.method==="GET"&&o.pathname==="/api/agent-sessions"){_(n,200,qn());return}if(r.method==="GET"&&o.pathname==="/api/agent-sessions/detail"){let s=Ya(o.searchParams.get("source")),a=o.searchParams.get("id")?.trim();if(!s||!a){_(n,400,{message:"source and id are required"});return}let c=Hn(s,a);if(!c){_(n,404,{message:"session not found"});return}_(n,200,{session:c});return}if(r.method==="GET"&&o.pathname==="/api/update"){_(n,200,await ve());return}if(r.method==="POST"&&o.pathname==="/api/bootstrap-runtime"){let s=await se({autoInstall:!0,target:"all"});_(n,200,{report:s,doctor:await Wt()});return}if(r.method==="PUT"&&o.pathname==="/api/config"){let s=await Vn(r),a={...x(),...s};Pe(a),A({config:a,paired:!!(a.executorId&&a.executorToken),executorId:a.executorId}),_(n,200,{config:a,message:"saved"});return}if(r.method==="POST"&&o.pathname==="/api/pair"){let s=await Vn(r),a=x(),c=await mr({pairingCode:s.pairingCode,machineId:a.machineId,machineName:a.machineName,name:s.name?.trim()||`worker-${process.pid}`,workspaceRoot:a.workspaceRoot,maxConcurrency:a.maxConcurrency,labels:a.labels,capabilities:a.capabilities,platform:process.platform,version:Y()},a.cloudUrl),l={...a,executorName:s.name?.trim()||`worker-${process.pid}`,executorId:c.executorId,executorToken:c.executorToken};Pe(l),A({paired:!0,executorId:c.executorId,config:l,daemonMode:"starting"}),vr(),_(n,200,{config:l,executor:c.executor,message:"Pairing complete. Connecting to the control plane."});return}if(r.method==="POST"&&o.pathname==="/api/reset"){wt(),A({daemonMode:"idle",paired:!1,connected:!1,executorId:void 0,config:x(),runningTaskIds:[],queuedTaskIds:[],lastError:void 0}),_(n,200,{config:x(),message:"reset"});return}if(r.method==="POST"&&o.pathname==="/api/disconnect"){Kn(),_(n,200,{runtime:Ie(),message:"Disconnected from the control plane."});return}if(r.method==="POST"&&o.pathname==="/api/connect"){vr(),_(n,200,{runtime:Ie(),message:"Control plane connection requested."});return}if(r.method==="POST"&&o.pathname==="/api/update"){let s=await Ve();_(n,s.applied?202:200,s),s.applied&&setTimeout(()=>process.exit(0),250);return}_(n,404,{message:"not found"})}catch(o){_(n,500,{message:o instanceof Error?o.message:"worker local server error"})}});return t.once("error",r=>{let n=Za(r,e.localServerPort);A({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 ec,constants as tc,mkdirSync as rc}from"node:fs";var nc=e=>{try{return rc(e,{recursive:!0}),ec(e,tc.W_OK),{ok:!0,detail:`\u53EF\u5199: ${e}`}}catch(t){return{ok:!1,detail:t instanceof Error?t.message:"path access failed"}}},oc=e=>{try{return{ok:!0,detail:`\u5DF2\u5C31\u7EEA: ${Et(e).root}`}}catch(t){return{ok:!1,detail:t instanceof Error?t.message:"workspace setup failed"}}},ic=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"}}},sc=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"}}},ac=e=>{let t=e.filter(n=>n.ok).length,r=e.length-t;return{total:e.length,passed:t,failed:r,ok:r===0}},Xn=async()=>{let e=x(),[t,r,n]=await Promise.all([ic(e.cloudUrl),sc(),se({target:"all"})]),o=nc(he()),s=oc(e.workspaceRoot),a=n.items.find(m=>m.id==="git")??{ok:!1,detail:"git \u72B6\u6001\u672A\u77E5"},c=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"},i=n.items.find(m=>m.id==="codex-auth")??{ok:!1,detail:"Codex \u767B\u5F55\u72B6\u6001\u672A\u77E5"},d=n.items.find(m=>m.id==="claude-cli")??{ok:!1,detail:"Claude Code CLI \u72B6\u6001\u672A\u77E5"},u=n.items.find(m=>m.id==="claude-auth")??{ok:!1,detail:"Claude Code \u8BA4\u8BC1\u72B6\u6001\u672A\u77E5"},p=!!e.opencodeConfigContent?.trim(),g=!!e.codexConfigContent?.trim(),w=!!e.claudeCodeConfigContent?.trim(),k=[{id:"git",category:"tooling",label:"Git",ok:a.ok,detail:a.detail,hint:a.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:c.ok,detail:c.detail,hint:c.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:i.ok,detail:i.detail,hint:i.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:d.ok,detail:d.detail,hint:d.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:u.ok,detail:u.detail,hint:u.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:p,detail:p?"\u5DF2\u52A0\u8F7D OpenCode providers \u914D\u7F6E\u3002":"\u672A\u68C0\u6D4B\u5230 OpenCode providers \u914D\u7F6E\u3002",hint:p?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:g,detail:g?"\u5DF2\u52A0\u8F7D Codex config.toml\u3002":"\u672A\u68C0\u6D4B\u5230 Codex config.toml\u3002",hint:g?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:w,detail:w?"\u5DF2\u52A0\u8F7D Claude Code settings.json\u3002":"\u672A\u68C0\u6D4B\u5230 Claude Code settings.json\u3002",hint:w?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:pr(e),checks:{git:a.ok,opencodeAvailable:c.ok,codexCliAvailable:l.ok,codexAuthenticated:i.ok,claudeCliAvailable:d.ok,claudeAuthenticated:u.ok,opencodeConfigLoaded:p,codexConfigLoaded:g,claudeConfigLoaded:w,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:ac(k),cloudProbe:t,officialSiteProbe:r,runtime:Ie()}},Ir=async()=>{console.log(JSON.stringify(await Xn(),null,2))},Wt=()=>Xn();import{existsSync as cc,statfsSync as lc}from"node:fs";import X from"node:os";import Yn from"node:path";var Qn=null,Zn=(e,t=1)=>{let r=10**t;return Math.round(e*r)/r},dc=()=>X.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}),uc=()=>{let e=X.cpus(),t=dc(),r=Qn;Qn=t;let n=e.reduce((s,a)=>s+(Number.isFinite(a.speed)?a.speed:0),0),o=(()=>{if(!r)return;let s=t.total-r.total,a=t.idle-r.idle;if(!(s<=0))return Zn((1-a/s)*100,1)})();return{coreCount:e.length,model:e[0]?.model,averageSpeedMhz:e.length>0?Math.round(n/e.length):void 0,loadAverage:X.loadavg().map(s=>Zn(s,2)),usagePercent:o}},pc=()=>{let e=X.totalmem(),t=X.freemem();return{totalBytes:e,freeBytes:t,usedBytes:Math.max(0,e-t)}},gc=e=>{let t=Yn.resolve(e||process.cwd());for(;!cc(t);){let r=Yn.dirname(t);if(r===t)return process.cwd();t=r}return t},mc=e=>{try{let t=gc(e),r=lc(t),n=Number(r.bsize),o=Number(r.blocks),s=Number(r.bfree),a=Number(r.bavail);if(!Number.isFinite(n)||!Number.isFinite(o)||n<=0||o<=0)return;let c=o*n,l=Math.max(0,s*n),i=Math.max(0,a*n);return{path:t,totalBytes:c,freeBytes:l,availableBytes:i,usedBytes:Math.max(0,c-l)}}catch{return}},fc=e=>({platform:process.platform,arch:X.arch(),hostname:X.hostname(),release:X.release(),version:typeof X.version=="function"?X.version():void 0,nodeVersion:process.version,workerVersion:e,systemUptimeSec:Math.max(0,Math.round(X.uptime())),processUptimeSec:Math.max(0,Math.round(process.uptime()))}),_t=e=>({capturedAt:new Date().toISOString(),cpu:uc(),memory:pc(),disk:mc(e.workspaceRoot),system:fc(e.workerVersion)});var hc=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,eo=()=>AbortSignal.timeout(8e3),to=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(/\/+$/,"")}},kc=e=>{let t=to(e);return!t||t==="github.com"?"https://api.github.com/user":`https://${t}/api/v3/user`},yc=e=>`https://${to(e)||"gitlab.com"}/api/v4/user`,wc=async(e,t)=>{try{let r=await fetch(kc(t),{headers:{Accept:"application/vnd.github+json",Authorization:`Bearer ${e}`,"User-Agent":"vibemux-pat-check"},signal:eo()});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"}}},Cc=async(e,t)=>{try{let r=await fetch(yc(t),{headers:{"PRIVATE-TOKEN":e,"User-Agent":"vibemux-pat-check"},signal:eo()});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"}}},ro=async(e,t,r)=>{let n=e.trim();if(!n)return{ok:!1,message:"PAT \u4E0D\u80FD\u4E3A\u7A7A\u3002"};let o=hc(n),s=t?[t]:o?[o]:["github","gitlab"];for(let a of s){let c=a==="github"?await wc(n,r):await Cc(n,r);if(c.ok){let l=a==="github"&&c.scopes?`\uFF0Cscopes\uFF1A${c.scopes}`:"",i=a==="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:a,account:c.account,message:`${a==="github"?"GitHub":"GitLab"} \u6821\u9A8C\u901A\u8FC7\uFF0C\u5F53\u524D\u8D26\u53F7 ${c.account}${l}${i}\u3002`}}if(!c.unauthorized||o)return{ok:!1,provider:a,message:c.message}}return{ok:!1,message:"\u672A\u8BC6\u522B PAT \u5BF9\u5E94\u5E73\u53F0\uFF0C\u6216 token \u5DF2\u5931\u6548\u3002"}};import xc from"node:net";import{existsSync as Sc}from"node:fs";import{createOpencode as bc,createOpencodeClient as oo}from"@opencode-ai/sdk";var Tr=new Map,vc=async()=>new Promise((e,t)=>{let r=xc.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)})})}),G=(e,t)=>{console.log(`[worker-opencode] ${e}`,JSON.stringify(t))},de=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"},Pc=e=>{if(!e)return;let[t,...r]=e.split("/"),n=r.join("/");if(!(!t||!n))return{providerID:t,modelID:n}},Ic=(e,t,r)=>({id:`${e}/${t}`,label:`${e}/${t}`,providerId:e,modelId:t,isDefault:r===`${e}/${t}`}),Tc=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),Ec=(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,a])=>({id:a.id||a.name||s,models:a.models})),...Object.entries(r.provider??{}).map(([s,a])=>({id:a.id||a.name||s,models:a.models}))]).filter(s=>{let a=s.id?.toLowerCase()??"";return!n.some(c=>a.includes(c.toLowerCase()))}).flatMap(s=>{let a=s.id;return a?Tc(s.models).map(c=>Ic(a,c,t)):[]}).sort((s,a)=>s.isDefault?-1:a.isDefault?1:s.label.localeCompare(a.label))},Rc=async e=>{let t=await vc();return(await bc({port:t,timeout:15e3,config:ne(e)})).server},io=async e=>{let t=e?.trim()||"{}",r=Tr.get(t);if(r)return r;let n=Rc(e).catch(o=>{throw Tr.delete(t),o});return Tr.set(t,n),n},Ac=async(e,t)=>{let r=await io(t);return oo({baseUrl:r.url,directory:e})},Mc=async e=>{let t=await io(e);return oo({baseUrl:t.url})},Oc=async(e,t,r)=>{G("session:create:start",{cwd:t,title:r});let n;try{n=await e.session.create({body:{title:r},query:{directory:t}})}catch(o){throw G("session:create:error",{cwd:t,title:r,error:de(o)}),o}if(G("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=de(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},so=async()=>{let e=x(),t=Le(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 Mc(t)).config.providers(),s="data"in o?o.data:o,a=Object.entries(s?.default??{}).find(([,l])=>!!l),c=a?`${a[0]}/${a[1]}`:r;return{models:Ec(s,c),defaultModel:c,message:void 0}}catch(n){return G("models:error",{error:de(n)}),{models:[],defaultModel:r,message:de(n)}}},Ke=e=>Array.isArray(e)?e:[],Bc=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:Ke(t.parts).map(r=>r.type),textPreview:$t(Ke(t.parts)).slice(0,160)})),Wc=async(e,t,r)=>{try{let n=await e.session.messages({path:{id:r},query:{directory:t,limit:20}});return Bc(Array.isArray(n.data)?n.data:[])}catch(n){return[{snapshotError:de(n)}]}},_c=(e,t)=>{let r=t?e.find(s=>s.info?.id===t):void 0,n=$t(Ke(r?.parts));if(n)return n;let o=[...e].filter(s=>s.info?.role==="assistant").sort((s,a)=>(a.info?.time?.created??0)-(s.info?.time?.created??0)).find(s=>$t(Ke(s.parts)));return o?$t(Ke(o.parts)):""},no=e=>!!e?.info?.time?.completed||!!e?.info?.error,$t=e=>e.filter(t=>t.type==="text").map(t=>t.text?.trim()??"").filter(Boolean).join(`
26
26
 
27
- `),Ec=e=>[...e.values()].join("").trim(),Rc=(e,t)=>{let r=e.get(t);if(r)return r;let n=new Map;return e.set(t,n),n},Ac=async e=>new Promise(t=>setTimeout(t,e)),oo=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 oo(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}}},Mc=e=>e&&"permissionPolicy"in e?e:void 0,Oc=e=>{let r={...ne(e.baseConfigContent)},n=e.agent?.trim()||void 0,o=oo(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 a=r.agent&&typeof r.agent=="object"&&!Array.isArray(r.agent)?r.agent:{},c=a[n];return r.agent={...a,[n]:c&&typeof c=="object"&&!Array.isArray(c)?{...c,...o?{permission:o}:{},...s?{variant:s}:{}}:{...o?{permission:o}:{},...s?{variant:s}:{}}},JSON.stringify(r)},Bc=e=>{let t=x(),r=Mc(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,a=e.executionModel?.trim()||e.opencodeConfig?.model?.trim()||r?.defaultModel?.trim()||void 0,c=Array.isArray(e.mcpServers),i=[...e.mcpServers??t.mcpServers??[],...e.opencodeConfig?.mcpServers??[]],d=c||e.opencodeConfig?.mcpServers?.length?gt(t.opencodeConfigContent,i,{cloudUrl:t.cloudUrl,executorToken:t.executorToken,actingUserId:e.actingUserId}).trim():Le(t,e.actingUserId).trim();return{agent:n,variant:o,executionModel:a,configContent:Oc({baseConfigContent:d,agent:n,permissionPolicy:s,variant:o})}},io=async e=>{if(!mc(e.cwd))throw new Error(`\u5DE5\u4F5C\u76EE\u5F55\u4E0D\u5B58\u5728: ${e.cwd}`);let t=Bc({actingUserId:e.actingUserId,executionModel:e.executionModel,agentSettings:e.agentSettings,opencodeConfig:e.opencodeConfig,mcpServers:e.mcpServers}),r=await Sc(e.cwd,t.configContent),n=await vc(r,e.cwd,e.title),o=!1,s=null,a=new Map,c=!1,l="",i=new AbortController,d=()=>{o=!0,i.abort(),r.session.abort({path:{id:n},query:{directory:e.cwd}}).catch(()=>{})};e.signal?.addEventListener("abort",d,{once:!0});try{G("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 u=await r.event.subscribe({signal:i.signal});G("prompt:subscribed",{cwd:e.cwd,sessionId:n});let p=r.session.promptAsync({path:{id:n},query:{directory:e.cwd},body:{model:kc(t.executionModel),agent:t.agent,parts:[{type:"text",text:e.prompt}]}}).catch(w=>{o||e.signal?.aborted||(s=w instanceof Error?w:new Error(de(w)),G("prompt:async-error",{cwd:e.cwd,sessionId:n,error:s.message}),i.abort())});for await(let w of u.stream){if(o||e.signal?.aborted)throw new Error("\u4EFB\u52A1\u5DF2\u53D6\u6D88");let k=w;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&&(c=!0,G("event:session-status",{sessionId:n,status:k.properties.status}));continue}if(k.type==="message.updated"){e.onEvent?.({type:"message.updated",properties:k.properties});let m=k.properties.info;if(m.sessionID!==n||m.role!=="assistant"||!m.id)continue;l=m.id,c=!0,G("event:message-updated",{sessionId:n,assistantMessageId:l,role:m.role});continue}if(k.type==="message.part.updated"){e.onEvent?.({type:"message.part.updated",properties:k.properties});let m=k.properties.part;if(m.sessionID!==n||l&&m.messageID!==l)continue;c=!0,G("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&&Rc(a,m.messageID).set(m.id,m.text??"");continue}if(k.type==="session.error"){e.onEvent?.({type:"session.error",properties:k.properties});let m=k.properties;if(m.sessionID!==n)continue;throw G("event:session-error",{sessionId:n,error:m.error}),new Error(de(m.error))}if(k.type==="session.idle"&&(e.onEvent?.({type:"session.idle",properties:k.properties}),k.properties.sessionID===n&&c)){G("event:session-idle",{sessionId:n,assistantMessageId:l,textPartCount:l?a.get(l)?.size??0:0});break}}}if(i.abort(),await p,o||e.signal?.aborted)throw new Error("\u4EFB\u52A1\u5DF2\u53D6\u6D88");if(s)throw s;let g=l?Ec(a.get(l)??new Map):"";if(!g)for(let w=0;w<10;w+=1){w>0&&await Ac(300);let k=await r.session.messages({path:{id:n},query:{directory:e.cwd,limit:20}}),m=Array.isArray(k.data)?k.data:[];if(g=Tc(m,l),g)break;let f=l?m.find(S=>S.info?.id===l):void 0;if(l&&f&&eo(f)||!l&&m.some(eo))break}return G("prompt:finish",{cwd:e.cwd,sessionId:n,assistantMessageId:l,outputPreview:(g||"OpenCode \u672A\u8FD4\u56DE\u6587\u672C\u8F93\u51FA\u3002").slice(0,200)}),{sessionId:n,output:g||"OpenCode \u672A\u8FD4\u56DE\u6587\u672C\u8F93\u51FA\u3002"}}catch(u){throw G("prompt:error",{cwd:e.cwd,sessionId:n,assistantMessageId:l,aborted:o,error:de(u),snapshot:await Pc(r,e.cwd,n)}),u}finally{e.signal?.removeEventListener("abort",d)}},so=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(`
28
- `);return io({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})},ao=async e=>io({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});import{randomUUID as Er}from"node:crypto";import{spawn as $c}from"node:child_process";import{existsSync as Xe}from"node:fs";import Wc from"node:path";var _c=()=>{let e=pt(),t=_e();if(Xe(t))return{launcherPath:Xe(e)?e:void 0,runnerPath:process.execPath,entryPath:t};let r=oe("tsx"),n=Wc.join(K(),"apps","worker","src","index.ts");return r&&Xe(n)?{launcherPath:Xe(e)?e:void 0,runnerPath:r,entryPath:n}:{launcherPath:Xe(e)?e:void 0,runnerPath:void 0,entryPath:void 0}},Dt=()=>{let e=_c();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 Ut=e=>oe(e),Ye=e=>{try{return JSON.parse(e)}catch{return null}},T=(e,t,r)=>{t?.({agentType:e,...r})},Qe=()=>{let e=new Error("\u4EFB\u52A1\u5DF2\u53D6\u6D88");return e.name="AbortError",e},Ee=e=>{let t=e?.trim();if(!(!t||t==="default"))return t};var Dc=new Set(["Glob","Grep","LS","NotebookRead","Read","Task","TodoRead"]),Uc=new Set(["Edit","MultiEdit","TodoWrite","Write"]),Nc=e=>e.split("(")[0]?.trim()||e.trim(),Lc=e=>e?.planMode?"plan":e?.permissionMode??"bypassPermissions",jc=e=>e==="bypassPermissions"&&typeof process.getuid=="function"&&process.getuid()===0?"acceptEdits":e,Gc=(e,t)=>{let r=Nc(t);return!!(e==="bypassPermissions"||Dc.has(r)||e==="acceptEdits"&&Uc.has(r))},Ze=(e,t)=>{e.write(`${JSON.stringify(t)}
29
- `)},co=async e=>{let t=Ut("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=Ee(e.executionModel)??Ee(r?.defaultModel),o=Lc(r),s=jc(o),a=["-p","--output-format=stream-json","--input-format=stream-json","--verbose","--include-partial-messages","--replay-user-messages","--permission-mode",s,...e.runtimeArgs??[]];return n&&a.push("--model",n),new Promise((c,l)=>{let i=$c(t,a,{cwd:e.cwd,env:{...Dt(),...e.runtimeEnv??{}},stdio:["pipe","pipe","pipe"]}),d="",u="",p="",g="",w="",k="",m=!1,f=new Map,S=new Map,I=()=>(g=g||`${p||"claude"}:assistant`,T("ClaudeCode",e.onEvent,{type:"message.updated",properties:{info:{id:g,role:"assistant"}}}),g),D=(b,B,U,h)=>{T("ClaudeCode",e.onEvent,{type:"message.part.updated",properties:{part:{id:B,messageID:I(),type:b,text:U},delta:h}})},V=b=>{Ze(i.stdin,{type:"control_response",response:b})},E=b=>{if(b.type!=="control_request")return;if(b.request.subtype==="hook_callback"){V({subtype:"success",request_id:b.request_id,response:{}});return}let B=b.request.tool_name,U=Gc(s,B);U||T("ClaudeCode",e.onEvent,{type:"permission.updated",properties:{title:B}}),V({subtype:"success",request_id:b.request_id,response:U?{behavior:"allow",updatedInput:b.request.input}:{behavior:"deny",message:`\u5F53\u524D\u4F1A\u8BDD\u672A\u542F\u7528 ${B} \u6743\u9650\u3002`,interrupt:!1}})},q=()=>{Ze(i.stdin,{type:"control_request",request_id:Er(),request:{subtype:"interrupt"}}),setTimeout(()=>{i.killed||i.kill("SIGTERM")},250)};e.signal?.addEventListener("abort",q,{once:!0});let te=b=>{let B=b.trim();if(!B)return;let U=Ye(B);if(U?.type==="control_request"||U?.type==="control_cancel_request"){E(U);return}let h=Ye(B);if(h){if(h.session_id&&(p=h.session_id),h.type==="system"&&h.subtype==="init"){T("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 C=h.event,y=`${p||"claude"}:${C.index??0}`;if(C.type==="content_block_delta"&&C.delta?.type==="thinking_delta"){let v=`${S.get(y)??""}${C.delta.thinking??""}`;S.set(y,v),D("reasoning",`${y}:thinking`,v,C.delta.thinking??"");return}if(C.type==="content_block_delta"&&C.delta?.type==="text_delta"){let v=`${f.get(y)??""}${C.delta.text??""}`;f.set(y,v),w=v.trim()||w,D("text",`${y}:text`,v,C.delta.text??"");return}C.type==="content_block_start"&&C.content_block?.type==="tool_use"&&T("ClaudeCode",e.onEvent,{type:"message.part.updated",properties:{part:{id:C.content_block.id??`${y}:tool`,messageID:I(),type:"tool",tool:C.content_block.name??"tool",state:{status:"running"}}}});return}if(h.type==="assistant"){p=h.session_id??p,g=h.message?.id??I();let C=Array.isArray(h.message?.content)?h.message.content:[];for(let y of C)y.type==="text"&&y.text?.trim()&&(w=y.text.trim(),D("text",`${g}:final`,w)),y.type==="tool_use"&&T("ClaudeCode",e.onEvent,{type:"message.part.updated",properties:{part:{id:y.id??`${g}:tool`,messageID:I(),type:"tool",tool:y.name??"tool",state:{status:"running",raw:y.input?JSON.stringify(y.input,null,2):void 0}}}});return}if(h.type==="user"){let C=Array.isArray(h.message?.content)?h.message.content:[],y=C.find(v=>v.tool_use_id)?.tool_use_id;if(!y)return;T("ClaudeCode",e.onEvent,{type:"message.part.updated",properties:{part:{id:y,messageID:I(),type:"tool",tool:"tool",state:{status:"completed",output:C.find(v=>v.tool_use_id===y)?.content}}}});return}if(h.type==="result"){if(m=!h.is_error,h.result?.trim()&&(w=h.result.trim()),h.is_error){k=h.result?.trim()||"Claude Code \u6267\u884C\u5931\u8D25",T("ClaudeCode",e.onEvent,{type:"session.error",properties:{error:k}});return}T("ClaudeCode",e.onEvent,{type:"session.status",properties:{status:{type:"idle",message:"Claude Code \u5DF2\u5B8C\u6210"}}}),i.killed||i.kill("SIGTERM")}}};i.stdout.on("data",b=>{d+=b.toString();let B=d.split(`
30
- `);d=B.pop()??"";for(let U of B)te(U)}),i.stderr.on("data",b=>{u+=b.toString()}),i.on("error",b=>{e.signal?.removeEventListener("abort",q),l(b)}),i.on("close",b=>{if(e.signal?.removeEventListener("abort",q),d.trim()&&te(d),e.signal?.aborted){l(Qe());return}if(!m&&b!==0||k){l(new Error(k||u.trim().split(`
27
+ `),$c=e=>[...e.values()].join("").trim(),Uc=(e,t)=>{let r=e.get(t);if(r)return r;let n=new Map;return e.set(t,n),n},Dc=async e=>new Promise(t=>setTimeout(t,e)),ao=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 ao(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}}},Nc=e=>e&&"permissionPolicy"in e?e:void 0,Lc=e=>{let r={...ne(e.baseConfigContent)},n=e.agent?.trim()||void 0,o=ao(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 a=r.agent&&typeof r.agent=="object"&&!Array.isArray(r.agent)?r.agent:{},c=a[n];return r.agent={...a,[n]:c&&typeof c=="object"&&!Array.isArray(c)?{...c,...o?{permission:o}:{},...s?{variant:s}:{}}:{...o?{permission:o}:{},...s?{variant:s}:{}}},JSON.stringify(r)},jc=e=>{let t=x(),r=Nc(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,a=e.executionModel?.trim()||e.opencodeConfig?.model?.trim()||r?.defaultModel?.trim()||void 0,c=Array.isArray(e.mcpServers),i=[...e.mcpServers??t.mcpServers??[],...e.opencodeConfig?.mcpServers??[]],d=c||e.opencodeConfig?.mcpServers?.length?gt(t.opencodeConfigContent,i,{cloudUrl:t.cloudUrl,executorToken:t.executorToken,actingUserId:e.actingUserId}).trim():Le(t,e.actingUserId).trim();return{agent:n,variant:o,executionModel:a,configContent:Lc({baseConfigContent:d,agent:n,permissionPolicy:s,variant:o})}},co=async e=>{if(!Sc(e.cwd))throw new Error(`\u5DE5\u4F5C\u76EE\u5F55\u4E0D\u5B58\u5728: ${e.cwd}`);let t=jc({actingUserId:e.actingUserId,executionModel:e.executionModel,agentSettings:e.agentSettings,opencodeConfig:e.opencodeConfig,mcpServers:e.mcpServers}),r=await Ac(e.cwd,t.configContent),n=await Oc(r,e.cwd,e.title),o=!1,s=null,a=new Map,c=!1,l="",i=new AbortController,d=()=>{o=!0,i.abort(),r.session.abort({path:{id:n},query:{directory:e.cwd}}).catch(()=>{})};e.signal?.addEventListener("abort",d,{once:!0});try{G("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 u=await r.event.subscribe({signal:i.signal});G("prompt:subscribed",{cwd:e.cwd,sessionId:n});let p=r.session.promptAsync({path:{id:n},query:{directory:e.cwd},body:{model:Pc(t.executionModel),agent:t.agent,parts:[{type:"text",text:e.prompt}]}}).catch(w=>{o||e.signal?.aborted||(s=w instanceof Error?w:new Error(de(w)),G("prompt:async-error",{cwd:e.cwd,sessionId:n,error:s.message}),i.abort())});for await(let w of u.stream){if(o||e.signal?.aborted)throw new Error("\u4EFB\u52A1\u5DF2\u53D6\u6D88");let k=w;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&&(c=!0,G("event:session-status",{sessionId:n,status:k.properties.status}));continue}if(k.type==="message.updated"){e.onEvent?.({type:"message.updated",properties:k.properties});let m=k.properties.info;if(m.sessionID!==n||m.role!=="assistant"||!m.id)continue;l=m.id,c=!0,G("event:message-updated",{sessionId:n,assistantMessageId:l,role:m.role});continue}if(k.type==="message.part.updated"){e.onEvent?.({type:"message.part.updated",properties:k.properties});let m=k.properties.part;if(m.sessionID!==n||l&&m.messageID!==l)continue;c=!0,G("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&&Uc(a,m.messageID).set(m.id,m.text??"");continue}if(k.type==="session.error"){e.onEvent?.({type:"session.error",properties:k.properties});let m=k.properties;if(m.sessionID!==n)continue;throw G("event:session-error",{sessionId:n,error:m.error}),new Error(de(m.error))}if(k.type==="session.idle"&&(e.onEvent?.({type:"session.idle",properties:k.properties}),k.properties.sessionID===n&&c)){G("event:session-idle",{sessionId:n,assistantMessageId:l,textPartCount:l?a.get(l)?.size??0:0});break}}}if(i.abort(),await p,o||e.signal?.aborted)throw new Error("\u4EFB\u52A1\u5DF2\u53D6\u6D88");if(s)throw s;let g=l?$c(a.get(l)??new Map):"";if(!g)for(let w=0;w<10;w+=1){w>0&&await Dc(300);let k=await r.session.messages({path:{id:n},query:{directory:e.cwd,limit:20}}),m=Array.isArray(k.data)?k.data:[];if(g=_c(m,l),g)break;let f=l?m.find(S=>S.info?.id===l):void 0;if(l&&f&&no(f)||!l&&m.some(no))break}return G("prompt:finish",{cwd:e.cwd,sessionId:n,assistantMessageId:l,outputPreview:(g||"OpenCode \u672A\u8FD4\u56DE\u6587\u672C\u8F93\u51FA\u3002").slice(0,200)}),{sessionId:n,output:g||"OpenCode \u672A\u8FD4\u56DE\u6587\u672C\u8F93\u51FA\u3002"}}catch(u){throw G("prompt:error",{cwd:e.cwd,sessionId:n,assistantMessageId:l,aborted:o,error:de(u),snapshot:await Wc(r,e.cwd,n)}),u}finally{e.signal?.removeEventListener("abort",d)}},lo=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(`
28
+ `);return co({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})},uo=async e=>co({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});import{randomUUID as Er}from"node:crypto";import{spawn as Hc}from"node:child_process";import{existsSync as Xe}from"node:fs";import Gc from"node:path";var qc=()=>{let e=pt(),t=_e();if(Xe(t))return{launcherPath:Xe(e)?e:void 0,runnerPath:process.execPath,entryPath:t};let r=oe("tsx"),n=Gc.join(K(),"apps","worker","src","index.ts");return r&&Xe(n)?{launcherPath:Xe(e)?e:void 0,runnerPath:r,entryPath:n}:{launcherPath:Xe(e)?e:void 0,runnerPath:void 0,entryPath:void 0}},Ut=()=>{let e=qc();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 Dt=e=>oe(e),Ye=e=>{try{return JSON.parse(e)}catch{return null}},T=(e,t,r)=>{t?.({agentType:e,...r})},Qe=()=>{let e=new Error("\u4EFB\u52A1\u5DF2\u53D6\u6D88");return e.name="AbortError",e},Ee=e=>{let t=e?.trim();if(!(!t||t==="default"))return t};var zc=new Set(["Glob","Grep","LS","NotebookRead","Read","Task","TodoRead"]),Jc=new Set(["Edit","MultiEdit","TodoWrite","Write"]),Fc=e=>e.split("(")[0]?.trim()||e.trim(),Vc=e=>e?.planMode?"plan":e?.permissionMode??"bypassPermissions",Kc=e=>e==="bypassPermissions"&&typeof process.getuid=="function"&&process.getuid()===0?"acceptEdits":e,Xc=(e,t)=>{let r=Fc(t);return!!(e==="bypassPermissions"||zc.has(r)||e==="acceptEdits"&&Jc.has(r))},Ze=(e,t)=>{e.write(`${JSON.stringify(t)}
29
+ `)},po=async e=>{let t=Dt("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=Ee(e.executionModel)??Ee(r?.defaultModel),o=Vc(r),s=Kc(o),a=["-p","--output-format=stream-json","--input-format=stream-json","--verbose","--include-partial-messages","--replay-user-messages","--permission-mode",s,...e.runtimeArgs??[]];return n&&a.push("--model",n),new Promise((c,l)=>{let i=Hc(t,a,{cwd:e.cwd,env:{...Ut(),...e.runtimeEnv??{}},stdio:["pipe","pipe","pipe"]}),d="",u="",p="",g="",w="",k="",m=!1,f=new Map,S=new Map,P=()=>(g=g||`${p||"claude"}:assistant`,T("ClaudeCode",e.onEvent,{type:"message.updated",properties:{info:{id:g,role:"assistant"}}}),g),U=(b,B,D,h)=>{T("ClaudeCode",e.onEvent,{type:"message.part.updated",properties:{part:{id:B,messageID:P(),type:b,text:D},delta:h}})},V=b=>{Ze(i.stdin,{type:"control_response",response:b})},E=b=>{if(b.type!=="control_request")return;if(b.request.subtype==="hook_callback"){V({subtype:"success",request_id:b.request_id,response:{}});return}let B=b.request.tool_name,D=Xc(s,B);D||T("ClaudeCode",e.onEvent,{type:"permission.updated",properties:{title:B}}),V({subtype:"success",request_id:b.request_id,response:D?{behavior:"allow",updatedInput:b.request.input}:{behavior:"deny",message:`\u5F53\u524D\u4F1A\u8BDD\u672A\u542F\u7528 ${B} \u6743\u9650\u3002`,interrupt:!1}})},q=()=>{Ze(i.stdin,{type:"control_request",request_id:Er(),request:{subtype:"interrupt"}}),setTimeout(()=>{i.killed||i.kill("SIGTERM")},250)};e.signal?.addEventListener("abort",q,{once:!0});let te=b=>{let B=b.trim();if(!B)return;let D=Ye(B);if(D?.type==="control_request"||D?.type==="control_cancel_request"){E(D);return}let h=Ye(B);if(h){if(h.session_id&&(p=h.session_id),h.type==="system"&&h.subtype==="init"){T("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 C=h.event,y=`${p||"claude"}:${C.index??0}`;if(C.type==="content_block_delta"&&C.delta?.type==="thinking_delta"){let v=`${S.get(y)??""}${C.delta.thinking??""}`;S.set(y,v),U("reasoning",`${y}:thinking`,v,C.delta.thinking??"");return}if(C.type==="content_block_delta"&&C.delta?.type==="text_delta"){let v=`${f.get(y)??""}${C.delta.text??""}`;f.set(y,v),w=v.trim()||w,U("text",`${y}:text`,v,C.delta.text??"");return}C.type==="content_block_start"&&C.content_block?.type==="tool_use"&&T("ClaudeCode",e.onEvent,{type:"message.part.updated",properties:{part:{id:C.content_block.id??`${y}:tool`,messageID:P(),type:"tool",tool:C.content_block.name??"tool",state:{status:"running"}}}});return}if(h.type==="assistant"){p=h.session_id??p,g=h.message?.id??P();let C=Array.isArray(h.message?.content)?h.message.content:[];for(let y of C)y.type==="text"&&y.text?.trim()&&(w=y.text.trim(),U("text",`${g}:final`,w)),y.type==="tool_use"&&T("ClaudeCode",e.onEvent,{type:"message.part.updated",properties:{part:{id:y.id??`${g}:tool`,messageID:P(),type:"tool",tool:y.name??"tool",state:{status:"running",raw:y.input?JSON.stringify(y.input,null,2):void 0}}}});return}if(h.type==="user"){let C=Array.isArray(h.message?.content)?h.message.content:[],y=C.find(v=>v.tool_use_id)?.tool_use_id;if(!y)return;T("ClaudeCode",e.onEvent,{type:"message.part.updated",properties:{part:{id:y,messageID:P(),type:"tool",tool:"tool",state:{status:"completed",output:C.find(v=>v.tool_use_id===y)?.content}}}});return}if(h.type==="result"){if(m=!h.is_error,h.result?.trim()&&(w=h.result.trim()),h.is_error){k=h.result?.trim()||"Claude Code \u6267\u884C\u5931\u8D25",T("ClaudeCode",e.onEvent,{type:"session.error",properties:{error:k}});return}T("ClaudeCode",e.onEvent,{type:"session.status",properties:{status:{type:"idle",message:"Claude Code \u5DF2\u5B8C\u6210"}}}),i.killed||i.kill("SIGTERM")}}};i.stdout.on("data",b=>{d+=b.toString();let B=d.split(`
30
+ `);d=B.pop()??"";for(let D of B)te(D)}),i.stderr.on("data",b=>{u+=b.toString()}),i.on("error",b=>{e.signal?.removeEventListener("abort",q),l(b)}),i.on("close",b=>{if(e.signal?.removeEventListener("abort",q),d.trim()&&te(d),e.signal?.aborted){l(Qe());return}if(!m&&b!==0||k){l(new Error(k||u.trim().split(`
31
31
  `).filter(Boolean).at(-1)||`Claude Code \u6267\u884C\u5931\u8D25\uFF08\u9000\u51FA\u7801 ${b??-1}\uFF09`));return}c({output:w||u.trim().split(`
32
- `).filter(Boolean).at(-1)||"Claude Code \u672A\u8FD4\u56DE\u6587\u672C\u8F93\u51FA\u3002",sessionId:p||void 0})}),Ze(i.stdin,{type:"control_request",request_id:Er(),request:{subtype:"initialize"}}),Ze(i.stdin,{type:"control_request",request_id:Er(),request:{subtype:"set_permission_mode",mode:s}}),Ze(i.stdin,{type:"user",message:{role:"user",content:e.prompt}})})};import{spawn as qc}from"node:child_process";var Hc=(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}},Jc=e=>({mode:"default",settings:{model:e,reasoning_effort:null,developer_instructions:null}}),Fc=e=>e==="never"?{command:"acceptForSession",fileChange:"acceptForSession"}:{command:"decline",fileChange:"decline"},zc=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":"")},lo=(e,t,r,n)=>{T("Codex",e.onEvent,{type:"message.updated",properties:{info:{id:t,role:"assistant"}}}),T("Codex",e.onEvent,{type:"message.part.updated",properties:{part:{id:`${t}:text`,messageID:t,type:"text",text:r},delta:n}})},uo=(e,t,r,n,o)=>{T("Codex",e.onEvent,{type:"message.part.updated",properties:{part:{id:r,messageID:t,type:"reasoning",text:n},delta:o}})},po=(e,t,r,n,o,s)=>{let a=r.type==="fileChange"?"apply_patch":"shell",c=r.type==="commandExecution"?r.command:r.type==="fileChange"?JSON.stringify(r.changes??[],null,2):void 0;T("Codex",e.onEvent,{type:"message.part.updated",properties:{part:{id:r.id,messageID:t,type:"tool",tool:a,state:{status:n,raw:c,output:o,error:s}}}})},Rr=(e,t)=>{e.stdin.write(`${JSON.stringify(t)}
33
- `)},go=async e=>{let t=Ut("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=Ee(e.executionModel)??Ee(r?.defaultModel),o=Fc(r?.approval);return new Promise((s,a)=>{let c=qc(t,["app-server",...e.runtimeArgs??[]],{cwd:e.cwd,env:{...Dt(),...e.runtimeEnv??{}},stdio:["pipe","pipe","pipe"]}),l=1,i="",d="",u="",p="",g="",w=!1,k="",m=new Map,f=new Map,S=new Map,I=h=>{for(let C of m.values())C.reject(h);m.clear()},D=(h,C)=>{let y=l++;return Rr(c,{jsonrpc:"2.0",id:y,method:h,params:C}),new Promise((v,ut)=>{m.set(y,{resolve:Ui=>v(Ui),reject:ut})})},V=(h,C)=>{Rr(c,{jsonrpc:"2.0",id:h,result:C})},E=()=>{c.killed||c.kill("SIGTERM")},q=()=>{E()};e.signal?.addEventListener("abort",q,{once:!0});let te=h=>{if(h.method==="item/commandExecution/requestApproval"){let C=h.params??{};o.command==="decline"&&T("Codex",e.onEvent,{type:"permission.updated",properties:{title:C.reason?.trim()||C.command?.trim()||"\u547D\u4EE4\u6267\u884C\u6743\u9650"}}),V(h.id,{decision:o.command});return}if(h.method==="item/fileChange/requestApproval"){let C=h.params??{};o.fileChange==="decline"&&T("Codex",e.onEvent,{type:"permission.updated",properties:{title:C.reason?.trim()||"\u6587\u4EF6\u4FEE\u6539\u6743\u9650"}}),V(h.id,{decision:o.fileChange});return}if(h.method==="item/tool/requestUserInput"){let C=h.params??{};T("Codex",e.onEvent,{type:"permission.updated",properties:{title:C.questions?.[0]?.header?.trim()||C.questions?.[0]?.question?.trim()||"\u7B49\u5F85\u7528\u6237\u8F93\u5165"}}),V(h.id,{answers:{}});return}V(h.id,null)},b=(h,C)=>{if(h.type==="agentMessage"){let y=h;k=y.id,f.set(y.id,y.text),y.text.trim()&&(p=y.text.trim()),lo(e,y.id,y.text);return}if(h.type==="reasoning"){let y=h,v=y.summary?.join("")||y.content?.join("")||"";v&&(S.set(y.id,v),uo(e,k||`${u||"codex"}:assistant`,`${y.id}:reasoning`,v));return}if(h.type==="commandExecution"){let y=h,v=C==="started"?"running":y.status==="completed"?"completed":"error";po(e,k||void 0,y,v,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(h.type==="fileChange"){let y=h,v=C==="started"?"running":y.status==="success"?"completed":"error";po(e,k||void 0,y,v,JSON.stringify(y.changes??[],null,2),y.status==="failed"||y.status==="declined"?"\u6587\u4EF6\u4FEE\u6539\u672A\u5B8C\u6210":void 0)}},B=async h=>{if(h.method==="thread/started"){u=h.params.thread.id;return}if(h.method==="turn/started"){let C=h.params;u=u||C.threadId,T("Codex",e.onEvent,{type:"session.status",properties:{status:{type:"busy",message:"Codex \u6B63\u5728\u5904\u7406\u8BF7\u6C42"}}});return}if(h.method==="item/started"){b(h.params.item,"started");return}if(h.method==="item/completed"){b(h.params.item,"completed");return}if(h.method==="item/agentMessage/delta"){let C=h.params;k=C.itemId;let y=`${f.get(C.itemId)??""}${C.delta??""}`;f.set(C.itemId,y),y.trim()&&(p=y.trim()),lo(e,C.itemId,y,C.delta);return}if(h.method==="item/reasoning/textDelta"||h.method==="item/reasoning/summaryTextDelta"){let C=h.params,y=h.method==="item/reasoning/textDelta"?`content:${C.contentIndex??0}`:`summary:${C.summaryIndex??0}`,v=`${C.itemId}:reasoning:${y}`,ut=`${S.get(v)??""}${C.delta??""}`;S.set(v,ut),uo(e,k||`${u||"codex"}:assistant`,v,ut,C.delta);return}if(h.method==="turn/completed"){let C=h.params;u=u||C.threadId,w=C.turn.status==="completed",C.turn.status==="failed"?(g=zc(C.turn)||"Codex \u6267\u884C\u5931\u8D25",T("Codex",e.onEvent,{type:"session.error",properties:{error:g}})):T("Codex",e.onEvent,{type:"session.status",properties:{status:{type:"idle",message:"Codex \u5DF2\u5B8C\u6210"}}}),E();return}h.method==="error"&&(g=h.params.message?.trim()||"Codex \u6267\u884C\u5931\u8D25",T("Codex",e.onEvent,{type:"session.error",properties:{error:g}}),E())},U=h=>{let C=h.trim();if(!C)return;let y=Ye(C);if(y){if(typeof y.id<"u"&&(typeof y.result<"u"||typeof y.error<"u")){let v=m.get(y.id);if(!v)return;if(m.delete(y.id),y.error){v.reject(new Error(y.error.message||"Codex app-server \u8BF7\u6C42\u5931\u8D25"));return}v.resolve(y.result);return}if(typeof y.id<"u"&&typeof y.method=="string"){te(y);return}typeof y.method=="string"&&B(y)}};c.stdout.on("data",h=>{i+=h.toString();let C=i.split(`
34
- `);i=C.pop()??"";for(let y of C)U(y)}),c.stderr.on("data",h=>{d+=h.toString()}),c.on("error",h=>{e.signal?.removeEventListener("abort",q),I(h),a(h)}),c.on("close",h=>{if(e.signal?.removeEventListener("abort",q),i.trim()&&U(i),e.signal?.aborted){I(Qe()),a(Qe());return}if(!w||g){let C=new Error(g||d.trim().split(`
35
- `).filter(Boolean).at(-1)||`Codex \u6267\u884C\u5931\u8D25\uFF08\u9000\u51FA\u7801 ${h??-1}\uFF09`);I(C),a(C);return}I(new Error("Codex \u4F1A\u8BDD\u5DF2\u7ED3\u675F")),s({output:p||"Codex \u672A\u8FD4\u56DE\u6587\u672C\u8F93\u51FA\u3002",sessionId:u||void 0})}),(async()=>{try{await D("initialize",{clientInfo:{name:"vibemux-worker",version:"0.1.1"},capabilities:{experimentalApi:!0}}),Rr(c,{jsonrpc:"2.0",method:"initialized"});let h=await D("account/read",{refreshToken:!1});if(h.requiresOpenaiAuth&&!h.account)throw new Error("Codex \u9700\u8981\u5148\u767B\u5F55\u540E\u624D\u80FD\u6267\u884C\u3002");let C=await D("thread/start",Hc(e.cwd,n,r));u=C.thread.id,await D("turn/start",{threadId:u,input:[{type:"text",text:e.prompt,text_elements:[]}],collaborationMode:Jc(C.model)})}catch(h){g=h instanceof Error?h.message:"Codex \u521D\u59CB\u5316\u5931\u8D25",T("Codex",e.onEvent,{type:"session.error",properties:{error:g}}),E()}})()})};import{mkdtemp as Vc,mkdir as Kc,rm as mo,writeFile as Xc}from"node:fs/promises";import Yc from"node:os";import et from"node:path";var Qc={"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"},Zc=(e,t)=>{let r=et.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}`},el=(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()},tl=(e,t)=>{let r=et.extname(e);return r||t&&Qc[t]||""},fo=async e=>{let t=e.attachments??[];if(t.length===0)return{attachments:[],cleanup:async()=>{}};let r=et.join(Yc.tmpdir(),"vibemux-task-chat-attachments-");await Kc(et.dirname(r),{recursive:!0});let n=await Vc(r);try{return{attachments:await Promise.all(t.map(async(s,a)=>{let c=el(e.cloudUrl,s.url),l=await fetch(c,{signal:e.signal});if(!l.ok)throw new Error(`\u56FE\u7247\u9644\u4EF6\u4E0B\u8F7D\u5931\u8D25\uFF1A${s.filename}`);let i=l.headers.get("content-type")?.split(";")[0]?.trim()||s.contentType,d=tl(s.filename,i),u=Zc(`${a+1}-${s.filename||`image-${a+1}`}${d&&!s.filename.endsWith(d)?d:""}`,`image-${a+1}`),p=et.join(n,u),g=Buffer.from(await l.arrayBuffer());return await Xc(p,g),{...s,contentType:i,absoluteUrl:c,localPath:p}})),cleanup:async()=>{await mo(n,{recursive:!0,force:!0})}}}catch(o){throw await mo(n,{recursive:!0,force:!0}).catch(()=>{}),o}},ho=(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(`
36
- `)};import{copyFileSync as rl,existsSync as Re,mkdirSync as Nt,mkdtempSync as ko,readFileSync as Or,rmSync as tt,writeFileSync as yo}from"node:fs";import Ar from"node:os";import O from"node:path";var wo=".vibemux-managed.json",nl="VIBEMUX_CODEX_MCP_TOKEN_",Co={OpenCode:".opencode/skills",Codex:".codex/skills",ClaudeCode:".claude/skills"},Ce=e=>e.replace(/\\/g,"\\\\").replace(/"/g,'\\"'),Mr=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("/")},ol=e=>e.startsWith("sse://")?`http://${e.slice(6)}`:e.trim(),il=e=>/^https?:\/\//i.test(e)||/^sse:\/\//i.test(e),Br=(e,t)=>{Nt(O.dirname(e),{recursive:!0}),yo(e,`${JSON.stringify(t,null,2)}
37
- `,"utf8")},Lt=(e,t)=>{Nt(O.dirname(e),{recursive:!0}),yo(e,t,"utf8")},sl=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,a])=>(typeof a=="string"&&a.trim()&&(o[s]=a),o),{}):{};return{settings:r,runtimeEnv:n}}catch{return null}},al=(e,t)=>{if(typeof t=="string"){Lt(e,t);return}tt(e,{force:!0})},cl=e=>{let t=O.join(e,wo);if(!Re(t))return[];try{let r=JSON.parse(Or(t,"utf8"));return Array.isArray(r.slugs)?r.slugs.filter(n=>typeof n=="string"&&n.trim().length>0):[]}catch{return[]}},ll=(e,t)=>{Br(O.join(e,wo),{slugs:t})},dl=(e,t,r)=>{let n=Co[e],o=O.join(t,n);Nt(o,{recursive:!0});for(let a of cl(o))tt(O.join(o,a),{recursive:!0,force:!0});let s=[];for(let a of r){let c=Mr(a.slug);if(!c)continue;s.push(c);let l=O.join(o,c);tt(l,{recursive:!0,force:!0}),Nt(l,{recursive:!0});for(let[i,d]of Object.entries(a.files)){let u=Mr(i);if(!u)continue;let p=O.resolve(l,u);p!==l&&!p.startsWith(`${l}${O.sep}`)||Lt(p,d)}Re(O.join(l,"SKILL.md"))||Lt(O.join(l,"SKILL.md"),a.markdown)}ll(o,s)},ul=(e,t)=>{if(t.length===0)return"";let r=Co[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(`
38
- `)},pl=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(`
39
- `)},gl=e=>{let t=[],r={},n=0;for(let o of e.mcpServers??[]){if(!o.enabled)continue;let s=Mr(o.id||o.name).replace(/\//g,"-");if(!s)continue;if(o.transport==="stdio"||o.target.startsWith("stdio://")){let c=o.target.replace(/^stdio:\/\//,"").trim();if(!c)continue;t.push(`[mcp_servers."${Ce(s)}"]`,'command = "sh"',`args = ["-lc", "${Ce(c)}"]`,"");continue}if(o.target===fe){if(!e.executorToken?.trim())continue;let c=`${nl}${n}`;n+=1,r[c]=e.executorToken.trim(),t.push(`[mcp_servers."${Ce(s)}"]`,`url = "${Ce(`${e.cloudUrl.replace(/\/+$/,"")}/mcp/executor`)}"`,`bearer_token_env_var = "${c}"`,"");continue}if(!il(o.target))continue;let a=ol(o.target);a&&t.push(`[mcp_servers."${Ce(s)}"]`,`url = "${Ce(a)}"`,"")}return{configText:t.join(`
40
- `),env:r}},ml=(e,t)=>{let r=$e(e.mcpServers??[],{cloudUrl:e.cloudUrl,executorToken:e.executorToken,actingUserId:t});return{mcpServers:Object.entries(r).reduce((o,[s,a])=>{let c=a;return typeof c.command=="string"&&c.command.trim()?(o[s]={command:"sh",args:["-lc",c.command.trim()]},o):(typeof c.url=="string"&&c.url.trim()&&(o[s]={type:"http",url:c.url.trim(),...c.headers&&typeof c.headers=="object"?{headers:c.headers}:{}}),o)},{})}},fl=(e,t)=>{let r=ko(O.join(Ar.tmpdir(),"vibemux-codex-")),n=process.env.CODEX_HOME?.trim()||O.join(Ar.homedir(),".codex"),o=O.join(n,"config.toml"),s=O.join(n,"auth.json"),a=O.join(r,"config.toml"),c=O.join(r,"auth.json");Re(s)&&rl(s,c);let l=t.codexConfigContent?.trim()||(Re(o)?Or(o,"utf8").trim():""),i=[`[projects."${Ce(e)}"]`,'trust_level = "trusted"'].join(`
41
- `),d=gl(t),u=[l,i,d.configText].filter(p=>p.trim());return Lt(a,`${u.join(`
32
+ `).filter(Boolean).at(-1)||"Claude Code \u672A\u8FD4\u56DE\u6587\u672C\u8F93\u51FA\u3002",sessionId:p||void 0})}),Ze(i.stdin,{type:"control_request",request_id:Er(),request:{subtype:"initialize"}}),Ze(i.stdin,{type:"control_request",request_id:Er(),request:{subtype:"set_permission_mode",mode:s}}),Ze(i.stdin,{type:"user",message:{role:"user",content:e.prompt}})})};import{spawn as Yc}from"node:child_process";var Qc=(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}},Zc=e=>({mode:"default",settings:{model:e,reasoning_effort:null,developer_instructions:null}}),el=e=>e==="never"?{command:"acceptForSession",fileChange:"acceptForSession"}:{command:"decline",fileChange:"decline"},tl=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":"")},go=(e,t,r,n)=>{T("Codex",e.onEvent,{type:"message.updated",properties:{info:{id:t,role:"assistant"}}}),T("Codex",e.onEvent,{type:"message.part.updated",properties:{part:{id:`${t}:text`,messageID:t,type:"text",text:r},delta:n}})},mo=(e,t,r,n,o)=>{T("Codex",e.onEvent,{type:"message.part.updated",properties:{part:{id:r,messageID:t,type:"reasoning",text:n},delta:o}})},fo=(e,t,r,n,o,s)=>{let a=r.type==="fileChange"?"apply_patch":"shell",c=r.type==="commandExecution"?r.command:r.type==="fileChange"?JSON.stringify(r.changes??[],null,2):void 0;T("Codex",e.onEvent,{type:"message.part.updated",properties:{part:{id:r.id,messageID:t,type:"tool",tool:a,state:{status:n,raw:c,output:o,error:s}}}})},Rr=(e,t)=>{e.stdin.write(`${JSON.stringify(t)}
33
+ `)},ho=async e=>{let t=Dt("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=Ee(e.executionModel)??Ee(r?.defaultModel),o=el(r?.approval);return new Promise((s,a)=>{let c=Yc(t,["app-server",...e.runtimeArgs??[]],{cwd:e.cwd,env:{...Ut(),...e.runtimeEnv??{}},stdio:["pipe","pipe","pipe"]}),l=1,i="",d="",u="",p="",g="",w=!1,k="",m=new Map,f=new Map,S=new Map,P=h=>{for(let C of m.values())C.reject(h);m.clear()},U=(h,C)=>{let y=l++;return Rr(c,{jsonrpc:"2.0",id:y,method:h,params:C}),new Promise((v,ut)=>{m.set(y,{resolve:ji=>v(ji),reject:ut})})},V=(h,C)=>{Rr(c,{jsonrpc:"2.0",id:h,result:C})},E=()=>{c.killed||c.kill("SIGTERM")},q=()=>{E()};e.signal?.addEventListener("abort",q,{once:!0});let te=h=>{if(h.method==="item/commandExecution/requestApproval"){let C=h.params??{};o.command==="decline"&&T("Codex",e.onEvent,{type:"permission.updated",properties:{title:C.reason?.trim()||C.command?.trim()||"\u547D\u4EE4\u6267\u884C\u6743\u9650"}}),V(h.id,{decision:o.command});return}if(h.method==="item/fileChange/requestApproval"){let C=h.params??{};o.fileChange==="decline"&&T("Codex",e.onEvent,{type:"permission.updated",properties:{title:C.reason?.trim()||"\u6587\u4EF6\u4FEE\u6539\u6743\u9650"}}),V(h.id,{decision:o.fileChange});return}if(h.method==="item/tool/requestUserInput"){let C=h.params??{};T("Codex",e.onEvent,{type:"permission.updated",properties:{title:C.questions?.[0]?.header?.trim()||C.questions?.[0]?.question?.trim()||"\u7B49\u5F85\u7528\u6237\u8F93\u5165"}}),V(h.id,{answers:{}});return}V(h.id,null)},b=(h,C)=>{if(h.type==="agentMessage"){let y=h;k=y.id,f.set(y.id,y.text),y.text.trim()&&(p=y.text.trim()),go(e,y.id,y.text);return}if(h.type==="reasoning"){let y=h,v=y.summary?.join("")||y.content?.join("")||"";v&&(S.set(y.id,v),mo(e,k||`${u||"codex"}:assistant`,`${y.id}:reasoning`,v));return}if(h.type==="commandExecution"){let y=h,v=C==="started"?"running":y.status==="completed"?"completed":"error";fo(e,k||void 0,y,v,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(h.type==="fileChange"){let y=h,v=C==="started"?"running":y.status==="success"?"completed":"error";fo(e,k||void 0,y,v,JSON.stringify(y.changes??[],null,2),y.status==="failed"||y.status==="declined"?"\u6587\u4EF6\u4FEE\u6539\u672A\u5B8C\u6210":void 0)}},B=async h=>{if(h.method==="thread/started"){u=h.params.thread.id;return}if(h.method==="turn/started"){let C=h.params;u=u||C.threadId,T("Codex",e.onEvent,{type:"session.status",properties:{status:{type:"busy",message:"Codex \u6B63\u5728\u5904\u7406\u8BF7\u6C42"}}});return}if(h.method==="item/started"){b(h.params.item,"started");return}if(h.method==="item/completed"){b(h.params.item,"completed");return}if(h.method==="item/agentMessage/delta"){let C=h.params;k=C.itemId;let y=`${f.get(C.itemId)??""}${C.delta??""}`;f.set(C.itemId,y),y.trim()&&(p=y.trim()),go(e,C.itemId,y,C.delta);return}if(h.method==="item/reasoning/textDelta"||h.method==="item/reasoning/summaryTextDelta"){let C=h.params,y=h.method==="item/reasoning/textDelta"?`content:${C.contentIndex??0}`:`summary:${C.summaryIndex??0}`,v=`${C.itemId}:reasoning:${y}`,ut=`${S.get(v)??""}${C.delta??""}`;S.set(v,ut),mo(e,k||`${u||"codex"}:assistant`,v,ut,C.delta);return}if(h.method==="turn/completed"){let C=h.params;u=u||C.threadId,w=C.turn.status==="completed",C.turn.status==="failed"?(g=tl(C.turn)||"Codex \u6267\u884C\u5931\u8D25",T("Codex",e.onEvent,{type:"session.error",properties:{error:g}})):T("Codex",e.onEvent,{type:"session.status",properties:{status:{type:"idle",message:"Codex \u5DF2\u5B8C\u6210"}}}),E();return}h.method==="error"&&(g=h.params.message?.trim()||"Codex \u6267\u884C\u5931\u8D25",T("Codex",e.onEvent,{type:"session.error",properties:{error:g}}),E())},D=h=>{let C=h.trim();if(!C)return;let y=Ye(C);if(y){if(typeof y.id<"u"&&(typeof y.result<"u"||typeof y.error<"u")){let v=m.get(y.id);if(!v)return;if(m.delete(y.id),y.error){v.reject(new Error(y.error.message||"Codex app-server \u8BF7\u6C42\u5931\u8D25"));return}v.resolve(y.result);return}if(typeof y.id<"u"&&typeof y.method=="string"){te(y);return}typeof y.method=="string"&&B(y)}};c.stdout.on("data",h=>{i+=h.toString();let C=i.split(`
34
+ `);i=C.pop()??"";for(let y of C)D(y)}),c.stderr.on("data",h=>{d+=h.toString()}),c.on("error",h=>{e.signal?.removeEventListener("abort",q),P(h),a(h)}),c.on("close",h=>{if(e.signal?.removeEventListener("abort",q),i.trim()&&D(i),e.signal?.aborted){P(Qe()),a(Qe());return}if(!w||g){let C=new Error(g||d.trim().split(`
35
+ `).filter(Boolean).at(-1)||`Codex \u6267\u884C\u5931\u8D25\uFF08\u9000\u51FA\u7801 ${h??-1}\uFF09`);P(C),a(C);return}P(new Error("Codex \u4F1A\u8BDD\u5DF2\u7ED3\u675F")),s({output:p||"Codex \u672A\u8FD4\u56DE\u6587\u672C\u8F93\u51FA\u3002",sessionId:u||void 0})}),(async()=>{try{await U("initialize",{clientInfo:{name:"vibemux-worker",version:"0.1.1"},capabilities:{experimentalApi:!0}}),Rr(c,{jsonrpc:"2.0",method:"initialized"});let h=await U("account/read",{refreshToken:!1});if(h.requiresOpenaiAuth&&!h.account)throw new Error("Codex \u9700\u8981\u5148\u767B\u5F55\u540E\u624D\u80FD\u6267\u884C\u3002");let C=await U("thread/start",Qc(e.cwd,n,r));u=C.thread.id,await U("turn/start",{threadId:u,input:[{type:"text",text:e.prompt,text_elements:[]}],collaborationMode:Zc(C.model)})}catch(h){g=h instanceof Error?h.message:"Codex \u521D\u59CB\u5316\u5931\u8D25",T("Codex",e.onEvent,{type:"session.error",properties:{error:g}}),E()}})()})};import{mkdtemp as rl,mkdir as nl,rm as ko,writeFile as ol}from"node:fs/promises";import il from"node:os";import et from"node:path";var sl={"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"},al=(e,t)=>{let r=et.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}`},cl=(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()},ll=(e,t)=>{let r=et.extname(e);return r||t&&sl[t]||""},yo=async e=>{let t=e.attachments??[];if(t.length===0)return{attachments:[],cleanup:async()=>{}};let r=et.join(il.tmpdir(),"vibemux-task-chat-attachments-");await nl(et.dirname(r),{recursive:!0});let n=await rl(r);try{return{attachments:await Promise.all(t.map(async(s,a)=>{let c=cl(e.cloudUrl,s.url),l=await fetch(c,{signal:e.signal});if(!l.ok)throw new Error(`\u56FE\u7247\u9644\u4EF6\u4E0B\u8F7D\u5931\u8D25\uFF1A${s.filename}`);let i=l.headers.get("content-type")?.split(";")[0]?.trim()||s.contentType,d=ll(s.filename,i),u=al(`${a+1}-${s.filename||`image-${a+1}`}${d&&!s.filename.endsWith(d)?d:""}`,`image-${a+1}`),p=et.join(n,u),g=Buffer.from(await l.arrayBuffer());return await ol(p,g),{...s,contentType:i,absoluteUrl:c,localPath:p}})),cleanup:async()=>{await ko(n,{recursive:!0,force:!0})}}}catch(o){throw await ko(n,{recursive:!0,force:!0}).catch(()=>{}),o}},wo=(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(`
36
+ `)};import{copyFileSync as dl,existsSync as Re,mkdirSync as Nt,mkdtempSync as Co,readFileSync as Or,rmSync as tt,writeFileSync as xo}from"node:fs";import Ar from"node:os";import O from"node:path";var So=".vibemux-managed.json",ul="VIBEMUX_CODEX_MCP_TOKEN_",bo={OpenCode:".opencode/skills",Codex:".codex/skills",ClaudeCode:".claude/skills"},Ce=e=>e.replace(/\\/g,"\\\\").replace(/"/g,'\\"'),Mr=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("/")},pl=e=>e.startsWith("sse://")?`http://${e.slice(6)}`:e.trim(),gl=e=>/^https?:\/\//i.test(e)||/^sse:\/\//i.test(e),Br=(e,t)=>{Nt(O.dirname(e),{recursive:!0}),xo(e,`${JSON.stringify(t,null,2)}
37
+ `,"utf8")},Lt=(e,t)=>{Nt(O.dirname(e),{recursive:!0}),xo(e,t,"utf8")},ml=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,a])=>(typeof a=="string"&&a.trim()&&(o[s]=a),o),{}):{};return{settings:r,runtimeEnv:n}}catch{return null}},fl=(e,t)=>{if(typeof t=="string"){Lt(e,t);return}tt(e,{force:!0})},hl=e=>{let t=O.join(e,So);if(!Re(t))return[];try{let r=JSON.parse(Or(t,"utf8"));return Array.isArray(r.slugs)?r.slugs.filter(n=>typeof n=="string"&&n.trim().length>0):[]}catch{return[]}},kl=(e,t)=>{Br(O.join(e,So),{slugs:t})},yl=(e,t,r)=>{let n=bo[e],o=O.join(t,n);Nt(o,{recursive:!0});for(let a of hl(o))tt(O.join(o,a),{recursive:!0,force:!0});let s=[];for(let a of r){let c=Mr(a.slug);if(!c)continue;s.push(c);let l=O.join(o,c);tt(l,{recursive:!0,force:!0}),Nt(l,{recursive:!0});for(let[i,d]of Object.entries(a.files)){let u=Mr(i);if(!u)continue;let p=O.resolve(l,u);p!==l&&!p.startsWith(`${l}${O.sep}`)||Lt(p,d)}Re(O.join(l,"SKILL.md"))||Lt(O.join(l,"SKILL.md"),a.markdown)}kl(o,s)},wl=(e,t)=>{if(t.length===0)return"";let r=bo[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(`
38
+ `)},Cl=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(`
39
+ `)},xl=e=>{let t=[],r={},n=0;for(let o of e.mcpServers??[]){if(!o.enabled)continue;let s=Mr(o.id||o.name).replace(/\//g,"-");if(!s)continue;if(o.transport==="stdio"||o.target.startsWith("stdio://")){let c=o.target.replace(/^stdio:\/\//,"").trim();if(!c)continue;t.push(`[mcp_servers."${Ce(s)}"]`,'command = "sh"',`args = ["-lc", "${Ce(c)}"]`,"");continue}if(o.target===fe){if(!e.executorToken?.trim())continue;let c=`${ul}${n}`;n+=1,r[c]=e.executorToken.trim(),t.push(`[mcp_servers."${Ce(s)}"]`,`url = "${Ce(`${e.cloudUrl.replace(/\/+$/,"")}/mcp/executor`)}"`,`bearer_token_env_var = "${c}"`,"");continue}if(!gl(o.target))continue;let a=pl(o.target);a&&t.push(`[mcp_servers."${Ce(s)}"]`,`url = "${Ce(a)}"`,"")}return{configText:t.join(`
40
+ `),env:r}},Sl=(e,t)=>{let r=$e(e.mcpServers??[],{cloudUrl:e.cloudUrl,executorToken:e.executorToken,actingUserId:t});return{mcpServers:Object.entries(r).reduce((o,[s,a])=>{let c=a;return typeof c.command=="string"&&c.command.trim()?(o[s]={command:"sh",args:["-lc",c.command.trim()]},o):(typeof c.url=="string"&&c.url.trim()&&(o[s]={type:"http",url:c.url.trim(),...c.headers&&typeof c.headers=="object"?{headers:c.headers}:{}}),o)},{})}},bl=(e,t)=>{let r=Co(O.join(Ar.tmpdir(),"vibemux-codex-")),n=process.env.CODEX_HOME?.trim()||O.join(Ar.homedir(),".codex"),o=O.join(n,"config.toml"),s=O.join(n,"auth.json"),a=O.join(r,"config.toml"),c=O.join(r,"auth.json");Re(s)&&dl(s,c);let l=t.codexConfigContent?.trim()||(Re(o)?Or(o,"utf8").trim():""),i=[`[projects."${Ce(e)}"]`,'trust_level = "trusted"'].join(`
41
+ `),d=xl(t),u=[l,i,d.configText].filter(p=>p.trim());return Lt(a,`${u.join(`
42
42
 
43
43
  `)}
44
- `),{runtimeEnv:{CODEX_HOME:r,...d.env},cleanup:()=>{tt(r,{recursive:!0,force:!0})}}},hl=(e,t)=>{let r=ko(O.join(Ar.tmpdir(),"vibemux-claude-")),n=O.join(r,"mcp.json");return Br(n,ml(e,t)),{runtimeArgs:["--mcp-config",n],cleanup:()=>{tt(r,{recursive:!0,force:!0})}}},kl=(e,t,r)=>{let n=hl(t,r),o=O.join(e,".claude","settings.local.json"),s=Re(o)?Or(o,"utf8"):void 0,a=t.claudeCodeConfigContent?.trim(),c=a?sl(a):null;if(a){if(!c)throw n.cleanup(),new Error("Claude Code settings.json \u683C\u5F0F\u4E0D\u6B63\u786E\u3002");Br(o,c.settings)}return{runtimeArgs:n.runtimeArgs,runtimeEnv:c?.runtimeEnv??{},cleanup:()=>{a&&al(o,s),n.cleanup()}}},jt=(e,t)=>{let r=t.trim();return r?[r,"",e].join(`
45
- `):e},Wr=e=>{let t=e.workerConfig??x(),r=e.mcpServers?{...t,mcpServers:e.mcpServers}:t,n=e.runtimeSkillPackages??[];Re(e.cwd)&&dl(e.agentType,e.cwd,n);let o=ul(e.agentType,n),s=pl(r),a=[o,s].filter(Boolean).join(`
44
+ `),{runtimeEnv:{CODEX_HOME:r,...d.env},cleanup:()=>{tt(r,{recursive:!0,force:!0})}}},vl=(e,t)=>{let r=Co(O.join(Ar.tmpdir(),"vibemux-claude-")),n=O.join(r,"mcp.json");return Br(n,Sl(e,t)),{runtimeArgs:["--mcp-config",n],cleanup:()=>{tt(r,{recursive:!0,force:!0})}}},Pl=(e,t,r)=>{let n=vl(t,r),o=O.join(e,".claude","settings.local.json"),s=Re(o)?Or(o,"utf8"):void 0,a=t.claudeCodeConfigContent?.trim(),c=a?ml(a):null;if(a){if(!c)throw n.cleanup(),new Error("Claude Code settings.json \u683C\u5F0F\u4E0D\u6B63\u786E\u3002");Br(o,c.settings)}return{runtimeArgs:n.runtimeArgs,runtimeEnv:c?.runtimeEnv??{},cleanup:()=>{a&&fl(o,s),n.cleanup()}}},jt=(e,t)=>{let r=t.trim();return r?[r,"",e].join(`
45
+ `):e},Wr=e=>{let t=e.workerConfig??x(),r=e.mcpServers?{...t,mcpServers:e.mcpServers}:t,n=e.runtimeSkillPackages??[];Re(e.cwd)&&yl(e.agentType,e.cwd,n);let o=wl(e.agentType,n),s=Cl(r),a=[o,s].filter(Boolean).join(`
46
46
 
47
- `);if(e.agentType==="Codex"){let c=fl(e.cwd,r);return{promptPrefix:a,runtimeEnv:c.runtimeEnv,runtimeArgs:[],cleanup:c.cleanup}}if(e.agentType==="ClaudeCode"){let c=kl(e.cwd,r,e.actingUserId);return{promptPrefix:a,runtimeEnv:c.runtimeEnv,runtimeArgs:c.runtimeArgs,cleanup:c.cleanup}}return{promptPrefix:a,runtimeEnv:{},runtimeArgs:[],cleanup:()=>{}}};var yl=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(`
48
- `),_r=async e=>{if(!e.skipRuntimeCheck){let s=await se({autoInstall:!0,target:e.agentType});if(!s.ok)throw new Error(s.message)}let t=await fo({attachments:e.attachments,cloudUrl:e.cloudUrl,signal:e.signal}),r=e.runtimePrepared?{promptPrefix:"",runtimeEnv:e.runtimeEnv??{},runtimeArgs:e.runtimeArgs??[],cleanup:()=>{}}:Wr({agentType:e.agentType,cwd:e.cwd,actingUserId:e.actingUserId,runtimeSkillPackages:e.runtimeSkillPackages,mcpServers:e.mcpServers}),n={...r.runtimeEnv,...e.runtimeEnv??{}},o=ho(jt(e.prompt,r.promptPrefix),t.attachments);try{return e.agentType==="OpenCode"?await ao({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=>{T("OpenCode",e.onEvent,s)}}):e.agentType==="Codex"?await go({...e,prompt:o,runtimeEnv:n,runtimeArgs:r.runtimeArgs}):await co({...e,prompt:o,runtimeEnv:n,runtimeArgs:r.runtimeArgs})}finally{await t.cleanup(),r.cleanup()}},$r=async e=>{if(!e.skipRuntimeCheck&&e.agentType==="OpenCode"){let n=await se({autoInstall:!0,target:e.agentType});if(!n.ok)throw new Error(n.message)}let t=Wr({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 so({actingUserId:e.actingUserId,cwd:e.cwd,title:e.title,description:jt(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 _r({agentType:e.agentType,actingUserId:e.actingUserId,cwd:e.cwd,title:e.title,prompt:jt(yl(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()}};import Po from"node:os";import To from"node:path";import{simpleGit as Al}from"simple-git";import{chmodSync as xo,mkdirSync as wl,rmSync as Cl,writeFileSync as So}from"node:fs";import xl from"node:os";import Ur from"node:path";var Dr=e=>e.replace(/\\/g,"\\\\").replace(/`/g,"\\`").replace(/\$/g,"\\$"),Sl=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}},bl=e=>{let t=Sl(e);if(!t)return null;try{return new URL(`ssh://${t}`).hostname.toLowerCase()}catch{return t.toLowerCase().replace(/:\d+$/,"")}},bo=e=>{let t=bl(e);return t?t==="github.com"||t.endsWith(".github.com")?"github":t==="gitlab.com"||t.endsWith(".gitlab.com")||t.includes("gitlab")?"gitlab":"generic":null},vl=(e,t)=>{let r=t.provider??bo(e);return r==="github"?"x-access-token":r==="gitlab"?"oauth2":t.email?.trim()||t.name?.trim()||"git"},Il=e=>{let t=bo(e);return t==="github"?"GitHub":t==="gitlab"?"GitLab":"Git"},Pl=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},L=(e,t)=>{let r=e instanceof Error?e.message:typeof e=="string"?e:"";if(!Pl(r))return e instanceof Error?e:new Error(r||"Git \u64CD\u4F5C\u5931\u8D25\u3002");let n=Il(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`)},Tl=(e,t,r)=>{let n=vl(r,t),o=t.credentialToken||"",s=Ur.join(e,"git-askpass.js"),a=`#!/usr/bin/env node
47
+ `);if(e.agentType==="Codex"){let c=bl(e.cwd,r);return{promptPrefix:a,runtimeEnv:c.runtimeEnv,runtimeArgs:[],cleanup:c.cleanup}}if(e.agentType==="ClaudeCode"){let c=Pl(e.cwd,r,e.actingUserId);return{promptPrefix:a,runtimeEnv:c.runtimeEnv,runtimeArgs:c.runtimeArgs,cleanup:c.cleanup}}return{promptPrefix:a,runtimeEnv:{},runtimeArgs:[],cleanup:()=>{}}};var Il=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(`
48
+ `),_r=async e=>{if(!e.skipRuntimeCheck){let s=await se({autoInstall:!0,target:e.agentType});if(!s.ok)throw new Error(s.message)}let t=await yo({attachments:e.attachments,cloudUrl:e.cloudUrl,signal:e.signal}),r=e.runtimePrepared?{promptPrefix:"",runtimeEnv:e.runtimeEnv??{},runtimeArgs:e.runtimeArgs??[],cleanup:()=>{}}:Wr({agentType:e.agentType,cwd:e.cwd,actingUserId:e.actingUserId,runtimeSkillPackages:e.runtimeSkillPackages,mcpServers:e.mcpServers}),n={...r.runtimeEnv,...e.runtimeEnv??{}},o=wo(jt(e.prompt,r.promptPrefix),t.attachments);try{return e.agentType==="OpenCode"?await uo({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=>{T("OpenCode",e.onEvent,s)}}):e.agentType==="Codex"?await ho({...e,prompt:o,runtimeEnv:n,runtimeArgs:r.runtimeArgs}):await po({...e,prompt:o,runtimeEnv:n,runtimeArgs:r.runtimeArgs})}finally{await t.cleanup(),r.cleanup()}},$r=async e=>{if(!e.skipRuntimeCheck&&e.agentType==="OpenCode"){let n=await se({autoInstall:!0,target:e.agentType});if(!n.ok)throw new Error(n.message)}let t=Wr({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 lo({actingUserId:e.actingUserId,cwd:e.cwd,title:e.title,description:jt(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 _r({agentType:e.agentType,actingUserId:e.actingUserId,cwd:e.cwd,title:e.title,prompt:jt(Il(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()}};import Ro from"node:os";import Ao from"node:path";import{simpleGit as Dl}from"simple-git";import{chmodSync as vo,mkdirSync as Tl,rmSync as El,writeFileSync as Po}from"node:fs";import Rl from"node:os";import Dr from"node:path";var Ur=e=>e.replace(/\\/g,"\\\\").replace(/`/g,"\\`").replace(/\$/g,"\\$"),Al=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}},Ml=e=>{let t=Al(e);if(!t)return null;try{return new URL(`ssh://${t}`).hostname.toLowerCase()}catch{return t.toLowerCase().replace(/:\d+$/,"")}},Io=e=>{let t=Ml(e);return t?t==="github.com"||t.endsWith(".github.com")?"github":t==="gitlab.com"||t.endsWith(".gitlab.com")||t.includes("gitlab")?"gitlab":"generic":null},Ol=(e,t)=>{let r=t.provider??Io(e);return r==="github"?"x-access-token":r==="gitlab"?"oauth2":t.email?.trim()||t.name?.trim()||"git"},Bl=e=>{let t=Io(e);return t==="github"?"GitHub":t==="gitlab"?"GitLab":"Git"},Wl=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},L=(e,t)=>{let r=e instanceof Error?e.message:typeof e=="string"?e:"";if(!Wl(r))return e instanceof Error?e:new Error(r||"Git \u64CD\u4F5C\u5931\u8D25\u3002");let n=Bl(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`)},_l=(e,t,r)=>{let n=Ol(r,t),o=t.credentialToken||"",s=Dr.join(e,"git-askpass.js"),a=`#!/usr/bin/env node
49
49
  const prompt = (process.argv[2] || '').toLowerCase()
50
50
  if (prompt.includes('username')) {
51
- process.stdout.write(\`${Dr(n)}\`)
51
+ process.stdout.write(\`${Ur(n)}\`)
52
52
  process.exit(0)
53
53
  }
54
54
  if (prompt.includes('password')) {
55
- process.stdout.write(\`${Dr(o)}\`)
55
+ process.stdout.write(\`${Ur(o)}\`)
56
56
  process.exit(0)
57
57
  }
58
- process.stdout.write(\`${Dr(o)}\`)
59
- `;return So(s,a,{encoding:"utf8",mode:448}),xo(s,448),s},El=e=>`ssh -i "${e}" -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null`,vo=e=>{let t=Ur.join(xl.tmpdir(),"vibemux-git",e.taskId);wl(t,{recursive:!0});let r={...process.env,GIT_TERMINAL_PROMPT:"0"};if(e.identity.authMode==="ssh"&&e.identity.credentialToken){let n=Ur.join(t,"id_ed25519");So(n,e.identity.credentialToken,{encoding:"utf8",mode:384}),xo(n,384),r.GIT_SSH_COMMAND=El(n)}else e.identity.credentialToken&&(r.GIT_ASKPASS=Tl(t,e.identity,e.repoUrl));return{env:r,tempDir:t,cleanup(){Cl(t,{recursive:!0,force:!0})}}};import{spawnSync as Rl}from"node:child_process";var rt=(e,t,r)=>{let n=Rl("git",t,{cwd:e,env:r,encoding:"utf8"});if(n.status!==0)throw new Error((n.stderr||n.stdout||"git command failed").trim())},Gt=(e,t,r)=>{try{rt(e,t,r)}catch{return}},ae=e=>{let t=vo({taskId:e.taskId,identity:e.identity,repoUrl:e.repoUrl});return{env:t.env,tempDir:t.tempDir,configureRepo(r){e.identity.name&&e.identity.email&&(rt(r,["config","--local","user.name",e.identity.name],t.env),rt(r,["config","--local","user.email",e.identity.email],t.env)),t.env.GIT_SSH_COMMAND&&rt(r,["config","--local","core.sshCommand",t.env.GIT_SSH_COMMAND],t.env),t.env.GIT_ASKPASS&&rt(r,["config","--local","core.askPass",t.env.GIT_ASKPASS],t.env)},cleanup(r){r&&(e.identity.name&&e.identity.email&&(Gt(r,["config","--local","--unset-all","user.name"],t.env),Gt(r,["config","--local","--unset-all","user.email"],t.env)),Gt(r,["config","--local","--unset-all","core.askPass"],t.env),Gt(r,["config","--local","--unset-all","core.sshCommand"],t.env)),t.cleanup()}}},Io=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 nt="main",Ml=e=>{let t=e.trim();return t?t==="~"?Po.homedir():t.startsWith("~/")?To.join(Po.homedir(),t.slice(2)):t:""},Ol=e=>To.resolve(Ml(e)),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},Eo=(e,t)=>{let r=new Map;for(let n of t.split(`
58
+ process.stdout.write(\`${Ur(o)}\`)
59
+ `;return Po(s,a,{encoding:"utf8",mode:448}),vo(s,448),s},$l=e=>`ssh -i "${e}" -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null`,To=e=>{let t=Dr.join(Rl.tmpdir(),"vibemux-git",e.taskId);Tl(t,{recursive:!0});let r={...process.env,GIT_TERMINAL_PROMPT:"0"};if(e.identity.authMode==="ssh"&&e.identity.credentialToken){let n=Dr.join(t,"id_ed25519");Po(n,e.identity.credentialToken,{encoding:"utf8",mode:384}),vo(n,384),r.GIT_SSH_COMMAND=$l(n)}else e.identity.credentialToken&&(r.GIT_ASKPASS=_l(t,e.identity,e.repoUrl));return{env:r,tempDir:t,cleanup(){El(t,{recursive:!0,force:!0})}}};import{spawnSync as Ul}from"node:child_process";var rt=(e,t,r)=>{let n=Ul("git",t,{cwd:e,env:r,encoding:"utf8"});if(n.status!==0)throw new Error((n.stderr||n.stdout||"git command failed").trim())},Gt=(e,t,r)=>{try{rt(e,t,r)}catch{return}},ae=e=>{let t=To({taskId:e.taskId,identity:e.identity,repoUrl:e.repoUrl});return{env:t.env,tempDir:t.tempDir,configureRepo(r){e.identity.name&&e.identity.email&&(rt(r,["config","--local","user.name",e.identity.name],t.env),rt(r,["config","--local","user.email",e.identity.email],t.env)),t.env.GIT_SSH_COMMAND&&rt(r,["config","--local","core.sshCommand",t.env.GIT_SSH_COMMAND],t.env),t.env.GIT_ASKPASS&&rt(r,["config","--local","core.askPass",t.env.GIT_ASKPASS],t.env)},cleanup(r){r&&(e.identity.name&&e.identity.email&&(Gt(r,["config","--local","--unset-all","user.name"],t.env),Gt(r,["config","--local","--unset-all","user.email"],t.env)),Gt(r,["config","--local","--unset-all","core.askPass"],t.env),Gt(r,["config","--local","--unset-all","core.sshCommand"],t.env)),t.cleanup()}}},Eo=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 nt="main",Nl=e=>{let t=e.trim();return t?t==="~"?Ro.homedir():t.startsWith("~/")?Ao.join(Ro.homedir(),t.slice(2)):t:""},Ll=e=>Ao.resolve(Nl(e)),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},Mo=(e,t)=>{let r=new Map;for(let n of t.split(`
60
60
  `).map(o=>o.trim()).filter(Boolean)){let o=n.split(" "),s=o[0]||"M",a=o.length>2?`${o[1]} \u2192 ${o[2]}`:o[1]||"";a&&r.set(a,s)}return e.split(`
61
- `).map(n=>n.trim()).filter(Boolean).map(n=>n.split(" ")).map(n=>{if(n.length<3)return null;let o=n[0]==="-"?0:Number(n[0]),s=n[1]==="-"?0:Number(n[1]),a=n.length>3?`${n[2]} \u2192 ${n[3]}`:n[2];return{path:a,status:r.get(a)||"M",additions:Number.isFinite(o)?o:0,deletions:Number.isFinite(s)?s:0}}).filter(n=>!!n)},Ro=async(e,t)=>{let r=ue(t)||nt;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`)},ot=async e=>{let t=await e.branchLocal();return ue(t.current)||"HEAD"},Bl=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}},Wl=async(e,t)=>{try{return(await e.raw(["rev-list","--parents","-n","1",t])).trim().split(/\s+/).filter(Boolean)[1]}catch{return}},_l=async e=>{try{return(await e.raw(["diff","--name-only","--diff-filter=U"])).split(`
62
- `).map(r=>r.trim()).filter(Boolean)}catch{return[]}},$l=e=>{let t=e.trim();return!t.startsWith("(")||!t.endsWith(")")?[]:t.slice(1,-1).split(",").map(r=>r.trim()).filter(Boolean)},Dl=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},Ul=e=>e.split("").map(t=>t.trim()).filter(Boolean).map(t=>{let[r="",n="",o="",s="",a="",c=""]=t.split(""),l=$l(o);return{sha:r,shortSha:r.slice(0,7),parents:n.split(" ").map(i=>i.trim()).filter(Boolean),subject:s.trim(),authorDate:a.trim(),authorName:c.trim(),refs:l,isHead:l.some(i=>i.startsWith("HEAD"))}}),Ae=async e=>{let t=Ol(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=Al(t).env(r.env);return await e.run(n)}finally{r.cleanup(t)}},Ao=async e=>{try{return await Ae({...e,taskKey:"git-diff",run:async t=>{let{baseBranch:r,baseRef:n}=await Ro(t,e.baseBranch),o=await ot(t),[s,a,c,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"]),Bl(t,n)]),i=Eo(s,a);return{ok:!0,message:i.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:i,patch:c}}})}catch(t){let r=L(t,e.repoUrl);return{ok:!1,message:r instanceof Error?r.message:"\u8BFB\u53D6 Git diff \u5931\u8D25\u3002",baseBranch:ue(e.baseBranch)||nt,currentBranch:"HEAD",aheadCommits:0,files:[],patch:""}}},Mo=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 Wl(t,r),[o,s,a]=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])]),c=Eo(s,a);return{ok:!0,message:c.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:c,patch:o}}})}catch(t){let r=L(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:""}}},Oo=async e=>{try{return await Ae({...e,taskKey:"git-rebase",run:async t=>{let{baseBranch:r,baseRef:n}=await Ro(t,e.baseBranch),o=await ot(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 a=await _l(t),c=L(s,e.repoUrl);return{ok:!1,message:a.length>0?`rebase \u53D1\u751F\u51B2\u7A81\uFF0C\u8BF7\u5148\u89E3\u51B3\u51B2\u7A81\u540E\u518D\u7EE7\u7EED\u3002${c instanceof Error?` ${c.message}`:""}`.trim():c instanceof Error?c.message:"\u6267\u884C rebase \u5931\u8D25\u3002",baseBranch:r,currentBranch:o,conflicts:a.length>0,conflictedFiles:a}}}})}catch(t){let r=L(t,e.repoUrl);return{ok:!1,message:r instanceof Error?r.message:"\u6267\u884C rebase \u5931\u8D25\u3002",baseBranch:ue(e.baseBranch)||nt,currentBranch:"HEAD",conflicts:!1,conflictedFiles:[]}}},Bo=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 ot(r),o=ue(e.baseBranch)||nt,s=await r.raw(["log","--decorate=short","--date=short","--topo-order",`--max-count=${t}`,"--all","--format=%H%x1f%P%x1f%d%x1f%s%x1f%cd%x1f%an%x1e"]),a=await r.raw(["log","--graph","--decorate","--date=short",`--max-count=${t}`,"--all","--no-color","--pretty=format:%h %d %s (%cd)"]),c=Ul(s);return{ok:!0,message:"\u5DF2\u52A0\u8F7D Git graph\u3002",baseBranch:o,currentBranch:n,limit:t,commitCount:c.length,graph:a,commits:c}}})}catch(r){let n=L(r,e.repoUrl);return{ok:!1,message:n instanceof Error?n.message:"\u8BFB\u53D6 Git graph \u5931\u8D25\u3002",baseBranch:ue(e.baseBranch)||nt,currentBranch:"HEAD",limit:t,commitCount:0,graph:"",commits:[]}}},Wo=async e=>{try{return await Ae({...e,taskKey:"git-push",run:async t=>{let r=e.branchName?.trim()||await ot(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=L(t,e.repoUrl);return{ok:!1,message:r instanceof Error?r.message:"\u63A8\u9001\u5206\u652F\u5931\u8D25\u3002",branchName:e.branchName?.trim()||"",remoteBranch:""}}},_o=async e=>{try{return await Ae({worktreePath:e.worktreePath,repoUrl:e.repoUrl,gitIdentity:e.gitIdentity,taskKey:"git-pull-request",run:async t=>{let r=Dl(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 ot(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 a=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})}),c=await a.json().catch(()=>({}));if(!a.ok){let l=Array.isArray(c.errors)?c.errors.map(i=>i.message).filter(Boolean).join("\uFF1B"):"";return{ok:!1,message:[c.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:c.number,url:c.html_url,state:c.state}}})}catch(t){let r=L(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 Nl,stat as Nr}from"node:fs/promises";import $o from"node:os";import xe from"node:path";import{simpleGit as it}from"simple-git";var ce="main",Ll=e=>{let t=e.trim();return t?t==="~"?$o.homedir():t.startsWith("~/")?xe.join($o.homedir(),t.slice(2)):t:""},qt=e=>xe.resolve(Ll(e)),jl=(e,t)=>{let r=xe.relative(e,t);return r===""||!r.startsWith("..")&&!xe.isAbsolute(r)},Gl=(e,t)=>{let r=qt(e),n=t?.trim()?qt(t):r;return{resolvedRootPath:r,requestedPath:n}},Q=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},Do=async(e,t,r)=>{let n=it(e).env(r??{}),[o,s]=await Promise.all([n.branch(["-a"]),n.branchLocal()]),a="";try{a=Q(await n.raw(["symbolic-ref","--quiet","--short","refs/remotes/origin/HEAD"]))}catch{a=""}let c=Array.from(new Set(o.all.map(Q).filter(Boolean))).sort((u,p)=>u.localeCompare(p)),l=Q(t??""),i=Q(s.current),d=[a,l,i,c[0],ce].find(u=>u&&(u===ce||c.includes(u)))??ce;return{branches:c,defaultBranch:d}},ql=e=>{for(let t of e.split(`
63
- `)){let r=t.trim();if(!r.startsWith("ref: "))continue;let[n]=r.split(" ");return Q(n.slice(5))}return""},Hl=e=>Array.from(new Set(e.split(`
64
- `).map(t=>t.trim()).filter(Boolean).map(t=>t.split(" ")[1]||"").map(Q).filter(Boolean))).sort((t,r)=>t.localeCompare(r)),Jl=async(e,t,r)=>{if(t?.trim())return t.trim();let n=it(e).env(r??{});return await n.checkIsRepo()&&(await n.getRemotes(!0)).find(s=>s.name==="origin")?.refs.fetch?.trim()||""},Fl=async(e,t,r,n)=>{let o=await Jl(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=it().env(n??{}),[a,c]=await Promise.all([s.raw(["ls-remote","--heads",o]),s.raw(["ls-remote","--symref",o,"HEAD"])]),l=Hl(a),i=ql(c),d=Q(r??""),u=[i,d,l[0],ce].find(p=>p&&(p===ce||l.includes(p)))??ce;return{branches:l,defaultBranch:u,remoteTarget:o}},Uo=async e=>{let t=qt(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=xe.basename(t);try{let n=it(t);if(!await n.checkIsRepo())return{ok:!0,path:t,name:r,versionControl:"none",message:"\u76EE\u5F55\u65E0 Git \u4ED3\u5E93"};let a=(await n.getRemotes(!0)).find(u=>u.name==="origin"),c=await Do(t),l=c.branches.length,i=a?.refs.fetch?.trim()||"",d=i?"git-remote":"git-local";return{ok:!0,path:t,name:r,versionControl:d,gitUrl:i,defaultBranch:c.defaultBranch,message:l>0?d==="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`:d==="git-remote"?"\u5DF2\u68C0\u6D4B\u5230 Git \u4ED3\u5E93":"\u5DF2\u68C0\u6D4B\u5230\u672C\u5730 Git \u4ED3\u5E93\uFF08\u672A\u7ED1\u5B9A\u8FDC\u7AEF\uFF09"}}catch{return{ok:!0,path:t,name:r,message:"\u65E0\u6CD5\u8BFB\u53D6 Git \u4FE1\u606F"}}},No=async(e,t)=>{let{resolvedRootPath:r,requestedPath:n}=Gl(e,t);if(!jl(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 Nl(n,{withFileTypes:!0})).filter(a=>a.isDirectory()).map(a=>({name:a.name,path:xe.join(n,a.name)})).sort((a,c)=>a.name.localeCompare(c.name,"zh-Hans-CN"));return{ok:!0,path:n,rootPath:r,parentPath:n===r?void 0:xe.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"}}},Lo=async(e,t,r,n)=>{let o=qt(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 a=await Fl(o,t,r,s.env);return console.log("[worker] [repo-branches] remote snapshot resolved",JSON.stringify({localPath:o,remoteTarget:a.remoteTarget,branchCount:a.branches.length,defaultBranch:a.defaultBranch})),{ok:!0,branches:a.branches,defaultBranch:a.defaultBranch}}catch(a){let c=L(a,t);console.log("[worker] [repo-branches] remote snapshot failed",JSON.stringify({localPath:o,error:c instanceof Error?c.message:"unknown"}));try{if(!(await Nr(o)).isDirectory())return{ok:!1,branches:[],defaultBranch:Q(r??"")||ce,message:c instanceof Error?c.message:"\u8BFB\u53D6\u5206\u652F\u5217\u8868\u5931\u8D25\u3002"};if(!await it(o).env(s.env).checkIsRepo())return console.log("[worker] [repo-branches] fallback skipped: path is not repo",JSON.stringify({localPath:o})),{ok:!1,branches:[],defaultBranch:Q(r??"")||ce,message:c instanceof Error?c.message:"\u8BFB\u53D6\u5206\u652F\u5217\u8868\u5931\u8D25\u3002"};let d=await Do(o,r,s.env);return console.log("[worker] [repo-branches] local fallback resolved",JSON.stringify({localPath:o,branchCount:d.branches.length,defaultBranch:d.defaultBranch})),{ok:!0,branches:d.branches,defaultBranch:d.defaultBranch}}catch(l){let i=L(l,t);console.log("[worker] [repo-branches] local fallback failed",JSON.stringify({localPath:o,error:i instanceof Error?i.message:"unknown"}))}return{ok:!1,branches:[],defaultBranch:Q(r??"")||ce,message:c instanceof Error?c.message:"\u8BFB\u53D6\u5206\u652F\u5217\u8868\u5931\u8D25\u3002"}}finally{s.cleanup()}};import{readdir as Jo,readFile as Fo,stat as Go}from"node:fs/promises";import qo from"node:os";import z from"node:path";var jo=e=>(e??"").trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||null;var zl=["skills",".agents/skills",".codex/skills",".claude/skills",".cursor/skills",".opencode/skills"],Vl=new Set([".md",".txt",".json",".yml",".yaml",".ts",".tsx",".js",".jsx",".mjs",".cjs",".sh",".py",".rb"]),Kl=e=>{let t=e.trim();return t?t==="~"?qo.homedir():t.startsWith("~/")?z.join(qo.homedir(),t.slice(2)):t:""},Ho=e=>z.resolve(Kl(e)),Xl=(e,t)=>{let r=z.relative(e,t);return r===""||!r.startsWith("..")&&!z.isAbsolute(r)},Yl=e=>{let t=e.match(/^---\n([\s\S]*?)\n---/);if(!t)return{};let r={};for(let n of t[1].split(`
65
- `)){let[o,...s]=n.split(":"),a=o.trim().toLowerCase(),c=s.join(":").trim().replace(/^"|"$/g,"");c&&(a==="name"&&(r.name=c),a==="description"&&(r.description=c))}return r},Ql=(e,t)=>{let r=Yl(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:z.basename(t),description:r.description?.trim()||null}},Zl=e=>{let t=e.replace(/\\/g,"/");return t==="SKILL.md"?"skill":t.startsWith("references/")?"reference":t.startsWith("scripts/")?"script":t.startsWith("assets/")?"asset":"other"},ed=e=>e==="SKILL.md"?!0:Vl.has(z.extname(e).toLowerCase()),td=e=>e.some(t=>t.kind==="script")?"scripts_executables":e.some(t=>t.kind==="asset")?"assets":"markdown_only",zo=async e=>{let t=await Jo(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 zo(z.join(e,n.name)));return r},rd=async e=>{let t={},r=[],n=async o=>{let s=await Jo(o,{withFileTypes:!0}).catch(()=>[]);for(let a of s){let c=z.join(o,a.name),l=z.relative(e,c).replace(/\\/g,"/");if(a.isDirectory()){if(a.name===".git"||a.name==="node_modules")continue;await n(c);continue}if(r.push({path:l,kind:Zl(l)}),!ed(a.name))continue;let i=await Fo(c,"utf8").catch(()=>null);typeof i=="string"&&(t[l]=i)}};return await n(e),{files:t,inventory:r.sort((o,s)=>o.path.localeCompare(s.path))}},nd=async e=>{let t=await Fo(z.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=Ql(t,e),{files:n,inventory:o}=await rd(e);return{skill:{name:r.name,slug:jo(r.name)??z.basename(e),description:r.description,markdown:t,sourceLocator:e,trustLevel:td(o),fileInventory:o,files:n}}},Vo=async(e,t)=>{let r=Ho(e),n=Ho(t);if(!Xl(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 Go(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 a of zl){let c=z.join(n,a);if(await Go(c).then(i=>i.isDirectory()).catch(()=>!1))for(let i of await zo(c)){let{skill:d,warning:u}=await nd(i);if(u){s.push(u);continue}d&&o.push(d)}}return o.sort((a,c)=>a.slug.localeCompare(c.slug)||a.sourceLocator.localeCompare(c.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"}};var od=e=>{let t=e.trim().match(/^\$\{([A-Z0-9_]+)\}$/i);return t?process.env[t[1]]?.trim()||"":e.trim()},Ko=e=>typeof e!="string"?"":od(e).trim(),Ht=(e,t)=>{for(let r of t){let n=Ko(e[r]);if(n)return n}return""},id=(e,t)=>{let r=ne(e.opencodeConfigContent),n=Object.entries(r.provider??r.providers??{}),o=new Map;for(let[s,a]of n){if(!a||typeof a!="object")continue;let c=a,l=Ht(c,["baseURL","baseUrl","base_url","url","endpoint"]),i=Ht(c,["apiKey","api_key","token","authToken","apiToken"]);o.set(s,{...l?{baseUrl:l}:{},...i?{apiToken:i}:{}})}return t.map(s=>({providerId:s.providerId,modelId:s.modelId,label:`OpenCode \xB7 ${s.id}`,...o.get(s.providerId),runtimeSettings:{defaultModel:s.id}}))},st=(e,t)=>{let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return e.match(new RegExp(`^\\s*${r}\\s*=\\s*["']([^"']+)["']`,"mi"))?.[1]?.trim()||""},sd=e=>{let t=e.codexConfigContent?.trim()||"",r=st(t,"model");if(!r)return[];let n=st(t,"base_url")||st(t,"openai_base_url")||st(t,"OPENAI_BASE_URL")||process.env.OPENAI_BASE_URL?.trim()||"",o=st(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}}]},ad=e=>{let t=e.claudeCodeConfigContent?.trim()||"";if(!t)return[];try{let r=JSON.parse(t),n=Ko(r.model);if(!n)return[];let o=r.env&&typeof r.env=="object"?r.env:{},s=Ht(o,["ANTHROPIC_BASE_URL","ANTHROPIC_API_URL"])||process.env.ANTHROPIC_BASE_URL?.trim()||"",a=Ht(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}:{},...a?{apiToken:a}:{},runtimeSettings:{defaultModel:n}}]}catch{return[]}},Xo=e=>e.agentType==="OpenCode"?id(e.config,e.availableModels):e.agentType==="Codex"?sd(e.config):e.agentType==="ClaudeCode"?ad(e.config):[];import{createHash as cd}from"node:crypto";import{existsSync as Zo,mkdirSync as Lr,rmSync as ld}from"node:fs";import Yo from"node:os";import pe from"node:path";import{simpleGit as ee}from"simple-git";var Me="main",dd=e=>{let t=e.trim();return t?t==="~"?Yo.homedir():t.startsWith("~/")?pe.join(Yo.homedir(),t.slice(2)):t:""},at=e=>pe.resolve(dd(e)),ei=e=>e==="original-dir"?"original-dir":"worktree",ud=e=>e.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"repo",pd=e=>cd("sha1").update(e).digest("hex").slice(0,12),ti=(e,t)=>{let r=t?pe.basename(t).replace(/\.git$/i,""):"repo";return pe.join(at(e),"repos",`${ud(r)}-${pd(t||r)}`)},Z=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},gd=async(e,t,r)=>{let n=ee(e).env(r??{}),[o,s]=await Promise.all([n.branch(["-a"]),n.branchLocal()]),a="";try{a=Z(await n.raw(["symbolic-ref","--quiet","--short","refs/remotes/origin/HEAD"]))}catch{a=""}let c=Array.from(new Set(o.all.map(Z).filter(Boolean))).sort((u,p)=>u.localeCompare(p)),l=Z(t??""),i=Z(s.current),d=[a,l,i,c[0],Me].find(u=>u&&(u===Me||c.includes(u)))??Me;return{branches:c,defaultBranch:d}},md=e=>{for(let t of e.split(`
66
- `)){let r=t.trim();if(!r.startsWith("ref: "))continue;let[n]=r.split(" ");return Z(n.slice(5))}return""},fd=e=>Array.from(new Set(e.split(`
67
- `).map(t=>t.trim()).filter(Boolean).map(t=>t.split(" ")[1]||"").map(Z).filter(Boolean))).sort((t,r)=>t.localeCompare(r)),hd=async(e,t,r)=>{if(t?.trim())return t.trim();let n=ee(e).env(r??{});return await n.checkIsRepo()&&(await n.getRemotes(!0)).find(s=>s.name==="origin")?.refs.fetch?.trim()||""},ri=async(e,t,r,n)=>{let o=await hd(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=ee().env(n??{}),[a,c]=await Promise.all([s.raw(["ls-remote","--heads",o]),s.raw(["ls-remote","--symref",o,"HEAD"])]),l=fd(a),i=md(c),d=Z(r??""),u=[i,d,l[0],Me].find(p=>p&&(p===Me||l.includes(p)))??Me;return{branches:l,defaultBranch:u,remoteTarget:o}},ni=async(e,t,r,n)=>{try{let o=ee(e).env(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 ee().env(n??{}).clone(t,e,["--no-checkout","--single-branch","--branch",r]),!0},kd=async e=>{if(!e.repoUrl?.trim()){let s=ee(e.repoPath).env(e.env??{});return!Zo(e.repoPath)||!await s.checkIsRepo().catch(()=>!1)?{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}:(await s.checkout(e.branchName).catch(async()=>{await s.checkoutLocalBranch(e.branchName)}),{ok:!0,message:`\u5DF2\u5728\u539F\u59CB\u76EE\u5F55 ${e.repoPath} \u5207\u6362\u5230\u5206\u652F ${e.branchName}\u3002`,worktreePath:e.repoPath})}let t=await ri(e.repoPath,e.repoUrl,e.preferredBranch,e.env),r=Z(e.preferredBranch??"")||t.defaultBranch,n=t.branches.includes(r)?r:t.defaultBranch;return t.branches.includes(n)?(await ni(e.repoPath,t.remoteTarget,n,e.env),await ee(e.repoPath).env(e.env??{}).checkout(["-B",e.branchName,`refs/remotes/origin/${n}`]),{ok:!0,message:`\u5DF2\u5728\u539F\u59CB\u76EE\u5F55 ${e.repoPath} \u57FA\u4E8E ${n} \u5207\u6362\u5230\u5206\u652F ${e.branchName}\u3002`,worktreePath:e.repoPath}):{ok:!1,message:t.branches.length>0?`\u8D77\u59CB\u5206\u652F ${n} \u4E0D\u5B58\u5728\u3002\u5F53\u524D\u4ED3\u5E93\u5206\u652F\uFF1A${t.branches.join(", ")}`:`\u8D77\u59CB\u5206\u652F ${n} \u4E0D\u5B58\u5728\u3002`,worktreePath:e.repoPath}},yd=async e=>{let t=await e.raw(["worktree","list","--porcelain"]),r=[],n=null;for(let o of t.split(`
68
- `)){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},wd=async(e,t)=>(await e.branchLocal()).all.includes(t),oi=e=>{ld(e,{recursive:!0,force:!0,maxRetries:5,retryDelay:100})},Qo=async(e,t,r)=>{let n=pe.resolve(t),o=`refs/heads/${r}`;try{await e.raw(["worktree","prune"])}catch{}let a=(await yd(e)).find(c=>c.branch===o);if(a&&a.path!==n)try{await e.raw(["worktree","remove","--force",a.path])}catch{}try{await e.raw(["worktree","remove","--force",n])}catch{}if(oi(n),await wd(e,r))try{await e.deleteLocalBranch(r,!0)}catch{}try{await e.raw(["worktree","prune"])}catch{}Lr(pe.dirname(n),{recursive:!0})},ii=async e=>{let t=ei(e.workingDirectoryMode),r=at(e.worktreePath),n=at(e.repoPath?.trim()||ti(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 kd({repoPath:n,repoUrl:e.repoUrl,preferredBranch:e.preferredBranch,branchName:e.branchName,env:o.env})}catch(s){let a=L(s,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 Lr(r,{recursive:!0}),{ok:!0,message:`\u5DF2\u51C6\u5907\u9879\u76EE\u76EE\u5F55 ${r}\u3002`,worktreePath:r};try{let s=await ri(n,e.repoUrl,e.preferredBranch,o.env),a=Z(e.preferredBranch??"")||s.defaultBranch,c=s.branches.includes(a)?a:s.defaultBranch;if(!s.branches.includes(c))return console.log("[worker] [worktree] ensure worktree skipped: branch not found",JSON.stringify({startPoint:c,availableBranches:s.branches})),{ok:!1,message:s.branches.length>0?`\u8D77\u59CB\u5206\u652F ${c} \u4E0D\u5B58\u5728\u3002\u5F53\u524D\u4ED3\u5E93\u5206\u652F\uFF1A${s.branches.join(", ")}`:`\u8D77\u59CB\u5206\u652F ${c} \u4E0D\u5B58\u5728\u3002`};console.log("[worker] [worktree] resolved remote start point",JSON.stringify({repoPath:n,remoteTarget:s.remoteTarget,requestedStartPoint:a,startPoint:c})),await ni(n,s.remoteTarget,c,o.env);let l=ee(n).env(o.env),i=`refs/remotes/origin/${c}`;return console.log("[worker] [worktree] creating fresh worktree",JSON.stringify({worktreePath:r,branchName:e.branchName,startPoint:c,startPointRef:i})),await Qo(l,r,e.branchName),await l.raw(["worktree","add","--force","-B",e.branchName,r,i]),console.log("[worker] [worktree] worktree created",JSON.stringify({worktreePath:r,branchName:e.branchName,startPoint:c,startPointRef:i})),{ok:!0,message:`\u5DF2\u57FA\u4E8E ${c} \u521B\u5EFA worktree ${r} \u5E76\u5207\u51FA\u5206\u652F ${e.branchName}\u3002`,worktreePath:r}}catch(s){let a=L(s,e.repoUrl);console.log("[worker] [worktree] remote prepare failed",JSON.stringify({worktreePath:r,repoPath:n,error:a instanceof Error?a.message:"unknown"}));try{let c=ee(n).env(o.env);if(!await c.checkIsRepo())throw a instanceof Error?a:new Error("\u521B\u5EFA worktree \u5931\u8D25\u3002");let l=await gd(n,e.preferredBranch,o.env),i=Z(e.preferredBranch??"")||l.defaultBranch,d=l.branches.includes(i)?i:l.defaultBranch;return l.branches.includes(d)?(console.log("[worker] [worktree] local fallback creating worktree",JSON.stringify({worktreePath:r,branchName:e.branchName,startPoint:d})),await Qo(c,r,e.branchName),await c.raw(["worktree","add","--force","-B",e.branchName,r,d]),console.log("[worker] [worktree] local fallback worktree created",JSON.stringify({worktreePath:r,branchName:e.branchName,startPoint:d})),{ok:!0,message:`\u5DF2\u57FA\u4E8E ${d} \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:d,availableBranches:l.branches})),{ok:!1,message:l.branches.length>0?`\u8D77\u59CB\u5206\u652F ${d} \u4E0D\u5B58\u5728\u3002\u5F53\u524D\u4ED3\u5E93\u5206\u652F\uFF1A${l.branches.join(", ")}`:`\u8D77\u59CB\u5206\u652F ${d} \u4E0D\u5B58\u5728\u3002`})}catch(c){let l=L(c,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()}},si=async e=>{let t=ei(e.workingDirectoryMode),r=at(e.worktreePath),n=at(e.repoPath?.trim()||ti(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(Zo(n)){let o=ee(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})),oi(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 Cd=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"task",ct=e=>`task/${Cd(e)}`;var xd=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."},Sd=e=>{let t=xd(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
- `)},bd=(e,t)=>{let r=(e?.trim()||t?.trim()||"Worker delivery update").replace(/\s+/g," ");return r.length>72?`${r.slice(0,69)}...`:r},vd=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||ct(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||ct(e.taskId),n=e.filesChanged.length>0&&!!e.commitShas?.length;t.pullRequest={ready:n,remoteReady:!!e.remoteBranchName,repoUrl:e.repoUrl,title:n?bd(e.taskTitle,e.taskDescription):void 0,description:n?Sd({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},Oe=(e,t)=>({...e,delivery:vd({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{spawn as Ed}from"node:child_process";import{createHash as Rd}from"node:crypto";import{existsSync as ci,mkdirSync as Gr,rmSync as Ad}from"node:fs";import We from"node:path";import{simpleGit as Be}from"simple-git";import{simpleGit as Id}from"simple-git";var Pd=async e=>{let t=await e.status();return Array.from(new Set(t.files.map(r=>r.path))).sort()},Td=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}},ai=async(e,t,r)=>{let n=Id(t),o=await Pd(n),s=await Td(n,e);return{filesChanged:o,commitShas:void 0,patchArtifact:s,remoteBranchName:e.returnMode==="branch"?r:void 0}};var Md="main",Od=["&&","||","|",";",">","<","$(","`"],Bd=e=>Rd("sha1").update(e).digest("hex").slice(0,12),Wd=e=>e.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"repo",_d=(e,t)=>{let r=We.basename(t).replace(/\.git$/i,"");return We.join(e,"repos",`${Wd(r)}-${Bd(t)}`)},qr=e=>e.baseCommit?.trim()||e.defaultBranch?.trim()||Md,Jt=e=>`origin/${e}`,$d=async(e,t,r)=>(await Be().env(r??{}).raw(["ls-remote","--heads",e,t])).trim().length>0,jr=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}`])},Hr=async(e,t)=>(await e.branch(["-r"])).all.includes(Jt(t)),Dd=async(e,t)=>{await jr(e,t),await Hr(e,t)&&await e.rebase([Jt(t)])},Ud=e=>e.gitIdentity??{mode:e.gitIdentityMode??"personal"},Nd=e=>e.workingDirectoryMode==="original-dir"?"original-dir":"worktree",Ld=(e,t=1600)=>{let r=e.trim();return r?r.length>t?`${r.slice(0,t)}
70
- ...\uFF08\u5DF2\u622A\u65AD\uFF09`:r:""},jd=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},Gd=e=>{let t=e.trim();if(!t)throw new Error("\u73AF\u5883\u6A21\u677F\u547D\u4EE4\u4E0D\u80FD\u4E3A\u7A7A\u3002");if(Od.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=jd(t),n={};for(;r.length>0&&/^[A-Za-z_][A-Za-z0-9_]*=.*/.test(r[0]);){let s=r.shift(),a=s.indexOf("=");n[s.slice(0,a)]=s.slice(a+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}},gi=(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},qd=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):[],li=e=>{let t=qd(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
- `)},mi=async e=>{let t=Gd(e.commandText);return await new Promise((r,n)=>{let o=Ed(t.command,t.args,{cwd:e.cwd,env:{...e.env??process.env,...t.env},stdio:["ignore","pipe","pipe"]}),s="",a="",c=!1,l=()=>{c=!0,o.kill("SIGTERM")};e.signal?.addEventListener("abort",l,{once:!0}),o.stdout.on("data",i=>{s+=i.toString()}),o.stderr.on("data",i=>{a+=i.toString()}),o.on("error",i=>{e.signal?.removeEventListener("abort",l),n(new Error(`${e.label} \u542F\u52A8\u5931\u8D25\uFF1A${i.message}`))}),o.on("close",(i,d)=>{if(e.signal?.removeEventListener("abort",l),c){n(new Error(`${e.label} \u5DF2\u53D6\u6D88\u3002`));return}let u=Ld([s,a].filter(Boolean).join(`
61
+ `).map(n=>n.trim()).filter(Boolean).map(n=>n.split(" ")).map(n=>{if(n.length<3)return null;let o=n[0]==="-"?0:Number(n[0]),s=n[1]==="-"?0:Number(n[1]),a=n.length>3?`${n[2]} \u2192 ${n[3]}`:n[2];return{path:a,status:r.get(a)||"M",additions:Number.isFinite(o)?o:0,deletions:Number.isFinite(s)?s:0}}).filter(n=>!!n)},Oo=async(e,t)=>{let r=ue(t)||nt;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`)},ot=async e=>{let t=await e.branchLocal();return ue(t.current)||"HEAD"},jl=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}},Gl=async(e,t)=>{try{return(await e.raw(["rev-list","--parents","-n","1",t])).trim().split(/\s+/).filter(Boolean)[1]}catch{return}},ql=async e=>{try{return(await e.raw(["diff","--name-only","--diff-filter=U"])).split(`
62
+ `).map(r=>r.trim()).filter(Boolean)}catch{return[]}},Hl=e=>{let t=e.trim();return!t.startsWith("(")||!t.endsWith(")")?[]:t.slice(1,-1).split(",").map(r=>r.trim()).filter(Boolean)},zl=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},Jl=e=>e.split("").map(t=>t.trim()).filter(Boolean).map(t=>{let[r="",n="",o="",s="",a="",c=""]=t.split(""),l=Hl(o);return{sha:r,shortSha:r.slice(0,7),parents:n.split(" ").map(i=>i.trim()).filter(Boolean),subject:s.trim(),authorDate:a.trim(),authorName:c.trim(),refs:l,isHead:l.some(i=>i.startsWith("HEAD"))}}),Ae=async e=>{let t=Ll(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=Dl(t).env(r.env);return await e.run(n)}finally{r.cleanup(t)}},Bo=async e=>{try{return await Ae({...e,taskKey:"git-diff",run:async t=>{let{baseBranch:r,baseRef:n}=await Oo(t,e.baseBranch),o=await ot(t),[s,a,c,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"]),jl(t,n)]),i=Mo(s,a);return{ok:!0,message:i.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:i,patch:c}}})}catch(t){let r=L(t,e.repoUrl);return{ok:!1,message:r instanceof Error?r.message:"\u8BFB\u53D6 Git diff \u5931\u8D25\u3002",baseBranch:ue(e.baseBranch)||nt,currentBranch:"HEAD",aheadCommits:0,files:[],patch:""}}},Wo=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 Gl(t,r),[o,s,a]=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])]),c=Mo(s,a);return{ok:!0,message:c.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:c,patch:o}}})}catch(t){let r=L(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:""}}},_o=async e=>{try{return await Ae({...e,taskKey:"git-rebase",run:async t=>{let{baseBranch:r,baseRef:n}=await Oo(t,e.baseBranch),o=await ot(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 a=await ql(t),c=L(s,e.repoUrl);return{ok:!1,message:a.length>0?`rebase \u53D1\u751F\u51B2\u7A81\uFF0C\u8BF7\u5148\u89E3\u51B3\u51B2\u7A81\u540E\u518D\u7EE7\u7EED\u3002${c instanceof Error?` ${c.message}`:""}`.trim():c instanceof Error?c.message:"\u6267\u884C rebase \u5931\u8D25\u3002",baseBranch:r,currentBranch:o,conflicts:a.length>0,conflictedFiles:a}}}})}catch(t){let r=L(t,e.repoUrl);return{ok:!1,message:r instanceof Error?r.message:"\u6267\u884C rebase \u5931\u8D25\u3002",baseBranch:ue(e.baseBranch)||nt,currentBranch:"HEAD",conflicts:!1,conflictedFiles:[]}}},$o=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 ot(r),o=ue(e.baseBranch)||nt,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"]),a=await r.raw(["log","--graph","--decorate","--date=short",`--max-count=${t}`,"--all","--no-color","--pretty=format:%h %d %s (%cd)"]),c=Jl(s);return{ok:!0,message:"\u5DF2\u52A0\u8F7D Git graph\u3002",baseBranch:o,currentBranch:n,limit:t,commitCount:c.length,graph:a,commits:c}}})}catch(r){let n=L(r,e.repoUrl);return{ok:!1,message:n instanceof Error?n.message:"\u8BFB\u53D6 Git graph \u5931\u8D25\u3002",baseBranch:ue(e.baseBranch)||nt,currentBranch:"HEAD",limit:t,commitCount:0,graph:"",commits:[]}}},Uo=async e=>{try{return await Ae({...e,taskKey:"git-push",run:async t=>{let r=e.branchName?.trim()||await ot(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=L(t,e.repoUrl);return{ok:!1,message:r instanceof Error?r.message:"\u63A8\u9001\u5206\u652F\u5931\u8D25\u3002",branchName:e.branchName?.trim()||"",remoteBranch:""}}},Do=async e=>{try{return await Ae({worktreePath:e.worktreePath,repoUrl:e.repoUrl,gitIdentity:e.gitIdentity,taskKey:"git-pull-request",run:async t=>{let r=zl(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 ot(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 a=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})}),c=await a.json().catch(()=>({}));if(!a.ok){let l=Array.isArray(c.errors)?c.errors.map(i=>i.message).filter(Boolean).join("\uFF1B"):"";return{ok:!1,message:[c.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:c.number,url:c.html_url,state:c.state}}})}catch(t){let r=L(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 Fl,stat as Nr}from"node:fs/promises";import No from"node:os";import xe from"node:path";import{simpleGit as it}from"simple-git";var ce="main",Vl=e=>{let t=e.trim();return t?t==="~"?No.homedir():t.startsWith("~/")?xe.join(No.homedir(),t.slice(2)):t:""},qt=e=>xe.resolve(Vl(e)),Kl=(e,t)=>{let r=xe.relative(e,t);return r===""||!r.startsWith("..")&&!xe.isAbsolute(r)},Xl=(e,t)=>{let r=qt(e),n=t?.trim()?qt(t):r;return{resolvedRootPath:r,requestedPath:n}},Q=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},Lo=async(e,t,r)=>{let n=it(e).env(r??{}),[o,s]=await Promise.all([n.branch(["-a"]),n.branchLocal()]),a="";try{a=Q(await n.raw(["symbolic-ref","--quiet","--short","refs/remotes/origin/HEAD"]))}catch{a=""}let c=Array.from(new Set(o.all.map(Q).filter(Boolean))).sort((u,p)=>u.localeCompare(p)),l=Q(t??""),i=Q(s.current),d=[a,l,i,c[0],ce].find(u=>u&&(u===ce||c.includes(u)))??ce;return{branches:c,defaultBranch:d}},Yl=e=>{for(let t of e.split(`
63
+ `)){let r=t.trim();if(!r.startsWith("ref: "))continue;let[n]=r.split(" ");return Q(n.slice(5))}return""},Ql=e=>Array.from(new Set(e.split(`
64
+ `).map(t=>t.trim()).filter(Boolean).map(t=>t.split(" ")[1]||"").map(Q).filter(Boolean))).sort((t,r)=>t.localeCompare(r)),Zl=async(e,t,r)=>{if(t?.trim())return t.trim();let n=it(e).env(r??{});return await n.checkIsRepo()&&(await n.getRemotes(!0)).find(s=>s.name==="origin")?.refs.fetch?.trim()||""},ed=async(e,t,r,n)=>{let o=await Zl(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=it().env(n??{}),[a,c]=await Promise.all([s.raw(["ls-remote","--heads",o]),s.raw(["ls-remote","--symref",o,"HEAD"])]),l=Ql(a),i=Yl(c),d=Q(r??""),u=[i,d,l[0],ce].find(p=>p&&(p===ce||l.includes(p)))??ce;return{branches:l,defaultBranch:u,remoteTarget:o}},jo=async e=>{let t=qt(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=xe.basename(t);try{let n=it(t);if(!await n.checkIsRepo())return{ok:!0,path:t,name:r,versionControl:"none",message:"\u76EE\u5F55\u65E0 Git \u4ED3\u5E93"};let a=(await n.getRemotes(!0)).find(u=>u.name==="origin"),c=await Lo(t),l=c.branches.length,i=a?.refs.fetch?.trim()||"",d=i?"git-remote":"git-local";return{ok:!0,path:t,name:r,versionControl:d,gitUrl:i,defaultBranch:c.defaultBranch,message:l>0?d==="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`:d==="git-remote"?"\u5DF2\u68C0\u6D4B\u5230 Git \u4ED3\u5E93":"\u5DF2\u68C0\u6D4B\u5230\u672C\u5730 Git \u4ED3\u5E93\uFF08\u672A\u7ED1\u5B9A\u8FDC\u7AEF\uFF09"}}catch{return{ok:!0,path:t,name:r,message:"\u65E0\u6CD5\u8BFB\u53D6 Git \u4FE1\u606F"}}},Go=async(e,t)=>{let{resolvedRootPath:r,requestedPath:n}=Xl(e,t);if(!Kl(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 Fl(n,{withFileTypes:!0})).filter(a=>a.isDirectory()).map(a=>({name:a.name,path:xe.join(n,a.name)})).sort((a,c)=>a.name.localeCompare(c.name,"zh-Hans-CN"));return{ok:!0,path:n,rootPath:r,parentPath:n===r?void 0:xe.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=qt(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 a=await ed(o,t,r,s.env);return console.log("[worker] [repo-branches] remote snapshot resolved",JSON.stringify({localPath:o,remoteTarget:a.remoteTarget,branchCount:a.branches.length,defaultBranch:a.defaultBranch})),{ok:!0,branches:a.branches,defaultBranch:a.defaultBranch}}catch(a){let c=L(a,t);console.log("[worker] [repo-branches] remote snapshot failed",JSON.stringify({localPath:o,error:c instanceof Error?c.message:"unknown"}));try{if(!(await Nr(o)).isDirectory())return{ok:!1,branches:[],defaultBranch:Q(r??"")||ce,message:c instanceof Error?c.message:"\u8BFB\u53D6\u5206\u652F\u5217\u8868\u5931\u8D25\u3002"};if(!await it(o).env(s.env).checkIsRepo())return console.log("[worker] [repo-branches] fallback skipped: path is not repo",JSON.stringify({localPath:o})),{ok:!1,branches:[],defaultBranch:Q(r??"")||ce,message:c instanceof Error?c.message:"\u8BFB\u53D6\u5206\u652F\u5217\u8868\u5931\u8D25\u3002"};let d=await Lo(o,r,s.env);return console.log("[worker] [repo-branches] local fallback resolved",JSON.stringify({localPath:o,branchCount:d.branches.length,defaultBranch:d.defaultBranch})),{ok:!0,branches:d.branches,defaultBranch:d.defaultBranch}}catch(l){let i=L(l,t);console.log("[worker] [repo-branches] local fallback failed",JSON.stringify({localPath:o,error:i instanceof Error?i.message:"unknown"}))}return{ok:!1,branches:[],defaultBranch:Q(r??"")||ce,message:c instanceof Error?c.message:"\u8BFB\u53D6\u5206\u652F\u5217\u8868\u5931\u8D25\u3002"}}finally{s.cleanup()}};import{readdir as Vo,readFile as Ko,stat as zo}from"node:fs/promises";import Jo from"node:os";import F from"node:path";var Ho=e=>(e??"").trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||null;var td=["skills",".agents/skills",".codex/skills",".claude/skills",".cursor/skills",".opencode/skills"],rd=new Set([".md",".txt",".json",".yml",".yaml",".ts",".tsx",".js",".jsx",".mjs",".cjs",".sh",".py",".rb"]),nd=e=>{let t=e.trim();return t?t==="~"?Jo.homedir():t.startsWith("~/")?F.join(Jo.homedir(),t.slice(2)):t:""},Fo=e=>F.resolve(nd(e)),od=(e,t)=>{let r=F.relative(e,t);return r===""||!r.startsWith("..")&&!F.isAbsolute(r)},id=e=>{let t=e.match(/^---\n([\s\S]*?)\n---/);if(!t)return{};let r={};for(let n of t[1].split(`
65
+ `)){let[o,...s]=n.split(":"),a=o.trim().toLowerCase(),c=s.join(":").trim().replace(/^"|"$/g,"");c&&(a==="name"&&(r.name=c),a==="description"&&(r.description=c))}return r},sd=(e,t)=>{let r=id(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:F.basename(t),description:r.description?.trim()||null}},ad=e=>{let t=e.replace(/\\/g,"/");return t==="SKILL.md"?"skill":t.startsWith("references/")?"reference":t.startsWith("scripts/")?"script":t.startsWith("assets/")?"asset":"other"},cd=e=>e==="SKILL.md"?!0:rd.has(F.extname(e).toLowerCase()),ld=e=>e.some(t=>t.kind==="script")?"scripts_executables":e.some(t=>t.kind==="asset")?"assets":"markdown_only",Xo=async e=>{let t=await Vo(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 Xo(F.join(e,n.name)));return r},dd=async e=>{let t={},r=[],n=async o=>{let s=await Vo(o,{withFileTypes:!0}).catch(()=>[]);for(let a of s){let c=F.join(o,a.name),l=F.relative(e,c).replace(/\\/g,"/");if(a.isDirectory()){if(a.name===".git"||a.name==="node_modules")continue;await n(c);continue}if(r.push({path:l,kind:ad(l)}),!cd(a.name))continue;let i=await Ko(c,"utf8").catch(()=>null);typeof i=="string"&&(t[l]=i)}};return await n(e),{files:t,inventory:r.sort((o,s)=>o.path.localeCompare(s.path))}},ud=async e=>{let t=await Ko(F.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=sd(t,e),{files:n,inventory:o}=await dd(e);return{skill:{name:r.name,slug:Ho(r.name)??F.basename(e),description:r.description,markdown:t,sourceLocator:e,trustLevel:ld(o),fileInventory:o,files:n}}},Yo=async(e,t)=>{let r=Fo(e),n=Fo(t);if(!od(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 zo(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 a of td){let c=F.join(n,a);if(await zo(c).then(i=>i.isDirectory()).catch(()=>!1))for(let i of await Xo(c)){let{skill:d,warning:u}=await ud(i);if(u){s.push(u);continue}d&&o.push(d)}}return o.sort((a,c)=>a.slug.localeCompare(c.slug)||a.sourceLocator.localeCompare(c.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"}};var pd=e=>{let t=e.trim().match(/^\$\{([A-Z0-9_]+)\}$/i);return t?process.env[t[1]]?.trim()||"":e.trim()},Qo=e=>typeof e!="string"?"":pd(e).trim(),Ht=(e,t)=>{for(let r of t){let n=Qo(e[r]);if(n)return n}return""},gd=(e,t)=>{let r=ne(e.opencodeConfigContent),n=Object.entries(r.provider??r.providers??{}),o=new Map;for(let[s,a]of n){if(!a||typeof a!="object")continue;let c=a,l=Ht(c,["baseURL","baseUrl","base_url","url","endpoint"]),i=Ht(c,["apiKey","api_key","token","authToken","apiToken"]);o.set(s,{...l?{baseUrl:l}:{},...i?{apiToken:i}:{}})}return t.map(s=>({providerId:s.providerId,modelId:s.modelId,label:`OpenCode \xB7 ${s.id}`,...o.get(s.providerId),runtimeSettings:{defaultModel:s.id}}))},st=(e,t)=>{let r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return e.match(new RegExp(`^\\s*${r}\\s*=\\s*["']([^"']+)["']`,"mi"))?.[1]?.trim()||""},md=e=>{let t=e.codexConfigContent?.trim()||"",r=st(t,"model");if(!r)return[];let n=st(t,"base_url")||st(t,"openai_base_url")||st(t,"OPENAI_BASE_URL")||process.env.OPENAI_BASE_URL?.trim()||"",o=st(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}}]},fd=e=>{let t=e.claudeCodeConfigContent?.trim()||"";if(!t)return[];try{let r=JSON.parse(t),n=Qo(r.model);if(!n)return[];let o=r.env&&typeof r.env=="object"?r.env:{},s=Ht(o,["ANTHROPIC_BASE_URL","ANTHROPIC_API_URL"])||process.env.ANTHROPIC_BASE_URL?.trim()||"",a=Ht(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}:{},...a?{apiToken:a}:{},runtimeSettings:{defaultModel:n}}]}catch{return[]}},Zo=e=>e.agentType==="OpenCode"?gd(e.config,e.availableModels):e.agentType==="Codex"?md(e.config):e.agentType==="ClaudeCode"?fd(e.config):[];import{createHash as hd}from"node:crypto";import{existsSync as ri,mkdirSync as Lr,rmSync as kd}from"node:fs";import ei from"node:os";import pe from"node:path";import{simpleGit as ee}from"simple-git";var Me="main",yd=e=>{let t=e.trim();return t?t==="~"?ei.homedir():t.startsWith("~/")?pe.join(ei.homedir(),t.slice(2)):t:""},at=e=>pe.resolve(yd(e)),ni=e=>e==="original-dir"?"original-dir":"worktree",wd=e=>e.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"repo",Cd=e=>hd("sha1").update(e).digest("hex").slice(0,12),oi=(e,t)=>{let r=t?pe.basename(t).replace(/\.git$/i,""):"repo";return pe.join(at(e),"repos",`${wd(r)}-${Cd(t||r)}`)},Z=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},xd=async(e,t,r)=>{let n=ee(e).env(r??{}),[o,s]=await Promise.all([n.branch(["-a"]),n.branchLocal()]),a="";try{a=Z(await n.raw(["symbolic-ref","--quiet","--short","refs/remotes/origin/HEAD"]))}catch{a=""}let c=Array.from(new Set(o.all.map(Z).filter(Boolean))).sort((u,p)=>u.localeCompare(p)),l=Z(t??""),i=Z(s.current),d=[a,l,i,c[0],Me].find(u=>u&&(u===Me||c.includes(u)))??Me;return{branches:c,defaultBranch:d}},Sd=e=>{for(let t of e.split(`
66
+ `)){let r=t.trim();if(!r.startsWith("ref: "))continue;let[n]=r.split(" ");return Z(n.slice(5))}return""},bd=e=>Array.from(new Set(e.split(`
67
+ `).map(t=>t.trim()).filter(Boolean).map(t=>t.split(" ")[1]||"").map(Z).filter(Boolean))).sort((t,r)=>t.localeCompare(r)),vd=async(e,t,r)=>{if(t?.trim())return t.trim();let n=ee(e).env(r??{});return await n.checkIsRepo()&&(await n.getRemotes(!0)).find(s=>s.name==="origin")?.refs.fetch?.trim()||""},ii=async(e,t,r,n)=>{let o=await vd(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=ee().env(n??{}),[a,c]=await Promise.all([s.raw(["ls-remote","--heads",o]),s.raw(["ls-remote","--symref",o,"HEAD"])]),l=bd(a),i=Sd(c),d=Z(r??""),u=[i,d,l[0],Me].find(p=>p&&(p===Me||l.includes(p)))??Me;return{branches:l,defaultBranch:u,remoteTarget:o}},si=async(e,t,r,n)=>{try{let o=ee(e).env(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 ee().env(n??{}).clone(t,e,["--no-checkout","--single-branch","--branch",r]),!0},Pd=async e=>{if(!e.repoUrl?.trim()){let s=ee(e.repoPath).env(e.env??{});return!ri(e.repoPath)||!await s.checkIsRepo().catch(()=>!1)?{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}:(await s.checkout(e.branchName).catch(async()=>{await s.checkoutLocalBranch(e.branchName)}),{ok:!0,message:`\u5DF2\u5728\u539F\u59CB\u76EE\u5F55 ${e.repoPath} \u5207\u6362\u5230\u5206\u652F ${e.branchName}\u3002`,worktreePath:e.repoPath})}let t=await ii(e.repoPath,e.repoUrl,e.preferredBranch,e.env),r=Z(e.preferredBranch??"")||t.defaultBranch,n=t.branches.includes(r)?r:t.defaultBranch;return t.branches.includes(n)?(await si(e.repoPath,t.remoteTarget,n,e.env),await ee(e.repoPath).env(e.env??{}).checkout(["-B",e.branchName,`refs/remotes/origin/${n}`]),{ok:!0,message:`\u5DF2\u5728\u539F\u59CB\u76EE\u5F55 ${e.repoPath} \u57FA\u4E8E ${n} \u5207\u6362\u5230\u5206\u652F ${e.branchName}\u3002`,worktreePath:e.repoPath}):{ok:!1,message:t.branches.length>0?`\u8D77\u59CB\u5206\u652F ${n} \u4E0D\u5B58\u5728\u3002\u5F53\u524D\u4ED3\u5E93\u5206\u652F\uFF1A${t.branches.join(", ")}`:`\u8D77\u59CB\u5206\u652F ${n} \u4E0D\u5B58\u5728\u3002`,worktreePath:e.repoPath}},Id=async e=>{let t=await e.raw(["worktree","list","--porcelain"]),r=[],n=null;for(let o of t.split(`
68
+ `)){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},Td=async(e,t)=>(await e.branchLocal()).all.includes(t),ai=e=>{kd(e,{recursive:!0,force:!0,maxRetries:5,retryDelay:100})},ti=async(e,t,r)=>{let n=pe.resolve(t),o=`refs/heads/${r}`;try{await e.raw(["worktree","prune"])}catch{}let a=(await Id(e)).find(c=>c.branch===o);if(a&&a.path!==n)try{await e.raw(["worktree","remove","--force",a.path])}catch{}try{await e.raw(["worktree","remove","--force",n])}catch{}if(ai(n),await Td(e,r))try{await e.deleteLocalBranch(r,!0)}catch{}try{await e.raw(["worktree","prune"])}catch{}Lr(pe.dirname(n),{recursive:!0})},ci=async e=>{let t=ni(e.workingDirectoryMode),r=at(e.worktreePath),n=at(e.repoPath?.trim()||oi(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 Pd({repoPath:n,repoUrl:e.repoUrl,preferredBranch:e.preferredBranch,branchName:e.branchName,env:o.env})}catch(s){let a=L(s,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 Lr(r,{recursive:!0}),{ok:!0,message:`\u5DF2\u51C6\u5907\u9879\u76EE\u76EE\u5F55 ${r}\u3002`,worktreePath:r};try{let s=await ii(n,e.repoUrl,e.preferredBranch,o.env),a=Z(e.preferredBranch??"")||s.defaultBranch,c=s.branches.includes(a)?a:s.defaultBranch;if(!s.branches.includes(c))return console.log("[worker] [worktree] ensure worktree skipped: branch not found",JSON.stringify({startPoint:c,availableBranches:s.branches})),{ok:!1,message:s.branches.length>0?`\u8D77\u59CB\u5206\u652F ${c} \u4E0D\u5B58\u5728\u3002\u5F53\u524D\u4ED3\u5E93\u5206\u652F\uFF1A${s.branches.join(", ")}`:`\u8D77\u59CB\u5206\u652F ${c} \u4E0D\u5B58\u5728\u3002`};console.log("[worker] [worktree] resolved remote start point",JSON.stringify({repoPath:n,remoteTarget:s.remoteTarget,requestedStartPoint:a,startPoint:c})),await si(n,s.remoteTarget,c,o.env);let l=ee(n).env(o.env),i=`refs/remotes/origin/${c}`;return console.log("[worker] [worktree] creating fresh worktree",JSON.stringify({worktreePath:r,branchName:e.branchName,startPoint:c,startPointRef:i})),await ti(l,r,e.branchName),await l.raw(["worktree","add","--force","-B",e.branchName,r,i]),console.log("[worker] [worktree] worktree created",JSON.stringify({worktreePath:r,branchName:e.branchName,startPoint:c,startPointRef:i})),{ok:!0,message:`\u5DF2\u57FA\u4E8E ${c} \u521B\u5EFA worktree ${r} \u5E76\u5207\u51FA\u5206\u652F ${e.branchName}\u3002`,worktreePath:r}}catch(s){let a=L(s,e.repoUrl);console.log("[worker] [worktree] remote prepare failed",JSON.stringify({worktreePath:r,repoPath:n,error:a instanceof Error?a.message:"unknown"}));try{let c=ee(n).env(o.env);if(!await c.checkIsRepo())throw a instanceof Error?a:new Error("\u521B\u5EFA worktree \u5931\u8D25\u3002");let l=await xd(n,e.preferredBranch,o.env),i=Z(e.preferredBranch??"")||l.defaultBranch,d=l.branches.includes(i)?i:l.defaultBranch;return l.branches.includes(d)?(console.log("[worker] [worktree] local fallback creating worktree",JSON.stringify({worktreePath:r,branchName:e.branchName,startPoint:d})),await ti(c,r,e.branchName),await c.raw(["worktree","add","--force","-B",e.branchName,r,d]),console.log("[worker] [worktree] local fallback worktree created",JSON.stringify({worktreePath:r,branchName:e.branchName,startPoint:d})),{ok:!0,message:`\u5DF2\u57FA\u4E8E ${d} \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:d,availableBranches:l.branches})),{ok:!1,message:l.branches.length>0?`\u8D77\u59CB\u5206\u652F ${d} \u4E0D\u5B58\u5728\u3002\u5F53\u524D\u4ED3\u5E93\u5206\u652F\uFF1A${l.branches.join(", ")}`:`\u8D77\u59CB\u5206\u652F ${d} \u4E0D\u5B58\u5728\u3002`})}catch(c){let l=L(c,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()}},li=async e=>{let t=ni(e.workingDirectoryMode),r=at(e.worktreePath),n=at(e.repoPath?.trim()||oi(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(ri(n)){let o=ee(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})),ai(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 Ed=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"task",ct=e=>`task/${Ed(e)}`;var Rd=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."},Ad=e=>{let t=Rd(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
+ `)},Md=(e,t)=>{let r=(e?.trim()||t?.trim()||"Worker delivery update").replace(/\s+/g," ");return r.length>72?`${r.slice(0,69)}...`:r},Od=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||ct(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||ct(e.taskId),n=e.filesChanged.length>0&&!!e.commitShas?.length;t.pullRequest={ready:n,remoteReady:!!e.remoteBranchName,repoUrl:e.repoUrl,title:n?Md(e.taskTitle,e.taskDescription):void 0,description:n?Ad({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},Oe=(e,t)=>({...e,delivery:Od({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{spawn as $d}from"node:child_process";import{createHash as Ud}from"node:crypto";import{existsSync as ui,mkdirSync as Gr,rmSync as Dd}from"node:fs";import We from"node:path";import{simpleGit as Be}from"simple-git";import{simpleGit as Bd}from"simple-git";var Wd=async e=>{let t=await e.status();return Array.from(new Set(t.files.map(r=>r.path))).sort()},_d=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}},di=async(e,t,r)=>{let n=Bd(t),o=await Wd(n),s=await _d(n,e);return{filesChanged:o,commitShas:void 0,patchArtifact:s,remoteBranchName:e.returnMode==="branch"?r:void 0}};var Nd="main",Ld=["&&","||","|",";",">","<","$(","`"],jd=e=>Ud("sha1").update(e).digest("hex").slice(0,12),Gd=e=>e.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"repo",qd=(e,t)=>{let r=We.basename(t).replace(/\.git$/i,"");return We.join(e,"repos",`${Gd(r)}-${jd(t)}`)},qr=e=>e.baseCommit?.trim()||e.defaultBranch?.trim()||Nd,zt=e=>`origin/${e}`,Hd=async(e,t,r)=>(await Be().env(r??{}).raw(["ls-remote","--heads",e,t])).trim().length>0,jr=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}`])},Hr=async(e,t)=>(await e.branch(["-r"])).all.includes(zt(t)),zd=async(e,t)=>{await jr(e,t),await Hr(e,t)&&await e.rebase([zt(t)])},Jd=e=>e.gitIdentity??{mode:e.gitIdentityMode??"personal"},Fd=e=>e.workingDirectoryMode==="original-dir"?"original-dir":"worktree",Vd=(e,t=1600)=>{let r=e.trim();return r?r.length>t?`${r.slice(0,t)}
70
+ ...\uFF08\u5DF2\u622A\u65AD\uFF09`:r:""},Kd=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},Xd=e=>{let t=e.trim();if(!t)throw new Error("\u73AF\u5883\u6A21\u677F\u547D\u4EE4\u4E0D\u80FD\u4E3A\u7A7A\u3002");if(Ld.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=Kd(t),n={};for(;r.length>0&&/^[A-Za-z_][A-Za-z0-9_]*=.*/.test(r[0]);){let s=r.shift(),a=s.indexOf("=");n[s.slice(0,a)]=s.slice(a+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}},hi=(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},Yd=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):[],pi=e=>{let t=Yd(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
+ `)},ki=async e=>{let t=Xd(e.commandText);return await new Promise((r,n)=>{let o=$d(t.command,t.args,{cwd:e.cwd,env:{...e.env??process.env,...t.env},stdio:["ignore","pipe","pipe"]}),s="",a="",c=!1,l=()=>{c=!0,o.kill("SIGTERM")};e.signal?.addEventListener("abort",l,{once:!0}),o.stdout.on("data",i=>{s+=i.toString()}),o.stderr.on("data",i=>{a+=i.toString()}),o.on("error",i=>{e.signal?.removeEventListener("abort",l),n(new Error(`${e.label} \u542F\u52A8\u5931\u8D25\uFF1A${i.message}`))}),o.on("close",(i,d)=>{if(e.signal?.removeEventListener("abort",l),c){n(new Error(`${e.label} \u5DF2\u53D6\u6D88\u3002`));return}let u=Vd([s,a].filter(Boolean).join(`
72
72
  `));if(i===0){r({output:u});return}let p=d?`\u4FE1\u53F7 ${d}`:`\u9000\u51FA\u7801 ${i??"unknown"}`;n(new Error([`${e.label} \u6267\u884C\u5931\u8D25\uFF08${p}\uFF09\u3002`,u].filter(Boolean).join(`
73
73
 
74
- `)))})})},di=async e=>{let t=gi(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 mi({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}`},ui=e=>{let t=gi(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:mi({cwd:e.cwd,label:r,commandText:t,signal:e.signal,env:e.env})}},pi=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}`},Hd=(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,Jd=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:We.resolve(o.slice(9).trim())};continue}o.startsWith("branch ")&&n&&(n.branch=o.slice(7).trim())}return n&&r.push(n),r},Fd=async(e,t)=>(await e.branchLocal()).all.includes(t),zd=e=>{Ad(e,{recursive:!0,force:!0,maxRetries:5,retryDelay:100})},Vd=async(e,t,r)=>{let n=Be(e),o=We.resolve(t),s=`refs/heads/${r}`;try{await n.raw(["worktree","prune"])}catch{}let c=(await Jd(n)).find(l=>l.branch===s);if(c&&c.path!==o)try{await n.raw(["worktree","remove","--force",c.path])}catch{}try{await n.raw(["worktree","remove","--force",o])}catch{}if(zd(o),await Fd(n,r))try{await n.deleteLocalBranch(r,!0)}catch{}try{await n.raw(["worktree","prune"])}catch{}Gr(We.dirname(o),{recursive:!0})},Kd=async e=>{let t=Hd(e.bindings,e.task)||_d(e.workspaceRoot,e.task.repoUrl),r=qr(e.task);if(Gr(We.dirname(t),{recursive:!0}),e.task.versionControl==="git-local"){let s=Be(t).env(e.env??{});if(!ci(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}}ci(t)||(console.log("[worker] [task-worktree] cloning target branch only",JSON.stringify({repoDir:t,repoUrl:e.task.repoUrl,startPoint:r})),await Be().env(e.env??{}).clone(e.task.repoUrl,t,["--no-checkout","--single-branch","--branch",r]));let n=Be(t).env(e.env??{});await jr(n,r);let o=await $d(e.task.repoUrl,e.branchName,e.env);return o&&e.branchName!==r&&await jr(n,e.branchName),{repoDir:t,git:n,taskBranchExists:o}},Xd=async e=>{let t=e.taskBranchExists||await Hr(e.git,e.branchName)?Jt(e.branchName):qr(e.task);return await e.git.checkout(["-B",e.branchName,t]),t},Yd=async e=>{let t=Be(e.worktreePath),r=await t.status(),n=Array.from(new Set(r.files.map(c=>c.path))).sort();if(n.length===0)return{changedFiles:n,commitShas:void 0,remoteBranchName:void 0,pushMessage:"\u6CA1\u6709\u6587\u4EF6\u6539\u52A8\uFF0C\u8DF3\u8FC7\u63D0\u4EA4\u4E0E\u63A8\u9001\u3002"};if(e.task.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,a="\u5DF2\u521B\u5EFA\u672C\u5730\u63D0\u4EA4\u3002";return e.identity.credentialToken?(await Dd(t,e.branchName),await t.push(["-u","origin",e.branchName]),s=e.branchName,a=`\u5DF2\u63A8\u9001\u8FDC\u7AEF\u5206\u652F ${e.branchName}\u3002`):(e.task.returnMode==="branch"||e.task.returnMode==="commit")&&(a="\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:a}},fi=async e=>{let t=new Date().toISOString(),r=ct(e.task.id),n=On(e.workspaceRoot,e.task.id,e.task.workspaceId),o=Nd(e.task),s=null,a=null;try{e.emit("preparing","\u68C0\u67E5 Worker \u8FD0\u884C\u73AF\u5883");let c=await se({autoInstall:!0,target:e.task.agentType});if(!c.ok)throw new Error(c.message);if(e.emit("preparing","\u8FD0\u884C\u73AF\u5883\u5DF2\u5C31\u7EEA"),e.task.versionControl==="none"){let E=e.task.rootPath?.trim()||n;Gr(E,{recursive:!0}),e.emit("preparing",`\u9879\u76EE\u76EE\u5F55\u5DF2\u5C31\u7EEA\uFF1A${E}`);let q=ui({step:"install",task:e.task,cwd:E,signal:e.signal,emit:e.emit}),te=[];q&&te.push(await pi(q,e.emit)),e.emit("executing",`\u5F00\u59CB\u8C03\u7528 ${e.task.agentType} \u6267\u884C\u4EFB\u52A1`);let b=await $r({agentType:e.task.agentType,actingUserId:e.task.requestedByUserId,cwd:E,title:`Distributed Task ${e.task.id}`,description:li(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 h of["build","test","lint"]){let C=await di({step:h,task:e.task,cwd:E,signal:e.signal,emit:e.emit});C&&te.push(C)}let B=new Date().toISOString(),U=Oe({taskId:e.task.id,status:"completed",returnMode:e.task.returnMode,summary:[te.length>0?`\u5DF2\u6267\u884C\u9879\u76EE\u9884\u8BBE\u547D\u4EE4\uFF1A
74
+ `)))})})},gi=async e=>{let t=hi(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 ki({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}`},mi=e=>{let t=hi(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:ki({cwd:e.cwd,label:r,commandText:t,signal:e.signal,env:e.env})}},fi=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}`},Qd=(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,Zd=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:We.resolve(o.slice(9).trim())};continue}o.startsWith("branch ")&&n&&(n.branch=o.slice(7).trim())}return n&&r.push(n),r},eu=async(e,t)=>(await e.branchLocal()).all.includes(t),tu=e=>{Dd(e,{recursive:!0,force:!0,maxRetries:5,retryDelay:100})},ru=async(e,t,r)=>{let n=Be(e),o=We.resolve(t),s=`refs/heads/${r}`;try{await n.raw(["worktree","prune"])}catch{}let c=(await Zd(n)).find(l=>l.branch===s);if(c&&c.path!==o)try{await n.raw(["worktree","remove","--force",c.path])}catch{}try{await n.raw(["worktree","remove","--force",o])}catch{}if(tu(o),await eu(n,r))try{await n.deleteLocalBranch(r,!0)}catch{}try{await n.raw(["worktree","prune"])}catch{}Gr(We.dirname(o),{recursive:!0})},nu=async e=>{let t=Qd(e.bindings,e.task)||qd(e.workspaceRoot,e.task.repoUrl),r=qr(e.task);if(Gr(We.dirname(t),{recursive:!0}),e.task.versionControl==="git-local"){let s=Be(t).env(e.env??{});if(!ui(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}}ui(t)||(console.log("[worker] [task-worktree] cloning target branch only",JSON.stringify({repoDir:t,repoUrl:e.task.repoUrl,startPoint:r})),await Be().env(e.env??{}).clone(e.task.repoUrl,t,["--no-checkout","--single-branch","--branch",r]));let n=Be(t).env(e.env??{});await jr(n,r);let o=await Hd(e.task.repoUrl,e.branchName,e.env);return o&&e.branchName!==r&&await jr(n,e.branchName),{repoDir:t,git:n,taskBranchExists:o}},ou=async e=>{let t=e.taskBranchExists||await Hr(e.git,e.branchName)?zt(e.branchName):qr(e.task);return await e.git.checkout(["-B",e.branchName,t]),t},iu=async e=>{let t=Be(e.worktreePath),r=await t.status(),n=Array.from(new Set(r.files.map(c=>c.path))).sort();if(n.length===0)return{changedFiles:n,commitShas:void 0,remoteBranchName:void 0,pushMessage:"\u6CA1\u6709\u6587\u4EF6\u6539\u52A8\uFF0C\u8DF3\u8FC7\u63D0\u4EA4\u4E0E\u63A8\u9001\u3002"};if(e.task.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,a="\u5DF2\u521B\u5EFA\u672C\u5730\u63D0\u4EA4\u3002";return e.identity.credentialToken?(await zd(t,e.branchName),await t.push(["-u","origin",e.branchName]),s=e.branchName,a=`\u5DF2\u63A8\u9001\u8FDC\u7AEF\u5206\u652F ${e.branchName}\u3002`):(e.task.returnMode==="branch"||e.task.returnMode==="commit")&&(a="\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:a}},yi=async e=>{let t=new Date().toISOString(),r=ct(e.task.id),n=On(e.workspaceRoot,e.task.id,e.task.workspaceId),o=Fd(e.task),s=null,a=null;try{e.emit("preparing","\u68C0\u67E5 Worker \u8FD0\u884C\u73AF\u5883");let c=await se({autoInstall:!0,target:e.task.agentType});if(!c.ok)throw new Error(c.message);if(e.emit("preparing","\u8FD0\u884C\u73AF\u5883\u5DF2\u5C31\u7EEA"),e.task.versionControl==="none"){let E=e.task.rootPath?.trim()||n;Gr(E,{recursive:!0}),e.emit("preparing",`\u9879\u76EE\u76EE\u5F55\u5DF2\u5C31\u7EEA\uFF1A${E}`);let q=mi({step:"install",task:e.task,cwd:E,signal:e.signal,emit:e.emit}),te=[];q&&te.push(await fi(q,e.emit)),e.emit("executing",`\u5F00\u59CB\u8C03\u7528 ${e.task.agentType} \u6267\u884C\u4EFB\u52A1`);let b=await $r({agentType:e.task.agentType,actingUserId:e.task.requestedByUserId,cwd:E,title:`Distributed Task ${e.task.id}`,description:pi(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 h of["build","test","lint"]){let C=await gi({step:h,task:e.task,cwd:E,signal:e.signal,emit:e.emit});C&&te.push(C)}let B=new Date().toISOString(),D=Oe({taskId:e.task.id,status:"completed",returnMode:e.task.returnMode,summary:[te.length>0?`\u5DF2\u6267\u884C\u9879\u76EE\u9884\u8BBE\u547D\u4EE4\uFF1A
78
78
  ${te.map(h=>`- ${h}`).join(`
79
79
  `)}`:void 0,b.output].filter(Boolean).join(`
80
80
 
81
- `),output:b.output,filesChanged:[],startedAt:t,completedAt:B,durationSec:Math.max(0,Math.round((new Date(B).getTime()-new Date(t).getTime())/1e3)),executorNodeId:e.executorId,agentSessionId:b.sessionId,opencodeSessionId:b.sessionId},{repoUrl:e.task.repoUrl,baseBranch:e.task.defaultBranch,taskDescription:e.task.description});return{task:{...e.task,status:"completed",startedAt:t,completedAt:B,updatedAt:B,result:U}}}let l=Ud(e.task);a=ae({taskId:e.task.id,identity:l,repoUrl:e.task.repoUrl}),e.emit("preparing","\u51C6\u5907\u672C\u5730\u4ED3\u5E93");let{repoDir:i,git:d,taskBranchExists:u}=await Kd({workspaceRoot:e.workspaceRoot,task:e.task,branchName:r,bindings:e.projectBindings,env:a.env});e.emit("preparing",`\u4ED3\u5E93\u5DF2\u5C31\u7EEA\uFF1A${i}`);let p=o==="original-dir"?e.task.rootPath?.trim()||i:n;if(o==="worktree"){await Vd(i,n,r);let E=u||await Hr(d,r)?Jt(r):qr(e.task);await d.raw(["worktree","add","--force","-B",r,n,E]),e.emit("executing",`\u5DF2\u521B\u5EFA worktree\uFF1A${n}`)}else{let E=await Xd({git:d,task:e.task,branchName:r,taskBranchExists:u});e.emit("executing",`\u5DF2\u5728\u539F\u59CB\u76EE\u5F55 ${p} \u5207\u6362\u5230 ${E} \u5E76\u5F00\u59CB\u6267\u884C`)}s=Io({taskId:e.task.id,worktreePath:p,identity:l,repoUrl:e.task.repoUrl});let g=s.env,w=ui({step:"install",task:e.task,cwd:p,signal:e.signal,env:g,emit:e.emit}),k=[];w&&k.push(await pi(w,e.emit)),e.emit("executing",`\u5F00\u59CB\u8C03\u7528 ${e.task.agentType} \u6267\u884C\u4EFB\u52A1`);let m=await $r({agentType:e.task.agentType,actingUserId:e.task.requestedByUserId,cwd:p,title:`Distributed Task ${e.task.id}`,description:li(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 E of["build","test","lint"]){let q=await di({step:E,task:e.task,cwd:p,signal:e.signal,env:g,emit:e.emit});q&&k.push(q)}let f=await Yd({task:e.task,worktreePath:p,branchName:r,identity:l}),S=await ai(e.task,p,r),I;S.patchArtifact&&e.uploadPatchArtifact&&(e.emit("syncing_back","\u6B63\u5728\u4E0A\u4F20 patch \u4EA7\u7269\u5230\u63A7\u5236\u9762"),I=(await e.uploadPatchArtifact({taskId:e.task.id,filename:S.patchArtifact.filename,content:S.patchArtifact.content})).artifactId);let D=new Date().toISOString(),V=Oe({taskId:e.task.id,status:"completed",returnMode:e.task.returnMode,summary:[k.length>0?`\u5DF2\u6267\u884C\u9879\u76EE\u9884\u8BBE\u547D\u4EE4\uFF1A
81
+ `),output:b.output,filesChanged:[],startedAt:t,completedAt:B,durationSec:Math.max(0,Math.round((new Date(B).getTime()-new Date(t).getTime())/1e3)),executorNodeId:e.executorId,agentSessionId:b.sessionId,opencodeSessionId:b.sessionId},{repoUrl:e.task.repoUrl,baseBranch:e.task.defaultBranch,taskDescription:e.task.description});return{task:{...e.task,status:"completed",startedAt:t,completedAt:B,updatedAt:B,result:D}}}let l=Jd(e.task);a=ae({taskId:e.task.id,identity:l,repoUrl:e.task.repoUrl}),e.emit("preparing","\u51C6\u5907\u672C\u5730\u4ED3\u5E93");let{repoDir:i,git:d,taskBranchExists:u}=await nu({workspaceRoot:e.workspaceRoot,task:e.task,branchName:r,bindings:e.projectBindings,env:a.env});e.emit("preparing",`\u4ED3\u5E93\u5DF2\u5C31\u7EEA\uFF1A${i}`);let p=o==="original-dir"?e.task.rootPath?.trim()||i:n;if(o==="worktree"){await ru(i,n,r);let E=u||await Hr(d,r)?zt(r):qr(e.task);await d.raw(["worktree","add","--force","-B",r,n,E]),e.emit("executing",`\u5DF2\u521B\u5EFA worktree\uFF1A${n}`)}else{let E=await ou({git:d,task:e.task,branchName:r,taskBranchExists:u});e.emit("executing",`\u5DF2\u5728\u539F\u59CB\u76EE\u5F55 ${p} \u5207\u6362\u5230 ${E} \u5E76\u5F00\u59CB\u6267\u884C`)}s=Eo({taskId:e.task.id,worktreePath:p,identity:l,repoUrl:e.task.repoUrl});let g=s.env,w=mi({step:"install",task:e.task,cwd:p,signal:e.signal,env:g,emit:e.emit}),k=[];w&&k.push(await fi(w,e.emit)),e.emit("executing",`\u5F00\u59CB\u8C03\u7528 ${e.task.agentType} \u6267\u884C\u4EFB\u52A1`);let m=await $r({agentType:e.task.agentType,actingUserId:e.task.requestedByUserId,cwd:p,title:`Distributed Task ${e.task.id}`,description:pi(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 E of["build","test","lint"]){let q=await gi({step:E,task:e.task,cwd:p,signal:e.signal,env:g,emit:e.emit});q&&k.push(q)}let f=await iu({task:e.task,worktreePath:p,branchName:r,identity:l}),S=await di(e.task,p,r),P;S.patchArtifact&&e.uploadPatchArtifact&&(e.emit("syncing_back","\u6B63\u5728\u4E0A\u4F20 patch \u4EA7\u7269\u5230\u63A7\u5236\u9762"),P=(await e.uploadPatchArtifact({taskId:e.task.id,filename:S.patchArtifact.filename,content:S.patchArtifact.content})).artifactId);let U=new Date().toISOString(),V=Oe({taskId:e.task.id,status:"completed",returnMode:e.task.returnMode,summary:[k.length>0?`\u5DF2\u6267\u884C\u9879\u76EE\u9884\u8BBE\u547D\u4EE4\uFF1A
82
82
  ${k.map(E=>`- ${E}`).join(`
83
83
  `)}`:void 0,m.output,f.pushMessage].filter(Boolean).join(`
84
84
 
85
- `),output:m.output,filesChanged:f.changedFiles.length>0?f.changedFiles:S.filesChanged,remoteBranchName:f.remoteBranchName,commitShas:f.commitShas??S.commitShas,patchArtifactId:I,startedAt:t,completedAt:D,durationSec:Math.max(0,Math.round((new Date(D).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:D,updatedAt:D,result:V}}}catch(c){let l=new Date().toISOString(),i=c instanceof Error?c.message:"worker task execution failed";return{task:{...e.task,status:"failed",startedAt:t,completedAt:l,updatedAt:l,errorMessage:i,result:Oe({taskId:e.task.id,status:"failed",returnMode:e.task.returnMode,summary:i,output:i,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(),a?.cleanup()}};var Jr=new Map,Fr=e=>{let t=Jr.get(e);if(t){for(let r of t)clearTimeout(r);Jr.delete(e)}},hi=(e,t,r)=>{let n=new Date().toISOString();return{...e,status:"cancelled",executorNodeId:t,completedAt:n,updatedAt:n,result:Oe({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})}},ki=Fr,yi=e=>{let{task:t,executorId:r,workspaceRoot:n,projectBindings:o,uploadPatchArtifact:s,connection:a}=e,c=new AbortController,l=[setTimeout(()=>{e.onStart(t.id),fi({task:t,executorId:r,workspaceRoot:n,projectBindings:o,signal:c.signal,uploadPatchArtifact:s,emit(i,d){c.signal.aborted||a.send({type:"task.event",taskId:t.id,idempotencyKey:t.idempotencyKey,executorId:r,status:i,message:d,at:new Date().toISOString()})}}).then(({task:i})=>{c.signal.aborted||(e.onFinish(t.id),a.send({type:"task.result",executorId:r,task:i}),Fr(t.id))})},20)];return Jr.set(t.id,l),{abort(){c.abort(),e.onFinish(t.id),Fr(t.id)}}};var Se=(e,t)=>{},Ft=e=>`prompt:${e}`,wi=e=>e.workingDirectoryMode==="original-dir"?"original-dir":"worktree",Qd=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()}})},Ci=e=>{let t=x(),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,a={...t,opencodeConfigContent:r,codexConfigContent:n,claudeCodeConfigContent:o,defaultModel:s,agentSettings:De(e.agentSettings??t.agentSettings,s),mcpServers:e.mcpServers??t.mcpServers??[],maxConcurrency:Math.max(1,e.maxConcurrency??t.maxConcurrency)};return Ie(a),A({config:a}),a};var xi=e=>{let t=new Map,r=new Map,n=[],o=i=>{let d=n.indexOf(i);d!==-1&&n.splice(d,1),e.setQueuedTaskIds(e.getQueuedTaskIds().filter(u=>u!==Ft(i)))},s=i=>{t.delete(i),r.delete(i),e.setRunningTaskIds(e.getRunningTaskIds().filter(d=>d!==Ft(i))),e.syncRuntimeState(),e.drainExecutionQueue()},a=i=>{let d=x();e.setConfig(d),o(i.requestId),e.setRunningTaskIds([...e.getRunningTaskIds(),Ft(i.requestId)]),e.syncRuntimeState(),console.log("[worker-agent] prompt request",JSON.stringify({requestId:i.requestId,agentType:i.agentType,cwd:i.cwd,title:i.title,executionModel:i.executionModel??"default",attachmentCount:i.attachments?.length??0,promptPreview:i.prompt.slice(0,160)}));let u=new AbortController;r.set(i.requestId,u);let p=e.getConnection();_r({agentType:i.agentType,actingUserId:i.actingUserId,cwd:i.cwd,title:i.title,prompt:i.prompt,attachments:i.attachments,cloudUrl:d.cloudUrl,executionModel:i.executionModel,agentSettings:i.agentSettings??d.agentSettings[i.agentType],opencodeConfig:i.opencodeConfig,mcpServers:i.mcpServers,runtimeSkillPackages:i.runtimeSkillPackages,runtimeEnv:i.runtimeEnv,signal:u.signal,onEvent:g=>{d=e.getConfig(),e.getConnection()?.send({type:"executor.agent.prompt.event",executorId:d.executorId,requestId:i.requestId,event:g,at:new Date().toISOString()})}}).then(g=>{d=e.getConfig(),console.log("[worker-agent] prompt response",JSON.stringify({requestId:i.requestId,ok:!0,sessionId:g.sessionId,outputPreview:g.output.slice(0,200)})),p?.send({type:"executor.agent.prompt.response",executorId:d.executorId,requestId:i.requestId,result:{ok:!0,output:g.output,sessionId:g.sessionId},at:new Date().toISOString()})}).catch(g=>{d=e.getConfig(),console.log("[worker-agent] prompt response",JSON.stringify({requestId:i.requestId,ok:!1,error:g instanceof Error?g.message:`${i.agentType} \u6267\u884C\u5931\u8D25\u3002`})),p?.send({type:"executor.agent.prompt.response",executorId:d.executorId,requestId:i.requestId,result:{ok:!1,output:g instanceof Error?g.message:`${i.agentType} \u6267\u884C\u5931\u8D25\u3002`},at:new Date().toISOString()})}).finally(()=>{s(i.requestId)})},c=()=>{let i=x();for(e.setConfig(i);e.getRunningTaskIds().length<Math.max(1,i.maxConcurrency)&&n.length>0;){let d=n[0];if(!d)break;let u=t.get(d);if(!u){o(d);continue}a(u),i=e.getConfig()}};return{handleMessage:i=>{if(e.getCurrentSocket()!==e.expectedSocket)return;let d=e.getConfig(),u=e.getConnection();if(i.type==="control-plane.ready"){d=Ci({opencodeConfigContent:i.opencodeConfigContent,codexConfigContent:i.codexConfigContent,claudeCodeConfigContent:i.claudeCodeConfigContent,defaultModel:i.defaultModel,agentSettings:i.agentSettings,mcpServers:i.mcpServers,maxConcurrency:i.maxConcurrency}),e.setConfig(d),A({config:d,executorId:d.executorId});return}if(i.type==="config.sync"){d=Ci({opencodeConfigContent:i.opencodeConfigContent,codexConfigContent:i.codexConfigContent,claudeCodeConfigContent:i.claudeCodeConfigContent,defaultModel:i.defaultModel,agentSettings:i.agentSettings,mcpServers:i.mcpServers,maxConcurrency:i.maxConcurrency}),e.setConfig(d),A({config:d});return}if(i.type==="config.export.request"){d=x(),e.setConfig(d),no().then(p=>{u?.send({type:"config.export.response",executorId:d.executorId,requestId:i.requestId,opencodeConfigContent:Le(d),codexConfigContent:d.codexConfigContent,claudeCodeConfigContent:d.claudeCodeConfigContent,defaultModel:p.defaultModel??d.defaultModel,availableModels:p.models,resolvedModelBindings:i.includeResolvedModelBindings?Xo({config:d,agentType:i.agentType,availableModels:p.models}):void 0,modelsMessage:p.message,at:new Date().toISOString()})});return}if(i.type==="executor.repo-probe.request"){d=x(),e.setConfig(d),Uo(i.localPath).then(p=>{u?.send({type:"executor.repo-probe.response",executorId:d.executorId,requestId:i.requestId,result:p,at:new Date().toISOString()})});return}if(i.type==="executor.telemetry.request"){d=x(),e.setConfig(d),u?.send({type:"executor.telemetry.response",executorId:d.executorId,requestId:i.requestId,telemetry:_t({workspaceRoot:d.workspaceRoot,workerVersion:Y()}),at:new Date().toISOString()});return}if(i.type==="executor.directory-browse.request"){d=x(),e.setConfig(d),No(i.rootPath||d.workspaceRoot,i.directoryPath).then(p=>{u?.send({type:"executor.directory-browse.response",executorId:d.executorId,requestId:i.requestId,result:p,at:new Date().toISOString()})});return}if(i.type==="executor.skills.scan.request"){d=x(),e.setConfig(d),Vo(d.workspaceRoot,i.rootPath).then(p=>{u?.send({type:"executor.skills.scan.response",executorId:d.executorId,requestId:i.requestId,result:p,at:new Date().toISOString()})});return}if(i.type==="executor.repo-branches.request"){d=x(),e.setConfig(d),console.log("[worker] [repo-branches] request received",JSON.stringify({requestId:i.requestId,executorId:d.executorId,localPath:i.localPath,repoUrl:i.repoUrl,preferredBranch:i.preferredBranch})),Lo(i.localPath,i.repoUrl,i.preferredBranch,i.gitIdentity).then(p=>{console.log("[worker] [repo-branches] request resolved",JSON.stringify({requestId:i.requestId,executorId:d.executorId,ok:p.ok,branchCount:p.branches.length,defaultBranch:p.defaultBranch,message:p.message})),u?.send({type:"executor.repo-branches.response",executorId:d.executorId,requestId:i.requestId,result:p,at:new Date().toISOString()})});return}if(i.type==="executor.git.diff.request"){d=x(),e.setConfig(d),Ao({worktreePath:i.worktreePath,repoUrl:i.repoUrl,baseBranch:i.baseBranch,gitIdentity:i.gitIdentity}).then(p=>{u?.send({type:"executor.git.diff.response",executorId:d.executorId,requestId:i.requestId,result:p,at:new Date().toISOString()})});return}if(i.type==="executor.git.commit-diff.request"){d=x(),e.setConfig(d),Mo({worktreePath:i.worktreePath,repoUrl:i.repoUrl,commitSha:i.commitSha,gitIdentity:i.gitIdentity}).then(p=>{u?.send({type:"executor.git.commit-diff.response",executorId:d.executorId,requestId:i.requestId,result:p,at:new Date().toISOString()})});return}if(i.type==="executor.git.rebase.request"){d=x(),e.setConfig(d),Oo({worktreePath:i.worktreePath,repoUrl:i.repoUrl,baseBranch:i.baseBranch,gitIdentity:i.gitIdentity}).then(p=>{u?.send({type:"executor.git.rebase.response",executorId:d.executorId,requestId:i.requestId,result:p,at:new Date().toISOString()})});return}if(i.type==="executor.git.graph.request"){d=x(),e.setConfig(d),Bo({worktreePath:i.worktreePath,repoUrl:i.repoUrl,baseBranch:i.baseBranch,limit:i.limit,gitIdentity:i.gitIdentity}).then(p=>{u?.send({type:"executor.git.graph.response",executorId:d.executorId,requestId:i.requestId,result:p,at:new Date().toISOString()})});return}if(i.type==="executor.git.push.request"){d=x(),e.setConfig(d),Wo({worktreePath:i.worktreePath,repoUrl:i.repoUrl,branchName:i.branchName,gitIdentity:i.gitIdentity}).then(p=>{u?.send({type:"executor.git.push.response",executorId:d.executorId,requestId:i.requestId,result:p,at:new Date().toISOString()})});return}if(i.type==="executor.git.pull-request.request"){d=x(),e.setConfig(d),_o({worktreePath:i.worktreePath,repoUrl:i.repoUrl,title:i.title,body:i.body,baseBranch:i.baseBranch,compareBranch:i.compareBranch,gitIdentity:i.gitIdentity}).then(p=>{u?.send({type:"executor.git.pull-request.response",executorId:d.executorId,requestId:i.requestId,result:p,at:new Date().toISOString()})});return}if(i.type==="executor.worktree.ensure.request"){d=x(),e.setConfig(d),ii({workspaceRoot:d.workspaceRoot,repoPath:i.repoPath,repoUrl:i.repoUrl,preferredBranch:i.preferredBranch,branchName:i.branchName,worktreePath:i.worktreePath,gitIdentity:i.gitIdentity,workingDirectoryMode:wi(i)}).then(p=>{u?.send({type:"executor.worktree.ensure.response",executorId:d.executorId,requestId:i.requestId,result:p,at:new Date().toISOString()})});return}if(i.type==="executor.worktree.cleanup.request"){d=x(),e.setConfig(d),si({workspaceRoot:d.workspaceRoot,repoPath:i.repoPath,repoUrl:i.repoUrl,worktreePath:i.worktreePath,workingDirectoryMode:wi(i)}).then(p=>{u?.send({type:"executor.worktree.cleanup.response",executorId:d.executorId,requestId:i.requestId,result:p,at:new Date().toISOString()})});return}if(i.type==="executor.agent.prompt.request"){t.has(i.requestId)||(t.set(i.requestId,i),n.push(i.requestId),e.setQueuedTaskIds([...e.getQueuedTaskIds(),Ft(i.requestId)]),e.syncRuntimeState()),c();return}if(i.type==="executor.agent.prompt.cancel"){o(i.requestId),t.delete(i.requestId),e.syncRuntimeState(),r.get(i.requestId)?.abort(),r.delete(i.requestId),e.drainExecutionQueue();return}if(i.type==="executor.terminal.request"){d=x(),e.setConfig(d),Se("received one-shot terminal request",{requestId:i.requestId,command:i.command,cwd:i.cwd||d.workspaceRoot}),e.runTerminalCommand(i.command,i.cwd||d.workspaceRoot).then(p=>{u?.send({type:"executor.terminal.response",executorId:d.executorId,requestId:i.requestId,result:p})});return}if(i.type==="executor.browser.run.request"){if(d=x(),e.setConfig(d),!d.executorToken?.trim()){u?.send({type:"executor.browser.run.response",executorId:d.executorId,requestId:i.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:i.mode??"playwright",finalUrl:i.appUrl,observationsCount:0,issueCount:1,at:new Date().toISOString()},at:new Date().toISOString()});return}Pt({cloudUrl:d.cloudUrl,executorToken:d.executorToken,taskId:i.taskId,workspaceId:i.workspaceId,workspaceSessionId:i.workspaceSessionId,cwd:i.cwd,appUrl:i.appUrl,healthUrl:i.healthUrl,goal:i.goal,mode:i.mode}).then(p=>{u?.send({type:"executor.browser.run.response",executorId:d.executorId,requestId:i.requestId,result:p,at:new Date().toISOString()})});return}if(i.type==="executor.terminal.session.open"){d=x(),e.setConfig(d);let p=i.cwd||d.workspaceRoot;Se("received terminal session open",{sessionId:i.sessionId,cwd:p});let g=e.openTerminalSession({cwd:p,onExit:w=>{e.terminalSessions.delete(i.sessionId),u?.send({type:"executor.terminal.session.exit",executorId:d.executorId,sessionId:i.sessionId,exitCode:w,at:new Date().toISOString()})},onLog:(w,k)=>{Se(w,{sessionId:i.sessionId,...k})},onOutput:(w,k)=>{Qd({connection:u,executorId:d.executorId,sessionId:i.sessionId,stream:w,chunk:k})},onReady:(w,k)=>{u?.send({type:"executor.terminal.session.ready",executorId:d.executorId,sessionId:i.sessionId,cwd:p,mode:w,at:new Date().toISOString()}),Se("terminal session ready",{sessionId:i.sessionId,cwd:p,mode:w,backend:k})}});e.terminalSessions.set(i.sessionId,g);return}if(i.type==="executor.terminal.session.input"){Se("received terminal session input",{sessionId:i.sessionId,inputLength:i.input.length,preview:i.input.slice(0,80)}),e.terminalSessions.get(i.sessionId)?.write(i.input);return}if(i.type==="executor.terminal.session.resize"){Se("received terminal session resize",{sessionId:i.sessionId,cols:i.cols,rows:i.rows}),e.terminalSessions.get(i.sessionId)?.resize(i.cols,i.rows);return}if(i.type==="executor.terminal.session.close"){Se("received terminal session close",{sessionId:i.sessionId});let p=e.terminalSessions.get(i.sessionId);p&&(p.kill(),e.terminalSessions.delete(i.sessionId));return}if(i.type==="task.assign"){let p=e.getRunningTaskIds(),g=e.getQueuedTaskIds();if(e.assignedTasks.has(i.task.id)||p.includes(i.task.id)||g.includes(i.task.id)){e.assignedTasks.set(i.task.id,i.task);return}e.assignedTasks.set(i.task.id,i.task),e.setQueuedTaskIds([...g,i.task.id]),e.syncRuntimeState(),u?.send({type:"task.ack",taskId:i.task.id,idempotencyKey:i.task.idempotencyKey,executorId:d.executorId,accepted:!0}),e.drainExecutionQueue();return}if(i.type==="task.cancel"){let p=e.assignedTasks.get(i.taskId);e.activeExecutions.get(i.taskId)?.abort(),e.activeExecutions.delete(i.taskId),ki(i.taskId),e.assignedTasks.delete(i.taskId),e.setQueuedTaskIds(e.getQueuedTaskIds().filter(g=>g!==i.taskId)),e.setRunningTaskIds(e.getRunningTaskIds().filter(g=>g!==i.taskId)),e.syncRuntimeState(),e.drainExecutionQueue(),p&&u?.send({type:"task.result",executorId:d.executorId,task:hi(p,d.executorId,i.reason)})}},drainPromptQueue:c}};import{existsSync as zr,mkdirSync as Zd,readFileSync as Si}from"node:fs";import{spawnSync as eu}from"node:child_process";import tu from"node:os";import zt from"node:path";var bi=zt.join(tu.homedir(),".ssh"),ru=["id_ed25519.pub","id_rsa.pub","id_ecdsa.pub"],nu="vibemux_worker_ed25519",ou=e=>{Zd(zt.dirname(e),{recursive:!0});let t=eu("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())},Vr=()=>{try{for(let r of ru){let n=zt.join(bi,r);if(zr(n))return Si(n,"utf8").trim()}let e=zt.join(bi,nu),t=`${e}.pub`;return zr(t)||ou(e),zr(t)?Si(t,"utf8").trim():void 0}catch{return}};import{spawn as Kr,spawnSync as iu}from"node:child_process";import{accessSync as su,constants as au}from"node:fs";import vi from"node:os";import{createRequire as cu}from"node:module";import lu from"node:path";import{StringDecoder as Ii}from"node:string_decoder";var Ti=120,Ei=32,Xr="xterm-256color",du=250,uu=cu(import.meta.url),pu=String.raw`
85
+ `),output:m.output,filesChanged:f.changedFiles.length>0?f.changedFiles:S.filesChanged,remoteBranchName:f.remoteBranchName,commitShas:f.commitShas??S.commitShas,patchArtifactId:P,startedAt:t,completedAt:U,durationSec:Math.max(0,Math.round((new Date(U).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:U,updatedAt:U,result:V}}}catch(c){let l=new Date().toISOString(),i=c instanceof Error?c.message:"worker task execution failed";return{task:{...e.task,status:"failed",startedAt:t,completedAt:l,updatedAt:l,errorMessage:i,result:Oe({taskId:e.task.id,status:"failed",returnMode:e.task.returnMode,summary:i,output:i,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(),a?.cleanup()}};var zr=new Map,Jr=e=>{let t=zr.get(e);if(t){for(let r of t)clearTimeout(r);zr.delete(e)}},wi=(e,t,r)=>{let n=new Date().toISOString();return{...e,status:"cancelled",executorNodeId:t,completedAt:n,updatedAt:n,result:Oe({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})}},Ci=Jr,xi=e=>{let{task:t,executorId:r,workspaceRoot:n,projectBindings:o,uploadPatchArtifact:s,connection:a}=e,c=new AbortController,l=[setTimeout(()=>{e.onStart(t.id),yi({task:t,executorId:r,workspaceRoot:n,projectBindings:o,signal:c.signal,uploadPatchArtifact:s,emit(i,d){c.signal.aborted||a.send({type:"task.event",taskId:t.id,idempotencyKey:t.idempotencyKey,executorId:r,status:i,message:d,at:new Date().toISOString()})}}).then(({task:i})=>{c.signal.aborted||(e.onFinish(t.id),a.send({type:"task.result",executorId:r,task:i}),Jr(t.id))})},20)];return zr.set(t.id,l),{abort(){c.abort(),e.onFinish(t.id),Jr(t.id)}}};var Se=(e,t)=>{},Jt=e=>`prompt:${e}`,Si=e=>e.workingDirectoryMode==="original-dir"?"original-dir":"worktree",su=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()}})},bi=e=>{let t=x(),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,a={...t,opencodeConfigContent:r,codexConfigContent:n,claudeCodeConfigContent:o,defaultModel:s,agentSettings:Ue(e.agentSettings??t.agentSettings,s),mcpServers:e.mcpServers??t.mcpServers??[],maxConcurrency:Math.max(1,e.maxConcurrency??t.maxConcurrency)};return Pe(a),A({config:a}),a};var vi=e=>{let t=new Map,r=new Map,n=[],o=i=>{let d=n.indexOf(i);d!==-1&&n.splice(d,1),e.setQueuedTaskIds(e.getQueuedTaskIds().filter(u=>u!==Jt(i)))},s=i=>{t.delete(i),r.delete(i),e.setRunningTaskIds(e.getRunningTaskIds().filter(d=>d!==Jt(i))),e.syncRuntimeState(),e.drainExecutionQueue()},a=i=>{let d=x();e.setConfig(d),o(i.requestId),e.setRunningTaskIds([...e.getRunningTaskIds(),Jt(i.requestId)]),e.syncRuntimeState(),console.log("[worker-agent] prompt request",JSON.stringify({requestId:i.requestId,agentType:i.agentType,cwd:i.cwd,title:i.title,executionModel:i.executionModel??"default",attachmentCount:i.attachments?.length??0,promptPreview:i.prompt.slice(0,160)}));let u=new AbortController;r.set(i.requestId,u);let p=e.getConnection();_r({agentType:i.agentType,actingUserId:i.actingUserId,cwd:i.cwd,title:i.title,prompt:i.prompt,attachments:i.attachments,cloudUrl:d.cloudUrl,executionModel:i.executionModel,agentSettings:i.agentSettings??d.agentSettings[i.agentType],opencodeConfig:i.opencodeConfig,mcpServers:i.mcpServers,runtimeSkillPackages:i.runtimeSkillPackages,runtimeEnv:i.runtimeEnv,signal:u.signal,onEvent:g=>{d=e.getConfig(),e.getConnection()?.send({type:"executor.agent.prompt.event",executorId:d.executorId,requestId:i.requestId,event:g,at:new Date().toISOString()})}}).then(g=>{d=e.getConfig(),console.log("[worker-agent] prompt response",JSON.stringify({requestId:i.requestId,ok:!0,sessionId:g.sessionId,outputPreview:g.output.slice(0,200)})),p?.send({type:"executor.agent.prompt.response",executorId:d.executorId,requestId:i.requestId,result:{ok:!0,output:g.output,sessionId:g.sessionId},at:new Date().toISOString()})}).catch(g=>{d=e.getConfig(),console.log("[worker-agent] prompt response",JSON.stringify({requestId:i.requestId,ok:!1,error:g instanceof Error?g.message:`${i.agentType} \u6267\u884C\u5931\u8D25\u3002`})),p?.send({type:"executor.agent.prompt.response",executorId:d.executorId,requestId:i.requestId,result:{ok:!1,output:g instanceof Error?g.message:`${i.agentType} \u6267\u884C\u5931\u8D25\u3002`},at:new Date().toISOString()})}).finally(()=>{s(i.requestId)})},c=()=>{let i=x();for(e.setConfig(i);e.getRunningTaskIds().length<Math.max(1,i.maxConcurrency)&&n.length>0;){let d=n[0];if(!d)break;let u=t.get(d);if(!u){o(d);continue}a(u),i=e.getConfig()}};return{handleMessage:i=>{if(e.getCurrentSocket()!==e.expectedSocket)return;let d=e.getConfig(),u=e.getConnection();if(i.type==="control-plane.ready"){d=bi({opencodeConfigContent:i.opencodeConfigContent,codexConfigContent:i.codexConfigContent,claudeCodeConfigContent:i.claudeCodeConfigContent,defaultModel:i.defaultModel,agentSettings:i.agentSettings,mcpServers:i.mcpServers,maxConcurrency:i.maxConcurrency}),e.setConfig(d),A({config:d,executorId:d.executorId});return}if(i.type==="config.sync"){d=bi({opencodeConfigContent:i.opencodeConfigContent,codexConfigContent:i.codexConfigContent,claudeCodeConfigContent:i.claudeCodeConfigContent,defaultModel:i.defaultModel,agentSettings:i.agentSettings,mcpServers:i.mcpServers,maxConcurrency:i.maxConcurrency}),e.setConfig(d),A({config:d});return}if(i.type==="config.export.request"){d=x(),e.setConfig(d),so().then(p=>{u?.send({type:"config.export.response",executorId:d.executorId,requestId:i.requestId,opencodeConfigContent:Le(d),codexConfigContent:d.codexConfigContent,claudeCodeConfigContent:d.claudeCodeConfigContent,defaultModel:p.defaultModel??d.defaultModel,availableModels:p.models,resolvedModelBindings:i.includeResolvedModelBindings?Zo({config:d,agentType:i.agentType,availableModels:p.models}):void 0,modelsMessage:p.message,at:new Date().toISOString()})});return}if(i.type==="executor.repo-probe.request"){d=x(),e.setConfig(d),jo(i.localPath).then(p=>{u?.send({type:"executor.repo-probe.response",executorId:d.executorId,requestId:i.requestId,result:p,at:new Date().toISOString()})});return}if(i.type==="executor.git.pat.verify.request"){d=x(),e.setConfig(d),ro(i.patToken,i.provider,i.host).then(p=>{u?.send({type:"executor.git.pat.verify.response",executorId:d.executorId,requestId:i.requestId,result:p,at:new Date().toISOString()})});return}if(i.type==="executor.telemetry.request"){d=x(),e.setConfig(d),u?.send({type:"executor.telemetry.response",executorId:d.executorId,requestId:i.requestId,telemetry:_t({workspaceRoot:d.workspaceRoot,workerVersion:Y()}),at:new Date().toISOString()});return}if(i.type==="executor.directory-browse.request"){d=x(),e.setConfig(d),Go(i.rootPath||d.workspaceRoot,i.directoryPath).then(p=>{u?.send({type:"executor.directory-browse.response",executorId:d.executorId,requestId:i.requestId,result:p,at:new Date().toISOString()})});return}if(i.type==="executor.skills.scan.request"){d=x(),e.setConfig(d),Yo(d.workspaceRoot,i.rootPath).then(p=>{u?.send({type:"executor.skills.scan.response",executorId:d.executorId,requestId:i.requestId,result:p,at:new Date().toISOString()})});return}if(i.type==="executor.repo-branches.request"){d=x(),e.setConfig(d),console.log("[worker] [repo-branches] request received",JSON.stringify({requestId:i.requestId,executorId:d.executorId,localPath:i.localPath,repoUrl:i.repoUrl,preferredBranch:i.preferredBranch})),qo(i.localPath,i.repoUrl,i.preferredBranch,i.gitIdentity).then(p=>{console.log("[worker] [repo-branches] request resolved",JSON.stringify({requestId:i.requestId,executorId:d.executorId,ok:p.ok,branchCount:p.branches.length,defaultBranch:p.defaultBranch,message:p.message})),u?.send({type:"executor.repo-branches.response",executorId:d.executorId,requestId:i.requestId,result:p,at:new Date().toISOString()})});return}if(i.type==="executor.git.diff.request"){d=x(),e.setConfig(d),Bo({worktreePath:i.worktreePath,repoUrl:i.repoUrl,baseBranch:i.baseBranch,gitIdentity:i.gitIdentity}).then(p=>{u?.send({type:"executor.git.diff.response",executorId:d.executorId,requestId:i.requestId,result:p,at:new Date().toISOString()})});return}if(i.type==="executor.git.commit-diff.request"){d=x(),e.setConfig(d),Wo({worktreePath:i.worktreePath,repoUrl:i.repoUrl,commitSha:i.commitSha,gitIdentity:i.gitIdentity}).then(p=>{u?.send({type:"executor.git.commit-diff.response",executorId:d.executorId,requestId:i.requestId,result:p,at:new Date().toISOString()})});return}if(i.type==="executor.git.rebase.request"){d=x(),e.setConfig(d),_o({worktreePath:i.worktreePath,repoUrl:i.repoUrl,baseBranch:i.baseBranch,gitIdentity:i.gitIdentity}).then(p=>{u?.send({type:"executor.git.rebase.response",executorId:d.executorId,requestId:i.requestId,result:p,at:new Date().toISOString()})});return}if(i.type==="executor.git.graph.request"){d=x(),e.setConfig(d),$o({worktreePath:i.worktreePath,repoUrl:i.repoUrl,baseBranch:i.baseBranch,limit:i.limit,gitIdentity:i.gitIdentity}).then(p=>{u?.send({type:"executor.git.graph.response",executorId:d.executorId,requestId:i.requestId,result:p,at:new Date().toISOString()})});return}if(i.type==="executor.git.push.request"){d=x(),e.setConfig(d),Uo({worktreePath:i.worktreePath,repoUrl:i.repoUrl,branchName:i.branchName,gitIdentity:i.gitIdentity}).then(p=>{u?.send({type:"executor.git.push.response",executorId:d.executorId,requestId:i.requestId,result:p,at:new Date().toISOString()})});return}if(i.type==="executor.git.pull-request.request"){d=x(),e.setConfig(d),Do({worktreePath:i.worktreePath,repoUrl:i.repoUrl,title:i.title,body:i.body,baseBranch:i.baseBranch,compareBranch:i.compareBranch,gitIdentity:i.gitIdentity}).then(p=>{u?.send({type:"executor.git.pull-request.response",executorId:d.executorId,requestId:i.requestId,result:p,at:new Date().toISOString()})});return}if(i.type==="executor.worktree.ensure.request"){d=x(),e.setConfig(d),ci({workspaceRoot:d.workspaceRoot,repoPath:i.repoPath,repoUrl:i.repoUrl,preferredBranch:i.preferredBranch,branchName:i.branchName,worktreePath:i.worktreePath,gitIdentity:i.gitIdentity,workingDirectoryMode:Si(i)}).then(p=>{u?.send({type:"executor.worktree.ensure.response",executorId:d.executorId,requestId:i.requestId,result:p,at:new Date().toISOString()})});return}if(i.type==="executor.worktree.cleanup.request"){d=x(),e.setConfig(d),li({workspaceRoot:d.workspaceRoot,repoPath:i.repoPath,repoUrl:i.repoUrl,worktreePath:i.worktreePath,workingDirectoryMode:Si(i)}).then(p=>{u?.send({type:"executor.worktree.cleanup.response",executorId:d.executorId,requestId:i.requestId,result:p,at:new Date().toISOString()})});return}if(i.type==="executor.agent.prompt.request"){t.has(i.requestId)||(t.set(i.requestId,i),n.push(i.requestId),e.setQueuedTaskIds([...e.getQueuedTaskIds(),Jt(i.requestId)]),e.syncRuntimeState()),c();return}if(i.type==="executor.agent.prompt.cancel"){o(i.requestId),t.delete(i.requestId),e.syncRuntimeState(),r.get(i.requestId)?.abort(),r.delete(i.requestId),e.drainExecutionQueue();return}if(i.type==="executor.terminal.request"){d=x(),e.setConfig(d),Se("received one-shot terminal request",{requestId:i.requestId,command:i.command,cwd:i.cwd||d.workspaceRoot}),e.runTerminalCommand(i.command,i.cwd||d.workspaceRoot).then(p=>{u?.send({type:"executor.terminal.response",executorId:d.executorId,requestId:i.requestId,result:p})});return}if(i.type==="executor.browser.run.request"){if(d=x(),e.setConfig(d),!d.executorToken?.trim()){u?.send({type:"executor.browser.run.response",executorId:d.executorId,requestId:i.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:i.mode??"playwright",finalUrl:i.appUrl,observationsCount:0,issueCount:1,at:new Date().toISOString()},at:new Date().toISOString()});return}It({cloudUrl:d.cloudUrl,executorToken:d.executorToken,taskId:i.taskId,workspaceId:i.workspaceId,workspaceSessionId:i.workspaceSessionId,cwd:i.cwd,appUrl:i.appUrl,healthUrl:i.healthUrl,goal:i.goal,mode:i.mode}).then(p=>{u?.send({type:"executor.browser.run.response",executorId:d.executorId,requestId:i.requestId,result:p,at:new Date().toISOString()})});return}if(i.type==="executor.terminal.session.open"){d=x(),e.setConfig(d);let p=i.cwd||d.workspaceRoot;Se("received terminal session open",{sessionId:i.sessionId,cwd:p});let g=e.openTerminalSession({cwd:p,onExit:w=>{e.terminalSessions.delete(i.sessionId),u?.send({type:"executor.terminal.session.exit",executorId:d.executorId,sessionId:i.sessionId,exitCode:w,at:new Date().toISOString()})},onLog:(w,k)=>{Se(w,{sessionId:i.sessionId,...k})},onOutput:(w,k)=>{su({connection:u,executorId:d.executorId,sessionId:i.sessionId,stream:w,chunk:k})},onReady:(w,k)=>{u?.send({type:"executor.terminal.session.ready",executorId:d.executorId,sessionId:i.sessionId,cwd:p,mode:w,at:new Date().toISOString()}),Se("terminal session ready",{sessionId:i.sessionId,cwd:p,mode:w,backend:k})}});e.terminalSessions.set(i.sessionId,g);return}if(i.type==="executor.terminal.session.input"){Se("received terminal session input",{sessionId:i.sessionId,inputLength:i.input.length,preview:i.input.slice(0,80)}),e.terminalSessions.get(i.sessionId)?.write(i.input);return}if(i.type==="executor.terminal.session.resize"){Se("received terminal session resize",{sessionId:i.sessionId,cols:i.cols,rows:i.rows}),e.terminalSessions.get(i.sessionId)?.resize(i.cols,i.rows);return}if(i.type==="executor.terminal.session.close"){Se("received terminal session close",{sessionId:i.sessionId});let p=e.terminalSessions.get(i.sessionId);p&&(p.kill(),e.terminalSessions.delete(i.sessionId));return}if(i.type==="task.assign"){let p=e.getRunningTaskIds(),g=e.getQueuedTaskIds();if(e.assignedTasks.has(i.task.id)||p.includes(i.task.id)||g.includes(i.task.id)){e.assignedTasks.set(i.task.id,i.task);return}e.assignedTasks.set(i.task.id,i.task),e.setQueuedTaskIds([...g,i.task.id]),e.syncRuntimeState(),u?.send({type:"task.ack",taskId:i.task.id,idempotencyKey:i.task.idempotencyKey,executorId:d.executorId,accepted:!0}),e.drainExecutionQueue();return}if(i.type==="task.cancel"){let p=e.assignedTasks.get(i.taskId);e.activeExecutions.get(i.taskId)?.abort(),e.activeExecutions.delete(i.taskId),Ci(i.taskId),e.assignedTasks.delete(i.taskId),e.setQueuedTaskIds(e.getQueuedTaskIds().filter(g=>g!==i.taskId)),e.setRunningTaskIds(e.getRunningTaskIds().filter(g=>g!==i.taskId)),e.syncRuntimeState(),e.drainExecutionQueue(),p&&u?.send({type:"task.result",executorId:d.executorId,task:wi(p,d.executorId,i.reason)})}},drainPromptQueue:c}};import{existsSync as Fr,mkdirSync as au,readFileSync as Pi}from"node:fs";import{spawnSync as cu}from"node:child_process";import lu from"node:os";import Ft from"node:path";var Ii=Ft.join(lu.homedir(),".ssh"),du=["id_ed25519.pub","id_rsa.pub","id_ecdsa.pub"],uu="vibemux_worker_ed25519",pu=e=>{au(Ft.dirname(e),{recursive:!0});let t=cu("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())},Vr=()=>{try{for(let r of du){let n=Ft.join(Ii,r);if(Fr(n))return Pi(n,"utf8").trim()}let e=Ft.join(Ii,uu),t=`${e}.pub`;return Fr(t)||pu(e),Fr(t)?Pi(t,"utf8").trim():void 0}catch{return}};import{spawn as Kr,spawnSync as gu}from"node:child_process";import{accessSync as mu,constants as fu}from"node:fs";import Ti from"node:os";import{createRequire as hu}from"node:module";import ku from"node:path";import{StringDecoder as Ei}from"node:string_decoder";var Ai=120,Mi=32,Xr="xterm-256color",yu=250,wu=hu(import.meta.url),Cu=String.raw`
86
86
  import base64
87
87
  import errno
88
88
  import fcntl
@@ -221,11 +221,11 @@ except OSError:
221
221
  pass
222
222
 
223
223
  sys.exit(exit_code)
224
- `,ge,lt,gu=["-i","-l"],dt=e=>{let t=e?.trim();return t?t==="~"?vi.homedir():t.startsWith("~/")?lu.join(vi.homedir(),t.slice(2)):t:process.cwd()},Vt=e=>{if(!e?.trim())return!1;try{return su(e,au.X_OK),!0}catch{return!1}},Pi=e=>{let t=e.end();return t.length>0?t:""},Yr=(e,t,r)=>{let n=!1,o=setTimeout(()=>{n||(n=!0,e(t,r))},du);return{markReady:()=>{n||(n=!0,clearTimeout(o),e(t,r))},dispose:()=>{clearTimeout(o)}}},mu=()=>{if(ge!==void 0)return ge;let e=["/usr/bin/python3","/opt/homebrew/bin/python3"];for(let r of e)if(Vt(r))return ge=r,ge;let t=["python3","python"];for(let r of t){let n=iu(r,["-c","import sys"],{stdio:"ignore"});if(!n.error&&n.status===0)return ge=r,ge}return ge=null,ge},fu=()=>{if(lt!==void 0)return lt;try{lt=uu("node-pty")}catch{lt=null}return lt},Kt=()=>{let e=process.env.SHELL?.trim();return e&&!e.includes("fish")&&Vt(e)?e:process.platform==="darwin"&&Vt("/bin/zsh")?"/bin/zsh":Vt("/bin/bash")?"/bin/bash":"sh"},Ri=(e,t)=>new Promise(r=>{let n=Kt(),o=dt(t),s=Kr(n,["-l","-c",e],{cwd:o,env:process.env}),a="",c="";s.stdout.on("data",l=>{a+=l.toString()}),s.stderr.on("data",l=>{c+=l.toString()}),s.on("close",l=>{r({command:e,cwd:o,stdout:a,stderr:c,exitCode:l??0,at:new Date().toISOString()})}),s.on("error",l=>{r({command:e,cwd:o,stdout:a,stderr:`${c}${l.message}`,exitCode:1,at:new Date().toISOString()})})}),hu=e=>{let{cols:t=Ti,cwd:r,onExit:n,onLog:o,onOutput:s,onReady:a,rows:c=Ei,shell:l=Kt()}=e,i=dt(r),d=fu();if(!d)throw new Error("node-pty \u4E0D\u53EF\u7528\uFF0C\u65E0\u6CD5\u542F\u52A8\u539F\u751F PTY\u3002");let u=d.spawn(l,gu,{cwd:i,env:process.env,cols:t,rows:c,name:Xr}),p=Yr(a,"pty","node-pty");return u.onData(g=>{p.markReady(),o("pty output",{backend:"node-pty",chunkLength:g.length,preview:g.slice(0,120)}),s("stdout",g)}),u.onExit(({exitCode:g})=>{p.dispose(),o("pty exit",{backend:"node-pty",exitCode:g}),n(g??0)}),{backend:"node-pty",mode:"pty",write:g=>u.write(g),resize:(g,w)=>u.resize(Math.max(1,g),Math.max(1,w)),kill:()=>u.kill("SIGTERM")}},ku=e=>{let{cols:t=Ti,cwd:r,onExit:n,onLog:o,onOutput:s,onReady:a,rows:c=Ei,shell:l=Kt()}=e,i=dt(r),d=mu();if(!d)throw new Error("python3 \u4E0D\u53EF\u7528\uFF0C\u65E0\u6CD5\u542F\u52A8 PTY fallback\u3002");let u=Kr(d,["-u","-c",pu],{cwd:i,env:{...process.env,DEVKANBAN_COLS:String(Math.max(1,t)),DEVKANBAN_CWD:i,DEVKANBAN_ROWS:String(Math.max(1,c)),DEVKANBAN_SHELL:l,DEVKANBAN_TERM_NAME:Xr},stdio:["pipe","pipe","pipe"]}),p=u.stdin;if(!p)throw u.kill("SIGTERM"),new Error("python PTY control pipe \u4E0D\u53EF\u7528\u3002");let g=new Ii("utf8"),w=new Ii("utf8"),k=Yr(a,"pty","python-pty"),m=(S,I)=>{I.length!==0&&(S==="stdout"&&k.markReady(),o("pty output",{backend:"python-pty",chunkLength:I.length,preview:I.slice(0,120),stream:S}),s(S,I))};u.stdout.on("data",S=>{m("stdout",g.write(S))}),u.stderr.on("data",S=>{m("system",w.write(S))}),u.on("error",S=>{o("python pty error",{message:S.message}),s("system",`\r
224
+ `,ge,lt,xu=["-i","-l"],dt=e=>{let t=e?.trim();return t?t==="~"?Ti.homedir():t.startsWith("~/")?ku.join(Ti.homedir(),t.slice(2)):t:process.cwd()},Vt=e=>{if(!e?.trim())return!1;try{return mu(e,fu.X_OK),!0}catch{return!1}},Ri=e=>{let t=e.end();return t.length>0?t:""},Yr=(e,t,r)=>{let n=!1,o=setTimeout(()=>{n||(n=!0,e(t,r))},yu);return{markReady:()=>{n||(n=!0,clearTimeout(o),e(t,r))},dispose:()=>{clearTimeout(o)}}},Su=()=>{if(ge!==void 0)return ge;let e=["/usr/bin/python3","/opt/homebrew/bin/python3"];for(let r of e)if(Vt(r))return ge=r,ge;let t=["python3","python"];for(let r of t){let n=gu(r,["-c","import sys"],{stdio:"ignore"});if(!n.error&&n.status===0)return ge=r,ge}return ge=null,ge},bu=()=>{if(lt!==void 0)return lt;try{lt=wu("node-pty")}catch{lt=null}return lt},Kt=()=>{let e=process.env.SHELL?.trim();return e&&!e.includes("fish")&&Vt(e)?e:process.platform==="darwin"&&Vt("/bin/zsh")?"/bin/zsh":Vt("/bin/bash")?"/bin/bash":"sh"},Oi=(e,t)=>new Promise(r=>{let n=Kt(),o=dt(t),s=Kr(n,["-l","-c",e],{cwd:o,env:process.env}),a="",c="";s.stdout.on("data",l=>{a+=l.toString()}),s.stderr.on("data",l=>{c+=l.toString()}),s.on("close",l=>{r({command:e,cwd:o,stdout:a,stderr:c,exitCode:l??0,at:new Date().toISOString()})}),s.on("error",l=>{r({command:e,cwd:o,stdout:a,stderr:`${c}${l.message}`,exitCode:1,at:new Date().toISOString()})})}),vu=e=>{let{cols:t=Ai,cwd:r,onExit:n,onLog:o,onOutput:s,onReady:a,rows:c=Mi,shell:l=Kt()}=e,i=dt(r),d=bu();if(!d)throw new Error("node-pty \u4E0D\u53EF\u7528\uFF0C\u65E0\u6CD5\u542F\u52A8\u539F\u751F PTY\u3002");let u=d.spawn(l,xu,{cwd:i,env:process.env,cols:t,rows:c,name:Xr}),p=Yr(a,"pty","node-pty");return u.onData(g=>{p.markReady(),o("pty output",{backend:"node-pty",chunkLength:g.length,preview:g.slice(0,120)}),s("stdout",g)}),u.onExit(({exitCode:g})=>{p.dispose(),o("pty exit",{backend:"node-pty",exitCode:g}),n(g??0)}),{backend:"node-pty",mode:"pty",write:g=>u.write(g),resize:(g,w)=>u.resize(Math.max(1,g),Math.max(1,w)),kill:()=>u.kill("SIGTERM")}},Pu=e=>{let{cols:t=Ai,cwd:r,onExit:n,onLog:o,onOutput:s,onReady:a,rows:c=Mi,shell:l=Kt()}=e,i=dt(r),d=Su();if(!d)throw new Error("python3 \u4E0D\u53EF\u7528\uFF0C\u65E0\u6CD5\u542F\u52A8 PTY fallback\u3002");let u=Kr(d,["-u","-c",Cu],{cwd:i,env:{...process.env,DEVKANBAN_COLS:String(Math.max(1,t)),DEVKANBAN_CWD:i,DEVKANBAN_ROWS:String(Math.max(1,c)),DEVKANBAN_SHELL:l,DEVKANBAN_TERM_NAME:Xr},stdio:["pipe","pipe","pipe"]}),p=u.stdin;if(!p)throw u.kill("SIGTERM"),new Error("python PTY control pipe \u4E0D\u53EF\u7528\u3002");let g=new Ei("utf8"),w=new Ei("utf8"),k=Yr(a,"pty","python-pty"),m=(S,P)=>{P.length!==0&&(S==="stdout"&&k.markReady(),o("pty output",{backend:"python-pty",chunkLength:P.length,preview:P.slice(0,120),stream:S}),s(S,P))};u.stdout.on("data",S=>{m("stdout",g.write(S))}),u.stderr.on("data",S=>{m("system",w.write(S))}),u.on("error",S=>{o("python pty error",{message:S.message}),s("system",`\r
225
225
  [python-pty error] ${S.message}\r
226
- `)}),u.on("close",S=>{k.dispose(),m("stdout",Pi(g)),m("system",Pi(w)),o("pty exit",{backend:"python-pty",exitCode:S??0}),n(S??0)});let f=S=>{p.destroyed||p.write(`${JSON.stringify(S)}
227
- `)};return{backend:"python-pty",mode:"pty",write:S=>{f({type:"input",data:Buffer.from(S,"utf8").toString("base64")})},resize:(S,I)=>{f({type:"resize",cols:Math.max(1,S),rows:Math.max(1,I)})},kill:()=>{f({type:"close"}),p.end(),u.kill("SIGTERM")}}},yu=e=>{let{cwd:t,onExit:r,onLog:n,onOutput:o,onReady:s}=e,a=dt(t),c=Kr("/bin/bash",["-il"],{cwd:a,env:{...process.env,BASH_SILENCE_DEPRECATION_WARNING:"1",TERM:process.env.TERM||Xr},stdio:"pipe"});c.stdin.setDefaultEncoding("utf8"),c.stdout.setEncoding("utf8"),c.stderr.setEncoding("utf8");let l=Yr(s,"pipe","pipe");return c.stdout.on("data",i=>{l.markReady(),n("fallback shell stdout",{backend:"pipe",chunkLength:i.length,preview:i.slice(0,120)}),o("stdout",i)}),c.stderr.on("data",i=>{l.markReady(),n("fallback shell stderr",{backend:"pipe",chunkLength:i.length,preview:i.slice(0,120)}),o("stderr",i)}),c.on("error",i=>{n("fallback shell error",{message:i.message}),o("system",`\r
226
+ `)}),u.on("close",S=>{k.dispose(),m("stdout",Ri(g)),m("system",Ri(w)),o("pty exit",{backend:"python-pty",exitCode:S??0}),n(S??0)});let f=S=>{p.destroyed||p.write(`${JSON.stringify(S)}
227
+ `)};return{backend:"python-pty",mode:"pty",write:S=>{f({type:"input",data:Buffer.from(S,"utf8").toString("base64")})},resize:(S,P)=>{f({type:"resize",cols:Math.max(1,S),rows:Math.max(1,P)})},kill:()=>{f({type:"close"}),p.end(),u.kill("SIGTERM")}}},Iu=e=>{let{cwd:t,onExit:r,onLog:n,onOutput:o,onReady:s}=e,a=dt(t),c=Kr("/bin/bash",["-il"],{cwd:a,env:{...process.env,BASH_SILENCE_DEPRECATION_WARNING:"1",TERM:process.env.TERM||Xr},stdio:"pipe"});c.stdin.setDefaultEncoding("utf8"),c.stdout.setEncoding("utf8"),c.stderr.setEncoding("utf8");let l=Yr(s,"pipe","pipe");return c.stdout.on("data",i=>{l.markReady(),n("fallback shell stdout",{backend:"pipe",chunkLength:i.length,preview:i.slice(0,120)}),o("stdout",i)}),c.stderr.on("data",i=>{l.markReady(),n("fallback shell stderr",{backend:"pipe",chunkLength:i.length,preview:i.slice(0,120)}),o("stderr",i)}),c.on("error",i=>{n("fallback shell error",{message:i.message}),o("system",`\r
228
228
  [fallback shell error] ${i.message}\r
229
229
  `)}),c.on("close",i=>{l.dispose(),n("fallback shell exit",{backend:"pipe",exitCode:i??0}),r(i??0)}),c.stdin.write(`export PS1="$ "
230
230
  `),{backend:"pipe",mode:"pipe",write:i=>{c.stdin.destroyed||c.stdin.write(i.replace(/\r/g,`
231
- `))},resize:()=>{},kill:()=>c.kill("SIGTERM")}},Ai=e=>{let{cwd:t,onLog:r}=e,n=dt(t),o=e.shell??Kt();r("opening pty session",{cwd:n,shell:o});try{return hu({...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 ku({...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 yu({...e,cwd:n})};var P={connection:null,reconnectTimer:null,stopped:!1,connect:null},Cu=new Map,Mi=e=>_t({workspaceRoot:e,workerVersion:Y()}),Oi=e=>{let t=process.platform==="darwin"?["open",e]:process.platform==="win32"?["cmd","/c","start","",e]:["xdg-open",e];wu(t[0],t.slice(1),{detached:!0,stdio:"ignore"}).unref()},Bi=async()=>{let e=Y(),t=await ve();return{currentVersion:e,latestVersion:t.latestVersion||e,check:t}},Wi=(e,t,r,n)=>{let o=n.check.channel||Ue(),s=o==="preview"?"Vibemux Worker Preview":"Vibemux Worker",a=process.env.VIBEMUX_WORKER_AUTO_UPDATE?.trim().toLowerCase(),c=a!=="0"&&a!=="false"&&a!=="off",l=[["Mode",e],["Channel",o],["Current",n.currentVersion],["Latest",n.latestVersion],["Auto Update",c?"enabled":"disabled"],["Cloud",t],["Local",r]],i=e==="open"?"Opening cloud and local consoles in your browser...":"Worker daemon is ready and waiting for tasks.",d=Math.max(...l.map(([w])=>w.length)),u=[s,"",...l.map(([w,k])=>`${w.padEnd(d)} : ${k}`),"",i],p=Math.max(...u.map(w=>w.length)),g=`+${"-".repeat(p+2)}+`;console.log(g);for(let w of u)console.log(`| ${w.padEnd(p)} |`);console.log(g)},_i=()=>{let e=x();Ir();let t=`http://127.0.0.1:${e.localServerPort}`;Bi().then(r=>{Wi("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(()=>{Oi(e.cloudUrl),Oi(t)},250)};var Kn=()=>{P.stopped=!0,P.reconnectTimer&&(clearTimeout(P.reconnectTimer),P.reconnectTimer=null),P.connection?.socket?.close(1e3,"manual disconnect"),P.connection=null,A({daemonMode:"disconnected",connected:!1,lastDisconnectAt:new Date().toISOString(),lastError:"Control plane connection was disconnected manually."})},vr=()=>{let e=x();if(!e.executorId||!e.executorToken)throw new Error("This worker is not paired yet, so it cannot connect to the control plane.");P.stopped=!1,P.reconnectTimer&&(clearTimeout(P.reconnectTimer),P.reconnectTimer=null),P.connection?.socket?.close(1e3,"manual reconnect"),P.connection=null,P.connect?.()},$i=()=>{P.stopped=!1;let e=x(),t=[],r=[],n=new Map,o=new Map,s=null,a=null,c=!1,l=new Date().toISOString();A({daemonMode:"starting",paired:!!(e.executorId&&e.executorToken),executorId:e.executorId,config:e,startedAt:l,lastConnectAttemptAt:l,lastError:void 0});let i=`http://127.0.0.1:${e.localServerPort}`;Bi().then(m=>(Wi("daemon",e.cloudUrl,i,m),Sr(m.check))).catch(m=>{let f=m instanceof Error?m.message:"worker startup banner failed";console.error("[worker] startup banner failed",f)}),Et(e.workspaceRoot),Ir();let d=()=>{A({queuedTaskIds:r,runningTaskIds:t,lastTaskAt:new Date().toISOString()})},u=()=>{for(e=x();t.length<Math.max(1,e.maxConcurrency)&&r.length>0;){let m=r[0];r=r.slice(1);let f=n.get(m);if(!f)continue;t=[...t,m],d();let S=yi({task:f,executorId:e.executorId,workspaceRoot:e.workspaceRoot,projectBindings:e.projectBindings,uploadPatchArtifact:e.executorToken?({taskId:I,filename:D,content:V})=>gr({cloudUrl:e.cloudUrl,executorToken:e.executorToken,taskId:I,filename:D,content:V}):void 0,connection:s??P.connection,onStart(){},onFinish(I){n.delete(I),o.delete(I),t=t.filter(D=>D!==I),d(),g()}});o.set(m,S)}},p=null,g=()=>{u(),p?.drainPromptQueue()},w=m=>{c=P.stopped,!(c||a)&&(a=setTimeout(()=>{a=null,P.reconnectTimer=null,k()},5e3),P.reconnectTimer=a,A({daemonMode:"disconnected",connected:!1,paired:!0,lastDisconnectAt:new Date().toISOString(),lastError:m}))},k=()=>{if(!P.stopped){if(e=x(),!e.executorId||!e.executorToken){A({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}A({daemonMode:"starting",connected:!1,paired:!0,executorId:e.executorId,config:e,lastConnectAttemptAt:new Date().toISOString()});try{let m=fr(e,{onOpen(){P.connection?.socket===m.socket&&(e=x(),A({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"),m.send({type:"executor.register",executorId:e.executorId,capabilities:e.capabilities,labels:e.labels,workspaceRoot:e.workspaceRoot,maxConcurrency:e.maxConcurrency,sshPubkey:Vr(),platform:process.platform,version:Y(),telemetry:Mi(e.workspaceRoot)}))},onMessage(f){P.connection?.socket===m.socket&&p?.handleMessage(f)},onError(f){P.connection?.socket===m.socket&&(p=null,console.error("[worker] websocket error",f),w(f))},onClose(f){if(P.connection?.socket!==m.socket)return;p=null;let S=f.reason?.trim()||`code=${f.code}`;console.log("[worker] websocket disconnected from control plane",S),w(`Control plane connection closed (${S})`)}});s=m,P.connection=m,p=xi({expectedSocket:m.socket,getConnection:()=>s,getCurrentSocket:()=>P.connection?.socket,openTerminalSession:Ai,runTerminalCommand:Ri,terminalSessions:Cu,assignedTasks:n,activeExecutions:o,getConfig:()=>e,setConfig:f=>{e=f},getQueuedTaskIds:()=>r,setQueuedTaskIds:f=>{r=f},getRunningTaskIds:()=>t,setRunningTaskIds:f=>{t=f},syncRuntimeState:d,drainExecutionQueue:g})}catch(m){let f=m instanceof Error?m.message:"worker websocket init failed";console.error("[worker] failed to start websocket connection",f),w(f)}}};P.connect=k,!e.executorId||!e.executorToken?(A({daemonMode:"unpaired",paired:!1,connected:!1}),console.log("[worker] not paired yet; open the local setup page and exchange a pairing code first")):k(),setInterval(()=>{t.length>0||r.length>0||Sr().catch(m=>{let f=m instanceof Error?m.message:"worker auto update failed";console.error("[worker] auto update failed",f)})},1e4),setInterval(()=>{if(!s||!Ge().connected)return;let m=new Date().toISOString();A({daemonMode:"running",connected:!0,paired:!0,lastHeartbeatAt:m,queuedTaskIds:r,runningTaskIds:t}),s.send({type:"executor.heartbeat",executorId:e.executorId,runningTaskIds:t,queuedTaskIds:r,sshPubkey:Vr(),at:m,telemetry:Mi(e.workspaceRoot)})},15e3)};var xu=()=>{let e=process.env.DOTENV_CONFIG_PATH?.trim();if(e){Di.config({path:e});return}me().name?.trim()==="vibemux"&&Di.config()};xu();var Xt=x();A({daemonMode:"idle",paired:!!(Xt.executorId&&Xt.executorToken),connected:!1,executorId:Xt.executorId,config:Xt});var Yt=process.argv[2]||"daemon",Su=new Set(["daemon","open","doctor"]),bu=async()=>{if(Su.has(Yt)&&(await Sn(Yt)).status!=="ready"){process.exitCode=1;return}switch(Yt){case"daemon":{$i();return}case"open":{_i();return}case"doctor":{await Pr();return}case"browser-inspect":{await An();return}case"reset":{wt(),console.log("[worker] local config cleared");return}case"unpair":{nn(),console.log("[worker] pairing cleared");return}case"update":{let e=await Ve();console.log(`[worker] ${e.message}`),e.applied&&setTimeout(()=>process.exit(0),250);return}case"apply-update-internal":{let e=process.argv[3],t=process.argv[4],r=Number(process.argv[5]||"0");await zn(e,t,r);return}default:console.error(`Unknown worker command: ${Yt}`),process.exitCode=1}};bu().catch(e=>{console.error(e instanceof Error?e.message:"worker command failed"),process.exitCode=1});
231
+ `))},resize:()=>{},kill:()=>c.kill("SIGTERM")}},Bi=e=>{let{cwd:t,onLog:r}=e,n=dt(t),o=e.shell??Kt();r("opening pty session",{cwd:n,shell:o});try{return vu({...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 Pu({...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 Iu({...e,cwd:n})};var I={connection:null,reconnectTimer:null,stopped:!1,connect:null},Eu=new Map,Wi=e=>_t({workspaceRoot:e,workerVersion:Y()}),_i=e=>{let t=process.platform==="darwin"?["open",e]:process.platform==="win32"?["cmd","/c","start","",e]:["xdg-open",e];Tu(t[0],t.slice(1),{detached:!0,stdio:"ignore"}).unref()},$i=async()=>{let e=Y(),t=await ve();return{currentVersion:e,latestVersion:t.latestVersion||e,check:t}},Ui=(e,t,r,n)=>{let o=n.check.channel||De(),s=o==="preview"?"Vibemux Worker Preview":"Vibemux Worker",a=process.env.VIBEMUX_WORKER_AUTO_UPDATE?.trim().toLowerCase(),c=a!=="0"&&a!=="false"&&a!=="off",l=[["Mode",e],["Channel",o],["Current",n.currentVersion],["Latest",n.latestVersion],["Auto Update",c?"enabled":"disabled"],["Cloud",t],["Local",r]],i=e==="open"?"Opening cloud and local consoles in your browser...":"Worker daemon is ready and waiting for tasks.",d=Math.max(...l.map(([w])=>w.length)),u=[s,"",...l.map(([w,k])=>`${w.padEnd(d)} : ${k}`),"",i],p=Math.max(...u.map(w=>w.length)),g=`+${"-".repeat(p+2)}+`;console.log(g);for(let w of u)console.log(`| ${w.padEnd(p)} |`);console.log(g)},Di=()=>{let e=x();Pr();let t=`http://127.0.0.1:${e.localServerPort}`;$i().then(r=>{Ui("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(()=>{_i(e.cloudUrl),_i(t)},250)};var Kn=()=>{I.stopped=!0,I.reconnectTimer&&(clearTimeout(I.reconnectTimer),I.reconnectTimer=null),I.connection?.socket?.close(1e3,"manual disconnect"),I.connection=null,A({daemonMode:"disconnected",connected:!1,lastDisconnectAt:new Date().toISOString(),lastError:"Control plane connection was disconnected manually."})},vr=()=>{let e=x();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?.()},Ni=()=>{I.stopped=!1;let e=x(),t=[],r=[],n=new Map,o=new Map,s=null,a=null,c=!1,l=new Date().toISOString();A({daemonMode:"starting",paired:!!(e.executorId&&e.executorToken),executorId:e.executorId,config:e,startedAt:l,lastConnectAttemptAt:l,lastError:void 0});let i=`http://127.0.0.1:${e.localServerPort}`;$i().then(m=>(Ui("daemon",e.cloudUrl,i,m),Sr(m.check))).catch(m=>{let f=m instanceof Error?m.message:"worker startup banner failed";console.error("[worker] startup banner failed",f)}),Et(e.workspaceRoot),Pr();let d=()=>{A({queuedTaskIds:r,runningTaskIds:t,lastTaskAt:new Date().toISOString()})},u=()=>{for(e=x();t.length<Math.max(1,e.maxConcurrency)&&r.length>0;){let m=r[0];r=r.slice(1);let f=n.get(m);if(!f)continue;t=[...t,m],d();let S=xi({task:f,executorId:e.executorId,workspaceRoot:e.workspaceRoot,projectBindings:e.projectBindings,uploadPatchArtifact:e.executorToken?({taskId:P,filename:U,content:V})=>gr({cloudUrl:e.cloudUrl,executorToken:e.executorToken,taskId:P,filename:U,content:V}):void 0,connection:s??I.connection,onStart(){},onFinish(P){n.delete(P),o.delete(P),t=t.filter(U=>U!==P),d(),g()}});o.set(m,S)}},p=null,g=()=>{u(),p?.drainPromptQueue()},w=m=>{c=I.stopped,!(c||a)&&(a=setTimeout(()=>{a=null,I.reconnectTimer=null,k()},5e3),I.reconnectTimer=a,A({daemonMode:"disconnected",connected:!1,paired:!0,lastDisconnectAt:new Date().toISOString(),lastError:m}))},k=()=>{if(!I.stopped){if(e=x(),!e.executorId||!e.executorToken){A({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}A({daemonMode:"starting",connected:!1,paired:!0,executorId:e.executorId,config:e,lastConnectAttemptAt:new Date().toISOString()});try{let m=fr(e,{onOpen(){I.connection?.socket===m.socket&&(e=x(),A({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"),m.send({type:"executor.register",executorId:e.executorId,capabilities:e.capabilities,labels:e.labels,workspaceRoot:e.workspaceRoot,maxConcurrency:e.maxConcurrency,sshPubkey:Vr(),platform:process.platform,version:Y(),telemetry:Wi(e.workspaceRoot)}))},onMessage(f){I.connection?.socket===m.socket&&p?.handleMessage(f)},onError(f){I.connection?.socket===m.socket&&(p=null,console.error("[worker] websocket error",f),w(f))},onClose(f){if(I.connection?.socket!==m.socket)return;p=null;let S=f.reason?.trim()||`code=${f.code}`;console.log("[worker] websocket disconnected from control plane",S),w(`Control plane connection closed (${S})`)}});s=m,I.connection=m,p=vi({expectedSocket:m.socket,getConnection:()=>s,getCurrentSocket:()=>I.connection?.socket,openTerminalSession:Bi,runTerminalCommand:Oi,terminalSessions:Eu,assignedTasks:n,activeExecutions:o,getConfig:()=>e,setConfig:f=>{e=f},getQueuedTaskIds:()=>r,setQueuedTaskIds:f=>{r=f},getRunningTaskIds:()=>t,setRunningTaskIds:f=>{t=f},syncRuntimeState:d,drainExecutionQueue:g})}catch(m){let f=m instanceof Error?m.message:"worker websocket init failed";console.error("[worker] failed to start websocket connection",f),w(f)}}};I.connect=k,!e.executorId||!e.executorToken?(A({daemonMode:"unpaired",paired:!1,connected:!1}),console.log("[worker] not paired yet; open the local setup page and exchange a pairing code first")):k(),setInterval(()=>{t.length>0||r.length>0||Sr().catch(m=>{let f=m instanceof Error?m.message:"worker auto update failed";console.error("[worker] auto update failed",f)})},1e4),setInterval(()=>{if(!s||!Ge().connected)return;let m=new Date().toISOString();A({daemonMode:"running",connected:!0,paired:!0,lastHeartbeatAt:m,queuedTaskIds:r,runningTaskIds:t}),s.send({type:"executor.heartbeat",executorId:e.executorId,runningTaskIds:t,queuedTaskIds:r,sshPubkey:Vr(),at:m,telemetry:Wi(e.workspaceRoot)})},15e3)};var Ru=()=>{let e=process.env.DOTENV_CONFIG_PATH?.trim();if(e){Li.config({path:e});return}me().name?.trim()==="vibemux"&&Li.config()};Ru();var Xt=x();A({daemonMode:"idle",paired:!!(Xt.executorId&&Xt.executorToken),connected:!1,executorId:Xt.executorId,config:Xt});var Yt=process.argv[2]||"daemon",Au=new Set(["daemon","open","doctor"]),Mu=async()=>{if(Au.has(Yt)&&(await Sn(Yt)).status!=="ready"){process.exitCode=1;return}switch(Yt){case"daemon":{Ni();return}case"open":{Di();return}case"doctor":{await Ir();return}case"browser-inspect":{await An();return}case"reset":{wt(),console.log("[worker] local config cleared");return}case"unpair":{nn(),console.log("[worker] pairing cleared");return}case"update":{let e=await Ve();console.log(`[worker] ${e.message}`),e.applied&&setTimeout(()=>process.exit(0),250);return}case"apply-update-internal":{let e=process.argv[3],t=process.argv[4],r=Number(process.argv[5]||"0");await Fn(e,t,r);return}default:console.error(`Unknown worker command: ${Yt}`),process.exitCode=1}};Mu().catch(e=>{console.error(e instanceof Error?e.message:"worker command failed"),process.exitCode=1});