blade-code 0.10.164 → 0.10.165
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.
- package/dist/blade.js +2 -2
- package/dist/{chunk-09gn2ah5.js → chunk-10pj0g1r.js} +1 -1
- package/dist/{chunk-d4d8k3fs.js → chunk-1wmcyagp.js} +1 -1
- package/dist/chunk-3wx9aq8m.js +1 -0
- package/dist/{chunk-cawqz33k.js → chunk-3yx1z7vq.js} +2 -2
- package/dist/{chunk-k89nms05.js → chunk-51crjjt1.js} +1 -1
- package/dist/chunk-55z8nm23.js +1 -0
- package/dist/{chunk-550ht3zq.js → chunk-6knxtdzn.js} +5 -5
- package/dist/{chunk-tyz7g60b.js → chunk-6tgjente.js} +1 -1
- package/dist/{chunk-9fvptk89.js → chunk-708ja5cz.js} +1 -1
- package/dist/{chunk-m25gsyt7.js → chunk-73vr1br7.js} +1 -1
- package/dist/{chunk-wvx38688.js → chunk-82sdv0yv.js} +1 -1
- package/dist/{chunk-tn0x2xrg.js → chunk-8eqs5drs.js} +1 -1
- package/dist/{chunk-tt5x15k4.js → chunk-911n2w2b.js} +1 -1
- package/dist/{chunk-1x1j96rx.js → chunk-9430yx31.js} +1 -1
- package/dist/{chunk-w4b72q18.js → chunk-c5ncj6se.js} +1 -1
- package/dist/{chunk-20aw21g5.js → chunk-dzgj64vq.js} +1 -1
- package/dist/{chunk-gjw6emhv.js → chunk-dzhkr1h0.js} +1 -1
- package/dist/{chunk-gbssjm9p.js → chunk-e394p3sh.js} +1 -1
- package/dist/{chunk-at33x380.js → chunk-g570p5bh.js} +1 -1
- package/dist/{chunk-6hgshp48.js → chunk-h1cs69np.js} +1 -1
- package/dist/{chunk-b6b8dt4v.js → chunk-hnnsqhgg.js} +1 -1
- package/dist/{chunk-3b0z6rt5.js → chunk-md7px7ha.js} +1 -1
- package/dist/{chunk-3b38pf4n.js → chunk-ndhdrtef.js} +1 -1
- package/dist/{chunk-12b8berg.js → chunk-p505ms9g.js} +1 -1
- package/dist/{chunk-61m3bxvx.js → chunk-r3fke6yp.js} +1 -1
- package/dist/{chunk-5t26nec1.js → chunk-sg580v6q.js} +1 -1
- package/dist/{chunk-ctfanxj1.js → chunk-tgxa39ay.js} +2 -2
- package/dist/{chunk-xbzya00g.js → chunk-vmckpv2t.js} +1 -1
- package/dist/{chunk-qrs39qym.js → chunk-wa3sdw3c.js} +1 -1
- package/dist/{chunk-y5ezcp90.js → chunk-wac2a806.js} +1 -1
- package/dist/{chunk-4f6qkmst.js → chunk-whbp683s.js} +1 -1
- package/dist/{chunk-sb4z34ky.js → chunk-wkyw8ban.js} +1 -1
- package/dist/{chunk-3yb1qns4.js → chunk-xde27z0w.js} +1 -1
- package/dist/{chunk-r3wf3h15.js → chunk-ye0ev131.js} +1 -1
- package/dist/{chunk-kmm2jddj.js → chunk-yq3982gr.js} +1 -1
- package/dist/{chunk-mag420dh.js → chunk-za40abdc.js} +1 -1
- package/dist/{chunk-89316rjt.js → chunk-zrnzpknv.js} +1 -1
- package/dist/{chunk-jn1c83cw.js → chunk-zw8q8dye.js} +1 -1
- package/package.json +1 -1
- package/dist/chunk-azgqxeg1.js +0 -1
- package/dist/chunk-g8ppb5hy.js +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{Ga as z3}from"./chunk-g01mth5d.js";import{Ja as T,Ka as $$,Pa as Vz,Qa as RY,Ra as e0}from"./chunk-
|
|
1
|
+
import{Ga as z3}from"./chunk-g01mth5d.js";import{Ja as T,Ka as $$,Pa as Vz,Qa as RY,Ra as e0}from"./chunk-c5ncj6se.js";import{$a as HX,Sa as Y5,Va as pZ,Za as tZ,_a as UX,bb as rz,db as nz,eb as A9,wb as az}from"./chunk-30x3mcsb.js";import{Ab as c7,Bb as D2,Cb as BY,Db as x1,Eb as a7,Fb as KY,Gb as $Y,Hb as DY,Ib as qY,Jb as WQ,Lb as JX,Nb as W0,Pb as _2,Sb as p4,Ub as _Z,Vb as l4,Wb as i4,Yb as AJ,Zb as R$,dc as aX,ec as G8,fc as sX,gc as ZX,ic as u1,jc as SX,oc as iY,rc as rY,xb as s5,yb as h7,zb as J1}from"./chunk-3yx1z7vq.js";import{$c as r8,$d as lY,Ac as k3,Bc as T1,Cc as ZJ,Dc as _0,Ec as S2,Fc as N1,Gc as S6,Hc as f9,Ic as m4,Jc as c4,Kc as JY,Lc as YY,Mc as CX,Nc as X3,Nd as W8,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 Jz,Yc as d2,Yd as VX,Zc as H3,_c as m2,ad as M1,bd as e1,cd as c2,dd as $2,ed as Z2,ee as fX,fd as d6,fe as PX,gd as J2,hd as m6,he as s,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 MX,zc as r3}from"./chunk-g570p5bh.js";import{ie as l,je as BQ,ke as GQ,le as IJ,ne as F2}from"./chunk-53fc0yrq.js";import{Ge as P9,He as J$,Ie as q2,Je as $9,Ke as TX,Le as RX,Ue as ez,ff as $W,pe as oz,se as tz}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 cY,cg as B2}from"./chunk-708ja5cz.js";import{dg as d1}from"./chunk-t0gm0pn1.js";import{hg as jZ,ig as pY,ng as dY,og as mX,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 tX}from"./chunk-50vwafn5.js";import{Ag as bX,xg as LX,yg as OX,zg as NX}from"./chunk-e394p3sh.js";import{$g as AX,Bg as I4,Cg as h4,Dg as g4,Fg as u4,Gg as d4,Hg as _1,Ig as FQ,Jg as I$,Kg as j$,Lg as G$,Mg as $5,Ng as W2,Og as H8,Pg as l1,Qg as i1,Rg as EX,Vg as J9,Xg as c0,Yg as f$,_g as k4,ah as kX}from"./chunk-md7px7ha.js";import{ch as D1,eh as T$,fh as O4}from"./chunk-3kszepm6.js";import{gh as d3,hh as z2,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 _z,th as jX,uh as z8,vh as bJ}from"./chunk-vbjgcn49.js";import{xh as L9,zh as x0}from"./chunk-p505ms9g.js";import{Ah as E6,Bh as R9,Ch as A6,Dh as r1}from"./chunk-3y2x6fb6.js";import{Ci as PY,Di as SY,Ei as kY,Fh as XJ,Fi as vY,Gi as AZ,Hi as yY,Ii as B1,Ji as xY,Kh as zJ,Ki as IY,Li as hY,Mh as D9,Ni as t3,Pi as yX,Qi as _X,Rh as Wz,Ri as B0,Vh as WJ,Xh as qX,Zh as UY,_h as HY,pi as h1,si as e7}from"./chunk-wa3sdw3c.js";import{Ui as L$}from"./chunk-kv458q06.js";import{Wi as eQ,Yi as $X}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 wX,Pj as FX}from"./chunk-j8hbddjp.js";import{Qj as Oz,Tj as wz}from"./chunk-4cdk4mds.js";import{Xj as Ez}from"./chunk-whbp683s.js";import{bk as vX,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 t7,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 _W}from"node:crypto";var KW=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);
|
|
@@ -845,7 +845,7 @@ ${Q}
|
|
|
845
845
|
`+U.additionalContext}if(tB(U.modifiedOutput))Object.assign(J,U.modifiedOutput);if(U.warning)console.warn(`[PostToolUseHook Warning] ${U.warning}`)}catch(V){console.error("[ToolExecutionHooks] Error executing post-tool hooks:",V)}}function tB($){return typeof $==="object"&&$!==null&&!Array.isArray($)}var EY=["EBUSY","EAGAIN","EMFILE","ENFILE"],eB=2,AY=200;async function CY($,Z){let J=Date.now(),Y,Q=$.isRetrySafe?eB:0;for(let X=0;X<=Q;X++)try{let z=await $.execute(Z.signal??new AbortController().signal,Z.onProgress,Z);if(!z.success&&X<Q&&MY(z.error)){await jZ(AY*(X+1),Z.signal,{throwOnAbort:!0});continue}if(z.metadata??={},z.metadata.duration=Date.now()-J,X>0)z.metadata.retriedAttempts=X;return z}catch(z){if(Y=z instanceof Error?z:Error(String(z)),X>=Q||!MY(Y))break;await jZ(AY*(X+1),Z.signal,{throwOnAbort:!0})}throw Y??Error("Tool execution failed")}function MY($){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,z=typeof X.code==="string"?X.code:void 0,W=typeof X.message==="string"?X.message:void 0;if(z!==void 0&&EY.includes(z)||W!==void 0&&EY.some((V)=>W.includes(V)))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 z6 extends $G{registry;executionHistory=[];maxHistorySize;scheduler;toolWhitelist;toolBlacklist;permissionResolver;approvalController;concurrencyGate=new NZ;contextDefaults;remoteContextDefaults;preToolUseHookRunner;trustedRuntimePolicy;autoVerifyRuntime;lspManager;onDispose;workspaceToolPolicy;ownerId=`tool-executor-${TY()}`;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=ZG(Z.contextDefaults),this.trustedRuntimePolicy=pJ(Z.workspaceToolPolicy),this.remoteContextDefaults=this.workspaceToolPolicy?.kind==="acp-remote"?JG(this.contextDefaults):void 0,this.preToolUseHookRunner=bY,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_${TY()}`,X=this.remoteContextDefaults,z=X!==void 0,W=this.trustedRuntimePolicy&&this.workspaceToolPolicy?.kind==="local",V=cJ({...this.contextDefaults,...J,sessionId:z?X.sessionId:J.sessionId??this.contextDefaults.sessionId??this.ownerId,workspaceRoot:z?X.workspaceRoot:J.workspaceRoot??this.contextDefaults.workspaceRoot,executionRoot:z?X.executionRoot:J.executionRoot??this.contextDefaults.executionRoot,workspaceKind:z?"acp-remote":W?"local":J.workspaceKind??this.contextDefaults.workspaceKind,worktreeIsolationRequired:z?!1:J.worktreeIsolationRequired??this.contextDefaults.worktreeIsolationRequired,worktreeActive:z?!1:J.worktreeActive??this.contextDefaults.worktreeActive,environment:z?X.environment:{...this.contextDefaults.environment,...J.environment}},this.trustedRuntimePolicy?this.workspaceToolPolicy:void 0);return this.emit("executionStarted",{executionId:Q,toolName:$,params:Z,context:V,timestamp:Y}),this.executeFlow($,Z,V,Q,Y)}async executeFlow($,Z,J,Y,Q){let X=Z;try{let z=await this.runTool($,Z,J,Y,(W)=>{X=W});return this.completeExecution(Y,$,X,J,z,Q),z}catch(z){let W=this.projectAdmissionFailure($,z);if(W){let V=T4(W,Y,$);return this.completeExecution(Y,$,X,J,V,Q),V}return this.failExecution(Y,$,X,J,z,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 z=this.registry.getBuiltinTools().includes(X);if(this.workspaceToolPolicy){if(z){let U=D5(this.workspaceToolPolicy,$);if(!U.allowed)return lJ(U.reason)}}let W=OY(X,Z,this.toolWhitelist,this.toolBlacklist);if("success"in W)return W;Q(W.params);let V=this.validateRemoteDeclaredPaths($,X,W.invocation,z);if(V)return V;return this.concurrencyGate.run(X.parallelism==="shared"||X.parallelism===void 0&&X.isConcurrencySafe,async()=>{if(J.signal?.aborted)return o0(!0);let{params:U,invocation:H}=W,B=await bZ(X,U,J,H);if(B)return B;let G=this.permissionResolver.resolveRulePermission(X,H,U,J),D=await this.preToolUseHookRunner(X,U,H,J,G.decision);if(D.rejection)return D.rejection;H=D.invocation;let w=H.params;if(typeof w!=="object"||w===null||Array.isArray(w))return G0("Hook modified parameters must be an object",{errorType:"validation_error"});if(U=w,Q(U),D.inputModified){let A=this.validateRemoteDeclaredPaths($,X,H,z);if(A)return A;let S=await bZ(X,U,J,H);if(S)return S;G=this.permissionResolver.resolveRulePermission(X,H,U,J)}let q=wY(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 _=await this.approvalController.confirmIfNeeded(X,H,U,q,G.signature,J);if(_)return _;if(J.signal?.aborted)return o0(!0);let L=!1,F=()=>{if(J.signal?.aborted)return Promise.resolve(o0(!0));return L=!0,CY(H,J)},O=U.file_path??U.notebook_path,b=this.workspaceToolPolicy?.kind==="acp-remote"||F$(J.sessionId),N=X.kind==="readonly"&&X.name==="Read"&&b,E=(!X.isConcurrencySafe||N)&&O?b?()=>{let A=w$(J.sessionId);if(!(A instanceof v0))throw Error("ACP remote filesystem service is unavailable for file lock routing");return b0.getInstance().acquireOpaqueLock(A.createOpaqueLockKey(String(O)),F)}:()=>b0.getInstance().acquireLock(String(O),F):F,j=await this.scheduler.schedule({ownerId:this.ownerId,sessionId:J.sessionId??this.ownerId,kind:X.kind,signal:J.signal,onAbort:()=>o0(!0),onQueued:(A)=>{J.onProgressUpdate?.({message:"Waiting for tool execution capacity",admission:A})}},E);if(J.signal?.aborted&&!R4(j))return o0(!L);if(j.metadata?.abortedBeforeLaunch===!0)return j;if(await jY(X,U,j,J,D.toolUseId),J.signal?.aborted&&!R4(j))return o0(!1);if(await this.lspManager?.afterToolUse(X.name,U,j,J),J.signal?.aborted&&!R4(j))return o0(!1);if(await this.autoVerifyRuntime?.verify(X.name,U,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 z=Date.now();this.addToHistory({executionId:$,toolName:Z,params:J,result:Q,startTime:X,endTime:z,context:Y}),this.emit("executionCompleted",{executionId:$,toolName:Z,result:Q,duration:z-X,timestamp:z})}async failExecution($,Z,J,Y,Q,X){let z=Q instanceof Error?Q:Error(String(Q)),W=Date.now(),V=z.message.includes("timeout")||z.name==="TimeoutError",U={success:!1,llmContent:`Tool execution failed: ${z.message}`,error:{type:V?"timeout_error":"execution_error",message:z.message}};if(Y.workspaceKind==="acp-remote")return this.addToHistory({executionId:$,toolName:Z,params:J,result:U,startTime:X,endTime:W,context:Y}),T4(U,$,Z);try{let H=await x0.getInstance().executePostToolUseFailureHooks(Z,`tool_use_${$}`,J,z.message,{projectDir:Y.workspaceRoot||C(),sessionId:Y.sessionId||"unknown",permissionMode:Y.permissionMode||"default",isInterrupt:!1,isTimeout:V,abortSignal:Y.signal});if(H.additionalContext)U={...U,llmContent:`${U.llmContent}
|
|
846
846
|
|
|
847
847
|
${H.additionalContext}`};if(H.warning)console.warn(`[ToolExecutor] PostToolUseFailure hook warning: ${H.warning}`)}catch(H){console.warn("[ToolExecutor] PostToolUseFailure hook execution failed:",H)}return this.addToHistory({executionId:$,toolName:Z,params:J,result:U,startTime:X,endTime:W,context:Y}),this.emit("executionFailed",{executionId:$,toolName:Z,error:z,duration:W-X,timestamp:W}),U}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 z=Q++,W=$[z];Y[z]=await this.execute(W.toolName,W.params,W.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,z=new Set;for(let V of[X.file_path,X.notebook_path])if(typeof V==="string")z.add(V);let W=Y&&$==="ApplyPatch";if(!W&&Z.kind==="write"&&typeof X.path==="string")z.add(X.path);if(!W){let V;try{V=J.getAffectedPaths()}catch{return h$({mutation:Z.kind!=="readonly"})}for(let U of V)if(typeof U==="string")z.add(U)}try{for(let V of z)X$(V,this.workspaceToolPolicy.pathStyle);return}catch(V){if(!(V instanceof N$))throw V;return h$({mutation:Z.kind!=="readonly"})}}}function ZG($){let Z=$?.environment?Object.freeze({...$.environment}):void 0;return Object.freeze({...$,...Z?{environment:Z}:{}})}function JG($){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 YG}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(`
|
|
848
|
-
`)}reset(){this.loadedTools=new Set(f4),this.deferredTools.clear()}}class H1 extends YG{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=$}waitForMcpCatalogIdle(){return this.mcpCatalogBarrier()}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(($)=>F2($.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 H1;$.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=RY($);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 W6{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 _2(this.options.projectPath,100,void 0,this.options.stateStorage)}async initialize(){await this.persistent.initialize()}async saveMessage($,Z,J,Y=null,Q,X,z){return this.persistent.saveMessage($,Z,J,Y,Q,X,z)}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,z,W,V){return this.persistent.saveToolResult($,Z,J,Y,Q,X,z,W,V)}async saveCompaction($,Z,J,Y=null){return this.persistent.saveCompaction($,Z,J,Y)}async recordTokenBudgetHandoff($,Z){return this.persistent.recordTokenBudgetHandoff($,Z)}}class V6{chatService;contextManager;memoryAdapter;constructor($,Z,J,Y){this.chatService=$,this.contextManager=Z||new W6({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 fY extends Error{constructor(){super("Active operation gate is closed");this.name="ActiveOperationGateClosedError"}}class U6{accepting=!0;leases=new Set;idleWaiters=new Set;shutdownPromise;enter($){if(!this.accepting)throw new fY;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 gY extends Error{constructor($){super(`Task already owns an admission slot or queue entry: ${$}`);this.name="TaskAdmissionConflictError"}}class H6 extends Error{constructor($="Task admission was cancelled"){super($);this.name="TaskAdmissionCancelledError"}}class uY{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 gY($.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((V,U)=>{J=V,Y=U});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},z=(V)=>{this.cancelPending(X,new H6(V||void 0))},W={ready:Q,getSnapshot:()=>({...X.snapshot}),cancel:z,release:()=>{if(X.permit)X.permit.release();else z("Task admission released before execution")}};if(this.activeKeys.add($.key),$.signal?.aborted)return z(String($.signal.reason||"Task admission was cancelled")),W;if($.signal)X.abortListener=()=>z(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 W}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 H6("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(!xY($))throw Error(`maxConcurrent must be an integer between ${PY} and ${SY}`);if(!IY(Z))throw Error(`maxQueued must be an integer between ${kY} and ${vY}`);if(!hY(J))throw Error(`maxQueuedBytes must be an integer between ${yY} 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 uY;function mY($){let Z=$.pendingMessages&&$.pendingMessages.length>0?$.pendingMessages.map((Y)=>[Y.content,Y.outputSchema,Y.metadata]):[$.content,$.outputSchema],J=dY(Z,{maxBytes:B1});if(J>Math.floor(B1/2))return B1+1;return Math.max(1,J*2)}var a=e("Agent");function XG($){return!$.success&&pY($.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 U6;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 H1,Z={...this.config.permissions,...this.runtimeOptions.permissions},J=this.runtimeOptions.permissionMode??this.config.permissionMode??"default";return new z6($,{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=cY(),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 V6(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(`没有可用的模型配置
|
|
848
|
+
`)}reset(){this.loadedTools=new Set(f4),this.deferredTools.clear()}}class H1 extends YG{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(($)=>F2($.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 H1;$.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=RY($);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 W6{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 _2(this.options.projectPath,100,void 0,this.options.stateStorage)}async initialize(){await this.persistent.initialize()}async saveMessage($,Z,J,Y=null,Q,X,z){return this.persistent.saveMessage($,Z,J,Y,Q,X,z)}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,z,W,V){return this.persistent.saveToolResult($,Z,J,Y,Q,X,z,W,V)}async saveCompaction($,Z,J,Y=null){return this.persistent.saveCompaction($,Z,J,Y)}async recordTokenBudgetHandoff($,Z){return this.persistent.recordTokenBudgetHandoff($,Z)}}class V6{chatService;contextManager;memoryAdapter;constructor($,Z,J,Y){this.chatService=$,this.contextManager=Z||new W6({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 fY extends Error{constructor(){super("Active operation gate is closed");this.name="ActiveOperationGateClosedError"}}class U6{accepting=!0;leases=new Set;idleWaiters=new Set;shutdownPromise;enter($){if(!this.accepting)throw new fY;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 gY extends Error{constructor($){super(`Task already owns an admission slot or queue entry: ${$}`);this.name="TaskAdmissionConflictError"}}class H6 extends Error{constructor($="Task admission was cancelled"){super($);this.name="TaskAdmissionCancelledError"}}class uY{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 gY($.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((V,U)=>{J=V,Y=U});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},z=(V)=>{this.cancelPending(X,new H6(V||void 0))},W={ready:Q,getSnapshot:()=>({...X.snapshot}),cancel:z,release:()=>{if(X.permit)X.permit.release();else z("Task admission released before execution")}};if(this.activeKeys.add($.key),$.signal?.aborted)return z(String($.signal.reason||"Task admission was cancelled")),W;if($.signal)X.abortListener=()=>z(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 W}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 H6("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(!xY($))throw Error(`maxConcurrent must be an integer between ${PY} and ${SY}`);if(!IY(Z))throw Error(`maxQueued must be an integer between ${kY} and ${vY}`);if(!hY(J))throw Error(`maxQueuedBytes must be an integer between ${yY} 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 uY;function mY($){let Z=$.pendingMessages&&$.pendingMessages.length>0?$.pendingMessages.map((Y)=>[Y.content,Y.outputSchema,Y.metadata]):[$.content,$.outputSchema],J=dY(Z,{maxBytes:B1});if(J>Math.floor(B1/2))return B1+1;return Math.max(1,J*2)}var a=e("Agent");function XG($){return!$.success&&pY($.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 U6;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 H1,Z={...this.config.permissions,...this.runtimeOptions.permissions},J=this.runtimeOptions.permissionMode??this.config.permissionMode??"default";return new z6($,{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=cY(),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 V6(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(`没有可用的模型配置
|
|
849
849
|
|
|
850
850
|
`+`请先使用以下命令添加模型:
|
|
851
851
|
`+` /model add
|
|
@@ -859,7 +859,7 @@ ${A0}
|
|
|
859
859
|
</approved-plan>
|
|
860
860
|
|
|
861
861
|
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}]}v=yield*this.runLoop(S$,b,{...x,inputMessageId:void 0})}if(!this.sessionRuntime||!I)return v;let p=await this.sessionRuntime.recordGoalProgress({tokens:v.metadata?.tokensUsed??0,elapsedMs:v.metadata?.duration??0,...k?{goalId:k.goalId,objective:k.objective,turnId:I.id}:{},executionHostFailureCategory:v.metadata?.executionHostFailureCategory,prematureStopPattern:v.success?VY(v.finalMessage):void 0});if(p)yield{kind:"goal_updated",goal:p};if(!v.success||b.signal?.aborted){if(p=await this.sessionRuntime.pauseActiveGoal(b.signal?.aborted?"goal paused after user cancellation":v.error?.message??"goal paused after turn failure"),p)yield{kind:"goal_updated",goal:p}}if(v.success&&!b.signal?.aborted&&h<20)await this.sessionRuntime.waitForBackgroundSubagentFollowUp(I,b.signal);let n=v.success&&!b.signal?.aborted&&h<20,p0=XG(v)||!v.success&&v.error?.type==="max_turns_exceeded";if(R=await this.sessionRuntime.finishTurn(I,{continuePending:n,...p0?{acknowledgeInput:!0}:{},outcome:v.success&&!b.signal?.aborted?{status:"completed",turnsCount:v.metadata?.turnsCount??0,toolCallsCount:v.metadata?.toolCallsCount??0,durationMs:v.metadata?.duration??0}:{status:"aborted",cause:b.signal?.aborted?"cancelled":"failed",turnsCount:v.metadata?.turnsCount??0,toolCallsCount:v.metadata?.toolCallsCount??0,durationMs:v.metadata?.duration??0}}),R){h++,N=!0,M=!1,j=null,O="",o=void 0,A="",S=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()},!v.success||b.signal?.aborted)return v;if(p=await this.sessionRuntime.getGoal(),!p||p.status!=="active"&&p.status!=="verifying")return v;let J0=await this.sessionRuntime.prepareGoalContinuation(p);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:v.metadata?.turnsCount??0,toolCallsCount:v.metadata?.toolCallsCount??0,duration:v.metadata?.duration??0}}}let h0=await this.sessionRuntime.beginGoalTurn(J0.goal);if(!h0)return v;j=h0.goal,q={...J0,goal:h0.goal},R=h0.handle,N=!1,M=!0,O=S5(j),o=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 _=typeof H==="string"?H:H.filter((O)=>O.type==="text").map((O)=>O.text).join(`
|
|
862
|
-
`),L={id:this.generateTaskId(),type:"simple",prompt:_};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-jn1c83cw.js");return Y(this.chatStream($,Z,J))}async*runPlanLoop($,Z,J){a.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((z)=>z.type==="text");if(X.length>0){let z=X[0];Q=$.map((W)=>W===z?{type:"text",text:t2(z.text)}:W)}else Q=[{type:"text",text:t2("")},...$]}return yield*this.executeLoop(Q,Z,J,Y)}async*runLoop($,Z,J){a.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 rY(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,z=J.output,W={success:X,llmContent:typeof z==="string"||z!==null&&typeof z==="object"?z:z===null?J.error?`Subagent execution failed: ${J.error}.`:"":String(z),...J.error?{error:{type:"execution_error",message:J.error}}:{},...Q?{metadata:Q}:{}},V=[{kind:"tool_result",toolCall:Y,result:W}],U=iY(Y,W);if(U)V.push(U);return V})}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=$,a.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);a.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);a.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){a.debug(`[MainAgent] ${$}`,Z||"")}error($,Z){a.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("系统提示配置验证成功"),a.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});a.debug(`Registering ${$.length} builtin tools...`),this.toolExecutor.getRegistry().registerAll($);let Z=this.toolExecutor.getRegistry().getAll().length;a.debug(`Builtin tools registered: ${Z} tools`),a.debug(`[Tools] ${this.toolExecutor.getRegistry().getAll().map((J)=>J.name).join(", ")}`),await this.registerMcpTools()}catch($){throw a.error("Failed to register builtin tools:",$),$}}async registerMcpTools(){try{let $=await z4({workspaceRoot:C(),storeServers:this.config.mcpServers??{},cliConfigs:this.runtimeOptions.mcpConfig,strictCliConfig:this.runtimeOptions.strictMcpConfig});if(Object.keys($).length===0){a.debug("No MCP servers configured");return}let Z=e0.createIsolated({artifactWriter:new o2(`legacy-${QG()}`)});this.legacyMcpRegistry=Z;for(let[X,z]of Object.entries($))try{a.debug(`Connecting to MCP server: ${X}`),await Z.registerServer(X,z),a.debug(`MCP server "${X}" connected`)}catch(W){a.warn(`Warning: MCP server "${X}" connection failed:`,W)}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)a.debug(`Registered ${Y.tools.length} MCP tools`),a.debug(`[MCP Tools] ${Y.tools.map((X)=>X.name).join(", ")}`)}catch($){a.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)a.debug(`Loaded ${Z} subagents: ${this.subagentRegistry.getAllNames().join(", ")}`);else a.debug("No subagents configured")}applySkillToolRestrictions($){if(!this.activeSkillContext?.allowedTools)return $;let Z=this.activeSkillContext.allowedTools;a.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 a.debug(`Filtered tools: ${J.map((Y)=>Y.name).join(", ")} (${J.length}/${$.length})`),J}clearSkillContext(){if(this.activeSkillContext)a.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(`
|
|
862
|
+
`),L={id:this.generateTaskId(),type:"simple",prompt:_};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-zw8q8dye.js");return Y(this.chatStream($,Z,J))}async*runPlanLoop($,Z,J){a.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((z)=>z.type==="text");if(X.length>0){let z=X[0];Q=$.map((W)=>W===z?{type:"text",text:t2(z.text)}:W)}else Q=[{type:"text",text:t2("")},...$]}return yield*this.executeLoop(Q,Z,J,Y)}async*runLoop($,Z,J){a.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 rY(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,z=J.output,W={success:X,llmContent:typeof z==="string"||z!==null&&typeof z==="object"?z:z===null?J.error?`Subagent execution failed: ${J.error}.`:"":String(z),...J.error?{error:{type:"execution_error",message:J.error}}:{},...Q?{metadata:Q}:{}},V=[{kind:"tool_result",toolCall:Y,result:W}],U=iY(Y,W);if(U)V.push(U);return V})}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=$,a.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);a.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);a.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){a.debug(`[MainAgent] ${$}`,Z||"")}error($,Z){a.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("系统提示配置验证成功"),a.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});a.debug(`Registering ${$.length} builtin tools...`),this.toolExecutor.getRegistry().registerAll($);let Z=this.toolExecutor.getRegistry().getAll().length;a.debug(`Builtin tools registered: ${Z} tools`),a.debug(`[Tools] ${this.toolExecutor.getRegistry().getAll().map((J)=>J.name).join(", ")}`),await this.registerMcpTools()}catch($){throw a.error("Failed to register builtin tools:",$),$}}async registerMcpTools(){try{let $=await z4({workspaceRoot:C(),storeServers:this.config.mcpServers??{},cliConfigs:this.runtimeOptions.mcpConfig,strictCliConfig:this.runtimeOptions.strictMcpConfig});if(Object.keys($).length===0){a.debug("No MCP servers configured");return}let Z=e0.createIsolated({artifactWriter:new o2(`legacy-${QG()}`)});this.legacyMcpRegistry=Z;for(let[X,z]of Object.entries($))try{a.debug(`Connecting to MCP server: ${X}`),await Z.registerServer(X,z),a.debug(`MCP server "${X}" connected`)}catch(W){a.warn(`Warning: MCP server "${X}" connection failed:`,W)}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)a.debug(`Registered ${Y.tools.length} MCP tools`),a.debug(`[MCP Tools] ${Y.tools.map((X)=>X.name).join(", ")}`)}catch($){a.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)a.debug(`Loaded ${Z} subagents: ${this.subagentRegistry.getAllNames().join(", ")}`);else a.debug("No subagents configured")}applySkillToolRestrictions($){if(!this.activeSkillContext?.allowedTools)return $;let Z=this.activeSkillContext.allowedTools;a.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 a.debug(`Filtered tools: ${J.map((Y)=>Y.name).join(", ")} (${J.length}/${$.length})`),J}clearSkillContext(){if(this.activeSkillContext)a.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(`
|
|
863
863
|
`);try{let Y=await this.attachmentCollector.collect(J);if(Y.length===0)return $;a.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 a.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+=`
|
|
864
864
|
|
|
865
865
|
<system-reminder>
|
|
@@ -1108,7 +1108,7 @@ ${U}
|
|
|
1108
1108
|
`+` /model add
|
|
1109
1109
|
|
|
1110
1110
|
`+`或运行初始化向导:
|
|
1111
|
-
`+" /init");if(!G&&Q&&Q!=="inherit"&&!b.some((A)=>A.id===Q))Q=void 0;let M=await z4({workspaceRoot:F,...w?{workspaceAccess:"none",resourceRoot:$.workspace.resourceRoot}:{},storeServers:_.mcpServers??{},sessionServers:$.mcpServers,cliConfigs:$.mcpConfig,strictCliConfig:$.strictMcpConfig}),E={...O.config,permissionMode:X??O.config.permissionMode??"default",lspServers:structuredClone(N.servers),permissions:w?structuredClone(O.config.permissions):await L.loadWorkspacePermissions(F,O.config.permissions),hooks:w?{enabled:!1}:await L.loadWorkspaceHooks(F,O.config.hooks??{})};L.validateConfig(E,O.catalog);let j=new q1(E,{...$,modelResources:O,lspResources:N,mcpServers:M,...Q?{modelId:Q}:{},permissionMode:E.permissionMode,reasoningEffort:z,serviceTier:W,responseVerbosity:V,communicationStyle:U,...H?{communicationStyleDigest:H}:{},...B?{projectInstructionsDigest:B}:{},...J?{taskWorktree:J}:{},...Y?{taskIsolation:Y}:{}});return await j.initialize(),j}catch(w){if(!$.auxiliaryReadOnly&&!$.subagentInfo&&!(w instanceof m4)){let q=J?await C$.getChangeSummary($.sessionId).catch(()=>{return}):void 0;await q1.persistTaskStatus($.sessionId,Z,"failed","Session runtime initialization failed",q??void 0,$.workspace?.kind==="acp-remote"?$.workspace.descriptor:void 0).catch((_)=>{if(_.code!=="ENOENT")E0.warn(`[SessionRuntime ${$.sessionId}] Failed to persist initialization failure`,_)})}throw w}}static async hasPendingInbox($,Z,J=v$($)){if(await T1(J,Z,async({inboxPath:X})=>{try{return(await BX(X)).size>0}catch(z){if(z.code!=="ENOENT")throw z;return!1}}))return!0;if(J.kind==="acp-remote")return!1;if(j0()?.agentTeamsEnabled!==!0)return!1;let Q=(await B$.getInstance(t()).listTeams()).filter((X)=>X.deletedAt===void 0&&X.leadSessionId===Z&&X.workspaceRoot===$);for(let X of Q)if((await new H$(X.name,t()).listPending("team-lead")).length>0)return!0;return!1}static async hasDurableFollowUpInbox($,Z,J=v$($)){return T1(J,Z,async({inboxPath:Y})=>{try{return await BX(Y),!0}catch(Q){if(Q.code!=="ENOENT")throw Q;return!1}})}static async hasActiveGoal($,Z,J=v$($)){return V0.hasActiveGoal($,Z,J)}static async hasRecoverableTurn($,Z,J=v$($)){return new _2($,100,void 0,J).hasRecoverableTurn(Z)}get sessionId(){return this.options.sessionId}get workspaceRoot(){return this.options.workspaceRoot??C()}get executionRoot(){return this.workspace.executionRoot}get resourceRoot(){return this.workspace.resourceRoot}isRemoteWorkspace(){return this.workspace.kind==="acp-remote"}get projectRoot(){return this.options.modelResources?.projectRoot??this.options.lspResources?.projectRoot??this.options.agentResources?.projectRoot??this.options.taskWorktree?.originalWorkspaceRoot??this.workspaceRoot}getConfig(){return this.config}getAvailableModels(){return this.config.models.map(($)=>structuredClone($))}getModelById($){let Z=this.config.models.find((J)=>J.id===$);return Z?structuredClone(Z):void 0}getAgentResources(){if(!this.agentResources)throw Error("Session agent resources are unavailable before initialization");return this.agentResources}getModelResources(){return this.modelResources}getLspResources(){return V2(this.lspResources)}isTaskSession(){return!this.options.subagentInfo&&this.options.taskIsolation!==void 0}getTaskAdmissionLimits(){let $=g1.getStats();return{maxConcurrent:$.maxConcurrent,maxQueued:$.maxQueued,maxQueuedBytes:$.maxQueuedBytes}}async setTaskAdmission($){if(!this.isTaskSession())return;let Z=new Date().toISOString(),J=$.state==="queued",Y={taskStatus:$.state,taskStatusReason:null,taskFailure:null,taskQueuePosition:J?$.queuePosition??1:null,taskQueueDepth:J?$.queueDepth:null,taskConcurrencyLimit:$.maxConcurrent,...J?{taskStartedAt:null,taskCompletedAt:null,taskOwnerPid:null}:{taskStartedAt:Z,taskCompletedAt:null,taskOwnerPid:process.pid}},Q=this.workspace.kind==="acp-remote"?await s.updateRemoteSessionMetadata(this.sessionId,this.workspaceRoot,this.workspace.descriptor,Y):await s.updateSessionMetadata(this.sessionId,this.workspaceRoot,Y);return W0.publish({sessionId:this.sessionId,projectPath:this.workspaceRoot},"task.status",{taskStatus:Q.taskStatus,...Q.taskStartedAt?{taskStartedAt:Q.taskStartedAt}:{},...$.queuePosition?{taskQueuePosition:$.queuePosition}:{},taskQueueDepth:$.queueDepth,taskConcurrencyLimit:$.maxConcurrent,taskInFlight:$.inFlight,taskAdmissionPaused:g1.getStats().paused,updatedAt:Q.lastMessageTime}),Q}publishTaskAdmissionCapacity($){if(!this.isTaskSession())return;let Z=g1.getStats();W0.publish({sessionId:this.sessionId,projectPath:this.workspaceRoot},"task.status",{taskStatus:$,taskQueueDepth:Z.queued,taskConcurrencyLimit:Z.maxConcurrent,taskInFlight:Z.inFlight,taskAdmissionPaused:Z.paused,updatedAt:new Date().toISOString()})}getChatService(){if(!this.chatService)throw Error("Session runtime is not initialized");return this.chatService}beginProviderRecovery(){let $=this.providerRecovery.begin();return this.providerRecoveryGeneration=$,this.publishProviderRecovery(this.providerRecovery.snapshot()),$}observeProviderRecovery($,Z){let J=this.providerRecovery.observe($,Z);if(J)this.publishProviderRecovery(J);return J}clearProviderRecovery($){let Z=this.providerRecovery.clear($);if(this.providerRecoveryGeneration?.id===$.id)this.providerRecoveryGeneration=void 0;if(Z)this.publishProviderRecovery(Z);return Z}getProviderRecoveryProjection(){return this.providerRecovery.snapshot()}publishProviderRecovery($){W0.publish({sessionId:this.sessionId,projectPath:this.workspaceRoot},"provider.recovery",{recovery:$})}beginTurnActivity(){let $=this.turnActivity.begin();return this.turnActivityGeneration=$,this.publishTurnActivity(this.turnActivity.snapshot()),$}observeTurnActivity($,Z){let J=this.turnActivity.observe($,Z);if(J)this.publishTurnActivity(J);return J}clearTurnActivity($){let Z=this.turnActivity.clear($);if(this.turnActivityGeneration?.id===$.id)this.turnActivityGeneration=void 0;if(Z)this.publishTurnActivity(Z);return Z}getTurnActivityProjection(){return this.turnActivity.snapshot()}publishTurnActivity($){W0.publish({sessionId:this.sessionId,projectPath:this.workspaceRoot},"turn.activity",{activity:$})}getExecutionEngine(){if(!this.executionEngine)throw Error("Session runtime is not initialized");return this.executionEngine}async loadModelContext(){if(!this.initialized)throw Error("Session runtime is not initialized");return this.workspace.kind==="acp-remote"?s.loadRemoteSessionModelContext(this.sessionId,this.workspaceRoot,this.workspace.descriptor):s.loadSessionModelContext(this.sessionId,this.workspaceRoot)}async askSideQuestion($,Z={}){if(!this.initialized||!this.chatService)throw Error("Session runtime is not initialized");let J=this.sideConversationOperations.enter(Z.signal),Y=this.config.permissionMode??"default",Q;try{Q=this.createToolExecutor({permissionMode:Y});let X=Q.getRegistry();await X.waitForMcpCatalogIdle();let[z,W]=await Promise.all([this.loadModelContext(),Y1({...this.isRemoteWorkspace()?{workspaceAccess:"none"}:{projectPath:this.resourceRoot},replaceDefault:Z.systemPrompt,append:Z.appendSystemPrompt,...Y==="plan"?{mode:"plan"}:{},includeEnvironment:!0,environmentOptions:{...u1,workingDirectory:this.executionRoot},language:this.config.language,availableSkills:this.agentResources?.skills.generateAvailableSkillsList()??"",communicationStyle:this.selectedCommunicationStyle,communicationStyleCatalog:this.getCommunicationStyleCatalog(),projectRuleCatalog:this.getProjectRuleCatalog(),...this.isRemoteWorkspace()?{}:{projectInstructionSourcePath:this.projectRoot}})]),V=SX(W.prompt,X);if(!V)throw Error("Side conversation system prompt is empty");return await MJ({question:$,sessionId:this.sessionId,workspaceRoot:this.executionRoot,systemPrompt:V,messages:z,tools:X.getFunctionDeclarationsByMode(Y),chatService:this.chatService,signal:J.signal,providerRecoveryBudgetMs:this.config.providerForegroundRecoveryMs})}finally{Q?.dispose(),J.release()}}getStartupTurnRecovery(){return this.startupTurnRecovery?structuredClone(this.startupTurnRecovery):void 0}getTurnRecoveryAssessment(){if(this.startupTurnRecoveryAcknowledged)return{state:"none"};return E3(this.startupTurnRecovery)}takeStartupTurnRecoveryAssessment(){if(this.startupTurnRecoveryAssessmentTaken)return{state:"none"};return this.startupTurnRecoveryAssessmentTaken=!0,this.getTurnRecoveryAssessment()}async acknowledgeStartupTurnRecovery(){let $=this.startupTurnRecovery;if($?.outcome==="aborted")await this.getExecutionEngine().getContextManager().persistentStore.acknowledgeTurnRecovery(this.sessionId,$.turnId);this.startupTurnRecoveryAcknowledged=!0,this.startupTurnRecoveryAssessmentTaken=!0,await this.activeTurnMailbox?.setRecoveryProtectedIds([])}async getRecoveredFinalResponse(){let $=this.startupTurnRecovery;if(!$||$.outcome!=="completed")return;let J=(await this.loadModelContext()).findLast((z)=>z.role==="assistant"&&DX(z)?.turnId===$.turnId&&JSON.stringify(DX(z))===JSON.stringify($.finalization));if(!J||typeof J.content!=="string")return;let Y=J.metadata&&typeof J.metadata==="object"&&!Array.isArray(J.metadata)?J.metadata:void 0,Q=Y?.structuredOutput,X=Q&&typeof Q==="object"&&!Array.isArray(Q)&&Q.output&&typeof Q.output==="object"&&!Array.isArray(Q.output)?Q.output:void 0;return{turnId:$.turnId,content:J.content,...X?{structuredOutput:X}:{},...typeof Y?.structuredOutputSchemaDigest==="string"?{structuredOutputSchemaDigest:Y.structuredOutputSchemaDigest}:{}}}takeStartupAdoptedToolResults(){let $=this.startupAdoptedToolResults;return this.startupAdoptedToolResults=[],structuredClone($)}getAttachmentCollector(){return this.attachmentCollector}getCurrentModelId(){return this.currentModelId}captureBrowserScreenshot($){if(!this.browserRuntime)throw new f("browser_page_not_found","The Agent browser is not available");return this.browserRuntime.screenshot($)}getReasoningConfiguration(){if(!this.currentReasoning)throw Error("Session runtime is not initialized");return{...this.currentReasoning,supported:[...this.currentReasoning.supported]}}resolveReasoningConfiguration($,Z=this.currentModelId){return m0(this.resolveModelConfig(Z),this.config,$,this.modelResources.catalog).reasoning}getServiceTierConfiguration(){if(!this.currentServiceTier)throw Error("Session runtime is not initialized");return{...this.currentServiceTier,supported:[...this.currentServiceTier.supported]}}resolveServiceTierConfiguration($,Z=this.currentModelId){return m0(this.resolveModelConfig(Z),this.config,this.selectedReasoningEffort,this.modelResources.catalog,$).serviceTier}getResponseVerbosityConfiguration(){if(!this.currentResponseVerbosity)throw Error("Session runtime is not initialized");return{...this.currentResponseVerbosity,supported:[...this.currentResponseVerbosity.supported]}}resolveResponseVerbosityConfiguration($,Z=this.currentModelId){return m0(this.resolveModelConfig(Z),this.config,this.selectedReasoningEffort,this.modelResources.catalog,this.selectedServiceTier,$).responseVerbosity}getCommunicationStyleConfiguration(){return z8(this.selectedCommunicationStyle,this.getCommunicationStyleCatalog())}resolveCommunicationStyleConfiguration($){return z8($,this.getCommunicationStyleCatalog())}getCommunicationStyleCatalog(){return this.agentResources?.communicationStyles??jX}getProjectRuleCatalog(){return this.agentResources?.projectRules??EX.empty(this.projectRoot)}getStaticProjectRules(){return this.getProjectRuleCatalog().staticRules(this.projectRoot)}hydrateProjectRules($){return this.getProjectRuleCatalog().hydrate($)}resolveContextualProjectRules($,Z,J,Y){if(this.isRemoteWorkspace())return this.getProjectRuleCatalog().contextualRules(this.projectRoot,[],Y);let Q=new Set;try{let V=this.baseRegistry.get($)?.build(Z);for(let U of V?.getAffectedPaths()??[])if(U)Q.add(U)}catch{}let X=(V)=>{if(typeof V==="string"&&V.trim())Q.add(V)};if(["Read","Edit","Write"].includes($))X(Z.file_path);else if($==="NotebookEdit")X(Z.notebook_path);else if(["Grep","Glob"].includes($))X(Z.path);else if($==="Bash")X(Z.cwd);let z=J?.metadata&&typeof J.metadata==="object"?J.metadata:void 0;if(Array.isArray(z?.affected_paths))for(let V of z.affected_paths)X(V);if(Array.isArray(z?.changes)){for(let V of z.changes)if(V&&typeof V==="object")X(V.path)}let W=[...Q].map((V)=>F0.isAbsolute(V)?F0.resolve(V):F0.resolve(this.workspaceRoot,V)).flatMap((V)=>{let U=F0.relative(this.workspaceRoot,V);if(U===""||!U.startsWith("..")&&!F0.isAbsolute(U))return[F0.resolve(this.projectRoot,U)];let H=F0.relative(this.projectRoot,V);return H===""||!H.startsWith("..")&&!F0.isAbsolute(H)?[V]:[]});return this.getProjectRuleCatalog().contextualRules(this.projectRoot,W,Y)}getCurrentModelMaxContextTokens(){if(this.currentModelMaxContextTokens===void 0)throw Error("Session runtime is not initialized");return this.currentModelMaxContextTokens}getGoal(){return this.goalStore.get()}async prepareGoalContinuation($,Z={}){try{let J=await o6($,{configDir:t(),stateStorage:this.stateStorage}),Y=Z.observeStall===!1&&$.frontierStall?.digestSha256===J.frontier.digestSha256,Q=Z.observeStall===!1?Y?$.frontierStall:void 0:y3($.executionFrontier,J.frontier,{taskEffect:"none",prematureStopCount:$.prematureStop?.consecutiveCount??0,verificationStallCount:$.verificationStall?.consecutiveCount??0},$.frontierStall);return{ok:!0,goal:await this.goalStore.recordExecutionFrontier(J.frontier,Q,{preserveStall:Y}),...J}}catch(J){let Y=J instanceof Error?J.message:String(J),Q=null;try{Q=await this.goalStore.pause(`goal task list unavailable (${a2($)}): ${Y}`)}catch(X){E0.warn(`[SessionRuntime] Failed to pause Goal after frontier failure: ${X instanceof Error?X.message:String(X)}`)}return{ok:!1,goal:Q,error:{code:"task_list_unavailable",message:`Goal execution frontier unavailable: ${Y}`}}}}async setTaskStatus($,Z){if(this.options.subagentInfo)return;let J=this.options.taskWorktree&&!["queued","running"].includes($)?await C$.getChangeSummary(this.sessionId):void 0;return q1.persistTaskStatus(this.sessionId,this.workspaceRoot,$,Z,J??void 0,this.workspace.kind==="acp-remote"?this.workspace.descriptor:void 0)}static async persistTaskStatus($,Z,J,Y,Q,X){let z=new Date().toISOString(),W=J==="failed"&&Y!==void 0?W8(Y):void 0,V=W?.message??(typeof Y==="string"?Y.slice(0,500):void 0),U={taskStatus:J,taskStatusReason:V??null,taskFailure:W??null,...Q!==void 0?{taskDiffStat:Q}:J==="running"?{taskDiffStat:null}:{},...J!=="queued"?{taskQueuePosition:null,taskQueueDepth:null}:{},...J==="running"?{taskStartedAt:z,taskCompletedAt:null,taskOwnerPid:process.pid}:J==="queued"?{taskStartedAt:null,taskCompletedAt:null,taskOwnerPid:null}:{taskCompletedAt:z,taskOwnerPid:null}},H=X?await s.updateRemoteSessionMetadata($,Z,X,U):await s.updateSessionMetadata($,Z,U);return W0.publish({sessionId:$,projectPath:Z},"task.status",{taskStatus:H.taskStatus,...V?{taskStatusReason:V}:{},...W?{taskFailure:W}:{},...H.taskStartedAt?{taskStartedAt:H.taskStartedAt}:{},...H.taskCompletedAt?{taskCompletedAt:H.taskCompletedAt}:{},...H.taskDiffStat?{taskDiffStat:H.taskDiffStat}:{},...H.taskQueuePosition?{taskQueuePosition:H.taskQueuePosition}:{},...H.taskQueueDepth!==void 0?{taskQueueDepth:H.taskQueueDepth}:{},...H.taskConcurrencyLimit!==void 0?{taskConcurrencyLimit:H.taskConcurrencyLimit}:{},updatedAt:H.lastMessageTime}),H}createGoal($,Z){return this.goalStore.create($,Z)}async beginGoalTurn($){let Z=this.getActiveTurnMailbox(),J=await Z.beginTurn(),Y=await this.goalStore.prepareTurnBinding(J.id,!0);if(!Y||Y.goalId!==$.goalId||Y.objective!==$.objective)return await Z.finishTurn(J).catch(()=>{return}),null;let Q=!1;try{await this.saveTurnStart(J,"goal",[],{goalId:Y.goalId,...Y.lineage}),Q=!0;let X=await this.goalStore.commitTurnBinding(Y);if(!X)throw Error("Goal changed before turn lineage commit");return{handle:J,goal:X}}catch(X){throw await this.releaseFailedTurnStart(J,Q),X}}editGoal($){return this.goalStore.edit($)}pauseGoal($){return this.goalStore.pause($)}resumeGoal(){return this.goalStore.resume()}clearGoal(){return this.goalStore.clear()}recordGoalCompletionVerification($){return this.goalStore.recordCompletionVerification($)}invalidateGoalCompletionVerification($){return this.goalStore.invalidateCompletionVerification($)}clearGoalFrontierStall(){return this.goalStore.clearFrontierStall()}finalizeVerifiedGoalCompletion(){return this.goalStore.finalizeVerifiedCompletion()}recordGoalProgress($){return this.goalStore.recordProgress($)}async pauseActiveGoal($){return this.goalStore.pauseIfActive($)}async listRewindCheckpoints(){return this.assertRewindIdle(),s.listRewindCheckpoints(this.sessionId,this.workspaceRoot)}async rewindSession($){this.assertRewindIdle();let Z=await s.rewindSession(this.sessionId,this.workspaceRoot,$);return this.backgroundTaskChildIds=await this.getExecutionEngine().getContextManager().persistentStore.loadBackgroundTaskChildIds(this.sessionId),this.backgroundTaskCompletionSettledIds.clear(),Z}listSubagents(){return D0.getInstance().listForSession({sessionId:this.sessionId,projectPath:this.workspaceRoot})}getMcpContentCatalog(){return this.sessionMcpRegistry?.getContentCatalogSnapshot()??{revision:0,resources:[],resourceTemplates:[],prompts:[]}}async refreshMcpContentCatalogs($){if(!this.sessionMcpRegistry)throw Error("This Session has no MCP servers");await this.sessionMcpRegistry.refreshContentCatalogs($)}async getMcpPrompt($,Z,J){if(!this.sessionMcpRegistry)throw Error("This Session has no MCP servers");return this.sessionMcpRegistry.getPrompt($,Z,J)}async completeMcpArgument($,Z,J){if(!this.sessionMcpRegistry)throw Error("This Session has no MCP servers");return this.sessionMcpRegistry.complete($,Z,J)}listMcpTasks($){return $$.getInstance().list({sessionId:this.sessionId,projectPath:this.workspaceRoot},$)}getMcpTask($){return $$.getInstance().get($,{sessionId:this.sessionId,projectPath:this.workspaceRoot})}cancelMcpTask($,Z){return $$.getInstance().cancel($,{sessionId:this.sessionId,projectPath:this.workspaceRoot},Z)}getMcpLogs($,Z={}){return this.sessionMcpRegistry?.getLogSnapshot($,Z)??{revision:0,entries:[]}}getMcpInstructions(){return this.sessionMcpRegistry?.getInstructionsSnapshot()??{revision:0,instructions:[]}}async setMcpLoggingLevel($,Z){if(!this.sessionMcpRegistry)throw Error("This Session has no MCP servers");await this.sessionMcpRegistry.setServerLoggingLevel($,Z)}resumeSubagent($){this.assertSubagentControlIdle();let Z=D0.getInstance(),J={sessionId:this.sessionId,projectPath:this.workspaceRoot},Y=Z.getAgent($.agentId,J);if(!Y)throw Error(`Subagent not found in this session: ${$.agentId}`);let Q=this.subagentRegistry?.getSubagent(Y.subagentType),X=Y.configSnapshot?{...Y.configSnapshot}:Q;if(!X)throw Error(`Subagent configuration is unavailable: ${Y.subagentType}`);let z=Z.resumeAgent({agentId:Y.id,prompt:$.prompt,config:X,owner:J,permissionMode:X.permissionMode,reasoningEffort:this.selectedReasoningEffort,serviceTier:this.selectedServiceTier,responseVerbosity:this.selectedResponseVerbosity,communicationStyle:this.selectedCommunicationStyle,agentResources:this.agentResources,modelResources:this.modelResources,lspResources:this.lspResources,onEvent:$.onEvent,onCompleted:async(V)=>{await this.notifyBackgroundSubagentCompleted(V.id),await $.onCompleted?.(V)}});if(!z)throw Error(`Subagent cannot be resumed: ${Y.id}`);let W=Z.getAgent(z.agentId,J);if(!W)throw Error(`Resumed subagent was not persisted: ${z.agentId}`);return{source:z.source,session:W}}async beginTurn($="goal"){let Z=await this.getActiveTurnMailbox().beginTurn();try{return await this.saveTurnStart(Z,$),Z}catch(J){throw await this.getActiveTurnMailbox().finishTurn(Z).catch(()=>{return}),J}}async prepareInputTurn($,Z){let J=this.getActiveTurnMailbox(),Y=await this.materializeUserMessage($,Z?.metadata),Q=await J.prepareInputTurn(Y.content,{...Z,...Y.metadata?{metadata:Y.metadata}:{}});if(!Q.accepted)return Q;let X=!1;try{let z=await this.goalStore.prepareTurnBinding(Q.handle.id,!1);if(await this.saveTurnStart(Q.handle,Q.mode==="direct"?"user":"pending",await J.reservedMessageIds(Q.handle),z?{goalId:z.goalId,...z.lineage}:void 0),X=!0,z&&!await this.goalStore.commitTurnBinding(z))throw Error("Goal changed before user turn lineage commit");return Q}catch(z){throw await this.releaseFailedTurnStart(Q.handle,X),z}}async enqueueSteering($,Z){let J=(Z?.origin??"user")==="user"?await this.materializeUserMessage($,Z?.metadata):{content:$,metadata:Z?.metadata,offloaded:!1},Y=await this.getActiveTurnMailbox().enqueue(J.content,{...Z,...J.metadata?{metadata:J.metadata}:{}});if(Y.accepted&&Y.delivery==="current_turn"&&Y.turnId)await this.goalStore.invalidateTurnLineageRoot(Y.turnId);if(Y.accepted)this.signalBackgroundSubagentCompletionWaiters();return Y}materializeUserMessage($,Z){return this.userPromptArtifactStore.materialize($,Z)}restoreUserMessage($,Z){return this.userPromptArtifactStore.restore($,Z)}async drainSteering($){return this.getActiveTurnMailbox().drain($)}async drainSteeringOrSeal($){return this.getActiveTurnMailbox().drainOrSeal($)}async getClaimedTurnMessageIds($){return this.getActiveTurnMailbox().claimedMessageIds($)}async getRecoveredEmptyFinalState($){let Z=this.startupTurnRecovery;if(!Z||Z.outcome!=="aborted")return{hadSuccessfulToolResult:!1,correctionSpent:!1};let J=await this.getClaimedTurnMessageIds($),Y=new Set(Z.inputMessageIds);if(J.length===0||J.some((Q)=>!Y.has(Q)))return{hadSuccessfulToolResult:!1,correctionSpent:!1};return{hadSuccessfulToolResult:Z.hadSuccessfulToolResult,...Z.interruptedToolCallCount?{interruptedToolCallCount:Z.interruptedToolCallCount}:{},...Z.allSuccessfulToolResultsSafeForResume===!0?{allSuccessfulToolResultsSafeForResume:!0}:{},correctionSpent:Z.emptyFinalCorrectionSpent}}async discardPendingInput(){let $=this.getActiveTurnMailbox(),Z=$.pendingMessages().map((J)=>J.id);if(Z.length===0)return;await this.getExecutionEngine().getContextManager().persistentStore.acknowledgeInboxMessages(this.sessionId,Z),await $.acknowledge(Z)}async finishTurn($,Z={}){let J=Z.outcome??{status:"aborted",cause:"interrupted",turnsCount:0,toolCallsCount:0,durationMs:0},Y=this.getExecutionEngine().getContextManager().persistentStore;if(J.status==="completed"){let z=await this.getActiveTurnMailbox().claimedMessageIds($);await Y.saveTurnCompletion(this.sessionId,{turnId:$.id,completedAt:new Date().toISOString(),turnsCount:J.turnsCount,toolCallsCount:J.toolCallsCount,durationMs:J.durationMs},z),await this.getActiveTurnMailbox().acknowledge(z)}else{let z=this.startupTurnRecovery,W=Z.preserveStartupRecovery&&z?.outcome==="aborted"?{hadSuccessfulToolResult:z.hadSuccessfulToolResult,interruptedToolCallCount:z.interruptedToolCallCount??0,allSuccessfulToolResultsSafeForResume:z.allSuccessfulToolResultsSafeForResume,correctionSpent:z.emptyFinalCorrectionSpent}:await this.getRecoveredEmptyFinalState($),V=await this.getActiveTurnMailbox().claimedMessageIds($),U=await Y.saveTurnAbort(this.sessionId,{turnId:$.id,cause:J.cause,abortedAt:new Date().toISOString(),turnsCount:J.turnsCount,toolCallsCount:J.toolCallsCount,durationMs:J.durationMs,recovery:{version:3,inputMessageIds:V,hadSuccessfulToolResult:W.hadSuccessfulToolResult,interruptedToolCallCount:W.interruptedToolCallCount??0,allSuccessfulToolResultsSafeForResume:W.allSuccessfulToolResultsSafeForResume===!0,emptyFinalCorrectionSpent:W.correctionSpent}},Z.acknowledgeInput?{acknowledgeInputMessageIds:V}:void 0);if(this.startupTurnRecovery=U.recovery,this.startupTurnRecoveryAcknowledged=!1,this.startupTurnRecoveryAssessmentTaken=!1,await this.getActiveTurnMailbox().setRecoveryProtectedIds(U.recovery?.inputMessageIds??[]),Z.acknowledgeInput)await this.getActiveTurnMailbox().acknowledge(U.acknowledgedInputMessageIds)}let Q=await this.getActiveTurnMailbox().finishTurn($,Z);if(!Q)return;let X=!1;try{let z=await this.goalStore.prepareTurnBinding(Q.id,!1);if(await this.saveTurnStart(Q,"pending",await this.getActiveTurnMailbox().reservedMessageIds(Q),z?{goalId:z.goalId,...z.lineage}:void 0),X=!0,z&&!await this.goalStore.commitTurnBinding(z))throw Error("Goal changed before pending turn lineage commit");return Q}catch(z){throw await this.releaseFailedTurnStart(Q,X),z}}async beginPendingTurn(){let $=this.getActiveTurnMailbox(),Z=await $.beginPendingTurn();if(!Z)return;let J=!1;try{let Y=await this.goalStore.prepareTurnBinding(Z.id,!1);if(await this.saveTurnStart(Z,"pending",await $.reservedMessageIds(Z),Y?{goalId:Y.goalId,...Y.lineage}:void 0),J=!0,Y&&!await this.goalStore.commitTurnBinding(Y))throw Error("Goal changed before pending turn lineage commit");return Z}catch(Y){throw await this.releaseFailedTurnStart(Z,J),Y}}hasActiveTurn(){return this.activeTurnMailbox?.isActive()??!1}hasTurnOwner(){return this.activeTurnMailbox?.hasTurnOwner()??!1}getPendingSteeringCount(){return this.activeTurnMailbox?.pendingCount()??0}getPendingSteeringMessages(){return this.activeTurnMailbox?.pendingMessages()??[]}async getFollowUpQueueSnapshot(){return this.getActiveTurnMailbox().getFollowUpQueueSnapshot()}async mutateFollowUpQueue($){return this.getActiveTurnMailbox().mutateFollowUpQueue($)}isIdleForResidency(){if(!this.initialized||this.disposing||this.hasActiveTurn()||this.hasTurnOwner()||this.sideConversationOperations.stats().active>0||this.getPendingSteeringCount()>0||this.executorCatalogs.size>0)return!1;if(!this.isRemoteWorkspace()&&Y0.getInstance().listForSession(this.sessionId).some((Z)=>Z.status==="running"))return!1;let $={sessionId:this.sessionId,projectPath:this.workspaceRoot};if(D0.getInstance().listForSession($).some((Z)=>Z.status==="running")||this.getBackgroundTaskChildrenState()!=="none")return!1;return!$$.getInstance().hasActive($)}getRecoveredSteeringCount(){return this.activeTurnMailbox?.recoveredCount()??0}async notifyBackgroundSubagentCompleted($){await iZ.dispatch(this.backgroundSubagentCompletionOwner,$)}registerBackgroundSubagent($){this.backgroundTaskChildIds.add($),this.backgroundTaskCompletionSettledIds.delete($)}async waitForBackgroundSubagentFollowUp($,Z){while(!Z?.aborted){if(this.disposing||!this.initialized||!this.activeTurnMailbox)return!1;if(await this.reconcileBackgroundSubagentCompletions(),this.disposing||!this.initialized||!this.activeTurnMailbox)return!1;if(await this.hasUnclaimedPendingInput($))return!0;let J=this.backgroundSubagentCompletionRevision,Y=this.getBackgroundTaskChildrenState();if(Y==="none")return!1;if(Y==="terminal_pending")continue;await this.waitForBackgroundSubagentSignal(J,Z)}return!1}async hasUnclaimedPendingInput($){let Z=new Set(await this.getActiveTurnMailbox().claimedMessageIds($));return this.getActiveTurnMailbox().pendingMessages().some((J)=>!Z.has(J.id))}signalBackgroundSubagentCompletionWaiters(){this.backgroundSubagentCompletionRevision++;for(let $ of this.backgroundSubagentCompletionWaiters)$();this.backgroundSubagentCompletionWaiters.clear()}async waitForBackgroundSubagentSignal($,Z){if(Z?.aborted||$!==this.backgroundSubagentCompletionRevision)return;await new Promise((J)=>{let Y=!1,Q=()=>{if(Y)return;Y=!0,this.backgroundSubagentCompletionWaiters.delete(Q),Z?.removeEventListener("abort",Q),J()};if(this.backgroundSubagentCompletionWaiters.add(Q),Z?.addEventListener("abort",Q,{once:!0}),Z?.aborted||$!==this.backgroundSubagentCompletionRevision)Q()})}getBackgroundTaskChildrenState(){if(this.isRemoteWorkspace())return"none";if(this.backgroundTaskChildIds.size===0)return"none";let $={sessionId:this.sessionId,projectPath:this.workspaceRoot},Z=y0.getInstance().listSessions().filter((J)=>t0(J,$)&&this.backgroundTaskChildIds.has(J.id)&&J.background===!0);if(Z.some((J)=>J.status!=="running"&&!this.backgroundTaskCompletionSettledIds.has(J.id)))return"terminal_pending";return Z.some((J)=>J.status==="running")?"running":"none"}async reconcileBackgroundSubagentCompletionSink($){try{await this.reconcileBackgroundSubagentCompletions($)}finally{this.signalBackgroundSubagentCompletionWaiters()}}async attachBackgroundSubagentCompletionDispatcher(){if(this.backgroundSubagentCompletionRegistration)return;this.backgroundSubagentCompletionRegistration=await iZ.attach(this.backgroundSubagentCompletionOwner,{reconcile:($)=>this.reconcileBackgroundSubagentCompletionSink($)})}async reconcileBackgroundSubagentCompletions($){return this.backgroundSubagentCompletionMutex.runExclusive(async()=>{if(!this.activeTurnMailbox||!this.executionEngine)return 0;let Z=this.getExecutionEngine().getContextManager().persistentStore;if(this.backgroundTaskChildIds.size===0)return 0;let J=y0.getInstance(),Y={sessionId:this.sessionId,projectPath:this.workspaceRoot},Q=$?[J.loadSession($)].filter((z)=>Boolean(z)):J.listSessions().filter((z)=>t0(z,Y)),X=0;for(let z of Q){if(!this.backgroundTaskChildIds.has(z.id)||this.backgroundTaskCompletionSettledIds.has(z.id)||z.status==="running")continue;let W=z.resumedFrom?J.loadSession(z.resumedFrom):void 0,V=lQ(z,Y,W);if(!V){this.backgroundTaskCompletionSettledIds.add(z.id);continue}let U=await Z.persistBackgroundSubagentCompletion(this.sessionId,V);if(!U.eligible||U.acknowledged){this.backgroundTaskCompletionSettledIds.add(z.id);continue}let H=await this.activeTurnMailbox.enqueueBackgroundSubagentCompletion(V);if(!H.accepted){E0.warn(`[SessionRuntime ${this.sessionId}] Background subagent completion queue is full for ${z.id}`);continue}if(H.delivery==="current_turn"&&H.turnId)await this.goalStore.invalidateTurnLineageRoot(H.turnId);if(this.backgroundTaskCompletionSettledIds.add(z.id),H.duplicate)continue;if(X++,H.queue)W0.publish({sessionId:this.sessionId,projectPath:this.workspaceRoot},"follow_up.queue.changed",{queue:H.queue});W0.publish({sessionId:this.sessionId,projectPath:this.workspaceRoot},"subagent.completion.queued",{childSessionId:z.id,inboxMessageId:V.inboxMessageId,status:z.status,type:z.subagentType,description:z.description,summary:V.subagentRef.subagentSummary,resumedFrom:z.resumedFrom,rootAgentId:z.rootAgentId,resumeDepth:z.resumeDepth,verificationVerdict:z.result?.verificationVerdict,queued:H.queued,delivery:H.delivery})}return X})}async reloadPendingInbox(){if(this.hasTurnOwner())throw Error("Cannot reload the pending inbox during an active turn");this.activeTurnMailbox=await w6.create(this.workspaceRoot,this.sessionId,this.stateStorage),await this.activeTurnMailbox.setRecoveryProtectedIds(this.startupTurnRecovery?.outcome==="aborted"?this.startupTurnRecovery.inputMessageIds:[])}async recoverTeamLeadMessages(){if(this.config.agentTeamsEnabled!==!0)return;let $=(await B$.getInstance(t()).listTeams()).filter((Z)=>Z.deletedAt===void 0&&Z.leadSessionId===this.sessionId&&Z.workspaceRoot===this.workspaceRoot);for(let Z of $){let J=new H$(Z.name,t()),Y=await J.listPending("team-lead");for(let Q of Y)if((await this.enqueueSteering(N2(Q),{allowBeforeTurn:!0,messageId:Q.id,origin:"team_message",metadata:Z8(Q)})).accepted)await J.markDelivered([Q.id])}}async executeUserShellCommand($,Z={}){if(!this.initialized||!this.executionEngine)throw Error("Session runtime is not initialized");return this.userShellMutex.runExclusive(async()=>{let J=mD(12),Y=this.hasTurnOwner(),Q=Z.signal??new AbortController().signal,X=async(G)=>{let D=G.type==="started"?{executionId:G.executionId,command:G.command,auxiliary:Y}:G.type==="output"?{executionId:G.executionId,stream:G.stream,chunk:G.chunk,streamedBytes:G.streamedBytes,streamTruncated:G.streamTruncated,auxiliary:Y}:{executionId:G.executionId,messageId:G.messageId,record:G.record,auxiliary:Y,delivery:G.delivery,queued:G.queued};W0.publish({sessionId:this.sessionId,projectPath:this.workspaceRoot},`user.shell.${G.type}`,D),await Z.onEvent?.(G)},z=await TX($,{executionId:J,cwd:this.executionRoot,env:{...process.env,...this.sessionEnvironment,BLADE_CLI:"1",BLADE_USER_SHELL:"1"},signal:Q,timeoutMs:Z.timeoutMs,executor:this.workspace.kind==="acp-remote"?this.workspace.terminal?this.options.userShellExecutor??$9():$9():this.options.userShellExecutor,onEvent:async(G)=>{if(G.type!=="completed")await X({...G,auxiliary:Y})}}),W=RX(z),U=await this.getExecutionEngine().getContextManager().saveMessage(this.sessionId,"user",W,null,{...Y?{inboxMessageId:J}:{},userShellCommand:JSON.parse(JSON.stringify(z))},this.options.subagentInfo),H=Y?await this.getActiveTurnMailbox().enqueue(W,{allowBeforeTurn:!0,messageId:J,persisted:!0,origin:"user_shell"}):void 0;if(H?.delivery==="current_turn"&&H.turnId)await this.goalStore.invalidateTurnLineageRoot(H.turnId);let B={executionId:J,messageId:U,record:z,modelContent:W,auxiliary:Y,...H?.delivery?{delivery:H.delivery}:{},...H?{queued:H.queued}:{},...H?.queue?{queue:H.queue}:{}};return await X({type:"completed",executionId:J,messageId:U,record:z,auxiliary:Y,...H?.delivery?{delivery:H.delivery}:{},...H?{queued:H.queued}:{}}),B})}async initialize(){if(this.initialized)return;this.sessionLease=await c4.acquireForStorage(this.sessionId,this.stateStorage);try{if(!this.isRemoteWorkspace())await new b1(this.workspaceRoot,this.sessionId).reapOrphans(),await Y0.getInstance().reapOrphanedSession(this.sessionId,this.workspaceRoot),await vJ(this.workspaceRoot),await D0.getInstance().reconcileOrphanedSessions({sessionId:this.sessionId,projectPath:this.workspaceRoot}),await cD(this.workspaceRoot);if(await this.loadAgentResources(),!this.isRemoteWorkspace()){let W=x0.getInstance();if(W.loadConfig(this.config.disableAllHooks?{...this.config.hooks,enabled:!1}:this.config.hooks??{},this.projectRoot),W.bindSessionModelResources(this.sessionId,[this.projectRoot,this.workspaceRoot],this.modelResources),this.projectRoot!==this.workspaceRoot)W.inheritProjectConfig(this.projectRoot,this.workspaceRoot);W.bindSessionConfig(this.sessionId,[this.projectRoot,this.workspaceRoot],this.config.disableAllHooks?{...this.agentResources?.hooks??W.getConfig(this.projectRoot),enabled:!1}:this.agentResources?.hooks??W.getConfig(this.projectRoot));let V=await W.executeSessionStartHooks({projectDir:this.workspaceRoot,sessionId:this.sessionId,permissionMode:this.config.permissionMode??"default",isResume:this.options.sessionStart?.isResume??!1,resumeSessionId:this.options.sessionStart?.resumeSessionId});if(!V.proceed)throw Error(V.warning||"SessionStart hook blocked initialization");if(V.warning)E0.warn(`[SessionRuntime ${this.sessionId}] SessionStart hook warning: ${V.warning}`);let U=_X(V.env??{});if(this.sessionEnvironment=Object.freeze({...this.sessionEnvironment,...U}),this.config.env=this.sessionEnvironment,W.bindSessionEnvironment(this.sessionId,[this.projectRoot,this.workspaceRoot],this.sessionEnvironment),Object.keys(this.lspResources.servers).length>0)this.lspManager=new e8({sessionId:this.sessionId,workspaceRoot:this.workspaceRoot,environment:this.sessionEnvironment,servers:this.lspResources.servers});if(!this.lspManager?.available)this.autoVerifyRuntime=new cZ({sessionId:this.sessionId,workspaceRoot:this.workspaceRoot,projectRoot:this.projectRoot,environment:this.sessionEnvironment})}await this.validateSystemPromptConfig(),this.activeTurnMailbox=await w6.create(this.workspaceRoot,this.sessionId,this.stateStorage),await this.registerBuiltinTools(),await this.applyModelConfig(this.resolveModelConfig(this.selectedModelId),"使用模型:",this.selectedReasoningEffort,this.selectedServiceTier,this.selectedResponseVerbosity),await this.getExecutionEngine().getContextManager().persistentStore.initSession(this.sessionId,this.options.subagentInfo);let $=this.getExecutionEngine().getContextManager().persistentStore;this.backgroundTaskChildIds=await $.loadBackgroundTaskChildIds(this.sessionId),this.backgroundTaskCompletionSettledIds.clear();let Z=await $.loadInterruptedToolCalls(this.sessionId),J=new Map,Y={sessionId:this.sessionId,projectPath:this.workspaceRoot};if(!this.isRemoteWorkspace()){let W=y0.getInstance();for(let V of Z){if(V.toolName!=="Task"||!V.input||typeof V.input!=="object"||Array.isArray(V.input))continue;let U=V.input.subagent_session_id;if(typeof U!=="string")continue;let H=W.loadSession(U);if(!H)continue;let B=HQ(V,H,Y);if(B)J.set(V.toolCallId,B)}}let Q=await $.recoverInterruptedTurn(this.sessionId,{adoptedToolResults:J});if(Q)this.startupAdoptedToolResults=Z.flatMap((W)=>{let V=J.get(W.toolCallId);return V?[{call:W,result:V}]:[]});let X=await $.loadLatestGoalFinalization(this.sessionId),z=X?await this.goalStore.reconcileFinalizationReceipt(X.finalization.goalFinalization):null;if(z?.finalized)W0.publish({sessionId:this.sessionId,projectPath:this.workspaceRoot},"goal.updated",{goal:z.goal});if(this.startupTurnRecovery=Q??(X&&z?.finalized?{turnId:X.turnId,outcome:"completed",inputMessageIds:X.finalization.inputMessageIds,hadSuccessfulToolResult:!1,emptyFinalCorrectionSpent:!1,finalization:X.finalization}:void 0),await this.activeTurnMailbox.setRecoveryProtectedIds(this.startupTurnRecovery?.outcome==="aborted"?this.startupTurnRecovery.inputMessageIds:[]),this.startupTurnRecovery?.outcome==="completed")await this.reloadPendingInbox();if(!this.isRemoteWorkspace())await this.recoverTeamLeadMessages(),await this.attachBackgroundSubagentCompletionDispatcher();if(Q)E0.warn(`[SessionRuntime ${this.sessionId}] recovered ${Q.outcome} turn ${Q.turnId}`);this.initialized=!0,E0.debug(`[SessionRuntime ${this.sessionId}] initialized with ${this.baseRegistry.getAll().length} tools`)}catch($){try{await this.dispose()}catch(Z){E0.warn(`[SessionRuntime ${this.sessionId}] Failed to clean up after initialization error`,Z)}throw $}}async refresh($){if(!this.initialized){await this.initialize();return}let Z=$.modelId==="inherit",J=$.modelId&&!Z?$.modelId:void 0,Y=Z?this.getDefaultModel()?.id:J??this.selectedModelId??this.getDefaultModel()?.id,Q=$.reasoningEffort??this.selectedReasoningEffort,X=$.serviceTier??this.selectedServiceTier,z=$.responseVerbosity??this.selectedResponseVerbosity,W=$.communicationStyle??this.selectedCommunicationStyle;if(z8(W,this.getCommunicationStyleCatalog()),Y&&(Y!==this.currentModelId||Q!==this.selectedReasoningEffort||X!==this.selectedServiceTier||z!==this.selectedResponseVerbosity))await this.applyModelConfig(this.resolveModelConfig(Y),Y!==this.currentModelId?"切换模型":Q!==this.selectedReasoningEffort?"切换推理强度":X!==this.selectedServiceTier?"切换服务等级":"切换输出详略",Q,X,z);if(Z)this.selectedModelId=void 0;else if(J)this.selectedModelId=J;this.selectedReasoningEffort=Q,this.selectedServiceTier=X,this.selectedResponseVerbosity=z,this.selectedCommunicationStyle=W}createToolExecutor($={}){let Z=new H1;Z.setMcpCatalogBarrier(this.mcpCatalogBarrier);let J="ReadPromptArtifact",Y=$.toolWhitelist?[...new Set([...$.toolWhitelist,J])]:void 0,Q=$.toolBlacklist?.filter((B)=>B!==J),X=Y?new Set(Y):null,z=Q?new Set(Q):null;for(let B of this.baseRegistry.getBuiltinTools()){if(z?.has(B.name))continue;if(!X||X.has(B.name))Z.register(B)}Z.replaceMcpTools(this.filterMcpTools(this.baseRegistry.getMcpTools(),X,z));let W=this.getMcpInstructions();if(Z.queueMcpInstructionsChange({revision:W.revision,reason:"snapshot",replace:!0,instructions:W.instructions,removed:[]}),["TaskOutput","ListMcpTasks","CancelMcpTask"].some((B)=>!z?.has(B)&&(!X||X.has(B))))for(let B of $$.getInstance().list({sessionId:this.sessionId,projectPath:this.workspaceRoot})){let{result:G,...D}=B;Z.queueMcpTaskChange({revision:0,...D})}this.executorCatalogs.set(Z,{allowed:X,blocked:z});let U={...this.config.permissions,...$.permissions},H=$.permissionMode??this.config.permissionMode??"default";return new z6(Z,{permissionConfig:U,permissionMode:H,approvalStore:this.approvalStore,maxHistorySize:1000,toolWhitelist:Y,toolBlacklist:Q,workspaceToolPolicy:this.workspaceToolPolicy,contextDefaults:{sessionId:this.sessionId,workspaceRoot:this.workspaceRoot,executionRoot:this.executionRoot,workspaceKind:this.workspace.kind,environment:this.sessionEnvironment,permissionMode:H,foregroundCommandHandoffMs:this.config.bashForegroundHandoffMs,mcpSamplingHandler:this.handleMcpSampling,notifyBackgroundSubagentCompleted:(B)=>this.notifyBackgroundSubagentCompleted(B),registerBackgroundSubagent:(B)=>this.registerBackgroundSubagent(B)},...this.lspManager?{lspManager:this.lspManager}:{},...H==="yolo"&&this.autoVerifyRuntime?{autoVerifyRuntime:this.autoVerifyRuntime}:{},onDispose:()=>{this.executorCatalogs.delete(Z)}})}createExecutionPipeline($={}){return this.createToolExecutor($)}async dispose(){if(this.disposePromise)return this.disposePromise;return this.disposing=!0,this.disposePromise=(async()=>{let $,Z=async(_,L)=>{try{await L()}catch(F){$??=F,E0.warn(`[SessionRuntime ${this.sessionId}] Failed to ${_} during cleanup`,F)}},J=this.chatService,Y=this.sessionMcpRegistry,Q=this.mcpCatalogListener,X=this.mcpContentCatalogListener,z=this.mcpResourceUpdatedListener,W=this.mcpConnectionListener,V=this.mcpLogListener,U=this.mcpInstructionsListener,H=this.mcpTaskListener,B=this.sessionLease,G=this.autoVerifyRuntime,D=this.lspManager,w=this.browserRuntime,q=this.backgroundSubagentCompletionRegistration;if(this.providerRecoveryGeneration)this.clearProviderRecovery(this.providerRecoveryGeneration);if(this.turnActivityGeneration)this.clearTurnActivity(this.turnActivityGeneration);if(await Z("stop side conversations",()=>this.sideConversationOperations.shutdown("session-runtime-dispose")),await Z("close the Session browser",()=>w?.dispose()),await Z("dispose the background subagent completion registration",()=>q?.dispose()),this.backgroundSubagentCompletionRegistration=void 0,this.signalBackgroundSubagentCompletionWaiters(),this.chatService=void 0,this.executionEngine=void 0,this.activeTurnMailbox=void 0,this.startupTurnRecovery=void 0,this.startupTurnRecoveryAcknowledged=!1,this.startupTurnRecoveryAssessmentTaken=!1,this.startupAdoptedToolResults=[],this.backgroundTaskChildIds.clear(),this.backgroundTaskCompletionSettledIds.clear(),this.currentModelMaxContextTokens=void 0,this.baseRegistry=new H1,this.sessionMcpRegistry=void 0,this.mcpCatalogListener=void 0,this.mcpContentCatalogListener=void 0,this.mcpResourceUpdatedListener=void 0,this.mcpConnectionListener=void 0,this.mcpLogListener=void 0,this.mcpInstructionsListener=void 0,this.mcpTaskListener=void 0,this.mcpCatalogBarrier=async()=>{return},this.executorCatalogs.clear(),this.sessionLease=void 0,this.autoVerifyRuntime=void 0,this.lspManager=void 0,this.browserRuntime=void 0,!this.isRemoteWorkspace())await Z("kill the session background processes",()=>Y0.getInstance().killSession(this.sessionId));if(await Z("clear the session approvals",()=>this.approvalStore.clear()),await Z("clear the session file access records",()=>f0.getInstance().clearSession(this.sessionId,this.workspaceRoot)),await Z("stop the session auto-verification processes",()=>G?.dispose()),await Z("stop the session LSP servers",()=>D?.dispose()),!this.isRemoteWorkspace())await Z("release the session hook model resources",()=>x0.getInstance().unbindSessionModelResources(this.sessionId,[this.projectRoot,this.workspaceRoot])),await Z("release the session worktrees",()=>C$.releaseSession(this.sessionId));if(await Z("dispose the session chat service",()=>J?.dispose?.()),await Z("cancel the session MCP tasks",()=>$$.getInstance().cancelSession({sessionId:this.sessionId,projectPath:this.workspaceRoot})),await Z("disconnect the session MCP servers",async()=>{if(Y&&Q)Y.off("catalogChanged",Q);if(Y&&X)Y.off("contentCatalogChanged",X);if(Y&&z)Y.off("resourceUpdated",z);if(Y&&W)Y.off("connectionLifecycleChanged",W);if(Y&&V)Y.off("log",V);if(Y&&U)Y.off("instructionsChanged",U);if(H)$$.getInstance().off("taskChanged",H);await Y?.disconnectAll()}),await Z("release the session lease",()=>B?.release()),this.currentModelId=void 0,this.currentReasoning=void 0,this.currentServiceTier=void 0,this.initialized=!1,$!==void 0)throw $})(),this.disposePromise}resolveModelConfig($){let Z=$&&$!=="inherit"?$:void 0,J=Z?this.config.models.find((Y)=>Y.id===Z):this.getDefaultModel();if(!J)throw Error(`模型配置未找到: ${Z??"current"}`);return J}getDefaultModel(){return this.config.models.find(($)=>$.id===this.config.currentModelId)??this.config.models[0]}getActiveTurnMailbox(){if(!this.activeTurnMailbox)throw Error("Session runtime is not initialized");return this.activeTurnMailbox}async saveTurnStart($,Z,J=[],Y){await this.getExecutionEngine().getContextManager().persistentStore.saveTurnStart(this.sessionId,{turnId:$.id,kind:Z,startedAt:new Date().toISOString(),...J.length>0?{inputMessageIds:J}:{},...Y?{goalLineage:Y}:{}})}async releaseFailedTurnStart($,Z){if(Z)try{await this.finishTurn($,{outcome:{status:"aborted",cause:"failed",turnsCount:0,toolCallsCount:0,durationMs:0}});return}catch{}await this.getActiveTurnMailbox().finishTurn($).catch(()=>{return})}assertRewindIdle(){if(this.isRemoteWorkspace())throw Error("Rewind is unavailable for ACP remote workspaces");if(this.hasTurnOwner())throw Error("Cannot rewind while the session has an active turn");if(this.getPendingSteeringCount()>0)throw Error("Cannot rewind while durable input is pending");if(Y0.getInstance().listForSession(this.sessionId).some(($)=>$.status==="running"))throw Error("Cannot rewind while a background shell is running");if(D0.getInstance().listForSession({sessionId:this.sessionId,projectPath:this.workspaceRoot}).some(($)=>$.status==="running"))throw Error("Cannot rewind while a background agent is running")}assertSubagentControlIdle(){if(this.hasTurnOwner())throw Error("Cannot resume a subagent while the session has an active turn");if(this.getPendingSteeringCount()>0)throw Error("Cannot resume a subagent while durable input is pending")}async applyModelConfig($,Z,J,Y,Q){let X=m0($,this.config,J,this.modelResources.catalog,Y,Q);E0.debug(`${Z} ${X.displayName} (${$.model})`);let z=X.model.contextWindow,W=await S4(X.chat),V=this.initialized?this.chatService:void 0,U=this.executionEngine?.getContextManager();this.chatService=W,this.executionEngine=new V6(W,U,this.workspaceRoot,this.stateStorage),this.currentModelMaxContextTokens=z,this.currentModelId=$.id,this.currentReasoning=X.reasoning,this.currentServiceTier=X.serviceTier,this.currentResponseVerbosity=X.responseVerbosity;let H=V;try{await H?.dispose?.()}catch(B){E0.warn(`[SessionRuntime ${this.sessionId}] Failed to dispose previous model service`,B)}}async validateSystemPromptConfig(){let $=this.getStaticProjectRules();if(!this.options.auxiliaryReadOnly&&this.options.projectInstructionsDigest&&$.provenanceSha256!==this.options.projectInstructionsDigest)throw Error("Project instruction provenance mismatch");if(!this.options.subagentInfo&&!this.options.auxiliaryReadOnly&&$.files.length>0&&!this.options.projectInstructionsDigest)await this.persistSystemPromptProvenance({projectInstructionsDigest:$.provenanceSha256}),this.options.projectInstructionsDigest=$.provenanceSha256;let Z=this.resolveCommunicationStyleConfiguration(this.selectedCommunicationStyle);if(!this.options.auxiliaryReadOnly&&Z.source!=="built-in"&&this.options.communicationStyleDigest&&Z.contentSha256!==this.options.communicationStyleDigest)throw Error(`Communication style provenance mismatch: ${this.selectedCommunicationStyle}`);if(!this.options.auxiliaryReadOnly&&Z.source!=="built-in"&&Z.contentSha256&&!this.options.communicationStyleDigest)await this.persistSystemPromptProvenance({communicationStyleDigest:Z.contentSha256}),this.options.communicationStyleDigest=Z.contentSha256;try{await Y1({...this.isRemoteWorkspace()?{workspaceAccess:"none"}:{projectPath:this.resourceRoot},includeEnvironment:!1,language:this.config.language,availableSkills:this.agentResources?.skills.generateAvailableSkillsList()??"",communicationStyle:this.selectedCommunicationStyle,communicationStyleCatalog:this.getCommunicationStyleCatalog(),projectRuleCatalog:this.getProjectRuleCatalog(),...this.isRemoteWorkspace()?{}:{projectInstructionSourcePath:this.projectRoot},environmentOptions:{...u1,workingDirectory:this.executionRoot}})}catch(J){E0.warn("[SessionRuntime] Failed to validate system prompt configuration:",J)}}async persistSystemPromptProvenance($){if(this.workspace.kind==="acp-remote"){await s.updateRemoteSessionMetadata(this.sessionId,this.workspaceRoot,this.workspace.descriptor,$);return}try{await s.updateSessionMetadata(this.sessionId,this.workspaceRoot,$)}catch(Z){if(!(Z instanceof fX||Z.code==="ENOENT")||this.options.subagentInfo)throw Z;await s.createSessionMetadata(this.sessionId,this.workspaceRoot,$)}}async registerBuiltinTools(){this.browserRuntime??=new n8(this.workspaceRoot,this.sessionId,{storageRoot:this.stateStorage.kind==="acp-remote"?this.stateStorage.root:t(),stateStorage:this.stateStorage,exposeArtifactPaths:!U0(this.sessionId)});let $=await v4({sessionId:this.sessionId,configDir:t(),workspaceRoot:this.workspaceRoot,resourceRoot:this.projectRoot,agentResources:this.agentResources,modelResources:this.modelResources,lspManager:this.lspManager,lspResources:this.lspResources,getReasoningEffort:()=>this.selectedReasoningEffort,getServiceTier:()=>this.selectedServiceTier,getResponseVerbosity:()=>this.selectedResponseVerbosity,getCommunicationStyle:()=>this.selectedCommunicationStyle,agentTeamsEnabled:this.config.agentTeamsEnabled===!0,stateStorage:this.stateStorage,userPromptArtifactStore:this.userPromptArtifactStore,browserRuntime:this.browserRuntime}),Z=iJ($.filter((J)=>!J.name.startsWith("mcp__")),this.workspaceToolPolicy);this.baseRegistry.registerAll(Z),await this.registerMcpTools()}async registerMcpTools(){try{let $=this.options.mcpServers??{};if(Object.keys($).length===0)return;let Z=e0.createIsolated({roots:U0(this.sessionId)?[]:[this.workspaceRoot],samplingAvailable:!0,oauthCredentialAccess:!U0(this.sessionId),artifactWriter:new o2(`${this.stateStorage.kind==="acp-remote"?this.workspaceRoot:this.projectRoot}\x00${this.sessionId}`,{storageRoot:this.stateStorage.kind==="acp-remote"?this.stateStorage.root:t(),stateStorage:this.stateStorage,exposePaths:!U0(this.sessionId)}),exposeLogDetails:!U0(this.sessionId),exposeInstructions:!U0(this.sessionId)});this.sessionMcpRegistry=Z,this.mcpCatalogBarrier=()=>Z.waitForCatalogIdle(),this.baseRegistry.setMcpCatalogBarrier(this.mcpCatalogBarrier);let J=(U)=>{this.applyMcpCatalog(U,this.initialized)};this.mcpCatalogListener=J,Z.on("catalogChanged",J);let Y=(U)=>{this.applyMcpContentCatalog(U)},Q=(U)=>{this.applyMcpResourceUpdated(U)},X=(U)=>{this.applyMcpConnectionChange(U)},z=(U)=>{this.applyMcpLog(U)},W=(U)=>{this.applyMcpInstructions(U)},V=(U)=>{if(U.owner.sessionId!==this.sessionId||F0.resolve(U.owner.projectPath)!==F0.resolve(this.workspaceRoot))return;this.applyMcpTask(U);let{owner:H,result:B,...G}=U;W0.publish({sessionId:this.sessionId,projectPath:this.workspaceRoot},"mcp.task.changed",G)};this.mcpContentCatalogListener=Y,this.mcpResourceUpdatedListener=Q,this.mcpConnectionListener=X,this.mcpLogListener=z,this.mcpInstructionsListener=W,this.mcpTaskListener=V,Z.on("contentCatalogChanged",Y),Z.on("resourceUpdated",Q),Z.on("connectionLifecycleChanged",X),Z.on("log",z),Z.on("instructionsChanged",W),$$.getInstance().on("taskChanged",V);for(let[U,H]of Object.entries($))try{let B=H.type==="stdio"?{...this.sessionEnvironment,...H.env}:void 0;await Z.registerServer(U,H.type==="stdio"?{...H,...B&&Object.keys(B).length>0?{env:B}:{}}:H)}catch(B){E0.warn(`Warning: MCP server "${U}" connection failed:`,B)}this.baseRegistry.replaceMcpTools(Z.getCatalogSnapshot().tools),this.baseRegistry.registerAll(Y6(Z)),this.baseRegistry.registerAll(KZ(Z))}catch($){E0.warn("Failed to register MCP tools:",$)}}filterMcpTools($,Z,J){return $.filter((Y)=>!J?.has(Y.name)&&(!Z||Z.has(Y.name)))}applyMcpCatalog($,Z){this.baseRegistry.replaceMcpTools($.tools);for(let[J,Y]of this.executorCatalogs){let Q=this.filterMcpTools($.tools,Y.allowed,Y.blocked),X=(V)=>!Y.blocked?.has(V)&&(!Y.allowed||Y.allowed.has(V)),z={revision:$.revision,serverName:$.serverName,reason:$.reason,added:$.added.filter(X),removed:$.removed.filter(X),updated:$.updated.filter(X)},W=z.added.length>0||z.removed.length>0||z.updated.length>0;J.replaceMcpTools(Q,Z&&W?z:void 0)}}applyMcpContentCatalog($){if(!this.initialized)return;let Z=$.kind==="resources"?["ListMcpResources","ReadMcpResource"]:$.kind==="resourceTemplates"?["ListMcpResourceTemplates","CompleteMcpArgument"]:["ListMcpPrompts","CompleteMcpArgument","GetMcpPrompt"];for(let[J,Y]of this.executorCatalogs)if(Z.some((X)=>!Y.blocked?.has(X)&&(!Y.allowed||Y.allowed.has(X))))J.queueMcpContentChange($)}applyMcpResourceUpdated($){if(!this.initialized)return;for(let[Z,J]of this.executorCatalogs)if(!J.blocked?.has("ReadMcpResource")&&(!J.allowed||J.allowed.has("ReadMcpResource")))Z.queueMcpResourceUpdated($)}applyMcpConnectionChange($){if(!this.initialized)return;for(let Z of this.executorCatalogs.keys())Z.queueMcpConnectionChange($)}applyMcpLog($){if(!this.initialized)return;for(let Z of this.executorCatalogs.keys())Z.queueMcpLog($)}applyMcpInstructions($){if(!this.initialized)return;for(let Z of this.executorCatalogs.keys())Z.queueMcpInstructionsChange({revision:$.revision,reason:$.reason,replace:!1,instructions:$.action==="added"&&$.instruction?[{serverName:$.serverName,...$.instruction}]:[],removed:$.action==="removed"?[$.serverName]:[]})}applyMcpTask($){if(!this.initialized)return;let{owner:Z,result:J,...Y}=$;for(let[Q,X]of this.executorCatalogs)if(["TaskOutput","ListMcpTasks","CancelMcpTask"].some((W)=>!X.blocked?.has(W)&&(!X.allowed||X.allowed.has(W))))Q.queueMcpTaskChange(Y)}handleMcpSampling=async($,Z)=>{let J=this.getChatService(),Y=await J.chat($.messages,void 0,Z,{maxOutputTokens:$.maxTokens,...$.temperature!==void 0?{temperature:$.temperature}:{}});return qX(Y,J.getConfig().model,$)};async loadAgentResources(){let $=this.options.agentResources?this.options.agentResources:this.isRemoteWorkspace()?AX(this.resourceRoot):await c0(this.projectRoot,{reconcilePlugins:!0});if(this.agentResources=k4($),this.subagentRegistry=this.agentResources.subagents,this.options.agents?.length)this.subagentRegistry.applyOverrides(this.options.agents)}}async function Z9(){let $=await B0.getInstance().reload();q0().config.actions.setConfig($),await e0.getInstance().disconnectAll(),kX(),await c0(C())}import KF from"fuse.js";import c$ from"node:path";import{Mutex as pD}from"async-mutex";var p$=new pD;async function xX($){let Z=$.getWorkspaceRoot();await f$(Z,async(J)=>{await $.reapplyEnabledSettings(),i1(Z),await l1(Z),await J9(J)})}async function lD($){let Z=$.getWorkspaceRoot();return f$(Z,async(J)=>{i1(Z);let Y=await $.refresh();return await l1(Z),await J9(J),Y})}async function Y9($){return f$($,async(Z)=>{let J=Array.from(new Set([Z.plugins,...W2.getInitializedInstances()])),Y;for(let Q of J){let X=await lD(Q);if(Q===Z.plugins)Y=X}return Y??{plugins:[],errors:[]}})}async function iD($,Z){let J=c$.resolve($),Y=h1();await Promise.all([Y.removePluginSetting(Z,{scope:"global",immediate:!0}),Y.removePluginSetting(Z,{scope:"project",projectDir:J,immediate:!0}),Y.removePluginSetting(Z,{scope:"local",projectDir:J,immediate:!0})])}function rD($){return c$.isAbsolute($)||$.startsWith("./")||$.startsWith("../")||$==="~"||$.startsWith("~/")}async function IX($,Z){if(rD(Z)&&!vX(await a0.getInstance().getStatus($)))throw Error("Local plugin sources require a trusted workspace")}async function V8($,Z,J,Y="local"){return p$.runExclusive(async()=>{let Q=c$.resolve($);return f$(Q,async(X)=>{let z=X.plugins.get(Z);if(!z)throw Error(`Plugin not found: ${Z}`);if(z.source==="cli")throw Error(`Plugin "${Z}" was loaded with --plugin-dir and is invocation-scoped`);await h1().save({enabledPlugins:{[Z]:J}},{scope:Y,projectDir:Q,immediate:!0});let W=Y==="global"?Array.from(new Set([X.plugins,...W2.getInitializedInstances()])):[X.plugins];for(let H of W)await xX(H);let V=X.plugins.get(Z);if(!V)throw Error(`Plugin disappeared during reconciliation: ${Z}`);let U=await B0.getInstance().loadWorkspacePluginSettingsResolution(Q);return{name:Z,requestedEnabled:J,effectiveEnabled:V.status==="active",scope:Y,source:V.source,status:V.status,effectiveScope:U.settings[Z]?.effectiveScope??"default"}})})}async function U8($){return p$.runExclusive(()=>f$($,async(Z)=>{i1(Z.workspaceRoot);let J=await Z.plugins.refresh();return await l1(Z.workspaceRoot),{registry:Z.plugins,discovery:J}}))}async function Q9($,Z,J="global"){return p$.runExclusive(async()=>{let Y=c$.resolve($),Q={...Z,...yX(Z)};return await h1().save({pluginSourcePolicy:Q},{scope:J,projectDir:Y,immediate:!0}),f$(Y,async(X)=>{let z=J==="global"?Array.from(new Set([X.plugins,...W2.getInitializedInstances()])):[X.plugins];for(let W of z)await xX(W);return B0.getInstance().loadWorkspacePluginSourcePolicy(Y)})})}async function X9($,Z,J={}){return p$.runExclusive(async()=>{let Y=c$.resolve($);await IX(Y,Z);let Q=await B0.getInstance().loadWorkspacePluginSourcePolicy(Y),X=await G$().install(Z,{...J,workspaceRoot:Y,policy:Q});if(!X.success)return{result:X};let z=await Y9(Y);return{result:X,discovery:z}})}async function z9($,Z,J={}){return p$.runExclusive(async()=>{let Y=c$.resolve($),Q=await B0.getInstance().loadWorkspacePluginSourcePolicy(Y),X=await G$().update(Z,{...J,workspaceRoot:Y,policy:Q});if(!X.success)return{result:X};let z=await Y9(Y);return{result:X,discovery:z}})}async function W9($,Z,J=!1){return p$.runExclusive(async()=>{let Y=c$.resolve($);return f$(Y,async(Q)=>{let X=Q.plugins.getAll().filter((V)=>V.manifest.name!==Z&&V.manifest.dependencies?.[Z]!==void 0).map((V)=>V.manifest.name).sort();if(X.length>0)return{result:{success:!1,pluginName:Z,code:"PLUGIN_REQUIRED",error:`Plugin "${Z}" is required by: ${X.join(", ")}`}};let z=await G$().uninstall(Z,J);if(!z.success)return{result:z};await iD(Y,Z);let W=await Y9(Y);return{result:z,discovery:W}})})}async function V9($,Z,J){return p$.runExclusive(async()=>{let Y=c$.resolve($);await IX(Y,Z);let Q=await B0.getInstance().loadWorkspacePluginSourcePolicy(Y);return G$().addMarketplace(Z,{workspaceRoot:Y,ref:J,policy:Q})})}async function U9($,Z){return p$.runExclusive(async()=>{let J=c$.resolve($),Y=await B0.getInstance().loadWorkspacePluginSourcePolicy(J);return G$().refreshMarketplace(Z,Y)})}async function H9($,Z=!1){return p$.runExclusive(()=>G$().removeMarketplace($,Z))}var nD={name:"btw",description:"Ask a side question without changing the main conversation",fullDescription:"Ask one context-aware question in an isolated, tool-free conversation.",usage:"/btw <question>",category:"conversation",examples:["/btw What did the last test failure mean?"],async handler($,Z){let J=$.join(" ").trim();if(!J)return{success:!1,error:"Usage: /btw <question>"};if(!Z.sideConversation)return{success:!1,error:"Side conversations require an active Session runtime"};let Y=await Z.sideConversation.ask(J,Z.signal);return{success:!0,content:`**/btw** ${J}
|
|
1111
|
+
`+" /init");if(!G&&Q&&Q!=="inherit"&&!b.some((A)=>A.id===Q))Q=void 0;let M=await z4({workspaceRoot:F,...w?{workspaceAccess:"none",resourceRoot:$.workspace.resourceRoot}:{},storeServers:_.mcpServers??{},sessionServers:$.mcpServers,cliConfigs:$.mcpConfig,strictCliConfig:$.strictMcpConfig}),E={...O.config,permissionMode:X??O.config.permissionMode??"default",lspServers:structuredClone(N.servers),permissions:w?structuredClone(O.config.permissions):await L.loadWorkspacePermissions(F,O.config.permissions),hooks:w?{enabled:!1}:await L.loadWorkspaceHooks(F,O.config.hooks??{})};L.validateConfig(E,O.catalog);let j=new q1(E,{...$,modelResources:O,lspResources:N,mcpServers:M,...Q?{modelId:Q}:{},permissionMode:E.permissionMode,reasoningEffort:z,serviceTier:W,responseVerbosity:V,communicationStyle:U,...H?{communicationStyleDigest:H}:{},...B?{projectInstructionsDigest:B}:{},...J?{taskWorktree:J}:{},...Y?{taskIsolation:Y}:{}});return await j.initialize(),j}catch(w){if(!$.auxiliaryReadOnly&&!$.subagentInfo&&!(w instanceof m4)){let q=J?await C$.getChangeSummary($.sessionId).catch(()=>{return}):void 0;await q1.persistTaskStatus($.sessionId,Z,"failed","Session runtime initialization failed",q??void 0,$.workspace?.kind==="acp-remote"?$.workspace.descriptor:void 0).catch((_)=>{if(_.code!=="ENOENT")E0.warn(`[SessionRuntime ${$.sessionId}] Failed to persist initialization failure`,_)})}throw w}}static async hasPendingInbox($,Z,J=v$($)){if(await T1(J,Z,async({inboxPath:X})=>{try{return(await BX(X)).size>0}catch(z){if(z.code!=="ENOENT")throw z;return!1}}))return!0;if(J.kind==="acp-remote")return!1;if(j0()?.agentTeamsEnabled!==!0)return!1;let Q=(await B$.getInstance(t()).listTeams()).filter((X)=>X.deletedAt===void 0&&X.leadSessionId===Z&&X.workspaceRoot===$);for(let X of Q)if((await new H$(X.name,t()).listPending("team-lead")).length>0)return!0;return!1}static async hasDurableFollowUpInbox($,Z,J=v$($)){return T1(J,Z,async({inboxPath:Y})=>{try{return await BX(Y),!0}catch(Q){if(Q.code!=="ENOENT")throw Q;return!1}})}static async hasActiveGoal($,Z,J=v$($)){return V0.hasActiveGoal($,Z,J)}static async hasRecoverableTurn($,Z,J=v$($)){return new _2($,100,void 0,J).hasRecoverableTurn(Z)}get sessionId(){return this.options.sessionId}get workspaceRoot(){return this.options.workspaceRoot??C()}get executionRoot(){return this.workspace.executionRoot}get resourceRoot(){return this.workspace.resourceRoot}isRemoteWorkspace(){return this.workspace.kind==="acp-remote"}get projectRoot(){return this.options.modelResources?.projectRoot??this.options.lspResources?.projectRoot??this.options.agentResources?.projectRoot??this.options.taskWorktree?.originalWorkspaceRoot??this.workspaceRoot}getConfig(){return this.config}getAvailableModels(){return this.config.models.map(($)=>structuredClone($))}getModelById($){let Z=this.config.models.find((J)=>J.id===$);return Z?structuredClone(Z):void 0}getAgentResources(){if(!this.agentResources)throw Error("Session agent resources are unavailable before initialization");return this.agentResources}getModelResources(){return this.modelResources}getLspResources(){return V2(this.lspResources)}isTaskSession(){return!this.options.subagentInfo&&this.options.taskIsolation!==void 0}getTaskAdmissionLimits(){let $=g1.getStats();return{maxConcurrent:$.maxConcurrent,maxQueued:$.maxQueued,maxQueuedBytes:$.maxQueuedBytes}}async setTaskAdmission($){if(!this.isTaskSession())return;let Z=new Date().toISOString(),J=$.state==="queued",Y={taskStatus:$.state,taskStatusReason:null,taskFailure:null,taskQueuePosition:J?$.queuePosition??1:null,taskQueueDepth:J?$.queueDepth:null,taskConcurrencyLimit:$.maxConcurrent,...J?{taskStartedAt:null,taskCompletedAt:null,taskOwnerPid:null}:{taskStartedAt:Z,taskCompletedAt:null,taskOwnerPid:process.pid}},Q=this.workspace.kind==="acp-remote"?await s.updateRemoteSessionMetadata(this.sessionId,this.workspaceRoot,this.workspace.descriptor,Y):await s.updateSessionMetadata(this.sessionId,this.workspaceRoot,Y);return W0.publish({sessionId:this.sessionId,projectPath:this.workspaceRoot},"task.status",{taskStatus:Q.taskStatus,...Q.taskStartedAt?{taskStartedAt:Q.taskStartedAt}:{},...$.queuePosition?{taskQueuePosition:$.queuePosition}:{},taskQueueDepth:$.queueDepth,taskConcurrencyLimit:$.maxConcurrent,taskInFlight:$.inFlight,taskAdmissionPaused:g1.getStats().paused,updatedAt:Q.lastMessageTime}),Q}publishTaskAdmissionCapacity($){if(!this.isTaskSession())return;let Z=g1.getStats();W0.publish({sessionId:this.sessionId,projectPath:this.workspaceRoot},"task.status",{taskStatus:$,taskQueueDepth:Z.queued,taskConcurrencyLimit:Z.maxConcurrent,taskInFlight:Z.inFlight,taskAdmissionPaused:Z.paused,updatedAt:new Date().toISOString()})}getChatService(){if(!this.chatService)throw Error("Session runtime is not initialized");return this.chatService}beginProviderRecovery(){let $=this.providerRecovery.begin();return this.providerRecoveryGeneration=$,this.publishProviderRecovery(this.providerRecovery.snapshot()),$}observeProviderRecovery($,Z){let J=this.providerRecovery.observe($,Z);if(J)this.publishProviderRecovery(J);return J}clearProviderRecovery($){let Z=this.providerRecovery.clear($);if(this.providerRecoveryGeneration?.id===$.id)this.providerRecoveryGeneration=void 0;if(Z)this.publishProviderRecovery(Z);return Z}getProviderRecoveryProjection(){return this.providerRecovery.snapshot()}publishProviderRecovery($){W0.publish({sessionId:this.sessionId,projectPath:this.workspaceRoot},"provider.recovery",{recovery:$})}beginTurnActivity(){let $=this.turnActivity.begin();return this.turnActivityGeneration=$,this.publishTurnActivity(this.turnActivity.snapshot()),$}observeTurnActivity($,Z){let J=this.turnActivity.observe($,Z);if(J)this.publishTurnActivity(J);return J}clearTurnActivity($){let Z=this.turnActivity.clear($);if(this.turnActivityGeneration?.id===$.id)this.turnActivityGeneration=void 0;if(Z)this.publishTurnActivity(Z);return Z}getTurnActivityProjection(){return this.turnActivity.snapshot()}publishTurnActivity($){W0.publish({sessionId:this.sessionId,projectPath:this.workspaceRoot},"turn.activity",{activity:$})}getExecutionEngine(){if(!this.executionEngine)throw Error("Session runtime is not initialized");return this.executionEngine}async loadModelContext(){if(!this.initialized)throw Error("Session runtime is not initialized");return this.workspace.kind==="acp-remote"?s.loadRemoteSessionModelContext(this.sessionId,this.workspaceRoot,this.workspace.descriptor):s.loadSessionModelContext(this.sessionId,this.workspaceRoot)}async askSideQuestion($,Z={}){if(!this.initialized||!this.chatService)throw Error("Session runtime is not initialized");let J=this.sideConversationOperations.enter(Z.signal),Y=this.config.permissionMode??"default",Q;try{if(J.signal.aborted)throw new DOMException("Side conversation aborted","AbortError");Q=this.createToolExecutor({permissionMode:Y});let X=Q.getRegistry();await X.waitForMcpCatalogIdle(J.signal);let[z,W]=await Promise.all([this.loadModelContext(),Y1({...this.isRemoteWorkspace()?{workspaceAccess:"none"}:{projectPath:this.resourceRoot},replaceDefault:Z.systemPrompt,append:Z.appendSystemPrompt,...Y==="plan"?{mode:"plan"}:{},includeEnvironment:!0,environmentOptions:{...u1,workingDirectory:this.executionRoot},language:this.config.language,availableSkills:this.agentResources?.skills.generateAvailableSkillsList()??"",communicationStyle:this.selectedCommunicationStyle,communicationStyleCatalog:this.getCommunicationStyleCatalog(),projectRuleCatalog:this.getProjectRuleCatalog(),...this.isRemoteWorkspace()?{}:{projectInstructionSourcePath:this.projectRoot}})]);if(J.signal.aborted)throw new DOMException("Side conversation aborted","AbortError");let V=SX(W.prompt,X);if(!V)throw Error("Side conversation system prompt is empty");return await MJ({question:$,sessionId:this.sessionId,workspaceRoot:this.executionRoot,systemPrompt:V,messages:z,tools:X.getFunctionDeclarationsByMode(Y),chatService:this.chatService,signal:J.signal,providerRecoveryBudgetMs:this.config.providerForegroundRecoveryMs})}finally{Q?.dispose(),J.release()}}getStartupTurnRecovery(){return this.startupTurnRecovery?structuredClone(this.startupTurnRecovery):void 0}getTurnRecoveryAssessment(){if(this.startupTurnRecoveryAcknowledged)return{state:"none"};return E3(this.startupTurnRecovery)}takeStartupTurnRecoveryAssessment(){if(this.startupTurnRecoveryAssessmentTaken)return{state:"none"};return this.startupTurnRecoveryAssessmentTaken=!0,this.getTurnRecoveryAssessment()}async acknowledgeStartupTurnRecovery(){let $=this.startupTurnRecovery;if($?.outcome==="aborted")await this.getExecutionEngine().getContextManager().persistentStore.acknowledgeTurnRecovery(this.sessionId,$.turnId);this.startupTurnRecoveryAcknowledged=!0,this.startupTurnRecoveryAssessmentTaken=!0,await this.activeTurnMailbox?.setRecoveryProtectedIds([])}async getRecoveredFinalResponse(){let $=this.startupTurnRecovery;if(!$||$.outcome!=="completed")return;let J=(await this.loadModelContext()).findLast((z)=>z.role==="assistant"&&DX(z)?.turnId===$.turnId&&JSON.stringify(DX(z))===JSON.stringify($.finalization));if(!J||typeof J.content!=="string")return;let Y=J.metadata&&typeof J.metadata==="object"&&!Array.isArray(J.metadata)?J.metadata:void 0,Q=Y?.structuredOutput,X=Q&&typeof Q==="object"&&!Array.isArray(Q)&&Q.output&&typeof Q.output==="object"&&!Array.isArray(Q.output)?Q.output:void 0;return{turnId:$.turnId,content:J.content,...X?{structuredOutput:X}:{},...typeof Y?.structuredOutputSchemaDigest==="string"?{structuredOutputSchemaDigest:Y.structuredOutputSchemaDigest}:{}}}takeStartupAdoptedToolResults(){let $=this.startupAdoptedToolResults;return this.startupAdoptedToolResults=[],structuredClone($)}getAttachmentCollector(){return this.attachmentCollector}getCurrentModelId(){return this.currentModelId}captureBrowserScreenshot($){if(!this.browserRuntime)throw new f("browser_page_not_found","The Agent browser is not available");return this.browserRuntime.screenshot($)}getReasoningConfiguration(){if(!this.currentReasoning)throw Error("Session runtime is not initialized");return{...this.currentReasoning,supported:[...this.currentReasoning.supported]}}resolveReasoningConfiguration($,Z=this.currentModelId){return m0(this.resolveModelConfig(Z),this.config,$,this.modelResources.catalog).reasoning}getServiceTierConfiguration(){if(!this.currentServiceTier)throw Error("Session runtime is not initialized");return{...this.currentServiceTier,supported:[...this.currentServiceTier.supported]}}resolveServiceTierConfiguration($,Z=this.currentModelId){return m0(this.resolveModelConfig(Z),this.config,this.selectedReasoningEffort,this.modelResources.catalog,$).serviceTier}getResponseVerbosityConfiguration(){if(!this.currentResponseVerbosity)throw Error("Session runtime is not initialized");return{...this.currentResponseVerbosity,supported:[...this.currentResponseVerbosity.supported]}}resolveResponseVerbosityConfiguration($,Z=this.currentModelId){return m0(this.resolveModelConfig(Z),this.config,this.selectedReasoningEffort,this.modelResources.catalog,this.selectedServiceTier,$).responseVerbosity}getCommunicationStyleConfiguration(){return z8(this.selectedCommunicationStyle,this.getCommunicationStyleCatalog())}resolveCommunicationStyleConfiguration($){return z8($,this.getCommunicationStyleCatalog())}getCommunicationStyleCatalog(){return this.agentResources?.communicationStyles??jX}getProjectRuleCatalog(){return this.agentResources?.projectRules??EX.empty(this.projectRoot)}getStaticProjectRules(){return this.getProjectRuleCatalog().staticRules(this.projectRoot)}hydrateProjectRules($){return this.getProjectRuleCatalog().hydrate($)}resolveContextualProjectRules($,Z,J,Y){if(this.isRemoteWorkspace())return this.getProjectRuleCatalog().contextualRules(this.projectRoot,[],Y);let Q=new Set;try{let V=this.baseRegistry.get($)?.build(Z);for(let U of V?.getAffectedPaths()??[])if(U)Q.add(U)}catch{}let X=(V)=>{if(typeof V==="string"&&V.trim())Q.add(V)};if(["Read","Edit","Write"].includes($))X(Z.file_path);else if($==="NotebookEdit")X(Z.notebook_path);else if(["Grep","Glob"].includes($))X(Z.path);else if($==="Bash")X(Z.cwd);let z=J?.metadata&&typeof J.metadata==="object"?J.metadata:void 0;if(Array.isArray(z?.affected_paths))for(let V of z.affected_paths)X(V);if(Array.isArray(z?.changes)){for(let V of z.changes)if(V&&typeof V==="object")X(V.path)}let W=[...Q].map((V)=>F0.isAbsolute(V)?F0.resolve(V):F0.resolve(this.workspaceRoot,V)).flatMap((V)=>{let U=F0.relative(this.workspaceRoot,V);if(U===""||!U.startsWith("..")&&!F0.isAbsolute(U))return[F0.resolve(this.projectRoot,U)];let H=F0.relative(this.projectRoot,V);return H===""||!H.startsWith("..")&&!F0.isAbsolute(H)?[V]:[]});return this.getProjectRuleCatalog().contextualRules(this.projectRoot,W,Y)}getCurrentModelMaxContextTokens(){if(this.currentModelMaxContextTokens===void 0)throw Error("Session runtime is not initialized");return this.currentModelMaxContextTokens}getGoal(){return this.goalStore.get()}async prepareGoalContinuation($,Z={}){try{let J=await o6($,{configDir:t(),stateStorage:this.stateStorage}),Y=Z.observeStall===!1&&$.frontierStall?.digestSha256===J.frontier.digestSha256,Q=Z.observeStall===!1?Y?$.frontierStall:void 0:y3($.executionFrontier,J.frontier,{taskEffect:"none",prematureStopCount:$.prematureStop?.consecutiveCount??0,verificationStallCount:$.verificationStall?.consecutiveCount??0},$.frontierStall);return{ok:!0,goal:await this.goalStore.recordExecutionFrontier(J.frontier,Q,{preserveStall:Y}),...J}}catch(J){let Y=J instanceof Error?J.message:String(J),Q=null;try{Q=await this.goalStore.pause(`goal task list unavailable (${a2($)}): ${Y}`)}catch(X){E0.warn(`[SessionRuntime] Failed to pause Goal after frontier failure: ${X instanceof Error?X.message:String(X)}`)}return{ok:!1,goal:Q,error:{code:"task_list_unavailable",message:`Goal execution frontier unavailable: ${Y}`}}}}async setTaskStatus($,Z){if(this.options.subagentInfo)return;let J=this.options.taskWorktree&&!["queued","running"].includes($)?await C$.getChangeSummary(this.sessionId):void 0;return q1.persistTaskStatus(this.sessionId,this.workspaceRoot,$,Z,J??void 0,this.workspace.kind==="acp-remote"?this.workspace.descriptor:void 0)}static async persistTaskStatus($,Z,J,Y,Q,X){let z=new Date().toISOString(),W=J==="failed"&&Y!==void 0?W8(Y):void 0,V=W?.message??(typeof Y==="string"?Y.slice(0,500):void 0),U={taskStatus:J,taskStatusReason:V??null,taskFailure:W??null,...Q!==void 0?{taskDiffStat:Q}:J==="running"?{taskDiffStat:null}:{},...J!=="queued"?{taskQueuePosition:null,taskQueueDepth:null}:{},...J==="running"?{taskStartedAt:z,taskCompletedAt:null,taskOwnerPid:process.pid}:J==="queued"?{taskStartedAt:null,taskCompletedAt:null,taskOwnerPid:null}:{taskCompletedAt:z,taskOwnerPid:null}},H=X?await s.updateRemoteSessionMetadata($,Z,X,U):await s.updateSessionMetadata($,Z,U);return W0.publish({sessionId:$,projectPath:Z},"task.status",{taskStatus:H.taskStatus,...V?{taskStatusReason:V}:{},...W?{taskFailure:W}:{},...H.taskStartedAt?{taskStartedAt:H.taskStartedAt}:{},...H.taskCompletedAt?{taskCompletedAt:H.taskCompletedAt}:{},...H.taskDiffStat?{taskDiffStat:H.taskDiffStat}:{},...H.taskQueuePosition?{taskQueuePosition:H.taskQueuePosition}:{},...H.taskQueueDepth!==void 0?{taskQueueDepth:H.taskQueueDepth}:{},...H.taskConcurrencyLimit!==void 0?{taskConcurrencyLimit:H.taskConcurrencyLimit}:{},updatedAt:H.lastMessageTime}),H}createGoal($,Z){return this.goalStore.create($,Z)}async beginGoalTurn($){let Z=this.getActiveTurnMailbox(),J=await Z.beginTurn(),Y=await this.goalStore.prepareTurnBinding(J.id,!0);if(!Y||Y.goalId!==$.goalId||Y.objective!==$.objective)return await Z.finishTurn(J).catch(()=>{return}),null;let Q=!1;try{await this.saveTurnStart(J,"goal",[],{goalId:Y.goalId,...Y.lineage}),Q=!0;let X=await this.goalStore.commitTurnBinding(Y);if(!X)throw Error("Goal changed before turn lineage commit");return{handle:J,goal:X}}catch(X){throw await this.releaseFailedTurnStart(J,Q),X}}editGoal($){return this.goalStore.edit($)}pauseGoal($){return this.goalStore.pause($)}resumeGoal(){return this.goalStore.resume()}clearGoal(){return this.goalStore.clear()}recordGoalCompletionVerification($){return this.goalStore.recordCompletionVerification($)}invalidateGoalCompletionVerification($){return this.goalStore.invalidateCompletionVerification($)}clearGoalFrontierStall(){return this.goalStore.clearFrontierStall()}finalizeVerifiedGoalCompletion(){return this.goalStore.finalizeVerifiedCompletion()}recordGoalProgress($){return this.goalStore.recordProgress($)}async pauseActiveGoal($){return this.goalStore.pauseIfActive($)}async listRewindCheckpoints(){return this.assertRewindIdle(),s.listRewindCheckpoints(this.sessionId,this.workspaceRoot)}async rewindSession($){this.assertRewindIdle();let Z=await s.rewindSession(this.sessionId,this.workspaceRoot,$);return this.backgroundTaskChildIds=await this.getExecutionEngine().getContextManager().persistentStore.loadBackgroundTaskChildIds(this.sessionId),this.backgroundTaskCompletionSettledIds.clear(),Z}listSubagents(){return D0.getInstance().listForSession({sessionId:this.sessionId,projectPath:this.workspaceRoot})}getMcpContentCatalog(){return this.sessionMcpRegistry?.getContentCatalogSnapshot()??{revision:0,resources:[],resourceTemplates:[],prompts:[]}}async refreshMcpContentCatalogs($){if(!this.sessionMcpRegistry)throw Error("This Session has no MCP servers");await this.sessionMcpRegistry.refreshContentCatalogs($)}async getMcpPrompt($,Z,J){if(!this.sessionMcpRegistry)throw Error("This Session has no MCP servers");return this.sessionMcpRegistry.getPrompt($,Z,J)}async completeMcpArgument($,Z,J){if(!this.sessionMcpRegistry)throw Error("This Session has no MCP servers");return this.sessionMcpRegistry.complete($,Z,J)}listMcpTasks($){return $$.getInstance().list({sessionId:this.sessionId,projectPath:this.workspaceRoot},$)}getMcpTask($){return $$.getInstance().get($,{sessionId:this.sessionId,projectPath:this.workspaceRoot})}cancelMcpTask($,Z){return $$.getInstance().cancel($,{sessionId:this.sessionId,projectPath:this.workspaceRoot},Z)}getMcpLogs($,Z={}){return this.sessionMcpRegistry?.getLogSnapshot($,Z)??{revision:0,entries:[]}}getMcpInstructions(){return this.sessionMcpRegistry?.getInstructionsSnapshot()??{revision:0,instructions:[]}}async setMcpLoggingLevel($,Z){if(!this.sessionMcpRegistry)throw Error("This Session has no MCP servers");await this.sessionMcpRegistry.setServerLoggingLevel($,Z)}resumeSubagent($){this.assertSubagentControlIdle();let Z=D0.getInstance(),J={sessionId:this.sessionId,projectPath:this.workspaceRoot},Y=Z.getAgent($.agentId,J);if(!Y)throw Error(`Subagent not found in this session: ${$.agentId}`);let Q=this.subagentRegistry?.getSubagent(Y.subagentType),X=Y.configSnapshot?{...Y.configSnapshot}:Q;if(!X)throw Error(`Subagent configuration is unavailable: ${Y.subagentType}`);let z=Z.resumeAgent({agentId:Y.id,prompt:$.prompt,config:X,owner:J,permissionMode:X.permissionMode,reasoningEffort:this.selectedReasoningEffort,serviceTier:this.selectedServiceTier,responseVerbosity:this.selectedResponseVerbosity,communicationStyle:this.selectedCommunicationStyle,agentResources:this.agentResources,modelResources:this.modelResources,lspResources:this.lspResources,onEvent:$.onEvent,onCompleted:async(V)=>{await this.notifyBackgroundSubagentCompleted(V.id),await $.onCompleted?.(V)}});if(!z)throw Error(`Subagent cannot be resumed: ${Y.id}`);let W=Z.getAgent(z.agentId,J);if(!W)throw Error(`Resumed subagent was not persisted: ${z.agentId}`);return{source:z.source,session:W}}async beginTurn($="goal"){let Z=await this.getActiveTurnMailbox().beginTurn();try{return await this.saveTurnStart(Z,$),Z}catch(J){throw await this.getActiveTurnMailbox().finishTurn(Z).catch(()=>{return}),J}}async prepareInputTurn($,Z){let J=this.getActiveTurnMailbox(),Y=await this.materializeUserMessage($,Z?.metadata),Q=await J.prepareInputTurn(Y.content,{...Z,...Y.metadata?{metadata:Y.metadata}:{}});if(!Q.accepted)return Q;let X=!1;try{let z=await this.goalStore.prepareTurnBinding(Q.handle.id,!1);if(await this.saveTurnStart(Q.handle,Q.mode==="direct"?"user":"pending",await J.reservedMessageIds(Q.handle),z?{goalId:z.goalId,...z.lineage}:void 0),X=!0,z&&!await this.goalStore.commitTurnBinding(z))throw Error("Goal changed before user turn lineage commit");return Q}catch(z){throw await this.releaseFailedTurnStart(Q.handle,X),z}}async enqueueSteering($,Z){let J=(Z?.origin??"user")==="user"?await this.materializeUserMessage($,Z?.metadata):{content:$,metadata:Z?.metadata,offloaded:!1},Y=await this.getActiveTurnMailbox().enqueue(J.content,{...Z,...J.metadata?{metadata:J.metadata}:{}});if(Y.accepted&&Y.delivery==="current_turn"&&Y.turnId)await this.goalStore.invalidateTurnLineageRoot(Y.turnId);if(Y.accepted)this.signalBackgroundSubagentCompletionWaiters();return Y}materializeUserMessage($,Z){return this.userPromptArtifactStore.materialize($,Z)}restoreUserMessage($,Z){return this.userPromptArtifactStore.restore($,Z)}async drainSteering($){return this.getActiveTurnMailbox().drain($)}async drainSteeringOrSeal($){return this.getActiveTurnMailbox().drainOrSeal($)}async getClaimedTurnMessageIds($){return this.getActiveTurnMailbox().claimedMessageIds($)}async getRecoveredEmptyFinalState($){let Z=this.startupTurnRecovery;if(!Z||Z.outcome!=="aborted")return{hadSuccessfulToolResult:!1,correctionSpent:!1};let J=await this.getClaimedTurnMessageIds($),Y=new Set(Z.inputMessageIds);if(J.length===0||J.some((Q)=>!Y.has(Q)))return{hadSuccessfulToolResult:!1,correctionSpent:!1};return{hadSuccessfulToolResult:Z.hadSuccessfulToolResult,...Z.interruptedToolCallCount?{interruptedToolCallCount:Z.interruptedToolCallCount}:{},...Z.allSuccessfulToolResultsSafeForResume===!0?{allSuccessfulToolResultsSafeForResume:!0}:{},correctionSpent:Z.emptyFinalCorrectionSpent}}async discardPendingInput(){let $=this.getActiveTurnMailbox(),Z=$.pendingMessages().map((J)=>J.id);if(Z.length===0)return;await this.getExecutionEngine().getContextManager().persistentStore.acknowledgeInboxMessages(this.sessionId,Z),await $.acknowledge(Z)}async finishTurn($,Z={}){let J=Z.outcome??{status:"aborted",cause:"interrupted",turnsCount:0,toolCallsCount:0,durationMs:0},Y=this.getExecutionEngine().getContextManager().persistentStore;if(J.status==="completed"){let z=await this.getActiveTurnMailbox().claimedMessageIds($);await Y.saveTurnCompletion(this.sessionId,{turnId:$.id,completedAt:new Date().toISOString(),turnsCount:J.turnsCount,toolCallsCount:J.toolCallsCount,durationMs:J.durationMs},z),await this.getActiveTurnMailbox().acknowledge(z)}else{let z=this.startupTurnRecovery,W=Z.preserveStartupRecovery&&z?.outcome==="aborted"?{hadSuccessfulToolResult:z.hadSuccessfulToolResult,interruptedToolCallCount:z.interruptedToolCallCount??0,allSuccessfulToolResultsSafeForResume:z.allSuccessfulToolResultsSafeForResume,correctionSpent:z.emptyFinalCorrectionSpent}:await this.getRecoveredEmptyFinalState($),V=await this.getActiveTurnMailbox().claimedMessageIds($),U=await Y.saveTurnAbort(this.sessionId,{turnId:$.id,cause:J.cause,abortedAt:new Date().toISOString(),turnsCount:J.turnsCount,toolCallsCount:J.toolCallsCount,durationMs:J.durationMs,recovery:{version:3,inputMessageIds:V,hadSuccessfulToolResult:W.hadSuccessfulToolResult,interruptedToolCallCount:W.interruptedToolCallCount??0,allSuccessfulToolResultsSafeForResume:W.allSuccessfulToolResultsSafeForResume===!0,emptyFinalCorrectionSpent:W.correctionSpent}},Z.acknowledgeInput?{acknowledgeInputMessageIds:V}:void 0);if(this.startupTurnRecovery=U.recovery,this.startupTurnRecoveryAcknowledged=!1,this.startupTurnRecoveryAssessmentTaken=!1,await this.getActiveTurnMailbox().setRecoveryProtectedIds(U.recovery?.inputMessageIds??[]),Z.acknowledgeInput)await this.getActiveTurnMailbox().acknowledge(U.acknowledgedInputMessageIds)}let Q=await this.getActiveTurnMailbox().finishTurn($,Z);if(!Q)return;let X=!1;try{let z=await this.goalStore.prepareTurnBinding(Q.id,!1);if(await this.saveTurnStart(Q,"pending",await this.getActiveTurnMailbox().reservedMessageIds(Q),z?{goalId:z.goalId,...z.lineage}:void 0),X=!0,z&&!await this.goalStore.commitTurnBinding(z))throw Error("Goal changed before pending turn lineage commit");return Q}catch(z){throw await this.releaseFailedTurnStart(Q,X),z}}async beginPendingTurn(){let $=this.getActiveTurnMailbox(),Z=await $.beginPendingTurn();if(!Z)return;let J=!1;try{let Y=await this.goalStore.prepareTurnBinding(Z.id,!1);if(await this.saveTurnStart(Z,"pending",await $.reservedMessageIds(Z),Y?{goalId:Y.goalId,...Y.lineage}:void 0),J=!0,Y&&!await this.goalStore.commitTurnBinding(Y))throw Error("Goal changed before pending turn lineage commit");return Z}catch(Y){throw await this.releaseFailedTurnStart(Z,J),Y}}hasActiveTurn(){return this.activeTurnMailbox?.isActive()??!1}hasTurnOwner(){return this.activeTurnMailbox?.hasTurnOwner()??!1}getPendingSteeringCount(){return this.activeTurnMailbox?.pendingCount()??0}getPendingSteeringMessages(){return this.activeTurnMailbox?.pendingMessages()??[]}async getFollowUpQueueSnapshot(){return this.getActiveTurnMailbox().getFollowUpQueueSnapshot()}async mutateFollowUpQueue($){return this.getActiveTurnMailbox().mutateFollowUpQueue($)}isIdleForResidency(){if(!this.initialized||this.disposing||this.hasActiveTurn()||this.hasTurnOwner()||this.sideConversationOperations.stats().active>0||this.getPendingSteeringCount()>0||this.executorCatalogs.size>0)return!1;if(!this.isRemoteWorkspace()&&Y0.getInstance().listForSession(this.sessionId).some((Z)=>Z.status==="running"))return!1;let $={sessionId:this.sessionId,projectPath:this.workspaceRoot};if(D0.getInstance().listForSession($).some((Z)=>Z.status==="running")||this.getBackgroundTaskChildrenState()!=="none")return!1;return!$$.getInstance().hasActive($)}getRecoveredSteeringCount(){return this.activeTurnMailbox?.recoveredCount()??0}async notifyBackgroundSubagentCompleted($){await iZ.dispatch(this.backgroundSubagentCompletionOwner,$)}registerBackgroundSubagent($){this.backgroundTaskChildIds.add($),this.backgroundTaskCompletionSettledIds.delete($)}async waitForBackgroundSubagentFollowUp($,Z){while(!Z?.aborted){if(this.disposing||!this.initialized||!this.activeTurnMailbox)return!1;if(await this.reconcileBackgroundSubagentCompletions(),this.disposing||!this.initialized||!this.activeTurnMailbox)return!1;if(await this.hasUnclaimedPendingInput($))return!0;let J=this.backgroundSubagentCompletionRevision,Y=this.getBackgroundTaskChildrenState();if(Y==="none")return!1;if(Y==="terminal_pending")continue;await this.waitForBackgroundSubagentSignal(J,Z)}return!1}async hasUnclaimedPendingInput($){let Z=new Set(await this.getActiveTurnMailbox().claimedMessageIds($));return this.getActiveTurnMailbox().pendingMessages().some((J)=>!Z.has(J.id))}signalBackgroundSubagentCompletionWaiters(){this.backgroundSubagentCompletionRevision++;for(let $ of this.backgroundSubagentCompletionWaiters)$();this.backgroundSubagentCompletionWaiters.clear()}async waitForBackgroundSubagentSignal($,Z){if(Z?.aborted||$!==this.backgroundSubagentCompletionRevision)return;await new Promise((J)=>{let Y=!1,Q=()=>{if(Y)return;Y=!0,this.backgroundSubagentCompletionWaiters.delete(Q),Z?.removeEventListener("abort",Q),J()};if(this.backgroundSubagentCompletionWaiters.add(Q),Z?.addEventListener("abort",Q,{once:!0}),Z?.aborted||$!==this.backgroundSubagentCompletionRevision)Q()})}getBackgroundTaskChildrenState(){if(this.isRemoteWorkspace())return"none";if(this.backgroundTaskChildIds.size===0)return"none";let $={sessionId:this.sessionId,projectPath:this.workspaceRoot},Z=y0.getInstance().listSessions().filter((J)=>t0(J,$)&&this.backgroundTaskChildIds.has(J.id)&&J.background===!0);if(Z.some((J)=>J.status!=="running"&&!this.backgroundTaskCompletionSettledIds.has(J.id)))return"terminal_pending";return Z.some((J)=>J.status==="running")?"running":"none"}async reconcileBackgroundSubagentCompletionSink($){try{await this.reconcileBackgroundSubagentCompletions($)}finally{this.signalBackgroundSubagentCompletionWaiters()}}async attachBackgroundSubagentCompletionDispatcher(){if(this.backgroundSubagentCompletionRegistration)return;this.backgroundSubagentCompletionRegistration=await iZ.attach(this.backgroundSubagentCompletionOwner,{reconcile:($)=>this.reconcileBackgroundSubagentCompletionSink($)})}async reconcileBackgroundSubagentCompletions($){return this.backgroundSubagentCompletionMutex.runExclusive(async()=>{if(!this.activeTurnMailbox||!this.executionEngine)return 0;let Z=this.getExecutionEngine().getContextManager().persistentStore;if(this.backgroundTaskChildIds.size===0)return 0;let J=y0.getInstance(),Y={sessionId:this.sessionId,projectPath:this.workspaceRoot},Q=$?[J.loadSession($)].filter((z)=>Boolean(z)):J.listSessions().filter((z)=>t0(z,Y)),X=0;for(let z of Q){if(!this.backgroundTaskChildIds.has(z.id)||this.backgroundTaskCompletionSettledIds.has(z.id)||z.status==="running")continue;let W=z.resumedFrom?J.loadSession(z.resumedFrom):void 0,V=lQ(z,Y,W);if(!V){this.backgroundTaskCompletionSettledIds.add(z.id);continue}let U=await Z.persistBackgroundSubagentCompletion(this.sessionId,V);if(!U.eligible||U.acknowledged){this.backgroundTaskCompletionSettledIds.add(z.id);continue}let H=await this.activeTurnMailbox.enqueueBackgroundSubagentCompletion(V);if(!H.accepted){E0.warn(`[SessionRuntime ${this.sessionId}] Background subagent completion queue is full for ${z.id}`);continue}if(H.delivery==="current_turn"&&H.turnId)await this.goalStore.invalidateTurnLineageRoot(H.turnId);if(this.backgroundTaskCompletionSettledIds.add(z.id),H.duplicate)continue;if(X++,H.queue)W0.publish({sessionId:this.sessionId,projectPath:this.workspaceRoot},"follow_up.queue.changed",{queue:H.queue});W0.publish({sessionId:this.sessionId,projectPath:this.workspaceRoot},"subagent.completion.queued",{childSessionId:z.id,inboxMessageId:V.inboxMessageId,status:z.status,type:z.subagentType,description:z.description,summary:V.subagentRef.subagentSummary,resumedFrom:z.resumedFrom,rootAgentId:z.rootAgentId,resumeDepth:z.resumeDepth,verificationVerdict:z.result?.verificationVerdict,queued:H.queued,delivery:H.delivery})}return X})}async reloadPendingInbox(){if(this.hasTurnOwner())throw Error("Cannot reload the pending inbox during an active turn");this.activeTurnMailbox=await w6.create(this.workspaceRoot,this.sessionId,this.stateStorage),await this.activeTurnMailbox.setRecoveryProtectedIds(this.startupTurnRecovery?.outcome==="aborted"?this.startupTurnRecovery.inputMessageIds:[])}async recoverTeamLeadMessages(){if(this.config.agentTeamsEnabled!==!0)return;let $=(await B$.getInstance(t()).listTeams()).filter((Z)=>Z.deletedAt===void 0&&Z.leadSessionId===this.sessionId&&Z.workspaceRoot===this.workspaceRoot);for(let Z of $){let J=new H$(Z.name,t()),Y=await J.listPending("team-lead");for(let Q of Y)if((await this.enqueueSteering(N2(Q),{allowBeforeTurn:!0,messageId:Q.id,origin:"team_message",metadata:Z8(Q)})).accepted)await J.markDelivered([Q.id])}}async executeUserShellCommand($,Z={}){if(!this.initialized||!this.executionEngine)throw Error("Session runtime is not initialized");return this.userShellMutex.runExclusive(async()=>{let J=mD(12),Y=this.hasTurnOwner(),Q=Z.signal??new AbortController().signal,X=async(G)=>{let D=G.type==="started"?{executionId:G.executionId,command:G.command,auxiliary:Y}:G.type==="output"?{executionId:G.executionId,stream:G.stream,chunk:G.chunk,streamedBytes:G.streamedBytes,streamTruncated:G.streamTruncated,auxiliary:Y}:{executionId:G.executionId,messageId:G.messageId,record:G.record,auxiliary:Y,delivery:G.delivery,queued:G.queued};W0.publish({sessionId:this.sessionId,projectPath:this.workspaceRoot},`user.shell.${G.type}`,D),await Z.onEvent?.(G)},z=await TX($,{executionId:J,cwd:this.executionRoot,env:{...process.env,...this.sessionEnvironment,BLADE_CLI:"1",BLADE_USER_SHELL:"1"},signal:Q,timeoutMs:Z.timeoutMs,executor:this.workspace.kind==="acp-remote"?this.workspace.terminal?this.options.userShellExecutor??$9():$9():this.options.userShellExecutor,onEvent:async(G)=>{if(G.type!=="completed")await X({...G,auxiliary:Y})}}),W=RX(z),U=await this.getExecutionEngine().getContextManager().saveMessage(this.sessionId,"user",W,null,{...Y?{inboxMessageId:J}:{},userShellCommand:JSON.parse(JSON.stringify(z))},this.options.subagentInfo),H=Y?await this.getActiveTurnMailbox().enqueue(W,{allowBeforeTurn:!0,messageId:J,persisted:!0,origin:"user_shell"}):void 0;if(H?.delivery==="current_turn"&&H.turnId)await this.goalStore.invalidateTurnLineageRoot(H.turnId);let B={executionId:J,messageId:U,record:z,modelContent:W,auxiliary:Y,...H?.delivery?{delivery:H.delivery}:{},...H?{queued:H.queued}:{},...H?.queue?{queue:H.queue}:{}};return await X({type:"completed",executionId:J,messageId:U,record:z,auxiliary:Y,...H?.delivery?{delivery:H.delivery}:{},...H?{queued:H.queued}:{}}),B})}async initialize(){if(this.initialized)return;this.sessionLease=await c4.acquireForStorage(this.sessionId,this.stateStorage);try{if(!this.isRemoteWorkspace())await new b1(this.workspaceRoot,this.sessionId).reapOrphans(),await Y0.getInstance().reapOrphanedSession(this.sessionId,this.workspaceRoot),await vJ(this.workspaceRoot),await D0.getInstance().reconcileOrphanedSessions({sessionId:this.sessionId,projectPath:this.workspaceRoot}),await cD(this.workspaceRoot);if(await this.loadAgentResources(),!this.isRemoteWorkspace()){let W=x0.getInstance();if(W.loadConfig(this.config.disableAllHooks?{...this.config.hooks,enabled:!1}:this.config.hooks??{},this.projectRoot),W.bindSessionModelResources(this.sessionId,[this.projectRoot,this.workspaceRoot],this.modelResources),this.projectRoot!==this.workspaceRoot)W.inheritProjectConfig(this.projectRoot,this.workspaceRoot);W.bindSessionConfig(this.sessionId,[this.projectRoot,this.workspaceRoot],this.config.disableAllHooks?{...this.agentResources?.hooks??W.getConfig(this.projectRoot),enabled:!1}:this.agentResources?.hooks??W.getConfig(this.projectRoot));let V=await W.executeSessionStartHooks({projectDir:this.workspaceRoot,sessionId:this.sessionId,permissionMode:this.config.permissionMode??"default",isResume:this.options.sessionStart?.isResume??!1,resumeSessionId:this.options.sessionStart?.resumeSessionId});if(!V.proceed)throw Error(V.warning||"SessionStart hook blocked initialization");if(V.warning)E0.warn(`[SessionRuntime ${this.sessionId}] SessionStart hook warning: ${V.warning}`);let U=_X(V.env??{});if(this.sessionEnvironment=Object.freeze({...this.sessionEnvironment,...U}),this.config.env=this.sessionEnvironment,W.bindSessionEnvironment(this.sessionId,[this.projectRoot,this.workspaceRoot],this.sessionEnvironment),Object.keys(this.lspResources.servers).length>0)this.lspManager=new e8({sessionId:this.sessionId,workspaceRoot:this.workspaceRoot,environment:this.sessionEnvironment,servers:this.lspResources.servers});if(!this.lspManager?.available)this.autoVerifyRuntime=new cZ({sessionId:this.sessionId,workspaceRoot:this.workspaceRoot,projectRoot:this.projectRoot,environment:this.sessionEnvironment})}await this.validateSystemPromptConfig(),this.activeTurnMailbox=await w6.create(this.workspaceRoot,this.sessionId,this.stateStorage),await this.registerBuiltinTools(),await this.applyModelConfig(this.resolveModelConfig(this.selectedModelId),"使用模型:",this.selectedReasoningEffort,this.selectedServiceTier,this.selectedResponseVerbosity),await this.getExecutionEngine().getContextManager().persistentStore.initSession(this.sessionId,this.options.subagentInfo);let $=this.getExecutionEngine().getContextManager().persistentStore;this.backgroundTaskChildIds=await $.loadBackgroundTaskChildIds(this.sessionId),this.backgroundTaskCompletionSettledIds.clear();let Z=await $.loadInterruptedToolCalls(this.sessionId),J=new Map,Y={sessionId:this.sessionId,projectPath:this.workspaceRoot};if(!this.isRemoteWorkspace()){let W=y0.getInstance();for(let V of Z){if(V.toolName!=="Task"||!V.input||typeof V.input!=="object"||Array.isArray(V.input))continue;let U=V.input.subagent_session_id;if(typeof U!=="string")continue;let H=W.loadSession(U);if(!H)continue;let B=HQ(V,H,Y);if(B)J.set(V.toolCallId,B)}}let Q=await $.recoverInterruptedTurn(this.sessionId,{adoptedToolResults:J});if(Q)this.startupAdoptedToolResults=Z.flatMap((W)=>{let V=J.get(W.toolCallId);return V?[{call:W,result:V}]:[]});let X=await $.loadLatestGoalFinalization(this.sessionId),z=X?await this.goalStore.reconcileFinalizationReceipt(X.finalization.goalFinalization):null;if(z?.finalized)W0.publish({sessionId:this.sessionId,projectPath:this.workspaceRoot},"goal.updated",{goal:z.goal});if(this.startupTurnRecovery=Q??(X&&z?.finalized?{turnId:X.turnId,outcome:"completed",inputMessageIds:X.finalization.inputMessageIds,hadSuccessfulToolResult:!1,emptyFinalCorrectionSpent:!1,finalization:X.finalization}:void 0),await this.activeTurnMailbox.setRecoveryProtectedIds(this.startupTurnRecovery?.outcome==="aborted"?this.startupTurnRecovery.inputMessageIds:[]),this.startupTurnRecovery?.outcome==="completed")await this.reloadPendingInbox();if(!this.isRemoteWorkspace())await this.recoverTeamLeadMessages(),await this.attachBackgroundSubagentCompletionDispatcher();if(Q)E0.warn(`[SessionRuntime ${this.sessionId}] recovered ${Q.outcome} turn ${Q.turnId}`);this.initialized=!0,E0.debug(`[SessionRuntime ${this.sessionId}] initialized with ${this.baseRegistry.getAll().length} tools`)}catch($){try{await this.dispose()}catch(Z){E0.warn(`[SessionRuntime ${this.sessionId}] Failed to clean up after initialization error`,Z)}throw $}}async refresh($){if(!this.initialized){await this.initialize();return}let Z=$.modelId==="inherit",J=$.modelId&&!Z?$.modelId:void 0,Y=Z?this.getDefaultModel()?.id:J??this.selectedModelId??this.getDefaultModel()?.id,Q=$.reasoningEffort??this.selectedReasoningEffort,X=$.serviceTier??this.selectedServiceTier,z=$.responseVerbosity??this.selectedResponseVerbosity,W=$.communicationStyle??this.selectedCommunicationStyle;if(z8(W,this.getCommunicationStyleCatalog()),Y&&(Y!==this.currentModelId||Q!==this.selectedReasoningEffort||X!==this.selectedServiceTier||z!==this.selectedResponseVerbosity))await this.applyModelConfig(this.resolveModelConfig(Y),Y!==this.currentModelId?"切换模型":Q!==this.selectedReasoningEffort?"切换推理强度":X!==this.selectedServiceTier?"切换服务等级":"切换输出详略",Q,X,z);if(Z)this.selectedModelId=void 0;else if(J)this.selectedModelId=J;this.selectedReasoningEffort=Q,this.selectedServiceTier=X,this.selectedResponseVerbosity=z,this.selectedCommunicationStyle=W}createToolExecutor($={}){let Z=new H1;Z.setMcpCatalogBarrier(this.mcpCatalogBarrier);let J="ReadPromptArtifact",Y=$.toolWhitelist?[...new Set([...$.toolWhitelist,J])]:void 0,Q=$.toolBlacklist?.filter((B)=>B!==J),X=Y?new Set(Y):null,z=Q?new Set(Q):null;for(let B of this.baseRegistry.getBuiltinTools()){if(z?.has(B.name))continue;if(!X||X.has(B.name))Z.register(B)}Z.replaceMcpTools(this.filterMcpTools(this.baseRegistry.getMcpTools(),X,z));let W=this.getMcpInstructions();if(Z.queueMcpInstructionsChange({revision:W.revision,reason:"snapshot",replace:!0,instructions:W.instructions,removed:[]}),["TaskOutput","ListMcpTasks","CancelMcpTask"].some((B)=>!z?.has(B)&&(!X||X.has(B))))for(let B of $$.getInstance().list({sessionId:this.sessionId,projectPath:this.workspaceRoot})){let{result:G,...D}=B;Z.queueMcpTaskChange({revision:0,...D})}this.executorCatalogs.set(Z,{allowed:X,blocked:z});let U={...this.config.permissions,...$.permissions},H=$.permissionMode??this.config.permissionMode??"default";return new z6(Z,{permissionConfig:U,permissionMode:H,approvalStore:this.approvalStore,maxHistorySize:1000,toolWhitelist:Y,toolBlacklist:Q,workspaceToolPolicy:this.workspaceToolPolicy,contextDefaults:{sessionId:this.sessionId,workspaceRoot:this.workspaceRoot,executionRoot:this.executionRoot,workspaceKind:this.workspace.kind,environment:this.sessionEnvironment,permissionMode:H,foregroundCommandHandoffMs:this.config.bashForegroundHandoffMs,mcpSamplingHandler:this.handleMcpSampling,notifyBackgroundSubagentCompleted:(B)=>this.notifyBackgroundSubagentCompleted(B),registerBackgroundSubagent:(B)=>this.registerBackgroundSubagent(B)},...this.lspManager?{lspManager:this.lspManager}:{},...H==="yolo"&&this.autoVerifyRuntime?{autoVerifyRuntime:this.autoVerifyRuntime}:{},onDispose:()=>{this.executorCatalogs.delete(Z)}})}createExecutionPipeline($={}){return this.createToolExecutor($)}async dispose(){if(this.disposePromise)return this.disposePromise;return this.disposing=!0,this.disposePromise=(async()=>{let $,Z=async(_,L)=>{try{await L()}catch(F){$??=F,E0.warn(`[SessionRuntime ${this.sessionId}] Failed to ${_} during cleanup`,F)}},J=this.chatService,Y=this.sessionMcpRegistry,Q=this.mcpCatalogListener,X=this.mcpContentCatalogListener,z=this.mcpResourceUpdatedListener,W=this.mcpConnectionListener,V=this.mcpLogListener,U=this.mcpInstructionsListener,H=this.mcpTaskListener,B=this.sessionLease,G=this.autoVerifyRuntime,D=this.lspManager,w=this.browserRuntime,q=this.backgroundSubagentCompletionRegistration;if(this.providerRecoveryGeneration)this.clearProviderRecovery(this.providerRecoveryGeneration);if(this.turnActivityGeneration)this.clearTurnActivity(this.turnActivityGeneration);if(await Z("stop side conversations",()=>this.sideConversationOperations.shutdown("session-runtime-dispose")),await Z("close the Session browser",()=>w?.dispose()),await Z("dispose the background subagent completion registration",()=>q?.dispose()),this.backgroundSubagentCompletionRegistration=void 0,this.signalBackgroundSubagentCompletionWaiters(),this.chatService=void 0,this.executionEngine=void 0,this.activeTurnMailbox=void 0,this.startupTurnRecovery=void 0,this.startupTurnRecoveryAcknowledged=!1,this.startupTurnRecoveryAssessmentTaken=!1,this.startupAdoptedToolResults=[],this.backgroundTaskChildIds.clear(),this.backgroundTaskCompletionSettledIds.clear(),this.currentModelMaxContextTokens=void 0,this.baseRegistry=new H1,this.sessionMcpRegistry=void 0,this.mcpCatalogListener=void 0,this.mcpContentCatalogListener=void 0,this.mcpResourceUpdatedListener=void 0,this.mcpConnectionListener=void 0,this.mcpLogListener=void 0,this.mcpInstructionsListener=void 0,this.mcpTaskListener=void 0,this.mcpCatalogBarrier=async()=>{return},this.executorCatalogs.clear(),this.sessionLease=void 0,this.autoVerifyRuntime=void 0,this.lspManager=void 0,this.browserRuntime=void 0,!this.isRemoteWorkspace())await Z("kill the session background processes",()=>Y0.getInstance().killSession(this.sessionId));if(await Z("clear the session approvals",()=>this.approvalStore.clear()),await Z("clear the session file access records",()=>f0.getInstance().clearSession(this.sessionId,this.workspaceRoot)),await Z("stop the session auto-verification processes",()=>G?.dispose()),await Z("stop the session LSP servers",()=>D?.dispose()),!this.isRemoteWorkspace())await Z("release the session hook model resources",()=>x0.getInstance().unbindSessionModelResources(this.sessionId,[this.projectRoot,this.workspaceRoot])),await Z("release the session worktrees",()=>C$.releaseSession(this.sessionId));if(await Z("dispose the session chat service",()=>J?.dispose?.()),await Z("cancel the session MCP tasks",()=>$$.getInstance().cancelSession({sessionId:this.sessionId,projectPath:this.workspaceRoot})),await Z("disconnect the session MCP servers",async()=>{if(Y&&Q)Y.off("catalogChanged",Q);if(Y&&X)Y.off("contentCatalogChanged",X);if(Y&&z)Y.off("resourceUpdated",z);if(Y&&W)Y.off("connectionLifecycleChanged",W);if(Y&&V)Y.off("log",V);if(Y&&U)Y.off("instructionsChanged",U);if(H)$$.getInstance().off("taskChanged",H);await Y?.disconnectAll()}),await Z("release the session lease",()=>B?.release()),this.currentModelId=void 0,this.currentReasoning=void 0,this.currentServiceTier=void 0,this.initialized=!1,$!==void 0)throw $})(),this.disposePromise}resolveModelConfig($){let Z=$&&$!=="inherit"?$:void 0,J=Z?this.config.models.find((Y)=>Y.id===Z):this.getDefaultModel();if(!J)throw Error(`模型配置未找到: ${Z??"current"}`);return J}getDefaultModel(){return this.config.models.find(($)=>$.id===this.config.currentModelId)??this.config.models[0]}getActiveTurnMailbox(){if(!this.activeTurnMailbox)throw Error("Session runtime is not initialized");return this.activeTurnMailbox}async saveTurnStart($,Z,J=[],Y){await this.getExecutionEngine().getContextManager().persistentStore.saveTurnStart(this.sessionId,{turnId:$.id,kind:Z,startedAt:new Date().toISOString(),...J.length>0?{inputMessageIds:J}:{},...Y?{goalLineage:Y}:{}})}async releaseFailedTurnStart($,Z){if(Z)try{await this.finishTurn($,{outcome:{status:"aborted",cause:"failed",turnsCount:0,toolCallsCount:0,durationMs:0}});return}catch{}await this.getActiveTurnMailbox().finishTurn($).catch(()=>{return})}assertRewindIdle(){if(this.isRemoteWorkspace())throw Error("Rewind is unavailable for ACP remote workspaces");if(this.hasTurnOwner())throw Error("Cannot rewind while the session has an active turn");if(this.getPendingSteeringCount()>0)throw Error("Cannot rewind while durable input is pending");if(Y0.getInstance().listForSession(this.sessionId).some(($)=>$.status==="running"))throw Error("Cannot rewind while a background shell is running");if(D0.getInstance().listForSession({sessionId:this.sessionId,projectPath:this.workspaceRoot}).some(($)=>$.status==="running"))throw Error("Cannot rewind while a background agent is running")}assertSubagentControlIdle(){if(this.hasTurnOwner())throw Error("Cannot resume a subagent while the session has an active turn");if(this.getPendingSteeringCount()>0)throw Error("Cannot resume a subagent while durable input is pending")}async applyModelConfig($,Z,J,Y,Q){let X=m0($,this.config,J,this.modelResources.catalog,Y,Q);E0.debug(`${Z} ${X.displayName} (${$.model})`);let z=X.model.contextWindow,W=await S4(X.chat),V=this.initialized?this.chatService:void 0,U=this.executionEngine?.getContextManager();this.chatService=W,this.executionEngine=new V6(W,U,this.workspaceRoot,this.stateStorage),this.currentModelMaxContextTokens=z,this.currentModelId=$.id,this.currentReasoning=X.reasoning,this.currentServiceTier=X.serviceTier,this.currentResponseVerbosity=X.responseVerbosity;let H=V;try{await H?.dispose?.()}catch(B){E0.warn(`[SessionRuntime ${this.sessionId}] Failed to dispose previous model service`,B)}}async validateSystemPromptConfig(){let $=this.getStaticProjectRules();if(!this.options.auxiliaryReadOnly&&this.options.projectInstructionsDigest&&$.provenanceSha256!==this.options.projectInstructionsDigest)throw Error("Project instruction provenance mismatch");if(!this.options.subagentInfo&&!this.options.auxiliaryReadOnly&&$.files.length>0&&!this.options.projectInstructionsDigest)await this.persistSystemPromptProvenance({projectInstructionsDigest:$.provenanceSha256}),this.options.projectInstructionsDigest=$.provenanceSha256;let Z=this.resolveCommunicationStyleConfiguration(this.selectedCommunicationStyle);if(!this.options.auxiliaryReadOnly&&Z.source!=="built-in"&&this.options.communicationStyleDigest&&Z.contentSha256!==this.options.communicationStyleDigest)throw Error(`Communication style provenance mismatch: ${this.selectedCommunicationStyle}`);if(!this.options.auxiliaryReadOnly&&Z.source!=="built-in"&&Z.contentSha256&&!this.options.communicationStyleDigest)await this.persistSystemPromptProvenance({communicationStyleDigest:Z.contentSha256}),this.options.communicationStyleDigest=Z.contentSha256;try{await Y1({...this.isRemoteWorkspace()?{workspaceAccess:"none"}:{projectPath:this.resourceRoot},includeEnvironment:!1,language:this.config.language,availableSkills:this.agentResources?.skills.generateAvailableSkillsList()??"",communicationStyle:this.selectedCommunicationStyle,communicationStyleCatalog:this.getCommunicationStyleCatalog(),projectRuleCatalog:this.getProjectRuleCatalog(),...this.isRemoteWorkspace()?{}:{projectInstructionSourcePath:this.projectRoot},environmentOptions:{...u1,workingDirectory:this.executionRoot}})}catch(J){E0.warn("[SessionRuntime] Failed to validate system prompt configuration:",J)}}async persistSystemPromptProvenance($){if(this.workspace.kind==="acp-remote"){await s.updateRemoteSessionMetadata(this.sessionId,this.workspaceRoot,this.workspace.descriptor,$);return}try{await s.updateSessionMetadata(this.sessionId,this.workspaceRoot,$)}catch(Z){if(!(Z instanceof fX||Z.code==="ENOENT")||this.options.subagentInfo)throw Z;await s.createSessionMetadata(this.sessionId,this.workspaceRoot,$)}}async registerBuiltinTools(){this.browserRuntime??=new n8(this.workspaceRoot,this.sessionId,{storageRoot:this.stateStorage.kind==="acp-remote"?this.stateStorage.root:t(),stateStorage:this.stateStorage,exposeArtifactPaths:!U0(this.sessionId)});let $=await v4({sessionId:this.sessionId,configDir:t(),workspaceRoot:this.workspaceRoot,resourceRoot:this.projectRoot,agentResources:this.agentResources,modelResources:this.modelResources,lspManager:this.lspManager,lspResources:this.lspResources,getReasoningEffort:()=>this.selectedReasoningEffort,getServiceTier:()=>this.selectedServiceTier,getResponseVerbosity:()=>this.selectedResponseVerbosity,getCommunicationStyle:()=>this.selectedCommunicationStyle,agentTeamsEnabled:this.config.agentTeamsEnabled===!0,stateStorage:this.stateStorage,userPromptArtifactStore:this.userPromptArtifactStore,browserRuntime:this.browserRuntime}),Z=iJ($.filter((J)=>!J.name.startsWith("mcp__")),this.workspaceToolPolicy);this.baseRegistry.registerAll(Z),await this.registerMcpTools()}async registerMcpTools(){try{let $=this.options.mcpServers??{};if(Object.keys($).length===0)return;let Z=e0.createIsolated({roots:U0(this.sessionId)?[]:[this.workspaceRoot],samplingAvailable:!0,oauthCredentialAccess:!U0(this.sessionId),artifactWriter:new o2(`${this.stateStorage.kind==="acp-remote"?this.workspaceRoot:this.projectRoot}\x00${this.sessionId}`,{storageRoot:this.stateStorage.kind==="acp-remote"?this.stateStorage.root:t(),stateStorage:this.stateStorage,exposePaths:!U0(this.sessionId)}),exposeLogDetails:!U0(this.sessionId),exposeInstructions:!U0(this.sessionId)});this.sessionMcpRegistry=Z,this.mcpCatalogBarrier=()=>Z.waitForCatalogIdle(),this.baseRegistry.setMcpCatalogBarrier(this.mcpCatalogBarrier);let J=(U)=>{this.applyMcpCatalog(U,this.initialized)};this.mcpCatalogListener=J,Z.on("catalogChanged",J);let Y=(U)=>{this.applyMcpContentCatalog(U)},Q=(U)=>{this.applyMcpResourceUpdated(U)},X=(U)=>{this.applyMcpConnectionChange(U)},z=(U)=>{this.applyMcpLog(U)},W=(U)=>{this.applyMcpInstructions(U)},V=(U)=>{if(U.owner.sessionId!==this.sessionId||F0.resolve(U.owner.projectPath)!==F0.resolve(this.workspaceRoot))return;this.applyMcpTask(U);let{owner:H,result:B,...G}=U;W0.publish({sessionId:this.sessionId,projectPath:this.workspaceRoot},"mcp.task.changed",G)};this.mcpContentCatalogListener=Y,this.mcpResourceUpdatedListener=Q,this.mcpConnectionListener=X,this.mcpLogListener=z,this.mcpInstructionsListener=W,this.mcpTaskListener=V,Z.on("contentCatalogChanged",Y),Z.on("resourceUpdated",Q),Z.on("connectionLifecycleChanged",X),Z.on("log",z),Z.on("instructionsChanged",W),$$.getInstance().on("taskChanged",V);for(let[U,H]of Object.entries($))try{let B=H.type==="stdio"?{...this.sessionEnvironment,...H.env}:void 0;await Z.registerServer(U,H.type==="stdio"?{...H,...B&&Object.keys(B).length>0?{env:B}:{}}:H)}catch(B){E0.warn(`Warning: MCP server "${U}" connection failed:`,B)}this.baseRegistry.replaceMcpTools(Z.getCatalogSnapshot().tools),this.baseRegistry.registerAll(Y6(Z)),this.baseRegistry.registerAll(KZ(Z))}catch($){E0.warn("Failed to register MCP tools:",$)}}filterMcpTools($,Z,J){return $.filter((Y)=>!J?.has(Y.name)&&(!Z||Z.has(Y.name)))}applyMcpCatalog($,Z){this.baseRegistry.replaceMcpTools($.tools);for(let[J,Y]of this.executorCatalogs){let Q=this.filterMcpTools($.tools,Y.allowed,Y.blocked),X=(V)=>!Y.blocked?.has(V)&&(!Y.allowed||Y.allowed.has(V)),z={revision:$.revision,serverName:$.serverName,reason:$.reason,added:$.added.filter(X),removed:$.removed.filter(X),updated:$.updated.filter(X)},W=z.added.length>0||z.removed.length>0||z.updated.length>0;J.replaceMcpTools(Q,Z&&W?z:void 0)}}applyMcpContentCatalog($){if(!this.initialized)return;let Z=$.kind==="resources"?["ListMcpResources","ReadMcpResource"]:$.kind==="resourceTemplates"?["ListMcpResourceTemplates","CompleteMcpArgument"]:["ListMcpPrompts","CompleteMcpArgument","GetMcpPrompt"];for(let[J,Y]of this.executorCatalogs)if(Z.some((X)=>!Y.blocked?.has(X)&&(!Y.allowed||Y.allowed.has(X))))J.queueMcpContentChange($)}applyMcpResourceUpdated($){if(!this.initialized)return;for(let[Z,J]of this.executorCatalogs)if(!J.blocked?.has("ReadMcpResource")&&(!J.allowed||J.allowed.has("ReadMcpResource")))Z.queueMcpResourceUpdated($)}applyMcpConnectionChange($){if(!this.initialized)return;for(let Z of this.executorCatalogs.keys())Z.queueMcpConnectionChange($)}applyMcpLog($){if(!this.initialized)return;for(let Z of this.executorCatalogs.keys())Z.queueMcpLog($)}applyMcpInstructions($){if(!this.initialized)return;for(let Z of this.executorCatalogs.keys())Z.queueMcpInstructionsChange({revision:$.revision,reason:$.reason,replace:!1,instructions:$.action==="added"&&$.instruction?[{serverName:$.serverName,...$.instruction}]:[],removed:$.action==="removed"?[$.serverName]:[]})}applyMcpTask($){if(!this.initialized)return;let{owner:Z,result:J,...Y}=$;for(let[Q,X]of this.executorCatalogs)if(["TaskOutput","ListMcpTasks","CancelMcpTask"].some((W)=>!X.blocked?.has(W)&&(!X.allowed||X.allowed.has(W))))Q.queueMcpTaskChange(Y)}handleMcpSampling=async($,Z)=>{let J=this.getChatService(),Y=await J.chat($.messages,void 0,Z,{maxOutputTokens:$.maxTokens,...$.temperature!==void 0?{temperature:$.temperature}:{}});return qX(Y,J.getConfig().model,$)};async loadAgentResources(){let $=this.options.agentResources?this.options.agentResources:this.isRemoteWorkspace()?AX(this.resourceRoot):await c0(this.projectRoot,{reconcilePlugins:!0});if(this.agentResources=k4($),this.subagentRegistry=this.agentResources.subagents,this.options.agents?.length)this.subagentRegistry.applyOverrides(this.options.agents)}}async function Z9(){let $=await B0.getInstance().reload();q0().config.actions.setConfig($),await e0.getInstance().disconnectAll(),kX(),await c0(C())}import KF from"fuse.js";import c$ from"node:path";import{Mutex as pD}from"async-mutex";var p$=new pD;async function xX($){let Z=$.getWorkspaceRoot();await f$(Z,async(J)=>{await $.reapplyEnabledSettings(),i1(Z),await l1(Z),await J9(J)})}async function lD($){let Z=$.getWorkspaceRoot();return f$(Z,async(J)=>{i1(Z);let Y=await $.refresh();return await l1(Z),await J9(J),Y})}async function Y9($){return f$($,async(Z)=>{let J=Array.from(new Set([Z.plugins,...W2.getInitializedInstances()])),Y;for(let Q of J){let X=await lD(Q);if(Q===Z.plugins)Y=X}return Y??{plugins:[],errors:[]}})}async function iD($,Z){let J=c$.resolve($),Y=h1();await Promise.all([Y.removePluginSetting(Z,{scope:"global",immediate:!0}),Y.removePluginSetting(Z,{scope:"project",projectDir:J,immediate:!0}),Y.removePluginSetting(Z,{scope:"local",projectDir:J,immediate:!0})])}function rD($){return c$.isAbsolute($)||$.startsWith("./")||$.startsWith("../")||$==="~"||$.startsWith("~/")}async function IX($,Z){if(rD(Z)&&!vX(await a0.getInstance().getStatus($)))throw Error("Local plugin sources require a trusted workspace")}async function V8($,Z,J,Y="local"){return p$.runExclusive(async()=>{let Q=c$.resolve($);return f$(Q,async(X)=>{let z=X.plugins.get(Z);if(!z)throw Error(`Plugin not found: ${Z}`);if(z.source==="cli")throw Error(`Plugin "${Z}" was loaded with --plugin-dir and is invocation-scoped`);await h1().save({enabledPlugins:{[Z]:J}},{scope:Y,projectDir:Q,immediate:!0});let W=Y==="global"?Array.from(new Set([X.plugins,...W2.getInitializedInstances()])):[X.plugins];for(let H of W)await xX(H);let V=X.plugins.get(Z);if(!V)throw Error(`Plugin disappeared during reconciliation: ${Z}`);let U=await B0.getInstance().loadWorkspacePluginSettingsResolution(Q);return{name:Z,requestedEnabled:J,effectiveEnabled:V.status==="active",scope:Y,source:V.source,status:V.status,effectiveScope:U.settings[Z]?.effectiveScope??"default"}})})}async function U8($){return p$.runExclusive(()=>f$($,async(Z)=>{i1(Z.workspaceRoot);let J=await Z.plugins.refresh();return await l1(Z.workspaceRoot),{registry:Z.plugins,discovery:J}}))}async function Q9($,Z,J="global"){return p$.runExclusive(async()=>{let Y=c$.resolve($),Q={...Z,...yX(Z)};return await h1().save({pluginSourcePolicy:Q},{scope:J,projectDir:Y,immediate:!0}),f$(Y,async(X)=>{let z=J==="global"?Array.from(new Set([X.plugins,...W2.getInitializedInstances()])):[X.plugins];for(let W of z)await xX(W);return B0.getInstance().loadWorkspacePluginSourcePolicy(Y)})})}async function X9($,Z,J={}){return p$.runExclusive(async()=>{let Y=c$.resolve($);await IX(Y,Z);let Q=await B0.getInstance().loadWorkspacePluginSourcePolicy(Y),X=await G$().install(Z,{...J,workspaceRoot:Y,policy:Q});if(!X.success)return{result:X};let z=await Y9(Y);return{result:X,discovery:z}})}async function z9($,Z,J={}){return p$.runExclusive(async()=>{let Y=c$.resolve($),Q=await B0.getInstance().loadWorkspacePluginSourcePolicy(Y),X=await G$().update(Z,{...J,workspaceRoot:Y,policy:Q});if(!X.success)return{result:X};let z=await Y9(Y);return{result:X,discovery:z}})}async function W9($,Z,J=!1){return p$.runExclusive(async()=>{let Y=c$.resolve($);return f$(Y,async(Q)=>{let X=Q.plugins.getAll().filter((V)=>V.manifest.name!==Z&&V.manifest.dependencies?.[Z]!==void 0).map((V)=>V.manifest.name).sort();if(X.length>0)return{result:{success:!1,pluginName:Z,code:"PLUGIN_REQUIRED",error:`Plugin "${Z}" is required by: ${X.join(", ")}`}};let z=await G$().uninstall(Z,J);if(!z.success)return{result:z};await iD(Y,Z);let W=await Y9(Y);return{result:z,discovery:W}})})}async function V9($,Z,J){return p$.runExclusive(async()=>{let Y=c$.resolve($);await IX(Y,Z);let Q=await B0.getInstance().loadWorkspacePluginSourcePolicy(Y);return G$().addMarketplace(Z,{workspaceRoot:Y,ref:J,policy:Q})})}async function U9($,Z){return p$.runExclusive(async()=>{let J=c$.resolve($),Y=await B0.getInstance().loadWorkspacePluginSourcePolicy(J);return G$().refreshMarketplace(Z,Y)})}async function H9($,Z=!1){return p$.runExclusive(()=>G$().removeMarketplace($,Z))}var nD={name:"btw",description:"Ask a side question without changing the main conversation",fullDescription:"Ask one context-aware question in an isolated, tool-free conversation.",usage:"/btw <question>",category:"conversation",examples:["/btw What did the last test failure mean?"],async handler($,Z){let J=$.join(" ").trim();if(!J)return{success:!1,error:"Usage: /btw <question>"};if(!Z.sideConversation)return{success:!1,error:"Side conversations require an active Session runtime"};let Y=await Z.sideConversation.ask(J,Z.signal);return{success:!0,content:`**/btw** ${J}
|
|
1112
1112
|
|
|
1113
1113
|
${Y.response}`,data:{action:"show_side_conversation",question:J,response:Y.response,durationMs:Y.durationMs,usage:Y.usage}}}},hX=nD;import bz from"node:fs/promises";import jz from"node:path";function B9($){return Number.isFinite($)?Math.max(0,$):0}function gX($){let Z=B9($.totalInputTokens),J=B9($.cacheReadTokens),Y=B9($.cacheWriteTokens),Q=Math.min(J,Z),X=Math.min(Y,Math.max(0,Z-Q)),z=Math.max(0,Z-Q-X),W=Z>0&&(J>0||Y>0);return{totalInputTokens:Z,cacheReadTokens:Q,cacheWriteTokens:X,uncachedInputTokens:z,...W?{hitRate:Q/Z}:{}}}function uX($){if($===void 0||!Number.isFinite($))return"—";return`${Math.round(Math.max(0,Math.min(1,$))*100)}%`}function dX($){return`${{model_changed:"model changed",system_prompt_changed:"system prompt changed",tools_changed:"tool definitions changed",request_policy_changed:"request policy changed",ttl_expired:"cache TTL expired",server_side:"likely Provider routing or eviction"}[$.reason]} (${$.previousCacheReadTokens.toLocaleString()} → ${$.cacheReadTokens.toLocaleString()} cache-read tokens)`}async function B8($,Z,J={}){let Y=Date.now(),Q=J.timeoutMs??20000,X="unknown";try{let z=m0($,Z,"off");X=z.model.api;let V=await new mX({...z.chat,temperature:0,maxOutputTokens:8,timeout:Q,streamIdleTimeout:Q,maxRetries:0,fallbackModels:[]}).chat([{role:"user",content:"Reply with OK."}],void 0,AbortSignal.timeout(Q),{providerAdmission:{sessionId:`provider-health:${$.id}`,ownerId:`provider-health:${$.id}`,requestClass:"internal"}});if(!Boolean(V.content||V.reasoningContent||V.finishReason||V.usage))throw Error("Provider returned an empty response");return{ok:!0,providerId:$.provider,modelConfigId:$.id,model:$.model,wireApi:X,latencyMs:Date.now()-Y,code:"ok",message:"Provider responded successfully."}}catch(z){let W=W8(z);return{ok:!1,providerId:$.provider,modelConfigId:$.id,model:$.model,wireApi:X,latencyMs:Date.now()-Y,code:W.code,message:W.message}}}import sD from"node:os";import cX from"node:path";var G9=Object.freeze(["help","version","btw","effort","speed","verbosity","style"]),aD=new Set(G9);function K9($){return aD.has($)}function c($){if($.acp)return{sendMessage:(Z)=>$.acp.sendMessage(`• ${Z}
|
|
1114
1114
|
|
|
@@ -1675,7 +1675,7 @@ ${J}
|
|
|
1675
1675
|
`)),{success:!0,message:"Schedules listed",content:V.join(`
|
|
1676
1676
|
`)}}case"create":{let W=aw(X);if("error"in W)return Y.sendMessage(`创建失败:${W.error}`),{success:!1,error:W.error};let V={prompt:W.prompt,projectPath:z,trigger:W.trigger,isolation:"worktree",permissionMode:"default",enabled:!0};try{let U=await $.create(V),H=U.nextRunAt?new Date(U.nextRunAt).toLocaleString():"(无)";return Y.sendMessage(`[OK] 已创建定时任务 \`${U.id}\`
|
|
1677
1677
|
${A9(U.trigger)} · 下次运行: ${H}`),{success:!0,message:`Schedule ${U.id} created`}}catch(U){let H=U instanceof Error?U.message:String(U);return Y.sendMessage(`创建失败:${H}`),{success:!1,error:H}}}case"remove":case"rm":{let W=X[0];if(!W)return Y.sendMessage("用法:/schedule remove <id>"),{success:!1,error:"Missing schedule id"};let V=await $.remove(W);return Y.sendMessage(V?`[OK] 已删除 \`${W}\``:`未找到 \`${W}\``),{success:V,message:V?"Removed":"Not found"}}case"enable":case"disable":{let W=X[0];if(!W)return Y.sendMessage(`用法:/schedule ${Q} <id>`),{success:!1,error:"Missing schedule id"};let V=await $.setEnabled(W,Q==="enable");return Y.sendMessage(V?`[OK] 已${Q==="enable"?"启用":"停用"} \`${W}\``:`未找到 \`${W}\``),{success:Boolean(V),message:V?"Updated":"Not found"}}case"run":{let W=X[0];if(!W)return Y.sendMessage("用法:/schedule run <id>"),{success:!1,error:"Missing schedule id"};try{return await sw(W),Y.sendMessage(`[OK] 已触发 \`${W}\``),{success:!0,message:"Schedule triggered"}}catch(V){let U=V instanceof Error?V.message:String(V);return Y.sendMessage(`运行失败:${U}`),{success:!1,error:U}}}default:return Y.sendMessage(`未知子命令: ${Q}
|
|
1678
|
-
使用 /schedule 查看帮助`),{success:!1,error:`Unknown subcommand: ${Q}`}}}}}var sz=ow();import*as f2 from"node:fs/promises";import*as P2 from"node:path";async function ZW($,Z={}){let{maxResults:J=20,caseSensitive:Y=!1,projectPath:Q,storagePath:X}=Z,z=X??P6(Q??C());if(!X){let G=await tw($,Q??C(),J,Y);if(G)return G}let W;try{W=(await f2.readdir(z)).filter((D)=>D.endsWith(".jsonl")&&!D.startsWith("agent_")).map((D)=>P2.join(z,D))}catch{return[]}let U=(await Promise.all(W.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),H=[],B=Y?$:$.toLowerCase();for(let G of U){if(H.length>=J)break;let D=P2.basename(G,".jsonl"),w=await ew(G,B,Y,D);if(H.push(...w),H.length>=J){H.length=J;break}}return H}async function tw($,Z,J,Y){try{let{syncAll:Q}=await import("./chunk-d420fs8m.js"),X=await ez();if(!X)return null;let{SessionService:z}=await import("./chunk-
|
|
1678
|
+
使用 /schedule 查看帮助`),{success:!1,error:`Unknown subcommand: ${Q}`}}}}}var sz=ow();import*as f2 from"node:fs/promises";import*as P2 from"node:path";async function ZW($,Z={}){let{maxResults:J=20,caseSensitive:Y=!1,projectPath:Q,storagePath:X}=Z,z=X??P6(Q??C());if(!X){let G=await tw($,Q??C(),J,Y);if(G)return G}let W;try{W=(await f2.readdir(z)).filter((D)=>D.endsWith(".jsonl")&&!D.startsWith("agent_")).map((D)=>P2.join(z,D))}catch{return[]}let U=(await Promise.all(W.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),H=[],B=Y?$:$.toLowerCase();for(let G of U){if(H.length>=J)break;let D=P2.basename(G,".jsonl"),w=await ew(G,B,Y,D);if(H.push(...w),H.length>=J){H.length=J;break}}return H}async function tw($,Z,J,Y){try{let{syncAll:Q}=await import("./chunk-d420fs8m.js"),X=await ez();if(!X)return null;let{SessionService:z}=await import("./chunk-xde27z0w.js");await Q(X,z.projectionDeriverForSearch());let W=P2.resolve(Z),V=$W(X,$,W,J*4),U=Y?$:$.toLowerCase(),H=[];for(let B of V){if(B.role!=="user"&&B.role!=="assistant")continue;let G=M9(B.text,U,Y,B.session_id,B.role,B.timestamp??void 0,0);if(G)H.push(G);if(H.length>=J)break}return H}catch{return null}}async function ew($,Z,J,Y){try{let Q=await f2.readFile($,"utf8"),z=Q.split(`
|
|
1679
1679
|
`).flatMap((B,G)=>{if(!B.trim())return[];try{return[{event:JSON.parse(B),index:G}]}catch{return[]}});if(!z.some(({event:B})=>B.type==="session_created"))return $F(z,Z,J,Y);let V=new Map(z.flatMap(({event:B,index:G})=>typeof B.id==="string"?[[B.id,G+1]]:[])),U=oz(tz(Q,$)),H=new Map;for(let B of U){if(B.type==="message_created"&&(B.data.role==="user"||B.data.role==="assistant"))H.set(B.data.messageId,{role:B.data.role,content:[],timestamp:B.timestamp,lineNumber:V.get(B.id)??0});if(B.type==="part_created"&&B.data.partType==="text"){let G=H.get(B.data.messageId),D=B.data.payload.text;if(G&&typeof D==="string")G.content.push(D)}}return[...H.values()].flatMap((B)=>{let G=M9(B.content.join(" "),Z,J,Y,B.role,B.timestamp,B.lineNumber);return G?[G]:[]})}catch{return[]}}function $F($,Z,J,Y){return $.flatMap(({event:Q,index:X})=>{if(Q.type!=="message")return[];let z=Q.message;if(z?.role!=="user"&&z?.role!=="assistant"||!z.content)return[];let W=typeof z.content==="string"?z.content:Array.isArray(z.content)?z.content.filter((U)=>typeof U==="object"&&U!==null&&U.type==="text"&&typeof U.text==="string").map((U)=>U.text).join(" "):"",V=M9(W,Z,J,Y,z.role,typeof Q.timestamp==="string"?Q.timestamp:void 0,X+1);return V?[V]:[]})}function M9($,Z,J,Y,Q,X,z){if(!$)return;let W=J?$:$.toLowerCase();if(!W.includes(Z))return;let V=W.indexOf(Z),U=Math.max(0,V-80),H=Math.min($.length,V+Z.length+80);return{sessionId:Y,role:Q,content:(U>0?"...":"")+$.slice(U,H).replace(/\n/g," ")+(H<$.length?"...":""),timestamp:X,lineNumber:z}}function JW($){if($.length===0)return"没有找到匹配的历史记录";let Z=[`**找到 ${$.length} 条匹配:**
|
|
1680
1680
|
`];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(`
|
|
1681
1681
|
`)}var ZF={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 ZW(Y,{maxResults:15,projectPath:Z.cwd}),X=JW(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}}}},YW=ZF;var JF={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}}}},QW=JF;import YF 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 XW($){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 zW($,Z){if($.length<=Z)return $;return $.slice(0,Z-3)+"..."}async function QF($,Z){let J=c(Z),Y=$[0],Q=Y0.getInstance(),X=D0.getInstance(),z=Z.sessionId??"",W=Z.sessionId?{sessionId:Z.sessionId,projectPath:YF.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),_=`Resumed \`${D}\` as \`${q.session.id}\` (depth ${q.session.resumeDepth}).`;return J.sendMessage(_),{success:!0,message:_,data:{action:"subagent_resumed",sourceAgentId:D,subagent:q.session}}}if(Y==="clean"){let D=X.cleanupExpiredSessionsForParent(W??z,0);return J.sendMessage(`已清理 ${D} 个已完成的 Agent 会话`),{success:!0,message:`Cleaned ${D} agent sessions`}}let V=[`**后台任务列表**
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Xj as I}from"./chunk-
|
|
1
|
+
import{Xj as I}from"./chunk-whbp683s.js";import{Mk as f}from"./chunk-eg3ms291.js";import*as j from"fs/promises";import*as S from"path";import X from"semver";import{ProxyAgent as R,fetch as k}from"undici";function x(){return process.env.HTTPS_PROXY||process.env.HTTP_PROXY||process.env.https_proxy||process.env.http_proxy}function L(){let z=x();if(z)try{return new R(z)}catch(q){console.warn(`[proxyFetch] Invalid proxy URL: ${z}`)}return}async function F(z,q,Z){let{timeout:W=30000,signal:J,...Q}=q;if(J?.aborted)throw new DOMException("The operation was aborted.","AbortError");let Y=L(),$=new AbortController,w=!1,y=setTimeout(()=>{w=!0,$.abort()},W),T=()=>$.abort();J?.addEventListener("abort",T);let D;try{let B={method:Q.method,headers:Q.headers,body:Q.body,signal:$.signal,dispatcher:Y};return D=await k(z.toString(),B),await Z(D)}catch(B){if(B instanceof Error&&B.name==="AbortError"){if(w)throw Error(`Request timeout after ${W}ms`);throw B}throw B}finally{if(clearTimeout(y),J?.removeEventListener("abort",T),$.abort(),D?.body&&!D.body.locked)await D.body.cancel().catch(()=>{return});await Y?.destroy?.().catch(()=>{return})}}var O="blade-code",G="https://cdn.jsdelivr.net/npm/blade-code@latest/CHANGELOG.md",H=S.join(process.env.HOME||process.env.USERPROFILE||".",".blade"),N=S.join(H,"version-cache.json"),_=3600000,g=`https://registry.npmjs.org/${O}/latest`,M=null;async function P(){try{if(process.env.BLADE_VERSION)return process.env.BLADE_VERSION;return I()}catch{return"unknown"}}async function b(){try{let z=await j.readFile(N,"utf-8"),q=JSON.parse(z);if(Date.now()-q.checkedAt<_)return q;return{...q,checkedAt:0}}catch{return null}}async function K(z){try{await j.mkdir(H,{recursive:!0,mode:493}),await j.writeFile(N,JSON.stringify(z,null,2))}catch{}}async function E(){try{return await F(g,{timeout:5000,headers:{Accept:"application/json"}},async(z)=>{if(!z.ok)return null;let q=await z.json();if(!q||typeof q!=="object"||!("version"in q))return null;return typeof q.version==="string"&&X.valid(q.version)?q.version:null})}catch{return null}}async function A(z=!1){let q=await P(),Z=G;if(q==="unknown")return{currentVersion:q,latestVersion:null,hasUpdate:!1,shouldPrompt:!1,releaseNotesUrl:Z,error:"Unable to determine current version"};let W=await b(),J=W?.skipUntilVersion,Q=null;if(!z&&W?.latestVersion&&W.checkedAt>0)Q=W.latestVersion;else if(Q=await E(),J=(await b())?.skipUntilVersion??J,Q)await K({latestVersion:Q,checkedAt:Date.now(),skipUntilVersion:J});else if(W?.latestVersion)await K({checkedAt:0,skipUntilVersion:J});if(!Q||!X.valid(Q))return{currentVersion:q,latestVersion:null,hasUpdate:!1,shouldPrompt:!1,releaseNotesUrl:Z,error:"Unable to check for updates"};if(X.lt(Q,q))Q=q,await K({latestVersion:Q,checkedAt:Date.now(),skipUntilVersion:J});let Y=X.gt(Q,q),$=Y;if(Y&&J)$=X.gt(Q,J);return{currentVersion:q,latestVersion:Q,hasUpdate:Y,shouldPrompt:$,releaseNotesUrl:Z}}async function V(z){let q=await b();await K({latestVersion:q?.latestVersion??z,checkedAt:q?.checkedAt||Date.now(),skipUntilVersion:z})}function v(){return`npm install -g ${O}@latest --registry https://registry.npmjs.org`}async function p(){let{spawn:z}=await import("child_process");return new Promise((q)=>{let Z=v(),W=z(Z,{stdio:"inherit",shell:!0});W.on("close",(J)=>{if(J===0)q({success:!0,message:"Upgrade successful! Please restart blade."});else q({success:!1,message:`Upgrade failed (exit code: ${J})`})}),W.on("error",(J)=>{q({success:!1,message:`Upgrade failed: ${J.message}`})})})}async function h(){try{let z=await b();if(!z?.latestVersion||!X.valid(z.latestVersion)||!z.checkedAt){if(!M)M=A(!0).then(()=>{return},()=>{return}).finally(()=>{M=null});return null}let q=await P();if(!X.valid(q)||!X.gt(z.latestVersion,q)||z.skipUntilVersion&&X.valid(z.skipUntilVersion)&&!X.gt(z.latestVersion,z.skipUntilVersion))return null;return{currentVersion:q,latestVersion:z.latestVersion,hasUpdate:!0,shouldPrompt:!0,releaseNotesUrl:G}}catch{return null}}
|
|
2
2
|
export{A as k,V as l,v as m,p as n,h as o};
|