blade-code 0.10.177 → 0.10.179

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.
Files changed (42) hide show
  1. package/dist/blade.js +2 -2
  2. package/dist/{chunk-ycafgg7y.js → chunk-0360afm9.js} +1 -1
  3. package/dist/{chunk-5esk0stg.js → chunk-15cg3tqw.js} +1 -1
  4. package/dist/chunk-231gaqa1.js +1 -0
  5. package/dist/{chunk-vas2gskt.js → chunk-2kqbx2sp.js} +1 -1
  6. package/dist/{chunk-020t9es1.js → chunk-2w572bba.js} +1 -1
  7. package/dist/{chunk-bw5x4ywa.js → chunk-3e0s5qkj.js} +1 -1
  8. package/dist/{chunk-bhtn8jz2.js → chunk-5mkf6bpb.js} +1 -1
  9. package/dist/{chunk-4xqhmp61.js → chunk-6wttk27d.js} +1 -1
  10. package/dist/{chunk-f3dbn3bh.js → chunk-7zsr4pak.js} +1 -1
  11. package/dist/{chunk-b1rwsq1x.js → chunk-ajtfbz9m.js} +1 -1
  12. package/dist/{chunk-ysf775dm.js → chunk-dpfef2f8.js} +1 -1
  13. package/dist/{chunk-2srv8n3m.js → chunk-dz17ke04.js} +1 -1
  14. package/dist/{chunk-xaaege0t.js → chunk-dzv48tmt.js} +1 -1
  15. package/dist/{chunk-tacbdem4.js → chunk-faj0ss6e.js} +1 -1
  16. package/dist/{chunk-mt7tn0gn.js → chunk-hv85dpy8.js} +1 -1
  17. package/dist/{chunk-xg7fft50.js → chunk-j11qces8.js} +2 -2
  18. package/dist/chunk-js83khzc.js +1 -0
  19. package/dist/{chunk-95b7eanh.js → chunk-k1qe0zcj.js} +1 -1
  20. package/dist/{chunk-htd9p2fd.js → chunk-kfs412ed.js} +1 -1
  21. package/dist/{chunk-abpf6meb.js → chunk-kzcxhza1.js} +1 -1
  22. package/dist/{chunk-sbj9wyn4.js → chunk-ps0zk8ge.js} +1 -1
  23. package/dist/{chunk-dpjy7s53.js → chunk-qryer466.js} +1 -1
  24. package/dist/{chunk-gcmw83t0.js → chunk-sqhyk4g9.js} +1 -1
  25. package/dist/{chunk-gnnht0bk.js → chunk-tqe62b41.js} +1 -1
  26. package/dist/{chunk-we29e656.js → chunk-trgykfbc.js} +1 -1
  27. package/dist/{chunk-pwj9zz8z.js → chunk-ty6w9y3m.js} +1 -1
  28. package/dist/{chunk-rf4h1sf4.js → chunk-v9tgpyka.js} +1 -1
  29. package/dist/{chunk-d2nz3pfs.js → chunk-va2ep9wa.js} +5 -5
  30. package/dist/{chunk-1h6mg4zp.js → chunk-w38rgc8e.js} +1 -1
  31. package/dist/{chunk-4gns7fxm.js → chunk-wdamgm1p.js} +1 -1
  32. package/dist/{chunk-ta34g0p4.js → chunk-wnfzt93b.js} +1 -1
  33. package/dist/{chunk-nxxnm4qc.js → chunk-wx2hf7m1.js} +1 -1
  34. package/dist/{chunk-3cf79p63.js → chunk-x3x2dv34.js} +1 -1
  35. package/dist/{chunk-qjhsps46.js → chunk-xcxjrrzk.js} +1 -1
  36. package/dist/{chunk-j4wxy839.js → chunk-yev6mkb4.js} +1 -1
  37. package/dist/{chunk-qwjz3z9f.js → chunk-ygr2bvtm.js} +1 -1
  38. package/dist/{chunk-fkm1k8xy.js → chunk-ywqkqsff.js} +1 -1
  39. package/dist/{chunk-dd6rtthc.js → chunk-z47b782d.js} +1 -1
  40. package/package.json +1 -1
  41. package/dist/chunk-fkah1s04.js +0 -1
  42. package/dist/chunk-hgg2etq8.js +0 -1
@@ -1,4 +1,4 @@
1
- import{Ga as W3}from"./chunk-g01mth5d.js";import{Ja as T,Ka as $$,Pa as HW,Qa as fY,Ra as e0}from"./chunk-qjhsps46.js";import{$a as BX,Sa as Y5,Va as pZ,Za as tZ,_a as zX,bb as nW,db as aW,eb as A9,wb as sW}from"./chunk-30x3mcsb.js";import{Ab as p7,Bb as D2,Cb as GY,Db as x1,Eb as s7,Fb as DY,Gb as ZY,Hb as qY,Ib as wY,Jb as UQ,Lb as YX,Nb as V0,Pb as F2,Sb as p4,Ub as FZ,Vb as l4,Wb as i4,Yb as MJ,Zb as R$,dc as sX,ec as G8,fc as oX,gc as JX,ic as u1,jc as kX,oc as rY,rc as nY,xb as s5,yb as g7,zb as J1}from"./chunk-bw5x4ywa.js";import{$c as r8,$d as iY,Ac as k3,Bc as T1,Cc as ZJ,Dc as F0,Ec as S2,Fc as N1,Gc as S6,Hc as f9,Ic as m4,Jc as c4,Kc as YY,Lc as QY,Mc as TX,Nc as X3,Nd as V8,Oc as A1,Pc as Y3,Pd as f0,Qc as i8,Qd as b$,Rc as $1,Sc as Z1,Tc as l2,Uc as p2,Vc as i2,Wc as g6,Xc as u6,Xd as YW,Yc as d2,Yd as HX,Zc as z3,_c as m2,ad as M1,bd as e1,cd as c2,dd as $2,ed as Z2,ee as PX,fd as d6,fe as SX,gd as J2,hd as m6,he as o,id as c6,jd as k$,kd as p6,ld as O3,md as r2,nd as l6,od as i6,pd as r6,qd as n6,rd as N3,sd as b3,ud as j3,xc as v$,yc as CX,zc as r3}from"./chunk-ycafgg7y.js";import{ie as i,je as GQ,ke as KQ,le as hJ,ne as _2}from"./chunk-53fc0yrq.js";import{Ge as P9,He as J$,Ie as q2,Je as $9,Ke as RX,Le as fX,Ue as $V,ff as ZV,pe as tW,se as eW}from"./chunk-y5wngtz0.js";import{Bf as NJ,Cf as LJ}from"./chunk-jj4ggb04.js";import{Of as r4,Pf as q0,Qf as d,Tf as j0,Uf as P4,Vf as L2,Wf as G1,Xf as CZ,Yf as R1,Zf as pY,cg as B2}from"./chunk-pwj9zz8z.js";import{dg as d1}from"./chunk-t0gm0pn1.js";import{hg as jZ,ig as lY,ng as mY,og as cX,pg as S4}from"./chunk-1yq72zb7.js";import{qg as nZ}from"./chunk-kqvzmnja.js";import{tg as m0,ug as O1}from"./chunk-0mr8nexh.js";import{vg as eX}from"./chunk-50vwafn5.js";import{Ag as jX,xg as OX,yg as NX,zg as bX}from"./chunk-we29e656.js";import{$g as MX,Bg as I4,Cg as h4,Dg as g4,Fg as u4,Gg as d4,Hg as F1,Ig as FQ,Jg as I$,Kg as j$,Lg as G$,Mg as $5,Ng as V2,Og as z8,Pg as l1,Qg as i1,Rg as AX,Vg as J9,Xg as c0,Yg as f$,_g as k4,ah as vX}from"./chunk-fkm1k8xy.js";import{ch as D1,eh as T$,fh as O4}from"./chunk-3kszepm6.js";import{gh as d3,hh as W2,ih as m3,jh as s2,kh as c3,lh as p3,mh as Z4,nh as $4,oh as l3,ph as i3,qh as e6}from"./chunk-wcps5gjm.js";import{rh as LW,th as EX,uh as W8,vh as bJ}from"./chunk-vbjgcn49.js";import{xh as L9,zh as x0}from"./chunk-dpjy7s53.js";import{Ah as E6,Bh as R9,Ch as A6,Dh as r1}from"./chunk-3y2x6fb6.js";import{Ci as SY,Di as kY,Ei as vY,Fh as XJ,Fi as yY,Gi as AZ,Hi as xY,Ii as B1,Ji as IY,Kh as WJ,Ki as hY,Li as gY,Mh as D9,Ni as t3,Pi as xX,Qi as LX,Rh as UW,Ri as B0,Vh as VJ,Xh as wX,Zh as zY,_h as BY,pi as h1,si as $Y}from"./chunk-4gns7fxm.js";import{Ui as L$}from"./chunk-kv458q06.js";import{Wi as $X,Yi as ZX}from"./chunk-5v0jcyea.js";import{$i as X4,bj as C}from"./chunk-2f8d0km4.js";import{Dj as e,Fj as a6,Gj as X2,Hj as K,Ij as R3,Jj as P,Kj as u}from"./chunk-2mk914vk.js";import{Oj as _X,Pj as FX}from"./chunk-j8hbddjp.js";import{Qj as NW,Tj as _W}from"./chunk-4cdk4mds.js";import{Xj as AW}from"./chunk-020t9es1.js";import{bk as yX,ck as a0}from"./chunk-rvs364rz.js";import{Bk as E$,Gk as u3,fk as t,gk as N$,hk as D$,ik as t1,jk as o9,kk as u2,lk as X$,mk as e7,pk as I6,yk as P6}from"./chunk-4wx5sya5.js";import{Mk as Y$}from"./chunk-eg3ms291.js";import{randomUUID as M8}from"crypto";import{randomUUID as LV}from"node:crypto";var DV=String.raw`
1
+ import{Ga as W3}from"./chunk-g01mth5d.js";import{Ja as T,Ka as $$,Pa as HW,Qa as fY,Ra as e0}from"./chunk-xcxjrrzk.js";import{$a as BX,Sa as Y5,Va as pZ,Za as tZ,_a as zX,bb as nW,db as aW,eb as A9,wb as sW}from"./chunk-30x3mcsb.js";import{Ab as p7,Bb as D2,Cb as GY,Db as x1,Eb as s7,Fb as DY,Gb as ZY,Hb as qY,Ib as wY,Jb as UQ,Lb as YX,Nb as V0,Pb as F2,Sb as p4,Ub as FZ,Vb as l4,Wb as i4,Yb as MJ,Zb as R$,dc as sX,ec as G8,fc as oX,gc as JX,ic as u1,jc as kX,oc as rY,rc as nY,xb as s5,yb as g7,zb as J1}from"./chunk-3e0s5qkj.js";import{$c as r8,$d as iY,Ac as k3,Bc as T1,Cc as ZJ,Dc as F0,Ec as S2,Fc as N1,Gc as S6,Hc as f9,Ic as m4,Jc as c4,Kc as YY,Lc as QY,Mc as TX,Nc as X3,Nd as V8,Oc as A1,Pc as Y3,Pd as f0,Qc as i8,Qd as b$,Rc as $1,Sc as Z1,Tc as l2,Uc as p2,Vc as i2,Wc as g6,Xc as u6,Xd as YW,Yc as d2,Yd as HX,Zc as z3,_c as m2,ad as M1,bd as e1,cd as c2,dd as $2,ed as Z2,ee as PX,fd as d6,fe as SX,gd as J2,hd as m6,he as o,id as c6,jd as k$,kd as p6,ld as O3,md as r2,nd as l6,od as i6,pd as r6,qd as n6,rd as N3,sd as b3,ud as j3,xc as v$,yc as CX,zc as r3}from"./chunk-0360afm9.js";import{ie as i,je as GQ,ke as KQ,le as hJ,ne as _2}from"./chunk-53fc0yrq.js";import{Ge as P9,He as J$,Ie as q2,Je as $9,Ke as RX,Le as fX,Ue as $V,ff as ZV,pe as tW,se as eW}from"./chunk-y5wngtz0.js";import{Bf as NJ,Cf as LJ}from"./chunk-jj4ggb04.js";import{Of as r4,Pf as q0,Qf as d,Tf as j0,Uf as P4,Vf as L2,Wf as G1,Xf as CZ,Yf as R1,Zf as pY,cg as B2}from"./chunk-ty6w9y3m.js";import{dg as d1}from"./chunk-t0gm0pn1.js";import{hg as jZ,ig as lY,ng as mY,og as cX,pg as S4}from"./chunk-1yq72zb7.js";import{qg as nZ}from"./chunk-kqvzmnja.js";import{tg as m0,ug as O1}from"./chunk-0mr8nexh.js";import{vg as eX}from"./chunk-50vwafn5.js";import{Ag as jX,xg as OX,yg as NX,zg as bX}from"./chunk-trgykfbc.js";import{$g as MX,Bg as I4,Cg as h4,Dg as g4,Fg as u4,Gg as d4,Hg as F1,Ig as FQ,Jg as I$,Kg as j$,Lg as G$,Mg as $5,Ng as V2,Og as z8,Pg as l1,Qg as i1,Rg as AX,Vg as J9,Xg as c0,Yg as f$,_g as k4,ah as vX}from"./chunk-ywqkqsff.js";import{ch as D1,eh as T$,fh as O4}from"./chunk-3kszepm6.js";import{gh as d3,hh as W2,ih as m3,jh as s2,kh as c3,lh as p3,mh as Z4,nh as $4,oh as l3,ph as i3,qh as e6}from"./chunk-wcps5gjm.js";import{rh as LW,th as EX,uh as W8,vh as bJ}from"./chunk-vbjgcn49.js";import{xh as L9,zh as x0}from"./chunk-qryer466.js";import{Ah as E6,Bh as R9,Ch as A6,Dh as r1}from"./chunk-3y2x6fb6.js";import{Ci as SY,Di as kY,Ei as vY,Fh as XJ,Fi as yY,Gi as AZ,Hi as xY,Ii as B1,Ji as IY,Kh as WJ,Ki as hY,Li as gY,Mh as D9,Ni as t3,Pi as xX,Qi as LX,Rh as UW,Ri as B0,Vh as VJ,Xh as wX,Zh as zY,_h as BY,pi as h1,si as $Y}from"./chunk-wdamgm1p.js";import{Ui as L$}from"./chunk-kv458q06.js";import{Wi as $X,Yi as ZX}from"./chunk-5v0jcyea.js";import{$i as X4,bj as C}from"./chunk-2f8d0km4.js";import{Dj as e,Fj as a6,Gj as X2,Hj as K,Ij as R3,Jj as P,Kj as u}from"./chunk-2mk914vk.js";import{Oj as _X,Pj as FX}from"./chunk-j8hbddjp.js";import{Qj as NW,Tj as _W}from"./chunk-4cdk4mds.js";import{Xj as AW}from"./chunk-2w572bba.js";import{bk as yX,ck as a0}from"./chunk-rvs364rz.js";import{Bk as E$,Gk as u3,fk as t,gk as N$,hk as D$,ik as t1,jk as o9,kk as u2,lk as X$,mk as e7,pk as I6,yk as P6}from"./chunk-4wx5sya5.js";import{Mk as Y$}from"./chunk-eg3ms291.js";import{randomUUID as M8}from"crypto";import{randomUUID as LV}from"node:crypto";var DV=String.raw`
2
2
  const { spawn } = require('node:child_process');
3
3
  const [ownerPidValue, command, ...args] = process.argv.slice(1);
4
4
  const ownerPid = Number(ownerPidValue);
