vibemux-worker-preview 0.2.1-preview.74 → 0.2.2-preview.76

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,134 +1,128 @@
1
- var Pp=Object.create;var zi=Object.defineProperty;var Ep=Object.getOwnPropertyDescriptor;var bp=Object.getOwnPropertyNames;var Ip=Object.getPrototypeOf,Tp=Object.prototype.hasOwnProperty;var K=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,r)=>(typeof require<"u"?require:t)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var se=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Rp=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of bp(t))!Tp.call(e,o)&&o!==r&&zi(e,o,{get:()=>t[o],enumerable:!(n=Ep(t,o))||n.enumerable});return e};var Ve=(e,t,r)=>(r=e!=null?Pp(Ip(e)):{},Rp(t||!e||!e.__esModule?zi(r,"default",{value:e,enumerable:!0}):r,e));var Ue=se((JE,uc)=>{"use strict";var cc=["nodebuffer","arraybuffer","fragments"],lc=typeof Blob<"u";lc&&cc.push("blob");uc.exports={BINARY_TYPES:cc,CLOSE_TIMEOUT:3e4,EMPTY_BUFFER:Buffer.alloc(0),GUID:"258EAFA5-E914-47DA-95CA-C5AB0DC85B11",hasBlob:lc,kForOnEventAttribute:Symbol("kIsForOnEventAttribute"),kListener:Symbol("kListener"),kStatusCode:Symbol("status-code"),kWebSocket:Symbol("websocket"),NOOP:()=>{}}});var xr=se((KE,Rn)=>{"use strict";var{EMPTY_BUFFER:jg}=Ue(),ls=Buffer[Symbol.species];function Fg(e,t){if(e.length===0)return jg;if(e.length===1)return e[0];let r=Buffer.allocUnsafe(t),n=0;for(let o=0;o<e.length;o++){let s=e[o];r.set(s,n),n+=s.length}return n<t?new ls(r.buffer,r.byteOffset,n):r}function dc(e,t,r,n,o){for(let s=0;s<o;s++)r[n+s]=e[s]^t[s&3]}function pc(e,t){for(let r=0;r<e.length;r++)e[r]^=t[r&3]}function Gg(e){return e.length===e.buffer.byteLength?e.buffer:e.buffer.slice(e.byteOffset,e.byteOffset+e.length)}function us(e){if(us.readOnly=!0,Buffer.isBuffer(e))return e;let t;return e instanceof ArrayBuffer?t=new ls(e):ArrayBuffer.isView(e)?t=new ls(e.buffer,e.byteOffset,e.byteLength):(t=Buffer.from(e),us.readOnly=!1),t}Rn.exports={concat:Fg,mask:dc,toArrayBuffer:Gg,toBuffer:us,unmask:pc};if(!process.env.WS_NO_BUFFER_UTIL)try{let e=K("bufferutil");Rn.exports.mask=function(t,r,n,o,s){s<48?dc(t,r,n,o,s):e.mask(t,r,n,o,s)},Rn.exports.unmask=function(t,r){t.length<32?pc(t,r):e.unmask(t,r)}}catch{}});var gc=se((XE,fc)=>{"use strict";var mc=Symbol("kDone"),ds=Symbol("kRun"),ps=class{constructor(t){this[mc]=()=>{this.pending--,this[ds]()},this.concurrency=t||1/0,this.jobs=[],this.pending=0}add(t){this.jobs.push(t),this[ds]()}[ds](){if(this.pending!==this.concurrency&&this.jobs.length){let t=this.jobs.shift();this.pending++,t(this[mc])}}};fc.exports=ps});var Ft=se((YE,wc)=>{"use strict";var Cr=K("zlib"),hc=xr(),qg=gc(),{kStatusCode:yc}=Ue(),zg=Buffer[Symbol.species],Hg=Buffer.from([0,0,255,255]),An=Symbol("permessage-deflate"),$e=Symbol("total-length"),Lt=Symbol("callback"),Xe=Symbol("buffers"),jt=Symbol("error"),_n,ms=class{constructor(t){if(this._options=t||{},this._threshold=this._options.threshold!==void 0?this._options.threshold:1024,this._maxPayload=this._options.maxPayload|0,this._isServer=!!this._options.isServer,this._deflate=null,this._inflate=null,this.params=null,!_n){let r=this._options.concurrencyLimit!==void 0?this._options.concurrencyLimit:10;_n=new qg(r)}}static get extensionName(){return"permessage-deflate"}offer(){let t={};return this._options.serverNoContextTakeover&&(t.server_no_context_takeover=!0),this._options.clientNoContextTakeover&&(t.client_no_context_takeover=!0),this._options.serverMaxWindowBits&&(t.server_max_window_bits=this._options.serverMaxWindowBits),this._options.clientMaxWindowBits?t.client_max_window_bits=this._options.clientMaxWindowBits:this._options.clientMaxWindowBits==null&&(t.client_max_window_bits=!0),t}accept(t){return t=this.normalizeParams(t),this.params=this._isServer?this.acceptAsServer(t):this.acceptAsClient(t),this.params}cleanup(){if(this._inflate&&(this._inflate.close(),this._inflate=null),this._deflate){let t=this._deflate[Lt];this._deflate.close(),this._deflate=null,t&&t(new Error("The deflate stream was closed while data was being processed"))}}acceptAsServer(t){let r=this._options,n=t.find(o=>!(r.serverNoContextTakeover===!1&&o.server_no_context_takeover||o.server_max_window_bits&&(r.serverMaxWindowBits===!1||typeof r.serverMaxWindowBits=="number"&&r.serverMaxWindowBits>o.server_max_window_bits)||typeof r.clientMaxWindowBits=="number"&&!o.client_max_window_bits));if(!n)throw new Error("None of the extension offers can be accepted");return r.serverNoContextTakeover&&(n.server_no_context_takeover=!0),r.clientNoContextTakeover&&(n.client_no_context_takeover=!0),typeof r.serverMaxWindowBits=="number"&&(n.server_max_window_bits=r.serverMaxWindowBits),typeof r.clientMaxWindowBits=="number"?n.client_max_window_bits=r.clientMaxWindowBits:(n.client_max_window_bits===!0||r.clientMaxWindowBits===!1)&&delete n.client_max_window_bits,n}acceptAsClient(t){let r=t[0];if(this._options.clientNoContextTakeover===!1&&r.client_no_context_takeover)throw new Error('Unexpected parameter "client_no_context_takeover"');if(!r.client_max_window_bits)typeof this._options.clientMaxWindowBits=="number"&&(r.client_max_window_bits=this._options.clientMaxWindowBits);else if(this._options.clientMaxWindowBits===!1||typeof this._options.clientMaxWindowBits=="number"&&r.client_max_window_bits>this._options.clientMaxWindowBits)throw new Error('Unexpected or invalid parameter "client_max_window_bits"');return r}normalizeParams(t){return t.forEach(r=>{Object.keys(r).forEach(n=>{let o=r[n];if(o.length>1)throw new Error(`Parameter "${n}" must have only a single value`);if(o=o[0],n==="client_max_window_bits"){if(o!==!0){let s=+o;if(!Number.isInteger(s)||s<8||s>15)throw new TypeError(`Invalid value for parameter "${n}": ${o}`);o=s}else if(!this._isServer)throw new TypeError(`Invalid value for parameter "${n}": ${o}`)}else if(n==="server_max_window_bits"){let s=+o;if(!Number.isInteger(s)||s<8||s>15)throw new TypeError(`Invalid value for parameter "${n}": ${o}`);o=s}else if(n==="client_no_context_takeover"||n==="server_no_context_takeover"){if(o!==!0)throw new TypeError(`Invalid value for parameter "${n}": ${o}`)}else throw new Error(`Unknown parameter "${n}"`);r[n]=o})}),t}decompress(t,r,n){_n.add(o=>{this._decompress(t,r,(s,i)=>{o(),n(s,i)})})}compress(t,r,n){_n.add(o=>{this._compress(t,r,(s,i)=>{o(),n(s,i)})})}_decompress(t,r,n){let o=this._isServer?"client":"server";if(!this._inflate){let s=`${o}_max_window_bits`,i=typeof this.params[s]!="number"?Cr.Z_DEFAULT_WINDOWBITS:this.params[s];this._inflate=Cr.createInflateRaw({...this._options.zlibInflateOptions,windowBits:i}),this._inflate[An]=this,this._inflate[$e]=0,this._inflate[Xe]=[],this._inflate.on("error",Jg),this._inflate.on("data",kc)}this._inflate[Lt]=n,this._inflate.write(t),r&&this._inflate.write(Hg),this._inflate.flush(()=>{let s=this._inflate[jt];if(s){this._inflate.close(),this._inflate=null,n(s);return}let i=hc.concat(this._inflate[Xe],this._inflate[$e]);this._inflate._readableState.endEmitted?(this._inflate.close(),this._inflate=null):(this._inflate[$e]=0,this._inflate[Xe]=[],r&&this.params[`${o}_no_context_takeover`]&&this._inflate.reset()),n(null,i)})}_compress(t,r,n){let o=this._isServer?"server":"client";if(!this._deflate){let s=`${o}_max_window_bits`,i=typeof this.params[s]!="number"?Cr.Z_DEFAULT_WINDOWBITS:this.params[s];this._deflate=Cr.createDeflateRaw({...this._options.zlibDeflateOptions,windowBits:i}),this._deflate[$e]=0,this._deflate[Xe]=[],this._deflate.on("data",Vg)}this._deflate[Lt]=n,this._deflate.write(t),this._deflate.flush(Cr.Z_SYNC_FLUSH,()=>{if(!this._deflate)return;let s=hc.concat(this._deflate[Xe],this._deflate[$e]);r&&(s=new zg(s.buffer,s.byteOffset,s.length-4)),this._deflate[Lt]=null,this._deflate[$e]=0,this._deflate[Xe]=[],r&&this.params[`${o}_no_context_takeover`]&&this._deflate.reset(),n(null,s)})}};wc.exports=ms;function Vg(e){this[Xe].push(e),this[$e]+=e.length}function kc(e){if(this[$e]+=e.length,this[An]._maxPayload<1||this[$e]<=this[An]._maxPayload){this[Xe].push(e);return}this[jt]=new RangeError("Max payload size exceeded"),this[jt].code="WS_ERR_UNSUPPORTED_MESSAGE_LENGTH",this[jt][yc]=1009,this.removeListener("data",kc),this.reset()}function Jg(e){if(this[An]._inflate=null,this[jt]){this[Lt](this[jt]);return}e[yc]=1007,this[Lt](e)}});var Gt=se((QE,Mn)=>{"use strict";var{isUtf8:Sc}=K("buffer"),{hasBlob:Kg}=Ue(),Xg=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,0,0,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0];function Yg(e){return e>=1e3&&e<=1014&&e!==1004&&e!==1005&&e!==1006||e>=3e3&&e<=4999}function fs(e){let t=e.length,r=0;for(;r<t;)if((e[r]&128)===0)r++;else if((e[r]&224)===192){if(r+1===t||(e[r+1]&192)!==128||(e[r]&254)===192)return!1;r+=2}else if((e[r]&240)===224){if(r+2>=t||(e[r+1]&192)!==128||(e[r+2]&192)!==128||e[r]===224&&(e[r+1]&224)===128||e[r]===237&&(e[r+1]&224)===160)return!1;r+=3}else if((e[r]&248)===240){if(r+3>=t||(e[r+1]&192)!==128||(e[r+2]&192)!==128||(e[r+3]&192)!==128||e[r]===240&&(e[r+1]&240)===128||e[r]===244&&e[r+1]>143||e[r]>244)return!1;r+=4}else return!1;return!0}function Qg(e){return Kg&&typeof e=="object"&&typeof e.arrayBuffer=="function"&&typeof e.type=="string"&&typeof e.stream=="function"&&(e[Symbol.toStringTag]==="Blob"||e[Symbol.toStringTag]==="File")}Mn.exports={isBlob:Qg,isValidStatusCode:Yg,isValidUTF8:fs,tokenChars:Xg};if(Sc)Mn.exports.isValidUTF8=function(e){return e.length<24?fs(e):Sc(e)};else if(!process.env.WS_NO_UTF_8_VALIDATE)try{let e=K("utf-8-validate");Mn.exports.isValidUTF8=function(t){return t.length<32?fs(t):e(t)}}catch{}});var ws=se((ZE,Ic)=>{"use strict";var{Writable:Zg}=K("stream"),xc=Ft(),{BINARY_TYPES:eh,EMPTY_BUFFER:Cc,kStatusCode:th,kWebSocket:rh}=Ue(),{concat:gs,toArrayBuffer:nh,unmask:oh}=xr(),{isValidStatusCode:sh,isValidUTF8:vc}=Gt(),On=Buffer[Symbol.species],me=0,Pc=1,Ec=2,bc=3,hs=4,ys=5,Bn=6,ks=class extends Zg{constructor(t={}){super(),this._allowSynchronousEvents=t.allowSynchronousEvents!==void 0?t.allowSynchronousEvents:!0,this._binaryType=t.binaryType||eh[0],this._extensions=t.extensions||{},this._isServer=!!t.isServer,this._maxPayload=t.maxPayload|0,this._skipUTF8Validation=!!t.skipUTF8Validation,this[rh]=void 0,this._bufferedBytes=0,this._buffers=[],this._compressed=!1,this._payloadLength=0,this._mask=void 0,this._fragmented=0,this._masked=!1,this._fin=!1,this._opcode=0,this._totalPayloadLength=0,this._messageLength=0,this._fragments=[],this._errored=!1,this._loop=!1,this._state=me}_write(t,r,n){if(this._opcode===8&&this._state==me)return n();this._bufferedBytes+=t.length,this._buffers.push(t),this.startLoop(n)}consume(t){if(this._bufferedBytes-=t,t===this._buffers[0].length)return this._buffers.shift();if(t<this._buffers[0].length){let n=this._buffers[0];return this._buffers[0]=new On(n.buffer,n.byteOffset+t,n.length-t),new On(n.buffer,n.byteOffset,t)}let r=Buffer.allocUnsafe(t);do{let n=this._buffers[0],o=r.length-t;t>=n.length?r.set(this._buffers.shift(),o):(r.set(new Uint8Array(n.buffer,n.byteOffset,t),o),this._buffers[0]=new On(n.buffer,n.byteOffset+t,n.length-t)),t-=n.length}while(t>0);return r}startLoop(t){this._loop=!0;do switch(this._state){case me:this.getInfo(t);break;case Pc:this.getPayloadLength16(t);break;case Ec:this.getPayloadLength64(t);break;case bc:this.getMask();break;case hs:this.getData(t);break;case ys:case Bn:this._loop=!1;return}while(this._loop);this._errored||t()}getInfo(t){if(this._bufferedBytes<2){this._loop=!1;return}let r=this.consume(2);if((r[0]&48)!==0){let o=this.createError(RangeError,"RSV2 and RSV3 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_2_3");t(o);return}let n=(r[0]&64)===64;if(n&&!this._extensions[xc.extensionName]){let o=this.createError(RangeError,"RSV1 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_1");t(o);return}if(this._fin=(r[0]&128)===128,this._opcode=r[0]&15,this._payloadLength=r[1]&127,this._opcode===0){if(n){let o=this.createError(RangeError,"RSV1 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_1");t(o);return}if(!this._fragmented){let o=this.createError(RangeError,"invalid opcode 0",!0,1002,"WS_ERR_INVALID_OPCODE");t(o);return}this._opcode=this._fragmented}else if(this._opcode===1||this._opcode===2){if(this._fragmented){let o=this.createError(RangeError,`invalid opcode ${this._opcode}`,!0,1002,"WS_ERR_INVALID_OPCODE");t(o);return}this._compressed=n}else if(this._opcode>7&&this._opcode<11){if(!this._fin){let o=this.createError(RangeError,"FIN must be set",!0,1002,"WS_ERR_EXPECTED_FIN");t(o);return}if(n){let o=this.createError(RangeError,"RSV1 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_1");t(o);return}if(this._payloadLength>125||this._opcode===8&&this._payloadLength===1){let o=this.createError(RangeError,`invalid payload length ${this._payloadLength}`,!0,1002,"WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH");t(o);return}}else{let o=this.createError(RangeError,`invalid opcode ${this._opcode}`,!0,1002,"WS_ERR_INVALID_OPCODE");t(o);return}if(!this._fin&&!this._fragmented&&(this._fragmented=this._opcode),this._masked=(r[1]&128)===128,this._isServer){if(!this._masked){let o=this.createError(RangeError,"MASK must be set",!0,1002,"WS_ERR_EXPECTED_MASK");t(o);return}}else if(this._masked){let o=this.createError(RangeError,"MASK must be clear",!0,1002,"WS_ERR_UNEXPECTED_MASK");t(o);return}this._payloadLength===126?this._state=Pc:this._payloadLength===127?this._state=Ec:this.haveLength(t)}getPayloadLength16(t){if(this._bufferedBytes<2){this._loop=!1;return}this._payloadLength=this.consume(2).readUInt16BE(0),this.haveLength(t)}getPayloadLength64(t){if(this._bufferedBytes<8){this._loop=!1;return}let r=this.consume(8),n=r.readUInt32BE(0);if(n>Math.pow(2,21)-1){let o=this.createError(RangeError,"Unsupported WebSocket frame: payload length > 2^53 - 1",!1,1009,"WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH");t(o);return}this._payloadLength=n*Math.pow(2,32)+r.readUInt32BE(4),this.haveLength(t)}haveLength(t){if(this._payloadLength&&this._opcode<8&&(this._totalPayloadLength+=this._payloadLength,this._totalPayloadLength>this._maxPayload&&this._maxPayload>0)){let r=this.createError(RangeError,"Max payload size exceeded",!1,1009,"WS_ERR_UNSUPPORTED_MESSAGE_LENGTH");t(r);return}this._masked?this._state=bc:this._state=hs}getMask(){if(this._bufferedBytes<4){this._loop=!1;return}this._mask=this.consume(4),this._state=hs}getData(t){let r=Cc;if(this._payloadLength){if(this._bufferedBytes<this._payloadLength){this._loop=!1;return}r=this.consume(this._payloadLength),this._masked&&(this._mask[0]|this._mask[1]|this._mask[2]|this._mask[3])!==0&&oh(r,this._mask)}if(this._opcode>7){this.controlMessage(r,t);return}if(this._compressed){this._state=ys,this.decompress(r,t);return}r.length&&(this._messageLength=this._totalPayloadLength,this._fragments.push(r)),this.dataMessage(t)}decompress(t,r){this._extensions[xc.extensionName].decompress(t,this._fin,(o,s)=>{if(o)return r(o);if(s.length){if(this._messageLength+=s.length,this._messageLength>this._maxPayload&&this._maxPayload>0){let i=this.createError(RangeError,"Max payload size exceeded",!1,1009,"WS_ERR_UNSUPPORTED_MESSAGE_LENGTH");r(i);return}this._fragments.push(s)}this.dataMessage(r),this._state===me&&this.startLoop(r)})}dataMessage(t){if(!this._fin){this._state=me;return}let r=this._messageLength,n=this._fragments;if(this._totalPayloadLength=0,this._messageLength=0,this._fragmented=0,this._fragments=[],this._opcode===2){let o;this._binaryType==="nodebuffer"?o=gs(n,r):this._binaryType==="arraybuffer"?o=nh(gs(n,r)):this._binaryType==="blob"?o=new Blob(n):o=n,this._allowSynchronousEvents?(this.emit("message",o,!0),this._state=me):(this._state=Bn,setImmediate(()=>{this.emit("message",o,!0),this._state=me,this.startLoop(t)}))}else{let o=gs(n,r);if(!this._skipUTF8Validation&&!vc(o)){let s=this.createError(Error,"invalid UTF-8 sequence",!0,1007,"WS_ERR_INVALID_UTF8");t(s);return}this._state===ys||this._allowSynchronousEvents?(this.emit("message",o,!1),this._state=me):(this._state=Bn,setImmediate(()=>{this.emit("message",o,!1),this._state=me,this.startLoop(t)}))}}controlMessage(t,r){if(this._opcode===8){if(t.length===0)this._loop=!1,this.emit("conclude",1005,Cc),this.end();else{let n=t.readUInt16BE(0);if(!sh(n)){let s=this.createError(RangeError,`invalid status code ${n}`,!0,1002,"WS_ERR_INVALID_CLOSE_CODE");r(s);return}let o=new On(t.buffer,t.byteOffset+2,t.length-2);if(!this._skipUTF8Validation&&!vc(o)){let s=this.createError(Error,"invalid UTF-8 sequence",!0,1007,"WS_ERR_INVALID_UTF8");r(s);return}this._loop=!1,this.emit("conclude",n,o),this.end()}this._state=me;return}this._allowSynchronousEvents?(this.emit(this._opcode===9?"ping":"pong",t),this._state=me):(this._state=Bn,setImmediate(()=>{this.emit(this._opcode===9?"ping":"pong",t),this._state=me,this.startLoop(r)}))}createError(t,r,n,o,s){this._loop=!1,this._errored=!0;let i=new t(n?`Invalid WebSocket frame: ${r}`:r);return Error.captureStackTrace(i,this.createError),i.code=s,i[th]=o,i}};Ic.exports=ks});var Cs=se((tb,_c)=>{"use strict";var{Duplex:eb}=K("stream"),{randomFillSync:ih}=K("crypto"),Tc=Ft(),{EMPTY_BUFFER:ah,kWebSocket:ch,NOOP:lh}=Ue(),{isBlob:qt,isValidStatusCode:uh}=Gt(),{mask:Rc,toBuffer:ft}=xr(),fe=Symbol("kByteLength"),dh=Buffer.alloc(4),Wn=8*1024,gt,zt=Wn,xe=0,ph=1,mh=2,Ss=class e{constructor(t,r,n){this._extensions=r||{},n&&(this._generateMask=n,this._maskBuffer=Buffer.alloc(4)),this._socket=t,this._firstFragment=!0,this._compress=!1,this._bufferedBytes=0,this._queue=[],this._state=xe,this.onerror=lh,this[ch]=void 0}static frame(t,r){let n,o=!1,s=2,i=!1;r.mask&&(n=r.maskBuffer||dh,r.generateMask?r.generateMask(n):(zt===Wn&&(gt===void 0&&(gt=Buffer.alloc(Wn)),ih(gt,0,Wn),zt=0),n[0]=gt[zt++],n[1]=gt[zt++],n[2]=gt[zt++],n[3]=gt[zt++]),i=(n[0]|n[1]|n[2]|n[3])===0,s=6);let a;typeof t=="string"?(!r.mask||i)&&r[fe]!==void 0?a=r[fe]:(t=Buffer.from(t),a=t.length):(a=t.length,o=r.mask&&r.readOnly&&!i);let c=a;a>=65536?(s+=8,c=127):a>125&&(s+=2,c=126);let l=Buffer.allocUnsafe(o?a+s:s);return l[0]=r.fin?r.opcode|128:r.opcode,r.rsv1&&(l[0]|=64),l[1]=c,c===126?l.writeUInt16BE(a,2):c===127&&(l[2]=l[3]=0,l.writeUIntBE(a,4,6)),r.mask?(l[1]|=128,l[s-4]=n[0],l[s-3]=n[1],l[s-2]=n[2],l[s-1]=n[3],i?[l,t]:o?(Rc(t,n,l,s,a),[l]):(Rc(t,n,t,0,a),[l,t])):[l,t]}close(t,r,n,o){let s;if(t===void 0)s=ah;else{if(typeof t!="number"||!uh(t))throw new TypeError("First argument must be a valid error code number");if(r===void 0||!r.length)s=Buffer.allocUnsafe(2),s.writeUInt16BE(t,0);else{let a=Buffer.byteLength(r);if(a>123)throw new RangeError("The message must not be greater than 123 bytes");s=Buffer.allocUnsafe(2+a),s.writeUInt16BE(t,0),typeof r=="string"?s.write(r,2):s.set(r,2)}}let i={[fe]:s.length,fin:!0,generateMask:this._generateMask,mask:n,maskBuffer:this._maskBuffer,opcode:8,readOnly:!1,rsv1:!1};this._state!==xe?this.enqueue([this.dispatch,s,!1,i,o]):this.sendFrame(e.frame(s,i),o)}ping(t,r,n){let o,s;if(typeof t=="string"?(o=Buffer.byteLength(t),s=!1):qt(t)?(o=t.size,s=!1):(t=ft(t),o=t.length,s=ft.readOnly),o>125)throw new RangeError("The data size must not be greater than 125 bytes");let i={[fe]:o,fin:!0,generateMask:this._generateMask,mask:r,maskBuffer:this._maskBuffer,opcode:9,readOnly:s,rsv1:!1};qt(t)?this._state!==xe?this.enqueue([this.getBlobData,t,!1,i,n]):this.getBlobData(t,!1,i,n):this._state!==xe?this.enqueue([this.dispatch,t,!1,i,n]):this.sendFrame(e.frame(t,i),n)}pong(t,r,n){let o,s;if(typeof t=="string"?(o=Buffer.byteLength(t),s=!1):qt(t)?(o=t.size,s=!1):(t=ft(t),o=t.length,s=ft.readOnly),o>125)throw new RangeError("The data size must not be greater than 125 bytes");let i={[fe]:o,fin:!0,generateMask:this._generateMask,mask:r,maskBuffer:this._maskBuffer,opcode:10,readOnly:s,rsv1:!1};qt(t)?this._state!==xe?this.enqueue([this.getBlobData,t,!1,i,n]):this.getBlobData(t,!1,i,n):this._state!==xe?this.enqueue([this.dispatch,t,!1,i,n]):this.sendFrame(e.frame(t,i),n)}send(t,r,n){let o=this._extensions[Tc.extensionName],s=r.binary?2:1,i=r.compress,a,c;typeof t=="string"?(a=Buffer.byteLength(t),c=!1):qt(t)?(a=t.size,c=!1):(t=ft(t),a=t.length,c=ft.readOnly),this._firstFragment?(this._firstFragment=!1,i&&o&&o.params[o._isServer?"server_no_context_takeover":"client_no_context_takeover"]&&(i=a>=o._threshold),this._compress=i):(i=!1,s=0),r.fin&&(this._firstFragment=!0);let l={[fe]:a,fin:r.fin,generateMask:this._generateMask,mask:r.mask,maskBuffer:this._maskBuffer,opcode:s,readOnly:c,rsv1:i};qt(t)?this._state!==xe?this.enqueue([this.getBlobData,t,this._compress,l,n]):this.getBlobData(t,this._compress,l,n):this._state!==xe?this.enqueue([this.dispatch,t,this._compress,l,n]):this.dispatch(t,this._compress,l,n)}getBlobData(t,r,n,o){this._bufferedBytes+=n[fe],this._state=mh,t.arrayBuffer().then(s=>{if(this._socket.destroyed){let a=new Error("The socket was closed while the blob was being read");process.nextTick(xs,this,a,o);return}this._bufferedBytes-=n[fe];let i=ft(s);r?this.dispatch(i,r,n,o):(this._state=xe,this.sendFrame(e.frame(i,n),o),this.dequeue())}).catch(s=>{process.nextTick(fh,this,s,o)})}dispatch(t,r,n,o){if(!r){this.sendFrame(e.frame(t,n),o);return}let s=this._extensions[Tc.extensionName];this._bufferedBytes+=n[fe],this._state=ph,s.compress(t,n.fin,(i,a)=>{if(this._socket.destroyed){let c=new Error("The socket was closed while data was being compressed");xs(this,c,o);return}this._bufferedBytes-=n[fe],this._state=xe,n.readOnly=!1,this.sendFrame(e.frame(a,n),o),this.dequeue()})}dequeue(){for(;this._state===xe&&this._queue.length;){let t=this._queue.shift();this._bufferedBytes-=t[3][fe],Reflect.apply(t[0],this,t.slice(1))}}enqueue(t){this._bufferedBytes+=t[3][fe],this._queue.push(t)}sendFrame(t,r){t.length===2?(this._socket.cork(),this._socket.write(t[0]),this._socket.write(t[1],r),this._socket.uncork()):this._socket.write(t[0],r)}};_c.exports=Ss;function xs(e,t,r){typeof r=="function"&&r(t);for(let n=0;n<e._queue.length;n++){let o=e._queue[n],s=o[o.length-1];typeof s=="function"&&s(t)}}function fh(e,t,r){xs(e,t,r),e.onerror(t)}});var $c=se((rb,Uc)=>{"use strict";var{kForOnEventAttribute:vr,kListener:vs}=Ue(),Ac=Symbol("kCode"),Mc=Symbol("kData"),Oc=Symbol("kError"),Bc=Symbol("kMessage"),Wc=Symbol("kReason"),Ht=Symbol("kTarget"),Nc=Symbol("kType"),Dc=Symbol("kWasClean"),Le=class{constructor(t){this[Ht]=null,this[Nc]=t}get target(){return this[Ht]}get type(){return this[Nc]}};Object.defineProperty(Le.prototype,"target",{enumerable:!0});Object.defineProperty(Le.prototype,"type",{enumerable:!0});var ht=class extends Le{constructor(t,r={}){super(t),this[Ac]=r.code===void 0?0:r.code,this[Wc]=r.reason===void 0?"":r.reason,this[Dc]=r.wasClean===void 0?!1:r.wasClean}get code(){return this[Ac]}get reason(){return this[Wc]}get wasClean(){return this[Dc]}};Object.defineProperty(ht.prototype,"code",{enumerable:!0});Object.defineProperty(ht.prototype,"reason",{enumerable:!0});Object.defineProperty(ht.prototype,"wasClean",{enumerable:!0});var Vt=class extends Le{constructor(t,r={}){super(t),this[Oc]=r.error===void 0?null:r.error,this[Bc]=r.message===void 0?"":r.message}get error(){return this[Oc]}get message(){return this[Bc]}};Object.defineProperty(Vt.prototype,"error",{enumerable:!0});Object.defineProperty(Vt.prototype,"message",{enumerable:!0});var Pr=class extends Le{constructor(t,r={}){super(t),this[Mc]=r.data===void 0?null:r.data}get data(){return this[Mc]}};Object.defineProperty(Pr.prototype,"data",{enumerable:!0});var gh={addEventListener(e,t,r={}){for(let o of this.listeners(e))if(!r[vr]&&o[vs]===t&&!o[vr])return;let n;if(e==="message")n=function(s,i){let a=new Pr("message",{data:i?s:s.toString()});a[Ht]=this,Nn(t,this,a)};else if(e==="close")n=function(s,i){let a=new ht("close",{code:s,reason:i.toString(),wasClean:this._closeFrameReceived&&this._closeFrameSent});a[Ht]=this,Nn(t,this,a)};else if(e==="error")n=function(s){let i=new Vt("error",{error:s,message:s.message});i[Ht]=this,Nn(t,this,i)};else if(e==="open")n=function(){let s=new Le("open");s[Ht]=this,Nn(t,this,s)};else return;n[vr]=!!r[vr],n[vs]=t,r.once?this.once(e,n):this.on(e,n)},removeEventListener(e,t){for(let r of this.listeners(e))if(r[vs]===t&&!r[vr]){this.removeListener(e,r);break}}};Uc.exports={CloseEvent:ht,ErrorEvent:Vt,Event:Le,EventTarget:gh,MessageEvent:Pr};function Nn(e,t,r){typeof e=="object"&&e.handleEvent?e.handleEvent.call(e,r):e.call(t,r)}});var Dn=se((nb,Lc)=>{"use strict";var{tokenChars:Er}=Gt();function Ie(e,t,r){e[t]===void 0?e[t]=[r]:e[t].push(r)}function hh(e){let t=Object.create(null),r=Object.create(null),n=!1,o=!1,s=!1,i,a,c=-1,l=-1,d=-1,u=0;for(;u<e.length;u++)if(l=e.charCodeAt(u),i===void 0)if(d===-1&&Er[l]===1)c===-1&&(c=u);else if(u!==0&&(l===32||l===9))d===-1&&c!==-1&&(d=u);else if(l===59||l===44){if(c===-1)throw new SyntaxError(`Unexpected character at index ${u}`);d===-1&&(d=u);let m=e.slice(c,d);l===44?(Ie(t,m,r),r=Object.create(null)):i=m,c=d=-1}else throw new SyntaxError(`Unexpected character at index ${u}`);else if(a===void 0)if(d===-1&&Er[l]===1)c===-1&&(c=u);else if(l===32||l===9)d===-1&&c!==-1&&(d=u);else if(l===59||l===44){if(c===-1)throw new SyntaxError(`Unexpected character at index ${u}`);d===-1&&(d=u),Ie(r,e.slice(c,d),!0),l===44&&(Ie(t,i,r),r=Object.create(null),i=void 0),c=d=-1}else if(l===61&&c!==-1&&d===-1)a=e.slice(c,u),c=d=-1;else throw new SyntaxError(`Unexpected character at index ${u}`);else if(o){if(Er[l]!==1)throw new SyntaxError(`Unexpected character at index ${u}`);c===-1?c=u:n||(n=!0),o=!1}else if(s)if(Er[l]===1)c===-1&&(c=u);else if(l===34&&c!==-1)s=!1,d=u;else if(l===92)o=!0;else throw new SyntaxError(`Unexpected character at index ${u}`);else if(l===34&&e.charCodeAt(u-1)===61)s=!0;else if(d===-1&&Er[l]===1)c===-1&&(c=u);else if(c!==-1&&(l===32||l===9))d===-1&&(d=u);else if(l===59||l===44){if(c===-1)throw new SyntaxError(`Unexpected character at index ${u}`);d===-1&&(d=u);let m=e.slice(c,d);n&&(m=m.replace(/\\/g,""),n=!1),Ie(r,a,m),l===44&&(Ie(t,i,r),r=Object.create(null),i=void 0),a=void 0,c=d=-1}else throw new SyntaxError(`Unexpected character at index ${u}`);if(c===-1||s||l===32||l===9)throw new SyntaxError("Unexpected end of input");d===-1&&(d=u);let p=e.slice(c,d);return i===void 0?Ie(t,p,r):(a===void 0?Ie(r,p,!0):n?Ie(r,a,p.replace(/\\/g,"")):Ie(r,a,p),Ie(t,i,r)),t}function yh(e){return Object.keys(e).map(t=>{let r=e[t];return Array.isArray(r)||(r=[r]),r.map(n=>[t].concat(Object.keys(n).map(o=>{let s=n[o];return Array.isArray(s)||(s=[s]),s.map(i=>i===!0?o:`${o}=${i}`).join("; ")})).join("; ")).join(", ")}).join(", ")}Lc.exports={format:yh,parse:hh}});var jn=se((ib,Qc)=>{"use strict";var kh=K("events"),wh=K("https"),Sh=K("http"),Gc=K("net"),xh=K("tls"),{randomBytes:Ch,createHash:vh}=K("crypto"),{Duplex:ob,Readable:sb}=K("stream"),{URL:Ps}=K("url"),Ye=Ft(),Ph=ws(),Eh=Cs(),{isBlob:bh}=Gt(),{BINARY_TYPES:jc,CLOSE_TIMEOUT:Ih,EMPTY_BUFFER:Un,GUID:Th,kForOnEventAttribute:Es,kListener:Rh,kStatusCode:_h,kWebSocket:Q,NOOP:qc}=Ue(),{EventTarget:{addEventListener:Ah,removeEventListener:Mh}}=$c(),{format:Oh,parse:Bh}=Dn(),{toBuffer:Wh}=xr(),zc=Symbol("kAborted"),bs=[8,13],je=["CONNECTING","OPEN","CLOSING","CLOSED"],Nh=/^[!#$%&'*+\-.0-9A-Z^_`|a-z~]+$/,j=class e extends kh{constructor(t,r,n){super(),this._binaryType=jc[0],this._closeCode=1006,this._closeFrameReceived=!1,this._closeFrameSent=!1,this._closeMessage=Un,this._closeTimer=null,this._errorEmitted=!1,this._extensions={},this._paused=!1,this._protocol="",this._readyState=e.CONNECTING,this._receiver=null,this._sender=null,this._socket=null,t!==null?(this._bufferedAmount=0,this._isServer=!1,this._redirects=0,r===void 0?r=[]:Array.isArray(r)||(typeof r=="object"&&r!==null?(n=r,r=[]):r=[r]),Hc(this,t,r,n)):(this._autoPong=n.autoPong,this._closeTimeout=n.closeTimeout,this._isServer=!0)}get binaryType(){return this._binaryType}set binaryType(t){jc.includes(t)&&(this._binaryType=t,this._receiver&&(this._receiver._binaryType=t))}get bufferedAmount(){return this._socket?this._socket._writableState.length+this._sender._bufferedBytes:this._bufferedAmount}get extensions(){return Object.keys(this._extensions).join()}get isPaused(){return this._paused}get onclose(){return null}get onerror(){return null}get onopen(){return null}get onmessage(){return null}get protocol(){return this._protocol}get readyState(){return this._readyState}get url(){return this._url}setSocket(t,r,n){let o=new Ph({allowSynchronousEvents:n.allowSynchronousEvents,binaryType:this.binaryType,extensions:this._extensions,isServer:this._isServer,maxPayload:n.maxPayload,skipUTF8Validation:n.skipUTF8Validation}),s=new Eh(t,this._extensions,n.generateMask);this._receiver=o,this._sender=s,this._socket=t,o[Q]=this,s[Q]=this,t[Q]=this,o.on("conclude",$h),o.on("drain",Lh),o.on("error",jh),o.on("message",Fh),o.on("ping",Gh),o.on("pong",qh),s.onerror=zh,t.setTimeout&&t.setTimeout(0),t.setNoDelay&&t.setNoDelay(),r.length>0&&t.unshift(r),t.on("close",Kc),t.on("data",Ln),t.on("end",Xc),t.on("error",Yc),this._readyState=e.OPEN,this.emit("open")}emitClose(){if(!this._socket){this._readyState=e.CLOSED,this.emit("close",this._closeCode,this._closeMessage);return}this._extensions[Ye.extensionName]&&this._extensions[Ye.extensionName].cleanup(),this._receiver.removeAllListeners(),this._readyState=e.CLOSED,this.emit("close",this._closeCode,this._closeMessage)}close(t,r){if(this.readyState!==e.CLOSED){if(this.readyState===e.CONNECTING){ce(this,this._req,"WebSocket was closed before the connection was established");return}if(this.readyState===e.CLOSING){this._closeFrameSent&&(this._closeFrameReceived||this._receiver._writableState.errorEmitted)&&this._socket.end();return}this._readyState=e.CLOSING,this._sender.close(t,r,!this._isServer,n=>{n||(this._closeFrameSent=!0,(this._closeFrameReceived||this._receiver._writableState.errorEmitted)&&this._socket.end())}),Jc(this)}}pause(){this.readyState===e.CONNECTING||this.readyState===e.CLOSED||(this._paused=!0,this._socket.pause())}ping(t,r,n){if(this.readyState===e.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");if(typeof t=="function"?(n=t,t=r=void 0):typeof r=="function"&&(n=r,r=void 0),typeof t=="number"&&(t=t.toString()),this.readyState!==e.OPEN){Is(this,t,n);return}r===void 0&&(r=!this._isServer),this._sender.ping(t||Un,r,n)}pong(t,r,n){if(this.readyState===e.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");if(typeof t=="function"?(n=t,t=r=void 0):typeof r=="function"&&(n=r,r=void 0),typeof t=="number"&&(t=t.toString()),this.readyState!==e.OPEN){Is(this,t,n);return}r===void 0&&(r=!this._isServer),this._sender.pong(t||Un,r,n)}resume(){this.readyState===e.CONNECTING||this.readyState===e.CLOSED||(this._paused=!1,this._receiver._writableState.needDrain||this._socket.resume())}send(t,r,n){if(this.readyState===e.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");if(typeof r=="function"&&(n=r,r={}),typeof t=="number"&&(t=t.toString()),this.readyState!==e.OPEN){Is(this,t,n);return}let o={binary:typeof t!="string",mask:!this._isServer,compress:!0,fin:!0,...r};this._extensions[Ye.extensionName]||(o.compress=!1),this._sender.send(t||Un,o,n)}terminate(){if(this.readyState!==e.CLOSED){if(this.readyState===e.CONNECTING){ce(this,this._req,"WebSocket was closed before the connection was established");return}this._socket&&(this._readyState=e.CLOSING,this._socket.destroy())}}};Object.defineProperty(j,"CONNECTING",{enumerable:!0,value:je.indexOf("CONNECTING")});Object.defineProperty(j.prototype,"CONNECTING",{enumerable:!0,value:je.indexOf("CONNECTING")});Object.defineProperty(j,"OPEN",{enumerable:!0,value:je.indexOf("OPEN")});Object.defineProperty(j.prototype,"OPEN",{enumerable:!0,value:je.indexOf("OPEN")});Object.defineProperty(j,"CLOSING",{enumerable:!0,value:je.indexOf("CLOSING")});Object.defineProperty(j.prototype,"CLOSING",{enumerable:!0,value:je.indexOf("CLOSING")});Object.defineProperty(j,"CLOSED",{enumerable:!0,value:je.indexOf("CLOSED")});Object.defineProperty(j.prototype,"CLOSED",{enumerable:!0,value:je.indexOf("CLOSED")});["binaryType","bufferedAmount","extensions","isPaused","protocol","readyState","url"].forEach(e=>{Object.defineProperty(j.prototype,e,{enumerable:!0})});["open","error","close","message"].forEach(e=>{Object.defineProperty(j.prototype,`on${e}`,{enumerable:!0,get(){for(let t of this.listeners(e))if(t[Es])return t[Rh];return null},set(t){for(let r of this.listeners(e))if(r[Es]){this.removeListener(e,r);break}typeof t=="function"&&this.addEventListener(e,t,{[Es]:!0})}})});j.prototype.addEventListener=Ah;j.prototype.removeEventListener=Mh;Qc.exports=j;function Hc(e,t,r,n){let o={allowSynchronousEvents:!0,autoPong:!0,closeTimeout:Ih,protocolVersion:bs[1],maxPayload:104857600,skipUTF8Validation:!1,perMessageDeflate:!0,followRedirects:!1,maxRedirects:10,...n,socketPath:void 0,hostname:void 0,protocol:void 0,timeout:void 0,method:"GET",host:void 0,path:void 0,port:void 0};if(e._autoPong=o.autoPong,e._closeTimeout=o.closeTimeout,!bs.includes(o.protocolVersion))throw new RangeError(`Unsupported protocol version: ${o.protocolVersion} (supported versions: ${bs.join(", ")})`);let s;if(t instanceof Ps)s=t;else try{s=new Ps(t)}catch{throw new SyntaxError(`Invalid URL: ${t}`)}s.protocol==="http:"?s.protocol="ws:":s.protocol==="https:"&&(s.protocol="wss:"),e._url=s.href;let i=s.protocol==="wss:",a=s.protocol==="ws+unix:",c;if(s.protocol!=="ws:"&&!i&&!a?c=`The URL's protocol must be one of "ws:", "wss:", "http:", "https:", or "ws+unix:"`:a&&!s.pathname?c="The URL's pathname is empty":s.hash&&(c="The URL contains a fragment identifier"),c){let g=new SyntaxError(c);if(e._redirects===0)throw g;$n(e,g);return}let l=i?443:80,d=Ch(16).toString("base64"),u=i?wh.request:Sh.request,p=new Set,m;if(o.createConnection=o.createConnection||(i?Uh:Dh),o.defaultPort=o.defaultPort||l,o.port=s.port||l,o.host=s.hostname.startsWith("[")?s.hostname.slice(1,-1):s.hostname,o.headers={...o.headers,"Sec-WebSocket-Version":o.protocolVersion,"Sec-WebSocket-Key":d,Connection:"Upgrade",Upgrade:"websocket"},o.path=s.pathname+s.search,o.timeout=o.handshakeTimeout,o.perMessageDeflate&&(m=new Ye({...o.perMessageDeflate,isServer:!1,maxPayload:o.maxPayload}),o.headers["Sec-WebSocket-Extensions"]=Oh({[Ye.extensionName]:m.offer()})),r.length){for(let g of r){if(typeof g!="string"||!Nh.test(g)||p.has(g))throw new SyntaxError("An invalid or duplicated subprotocol was specified");p.add(g)}o.headers["Sec-WebSocket-Protocol"]=r.join(",")}if(o.origin&&(o.protocolVersion<13?o.headers["Sec-WebSocket-Origin"]=o.origin:o.headers.Origin=o.origin),(s.username||s.password)&&(o.auth=`${s.username}:${s.password}`),a){let g=o.path.split(":");o.socketPath=g[0],o.path=g[1]}let y;if(o.followRedirects){if(e._redirects===0){e._originalIpc=a,e._originalSecure=i,e._originalHostOrSocketPath=a?o.socketPath:s.host;let g=n&&n.headers;if(n={...n,headers:{}},g)for(let[w,k]of Object.entries(g))n.headers[w.toLowerCase()]=k}else if(e.listenerCount("redirect")===0){let g=a?e._originalIpc?o.socketPath===e._originalHostOrSocketPath:!1:e._originalIpc?!1:s.host===e._originalHostOrSocketPath;(!g||e._originalSecure&&!i)&&(delete o.headers.authorization,delete o.headers.cookie,g||delete o.headers.host,o.auth=void 0)}o.auth&&!n.headers.authorization&&(n.headers.authorization="Basic "+Buffer.from(o.auth).toString("base64")),y=e._req=u(o),e._redirects&&e.emit("redirect",e.url,y)}else y=e._req=u(o);o.timeout&&y.on("timeout",()=>{ce(e,y,"Opening handshake has timed out")}),y.on("error",g=>{y===null||y[zc]||(y=e._req=null,$n(e,g))}),y.on("response",g=>{let w=g.headers.location,k=g.statusCode;if(w&&o.followRedirects&&k>=300&&k<400){if(++e._redirects>o.maxRedirects){ce(e,y,"Maximum redirects exceeded");return}y.abort();let E;try{E=new Ps(w,t)}catch{let T=new SyntaxError(`Invalid URL: ${w}`);$n(e,T);return}Hc(e,E,r,n)}else e.emit("unexpected-response",y,g)||ce(e,y,`Unexpected server response: ${g.statusCode}`)}),y.on("upgrade",(g,w,k)=>{if(e.emit("upgrade",g),e.readyState!==j.CONNECTING)return;y=e._req=null;let E=g.headers.upgrade;if(E===void 0||E.toLowerCase()!=="websocket"){ce(e,w,"Invalid Upgrade header");return}let b=vh("sha1").update(d+Th).digest("base64");if(g.headers["sec-websocket-accept"]!==b){ce(e,w,"Invalid Sec-WebSocket-Accept header");return}let T=g.headers["sec-websocket-protocol"],N;if(T!==void 0?p.size?p.has(T)||(N="Server sent an invalid subprotocol"):N="Server sent a subprotocol but none was requested":p.size&&(N="Server sent no subprotocol"),N){ce(e,w,N);return}T&&(e._protocol=T);let _=g.headers["sec-websocket-extensions"];if(_!==void 0){if(!m){ce(e,w,"Server sent a Sec-WebSocket-Extensions header but no extension was requested");return}let J;try{J=Bh(_)}catch{ce(e,w,"Invalid Sec-WebSocket-Extensions header");return}let B=Object.keys(J);if(B.length!==1||B[0]!==Ye.extensionName){ce(e,w,"Server indicated an extension that was not requested");return}try{m.accept(J[Ye.extensionName])}catch{ce(e,w,"Invalid Sec-WebSocket-Extensions header");return}e._extensions[Ye.extensionName]=m}e.setSocket(w,k,{allowSynchronousEvents:o.allowSynchronousEvents,generateMask:o.generateMask,maxPayload:o.maxPayload,skipUTF8Validation:o.skipUTF8Validation})}),o.finishRequest?o.finishRequest(y,e):y.end()}function $n(e,t){e._readyState=j.CLOSING,e._errorEmitted=!0,e.emit("error",t),e.emitClose()}function Dh(e){return e.path=e.socketPath,Gc.connect(e)}function Uh(e){return e.path=void 0,!e.servername&&e.servername!==""&&(e.servername=Gc.isIP(e.host)?"":e.host),xh.connect(e)}function ce(e,t,r){e._readyState=j.CLOSING;let n=new Error(r);Error.captureStackTrace(n,ce),t.setHeader?(t[zc]=!0,t.abort(),t.socket&&!t.socket.destroyed&&t.socket.destroy(),process.nextTick($n,e,n)):(t.destroy(n),t.once("error",e.emit.bind(e,"error")),t.once("close",e.emitClose.bind(e)))}function Is(e,t,r){if(t){let n=bh(t)?t.size:Wh(t).length;e._socket?e._sender._bufferedBytes+=n:e._bufferedAmount+=n}if(r){let n=new Error(`WebSocket is not open: readyState ${e.readyState} (${je[e.readyState]})`);process.nextTick(r,n)}}function $h(e,t){let r=this[Q];r._closeFrameReceived=!0,r._closeMessage=t,r._closeCode=e,r._socket[Q]!==void 0&&(r._socket.removeListener("data",Ln),process.nextTick(Vc,r._socket),e===1005?r.close():r.close(e,t))}function Lh(){let e=this[Q];e.isPaused||e._socket.resume()}function jh(e){let t=this[Q];t._socket[Q]!==void 0&&(t._socket.removeListener("data",Ln),process.nextTick(Vc,t._socket),t.close(e[_h])),t._errorEmitted||(t._errorEmitted=!0,t.emit("error",e))}function Fc(){this[Q].emitClose()}function Fh(e,t){this[Q].emit("message",e,t)}function Gh(e){let t=this[Q];t._autoPong&&t.pong(e,!this._isServer,qc),t.emit("ping",e)}function qh(e){this[Q].emit("pong",e)}function Vc(e){e.resume()}function zh(e){let t=this[Q];t.readyState!==j.CLOSED&&(t.readyState===j.OPEN&&(t._readyState=j.CLOSING,Jc(t)),this._socket.end(),t._errorEmitted||(t._errorEmitted=!0,t.emit("error",e)))}function Jc(e){e._closeTimer=setTimeout(e._socket.destroy.bind(e._socket),e._closeTimeout)}function Kc(){let e=this[Q];if(this.removeListener("close",Kc),this.removeListener("data",Ln),this.removeListener("end",Xc),e._readyState=j.CLOSING,!this._readableState.endEmitted&&!e._closeFrameReceived&&!e._receiver._writableState.errorEmitted&&this._readableState.length!==0){let t=this.read(this._readableState.length);e._receiver.write(t)}e._receiver.end(),this[Q]=void 0,clearTimeout(e._closeTimer),e._receiver._writableState.finished||e._receiver._writableState.errorEmitted?e.emitClose():(e._receiver.on("error",Fc),e._receiver.on("finish",Fc))}function Ln(e){this[Q]._receiver.write(e)||this.pause()}function Xc(){let e=this[Q];e._readyState=j.CLOSING,e._receiver.end(),this.end()}function Yc(){let e=this[Q];this.removeListener("error",Yc),this.on("error",qc),e&&(e._readyState=j.CLOSING,this.destroy())}});var rl=se((cb,tl)=>{"use strict";var ab=jn(),{Duplex:Hh}=K("stream");function Zc(e){e.emit("close")}function Vh(){!this.destroyed&&this._writableState.finished&&this.destroy()}function el(e){this.removeListener("error",el),this.destroy(),this.listenerCount("error")===0&&this.emit("error",e)}function Jh(e,t){let r=!0,n=new Hh({...t,autoDestroy:!1,emitClose:!1,objectMode:!1,writableObjectMode:!1});return e.on("message",function(s,i){let a=!i&&n._readableState.objectMode?s.toString():s;n.push(a)||e.pause()}),e.once("error",function(s){n.destroyed||(r=!1,n.destroy(s))}),e.once("close",function(){n.destroyed||n.push(null)}),n._destroy=function(o,s){if(e.readyState===e.CLOSED){s(o),process.nextTick(Zc,n);return}let i=!1;e.once("error",function(c){i=!0,s(c)}),e.once("close",function(){i||s(o),process.nextTick(Zc,n)}),r&&e.terminate()},n._final=function(o){if(e.readyState===e.CONNECTING){e.once("open",function(){n._final(o)});return}e._socket!==null&&(e._socket._writableState.finished?(o(),n._readableState.endEmitted&&n.destroy()):(e._socket.once("finish",function(){o()}),e.close()))},n._read=function(){e.isPaused&&e.resume()},n._write=function(o,s,i){if(e.readyState===e.CONNECTING){e.once("open",function(){n._write(o,s,i)});return}e.send(o,i)},n.on("end",Vh),n.on("error",el),n}tl.exports=Jh});var Ts=se((lb,nl)=>{"use strict";var{tokenChars:Kh}=Gt();function Xh(e){let t=new Set,r=-1,n=-1,o=0;for(o;o<e.length;o++){let i=e.charCodeAt(o);if(n===-1&&Kh[i]===1)r===-1&&(r=o);else if(o!==0&&(i===32||i===9))n===-1&&r!==-1&&(n=o);else if(i===44){if(r===-1)throw new SyntaxError(`Unexpected character at index ${o}`);n===-1&&(n=o);let a=e.slice(r,n);if(t.has(a))throw new SyntaxError(`The "${a}" subprotocol is duplicated`);t.add(a),r=n=-1}else throw new SyntaxError(`Unexpected character at index ${o}`)}if(r===-1||n!==-1)throw new SyntaxError("Unexpected end of input");let s=e.slice(r,o);if(t.has(s))throw new SyntaxError(`The "${s}" subprotocol is duplicated`);return t.add(s),t}nl.exports={parse:Xh}});var ul=se((db,ll)=>{"use strict";var Yh=K("events"),Fn=K("http"),{Duplex:ub}=K("stream"),{createHash:Qh}=K("crypto"),ol=Dn(),yt=Ft(),Zh=Ts(),ey=jn(),{CLOSE_TIMEOUT:ty,GUID:ry,kWebSocket:ny}=Ue(),oy=/^[+/0-9A-Za-z]{22}==$/,sl=0,il=1,cl=2,Rs=class extends Yh{constructor(t,r){if(super(),t={allowSynchronousEvents:!0,autoPong:!0,maxPayload:100*1024*1024,skipUTF8Validation:!1,perMessageDeflate:!1,handleProtocols:null,clientTracking:!0,closeTimeout:ty,verifyClient:null,noServer:!1,backlog:null,server:null,host:null,path:null,port:null,WebSocket:ey,...t},t.port==null&&!t.server&&!t.noServer||t.port!=null&&(t.server||t.noServer)||t.server&&t.noServer)throw new TypeError('One and only one of the "port", "server", or "noServer" options must be specified');if(t.port!=null?(this._server=Fn.createServer((n,o)=>{let s=Fn.STATUS_CODES[426];o.writeHead(426,{"Content-Length":s.length,"Content-Type":"text/plain"}),o.end(s)}),this._server.listen(t.port,t.host,t.backlog,r)):t.server&&(this._server=t.server),this._server){let n=this.emit.bind(this,"connection");this._removeListeners=sy(this._server,{listening:this.emit.bind(this,"listening"),error:this.emit.bind(this,"error"),upgrade:(o,s,i)=>{this.handleUpgrade(o,s,i,n)}})}t.perMessageDeflate===!0&&(t.perMessageDeflate={}),t.clientTracking&&(this.clients=new Set,this._shouldEmitClose=!1),this.options=t,this._state=sl}address(){if(this.options.noServer)throw new Error('The server is operating in "noServer" mode');return this._server?this._server.address():null}close(t){if(this._state===cl){t&&this.once("close",()=>{t(new Error("The server is not running"))}),process.nextTick(br,this);return}if(t&&this.once("close",t),this._state!==il)if(this._state=il,this.options.noServer||this.options.server)this._server&&(this._removeListeners(),this._removeListeners=this._server=null),this.clients?this.clients.size?this._shouldEmitClose=!0:process.nextTick(br,this):process.nextTick(br,this);else{let r=this._server;this._removeListeners(),this._removeListeners=this._server=null,r.close(()=>{br(this)})}}shouldHandle(t){if(this.options.path){let r=t.url.indexOf("?");if((r!==-1?t.url.slice(0,r):t.url)!==this.options.path)return!1}return!0}handleUpgrade(t,r,n,o){r.on("error",al);let s=t.headers["sec-websocket-key"],i=t.headers.upgrade,a=+t.headers["sec-websocket-version"];if(t.method!=="GET"){kt(this,t,r,405,"Invalid HTTP method");return}if(i===void 0||i.toLowerCase()!=="websocket"){kt(this,t,r,400,"Invalid Upgrade header");return}if(s===void 0||!oy.test(s)){kt(this,t,r,400,"Missing or invalid Sec-WebSocket-Key header");return}if(a!==13&&a!==8){kt(this,t,r,400,"Missing or invalid Sec-WebSocket-Version header",{"Sec-WebSocket-Version":"13, 8"});return}if(!this.shouldHandle(t)){Ir(r,400);return}let c=t.headers["sec-websocket-protocol"],l=new Set;if(c!==void 0)try{l=Zh.parse(c)}catch{kt(this,t,r,400,"Invalid Sec-WebSocket-Protocol header");return}let d=t.headers["sec-websocket-extensions"],u={};if(this.options.perMessageDeflate&&d!==void 0){let p=new yt({...this.options.perMessageDeflate,isServer:!0,maxPayload:this.options.maxPayload});try{let m=ol.parse(d);m[yt.extensionName]&&(p.accept(m[yt.extensionName]),u[yt.extensionName]=p)}catch{kt(this,t,r,400,"Invalid or unacceptable Sec-WebSocket-Extensions header");return}}if(this.options.verifyClient){let p={origin:t.headers[`${a===8?"sec-websocket-origin":"origin"}`],secure:!!(t.socket.authorized||t.socket.encrypted),req:t};if(this.options.verifyClient.length===2){this.options.verifyClient(p,(m,y,g,w)=>{if(!m)return Ir(r,y||401,g,w);this.completeUpgrade(u,s,l,t,r,n,o)});return}if(!this.options.verifyClient(p))return Ir(r,401)}this.completeUpgrade(u,s,l,t,r,n,o)}completeUpgrade(t,r,n,o,s,i,a){if(!s.readable||!s.writable)return s.destroy();if(s[ny])throw new Error("server.handleUpgrade() was called more than once with the same socket, possibly due to a misconfiguration");if(this._state>sl)return Ir(s,503);let l=["HTTP/1.1 101 Switching Protocols","Upgrade: websocket","Connection: Upgrade",`Sec-WebSocket-Accept: ${Qh("sha1").update(r+ry).digest("base64")}`],d=new this.options.WebSocket(null,void 0,this.options);if(n.size){let u=this.options.handleProtocols?this.options.handleProtocols(n,o):n.values().next().value;u&&(l.push(`Sec-WebSocket-Protocol: ${u}`),d._protocol=u)}if(t[yt.extensionName]){let u=t[yt.extensionName].params,p=ol.format({[yt.extensionName]:[u]});l.push(`Sec-WebSocket-Extensions: ${p}`),d._extensions=t}this.emit("headers",l,o),s.write(l.concat(`\r
2
- `).join(`\r
3
- `)),s.removeListener("error",al),d.setSocket(s,i,{allowSynchronousEvents:this.options.allowSynchronousEvents,maxPayload:this.options.maxPayload,skipUTF8Validation:this.options.skipUTF8Validation}),this.clients&&(this.clients.add(d),d.on("close",()=>{this.clients.delete(d),this._shouldEmitClose&&!this.clients.size&&process.nextTick(br,this)})),a(d,o)}};ll.exports=Rs;function sy(e,t){for(let r of Object.keys(t))e.on(r,t[r]);return function(){for(let n of Object.keys(t))e.removeListener(n,t[n])}}function br(e){e._state=cl,e.emit("close")}function al(){this.destroy()}function Ir(e,t,r,n){r=r||Fn.STATUS_CODES[t],n={Connection:"close","Content-Type":"text/html","Content-Length":Buffer.byteLength(r),...n},e.once("finish",e.destroy),e.end(`HTTP/1.1 ${t} ${Fn.STATUS_CODES[t]}\r
4
- `+Object.keys(n).map(o=>`${o}: ${n[o]}`).join(`\r
5
- `)+`\r
6
- \r
7
- `+r)}function kt(e,t,r,n,o,s){if(e.listenerCount("wsClientError")){let i=new Error(o);Error.captureStackTrace(i,kt),e.emit("wsClientError",i,r,t)}else Ir(r,n,o,s)}});import xp from"dotenv";var Oe=e=>e.replace(/\/+$/,""),Hi=e=>{let t=Oe(e);return t.startsWith("https://")?`${t.replace("https://","wss://")}/api/control-plane/executors/ws`:t.startsWith("http://")?`${t.replace("http://","ws://")}/api/control-plane/executors/ws`:`${t}/api/control-plane/executors/ws`},Vi=e=>{let t=Oe(e);return t.startsWith("https://")?`${t.replace("https://","wss://")}/api/preview-tunnels/ws`:t.startsWith("http://")?`${t.replace("http://","ws://")}/api/preview-tunnels/ws`:`${t}/api/preview-tunnels/ws`};var st=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 lr=async(e,t)=>st({url:`${Oe(t)}/api/control-plane/executors/pair`,method:"POST",body:e,errorMessage:"Pair request failed."});var Et=e=>e?.trim().toUpperCase()||"",bt=e=>!!(e.executorId?.trim()&&e.executorToken?.trim()),Kr=(e,t)=>{let r=Et(e);return!r||!bt(t)?!1:r===Et(t.lastPairedPairingCode)},Xr=()=>"This pairing code already completed on this worker. Reusing the saved executor token instead of pairing again.";var _p=new Map([["\u914D\u5BF9\u7801\u5DF2\u4F7F\u7528\u3002","This pairing code has already been used."],["\u914D\u5BF9\u7801\u5DF2\u8FC7\u671F\u3002","This pairing code has expired."],["\u914D\u5BF9\u7801\u4E0D\u5B58\u5728\u3002","This pairing code does not exist."]]),Ap=new Set(["This pairing code has already been used.","This pairing code has expired.","This pairing code does not exist."]),Ji=e=>{let t=e.trim();return _p.get(t)||t},Mp=e=>Ap.has(Ji(e)),Ki=()=>"This worker is already paired locally. If you only want to reconnect after a restart, start the worker again without `connect --pairing-code ...`.",Yr=(e,t)=>{let r=Ji(e);return!t||!Mp(r)?r:`${r} ${Ki()}`},Xi=e=>e?`${Ki()} Use \`connect --pairing-code <CODE>\` only when you want to pair this machine for the first time or move it to a different account.`:"Missing required flag: --pairing-code";import{existsSync as Po,readFileSync as Eo}from"node:fs";import ye from"node:path";import{fileURLToPath as Yi}from"node:url";var xo=null,Co=null,vo=null,Op=(e,t)=>{let r=ye.relative(t,e);return r===""||!r.startsWith("..")&&!ye.isAbsolute(r)},Bp=e=>{try{let t=JSON.parse(Eo(e,"utf8"));return!!(t.name&&t.version)}catch{return!1}},Wp=()=>{let e=process.env.VIBEMUX_RUNTIME_ROOT?.trim();if(e){let r=ye.resolve(e),n=Yi(import.meta.url);if(Op(n,r))return r}let t=ye.dirname(Yi(import.meta.url));for(;;){let r=ye.join(t,"package.json");if(Po(r)&&Bp(r))return t;let n=ye.dirname(t);if(n===t)return process.cwd();t=n}},ie=()=>(xo||(xo=Wp()),xo),it=()=>{if(!Co){let e=ye.join(ie(),"package.json");Co=Po(e)?JSON.parse(Eo(e,"utf8")):{}}return Co},It=()=>{if(!vo){let e=ye.join(ie(),"runtime","worker-release.json");vo=Po(e)?JSON.parse(Eo(e,"utf8")):{}}return vo},ue=()=>it().version?.trim()||process.env.npm_package_version?.trim()||"0.0.0",ur=()=>ye.join(ie(),"dist-worker","apps","worker","src","index.js"),Qi=()=>ye.join(ie(),"dist-worker","apps","worker","web"),Qr=()=>{let e=process.platform==="win32"?"vibemux-worker.cmd":"vibemux-worker";return ye.join(ie(),"bin",e)};import{cpSync as oa,existsSync as Ke,mkdirSync as _o,readFileSync as nn,rmSync as im,writeFileSync as Ao}from"node:fs";import{randomUUID as am}from"node:crypto";import We from"node:os";import A from"node:path";var Zr=["Pi","OpenCode","Codex","ClaudeCode"];var Np=[...Zr],Dp=new Set(Zr),qv=new Set(Np),Up={OpenCode:{id:"OpenCode",label:"OpenCode",transport:"SDK",modelIdStrategy:"canonical",workerOnly:!0,agentType:"OpenCode"},Codex:{id:"Codex",label:"Codex",transport:"STDIO",modelIdStrategy:"native",workerOnly:!0,agentType:"Codex"},ClaudeCode:{id:"ClaudeCode",label:"Claude Code",transport:"STDIO",modelIdStrategy:"native",workerOnly:!0,agentType:"ClaudeCode"},Pi:{id:"Pi",label:"Pi",transport:"SDK",modelIdStrategy:"canonical",workerOnly:!0,agentType:"Pi"}},Zi=e=>typeof e=="string"&&Dp.has(e);var ea=e=>Up[e],Tt=e=>e;var bo=(e,t)=>{let r=e.trim(),n=t.trim();return r&&n?`${r}/${n}`:""},Rt=(e,t,r)=>ea(e).modelIdStrategy==="canonical"?r?.trim()||"":$p(t,r),at=e=>{let t=e?.trim()||"";if(!t)return null;let[r,...n]=t.split("/"),o=n.join("/");return!r||!o?null:{providerId:r,modelId:o}},ta=e=>e?.trim().toLowerCase()||"",$p=(e,t)=>{let r=t?.trim()||"";if(!r)return"";let n=at(r);return n&&ta(n.providerId)===ta(e)?n.modelId:r};var Lp=e=>{let t="",r=!1,n='"',o=!1;for(let s=0;s<e.length;s+=1){let i=e[s],a=e[s+1];if(r){if(t+=i,o){o=!1;continue}if(i==="\\"){o=!0;continue}i===n&&(r=!1);continue}if(i==='"'||i==="'"){r=!0,n=i,t+=i;continue}if(i==="/"&&a==="/"){for(s+=2;s<e.length&&e[s]!==`
8
- `;)s+=1;s<e.length&&(t+=e[s]);continue}if(i==="/"&&a==="*"){for(s+=2;s<e.length-1&&!(e[s]==="*"&&e[s+1]==="/");)s+=1;s+=1;continue}t+=i}return t},jp=e=>{let t="",r=!1,n='"',o=!1;for(let s=0;s<e.length;s+=1){let i=e[s];if(r){if(t+=i,o){o=!1;continue}if(i==="\\"){o=!0;continue}i===n&&(r=!1);continue}if(i==='"'||i==="'"){r=!0,n=i,t+=i;continue}if(i===","){let a=s+1;for(;a<e.length&&/\s/.test(e[a]);)a+=1;if(e[a]==="}"||e[a]==="]")continue}t+=i}return t},Fp=e=>jp(Lp(e)),de=e=>{let t=e?.trim();if(!t)return{};try{let r=JSON.parse(Fp(t));return r&&typeof r=="object"?r:{}}catch(r){throw new Error(r instanceof Error?`OpenCode \u914D\u7F6E JSON/JSONC \u65E0\u6548\uFF1A${r.message}`:"OpenCode \u914D\u7F6E JSON/JSONC \u65E0\u6548")}};var ct="built-in://vibemux",Io=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Gp=(e,t,r)=>{let n=t.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"")||`${e}-${r+1}`;return`${e}-${r+1}-${n}`};var qp=e=>e.replace(/\/+$/,""),zp=e=>e.startsWith("sse://")?`http://${e.slice(6)}`:e,Hp=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:`${qp(e.cloudUrl)}/mcp/executor`,enabled:!0,headers:t}},Vp=e=>{let t=e.replace(/^stdio:\/\//,"").trim();return t?{command:t}:null},Jp=e=>{let t=zp(e).trim();return t?{type:"remote",url:t,enabled:!0}:null},lt=(e,t)=>e.filter(r=>r.enabled).reduce((r,n,o)=>{let s=n.id?.trim()||Gp("mcp",n.name,o),i=n.target===ct?Hp(t):n.transport==="stdio"||n.target.startsWith("stdio://")?Vp(n.target):Jp(n.target);return i&&(r[s]=i),r},{}),en=(e,t,r)=>{let n=de(e),o=Io(n)?{...n}:{},s=Io(o.mcp)?{...o.mcp}:Io(o.mcpServers)?{...o.mcpServers}:{},i=lt(t,r),{mcpServers:a,...c}=o,l={...c,mcp:{...s,...i}};return JSON.stringify(l,null,2)};var _t=e=>`'${e.replace(/'/g,"'\\''")}'`,ut=(e,t=[])=>r=>`command -v ${e} >/dev/null 2>&1 && ${e}${t.length>0?` ${t.join(" ")}`:""} ${_t(r)}`,ke=(e,t=[])=>r=>`[ -x "${e}" ] && "${e}"${t.length>0?` ${t.join(" ")}`:""} ${_t(r)}`,Be=e=>t=>`command -v open >/dev/null 2>&1 && open -Ra "${e}" && open -a "${e}" ${_t(t)}`,dr=e=>t=>e?`command -v open >/dev/null 2>&1 && open -Ra "${e}" && open -a "${e}" ${_t(t)}`:`command -v open >/dev/null 2>&1 && open ${_t(t)}`,Kp=e=>`command -v ghostty >/dev/null 2>&1 && ghostty --working-directory=${_t(e)}`;var Yv={vscode:{label:"VS Code",description:"Visual Studio Code",commandBuilders:[ut("code",["--reuse-window"]),...["/opt/homebrew/bin/code","/usr/local/bin/code","/usr/bin/code","/snap/bin/code","/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code","$HOME/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code"].map(e=>ke(e,["--reuse-window"])),Be("Visual Studio Code")]},"vscode-insiders":{label:"VS Code Insiders",description:"Visual Studio Code - Insiders",commandBuilders:[ut("code-insiders",["--reuse-window"]),...["/opt/homebrew/bin/code-insiders","/usr/local/bin/code-insiders","/usr/bin/code-insiders","/snap/bin/code-insiders","/Applications/Visual Studio Code - Insiders.app/Contents/Resources/app/bin/code-insiders","$HOME/Applications/Visual Studio Code - Insiders.app/Contents/Resources/app/bin/code-insiders"].map(e=>ke(e,["--reuse-window"])),Be("Visual Studio Code - Insiders")]},cursor:{label:"Cursor",description:"Cursor editor",commandBuilders:[ut("cursor"),ke("/Applications/Cursor.app/Contents/Resources/app/bin/cursor"),ke("$HOME/Applications/Cursor.app/Contents/Resources/app/bin/cursor"),Be("Cursor")]},windsurf:{label:"Windsurf",description:"Windsurf editor",commandBuilders:[ut("windsurf"),ke("/Applications/Windsurf.app/Contents/Resources/app/bin/windsurf"),ke("$HOME/Applications/Windsurf.app/Contents/Resources/app/bin/windsurf"),Be("Windsurf")]},zed:{label:"Zed",description:"Zed editor",commandBuilders:[ut("zed"),ke("/Applications/Zed.app/Contents/MacOS/zed"),ke("$HOME/Applications/Zed.app/Contents/MacOS/zed"),Be("Zed")]},intellij:{label:"IntelliJ IDEA",description:"JetBrains IntelliJ IDEA",commandBuilders:[ut("idea"),Be("IntelliJ IDEA"),Be("IntelliJ IDEA CE")]},xcode:{label:"Xcode",description:"Xcode project editor",commandBuilders:[ut("xed"),ke("/usr/bin/xed"),Be("Xcode")]},ghostty:{label:"Ghostty",description:"Ghostty terminal",commandBuilders:[Kp,ke("/Applications/Ghostty.app/Contents/MacOS/ghostty",["--working-directory"]),ke("$HOME/Applications/Ghostty.app/Contents/MacOS/ghostty",["--working-directory"]),Be("Ghostty")]},finder:{label:"Finder",description:"Open the folder in Finder",commandBuilders:[dr()]},terminal:{label:"Terminal",description:"Open the folder in Terminal.app",commandBuilders:[dr("Terminal")]},iterm:{label:"iTerm",description:"Open the folder in iTerm",commandBuilders:[dr("iTerm"),dr("iTerm2")]},warp:{label:"Warp",description:"Open the folder in Warp",commandBuilders:[dr("Warp")]}};var Xp={defaultModel:"",agent:"",permissionPolicy:""},Yp={defaultModel:"gpt-5.4",sandbox:"workspace-write",approval:"never",reasoningEffort:"medium",reasoningSummary:"auto"},Qp={defaultModel:"sonnet",permissionMode:"bypassPermissions",planMode:!1},Zp={defaultModel:"",agentDir:""},ra={OpenCode:Xp,Codex:Yp,ClaudeCode:Qp,Pi:Zp},sP={...ra};var em=e=>({OpenCode:{...e.OpenCode},Codex:{...e.Codex},ClaudeCode:{...e.ClaudeCode},Pi:{...e.Pi}}),pr=(e,t)=>{let r=em(ra);return e?.OpenCode&&(r.OpenCode={...r.OpenCode,...e.OpenCode}),e?.Codex&&(r.Codex={...r.Codex,...e.Codex}),e?.ClaudeCode&&(r.ClaudeCode={...r.ClaudeCode,...e.ClaudeCode}),e?.Pi&&(r.Pi={...r.Pi,...e.Pi}),!r.OpenCode.defaultModel.trim()&&t?.trim()&&(r.OpenCode.defaultModel=t.trim()),r};var tn=null,tm=()=>tn||(tn=It(),tn),Je=()=>process.env.VIBEMUX_WORKER_RELEASE_CHANNEL?.trim()||tm().channel?.trim()||"production",rm=e=>e==="preview"?"vibemux-worker-preview":"vibemux-worker",nm=e=>e==="preview"?"preview":"latest",om=()=>(process.env.npm_config_registry?.trim()||"https://registry.npmjs.org").replace(/\/$/,""),sm=async e=>{let t=await fetch(`${om()}/${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()},dt=async()=>{let e=ue(),t=Je(),r=it().name?.trim()||"",n=rm(t),o=nm(t);if(r!==n)return{ok:!0,currentVersion:e,channel:t,available:!1,packageName:n,packageTag:o,message:"\u5F53\u524D\u662F\u6E90\u7801\u6A21\u5F0F\u6216\u975E npm Worker \u5305\uFF0C\u8DF3\u8FC7\u7248\u672C\u66F4\u65B0\u68C0\u67E5\u3002"};try{let i=(await sm(n))["dist-tags"]?.[o]?.trim();return i?i===e?{ok:!0,currentVersion:e,latestVersion:i,channel:t,available:!1,packageName:n,packageTag:o,message:`\u5F53\u524D\u5DF2\u662F\u6700\u65B0\u7248\u672C ${e}\u3002`}:{ok:!0,currentVersion:e,latestVersion:i,channel:t,available:!0,packageName:n,packageTag:o,message:`\u68C0\u6D4B\u5230\u65B0\u7248\u672C ${i}\u3002`}:{ok:!1,currentVersion:e,channel:t,available:!1,packageName:n,packageTag:o,message:`\u672A\u627E\u5230 npm dist-tag: ${o}`}}catch(s){return{ok:!1,currentVersion:e,channel:t,available:!1,packageName:n,packageTag:o,message:s instanceof Error?s.message:"\u67E5\u8BE2 npm \u66F4\u65B0\u5931\u8D25"}}};var sa=A.join(We.homedir(),".vibemux"),cm=A.join(We.homedir(),".vibemux-dev"),lm=A.join(We.homedir(),".vibemux-preview"),um="http://127.0.0.1:8989",dm=48100,pm=["config.json","machine-id","workspace","runtime"],mm=["config.json","machine-id","runtime"],fm=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"]),ia=()=>!!process.env.VIBEMUX_CLOUD_URL?.trim(),rn=()=>process.env.VIBEMUX_CLOUD_URL?.trim()||It().defaultCloudUrl?.trim()||um,gm=["preview.vibemux.com","vibemux.xyz"],To=e=>gm.some(t=>e.includes(t)),hm=e=>{if(process.env.NODE_ENV==="development"||ia())return!1;let t=It().defaultCloudUrl?.trim();if(!t)return!1;if(fm.has(e?.trim()||""))return!0;let r=To(t),n=To(e||"");return r!==n},aa=()=>{let e=rn();return Je()==="preview"||To(e)?"preview":process.env.NODE_ENV==="development"?"development":"production"},ym=()=>{switch(aa()){case"development":return cm;case"preview":return lm;default:return sa}},km=()=>{let e=sa;switch(aa()){case"development":return[A.join(e,"worker-dev")];case"preview":return process.env.NODE_ENV==="development"?[A.join(e,"worker-dev-preview"),A.join(e,"worker-preview")]:[A.join(e,"worker-preview"),A.join(e,"worker-dev-preview")];default:return[A.join(e,"worker")]}},na=e=>mm.some(t=>Ke(A.join(e,t))),wm=(e,t)=>{let r=A.join(e,"config.json");if(Ke(r))try{let n=JSON.parse(nn(r,"utf8"));(n.workspaceRoot?.trim()||"")===A.join(e,"workspace")&&(n.workspaceRoot=A.join(t,"workspace")),Ao(A.join(t,"config.json"),`${JSON.stringify(n,null,2)}
9
- `,"utf8")}catch{oa(r,A.join(t,"config.json"))}},Sm=e=>{if(na(e))return;let t=km().find(r=>r!==e&&na(r));if(t){_o(e,{recursive:!0});for(let r of pm){if(r==="config.json")continue;let n=A.join(t,r),o=A.join(e,r);!Ke(n)||Ke(o)||oa(n,o,{recursive:!0})}Ke(A.join(e,"config.json"))||wm(t,e)}},xm=()=>{let e=Number(process.env.VIBEMUX_WORKER_PORT?.trim());if(Number.isFinite(e)&&e>0)return e;let t=It().defaultLocalServerPort;return Number.isFinite(t)&&t?t:dm},Cm=()=>{let e=process.env.OPENCODE_CONFIG_PATH?.trim();if(e)return[e];let t=A.join(We.homedir(),".config","opencode");return[A.join(t,"opencode.json"),A.join(t,"opencode.jsonc")]},ca=()=>{let e=process.env.CODEX_HOME?.trim()||A.join(We.homedir(),".codex");return A.join(e,"config.toml")},la=()=>{let e=process.env.CODEX_HOME?.trim()||A.join(We.homedir(),".codex");return A.join(e,"auth.json")},vm=()=>{let e=process.env.CLAUDE_HOME?.trim()||A.join(We.homedir(),".claude");return[A.join(e,"settings.json"),A.join(e,"config.json")]},ua=()=>process.env.PI_AGENT_DIR?.trim()||A.join(We.homedir(),".pi","agent"),At=e=>{if(!Ke(e))return"";try{return nn(e,"utf8").trim()}catch{return""}},Ro=e=>!!e&&typeof e=="object"&&!Array.isArray(e),da=(e,t)=>Object.entries(t).reduce((r,[n,o])=>{let s=r[n];return Ro(s)&&Ro(o)?(r[n]=da({...s},o),r):(r[n]=o,r)},{...e}),pa=()=>{let e=Cm().map(t=>({path:t,content:At(t)})).filter(t=>t.content.trim());if(e.length===0)return{opencodeConfigContent:"",defaultModel:"",sourcePaths:[]};try{if(e.length===1){let o=de(e[0].content),s=Object.entries(o.default??{}).find(([,i])=>typeof i=="string"&&i.trim());return{opencodeConfigContent:e[0].content,defaultModel:s?`${s[0]}/${String(s[1]).trim()}`:"",sourcePaths:e.map(i=>i.path)}}let t=e.reduce((o,s)=>{let i=de(s.content);return da(o,i)},{}),r=Ro(t.default)?t.default:{},n=Object.entries(r).find(([,o])=>typeof o=="string"&&o.trim());return{opencodeConfigContent:JSON.stringify(t,null,2),defaultModel:n?`${n[0]}/${String(n[1]).trim()}`:"",sourcePaths:e.map(o=>o.path)}}catch{return{opencodeConfigContent:"",defaultModel:"",sourcePaths:e.map(t=>t.path)}}},Pm=()=>{let e=pa();return{opencodeConfigContent:e.opencodeConfigContent,defaultModel:e.defaultModel}},Em=()=>{let e=process.env.VIBEMUX_WORKER_HOME?.trim();if(e)return e;let t=process.env.VIBEMUX_HOME?.trim();return t?A.join(t,"worker"):ym()},Ee=()=>{let e=A.resolve(Em());return!process.env.VIBEMUX_WORKER_HOME?.trim()&&!process.env.VIBEMUX_HOME?.trim()&&Sm(e),e},Mo=()=>A.join(Ee(),"config.json"),bm=()=>A.join(Ee(),"machine-id"),Im=()=>{let e=Ee(),t=bm();if(Ke(t)){let n=nn(t,"utf8").trim();if(n)return n}_o(e,{recursive:!0});let r=am();return Ao(t,`${r}
10
- `,"utf8"),r},Tm=()=>({cloudUrl:rn(),machineId:Im(),machineName:We.hostname(),opencodeConfigContent:"",codexConfigContent:"",codexAuthContent:"",claudeCodeConfigContent:"",piAgentDir:ua(),defaultModel:"",agentSettings:pr(),mcpServers:[],workspaceRoot:A.join(Ee(),"workspace"),maxConcurrency:5,labels:[],capabilities:["code-execution","git-operations"],localServerPort:Number(process.env.VIBEMUX_WORKER_PORT||xm()),projectBindings:[]}),C=()=>{let e=Mo(),t=Ke(e)?JSON.parse(nn(e,"utf8")):{},r={...Tm(),...t},n=Pm();ia()&&(r.cloudUrl=rn()),hm(r.cloudUrl)&&(r.cloudUrl=rn());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=At(ca())),r.codexAuthContent?.trim()||(r.codexAuthContent=At(la())),r.claudeCodeConfigContent?.trim()||(r.claudeCodeConfigContent=Oo()),r.piAgentDir?.trim()||(r.piAgentDir=ua()),r.defaultModel?.trim()||(r.defaultModel=n.defaultModel),r.agentSettings=pr(r.agentSettings,r.defaultModel),r},be=e=>{let t=Ee();_o(t,{recursive:!0}),Ao(Mo(),`${JSON.stringify(e,null,2)}
11
- `,"utf8")},ma=()=>pa().opencodeConfigContent,on=()=>At(ca()),sn=()=>At(la()),Oo=()=>{for(let e of vm()){let t=At(e);if(t.trim())return t}return""},an=(e=C(),t)=>en(e.opencodeConfigContent,e.mcpServers??[],{cloudUrl:e.cloudUrl,executorToken:e.executorToken,actingUserId:t}),cn=()=>{im(Mo(),{force:!0})},ln=()=>{let e={...C(),executorName:void 0,executorId:void 0,executorToken:void 0,lastPairedPairingCode:void 0};return be(e),e};import{existsSync as pn}from"node:fs";import{stdin as va,stdout as Pa}from"node:process";import fr from"node:path";import{createInterface as Km}from"node:readline/promises";import{existsSync as Um}from"node:fs";import $m from"node:os";import ha from"node:path";import{spawn as Lm}from"node:child_process";import{accessSync as Rm,constants as _m,existsSync as Am}from"node:fs";import{delimiter as Bo,dirname as Mm,isAbsolute as Om,join as Bm}from"node:path";import{spawnSync as Wm}from"node:child_process";var z=(e,t,r)=>{let n=Wm(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}},G=(e,t)=>e.stdout||e.stderr||e.error||t,q=(e,t=["--version"])=>z(e,t).ok,Nm=e=>{let t=process.env.PATH??"";t.split(Bo).filter(Boolean).includes(e)||(process.env.PATH=t?`${e}${Bo}${t}`:e)},Wo=e=>{if(!Am(e))return!1;try{return Rm(e,_m.X_OK),!0}catch{return!1}},ga=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 Wo(e)?e:null;for(let r of t){let n=`${e}${r}`;if(Wo(n))return n}return null},fa=e=>process.platform==="win32"?ga(e):Wo(e)?e:null,re=e=>{if(e.includes("/")||e.includes("\\")||Om(e))return fa(e);for(let t of(process.env.PATH??"").split(Bo).filter(Boolean)){let r=Bm(t,e),n=process.platform==="win32"?ga(r):fa(r);if(n)return Nm(Mm(n)),n}return null},Dm=(e,t,r)=>typeof process.getuid=="function"&&process.getuid()===0?{command:e,args:t}:q("sudo")?r?.interactiveAuth?{command:"sudo",args:[e,...t]}:q("sudo",["-n","true"])?{command:"sudo",args:["-n",e,...t]}:null:null,Ne=(e,t,r,n)=>{let o=Dm(e,t,n);return o?z(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 mr=900*1e3,ya=15e3,jm=()=>process.env.CLAUDE_HOME?.trim()||ha.join($m.homedir(),".claude"),Fm=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,un=(e,t,r)=>({id:e,label:Fm(e),ok:r.ok,changed:r.changed,detail:r.detail,skipped:r.skipped,installer:t?.installer,commandSummary:t?.commandSummary}),ka=(e,t,r,n,o,s)=>{let i={installer:r,commandSummary:t},a=z("npm",["install","-g",e],{streamOutput:s?.streamOutput,timeout:mr});return!a.ok&&process.platform!=="win32"&&(a=Ne("npm",["install","-g",e],mr,s)),un(n,i,{ok:a.ok,changed:a.ok,detail:G(a,o)})},wa=()=>q("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 ka("@openai/codex","npm install -g @openai/codex","npm","codex-cli","\u5B89\u88C5 Codex CLI \u5931\u8D25",e)}}:null,Sa=()=>process.platform==="darwin"&&q("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=z("brew",["install","--cask","claude-code"],{streamOutput:e?.streamOutput,timeout:mr});return un("claude-cli",t,{ok:r.ok,changed:r.ok,detail:G(r,"\u5B89\u88C5 Claude Code CLI \u5931\u8D25")})}}:process.platform==="win32"&&q("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=z("winget",["install","--id","Anthropic.ClaudeCode","--exact","--source","winget","--accept-package-agreements","--accept-source-agreements"],{streamOutput:e?.streamOutput,timeout:mr});return un("claude-cli",t,{ok:r.ok,changed:r.ok,detail:G(r,"\u5B89\u88C5 Claude Code CLI \u5931\u8D25")})}}:q("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 ka("@anthropic-ai/claude-code","npm install -g @anthropic-ai/claude-code","npm","claude-cli","\u5B89\u88C5 Claude Code CLI \u5931\u8D25",e)}}:process.platform!=="win32"&&q("bash")&&q("curl")?{installer:"install.sh",commandSummary:"curl -fsSL https://claude.ai/install.sh | bash",manualHint:"\u8BF7\u6267\u884C `curl -fsSL https://claude.ai/install.sh | bash`\uFF0C\u7136\u540E\u8FD0\u884C `claude` \u5B8C\u6210\u767B\u5F55\u3002",run(e){let t={installer:"install.sh",commandSummary:"curl -fsSL https://claude.ai/install.sh | bash"},r=z("bash",["-lc","curl -fsSL https://claude.ai/install.sh | bash"],{streamOutput:e?.streamOutput,timeout:mr});return un("claude-cli",t,{ok:r.ok,changed:r.ok,detail:G(r,"\u5B89\u88C5 Claude Code CLI \u5931\u8D25")})}}:null,Gm=()=>{let e=re("codex"),t=e?z(e,["--version"]):null,r=wa();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"}},qm=async()=>{let e=re("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=Lm(e,["app-server"],{env:process.env,stdio:["pipe","pipe","pipe"]}),o="",s="",i=!1,a=0,c=-1,l=-1,d=g=>{i||(i=!0,clearTimeout(p),n.killed||n.kill("SIGTERM"),r(g))},u=g=>{n.stdin.write(`${JSON.stringify(g)}
12
- `)},p=setTimeout(()=>{d({ok:!1,detail:"Codex \u767B\u5F55\u72B6\u6001\u68C0\u67E5\u8D85\u65F6\u3002"})},ya),m=()=>{a+=1,l=a,u({jsonrpc:"2.0",id:a,method:"account/read",params:{refreshToken:!1}})},y=g=>{let w=g.trim();if(w)try{let k=JSON.parse(w);if(k.error?.message){d({ok:!1,detail:k.error.message});return}if(!k.result||typeof k.id>"u")return;if(k.id===c){u({jsonrpc:"2.0",method:"initialized"}),m();return}if(k.id!==l)return;if(k.result.requiresOpenaiAuth&&!k.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",g=>{o+=g.toString();let w=o.split(`
13
- `);o=w.pop()??"";for(let k of w)y(k)}),n.stderr.on("data",g=>{s+=g.toString()}),n.on("error",g=>{d({ok:!1,detail:g instanceof Error?g.message:"Codex \u767B\u5F55\u68C0\u67E5\u5931\u8D25\u3002"})}),n.on("close",()=>{if(i)return;let g=s.trim().split(`
14
- `).filter(Boolean).at(-1)||"Codex \u767B\u5F55\u68C0\u67E5\u5931\u8D25\u3002";d({ok:!1,detail:g})}),a+=1,c=a,u({jsonrpc:"2.0",id:c,method:"initialize",params:{clientInfo:{name:"vibemux-worker",version:"0.1.1"},capabilities:{experimentalApi:!0}}})});return{id:"codex-auth",label:"Codex \u767B\u5F55",ok:t.ok,detail:t.detail,autoInstallable:!1,hint:t.ok?void 0:"\u8BF7\u5148\u8FD0\u884C `codex`\uFF0C\u6309\u63D0\u793A\u5B8C\u6210\u767B\u5F55\u540E\u518D\u91CD\u8BD5\u3002"}},zm=()=>{let e=re("claude"),t=e?z(e,["--version"]):null,r=Sa();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"}},Hm=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}},Vm=()=>{if(process.env.ANTHROPIC_API_KEY?.trim()||process.env.ANTHROPIC_AUTH_TOKEN?.trim()||Um(ha.join(jm(),".credentials.json")))return!0;try{return Hm(C().claudeCodeConfigContent??"")}catch{return!1}},Jm=()=>{let e=re("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(Vm())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=z(e,["doctor"],{timeout:ya});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":G(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"}},xa=async e=>e==="codex-cli"?Gm():e==="codex-auth"?qm():e==="claude-cli"?zm():e==="claude-auth"?Jm():null,Ca=e=>e==="codex-cli"?wa():e==="claude-cli"?Sa():null;var pe=900*1e3,De=ie(),Xm=e=>{let t=process.env.PATH??"";t.split(fr.delimiter).filter(Boolean).includes(e)||(process.env.PATH=t?`${e}${fr.delimiter}${t}`:e)},Uo=()=>{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=fr.join(r,...n);if(pn(o))return Xm(fr.dirname(o)),o}return null},Ea=e=>e==="git"?"Git":e==="opencode"?"OpenCode runtime":e==="pi-runtime"?"Pi runtime":e==="codex-cli"?"Codex CLI":e==="codex-auth"?"Codex \u767B\u5F55":e==="claude-cli"?"Claude Code CLI":"Claude Code \u767B\u5F55",ae=(e,t,r)=>({id:e,label:Ea(e),ok:r.ok,changed:r.changed,detail:r.detail,skipped:r.skipped,installer:t?.installer,commandSummary:t?.commandSummary});var ba=()=>{if(process.platform==="win32")return q("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=z("winget",["install","--id","Git.Git","--exact","--source","winget","--accept-package-agreements","--accept-source-agreements"],{streamOutput:e?.streamOutput,timeout:pe});return r.ok&&Uo(),ae("git",t,{ok:r.ok,changed:r.ok,detail:G(r,"winget install Git.Git \u5931\u8D25")})}}:q("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=z("choco",["install","git","-y"],{streamOutput:e?.streamOutput,timeout:pe});return r.ok&&Uo(),ae("git",t,{ok:r.ok,changed:r.ok,detail:G(r,"choco install git \u5931\u8D25")})}}:null;if(process.platform==="darwin")return q("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=z("brew",["install","git"],{streamOutput:e?.streamOutput,timeout:pe});return ae("git",t,{ok:r.ok,changed:r.ok,detail:G(r,"brew install git \u5931\u8D25")})}}:null;if(process.platform==="linux"){if(q("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=Ne("apt-get",["update"],pe,e);if(!r.ok)return ae("git",t,{ok:!1,changed:!1,detail:G(r,"apt-get update \u5931\u8D25")});let n=Ne("apt-get",["install","-y","git"],pe,e);return ae("git",t,{ok:n.ok,changed:n.ok,detail:G(n,"apt-get install git \u5931\u8D25")})}};if(q("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=Ne("dnf",["install","-y","git"],pe,e);return ae("git",t,{ok:r.ok,changed:r.ok,detail:G(r,"dnf install git \u5931\u8D25")})}};if(q("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=Ne("yum",["install","-y","git"],pe,e);return ae("git",t,{ok:r.ok,changed:r.ok,detail:G(r,"yum install git \u5931\u8D25")})}};if(q("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=Ne("pacman",["-Sy","--noconfirm","git"],pe,e);return ae("git",t,{ok:r.ok,changed:r.ok,detail:G(r,"pacman \u5B89\u88C5 git \u5931\u8D25")})}};if(q("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=Ne("apk",["add","git"],pe,e);return ae("git",t,{ok:r.ok,changed:r.ok,detail:G(r,"apk add git \u5931\u8D25")})}}}return null},Ia=()=>pn(`${De}/package.json`)?pn(`${De}/pnpm-lock.yaml`)&&q("pnpm")?{installer:"pnpm",commandSummary:"pnpm install --frozen-lockfile",manualHint:"\u8BF7\u5728 worker \u6839\u76EE\u5F55\u6267\u884C `pnpm install --frozen-lockfile`\uFF0C\u786E\u4FDD `@opencode-ai/sdk` \u4E0E `opencode-ai` runtime \u90FD\u5DF2\u5B89\u88C5\u3002",run(e){let t={installer:"pnpm",commandSummary:"pnpm install --frozen-lockfile"},r=z("pnpm",["install","--frozen-lockfile"],{cwd:De,streamOutput:e?.streamOutput,timeout:pe});return ae("opencode",t,{ok:r.ok,changed:r.ok,detail:G(r,"pnpm install \u5931\u8D25")})}}:pn(`${De}/package-lock.json`)&&q("npm")?{installer:"npm",commandSummary:"npm ci",manualHint:"\u8BF7\u5728 worker \u6839\u76EE\u5F55\u6267\u884C `npm ci`\uFF0C\u786E\u4FDD `@opencode-ai/sdk` \u4E0E `opencode-ai` runtime \u90FD\u5DF2\u5B89\u88C5\u3002",run(e){let t={installer:"npm",commandSummary:"npm ci"},r=z("npm",["ci"],{cwd:De,streamOutput:e?.streamOutput,timeout:pe});return ae("opencode",t,{ok:r.ok,changed:r.ok,detail:G(r,"npm ci \u5931\u8D25")})}}:q("npm")?{installer:"npm",commandSummary:"npm install",manualHint:"\u8BF7\u5728 worker \u6839\u76EE\u5F55\u6267\u884C `npm install`\uFF0C\u786E\u4FDD `@opencode-ai/sdk` \u4E0E `opencode-ai` runtime \u90FD\u5DF2\u5B89\u88C5\u3002",run(e){let t={installer:"npm",commandSummary:"npm install"},r=z("npm",["install"],{cwd:De,streamOutput:e?.streamOutput,timeout:pe});return ae("opencode",t,{ok:r.ok,changed:r.ok,detail:G(r,"npm install \u5931\u8D25")})}}:null:null,Ym=e=>e==="git"?ba():e==="opencode"?Ia():Ca(e),Qm=()=>{Uo();let e=z("git",["--version"]),t=ba();return{id:"git",label:"Git",ok:e.ok,detail:G(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"}},Zm=()=>{let e=z(process.execPath,["-e",'import("@opencode-ai/sdk").then(() => console.log("ok")).catch((error) => { console.error(error instanceof Error ? error.message : String(error)); process.exit(1) })'],{cwd:De}),t=Ia(),r=re(fr.join(De,"node_modules",".bin","opencode")),n=re("opencode")||r,o=n?z(n,["--version"]):null,s=e.ok?n&&o?.ok?`@opencode-ai/sdk \u5DF2\u5B89\u88C5\uFF1B${o.stdout||n}`:"\u672A\u68C0\u6D4B\u5230\u53EF\u6267\u884C\u7684 OpenCode runtime\uFF08`opencode`\uFF09\u3002":G(e,"OpenCode runtime \u4F9D\u8D56\u4E0D\u53EF\u7528");return{id:"opencode",label:"OpenCode runtime",ok:e.ok&&!!(n&&o?.ok),detail:s,autoInstallable:!!t,installer:t?.installer,installCommand:t?.commandSummary,hint:t?.manualHint||"\u8BF7\u68C0\u67E5 worker \u4F9D\u8D56\u5B89\u88C5\u72B6\u6001\uFF0C\u5E76\u786E\u8BA4 `opencode-ai` \u5DF2\u968F worker \u4F9D\u8D56\u4E00\u8D77\u5B89\u88C5\u3002"}},ef=()=>{let e=z(process.execPath,["-e",'import("@mariozechner/pi-coding-agent").then(() => console.log("ok")).catch((error) => { console.error(error instanceof Error ? error.message : String(error)); process.exit(1) })'],{cwd:De});return{id:"pi-runtime",label:"Pi runtime",ok:e.ok,detail:e.ok?"@mariozechner/pi-coding-agent \u5DF2\u5B89\u88C5":G(e,"Pi SDK \u4E0D\u53EF\u7528"),autoInstallable:!1,hint:"\u8BF7\u68C0\u67E5 worker \u4F9D\u8D56\u5B89\u88C5\u72B6\u6001\uFF0C\u5E76\u786E\u8BA4 `@mariozechner/pi-coding-agent` \u53EF\u88AB\u5F53\u524D Node \u8FD0\u884C\u65F6\u52A0\u8F7D\u3002"}},Ta=async e=>{if(e==="git")return Qm();if(e==="opencode")return Zm();if(e==="pi-runtime")return ef();let t=await xa(e);return t||{id:e,label:Ea(e),ok:!1,detail:"\u672A\u77E5\u68C0\u67E5\u9879\u3002",autoInstallable:!1}},tf=e=>e==="all"?["git","opencode","pi-runtime","codex-cli","codex-auth","claude-cli","claude-auth"]:e==="Pi"?["pi-runtime"]:e==="Codex"?["git","codex-cli","codex-auth"]:e==="ClaudeCode"?["git","claude-cli","claude-auth"]:["git","opencode"],rf=e=>e==="Pi"?"Pi \u8FD0\u884C\u73AF\u5883\u5DF2\u5C31\u7EEA\u3002":e==="Codex"?"Git\u3001Codex CLI \u4E0E\u767B\u5F55\u72B6\u6001\u5DF2\u5C31\u7EEA\u3002":e==="ClaudeCode"?"Git\u3001Claude Code CLI \u4E0E\u767B\u5F55\u72B6\u6001\u5DF2\u5C31\u7EEA\u3002":e==="all"?"Git\u3001OpenCode\u3001Pi\u3001Codex\u3001Claude Code \u8FD0\u884C\u73AF\u5883\u5DF2\u5C31\u7EEA\u3002":"Git \u4E0E OpenCode \u8FD0\u884C\u65F6\u5DF2\u5C31\u7EEA\u3002",$o=(e,t)=>{let r=e.filter(o=>!o.ok),n=r.length===0;return{ok:n,target:t,items:e,missingItems:r,message:n?rf(t):`\u8FD0\u884C\u73AF\u5883\u7F3A\u5931\uFF1A${r.map(o=>o.label).join("\u3001")}`}},nf=e=>{let t=e.filter(o=>!o.ok);if(t.length===0)return"\u81EA\u52A8\u51C6\u5907\u5931\u8D25\u3002";let r=`\u81EA\u52A8\u51C6\u5907\u5931\u8D25\uFF1A${t.map(o=>o.label).join("\u3001")}`,n=t.map(o=>`- ${o.label}: ${o.detail}`).join(`
15
- `);return n?`${r}
16
- ${n}`:r},jo=async(e="base")=>{let t=await Promise.all(tf(e).map(r=>Ta(r)));return $o(t,e)},mn=(e,t=[])=>{let r=t.some(s=>s.changed),n=new Map(t.map(s=>[s.id,s.detail])),o=e.items.map(s=>{let i=n.get(s.id);return i?{...s,detail:`${s.detail}\uFF1B\u81EA\u52A8\u51C6\u5907\uFF1A${i}`}:s});return{ok:e.ok,changed:r,target:e.target,attempts:t,items:o,message:e.ok?r?`\u5DF2\u81EA\u52A8\u8865\u9F50${e.target==="base"?" Worker ":""}\u8FD0\u884C\u73AF\u5883\u3002`:e.message:nf(o)}},No=(e,t,r)=>{console.log(`[${e}/${t}] ${r}`)},Do=(e,t)=>{console.log(` ${e} - ${t}`)},Lo=async(e,t)=>{if(e.ok)return mn(e);let r=[],n=e.missingItems.length*2+1,o=1;for(let i of e.missingItems){let a=Ym(i.id),c=a?`\u5B89\u88C5 ${i.label}\uFF08${a.installer}\uFF09`:`\u5B89\u88C5 ${i.label}`;t?.printProgress&&No(o,n,c);let l=a?a.run(t):ae(i.id,null,{ok:!1,changed:!1,skipped:!0,detail:i.hint||`\u5F53\u524D\u73AF\u5883\u65E0\u6CD5\u81EA\u52A8\u5B89\u88C5 ${i.label}\u3002`});r.push(l),t?.printProgress&&Do(l.ok?"\u6210\u529F":l.skipped?"\u8DF3\u8FC7":"\u5931\u8D25",l.detail),o+=1;let d=await Ta(i.id);t?.printProgress&&(No(o,n,`\u6821\u9A8C ${i.label}`),Do(d.ok?"\u6210\u529F":"\u5931\u8D25",d.detail)),o+=1}let s=await jo(e.target);return t?.printProgress&&(No(o,n,"\u6700\u7EC8\u590D\u68C0"),Do(s.ok?"\u6210\u529F":"\u5931\u8D25",s.message)),mn(s,r)},of=e=>e.missingItems.map(t=>{let r=t.installCommand?`\uFF1B\u81EA\u52A8\u5B89\u88C5\uFF1A${t.installCommand}`:"";return`- ${t.label}: ${t.detail}${r}`}).join(`
17
- `),dn=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"}`)},Ra=()=>!!(va.isTTY&&Pa.isTTY),sf=e=>{let t=e?.trim().toLowerCase();return t?["1","true","yes","on"].includes(t)?!0:["0","false","no","off"].includes(t)?!1:null:null},af=e=>{let t=e?.interactiveTerminal??Ra(),r=sf(e?.autoInstallSetting??process.env.VIBEMUX_WORKER_AUTO_INSTALL);return r===!0?"auto":r===!1?t?"prompt":"block":t?"prompt":"auto"},cf=e=>{let t=e.trim().toLowerCase();return t==="y"||t==="yes"||t==="\u662F"},we=async e=>{let t=await jo(e?.target??"base");return t.ok||!e?.autoInstall?mn(t):Lo(t,e)},_a=async(e,t="base")=>{let r=await jo(t),n=mn(r);if(r.ok)return{status:"ready",report:n,message:n.message};console.log(`[worker] \u547D\u4EE4 ${e} \u8FD0\u884C\u524D\u68C0\u6D4B\u5230\u7F3A\u5931\u4F9D\u8D56\uFF1A`),console.log(of(r));let o=Ra(),s=af({interactiveTerminal:o});if(s==="auto"){console.log("[worker] \u5C06\u5C1D\u8BD5\u81EA\u52A8\u5B89\u88C5\u7F3A\u5931\u4F9D\u8D56\u3002");let c=await Lo(r,{interactiveAuth:o,printProgress:!0,streamOutput:!0});return c.ok?{status:"ready",report:c,message:c.message}:(dn($o(c.items,t)),{status:"failed",report:c,message:c.message})}if(!o||s==="block"){let c="\u5F53\u524D\u7EC8\u7AEF\u4E0D\u53EF\u4EA4\u4E92\uFF0C\u65E0\u6CD5\u786E\u8BA4\u662F\u5426\u81EA\u52A8\u5B89\u88C5\u7F3A\u5931\u4F9D\u8D56\u3002";return console.error(`[worker] ${c}`),dn(r),{status:"non_interactive_blocked",report:n,message:c}}let i=Km({input:va,output:Pa});try{let c=await i.question("\u662F\u5426\u73B0\u5728\u81EA\u52A8\u5B89\u88C5\u7F3A\u5931\u4F9D\u8D56\uFF1F[y/N] ");if(!cf(c)){let l="\u7528\u6237\u62D2\u7EDD\u81EA\u52A8\u5B89\u88C5\uFF0CWorker \u5DF2\u9000\u51FA\u3002";return console.error(`[worker] ${l}`),dn(r),{status:"declined",report:n,message:l}}}finally{i.close()}let a=await Lo(r,{interactiveAuth:!0,printProgress:!0,streamOutput:!0});return a.ok?{status:"ready",report:a,message:a.message}:(dn($o(a.items,t)),{status:"failed",report:a,message:a.message})};var fn={daemonMode:"idle",paired:!1,connected:!1,runningTaskIds:[],queuedTaskIds:[]},gr=()=>({...fn,runningTaskIds:[...fn.runningTaskIds],queuedTaskIds:[...fn.queuedTaskIds]}),Fo=e=>({...e,executorToken:e.executorToken?.trim()?"[redacted]":void 0,opencodeConfigContent:e.opencodeConfigContent?.trim()?"[redacted]":"",codexConfigContent:e.codexConfigContent?.trim()?"[redacted]":"",codexAuthContent:e.codexAuthContent?.trim()?"[redacted]":"",claudeCodeConfigContent:e.claudeCodeConfigContent?.trim()?"[redacted]":"",mcpServers:e.mcpServers?.map(t=>({...t,target:t.target?.trim()?"[redacted]":t.target}))}),Mt=()=>{let e=gr();return{...e,config:e.config?Fo(e.config):void 0}},D=e=>{Object.assign(fn,e)};import{mkdtemp as lf,readFile as uf,rm as df}from"node:fs/promises";import pf from"node:os";import gn from"node:path";var Aa=async e=>st({url:`${Oe(e.cloudUrl)}/api/control-plane/executors/observations`,method:"POST",headers:{Authorization:`Bearer ${e.executorToken}`},body:{taskId:e.taskId,workspaceId:e.workspaceId,workspaceSessionId:e.workspaceSessionId,kind:e.kind,level:e.level,title:e.title,detail:e.detail,url:e.url,attachments:e.attachments,metadata:e.metadata},errorMessage:"Executor observation upload failed."}),Ma=async e=>st({url:`${Oe(e.cloudUrl)}/api/control-plane/executors/images`,method:"POST",headers:{Authorization:`Bearer ${e.executorToken}`},body:{taskId:e.taskId,filename:e.filename,image:e.image},errorMessage:"Executor image upload failed."});var Oa=12,Ba=12,Wa=1500,Na=e=>{let t=e?.trim();if(t)return t.length>Wa?`${t.slice(0,Wa)}\u2026`:t},mf=e=>{if(e!==void 0)try{return Na(JSON.stringify(e,null,2))}catch{return}},ff=(e,t)=>`data:${t};base64,${e.toString("base64")}`,hn=async e=>{let{chromium:t}=await import("playwright"),r=null,n=null,o="",s,i=0,a=0,c="playwright",l=0,d=0,u=async m=>{let y=m.level??"info";(y==="error"||y==="warning")&&(a+=1),i+=1,await Aa({cloudUrl:e.cloudUrl,executorToken:e.executorToken,taskId:e.taskId,workspaceId:e.workspaceId,workspaceSessionId:e.workspaceSessionId,kind:m.kind,level:y,title:m.title,detail:Na(m.detail),url:m.url,attachments:m.attachments,metadata:m.metadata}).catch(()=>{})},p=async(m,y)=>{let g=gn.join(o,`${Date.now()}-${y}.png`);await m.screenshot({path:g,fullPage:!0});let w=await uf(g),k=await Ma({cloudUrl:e.cloudUrl,executorToken:e.executorToken,taskId:e.taskId,filename:gn.basename(g),image:ff(w,"image/png")});s=k.url,await u({kind:"screenshot",level:"info",title:`\u9875\u9762\u622A\u56FE \xB7 ${y}`,detail:`\u5F53\u524D\u9875\u9762: ${m.url()}`,url:k.url,attachments:[{id:k.id,url:k.url,filename:gn.basename(g),contentType:"image/png"}],metadata:{label:y}})};try{o=await lf(gn.join(pf.tmpdir(),"vibemux-browser-run-")),r=await t.launch({headless:!0}),n=await r.newContext({ignoreHTTPSErrors:!0,viewport:{width:1440,height:960}});let m=await n.newPage();if(m.on("console",k=>{let E=k.type();if(E==="error"||E==="warning"){if(l>=Oa)return;l+=1,u({kind:"browser-console",level:E==="error"?"error":"warning",title:`Console ${E}`,detail:[k.text(),mf(k.location())].filter(Boolean).join(`
18
- `),url:m.url()||e.appUrl,metadata:{type:E,location:k.location()}})}}),m.on("pageerror",k=>{l>=Oa||(l+=1,u({kind:"browser-console",level:"error",title:"\u9875\u9762\u811A\u672C\u5F02\u5E38",detail:k.message,url:m.url()||e.appUrl}))}),m.on("requestfailed",k=>{d>=Ba||(d+=1,u({kind:"network",level:"error",title:`\u8BF7\u6C42\u5931\u8D25 \xB7 ${k.method()} ${k.resourceType()}`,detail:[k.url(),k.failure()?.errorText].filter(Boolean).join(`
19
- `),url:k.url(),metadata:{method:k.method(),resourceType:k.resourceType(),failure:k.failure()}}))}),m.on("response",k=>{k.ok()||d>=Ba||(d+=1,u({kind:"network",level:k.status()>=500?"error":"warning",title:`\u54CD\u5E94\u5F02\u5E38 \xB7 ${k.status()} ${k.request().method()}`,detail:[k.url(),k.statusText()].filter(Boolean).join(`
20
- `),url:k.url(),metadata:{method:k.request().method(),status:k.status(),statusText:k.statusText()}}))}),await u({kind:"action",level:"info",title:"\u5F00\u59CB\u6D4F\u89C8\u5668\u5DE1\u68C0",detail:["\u6A21\u5F0F: Playwright",`\u5DE5\u4F5C\u76EE\u5F55: ${e.cwd}`,`\u76EE\u6807\u5730\u5740: ${e.appUrl}`,e.goal?.trim()?`\u6D4B\u8BD5\u76EE\u6807: ${e.goal.trim()}`:""].filter(Boolean).join(`
21
- `),url:e.appUrl}),e.healthUrl?.trim()){let k=await fetch(e.healthUrl,{redirect:"follow"}).catch(E=>({ok:!1,status:0,statusText:E instanceof Error?E.message:"health request failed"}));await u({kind:"network",level:k.ok?"success":"warning",title:k.ok?"\u5065\u5EB7\u68C0\u67E5\u901A\u8FC7":"\u5065\u5EB7\u68C0\u67E5\u5F02\u5E38",detail:`${e.healthUrl}
22
- ${k.status} ${k.statusText}`,url:e.healthUrl,metadata:{status:k.status,statusText:k.statusText}})}let y=await m.goto(e.appUrl,{waitUntil:"domcontentloaded",timeout:3e4});await m.waitForLoadState("networkidle",{timeout:1e4}).catch(()=>{}),await u({kind:"action",level:y?.ok()?"success":"warning",title:y?.ok()?"\u9875\u9762\u5DF2\u6253\u5F00":"\u9875\u9762\u6253\u5F00\u5B8C\u6210\uFF0C\u4F46\u8FD4\u56DE\u72B6\u6001\u5F02\u5E38",detail:[`\u6700\u7EC8\u5730\u5740: ${m.url()}`,y?`HTTP ${y.status()} ${y.statusText()}`:"\u672A\u83B7\u5F97\u9996\u4E2A\u5BFC\u822A\u54CD\u5E94"].join(`
23
- `),url:m.url()}),await p(m,"initial");let g=e.goal?.trim();g&&await u({kind:"action",level:"info",title:"\u5DF2\u8BB0\u5F55\u6D4B\u8BD5\u76EE\u6807",detail:g,url:m.url()});let w=a>0?`\u6D4F\u89C8\u5668\u5DE1\u68C0\u5B8C\u6210\uFF0C\u53D1\u73B0 ${a} \u6761\u5F02\u5E38\u7EBF\u7D22\uFF0C\u5DF2\u56DE\u6D41\u5230\u6D4B\u8BD5\u4F1A\u8BDD\u3002`:"\u6D4F\u89C8\u5668\u5DE1\u68C0\u5B8C\u6210\uFF0C\u672A\u53D1\u73B0\u660E\u663E\u5F02\u5E38\u7EBF\u7D22\u3002";return await u({kind:"action",level:a>0?"warning":"success",title:a>0?"\u6D4F\u89C8\u5668\u5DE1\u68C0\u5B8C\u6210\uFF0C\u53D1\u73B0\u5F02\u5E38\u7EBF\u7D22":"\u6D4F\u89C8\u5668\u5DE1\u68C0\u5B8C\u6210",detail:[w,`\u4F7F\u7528\u6A21\u5F0F: ${c}`,`\u6700\u7EC8\u9875\u9762: ${m.url()}`,`\u89C2\u6D4B\u6570\u91CF: ${i}`].join(`
24
- `),url:m.url(),metadata:{usedMode:c,observationsCount:i,issueCount:a,consoleCount:l,networkCount:d}}),{ok:!0,message:w,summary:w,usedMode:c,finalUrl:m.url(),screenshotUrl:s,observationsCount:i,issueCount:a,at:new Date().toISOString()}}catch(m){let y=m instanceof Error?m.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:y,url:e.appUrl}),{ok:!1,message:y,summary:y,usedMode:c,finalUrl:e.appUrl,screenshotUrl:s,observationsCount:i,issueCount:a,at:new Date().toISOString()}}finally{await n?.close().catch(()=>{}),await r?.close().catch(()=>{}),o&&await df(o,{recursive:!0,force:!0}).catch(()=>{})}};var kn=e=>{let t=process.argv.slice(3),r=t.findIndex(n=>n===e);if(!(r<0))return t[r+1]?.trim()||void 0},yn=e=>{let t=kn(e);if(!t)throw new Error(`\u7F3A\u5C11\u5FC5\u586B\u53C2\u6570 ${e}\u3002`);return t},Da=async()=>{let e=C(),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 hn({cloudUrl:e.cloudUrl,executorToken:t,taskId:yn("--task-id"),workspaceId:yn("--workspace-id"),workspaceSessionId:yn("--workspace-session-id"),cwd:kn("--cwd")?.trim()||process.cwd(),appUrl:yn("--app-url"),healthUrl:kn("--health-url")?.trim()||void 0,goal:kn("--goal")?.trim()||void 0,mode:"playwright"});console.log(JSON.stringify(r,null,2)),r.ok||(process.exitCode=1)};import{spawn as xv}from"node:child_process";var Go=async e=>st({url:`${Oe(e.cloudUrl)}/api/control-plane/executors/artifacts/patch`,method:"POST",headers:{Authorization:`Bearer ${e.executorToken}`},body:{taskId:e.taskId,filename:e.filename,content:e.content},errorMessage:"Patch artifact upload failed."});var gf=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():"",Ua=async e=>{let t=await gf(e);return JSON.parse(t)};var hf=e=>e.readyState===WebSocket.OPEN,qo=(e,t)=>{if(!e.executorToken)throw new Error("Worker is not paired yet.");let r=`${Hi(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 Ua(o.data);try{t.onMessage?.(s)}catch(i){t.onError?.(`Failed to process a control-plane message.${i instanceof Error?` ${i.message}`:""}`)}}catch(s){t.onError?.(`The control plane returned a message that could not be parsed.${s instanceof Error?` ${s.message}`:""}`)}}),n.addEventListener("error",()=>{t.onError?.(`Failed to connect to the control-plane WebSocket: ${r}`)}),n.addEventListener("close",o=>{t.onClose?.(o)}),{socket:n,send(o){if(!hf(n))return!1;try{return n.send(JSON.stringify(o)),!0}catch(s){return t.onError?.(`Failed to send a control-plane WebSocket message.${s instanceof Error?` ${s.message}`:""}`),!1}}}};var $a="127.0.0.1",yf=e=>e==="0.0.0.0"||e==="::"?$a:e,kf=e=>e.includes(":")&&!e.startsWith("[")?`[${e}]`:e,zo=()=>process.env.VIBEMUX_WORKER_HOST?.trim()||$a,hr=e=>{let t=yf(zo());return`http://${kf(t)}:${e}`};import{mkdirSync as wf}from"node:fs";import yr from"node:path";var wn=e=>{let t={root:e,reposDir:yr.join(e,"repos"),worktreesDir:yr.join(e,"worktrees"),artifactsDir:yr.join(e,"artifacts"),cacheDir:yr.join(e,"cache")};for(let r of Object.values(t))wf(r,{recursive:!0});return t},La=(e,t,r)=>yr.join(e,"worktrees",r?.trim()||t);import{existsSync as Sg,readFileSync as xg}from"node:fs";import Cg from"node:http";import is from"node:path";import{closeSync as xf,existsSync as xn,openSync as Cf,readFileSync as kr,readSync as vf,readdirSync as Pf,statSync as Ef}from"node:fs";import bf from"node:os";import U from"node:path";var Sf=["# AGENTS.md instructions","<environment_context>","<INSTRUCTIONS>","<local-command-caveat>","<local-command-stdout>"],Se=e=>{let t=e.trim();return t?Sf.some(r=>t.includes(r)):!1};var pt=bf.homedir(),If=48*1024,Tf=2e4,ja=U.join(pt,".claude","projects"),Sn=U.join(pt,".local","share","opencode","storage","message"),Rf=U.join(pt,".local","share","opencode","storage","part"),Fa=U.join(pt,".codex","sessions"),_f=U.join(pt,".pi","agent"),Af=()=>({claude:0,opencode:0,codex:0,pi:0}),L=e=>!!e&&typeof e=="object"&&!Array.isArray(e),Cn=e=>{try{return Pf(e,{withFileTypes:!0})}catch{return[]}},Ot=e=>{try{return Ef(e)}catch{return null}},Ga=(e,t=If)=>{let r=Cf(e,"r"),n=Buffer.alloc(t);try{let o=vf(r,n,0,t,0);return n.subarray(0,o).toString("utf8")}finally{xf(r)}},Jo=e=>{try{return JSON.parse(kr(e,"utf8"))}catch{return null}},qa=e=>{let t=e.trim();return t?t==="~"?pt:t.startsWith("~/")?U.join(pt,t.slice(2)):t:""},Mf=()=>{let e=C().piAgentDir?.trim();return U.resolve(qa(e||process.env.PI_AGENT_DIR?.trim()||_f))},za=()=>{let e=Mf(),t=Jo(U.join(e,"settings.json")),r=typeof t?.sessionDir=="string"?qa(t.sessionDir):"",n=r?U.isAbsolute(r)?U.resolve(r):U.resolve(e,r):U.join(e,"sessions");return Array.from(new Set([n,U.join(e,"sessions"),U.join(e,"sessions-vibemux")]))},Bt=e=>e.split(`
25
- `).map(t=>t.trim()).filter(Boolean).flatMap(t=>{try{return[JSON.parse(t)]}catch{return[]}}),Wt=(e,t)=>{if(!xn(e))return[];let r=[],n=[e];for(;n.length>0;){let o=n.pop();if(o)for(let s of Cn(o)){let i=U.join(o,s.name);if(s.isDirectory()){n.push(i);continue}s.isFile()&&i.endsWith(t)&&r.push(i)}}return r},X=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()}},Ko=(e,t=240)=>{let r=e.replace(/\s+/g," ").trim();return r?r.length<=t?r:`${r.slice(0,t-1)}\u2026`:""},Z=(e,t=Tf)=>{let r=e.trim();return r?r.length<=t?r:`${r.slice(0,t)}
26
-
27
- \u2026\uFF08\u5185\u5BB9\u8FC7\u957F\uFF0C\u5DF2\u6309\u5B89\u5168\u4E0A\u9650\u622A\u65AD\uFF09`:""},Xo=e=>typeof e=="string"?e.trim():Array.isArray(e)?e.flatMap(t=>typeof t=="string"?[t]:L(t)?typeof t.text=="string"?[t.text]:typeof t.content=="string"?[t.content]:[]:[]).join(`
28
-
29
- `).trim():"",Nt=e=>({...e,title:Ko(e.title||"\u672A\u547D\u540D\u4F1A\u8BDD",96),cwd:e.cwd||"\u2014"}),Of=()=>Wt(ja,".jsonl").flatMap(e=>{let t=Ot(e);if(!t)return[];let r=Bt(Ga(e)),n=U.basename(e,".jsonl"),o=r.map(a=>X(a.timestamp)).find(Boolean),s=r.map(a=>typeof a.cwd=="string"?a.cwd:"").find(Boolean)||"",i=r.flatMap(a=>{let c=L(a.message)?a.message:null;if(!c||c.role!=="user")return[];let l=Xo(c.content);return!l||Se(l)?[]:[l]}).find(Boolean)||"Claude Code \u4F1A\u8BDD";return[Nt({id:n,source:"claude",title:i,cwd:s,startedAt:o,lastUpdatedAt:t.mtime.toISOString(),entryCount:0})]}),Bf=e=>{let t=L(e.message)?e.message:null;if(!t||e.isMeta===!0)return[];let r=X(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=Xo(o);return!s||Se(s)?[]:[{id:`${String(e.uuid||e.sessionId||r||Math.random())}`,role:n==="user"?"user":"system",text:Z(s),timestamp:r}]}return n!=="assistant"||!Array.isArray(o)?[]:o.flatMap((s,i)=>L(s)?typeof s.text=="string"&&s.type==="text"?[{id:`${String(e.uuid||e.sessionId||r||i)}-${i}`,role:"assistant",text:Z(s.text),timestamp:r}]:s.type==="tool_use"&&typeof s.name=="string"?[{id:`${String(e.uuid||e.sessionId||r||i)}-${i}`,role:"tool",text:Z(`\u8C03\u7528\u5DE5\u5177\uFF1A${s.name}`),timestamp:r}]:[]:[])},Wf=e=>{let r=Wt(ja,".jsonl").filter(l=>U.basename(l,".jsonl")===e)[0];if(!r)return null;let n=Bt(kr(r,"utf8")),o=Ot(r),s=n.map(l=>typeof l.cwd=="string"?l.cwd:"").find(Boolean)||"",i=n.flatMap(l=>{let d=L(l.message)?l.message:null;if(!d||d.role!=="user")return[];let u=Xo(d.content);return!u||Se(u)?[]:[u]}).find(Boolean)||"Claude Code \u4F1A\u8BDD",a=n.map(l=>X(l.timestamp)).find(Boolean),c=n.flatMap(Bf);return{...Nt({id:e,source:"claude",title:i,cwd:s,startedAt:a,lastUpdatedAt:o?.mtime.toISOString()||new Date().toISOString(),entryCount:c.length}),entries:c}},Nf=()=>Wt(Fa,".jsonl").flatMap(e=>{let t=Ot(e);if(!t)return[];let r=Bt(Ga(e)),n=r.find(c=>c.type==="session_meta"),o=L(n?.payload)?n.payload:null,s=typeof o?.cwd=="string"?o.cwd:"",i=X(o?.timestamp)||r.map(c=>X(c.timestamp)).find(Boolean),a=r.flatMap(c=>Ha(c,!0)).map(c=>c.text).find(c=>!Se(c))||"Codex \u4F1A\u8BDD";return[Nt({id:U.basename(e,".jsonl"),source:"codex",title:a,cwd:s,startedAt:i,lastUpdatedAt:t.mtime.toISOString(),entryCount:0})]}),Ha=(e,t=!1)=>{if(e.type!=="response_item")return[];let r=L(e.payload)?e.payload:null;if(!r)return[];let n=X(e.timestamp);if(r.type==="message"){let i=r.role;if(i!=="user"&&i!=="assistant")return[];let a=Array.isArray(r.content)?r.content.flatMap(c=>L(c)?typeof c.text=="string"&&(c.type==="input_text"||c.type==="text"||c.type==="output_text"||c.type==="summary_text")?[c.text]:!t&&c.type==="tool_use"&&typeof c.name=="string"?[`\u8C03\u7528\u5DE5\u5177\uFF1A${c.name}`]:[]:[]).join(`
30
-
31
- `).trim():"";return a?i==="user"&&Se(a)?[]:t&&i!=="user"?[]:[{id:`${String(e.timestamp||Math.random())}-${i}`,role:i,text:Z(a),timestamp:n}]:[]}if(t||r.type!=="function_call")return[];let o=typeof r.name=="string"?r.name:"tool",s=Ko(typeof r.arguments=="string"?r.arguments:"");return[{id:`${String(e.timestamp||Math.random())}-tool`,role:"tool",text:Z(s?`\u8C03\u7528 ${o}
32
- ${s}`:`\u8C03\u7528 ${o}`),timestamp:n}]},Df=e=>{let r=Wt(Fa,".jsonl").filter(u=>U.basename(u,".jsonl")===e)[0];if(!r)return null;let n=Bt(kr(r,"utf8")),o=Ot(r),s=n.find(u=>u.type==="session_meta"),i=L(s?.payload)?s.payload:null,a=typeof i?.cwd=="string"?i.cwd:"",c=X(i?.timestamp)||n.map(u=>X(u.timestamp)).find(Boolean),l=n.flatMap(u=>Ha(u)),d=l.find(u=>u.role==="user"&&!Se(u.text))?.text||"Codex \u4F1A\u8BDD";return{...Nt({id:e,source:"codex",title:d,cwd:a,startedAt:c,lastUpdatedAt:o?.mtime.toISOString()||new Date().toISOString(),entryCount:l.length}),entries:l}},Va=e=>{let t=U.join(Rf,e);return Cn(t).filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>Jo(U.join(t,r.name))).filter(r=>!!r).sort((r,n)=>{let o=L(r.time)&&typeof r.time.start=="number"?r.time.start:0,s=L(n.time)&&typeof n.time.start=="number"?n.time.start:0;return o-s})},Vo=e=>{let t=Va(String(e.id)).flatMap(n=>n.type==="text"&&typeof n.text=="string"?[n.text.trim()]:[]).filter(Boolean).join(`
33
-
34
- `);if(t)return t;let r=L(e.summary)?e.summary:null;return typeof r?.title=="string"?r.title.replace(/^Title:\s*/i,"").trim():""},Uf=e=>{try{return JSON.stringify(e??{},null,2)}catch{return""}},$f=e=>{let t=e.trim();return!!(t&&t!=="{}"&&t!=="[]")},Lf=e=>{let t=L(e.time)?e.time:null;return X(t?.created)||X(t?.completed)},jf=(e,t)=>{let r=L(e.time)?e.time:null;return X(r?.start)||X(r?.end)||t},Ff=e=>{let t=typeof e.tool=="string"&&e.tool.trim()?e.tool.trim():"tool",r=L(e.state)?e.state:null,n=typeof r?.raw=="string"?r.raw.trim():"",o=Uf(r?.input),s=n||($f(o)?o:""),i=typeof r?.output=="string"?r.output.trim():"",a=typeof r?.error=="string"?r.error.trim():"",c=typeof r?.status=="string"?r.status:"";return[c==="error"?`\u5DE5\u5177\u62A5\u9519\uFF1A${t}`:c==="completed"?`\u5DE5\u5177\u7ED3\u679C\uFF1A${t}`:`\u8C03\u7528\u5DE5\u5177\uFF1A${t}`,s,c==="error"?a:i].filter(Boolean).join(`
35
- `)},Gf=e=>{let t=e.role,r=typeof e.id=="string"||typeof e.id=="number"?String(e.id):`opencode-${Math.random()}`,n=Lf(e);if(t==="user"){let i=Vo(e);return!i||Se(i)?[]:[{id:r,role:"user",text:Z(i),timestamp:n}]}if(t!=="assistant")return[];let o=Va(r).flatMap((i,a)=>{let c=typeof i.id=="string"||typeof i.id=="number"?String(i.id):`${r}-part-${a}`,l=jf(i,n);if(i.type==="text"&&typeof i.text=="string"){let d=Z(i.text);return d?[{id:c,role:"assistant",text:d,timestamp:l}]:[]}if(i.type==="reasoning"&&typeof i.text=="string"){let d=Z(i.text);return d?[{id:c,role:"system",text:d,timestamp:l}]:[]}if(i.type==="tool"){let d=Z(Ff(i));return d?[{id:c,role:"tool",text:d,timestamp:l}]:[]}return[]});if(o.length>0)return o;let s=Vo(e);return s?[{id:r,role:"assistant",text:Z(s),timestamp:n}]:[]},Ho=e=>typeof e=="string"?e.trim():Array.isArray(e)?e.flatMap(t=>L(t)?t.type==="text"&&typeof t.text=="string"?[t.text]:typeof t.text=="string"?[t.text]:[]:[]).join(`
36
-
37
- `).trim():"",Ja=e=>{if(e.type!=="message")return[];let t=L(e.message)?e.message:null;if(!t)return[];let r=typeof t.role=="string"?t.role:"system",n=X(e.timestamp)||X(t.timestamp),o=typeof e.id=="string"?e.id:String(e.timestamp||Math.random());if(r==="user"){let s=Ho(t.content);return!s||Se(s)?[]:[{id:o,role:"user",text:Z(s),timestamp:n}]}if(r==="assistant"){let s=Array.isArray(t.content)?t.content:[],i=s.flatMap(c=>L(c)?c.type==="text"&&typeof c.text=="string"?[c.text]:[]:[]).join(`
38
-
39
- `).trim(),a=s.flatMap((c,l)=>{if(!L(c)||c.type!=="toolCall"||typeof c.name!="string")return[];let d=Ko(JSON.stringify(c.arguments??{},null,2),600);return[{id:`${o}-tool-${l}`,role:"tool",text:Z(d&&d!=="{}"?`\u8C03\u7528\u5DE5\u5177\uFF1A${c.name}
40
- ${d}`:`\u8C03\u7528\u5DE5\u5177\uFF1A${c.name}`),timestamp:n}]});return[...i?[{id:`${o}-assistant`,role:"assistant",text:Z(i),timestamp:n}]:[],...a]}if(r==="toolResult"){let s=typeof t.toolName=="string"?t.toolName:"tool",i=Ho(t.content),a=t.isError===!0?`\u5DE5\u5177\u62A5\u9519\uFF1A${s}`:`\u5DE5\u5177\u7ED3\u679C\uFF1A${s}`;return[{id:`${o}-tool-result`,role:"tool",text:Z(i?`${a}
41
- ${i}`:a),timestamp:n}]}if(r==="bashExecution"){let s=typeof t.command=="string"?t.command.trim():"",i=typeof t.output=="string"?t.output.trim():"",a=s?`\u6267\u884C\u547D\u4EE4\uFF1A${s}`:"\u6267\u884C\u547D\u4EE4";return[{id:`${o}-bash`,role:"tool",text:Z(i?`${a}
42
- ${i}`:a),timestamp:n}]}if(r==="branchSummary"||r==="compactionSummary"){let s=typeof t.summary=="string"?t.summary.trim():"";return s?[{id:`${o}-summary`,role:"system",text:Z(s),timestamp:n}]:[]}if(r==="custom"){let s=Ho(t.content);return s?[{id:`${o}-custom`,role:"system",text:Z(s),timestamp:n}]:[]}return[]},Ka=e=>{let t=Ot(e);if(!t)return null;let r=Bt(kr(e,"utf8")),n=r.find(c=>c.type==="session"),o=typeof n?.cwd=="string"?n.cwd:"",s=X(n?.timestamp)||r.map(c=>X(c.timestamp)).find(Boolean),i=r.flatMap(Ja),a=i.find(c=>c.role==="user"&&!Se(c.text))?.text||"Pi \u4F1A\u8BDD";return Nt({id:U.basename(e,".jsonl"),source:"pi",title:a,cwd:o,startedAt:s,lastUpdatedAt:t.mtime.toISOString(),entryCount:i.length})},Xa=e=>{let t=U.join(Sn,e);return Cn(t).filter(r=>r.isFile()&&r.name.endsWith(".json")).map(r=>Jo(U.join(t,r.name))).filter(r=>!!r).sort((r,n)=>{let o=L(r.time)&&typeof r.time.created=="number"?r.time.created:0,s=L(n.time)&&typeof n.time.created=="number"?n.time.created:0;return o-s})},Ya=e=>{let t=U.join(Sn,e),r=Ot(t),n=Xa(e);if(n.length===0)return null;let o=n.flatMap(c=>{let l=L(c.path)?c.path:null;return typeof l?.cwd=="string"?[l.cwd]:[]}).find(Boolean)||"",s=n.map(c=>X(L(c.time)?c.time.created:void 0)).find(Boolean),i=n.map(c=>{let l=L(c.time)?c.time:null;return X(l?.completed)||X(l?.created)}).filter(Boolean).pop()||r?.mtime.toISOString()||new Date().toISOString(),a=n.filter(c=>c.role==="user").map(Vo).find(c=>!!c&&!Se(c))||"OpenCode \u4F1A\u8BDD";return Nt({id:e,source:"opencode",title:a,cwd:o,startedAt:s,lastUpdatedAt:i,entryCount:n.length})},qf=()=>xn(Sn)?Cn(Sn).filter(e=>e.isDirectory()).flatMap(e=>{let t=Ya(e.name);return t?[t]:[]}):[],zf=()=>{let e=new Set;return za().flatMap(r=>xn(r)?Wt(r,".jsonl"):[]).filter(r=>e.has(r)?!1:(e.add(r),!0)).flatMap(r=>{let n=Ka(r);return n?[n]:[]})},Hf=e=>{let t=Ya(e);if(!t)return null;let r=Xa(e).flatMap(Gf);return{...t,entryCount:r.length,entries:r}},Vf=e=>{let r=za().flatMap(i=>xn(i)?Wt(i,".jsonl"):[]).filter(i=>U.basename(i,".jsonl")===e)[0];if(!r)return null;let n=Ka(r);if(!n)return null;let s=Bt(kr(r,"utf8")).flatMap(Ja);return{...n,entryCount:s.length,entries:s}},vn=()=>{let e=[...Of(),...qf(),...Nf(),...zf()].sort((r,n)=>n.lastUpdatedAt.localeCompare(r.lastUpdatedAt)),t=e.reduce((r,n)=>(r[n.source]+=1,r),Af());return{ok:!0,sessions:e,counts:t}},Pn=(e,t)=>e==="claude"?Wf(t):e==="opencode"?Hf(t):e==="pi"?Vf(t):Df(t);import{existsSync as rc,mkdirSync as nc,readdirSync as ig,renameSync as es,rmSync as ts,writeFileSync as ag}from"node:fs";import cg from"node:os";import mt from"node:path";import{spawn as os,spawnSync as lg}from"node:child_process";import{chmodSync as Qa,mkdirSync as Jf,rmSync as Kf,writeFileSync as Za}from"node:fs";import Xf from"node:os";import Qo from"node:path";var Yo=e=>e.replace(/\\/g,"\\\\").replace(/`/g,"\\`").replace(/\$/g,"\\$"),Yf=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}},Qf=e=>{let t=Yf(e);if(!t)return null;try{return new URL(`ssh://${t}`).hostname.toLowerCase()}catch{return t.toLowerCase().replace(/:\d+$/,"")}},ec=e=>{let t=Qf(e);return t?t==="github.com"||t.endsWith(".github.com")?"github":t==="gitlab.com"||t.endsWith(".gitlab.com")||t.includes("gitlab")?"gitlab":"generic":null},Zf=(e,t)=>{let r=t.provider??ec(e);return r==="github"?"x-access-token":r==="gitlab"?"oauth2":t.email?.trim()||t.name?.trim()||"git"},eg=e=>{let t=ec(e);return t==="github"?"GitHub":t==="gitlab"?"GitLab":"Git"},tg=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},Y=(e,t)=>{let r=e instanceof Error?e.message:typeof e=="string"?e:"";if(!tg(r))return e instanceof Error?e:new Error(r||"Git \u64CD\u4F5C\u5931\u8D25\u3002");let n=eg(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`)},rg=(e,t,r)=>{let n=Zf(r,t),o=t.credentialToken||"",s=Qo.join(e,"git-askpass.js"),i=`#!/usr/bin/env node
1
+ import ed from"dotenv";var ve=e=>e.replace(/\/+$/,""),bi=e=>{let t=ve(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`},Ri=e=>{let t=ve(e);return t.startsWith("https://")?`${t.replace("https://","wss://")}/api/preview-tunnels/ws`:t.startsWith("http://")?`${t.replace("http://","ws://")}/api/preview-tunnels/ws`:`${t}/api/preview-tunnels/ws`};var Ge=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 n=await t.json().catch(()=>({message:e.errorMessage}));throw new Error(n.message||e.errorMessage)}return await t.json()};var Wt=async(e,t)=>Ge({url:`${ve(t)}/api/control-plane/executors/pair`,method:"POST",body:e,errorMessage:"Pair request failed."});var ot=e=>e?.trim().toUpperCase()||"",it=e=>!!(e.executorId?.trim()&&e.executorToken?.trim()),gn=(e,t)=>{let n=ot(e);return!n||!it(t)?!1:n===ot(t.lastPairedPairingCode)},fn=()=>"This pairing code already completed on this worker. Reusing the saved executor token instead of pairing again.";var rd=new Map([["\u914D\u5BF9\u7801\u5DF2\u4F7F\u7528\u3002","This pairing code has already been used."],["\u914D\u5BF9\u7801\u5DF2\u8FC7\u671F\u3002","This pairing code has expired."],["\u914D\u5BF9\u7801\u4E0D\u5B58\u5728\u3002","This pairing code does not exist."]]),od=new Set(["This pairing code has already been used.","This pairing code has expired.","This pairing code does not exist."]),Ti=e=>{let t=e.trim();return rd.get(t)||t},id=e=>od.has(Ti(e)),Ai=()=>"This worker is already paired locally. If you only want to reconnect after a restart, start the worker again without `connect --pairing-code ...`.",hn=(e,t)=>{let n=Ti(e);return!t||!id(n)?n:`${n} ${Ai()}`},Mi=e=>e?`${Ai()} Use \`connect --pairing-code <CODE>\` only when you want to pair this machine for the first time or move it to a different account.`:"Missing required flag: --pairing-code";import{existsSync as Ir,readFileSync as br}from"node:fs";import de from"node:path";import{fileURLToPath as Oi}from"node:url";var Pr=null,vr=null,Er=null,sd=(e,t)=>{let n=de.relative(t,e);return n===""||!n.startsWith("..")&&!de.isAbsolute(n)},ad=e=>{try{let t=JSON.parse(br(e,"utf8"));return!!(t.name&&t.version)}catch{return!1}},cd=()=>{let e=process.env.VIBEMUX_RUNTIME_ROOT?.trim();if(e){let n=de.resolve(e),r=Oi(import.meta.url);if(sd(r,n))return n}let t=de.dirname(Oi(import.meta.url));for(;;){let n=de.join(t,"package.json");if(Ir(n)&&ad(n))return t;let r=de.dirname(t);if(r===t)return process.cwd();t=r}},ne=()=>(Pr||(Pr=cd()),Pr),qe=()=>{if(!vr){let e=de.join(ne(),"package.json");vr=Ir(e)?JSON.parse(br(e,"utf8")):{}}return vr},st=()=>{if(!Er){let e=de.join(ne(),"runtime","worker-release.json");Er=Ir(e)?JSON.parse(br(e,"utf8")):{}}return Er},ie=()=>qe().version?.trim()||process.env.npm_package_version?.trim()||"0.0.0",Bt=()=>de.join(ne(),"dist-worker","apps","worker","src","index.js"),_i=()=>de.join(ne(),"dist-worker","apps","worker","web"),yn=()=>{let e=process.platform==="win32"?"vibemux-worker.cmd":"vibemux-worker";return de.join(ne(),"bin",e)};import{cpSync as Ui,existsSync as Be,mkdirSync as Or,readFileSync as Cn,rmSync as _d,writeFileSync as _r}from"node:fs";import{randomUUID as Wd}from"node:crypto";import Ie from"node:os";import T from"node:path";var kn=["Pi","OpenCode","Codex","ClaudeCode"];var ld=[...kn],dd=new Set(kn),qw=new Set(ld),ud={OpenCode:{id:"OpenCode",label:"OpenCode",transport:"SDK",modelIdStrategy:"canonical",workerOnly:!0,agentType:"OpenCode"},Codex:{id:"Codex",label:"Codex",transport:"STDIO",modelIdStrategy:"native",workerOnly:!0,agentType:"Codex"},ClaudeCode:{id:"ClaudeCode",label:"Claude Code",transport:"STDIO",modelIdStrategy:"native",workerOnly:!0,agentType:"ClaudeCode"},Pi:{id:"Pi",label:"Pi",transport:"SDK",modelIdStrategy:"canonical",workerOnly:!0,agentType:"Pi"}},Wi=e=>typeof e=="string"&&dd.has(e);var Bi=e=>ud[e],at=e=>e;var Rr=(e,t)=>{let n=e.trim(),r=t.trim();return n&&r?`${n}/${r}`:""},ct=(e,t,n)=>Bi(e).modelIdStrategy==="canonical"?n?.trim()||"":pd(t,n),ze=e=>{let t=e?.trim()||"";if(!t)return null;let[n,...r]=t.split("/"),o=r.join("/");return!n||!o?null:{providerId:n,modelId:o}},Di=e=>e?.trim().toLowerCase()||"",pd=(e,t)=>{let n=t?.trim()||"";if(!n)return"";let r=ze(n);return r&&Di(r.providerId)===Di(e)?r.modelId:n};var md=e=>{let t="",n=!1,r='"',o=!1;for(let i=0;i<e.length;i+=1){let s=e[i],a=e[i+1];if(n){if(t+=s,o){o=!1;continue}if(s==="\\"){o=!0;continue}s===r&&(n=!1);continue}if(s==='"'||s==="'"){n=!0,r=s,t+=s;continue}if(s==="/"&&a==="/"){for(i+=2;i<e.length&&e[i]!==`
2
+ `;)i+=1;i<e.length&&(t+=e[i]);continue}if(s==="/"&&a==="*"){for(i+=2;i<e.length-1&&!(e[i]==="*"&&e[i+1]==="/");)i+=1;i+=1;continue}t+=s}return t},gd=e=>{let t="",n=!1,r='"',o=!1;for(let i=0;i<e.length;i+=1){let s=e[i];if(n){if(t+=s,o){o=!1;continue}if(s==="\\"){o=!0;continue}s===r&&(n=!1);continue}if(s==='"'||s==="'"){n=!0,r=s,t+=s;continue}if(s===","){let a=i+1;for(;a<e.length&&/\s/.test(e[a]);)a+=1;if(e[a]==="}"||e[a]==="]")continue}t+=s}return t},fd=e=>gd(md(e)),se=e=>{let t=e?.trim();if(!t)return{};try{let n=JSON.parse(fd(t));return n&&typeof n=="object"?n:{}}catch(n){throw new Error(n instanceof Error?`OpenCode \u914D\u7F6E JSON/JSONC \u65E0\u6548\uFF1A${n.message}`:"OpenCode \u914D\u7F6E JSON/JSONC \u65E0\u6548")}};var He="built-in://vibemux",Tr=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),hd=(e,t,n)=>{let r=t.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/(^-|-$)/g,"")||`${e}-${n+1}`;return`${e}-${n+1}-${r}`};var yd=e=>e.replace(/\/+$/,""),kd=e=>e.startsWith("sse://")?`http://${e.slice(6)}`:e,wd=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:`${yd(e.cloudUrl)}/mcp/executor`,enabled:!0,headers:t}},Sd=e=>{let t=e.replace(/^stdio:\/\//,"").trim();return t?{command:t}:null},xd=e=>{let t=kd(e).trim();return t?{type:"remote",url:t,enabled:!0}:null},Je=(e,t)=>e.filter(n=>n.enabled).reduce((n,r,o)=>{let i=r.id?.trim()||hd("mcp",r.name,o),s=r.target===He?wd(t):r.transport==="stdio"||r.target.startsWith("stdio://")?Sd(r.target):xd(r.target);return s&&(n[i]=s),n},{}),wn=(e,t,n)=>{let r=se(e),o=Tr(r)?{...r}:{},i=Tr(o.mcp)?{...o.mcp}:Tr(o.mcpServers)?{...o.mcpServers}:{},s=Je(t,n),{mcpServers:a,...c}=o,l={...c,mcp:{...i,...s}};return JSON.stringify(l,null,2)};var lt=e=>`'${e.replace(/'/g,"'\\''")}'`,Ve=(e,t=[])=>n=>`command -v ${e} >/dev/null 2>&1 && ${e}${t.length>0?` ${t.join(" ")}`:""} ${lt(n)}`,ue=(e,t=[])=>n=>`[ -x "${e}" ] && "${e}"${t.length>0?` ${t.join(" ")}`:""} ${lt(n)}`,Ee=e=>t=>`command -v open >/dev/null 2>&1 && open -Ra "${e}" && open -a "${e}" ${lt(t)}`,Dt=e=>t=>e?`command -v open >/dev/null 2>&1 && open -Ra "${e}" && open -a "${e}" ${lt(t)}`:`command -v open >/dev/null 2>&1 && open ${lt(t)}`,Cd=e=>`command -v ghostty >/dev/null 2>&1 && ghostty --working-directory=${lt(e)}`;var Qw={vscode:{label:"VS Code",description:"Visual Studio Code",commandBuilders:[Ve("code",["--reuse-window"]),...["/opt/homebrew/bin/code","/usr/local/bin/code","/usr/bin/code","/snap/bin/code","/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code","$HOME/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code"].map(e=>ue(e,["--reuse-window"])),Ee("Visual Studio Code")]},"vscode-insiders":{label:"VS Code Insiders",description:"Visual Studio Code - Insiders",commandBuilders:[Ve("code-insiders",["--reuse-window"]),...["/opt/homebrew/bin/code-insiders","/usr/local/bin/code-insiders","/usr/bin/code-insiders","/snap/bin/code-insiders","/Applications/Visual Studio Code - Insiders.app/Contents/Resources/app/bin/code-insiders","$HOME/Applications/Visual Studio Code - Insiders.app/Contents/Resources/app/bin/code-insiders"].map(e=>ue(e,["--reuse-window"])),Ee("Visual Studio Code - Insiders")]},cursor:{label:"Cursor",description:"Cursor editor",commandBuilders:[Ve("cursor"),ue("/Applications/Cursor.app/Contents/Resources/app/bin/cursor"),ue("$HOME/Applications/Cursor.app/Contents/Resources/app/bin/cursor"),Ee("Cursor")]},windsurf:{label:"Windsurf",description:"Windsurf editor",commandBuilders:[Ve("windsurf"),ue("/Applications/Windsurf.app/Contents/Resources/app/bin/windsurf"),ue("$HOME/Applications/Windsurf.app/Contents/Resources/app/bin/windsurf"),Ee("Windsurf")]},zed:{label:"Zed",description:"Zed editor",commandBuilders:[Ve("zed"),ue("/Applications/Zed.app/Contents/MacOS/zed"),ue("$HOME/Applications/Zed.app/Contents/MacOS/zed"),Ee("Zed")]},intellij:{label:"IntelliJ IDEA",description:"JetBrains IntelliJ IDEA",commandBuilders:[Ve("idea"),Ee("IntelliJ IDEA"),Ee("IntelliJ IDEA CE")]},xcode:{label:"Xcode",description:"Xcode project editor",commandBuilders:[Ve("xed"),ue("/usr/bin/xed"),Ee("Xcode")]},ghostty:{label:"Ghostty",description:"Ghostty terminal",commandBuilders:[Cd,ue("/Applications/Ghostty.app/Contents/MacOS/ghostty",["--working-directory"]),ue("$HOME/Applications/Ghostty.app/Contents/MacOS/ghostty",["--working-directory"]),Ee("Ghostty")]},finder:{label:"Finder",description:"Open the folder in Finder",commandBuilders:[Dt()]},terminal:{label:"Terminal",description:"Open the folder in Terminal.app",commandBuilders:[Dt("Terminal")]},iterm:{label:"iTerm",description:"Open the folder in iTerm",commandBuilders:[Dt("iTerm"),Dt("iTerm2")]},warp:{label:"Warp",description:"Open the folder in Warp",commandBuilders:[Dt("Warp")]}};var Pd={defaultModel:"",agent:"",permissionPolicy:""},vd={defaultModel:"gpt-5.4",sandbox:"workspace-write",approval:"never",reasoningEffort:"medium",reasoningSummary:"auto"},Ed={defaultModel:"sonnet",permissionMode:"bypassPermissions",planMode:!1},Id={defaultModel:"",agentDir:""},$i={OpenCode:Pd,Codex:vd,ClaudeCode:Ed,Pi:Id},iS={...$i};var bd=e=>({OpenCode:{...e.OpenCode},Codex:{...e.Codex},ClaudeCode:{...e.ClaudeCode},Pi:{...e.Pi}}),$t=(e,t)=>{let n=bd($i);return e?.OpenCode&&(n.OpenCode={...n.OpenCode,...e.OpenCode}),e?.Codex&&(n.Codex={...n.Codex,...e.Codex}),e?.ClaudeCode&&(n.ClaudeCode={...n.ClaudeCode,...e.ClaudeCode}),e?.Pi&&(n.Pi={...n.Pi,...e.Pi}),!n.OpenCode.defaultModel.trim()&&t?.trim()&&(n.OpenCode.defaultModel=t.trim()),n};var Sn=null,Rd=()=>Sn||(Sn=st(),Sn),We=()=>process.env.VIBEMUX_WORKER_RELEASE_CHANNEL?.trim()||Rd().channel?.trim()||"production",Td=e=>e==="preview"?"vibemux-worker-preview":"vibemux-worker",Ad=e=>e==="preview"?"preview":"latest",Md=()=>(process.env.npm_config_registry?.trim()||"https://registry.npmjs.org").replace(/\/$/,""),Od=async e=>{let t=await fetch(`${Md()}/${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()},Ke=async()=>{let e=ie(),t=We(),n=qe().name?.trim()||"",r=Td(t),o=Ad(t);if(n!==r)return{ok:!0,currentVersion:e,channel:t,available:!1,packageName:r,packageTag:o,message:"\u5F53\u524D\u662F\u6E90\u7801\u6A21\u5F0F\u6216\u975E npm Worker \u5305\uFF0C\u8DF3\u8FC7\u7248\u672C\u66F4\u65B0\u68C0\u67E5\u3002"};try{let s=(await Od(r))["dist-tags"]?.[o]?.trim();return s?s===e?{ok:!0,currentVersion:e,latestVersion:s,channel:t,available:!1,packageName:r,packageTag:o,message:`\u5F53\u524D\u5DF2\u662F\u6700\u65B0\u7248\u672C ${e}\u3002`}:{ok:!0,currentVersion:e,latestVersion:s,channel:t,available:!0,packageName:r,packageTag:o,message:`\u68C0\u6D4B\u5230\u65B0\u7248\u672C ${s}\u3002`}:{ok:!1,currentVersion:e,channel:t,available:!1,packageName:r,packageTag:o,message:`\u672A\u627E\u5230 npm dist-tag: ${o}`}}catch(i){return{ok:!1,currentVersion:e,channel:t,available:!1,packageName:r,packageTag:o,message:i instanceof Error?i.message:"\u67E5\u8BE2 npm \u66F4\u65B0\u5931\u8D25"}}};var Li=T.join(Ie.homedir(),".vibemux"),Bd=T.join(Ie.homedir(),".vibemux-dev"),Dd=T.join(Ie.homedir(),".vibemux-preview"),$d="http://127.0.0.1:8989",Nd=48100,Ud=["config.json","machine-id","workspace","runtime"],Ld=["config.json","machine-id","runtime"],jd=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"]),ji=()=>!!process.env.VIBEMUX_CLOUD_URL?.trim(),xn=()=>process.env.VIBEMUX_CLOUD_URL?.trim()||st().defaultCloudUrl?.trim()||$d,Fd=["vibemux.xyz"],Ar=e=>Fd.some(t=>e.includes(t)),Gd=e=>{if(process.env.NODE_ENV==="development"||ji())return!1;let t=st().defaultCloudUrl?.trim();if(!t)return!1;if(jd.has(e?.trim()||""))return!0;let n=Ar(t),r=Ar(e||"");return n!==r},Fi=()=>{let e=xn();return We()==="preview"||Ar(e)?"preview":process.env.NODE_ENV==="development"?"development":"production"},qd=()=>{switch(Fi()){case"development":return Bd;case"preview":return Dd;default:return Li}},zd=()=>{let e=Li;switch(Fi()){case"development":return[T.join(e,"worker-dev")];case"preview":return process.env.NODE_ENV==="development"?[T.join(e,"worker-dev-preview"),T.join(e,"worker-preview")]:[T.join(e,"worker-preview"),T.join(e,"worker-dev-preview")];default:return[T.join(e,"worker")]}},Ni=e=>Ld.some(t=>Be(T.join(e,t))),Hd=(e,t)=>{let n=T.join(e,"config.json");if(Be(n))try{let r=JSON.parse(Cn(n,"utf8"));(r.workspaceRoot?.trim()||"")===T.join(e,"workspace")&&(r.workspaceRoot=T.join(t,"workspace")),_r(T.join(t,"config.json"),`${JSON.stringify(r,null,2)}
3
+ `,"utf8")}catch{Ui(n,T.join(t,"config.json"))}},Jd=e=>{if(Ni(e))return;let t=zd().find(n=>n!==e&&Ni(n));if(t){Or(e,{recursive:!0});for(let n of Ud){if(n==="config.json")continue;let r=T.join(t,n),o=T.join(e,n);!Be(r)||Be(o)||Ui(r,o,{recursive:!0})}Be(T.join(e,"config.json"))||Hd(t,e)}},Vd=()=>{let e=Number(process.env.VIBEMUX_WORKER_PORT?.trim());if(Number.isFinite(e)&&e>0)return e;let t=st().defaultLocalServerPort;return Number.isFinite(t)&&t?t:Nd},Kd=()=>{let e=process.env.OPENCODE_CONFIG_PATH?.trim();if(e)return[e];let t=T.join(Ie.homedir(),".config","opencode");return[T.join(t,"opencode.json"),T.join(t,"opencode.jsonc")]},Gi=()=>{let e=process.env.CODEX_HOME?.trim()||T.join(Ie.homedir(),".codex");return T.join(e,"config.toml")},qi=()=>{let e=process.env.CODEX_HOME?.trim()||T.join(Ie.homedir(),".codex");return T.join(e,"auth.json")},Xd=()=>{let e=process.env.CLAUDE_HOME?.trim()||T.join(Ie.homedir(),".claude");return[T.join(e,"settings.json"),T.join(e,"config.json")]},zi=()=>process.env.PI_AGENT_DIR?.trim()||T.join(Ie.homedir(),".pi","agent"),dt=e=>{if(!Be(e))return"";try{return Cn(e,"utf8").trim()}catch{return""}},Mr=e=>!!e&&typeof e=="object"&&!Array.isArray(e),Hi=(e,t)=>Object.entries(t).reduce((n,[r,o])=>{let i=n[r];return Mr(i)&&Mr(o)?(n[r]=Hi({...i},o),n):(n[r]=o,n)},{...e}),Ji=()=>{let e=Kd().map(t=>({path:t,content:dt(t)})).filter(t=>t.content.trim());if(e.length===0)return{opencodeConfigContent:"",defaultModel:"",sourcePaths:[]};try{if(e.length===1){let o=se(e[0].content),i=Object.entries(o.default??{}).find(([,s])=>typeof s=="string"&&s.trim());return{opencodeConfigContent:e[0].content,defaultModel:i?`${i[0]}/${String(i[1]).trim()}`:"",sourcePaths:e.map(s=>s.path)}}let t=e.reduce((o,i)=>{let s=se(i.content);return Hi(o,s)},{}),n=Mr(t.default)?t.default:{},r=Object.entries(n).find(([,o])=>typeof o=="string"&&o.trim());return{opencodeConfigContent:JSON.stringify(t,null,2),defaultModel:r?`${r[0]}/${String(r[1]).trim()}`:"",sourcePaths:e.map(o=>o.path)}}catch{return{opencodeConfigContent:"",defaultModel:"",sourcePaths:e.map(t=>t.path)}}},Qd=()=>{let e=Ji();return{opencodeConfigContent:e.opencodeConfigContent,defaultModel:e.defaultModel}},Yd=()=>{let e=process.env.VIBEMUX_WORKER_HOME?.trim();if(e)return e;let t=process.env.VIBEMUX_HOME?.trim();return t?T.join(t,"worker"):qd()},ye=()=>{let e=T.resolve(Yd());return!process.env.VIBEMUX_WORKER_HOME?.trim()&&!process.env.VIBEMUX_HOME?.trim()&&Jd(e),e},Wr=()=>T.join(ye(),"config.json"),Zd=()=>T.join(ye(),"machine-id"),eu=()=>{let e=ye(),t=Zd();if(Be(t)){let r=Cn(t,"utf8").trim();if(r)return r}Or(e,{recursive:!0});let n=Wd();return _r(t,`${n}
4
+ `,"utf8"),n},tu=()=>({cloudUrl:xn(),machineId:eu(),machineName:Ie.hostname(),opencodeConfigContent:"",codexConfigContent:"",codexAuthContent:"",claudeCodeConfigContent:"",piAgentDir:zi(),defaultModel:"",agentSettings:$t(),mcpServers:[],workspaceRoot:T.join(ye(),"workspace"),maxConcurrency:5,labels:[],capabilities:["code-execution","git-operations"],localServerPort:Number(process.env.VIBEMUX_WORKER_PORT||Vd()),projectBindings:[]}),C=()=>{let e=Wr(),t=Be(e)?JSON.parse(Cn(e,"utf8")):{},n={...tu(),...t},r=Qd();ji()&&(n.cloudUrl=xn()),Gd(n.cloudUrl)&&(n.cloudUrl=xn());let o=Number(process.env.VIBEMUX_WORKER_PORT?.trim());return Number.isFinite(o)&&o>0&&(n.localServerPort=o),n.opencodeConfigContent?.trim()||(n.opencodeConfigContent=r.opencodeConfigContent),n.codexConfigContent?.trim()||(n.codexConfigContent=dt(Gi())),n.codexAuthContent?.trim()||(n.codexAuthContent=dt(qi())),n.claudeCodeConfigContent?.trim()||(n.claudeCodeConfigContent=Br()),n.piAgentDir?.trim()||(n.piAgentDir=zi()),n.defaultModel?.trim()||(n.defaultModel=r.defaultModel),n.agentSettings=$t(n.agentSettings,n.defaultModel),n},ke=e=>{let t=ye();Or(t,{recursive:!0}),_r(Wr(),`${JSON.stringify(e,null,2)}
5
+ `,"utf8")},Vi=()=>Ji().opencodeConfigContent,Pn=()=>dt(Gi()),vn=()=>dt(qi()),Br=()=>{for(let e of Xd()){let t=dt(e);if(t.trim())return t}return""},En=(e=C(),t)=>wn(e.opencodeConfigContent,e.mcpServers??[],{cloudUrl:e.cloudUrl,executorToken:e.executorToken,actingUserId:t}),In=()=>{_d(Wr(),{force:!0})},bn=()=>{let e={...C(),executorName:void 0,executorId:void 0,executorToken:void 0,lastPairedPairingCode:void 0};return ke(e),e};import{existsSync as An}from"node:fs";import{stdin as os,stdout as is}from"node:process";import Ut from"node:path";import{createInterface as Cu}from"node:readline/promises";import{existsSync as uu}from"node:fs";import pu from"node:os";import Qi from"node:path";import{spawn as mu}from"node:child_process";import{accessSync as nu,constants as ru,existsSync as ou}from"node:fs";import{delimiter as Dr,dirname as iu,isAbsolute as su,join as au}from"node:path";import{spawnSync as cu}from"node:child_process";var G=(e,t,n)=>{let r=cu(e,t,{cwd:n?.cwd,encoding:"utf8",env:n?.env,stdio:n?.streamOutput?"inherit":"pipe",timeout:n?.timeout??12e4});return{ok:r.status===0,stdout:r.stdout?.trim()??"",stderr:r.stderr?.trim()??"",error:r.error instanceof Error?r.error.message:void 0}},L=(e,t)=>e.stdout||e.stderr||e.error||t,F=(e,t=["--version"])=>G(e,t).ok,lu=e=>{let t=process.env.PATH??"";t.split(Dr).filter(Boolean).includes(e)||(process.env.PATH=t?`${e}${Dr}${t}`:e)},$r=e=>{if(!ou(e))return!1;try{return nu(e,ru.X_OK),!0}catch{return!1}},Xi=e=>{let t=(process.env.PATHEXT??".COM;.EXE;.BAT;.CMD").split(";").map(n=>n.trim().toLowerCase()).filter(Boolean);if(t.some(n=>e.toLowerCase().endsWith(n)))return $r(e)?e:null;for(let n of t){let r=`${e}${n}`;if($r(r))return r}return null},Ki=e=>process.platform==="win32"?Xi(e):$r(e)?e:null,Z=e=>{if(e.includes("/")||e.includes("\\")||su(e))return Ki(e);for(let t of(process.env.PATH??"").split(Dr).filter(Boolean)){let n=au(t,e),r=process.platform==="win32"?Xi(n):Ki(n);if(r)return lu(iu(r)),r}return null},du=(e,t,n)=>typeof process.getuid=="function"&&process.getuid()===0?{command:e,args:t}:F("sudo")?n?.interactiveAuth?{command:"sudo",args:[e,...t]}:F("sudo",["-n","true"])?{command:"sudo",args:["-n",e,...t]}:null:null,be=(e,t,n,r)=>{let o=du(e,t,r);return o?G(o.command,o.args,{streamOutput:r?.streamOutput,timeout:n}):{ok:!1,stdout:"",stderr:"",error:r?.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 Nt=900*1e3,Yi=15e3,gu=()=>process.env.CLAUDE_HOME?.trim()||Qi.join(pu.homedir(),".claude"),fu=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,Rn=(e,t,n)=>({id:e,label:fu(e),ok:n.ok,changed:n.changed,detail:n.detail,skipped:n.skipped,installer:t?.installer,commandSummary:t?.commandSummary}),Zi=(e,t,n,r,o,i)=>{let s={installer:n,commandSummary:t},a=G("npm",["install","-g",e],{streamOutput:i?.streamOutput,timeout:Nt});return!a.ok&&process.platform!=="win32"&&(a=be("npm",["install","-g",e],Nt,i)),Rn(r,s,{ok:a.ok,changed:a.ok,detail:L(a,o)})},es=()=>F("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 Zi("@openai/codex","npm install -g @openai/codex","npm","codex-cli","\u5B89\u88C5 Codex CLI \u5931\u8D25",e)}}:null,ts=()=>process.platform==="darwin"&&F("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"},n=G("brew",["install","--cask","claude-code"],{streamOutput:e?.streamOutput,timeout:Nt});return Rn("claude-cli",t,{ok:n.ok,changed:n.ok,detail:L(n,"\u5B89\u88C5 Claude Code CLI \u5931\u8D25")})}}:process.platform==="win32"&&F("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"},n=G("winget",["install","--id","Anthropic.ClaudeCode","--exact","--source","winget","--accept-package-agreements","--accept-source-agreements"],{streamOutput:e?.streamOutput,timeout:Nt});return Rn("claude-cli",t,{ok:n.ok,changed:n.ok,detail:L(n,"\u5B89\u88C5 Claude Code CLI \u5931\u8D25")})}}:F("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 Zi("@anthropic-ai/claude-code","npm install -g @anthropic-ai/claude-code","npm","claude-cli","\u5B89\u88C5 Claude Code CLI \u5931\u8D25",e)}}:process.platform!=="win32"&&F("bash")&&F("curl")?{installer:"install.sh",commandSummary:"curl -fsSL https://claude.ai/install.sh | bash",manualHint:"\u8BF7\u6267\u884C `curl -fsSL https://claude.ai/install.sh | bash`\uFF0C\u7136\u540E\u8FD0\u884C `claude` \u5B8C\u6210\u767B\u5F55\u3002",run(e){let t={installer:"install.sh",commandSummary:"curl -fsSL https://claude.ai/install.sh | bash"},n=G("bash",["-lc","curl -fsSL https://claude.ai/install.sh | bash"],{streamOutput:e?.streamOutput,timeout:Nt});return Rn("claude-cli",t,{ok:n.ok,changed:n.ok,detail:L(n,"\u5B89\u88C5 Claude Code CLI \u5931\u8D25")})}}:null,hu=()=>{let e=Z("codex"),t=e?G(e,["--version"]):null,n=es();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:!!n,installer:n?.installer,installCommand:n?.commandSummary,hint:n?.manualHint||"\u8BF7\u5148\u5B89\u88C5 Codex CLI\uFF0C\u5E76\u786E\u8BA4 `codex` \u5DF2\u8FDB\u5165 PATH\u3002"}},yu=async()=>{let e=Z("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(n=>{let r=mu(e,["app-server"],{env:process.env,stdio:["pipe","pipe","pipe"]}),o="",i="",s=!1,a=0,c=-1,l=-1,u=h=>{s||(s=!0,clearTimeout(m),r.killed||r.kill("SIGTERM"),n(h))},d=h=>{r.stdin.write(`${JSON.stringify(h)}
6
+ `)},m=setTimeout(()=>{u({ok:!1,detail:"Codex \u767B\u5F55\u72B6\u6001\u68C0\u67E5\u8D85\u65F6\u3002"})},Yi),g=()=>{a+=1,l=a,d({jsonrpc:"2.0",id:a,method:"account/read",params:{refreshToken:!1}})},k=h=>{let S=h.trim();if(S)try{let y=JSON.parse(S);if(y.error?.message){u({ok:!1,detail:y.error.message});return}if(!y.result||typeof y.id>"u")return;if(y.id===c){d({jsonrpc:"2.0",method:"initialized"}),g();return}if(y.id!==l)return;if(y.result.requiresOpenaiAuth&&!y.result.account){u({ok:!1,detail:"Codex \u672A\u767B\u5F55\uFF0C\u8BF7\u5148\u8FD0\u884C `codex` \u5B8C\u6210\u8BA4\u8BC1\u3002"});return}u({ok:!0,detail:"Codex \u767B\u5F55\u72B6\u6001\u6B63\u5E38\u3002"})}catch{return}};r.stdout.on("data",h=>{o+=h.toString();let S=o.split(`
7
+ `);o=S.pop()??"";for(let y of S)k(y)}),r.stderr.on("data",h=>{i+=h.toString()}),r.on("error",h=>{u({ok:!1,detail:h instanceof Error?h.message:"Codex \u767B\u5F55\u68C0\u67E5\u5931\u8D25\u3002"})}),r.on("close",()=>{if(s)return;let h=i.trim().split(`
8
+ `).filter(Boolean).at(-1)||"Codex \u767B\u5F55\u68C0\u67E5\u5931\u8D25\u3002";u({ok:!1,detail:h})}),a+=1,c=a,d({jsonrpc:"2.0",id:c,method:"initialize",params:{clientInfo:{name:"vibemux-worker",version:"0.1.1"},capabilities:{experimentalApi:!0}}})});return{id:"codex-auth",label:"Codex \u767B\u5F55",ok:t.ok,detail:t.detail,autoInstallable:!1,hint:t.ok?void 0:"\u8BF7\u5148\u8FD0\u884C `codex`\uFF0C\u6309\u63D0\u793A\u5B8C\u6210\u767B\u5F55\u540E\u518D\u91CD\u8BD5\u3002"}},ku=()=>{let e=Z("claude"),t=e?G(e,["--version"]):null,n=ts();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:!!n,installer:n?.installer,installCommand:n?.commandSummary,hint:n?.manualHint||"\u8BF7\u5148\u5B89\u88C5 Claude Code CLI\uFF0C\u5E76\u786E\u8BA4 `claude` \u5DF2\u8FDB\u5165 PATH\u3002"}},wu=e=>{let t=e.trim();if(!t)return!1;try{let n=JSON.parse(t),r=n.env&&typeof n.env=="object"?n.env:void 0;return!!((typeof r?.ANTHROPIC_AUTH_TOKEN=="string"?r.ANTHROPIC_AUTH_TOKEN.trim():typeof r?.ANTHROPIC_API_KEY=="string"?r.ANTHROPIC_API_KEY.trim():"")||typeof n.apiKeyHelper=="string"&&n.apiKeyHelper.trim())}catch{return!1}},Su=()=>{if(process.env.ANTHROPIC_API_KEY?.trim()||process.env.ANTHROPIC_AUTH_TOKEN?.trim()||uu(Qi.join(gu(),".credentials.json")))return!0;try{return wu(C().claudeCodeConfigContent??"")}catch{return!1}},xu=()=>{let e=Z("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(Su())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=G(e,["doctor"],{timeout:Yi});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":L(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"}},ns=async e=>e==="codex-cli"?hu():e==="codex-auth"?yu():e==="claude-cli"?ku():e==="claude-auth"?xu():null,rs=e=>e==="codex-cli"?es():e==="claude-cli"?ts():null;var ae=900*1e3,Re=ne(),Pu=e=>{let t=process.env.PATH??"";t.split(Ut.delimiter).filter(Boolean).includes(e)||(process.env.PATH=t?`${e}${Ut.delimiter}${t}`:e)},Lr=()=>{if(process.platform!=="win32")return null;let e=[process.env.ProgramFiles,process.env.ProgramW6432,process.env.LocalAppData].filter(n=>!!n),t=[["Git","cmd","git.exe"],["Git","bin","git.exe"],["Programs","Git","cmd","git.exe"],["Programs","Git","bin","git.exe"]];for(let n of e)for(let r of t){let o=Ut.join(n,...r);if(An(o))return Pu(Ut.dirname(o)),o}return null},ss=e=>e==="git"?"Git":e==="opencode"?"OpenCode runtime":e==="pi-runtime"?"Pi runtime":e==="codex-cli"?"Codex CLI":e==="codex-auth"?"Codex \u767B\u5F55":e==="claude-cli"?"Claude Code CLI":"Claude Code \u767B\u5F55",re=(e,t,n)=>({id:e,label:ss(e),ok:n.ok,changed:n.changed,detail:n.detail,skipped:n.skipped,installer:t?.installer,commandSummary:t?.commandSummary});var as=()=>{if(process.platform==="win32")return F("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"},n=G("winget",["install","--id","Git.Git","--exact","--source","winget","--accept-package-agreements","--accept-source-agreements"],{streamOutput:e?.streamOutput,timeout:ae});return n.ok&&Lr(),re("git",t,{ok:n.ok,changed:n.ok,detail:L(n,"winget install Git.Git \u5931\u8D25")})}}:F("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"},n=G("choco",["install","git","-y"],{streamOutput:e?.streamOutput,timeout:ae});return n.ok&&Lr(),re("git",t,{ok:n.ok,changed:n.ok,detail:L(n,"choco install git \u5931\u8D25")})}}:null;if(process.platform==="darwin")return F("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"},n=G("brew",["install","git"],{streamOutput:e?.streamOutput,timeout:ae});return re("git",t,{ok:n.ok,changed:n.ok,detail:L(n,"brew install git \u5931\u8D25")})}}:null;if(process.platform==="linux"){if(F("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"},n=be("apt-get",["update"],ae,e);if(!n.ok)return re("git",t,{ok:!1,changed:!1,detail:L(n,"apt-get update \u5931\u8D25")});let r=be("apt-get",["install","-y","git"],ae,e);return re("git",t,{ok:r.ok,changed:r.ok,detail:L(r,"apt-get install git \u5931\u8D25")})}};if(F("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"},n=be("dnf",["install","-y","git"],ae,e);return re("git",t,{ok:n.ok,changed:n.ok,detail:L(n,"dnf install git \u5931\u8D25")})}};if(F("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"},n=be("yum",["install","-y","git"],ae,e);return re("git",t,{ok:n.ok,changed:n.ok,detail:L(n,"yum install git \u5931\u8D25")})}};if(F("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"},n=be("pacman",["-Sy","--noconfirm","git"],ae,e);return re("git",t,{ok:n.ok,changed:n.ok,detail:L(n,"pacman \u5B89\u88C5 git \u5931\u8D25")})}};if(F("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"},n=be("apk",["add","git"],ae,e);return re("git",t,{ok:n.ok,changed:n.ok,detail:L(n,"apk add git \u5931\u8D25")})}}}return null},cs=()=>An(`${Re}/package.json`)?An(`${Re}/pnpm-lock.yaml`)&&F("pnpm")?{installer:"pnpm",commandSummary:"pnpm install --frozen-lockfile",manualHint:"\u8BF7\u5728 worker \u6839\u76EE\u5F55\u6267\u884C `pnpm install --frozen-lockfile`\uFF0C\u786E\u4FDD `@opencode-ai/sdk` \u4E0E `opencode-ai` runtime \u90FD\u5DF2\u5B89\u88C5\u3002",run(e){let t={installer:"pnpm",commandSummary:"pnpm install --frozen-lockfile"},n=G("pnpm",["install","--frozen-lockfile"],{cwd:Re,streamOutput:e?.streamOutput,timeout:ae});return re("opencode",t,{ok:n.ok,changed:n.ok,detail:L(n,"pnpm install \u5931\u8D25")})}}:An(`${Re}/package-lock.json`)&&F("npm")?{installer:"npm",commandSummary:"npm ci",manualHint:"\u8BF7\u5728 worker \u6839\u76EE\u5F55\u6267\u884C `npm ci`\uFF0C\u786E\u4FDD `@opencode-ai/sdk` \u4E0E `opencode-ai` runtime \u90FD\u5DF2\u5B89\u88C5\u3002",run(e){let t={installer:"npm",commandSummary:"npm ci"},n=G("npm",["ci"],{cwd:Re,streamOutput:e?.streamOutput,timeout:ae});return re("opencode",t,{ok:n.ok,changed:n.ok,detail:L(n,"npm ci \u5931\u8D25")})}}:F("npm")?{installer:"npm",commandSummary:"npm install",manualHint:"\u8BF7\u5728 worker \u6839\u76EE\u5F55\u6267\u884C `npm install`\uFF0C\u786E\u4FDD `@opencode-ai/sdk` \u4E0E `opencode-ai` runtime \u90FD\u5DF2\u5B89\u88C5\u3002",run(e){let t={installer:"npm",commandSummary:"npm install"},n=G("npm",["install"],{cwd:Re,streamOutput:e?.streamOutput,timeout:ae});return re("opencode",t,{ok:n.ok,changed:n.ok,detail:L(n,"npm install \u5931\u8D25")})}}:null:null,vu=e=>e==="git"?as():e==="opencode"?cs():rs(e),Eu=()=>{Lr();let e=G("git",["--version"]),t=as();return{id:"git",label:"Git",ok:e.ok,detail:L(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"}},Iu=()=>{let e=G(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:Re}),t=cs(),n=Z(Ut.join(Re,"node_modules",".bin","opencode")),r=Z("opencode")||n,o=r?G(r,["--version"]):null,i=e.ok?r&&o?.ok?`@opencode-ai/sdk \u5DF2\u5B89\u88C5\uFF1B${o.stdout||r}`:"\u672A\u68C0\u6D4B\u5230\u53EF\u6267\u884C\u7684 OpenCode runtime\uFF08`opencode`\uFF09\u3002":L(e,"OpenCode runtime \u4F9D\u8D56\u4E0D\u53EF\u7528");return{id:"opencode",label:"OpenCode runtime",ok:e.ok&&!!(r&&o?.ok),detail:i,autoInstallable:!!t,installer:t?.installer,installCommand:t?.commandSummary,hint:t?.manualHint||"\u8BF7\u68C0\u67E5 worker \u4F9D\u8D56\u5B89\u88C5\u72B6\u6001\uFF0C\u5E76\u786E\u8BA4 `opencode-ai` \u5DF2\u968F worker \u4F9D\u8D56\u4E00\u8D77\u5B89\u88C5\u3002"}},bu=()=>{let e=G(process.execPath,["-e",'import("@mariozechner/pi-coding-agent").then(() => console.log("ok")).catch((error) => { console.error(error instanceof Error ? error.message : String(error)); process.exit(1) })'],{cwd:Re});return{id:"pi-runtime",label:"Pi runtime",ok:e.ok,detail:e.ok?"@mariozechner/pi-coding-agent \u5DF2\u5B89\u88C5":L(e,"Pi SDK \u4E0D\u53EF\u7528"),autoInstallable:!1,hint:"\u8BF7\u68C0\u67E5 worker \u4F9D\u8D56\u5B89\u88C5\u72B6\u6001\uFF0C\u5E76\u786E\u8BA4 `@mariozechner/pi-coding-agent` \u53EF\u88AB\u5F53\u524D Node \u8FD0\u884C\u65F6\u52A0\u8F7D\u3002"}},ls=async e=>{if(e==="git")return Eu();if(e==="opencode")return Iu();if(e==="pi-runtime")return bu();let t=await ns(e);return t||{id:e,label:ss(e),ok:!1,detail:"\u672A\u77E5\u68C0\u67E5\u9879\u3002",autoInstallable:!1}},Ru=e=>e==="all"?["git","opencode","pi-runtime","codex-cli","codex-auth","claude-cli","claude-auth"]:e==="Pi"?["pi-runtime"]:e==="Codex"?["git","codex-cli","codex-auth"]:e==="ClaudeCode"?["git","claude-cli","claude-auth"]:["git","opencode"],Tu=e=>e==="Pi"?"Pi \u8FD0\u884C\u73AF\u5883\u5DF2\u5C31\u7EEA\u3002":e==="Codex"?"Git\u3001Codex CLI \u4E0E\u767B\u5F55\u72B6\u6001\u5DF2\u5C31\u7EEA\u3002":e==="ClaudeCode"?"Git\u3001Claude Code CLI \u4E0E\u767B\u5F55\u72B6\u6001\u5DF2\u5C31\u7EEA\u3002":e==="all"?"Git\u3001OpenCode\u3001Pi\u3001Codex\u3001Claude Code \u8FD0\u884C\u73AF\u5883\u5DF2\u5C31\u7EEA\u3002":"Git \u4E0E OpenCode \u8FD0\u884C\u65F6\u5DF2\u5C31\u7EEA\u3002",jr=(e,t)=>{let n=e.filter(o=>!o.ok),r=n.length===0;return{ok:r,target:t,items:e,missingItems:n,message:r?Tu(t):`\u8FD0\u884C\u73AF\u5883\u7F3A\u5931\uFF1A${n.map(o=>o.label).join("\u3001")}`}},Au=e=>{let t=e.filter(o=>!o.ok);if(t.length===0)return"\u81EA\u52A8\u51C6\u5907\u5931\u8D25\u3002";let n=`\u81EA\u52A8\u51C6\u5907\u5931\u8D25\uFF1A${t.map(o=>o.label).join("\u3001")}`,r=t.map(o=>`- ${o.label}: ${o.detail}`).join(`
9
+ `);return r?`${n}
10
+ ${r}`:n},Gr=async(e="base")=>{let t=await Promise.all(Ru(e).map(n=>ls(n)));return jr(t,e)},Mn=(e,t=[])=>{let n=t.some(i=>i.changed),r=new Map(t.map(i=>[i.id,i.detail])),o=e.items.map(i=>{let s=r.get(i.id);return s?{...i,detail:`${i.detail}\uFF1B\u81EA\u52A8\u51C6\u5907\uFF1A${s}`}:i});return{ok:e.ok,changed:n,target:e.target,attempts:t,items:o,message:e.ok?n?`\u5DF2\u81EA\u52A8\u8865\u9F50${e.target==="base"?" Worker ":""}\u8FD0\u884C\u73AF\u5883\u3002`:e.message:Au(o)}},Nr=(e,t,n)=>{console.log(`[${e}/${t}] ${n}`)},Ur=(e,t)=>{console.log(` ${e} - ${t}`)},Fr=async(e,t)=>{if(e.ok)return Mn(e);let n=[],r=e.missingItems.length*2+1,o=1;for(let s of e.missingItems){let a=vu(s.id),c=a?`\u5B89\u88C5 ${s.label}\uFF08${a.installer}\uFF09`:`\u5B89\u88C5 ${s.label}`;t?.printProgress&&Nr(o,r,c);let l=a?a.run(t):re(s.id,null,{ok:!1,changed:!1,skipped:!0,detail:s.hint||`\u5F53\u524D\u73AF\u5883\u65E0\u6CD5\u81EA\u52A8\u5B89\u88C5 ${s.label}\u3002`});n.push(l),t?.printProgress&&Ur(l.ok?"\u6210\u529F":l.skipped?"\u8DF3\u8FC7":"\u5931\u8D25",l.detail),o+=1;let u=await ls(s.id);t?.printProgress&&(Nr(o,r,`\u6821\u9A8C ${s.label}`),Ur(u.ok?"\u6210\u529F":"\u5931\u8D25",u.detail)),o+=1}let i=await Gr(e.target);return t?.printProgress&&(Nr(o,r,"\u6700\u7EC8\u590D\u68C0"),Ur(i.ok?"\u6210\u529F":"\u5931\u8D25",i.message)),Mn(i,n)},Mu=e=>e.missingItems.map(t=>{let n=t.installCommand?`\uFF1B\u81EA\u52A8\u5B89\u88C5\uFF1A${t.installCommand}`:"";return`- ${t.label}: ${t.detail}${n}`}).join(`
11
+ `),Tn=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"}`)},ds=()=>!!(os.isTTY&&is.isTTY),Ou=e=>{let t=e?.trim().toLowerCase();return t?["1","true","yes","on"].includes(t)?!0:["0","false","no","off"].includes(t)?!1:null:null},_u=e=>{let t=e?.interactiveTerminal??ds(),n=Ou(e?.autoInstallSetting??process.env.VIBEMUX_WORKER_AUTO_INSTALL);return n===!0?"auto":n===!1?t?"prompt":"block":t?"prompt":"auto"},Wu=e=>{let t=e.trim().toLowerCase();return t==="y"||t==="yes"||t==="\u662F"},pe=async e=>{let t=await Gr(e?.target??"base");return t.ok||!e?.autoInstall?Mn(t):Fr(t,e)},us=async(e,t="base")=>{let n=await Gr(t),r=Mn(n);if(n.ok)return{status:"ready",report:r,message:r.message};console.log(`[worker] \u547D\u4EE4 ${e} \u8FD0\u884C\u524D\u68C0\u6D4B\u5230\u7F3A\u5931\u4F9D\u8D56\uFF1A`),console.log(Mu(n));let o=ds(),i=_u({interactiveTerminal:o});if(i==="auto"){console.log("[worker] \u5C06\u5C1D\u8BD5\u81EA\u52A8\u5B89\u88C5\u7F3A\u5931\u4F9D\u8D56\u3002");let c=await Fr(n,{interactiveAuth:o,printProgress:!0,streamOutput:!0});return c.ok?{status:"ready",report:c,message:c.message}:(Tn(jr(c.items,t)),{status:"failed",report:c,message:c.message})}if(!o||i==="block"){let c="\u5F53\u524D\u7EC8\u7AEF\u4E0D\u53EF\u4EA4\u4E92\uFF0C\u65E0\u6CD5\u786E\u8BA4\u662F\u5426\u81EA\u52A8\u5B89\u88C5\u7F3A\u5931\u4F9D\u8D56\u3002";return console.error(`[worker] ${c}`),Tn(n),{status:"non_interactive_blocked",report:r,message:c}}let s=Cu({input:os,output:is});try{let c=await s.question("\u662F\u5426\u73B0\u5728\u81EA\u52A8\u5B89\u88C5\u7F3A\u5931\u4F9D\u8D56\uFF1F[y/N] ");if(!Wu(c)){let l="\u7528\u6237\u62D2\u7EDD\u81EA\u52A8\u5B89\u88C5\uFF0CWorker \u5DF2\u9000\u51FA\u3002";return console.error(`[worker] ${l}`),Tn(n),{status:"declined",report:r,message:l}}}finally{s.close()}let a=await Fr(n,{interactiveAuth:!0,printProgress:!0,streamOutput:!0});return a.ok?{status:"ready",report:a,message:a.message}:(Tn(jr(a.items,t)),{status:"failed",report:a,message:a.message})};var On={daemonMode:"idle",paired:!1,connected:!1,runningTaskIds:[],queuedTaskIds:[]},Lt=()=>({...On,runningTaskIds:[...On.runningTaskIds],queuedTaskIds:[...On.queuedTaskIds]}),qr=e=>({...e,executorToken:e.executorToken?.trim()?"[redacted]":void 0,opencodeConfigContent:e.opencodeConfigContent?.trim()?"[redacted]":"",codexConfigContent:e.codexConfigContent?.trim()?"[redacted]":"",codexAuthContent:e.codexAuthContent?.trim()?"[redacted]":"",claudeCodeConfigContent:e.claudeCodeConfigContent?.trim()?"[redacted]":"",mcpServers:e.mcpServers?.map(t=>({...t,target:t.target?.trim()?"[redacted]":t.target}))}),ut=()=>{let e=Lt();return{...e,config:e.config?qr(e.config):void 0}},D=e=>{Object.assign(On,e)};import{mkdtemp as Bu,readFile as Du,rm as $u}from"node:fs/promises";import Nu from"node:os";import _n from"node:path";var ps=async e=>Ge({url:`${ve(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."}),ms=async e=>Ge({url:`${ve(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 gs=12,fs=12,hs=1500,ys=e=>{let t=e?.trim();if(t)return t.length>hs?`${t.slice(0,hs)}\u2026`:t},Uu=e=>{if(e!==void 0)try{return ys(JSON.stringify(e,null,2))}catch{return}},Lu=(e,t)=>`data:${t};base64,${e.toString("base64")}`,Wn=async e=>{let{chromium:t}=await import("playwright"),n=null,r=null,o="",i,s=0,a=0,c="playwright",l=0,u=0,d=async g=>{let k=g.level??"info";(k==="error"||k==="warning")&&(a+=1),s+=1,await ps({cloudUrl:e.cloudUrl,executorToken:e.executorToken,taskId:e.taskId,workspaceId:e.workspaceId,workspaceSessionId:e.workspaceSessionId,kind:g.kind,level:k,title:g.title,detail:ys(g.detail),url:g.url,attachments:g.attachments,metadata:g.metadata}).catch(()=>{})},m=async(g,k)=>{let h=_n.join(o,`${Date.now()}-${k}.png`);await g.screenshot({path:h,fullPage:!0});let S=await Du(h),y=await ms({cloudUrl:e.cloudUrl,executorToken:e.executorToken,taskId:e.taskId,filename:_n.basename(h),image:Lu(S,"image/png")});i=y.url,await d({kind:"screenshot",level:"info",title:`\u9875\u9762\u622A\u56FE \xB7 ${k}`,detail:`\u5F53\u524D\u9875\u9762: ${g.url()}`,url:y.url,attachments:[{id:y.id,url:y.url,filename:_n.basename(h),contentType:"image/png"}],metadata:{label:k}})};try{o=await Bu(_n.join(Nu.tmpdir(),"vibemux-browser-run-")),n=await t.launch({headless:!0}),r=await n.newContext({ignoreHTTPSErrors:!0,viewport:{width:1440,height:960}});let g=await r.newPage();if(g.on("console",y=>{let b=y.type();if(b==="error"||b==="warning"){if(l>=gs)return;l+=1,d({kind:"browser-console",level:b==="error"?"error":"warning",title:`Console ${b}`,detail:[y.text(),Uu(y.location())].filter(Boolean).join(`
12
+ `),url:g.url()||e.appUrl,metadata:{type:b,location:y.location()}})}}),g.on("pageerror",y=>{l>=gs||(l+=1,d({kind:"browser-console",level:"error",title:"\u9875\u9762\u811A\u672C\u5F02\u5E38",detail:y.message,url:g.url()||e.appUrl}))}),g.on("requestfailed",y=>{u>=fs||(u+=1,d({kind:"network",level:"error",title:`\u8BF7\u6C42\u5931\u8D25 \xB7 ${y.method()} ${y.resourceType()}`,detail:[y.url(),y.failure()?.errorText].filter(Boolean).join(`
13
+ `),url:y.url(),metadata:{method:y.method(),resourceType:y.resourceType(),failure:y.failure()}}))}),g.on("response",y=>{y.ok()||u>=fs||(u+=1,d({kind:"network",level:y.status()>=500?"error":"warning",title:`\u54CD\u5E94\u5F02\u5E38 \xB7 ${y.status()} ${y.request().method()}`,detail:[y.url(),y.statusText()].filter(Boolean).join(`
14
+ `),url:y.url(),metadata:{method:y.request().method(),status:y.status(),statusText:y.statusText()}}))}),await d({kind:"action",level:"info",title:"\u5F00\u59CB\u6D4F\u89C8\u5668\u5DE1\u68C0",detail:["\u6A21\u5F0F: Playwright",`\u5DE5\u4F5C\u76EE\u5F55: ${e.cwd}`,`\u76EE\u6807\u5730\u5740: ${e.appUrl}`,e.goal?.trim()?`\u6D4B\u8BD5\u76EE\u6807: ${e.goal.trim()}`:""].filter(Boolean).join(`
15
+ `),url:e.appUrl}),e.healthUrl?.trim()){let y=await fetch(e.healthUrl,{redirect:"follow"}).catch(b=>({ok:!1,status:0,statusText:b instanceof Error?b.message:"health request failed"}));await d({kind:"network",level:y.ok?"success":"warning",title:y.ok?"\u5065\u5EB7\u68C0\u67E5\u901A\u8FC7":"\u5065\u5EB7\u68C0\u67E5\u5F02\u5E38",detail:`${e.healthUrl}
16
+ ${y.status} ${y.statusText}`,url:e.healthUrl,metadata:{status:y.status,statusText:y.statusText}})}let k=await g.goto(e.appUrl,{waitUntil:"domcontentloaded",timeout:3e4});await g.waitForLoadState("networkidle",{timeout:1e4}).catch(()=>{}),await d({kind:"action",level:k?.ok()?"success":"warning",title:k?.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()}`,k?`HTTP ${k.status()} ${k.statusText()}`:"\u672A\u83B7\u5F97\u9996\u4E2A\u5BFC\u822A\u54CD\u5E94"].join(`
17
+ `),url:g.url()}),await m(g,"initial");let h=e.goal?.trim();h&&await d({kind:"action",level:"info",title:"\u5DF2\u8BB0\u5F55\u6D4B\u8BD5\u76EE\u6807",detail:h,url:g.url()});let S=a>0?`\u6D4F\u89C8\u5668\u5DE1\u68C0\u5B8C\u6210\uFF0C\u53D1\u73B0 ${a} \u6761\u5F02\u5E38\u7EBF\u7D22\uFF0C\u5DF2\u56DE\u6D41\u5230\u6D4B\u8BD5\u4F1A\u8BDD\u3002`:"\u6D4F\u89C8\u5668\u5DE1\u68C0\u5B8C\u6210\uFF0C\u672A\u53D1\u73B0\u660E\u663E\u5F02\u5E38\u7EBF\u7D22\u3002";return await d({kind:"action",level:a>0?"warning":"success",title:a>0?"\u6D4F\u89C8\u5668\u5DE1\u68C0\u5B8C\u6210\uFF0C\u53D1\u73B0\u5F02\u5E38\u7EBF\u7D22":"\u6D4F\u89C8\u5668\u5DE1\u68C0\u5B8C\u6210",detail:[S,`\u4F7F\u7528\u6A21\u5F0F: ${c}`,`\u6700\u7EC8\u9875\u9762: ${g.url()}`,`\u89C2\u6D4B\u6570\u91CF: ${s}`].join(`
18
+ `),url:g.url(),metadata:{usedMode:c,observationsCount:s,issueCount:a,consoleCount:l,networkCount:u}}),{ok:!0,message:S,summary:S,usedMode:c,finalUrl:g.url(),screenshotUrl:i,observationsCount:s,issueCount:a,at:new Date().toISOString()}}catch(g){let k=g instanceof Error?g.message:"\u6D4F\u89C8\u5668\u5DE1\u68C0\u5931\u8D25\u3002";return await d({kind:"action",level:"error",title:"\u6D4F\u89C8\u5668\u5DE1\u68C0\u5931\u8D25",detail:k,url:e.appUrl}),{ok:!1,message:k,summary:k,usedMode:c,finalUrl:e.appUrl,screenshotUrl:i,observationsCount:s,issueCount:a,at:new Date().toISOString()}}finally{await r?.close().catch(()=>{}),await n?.close().catch(()=>{}),o&&await $u(o,{recursive:!0,force:!0}).catch(()=>{})}};var Dn=e=>{let t=process.argv.slice(3),n=t.findIndex(r=>r===e);if(!(n<0))return t[n+1]?.trim()||void 0},Bn=e=>{let t=Dn(e);if(!t)throw new Error(`\u7F3A\u5C11\u5FC5\u586B\u53C2\u6570 ${e}\u3002`);return t},ks=async()=>{let e=C(),t=e.executorToken?.trim();if(!t)throw new Error("\u5F53\u524D worker \u672A\u5B8C\u6210\u914D\u5BF9\uFF0C\u7F3A\u5C11 executor token\u3002");let n=await Wn({cloudUrl:e.cloudUrl,executorToken:t,taskId:Bn("--task-id"),workspaceId:Bn("--workspace-id"),workspaceSessionId:Bn("--workspace-session-id"),cwd:Dn("--cwd")?.trim()||process.cwd(),appUrl:Bn("--app-url"),healthUrl:Dn("--health-url")?.trim()||void 0,goal:Dn("--goal")?.trim()||void 0,mode:"playwright"});console.log(JSON.stringify(n,null,2)),n.ok||(process.exitCode=1)};import{spawn as Cw}from"node:child_process";var zr=async e=>Ge({url:`${ve(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 ju=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():"",ws=async e=>{let t=await ju(e);return JSON.parse(t)};var Fu=e=>e.readyState===WebSocket.OPEN,Hr=(e,t)=>{if(!e.executorToken)throw new Error("Worker is not paired yet.");let n=`${bi(e.cloudUrl)}?token=${encodeURIComponent(e.executorToken)}`,r=new WebSocket(n);return r.addEventListener("open",()=>{t.onOpen?.()}),r.addEventListener("message",async o=>{try{let i=await ws(o.data);try{t.onMessage?.(i)}catch(s){t.onError?.(`Failed to process a control-plane message.${s instanceof Error?` ${s.message}`:""}`)}}catch(i){t.onError?.(`The control plane returned a message that could not be parsed.${i instanceof Error?` ${i.message}`:""}`)}}),r.addEventListener("error",()=>{t.onError?.(`Failed to connect to the control-plane WebSocket: ${n}`)}),r.addEventListener("close",o=>{t.onClose?.(o)}),{socket:r,send(o){if(!Fu(r))return!1;try{return r.send(JSON.stringify(o)),!0}catch(i){return t.onError?.(`Failed to send a control-plane WebSocket message.${i instanceof Error?` ${i.message}`:""}`),!1}}}};var Ss="127.0.0.1",Gu=e=>e==="0.0.0.0"||e==="::"?Ss:e,qu=e=>e.includes(":")&&!e.startsWith("[")?`[${e}]`:e,Jr=()=>process.env.VIBEMUX_WORKER_HOST?.trim()||Ss,jt=e=>{let t=Gu(Jr());return`http://${qu(t)}:${e}`};import{mkdirSync as zu}from"node:fs";import Ft from"node:path";var $n=e=>{let t={root:e,reposDir:Ft.join(e,"repos"),worktreesDir:Ft.join(e,"worktrees"),artifactsDir:Ft.join(e,"artifacts"),cacheDir:Ft.join(e,"cache")};for(let n of Object.values(t))zu(n,{recursive:!0});return t},xs=(e,t,n)=>Ft.join(e,"worktrees",n?.trim()||t);import{existsSync as Hp,readFileSync as Jp}from"node:fs";import Vp from"node:http";import co from"node:path";import{closeSync as Ju,existsSync as Un,openSync as Vu,readFileSync as Gt,readSync as Ku,readdirSync as Xu,statSync as Qu}from"node:fs";import Yu from"node:os";import $ from"node:path";var Hu=["# AGENTS.md instructions","<environment_context>","<INSTRUCTIONS>","<local-command-caveat>","<local-command-stdout>"],me=e=>{let t=e.trim();return t?Hu.some(n=>t.includes(n)):!1};var Xe=Yu.homedir(),Zu=48*1024,ep=2e4,Cs=$.join(Xe,".claude","projects"),Nn=$.join(Xe,".local","share","opencode","storage","message"),tp=$.join(Xe,".local","share","opencode","storage","part"),Ps=$.join(Xe,".codex","sessions"),np=$.join(Xe,".pi","agent"),rp=()=>({claude:0,opencode:0,codex:0,pi:0}),N=e=>!!e&&typeof e=="object"&&!Array.isArray(e),Ln=e=>{try{return Xu(e,{withFileTypes:!0})}catch{return[]}},pt=e=>{try{return Qu(e)}catch{return null}},vs=(e,t=Zu)=>{let n=Vu(e,"r"),r=Buffer.alloc(t);try{let o=Ku(n,r,0,t,0);return r.subarray(0,o).toString("utf8")}finally{Ju(n)}},Xr=e=>{try{return JSON.parse(Gt(e,"utf8"))}catch{return null}},Es=e=>{let t=e.trim();return t?t==="~"?Xe:t.startsWith("~/")?$.join(Xe,t.slice(2)):t:""},op=()=>{let e=C().piAgentDir?.trim();return $.resolve(Es(e||process.env.PI_AGENT_DIR?.trim()||np))},Is=()=>{let e=op(),t=Xr($.join(e,"settings.json")),n=typeof t?.sessionDir=="string"?Es(t.sessionDir):"",r=n?$.isAbsolute(n)?$.resolve(n):$.resolve(e,n):$.join(e,"sessions");return Array.from(new Set([r,$.join(e,"sessions"),$.join(e,"sessions-vibemux")]))},mt=e=>e.split(`
19
+ `).map(t=>t.trim()).filter(Boolean).flatMap(t=>{try{return[JSON.parse(t)]}catch{return[]}}),gt=(e,t)=>{if(!Un(e))return[];let n=[],r=[e];for(;r.length>0;){let o=r.pop();if(o)for(let i of Ln(o)){let s=$.join(o,i.name);if(i.isDirectory()){r.push(s);continue}i.isFile()&&s.endsWith(t)&&n.push(s)}}return n},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()}},Qr=(e,t=240)=>{let n=e.replace(/\s+/g," ").trim();return n?n.length<=t?n:`${n.slice(0,t-1)}\u2026`:""},K=(e,t=ep)=>{let n=e.trim();return n?n.length<=t?n:`${n.slice(0,t)}
20
+
21
+ \u2026\uFF08\u5185\u5BB9\u8FC7\u957F\uFF0C\u5DF2\u6309\u5B89\u5168\u4E0A\u9650\u622A\u65AD\uFF09`:""},Yr=e=>typeof e=="string"?e.trim():Array.isArray(e)?e.flatMap(t=>typeof t=="string"?[t]:N(t)?typeof t.text=="string"?[t.text]:typeof t.content=="string"?[t.content]:[]:[]).join(`
22
+
23
+ `).trim():"",ft=e=>({...e,title:Qr(e.title||"\u672A\u547D\u540D\u4F1A\u8BDD",96),cwd:e.cwd||"\u2014"}),ip=()=>gt(Cs,".jsonl").flatMap(e=>{let t=pt(e);if(!t)return[];let n=mt(vs(e)),r=$.basename(e,".jsonl"),o=n.map(a=>J(a.timestamp)).find(Boolean),i=n.map(a=>typeof a.cwd=="string"?a.cwd:"").find(Boolean)||"",s=n.flatMap(a=>{let c=N(a.message)?a.message:null;if(!c||c.role!=="user")return[];let l=Yr(c.content);return!l||me(l)?[]:[l]}).find(Boolean)||"Claude Code \u4F1A\u8BDD";return[ft({id:r,source:"claude",title:s,cwd:i,startedAt:o,lastUpdatedAt:t.mtime.toISOString(),entryCount:0})]}),sp=e=>{let t=N(e.message)?e.message:null;if(!t||e.isMeta===!0)return[];let n=J(e.timestamp),r=typeof t.role=="string"?t.role:typeof e.type=="string"?e.type:"system",o=t.content;if(r==="user"||r==="system"){let i=Yr(o);return!i||me(i)?[]:[{id:`${String(e.uuid||e.sessionId||n||Math.random())}`,role:r==="user"?"user":"system",text:K(i),timestamp:n}]}return r!=="assistant"||!Array.isArray(o)?[]:o.flatMap((i,s)=>N(i)?typeof i.text=="string"&&i.type==="text"?[{id:`${String(e.uuid||e.sessionId||n||s)}-${s}`,role:"assistant",text:K(i.text),timestamp:n}]:i.type==="tool_use"&&typeof i.name=="string"?[{id:`${String(e.uuid||e.sessionId||n||s)}-${s}`,role:"tool",text:K(`\u8C03\u7528\u5DE5\u5177\uFF1A${i.name}`),timestamp:n}]:[]:[])},ap=e=>{let n=gt(Cs,".jsonl").filter(l=>$.basename(l,".jsonl")===e)[0];if(!n)return null;let r=mt(Gt(n,"utf8")),o=pt(n),i=r.map(l=>typeof l.cwd=="string"?l.cwd:"").find(Boolean)||"",s=r.flatMap(l=>{let u=N(l.message)?l.message:null;if(!u||u.role!=="user")return[];let d=Yr(u.content);return!d||me(d)?[]:[d]}).find(Boolean)||"Claude Code \u4F1A\u8BDD",a=r.map(l=>J(l.timestamp)).find(Boolean),c=r.flatMap(sp);return{...ft({id:e,source:"claude",title:s,cwd:i,startedAt:a,lastUpdatedAt:o?.mtime.toISOString()||new Date().toISOString(),entryCount:c.length}),entries:c}},cp=()=>gt(Ps,".jsonl").flatMap(e=>{let t=pt(e);if(!t)return[];let n=mt(vs(e)),r=n.find(c=>c.type==="session_meta"),o=N(r?.payload)?r.payload:null,i=typeof o?.cwd=="string"?o.cwd:"",s=J(o?.timestamp)||n.map(c=>J(c.timestamp)).find(Boolean),a=n.flatMap(c=>bs(c,!0)).map(c=>c.text).find(c=>!me(c))||"Codex \u4F1A\u8BDD";return[ft({id:$.basename(e,".jsonl"),source:"codex",title:a,cwd:i,startedAt:s,lastUpdatedAt:t.mtime.toISOString(),entryCount:0})]}),bs=(e,t=!1)=>{if(e.type!=="response_item")return[];let n=N(e.payload)?e.payload:null;if(!n)return[];let r=J(e.timestamp);if(n.type==="message"){let s=n.role;if(s!=="user"&&s!=="assistant")return[];let a=Array.isArray(n.content)?n.content.flatMap(c=>N(c)?typeof c.text=="string"&&(c.type==="input_text"||c.type==="text"||c.type==="output_text"||c.type==="summary_text")?[c.text]:!t&&c.type==="tool_use"&&typeof c.name=="string"?[`\u8C03\u7528\u5DE5\u5177\uFF1A${c.name}`]:[]:[]).join(`
24
+
25
+ `).trim():"";return a?s==="user"&&me(a)?[]:t&&s!=="user"?[]:[{id:`${String(e.timestamp||Math.random())}-${s}`,role:s,text:K(a),timestamp:r}]:[]}if(t||n.type!=="function_call")return[];let o=typeof n.name=="string"?n.name:"tool",i=Qr(typeof n.arguments=="string"?n.arguments:"");return[{id:`${String(e.timestamp||Math.random())}-tool`,role:"tool",text:K(i?`\u8C03\u7528 ${o}
26
+ ${i}`:`\u8C03\u7528 ${o}`),timestamp:r}]},lp=e=>{let n=gt(Ps,".jsonl").filter(d=>$.basename(d,".jsonl")===e)[0];if(!n)return null;let r=mt(Gt(n,"utf8")),o=pt(n),i=r.find(d=>d.type==="session_meta"),s=N(i?.payload)?i.payload:null,a=typeof s?.cwd=="string"?s.cwd:"",c=J(s?.timestamp)||r.map(d=>J(d.timestamp)).find(Boolean),l=r.flatMap(d=>bs(d)),u=l.find(d=>d.role==="user"&&!me(d.text))?.text||"Codex \u4F1A\u8BDD";return{...ft({id:e,source:"codex",title:u,cwd:a,startedAt:c,lastUpdatedAt:o?.mtime.toISOString()||new Date().toISOString(),entryCount:l.length}),entries:l}},Rs=e=>{let t=$.join(tp,e);return Ln(t).filter(n=>n.isFile()&&n.name.endsWith(".json")).map(n=>Xr($.join(t,n.name))).filter(n=>!!n).sort((n,r)=>{let o=N(n.time)&&typeof n.time.start=="number"?n.time.start:0,i=N(r.time)&&typeof r.time.start=="number"?r.time.start:0;return o-i})},Kr=e=>{let t=Rs(String(e.id)).flatMap(r=>r.type==="text"&&typeof r.text=="string"?[r.text.trim()]:[]).filter(Boolean).join(`
27
+
28
+ `);if(t)return t;let n=N(e.summary)?e.summary:null;return typeof n?.title=="string"?n.title.replace(/^Title:\s*/i,"").trim():""},dp=e=>{try{return JSON.stringify(e??{},null,2)}catch{return""}},up=e=>{let t=e.trim();return!!(t&&t!=="{}"&&t!=="[]")},pp=e=>{let t=N(e.time)?e.time:null;return J(t?.created)||J(t?.completed)},mp=(e,t)=>{let n=N(e.time)?e.time:null;return J(n?.start)||J(n?.end)||t},gp=e=>{let t=typeof e.tool=="string"&&e.tool.trim()?e.tool.trim():"tool",n=N(e.state)?e.state:null,r=typeof n?.raw=="string"?n.raw.trim():"",o=dp(n?.input),i=r||(up(o)?o:""),s=typeof n?.output=="string"?n.output.trim():"",a=typeof n?.error=="string"?n.error.trim():"",c=typeof n?.status=="string"?n.status:"";return[c==="error"?`\u5DE5\u5177\u62A5\u9519\uFF1A${t}`:c==="completed"?`\u5DE5\u5177\u7ED3\u679C\uFF1A${t}`:`\u8C03\u7528\u5DE5\u5177\uFF1A${t}`,i,c==="error"?a:s].filter(Boolean).join(`
29
+ `)},fp=e=>{let t=e.role,n=typeof e.id=="string"||typeof e.id=="number"?String(e.id):`opencode-${Math.random()}`,r=pp(e);if(t==="user"){let s=Kr(e);return!s||me(s)?[]:[{id:n,role:"user",text:K(s),timestamp:r}]}if(t!=="assistant")return[];let o=Rs(n).flatMap((s,a)=>{let c=typeof s.id=="string"||typeof s.id=="number"?String(s.id):`${n}-part-${a}`,l=mp(s,r);if(s.type==="text"&&typeof s.text=="string"){let u=K(s.text);return u?[{id:c,role:"assistant",text:u,timestamp:l}]:[]}if(s.type==="reasoning"&&typeof s.text=="string"){let u=K(s.text);return u?[{id:c,role:"system",text:u,timestamp:l}]:[]}if(s.type==="tool"){let u=K(gp(s));return u?[{id:c,role:"tool",text:u,timestamp:l}]:[]}return[]});if(o.length>0)return o;let i=Kr(e);return i?[{id:n,role:"assistant",text:K(i),timestamp:r}]:[]},Vr=e=>typeof e=="string"?e.trim():Array.isArray(e)?e.flatMap(t=>N(t)?t.type==="text"&&typeof t.text=="string"?[t.text]:typeof t.text=="string"?[t.text]:[]:[]).join(`
30
+
31
+ `).trim():"",Ts=e=>{if(e.type!=="message")return[];let t=N(e.message)?e.message:null;if(!t)return[];let n=typeof t.role=="string"?t.role:"system",r=J(e.timestamp)||J(t.timestamp),o=typeof e.id=="string"?e.id:String(e.timestamp||Math.random());if(n==="user"){let i=Vr(t.content);return!i||me(i)?[]:[{id:o,role:"user",text:K(i),timestamp:r}]}if(n==="assistant"){let i=Array.isArray(t.content)?t.content:[],s=i.flatMap(c=>N(c)?c.type==="text"&&typeof c.text=="string"?[c.text]:[]:[]).join(`
32
+
33
+ `).trim(),a=i.flatMap((c,l)=>{if(!N(c)||c.type!=="toolCall"||typeof c.name!="string")return[];let u=Qr(JSON.stringify(c.arguments??{},null,2),600);return[{id:`${o}-tool-${l}`,role:"tool",text:K(u&&u!=="{}"?`\u8C03\u7528\u5DE5\u5177\uFF1A${c.name}
34
+ ${u}`:`\u8C03\u7528\u5DE5\u5177\uFF1A${c.name}`),timestamp:r}]});return[...s?[{id:`${o}-assistant`,role:"assistant",text:K(s),timestamp:r}]:[],...a]}if(n==="toolResult"){let i=typeof t.toolName=="string"?t.toolName:"tool",s=Vr(t.content),a=t.isError===!0?`\u5DE5\u5177\u62A5\u9519\uFF1A${i}`:`\u5DE5\u5177\u7ED3\u679C\uFF1A${i}`;return[{id:`${o}-tool-result`,role:"tool",text:K(s?`${a}
35
+ ${s}`:a),timestamp:r}]}if(n==="bashExecution"){let i=typeof t.command=="string"?t.command.trim():"",s=typeof t.output=="string"?t.output.trim():"",a=i?`\u6267\u884C\u547D\u4EE4\uFF1A${i}`:"\u6267\u884C\u547D\u4EE4";return[{id:`${o}-bash`,role:"tool",text:K(s?`${a}
36
+ ${s}`:a),timestamp:r}]}if(n==="branchSummary"||n==="compactionSummary"){let i=typeof t.summary=="string"?t.summary.trim():"";return i?[{id:`${o}-summary`,role:"system",text:K(i),timestamp:r}]:[]}if(n==="custom"){let i=Vr(t.content);return i?[{id:`${o}-custom`,role:"system",text:K(i),timestamp:r}]:[]}return[]},As=e=>{let t=pt(e);if(!t)return null;let n=mt(Gt(e,"utf8")),r=n.find(c=>c.type==="session"),o=typeof r?.cwd=="string"?r.cwd:"",i=J(r?.timestamp)||n.map(c=>J(c.timestamp)).find(Boolean),s=n.flatMap(Ts),a=s.find(c=>c.role==="user"&&!me(c.text))?.text||"Pi \u4F1A\u8BDD";return ft({id:$.basename(e,".jsonl"),source:"pi",title:a,cwd:o,startedAt:i,lastUpdatedAt:t.mtime.toISOString(),entryCount:s.length})},Ms=e=>{let t=$.join(Nn,e);return Ln(t).filter(n=>n.isFile()&&n.name.endsWith(".json")).map(n=>Xr($.join(t,n.name))).filter(n=>!!n).sort((n,r)=>{let o=N(n.time)&&typeof n.time.created=="number"?n.time.created:0,i=N(r.time)&&typeof r.time.created=="number"?r.time.created:0;return o-i})},Os=e=>{let t=$.join(Nn,e),n=pt(t),r=Ms(e);if(r.length===0)return null;let o=r.flatMap(c=>{let l=N(c.path)?c.path:null;return typeof l?.cwd=="string"?[l.cwd]:[]}).find(Boolean)||"",i=r.map(c=>J(N(c.time)?c.time.created:void 0)).find(Boolean),s=r.map(c=>{let l=N(c.time)?c.time:null;return J(l?.completed)||J(l?.created)}).filter(Boolean).pop()||n?.mtime.toISOString()||new Date().toISOString(),a=r.filter(c=>c.role==="user").map(Kr).find(c=>!!c&&!me(c))||"OpenCode \u4F1A\u8BDD";return ft({id:e,source:"opencode",title:a,cwd:o,startedAt:i,lastUpdatedAt:s,entryCount:r.length})},hp=()=>Un(Nn)?Ln(Nn).filter(e=>e.isDirectory()).flatMap(e=>{let t=Os(e.name);return t?[t]:[]}):[],yp=()=>{let e=new Set;return Is().flatMap(n=>Un(n)?gt(n,".jsonl"):[]).filter(n=>e.has(n)?!1:(e.add(n),!0)).flatMap(n=>{let r=As(n);return r?[r]:[]})},kp=e=>{let t=Os(e);if(!t)return null;let n=Ms(e).flatMap(fp);return{...t,entryCount:n.length,entries:n}},wp=e=>{let n=Is().flatMap(s=>Un(s)?gt(s,".jsonl"):[]).filter(s=>$.basename(s,".jsonl")===e)[0];if(!n)return null;let r=As(n);if(!r)return null;let i=mt(Gt(n,"utf8")).flatMap(Ts);return{...r,entryCount:i.length,entries:i}},jn=()=>{let e=[...ip(),...hp(),...cp(),...yp()].sort((n,r)=>r.lastUpdatedAt.localeCompare(n.lastUpdatedAt)),t=e.reduce((n,r)=>(n[r.source]+=1,n),rp());return{ok:!0,sessions:e,counts:t}},Fn=(e,t)=>e==="claude"?ap(t):e==="opencode"?kp(t):e==="pi"?wp(t):lp(t);import{existsSync as $s,mkdirSync as Ns,readdirSync as Op,renameSync as no,rmSync as ro,writeFileSync as _p}from"node:fs";import Wp from"node:os";import Qe from"node:path";import{spawn as so,spawnSync as Bp}from"node:child_process";import{chmodSync as _s,mkdirSync as Sp,rmSync as xp,writeFileSync as Ws}from"node:fs";import Cp from"node:os";import eo from"node:path";var Zr=e=>e.replace(/\\/g,"\\\\").replace(/`/g,"\\`").replace(/\$/g,"\\$"),Pp=e=>{let t=e?.trim()||"";if(!t)return null;let n=t.includes("://")?null:/^[^@/]+@([^:/?#]+):/i.exec(t);if(n?.[1])return n[1].toLowerCase();try{return new URL(t).host.toLowerCase()}catch{return null}},vp=e=>{let t=Pp(e);if(!t)return null;try{return new URL(`ssh://${t}`).hostname.toLowerCase()}catch{return t.toLowerCase().replace(/:\d+$/,"")}},Bs=e=>{let t=vp(e);return t?t==="github.com"||t.endsWith(".github.com")?"github":t==="gitlab.com"||t.endsWith(".gitlab.com")||t.includes("gitlab")?"gitlab":"generic":null},Ep=(e,t)=>{let n=t.provider??Bs(e);return n==="github"?"x-access-token":n==="gitlab"?"oauth2":t.email?.trim()||t.name?.trim()||"git"},Ip=e=>{let t=Bs(e);return t==="github"?"GitHub":t==="gitlab"?"GitLab":"Git"},bp=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(n=>t.includes(n)):!1},V=(e,t)=>{let n=e instanceof Error?e.message:typeof e=="string"?e:"";if(!bp(n))return e instanceof Error?e:new Error(n||"Git \u64CD\u4F5C\u5931\u8D25\u3002");let r=Ip(t);return new Error(`\u5F53\u524D\u51ED\u8BC1\u65E0\u6CD5\u8BBF\u95EE ${r} \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`)},Rp=(e,t,n)=>{let r=Ep(n,t),o=t.credentialToken||"",i=eo.join(e,"git-askpass.js"),s=`#!/usr/bin/env node
43
37
  const prompt = (process.argv[2] || '').toLowerCase()
44
38
  if (prompt.includes('username')) {
45
- process.stdout.write(\`${Yo(n)}\`)
39
+ process.stdout.write(\`${Zr(r)}\`)
46
40
  process.exit(0)
47
41
  }
48
42
  if (prompt.includes('password')) {
49
- process.stdout.write(\`${Yo(o)}\`)
43
+ process.stdout.write(\`${Zr(o)}\`)
50
44
  process.exit(0)
51
45
  }
52
- process.stdout.write(\`${Yo(o)}\`)
53
- `;return Za(s,i,{encoding:"utf8",mode:448}),Qa(s,448),s},ng=e=>`ssh -i "${e}" -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null`,og=new Set(["EDITOR","GIT_ASKPASS","GIT_CONFIG","GIT_CONFIG_COUNT","GIT_CONFIG_GLOBAL","GIT_CONFIG_SYSTEM","GIT_EDITOR","GIT_EXEC_PATH","GIT_EXTERNAL_DIFF","GIT_PAGER","GIT_PROXY_COMMAND","GIT_SEQUENCE_EDITOR","GIT_SSH","GIT_SSH_COMMAND","GIT_TEMPLATE_DIR","PAGER","PREFIX","SSH_ASKPASS"]),sg=e=>{let t=e.toUpperCase();return og.has(t)||t.startsWith("GIT_CONFIG_KEY_")||t.startsWith("GIT_CONFIG_VALUE_")},Zo=(e=process.env)=>{let t={};for(let[r,n]of Object.entries(e))n!==void 0&&!sg(r)&&(t[r]=n);return t},Dt=e=>{let t={};return(e?.GIT_ASKPASS||e?.SSH_ASKPASS)&&(t.allowUnsafeAskPass=!0),(e?.GIT_SSH||e?.GIT_SSH_COMMAND)&&(t.allowUnsafeSshCommand=!0),Object.keys(t).length>0?{unsafe:t}:{}},tc=e=>{let t=Qo.join(Xf.tmpdir(),"vibemux-git",e.taskId);Jf(t,{recursive:!0});let r=Zo();if(r.GIT_TERMINAL_PROMPT="0",e.identity.authMode==="ssh"&&e.identity.credentialToken){let n=Qo.join(t,"id_ed25519");Za(n,e.identity.credentialToken,{encoding:"utf8",mode:384}),Qa(n,384),r.GIT_SSH_COMMAND=ng(n)}else e.identity.credentialToken&&(r.GIT_ASKPASS=rg(t,e.identity,e.repoUrl));return{env:r,tempDir:t,cleanup(){Kf(t,{recursive:!0,force:!0})}}};var ug=e=>new Promise(t=>setTimeout(t,e)),rs=!1,ns=null,dg=()=>rc(Qr())&&rc(ur()),pg=()=>{let e=it().name?.trim()||"";return e==="vibemux-worker"||e==="vibemux-worker-preview"},mg=()=>process.platform==="win32"?"npx.cmd":"npx",fg=()=>{let e=process.env.VIBEMUX_WORKER_RESTART_STRATEGY?.trim().toLowerCase();return e==="pm2"||e==="supervisor"?!0:!!process.env.pm_id?.trim()},gg=(e,t)=>{let r=Zo(process.env);os(mg(),["-y",`${e}@${t}`,"daemon"],{detached:!0,stdio:"ignore",env:r}).unref()},hg=async e=>{for(let t=0;t<120;t+=1)try{process.kill(e,0),await ug(500)}catch{return}throw new Error(`\u7B49\u5F85\u65E7 Worker \u9000\u51FA\u8D85\u65F6: ${e}`)},yg=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=mt.join(cg.tmpdir(),"vibemux-worker-updates");nc(n,{recursive:!0});let o=mt.join(n,`worker-${Date.now()}.tar.gz`);return ag(o,r),o},kg=(e,t)=>{let r=lg("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")},wg=e=>{os(mt.join(e,"bin","vibemux-worker"),["daemon"],{detached:!0,stdio:"ignore"}).unref()},En=async e=>{let t=e??await dt();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"}:pg()?fg()?{ok:!0,applied:!0,currentVersion:t.currentVersion,latestVersion:t.latestVersion,message:`\u68C0\u6D4B\u5230\u65B0\u7248\u672C ${t.latestVersion}\uFF0C\u5373\u5C06\u9000\u51FA\u5E76\u4EA4\u7ED9\u5916\u90E8 supervisor \u91CD\u542F\u3002`}:(gg(t.packageName,t.latestVersion),{ok:!0,applied:!0,currentVersion:t.currentVersion,latestVersion:t.latestVersion,message:`\u5DF2\u5F00\u59CB\u901A\u8FC7 npx \u5207\u6362\u5230 ${t.latestVersion}\uFF0CWorker \u5373\u5C06\u91CD\u542F\u3002`}):{ok:!1,applied:!1,currentVersion:t.currentVersion,latestVersion:t.latestVersion,message:"\u5F53\u524D\u4E0D\u662F npm Worker \u5B89\u88C5\u65B9\u5F0F\uFF0C\u65E0\u6CD5\u901A\u8FC7 npx \u81EA\u52A8\u66F4\u65B0\u3002"};if(!dg())return{ok:!1,applied:!1,currentVersion:t.currentVersion,latestVersion:t.latestVersion,message:"\u5F53\u524D\u4E0D\u662F\u4FBF\u643A Worker \u5B89\u88C5\u76EE\u5F55\uFF0C\u65E0\u6CD5\u6267\u884C\u81EA\u66F4\u65B0\u3002"};let r=await yg(t.asset.url);return os(process.execPath,[ur(),"apply-update-internal",r,ie(),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`}},ss=async e=>{let t=process.env.VIBEMUX_WORKER_AUTO_UPDATE?.trim().toLowerCase();if(t==="0"||t==="false"||t==="off"||rs)return!1;rs=!0;try{let r=e??await dt();return!r.ok||!r.available||!r.latestVersion?(ns=null,!1):ns===r.latestVersion?!1:(ns=r.latestVersion,console.log(`[worker] \u68C0\u6D4B\u5230\u65B0\u7248\u672C ${r.latestVersion}\uFF0C\u5F53\u524D\u4EC5\u63D0\u793A\uFF0C\u4E0D\u4F1A\u81EA\u52A8\u5347\u7EA7\u6216\u9000\u51FA\u3002`),!0)}finally{rs=!1}},oc=async(e,t,r)=>{await hg(r);let n=mt.dirname(t),o=mt.join(n,`.vibemux-worker-stage-${Date.now()}`),s=mt.join(n,`.vibemux-worker-backup-${Date.now()}`);nc(o,{recursive:!0}),kg(e,o);let[i]=ig(o);if(!i)throw new Error("\u66F4\u65B0\u5305\u5185\u5BB9\u4E3A\u7A7A");let a=mt.join(o,i);es(t,s);try{es(a,t)}catch(c){throw es(s,t),c}wg(t),ts(s,{recursive:!0,force:!0}),ts(o,{recursive:!0,force:!0}),ts(e,{force:!0})};var vg=e=>new URL(e.url||"/","http://127.0.0.1"),sc=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"))},H=(e,t,r)=>{e.statusCode=t,e.setHeader("Content-Type","application/json; charset=utf-8"),e.setHeader("Cache-Control","no-store"),e.end(`${JSON.stringify(r)}
54
- `)},Pg=(e,t)=>{let r=is.extname(t),n=r===".css"?"text/css; charset=utf-8":r===".js"?"application/javascript; charset=utf-8":r===".map"?"application/json; charset=utf-8":"text/html; charset=utf-8";e.statusCode=200,e.setHeader("Content-Type",n),e.end(xg(t))},Eg=e=>{let t=Qi(),r=e==="/"?is.join(t,"index.html"):is.join(t,e.replace(/^\//,""));return r.startsWith(t)?r:null},bg=(e,t)=>{let r=Eg(e);if(!r||!Sg(r)){H(t,404,{message:"not found"});return}Pg(t,r)},Ig=()=>{let e=gr(),t=C();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}},Tg=e=>e==="claude"||e==="opencode"||e==="codex"||e==="pi"?e:null,Rg=()=>{let e=C(),t=e.mcpServers??[],r=!!e.executorToken?.trim(),n=t.map(c=>{let l=lt([c],{cloudUrl:e.cloudUrl,executorToken:e.executorToken,actingUserId:c.target===ct&&r?"__dynamic__":void 0}),d=Object.keys(l)[0],u=d?l[d]:null,p=c.target===ct;return{id:c.id,name:c.name,target:c.target,transport:c.transport,capabilityMode:c.capabilityMode,enabled:c.enabled,materialized:!!u,kind:p?"builtin":c.transport==="stdio"||c.target.startsWith("stdio://")?"stdio":c.transport==="http"||c.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(c=>c.enabled),i=!!n.find(c=>c.target===ct)?.enabled,a=i&&r;return{configuredCount:n.length,enabledCount:o.length,materializedCount:o.filter(c=>c.materialized).length,builtinEnabled:i,builtinReady:a,actingUserMode:i?a?"request-scoped":"pairing-required":"disabled",servers:n}},_g=(e,t)=>e.code==="EADDRINUSE"?`Local console port ${t} is already in use. Set VIBEMUX_WORKER_PORT and try again.`:e.code==="EPERM"?`The worker does not have permission to listen on local console port ${t}. Choose a different VIBEMUX_WORKER_PORT or check system permissions.`:`Failed to start the local console: ${e.message||"listen failed"}`,Ag=()=>{setTimeout(()=>{try{process.kill(process.pid,"SIGTERM")}catch{process.exit(0)}},250)},as=()=>{let e=C(),t=zo(),r=Cg.createServer(async(n,o)=>{try{let s=vg(n);if(n.method==="GET"&&(s.pathname==="/"||s.pathname.startsWith("/assets/"))){bg(s.pathname,o);return}if(n.method==="GET"&&(s.pathname==="/health"||s.pathname==="/api/health")){H(o,200,Ig());return}if(n.method==="GET"&&s.pathname==="/api/config"){H(o,200,{config:C()});return}if(n.method==="GET"&&s.pathname==="/api/status"){H(o,200,{runtime:Mt(),mcp:Rg()});return}if(n.method==="GET"&&s.pathname==="/api/doctor"){H(o,200,await Ut());return}if(n.method==="GET"&&s.pathname==="/api/agent-sessions"){H(o,200,vn());return}if(n.method==="GET"&&s.pathname==="/api/agent-sessions/detail"){let i=Tg(s.searchParams.get("source")),a=s.searchParams.get("id")?.trim();if(!i||!a){H(o,400,{message:"source and id are required"});return}let c=Pn(i,a);if(!c){H(o,404,{message:"session not found"});return}H(o,200,{session:c});return}if(n.method==="GET"&&s.pathname==="/api/update"){H(o,200,await dt());return}if(n.method==="POST"&&s.pathname==="/api/bootstrap-runtime"){let i=await we({autoInstall:!0,target:"all"});H(o,200,{report:i,doctor:await Ut()});return}if(n.method==="PUT"&&s.pathname==="/api/config"){let i=await sc(n),a={...C(),...i};be(a),D({config:a,paired:!!(a.executorId&&a.executorToken),executorId:a.executorId}),H(o,200,{config:a,message:"saved"});return}if(n.method==="POST"&&s.pathname==="/api/pair"){let i=await sc(n),a=C(),c=Et(i.pairingCode);if(Kr(i.pairingCode,a)){let u={...a,executorName:i.name?.trim()||a.executorName?.trim()||`worker-${process.pid}`};be(u),D({paired:!0,executorId:u.executorId,config:u,daemonMode:"starting"}),bn(),H(o,200,{config:u,message:`${Xr()} Connecting to the control plane.`});return}let l;try{l=await lr({pairingCode:i.pairingCode,machineId:a.machineId,machineName:a.machineName,name:i.name?.trim()||`worker-${process.pid}`,workspaceRoot:a.workspaceRoot,maxConcurrency:a.maxConcurrency,labels:a.labels,capabilities:a.capabilities,platform:process.platform,version:ue()},a.cloudUrl)}catch(u){let p=u instanceof Error?u.message:"Pair request failed.";H(o,400,{message:Yr(p,bt(a))});return}let d={...a,executorName:i.name?.trim()||`worker-${process.pid}`,executorId:l.executorId,executorToken:l.executorToken,lastPairedPairingCode:c};be(d),D({paired:!0,executorId:l.executorId,config:d,daemonMode:"starting"}),bn(),H(o,200,{config:d,executor:l.executor,message:"Pairing complete. Connecting to the control plane."});return}if(n.method==="POST"&&s.pathname==="/api/reset"){cn(),D({daemonMode:"idle",paired:!1,connected:!1,executorId:void 0,config:C(),runningTaskIds:[],queuedTaskIds:[],lastError:void 0}),H(o,200,{config:C(),message:"reset"});return}if(n.method==="POST"&&s.pathname==="/api/disconnect"){ic(),H(o,200,{runtime:Mt(),message:"Disconnected from the control plane."});return}if(n.method==="POST"&&s.pathname==="/api/connect"){bn(),H(o,200,{runtime:Mt(),message:"Control plane connection requested."});return}if(n.method==="POST"&&s.pathname==="/api/update"){let i=await En();H(o,i.applied?202:200,i),i.applied&&Ag();return}H(o,404,{message:"not found"})}catch(s){H(o,500,{message:s instanceof Error?s.message:"worker local server error"})}});return r.once("error",n=>{let o=_g(n,e.localServerPort);D({daemonMode:"disconnected",connected:!1,lastError:o}),console.error(`[worker] ${o}`),process.exitCode=1,setTimeout(()=>process.exit(1),20)}),r.listen(e.localServerPort,t,()=>{let n=hr(e.localServerPort),o=t==="127.0.0.1"?"":` (listening on ${t})`;console.log(`[worker] local console ${n}${o}`)}),r};var Mg=new Set(["connection","keep-alive","proxy-authenticate","proxy-authorization","te","trailer","transfer-encoding","upgrade","host","content-length"]),ac=32*1024,$t=new Map,cs=new Map,In=()=>new Date().toISOString(),wr=(e,t)=>`${e}:${t}`,Tn=(e,t)=>{e.send(JSON.stringify(t))},Og=e=>!e||e==="/"?"":e.endsWith("/")?e.slice(0,-1):e,Bg=(e,t)=>{let r=Og(e);return!r||t===r||t.startsWith(`${r}/`)?t||"/":`${r}${t||"/"}`},Wg=(e,t)=>{let r=new URL(e),n=new URL(t,r);return n.pathname=Bg(r.pathname,n.pathname),n.toString()},Ng=e=>{let t=new Headers;for(let[r,n]of e)Mg.has(r.toLowerCase())||t.set(r,n);return t},Dg=e=>{let t={type:"preview.http.response.body",previewSessionId:e.previewSessionId,streamId:e.streamId,sentAt:In(),seq:e.seq,encoding:"base64",data:Buffer.from(e.chunk).toString("base64")};Tn(e.socket,t)},Ug=e=>{let t=[],r=e.headers.getSetCookie;e.headers.forEach((n,o)=>{o.toLowerCase()!=="set-cookie"&&t.push([o,n])});for(let n of r?.call(e.headers)??[])t.push(["set-cookie",n]);return t},$g=e=>{Lg(e)},Lg=async e=>{let t=wr(e.previewSessionId,e.streamId),r=new AbortController;cs.set(t,r);try{let n=e.request.hasBody?new ReadableStream({start(a){e.request.bodyController=a}}):void 0,o=await fetch(Wg(e.targetUrl,e.request.pathWithQuery),{method:e.request.method,headers:Ng(e.request.headers),body:n,duplex:n?"half":void 0,signal:r.signal}),s={type:"preview.http.response.start",previewSessionId:e.previewSessionId,streamId:e.streamId,sentAt:In(),status:o.status,headers:Ug(o)};if(Tn(e.socket,s),o.body){let a=o.body.getReader(),c=0;for(;;){let{done:l,value:d}=await a.read();if(l)break;let u=d??new Uint8Array(0);for(let p=0;p<u.byteLength;p+=ac)Dg({socket:e.socket,previewSessionId:e.previewSessionId,streamId:e.streamId,chunk:u.subarray(p,p+ac),seq:c}),c+=1}}let i={type:"preview.http.response.end",previewSessionId:e.previewSessionId,streamId:e.streamId,sentAt:In()};Tn(e.socket,i)}catch(n){let o={type:"preview.http.abort",previewSessionId:e.previewSessionId,streamId:e.streamId,sentAt:In(),code:r.signal.aborted?"client_closed":"upstream_connect_failed",message:n instanceof Error?n.message:"local preview upstream request failed"};Tn(e.socket,o)}finally{cs.delete(t)}},Sr={handleStart(e){let t={method:e.frame.method,pathWithQuery:e.frame.pathWithQuery,headers:e.frame.headers,hasBody:e.frame.hasBody};$t.set(wr(e.frame.previewSessionId,e.frame.streamId),t),$g({socket:e.socket,previewSessionId:e.frame.previewSessionId,streamId:e.frame.streamId,targetUrl:e.frame.targetUrl||e.targetUrl,request:t})},handleBody(e){let t=$t.get(wr(e.previewSessionId,e.streamId));t&&t.bodyController?.enqueue(Buffer.from(e.data,"base64"))},handleEnd(e){let t=wr(e.frame.previewSessionId,e.frame.streamId),r=$t.get(t);r&&($t.delete(t),r.bodyController?.close())},abort(e,t){let r=wr(e,t),n=$t.get(r);$t.delete(r);try{n?.bodyController?.error(new Error("preview request aborted"))}catch{}cs.get(r)?.abort()}};var iy=Ve(rl(),1),ay=Ve(Dn(),1),cy=Ve(Ft(),1),ly=Ve(ws(),1),uy=Ve(Cs(),1),dy=Ve(Ts(),1),Gn=Ve(jn(),1),py=Ve(ul(),1);var ge=new Map,Jt=()=>new Date().toISOString(),_s=(e,t)=>`${e}:${t}`,my=e=>!e||e==="/"?"":e.endsWith("/")?e.slice(0,-1):e,fy=(e,t)=>{let r=my(e);return!r||t===r||t.startsWith(`${r}/`)?t||"/":`${r}${t||"/"}`},gy=(e,t)=>{let r=new URL(e),n=new URL(t,r);return n.protocol=r.protocol==="https:"?"wss:":"ws:",n.pathname=fy(r.pathname,n.pathname),n.toString()},hy=e=>{let t={};for(let[r,n]of e)t[r]=n;return t},Tr=(e,t)=>{e.send(JSON.stringify(t))},yy=e=>{if(!e.queuedFrames.length)return;let t=[...e.queuedFrames];e.queuedFrames.length=0;for(let r of t){if(r.opcode==="binary"){e.socket.send(Buffer.from(r.data,"base64"));continue}e.socket.send(r.data)}},qn=e=>{let t=_s(e.previewSessionId,e.streamId),r=ge.get(t);if(r){if(ge.delete(t),e.notifyRemote!==!1){let n={type:"preview.ws.close",previewSessionId:e.previewSessionId,streamId:e.streamId,sentAt:Jt(),code:e.code,reason:e.reason};Tr(r.tunnelSocket,n)}try{r.closedByControl=!0,r.socket.close(e.code,e.reason)}catch{r.socket.close()}}},ky=e=>Buffer.isBuffer(e)?e.toString("base64"):Array.isArray(e)?Buffer.concat(e).toString("base64"):Buffer.from(e).toString("base64"),wy=e=>typeof e=="string"?e:Buffer.isBuffer(e)?e.toString("utf8"):Array.isArray(e)?Buffer.concat(e).toString("utf8"):Buffer.from(new Uint8Array(e)).toString("utf8"),Kt={open(e){let t=_s(e.frame.previewSessionId,e.frame.streamId);qn({previewSessionId:e.frame.previewSessionId,streamId:e.frame.streamId,notifyRemote:!1});let r=new Gn.default(gy(e.frame.targetUrl||e.targetUrl,e.frame.pathWithQuery),e.frame.subprotocols.length>0?e.frame.subprotocols:void 0,{headers:hy(e.frame.headers)}),n={previewSessionId:e.frame.previewSessionId,streamId:e.frame.streamId,socket:r,tunnelSocket:e.socket,opened:!1,nextSeq:0,queuedFrames:[],closedByControl:!1};ge.set(t,n),r.on("open",()=>{let o=ge.get(t);if(!o)return;o.opened=!0;let s={type:"preview.ws.opened",previewSessionId:o.previewSessionId,streamId:o.streamId,sentAt:Jt(),accepted:!0,selectedSubprotocol:o.socket.protocol||void 0};Tr(o.tunnelSocket,s),yy(o)}),r.on("message",(o,s)=>{let i=ge.get(t);if(!i)return;let a=s?{type:"preview.ws.data",previewSessionId:i.previewSessionId,streamId:i.streamId,sentAt:Jt(),seq:i.nextSeq,opcode:"binary",encoding:"base64",data:ky(o)}:{type:"preview.ws.data",previewSessionId:i.previewSessionId,streamId:i.streamId,sentAt:Jt(),seq:i.nextSeq,opcode:"text",encoding:"utf8",data:wy(o)};i.nextSeq+=1,Tr(i.tunnelSocket,a)}),r.on("close",(o,s)=>{let i=ge.get(t);if(!i||(ge.delete(t),i.closedByControl))return;let a={type:"preview.ws.close",previewSessionId:i.previewSessionId,streamId:i.streamId,sentAt:Jt(),code:o||void 0,reason:s.toString()||void 0};Tr(i.tunnelSocket,a)}),r.on("error",()=>{let o=ge.get(t);if(o&&!o.opened){ge.delete(t);let s={type:"preview.ws.opened",previewSessionId:o.previewSessionId,streamId:o.streamId,sentAt:Jt(),accepted:!1,status:502,message:"local preview websocket connect failed"};Tr(o.tunnelSocket,s)}})},handleData(e){let t=ge.get(_s(e.previewSessionId,e.streamId));if(t){if(!t.opened||t.socket.readyState!==Gn.default.OPEN){t.queuedFrames.push(e);return}if(e.opcode==="binary"){t.socket.send(Buffer.from(e.data,"base64"));return}t.socket.send(e.data)}},handleClose(e){qn({previewSessionId:e.previewSessionId,streamId:e.streamId,code:e.code,reason:e.reason,notifyRemote:!1})},closePreviewSession(e,t){for(let r of ge.values())r.previewSessionId===e&&qn({previewSessionId:r.previewSessionId,streamId:r.streamId,code:1001,reason:t,notifyRemote:!1})},closeAll(e){for(let t of ge.values())qn({previewSessionId:t.previewSessionId,streamId:t.streamId,code:1001,reason:e,notifyRemote:!1})}};var Fe=new Map,As=()=>new Date().toISOString(),Sy=e=>JSON.parse(e),Xt=e=>{e.send({type:"preview.tunnel.status",executorId:e.executorId,previewSessionId:e.previewSessionId,status:e.status,message:e.message,at:As()})},zn=(e,t)=>{let r=Fe.get(e);if(r){Kt.closePreviewSession(e,t),r.closedByManager=!0;try{r.socket.close(1e3,t)}catch{r.socket.close()}Fe.delete(e)}},xy=e=>{if(e.frame.type==="preview.bind.ack"){let t=e.frame;if(!t.accepted){Xt({send:e.send,executorId:e.connection.executorId,previewSessionId:e.connection.previewSessionId,status:"error",message:t.reason||"preview tunnel bind rejected"}),zn(e.connection.previewSessionId,t.reason||"preview bind rejected");return}Xt({send:e.send,executorId:e.connection.executorId,previewSessionId:e.connection.previewSessionId,status:"open"});return}if(e.frame.type==="preview.tunnel.ping"){let t=e.frame;e.connection.socket.send(JSON.stringify({type:"preview.tunnel.pong",previewSessionId:e.connection.previewSessionId,sentAt:As(),pingId:t.pingId}));return}if(e.frame.type==="preview.http.request.start"){Sr.handleStart({frame:e.frame,socket:e.connection.socket,targetUrl:e.connection.targetUrl});return}if(e.frame.type==="preview.http.request.body"){Sr.handleBody(e.frame);return}if(e.frame.type==="preview.http.request.end"){Sr.handleEnd({frame:e.frame});return}if(e.frame.type==="preview.http.abort"){Sr.abort(e.frame.previewSessionId,e.frame.streamId);return}if(e.frame.type==="preview.ws.open"){Kt.open({frame:e.frame,socket:e.connection.socket,targetUrl:e.connection.targetUrl});return}if(e.frame.type==="preview.ws.data"){Kt.handleData(e.frame);return}e.frame.type==="preview.ws.close"&&Kt.handleClose(e.frame)},Yt={open(e,t,r){zn(e.previewSessionId,"replaced"),Xt({send:r,executorId:t.executorId,previewSessionId:e.previewSessionId,status:"connecting"});let o=`${e.tunnelUrl?.trim()||Vi(t.cloudUrl)}?preview_session_id=${encodeURIComponent(e.previewSessionId)}&token=${encodeURIComponent(e.tunnelToken)}`,s=new WebSocket(o),i={socket:s,previewSessionId:e.previewSessionId,executorId:t.executorId,closedByManager:!1,targetUrl:e.targetUrl};Fe.set(e.previewSessionId,i),s.addEventListener("open",()=>{let a=Fe.get(e.previewSessionId);if(!a||a.socket!==s)return;let c={type:"preview.bind",previewSessionId:e.previewSessionId,sentAt:As(),protocolVersion:"preview-tunnel.v1",executorId:t.executorId};s.send(JSON.stringify(c))}),s.addEventListener("message",a=>{let c=Fe.get(e.previewSessionId);if(!(!c||c.socket!==s))try{xy({frame:Sy(String(a.data)),connection:c,send:r})}catch(l){Xt({send:r,executorId:t.executorId,previewSessionId:e.previewSessionId,status:"error",message:l instanceof Error?l.message:"invalid preview tunnel frame"})}}),s.addEventListener("error",()=>{let a=Fe.get(e.previewSessionId);!a||a.socket!==s||Xt({send:r,executorId:t.executorId,previewSessionId:e.previewSessionId,status:"error",message:"preview tunnel websocket error"})}),s.addEventListener("close",a=>{let c=Fe.get(e.previewSessionId);!c||c.socket!==s||(Fe.delete(e.previewSessionId),Xt({send:r,executorId:t.executorId,previewSessionId:e.previewSessionId,status:"closed",message:c.closedByManager?void 0:a.reason?.trim()||`code=${a.code}`}))})},close(e,t){zn(e,t)},closeAll(e){Kt.closeAll(e);for(let t of Fe.keys())zn(t,e)}};import{accessSync as Cy,constants as vy,mkdirSync as Py}from"node:fs";var Ey=()=>Je()==="preview"?"vibemux-worker-preview":"vibemux-worker",by=e=>{try{return Py(e,{recursive:!0}),Cy(e,vy.W_OK),{ok:!0,detail:`Writable: ${e}`}}catch(t){return{ok:!1,detail:t instanceof Error?t.message:"path access failed"}}},Iy=e=>{try{return{ok:!0,detail:`Ready: ${wn(e).root}`}}catch(t){return{ok:!1,detail:t instanceof Error?t.message:"workspace setup failed"}}},Ty=async e=>{try{let t=await fetch(e,{method:"GET",signal:AbortSignal.timeout(5e3)});return{ok:!0,status:t.status,message:`Control plane reachable, HTTP ${t.status}`}}catch(t){return{ok:!1,status:void 0,message:t instanceof Error?t.message:"cloud probe failed"}}},Ry=async()=>{try{let e=await fetch("https://opencode.ai",{method:"GET",signal:AbortSignal.timeout(5e3)});return{ok:e.ok,status:e.status,url:"https://opencode.ai",message:e.ok?`Official site reachable, HTTP ${e.status}`:`Official site returned an unexpected status, HTTP ${e.status}`}}catch(e){return{ok:!1,status:void 0,url:"https://opencode.ai",message:e instanceof Error?e.message:"official site probe failed"}}},_y=e=>{let t=e.filter(n=>n.ok).length,r=e.length-t;return{total:e.length,passed:t,failed:r,ok:r===0}},dl=async()=>{let e=C(),[t,r,n]=await Promise.all([Ty(e.cloudUrl),Ry(),we({target:"all"})]),o=by(Ee()),s=Iy(e.workspaceRoot),i=n.items.find(w=>w.id==="git")??{ok:!1,detail:"Git status is unknown."},a=n.items.find(w=>w.id==="opencode")??{ok:!1,detail:"OpenCode runtime status is unknown."},c=n.items.find(w=>w.id==="codex-cli")??{ok:!1,detail:"Codex CLI status is unknown."},l=n.items.find(w=>w.id==="codex-auth")??{ok:!1,detail:"Codex sign-in status is unknown."},d=n.items.find(w=>w.id==="claude-cli")??{ok:!1,detail:"Claude Code CLI status is unknown."},u=n.items.find(w=>w.id==="claude-auth")??{ok:!1,detail:"Claude Code authentication status is unknown."},p=!!e.opencodeConfigContent?.trim(),m=!!e.codexConfigContent?.trim(),y=!!e.claudeCodeConfigContent?.trim(),g=[{id:"git",category:"tooling",label:"Git",ok:i.ok,detail:i.detail,hint:i.ok?void 0:"Install Git first and confirm it is executable from PATH."},{id:"opencode",category:"tooling",label:"OpenCode Runtime",ok:a.ok,detail:a.detail,hint:a.ok?void 0:"Check the worker dependency installation and confirm both `@opencode-ai/sdk` and the local `opencode` runtime are available."},{id:"codex-cli",category:"tooling",label:"Codex CLI",ok:c.ok,detail:c.detail,hint:c.ok?void 0:"Install the Codex CLI first. The worker can also run `npm install -g @openai/codex` automatically."},{id:"codex-auth",category:"tooling",label:"Codex Sign-In",ok:l.ok,detail:l.detail,hint:l.ok?void 0:"Run `codex` and complete sign-in before trying again."},{id:"claude-cli",category:"tooling",label:"Claude Code CLI",ok:d.ok,detail:d.detail,hint:d.ok?void 0:"Install the Claude Code CLI first. The worker prefers the official native install flow."},{id:"claude-auth",category:"tooling",label:"Claude Code Authentication",ok:u.ok,detail:u.detail,hint:u.ok?void 0:"Configure Claude Console/API credentials, or run `claude` and complete sign-in before trying again."},{id:"opencode-config",category:"config",label:"OpenCode Configuration",ok:p,detail:p?"Loaded the OpenCode providers configuration.":"OpenCode providers configuration was not found.",hint:p?void 0:"Add the OpenCode providers JSON in central settings or on this worker machine."},{id:"codex-config",category:"config",label:"Codex Configuration",ok:m,detail:m?"Loaded `Codex config.toml`.":"`Codex config.toml` was not found.",hint:m?void 0:"Provide it through central settings, or prepare `~/.codex/config.toml` on this worker machine."},{id:"claude-config",category:"config",label:"Claude Code Configuration",ok:y,detail:y?"Loaded `Claude Code settings.json`.":"`Claude Code settings.json` was not found.",hint:y?void 0:"Provide it through central settings, or prepare `~/.claude/settings.json` on this worker machine."},{id:"worker-home",category:"filesystem",label:"Worker Home",ok:o.ok,detail:o.detail,hint:o.ok?void 0:"Check directory permissions and confirm the worker home can be created and written."},{id:"workspace",category:"filesystem",label:"Workspace",ok:s.ok,detail:s.detail,hint:s.ok?void 0:"Confirm the workspace root path is valid and writable by the current user."},{id:"machine-id",category:"config",label:"Machine ID",ok:!!e.machineId,detail:e.machineId?`Configured: ${e.machineId}`:"Machine ID is not configured.",hint:e.machineId?void 0:"Reset the local worker config and start the worker again to generate a fresh machine ID."},{id:"pairing",category:"config",label:"Pairing",ok:!!(e.executorId&&e.executorToken),detail:e.executorId?`Paired: ${e.executorId}`:"Pairing has not been completed.",hint:e.executorId?void 0:`Run \`npx -y ${Ey()} connect --pairing-code <CODE>\`, or enter the pairing code in the local worker console.`},{id:"cloud-url",category:"network",label:"Control Plane URL",ok:!!e.cloudUrl?.trim(),detail:e.cloudUrl?.trim()||"Cloud URL is not configured.",hint:e.cloudUrl?.trim()?void 0:"Enter the control-plane Cloud URL first."},{id:"cloud-reachable",category:"network",label:"Control Plane Reachability",ok:t.ok,detail:t.message,hint:t.ok?void 0:"Confirm the control-plane service is running and reachable from this machine."},{id:"official-site",category:"network",label:"OpenCode Official Site",ok:r.ok,detail:r.message,hint:r.ok?void 0:"If the official site is unreachable, the current network likely has outbound access restrictions."}];return{config:Fo(e),checks:{git:i.ok,opencodeAvailable:a.ok,codexCliAvailable:c.ok,codexAuthenticated:l.ok,claudeCliAvailable:d.ok,claudeAuthenticated:u.ok,opencodeConfigLoaded:p,codexConfigLoaded:m,claudeConfigLoaded:y,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:g,summary:_y(g),cloudProbe:t,officialSiteProbe:r,runtime:Mt()}},Ms=async()=>{console.log(JSON.stringify(await dl(),null,2))},Ut=()=>dl();import{existsSync as Ay,statfsSync as My}from"node:fs";import Ce from"node:os";import pl from"node:path";var ml=null,fl=(e,t=1)=>{let r=10**t;return Math.round(e*r)/r},Oy=()=>Ce.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}),By=()=>{let e=Ce.cpus(),t=Oy(),r=ml;ml=t;let n=e.reduce((s,i)=>s+(Number.isFinite(i.speed)?i.speed:0),0),o=(()=>{if(!r)return;let s=t.total-r.total,i=t.idle-r.idle;if(!(s<=0))return fl((1-i/s)*100,1)})();return{coreCount:e.length,model:e[0]?.model,averageSpeedMhz:e.length>0?Math.round(n/e.length):void 0,loadAverage:Ce.loadavg().map(s=>fl(s,2)),usagePercent:o}},Wy=()=>{let e=Ce.totalmem(),t=Ce.freemem();return{totalBytes:e,freeBytes:t,usedBytes:Math.max(0,e-t)}},Ny=e=>{let t=pl.resolve(e||process.cwd());for(;!Ay(t);){let r=pl.dirname(t);if(r===t)return process.cwd();t=r}return t},Dy=e=>{try{let t=Ny(e),r=My(t),n=Number(r.bsize),o=Number(r.blocks),s=Number(r.bfree),i=Number(r.bavail);if(!Number.isFinite(n)||!Number.isFinite(o)||n<=0||o<=0)return;let a=o*n,c=Math.max(0,s*n),l=Math.max(0,i*n);return{path:t,totalBytes:a,freeBytes:c,availableBytes:l,usedBytes:Math.max(0,a-c)}}catch{return}},Uy=e=>({platform:process.platform,arch:Ce.arch(),hostname:Ce.hostname(),release:Ce.release(),version:typeof Ce.version=="function"?Ce.version():void 0,nodeVersion:process.version,workerVersion:e,systemUptimeSec:Math.max(0,Math.round(Ce.uptime())),processUptimeSec:Math.max(0,Math.round(process.uptime()))}),Hn=e=>({capturedAt:new Date().toISOString(),cpu:By(),memory:Wy(),disk:Dy(e.workspaceRoot),system:Uy(e.workerVersion)});var $y="openai",Os="OPENAI_API_KEY",gl=1e4,Bs=e=>!!e&&typeof e=="object"&&!Array.isArray(e),Qt=e=>typeof e=="string"?e.trim():"",Ly=e=>e.match(/^[A-Za-z0-9_.-]+\s*=\s*["']([^"']+)["']/)?.[1]?.trim()||"",jy=e=>{let t=e.indexOf("/");return t<0?"":e.slice(0,t).trim()},Fy=e=>{if(!e)return"";try{let r=new URL(e).hostname.toLowerCase().split(".").filter(Boolean),n=new Set(["api","www","cn","com","net","org","io","ai"]);return r.find(o=>!n.has(o))||""}catch{return""}},Gy=e=>{let t=e?.trim()||"";if(!t)return{};try{let r=JSON.parse(t);return Bs(r)?r:{}}catch{return{}}},qy=e=>{let t=e??C();return{authContent:sn()||t.codexAuthContent,configContent:on()||t.codexConfigContent,fallbackDefaultModel:t.agentSettings?.Codex?.defaultModel?.trim()||""}},Ws=e=>{let t=(e.configContent?.trim()||"").split(/\r?\n/),r=Gy(e.authContent),n="",o="",s="",i="",a="",c="";for(let p of t){let m=p.trim();if(!m||m.startsWith("#"))continue;let y=m.match(/^\[([^\]]+)\]$/);if(y){n=y[1]?.trim()||"";continue}let w=m.match(/^([A-Za-z0-9_.-]+)\s*=\s*["'][^"']+["']/)?.[1]?.trim()||"",k=Ly(m);if(!(!w||!k)){if(!n){w==="model"?o=k:w==="model_provider"?s=k:(w==="base_url"||w==="openai_base_url")&&(i=k);continue}n===`model_providers.${s}`&&(w==="base_url"?a=k:w==="env_key"&&(c=k))}}let l=s||jy(o)||Fy(a||i)||$y,d=c||Os;return{apiToken:Qt(r[d])||Qt(process.env[d])||Qt(r[Os])||Qt(process.env[Os]),baseUrl:a||i||Qt(process.env.OPENAI_BASE_URL),providerId:l,configuredModel:o}},zy=e=>{let t=e.trim().replace(/\/+$/g,"");return t?t.endsWith("/models")?t:`${t}/models`:""},hl=(e,t,r)=>({id:bo(e,t),label:`${e}/${t}`,providerId:e,modelId:t,isDefault:t===r}),yl=(e,t)=>{let r=new Set;return(t?.trim()?[t.trim(),...e]:e).filter(o=>{let s=o.trim();return!s||r.has(s)?!1:(r.add(s),!0)})},Hy=e=>!Bs(e)||!Array.isArray(e.data)?[]:e.data.map(t=>Bs(t)?Qt(t.id):"").filter(Boolean),Vy=async(e,t={})=>{let r=Ws({authContent:e.authContent,configContent:e.configContent}),n=r.configuredModel||e.fallbackDefaultModel?.trim()||void 0,o=yl(n?[n]:[],n).map(l=>hl(r.providerId,l,n));if(!e.configContent?.trim())return{models:o,defaultModel:n,message:"worker \u672A\u914D\u7F6E Codex \u6A21\u578B\u3002"};let s=zy(r.baseUrl),i=r.apiToken;if(!s||!i)return{models:o,defaultModel:n,message:o.length>0?"Codex provider \u672A\u58F0\u660E\u53EF\u8BFB\u53D6\u7684\u6A21\u578B\u5217\u8868\uFF0C\u5DF2\u56DE\u9000\u4E3A\u5F53\u524D\u9ED8\u8BA4\u6A21\u578B\u3002":"Codex provider \u7F3A\u5C11 Base URL \u6216 API Key\uFF0C\u65E0\u6CD5\u8BFB\u53D6\u6A21\u578B\u5217\u8868\u3002"};let a=new AbortController,c=setTimeout(()=>a.abort(),gl);try{let l=await(t.fetchImpl??fetch)(s,{headers:{Authorization:`Bearer ${i}`},method:"GET",signal:a.signal});if(!l.ok)throw new Error(`HTTP ${l.status}`);let d=await l.json().catch(()=>null),p=yl(Hy(d),n).map(m=>hl(r.providerId,m,n));return{models:p.length>0?p:o,defaultModel:n,message:p.length>0?"\u5DF2\u4ECE Codex provider \u8BFB\u53D6\u6A21\u578B\u5217\u8868\u3002":"Codex provider \u672A\u8FD4\u56DE\u6A21\u578B\u5217\u8868\uFF0C\u5DF2\u56DE\u9000\u4E3A\u5F53\u524D\u9ED8\u8BA4\u6A21\u578B\u3002"}}catch(l){let d=l instanceof Error&&l.name==="AbortError"?`\u8BFB\u53D6 Codex provider \u6A21\u578B\u8D85\u65F6\uFF08>${gl}ms\uFF09\u3002`:l instanceof Error?l.message:"\u8BFB\u53D6 Codex provider \u6A21\u578B\u5931\u8D25\u3002";return{models:o,defaultModel:n,message:o.length>0?`\u8BFB\u53D6 Codex provider \u6A21\u578B\u5931\u8D25\uFF0C\u5DF2\u56DE\u9000\u4E3A\u5F53\u524D\u9ED8\u8BA4\u6A21\u578B\uFF1A${d}`:`\u8BFB\u53D6 Codex provider \u6A21\u578B\u5931\u8D25\uFF1A${d}`}}finally{clearTimeout(c)}},kl=async e=>{let t=qy(e);return Vy(t)};import{createHash as Qy}from"node:crypto";import Zy from"node:net";import{spawn as ek}from"node:child_process";import{createOpencodeClient as Rl}from"@opencode-ai/sdk";var Jy=e=>Array.isArray(e)?e:[],Ky=e=>e.info?.role==="assistant",Ns=e=>e.info?.time?.created??0,Xy=(e,t)=>t===void 0?!0:Ns(e)>=t,Sl=(e,t={})=>e.filter(r=>Ky(r)&&Xy(r,t.promptStartedAtMs)).sort((r,n)=>Ns(n)-Ns(r)),Rr=e=>Jy(e).filter(t=>t.type==="text").map(t=>t.text?.trim()??"").filter(Boolean).join(`
55
-
56
- `),xl=(e,t={})=>{let r=t.preferredMessageId?e.find(s=>s.info?.id===t.preferredMessageId):void 0,n=Rr(r?.parts);if(n)return n;let o=Sl(e,t).find(s=>Rr(s.parts));return o?Rr(o.parts):""},wl=e=>!!e?.info?.time?.completed||!!e?.info?.error,Cl=(e,t={})=>{let r=t.preferredMessageId?e.find(n=>n.info?.id===t.preferredMessageId):void 0;return r&&wl(r)?!0:Sl(e,t).some(n=>wl(n))};var ee=(e,t)=>{console.log(`[worker-opencode] ${e}`,JSON.stringify(t))},ve=e=>{if(e instanceof Error)return e.message;if(typeof e=="string")return e;if(e&&typeof e=="object"){let t=e;if(typeof t.message=="string"&&t.message.trim())return t.message;if(typeof t.data?.message=="string"&&t.data.message.trim())return t.data.message;if(typeof t.error?.message=="string"&&t.error.message.trim())return t.error.message;if(typeof t.error?.data?.message=="string"&&t.error.data.message.trim())return t.error.data.message}return"OpenCode \u6267\u884C\u5931\u8D25\u3002"},Pl=e=>{if(!e)return;let[t,...r]=e.split("/"),n=r.join("/");if(!(!t||!n))return{providerID:t,modelID:n}},vl=e=>Array.isArray(e)?e:[],Yy=e=>Rr(e),El=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:vl(t.parts).map(r=>r.type),textPreview:Yy(vl(t.parts)).slice(0,160)})),Ds=(e,t,r)=>xl(e,{preferredMessageId:t,promptStartedAtMs:r}),Us=(e,t,r)=>Cl(e,{preferredMessageId:t,promptStartedAtMs:r}),bl=e=>[...e.values()].join("").trim(),Il=(e,t)=>{let r=e.get(t);if(r)return r;let n=new Map;return e.set(t,n),n},$s=async e=>new Promise(t=>setTimeout(t,e)),Ls=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 Ls(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}}},Tl=e=>e&&"permissionPolicy"in e?e:void 0;var js=new Map,tk=e=>Object.entries(e??{}).sort(([t],[r])=>t.localeCompare(r)),rk=(e,t)=>Qy("sha1").update(JSON.stringify({config:de(e),runtimeEnv:tk(t)})).digest("hex"),nk=(e,t,r=process.env)=>({...r,...t??{},OPENCODE_CONFIG_CONTENT:JSON.stringify(de(e))}),ok=()=>{let e=re(`${ie()}/node_modules/.bin/opencode`),t=re("opencode")||e;if(t)return{command:t,args:[],detail:t};let r=re("npx");if(r)return{command:r,args:["-y","opencode-ai"],detail:`${r} -y opencode-ai`};throw new Error("\u672A\u68C0\u6D4B\u5230\u53EF\u6267\u884C\u7684 OpenCode runtime\uFF08`opencode`\uFF09\uFF0C\u65E0\u6CD5\u542F\u52A8 OpenCode \u4F1A\u8BDD\u3002")},sk=async()=>new Promise((e,t)=>{let r=Zy.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)})})}),ik=async(e,t)=>{let r=await sk(),n=ok(),o=ek(n.command,[...n.args,"serve","--hostname=127.0.0.1",`--port=${r}`],{env:nk(e,t),stdio:["ignore","pipe","pipe"]});return{url:await new Promise((i,a)=>{let c=setTimeout(()=>{a(new Error(`Timeout waiting for server to start after 15000ms via ${n.detail}`))},15e3),l="",d=!1,u=m=>{d||(d=!0,clearTimeout(c),m())},p=m=>{l+=m.toString();let y=l.split(`
57
- `);for(let g of y){if(!g.startsWith("opencode server listening"))continue;let w=g.match(/on\s+(https?:\/\/[^\s]+)/);if(!w){u(()=>a(new Error(`Failed to parse server url from output: ${g}`)));return}u(()=>i(w[1]));return}};o.stdout?.on("data",p),o.stderr?.on("data",p),o.on("error",m=>{u(()=>a(m))}),o.on("exit",m=>{u(()=>{let y=l.trim();a(new Error(y?`OpenCode server exited with code ${m}: ${y}`:`OpenCode server exited with code ${m}`))})})}),close(){o.kill()}}},_l=async(e,t)=>{let r=rk(e,t),n=js.get(r);if(n)return n;let o=ik(e,t).catch(s=>{throw js.delete(r),s});return js.set(r,o),o},Al=async(e,t,r)=>{let n=await _l(t,r);return Rl({baseUrl:n.url,directory:e})},Ml=async(e,t)=>{let r=await _l(e,t);return Rl({baseUrl:r.url})},Fs=async(e,t,r)=>{ee("session:create:start",{cwd:t,title:r});let n;try{n=await e.session.create({body:{title:r},query:{directory:t}})}catch(o){throw ee("session:create:error",{cwd:t,title:r,error:ve(o)}),o}if(ee("session:create:result",{cwd:t,title:r,hasData:!!n.data,sessionId:n.data?.id,error:"error"in n?n.error:void 0,response:"response"in n?n.response:void 0}),!n.data?.id){let o=ve(n);throw new Error(o==="OpenCode \u6267\u884C\u5931\u8D25\u3002"?"OpenCode \u4F1A\u8BDD\u521B\u5EFA\u5931\u8D25":`OpenCode \u4F1A\u8BDD\u521B\u5EFA\u5931\u8D25\uFF1A${o}`)}return n.data.id},Ol=async(e,t,r,n)=>{let o=r?.trim();if(!o)return Fs(e,t,n);try{return(await e.session.get({path:{id:o},query:{directory:t}})).data?(await e.session.update({path:{id:o},body:{title:n},query:{directory:t}}),o):Fs(e,t,n)}catch{return Fs(e,t,n)}};var ak=(e,t,r)=>({id:`${e}/${t}`,label:`${e}/${t}`,providerId:e,modelId:t,isDefault:r===`${e}/${t}`}),ck=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),lk=(e,t)=>{if(!e||typeof e!="object")return[];let r=e,n=["cloudflare","cf Workers","cf"];return(Array.isArray(r.providers)?r.providers:[...Object.entries(r.providers??{}).map(([s,i])=>({id:i.id||i.name||s,models:i.models})),...Object.entries(r.provider??{}).map(([s,i])=>({id:i.id||i.name||s,models:i.models}))]).filter(s=>{let i=s.id?.toLowerCase()??"";return!n.some(a=>i.includes(a.toLowerCase()))}).flatMap(s=>{let i=s.id;return i?ck(s.models).map(a=>ak(i,a,t)):[]}).sort((s,i)=>s.isDefault?-1:i.isDefault?1:s.label.localeCompare(i.label))},Gs=async()=>{let e=C(),t=an(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 Ml(t)).config.providers(),s="data"in o?o.data:o,i=Object.entries(s?.default??{}).find(([,c])=>!!c),a=i?`${i[0]}/${i[1]}`:r;return{models:lk(s,a),defaultModel:a,message:void 0}}catch(n){return ee("models:error",{error:ve(n)}),{models:[],defaultModel:r,message:ve(n)}}};import{existsSync as uk}from"node:fs";var Bl=e=>{let t=e,r=t.payload&&typeof t.payload=="object"?t.payload:t;return!r.type||!r.properties?null:{type:r.type,properties:r.properties}};var Wl=500,Nl=12e4,Dl=1e3,dk=async(e,t,r)=>{try{let n=await e.session.messages({path:{id:r},query:{directory:t,limit:20}});return El(Array.isArray(n.data)?n.data:[])}catch(n){return[{snapshotError:ve(n)}]}},pk=e=>{let r={...de(e.baseConfigContent)},n=e.agent?.trim()||void 0,o=Ls(e.permissionPolicy),s=e.variant?.trim()||void 0;if(n&&typeof r.default_agent!="string"&&(r.default_agent=n),!o&&!s)return JSON.stringify(r);if(!n)return o&&(r.permission=o),JSON.stringify(r);let i=r.agent&&typeof r.agent=="object"&&!Array.isArray(r.agent)?r.agent:{},a=i[n];return r.agent={...i,[n]:a&&typeof a=="object"&&!Array.isArray(a)?{...a,...o?{permission:o}:{},...s?{variant:s}:{}}:{...o?{permission:o}:{},...s?{variant:s}:{}}},JSON.stringify(r)},mk=e=>{let t=C(),r=Tl(e.agentSettings),n=e.opencodeConfig?.agent?.trim()||r?.agent?.trim()||void 0,o=e.opencodeConfig?.variant?.trim()||void 0,s=e.opencodeConfig?.permissionPolicy?.trim()||r?.permissionPolicy?.trim()||void 0,i=e.executionModel?.trim()||e.opencodeConfig?.model?.trim()||r?.defaultModel?.trim()||void 0,a=Array.isArray(e.mcpServers),l=[...e.mcpServers??t.mcpServers??[],...e.opencodeConfig?.mcpServers??[]],d=a||e.opencodeConfig?.mcpServers?.length?en(t.opencodeConfigContent,l,{cloudUrl:t.cloudUrl,executorToken:t.executorToken,actingUserId:e.actingUserId}).trim():an(t,e.actingUserId).trim();return{agent:n,variant:o,executionModel:i,configContent:pk({baseConfigContent:d,agent:n,permissionPolicy:s,variant:o})}},Ul=e=>{let t=e instanceof Error?e.message:typeof e=="string"?e:"";return/\babort(ed|ing)?\b/i.test(t)},fk=(e,t)=>{let r=e?.data;if(!(!r||typeof r!="object"))return t in r?r[t]:void 0},$l=async e=>{if(!uk(e.cwd))throw new Error(`\u5DE5\u4F5C\u76EE\u5F55\u4E0D\u5B58\u5728: ${e.cwd}`);let t=mk({actingUserId:e.actingUserId,executionModel:e.executionModel,agentSettings:e.agentSettings,opencodeConfig:e.opencodeConfig,mcpServers:e.mcpServers}),r=await Al(e.cwd,t.configContent,e.runtimeEnv),n=await Ol(r,e.cwd,e.resumeSessionId,e.title),o=Date.now(),s=!1,i=null,a=new Map,c=!1,l="",d=new AbortController,u=new Set,p=new Map,m=new Map,y="",g=!1,w=!1,k=()=>{s=!0,d.abort(),r.session.abort({path:{id:n},query:{directory:e.cwd}}).catch(()=>{})};e.signal?.addEventListener("abort",k,{once:!0});try{let E=(v,I)=>v.sessionID&&v.sessionID!==n||v.role!=="assistant"||!v.id?!1:(l=v.id,c=!0,I==="stream"&&ee("event:message-updated",{sessionId:n,assistantMessageId:l,role:v.role}),!0),b=(v,I)=>v.sessionID&&v.sessionID!==n||(!l&&v.messageID&&(l=v.messageID),l&&v.messageID&&v.messageID!==l)?!1:(c=!0,I==="stream"&&ee("event:message-part",{sessionId:n,assistantMessageId:l,partId:v.id,messageId:v.messageID,partType:v.type,textPreview:(v.text??"").slice(0,120)}),v.type==="text"&&v.messageID&&v.id&&Il(a,v.messageID).set(v.id,v.text??""),!0),T=(v,I)=>{let P=I?.type?JSON.stringify(I):"";P&&P!==y&&(y=P,e.onEvent?.({type:"session.status",properties:{sessionID:n,status:I}}));let O=v.filter(S=>S.info?.role==="assistant"&&S.info?.id).sort((S,f)=>(S.info?.time?.created??0)-(f.info?.time?.created??0));for(let S of O){let f=S.info;if(f?.id){u.has(f.id)||(u.add(f.id),e.onEvent?.({type:"message.updated",properties:{info:f}})),E(f,"snapshot");for(let h of S.parts??[]){if(h.type!=="text"&&h.type!=="reasoning"&&h.type!=="tool")continue;let x=h.id?h:{...h,id:`${S.info?.id}:${h.type}:${h.tool??"part"}`},F=JSON.stringify({type:x.type,text:x.text??"",tool:x.tool??"",state:x.state??null,time:x.time??null});if(p.get(x.id)===F)continue;p.set(x.id,F);let vt=m.get(x.id)??"",Pe=x.text??"";(x.type==="text"||x.type==="reasoning")&&m.set(x.id,Pe);let Pt=Pe&&Pe.startsWith(vt)?Pe.slice(vt.length):void 0;e.onEvent?.({type:"message.part.updated",properties:Pt===void 0?{part:x}:{part:x,delta:Pt}}),b(x,"snapshot")}}}},N=async()=>{for(;!w&&!s&&!e.signal?.aborted&&Date.now()-o<Nl;){try{let[v,I]=await Promise.all([r.session.messages({path:{id:n},query:{directory:e.cwd,limit:20}}),r.session.status({query:{directory:e.cwd}}).catch(()=>null)]),P=Array.isArray(v.data)?v.data:[],O=fk(I,n),S=l?void 0:Math.max(0,o-Dl),f=O?.type==="busy",h=Ds(P,l,S),x=Us(P,l,S);if(T(P,O),h&&(c=!0),!f&&x){g||(g=!0,e.onEvent?.({type:"session.idle",properties:{sessionID:n}})),d.abort();break}}catch(v){if(w||s||e.signal?.aborted||Ul(v))return}if(w||s||e.signal?.aborted)return;await $s(Wl)}};ee("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 _=await r.event.subscribe({signal:d.signal});ee("prompt:subscribed",{cwd:e.cwd,sessionId:n});let J=r.session.promptAsync({path:{id:n},query:{directory:e.cwd},body:{model:Pl(t.executionModel),agent:t.agent,parts:[{type:"text",text:e.prompt}]}}).catch(v=>{s||e.signal?.aborted||(i=v instanceof Error?v:new Error(ve(v)),w=!0,ee("prompt:async-error",{cwd:e.cwd,sessionId:n,error:i.message}),d.abort())}),B=N();try{for await(let v of _.stream){if(s||e.signal?.aborted)throw new Error("\u4EFB\u52A1\u5DF2\u53D6\u6D88");let I=Bl(v);if(I){if(I.type==="permission.updated"&&e.onEvent?.({type:"permission.updated",properties:I.properties}),I.type==="session.status"){e.onEvent?.({type:"session.status",properties:I.properties}),I.properties.sessionID===n&&(c=!0,ee("event:session-status",{sessionId:n,status:I.properties.status}));continue}if(I.type==="message.updated"){e.onEvent?.({type:"message.updated",properties:I.properties});let P=I.properties.info;E(P,"stream");continue}if(I.type==="message.part.updated"){e.onEvent?.({type:"message.part.updated",properties:I.properties});let P=I.properties.part;b(P,"stream");continue}if(I.type==="session.error"){e.onEvent?.({type:"session.error",properties:I.properties});let P=I.properties;if(P.sessionID!==n)continue;throw ee("event:session-error",{sessionId:n,error:P.error}),new Error(ve(P.error))}if(I.type==="session.idle"&&(e.onEvent?.({type:"session.idle",properties:I.properties}),I.properties.sessionID===n&&c)){g=!0,ee("event:session-idle",{sessionId:n,assistantMessageId:l,textPartCount:l?a.get(l)?.size??0:0});break}}}}catch(v){if(!(s||e.signal?.aborted||g||Ul(v)))throw v}if(await B,w=!0,d.abort(),await J,s||e.signal?.aborted)throw new Error("\u4EFB\u52A1\u5DF2\u53D6\u6D88");if(i)throw i;let $=l?bl(a.get(l)??new Map):"";if(!$)for(let v=0;v===0||Date.now()-o<Nl;v+=1){v>0&&await $s(Wl);let[I,P]=await Promise.all([r.session.messages({path:{id:n},query:{directory:e.cwd,limit:20}}),r.session.status({query:{directory:e.cwd}}).catch(()=>null)]),O=Array.isArray(I.data)?I.data:[],S=l?void 0:Math.max(0,o-Dl),h=(P?.data&&typeof P.data=="object"&&n in P.data?P.data[n]:void 0)?.type==="busy";$=Ds(O,l,S);let x=Us(O,l,S);if($&&!h&&x||!h&&x)break}return ee("prompt:finish",{cwd:e.cwd,sessionId:n,assistantMessageId:l,outputPreview:($||"OpenCode \u672A\u8FD4\u56DE\u6587\u672C\u8F93\u51FA\u3002").slice(0,200)}),{sessionId:n,output:$||"OpenCode \u672A\u8FD4\u56DE\u6587\u672C\u8F93\u51FA\u3002"}}catch(E){throw w=!0,ee("prompt:error",{cwd:e.cwd,sessionId:n,assistantMessageId:l,aborted:s,error:ve(E),snapshot:await dk(r,e.cwd,n)}),E}finally{e.signal?.removeEventListener("abort",k)}},qs=async e=>{let t=[`\u4EFB\u52A1\u6807\u9898: ${e.title}`,`\u4EFB\u52A1\u63CF\u8FF0: ${e.description}`,"","\u8BF7\u76F4\u63A5\u5728\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u5B8C\u6210\u4EFB\u52A1\u6240\u9700\u4FEE\u6539\u3002","\u5982\u679C\u9700\u8981\u8BFB\u53D6\u4EE3\u7801\u3001\u7F16\u8F91\u6587\u4EF6\u3001\u8FD0\u884C\u6D4B\u8BD5\u6216\u751F\u6210\u8865\u4E01\uFF0C\u8BF7\u76F4\u63A5\u6267\u884C\u3002","\u5B8C\u6210\u540E\u8BF7\u8FD4\u56DE\u7B80\u6D01\u603B\u7ED3\uFF1A\u505A\u4E86\u4EC0\u4E48\u3001\u662F\u5426\u8FD8\u6709\u963B\u585E\u3002"].join(`
58
- `);return $l({actingUserId:e.actingUserId,cwd:e.cwd,title:`Task: ${e.title}`,prompt:t,executionModel:e.executionModel,agentSettings:e.agentSettings,opencodeConfig:e.opencodeConfig,mcpServers:e.mcpServers,runtimeEnv:e.runtimeEnv,signal:e.signal})},zs=async e=>$l({actingUserId:e.actingUserId,resumeSessionId:e.resumeSessionId,cwd:e.cwd,title:e.title,prompt:e.prompt,executionModel:e.executionModel,agentSettings:e.agentSettings,opencodeConfig:e.opencodeConfig,mcpServers:e.mcpServers,runtimeEnv:e.runtimeEnv,signal:e.signal,onEvent:e.onEvent});var Ll=async e=>{let t=C();return e==="Codex"?kl(t):Gs()};import{existsSync as gk,readFileSync as hk}from"node:fs";import jl from"node:os";import Vn from"node:path";var yk=e=>{let t=e.trim().match(/^\$\{([A-Z0-9_]+)\}$/i);return t?process.env[t[1]]?.trim()||"":e.trim()},Kn=e=>typeof e!="string"?"":yk(e).trim(),Qe=e=>!!e&&typeof e=="object"&&!Array.isArray(e),Zt=(e,t)=>{for(let r of t){let n=Kn(e[r]);if(n)return n}return""},Fl=e=>{if(!gk(e))return null;try{let t=JSON.parse(hk(e,"utf8"));return Qe(t)?t:null}catch{return null}},kk=e=>{let t=e.trim();return t?t==="~"?jl.homedir():t.startsWith("~/")?Vn.join(jl.homedir(),t.slice(2)):t:""},wk=e=>{if(typeof e!="string")return"";let t=e.trim();return!t||t.startsWith("!")?"":/^[A-Z0-9_]+$/i.test(t)?process.env[t]?.trim()||"":t},Sk=e=>{let t=Kn(e.model);if(t)return t;let r=e.env&&typeof e.env=="object"?e.env:{};return Zt(r,["ANTHROPIC_MODEL","ANTHROPIC_DEFAULT_SONNET_MODEL","ANTHROPIC_DEFAULT_OPUS_MODEL","ANTHROPIC_DEFAULT_HAIKU_MODEL"])},xk=(e,t)=>{let r=de(e.opencodeConfigContent),n=Object.entries(r.provider??r.providers??{}),o=new Map;for(let[s,i]of n){if(!i||typeof i!="object")continue;let a=i,c=Zt(a,["baseURL","baseUrl","base_url","url","endpoint"]),l=Zt(a,["apiKey","api_key","token","authToken","apiToken"]);o.set(s,{...c?{baseUrl:c}:{},...l?{apiToken:l}:{}})}return t.map(s=>({providerId:s.providerId,modelId:s.modelId,label:`OpenCode \xB7 ${s.id}`,...o.get(s.providerId),runtimeSettings:{defaultModel:s.id}}))};var Hs=e=>{let t=e?.trim()||"";if(!t)return null;let r=t.indexOf("/");if(r<0)return null;let n=t.slice(0,r).trim(),o=t.slice(r+1).trim();return!n||!o?null:{providerId:n,modelId:o}},Ck=new Map([["claude","anthropic"],["dashscope","qwen"],["gemini","google"],["glm","zhipu"],["grok","xai"],["kimi","moonshot"],["volcengine","doubao"]]),Gl=new Set(["anthropic","baichuan","deepseek","doubao","google","groq","minimax","minimax-cn","mistral","moonshot","openai","openrouter","pi","qwen","xai","zhipu"]),vk=[{providerId:"anthropic",hostname:"api.anthropic.com"},{providerId:"deepseek",hostname:"api.deepseek.com"},{providerId:"google",hostname:"generativelanguage.googleapis.com"},{providerId:"groq",hostname:"api.groq.com"},{providerId:"minimax-cn",hostname:"api.minimaxi.com"},{providerId:"minimax",hostname:"api.minimax.io"},{providerId:"mistral",hostname:"api.mistral.ai"},{providerId:"moonshot",hostname:"api.moonshot.ai"},{providerId:"openai",hostname:"api.openai.com"},{providerId:"openrouter",hostname:"openrouter.ai"},{providerId:"qwen",hostname:"dashscope.aliyuncs.com"},{providerId:"xai",hostname:"x.ai"},{providerId:"zhipu",hostname:"open.bigmodel.cn"}],ql=e=>e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,""),Pk=e=>{let t=e?.trim()||"";if(!t)return"";let r=ql(t);return Ck.get(r)||(Gl.has(r)?r:t)},Ek=(e,t)=>e===t||e.endsWith(`.${t}`),bk=e=>vk.find(r=>Ek(e,r.hostname))?.providerId||"",Ik=e=>{let t=e?.trim();if(!t)return"";try{let n=new URL(t).hostname.toLowerCase(),o=bk(n);if(o)return o;let i=["minimax","openrouter","anthropic","openai","deepseek","moonshot","kimi","gemini","google","xai","grok","groq","qwen","dashscope","doubao","volcengine","baichuan","zhipu","glm","mistral"].find(d=>n.includes(d));if(i)return i==="kimi"?"moonshot":i==="gemini"?"google":i==="grok"?"xai":i==="dashscope"?"qwen":i==="volcengine"?"doubao":i==="glm"?"zhipu":i;let a=n.split(".").filter(Boolean),c=new Set(["api","www","chat","cn","com","net","org","io","ai"]),l=a.find(d=>!c.has(d));return l?ql(l):""}catch{return""}},Tk=e=>{let t=e?.trim().toLowerCase()||"";return t?t.includes("minimax")?"minimax":t.includes("claude")?"anthropic":t.includes("gpt")?"openai":t.includes("gemini")?"google":t.includes("deepseek")?"deepseek":t.includes("kimi")||t.includes("moonshot")?"moonshot":t.includes("grok")?"xai":t.includes("qwen")?"qwen":t.includes("doubao")?"doubao":t.includes("glm")?"zhipu":"":""},Rk=(e,t)=>!e||!t||e===t||!Gl.has(t)?!1:e==="openai"||e==="anthropic"?!0:e==="minimax"&&t==="minimax-cn",Vs=e=>{let t=Pk(e.explicitProviderId),r=Ik(e.baseUrl);return Rk(t,r)?r:t||r||Tk(e.modelId)||e.fallbackProviderId.trim()},_k=(e,t)=>{let r=t.trim().toLowerCase();if(!r)return null;for(let[n,o]of Object.entries(e))if(n.trim().toLowerCase()===r)return Qe(o)?{providerId:n,config:o}:null;return null},zl=(e,t)=>{let r=e.trim(),n=t.trim();return!r||!n?n||r:n.toLowerCase().startsWith(`${r.toLowerCase()}/`)?n:`${r}/${n}`},Jn=(e,t,r)=>`${e} \xB7 ${zl(t,r)}`,Ak=(e,t)=>{let r=e.codexConfigContent?.trim()||"",n=Ws({authContent:e.codexAuthContent,configContent:r}),o=n.configuredModel,s=n.baseUrl,i=n.apiToken,a=Hs(o)?.providerId||n.providerId,c=Vs({explicitProviderId:a,baseUrl:s,modelId:o,fallbackProviderId:"openai"}),l=t.filter(d=>d.providerId.trim().toLowerCase()===c.trim().toLowerCase());return l.length>0?l.map(d=>({providerId:c,modelId:d.modelId,label:Jn("Codex",c,d.modelId),...s?{baseUrl:s}:{},...i?{apiToken:i}:{},runtimeSettings:{defaultModel:d.modelId}})):o?[{providerId:c,modelId:o,label:Jn("Codex",c,o),...s?{baseUrl:s}:{},...i?{apiToken:i}:{},runtimeSettings:{defaultModel:o}}]:[]},Mk=e=>{let t=e.claudeCodeConfigContent?.trim()||"";if(!t)return[];try{let r=JSON.parse(t),n=Sk(r);if(!n)return[];let o=r.env&&typeof r.env=="object"?r.env:{},s=Zt(o,["ANTHROPIC_BASE_URL","ANTHROPIC_API_URL"])||process.env.ANTHROPIC_BASE_URL?.trim()||"",i=Zt(o,["ANTHROPIC_AUTH_TOKEN","ANTHROPIC_API_KEY"])||process.env.ANTHROPIC_AUTH_TOKEN?.trim()||process.env.ANTHROPIC_API_KEY?.trim()||"",a=Hs(n)?.providerId,c=Vs({explicitProviderId:a,baseUrl:s,modelId:n,fallbackProviderId:"anthropic"});return[{providerId:c,modelId:n,label:Jn("ClaudeCode",c,n),...s?{baseUrl:s}:{},...i?{apiToken:i}:{},runtimeSettings:{defaultModel:n}}]}catch{return[]}},Ok=e=>{if(!Qe(e.agentSettings))return"";let t=Qe(e.agentSettings.Pi)?e.agentSettings.Pi:null;return typeof t?.defaultModel=="string"?t.defaultModel.trim():""},Bk=e=>Qe(e.agentSettings.Pi)&&typeof e.agentSettings.Pi.agentDir=="string"&&e.agentSettings.Pi.agentDir.trim()?e.agentSettings.Pi.agentDir.trim():"",Wk=(e,t)=>{for(let[r,n]of Object.entries(e)){if(!Qe(n)||!Array.isArray(n.models))continue;if(n.models.some(s=>Qe(s)&&Kn(s.id)===t))return r}return""},Nk=e=>{let t=Ok(e);if(!t)return[];let r=Bk(e),n=r?Vn.resolve(kk(r)):"",o=n?Fl(Vn.join(n,"settings.json")):null,s=n?Fl(Vn.join(n,"models.json")):null,i=Qe(s?.providers)?s.providers:{},a=Hs(t),c=a?.providerId||"",l=a?.modelId||t,d=c?"":Kn(o?.defaultProvider),u=d||c?"":Wk(i,l),m=[d,c,u].filter(Boolean).map(b=>_k(i,b)).find(b=>!!b)??null,y=m?.config??null,g=y?Zt(y,["baseUrl","baseURL","base_url","url","endpoint"]):"",w=y?wk(y.apiKey):"",k=Vs({explicitProviderId:d||c||u||m?.providerId,baseUrl:g,modelId:l,fallbackProviderId:"pi"}),E=zl(k,l);return[{providerId:k,modelId:l,label:Jn("Pi",k,l),...g?{baseUrl:g}:{},...w?{apiToken:w}:{},runtimeSettings:{defaultModel:E,...n?{agentDir:n}:{}}}]},Hl=e=>e.agentType==="OpenCode"?xk(e.config,e.availableModels):e.agentType==="Codex"?Ak(e.config,e.availableModels):e.agentType==="ClaudeCode"?Mk(e.config):e.agentType==="Pi"?Nk(e.config):[];var Js=e=>{let t=C(),r=e.opencodeConfigContent!==void 0?e.opencodeConfigContent:t.opencodeConfigContent,n=e.codexConfigContent!==void 0?e.codexConfigContent:t.codexConfigContent,o=e.codexAuthContent!==void 0?e.codexAuthContent:t.codexAuthContent,s=e.claudeCodeConfigContent!==void 0?e.claudeCodeConfigContent:t.claudeCodeConfigContent,i=e.defaultModel!==void 0?e.defaultModel:t.defaultModel,a={...t,opencodeConfigContent:r,codexConfigContent:n,codexAuthContent:o,claudeCodeConfigContent:s,defaultModel:i,agentSettings:pr(e.agentSettings??t.agentSettings,i),mcpServers:e.mcpServers??t.mcpServers??[],maxConcurrency:Math.max(1,e.maxConcurrency??t.maxConcurrency)};return be(a),D({config:a}),a};var Vl=(e,t)=>{let r=t.getConfig();if(e.type==="control-plane.ready")return r=Js({opencodeConfigContent:e.opencodeConfigContent,codexConfigContent:e.codexConfigContent,codexAuthContent:e.codexAuthContent,claudeCodeConfigContent:e.claudeCodeConfigContent,defaultModel:e.defaultModel,agentSettings:e.agentSettings,mcpServers:e.mcpServers,maxConcurrency:e.maxConcurrency}),t.setConfig(r),D({config:r,executorId:r.executorId}),!0;if(e.type==="config.sync")return r=Js({opencodeConfigContent:e.opencodeConfigContent,codexConfigContent:e.codexConfigContent,codexAuthContent:e.codexAuthContent,claudeCodeConfigContent:e.claudeCodeConfigContent,defaultModel:e.defaultModel,agentSettings:e.agentSettings,mcpServers:e.mcpServers,maxConcurrency:e.maxConcurrency}),t.setConfig(r),D({config:r}),!0;if(e.type==="executor.unpair"){let n=ln();return t.setConfig(n),D({daemonMode:"unpaired",paired:!1,connected:!1,executorId:void 0,config:n,lastError:e.reason||"This worker was removed from the control plane."}),!0}return e.type==="executor.shutdown"?(t.requestShutdown(e.reason||"Control plane requested worker shutdown."),!0):e.type==="config.export.request"?(r=C(),t.setConfig(r),Ll(e.agentType).then(n=>{let o=ma(),s=on(),i=sn(),a=Oo(),c={...r,opencodeConfigContent:o||r.opencodeConfigContent,codexConfigContent:s||r.codexConfigContent,codexAuthContent:i||r.codexAuthContent,claudeCodeConfigContent:a||r.claudeCodeConfigContent};t.send({type:"config.export.response",executorId:r.executorId,requestId:e.requestId,opencodeConfigContent:c.opencodeConfigContent,codexConfigContent:c.codexConfigContent,codexAuthContent:c.codexAuthContent,claudeCodeConfigContent:c.claudeCodeConfigContent,defaultModel:n.defaultModel??r.defaultModel,agentSettings:r.agentSettings,availableModels:n.models,resolvedModelBindings:e.includeResolvedModelBindings?Hl({config:c,agentType:e.agentType,availableModels:n.models}):void 0,modelsMessage:n.message,at:new Date().toISOString()})}),!0):e.type==="executor.telemetry.request"?(r=C(),t.setConfig(r),t.send({type:"executor.telemetry.response",executorId:r.executorId,requestId:e.requestId,telemetry:Hn({workspaceRoot:r.workspaceRoot,workerVersion:ue()}),at:new Date().toISOString()}),!0):!1};import{readFileSync as iS}from"node:fs";import{basename as aS}from"node:path";var Dk=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,Jl=()=>AbortSignal.timeout(8e3),Kl=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(/\/+$/,"")}},Uk=e=>{let t=Kl(e);return!t||t==="github.com"?"https://api.github.com/user":`https://${t}/api/v3/user`},$k=e=>`https://${Kl(e)||"gitlab.com"}/api/v4/user`,Lk=async(e,t)=>{try{let r=await fetch(Uk(t),{headers:{Accept:"application/vnd.github+json",Authorization:`Bearer ${e}`,"User-Agent":"vibemux-pat-check"},signal:Jl()});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"}}},jk=async(e,t)=>{try{let r=await fetch($k(t),{headers:{"PRIVATE-TOKEN":e,"User-Agent":"vibemux-pat-check"},signal:Jl()});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"}}},Xl=async(e,t,r)=>{let n=e.trim();if(!n)return{ok:!1,message:"PAT \u4E0D\u80FD\u4E3A\u7A7A\u3002"};let o=Dk(n),s=t?[t]:o?[o]:["github","gitlab"];for(let i of s){let a=i==="github"?await Lk(n,r):await jk(n,r);if(a.ok){let c=i==="github"&&a.scopes?`\uFF0Cscopes\uFF1A${a.scopes}`:"",l=i==="github"?"\u3002\u63D0\u793A\uFF1A\u6B64\u5904\u4EC5\u9A8C\u8BC1 token \u672C\u8EAB\uFF1B\u8BBF\u95EE\u79C1\u6709\u4ED3\u5E93\u8FD8\u9700\u8981\u8BE5 token \u88AB\u6388\u4E88\u76EE\u6807\u4ED3\u5E93\u8BFB\u53D6\u6743\u9650":"";return{ok:!0,provider:i,account:a.account,message:`${i==="github"?"GitHub":"GitLab"} \u6821\u9A8C\u901A\u8FC7\uFF0C\u5F53\u524D\u8D26\u53F7 ${a.account}${c}${l}\u3002`}}if(!a.unauthorized||o)return{ok:!1,provider:i,message:a.message}}return{ok:!1,message:"\u672A\u8BC6\u522B PAT \u5BF9\u5E94\u5E73\u53F0\uFF0C\u6216 token \u5DF2\u5931\u6548\u3002"}};import{createHash as Fk}from"node:crypto";import{accessSync as Yl,existsSync as tr,mkdirSync as Gk,readdirSync as Zl,readFileSync as Xs,rmSync as qk,statSync as Ys,unlinkSync as zk,writeFileSync as Hk}from"node:fs";import Vk from"node:os";import V from"node:path";var Ks=1,Xn=1,Jk=64*1024*1024,Kk=200*1024,Xk=e=>e?.trim()||process.env.VIBEMUX_AGENT_HOME?.trim()||V.join(Vk.homedir(),".vibemux"),Qs=e=>e.replace(/\\/g,"/").replace(/^\/+/,"").split("/").filter(t=>t&&t!==".").join("/"),Yk=(e,t)=>{let r=V.relative(e,t);return r===""||!r.startsWith("..")&&!V.isAbsolute(r)},Qk=e=>{let t=e.trim();if(!t)throw new Error("Agent ID \u4E0D\u80FD\u4E3A\u7A7A\u3002");return t.replace(/[^a-zA-Z0-9._-]+/g,"-")},Te=e=>{tr(e)||Gk(e,{recursive:!0})},eu=e=>{if(!tr(e))return null;try{return JSON.parse(Xs(e,"utf8"))}catch{return null}},Zs=(e,t)=>{Hk(e,`${JSON.stringify(t,null,2)}
59
- `,"utf8")},Ql=e=>new Date(e).toISOString(),Zk=(e,t)=>{if(!(t>Jk))return Fk("sha256").update(Xs(e)).digest("hex")},tu=(e,t)=>{let r=Qk(e),n=V.join(Xk(t),"agents",r),o=V.join(n,"workdir"),s=V.join(n,".system"),i=V.join(s,"manifest.json"),a=V.join(s,"snapshots"),c=V.join(a,"current.json"),l=V.join(s,"sessions"),d=V.join(s,"runtime"),u=V.join(d,"temp"),p=V.join(s,"logs");return{rootPath:n,workDirPath:o,systemPath:s,manifestPath:i,snapshotsDir:a,snapshotPath:c,sessionsDir:l,runtimeDir:d,runtimeTempDir:u,logsDir:p}},ew=(e,t,r)=>{let n=new Date().toISOString();return{version:Ks,agentId:e.trim(),rootPath:t.rootPath,workDirPath:t.workDirPath,status:"ready",storageVersion:Ks,snapshotVersion:Xn,createdAt:r?.createdAt||n,updatedAt:n,lastUsedAt:r?.lastUsedAt,lastSessionId:r?.lastSessionId,lastScannedAt:r?.lastScannedAt}},Ze=(e,t)=>{let r=tu(e,t);return{paths:r,manifest:eu(r.manifestPath)}},ei=(e,t,r)=>{let{paths:n,manifest:o}=Ze(e,t),s={...ew(e,n,o),...r,updatedAt:new Date().toISOString()};return Zs(n.manifestPath,s),s},wt=(e,t)=>{let{paths:r}=Ze(e,t);return eu(r.snapshotPath)},er=(e,t,r,n,o)=>{let{paths:s}=Ze(e,t),i=o?.files??[];return{agentId:e.trim(),rootPath:s.rootPath,workDirPath:s.workDirPath,systemPath:s.systemPath,status:r,totalFiles:i.filter(a=>a.type==="file").length,totalDirectories:i.filter(a=>a.type==="directory").length,totalSizeBytes:i.filter(a=>a.type==="file").reduce((a,c)=>a+c.sizeBytes,0),lastUsedAt:n?.lastUsedAt,lastSessionId:n?.lastSessionId,lastScannedAt:n?.lastScannedAt??o?.scannedAt,manifestVersion:n?.storageVersion??Ks,snapshotVersion:n?.snapshotVersion??Xn}},ti=(e,t)=>{let{paths:r,manifest:n}=Ze(e,t);if(!tr(r.workDirPath)||!tr(r.systemPath))return{paths:r,manifest:n,summary:er(e,t,"missing",n,wt(e,t))};try{return Yl(r.workDirPath),Yl(r.systemPath),{paths:r,manifest:n,summary:er(e,t,"ready",n,wt(e,t))}}catch{return{paths:r,manifest:n,summary:er(e,t,"error",n,wt(e,t))}}},ru=(e,t="")=>{let r=t?V.join(e,t):e,n=Zl(r,{withFileTypes:!0}),o=[];for(let s of n){let i=Qs(V.join(t,s.name)),a=V.join(r,s.name),c=Ys(a);if(s.isDirectory()){o.push({path:i,type:"directory",sizeBytes:0,modifiedAt:Ql(c.mtimeMs)}),o.push(...ru(e,i));continue}s.isFile()&&o.push({path:i,type:"file",sizeBytes:c.size,modifiedAt:Ql(c.mtimeMs),sha256:Zk(a,c.size)})}return o},Yn=(e,t)=>{let r=tu(e,t);Te(r.rootPath),Te(r.workDirPath),Te(r.systemPath),Te(r.snapshotsDir),Te(V.join(r.snapshotsDir,"history")),Te(r.sessionsDir),Te(r.runtimeDir),Te(r.runtimeTempDir),Te(V.join(r.runtimeDir,"locks")),Te(r.logsDir);let n=ei(e,t);return{summary:er(e,t,"ready",n,wt(e,t)),files:wt(e,t)?.files??[]}},nu=(e,t)=>(Yn(e,t),ri(e,t)),ri=(e,t)=>{let{summary:r}=ti(e,t);if(r.status!=="ready")return{summary:r,files:[]};let{paths:n}=Ze(e,t),o=new Date().toISOString(),s=ru(n.workDirPath).sort((a,c)=>a.path.localeCompare(c.path));Zs(n.snapshotPath,{version:Xn,agentId:e.trim(),scannedAt:o,files:s});let i=ei(e,t,{lastScannedAt:o,status:"ready"});return{summary:er(e,t,"ready",i,{version:Xn,agentId:e.trim(),scannedAt:o,files:s}),files:s}},_r=(e,t)=>{let{manifest:r,summary:n}=ti(e,t);return n.status!=="ready"?n:er(e,t,"ready",r,wt(e,t))},rr=(e,t=!1,r)=>t?ri(e,r):{summary:_r(e,r),files:wt(e,r)?.files??[]},ou=(e,t,r)=>{Yn(e,r);let{paths:n}=Ze(e,r),o=new Date().toISOString();ei(e,r,{lastUsedAt:o,lastSessionId:t.trim()||void 0}),Zs(V.join(n.sessionsDir,`${t.trim()||"session"}.json`),{sessionId:t.trim()||"session",cwd:n.workDirPath,lastUsedAt:o})},su=(e,t)=>{let{paths:r}=Ze(e,t);if(tr(r.runtimeTempDir))for(let n of Zl(r.runtimeTempDir))qk(V.join(r.runtimeTempDir,n),{force:!0,recursive:!0});return _r(e,t)},Qn=(e,t,r)=>{let{summary:n}=ti(e,r);if(n.status!=="ready")throw new Error("Agent \u5DE5\u4F5C\u76EE\u5F55\u5C1A\u672A\u521D\u59CB\u5316\u3002");let o=Qs(t);if(!o)throw new Error("\u6587\u4EF6\u8DEF\u5F84\u4E0D\u80FD\u4E3A\u7A7A\u3002");let{paths:s}=Ze(e,r),i=V.resolve(s.workDirPath,o);if(!Yk(s.workDirPath,i))throw new Error("\u6587\u4EF6\u8DEF\u5F84\u8D8A\u754C\u3002");if(!tr(i)||!Ys(i).isFile())throw new Error("\u6587\u4EF6\u4E0D\u5B58\u5728\u3002");return{absolutePath:i,relativePath:o}},iu=(e,t,r)=>{let n=Qn(e,t,r);return zk(n.absolutePath),ri(e,r)},au=(e,t,r)=>{try{let n=Qn(e,t,r),o=Ys(n.absolutePath);if(!o.isFile())return{ok:!1,relativePath:n.relativePath,message:"\u5F53\u524D\u8DEF\u5F84\u4E0D\u662F\u6587\u4EF6\u3002"};if(o.size>Kk)return{ok:!1,relativePath:n.relativePath,sizeBytes:o.size,message:"\u6587\u4EF6\u8FC7\u5927\uFF0C\u6682\u4E0D\u652F\u6301\u9884\u89C8\u3002"};let s=Xs(n.absolutePath);return s.includes(0)?{ok:!1,relativePath:n.relativePath,sizeBytes:o.size,message:"\u6682\u4E0D\u652F\u6301\u9884\u89C8\u4E8C\u8FDB\u5236\u6587\u4EF6\u3002"}:{ok:!0,relativePath:n.relativePath,content:s.toString("utf8"),sizeBytes:o.size,truncated:!1}}catch(n){return{ok:!1,relativePath:Qs(t),message:n instanceof Error?n.message:"\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25\u3002"}}};import{readFile as rw}from"node:fs/promises";import lu from"node:os";import eo from"node:path";import{simpleGit as nw}from"simple-git";import{spawnSync as tw}from"node:child_process";var Ar=(e,t,r)=>{let n=tw("git",t,{cwd:e,env:r,encoding:"utf8"});if(n.status!==0)throw new Error((n.stderr||n.stdout||"git command failed").trim())},Zn=(e,t,r)=>{try{Ar(e,t,r)}catch{return}},Ge=e=>{let t=tc({taskId:e.taskId,identity:e.identity,repoUrl:e.repoUrl});return{env:t.env,tempDir:t.tempDir,configureRepo(r){e.identity.name&&e.identity.email&&(Ar(r,["config","--local","user.name",e.identity.name],t.env),Ar(r,["config","--local","user.email",e.identity.email],t.env)),t.env.GIT_SSH_COMMAND&&Ar(r,["config","--local","core.sshCommand",t.env.GIT_SSH_COMMAND],t.env),t.env.GIT_ASKPASS&&Ar(r,["config","--local","core.askPass",t.env.GIT_ASKPASS],t.env)},cleanup(r){r&&(e.identity.name&&e.identity.email&&(Zn(r,["config","--local","--unset-all","user.name"],t.env),Zn(r,["config","--local","--unset-all","user.email"],t.env)),Zn(r,["config","--local","--unset-all","core.askPass"],t.env),Zn(r,["config","--local","--unset-all","core.sshCommand"],t.env)),t.cleanup()}}},cu=e=>{let t=Ge({taskId:e.taskId,identity:e.identity,repoUrl:e.repoUrl});return t.configureRepo(e.worktreePath),{tempDir:t.tempDir,env:t.env,cleanup(){t.cleanup(e.worktreePath)}}};var Mr="main",ow=e=>{let t=e.trim();return t?t==="~"?lu.homedir():t.startsWith("~/")?eo.join(lu.homedir(),t.slice(2)):t:""},ni=e=>eo.resolve(ow(e)),sw=(e,t)=>{let r={...Dt(t),...e?{baseDir:e}:{}};return nw(r).env(t??{})},he=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},iw=e=>e.split("\0").map(t=>t.trim()).filter(Boolean),aw=e=>e.split(eo.sep).join("/"),oi=(e,t)=>{let r=new Map;for(let n of t.split(`
60
- `).map(o=>o.trim()).filter(Boolean)){let o=n.split(" "),s=o[0]||"M",i=o.length>2?`${o[1]} \u2192 ${o[2]}`:o[1]||"";i&&r.set(i,s)}return e.split(`
61
- `).map(n=>n.trim()).filter(Boolean).map(n=>n.split(" ")).map(n=>{if(n.length<3)return null;let o=n[0]==="-"?0:Number(n[0]),s=n[1]==="-"?0:Number(n[1]),i=n.length>3?`${n[2]} \u2192 ${n[3]}`:n[2];return{path:i,status:r.get(i)||"M",additions:Number.isFinite(o)?o:0,deletions:Number.isFinite(s)?s:0}}).filter(n=>!!n)},cw=e=>{if(e.length===0||e.includes(0))return 0;let t=e.toString("utf8").replace(/\r\n/g,`
62
- `);if(!t)return 0;let r=t.split(`
46
+ process.stdout.write(\`${Zr(o)}\`)
47
+ `;return Ws(i,s,{encoding:"utf8",mode:448}),_s(i,448),i},Tp=e=>`ssh -i "${e}" -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null`,Ap=new Set(["EDITOR","GIT_ASKPASS","GIT_CONFIG","GIT_CONFIG_COUNT","GIT_CONFIG_GLOBAL","GIT_CONFIG_SYSTEM","GIT_EDITOR","GIT_EXEC_PATH","GIT_EXTERNAL_DIFF","GIT_PAGER","GIT_PROXY_COMMAND","GIT_SEQUENCE_EDITOR","GIT_SSH","GIT_SSH_COMMAND","GIT_TEMPLATE_DIR","PAGER","PREFIX","SSH_ASKPASS"]),Mp=e=>{let t=e.toUpperCase();return Ap.has(t)||t.startsWith("GIT_CONFIG_KEY_")||t.startsWith("GIT_CONFIG_VALUE_")},to=(e=process.env)=>{let t={};for(let[n,r]of Object.entries(e))r!==void 0&&!Mp(n)&&(t[n]=r);return t},ht=e=>{let t={};return(e?.GIT_ASKPASS||e?.SSH_ASKPASS)&&(t.allowUnsafeAskPass=!0),(e?.GIT_SSH||e?.GIT_SSH_COMMAND)&&(t.allowUnsafeSshCommand=!0),Object.keys(t).length>0?{unsafe:t}:{}},Ds=e=>{let t=eo.join(Cp.tmpdir(),"vibemux-git",e.taskId);Sp(t,{recursive:!0});let n=to();if(n.GIT_TERMINAL_PROMPT="0",e.identity.authMode==="ssh"&&e.identity.credentialToken){let r=eo.join(t,"id_ed25519");Ws(r,e.identity.credentialToken,{encoding:"utf8",mode:384}),_s(r,384),n.GIT_SSH_COMMAND=Tp(r)}else e.identity.credentialToken&&(n.GIT_ASKPASS=Rp(t,e.identity,e.repoUrl));return{env:n,tempDir:t,cleanup(){xp(t,{recursive:!0,force:!0})}}};var Dp=e=>new Promise(t=>setTimeout(t,e)),oo=!1,io=null,$p=()=>$s(yn())&&$s(Bt()),Np=()=>{let e=qe().name?.trim()||"";return e==="vibemux-worker"||e==="vibemux-worker-preview"},Up=()=>process.platform==="win32"?"npx.cmd":"npx",Lp=()=>{let e=process.env.VIBEMUX_WORKER_RESTART_STRATEGY?.trim().toLowerCase();return e==="pm2"||e==="supervisor"?!0:!!process.env.pm_id?.trim()},jp=(e,t)=>{let n=to(process.env);so(Up(),["-y",`${e}@${t}`,"daemon"],{detached:!0,stdio:"ignore",env:n}).unref()},Fp=async e=>{for(let t=0;t<120;t+=1)try{process.kill(e,0),await Dp(500)}catch{return}throw new Error(`\u7B49\u5F85\u65E7 Worker \u9000\u51FA\u8D85\u65F6: ${e}`)},Gp=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 n=Buffer.from(await t.arrayBuffer()),r=Qe.join(Wp.tmpdir(),"vibemux-worker-updates");Ns(r,{recursive:!0});let o=Qe.join(r,`worker-${Date.now()}.tar.gz`);return _p(o,n),o},qp=(e,t)=>{let n=Bp("tar",["-xzf",e,"-C",t],{encoding:"utf8"});if(n.status!==0)throw new Error(n.stderr?.trim()||n.error?.message||"\u89E3\u538B\u66F4\u65B0\u5305\u5931\u8D25")},zp=e=>{so(Qe.join(e,"bin","vibemux-worker"),["daemon"],{detached:!0,stdio:"ignore"}).unref()},Gn=async e=>{let t=e??await Ke();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"}:Np()?Lp()?{ok:!0,applied:!0,currentVersion:t.currentVersion,latestVersion:t.latestVersion,message:`\u68C0\u6D4B\u5230\u65B0\u7248\u672C ${t.latestVersion}\uFF0C\u5373\u5C06\u9000\u51FA\u5E76\u4EA4\u7ED9\u5916\u90E8 supervisor \u91CD\u542F\u3002`}:(jp(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(!$p())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 n=await Gp(t.asset.url);return so(process.execPath,[Bt(),"apply-update-internal",n,ne(),String(process.pid)],{detached:!0,stdio:"ignore"}).unref(),{ok:!0,applied:!0,currentVersion:t.currentVersion,latestVersion:t.latestVersion,message:`\u5DF2\u5F00\u59CB\u66F4\u65B0\u5230 ${t.latestVersion}\uFF0CWorker \u5373\u5C06\u91CD\u542F\u3002`}},ao=async e=>{let t=process.env.VIBEMUX_WORKER_AUTO_UPDATE?.trim().toLowerCase();if(t==="0"||t==="false"||t==="off"||oo)return!1;oo=!0;try{let n=e??await Ke();return!n.ok||!n.available||!n.latestVersion?(io=null,!1):io===n.latestVersion?!1:(io=n.latestVersion,console.log(`[worker] \u68C0\u6D4B\u5230\u65B0\u7248\u672C ${n.latestVersion}\uFF0C\u5F53\u524D\u4EC5\u63D0\u793A\uFF0C\u4E0D\u4F1A\u81EA\u52A8\u5347\u7EA7\u6216\u9000\u51FA\u3002`),!0)}finally{oo=!1}},Us=async(e,t,n)=>{await Fp(n);let r=Qe.dirname(t),o=Qe.join(r,`.vibemux-worker-stage-${Date.now()}`),i=Qe.join(r,`.vibemux-worker-backup-${Date.now()}`);Ns(o,{recursive:!0}),qp(e,o);let[s]=Op(o);if(!s)throw new Error("\u66F4\u65B0\u5305\u5185\u5BB9\u4E3A\u7A7A");let a=Qe.join(o,s);no(t,i);try{no(a,t)}catch(c){throw no(i,t),c}zp(t),ro(i,{recursive:!0,force:!0}),ro(o,{recursive:!0,force:!0}),ro(e,{force:!0})};var Kp=e=>new URL(e.url||"/","http://127.0.0.1"),Ls=async e=>{let t=[];for await(let n of e)t.push(Buffer.isBuffer(n)?n:Buffer.from(n));return JSON.parse(Buffer.concat(t).toString("utf8"))},q=(e,t,n)=>{e.statusCode=t,e.setHeader("Content-Type","application/json; charset=utf-8"),e.setHeader("Cache-Control","no-store"),e.end(`${JSON.stringify(n)}
48
+ `)},Xp=(e,t)=>{let n=co.extname(t),r=n===".css"?"text/css; charset=utf-8":n===".js"?"application/javascript; charset=utf-8":n===".map"?"application/json; charset=utf-8":"text/html; charset=utf-8";e.statusCode=200,e.setHeader("Content-Type",r),e.end(Jp(t))},Qp=e=>{let t=_i(),n=e==="/"?co.join(t,"index.html"):co.join(t,e.replace(/^\//,""));return n.startsWith(t)?n:null},Yp=(e,t)=>{let n=Qp(e);if(!n||!Hp(n)){q(t,404,{message:"not found"});return}Xp(t,n)},Zp=()=>{let e=Lt(),t=C();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}},em=e=>e==="claude"||e==="opencode"||e==="codex"||e==="pi"?e:null,tm=()=>{let e=C(),t=e.mcpServers??[],n=!!e.executorToken?.trim(),r=t.map(c=>{let l=Je([c],{cloudUrl:e.cloudUrl,executorToken:e.executorToken,actingUserId:c.target===He&&n?"__dynamic__":void 0}),u=Object.keys(l)[0],d=u?l[u]:null,m=c.target===He;return{id:c.id,name:c.name,target:c.target,transport:c.transport,capabilityMode:c.capabilityMode,enabled:c.enabled,materialized:!!d,kind:m?"builtin":c.transport==="stdio"||c.target.startsWith("stdio://")?"stdio":c.transport==="http"||c.transport==="sse"?"remote":"custom",endpoint:typeof d?.url=="string"?d.url:void 0,command:typeof d?.command=="string"?d.command:void 0,headerKeys:d&&typeof d=="object"&&d.headers&&typeof d.headers=="object"?Object.keys(d.headers):[],actingUserScoped:m&&n}}),o=r.filter(c=>c.enabled),s=!!r.find(c=>c.target===He)?.enabled,a=s&&n;return{configuredCount:r.length,enabledCount:o.length,materializedCount:o.filter(c=>c.materialized).length,builtinEnabled:s,builtinReady:a,actingUserMode:s?a?"request-scoped":"pairing-required":"disabled",servers:r}},nm=(e,t)=>e.code==="EADDRINUSE"?`Local console port ${t} is already in use. Set VIBEMUX_WORKER_PORT and try again.`:e.code==="EPERM"?`The worker does not have permission to listen on local console port ${t}. Choose a different VIBEMUX_WORKER_PORT or check system permissions.`:`Failed to start the local console: ${e.message||"listen failed"}`,rm=()=>{setTimeout(()=>{try{process.kill(process.pid,"SIGTERM")}catch{process.exit(0)}},250)},lo=()=>{let e=C(),t=Jr(),n=Vp.createServer(async(r,o)=>{try{let i=Kp(r);if(r.method==="GET"&&(i.pathname==="/"||i.pathname.startsWith("/assets/"))){Yp(i.pathname,o);return}if(r.method==="GET"&&(i.pathname==="/health"||i.pathname==="/api/health")){q(o,200,Zp());return}if(r.method==="GET"&&i.pathname==="/api/config"){q(o,200,{config:C()});return}if(r.method==="GET"&&i.pathname==="/api/status"){q(o,200,{runtime:ut(),mcp:tm()});return}if(r.method==="GET"&&i.pathname==="/api/doctor"){q(o,200,await yt());return}if(r.method==="GET"&&i.pathname==="/api/agent-sessions"){q(o,200,jn());return}if(r.method==="GET"&&i.pathname==="/api/agent-sessions/detail"){let s=em(i.searchParams.get("source")),a=i.searchParams.get("id")?.trim();if(!s||!a){q(o,400,{message:"source and id are required"});return}let c=Fn(s,a);if(!c){q(o,404,{message:"session not found"});return}q(o,200,{session:c});return}if(r.method==="GET"&&i.pathname==="/api/update"){q(o,200,await Ke());return}if(r.method==="POST"&&i.pathname==="/api/bootstrap-runtime"){let s=await pe({autoInstall:!0,target:"all"});q(o,200,{report:s,doctor:await yt()});return}if(r.method==="PUT"&&i.pathname==="/api/config"){let s=await Ls(r),a={...C(),...s};ke(a),D({config:a,paired:!!(a.executorId&&a.executorToken),executorId:a.executorId}),q(o,200,{config:a,message:"saved"});return}if(r.method==="POST"&&i.pathname==="/api/pair"){let s=await Ls(r),a=C(),c=ot(s.pairingCode);if(gn(s.pairingCode,a)){let d={...a,executorName:s.name?.trim()||a.executorName?.trim()||`worker-${process.pid}`};ke(d),D({paired:!0,executorId:d.executorId,config:d,daemonMode:"starting"}),qn(),q(o,200,{config:d,message:`${fn()} Connecting to the control plane.`});return}let l;try{l=await Wt({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:ie()},a.cloudUrl)}catch(d){let m=d instanceof Error?d.message:"Pair request failed.";q(o,400,{message:hn(m,it(a))});return}let u={...a,executorName:s.name?.trim()||`worker-${process.pid}`,executorId:l.executorId,executorToken:l.executorToken,lastPairedPairingCode:c};ke(u),D({paired:!0,executorId:l.executorId,config:u,daemonMode:"starting"}),qn(),q(o,200,{config:u,executor:l.executor,message:"Pairing complete. Connecting to the control plane."});return}if(r.method==="POST"&&i.pathname==="/api/reset"){In(),D({daemonMode:"idle",paired:!1,connected:!1,executorId:void 0,config:C(),runningTaskIds:[],queuedTaskIds:[],lastError:void 0}),q(o,200,{config:C(),message:"reset"});return}if(r.method==="POST"&&i.pathname==="/api/disconnect"){js(),q(o,200,{runtime:ut(),message:"Disconnected from the control plane."});return}if(r.method==="POST"&&i.pathname==="/api/connect"){qn(),q(o,200,{runtime:ut(),message:"Control plane connection requested."});return}if(r.method==="POST"&&i.pathname==="/api/update"){let s=await Gn();q(o,s.applied?202:200,s),s.applied&&rm();return}q(o,404,{message:"not found"})}catch(i){q(o,500,{message:i instanceof Error?i.message:"worker local server error"})}});return n.once("error",r=>{let o=nm(r,e.localServerPort);D({daemonMode:"disconnected",connected:!1,lastError:o}),console.error(`[worker] ${o}`),process.exitCode=1,setTimeout(()=>process.exit(1),20)}),n.listen(e.localServerPort,t,()=>{let r=jt(e.localServerPort),o=t==="127.0.0.1"?"":` (listening on ${t})`;console.log(`[worker] local console ${r}${o}`)}),n};var om=new Set(["connection","keep-alive","proxy-authenticate","proxy-authorization","te","trailer","transfer-encoding","upgrade","host","content-length"]),Fs=32*1024,kt=new Map,uo=new Map,zn=()=>new Date().toISOString(),qt=(e,t)=>`${e}:${t}`,Hn=(e,t)=>{e.send(JSON.stringify(t))},im=e=>!e||e==="/"?"":e.endsWith("/")?e.slice(0,-1):e,sm=(e,t)=>{let n=im(e);return!n||t===n||t.startsWith(`${n}/`)?t||"/":`${n}${t||"/"}`},am=(e,t)=>{let n=new URL(e),r=new URL(t,n);return r.pathname=sm(n.pathname,r.pathname),r.toString()},cm=e=>{let t=new Headers;for(let[n,r]of e)om.has(n.toLowerCase())||t.set(n,r);return t},lm=e=>{let t={type:"preview.http.response.body",previewSessionId:e.previewSessionId,streamId:e.streamId,sentAt:zn(),seq:e.seq,encoding:"base64",data:Buffer.from(e.chunk).toString("base64")};Hn(e.socket,t)},dm=e=>{let t=[],n=e.headers.getSetCookie;e.headers.forEach((r,o)=>{o.toLowerCase()!=="set-cookie"&&t.push([o,r])});for(let r of n?.call(e.headers)??[])t.push(["set-cookie",r]);return t},um=e=>{pm(e)},pm=async e=>{let t=qt(e.previewSessionId,e.streamId),n=new AbortController;uo.set(t,n);try{let r=e.request.hasBody?new ReadableStream({start(a){e.request.bodyController=a}}):void 0,o=await fetch(am(e.targetUrl,e.request.pathWithQuery),{method:e.request.method,headers:cm(e.request.headers),body:r,duplex:r?"half":void 0,signal:n.signal}),i={type:"preview.http.response.start",previewSessionId:e.previewSessionId,streamId:e.streamId,sentAt:zn(),status:o.status,headers:dm(o)};if(Hn(e.socket,i),o.body){let a=o.body.getReader(),c=0;for(;;){let{done:l,value:u}=await a.read();if(l)break;let d=u??new Uint8Array(0);for(let m=0;m<d.byteLength;m+=Fs)lm({socket:e.socket,previewSessionId:e.previewSessionId,streamId:e.streamId,chunk:d.subarray(m,m+Fs),seq:c}),c+=1}}let s={type:"preview.http.response.end",previewSessionId:e.previewSessionId,streamId:e.streamId,sentAt:zn()};Hn(e.socket,s)}catch(r){let o={type:"preview.http.abort",previewSessionId:e.previewSessionId,streamId:e.streamId,sentAt:zn(),code:n.signal.aborted?"client_closed":"upstream_connect_failed",message:r instanceof Error?r.message:"local preview upstream request failed"};Hn(e.socket,o)}finally{uo.delete(t)}},zt={handleStart(e){let t={method:e.frame.method,pathWithQuery:e.frame.pathWithQuery,headers:e.frame.headers,hasBody:e.frame.hasBody};kt.set(qt(e.frame.previewSessionId,e.frame.streamId),t),um({socket:e.socket,previewSessionId:e.frame.previewSessionId,streamId:e.frame.streamId,targetUrl:e.frame.targetUrl||e.targetUrl,request:t})},handleBody(e){let t=kt.get(qt(e.previewSessionId,e.streamId));t&&t.bodyController?.enqueue(Buffer.from(e.data,"base64"))},handleEnd(e){let t=qt(e.frame.previewSessionId,e.frame.streamId),n=kt.get(t);n&&(kt.delete(t),n.bodyController?.close())},abort(e,t){let n=qt(e,t),r=kt.get(n);kt.delete(n);try{r?.bodyController?.error(new Error("preview request aborted"))}catch{}uo.get(n)?.abort()}};import{WebSocket as Gs}from"ws";var ce=new Map,wt=()=>new Date().toISOString(),po=(e,t)=>`${e}:${t}`,mm=e=>!e||e==="/"?"":e.endsWith("/")?e.slice(0,-1):e,gm=(e,t)=>{let n=mm(e);return!n||t===n||t.startsWith(`${n}/`)?t||"/":`${n}${t||"/"}`},fm=(e,t)=>{let n=new URL(e),r=new URL(t,n);return r.protocol=n.protocol==="https:"?"wss:":"ws:",r.pathname=gm(n.pathname,r.pathname),r.toString()},hm=e=>{let t={};for(let[n,r]of e)t[n]=r;return t},Ht=(e,t)=>{e.send(JSON.stringify(t))},ym=e=>{if(!e.queuedFrames.length)return;let t=[...e.queuedFrames];e.queuedFrames.length=0;for(let n of t){if(n.opcode==="binary"){e.socket.send(Buffer.from(n.data,"base64"));continue}e.socket.send(n.data)}},Jn=e=>{let t=po(e.previewSessionId,e.streamId),n=ce.get(t);if(n){if(ce.delete(t),e.notifyRemote!==!1){let r={type:"preview.ws.close",previewSessionId:e.previewSessionId,streamId:e.streamId,sentAt:wt(),code:e.code,reason:e.reason};Ht(n.tunnelSocket,r)}try{n.closedByControl=!0,n.socket.close(e.code,e.reason)}catch{n.socket.close()}}},km=e=>Buffer.isBuffer(e)?e.toString("base64"):Array.isArray(e)?Buffer.concat(e).toString("base64"):Buffer.from(e).toString("base64"),wm=e=>typeof e=="string"?e:Buffer.isBuffer(e)?e.toString("utf8"):Array.isArray(e)?Buffer.concat(e).toString("utf8"):Buffer.from(new Uint8Array(e)).toString("utf8"),St={open(e){let t=po(e.frame.previewSessionId,e.frame.streamId);Jn({previewSessionId:e.frame.previewSessionId,streamId:e.frame.streamId,notifyRemote:!1});let n=new Gs(fm(e.frame.targetUrl||e.targetUrl,e.frame.pathWithQuery),e.frame.subprotocols.length>0?e.frame.subprotocols:void 0,{headers:hm(e.frame.headers)}),r={previewSessionId:e.frame.previewSessionId,streamId:e.frame.streamId,socket:n,tunnelSocket:e.socket,opened:!1,nextSeq:0,queuedFrames:[],closedByControl:!1};ce.set(t,r),n.on("open",()=>{let o=ce.get(t);if(!o)return;o.opened=!0;let i={type:"preview.ws.opened",previewSessionId:o.previewSessionId,streamId:o.streamId,sentAt:wt(),accepted:!0,selectedSubprotocol:o.socket.protocol||void 0};Ht(o.tunnelSocket,i),ym(o)}),n.on("message",(o,i)=>{let s=ce.get(t);if(!s)return;let a=i?{type:"preview.ws.data",previewSessionId:s.previewSessionId,streamId:s.streamId,sentAt:wt(),seq:s.nextSeq,opcode:"binary",encoding:"base64",data:km(o)}:{type:"preview.ws.data",previewSessionId:s.previewSessionId,streamId:s.streamId,sentAt:wt(),seq:s.nextSeq,opcode:"text",encoding:"utf8",data:wm(o)};s.nextSeq+=1,Ht(s.tunnelSocket,a)}),n.on("close",(o,i)=>{let s=ce.get(t);if(!s||(ce.delete(t),s.closedByControl))return;let a={type:"preview.ws.close",previewSessionId:s.previewSessionId,streamId:s.streamId,sentAt:wt(),code:o||void 0,reason:i.toString()||void 0};Ht(s.tunnelSocket,a)}),n.on("error",()=>{let o=ce.get(t);if(o&&!o.opened){ce.delete(t);let i={type:"preview.ws.opened",previewSessionId:o.previewSessionId,streamId:o.streamId,sentAt:wt(),accepted:!1,status:502,message:"local preview websocket connect failed"};Ht(o.tunnelSocket,i)}})},handleData(e){let t=ce.get(po(e.previewSessionId,e.streamId));if(t){if(!t.opened||t.socket.readyState!==Gs.OPEN){t.queuedFrames.push(e);return}if(e.opcode==="binary"){t.socket.send(Buffer.from(e.data,"base64"));return}t.socket.send(e.data)}},handleClose(e){Jn({previewSessionId:e.previewSessionId,streamId:e.streamId,code:e.code,reason:e.reason,notifyRemote:!1})},closePreviewSession(e,t){for(let n of ce.values())n.previewSessionId===e&&Jn({previewSessionId:n.previewSessionId,streamId:n.streamId,code:1001,reason:t,notifyRemote:!1})},closeAll(e){for(let t of ce.values())Jn({previewSessionId:t.previewSessionId,streamId:t.streamId,code:1001,reason:e,notifyRemote:!1})}};var Te=new Map,mo=()=>new Date().toISOString(),Sm=e=>JSON.parse(e),xt=e=>{e.send({type:"preview.tunnel.status",executorId:e.executorId,previewSessionId:e.previewSessionId,status:e.status,message:e.message,at:mo()})},Vn=(e,t)=>{let n=Te.get(e);if(n){St.closePreviewSession(e,t),n.closedByManager=!0;try{n.socket.close(1e3,t)}catch{n.socket.close()}Te.delete(e)}},xm=e=>{if(e.frame.type==="preview.bind.ack"){let t=e.frame;if(!t.accepted){xt({send:e.send,executorId:e.connection.executorId,previewSessionId:e.connection.previewSessionId,status:"error",message:t.reason||"preview tunnel bind rejected"}),Vn(e.connection.previewSessionId,t.reason||"preview bind rejected");return}xt({send:e.send,executorId:e.connection.executorId,previewSessionId:e.connection.previewSessionId,status:"open"});return}if(e.frame.type==="preview.tunnel.ping"){let t=e.frame;e.connection.socket.send(JSON.stringify({type:"preview.tunnel.pong",previewSessionId:e.connection.previewSessionId,sentAt:mo(),pingId:t.pingId}));return}if(e.frame.type==="preview.http.request.start"){zt.handleStart({frame:e.frame,socket:e.connection.socket,targetUrl:e.connection.targetUrl});return}if(e.frame.type==="preview.http.request.body"){zt.handleBody(e.frame);return}if(e.frame.type==="preview.http.request.end"){zt.handleEnd({frame:e.frame});return}if(e.frame.type==="preview.http.abort"){zt.abort(e.frame.previewSessionId,e.frame.streamId);return}if(e.frame.type==="preview.ws.open"){St.open({frame:e.frame,socket:e.connection.socket,targetUrl:e.connection.targetUrl});return}if(e.frame.type==="preview.ws.data"){St.handleData(e.frame);return}e.frame.type==="preview.ws.close"&&St.handleClose(e.frame)},Ct={open(e,t,n){Vn(e.previewSessionId,"replaced"),xt({send:n,executorId:t.executorId,previewSessionId:e.previewSessionId,status:"connecting"});let o=`${e.tunnelUrl?.trim()||Ri(t.cloudUrl)}?preview_session_id=${encodeURIComponent(e.previewSessionId)}&token=${encodeURIComponent(e.tunnelToken)}`,i=new WebSocket(o),s={socket:i,previewSessionId:e.previewSessionId,executorId:t.executorId,closedByManager:!1,targetUrl:e.targetUrl};Te.set(e.previewSessionId,s),i.addEventListener("open",()=>{let a=Te.get(e.previewSessionId);if(!a||a.socket!==i)return;let c={type:"preview.bind",previewSessionId:e.previewSessionId,sentAt:mo(),protocolVersion:"preview-tunnel.v1",executorId:t.executorId};i.send(JSON.stringify(c))}),i.addEventListener("message",a=>{let c=Te.get(e.previewSessionId);if(!(!c||c.socket!==i))try{xm({frame:Sm(String(a.data)),connection:c,send:n})}catch(l){xt({send:n,executorId:t.executorId,previewSessionId:e.previewSessionId,status:"error",message:l instanceof Error?l.message:"invalid preview tunnel frame"})}}),i.addEventListener("error",()=>{let a=Te.get(e.previewSessionId);!a||a.socket!==i||xt({send:n,executorId:t.executorId,previewSessionId:e.previewSessionId,status:"error",message:"preview tunnel websocket error"})}),i.addEventListener("close",a=>{let c=Te.get(e.previewSessionId);!c||c.socket!==i||(Te.delete(e.previewSessionId),xt({send:n,executorId:t.executorId,previewSessionId:e.previewSessionId,status:"closed",message:c.closedByManager?void 0:a.reason?.trim()||`code=${a.code}`}))})},close(e,t){Vn(e,t)},closeAll(e){St.closeAll(e);for(let t of Te.keys())Vn(t,e)}};import{accessSync as Cm,constants as Pm,mkdirSync as vm}from"node:fs";var Em=()=>We()==="preview"?"vibemux-worker-preview":"vibemux-worker",Im=e=>{try{return vm(e,{recursive:!0}),Cm(e,Pm.W_OK),{ok:!0,detail:`Writable: ${e}`}}catch(t){return{ok:!1,detail:t instanceof Error?t.message:"path access failed"}}},bm=e=>{try{return{ok:!0,detail:`Ready: ${$n(e).root}`}}catch(t){return{ok:!1,detail:t instanceof Error?t.message:"workspace setup failed"}}},Rm=async e=>{try{let t=await fetch(e,{method:"GET",signal:AbortSignal.timeout(5e3)});return{ok:!0,status:t.status,message:`Control plane reachable, HTTP ${t.status}`}}catch(t){return{ok:!1,status:void 0,message:t instanceof Error?t.message:"cloud probe failed"}}},Tm=async()=>{try{let e=await fetch("https://opencode.ai",{method:"GET",signal:AbortSignal.timeout(5e3)});return{ok:e.ok,status:e.status,url:"https://opencode.ai",message:e.ok?`Official site reachable, HTTP ${e.status}`:`Official site returned an unexpected status, HTTP ${e.status}`}}catch(e){return{ok:!1,status:void 0,url:"https://opencode.ai",message:e instanceof Error?e.message:"official site probe failed"}}},Am=e=>{let t=e.filter(r=>r.ok).length,n=e.length-t;return{total:e.length,passed:t,failed:n,ok:n===0}},qs=async()=>{let e=C(),[t,n,r]=await Promise.all([Rm(e.cloudUrl),Tm(),pe({target:"all"})]),o=Im(ye()),i=bm(e.workspaceRoot),s=r.items.find(S=>S.id==="git")??{ok:!1,detail:"Git status is unknown."},a=r.items.find(S=>S.id==="opencode")??{ok:!1,detail:"OpenCode runtime status is unknown."},c=r.items.find(S=>S.id==="codex-cli")??{ok:!1,detail:"Codex CLI status is unknown."},l=r.items.find(S=>S.id==="codex-auth")??{ok:!1,detail:"Codex sign-in status is unknown."},u=r.items.find(S=>S.id==="claude-cli")??{ok:!1,detail:"Claude Code CLI status is unknown."},d=r.items.find(S=>S.id==="claude-auth")??{ok:!1,detail:"Claude Code authentication status is unknown."},m=!!e.opencodeConfigContent?.trim(),g=!!e.codexConfigContent?.trim(),k=!!e.claudeCodeConfigContent?.trim(),h=[{id:"git",category:"tooling",label:"Git",ok:s.ok,detail:s.detail,hint:s.ok?void 0:"Install Git first and confirm it is executable from PATH."},{id:"opencode",category:"tooling",label:"OpenCode Runtime",ok:a.ok,detail:a.detail,hint:a.ok?void 0:"Check the worker dependency installation and confirm both `@opencode-ai/sdk` and the local `opencode` runtime are available."},{id:"codex-cli",category:"tooling",label:"Codex CLI",ok:c.ok,detail:c.detail,hint:c.ok?void 0:"Install the Codex CLI first. The worker can also run `npm install -g @openai/codex` automatically."},{id:"codex-auth",category:"tooling",label:"Codex Sign-In",ok:l.ok,detail:l.detail,hint:l.ok?void 0:"Run `codex` and complete sign-in before trying again."},{id:"claude-cli",category:"tooling",label:"Claude Code CLI",ok:u.ok,detail:u.detail,hint:u.ok?void 0:"Install the Claude Code CLI first. The worker prefers the official native install flow."},{id:"claude-auth",category:"tooling",label:"Claude Code Authentication",ok:d.ok,detail:d.detail,hint:d.ok?void 0:"Configure Claude Console/API credentials, or run `claude` and complete sign-in before trying again."},{id:"opencode-config",category:"config",label:"OpenCode Configuration",ok:m,detail:m?"Loaded the OpenCode providers configuration.":"OpenCode providers configuration was not found.",hint:m?void 0:"Add the OpenCode providers JSON in central settings or on this worker machine."},{id:"codex-config",category:"config",label:"Codex Configuration",ok:g,detail:g?"Loaded `Codex config.toml`.":"`Codex config.toml` was not found.",hint:g?void 0:"Provide it through central settings, or prepare `~/.codex/config.toml` on this worker machine."},{id:"claude-config",category:"config",label:"Claude Code Configuration",ok:k,detail:k?"Loaded `Claude Code settings.json`.":"`Claude Code settings.json` was not found.",hint:k?void 0:"Provide it through central settings, or prepare `~/.claude/settings.json` on this worker machine."},{id:"worker-home",category:"filesystem",label:"Worker Home",ok:o.ok,detail:o.detail,hint:o.ok?void 0:"Check directory permissions and confirm the worker home can be created and written."},{id:"workspace",category:"filesystem",label:"Workspace",ok:i.ok,detail:i.detail,hint:i.ok?void 0:"Confirm the workspace root path is valid and writable by the current user."},{id:"machine-id",category:"config",label:"Machine ID",ok:!!e.machineId,detail:e.machineId?`Configured: ${e.machineId}`:"Machine ID is not configured.",hint:e.machineId?void 0:"Reset the local worker config and start the worker again to generate a fresh machine ID."},{id:"pairing",category:"config",label:"Pairing",ok:!!(e.executorId&&e.executorToken),detail:e.executorId?`Paired: ${e.executorId}`:"Pairing has not been completed.",hint:e.executorId?void 0:`Run \`npx -y ${Em()} connect --pairing-code <CODE>\`, or enter the pairing code in the local worker console.`},{id:"cloud-url",category:"network",label:"Control Plane URL",ok:!!e.cloudUrl?.trim(),detail:e.cloudUrl?.trim()||"Cloud URL is not configured.",hint:e.cloudUrl?.trim()?void 0:"Enter the control-plane Cloud URL first."},{id:"cloud-reachable",category:"network",label:"Control Plane Reachability",ok:t.ok,detail:t.message,hint:t.ok?void 0:"Confirm the control-plane service is running and reachable from this machine."},{id:"official-site",category:"network",label:"OpenCode Official Site",ok:n.ok,detail:n.message,hint:n.ok?void 0:"If the official site is unreachable, the current network likely has outbound access restrictions."}];return{config:qr(e),checks:{git:s.ok,opencodeAvailable:a.ok,codexCliAvailable:c.ok,codexAuthenticated:l.ok,claudeCliAvailable:u.ok,claudeAuthenticated:d.ok,opencodeConfigLoaded:m,codexConfigLoaded:g,claudeConfigLoaded:k,workerHomeWritable:o.ok,workspaceConfigured:!!e.workspaceRoot,workspaceReady:i.ok,machineIdConfigured:!!e.machineId,paired:!!(e.executorId&&e.executorToken),cloudUrlConfigured:!!e.cloudUrl?.trim(),cloudReachable:t.ok,officialSiteReachable:n.ok},items:h,summary:Am(h),cloudProbe:t,officialSiteProbe:n,runtime:ut()}},go=async()=>{console.log(JSON.stringify(await qs(),null,2))},yt=()=>qs();import{existsSync as Mm,statfsSync as Om}from"node:fs";import ge from"node:os";import zs from"node:path";var Hs=null,Js=(e,t=1)=>{let n=10**t;return Math.round(e*n)/n},_m=()=>ge.cpus().reduce((e,t)=>{let n=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+n}},{idle:0,total:0}),Wm=()=>{let e=ge.cpus(),t=_m(),n=Hs;Hs=t;let r=e.reduce((i,s)=>i+(Number.isFinite(s.speed)?s.speed:0),0),o=(()=>{if(!n)return;let i=t.total-n.total,s=t.idle-n.idle;if(!(i<=0))return Js((1-s/i)*100,1)})();return{coreCount:e.length,model:e[0]?.model,averageSpeedMhz:e.length>0?Math.round(r/e.length):void 0,loadAverage:ge.loadavg().map(i=>Js(i,2)),usagePercent:o}},Bm=()=>{let e=ge.totalmem(),t=ge.freemem();return{totalBytes:e,freeBytes:t,usedBytes:Math.max(0,e-t)}},Dm=e=>{let t=zs.resolve(e||process.cwd());for(;!Mm(t);){let n=zs.dirname(t);if(n===t)return process.cwd();t=n}return t},$m=e=>{try{let t=Dm(e),n=Om(t),r=Number(n.bsize),o=Number(n.blocks),i=Number(n.bfree),s=Number(n.bavail);if(!Number.isFinite(r)||!Number.isFinite(o)||r<=0||o<=0)return;let a=o*r,c=Math.max(0,i*r),l=Math.max(0,s*r);return{path:t,totalBytes:a,freeBytes:c,availableBytes:l,usedBytes:Math.max(0,a-c)}}catch{return}},Nm=e=>({platform:process.platform,arch:ge.arch(),hostname:ge.hostname(),release:ge.release(),version:typeof ge.version=="function"?ge.version():void 0,nodeVersion:process.version,workerVersion:e,systemUptimeSec:Math.max(0,Math.round(ge.uptime())),processUptimeSec:Math.max(0,Math.round(process.uptime()))}),Kn=e=>({capturedAt:new Date().toISOString(),cpu:Wm(),memory:Bm(),disk:$m(e.workspaceRoot),system:Nm(e.workerVersion)});var Um="openai",fo="OPENAI_API_KEY",Vs=1e4,ho=e=>!!e&&typeof e=="object"&&!Array.isArray(e),Pt=e=>typeof e=="string"?e.trim():"",Lm=e=>e.match(/^[A-Za-z0-9_.-]+\s*=\s*["']([^"']+)["']/)?.[1]?.trim()||"",jm=e=>{let t=e.indexOf("/");return t<0?"":e.slice(0,t).trim()},Fm=e=>{if(!e)return"";try{let n=new URL(e).hostname.toLowerCase().split(".").filter(Boolean),r=new Set(["api","www","cn","com","net","org","io","ai"]);return n.find(o=>!r.has(o))||""}catch{return""}},Gm=e=>{let t=e?.trim()||"";if(!t)return{};try{let n=JSON.parse(t);return ho(n)?n:{}}catch{return{}}},qm=e=>{let t=e??C();return{authContent:vn()||t.codexAuthContent,configContent:Pn()||t.codexConfigContent,fallbackDefaultModel:t.agentSettings?.Codex?.defaultModel?.trim()||""}},yo=e=>{let t=(e.configContent?.trim()||"").split(/\r?\n/),n=Gm(e.authContent),r="",o="",i="",s="",a="",c="";for(let m of t){let g=m.trim();if(!g||g.startsWith("#"))continue;let k=g.match(/^\[([^\]]+)\]$/);if(k){r=k[1]?.trim()||"";continue}let S=g.match(/^([A-Za-z0-9_.-]+)\s*=\s*["'][^"']+["']/)?.[1]?.trim()||"",y=Lm(g);if(!(!S||!y)){if(!r){S==="model"?o=y:S==="model_provider"?i=y:(S==="base_url"||S==="openai_base_url")&&(s=y);continue}r===`model_providers.${i}`&&(S==="base_url"?a=y:S==="env_key"&&(c=y))}}let l=i||jm(o)||Fm(a||s)||Um,u=c||fo;return{apiToken:Pt(n[u])||Pt(process.env[u])||Pt(n[fo])||Pt(process.env[fo]),baseUrl:a||s||Pt(process.env.OPENAI_BASE_URL),providerId:l,configuredModel:o}},zm=e=>{let t=e.trim().replace(/\/+$/g,"");return t?t.endsWith("/models")?t:`${t}/models`:""},Ks=(e,t,n)=>({id:Rr(e,t),label:`${e}/${t}`,providerId:e,modelId:t,isDefault:t===n}),Xs=(e,t)=>{let n=new Set;return(t?.trim()?[t.trim(),...e]:e).filter(o=>{let i=o.trim();return!i||n.has(i)?!1:(n.add(i),!0)})},Hm=e=>!ho(e)||!Array.isArray(e.data)?[]:e.data.map(t=>ho(t)?Pt(t.id):"").filter(Boolean),Jm=async(e,t={})=>{let n=yo({authContent:e.authContent,configContent:e.configContent}),r=n.configuredModel||e.fallbackDefaultModel?.trim()||void 0,o=Xs(r?[r]:[],r).map(l=>Ks(n.providerId,l,r));if(!e.configContent?.trim())return{models:o,defaultModel:r,message:"worker \u672A\u914D\u7F6E Codex \u6A21\u578B\u3002"};let i=zm(n.baseUrl),s=n.apiToken;if(!i||!s)return{models:o,defaultModel:r,message:o.length>0?"Codex provider \u672A\u58F0\u660E\u53EF\u8BFB\u53D6\u7684\u6A21\u578B\u5217\u8868\uFF0C\u5DF2\u56DE\u9000\u4E3A\u5F53\u524D\u9ED8\u8BA4\u6A21\u578B\u3002":"Codex provider \u7F3A\u5C11 Base URL \u6216 API Key\uFF0C\u65E0\u6CD5\u8BFB\u53D6\u6A21\u578B\u5217\u8868\u3002"};let a=new AbortController,c=setTimeout(()=>a.abort(),Vs);try{let l=await(t.fetchImpl??fetch)(i,{headers:{Authorization:`Bearer ${s}`},method:"GET",signal:a.signal});if(!l.ok)throw new Error(`HTTP ${l.status}`);let u=await l.json().catch(()=>null),m=Xs(Hm(u),r).map(g=>Ks(n.providerId,g,r));return{models:m.length>0?m:o,defaultModel:r,message:m.length>0?"\u5DF2\u4ECE Codex provider \u8BFB\u53D6\u6A21\u578B\u5217\u8868\u3002":"Codex provider \u672A\u8FD4\u56DE\u6A21\u578B\u5217\u8868\uFF0C\u5DF2\u56DE\u9000\u4E3A\u5F53\u524D\u9ED8\u8BA4\u6A21\u578B\u3002"}}catch(l){let u=l instanceof Error&&l.name==="AbortError"?`\u8BFB\u53D6 Codex provider \u6A21\u578B\u8D85\u65F6\uFF08>${Vs}ms\uFF09\u3002`:l instanceof Error?l.message:"\u8BFB\u53D6 Codex provider \u6A21\u578B\u5931\u8D25\u3002";return{models:o,defaultModel:r,message:o.length>0?`\u8BFB\u53D6 Codex provider \u6A21\u578B\u5931\u8D25\uFF0C\u5DF2\u56DE\u9000\u4E3A\u5F53\u524D\u9ED8\u8BA4\u6A21\u578B\uFF1A${u}`:`\u8BFB\u53D6 Codex provider \u6A21\u578B\u5931\u8D25\uFF1A${u}`}}finally{clearTimeout(c)}},Qs=async e=>{let t=qm(e);return Jm(t)};import{createHash as Ym}from"node:crypto";import Zm from"node:net";import{spawn as eg}from"node:child_process";import{createOpencodeClient as ca}from"@opencode-ai/sdk";var Vm=e=>Array.isArray(e)?e:[],Km=e=>e.info?.role==="assistant",ko=e=>e.info?.time?.created??0,Xm=(e,t)=>t===void 0?!0:ko(e)>=t,Zs=(e,t={})=>e.filter(n=>Km(n)&&Xm(n,t.promptStartedAtMs)).sort((n,r)=>ko(r)-ko(n)),Jt=e=>Vm(e).filter(t=>t.type==="text").map(t=>t.text?.trim()??"").filter(Boolean).join(`
49
+
50
+ `),ea=(e,t={})=>{let n=t.preferredMessageId?e.find(i=>i.info?.id===t.preferredMessageId):void 0,r=Jt(n?.parts);if(r)return r;let o=Zs(e,t).find(i=>Jt(i.parts));return o?Jt(o.parts):""},Ys=e=>!!e?.info?.time?.completed||!!e?.info?.error,ta=(e,t={})=>{let n=t.preferredMessageId?e.find(r=>r.info?.id===t.preferredMessageId):void 0;return n&&Ys(n)?!0:Zs(e,t).some(r=>Ys(r))};var X=(e,t)=>{console.log(`[worker-opencode] ${e}`,JSON.stringify(t))},fe=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"},ra=e=>{if(!e)return;let[t,...n]=e.split("/"),r=n.join("/");if(!(!t||!r))return{providerID:t,modelID:r}},na=e=>Array.isArray(e)?e:[],Qm=e=>Jt(e),oa=e=>e.map(t=>({id:t.info?.id,role:t.info?.role,created:t.info?.time?.created,completed:!!t.info?.time?.completed,error:!!t.info?.error,partTypes:na(t.parts).map(n=>n.type),textPreview:Qm(na(t.parts)).slice(0,160)})),wo=(e,t,n)=>ea(e,{preferredMessageId:t,promptStartedAtMs:n}),So=(e,t,n)=>ta(e,{preferredMessageId:t,promptStartedAtMs:n}),ia=e=>[...e.values()].join("").trim(),sa=(e,t)=>{let n=e.get(t);if(n)return n;let r=new Map;return e.set(t,r),r},xo=async e=>new Promise(t=>setTimeout(t,e)),Co=e=>{let t=e?.trim();if(!(!t||t.toLowerCase()==="default")){if(t.startsWith("{")||t.startsWith("[")||t.startsWith('"'))try{let n=JSON.parse(t);if(typeof n=="string")return Co(n);if(n&&typeof n=="object")return n}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}}},aa=e=>e&&"permissionPolicy"in e?e:void 0;var Po=new Map,tg=e=>Object.entries(e??{}).sort(([t],[n])=>t.localeCompare(n)),ng=(e,t)=>Ym("sha1").update(JSON.stringify({config:se(e),runtimeEnv:tg(t)})).digest("hex"),rg=(e,t,n=process.env)=>({...n,...t??{},OPENCODE_CONFIG_CONTENT:JSON.stringify(se(e))}),og=()=>{let e=Z(`${ne()}/node_modules/.bin/opencode`),t=Z("opencode")||e;if(t)return{command:t,args:[],detail:t};let n=Z("npx");if(n)return{command:n,args:["-y","opencode-ai"],detail:`${n} -y opencode-ai`};throw new Error("\u672A\u68C0\u6D4B\u5230\u53EF\u6267\u884C\u7684 OpenCode runtime\uFF08`opencode`\uFF09\uFF0C\u65E0\u6CD5\u542F\u52A8 OpenCode \u4F1A\u8BDD\u3002")},ig=async()=>new Promise((e,t)=>{let n=Zm.createServer();n.on("error",t),n.listen(0,"127.0.0.1",()=>{let r=n.address();if(!r||typeof r=="string"){n.close(()=>t(new Error("\u65E0\u6CD5\u5206\u914D OpenCode \u7AEF\u53E3\u3002")));return}let{port:o}=r;n.close(i=>{if(i){t(i);return}e(o)})})}),sg=async(e,t)=>{let n=await ig(),r=og(),o=eg(r.command,[...r.args,"serve","--hostname=127.0.0.1",`--port=${n}`],{env:rg(e,t),stdio:["ignore","pipe","pipe"]});return{url:await new Promise((s,a)=>{let c=setTimeout(()=>{a(new Error(`Timeout waiting for server to start after 15000ms via ${r.detail}`))},15e3),l="",u=!1,d=g=>{u||(u=!0,clearTimeout(c),g())},m=g=>{l+=g.toString();let k=l.split(`
51
+ `);for(let h of k){if(!h.startsWith("opencode server listening"))continue;let S=h.match(/on\s+(https?:\/\/[^\s]+)/);if(!S){d(()=>a(new Error(`Failed to parse server url from output: ${h}`)));return}d(()=>s(S[1]));return}};o.stdout?.on("data",m),o.stderr?.on("data",m),o.on("error",g=>{d(()=>a(g))}),o.on("exit",g=>{d(()=>{let k=l.trim();a(new Error(k?`OpenCode server exited with code ${g}: ${k}`:`OpenCode server exited with code ${g}`))})})}),close(){o.kill()}}},la=async(e,t)=>{let n=ng(e,t),r=Po.get(n);if(r)return r;let o=sg(e,t).catch(i=>{throw Po.delete(n),i});return Po.set(n,o),o},da=async(e,t,n)=>{let r=await la(t,n);return ca({baseUrl:r.url,directory:e})},ua=async(e,t)=>{let n=await la(e,t);return ca({baseUrl:n.url})},vo=async(e,t,n)=>{X("session:create:start",{cwd:t,title:n});let r;try{r=await e.session.create({body:{title:n},query:{directory:t}})}catch(o){throw X("session:create:error",{cwd:t,title:n,error:fe(o)}),o}if(X("session:create:result",{cwd:t,title:n,hasData:!!r.data,sessionId:r.data?.id,error:"error"in r?r.error:void 0,response:"response"in r?r.response:void 0}),!r.data?.id){let o=fe(r);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 r.data.id},pa=async(e,t,n,r)=>{let o=n?.trim();if(!o)return vo(e,t,r);try{return(await e.session.get({path:{id:o},query:{directory:t}})).data?(await e.session.update({path:{id:o},body:{title:r},query:{directory:t}}),o):vo(e,t,r)}catch{return vo(e,t,r)}};var ag=(e,t,n)=>({id:`${e}/${t}`,label:`${e}/${t}`,providerId:e,modelId:t,isDefault:n===`${e}/${t}`}),cg=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,n])=>!n||typeof n!="object"?t:"id"in n&&typeof n.id=="string"?n.id:t).filter(t=>!!t),lg=(e,t)=>{if(!e||typeof e!="object")return[];let n=e,r=["cloudflare","cf Workers","cf"];return(Array.isArray(n.providers)?n.providers:[...Object.entries(n.providers??{}).map(([i,s])=>({id:s.id||s.name||i,models:s.models})),...Object.entries(n.provider??{}).map(([i,s])=>({id:s.id||s.name||i,models:s.models}))]).filter(i=>{let s=i.id?.toLowerCase()??"";return!r.some(a=>s.includes(a.toLowerCase()))}).flatMap(i=>{let s=i.id;return s?cg(i.models).map(a=>ag(s,a,t)):[]}).sort((i,s)=>i.isDefault?-1:s.isDefault?1:i.label.localeCompare(s.label))},Eo=async()=>{let e=C(),t=En(e).trim(),n=e.defaultModel?.trim()||void 0;if(!t)return{models:[],defaultModel:n,message:"worker \u672A\u914D\u7F6E OpenCode \u63D0\u4F9B\u5546\u3002"};try{let o=await(await ua(t)).config.providers(),i="data"in o?o.data:o,s=Object.entries(i?.default??{}).find(([,c])=>!!c),a=s?`${s[0]}/${s[1]}`:n;return{models:lg(i,a),defaultModel:a,message:void 0}}catch(r){return X("models:error",{error:fe(r)}),{models:[],defaultModel:n,message:fe(r)}}};import{existsSync as dg}from"node:fs";var ma=e=>{let t=e,n=t.payload&&typeof t.payload=="object"?t.payload:t;return!n.type||!n.properties?null:{type:n.type,properties:n.properties}};var ga=500,fa=12e4,ha=1e3,ug=async(e,t,n)=>{try{let r=await e.session.messages({path:{id:n},query:{directory:t,limit:20}});return oa(Array.isArray(r.data)?r.data:[])}catch(r){return[{snapshotError:fe(r)}]}},pg=e=>{let n={...se(e.baseConfigContent)},r=e.agent?.trim()||void 0,o=Co(e.permissionPolicy),i=e.variant?.trim()||void 0;if(r&&typeof n.default_agent!="string"&&(n.default_agent=r),!o&&!i)return JSON.stringify(n);if(!r)return o&&(n.permission=o),JSON.stringify(n);let s=n.agent&&typeof n.agent=="object"&&!Array.isArray(n.agent)?n.agent:{},a=s[r];return n.agent={...s,[r]:a&&typeof a=="object"&&!Array.isArray(a)?{...a,...o?{permission:o}:{},...i?{variant:i}:{}}:{...o?{permission:o}:{},...i?{variant:i}:{}}},JSON.stringify(n)},mg=e=>{let t=C(),n=aa(e.agentSettings),r=e.opencodeConfig?.agent?.trim()||n?.agent?.trim()||void 0,o=e.opencodeConfig?.variant?.trim()||void 0,i=e.opencodeConfig?.permissionPolicy?.trim()||n?.permissionPolicy?.trim()||void 0,s=e.executionModel?.trim()||e.opencodeConfig?.model?.trim()||n?.defaultModel?.trim()||void 0,a=Array.isArray(e.mcpServers),l=[...e.mcpServers??t.mcpServers??[],...e.opencodeConfig?.mcpServers??[]],u=a||e.opencodeConfig?.mcpServers?.length?wn(t.opencodeConfigContent,l,{cloudUrl:t.cloudUrl,executorToken:t.executorToken,actingUserId:e.actingUserId}).trim():En(t,e.actingUserId).trim();return{agent:r,variant:o,executionModel:s,configContent:pg({baseConfigContent:u,agent:r,permissionPolicy:i,variant:o})}},ya=e=>{let t=e instanceof Error?e.message:typeof e=="string"?e:"";return/\babort(ed|ing)?\b/i.test(t)},gg=(e,t)=>{let n=e?.data;if(!(!n||typeof n!="object"))return t in n?n[t]:void 0},ka=async e=>{if(!dg(e.cwd))throw new Error(`\u5DE5\u4F5C\u76EE\u5F55\u4E0D\u5B58\u5728: ${e.cwd}`);let t=mg({actingUserId:e.actingUserId,executionModel:e.executionModel,agentSettings:e.agentSettings,opencodeConfig:e.opencodeConfig,mcpServers:e.mcpServers}),n=await da(e.cwd,t.configContent,e.runtimeEnv),r=await pa(n,e.cwd,e.resumeSessionId,e.title),o=Date.now(),i=!1,s=null,a=new Map,c=!1,l="",u=new AbortController,d=new Set,m=new Map,g=new Map,k="",h=!1,S=!1,y=()=>{i=!0,u.abort(),n.session.abort({path:{id:r},query:{directory:e.cwd}}).catch(()=>{})};e.signal?.addEventListener("abort",y,{once:!0});try{let b=(P,E)=>P.sessionID&&P.sessionID!==r||P.role!=="assistant"||!P.id?!1:(l=P.id,c=!0,E==="stream"&&X("event:message-updated",{sessionId:r,assistantMessageId:l,role:P.role}),!0),I=(P,E)=>P.sessionID&&P.sessionID!==r||(!l&&P.messageID&&(l=P.messageID),l&&P.messageID&&P.messageID!==l)?!1:(c=!0,E==="stream"&&X("event:message-part",{sessionId:r,assistantMessageId:l,partId:P.id,messageId:P.messageID,partType:P.type,textPreview:(P.text??"").slice(0,120)}),P.type==="text"&&P.messageID&&P.id&&sa(a,P.messageID).set(P.id,P.text??""),!0),_=(P,E)=>{let v=E?.type?JSON.stringify(E):"";v&&v!==k&&(k=v,e.onEvent?.({type:"session.status",properties:{sessionID:r,status:E}}));let M=P.filter(w=>w.info?.role==="assistant"&&w.info?.id).sort((w,p)=>(w.info?.time?.created??0)-(p.info?.time?.created??0));for(let w of M){let p=w.info;if(p?.id){d.has(p.id)||(d.add(p.id),e.onEvent?.({type:"message.updated",properties:{info:p}})),b(p,"snapshot");for(let f of w.parts??[]){if(f.type!=="text"&&f.type!=="reasoning"&&f.type!=="tool")continue;let x=f.id?f:{...f,id:`${w.info?.id}:${f.type}:${f.tool??"part"}`},U=JSON.stringify({type:x.type,text:x.text??"",tool:x.tool??"",state:x.state??null,time:x.time??null});if(m.get(x.id)===U)continue;m.set(x.id,U);let nt=g.get(x.id)??"",he=x.text??"";(x.type==="text"||x.type==="reasoning")&&g.set(x.id,he);let rt=he&&he.startsWith(nt)?he.slice(nt.length):void 0;e.onEvent?.({type:"message.part.updated",properties:rt===void 0?{part:x}:{part:x,delta:rt}}),I(x,"snapshot")}}}},H=async()=>{for(;!S&&!i&&!e.signal?.aborted&&Date.now()-o<fa;){try{let[P,E]=await Promise.all([n.session.messages({path:{id:r},query:{directory:e.cwd,limit:20}}),n.session.status({query:{directory:e.cwd}}).catch(()=>null)]),v=Array.isArray(P.data)?P.data:[],M=gg(E,r),w=l?void 0:Math.max(0,o-ha),p=M?.type==="busy",f=wo(v,l,w),x=So(v,l,w);if(_(v,M),f&&(c=!0),!p&&x){h||(h=!0,e.onEvent?.({type:"session.idle",properties:{sessionID:r}})),u.abort();break}}catch(P){if(S||i||e.signal?.aborted||ya(P))return}if(S||i||e.signal?.aborted)return;await xo(ga)}};X("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 O=await n.event.subscribe({signal:u.signal});X("prompt:subscribed",{cwd:e.cwd,sessionId:r});let Y=n.session.promptAsync({path:{id:r},query:{directory:e.cwd},body:{model:ra(t.executionModel),agent:t.agent,parts:[{type:"text",text:e.prompt}]}}).catch(P=>{i||e.signal?.aborted||(s=P instanceof Error?P:new Error(fe(P)),S=!0,X("prompt:async-error",{cwd:e.cwd,sessionId:r,error:s.message}),u.abort())}),B=H();try{for await(let P of O.stream){if(i||e.signal?.aborted)throw new Error("\u4EFB\u52A1\u5DF2\u53D6\u6D88");let E=ma(P);if(E){if(E.type==="permission.updated"&&e.onEvent?.({type:"permission.updated",properties:E.properties}),E.type==="session.status"){e.onEvent?.({type:"session.status",properties:E.properties}),E.properties.sessionID===r&&(c=!0,X("event:session-status",{sessionId:r,status:E.properties.status}));continue}if(E.type==="message.updated"){e.onEvent?.({type:"message.updated",properties:E.properties});let v=E.properties.info;b(v,"stream");continue}if(E.type==="message.part.updated"){e.onEvent?.({type:"message.part.updated",properties:E.properties});let v=E.properties.part;I(v,"stream");continue}if(E.type==="session.error"){e.onEvent?.({type:"session.error",properties:E.properties});let v=E.properties;if(v.sessionID!==r)continue;throw X("event:session-error",{sessionId:r,error:v.error}),new Error(fe(v.error))}if(E.type==="session.idle"&&(e.onEvent?.({type:"session.idle",properties:E.properties}),E.properties.sessionID===r&&c)){h=!0,X("event:session-idle",{sessionId:r,assistantMessageId:l,textPartCount:l?a.get(l)?.size??0:0});break}}}}catch(P){if(!(i||e.signal?.aborted||h||ya(P)))throw P}if(await B,S=!0,u.abort(),await Y,i||e.signal?.aborted)throw new Error("\u4EFB\u52A1\u5DF2\u53D6\u6D88");if(s)throw s;let j=l?ia(a.get(l)??new Map):"";if(!j)for(let P=0;P===0||Date.now()-o<fa;P+=1){P>0&&await xo(ga);let[E,v]=await Promise.all([n.session.messages({path:{id:r},query:{directory:e.cwd,limit:20}}),n.session.status({query:{directory:e.cwd}}).catch(()=>null)]),M=Array.isArray(E.data)?E.data:[],w=l?void 0:Math.max(0,o-ha),f=(v?.data&&typeof v.data=="object"&&r in v.data?v.data[r]:void 0)?.type==="busy";j=wo(M,l,w);let x=So(M,l,w);if(j&&!f&&x||!f&&x)break}return X("prompt:finish",{cwd:e.cwd,sessionId:r,assistantMessageId:l,outputPreview:(j||"OpenCode \u672A\u8FD4\u56DE\u6587\u672C\u8F93\u51FA\u3002").slice(0,200)}),{sessionId:r,output:j||"OpenCode \u672A\u8FD4\u56DE\u6587\u672C\u8F93\u51FA\u3002"}}catch(b){throw S=!0,X("prompt:error",{cwd:e.cwd,sessionId:r,assistantMessageId:l,aborted:i,error:fe(b),snapshot:await ug(n,e.cwd,r)}),b}finally{e.signal?.removeEventListener("abort",y)}},Io=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(`
52
+ `);return ka({actingUserId:e.actingUserId,cwd:e.cwd,title:`Task: ${e.title}`,prompt:t,executionModel:e.executionModel,agentSettings:e.agentSettings,opencodeConfig:e.opencodeConfig,mcpServers:e.mcpServers,runtimeEnv:e.runtimeEnv,signal:e.signal})},bo=async e=>ka({actingUserId:e.actingUserId,resumeSessionId:e.resumeSessionId,cwd:e.cwd,title:e.title,prompt:e.prompt,executionModel:e.executionModel,agentSettings:e.agentSettings,opencodeConfig:e.opencodeConfig,mcpServers:e.mcpServers,runtimeEnv:e.runtimeEnv,signal:e.signal,onEvent:e.onEvent});var wa=async e=>{let t=C();return e==="Codex"?Qs(t):Eo()};import{existsSync as fg,readFileSync as hg}from"node:fs";import Sa from"node:os";import Xn from"node:path";var yg=e=>{let t=e.trim().match(/^\$\{([A-Z0-9_]+)\}$/i);return t?process.env[t[1]]?.trim()||"":e.trim()},Yn=e=>typeof e!="string"?"":yg(e).trim(),De=e=>!!e&&typeof e=="object"&&!Array.isArray(e),vt=(e,t)=>{for(let n of t){let r=Yn(e[n]);if(r)return r}return""},xa=e=>{if(!fg(e))return null;try{let t=JSON.parse(hg(e,"utf8"));return De(t)?t:null}catch{return null}},kg=e=>{let t=e.trim();return t?t==="~"?Sa.homedir():t.startsWith("~/")?Xn.join(Sa.homedir(),t.slice(2)):t:""},wg=e=>{if(typeof e!="string")return"";let t=e.trim();return!t||t.startsWith("!")?"":/^[A-Z0-9_]+$/i.test(t)?process.env[t]?.trim()||"":t},Sg=e=>{let t=Yn(e.model);if(t)return t;let n=e.env&&typeof e.env=="object"?e.env:{};return vt(n,["ANTHROPIC_MODEL","ANTHROPIC_DEFAULT_SONNET_MODEL","ANTHROPIC_DEFAULT_OPUS_MODEL","ANTHROPIC_DEFAULT_HAIKU_MODEL"])},xg=(e,t)=>{let n=se(e.opencodeConfigContent),r=Object.entries(n.provider??n.providers??{}),o=new Map;for(let[i,s]of r){if(!s||typeof s!="object")continue;let a=s,c=vt(a,["baseURL","baseUrl","base_url","url","endpoint"]),l=vt(a,["apiKey","api_key","token","authToken","apiToken"]);o.set(i,{...c?{baseUrl:c}:{},...l?{apiToken:l}:{}})}return t.map(i=>({providerId:i.providerId,modelId:i.modelId,label:`OpenCode \xB7 ${i.id}`,...o.get(i.providerId),runtimeSettings:{defaultModel:i.id}}))};var Ro=e=>{let t=e?.trim()||"";if(!t)return null;let n=t.indexOf("/");if(n<0)return null;let r=t.slice(0,n).trim(),o=t.slice(n+1).trim();return!r||!o?null:{providerId:r,modelId:o}},Cg=new Map([["claude","anthropic"],["dashscope","qwen"],["gemini","google"],["glm","zhipu"],["grok","xai"],["kimi","moonshot"],["volcengine","doubao"]]),Ca=new Set(["anthropic","baichuan","deepseek","doubao","google","groq","minimax","minimax-cn","mistral","moonshot","openai","openrouter","pi","qwen","xai","zhipu"]),Pg=[{providerId:"anthropic",hostname:"api.anthropic.com"},{providerId:"deepseek",hostname:"api.deepseek.com"},{providerId:"google",hostname:"generativelanguage.googleapis.com"},{providerId:"groq",hostname:"api.groq.com"},{providerId:"minimax-cn",hostname:"api.minimaxi.com"},{providerId:"minimax",hostname:"api.minimax.io"},{providerId:"mistral",hostname:"api.mistral.ai"},{providerId:"moonshot",hostname:"api.moonshot.ai"},{providerId:"openai",hostname:"api.openai.com"},{providerId:"openrouter",hostname:"openrouter.ai"},{providerId:"qwen",hostname:"dashscope.aliyuncs.com"},{providerId:"xai",hostname:"x.ai"},{providerId:"zhipu",hostname:"open.bigmodel.cn"}],Pa=e=>e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,""),vg=e=>{let t=e?.trim()||"";if(!t)return"";let n=Pa(t);return Cg.get(n)||(Ca.has(n)?n:t)},Eg=(e,t)=>e===t||e.endsWith(`.${t}`),Ig=e=>Pg.find(n=>Eg(e,n.hostname))?.providerId||"",bg=e=>{let t=e?.trim();if(!t)return"";try{let r=new URL(t).hostname.toLowerCase(),o=Ig(r);if(o)return o;let s=["minimax","openrouter","anthropic","openai","deepseek","moonshot","kimi","gemini","google","xai","grok","groq","qwen","dashscope","doubao","volcengine","baichuan","zhipu","glm","mistral"].find(u=>r.includes(u));if(s)return s==="kimi"?"moonshot":s==="gemini"?"google":s==="grok"?"xai":s==="dashscope"?"qwen":s==="volcengine"?"doubao":s==="glm"?"zhipu":s;let a=r.split(".").filter(Boolean),c=new Set(["api","www","chat","cn","com","net","org","io","ai"]),l=a.find(u=>!c.has(u));return l?Pa(l):""}catch{return""}},Rg=e=>{let t=e?.trim().toLowerCase()||"";return t?t.includes("minimax")?"minimax":t.includes("claude")?"anthropic":t.includes("gpt")?"openai":t.includes("gemini")?"google":t.includes("deepseek")?"deepseek":t.includes("kimi")||t.includes("moonshot")?"moonshot":t.includes("grok")?"xai":t.includes("qwen")?"qwen":t.includes("doubao")?"doubao":t.includes("glm")?"zhipu":"":""},Tg=(e,t)=>!e||!t||e===t||!Ca.has(t)?!1:e==="openai"||e==="anthropic"?!0:e==="minimax"&&t==="minimax-cn",To=e=>{let t=vg(e.explicitProviderId),n=bg(e.baseUrl);return Tg(t,n)?n:t||n||Rg(e.modelId)||e.fallbackProviderId.trim()},Ag=(e,t)=>{let n=t.trim().toLowerCase();if(!n)return null;for(let[r,o]of Object.entries(e))if(r.trim().toLowerCase()===n)return De(o)?{providerId:r,config:o}:null;return null},va=(e,t)=>{let n=e.trim(),r=t.trim();return!n||!r?r||n:r.toLowerCase().startsWith(`${n.toLowerCase()}/`)?r:`${n}/${r}`},Qn=(e,t,n)=>`${e} \xB7 ${va(t,n)}`,Mg=(e,t)=>{let n=e.codexConfigContent?.trim()||"",r=yo({authContent:e.codexAuthContent,configContent:n}),o=r.configuredModel,i=r.baseUrl,s=r.apiToken,a=Ro(o)?.providerId||r.providerId,c=To({explicitProviderId:a,baseUrl:i,modelId:o,fallbackProviderId:"openai"}),l=t.filter(u=>u.providerId.trim().toLowerCase()===c.trim().toLowerCase());return l.length>0?l.map(u=>({providerId:c,modelId:u.modelId,label:Qn("Codex",c,u.modelId),...i?{baseUrl:i}:{},...s?{apiToken:s}:{},runtimeSettings:{defaultModel:u.modelId}})):o?[{providerId:c,modelId:o,label:Qn("Codex",c,o),...i?{baseUrl:i}:{},...s?{apiToken:s}:{},runtimeSettings:{defaultModel:o}}]:[]},Og=e=>{let t=e.claudeCodeConfigContent?.trim()||"";if(!t)return[];try{let n=JSON.parse(t),r=Sg(n);if(!r)return[];let o=n.env&&typeof n.env=="object"?n.env:{},i=vt(o,["ANTHROPIC_BASE_URL","ANTHROPIC_API_URL"])||process.env.ANTHROPIC_BASE_URL?.trim()||"",s=vt(o,["ANTHROPIC_AUTH_TOKEN","ANTHROPIC_API_KEY"])||process.env.ANTHROPIC_AUTH_TOKEN?.trim()||process.env.ANTHROPIC_API_KEY?.trim()||"",a=Ro(r)?.providerId,c=To({explicitProviderId:a,baseUrl:i,modelId:r,fallbackProviderId:"anthropic"});return[{providerId:c,modelId:r,label:Qn("ClaudeCode",c,r),...i?{baseUrl:i}:{},...s?{apiToken:s}:{},runtimeSettings:{defaultModel:r}}]}catch{return[]}},_g=e=>{if(!De(e.agentSettings))return"";let t=De(e.agentSettings.Pi)?e.agentSettings.Pi:null;return typeof t?.defaultModel=="string"?t.defaultModel.trim():""},Wg=e=>De(e.agentSettings.Pi)&&typeof e.agentSettings.Pi.agentDir=="string"&&e.agentSettings.Pi.agentDir.trim()?e.agentSettings.Pi.agentDir.trim():"",Bg=(e,t)=>{for(let[n,r]of Object.entries(e)){if(!De(r)||!Array.isArray(r.models))continue;if(r.models.some(i=>De(i)&&Yn(i.id)===t))return n}return""},Dg=e=>{let t=_g(e);if(!t)return[];let n=Wg(e),r=n?Xn.resolve(kg(n)):"",o=r?xa(Xn.join(r,"settings.json")):null,i=r?xa(Xn.join(r,"models.json")):null,s=De(i?.providers)?i.providers:{},a=Ro(t),c=a?.providerId||"",l=a?.modelId||t,u=c?"":Yn(o?.defaultProvider),d=u||c?"":Bg(s,l),g=[u,c,d].filter(Boolean).map(I=>Ag(s,I)).find(I=>!!I)??null,k=g?.config??null,h=k?vt(k,["baseUrl","baseURL","base_url","url","endpoint"]):"",S=k?wg(k.apiKey):"",y=To({explicitProviderId:u||c||d||g?.providerId,baseUrl:h,modelId:l,fallbackProviderId:"pi"}),b=va(y,l);return[{providerId:y,modelId:l,label:Qn("Pi",y,l),...h?{baseUrl:h}:{},...S?{apiToken:S}:{},runtimeSettings:{defaultModel:b,...r?{agentDir:r}:{}}}]},Ea=e=>e.agentType==="OpenCode"?xg(e.config,e.availableModels):e.agentType==="Codex"?Mg(e.config,e.availableModels):e.agentType==="ClaudeCode"?Og(e.config):e.agentType==="Pi"?Dg(e.config):[];var Ao=e=>{let t=C(),n=e.opencodeConfigContent!==void 0?e.opencodeConfigContent:t.opencodeConfigContent,r=e.codexConfigContent!==void 0?e.codexConfigContent:t.codexConfigContent,o=e.codexAuthContent!==void 0?e.codexAuthContent:t.codexAuthContent,i=e.claudeCodeConfigContent!==void 0?e.claudeCodeConfigContent:t.claudeCodeConfigContent,s=e.defaultModel!==void 0?e.defaultModel:t.defaultModel,a={...t,opencodeConfigContent:n,codexConfigContent:r,codexAuthContent:o,claudeCodeConfigContent:i,defaultModel:s,agentSettings:$t(e.agentSettings??t.agentSettings,s),mcpServers:e.mcpServers??t.mcpServers??[],maxConcurrency:Math.max(1,e.maxConcurrency??t.maxConcurrency)};return ke(a),D({config:a}),a};var Ia=(e,t)=>{let n=t.getConfig();if(e.type==="control-plane.ready")return n=Ao({opencodeConfigContent:e.opencodeConfigContent,codexConfigContent:e.codexConfigContent,codexAuthContent:e.codexAuthContent,claudeCodeConfigContent:e.claudeCodeConfigContent,defaultModel:e.defaultModel,agentSettings:e.agentSettings,mcpServers:e.mcpServers,maxConcurrency:e.maxConcurrency}),t.setConfig(n),D({config:n,executorId:n.executorId}),!0;if(e.type==="config.sync")return n=Ao({opencodeConfigContent:e.opencodeConfigContent,codexConfigContent:e.codexConfigContent,codexAuthContent:e.codexAuthContent,claudeCodeConfigContent:e.claudeCodeConfigContent,defaultModel:e.defaultModel,agentSettings:e.agentSettings,mcpServers:e.mcpServers,maxConcurrency:e.maxConcurrency}),t.setConfig(n),D({config:n}),!0;if(e.type==="executor.unpair"){let r=bn();return t.setConfig(r),D({daemonMode:"unpaired",paired:!1,connected:!1,executorId:void 0,config:r,lastError:e.reason||"This worker was removed from the control plane."}),!0}return e.type==="executor.shutdown"?(t.requestShutdown(e.reason||"Control plane requested worker shutdown."),!0):e.type==="config.export.request"?(n=C(),t.setConfig(n),wa(e.agentType).then(r=>{let o=Vi(),i=Pn(),s=vn(),a=Br(),c={...n,opencodeConfigContent:o||n.opencodeConfigContent,codexConfigContent:i||n.codexConfigContent,codexAuthContent:s||n.codexAuthContent,claudeCodeConfigContent:a||n.claudeCodeConfigContent};t.send({type:"config.export.response",executorId:n.executorId,requestId:e.requestId,opencodeConfigContent:c.opencodeConfigContent,codexConfigContent:c.codexConfigContent,codexAuthContent:c.codexAuthContent,claudeCodeConfigContent:c.claudeCodeConfigContent,defaultModel:r.defaultModel??n.defaultModel,agentSettings:n.agentSettings,availableModels:r.models,resolvedModelBindings:e.includeResolvedModelBindings?Ea({config:c,agentType:e.agentType,availableModels:r.models}):void 0,modelsMessage:r.message,at:new Date().toISOString()})}),!0):e.type==="executor.telemetry.request"?(n=C(),t.setConfig(n),t.send({type:"executor.telemetry.response",executorId:n.executorId,requestId:e.requestId,telemetry:Kn({workspaceRoot:n.workspaceRoot,workerVersion:ie()}),at:new Date().toISOString()}),!0):!1};import{readFileSync as ah}from"node:fs";import{basename as ch}from"node:path";var $g=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,ba=()=>AbortSignal.timeout(8e3),Ra=e=>{let t=e?.trim().toLowerCase()||"";if(!t)return"";let n=t.includes("://")?void 0:/^[^@/]+@([^:/?#]+):/i.exec(t)?.[1];if(n)return n;try{return new URL(/^[a-z][a-z\d+.-]*:\/\//i.test(t)?t:`https://${t}`).host}catch{return t.replace(/^https?:\/\//,"").split(/[/?#]/)[0].replace(/\/+$/,"")}},Ng=e=>{let t=Ra(e);return!t||t==="github.com"?"https://api.github.com/user":`https://${t}/api/v3/user`},Ug=e=>`https://${Ra(e)||"gitlab.com"}/api/v4/user`,Lg=async(e,t)=>{try{let n=await fetch(Ng(t),{headers:{Accept:"application/vnd.github+json",Authorization:`Bearer ${e}`,"User-Agent":"vibemux-pat-check"},signal:ba()});return n.status===401?{ok:!1,unauthorized:!0,message:"GitHub \u8FD4\u56DE 401\uFF0Ctoken \u4E0D\u53EF\u7528\u3002"}:n.ok?{ok:!0,account:(await n.json()).login||"unknown",scopes:n.headers.get("x-oauth-scopes")||void 0,message:"GitHub PAT \u53EF\u7528\u3002"}:{ok:!1,message:`GitHub \u6821\u9A8C\u5931\u8D25\uFF08HTTP ${n.status}\uFF09\u3002`}}catch(n){return{ok:!1,message:n instanceof Error?n.message:"GitHub \u6821\u9A8C\u5931\u8D25\u3002"}}},jg=async(e,t)=>{try{let n=await fetch(Ug(t),{headers:{"PRIVATE-TOKEN":e,"User-Agent":"vibemux-pat-check"},signal:ba()});if(n.status===401)return{ok:!1,unauthorized:!0,message:"GitLab \u8FD4\u56DE 401\uFF0Ctoken \u4E0D\u53EF\u7528\u3002"};if(!n.ok)return{ok:!1,message:`GitLab \u6821\u9A8C\u5931\u8D25\uFF08HTTP ${n.status}\uFF09\u3002`};let r=await n.json();return{ok:!0,account:r.username||r.name||"unknown",message:"GitLab PAT \u53EF\u7528\u3002"}}catch(n){return{ok:!1,message:n instanceof Error?n.message:"GitLab \u6821\u9A8C\u5931\u8D25\u3002"}}},Ta=async(e,t,n)=>{let r=e.trim();if(!r)return{ok:!1,message:"PAT \u4E0D\u80FD\u4E3A\u7A7A\u3002"};let o=$g(r),i=t?[t]:o?[o]:["github","gitlab"];for(let s of i){let a=s==="github"?await Lg(r,n):await jg(r,n);if(a.ok){let c=s==="github"&&a.scopes?`\uFF0Cscopes\uFF1A${a.scopes}`:"",l=s==="github"?"\u3002\u63D0\u793A\uFF1A\u6B64\u5904\u4EC5\u9A8C\u8BC1 token \u672C\u8EAB\uFF1B\u8BBF\u95EE\u79C1\u6709\u4ED3\u5E93\u8FD8\u9700\u8981\u8BE5 token \u88AB\u6388\u4E88\u76EE\u6807\u4ED3\u5E93\u8BFB\u53D6\u6743\u9650":"";return{ok:!0,provider:s,account:a.account,message:`${s==="github"?"GitHub":"GitLab"} \u6821\u9A8C\u901A\u8FC7\uFF0C\u5F53\u524D\u8D26\u53F7 ${a.account}${c}${l}\u3002`}}if(!a.unauthorized||o)return{ok:!1,provider:s,message:a.message}}return{ok:!1,message:"\u672A\u8BC6\u522B PAT \u5BF9\u5E94\u5E73\u53F0\uFF0C\u6216 token \u5DF2\u5931\u6548\u3002"}};import{createHash as Fg}from"node:crypto";import{accessSync as Aa,existsSync as It,mkdirSync as Gg,readdirSync as Oa,readFileSync as Oo,rmSync as qg,statSync as _o,unlinkSync as zg,writeFileSync as Hg}from"node:fs";import Jg from"node:os";import z from"node:path";var Mo=1,Zn=1,Vg=64*1024*1024,Kg=200*1024,Xg=e=>e?.trim()||process.env.VIBEMUX_AGENT_HOME?.trim()||z.join(Jg.homedir(),".vibemux"),Wo=e=>e.replace(/\\/g,"/").replace(/^\/+/,"").split("/").filter(t=>t&&t!==".").join("/"),Qg=(e,t)=>{let n=z.relative(e,t);return n===""||!n.startsWith("..")&&!z.isAbsolute(n)},Yg=e=>{let t=e.trim();if(!t)throw new Error("Agent ID \u4E0D\u80FD\u4E3A\u7A7A\u3002");return t.replace(/[^a-zA-Z0-9._-]+/g,"-")},we=e=>{It(e)||Gg(e,{recursive:!0})},_a=e=>{if(!It(e))return null;try{return JSON.parse(Oo(e,"utf8"))}catch{return null}},Bo=(e,t)=>{Hg(e,`${JSON.stringify(t,null,2)}
53
+ `,"utf8")},Ma=e=>new Date(e).toISOString(),Zg=(e,t)=>{if(!(t>Vg))return Fg("sha256").update(Oo(e)).digest("hex")},Wa=(e,t)=>{let n=Yg(e),r=z.join(Xg(t),"agents",n),o=z.join(r,"workdir"),i=z.join(r,".system"),s=z.join(i,"manifest.json"),a=z.join(i,"snapshots"),c=z.join(a,"current.json"),l=z.join(i,"sessions"),u=z.join(i,"runtime"),d=z.join(u,"temp"),m=z.join(i,"logs");return{rootPath:r,workDirPath:o,systemPath:i,manifestPath:s,snapshotsDir:a,snapshotPath:c,sessionsDir:l,runtimeDir:u,runtimeTempDir:d,logsDir:m}},ef=(e,t,n)=>{let r=new Date().toISOString();return{version:Mo,agentId:e.trim(),rootPath:t.rootPath,workDirPath:t.workDirPath,status:"ready",storageVersion:Mo,snapshotVersion:Zn,createdAt:n?.createdAt||r,updatedAt:r,lastUsedAt:n?.lastUsedAt,lastSessionId:n?.lastSessionId,lastScannedAt:n?.lastScannedAt}},$e=(e,t)=>{let n=Wa(e,t);return{paths:n,manifest:_a(n.manifestPath)}},Do=(e,t,n)=>{let{paths:r,manifest:o}=$e(e,t),i={...ef(e,r,o),...n,updatedAt:new Date().toISOString()};return Bo(r.manifestPath,i),i},Ye=(e,t)=>{let{paths:n}=$e(e,t);return _a(n.snapshotPath)},Et=(e,t,n,r,o)=>{let{paths:i}=$e(e,t),s=o?.files??[];return{agentId:e.trim(),rootPath:i.rootPath,workDirPath:i.workDirPath,systemPath:i.systemPath,status:n,totalFiles:s.filter(a=>a.type==="file").length,totalDirectories:s.filter(a=>a.type==="directory").length,totalSizeBytes:s.filter(a=>a.type==="file").reduce((a,c)=>a+c.sizeBytes,0),lastUsedAt:r?.lastUsedAt,lastSessionId:r?.lastSessionId,lastScannedAt:r?.lastScannedAt??o?.scannedAt,manifestVersion:r?.storageVersion??Mo,snapshotVersion:r?.snapshotVersion??Zn}},$o=(e,t)=>{let{paths:n,manifest:r}=$e(e,t);if(!It(n.workDirPath)||!It(n.systemPath))return{paths:n,manifest:r,summary:Et(e,t,"missing",r,Ye(e,t))};try{return Aa(n.workDirPath),Aa(n.systemPath),{paths:n,manifest:r,summary:Et(e,t,"ready",r,Ye(e,t))}}catch{return{paths:n,manifest:r,summary:Et(e,t,"error",r,Ye(e,t))}}},Ba=(e,t="")=>{let n=t?z.join(e,t):e,r=Oa(n,{withFileTypes:!0}),o=[];for(let i of r){let s=Wo(z.join(t,i.name)),a=z.join(n,i.name),c=_o(a);if(i.isDirectory()){o.push({path:s,type:"directory",sizeBytes:0,modifiedAt:Ma(c.mtimeMs)}),o.push(...Ba(e,s));continue}i.isFile()&&o.push({path:s,type:"file",sizeBytes:c.size,modifiedAt:Ma(c.mtimeMs),sha256:Zg(a,c.size)})}return o},er=(e,t)=>{let n=Wa(e,t);we(n.rootPath),we(n.workDirPath),we(n.systemPath),we(n.snapshotsDir),we(z.join(n.snapshotsDir,"history")),we(n.sessionsDir),we(n.runtimeDir),we(n.runtimeTempDir),we(z.join(n.runtimeDir,"locks")),we(n.logsDir);let r=Do(e,t);return{summary:Et(e,t,"ready",r,Ye(e,t)),files:Ye(e,t)?.files??[]}},Da=(e,t)=>(er(e,t),No(e,t)),No=(e,t)=>{let{summary:n}=$o(e,t);if(n.status!=="ready")return{summary:n,files:[]};let{paths:r}=$e(e,t),o=new Date().toISOString(),i=Ba(r.workDirPath).sort((a,c)=>a.path.localeCompare(c.path));Bo(r.snapshotPath,{version:Zn,agentId:e.trim(),scannedAt:o,files:i});let s=Do(e,t,{lastScannedAt:o,status:"ready"});return{summary:Et(e,t,"ready",s,{version:Zn,agentId:e.trim(),scannedAt:o,files:i}),files:i}},Vt=(e,t)=>{let{manifest:n,summary:r}=$o(e,t);return r.status!=="ready"?r:Et(e,t,"ready",n,Ye(e,t))},bt=(e,t=!1,n)=>t?No(e,n):{summary:Vt(e,n),files:Ye(e,n)?.files??[]},$a=(e,t,n)=>{er(e,n);let{paths:r}=$e(e,n),o=new Date().toISOString();Do(e,n,{lastUsedAt:o,lastSessionId:t.trim()||void 0}),Bo(z.join(r.sessionsDir,`${t.trim()||"session"}.json`),{sessionId:t.trim()||"session",cwd:r.workDirPath,lastUsedAt:o})},Na=(e,t)=>{let{paths:n}=$e(e,t);if(It(n.runtimeTempDir))for(let r of Oa(n.runtimeTempDir))qg(z.join(n.runtimeTempDir,r),{force:!0,recursive:!0});return Vt(e,t)},tr=(e,t,n)=>{let{summary:r}=$o(e,n);if(r.status!=="ready")throw new Error("Agent \u5DE5\u4F5C\u76EE\u5F55\u5C1A\u672A\u521D\u59CB\u5316\u3002");let o=Wo(t);if(!o)throw new Error("\u6587\u4EF6\u8DEF\u5F84\u4E0D\u80FD\u4E3A\u7A7A\u3002");let{paths:i}=$e(e,n),s=z.resolve(i.workDirPath,o);if(!Qg(i.workDirPath,s))throw new Error("\u6587\u4EF6\u8DEF\u5F84\u8D8A\u754C\u3002");if(!It(s)||!_o(s).isFile())throw new Error("\u6587\u4EF6\u4E0D\u5B58\u5728\u3002");return{absolutePath:s,relativePath:o}},Ua=(e,t,n)=>{let r=tr(e,t,n);return zg(r.absolutePath),No(e,n)},La=(e,t,n)=>{try{let r=tr(e,t,n),o=_o(r.absolutePath);if(!o.isFile())return{ok:!1,relativePath:r.relativePath,message:"\u5F53\u524D\u8DEF\u5F84\u4E0D\u662F\u6587\u4EF6\u3002"};if(o.size>Kg)return{ok:!1,relativePath:r.relativePath,sizeBytes:o.size,message:"\u6587\u4EF6\u8FC7\u5927\uFF0C\u6682\u4E0D\u652F\u6301\u9884\u89C8\u3002"};let i=Oo(r.absolutePath);return i.includes(0)?{ok:!1,relativePath:r.relativePath,sizeBytes:o.size,message:"\u6682\u4E0D\u652F\u6301\u9884\u89C8\u4E8C\u8FDB\u5236\u6587\u4EF6\u3002"}:{ok:!0,relativePath:r.relativePath,content:i.toString("utf8"),sizeBytes:o.size,truncated:!1}}catch(r){return{ok:!1,relativePath:Wo(t),message:r instanceof Error?r.message:"\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25\u3002"}}};import{readFile as nf}from"node:fs/promises";import Fa from"node:os";import rr from"node:path";import{simpleGit as rf}from"simple-git";import{spawnSync as tf}from"node:child_process";var Kt=(e,t,n)=>{let r=tf("git",t,{cwd:e,env:n,encoding:"utf8"});if(r.status!==0)throw new Error((r.stderr||r.stdout||"git command failed").trim())},nr=(e,t,n)=>{try{Kt(e,t,n)}catch{return}},Ae=e=>{let t=Ds({taskId:e.taskId,identity:e.identity,repoUrl:e.repoUrl});return{env:t.env,tempDir:t.tempDir,configureRepo(n){e.identity.name&&e.identity.email&&(Kt(n,["config","--local","user.name",e.identity.name],t.env),Kt(n,["config","--local","user.email",e.identity.email],t.env)),t.env.GIT_SSH_COMMAND&&Kt(n,["config","--local","core.sshCommand",t.env.GIT_SSH_COMMAND],t.env),t.env.GIT_ASKPASS&&Kt(n,["config","--local","core.askPass",t.env.GIT_ASKPASS],t.env)},cleanup(n){n&&(e.identity.name&&e.identity.email&&(nr(n,["config","--local","--unset-all","user.name"],t.env),nr(n,["config","--local","--unset-all","user.email"],t.env)),nr(n,["config","--local","--unset-all","core.askPass"],t.env),nr(n,["config","--local","--unset-all","core.sshCommand"],t.env)),t.cleanup()}}},ja=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 Xt="main",of=e=>{let t=e.trim();return t?t==="~"?Fa.homedir():t.startsWith("~/")?rr.join(Fa.homedir(),t.slice(2)):t:""},Uo=e=>rr.resolve(of(e)),sf=(e,t)=>{let n={...ht(t),...e?{baseDir:e}:{}};return rf(n).env(t??{})},le=e=>{let t=e.trim();if(!t||t==="HEAD"||t.endsWith("/HEAD"))return"";let n=t.startsWith("refs/heads/")?t.slice(11):t,r=n.startsWith("remotes/")?n.slice(8):n;return r.startsWith("origin/")?r.slice(7):r},af=e=>e.split("\0").map(t=>t.trim()).filter(Boolean),cf=e=>e.split(rr.sep).join("/"),Lo=(e,t)=>{let n=new Map;for(let r of t.split(`
54
+ `).map(o=>o.trim()).filter(Boolean)){let o=r.split(" "),i=o[0]||"M",s=o.length>2?`${o[1]} \u2192 ${o[2]}`:o[1]||"";s&&n.set(s,i)}return e.split(`
55
+ `).map(r=>r.trim()).filter(Boolean).map(r=>r.split(" ")).map(r=>{if(r.length<3)return null;let o=r[0]==="-"?0:Number(r[0]),i=r[1]==="-"?0:Number(r[1]),s=r.length>3?`${r[2]} \u2192 ${r[3]}`:r[2];return{path:s,status:n.get(s)||"M",additions:Number.isFinite(o)?o:0,deletions:Number.isFinite(i)?i:0}}).filter(r=>!!r)},lf=e=>{if(e.length===0||e.includes(0))return 0;let t=e.toString("utf8").replace(/\r\n/g,`
56
+ `);if(!t)return 0;let n=t.split(`
63
57
  `).length;return t.endsWith(`
64
- `)?Math.max(0,r-1):r},lw=(e,t)=>{let r=aw(e),n=[`diff --git a/${r} b/${r}`,"new file mode 100644","--- /dev/null",`+++ b/${r}`];if(t.length===0)return`${n.join(`
58
+ `)?Math.max(0,n-1):n},df=(e,t)=>{let n=cf(e),r=[`diff --git a/${n} b/${n}`,"new file mode 100644","--- /dev/null",`+++ b/${n}`];if(t.length===0)return`${r.join(`
65
59
  `)}
66
- `;if(t.includes(0))return`${n.join(`
60
+ `;if(t.includes(0))return`${r.join(`
67
61
  `)}
68
- Binary files /dev/null and b/${r} differ
62
+ Binary files /dev/null and b/${n} differ
69
63
  `;let o=t.toString("utf8").replace(/\r\n/g,`
70
- `),s=o.endsWith(`
64
+ `),i=o.endsWith(`
71
65
  `)?o.slice(0,-1).split(`
72
66
  `):o.split(`
73
- `),i=[`@@ -0,0 +1,${s.length} @@`,...s.map(a=>`+${a}`)];return o.endsWith(`
74
- `)||i.push("\"),`${n.join(`
67
+ `),s=[`@@ -0,0 +1,${i.length} @@`,...i.map(a=>`+${a}`)];return o.endsWith(`
68
+ `)||s.push("\"),`${r.join(`
75
69
  `)}
76
- ${i.join(`
70
+ ${s.join(`
77
71
  `)}
78
- `},du=async(e,t)=>Promise.all(iw(t).map(async r=>{let n=eo.join(e,r),o=await rw(n).catch(()=>Buffer.alloc(0));return{file:{path:r,status:"??",additions:cw(o),deletions:0},patch:lw(r,o)}}));var pu=e=>{let t=e.map(r=>r.trimEnd()).filter(Boolean);return t.length>0?`${t.join(`
72
+ `},qa=async(e,t)=>Promise.all(af(t).map(async n=>{let r=rr.join(e,n),o=await nf(r).catch(()=>Buffer.alloc(0));return{file:{path:n,status:"??",additions:lf(o),deletions:0},patch:df(n,o)}}));var za=e=>{let t=e.map(n=>n.trimEnd()).filter(Boolean);return t.length>0?`${t.join(`
79
73
  `)}
80
- `:""},uu=async(e,t)=>{let r=[`refs/remotes/origin/${t}`,`origin/${t}`,`refs/heads/${t}`,t];for(let n of r)try{return await e.raw(["rev-parse","--verify",n]),{baseBranch:t,baseRef:n}}catch{}return null},mu=async(e,t,r)=>{let n=he(t)||Mr;if(r?.forceFetchFirst)try{await e.fetch(["origin",`${n}:refs/remotes/origin/${n}`])}catch{}let o=await uu(e,n);if(o)return o;if(!r?.forceFetchFirst){try{await e.fetch(["origin",`${n}:refs/remotes/origin/${n}`])}catch{}let s=await uu(e,n);if(s)return s}throw new Error(`\u627E\u4E0D\u5230\u57FA\u7EBF\u5206\u652F ${n}\u3002`)},et=async e=>{let t=await e.branchLocal();return he(t.current)||"HEAD"},uw=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}},dw=async e=>{try{return await e.raw(["rev-parse","--verify","HEAD"]),!0}catch{return!1}},pw=async(e,t)=>{try{return(await e.raw(["rev-list","--parents","-n","1",t])).trim().split(/\s+/).filter(Boolean)[1]}catch{return}},mw=async e=>{try{return(await e.raw(["diff","--name-only","--diff-filter=U"])).split(`
81
- `).map(r=>r.trim()).filter(Boolean)}catch{return[]}},fw=e=>{let t=e.trim();return!t.startsWith("(")||!t.endsWith(")")?[]:t.slice(1,-1).split(",").map(r=>r.trim()).filter(Boolean)},gw=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},hw=e=>e.split("").map(t=>t.trim()).filter(Boolean).map(t=>{let[r="",n="",o="",s="",i="",a=""]=t.split(""),c=fw(o);return{sha:r,shortSha:r.slice(0,7),parents:n.split(" ").map(l=>l.trim()).filter(Boolean),subject:s.trim(),authorDate:i.trim(),authorName:a.trim(),refs:c,isHead:c.some(l=>l.startsWith("HEAD"))}}),tt=async e=>{let t=ni(e.worktreePath),r=Ge({taskId:`${e.taskKey}-${Buffer.from(t).toString("base64url").slice(0,24)}`,identity:e.gitIdentity??{mode:"personal"},repoUrl:e.repoUrl});try{r.configureRepo(t);let n=sw(t,r.env);return await e.run(n)}finally{r.cleanup(t)}},fu=async e=>{try{return await tt({...e,taskKey:"git-diff",run:async t=>{let{baseBranch:r,baseRef:n}=await mu(t,e.baseBranch),o=await et(t),s=ni(e.worktreePath),[i,a,c,l,d]=await Promise.all([t.raw(["diff","--numstat","--find-renames","--merge-base",n]),t.raw(["diff","--name-status","--find-renames","--merge-base",n]),t.raw(["diff","--find-renames","--merge-base",n]),uw(t,n),t.raw(["ls-files","--others","--exclude-standard","-z"])]),u=oi(i,a),p=new Set(u.map(k=>k.path)),m=await du(s,d),y=m.map(k=>k.file).filter(k=>!p.has(k.path)),g=u.concat(y),w=pu([c,...m.map(k=>k.patch)]);return{ok:!0,message:g.length>0?`\u5DF2\u751F\u6210\u5F53\u524D\u5DE5\u4F5C\u533A\u76F8\u5BF9 ${r} \u7684\u5DEE\u5F02\u3002`:`\u5F53\u524D\u5DE5\u4F5C\u533A\u76F8\u5BF9 ${r} \u6CA1\u6709\u5DEE\u5F02\u3002`,baseBranch:r,currentBranch:o,aheadCommits:l,files:g,patch:w}}})}catch(t){let r=Y(t,e.repoUrl);return{ok:!1,message:r instanceof Error?r.message:"\u8BFB\u53D6 Git diff \u5931\u8D25\u3002",baseBranch:he(e.baseBranch)||Mr,currentBranch:"HEAD",aheadCommits:0,files:[],patch:""}}},gu=async e=>{try{return await tt({...e,taskKey:"git-working-tree-diff",run:async t=>{let r=await et(t),n=await dw(t),o=ni(e.worktreePath),[s,i,a,c]=await Promise.all([n?t.raw(["diff","--numstat","--find-renames","HEAD"]):Promise.resolve(""),n?t.raw(["diff","--name-status","--find-renames","HEAD"]):Promise.resolve(""),n?t.raw(["diff","--find-renames","HEAD"]):Promise.resolve(""),t.raw(["ls-files","--others","--exclude-standard","-z"])]),l=n?oi(s,i):[],d=await du(o,c),u=d.map(g=>g.file),p=new Set(l.map(g=>g.path)),m=l.concat(u.filter(g=>!p.has(g.path))),y=pu([a,...d.map(g=>g.patch)]);return{ok:!0,message:m.length>0?"\u5DF2\u751F\u6210\u5F53\u524D\u5DE5\u4F5C\u533A\u672A\u63D0\u4EA4\u6539\u52A8\u3002":"\u5F53\u524D\u5DE5\u4F5C\u533A\u6CA1\u6709\u672A\u63D0\u4EA4\u6539\u52A8\u3002",currentBranch:r,files:m,patch:y}}})}catch(t){let r=Y(t,e.repoUrl);return{ok:!1,message:r instanceof Error?r.message:"\u8BFB\u53D6\u5F53\u524D\u5DE5\u4F5C\u533A Git \u6539\u52A8\u5931\u8D25\u3002",currentBranch:"HEAD",files:[],patch:""}}},hu=async e=>{try{return await tt({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 pw(t,r),[o,s,i]=await Promise.all([t.raw(["show","--format=","--find-renames",r]),t.raw(["show","--format=","--numstat","--find-renames",r]),t.raw(["show","--format=","--name-status","--find-renames",r])]),a=oi(s,i);return{ok:!0,message:a.length>0?`\u5DF2\u52A0\u8F7D\u63D0\u4EA4 ${r.slice(0,7)} \u7684 diff\u3002`:`\u63D0\u4EA4 ${r.slice(0,7)} \u6CA1\u6709\u6587\u4EF6\u5DEE\u5F02\u3002`,commitSha:r,parentSha:n,files:a,patch:o}}})}catch(t){let r=Y(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:""}}},yu=async e=>{try{return await tt({...e,taskKey:"git-rebase",run:async t=>{let{baseBranch:r,baseRef:n}=await mu(t,e.baseBranch,{forceFetchFirst:!0}),o=await et(t);try{return await t.raw(["rebase",n]),{ok:!0,message:`\u5DF2\u5C06 ${o} rebase \u5230 ${r}\u3002`,baseBranch:r,currentBranch:o,conflicts:!1,conflictedFiles:[]}}catch(s){let i=await mw(t),a=Y(s,e.repoUrl);return{ok:!1,message:i.length>0?`rebase \u53D1\u751F\u51B2\u7A81\uFF0C\u8BF7\u5148\u89E3\u51B3\u51B2\u7A81\u540E\u518D\u7EE7\u7EED\u3002${a instanceof Error?` ${a.message}`:""}`.trim():a instanceof Error?a.message:"\u6267\u884C rebase \u5931\u8D25\u3002",baseBranch:r,currentBranch:o,conflicts:i.length>0,conflictedFiles:i}}}})}catch(t){let r=Y(t,e.repoUrl);return{ok:!1,message:r instanceof Error?r.message:"\u6267\u884C rebase \u5931\u8D25\u3002",baseBranch:he(e.baseBranch)||Mr,currentBranch:"HEAD",conflicts:!1,conflictedFiles:[]}}},ku=async e=>{let t=Math.min(120,Math.max(10,e.limit??40));try{return await tt({...e,taskKey:"git-graph",run:async r=>{let n=await et(r),o=he(e.baseBranch)||Mr,s=await r.raw(["log","--decorate=short","--date=iso-local","--topo-order",`--max-count=${t}`,"--all","--format=%H%x1f%P%x1f%d%x1f%s%x1f%cd%x1f%an%x1e"]),i=await r.raw(["log","--graph","--decorate","--date=short",`--max-count=${t}`,"--all","--no-color","--pretty=format:%h %d %s (%cd)"]),a=hw(s);return{ok:!0,message:"\u5DF2\u52A0\u8F7D Git graph\u3002",baseBranch:o,currentBranch:n,limit:t,commitCount:a.length,graph:i,commits:a}}})}catch(r){let n=Y(r,e.repoUrl);return{ok:!1,message:n instanceof Error?n.message:"\u8BFB\u53D6 Git graph \u5931\u8D25\u3002",baseBranch:he(e.baseBranch)||Mr,currentBranch:"HEAD",limit:t,commitCount:0,graph:"",commits:[]}}},wu=async e=>{try{return await tt({...e,taskKey:"git-push",run:async t=>{let r=e.branchName?.trim()||await et(t),n=he(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=Y(t,e.repoUrl);return{ok:!1,message:r instanceof Error?r.message:"\u63A8\u9001\u5206\u652F\u5931\u8D25\u3002",branchName:e.branchName?.trim()||"",remoteBranch:""}}},Su=async e=>{let t=he(e.branchName);if(!t)return{ok:!1,message:"\u76EE\u6807\u5206\u652F\u4E0D\u80FD\u4E3A\u7A7A\u3002",currentBranch:""};try{return await tt({...e,taskKey:"git-checkout",run:async r=>{let n=await et(r);if(n===t)return{ok:!0,message:`\u5F53\u524D\u5DF2\u7ECF\u5728\u5206\u652F ${t}\u3002`,currentBranch:n};let o=await r.status();if(!o.isClean()){let p=o.files.map(m=>m.path).filter(Boolean);return{ok:!1,message:p.length>0?`\u5F53\u524D\u5DE5\u4F5C\u533A\u6709\u672A\u63D0\u4EA4\u6539\u52A8\uFF0C\u8BF7\u5148\u5904\u7406\u540E\u518D\u5207\u6362\u5206\u652F\uFF1A${p.slice(0,6).join(", ")}${p.length>6?"\u2026":""}`:"\u5F53\u524D\u5DE5\u4F5C\u533A\u6709\u672A\u63D0\u4EA4\u6539\u52A8\uFF0C\u8BF7\u5148\u5904\u7406\u540E\u518D\u5207\u6362\u5206\u652F\u3002",currentBranch:n}}let s=await r.branch(["-a"]);if(!new Set(s.all.map(he).filter(Boolean)).has(t))try{await r.fetch(["origin",`${t}:refs/remotes/origin/${t}`])}catch{}let a=await r.branch(["-a"]),c=await r.branchLocal(),l=new Set(c.all.map(he).filter(Boolean));if(!a.all.map(he).filter(Boolean).includes(t)&&!l.has(t))return{ok:!1,message:`\u627E\u4E0D\u5230\u5206\u652F ${t}\u3002`,currentBranch:n};l.has(t)?await r.checkout(t):await r.checkout(["-B",t,`origin/${t}`]);let u=await et(r);return{ok:!0,message:`\u5DF2\u5207\u6362\u5230\u5206\u652F ${u}\u3002`,currentBranch:u}}})}catch(r){let n=Y(r,e.repoUrl);return{ok:!1,message:n instanceof Error?n.message:"\u5207\u6362\u5206\u652F\u5931\u8D25\u3002",currentBranch:""}}},xu=async e=>{try{return await tt({worktreePath:e.worktreePath,repoUrl:e.repoUrl,gitIdentity:e.gitIdentity,taskKey:"git-pull-request",run:async t=>{let r=gw(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 et(t),o=he(n);if(!o)return{ok:!1,message:"\u5F53\u524D worktree \u4E0D\u5728\u6709\u6548\u5206\u652F\u4E0A\uFF0C\u65E0\u6CD5\u521B\u5EFA PR\u3002",provider:"github",title:e.title,body:e.body,baseBranch:e.baseBranch,compareBranch:n};await t.push(["-u","origin",o]);let s=e.gitIdentity?.credentialToken?.trim()||"";if(!s||e.gitIdentity?.authMode!=="pat")return{ok:!1,message:"\u521B\u5EFA PR \u76EE\u524D\u9700\u8981\u5DF2\u914D\u7F6E\u5E76\u6FC0\u6D3B GitHub PAT\u3002",provider:"github",title:e.title,body:e.body,baseBranch:e.baseBranch,compareBranch:o};let i=await fetch(`https://api.github.com/repos/${r.owner}/${r.repo}/pulls`,{method:"POST",headers:{Accept:"application/vnd.github+json",Authorization:`Bearer ${s}`,"Content-Type":"application/json","User-Agent":"Vibemux-Worker","X-GitHub-Api-Version":"2022-11-28"},body:JSON.stringify({title:e.title,body:e.body,base:e.baseBranch,head:o})}),a=await i.json().catch(()=>({}));if(!i.ok){let c=Array.isArray(a.errors)?a.errors.map(l=>l.message).filter(Boolean).join("\uFF1B"):"";return{ok:!1,message:[a.message,c].filter(Boolean).join("\uFF1B")||"\u521B\u5EFA GitHub PR \u5931\u8D25\u3002",provider:"github",title:e.title,body:e.body,baseBranch:e.baseBranch,compareBranch:o}}return{ok:!0,message:"PR \u5DF2\u521B\u5EFA\u3002",provider:"github",title:e.title,body:e.body,baseBranch:e.baseBranch,compareBranch:o,number:a.number,url:a.html_url,state:a.state}}})}catch(t){let r=Y(t,e.repoUrl);return{ok:!1,message:r instanceof Error?r.message:"\u521B\u5EFA PR \u5931\u8D25\u3002",provider:"github",title:e.title,body:e.body,baseBranch:e.baseBranch,compareBranch:e.compareBranch?.trim()||""}}};import{readFile as Pw,readdir as Ew,stat as to}from"node:fs/promises";import bw from"node:os";import nr from"node:path";import{mkdirSync as yw}from"node:fs";import{readdir as kw,stat as vu}from"node:fs/promises";import Cu from"node:os";import si from"node:path";import{simpleGit as ww}from"simple-git";var Re="main",Sw=e=>{let t=e.trim();return t?t==="~"?Cu.homedir():t.startsWith("~/")?si.join(Cu.homedir(),t.slice(2)):t:""},ne=e=>si.resolve(Sw(e)),te=e=>{let t=e.trim();if(!t||t==="HEAD"||t.endsWith("/HEAD"))return"";let r=t.startsWith("refs/heads/")?t.slice(11):t,n=r.startsWith("remotes/")?r.slice(8):r;return n.startsWith("origin/")?n.slice(7):n},oe=(e,t)=>{let r={...Dt(t),...e?{baseDir:e}:{}};return ww(r).env(t??{})},St=async(e,t,r)=>{let n=oe(e,r),[o,s]=await Promise.all([n.branch(["-a"]),n.branchLocal()]),i="";try{i=te(await n.raw(["symbolic-ref","--quiet","--short","refs/remotes/origin/HEAD"]))}catch{i=""}let a=Array.from(new Set(o.all.map(te).filter(Boolean))).sort((u,p)=>u.localeCompare(p)),c=te(t??""),l=te(s.current),d=[i,c,l,a[0],Re].find(u=>u&&(u===Re||a.includes(u)))??Re;return{branches:a,defaultBranch:d,currentBranch:l||void 0}},xw=e=>{for(let t of e.split(`
82
- `)){let r=t.trim();if(!r.startsWith("ref: "))continue;let[n]=r.split(" ");return te(n.slice(5))}return""},Cw=e=>Array.from(new Set(e.split(`
83
- `).map(t=>t.trim()).filter(Boolean).map(t=>t.split(" ")[1]||"").map(te).filter(Boolean))).sort((t,r)=>t.localeCompare(r)),vw=async(e,t,r)=>{if(t?.trim())return t.trim();let n=oe(e,r);return await n.checkIsRepo()&&(await n.getRemotes(!0)).find(s=>s.name==="origin")?.refs.fetch?.trim()||""},Pu=async(e,t,r)=>{if(t?.trim())return!1;let n=oe(e,r);return await n.checkIsRepo().catch(()=>!1)?!(await n.getRemotes(!0).catch(()=>[])).some(s=>s.name==="origin"&&s.refs.fetch?.trim()):!1},Or=async(e,t,r,n)=>{let o=await vw(e,t,n);if(!o)throw new Error("\u4ED3\u5E93\u672A\u914D\u7F6E origin\uFF0C\u4E14\u6CA1\u6709\u53EF\u7528\u7684\u8FDC\u7AEF\u4ED3\u5E93\u5730\u5740\u3002");let s=await vu(e).then(async m=>{if(!m.isDirectory())return;let y=oe(e,n);if(await y.checkIsRepo().catch(()=>!1))return y.branchLocal().then(g=>te(g.current)||void 0).catch(()=>{})}).catch(()=>{}),i=oe(void 0,n),[a,c]=await Promise.all([i.raw(["ls-remote","--heads",o]),i.raw(["ls-remote","--symref",o,"HEAD"])]),l=Cw(a),d=xw(c),u=te(r??""),p=[d,u,l[0],Re].find(m=>m&&(m===Re||l.includes(m)))??Re;return{branches:l,defaultBranch:p,currentBranch:s,remoteTarget:o}},Br=e=>{let t=te(e.preferredBranch??"")||e.defaultBranch;return e.branches.includes(t)?t:e.defaultBranch},Wr=async e=>{let t=await vu(e.repoPath).catch(()=>null);if(t&&!t.isDirectory())throw new Error(`\u76EE\u6807\u8DEF\u5F84\u4E0D\u662F\u76EE\u5F55\uFF1A${e.repoPath}`);if(t){let r=oe(e.repoPath,e.env);if(await r.checkIsRepo().catch(()=>!1)){await r.fetch(["origin",`${e.startPoint}:refs/remotes/origin/${e.startPoint}`]);return}if((await kw(e.repoPath)).length>0)throw new Error(`\u76EE\u6807\u76EE\u5F55\u4E0D\u662F\u6709\u6548 Git \u4ED3\u5E93\uFF1A${e.repoPath}`)}else yw(si.dirname(e.repoPath),{recursive:!0});await oe(void 0,e.env).clone(e.remoteTarget,e.repoPath,["--single-branch","--branch",e.startPoint])};var ii=(e,t)=>{let r=nr.relative(e,t);return r===""||!r.startsWith("..")&&!nr.isAbsolute(r)},bu=e=>{let t=ne(e),r=ne(bw.homedir());return ii(r,t)?r:t};var Iu=async e=>{let t=ne(e);try{if(!(await to(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=nr.basename(t);try{let n=oe(t);if(!await n.checkIsRepo())return{ok:!0,path:t,name:r,versionControl:"none",message:"\u76EE\u5F55\u65E0 Git \u4ED3\u5E93"};let i=(await n.getRemotes(!0)).find(u=>u.name==="origin"),a=await St(t),c=a.branches.length,l=i?.refs.fetch?.trim()||"",d=l?"git-remote":"git-local";return{ok:!0,path:t,name:r,versionControl:d,gitUrl:l,defaultBranch:a.defaultBranch,message:c>0?d==="git-remote"?`\u5DF2\u68C0\u6D4B\u5230 Git \u4ED3\u5E93\uFF0C\u5171 ${c} \u4E2A\u5206\u652F`:`\u5DF2\u68C0\u6D4B\u5230\u672C\u5730 Git \u4ED3\u5E93\uFF08\u672A\u7ED1\u5B9A\u8FDC\u7AEF\uFF09\uFF0C\u5171 ${c} \u4E2A\u5206\u652F`:d==="git-remote"?"\u5DF2\u68C0\u6D4B\u5230 Git \u4ED3\u5E93":"\u5DF2\u68C0\u6D4B\u5230\u672C\u5730 Git \u4ED3\u5E93\uFF08\u672A\u7ED1\u5B9A\u8FDC\u7AEF\uFF09"}}catch{return{ok:!0,path:t,name:r,message:"\u65E0\u6CD5\u8BFB\u53D6 Git \u4FE1\u606F"}}},Tu=async(e,t)=>{let r=bu(e),n=ne(e),o=t?.trim()?ne(t):n;if(!ii(r,o))return{ok:!1,path:o,rootPath:r,entries:[],message:"\u5F53\u524D\u8DEF\u5F84\u8D85\u51FA\u53EF\u6D4F\u89C8\u8303\u56F4\u3002"};try{if(!(await to(o)).isDirectory())return{ok:!1,path:o,rootPath:r,entries:[],message:"\u5F53\u524D\u8DEF\u5F84\u4E0D\u662F\u76EE\u5F55\u3002"}}catch{return{ok:!1,path:o,rootPath:r,entries:[],message:"\u76EE\u5F55\u4E0D\u5B58\u5728\u3002"}}try{let i=(await Ew(o,{withFileTypes:!0})).filter(a=>a.isDirectory()||a.isFile()).map(a=>({name:a.name,path:nr.join(o,a.name),kind:a.isDirectory()?"directory":"file"})).sort((a,c)=>a.kind!==c.kind?a.kind==="directory"?-1:1:a.name.localeCompare(c.name,"zh-Hans-CN"));return{ok:!0,path:o,rootPath:r,parentPath:o===r?void 0:nr.dirname(o),entries:i,message:i.length>0?`\u5171\u627E\u5230 ${i.length} \u4E2A\u6761\u76EE\u3002`:"\u5F53\u524D\u76EE\u5F55\u4E0B\u6CA1\u6709\u6587\u4EF6\u6216\u6587\u4EF6\u5939\u3002"}}catch(s){return{ok:!1,path:o,rootPath:r,entries:[],message:s instanceof Error?s.message:"\u8BFB\u53D6\u76EE\u5F55\u5931\u8D25\u3002"}}},Iw=200*1024,Eu={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".svg":"image/svg+xml",".bmp":"image/bmp",".ico":"image/x-icon"},Tw=new Set([".md",".markdown",".mdx"]),Rw=new Set([".json",".jsonc"]),_w=e=>{let t=nr.extname(e).toLowerCase();return Eu[t]?Eu[t]:Tw.has(t)?"text/markdown":Rw.has(t)?"application/json":"text/plain"},Ru=async(e,t)=>{let r=bu(e),n=t?.trim()?ne(t):r;if(!ii(r,n))return{ok:!1,path:n,rootPath:r,message:"\u53EA\u80FD\u8BFB\u53D6\u8BE5\u5DE5\u4F5C\u7AD9 workspace \u5185\u7684\u6587\u4EF6\u3002"};try{let o=await to(n);if(!o.isFile())return{ok:!1,path:n,rootPath:r,message:"\u5F53\u524D\u8DEF\u5F84\u4E0D\u662F\u6587\u4EF6\u3002"};if(o.size>Iw)return{ok:!1,path:n,rootPath:r,sizeBytes:o.size,message:"\u6587\u4EF6\u8FC7\u5927\uFF0C\u6682\u4E0D\u652F\u6301\u9884\u89C8\u3002"};let s=await Pw(n),i=_w(n),a=i.startsWith("image/");return!a&&s.includes(0)?{ok:!1,path:n,rootPath:r,contentType:i,sizeBytes:o.size,message:"\u6682\u4E0D\u652F\u6301\u9884\u89C8\u4E8C\u8FDB\u5236\u6587\u4EF6\u3002"}:{ok:!0,path:n,rootPath:r,content:a?s.toString("base64"):s.toString("utf8"),contentType:i,encoding:a?"base64":"utf8",sizeBytes:o.size,truncated:!1}}catch(o){return{ok:!1,path:n,rootPath:r,message:o instanceof Error?o.message:"\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25\u3002"}}},_u=async(e,t,r,n)=>{let o=ne(e),s=Ge({taskId:`repo-branches-${Buffer.from(o).toString("base64url").slice(0,24)}`,identity:n??{mode:"personal"},repoUrl:t});console.log("[worker] [repo-branches] snapshot starting",JSON.stringify({localPath:o,repoUrl:t,preferredBranch:r}));try{if(await Pu(o,t,s.env)){let l=await St(o,r,s.env);return console.log("[worker] [repo-branches] local-only snapshot resolved",JSON.stringify({localPath:o,branchCount:l.branches.length,defaultBranch:l.defaultBranch})),{ok:!0,branches:l.branches,defaultBranch:l.defaultBranch,currentBranch:l.currentBranch}}let i=await Or(o,t,r,s.env),a=Br({branches:i.branches,defaultBranch:i.defaultBranch,preferredBranch:r});if(!i.branches.includes(a))return{ok:!1,branches:[],defaultBranch:i.defaultBranch,message:i.branches.length>0?`\u8D77\u59CB\u5206\u652F ${a} \u4E0D\u5B58\u5728\u3002\u5F53\u524D\u4ED3\u5E93\u5206\u652F\uFF1A${i.branches.join(", ")}`:`\u8D77\u59CB\u5206\u652F ${a} \u4E0D\u5B58\u5728\u3002`};await Wr({repoPath:o,remoteTarget:i.remoteTarget,startPoint:a,env:s.env}),console.log("[worker] [repo-branches] remote snapshot resolved",JSON.stringify({localPath:o,remoteTarget:i.remoteTarget,branchCount:i.branches.length,defaultBranch:i.defaultBranch}));let c=await St(o,r,s.env).then(l=>l.currentBranch).catch(()=>i.currentBranch);return{ok:!0,branches:i.branches,defaultBranch:i.defaultBranch,currentBranch:c}}catch(i){let a=Y(i,t);console.log("[worker] [repo-branches] remote snapshot failed",JSON.stringify({localPath:o,error:a instanceof Error?a.message:"unknown"}));try{if(!(await to(o)).isDirectory())return{ok:!1,branches:[],defaultBranch:te(r??"")||Re,message:a instanceof Error?a.message:"\u8BFB\u53D6\u5206\u652F\u5217\u8868\u5931\u8D25\u3002"};if(!await oe(o,s.env).checkIsRepo())return console.log("[worker] [repo-branches] fallback skipped: path is not repo",JSON.stringify({localPath:o})),{ok:!1,branches:[],defaultBranch:te(r??"")||Re,message:a instanceof Error?a.message:"\u8BFB\u53D6\u5206\u652F\u5217\u8868\u5931\u8D25\u3002"};let d=await St(o,r,s.env);return console.log("[worker] [repo-branches] local fallback resolved",JSON.stringify({localPath:o,branchCount:d.branches.length,defaultBranch:d.defaultBranch})),{ok:!0,branches:d.branches,defaultBranch:d.defaultBranch,currentBranch:d.currentBranch}}catch(c){let l=Y(c,t);console.log("[worker] [repo-branches] local fallback failed",JSON.stringify({localPath:o,error:l instanceof Error?l.message:"unknown"}))}return{ok:!1,branches:[],defaultBranch:te(r??"")||Re,message:a instanceof Error?a.message:"\u8BFB\u53D6\u5206\u652F\u5217\u8868\u5931\u8D25\u3002"}}finally{s.cleanup()}};import{readdir as Mu,readFile as ai,stat as Ou}from"node:fs/promises";import ci from"node:os";import _e from"node:path";var Au=e=>(e??"").trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||null;var Aw=["skills",".agents/skills",".codex/skills",".claude/skills",".cursor/skills",".opencode/skills",".pi/skills"],Mw=["~/.claude/skills","~/.agents/skills","~/.codex/skills","~/.config/opencode/skills","~/.pi/skills"],Ow=new Set([".md",".txt",".json",".yml",".yaml",".ts",".tsx",".js",".jsx",".mjs",".cjs",".sh",".py",".rb"]),Bw=e=>{let t=e.trim();return t?t==="~"?ci.homedir():t.startsWith("~/")?_e.join(ci.homedir(),t.slice(2)):t:""},li=e=>_e.resolve(Bw(e)),Ww=e=>{let t=e.match(/^---\n([\s\S]*?)\n---/);if(!t)return{};let r={};for(let n of t[1].split(`
84
- `)){let[o,...s]=n.split(":"),i=o.trim().toLowerCase(),a=s.join(":").trim().replace(/^"|"$/g,"");a&&(i==="name"&&(r.name=a),i==="description"&&(r.description=a))}return r},Nw=(e,t)=>{let r=Ww(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:_e.basename(t),description:r.description?.trim()||null}},Bu=e=>{let t=e.replace(/\\/g,"/");return t==="SKILL.md"?"skill":t.startsWith("references/")?"reference":t.startsWith("scripts/")?"script":t.startsWith("assets/")?"asset":"other"},Dw=e=>e==="SKILL.md"?!0:Ow.has(_e.extname(e).toLowerCase()),Uw=e=>Bu(e)==="asset",$w=e=>e.some(t=>t.kind==="script")?"scripts_executables":e.some(t=>t.kind==="asset")?"assets":"markdown_only",Wu=async e=>{let t=await Mu(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 Wu(_e.join(e,n.name)));return r},Lw=async e=>{let t={},r=[],n=async o=>{let s=await Mu(o,{withFileTypes:!0}).catch(()=>[]);for(let i of s){let a=_e.join(o,i.name),c=_e.relative(e,a).replace(/\\/g,"/");if(i.isDirectory()){if(i.name===".git"||i.name==="node_modules")continue;await n(a);continue}if(r.push({path:c,kind:Bu(c)}),Dw(i.name)){let d=await ai(a,"utf8").catch(()=>null);typeof d=="string"&&(t[c]={encoding:"utf8",content:d});continue}if(!Uw(c))continue;let l=await ai(a).catch(()=>null);l&&(t[c]={encoding:"base64",content:l.toString("base64")})}};return await n(e),{files:t,inventory:r.sort((o,s)=>o.path.localeCompare(s.path))}},jw=async e=>{let t=await ai(_e.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=Nw(t,e),{files:n,inventory:o}=await Lw(e);return{skill:{name:r.name,slug:Au(r.name)??_e.basename(e),description:r.description,markdown:t,sourceLocator:e,trustLevel:$w(o),fileInventory:o,files:n}}},Nu=async e=>{let t=[],r=[],n=[];for(let o of e){let s=li(o);if(!(t.includes(s)||(t.push(s),!await Ou(s).then(a=>a.isDirectory()).catch(()=>!1))))for(let a of await Wu(s)){let{skill:c,warning:l}=await jw(a);if(l){n.push(l);continue}c&&r.push(c)}}return r.sort((o,s)=>o.slug.localeCompare(s.slug)||o.sourceLocator.localeCompare(s.sourceLocator)),{scannedRoots:t,packages:r,warnings:n}},Fw=async(e,t)=>{let r=li(t);try{if(!(await Ou(r)).isDirectory())return{ok:!1,scanMode:"project",rootPath:r,scannedRoots:[r],packages:[],warnings:[],message:"\u5F53\u524D\u8DEF\u5F84\u4E0D\u662F\u76EE\u5F55\u3002"}}catch{return{ok:!1,scanMode:"project",rootPath:r,scannedRoots:[r],packages:[],warnings:[],message:"\u76EE\u5F55\u4E0D\u5B58\u5728\u3002"}}let{scannedRoots:n,packages:o,warnings:s}=await Nu(Aw.map(i=>_e.join(r,i)));return{ok:!0,scanMode:"project",rootPath:r,scannedRoots:n,packages:o,warnings:s,message:o.length>0?`\u5171\u53D1\u73B0 ${o.length} \u4E2A\u6280\u80FD\u5305\u3002`:"\u672A\u53D1\u73B0 SKILL.md\u3002"}},Gw=async()=>{let e=li(ci.homedir()),{scannedRoots:t,packages:r,warnings:n}=await Nu([...Mw]);return{ok:!0,scanMode:"global",rootPath:e,scannedRoots:t,packages:r,warnings:n,message:r.length>0?`\u5171\u53D1\u73B0 ${r.length} \u4E2A\u6280\u80FD\u5305\u3002`:"\u672A\u53D1\u73B0\u5168\u5C40 SKILL.md\u3002"}},Du=async e=>e.scanMode==="global"?Gw():Fw(e.workspaceRoot,e.rootPath||e.workspaceRoot);import{createHash as Kw}from"node:crypto";import{existsSync as ui,mkdirSync as ju,rmSync as Xw}from"node:fs";import Nr from"node:path";import{simpleGit as Yw}from"simple-git";import{mkdirSync as Hw,writeFileSync as Vw}from"node:fs";import ro from"node:path";var qw=/^[A-Za-z]:[\\/]/u;var zw=e=>{let t=e?.trim();return t||void 0};var Uu=e=>{let t=zw(e);if(!t||t.startsWith("/")||t.startsWith("\\")||qw.test(t))return!1;let r=t.split(/[\\/]+/).filter(n=>n.length>0);return r.length===0?!1:r.every(n=>n!=="."&&n!=="..")};var Jw=(e,t)=>{if(!Uu(t))throw new Error(`\u8FD0\u884C\u65F6\u73AF\u5883\u53D8\u91CF\u6587\u4EF6\u540D\u4E0D\u5408\u6CD5\uFF1A${t}`);let r=ro.resolve(e,t),n=ro.relative(e,r);if(n.startsWith("..")||ro.isAbsolute(n))throw new Error(`\u8FD0\u884C\u65F6\u73AF\u5883\u53D8\u91CF\u6587\u4EF6\u5FC5\u987B\u4F4D\u4E8E\u5DE5\u4F5C\u76EE\u5F55\u5185\uFF1A${t}`);return r},le=(e,t)=>{if(!t)return{env:{}};if(t.mode==="env-file"){let r=t.fileName?.trim();if(!r)throw new Error("\u73AF\u5883\u53D8\u91CF\u6587\u4EF6\u6A21\u5F0F\u7F3A\u5C11\u6587\u4EF6\u540D\u3002");let n=Jw(e,r);Hw(ro.dirname(n),{recursive:!0}),Vw(n,`${t.fileContent??""}${t.fileContent?`
85
- `:""}`,"utf8")}return{env:{...t.variables??{}}}},Ae=(e,t)=>({...e??process.env,...t?.variables??{}});var Fu=e=>e==="original-dir"?"original-dir":"worktree",Qw=e=>e.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"repo",Zw=e=>Kw("sha1").update(e).digest("hex").slice(0,12),Gu=(e,t)=>{let r=t?Nr.basename(t).replace(/\.git$/i,""):"repo";return Nr.join(ne(e),"repos",`${Qw(r)}-${Zw(t||r)}`)},$u=e=>{let t=[e.repoPath?.trim(),e.worktreePath.trim()].filter(n=>!!n).map(n=>ne(n));return t.find(n=>ui(n))||t[0]||ne(e.worktreePath)},eS=async e=>{if(e.repoUrl?.trim()){let n=await Or(e.repoPath,e.repoUrl,e.preferredBranch,e.env),o=Br({branches:n.branches,defaultBranch:n.defaultBranch,preferredBranch:e.preferredBranch});if(!n.branches.includes(o))return{ok:!1,message:n.branches.length>0?`\u8D77\u59CB\u5206\u652F ${o} \u4E0D\u5B58\u5728\u3002\u5F53\u524D\u4ED3\u5E93\u5206\u652F\uFF1A${n.branches.join(", ")}`:`\u8D77\u59CB\u5206\u652F ${o} \u4E0D\u5B58\u5728\u3002`,worktreePath:e.repoPath};console.log("[worker] [worktree] preparing original directory repository",JSON.stringify({repoPath:e.repoPath,remoteTarget:n.remoteTarget,startPoint:o})),await Wr({repoPath:e.repoPath,remoteTarget:n.remoteTarget,startPoint:o,env:e.env})}let t=oe(e.repoPath,e.env);if(!ui(e.repoPath)||!await t.checkIsRepo().catch(()=>!1))return{ok:!1,message:`\u539F\u59CB\u76EE\u5F55\u6A21\u5F0F\u8981\u6C42\u76EE\u6807\u76EE\u5F55\u662F\u6709\u6548 Git \u4ED3\u5E93\uFF1A${e.repoPath}`,worktreePath:e.repoPath};let r=te((await t.branchLocal()).current);return{ok:!0,message:r?`\u5DF2\u590D\u7528\u539F\u59CB\u76EE\u5F55 ${e.repoPath}\uFF0C\u5F53\u524D\u5206\u652F ${r}\u3002`:`\u5DF2\u590D\u7528\u539F\u59CB\u76EE\u5F55 ${e.repoPath}\u3002`,worktreePath:e.repoPath}},tS=async e=>{let t=await e.raw(["worktree","list","--porcelain"]),r=[],n=null;for(let o of t.split(`
86
- `)){if(o.startsWith("worktree ")){n&&r.push(n),n={path:Nr.resolve(o.slice(9).trim())};continue}o.startsWith("branch ")&&n&&(n.branch=o.slice(7).trim())}return n&&r.push(n),r},rS=async(e,t)=>(await e.branchLocal()).all.includes(t),qu=e=>{Xw(e,{recursive:!0,force:!0,maxRetries:5,retryDelay:100})},zu=async(e,t,r)=>{let n=Nr.resolve(t),o=`refs/heads/${r}`;try{await e.raw(["worktree","prune"])}catch{}let i=(await tS(e)).find(a=>a.branch===o);if(i&&i.path!==n)try{await e.raw(["worktree","remove","--force",i.path])}catch{}try{await e.raw(["worktree","remove","--force",n])}catch{}if(qu(n),await rS(e,r))try{await e.deleteLocalBranch(r,!0)}catch{}try{await e.raw(["worktree","prune"])}catch{}ju(Nr.dirname(n),{recursive:!0})},Lu=async e=>{let t=oe(e.repoPath,e.env);if(!await t.checkIsRepo().catch(()=>!1))return{ok:!1,message:`\u76EE\u6807\u76EE\u5F55\u4E0D\u662F\u6709\u6548 Git \u4ED3\u5E93\uFF1A${e.repoPath}`,worktreePath:e.worktreePath};let r=await St(e.repoPath,e.preferredBranch,e.env),n=te(e.preferredBranch??"")||r.defaultBranch,o=r.branches.includes(n)?n:r.defaultBranch;return r.branches.includes(o)?(console.log("[worker] [worktree] local repo creating worktree",JSON.stringify({repoPath:e.repoPath,worktreePath:e.worktreePath,branchName:e.branchName,startPoint:o})),await zu(t,e.worktreePath,e.branchName),await t.raw(["worktree","add","--force","-B",e.branchName,e.worktreePath,o]),{ok:!0,message:`\u5DF2\u57FA\u4E8E ${o} \u521B\u5EFA worktree ${e.worktreePath} \u5E76\u5207\u51FA\u5206\u652F ${e.branchName}\u3002`,worktreePath:e.worktreePath}):{ok:!1,message:r.branches.length>0?`\u8D77\u59CB\u5206\u652F ${o} \u4E0D\u5B58\u5728\u3002\u5F53\u524D\u4ED3\u5E93\u5206\u652F\uFF1A${r.branches.join(", ")}`:`\u8D77\u59CB\u5206\u652F ${o} \u4E0D\u5B58\u5728\u3002`,worktreePath:e.worktreePath}},Hu=async e=>{let t=Fu(e.workingDirectoryMode),r=ne(e.worktreePath),n=ne(e.repoPath?.trim()||Gu(e.workspaceRoot,e.repoUrl)),o=Ge({taskId:`worktree-${Buffer.from(r).toString("base64url").slice(0,24)}`,identity:e.gitIdentity??{mode:"personal"},repoUrl:e.repoUrl}),s=t==="original-dir"?$u({repoPath:e.repoPath,worktreePath:e.worktreePath}):r;le(s,e.runtimeEnvironment);let i=Ae(o.env,e.runtimeEnvironment);if(console.log("[worker] [worktree] ensure worktree starting",JSON.stringify({worktreePath:r,repoPath:n,branchName:e.branchName,preferredBranch:e.preferredBranch,workingDirectoryMode:t})),t==="original-dir"){let a=$u({repoPath:e.repoPath,worktreePath:e.worktreePath});try{return await eS({repoPath:a,repoUrl:e.repoUrl,preferredBranch:e.preferredBranch,branchName:e.branchName,env:i})}catch(c){let l=Y(c,e.repoUrl);return{ok:!1,message:l instanceof Error?l.message:"\u539F\u59CB\u76EE\u5F55\u51C6\u5907\u5931\u8D25\u3002",worktreePath:n}}finally{o.cleanup()}}if(!e.repoPath?.trim()&&!e.repoUrl?.trim())return ju(r,{recursive:!0}),{ok:!0,message:`\u5DF2\u51C6\u5907\u9879\u76EE\u76EE\u5F55 ${r}\u3002`,worktreePath:r};if(!e.repoUrl?.trim())try{return await Lu({repoPath:n,worktreePath:r,branchName:e.branchName,preferredBranch:e.preferredBranch,env:i})}catch(a){let c=Y(a,e.repoUrl);return{ok:!1,message:c instanceof Error?c.message:"\u521B\u5EFA worktree \u5931\u8D25\u3002",worktreePath:r}}finally{o.cleanup()}try{let a=await Or(n,e.repoUrl,e.preferredBranch,i),c=te(e.preferredBranch??"")||a.defaultBranch,l=Br({branches:a.branches,defaultBranch:a.defaultBranch,preferredBranch:e.preferredBranch});if(!a.branches.includes(l))return console.log("[worker] [worktree] ensure worktree skipped: branch not found",JSON.stringify({startPoint:l,availableBranches:a.branches})),{ok:!1,message:a.branches.length>0?`\u8D77\u59CB\u5206\u652F ${l} \u4E0D\u5B58\u5728\u3002\u5F53\u524D\u4ED3\u5E93\u5206\u652F\uFF1A${a.branches.join(", ")}`:`\u8D77\u59CB\u5206\u652F ${l} \u4E0D\u5B58\u5728\u3002`};console.log("[worker] [worktree] resolved remote start point",JSON.stringify({repoPath:n,remoteTarget:a.remoteTarget,requestedStartPoint:c,startPoint:l})),await Wr({repoPath:n,remoteTarget:a.remoteTarget,startPoint:l,env:i});let d=oe(n,i),u=`refs/remotes/origin/${l}`;return console.log("[worker] [worktree] creating fresh worktree",JSON.stringify({worktreePath:r,branchName:e.branchName,startPoint:l,startPointRef:u})),await zu(d,r,e.branchName),await d.raw(["worktree","add","--force","-B",e.branchName,r,u]),console.log("[worker] [worktree] worktree created",JSON.stringify({worktreePath:r,branchName:e.branchName,startPoint:l,startPointRef:u})),{ok:!0,message:`\u5DF2\u57FA\u4E8E ${l} \u521B\u5EFA worktree ${r} \u5E76\u5207\u51FA\u5206\u652F ${e.branchName}\u3002`,worktreePath:r}}catch(a){let c=Y(a,e.repoUrl);console.log("[worker] [worktree] remote prepare failed",JSON.stringify({worktreePath:r,repoPath:n,error:c instanceof Error?c.message:"unknown"}));try{return await Lu({repoPath:n,worktreePath:r,branchName:e.branchName,preferredBranch:e.preferredBranch,env:i})}catch(l){let d=Y(l,e.repoUrl);return console.log("[worker] [worktree] ensure worktree failed",JSON.stringify({worktreePath:r,error:d instanceof Error?d.message:"unknown"})),{ok:!1,message:d instanceof Error?d.message:"\u521B\u5EFA worktree \u5931\u8D25\u3002",worktreePath:r}}}finally{o.cleanup()}},Vu=async e=>{let t=Fu(e.workingDirectoryMode),r=ne(e.worktreePath),n=ne(e.repoPath?.trim()||Gu(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(ui(n)){let o=Yw(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})),qu(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 Ju="[worker][terminal]",nS=["1","true","yes","on"].includes(process.env.VIBEMUX_TERMINAL_DEBUG?.trim().toLowerCase()||""),Ku=e=>typeof e!="string"?e:e.trim().replace(/\s+/g," ").slice(0,160),oS=e=>{if(e)return Object.fromEntries(Object.entries(e).map(([t,r])=>t==="command"||t==="preview"?[t,Ku(r)]:t==="stdout"||t==="stderr"?[t,Ku(r)]:[t,r]))},sS=(e,t)=>{if(!nS)return;let r=oS(t);if(r){console.info(`${Ju} ${e}`,r);return}console.info(`${Ju} ${e}`)},Dr=e=>`prompt:${e}`,di=e=>e.workingDirectoryMode==="original-dir"?"original-dir":"worktree",Xu=e=>{let{send:t,executorId:r,sessionId:n,stream:o,chunk:s}=e;t({type:"executor.terminal.session.output",executorId:r,output:{sessionId:n,stream:o,chunk:s,at:new Date().toISOString()}})},Me=sS;var cS=async(e,t=5e3)=>{let r=Date.now(),n=new AbortController,o=setTimeout(()=>{n.abort()},Math.max(500,t));try{let s=await fetch(e,{method:"GET",redirect:"follow",signal:n.signal,headers:{accept:"text/html,application/json;q=0.9,*/*;q=0.8"}});return await s.body?.cancel().catch(()=>{}),{ok:!0,reachable:!0,url:e,statusCode:s.status,finalUrl:s.url||e,responseTimeMs:Date.now()-r,at:new Date().toISOString()}}catch(s){let i=s instanceof Error?s.name==="AbortError"?`timed out after ${t}ms`:s.message:"environment probe failed";return{ok:!1,reachable:!1,url:e,error:i,responseTimeMs:Date.now()-r,at:new Date().toISOString()}}finally{clearTimeout(o)}},Yu=(e,t)=>{let r=t.getConfig(),n=()=>(r=C(),t.setConfig(r),r);return e.type==="executor.repo-probe.request"?(n(),Iu(e.localPath).then(o=>{t.send({type:"executor.repo-probe.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.git.pat.verify.request"?(n(),Xl(e.patToken,e.provider,e.host).then(o=>{t.send({type:"executor.git.pat.verify.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.doctor.request"?(n(),Ut().then(o=>{t.send({type:"executor.doctor.response",executorId:r.executorId,requestId:e.requestId,doctor:o,at:new Date().toISOString()})}),!0):e.type==="executor.directory-browse.request"?(n(),Tu(e.rootPath||r.workspaceRoot,e.directoryPath).then(o=>{t.send({type:"executor.directory-browse.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.file-read.request"?(n(),Ru(e.rootPath||r.workspaceRoot,e.filePath).then(o=>{t.send({type:"executor.file-read.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.http.probe.request"?(n(),cS(e.url,e.timeoutMs).then(o=>{t.send({type:"executor.http.probe.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.agent.workdir.request"?(n(),Promise.resolve().then(()=>{if(e.action==="ensure"){let o=nu(e.agentId);return{ok:!0,workdir:o.summary,files:o.files,message:"Agent \u5DE5\u4F5C\u76EE\u5F55\u5DF2\u521D\u59CB\u5316\u3002"}}if(e.action==="rescan"){let o=rr(e.agentId,!0);return{ok:!0,workdir:o.summary,files:o.files,message:"Agent \u5DE5\u4F5C\u76EE\u5F55\u7D22\u5F15\u5DF2\u5237\u65B0\u3002"}}if(e.action==="cleanup")return{ok:!0,workdir:su(e.agentId),files:rr(e.agentId).files,message:"\u5DF2\u6E05\u7406 Agent \u7CFB\u7EDF\u4E34\u65F6\u76EE\u5F55\u3002"};if(e.action==="delete"){let o=iu(e.agentId,e.relativePath||"");return{ok:!0,workdir:o.summary,files:o.files,message:"\u6587\u4EF6\u5DF2\u5220\u9664\u3002"}}if(e.action==="list"){let o=rr(e.agentId,e.refresh===!0);return{ok:!0,workdir:o.summary,files:o.files}}return{ok:!0,workdir:_r(e.agentId),files:rr(e.agentId).files}}).catch(o=>({ok:!1,workdir:_r(e.agentId),files:rr(e.agentId).files,message:o instanceof Error?o.message:"Agent \u5DE5\u4F5C\u76EE\u5F55\u8BF7\u6C42\u5931\u8D25\u3002"})).then(o=>{t.send({type:"executor.agent.workdir.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.agent.workdir.download.request"?(n(),Promise.resolve().then(()=>{let o=Qn(e.agentId,e.relativePath);return{ok:!0,relativePath:o.relativePath,filename:aS(o.relativePath),contentBase64:iS(o.absolutePath).toString("base64")}}).catch(o=>({ok:!1,relativePath:e.relativePath,message:o instanceof Error?o.message:"Agent \u5DE5\u4F5C\u76EE\u5F55\u6587\u4EF6\u4E0B\u8F7D\u5931\u8D25\u3002"})).then(o=>{t.send({type:"executor.agent.workdir.download.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.agent.workdir.read.request"?(n(),Promise.resolve().then(()=>au(e.agentId,e.relativePath)).catch(o=>({ok:!1,relativePath:e.relativePath,message:o instanceof Error?o.message:"Agent \u5DE5\u4F5C\u76EE\u5F55\u6587\u4EF6\u9884\u89C8\u5931\u8D25\u3002"})).then(o=>{t.send({type:"executor.agent.workdir.read.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.agent-sessions.list.request"?(n(),Promise.resolve().then(()=>vn()).catch(o=>({ok:!1,sessions:[],counts:{claude:0,opencode:0,codex:0,pi:0},message:o instanceof Error?o.message:"\u8BFB\u53D6\u672C\u5730 Agent \u4F1A\u8BDD\u5931\u8D25\u3002"})).then(o=>{t.send({type:"executor.agent-sessions.list.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.agent-sessions.read.request"?(n(),Promise.resolve().then(()=>{let o=Pn(e.source,e.sessionId);return o?{ok:!0,session:o}:{ok:!1,message:"\u4F1A\u8BDD\u4E0D\u5B58\u5728\u6216\u5DF2\u4E0D\u53EF\u8BFB\u3002"}}).catch(o=>({ok:!1,message:o instanceof Error?o.message:"\u8BFB\u53D6\u672C\u5730 Agent \u4F1A\u8BDD\u8BE6\u60C5\u5931\u8D25\u3002"})).then(o=>{t.send({type:"executor.agent-sessions.read.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.skills.scan.request"?(n(),Du({workspaceRoot:r.workspaceRoot,scanMode:e.scanMode,rootPath:e.rootPath}).then(o=>{t.send({type:"executor.skills.scan.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.repo-branches.request"?(n(),console.log("[worker] [repo-branches] request received",JSON.stringify({requestId:e.requestId,executorId:r.executorId,localPath:e.localPath,repoUrl:e.repoUrl,preferredBranch:e.preferredBranch})),_u(e.localPath,e.repoUrl,e.preferredBranch,e.gitIdentity).then(o=>{console.log("[worker] [repo-branches] request resolved",JSON.stringify({requestId:e.requestId,executorId:r.executorId,ok:o.ok,branchCount:o.branches.length,defaultBranch:o.defaultBranch,message:o.message})),t.send({type:"executor.repo-branches.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.git.checkout.request"?(n(),Su({worktreePath:e.worktreePath,repoUrl:e.repoUrl,branchName:e.branchName,gitIdentity:e.gitIdentity}).then(o=>{t.send({type:"executor.git.checkout.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.git.diff.request"?(n(),fu({worktreePath:e.worktreePath,repoUrl:e.repoUrl,baseBranch:e.baseBranch,gitIdentity:e.gitIdentity}).then(o=>{t.send({type:"executor.git.diff.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.git.working-tree-diff.request"?(n(),gu({worktreePath:e.worktreePath,repoUrl:e.repoUrl,gitIdentity:e.gitIdentity}).then(o=>{t.send({type:"executor.git.working-tree-diff.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.git.commit-diff.request"?(n(),hu({worktreePath:e.worktreePath,repoUrl:e.repoUrl,commitSha:e.commitSha,gitIdentity:e.gitIdentity}).then(o=>{t.send({type:"executor.git.commit-diff.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.git.rebase.request"?(n(),yu({worktreePath:e.worktreePath,repoUrl:e.repoUrl,baseBranch:e.baseBranch,gitIdentity:e.gitIdentity}).then(o=>{t.send({type:"executor.git.rebase.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.git.graph.request"?(n(),ku({worktreePath:e.worktreePath,repoUrl:e.repoUrl,baseBranch:e.baseBranch,limit:e.limit,gitIdentity:e.gitIdentity}).then(o=>{t.send({type:"executor.git.graph.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.git.push.request"?(n(),wu({worktreePath:e.worktreePath,repoUrl:e.repoUrl,branchName:e.branchName,gitIdentity:e.gitIdentity}).then(o=>{t.send({type:"executor.git.push.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.git.pull-request.request"?(n(),xu({worktreePath:e.worktreePath,repoUrl:e.repoUrl,title:e.title,body:e.body,baseBranch:e.baseBranch,compareBranch:e.compareBranch,gitIdentity:e.gitIdentity}).then(o=>{t.send({type:"executor.git.pull-request.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.worktree.ensure.request"?(n(),Hu({workspaceRoot:r.workspaceRoot,repoPath:e.repoPath,repoUrl:e.repoUrl,preferredBranch:e.preferredBranch,branchName:e.branchName,worktreePath:e.worktreePath,gitIdentity:e.gitIdentity,workingDirectoryMode:di(e),runtimeEnvironment:e.runtimeEnvironment}).then(o=>{t.send({type:"executor.worktree.ensure.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.worktree.cleanup.request"?(n(),Vu({workspaceRoot:r.workspaceRoot,repoPath:e.repoPath,repoUrl:e.repoUrl,worktreePath:e.worktreePath,workingDirectoryMode:di(e)}).then(o=>{t.send({type:"executor.worktree.cleanup.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.browser.run.request"?(n(),r.executorToken?.trim()?(hn({cloudUrl:r.cloudUrl,executorToken:r.executorToken,taskId:e.taskId,workspaceId:e.workspaceId,workspaceSessionId:e.workspaceSessionId,cwd:e.cwd,appUrl:e.appUrl,healthUrl:e.healthUrl,goal:e.goal,mode:e.mode}).then(o=>{t.send({type:"executor.browser.run.response",executorId:r.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):(t.send({type:"executor.browser.run.response",executorId:r.executorId,requestId:e.requestId,result:{ok:!1,message:"\u5F53\u524D worker \u672A\u5B8C\u6210\u914D\u5BF9\uFF0C\u7F3A\u5C11 executor token\u3002",summary:"\u5F53\u524D worker \u672A\u5B8C\u6210\u914D\u5BF9\uFF0C\u7F3A\u5C11 executor token\u3002",usedMode:e.mode??"playwright",finalUrl:e.appUrl,observationsCount:0,issueCount:1,at:new Date().toISOString()},at:new Date().toISOString()}),!0)):!1};var Qu=(e,t)=>{let r=t.getConfig();return e.type==="preview.tunnel.open"?(Yt.open(e,r,t.send),!0):e.type==="preview.tunnel.close"?(Yt.close(e.previewSessionId,"closed by control plane"),!0):!1};import{randomUUID as pi}from"node:crypto";import{spawn as dS}from"node:child_process";import{existsSync as Ur}from"node:fs";import lS from"node:path";var uS=()=>{let e=Qr(),t=ur();if(Ur(t))return{launcherPath:Ur(e)?e:void 0,runnerPath:process.execPath,entryPath:t};let r=re("tsx"),n=lS.join(ie(),"apps","worker","src","index.ts");return r&&Ur(n)?{launcherPath:Ur(e)?e:void 0,runnerPath:r,entryPath:n}:{launcherPath:Ur(e)?e:void 0,runnerPath:void 0,entryPath:void 0}},or=()=>{let e=uS();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 no=e=>re(e),$r=e=>{try{return JSON.parse(e)}catch{return null}},M=(e,t,r)=>{t?.({agentType:e,...r})},rt=()=>{let e=new Error("\u4EFB\u52A1\u5DF2\u53D6\u6D88");return e.name="AbortError",e},qe=e=>{let t=e?.trim();if(!(!t||t==="default"))return t};var pS=new Set(["Glob","Grep","LS","NotebookRead","Read","Task","TodoRead"]),mS=new Set(["Edit","MultiEdit","TodoWrite","Write"]),fS=e=>e.split("(")[0]?.trim()||e.trim(),gS=e=>e?.planMode?"plan":e?.permissionMode??"bypassPermissions",hS=e=>e==="bypassPermissions"&&typeof process.getuid=="function"&&process.getuid()===0?"acceptEdits":e,yS=(e,t)=>{let r=fS(t);return!!(e==="bypassPermissions"||pS.has(r)||e==="acceptEdits"&&mS.has(r))},Lr=(e,t)=>{e.write(`${JSON.stringify(t)}
87
- `)},Zu=async e=>{let t=no("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=at(e.executionModel)?.providerId||"anthropic",o=at(r?.defaultModel)?.providerId||"anthropic",s=qe(Rt("ClaudeCode",n,e.executionModel))??qe(Rt("ClaudeCode",o,r?.defaultModel)),i=gS(r),a=hS(i),c=["-p","--output-format=stream-json","--input-format=stream-json","--verbose","--include-partial-messages","--replay-user-messages","--permission-mode",a,...e.runtimeArgs??[]];s&&c.push("--model",s);let l=e.resumeSessionId?.trim();return l&&c.push("--resume",l),new Promise((d,u)=>{let p=dS(t,c,{cwd:e.cwd,env:{...or(),...e.runtimeEnv??{}},stdio:["pipe","pipe","pipe"]}),m="",y="",g="",w="",k="",E="",b=!1,T=new Map,N=new Map,_=()=>(w=w||`${g||"claude"}:assistant`,M("ClaudeCode",e.onEvent,{type:"message.updated",properties:{info:{id:w,role:"assistant"}}}),w),J=(P,O,S,f)=>{M("ClaudeCode",e.onEvent,{type:"message.part.updated",properties:{part:{id:O,messageID:_(),type:P,text:S},delta:f}})},B=P=>{Lr(p.stdin,{type:"control_response",response:P})},$=P=>{if(P.type!=="control_request")return;if(P.request.subtype==="hook_callback"){B({subtype:"success",request_id:P.request_id,response:{}});return}let O=P.request.tool_name,S=yS(a,O);S||M("ClaudeCode",e.onEvent,{type:"permission.updated",properties:{title:O}}),B({subtype:"success",request_id:P.request_id,response:S?{behavior:"allow",updatedInput:P.request.input}:{behavior:"deny",message:`\u5F53\u524D\u4F1A\u8BDD\u672A\u542F\u7528 ${O} \u6743\u9650\u3002`,interrupt:!1}})},v=()=>{Lr(p.stdin,{type:"control_request",request_id:pi(),request:{subtype:"interrupt"}}),setTimeout(()=>{p.killed||p.kill("SIGTERM")},250)};e.signal?.addEventListener("abort",v,{once:!0});let I=P=>{let O=P.trim();if(!O)return;let S=$r(O);if(S?.type==="control_request"||S?.type==="control_cancel_request"){$(S);return}let f=$r(O);if(f){if(f.session_id&&(g=f.session_id),f.type==="system"&&f.subtype==="init"){M("ClaudeCode",e.onEvent,{type:"session.status",properties:{status:{type:"busy",message:"Claude Code \u4F1A\u8BDD\u5DF2\u5C31\u7EEA"}}});return}if(f.type==="stream_event"){let h=f.event,x=`${g||"claude"}:${h.index??0}`;if(h.type==="content_block_delta"&&h.delta?.type==="thinking_delta"){let F=`${N.get(x)??""}${h.delta.thinking??""}`;N.set(x,F),J("reasoning",`${x}:thinking`,F,h.delta.thinking??"");return}if(h.type==="content_block_delta"&&h.delta?.type==="text_delta"){let F=`${T.get(x)??""}${h.delta.text??""}`;T.set(x,F),k=F.trim()||k,J("text",`${x}:text`,F,h.delta.text??"");return}h.type==="content_block_start"&&h.content_block?.type==="tool_use"&&M("ClaudeCode",e.onEvent,{type:"message.part.updated",properties:{part:{id:h.content_block.id??`${x}:tool`,messageID:_(),type:"tool",tool:h.content_block.name??"tool",state:{status:"running"}}}});return}if(f.type==="assistant"){g=f.session_id??g,w=f.message?.id??_();let h=Array.isArray(f.message?.content)?f.message.content:[];for(let x of h)x.type==="text"&&x.text?.trim()&&(k=x.text.trim(),J("text",`${w}:final`,k)),x.type==="tool_use"&&M("ClaudeCode",e.onEvent,{type:"message.part.updated",properties:{part:{id:x.id??`${w}:tool`,messageID:_(),type:"tool",tool:x.name??"tool",state:{status:"running",raw:x.input?JSON.stringify(x.input,null,2):void 0}}}});return}if(f.type==="user"){let h=Array.isArray(f.message?.content)?f.message.content:[],x=h.find(F=>F.tool_use_id)?.tool_use_id;if(!x)return;M("ClaudeCode",e.onEvent,{type:"message.part.updated",properties:{part:{id:x,messageID:_(),type:"tool",tool:"tool",state:{status:"completed",output:h.find(F=>F.tool_use_id===x)?.content}}}});return}if(f.type==="result"){if(b=!f.is_error,f.result?.trim()&&(k=f.result.trim()),f.is_error){E=f.result?.trim()||"Claude Code \u6267\u884C\u5931\u8D25",M("ClaudeCode",e.onEvent,{type:"session.error",properties:{error:E}});return}M("ClaudeCode",e.onEvent,{type:"session.status",properties:{status:{type:"idle",message:"Claude Code \u5DF2\u5B8C\u6210"}}}),p.killed||p.kill("SIGTERM")}}};p.stdout.on("data",P=>{m+=P.toString();let O=m.split(`
88
- `);m=O.pop()??"";for(let S of O)I(S)}),p.stderr.on("data",P=>{y+=P.toString()}),p.on("error",P=>{e.signal?.removeEventListener("abort",v),u(P)}),p.on("close",P=>{if(e.signal?.removeEventListener("abort",v),m.trim()&&I(m),e.signal?.aborted){u(rt());return}if(!b&&P!==0||E){u(new Error(E||y.trim().split(`
89
- `).filter(Boolean).at(-1)||`Claude Code \u6267\u884C\u5931\u8D25\uFF08\u9000\u51FA\u7801 ${P??-1}\uFF09`));return}d({output:k||y.trim().split(`
90
- `).filter(Boolean).at(-1)||"Claude Code \u672A\u8FD4\u56DE\u6587\u672C\u8F93\u51FA\u3002",sessionId:g||void 0})}),Lr(p.stdin,{type:"control_request",request_id:pi(),request:{subtype:"initialize"}}),Lr(p.stdin,{type:"control_request",request_id:pi(),request:{subtype:"set_permission_mode",mode:a}}),Lr(p.stdin,{type:"user",message:{role:"user",content:e.prompt}})})};import{spawn as kS}from"node:child_process";var ed=(e,t,r)=>{let n={};return r?.reasoningEffort&&(n.model_reasoning_effort=r.reasoningEffort),r?.reasoningSummary&&(n.model_reasoning_summary=r.reasoningSummary),{model:t??null,cwd:e,approvalPolicy:r?.approval??"never",sandbox:r?.sandbox??"workspace-write",config:Object.keys(n).length>0?n:null,experimentalRawEvents:!1,persistExtendedHistory:!0}},wS=(e,t,r,n)=>{let o={};return n?.reasoningEffort&&(o.model_reasoning_effort=n.reasoningEffort),n?.reasoningSummary&&(o.model_reasoning_summary=n.reasoningSummary),{threadId:t,cwd:e,model:r??null,approvalPolicy:n?.approval??"never",sandbox:n?.sandbox??"workspace-write",config:Object.keys(o).length>0?o:null,persistExtendedHistory:!0}},SS=e=>({mode:"default",settings:{model:e,reasoning_effort:null,developer_instructions:null}}),xS=e=>e==="never"?{command:"acceptForSession",fileChange:"acceptForSession"}:{command:"decline",fileChange:"decline"},CS=e=>{let t=e instanceof Error?e.message.trim().toLowerCase():"";return t?t.includes("no rollout found for thread id")||t.includes("no thread found for id")||t.includes("thread/resume")&&t.includes("not found"):!1},vS=new Set(["codex \u6267\u884C\u5931\u8D25","codex execution failed","execution failed","request failed","unknown error"]),od=e=>e.split(`
74
+ `:""},Ga=async(e,t)=>{let n=[`refs/remotes/origin/${t}`,`origin/${t}`,`refs/heads/${t}`,t];for(let r of n)try{return await e.raw(["rev-parse","--verify",r]),{baseBranch:t,baseRef:r}}catch{}return null},Ha=async(e,t,n)=>{let r=le(t)||Xt;if(n?.forceFetchFirst)try{await e.fetch(["origin",`${r}:refs/remotes/origin/${r}`])}catch{}let o=await Ga(e,r);if(o)return o;if(!n?.forceFetchFirst){try{await e.fetch(["origin",`${r}:refs/remotes/origin/${r}`])}catch{}let i=await Ga(e,r);if(i)return i}throw new Error(`\u627E\u4E0D\u5230\u57FA\u7EBF\u5206\u652F ${r}\u3002`)},Ne=async e=>{let t=await e.branchLocal();return le(t.current)||"HEAD"},uf=async(e,t)=>{try{let n=await e.raw(["rev-list","--count",`${t}..HEAD`]),r=Number(n.trim());return Number.isFinite(r)?r:0}catch{return 0}},pf=async e=>{try{return await e.raw(["rev-parse","--verify","HEAD"]),!0}catch{return!1}},mf=async(e,t)=>{try{return(await e.raw(["rev-list","--parents","-n","1",t])).trim().split(/\s+/).filter(Boolean)[1]}catch{return}},gf=async e=>{try{return(await e.raw(["diff","--name-only","--diff-filter=U"])).split(`
75
+ `).map(n=>n.trim()).filter(Boolean)}catch{return[]}},ff=e=>{let t=e.trim();return!t.startsWith("(")||!t.endsWith(")")?[]:t.slice(1,-1).split(",").map(n=>n.trim()).filter(Boolean)},hf=e=>{let t=e.trim();if(!t)return null;let n=[/^https?:\/\/github\.com\/([^/]+)\/([^/.]+?)(?:\.git)?$/i,/^git@github\.com:([^/]+)\/([^/.]+?)(?:\.git)?$/i,/^ssh:\/\/git@github\.com\/([^/]+)\/([^/.]+?)(?:\.git)?$/i];for(let r of n){let o=t.match(r);if(o)return{owner:o[1],repo:o[2]}}return null},yf=e=>e.split("").map(t=>t.trim()).filter(Boolean).map(t=>{let[n="",r="",o="",i="",s="",a=""]=t.split(""),c=ff(o);return{sha:n,shortSha:n.slice(0,7),parents:r.split(" ").map(l=>l.trim()).filter(Boolean),subject:i.trim(),authorDate:s.trim(),authorName:a.trim(),refs:c,isHead:c.some(l=>l.startsWith("HEAD"))}}),Ue=async e=>{let t=Uo(e.worktreePath),n=Ae({taskId:`${e.taskKey}-${Buffer.from(t).toString("base64url").slice(0,24)}`,identity:e.gitIdentity??{mode:"personal"},repoUrl:e.repoUrl});try{n.configureRepo(t);let r=sf(t,n.env);return await e.run(r)}finally{n.cleanup(t)}},Ja=async e=>{try{return await Ue({...e,taskKey:"git-diff",run:async t=>{let{baseBranch:n,baseRef:r}=await Ha(t,e.baseBranch),o=await Ne(t),i=Uo(e.worktreePath),[s,a,c,l,u]=await Promise.all([t.raw(["diff","--numstat","--find-renames","--merge-base",r]),t.raw(["diff","--name-status","--find-renames","--merge-base",r]),t.raw(["diff","--find-renames","--merge-base",r]),uf(t,r),t.raw(["ls-files","--others","--exclude-standard","-z"])]),d=Lo(s,a),m=new Set(d.map(y=>y.path)),g=await qa(i,u),k=g.map(y=>y.file).filter(y=>!m.has(y.path)),h=d.concat(k),S=za([c,...g.map(y=>y.patch)]);return{ok:!0,message:h.length>0?`\u5DF2\u751F\u6210\u5F53\u524D\u5DE5\u4F5C\u533A\u76F8\u5BF9 ${n} \u7684\u5DEE\u5F02\u3002`:`\u5F53\u524D\u5DE5\u4F5C\u533A\u76F8\u5BF9 ${n} \u6CA1\u6709\u5DEE\u5F02\u3002`,baseBranch:n,currentBranch:o,aheadCommits:l,files:h,patch:S}}})}catch(t){let n=V(t,e.repoUrl);return{ok:!1,message:n instanceof Error?n.message:"\u8BFB\u53D6 Git diff \u5931\u8D25\u3002",baseBranch:le(e.baseBranch)||Xt,currentBranch:"HEAD",aheadCommits:0,files:[],patch:""}}},Va=async e=>{try{return await Ue({...e,taskKey:"git-working-tree-diff",run:async t=>{let n=await Ne(t),r=await pf(t),o=Uo(e.worktreePath),[i,s,a,c]=await Promise.all([r?t.raw(["diff","--numstat","--find-renames","HEAD"]):Promise.resolve(""),r?t.raw(["diff","--name-status","--find-renames","HEAD"]):Promise.resolve(""),r?t.raw(["diff","--find-renames","HEAD"]):Promise.resolve(""),t.raw(["ls-files","--others","--exclude-standard","-z"])]),l=r?Lo(i,s):[],u=await qa(o,c),d=u.map(h=>h.file),m=new Set(l.map(h=>h.path)),g=l.concat(d.filter(h=>!m.has(h.path))),k=za([a,...u.map(h=>h.patch)]);return{ok:!0,message:g.length>0?"\u5DF2\u751F\u6210\u5F53\u524D\u5DE5\u4F5C\u533A\u672A\u63D0\u4EA4\u6539\u52A8\u3002":"\u5F53\u524D\u5DE5\u4F5C\u533A\u6CA1\u6709\u672A\u63D0\u4EA4\u6539\u52A8\u3002",currentBranch:n,files:g,patch:k}}})}catch(t){let n=V(t,e.repoUrl);return{ok:!1,message:n instanceof Error?n.message:"\u8BFB\u53D6\u5F53\u524D\u5DE5\u4F5C\u533A Git \u6539\u52A8\u5931\u8D25\u3002",currentBranch:"HEAD",files:[],patch:""}}},Ka=async e=>{try{return await Ue({worktreePath:e.worktreePath,repoUrl:e.repoUrl,gitIdentity:e.gitIdentity,taskKey:"git-commit-diff",run:async t=>{let n=e.commitSha.trim();if(!n)return{ok:!1,message:"\u7F3A\u5C11 commit SHA\u3002",commitSha:"",files:[],patch:""};await t.raw(["rev-parse","--verify",n]);let r=await mf(t,n),[o,i,s]=await Promise.all([t.raw(["show","--format=","--find-renames",n]),t.raw(["show","--format=","--numstat","--find-renames",n]),t.raw(["show","--format=","--name-status","--find-renames",n])]),a=Lo(i,s);return{ok:!0,message:a.length>0?`\u5DF2\u52A0\u8F7D\u63D0\u4EA4 ${n.slice(0,7)} \u7684 diff\u3002`:`\u63D0\u4EA4 ${n.slice(0,7)} \u6CA1\u6709\u6587\u4EF6\u5DEE\u5F02\u3002`,commitSha:n,parentSha:r,files:a,patch:o}}})}catch(t){let n=V(t,e.repoUrl);return{ok:!1,message:n instanceof Error?n.message:"\u8BFB\u53D6 commit diff \u5931\u8D25\u3002",commitSha:e.commitSha.trim(),files:[],patch:""}}},Xa=async e=>{try{return await Ue({...e,taskKey:"git-rebase",run:async t=>{let{baseBranch:n,baseRef:r}=await Ha(t,e.baseBranch,{forceFetchFirst:!0}),o=await Ne(t);try{return await t.raw(["rebase",r]),{ok:!0,message:`\u5DF2\u5C06 ${o} rebase \u5230 ${n}\u3002`,baseBranch:n,currentBranch:o,conflicts:!1,conflictedFiles:[]}}catch(i){let s=await gf(t),a=V(i,e.repoUrl);return{ok:!1,message:s.length>0?`rebase \u53D1\u751F\u51B2\u7A81\uFF0C\u8BF7\u5148\u89E3\u51B3\u51B2\u7A81\u540E\u518D\u7EE7\u7EED\u3002${a instanceof Error?` ${a.message}`:""}`.trim():a instanceof Error?a.message:"\u6267\u884C rebase \u5931\u8D25\u3002",baseBranch:n,currentBranch:o,conflicts:s.length>0,conflictedFiles:s}}}})}catch(t){let n=V(t,e.repoUrl);return{ok:!1,message:n instanceof Error?n.message:"\u6267\u884C rebase \u5931\u8D25\u3002",baseBranch:le(e.baseBranch)||Xt,currentBranch:"HEAD",conflicts:!1,conflictedFiles:[]}}},Qa=async e=>{let t=Math.min(120,Math.max(10,e.limit??40));try{return await Ue({...e,taskKey:"git-graph",run:async n=>{let r=await Ne(n),o=le(e.baseBranch)||Xt,i=await n.raw(["log","--decorate=short","--date=iso-local","--topo-order",`--max-count=${t}`,"--all","--format=%H%x1f%P%x1f%d%x1f%s%x1f%cd%x1f%an%x1e"]),s=await n.raw(["log","--graph","--decorate","--date=short",`--max-count=${t}`,"--all","--no-color","--pretty=format:%h %d %s (%cd)"]),a=yf(i);return{ok:!0,message:"\u5DF2\u52A0\u8F7D Git graph\u3002",baseBranch:o,currentBranch:r,limit:t,commitCount:a.length,graph:s,commits:a}}})}catch(n){let r=V(n,e.repoUrl);return{ok:!1,message:r instanceof Error?r.message:"\u8BFB\u53D6 Git graph \u5931\u8D25\u3002",baseBranch:le(e.baseBranch)||Xt,currentBranch:"HEAD",limit:t,commitCount:0,graph:"",commits:[]}}},Ya=async e=>{try{return await Ue({...e,taskKey:"git-push",run:async t=>{let n=e.branchName?.trim()||await Ne(t),r=le(n);return r?(await t.push(["-u","origin",r]),{ok:!0,message:`\u5DF2\u63A8\u9001\u5206\u652F ${r} \u5230 origin\u3002`,branchName:r,remoteBranch:`origin/${r}`}):{ok:!1,message:"\u5F53\u524D worktree \u4E0D\u5728\u6709\u6548\u5206\u652F\u4E0A\uFF0C\u65E0\u6CD5\u63A8\u9001\u3002",branchName:n,remoteBranch:""}}})}catch(t){let n=V(t,e.repoUrl);return{ok:!1,message:n instanceof Error?n.message:"\u63A8\u9001\u5206\u652F\u5931\u8D25\u3002",branchName:e.branchName?.trim()||"",remoteBranch:""}}},Za=async e=>{let t=le(e.branchName);if(!t)return{ok:!1,message:"\u76EE\u6807\u5206\u652F\u4E0D\u80FD\u4E3A\u7A7A\u3002",currentBranch:""};try{return await Ue({...e,taskKey:"git-checkout",run:async n=>{let r=await Ne(n);if(r===t)return{ok:!0,message:`\u5F53\u524D\u5DF2\u7ECF\u5728\u5206\u652F ${t}\u3002`,currentBranch:r};let o=await n.status();if(!o.isClean()){let m=o.files.map(g=>g.path).filter(Boolean);return{ok:!1,message:m.length>0?`\u5F53\u524D\u5DE5\u4F5C\u533A\u6709\u672A\u63D0\u4EA4\u6539\u52A8\uFF0C\u8BF7\u5148\u5904\u7406\u540E\u518D\u5207\u6362\u5206\u652F\uFF1A${m.slice(0,6).join(", ")}${m.length>6?"\u2026":""}`:"\u5F53\u524D\u5DE5\u4F5C\u533A\u6709\u672A\u63D0\u4EA4\u6539\u52A8\uFF0C\u8BF7\u5148\u5904\u7406\u540E\u518D\u5207\u6362\u5206\u652F\u3002",currentBranch:r}}let i=await n.branch(["-a"]);if(!new Set(i.all.map(le).filter(Boolean)).has(t))try{await n.fetch(["origin",`${t}:refs/remotes/origin/${t}`])}catch{}let a=await n.branch(["-a"]),c=await n.branchLocal(),l=new Set(c.all.map(le).filter(Boolean));if(!a.all.map(le).filter(Boolean).includes(t)&&!l.has(t))return{ok:!1,message:`\u627E\u4E0D\u5230\u5206\u652F ${t}\u3002`,currentBranch:r};l.has(t)?await n.checkout(t):await n.checkout(["-B",t,`origin/${t}`]);let d=await Ne(n);return{ok:!0,message:`\u5DF2\u5207\u6362\u5230\u5206\u652F ${d}\u3002`,currentBranch:d}}})}catch(n){let r=V(n,e.repoUrl);return{ok:!1,message:r instanceof Error?r.message:"\u5207\u6362\u5206\u652F\u5931\u8D25\u3002",currentBranch:""}}},ec=async e=>{try{return await Ue({worktreePath:e.worktreePath,repoUrl:e.repoUrl,gitIdentity:e.gitIdentity,taskKey:"git-pull-request",run:async t=>{let n=hf(e.repoUrl);if(!n)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 r=e.compareBranch?.trim()||await Ne(t),o=le(r);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:r};await t.push(["-u","origin",o]);let i=e.gitIdentity?.credentialToken?.trim()||"";if(!i||e.gitIdentity?.authMode!=="pat")return{ok:!1,message:"\u521B\u5EFA PR \u76EE\u524D\u9700\u8981\u5DF2\u914D\u7F6E\u5E76\u6FC0\u6D3B GitHub PAT\u3002",provider:"github",title:e.title,body:e.body,baseBranch:e.baseBranch,compareBranch:o};let s=await fetch(`https://api.github.com/repos/${n.owner}/${n.repo}/pulls`,{method:"POST",headers:{Accept:"application/vnd.github+json",Authorization:`Bearer ${i}`,"Content-Type":"application/json","User-Agent":"Vibemux-Worker","X-GitHub-Api-Version":"2022-11-28"},body:JSON.stringify({title:e.title,body:e.body,base:e.baseBranch,head:o})}),a=await s.json().catch(()=>({}));if(!s.ok){let c=Array.isArray(a.errors)?a.errors.map(l=>l.message).filter(Boolean).join("\uFF1B"):"";return{ok:!1,message:[a.message,c].filter(Boolean).join("\uFF1B")||"\u521B\u5EFA GitHub PR \u5931\u8D25\u3002",provider:"github",title:e.title,body:e.body,baseBranch:e.baseBranch,compareBranch:o}}return{ok:!0,message:"PR \u5DF2\u521B\u5EFA\u3002",provider:"github",title:e.title,body:e.body,baseBranch:e.baseBranch,compareBranch:o,number:a.number,url:a.html_url,state:a.state}}})}catch(t){let n=V(t,e.repoUrl);return{ok:!1,message:n instanceof Error?n.message:"\u521B\u5EFA PR \u5931\u8D25\u3002",provider:"github",title:e.title,body:e.body,baseBranch:e.baseBranch,compareBranch:e.compareBranch?.trim()||""}}};import{readFile as Ef,readdir as If,stat as or}from"node:fs/promises";import bf from"node:os";import Rt from"node:path";import{mkdirSync as kf}from"node:fs";import{readdir as wf,stat as nc}from"node:fs/promises";import tc from"node:os";import jo from"node:path";import{simpleGit as Sf}from"simple-git";var Se="main",xf=e=>{let t=e.trim();return t?t==="~"?tc.homedir():t.startsWith("~/")?jo.join(tc.homedir(),t.slice(2)):t:""},ee=e=>jo.resolve(xf(e)),Q=e=>{let t=e.trim();if(!t||t==="HEAD"||t.endsWith("/HEAD"))return"";let n=t.startsWith("refs/heads/")?t.slice(11):t,r=n.startsWith("remotes/")?n.slice(8):n;return r.startsWith("origin/")?r.slice(7):r},te=(e,t)=>{let n={...ht(t),...e?{baseDir:e}:{}};return Sf(n).env(t??{})},Ze=async(e,t,n)=>{let r=te(e,n),[o,i]=await Promise.all([r.branch(["-a"]),r.branchLocal()]),s="";try{s=Q(await r.raw(["symbolic-ref","--quiet","--short","refs/remotes/origin/HEAD"]))}catch{s=""}let a=Array.from(new Set(o.all.map(Q).filter(Boolean))).sort((d,m)=>d.localeCompare(m)),c=Q(t??""),l=Q(i.current),u=[s,c,l,a[0],Se].find(d=>d&&(d===Se||a.includes(d)))??Se;return{branches:a,defaultBranch:u,currentBranch:l||void 0}},Cf=e=>{for(let t of e.split(`
76
+ `)){let n=t.trim();if(!n.startsWith("ref: "))continue;let[r]=n.split(" ");return Q(r.slice(5))}return""},Pf=e=>Array.from(new Set(e.split(`
77
+ `).map(t=>t.trim()).filter(Boolean).map(t=>t.split(" ")[1]||"").map(Q).filter(Boolean))).sort((t,n)=>t.localeCompare(n)),vf=async(e,t,n)=>{if(t?.trim())return t.trim();let r=te(e,n);return await r.checkIsRepo()&&(await r.getRemotes(!0)).find(i=>i.name==="origin")?.refs.fetch?.trim()||""},rc=async(e,t,n)=>{if(t?.trim())return!1;let r=te(e,n);return await r.checkIsRepo().catch(()=>!1)?!(await r.getRemotes(!0).catch(()=>[])).some(i=>i.name==="origin"&&i.refs.fetch?.trim()):!1},Qt=async(e,t,n,r)=>{let o=await vf(e,t,r);if(!o)throw new Error("\u4ED3\u5E93\u672A\u914D\u7F6E origin\uFF0C\u4E14\u6CA1\u6709\u53EF\u7528\u7684\u8FDC\u7AEF\u4ED3\u5E93\u5730\u5740\u3002");let i=await nc(e).then(async g=>{if(!g.isDirectory())return;let k=te(e,r);if(await k.checkIsRepo().catch(()=>!1))return k.branchLocal().then(h=>Q(h.current)||void 0).catch(()=>{})}).catch(()=>{}),s=te(void 0,r),[a,c]=await Promise.all([s.raw(["ls-remote","--heads",o]),s.raw(["ls-remote","--symref",o,"HEAD"])]),l=Pf(a),u=Cf(c),d=Q(n??""),m=[u,d,l[0],Se].find(g=>g&&(g===Se||l.includes(g)))??Se;return{branches:l,defaultBranch:m,currentBranch:i,remoteTarget:o}},Yt=e=>{let t=Q(e.preferredBranch??"")||e.defaultBranch;return e.branches.includes(t)?t:e.defaultBranch},Zt=async e=>{let t=await nc(e.repoPath).catch(()=>null);if(t&&!t.isDirectory())throw new Error(`\u76EE\u6807\u8DEF\u5F84\u4E0D\u662F\u76EE\u5F55\uFF1A${e.repoPath}`);if(t){let n=te(e.repoPath,e.env);if(await n.checkIsRepo().catch(()=>!1)){await n.fetch(["origin",`${e.startPoint}:refs/remotes/origin/${e.startPoint}`]);return}if((await wf(e.repoPath)).length>0)throw new Error(`\u76EE\u6807\u76EE\u5F55\u4E0D\u662F\u6709\u6548 Git \u4ED3\u5E93\uFF1A${e.repoPath}`)}else kf(jo.dirname(e.repoPath),{recursive:!0});await te(void 0,e.env).clone(e.remoteTarget,e.repoPath,["--single-branch","--branch",e.startPoint])};var Fo=(e,t)=>{let n=Rt.relative(e,t);return n===""||!n.startsWith("..")&&!Rt.isAbsolute(n)},ic=e=>{let t=ee(e),n=ee(bf.homedir());return Fo(n,t)?n:t};var sc=async e=>{let t=ee(e);try{if(!(await or(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 n=Rt.basename(t);try{let r=te(t);if(!await r.checkIsRepo())return{ok:!0,path:t,name:n,versionControl:"none",message:"\u76EE\u5F55\u65E0 Git \u4ED3\u5E93"};let s=(await r.getRemotes(!0)).find(d=>d.name==="origin"),a=await Ze(t),c=a.branches.length,l=s?.refs.fetch?.trim()||"",u=l?"git-remote":"git-local";return{ok:!0,path:t,name:n,versionControl:u,gitUrl:l,defaultBranch:a.defaultBranch,message:c>0?u==="git-remote"?`\u5DF2\u68C0\u6D4B\u5230 Git \u4ED3\u5E93\uFF0C\u5171 ${c} \u4E2A\u5206\u652F`:`\u5DF2\u68C0\u6D4B\u5230\u672C\u5730 Git \u4ED3\u5E93\uFF08\u672A\u7ED1\u5B9A\u8FDC\u7AEF\uFF09\uFF0C\u5171 ${c} \u4E2A\u5206\u652F`:u==="git-remote"?"\u5DF2\u68C0\u6D4B\u5230 Git \u4ED3\u5E93":"\u5DF2\u68C0\u6D4B\u5230\u672C\u5730 Git \u4ED3\u5E93\uFF08\u672A\u7ED1\u5B9A\u8FDC\u7AEF\uFF09"}}catch{return{ok:!0,path:t,name:n,message:"\u65E0\u6CD5\u8BFB\u53D6 Git \u4FE1\u606F"}}},ac=async(e,t)=>{let n=ic(e),r=ee(e),o=t?.trim()?ee(t):r;if(!Fo(n,o))return{ok:!1,path:o,rootPath:n,entries:[],message:"\u5F53\u524D\u8DEF\u5F84\u8D85\u51FA\u53EF\u6D4F\u89C8\u8303\u56F4\u3002"};try{if(!(await or(o)).isDirectory())return{ok:!1,path:o,rootPath:n,entries:[],message:"\u5F53\u524D\u8DEF\u5F84\u4E0D\u662F\u76EE\u5F55\u3002"}}catch{return{ok:!1,path:o,rootPath:n,entries:[],message:"\u76EE\u5F55\u4E0D\u5B58\u5728\u3002"}}try{let s=(await If(o,{withFileTypes:!0})).filter(a=>a.isDirectory()||a.isFile()).map(a=>({name:a.name,path:Rt.join(o,a.name),kind:a.isDirectory()?"directory":"file"})).sort((a,c)=>a.kind!==c.kind?a.kind==="directory"?-1:1:a.name.localeCompare(c.name,"zh-Hans-CN"));return{ok:!0,path:o,rootPath:n,parentPath:o===n?void 0:Rt.dirname(o),entries:s,message:s.length>0?`\u5171\u627E\u5230 ${s.length} \u4E2A\u6761\u76EE\u3002`:"\u5F53\u524D\u76EE\u5F55\u4E0B\u6CA1\u6709\u6587\u4EF6\u6216\u6587\u4EF6\u5939\u3002"}}catch(i){return{ok:!1,path:o,rootPath:n,entries:[],message:i instanceof Error?i.message:"\u8BFB\u53D6\u76EE\u5F55\u5931\u8D25\u3002"}}},Rf=200*1024,oc={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp",".svg":"image/svg+xml",".bmp":"image/bmp",".ico":"image/x-icon"},Tf=new Set([".md",".markdown",".mdx"]),Af=new Set([".json",".jsonc"]),Mf=e=>{let t=Rt.extname(e).toLowerCase();return oc[t]?oc[t]:Tf.has(t)?"text/markdown":Af.has(t)?"application/json":"text/plain"},cc=async(e,t)=>{let n=ic(e),r=t?.trim()?ee(t):n;if(!Fo(n,r))return{ok:!1,path:r,rootPath:n,message:"\u53EA\u80FD\u8BFB\u53D6\u8BE5\u5DE5\u4F5C\u7AD9 workspace \u5185\u7684\u6587\u4EF6\u3002"};try{let o=await or(r);if(!o.isFile())return{ok:!1,path:r,rootPath:n,message:"\u5F53\u524D\u8DEF\u5F84\u4E0D\u662F\u6587\u4EF6\u3002"};if(o.size>Rf)return{ok:!1,path:r,rootPath:n,sizeBytes:o.size,message:"\u6587\u4EF6\u8FC7\u5927\uFF0C\u6682\u4E0D\u652F\u6301\u9884\u89C8\u3002"};let i=await Ef(r),s=Mf(r),a=s.startsWith("image/");return!a&&i.includes(0)?{ok:!1,path:r,rootPath:n,contentType:s,sizeBytes:o.size,message:"\u6682\u4E0D\u652F\u6301\u9884\u89C8\u4E8C\u8FDB\u5236\u6587\u4EF6\u3002"}:{ok:!0,path:r,rootPath:n,content:a?i.toString("base64"):i.toString("utf8"),contentType:s,encoding:a?"base64":"utf8",sizeBytes:o.size,truncated:!1}}catch(o){return{ok:!1,path:r,rootPath:n,message:o instanceof Error?o.message:"\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25\u3002"}}},lc=async(e,t,n,r)=>{let o=ee(e),i=Ae({taskId:`repo-branches-${Buffer.from(o).toString("base64url").slice(0,24)}`,identity:r??{mode:"personal"},repoUrl:t});console.log("[worker] [repo-branches] snapshot starting",JSON.stringify({localPath:o,repoUrl:t,preferredBranch:n}));try{if(await rc(o,t,i.env)){let l=await Ze(o,n,i.env);return console.log("[worker] [repo-branches] local-only snapshot resolved",JSON.stringify({localPath:o,branchCount:l.branches.length,defaultBranch:l.defaultBranch})),{ok:!0,branches:l.branches,defaultBranch:l.defaultBranch,currentBranch:l.currentBranch}}let s=await Qt(o,t,n,i.env),a=Yt({branches:s.branches,defaultBranch:s.defaultBranch,preferredBranch:n});if(!s.branches.includes(a))return{ok:!1,branches:[],defaultBranch:s.defaultBranch,message:s.branches.length>0?`\u8D77\u59CB\u5206\u652F ${a} \u4E0D\u5B58\u5728\u3002\u5F53\u524D\u4ED3\u5E93\u5206\u652F\uFF1A${s.branches.join(", ")}`:`\u8D77\u59CB\u5206\u652F ${a} \u4E0D\u5B58\u5728\u3002`};await Zt({repoPath:o,remoteTarget:s.remoteTarget,startPoint:a,env:i.env}),console.log("[worker] [repo-branches] remote snapshot resolved",JSON.stringify({localPath:o,remoteTarget:s.remoteTarget,branchCount:s.branches.length,defaultBranch:s.defaultBranch}));let c=await Ze(o,n,i.env).then(l=>l.currentBranch).catch(()=>s.currentBranch);return{ok:!0,branches:s.branches,defaultBranch:s.defaultBranch,currentBranch:c}}catch(s){let a=V(s,t);console.log("[worker] [repo-branches] remote snapshot failed",JSON.stringify({localPath:o,error:a instanceof Error?a.message:"unknown"}));try{if(!(await or(o)).isDirectory())return{ok:!1,branches:[],defaultBranch:Q(n??"")||Se,message:a instanceof Error?a.message:"\u8BFB\u53D6\u5206\u652F\u5217\u8868\u5931\u8D25\u3002"};if(!await te(o,i.env).checkIsRepo())return console.log("[worker] [repo-branches] fallback skipped: path is not repo",JSON.stringify({localPath:o})),{ok:!1,branches:[],defaultBranch:Q(n??"")||Se,message:a instanceof Error?a.message:"\u8BFB\u53D6\u5206\u652F\u5217\u8868\u5931\u8D25\u3002"};let u=await Ze(o,n,i.env);return console.log("[worker] [repo-branches] local fallback resolved",JSON.stringify({localPath:o,branchCount:u.branches.length,defaultBranch:u.defaultBranch})),{ok:!0,branches:u.branches,defaultBranch:u.defaultBranch,currentBranch:u.currentBranch}}catch(c){let l=V(c,t);console.log("[worker] [repo-branches] local fallback failed",JSON.stringify({localPath:o,error:l instanceof Error?l.message:"unknown"}))}return{ok:!1,branches:[],defaultBranch:Q(n??"")||Se,message:a instanceof Error?a.message:"\u8BFB\u53D6\u5206\u652F\u5217\u8868\u5931\u8D25\u3002"}}finally{i.cleanup()}};import{readdir as uc,readFile as Go,stat as pc}from"node:fs/promises";import qo from"node:os";import xe from"node:path";var dc=e=>(e??"").trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||null;var Of=["skills",".agents/skills",".codex/skills",".claude/skills",".cursor/skills",".opencode/skills",".pi/skills"],_f=["~/.claude/skills","~/.agents/skills","~/.codex/skills","~/.config/opencode/skills","~/.pi/skills"],Wf=new Set([".md",".txt",".json",".yml",".yaml",".ts",".tsx",".js",".jsx",".mjs",".cjs",".sh",".py",".rb"]),Bf=e=>{let t=e.trim();return t?t==="~"?qo.homedir():t.startsWith("~/")?xe.join(qo.homedir(),t.slice(2)):t:""},zo=e=>xe.resolve(Bf(e)),Df=e=>{let t=e.match(/^---\n([\s\S]*?)\n---/);if(!t)return{};let n={};for(let r of t[1].split(`
78
+ `)){let[o,...i]=r.split(":"),s=o.trim().toLowerCase(),a=i.join(":").trim().replace(/^"|"$/g,"");a&&(s==="name"&&(n.name=a),s==="description"&&(n.description=a))}return n},$f=(e,t)=>{let n=Df(e);if(n.name?.trim())return{name:n.name.trim(),description:n.description?.trim()||null};let r=e.match(/^#\s+(.+)$/m)?.[1]?.trim();return r?{name:r,description:n.description?.trim()||null}:{name:xe.basename(t),description:n.description?.trim()||null}},mc=e=>{let t=e.replace(/\\/g,"/");return t==="SKILL.md"?"skill":t.startsWith("references/")?"reference":t.startsWith("scripts/")?"script":t.startsWith("assets/")?"asset":"other"},Nf=e=>e==="SKILL.md"?!0:Wf.has(xe.extname(e).toLowerCase()),Uf=e=>mc(e)==="asset",Lf=e=>e.some(t=>t.kind==="script")?"scripts_executables":e.some(t=>t.kind==="asset")?"assets":"markdown_only",gc=async e=>{let t=await uc(e,{withFileTypes:!0}).catch(()=>[]);if(t.some(r=>r.isFile()&&r.name==="SKILL.md"))return[e];let n=[];for(let r of t)!r.isDirectory()||r.name===".git"||r.name==="node_modules"||n.push(...await gc(xe.join(e,r.name)));return n},jf=async e=>{let t={},n=[],r=async o=>{let i=await uc(o,{withFileTypes:!0}).catch(()=>[]);for(let s of i){let a=xe.join(o,s.name),c=xe.relative(e,a).replace(/\\/g,"/");if(s.isDirectory()){if(s.name===".git"||s.name==="node_modules")continue;await r(a);continue}if(n.push({path:c,kind:mc(c)}),Nf(s.name)){let u=await Go(a,"utf8").catch(()=>null);typeof u=="string"&&(t[c]={encoding:"utf8",content:u});continue}if(!Uf(c))continue;let l=await Go(a).catch(()=>null);l&&(t[c]={encoding:"base64",content:l.toString("base64")})}};return await r(e),{files:t,inventory:n.sort((o,i)=>o.path.localeCompare(i.path))}},Ff=async e=>{let t=await Go(xe.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 n=$f(t,e),{files:r,inventory:o}=await jf(e);return{skill:{name:n.name,slug:dc(n.name)??xe.basename(e),description:n.description,markdown:t,sourceLocator:e,trustLevel:Lf(o),fileInventory:o,files:r}}},fc=async e=>{let t=[],n=[],r=[];for(let o of e){let i=zo(o);if(!(t.includes(i)||(t.push(i),!await pc(i).then(a=>a.isDirectory()).catch(()=>!1))))for(let a of await gc(i)){let{skill:c,warning:l}=await Ff(a);if(l){r.push(l);continue}c&&n.push(c)}}return n.sort((o,i)=>o.slug.localeCompare(i.slug)||o.sourceLocator.localeCompare(i.sourceLocator)),{scannedRoots:t,packages:n,warnings:r}},Gf=async(e,t)=>{let n=zo(t);try{if(!(await pc(n)).isDirectory())return{ok:!1,scanMode:"project",rootPath:n,scannedRoots:[n],packages:[],warnings:[],message:"\u5F53\u524D\u8DEF\u5F84\u4E0D\u662F\u76EE\u5F55\u3002"}}catch{return{ok:!1,scanMode:"project",rootPath:n,scannedRoots:[n],packages:[],warnings:[],message:"\u76EE\u5F55\u4E0D\u5B58\u5728\u3002"}}let{scannedRoots:r,packages:o,warnings:i}=await fc(Of.map(s=>xe.join(n,s)));return{ok:!0,scanMode:"project",rootPath:n,scannedRoots:r,packages:o,warnings:i,message:o.length>0?`\u5171\u53D1\u73B0 ${o.length} \u4E2A\u6280\u80FD\u5305\u3002`:"\u672A\u53D1\u73B0 SKILL.md\u3002"}},qf=async()=>{let e=zo(qo.homedir()),{scannedRoots:t,packages:n,warnings:r}=await fc([..._f]);return{ok:!0,scanMode:"global",rootPath:e,scannedRoots:t,packages:n,warnings:r,message:n.length>0?`\u5171\u53D1\u73B0 ${n.length} \u4E2A\u6280\u80FD\u5305\u3002`:"\u672A\u53D1\u73B0\u5168\u5C40 SKILL.md\u3002"}},hc=async e=>e.scanMode==="global"?qf():Gf(e.workspaceRoot,e.rootPath||e.workspaceRoot);import{createHash as Xf}from"node:crypto";import{existsSync as Ho,mkdirSync as Sc,rmSync as Qf}from"node:fs";import en from"node:path";import{simpleGit as Yf}from"simple-git";import{mkdirSync as Jf,writeFileSync as Vf}from"node:fs";import ir from"node:path";var zf=/^[A-Za-z]:[\\/]/u;var Hf=e=>{let t=e?.trim();return t||void 0};var yc=e=>{let t=Hf(e);if(!t||t.startsWith("/")||t.startsWith("\\")||zf.test(t))return!1;let n=t.split(/[\\/]+/).filter(r=>r.length>0);return n.length===0?!1:n.every(r=>r!=="."&&r!=="..")};var Kf=(e,t)=>{if(!yc(t))throw new Error(`\u8FD0\u884C\u65F6\u73AF\u5883\u53D8\u91CF\u6587\u4EF6\u540D\u4E0D\u5408\u6CD5\uFF1A${t}`);let n=ir.resolve(e,t),r=ir.relative(e,n);if(r.startsWith("..")||ir.isAbsolute(r))throw new Error(`\u8FD0\u884C\u65F6\u73AF\u5883\u53D8\u91CF\u6587\u4EF6\u5FC5\u987B\u4F4D\u4E8E\u5DE5\u4F5C\u76EE\u5F55\u5185\uFF1A${t}`);return n},oe=(e,t)=>{if(!t)return{env:{}};if(t.mode==="env-file"){let n=t.fileName?.trim();if(!n)throw new Error("\u73AF\u5883\u53D8\u91CF\u6587\u4EF6\u6A21\u5F0F\u7F3A\u5C11\u6587\u4EF6\u540D\u3002");let r=Kf(e,n);Jf(ir.dirname(r),{recursive:!0}),Vf(r,`${t.fileContent??""}${t.fileContent?`
79
+ `:""}`,"utf8")}return{env:{...t.variables??{}}}},Ce=(e,t)=>({...e??process.env,...t?.variables??{}});var xc=e=>e==="original-dir"?"original-dir":"worktree",Zf=e=>e.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"repo",eh=e=>Xf("sha1").update(e).digest("hex").slice(0,12),Cc=(e,t)=>{let n=t?en.basename(t).replace(/\.git$/i,""):"repo";return en.join(ee(e),"repos",`${Zf(n)}-${eh(t||n)}`)},kc=e=>{let t=[e.repoPath?.trim(),e.worktreePath.trim()].filter(r=>!!r).map(r=>ee(r));return t.find(r=>Ho(r))||t[0]||ee(e.worktreePath)},th=async e=>{if(e.repoUrl?.trim()){let r=await Qt(e.repoPath,e.repoUrl,e.preferredBranch,e.env),o=Yt({branches:r.branches,defaultBranch:r.defaultBranch,preferredBranch:e.preferredBranch});if(!r.branches.includes(o))return{ok:!1,message:r.branches.length>0?`\u8D77\u59CB\u5206\u652F ${o} \u4E0D\u5B58\u5728\u3002\u5F53\u524D\u4ED3\u5E93\u5206\u652F\uFF1A${r.branches.join(", ")}`:`\u8D77\u59CB\u5206\u652F ${o} \u4E0D\u5B58\u5728\u3002`,worktreePath:e.repoPath};console.log("[worker] [worktree] preparing original directory repository",JSON.stringify({repoPath:e.repoPath,remoteTarget:r.remoteTarget,startPoint:o})),await Zt({repoPath:e.repoPath,remoteTarget:r.remoteTarget,startPoint:o,env:e.env})}let t=te(e.repoPath,e.env);if(!Ho(e.repoPath)||!await t.checkIsRepo().catch(()=>!1))return{ok:!1,message:`\u539F\u59CB\u76EE\u5F55\u6A21\u5F0F\u8981\u6C42\u76EE\u6807\u76EE\u5F55\u662F\u6709\u6548 Git \u4ED3\u5E93\uFF1A${e.repoPath}`,worktreePath:e.repoPath};let n=Q((await t.branchLocal()).current);return{ok:!0,message:n?`\u5DF2\u590D\u7528\u539F\u59CB\u76EE\u5F55 ${e.repoPath}\uFF0C\u5F53\u524D\u5206\u652F ${n}\u3002`:`\u5DF2\u590D\u7528\u539F\u59CB\u76EE\u5F55 ${e.repoPath}\u3002`,worktreePath:e.repoPath}},nh=async e=>{let t=await e.raw(["worktree","list","--porcelain"]),n=[],r=null;for(let o of t.split(`
80
+ `)){if(o.startsWith("worktree ")){r&&n.push(r),r={path:en.resolve(o.slice(9).trim())};continue}o.startsWith("branch ")&&r&&(r.branch=o.slice(7).trim())}return r&&n.push(r),n},rh=async(e,t)=>(await e.branchLocal()).all.includes(t),Pc=e=>{Qf(e,{recursive:!0,force:!0,maxRetries:5,retryDelay:100})},vc=async(e,t,n)=>{let r=en.resolve(t),o=`refs/heads/${n}`;try{await e.raw(["worktree","prune"])}catch{}let s=(await nh(e)).find(a=>a.branch===o);if(s&&s.path!==r)try{await e.raw(["worktree","remove","--force",s.path])}catch{}try{await e.raw(["worktree","remove","--force",r])}catch{}if(Pc(r),await rh(e,n))try{await e.deleteLocalBranch(n,!0)}catch{}try{await e.raw(["worktree","prune"])}catch{}Sc(en.dirname(r),{recursive:!0})},wc=async e=>{let t=te(e.repoPath,e.env);if(!await t.checkIsRepo().catch(()=>!1))return{ok:!1,message:`\u76EE\u6807\u76EE\u5F55\u4E0D\u662F\u6709\u6548 Git \u4ED3\u5E93\uFF1A${e.repoPath}`,worktreePath:e.worktreePath};let n=await Ze(e.repoPath,e.preferredBranch,e.env),r=Q(e.preferredBranch??"")||n.defaultBranch,o=n.branches.includes(r)?r:n.defaultBranch;return n.branches.includes(o)?(console.log("[worker] [worktree] local repo creating worktree",JSON.stringify({repoPath:e.repoPath,worktreePath:e.worktreePath,branchName:e.branchName,startPoint:o})),await vc(t,e.worktreePath,e.branchName),await t.raw(["worktree","add","--force","-B",e.branchName,e.worktreePath,o]),{ok:!0,message:`\u5DF2\u57FA\u4E8E ${o} \u521B\u5EFA worktree ${e.worktreePath} \u5E76\u5207\u51FA\u5206\u652F ${e.branchName}\u3002`,worktreePath:e.worktreePath}):{ok:!1,message:n.branches.length>0?`\u8D77\u59CB\u5206\u652F ${o} \u4E0D\u5B58\u5728\u3002\u5F53\u524D\u4ED3\u5E93\u5206\u652F\uFF1A${n.branches.join(", ")}`:`\u8D77\u59CB\u5206\u652F ${o} \u4E0D\u5B58\u5728\u3002`,worktreePath:e.worktreePath}},Ec=async e=>{let t=xc(e.workingDirectoryMode),n=ee(e.worktreePath),r=ee(e.repoPath?.trim()||Cc(e.workspaceRoot,e.repoUrl)),o=Ae({taskId:`worktree-${Buffer.from(n).toString("base64url").slice(0,24)}`,identity:e.gitIdentity??{mode:"personal"},repoUrl:e.repoUrl}),i=t==="original-dir"?kc({repoPath:e.repoPath,worktreePath:e.worktreePath}):n;oe(i,e.runtimeEnvironment);let s=Ce(o.env,e.runtimeEnvironment);if(console.log("[worker] [worktree] ensure worktree starting",JSON.stringify({worktreePath:n,repoPath:r,branchName:e.branchName,preferredBranch:e.preferredBranch,workingDirectoryMode:t})),t==="original-dir"){let a=kc({repoPath:e.repoPath,worktreePath:e.worktreePath});try{return await th({repoPath:a,repoUrl:e.repoUrl,preferredBranch:e.preferredBranch,branchName:e.branchName,env:s})}catch(c){let l=V(c,e.repoUrl);return{ok:!1,message:l instanceof Error?l.message:"\u539F\u59CB\u76EE\u5F55\u51C6\u5907\u5931\u8D25\u3002",worktreePath:r}}finally{o.cleanup()}}if(!e.repoPath?.trim()&&!e.repoUrl?.trim())return Sc(n,{recursive:!0}),{ok:!0,message:`\u5DF2\u51C6\u5907\u9879\u76EE\u76EE\u5F55 ${n}\u3002`,worktreePath:n};if(!e.repoUrl?.trim())try{return await wc({repoPath:r,worktreePath:n,branchName:e.branchName,preferredBranch:e.preferredBranch,env:s})}catch(a){let c=V(a,e.repoUrl);return{ok:!1,message:c instanceof Error?c.message:"\u521B\u5EFA worktree \u5931\u8D25\u3002",worktreePath:n}}finally{o.cleanup()}try{let a=await Qt(r,e.repoUrl,e.preferredBranch,s),c=Q(e.preferredBranch??"")||a.defaultBranch,l=Yt({branches:a.branches,defaultBranch:a.defaultBranch,preferredBranch:e.preferredBranch});if(!a.branches.includes(l))return console.log("[worker] [worktree] ensure worktree skipped: branch not found",JSON.stringify({startPoint:l,availableBranches:a.branches})),{ok:!1,message:a.branches.length>0?`\u8D77\u59CB\u5206\u652F ${l} \u4E0D\u5B58\u5728\u3002\u5F53\u524D\u4ED3\u5E93\u5206\u652F\uFF1A${a.branches.join(", ")}`:`\u8D77\u59CB\u5206\u652F ${l} \u4E0D\u5B58\u5728\u3002`};console.log("[worker] [worktree] resolved remote start point",JSON.stringify({repoPath:r,remoteTarget:a.remoteTarget,requestedStartPoint:c,startPoint:l})),await Zt({repoPath:r,remoteTarget:a.remoteTarget,startPoint:l,env:s});let u=te(r,s),d=`refs/remotes/origin/${l}`;return console.log("[worker] [worktree] creating fresh worktree",JSON.stringify({worktreePath:n,branchName:e.branchName,startPoint:l,startPointRef:d})),await vc(u,n,e.branchName),await u.raw(["worktree","add","--force","-B",e.branchName,n,d]),console.log("[worker] [worktree] worktree created",JSON.stringify({worktreePath:n,branchName:e.branchName,startPoint:l,startPointRef:d})),{ok:!0,message:`\u5DF2\u57FA\u4E8E ${l} \u521B\u5EFA worktree ${n} \u5E76\u5207\u51FA\u5206\u652F ${e.branchName}\u3002`,worktreePath:n}}catch(a){let c=V(a,e.repoUrl);console.log("[worker] [worktree] remote prepare failed",JSON.stringify({worktreePath:n,repoPath:r,error:c instanceof Error?c.message:"unknown"}));try{return await wc({repoPath:r,worktreePath:n,branchName:e.branchName,preferredBranch:e.preferredBranch,env:s})}catch(l){let u=V(l,e.repoUrl);return console.log("[worker] [worktree] ensure worktree failed",JSON.stringify({worktreePath:n,error:u instanceof Error?u.message:"unknown"})),{ok:!1,message:u instanceof Error?u.message:"\u521B\u5EFA worktree \u5931\u8D25\u3002",worktreePath:n}}}finally{o.cleanup()}},Ic=async e=>{let t=xc(e.workingDirectoryMode),n=ee(e.worktreePath),r=ee(e.repoPath?.trim()||Cc(e.workspaceRoot,e.repoUrl));if(console.log("[worker] [worktree] cleanup worktree starting",JSON.stringify({worktreePath:n,repoPath:r,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 ${r}\u3002`,worktreePath:r};if(!e.repoPath?.trim()&&!e.repoUrl?.trim())return{ok:!0,message:`\u5F53\u524D\u76EE\u5F55\u9879\u76EE\u65E0\u9700\u6E05\u7406 worktree\uFF1A${n}\u3002`,worktreePath:n};try{if(Ho(r)){let o=Yf(r);if(await o.checkIsRepo()){try{console.log("[worker] [worktree] removing worktree via git",JSON.stringify({worktreePath:n})),await o.raw(["worktree","remove","--force",n])}catch{console.log("[worker] [worktree] git worktree remove failed, falling through to local cleanup",JSON.stringify({worktreePath:n}))}try{await o.raw(["worktree","prune"])}catch{console.log("[worker] [worktree] git worktree prune failed, ignoring",JSON.stringify({worktreePath:n}))}}}return console.log("[worker] [worktree] removing worktree path",JSON.stringify({worktreePath:n})),Pc(n),console.log("[worker] [worktree] cleanup worktree done",JSON.stringify({worktreePath:n})),{ok:!0,message:`\u5DF2\u6E05\u7406 worktree ${n}\u3002`,worktreePath:n}}catch(o){return console.log("[worker] [worktree] cleanup worktree failed",JSON.stringify({worktreePath:n,error:o instanceof Error?o.message:"unknown"})),{ok:!1,message:o instanceof Error?o.message:"\u6E05\u7406 worktree \u5931\u8D25\u3002",worktreePath:n}}};var bc="[worker][terminal]",oh=["1","true","yes","on"].includes(process.env.VIBEMUX_TERMINAL_DEBUG?.trim().toLowerCase()||""),Rc=e=>typeof e!="string"?e:e.trim().replace(/\s+/g," ").slice(0,160),ih=e=>{if(e)return Object.fromEntries(Object.entries(e).map(([t,n])=>t==="command"||t==="preview"?[t,Rc(n)]:t==="stdout"||t==="stderr"?[t,Rc(n)]:[t,n]))},sh=(e,t)=>{if(!oh)return;let n=ih(t);if(n){console.info(`${bc} ${e}`,n);return}console.info(`${bc} ${e}`)},tn=e=>`prompt:${e}`,Jo=e=>e.workingDirectoryMode==="original-dir"?"original-dir":"worktree",Tc=e=>{let{send:t,executorId:n,sessionId:r,stream:o,chunk:i}=e;t({type:"executor.terminal.session.output",executorId:n,output:{sessionId:r,stream:o,chunk:i,at:new Date().toISOString()}})},Pe=sh;var lh=async(e,t=5e3)=>{let n=Date.now(),r=new AbortController,o=setTimeout(()=>{r.abort()},Math.max(500,t));try{let i=await fetch(e,{method:"GET",redirect:"follow",signal:r.signal,headers:{accept:"text/html,application/json;q=0.9,*/*;q=0.8"}});return await i.body?.cancel().catch(()=>{}),{ok:!0,reachable:!0,url:e,statusCode:i.status,finalUrl:i.url||e,responseTimeMs:Date.now()-n,at:new Date().toISOString()}}catch(i){let s=i instanceof Error?i.name==="AbortError"?`timed out after ${t}ms`:i.message:"environment probe failed";return{ok:!1,reachable:!1,url:e,error:s,responseTimeMs:Date.now()-n,at:new Date().toISOString()}}finally{clearTimeout(o)}},Ac=(e,t)=>{let n=t.getConfig(),r=()=>(n=C(),t.setConfig(n),n);return e.type==="executor.repo-probe.request"?(r(),sc(e.localPath).then(o=>{t.send({type:"executor.repo-probe.response",executorId:n.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.git.pat.verify.request"?(r(),Ta(e.patToken,e.provider,e.host).then(o=>{t.send({type:"executor.git.pat.verify.response",executorId:n.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.doctor.request"?(r(),yt().then(o=>{t.send({type:"executor.doctor.response",executorId:n.executorId,requestId:e.requestId,doctor:o,at:new Date().toISOString()})}),!0):e.type==="executor.directory-browse.request"?(r(),ac(e.rootPath||n.workspaceRoot,e.directoryPath).then(o=>{t.send({type:"executor.directory-browse.response",executorId:n.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.file-read.request"?(r(),cc(e.rootPath||n.workspaceRoot,e.filePath).then(o=>{t.send({type:"executor.file-read.response",executorId:n.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.http.probe.request"?(r(),lh(e.url,e.timeoutMs).then(o=>{t.send({type:"executor.http.probe.response",executorId:n.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.agent.workdir.request"?(r(),Promise.resolve().then(()=>{if(e.action==="ensure"){let o=Da(e.agentId);return{ok:!0,workdir:o.summary,files:o.files,message:"Agent \u5DE5\u4F5C\u76EE\u5F55\u5DF2\u521D\u59CB\u5316\u3002"}}if(e.action==="rescan"){let o=bt(e.agentId,!0);return{ok:!0,workdir:o.summary,files:o.files,message:"Agent \u5DE5\u4F5C\u76EE\u5F55\u7D22\u5F15\u5DF2\u5237\u65B0\u3002"}}if(e.action==="cleanup")return{ok:!0,workdir:Na(e.agentId),files:bt(e.agentId).files,message:"\u5DF2\u6E05\u7406 Agent \u7CFB\u7EDF\u4E34\u65F6\u76EE\u5F55\u3002"};if(e.action==="delete"){let o=Ua(e.agentId,e.relativePath||"");return{ok:!0,workdir:o.summary,files:o.files,message:"\u6587\u4EF6\u5DF2\u5220\u9664\u3002"}}if(e.action==="list"){let o=bt(e.agentId,e.refresh===!0);return{ok:!0,workdir:o.summary,files:o.files}}return{ok:!0,workdir:Vt(e.agentId),files:bt(e.agentId).files}}).catch(o=>({ok:!1,workdir:Vt(e.agentId),files:bt(e.agentId).files,message:o instanceof Error?o.message:"Agent \u5DE5\u4F5C\u76EE\u5F55\u8BF7\u6C42\u5931\u8D25\u3002"})).then(o=>{t.send({type:"executor.agent.workdir.response",executorId:n.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.agent.workdir.download.request"?(r(),Promise.resolve().then(()=>{let o=tr(e.agentId,e.relativePath);return{ok:!0,relativePath:o.relativePath,filename:ch(o.relativePath),contentBase64:ah(o.absolutePath).toString("base64")}}).catch(o=>({ok:!1,relativePath:e.relativePath,message:o instanceof Error?o.message:"Agent \u5DE5\u4F5C\u76EE\u5F55\u6587\u4EF6\u4E0B\u8F7D\u5931\u8D25\u3002"})).then(o=>{t.send({type:"executor.agent.workdir.download.response",executorId:n.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.agent.workdir.read.request"?(r(),Promise.resolve().then(()=>La(e.agentId,e.relativePath)).catch(o=>({ok:!1,relativePath:e.relativePath,message:o instanceof Error?o.message:"Agent \u5DE5\u4F5C\u76EE\u5F55\u6587\u4EF6\u9884\u89C8\u5931\u8D25\u3002"})).then(o=>{t.send({type:"executor.agent.workdir.read.response",executorId:n.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.agent-sessions.list.request"?(r(),Promise.resolve().then(()=>jn()).catch(o=>({ok:!1,sessions:[],counts:{claude:0,opencode:0,codex:0,pi:0},message:o instanceof Error?o.message:"\u8BFB\u53D6\u672C\u5730 Agent \u4F1A\u8BDD\u5931\u8D25\u3002"})).then(o=>{t.send({type:"executor.agent-sessions.list.response",executorId:n.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.agent-sessions.read.request"?(r(),Promise.resolve().then(()=>{let o=Fn(e.source,e.sessionId);return o?{ok:!0,session:o}:{ok:!1,message:"\u4F1A\u8BDD\u4E0D\u5B58\u5728\u6216\u5DF2\u4E0D\u53EF\u8BFB\u3002"}}).catch(o=>({ok:!1,message:o instanceof Error?o.message:"\u8BFB\u53D6\u672C\u5730 Agent \u4F1A\u8BDD\u8BE6\u60C5\u5931\u8D25\u3002"})).then(o=>{t.send({type:"executor.agent-sessions.read.response",executorId:n.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.skills.scan.request"?(r(),hc({workspaceRoot:n.workspaceRoot,scanMode:e.scanMode,rootPath:e.rootPath}).then(o=>{t.send({type:"executor.skills.scan.response",executorId:n.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.repo-branches.request"?(r(),console.log("[worker] [repo-branches] request received",JSON.stringify({requestId:e.requestId,executorId:n.executorId,localPath:e.localPath,repoUrl:e.repoUrl,preferredBranch:e.preferredBranch})),lc(e.localPath,e.repoUrl,e.preferredBranch,e.gitIdentity).then(o=>{console.log("[worker] [repo-branches] request resolved",JSON.stringify({requestId:e.requestId,executorId:n.executorId,ok:o.ok,branchCount:o.branches.length,defaultBranch:o.defaultBranch,message:o.message})),t.send({type:"executor.repo-branches.response",executorId:n.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.git.checkout.request"?(r(),Za({worktreePath:e.worktreePath,repoUrl:e.repoUrl,branchName:e.branchName,gitIdentity:e.gitIdentity}).then(o=>{t.send({type:"executor.git.checkout.response",executorId:n.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.git.diff.request"?(r(),Ja({worktreePath:e.worktreePath,repoUrl:e.repoUrl,baseBranch:e.baseBranch,gitIdentity:e.gitIdentity}).then(o=>{t.send({type:"executor.git.diff.response",executorId:n.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.git.working-tree-diff.request"?(r(),Va({worktreePath:e.worktreePath,repoUrl:e.repoUrl,gitIdentity:e.gitIdentity}).then(o=>{t.send({type:"executor.git.working-tree-diff.response",executorId:n.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.git.commit-diff.request"?(r(),Ka({worktreePath:e.worktreePath,repoUrl:e.repoUrl,commitSha:e.commitSha,gitIdentity:e.gitIdentity}).then(o=>{t.send({type:"executor.git.commit-diff.response",executorId:n.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.git.rebase.request"?(r(),Xa({worktreePath:e.worktreePath,repoUrl:e.repoUrl,baseBranch:e.baseBranch,gitIdentity:e.gitIdentity}).then(o=>{t.send({type:"executor.git.rebase.response",executorId:n.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.git.graph.request"?(r(),Qa({worktreePath:e.worktreePath,repoUrl:e.repoUrl,baseBranch:e.baseBranch,limit:e.limit,gitIdentity:e.gitIdentity}).then(o=>{t.send({type:"executor.git.graph.response",executorId:n.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.git.push.request"?(r(),Ya({worktreePath:e.worktreePath,repoUrl:e.repoUrl,branchName:e.branchName,gitIdentity:e.gitIdentity}).then(o=>{t.send({type:"executor.git.push.response",executorId:n.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.git.pull-request.request"?(r(),ec({worktreePath:e.worktreePath,repoUrl:e.repoUrl,title:e.title,body:e.body,baseBranch:e.baseBranch,compareBranch:e.compareBranch,gitIdentity:e.gitIdentity}).then(o=>{t.send({type:"executor.git.pull-request.response",executorId:n.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.worktree.ensure.request"?(r(),Ec({workspaceRoot:n.workspaceRoot,repoPath:e.repoPath,repoUrl:e.repoUrl,preferredBranch:e.preferredBranch,branchName:e.branchName,worktreePath:e.worktreePath,gitIdentity:e.gitIdentity,workingDirectoryMode:Jo(e),runtimeEnvironment:e.runtimeEnvironment}).then(o=>{t.send({type:"executor.worktree.ensure.response",executorId:n.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.worktree.cleanup.request"?(r(),Ic({workspaceRoot:n.workspaceRoot,repoPath:e.repoPath,repoUrl:e.repoUrl,worktreePath:e.worktreePath,workingDirectoryMode:Jo(e)}).then(o=>{t.send({type:"executor.worktree.cleanup.response",executorId:n.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):e.type==="executor.browser.run.request"?(r(),n.executorToken?.trim()?(Wn({cloudUrl:n.cloudUrl,executorToken:n.executorToken,taskId:e.taskId,workspaceId:e.workspaceId,workspaceSessionId:e.workspaceSessionId,cwd:e.cwd,appUrl:e.appUrl,healthUrl:e.healthUrl,goal:e.goal,mode:e.mode}).then(o=>{t.send({type:"executor.browser.run.response",executorId:n.executorId,requestId:e.requestId,result:o,at:new Date().toISOString()})}),!0):(t.send({type:"executor.browser.run.response",executorId:n.executorId,requestId:e.requestId,result:{ok:!1,message:"\u5F53\u524D worker \u672A\u5B8C\u6210\u914D\u5BF9\uFF0C\u7F3A\u5C11 executor token\u3002",summary:"\u5F53\u524D worker \u672A\u5B8C\u6210\u914D\u5BF9\uFF0C\u7F3A\u5C11 executor token\u3002",usedMode:e.mode??"playwright",finalUrl:e.appUrl,observationsCount:0,issueCount:1,at:new Date().toISOString()},at:new Date().toISOString()}),!0)):!1};var Mc=(e,t)=>{let n=t.getConfig();return e.type==="preview.tunnel.open"?(Ct.open(e,n,t.send),!0):e.type==="preview.tunnel.close"?(Ct.close(e.previewSessionId,"closed by control plane"),!0):!1};import{randomUUID as Vo}from"node:crypto";import{spawn as ph}from"node:child_process";import{existsSync as nn}from"node:fs";import dh from"node:path";var uh=()=>{let e=yn(),t=Bt();if(nn(t))return{launcherPath:nn(e)?e:void 0,runnerPath:process.execPath,entryPath:t};let n=Z("tsx"),r=dh.join(ne(),"apps","worker","src","index.ts");return n&&nn(r)?{launcherPath:nn(e)?e:void 0,runnerPath:n,entryPath:r}:{launcherPath:nn(e)?e:void 0,runnerPath:void 0,entryPath:void 0}},Tt=()=>{let e=uh();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 sr=e=>Z(e),rn=e=>{try{return JSON.parse(e)}catch{return null}},A=(e,t,n)=>{t?.({agentType:e,...n})},Le=()=>{let e=new Error("\u4EFB\u52A1\u5DF2\u53D6\u6D88");return e.name="AbortError",e},Me=e=>{let t=e?.trim();if(!(!t||t==="default"))return t};var mh=new Set(["Glob","Grep","LS","NotebookRead","Read","Task","TodoRead"]),gh=new Set(["Edit","MultiEdit","TodoWrite","Write"]),fh=e=>e.split("(")[0]?.trim()||e.trim(),hh=e=>e?.planMode?"plan":e?.permissionMode??"bypassPermissions",yh=e=>e==="bypassPermissions"&&typeof process.getuid=="function"&&process.getuid()===0?"acceptEdits":e,kh=(e,t)=>{let n=fh(t);return!!(e==="bypassPermissions"||mh.has(n)||e==="acceptEdits"&&gh.has(n))},on=(e,t)=>{e.write(`${JSON.stringify(t)}
81
+ `)},Oc=async e=>{let t=sr("claude");if(!t)throw new Error("\u672A\u68C0\u6D4B\u5230 `claude` \u53EF\u6267\u884C\u6587\u4EF6\u3002");let n=e.agentSettings&&"permissionMode"in e.agentSettings?e.agentSettings:void 0,r=ze(e.executionModel)?.providerId||"anthropic",o=ze(n?.defaultModel)?.providerId||"anthropic",i=Me(ct("ClaudeCode",r,e.executionModel))??Me(ct("ClaudeCode",o,n?.defaultModel)),s=hh(n),a=yh(s),c=["-p","--output-format=stream-json","--input-format=stream-json","--verbose","--include-partial-messages","--replay-user-messages","--permission-mode",a,...e.runtimeArgs??[]];i&&c.push("--model",i);let l=e.resumeSessionId?.trim();return l&&c.push("--resume",l),new Promise((u,d)=>{let m=ph(t,c,{cwd:e.cwd,env:{...Tt(),...e.runtimeEnv??{}},stdio:["pipe","pipe","pipe"]}),g="",k="",h="",S="",y="",b="",I=!1,_=new Map,H=new Map,O=()=>(S=S||`${h||"claude"}:assistant`,A("ClaudeCode",e.onEvent,{type:"message.updated",properties:{info:{id:S,role:"assistant"}}}),S),Y=(v,M,w,p)=>{A("ClaudeCode",e.onEvent,{type:"message.part.updated",properties:{part:{id:M,messageID:O(),type:v,text:w},delta:p}})},B=v=>{on(m.stdin,{type:"control_response",response:v})},j=v=>{if(v.type!=="control_request")return;if(v.request.subtype==="hook_callback"){B({subtype:"success",request_id:v.request_id,response:{}});return}let M=v.request.tool_name,w=kh(a,M);w||A("ClaudeCode",e.onEvent,{type:"permission.updated",properties:{title:M}}),B({subtype:"success",request_id:v.request_id,response:w?{behavior:"allow",updatedInput:v.request.input}:{behavior:"deny",message:`\u5F53\u524D\u4F1A\u8BDD\u672A\u542F\u7528 ${M} \u6743\u9650\u3002`,interrupt:!1}})},P=()=>{on(m.stdin,{type:"control_request",request_id:Vo(),request:{subtype:"interrupt"}}),setTimeout(()=>{m.killed||m.kill("SIGTERM")},250)};e.signal?.addEventListener("abort",P,{once:!0});let E=v=>{let M=v.trim();if(!M)return;let w=rn(M);if(w?.type==="control_request"||w?.type==="control_cancel_request"){j(w);return}let p=rn(M);if(p){if(p.session_id&&(h=p.session_id),p.type==="system"&&p.subtype==="init"){A("ClaudeCode",e.onEvent,{type:"session.status",properties:{status:{type:"busy",message:"Claude Code \u4F1A\u8BDD\u5DF2\u5C31\u7EEA"}}});return}if(p.type==="stream_event"){let f=p.event,x=`${h||"claude"}:${f.index??0}`;if(f.type==="content_block_delta"&&f.delta?.type==="thinking_delta"){let U=`${H.get(x)??""}${f.delta.thinking??""}`;H.set(x,U),Y("reasoning",`${x}:thinking`,U,f.delta.thinking??"");return}if(f.type==="content_block_delta"&&f.delta?.type==="text_delta"){let U=`${_.get(x)??""}${f.delta.text??""}`;_.set(x,U),y=U.trim()||y,Y("text",`${x}:text`,U,f.delta.text??"");return}f.type==="content_block_start"&&f.content_block?.type==="tool_use"&&A("ClaudeCode",e.onEvent,{type:"message.part.updated",properties:{part:{id:f.content_block.id??`${x}:tool`,messageID:O(),type:"tool",tool:f.content_block.name??"tool",state:{status:"running"}}}});return}if(p.type==="assistant"){h=p.session_id??h,S=p.message?.id??O();let f=Array.isArray(p.message?.content)?p.message.content:[];for(let x of f)x.type==="text"&&x.text?.trim()&&(y=x.text.trim(),Y("text",`${S}:final`,y)),x.type==="tool_use"&&A("ClaudeCode",e.onEvent,{type:"message.part.updated",properties:{part:{id:x.id??`${S}:tool`,messageID:O(),type:"tool",tool:x.name??"tool",state:{status:"running",raw:x.input?JSON.stringify(x.input,null,2):void 0}}}});return}if(p.type==="user"){let f=Array.isArray(p.message?.content)?p.message.content:[],x=f.find(U=>U.tool_use_id)?.tool_use_id;if(!x)return;A("ClaudeCode",e.onEvent,{type:"message.part.updated",properties:{part:{id:x,messageID:O(),type:"tool",tool:"tool",state:{status:"completed",output:f.find(U=>U.tool_use_id===x)?.content}}}});return}if(p.type==="result"){if(I=!p.is_error,p.result?.trim()&&(y=p.result.trim()),p.is_error){b=p.result?.trim()||"Claude Code \u6267\u884C\u5931\u8D25",A("ClaudeCode",e.onEvent,{type:"session.error",properties:{error:b}});return}A("ClaudeCode",e.onEvent,{type:"session.status",properties:{status:{type:"idle",message:"Claude Code \u5DF2\u5B8C\u6210"}}}),m.killed||m.kill("SIGTERM")}}};m.stdout.on("data",v=>{g+=v.toString();let M=g.split(`
82
+ `);g=M.pop()??"";for(let w of M)E(w)}),m.stderr.on("data",v=>{k+=v.toString()}),m.on("error",v=>{e.signal?.removeEventListener("abort",P),d(v)}),m.on("close",v=>{if(e.signal?.removeEventListener("abort",P),g.trim()&&E(g),e.signal?.aborted){d(Le());return}if(!I&&v!==0||b){d(new Error(b||k.trim().split(`
83
+ `).filter(Boolean).at(-1)||`Claude Code \u6267\u884C\u5931\u8D25\uFF08\u9000\u51FA\u7801 ${v??-1}\uFF09`));return}u({output:y||k.trim().split(`
84
+ `).filter(Boolean).at(-1)||"Claude Code \u672A\u8FD4\u56DE\u6587\u672C\u8F93\u51FA\u3002",sessionId:h||void 0})}),on(m.stdin,{type:"control_request",request_id:Vo(),request:{subtype:"initialize"}}),on(m.stdin,{type:"control_request",request_id:Vo(),request:{subtype:"set_permission_mode",mode:a}}),on(m.stdin,{type:"user",message:{role:"user",content:e.prompt}})})};import{spawn as wh}from"node:child_process";var _c=(e,t,n)=>{let r={};return n?.reasoningEffort&&(r.model_reasoning_effort=n.reasoningEffort),n?.reasoningSummary&&(r.model_reasoning_summary=n.reasoningSummary),{model:t??null,cwd:e,approvalPolicy:n?.approval??"never",sandbox:n?.sandbox??"workspace-write",config:Object.keys(r).length>0?r:null,experimentalRawEvents:!1,persistExtendedHistory:!0}},Sh=(e,t,n,r)=>{let o={};return r?.reasoningEffort&&(o.model_reasoning_effort=r.reasoningEffort),r?.reasoningSummary&&(o.model_reasoning_summary=r.reasoningSummary),{threadId:t,cwd:e,model:n??null,approvalPolicy:r?.approval??"never",sandbox:r?.sandbox??"workspace-write",config:Object.keys(o).length>0?o:null,persistExtendedHistory:!0}},xh=e=>({mode:"default",settings:{model:e,reasoning_effort:null,developer_instructions:null}}),Ch=e=>e==="never"?{command:"acceptForSession",fileChange:"acceptForSession"}:{command:"decline",fileChange:"decline"},Ph=e=>{let t=e instanceof Error?e.message.trim().toLowerCase():"";return t?t.includes("no rollout found for thread id")||t.includes("no thread found for id")||t.includes("thread/resume")&&t.includes("not found"):!1},vh=new Set(["codex \u6267\u884C\u5931\u8D25","codex execution failed","execution failed","request failed","unknown error"]),$c=e=>e.split(`
91
85
  `).map(t=>t.trimEnd()).join(`
92
- `).trim(),sd=e=>{let t=od(e);return t?!vS.has(t.toLowerCase()):!1},ze=(e,t=new Set)=>{if(typeof e=="string"){let r=od(e);if(!r)return[];try{let n=ze(JSON.parse(r),t);return n.length>0?n:[r]}catch{return[r]}}return!e||typeof e!="object"?[]:t.has(e)?[]:(t.add(e),Array.isArray(e)?e.flatMap(r=>ze(r,t)):Object.values(e).flatMap(r=>ze(r,t)))},gi=e=>{let t=e.find(sd);return t||e.find(Boolean)||""},mi=e=>gi(ze(e)),PS=e=>{let t=[...e.error?.details?ze(e.error.details):[],...e.error?.message?ze(e.error.message):[],...ze(e.error)];return gi(t)||(e.status==="failed"?"Codex \u6267\u884C\u5931\u8D25":"")},ES=(e,t,r)=>{let o=[...[...t.trim().split(`
93
- `).map(i=>i.trim()).filter(Boolean)].reverse().flatMap(i=>ze(i)),...ze(t)],s=gi(o);return s&&!sd(e)?s:e||s||`Codex \u6267\u884C\u5931\u8D25\uFF08\u9000\u51FA\u7801 ${r??-1}\uFF09`},td=(e,t,r,n)=>{M("Codex",e.onEvent,{type:"message.updated",properties:{info:{id:t,role:"assistant"}}}),M("Codex",e.onEvent,{type:"message.part.updated",properties:{part:{id:`${t}:text`,messageID:t,type:"text",text:r},delta:n}})},rd=(e,t,r,n,o)=>{M("Codex",e.onEvent,{type:"message.part.updated",properties:{part:{id:r,messageID:t,type:"reasoning",text:n},delta:o}})},nd=(e,t,r,n,o,s)=>{let i=r.type==="fileChange"?"apply_patch":"shell",a=r.type==="commandExecution"?r.command:r.type==="fileChange"?JSON.stringify(r.changes??[],null,2):void 0;M("Codex",e.onEvent,{type:"message.part.updated",properties:{part:{id:r.id,messageID:t,type:"tool",tool:i,state:{status:n,raw:a,output:o,error:s}}}})},fi=(e,t)=>{e.stdin.write(`${JSON.stringify(t)}
94
- `)},id=async e=>{let t=no("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=at(e.executionModel)?.providerId||"openai",o=at(r?.defaultModel)?.providerId||"openai",s=qe(Rt("Codex",n,e.executionModel))??qe(Rt("Codex",o,r?.defaultModel)),i=xS(r?.approval);return new Promise((a,c)=>{let l=kS(t,["app-server",...e.runtimeArgs??[]],{cwd:e.cwd,env:{...or(),...e.runtimeEnv??{}},stdio:["pipe","pipe","pipe"]}),d=1,u="",p="",m="",y="",g="",w=!1,k="",E=new Map,b=new Map,T=new Map,N=S=>{for(let f of E.values())f.reject(S);E.clear()},_=(S,f)=>{let h=d++;return fi(l,{jsonrpc:"2.0",id:h,method:S,params:f}),new Promise((x,F)=>{E.set(h,{resolve:vt=>x(vt),reject:F})})},J=(S,f)=>{fi(l,{jsonrpc:"2.0",id:S,result:f})},B=()=>{l.killed||l.kill("SIGTERM")},$=()=>{B()};e.signal?.addEventListener("abort",$,{once:!0});let v=S=>{if(S.method==="item/commandExecution/requestApproval"){let f=S.params??{};i.command==="decline"&&M("Codex",e.onEvent,{type:"permission.updated",properties:{title:f.reason?.trim()||f.command?.trim()||"\u547D\u4EE4\u6267\u884C\u6743\u9650"}}),J(S.id,{decision:i.command});return}if(S.method==="item/fileChange/requestApproval"){let f=S.params??{};i.fileChange==="decline"&&M("Codex",e.onEvent,{type:"permission.updated",properties:{title:f.reason?.trim()||"\u6587\u4EF6\u4FEE\u6539\u6743\u9650"}}),J(S.id,{decision:i.fileChange});return}if(S.method==="item/tool/requestUserInput"){let f=S.params??{};M("Codex",e.onEvent,{type:"permission.updated",properties:{title:f.questions?.[0]?.header?.trim()||f.questions?.[0]?.question?.trim()||"\u7B49\u5F85\u7528\u6237\u8F93\u5165"}}),J(S.id,{answers:{}});return}J(S.id,null)},I=(S,f)=>{if(S.type==="agentMessage"){let h=S;k=h.id,b.set(h.id,h.text),h.text.trim()&&(y=h.text.trim()),td(e,h.id,h.text);return}if(S.type==="reasoning"){let h=S,x=h.summary?.join("")||h.content?.join("")||"";x&&(T.set(h.id,x),rd(e,k||`${m||"codex"}:assistant`,`${h.id}:reasoning`,x));return}if(S.type==="commandExecution"){let h=S,x=f==="started"?"running":h.status==="completed"?"completed":"error";nd(e,k||void 0,h,x,h.aggregatedOutput??void 0,h.status==="failed"||h.status==="declined"?h.aggregatedOutput||`\u547D\u4EE4\u5931\u8D25\uFF08\u9000\u51FA\u7801 ${h.exitCode??-1}\uFF09`:void 0);return}if(S.type==="fileChange"){let h=S,x=f==="started"?"running":h.status==="success"?"completed":"error";nd(e,k||void 0,h,x,JSON.stringify(h.changes??[],null,2),h.status==="failed"||h.status==="declined"?"\u6587\u4EF6\u4FEE\u6539\u672A\u5B8C\u6210":void 0)}},P=async S=>{if(S.method==="thread/started"){m=S.params.thread.id;return}if(S.method==="turn/started"){let f=S.params;m=m||f.threadId,M("Codex",e.onEvent,{type:"session.status",properties:{status:{type:"busy",message:"Codex \u6B63\u5728\u5904\u7406\u8BF7\u6C42"}}});return}if(S.method==="item/started"){I(S.params.item,"started");return}if(S.method==="item/completed"){I(S.params.item,"completed");return}if(S.method==="item/agentMessage/delta"){let f=S.params;k=f.itemId;let h=`${b.get(f.itemId)??""}${f.delta??""}`;b.set(f.itemId,h),h.trim()&&(y=h.trim()),td(e,f.itemId,h,f.delta);return}if(S.method==="item/reasoning/textDelta"||S.method==="item/reasoning/summaryTextDelta"){let f=S.params,h=S.method==="item/reasoning/textDelta"?`content:${f.contentIndex??0}`:`summary:${f.summaryIndex??0}`,x=`${f.itemId}:reasoning:${h}`,F=`${T.get(x)??""}${f.delta??""}`;T.set(x,F),rd(e,k||`${m||"codex"}:assistant`,x,F,f.delta);return}if(S.method==="turn/completed"){let f=S.params;m=m||f.threadId,w=f.turn.status==="completed",f.turn.status==="failed"?(g=PS(f.turn)||"Codex \u6267\u884C\u5931\u8D25",M("Codex",e.onEvent,{type:"session.error",properties:{error:g}})):M("Codex",e.onEvent,{type:"session.status",properties:{status:{type:"idle",message:"Codex \u5DF2\u5B8C\u6210"}}}),B();return}S.method==="error"&&(g=mi(S.params)||"Codex \u6267\u884C\u5931\u8D25",M("Codex",e.onEvent,{type:"session.error",properties:{error:g}}),B())},O=S=>{let f=S.trim();if(!f)return;let h=$r(f);if(h){if(typeof h.id<"u"&&(typeof h.result<"u"||typeof h.error<"u")){let x=E.get(h.id);if(!x)return;if(E.delete(h.id),h.error){x.reject(new Error(mi(h.error)||"Codex app-server \u8BF7\u6C42\u5931\u8D25"));return}x.resolve(h.result);return}if(typeof h.id<"u"&&typeof h.method=="string"){v(h);return}typeof h.method=="string"&&P(h)}};l.stdout.on("data",S=>{u+=S.toString();let f=u.split(`
95
- `);u=f.pop()??"";for(let h of f)O(h)}),l.stderr.on("data",S=>{p+=S.toString()}),l.on("error",S=>{e.signal?.removeEventListener("abort",$),N(S),c(S)}),l.on("close",S=>{if(e.signal?.removeEventListener("abort",$),u.trim()&&O(u),e.signal?.aborted){N(rt()),c(rt());return}if(!w||g){let f=new Error(ES(g,p,S));N(f),c(f);return}N(new Error("Codex \u4F1A\u8BDD\u5DF2\u7ED3\u675F")),a({output:y||"Codex \u672A\u8FD4\u56DE\u6587\u672C\u8F93\u51FA\u3002",sessionId:m||void 0})}),(async()=>{try{await _("initialize",{clientInfo:{name:"vibemux-worker",version:"0.1.1"},capabilities:{experimentalApi:!0}}),fi(l,{jsonrpc:"2.0",method:"initialized"});let S=await _("account/read",{refreshToken:!1});if(S.requiresOpenaiAuth&&!S.account)throw new Error("Codex \u9700\u8981\u5148\u767B\u5F55\u540E\u624D\u80FD\u6267\u884C\u3002");let f=e.resumeSessionId?.trim(),h;if(f)try{h=await _("thread/resume",wS(e.cwd,f,s,r))}catch(x){if(!CS(x))throw x;h=await _("thread/start",ed(e.cwd,s,r))}else h=await _("thread/start",ed(e.cwd,s,r));m=h.thread.id,await _("turn/start",{threadId:m,input:[{type:"text",text:e.prompt,text_elements:[]}],collaborationMode:SS(h.model)})}catch(S){g=mi(S)||"Codex \u521D\u59CB\u5316\u5931\u8D25",M("Codex",e.onEvent,{type:"session.error",properties:{error:g}}),B()}})()})};import{readFile as Px}from"node:fs/promises";import{createAgentSession as Ex,DefaultResourceLoader as bx}from"@mariozechner/pi-coding-agent";import{Client as bS}from"@modelcontextprotocol/sdk/client/index.js";import{SSEClientTransport as IS}from"@modelcontextprotocol/sdk/client/sse.js";import{StdioClientTransport as TS}from"@modelcontextprotocol/sdk/client/stdio.js";import{StreamableHTTPClientTransport as RS}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{defineTool as _S}from"@mariozechner/pi-coding-agent";var AS="__",ad=e=>e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/^_+|_+$/g,""),MS=(e,t,r)=>{let n=[ad(e),ad(t)].filter(Boolean).join(AS)||"mcp_tool",o=n,s=2;for(;r.has(o);)o=`${n}_${s}`,s+=1;return r.add(o),o},OS=e=>{if(!e||typeof e!="object")return"";let t=e;if(t.type==="text"&&typeof t.text=="string")return t.text.trim();if(t.type==="resource"&&t.resource&&typeof t.resource=="object"){let r=t.resource;if(typeof r.text=="string")return r.text.trim()}return t.type==="resource_link"&&typeof t.uri=="string"?[t.name,t.uri].filter(r=>typeof r=="string"&&r.trim().length>0).join(" - "):t.type==="image"?"[image]":t.type==="audio"?"[audio]":""},BS=e=>{if("toolResult"in e)return typeof e.toolResult=="string"?e.toolResult.trim()||"\u5DE5\u5177\u5DF2\u6267\u884C\u5B8C\u6210\uFF0C\u4F46\u6CA1\u6709\u8FD4\u56DE\u53EF\u5C55\u793A\u7684\u6587\u672C\u7ED3\u679C\u3002":e.toolResult===void 0?"\u5DE5\u5177\u5DF2\u6267\u884C\u5B8C\u6210\uFF0C\u4F46\u6CA1\u6709\u8FD4\u56DE\u53EF\u5C55\u793A\u7684\u6587\u672C\u7ED3\u679C\u3002":JSON.stringify(e.toolResult,null,2);let t=Array.isArray(e.content)?e.content.map(OS).filter(Boolean).join(`
86
+ `).trim(),Nc=e=>{let t=$c(e);return t?!vh.has(t.toLowerCase()):!1},Oe=(e,t=new Set)=>{if(typeof e=="string"){let n=$c(e);if(!n)return[];try{let r=Oe(JSON.parse(n),t);return r.length>0?r:[n]}catch{return[n]}}return!e||typeof e!="object"?[]:t.has(e)?[]:(t.add(e),Array.isArray(e)?e.flatMap(n=>Oe(n,t)):Object.values(e).flatMap(n=>Oe(n,t)))},Qo=e=>{let t=e.find(Nc);return t||e.find(Boolean)||""},Ko=e=>Qo(Oe(e)),Eh=e=>{let t=[...e.error?.details?Oe(e.error.details):[],...e.error?.message?Oe(e.error.message):[],...Oe(e.error)];return Qo(t)||(e.status==="failed"?"Codex \u6267\u884C\u5931\u8D25":"")},Ih=(e,t,n)=>{let o=[...[...t.trim().split(`
87
+ `).map(s=>s.trim()).filter(Boolean)].reverse().flatMap(s=>Oe(s)),...Oe(t)],i=Qo(o);return i&&!Nc(e)?i:e||i||`Codex \u6267\u884C\u5931\u8D25\uFF08\u9000\u51FA\u7801 ${n??-1}\uFF09`},Wc=(e,t,n,r)=>{A("Codex",e.onEvent,{type:"message.updated",properties:{info:{id:t,role:"assistant"}}}),A("Codex",e.onEvent,{type:"message.part.updated",properties:{part:{id:`${t}:text`,messageID:t,type:"text",text:n},delta:r}})},Bc=(e,t,n,r,o)=>{A("Codex",e.onEvent,{type:"message.part.updated",properties:{part:{id:n,messageID:t,type:"reasoning",text:r},delta:o}})},Dc=(e,t,n,r,o,i)=>{let s=n.type==="fileChange"?"apply_patch":"shell",a=n.type==="commandExecution"?n.command:n.type==="fileChange"?JSON.stringify(n.changes??[],null,2):void 0;A("Codex",e.onEvent,{type:"message.part.updated",properties:{part:{id:n.id,messageID:t,type:"tool",tool:s,state:{status:r,raw:a,output:o,error:i}}}})},Xo=(e,t)=>{e.stdin.write(`${JSON.stringify(t)}
88
+ `)},Uc=async e=>{let t=sr("codex");if(!t)throw new Error("\u672A\u68C0\u6D4B\u5230 `codex` \u53EF\u6267\u884C\u6587\u4EF6\u3002");let n=e.agentSettings&&"sandbox"in e.agentSettings?e.agentSettings:void 0,r=ze(e.executionModel)?.providerId||"openai",o=ze(n?.defaultModel)?.providerId||"openai",i=Me(ct("Codex",r,e.executionModel))??Me(ct("Codex",o,n?.defaultModel)),s=Ch(n?.approval);return new Promise((a,c)=>{let l=wh(t,["app-server",...e.runtimeArgs??[]],{cwd:e.cwd,env:{...Tt(),...e.runtimeEnv??{}},stdio:["pipe","pipe","pipe"]}),u=1,d="",m="",g="",k="",h="",S=!1,y="",b=new Map,I=new Map,_=new Map,H=w=>{for(let p of b.values())p.reject(w);b.clear()},O=(w,p)=>{let f=u++;return Xo(l,{jsonrpc:"2.0",id:f,method:w,params:p}),new Promise((x,U)=>{b.set(f,{resolve:nt=>x(nt),reject:U})})},Y=(w,p)=>{Xo(l,{jsonrpc:"2.0",id:w,result:p})},B=()=>{l.killed||l.kill("SIGTERM")},j=()=>{B()};e.signal?.addEventListener("abort",j,{once:!0});let P=w=>{if(w.method==="item/commandExecution/requestApproval"){let p=w.params??{};s.command==="decline"&&A("Codex",e.onEvent,{type:"permission.updated",properties:{title:p.reason?.trim()||p.command?.trim()||"\u547D\u4EE4\u6267\u884C\u6743\u9650"}}),Y(w.id,{decision:s.command});return}if(w.method==="item/fileChange/requestApproval"){let p=w.params??{};s.fileChange==="decline"&&A("Codex",e.onEvent,{type:"permission.updated",properties:{title:p.reason?.trim()||"\u6587\u4EF6\u4FEE\u6539\u6743\u9650"}}),Y(w.id,{decision:s.fileChange});return}if(w.method==="item/tool/requestUserInput"){let p=w.params??{};A("Codex",e.onEvent,{type:"permission.updated",properties:{title:p.questions?.[0]?.header?.trim()||p.questions?.[0]?.question?.trim()||"\u7B49\u5F85\u7528\u6237\u8F93\u5165"}}),Y(w.id,{answers:{}});return}Y(w.id,null)},E=(w,p)=>{if(w.type==="agentMessage"){let f=w;y=f.id,I.set(f.id,f.text),f.text.trim()&&(k=f.text.trim()),Wc(e,f.id,f.text);return}if(w.type==="reasoning"){let f=w,x=f.summary?.join("")||f.content?.join("")||"";x&&(_.set(f.id,x),Bc(e,y||`${g||"codex"}:assistant`,`${f.id}:reasoning`,x));return}if(w.type==="commandExecution"){let f=w,x=p==="started"?"running":f.status==="completed"?"completed":"error";Dc(e,y||void 0,f,x,f.aggregatedOutput??void 0,f.status==="failed"||f.status==="declined"?f.aggregatedOutput||`\u547D\u4EE4\u5931\u8D25\uFF08\u9000\u51FA\u7801 ${f.exitCode??-1}\uFF09`:void 0);return}if(w.type==="fileChange"){let f=w,x=p==="started"?"running":f.status==="success"?"completed":"error";Dc(e,y||void 0,f,x,JSON.stringify(f.changes??[],null,2),f.status==="failed"||f.status==="declined"?"\u6587\u4EF6\u4FEE\u6539\u672A\u5B8C\u6210":void 0)}},v=async w=>{if(w.method==="thread/started"){g=w.params.thread.id;return}if(w.method==="turn/started"){let p=w.params;g=g||p.threadId,A("Codex",e.onEvent,{type:"session.status",properties:{status:{type:"busy",message:"Codex \u6B63\u5728\u5904\u7406\u8BF7\u6C42"}}});return}if(w.method==="item/started"){E(w.params.item,"started");return}if(w.method==="item/completed"){E(w.params.item,"completed");return}if(w.method==="item/agentMessage/delta"){let p=w.params;y=p.itemId;let f=`${I.get(p.itemId)??""}${p.delta??""}`;I.set(p.itemId,f),f.trim()&&(k=f.trim()),Wc(e,p.itemId,f,p.delta);return}if(w.method==="item/reasoning/textDelta"||w.method==="item/reasoning/summaryTextDelta"){let p=w.params,f=w.method==="item/reasoning/textDelta"?`content:${p.contentIndex??0}`:`summary:${p.summaryIndex??0}`,x=`${p.itemId}:reasoning:${f}`,U=`${_.get(x)??""}${p.delta??""}`;_.set(x,U),Bc(e,y||`${g||"codex"}:assistant`,x,U,p.delta);return}if(w.method==="turn/completed"){let p=w.params;g=g||p.threadId,S=p.turn.status==="completed",p.turn.status==="failed"?(h=Eh(p.turn)||"Codex \u6267\u884C\u5931\u8D25",A("Codex",e.onEvent,{type:"session.error",properties:{error:h}})):A("Codex",e.onEvent,{type:"session.status",properties:{status:{type:"idle",message:"Codex \u5DF2\u5B8C\u6210"}}}),B();return}w.method==="error"&&(h=Ko(w.params)||"Codex \u6267\u884C\u5931\u8D25",A("Codex",e.onEvent,{type:"session.error",properties:{error:h}}),B())},M=w=>{let p=w.trim();if(!p)return;let f=rn(p);if(f){if(typeof f.id<"u"&&(typeof f.result<"u"||typeof f.error<"u")){let x=b.get(f.id);if(!x)return;if(b.delete(f.id),f.error){x.reject(new Error(Ko(f.error)||"Codex app-server \u8BF7\u6C42\u5931\u8D25"));return}x.resolve(f.result);return}if(typeof f.id<"u"&&typeof f.method=="string"){P(f);return}typeof f.method=="string"&&v(f)}};l.stdout.on("data",w=>{d+=w.toString();let p=d.split(`
89
+ `);d=p.pop()??"";for(let f of p)M(f)}),l.stderr.on("data",w=>{m+=w.toString()}),l.on("error",w=>{e.signal?.removeEventListener("abort",j),H(w),c(w)}),l.on("close",w=>{if(e.signal?.removeEventListener("abort",j),d.trim()&&M(d),e.signal?.aborted){H(Le()),c(Le());return}if(!S||h){let p=new Error(Ih(h,m,w));H(p),c(p);return}H(new Error("Codex \u4F1A\u8BDD\u5DF2\u7ED3\u675F")),a({output:k||"Codex \u672A\u8FD4\u56DE\u6587\u672C\u8F93\u51FA\u3002",sessionId:g||void 0})}),(async()=>{try{await O("initialize",{clientInfo:{name:"vibemux-worker",version:"0.1.1"},capabilities:{experimentalApi:!0}}),Xo(l,{jsonrpc:"2.0",method:"initialized"});let w=await O("account/read",{refreshToken:!1});if(w.requiresOpenaiAuth&&!w.account)throw new Error("Codex \u9700\u8981\u5148\u767B\u5F55\u540E\u624D\u80FD\u6267\u884C\u3002");let p=e.resumeSessionId?.trim(),f;if(p)try{f=await O("thread/resume",Sh(e.cwd,p,i,n))}catch(x){if(!Ph(x))throw x;f=await O("thread/start",_c(e.cwd,i,n))}else f=await O("thread/start",_c(e.cwd,i,n));g=f.thread.id,await O("turn/start",{threadId:g,input:[{type:"text",text:e.prompt,text_elements:[]}],collaborationMode:xh(f.model)})}catch(w){h=Ko(w)||"Codex \u521D\u59CB\u5316\u5931\u8D25",A("Codex",e.onEvent,{type:"session.error",properties:{error:h}}),B()}})()})};import{readFile as Ey}from"node:fs/promises";import{createAgentSession as Iy,DefaultResourceLoader as by}from"@mariozechner/pi-coding-agent";import{Client as bh}from"@modelcontextprotocol/sdk/client/index.js";import{SSEClientTransport as Rh}from"@modelcontextprotocol/sdk/client/sse.js";import{StdioClientTransport as Th}from"@modelcontextprotocol/sdk/client/stdio.js";import{StreamableHTTPClientTransport as Ah}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{defineTool as Mh}from"@mariozechner/pi-coding-agent";var Oh="__",Lc=e=>e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/^_+|_+$/g,""),_h=(e,t,n)=>{let r=[Lc(e),Lc(t)].filter(Boolean).join(Oh)||"mcp_tool",o=r,i=2;for(;n.has(o);)o=`${r}_${i}`,i+=1;return n.add(o),o},Wh=e=>{if(!e||typeof e!="object")return"";let t=e;if(t.type==="text"&&typeof t.text=="string")return t.text.trim();if(t.type==="resource"&&t.resource&&typeof t.resource=="object"){let n=t.resource;if(typeof n.text=="string")return n.text.trim()}return t.type==="resource_link"&&typeof t.uri=="string"?[t.name,t.uri].filter(n=>typeof n=="string"&&n.trim().length>0).join(" - "):t.type==="image"?"[image]":t.type==="audio"?"[audio]":""},Bh=e=>{if("toolResult"in e)return typeof e.toolResult=="string"?e.toolResult.trim()||"\u5DE5\u5177\u5DF2\u6267\u884C\u5B8C\u6210\uFF0C\u4F46\u6CA1\u6709\u8FD4\u56DE\u53EF\u5C55\u793A\u7684\u6587\u672C\u7ED3\u679C\u3002":e.toolResult===void 0?"\u5DE5\u5177\u5DF2\u6267\u884C\u5B8C\u6210\uFF0C\u4F46\u6CA1\u6709\u8FD4\u56DE\u53EF\u5C55\u793A\u7684\u6587\u672C\u7ED3\u679C\u3002":JSON.stringify(e.toolResult,null,2);let t=Array.isArray(e.content)?e.content.map(Wh).filter(Boolean).join(`
96
90
 
97
- `).trim():"";return t||("structuredContent"in e&&e.structuredContent!==void 0?JSON.stringify(e.structuredContent,null,2):"\u5DE5\u5177\u5DF2\u6267\u884C\u5B8C\u6210\uFF0C\u4F46\u6CA1\u6709\u8FD4\u56DE\u53EF\u5C55\u793A\u7684\u6587\u672C\u7ED3\u679C\u3002")},WS=e=>{if(typeof e.command=="string"&&e.command.trim())return new TS({command:"sh",args:["-lc",e.command.trim()],env:or()});if(!e.url?.trim())return null;let t=e.headers??{},r=new URL(e.url);return e.type==="remote"&&/\/sse(?:$|[/?#])/i.test(r.pathname)?new IS(r,{requestInit:Object.keys(t).length>0?{headers:t}:void 0}):new RS(r,{requestInit:Object.keys(t).length>0?{headers:t}:void 0})},NS=e=>{let t=`${e.serverName} \xB7 ${e.toolName}`;return _S({name:e.exposedToolName,label:t,description:e.description?.trim()||`${e.serverName} MCP tool: ${e.toolName}`,parameters:e.inputSchema??{type:"object",properties:{},additionalProperties:!0},execute:async(r,n)=>{let o=await e.client.callTool({name:e.toolName,arguments:n}),s=BS(o);if(o.isError)throw new Error(s);return{content:[{type:"text",text:s}],details:{serverName:e.serverName,toolName:e.toolName,structuredContent:"structuredContent"in o?o.structuredContent:void 0}}}})},DS=async e=>{let t=WS(e.materializedServer);if(!t)return{client:null,tools:[],warning:`${e.serverPolicy.name} \u7F3A\u5C11\u53EF\u8FDE\u63A5\u7684 MCP transport\uFF0C\u5DF2\u8DF3\u8FC7\u3002`};let r=new bS({name:"vibemux-pi-mcp",version:"0.1.8"});await r.connect(t);let o=(await r.listTools()).tools.map(s=>NS({client:r,serverName:e.serverPolicy.name,toolName:s.name,description:s.description,inputSchema:s.inputSchema,exposedToolName:MS(e.serverPolicy.name,s.name,e.exposedToolNames)}));return{client:r,tools:o,warning:void 0}},cd=async e=>{let t=e.workerConfig??C(),r=new Set,n=[],o=[],s=[],i=e.mcpServers?.filter(c=>c.enabled&&c.capabilityMode==="resources+tools")??[],a=lt(i,{cloudUrl:t.cloudUrl,executorToken:t.executorToken,actingUserId:e.actingUserId});for(let c of i){let l=a[c.id];if(!l){n.push(`${c.name} \u65E0\u6CD5\u7269\u5316\u4E3A Pi MCP bridge\uFF0C\u5DF2\u8DF3\u8FC7\u3002`);continue}try{let d=await DS({exposedToolNames:r,materializedServer:l,serverPolicy:c});d.warning&&n.push(d.warning),d.client&&o.push(d.client),s.push(...d.tools)}catch(d){n.push(`${c.name} MCP bridge \u8FDE\u63A5\u5931\u8D25\uFF1A${d instanceof Error?d.message:"unknown error"}`)}}return{tools:s,cleanup:async()=>{await Promise.allSettled(o.map(c=>c.close()))},warnings:n}};import{mkdtemp as US,mkdir as $S,rm as ld,writeFile as LS}from"node:fs/promises";import jS from"node:os";import jr from"node:path";var FS={"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"},GS=(e,t)=>{let r=jr.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}`},qS=(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()},zS=(e,t)=>{let r=jr.extname(e);return r||t&&FS[t]||""},oo=async e=>{let t=e.attachments??[];if(t.length===0)return{attachments:[],cleanup:async()=>{}};let r=jr.join(jS.tmpdir(),"vibemux-task-chat-attachments-");await $S(jr.dirname(r),{recursive:!0});let n=await US(r);try{return{attachments:await Promise.all(t.map(async(s,i)=>{let a=qS(e.cloudUrl,s.url),c=await fetch(a,{signal:e.signal});if(!c.ok)throw new Error(`\u56FE\u7247\u9644\u4EF6\u4E0B\u8F7D\u5931\u8D25\uFF1A${s.filename}`);let l=c.headers.get("content-type")?.split(";")[0]?.trim()||s.contentType,d=zS(s.filename,l),u=GS(`${i+1}-${s.filename||`image-${i+1}`}${d&&!s.filename.endsWith(d)?d:""}`,`image-${i+1}`),p=jr.join(n,u),m=Buffer.from(await c.arrayBuffer());return await LS(p,m),{...s,contentType:l,absoluteUrl:a,localPath:p}})),cleanup:async()=>{await ld(n,{recursive:!0,force:!0})}}}catch(o){throw await ld(n,{recursive:!0,force:!0}).catch(()=>{}),o}},ud=(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(`
98
- `)};import{createHash as HS,randomUUID as VS}from"node:crypto";import{existsSync as dd,mkdirSync as yi,readFileSync as JS,rmSync as KS,writeFileSync as XS}from"node:fs";import pd from"node:os";import xt from"node:path";import{AuthStorage as YS,ModelRegistry as md,SessionManager as Fr,SettingsManager as QS}from"@mariozechner/pi-coding-agent";var ZS=["text"],ex={input:0,output:0,cacheRead:0,cacheWrite:0},tx=new Map([["claude","anthropic"],["dashscope","qwen"],["gemini","google"],["glm","zhipu"],["grok","xai"],["kimi","moonshot"],["volcengine","doubao"]]),rx=e=>{let t=e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return tx.get(t)||t},nx=e=>e.trim().toUpperCase().replace(/[^A-Z0-9]+/g,"_").replace(/^_+|_+$/g,"")||"MODEL",ox=e=>{let t=e.trim().toLowerCase();return t==="openai"?"OPENAI":t==="anthropic"||t==="claude"?"ANTHROPIC":t==="google"||t==="gemini"?"GOOGLE":t==="minimax"?"MINIMAX":t==="minimax-cn"?"MINIMAX_CN":nx(e)},sx=e=>{let t=e?.trim()||"";if(!t)return null;let r=t.indexOf("/");if(r<0)return null;let n=rx(t.slice(0,r)),o=t.slice(r+1).trim();return!n||!o?null:{providerId:n,modelId:o}},ix=(e,t)=>{let r=t?.VIBEMUX_PI_AGENT_DIR?.trim();if(r)return r;let n=e?.agentDir?.trim()||C().piAgentDir?.trim();return n||xt.join(pd.homedir(),".pi","agent")},ax=(e,t)=>{let r=HS("sha1").update(`${t}::${e}`).digest("hex").slice(0,16);return xt.join(t,"sessions-vibemux",r)},cx=(e,t)=>{let r=ox(e.providerId);return{apiKey:t?.[`${r}_API_KEY`]?.trim()||"",baseUrl:t?.[`${r}_BASE_URL`]?.trim()||""}},lx=(e,t)=>{let r=`${e.providerId} ${e.modelId} ${t||""}`.toLowerCase();return r.includes("anthropic")||r.includes("claude")?"anthropic-messages":r.includes("google")||r.includes("gemini")?"google-generative-ai":"openai-completions"},ux=e=>{let t=`${e.providerId}/${e.modelId}`.toLowerCase();return t.includes("gpt-5")||t.includes("claude")||t.includes("gemini")||t.includes("deepseek")||t.includes("qwen")||t.includes("kimi")},dx=e=>{let t=`${e.providerId}/${e.modelId}`.toLowerCase();return t.includes("vision")||t.includes("omni")||t.includes("gemini")||t.includes("claude")||t.includes("gpt-4")||t.includes("gpt-5")?["text","image"]:[...ZS]},px=e=>{if(!dd(e))return{};try{let t=JSON.parse(JS(e,"utf8"));return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}catch{return{}}},mx=e=>{let t=xt.join(e.agentDir,"models.json"),r=px(t),n=r.providers&&typeof r.providers=="object"?r.providers:{},o=e.baseRegistry.find(e.model.providerId,e.model.modelId),s={...e.apiKey?{apiKey:e.apiKey}:{},...e.baseUrl?{baseUrl:e.baseUrl}:{},api:o?.api??lx(e.model,e.baseUrl),models:[{id:e.model.modelId,name:o?.name??e.model.modelId,reasoning:o?.reasoning??ux(e.model),input:o?.input??dx(e.model),contextWindow:o?.contextWindow??128e3,maxTokens:o?.maxTokens??16384,cost:o?.cost??ex,...o?.headers?{headers:o.headers}:{},...o?.compat?{compat:o.compat}:{}}]};return{providers:{...n,[e.model.providerId]:s}}},fx=e=>{let t=xt.join(pd.tmpdir(),`vibemux-pi-models-${VS()}`);yi(t,{recursive:!0});let r=mx({agentDir:e.agentDir,baseRegistry:e.baseRegistry,model:e.model,apiKey:e.apiKey,baseUrl:e.baseUrl}),n=xt.join(t,"models.json");return XS(n,`${JSON.stringify(r,null,2)}
99
- `,"utf8"),{modelRegistry:md.create(e.authStorage,n),cleanup:()=>{KS(t,{recursive:!0,force:!0})}}},gx=async e=>{let t=ax(e.cwd,e.agentDir);yi(t,{recursive:!0});let r=e.resumeSessionId?.trim();if(!r){let i=Fr.continueRecent(e.cwd,t);return hi(i),i}if(dd(r)){let i=Fr.open(r,t,e.cwd);return hi(i),i}let o=(await Fr.list(e.cwd,t)).find(i=>i.id===r),s=o?Fr.open(o.path,t,e.cwd):Fr.continueRecent(e.cwd,t);return hi(s),s},so=e=>!!(e&&typeof e=="object"&&!Array.isArray(e)),hx=e=>typeof e=="string"?e.trim().length>0:Array.isArray(e)?e.some(t=>so(t)&&t.type==="text"&&typeof t.text=="string"&&t.text.trim().length>0):!1,yx=e=>Array.isArray(e)?e.some(t=>so(t)&&t.type==="toolCall"&&(typeof t.id!="string"||!t.id.trim()||typeof t.name!="string"||!t.name.trim())):!1,kx=e=>e?.role!=="user"&&e?.role!=="toolResult"||!Array.isArray(e.content)?!1:e.content.some(t=>so(t)?t.type==="input_image"||t.type==="image_url"?!0:t.type!=="image"?!1:typeof t.data!="string"||!t.data.trim()||typeof t.mimeType!="string"||!t.mimeType.trim()||typeof t.url=="string"||typeof t.image_url=="string"||so(t.source):!1),wx=e=>e?.role==="toolResult"&&(typeof e.toolCallId!="string"||!e.toolCallId.trim()||typeof e.toolName!="string"||!e.toolName.trim()),Sx=e=>{let t=e?.errorMessage?.trim().toLowerCase()||"";return e?.role==="assistant"&&e.stopReason==="error"&&(t.includes("call_id")&&t.includes("empty string")||t.includes("unknown parameter")&&t.includes("content[")&&t.includes(".url"))},xx=e=>{if(e.type!=="message")return!1;let t=e.message;return yx(t?.content)||kx(t)||wx(t)||Sx(t)},Cx=e=>{let t=e.message;return e.type==="message"&&!!e.id&&t?.role==="assistant"&&t.stopReason!=="error"&&hx(t.content)},vx=e=>{let t="";for(let r of e){if(xx(r))return t||null;Cx(r)&&(t=r.id??"")}},hi=e=>{let t=vx(e.getBranch());return t===void 0?!1:(t?e.createBranchedSession(t):e.newSession(),!0)},fd=async e=>{let t=ix(e.settings,e.runtimeEnv);yi(t,{recursive:!0});let r=YS.create(xt.join(t,"auth.json")),n=sx(e.executionModel),o=n?cx(n,e.runtimeEnv):{apiKey:"",baseUrl:""};n&&o.apiKey&&r.setRuntimeApiKey(n.providerId,o.apiKey);let s=md.create(r,xt.join(t,"models.json")),i=n&&(o.baseUrl||!s.find(n.providerId,n.modelId))?fx({agentDir:t,authStorage:r,baseRegistry:s,model:n,apiKey:o.apiKey||void 0,baseUrl:o.baseUrl||void 0}):null,a=i?.modelRegistry??s,c=QS.create(e.cwd,t);n&&c.applyOverrides({defaultProvider:n.providerId,defaultModel:n.modelId});let l=n?a.find(n.providerId,n.modelId):void 0;return l&&o.apiKey&&r.setRuntimeApiKey(l.provider,o.apiKey),{agentDir:t,authStorage:r,modelRegistry:a,selectedModel:l,sessionManager:await gx({agentDir:t,cwd:e.cwd,resumeSessionId:e.resumeSessionId}),settingsManager:c,cleanup:()=>{i?.cleanup()}}};var co=e=>!!(e&&typeof e=="object"&&!Array.isArray(e)),Ix=e=>co(e)&&e.type==="toolCall",gd=e=>!!(e.id?.trim()&&e.name?.trim()),Tx=e=>co(e)&&Object.keys(e).length>0,Rx=(e,t)=>({...co(e)?e:{},...co(t)?t:{}}),ao=e=>{if(e.role!=="assistant"||!Array.isArray(e.content))return e;let t=[],r,n=!1;for(let o of e.content){if(!Ix(o)){t.push(o),r=void 0;continue}if(gd(o)){let s={...o};t.push(s),r=s,s!==o&&(n=!0);continue}if(r&&Tx(o.arguments)){r.arguments=Rx(r.arguments,o.arguments),n=!0;continue}n=!0}return n?{...e,content:t}:e},_x=e=>{let t={...e};return e.partial&&(t.partial=ao(e.partial)),e.message&&(t.message=ao(e.message)),e.error&&(t.error=ao(e.error)),e.toolCall&&!gd(e.toolCall)&&delete t.toolCall,t},Ax=e=>{let t;return{async*[Symbol.asyncIterator](){for await(let r of e){let n=_x(r);n.type==="done"&&n.message&&(t=n.message),n.type==="error"&&n.error&&(t=n.error),yield n}},result:async()=>{if(t)return t;let r=await e.result?.();return r?ao(r):{role:"assistant",content:[]}}}},Mx=e=>{let t=e.agent,r=t?.streamFn;return!t||!r?()=>{}:(t.streamFn=async(...n)=>{let o=await r.apply(t,n);if(!o||typeof o!="object")return o;let s=o;return typeof s[Symbol.asyncIterator]!="function"?o:Ax(s)},()=>{t.streamFn=r})},hd=e=>{let t=e;if(t?.role!=="assistant")return[];if(typeof t.content=="string"){let r=t.content.trim();return r?[{index:0,text:r,type:"text"}]:[]}return Array.isArray(t.content)?t.content.flatMap((r,n)=>{let o=r;if(o.type==="text"){let s=typeof o.text=="string"?o.text.trim():typeof o.content=="string"?o.content.trim():"";return s?[{index:n,text:s,type:"text"}]:[]}if(o.type==="thinking"){let s=typeof o.thinking=="string"?o.thinking.trim():typeof o.text=="string"?o.text.trim():"";return s?[{index:n,text:s,type:"thinking"}]:[]}return[]}):[]},yd=e=>hd(e).filter(t=>t.type==="text").map(t=>t.text).join(`
91
+ `).trim():"";return t||("structuredContent"in e&&e.structuredContent!==void 0?JSON.stringify(e.structuredContent,null,2):"\u5DE5\u5177\u5DF2\u6267\u884C\u5B8C\u6210\uFF0C\u4F46\u6CA1\u6709\u8FD4\u56DE\u53EF\u5C55\u793A\u7684\u6587\u672C\u7ED3\u679C\u3002")},Dh=e=>{if(typeof e.command=="string"&&e.command.trim())return new Th({command:"sh",args:["-lc",e.command.trim()],env:Tt()});if(!e.url?.trim())return null;let t=e.headers??{},n=new URL(e.url);return e.type==="remote"&&/\/sse(?:$|[/?#])/i.test(n.pathname)?new Rh(n,{requestInit:Object.keys(t).length>0?{headers:t}:void 0}):new Ah(n,{requestInit:Object.keys(t).length>0?{headers:t}:void 0})},$h=e=>{let t=`${e.serverName} \xB7 ${e.toolName}`;return Mh({name:e.exposedToolName,label:t,description:e.description?.trim()||`${e.serverName} MCP tool: ${e.toolName}`,parameters:e.inputSchema??{type:"object",properties:{},additionalProperties:!0},execute:async(n,r)=>{let o=await e.client.callTool({name:e.toolName,arguments:r}),i=Bh(o);if(o.isError)throw new Error(i);return{content:[{type:"text",text:i}],details:{serverName:e.serverName,toolName:e.toolName,structuredContent:"structuredContent"in o?o.structuredContent:void 0}}}})},Nh=async e=>{let t=Dh(e.materializedServer);if(!t)return{client:null,tools:[],warning:`${e.serverPolicy.name} \u7F3A\u5C11\u53EF\u8FDE\u63A5\u7684 MCP transport\uFF0C\u5DF2\u8DF3\u8FC7\u3002`};let n=new bh({name:"vibemux-pi-mcp",version:"0.1.8"});await n.connect(t);let o=(await n.listTools()).tools.map(i=>$h({client:n,serverName:e.serverPolicy.name,toolName:i.name,description:i.description,inputSchema:i.inputSchema,exposedToolName:_h(e.serverPolicy.name,i.name,e.exposedToolNames)}));return{client:n,tools:o,warning:void 0}},jc=async e=>{let t=e.workerConfig??C(),n=new Set,r=[],o=[],i=[],s=e.mcpServers?.filter(c=>c.enabled&&c.capabilityMode==="resources+tools")??[],a=Je(s,{cloudUrl:t.cloudUrl,executorToken:t.executorToken,actingUserId:e.actingUserId});for(let c of s){let l=a[c.id];if(!l){r.push(`${c.name} \u65E0\u6CD5\u7269\u5316\u4E3A Pi MCP bridge\uFF0C\u5DF2\u8DF3\u8FC7\u3002`);continue}try{let u=await Nh({exposedToolNames:n,materializedServer:l,serverPolicy:c});u.warning&&r.push(u.warning),u.client&&o.push(u.client),i.push(...u.tools)}catch(u){r.push(`${c.name} MCP bridge \u8FDE\u63A5\u5931\u8D25\uFF1A${u instanceof Error?u.message:"unknown error"}`)}}return{tools:i,cleanup:async()=>{await Promise.allSettled(o.map(c=>c.close()))},warnings:r}};import{mkdtemp as Uh,mkdir as Lh,rm as Fc,writeFile as jh}from"node:fs/promises";import Fh from"node:os";import sn from"node:path";var Gh={"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"},qh=(e,t)=>{let n=sn.parse(e),r=(n.name||t).replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,""),o=(n.ext||"").replace(/[^a-zA-Z0-9.]+/g,"");return`${r||t}${o}`},zh=(e,t)=>{let n=(e||"").replace(/^ws:/,"http:").replace(/^wss:/,"https:");if(/^https?:\/\//i.test(t))return t;if(!n)throw new Error("\u5F53\u524D worker \u672A\u914D\u7F6E cloudUrl\uFF0C\u65E0\u6CD5\u4E0B\u8F7D\u56FE\u7247\u9644\u4EF6\u3002");return new URL(t,n).toString()},Hh=(e,t)=>{let n=sn.extname(e);return n||t&&Gh[t]||""},ar=async e=>{let t=e.attachments??[];if(t.length===0)return{attachments:[],cleanup:async()=>{}};let n=sn.join(Fh.tmpdir(),"vibemux-task-chat-attachments-");await Lh(sn.dirname(n),{recursive:!0});let r=await Uh(n);try{return{attachments:await Promise.all(t.map(async(i,s)=>{let a=zh(e.cloudUrl,i.url),c=await fetch(a,{signal:e.signal});if(!c.ok)throw new Error(`\u56FE\u7247\u9644\u4EF6\u4E0B\u8F7D\u5931\u8D25\uFF1A${i.filename}`);let l=c.headers.get("content-type")?.split(";")[0]?.trim()||i.contentType,u=Hh(i.filename,l),d=qh(`${s+1}-${i.filename||`image-${s+1}`}${u&&!i.filename.endsWith(u)?u:""}`,`image-${s+1}`),m=sn.join(r,d),g=Buffer.from(await c.arrayBuffer());return await jh(m,g),{...i,contentType:l,absoluteUrl:a,localPath:m}})),cleanup:async()=>{await Fc(r,{recursive:!0,force:!0})}}}catch(o){throw await Fc(r,{recursive:!0,force:!0}).catch(()=>{}),o}},Gc=(e,t)=>{if(t.length===0)return e;let n="\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",r=t.flatMap((o,i)=>[`\u9644\u4EF6 ${i+1}: ${o.filename}`,`- \u672C\u5730\u8DEF\u5F84: ${o.localPath}`,`- \u6765\u6E90 URL: ${o.absoluteUrl}`]);return[e.trim(),"",n,...r,"","\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(`
92
+ `)};import{createHash as Jh,randomUUID as Vh}from"node:crypto";import{existsSync as qc,mkdirSync as Zo,readFileSync as Kh,rmSync as Xh,writeFileSync as Qh}from"node:fs";import zc from"node:os";import et from"node:path";import{AuthStorage as Yh,ModelRegistry as Hc,SessionManager as an,SettingsManager as Zh}from"@mariozechner/pi-coding-agent";var ey=["text"],ty={input:0,output:0,cacheRead:0,cacheWrite:0},ny=new Map([["claude","anthropic"],["dashscope","qwen"],["gemini","google"],["glm","zhipu"],["grok","xai"],["kimi","moonshot"],["volcengine","doubao"]]),ry=e=>{let t=e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return ny.get(t)||t},oy=e=>e.trim().toUpperCase().replace(/[^A-Z0-9]+/g,"_").replace(/^_+|_+$/g,"")||"MODEL",iy=e=>{let t=e.trim().toLowerCase();return t==="openai"?"OPENAI":t==="anthropic"||t==="claude"?"ANTHROPIC":t==="google"||t==="gemini"?"GOOGLE":t==="minimax"?"MINIMAX":t==="minimax-cn"?"MINIMAX_CN":oy(e)},sy=e=>{let t=e?.trim()||"";if(!t)return null;let n=t.indexOf("/");if(n<0)return null;let r=ry(t.slice(0,n)),o=t.slice(n+1).trim();return!r||!o?null:{providerId:r,modelId:o}},ay=(e,t)=>{let n=t?.VIBEMUX_PI_AGENT_DIR?.trim();if(n)return n;let r=e?.agentDir?.trim()||C().piAgentDir?.trim();return r||et.join(zc.homedir(),".pi","agent")},cy=(e,t)=>{let n=Jh("sha1").update(`${t}::${e}`).digest("hex").slice(0,16);return et.join(t,"sessions-vibemux",n)},ly=(e,t)=>{let n=iy(e.providerId);return{apiKey:t?.[`${n}_API_KEY`]?.trim()||"",baseUrl:t?.[`${n}_BASE_URL`]?.trim()||""}},dy=(e,t)=>{let n=`${e.providerId} ${e.modelId} ${t||""}`.toLowerCase();return n.includes("anthropic")||n.includes("claude")?"anthropic-messages":n.includes("google")||n.includes("gemini")?"google-generative-ai":"openai-completions"},uy=e=>{let t=`${e.providerId}/${e.modelId}`.toLowerCase();return t.includes("gpt-5")||t.includes("claude")||t.includes("gemini")||t.includes("deepseek")||t.includes("qwen")||t.includes("kimi")},py=e=>{let t=`${e.providerId}/${e.modelId}`.toLowerCase();return t.includes("vision")||t.includes("omni")||t.includes("gemini")||t.includes("claude")||t.includes("gpt-4")||t.includes("gpt-5")?["text","image"]:[...ey]},my=e=>{if(!qc(e))return{};try{let t=JSON.parse(Kh(e,"utf8"));return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}catch{return{}}},gy=e=>{let t=et.join(e.agentDir,"models.json"),n=my(t),r=n.providers&&typeof n.providers=="object"?n.providers:{},o=e.baseRegistry.find(e.model.providerId,e.model.modelId),i={...e.apiKey?{apiKey:e.apiKey}:{},...e.baseUrl?{baseUrl:e.baseUrl}:{},api:o?.api??dy(e.model,e.baseUrl),models:[{id:e.model.modelId,name:o?.name??e.model.modelId,reasoning:o?.reasoning??uy(e.model),input:o?.input??py(e.model),contextWindow:o?.contextWindow??128e3,maxTokens:o?.maxTokens??16384,cost:o?.cost??ty,...o?.headers?{headers:o.headers}:{},...o?.compat?{compat:o.compat}:{}}]};return{providers:{...r,[e.model.providerId]:i}}},fy=e=>{let t=et.join(zc.tmpdir(),`vibemux-pi-models-${Vh()}`);Zo(t,{recursive:!0});let n=gy({agentDir:e.agentDir,baseRegistry:e.baseRegistry,model:e.model,apiKey:e.apiKey,baseUrl:e.baseUrl}),r=et.join(t,"models.json");return Qh(r,`${JSON.stringify(n,null,2)}
93
+ `,"utf8"),{modelRegistry:Hc.create(e.authStorage,r),cleanup:()=>{Xh(t,{recursive:!0,force:!0})}}},hy=async e=>{let t=cy(e.cwd,e.agentDir);Zo(t,{recursive:!0});let n=e.resumeSessionId?.trim();if(!n){let s=an.continueRecent(e.cwd,t);return Yo(s),s}if(qc(n)){let s=an.open(n,t,e.cwd);return Yo(s),s}let o=(await an.list(e.cwd,t)).find(s=>s.id===n),i=o?an.open(o.path,t,e.cwd):an.continueRecent(e.cwd,t);return Yo(i),i},cr=e=>!!(e&&typeof e=="object"&&!Array.isArray(e)),yy=e=>typeof e=="string"?e.trim().length>0:Array.isArray(e)?e.some(t=>cr(t)&&t.type==="text"&&typeof t.text=="string"&&t.text.trim().length>0):!1,ky=e=>Array.isArray(e)?e.some(t=>cr(t)&&t.type==="toolCall"&&(typeof t.id!="string"||!t.id.trim()||typeof t.name!="string"||!t.name.trim())):!1,wy=e=>e?.role!=="user"&&e?.role!=="toolResult"||!Array.isArray(e.content)?!1:e.content.some(t=>cr(t)?t.type==="input_image"||t.type==="image_url"?!0:t.type!=="image"?!1:typeof t.data!="string"||!t.data.trim()||typeof t.mimeType!="string"||!t.mimeType.trim()||typeof t.url=="string"||typeof t.image_url=="string"||cr(t.source):!1),Sy=e=>e?.role==="toolResult"&&(typeof e.toolCallId!="string"||!e.toolCallId.trim()||typeof e.toolName!="string"||!e.toolName.trim()),xy=e=>{let t=e?.errorMessage?.trim().toLowerCase()||"";return e?.role==="assistant"&&e.stopReason==="error"&&(t.includes("call_id")&&t.includes("empty string")||t.includes("unknown parameter")&&t.includes("content[")&&t.includes(".url"))},Cy=e=>{if(e.type!=="message")return!1;let t=e.message;return ky(t?.content)||wy(t)||Sy(t)||xy(t)},Py=e=>{let t=e.message;return e.type==="message"&&!!e.id&&t?.role==="assistant"&&t.stopReason!=="error"&&yy(t.content)},vy=e=>{let t="";for(let n of e){if(Cy(n))return t||null;Py(n)&&(t=n.id??"")}},Yo=e=>{let t=vy(e.getBranch());return t===void 0?!1:(t?e.createBranchedSession(t):e.newSession(),!0)},Jc=async e=>{let t=ay(e.settings,e.runtimeEnv);Zo(t,{recursive:!0});let n=Yh.create(et.join(t,"auth.json")),r=sy(e.executionModel),o=r?ly(r,e.runtimeEnv):{apiKey:"",baseUrl:""};r&&o.apiKey&&n.setRuntimeApiKey(r.providerId,o.apiKey);let i=Hc.create(n,et.join(t,"models.json")),s=r&&(o.baseUrl||!i.find(r.providerId,r.modelId))?fy({agentDir:t,authStorage:n,baseRegistry:i,model:r,apiKey:o.apiKey||void 0,baseUrl:o.baseUrl||void 0}):null,a=s?.modelRegistry??i,c=Zh.create(e.cwd,t);r&&c.applyOverrides({defaultProvider:r.providerId,defaultModel:r.modelId});let l=r?a.find(r.providerId,r.modelId):void 0;return l&&o.apiKey&&n.setRuntimeApiKey(l.provider,o.apiKey),{agentDir:t,authStorage:n,modelRegistry:a,selectedModel:l,sessionManager:await hy({agentDir:t,cwd:e.cwd,resumeSessionId:e.resumeSessionId}),settingsManager:c,cleanup:()=>{s?.cleanup()}}};var ur=e=>!!(e&&typeof e=="object"&&!Array.isArray(e)),Ry=e=>ur(e)&&e.type==="toolCall",Vc=e=>!!(e.id?.trim()&&e.name?.trim()),Ty=e=>ur(e)&&Object.keys(e).length>0,Ay=(e,t)=>({...ur(e)?e:{},...ur(t)?t:{}}),dr=e=>{if(e.role!=="assistant"||!Array.isArray(e.content))return e;let t=[],n,r=!1;for(let o of e.content){if(!Ry(o)){t.push(o),n=void 0;continue}if(Vc(o)){let i={...o};t.push(i),n=i,i!==o&&(r=!0);continue}if(n&&Ty(o.arguments)){n.arguments=Ay(n.arguments,o.arguments),r=!0;continue}r=!0}return r?{...e,content:t}:e},My=e=>{let t={...e};return e.partial&&(t.partial=dr(e.partial)),e.message&&(t.message=dr(e.message)),e.error&&(t.error=dr(e.error)),e.toolCall&&!Vc(e.toolCall)&&delete t.toolCall,t},Oy=e=>{let t;return{async*[Symbol.asyncIterator](){for await(let n of e){let r=My(n);r.type==="done"&&r.message&&(t=r.message),r.type==="error"&&r.error&&(t=r.error),yield r}},result:async()=>{if(t)return t;let n=await e.result?.();return n?dr(n):{role:"assistant",content:[]}}}},_y=e=>{let t=e.agent,n=t?.streamFn;return!t||!n?()=>{}:(t.streamFn=async(...r)=>{let o=await n.apply(t,r);if(!o||typeof o!="object")return o;let i=o;return typeof i[Symbol.asyncIterator]!="function"?o:Oy(i)},()=>{t.streamFn=n})},Kc=e=>{let t=e;if(t?.role!=="assistant")return[];if(typeof t.content=="string"){let n=t.content.trim();return n?[{index:0,text:n,type:"text"}]:[]}return Array.isArray(t.content)?t.content.flatMap((n,r)=>{let o=n;if(o.type==="text"){let i=typeof o.text=="string"?o.text.trim():typeof o.content=="string"?o.content.trim():"";return i?[{index:r,text:i,type:"text"}]:[]}if(o.type==="thinking"){let i=typeof o.thinking=="string"?o.thinking.trim():typeof o.text=="string"?o.text.trim():"";return i?[{index:r,text:i,type:"thinking"}]:[]}return[]}):[]},Xc=e=>Kc(e).filter(t=>t.type==="text").map(t=>t.text).join(`
100
94
 
101
- `).trim(),kd=e=>{let t=e;return t?.role!=="assistant"||t.stopReason!=="error"?"":typeof t.errorMessage=="string"?t.errorMessage.trim():""},Ox=e=>{for(let t of[...e].reverse())if(t?.role==="assistant")return t},wd=(e,t)=>{M("Pi",e.onEvent,{type:"message.updated",properties:{info:{id:t.activeAssistantMessageId,role:"assistant"}}})},Si=(e,t,r,n,o,s)=>{let i=r==="text"?t.textParts:t.reasoningParts;(i.get(n)??"")!==o&&(i.set(n,o),wd(e,t),M("Pi",e.onEvent,{type:"message.part.updated",properties:{part:{id:`${t.activeAssistantMessageId}:${r}:${n}`,messageID:t.activeAssistantMessageId,type:r,text:o},delta:s}}))},Bx=(e,t,r,n)=>{let o=`${t.textParts.get(r)??""}${n}`;Si(e,t,"text",r,o,n)},Wx=(e,t,r,n)=>{let o=`${t.reasoningParts.get(r)??""}${n}`;Si(e,t,"reasoning",r,o,n)},io=(e,t,r)=>{t.latestAssistantMessage=r;for(let n of hd(r)){let o=(n.type==="text"?t.textParts:t.reasoningParts).get(n.index)??"",s=n.text.startsWith(o)&&n.text.slice(o.length)||void 0;Si(e,t,n.type==="text"?"text":"reasoning",n.index,n.text,s)}},ki=(e,t,r)=>{wd(e,t),M("Pi",e.onEvent,{type:"message.part.updated",properties:{part:{id:r.toolCallId,messageID:t.activeAssistantMessageId,type:"tool",tool:r.toolName,state:{status:r.status,raw:r.raw,output:r.output,error:r.error}}}})},wi=e=>!!(e.toolCallId?.trim()&&e.toolName?.trim()),Nx=(e,t,r)=>{if(r.type==="agent_start"){M("Pi",e.onEvent,{type:"session.status",properties:{status:{type:"busy",message:"Pi \u4F1A\u8BDD\u6267\u884C\u4E2D"}}});return}if(r.type==="turn_start"){t.assistantCounter+=1,t.activeAssistantMessageId=`pi:${t.assistantCounter}`,t.latestAssistantMessage=void 0,t.textParts.clear(),t.reasoningParts.clear();return}if(r.type==="message_update"){t.latestAssistantMessage=r.message,r.assistantMessageEvent.type==="text_delta"&&Bx(e,t,r.assistantMessageEvent.contentIndex,r.assistantMessageEvent.delta),r.assistantMessageEvent.type==="thinking_delta"&&Wx(e,t,r.assistantMessageEvent.contentIndex,r.assistantMessageEvent.delta),(r.assistantMessageEvent.type==="text_end"||r.assistantMessageEvent.type==="thinking_end"||r.assistantMessageEvent.type==="done")&&io(e,t,r.message);return}if(r.type==="message_end"&&r.message.role==="assistant"){io(e,t,r.message);return}if(r.type==="turn_end"&&r.message.role==="assistant"){io(e,t,r.message);return}if(r.type==="tool_execution_start"){if(!wi(r))return;ki(e,t,{toolCallId:r.toolCallId,toolName:r.toolName,raw:JSON.stringify(r.args??{},null,2),status:"running"});return}if(r.type==="tool_execution_update"){if(!wi(r))return;ki(e,t,{toolCallId:r.toolCallId,toolName:r.toolName,raw:JSON.stringify(r.args??{},null,2),output:JSON.stringify(r.partialResult??{},null,2),status:"running"});return}if(r.type==="tool_execution_end"){if(!wi(r))return;ki(e,t,{toolCallId:r.toolCallId,toolName:r.toolName,output:JSON.stringify(r.result??{},null,2),error:r.isError?JSON.stringify(r.result??{},null,2):void 0,status:r.isError?"error":"completed"});return}if(r.type==="agent_end"){let n=Ox(r.messages);n&&io(e,t,n),M("Pi",e.onEvent,{type:"session.idle",properties:{}})}},Dx=e=>{for(let t of[...e].reverse()){let r=yd(t)||kd(t);if(r)return r}return""},Ux=e=>[...e.textParts.entries()].sort((t,r)=>t[0]-r[0]).map(([,t])=>t.trim()).filter(Boolean).join(`
95
+ `).trim(),Qc=e=>{let t=e;return t?.role!=="assistant"||t.stopReason!=="error"?"":typeof t.errorMessage=="string"?t.errorMessage.trim():""},Wy=e=>{for(let t of[...e].reverse())if(t?.role==="assistant")return t},Yc=(e,t)=>{A("Pi",e.onEvent,{type:"message.updated",properties:{info:{id:t.activeAssistantMessageId,role:"assistant"}}})},ni=(e,t,n,r,o,i)=>{let s=n==="text"?t.textParts:t.reasoningParts;(s.get(r)??"")!==o&&(s.set(r,o),Yc(e,t),A("Pi",e.onEvent,{type:"message.part.updated",properties:{part:{id:`${t.activeAssistantMessageId}:${n}:${r}`,messageID:t.activeAssistantMessageId,type:n,text:o},delta:i}}))},By=(e,t,n,r)=>{let o=`${t.textParts.get(n)??""}${r}`;ni(e,t,"text",n,o,r)},Dy=(e,t,n,r)=>{let o=`${t.reasoningParts.get(n)??""}${r}`;ni(e,t,"reasoning",n,o,r)},lr=(e,t,n)=>{t.latestAssistantMessage=n;for(let r of Kc(n)){let o=(r.type==="text"?t.textParts:t.reasoningParts).get(r.index)??"",i=r.text.startsWith(o)&&r.text.slice(o.length)||void 0;ni(e,t,r.type==="text"?"text":"reasoning",r.index,r.text,i)}},ei=(e,t,n)=>{Yc(e,t),A("Pi",e.onEvent,{type:"message.part.updated",properties:{part:{id:n.toolCallId,messageID:t.activeAssistantMessageId,type:"tool",tool:n.toolName,state:{status:n.status,raw:n.raw,output:n.output,error:n.error}}}})},ti=e=>!!(e.toolCallId?.trim()&&e.toolName?.trim()),$y=(e,t,n)=>{if(n.type==="agent_start"){A("Pi",e.onEvent,{type:"session.status",properties:{status:{type:"busy",message:"Pi \u4F1A\u8BDD\u6267\u884C\u4E2D"}}});return}if(n.type==="turn_start"){t.assistantCounter+=1,t.activeAssistantMessageId=`pi:${t.assistantCounter}`,t.latestAssistantMessage=void 0,t.textParts.clear(),t.reasoningParts.clear();return}if(n.type==="message_update"){t.latestAssistantMessage=n.message,n.assistantMessageEvent.type==="text_delta"&&By(e,t,n.assistantMessageEvent.contentIndex,n.assistantMessageEvent.delta),n.assistantMessageEvent.type==="thinking_delta"&&Dy(e,t,n.assistantMessageEvent.contentIndex,n.assistantMessageEvent.delta),(n.assistantMessageEvent.type==="text_end"||n.assistantMessageEvent.type==="thinking_end"||n.assistantMessageEvent.type==="done")&&lr(e,t,n.message);return}if(n.type==="message_end"&&n.message.role==="assistant"){lr(e,t,n.message);return}if(n.type==="turn_end"&&n.message.role==="assistant"){lr(e,t,n.message);return}if(n.type==="tool_execution_start"){if(!ti(n))return;ei(e,t,{toolCallId:n.toolCallId,toolName:n.toolName,raw:JSON.stringify(n.args??{},null,2),status:"running"});return}if(n.type==="tool_execution_update"){if(!ti(n))return;ei(e,t,{toolCallId:n.toolCallId,toolName:n.toolName,raw:JSON.stringify(n.args??{},null,2),output:JSON.stringify(n.partialResult??{},null,2),status:"running"});return}if(n.type==="tool_execution_end"){if(!ti(n))return;ei(e,t,{toolCallId:n.toolCallId,toolName:n.toolName,output:JSON.stringify(n.result??{},null,2),error:n.isError?JSON.stringify(n.result??{},null,2):void 0,status:n.isError?"error":"completed"});return}if(n.type==="agent_end"){let r=Wy(n.messages);r&&lr(e,t,r),A("Pi",e.onEvent,{type:"session.idle",properties:{}})}},Ny=e=>{for(let t of[...e].reverse()){let n=Xc(t)||Qc(t);if(n)return n}return""},Uy=e=>[...e.textParts.entries()].sort((t,n)=>t[0]-n[0]).map(([,t])=>t.trim()).filter(Boolean).join(`
102
96
 
103
- `).trim(),$x=(e,t,r)=>{let n=yd(r.latestAssistantMessage)||kd(r.latestAssistantMessage);if(n)return n;let o=Dx(e.slice(t));return o||Ux(r)},Lx=async e=>{for(await e.agent?.waitForIdle?.();;){let t=e._agentEventQueue;if(await t,t===e._agentEventQueue)return}},jx=async e=>Promise.all(e.filter(t=>t.contentType?.startsWith("image/")).map(async t=>({type:"image",data:await Px(t.localPath,"base64"),mimeType:t.contentType||"image/png"}))),Sd=async e=>{let t=e.agentSettings&&"agentDir"in e.agentSettings?e.agentSettings:void 0,r=qe(e.executionModel)??qe(t?.defaultModel),n=C(),o=await fd({cwd:e.cwd,executionModel:r,resumeSessionId:e.resumeSessionId,runtimeEnv:e.runtimeEnv,settings:t}),s=await cd({actingUserId:e.actingUserId,mcpServers:e.mcpServers,workerConfig:n}),i=e.runtimeEnv?.VIBEMUX_PI_SKILL_PATHS?.split(`
104
- `).map(w=>w.trim()).filter(Boolean)??[],a=new bx({cwd:e.cwd,agentDir:o.agentDir,settingsManager:o.settingsManager,additionalSkillPaths:i});await a.reload();let{session:c}=await Ex({cwd:e.cwd,agentDir:o.agentDir,authStorage:o.authStorage,modelRegistry:o.modelRegistry,model:o.selectedModel,tools:["read","bash","edit","write","grep","find","ls"],customTools:s.tools,resourceLoader:a,sessionManager:o.sessionManager,settingsManager:o.settingsManager}),l=s.warnings.join(`
105
- `);l&&M("Pi",e.onEvent,{type:"session.status",properties:{status:{type:"busy",message:l}}});let d={activeAssistantMessageId:"pi:0",assistantCounter:0,reasoningParts:new Map,textParts:new Map},u=c.messages.length,p=c.subscribe(w=>{Nx(e,d,w)}),m=Mx(c),y=()=>{c.abort()};e.signal?.addEventListener("abort",y,{once:!0});let g={attachments:[],cleanup:async()=>{}};try{g=e.preparedAttachments?{attachments:e.preparedAttachments,cleanup:async()=>{}}:await oo({attachments:e.attachments,cloudUrl:n.cloudUrl,signal:e.signal});let w=await jx(g.attachments);if(await c.prompt(e.prompt,w.length>0?{images:w}:void 0),await Lx(c),e.signal?.aborted)throw rt();return{output:$x(c.messages,u,d),sessionId:c.sessionId}}catch(w){throw e.signal?.aborted||w instanceof Error&&w.name==="AbortError"?rt():(M("Pi",e.onEvent,{type:"session.error",properties:{error:w instanceof Error?w.message:"Pi \u6267\u884C\u5931\u8D25",message:w instanceof Error?w.message:"Pi \u6267\u884C\u5931\u8D25"}}),w)}finally{e.signal?.removeEventListener("abort",y),p(),m(),c.dispose(),await g.cleanup(),await s.cleanup(),o.cleanup()}};import{createHash as Fx}from"node:crypto";import{copyFileSync as Pd,existsSync as He,mkdirSync as nt,mkdtempSync as Gx,readFileSync as vi,rmSync as sr,writeFileSync as Pi}from"node:fs";import Ei from"node:os";import W from"node:path";var Ed=".vibemux-managed.json",qx="VIBEMUX_CODEX_MCP_TOKEN_",zx="vibemux-task-runtime-",Hx=[".credentials.json"],Vx={OpenCode:{skillRoot:".opencode/skills"},Codex:{skillRoot:".codex/skills"},ClaudeCode:{skillRoot:".claude/skills"},Pi:{skillRoot:".pi/skills"}},bd=e=>Vx[Tt(e)].skillRoot,Ct=e=>e.replace(/\\/g,"\\\\").replace(/"/g,'\\"'),xd=e=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),Jx=e=>/^[A-Za-z0-9_-]+$/.test(e),Id=(e,t)=>{if(!e.trim()||t.length===0)return!1;let r=t.map(n=>{let o=`"${xd(n)}"`;return Jx(n)?`(?:${xd(n)}|${o})`:o}).join("\\s*\\.\\s*");return new RegExp(`^\\s*\\[\\s*${r}\\s*\\]\\s*$`,"m").test(e)},xi=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("/")},Kx=e=>e.startsWith("sse://")?`http://${e.slice(6)}`:e.trim(),Xx=e=>/^https?:\/\//i.test(e)||/^sse:\/\//i.test(e),Ci=(e,t)=>{nt(W.dirname(e),{recursive:!0}),Pi(e,`${JSON.stringify(t,null,2)}
106
- `,"utf8")},lo=(e,t)=>{nt(W.dirname(e),{recursive:!0}),Pi(e,t,"utf8")},Yx=e=>typeof e=="string"?{encoding:"utf8",content:e}:!e||typeof e!="object"||typeof e.content!="string"?null:{encoding:e.encoding==="base64"?"base64":"utf8",content:e.content},Qx=(e,t)=>{let r=Fx("sha1").update(t).digest("hex").slice(0,16);return W.join(Ee(),"runtime",e,r)},bi=e=>{let t=W.join(Ee(),"runtime",e);return nt(t,{recursive:!0}),Gx(W.join(t,`${e}-`))},Cd=e=>e.replace(/\\/g,"/").split("/").some(t=>t.startsWith(zx)),Zx=e=>{let t=e.trim();if(!t)return null;try{let r=JSON.parse(t),n=r.env&&typeof r.env=="object"?Object.entries(r.env).reduce((o,[s,i])=>(typeof i=="string"&&i.trim()&&(o[s]=i),o),{}):{};return{settings:r,runtimeEnv:n}}catch{return null}},eC=e=>{let t=W.join(e,Ed);if(!He(t))return[];try{let r=JSON.parse(vi(t,"utf8"));return Array.isArray(r.slugs)?r.slugs.filter(n=>typeof n=="string"&&n.trim().length>0):[]}catch{return[]}},tC=(e,t)=>{Ci(W.join(e,Ed),{slugs:t})},rC=e=>{let t=bi(`skills-${e.toLowerCase()}`),r=W.join(t,bd(e));return nt(r,{recursive:!0}),{rootPath:r,promptRoot:r.replace(/\\/g,"/"),cleanup:()=>{sr(t,{recursive:!0,force:!0})}}},vd=(e,t)=>{for(let n of eC(e))sr(W.join(e,n),{recursive:!0,force:!0});let r=[];for(let n of t){let o=xi(n.slug);if(!o)continue;r.push(o);let s=W.join(e,o);sr(s,{recursive:!0,force:!0}),nt(s,{recursive:!0});for(let[i,a]of Object.entries(n.files)){let c=xi(i);if(!c)continue;let l=W.resolve(s,c);if(l!==s&&!l.startsWith(`${s}${W.sep}`))continue;let d=Yx(a);if(d){if(nt(W.dirname(l),{recursive:!0}),d.encoding==="base64"){Pi(l,Buffer.from(d.content,"base64"));continue}lo(l,d.content)}}He(W.join(s,"SKILL.md"))||lo(W.join(s,"SKILL.md"),n.markdown)}tC(e,r)},nC=(e,t,r)=>{if(r.length===0)return null;let n;try{let o=rC(e);try{return vd(o.rootPath,r),{promptRoot:o.promptRoot,cleanup:o.cleanup}}catch(s){throw o.cleanup(),s}}catch(o){n=o;let s=bd(e),i=W.join(t,s);try{return nt(i,{recursive:!0}),vd(i,r),{promptRoot:s.replace(/\\/g,"/"),cleanup:()=>{}}}catch(a){throw a instanceof Error?a:n instanceof Error?n:new Error("\u5199\u5165\u8FD0\u884C\u65F6\u6280\u80FD\u76EE\u5F55\u5931\u8D25\u3002")}}},oC=(e,t="")=>{let r=[],n={},o=0;for(let s of e.mcpServers??[]){if(!s.enabled)continue;let i=xi(s.id||s.name).replace(/\//g,"-");if(!i||Id(t,["mcp_servers",i]))continue;if(s.transport==="stdio"||s.target.startsWith("stdio://")){let c=s.target.replace(/^stdio:\/\//,"").trim();if(!c)continue;r.push(`[mcp_servers."${Ct(i)}"]`,'command = "sh"',`args = ["-lc", "${Ct(c)}"]`,"");continue}if(s.target===ct){if(!e.executorToken?.trim())continue;let c=`${qx}${o}`;o+=1,n[c]=e.executorToken.trim(),r.push(`[mcp_servers."${Ct(i)}"]`,`url = "${Ct(`${e.cloudUrl.replace(/\/+$/,"")}/mcp/executor`)}"`,`bearer_token_env_var = "${c}"`,"");continue}if(!Xx(s.target))continue;let a=Kx(s.target);a&&r.push(`[mcp_servers."${Ct(i)}"]`,`url = "${Ct(a)}"`,"")}return{configText:r.join(`
107
- `),env:n}},sC=(e,t)=>{let r=lt(e.mcpServers??[],{cloudUrl:e.cloudUrl,executorToken:e.executorToken,actingUserId:t});return{mcpServers:Object.entries(r).reduce((o,[s,i])=>{let a=i;return typeof a.command=="string"&&a.command.trim()?(o[s]={command:"sh",args:["-lc",a.command.trim()]},o):(typeof a.url=="string"&&a.url.trim()&&(o[s]={type:"http",url:a.url.trim(),...a.headers&&typeof a.headers=="object"?{headers:a.headers}:{}}),o)},{})}},iC=(e,t)=>{let r=Cd(e)?bi("codex-home"):Qx("codex-home",e),n=process.env.CODEX_HOME?.trim()||W.join(Ei.homedir(),".codex"),o=W.join(n,"config.toml"),s=W.join(n,"auth.json"),i=W.join(r,"config.toml"),a=W.join(r,"auth.json");nt(r,{recursive:!0});let c=t.codexConfigContent?.trim()||(He(o)?vi(o,"utf8").trim():""),l=Id(c,["projects",e])?"":[`[projects."${Ct(e)}"]`,'trust_level = "trusted"'].join(`
108
- `),d=oC(t,c),u=[c,l,d.configText].filter(m=>m.trim());lo(i,`${u.join(`
97
+ `).trim(),Ly=(e,t,n)=>{let r=Xc(n.latestAssistantMessage)||Qc(n.latestAssistantMessage);if(r)return r;let o=Ny(e.slice(t));return o||Uy(n)},jy=async e=>{for(await e.agent?.waitForIdle?.();;){let t=e._agentEventQueue;if(await t,t===e._agentEventQueue)return}},Fy=async e=>Promise.all(e.filter(t=>t.contentType?.startsWith("image/")).map(async t=>({type:"image",data:await Ey(t.localPath,"base64"),mimeType:t.contentType||"image/png"}))),Zc=async e=>{let t=e.agentSettings&&"agentDir"in e.agentSettings?e.agentSettings:void 0,n=Me(e.executionModel)??Me(t?.defaultModel),r=C(),o=await Jc({cwd:e.cwd,executionModel:n,resumeSessionId:e.resumeSessionId,runtimeEnv:e.runtimeEnv,settings:t}),i=await jc({actingUserId:e.actingUserId,mcpServers:e.mcpServers,workerConfig:r}),s=e.runtimeEnv?.VIBEMUX_PI_SKILL_PATHS?.split(`
98
+ `).map(S=>S.trim()).filter(Boolean)??[],a=new by({cwd:e.cwd,agentDir:o.agentDir,settingsManager:o.settingsManager,additionalSkillPaths:s});await a.reload();let{session:c}=await Iy({cwd:e.cwd,agentDir:o.agentDir,authStorage:o.authStorage,modelRegistry:o.modelRegistry,model:o.selectedModel,tools:["read","bash","edit","write","grep","find","ls"],customTools:i.tools,resourceLoader:a,sessionManager:o.sessionManager,settingsManager:o.settingsManager}),l=i.warnings.join(`
99
+ `);l&&A("Pi",e.onEvent,{type:"session.status",properties:{status:{type:"busy",message:l}}});let u={activeAssistantMessageId:"pi:0",assistantCounter:0,reasoningParts:new Map,textParts:new Map},d=c.messages.length,m=c.subscribe(S=>{$y(e,u,S)}),g=_y(c),k=()=>{c.abort()};e.signal?.addEventListener("abort",k,{once:!0});let h={attachments:[],cleanup:async()=>{}};try{h=e.preparedAttachments?{attachments:e.preparedAttachments,cleanup:async()=>{}}:await ar({attachments:e.attachments,cloudUrl:r.cloudUrl,signal:e.signal});let S=await Fy(h.attachments);if(await c.prompt(e.prompt,S.length>0?{images:S}:void 0),await jy(c),e.signal?.aborted)throw Le();return{output:Ly(c.messages,d,u),sessionId:c.sessionId}}catch(S){throw e.signal?.aborted||S instanceof Error&&S.name==="AbortError"?Le():(A("Pi",e.onEvent,{type:"session.error",properties:{error:S instanceof Error?S.message:"Pi \u6267\u884C\u5931\u8D25",message:S instanceof Error?S.message:"Pi \u6267\u884C\u5931\u8D25"}}),S)}finally{e.signal?.removeEventListener("abort",k),m(),g(),c.dispose(),await h.cleanup(),await i.cleanup(),o.cleanup()}};import{createHash as Gy}from"node:crypto";import{copyFileSync as rl,existsSync as _e,mkdirSync as je,mkdtempSync as qy,readFileSync as ii,rmSync as At,writeFileSync as si}from"node:fs";import ai from"node:os";import W from"node:path";var ol=".vibemux-managed.json",zy="VIBEMUX_CODEX_MCP_TOKEN_",Hy="vibemux-task-runtime-",Jy=[".credentials.json"],Vy={OpenCode:{skillRoot:".opencode/skills"},Codex:{skillRoot:".codex/skills"},ClaudeCode:{skillRoot:".claude/skills"},Pi:{skillRoot:".pi/skills"}},il=e=>Vy[at(e)].skillRoot,tt=e=>e.replace(/\\/g,"\\\\").replace(/"/g,'\\"'),el=e=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),Ky=e=>/^[A-Za-z0-9_-]+$/.test(e),sl=(e,t)=>{if(!e.trim()||t.length===0)return!1;let n=t.map(r=>{let o=`"${el(r)}"`;return Ky(r)?`(?:${el(r)}|${o})`:o}).join("\\s*\\.\\s*");return new RegExp(`^\\s*\\[\\s*${n}\\s*\\]\\s*$`,"m").test(e)},ri=e=>{let t=[];for(let n of e.replace(/\\/g,"/").replace(/^\/+/,"").split("/"))if(!(!n||n===".")){if(n===".."){t.length>0&&t.pop();continue}t.push(n)}return t.join("/")},Xy=e=>e.startsWith("sse://")?`http://${e.slice(6)}`:e.trim(),Qy=e=>/^https?:\/\//i.test(e)||/^sse:\/\//i.test(e),oi=(e,t)=>{je(W.dirname(e),{recursive:!0}),si(e,`${JSON.stringify(t,null,2)}
100
+ `,"utf8")},pr=(e,t)=>{je(W.dirname(e),{recursive:!0}),si(e,t,"utf8")},Yy=e=>typeof e=="string"?{encoding:"utf8",content:e}:!e||typeof e!="object"||typeof e.content!="string"?null:{encoding:e.encoding==="base64"?"base64":"utf8",content:e.content},Zy=(e,t)=>{let n=Gy("sha1").update(t).digest("hex").slice(0,16);return W.join(ye(),"runtime",e,n)},ci=e=>{let t=W.join(ye(),"runtime",e);return je(t,{recursive:!0}),qy(W.join(t,`${e}-`))},tl=e=>e.replace(/\\/g,"/").split("/").some(t=>t.startsWith(Hy)),ek=e=>{let t=e.trim();if(!t)return null;try{let n=JSON.parse(t),r=n.env&&typeof n.env=="object"?Object.entries(n.env).reduce((o,[i,s])=>(typeof s=="string"&&s.trim()&&(o[i]=s),o),{}):{};return{settings:n,runtimeEnv:r}}catch{return null}},tk=e=>{let t=W.join(e,ol);if(!_e(t))return[];try{let n=JSON.parse(ii(t,"utf8"));return Array.isArray(n.slugs)?n.slugs.filter(r=>typeof r=="string"&&r.trim().length>0):[]}catch{return[]}},nk=(e,t)=>{oi(W.join(e,ol),{slugs:t})},rk=e=>{let t=ci(`skills-${e.toLowerCase()}`),n=W.join(t,il(e));return je(n,{recursive:!0}),{rootPath:n,promptRoot:n.replace(/\\/g,"/"),cleanup:()=>{At(t,{recursive:!0,force:!0})}}},nl=(e,t)=>{for(let r of tk(e))At(W.join(e,r),{recursive:!0,force:!0});let n=[];for(let r of t){let o=ri(r.slug);if(!o)continue;n.push(o);let i=W.join(e,o);At(i,{recursive:!0,force:!0}),je(i,{recursive:!0});for(let[s,a]of Object.entries(r.files)){let c=ri(s);if(!c)continue;let l=W.resolve(i,c);if(l!==i&&!l.startsWith(`${i}${W.sep}`))continue;let u=Yy(a);if(u){if(je(W.dirname(l),{recursive:!0}),u.encoding==="base64"){si(l,Buffer.from(u.content,"base64"));continue}pr(l,u.content)}}_e(W.join(i,"SKILL.md"))||pr(W.join(i,"SKILL.md"),r.markdown)}nk(e,n)},ok=(e,t,n)=>{if(n.length===0)return null;let r;try{let o=rk(e);try{return nl(o.rootPath,n),{promptRoot:o.promptRoot,cleanup:o.cleanup}}catch(i){throw o.cleanup(),i}}catch(o){r=o;let i=il(e),s=W.join(t,i);try{return je(s,{recursive:!0}),nl(s,n),{promptRoot:i.replace(/\\/g,"/"),cleanup:()=>{}}}catch(a){throw a instanceof Error?a:r instanceof Error?r:new Error("\u5199\u5165\u8FD0\u884C\u65F6\u6280\u80FD\u76EE\u5F55\u5931\u8D25\u3002")}}},ik=(e,t="")=>{let n=[],r={},o=0;for(let i of e.mcpServers??[]){if(!i.enabled)continue;let s=ri(i.id||i.name).replace(/\//g,"-");if(!s||sl(t,["mcp_servers",s]))continue;if(i.transport==="stdio"||i.target.startsWith("stdio://")){let c=i.target.replace(/^stdio:\/\//,"").trim();if(!c)continue;n.push(`[mcp_servers."${tt(s)}"]`,'command = "sh"',`args = ["-lc", "${tt(c)}"]`,"");continue}if(i.target===He){if(!e.executorToken?.trim())continue;let c=`${zy}${o}`;o+=1,r[c]=e.executorToken.trim(),n.push(`[mcp_servers."${tt(s)}"]`,`url = "${tt(`${e.cloudUrl.replace(/\/+$/,"")}/mcp/executor`)}"`,`bearer_token_env_var = "${c}"`,"");continue}if(!Qy(i.target))continue;let a=Xy(i.target);a&&n.push(`[mcp_servers."${tt(s)}"]`,`url = "${tt(a)}"`,"")}return{configText:n.join(`
101
+ `),env:r}},sk=(e,t)=>{let n=Je(e.mcpServers??[],{cloudUrl:e.cloudUrl,executorToken:e.executorToken,actingUserId:t});return{mcpServers:Object.entries(n).reduce((o,[i,s])=>{let a=s;return typeof a.command=="string"&&a.command.trim()?(o[i]={command:"sh",args:["-lc",a.command.trim()]},o):(typeof a.url=="string"&&a.url.trim()&&(o[i]={type:"http",url:a.url.trim(),...a.headers&&typeof a.headers=="object"?{headers:a.headers}:{}}),o)},{})}},ak=(e,t)=>{let n=tl(e)?ci("codex-home"):Zy("codex-home",e),r=process.env.CODEX_HOME?.trim()||W.join(ai.homedir(),".codex"),o=W.join(r,"config.toml"),i=W.join(r,"auth.json"),s=W.join(n,"config.toml"),a=W.join(n,"auth.json");je(n,{recursive:!0});let c=t.codexConfigContent?.trim()||(_e(o)?ii(o,"utf8").trim():""),l=sl(c,["projects",e])?"":[`[projects."${tt(e)}"]`,'trust_level = "trusted"'].join(`
102
+ `),u=ik(t,c),d=[c,l,u.configText].filter(g=>g.trim());pr(s,`${d.join(`
109
103
 
110
104
  `)}
111
- `);let p=t.codexAuthContent?.trim();return p?lo(a,`${p}
112
- `):He(s)&&!He(a)&&Pd(s,a),{runtimeEnv:{CODEX_HOME:r,...d.env},cleanup:()=>{Cd(e)&&sr(r,{recursive:!0,force:!0})}}},aC=(e,t)=>{let r=bi("claude-home"),n=W.join(r,"mcp.json"),o=process.env.CLAUDE_HOME?.trim()||W.join(Ei.homedir(),".claude"),i=[W.join(o,"settings.json"),W.join(o,"config.json")].reduce((l,d)=>{if(l.trim()||!He(d))return l;try{return vi(d,"utf8").trim()}catch{return l}},""),a=e.claudeCodeConfigContent?.trim()||i,c=a?Zx(a):null;if(a){if(!c)throw sr(r,{recursive:!0,force:!0}),new Error("Claude Code settings.json \u683C\u5F0F\u4E0D\u6B63\u786E\u3002");Ci(W.join(r,"settings.json"),c.settings)}for(let l of Hx){let d=W.join(o,l),u=W.join(r,l);He(d)&&!He(u)&&Pd(d,u)}return Ci(n,sC(e,t)),{runtimeArgs:["--mcp-config",n],runtimeEnv:{CLAUDE_HOME:r,...c?.runtimeEnv??{}},cleanup:()=>{sr(r,{recursive:!0,force:!0})}}},cC=(e,t)=>{let r=aC(e,t);return{runtimeArgs:r.runtimeArgs,runtimeEnv:r.runtimeEnv,cleanup:()=>{r.cleanup()}}},uo=(e,t)=>{let r=t.trim();return r?[r,"",e].join(`
113
- `):e},Td=e=>({promptPrefix:e.promptPrefix,runtimeEnv:{},runtimeArgs:[],cleanup:()=>{e.runtimeSkills?.cleanup()}}),lC=e=>{let t=iC(e.cwd,e.effectiveConfig);return{promptPrefix:e.promptPrefix,runtimeEnv:t.runtimeEnv,runtimeArgs:[],cleanup:()=>{e.runtimeSkills?.cleanup(),t.cleanup()}}},uC=e=>{let t=cC(e.effectiveConfig,e.actingUserId);return{promptPrefix:e.promptPrefix,runtimeEnv:t.runtimeEnv,runtimeArgs:t.runtimeArgs,cleanup:()=>{e.runtimeSkills?.cleanup(),t.cleanup()}}},dC=e=>{let t=e.effectiveConfig.agentSettings.Pi.agentDir?.trim()||e.effectiveConfig.piAgentDir?.trim()||W.join(Ei.homedir(),".pi","agent"),r=e.runtimeSkills?.promptRoot?.trim();return{promptPrefix:e.promptPrefix,runtimeEnv:{VIBEMUX_PI_AGENT_DIR:t,...r?{VIBEMUX_PI_SKILL_PATHS:r}:{}},runtimeArgs:[],cleanup:()=>{e.runtimeSkills?.cleanup()}}},pC={OpenCode:Td,Codex:lC,ClaudeCode:uC,Pi:dC},Ii=e=>{let t=e.workerConfig??C(),r=e.mcpServers?{...t,mcpServers:e.mcpServers}:t,n=e.runtimeSkillPackages??[],o=He(e.cwd)?nC(e.agentType,e.cwd,n):null,s=Tt(e.agentType);return(pC[s]??Td)({agentType:e.agentType,actingUserId:e.actingUserId,cwd:e.cwd,effectiveConfig:r,promptPrefix:"",runtimeSkills:o})};var mC=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(`
114
- `),fC={OpenCode:async({params:e,prompt:t,runtimeEnv:r,runtimeArgs:n})=>zs({actingUserId:e.actingUserId,resumeSessionId:e.resumeSessionId,cwd:e.cwd,title:e.title,prompt:t,executionModel:e.executionModel,agentSettings:e.agentSettings,opencodeConfig:e.opencodeConfig,mcpServers:e.mcpServers,runtimeEnv:r,runtimeArgs:n,signal:e.signal,onEvent:o=>{M("OpenCode",e.onEvent,o)}}),Codex:async({params:e,prompt:t,runtimeEnv:r,runtimeArgs:n})=>id({...e,prompt:t,runtimeEnv:r,runtimeArgs:n}),ClaudeCode:async({params:e,prompt:t,runtimeEnv:r,runtimeArgs:n})=>Zu({...e,prompt:t,runtimeEnv:r,runtimeArgs:n}),Pi:async({params:e,prompt:t,runtimeEnv:r})=>Sd({...e,prompt:t,runtimeEnv:r})},Gr=async e=>{if(!e.skipRuntimeCheck){let s=await we({autoInstall:!0,target:e.agentType});if(!s.ok)throw new Error(s.message)}let t=await oo({attachments:e.attachments,cloudUrl:e.cloudUrl,signal:e.signal});le(e.cwd,e.runtimeEnvironment);let r=e.runtimePrepared?{promptPrefix:"",runtimeEnv:e.runtimeEnv??{},runtimeArgs:e.runtimeArgs??[],cleanup:()=>{}}:Ii({agentType:e.agentType,cwd:e.cwd,actingUserId:e.actingUserId,runtimeSkillPackages:e.runtimeSkillPackages,mcpServers:e.mcpServers}),n={...r.runtimeEnv,...e.runtimeEnv??{}},o=ud(uo(e.prompt,r.promptPrefix),t.attachments);try{let s=Tt(e.agentType),i=fC[s];if(!i)throw new Error(`\u6682\u672A\u914D\u7F6E ${s} prompt runner\u3002`);return await i({params:{...e,preparedAttachments:t.attachments},prompt:o,runtimeEnv:n,runtimeArgs:r.runtimeArgs})}finally{await t.cleanup(),r.cleanup()}},Ti=async e=>{if(!e.skipRuntimeCheck&&e.agentType==="OpenCode"){let n=await we({autoInstall:!0,target:e.agentType});if(!n.ok)throw new Error(n.message)}let t=Ii({agentType:e.agentType,cwd:e.cwd,actingUserId:e.actingUserId,runtimeSkillPackages:e.runtimeSkillPackages,mcpServers:e.mcpServers});le(e.cwd,e.runtimeEnvironment);let r={...t.runtimeEnv,...e.runtimeEnv??{}};if(e.agentType==="OpenCode")try{return await qs({actingUserId:e.actingUserId,cwd:e.cwd,title:e.title,description:uo(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 Gr({agentType:e.agentType,actingUserId:e.actingUserId,cwd:e.cwd,title:e.title,prompt:uo(mC(e),t.promptPrefix),executionModel:e.executionModel,agentSettings:e.agentSettings,mcpServers:e.mcpServers,runtimeSkillPackages:e.runtimeSkillPackages,runtimeEnv:r,runtimeArgs:t.runtimeArgs,runtimePrepared:!0,signal:e.signal})}finally{t.cleanup()}};var Rd=e=>{let t=e.promptQueueState??Ri(),{pendingPromptRequests:r,pendingPromptAborts:n,queuedPromptRequestIds:o}=t,s=u=>{let p=o.indexOf(u);p!==-1&&o.splice(p,1),e.setQueuedTaskIds(e.getQueuedTaskIds().filter(m=>m!==Dr(u)))},i=u=>{r.delete(u),n.delete(u),e.setRunningTaskIds(e.getRunningTaskIds().filter(p=>p!==Dr(u))),e.syncRuntimeState(),e.drainExecutionQueue()},a=u=>{let p=C();e.setConfig(p),s(u.requestId),e.setRunningTaskIds([...e.getRunningTaskIds(),Dr(u.requestId)]),e.syncRuntimeState(),console.log("[worker-agent] prompt request",JSON.stringify({requestId:u.requestId,agentType:u.agentType,cwd:u.cwd,agentWorkdir:u.agentWorkdir?.agentId??null,title:u.title,executionModel:u.executionModel??"default",attachmentCount:u.attachments?.length??0,promptPreview:u.prompt.slice(0,160)}));let m=u.agentWorkdir?.agentId?(()=>{let g=Yn(u.agentWorkdir.agentId);return ou(u.agentWorkdir.agentId,u.agentWorkdir.sessionId?.trim()||u.requestId),g.summary.workDirPath})():u.cwd,y=new AbortController;n.set(u.requestId,y),Gr({agentType:u.agentType,actingUserId:u.actingUserId,resumeSessionId:u.resumeSessionId,cwd:m,title:u.title,prompt:u.prompt,attachments:u.attachments,cloudUrl:p.cloudUrl,executionModel:u.executionModel,agentSettings:u.agentSettings??p.agentSettings[u.agentType],opencodeConfig:u.opencodeConfig,mcpServers:u.mcpServers,runtimeSkillPackages:u.runtimeSkillPackages,runtimeEnv:u.runtimeEnv,runtimeEnvironment:u.runtimeEnvironment,signal:y.signal,onEvent:g=>{p=e.getConfig(),e.send({type:"executor.agent.prompt.event",executorId:p.executorId,requestId:u.requestId,event:g,at:new Date().toISOString()})}}).then(g=>{p=e.getConfig(),console.log("[worker-agent] prompt response",JSON.stringify({requestId:u.requestId,ok:!0,sessionId:g.sessionId,outputPreview:g.output.slice(0,200)})),e.send({type:"executor.agent.prompt.response",executorId:p.executorId,requestId:u.requestId,result:{ok:!0,output:g.output,sessionId:g.sessionId},at:new Date().toISOString()})}).catch(g=>{p=e.getConfig(),console.log("[worker-agent] prompt response",JSON.stringify({requestId:u.requestId,ok:!1,error:g instanceof Error?g.message:`${u.agentType} \u6267\u884C\u5931\u8D25\u3002`})),e.send({type:"executor.agent.prompt.response",executorId:p.executorId,requestId:u.requestId,result:{ok:!1,output:g instanceof Error?g.message:`${u.agentType} \u6267\u884C\u5931\u8D25\u3002`},at:new Date().toISOString()})}).finally(()=>{i(u.requestId)})},c=()=>{let u=C();for(e.setConfig(u);e.getRunningTaskIds().length<Math.max(1,u.maxConcurrency)&&o.length>0;){let p=o[0];if(!p)break;let m=r.get(p);if(!m){s(p);continue}a(m),u=e.getConfig()}};return{abortActivePrompts:()=>{let u=[...r.keys()];if(u.length!==0){for(let p of u)s(p),r.delete(p),n.get(p)?.abort(),n.delete(p);e.syncRuntimeState()}},drainPromptQueue:c,handlePromptMessage:u=>u.type==="executor.agent.prompt.request"?(r.has(u.requestId)||(r.set(u.requestId,u),o.push(u.requestId),e.setQueuedTaskIds([...e.getQueuedTaskIds(),Dr(u.requestId)]),e.syncRuntimeState()),c(),!0):(s(u.requestId),r.delete(u.requestId),e.syncRuntimeState(),n.get(u.requestId)?.abort(),n.delete(u.requestId),e.drainExecutionQueue(),!0)}},Ri=()=>({pendingPromptRequests:new Map,pendingPromptAborts:new Map,queuedPromptRequestIds:[]});var gC=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"task",qr=e=>`task/${gC(e)}`;var hC=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."},yC=e=>{let t=hC(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(`
115
- `)},kC=(e,t)=>{let r=(e?.trim()||t?.trim()||"Worker delivery update").replace(/\s+/g," ");return r.length>72?`${r.slice(0,69)}...`:r},wC=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||qr(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||qr(e.taskId),n=e.filesChanged.length>0&&!!e.commitShas?.length;t.pullRequest={ready:n,remoteReady:!!e.remoteBranchName,repoUrl:e.repoUrl,title:n?kC(e.taskTitle,e.taskDescription):void 0,description:n?yC({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},ir=(e,t)=>({...e,delivery:wC({taskId:e.taskId,returnMode:e.returnMode,repoUrl:t.repoUrl,baseBranch:t.baseBranch,summary:e.summary,taskTitle:t.taskTitle,taskDescription:t.taskDescription,filesChanged:e.filesChanged,patchArtifactId:e.patchArtifactId,remoteBranchName:e.remoteBranchName,commitShas:e.commitShas})});import{mkdtempSync as jC,mkdirSync as FC,rmSync as zd,symlinkSync as GC}from"node:fs";import qC from"node:os";import Hd from"node:path";import{simpleGit as SC}from"simple-git";var xC=async e=>{let t=await e.status();return Array.from(new Set(t.files.map(r=>r.path))).sort()},CC=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}},_d=async(e,t,r)=>{let n=SC(t),o=await xC(n),s=await CC(n,e);return{filesChanged:o,commitShas:void 0,patchArtifact:s,remoteBranchName:e.returnMode==="branch"?r:void 0}};import{spawn as vC}from"node:child_process";var PC=["&&","||","|",";",">","<","$(","`"],EC=(e,t=1600)=>{let r=e.trim();return r?r.length>t?`${r.slice(0,t)}
116
- ...\uFF08\u5DF2\u622A\u65AD\uFF09`:r:""},bC=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},IC=e=>{let t=e.trim();if(!t)throw new Error("\u73AF\u5883\u6A21\u677F\u547D\u4EE4\u4E0D\u80FD\u4E3A\u7A7A\u3002");if(PC.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=bC(t),n={};for(;r.length>0&&/^[A-Za-z_][A-Za-z0-9_]*=.*/.test(r[0]);){let s=r.shift(),i=s.indexOf("=");n[s.slice(0,i)]=s.slice(i+1)}let o=r.shift();if(!o)throw new Error("\u73AF\u5883\u6A21\u677F\u547D\u4EE4\u7F3A\u5C11\u53EF\u6267\u884C\u547D\u4EE4\u3002");return{command:o,args:r,env:n}},Ad=(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},TC=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):[],_i=e=>{let t=TC(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(`
117
- `)},Md=async e=>{let t=IC(e.commandText);return await new Promise((r,n)=>{let o=vC(t.command,t.args,{cwd:e.cwd,env:{...e.env??process.env,...t.env},stdio:["ignore","pipe","pipe"]}),s="",i="",a=!1,c=()=>{a=!0,o.kill("SIGTERM")};e.signal?.addEventListener("abort",c,{once:!0}),o.stdout.on("data",l=>{s+=l.toString()}),o.stderr.on("data",l=>{i+=l.toString()}),o.on("error",l=>{e.signal?.removeEventListener("abort",c),n(new Error(`${e.label} \u542F\u52A8\u5931\u8D25\uFF1A${l.message}`))}),o.on("close",(l,d)=>{if(e.signal?.removeEventListener("abort",c),a){n(new Error(`${e.label} \u5DF2\u53D6\u6D88\u3002`));return}let u=EC([s,i].filter(Boolean).join(`
118
- `));if(l===0){r({output:u});return}let p=d?`\u4FE1\u53F7 ${d}`:`\u9000\u51FA\u7801 ${l??"unknown"}`;n(new Error([`${e.label} \u6267\u884C\u5931\u8D25\uFF08${p}\uFF09\u3002`,u].filter(Boolean).join(`
119
-
120
- `)))})})},Ai=async e=>{let t=Ad(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 Md({cwd:e.cwd,label:r,commandText:t,signal:e.signal,env:e.env});return e.emit("executing",n.output?`${r} \u5DF2\u5B8C\u6210\u3002
121
- ${n.output}`:`${r} \u5DF2\u5B8C\u6210\u3002`),`${r}\uFF1A${t}`},Mi=e=>{let t=Ad(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:Md({cwd:e.cwd,label:r,commandText:t,signal:e.signal,env:e.env})}},Oi=async(e,t)=>{let r=await e.promise;return t("executing",r.output?`${e.label} \u5DF2\u5B8C\u6210\u3002
122
- ${r.output}`:`${e.label} \u5DF2\u5B8C\u6210\u3002`),`${e.label}\uFF1A${e.commandText}`};import{createHash as RC}from"node:crypto";import{existsSync as Od,mkdirSync as Wd,rmSync as _C}from"node:fs";import ar from"node:path";import{simpleGit as zr}from"simple-git";var AC="main",Nd=(e,t)=>{let r={...Dt(t),...e?{baseDir:e}:{}};return zr(r).env(t??{})},MC=e=>RC("sha1").update(e).digest("hex").slice(0,12),OC=e=>e.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"repo",BC=(e,t)=>{let r=ar.basename(t).replace(/\.git$/i,"");return ar.join(e,"repos",`${OC(r)}-${MC(t)}`)},Dd=e=>e.baseCommit?.trim()||e.defaultBranch?.trim()||AC,Bi=e=>`origin/${e}`,WC=async(e,t,r)=>(await Nd(void 0,r).raw(["ls-remote","--heads",e,t])).trim().length>0,Bd=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}`])},Ud=async(e,t)=>(await e.branch(["-r"])).all.includes(Bi(t)),NC=async(e,t)=>{await e.fetch(["--all","--prune"]),await Ud(e,t)&&await e.rebase([Bi(t)])},$d=e=>e.gitIdentity??{mode:e.gitIdentityMode??"personal"},Ld=e=>e.workingDirectoryMode==="original-dir"?"original-dir":"worktree",DC=(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,UC=async e=>{let t=await e.raw(["worktree","list","--porcelain"]),r=[],n=null;for(let o of t.split(`
123
- `)){if(o.startsWith("worktree ")){n&&r.push(n),n={path:ar.resolve(o.slice(9).trim())};continue}o.startsWith("branch ")&&n&&(n.branch=o.slice(7).trim())}return n&&r.push(n),r},$C=async(e,t)=>(await e.branchLocal()).all.includes(t),LC=e=>{_C(e,{recursive:!0,force:!0,maxRetries:5,retryDelay:100})},jd=async(e,t,r)=>{let n=zr(e),o=ar.resolve(t),s=`refs/heads/${r}`;try{await n.raw(["worktree","prune"])}catch{}let a=(await UC(n)).find(c=>c.branch===s);if(a&&a.path!==o)try{await n.raw(["worktree","remove","--force",a.path])}catch{}try{await n.raw(["worktree","remove","--force",o])}catch{}if(LC(o),await $C(n,r))try{await n.deleteLocalBranch(r,!0)}catch{}try{await n.raw(["worktree","prune"])}catch{}Wd(ar.dirname(o),{recursive:!0})},Fd=async e=>{let t=DC(e.bindings,e.task)||BC(e.workspaceRoot,e.task.repoUrl),r=Dd(e.task);if(Wd(ar.dirname(t),{recursive:!0}),e.task.versionControl==="git-local"){let s=zr(t).env(e.env??{});if(!Od(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}}Od(t)||(console.log("[worker] [task-worktree] cloning target branch only",JSON.stringify({repoDir:t,repoUrl:e.task.repoUrl,startPoint:r})),await zr().env(e.env??{}).clone(e.task.repoUrl,t,["--no-checkout","--single-branch","--branch",r]));let n=zr(t).env(e.env??{});await Bd(n,r);let o=await WC(e.task.repoUrl,e.branchName,e.env);return o&&e.branchName!==r&&await Bd(n,e.branchName),{repoDir:t,git:n,taskBranchExists:o}},Gd=async e=>{let t=e.taskBranchExists||await Ud(e.git,e.branchName)?Bi(e.branchName):Dd(e.task);return await e.git.checkout(["-B",e.branchName,t]),t},qd=async e=>{let t=Nd(e.worktreePath,e.env),r=await t.status(),n=Array.from(new Set(r.files.map(a=>a.path))).sort();if(n.length===0)return{changedFiles:n,commitShas:void 0,remoteBranchName:void 0,pushMessage:"\u6CA1\u6709\u6587\u4EF6\u6539\u52A8\uFF0C\u8DF3\u8FC7\u63D0\u4EA4\u4E0E\u63A8\u9001\u3002"};if(e.task.autoCommitEnabled===!1)return{changedFiles:n,commitShas:void 0,remoteBranchName:void 0,pushMessage:"\u5F53\u524D\u5DE5\u4F5C\u533A\u5DF2\u5173\u95ED\u81EA\u52A8\u63D0\u4EA4 / \u63A8\u9001\uFF0C\u6539\u52A8\u4FDD\u7559\u5728\u672C\u5730\u76EE\u5F55\u3002"};if(e.task.returnMode!=="branch"&&e.task.returnMode!=="commit")return{changedFiles:n,commitShas:void 0,remoteBranchName:void 0,pushMessage:void 0};if(!e.identity.name||!e.identity.email)throw new Error("\u5F53\u524D\u4EFB\u52A1\u7F3A\u5C11 Git \u7528\u6237\u540D\u6216\u90AE\u7BB1\uFF0C\u8BF7\u5148\u5728\u8BBE\u7F6E\u9875\u5B8C\u6210 Git \u6388\u6743\u914D\u7F6E\u3002");await t.add(["--all"]),await t.commit(`vibemux: ${e.task.id}`);let o=(await t.revparse(["HEAD"])).trim(),s,i="\u5DF2\u521B\u5EFA\u672C\u5730\u63D0\u4EA4\u3002";return e.identity.credentialToken?(await NC(t,e.branchName),await t.push(["-u","origin",e.branchName]),s=e.branchName,i=`\u5DF2\u63A8\u9001\u8FDC\u7AEF\u5206\u652F ${e.branchName}\u3002`):(e.task.returnMode==="branch"||e.task.returnMode==="commit")&&(i="\u7F3A\u5C11 task \u7EA7\u4E34\u65F6\u51ED\u8BC1\uFF0C\u5DF2\u521B\u5EFA\u672C\u5730\u63D0\u4EA4\u4F46\u672A\u63A8\u9001\u8FDC\u7AEF\u3002"),{changedFiles:n,commitShas:o?[o]:void 0,remoteBranchName:s,pushMessage:i}};var zC="vibemux-task-runtime-",HC=e=>e==="Codex"||e==="ClaudeCode",Vd=(e,t)=>{if(!HC(e.agentType))return{cwd:t,cleanup:()=>{}};let r=jC(Hd.join(qC.tmpdir(),`${zC}${e.id.slice(0,8)}-`)),n=Hd.join(r,"workspace");try{return GC(t,n,process.platform==="win32"?"junction":"dir"),{cwd:n,cleanup:()=>{zd(r,{recursive:!0,force:!0})}}}catch{return zd(r,{recursive:!0,force:!0}),{cwd:t,cleanup:()=>{}}}},Jd=async e=>{let t=new Date().toISOString(),r=qr(e.task.id),n=La(e.workspaceRoot,e.task.id,e.task.workspaceId),o=Ld(e.task),s=null,i=null,a=null;try{e.emit("preparing","\u68C0\u67E5 Worker \u8FD0\u884C\u73AF\u5883");let c=await we({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 B=e.task.rootPath?.trim()||n;FC(B,{recursive:!0}),le(B,e.runtimeEnvironment),e.emit("preparing",`\u9879\u76EE\u76EE\u5F55\u5DF2\u5C31\u7EEA\uFF1A${B}`);let $=Vd(e.task,B);a=$.cleanup;let v=Mi({step:"install",task:e.task,cwd:B,signal:e.signal,emit:e.emit}),I=[];v&&I.push(await Oi(v,e.emit)),e.emit("executing",`\u5F00\u59CB\u8C03\u7528 ${e.task.agentType} \u6267\u884C\u4EFB\u52A1`);let P=await Ti({agentType:e.task.agentType,actingUserId:e.task.requestedByUserId,cwd:$.cwd,title:`Distributed Task ${e.task.id}`,description:_i(e.task),executionModel:e.task.executionModel??e.task.opencodeConfig?.model,agentSettings:e.task.agentSettings,opencodeConfig:e.task.opencodeConfig,mcpServers:e.task.mcpServers,skipRuntimeCheck:!0,runtimeSkillPackages:e.task.runtimeSkillPackages,runtimeEnv:e.task.runtimeEnv,runtimeEnvironment:e.runtimeEnvironment,signal:e.signal});for(let f of["build","test","lint"]){let h=await Ai({step:f,task:e.task,cwd:B,signal:e.signal,emit:e.emit});h&&I.push(h)}let O=new Date().toISOString(),S=ir({taskId:e.task.id,status:"completed",returnMode:e.task.returnMode,summary:[I.length>0?`\u5DF2\u6267\u884C\u9879\u76EE\u9884\u8BBE\u547D\u4EE4\uFF1A
124
- ${I.map(f=>`- ${f}`).join(`
125
- `)}`:void 0,P.output].filter(Boolean).join(`
126
-
127
- `),output:P.output,filesChanged:[],startedAt:t,completedAt:O,durationSec:Math.max(0,Math.round((new Date(O).getTime()-new Date(t).getTime())/1e3)),executorNodeId:e.executorId,agentSessionId:P.sessionId,opencodeSessionId:P.sessionId},{repoUrl:e.task.repoUrl,baseBranch:e.task.defaultBranch,taskDescription:e.task.description});return{task:{...e.task,status:"completed",startedAt:t,completedAt:O,updatedAt:O,result:S}}}let l=$d(e.task);i=Ge({taskId:e.task.id,identity:l,repoUrl:e.task.repoUrl}),e.emit("preparing","\u51C6\u5907\u672C\u5730\u4ED3\u5E93");let{repoDir:d,git:u,taskBranchExists:p}=await Fd({workspaceRoot:e.workspaceRoot,task:e.task,branchName:r,bindings:e.projectBindings,env:Ae(i.env,e.runtimeEnvironment)});e.emit("preparing",`\u4ED3\u5E93\u5DF2\u5C31\u7EEA\uFF1A${d}`);let m=o==="original-dir"?e.task.rootPath?.trim()||d:n;if(o==="worktree"){await jd(d,n,r);let B=p||await u.branch(["-r"]).then($=>$.all.includes(`origin/${r}`))?`origin/${r}`:e.task.baseCommit?.trim()||e.task.defaultBranch?.trim()||"main";await u.raw(["worktree","add","--force","-B",r,n,B]),e.emit("executing",`\u5DF2\u521B\u5EFA worktree\uFF1A${n}`)}else{let B=await Gd({git:u,task:e.task,branchName:r,taskBranchExists:p});e.emit("executing",`\u5DF2\u5728\u539F\u59CB\u76EE\u5F55 ${m} \u5207\u6362\u5230 ${B} \u5E76\u5F00\u59CB\u6267\u884C`)}le(m,e.runtimeEnvironment),s=cu({taskId:e.task.id,worktreePath:m,identity:l,repoUrl:e.task.repoUrl});let y=Ae(s.env,e.runtimeEnvironment),g=Vd(e.task,m);a=g.cleanup;let w=Mi({step:"install",task:e.task,cwd:m,signal:e.signal,env:y,emit:e.emit}),k=[];w&&k.push(await Oi(w,e.emit)),e.emit("executing",`\u5F00\u59CB\u8C03\u7528 ${e.task.agentType} \u6267\u884C\u4EFB\u52A1`);let E=await Ti({agentType:e.task.agentType,actingUserId:e.task.requestedByUserId,cwd:g.cwd,title:`Distributed Task ${e.task.id}`,description:_i(e.task),executionModel:e.task.executionModel??e.task.opencodeConfig?.model,agentSettings:e.task.agentSettings,opencodeConfig:e.task.opencodeConfig,mcpServers:e.task.mcpServers,skipRuntimeCheck:!0,runtimeSkillPackages:e.task.runtimeSkillPackages,runtimeEnv:e.task.runtimeEnv,runtimeEnvironment:e.runtimeEnvironment,signal:e.signal});for(let B of["build","test","lint"]){let $=await Ai({step:B,task:e.task,cwd:m,signal:e.signal,env:y,emit:e.emit});$&&k.push($)}let b=await qd({task:e.task,worktreePath:m,branchName:r,identity:l,env:y}),T=await _d(e.task,m,r),N;T.patchArtifact&&e.uploadPatchArtifact&&(e.emit("syncing_back","\u6B63\u5728\u4E0A\u4F20 patch \u4EA7\u7269\u5230\u63A7\u5236\u9762"),N=(await e.uploadPatchArtifact({taskId:e.task.id,filename:T.patchArtifact.filename,content:T.patchArtifact.content})).artifactId);let _=new Date().toISOString(),J=ir({taskId:e.task.id,status:"completed",returnMode:e.task.returnMode,summary:[k.length>0?`\u5DF2\u6267\u884C\u9879\u76EE\u9884\u8BBE\u547D\u4EE4\uFF1A
128
- ${k.map(B=>`- ${B}`).join(`
129
- `)}`:void 0,E.output,b.pushMessage].filter(Boolean).join(`
130
-
131
- `),output:E.output,filesChanged:b.changedFiles.length>0?b.changedFiles:T.filesChanged,remoteBranchName:b.remoteBranchName,commitShas:b.commitShas??T.commitShas,patchArtifactId:N,startedAt:t,completedAt:_,durationSec:Math.max(0,Math.round((new Date(_).getTime()-new Date(t).getTime())/1e3)),executorNodeId:e.executorId,agentSessionId:E.sessionId,opencodeSessionId:E.sessionId},{repoUrl:e.task.repoUrl,baseBranch:e.task.defaultBranch,taskDescription:e.task.description});return{task:{...e.task,status:"completed",startedAt:t,completedAt:_,updatedAt:_,result:J}}}catch(c){let l=new Date().toISOString(),d=c instanceof Error?c.message:"worker task execution failed";return{task:{...e.task,status:"failed",startedAt:t,completedAt:l,updatedAt:l,errorMessage:d,result:ir({taskId:e.task.id,status:"failed",returnMode:e.task.returnMode,summary:d,output:d,filesChanged:[],startedAt:t,completedAt:l,durationSec:Math.max(0,Math.round((new Date(l).getTime()-new Date(t).getTime())/1e3)),executorNodeId:e.executorId},{repoUrl:e.task.repoUrl,baseBranch:e.task.defaultBranch,taskDescription:e.task.description})}}}finally{a?.(),s?.cleanup(),i?.cleanup()}};var Wi=new Map,Ni=e=>{let t=Wi.get(e);if(t){for(let r of t)clearTimeout(r);Wi.delete(e)}},Kd=(e,t,r)=>{let n=new Date().toISOString();return{...e,status:"cancelled",executorNodeId:t,completedAt:n,updatedAt:n,result:ir({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})}},Xd=Ni,Yd=e=>{let{task:t,executorId:r,workspaceRoot:n,projectBindings:o,uploadPatchArtifact:s,send:i}=e,a=new AbortController,c=[setTimeout(()=>{e.onStart(t.id),Jd({task:t,runtimeEnvironment:e.runtimeEnvironment,executorId:r,workspaceRoot:n,projectBindings:o,signal:a.signal,uploadPatchArtifact:s,emit(l,d){a.signal.aborted||i({type:"task.event",taskId:t.id,idempotencyKey:t.idempotencyKey,executorId:r,status:l,message:d,at:new Date().toISOString()})}}).then(({task:l})=>{a.signal.aborted||(e.onFinish(t.id),i({type:"task.result",executorId:r,task:l}),Ni(t.id))})},20)];return Wi.set(t.id,c),{abort(){a.abort(),e.onFinish(t.id),Ni(t.id)}}};var Qd=(e,t)=>{let r=t.getConfig();if(e.type==="task.assign"){let n=t.getRunningTaskIds(),o=t.getQueuedTaskIds();return t.assignedTasks.has(e.task.id)||n.includes(e.task.id)||o.includes(e.task.id)?(t.assignedTasks.set(e.task.id,{task:e.task,runtimeEnvironment:e.runtimeEnvironment}),!0):(t.assignedTasks.set(e.task.id,{task:e.task,runtimeEnvironment:e.runtimeEnvironment}),t.setQueuedTaskIds([...o,e.task.id]),t.syncRuntimeState(),t.send({type:"task.ack",taskId:e.task.id,idempotencyKey:e.task.idempotencyKey,executorId:r.executorId,accepted:!0}),t.drainExecutionQueue(),!0)}if(e.type==="task.cancel"){let n=t.assignedTasks.get(e.taskId);return t.activeExecutions.get(e.taskId)?.abort(),t.activeExecutions.delete(e.taskId),Xd(e.taskId),t.assignedTasks.delete(e.taskId),t.setQueuedTaskIds(t.getQueuedTaskIds().filter(o=>o!==e.taskId)),t.setRunningTaskIds(t.getRunningTaskIds().filter(o=>o!==e.taskId)),t.syncRuntimeState(),t.drainExecutionQueue(),n&&t.send({type:"task.result",executorId:r.executorId,task:Kd(n.task,r.executorId,e.reason)}),!0}return!1};var Zd=(e,t)=>{let r=t.getConfig(),n=()=>(r=C(),t.setConfig(r),r);if(e.type==="executor.terminal.request"){n();let o=Date.now(),s=e.cwd||r.workspaceRoot;return Me("received one-shot terminal request",{requestId:e.requestId,command:e.command,cwd:s,mode:e.mode??"wait"}),t.runTerminalCommand(e.command,s,{mode:e.mode??"wait",runtimeEnvironment:e.runtimeEnvironment}).then(i=>{let a=Date.now()-o;Me("completed one-shot terminal request",{requestId:e.requestId,cwd:s,mode:e.mode??"wait",durationMs:a,exitCode:i.exitCode,detached:i.detached,pid:i.pid,stdout:i.stdout,stderr:i.stderr}),t.send({type:"executor.terminal.response",executorId:r.executorId,requestId:e.requestId,result:i})}).catch(i=>{Me("failed one-shot terminal request",{requestId:e.requestId,cwd:s,mode:e.mode??"wait",durationMs:Date.now()-o,error:i instanceof Error?i.message:String(i)})}),!0}if(e.type==="executor.terminal.session.open"){n();let o=e.cwd||r.workspaceRoot;Me("received terminal session open",{sessionId:e.sessionId,cwd:o});let s=t.openTerminalSession({cwd:o,runtimeEnvironment:e.runtimeEnvironment,onExit:i=>{t.terminalSessions.delete(e.sessionId),t.send({type:"executor.terminal.session.exit",executorId:r.executorId,sessionId:e.sessionId,exitCode:i,at:new Date().toISOString()})},onLog:(i,a)=>{Me(i,{sessionId:e.sessionId,...a})},onOutput:(i,a)=>{r.executorId&&Xu({send:t.send,executorId:r.executorId,sessionId:e.sessionId,stream:i,chunk:a})},onReady:(i,a)=>{t.send({type:"executor.terminal.session.ready",executorId:r.executorId,sessionId:e.sessionId,cwd:o,mode:i,at:new Date().toISOString()}),Me("terminal session ready",{sessionId:e.sessionId,cwd:o,mode:i,backend:a})}});return t.terminalSessions.set(e.sessionId,s),!0}if(e.type==="executor.terminal.session.input")return Me("received terminal session input",{sessionId:e.sessionId,inputLength:e.input.length,preview:e.input.slice(0,80)}),t.terminalSessions.get(e.sessionId)?.write(e.input),!0;if(e.type==="executor.terminal.session.resize")return Me("received terminal session resize",{sessionId:e.sessionId,cols:e.cols,rows:e.rows}),t.terminalSessions.get(e.sessionId)?.resize(e.cols,e.rows),!0;if(e.type==="executor.terminal.session.close"){Me("received terminal session close",{sessionId:e.sessionId});let o=t.terminalSessions.get(e.sessionId);return o&&(o.kill(),t.terminalSessions.delete(e.sessionId)),!0}return!1};var ep=e=>{let t=Rd(e),r=n=>{if(e.getCurrentSocket()===e.expectedSocket&&!Vl(n,e)&&!Yu(n,e)&&!Qu(n,e)){if(n.type==="executor.agent.prompt.request"||n.type==="executor.agent.prompt.cancel"){t.handlePromptMessage(n);return}Zd(n,e)||Qd(n,e)}};return{abortActivePrompts:t.abortActivePrompts,handleMessage:r,drainPromptQueue:t.drainPromptQueue}};import{existsSync as Di,mkdirSync as VC,readFileSync as tp}from"node:fs";import{spawnSync as JC}from"node:child_process";import KC from"node:os";import po from"node:path";var rp=po.join(KC.homedir(),".ssh"),XC=["id_ed25519.pub","id_rsa.pub","id_ecdsa.pub"],YC="vibemux_worker_ed25519",QC=e=>{VC(po.dirname(e),{recursive:!0});let t=JC("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())},Ui=()=>{try{for(let r of XC){let n=po.join(rp,r);if(Di(n))return tp(n,"utf8").trim()}let e=po.join(rp,YC),t=`${e}.pub`;return Di(t)||QC(e),Di(t)?tp(t,"utf8").trim():void 0}catch{return}};import{spawn as fo,spawnSync as ZC}from"node:child_process";import{accessSync as ev,constants as tv,mkdtempSync as rv,readFileSync as nv,rmSync as ov}from"node:fs";import $i from"node:os";import{createRequire as sv}from"node:module";import Li from"node:path";import{StringDecoder as np}from"node:string_decoder";var lp=120,up=32,ji="xterm-256color",iv=250,av=1500,op=24e3,cv=1500,lv=sv(import.meta.url),uv=String.raw`
105
+ `);let m=t.codexAuthContent?.trim();return m?pr(a,`${m}
106
+ `):_e(i)&&!_e(a)&&rl(i,a),{runtimeEnv:{CODEX_HOME:n,...u.env},cleanup:()=>{tl(e)&&At(n,{recursive:!0,force:!0})}}},ck=(e,t)=>{let n=ci("claude-home"),r=W.join(n,"mcp.json"),o=process.env.CLAUDE_HOME?.trim()||W.join(ai.homedir(),".claude"),s=[W.join(o,"settings.json"),W.join(o,"config.json")].reduce((l,u)=>{if(l.trim()||!_e(u))return l;try{return ii(u,"utf8").trim()}catch{return l}},""),a=e.claudeCodeConfigContent?.trim()||s,c=a?ek(a):null;if(a){if(!c)throw At(n,{recursive:!0,force:!0}),new Error("Claude Code settings.json \u683C\u5F0F\u4E0D\u6B63\u786E\u3002");oi(W.join(n,"settings.json"),c.settings)}for(let l of Jy){let u=W.join(o,l),d=W.join(n,l);_e(u)&&!_e(d)&&rl(u,d)}return oi(r,sk(e,t)),{runtimeArgs:["--mcp-config",r],runtimeEnv:{CLAUDE_HOME:n,...c?.runtimeEnv??{}},cleanup:()=>{At(n,{recursive:!0,force:!0})}}},lk=(e,t)=>{let n=ck(e,t);return{runtimeArgs:n.runtimeArgs,runtimeEnv:n.runtimeEnv,cleanup:()=>{n.cleanup()}}},mr=(e,t)=>{let n=t.trim();return n?[n,"",e].join(`
107
+ `):e},al=e=>({promptPrefix:e.promptPrefix,runtimeEnv:{},runtimeArgs:[],cleanup:()=>{e.runtimeSkills?.cleanup()}}),dk=e=>{let t=ak(e.cwd,e.effectiveConfig);return{promptPrefix:e.promptPrefix,runtimeEnv:t.runtimeEnv,runtimeArgs:[],cleanup:()=>{e.runtimeSkills?.cleanup(),t.cleanup()}}},uk=e=>{let t=lk(e.effectiveConfig,e.actingUserId);return{promptPrefix:e.promptPrefix,runtimeEnv:t.runtimeEnv,runtimeArgs:t.runtimeArgs,cleanup:()=>{e.runtimeSkills?.cleanup(),t.cleanup()}}},pk=e=>{let t=e.effectiveConfig.agentSettings.Pi.agentDir?.trim()||e.effectiveConfig.piAgentDir?.trim()||W.join(ai.homedir(),".pi","agent"),n=e.runtimeSkills?.promptRoot?.trim();return{promptPrefix:e.promptPrefix,runtimeEnv:{VIBEMUX_PI_AGENT_DIR:t,...n?{VIBEMUX_PI_SKILL_PATHS:n}:{}},runtimeArgs:[],cleanup:()=>{e.runtimeSkills?.cleanup()}}},mk={OpenCode:al,Codex:dk,ClaudeCode:uk,Pi:pk},li=e=>{let t=e.workerConfig??C(),n=e.mcpServers?{...t,mcpServers:e.mcpServers}:t,r=e.runtimeSkillPackages??[],o=_e(e.cwd)?ok(e.agentType,e.cwd,r):null,i=at(e.agentType);return(mk[i]??al)({agentType:e.agentType,actingUserId:e.actingUserId,cwd:e.cwd,effectiveConfig:n,promptPrefix:"",runtimeSkills:o})};var gk=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(`
108
+ `),fk={OpenCode:async({params:e,prompt:t,runtimeEnv:n,runtimeArgs:r})=>bo({actingUserId:e.actingUserId,resumeSessionId:e.resumeSessionId,cwd:e.cwd,title:e.title,prompt:t,executionModel:e.executionModel,agentSettings:e.agentSettings,opencodeConfig:e.opencodeConfig,mcpServers:e.mcpServers,runtimeEnv:n,runtimeArgs:r,signal:e.signal,onEvent:o=>{A("OpenCode",e.onEvent,o)}}),Codex:async({params:e,prompt:t,runtimeEnv:n,runtimeArgs:r})=>Uc({...e,prompt:t,runtimeEnv:n,runtimeArgs:r}),ClaudeCode:async({params:e,prompt:t,runtimeEnv:n,runtimeArgs:r})=>Oc({...e,prompt:t,runtimeEnv:n,runtimeArgs:r}),Pi:async({params:e,prompt:t,runtimeEnv:n})=>Zc({...e,prompt:t,runtimeEnv:n})},cn=async e=>{if(!e.skipRuntimeCheck){let i=await pe({autoInstall:!0,target:e.agentType});if(!i.ok)throw new Error(i.message)}let t=await ar({attachments:e.attachments,cloudUrl:e.cloudUrl,signal:e.signal});oe(e.cwd,e.runtimeEnvironment);let n=e.runtimePrepared?{promptPrefix:"",runtimeEnv:e.runtimeEnv??{},runtimeArgs:e.runtimeArgs??[],cleanup:()=>{}}:li({agentType:e.agentType,cwd:e.cwd,actingUserId:e.actingUserId,runtimeSkillPackages:e.runtimeSkillPackages,mcpServers:e.mcpServers}),r={...n.runtimeEnv,...e.runtimeEnv??{}},o=Gc(mr(e.prompt,n.promptPrefix),t.attachments);try{let i=at(e.agentType),s=fk[i];if(!s)throw new Error(`\u6682\u672A\u914D\u7F6E ${i} prompt runner\u3002`);return await s({params:{...e,preparedAttachments:t.attachments},prompt:o,runtimeEnv:r,runtimeArgs:n.runtimeArgs})}finally{await t.cleanup(),n.cleanup()}},di=async e=>{if(!e.skipRuntimeCheck&&e.agentType==="OpenCode"){let r=await pe({autoInstall:!0,target:e.agentType});if(!r.ok)throw new Error(r.message)}let t=li({agentType:e.agentType,cwd:e.cwd,actingUserId:e.actingUserId,runtimeSkillPackages:e.runtimeSkillPackages,mcpServers:e.mcpServers});oe(e.cwd,e.runtimeEnvironment);let n={...t.runtimeEnv,...e.runtimeEnv??{}};if(e.agentType==="OpenCode")try{return await Io({actingUserId:e.actingUserId,cwd:e.cwd,title:e.title,description:mr(e.description,t.promptPrefix),executionModel:e.executionModel,agentSettings:e.agentSettings,opencodeConfig:e.opencodeConfig,mcpServers:e.mcpServers,runtimeEnv:n,runtimeArgs:t.runtimeArgs,signal:e.signal})}finally{t.cleanup()}try{return await cn({agentType:e.agentType,actingUserId:e.actingUserId,cwd:e.cwd,title:e.title,prompt:mr(gk(e),t.promptPrefix),executionModel:e.executionModel,agentSettings:e.agentSettings,mcpServers:e.mcpServers,runtimeSkillPackages:e.runtimeSkillPackages,runtimeEnv:n,runtimeArgs:t.runtimeArgs,runtimePrepared:!0,signal:e.signal})}finally{t.cleanup()}};var cl=e=>{let t=e.promptQueueState??ui(),{pendingPromptRequests:n,pendingPromptAborts:r,queuedPromptRequestIds:o}=t,i=d=>{let m=o.indexOf(d);m!==-1&&o.splice(m,1),e.setQueuedTaskIds(e.getQueuedTaskIds().filter(g=>g!==tn(d)))},s=d=>{n.delete(d),r.delete(d),e.setRunningTaskIds(e.getRunningTaskIds().filter(m=>m!==tn(d))),e.syncRuntimeState(),e.drainExecutionQueue()},a=d=>{let m=C();e.setConfig(m),i(d.requestId),e.setRunningTaskIds([...e.getRunningTaskIds(),tn(d.requestId)]),e.syncRuntimeState(),console.log("[worker-agent] prompt request",JSON.stringify({requestId:d.requestId,agentType:d.agentType,cwd:d.cwd,agentWorkdir:d.agentWorkdir?.agentId??null,title:d.title,executionModel:d.executionModel??"default",attachmentCount:d.attachments?.length??0,promptPreview:d.prompt.slice(0,160)}));let g=d.agentWorkdir?.agentId?(()=>{let h=er(d.agentWorkdir.agentId);return $a(d.agentWorkdir.agentId,d.agentWorkdir.sessionId?.trim()||d.requestId),h.summary.workDirPath})():d.cwd,k=new AbortController;r.set(d.requestId,k),cn({agentType:d.agentType,actingUserId:d.actingUserId,resumeSessionId:d.resumeSessionId,cwd:g,title:d.title,prompt:d.prompt,attachments:d.attachments,cloudUrl:m.cloudUrl,executionModel:d.executionModel,agentSettings:d.agentSettings??m.agentSettings[d.agentType],opencodeConfig:d.opencodeConfig,mcpServers:d.mcpServers,runtimeSkillPackages:d.runtimeSkillPackages,runtimeEnv:d.runtimeEnv,runtimeEnvironment:d.runtimeEnvironment,signal:k.signal,onEvent:h=>{m=e.getConfig(),e.send({type:"executor.agent.prompt.event",executorId:m.executorId,requestId:d.requestId,event:h,at:new Date().toISOString()})}}).then(h=>{m=e.getConfig(),console.log("[worker-agent] prompt response",JSON.stringify({requestId:d.requestId,ok:!0,sessionId:h.sessionId,outputPreview:h.output.slice(0,200)})),e.send({type:"executor.agent.prompt.response",executorId:m.executorId,requestId:d.requestId,result:{ok:!0,output:h.output,sessionId:h.sessionId},at:new Date().toISOString()})}).catch(h=>{m=e.getConfig(),console.log("[worker-agent] prompt response",JSON.stringify({requestId:d.requestId,ok:!1,error:h instanceof Error?h.message:`${d.agentType} \u6267\u884C\u5931\u8D25\u3002`})),e.send({type:"executor.agent.prompt.response",executorId:m.executorId,requestId:d.requestId,result:{ok:!1,output:h instanceof Error?h.message:`${d.agentType} \u6267\u884C\u5931\u8D25\u3002`},at:new Date().toISOString()})}).finally(()=>{s(d.requestId)})},c=()=>{let d=C();for(e.setConfig(d);e.getRunningTaskIds().length<Math.max(1,d.maxConcurrency)&&o.length>0;){let m=o[0];if(!m)break;let g=n.get(m);if(!g){i(m);continue}a(g),d=e.getConfig()}};return{abortActivePrompts:()=>{let d=[...n.keys()];if(d.length!==0){for(let m of d)i(m),n.delete(m),r.get(m)?.abort(),r.delete(m);e.syncRuntimeState()}},drainPromptQueue:c,handlePromptMessage:d=>d.type==="executor.agent.prompt.request"?(n.has(d.requestId)||(n.set(d.requestId,d),o.push(d.requestId),e.setQueuedTaskIds([...e.getQueuedTaskIds(),tn(d.requestId)]),e.syncRuntimeState()),c(),!0):(i(d.requestId),n.delete(d.requestId),e.syncRuntimeState(),r.get(d.requestId)?.abort(),r.delete(d.requestId),e.drainExecutionQueue(),!0)}},ui=()=>({pendingPromptRequests:new Map,pendingPromptAborts:new Map,queuedPromptRequestIds:[]});var hk=e=>e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"task",ln=e=>`task/${hk(e)}`;var yk=e=>{let t=e.split(/\r?\n/).map(n=>n.trim()).find(Boolean);return t?t.length>160?`${t.slice(0,157)}...`:t:"Worker completed the task."},kk=e=>{let t=yk(e.summary),n=(e.taskTitle?.trim()||e.taskDescription?.trim()||"Worker delivery update").replace(/\s+/g," "),r=e.filesChanged.length>0?e.filesChanged.join(", "):"none";return["## Summary",`- ${n}`,`- ${t}`,`- Changed files: ${r}`,"","## Delivery",`- Base branch: ${e.baseBranch}`,`- Compare branch: ${e.compareBranch}`,e.commitShas?.[0]?`- Commit: ${e.commitShas[0]}`:null].filter(Boolean).join(`
109
+ `)},wk=(e,t)=>{let n=(e?.trim()||t?.trim()||"Worker delivery update").replace(/\s+/g," ");return n.length>72?`${n.slice(0,69)}...`:n},Sk=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 n=e.remoteBranchName||ln(e.taskId),r=e.filesChanged.length>0&&!!e.commitShas?.length,o=!!e.remoteBranchName;t.branch={branchName:n,repoUrl:e.repoUrl,baseBranch:e.baseBranch,pushed:o,suggestedNextStep:r?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:r?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&&!r&&(t.syncFailureReason=t.branch.reason)}if(e.returnMode==="commit"){let n=e.remoteBranchName||ln(e.taskId),r=e.filesChanged.length>0&&!!e.commitShas?.length;t.pullRequest={ready:r,remoteReady:!!e.remoteBranchName,repoUrl:e.repoUrl,title:r?wk(e.taskTitle,e.taskDescription):void 0,description:r?kk({summary:e.summary,taskTitle:e.taskTitle,taskDescription:e.taskDescription,filesChanged:e.filesChanged,baseBranch:e.baseBranch,compareBranch:n,commitShas:e.commitShas}):void 0,baseBranch:e.baseBranch,compareBranch:n,reason:r?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},Mt=(e,t)=>({...e,delivery:Sk({taskId:e.taskId,returnMode:e.returnMode,repoUrl:t.repoUrl,baseBranch:t.baseBranch,summary:e.summary,taskTitle:t.taskTitle,taskDescription:t.taskDescription,filesChanged:e.filesChanged,patchArtifactId:e.patchArtifactId,remoteBranchName:e.remoteBranchName,commitShas:e.commitShas})});import{mkdtempSync as Fk,mkdirSync as Gk,rmSync as vl,symlinkSync as qk}from"node:fs";import zk from"node:os";import El from"node:path";import{simpleGit as xk}from"simple-git";var Ck=async e=>{let t=await e.status();return Array.from(new Set(t.files.map(n=>n.path))).sort()},Pk=async(e,t)=>{if(t.returnMode!=="patch")return;await e.add(["--all"]);let n=await e.diff(["--cached","--binary",t.baseCommit]);if(n.trim())return{filename:`${t.id}.patch`,content:n}},ll=async(e,t,n)=>{let r=xk(t),o=await Ck(r),i=await Pk(r,e);return{filesChanged:o,commitShas:void 0,patchArtifact:i,remoteBranchName:e.returnMode==="branch"?n:void 0}};import{spawn as vk}from"node:child_process";var Ek=["&&","||","|",";",">","<","$(","`"],Ik=(e,t=1600)=>{let n=e.trim();return n?n.length>t?`${n.slice(0,t)}
110
+ ...\uFF08\u5DF2\u622A\u65AD\uFF09`:n:""},bk=e=>{let t=[],n="",r=null,o=!1;for(let i of e){if(o){n+=i,o=!1;continue}if(i==="\\"){o=!0;continue}if(r){i===r?r=null:n+=i;continue}if(i==='"'||i==="'"){r=i;continue}if(/\s/.test(i)){n&&(t.push(n),n="");continue}n+=i}if(o&&(n+="\\"),r)throw new Error("\u73AF\u5883\u6A21\u677F\u547D\u4EE4\u5B58\u5728\u672A\u95ED\u5408\u7684\u5F15\u53F7\u3002");return n&&t.push(n),t},Rk=e=>{let t=e.trim();if(!t)throw new Error("\u73AF\u5883\u6A21\u677F\u547D\u4EE4\u4E0D\u80FD\u4E3A\u7A7A\u3002");if(Ek.some(i=>t.includes(i)))throw new Error("\u73AF\u5883\u6A21\u677F\u547D\u4EE4\u53EA\u652F\u6301\u5355\u6761\u547D\u4EE4\uFF0C\u4E0D\u652F\u6301 shell \u7BA1\u9053\u3001\u91CD\u5B9A\u5411\u6216\u4E32\u8054\u64CD\u4F5C\u3002");let n=bk(t),r={};for(;n.length>0&&/^[A-Za-z_][A-Za-z0-9_]*=.*/.test(n[0]);){let i=n.shift(),s=i.indexOf("=");r[i.slice(0,s)]=i.slice(s+1)}let o=n.shift();if(!o)throw new Error("\u73AF\u5883\u6A21\u677F\u547D\u4EE4\u7F3A\u5C11\u53EF\u6267\u884C\u547D\u4EE4\u3002");return{command:o,args:n,env:r}},dl=(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},Tk=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=Tk(e.commandPreset);return t.length===0?e.description:[e.description,"","\u9879\u76EE\u73AF\u5883\u6A21\u677F\u547D\u4EE4\uFF1A",...t.map(n=>`- ${n}`),"","\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(`
111
+ `)},ul=async e=>{let t=Rk(e.commandText);return await new Promise((n,r)=>{let o=vk(t.command,t.args,{cwd:e.cwd,env:{...e.env??process.env,...t.env},stdio:["ignore","pipe","pipe"]}),i="",s="",a=!1,c=()=>{a=!0,o.kill("SIGTERM")};e.signal?.addEventListener("abort",c,{once:!0}),o.stdout.on("data",l=>{i+=l.toString()}),o.stderr.on("data",l=>{s+=l.toString()}),o.on("error",l=>{e.signal?.removeEventListener("abort",c),r(new Error(`${e.label} \u542F\u52A8\u5931\u8D25\uFF1A${l.message}`))}),o.on("close",(l,u)=>{if(e.signal?.removeEventListener("abort",c),a){r(new Error(`${e.label} \u5DF2\u53D6\u6D88\u3002`));return}let d=Ik([i,s].filter(Boolean).join(`
112
+ `));if(l===0){n({output:d});return}let m=u?`\u4FE1\u53F7 ${u}`:`\u9000\u51FA\u7801 ${l??"unknown"}`;r(new Error([`${e.label} \u6267\u884C\u5931\u8D25\uFF08${m}\uFF09\u3002`,d].filter(Boolean).join(`
113
+
114
+ `)))})})},mi=async e=>{let t=dl(e.task.commandPreset,e.step);if(!t)return null;let n=`\u9879\u76EE\u9884\u8BBE ${e.step}`;e.emit("executing",`${n}\uFF1A${t}`);let r=await ul({cwd:e.cwd,label:n,commandText:t,signal:e.signal,env:e.env});return e.emit("executing",r.output?`${n} \u5DF2\u5B8C\u6210\u3002
115
+ ${r.output}`:`${n} \u5DF2\u5B8C\u6210\u3002`),`${n}\uFF1A${t}`},gi=e=>{let t=dl(e.task.commandPreset,e.step);if(!t)return null;let n=`\u9879\u76EE\u9884\u8BBE ${e.step}`;return e.emit("executing",`${n} \u5DF2\u5728\u540E\u53F0\u542F\u52A8\uFF1A${t}`),{commandText:t,label:n,promise:ul({cwd:e.cwd,label:n,commandText:t,signal:e.signal,env:e.env})}},fi=async(e,t)=>{let n=await e.promise;return t("executing",n.output?`${e.label} \u5DF2\u5B8C\u6210\u3002
116
+ ${n.output}`:`${e.label} \u5DF2\u5B8C\u6210\u3002`),`${e.label}\uFF1A${e.commandText}`};import{createHash as Ak}from"node:crypto";import{existsSync as pl,mkdirSync as gl,rmSync as Mk}from"node:fs";import Ot from"node:path";import{simpleGit as dn}from"simple-git";var Ok="main",fl=(e,t)=>{let n={...ht(t),...e?{baseDir:e}:{}};return dn(n).env(t??{})},_k=e=>Ak("sha1").update(e).digest("hex").slice(0,12),Wk=e=>e.replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"repo",Bk=(e,t)=>{let n=Ot.basename(t).replace(/\.git$/i,"");return Ot.join(e,"repos",`${Wk(n)}-${_k(t)}`)},hl=e=>e.baseCommit?.trim()||e.defaultBranch?.trim()||Ok,hi=e=>`origin/${e}`,Dk=async(e,t,n)=>(await fl(void 0,n).raw(["ls-remote","--heads",e,t])).trim().length>0,ml=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}`])},yl=async(e,t)=>(await e.branch(["-r"])).all.includes(hi(t)),$k=async(e,t)=>{await e.fetch(["--all","--prune"]),await yl(e,t)&&await e.rebase([hi(t)])},kl=e=>e.gitIdentity??{mode:e.gitIdentityMode??"personal"},wl=e=>e.workingDirectoryMode==="original-dir"?"original-dir":"worktree",Nk=(e,t)=>t.versionControl!=="git-remote"&&t.rootPath?.trim()?t.rootPath.trim():e?.find(n=>!!(n.projectId&&n.projectId===t.projectId||n.repoUrl&&n.repoUrl===t.repoUrl))?.localPath,Uk=async e=>{let t=await e.raw(["worktree","list","--porcelain"]),n=[],r=null;for(let o of t.split(`
117
+ `)){if(o.startsWith("worktree ")){r&&n.push(r),r={path:Ot.resolve(o.slice(9).trim())};continue}o.startsWith("branch ")&&r&&(r.branch=o.slice(7).trim())}return r&&n.push(r),n},Lk=async(e,t)=>(await e.branchLocal()).all.includes(t),jk=e=>{Mk(e,{recursive:!0,force:!0,maxRetries:5,retryDelay:100})},Sl=async(e,t,n)=>{let r=dn(e),o=Ot.resolve(t),i=`refs/heads/${n}`;try{await r.raw(["worktree","prune"])}catch{}let a=(await Uk(r)).find(c=>c.branch===i);if(a&&a.path!==o)try{await r.raw(["worktree","remove","--force",a.path])}catch{}try{await r.raw(["worktree","remove","--force",o])}catch{}if(jk(o),await Lk(r,n))try{await r.deleteLocalBranch(n,!0)}catch{}try{await r.raw(["worktree","prune"])}catch{}gl(Ot.dirname(o),{recursive:!0})},xl=async e=>{let t=Nk(e.bindings,e.task)||Bk(e.workspaceRoot,e.task.repoUrl),n=hl(e.task);if(gl(Ot.dirname(t),{recursive:!0}),e.task.versionControl==="git-local"){let i=dn(t).env(e.env??{});if(!pl(t)||!await i.checkIsRepo().catch(()=>!1))throw new Error("\u672C\u5730 Git \u9879\u76EE\u76EE\u5F55\u672A\u521D\u59CB\u5316\uFF0C\u65E0\u6CD5\u521B\u5EFA\u4EFB\u52A1 worktree\u3002");return{repoDir:t,git:i,taskBranchExists:!1}}pl(t)||(console.log("[worker] [task-worktree] cloning target branch only",JSON.stringify({repoDir:t,repoUrl:e.task.repoUrl,startPoint:n})),await dn().env(e.env??{}).clone(e.task.repoUrl,t,["--no-checkout","--single-branch","--branch",n]));let r=dn(t).env(e.env??{});await ml(r,n);let o=await Dk(e.task.repoUrl,e.branchName,e.env);return o&&e.branchName!==n&&await ml(r,e.branchName),{repoDir:t,git:r,taskBranchExists:o}},Cl=async e=>{let t=e.taskBranchExists||await yl(e.git,e.branchName)?hi(e.branchName):hl(e.task);return await e.git.checkout(["-B",e.branchName,t]),t},Pl=async e=>{let t=fl(e.worktreePath,e.env),n=await t.status(),r=Array.from(new Set(n.files.map(a=>a.path))).sort();if(r.length===0)return{changedFiles:r,commitShas:void 0,remoteBranchName:void 0,pushMessage:"\u6CA1\u6709\u6587\u4EF6\u6539\u52A8\uFF0C\u8DF3\u8FC7\u63D0\u4EA4\u4E0E\u63A8\u9001\u3002"};if(e.task.autoCommitEnabled===!1)return{changedFiles:r,commitShas:void 0,remoteBranchName:void 0,pushMessage:"\u5F53\u524D\u5DE5\u4F5C\u533A\u5DF2\u5173\u95ED\u81EA\u52A8\u63D0\u4EA4 / \u63A8\u9001\uFF0C\u6539\u52A8\u4FDD\u7559\u5728\u672C\u5730\u76EE\u5F55\u3002"};if(e.task.returnMode!=="branch"&&e.task.returnMode!=="commit")return{changedFiles:r,commitShas:void 0,remoteBranchName:void 0,pushMessage:void 0};if(!e.identity.name||!e.identity.email)throw new Error("\u5F53\u524D\u4EFB\u52A1\u7F3A\u5C11 Git \u7528\u6237\u540D\u6216\u90AE\u7BB1\uFF0C\u8BF7\u5148\u5728\u8BBE\u7F6E\u9875\u5B8C\u6210 Git \u6388\u6743\u914D\u7F6E\u3002");await t.add(["--all"]),await t.commit(`vibemux: ${e.task.id}`);let o=(await t.revparse(["HEAD"])).trim(),i,s="\u5DF2\u521B\u5EFA\u672C\u5730\u63D0\u4EA4\u3002";return e.identity.credentialToken?(await $k(t,e.branchName),await t.push(["-u","origin",e.branchName]),i=e.branchName,s=`\u5DF2\u63A8\u9001\u8FDC\u7AEF\u5206\u652F ${e.branchName}\u3002`):(e.task.returnMode==="branch"||e.task.returnMode==="commit")&&(s="\u7F3A\u5C11 task \u7EA7\u4E34\u65F6\u51ED\u8BC1\uFF0C\u5DF2\u521B\u5EFA\u672C\u5730\u63D0\u4EA4\u4F46\u672A\u63A8\u9001\u8FDC\u7AEF\u3002"),{changedFiles:r,commitShas:o?[o]:void 0,remoteBranchName:i,pushMessage:s}};var Hk="vibemux-task-runtime-",Jk=e=>e==="Codex"||e==="ClaudeCode",Il=(e,t)=>{if(!Jk(e.agentType))return{cwd:t,cleanup:()=>{}};let n=Fk(El.join(zk.tmpdir(),`${Hk}${e.id.slice(0,8)}-`)),r=El.join(n,"workspace");try{return qk(t,r,process.platform==="win32"?"junction":"dir"),{cwd:r,cleanup:()=>{vl(n,{recursive:!0,force:!0})}}}catch{return vl(n,{recursive:!0,force:!0}),{cwd:t,cleanup:()=>{}}}},bl=async e=>{let t=new Date().toISOString(),n=ln(e.task.id),r=xs(e.workspaceRoot,e.task.id,e.task.workspaceId),o=wl(e.task),i=null,s=null,a=null;try{e.emit("preparing","\u68C0\u67E5 Worker \u8FD0\u884C\u73AF\u5883");let c=await pe({autoInstall:!0,target:e.task.agentType});if(!c.ok)throw new Error(c.message);if(e.emit("preparing","\u8FD0\u884C\u73AF\u5883\u5DF2\u5C31\u7EEA"),e.task.versionControl==="none"){let B=e.task.rootPath?.trim()||r;Gk(B,{recursive:!0}),oe(B,e.runtimeEnvironment),e.emit("preparing",`\u9879\u76EE\u76EE\u5F55\u5DF2\u5C31\u7EEA\uFF1A${B}`);let j=Il(e.task,B);a=j.cleanup;let P=gi({step:"install",task:e.task,cwd:B,signal:e.signal,emit:e.emit}),E=[];P&&E.push(await fi(P,e.emit)),e.emit("executing",`\u5F00\u59CB\u8C03\u7528 ${e.task.agentType} \u6267\u884C\u4EFB\u52A1`);let v=await di({agentType:e.task.agentType,actingUserId:e.task.requestedByUserId,cwd:j.cwd,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,mcpServers:e.task.mcpServers,skipRuntimeCheck:!0,runtimeSkillPackages:e.task.runtimeSkillPackages,runtimeEnv:e.task.runtimeEnv,runtimeEnvironment:e.runtimeEnvironment,signal:e.signal});for(let p of["build","test","lint"]){let f=await mi({step:p,task:e.task,cwd:B,signal:e.signal,emit:e.emit});f&&E.push(f)}let M=new Date().toISOString(),w=Mt({taskId:e.task.id,status:"completed",returnMode:e.task.returnMode,summary:[E.length>0?`\u5DF2\u6267\u884C\u9879\u76EE\u9884\u8BBE\u547D\u4EE4\uFF1A
118
+ ${E.map(p=>`- ${p}`).join(`
119
+ `)}`:void 0,v.output].filter(Boolean).join(`
120
+
121
+ `),output:v.output,filesChanged:[],startedAt:t,completedAt:M,durationSec:Math.max(0,Math.round((new Date(M).getTime()-new Date(t).getTime())/1e3)),executorNodeId:e.executorId,agentSessionId:v.sessionId,opencodeSessionId:v.sessionId},{repoUrl:e.task.repoUrl,baseBranch:e.task.defaultBranch,taskDescription:e.task.description});return{task:{...e.task,status:"completed",startedAt:t,completedAt:M,updatedAt:M,result:w}}}let l=kl(e.task);s=Ae({taskId:e.task.id,identity:l,repoUrl:e.task.repoUrl}),e.emit("preparing","\u51C6\u5907\u672C\u5730\u4ED3\u5E93");let{repoDir:u,git:d,taskBranchExists:m}=await xl({workspaceRoot:e.workspaceRoot,task:e.task,branchName:n,bindings:e.projectBindings,env:Ce(s.env,e.runtimeEnvironment)});e.emit("preparing",`\u4ED3\u5E93\u5DF2\u5C31\u7EEA\uFF1A${u}`);let g=o==="original-dir"?e.task.rootPath?.trim()||u:r;if(o==="worktree"){await Sl(u,r,n);let B=m||await d.branch(["-r"]).then(j=>j.all.includes(`origin/${n}`))?`origin/${n}`:e.task.baseCommit?.trim()||e.task.defaultBranch?.trim()||"main";await d.raw(["worktree","add","--force","-B",n,r,B]),e.emit("executing",`\u5DF2\u521B\u5EFA worktree\uFF1A${r}`)}else{let B=await Cl({git:d,task:e.task,branchName:n,taskBranchExists:m});e.emit("executing",`\u5DF2\u5728\u539F\u59CB\u76EE\u5F55 ${g} \u5207\u6362\u5230 ${B} \u5E76\u5F00\u59CB\u6267\u884C`)}oe(g,e.runtimeEnvironment),i=ja({taskId:e.task.id,worktreePath:g,identity:l,repoUrl:e.task.repoUrl});let k=Ce(i.env,e.runtimeEnvironment),h=Il(e.task,g);a=h.cleanup;let S=gi({step:"install",task:e.task,cwd:g,signal:e.signal,env:k,emit:e.emit}),y=[];S&&y.push(await fi(S,e.emit)),e.emit("executing",`\u5F00\u59CB\u8C03\u7528 ${e.task.agentType} \u6267\u884C\u4EFB\u52A1`);let b=await di({agentType:e.task.agentType,actingUserId:e.task.requestedByUserId,cwd:h.cwd,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,mcpServers:e.task.mcpServers,skipRuntimeCheck:!0,runtimeSkillPackages:e.task.runtimeSkillPackages,runtimeEnv:e.task.runtimeEnv,runtimeEnvironment:e.runtimeEnvironment,signal:e.signal});for(let B of["build","test","lint"]){let j=await mi({step:B,task:e.task,cwd:g,signal:e.signal,env:k,emit:e.emit});j&&y.push(j)}let I=await Pl({task:e.task,worktreePath:g,branchName:n,identity:l,env:k}),_=await ll(e.task,g,n),H;_.patchArtifact&&e.uploadPatchArtifact&&(e.emit("syncing_back","\u6B63\u5728\u4E0A\u4F20 patch \u4EA7\u7269\u5230\u63A7\u5236\u9762"),H=(await e.uploadPatchArtifact({taskId:e.task.id,filename:_.patchArtifact.filename,content:_.patchArtifact.content})).artifactId);let O=new Date().toISOString(),Y=Mt({taskId:e.task.id,status:"completed",returnMode:e.task.returnMode,summary:[y.length>0?`\u5DF2\u6267\u884C\u9879\u76EE\u9884\u8BBE\u547D\u4EE4\uFF1A
122
+ ${y.map(B=>`- ${B}`).join(`
123
+ `)}`:void 0,b.output,I.pushMessage].filter(Boolean).join(`
124
+
125
+ `),output:b.output,filesChanged:I.changedFiles.length>0?I.changedFiles:_.filesChanged,remoteBranchName:I.remoteBranchName,commitShas:I.commitShas??_.commitShas,patchArtifactId:H,startedAt:t,completedAt:O,durationSec:Math.max(0,Math.round((new Date(O).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:O,updatedAt:O,result:Y}}}catch(c){let l=new Date().toISOString(),u=c instanceof Error?c.message:"worker task execution failed";return{task:{...e.task,status:"failed",startedAt:t,completedAt:l,updatedAt:l,errorMessage:u,result:Mt({taskId:e.task.id,status:"failed",returnMode:e.task.returnMode,summary:u,output:u,filesChanged:[],startedAt:t,completedAt:l,durationSec:Math.max(0,Math.round((new Date(l).getTime()-new Date(t).getTime())/1e3)),executorNodeId:e.executorId},{repoUrl:e.task.repoUrl,baseBranch:e.task.defaultBranch,taskDescription:e.task.description})}}}finally{a?.(),i?.cleanup(),s?.cleanup()}};var yi=new Map,ki=e=>{let t=yi.get(e);if(t){for(let n of t)clearTimeout(n);yi.delete(e)}},Rl=(e,t,n)=>{let r=new Date().toISOString();return{...e,status:"cancelled",executorNodeId:t,completedAt:r,updatedAt:r,result:Mt({taskId:e.id,status:"cancelled",returnMode:e.returnMode,summary:n??"\u4EFB\u52A1\u5DF2\u53D6\u6D88",filesChanged:[],startedAt:e.startedAt??r,completedAt:r,durationSec:0,executorNodeId:t},{repoUrl:e.repoUrl,baseBranch:e.defaultBranch,taskDescription:e.description})}},Tl=ki,Al=e=>{let{task:t,executorId:n,workspaceRoot:r,projectBindings:o,uploadPatchArtifact:i,send:s}=e,a=new AbortController,c=[setTimeout(()=>{e.onStart(t.id),bl({task:t,runtimeEnvironment:e.runtimeEnvironment,executorId:n,workspaceRoot:r,projectBindings:o,signal:a.signal,uploadPatchArtifact:i,emit(l,u){a.signal.aborted||s({type:"task.event",taskId:t.id,idempotencyKey:t.idempotencyKey,executorId:n,status:l,message:u,at:new Date().toISOString()})}}).then(({task:l})=>{a.signal.aborted||(e.onFinish(t.id),s({type:"task.result",executorId:n,task:l}),ki(t.id))})},20)];return yi.set(t.id,c),{abort(){a.abort(),e.onFinish(t.id),ki(t.id)}}};var Ml=(e,t)=>{let n=t.getConfig();if(e.type==="task.assign"){let r=t.getRunningTaskIds(),o=t.getQueuedTaskIds();return t.assignedTasks.has(e.task.id)||r.includes(e.task.id)||o.includes(e.task.id)?(t.assignedTasks.set(e.task.id,{task:e.task,runtimeEnvironment:e.runtimeEnvironment}),!0):(t.assignedTasks.set(e.task.id,{task:e.task,runtimeEnvironment:e.runtimeEnvironment}),t.setQueuedTaskIds([...o,e.task.id]),t.syncRuntimeState(),t.send({type:"task.ack",taskId:e.task.id,idempotencyKey:e.task.idempotencyKey,executorId:n.executorId,accepted:!0}),t.drainExecutionQueue(),!0)}if(e.type==="task.cancel"){let r=t.assignedTasks.get(e.taskId);return t.activeExecutions.get(e.taskId)?.abort(),t.activeExecutions.delete(e.taskId),Tl(e.taskId),t.assignedTasks.delete(e.taskId),t.setQueuedTaskIds(t.getQueuedTaskIds().filter(o=>o!==e.taskId)),t.setRunningTaskIds(t.getRunningTaskIds().filter(o=>o!==e.taskId)),t.syncRuntimeState(),t.drainExecutionQueue(),r&&t.send({type:"task.result",executorId:n.executorId,task:Rl(r.task,n.executorId,e.reason)}),!0}return!1};var Ol=(e,t)=>{let n=t.getConfig(),r=()=>(n=C(),t.setConfig(n),n);if(e.type==="executor.terminal.request"){r();let o=Date.now(),i=e.cwd||n.workspaceRoot;return Pe("received one-shot terminal request",{requestId:e.requestId,command:e.command,cwd:i,mode:e.mode??"wait"}),t.runTerminalCommand(e.command,i,{mode:e.mode??"wait",runtimeEnvironment:e.runtimeEnvironment}).then(s=>{let a=Date.now()-o;Pe("completed one-shot terminal request",{requestId:e.requestId,cwd:i,mode:e.mode??"wait",durationMs:a,exitCode:s.exitCode,detached:s.detached,pid:s.pid,stdout:s.stdout,stderr:s.stderr}),t.send({type:"executor.terminal.response",executorId:n.executorId,requestId:e.requestId,result:s})}).catch(s=>{Pe("failed one-shot terminal request",{requestId:e.requestId,cwd:i,mode:e.mode??"wait",durationMs:Date.now()-o,error:s instanceof Error?s.message:String(s)})}),!0}if(e.type==="executor.terminal.session.open"){r();let o=e.cwd||n.workspaceRoot;Pe("received terminal session open",{sessionId:e.sessionId,cwd:o});let i=t.openTerminalSession({cwd:o,runtimeEnvironment:e.runtimeEnvironment,onExit:s=>{t.terminalSessions.delete(e.sessionId),t.send({type:"executor.terminal.session.exit",executorId:n.executorId,sessionId:e.sessionId,exitCode:s,at:new Date().toISOString()})},onLog:(s,a)=>{Pe(s,{sessionId:e.sessionId,...a})},onOutput:(s,a)=>{n.executorId&&Tc({send:t.send,executorId:n.executorId,sessionId:e.sessionId,stream:s,chunk:a})},onReady:(s,a)=>{t.send({type:"executor.terminal.session.ready",executorId:n.executorId,sessionId:e.sessionId,cwd:o,mode:s,at:new Date().toISOString()}),Pe("terminal session ready",{sessionId:e.sessionId,cwd:o,mode:s,backend:a})}});return t.terminalSessions.set(e.sessionId,i),!0}if(e.type==="executor.terminal.session.input")return Pe("received terminal session input",{sessionId:e.sessionId,inputLength:e.input.length,preview:e.input.slice(0,80)}),t.terminalSessions.get(e.sessionId)?.write(e.input),!0;if(e.type==="executor.terminal.session.resize")return Pe("received terminal session resize",{sessionId:e.sessionId,cols:e.cols,rows:e.rows}),t.terminalSessions.get(e.sessionId)?.resize(e.cols,e.rows),!0;if(e.type==="executor.terminal.session.close"){Pe("received terminal session close",{sessionId:e.sessionId});let o=t.terminalSessions.get(e.sessionId);return o&&(o.kill(),t.terminalSessions.delete(e.sessionId)),!0}return!1};var _l=e=>{let t=cl(e),n=r=>{if(e.getCurrentSocket()===e.expectedSocket&&!Ia(r,e)&&!Ac(r,e)&&!Mc(r,e)){if(r.type==="executor.agent.prompt.request"||r.type==="executor.agent.prompt.cancel"){t.handlePromptMessage(r);return}Ol(r,e)||Ml(r,e)}};return{abortActivePrompts:t.abortActivePrompts,handleMessage:n,drainPromptQueue:t.drainPromptQueue}};import{existsSync as wi,mkdirSync as Vk,readFileSync as Wl}from"node:fs";import{spawnSync as Kk}from"node:child_process";import Xk from"node:os";import gr from"node:path";var Bl=gr.join(Xk.homedir(),".ssh"),Qk=["id_ed25519.pub","id_rsa.pub","id_ecdsa.pub"],Yk="vibemux_worker_ed25519",Zk=e=>{Vk(gr.dirname(e),{recursive:!0});let t=Kk("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())},Si=()=>{try{for(let n of Qk){let r=gr.join(Bl,n);if(wi(r))return Wl(r,"utf8").trim()}let e=gr.join(Bl,Yk),t=`${e}.pub`;return wi(t)||Zk(e),wi(t)?Wl(t,"utf8").trim():void 0}catch{return}};import{spawn as hr,spawnSync as ew}from"node:child_process";import{accessSync as tw,constants as nw,mkdtempSync as rw,readFileSync as ow,rmSync as iw}from"node:fs";import xi from"node:os";import{createRequire as sw}from"node:module";import Ci from"node:path";import{StringDecoder as Dl}from"node:string_decoder";var Fl=120,Gl=32,Pi="xterm-256color",aw=250,cw=1500,$l=24e3,lw=1500,dw=sw(import.meta.url),uw=String.raw`
132
126
  import base64
133
127
  import errno
134
128
  import fcntl
@@ -267,12 +261,12 @@ except OSError:
267
261
  pass
268
262
 
269
263
  sys.exit(exit_code)
270
- `,ot,Hr,cr=new Map,dv=["-i","-l"],Vr=e=>{let t=e?.trim();return t?t==="~"?$i.homedir():t.startsWith("~/")?Li.join($i.homedir(),t.slice(2)):t:process.cwd()},mo=e=>{if(!e?.trim())return!1;try{return ev(e,tv.X_OK),!0}catch{return!1}},sp=e=>{let t=e.end();return t.length>0?t:""},pv=()=>{let e=rv(Li.join($i.tmpdir(),"vibemux-terminal-command-"));return{outputPath:Li.join(e,"output.log"),cleanup:()=>{try{ov(e,{recursive:!0,force:!0})}catch{}}}},ip=e=>{try{let t=nv(e,"utf8");return t.length<=op?t:t.slice(0,op)}catch{return""}},ap=(e,t)=>new Promise(r=>{let n=!1,o=()=>{n||(n=!0,clearTimeout(i),e.off("exit",s),r())},s=()=>{o()},i=setTimeout(()=>{o()},Math.max(0,t));e.once("exit",s)}),cp=(e,t)=>{try{return process.platform!=="win32"?process.kill(-e,t):process.kill(e,t),!0}catch(r){if((typeof r=="object"&&r&&"code"in r?String(r.code):"")==="ESRCH")return!1;throw r}},mv=e=>{cr.set(e.pid,e),e.child.once("exit",()=>{cr.delete(e.pid)})},dp=async()=>{let e=Array.from(cr.values());if(e.length===0)return;for(let r of e)cp(r.pid,"SIGTERM")||cr.delete(r.pid);await Promise.all(e.map(r=>ap(r.child,cv)));let t=Array.from(cr.values());for(let r of t)cp(r.pid,"SIGKILL")||cr.delete(r.pid);await Promise.all(t.map(r=>ap(r.child,250)))},Fi=(e,t,r)=>{let n=!1,o=setTimeout(()=>{n||(n=!0,e(t,r))},iv);return{markReady:()=>{n||(n=!0,clearTimeout(o),e(t,r))},dispose:()=>{clearTimeout(o)}}},fv=()=>{if(ot!==void 0)return ot;let e=["/usr/bin/python3","/opt/homebrew/bin/python3"];for(let r of e)if(mo(r))return ot=r,ot;let t=["python3","python"];for(let r of t){let n=ZC(r,["-c","import sys"],{stdio:"ignore"});if(!n.error&&n.status===0)return ot=r,ot}return ot=null,ot},gv=()=>{if(Hr!==void 0)return Hr;try{Hr=lv("node-pty")}catch{Hr=null}return Hr},go=()=>{let e=process.env.SHELL?.trim();return e&&mo(e)?e:process.platform==="darwin"&&mo("/bin/zsh")?"/bin/zsh":mo("/bin/bash")?"/bin/bash":"sh"},hv=["VITE_","NEXT_PUBLIC_","NUXT_PUBLIC_","PUBLIC_"],yv=new Set(["APP_URL","APP_BASE_URL","BETTER_AUTH_URL","BETTER_AUTH_TRUSTED_ORIGINS","VIBEMUX_PUBLIC_BASE_URL"]),ho=(e=process.env)=>{let t={};for(let[r,n]of Object.entries(e))typeof n>"u"||yv.has(r)||hv.some(o=>r.startsWith(o))||(t[r]=n);return t},pp=(e,t,r)=>new Promise(n=>{let o=go(),s=Vr(t);le(s,r?.runtimeEnvironment);let i=Ae(ho(),r?.runtimeEnvironment),a=r?.mode??"wait";if(a==="background")try{let u=pv(),p=fo(o,["-l","-c",`exec >"$VIBEMUX_BACKGROUND_OUTPUT_PATH" 2>&1
271
- ${e}`],{cwd:s,env:{...i,VIBEMUX_BACKGROUND_OUTPUT_PATH:u.outputPath},detached:!0,stdio:"ignore"}),m=p.pid;if(!m){u.cleanup(),n({command:e,cwd:s,stdout:"",stderr:"\u540E\u53F0\u73AF\u5883\u547D\u4EE4\u542F\u52A8\u5931\u8D25\uFF1A\u672A\u83B7\u53D6\u5230\u5B50\u8FDB\u7A0B pid\u3002",exitCode:1,mode:a,detached:!1,at:new Date().toISOString()});return}let y=!1,g=()=>{p.off("error",E),p.off("exit",b)},w=()=>{y||(y=!0,clearTimeout(T),g(),p.unref(),mv({pid:m,child:p,command:e,cwd:s,startedAt:new Date().toISOString()}),u.cleanup(),n({command:e,cwd:s,stdout:"",stderr:"",exitCode:0,mode:a,detached:!0,pid:m,at:new Date().toISOString()}))},k=N=>{if(y)return;y=!0,clearTimeout(T),g();let _=ip(u.outputPath);u.cleanup(),n({command:e,cwd:s,stdout:"",stderr:_,exitCode:N,mode:a,detached:!1,pid:m,at:new Date().toISOString()})},E=N=>{let _=ip(u.outputPath);u.cleanup(),!y&&(y=!0,clearTimeout(T),g(),n({command:e,cwd:s,stdout:"",stderr:_||N.message,exitCode:1,mode:a,detached:!1,pid:m,at:new Date().toISOString()}))},b=N=>{k(N??0)},T=setTimeout(()=>{w()},av);p.on("error",E),p.on("exit",b);return}catch(u){n({command:e,cwd:s,stdout:"",stderr:u instanceof Error?u.message:"\u540E\u53F0\u73AF\u5883\u547D\u4EE4\u542F\u52A8\u5931\u8D25\u3002",exitCode:1,mode:a,detached:!1,at:new Date().toISOString()});return}let c=fo(o,["-l","-c",e],{cwd:s,env:i}),l="",d="";c.stdout.on("data",u=>{l+=u.toString()}),c.stderr.on("data",u=>{d+=u.toString()}),c.on("close",u=>{n({command:e,cwd:s,stdout:l,stderr:d,exitCode:u??0,mode:a,at:new Date().toISOString()})}),c.on("error",u=>{n({command:e,cwd:s,stdout:l,stderr:`${d}${u.message}`,exitCode:1,mode:a,at:new Date().toISOString()})})}),kv=e=>{let{cols:t=lp,cwd:r,onExit:n,onLog:o,onOutput:s,onReady:i,rows:a=up,shell:c=go()}=e,l=Vr(r),d=gv();le(l,e.runtimeEnvironment);let u=Ae(ho(),e.runtimeEnvironment);if(!d)throw new Error("node-pty \u4E0D\u53EF\u7528\uFF0C\u65E0\u6CD5\u542F\u52A8\u539F\u751F PTY\u3002");let p=d.spawn(c,dv,{cwd:l,env:u,cols:t,rows:a,name:ji}),m=Fi(i,"pty","node-pty");return p.onData(y=>{m.markReady(),o("pty output",{backend:"node-pty",chunkLength:y.length,preview:y.slice(0,120)}),s("stdout",y)}),p.onExit(({exitCode:y})=>{m.dispose(),o("pty exit",{backend:"node-pty",exitCode:y}),n(y??0)}),{backend:"node-pty",mode:"pty",write:y=>p.write(y),resize:(y,g)=>p.resize(Math.max(1,y),Math.max(1,g)),kill:()=>p.kill("SIGTERM")}},wv=e=>{let{cols:t=lp,cwd:r,onExit:n,onLog:o,onOutput:s,onReady:i,rows:a=up,shell:c=go()}=e,l=Vr(r),d=fv();le(l,e.runtimeEnvironment);let u=Ae(ho(),e.runtimeEnvironment);if(!d)throw new Error("python3 \u4E0D\u53EF\u7528\uFF0C\u65E0\u6CD5\u542F\u52A8 PTY fallback\u3002");let p=fo(d,["-u","-c",uv],{cwd:l,env:{...u,DEVKANBAN_COLS:String(Math.max(1,t)),DEVKANBAN_CWD:l,DEVKANBAN_ROWS:String(Math.max(1,a)),DEVKANBAN_SHELL:c,DEVKANBAN_TERM_NAME:ji},stdio:["pipe","pipe","pipe"]}),m=p.stdin;if(!m)throw p.kill("SIGTERM"),new Error("python PTY control pipe \u4E0D\u53EF\u7528\u3002");let y=new np("utf8"),g=new np("utf8"),w=Fi(i,"pty","python-pty"),k=(b,T)=>{T.length!==0&&(b==="stdout"&&w.markReady(),o("pty output",{backend:"python-pty",chunkLength:T.length,preview:T.slice(0,120),stream:b}),s(b,T))};p.stdout.on("data",b=>{k("stdout",y.write(b))}),p.stderr.on("data",b=>{k("system",g.write(b))}),p.on("error",b=>{o("python pty error",{message:b.message}),s("system",`\r
272
- [python-pty error] ${b.message}\r
273
- `)}),p.on("close",b=>{w.dispose(),k("stdout",sp(y)),k("system",sp(g)),o("pty exit",{backend:"python-pty",exitCode:b??0}),n(b??0)});let E=b=>{m.destroyed||m.write(`${JSON.stringify(b)}
274
- `)};return{backend:"python-pty",mode:"pty",write:b=>{E({type:"input",data:Buffer.from(b,"utf8").toString("base64")})},resize:(b,T)=>{E({type:"resize",cols:Math.max(1,b),rows:Math.max(1,T)})},kill:()=>{E({type:"close"}),m.end(),p.kill("SIGTERM")}}},Sv=e=>{let{cwd:t,onExit:r,onLog:n,onOutput:o,onReady:s}=e,i=Vr(t);le(i,e.runtimeEnvironment);let a=Ae(ho(),e.runtimeEnvironment),c=fo("/bin/bash",["-il"],{cwd:i,env:{...a,BASH_SILENCE_DEPRECATION_WARNING:"1",TERM:process.env.TERM||ji},stdio:"pipe"});c.stdin.setDefaultEncoding("utf8"),c.stdout.setEncoding("utf8"),c.stderr.setEncoding("utf8");let l=Fi(s,"pipe","pipe");return c.stdout.on("data",d=>{l.markReady(),n("fallback shell stdout",{backend:"pipe",chunkLength:d.length,preview:d.slice(0,120)}),o("stdout",d)}),c.stderr.on("data",d=>{l.markReady(),n("fallback shell stderr",{backend:"pipe",chunkLength:d.length,preview:d.slice(0,120)}),o("stderr",d)}),c.on("error",d=>{n("fallback shell error",{message:d.message}),o("system",`\r
275
- [fallback shell error] ${d.message}\r
276
- `)}),c.on("close",d=>{l.dispose(),n("fallback shell exit",{backend:"pipe",exitCode:d??0}),r(d??0)}),c.stdin.write(`export PS1="$ "
277
- `),{backend:"pipe",mode:"pipe",write:d=>{c.stdin.destroyed||c.stdin.write(d.replace(/\r/g,`
278
- `))},resize:()=>{},kill:()=>c.kill("SIGTERM")}},mp=e=>{let{cwd:t,onLog:r}=e,n=Vr(t),o=e.shell??go();r("opening pty session",{cwd:n,shell:o});try{return kv({...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 wv({...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 Sv({...e,cwd:n})};var R={connection:null,reconnectTimer:null,stopped:!1,connect:null},Gi=new Map,Cv=()=>Je()==="preview"?"vibemux-worker-preview":"vibemux-worker",fp=e=>Hn({workspaceRoot:e,workerVersion:ue()}),gp=e=>{let t=process.platform==="darwin"?["open",e]:process.platform==="win32"?["cmd","/c","start","",e]:["xdg-open",e];xv(t[0],t.slice(1),{detached:!0,stdio:"ignore"}).unref()},hp=async()=>{let e=ue(),t=await dt();return{currentVersion:e,latestVersion:t.latestVersion||e,check:t}},yp=(e,t,r,n)=>{let o=n.check.channel||Je(),s=o==="preview"?"Vibemux Worker Preview":"Vibemux Worker",i=process.env.VIBEMUX_WORKER_AUTO_UPDATE?.trim().toLowerCase(),a=i!=="0"&&i!=="false"&&i!=="off",c=[["Mode",e],["Channel",o],["Current",n.currentVersion],["Latest",n.latestVersion],["Update Check",a?"enabled":"disabled"],["Cloud",t],["Local",r]],l=e==="open"?"Opening cloud and local consoles in your browser...":"Worker daemon is ready and waiting for tasks.",d=Math.max(...c.map(([y])=>y.length)),u=[s,"",...c.map(([y,g])=>`${y.padEnd(d)} : ${g}`),"",l],p=Math.max(...u.map(y=>y.length)),m=`+${"-".repeat(p+2)}+`;console.log(m);for(let y of u)console.log(`| ${y.padEnd(p)} |`);console.log(m)},kp=()=>{let e=C();as();let t=hr(e.localServerPort);hp().then(r=>{yp("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(()=>{gp(e.cloudUrl),gp(t)},250)};var ic=()=>{R.stopped=!0,R.reconnectTimer&&(clearTimeout(R.reconnectTimer),R.reconnectTimer=null),R.connection?.socket?.close(1e3,"manual disconnect"),R.connection=null,D({daemonMode:"disconnected",connected:!1,lastDisconnectAt:new Date().toISOString(),lastError:"Control plane connection was disconnected manually."})},bn=()=>{let e=C();if(!e.executorId||!e.executorToken)throw new Error("This worker is not paired yet, so it cannot connect to the control plane.");R.stopped=!1,R.reconnectTimer&&(clearTimeout(R.reconnectTimer),R.reconnectTimer=null),R.connection?.socket?.close(1e3,"manual reconnect"),R.connection=null,R.connect?.()},yo=()=>{R.stopped=!1;let e=C(),t=[],r=[],n=new Map,o=new Map,s=null,i=null,a=!1,c=!1,l=null,d=null,u=Ri(),p=[],m=new Date().toISOString();D({daemonMode:"starting",paired:!!(e.executorId&&e.executorToken),executorId:e.executorId,config:e,startedAt:m,lastConnectAttemptAt:m,lastError:void 0});let y=hr(e.localServerPort);hp().then(f=>(yp("daemon",e.cloudUrl,y,f),ss(f.check))).catch(f=>{let h=f instanceof Error?f.message:"worker startup banner failed";console.error("[worker] startup banner failed",h)}),wn(e.workspaceRoot);let g=as(),w=async f=>{await new Promise(h=>{f.close(()=>h())})},k=async(f,h)=>{if(!c){c=!0,R.stopped=!0,a=!0,i&&(clearTimeout(i),i=null),R.reconnectTimer&&(clearTimeout(R.reconnectTimer),R.reconnectTimer=null),D({daemonMode:"disconnected",connected:!1,lastDisconnectAt:new Date().toISOString(),lastError:h||(f==="manual"?"Worker shutting down.":`Worker shutting down by ${f}.`)});for(let x of o.values())x.abort();o.clear();for(let x of Gi.values())x.kill();Gi.clear(),await dp(),s?.socket?.close(1e3,h||`worker shutdown: ${f}`),R.connection?.socket?.close(1e3,h||`worker shutdown: ${f}`),s=null,R.connection=null,l&&(clearInterval(l),l=null),d&&(clearInterval(d),d=null),await w(g)}},E=f=>{k(f).finally(()=>process.exit(0))},b=f=>{console.log(`[worker] ${f||"control plane requested worker shutdown"}`),k("manual",f).finally(()=>process.exit(0))};process.once("SIGINT",E),process.once("SIGTERM",E),process.once("SIGHUP",E);let T=()=>{D({queuedTaskIds:r,runningTaskIds:t,lastTaskAt:new Date().toISOString()})},N=()=>{for(e=C();t.length<Math.max(1,e.maxConcurrency)&&r.length>0;){let f=r[0];r=r.slice(1);let h=n.get(f);if(!h)continue;let{task:x,runtimeEnvironment:F}=h;t=[...t,f],T();let vt=Yd({task:x,runtimeEnvironment:F,executorId:e.executorId,workspaceRoot:e.workspaceRoot,projectBindings:e.projectBindings,uploadPatchArtifact:e.executorToken?({taskId:Pe,filename:Pt,content:vp})=>Go({cloudUrl:e.cloudUrl,executorToken:e.executorToken,taskId:Pe,filename:Pt,content:vp}):void 0,send:P,onStart(){},onFinish(Pe){n.delete(Pe),o.delete(Pe),t=t.filter(Pt=>Pt!==Pe),T(),J()}});o.set(f,vt)}},_=null,J=()=>{N(),_?.drainPromptQueue()},B=f=>f.type==="task.ack"||f.type==="task.event"||f.type==="task.result"||f.type==="executor.agent.prompt.event"||f.type==="executor.agent.prompt.response",$=f=>f.type==="task.ack"||f.type==="task.result"||f.type==="executor.agent.prompt.response",v=f=>{if(!B(f))return;if(p.length>=1e3){let x=p.findIndex(F=>!$(F));p.splice(x===-1?0:x,1)}p.push(f)},I=()=>{for(;p.length>0;){let f=p[0];if(!f||!R.connection?.send(f))return;p.shift()}},P=f=>{let h=R.connection?.send(f)??!1;return h||v(f),h},O=f=>{a=R.stopped,!(a||i)&&(i=setTimeout(()=>{i=null,R.reconnectTimer=null,S()},5e3),R.reconnectTimer=i,D({daemonMode:"disconnected",connected:!1,paired:!0,lastDisconnectAt:new Date().toISOString(),lastError:f}))},S=()=>{if(!R.stopped){if(e=C(),!e.executorId||!e.executorToken){D({daemonMode:"unpaired",paired:!1,connected:!1,executorId:void 0,config:e,lastError:"This worker is not paired yet, so it cannot connect to the control plane."});return}D({daemonMode:"starting",connected:!1,paired:!0,executorId:e.executorId,config:e,lastConnectAttemptAt:new Date().toISOString()});try{let f=qo(e,{onOpen(){R.connection?.socket===f.socket&&(e=C(),D({daemonMode:"running",paired:!0,connected:!0,executorId:e.executorId,config:e,lastError:void 0}),console.log("[worker] connected to the control plane"),f.send({type:"executor.register",executorId:e.executorId,capabilities:e.capabilities,labels:e.labels,workspaceRoot:e.workspaceRoot,maxConcurrency:e.maxConcurrency,projectBindings:e.projectBindings,sshPubkey:Ui(),platform:process.platform,version:ue(),telemetry:fp(e.workspaceRoot),runningTaskIds:t,queuedTaskIds:r}),I(),J())},onMessage(h){R.connection?.socket===f.socket&&_?.handleMessage(h)},onError(h){R.connection?.socket===f.socket&&(_?.abortActivePrompts(),Yt.closeAll("control plane websocket error"),s=null,R.connection=null,_=null,console.error("[worker] websocket error",h),O(h))},onClose(h){if(R.connection?.socket!==f.socket)return;_?.abortActivePrompts(),Yt.closeAll("control plane websocket closed"),s=null,R.connection=null,_=null;let x=h.reason?.trim()||`code=${h.code}`;console.log("[worker] websocket disconnected from control plane",x),O(`Control plane connection closed (${x})`)}});s=f,R.connection=f,_=ep({expectedSocket:f.socket,getConnection:()=>s,getCurrentSocket:()=>R.connection?.socket,send:P,requestShutdown:b,openTerminalSession:mp,runTerminalCommand:pp,terminalSessions:Gi,assignedTasks:n,activeExecutions:o,getConfig:()=>e,setConfig:h=>{e=h},getQueuedTaskIds:()=>r,setQueuedTaskIds:h=>{r=h},getRunningTaskIds:()=>t,setRunningTaskIds:h=>{t=h},syncRuntimeState:T,drainExecutionQueue:J,promptQueueState:u})}catch(f){let h=f instanceof Error?f.message:"worker websocket init failed";console.error("[worker] failed to start websocket connection",h),O(h)}}};R.connect=S,!e.executorId||!e.executorToken?(D({daemonMode:"unpaired",paired:!1,connected:!1}),console.log(`[worker] not paired yet; run \`npx ${Cv()} connect --pairing-code <CODE>\` or use the local setup page first`)):S(),l=setInterval(()=>{t.length>0||r.length>0||ss().catch(f=>{let h=f instanceof Error?f.message:"worker auto update failed";console.error("[worker] auto update failed",h)})},1e4),d=setInterval(()=>{if(!s||!gr().connected)return;let f=new Date().toISOString();D({daemonMode:"running",connected:!0,paired:!0,lastHeartbeatAt:f,queuedTaskIds:r,runningTaskIds:t}),s.send({type:"executor.heartbeat",executorId:e.executorId,runningTaskIds:t,queuedTaskIds:r,projectBindings:e.projectBindings,sshPubkey:Ui(),at:f,telemetry:fp(e.workspaceRoot)})},15e3)};var vv=e=>{let t=new Map;for(let r=0;r<e.length;r+=1){let n=e[r];if(!n.startsWith("--"))continue;let o=n.slice(2),s=e[r+1];if(!s||s.startsWith("--")){t.set(o,!0);continue}t.set(o,s),r+=1}return t},Jr=(e,t)=>{let r=e.get(t);return typeof r=="string"?r.trim():""},wp=(e,t)=>e.has(t),Pv=e=>{if(Zi(e))return e;throw new Error(`Unknown agent type: ${e||"<empty>"}. Expected one of: ${Zr.join(", ")}`)},Sp=async e=>{let t=vv(e),r=Pv(Jr(t,"agent")),n=Jr(t,"prompt");if(!n)throw new Error("Missing required `--prompt` value.");let o=Jr(t,"cwd")||process.cwd(),s=Jr(t,"title")||`${r} Runtime Smoke`,i=Jr(t,"model")||void 0,a=C(),c=await Gr({agentType:r,cwd:o,title:s,prompt:n,executionModel:i,agentSettings:a.agentSettings[r],mcpServers:a.mcpServers,runtimeSkillPackages:a.runtimeSkillPackages,skipRuntimeCheck:wp(t,"skip-runtime-check")}),l={ok:!0,agentType:r,cwd:o,title:s,executionModel:i??"",output:c.output,sessionId:c.sessionId??"",filesChanged:"filesChanged"in c?c.filesChanged??[]:[]};if(wp(t,"json")){console.log(JSON.stringify(l,null,2));return}console.log(`[worker] ${r} runtime smoke succeeded`),console.log(c.output)};var Ev=()=>{let e=process.env.DOTENV_CONFIG_PATH?.trim();if(e){xp.config({path:e});return}it().name?.trim()==="vibemux"&&xp.config()};Ev();var ko=C();D({daemonMode:"idle",paired:!!(ko.executorId&&ko.executorToken),connected:!1,executorId:ko.executorId,config:ko});var wo=process.argv[2]||"daemon",qi=process.argv.slice(3),bv=new Set(["connect","daemon","open","doctor"]),Iv=()=>{setTimeout(()=>{try{process.kill(process.pid,"SIGTERM")}catch{process.exit(0)}},250)},Cp=e=>{let t=new Map;for(let r=0;r<e.length;r+=1){let n=e[r];if(!n.startsWith("--"))continue;let o=n.slice(2),s=e[r+1];if(!s||s.startsWith("--")){t.set(o,!0);continue}t.set(o,s),r+=1}return t},So=(e,t)=>{let r=e.get(t);return typeof r=="string"?r.trim():""},Tv=(e,t)=>e.has(t),Rv=e=>{if(e==="all"||e==="base"||e==="Codex"||e==="ClaudeCode"||e==="Pi"||e==="OpenCode")return e;throw new Error(`Unknown bootstrap target: ${e}`)},_v=async e=>{let t=Cp(e),r=So(t,"pairing-code"),n=So(t,"server-url"),o=So(t,"name"),s=C(),i=Et(r);if(!r)throw new Error(Xi(bt(s)));if(Kr(r,s)){let u={...s,cloudUrl:n||s.cloudUrl,executorName:o||s.executorName?.trim()||`worker-${process.pid}`};be(u),D({daemonMode:"starting",paired:!0,connected:!1,executorId:u.executorId,config:u,lastError:void 0}),console.log(`[worker] ${Xr()}`),yo();return}let a=o||s.executorName?.trim()||`worker-${process.pid}`,c={...s,cloudUrl:n||s.cloudUrl},l;try{l=await lr({pairingCode:r,machineId:c.machineId,machineName:c.machineName,name:a,workspaceRoot:c.workspaceRoot,maxConcurrency:c.maxConcurrency,labels:c.labels,capabilities:c.capabilities,platform:process.platform,version:ue()},c.cloudUrl)}catch(u){let p=u instanceof Error?u.message:"Pair request failed.";throw new Error(Yr(p,bt(s)))}let d={...c,executorName:a,executorId:l.executorId,executorToken:l.executorToken,lastPairedPairingCode:i};be(d),D({daemonMode:"starting",paired:!0,connected:!1,executorId:l.executorId,config:d,lastError:void 0}),console.log(`[worker] paired ${d.machineName} to ${d.cloudUrl} as ${a}`),yo()},Av=async()=>{if(bv.has(wo)&&(await _a(wo)).status!=="ready"){process.exitCode=1;return}switch(wo){case"connect":{await _v(qi);return}case"daemon":{yo();return}case"open":{kp();return}case"doctor":{await Ms();return}case"bootstrap":{let e=Cp(qi),t=Rv(So(e,"target")||"base"),r=await we({autoInstall:!0,target:t});if(Tv(e,"json"))console.log(JSON.stringify(r,null,2));else{console.log(`[worker] ${r.message}`);for(let n of r.items)console.log(`- ${n.label}: ${n.detail}`)}r.ok||(process.exitCode=1);return}case"browser-inspect":{await Da();return}case"runtime-smoke":{await Sp(qi);return}case"reset":{cn(),console.log("[worker] local config cleared");return}case"unpair":{ln(),console.log("[worker] pairing cleared");return}case"update":{let e=await En();console.log(`[worker] ${e.message}`),e.applied&&Iv();return}case"apply-update-internal":{let e=process.argv[3],t=process.argv[4],r=Number(process.argv[5]||"0");await oc(e,t,r);return}default:console.error(`Unknown worker command: ${wo}`),process.exitCode=1}};Av().catch(e=>{console.error(e instanceof Error?e.message:"worker command failed"),process.exitCode=1});
264
+ `,Fe,un,_t=new Map,pw=["-i","-l"],pn=e=>{let t=e?.trim();return t?t==="~"?xi.homedir():t.startsWith("~/")?Ci.join(xi.homedir(),t.slice(2)):t:process.cwd()},fr=e=>{if(!e?.trim())return!1;try{return tw(e,nw.X_OK),!0}catch{return!1}},Nl=e=>{let t=e.end();return t.length>0?t:""},mw=()=>{let e=rw(Ci.join(xi.tmpdir(),"vibemux-terminal-command-"));return{outputPath:Ci.join(e,"output.log"),cleanup:()=>{try{iw(e,{recursive:!0,force:!0})}catch{}}}},Ul=e=>{try{let t=ow(e,"utf8");return t.length<=$l?t:t.slice(0,$l)}catch{return""}},Ll=(e,t)=>new Promise(n=>{let r=!1,o=()=>{r||(r=!0,clearTimeout(s),e.off("exit",i),n())},i=()=>{o()},s=setTimeout(()=>{o()},Math.max(0,t));e.once("exit",i)}),jl=(e,t)=>{try{return process.platform!=="win32"?process.kill(-e,t):process.kill(e,t),!0}catch(n){if((typeof n=="object"&&n&&"code"in n?String(n.code):"")==="ESRCH")return!1;throw n}},gw=e=>{_t.set(e.pid,e),e.child.once("exit",()=>{_t.delete(e.pid)})},ql=async()=>{let e=Array.from(_t.values());if(e.length===0)return;for(let n of e)jl(n.pid,"SIGTERM")||_t.delete(n.pid);await Promise.all(e.map(n=>Ll(n.child,lw)));let t=Array.from(_t.values());for(let n of t)jl(n.pid,"SIGKILL")||_t.delete(n.pid);await Promise.all(t.map(n=>Ll(n.child,250)))},vi=(e,t,n)=>{let r=!1,o=setTimeout(()=>{r||(r=!0,e(t,n))},aw);return{markReady:()=>{r||(r=!0,clearTimeout(o),e(t,n))},dispose:()=>{clearTimeout(o)}}},fw=()=>{if(Fe!==void 0)return Fe;let e=["/usr/bin/python3","/opt/homebrew/bin/python3"];for(let n of e)if(fr(n))return Fe=n,Fe;let t=["python3","python"];for(let n of t){let r=ew(n,["-c","import sys"],{stdio:"ignore"});if(!r.error&&r.status===0)return Fe=n,Fe}return Fe=null,Fe},hw=()=>{if(un!==void 0)return un;try{un=dw("node-pty")}catch{un=null}return un},yr=()=>{let e=process.env.SHELL?.trim();return e&&fr(e)?e:process.platform==="darwin"&&fr("/bin/zsh")?"/bin/zsh":fr("/bin/bash")?"/bin/bash":"sh"},yw=["VITE_","NEXT_PUBLIC_","NUXT_PUBLIC_","PUBLIC_"],kw=new Set(["APP_URL","APP_BASE_URL","BETTER_AUTH_URL","BETTER_AUTH_TRUSTED_ORIGINS","VIBEMUX_PUBLIC_BASE_URL"]),kr=(e=process.env)=>{let t={};for(let[n,r]of Object.entries(e))typeof r>"u"||kw.has(n)||yw.some(o=>n.startsWith(o))||(t[n]=r);return t},zl=(e,t,n)=>new Promise(r=>{let o=yr(),i=pn(t);oe(i,n?.runtimeEnvironment);let s=Ce(kr(),n?.runtimeEnvironment),a=n?.mode??"wait";if(a==="background")try{let d=mw(),m=hr(o,["-l","-c",`exec >"$VIBEMUX_BACKGROUND_OUTPUT_PATH" 2>&1
265
+ ${e}`],{cwd:i,env:{...s,VIBEMUX_BACKGROUND_OUTPUT_PATH:d.outputPath},detached:!0,stdio:"ignore"}),g=m.pid;if(!g){d.cleanup(),r({command:e,cwd:i,stdout:"",stderr:"\u540E\u53F0\u73AF\u5883\u547D\u4EE4\u542F\u52A8\u5931\u8D25\uFF1A\u672A\u83B7\u53D6\u5230\u5B50\u8FDB\u7A0B pid\u3002",exitCode:1,mode:a,detached:!1,at:new Date().toISOString()});return}let k=!1,h=()=>{m.off("error",b),m.off("exit",I)},S=()=>{k||(k=!0,clearTimeout(_),h(),m.unref(),gw({pid:g,child:m,command:e,cwd:i,startedAt:new Date().toISOString()}),d.cleanup(),r({command:e,cwd:i,stdout:"",stderr:"",exitCode:0,mode:a,detached:!0,pid:g,at:new Date().toISOString()}))},y=H=>{if(k)return;k=!0,clearTimeout(_),h();let O=Ul(d.outputPath);d.cleanup(),r({command:e,cwd:i,stdout:"",stderr:O,exitCode:H,mode:a,detached:!1,pid:g,at:new Date().toISOString()})},b=H=>{let O=Ul(d.outputPath);d.cleanup(),!k&&(k=!0,clearTimeout(_),h(),r({command:e,cwd:i,stdout:"",stderr:O||H.message,exitCode:1,mode:a,detached:!1,pid:g,at:new Date().toISOString()}))},I=H=>{y(H??0)},_=setTimeout(()=>{S()},cw);m.on("error",b),m.on("exit",I);return}catch(d){r({command:e,cwd:i,stdout:"",stderr:d instanceof Error?d.message:"\u540E\u53F0\u73AF\u5883\u547D\u4EE4\u542F\u52A8\u5931\u8D25\u3002",exitCode:1,mode:a,detached:!1,at:new Date().toISOString()});return}let c=hr(o,["-l","-c",e],{cwd:i,env:s}),l="",u="";c.stdout.on("data",d=>{l+=d.toString()}),c.stderr.on("data",d=>{u+=d.toString()}),c.on("close",d=>{r({command:e,cwd:i,stdout:l,stderr:u,exitCode:d??0,mode:a,at:new Date().toISOString()})}),c.on("error",d=>{r({command:e,cwd:i,stdout:l,stderr:`${u}${d.message}`,exitCode:1,mode:a,at:new Date().toISOString()})})}),ww=e=>{let{cols:t=Fl,cwd:n,onExit:r,onLog:o,onOutput:i,onReady:s,rows:a=Gl,shell:c=yr()}=e,l=pn(n),u=hw();oe(l,e.runtimeEnvironment);let d=Ce(kr(),e.runtimeEnvironment);if(!u)throw new Error("node-pty \u4E0D\u53EF\u7528\uFF0C\u65E0\u6CD5\u542F\u52A8\u539F\u751F PTY\u3002");let m=u.spawn(c,pw,{cwd:l,env:d,cols:t,rows:a,name:Pi}),g=vi(s,"pty","node-pty");return m.onData(k=>{g.markReady(),o("pty output",{backend:"node-pty",chunkLength:k.length,preview:k.slice(0,120)}),i("stdout",k)}),m.onExit(({exitCode:k})=>{g.dispose(),o("pty exit",{backend:"node-pty",exitCode:k}),r(k??0)}),{backend:"node-pty",mode:"pty",write:k=>m.write(k),resize:(k,h)=>m.resize(Math.max(1,k),Math.max(1,h)),kill:()=>m.kill("SIGTERM")}},Sw=e=>{let{cols:t=Fl,cwd:n,onExit:r,onLog:o,onOutput:i,onReady:s,rows:a=Gl,shell:c=yr()}=e,l=pn(n),u=fw();oe(l,e.runtimeEnvironment);let d=Ce(kr(),e.runtimeEnvironment);if(!u)throw new Error("python3 \u4E0D\u53EF\u7528\uFF0C\u65E0\u6CD5\u542F\u52A8 PTY fallback\u3002");let m=hr(u,["-u","-c",uw],{cwd:l,env:{...d,DEVKANBAN_COLS:String(Math.max(1,t)),DEVKANBAN_CWD:l,DEVKANBAN_ROWS:String(Math.max(1,a)),DEVKANBAN_SHELL:c,DEVKANBAN_TERM_NAME:Pi},stdio:["pipe","pipe","pipe"]}),g=m.stdin;if(!g)throw m.kill("SIGTERM"),new Error("python PTY control pipe \u4E0D\u53EF\u7528\u3002");let k=new Dl("utf8"),h=new Dl("utf8"),S=vi(s,"pty","python-pty"),y=(I,_)=>{_.length!==0&&(I==="stdout"&&S.markReady(),o("pty output",{backend:"python-pty",chunkLength:_.length,preview:_.slice(0,120),stream:I}),i(I,_))};m.stdout.on("data",I=>{y("stdout",k.write(I))}),m.stderr.on("data",I=>{y("system",h.write(I))}),m.on("error",I=>{o("python pty error",{message:I.message}),i("system",`\r
266
+ [python-pty error] ${I.message}\r
267
+ `)}),m.on("close",I=>{S.dispose(),y("stdout",Nl(k)),y("system",Nl(h)),o("pty exit",{backend:"python-pty",exitCode:I??0}),r(I??0)});let b=I=>{g.destroyed||g.write(`${JSON.stringify(I)}
268
+ `)};return{backend:"python-pty",mode:"pty",write:I=>{b({type:"input",data:Buffer.from(I,"utf8").toString("base64")})},resize:(I,_)=>{b({type:"resize",cols:Math.max(1,I),rows:Math.max(1,_)})},kill:()=>{b({type:"close"}),g.end(),m.kill("SIGTERM")}}},xw=e=>{let{cwd:t,onExit:n,onLog:r,onOutput:o,onReady:i}=e,s=pn(t);oe(s,e.runtimeEnvironment);let a=Ce(kr(),e.runtimeEnvironment),c=hr("/bin/bash",["-il"],{cwd:s,env:{...a,BASH_SILENCE_DEPRECATION_WARNING:"1",TERM:process.env.TERM||Pi},stdio:"pipe"});c.stdin.setDefaultEncoding("utf8"),c.stdout.setEncoding("utf8"),c.stderr.setEncoding("utf8");let l=vi(i,"pipe","pipe");return c.stdout.on("data",u=>{l.markReady(),r("fallback shell stdout",{backend:"pipe",chunkLength:u.length,preview:u.slice(0,120)}),o("stdout",u)}),c.stderr.on("data",u=>{l.markReady(),r("fallback shell stderr",{backend:"pipe",chunkLength:u.length,preview:u.slice(0,120)}),o("stderr",u)}),c.on("error",u=>{r("fallback shell error",{message:u.message}),o("system",`\r
269
+ [fallback shell error] ${u.message}\r
270
+ `)}),c.on("close",u=>{l.dispose(),r("fallback shell exit",{backend:"pipe",exitCode:u??0}),n(u??0)}),c.stdin.write(`export PS1="$ "
271
+ `),{backend:"pipe",mode:"pipe",write:u=>{c.stdin.destroyed||c.stdin.write(u.replace(/\r/g,`
272
+ `))},resize:()=>{},kill:()=>c.kill("SIGTERM")}},Hl=e=>{let{cwd:t,onLog:n}=e,r=pn(t),o=e.shell??yr();n("opening pty session",{cwd:r,shell:o});try{return ww({...e,cwd:r,shell:o})}catch(i){n("node-pty spawn failed, falling back to python pty",{cwd:r,shell:o,error:i instanceof Error?i.message:"unknown"})}try{return Sw({...e,cwd:r,shell:o})}catch(i){n("python pty spawn failed, falling back to pipe shell",{cwd:r,shell:o,error:i instanceof Error?i.message:"unknown"})}return xw({...e,cwd:r})};var R={connection:null,reconnectTimer:null,stopped:!1,connect:null},Ei=new Map,Pw=()=>We()==="preview"?"vibemux-worker-preview":"vibemux-worker",Jl=e=>Kn({workspaceRoot:e,workerVersion:ie()}),Vl=e=>{let t=process.platform==="darwin"?["open",e]:process.platform==="win32"?["cmd","/c","start","",e]:["xdg-open",e];Cw(t[0],t.slice(1),{detached:!0,stdio:"ignore"}).unref()},Kl=async()=>{let e=ie(),t=await Ke();return{currentVersion:e,latestVersion:t.latestVersion||e,check:t}},Xl=(e,t,n,r)=>{let o=r.check.channel||We(),i=o==="preview"?"Vibemux Worker Preview":"Vibemux Worker",s=process.env.VIBEMUX_WORKER_AUTO_UPDATE?.trim().toLowerCase(),a=s!=="0"&&s!=="false"&&s!=="off",c=[["Mode",e],["Channel",o],["Current",r.currentVersion],["Latest",r.latestVersion],["Update Check",a?"enabled":"disabled"],["Cloud",t],["Local",n]],l=e==="open"?"Opening cloud and local consoles in your browser...":"Worker daemon is ready and waiting for tasks.",u=Math.max(...c.map(([k])=>k.length)),d=[i,"",...c.map(([k,h])=>`${k.padEnd(u)} : ${h}`),"",l],m=Math.max(...d.map(k=>k.length)),g=`+${"-".repeat(m+2)}+`;console.log(g);for(let k of d)console.log(`| ${k.padEnd(m)} |`);console.log(g)},Ql=()=>{let e=C();lo();let t=jt(e.localServerPort);Kl().then(n=>{Xl("open",e.cloudUrl,t,n)}).catch(n=>{let r=n instanceof Error?n.message:"worker version check failed";console.error("[worker] version check failed",r)}),setTimeout(()=>{Vl(e.cloudUrl),Vl(t)},250)};var js=()=>{R.stopped=!0,R.reconnectTimer&&(clearTimeout(R.reconnectTimer),R.reconnectTimer=null),R.connection?.socket?.close(1e3,"manual disconnect"),R.connection=null,D({daemonMode:"disconnected",connected:!1,lastDisconnectAt:new Date().toISOString(),lastError:"Control plane connection was disconnected manually."})},qn=()=>{let e=C();if(!e.executorId||!e.executorToken)throw new Error("This worker is not paired yet, so it cannot connect to the control plane.");R.stopped=!1,R.reconnectTimer&&(clearTimeout(R.reconnectTimer),R.reconnectTimer=null),R.connection?.socket?.close(1e3,"manual reconnect"),R.connection=null,R.connect?.()},wr=()=>{R.stopped=!1;let e=C(),t=[],n=[],r=new Map,o=new Map,i=null,s=null,a=!1,c=!1,l=null,u=null,d=ui(),m=[],g=new Date().toISOString();D({daemonMode:"starting",paired:!!(e.executorId&&e.executorToken),executorId:e.executorId,config:e,startedAt:g,lastConnectAttemptAt:g,lastError:void 0});let k=jt(e.localServerPort);Kl().then(p=>(Xl("daemon",e.cloudUrl,k,p),ao(p.check))).catch(p=>{let f=p instanceof Error?p.message:"worker startup banner failed";console.error("[worker] startup banner failed",f)}),$n(e.workspaceRoot);let h=lo(),S=async p=>{await new Promise(f=>{p.close(()=>f())})},y=async(p,f)=>{if(!c){c=!0,R.stopped=!0,a=!0,s&&(clearTimeout(s),s=null),R.reconnectTimer&&(clearTimeout(R.reconnectTimer),R.reconnectTimer=null),D({daemonMode:"disconnected",connected:!1,lastDisconnectAt:new Date().toISOString(),lastError:f||(p==="manual"?"Worker shutting down.":`Worker shutting down by ${p}.`)});for(let x of o.values())x.abort();o.clear();for(let x of Ei.values())x.kill();Ei.clear(),await ql(),i?.socket?.close(1e3,f||`worker shutdown: ${p}`),R.connection?.socket?.close(1e3,f||`worker shutdown: ${p}`),i=null,R.connection=null,l&&(clearInterval(l),l=null),u&&(clearInterval(u),u=null),await S(h)}},b=p=>{y(p).finally(()=>process.exit(0))},I=p=>{console.log(`[worker] ${p||"control plane requested worker shutdown"}`),y("manual",p).finally(()=>process.exit(0))};process.once("SIGINT",b),process.once("SIGTERM",b),process.once("SIGHUP",b);let _=()=>{D({queuedTaskIds:n,runningTaskIds:t,lastTaskAt:new Date().toISOString()})},H=()=>{for(e=C();t.length<Math.max(1,e.maxConcurrency)&&n.length>0;){let p=n[0];n=n.slice(1);let f=r.get(p);if(!f)continue;let{task:x,runtimeEnvironment:U}=f;t=[...t,p],_();let nt=Al({task:x,runtimeEnvironment:U,executorId:e.executorId,workspaceRoot:e.workspaceRoot,projectBindings:e.projectBindings,uploadPatchArtifact:e.executorToken?({taskId:he,filename:rt,content:nd})=>zr({cloudUrl:e.cloudUrl,executorToken:e.executorToken,taskId:he,filename:rt,content:nd}):void 0,send:v,onStart(){},onFinish(he){r.delete(he),o.delete(he),t=t.filter(rt=>rt!==he),_(),Y()}});o.set(p,nt)}},O=null,Y=()=>{H(),O?.drainPromptQueue()},B=p=>p.type==="task.ack"||p.type==="task.event"||p.type==="task.result"||p.type==="executor.agent.prompt.event"||p.type==="executor.agent.prompt.response",j=p=>p.type==="task.ack"||p.type==="task.result"||p.type==="executor.agent.prompt.response",P=p=>{if(!B(p))return;if(m.length>=1e3){let x=m.findIndex(U=>!j(U));m.splice(x===-1?0:x,1)}m.push(p)},E=()=>{for(;m.length>0;){let p=m[0];if(!p||!R.connection?.send(p))return;m.shift()}},v=p=>{let f=R.connection?.send(p)??!1;return f||P(p),f},M=p=>{a=R.stopped,!(a||s)&&(s=setTimeout(()=>{s=null,R.reconnectTimer=null,w()},5e3),R.reconnectTimer=s,D({daemonMode:"disconnected",connected:!1,paired:!0,lastDisconnectAt:new Date().toISOString(),lastError:p}))},w=()=>{if(!R.stopped){if(e=C(),!e.executorId||!e.executorToken){D({daemonMode:"unpaired",paired:!1,connected:!1,executorId:void 0,config:e,lastError:"This worker is not paired yet, so it cannot connect to the control plane."});return}D({daemonMode:"starting",connected:!1,paired:!0,executorId:e.executorId,config:e,lastConnectAttemptAt:new Date().toISOString()});try{let p=Hr(e,{onOpen(){R.connection?.socket===p.socket&&(e=C(),D({daemonMode:"running",paired:!0,connected:!0,executorId:e.executorId,config:e,lastError:void 0}),console.log("[worker] connected to the control plane"),p.send({type:"executor.register",executorId:e.executorId,capabilities:e.capabilities,labels:e.labels,workspaceRoot:e.workspaceRoot,maxConcurrency:e.maxConcurrency,projectBindings:e.projectBindings,sshPubkey:Si(),platform:process.platform,version:ie(),telemetry:Jl(e.workspaceRoot),runningTaskIds:t,queuedTaskIds:n}),E(),Y())},onMessage(f){R.connection?.socket===p.socket&&O?.handleMessage(f)},onError(f){R.connection?.socket===p.socket&&(O?.abortActivePrompts(),Ct.closeAll("control plane websocket error"),i=null,R.connection=null,O=null,console.error("[worker] websocket error",f),M(f))},onClose(f){if(R.connection?.socket!==p.socket)return;O?.abortActivePrompts(),Ct.closeAll("control plane websocket closed"),i=null,R.connection=null,O=null;let x=f.reason?.trim()||`code=${f.code}`;console.log("[worker] websocket disconnected from control plane",x),M(`Control plane connection closed (${x})`)}});i=p,R.connection=p,O=_l({expectedSocket:p.socket,getConnection:()=>i,getCurrentSocket:()=>R.connection?.socket,send:v,requestShutdown:I,openTerminalSession:Hl,runTerminalCommand:zl,terminalSessions:Ei,assignedTasks:r,activeExecutions:o,getConfig:()=>e,setConfig:f=>{e=f},getQueuedTaskIds:()=>n,setQueuedTaskIds:f=>{n=f},getRunningTaskIds:()=>t,setRunningTaskIds:f=>{t=f},syncRuntimeState:_,drainExecutionQueue:Y,promptQueueState:d})}catch(p){let f=p instanceof Error?p.message:"worker websocket init failed";console.error("[worker] failed to start websocket connection",f),M(f)}}};R.connect=w,!e.executorId||!e.executorToken?(D({daemonMode:"unpaired",paired:!1,connected:!1}),console.log(`[worker] not paired yet; run \`npx ${Pw()} connect --pairing-code <CODE>\` or use the local setup page first`)):w(),l=setInterval(()=>{t.length>0||n.length>0||ao().catch(p=>{let f=p instanceof Error?p.message:"worker auto update failed";console.error("[worker] auto update failed",f)})},1e4),u=setInterval(()=>{if(!i||!Lt().connected)return;let p=new Date().toISOString();D({daemonMode:"running",connected:!0,paired:!0,lastHeartbeatAt:p,queuedTaskIds:n,runningTaskIds:t}),i.send({type:"executor.heartbeat",executorId:e.executorId,runningTaskIds:t,queuedTaskIds:n,projectBindings:e.projectBindings,sshPubkey:Si(),at:p,telemetry:Jl(e.workspaceRoot)})},15e3)};var vw=e=>{let t=new Map;for(let n=0;n<e.length;n+=1){let r=e[n];if(!r.startsWith("--"))continue;let o=r.slice(2),i=e[n+1];if(!i||i.startsWith("--")){t.set(o,!0);continue}t.set(o,i),n+=1}return t},mn=(e,t)=>{let n=e.get(t);return typeof n=="string"?n.trim():""},Yl=(e,t)=>e.has(t),Ew=e=>{if(Wi(e))return e;throw new Error(`Unknown agent type: ${e||"<empty>"}. Expected one of: ${kn.join(", ")}`)},Zl=async e=>{let t=vw(e),n=Ew(mn(t,"agent")),r=mn(t,"prompt");if(!r)throw new Error("Missing required `--prompt` value.");let o=mn(t,"cwd")||process.cwd(),i=mn(t,"title")||`${n} Runtime Smoke`,s=mn(t,"model")||void 0,a=C(),c=await cn({agentType:n,cwd:o,title:i,prompt:r,executionModel:s,agentSettings:a.agentSettings[n],mcpServers:a.mcpServers,runtimeSkillPackages:a.runtimeSkillPackages,skipRuntimeCheck:Yl(t,"skip-runtime-check")}),l={ok:!0,agentType:n,cwd:o,title:i,executionModel:s??"",output:c.output,sessionId:c.sessionId??"",filesChanged:"filesChanged"in c?c.filesChanged??[]:[]};if(Yl(t,"json")){console.log(JSON.stringify(l,null,2));return}console.log(`[worker] ${n} runtime smoke succeeded`),console.log(c.output)};var Iw=()=>{let e=process.env.DOTENV_CONFIG_PATH?.trim();if(e){ed.config({path:e});return}qe().name?.trim()==="vibemux"&&ed.config()};Iw();var Sr=C();D({daemonMode:"idle",paired:!!(Sr.executorId&&Sr.executorToken),connected:!1,executorId:Sr.executorId,config:Sr});var xr=process.argv[2]||"daemon",Ii=process.argv.slice(3),bw=new Set(["connect","daemon","open","doctor"]),Rw=()=>{setTimeout(()=>{try{process.kill(process.pid,"SIGTERM")}catch{process.exit(0)}},250)},td=e=>{let t=new Map;for(let n=0;n<e.length;n+=1){let r=e[n];if(!r.startsWith("--"))continue;let o=r.slice(2),i=e[n+1];if(!i||i.startsWith("--")){t.set(o,!0);continue}t.set(o,i),n+=1}return t},Cr=(e,t)=>{let n=e.get(t);return typeof n=="string"?n.trim():""},Tw=(e,t)=>e.has(t),Aw=e=>{if(e==="all"||e==="base"||e==="Codex"||e==="ClaudeCode"||e==="Pi"||e==="OpenCode")return e;throw new Error(`Unknown bootstrap target: ${e}`)},Mw=async e=>{let t=td(e),n=Cr(t,"pairing-code"),r=Cr(t,"server-url"),o=Cr(t,"name"),i=C(),s=ot(n);if(!n)throw new Error(Mi(it(i)));if(gn(n,i)){let d={...i,cloudUrl:r||i.cloudUrl,executorName:o||i.executorName?.trim()||`worker-${process.pid}`};ke(d),D({daemonMode:"starting",paired:!0,connected:!1,executorId:d.executorId,config:d,lastError:void 0}),console.log(`[worker] ${fn()}`),wr();return}let a=o||i.executorName?.trim()||`worker-${process.pid}`,c={...i,cloudUrl:r||i.cloudUrl},l;try{l=await Wt({pairingCode:n,machineId:c.machineId,machineName:c.machineName,name:a,workspaceRoot:c.workspaceRoot,maxConcurrency:c.maxConcurrency,labels:c.labels,capabilities:c.capabilities,platform:process.platform,version:ie()},c.cloudUrl)}catch(d){let m=d instanceof Error?d.message:"Pair request failed.";throw new Error(hn(m,it(i)))}let u={...c,executorName:a,executorId:l.executorId,executorToken:l.executorToken,lastPairedPairingCode:s};ke(u),D({daemonMode:"starting",paired:!0,connected:!1,executorId:l.executorId,config:u,lastError:void 0}),console.log(`[worker] paired ${u.machineName} to ${u.cloudUrl} as ${a}`),wr()},Ow=async()=>{if(bw.has(xr)&&(await us(xr)).status!=="ready"){process.exitCode=1;return}switch(xr){case"connect":{await Mw(Ii);return}case"daemon":{wr();return}case"open":{Ql();return}case"doctor":{await go();return}case"bootstrap":{let e=td(Ii),t=Aw(Cr(e,"target")||"base"),n=await pe({autoInstall:!0,target:t});if(Tw(e,"json"))console.log(JSON.stringify(n,null,2));else{console.log(`[worker] ${n.message}`);for(let r of n.items)console.log(`- ${r.label}: ${r.detail}`)}n.ok||(process.exitCode=1);return}case"browser-inspect":{await ks();return}case"runtime-smoke":{await Zl(Ii);return}case"reset":{In(),console.log("[worker] local config cleared");return}case"unpair":{bn(),console.log("[worker] pairing cleared");return}case"update":{let e=await Gn();console.log(`[worker] ${e.message}`),e.applied&&Rw();return}case"apply-update-internal":{let e=process.argv[3],t=process.argv[4],n=Number(process.argv[5]||"0");await Us(e,t,n);return}default:console.error(`Unknown worker command: ${xr}`),process.exitCode=1}};Ow().catch(e=>{console.error(e instanceof Error?e.message:"worker command failed"),process.exitCode=1});