@@ -118,7 +118,7 @@ process.stdin.once('data', (chunk) => {
118
118
  `,{encoding:"utf8",mode:384,fsync:!0}),Q}remove($){l0.rmSync(this.filePath($),{force:!0})}async reapOrphans(){let $=0,Z=0,J=0,Y=0;for(let Q of this.readAll()){if(R6(Q.ownerPid)&&S6(Q.ownerPid,Q.ownerIdentity)){J++;continue}if(!R6(Q.rootPid)){if(process.platform!=="win32"&&E6(Q.rootPid)){let V=await A6(Q.rootPid,{validatePidOwnership:()=>!R6(Q.rootPid)});if(R6(Q.rootPid)){Y++;continue}if(!V.success)throw Error(`Failed to reap leaderless ${this.options.label} ${Q.processId}`);$++}else Z++;this.remove(Q.processId);continue}let X=()=>f9(Q.rootPid,Q.identity);if(!X()){Y++;continue}if(!(await R9(Q.rootPid,{validatePidOwnership:X})).success)throw Error(`Failed to reap ${this.options.label} ${Q.processId}`);$++,this.remove(Q.processId)}return{reaped:$,stale:Z,active:J,protected:Y}}readAll(){let $;try{$=l0.readdirSync(this.directory)}catch(J){if(J.code==="ENOENT")return[];throw Error(`Unable to read durable ${this.options.label} leases`)}let Z=[];for(let J of $){if(!J.endsWith(".json"))continue;try{let Y=f6.join(this.directory,J);if(l0.statSync(Y).size>FV)throw Error("lease exceeds size limit");let Q=JSON.parse(l0.readFileSync(Y,"utf8")),X=this.normalizeLease(Q);if(!X)throw Error("lease schema is invalid");Z.push(X)}catch{throw Error(`Invalid durable ${this.options.label} lease: ${J}`)}}return Z}normalizeLease($){if(!$||typeof $!=="object")return;let Z=$,J=new Set(["version",this.options.idField,"sessionId","ownerPid","ownerIdentity","rootPid","identity","startedAt"]),Y=Z[this.options.idField];if(Object.keys(Z).some((Q)=>!J.has(Q))||Z.version!==N8||Z.sessionId!==this.sessionId||typeof Y!=="string"||!Y.startsWith(this.options.idPrefix)||Y.length>128||!Number.isSafeInteger(Z.ownerPid)||Number(Z.ownerPid)<=1||!S2(Z.ownerIdentity)||!Number.isSafeInteger(Z.rootPid)||Number(Z.rootPid)<=1||!S2(Z.identity)||typeof Z.startedAt!=="string"||!Number.isFinite(Date.parse(Z.startedAt)))return;return{version:N8,processId:Y,sessionId:this.sessionId,ownerPid:Number(Z.ownerPid),ownerIdentity:Z.ownerIdentity,rootPid:Number(Z.rootPid),identity:Z.identity,startedAt:Z.startedAt}}filePath($){return f6.join(this.directory,`${T9($)}.json`)}}class b1{store;constructor($,Z){this.store=new k2($,Z,{directoryName:".foreground-processes",idField:"processId",idPrefix:"foreground_",label:"foreground process"})}register($,Z){this.store.register($,Z)}remove($){this.store.remove($)}reapOrphans(){return this.store.reapOrphans()}}class n1 extends Error{constructor($,Z){super($,Z);this.name="ForegroundProcessAdmissionError"}}async function a1($,Z,J,Y){let Q=`foreground_${LV()}`,{child:X,processTree:W}=M6($,Z,J);if(!X.pid)throw await W.terminate(),new n1("Foreground command gate did not expose a PID");let V=Y?new b1(Y.projectPath,Y.sessionId):void 0;try{V?.register(Q,X.pid)}catch(B){throw await W.terminate(),new n1("Failed to register durable foreground command lease",{cause:B})}let U,H,z=!1;return{child:X,processTree:W,processId:Q,release(){return U??=C6(X).catch((B)=>{throw W.terminate(),Error("Failed to release durable foreground command gate",{cause:B})}),U},handoff(B,G){if(z)return;if(H)throw Error("Cannot hand off a finalized foreground command");B(X.pid);try{V?.remove(Q),z=!0}catch(D){throw G(),D}},finalize(){return H??=(async()=>{if(!(await T6(X,W)).success)throw Error("Failed to finalize foreground command process group");if(!z)V?.remove(Q)})(),H}}}class v2{store;constructor($,Z){this.store=new k2($,Z,{directoryName:".background-shells",idField:"shellId",idPrefix:"bash_",label:"background shell"})}register($,Z){let J=this.store.register($,Z);return{version:J.version,shellId:$,sessionId:J.sessionId,ownerPid:J.ownerPid,ownerIdentity:J.ownerIdentity,rootPid:J.rootPid,identity:J.identity,startedAt:J.startedAt}}remove($){this.store.remove($)}reapOrphans(){return this.store.reapOrphans()}}import{StringDecoder as OV}from"node:string_decoder";class b8{buffer;decoder=new OV("utf8");totalChars=0;accountingComplete=!0;finished=!1;constructor($){this.buffer=new J$($)}append($){if(this.finished)return;let Z=typeof $==="string"?Buffer.from($):$;this.buffer.append(Z),this.totalChars+=this.decoder.write(Z).length}markAccountingIncomplete(){this.accountingComplete=!1}finish(){if(this.finished)return;this.totalChars+=this.decoder.end().length,this.finished=!0}snapshot(){let $=this.buffer.peek();return{content:$.content,totalBytes:$.totalBytes,retainedBytes:$.retainedBytes,omittedBytes:$.omittedBytes,totalChars:this.totalChars,accountingComplete:this.accountingComplete}}}class K${terminalOutputMerged;stdout;stderr;constructor($=P9,Z=!1){this.terminalOutputMerged=Z;this.stdout=new b8($),this.stderr=new b8($)}append($,Z){this.streamFor($).append(Z)}markAccountingIncomplete(){this.stdout.markAccountingIncomplete(),this.stderr.markAccountingIncomplete()}finish(){this.stdout.finish(),this.stderr.finish()}snapshot(){return{stdout:this.stdout.snapshot(),stderr:this.stderr.snapshot(),terminalOutputMerged:this.terminalOutputMerged}}streamFor($){return $==="stdout"?this.stdout:this.stderr}}import{constants as NV}from"node:fs";import{access as bV,mkdir as k6,realpath as x2}from"node:fs/promises";import jV from"node:os";import i0 from"node:path";import{Mutex as EV}from"async-mutex";var S9=new EV,l$,j8;function AV(){return import("@anthropic-ai/sandbox-runtime")}async function y2(){if(l$)return l$;if(!j8)j8=AV();return l$=await j8,l$}var MV={isSupportedPlatform:async()=>(await y2()).SandboxManager.isSupportedPlatform(),checkDependencies:async()=>(await y2()).SandboxManager.checkDependencies(),getDefaultWritePaths:async()=>(await y2()).getDefaultWritePaths(),initialize:async($)=>(await y2()).SandboxManager.initialize($),updateConfig:($)=>{if(!l$)throw Error("Sandbox runtime is not initialized");l$.SandboxManager.updateConfig($)},wrapWithSandboxArgv:async($,Z,J,Y,Q)=>(await y2()).SandboxManager.wrapWithSandboxArgv($,Z,J,Y,Q),cleanupAfterCommand:()=>l$?.SandboxManager.cleanupAfterCommand(),reset:async()=>{await l$?.SandboxManager.reset()}};function E8($){return{network:{allowedDomains:$,deniedDomains:[],strictAllowlist:!0},filesystem:{denyRead:[],allowRead:[],allowWrite:[],denyWrite:[]},enableWeakerNestedSandbox:!0}}class i$ extends Error{constructor($){super($);this.name="WorkspaceSandboxUnavailableError"}}class s1 extends Error{constructor($){super($);this.name="WorkspaceSandboxBoundaryError"}}class k9{backend;constructor($){this.backend=$}async prepare($){let Z=i0.resolve($.workspaceRoot),J=i0.resolve($.cwd);if(!F0.isWithinWorkspace(J,Z))throw new s1(`Bash cwd is outside the workspace sandbox: ${$.cwd}`);let Y,Q;try{[Y,Q]=await Promise.all([x2(Z),x2(J)])}catch(X){throw new s1(`Workspace sandbox path cannot be resolved: ${X instanceof Error?X.message:String(X)}`)}if(!F0.isWithinWorkspace(Q,Y))throw new s1(`Bash cwd resolves outside the workspace sandbox: ${$.cwd}`);return this.backend.prepare({...$,cwd:Q,workspaceRoot:Y})}}class v9{runtime;tempRoot;defaultWritePaths;initialization;constructor($={}){this.runtime=$.runtime??MV,this.tempRoot=$.tempRoot??i0.join(t(),"sandbox-tmp"),this.defaultWritePaths=$.defaultWritePaths}async prepare($){await this.ensureInitialized();let Z=await this.prepareTempRoot(),J=i0.join(Z,"tmp"),Y=i0.join(Z,"cache"),Q=i0.join(Y,"npm"),X=i0.join(Y,"bun");await Promise.all([k6(J,{recursive:!0}),k6(Q,{recursive:!0}),k6(X,{recursive:!0})]);let V=(this.defaultWritePaths??await this.runtime.getDefaultWritePaths()).filter((_)=>!_.startsWith("/dev/")),U=$.access==="workspace-read-only",H=U?await x2(process.execPath).catch(()=>i0.resolve(process.execPath)):void 0,z=U?await CV("node",$.trustedPath):void 0,B=U?[jV.homedir(),t(),process.env.BLADE_REAL_API_CREDENTIALS_FILE].filter((_)=>typeof _==="string"&&_.trim().length>0).map((_)=>i0.resolve(_)).filter((_,O,b)=>b.indexOf(_)===O):[],G=process.platform==="win32"?"bash":"/bin/bash",D,w,q=()=>{if(!w)return;let _=w;w=void 0;try{this.runtime.updateConfig(E8(["*"]))}finally{_()}},F=async()=>{let _=process.env.CLAUDE_CODE_TMPDIR;process.env.CLAUDE_CODE_TMPDIR=J;try{return await this.runtime.wrapWithSandboxArgv($.command,G,{network:U?{allowedDomains:[],deniedDomains:[],strictAllowlist:!0}:{allowedDomains:["*"],deniedDomains:[],strictAllowlist:!0},filesystem:{denyRead:B,allowRead:U&&H?[$.workspaceRoot,H,...z?[z]:[],Z]:[],allowWrite:U?[Z]:[$.workspaceRoot,Z],denyWrite:U?[$.workspaceRoot,...V]:V},git:{safeDirectories:[$.workspaceRoot]}},$.signal,$.cwd)}finally{if(_===void 0)delete process.env.CLAUDE_CODE_TMPDIR;else process.env.CLAUDE_CODE_TMPDIR=_}};try{if(U)w=await S9.acquire(),this.runtime.updateConfig(E8([])),D=await F();else D=await S9.runExclusive(F)}catch(_){if(q(),_ instanceof Error&&_.name==="AbortError")throw _;throw new i$(`Workspace sandbox failed to prepare the command: ${_ instanceof Error?_.message:String(_)}`)}let L=!1;return{executable:D.argv[0]??G,args:D.argv.slice(1),env:{...D.env,TMPDIR:J,TMP:J,TEMP:J,XDG_CACHE_HOME:Y,npm_config_cache:Q,BUN_INSTALL_CACHE_DIR:X},sandboxed:!0,inheritProcessEnv:!U,cleanup:()=>{if(L)return;L=!0;try{this.runtime.cleanupAfterCommand()}finally{q()}}}}async dispose(){this.initialization=void 0,await this.runtime.reset()}async ensureInitialized(){if(!this.initialization)this.initialization=this.initializeRuntime().catch(($)=>{throw this.initialization=void 0,$});return this.initialization}async initializeRuntime(){if(!await this.runtime.isSupportedPlatform())throw new i$(`Workspace sandbox is unsupported on ${process.platform}`);let $=await this.runtime.checkDependencies();if($.errors.length>0)throw new i$(`Workspace sandbox dependencies are unavailable: ${$.errors.join("; ")}`);try{await this.runtime.initialize(E8(["*"]))}catch(Z){throw new i$(`Workspace sandbox failed to initialize: ${Z instanceof Error?Z.message:String(Z)}`)}}async prepareTempRoot(){return await k6(this.tempRoot,{recursive:!0}),x2(this.tempRoot)}}async function CV($,Z){if(!Z)return;let J=process.platform==="win32"?[`${$}.exe`,`${$}.cmd`,$]:[$];for(let Y of Z.split(i0.delimiter)){if(!i0.isAbsolute(Y))continue;for(let Q of J){let X=i0.join(Y,Q);try{return await bV(X,NV.X_OK),await x2(X)}catch{}}}return}function I2($,Z){let J=Z.toLowerCase();return $===71&&J.includes("sandbox-exec")||J.includes("sandbox_apply: operation not permitted")||J.includes("bwrap: creating new namespace failed")||J.includes("failed to create new user namespace")||J.includes("srt-win sandbox failed")}var TV=new v9,RV={prepare:($)=>TV.prepare($)},A8=new k9(RV);var fV=16,PV=4;class r$ extends Error{scope;limit;constructor($,Z){super(`Background Shell ${$} capacity is full (max ${Z})`);this.scope=$;this.limit=Z;this.name="BackgroundShellCapacityError"}}class Y0{static instance=null;processes=new Map;activeGlobal=0;activeBySession=new Map;globalMaxActive;sessionMaxActive;constructor($={}){if(this.globalMaxActive=this.positiveLimit($.globalMaxActive??fV,"globalMaxActive"),this.sessionMaxActive=this.positiveLimit($.sessionMaxActive??PV,"sessionMaxActive"),this.sessionMaxActive>this.globalMaxActive)throw Error("sessionMaxActive must not exceed globalMaxActive")}static getInstance(){if(!Y0.instance)Y0.instance=new Y0;return Y0.instance}async startBackgroundProcess($){let Z;try{Z=this.reserve($.sessionId)}catch(G){throw $.sandboxedCommand?.cleanup(),G}let J=`bash_${M8()}`,Y={};for(let[G,D]of Object.entries({...process.env,...$.env,...$.sandboxedCommand?.env,BLADE_CLI:"1"}))if(D!==void 0)Y[G]=D;let Q=$.sandboxedCommand?.executable??"bash",X=$.sandboxedCommand?.args??["-c",$.command],W,V;try{({child:W,processTree:V}=M6(Q,X,{cwd:$.cwd||C(),env:Y,stdio:["pipe","pipe","pipe"]}))}catch(G){throw Z(),$.sandboxedCommand?.cleanup(),G}if(!W.pid)throw V.terminate(),Z(),$.sandboxedCommand?.cleanup(),Error("Background process did not expose a PID");let U=new v2($.projectPath??$.cwd??C(),$.sessionId);try{U.register(J,W.pid)}catch(G){let D=!0;try{process.kill(W.pid,0)}catch(w){D=w instanceof Error&&"code"in w&&w.code==="EPERM"}if(D)throw W.kill("SIGKILL"),V.terminate(),Z(),$.sandboxedCommand?.cleanup(),G}let H=this.createCompletion(),z={id:J,command:$.command,sessionId:$.sessionId,cwd:$.cwd,env:$.env,process:W,processTree:V,pid:W.pid,status:"running",startTime:Date.now(),pendingStdout:new J$,pendingStderr:new J$,sandboxed:Boolean($.sandboxedCommand),transport:"local",visible:!0,autoBackgrounded:!1,backgroundReason:"explicit",completion:H.promise,resolveCompletion:H.resolve,releaseAdmission:this.releaseOnce(Z),terminalSettled:!1,leaseStore:U};W.stdout?.on("data",(G)=>{z.pendingStdout.append(G)}),W.stderr?.on("data",(G)=>{z.pendingStderr.append(G)});let B=()=>{return z.finalizationPromise??=T6(W,V).then((G)=>{if(G.success)return z.leaseStore?.remove(z.id),!0;return!1}).catch(()=>!1),z.finalizationPromise};W.on("close",(G,D)=>{(async()=>{let w=await B();if(!w)z.finalizationFailed=!0;if(z.terminalSettled)return;z.terminalSettled=!0,$.sandboxedCommand?.cleanup();let q=z.sandboxed&&I2(G,z.pendingStderr.peek().content);if(z.status=z.status==="killed"?"killed":q||!w?"error":"exited",z.exitCode=G,z.signal=D,q)z.errorMessage="Workspace sandbox failed to start; command was not executed";else if(!w)z.errorMessage="Background command process group could not be finalized";z.endTime=Date.now(),z.process=void 0,z.releaseAdmission(),z.resolveCompletion()})()}),W.on("error",(G)=>{(async()=>{let D=await B();if(!D)z.finalizationFailed=!0;if(z.terminalSettled)return;z.terminalSettled=!0,$.sandboxedCommand?.cleanup(),z.status="error",z.errorMessage=D?G.message:"Background command process group could not be finalized",z.endTime=Date.now(),z.process=void 0,z.pendingStderr.append(`
119
119
  [error] ${G.message}`),z.releaseAdmission(),z.resolveCompletion()})()}),this.processes.set(J,z);try{await C6(W)}catch(G){throw z.status="killed",z.endTime=Date.now(),await V.terminate(),z.leaseStore?.remove(z.id),this.processes.delete(J),z.releaseAdmission(),z.resolveCompletion(),$.sandboxedCommand?.cleanup(),Error("Failed to release durable background command gate",{cause:G})}return z}async startForegroundCandidate($){let Z=this.reserve($.sessionId),J=`bash_${M8()}`,Y=$.sandboxedCommand?.executable??"bash",Q=$.sandboxedCommand?.args??["-c",$.command],X=$.sandboxedCommand?.inheritProcessEnv===!1?{}:process.env,W;try{W=await a1(Y,Q,{cwd:$.cwd||C(),env:{...X,...$.env,...$.sandboxedCommand?.env,BLADE_CLI:"1"},stdio:["pipe","pipe","pipe"]},$.ownership)}catch(G){throw Z(),$.sandboxedCommand?.cleanup(),G}let{child:V,processTree:U}=W,H=this.createCompletion(),z={id:J,command:$.command,sessionId:$.sessionId,cwd:$.cwd,env:$.env,process:V,processTree:U,pid:V.pid,status:"running",startTime:Date.now(),pendingStdout:new J$,pendingStderr:new J$,sandboxed:Boolean($.sandboxedCommand),transport:"local",visible:!1,autoBackgrounded:!1,completion:H.promise,resolveCompletion:H.resolve,releaseAdmission:this.releaseOnce(Z),foreground:W,foregroundCapture:new K$,terminalSettled:!1};V.stdout?.on("data",(G)=>{z.pendingStdout.append(G),z.foregroundCapture?.append("stdout",G)}),V.stderr?.on("data",(G)=>{z.pendingStderr.append(G),z.foregroundCapture?.append("stderr",G)});let B=()=>{return z.finalizationPromise??=W.finalize().then(()=>{return z.leaseStore?.remove(z.id),!0}).catch(()=>!1),z.finalizationPromise};V.on("close",(G,D)=>{(async()=>{let w=await B();if(!w)z.finalizationFailed=!0;if(z.terminalSettled)return;z.terminalSettled=!0,$.sandboxedCommand?.cleanup();let q=z.sandboxed&&I2(G,z.pendingStderr.peek().content);if(z.status=z.status!=="running"?z.status:q||!w?"error":"exited",z.exitCode=G,z.signal=D,q)z.errorMessage="Workspace sandbox failed to start; command was not executed";else if(!w)z.errorMessage="Background command process group could not be finalized";z.endTime=Date.now(),z.process=void 0,z.releaseAdmission(),z.resolveCompletion()})()}),V.on("error",(G)=>{(async()=>{let D=await B();if(!D)z.finalizationFailed=!0;if(z.terminalSettled)return;z.terminalSettled=!0,$.sandboxedCommand?.cleanup(),z.status="error",z.errorMessage=D?G.message:"Background command process group could not be finalized",z.endTime=Date.now(),z.process=void 0,z.pendingStderr.append(`
120
120
  [error] ${G.message}`),z.foregroundCapture?.append("stderr",`
121
- [error] ${G.message}`),z.releaseAdmission(),z.resolveCompletion()})()}),this.processes.set(J,z);try{await W.release()}catch(G){throw z.status="aborted",z.endTime=Date.now(),await U.terminate(),this.processes.delete(J),z.releaseAdmission(),z.resolveCompletion(),$.sandboxedCommand?.cleanup(),G}return z}startExternalForegroundCandidate($){let Z=this.reserve($.sessionId),J=`bash_${M8()}`,Y=this.createCompletion(),Q={id:J,command:$.command,sessionId:$.sessionId,cwd:$.cwd,status:"running",startTime:Date.now(),pendingStdout:new J$,pendingStderr:new J$,sandboxed:$.sandboxed??!1,transport:"acp",visible:!1,autoBackgrounded:!1,completion:Y.promise,resolveCompletion:Y.resolve,releaseAdmission:this.releaseOnce(Z),terminateExternal:$.terminate,terminalSettled:!1};return this.processes.set(J,Q),Q}promoteExternalForegroundCandidate($,Z,J){let Y=this.getOwnedProcess($,Z);if(!Y||Y.visible||Y.status!=="running"||Y.transport!=="acp")return;return Y.visible=!0,Y.autoBackgrounded=!0,Y.backgroundReason="foreground_budget",Y.foregroundBudgetMs=J,Y.foregroundCapture=void 0,Y}appendExternalOutput($,Z,J,Y){let Q=this.getOwnedProcess($,Z);if(!Q||Q.transport!=="acp")return;if(J==="stdout")Q.pendingStdout.append(Y);else Q.pendingStderr.append(Y)}replaceExternalOutput($,Z,J,Y){let Q=this.getOwnedProcess($,Z);if(!Q||Q.transport!=="acp")return;Q.pendingStdout=new J$,Q.pendingStderr=new J$,Q.pendingStdout.append(J),Q.pendingStderr.append(Y)}completeExternalProcess($,Z,J){let Y=this.getOwnedProcess($,Z);if(!Y||Y.transport!=="acp"||Y.terminalSettled)return;if(Y.terminalSettled=!0,Y.status=J.status,Y.exitCode=J.exitCode,Y.signal=J.signal,Y.errorMessage=J.errorMessage,J.finalizationFailed)Y.finalizationFailed=!0;Y.endTime=Date.now(),Y.releaseAdmission(),Y.resolveCompletion()}promoteForegroundCandidate($,Z,J,Y){let Q=this.getOwnedProcess($,Z);if(!Q||Q.visible||Q.status!=="running"||!Q.foreground)return;let X=new v2(J,Z);return Q.foreground.handoff((W)=>X.register($,W),()=>X.remove($)),Q.leaseStore=X,Q.visible=!0,Q.autoBackgrounded=!0,Q.backgroundReason="foreground_budget",Q.foregroundBudgetMs=Y,Q}waitForCompletion($,Z){return this.getOwnedProcess($,Z)?.completion}consumeCandidateOutput($,Z){let J=this.getOwnedProcess($,Z);if(!J)return;let Y=this.snapshot(J,!0);if(J.foregroundCapture)J.foregroundCapture.finish(),Y.capture=J.foregroundCapture.snapshot(),J.foregroundCapture=void 0;return Y}removeCandidate($,Z){let J=this.getOwnedProcess($,Z);if(!J||J.visible||J.status==="running")return;this.processes.delete($)}terminateForegroundCandidate($,Z,J){let Y=this.getOwnedProcess($,Z);if(!Y||Y.visible)return;return this.terminateProcess(Y,J)}consumeOutput($,Z){let J=this.getProcess($,Z);if(!J)return;return this.snapshot(J,!0)}getProcess($,Z){let J=this.getOwnedProcess($,Z);return J?.visible?J:void 0}listForSession($){return Array.from(this.processes.values()).filter((Z)=>Z.sessionId===$&&Z.visible)}async writeInput($,Z,J,Y=!1){let Q=this.getProcess($,Z);if(!Q)return;if(Q.transport==="acp")return{success:!1,status:Q.status,bytesWritten:0,stdinClosed:!1,errorMessage:"ACP background terminals do not support stdin writes"};let X=Q.process?.stdin;if(Q.status!=="running"||!X||X.destroyed||X.writableEnded)return{success:!1,status:Q.status,bytesWritten:0,stdinClosed:!X||X.destroyed||X.writableEnded,errorMessage:"Shell stdin is not writable"};try{return await new Promise((W,V)=>{let U=(z)=>{X.off("error",U),V(z)},H=(z)=>{if(X.off("error",U),z)V(z);else W()};if(X.once("error",U),Y)X.end(J,H);else X.write(J,H)}),{success:!0,status:Q.status,bytesWritten:Buffer.byteLength(J),stdinClosed:Y}}catch(W){return{success:!1,status:Q.status,bytesWritten:0,stdinClosed:X.destroyed||X.writableEnded,errorMessage:W instanceof Error?W.message:"Failed to write stdin"}}}async kill($,Z){let J=this.getOwnedProcess($,Z);if(!J?.visible)return;return this.terminateProcess(J)}async killSession($){let Z=Array.from(this.processes.values()).filter((J)=>J.sessionId===$);await Promise.all(Z.map((J)=>this.terminateProcess(J)));for(let J of Z)this.processes.delete(J.id)}reapOrphanedSession($,Z){return new v2(Z,$).reapOrphans()}async terminateProcess($,Z="killed"){if($.externalTerminationPromise)return $.externalTerminationPromise;if($.status!=="running")return{success:!1,alreadyExited:!0,status:$.status,...$.finalizationFailed?{finalizationFailed:!0}:{},pid:$.pid,exitCode:$.exitCode,signal:$.signal};if($.terminateExternal){let Y=$.terminateExternal;return $.externalTerminationPromise=Promise.resolve().then(async()=>{try{await Y(Z)}catch{this.completeExternalProcess($.id,$.sessionId,{status:"error",finalizationFailed:!0,errorMessage:"ACP terminal finalization failed"})}return $.releaseAdmission(),{success:$.status!=="error",alreadyExited:!1,status:$.status,...$.finalizationFailed?{finalizationFailed:!0}:{},pid:$.pid,exitCode:$.exitCode,signal:$.signal}}).finally(()=>{$.externalTerminationPromise=void 0}),$.externalTerminationPromise}if($.status=Z==="timeout"?"timed_out":Z==="aborted"?"aborted":"killed",$.endTime=Date.now(),!$.process)return $.releaseAdmission(),{success:!1,alreadyExited:!0,status:$.status,...$.finalizationFailed?{finalizationFailed:!0}:{},pid:$.pid,exitCode:$.exitCode,signal:$.signal};let J=await $.processTree?.terminate();if(!J?.success)return $.status="error",$.errorMessage="Failed to terminate owned process tree",{success:!1,alreadyExited:J?.alreadyExited??!1,status:$.status,pid:$.pid,exitCode:$.exitCode,signal:$.signal};return $.leaseStore?.remove($.id),$.releaseAdmission(),{success:!0,alreadyExited:J.alreadyExited,status:$.status,pid:$.pid,exitCode:$.exitCode,signal:$.signal}}async killAll(){await Promise.all(Array.from(this.processes.values()).map(($)=>this.terminateProcess($))),this.processes.clear()}getAdmissionStats(){return{active:this.activeGlobal,maxActive:this.globalMaxActive,sessions:Object.fromEntries([...this.activeBySession].map(([$,Z])=>[$,{active:Z,maxActive:this.sessionMaxActive}]))}}getOwnedProcess($,Z){let J=this.processes.get($);return J?.sessionId===Z?J:void 0}snapshot($,Z){let J=Z?$.pendingStdout.consume():$.pendingStdout.peek(),Y=Z?$.pendingStderr.consume():$.pendingStderr.peek();return{id:$.id,command:$.command,status:$.status,stdout:J.content,stderr:Y.content,stdoutOmittedBytes:J.omittedBytes,stderrOmittedBytes:Y.omittedBytes,stdoutTotalBytes:J.totalBytes,stderrTotalBytes:Y.totalBytes,exitCode:$.exitCode,signal:$.signal,pid:$.pid,startedAt:$.startTime,endedAt:$.endTime,errorMessage:$.errorMessage,...$.finalizationFailed?{finalizationFailed:!0}:{},sandboxed:$.sandboxed,transport:$.transport,autoBackgrounded:$.autoBackgrounded,backgroundReason:$.backgroundReason,foregroundBudgetMs:$.foregroundBudgetMs}}reserve($){let Z=this.activeBySession.get($)??0;if(Z>=this.sessionMaxActive)throw new r$("session",this.sessionMaxActive);if(this.activeGlobal>=this.globalMaxActive)throw new r$("global",this.globalMaxActive);return this.activeGlobal++,this.activeBySession.set($,Z+1),this.releaseOnce(()=>{this.activeGlobal=Math.max(0,this.activeGlobal-1);let J=Math.max(0,(this.activeBySession.get($)??0)-1);if(J===0)this.activeBySession.delete($);else this.activeBySession.set($,J)})}releaseOnce($){let Z=!1;return()=>{if(Z)return;Z=!0,$()}}createCompletion(){let $;return{promise:new Promise((J)=>{$=J}),resolve:$}}positiveLimit($,Z){if(!Number.isSafeInteger($)||$<=0)throw Error(`${Z} must be a positive safe integer`);return $}}import{stat as GX}from"node:fs/promises";import{Mutex as KX}from"async-mutex";import{nanoid as cD}from"nanoid";import*as _0 from"path";import*as Q$ from"fs/promises";class h2{async readTextFile($){return Q$.readFile($,"utf-8")}async writeTextFile($,Z){await Q$.writeFile($,Z,"utf-8")}async exists($){try{return await Q$.access($),!0}catch(Z){if(Z.code==="ENOENT")return!1;throw Z}}async readBinaryFile($){return Q$.readFile($)}async stat($){try{let Z=await Q$.stat($);return{size:Z.size,isDirectory:Z.isDirectory(),isFile:Z.isFile(),mtime:Z.mtime}}catch(Z){if(Z.code==="ENOENT")return null;throw Z}}async mkdir($,Z){await Q$.mkdir($,{recursive:Z?.recursive??!1,mode:Z?.mode??493})}}var SV=new h2;function n$(){return SV}import{createHash as t9}from"node:crypto";import*as I8 from"@agentclientprotocol/sdk";import{createHash as kV}from"node:crypto";var g0=30000,v6=5000,C8=120000,T8=60000;var R8=31,f8=1024,vV={aborted:"ACP remote file request was aborted",timeout:"ACP remote file request timed out",busy:"ACP remote file path is busy",capacity:"ACP remote file request capacity is full",closed:"ACP remote filesystem connection is closed","stale-reconciliation":"ACP remote file reconciliation is stale"};class g extends Error{reason;operation;dispatched;requestPending;name="AcpRemoteFileBoundaryError";constructor($,Z,J,Y){super(vV[$]);this.reason=$;this.operation=Z;this.dispatched=J;this.requestPending=Y}}function N0($){return D$($),`acp-remote-connection-path:${kV("sha256").update($.collisionIdentity).digest("hex")}`}var P8=new WeakMap,S8=new WeakMap;function y9(){return{normalTokens:new Set,recoveryToken:void 0,mutationStates:new Map,readTokens:new Map,recoveryPermits:new Map,closed:!1}}function yV($,Z){let J,Y,Q=new Promise((X,W)=>{J=X,Y=W});return Q.catch(()=>{return}),{kind:Z,operation:$.operation,purpose:$.purpose,sessionId:$.sessionId,pathIdentity:$.pathIdentity,exactPathIdentity:$.exactPathIdentity,controller:new AbortController,localPromise:Q,resolve:J,reject:Y,timer:void 0,parentAbortHandler:void 0,deadlineAbortHandler:void 0,settled:!1,dispatched:!1,requestPending:!1,timedOut:!1,aborted:!1,boundaryError:void 0}}function k8($){if(!$)return;return P8.get($)}function x9($,Z){let J=Z.userReadPermit?.lane==="recovery"||Z.purpose==="rollback"?"recovery":"normal";if(J==="normal"&&$.normalTokens.size>=R8)throw new g("capacity",Z.operation,!1,!1);if(J==="recovery"&&$.recoveryToken!==void 0)throw new g("capacity",Z.operation,!1,!1);let Y=yV(Z,J),Q=k8(Z.lease);if(Z.operation==="write"&&Q)if(Q.kind==="active"){let X=Q.exactPathIdentities.get(Z.pathIdentity);if(X===void 0)throw new g("busy",Z.operation,!1,!1);Y.writeLeaseSnapshot={generation:Q.generations.get(Z.pathIdentity)??0,leaseId:Q.leaseId,leaseKind:Q.kind,exactPathIdentity:X}}else Y.writeLeaseSnapshot={generation:Q.generation,leaseId:Q.leaseId,leaseKind:Q.kind,exactPathIdentity:Q.exactPathIdentity};if(Z.operation==="read"){let X=Z.userReadPermit?S8.get(Z.userReadPermit):void 0;if(Y.readToken={pathIdentity:Z.pathIdentity,exactPathIdentity:Z.exactPathIdentity,generation:Z.userReadPermit?.generation,permitId:X?.permitId,detached:!1,settled:!1},$.readTokens.set(Z.pathIdentity,Y.readToken),Z.userReadPermit?.lane==="recovery"){let W=$.mutationStates.get(Z.pathIdentity),V=$.recoveryPermits.get(Z.pathIdentity);if(W?.sessionId===Z.sessionId&&W.exactPathIdentity===Z.exactPathIdentity&&W.generation===Z.userReadPermit.generation&&V!==void 0&&X!==void 0&&V.permitId===X.permitId)W.kind="reconciling",W.reconciliationPermitId=V.permitId;if(V?.sessionId===Z.sessionId&&V.exactPathIdentity===Z.exactPathIdentity&&V.generation===Z.userReadPermit.generation)V.active=!0}}if(J==="normal")$.normalTokens.add(Y);else $.recoveryToken=Y;return Y}function v8($,Z){if(Z.kind==="normal")$.normalTokens.delete(Z);else if($.recoveryToken===Z)$.recoveryToken=void 0;if(Z.readToken?.settled&&$.readTokens.get(Z.pathIdentity)===Z.readToken)$.readTokens.delete(Z.pathIdentity)}function I9($){if($.timer)clearTimeout($.timer),$.timer=void 0;if($.parentAbortHandler&&$.parentSignal)$.parentSignal.removeEventListener("abort",$.parentAbortHandler),$.parentAbortHandler=void 0,$.parentSignal=void 0}function h9($){if($.settled)return;$.settled=!0;let Z=new g("closed",$.operation,$.dispatched,$.requestPending);return $.reject(Z),Z}function g9($,Z,J,Y){if(Z.settled)return;let Q=Z.operation==="write"&&Z.dispatched&&Y&&Z.writeLeaseSnapshot!==void 0;if(Z.boundaryError=j1(new g(J,Z.operation,Z.dispatched,Y&&Z.dispatched),Q),Z.operation==="read"&&Z.readToken){if(Z.readToken.detached=Z.boundaryError.requestPending,!Z.boundaryError.requestPending)$.readTokens.delete(Z.pathIdentity)}if(Z.operation==="write"&&Z.dispatched){let X=$.mutationStates.get(Z.pathIdentity),W=Z.writeLeaseSnapshot;if(X&&W&&X.sessionId===Z.sessionId&&X.exactPathIdentity===Z.exactPathIdentity&&X.exactPathIdentity===W.exactPathIdentity&&X.generation===W.generation&&X.leaseId===W.leaseId&&X.leaseKind===W.leaseKind)X.kind="pending-write",X.forwardVerified=!1}return Z.settled=!0,Z.reject(Z.boundaryError),Z.boundaryError}function u9($){let Z=0,J=0,Y=0,Q=0;for(let W of $.mutationStates.values()){if(W.kind==="active-mutation")Z+=1;if(W.kind==="pending-write")J+=1;if(W.kind==="needs-read")Y+=1;if(W.kind==="reconciling")Q+=1}let X=0;for(let W of $.readTokens.values())if(!W.detached)X+=1;return{pendingNormal:$.normalTokens.size,pendingRecovery:$.recoveryToken?1:0,activeNormalReads:X,mutationPaths:$.mutationStates.size,activeMutations:Z,pendingWrites:J,needsRead:Y,reconciling:Q,closed:$.closed}}function d9($,Z){if(Z.length===0)throw new g("busy","write",!1,!1);let J=$.mutationStates.size;for(let Y of Z){let Q=$.mutationStates.get(Y);if(Q)throw j1(new g("busy","write",!1,!1),Q.kind==="pending-write"||Q.kind==="needs-read")}if(J+Z.length>f8)throw new g("capacity","write",!1,!1)}function y6($){let Z=new Map;for(let J of $){let Y=N0(J);if(!Z.has(Y))Z.set(Y,J)}return[...Z.entries()].sort(([J],[Y])=>J.localeCompare(Y)).map(([,J])=>J)}function m9($,Z,J){let Y=y6(Z).map((Q)=>({pathIdentity:N0(Q),exactPathIdentity:Q.exactIdentity}));return xV($,Y,J)}function xV($,Z,J){let Y=Z.map(({pathIdentity:B})=>B),Q=Symbol("acp-mutation-lease"),X={kind:"active",sessionId:J,leaseId:Q,generations:new Map,exactPathIdentities:new Map,released:!1},W=new Map;for(let{pathIdentity:B,exactPathIdentity:G}of Z){let w=($.mutationStates.get(B)?.generation??0)+1;W.set(B,w),X.generations.set(B,w),X.exactPathIdentities.set(B,G)}for(let{pathIdentity:B,exactPathIdentity:G}of Z){let D=$.mutationStates.get(B),w=new Set(D?.retiredGenerations??[]);if(D)w.add(D.generation);$.mutationStates.set(B,{pathIdentity:B,exactPathIdentity:G,sessionId:J,generation:W.get(B)??1,kind:"active-mutation",leaseKind:"active",leaseId:Q,forwardVerified:!1,retiredGenerations:w})}let V=!1,U=!1,H=(B,G)=>{let D=W.get(B),w=$.mutationStates.get(B);if(D===void 0||!w||w.sessionId!==J||w.generation!==D||w.exactPathIdentity!==G||w.leaseKind!=="active"||w.leaseId!==Q)return;return w},z={sessionId:J,pathIdentities:Y,generationFor(B){let G=N0(B);return H(G,B.exactIdentity)?.generation??0},isCurrent(B){let G=N0(B);return!V&&H(G,B.exactIdentity)!==void 0},markForwardVerified(B){if(V)return;let G=N0(B),D=H(G,B.exactIdentity);if(D)D.kind="active-mutation",D.forwardVerified=!0},markDefinite(B){if(V)return;let G=N0(B);if(H(G,B.exactIdentity))$.mutationStates.delete(G)},markUncertain(B){if(V)return;let G=N0(B),D=H(G,B.exactIdentity);if(D)D.kind="needs-read",D.forwardVerified=!1},beginRecovery(B){if(V)throw new g("stale-reconciliation","read",!1,!1);let G=N0(B),D=B.exactIdentity,w=H(G,D);if(!w||w.kind==="pending-write")throw new g("stale-reconciliation","read",!1,!1);let q=w.generation,F=q+1,L=Symbol("acp-recovery-lease");W.set(G,F),X.generations.set(G,F);let _=new Set(w.retiredGenerations??[]);_.add(q),w.generation=F,w.kind="active-mutation",w.leaseKind="recovery",w.leaseId=L,w.forwardVerified=!1,w.reconciliationPermitId=void 0,w.retiredGenerations=_;let O={generation:F,pathIdentity:G,exactPathIdentity:D,finish(N){if(b.finished)return;let A=$.mutationStates.get(G);if(!A||A.sessionId!==J||A.generation!==F||A.exactPathIdentity!==D||A.leaseKind!=="recovery"||A.leaseId!==L)return;if(b.finished=!0,A.kind==="pending-write")return;if(N==="restored")$.mutationStates.delete(G);else A.kind="needs-read",A.forwardVerified=!1,A.reconciliationPermitId=void 0}},b={kind:"recovery",sessionId:J,leaseId:L,pathIdentity:G,exactPathIdentity:D,generation:F,finished:!1};return P8.set(O,b),O},commitVerified(){U=!0},release(){if(V)return;for(let{pathIdentity:B,exactPathIdentity:G}of Z){let D=H(B,G);if(!D)continue;if(D.kind==="active-mutation"){if(!D.forwardVerified){$.mutationStates.delete(B);continue}if(U){$.mutationStates.delete(B);continue}D.kind="needs-read",D.forwardVerified=!1,D.reconciliationPermitId=void 0;continue}if(D.kind==="pending-write")continue;if(D.kind==="needs-read"){D.forwardVerified=!1;continue}if(U)$.mutationStates.delete(B)}V=!0,X.released=!0}};return P8.set(z,X),z}function c9($,Z,J){let Y=N0(Z),Q=$.mutationStates.get(Y);if(!Q)return Object.freeze({sessionId:J,pathIdentity:Y,exactPathIdentity:Z.exactIdentity,generation:void 0,lane:"normal",complete:(X,W)=>{W()},fail:()=>{}});if(Q.kind==="pending-write")throw j1(new g("busy","read",!1,!1),!0);if(Q.kind==="needs-read"&&Q.sessionId===J&&Q.exactPathIdentity===Z.exactIdentity&&!$.recoveryToken&&!$.recoveryPermits.has(Y)){let X=Symbol("acp-recovery-permit"),W={sessionId:J,pathIdentity:Y,exactPathIdentity:Z.exactIdentity,generation:Q.generation,permitId:X,active:!1};$.recoveryPermits.set(Y,W);let V={sessionId:J,pathIdentity:Y,exactPathIdentity:Z.exactIdentity,generation:Q.generation,lane:"recovery",complete:(H,z)=>{let B=$.mutationStates.get(Y);if($.recoveryPermits.get(Y)!==W||!W.active||!B||B.sessionId!==J||B.generation!==W.generation||B.exactPathIdentity!==W.exactPathIdentity||B.reconciliationPermitId!==W.permitId||B.kind!=="needs-read")throw new g("stale-reconciliation","read",!1,!1);if(z(),$.recoveryPermits.delete(Y),W.active=!1,H==="content"||H==="not-found")$.mutationStates.delete(Y)},fail:()=>{if($.recoveryPermits.get(Y)===W){$.recoveryPermits.delete(Y);let H=$.mutationStates.get(Y);if(H?.kind==="needs-read"&&H.reconciliationPermitId===X)H.reconciliationPermitId=void 0}W.active=!1}},U=Object.freeze(V);return S8.set(U,{permitId:X}),U}throw new g("busy","read",!1,!1)}function p9($,Z){if(Z.userReadPermit?.lane==="recovery"){let Q=$.mutationStates.get(Z.pathIdentity);if(Q?.kind==="pending-write")throw j1(new g("busy","read",!1,!1),!0);if(!Q||Q.kind!=="needs-read")throw new g("stale-reconciliation","read",!1,!1);let X=$.recoveryPermits.get(Z.pathIdentity),W=S8.get(Z.userReadPermit);if(!X||!W||X.permitId!==W.permitId||Z.userReadPermit.pathIdentity!==Z.pathIdentity||Z.userReadPermit.exactPathIdentity!==Z.exactPathIdentity||Z.userReadPermit.sessionId!==Z.sessionId||Q.sessionId!==Z.sessionId||Q.exactPathIdentity!==Z.exactPathIdentity||Q.generation!==Z.userReadPermit.generation||X.sessionId!==Z.userReadPermit.sessionId||X.exactPathIdentity!==Z.userReadPermit.exactPathIdentity||X.generation!==Z.userReadPermit.generation)throw new g("stale-reconciliation","read",!1,!1);let V=$.readTokens.get(Z.pathIdentity);if(V&&!V.detached)throw new g("busy","read",!1,!1);if(Q.retiredGenerations?.has(Z.userReadPermit.generation))throw new g("stale-reconciliation","read",!1,!1);if(Q.exactPathIdentity!==Z.exactPathIdentity)throw new g("busy","read",!1,!1);return}if($.readTokens.get(Z.pathIdentity))throw new g("busy","read",!1,!1);let Y=$.mutationStates.get(Z.pathIdentity);if(!Y)return;if(Y.kind!=="active-mutation")throw j1(new g("busy","read",!1,!1),Y.kind==="pending-write"||Y.kind==="needs-read");if(!IV(Z,Y))throw new g("busy","read",!1,!1)}function l9($,Z){let J=$.mutationStates.get(Z.pathIdentity),Y=k8(Z.lease);if(!J||!Y||Y.sessionId!==Z.sessionId)throw j1(new g("busy","write",!1,!1),J?.kind==="pending-write"||J?.kind==="needs-read");if(J.kind!=="active-mutation")throw j1(new g("busy","write",!1,!1),J.kind==="pending-write"||J.kind==="needs-read");if(Y.kind==="active"){if(Y.released||!Y.generations.has(Z.pathIdentity)||Y.exactPathIdentities.get(Z.pathIdentity)!==Z.exactPathIdentity||Y.generations.get(Z.pathIdentity)!==J.generation||J.exactPathIdentity!==Z.exactPathIdentity||J.leaseKind!==Y.kind||J.leaseId!==Y.leaseId)throw new g("busy","write",!1,!1);return}if(Y.finished||Y.pathIdentity!==Z.pathIdentity||Y.exactPathIdentity!==Z.exactPathIdentity||Y.generation!==J.generation||J.exactPathIdentity!==Z.exactPathIdentity||J.leaseKind!==Y.kind||J.leaseId!==Y.leaseId)throw new g("busy","write",!1,!1)}function IV($,Z){let J=k8($.lease);if(!J||J.sessionId!==$.sessionId||Z.sessionId!==$.sessionId||Z.exactPathIdentity!==$.exactPathIdentity)return!1;if(J.kind==="active")return!J.released&&J.generations.get($.pathIdentity)===Z.generation&&J.exactPathIdentities.get($.pathIdentity)===$.exactPathIdentity&&Z.leaseKind==="active"&&Z.leaseId===J.leaseId;return!J.finished&&J.pathIdentity===$.pathIdentity&&J.exactPathIdentity===$.exactPathIdentity&&J.generation===Z.generation&&Z.leaseKind==="recovery"&&Z.leaseId===J.leaseId}function j1($,Z){if(!Z)return $;return Object.defineProperty($,"requiresRead",{value:!0,enumerable:!0,configurable:!0}),$}function i9($,Z){if(Z.requestPending=!1,Z.operation==="read"){if(Z.kind==="recovery"){let Q=$.mutationStates.get(Z.pathIdentity);if(Q&&Q.kind==="reconciling"&&Q.sessionId===Z.sessionId&&Q.exactPathIdentity===Z.exactPathIdentity&&Q.generation===Z.readToken?.generation&&Q.reconciliationPermitId===Z.readToken?.permitId){if(Q.kind="needs-read",Z.boundaryError)Q.reconciliationPermitId=void 0}}if(Z.readToken)Z.readToken.settled=!0;return}let J=$.mutationStates.get(Z.pathIdentity),Y=Z.writeLeaseSnapshot;if(J&&Y&&J.sessionId===Z.sessionId&&J.exactPathIdentity===Z.exactPathIdentity&&J.exactPathIdentity===Y.exactPathIdentity&&Z.boundaryError?.dispatched&&J.generation===Y.generation&&J.leaseId===Y.leaseId&&J.leaseKind===Y.leaseKind)J.kind="needs-read",J.forwardVerified=!1,J.reconciliationPermitId=void 0}function r9($,Z){if(Z.operation==="read"&&Z.readToken){if(Z.kind==="recovery"){let J=$.mutationStates.get(Z.pathIdentity);if(J?.kind==="reconciling"&&J.sessionId===Z.sessionId&&J.exactPathIdentity===Z.exactPathIdentity&&J.generation===Z.readToken.generation&&J.reconciliationPermitId===Z.readToken.permitId)J.kind="needs-read",J.reconciliationPermitId=void 0;let Y=$.recoveryPermits.get(Z.pathIdentity);if(Y?.sessionId===Z.sessionId&&Y.exactPathIdentity===Z.exactPathIdentity&&Y.generation===Z.readToken.generation&&Y.permitId===Z.readToken.permitId)$.recoveryPermits.delete(Z.pathIdentity)}Z.readToken.settled=!0}if(Z.readToken&&$.readTokens.get(Z.pathIdentity)===Z.readToken)$.readTokens.delete(Z.pathIdentity);v8($,Z)}var g2=new WeakMap;function o1($){if($.signal.aborted){let Y=g2.get($);if(Y)return Y;let Q=new y8($);return g2.set($,Q),Q}let Z=g2.get($);if(Z)return Z;let J=new y8($);return g2.set($,J),J}class y8{connection;state;closeHandler;constructor($){this.connection=$;if(this.state=y9(),this.state.closed=$.signal.aborted,this.closeHandler=()=>{this.handleConnectionClosed()},!this.state.closed)$.signal.addEventListener("abort",this.closeHandler,{once:!0})}runRequest($){let Z;try{this.assertOpen($.operation),this.assertBeforeBoundary($.signal,$.operation),this.assertPathAvailability($),Z=this.reserveRequestToken($)}catch(U){return Promise.reject(U)}let J=Z.controller,Y=()=>{this.boundaryReject(Z,this.buildBoundaryReason($.signal,$.deadlineAt),!0),J.abort()};Z.parentSignal=$.signal,Z.parentAbortHandler=Y,$.signal?.addEventListener("abort",Y,{once:!0});let Q=()=>{this.closeRejectToken(Z),J.abort()};Z.deadlineAbortHandler=Q,this.connection.signal.addEventListener("abort",Q,{once:!0});let X=Date.now();if($.deadlineAt<=X)return this.boundaryReject(Z,"timeout",!1),this.cleanupReservedButUndispatchedToken(Z),J.abort(),Z.localPromise;let W=$.deadlineAt-X;Z.timer=setTimeout(()=>{this.boundaryReject(Z,"timeout",!0),J.abort()},W),Z.timer.unref?.();let V;try{V=$.dispatch(J.signal),Z.dispatched=!0,Z.requestPending=!0,this.observeUnderlyingSettlement(Z,V)}catch(U){return this.clearLocalBoundaryResources(Z),this.cleanupReservedButUndispatchedToken(Z),Z.reject(U),Z.localPromise}if($.signal?.aborted)this.boundaryReject(Z,"aborted",!0),J.abort();return Z.localPromise}precheckMutationPaths($,Z){this.assertOpen("write");let J=y6($).map(N0);this.assertMutationPathsAvailable(J)}tryAcquireMutationLease($,Z){this.assertOpen("write");let J=y6($),Y=J.map(N0);return this.assertMutationPathsAvailable(Y),m9(this.state,J,Z)}beginUserRead($,Z){return this.assertOpen("read"),c9(this.state,$,Z)}getStatsForTests(){return u9(this.state)}assertOpen($){if(this.state.closed||this.connection.signal.aborted)throw this.state.closed=!0,new g("closed",$,!1,!1)}assertBeforeBoundary($,Z){if($?.aborted)throw new g("aborted",Z,!1,!1)}assertPathAvailability($){if($.operation==="read"){p9(this.state,$);return}l9(this.state,$)}reserveRequestToken($){return x9(this.state,$)}observeUnderlyingSettlement($,Z){Z.then((J)=>{this.handleSettlement($,{status:"fulfilled",value:J})},(J)=>{this.handleSettlement($,{status:"rejected",reason:J})})}handleSettlement($,Z){if(this.state.closed){this.clearLocalBoundaryResources($),this.cleanupToken($);return}if(i9(this.state,$),$.boundaryError){this.clearLocalBoundaryResources($),this.cleanupToken($);return}if(this.clearLocalBoundaryResources($),this.cleanupToken($),Z.status==="fulfilled"){$.resolve(Z.value);return}$.reject(Z.reason)}boundaryReject($,Z,J){g9(this.state,$,Z,J),this.clearLocalBoundaryResources($)}closeRejectToken($){if(!h9($))return;this.clearLocalBoundaryResources($),$.controller.abort()}cleanupToken($){v8(this.state,$)}cleanupReservedButUndispatchedToken($){r9(this.state,$)}clearLocalBoundaryResources($){if($.deadlineAbortHandler)this.connection.signal.removeEventListener("abort",$.deadlineAbortHandler),$.deadlineAbortHandler=void 0;I9($)}buildBoundaryReason($,Z){if($?.aborted)return"aborted";if(Z<=Date.now())return"timeout";return"aborted"}assertMutationPathsAvailable($){d9(this.state,$)}handleConnectionClosed(){if(this.state.closed)return;this.state.closed=!0,g2.set(this.connection,this);for(let $ of this.state.normalTokens)this.closeRejectToken($);if(this.state.recoveryToken)this.closeRejectToken(this.state.recoveryToken),this.state.recoveryToken=void 0;this.state.normalTokens.clear(),this.state.readTokens.clear(),this.state.recoveryPermits.clear(),this.state.mutationStates.clear()}}var n9=e("Agent"),hV=1024;class M0 extends Error{operation;name="AcpFileSystemCapabilityError";constructor($){super(`ACP remote filesystem does not support ${$}`);this.operation=$}}function q$($){if(gV($,-32002))return!0;if(!($ instanceof Error))return!1;let Z=$.message.toLowerCase();return["not found","no such file","enoent","does not exist","file not found","path not found"].some((J)=>Z.includes(J))}class v0{connection;sessionId;capabilities;remoteAccessLedger=new Map;remoteAccessCollisionIndex=new Map;disposeController=new AbortController;pathProfile;constructor($,Z,J,Y){this.connection=$;this.sessionId=Z;t1(Y),this.capabilities={readTextFile:J.readTextFile===!0,writeTextFile:J.writeTextFile===!0},this.pathProfile=o9(Y)}async readTextFile($,Z){let J=this.parsePath($);return this.readTextFileForParsedPath(J,{signal:Z?.signal,deadlineAt:Z?.deadlineAt,purpose:Z?.purpose??"preflight",lease:Z?.lease})}async readTextFileForParsedPath($,Z){return this.assertParsedPathStyle($),this.runBoundedTextReadPath($,Z)}async readTextFileForUser($,Z){let J=this.parsePath($);return this.readTextFileForUserForParsedPath(J,Z)}async readTextFileForUserForParsedPath($,Z){this.assertParsedPathStyle($);let Y=o1(this.connection).beginUserRead($,this.sessionId);try{let Q=await this.readTextFileForParsedPath($,{signal:Z?.signal,deadlineAt:Z?.deadlineAt,purpose:"user-read",userReadPermit:Y});return Y.complete("content",()=>{this.recordRemoteAccessForPath($,Q,"read")}),Q}catch(Q){if(q$(Q))throw Y.complete("not-found",()=>{this.deleteRemoteAccessCollisionClass($)}),Q;throw Y.fail(),Q}}async writeTextFile($,Z,J){let Y=this.parsePath($);return this.writeTextFileForParsedPath(Y,Z,J)}async writeTextFileForParsedPath($,Z,J){if(this.assertParsedPathStyle($),!this.capabilities.writeTextFile)throw new M0("writeTextFile");let Y=J?.lease===void 0?this.tryAcquireMutationLeaseForParsedPaths([$]):void 0,Q=J?.lease??Y,X=s9(this.disposeController.signal,J?.signal),W=J?.deadlineAt??Date.now()+g0,V=o1(this.connection);try{if(await V.runRequest({operation:"write",purpose:J?.purpose??"mutation",sessionId:this.sessionId,pathIdentity:N0($),exactPathIdentity:$.exactIdentity,deadlineAt:W,signal:X.signal,lease:Q,dispatch:(U)=>this.connection.request(I8.CLIENT_METHODS.fs_write_text_file,{path:$.wirePath,content:Z,sessionId:this.sessionId},{cancellationSignal:U})}),Y)Y.markDefinite($)}catch(U){if(n9.warn("[AcpFileSystem] writeTextFile ACP request failed"),Y&&uV(U))Y.markUncertain($);throw U}finally{if(Y)Y.release();X.cleanup()}}async exists($){if(!this.capabilities.readTextFile)throw new M0("readTextFile");try{let Z=this.parsePath($);return await this.readTextFileForParsedPath(Z,{purpose:"preflight"}),!0}catch(Z){if(q$(Z))return!1;throw Z}}async readBinaryFile($){throw new M0("readBinaryFile")}async stat($){throw new M0("stat")}async mkdir($,Z){throw new M0("mkdir")}getCapabilities(){return{...this.capabilities}}getPathProfile(){return this.pathProfile}parsePath($){return X$($,this.pathProfile.style)}canReadTextFile(){return this.capabilities.readTextFile??!1}canWriteTextFile(){return this.capabilities.writeTextFile??!1}assertTextMutationCapabilities(){if(!this.canReadTextFile())throw new M0("readTextFile");if(!this.canWriteTextFile())throw new M0("writeTextFile")}usesRemoteFiles(){return this.canReadTextFile()||this.canWriteTextFile()}createOpaqueLockKey($){let Z=this.parsePath($);return this.createOpaqueLockKeyForParsedPath(Z)}createOpaqueLockKeyForParsedPath($){return this.assertParsedPathStyle($),`acp-remote:${t9("sha256").update(this.sessionId).update("\x00").update($.collisionIdentity).digest("hex")}`}async readTextFileIfExists($,Z){let J=this.parsePath($);return this.readTextFileIfExistsForParsedPath(J,Z)}async readTextFileIfExistsForParsedPath($,Z){this.assertParsedPathStyle($);try{return{exists:!0,content:await this.readTextFileForParsedPath($,{signal:Z?.signal,deadlineAt:Z?.deadlineAt,purpose:Z?.purpose??"preflight",userReadPermit:Z?.userReadPermit,lease:Z?.lease})}}catch(J){if(q$(J))return{exists:!1};throw J}}recordRemoteAccess($,Z,J){let Y=this.parsePath($);this.recordRemoteAccessForPath(Y,Z,J)}recordRemoteAccessForParsedPath($,Z,J){this.assertParsedPathStyle($),this.recordRemoteAccessForPath($,Z,J)}recordRemoteAccessForPath($,Z,J){let Y={filePath:$.wirePath,accessTime:Date.now(),contentSha256:a9(Z),sessionId:this.sessionId,lastOperation:J,source:"remote"},Q=this.remoteAccessCollisionIndex.get($.collisionIdentity);if(Q)this.deleteRemoteAccessEntry(Q);this.remoteAccessLedger.set($.exactIdentity,{collisionIdentity:$.collisionIdentity,record:Y}),this.remoteAccessCollisionIndex.set($.collisionIdentity,$.exactIdentity);while(this.remoteAccessLedger.size>hV){let X=this.remoteAccessLedger.keys().next().value;if(X===void 0)break;this.deleteRemoteAccessEntry(X)}}checkRemoteAccess($,Z){let J=this.parsePath($);return this.checkRemoteAccessForParsedPath(J,Z)}checkRemoteAccessForParsedPath($,Z){this.assertParsedPathStyle($);let J=this.remoteAccessLedger.get($.exactIdentity);if(!J)return"missing";return this.remoteAccessLedger.delete($.exactIdentity),this.remoteAccessLedger.set($.exactIdentity,J),J.record.contentSha256===a9(Z)?"current":"modified"}getRemoteAccessRecord($){let Z=this.parsePath($),J=this.remoteAccessLedger.get(Z.exactIdentity);if(!J)return;return{...J.record}}precheckMutationPaths($){let Z=$.map((J)=>this.parsePath(J));this.precheckMutationPathsForParsedPaths(Z)}precheckMutationPathsForParsedPaths($){for(let J of $)this.assertParsedPathStyle(J);o1(this.connection).precheckMutationPaths($,this.sessionId)}tryAcquireMutationLease($){let Z=$.map((J)=>this.parsePath(J));return this.tryAcquireMutationLeaseForParsedPaths(Z)}tryAcquireMutationLeaseForParsedPaths($){for(let J of $)this.assertParsedPathStyle(J);return o1(this.connection).tryAcquireMutationLease($,this.sessionId)}dispose(){this.disposeController.abort(),this.remoteAccessLedger.clear(),this.remoteAccessCollisionIndex.clear()}async runBoundedTextReadPath($,Z){if(!this.capabilities.readTextFile)throw new M0("readTextFile");let J=s9(this.disposeController.signal,Z.signal),Y=o1(this.connection),Q=Z.deadlineAt??Date.now()+g0;try{return(await Y.runRequest({operation:"read",purpose:Z.purpose,sessionId:this.sessionId,pathIdentity:N0($),exactPathIdentity:$.exactIdentity,deadlineAt:Q,signal:J.signal,lease:Z.lease,userReadPermit:Z.userReadPermit,dispatch:(W)=>this.connection.request(I8.CLIENT_METHODS.fs_read_text_file,{path:$.wirePath,sessionId:this.sessionId},{cancellationSignal:W})})).content}catch(X){if(q$(X))this.deleteRemoteAccessCollisionClass($);throw n9.warn("[AcpFileSystem] readTextFile ACP request failed"),X}finally{J.cleanup()}}deleteRemoteAccessCollisionClass($){let Z=this.remoteAccessCollisionIndex.get($.collisionIdentity);if(!Z)return;this.deleteRemoteAccessEntry(Z)}deleteRemoteAccessEntry($){let Z=this.remoteAccessLedger.get($);if(!Z)return;if(this.remoteAccessLedger.delete($),this.remoteAccessCollisionIndex.get(Z.collisionIdentity)===$)this.remoteAccessCollisionIndex.delete(Z.collisionIdentity)}assertParsedPathStyle($){if(D$($),$.style!==this.pathProfile.style)this.parsePath($.wirePath)}}function gV($,Z){return $ instanceof Error&&"code"in $&&$.code===Z}function a9($){return t9("sha256").update($).digest("hex")}function uV($){if(!($ instanceof g))return!0;if(!$.dispatched)return!1;return!$.requestPending}function s9(...$){let Z=$.filter((W)=>W!==void 0);if(Z.length===0)return{signal:new AbortController().signal,cleanup:x8};if(Z.length===1)return{signal:Z[0],cleanup:x8};let J=Z.find((W)=>W.aborted);if(J){let W=new AbortController;return W.abort(J.reason),{signal:W.signal,cleanup:x8}}let Y=new AbortController,Q=new Map,X=(W)=>{if(!Y.signal.aborted)Y.abort(W.reason)};for(let W of Z){let V=()=>{X(W)};Q.set(W,V),W.addEventListener("abort",V,{once:!0})}return{signal:Y.signal,cleanup:()=>{for(let[W,V]of Q)W.removeEventListener("abort",V)}}}function x8(){}var a$=e("Agent"),dV=5000;class x6{defaultCwd;constructor($){this.defaultCwd=$}async execute($,Z){let J=process.platform==="win32"?"cmd.exe":"/bin/bash",Y=process.platform==="win32"?["/c",$]:["-c",$],Q;try{Q=await a1(J,Y,{cwd:Z?.cwd??this.defaultCwd??C(),env:{...process.env,...Z?.env},stdio:["pipe","pipe","pipe"]},Z?.durableOwnership)}catch(X){return{success:!1,stdout:"",stderr:"",exitCode:null,error:X instanceof Error?X.message:"Foreground command admission failed",failureKind:"admission",transport:"local"}}return new Promise((X)=>{let{child:W,processTree:V}=Q,U,H=()=>{return U??=V.terminate(),U},z=new K$,B,G=!1,D=!1,w=!1,q=!1,F,L,_=Z?.timeout?setTimeout(()=>{if(q)return;if(!B)B="timeout";H()},Z.timeout):null,O=null,b=()=>{if(_)clearTimeout(_);if(O&&Z?.signal)Z.signal.removeEventListener("abort",O),O=null},N=(E)=>{if(w)return;w=!0,b(),X(E)};if(Z?.signal){if(O=()=>{if(q)return;if(!B)B="aborted";H()},Z.signal.addEventListener("abort",O),Z.signal.aborted)O()}W.stdout?.on("data",(E)=>{z.append("stdout",E);let j=E.toString();Z?.onOutput?.(j)}),W.stderr?.on("data",(E)=>{z.append("stderr",E);let j=E.toString();Z?.onOutput?.(j)});let A=(E,j)=>{q=!0,b(),F??=(async()=>{if(await L,B||G)await H();try{await Q.finalize()}catch{D=!0}z.finish();let M=z.snapshot(),k=D?"finalization":B==="timeout"?"timeout":B==="aborted"?"aborted":G?"admission":j?"spawn":void 0;N({success:E===0&&!k,stdout:M.stdout.content,stderr:M.stderr.content,exitCode:E,error:k==="timeout"||k==="aborted"?"Command was terminated":k==="admission"?"Foreground command admission failed":k==="finalization"?"Foreground command finalization failed":j?.message,failureKind:k,...D&&(B==="timeout"||B==="aborted")?{terminationReason:B}:{},transport:"local",capture:M})})()};if(W.once("close",(E)=>A(E)),W.once("error",(E)=>A(null,E)),Z?.signal?.aborted)B="aborted",L=Promise.resolve(),H();else L=Q.release().catch(async()=>{if(G=!0,!B)B="admission";await H()})})}isAvailable(){return!0}}class h8{async execute(){return{success:!1,stdout:"",stderr:"",exitCode:null,error:"ACP terminal capability is unavailable",failureKind:"unavailable",transport:"acp"}}isAvailable(){return!1}}class E1 extends Error{code="acp_session_unavailable";constructor(){super("ACP session filesystem is unavailable");this.name="AcpFileSystemUnavailableError"}}class $3{async readTextFile(){throw new E1}async writeTextFile(){throw new E1}async exists(){throw new E1}async readBinaryFile(){throw new E1}async stat(){throw new E1}async mkdir(){throw new E1}}class Z3{connection;sessionId;remoteFileSystem;fallback;constructor($,Z,J=!1,Y){this.connection=$;this.sessionId=Z;this.remoteFileSystem=J;this.fallback=Y}async execute($,Z){let J;try{a$.debug(`[AcpTerminal] Executing command via ACP: ${$}`),J=await this.connection.createTerminal({sessionId:this.sessionId,command:$,cwd:Z?.cwd,env:Z?.env?Object.entries(Z.env).map(([E,j])=>({name:E,value:j})):void 0});let Y=J,Q=Y0.getInstance(),X,W=!1,V=new K$(void 0,!0),U=0,H=0,z=!1,B=!1,G,D,w=async()=>{return},q=async()=>{let E,j=Y.currentOutput().then((k)=>({type:"output",response:k})).catch(()=>({type:"error"})),M=new Promise((k)=>{E=setTimeout(()=>k({type:"timeout"}),dV)});return await Promise.race([j,M]).finally(()=>{if(E)clearTimeout(E)})},F=(E)=>{let j=E.length;if(j>=H){let M=E.slice(H);if(M)Z?.onOutput?.(M);H=j}},L=(E)=>{let j=E.output.length;if(!E.truncated&&j>=U){let M=E.output.slice(U);if(M){if(V.append("stdout",M),X)Q.appendExternalOutput(X,this.sessionId,"stdout",M)}F(E.output),U=j;return}if(V=new K$(void 0,!0),V.append("stdout",E.output),V.markAccountingIncomplete(),X)Q.replaceExternalOutput(X,this.sessionId,E.output,"");H=j,U=j},_=(async()=>{while(!z){let E=await q();if(E.type==="output")L(E.response);else if(V.markAccountingIncomplete(),E.type==="timeout"){B=!0,z=!0;break}if(z)break;await new Promise((j)=>{let M=setTimeout(j,100);G=()=>{clearTimeout(M),j()}}),G=void 0}})(),O=async()=>{z=!0,G?.(),await _},b=Y.waitForExit().then((E)=>({type:"completed",exitCode:E.exitCode??null})).catch((E)=>({type:"failed",error:E})),N=(E)=>{return D??=(async()=>{let j=!1;if(E.type!=="completed")await Y.kill().catch(()=>{j=!0});await O();let M=B?{type:"timeout"}:await q();if(M.type==="output"){let p=M.response;if(p.output.length>=H)F(p.output);if(V=new K$(void 0,!0),V.append("stdout",p.output),p.truncated)V.markAccountingIncomplete()}else V.markAccountingIncomplete();await Y.release().catch(()=>{j=!0}),V.finish();let k=V.snapshot();if(X){Q.replaceExternalOutput(X,this.sessionId,k.stdout.content,k.stderr.content);let p=j?"error":E.type==="completed"?"exited":E.type==="timeout"?"timed_out":E.type==="aborted"?"aborted":E.type==="killed"?"killed":"error";if(Q.completeExternalProcess(X,this.sessionId,{status:p,exitCode:E.type==="completed"?E.exitCode:null,...j?{finalizationFailed:!0}:{},errorMessage:j?"ACP terminal finalization failed":E.type==="failed"?E.error instanceof Error?E.error.message:"ACP terminal unavailable":void 0}),!W)Q.removeCandidate(X,this.sessionId)}return{success:!j&&E.type==="completed"&&E.exitCode===0,stdout:k.stdout.content,stderr:k.stderr.content,exitCode:E.type==="completed"?E.exitCode:null,error:j?"ACP terminal finalization failed":E.type==="timeout"?"Command timed out":E.type==="aborted"||E.type==="killed"?"Command was aborted":E.type==="failed"?E.error instanceof Error?`ACP terminal unavailable: ${E.error.message}`:"ACP terminal unavailable":void 0,failureKind:j?"finalization":E.type==="timeout"?"timeout":E.type==="aborted"||E.type==="killed"?"aborted":E.type==="failed"?"unavailable":void 0,...j&&(E.type==="timeout"||E.type==="aborted"||E.type==="killed")?{terminationReason:E.type==="timeout"?"timeout":"aborted"}:{},transport:"acp",capture:k}})(),D};if(!this.remoteFileSystem&&Z?.foregroundHandoffMs&&Z.foregroundHandoffMs>0&&Z.durableOwnership)try{X=Q.startExternalForegroundCandidate({command:$,sessionId:this.sessionId,cwd:Z.cwd,terminate:async(j)=>{await w(j)}}).id,w=async(j)=>{await N({type:j})}}catch(E){if(!(E instanceof r$))throw E}let A=await new Promise((E)=>{let j=!1,M=(h)=>{if(j)return;if(j=!0,k)clearTimeout(k);if(p)clearTimeout(p);Z?.signal?.removeEventListener("abort",R),E(h)},k=Z?.timeout?setTimeout(()=>M({type:"timeout"}),Z.timeout):void 0,p=X&&Z?.foregroundHandoffMs?setTimeout(()=>M({type:"handoff"}),Z.foregroundHandoffMs):void 0,R=()=>M({type:"aborted"});if(Z?.signal?.aborted)R();else Z?.signal?.addEventListener("abort",R,{once:!0});b.then(M)});if(A.type==="handoff"&&X&&Z?.foregroundHandoffMs){let E=Q.promoteExternalForegroundCandidate(X,this.sessionId,Z.foregroundHandoffMs);if(E)return W=!0,b.then(N),{success:!0,stdout:"",stderr:"",exitCode:null,transport:"acp",capture:V.snapshot(),background:{shellId:E.id,autoBackgrounded:!0,foregroundBudgetMs:Z.foregroundHandoffMs}}}return await N(A.type==="handoff"?await b:A)}catch(Y){if(J)await J.release().catch(()=>{return});if(this.remoteFileSystem||Z?.allowLocalFallback!==!0)return{success:!1,stdout:"",stderr:"",exitCode:null,error:Y instanceof Error?`ACP terminal unavailable: ${Y.message}`:"ACP terminal unavailable",failureKind:"unavailable",transport:"acp"};return a$.warn("[AcpTerminal] ACP terminal failed, using fallback:",Y),{...await(this.fallback??new x6(Z?.cwd)).execute($,Z),transport:"local_fallback"}}}isAvailable(){return!0}}function e9($,Z){return JSON.stringify([$,Z])}class y{static sessions=new Map;static remoteSurfaceOwners=new Map;static remoteSurfaceOwnerKeysBySessionId=new Map;static sessionRegistrationGeneration=0n;static currentSessionId=null;constructor(){}static getInstance(){return new y}static initializeSession($,Z,J,Y,Q,X){if(y.sessions.get(Z)){y.currentSessionId=Z,a$.debug(`[AcpServiceContext:${Z}] initializeSession ignored because the session already exists`);return}let V=J?.fs?.readTextFile===!0||J?.fs?.writeTextFile===!0,U;if(V){let G=X??u2(Y);U=new v0($,Z,J?.fs??{},G)}else U=new h2;if(V)a$.debug(`[AcpServiceContext:${Z}] Using ACP file system service`);let H=J?.terminal?new Z3($,Z,V):V?new h8:new x6(Y);a$.debug(`[AcpServiceContext:${Z}] Using ${J?.terminal?"ACP":"local"} terminal service`),y.sessionRegistrationGeneration+=1n;let z=Object.freeze({generation:`acp-owner-generation:${y.sessionRegistrationGeneration.toString(36)}`,sessionId:Z}),B={fileSystemService:U,terminalService:H,connection:$,registration:z,sendUpdate:Q,clientCapabilities:J||null,executionRoot:Y,remoteFileSystem:V};if(y.sessions.set(Z,B),V){let G=X??u2(Y),D=e9(Z,G.workspace.exactIdentity);y.remoteSurfaceOwners.set(D,{exactIdentity:G.workspace.exactIdentity,generation:z.generation,readText:J?.fs?.readTextFile===!0,services:B,writeText:J?.fs?.writeTextFile===!0,terminal:J?.terminal===!0}),y.remoteSurfaceOwnerKeysBySessionId.set(Z,D)}return y.currentSessionId=Z,a$.debug(`[AcpServiceContext:${Z}] Initialized with capabilities:`,{fs:!!J?.fs,readTextFile:J?.fs?.readTextFile,writeTextFile:J?.fs?.writeTextFile}),z}static destroySession($){let Z=y.remoteSurfaceOwnerKeysBySessionId.get($);if(Z)y.remoteSurfaceOwners.delete(Z),y.remoteSurfaceOwnerKeysBySessionId.delete($);let J=y.sessions.get($);if(J?.fileSystemService instanceof v0)J.fileSystemService.dispose();if(y.sessions.delete($),y.currentSessionId===$){let Y=Array.from(y.sessions.keys());y.currentSessionId=Y[0]||null}a$.debug(`[AcpServiceContext:${$}] Session destroyed`)}static destroyRegisteredSession($){if(!$)return;if(y.sessions.get($.sessionId)?.registration!==$)return;y.destroySession($.sessionId)}static getSessionServices($){return y.sessions.get($)||null}static setCurrentSession($){if(y.sessions.has($))y.currentSessionId=$}static getCurrentSessionId(){return y.currentSessionId}static isRemoteFileSystem($){return y.sessions.get($)?.remoteFileSystem??!1}static getRemoteSurfaceOwnerSnapshot($,Z){let J;try{J=I6(Z)}catch{return{connection:"offline"}}let Y=y.remoteSurfaceOwners.get(e9($,J.exactIdentity));if(!Y||Y.exactIdentity!==J.exactIdentity||y.sessions.get($)!==Y.services||Y.services.connection.signal.aborted)return{connection:"offline"};return{connection:"online",generation:Y.generation,readText:Y.readText,writeText:Y.writeText,terminal:Y.terminal}}initialize($,Z,J,Y){y.initializeSession($,Z,J,Y||C())}reset(){if(y.currentSessionId)y.destroySession(y.currentSessionId)}isAcpMode(){return y.currentSessionId!==null}getFileSystemService($){if($!==void 0)return y.sessions.get($)?.fileSystemService??new $3;let Z=$??y.currentSessionId;if(Z){let J=y.sessions.get(Z);if(J)return J.fileSystemService}return new h2}getTerminalService($){let Z=$??y.currentSessionId;if(Z){let J=y.sessions.get(Z);if(J)return J.terminalService;if($)return new h8}return new x6}getConnection(){if(y.currentSessionId){let $=y.sessions.get(y.currentSessionId);if($)return $.connection}return null}getSessionId(){return y.currentSessionId}getClientCapabilities(){if(y.currentSessionId){let $=y.sessions.get(y.currentSessionId);if($)return $.clientCapabilities}return null}async sendToolUpdate($,Z,J,Y,Q){let X=y.currentSessionId;if(!X)return;let W=y.sessions.get(X);if(!W)return;if(!W.sendUpdate)return;try{await W.sendUpdate({sessionUpdate:"tool_call",toolCallId:$,status:Z,title:J,content:Y||[],kind:Q||"other"})}catch(V){a$.warn("[AcpServiceContext] Failed to send tool update:",V)}}}function w$($){return y.getInstance().getFileSystemService($)}function J3($){return y.getInstance().getTerminalService($)}function H0($){return $?y.getSessionServices($)!==null:y.getInstance().isAcpMode()}function _$($){let Z=$??y.getCurrentSessionId();return Z?y.isRemoteFileSystem(Z):!1}function s$($,Z,J){if(J==="local")return!1;if(J==="acp-remote"||Z==="acp-remote"){let Y=$??y.getCurrentSessionId();return Y===null||!y.isRemoteFileSystem(Y)}return $!==void 0&&y.getSessionServices($)===null}import{createHash as YU,randomUUID as QU}from"node:crypto";var mV=["BrowserNavigate","BrowserSnapshot","BrowserInteract","BrowserWait","BrowserInspect","BrowserPage"];function g8($){return mV.includes($)}class f extends Error{code;details;constructor($,Z,J={}){super(Z);this.code=$;this.details=J;this.name="BrowserRuntimeError"}}class u8{maxPending;queue=[];closeController=new AbortController;idleWaiters=new Set;active=!1;closed=!1;constructor($=Y3){this.maxPending=$;if(!Number.isSafeInteger($)||$<=0)throw Error("Browser operation pending limit must be a positive integer")}run($,Z){if(this.closed)return Promise.reject(new f("browser_disposed","Browser Session Runtime is closed"));if(Z?.aborted)return Promise.reject(Z.reason??Error("Browser operation aborted"));if(this.queue.length>=this.maxPending)return Promise.reject(new f("browser_busy","Browser operation queue is full",{retryable:!0}));return new Promise((J,Y)=>{let Q={run:$,resolve:J,reject:Y,signal:Z};if(Z)Q.abortListener=()=>{let X=this.queue.indexOf(Q);if(X<0)return;this.queue.splice(X,1),Y(Z.reason??Error("Browser operation aborted"))},Z.addEventListener("abort",Q.abortListener,{once:!0});this.queue.push(Q),this.drain()})}close(){if(!this.closed){this.closed=!0,this.closeController.abort(new f("browser_disposed","Browser Session Runtime is closed"));for(let $ of this.queue.splice(0)){if($.signal&&$.abortListener)$.signal.removeEventListener("abort",$.abortListener);$.reject(new f("browser_disposed","Browser Session Runtime is closed"))}}if(!this.active)return Promise.resolve();return new Promise(($)=>this.idleWaiters.add($))}stats(){return{active:this.active,pending:this.queue.length,closed:this.closed}}drain(){if(this.active||this.closed)return;let $=this.queue.shift();if(!$)return;if($.signal&&$.abortListener)$.signal.removeEventListener("abort",$.abortListener);this.active=!0;let Z=$.signal?AbortSignal.any([$.signal,this.closeController.signal]):this.closeController.signal;Promise.resolve().then(()=>$.run(Z)).then($.resolve,$.reject).finally(()=>{if(this.active=!1,this.closed){for(let J of this.idleWaiters)J();this.idleWaiters.clear()}this.drain()})}}import{randomUUID as cV}from"node:crypto";import{Mutex as pV}from"async-mutex";var lV={viewport:{width:1440,height:900},deviceScaleFactor:1,locale:"en-US",timezoneId:"UTC",acceptDownloads:!1};async function iV(){let{chromium:$}=await import("playwright");return{launch:(Z)=>$.launch(Z)}}class V3{mutex=new pV;leases=new Map;maxContexts;contextOptions;environment;adapter;browser;launchPromise;generation=0;disposed=!1;disconnectListener;constructor($={}){if(this.adapter=$.adapter,this.contextOptions=$.contextOptions??lV,this.environment=$.environment??process.env,this.maxContexts=$.maxContexts??X3,!Number.isSafeInteger(this.maxContexts)||this.maxContexts<=0)throw Error("Browser context limit must be a positive integer")}async acquire($){return this.mutex.runExclusive(async()=>{if(this.disposed)throw new f("browser_disposed","Browser process pool is closed");if(this.leases.size>=this.maxContexts)throw new f("browser_capacity",`Browser context capacity is full (max ${this.maxContexts})`,{retryable:!0});let Z=await this.ensureBrowser(),J=this.generation,Y;try{Y=await Z.newContext(this.contextOptions)}catch(W){if(!Z.isConnected()||Z!==this.browser)throw new f("browser_disconnected","Chromium disconnected while creating a Session context",{retryable:!0});if(this.leases.size===0&&Z===this.browser)this.detachDisconnectListener(Z),this.browser=void 0,this.launchPromise=void 0,await Z.close().catch(()=>{return});throw W}if(this.disposed||Z!==this.browser||J!==this.generation)throw await Y.close().catch(()=>{return}),new f(this.disposed?"browser_disposed":"browser_disconnected",this.disposed?"Browser process pool is closed":"Chromium disconnected while creating a Session context",{retryable:!this.disposed});let Q=cV();this.leases.set(Q,{context:Y,generation:J,onDisconnected:$});let X=!1;return{context:Y,generation:J,release:async()=>{if(X)return;X=!0,await this.release(Q)}}})}stats(){return{generation:this.generation,contexts:this.leases.size,launching:this.launchPromise!==void 0&&this.browser===void 0,running:this.browser?.isConnected()===!0,disposed:this.disposed}}async dispose(){let $=await this.mutex.runExclusive(async()=>{if(this.disposed)return;this.disposed=!0;let Z=this.browser,J=[...this.leases.values()].map((Y)=>Y.context);return this.leases.clear(),this.detachDisconnectListener(Z),this.browser=void 0,this.launchPromise=void 0,this.generation++,{browser:Z,contexts:J}});if(!$)return;await Promise.allSettled($.contexts.map((Z)=>Z.close())),await $.browser?.close().catch(()=>{return})}async ensureBrowser(){if(this.browser?.isConnected())return this.browser;if(!this.launchPromise)this.launchPromise=this.launch();try{return await this.launchPromise}finally{this.launchPromise=void 0}}async launch(){let $=this.adapter??await iV();this.adapter=$;let Z;try{Z=await $.launch({headless:!0,chromiumSandbox:!0,env:W3(this.environment)})}catch{throw new f("browser_not_installed",`Chromium is unavailable or failed to launch.
121
+ [error] ${G.message}`),z.releaseAdmission(),z.resolveCompletion()})()}),this.processes.set(J,z);try{await W.release()}catch(G){throw z.status="aborted",z.endTime=Date.now(),await U.terminate(),this.processes.delete(J),z.releaseAdmission(),z.resolveCompletion(),$.sandboxedCommand?.cleanup(),G}return z}startExternalForegroundCandidate($){let Z=this.reserve($.sessionId),J=`bash_${M8()}`,Y=this.createCompletion(),Q={id:J,command:$.command,sessionId:$.sessionId,cwd:$.cwd,status:"running",startTime:Date.now(),pendingStdout:new J$,pendingStderr:new J$,sandboxed:$.sandboxed??!1,transport:"acp",visible:!1,autoBackgrounded:!1,completion:Y.promise,resolveCompletion:Y.resolve,releaseAdmission:this.releaseOnce(Z),terminateExternal:$.terminate,terminalSettled:!1};return this.processes.set(J,Q),Q}promoteExternalForegroundCandidate($,Z,J){let Y=this.getOwnedProcess($,Z);if(!Y||Y.visible||Y.status!=="running"||Y.transport!=="acp")return;return Y.visible=!0,Y.autoBackgrounded=!0,Y.backgroundReason="foreground_budget",Y.foregroundBudgetMs=J,Y.foregroundCapture=void 0,Y}appendExternalOutput($,Z,J,Y){let Q=this.getOwnedProcess($,Z);if(!Q||Q.transport!=="acp")return;if(J==="stdout")Q.pendingStdout.append(Y);else Q.pendingStderr.append(Y)}replaceExternalOutput($,Z,J,Y){let Q=this.getOwnedProcess($,Z);if(!Q||Q.transport!=="acp")return;Q.pendingStdout=new J$,Q.pendingStderr=new J$,Q.pendingStdout.append(J),Q.pendingStderr.append(Y)}completeExternalProcess($,Z,J){let Y=this.getOwnedProcess($,Z);if(!Y||Y.transport!=="acp"||Y.terminalSettled)return;if(Y.terminalSettled=!0,Y.status=J.status,Y.exitCode=J.exitCode,Y.signal=J.signal,Y.errorMessage=J.errorMessage,J.finalizationFailed)Y.finalizationFailed=!0;Y.endTime=Date.now(),Y.releaseAdmission(),Y.resolveCompletion()}promoteForegroundCandidate($,Z,J,Y){let Q=this.getOwnedProcess($,Z);if(!Q||Q.visible||Q.status!=="running"||!Q.foreground)return;let X=new v2(J,Z);return Q.foreground.handoff((W)=>X.register($,W),()=>X.remove($)),Q.leaseStore=X,Q.visible=!0,Q.autoBackgrounded=!0,Q.backgroundReason="foreground_budget",Q.foregroundBudgetMs=Y,Q}waitForCompletion($,Z){return this.getOwnedProcess($,Z)?.completion}consumeCandidateOutput($,Z){let J=this.getOwnedProcess($,Z);if(!J)return;let Y=this.snapshot(J,!0);if(J.foregroundCapture)J.foregroundCapture.finish(),Y.capture=J.foregroundCapture.snapshot(),J.foregroundCapture=void 0;return Y}removeCandidate($,Z){let J=this.getOwnedProcess($,Z);if(!J||J.visible||J.status==="running")return;this.processes.delete($)}terminateForegroundCandidate($,Z,J){let Y=this.getOwnedProcess($,Z);if(!Y||Y.visible)return;return this.terminateProcess(Y,J)}consumeOutput($,Z){let J=this.getProcess($,Z);if(!J)return;return this.snapshot(J,!0)}getProcess($,Z){let J=this.getOwnedProcess($,Z);return J?.visible?J:void 0}listForSession($){return Array.from(this.processes.values()).filter((Z)=>Z.sessionId===$&&Z.visible)}async writeInput($,Z,J,Y=!1){let Q=this.getProcess($,Z);if(!Q)return;if(Q.transport==="acp")return{success:!1,status:Q.status,bytesWritten:0,stdinClosed:!1,errorMessage:"ACP background terminals do not support stdin writes"};let X=Q.process?.stdin;if(Q.status!=="running"||!X||X.destroyed||X.writableEnded)return{success:!1,status:Q.status,bytesWritten:0,stdinClosed:!X||X.destroyed||X.writableEnded,errorMessage:"Shell stdin is not writable"};try{return await new Promise((W,V)=>{let U=(z)=>{X.off("error",U),V(z)},H=(z)=>{if(X.off("error",U),z)V(z);else W()};if(X.once("error",U),Y)X.end(J,H);else X.write(J,H)}),{success:!0,status:Q.status,bytesWritten:Buffer.byteLength(J),stdinClosed:Y}}catch(W){return{success:!1,status:Q.status,bytesWritten:0,stdinClosed:X.destroyed||X.writableEnded,errorMessage:W instanceof Error?W.message:"Failed to write stdin"}}}async kill($,Z){let J=this.getOwnedProcess($,Z);if(!J?.visible)return;return this.terminateProcess(J)}async killSession($){let Z=Array.from(this.processes.values()).filter((J)=>J.sessionId===$);await Promise.all(Z.map((J)=>this.terminateProcess(J)));for(let J of Z)this.processes.delete(J.id)}reapOrphanedSession($,Z){return new v2(Z,$).reapOrphans()}async terminateProcess($,Z="killed"){if($.externalTerminationPromise)return $.externalTerminationPromise;if($.status!=="running")return{success:!1,alreadyExited:!0,status:$.status,...$.finalizationFailed?{finalizationFailed:!0}:{},pid:$.pid,exitCode:$.exitCode,signal:$.signal};if($.terminateExternal){let Y=$.terminateExternal;return $.externalTerminationPromise=Promise.resolve().then(async()=>{try{await Y(Z)}catch{this.completeExternalProcess($.id,$.sessionId,{status:"error",finalizationFailed:!0,errorMessage:"ACP terminal finalization failed"})}return $.releaseAdmission(),{success:$.status!=="error",alreadyExited:!1,status:$.status,...$.finalizationFailed?{finalizationFailed:!0}:{},pid:$.pid,exitCode:$.exitCode,signal:$.signal}}).finally(()=>{$.externalTerminationPromise=void 0}),$.externalTerminationPromise}if($.status=Z==="timeout"?"timed_out":Z==="aborted"?"aborted":"killed",$.endTime=Date.now(),!$.process)return $.releaseAdmission(),{success:!1,alreadyExited:!0,status:$.status,...$.finalizationFailed?{finalizationFailed:!0}:{},pid:$.pid,exitCode:$.exitCode,signal:$.signal};let J=await $.processTree?.terminate();if(!J?.success)return $.status="error",$.errorMessage="Failed to terminate owned process tree",{success:!1,alreadyExited:J?.alreadyExited??!1,status:$.status,pid:$.pid,exitCode:$.exitCode,signal:$.signal};return $.leaseStore?.remove($.id),$.releaseAdmission(),{success:!0,alreadyExited:J.alreadyExited,status:$.status,pid:$.pid,exitCode:$.exitCode,signal:$.signal}}async killAll(){await Promise.all(Array.from(this.processes.values()).map(($)=>this.terminateProcess($))),this.processes.clear()}getAdmissionStats(){return{active:this.activeGlobal,maxActive:this.globalMaxActive,sessions:Object.fromEntries([...this.activeBySession].map(([$,Z])=>[$,{active:Z,maxActive:this.sessionMaxActive}]))}}getOwnedProcess($,Z){let J=this.processes.get($);return J?.sessionId===Z?J:void 0}snapshot($,Z){let J=Z?$.pendingStdout.consume():$.pendingStdout.peek(),Y=Z?$.pendingStderr.consume():$.pendingStderr.peek();return{id:$.id,command:$.command,status:$.status,stdout:J.content,stderr:Y.content,stdoutOmittedBytes:J.omittedBytes,stderrOmittedBytes:Y.omittedBytes,stdoutTotalBytes:J.totalBytes,stderrTotalBytes:Y.totalBytes,exitCode:$.exitCode,signal:$.signal,pid:$.pid,startedAt:$.startTime,endedAt:$.endTime,errorMessage:$.errorMessage,...$.finalizationFailed?{finalizationFailed:!0}:{},sandboxed:$.sandboxed,transport:$.transport,autoBackgrounded:$.autoBackgrounded,backgroundReason:$.backgroundReason,foregroundBudgetMs:$.foregroundBudgetMs}}reserve($){let Z=this.activeBySession.get($)??0;if(Z>=this.sessionMaxActive)throw new r$("session",this.sessionMaxActive);if(this.activeGlobal>=this.globalMaxActive)throw new r$("global",this.globalMaxActive);return this.activeGlobal++,this.activeBySession.set($,Z+1),this.releaseOnce(()=>{this.activeGlobal=Math.max(0,this.activeGlobal-1);let J=Math.max(0,(this.activeBySession.get($)??0)-1);if(J===0)this.activeBySession.delete($);else this.activeBySession.set($,J)})}releaseOnce($){let Z=!1;return()=>{if(Z)return;Z=!0,$()}}createCompletion(){let $;return{promise:new Promise((J)=>{$=J}),resolve:$}}positiveLimit($,Z){if(!Number.isSafeInteger($)||$<=0)throw Error(`${Z} must be a positive safe integer`);return $}}import{stat as GX}from"node:fs/promises";import{Mutex as KX}from"async-mutex";import{nanoid as cD}from"nanoid";import*as _0 from"path";import*as Q$ from"fs/promises";class h2{async readTextFile($){return Q$.readFile($,"utf-8")}async writeTextFile($,Z){await Q$.writeFile($,Z,"utf-8")}async exists($){try{return await Q$.access($),!0}catch(Z){if(Z.code==="ENOENT")return!1;throw Z}}async readBinaryFile($){return Q$.readFile($)}async stat($){try{let Z=await Q$.stat($);return{size:Z.size,isDirectory:Z.isDirectory(),isFile:Z.isFile(),mtime:Z.mtime}}catch(Z){if(Z.code==="ENOENT")return null;throw Z}}async mkdir($,Z){await Q$.mkdir($,{recursive:Z?.recursive??!1,mode:Z?.mode??493})}}var SV=new h2;function n$(){return SV}import{createHash as t9}from"node:crypto";import*as I8 from"@agentclientprotocol/sdk";import{createHash as kV}from"node:crypto";var g0=30000,v6=5000,C8=120000,T8=60000;var R8=31,f8=1024,vV={aborted:"ACP remote file request was aborted",timeout:"ACP remote file request timed out",busy:"ACP remote file path is busy",capacity:"ACP remote file request capacity is full",closed:"ACP remote filesystem connection is closed","stale-reconciliation":"ACP remote file reconciliation is stale"};class g extends Error{reason;operation;dispatched;requestPending;name="AcpRemoteFileBoundaryError";constructor($,Z,J,Y){super(vV[$]);this.reason=$;this.operation=Z;this.dispatched=J;this.requestPending=Y}}function N0($){return D$($),`acp-remote-connection-path:${kV("sha256").update($.collisionIdentity).digest("hex")}`}var P8=new WeakMap,S8=new WeakMap;function y9(){return{normalTokens:new Set,recoveryToken:void 0,mutationStates:new Map,readTokens:new Map,recoveryPermits:new Map,closed:!1}}function yV($,Z){let J,Y,Q=new Promise((X,W)=>{J=X,Y=W});return Q.catch(()=>{return}),{kind:Z,operation:$.operation,purpose:$.purpose,sessionId:$.sessionId,pathIdentity:$.pathIdentity,exactPathIdentity:$.exactPathIdentity,controller:new AbortController,localPromise:Q,resolve:J,reject:Y,timer:void 0,parentAbortHandler:void 0,deadlineAbortHandler:void 0,settled:!1,dispatched:!1,requestPending:!1,timedOut:!1,aborted:!1,boundaryError:void 0}}function k8($){if(!$)return;return P8.get($)}function x9($,Z){let J=Z.userReadPermit?.lane==="recovery"||Z.purpose==="rollback"?"recovery":"normal";if(J==="normal"&&$.normalTokens.size>=R8)throw new g("capacity",Z.operation,!1,!1);if(J==="recovery"&&$.recoveryToken!==void 0)throw new g("capacity",Z.operation,!1,!1);let Y=yV(Z,J),Q=k8(Z.lease);if(Z.operation==="write"&&Q)if(Q.kind==="active"){let X=Q.exactPathIdentities.get(Z.pathIdentity);if(X===void 0)throw new g("busy",Z.operation,!1,!1);Y.writeLeaseSnapshot={generation:Q.generations.get(Z.pathIdentity)??0,leaseId:Q.leaseId,leaseKind:Q.kind,exactPathIdentity:X}}else Y.writeLeaseSnapshot={generation:Q.generation,leaseId:Q.leaseId,leaseKind:Q.kind,exactPathIdentity:Q.exactPathIdentity};if(Z.operation==="read"){let X=Z.userReadPermit?S8.get(Z.userReadPermit):void 0;if(Y.readToken={pathIdentity:Z.pathIdentity,exactPathIdentity:Z.exactPathIdentity,generation:Z.userReadPermit?.generation,permitId:X?.permitId,detached:!1,settled:!1},$.readTokens.set(Z.pathIdentity,Y.readToken),Z.userReadPermit?.lane==="recovery"){let W=$.mutationStates.get(Z.pathIdentity),V=$.recoveryPermits.get(Z.pathIdentity);if(W?.sessionId===Z.sessionId&&W.exactPathIdentity===Z.exactPathIdentity&&W.generation===Z.userReadPermit.generation&&V!==void 0&&X!==void 0&&V.permitId===X.permitId)W.kind="reconciling",W.reconciliationPermitId=V.permitId;if(V?.sessionId===Z.sessionId&&V.exactPathIdentity===Z.exactPathIdentity&&V.generation===Z.userReadPermit.generation)V.active=!0}}if(J==="normal")$.normalTokens.add(Y);else $.recoveryToken=Y;return Y}function v8($,Z){if(Z.kind==="normal")$.normalTokens.delete(Z);else if($.recoveryToken===Z)$.recoveryToken=void 0;if(Z.readToken?.settled&&$.readTokens.get(Z.pathIdentity)===Z.readToken)$.readTokens.delete(Z.pathIdentity)}function I9($){if($.timer)clearTimeout($.timer),$.timer=void 0;if($.parentAbortHandler&&$.parentSignal)$.parentSignal.removeEventListener("abort",$.parentAbortHandler),$.parentAbortHandler=void 0,$.parentSignal=void 0}function h9($){if($.settled)return;$.settled=!0;let Z=new g("closed",$.operation,$.dispatched,$.requestPending);return $.reject(Z),Z}function g9($,Z,J,Y){if(Z.settled)return;let Q=Z.operation==="write"&&Z.dispatched&&Y&&Z.writeLeaseSnapshot!==void 0;if(Z.boundaryError=j1(new g(J,Z.operation,Z.dispatched,Y&&Z.dispatched),Q),Z.operation==="read"&&Z.readToken){if(Z.readToken.detached=Z.boundaryError.requestPending,!Z.boundaryError.requestPending)$.readTokens.delete(Z.pathIdentity)}if(Z.operation==="write"&&Z.dispatched){let X=$.mutationStates.get(Z.pathIdentity),W=Z.writeLeaseSnapshot;if(X&&W&&X.sessionId===Z.sessionId&&X.exactPathIdentity===Z.exactPathIdentity&&X.exactPathIdentity===W.exactPathIdentity&&X.generation===W.generation&&X.leaseId===W.leaseId&&X.leaseKind===W.leaseKind)X.kind="pending-write",X.forwardVerified=!1}return Z.settled=!0,Z.reject(Z.boundaryError),Z.boundaryError}function u9($){let Z=0,J=0,Y=0,Q=0;for(let W of $.mutationStates.values()){if(W.kind==="active-mutation")Z+=1;if(W.kind==="pending-write")J+=1;if(W.kind==="needs-read")Y+=1;if(W.kind==="reconciling")Q+=1}let X=0;for(let W of $.readTokens.values())if(!W.detached)X+=1;return{pendingNormal:$.normalTokens.size,pendingRecovery:$.recoveryToken?1:0,activeNormalReads:X,mutationPaths:$.mutationStates.size,activeMutations:Z,pendingWrites:J,needsRead:Y,reconciling:Q,closed:$.closed}}function d9($,Z){if(Z.length===0)throw new g("busy","write",!1,!1);let J=$.mutationStates.size;for(let Y of Z){let Q=$.mutationStates.get(Y);if(Q)throw j1(new g("busy","write",!1,!1),Q.kind==="pending-write"||Q.kind==="needs-read")}if(J+Z.length>f8)throw new g("capacity","write",!1,!1)}function y6($){let Z=new Map;for(let J of $){let Y=N0(J);if(!Z.has(Y))Z.set(Y,J)}return[...Z.entries()].sort(([J],[Y])=>J.localeCompare(Y)).map(([,J])=>J)}function m9($,Z,J){let Y=y6(Z).map((Q)=>({pathIdentity:N0(Q),exactPathIdentity:Q.exactIdentity}));return xV($,Y,J)}function xV($,Z,J){let Y=Z.map(({pathIdentity:B})=>B),Q=Symbol("acp-mutation-lease"),X={kind:"active",sessionId:J,leaseId:Q,generations:new Map,exactPathIdentities:new Map,released:!1},W=new Map;for(let{pathIdentity:B,exactPathIdentity:G}of Z){let w=($.mutationStates.get(B)?.generation??0)+1;W.set(B,w),X.generations.set(B,w),X.exactPathIdentities.set(B,G)}for(let{pathIdentity:B,exactPathIdentity:G}of Z){let D=$.mutationStates.get(B),w=new Set(D?.retiredGenerations??[]);if(D)w.add(D.generation);$.mutationStates.set(B,{pathIdentity:B,exactPathIdentity:G,sessionId:J,generation:W.get(B)??1,kind:"active-mutation",leaseKind:"active",leaseId:Q,forwardVerified:!1,retiredGenerations:w})}let V=!1,U=!1,H=(B,G)=>{let D=W.get(B),w=$.mutationStates.get(B);if(D===void 0||!w||w.sessionId!==J||w.generation!==D||w.exactPathIdentity!==G||w.leaseKind!=="active"||w.leaseId!==Q)return;return w},z={sessionId:J,pathIdentities:Y,generationFor(B){let G=N0(B);return H(G,B.exactIdentity)?.generation??0},isCurrent(B){let G=N0(B);return!V&&H(G,B.exactIdentity)!==void 0},markForwardVerified(B){if(V)return;let G=N0(B),D=H(G,B.exactIdentity);if(D)D.kind="active-mutation",D.forwardVerified=!0},markDefinite(B){if(V)return;let G=N0(B);if(H(G,B.exactIdentity))$.mutationStates.delete(G)},markUncertain(B){if(V)return;let G=N0(B),D=H(G,B.exactIdentity);if(D)D.kind="needs-read",D.forwardVerified=!1},beginRecovery(B){if(V)throw new g("stale-reconciliation","read",!1,!1);let G=N0(B),D=B.exactIdentity,w=H(G,D);if(!w||w.kind==="pending-write")throw new g("stale-reconciliation","read",!1,!1);let q=w.generation,F=q+1,L=Symbol("acp-recovery-lease");W.set(G,F),X.generations.set(G,F);let _=new Set(w.retiredGenerations??[]);_.add(q),w.generation=F,w.kind="active-mutation",w.leaseKind="recovery",w.leaseId=L,w.forwardVerified=!1,w.reconciliationPermitId=void 0,w.retiredGenerations=_;let O={generation:F,pathIdentity:G,exactPathIdentity:D,finish(N){if(b.finished)return;let A=$.mutationStates.get(G);if(!A||A.sessionId!==J||A.generation!==F||A.exactPathIdentity!==D||A.leaseKind!=="recovery"||A.leaseId!==L)return;if(b.finished=!0,A.kind==="pending-write")return;if(N==="restored")$.mutationStates.delete(G);else A.kind="needs-read",A.forwardVerified=!1,A.reconciliationPermitId=void 0}},b={kind:"recovery",sessionId:J,leaseId:L,pathIdentity:G,exactPathIdentity:D,generation:F,finished:!1};return P8.set(O,b),O},commitVerified(){U=!0},release(){if(V)return;for(let{pathIdentity:B,exactPathIdentity:G}of Z){let D=H(B,G);if(!D)continue;if(D.kind==="active-mutation"){if(!D.forwardVerified){$.mutationStates.delete(B);continue}if(U){$.mutationStates.delete(B);continue}D.kind="needs-read",D.forwardVerified=!1,D.reconciliationPermitId=void 0;continue}if(D.kind==="pending-write")continue;if(D.kind==="needs-read"){D.forwardVerified=!1;continue}if(U)$.mutationStates.delete(B)}V=!0,X.released=!0}};return P8.set(z,X),z}function c9($,Z,J){let Y=N0(Z),Q=$.mutationStates.get(Y);if(!Q)return Object.freeze({sessionId:J,pathIdentity:Y,exactPathIdentity:Z.exactIdentity,generation:void 0,lane:"normal",complete:(X,W)=>{W()},fail:()=>{}});if(Q.kind==="pending-write")throw j1(new g("busy","read",!1,!1),!0);if(Q.kind==="needs-read"&&Q.sessionId===J&&Q.exactPathIdentity===Z.exactIdentity&&!$.recoveryToken&&!$.recoveryPermits.has(Y)){let X=Symbol("acp-recovery-permit"),W={sessionId:J,pathIdentity:Y,exactPathIdentity:Z.exactIdentity,generation:Q.generation,permitId:X,active:!1};$.recoveryPermits.set(Y,W);let V={sessionId:J,pathIdentity:Y,exactPathIdentity:Z.exactIdentity,generation:Q.generation,lane:"recovery",complete:(H,z)=>{let B=$.mutationStates.get(Y);if($.recoveryPermits.get(Y)!==W||!W.active||!B||B.sessionId!==J||B.generation!==W.generation||B.exactPathIdentity!==W.exactPathIdentity||B.reconciliationPermitId!==W.permitId||B.kind!=="needs-read")throw new g("stale-reconciliation","read",!1,!1);if(z(),$.recoveryPermits.delete(Y),W.active=!1,H==="content"||H==="not-found")$.mutationStates.delete(Y)},fail:()=>{if($.recoveryPermits.get(Y)===W){$.recoveryPermits.delete(Y);let H=$.mutationStates.get(Y);if(H?.kind==="needs-read"&&H.reconciliationPermitId===X)H.reconciliationPermitId=void 0}W.active=!1}},U=Object.freeze(V);return S8.set(U,{permitId:X}),U}throw new g("busy","read",!1,!1)}function p9($,Z){if(Z.userReadPermit?.lane==="recovery"){let Q=$.mutationStates.get(Z.pathIdentity);if(Q?.kind==="pending-write")throw j1(new g("busy","read",!1,!1),!0);if(!Q||Q.kind!=="needs-read")throw new g("stale-reconciliation","read",!1,!1);let X=$.recoveryPermits.get(Z.pathIdentity),W=S8.get(Z.userReadPermit);if(!X||!W||X.permitId!==W.permitId||Z.userReadPermit.pathIdentity!==Z.pathIdentity||Z.userReadPermit.exactPathIdentity!==Z.exactPathIdentity||Z.userReadPermit.sessionId!==Z.sessionId||Q.sessionId!==Z.sessionId||Q.exactPathIdentity!==Z.exactPathIdentity||Q.generation!==Z.userReadPermit.generation||X.sessionId!==Z.userReadPermit.sessionId||X.exactPathIdentity!==Z.userReadPermit.exactPathIdentity||X.generation!==Z.userReadPermit.generation)throw new g("stale-reconciliation","read",!1,!1);let V=$.readTokens.get(Z.pathIdentity);if(V&&!V.detached)throw new g("busy","read",!1,!1);if(Q.retiredGenerations?.has(Z.userReadPermit.generation))throw new g("stale-reconciliation","read",!1,!1);if(Q.exactPathIdentity!==Z.exactPathIdentity)throw new g("busy","read",!1,!1);return}if($.readTokens.get(Z.pathIdentity))throw new g("busy","read",!1,!1);let Y=$.mutationStates.get(Z.pathIdentity);if(!Y)return;if(Y.kind!=="active-mutation")throw j1(new g("busy","read",!1,!1),Y.kind==="pending-write"||Y.kind==="needs-read");if(!IV(Z,Y))throw new g("busy","read",!1,!1)}function l9($,Z){let J=$.mutationStates.get(Z.pathIdentity),Y=k8(Z.lease);if(!J||!Y||Y.sessionId!==Z.sessionId)throw j1(new g("busy","write",!1,!1),J?.kind==="pending-write"||J?.kind==="needs-read");if(J.kind!=="active-mutation")throw j1(new g("busy","write",!1,!1),J.kind==="pending-write"||J.kind==="needs-read");if(Y.kind==="active"){if(Y.released||!Y.generations.has(Z.pathIdentity)||Y.exactPathIdentities.get(Z.pathIdentity)!==Z.exactPathIdentity||Y.generations.get(Z.pathIdentity)!==J.generation||J.exactPathIdentity!==Z.exactPathIdentity||J.leaseKind!==Y.kind||J.leaseId!==Y.leaseId)throw new g("busy","write",!1,!1);return}if(Y.finished||Y.pathIdentity!==Z.pathIdentity||Y.exactPathIdentity!==Z.exactPathIdentity||Y.generation!==J.generation||J.exactPathIdentity!==Z.exactPathIdentity||J.leaseKind!==Y.kind||J.leaseId!==Y.leaseId)throw new g("busy","write",!1,!1)}function IV($,Z){let J=k8($.lease);if(!J||J.sessionId!==$.sessionId||Z.sessionId!==$.sessionId||Z.exactPathIdentity!==$.exactPathIdentity)return!1;if(J.kind==="active")return!J.released&&J.generations.get($.pathIdentity)===Z.generation&&J.exactPathIdentities.get($.pathIdentity)===$.exactPathIdentity&&Z.leaseKind==="active"&&Z.leaseId===J.leaseId;return!J.finished&&J.pathIdentity===$.pathIdentity&&J.exactPathIdentity===$.exactPathIdentity&&J.generation===Z.generation&&Z.leaseKind==="recovery"&&Z.leaseId===J.leaseId}function j1($,Z){if(!Z)return $;return Object.defineProperty($,"requiresRead",{value:!0,enumerable:!0,configurable:!0}),$}function i9($,Z){if(Z.requestPending=!1,Z.operation==="read"){if(Z.kind==="recovery"){let Q=$.mutationStates.get(Z.pathIdentity);if(Q&&Q.kind==="reconciling"&&Q.sessionId===Z.sessionId&&Q.exactPathIdentity===Z.exactPathIdentity&&Q.generation===Z.readToken?.generation&&Q.reconciliationPermitId===Z.readToken?.permitId){if(Q.kind="needs-read",Z.boundaryError)Q.reconciliationPermitId=void 0}}if(Z.readToken)Z.readToken.settled=!0;return}let J=$.mutationStates.get(Z.pathIdentity),Y=Z.writeLeaseSnapshot;if(J&&Y&&J.sessionId===Z.sessionId&&J.exactPathIdentity===Z.exactPathIdentity&&J.exactPathIdentity===Y.exactPathIdentity&&Z.boundaryError?.dispatched&&J.generation===Y.generation&&J.leaseId===Y.leaseId&&J.leaseKind===Y.leaseKind)J.kind="needs-read",J.forwardVerified=!1,J.reconciliationPermitId=void 0}function r9($,Z){if(Z.operation==="read"&&Z.readToken){if(Z.kind==="recovery"){let J=$.mutationStates.get(Z.pathIdentity);if(J?.kind==="reconciling"&&J.sessionId===Z.sessionId&&J.exactPathIdentity===Z.exactPathIdentity&&J.generation===Z.readToken.generation&&J.reconciliationPermitId===Z.readToken.permitId)J.kind="needs-read",J.reconciliationPermitId=void 0;let Y=$.recoveryPermits.get(Z.pathIdentity);if(Y?.sessionId===Z.sessionId&&Y.exactPathIdentity===Z.exactPathIdentity&&Y.generation===Z.readToken.generation&&Y.permitId===Z.readToken.permitId)$.recoveryPermits.delete(Z.pathIdentity)}Z.readToken.settled=!0}if(Z.readToken&&$.readTokens.get(Z.pathIdentity)===Z.readToken)$.readTokens.delete(Z.pathIdentity);v8($,Z)}var g2=new WeakMap;function o1($){if($.signal.aborted){let Y=g2.get($);if(Y)return Y;let Q=new y8($);return g2.set($,Q),Q}let Z=g2.get($);if(Z)return Z;let J=new y8($);return g2.set($,J),J}class y8{connection;state;closeHandler;constructor($){this.connection=$;if(this.state=y9(),this.state.closed=$.signal.aborted,this.closeHandler=()=>{this.handleConnectionClosed()},!this.state.closed)$.signal.addEventListener("abort",this.closeHandler,{once:!0})}runRequest($){let Z;try{this.assertOpen($.operation),this.assertBeforeBoundary($.signal,$.operation),this.assertPathAvailability($),Z=this.reserveRequestToken($)}catch(U){return Promise.reject(U)}let J=Z.controller,Y=()=>{this.boundaryReject(Z,this.buildBoundaryReason($.signal,$.deadlineAt),!0),J.abort()};Z.parentSignal=$.signal,Z.parentAbortHandler=Y,$.signal?.addEventListener("abort",Y,{once:!0});let Q=()=>{this.closeRejectToken(Z),J.abort()};Z.deadlineAbortHandler=Q,this.connection.signal.addEventListener("abort",Q,{once:!0});let X=Date.now();if($.deadlineAt<=X)return this.boundaryReject(Z,"timeout",!1),this.cleanupReservedButUndispatchedToken(Z),J.abort(),Z.localPromise;let W=$.deadlineAt-X;Z.timer=setTimeout(()=>{this.boundaryReject(Z,"timeout",!0),J.abort()},W),Z.timer.unref?.();let V;try{V=$.dispatch(J.signal),Z.dispatched=!0,Z.requestPending=!0,this.observeUnderlyingSettlement(Z,V)}catch(U){return this.clearLocalBoundaryResources(Z),this.cleanupReservedButUndispatchedToken(Z),Z.reject(U),Z.localPromise}if($.signal?.aborted)this.boundaryReject(Z,"aborted",!0),J.abort();return Z.localPromise}precheckMutationPaths($,Z){this.assertOpen("write");let J=y6($).map(N0);this.assertMutationPathsAvailable(J)}tryAcquireMutationLease($,Z){this.assertOpen("write");let J=y6($),Y=J.map(N0);return this.assertMutationPathsAvailable(Y),m9(this.state,J,Z)}beginUserRead($,Z){return this.assertOpen("read"),c9(this.state,$,Z)}getStatsForTests(){return u9(this.state)}assertOpen($){if(this.state.closed||this.connection.signal.aborted)throw this.state.closed=!0,new g("closed",$,!1,!1)}assertBeforeBoundary($,Z){if($?.aborted)throw new g("aborted",Z,!1,!1)}assertPathAvailability($){if($.operation==="read"){p9(this.state,$);return}l9(this.state,$)}reserveRequestToken($){return x9(this.state,$)}observeUnderlyingSettlement($,Z){Z.then((J)=>{this.handleSettlement($,{status:"fulfilled",value:J})},(J)=>{this.handleSettlement($,{status:"rejected",reason:J})})}handleSettlement($,Z){if(this.state.closed){this.clearLocalBoundaryResources($),this.cleanupToken($);return}if(i9(this.state,$),$.boundaryError){this.clearLocalBoundaryResources($),this.cleanupToken($);return}if(this.clearLocalBoundaryResources($),this.cleanupToken($),Z.status==="fulfilled"){$.resolve(Z.value);return}$.reject(Z.reason)}boundaryReject($,Z,J){g9(this.state,$,Z,J),this.clearLocalBoundaryResources($)}closeRejectToken($){if(!h9($))return;this.clearLocalBoundaryResources($),$.controller.abort()}cleanupToken($){v8(this.state,$)}cleanupReservedButUndispatchedToken($){r9(this.state,$)}clearLocalBoundaryResources($){if($.deadlineAbortHandler)this.connection.signal.removeEventListener("abort",$.deadlineAbortHandler),$.deadlineAbortHandler=void 0;I9($)}buildBoundaryReason($,Z){if($?.aborted)return"aborted";if(Z<=Date.now())return"timeout";return"aborted"}assertMutationPathsAvailable($){d9(this.state,$)}handleConnectionClosed(){if(this.state.closed)return;this.state.closed=!0,g2.set(this.connection,this);for(let $ of this.state.normalTokens)this.closeRejectToken($);if(this.state.recoveryToken)this.closeRejectToken(this.state.recoveryToken),this.state.recoveryToken=void 0;this.state.normalTokens.clear(),this.state.readTokens.clear(),this.state.recoveryPermits.clear(),this.state.mutationStates.clear()}}var n9=e("Agent"),hV=1024;class M0 extends Error{operation;name="AcpFileSystemCapabilityError";constructor($){super(`ACP remote filesystem does not support ${$}`);this.operation=$}}function q$($){if(gV($,-32002))return!0;if(!($ instanceof Error))return!1;let Z=$.message.toLowerCase();return["not found","no such file","enoent","does not exist","file not found","path not found"].some((J)=>Z.includes(J))}class v0{connection;sessionId;capabilities;remoteAccessLedger=new Map;remoteAccessCollisionIndex=new Map;disposeController=new AbortController;pathProfile;constructor($,Z,J,Y){this.connection=$;this.sessionId=Z;t1(Y),this.capabilities={readTextFile:J.readTextFile===!0,writeTextFile:J.writeTextFile===!0},this.pathProfile=o9(Y)}async readTextFile($,Z){let J=this.parsePath($);return this.readTextFileForParsedPath(J,{signal:Z?.signal,deadlineAt:Z?.deadlineAt,purpose:Z?.purpose??"preflight",lease:Z?.lease})}async readTextFileForParsedPath($,Z){return this.assertParsedPathStyle($),this.runBoundedTextReadPath($,Z)}async readTextFileForUser($,Z){let J=this.parsePath($);return this.readTextFileForUserForParsedPath(J,Z)}async readTextFileForUserForParsedPath($,Z){this.assertParsedPathStyle($);let Y=o1(this.connection).beginUserRead($,this.sessionId);try{let Q=await this.readTextFileForParsedPath($,{signal:Z?.signal,deadlineAt:Z?.deadlineAt,purpose:"user-read",userReadPermit:Y});return Y.complete("content",()=>{this.recordRemoteAccessForPath($,Q,"read")}),Q}catch(Q){if(q$(Q))throw Y.complete("not-found",()=>{this.deleteRemoteAccessCollisionClass($)}),Q;throw Y.fail(),Q}}async writeTextFile($,Z,J){let Y=this.parsePath($);return this.writeTextFileForParsedPath(Y,Z,J)}async writeTextFileForParsedPath($,Z,J){if(this.assertParsedPathStyle($),!this.capabilities.writeTextFile)throw new M0("writeTextFile");let Y=J?.lease===void 0?this.tryAcquireMutationLeaseForParsedPaths([$]):void 0,Q=J?.lease??Y,X=s9(this.disposeController.signal,J?.signal),W=J?.deadlineAt??Date.now()+g0,V=o1(this.connection);try{if(await V.runRequest({operation:"write",purpose:J?.purpose??"mutation",sessionId:this.sessionId,pathIdentity:N0($),exactPathIdentity:$.exactIdentity,deadlineAt:W,signal:X.signal,lease:Q,dispatch:(U)=>this.connection.request(I8.CLIENT_METHODS.fs_write_text_file,{path:$.wirePath,content:Z,sessionId:this.sessionId},{cancellationSignal:U})}),Y)Y.markDefinite($)}catch(U){if(n9.warn("[AcpFileSystem] writeTextFile ACP request failed"),Y&&uV(U))Y.markUncertain($);throw U}finally{if(Y)Y.release();X.cleanup()}}async exists($){if(!this.capabilities.readTextFile)throw new M0("readTextFile");try{let Z=this.parsePath($);return await this.readTextFileForParsedPath(Z,{purpose:"preflight"}),!0}catch(Z){if(q$(Z))return!1;throw Z}}async readBinaryFile($){throw new M0("readBinaryFile")}async stat($){throw new M0("stat")}async mkdir($,Z){throw new M0("mkdir")}getCapabilities(){return{...this.capabilities}}getPathProfile(){return this.pathProfile}parsePath($){return X$($,this.pathProfile.style)}canReadTextFile(){return this.capabilities.readTextFile??!1}canWriteTextFile(){return this.capabilities.writeTextFile??!1}assertTextMutationCapabilities(){if(!this.canReadTextFile())throw new M0("readTextFile");if(!this.canWriteTextFile())throw new M0("writeTextFile")}usesRemoteFiles(){return this.canReadTextFile()||this.canWriteTextFile()}createOpaqueLockKey($){let Z=this.parsePath($);return this.createOpaqueLockKeyForParsedPath(Z)}createOpaqueLockKeyForParsedPath($){return this.assertParsedPathStyle($),`acp-remote:${t9("sha256").update(this.sessionId).update("\x00").update($.collisionIdentity).digest("hex")}`}async readTextFileIfExists($,Z){let J=this.parsePath($);return this.readTextFileIfExistsForParsedPath(J,Z)}async readTextFileIfExistsForParsedPath($,Z){this.assertParsedPathStyle($);try{return{exists:!0,content:await this.readTextFileForParsedPath($,{signal:Z?.signal,deadlineAt:Z?.deadlineAt,purpose:Z?.purpose??"preflight",userReadPermit:Z?.userReadPermit,lease:Z?.lease})}}catch(J){if(q$(J))return{exists:!1};throw J}}recordRemoteAccess($,Z,J){let Y=this.parsePath($);this.recordRemoteAccessForPath(Y,Z,J)}recordRemoteAccessForParsedPath($,Z,J){this.assertParsedPathStyle($),this.recordRemoteAccessForPath($,Z,J)}recordRemoteAccessForPath($,Z,J){let Y={filePath:$.wirePath,accessTime:Date.now(),contentSha256:a9(Z),sessionId:this.sessionId,lastOperation:J,source:"remote"},Q=this.remoteAccessCollisionIndex.get($.collisionIdentity);if(Q)this.deleteRemoteAccessEntry(Q);this.remoteAccessLedger.set($.exactIdentity,{collisionIdentity:$.collisionIdentity,record:Y}),this.remoteAccessCollisionIndex.set($.collisionIdentity,$.exactIdentity);while(this.remoteAccessLedger.size>hV){let X=this.remoteAccessLedger.keys().next().value;if(X===void 0)break;this.deleteRemoteAccessEntry(X)}}checkRemoteAccess($,Z){let J=this.parsePath($);return this.checkRemoteAccessForParsedPath(J,Z)}checkRemoteAccessForParsedPath($,Z){this.assertParsedPathStyle($);let J=this.remoteAccessLedger.get($.exactIdentity);if(!J)return"missing";return this.remoteAccessLedger.delete($.exactIdentity),this.remoteAccessLedger.set($.exactIdentity,J),J.record.contentSha256===a9(Z)?"current":"modified"}getRemoteAccessRecord($){let Z=this.parsePath($),J=this.remoteAccessLedger.get(Z.exactIdentity);if(!J)return;return{...J.record}}precheckMutationPaths($){let Z=$.map((J)=>this.parsePath(J));this.precheckMutationPathsForParsedPaths(Z)}precheckMutationPathsForParsedPaths($){for(let J of $)this.assertParsedPathStyle(J);o1(this.connection).precheckMutationPaths($,this.sessionId)}tryAcquireMutationLease($){let Z=$.map((J)=>this.parsePath(J));return this.tryAcquireMutationLeaseForParsedPaths(Z)}tryAcquireMutationLeaseForParsedPaths($){for(let J of $)this.assertParsedPathStyle(J);return o1(this.connection).tryAcquireMutationLease($,this.sessionId)}dispose(){this.disposeController.abort(),this.remoteAccessLedger.clear(),this.remoteAccessCollisionIndex.clear()}async runBoundedTextReadPath($,Z){if(!this.capabilities.readTextFile)throw new M0("readTextFile");let J=s9(this.disposeController.signal,Z.signal),Y=o1(this.connection),Q=Z.deadlineAt??Date.now()+g0;try{return(await Y.runRequest({operation:"read",purpose:Z.purpose,sessionId:this.sessionId,pathIdentity:N0($),exactPathIdentity:$.exactIdentity,deadlineAt:Q,signal:J.signal,lease:Z.lease,userReadPermit:Z.userReadPermit,dispatch:(W)=>this.connection.request(I8.CLIENT_METHODS.fs_read_text_file,{path:$.wirePath,sessionId:this.sessionId},{cancellationSignal:W})})).content}catch(X){if(q$(X))this.deleteRemoteAccessCollisionClass($);throw n9.warn("[AcpFileSystem] readTextFile ACP request failed"),X}finally{J.cleanup()}}deleteRemoteAccessCollisionClass($){let Z=this.remoteAccessCollisionIndex.get($.collisionIdentity);if(!Z)return;this.deleteRemoteAccessEntry(Z)}deleteRemoteAccessEntry($){let Z=this.remoteAccessLedger.get($);if(!Z)return;if(this.remoteAccessLedger.delete($),this.remoteAccessCollisionIndex.get(Z.collisionIdentity)===$)this.remoteAccessCollisionIndex.delete(Z.collisionIdentity)}assertParsedPathStyle($){if(D$($),$.style!==this.pathProfile.style)this.parsePath($.wirePath)}}function gV($,Z){return $ instanceof Error&&"code"in $&&$.code===Z}function a9($){return t9("sha256").update($).digest("hex")}function uV($){if(!($ instanceof g))return!0;if(!$.dispatched)return!1;return!$.requestPending}function s9(...$){let Z=$.filter((W)=>W!==void 0);if(Z.length===0)return{signal:new AbortController().signal,cleanup:x8};if(Z.length===1)return{signal:Z[0],cleanup:x8};let J=Z.find((W)=>W.aborted);if(J){let W=new AbortController;return W.abort(J.reason),{signal:W.signal,cleanup:x8}}let Y=new AbortController,Q=new Map,X=(W)=>{if(!Y.signal.aborted)Y.abort(W.reason)};for(let W of Z){let V=()=>{X(W)};Q.set(W,V),W.addEventListener("abort",V,{once:!0})}return{signal:Y.signal,cleanup:()=>{for(let[W,V]of Q)W.removeEventListener("abort",V)}}}function x8(){}var a$=e("Agent"),dV=5000;class x6{defaultCwd;constructor($){this.defaultCwd=$}async execute($,Z){let J=process.platform==="win32"?"cmd.exe":"/bin/bash",Y=process.platform==="win32"?["/c",$]:["-c",$],Q;try{Q=await a1(J,Y,{cwd:Z?.cwd??this.defaultCwd??C(),env:{...process.env,...Z?.env},stdio:["pipe","pipe","pipe"]},Z?.durableOwnership)}catch(X){return{success:!1,stdout:"",stderr:"",exitCode:null,error:X instanceof Error?X.message:"Foreground command admission failed",failureKind:"admission",transport:"local"}}return new Promise((X)=>{let{child:W,processTree:V}=Q,U,H=()=>{return U??=V.terminate(),U},z=new K$,B,G=!1,D=!1,w=!1,q=!1,F,L,_=Z?.timeout?setTimeout(()=>{if(q)return;if(!B)B="timeout";H()},Z.timeout):null,O=null,b=()=>{if(_)clearTimeout(_);if(O&&Z?.signal)Z.signal.removeEventListener("abort",O),O=null},N=(E)=>{if(w)return;w=!0,b(),X(E)};if(Z?.signal){if(O=()=>{if(q)return;if(!B)B="aborted";H()},Z.signal.addEventListener("abort",O),Z.signal.aborted)O()}W.stdout?.on("data",(E)=>{z.append("stdout",E);let j=E.toString();Z?.onOutput?.(j)}),W.stderr?.on("data",(E)=>{z.append("stderr",E);let j=E.toString();Z?.onOutput?.(j)});let A=(E,j)=>{q=!0,b(),F??=(async()=>{if(await L,B||G)await H();try{await Q.finalize()}catch{D=!0}z.finish();let M=z.snapshot(),k=D?"finalization":B==="timeout"?"timeout":B==="aborted"?"aborted":G?"admission":j?"spawn":void 0;N({success:E===0&&!k,stdout:M.stdout.content,stderr:M.stderr.content,exitCode:E,error:k==="timeout"||k==="aborted"?"Command was terminated":k==="admission"?"Foreground command admission failed":k==="finalization"?"Foreground command finalization failed":j?.message,failureKind:k,...D&&(B==="timeout"||B==="aborted")?{terminationReason:B}:{},transport:"local",capture:M})})()};if(W.once("close",(E)=>A(E)),W.once("error",(E)=>A(null,E)),Z?.signal?.aborted)B="aborted",L=Promise.resolve(),H();else L=Q.release().catch(async()=>{if(G=!0,!B)B="admission";await H()})})}isAvailable(){return!0}}class h8{async execute(){return{success:!1,stdout:"",stderr:"",exitCode:null,error:"ACP terminal capability is unavailable",failureKind:"unavailable",transport:"acp"}}isAvailable(){return!1}}class E1 extends Error{code="acp_session_unavailable";constructor(){super("ACP session filesystem is unavailable");this.name="AcpFileSystemUnavailableError"}}class $3{async readTextFile(){throw new E1}async writeTextFile(){throw new E1}async exists(){throw new E1}async readBinaryFile(){throw new E1}async stat(){throw new E1}async mkdir(){throw new E1}}class Z3{connection;sessionId;remoteFileSystem;fallback;constructor($,Z,J=!1,Y){this.connection=$;this.sessionId=Z;this.remoteFileSystem=J;this.fallback=Y}async execute($,Z){if(Z?.signal?.aborted)return{success:!1,stdout:"",stderr:"",exitCode:null,error:"Command was aborted",failureKind:"aborted",transport:"acp"};let J;try{a$.debug(`[AcpTerminal] Executing command via ACP: ${$}`),J=await this.connection.createTerminal({sessionId:this.sessionId,command:$,cwd:Z?.cwd,env:Z?.env?Object.entries(Z.env).map(([E,j])=>({name:E,value:j})):void 0});let Y=J,Q=Y0.getInstance(),X,W=!1,V=new K$(void 0,!0),U=0,H=0,z=!1,B=!1,G,D,w=async()=>{return},q=async()=>{let E,j=Y.currentOutput().then((k)=>({type:"output",response:k})).catch(()=>({type:"error"})),M=new Promise((k)=>{E=setTimeout(()=>k({type:"timeout"}),dV)});return await Promise.race([j,M]).finally(()=>{if(E)clearTimeout(E)})},F=(E)=>{let j=E.length;if(j>=H){let M=E.slice(H);if(M)Z?.onOutput?.(M);H=j}},L=(E)=>{let j=E.output.length;if(!E.truncated&&j>=U){let M=E.output.slice(U);if(M){if(V.append("stdout",M),X)Q.appendExternalOutput(X,this.sessionId,"stdout",M)}F(E.output),U=j;return}if(V=new K$(void 0,!0),V.append("stdout",E.output),V.markAccountingIncomplete(),X)Q.replaceExternalOutput(X,this.sessionId,E.output,"");H=j,U=j},_=(async()=>{while(!z){let E=await q();if(E.type==="output")L(E.response);else if(V.markAccountingIncomplete(),E.type==="timeout"){B=!0,z=!0;break}if(z)break;await new Promise((j)=>{let M=setTimeout(j,100);G=()=>{clearTimeout(M),j()}}),G=void 0}})(),O=async()=>{z=!0,G?.(),await _},b=Y.waitForExit().then((E)=>({type:"completed",exitCode:E.exitCode??null})).catch((E)=>({type:"failed",error:E})),N=(E)=>{return D??=(async()=>{let j=!1;if(E.type!=="completed")await Y.kill().catch(()=>{j=!0});await O();let M=B?{type:"timeout"}:await q();if(M.type==="output"){let p=M.response;if(p.output.length>=H)F(p.output);if(V=new K$(void 0,!0),V.append("stdout",p.output),p.truncated)V.markAccountingIncomplete()}else V.markAccountingIncomplete();await Y.release().catch(()=>{j=!0}),V.finish();let k=V.snapshot();if(X){Q.replaceExternalOutput(X,this.sessionId,k.stdout.content,k.stderr.content);let p=j?"error":E.type==="completed"?"exited":E.type==="timeout"?"timed_out":E.type==="aborted"?"aborted":E.type==="killed"?"killed":"error";if(Q.completeExternalProcess(X,this.sessionId,{status:p,exitCode:E.type==="completed"?E.exitCode:null,...j?{finalizationFailed:!0}:{},errorMessage:j?"ACP terminal finalization failed":E.type==="failed"?E.error instanceof Error?E.error.message:"ACP terminal unavailable":void 0}),!W)Q.removeCandidate(X,this.sessionId)}return{success:!j&&E.type==="completed"&&E.exitCode===0,stdout:k.stdout.content,stderr:k.stderr.content,exitCode:E.type==="completed"?E.exitCode:null,error:j?"ACP terminal finalization failed":E.type==="timeout"?"Command timed out":E.type==="aborted"||E.type==="killed"?"Command was aborted":E.type==="failed"?E.error instanceof Error?`ACP terminal unavailable: ${E.error.message}`:"ACP terminal unavailable":void 0,failureKind:j?"finalization":E.type==="timeout"?"timeout":E.type==="aborted"||E.type==="killed"?"aborted":E.type==="failed"?"unavailable":void 0,...j&&(E.type==="timeout"||E.type==="aborted"||E.type==="killed")?{terminationReason:E.type==="timeout"?"timeout":"aborted"}:{},transport:"acp",capture:k}})(),D};if(!this.remoteFileSystem&&Z?.foregroundHandoffMs&&Z.foregroundHandoffMs>0&&Z.durableOwnership)try{X=Q.startExternalForegroundCandidate({command:$,sessionId:this.sessionId,cwd:Z.cwd,terminate:async(j)=>{await w(j)}}).id,w=async(j)=>{await N({type:j})}}catch(E){if(!(E instanceof r$))throw E}let A=await new Promise((E)=>{let j=!1,M=(h)=>{if(j)return;if(j=!0,k)clearTimeout(k);if(p)clearTimeout(p);Z?.signal?.removeEventListener("abort",R),E(h)},k=Z?.timeout?setTimeout(()=>M({type:"timeout"}),Z.timeout):void 0,p=X&&Z?.foregroundHandoffMs?setTimeout(()=>M({type:"handoff"}),Z.foregroundHandoffMs):void 0,R=()=>M({type:"aborted"});if(Z?.signal?.aborted)R();else Z?.signal?.addEventListener("abort",R,{once:!0});b.then(M)});if(A.type==="handoff"&&X&&Z?.foregroundHandoffMs){let E=Q.promoteExternalForegroundCandidate(X,this.sessionId,Z.foregroundHandoffMs);if(E)return W=!0,b.then(N),{success:!0,stdout:"",stderr:"",exitCode:null,transport:"acp",capture:V.snapshot(),background:{shellId:E.id,autoBackgrounded:!0,foregroundBudgetMs:Z.foregroundHandoffMs}}}return await N(A.type==="handoff"?await b:A)}catch(Y){if(J)await J.release().catch(()=>{return});if(!J&&Z?.signal?.aborted)return{success:!1,stdout:"",stderr:"",exitCode:null,error:"Command was aborted",failureKind:"aborted",transport:"acp"};if(this.remoteFileSystem||Z?.allowLocalFallback!==!0)return{success:!1,stdout:"",stderr:"",exitCode:null,error:Y instanceof Error?`ACP terminal unavailable: ${Y.message}`:"ACP terminal unavailable",failureKind:"unavailable",transport:"acp"};return a$.warn("[AcpTerminal] ACP terminal failed, using fallback:",Y),{...await(this.fallback??new x6(Z?.cwd)).execute($,Z),transport:"local_fallback"}}}isAvailable(){return!0}}function e9($,Z){return JSON.stringify([$,Z])}class y{static sessions=new Map;static remoteSurfaceOwners=new Map;static remoteSurfaceOwnerKeysBySessionId=new Map;static sessionRegistrationGeneration=0n;static currentSessionId=null;constructor(){}static getInstance(){return new y}static initializeSession($,Z,J,Y,Q,X){if(y.sessions.get(Z)){y.currentSessionId=Z,a$.debug(`[AcpServiceContext:${Z}] initializeSession ignored because the session already exists`);return}let V=J?.fs?.readTextFile===!0||J?.fs?.writeTextFile===!0,U;if(V){let G=X??u2(Y);U=new v0($,Z,J?.fs??{},G)}else U=new h2;if(V)a$.debug(`[AcpServiceContext:${Z}] Using ACP file system service`);let H=J?.terminal?new Z3($,Z,V):V?new h8:new x6(Y);a$.debug(`[AcpServiceContext:${Z}] Using ${J?.terminal?"ACP":"local"} terminal service`),y.sessionRegistrationGeneration+=1n;let z=Object.freeze({generation:`acp-owner-generation:${y.sessionRegistrationGeneration.toString(36)}`,sessionId:Z}),B={fileSystemService:U,terminalService:H,connection:$,registration:z,sendUpdate:Q,clientCapabilities:J||null,executionRoot:Y,remoteFileSystem:V};if(y.sessions.set(Z,B),V){let G=X??u2(Y),D=e9(Z,G.workspace.exactIdentity);y.remoteSurfaceOwners.set(D,{exactIdentity:G.workspace.exactIdentity,generation:z.generation,readText:J?.fs?.readTextFile===!0,services:B,writeText:J?.fs?.writeTextFile===!0,terminal:J?.terminal===!0}),y.remoteSurfaceOwnerKeysBySessionId.set(Z,D)}return y.currentSessionId=Z,a$.debug(`[AcpServiceContext:${Z}] Initialized with capabilities:`,{fs:!!J?.fs,readTextFile:J?.fs?.readTextFile,writeTextFile:J?.fs?.writeTextFile}),z}static destroySession($){let Z=y.remoteSurfaceOwnerKeysBySessionId.get($);if(Z)y.remoteSurfaceOwners.delete(Z),y.remoteSurfaceOwnerKeysBySessionId.delete($);let J=y.sessions.get($);if(J?.fileSystemService instanceof v0)J.fileSystemService.dispose();if(y.sessions.delete($),y.currentSessionId===$){let Y=Array.from(y.sessions.keys());y.currentSessionId=Y[0]||null}a$.debug(`[AcpServiceContext:${$}] Session destroyed`)}static destroyRegisteredSession($){if(!$)return;if(y.sessions.get($.sessionId)?.registration!==$)return;y.destroySession($.sessionId)}static getSessionServices($){return y.sessions.get($)||null}static setCurrentSession($){if(y.sessions.has($))y.currentSessionId=$}static getCurrentSessionId(){return y.currentSessionId}static isRemoteFileSystem($){return y.sessions.get($)?.remoteFileSystem??!1}static getRemoteSurfaceOwnerSnapshot($,Z){let J;try{J=I6(Z)}catch{return{connection:"offline"}}let Y=y.remoteSurfaceOwners.get(e9($,J.exactIdentity));if(!Y||Y.exactIdentity!==J.exactIdentity||y.sessions.get($)!==Y.services||Y.services.connection.signal.aborted)return{connection:"offline"};return{connection:"online",generation:Y.generation,readText:Y.readText,writeText:Y.writeText,terminal:Y.terminal}}initialize($,Z,J,Y){y.initializeSession($,Z,J,Y||C())}reset(){if(y.currentSessionId)y.destroySession(y.currentSessionId)}isAcpMode(){return y.currentSessionId!==null}getFileSystemService($){if($!==void 0)return y.sessions.get($)?.fileSystemService??new $3;let Z=$??y.currentSessionId;if(Z){let J=y.sessions.get(Z);if(J)return J.fileSystemService}return new h2}getTerminalService($){let Z=$??y.currentSessionId;if(Z){let J=y.sessions.get(Z);if(J)return J.terminalService;if($)return new h8}return new x6}getConnection(){if(y.currentSessionId){let $=y.sessions.get(y.currentSessionId);if($)return $.connection}return null}getSessionId(){return y.currentSessionId}getClientCapabilities(){if(y.currentSessionId){let $=y.sessions.get(y.currentSessionId);if($)return $.clientCapabilities}return null}async sendToolUpdate($,Z,J,Y,Q){let X=y.currentSessionId;if(!X)return;let W=y.sessions.get(X);if(!W)return;if(!W.sendUpdate)return;try{await W.sendUpdate({sessionUpdate:"tool_call",toolCallId:$,status:Z,title:J,content:Y||[],kind:Q||"other"})}catch(V){a$.warn("[AcpServiceContext] Failed to send tool update:",V)}}}function w$($){return y.getInstance().getFileSystemService($)}function J3($){return y.getInstance().getTerminalService($)}function H0($){return $?y.getSessionServices($)!==null:y.getInstance().isAcpMode()}function _$($){let Z=$??y.getCurrentSessionId();return Z?y.isRemoteFileSystem(Z):!1}function s$($,Z,J){if(J==="local")return!1;if(J==="acp-remote"||Z==="acp-remote"){let Y=$??y.getCurrentSessionId();return Y===null||!y.isRemoteFileSystem(Y)}return $!==void 0&&y.getSessionServices($)===null}import{createHash as YU,randomUUID as QU}from"node:crypto";var mV=["BrowserNavigate","BrowserSnapshot","BrowserInteract","BrowserWait","BrowserInspect","BrowserPage"];function g8($){return mV.includes($)}class f extends Error{code;details;constructor($,Z,J={}){super(Z);this.code=$;this.details=J;this.name="BrowserRuntimeError"}}class u8{maxPending;queue=[];closeController=new AbortController;idleWaiters=new Set;active=!1;closed=!1;constructor($=Y3){this.maxPending=$;if(!Number.isSafeInteger($)||$<=0)throw Error("Browser operation pending limit must be a positive integer")}run($,Z){if(this.closed)return Promise.reject(new f("browser_disposed","Browser Session Runtime is closed"));if(Z?.aborted)return Promise.reject(Z.reason??Error("Browser operation aborted"));if(this.queue.length>=this.maxPending)return Promise.reject(new f("browser_busy","Browser operation queue is full",{retryable:!0}));return new Promise((J,Y)=>{let Q={run:$,resolve:J,reject:Y,signal:Z};if(Z)Q.abortListener=()=>{let X=this.queue.indexOf(Q);if(X<0)return;this.queue.splice(X,1),Y(Z.reason??Error("Browser operation aborted"))},Z.addEventListener("abort",Q.abortListener,{once:!0});this.queue.push(Q),this.drain()})}close(){if(!this.closed){this.closed=!0,this.closeController.abort(new f("browser_disposed","Browser Session Runtime is closed"));for(let $ of this.queue.splice(0)){if($.signal&&$.abortListener)$.signal.removeEventListener("abort",$.abortListener);$.reject(new f("browser_disposed","Browser Session Runtime is closed"))}}if(!this.active)return Promise.resolve();return new Promise(($)=>this.idleWaiters.add($))}stats(){return{active:this.active,pending:this.queue.length,closed:this.closed}}drain(){if(this.active||this.closed)return;let $=this.queue.shift();if(!$)return;if($.signal&&$.abortListener)$.signal.removeEventListener("abort",$.abortListener);this.active=!0;let Z=$.signal?AbortSignal.any([$.signal,this.closeController.signal]):this.closeController.signal;Promise.resolve().then(()=>$.run(Z)).then($.resolve,$.reject).finally(()=>{if(this.active=!1,this.closed){for(let J of this.idleWaiters)J();this.idleWaiters.clear()}this.drain()})}}import{randomUUID as cV}from"node:crypto";import{Mutex as pV}from"async-mutex";var lV={viewport:{width:1440,height:900},deviceScaleFactor:1,locale:"en-US",timezoneId:"UTC",acceptDownloads:!1};async function iV(){let{chromium:$}=await import("playwright");return{launch:(Z)=>$.launch(Z)}}class V3{mutex=new pV;leases=new Map;maxContexts;contextOptions;environment;adapter;browser;launchPromise;generation=0;disposed=!1;disconnectListener;constructor($={}){if(this.adapter=$.adapter,this.contextOptions=$.contextOptions??lV,this.environment=$.environment??process.env,this.maxContexts=$.maxContexts??X3,!Number.isSafeInteger(this.maxContexts)||this.maxContexts<=0)throw Error("Browser context limit must be a positive integer")}async acquire($){return this.mutex.runExclusive(async()=>{if(this.disposed)throw new f("browser_disposed","Browser process pool is closed");if(this.leases.size>=this.maxContexts)throw new f("browser_capacity",`Browser context capacity is full (max ${this.maxContexts})`,{retryable:!0});let Z=await this.ensureBrowser(),J=this.generation,Y;try{Y=await Z.newContext(this.contextOptions)}catch(W){if(!Z.isConnected()||Z!==this.browser)throw new f("browser_disconnected","Chromium disconnected while creating a Session context",{retryable:!0});if(this.leases.size===0&&Z===this.browser)this.detachDisconnectListener(Z),this.browser=void 0,this.launchPromise=void 0,await Z.close().catch(()=>{return});throw W}if(this.disposed||Z!==this.browser||J!==this.generation)throw await Y.close().catch(()=>{return}),new f(this.disposed?"browser_disposed":"browser_disconnected",this.disposed?"Browser process pool is closed":"Chromium disconnected while creating a Session context",{retryable:!this.disposed});let Q=cV();this.leases.set(Q,{context:Y,generation:J,onDisconnected:$});let X=!1;return{context:Y,generation:J,release:async()=>{if(X)return;X=!0,await this.release(Q)}}})}stats(){return{generation:this.generation,contexts:this.leases.size,launching:this.launchPromise!==void 0&&this.browser===void 0,running:this.browser?.isConnected()===!0,disposed:this.disposed}}async dispose(){let $=await this.mutex.runExclusive(async()=>{if(this.disposed)return;this.disposed=!0;let Z=this.browser,J=[...this.leases.values()].map((Y)=>Y.context);return this.leases.clear(),this.detachDisconnectListener(Z),this.browser=void 0,this.launchPromise=void 0,this.generation++,{browser:Z,contexts:J}});if(!$)return;await Promise.allSettled($.contexts.map((Z)=>Z.close())),await $.browser?.close().catch(()=>{return})}async ensureBrowser(){if(this.browser?.isConnected())return this.browser;if(!this.launchPromise)this.launchPromise=this.launch();try{return await this.launchPromise}finally{this.launchPromise=void 0}}async launch(){let $=this.adapter??await iV();this.adapter=$;let Z;try{Z=await $.launch({headless:!0,chromiumSandbox:!0,env:W3(this.environment)})}catch{throw new f("browser_not_installed",`Chromium is unavailable or failed to launch.
122
122
  Install with: blade browser install`)}if(this.disposed)throw await Z.close().catch(()=>{return}),new f("browser_disposed","Browser process pool is closed");this.generation++,this.browser=Z;let J=this.generation,Y=()=>this.handleDisconnected(Z,J);return this.disconnectListener=Y,Z.on("disconnected",Y),Z}handleDisconnected($,Z){if($!==this.browser||Z!==this.generation)return;this.detachDisconnectListener($),this.browser=void 0,this.launchPromise=void 0,this.generation++;let J=[...this.leases.values()];this.leases.clear();for(let Y of J)queueMicrotask(Y.onDisconnected)}async release($){let Z=await this.mutex.runExclusive(async()=>{let J=this.leases.get($);if(!J)return;this.leases.delete($);let Y=this.browser,Q=this.leases.size===0&&Y!==void 0;if(Q)this.detachDisconnectListener(Y),this.browser=void 0,this.launchPromise=void 0;return{context:J.context,browser:Q?Y:void 0}});if(!Z)return;await Z.context.close().catch(()=>{return}),await Z.browser?.close().catch(()=>{return})}detachDisconnectListener($){if($&&this.disconnectListener)$.off("disconnected",this.disconnectListener);this.disconnectListener=void 0}}var Q3;function U3(){return Q3??=new V3,Q3}import{isIP as B3}from"node:net";var rV={"http:":"80","https:":"443"},nV=/password|passwd|passcode|one[-_ ]?time|otp|api[-_ ]?key|secret|token|credential|cvv|cvc/i,aV=new Set(["current-password","new-password","one-time-code","cc-number","cc-csc"]);function C0($){return Buffer.byteLength($,"utf8")}function G3($,Z,J,Y={}){if(!Y.allowEmpty&&$.length===0||C0($)>Z)throw new f("browser_unsupported",`${J} is empty or exceeds the supported size`)}function o$($,Z){let J=Buffer.from($);if(J.length<=Z)return $;let Y=J.subarray(0,Z).toString("utf8");while(Buffer.byteLength(Y)>Z)Y=Y.slice(0,-1);return Y.replace(/\uFFFD$/,"")}function T0($,Z){let J=[...$].filter((Y)=>{let Q=Y.codePointAt(0)??0;return(Q===9||Q===10||Q===13||Q>=32)&&Q!==127}).join("");return o$(J,Z)}function sV($){let Z=$.toLowerCase();return Z.includes(":")&&!Z.startsWith("[")?`[${Z}]`:Z}function d8($){if($.protocol!=="http:"&&$.protocol!=="https:")return"null";let Z=$.port||rV[$.protocol],J=`${$.protocol}//${sV($.hostname)}:${Z}`;if(C0(J)>m2)throw new f("browser_unsupported","Browser origin exceeds the supported size");return J}function K3($){if(B3($)!==4)return;return $.split(".").map(Number)}function H3($){let[Z=0,J=0]=$;return Z===0||Z===10||Z===127||Z===100&&J>=64&&J<=127||Z===169&&J===254||Z===172&&J>=16&&J<=31||Z===192&&J===168}function oV($){return $.replace(/^\[|\]$/g,"").toLowerCase()}function tV($){let Z=/^(?:::ffff:|0:0:0:0:0:ffff:)(.+)$/u.exec($);if(!Z?.[1])return;let J=K3(Z[1]);if(J)return J;let Y=Z[1].split(":");if(Y.length!==2||Y.some((W)=>!/^[0-9a-f]{1,4}$/u.test(W)))return;let Q=Number.parseInt(Y[0],16),X=Number.parseInt(Y[1],16);return[Q>>>8,Q&255,X>>>8,X&255]}function h6($){let Z=$.replace(/\.$/,"").toLowerCase();if(Z==="localhost"||Z.endsWith(".localhost"))return"loopback";let J=K3(Z);if(J){if(J[0]===127)return"loopback";return H3(J)?"private-network":"public"}let Y=oV(Z);if(B3(Y)===6){let Q=tV(Y);if(Q){if(Q[0]===127)return"loopback";return H3(Q)?"private-network":"public"}if(Y==="::1")return"loopback";if(Y.startsWith("fc")||Y.startsWith("fd")||/^fe[89ab]/.test(Y))return"private-network"}return"public"}function r0($){G3($,d2,"Browser URL");let Z;try{Z=new URL($)}catch{throw new f("browser_unsupported","Browser URL is invalid")}if(Z.protocol!=="http:"&&Z.protocol!=="https:")throw new f("browser_unsupported","Browser navigation only supports HTTP(S) URLs");if(Z.username||Z.password)throw new f("browser_unsupported","Browser URLs cannot contain credentials");return Z.hash="",{url:Z,href:Z.href,origin:d8(Z),classification:h6(Z.hostname)}}function W$($){G3($,m2,"Browser origin");let Z;try{Z=new URL($)}catch{throw new f("browser_unsupported","Browser origin is invalid")}if(Z.protocol!=="http:"&&Z.protocol!=="https:"||Z.username||Z.password||Z.pathname!=="/"||Z.search||Z.hash)throw new f("browser_unsupported","Browser origin is invalid");let J=d8(Z);if(J!==$.toLowerCase())throw new f("browser_unsupported",`Browser origin must use canonical form: ${J}`);return J}function t$($){if($==="about:blank")return $;try{let Z=new URL($);Z.hash="";for(let J of new Set(Z.searchParams.keys())){let Y=Z.searchParams.getAll(J).length;Z.searchParams.delete(J);for(let Q=0;Q<Y;Q++)Z.searchParams.append(J,"[redacted]")}return o$(Z.href,z3)}catch{return"[invalid-url]"}}function n0($){if($==="about:blank")return null;try{let Z=new URL($);return Z.protocol==="http:"||Z.protocol==="https:"?d8(Z):null}catch{return null}}function eV($){return $.normalize("NFKC").replace(/\s+/gu," ").trim().toLowerCase()}function D3($){if($.type?.toLowerCase()==="password")return!0;if($.accessibleNameExceededLimit||$.referencedAccessibleNameUnavailable)return!0;if(($.autocomplete?.toLowerCase().trim().split(/\s+/).filter(Boolean)??[]).some((J)=>aV.has(J)))return!0;for(let J of[$.name,$.id,$.ariaLabel,$.accessibleName]){if(!J)continue;if(C0(J)>c2)return!0;if(nV.test(eV(J)))return!0}return!1}import{randomUUID as _3}from"node:crypto";var q3=/\[ref=([a-z][a-z0-9]*)\]/g,$U=/\s+\[box=[^\]]*\]/g,m8=`
123
123
  ... (browser snapshot truncated)`;function ZU($,Z){let J=$.replace(`[ref=${Z}]`,"").replace($U,"").trim().replace(/\s+/g," ");return{value:T0(J,c2),exceededLimit:Buffer.byteLength(J)>c2}}function w3($){let Z=new Map;for(let J of $.split(`
124
124
  `)){q3.lastIndex=0;for(let Y of J.matchAll(q3)){let Q=Y[1];if(Z.has(Q))throw new f("browser_snapshot_stale",`Browser snapshot contains duplicate ref ${Q}`);Z.set(Q,ZU(J,Q))}}return Z}function JU($,Z=p2){let J=T0($,Number.MAX_SAFE_INTEGER),Y=Math.min(p2,Math.max(0,Z));if(Buffer.byteLength(J)<=Y)return{snapshot:J,truncated:!1};let Q=Buffer.byteLength(m8);if(Y<=Q)return{snapshot:o$(m8,Y),truncated:!0};let X=Y-Q,W=[],V=0;for(let H of J.split(`
@@ -846,7 +846,7 @@ ${Q}
846
846
  **Hook Context:**
847
847
  `+H.additionalContext}if(eB(H.modifiedOutput))Object.assign(J,H.modifiedOutput);if(H.warning)console.warn(`[PostToolUseHook Warning] ${H.warning}`)}catch(U){console.error("[ToolExecutionHooks] Error executing post-tool hooks:",U)}}function eB($){return typeof $==="object"&&$!==null&&!Array.isArray($)}var AY=["EBUSY","EAGAIN","EMFILE","ENFILE"],$G=2,MY=200;async function TY($,Z){let J=Date.now(),Y,Q=$.isRetrySafe?$G:0;for(let X=0;X<=Q;X++)try{let W=await $.execute(Z.signal??new AbortController().signal,Z.onProgress,Z);if(!W.success&&X<Q&&CY(W.error)){await jZ(MY*(X+1),Z.signal,{throwOnAbort:!0});continue}if(W.metadata??={},W.metadata.duration=Date.now()-J,X>0)W.metadata.retriedAttempts=X;return W}catch(W){if(Y=W instanceof Error?W:Error(String(W)),X>=Q||!CY(Y))break;await jZ(MY*(X+1),Z.signal,{throwOnAbort:!0})}throw Y??Error("Tool execution failed")}function CY($){let Z=[{candidate:$,depth:0}],J=new Set;while(Z.length>0){let{candidate:Y,depth:Q}=Z.shift();if(!Y||typeof Y!=="object"||J.has(Y))continue;J.add(Y);let X=Y,W=typeof X.code==="string"?X.code:void 0,V=typeof X.message==="string"?X.message:void 0;if(W!==void 0&&AY.includes(W)||V!==void 0&&AY.some((U)=>V.includes(U)))return!0;if(Q<4)Z.push({candidate:X.details,depth:Q+1},{candidate:X.cause,depth:Q+1})}return!1}function T4($,Z,J){if(!$.llmContent)$.llmContent="Execution completed";return $.metadata??={},$.metadata.executionId=Z,$.metadata.toolName=J,$.metadata.timestamp=Date.now(),$}class W6 extends ZG{registry;executionHistory=[];maxHistorySize;scheduler;toolWhitelist;toolBlacklist;permissionResolver;approvalController;concurrencyGate=new NZ;contextDefaults;remoteContextDefaults;preToolUseHookRunner;trustedRuntimePolicy;autoVerifyRuntime;lspManager;onDispose;workspaceToolPolicy;ownerId=`tool-executor-${RY()}`;disposed=!1;constructor($,Z={}){super();this.registry=$;this.maxHistorySize=Z.maxHistorySize??1000,this.autoVerifyRuntime=Z.autoVerifyRuntime,this.lspManager=Z.lspManager,this.onDispose=Z.onDispose,this.workspaceToolPolicy=Z.workspaceToolPolicy?K4(Z.workspaceToolPolicy):void 0,this.contextDefaults=JG(Z.contextDefaults),this.trustedRuntimePolicy=lJ(Z.workspaceToolPolicy),this.remoteContextDefaults=this.workspaceToolPolicy?.kind==="acp-remote"?YG(this.contextDefaults):void 0,this.preToolUseHookRunner=jY,this.toolWhitelist=Z.toolWhitelist?.length?new Set(Z.toolWhitelist):null,this.toolBlacklist=Z.toolBlacklist?.length?new Set(Z.toolBlacklist):null,this.scheduler=Z.scheduler??(Z.concurrencyLimits?new A$(Z.concurrencyLimits):A$.getInstance());let J=Z.approvalStore??new X6;this.permissionResolver=new LZ(Z.permissionConfig??{allow:[],ask:[],deny:[]},J,Z.permissionMode??"default"),this.approvalController=new OZ(J,this.permissionResolver.getPermissionChecker())}async execute($,Z,J){if(this.disposed)return this.createDisposedResult();let Y=Date.now(),Q=`exec_${RY()}`,X=this.remoteContextDefaults,W=X!==void 0,V=this.trustedRuntimePolicy&&this.workspaceToolPolicy?.kind==="local",U=pJ({...this.contextDefaults,...J,sessionId:W?X.sessionId:J.sessionId??this.contextDefaults.sessionId??this.ownerId,workspaceRoot:W?X.workspaceRoot:J.workspaceRoot??this.contextDefaults.workspaceRoot,executionRoot:W?X.executionRoot:J.executionRoot??this.contextDefaults.executionRoot,workspaceKind:W?"acp-remote":V?"local":J.workspaceKind??this.contextDefaults.workspaceKind,worktreeIsolationRequired:W?!1:J.worktreeIsolationRequired??this.contextDefaults.worktreeIsolationRequired,worktreeActive:W?!1:J.worktreeActive??this.contextDefaults.worktreeActive,environment:W?X.environment:{...this.contextDefaults.environment,...J.environment}},this.trustedRuntimePolicy?this.workspaceToolPolicy:void 0);return this.emit("executionStarted",{executionId:Q,toolName:$,params:Z,context:U,timestamp:Y}),this.executeFlow($,Z,U,Q,Y)}async executeFlow($,Z,J,Y,Q){let X=Z;try{let W=await this.runTool($,Z,J,Y,(V)=>{X=V});return this.completeExecution(Y,$,X,J,W,Q),W}catch(W){let V=this.projectAdmissionFailure($,W);if(V){let U=T4(V,Y,$);return this.completeExecution(Y,$,X,J,U,Q),U}return this.failExecution(Y,$,X,J,W,Q)}}async runTool($,Z,J,Y,Q){if(J.signal?.aborted)return o0(!0);let X=this.registry.get($);if(!X)return G0(`Tool "${$}" not found`,{errorType:"validation_error"});let W=this.registry.getBuiltinTools().includes(X);if(this.workspaceToolPolicy){if(W){let H=D5(this.workspaceToolPolicy,$);if(!H.allowed)return iJ(H.reason)}}let V=NY(X,Z,this.toolWhitelist,this.toolBlacklist);if("success"in V)return V;Q(V.params);let U=this.validateRemoteDeclaredPaths($,X,V.invocation,W);if(U)return U;return this.concurrencyGate.run(X.parallelism==="shared"||X.parallelism===void 0&&X.isConcurrencySafe,async()=>{if(J.signal?.aborted)return o0(!0);let{params:H,invocation:z}=V,B=await bZ(X,H,J,z);if(B)return B;let G=this.permissionResolver.resolveRulePermission(X,z,H,J),D=await this.preToolUseHookRunner(X,H,z,J,G.decision);if(D.rejection)return D.rejection;z=D.invocation;let w=z.params;if(typeof w!=="object"||w===null||Array.isArray(w))return G0("Hook modified parameters must be an object",{errorType:"validation_error"});if(H=w,Q(H),D.inputModified){let M=this.validateRemoteDeclaredPaths($,X,z,W);if(M)return M;let k=await bZ(X,H,J,z);if(k)return k;G=this.permissionResolver.resolveRulePermission(X,z,H,J)}let q=_Y(G.decision,D.decision);if(q.behavior==="deny")return G0(q.reason||`Tool invocation denied by ${q.source}${q.matchedRule?` (${q.matchedRule})`:""}`,{errorType:"permission_denied"});let F=await this.approvalController.confirmIfNeeded(X,z,H,q,G.signature,J);if(F)return F;if(J.signal?.aborted)return o0(!0);let L=!1,_=()=>{if(J.signal?.aborted)return Promise.resolve(o0(!0));return L=!0,TY(z,J)},O=H.file_path??H.notebook_path,b=this.workspaceToolPolicy?.kind==="acp-remote"||_$(J.sessionId),N=X.kind==="readonly"&&X.name==="Read"&&b,E=(!X.isConcurrencySafe||N)&&O?b?()=>{let M=w$(J.sessionId);if(!(M instanceof v0))throw Error("ACP remote filesystem service is unavailable for file lock routing");return b0.getInstance().acquireOpaqueLock(M.createOpaqueLockKey(String(O)),_)}:()=>b0.getInstance().acquireLock(String(O),_):_,j=await this.scheduler.schedule({ownerId:this.ownerId,sessionId:J.sessionId??this.ownerId,kind:X.kind,signal:J.signal,onAbort:()=>o0(!0),onQueued:(M)=>{J.onProgressUpdate?.({message:"Waiting for tool execution capacity",admission:M})}},E);if(J.signal?.aborted&&!R4(j))return o0(!L);if(j.metadata?.abortedBeforeLaunch===!0)return j;if(await EY(X,H,j,J,D.toolUseId),J.signal?.aborted&&!R4(j))return o0(!1);if(await this.lspManager?.afterToolUse(X.name,H,j,J),J.signal?.aborted&&!R4(j))return o0(!1);if(await this.autoVerifyRuntime?.verify(X.name,H,J,j),J.signal?.aborted&&!R4(j))return o0(!1);return T4(j,Y,X.name)},J.signal,()=>o0(!0))}completeExecution($,Z,J,Y,Q,X){let W=Date.now();this.addToHistory({executionId:$,toolName:Z,params:J,result:Q,startTime:X,endTime:W,context:Y}),this.emit("executionCompleted",{executionId:$,toolName:Z,result:Q,duration:W-X,timestamp:W})}async failExecution($,Z,J,Y,Q,X){let W=Q instanceof Error?Q:Error(String(Q)),V=Date.now(),U=W.message.includes("timeout")||W.name==="TimeoutError",H={success:!1,llmContent:`Tool execution failed: ${W.message}`,error:{type:U?"timeout_error":"execution_error",message:W.message}};if(Y.workspaceKind==="acp-remote")return this.addToHistory({executionId:$,toolName:Z,params:J,result:H,startTime:X,endTime:V,context:Y}),T4(H,$,Z);try{let z=await x0.getInstance().executePostToolUseFailureHooks(Z,`tool_use_${$}`,J,W.message,{projectDir:Y.workspaceRoot||C(),sessionId:Y.sessionId||"unknown",permissionMode:Y.permissionMode||"default",isInterrupt:!1,isTimeout:U,abortSignal:Y.signal});if(z.additionalContext)H={...H,llmContent:`${H.llmContent}
848
848
 
849
- ${z.additionalContext}`};if(z.warning)console.warn(`[ToolExecutor] PostToolUseFailure hook warning: ${z.warning}`)}catch(z){console.warn("[ToolExecutor] PostToolUseFailure hook execution failed:",z)}return this.addToHistory({executionId:$,toolName:Z,params:J,result:H,startTime:X,endTime:V,context:Y}),this.emit("executionFailed",{executionId:$,toolName:Z,error:W,duration:V-X,timestamp:V}),H}async executeAll($){return Promise.all($.map((Z)=>this.execute(Z.toolName,Z.params,Z.context)))}async executeParallel($,Z=5){let J=Z>0?Z:Number.POSITIVE_INFINITY;if(!Number.isFinite(J)||J>=$.length)return this.executeAll($);let Y=Array($.length),Q=0,X=async()=>{while(Q<$.length){let W=Q++,V=$[W];Y[W]=await this.execute(V.toolName,V.params,V.context)}};return await Promise.all(Array.from({length:Math.min(J,$.length)},()=>X())),Y}getSchedulerStats(){return this.scheduler.getStats()}getAdmissionStats(){return this.scheduler.getAdmissionStats()}getExecutionHistory($){return $?this.executionHistory.slice(-$):[...this.executionHistory]}clearHistory(){this.executionHistory.length=0,this.emit("historyClear",{timestamp:Date.now()})}getStats(){let $={totalExecutions:this.executionHistory.length,successfulExecutions:0,failedExecutions:0,averageDuration:0,toolUsage:new Map,recentExecutions:this.executionHistory.slice(-10)},Z=0;for(let J of this.executionHistory){if(J.result.success)$.successfulExecutions++;else $.failedExecutions++;Z+=J.endTime-J.startTime,$.toolUsage.set(J.toolName,($.toolUsage.get(J.toolName)||0)+1)}return $.averageDuration=$.totalExecutions>0?Z/$.totalExecutions:0,$}getRegistry(){return this.registry}dispose(){if(this.disposed)return;this.disposed=!0,this.concurrencyGate.close("tool-executor-disposed"),this.scheduler.cancelOwner(this.ownerId),this.onDispose?.(),this.removeAllListeners()}createDisposedResult(){let $=o0(!0);return{...$,metadata:{...$.metadata,executorDisposed:!0}}}projectAdmissionFailure($,Z){if(Z instanceof d$&&Z.reason!=="closed"){let J=this.registry.get($)?.kind??Z.kind;return{success:!1,llmContent:"Tool execution capacity is busy. Retry this tool in a later turn.",error:{type:"resource_exhausted",code:"tool_busy",message:Z.message},metadata:{summary:"Tool execution capacity is busy",tool_admission:{code:"tool_busy",reason:Z.reason,scope:Z.scope,retryable:Z.retryable,kind:J,limit:Z.limit}}}}if(Z instanceof M4){let J=this.registry.get($)?.kind??"execute";return{success:!1,llmContent:"Tool execution capacity is busy. Retry this tool in a later turn.",error:{type:"resource_exhausted",code:"tool_busy",message:Z.message},metadata:{summary:"Tool execution queue is full",tool_admission:{code:"tool_busy",reason:"queue_full",scope:"session",retryable:!0,kind:J,limit:Z.limit}}}}if(Z instanceof d$||Z instanceof C4)return this.createDisposedResult();return}addToHistory($){if(this.executionHistory.push($),this.executionHistory.length>this.maxHistorySize)this.executionHistory.splice(0,this.executionHistory.length-this.maxHistorySize)}validateRemoteDeclaredPaths($,Z,J,Y){if(this.workspaceToolPolicy?.kind!=="acp-remote")return;let Q=J.params;if(typeof Q!=="object"||Q===null||Array.isArray(Q))return;let X=Q,W=new Set;for(let U of[X.file_path,X.notebook_path])if(typeof U==="string")W.add(U);let V=Y&&$==="ApplyPatch";if(!V&&Z.kind==="write"&&typeof X.path==="string")W.add(X.path);if(!V){let U;try{U=J.getAffectedPaths()}catch{return h$({mutation:Z.kind!=="readonly"})}for(let H of U)if(typeof H==="string")W.add(H)}try{for(let U of W)X$(U,this.workspaceToolPolicy.pathStyle);return}catch(U){if(!(U instanceof N$))throw U;return h$({mutation:Z.kind!=="readonly"})}}}function JG($){let Z=$?.environment?Object.freeze({...$.environment}):void 0;return Object.freeze({...$,...Z?{environment:Z}:{}})}function YG($){if(!$.sessionId||!$.workspaceRoot||!$.executionRoot||$.workspaceKind!=="acp-remote")throw Error("ACP remote ToolExecutor requires runtime-owned context defaults");return $}function R4($){if(!$.metadata||typeof $.metadata!=="object")return!1;return Object.hasOwn($.metadata,"sideEffectsUncertain")}import{EventEmitter as QG}from"events";var f4=new Set(["Read","Edit","Write","ApplyPatch","Glob","Grep","Bash","WriteStdin","Task","TaskOutput","TaskCreate","TaskGet","TaskUpdate","TaskList","TeamCreate","TeamStatus","TeamTaskClaim","SendMessage","TeamInbox","TeamDelete","AskUserQuestion","Skill","SlashCommand","ToolSearch","ReadPromptArtifact","EnterPlanMode","ExitPlanMode","EnterWorktree","ExitWorktree"]);class EZ{loadedTools=new Set(f4);deferredTools=new Set;register($){if(f4.has($))this.loadedTools.add($);else this.deferredTools.add($)}unregister($){if(f4.has($))return;this.loadedTools.delete($),this.deferredTools.delete($)}syncDynamicTools($,Z){let J=new Set(Z);for(let Y of $)if(!J.has(Y))this.unregister(Y);for(let Y of Z)if(!this.loadedTools.has(Y)&&!this.deferredTools.has(Y))this.register(Y)}markLoaded($){this.loadedTools.add($),this.deferredTools.delete($)}isLoaded($){return this.loadedTools.has($)}filterDeclarations($,Z){return $.filter((J)=>this.isLoaded(J.name)).map((J)=>J.getFunctionDeclaration())}getDeferredToolNames(){return Array.from(this.deferredTools).sort(($,Z)=>$<Z?-1:$>Z?1:0)}getDeferredToolsListing(){let $=this.getDeferredToolNames();if($.length===0)return"";return["<available-deferred-tools>",...$,"</available-deferred-tools>"].join(`
849
+ ${z.additionalContext}`};if(z.warning)console.warn(`[ToolExecutor] PostToolUseFailure hook warning: ${z.warning}`)}catch(z){console.warn("[ToolExecutor] PostToolUseFailure hook execution failed:",z)}return this.addToHistory({executionId:$,toolName:Z,params:J,result:H,startTime:X,endTime:V,context:Y}),this.emit("executionFailed",{executionId:$,toolName:Z,error:W,duration:V-X,timestamp:V}),H}async executeAll($){return Promise.all($.map((Z)=>this.execute(Z.toolName,Z.params,Z.context)))}async executeParallel($,Z=5){let J=Z>0?Z:Number.POSITIVE_INFINITY;if(!Number.isFinite(J)||J>=$.length)return this.executeAll($);let Y=Array($.length),Q=0,X=async()=>{while(Q<$.length){let W=Q++,V=$[W];Y[W]=await this.execute(V.toolName,V.params,V.context)}};return await Promise.all(Array.from({length:Math.min(J,$.length)},()=>X())),Y}getSchedulerStats(){return this.scheduler.getStats()}getAdmissionStats(){return this.scheduler.getAdmissionStats()}getExecutionHistory($){return $?this.executionHistory.slice(-$):[...this.executionHistory]}clearHistory(){this.executionHistory.length=0,this.emit("historyClear",{timestamp:Date.now()})}getStats(){let $={totalExecutions:this.executionHistory.length,successfulExecutions:0,failedExecutions:0,averageDuration:0,toolUsage:new Map,recentExecutions:this.executionHistory.slice(-10)},Z=0;for(let J of this.executionHistory){if(J.result.success)$.successfulExecutions++;else $.failedExecutions++;Z+=J.endTime-J.startTime,$.toolUsage.set(J.toolName,($.toolUsage.get(J.toolName)||0)+1)}return $.averageDuration=$.totalExecutions>0?Z/$.totalExecutions:0,$}getRegistry(){return this.registry}dispose(){if(this.disposed)return;this.disposed=!0,this.concurrencyGate.close("tool-executor-disposed"),this.scheduler.cancelOwner(this.ownerId),this.onDispose?.(),this.removeAllListeners()}createDisposedResult(){let $=o0(!0);return{...$,metadata:{...$.metadata,executorDisposed:!0}}}projectAdmissionFailure($,Z){if(Z instanceof d$&&Z.reason!=="closed"){let J=this.registry.get($)?.kind??Z.kind;return{success:!1,llmContent:"Tool execution capacity is busy. Retry this tool in a later turn.",error:{type:"resource_exhausted",code:"tool_busy",message:Z.message},metadata:{summary:"Tool execution capacity is busy",tool_admission:{code:"tool_busy",reason:Z.reason,scope:Z.scope,retryable:Z.retryable,kind:J,limit:Z.limit}}}}if(Z instanceof M4){let J=this.registry.get($)?.kind??"execute";return{success:!1,llmContent:"Tool execution capacity is busy. Retry this tool in a later turn.",error:{type:"resource_exhausted",code:"tool_busy",message:Z.message},metadata:{summary:"Tool execution queue is full",tool_admission:{code:"tool_busy",reason:"queue_full",scope:"session",retryable:!0,kind:J,limit:Z.limit}}}}if(Z instanceof d$||Z instanceof C4)return this.createDisposedResult();return}addToHistory($){if(this.executionHistory.push($),this.executionHistory.length>this.maxHistorySize)this.executionHistory.splice(0,this.executionHistory.length-this.maxHistorySize)}validateRemoteDeclaredPaths($,Z,J,Y){if(this.workspaceToolPolicy?.kind!=="acp-remote")return;let Q=J.params;if(typeof Q!=="object"||Q===null||Array.isArray(Q))return;let X=Q,W=new Set;for(let U of[X.file_path,X.notebook_path])if(typeof U==="string")W.add(U);let V=Y&&$==="ApplyPatch";if(!V&&Z.kind==="write"&&typeof X.path==="string")W.add(X.path);if(!V){let U;try{U=J.getAffectedPaths()}catch{return h$({mutation:Z.kind!=="readonly"})}for(let H of U)if(typeof H==="string")W.add(H)}try{for(let U of W)X$(U,this.workspaceToolPolicy.pathStyle);return}catch(U){if(!(U instanceof N$))throw U;return h$({mutation:Z.kind!=="readonly"})}}}function JG($){let Z=$?.environment?Object.freeze({...$.environment}):void 0;return Object.freeze({...$,...Z?{environment:Z}:{}})}function YG($){if(!$.sessionId||!$.workspaceRoot||!$.executionRoot||$.workspaceKind!=="acp-remote")throw Error("ACP remote ToolExecutor requires runtime-owned context defaults");return $}function R4($){if(!$.metadata||typeof $.metadata!=="object")return!1;return Object.hasOwn($.metadata,"sideEffectsUncertain")||$.success===!1&&Object.hasOwn($.metadata,"finalization_failed")&&$.metadata.finalization_failed===!0}import{EventEmitter as QG}from"events";var f4=new Set(["Read","Edit","Write","ApplyPatch","Glob","Grep","Bash","WriteStdin","Task","TaskOutput","TaskCreate","TaskGet","TaskUpdate","TaskList","TeamCreate","TeamStatus","TeamTaskClaim","SendMessage","TeamInbox","TeamDelete","AskUserQuestion","Skill","SlashCommand","ToolSearch","ReadPromptArtifact","EnterPlanMode","ExitPlanMode","EnterWorktree","ExitWorktree"]);class EZ{loadedTools=new Set(f4);deferredTools=new Set;register($){if(f4.has($))this.loadedTools.add($);else this.deferredTools.add($)}unregister($){if(f4.has($))return;this.loadedTools.delete($),this.deferredTools.delete($)}syncDynamicTools($,Z){let J=new Set(Z);for(let Y of $)if(!J.has(Y))this.unregister(Y);for(let Y of Z)if(!this.loadedTools.has(Y)&&!this.deferredTools.has(Y))this.register(Y)}markLoaded($){this.loadedTools.add($),this.deferredTools.delete($)}isLoaded($){return this.loadedTools.has($)}filterDeclarations($,Z){return $.filter((J)=>this.isLoaded(J.name)).map((J)=>J.getFunctionDeclaration())}getDeferredToolNames(){return Array.from(this.deferredTools).sort(($,Z)=>$<Z?-1:$>Z?1:0)}getDeferredToolsListing(){let $=this.getDeferredToolNames();if($.length===0)return"";return["<available-deferred-tools>",...$,"</available-deferred-tools>"].join(`
850
850
  `)}reset(){this.loadedTools=new Set(f4),this.deferredTools.clear()}}class z1 extends QG{tools=new Map;mcpTools=new Map;categories=new Map;tags=new Map;_deferredManager=new EZ;pendingMcpCatalogChanges=[];pendingMcpContentChanges=[];pendingMcpResourceUpdates=[];pendingMcpConnectionChanges=[];pendingMcpLogs=[];pendingMcpInstructionChanges=[];pendingMcpTaskChanges=[];mcpCatalogBarrier=async()=>{return};constructor(){super()}get deferredToolManager(){return this._deferredManager}setMcpCatalogBarrier($){this.mcpCatalogBarrier=$}async waitForMcpCatalogIdle($){if($?.aborted)throw new DOMException("MCP catalog wait aborted","AbortError");let Z=this.mcpCatalogBarrier();if(!$)return Z;await new Promise((J,Y)=>{let Q=()=>{$.removeEventListener("abort",Q),Y(new DOMException("MCP catalog wait aborted","AbortError"))};if($.addEventListener("abort",Q,{once:!0}),$.aborted)Q();Z.then(()=>{$.removeEventListener("abort",Q),J()},(X)=>{$.removeEventListener("abort",Q),Y(X)})})}register($){if(this.tools.has($.name))throw Error(`工具 '${$.name}' 已注册`);this.tools.set($.name,$),this.updateIndexes($),this._deferredManager.register($.name),this.emit("toolRegistered",{type:"builtin",tool:$,timestamp:Date.now()})}registerAll($){let Z=[];for(let J of $)try{this.register(J)}catch(Y){Z.push(`${J.name}: ${Y.message}`)}if(Z.length>0)throw Error(`批量注册失败: ${Z.join(", ")}`)}unregister($){let Z=this.tools.get($)??this.mcpTools.get($);if(!Z)return!1;let J=this.tools.delete($)?"builtin":"mcp";return this.mcpTools.delete($),this.removeFromIndexes(Z),this._deferredManager.unregister($),this.emit("toolUnregistered",{type:J,toolName:$,timestamp:Date.now()}),!0}get($){return this.tools.get($)||this.mcpTools.get($)}has($){return this.tools.has($)||this.mcpTools.has($)}getAll(){return[...Array.from(this.tools.values()),...Array.from(this.mcpTools.values())]}getBuiltinTools(){return Array.from(this.tools.values())}getMcpTools(){return Array.from(this.mcpTools.values())}getByCategory($){let Z=this.categories.get($);if(!Z)return[];return Array.from(Z).map((J)=>this.get(J)).filter((J)=>J!==void 0)}getByTag($){let Z=this.tags.get($);if(!Z)return[];return Array.from(Z).map((J)=>this.get(J)).filter((J)=>J!==void 0)}search($){let Z=$.toLowerCase();return this.getAll().filter((J)=>{let Y=typeof J.description==="string"?J.description:J.description.short;return J.name.toLowerCase().includes(Z)||Y.toLowerCase().includes(Z)||J.displayName.toLowerCase().includes(Z)||J.category&&J.category.toLowerCase().includes(Z)||J.tags.some((Q)=>Q.toLowerCase().includes(Z))})}getFunctionDeclarations(){return this.getAll().map(($)=>$.getFunctionDeclaration())}getReadOnlyFunctionDeclarations(){return this._deferredManager.filterDeclarations(this.getReadOnlyTools())}getFunctionDeclarationsByMode($){if($==="plan")return this.getReadOnlyFunctionDeclarations();return this._deferredManager.filterDeclarations(this.getAll(),$)}getReadOnlyTools(){return this.getAll().filter(($)=>_2($.kind))}getCategories(){return Array.from(this.categories.keys())}getTags(){return Array.from(this.tags.keys())}getStats(){return{totalTools:this.tools.size+this.mcpTools.size,builtinTools:this.tools.size,mcpTools:this.mcpTools.size,categories:this.categories.size,tags:this.tags.size,toolsByCategory:Object.fromEntries(Array.from(this.categories.entries()).map(([$,Z])=>[$,Z.size]))}}getDeferredToolsListing(){return this._deferredManager.getDeferredToolsListing()}clone(){let $=new z1;$.setMcpCatalogBarrier(this.mcpCatalogBarrier);for(let Z of this.tools.values())$.register(Z);for(let Z of this.mcpTools.values())$.registerMcpTool(Z);return $}registerMcpTool($){if(this.tools.has($.name))throw Error(`MCP 工具 '${$.name}' 与内置工具冲突`);if(this.mcpTools.has($.name))this.removeFromIndexes(this.mcpTools.get($.name)),this.mcpTools.delete($.name);this.mcpTools.set($.name,$),this.updateIndexes($),this._deferredManager.register($.name),this.emit("toolRegistered",{type:"mcp",tool:$,timestamp:Date.now()})}replaceMcpTools($,Z){let J=new Map;for(let Q of $){if(J.has(Q.name))throw Error(`MCP catalog contains duplicate tool '${Q.name}'`);if(this.tools.has(Q.name))throw Error(`MCP tool '${Q.name}' conflicts with a builtin tool`);J.set(Q.name,Q)}let Y=[...this.mcpTools.keys()];for(let Q of this.mcpTools.values())this.removeFromIndexes(Q);this.mcpTools=J;for(let Q of J.values())this.updateIndexes(Q);if(this._deferredManager.syncDynamicTools(Y,[...J.keys()]),Z){if(this.pendingMcpCatalogChanges.push(structuredClone(Z)),this.pendingMcpCatalogChanges.length>32)this.pendingMcpCatalogChanges.shift()}this.emit("mcpCatalogReplaced",{toolCount:J.size,change:Z,timestamp:Date.now()})}drainMcpCatalogChanges(){let $=this.pendingMcpCatalogChanges;return this.pendingMcpCatalogChanges=[],$}queueMcpContentChange($){if(this.pendingMcpContentChanges.push(structuredClone($)),this.pendingMcpContentChanges.length>32)this.pendingMcpContentChanges.shift()}drainMcpContentChanges(){let $=this.pendingMcpContentChanges;return this.pendingMcpContentChanges=[],$}queueMcpResourceUpdated($){if(!this.pendingMcpResourceUpdates.some((J)=>J.serverName===$.serverName&&J.uri===$.uri))this.pendingMcpResourceUpdates.push(structuredClone($));if(this.pendingMcpResourceUpdates.length>32)this.pendingMcpResourceUpdates.shift()}drainMcpResourceUpdates(){let $=this.pendingMcpResourceUpdates;return this.pendingMcpResourceUpdates=[],$}queueMcpConnectionChange($){if(this.pendingMcpConnectionChanges.push(structuredClone($)),this.pendingMcpConnectionChanges.length>32)this.pendingMcpConnectionChanges.shift()}drainMcpConnectionChanges(){let $=this.pendingMcpConnectionChanges;return this.pendingMcpConnectionChanges=[],$}queueMcpLog($){if(this.pendingMcpLogs.push(structuredClone($)),this.pendingMcpLogs.length>64)this.pendingMcpLogs.shift()}drainMcpLogs(){let $=this.pendingMcpLogs;return this.pendingMcpLogs=[],$}queueMcpInstructionsChange($){if(this.pendingMcpInstructionChanges.push(structuredClone($)),this.pendingMcpInstructionChanges.length>32)this.pendingMcpInstructionChanges.shift()}drainMcpInstructionsChanges(){let $=this.pendingMcpInstructionChanges;return this.pendingMcpInstructionChanges=[],$}queueMcpTaskChange($){if(this.pendingMcpTaskChanges.push(structuredClone($)),this.pendingMcpTaskChanges.length>64)this.pendingMcpTaskChanges.shift()}drainMcpTaskChanges(){let $=this.pendingMcpTaskChanges;return this.pendingMcpTaskChanges=[],$}removeMcpTools($){let Z=0,J=fY($);for(let Y of this.mcpTools.keys())if(Y.startsWith(J)){let Q=this.mcpTools.get(Y);this.mcpTools.delete(Y),this.removeFromIndexes(Q),this._deferredManager.unregister(Y),Z++,this.emit("toolUnregistered",{type:"mcp",toolName:Y,serverName:$,timestamp:Date.now()})}return Z}updateIndexes($){if($.category){if(!this.categories.has($.category))this.categories.set($.category,new Set);this.categories.get($.category).add($.name)}for(let Z of $.tags){if(!this.tags.has(Z))this.tags.set(Z,new Set);this.tags.get(Z).add($.name)}}removeFromIndexes($){if($.category){let Z=this.categories.get($.category);if(Z){if(Z.delete($.name),Z.size===0)this.categories.delete($.category)}}for(let Z of $.tags){let J=this.tags.get(Z);if(J){if(J.delete($.name),J.size===0)this.tags.delete(Z)}}}}class V6{persistent;options;get persistentStore(){return this.persistent}constructor($={}){this.options={projectPath:$.projectPath||C(),...$.stateStorage?{stateStorage:$.stateStorage}:{},storage:{maxMemorySize:1000,persistentPath:"",cacheSize:100,compressionEnabled:!0,...$.storage},defaultFilter:{maxTokens:32000,maxMessages:50,timeWindow:86400000,...$.defaultFilter},compressionThreshold:$.compressionThreshold||6000,enableVectorSearch:$.enableVectorSearch||!1},this.persistent=new F2(this.options.projectPath,100,void 0,this.options.stateStorage)}async initialize(){await this.persistent.initialize()}async saveMessage($,Z,J,Y=null,Q,X,W){return this.persistent.saveMessage($,Z,J,Y,Q,X,W)}async saveToolUse($,Z,J,Y=null,Q,X){return this.persistent.saveToolUse($,Z,J,Y,Q,X)}async saveToolResult($,Z,J,Y,Q=null,X,W,V,U){return this.persistent.saveToolResult($,Z,J,Y,Q,X,W,V,U)}async saveCompaction($,Z,J,Y=null){return this.persistent.saveCompaction($,Z,J,Y)}async recordTokenBudgetHandoff($,Z){return this.persistent.recordTokenBudgetHandoff($,Z)}}class U6{chatService;contextManager;memoryAdapter;constructor($,Z,J,Y){this.chatService=$,this.contextManager=Z||new V6({projectPath:J||C(),...Y?{stateStorage:Y}:{}}),this.memoryAdapter=this.createMemoryAdapter()}createMemoryAdapter(){let $=[];return{getMessages:()=>[...$],addMessage:(Z)=>{$.push(Z)},clearContext:()=>{$.length=0},getContextSize:()=>$.length}}getContextManager(){return this.contextManager}getMemoryAdapter(){return this.memoryAdapter}async executeTask($){let Z=[{role:"user",content:$.prompt}],J=await this.chatService.chat(Z);return{taskId:$.id,content:J.content,metadata:{taskType:$.type}}}}class PY extends Error{constructor(){super("Active operation gate is closed");this.name="ActiveOperationGateClosedError"}}class H6{accepting=!0;leases=new Set;idleWaiters=new Set;shutdownPromise;enter($){if(!this.accepting)throw new PY;let Z={controller:new AbortController,externalSignal:$,released:!1};if($?.aborted)Z.controller.abort($.reason);else if($)Z.externalAbort=()=>Z.controller.abort($.reason),$.addEventListener("abort",Z.externalAbort,{once:!0});return this.leases.add(Z),{signal:Z.controller.signal,release:()=>this.release(Z)}}close($="active-operation-gate-closed"){if(!this.accepting)return;this.accepting=!1;for(let Z of this.leases)if(!Z.controller.signal.aborted)Z.controller.abort($);this.settleIdleWaiters()}waitForIdle(){if(this.leases.size===0)return Promise.resolve();return new Promise(($)=>{this.idleWaiters.add($),this.settleIdleWaiters()})}shutdown($){if(this.shutdownPromise)return this.shutdownPromise;return this.close($),this.shutdownPromise=this.waitForIdle(),this.shutdownPromise}stats(){return{accepting:this.accepting,active:this.leases.size}}release($){if($.released)return;if($.released=!0,$.externalSignal&&$.externalAbort)$.externalSignal.removeEventListener("abort",$.externalAbort);$.externalSignal=void 0,$.externalAbort=void 0,this.leases.delete($),this.settleIdleWaiters()}settleIdleWaiters(){if(this.leases.size>0)return;for(let $ of this.idleWaiters)$();this.idleWaiters.clear()}}class MZ extends Error{resource;limit;constructor($,Z){super($==="pending_count"?"Task admission pending-count capacity is full":"Task admission pending-byte capacity is full");this.resource=$;this.limit=Z;this.name="TaskAdmissionQueueFullError"}}class uY extends Error{constructor($){super(`Task already owns an admission slot or queue entry: ${$}`);this.name="TaskAdmissionConflictError"}}class z6 extends Error{constructor($="Task admission was cancelled"){super($);this.name="TaskAdmissionCancelledError"}}class dY{maxConcurrent=3;maxQueued=100;maxQueuedBytes=AZ;inFlight=0;pendingBytes=0;queue=[];activeKeys=new Set;explicitlyConfigured=!1;paused=!1;admit($){if(this.validateLimits($.maxConcurrent,$.maxQueued,$.maxQueuedBytes,$.pendingBytes),!this.explicitlyConfigured)this.applyConfiguration($.maxConcurrent,$.maxQueued,$.maxQueuedBytes);if(!$.key.trim())throw Error("Task admission key must not be blank");if(this.activeKeys.has($.key))throw new uY($.key);let Z=this.paused||this.inFlight>=this.maxConcurrent;if(Z&&this.queue.length>=this.maxQueued)throw new MZ("pending_count",this.maxQueued);if(Z&&$.pendingBytes>this.maxQueuedBytes-this.pendingBytes)throw new MZ("pending_bytes",this.maxQueuedBytes);let J,Y,Q=new Promise((U,H)=>{J=U,Y=H});Q.catch(()=>{return});let X={key:$.key,pendingBytes:$.pendingBytes,charged:!1,signal:$.signal,onUpdate:$.onUpdate,resolve:J,reject:Y,snapshot:this.snapshot("queued",1),settled:!1},W=(U)=>{this.cancelPending(X,new z6(U||void 0))},V={ready:Q,getSnapshot:()=>({...X.snapshot}),cancel:W,release:()=>{if(X.permit)X.permit.release();else W("Task admission released before execution")}};if(this.activeKeys.add($.key),$.signal?.aborted)return W(String($.signal.reason||"Task admission was cancelled")),V;if($.signal)X.abortListener=()=>W(String($.signal?.reason||"Task admission was cancelled")),$.signal.addEventListener("abort",X.abortListener,{once:!0});if(!Z)this.startPending(X);else this.chargePending(X),this.queue.push(X),this.publishQueueSnapshots();return V}configure($,Z,J){this.validateLimits($,Z,J),this.explicitlyConfigured=!0,this.applyConfiguration($,Z,J)}setPaused($){if(this.paused===$)return;if(this.paused=$,!$)this.drain();this.publishQueueSnapshots()}applyConfiguration($,Z,J){this.maxConcurrent=$,this.maxQueued=Z,this.maxQueuedBytes=J,this.drain(),this.publishQueueSnapshots()}getStats(){return{inFlight:this.inFlight,queued:this.queue.length,pendingBytes:this.pendingBytes,maxConcurrent:this.maxConcurrent,maxQueued:this.maxQueued,maxQueuedBytes:this.maxQueuedBytes,paused:this.paused}}resetForTests(){for(let $ of[...this.queue])this.cancelPending($,new z6("Scheduler reset"));this.queue.length=0,this.activeKeys.clear(),this.inFlight=0,this.pendingBytes=0,this.maxConcurrent=3,this.maxQueued=100,this.maxQueuedBytes=AZ,this.explicitlyConfigured=!1,this.paused=!1}startPending($){if($.settled)return;this.unchargePending($),this.detachAbort($),this.inFlight++;let Z=!1,J={release:()=>{if(Z)return;Z=!0,$.settled=!0,this.detachAbort($),this.activeKeys.delete($.key),this.inFlight=Math.max(0,this.inFlight-1),this.drain(),this.publishQueueSnapshots()}};$.permit=J,$.snapshot=this.snapshot("running"),this.publish($),$.resolve(J),this.publishQueueSnapshots()}cancelPending($,Z){if($.settled)return;if($.permit)return;let J=this.queue.indexOf($);if(J>=0)this.queue.splice(J,1);this.unchargePending($),$.settled=!0,this.detachAbort($),this.activeKeys.delete($.key),$.reject(Z),this.publishQueueSnapshots()}drain(){if(this.paused)return;while(this.inFlight<this.maxConcurrent&&this.queue.length>0){let $=this.queue.shift();if($&&!$.settled)this.startPending($)}}publishQueueSnapshots(){for(let[$,Z]of this.queue.entries())Z.snapshot=this.snapshot("queued",$+1),this.publish(Z)}snapshot($,Z){return{state:$,...Z!==void 0?{queuePosition:Z}:{},queueDepth:this.queue.length,inFlight:this.inFlight,maxConcurrent:this.maxConcurrent,maxQueued:this.maxQueued}}publish($){try{$.onUpdate?.({...$.snapshot})}catch{}}detachAbort($){if($.abortListener&&$.signal)$.signal.removeEventListener("abort",$.abortListener);$.abortListener=void 0}chargePending($){if($.charged)throw Error(`Task admission bytes already charged: ${$.key}`);if($.pendingBytes>this.maxQueuedBytes-this.pendingBytes)throw Error("Task admission byte accounting exceeded its configured limit");this.pendingBytes+=$.pendingBytes,$.charged=!0}unchargePending($){if(!$.charged)return;if($.pendingBytes>this.pendingBytes)throw Error("Task admission byte accounting underflow");this.pendingBytes-=$.pendingBytes,$.charged=!1}validateLimits($,Z,J,Y){if(!IY($))throw Error(`maxConcurrent must be an integer between ${SY} and ${kY}`);if(!hY(Z))throw Error(`maxQueued must be an integer between ${vY} and ${yY}`);if(!gY(J))throw Error(`maxQueuedBytes must be an integer between ${xY} and ${B1}`);if(Y!==void 0&&(!Number.isSafeInteger(Y)||Y<=0||Y>B1+1))throw Error(`pendingBytes must be an integer between 1 and ${B1+1}`)}}var g1=new dY;function cY($){let Z=$.pendingMessages&&$.pendingMessages.length>0?$.pendingMessages.map((Y)=>[Y.content,Y.outputSchema,Y.metadata]):[$.content,$.outputSchema],J=mY(Z,{maxBytes:B1});if(J>Math.floor(B1/2))return B1+1;return Math.max(1,J*2)}var s=e("Agent");function WG($){return!$.success&&lY($.error?.details)&&$.error.details.reason==="queue_full"}class d0{config;runtimeOptions;isInitialized=!1;activeTask;toolExecutor;chatService;executionEngine;attachmentCollector;activeSkillContext;currentModelMaxContextTokens;currentModelId;sessionRuntime;legacyMcpRegistry;agentResources;subagentRegistry;activeOperations=new H6;destroyPromise;async*observeProviderRecovery($,Z,J){try{while(!0){let Y=await $.next();if(Y.done)return Y.value;let Q=Y.value,X=Z.observeProviderRecovery(J,Q);if(yield Q,X)yield{kind:"provider_recovery",recovery:X}}}finally{await $.return?.({success:!1,error:{type:"aborted",message:"Provider recovery observer closed"},metadata:{turnsCount:0,toolCallsCount:0,duration:0}})}}async*observeTurnActivity($,Z,J){try{while(!0){let Y=await $.next();if(Y.done)return Y.value;let Q=Y.value,X=Z.observeTurnActivity(J,Q);if(yield Q,X)yield{kind:"turn_activity",activity:X}}}finally{await $.return?.({success:!1,error:{type:"aborted",message:"Turn activity observer closed"},metadata:{turnsCount:0,toolCallsCount:0,duration:0}})}}constructor($,Z={},J,Y){this.config=$,this.runtimeOptions=Z,this.toolExecutor=J||this.createDefaultToolExecutor(),this.sessionRuntime=Y,this.agentResources=Y?.getAgentResources(),this.subagentRegistry=this.agentResources?.subagents}createDefaultToolExecutor(){let $=new z1,Z={...this.config.permissions,...this.runtimeOptions.permissions},J=this.runtimeOptions.permissionMode??this.config.permissionMode??"default";return new W6($,{permissionConfig:Z,permissionMode:J,maxHistorySize:1000,toolWhitelist:this.runtimeOptions.toolWhitelist,toolBlacklist:this.runtimeOptions.toolBlacklist,workspaceToolPolicy:D4({kind:"local",executionRoot:C(),resourceRoot:C()}),contextDefaults:{foregroundCommandHandoffMs:this.config.bashForegroundHandoffMs}})}resolveModelConfig($){let Z=$&&$!=="inherit"?$:void 0,J=Z?CZ(Z):G1();if(!J)throw Error(`模型配置未找到: ${Z??"current"}`);return J}async applyModelConfig($,Z){let J=pY(),Y=m0($,this.config,J?"auto":"off");if(this.log(`${Z} ${Y.displayName} (${$.model})`),Y.model.reasoning&&!J)this.log("模型支持 Thinking,但用户未开启(按 Tab 开启)");else if(Y.chat.reasoningEnabled)this.log("Thinking 模式已启用,启用 reasoning_content 支持");this.currentModelMaxContextTokens=Y.model.contextWindow,this.chatService=await S4(Y.chat);let Q=this.executionEngine?.getContextManager();this.executionEngine=new U6(this.chatService,Q),this.currentModelId=$.id}async switchModelIfNeeded($){if(this.sessionRuntime){await this.sessionRuntime.refresh({modelId:$}),this.syncRuntimeState();return}if(!$||$===this.currentModelId)return;let Z=CZ($);if(!Z){this.log(`Warning: 模型配置未找到: ${$}`);return}await this.applyModelConfig(Z,"切换模型")}async switchModel($){if(!this.isInitialized)throw Error("Agent未初始化");await this.switchModelIfNeeded($)}static async create($={}){if($.sessionId)throw Error("Agent.create() does not accept sessionId. Create a SessionRuntime explicitly and use Agent.createWithRuntime().");if(await P4(),L2().length===0)throw Error(`没有可用的模型配置
851
851
 
852
852
  `+`请先使用以下命令添加模型:
@@ -861,7 +861,7 @@ ${A0}
861
861
  </approved-plan>
862
862
 
863
863
  IMPORTANT: Execute according to the approved plan above. Follow the steps exactly as specified.`;if(typeof O==="string")S$=O+j6;else S$=[...O,{type:"text",text:j6}]}S=yield*this.runLoop(S$,b,{...x,inputMessageId:void 0})}if(!this.sessionRuntime||!I)return S;let l=await this.sessionRuntime.recordGoalProgress({tokens:S.metadata?.tokensUsed??0,elapsedMs:S.metadata?.duration??0,...v?{goalId:v.goalId,objective:v.objective,turnId:I.id}:{},executionHostFailureCategory:S.metadata?.executionHostFailureCategory,prematureStopPattern:S.success?HY(S.finalMessage):void 0});if(l)yield{kind:"goal_updated",goal:l};if(!S.success||b.signal?.aborted){if(l=await this.sessionRuntime.pauseActiveGoal(b.signal?.aborted?"goal paused after user cancellation":S.error?.message??"goal paused after turn failure"),l)yield{kind:"goal_updated",goal:l}}if(S.success&&!b.signal?.aborted&&h<20)await this.sessionRuntime.waitForBackgroundSubagentFollowUp(I,b.signal);let a=S.success&&!b.signal?.aborted&&h<20,p0=WG(S)||!S.success&&S.error?.type==="max_turns_exceeded";if(R=await this.sessionRuntime.finishTurn(I,{continuePending:a,...p0?{acknowledgeInput:!0}:{},outcome:S.success&&!b.signal?.aborted?{status:"completed",turnsCount:S.metadata?.turnsCount??0,toolCallsCount:S.metadata?.toolCallsCount??0,durationMs:S.metadata?.duration??0}:{status:"aborted",cause:b.signal?.aborted?"cancelled":"failed",turnsCount:S.metadata?.turnsCount??0,toolCallsCount:S.metadata?.toolCallsCount??0,durationMs:S.metadata?.duration??0}}),R){h++,N=!0,A=!1,j=null,O="",p=void 0,M="",k=void 0,E=Z0(),yield{kind:"follow_up_started",queued:this.sessionRuntime.getPendingSteeringCount(),recovered:this.sessionRuntime.getRecoveredSteeringCount(),messages:$0(),queue:await this.sessionRuntime.getFollowUpQueueSnapshot()};continue}if(yield{kind:"follow_up_queue_changed",queue:await this.sessionRuntime.getFollowUpQueueSnapshot()},!S.success||b.signal?.aborted)return S;if(l=await this.sessionRuntime.getGoal(),!l||l.status!=="active"&&l.status!=="verifying")return S;let J0=await this.sessionRuntime.prepareGoalContinuation(l);if(!J0.ok){if(J0.goal)yield{kind:"goal_updated",goal:J0.goal};return{success:!1,error:{type:"goal_frontier_unavailable",message:J0.error.message},metadata:{turnsCount:S.metadata?.turnsCount??0,toolCallsCount:S.metadata?.toolCallsCount??0,duration:S.metadata?.duration??0}}}let h0=await this.sessionRuntime.beginGoalTurn(J0.goal);if(!h0)return S;j=h0.goal,q={...J0,goal:h0.goal},R=h0.handle,N=!1,A=!0,O=S5(j),p=void 0,E=void 0,yield{kind:"goal_frontier_updated",goal:j,frontier:J0.frontier,tasks:J0.tasks},yield{kind:"goal_continuation_started",goal:j,continuation:j.continuationCount,...j.prematureStop?{prematureStopPattern:j.prematureStop.pattern,prematureStopCount:j.prematureStop.consecutiveCount}:{}},yield{kind:"goal_updated",goal:j}}}finally{if(this.sessionRuntime&&R)await this.sessionRuntime.finishTurn(R)}}let F=typeof z==="string"?z:z.filter((O)=>O.type==="text").map((O)=>O.text).join(`
864
- `),L={id:this.generateTaskId(),type:"simple",prompt:F};return{success:!0,finalMessage:(await this.executeTask(L)).content,metadata:{turnsCount:1,toolCallsCount:0,duration:0}}}async chat($,Z,J){let{drainLoop:Y}=await import("./chunk-htd9p2fd.js");return Y(this.chatStream($,Z,J))}async*runPlanLoop($,Z,J){s.debug("Processing Plan mode message...");let{prompt:Y}=await Y1({...Z.workspaceKind==="acp-remote"?{workspaceAccess:"none"}:{projectPath:Z.workspaceRoot||C()},mode:"plan",includeEnvironment:!0,environmentOptions:{...u1,workingDirectory:Z.executionRoot??Z.workspaceRoot??C()},language:this.config.language,availableSkills:this.agentResources?.skills.generateAvailableSkillsList(),communicationStyle:this.sessionRuntime?.getCommunicationStyleConfiguration().selection,communicationStyleCatalog:this.sessionRuntime?.getCommunicationStyleCatalog(),projectRuleCatalog:this.sessionRuntime?.getProjectRuleCatalog(),...Z.workspaceKind==="acp-remote"?{}:{projectInstructionSourcePath:this.sessionRuntime?.projectRoot}}),Q;if(typeof $==="string")Q=t2($);else{let X=$.filter((W)=>W.type==="text");if(X.length>0){let W=X[0];Q=$.map((V)=>V===W?{type:"text",text:t2(W.text)}:V)}else Q=[{type:"text",text:t2("")},...$]}return yield*this.executeLoop(Q,Z,J,Y)}async*runLoop($,Z,J){s.debug("Processing enhanced chat message...");let Y=Z.systemPrompt??await this.buildSystemPromptOnDemand(Z);return yield*this.executeLoop($,Z,J,Y)}async buildSystemPromptOnDemand($){let Z=this.runtimeOptions.systemPrompt,J=this.runtimeOptions.appendSystemPrompt;return(await Y1({...$.workspaceKind==="acp-remote"?{workspaceAccess:"none"}:{projectPath:$.workspaceRoot||C()},replaceDefault:Z,append:J,includeEnvironment:!0,environmentOptions:{...u1,workingDirectory:$.executionRoot??$.workspaceRoot??C()},language:this.config.language,availableSkills:this.agentResources?.skills.generateAvailableSkillsList(),communicationStyle:this.sessionRuntime?.getCommunicationStyleConfiguration().selection,communicationStyleCatalog:this.sessionRuntime?.getCommunicationStyleCatalog(),projectRuleCatalog:this.sessionRuntime?.getProjectRuleCatalog(),...$.workspaceKind==="acp-remote"?{}:{projectInstructionSourcePath:this.sessionRuntime?.projectRoot}})).prompt}executeLoop($,Z,J,Y){if(!this.isInitialized)throw Error("Agent未初始化");let Q=this.buildLoopDependencies();return nY(Q,$,Z,J,Y)}takeStartupAdoptedToolResultEvents(){return(this.sessionRuntime?.takeStartupAdoptedToolResults()??[]).flatMap(({call:Z,result:J})=>{let Y={id:Z.toolCallId,type:"function",function:{name:Z.toolName,arguments:JSON.stringify(Z.input)}},Q=J.metadata&&typeof J.metadata==="object"&&!Array.isArray(J.metadata)?J.metadata:void 0,X=J.error===void 0,W=J.output,V={success:X,llmContent:typeof W==="string"||W!==null&&typeof W==="object"?W:W===null?J.error?`Subagent execution failed: ${J.error}.`:"":String(W),...J.error?{error:{type:"execution_error",message:J.error}}:{},...Q?{metadata:Q}:{}},U=[{kind:"tool_result",toolCall:Y,result:V}],H=rY(Y,V);if(H)U.push(H);return U})}takeStartupRecoveryEvents(){let $=this.sessionRuntime?.getTurnRecoveryAssessment(),Z=$?.state==="requires_attention"?$:this.sessionRuntime?.takeStartupTurnRecoveryAssessment(),J=Z&&Z.state!=="none"?[{kind:"turn_recovery",assessment:Z}]:[];return J.push(...this.takeStartupAdoptedToolResultEvents()),J}buildLoopDependencies(){return{chatService:this.chatService,toolExecutor:this.toolExecutor,executionEngine:this.executionEngine,config:this.config,runtimeOptions:this.runtimeOptions,currentModelMaxContextTokens:this.currentModelMaxContextTokens,activeSkillContext:this.activeSkillContext,onSkillActivated:($)=>{this.activeSkillContext=$,s.debug(`Skill "${$.skillName}" activated`+($.allowedTools?` with allowed tools: ${$.allowedTools.join(", ")}`:""))},onModelSwitch:($)=>this.switchModelIfNeeded($),applySkillToolRestrictions:($)=>this.applySkillToolRestrictions($),staticProjectRules:this.sessionRuntime?.getStaticProjectRules(),hydrateProjectRules:this.sessionRuntime?($)=>this.sessionRuntime.hydrateProjectRules($):void 0,resolveContextualProjectRules:this.sessionRuntime?($,Z,J,Y)=>this.sessionRuntime.resolveContextualProjectRules($,Z,J,Y):void 0}}async chatWithSystem($,Z){if(!this.isInitialized)throw Error("Agent未初始化");let J=[{role:"system",content:$},{role:"user",content:Z}];return(await this.chatService.chat(J)).content}getActiveTask(){return this.activeTask}getChatService(){return this.chatService}getContextManager(){return this.executionEngine?.getContextManager()}getStats(){return{initialized:this.isInitialized,activeTask:this.activeTask?.id,components:{chatService:this.chatService?"ready":"not_loaded",executionEngine:this.executionEngine?"ready":"not_loaded"}}}getAvailableTools(){return this.toolExecutor?this.toolExecutor.getRegistry().getAll():[]}getToolRegistry(){return this.toolExecutor.getRegistry()}applyToolWhitelist($){let Z=this.toolExecutor.getRegistry(),Y=Z.getAll().filter((Q)=>!$.includes(Q.name));for(let Q of Y)Z.unregister(Q.name);s.debug(`Applied tool whitelist: ${$.join(", ")} (removed ${Y.length} tools)`)}applyToolBlacklist($){let Z=this.toolExecutor.getRegistry(),J=new Set($);for(let Y of Z.getAll())if(J.has(Y.name))Z.unregister(Y.name);s.debug(`Applied tool blacklist: ${$.join(", ")}`)}getToolStats(){let $=this.getAvailableTools(),Z=new Map;return $.forEach((J)=>{let Y=Z.get(J.kind)||0;Z.set(J.kind,Y+1)}),{totalTools:$.length,toolsByKind:Object.fromEntries(Z),toolNames:$.map((J)=>J.name)}}async destroy(){if(this.destroyPromise)return this.destroyPromise;return this.destroyPromise=(async()=>{this.log("销毁Agent..."),await this.activeOperations.shutdown("agent-destroy");try{await this.legacyMcpRegistry?.disconnectAll(),this.legacyMcpRegistry=void 0,this.log("Agent已销毁")}catch($){throw this.error("Agent销毁失败",$),$}finally{this.toolExecutor.dispose(),this.isInitialized=!1}})(),this.destroyPromise}syncRuntimeState(){if(!this.sessionRuntime)return;this.chatService=this.sessionRuntime.getChatService(),this.executionEngine=this.sessionRuntime.getExecutionEngine(),this.attachmentCollector=this.sessionRuntime.getAttachmentCollector(),this.currentModelId=this.sessionRuntime.getCurrentModelId(),this.currentModelMaxContextTokens=this.sessionRuntime.getCurrentModelMaxContextTokens()}generateTaskId(){return`task_${Date.now()}_${Math.random().toString(36).substring(2,9)}`}log($,Z){s.debug(`[MainAgent] ${$}`,Z||"")}error($,Z){s.error(`[MainAgent] ${$}`,Z||"")}async initializeSystemPrompt(){try{let $=this.runtimeOptions.systemPrompt,Z=this.runtimeOptions.appendSystemPrompt,J=await Y1({...this.sessionRuntime?.isRemoteWorkspace()?{workspaceAccess:"none"}:{projectPath:this.sessionRuntime?.workspaceRoot??C()},replaceDefault:$,append:Z,includeEnvironment:!1,language:this.config.language,availableSkills:this.agentResources?.skills.generateAvailableSkillsList(),communicationStyle:this.sessionRuntime?.getCommunicationStyleConfiguration().selection,communicationStyleCatalog:this.sessionRuntime?.getCommunicationStyleCatalog(),projectRuleCatalog:this.sessionRuntime?.getProjectRuleCatalog(),...this.sessionRuntime?.isRemoteWorkspace()?{}:{projectInstructionSourcePath:this.sessionRuntime?.projectRoot},...this.sessionRuntime?{environmentOptions:{...u1,workingDirectory:this.sessionRuntime.executionRoot}}:{}});if(J.prompt)this.log("系统提示配置验证成功"),s.debug(`[SystemPrompt] 可用来源: ${J.sources.filter((Y)=>Y.loaded).map((Y)=>Y.name).join(", ")}`)}catch($){this.error("系统提示配置验证失败",$)}}async registerBuiltinTools(){try{let $=await v4({sessionId:"default",configDir:t(),workspaceRoot:C(),resourceRoot:C(),agentResources:this.agentResources});s.debug(`Registering ${$.length} builtin tools...`),this.toolExecutor.getRegistry().registerAll($);let Z=this.toolExecutor.getRegistry().getAll().length;s.debug(`Builtin tools registered: ${Z} tools`),s.debug(`[Tools] ${this.toolExecutor.getRegistry().getAll().map((J)=>J.name).join(", ")}`),await this.registerMcpTools()}catch($){throw s.error("Failed to register builtin tools:",$),$}}async registerMcpTools(){try{let $=await W4({workspaceRoot:C(),storeServers:this.config.mcpServers??{},cliConfigs:this.runtimeOptions.mcpConfig,strictCliConfig:this.runtimeOptions.strictMcpConfig});if(Object.keys($).length===0){s.debug("No MCP servers configured");return}let Z=e0.createIsolated({artifactWriter:new o2(`legacy-${XG()}`)});this.legacyMcpRegistry=Z;for(let[X,W]of Object.entries($))try{s.debug(`Connecting to MCP server: ${X}`),await Z.registerServer(X,W),s.debug(`MCP server "${X}" connected`)}catch(V){s.warn(`Warning: MCP server "${X}" connection failed:`,V)}let J=this.toolExecutor.getRegistry();J.setMcpCatalogBarrier(()=>Z.waitForCatalogIdle());let Y=Z.getCatalogSnapshot();J.replaceMcpTools(Y.tools),J.registerAll(Y6(Z));let Q=Z.getInstructionsSnapshot();if(J.queueMcpInstructionsChange({revision:Q.revision,reason:"snapshot",replace:!0,instructions:Q.instructions,removed:[]}),Z.on("catalogChanged",(X)=>{J.replaceMcpTools(X.tools,X)}),Z.on("contentCatalogChanged",(X)=>{J.queueMcpContentChange(X)}),Z.on("resourceUpdated",(X)=>{J.queueMcpResourceUpdated(X)}),Z.on("connectionLifecycleChanged",(X)=>{J.queueMcpConnectionChange(X)}),Z.on("log",(X)=>{J.queueMcpLog(X)}),Z.on("instructionsChanged",(X)=>{J.queueMcpInstructionsChange({revision:X.revision,reason:X.reason,replace:!1,instructions:X.action==="added"&&X.instruction?[{serverName:X.serverName,...X.instruction}]:[],removed:X.action==="removed"?[X.serverName]:[]})}),Y.tools.length>0)s.debug(`Registered ${Y.tools.length} MCP tools`),s.debug(`[MCP Tools] ${Y.tools.map((X)=>X.name).join(", ")}`)}catch($){s.warn("Failed to register MCP tools:",$)}}async loadSubagents(){let $=await c0(C());if(this.agentResources=k4($),this.subagentRegistry=this.agentResources.subagents,this.runtimeOptions.agents?.length)this.subagentRegistry.applyOverrides(this.runtimeOptions.agents);let Z=this.subagentRegistry.getAllNames().length;if(Z>0)s.debug(`Loaded ${Z} subagents: ${this.subagentRegistry.getAllNames().join(", ")}`);else s.debug("No subagents configured")}applySkillToolRestrictions($){if(!this.activeSkillContext?.allowedTools)return $;let Z=this.activeSkillContext.allowedTools;s.debug(`Applying Skill tool restrictions: ${Z.join(", ")}`);let J=$.filter((Y)=>{if(Y.name==="ReadPromptArtifact")return!0;return Z.some((Q)=>{if(Q===Y.name)return!0;let X=Q.match(/^(\w+)\(.*\)$/);if(X&&X[1]===Y.name)return!0;return!1})});return s.debug(`Filtered tools: ${J.map((Y)=>Y.name).join(", ")} (${J.length}/${$.length})`),J}clearSkillContext(){if(this.activeSkillContext)s.debug(`Skill "${this.activeSkillContext.skillName}" deactivated`),this.activeSkillContext=void 0}async processAtMentionsForContent($){if(!this.attachmentCollector)return $;if(typeof $==="string")return this.processAtMentions($);let Z=[];for(let Y of $)if(Y.type==="text")Z.push(Y.text);if(Z.length===0)return $;let J=Z.join(`
864
+ `),L={id:this.generateTaskId(),type:"simple",prompt:F};return{success:!0,finalMessage:(await this.executeTask(L)).content,metadata:{turnsCount:1,toolCallsCount:0,duration:0}}}async chat($,Z,J){let{drainLoop:Y}=await import("./chunk-kfs412ed.js");return Y(this.chatStream($,Z,J))}async*runPlanLoop($,Z,J){s.debug("Processing Plan mode message...");let{prompt:Y}=await Y1({...Z.workspaceKind==="acp-remote"?{workspaceAccess:"none"}:{projectPath:Z.workspaceRoot||C()},mode:"plan",includeEnvironment:!0,environmentOptions:{...u1,workingDirectory:Z.executionRoot??Z.workspaceRoot??C()},language:this.config.language,availableSkills:this.agentResources?.skills.generateAvailableSkillsList(),communicationStyle:this.sessionRuntime?.getCommunicationStyleConfiguration().selection,communicationStyleCatalog:this.sessionRuntime?.getCommunicationStyleCatalog(),projectRuleCatalog:this.sessionRuntime?.getProjectRuleCatalog(),...Z.workspaceKind==="acp-remote"?{}:{projectInstructionSourcePath:this.sessionRuntime?.projectRoot}}),Q;if(typeof $==="string")Q=t2($);else{let X=$.filter((W)=>W.type==="text");if(X.length>0){let W=X[0];Q=$.map((V)=>V===W?{type:"text",text:t2(W.text)}:V)}else Q=[{type:"text",text:t2("")},...$]}return yield*this.executeLoop(Q,Z,J,Y)}async*runLoop($,Z,J){s.debug("Processing enhanced chat message...");let Y=Z.systemPrompt??await this.buildSystemPromptOnDemand(Z);return yield*this.executeLoop($,Z,J,Y)}async buildSystemPromptOnDemand($){let Z=this.runtimeOptions.systemPrompt,J=this.runtimeOptions.appendSystemPrompt;return(await Y1({...$.workspaceKind==="acp-remote"?{workspaceAccess:"none"}:{projectPath:$.workspaceRoot||C()},replaceDefault:Z,append:J,includeEnvironment:!0,environmentOptions:{...u1,workingDirectory:$.executionRoot??$.workspaceRoot??C()},language:this.config.language,availableSkills:this.agentResources?.skills.generateAvailableSkillsList(),communicationStyle:this.sessionRuntime?.getCommunicationStyleConfiguration().selection,communicationStyleCatalog:this.sessionRuntime?.getCommunicationStyleCatalog(),projectRuleCatalog:this.sessionRuntime?.getProjectRuleCatalog(),...$.workspaceKind==="acp-remote"?{}:{projectInstructionSourcePath:this.sessionRuntime?.projectRoot}})).prompt}executeLoop($,Z,J,Y){if(!this.isInitialized)throw Error("Agent未初始化");let Q=this.buildLoopDependencies();return nY(Q,$,Z,J,Y)}takeStartupAdoptedToolResultEvents(){return(this.sessionRuntime?.takeStartupAdoptedToolResults()??[]).flatMap(({call:Z,result:J})=>{let Y={id:Z.toolCallId,type:"function",function:{name:Z.toolName,arguments:JSON.stringify(Z.input)}},Q=J.metadata&&typeof J.metadata==="object"&&!Array.isArray(J.metadata)?J.metadata:void 0,X=J.error===void 0,W=J.output,V={success:X,llmContent:typeof W==="string"||W!==null&&typeof W==="object"?W:W===null?J.error?`Subagent execution failed: ${J.error}.`:"":String(W),...J.error?{error:{type:"execution_error",message:J.error}}:{},...Q?{metadata:Q}:{}},U=[{kind:"tool_result",toolCall:Y,result:V}],H=rY(Y,V);if(H)U.push(H);return U})}takeStartupRecoveryEvents(){let $=this.sessionRuntime?.getTurnRecoveryAssessment(),Z=$?.state==="requires_attention"?$:this.sessionRuntime?.takeStartupTurnRecoveryAssessment(),J=Z&&Z.state!=="none"?[{kind:"turn_recovery",assessment:Z}]:[];return J.push(...this.takeStartupAdoptedToolResultEvents()),J}buildLoopDependencies(){return{chatService:this.chatService,toolExecutor:this.toolExecutor,executionEngine:this.executionEngine,config:this.config,runtimeOptions:this.runtimeOptions,currentModelMaxContextTokens:this.currentModelMaxContextTokens,activeSkillContext:this.activeSkillContext,onSkillActivated:($)=>{this.activeSkillContext=$,s.debug(`Skill "${$.skillName}" activated`+($.allowedTools?` with allowed tools: ${$.allowedTools.join(", ")}`:""))},onModelSwitch:($)=>this.switchModelIfNeeded($),applySkillToolRestrictions:($)=>this.applySkillToolRestrictions($),staticProjectRules:this.sessionRuntime?.getStaticProjectRules(),hydrateProjectRules:this.sessionRuntime?($)=>this.sessionRuntime.hydrateProjectRules($):void 0,resolveContextualProjectRules:this.sessionRuntime?($,Z,J,Y)=>this.sessionRuntime.resolveContextualProjectRules($,Z,J,Y):void 0}}async chatWithSystem($,Z){if(!this.isInitialized)throw Error("Agent未初始化");let J=[{role:"system",content:$},{role:"user",content:Z}];return(await this.chatService.chat(J)).content}getActiveTask(){return this.activeTask}getChatService(){return this.chatService}getContextManager(){return this.executionEngine?.getContextManager()}getStats(){return{initialized:this.isInitialized,activeTask:this.activeTask?.id,components:{chatService:this.chatService?"ready":"not_loaded",executionEngine:this.executionEngine?"ready":"not_loaded"}}}getAvailableTools(){return this.toolExecutor?this.toolExecutor.getRegistry().getAll():[]}getToolRegistry(){return this.toolExecutor.getRegistry()}applyToolWhitelist($){let Z=this.toolExecutor.getRegistry(),Y=Z.getAll().filter((Q)=>!$.includes(Q.name));for(let Q of Y)Z.unregister(Q.name);s.debug(`Applied tool whitelist: ${$.join(", ")} (removed ${Y.length} tools)`)}applyToolBlacklist($){let Z=this.toolExecutor.getRegistry(),J=new Set($);for(let Y of Z.getAll())if(J.has(Y.name))Z.unregister(Y.name);s.debug(`Applied tool blacklist: ${$.join(", ")}`)}getToolStats(){let $=this.getAvailableTools(),Z=new Map;return $.forEach((J)=>{let Y=Z.get(J.kind)||0;Z.set(J.kind,Y+1)}),{totalTools:$.length,toolsByKind:Object.fromEntries(Z),toolNames:$.map((J)=>J.name)}}async destroy(){if(this.destroyPromise)return this.destroyPromise;return this.destroyPromise=(async()=>{this.log("销毁Agent..."),await this.activeOperations.shutdown("agent-destroy");try{await this.legacyMcpRegistry?.disconnectAll(),this.legacyMcpRegistry=void 0,this.log("Agent已销毁")}catch($){throw this.error("Agent销毁失败",$),$}finally{this.toolExecutor.dispose(),this.isInitialized=!1}})(),this.destroyPromise}syncRuntimeState(){if(!this.sessionRuntime)return;this.chatService=this.sessionRuntime.getChatService(),this.executionEngine=this.sessionRuntime.getExecutionEngine(),this.attachmentCollector=this.sessionRuntime.getAttachmentCollector(),this.currentModelId=this.sessionRuntime.getCurrentModelId(),this.currentModelMaxContextTokens=this.sessionRuntime.getCurrentModelMaxContextTokens()}generateTaskId(){return`task_${Date.now()}_${Math.random().toString(36).substring(2,9)}`}log($,Z){s.debug(`[MainAgent] ${$}`,Z||"")}error($,Z){s.error(`[MainAgent] ${$}`,Z||"")}async initializeSystemPrompt(){try{let $=this.runtimeOptions.systemPrompt,Z=this.runtimeOptions.appendSystemPrompt,J=await Y1({...this.sessionRuntime?.isRemoteWorkspace()?{workspaceAccess:"none"}:{projectPath:this.sessionRuntime?.workspaceRoot??C()},replaceDefault:$,append:Z,includeEnvironment:!1,language:this.config.language,availableSkills:this.agentResources?.skills.generateAvailableSkillsList(),communicationStyle:this.sessionRuntime?.getCommunicationStyleConfiguration().selection,communicationStyleCatalog:this.sessionRuntime?.getCommunicationStyleCatalog(),projectRuleCatalog:this.sessionRuntime?.getProjectRuleCatalog(),...this.sessionRuntime?.isRemoteWorkspace()?{}:{projectInstructionSourcePath:this.sessionRuntime?.projectRoot},...this.sessionRuntime?{environmentOptions:{...u1,workingDirectory:this.sessionRuntime.executionRoot}}:{}});if(J.prompt)this.log("系统提示配置验证成功"),s.debug(`[SystemPrompt] 可用来源: ${J.sources.filter((Y)=>Y.loaded).map((Y)=>Y.name).join(", ")}`)}catch($){this.error("系统提示配置验证失败",$)}}async registerBuiltinTools(){try{let $=await v4({sessionId:"default",configDir:t(),workspaceRoot:C(),resourceRoot:C(),agentResources:this.agentResources});s.debug(`Registering ${$.length} builtin tools...`),this.toolExecutor.getRegistry().registerAll($);let Z=this.toolExecutor.getRegistry().getAll().length;s.debug(`Builtin tools registered: ${Z} tools`),s.debug(`[Tools] ${this.toolExecutor.getRegistry().getAll().map((J)=>J.name).join(", ")}`),await this.registerMcpTools()}catch($){throw s.error("Failed to register builtin tools:",$),$}}async registerMcpTools(){try{let $=await W4({workspaceRoot:C(),storeServers:this.config.mcpServers??{},cliConfigs:this.runtimeOptions.mcpConfig,strictCliConfig:this.runtimeOptions.strictMcpConfig});if(Object.keys($).length===0){s.debug("No MCP servers configured");return}let Z=e0.createIsolated({artifactWriter:new o2(`legacy-${XG()}`)});this.legacyMcpRegistry=Z;for(let[X,W]of Object.entries($))try{s.debug(`Connecting to MCP server: ${X}`),await Z.registerServer(X,W),s.debug(`MCP server "${X}" connected`)}catch(V){s.warn(`Warning: MCP server "${X}" connection failed:`,V)}let J=this.toolExecutor.getRegistry();J.setMcpCatalogBarrier(()=>Z.waitForCatalogIdle());let Y=Z.getCatalogSnapshot();J.replaceMcpTools(Y.tools),J.registerAll(Y6(Z));let Q=Z.getInstructionsSnapshot();if(J.queueMcpInstructionsChange({revision:Q.revision,reason:"snapshot",replace:!0,instructions:Q.instructions,removed:[]}),Z.on("catalogChanged",(X)=>{J.replaceMcpTools(X.tools,X)}),Z.on("contentCatalogChanged",(X)=>{J.queueMcpContentChange(X)}),Z.on("resourceUpdated",(X)=>{J.queueMcpResourceUpdated(X)}),Z.on("connectionLifecycleChanged",(X)=>{J.queueMcpConnectionChange(X)}),Z.on("log",(X)=>{J.queueMcpLog(X)}),Z.on("instructionsChanged",(X)=>{J.queueMcpInstructionsChange({revision:X.revision,reason:X.reason,replace:!1,instructions:X.action==="added"&&X.instruction?[{serverName:X.serverName,...X.instruction}]:[],removed:X.action==="removed"?[X.serverName]:[]})}),Y.tools.length>0)s.debug(`Registered ${Y.tools.length} MCP tools`),s.debug(`[MCP Tools] ${Y.tools.map((X)=>X.name).join(", ")}`)}catch($){s.warn("Failed to register MCP tools:",$)}}async loadSubagents(){let $=await c0(C());if(this.agentResources=k4($),this.subagentRegistry=this.agentResources.subagents,this.runtimeOptions.agents?.length)this.subagentRegistry.applyOverrides(this.runtimeOptions.agents);let Z=this.subagentRegistry.getAllNames().length;if(Z>0)s.debug(`Loaded ${Z} subagents: ${this.subagentRegistry.getAllNames().join(", ")}`);else s.debug("No subagents configured")}applySkillToolRestrictions($){if(!this.activeSkillContext?.allowedTools)return $;let Z=this.activeSkillContext.allowedTools;s.debug(`Applying Skill tool restrictions: ${Z.join(", ")}`);let J=$.filter((Y)=>{if(Y.name==="ReadPromptArtifact")return!0;return Z.some((Q)=>{if(Q===Y.name)return!0;let X=Q.match(/^(\w+)\(.*\)$/);if(X&&X[1]===Y.name)return!0;return!1})});return s.debug(`Filtered tools: ${J.map((Y)=>Y.name).join(", ")} (${J.length}/${$.length})`),J}clearSkillContext(){if(this.activeSkillContext)s.debug(`Skill "${this.activeSkillContext.skillName}" deactivated`),this.activeSkillContext=void 0}async processAtMentionsForContent($){if(!this.attachmentCollector)return $;if(typeof $==="string")return this.processAtMentions($);let Z=[];for(let Y of $)if(Y.type==="text")Z.push(Y.text);if(Z.length===0)return $;let J=Z.join(`
865
865
  `);try{let Y=await this.attachmentCollector.collect(J);if(Y.length===0)return $;s.debug(`Processed ${Y.length} @ file mentions in multimodal message`);let Q=this.buildAttachmentText(Y);if(!Q)return $;return[...$,{type:"text",text:Q}]}catch(Y){return s.error("Failed to process @ mentions in multimodal message:",Y),$}}buildAttachmentText($){let Z=[],J=[];for(let Q of $)if(Q.type==="file"){let X=Q.metadata?.lineRange?` (lines ${Q.metadata.lineRange.start}${Q.metadata.lineRange.end?`-${Q.metadata.lineRange.end}`:""})`:"";Z.push(`<file path="${Q.path}"${X?` range="${X}"`:""}>`,Q.content,"</file>")}else if(Q.type==="directory")Z.push(`<directory path="${Q.path}">`,Q.content,"</directory>");else if(Q.type==="error")J.push(`- @${Q.path}: ${Q.error}`);let Y="";if(Z.length>0)Y+=`
866
866
 
867
867
  <system-reminder>
@@ -1677,7 +1677,7 @@ ${J}
1677
1677
  `)),{success:!0,message:"Schedules listed",content:U.join(`
1678
1678
  `)}}case"create":{let V=sw(X);if("error"in V)return Y.sendMessage(`创建失败:${V.error}`),{success:!1,error:V.error};let U={prompt:V.prompt,projectPath:W,trigger:V.trigger,isolation:"worktree",permissionMode:"default",enabled:!0};try{let H=await $.create(U),z=H.nextRunAt?new Date(H.nextRunAt).toLocaleString():"(无)";return Y.sendMessage(`[OK] 已创建定时任务 \`${H.id}\`
1679
1679
  ${A9(H.trigger)} · 下次运行: ${z}`),{success:!0,message:`Schedule ${H.id} created`}}catch(H){let z=H instanceof Error?H.message:String(H);return Y.sendMessage(`创建失败:${z}`),{success:!1,error:z}}}case"remove":case"rm":{let V=X[0];if(!V)return Y.sendMessage("用法:/schedule remove <id>"),{success:!1,error:"Missing schedule id"};let U=await $.remove(V);return Y.sendMessage(U?`[OK] 已删除 \`${V}\``:`未找到 \`${V}\``),{success:U,message:U?"Removed":"Not found"}}case"enable":case"disable":{let V=X[0];if(!V)return Y.sendMessage(`用法:/schedule ${Q} <id>`),{success:!1,error:"Missing schedule id"};let U=await $.setEnabled(V,Q==="enable");return Y.sendMessage(U?`[OK] 已${Q==="enable"?"启用":"停用"} \`${V}\``:`未找到 \`${V}\``),{success:Boolean(U),message:U?"Updated":"Not found"}}case"run":{let V=X[0];if(!V)return Y.sendMessage("用法:/schedule run <id>"),{success:!1,error:"Missing schedule id"};try{return await ow(V),Y.sendMessage(`[OK] 已触发 \`${V}\``),{success:!0,message:"Schedule triggered"}}catch(U){let H=U instanceof Error?U.message:String(U);return Y.sendMessage(`运行失败:${H}`),{success:!1,error:H}}}default:return Y.sendMessage(`未知子命令: ${Q}
1680
- 使用 /schedule 查看帮助`),{success:!1,error:`Unknown subcommand: ${Q}`}}}}}var oW=tw();import*as f2 from"node:fs/promises";import*as P2 from"node:path";async function JV($,Z={}){let{maxResults:J=20,caseSensitive:Y=!1,projectPath:Q,storagePath:X}=Z,W=X??P6(Q??C());if(!X){let G=await ew($,Q??C(),J,Y);if(G)return G}let V;try{V=(await f2.readdir(W)).filter((D)=>D.endsWith(".jsonl")&&!D.startsWith("agent_")).map((D)=>P2.join(W,D))}catch{return[]}let H=(await Promise.all(V.map(async(G)=>{try{let D=await f2.stat(G);return{path:G,mtime:D.mtimeMs}}catch{return null}}))).filter((G)=>G!==null).sort((G,D)=>D.mtime-G.mtime).map((G)=>G.path),z=[],B=Y?$:$.toLowerCase();for(let G of H){if(z.length>=J)break;let D=P2.basename(G,".jsonl"),w=await $_(G,B,Y,D);if(z.push(...w),z.length>=J){z.length=J;break}}return z}async function ew($,Z,J,Y){try{let{syncAll:Q}=await import("./chunk-d420fs8m.js"),X=await $V();if(!X)return null;let{SessionService:W}=await import("./chunk-sbj9wyn4.js");await Q(X,W.projectionDeriverForSearch());let V=P2.resolve(Z),U=ZV(X,$,V,J*4),H=Y?$:$.toLowerCase(),z=[];for(let B of U){if(B.role!=="user"&&B.role!=="assistant")continue;let G=M9(B.text,H,Y,B.session_id,B.role,B.timestamp??void 0,0);if(G)z.push(G);if(z.length>=J)break}return z}catch{return null}}async function $_($,Z,J,Y){try{let Q=await f2.readFile($,"utf8"),W=Q.split(`
1680
+ 使用 /schedule 查看帮助`),{success:!1,error:`Unknown subcommand: ${Q}`}}}}}var oW=tw();import*as f2 from"node:fs/promises";import*as P2 from"node:path";async function JV($,Z={}){let{maxResults:J=20,caseSensitive:Y=!1,projectPath:Q,storagePath:X}=Z,W=X??P6(Q??C());if(!X){let G=await ew($,Q??C(),J,Y);if(G)return G}let V;try{V=(await f2.readdir(W)).filter((D)=>D.endsWith(".jsonl")&&!D.startsWith("agent_")).map((D)=>P2.join(W,D))}catch{return[]}let H=(await Promise.all(V.map(async(G)=>{try{let D=await f2.stat(G);return{path:G,mtime:D.mtimeMs}}catch{return null}}))).filter((G)=>G!==null).sort((G,D)=>D.mtime-G.mtime).map((G)=>G.path),z=[],B=Y?$:$.toLowerCase();for(let G of H){if(z.length>=J)break;let D=P2.basename(G,".jsonl"),w=await $_(G,B,Y,D);if(z.push(...w),z.length>=J){z.length=J;break}}return z}async function ew($,Z,J,Y){try{let{syncAll:Q}=await import("./chunk-d420fs8m.js"),X=await $V();if(!X)return null;let{SessionService:W}=await import("./chunk-ps0zk8ge.js");await Q(X,W.projectionDeriverForSearch());let V=P2.resolve(Z),U=ZV(X,$,V,J*4),H=Y?$:$.toLowerCase(),z=[];for(let B of U){if(B.role!=="user"&&B.role!=="assistant")continue;let G=M9(B.text,H,Y,B.session_id,B.role,B.timestamp??void 0,0);if(G)z.push(G);if(z.length>=J)break}return z}catch{return null}}async function $_($,Z,J,Y){try{let Q=await f2.readFile($,"utf8"),W=Q.split(`
1681
1681
  `).flatMap((B,G)=>{if(!B.trim())return[];try{return[{event:JSON.parse(B),index:G}]}catch{return[]}});if(!W.some(({event:B})=>B.type==="session_created"))return Z_(W,Z,J,Y);let U=new Map(W.flatMap(({event:B,index:G})=>typeof B.id==="string"?[[B.id,G+1]]:[])),H=tW(eW(Q,$)),z=new Map;for(let B of H){if(B.type==="message_created"&&(B.data.role==="user"||B.data.role==="assistant"))z.set(B.data.messageId,{role:B.data.role,content:[],timestamp:B.timestamp,lineNumber:U.get(B.id)??0});if(B.type==="part_created"&&B.data.partType==="text"){let G=z.get(B.data.messageId),D=B.data.payload.text;if(G&&typeof D==="string")G.content.push(D)}}return[...z.values()].flatMap((B)=>{let G=M9(B.content.join(" "),Z,J,Y,B.role,B.timestamp,B.lineNumber);return G?[G]:[]})}catch{return[]}}function Z_($,Z,J,Y){return $.flatMap(({event:Q,index:X})=>{if(Q.type!=="message")return[];let W=Q.message;if(W?.role!=="user"&&W?.role!=="assistant"||!W.content)return[];let V=typeof W.content==="string"?W.content:Array.isArray(W.content)?W.content.filter((H)=>typeof H==="object"&&H!==null&&H.type==="text"&&typeof H.text==="string").map((H)=>H.text).join(" "):"",U=M9(V,Z,J,Y,W.role,typeof Q.timestamp==="string"?Q.timestamp:void 0,X+1);return U?[U]:[]})}function M9($,Z,J,Y,Q,X,W){if(!$)return;let V=J?$:$.toLowerCase();if(!V.includes(Z))return;let U=V.indexOf(Z),H=Math.max(0,U-80),z=Math.min($.length,U+Z.length+80);return{sessionId:Y,role:Q,content:(H>0?"...":"")+$.slice(H,z).replace(/\n/g," ")+(z<$.length?"...":""),timestamp:X,lineNumber:W}}function YV($){if($.length===0)return"没有找到匹配的历史记录";let Z=[`**找到 ${$.length} 条匹配:**
1682
1682
  `];for(let J of $){let Y=J.timestamp?new Date(J.timestamp).toLocaleString("zh-CN",{timeZone:"Asia/Shanghai"}):"?",Q=J.role==="user"?"\uD83D\uDC64":"\uD83E\uDD16";Z.push(`${Q} \`${J.sessionId.slice(0,8)}\` (${Y})`),Z.push(` ${J.content}`),Z.push("")}return Z.join(`
1683
1683
  `)}var J_={name:"search",description:"Search past session transcripts",fullDescription:"搜索历史会话记录,查找过去的对话内容",usage:"/search <keyword>",aliases:["find","history"],category:"Session",examples:['/search 断路器 - 搜索包含"断路器"的历史对话',"/search edit tool - 搜索 edit tool 相关讨论"],async handler($,Z){let J=c(Z);if($.length===0)return J.sendMessage("**用法:** `/search <关键词>`\n\n在历史会话中搜索包含指定关键词的对话"),{success:!0,message:"显示帮助"};let Y=$.join(" ");J.sendMessage(`正在搜索: "${Y}" ...`);try{let Q=await JV(Y,{maxResults:15,projectPath:Z.cwd}),X=YV(Q);return J.sendMessage(X),{success:!0,message:`found ${Q.length} results`,data:{matches:Q.length}}}catch(Q){let X=Q instanceof Error?Q.message:"未知错误";return J.sendMessage(`搜索失败: ${X}`),{success:!1,error:X}}}},QV=J_;var Y_={name:"skills",description:"查看所有可用的 Skills",fullDescription:"显示所有已发现的 Skills 及其详细信息,包括名称、描述、来源和允许的工具。",usage:"/skills",category:"system",examples:["/skills"],handler:async($,Z)=>{try{let J=Z.workspaceRoot??Z.cwd;return await f$(J,async(Y)=>{await Y.skills.refresh(),i1(J),await l1(J)}),{success:!0,message:"show_skills_manager",data:{action:"show_skills_manager"}}}catch(J){let Y=`获取 Skills 失败: ${J instanceof Error?J.message:"未知错误"}`;return d().addAssistantMessage(Y),{success:!1,error:Y}}}},XV=Y_;import Q_ from"node:path";function O8($){if($<1000)return`${$}ms`;let Z=Math.floor($/1000);if(Z<60)return`${Z}s`;let J=Math.floor(Z/60);if(J<60)return`${J}m ${Z%60}s`;return`${Math.floor(J/60)}h ${J%60}m`}function WV($){switch($){case"running":return"[RUNNING]";case"completed":case"exited":return"[OK]";case"failed":case"error":return"[FAIL]";case"killed":case"cancelled":return"[STOPPED]";default:return"[?]"}}function VV($,Z){if($.length<=Z)return $;return $.slice(0,Z-3)+"..."}async function X_($,Z){let J=c(Z),Y=$[0],Q=Y0.getInstance(),X=D0.getInstance(),W=Z.sessionId??"",V=Z.sessionId?{sessionId:Z.sessionId,projectPath:Q_.resolve(Z.workspaceRoot??Z.cwd)}:void 0;if(Y==="resume"){let D=$[1],w=$.slice(2).join(" ").trim();if(!D||!w)return{success:!1,error:"Usage: /tasks resume <agentId> <prompt>"};if(!Z.subagents)return{success:!1,error:"This surface does not own a subagent runtime"};let q=await Z.subagents.resume(D,w),F=`Resumed \`${D}\` as \`${q.session.id}\` (depth ${q.session.resumeDepth}).`;return J.sendMessage(F),{success:!0,message:F,data:{action:"subagent_resumed",sourceAgentId:D,subagent:q.session}}}if(Y==="clean"){let D=X.cleanupExpiredSessionsForParent(V??W,0);return J.sendMessage(`已清理 ${D} 个已完成的 Agent 会话`),{success:!0,message:`Cleaned ${D} agent sessions`}}let U=[`**后台任务列表**
@@ -1,2 +1,2 @@
1
- import{V as I}from"./chunk-d2nz3pfs.js";import{he as M}from"./chunk-ycafgg7y.js";import P from"node:path";function w(s){let a=s.replace(/\s+/g," ").trim();return a.length<=72?a:`${a.slice(0,69)}...`}function W(s){let a=s.replace(/\s+/g," ").trim();return a.length<=500?a:`${a.slice(0,497)}...`}function A(s){return`task/${s.replace(/[^a-zA-Z0-9_-]/g,"-").slice(0,40)}`}class C{static async createSessionTask(s){if(!s.prompt.trim())throw Error("Task prompt must not be blank");if(!P.isAbsolute(s.sourceProjectPath))throw Error("Task source project path must be absolute");let a=P.resolve(s.sourceProjectPath),t;try{return t=s.isolation==="worktree"?await I.enter({sessionId:s.sessionId,workspaceRoot:a,name:A(s.sessionId)}):void 0,{metadata:await M.createSessionMetadata(s.sessionId,t?.workspaceRoot??a,{title:s.title?.trim()||w(s.prompt),taskPromptSummary:W(s.prompt),taskPriority:s.taskPriority,taskKind:s.taskKind,taskDueAt:s.taskDueAt,taskDispatch:s.dispatch,taskModelId:s.dispatch?.modelId,selectedModelId:s.dispatch?.modelId,permissionMode:s.dispatch?.permissionMode,reasoningEffort:s.dispatch?.reasoningEffort,serviceTier:s.dispatch?.serviceTier,responseVerbosity:s.dispatch?.responseVerbosity,communicationStyle:s.dispatch?.communicationStyle,communicationStyleDigest:s.dispatch?.communicationStyleDigest,projectInstructionsDigest:s.dispatch?.projectInstructionsDigest,taskRetriedFrom:s.retriedFrom,taskIsolation:s.isolation,taskSourceProjectPath:a,taskWorktree:t}),taskWorktree:t}}catch(k){if(t)await I.exit({sessionId:s.sessionId,action:"remove",discardChanges:!0}).catch(()=>{return});throw k}}}var $=256,V=8388608,x=30000;class i extends Error{kind;pendingItems;pendingBytes;constructor(s,a,t){super(a,t);this.kind=s;this.name="BoundedSerialEgressError",this.pendingItems=t?.pendingItems,this.pendingBytes=t?.pendingBytes}}function T(s){s.catch(()=>{return})}class K{options;pending=[];flushWaiters=[];pendingBytes=0;nextSequence=0;completedSequence=0;draining=!1;closed=!1;failure;activeWriteAbort;activeWriteStop;activeWriteTimeout;constructor(s){this.options=s;if(this.assertPositiveInteger(s.maxPendingItems,"maxPendingItems"),this.assertPositiveInteger(s.maxPendingBytes,"maxPendingBytes"),this.assertPositiveInteger(s.writeTimeoutMs,"writeTimeoutMs"),s.signal?.addEventListener("abort",this.handleAbort,{once:!0}),s.signal?.aborted)this.handleAbort()}offer(s){if(this.closed)return{accepted:!1,error:this.failure??new i("closed","Egress is already closed")};let a;try{a=this.options.sizeOf(s)}catch(h){return this.rejectAdmission(new i("invalid_size","Egress size calculation failed",{cause:h}))}if(!Number.isSafeInteger(a)||a<0)return this.rejectAdmission(new i("invalid_size","Egress size must be a non-negative safe integer"));if(a>this.options.maxPendingBytes)return this.rejectAdmission(new i("oversized",`Egress value requires ${a} bytes; limit is ${this.options.maxPendingBytes}`));if(this.pending.length>=this.options.maxPendingItems||this.pendingBytes+a>this.options.maxPendingBytes)return this.rejectAdmission(new i("overflow",`Egress pending limit exceeded (${this.pending.length} items, ${this.pendingBytes} bytes)`));let t,k,c=new Promise((h,m)=>{t=h,k=m});return T(c),this.nextSequence+=1,this.pending.push({value:s,bytes:a,sequence:this.nextSequence,resolve:t,reject:k,completion:c}),this.pendingBytes+=a,this.startDrain(),{accepted:!0,completion:c}}flush(){if(this.failure){let c=Promise.reject(this.failure);return T(c),c}let s=this.nextSequence;if(s<=this.completedSequence)return Promise.resolve();let a,t,k=new Promise((c,h)=>{a=c,t=h});return T(k),this.flushWaiters.push({targetSequence:s,resolve:a,reject:t}),k}close(s){let a=s instanceof i?s:new i("closed","Egress was closed",{cause:s});this.fail(a)}stats(){return{closed:this.closed,pendingItems:this.pending.length,pendingBytes:this.pendingBytes}}handleAbort=()=>{this.fail(new i("aborted","Egress was aborted",{cause:this.options.signal?.reason}))};rejectAdmission(s){return this.fail(s),{accepted:!1,error:s}}startDrain(){if(this.draining||this.closed)return;this.draining=!0;let s=this.drain();T(s)}async drain(){try{while(!this.closed){let s=this.pending[0];if(!s)return;try{await this.writeOne(s.value)}catch(a){this.fail(this.normalizeWriteError(a));return}if(this.closed||this.pending[0]!==s)return;this.pending.shift(),this.pendingBytes-=s.bytes,this.completedSequence=s.sequence,s.resolve(),this.settleFlushWaiters()}}finally{if(this.draining=!1,!this.closed&&this.pending.length>0)this.startDrain()}}async writeOne(s){let a=new AbortController;this.activeWriteAbort=a;let t,k,c=new Promise((S,f)=>{k=f});T(c),this.activeWriteStop=k;let h=Promise.resolve().then(()=>this.options.write(s,a.signal));T(h);let m=new Promise((S,f)=>{t=setTimeout(()=>{let D=new i("write_timeout",`Egress write timed out after ${this.options.writeTimeoutMs}ms`);a.abort(D),f(D)},this.options.writeTimeoutMs),this.activeWriteTimeout=t});T(m);try{await Promise.race([h,m,c])}finally{if(t!==void 0)clearTimeout(t);if(this.activeWriteTimeout===t)this.activeWriteTimeout=void 0;if(this.activeWriteAbort===a)this.activeWriteAbort=void 0;if(this.activeWriteStop===k)this.activeWriteStop=void 0}}normalizeWriteError(s){if(s instanceof i)return s;return new i("write_failed","Egress write failed",{cause:s})}fail(s){if(this.closed)return;if(s.pendingItems??=this.pending.length,s.pendingBytes??=this.pendingBytes,this.closed=!0,this.failure=s,this.options.signal?.removeEventListener("abort",this.handleAbort),this.activeWriteTimeout!==void 0)clearTimeout(this.activeWriteTimeout),this.activeWriteTimeout=void 0;this.activeWriteAbort?.abort(s),this.activeWriteStop?.(s),this.activeWriteAbort=void 0,this.activeWriteStop=void 0;let a=this.pending.splice(0);this.pendingBytes=0;for(let t of a)t.reject(s);for(let t of this.flushWaiters.splice(0))t.reject(s);try{this.options.onFailure?.(s)}catch{}}settleFlushWaiters(){for(let s=0;s<this.flushWaiters.length;){let a=this.flushWaiters[s];if(a.targetSequence>this.completedSequence){s+=1;continue}this.flushWaiters.splice(s,1),a.resolve()}}assertPositiveInteger(s,a){if(!Number.isSafeInteger(s)||s<=0)throw RangeError(`${a} must be a positive safe integer`)}}
1
+ import{V as I}from"./chunk-va2ep9wa.js";import{he as M}from"./chunk-0360afm9.js";import P from"node:path";function w(s){let a=s.replace(/\s+/g," ").trim();return a.length<=72?a:`${a.slice(0,69)}...`}function W(s){let a=s.replace(/\s+/g," ").trim();return a.length<=500?a:`${a.slice(0,497)}...`}function A(s){return`task/${s.replace(/[^a-zA-Z0-9_-]/g,"-").slice(0,40)}`}class C{static async createSessionTask(s){if(!s.prompt.trim())throw Error("Task prompt must not be blank");if(!P.isAbsolute(s.sourceProjectPath))throw Error("Task source project path must be absolute");let a=P.resolve(s.sourceProjectPath),t;try{return t=s.isolation==="worktree"?await I.enter({sessionId:s.sessionId,workspaceRoot:a,name:A(s.sessionId)}):void 0,{metadata:await M.createSessionMetadata(s.sessionId,t?.workspaceRoot??a,{title:s.title?.trim()||w(s.prompt),taskPromptSummary:W(s.prompt),taskPriority:s.taskPriority,taskKind:s.taskKind,taskDueAt:s.taskDueAt,taskDispatch:s.dispatch,taskModelId:s.dispatch?.modelId,selectedModelId:s.dispatch?.modelId,permissionMode:s.dispatch?.permissionMode,reasoningEffort:s.dispatch?.reasoningEffort,serviceTier:s.dispatch?.serviceTier,responseVerbosity:s.dispatch?.responseVerbosity,communicationStyle:s.dispatch?.communicationStyle,communicationStyleDigest:s.dispatch?.communicationStyleDigest,projectInstructionsDigest:s.dispatch?.projectInstructionsDigest,taskRetriedFrom:s.retriedFrom,taskIsolation:s.isolation,taskSourceProjectPath:a,taskWorktree:t}),taskWorktree:t}}catch(k){if(t)await I.exit({sessionId:s.sessionId,action:"remove",discardChanges:!0}).catch(()=>{return});throw k}}}var $=256,V=8388608,x=30000;class i extends Error{kind;pendingItems;pendingBytes;constructor(s,a,t){super(a,t);this.kind=s;this.name="BoundedSerialEgressError",this.pendingItems=t?.pendingItems,this.pendingBytes=t?.pendingBytes}}function T(s){s.catch(()=>{return})}class K{options;pending=[];flushWaiters=[];pendingBytes=0;nextSequence=0;completedSequence=0;draining=!1;closed=!1;failure;activeWriteAbort;activeWriteStop;activeWriteTimeout;constructor(s){this.options=s;if(this.assertPositiveInteger(s.maxPendingItems,"maxPendingItems"),this.assertPositiveInteger(s.maxPendingBytes,"maxPendingBytes"),this.assertPositiveInteger(s.writeTimeoutMs,"writeTimeoutMs"),s.signal?.addEventListener("abort",this.handleAbort,{once:!0}),s.signal?.aborted)this.handleAbort()}offer(s){if(this.closed)return{accepted:!1,error:this.failure??new i("closed","Egress is already closed")};let a;try{a=this.options.sizeOf(s)}catch(h){return this.rejectAdmission(new i("invalid_size","Egress size calculation failed",{cause:h}))}if(!Number.isSafeInteger(a)||a<0)return this.rejectAdmission(new i("invalid_size","Egress size must be a non-negative safe integer"));if(a>this.options.maxPendingBytes)return this.rejectAdmission(new i("oversized",`Egress value requires ${a} bytes; limit is ${this.options.maxPendingBytes}`));if(this.pending.length>=this.options.maxPendingItems||this.pendingBytes+a>this.options.maxPendingBytes)return this.rejectAdmission(new i("overflow",`Egress pending limit exceeded (${this.pending.length} items, ${this.pendingBytes} bytes)`));let t,k,c=new Promise((h,m)=>{t=h,k=m});return T(c),this.nextSequence+=1,this.pending.push({value:s,bytes:a,sequence:this.nextSequence,resolve:t,reject:k,completion:c}),this.pendingBytes+=a,this.startDrain(),{accepted:!0,completion:c}}flush(){if(this.failure){let c=Promise.reject(this.failure);return T(c),c}let s=this.nextSequence;if(s<=this.completedSequence)return Promise.resolve();let a,t,k=new Promise((c,h)=>{a=c,t=h});return T(k),this.flushWaiters.push({targetSequence:s,resolve:a,reject:t}),k}close(s){let a=s instanceof i?s:new i("closed","Egress was closed",{cause:s});this.fail(a)}stats(){return{closed:this.closed,pendingItems:this.pending.length,pendingBytes:this.pendingBytes}}handleAbort=()=>{this.fail(new i("aborted","Egress was aborted",{cause:this.options.signal?.reason}))};rejectAdmission(s){return this.fail(s),{accepted:!1,error:s}}startDrain(){if(this.draining||this.closed)return;this.draining=!0;let s=this.drain();T(s)}async drain(){try{while(!this.closed){let s=this.pending[0];if(!s)return;try{await this.writeOne(s.value)}catch(a){this.fail(this.normalizeWriteError(a));return}if(this.closed||this.pending[0]!==s)return;this.pending.shift(),this.pendingBytes-=s.bytes,this.completedSequence=s.sequence,s.resolve(),this.settleFlushWaiters()}}finally{if(this.draining=!1,!this.closed&&this.pending.length>0)this.startDrain()}}async writeOne(s){let a=new AbortController;this.activeWriteAbort=a;let t,k,c=new Promise((S,f)=>{k=f});T(c),this.activeWriteStop=k;let h=Promise.resolve().then(()=>this.options.write(s,a.signal));T(h);let m=new Promise((S,f)=>{t=setTimeout(()=>{let D=new i("write_timeout",`Egress write timed out after ${this.options.writeTimeoutMs}ms`);a.abort(D),f(D)},this.options.writeTimeoutMs),this.activeWriteTimeout=t});T(m);try{await Promise.race([h,m,c])}finally{if(t!==void 0)clearTimeout(t);if(this.activeWriteTimeout===t)this.activeWriteTimeout=void 0;if(this.activeWriteAbort===a)this.activeWriteAbort=void 0;if(this.activeWriteStop===k)this.activeWriteStop=void 0}}normalizeWriteError(s){if(s instanceof i)return s;return new i("write_failed","Egress write failed",{cause:s})}fail(s){if(this.closed)return;if(s.pendingItems??=this.pending.length,s.pendingBytes??=this.pendingBytes,this.closed=!0,this.failure=s,this.options.signal?.removeEventListener("abort",this.handleAbort),this.activeWriteTimeout!==void 0)clearTimeout(this.activeWriteTimeout),this.activeWriteTimeout=void 0;this.activeWriteAbort?.abort(s),this.activeWriteStop?.(s),this.activeWriteAbort=void 0,this.activeWriteStop=void 0;let a=this.pending.splice(0);this.pendingBytes=0;for(let t of a)t.reject(s);for(let t of this.flushWaiters.splice(0))t.reject(s);try{this.options.onFailure?.(s)}catch{}}settleFlushWaiters(){for(let s=0;s<this.flushWaiters.length;){let a=this.flushWaiters[s];if(a.targetSequence>this.completedSequence){s+=1;continue}this.flushWaiters.splice(s,1),a.resolve()}}assertPositiveInteger(s,a){if(!Number.isSafeInteger(s)||s<=0)throw RangeError(`${a} must be a positive safe integer`)}}
2
2
  export{C as B,$ as C,V as D,x as E,i as F,K as G};