blade-code 0.10.120 → 0.10.121
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-m9vhf4dg.js → chunk-2jx9yez1.js} +1 -1
- package/dist/{chunk-kvf61fb1.js → chunk-5yd5k1tf.js} +1 -1
- package/dist/{chunk-zp8d0ma8.js → chunk-6x5c8qa6.js} +1 -1
- package/dist/{chunk-sefdw1mm.js → chunk-863ynx9m.js} +1 -1
- package/dist/{chunk-7k72dxwe.js → chunk-88krdjg8.js} +1 -1
- package/dist/{chunk-6h0kgpgv.js → chunk-8myvrket.js} +1 -1
- package/dist/{chunk-dfcc8q87.js → chunk-9p4jkczh.js} +2 -2
- package/dist/{chunk-ne40tv38.js → chunk-a31m4s8k.js} +1 -1
- package/dist/{chunk-0fyy97rq.js → chunk-akcn83x5.js} +1 -1
- package/dist/{chunk-t169d8dc.js → chunk-b1rqfaea.js} +1 -1
- package/dist/{chunk-8mqbaptr.js → chunk-d75myaef.js} +1 -1
- package/dist/{chunk-5hmeb6yk.js → chunk-dw9wcrtp.js} +1 -1
- package/dist/{chunk-j2pgrrkb.js → chunk-e2b6d9mw.js} +1 -1
- package/dist/{chunk-150w9kq4.js → chunk-fwmym1zk.js} +1 -1
- package/dist/{chunk-2v8fyvmh.js → chunk-gnvepc4p.js} +1 -1
- package/dist/{chunk-36k5c6wy.js → chunk-kaqz84w8.js} +1 -1
- package/dist/{chunk-49javhkx.js → chunk-khwmnyjg.js} +1 -1
- package/dist/chunk-myg02cas.js +1 -0
- package/dist/{chunk-40pzrpjc.js → chunk-n1t4vdw5.js} +1 -1
- package/dist/chunk-nhnkbddn.js +1 -0
- package/dist/{chunk-exv1nb2x.js → chunk-pccb23xv.js} +1 -1
- package/dist/{chunk-4de6e3am.js → chunk-pqt9p2tb.js} +1 -1
- package/dist/{chunk-j8hzgacj.js → chunk-pttzjrg7.js} +1 -1
- package/dist/chunk-r72e7yj0.js +8 -0
- package/dist/{chunk-6k7s3c7y.js → chunk-rvvvx553.js} +1 -1
- package/dist/{chunk-kzzw1kwk.js → chunk-ssmd3rn9.js} +1 -1
- package/dist/{chunk-1qbq7x98.js → chunk-szw16t85.js} +1 -1
- package/dist/{chunk-4jaqzjtw.js → chunk-v5d7he8r.js} +1 -1
- package/dist/{chunk-y1n8nf5w.js → chunk-v9bfzh20.js} +1 -1
- package/dist/{chunk-gjw3g2jd.js → chunk-vke2en0x.js} +1 -1
- package/dist/{chunk-2w10er3y.js → chunk-vsr1g5ke.js} +1 -1
- package/dist/{chunk-jn25d5qv.js → chunk-vxxcdarq.js} +1 -1
- package/dist/{chunk-x4t1v4rb.js → chunk-w9gj8etn.js} +3 -3
- package/dist/{chunk-c5291k2x.js → chunk-wgv86d7e.js} +1 -1
- package/dist/{chunk-v95hk3fw.js → chunk-y7wwx4jn.js} +1 -1
- package/dist/{chunk-56fb0ece.js → chunk-ymaxdwy1.js} +1 -1
- package/dist/{chunk-dspjxf4c.js → chunk-z2w3d9gy.js} +1 -1
- package/package.json +1 -1
- package/dist/chunk-cmcgqa1d.js +0 -1
- package/dist/chunk-qp8qcmx0.js +0 -1
- package/dist/chunk-scgq3g37.js +0 -8
package/dist/chunk-scgq3g37.js
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import{e as x$,f as $$}from"./chunk-anjpwev3.js";import{g as L1}from"./chunk-nq0w1j1a.js";import{s as D0,t as I4,u as R4,v as k4,w as q4}from"./chunk-56fb0ece.js";import{x as z0}from"./chunk-2w10er3y.js";import{A as Ux,B as _x,C as vO,D as Fx,y as H4,z as Kx}from"./chunk-40pzrpjc.js";import{G as G4,H as ix,I as G$,L as B4,M as M0,N as r1,O as K1,P as gx,Q as u1,R as U4,S as lO,T as _4,U as F4,V as Dx,W as p0,X as d1,Y as O0,Z as X0,aa as x1,ba as $1,ca as S$,da as L4,ea as D4,fa as p4,ga as u4,ha as d4,ia as v4,ja as i4,ka as l4,la as c4,ma as a4,na as o4,qa as O$,ta as P$,ya as B$}from"./chunk-x4t1v4rb.js";import{Fa as qx,La as kO}from"./chunk-2v8fyvmh.js";import{$a as Q$,Pa as T1,Sa as U$,Ta as e1,Ua as b4,Va as A4,Wa as _$,Xa as F$,Ya as Ox,Za as L$,_a as B0,ab as Z$,bb as J$,cb as j4,db as M4,eb as T4,fb as S4,gb as Vx,hb as Jx}from"./chunk-fpjhg6ce.js";import{Hb as p1,Qb as G0,sb as $0,tb as y,vb as k,wb as K4}from"./chunk-150w9kq4.js";import{$b as l1}from"./chunk-sca5q3tt.js";import{Ad as W4,Bc as Q4,Cc as P1,Dc as Z4,Ec as l0,Fc as J4,Gd as X4,Hd as z4,Ic as q1,Jd as b0,Md as m1,Rd as V4,Sd as h1,Td as g1,Ud as f,Vc as Y4,ed as N4,od as n0,pd as V0,uc as w4,wd as e0,xd as c1,yd as O1}from"./chunk-sefdw1mm.js";import{Qe as M$,Ue as KO,Ye as yx,df as yO}from"./chunk-1qbq7x98.js";import{ef as y1}from"./chunk-ye4wyq1k.js";import{vf as x4}from"./chunk-8qp8v96d.js";import{xf as G1}from"./chunk-6h0kgpgv.js";import{Ff as T$,Hf as W$,Kf as g4,Of as d0,Pf as v0,Tf as v$,Wf as gO,Xf as i0,_f as i$}from"./chunk-j2pgrrkb.js";import{og as Px,pg as $4}from"./chunk-adkpwx6c.js";import{tg as Sx,ug as L0}from"./chunk-t169d8dc.js";import{Bh as u0,Mg as kx,eh as rx,hh as ex,jh as O4,wh as Ix}from"./chunk-7k72dxwe.js";import{Eh as C1}from"./chunk-kz15jy62.js";import{Fh as E,Hh as W,Ih as pO,Kh as JO}from"./chunk-9fgkg1vr.js";import{Mh as _1,Ph as E1}from"./chunk-pykxe413.js";import{Th as e}from"./chunk-kzzty3v5.js";import{ti as $O}from"./chunk-w4xqaw4h.js";import{zi as N0}from"./chunk-r6svhe3w.js";import{Bi as Cx,Ci as tx,Ei as Ex,Fi as sx}from"./chunk-a4dmw23t.js";import{Hi as F0}from"./chunk-5hmeb6yk.js";import{Oi as Zx}from"./chunk-ncqagb27.js";import{Ui as X1,Yi as bx,Zi as U1}from"./chunk-spxb931p.js";import{$i as $x}from"./chunk-m7b779kd.js";var J3={port:{type:"number",describe:"Port to listen on (0 for auto)",default:0},hostname:{type:"string",describe:"Hostname to listen on",default:"127.0.0.1"},cors:{type:"array",describe:"Additional domains to allow for CORS",default:[]}};function Y3(O){return{port:O.port??0,hostname:O.hostname??"127.0.0.1",cors:O.cors??[]}}import{existsSync as Yx,readFileSync as Q1}from"node:fs";import{createServer as Pw}from"node:http";import{networkInterfaces as mw}from"node:os";import{dirname as hw,extname as gw,join as J0}from"node:path";import{fileURLToPath as pw}from"node:url";import{brotliCompressSync as uw,gzipSync as dw,constants as vw}from"node:zlib";import{Hono as iw}from"hono";import{cors as lw}from"hono/cors";import{WebSocketServer as cw}from"ws";var _0=$O("Service"),s$=30000,r$=new Set(["completed","failed","cancelled","interrupted"]);class S1{dispatch;store;tickMs;timer;unsubscribeBus;ticking=!1;inFlight=new Set;constructor(O){this.dispatch=O.dispatch,this.store=O.store??Vx.getInstance(),this.tickMs=O.tickMs??s$}start(){if(this.timer)return;_0.info("[TaskScheduler] Starting scheduler tick loop"),this.timer=setInterval(()=>{this.tick()},this.tickMs),this.timer.unref?.(),this.unsubscribeBus=k.subscribe((O)=>{if(O.type!=="task.status")return;let x=O.properties.taskStatus;if(typeof x!=="string"||!r$.has(x))return;this.recordTerminalStatus(O.sessionId,x,typeof O.properties.taskStatusReason==="string"?O.properties.taskStatusReason:void 0)}),this.tick()}stop(){if(this.timer)clearInterval(this.timer),this.timer=void 0,this.unsubscribeBus?.(),this.unsubscribeBus=void 0,_0.info("[TaskScheduler] Stopped scheduler tick loop")}async tick(O=new Date){if(this.ticking)return;this.ticking=!0;try{let x=await this.store.list();for(let $ of x)await this.evaluate($,O)}catch(x){_0.warn("[TaskScheduler] Tick failed:",x)}finally{this.ticking=!1}}async evaluate(O,x){if(!O.enabled)return;if(this.inFlight.has(O.id))return;if(O.expiresAt&&new Date(O.expiresAt).getTime()<=x.getTime()){await this.store.update(O.id,{enabled:!1,nextRunAt:null}),_0.info(`[TaskScheduler] Schedule ${O.id} expired; disabled`);return}if(!O.nextRunAt)return;if(!(new Date(O.nextRunAt).getTime()<=x.getTime()))return;await this.fire(O,x)}async fire(O,x=new Date,$={}){if(this.inFlight.has(O.id))throw Error(`Schedule ${O.id} is already dispatching`);this.inFlight.add(O.id);let w=x.toISOString();try{let Q=await this.dispatch({prompt:O.prompt,title:O.title??e$(O),sourceProjectPath:O.projectPath,isolation:O.dispatch.isolation??"worktree",permissionMode:O.dispatch.permissionMode??"default",modelId:O.dispatch.modelId,reasoningEffort:O.dispatch.reasoningEffort,serviceTier:O.dispatch.serviceTier,responseVerbosity:O.dispatch.responseVerbosity,communicationStyle:O.dispatch.communicationStyle}),Y=O.trigger.kind==="once"?null:$.manual?O.nextRunAt?new Date(O.nextRunAt):null:T1(O.trigger,x,x);await this.store.update(O.id,{lastRunAt:w,lastRunSessionId:Q.session.sessionId,lastStatus:Q.status,lastError:void 0,runCount:O.runCount+1,nextRunAt:Y?Y.toISOString():null,enabled:O.trigger.kind==="once"?!1:O.enabled}),k.publish({sessionId:Q.session.sessionId,projectPath:O.projectPath},"schedule.fired",{scheduleId:O.id,firedAt:w,sessionId:Q.session.sessionId,runId:Q.runId,status:Q.status}),_0.info(`[TaskScheduler] Fired schedule ${O.id} -> session ${Q.session.sessionId} (${Q.status})`)}catch(Q){let Y=Q instanceof Error?Q.message:String(Q);_0.warn(`[TaskScheduler] Schedule ${O.id} dispatch failed:`,Q);let J=O.trigger.kind==="once"?null:$.manual?O.nextRunAt?new Date(O.nextRunAt):null:T1(O.trigger,x,x);await this.store.update(O.id,{lastRunAt:w,lastStatus:"error",lastError:Y,nextRunAt:J?J.toISOString():null,enabled:O.trigger.kind==="once"?!1:O.enabled})}finally{this.inFlight.delete(O.id)}}async recordTerminalStatus(O,x,$){let Q=(await this.store.list()).find((Y)=>Y.lastRunSessionId===O);if(!Q)return;await this.store.update(Q.id,{lastStatus:x,...$?{lastError:$}:{lastError:void 0}})}}function e$(O){return`Scheduled: ${O.prompt.trim().replace(/\s+/g," ").slice(0,60)}`}class ZO extends Error{code;statusCode;details;constructor(O,x,$=500,w){super(x);this.code=O;this.statusCode=$;this.details=w;this.name="BladeServerError"}toObject(){return{error:{code:this.code,message:this.message,...this.details?{details:this.details}:{}}}}}class h extends ZO{constructor(O,x){super("NOT_FOUND",x?`${O} not found: ${x}`:`${O} not found`,404)}}class F extends ZO{constructor(O){super("BAD_REQUEST",O,400)}}class C extends ZO{constructor(O){super("CONFLICT",O,409)}}class nO extends ZO{constructor(O,x){super("TOO_MANY_REQUESTS",O,429,x)}}class CO extends ZO{constructor(O="Server is shutting down"){super("SERVICE_UNAVAILABLE",O,503)}}class N1 extends ZO{constructor(O){super("SESSION_WORKSPACE_UNAVAILABLE","This session workspace is no longer available",409,{reason:O})}}class EO extends ZO{constructor(){super("AMBIGUOUS_SESSION","Multiple workspaces contain this session ID; projectPath is required",409)}}class wO extends ZO{constructor(O="Internal server error"){super("INTERNAL_ERROR",O,500)}}var K3=W.Object({error:W.Object({code:W.String(),message:W.String(),details:W.Optional(W.Record(W.String(),W.Unknown()))})});import{Hono as O2}from"hono";var I1=$O("Service"),x2=W.Object({updates:W.Record(W.String(),W.Any()),options:W.Optional(W.Object({scope:W.Optional(JO(["local","project","global"])),immediate:W.Optional(W.Boolean())}))});function $2(O){return{currentModelId:O.currentModelId,permissionMode:O.permissionMode,language:O.language,codeTheme:O.codeTheme,uiTheme:O.uiTheme,autoSaveSessions:O.autoSaveSessions,notifyBuild:O.notifyBuild,notifyErrors:O.notifyErrors,notifySounds:O.notifySounds,privacyTelemetry:O.privacyTelemetry,privacyCrash:O.privacyCrash,agentTeamsEnabled:O.agentTeamsEnabled===!0,communicationStyle:O.communicationStyle,maxConcurrentTasks:O.maxConcurrentTasks,maxQueuedTasks:O.maxQueuedTasks,maxQueuedTaskBytes:O.maxQueuedTaskBytes,maxResidentSessionRuntimes:O.maxResidentSessionRuntimes,sessionRuntimeIdleMs:O.sessionRuntimeIdleMs}}var Gx=()=>{let O=new O2;return O.get("/",async(x)=>{try{let $=KO();return x.json($?$2($):{})}catch($){return I1.error("[ConfigRoutes] Failed to get config:",$),x.json({})}}),O.put("/",async(x)=>{try{let $=await x.req.json(),w=E(x2,$);if(!w.success)throw new F("Invalid config update format");let{updates:Q,options:Y}=w.data;return await yO().updateConfig(Q,Y),x.json({success:!0,updates:Q})}catch($){throw I1.error("[ConfigRoutes] Failed to update config:",$),$}}),O.get("/permissions",async(x)=>{try{let $=KO();return x.json($?.permissions||{})}catch($){return I1.error("[ConfigRoutes] Failed to get permissions:",$),x.json({})}}),O};import{Hono as w2}from"hono";import{streamSSE as Q2}from"hono/streaming";function Bx(O){let x="";if(O.id!==void 0)x+=`id: ${O.id}
|
|
2
|
-
`;if(O.event!==void 0)x+=`event: ${O.event}
|
|
3
|
-
`;for(let $ of O.data.split(/\r\n|\r|\n/))x+=`data: ${$}
|
|
4
|
-
`;if(O.retry!==void 0)x+=`retry: ${O.retry}
|
|
5
|
-
`;return x+=`
|
|
6
|
-
`,Buffer.byteLength(x)}class h0{serial;buffered=[];bufferedBytes=0;nextOrder=0;phase="buffering";highestDeliveredSequence=0;highestReplaySequence=0;failure;maxPendingItems;maxPendingBytes;constructor(O){this.maxPendingItems=O.maxPendingItems??Kx,this.maxPendingBytes=O.maxPendingBytes??Ux,this.serial=new Fx({maxPendingItems:this.maxPendingItems,maxPendingBytes:this.maxPendingBytes,writeTimeoutMs:O.writeTimeoutMs??_x,sizeOf:Bx,write:O.write,onFailure:(x)=>{this.failure=x,this.phase="closed",this.buffered.length=0,this.bufferedBytes=0,O.onFailure?.(x)}})}async writeInitial(O){await this.offerDirect(O)}observe(O,x){if(this.phase==="closed")return;if(this.phase==="buffering"){this.buffer(O,x);return}this.offerLive(O,x)}async writeReplay(O,x){if(!Number.isSafeInteger(x)||x<=0)throw this.fail(new vO("invalid_size","SSE committed sequence must be a positive safe integer")),this.currentFailure();if(x<=this.highestReplaySequence)return;await this.offerDirect(O),this.highestReplaySequence=x,this.highestDeliveredSequence=x}finishInitialization(O){if(this.phase!=="buffering")return;let x=this.buffered.splice(0);this.bufferedBytes=0,this.phase="live";let $=O.replayed?x.filter((Q)=>Q.sequence!==void 0&&Q.sequence>this.highestReplaySequence).sort((Q,Y)=>Q.sequence-Y.sequence||Q.order-Y.order):x.sort((Q,Y)=>Q.order-Y.order),w;for(let Q of $){if(O.replayed&&Q.sequence!==void 0&&Q.sequence===w)continue;if(this.offerLive(Q.message,Q.sequence),this.serial.stats().closed)return;w=Q.sequence}}offerHeartbeat(O){if(this.phase!=="live"||this.buffered.length>0||this.serial.stats().pendingItems>0)return!1;return this.offerLive(O),!this.serial.stats().closed}async flush(){await this.serial.flush()}close(O){if(this.phase==="closed")return;this.phase="closed",this.buffered.length=0,this.bufferedBytes=0,this.serial.close(O)}stats(){let O=this.serial.stats();return{closed:this.phase==="closed",pendingItems:O.pendingItems+this.buffered.length,pendingBytes:O.pendingBytes+this.bufferedBytes,bufferedItems:this.buffered.length,bufferedBytes:this.bufferedBytes}}buffer(O,x){let $=Bx(O),w=this.serial.stats();if($>this.maxPendingBytes){this.fail(new vO("oversized",`SSE frame requires ${$} bytes; limit is ${this.maxPendingBytes}`,{pendingItems:w.pendingItems+this.buffered.length,pendingBytes:w.pendingBytes+this.bufferedBytes}));return}if(w.pendingItems+this.buffered.length>=this.maxPendingItems||w.pendingBytes+this.bufferedBytes+$>this.maxPendingBytes){this.fail(new vO("overflow","SSE initialization buffer limit exceeded",{pendingItems:w.pendingItems+this.buffered.length,pendingBytes:w.pendingBytes+this.bufferedBytes}));return}this.nextOrder+=1,this.buffered.push({message:O,bytes:$,sequence:x,order:this.nextOrder}),this.bufferedBytes+=$}offerLive(O,x){if(x!==void 0){if(x<=this.highestReplaySequence)return;if(x<=this.highestDeliveredSequence){this.fail(new vO("write_failed","SSE committed sequence regressed"));return}this.highestDeliveredSequence=x}if(!this.serial.offer(O).accepted)this.phase="closed"}async offerDirect(O){if(this.phase==="closed")throw this.currentFailure();let x=this.serial.offer(O);if(!x.accepted)throw this.phase="closed",x.error;await x.completion}fail(O){this.serial.close(O)}currentFailure(){return this.failure??new vO("closed","SSE egress is closed")}}var Z2=15000,J2=$O("Service"),Y2=new Set(["task.status","task.delivery","session.created","session.updated","session.deleted","schedule.fired","permission.asked","question.required","elicitation.required","interaction.resolved"]),N2=new Set(["queued","running","completed","failed","cancelled","interrupted"]),W2=new Set(["high","medium","low"]),X2=new Set(["feature","bug","maintenance","research"]);function z2(O){if(!O||typeof O!=="object"||Array.isArray(O))return;let x=O,$=["changedFiles","additions","deletions","commits"];if($.some((w)=>typeof x[w]!=="number"||!Number.isInteger(x[w])||x[w]<0))return;return Object.fromEntries($.map((w)=>[w,x[w]]))}function g0(O,x){return typeof O==="number"&&Number.isInteger(O)&&O>=x?O:void 0}function V2(O){if(!O||typeof O!=="object"||Array.isArray(O))return;let x=O;if(!["applied","discarded","conflicted"].includes(String(x.status))||typeof x.updatedAt!=="string")return;return{status:x.status,updatedAt:x.updatedAt,...typeof x.sourceCommit==="string"?{sourceCommit:x.sourceCommit}:{},...g0(x.changedFiles,0)!==void 0?{changedFiles:x.changedFiles}:{},...typeof x.message==="string"?{message:x.message}:{}}}function Lx(O,x){return x&&O instanceof vO&&(O.kind==="closed"||O.kind==="aborted")}var Hx=()=>{let O=new w2,x=new p0;return O.onError(($,w)=>{if($ instanceof CO)return w.json($.toObject(),503);throw $}),O.get("/",async($)=>{let w;try{w=x.enter($.req.raw.signal)}catch(Y){if(Y instanceof Dx)throw new CO;throw Y}let Q=!1;try{let Y=Q2($,async(J)=>{let K,M,B=!1,H,b,S=new Promise((A)=>{b=A}),q,u=()=>{if(M!==void 0)clearInterval(M),M=void 0;K?.(),K=void 0},v=(A)=>{if(q)return q;return B=!0,q=(async()=>{try{u(),H?.close(A),J.close()}finally{b()}})(),q},QO=()=>{v(w.signal.reason)};if(w.signal.addEventListener("abort",QO,{once:!0}),J.onAbort(()=>{v()}),w.signal.aborted){await v(w.signal.reason),w.signal.removeEventListener("abort",QO),w.release();return}H=new h0({write:async(A)=>{await J.writeSSE(A)},onFailure:(A)=>{if(Lx(A,B))return;J2.warn(`[EventRoutes] SSE egress closed: kind=${A.kind} pendingItems=${A.pendingItems??0} pendingBytes=${A.pendingBytes??0}`),v(A)}});let VO=(A,c)=>{H?.observe({data:JSON.stringify({type:A,properties:c})})};K=k.subscribe((A)=>{if(!Y2.has(A.type))return;if(A.type==="permission.asked"||A.type==="question.required"||A.type==="elicitation.required"){let o=A.properties.requestId;if(typeof o!=="string"||!o)return;VO("interaction.pending",{sessionId:A.sessionId,projectPath:A.projectPath,interactionType:A.type==="question.required"?"question":A.type==="elicitation.required"?"elicitation":"permission",requestId:o});return}if(A.type==="interaction.resolved"){let o=A.properties.requestId;if(typeof o!=="string"||!o)return;VO(A.type,{sessionId:A.sessionId,projectPath:A.projectPath,requestId:o});return}if(A.type==="session.created"||A.type==="session.deleted"){VO(A.type,{sessionId:A.sessionId,projectPath:A.projectPath});return}if(A.type==="session.updated"){let o=A.properties.title,a=A.properties.taskPriority,PO=A.properties.taskKind,BO=A.properties.taskDueAt,WO=typeof o==="string"&&Boolean(o.trim()),z=W2.has(String(a)),s=X2.has(String(PO)),HO=BO===null||typeof BO==="string"&&Number.isFinite(Date.parse(BO));if(!WO&&!z&&!s&&!HO)return;VO(A.type,{sessionId:A.sessionId,projectPath:A.projectPath,...WO?{title:o}:{},...z?{taskPriority:a}:{},...s?{taskKind:PO}:{},...HO?{taskDueAt:BO}:{}});return}if(A.type==="task.delivery"){let o=V2(A.properties.taskDelivery);if(!o)return;VO(A.type,{sessionId:A.sessionId,projectPath:A.projectPath,taskDelivery:o,...A.properties.taskWorktreeRemoved===!0?{taskWorktreeRemoved:!0}:{},...typeof A.properties.updatedAt==="string"?{updatedAt:A.properties.updatedAt}:{}});return}if(A.type==="schedule.fired"){let o=A.properties.scheduleId,a=A.properties.firedAt;if(typeof o!=="string"||typeof a!=="string")return;VO(A.type,{scheduleId:o,firedAt:a,sessionId:A.sessionId,projectPath:A.projectPath,...typeof A.properties.runId==="string"?{runId:A.properties.runId}:{},...typeof A.properties.status==="string"?{status:A.properties.status}:{}});return}let c=A.properties.taskStatus;if(typeof c!=="string"||!N2.has(c))return;let I=z2(A.properties.taskDiffStat),GO=g0(A.properties.taskQueuePosition,1),m=g0(A.properties.taskQueueDepth,0),r=g0(A.properties.taskConcurrencyLimit,1),UO=g0(A.properties.taskInFlight,0),DO=typeof A.properties.taskAdmissionPaused==="boolean"?A.properties.taskAdmissionPaused:void 0;VO(A.type,{sessionId:A.sessionId,projectPath:A.projectPath,taskStatus:c,...typeof A.properties.taskStatusReason==="string"?{taskStatusReason:A.properties.taskStatusReason}:{},...A.properties.taskFailure&&typeof A.properties.taskFailure==="object"?{taskFailure:A.properties.taskFailure}:{},...typeof A.properties.taskStartedAt==="string"?{taskStartedAt:A.properties.taskStartedAt}:{},...typeof A.properties.taskCompletedAt==="string"?{taskCompletedAt:A.properties.taskCompletedAt}:{},...typeof A.properties.updatedAt==="string"?{updatedAt:A.properties.updatedAt}:{},...I?{taskDiffStat:I}:{},...GO!==void 0?{taskQueuePosition:GO}:{},...m!==void 0?{taskQueueDepth:m}:{},...r!==void 0?{taskConcurrencyLimit:r}:{},...UO!==void 0?{taskInFlight:UO}:{},...DO!==void 0?{taskAdmissionPaused:DO}:{}})});try{if(J.aborted||B)return;if(await H.writeInitial({data:JSON.stringify({type:"connected",properties:{timestamp:Date.now()}})}),J.aborted||B)return;if(H.finishInitialization({replayed:!1}),J.aborted||B)return;M=setInterval(()=>{if(J.aborted||B)return;H?.offerHeartbeat({data:JSON.stringify({type:"heartbeat",properties:{timestamp:Date.now()}})})},Z2),await S}catch(A){if(Lx(A,B))return;throw A}finally{await v(),w.signal.removeEventListener("abort",QO),w.release()}});return Q=!0,Y}catch(Y){if(!Q)w.release();throw Y}}),{app:O,shutdown:($)=>x.shutdown($),getSseConnectionStats:()=>x.stats()}};import{Hono as G2}from"hono";var B2=W.Object({paused:W.Boolean()}),Ax=()=>{let O=new G2;return O.get("/health",(x)=>{return x.json({healthy:!0,version:F0()})}),O.get("/info",(x)=>{let $=e(),w=KO();if(w)O0.configure(w.maxConcurrentTasks,w.maxQueuedTasks,w.maxQueuedTaskBytes);let Q=O0.getStats();return x.json({version:F0(),platform:process.platform,arch:process.arch,nodeVersion:process.version,cwd:$,gitBranch:bx($),taskAdmission:{inFlight:Q.inFlight,queued:Q.queued,maxConcurrent:Q.maxConcurrent,maxQueued:Q.maxQueued,paused:Q.paused}})}),O.put("/task-admission",async(x)=>{let $;try{$=await x.req.json()}catch{throw new F("Invalid request body")}let w=E(B2,$);if(!w.success)throw new F("Invalid task admission control request");O0.setPaused(w.data.paused);let Q=O0.getStats();return x.json({inFlight:Q.inFlight,queued:Q.queued,maxConcurrent:Q.maxConcurrent,maxQueued:Q.maxQueued,paused:Q.paused})}),O};import jx from"node:path";import{Hono as K2}from"hono";var U2=W.Object({projectPath:W.String({minLength:1}),action:JO(["trust","revoke"]),expectedDigest:W.Optional(W.String())}),_2=W.Object({projectPath:W.String({minLength:1}),sessionId:W.String({minLength:1}),enabled:W.Boolean()});function R1(O){if(!O||!jx.isAbsolute(O))throw new F("projectPath must be absolute");return jx.resolve(O)}function Mx(O){if(!O)throw new F("sessionId is required");try{X1(O)}catch(x){throw new F(x instanceof Error?x.message:"sessionId is invalid")}return O}async function W1(O){let x=R1(O),$=KO()?.hooks??Ix.hooks,w=await u0.getInstance().loadWorkspaceHooks(x,$,{includeBaseForCurrentWorkspace:!1});return i0(x,async()=>{v0(x);let Q=L0.getInstance();return Q.loadConfig(w,x),await d0(x),Q.getConfig(x)})}function Tx(O,x){let $=L0.getInstance(),w=$.getConfig(x).enabled,Q=$.isSessionPaused(O,x);return{sessionId:O,projectPath:x,enabled:$.isSessionEnabled(O,x),paused:Q,configEnabled:w}}var Rx=()=>{let O=new K2;return O.get("/trust",async(x)=>{let $=x.req.query("projectPath");if(!$)throw new F("projectPath query parameter is required");return await W1($),x.json(await L0.getInstance().getTrustStatus($))}),O.post("/trust",async(x)=>{let $=E(U2,await x.req.json());if(!$.success)throw new F("Invalid hook trust request");let{projectPath:w,action:Q,expectedDigest:Y}=$.data;await W1(w);let J=L0.getInstance(),K;try{K=Q==="trust"?await J.trustProject(w,Y):await J.revokeProjectTrust(w)}catch(M){if(M instanceof Sx)throw new C(M.message);throw M}return x.json(K)}),O.get("/session",async(x)=>{let $=R1(x.req.query("projectPath")),w=Mx(x.req.query("sessionId"));return await W1($),x.json(Tx(w,$))}),O.post("/session",async(x)=>{let $=E(_2,await x.req.json());if(!$.success)throw new F("Invalid hook session request");let w=R1($.data.projectPath),Q=Mx($.data.sessionId);await W1(w);let Y=L0.getInstance();if($.data.enabled)Y.enableSession(Q,w);else Y.disableSession(Q,w);return x.json(Tx(Q,w))}),O};import{Hono as F2}from"hono";var iO=$O("Service");function L2(O){try{return qx(O)}catch{return[]}}function D2(O){if(!z1(O)||!z1(O.reference)||!z1(O.argument))throw Error("Invalid MCP completion request");let x=O.reference.type,$=x==="prompt"&&typeof O.reference.name==="string"?{type:"prompt",name:O.reference.name}:x==="resource"&&typeof O.reference.uri==="string"?{type:"resource",uri:O.reference.uri}:void 0;if(!$||typeof O.argument.name!=="string"||typeof O.argument.value!=="string")throw Error("Invalid MCP completion request");let w;if(O.context!==void 0){if(!z1(O.context))throw Error("Invalid MCP completion context");w=Object.create(null);for(let[Q,Y]of Object.entries(O.context)){if(typeof Y!=="string")throw Error("Invalid MCP completion context");w[Q]=Y}}return{reference:$,argument:{name:O.argument.name,value:O.argument.value},...w?{context:w}:{}}}function z1(O){return O!==null&&typeof O==="object"&&!Array.isArray(O)}async function x0(O,x){let $=KO()?.mcpServers??{};for(let[w,Q]of Object.entries($)){if(x&&w!==x)continue;if(!O.getServerStatus(w))await O.registerServer(w,Q,{connect:!1})}}var fx=()=>{let O=new F2;return O.get("/",async(x)=>{try{let $=kO.getInstance();await x0($);let w=$.getAllServers(),Q=await Promise.all(Array.from(w.entries()).map(async([Y,J])=>({id:Y,name:Y,status:J.status==="connected"?"connected":J.status==="reconnecting"?"reconnecting":J.status==="connecting"?"connecting":J.lastError?"error":"offline",endpoint:J.config.command?`${J.config.command} ${(J.config.args||[]).join(" ")}`.trim():J.config.url||"Unknown",description:`MCP server: ${Y}`,tools:J.tools.map((K)=>K.name),completionSupported:J.client.completionSupported,tasks:J.client.tasks,resources:J.contentCatalog.resources,resourceTemplates:J.contentCatalog.resourceTemplates.map((K)=>({...K,variables:L2(K.uriTemplate)})),prompts:J.contentCatalog.prompts,connectedAt:J.connectedAt?.toISOString(),error:J.lastError?.message,recovery:J.recovery,logging:J.logging,instructions:J.instructions,oauthEnabled:J.client.oauthEnabled,oauthStatus:await J.client.getOAuthStatus()})));return x.json(Q)}catch($){return iO.error("[McpRoutes] Failed to get MCP servers:",$),x.json({error:$ instanceof Error?$.message:"Failed to get MCP servers"},500)}}),O.post("/:name/connect",async(x)=>{try{let $=x.req.param("name"),w=kO.getInstance();return await x0(w,$),await w.connectServer($),x.json({success:!0})}catch($){return iO.error("[McpRoutes] Failed to connect MCP server:",$),x.json({success:!1,error:$.message},500)}}),O.post("/:name/disconnect",async(x)=>{try{let $=x.req.param("name"),w=kO.getInstance();return await x0(w,$),await w.disconnectServer($),x.json({success:!0})}catch($){return iO.error("[McpRoutes] Failed to disconnect MCP server:",$),x.json({success:!1,error:$.message},500)}}),O.get("/:name/logs",async(x)=>{try{let $=x.req.param("name"),w=Number(x.req.query("limit")??20),Q=Number(x.req.query("afterRevision")??0);if(!Number.isSafeInteger(w)||w<1||w>100||!Number.isSafeInteger(Q)||Q<0)return x.json({error:"Invalid MCP log pagination"},400);let Y=kO.getInstance();return await x0(Y,$),x.json(Y.getLogSnapshot($,{limit:w,afterRevision:Q}))}catch($){return iO.error("[McpRoutes] Failed to get MCP logs:",$),x.json({error:$.message},500)}}),O.post("/:name/logging-level",async(x)=>{try{let $=x.req.param("name"),w=await x.req.json();if(!kx(w.level))return x.json({success:!1,error:"Invalid MCP logging level"},400);let Q=kO.getInstance();return await x0(Q,$),await Q.setServerLoggingLevel($,w.level),x.json({success:!0,level:w.level})}catch($){return iO.error("[McpRoutes] Failed to set MCP logging level:",$),x.json({success:!1,error:$.message},400)}}),O.post("/:name/complete",async(x)=>{try{let $=x.req.param("name"),w=D2(await x.req.json()),Q=kO.getInstance();await x0(Q,$);let Y=await Q.complete($,w);return x.json(Y)}catch($){return iO.error("[McpRoutes] Failed to complete MCP argument:",$),x.json({error:$.message},400)}}),O.post("/:name/oauth/login",async(x)=>{try{let $=x.req.param("name"),w=kO.getInstance();await x0(w,$);let Q=await w.beginOAuthLogin($);return x.json({success:!0,flowId:Q.flowId,authorizationUrl:Q.authorizationUrl},202)}catch($){return iO.error("[McpRoutes] Failed to start MCP OAuth login:",$),x.json({success:!1,error:$.message},400)}}),O.post("/:name/oauth/logout",async(x)=>{try{let $=x.req.param("name"),w=kO.getInstance();return await x0(w,$),await w.logoutOAuth($),x.json({success:!0})}catch($){return iO.error("[McpRoutes] Failed to log out MCP OAuth:",$),x.json({success:!1,error:$.message},400)}}),O.delete("/:name",async(x)=>{try{let $=x.req.param("name");await kO.getInstance().unregisterServer($);let Q=KO();if(Q?.mcpServers){let{[$]:Y,...J}=Q.mcpServers;await yO().updateConfig({mcpServers:J})}return x.json({success:!0})}catch($){return iO.error("[McpRoutes] Failed to delete MCP server:",$),x.json({success:!1,error:$.message},500)}}),O.post("/",async(x)=>{try{let $=await x.req.json(),{name:w,config:Q}=$;if(!w||!Q)return x.json({success:!1,error:"Missing name or config"},400);await kO.getInstance().registerServer(w,Q);let J=KO();return await yO().updateConfig({mcpServers:{...J?.mcpServers,[w]:Q}}),x.json({success:!0})}catch($){return iO.error("[McpRoutes] Failed to add MCP server:",$),x.json({success:!1,error:$.message},500)}}),O};import{getSupportedThinkingLevels as H2}from"@earendil-works/pi-ai";import{Hono as b2}from"hono";var V1=$O("Service");function A2(O,x,$=Px.list()){return{id:O.id,displayName:O.displayName,provider:O.provider,model:O.model,overrides:O.overrides,fallbackModels:O.fallbackModels,contextWindow:x.contextWindow,maxTokens:x.maxTokens,reasoning:x.reasoning,supportedReasoningEfforts:H2(x),supportedServiceTiers:Ex(x),supportedResponseVerbosities:Cx(x),communicationStyles:$,input:x.input}}function j2(O){mx(O.overrides);let x={displayName:O.displayName||void 0,overrides:O.overrides||void 0};if(O.model)x.model=O.model;return x}function mx(O){let x=O?.streamIdleTimeout;if(x!==void 0&&(!Number.isFinite(x)||x<1000))throw new F("streamIdleTimeout must be at least 1000ms")}var hx=()=>{let O=new b2;return O.get("/",async(x)=>{try{let $=KO();if(!$)throw Error("Config not initialized");let w=x.get("directory")||e(),[Q,Y]=await Promise.all([G1(w,$),gO(w)]),J=Q.config.models,K=J.find((b)=>b.id===Q.config.currentModelId)??J[0],M=Q.catalog,B=Y.communicationStyles.list(),H=(b)=>A2(b,M.resolveConfig(b),B);return x.json({configured:J.map(H),current:K?H(K):null})}catch($){V1.error("[ModelsRoutes] Failed to get models:",$);let w=new wO("Failed to get models");return x.json(w.toObject(),500)}}),O.post("/",async(x)=>{let $=N0(),w,Q;try{let Y=await x.req.json(),{provider:J,displayName:K,model:M,overrides:B,apiKey:H,modelProvider:b}=Y;if(!J||!M)throw new F("provider and model are required");mx(B);let S;if(b){if(b.id!==J)throw new F("modelProvider.id must match the model provider");if(KO()?.modelProviders[J])throw new F(`model provider already exists: ${J}`);S={name:b.name,baseUrl:b.baseUrl,wireApi:b.wireApi,...b.apiKeyEnv?{apiKeyEnv:b.apiKeyEnv}:{}};try{$.registerModelProvider(J,S,[M]),Q=J}catch(v){throw new F(v instanceof Error?v.message:"Invalid model provider")}}else $.getModel(J,M);if(H?.trim()){if(await $.setApiKey(J,H.trim()),S)w=J}let q={provider:J,displayName:K||void 0,model:M,overrides:B||void 0},u=S?await yO().addModelWithProvider(q,S):await yO().addModel(q);return x.json({success:!0,model:u})}catch(Y){if(w)await $.credentials.delete(w);if(Q){let J=KO();$.configureModelProviders(J?.modelProviders??{},J?.models??[])}throw V1.error("[ModelsRoutes] Failed to add model:",Y),Y}}),O.put("/:modelId",async(x)=>{try{let $=x.req.param("modelId"),w=await x.req.json(),{displayName:Q,overrides:Y,model:J}=w,K=yx($);if(!K)throw new F("model config not found");if(J)N0().getModel(K.provider,J);return await yO().updateModel($,j2({displayName:Q,overrides:Y,model:J})),x.json({success:!0})}catch($){throw V1.error("[ModelsRoutes] Failed to update model:",$),$}}),O.delete("/:modelId",async(x)=>{try{let $=x.req.param("modelId");return await yO().removeModel($),x.json({success:!0})}catch($){throw V1.error("[ModelsRoutes] Failed to delete model:",$),$}}),O};import{Hono as c2}from"hono";import cx from"node:path";import{Hono as R2}from"hono";import{streamSSE as k2}from"hono/streaming";import{LRUCache as q2}from"lru-cache";import{nanoid as H0}from"nanoid";class k1{runtimes=new Map;createRuntime;constructor(O={}){this.createRuntime=O.createRuntime??((x)=>new gx(x.projectPath,`web-browser:${x.sessionId}`,{exposeArtifactPaths:!1}))}get(O){let x=y(O),$=this.runtimes.get(x);if(!$)$=this.createRuntime(O),this.runtimes.set(x,$);return $}async reset(O){let x=this.runtimes.get(y(O));if(x)await x.page({action:{kind:"reset"}})}async dispose(O){let x=y(O),$=this.runtimes.get(x);if(!$)return;this.runtimes.delete(x),await $.dispose()}async disposeAll(){let O=[...this.runtimes.values()];this.runtimes.clear();let $=(await Promise.allSettled(O.map((w)=>w.dispose()))).find((w)=>w.status==="rejected");if($)throw $.reason}stats(){return{sessions:this.runtimes.size}}}import{Hono as T2}from"hono";var px=W.Object({action:JO(["accept","dismiss"])},{additionalProperties:!1}),M2=pO(W.Union([W.Object({kind:W.Literal("click"),dialog:W.Optional(px)},{additionalProperties:!1}),W.Object({kind:W.Literal("click_at"),screenshotId:W.String({minLength:1,maxLength:l0}),x:W.Integer({minimum:0,maximum:q1}),y:W.Integer({minimum:0,maximum:q1}),dialog:W.Optional(px)},{additionalProperties:!1}),W.Object({kind:W.Literal("hover")},{additionalProperties:!1}),W.Object({kind:W.Literal("fill"),value:W.String()},{additionalProperties:!1}),W.Object({kind:W.Literal("type"),value:W.String()},{additionalProperties:!1}),W.Object({kind:W.Literal("press"),key:JO(["Enter","Tab","Escape","Backspace","Delete","ArrowUp","ArrowDown","ArrowLeft","ArrowRight","Home","End","PageUp","PageDown","Space"])},{additionalProperties:!1}),W.Object({kind:W.Literal("select"),values:W.Array(W.String())},{additionalProperties:!1}),W.Object({kind:W.Literal("check")},{additionalProperties:!1}),W.Object({kind:W.Literal("uncheck")},{additionalProperties:!1}),W.Object({kind:W.Literal("scroll"),direction:JO(["up","down","left","right"]),amount:W.Integer()},{additionalProperties:!1})])),ux=pO(W.Object({action:W.Optional(JO(["goto","back","forward","reload"])),url:W.Optional(W.String()),pageId:W.Optional(W.String()),expectedOrigin:W.Optional(W.String()),waitUntil:W.Optional(JO(["commit","domcontentloaded","load"])),timeoutMs:W.Optional(W.Integer())},{additionalProperties:!1})),dx=pO(W.Object({pageId:W.String(),snapshotId:W.String(),ref:W.Optional(W.String()),expectedOrigin:W.String(),action:M2,timeoutMs:W.Optional(W.Integer())},{additionalProperties:!1}));function vx(O,x){if(O===void 0)return;let $=Number(O);if(!Number.isSafeInteger($))throw new F(`${x} must be an integer`);return $}function S2(O,x){if(O===void 0)return;if(O==="true")return!0;if(O==="false")return!1;throw new F(`${x} must be true or false`)}function I2(O){let x=O.code==="browser_not_installed"||O.code==="browser_disconnected"||O.code==="browser_disposed"?503:O.code==="browser_capacity"?429:O.code==="browser_unsupported"?400:409;return new ZO(O.code.toUpperCase(),O.message,x,O.details)}function lx(O){let x=new T2;x.use("*",(w,Q)=>O.withAdmission(Q)),x.onError((w,Q)=>{let Y=w instanceof ix?I2(w):w instanceof ZO?w:new wO;return Q.json(Y.toObject(),Y.statusCode)});let $=(w,Q)=>O.resolveSessionRef(w,Q);return x.post("/:sessionId/browser/navigate",async(w)=>{let Q=await w.req.json().catch(()=>{return}),Y=E(ux,Q);if(!Y.success)throw new F("Invalid browser navigation request");let J=await $(w.req.param("sessionId"),w.req.query("projectPath"));return w.json(await O.getRuntime(J).navigate(Y.data))}),x.post("/:sessionId/browser/interact",async(w)=>{let Q=await w.req.json().catch(()=>{return}),Y=E(dx,Q);if(!Y.success)throw new F("Invalid browser interaction request");let J=await $(w.req.param("sessionId"),w.req.query("projectPath"));return w.json(await O.getRuntime(J).interact(Y.data))}),x.get("/:sessionId/browser/snapshot",async(w)=>{let Q=await $(w.req.param("sessionId"),w.req.query("projectPath")),Y=vx(w.req.query("depth"),"depth"),J=S2(w.req.query("includeBoxes"),"includeBoxes");return w.json(await O.getRuntime(Q).snapshot({...w.req.query("pageId")?{pageId:w.req.query("pageId")}:{},...Y===void 0?{}:{depth:Y},...J===void 0?{}:{includeBoxes:J}}))}),x.get("/:sessionId/browser/inspect",async(w)=>{let Q=await $(w.req.param("sessionId"),w.req.query("projectPath")),Y=w.req.query("target"),J=w.req.query("pageId"),K=w.req.query("expectedOrigin");if(Y==="screenshot"){let H=w.req.query("source")??"user";if(H!=="user"&&H!=="agent")throw new F("Unsupported browser screenshot source");if(H==="agent"&&(!J||!K))throw new F("Agent browser screenshots require pageId and expectedOrigin");let b={...J?{pageId:J}:{},...K?{expectedOrigin:K}:{}},S=H==="agent"?await O.captureAgentScreenshot(Q,b):await O.getRuntime(Q).screenshot(b);return new Response(new Uint8Array(S),{headers:{"Content-Type":"image/png","Content-Length":String(S.length),"Cache-Control":"no-store","X-Content-Type-Options":"nosniff"}})}let M=vx(w.req.query("limit"),"limit"),B={...J?{pageId:J}:{},...K?{expectedOrigin:K}:{}};if(Y==="find"){let H=w.req.query("text");if(!H)throw new F("text is required for browser find");return w.json(await O.getRuntime(Q).inspect({...B,target:{kind:"find",text:H,...M===void 0?{}:{limit:M}}}))}if(Y!=="console"&&Y!=="page-errors"&&Y!=="network")throw new F("Unsupported browser inspection target");return w.json(await O.getRuntime(Q).inspect({...B,target:{kind:Y,...M===void 0?{}:{limit:M}}}))}),x.post("/:sessionId/browser/reset",async(w)=>{let Q=await $(w.req.param("sessionId"),w.req.query("projectPath"));return await O.resetRuntime(Q),w.json({success:!0})}),x}var P=$O("Service"),B1="web-pending-resume-recovery-budget-exhausted";class c0 extends Error{evidence;constructor(O){super(O.taskFailure.message);this.evidence=O;this.name="WebAgentRunFailure"}}var f2=W.Object({title:W.Optional(W.String()),projectPath:W.Optional(W.String())}),C2=j4,E2=W.Object({title:W.Optional(W.String()),projectPath:W.Optional(W.String())}),y2=W.Object({projectPath:W.String()}),P2=W.Object({objective:W.String({minLength:1}),tokenBudget:W.Optional(W.Integer({minimum:1})),permissionMode:W.Optional(JO(["default","autoEdit","plan","yolo"]))}),m2=W.Union([W.Object({action:W.Literal("pause")}),W.Object({action:W.Literal("resume")}),W.Object({action:W.Literal("edit"),objective:W.String({minLength:1})})]),NO=new Map,A0,t0,dO=new Map,tO=new Map,uO=new Map,F1=new q2({max:100,ttl:1800000});function ax(O){return{sessionId:O.sessionId,projectPath:O.projectPath}}function SO(O){if(!O)return;return dO.get(O)??F1.get(O)}function h2(O){if(dO.get(O.id)!==O)return;dO.delete(O.id),F1.set(O.id,O)}function g2(O){dO.delete(O),F1.delete(O)}function TO(O){return O?.status==="queued"||O?.status==="running"||O?.status==="waiting_permission"}function s0(O,x="user-cancel"){if(O.status==="cancelled"||O.status==="completed"||O.status==="failed"||O.status==="attention_required")return!1;let $=O.pendingPermission;if(O.pendingPermission=void 0,$?.resolve({approved:!1,reason:l1}),$)k.publish(ax(O),"interaction.resolved",{requestId:$.permissionId});return O.abortController.abort(x),O.status="cancelled",k.publish(ax(O),"run.cancelled",{runId:O.id}),!0}function f4(O,x=!1){let{permissionId:$,details:w}=O;if(w.type==="askUserQuestion"&&w.questions)return{type:"question.required",properties:{requestId:$,toolCallId:w.toolCallId??$,questions:w.questions,details:w,...x?{replayed:!0}:{}}};if(w.type==="mcpElicitation"&&w.mcpElicitation)return{type:"elicitation.required",properties:{requestId:$,toolCallId:w.toolCallId??$,elicitation:w.mcpElicitation,...x?{replayed:!0}:{}}};return{type:"permission.asked",properties:{requestId:$,toolName:w.toolName,description:w.message,args:w.args,details:w,...x?{replayed:!0}:{}}}}function p2(O){return{...typeof O.seq==="number"?{id:String(O.seq)}:{},data:JSON.stringify({type:O.type,...typeof O.seq==="number"?{seq:O.seq}:{},properties:{...O.properties,sessionId:O.sessionId,projectPath:O.projectPath}})}}function u2(){for(let O of dO.values())s0(O,"route-reset");dO.clear();for(let O of tO.values())O.controller.abort("route-reset");tO.clear(),F1.clear(),A0=void 0,t0?.(),t0=void 0,NO.clear()}function d2(O){if(!O||typeof O!=="object"||Array.isArray(O))return;let x=O,$=x.code,w=x.reason,Q=x.scope,Y=x.kind,J=x.limit;if($!=="tool_busy"&&$!=="tool_batch_full"||w!=="queue_full"&&w!=="wait_timeout"&&w!=="turn_limit"||Q!=="global"&&Q!=="session"||typeof x.retryable!=="boolean"||!Number.isSafeInteger(J)||J<=0||Y!==void 0&&Y!=="readonly"&&Y!=="write"&&Y!=="execute")return;return{code:$,reason:w,scope:Q,retryable:x.retryable,...Y===void 0?{}:{kind:Y},limit:J}}var r0=(O,x)=>{if(!x||typeof x!=="object")return x;let $={...x},w=d2($.tool_admission);if(w)$.tool_admission=w;else delete $.tool_admission;if(G4(O)){let J=$.browser&&typeof $.browser==="object"&&!Array.isArray($.browser)?$.browser:{},K={},M=(B,H,b)=>{let S=J[B];if(typeof S==="string"&&Buffer.byteLength(S)<=H&&(!b||b.test(S)))K[B]=S};if(M("action",64),M("status",16,/^(?:ok|warning|error)$/),M("pageId",l0,/^browser_page_[a-f0-9-]+$/),M("snapshotId",l0,/^browser_snapshot_[a-f0-9-]+$/),M("origin",P1),M("candidateOrigin",P1),M("url",Q4),M("title",Z4),M("errorCode",64,/^browser_[a-z_]+$/),typeof J.truncated==="boolean")K.truncated=J.truncated;if(typeof J.actionApplied==="boolean"||J.actionApplied==="unknown")K.actionApplied=J.actionApplied;if(typeof J.sideEffectsUncertain==="boolean")K.sideEffectsUncertain=J.sideEffectsUncertain;if(typeof J.diagnosticCount==="number"&&Number.isSafeInteger(J.diagnosticCount)&&J.diagnosticCount>=0&&J.diagnosticCount<=w4)K.diagnosticCount=J.diagnosticCount;if(J.interaction&&typeof J.interaction==="object"&&!Array.isArray(J.interaction)){let B=J.interaction,H=new Set(["click","hover","fill","type","press","select","check","uncheck","scroll"]);if(typeof B.action==="string"&&H.has(B.action)){let b={action:B.action};if(typeof B.ref==="string"&&Buffer.byteLength(B.ref)<=J4&&/^[a-z][a-z0-9]*$/.test(B.ref))b.ref=B.ref;let S=(q,u,v)=>typeof q==="number"&&Number.isFinite(q)&&q>=u&&q<=v;if(B.viewport&&typeof B.viewport==="object"&&!Array.isArray(B.viewport)){let q=B.viewport;if(S(q.width,1,16384)&&S(q.height,1,16384))b.viewport={width:q.width,height:q.height}}if(B.targetBox&&typeof B.targetBox==="object"&&!Array.isArray(B.targetBox)){let q=B.targetBox;if(S(q.x,-16384,32768)&&S(q.y,-16384,32768)&&S(q.width,0,16384)&&S(q.height,0,16384))b.targetBox={x:q.x,y:q.y,width:q.width,height:q.height}}K.interaction=b}}if(J.artifact&&typeof J.artifact==="object"&&!Array.isArray(J.artifact)){let B=J.artifact;if(typeof B.id==="string"&&/^[a-f0-9]{64}$/.test(B.id)&&B.sha256===B.id&&B.kind==="image"&&B.mimeType==="image/png"&&typeof B.size==="number"&&Number.isSafeInteger(B.size)&&B.size>=0&&B.size<=Y4&&B.persisted===!0)K.artifact={id:B.id,sha256:B.sha256,kind:B.kind,mimeType:B.mimeType,size:B.size,persisted:!0,...typeof B.path==="string"&&Buffer.byteLength(B.path)<=8192?{path:B.path}:{}}}return{...typeof $.summary==="string"?{summary:$.summary.slice(0,512)}:{},browser:K,...w?{tool_admission:w}:{}}}if(O==="Bash"){let J={},K=["message","signal","status","summary"],M=["aborted","acp_mode","admission_failed","auto_backgrounded","background","capture_truncated","finalization_failed","has_stderr","output_accounting_complete","output_truncated","projection_truncated","sandbox_required","sandboxed","stderr_projection_truncated","stdout_projection_truncated","terminal_output_merged","timeout"],B=["execution_time","foreground_budget_ms","pid","raw_output_bytes","stderr_length","stderr_omitted_bytes","stderr_retained_bytes","stderr_total_bytes","stdout_length","stdout_omitted_bytes","stdout_retained_bytes","stdout_total_bytes"];for(let b of K){let S=$[b];if(typeof S==="string")J[b]=S.slice(0,8192)}for(let b of M){let S=$[b];if(typeof S==="boolean")J[b]=S}for(let b of B){let S=$[b];if(typeof S==="number"&&Number.isSafeInteger(S)&&S>=0)J[b]=S}if($.exit_code===null||typeof $.exit_code==="number"&&Number.isSafeInteger($.exit_code))J.exit_code=$.exit_code;if($.terminal_transport==="local"||$.terminal_transport==="acp"||$.terminal_transport==="local_fallback")J.terminal_transport=$.terminal_transport;if($.background_reason==="explicit"||$.background_reason==="foreground_budget")J.background_reason=$.background_reason;for(let b of["bash_id","shell_id"]){let S=$[b];if(typeof S==="string"&&S.length<=128&&/^bash_[A-Za-z0-9-]+$/.test(S))J[b]=S}if(w)J.tool_admission=w;let H=$.background_shell_admission;if(H&&typeof H==="object"&&!Array.isArray(H)){let b=H;if(b.code==="background_shell_busy"&&(b.scope==="session"||b.scope==="global")&&b.retryable===!0&&Number.isSafeInteger(b.limit)&&b.limit>0)J.background_shell_admission={code:b.code,scope:b.scope,retryable:b.retryable,limit:b.limit}}return J}let Q=200000,Y=(J,K)=>typeof J==="number"&&Number.isSafeInteger(J)&&J>=0&&J<=K?J:0;if(typeof $.oldContent==="string"&&$.oldContent.length>Q)delete $.oldContent;if(typeof $.newContent==="string"&&$.newContent.length>Q)delete $.newContent;if($.mcpResult&&typeof $.mcpResult==="object"&&!Array.isArray($.mcpResult)){let J=$.mcpResult,K=Array.isArray(J.artifacts)?J.artifacts.slice(0,64).flatMap((M)=>{if(!M||typeof M!=="object"||Array.isArray(M))return[];let B=M,H=new Set(["text","image","audio","resource"]);if(typeof B.id!=="string"||!/^[a-f0-9]{64}$/.test(B.id)||typeof B.sha256!=="string"||B.sha256!==B.id||typeof B.kind!=="string"||!H.has(B.kind)||Y(B.size,67108864)!==B.size||typeof B.persisted!=="boolean")return[];return[{id:B.id.slice(0,128),sha256:B.sha256.slice(0,128),kind:B.kind,size:B.size,persisted:B.persisted,...typeof B.mimeType==="string"?{mimeType:B.mimeType.slice(0,256)}:{},...typeof B.sourceUri==="string"?{sourceUri:B.sourceUri.slice(0,8192)}:{},...typeof B.path==="string"?{path:B.path.slice(0,8192)}:{}}]}):[];$.mcpResult={isError:J.isError===!0,contentCount:Y(J.contentCount,64),textBytes:Y(J.textBytes,4194304),structuredBytes:Y(J.structuredBytes,4194304),artifactCount:Y(J.artifactCount,64),truncated:J.truncated===!0,binaryOmitted:J.binaryOmitted===!0,artifacts:K}}else delete $.mcpResult;return $};function v2(O){let x=typeof O.seq==="number"?{seq:O.seq}:{};if(O.type==="part_created"&&O.data.partType==="tool_call"){let $=O.data.payload;return{type:"tool.start",...x,properties:{messageId:O.data.messageId,toolCallId:$.toolCallId??O.data.partId,toolName:$.toolName??"unknown",arguments:JSON.stringify($.input??{})}}}if(O.type==="part_created"&&O.data.partType==="tool_result"){let $=O.data.payload,w=$.toolName??"unknown",Q=c1($),Y=O1(x1(w,Q),e0);return{type:"tool.result",...x,properties:{messageId:O.data.messageId,toolCallId:$.toolCallId??O.data.partId,toolName:w,success:Q.success,status:Q.success?"completed":"failed",summary:Q.metadata?.summary,output:$1(Y),metadata:r0(w,Q.metadata)}}}return{type:`committed.${O.type}`,...x,properties:{event:O}}}function i2(O,x,$){switch($.kind){case"tool_start":if("function"in $.toolCall)k.publish(O,"subagent.update",{subagentSessionId:x,toolName:$.toolCall.function.name}),k.publish(O,"subagent.tool.start",{subagentSessionId:x,toolCallId:$.toolCall.id,toolName:$.toolCall.function.name,arguments:$.toolCall.function.arguments,toolKind:$.toolKind});break;case"tool_result":if("function"in $.toolCall)k.publish(O,"subagent.tool.result",{subagentSessionId:x,toolCallId:$.toolCall.id,toolName:$.toolCall.function.name,success:$.result.success,summary:$.result.metadata?.summary,output:$1(O1(x1($.toolCall.function.name,$.result),e0)),metadata:r0($.toolCall.function.name,$.result.metadata)});break;case"tool_progress":if("function"in $.toolCall)k.publish(O,"subagent.tool.progress",{subagentSessionId:x,toolCallId:$.toolCall.id,toolName:$.toolCall.function.name,...$.update});break;case"content_delta":k.publish(O,"subagent.delta",{subagentSessionId:x,delta:$.delta});break;case"thinking_delta":k.publish(O,"subagent.thinking.delta",{subagentSessionId:x,delta:$.delta});break;case"stream_end":k.publish(O,"subagent.stream.end",{subagentSessionId:x});break;case"provider_admission":k.publish(O,"subagent.provider.admission",{subagentSessionId:x,phase:$.phase,requestClass:$.requestClass,resource:$.resource,scope:$.scope,reason:$.reason,queuePosition:$.queuePosition,queueDepth:$.queueDepth,inFlight:$.inFlight,limit:$.limit,waitMs:$.waitMs,maxWaitMs:$.maxWaitMs,recoveryRemainingMs:$.recoveryRemainingMs});break;case"provider_circuit":k.publish(O,"subagent.provider.circuit",{subagentSessionId:x,phase:$.phase,reason:$.reason,statusCode:$.statusCode,retryAfterMs:$.retryAfterMs,nextProbeAt:$.nextProbeAt,openDurationMs:$.openDurationMs,sampleCount:$.sampleCount,failureCount:$.failureCount,recoveryRemainingMs:$.recoveryRemainingMs});break;case"provider_retry":k.publish(O,"subagent.provider.retry",{subagentSessionId:x,phase:$.phase,attempt:$.attempt,maxRetries:$.maxRetries,reason:$.reason,statusCode:$.statusCode,delayMs:$.delayMs,nextRetryAt:$.nextRetryAt,mode:$.mode,recoveryBudgetMs:$.recoveryBudgetMs,recoveryElapsedMs:$.recoveryElapsedMs,recoveryRemainingMs:$.recoveryRemainingMs,exhaustedBy:$.exhaustedBy});break;case"provider_stall":k.publish(O,"subagent.provider.stall",{subagentSessionId:x,phase:$.phase,stallCount:$.stallCount,durationMs:$.durationMs,warningAfterMs:$.warningAfterMs,timeoutMs:$.timeoutMs,outputStarted:$.outputStarted});break;case"action_stationarity":k.publish(O,"subagent.action.stationarity",{subagentSessionId:x,phase:$.phase,toolName:$.toolName,runLength:$.runLength,nudgeThreshold:$.nudgeThreshold,haltThreshold:$.haltThreshold,progressAware:$.progressAware});break;case"mcp_catalog_changed":k.publish(O,"subagent.mcp.catalog.changed",{subagentSessionId:x,revision:$.revision,serverName:$.serverName,added:$.added,removed:$.removed,updated:$.updated});break;case"mcp_content_changed":k.publish(O,"subagent.mcp.content.changed",{subagentSessionId:x,revision:$.revision,serverName:$.serverName,contentKind:$.contentKind,added:$.added,removed:$.removed,updated:$.updated});break;case"mcp_resource_updated":k.publish(O,"subagent.mcp.resource.updated",{subagentSessionId:x,revision:$.revision,serverName:$.serverName,uri:$.uri});break;case"mcp_connection_changed":k.publish(O,"subagent.mcp.connection.changed",{subagentSessionId:x,revision:$.revision,serverName:$.serverName,phase:$.phase,reason:$.reason,attempt:$.attempt,maxAttempts:$.maxAttempts,nextRetryAt:$.nextRetryAt,error:$.error});break;case"mcp_log":k.publish(O,"subagent.mcp.log",{subagentSessionId:x,revision:$.revision,serverName:$.serverName,level:$.level,logger:$.logger,message:$.message,projectedBytes:$.projectedBytes,dataSha256:$.dataSha256,truncated:$.truncated,detailsOmitted:$.detailsOmitted,timestamp:$.timestamp,synthetic:$.synthetic});break;case"mcp_instructions_changed":k.publish(O,"subagent.mcp.instructions.changed",{subagentSessionId:x,revision:$.revision,serverName:$.serverName,action:$.action,reason:$.reason,text:$.text,sourceBytes:$.sourceBytes,projectedBytes:$.projectedBytes,sha256:$.sha256,truncated:$.truncated,detailsOmitted:$.detailsOmitted});break;case"mcp_task_changed":k.publish(O,"subagent.mcp.task.changed",{subagentSessionId:x,revision:$.revision,taskId:$.taskId,serverName:$.serverName,toolName:$.toolName,status:$.status,statusMessage:$.statusMessage,createdAt:$.createdAt,updatedAt:$.updatedAt,completedAt:$.completedAt,hasResult:$.hasResult,error:$.error});break;case"project_rules_loaded":k.publish(O,"subagent.project.rules.loaded",{subagentSessionId:x,files:$.files,triggerPaths:$.triggerPaths,blockedWrite:$.blockedWrite});break;default:break}}function a0(O,x="projectPath"){if(!cx.isAbsolute(O))throw new F(`${x} must be absolute`);return cx.resolve(O)}function v1(O){try{X1(O)}catch(x){throw new F(x instanceof Error?x.message:`Invalid session ID: ${O}`)}}function t(O){return{sessionId:O.id,projectPath:O.projectPath}}function o0(O,x){return{id:O.sessionId,projectPath:O.projectPath,title:O.title??`Session ${O.sessionId.slice(0,6)}`,createdAt:new Date(O.firstMessageTime),updatedAt:new Date(O.lastMessageTime),rootId:O.rootId,parentId:O.parentId,relationType:O.relationType,taskStatus:O.taskStatus,taskStatusReason:O.taskStatusReason,taskFailure:O.taskFailure,taskStartedAt:O.taskStartedAt,taskCompletedAt:O.taskCompletedAt,taskPromptSummary:O.taskPromptSummary,taskPriority:O.taskPriority,taskKind:O.taskKind,taskDueAt:O.taskDueAt,taskModelId:O.taskModelId,selectedModelId:O.selectedModelId,permissionMode:O.permissionMode,reasoningEffort:O.reasoningEffort,serviceTier:O.serviceTier,responseVerbosity:O.responseVerbosity,communicationStyle:O.communicationStyle,communicationStyleDigest:O.communicationStyleDigest,projectInstructionsDigest:O.projectInstructionsDigest,pendingInteraction:O.pendingInteraction,taskRetryAvailable:O.taskRetryAvailable,taskRetriedFrom:O.taskRetriedFrom,taskDelivery:O.taskDelivery,taskIsolation:O.taskIsolation,taskSourceProjectPath:O.taskSourceProjectPath,taskWorktreePath:O.taskWorktreePath,taskWorktreeBranch:O.taskWorktreeBranch,taskBaseCommit:O.taskBaseCommit,taskDiffStat:O.taskDiffStat,taskQueuePosition:O.taskQueuePosition,taskQueueDepth:O.taskQueueDepth,taskConcurrencyLimit:O.taskConcurrencyLimit,archivedAt:O.archivedAt,archivedBySessionId:O.archivedBySessionId,taskWorktree:x,messageCount:O.messageCount}}function f1(O){return O.flatMap((x)=>{if(!W4(x)||x.role==="system"||x.role==="tool"&&x.name===b0)return[];let $=x.tool_calls?.filter((J)=>!("function"in J)||J.function.name!==b0),w=typeof x.content==="string"?x.content.trim():"";if(x.role==="assistant"&&x.tool_calls?.length&&!$?.length&&!w&&!x.reasoningContent&&!x.metadata)return[];let Q={...x,...x.tool_calls?{tool_calls:$&&$.length>0?$:void 0}:{}};if(x.role==="tool"){let J=x.metadata&&typeof x.metadata==="object"&&!Array.isArray(x.metadata)?x.metadata:void 0,K=x.name??(typeof J?.toolName==="string"?J.toolName:"unknown");if(J!==void 0&&(Object.hasOwn(J,"output")||Object.hasOwn(J,"error"))){let B=c1(J),H=O1(x1(K,B),e0);return[{...Q,name:K,content:$1(H),metadata:r0(K,{...B.metadata,status:B.success?"completed":"failed"})}]}return[{...Q,name:K,metadata:r0(K,J)}]}let Y=z4(x.metadata);return[Y?{...Q,content:X4(Y)}:Q]})}function sO(O,x){O.title=x.title??O.title,O.taskStatus=x.taskStatus,O.taskStatusReason=x.taskStatusReason,O.taskFailure=x.taskFailure,O.taskStartedAt=x.taskStartedAt,O.taskCompletedAt=x.taskCompletedAt,O.taskPromptSummary=x.taskPromptSummary,O.taskPriority=x.taskPriority,O.taskKind=x.taskKind,O.taskDueAt=x.taskDueAt,O.taskModelId=x.taskModelId,O.selectedModelId=x.selectedModelId,O.permissionMode=x.permissionMode,O.reasoningEffort=x.reasoningEffort,O.serviceTier=x.serviceTier,O.responseVerbosity=x.responseVerbosity,O.communicationStyle=x.communicationStyle,O.communicationStyleDigest=x.communicationStyleDigest,O.projectInstructionsDigest=x.projectInstructionsDigest,O.pendingInteraction=x.pendingInteraction,O.taskRetryAvailable=x.taskRetryAvailable,O.taskRetriedFrom=x.taskRetriedFrom,O.taskDelivery=x.taskDelivery,O.taskIsolation=x.taskIsolation,O.taskSourceProjectPath=x.taskSourceProjectPath,O.taskWorktreePath=x.taskWorktreePath,O.taskWorktreeBranch=x.taskWorktreeBranch,O.taskBaseCommit=x.taskBaseCommit,O.taskDiffStat=x.taskDiffStat,O.taskQueuePosition=x.taskQueuePosition,O.taskQueueDepth=x.taskQueueDepth,O.taskConcurrencyLimit=x.taskConcurrencyLimit,O.archivedAt=x.archivedAt,O.archivedBySessionId=x.archivedBySessionId,O.messageCount=x.messageCount,O.updatedAt=new Date(x.lastMessageTime)}async function cO(O){let x=await f.findSessionMetadata(O.id,O.projectPath);if(x)sO(O,x)}function W0(O){let x=SO(O.currentRunId),$=x?.status==="waiting_permission"?"running":x?.status==="attention_required"?"interrupted":x?.status??O.taskStatus;return{sessionId:O.id,projectPath:O.projectPath,title:O.title,rootId:O.rootId,parentId:O.parentId,relationType:O.relationType,status:void 0,taskStatus:$,taskStatusReason:O.taskStatusReason,taskFailure:O.taskFailure,taskStartedAt:O.taskStartedAt,taskCompletedAt:O.taskCompletedAt,taskPromptSummary:O.taskPromptSummary,taskPriority:O.taskPriority,taskKind:O.taskKind,taskDueAt:O.taskDueAt,taskModelId:O.taskModelId,selectedModelId:O.selectedModelId,permissionMode:O.permissionMode,reasoningEffort:O.reasoningEffort,serviceTier:O.serviceTier,responseVerbosity:O.responseVerbosity,communicationStyle:O.communicationStyle,communicationStyleDigest:O.communicationStyleDigest,projectInstructionsDigest:O.projectInstructionsDigest,taskRetryAvailable:O.taskRetryAvailable,taskRetriedFrom:O.taskRetriedFrom,taskDelivery:O.taskDelivery,taskIsolation:O.taskIsolation,taskSourceProjectPath:O.taskSourceProjectPath,taskWorktreePath:O.taskWorktreePath,taskWorktreeBranch:O.taskWorktreeBranch,taskBaseCommit:O.taskBaseCommit,taskDiffStat:O.taskDiffStat,taskQueuePosition:$==="queued"?O.taskQueuePosition:void 0,taskQueueDepth:$==="queued"?O.taskQueueDepth:void 0,taskConcurrencyLimit:O.taskConcurrencyLimit,archivedAt:O.archivedAt,archivedBySessionId:O.archivedBySessionId,pendingInteraction:x?.pendingPermission?{type:x.pendingPermission.details.type==="askUserQuestion"?"question":x.pendingPermission.details.type==="mcpElicitation"?"elicitation":"permission",requestId:x.pendingPermission.permissionId}:O.pendingInteraction,agentType:void 0,model:void 0,messageCount:O.messageCount,firstMessageTime:O.createdAt.toISOString(),lastMessageTime:O.updatedAt.toISOString(),hasErrors:!1,isActive:!0}}async function MO(O,x){if(v1(O),x!==void 0){let w=$0({sessionId:O,projectPath:a0(x)});if(NO.has(y(w)))return w;let Q=await f.findSessionMetadata(w.sessionId,w.projectPath);if(!Q)throw new h("Session",O);return $0({sessionId:Q.sessionId,projectPath:Q.projectPath})}let $=new Map;for(let w of NO.values()){if(w.id!==O)continue;let Q=t(w);$.set(y(Q),Q)}for(let w of await f.listSessions()){if(w.sessionId!==O)continue;let Q=$0({sessionId:w.sessionId,projectPath:w.projectPath});$.set(y(Q),Q)}if($.size===0)try{let w=await f.findSessionMetadata(O);if(!w)throw new h("Session",O);return $0({sessionId:w.sessionId,projectPath:w.projectPath})}catch(w){if(w instanceof h)throw w;if(w instanceof Error&&w.message.startsWith("Ambiguous session ID:"))throw new EO;throw w}if($.size>1)throw new EO;return $.values().next().value}function i1(O){if(typeof O==="string")return O;return O.filter((x)=>x.type==="text").map((x)=>x.text).join(`
|
|
7
|
-
`)}function ox(O,x){let $=(x??[]).filter((Q)=>Q.type==="image"&&typeof Q.content==="string").map((Q)=>({type:"image_url",image_url:{url:Q.content}}));if($.length===0)return O;let w=[];if(O.trim())w.push({type:"text",text:O});return w.push(...$),w}function nx(O,x){return x&&O instanceof vO&&(O.kind==="closed"||O.kind==="aborted")}var C4=()=>{u2();let O=new R2;O.onError((Z,V)=>{if(Z instanceof D0){let N=new nO("Session runtime capacity is full",{resource:Z.resource,limit:Z.limit});return V.json(N.toObject(),429)}if(Z instanceof ZO)return V.json(Z.toObject(),Z.statusCode);return P.error("[SessionRoutes] Unhandled route error:",Z),V.json({error:{code:"INTERNAL_ERROR",message:"Internal server error"}},500)});let x=new Map,$=new k1,w=new Map,Q=new Map,Y=new Map,J=new C1,K=new C1,M=KO(),B=new I4({maxResident:M?.maxResidentSessionRuntimes??rx,idleMs:M?.sessionRuntimeIdleMs??ex}),H=new p0,b=new p0,S=setInterval(()=>{B.sweepIdle().catch((Z)=>{P.warn("[SessionRoutes] Session Runtime idle sweep failed:",Z)})},O4);S.unref?.();let q,u=new Map,v=1,QO,VO=()=>{for(let Z of u.values())if(Z.timer)clearTimeout(Z.timer);u.clear()};t0=VO;let A=async(Z)=>{let V;try{V=H.enter()}catch{throw new CO}try{return await Z()}finally{V.release()}};O.use("*",async(Z,V)=>{if(Z.req.method==="GET"||Z.req.method==="HEAD")return V();return A(V)});let c=(Z,V)=>J.runExclusive(y(Z),V),I=(Z,V)=>{let N=y(Z),X=u.get(N);if(!X||V!==void 0&&X.generation!==V)return;if(X.timer)clearTimeout(X.timer);u.delete(N)},GO=(Z,V)=>{let N=u.get(y(t(Z)));return N?.generation===V.generation&&N.attempt===V.attempt&&N.inFlight&&!N.terminal},m=(Z)=>{let V=y(t(Z)),N=u.get(V);if(N?.inFlight||N?.timer||N?.terminal)return;if(!N)N={attempt:0,generation:v++,inFlight:!1,projectedInputIds:new Set,startedAt:Date.now(),terminal:!1,timer:void 0},u.set(V,N);return N.inFlight=!0,N.attempt++,{attempt:N.attempt,deadlineAt:N.startedAt+k4,generation:N.generation,projectedInputIds:N.projectedInputIds}},r=(Z,V,N,X,G)=>{k.publish(Z,"pending.resume",{phase:V,kind:"pending_input",attempt:N,maxAttempts:R4,...G===void 0?{}:{delayMs:G,nextRetryAt:Date.now()+G},...X?{failure:{code:X.code,retryable:X.retryable,...X.resource?{resource:X.resource}:{}}}:{}})},UO=(Z,V,N,X,G,U)=>{let _=t(Z),T=y(_),L=u.get(T);if(!L||L.generation!==V.generation)return!1;if(U)return L.inFlight=!1,L.terminal=!0,r(_,"exhausted",V.attempt,N.taskFailure),!1;let j=q4({sessionIdentity:T,failedAttempt:V.attempt,recoveryStartedAt:L.startedAt,workStillPending:X,evidence:N});if(j.phase!=="retry_scheduled")return L.inFlight=!1,L.terminal=!0,r(_,j.phase,V.attempt,N.taskFailure),!1;let D=setTimeout(()=>{(async()=>{if(await G.completion,u.get(T)!==L||L.timer!==D)return;await c(_,async()=>{if(u.get(T)!==L||L.timer!==D)return;L.timer=void 0,L.inFlight=!1;let g=m(Z);if(!g)return;try{await QO(Z,g)}catch(OO){if(u.get(T)!==L)return;let XO=V0(OO);L.inFlight=!1,L.terminal=!0;let _O=new Date().toISOString(),p;try{p=await f.updateSessionMetadata(Z.id,Z.projectPath,{taskStatus:"failed",taskStatusReason:XO.message,taskFailure:XO,taskCompletedAt:_O,taskOwnerPid:null,taskQueuePosition:null,taskQueueDepth:null})}catch{P.error(`[SessionRoutes] Failed to persist terminal pending input state for ${Z.id}`)}if(u.get(T)!==L||!L.terminal)return;if(Z.taskStatus="failed",Z.taskStatusReason=XO.message,Z.taskFailure=XO,Z.taskCompletedAt=_O,p)sO(Z,p);r(_,"failed",g.attempt,XO),k.publish(_,"session.error",{error:XO.message,taskFailure:XO}),k.publish(_,"session.status",{status:"error"})}})})().catch((g)=>{P.error(`[SessionRoutes] Failed to retry pending input for ${Z.id}:`,g)})},j.delayMs);return D.unref?.(),L.timer=D,L.inFlight=!1,r(_,"retry_scheduled",V.attempt+1,N.taskFailure,j.delayMs),!0},DO=(Z,V)=>{let N=t(Z),X=u.get(y(N));if(!X||X.generation!==V.generation)return!1;if(V.attempt>1)r(N,"recovered",V.attempt);return I(N,V.generation),!0},o=(Z,V)=>K.runExclusive(y(Z),V),a=(Z)=>[...dO.values()].some((V)=>V.sessionId===Z.sessionId&&V.projectPath===Z.projectPath&&TO(V)),PO=async(Z,V,N)=>{let X=Q.get(V);if(!X)X=(async()=>{if(x.get(V)===N)x.delete(V);for(let[U,_]of x)if(_===N)x.delete(U);let G=t(Z);if(NO.get(V)===Z&&!a(G)&&!tO.has(V)&&!uO.has(V))NO.delete(V);if(await N.dispose(),x.size===0)await kO.getInstance().disconnectAll()})().finally(()=>{if(Q.get(V)===X)Q.delete(V)}),Q.set(V,X);await X},BO=async(Z,V={})=>{let N=t(Z),X=y(N);await Q.get(X);let G=B.acquire(X);if(G){if(x.get(X)!==G.value)throw G.release(),Error("Session Runtime residency identity is inconsistent");return G}if(B.owns(X))throw new D0(B.getStats().maxResident);let U=w.get(X);if(!U){let _=V.communicationStyle??Z.communicationStyle;U=(async()=>{let T=await B.reserve(X,{surface:"web",allowEviction:!0}),L;try{L=await X0.create({sessionId:Z.id,workspaceRoot:Z.projectPath,permissionMode:V.permissionMode??Z.permissionMode??"default",...Z.reasoningEffort?{reasoningEffort:Z.reasoningEffort}:{},...Z.serviceTier?{serviceTier:Z.serviceTier}:{},...Z.responseVerbosity?{responseVerbosity:Z.responseVerbosity}:{},..._?{communicationStyle:_}:{},..._===Z.communicationStyle&&Z.communicationStyleDigest?{communicationStyleDigest:Z.communicationStyleDigest}:{},...Z.projectInstructionsDigest?{projectInstructionsDigest:Z.projectInstructionsDigest}:{},...Z.taskWorktree?{taskWorktree:Z.taskWorktree}:{},...Z.taskIsolation?{taskIsolation:Z.taskIsolation}:{},...Z.messageCount>0?{sessionStart:{isResume:!0,resumeSessionId:Z.id}}:{}});let j=L.getCurrentModelId();if(j&&(Z.selectedModelId||Z.taskModelId)&&j!==Z.selectedModelId){let OO=await f.updateSessionMetadata(Z.id,Z.projectPath,{selectedModelId:j}).catch((XO)=>{P.warn(`[SessionRoutes] Failed to migrate restored model for ${Z.id}:`,XO);return});if(OO)Z.selectedModelId=OO.selectedModelId,Z.updatedAt=new Date(OO.lastMessageTime)}let D=L,g=T.commit({key:X,surface:"web",value:D,canEvict:()=>!a(N)&&!tO.has(X)&&!uO.has(X)&&!w.has(X)&&!Q.has(X)&&D.isIdleForResidency(),dispose:()=>PO(Z,X,D)});return L=void 0,x.set(X,D),{runtime:D,claimLease:()=>{if(g){let XO=g;return g=void 0,XO}let OO=B.acquire(X);if(!OO||OO.value!==D)throw Error("Initialized Session Runtime lost residency");return OO}}}catch(j){if(T.cancel(),L)await L.dispose().catch((D)=>{P.warn(`[SessionRoutes] Failed to dispose uncommitted Runtime for ${Z.id}:`,D)});if(j instanceof U4)throw new N1(j.reason);throw j}})(),w.set(X,U)}try{return(await U).claimLease()}finally{if(w.get(X)===U)w.delete(X)}},WO=async(Z,V,N={})=>{let X=await BO(Z,N);try{return await V(X.value)}finally{X.release()}},z=async(Z,V)=>{let N=y(t(Z)),X=w.get(N);if(X)await X.catch(()=>{return});w.delete(N);let G=V??x.get(N);if(!G)return;if(!await B.remove(N,G))throw Error(`Session Runtime is pinned and cannot be disposed: ${N}`)},s=async(Z)=>{let V=y(Z),N=NO.get(V);if(N)return N;let X=Y.get(V);if(!X)X=(async()=>{let G=await f.findSessionMetadata(Z.sessionId,Z.projectPath);if(!G)throw new h("Session",Z.sessionId);let U=await f.findSessionTaskWorktree(Z.sessionId,Z.projectPath),_=o0(G,U);return NO.set(V,_),_})(),Y.set(V,X);try{return await X}finally{if(Y.get(V)===X)Y.delete(V)}},HO=async(Z,V)=>{let N=await MO(Z,V);try{await f.assertSessionWritable(N.sessionId,N.projectPath)}catch(X){if(X instanceof h1)throw new C(X.message);throw X}return s(N)},Z1=async(Z,V)=>{if(Z.permissionMode===V)return;let N=await f.setSessionPermissionMode(Z.id,Z.projectPath,V);Z.permissionMode=N.permissionMode,Z.updatedAt=new Date(N.lastMessageTime),k.publish(t(Z),"session.updated",{permissionMode:V})},aO=(Z,V,N,X={})=>{if(!H.stats().accepting)throw new CO;let G=H0(12),U={id:G,sessionId:Z.id,projectPath:Z.projectPath,status:"running",abortController:new AbortController,disposeRuntimeOnSettle:Z.taskIsolation!==void 0&&X.runtimeLease!==void 0,pendingResume:X.pendingResume,createdAt:new Date};if(Z.taskIsolation&&X.runtimeLease){let _=X.runtimeLease.value,T=O0.admit({key:`${Z.projectPath}\x00${Z.id}`,..._.getTaskAdmissionLimits(),pendingBytes:L4({content:V,outputSchema:X.outputSchema,pendingMessages:_.getPendingSteeringMessages()}),signal:U.abortController.signal,onUpdate:(j)=>{U.status=j.state,Z.taskStatus=j.state,Z.taskQueuePosition=j.queuePosition,Z.taskQueueDepth=j.queueDepth,Z.taskConcurrencyLimit=j.maxConcurrent,U.taskAdmissionUpdate=(U.taskAdmissionUpdate??Promise.resolve()).then(async()=>{await _.setTaskAdmission(j)}).catch((D)=>{P.warn(`[SessionRoutes] Failed to persist admission for ${Z.id}:`,D)})}});U.taskAdmission=T;let L=T.getSnapshot();U.status=L.state,Z.taskStatus=L.state,Z.taskQueuePosition=L.queuePosition,Z.taskQueueDepth=L.queueDepth,Z.taskConcurrencyLimit=L.maxConcurrent}return dO.set(G,U),Z.currentRunId=G,U.completion=l2(U,Z,V,N,BO,{pendingInputOnly:X.pendingInputOnly,preparedInputTurn:X.preparedInputTurn,goalContinuationOnly:X.goalContinuationOnly,outputSchema:X.outputSchema,taskAdmission:U.taskAdmission,runtimeLease:X.runtimeLease,disposeRuntime:z,pendingResume:X.pendingResume,onPendingResumeFailure:(_,T,L,j)=>UO(Z,_,T,L,U,j),onPendingResumeSuccess:(_)=>DO(Z,_),onPendingResumeCancelled:(_)=>I(t(Z),_.generation)}).catch((_)=>{P.error(`[SessionRoutes] Run ${G} failed:`,_)}),U},J1=async(Z)=>{let V;if(Z.outputSchema)try{V=m1(Z.outputSchema).schema}catch(l){throw new F(l instanceof Error?l.message:"Invalid output schema")}let N=y1("task",12),X=a0(Z.sourceProjectPath),G=Z.modelId?.trim(),U=KO();if(!U)throw new F("Config not initialized");let[_,T]=await Promise.all([G1(X,U),gO(X)]);if(G&&!_.config.models.some((l)=>l.id===G))throw new F(`Task model not found: ${G}`);let L=G||_.config.models.find((l)=>l.id===_.config.currentModelId)?.id||_.config.models[0]?.id;if(!L)throw new F("No model is configured. Add or select a model before dispatching a task.");let j=_.config.models.find((l)=>l.id===L);if(!j)throw new F(`Task model not found: ${L}`);let D=Z.reasoningEffort??"off",g=Z.serviceTier??"auto",OO=Z.responseVerbosity??"auto",XO=Z.communicationStyle??"auto",_O,p=T.projectRules?.staticRules(X),n=p&&p.files.length>0?p.provenanceSha256:void 0;try{let l=_.catalog.resolveConfig(j);x4(l,D),sx(l,g),tx(l,OO);let zO=$4(XO,T.communicationStyles);_O=zO.source==="built-in"?void 0:zO.contentSha256}catch(l){throw new F(l instanceof Error?l.message:"Invalid reasoning effort")}let y0={version:1,prompt:Z.prompt,...Z.title?{title:Z.title}:{},...Z.taskPriority?{taskPriority:Z.taskPriority}:{},...Z.taskKind?{taskKind:Z.taskKind}:{},...Z.taskDueAt?{taskDueAt:Z.taskDueAt}:{},sourceProjectPath:X,isolation:Z.isolation,permissionMode:Z.permissionMode,modelId:L,reasoningEffort:D,serviceTier:g,responseVerbosity:OO,communicationStyle:XO,..._O?{communicationStyleDigest:_O}:{},...n?{projectInstructionsDigest:n}:{},...Z.attachments?{attachments:Z.attachments.map((l)=>({...l}))}:{},...V?{outputSchema:V}:{}},oO,i,d;try{let l=await H4.createSessionTask({sessionId:N,prompt:Z.prompt,title:Z.title,taskPriority:Z.taskPriority,taskKind:Z.taskKind,taskDueAt:Z.taskDueAt,sourceProjectPath:X,isolation:Z.isolation,dispatch:y0,retriedFrom:Z.retriedFrom}),{metadata:zO}=l;oO=l.taskWorktree,i=o0(zO,oO);let YO=t(i);NO.set(y(YO),i),k.publish(YO,"task.status",{taskStatus:zO.taskStatus,updatedAt:zO.lastMessageTime});let bO=ox(Z.prompt,Z.attachments);d=await BO(i);let rO=d.value,R=V?await rO.prepareInputTurn(bO,{outputSchema:V}):await rO.prepareInputTurn(bO);if(!R.accepted)throw new C(`Task prompt was not accepted: ${R.reason}`);let xO=aO(i,bO,Z.permissionMode,{preparedInputTurn:R,runtimeLease:d,outputSchema:V});return d=void 0,await xO.taskAdmissionUpdate,{session:W0(i),runId:xO.id,messageId:R.messageId,status:xO.status==="queued"?"queued":"running",queuePosition:i.taskQueuePosition,queueDepth:i.taskQueueDepth,maxConcurrentTasks:i.taskConcurrencyLimit}}catch(l){if(d?.release(),d=void 0,(l instanceof d1||l instanceof D0)&&i){let zO=t(i),YO=y(zO);if(oO)await lO.exit({sessionId:i.id,action:"remove",discardChanges:!0}).catch(()=>{return});throw await z(i).catch(()=>{return}),await f.deleteSession(i.id,i.projectPath).catch(()=>{return}),NO.delete(YO),new nO(l instanceof D0?"Session runtime capacity is full":"Task admission capacity is full",{resource:l.resource,limit:l.limit})}if(i){let zO=await f.findSessionMetadata(i.id,i.projectPath).catch(()=>{return});if(!zO||zO.taskStatus==="queued"){let YO=V0(l),bO=await f.updateSessionMetadata(i.id,i.projectPath,{taskStatus:"failed",taskStatusReason:YO.message,taskFailure:YO,taskCompletedAt:new Date().toISOString(),taskOwnerPid:null}).catch(()=>{return});i.taskStatus=bO?.taskStatus??"failed",i.taskStatusReason=bO?.taskStatusReason??YO.message,i.taskFailure=bO?.taskFailure??YO,i.taskCompletedAt=bO?.taskCompletedAt}else i.taskStatus=zO.taskStatus,i.taskStatusReason=zO.taskStatusReason,i.taskFailure=zO.taskFailure,i.taskCompletedAt=zO.taskCompletedAt}throw l}},E0=(Z)=>A(()=>J1(Z)),Y1=async(Z,V)=>{let N=await MO(Z,V),X=await f.findSessionMetadata(N.sessionId,N.projectPath);if(!X)throw new h("Session",N.sessionId);if(!["failed","interrupted","cancelled"].includes(X.taskStatus))throw new C(`Task cannot be retried while status is ${X.taskStatus}`);let G=await f.findSessionTaskDispatch(N.sessionId,N.projectPath);if(!G)throw new C("Task retry payload is unavailable");return E0({prompt:G.prompt,title:X.title??G.title,taskPriority:X.taskPriority??G.taskPriority,taskKind:X.taskKind??G.taskKind,taskDueAt:X.taskDueAt,sourceProjectPath:G.sourceProjectPath,isolation:G.isolation,permissionMode:G.permissionMode,modelId:G.modelId,reasoningEffort:G.reasoningEffort,serviceTier:G.serviceTier,responseVerbosity:G.responseVerbosity,communicationStyle:G.communicationStyle,attachments:G.attachments,outputSchema:G.outputSchema,retriedFrom:N})},b1=(Z,V)=>A(()=>Y1(Z,V)),A1=(Z,V,N)=>A(async()=>{let X=await MO(Z,N);if(!await f.findSessionMetadata(X.sessionId,X.projectPath))throw new h("Session",X.sessionId);let U=await f.updateSessionMetadata(X.sessionId,X.projectPath,V),_=NO.get(y(X));if(_)sO(_,U);return k.publish(X,"session.updated",{...U.title?{title:U.title}:{},...U.taskPriority?{taskPriority:U.taskPriority}:{},...U.taskKind?{taskKind:U.taskKind}:{},taskDueAt:U.taskDueAt??null}),_?W0(_):{...U,isActive:!1}}),c$=async(Z,V)=>{let N=await HO(Z,V);if(!N.taskWorktree)throw new F("Session does not have a task worktree");try{await lO.restoreSession(N.taskWorktree);let X=await lO.getDiffArtifact(N.id);if(!X)throw new C("Task diff artifact is unavailable");return{sessionId:N.id,projectPath:N.projectPath,...X}}catch(X){if(X instanceof C)throw X;throw P.error("[SessionRoutes] Failed to load task diff artifact:",X),new C("Task diff artifact is unavailable")}},a$=async(Z,V,N)=>{let X=await MO(Z,N);return o(X,async()=>{let G=await HO(X.sessionId,X.projectPath);if(["queued","running"].includes(G.taskStatus))throw new C(`Task artifacts cannot be delivered while status is ${G.taskStatus}`);if(G.taskDelivery?.status==="applied")throw new C("Task changes have already been applied");if(G.taskDelivery?.status==="discarded")throw new C("Task changes have already been discarded");if(!G.taskWorktree)throw new C("Task worktree is unavailable");let U=async(_,T=!1)=>{let L=await f.updateSessionMetadata(G.id,G.projectPath,{taskDelivery:_,...T?{taskWorktree:null}:{}});if(sO(G,L),T)G.taskWorktree=void 0;return k.publish(X,"task.delivery",{taskDelivery:_,...T?{taskWorktreeRemoved:!0}:{},updatedAt:L.lastMessageTime}),W0(G)};try{if(V==="discard"){try{await lO.restoreSession(G.taskWorktree)}catch(L){return P.warn(`[SessionRoutes] Abandoning unavailable task worktree for ${G.id}:`,L),U({status:"discarded",updatedAt:new Date().toISOString(),changedFiles:G.taskDiffStat?.changedFiles??0,message:"Task artifact discarded; worktree was unavailable"},!0)}let T=await lO.exit({sessionId:G.id,action:"remove",discardChanges:!0});return U({status:"discarded",updatedAt:new Date().toISOString(),changedFiles:T.discardedFiles??0,message:"Task worktree removed"},!0)}try{await lO.restoreSession(G.taskWorktree)}catch(T){throw P.warn(`[SessionRoutes] Task worktree is unavailable for ${G.id}:`,T),new u1("artifact_unavailable","Task worktree is unavailable")}let _=await lO.apply(G.id);return U({status:"applied",updatedAt:new Date().toISOString(),sourceCommit:_.sourceCommit,changedFiles:_.changedFiles,message:"Task changes applied to the source workspace"})}catch(_){if(_ instanceof u1)throw await U({status:"conflicted",updatedAt:new Date().toISOString(),message:_.message}),new C(_.message);throw _}})},o$=(Z,V,N)=>A(()=>a$(Z,V,N)),Wx=async(Z,V)=>{let N=u.get(y(t(Z)));if(!V&&N?.terminal)return;let X=SO(Z.currentRunId);if(TO(X)){if(V)I(t(Z),V.generation);return}let G=Z.taskIsolation&&Z.taskStatus!=="queued"&&Z.taskStatus!=="running",U=G?await X0.hasRecoverableTurn(Z.projectPath,Z.id):!1;if(G&&!U){if(V)I(t(Z),V.generation);return}let _=await X0.hasPendingInbox(Z.projectPath,Z.id),T=!_&&await X0.hasActiveGoal(Z.projectPath,Z.id);if(!_&&!T&&!U)U=await X0.hasRecoverableTurn(Z.projectPath,Z.id);if(!_&&!T&&!U){I(t(Z));return}if(V&&!_){I(t(Z),V.generation);return}let L=await BO(Z),j=!1;try{let D=L.value,g=SO(Z.currentRunId);if(TO(g)){if(V)I(t(Z),V.generation);return}if(_&&D.getPendingSteeringCount()===0)await D.reloadPendingInbox();let OO=D.getPendingSteeringCount()>0,XO=OO?null:await D.getGoal(),_O=XO?.status==="active"||XO?.status==="verifying",p=D.getTurnRecoveryAssessment();if(p.state!=="none"&&(p.state==="requires_attention"||!OO&&!_O))k.publish({sessionId:Z.id,projectPath:Z.projectPath},"turn.recovery",{assessment:p});if(p.state==="requires_attention"||G||!OO&&!_O||D.hasTurnOwner()){if(V||!OO)I(t(Z),V?.generation);return}let n=OO&&!Z.taskIsolation?V??m(Z):void 0;if(OO&&!Z.taskIsolation&&!n)return;if(V&&!GO(Z,V))return;aO(Z,"",Z.permissionMode??"default",{pendingInputOnly:OO,goalContinuationOnly:_O,runtimeLease:L,pendingResume:OO?n:void 0}),j=!0}finally{if(!j)L.release()}};QO=async(Z,V)=>{let N;try{N=H.enter()}catch{return}try{let X=SO(Z.currentRunId);if(TO(X)){if(V)I(t(Z),V.generation);return}if(Z.taskIsolation){await Wx(Z);return}await Wx(Z,V)}finally{N.release()}},A0=QO;let n$=async()=>{let Z={scheduled:0,failed:0,deferred:0};if(!H.stats().accepting)return Z;let V=(await f.listSessions({taskStatus:"queued"})).filter((N)=>N.taskIsolation!==void 0).sort((N,X)=>N.firstMessageTime.localeCompare(X.firstMessageTime)||N.projectPath.localeCompare(X.projectPath)||N.sessionId.localeCompare(X.sessionId));for(let[N,X]of V.entries()){let G={sessionId:X.sessionId,projectPath:X.projectPath};try{if(!await X0.hasPendingInbox(X.projectPath,X.sessionId)){let _=V0("Queued task input is missing");await f.updateSessionMetadata(X.sessionId,X.projectPath,{taskStatus:"failed",taskStatusReason:_.message,taskFailure:_,taskCompletedAt:new Date().toISOString(),taskOwnerPid:null,taskQueuePosition:null,taskQueueDepth:null}),Z.failed++;continue}let U=await s(G);if(await QO(U),U.currentRunId)Z.scheduled++}catch(U){if(U instanceof d1||U instanceof D0){Z.deferred+=V.length-N;break}P.warn(`[SessionRoutes] Failed to recover queued task ${X.sessionId}:`,U),Z.deferred++}}return Z};return O.route("/",lx({withAdmission:A,resolveSessionRef:async(Z,V)=>{let N=await MO(Z,V);return await s(N),N},getRuntime:(Z)=>$.get(Z),captureAgentScreenshot:async(Z,V)=>{let N=await s(Z);return WO(N,(X)=>X.captureBrowserScreenshot(V))},resetRuntime:(Z)=>$.reset(Z)})),O.get("/",async(Z)=>{try{let V=await f.listSessions(),N=new Set(V.filter((j)=>j.relationType==="subagent").map((j)=>y({sessionId:j.sessionId,projectPath:j.projectPath}))),X=Array.from(NO.values()).filter((j)=>!N.has(y(t(j)))&&j.relationType!=="subagent").map((j)=>W0(j)),G=new Set(X.map((j)=>y({sessionId:j.sessionId,projectPath:j.projectPath}))),U=V.filter((j)=>{if(j.relationType==="subagent")return!1;return!G.has(y({sessionId:j.sessionId,projectPath:j.projectPath}))}),_=new Set(G),T=U.filter((j)=>{let D=y({sessionId:j.sessionId,projectPath:j.projectPath});if(_.has(D))return!1;return _.add(D),!0}),L=[...X,...T];return Z.json(L)}catch(V){throw P.error("[SessionRoutes] Failed to list sessions:",V),new wO("Failed to list sessions")}}),O.get("/catalog",async(Z)=>{try{let V=Z.req.query("limit"),N=V===void 0?void 0:Number(V),X=Z.req.query("cursor"),G=Z.req.query("projectPath"),U=Z.req.query("archived");if(U!==void 0&&U!=="true"&&U!=="false")throw new F("archived must be true or false");let _=U==="true",T=await f.listSessionPage({...G?{cwd:a0(G)}:{},...X?{cursor:X}:{},...N===void 0?{}:{limit:N},includeSubagents:!1,archived:_}),L=new Map((_?[]:Array.from(NO.values())).filter((j)=>j.relationType!=="subagent").map((j)=>[y(t(j)),W0(j)]));return Z.json({sessions:T.sessions.map((j)=>L.get(y({sessionId:j.sessionId,projectPath:j.projectPath}))??j),...T.nextCursor?{nextCursor:T.nextCursor}:{}})}catch(V){if(V instanceof F)throw V;if(V instanceof Error&&(V.message.startsWith("Invalid session cursor")||V.message.startsWith("Session cursor scope")||V.message.startsWith("Session catalog")))throw new F(V.message);throw P.error("[SessionRoutes] Failed to list session catalog:",V),new wO("Failed to list session catalog")}}),O.post("/",async(Z)=>{try{let V=await Z.req.json(),N=E(f2,V);if(!N.success)throw new F("Invalid request body");let{title:X,projectPath:G}=N.data,U=y1("web",12),_=a0(G||Z.get("directory")||e(),G?"projectPath":"directory"),T=await f.createSessionMetadata(U,_,{title:X,taskStatus:"completed"}),L=o0(T),j=t(L);return NO.set(y(j),L),k.publish(j,"session.created",{}),Z.json({...W0(L),status:void 0,agentType:void 0,model:void 0})}catch(V){if(P.error("[SessionRoutes] Failed to create session:",V),V instanceof F)throw V;throw new wO("Failed to create session")}}),O.get("/:sessionId/export",async(Z)=>{let V=Z.req.param("sessionId");try{let N=Z.req.query("includeReasoning");if(N!==void 0&&N!=="true"&&N!=="false")throw new F("includeReasoning must be true or false");let X=await MO(V,Z.req.query("projectPath")),G=await f.exportSessionMarkdown(X.sessionId,X.projectPath,{includeReasoning:N==="true"});return Z.body(G.markdown,200,{"Cache-Control":"no-store","Content-Disposition":`attachment; filename="${G.filename}"`,"Content-Length":String(Buffer.byteLength(G.markdown,"utf8")),"Content-Type":"text/markdown; charset=utf-8","X-Blade-Content-Sha256":G.contentSha256,"X-Blade-Export-Activities":String(G.activityCount),"X-Blade-Export-Messages":String(G.messageCount),"X-Blade-Export-Redactions":String(G.redactionCount)})}catch(N){if(N instanceof F||N instanceof h||N instanceof EO)throw N;if(N instanceof Error&&N.message==="No conversation content to export")throw new C(N.message);throw P.error("[SessionRoutes] Failed to export session:",N),new wO("Failed to export session")}}),O.post("/:sessionId/fork",async(Z)=>{let V=Z.req.param("sessionId");try{v1(V);let N=await Z.req.json(),X=E(y2,N);if(!X.success)throw new F("Invalid request body");let G=a0(X.data.projectPath),U=await f.findSessionMetadata(V,G);if(!U)throw new h("Session",V);let _=await f.forkSession(V,{sourceProjectPath:U.projectPath,targetProjectPath:U.projectPath}),T=o0(_.metadata),L=t(T);return NO.set(y(L),T),k.publish(L,"task.status",{taskStatus:_.metadata.taskStatus,..._.metadata.taskCompletedAt?{taskCompletedAt:_.metadata.taskCompletedAt}:{},updatedAt:_.metadata.lastMessageTime}),Z.json({session:_.metadata,messages:f1(_.messages)},201)}catch(N){if(N instanceof F||N instanceof h||N instanceof C)throw N;if(N instanceof V4)throw new C("Session has no durable creation record");throw P.error("[SessionRoutes] Failed to fork session:",N),new wO("Failed to fork session")}}),O.get("/:sessionId",async(Z)=>{let V=Z.req.param("sessionId");try{let N=await MO(V,Z.req.query("projectPath")),X=NO.get(y(N));if(X)return Z.json(W0(X));let G=await f.findSessionMetadata(N.sessionId,N.projectPath);if(!G)throw new h("Session",V);return Z.json(G)}catch(N){if(N instanceof F||N instanceof h||N instanceof EO)throw N;throw P.error("[SessionRoutes] Failed to get session:",N),new wO("Failed to get session")}}),O.patch("/:sessionId",async(Z)=>{let V=Z.req.param("sessionId");try{let N=await Z.req.json(),X=E(E2,N);if(!X.success)throw new F("Invalid request body");if(X.data.title===void 0)throw new F("title is required");let G=await MO(V,X.data.projectPath),U=await f.updateSessionMetadata(G.sessionId,G.projectPath,{title:X.data.title}),_=NO.get(y(G));if(_)_.title=U.title??_.title,_.updatedAt=new Date(U.lastMessageTime);if(U.title)k.publish(G,"session.updated",{title:U.title});return Z.json({success:!0,title:U.title})}catch(N){if(P.error("[SessionRoutes] Failed to update session:",N),N instanceof F||N instanceof h||N instanceof EO)throw N;throw new wO("Failed to update session")}}),O.get("/:sessionId/rewind",async(Z)=>{let V=await HO(Z.req.param("sessionId"),Z.req.query("projectPath"));return WO(V,async(N)=>Z.json({checkpoints:await N.listRewindCheckpoints()}))}),O.post("/:sessionId/rewind",async(Z)=>{let V=E(b4,await Z.req.json());if(!V.success)throw new F("Invalid rewind request");let N=await HO(Z.req.param("sessionId"),Z.req.query("projectPath")),X=t(N);return c(X,async()=>{let G=SO(N.currentRunId);if(TO(G))throw new C("Cannot rewind while a run is active");return WO(N,async(U)=>{let _;try{_=await U.rewindSession(V.data)}catch(L){if(L instanceof Error&&L.message.startsWith("Cannot rewind while"))throw new C(L.message);throw L}await cO(N);let T=f1(_.messages);return k.publish(X,"session.rewound",{targetMessageId:_.checkpoint.messageId,mode:_.mode,removedTurns:_.removedTurns,restoredFiles:_.restoredFiles,messages:T}),Z.json({..._,messages:T})})})}),O.get("/:sessionId/review",async(Z)=>{let V=Z.req.param("sessionId"),N=await MO(V,Z.req.query("projectPath")),X=await z0.list(N.projectPath,N.sessionId);return Z.json({reviews:X.map((G)=>({...G,content:G.completion?N4(G.start,G.completion):void 0}))})}),O.post("/:sessionId/review",async(Z)=>{let V=Z.req.param("sessionId"),N=E(S4,await Z.req.json());if(!N.success)throw new F("Invalid code review request");let X=await HO(V,N.data.projectPath),G=t(X),U=y(G);return c(G,async()=>{if(TO(SO(X.currentRunId)))throw new C("Cannot start a review during an active turn");if(uO.has(U))throw new C("Session already has an active review");return WO(X,async(_)=>{if(await z0.recoverInterrupted(G.projectPath,G.sessionId,_),N.data.modelId&&!_.getModelById(N.data.modelId))throw new F(`Model not found: ${N.data.modelId}`);if(N.data.modelId&&_.getCurrentModelId()!==N.data.modelId)await _.refresh({modelId:N.data.modelId});if(N.data.modelId&&X.selectedModelId!==N.data.modelId){let D=await f.updateSessionMetadata(X.id,X.projectPath,{selectedModelId:N.data.modelId});sO(X,D)}let T=new AbortController,L;try{L=await z0.start({sessionId:G.sessionId,projectPath:G.projectPath,runtime:_,request:{kind:N.data.kind,...N.data.ref?{ref:N.data.ref}:{},...N.data.instructions?{instructions:N.data.instructions}:{}},signal:T.signal,onEvent:(D)=>{if(D.kind==="tool_start")k.publish(G,"review.tool.started",{reviewId:L?.reviewId,toolCallId:D.toolCall.id,toolName:D.toolCall.function.name});else if(D.kind==="tool_progress")k.publish(G,"review.tool.progress",{reviewId:L?.reviewId,toolCallId:D.toolCall.id,message:D.update.message.slice(0,1000)});else if(D.kind==="tool_result")k.publish(G,"review.tool.completed",{reviewId:L?.reviewId,toolCallId:D.toolCall.id,success:D.result.success})}})}catch(D){if(D instanceof Error&&(D.message.includes("active review")||D.message.includes("interrupted review")||D.message.includes("active turn")))throw new C(D.message);if(D instanceof Error&&(D.message.includes("review")||D.message.includes("Git")||D.message.includes("changes")||D.message.includes("ref")))throw new F(D.message);throw D}if(!L)throw new wO("Code review failed to start");await cO(X),k.publish(G,"review.started",{reviewId:L.reviewId,kind:N.data.kind}),k.publish(G,"task.status",{taskStatus:X.taskStatus,...X.taskStatusReason?{taskStatusReason:X.taskStatusReason}:{},...X.taskStartedAt?{taskStartedAt:X.taskStartedAt}:{},...X.taskPromptSummary?{taskPromptSummary:X.taskPromptSummary}:{},updatedAt:new Date().toISOString()});let j=L.completion.then(async(D)=>{await cO(X),k.publish(G,"task.status",{taskStatus:X.taskStatus,...X.taskStatusReason?{taskStatusReason:X.taskStatusReason}:{},...X.taskFailure?{taskFailure:X.taskFailure}:{},...X.taskStartedAt?{taskStartedAt:X.taskStartedAt}:{},...X.taskCompletedAt?{taskCompletedAt:X.taskCompletedAt}:{},...X.taskPromptSummary?{taskPromptSummary:X.taskPromptSummary}:{},updatedAt:new Date().toISOString()}),k.publish(G,"review.completed",{reviewId:L.reviewId,status:D.status,findings:D.findings.length})}).catch((D)=>{P.error(`[SessionRoutes] Code review ${L.reviewId} failed:`,D)}).finally(()=>{if(uO.get(U)?.reviewId===L.reviewId)uO.delete(U)});return uO.set(U,{reviewId:L.reviewId,controller:T,completion:j}),Z.json({reviewId:L.reviewId,status:"running"},202)})})}),O.get("/:sessionId/subagents",async(Z)=>{let V=await HO(Z.req.param("sessionId"),Z.req.query("projectPath"));return WO(V,(N)=>Z.json({subagents:N.listSubagents().map(K1)}))}),O.post("/:sessionId/subagents/:agentId/resume",async(Z)=>{v1(Z.req.param("agentId"));let V=A4.safeParse(await Z.req.json());if(!V.success)throw new F("Invalid subagent resume request");let N=await HO(Z.req.param("sessionId"),Z.req.query("projectPath")),X=t(N);return c(X,async()=>{let G=SO(N.currentRunId);if(TO(G))throw new C("Cannot resume a subagent while a parent run is active");return WO(N,async(U)=>{let _=!1,T,L=(D)=>{k.publish(X,"subagent.complete",{subagentSessionId:D.id,success:D.status==="completed",status:D.status,summary:D.result?.message?.slice(0,500),type:D.subagentType,verificationVerdict:D.result?.verificationVerdict,resumedFrom:D.resumedFrom,rootAgentId:D.rootAgentId,resumeDepth:D.resumeDepth})},j;try{j=U.resumeSubagent({agentId:Z.req.param("agentId"),prompt:V.data.prompt,onEvent:(D,g)=>{i2(X,g,D)},onCompleted:(D)=>{if(_)L(D);else T=D}})}catch(D){if(D instanceof Error&&(D.message.startsWith("Cannot resume")||D.message.startsWith("Subagent cannot")))throw new C(D.message);if(D instanceof Error&&D.message.startsWith("Subagent not found"))throw new h(D.message);throw D}if(k.publish(X,"subagent.start",{subagentSessionId:j.session.id,type:j.session.subagentType,description:j.session.description,resumedFrom:j.source.id,rootAgentId:j.session.rootAgentId,resumeDepth:j.session.resumeDepth}),_=!0,T)L(T);return Z.json({source:K1(j.source),session:K1(j.session)})})})}),O.get("/:sessionId/goal",async(Z)=>{let V=await HO(Z.req.param("sessionId"),Z.req.query("projectPath"));return Z.json({goal:await new B4(V.projectPath,V.id).get()})}),O.put("/:sessionId/goal",async(Z)=>{let V=E(P2,await Z.req.json());if(!V.success)throw new F("Invalid goal request");let N=await HO(Z.req.param("sessionId"),Z.req.query("projectPath")),X=t(N);return c(X,async()=>{let G=SO(N.currentRunId);if(TO(G))return Z.json({status:"rejected",reason:"run_active"},409);let _=V.data.permissionMode??N.permissionMode??"default";if(N.permissionMode!==_)await Z1(N,_);let T=await BO(N),L=!1;try{let j=await T.value.createGoal(V.data);k.publish(X,"goal.updated",{goal:j});let D=aO(N,"",_,{goalContinuationOnly:!0,runtimeLease:T});return L=!0,await D.taskAdmissionUpdate,Z.json({status:D.status==="queued"?"queued":"running",runId:D.id,goal:j,queuePosition:N.taskQueuePosition,queueDepth:N.taskQueueDepth,maxConcurrentTasks:N.taskConcurrencyLimit},202)}finally{if(!L)T.release()}})}),O.patch("/:sessionId/goal",async(Z)=>{let V=E(m2,await Z.req.json());if(!V.success)throw new F("Invalid goal update");let N=await HO(Z.req.param("sessionId"),Z.req.query("projectPath")),X=t(N);return c(X,async()=>{let G=await BO(N),U=!1;try{let _=G.value,T;if(V.data.action==="pause")T=await _.pauseGoal();else if(V.data.action==="edit")T=await _.editGoal(V.data.objective);else T=await _.resumeGoal();if(k.publish(X,"goal.updated",{goal:T}),T.status==="active"&&!TO(SO(N.currentRunId))){let L=aO(N,"","default",{goalContinuationOnly:!0,runtimeLease:G});return U=!0,await L.taskAdmissionUpdate,Z.json({status:L.status==="queued"?"queued":"running",runId:L.id,goal:T,queuePosition:N.taskQueuePosition,queueDepth:N.taskQueueDepth,maxConcurrentTasks:N.taskConcurrencyLimit},202)}return Z.json({status:T.status,goal:T})}finally{if(!U)G.release()}})}),O.delete("/:sessionId/goal",async(Z)=>{let V=await HO(Z.req.param("sessionId"),Z.req.query("projectPath")),N=t(V);return WO(V,async(X)=>{let G=await X.clearGoal();if(G)k.publish(N,"goal.cleared",{});return Z.json({cleared:G})})}),O.post("/:sessionId/archive",async(Z)=>{let V=Z.req.param("sessionId");try{let N=await MO(V,Z.req.query("projectPath")),X=await f.listSessionArchiveMembers(N.sessionId,N.projectPath);for(let U of X){let _=$0({sessionId:U.sessionId,projectPath:U.projectPath}),T=NO.get(y(_));if(TO(SO(T?.currentRunId)))throw new C(`Stop session ${U.sessionId} before archiving this session tree`)}for(let U of X){let _=$0({sessionId:U.sessionId,projectPath:U.projectPath}),T=NO.get(y(_));if(T)await z(T)}let G=await f.archiveSession(N.sessionId,N.projectPath);for(let U of X){let _=$0({sessionId:U.sessionId,projectPath:U.projectPath}),T=y(_);NO.delete(T),Y.delete(T),w.delete(T),k.publish(_,"session.archived",{archiveRootId:N.sessionId,archivedAt:G.archivedAt})}if(x.size===0)await kO.getInstance().disconnectAll();return Z.json({session:G,archivedSessionIds:X.map((U)=>U.sessionId)})}catch(N){if(N instanceof F||N instanceof h||N instanceof EO||N instanceof C)throw N;if(N instanceof g1)throw new C(N.message);throw P.error("[SessionRoutes] Failed to archive session:",N),new wO("Failed to archive session")}}),O.post("/:sessionId/unarchive",async(Z)=>{let V=Z.req.param("sessionId");try{let N=await MO(V,Z.req.query("projectPath")),X=await f.listSessionArchiveMembers(N.sessionId,N.projectPath),G=await f.unarchiveSession(N.sessionId,N.projectPath),U=X.filter((_)=>_.sessionId===N.sessionId||_.archivedBySessionId===N.sessionId).map((_)=>_.sessionId);for(let _ of U)k.publish({sessionId:_,projectPath:N.projectPath},"session.unarchived",{archiveRootId:N.sessionId});return Z.json({session:G,restoredSessionIds:U})}catch(N){if(N instanceof F||N instanceof h||N instanceof EO)throw N;if(N instanceof g1)throw new C(N.message);throw P.error("[SessionRoutes] Failed to unarchive session:",N),new wO("Failed to unarchive session")}}),O.delete("/:sessionId",async(Z)=>{let V=Z.req.param("sessionId"),N=Z.req.query("projectPath");try{let X=await MO(V,N);I(X);let G=y(X),U=NO.get(G),_=x.get(G),T=U?.taskWorktree??await f.findSessionTaskWorktree(X.sessionId,X.projectPath),L;if(U?.currentRunId){let g=SO(U.currentRunId);if(g)s0(g),await g.completion,L=g.id}let j=uO.get(G);if(j)j.controller.abort("session-delete"),await j.completion;if(_)await _.clearGoal().catch((g)=>{P.warn("[SessionRoutes] Failed to clear session goal:",g)});if(await $.dispose(X),await f.deleteSession(X.sessionId,X.projectPath),k.publish(X,"session.deleted",{}),L)g2(L);NO.delete(G),Y.delete(G),w.delete(G);let D=x.get(G);if(D){if(!await B.remove(G,D))throw new C("Session Runtime is still active and cannot be deleted")}if(T)try{await lO.restoreSession(T),await lO.exit({sessionId:X.sessionId,action:"remove",discardChanges:!0})}catch(g){P.warn(`[SessionRoutes] Failed to remove deleted task worktree ${X.sessionId}:`,g)}return Z.json({success:!0})}catch(X){if(P.error("[SessionRoutes] Failed to delete session:",X),X instanceof F||X instanceof h||X instanceof EO)throw X;throw new wO("Failed to delete session")}}),O.get("/:sessionId/message",async(Z)=>{let V=Z.req.param("sessionId");try{let N=await MO(V,Z.req.query("projectPath")),X=await f.loadSession(N.sessionId,N.projectPath);return Z.json(f1(X))}catch(N){if(P.error("[SessionRoutes] Failed to get messages:",N),N instanceof F||N instanceof h||N instanceof EO)throw N;throw new wO("Failed to get messages")}}),O.get("/:sessionId/events",async(Z)=>{let V=Z.req.param("sessionId"),N;try{N=b.enter(Z.req.raw.signal)}catch{throw new CO}let X=!1;try{let G=await MO(V,Z.req.query("projectPath"));try{await f.assertSessionWritable(G.sessionId,G.projectPath)}catch(D){if(D instanceof h1)throw new C(D.message);throw D}let U=await s(G),_=Z.req.header("Last-Event-ID")??Z.req.query("lastEventId"),T=_?Number.parseInt(_,10):Number.NaN,L=Number.isInteger(T)?T+1:void 0,j=k2(Z,async(D)=>{let OO=new Set,XO,_O,p=!1,n,y0,oO=new Promise((R)=>{y0=R}),i,d=new Set,l=(R)=>{let xO=R;return OO.add(xO),R.finally(()=>{OO.delete(xO)})},zO=()=>{if(XO?.(),XO=void 0,_O!==void 0)clearInterval(_O),_O=void 0},YO=(R)=>{if(i)return i;return p=!0,i=(async()=>{try{zO(),n?.close(R),D.close()}finally{y0()}})(),i},bO=()=>{YO(N.signal.reason)},rO=async(R)=>{await YO(R),await Promise.allSettled([...OO]),N.signal.removeEventListener("abort",bO),N.release()};if(N.signal.addEventListener("abort",bO,{once:!0}),D.onAbort(()=>{YO()}),N.signal.aborted){await rO(N.signal.reason);return}n=new h0({write:async(R)=>{await D.writeSSE(R)},onFailure:(R)=>{if(nx(R,p))return;P.warn(`[SessionRoutes] SSE egress closed for ${G.sessionId}: kind=${R.kind} pendingItems=${R.pendingItems??0} pendingBytes=${R.pendingBytes??0}`),YO(R)}}),XO=k.subscribe((R)=>{if(p)return;if(R.sessionId!==G.sessionId||R.projectPath!==G.projectPath)return;let xO=R.properties.requestId;if((R.type==="permission.asked"||R.type==="question.required"||R.type==="elicitation.required")&&typeof xO==="string"){if(d.has(xO))return;d.add(xO)}if(R.type==="subagent.completion.queued"){let RO=c(G,()=>QO(U)).catch((qO)=>{P.error(`[SessionRoutes] Failed to wake background completion for ${U.id}:`,qO)});l(RO)}if(R.type==="team.message.received"&&typeof R.properties.teamName==="string"&&typeof R.properties.messageId==="string"&&typeof R.properties.content==="string"&&F4(R.properties.metadata,{messageId:R.properties.messageId,teamName:R.properties.teamName})){let RO=R.properties.teamName,qO=R.properties.messageId,eO=R.properties.content,AO=R.properties.metadata,FO=c(G,async()=>{let jO=await BO(U),P0=!1;try{let Y0=await jO.value.enqueueSteering(eO,{allowBeforeTurn:!0,messageId:qO,origin:"team_message",metadata:AO});if(!Y0.accepted)return;await new _4(RO,U1()).markDelivered([qO]),P0=Y0.delivery==="next_turn"}finally{jO.release()}if(!P0)return;await QO(U).catch((Y0)=>{P.error(`[SessionRoutes] Failed to wake teammate delivery for ${U.id}:`,Y0)})}).catch((jO)=>{P.error(`[SessionRoutes] Failed to deliver teammate message for ${U.id}:`,jO)});l(FO)}if(R.type==="subagent.completion.queued"||R.type==="team.message.received")return;n?.observe(p2(R),R.seq)});try{if(D.aborted||p)return;let R=SO(U.currentRunId),xO=TO(R)?await BO(U):void 0;try{let AO=xO?.value,FO=AO?.getPendingSteeringCount()??0;await n.writeInitial({data:JSON.stringify({type:"connected",properties:{sessionId:G.sessionId,projectPath:G.projectPath,timestamp:Date.now(),status:TO(R)?R.status:"idle",runId:TO(R)?R.id:void 0,queued:FO,pendingInputDelivery:FO>0?AO?.hasActiveTurn()?"current_turn":"next_turn":null,recovered:AO?.getRecoveredSteeringCount()??0}})})}finally{xO?.release()}if(D.aborted||p)return;if(L!==void 0){if(await K4.for(G.sessionId,G.projectPath).replay({onCommitted:async(FO)=>{if(D.aborted||p)return;let jO=v2(FO);if(jO.seq===void 0)return;await n.writeReplay({...typeof FO.seq==="number"?{id:String(FO.seq)}:{},data:JSON.stringify({type:jO.type,...jO.seq!==void 0?{seq:jO.seq}:{},properties:{...jO.properties,sessionId:G.sessionId,projectPath:G.projectPath}})},jO.seq)}},L),D.aborted||p)return}if(n.finishInitialization({replayed:L!==void 0}),D.aborted||p)return;if(!R&&!uO.has(y(G))){let FO=(await z0.list(G.projectPath,G.sessionId)).some((jO)=>jO.completion===void 0)?await WO(U,(jO)=>z0.recoverInterrupted(G.projectPath,G.sessionId,jO)):void 0;if(FO)await cO(U),k.publish(G,"review.completed",{reviewId:FO.reviewId,status:FO.status,findings:0,recovered:!0})}if(D.aborted||p)return;if(!R)await G0.recoverResponded(G.projectPath,G.sessionId);if(D.aborted||p)return;let RO=R?void 0:await G0.findPending(G.projectPath,G.sessionId),qO=R?.pendingPermission??(RO?{permissionId:RO.request.requestId,details:G0.confirmationDetails(RO),resolve:()=>{return}}:void 0);if(qO){d.add(qO.permissionId);let AO=f4(qO,!0);n.observe({data:JSON.stringify({type:AO.type,properties:{...AO.properties,sessionId:G.sessionId,projectPath:G.projectPath}})})}if(D.aborted||p)return;let eO=QO(U).catch(async(AO)=>{if(AO instanceof N1){await cO(U).catch(()=>{return});let FO=U.taskFailure?.code==="workspace_unavailable"?U.taskFailure:n0("workspace_unavailable");U.taskStatus="failed",U.taskStatusReason=FO.message,U.taskFailure=FO,k.publish(G,"session.error",{error:FO.message,taskFailure:FO}),k.publish(G,"session.status",{status:"error"})}P.error(`[SessionRoutes] Failed to resume pending input for ${V}:`,AO)});if(l(eO),D.aborted||p)return;_O=setInterval(()=>{if(D.aborted||p)return;n?.offerHeartbeat({data:JSON.stringify({type:"heartbeat",properties:{timestamp:Date.now()}})})},15000),await oO}catch(R){if(nx(R,p))return;throw R}finally{await rO()}});return X=!0,j}catch(G){if(!X)N.release();throw G}}),O.post("/:sessionId/message",async(Z)=>{let V=Z.req.param("sessionId"),N=await Z.req.json(),X=E(C2,N);if(!X.success)throw new F("Invalid message format");let{content:G,attachments:U,modelId:_,reasoningEffort:T,serviceTier:L,responseVerbosity:j,communicationStyle:D,permissionMode:g,projectPath:OO,outputSchema:XO}=X.data,_O;if(XO)try{_O=m1(XO).schema}catch(YO){throw new F(YO instanceof Error?YO.message:"Invalid output schema")}let p=D;if(Buffer.byteLength(G,"utf8")>E1)throw new F(`Message text exceeds the ${E1}-byte limit`);let n=_?.trim();if((U??[]).reduce((YO,bO)=>YO+(typeof bO.content==="string"?Buffer.byteLength(bO.content):0),0)>_1)throw new F("Message attachments exceed the 5 MiB limit");let oO=g,i=ox(G,U),d=await HO(V,OO??Z.req.query("projectPath")),l=oO??d.permissionMode??"default",zO=t(d);return c(zO,async()=>{let YO=SO(d.currentRunId);if(TO(YO)){if(_O)throw new C("Wait for the active turn to finish before setting an output schema");return WO(d,async(R)=>{if(n&&!R.getModelById(n))throw new F(`Model not found: ${n}`);if(n&&R.getCurrentModelId()!==n)throw new C("Wait for the active turn to finish before switching models");if(T&&R.getReasoningConfiguration().selection!==T)throw new C("Wait for the active turn to finish before switching reasoning effort");if(L&&R.getServiceTierConfiguration().selection!==L)throw new C("Wait for the active turn to finish before switching service tier");if(j&&R.getResponseVerbosityConfiguration().selection!==j)throw new C("Wait for the active turn to finish before switching response verbosity");if(p&&R.getCommunicationStyleConfiguration().selection!==p)throw new C("Wait for the active turn to finish before switching communication style");if(oO&&d.permissionMode!==oO)throw new C("Wait for the active turn to finish before switching permission mode");let xO=await R.enqueueSteering(i,{allowBeforeTurn:!0});if(!xO.accepted)return Z.json({status:"rejected",reason:xO.reason??"turn_unavailable"},409);let RO=xO.messageId??H0(12),qO=xO.queued;k.publish(zO,"message.created",{messageId:RO,role:"user",content:i1(i)});let eO=xO.delivery==="next_turn"?"follow_up.queued":"steering.queued";if(k.publish(zO,eO,{runId:YO.id,messageId:RO,queued:qO}),xO.delivery==="next_turn"&&YO.status!=="running"&&YO.status!=="waiting_permission")QO(d).catch((AO)=>{P.error(`[SessionRoutes] Failed to wake queued follow-up for ${V}:`,AO)});if(xO.delivery==="next_turn")YO.pendingFollowUpRequested=!0;return Z.json({runId:YO.id,messageId:RO,status:xO.delivery==="next_turn"?"follow_up_queued":"steering_queued",queued:qO},202)})}if(I(zO),d.permissionMode!==l)await Z1(d,l);let bO=await BO(d,{permissionMode:l,...p&&!p.includes(":")?{communicationStyle:p}:{}}),rO=!1;try{let R=bO.value;if(n&&!R.getModelById(n))throw new F(`Model not found: ${n}`);if(T)try{R.resolveReasoningConfiguration(T,n)}catch(LO){throw new F(LO instanceof Error?LO.message:"Invalid reasoning effort")}if(L)try{R.resolveServiceTierConfiguration(L,n)}catch(LO){throw new F(LO instanceof Error?LO.message:"Invalid service tier")}if(j)try{R.resolveResponseVerbosityConfiguration(j,n)}catch(LO){throw new F(LO instanceof Error?LO.message:"Invalid response verbosity")}let xO=p?R.resolveCommunicationStyleConfiguration(p):void 0;if(xO?.source!==void 0&&xO.source!=="built-in"&&!xO.contentSha256)throw new F("Custom communication style has no provenance");let RO=R.getCurrentModelId(),qO=R.getReasoningConfiguration(),eO=R.getServiceTierConfiguration(),AO=R.getResponseVerbosityConfiguration(),FO=R.getCommunicationStyleConfiguration(),jO=Boolean(n)&&RO!==n,P0=Boolean(T)&&qO.selection!==T,Y0=Boolean(L)&&eO.selection!==L,Xx=Boolean(j)&&AO.selection!==j,zx=Boolean(p)&&FO.selection!==p;if(jO||P0||Y0||Xx||zx)await R.refresh({...n?{modelId:n}:{},...T?{reasoningEffort:T}:{},...L?{serviceTier:L}:{},...j?{responseVerbosity:j}:{},...p?{communicationStyle:p}:{}});let j1={...n&&d.selectedModelId!==n?{selectedModelId:n}:{},...T&&d.reasoningEffort!==T?{reasoningEffort:T}:{},...L&&d.serviceTier!==L?{serviceTier:L}:{},...j&&d.responseVerbosity!==j?{responseVerbosity:j}:{},...xO&&(d.communicationStyle!==p||d.communicationStyleDigest!==xO.contentSha256)?{communicationStyle:p,communicationStyleDigest:xO.source==="built-in"?null:xO.contentSha256}:{}};if(Object.keys(j1).length>0)try{let LO=await f.updateSessionMetadata(d.id,d.projectPath,j1);d.permissionMode=LO.permissionMode,d.selectedModelId=LO.selectedModelId,d.reasoningEffort=LO.reasoningEffort,d.serviceTier=LO.serviceTier,d.responseVerbosity=LO.responseVerbosity,d.communicationStyle=LO.communicationStyle,d.communicationStyleDigest=LO.communicationStyleDigest,d.updatedAt=new Date(LO.lastMessageTime),k.publish(zO,"session.updated",j1)}catch(LO){if(jO||P0||Y0||Xx||zx)await R.refresh({...RO?{modelId:RO}:{},reasoningEffort:qO.selection,serviceTier:eO.selection,responseVerbosity:AO.selection,communicationStyle:FO.selection}).catch((t$)=>P.error("[SessionRoutes] Failed to roll back non-durable model settings:",t$));throw LO}let m0=_O?await R.prepareInputTurn(i,{outputSchema:_O}):await R.prepareInputTurn(i);if(!m0.accepted)return Z.json({status:"rejected",reason:m0.reason},m0.reason==="queue_full"?429:409);let M1=aO(d,i,l,{preparedInputTurn:m0,outputSchema:_O,runtimeLease:bO});return rO=!0,await M1.taskAdmissionUpdate,Z.json({runId:M1.id,messageId:m0.messageId,status:M1.status==="queued"?"queued":"running",queuePosition:d.taskQueuePosition,queueDepth:d.taskQueueDepth,maxConcurrentTasks:d.taskConcurrencyLimit},202)}finally{if(!rO)bO.release()}})}),O.post("/:sessionId/side-question",async(Z)=>{let V=Z.req.param("sessionId"),N=E(T4,await Z.req.json());if(!N.success)throw new F("Invalid side conversation request");let X=await HO(V,N.data.projectPath??Z.req.query("projectPath"));return WO(X,async(G)=>{let U=await G.askSideQuestion(N.data.question,{signal:Z.req.raw.signal});return Z.json({...U,...G.getCurrentModelId()?{modelId:G.getCurrentModelId()}:{}})})}),O.post("/:sessionId/shell",async(Z)=>{let V=Z.req.param("sessionId"),N=E(M4,await Z.req.json());if(!N.success)throw new F("Invalid user shell command");let X=await HO(V,N.data.projectPath??Z.req.query("projectPath")),G=t(X),U=y(G);return c(G,async()=>{if(tO.has(U))throw new C("A user shell command is already running in this Session");let _=await BO(X),T=_.value,L=new AbortController,j,D=new Promise((g)=>{j=g});tO.set(U,{controller:L,completion:D});try{let g=await T.executeUserShellCommand(N.data.command,{signal:L.signal});await cO(X);let OO=SO(X.currentRunId);if(g.delivery==="next_turn"&&TO(OO))OO.pendingFollowUpRequested=!0;return Z.json({executionId:g.executionId,messageId:g.messageId,record:g.record,auxiliary:g.auxiliary,...g.delivery?{delivery:g.delivery}:{},...g.queued!==void 0?{queued:g.queued}:{}})}finally{tO.delete(U),j(),_.release()}})}),O.post("/:sessionId/abort",async(Z)=>{let V=Z.req.param("sessionId"),N=await MO(V,Z.req.query("projectPath"));I(N);let X=NO.get(y(N));if(X?.currentRunId){let _=SO(X.currentRunId);if(_)s0(_),await _.completion}let G=tO.get(y(N));if(G)G.controller.abort("user-cancel"),await G.completion;let U=uO.get(y(N));if(U)U.controller.abort("user-cancel"),await U.completion;return Z.json({success:!0})}),O.get("/:sessionId/status",async(Z)=>{let V=Z.req.param("sessionId"),N=await MO(V,Z.req.query("projectPath")),X=NO.get(y(N)),G=uO.get(y(N));if(G)return Z.json({sessionId:V,projectPath:N.projectPath,reviewId:G.reviewId,status:"reviewing"});if(!X?.currentRunId)return Z.json({sessionId:V,projectPath:N.projectPath,status:"idle"});let U=SO(X.currentRunId);return Z.json({sessionId:V,projectPath:N.projectPath,runId:X.currentRunId,status:U?.status==="attention_required"?"idle":U?.status??"idle"})}),{app:O,dispatchTask:E0,retryTask:b1,updateTask:A1,getTaskDiff:c$,deliverTask:o$,recoverQueuedTasks:n$,getRuntimeResidencyStats:()=>B.getStats(),getCoordinationStats:()=>({messageSubmissions:J.getStats(),taskDeliveries:K.getStats()}),getSseConnectionStats:()=>b.stats(),shutdown:(Z="server-shutdown")=>{if(q)return q;H.close(Z);let V=b.shutdown(Z);return clearInterval(S),VO(),q=(async()=>{let N,X=async(L)=>{let j=await Promise.allSettled(L);for(let D of j)if(D.status==="rejected")N??=D.reason},G=new Set,U=()=>{for(let L of dO.values()){if(L.completion)G.add(L.completion);if(TO(L))s0(L,Z)}for(let L of tO.values())L.controller.abort(Z),G.add(L.completion);for(let L of uO.values())L.controller.abort(Z),G.add(L.completion)},_=H.waitForIdle(),T=!1;_.then(()=>{T=!0});while(!T)U(),await Promise.race([_,new Promise((L)=>setImmediate(L))]);if(await _,U(),await X([...G]),await X([...w.values()]),U(),await X([...G]),await X([V]),await X([...w.values()]),await X([B.disposeAll()]),x.clear(),await X([...Q.values()]),await X([$.disposeAll()]),await X([kO.getInstance().disconnectAll()]),w.clear(),Q.clear(),Y.clear(),NO.clear(),A0===QO)A0=void 0;if(t0===VO)t0=void 0;if(N!==void 0)throw N})(),q}}};async function l2(O,x,$,w,Q,Y={}){let{abortController:J,sessionId:K,id:M}=O,B=Y.preparedInputTurn?.messageId??H0(12),b=Y.pendingInputOnly===!0||Y.preparedInputTurn?.mode==="pending"||Y.goalContinuationOnly===!0?void 0:H0(12),S=Y.runtimeLease,q,u,v=!1,QO=!1,VO,A=t(x),c=async(m)=>{let r=m.metadata?.recoveryAttention;if(!r||!q)return!1;if(Y.preparedInputTurn)await q.finishTurn(Y.preparedInputTurn.handle,{preserveStartupRecovery:!0,outcome:{status:"aborted",cause:"failed",turnsCount:0,toolCallsCount:0,durationMs:0}}).catch(()=>{return});let UO=`Turn recovery requires attention: ${r.reason}`,DO=await q.setTaskStatus("interrupted",UO).catch(()=>{return});if(DO)sO(x,DO);else x.taskStatus="interrupted",x.taskStatusReason=UO,x.taskCompletedAt=void 0;return O.status="attention_required",I("session.status",{status:"idle"}),!0},I=(m,r)=>{k.publish(A,m,r)},GO=async()=>{let m=String(J.signal.reason||"Task run cancelled");if(x.taskIsolation){if(!S)S=await Q(x).catch(()=>{return});let r=q??S?.value;if(m==="user-cancel")await r?.discardPendingInput().catch((DO)=>{P.warn(`[SessionRoutes] Failed to discard cancelled input for ${x.id}:`,DO)});let UO=await r?.setTaskStatus("cancelled",m).catch(()=>{return});if(UO)sO(x,UO);else await cO(x).catch(()=>{return})}x.taskStatus="cancelled",x.taskStatusReason=m,x.taskCompletedAt??=new Date().toISOString()};try{if(Y.pendingResume){let z=Y.pendingResume.deadlineAt-Date.now();if(z<=0)throw J.abort(B1),new c0({taskFailure:n0("timeout"),outputStarted:!1,toolExecutionStarted:!1,toolCallsCount:0});else VO=setTimeout(()=>{J.abort(B1);let s=O.pendingPermission;if(O.pendingPermission=void 0,s?.resolve({approved:!1,reason:l1}),s)I("interaction.resolved",{requestId:s.permissionId})},z),VO.unref?.()}if(Y.taskAdmission){if(await Y.taskAdmission.ready,await O.taskAdmissionUpdate,J.signal.aborted)throw Error(String(J.signal.reason||"Task run cancelled"))}if(x.taskStatus="running",x.taskStatusReason=void 0,x.taskStartedAt=new Date().toISOString(),x.taskCompletedAt=void 0,!Y.pendingInputOnly&&!Y.goalContinuationOnly)I("message.created",{messageId:B,role:"user",content:i1($)});if(I("session.status",{status:"running"}),b)I("message.created",{messageId:b,role:"assistant",content:""});S??=await Q(x),q=S.value;let m=q,r=Boolean(Y.outputSchema??m.getPendingSteeringMessages().find((z)=>z.outputSchema)?.outputSchema);u=await D4.createWithRuntime(m,{sessionId:K,...x.taskWorktree?{toolBlacklist:["EnterWorktree","ExitWorktree"]}:{}});let UO=async(z)=>{let s=z.interactionRequestId??H0(12),HO=300000;O.status="waiting_permission";let Z1=new Promise((Y1)=>{let b1=setTimeout(()=>{P.warn(`[SessionRoutes] Permission ${s} timed out after 300000ms`),I("permission.timeout",{requestId:s}),Y1({approved:!1,reason:"timeout"})},300000);O.pendingPermission={permissionId:s,resolve:(A1)=>{clearTimeout(b1),Y1(A1)},details:z}}),aO=O.pendingPermission;if(!aO)throw Error("Permission request was not registered");let J1=f4(aO);I(J1.type,J1.properties),P.info(`[SessionRoutes] Permission request created: ${s}, runId: ${M}`);let E0=await Z1;if(P.info(`[SessionRoutes] Permission response received: ${s}, approved: ${E0.approved}`),!J.signal.aborted)O.status="running";if(O.pendingPermission===aO)O.pendingPermission=void 0;return I("interaction.resolved",{requestId:s}),E0},o={messages:await f.loadSessionModelContext(x.id,x.projectPath),userId:"web-user",sessionId:K,workspaceRoot:x.projectPath,signal:J.signal,permissionMode:w,onPermissionModeChange:async(z)=>{x.permissionMode=z,x.updatedAt=new Date,I("session.updated",{permissionMode:z})},...x.taskWorktree?{worktreeActive:!0}:{},confirmationHandler:{requestConfirmation:UO}},a=()=>{if(!b)b=H0(12),I("message.created",{messageId:b,role:"assistant",content:""});return b},PO=async(z)=>{switch(z.kind){case"content_delta":if(z.delta.length>0)v=!0;if(r)break;I("message.delta",{messageId:a(),delta:z.delta});break;case"structured_output":v=!0,I("structured.output",{messageId:a(),output:z.output,schemaDigest:z.schemaDigest});break;case"thinking_delta":if(z.delta.length>0)v=!0;I("thinking.delta",{messageId:a(),delta:z.delta});break;case"tool_start":if(QO=!0,"function"in z.toolCall){if(z.toolCall.function.name===b0)break;I("tool.start",{messageId:a(),toolName:z.toolCall.function.name,toolCallId:z.toolCall.id,arguments:z.toolCall.function.arguments,toolKind:z.toolKind})}break;case"tool_result":if(QO=!0,"function"in z.toolCall){if(z.toolCall.function.name===b0)break;I("tool.result",{messageId:a(),toolName:z.toolCall.function.name,toolCallId:z.toolCall.id,success:z.result.success,summary:z.result.metadata?.summary,output:$1(O1(x1(z.toolCall.function.name,z.result),e0)),metadata:r0(z.toolCall.function.name,z.result.metadata)})}break;case"tool_progress":if(QO=!0,"function"in z.toolCall){if(z.toolCall.function.name===b0)break;I("tool.progress",{messageId:a(),toolName:z.toolCall.function.name,toolCallId:z.toolCall.id,...z.update})}break;case"token_usage":I("token.usage",{...z.usage});break;case"turn_start":I("turn.started",{turn:z.turn,maxTurns:z.maxTurns});break;case"turn_recovery":I("turn.recovery",{assessment:z.assessment});break;case"provider_admission":I("provider.admission",{phase:z.phase,requestClass:z.requestClass,resource:z.resource,scope:z.scope,reason:z.reason,queuePosition:z.queuePosition,queueDepth:z.queueDepth,inFlight:z.inFlight,limit:z.limit,waitMs:z.waitMs,maxWaitMs:z.maxWaitMs,recoveryRemainingMs:z.recoveryRemainingMs});break;case"provider_circuit":I("provider.circuit",{phase:z.phase,reason:z.reason,statusCode:z.statusCode,retryAfterMs:z.retryAfterMs,nextProbeAt:z.nextProbeAt,openDurationMs:z.openDurationMs,sampleCount:z.sampleCount,failureCount:z.failureCount,recoveryRemainingMs:z.recoveryRemainingMs});break;case"provider_retry":I("provider.retry",{phase:z.phase,attempt:z.attempt,maxRetries:z.maxRetries,reason:z.reason,statusCode:z.statusCode,delayMs:z.delayMs,nextRetryAt:z.nextRetryAt,mode:z.mode,recoveryBudgetMs:z.recoveryBudgetMs,recoveryElapsedMs:z.recoveryElapsedMs,recoveryRemainingMs:z.recoveryRemainingMs,exhaustedBy:z.exhaustedBy});break;case"provider_stall":I("provider.stall",{phase:z.phase,stallCount:z.stallCount,durationMs:z.durationMs,warningAfterMs:z.warningAfterMs,timeoutMs:z.timeoutMs,outputStarted:z.outputStarted});break;case"action_stationarity":I("action.stationarity",{phase:z.phase,toolName:z.toolName,runLength:z.runLength,nudgeThreshold:z.nudgeThreshold,haltThreshold:z.haltThreshold,progressAware:z.progressAware});break;case"mcp_catalog_changed":I("mcp.catalog.changed",{messageId:a(),revision:z.revision,serverName:z.serverName,added:z.added,removed:z.removed,updated:z.updated});break;case"mcp_content_changed":I("mcp.content.changed",{messageId:a(),revision:z.revision,serverName:z.serverName,contentKind:z.contentKind,added:z.added,removed:z.removed,updated:z.updated});break;case"mcp_resource_updated":I("mcp.resource.updated",{messageId:a(),revision:z.revision,serverName:z.serverName,uri:z.uri});break;case"mcp_connection_changed":I("mcp.connection.changed",{messageId:a(),revision:z.revision,serverName:z.serverName,phase:z.phase,reason:z.reason,attempt:z.attempt,maxAttempts:z.maxAttempts,nextRetryAt:z.nextRetryAt,error:z.error});break;case"mcp_log":I("mcp.log",{messageId:a(),revision:z.revision,serverName:z.serverName,level:z.level,logger:z.logger,message:z.message,projectedBytes:z.projectedBytes,dataSha256:z.dataSha256,truncated:z.truncated,detailsOmitted:z.detailsOmitted,timestamp:z.timestamp,synthetic:z.synthetic});break;case"mcp_instructions_changed":I("mcp.instructions.changed",{messageId:a(),revision:z.revision,serverName:z.serverName,action:z.action,reason:z.reason,text:z.text,sourceBytes:z.sourceBytes,projectedBytes:z.projectedBytes,sha256:z.sha256,truncated:z.truncated,detailsOmitted:z.detailsOmitted});break;case"mcp_task_changed":I("mcp.task.changed",{messageId:a(),revision:z.revision,taskId:z.taskId,serverName:z.serverName,toolName:z.toolName,status:z.status,statusMessage:z.statusMessage,createdAt:z.createdAt,updatedAt:z.updatedAt,completedAt:z.completedAt,hasResult:z.hasResult,error:z.error});break;case"project_rules_loaded":I("project.rules.loaded",{messageId:a(),files:z.files,triggerPaths:z.triggerPaths,blockedWrite:z.blockedWrite});break;case"steering_applied":I("steering.applied",{runId:M,messageIds:z.messageIds,count:z.count,recovered:z.recovered,delivery:z.delivery,queued:m.getPendingSteeringCount()});break;case"follow_up_started":{if(b)I("message.complete",{messageId:b}),b=void 0;for(let s of z.messages){if(!s.recovered||s.persisted)continue;if(Y.pendingResume?.projectedInputIds.has(s.id))continue;I("message.created",{messageId:s.id,role:"user",content:i1(s.content),recovered:!0}),Y.pendingResume?.projectedInputIds.add(s.id)}I("follow_up.started",{runId:M,queued:z.queued,recovered:z.recovered}),a();break}case"goal_updated":I("goal.updated",{goal:z.goal});break;case"goal_continuation_started":I("goal.continuation.started",{goal:z.goal,continuation:z.continuation,...z.prematureStopPattern?{prematureStopPattern:z.prematureStopPattern}:{},...z.prematureStopCount!==void 0?{prematureStopCount:z.prematureStopCount}:{}}),a();break;case"compaction":I(z.phase==="start"?"compaction.started":"compaction.completed",{...z.reason?{reason:z.reason}:{},...z.strategy?{strategy:z.strategy}:{},...z.outcome?{outcome:z.outcome}:{},...z.preTokens!==void 0?{preTokens:z.preTokens}:{},...z.preTokenSource?{preTokenSource:z.preTokenSource}:{},...z.estimatedPendingTokens!==void 0?{estimatedPendingTokens:z.estimatedPendingTokens}:{},...z.postTokens!==void 0?{postTokens:z.postTokens}:{},...z.sampleAttempts!==void 0?{sampleAttempts:z.sampleAttempts}:{},...z.inputReductions!==void 0?{inputReductions:z.inputReductions}:{},...z.messagesOmitted!==void 0?{messagesOmitted:z.messagesOmitted}:{},...z.filesOmitted!==void 0?{filesOmitted:z.filesOmitted}:{},...z.imagesOmitted!==void 0?{imagesOmitted:z.imagesOmitted}:{},...z.fallbackTargetTokens!==void 0?{fallbackTargetTokens:z.fallbackTargetTokens}:{},...z.fallbackMessagesOmitted!==void 0?{fallbackMessagesOmitted:z.fallbackMessagesOmitted}:{},...z.fallbackMessagesTruncated!==void 0?{fallbackMessagesTruncated:z.fallbackMessagesTruncated}:{},...z.failureReason?{failureReason:z.failureReason}:{}});break;case"model_fallback":I("model.fallback",{});break;case"task_update":I("task.updated",{tasks:z.tasks});break;case"goal_frontier_updated":I("goal.frontier.updated",{goalId:z.goal.goalId,goalStatus:z.goal.status,frontier:z.frontier,stall:z.goal.frontierStall});break;default:break}},BO=(z)=>{let s=z.metadata?.toolCallsCount;return new c0({taskFailure:V0(z.error?.details??z.error?.message??"Agent run failed"),outputStarted:v,toolExecutionStarted:QO,toolCallsCount:typeof s==="number"&&Number.isInteger(s)?s:-1})},WO=await p1(u.chatStream($,o,{stream:!0,pendingInputOnly:Y.pendingInputOnly,preparedInputTurn:Y.preparedInputTurn,goalContinuationOnly:Y.goalContinuationOnly,outputSchema:Y.outputSchema,taskAdmission:Y.taskAdmission}),PO);if(await c(WO))return;if(!WO.success)throw BO(WO);for(let z=0;z<20;z++){let s=O.pendingFollowUpRequested===!0;if(O.pendingFollowUpRequested=!1,m.getPendingSteeringCount()===0){if(!s)break;continue}if(J.signal.aborted)break;if(WO=await p1(u.chatStream("",o,{stream:!0,pendingInputOnly:!0,taskAdmission:Y.taskAdmission}),PO),await c(WO))return;if(!WO.success)throw BO(WO)}if(await cO(x),Y.pendingResume&&J.signal.aborted&&J.signal.reason===B1)throw new c0({taskFailure:n0("timeout"),outputStarted:v,toolExecutionStarted:QO,toolCallsCount:Number.isInteger(WO.metadata?.toolCallsCount)?WO.metadata?.toolCallsCount??-1:-1});if(J.signal.aborted||O.status==="cancelled"){await GO(),I("session.status",{status:"idle"});return}if(Y.pendingResume)Y.onPendingResumeSuccess?.(Y.pendingResume);if(b)I("message.complete",{messageId:b});I("thinking.completed",{}),O.status="completed",x.taskStatus="completed",x.taskCompletedAt??=new Date().toISOString(),I("session.completed",{runId:M,outputTruncated:WO.metadata?.outputTruncated??!1}),I("session.status",{status:"idle"})}catch(m){if(q&&Y.preparedInputTurn)await(q.getTurnRecoveryAssessment().state==="requires_attention"?q.finishTurn(Y.preparedInputTurn.handle,{preserveStartupRecovery:!0}):q.finishTurn(Y.preparedInputTurn.handle)).catch(()=>{return});let r=Y.pendingResume!==void 0&&J.signal.aborted&&J.signal.reason===B1;if(J.signal.aborted&&!r||O.status==="cancelled"){if(Y.pendingResume)Y.onPendingResumeCancelled?.(Y.pendingResume);s0(O,"runtime-abort"),await GO(),I("session.status",{status:"idle"});return}let UO=m instanceof c0?m.evidence:r?{taskFailure:n0("timeout"),outputStarted:v,toolExecutionStarted:QO,toolCallsCount:-1}:Y.pendingResume?{taskFailure:V0(m),outputStarted:!0,toolExecutionStarted:!0,toolCallsCount:-1}:void 0,DO=Y.pendingResume!==void 0&&UO!==void 0&&Y.onPendingResumeFailure?.(Y.pendingResume,UO,r||(q?.getPendingSteeringCount()??0)>0,r)===!0;if(O.status="failed",DO){let a=await q?.setTaskStatus("running").catch(()=>{return});if(a)sO(x,a);x.taskStatus="running",x.taskStatusReason=void 0,x.taskFailure=void 0,x.taskCompletedAt=void 0,I("session.status",{status:"running"});return}await cO(x).catch(()=>{return}),P.error("[SessionRoutes] Agent execution error:",m),x.taskStatus="failed",x.taskCompletedAt??=new Date().toISOString();let o=UO?.taskFailure??V0(m);if(!x.taskFailure){let a=q?await q.setTaskStatus("failed",m).catch(()=>{return}):await f.updateSessionMetadata(x.id,x.projectPath,{taskStatus:"failed",taskStatusReason:o.message,taskFailure:o,taskCompletedAt:x.taskCompletedAt,taskOwnerPid:null,taskQueuePosition:null,taskQueueDepth:null}).catch(()=>{return});if(a)sO(x,a)}x.taskStatusReason??=o.message,x.taskFailure??=o,I("session.error",{error:x.taskFailure.message,taskFailure:x.taskFailure}),I("session.status",{status:"error"})}finally{if(VO)clearTimeout(VO);if(Y.taskAdmission?.release(),Y.taskAdmission){let m=O0.getStats();I("task.status",{taskStatus:x.taskStatus,...x.taskStatusReason?{taskStatusReason:x.taskStatusReason}:{},...x.taskFailure?{taskFailure:x.taskFailure}:{},...x.taskStartedAt?{taskStartedAt:x.taskStartedAt}:{},...x.taskCompletedAt?{taskCompletedAt:x.taskCompletedAt}:{},...x.taskDiffStat?{taskDiffStat:x.taskDiffStat}:{},taskQueueDepth:m.queued,taskConcurrencyLimit:m.maxConcurrent,taskInFlight:m.inFlight,taskAdmissionPaused:m.paused,updatedAt:new Date().toISOString()})}if(await u?.destroy().catch(()=>{return}),S?.release(),O.disposeRuntimeOnSettle&&Y.disposeRuntime)await Y.disposeRuntime(x,q).catch((m)=>{P.warn(`[SessionRoutes] Failed to dispose terminal task runtime ${x.id}:`,m)});h2(O)}}async function E4(O,x,$){P.info(`[SessionRoutes] Looking for permission ${x} in session ${O.sessionId}`),P.info(`[SessionRoutes] Active runs: ${dO.size}`);for(let[Y,J]of dO.entries())if(P.info(`[SessionRoutes] Checking run ${Y}: sessionId=${J.sessionId}, projectPath=${J.projectPath}, pendingPermission=${J.pendingPermission?.permissionId}`),J.sessionId===O.sessionId&&J.projectPath===O.projectPath&&J.pendingPermission?.permissionId===x){if(J.pendingPermission.details.interactionRequestId)await G0.respond(O.projectPath,O.sessionId,x,$);return J.pendingPermission.resolve($),P.info(`[SessionRoutes] Permission ${x} responded, runId: ${J.id}`),!0}let w=await G0.findPending(O.projectPath,O.sessionId);if(!w||w.request.requestId!==x)return P.error(`[SessionRoutes] Permission not found: ${x}`),!1;await G0.respondAndRecover(O.projectPath,O.sessionId,x,$);let Q=NO.get(y(O));if(!Q){let Y=await f.findSessionMetadata(O.sessionId,O.projectPath);if(!Y)return!1;let J=await f.findSessionTaskWorktree(O.sessionId,O.projectPath);Q=o0(Y,J),NO.set(y(O),Q)}else await cO(Q);if(k.publish(O,"interaction.resolved",{requestId:x}),A0)A0(Q).catch((Y)=>{P.error(`[SessionRoutes] Failed to resume recovered interaction ${x}:`,Y)});return!0}var a1=$O("Service"),a2=W.Object({approved:W.Boolean(),remember:W.Optional(W.Boolean()),scope:W.Optional(JO(["once","session","project"])),targetMode:W.Optional(JO(["default","autoEdit","plan","yolo"])),feedback:W.Optional(W.String({maxLength:4000})),answers:W.Optional(W.Record(W.String({maxLength:80}),W.Union([W.String({maxLength:4000}),W.Array(W.String({maxLength:1000}),{maxItems:4})]),{maxProperties:4})),elicitation:W.Optional(W.Object({action:JO(["accept","decline","cancel"]),content:W.Optional(W.Record(W.String(),W.Union([W.String({maxLength:4000}),W.Number(),W.Boolean(),W.Array(W.String({maxLength:1000}),{maxItems:100})]),{maxProperties:32}))}))}),y4=()=>{let O=new c2;return O.post("/:permissionId",async(x)=>{let $=x.req.param("permissionId"),w=x.req.query("sessionId"),Q=x.req.query("projectPath");a1.info(`[PermissionRoutes] Received permission response: permissionId=${$}, sessionId=${w}`);try{let Y=await x.req.json(),J=E(a2,Y);if(!J.success)throw new F("Invalid permission response format");let{approved:K,remember:M,scope:B,targetMode:H,feedback:b,answers:S,elicitation:q}=J.data;if(!w)throw new F("sessionId query parameter is required");let u=await MO(w,Q);if(!await E4(u,$,{approved:K,reason:b,scope:B,targetMode:H,feedback:b,answers:S,elicitation:q}))throw new h("Permission request",$);return a1.info(`[PermissionRoutes] Permission ${$} ${K?"approved":"denied"}`),x.json({success:!0,approved:K,remember:M})}catch(Y){if(a1.error("[PermissionRoutes] Failed to respond to permission:",Y),Y instanceof F||Y instanceof EO||Y instanceof h||Y instanceof ZO)throw Y;throw Y}}),O};import P4 from"node:path";import{Hono as o2}from"hono";var n2=W.Object({projectPath:W.String({minLength:1}),enabled:W.Boolean(),scope:W.Optional(JO(["local","project","global"]))}),t2=W.Object({projectPath:W.String({minLength:1})}),s2=W.Object({projectPath:W.String({minLength:1}),source:W.String({minLength:1}),trust:W.Literal(!0),ref:W.Optional(W.String({minLength:1}))}),r2=W.Object({projectPath:W.String({minLength:1}),trust:W.Literal(!0)}),e2=W.Object({projectPath:W.String({minLength:1}),confirm:W.Literal(!0)}),Ow=W.Object({projectPath:W.String({minLength:1}),source:W.String({minLength:1}),ref:W.Optional(W.String({minLength:1}))}),m4=W.Object({projectPath:W.String({minLength:1}),confirm:W.Optional(W.Literal(!0))}),xw=W.Object({projectPath:W.String({minLength:1}),scope:W.Optional(JO(["local","project","global"])),policy:W.Object({restrictToAllowedSources:W.Boolean(),requireGitCommitSha:W.Boolean(),allowedGitHosts:W.Array(W.String()),allowedMarketplaces:W.Array(W.String()),allowedLocalRoots:W.Array(W.String())})});function mO(O){if(!O||!P4.isAbsolute(O))throw new F("projectPath must be absolute");return P4.resolve(O)}async function h4(O){let[x,$]=await Promise.all([gO(O),u0.getInstance().loadWorkspacePluginSettingsResolution(O)]);return x.plugins.getAll().map((w)=>({name:w.manifest.name,description:w.manifest.description,version:w.manifest.version,source:w.source,enabled:w.status==="active",status:w.status,commands:w.commands.length,skills:w.skills.length,agents:w.agents.length,hooks:w.hooks?Object.values(w.hooks).reduce((Q,Y)=>Q+(Array.isArray(Y)?Y.length:0),0):0,mcpServers:Object.keys(w.mcpServers??{}).length,configurable:w.source!=="cli",managed:w.installation!==void 0,marketplace:w.installation?.source.type==="marketplace"?w.installation.source.marketplace:void 0,revision:w.installation?.revision,installedAt:w.installation?.installedAt,updatedAt:w.installation?.updatedAt,compatibilityIssues:w.compatibilityIssues??[],effectiveScope:w.source==="cli"?"invocation":$.settings[w.manifest.name]?.effectiveScope??"default",settingLayers:w.source==="cli"?{invocation:!0}:$.settings[w.manifest.name]?.layers??{}}))}async function $w(){let O=g4(),[x,$]=await Promise.all([O.listCatalogs(),O.listInstallationRecords()]),w=new Map($.map((Q)=>[Q.name,Q]));return x.map(({marketplace:Q,manifest:Y})=>({name:Q.name,description:Y.description??Y.metadata?.description??"",sourceType:Q.source.type,revision:Q.revision,updatedAt:Q.updatedAt,plugins:Y.plugins.map((J)=>{let K=w.get(J.name);return{name:J.name,description:J.description??"",version:J.version,category:J.category,tags:J.tags??[],installed:K!==void 0,installedVersion:K?.version}})}))}function j0(O,x){if(!O.success)throw new F(O.error??x)}var n4=()=>{let O=new o2;return O.get("/",async(x)=>{let $=mO(x.req.query("projectPath"));return x.json(await h4($))}),O.post("/refresh",async(x)=>{let $=E(t2,await x.req.json());if(!$.success)throw new F("Invalid plugin refresh request");let w=mO($.data.projectPath),Q=await u4(w);return x.json({plugins:await h4(w),errors:Q.discovery.errors.map((Y)=>({code:Y.code??"LOAD_ERROR",error:Y.error}))})}),O.get("/catalog",async(x)=>{return mO(x.req.query("projectPath")),x.json(await $w())}),O.get("/policy",async(x)=>{let $=mO(x.req.query("projectPath")),w=await u0.getInstance().loadWorkspacePluginSourcePolicy($);return x.json({policy:w,environmentRequiresSha:process.env.BLADE_PLUGIN_REQUIRE_SHA==="1"||process.env.BLADE_PLUGIN_REQUIRE_SHA==="true"})}),O.post("/policy",async(x)=>{let $=E(xw,await x.req.json());if(!$.success)throw new F("Invalid plugin source policy request");let w=mO($.data.projectPath),Q=await d4(w,$.data.policy,$.data.scope??"global");return x.json({policy:Q})}),O.post("/install",async(x)=>{let $=E(s2,await x.req.json());if(!$.success)throw new F("Invalid plugin install request; explicit source trust is required");let w=mO($.data.projectPath),{result:Q}=await v4(w,$.data.source,{trusted:$.data.trust,ref:$.data.ref});return j0(Q,"Plugin installation failed"),x.json({name:Q.pluginName,version:Q.manifest?.version,revision:Q.installation?.revision,changed:Q.changed,installedDependencies:Q.installedDependencies??[]})}),O.post("/marketplaces",async(x)=>{let $=E(Ow,await x.req.json());if(!$.success)throw new F("Invalid marketplace add request");let w=mO($.data.projectPath),Q=await c4(w,$.data.source,$.data.ref);return j0(Q,"Marketplace installation failed"),x.json({name:Q.marketplace?.name,plugins:Q.manifest?.plugins.length??0,revision:Q.marketplace?.revision,changed:Q.changed})}),O.post("/marketplaces/:name/refresh",async(x)=>{let $=E(m4,await x.req.json());if(!$.success)throw new F("Invalid marketplace refresh request");let w=await a4(mO($.data.projectPath),x.req.param("name"));return j0(w,"Marketplace refresh failed"),x.json({name:w.marketplace?.name,plugins:w.manifest?.plugins.length??0,revision:w.marketplace?.revision,changed:w.changed})}),O.post("/marketplaces/:name/remove",async(x)=>{let $=E(m4,await x.req.json());if(!$.success||$.data.confirm!==!0)throw new F("Invalid marketplace removal request; explicit confirmation is required");mO($.data.projectPath);let w=await o4(x.req.param("name"),!0);return j0(w,"Marketplace removal failed"),x.json({name:w.marketplace?.name,removed:!0})}),O.post("/:name/update",async(x)=>{let $=E(r2,await x.req.json());if(!$.success)throw new F("Invalid plugin update request; explicit source trust is required");let w=mO($.data.projectPath),{result:Q}=await i4(w,x.req.param("name"),{trusted:$.data.trust});return j0(Q,"Plugin update failed"),x.json({name:Q.pluginName,version:Q.manifest?.version,revision:Q.installation?.revision,changed:Q.changed,updatedDependencies:Q.updatedDependencies??[]})}),O.post("/:name/uninstall",async(x)=>{let $=E(e2,await x.req.json());if(!$.success)throw new F("Invalid plugin uninstall request; explicit confirmation is required");let w=mO($.data.projectPath),{result:Q}=await l4(w,x.req.param("name"),$.data.confirm);return j0(Q,"Plugin uninstall failed"),x.json({name:Q.pluginName,removed:!0})}),O.post("/:name/state",async(x)=>{let $=E(n2,await x.req.json());if(!$.success)throw new F("Invalid plugin state request");let w=mO($.data.projectPath),Q=x.req.param("name"),J=(await gO(w)).plugins.get(Q);if(!J)throw new h("Plugin",Q);if(J.source==="cli")throw new F(`Plugin "${Q}" was loaded with --plugin-dir and is invocation-scoped`);let K=await p4(w,Q,$.data.enabled,$.data.scope??"local");return x.json(K)}),O};import{Hono as Yw}from"hono";import{execFile as ww}from"node:child_process";import Qw from"node:path";var t1="__BLADE_DIRECTORY_PICKER_CANCELLED__",Zw=900000;function Jw(O,x){return new Promise(($)=>{ww(O,[...x],{timeout:Zw,maxBuffer:65536,windowsHide:!0},(w,Q,Y)=>{let J=w?.code;$({stdout:Q,stderr:Y,exitCode:typeof J==="number"?J:w?1:0,...typeof J==="string"?{errorCode:J}:{}})})})}function o1(O){let x=O.replace(/[\r\n]+$/,"");if(!x||x===t1)return{cancelled:!0};if(!Qw.isAbsolute(x))throw Error("The folder picker returned an invalid path");return{cancelled:!1,path:x}}function n1(O){return O.exitCode!==0||Boolean(O.errorCode)}class t4{platform;runCommand;activeSelection=null;constructor(O={}){this.platform=O.platform??process.platform,this.runCommand=O.runCommand??Jw}pick(){if(this.activeSelection)return this.activeSelection;let O=this.pickForPlatform().finally(()=>{this.activeSelection=null});return this.activeSelection=O,O}async pickForPlatform(){switch(this.platform){case"darwin":return this.pickOnMac();case"win32":return this.pickOnWindows();case"linux":return this.pickOnLinux();default:throw Error("Native folder selection is unavailable on this system")}}async pickOnMac(){let O=["try",'set selectedFolder to choose folder with prompt "Choose a project folder"',"return POSIX path of selectedFolder","on error number -128",`return "${t1}"`,"end try"].join(`
|
|
8
|
-
`),x=await this.runCommand("osascript",["-e",O]);if(n1(x))throw Error("Unable to open the macOS folder picker");return o1(x.stdout)}async pickOnWindows(){let O=["Add-Type -AssemblyName System.Windows.Forms","$dialog = New-Object System.Windows.Forms.FolderBrowserDialog",'$dialog.Description = "Choose a project folder"',"$dialog.ShowNewFolderButton = $true","if ($dialog.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK) {"," [Console]::Out.Write($dialog.SelectedPath)","} else {",` [Console]::Out.Write("${t1}")`,"}"].join("; "),x=await this.runCommand("powershell.exe",["-NoProfile","-STA","-Command",O]);if(n1(x))throw Error("Unable to open the Windows folder picker");return o1(x.stdout)}async pickOnLinux(){let O=[{command:"zenity",args:["--file-selection","--directory","--title=Choose a project folder"]},{command:"kdialog",args:["--getexistingdirectory",".","--title","Choose a project folder"]}];for(let x of O){let $=await this.runCommand(x.command,x.args);if($.errorCode==="ENOENT")continue;if($.exitCode===1&&!$.stdout.trim()&&!$.stderr.trim())return{cancelled:!0};if(n1($))throw Error("Unable to open the Linux folder picker");return o1($.stdout)}throw Error("Install zenity or kdialog to use native folder selection")}}var s4=new t4;var Nw=W.Object({path:W.String({minLength:1})});function Ww(O){if(!O)return!1;if(O==="tauri://localhost"||O==="http://tauri.localhost")return!0;try{let x=new URL(O).hostname;return x==="localhost"||x==="127.0.0.1"||x==="::1"||x==="[::1]"}catch{return!1}}var r4=(O={})=>{let x=new Yw,$=O.pickDirectory??(()=>s4.pick()),w=O.allowDirectoryPickerRequest??Ww;return x.get("/",async(Q)=>{return Q.json(await L1.list(e()))}),x.post("/",async(Q)=>{let Y;try{Y=await Q.req.json()}catch{throw new F("A valid JSON body is required")}let J=E(Nw,Y);if(!J.success)throw new F("A project path is required");try{let K=await L1.bind(J.data.path,e());return Q.json(K,201)}catch(K){throw new F(K instanceof Error?K.message:"Failed to bind project")}}),x.post("/pick",async(Q)=>{if(!w(Q.req.header("Origin")))throw new ZO("LOCAL_ACCESS_REQUIRED","Folder selection is only available from this machine",403);try{return Q.json(await $())}catch(Y){throw new F(Y instanceof Error?Y.message:"Failed to select a folder")}}),x.delete("/",async(Q)=>{let Y=Q.req.query("path");if(!Y)throw new F("A project path is required");try{let J=await L1.unbind(Y);return Q.json({success:!0,removed:J})}catch(J){throw new F(J instanceof Error?J.message:"Failed to unbind project")}}),x};import{Hono as Xw}from"hono";var e4=$O("Service"),w$=()=>{let O=new Xw;return O.get("/",async(x)=>{try{let $=await x$();return x.json($)}catch($){return e4.error("[ProviderRoutes] Failed to list providers:",$),x.json([])}}),O.get("/:provider/models",async(x)=>{let $=x.req.param("provider");try{let w=await $$($);return x.json(w)}catch(w){return e4.error("[ProviderRoutes] Failed to list models:",w),x.json([])}}),O.put("/:provider/credential",async(x)=>{let $=x.req.param("provider"),w=await x.req.json();if(!w.apiKey?.trim())throw new F("apiKey is required");return await N0().setApiKey($,w.apiKey.trim()),x.json({success:!0})}),O.delete("/:provider/credential",async(x)=>{return await N0().clearCredential(x.req.param("provider")),x.json({success:!0})}),O.put("/:provider",async(x)=>{let $=x.req.param("provider"),w=KO(),Q=w?.modelProviders[$];if(!w||!Q)throw new h("Model provider",$);let Y=await x.req.json();if(!Y.name||!Y.baseUrl||!Y.wireApi)throw new F("name, baseUrl and wireApi are required");let J="apiKeyEnv"in Y?Y.apiKeyEnv?.trim():Q.apiKeyEnv,K={name:Y.name,baseUrl:Y.baseUrl,wireApi:Y.wireApi,...J?{apiKeyEnv:J}:{}},M=N0(),B=Y.apiKey?.trim()?await M.credentials.read($):void 0;if(Y.apiKey?.trim())await M.setApiKey($,Y.apiKey.trim());try{return await yO().updateModelProvider($,K),x.json({success:!0})}catch(H){if(Y.apiKey?.trim())if(B)await M.credentials.modify($,async()=>B);else await M.credentials.delete($);if(H instanceof Error&&(H.message.includes("modelProviders.")||H.message.includes("built-in provider")))throw new F(H.message);throw H}}),O.delete("/:provider",async(x)=>{let $=x.req.param("provider");if(!KO()?.modelProviders[$])throw new h("Model provider",$);let Q=x.req.query("removeModels");if(Q!==void 0&&Q!=="true"&&Q!=="false")throw new F("removeModels must be true or false");try{let Y=await yO().removeModelProvider($,{removeModels:Q==="true"});return x.json({success:!0,...Y})}catch(Y){if(Y instanceof Error&&(Y.message.includes("still referenced")||Y.message.includes("owns the only model")))throw new C(Y.message);throw Y}}),O.post("/:provider/probe",async(x)=>{let $=x.req.param("provider"),w=KO();if(!w?.modelProviders[$])throw new h("Model provider",$);let Q=await x.req.json().catch(()=>({})),Y=w.models.filter((K)=>K.provider===$),J=Q.modelId?Y.find((K)=>K.id===Q.modelId):Y[0];if(!J)throw new F(Q.modelId?"modelId does not reference this provider":"Model provider has no configured model to probe");return x.json(await O$(J,w))}),O};import{Hono as zw}from"hono";var Vw=$O("Service"),Y$=(O,x)=>{let $=new zw;return $.onError((w,Q)=>{if(w instanceof ZO)return Q.json(w.toObject(),w.statusCode);return Vw.error("[ScheduleRoutes] Unhandled route error:",w),Q.json(new wO("Schedule request failed").toObject(),500)}),$.get("/",async(w)=>{let Q=await O.list();return w.json(J$.parse({schedules:Q}))}),$.post("/",async(w)=>{let Q;try{Q=await w.req.json()}catch{throw new F("Invalid request body")}let Y=E(Q$,Q);if(!Y.success)throw new F("Invalid schedule request");let J=Y.data.projectPath||w.get("directory")||e();try{let K=await O.create({...Y.data,projectPath:J});return w.json(B0.parse(K),201)}catch(K){throw new F(K instanceof Error?K.message:"Failed to create schedule")}}),$.get("/:id",async(w)=>{let Q=await O.get(w.req.param("id"));if(!Q)throw new h("Schedule not found");return w.json(B0.parse(Q))}),$.patch("/:id",async(w)=>{let Q;try{Q=await w.req.json()}catch{throw new F("Invalid request body")}let Y=E(Z$,Q);if(!Y.success)throw new F("Invalid schedule update");let{modelId:J,reasoningEffort:K,serviceTier:M,responseVerbosity:B,communicationStyle:H,isolation:b,permissionMode:S,...q}=Y.data,u={...J!==void 0?{modelId:J}:{},...K!==void 0?{reasoningEffort:K}:{},...M!==void 0?{serviceTier:M}:{},...B!==void 0?{responseVerbosity:B}:{},...H!==void 0?{communicationStyle:H}:{},...b!==void 0?{isolation:b}:{},...S!==void 0?{permissionMode:S}:{}};try{let v=await O.update(w.req.param("id"),{...q,...Object.keys(u).length>0?{dispatch:u}:{}});if(!v)throw new h("Schedule not found");return w.json(B0.parse(v))}catch(v){if(v instanceof ZO)throw v;throw new F(v instanceof Error?v.message:"Failed to update schedule")}}),$.delete("/:id",async(w)=>{if(!await O.remove(w.req.param("id")))throw new h("Schedule not found");return w.json({ok:!0})}),$.post("/:id/enable",async(w)=>{let Q=await O.setEnabled(w.req.param("id"),!0);if(!Q)throw new h("Schedule not found");return w.json(B0.parse(Q))}),$.post("/:id/disable",async(w)=>{let Q=await O.setEnabled(w.req.param("id"),!1);if(!Q)throw new h("Schedule not found");return w.json(B0.parse(Q))}),$.post("/:id/run",async(w)=>{let Q=await O.get(w.req.param("id"));if(!Q)throw new h("Schedule not found");if(!x)throw new wO("Scheduler is not running in this process");await x.fire(Q,new Date,{manual:!0});let Y=await O.get(Q.id);return w.json(B0.parse(Y??Q),202)}),$};import*as Q0 from"node:fs/promises";import{homedir as X$}from"node:os";import*as hO from"node:path";import{Hono as Gw}from"hono";var K0=$O("Service"),N$=hO.join(X$(),".blade","skills"),s1=hO.join(X$(),".blade","skills-config.json");async function z$(){try{let O=await Q0.readFile(s1,"utf-8");return JSON.parse(O)}catch{return{disabled:[]}}}async function Bw(O){await Q0.mkdir(hO.dirname(s1),{recursive:!0}),await Q0.writeFile(s1,JSON.stringify(O,null,2))}async function Kw(O,x){let $=await z$();if(x)$.disabled=$.disabled.filter((w)=>w!==O);else if(!$.disabled.includes(O))$.disabled.push(O);await Bw($)}var w0=null,Uw=300000,_w=6;async function Fw(){if(w0&&Date.now()-w0.timestamp<Uw)return w0.data;try{let O=await fetch("https://api.github.com/repos/anthropics/skills/contents/skills",{headers:{Accept:"application/vnd.github.v3+json","User-Agent":"Blade-Skills-Catalog"}});if(!O.ok){if(K0.warn(`GitHub API returned ${O.status}`),w0)return w0.data;throw Error(`GitHub skills catalog returned ${O.status}`)}let $=(await O.json()).filter((J)=>J.type==="dir"),w=Array($.length),Q=0,Y=Math.min(_w,$.length);return await Promise.all(Array.from({length:Y},async()=>{while(Q<$.length){let J=Q++,K=$[J];if(!K)continue;let M=`Official ${K.name} skill`;try{let B=await fetch(`https://raw.githubusercontent.com/anthropics/skills/main/skills/${K.name}/SKILL.md`,{headers:{"User-Agent":"Blade-Skills-Catalog"}});if(B.ok){let b=(await B.text()).match(/^#[^\n]*\n+([^\n#]+)/);if(b)M=b[1].trim().slice(0,100)}}catch{}w[J]={name:K.name,description:M,tag:"Official",author:"Anthropic"}}})),w0={data:w,timestamp:Date.now()},w}catch(O){if(K0.warn("Failed to fetch skills catalog from GitHub:",O),w0)return w0.data;throw O}}var V$=()=>{let O=new Gw;return O.get("/",async(x)=>{try{let $=x.get("directory")||e(),Q=(await gO($)).skills.getAll(),Y=await z$(),J=Q.map((K)=>({id:K.name,name:K.name,enabled:!Y.disabled.includes(K.name),description:K.description||"",version:K.version||"1.0.0",provider:"Local",location:K.source==="builtin"?"Built-in":K.basePath,removable:K.source==="user"&&hO.dirname(hO.resolve(K.basePath))===hO.resolve(N$),capabilities:["prompts"],allowedTools:K.allowedTools||[]}));return x.json(J)}catch($){return K0.error("[SkillsRoutes] Failed to get skills:",$),x.json({error:$ instanceof Error?$.message:"Failed to get skills"},500)}}),O.post("/:name/toggle",async(x)=>{try{let $=x.req.param("name"),w=await x.req.json();return await Kw($,w.enabled),x.json({success:!0,enabled:w.enabled})}catch($){return K0.error("[SkillsRoutes] Failed to toggle skill:",$),x.json({success:!1,error:$.message},500)}}),O.delete("/:name",async(x)=>{try{let $=x.req.param("name"),w=x.get("directory")||e();return i0(w,async(Q)=>{let Y=Q.skills,J=Y.get($);if(!J)return x.json({success:!1,error:"Skill not found"},404);let K=hO.resolve(J.basePath),M=hO.resolve(N$);if(J.source!=="user"||hO.dirname(K)!==M)return x.json({success:!1,error:"Only Blade user skills can be uninstalled"},400);return await Q0.rm(K,{recursive:!0,force:!0}),await Y.refresh(),v0(w),await d0(w),x.json({success:!0})})}catch($){return K0.error("[SkillsRoutes] Failed to uninstall skill:",$),x.json({success:!1,error:$.message},500)}}),O.post("/install",async(x)=>{try{let $=await x.req.json(),w=W$(),Q=x.get("directory")||e();return i0(Q,async(Y)=>{let J=Y.skills,K=!1;if($.source==="catalog"&&$.name){if(K=await w.installOfficialSkill($.name),!K)return x.json({success:!1,error:"Failed to install skill from catalog"},500)}else if($.source==="repo"&&$.url){if(K=await w.installFromRepo($.url,$.name),!K)return x.json({success:!1,error:"Failed to install skill from repository. Make sure the repo contains a SKILL.md file."},500)}else if($.source==="local"&&$.path){if(K=await w.installFromLocal($.path,$.name),!K)return x.json({success:!1,error:"Failed to install skill from local path. Make sure the path exists and contains a SKILL.md file."},500)}else return x.json({success:!1,error:"Invalid install parameters. Required: source with corresponding url/path/name"},400);return await J.refresh(),v0(Q),await d0(Q),x.json({success:!0})})}catch($){return K0.error("[SkillsRoutes] Failed to install skill:",$),x.json({success:!1,error:$.message},500)}}),O.get("/catalog",async(x)=>{try{let $=await Fw();return x.json($)}catch($){return K0.error("[SkillsRoutes] Failed to get catalog:",$),x.json({error:$ instanceof Error?$.message:"Failed to get skills catalog"},502)}}),O};import{execSync as Lw}from"node:child_process";import{readdir as Dw}from"node:fs/promises";import D1 from"node:path";import Hw from"fast-glob";import{Hono as bw}from"hono";var w1=$O("Service"),Aw=(O)=>{try{return Lw("git rev-parse --abbrev-ref HEAD",{cwd:O,encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim()||null}catch{return null}},jw=[...M0.map((O)=>`${O}/**`),...M0,...M0.map((O)=>`**/${O}/**`),...M0.map((O)=>`**/${O}`),...r1.map((O)=>`**/${O}`)],Mw=new Set(["/theme","/model","/permissions","/mcp","/skills","/exit","/resume","/ide","/login","/logout"]),K$=()=>{let O=new bw;return O.get("/commands",async(x)=>{try{let $=x.req.query("q")||"",w=x.get("directory")||e(),Q=await gO(w),Y=B$($,w,Q).filter((J)=>!Mw.has(J.command));return x.json(Y)}catch($){return w1.error("[SuggestionsRoutes] Failed to get command suggestions:",$),x.json([])}}),O.get("/files",async(x)=>{try{let $=x.req.query("q")||"",w=x.get("directory")||e(),Q=Math.min(Number(x.req.query("limit"))||100,1000),Y=x.req.query("type")==="file",K=(await Hw("**/*",{cwd:w,dot:!1,followSymbolicLinks:!1,onlyFiles:Y,markDirectories:!0,unique:!0,ignore:jw})).map((H)=>H.replace(/\\/g,"/"));if(!$)return x.json(K.slice(0,Q));let M=$.toLowerCase(),B=K.filter((H)=>H.toLowerCase().includes(M)).slice(0,Q);return x.json(B)}catch($){return w1.error("[SuggestionsRoutes] Failed to get file suggestions:",$),x.json([])}}),O.get("/files/tree",async(x)=>{try{let $=x.get("directory")||e(),w=x.req.query("path")||"",Q=w?D1.join($,w):$,J=(await Dw(Q,{withFileTypes:!0})).map((B)=>({name:B.name,path:w?`${w}/${B.name}`:B.name,type:B.isDirectory()?"dir":"file"}));J.sort((B,H)=>{if(B.type!==H.type)return B.type==="dir"?-1:1;return B.name.localeCompare(H.name)});let K=new Set(M0),M=J.filter((B)=>{let H=B.name;if(H.startsWith("."))return!1;if(K.has(H))return!1;for(let b of r1)if(H.match(new RegExp(b.replace("*",".*"))))return!1;return!0});return x.json(M)}catch($){return w1.error("[SuggestionsRoutes] Failed to get file tree:",$),x.json([])}}),O.get("/files/content",async(x)=>{try{let $=x.req.query("path");if(!$)return x.json({error:"Missing file path"},400);let w=x.get("directory")||e(),Q=D1.resolve(w,$),Y=D1.relative(w,Q);if(Y.startsWith("..")||D1.isAbsolute(Y))return x.json({error:"Invalid file path"},400);let J=G$(),K=await J.stat(Q);if(!K?.isFile)return x.json({error:"File not found"},404);let M=200000,B=await J.readTextFile(Q),H=B.length>M;return x.json({path:$,content:H?B.slice(0,M):B,truncated:H,size:K.size})}catch($){return w1.error("[SuggestionsRoutes] Failed to get file content:",$),x.json({error:"Failed to read file"},500)}}),O.get("/git-info",async(x)=>{try{let $=x.get("directory")||e(),w=Aw($);return x.json({branch:w})}catch($){return w1.error("[SuggestionsRoutes] Failed to get git info:",$),x.json({branch:null})}}),O};import{Hono as Tw}from"hono";var T0=$O("Service"),D$=(O)=>{let x=new Tw;return x.onError(($,w)=>{if($ instanceof ZO)return w.json($.toObject(),$.statusCode);return T0.error("[TaskRoutes] Unhandled route error:",$),w.json(new wO("Failed to dispatch task").toObject(),500)}),x.post("/",async($)=>{let w;try{w=await $.req.json()}catch{throw new F("Invalid request body")}let Q=E(_$,w);if(!Q.success)throw new F("Invalid task request");if((Q.data.attachments??[]).reduce((J,K)=>J+(typeof K.content==="string"?Buffer.byteLength(K.content):0),0)>_1)throw new F("Task attachments exceed the 5 MiB limit");if(Q.data.taskDueAt&&!Number.isFinite(Date.parse(Q.data.taskDueAt)))throw new F("Invalid task due date");try{let J=await O.dispatchTask({prompt:Q.data.prompt,title:Q.data.title,taskPriority:Q.data.taskPriority,taskKind:Q.data.taskKind,taskDueAt:Q.data.taskDueAt?new Date(Q.data.taskDueAt).toISOString():void 0,sourceProjectPath:Q.data.projectPath||$.get("directory")||e(),isolation:Q.data.isolation,permissionMode:Q.data.permissionMode,modelId:Q.data.modelId,reasoningEffort:Q.data.reasoningEffort,serviceTier:Q.data.serviceTier,responseVerbosity:Q.data.responseVerbosity,communicationStyle:Q.data.communicationStyle,attachments:Q.data.attachments,outputSchema:Q.data.outputSchema});return $.json(Ox.parse(J),202)}catch(J){if(J instanceof F||J instanceof C||J instanceof CO||J instanceof nO)throw J;throw T0.error("[TaskRoutes] Failed to dispatch task:",J),new wO("Failed to dispatch task")}}),x.patch("/:sessionId",async($)=>{let w;try{w=await $.req.json()}catch{throw new F("Invalid request body")}let Q=E(F$,w);if(!Q.success)throw new F("Invalid task update");if(Q.data.title===void 0&&Q.data.taskPriority===void 0&&Q.data.taskKind===void 0&&Q.data.taskDueAt===void 0)throw new F("Task update must include at least one field");if(typeof Q.data.taskDueAt==="string"&&!Number.isFinite(Date.parse(Q.data.taskDueAt)))throw new F("Invalid task due date");try{let Y=await O.updateTask($.req.param("sessionId"),{...Q.data,...typeof Q.data.taskDueAt==="string"?{taskDueAt:new Date(Q.data.taskDueAt).toISOString()}:{}},$.req.query("projectPath"));return $.json(e1.parse(Y))}catch(Y){if(Y instanceof F||Y instanceof h||Y instanceof C)throw Y;throw T0.error("[TaskRoutes] Failed to update task:",Y),new wO("Failed to update task")}}),x.post("/:sessionId/retry",async($)=>{try{let w=await O.retryTask($.req.param("sessionId"),$.req.query("projectPath"));return $.json(Ox.parse(w),202)}catch(w){if(w instanceof F||w instanceof h||w instanceof C||w instanceof CO||w instanceof nO)throw w;throw T0.error("[TaskRoutes] Failed to retry task:",w),new wO("Failed to retry task")}}),x.get("/:sessionId/diff",async($)=>{try{let w=await O.getTaskDiff($.req.param("sessionId"),$.req.query("projectPath"));return $.json(U$.parse(w))}catch(w){if(w instanceof F||w instanceof h||w instanceof C)throw w;throw T0.error("[TaskRoutes] Failed to load task diff:",w),new wO("Failed to load task diff")}}),x.post("/:sessionId/delivery",async($)=>{let w;try{w=await $.req.json()}catch{throw new F("Invalid request body")}let Q=E(L$,w);if(!Q.success)throw new F("Invalid task delivery request");try{let Y=await O.deliverTask($.req.param("sessionId"),Q.data.action,$.req.query("projectPath"));return $.json(e1.parse(Y))}catch(Y){if(Y instanceof F||Y instanceof h||Y instanceof C)throw Y;throw T0.error("[TaskRoutes] Failed to deliver task:",Y),new wO("Failed to deliver task")}}),x};import j$ from"node:path";import{Hono as Rw}from"hono";var Sw=pO(W.Object({id:W.String(),name:W.String(),subagentType:W.String(),description:W.String(),agentId:W.Optional(W.String()),status:JO(["leader","running","completed","failed","cancelled","unknown"]),result:W.Optional(W.Unknown()),stats:W.Optional(W.Unknown()),worktreePath:W.Optional(W.String())})),Iw=pO(W.Object({id:W.String(),subject:W.String(),description:W.String(),status:JO(["pending","blocked","running","completed"]),owner:W.Optional(W.String()),priority:JO(["high","medium","low"]),dependsOn:W.Array(W.String()),blocks:W.Array(W.String()),result:W.Optional(W.String()),createdAt:W.String(),startedAt:W.Optional(W.String()),completedAt:W.Optional(W.String())})),x8=pO(W.Object({name:W.String(),description:W.Optional(W.String()),status:JO(["idle","running","completed","failed","deleted"]),leadAgentId:W.String(),leadSessionId:W.Optional(W.String()),workspaceRoot:W.Optional(W.String()),peerMessagingEnabled:W.Boolean(),createdAt:W.Number(),updatedAt:W.Number(),deletedAt:W.Optional(W.Number()),members:W.Array(Sw),tasks:W.Array(Iw)})),H$=pO(W.Object({sessionId:W.String({minLength:1}),projectPath:W.String({minLength:1}),name:W.String({minLength:1}),description:W.Optional(W.String()),leadAgentType:W.Optional(W.String()),peerMessagingEnabled:W.Optional(W.Boolean()),members:W.Array(W.Object({name:W.String({minLength:1}),subagentType:W.String({minLength:1}),description:W.Optional(W.String()),prompt:W.String({minLength:10,maxLength:32768})}),{maxItems:32}),tasks:W.Optional(W.Array(W.Object({subject:W.String({minLength:1}),description:W.String({minLength:1}),dependsOn:W.Optional(W.Array(W.String())),assignedTo:W.Optional(W.String()),priority:W.Optional(JO(["high","medium","low"]))}),{maxItems:256}))})),b$=pO(W.Object({sessionId:W.String({minLength:1}),projectPath:W.String({minLength:1}),to:W.String({minLength:1}),message:W.String({minLength:1,maxLength:32768})})),A$=pO(W.Object({sessionId:W.String({minLength:1}),projectPath:W.String({minLength:1}),memberId:W.String({minLength:1})}));var kw=$O("Service"),I$=()=>{let O=new Rw;return O.onError((x,$)=>{if(x instanceof ZO)return $.json(x.toObject(),x.statusCode);return kw.error("[TeamRoutes] Unhandled route error:",x),$.json(new wO("Team operation failed").toObject(),500)}),O.get("/",async(x)=>{I0();let $=await R0(x.req.query("sessionId"),x.req.query("projectPath"));return x.json(await S0($.projectPath).list($))}),O.post("/",async(x)=>{I0();let $=E(H$,await xx(x.req));if(!$.success)throw new F("Invalid team request");let w=await R0($.data.sessionId,$.data.projectPath),Q=await f.findSessionMetadata(w.sessionId,w.projectPath);return x.json(await S0(w.projectPath).create({name:$.data.name,description:$.data.description,leadAgentType:$.data.leadAgentType,owner:w,modelId:Q?.selectedModelId,peerMessagingEnabled:$.data.peerMessagingEnabled,members:$.data.members,tasks:$.data.tasks}),201)}),O.get("/:teamName",async(x)=>{I0();let $=await R0(x.req.query("sessionId"),x.req.query("projectPath"));return x.json(await S0($.projectPath).getSnapshot(x.req.param("teamName"),$))}),O.post("/:teamName/messages",async(x)=>{I0();let $=E(b$,await xx(x.req));if(!$.success)throw new F("Invalid team message");let w=await R0($.data.sessionId,$.data.projectPath),Q=await S0(w.projectPath).sendMessage({name:x.req.param("teamName"),to:$.data.to,body:$.data.message,owner:w});return x.json({messages:Q})}),O.post("/:teamName/tasks/claim",async(x)=>{I0();let $=E(A$,await xx(x.req));if(!$.success)throw new F("Invalid team task claim");let w=await R0($.data.sessionId,$.data.projectPath);return x.json({task:await S0(w.projectPath).claimTask(x.req.param("teamName"),$.data.memberId,w)})}),O.delete("/:teamName",async(x)=>{I0();let $=await R0(x.req.query("sessionId"),x.req.query("projectPath"));return x.json(await S0($.projectPath).delete(x.req.param("teamName"),{owner:$,killRunning:!0}))}),O};function S0(O){return new S$({configDir:U1(),subagentRegistry:T$(O)})}function I0(){if(M$().config.config?.agentTeamsEnabled!==!0)throw new CO("Agent Teams are disabled")}async function R0(O,x){if(!O||!x||!j$.isAbsolute(x))throw new F("sessionId and absolute projectPath are required");let $=j$.resolve(x);if(!await f.findSessionMetadata(O,$))throw new h(`Session not found: ${O}`);return{sessionId:O,projectPath:$}}async function xx(O){try{return await O.json()}catch{throw new F("Invalid request body")}}import{Hono as qw}from"hono";var Z0=$O("Service"),k0=new Map,R$=2097152,k$=65536;function q$(){return typeof globalThis.Bun<"u"}async function fw(O,x,$){if(q$()){let{spawn:Y}=await import("bun-pty"),J=Y(O,x,{name:"xterm-256color",cwd:$.cwd,env:$.env});return{pid:J.pid,write:(K)=>J.write(K),resize:(K,M)=>J.resize(K,M),kill:()=>J.kill(),onData:(K)=>J.onData(K),onExit:(K)=>J.onExit(K)}}let Q=(await import("node-pty")).spawn(O,x,{name:"xterm-256color",cwd:$.cwd,env:$.env,cols:80,rows:24});return{pid:Q.pid,write:(Y)=>Q.write(Y),resize:(Y,J)=>Q.resize(Y,J),kill:()=>Q.kill(),onData:(Y)=>{Q.onData(Y)},onExit:(Y)=>{Q.onExit(Y)}}}var Qx=void 0,wx;if(q$())try{let{createBunWebSocket:O}=await import("hono/bun"),x=O();wx=x.upgradeWebSocket,Qx=x.websocket}catch(O){Z0.warn("[Terminal] Failed to initialize Bun WebSocket support:",O)}async function f$(O,x){let $=`term-${Date.now()}`;Z0.info(`[Terminal] New connection: ${$}, cwd: ${O}`);let w=process.platform==="win32"?"powershell.exe":process.env.SHELL||"/bin/zsh",Q=w.endsWith("sh")?["-l"]:[],Y=await fw(w,Q,{cwd:O,env:{...process.env,TERM:"xterm-256color",COLORTERM:"truecolor"}}),J={id:$,process:Y,cwd:O,buffer:"",subscribers:new Set};if(k0.set($,J),J.subscribers.add(x),Y.onData((K)=>{let M=!1;for(let B of J.subscribers)try{B.send(K),M=!0}catch{J.subscribers.delete(B)}if(M)return;if(J.buffer+=K,J.buffer.length>R$)J.buffer=J.buffer.slice(-R$)}),Y.onExit(({exitCode:K})=>{Z0.info(`[Terminal] Process exited: ${$}, code: ${K}`);for(let M of J.subscribers)try{M.close()}catch{}k0.delete($)}),J.buffer){let K=J.buffer;J.buffer="";for(let M=0;M<K.length;M+=k$)x.send(K.slice(M,M+k$))}return{session:J,cleanup:()=>{if(Z0.info(`[Terminal] Connection closed: ${$}`),J.subscribers.delete(x),J.subscribers.size===0){try{J.process.kill()}catch{}k0.delete($)}}}}function C$(O,x){O.on("connection",async($,w)=>{let Q=new URL(w.url||"/",`http://${w.headers.host}`);if(!Q.pathname.endsWith("/terminal/ws")){$.close();return}let Y=Q.searchParams.get("cwd")||x()||e();try{let{session:J,cleanup:K}=await f$(Y,{send:(M)=>$.send(M),close:()=>$.close()});$.on("message",(M)=>{try{J.process.write(String(M))}catch(B){Z0.error("[Terminal] Failed to write to PTY:",B)}}),$.on("close",K),$.on("error",K)}catch(J){Z0.error("[Terminal] Failed to spawn PTY:",J),$.close()}})}var E$=()=>{let O=new qw;if(O.get("/status",(x)=>{let $=Array.from(k0.values()).map((w)=>({id:w.id,cwd:w.cwd}));return x.json({active:$.length,terminals:$})}),O.post("/kill/:terminalId",(x)=>{let $=x.req.param("terminalId"),w=k0.get($);if(w){try{w.process.kill()}catch{}for(let Q of w.subscribers)Q.close();return k0.delete($),x.json({success:!0})}return x.json({success:!1,error:"Terminal not found"},404)}),wx)O.get("/ws",wx((x)=>{let $=x.req.query("cwd")||x.get("directory")||e(),w;return{async onOpen(Q,Y){try{w=await f$($,{send:(J)=>Y.send(J),close:()=>Y.close()})}catch(J){Z0.error("[Terminal] Failed to spawn PTY:",J),Y.close()}},onMessage(Q){if(!w)return;try{w.session.process.write(String(Q.data))}catch(Y){Z0.error("[Terminal] Failed to write to PTY:",Y)}},onClose(){w?.cleanup()}}}));else O.get("/ws",(x)=>{return x.json({message:"WebSocket endpoint - connect via ws:// protocol",hint:"Use WebSocket client to connect to this endpoint"})});return O};import Cw from"node:path";import{Hono as Ew}from"hono";var yw=W.Object({projectPath:W.String({minLength:1}),action:JO(["trust","revoke"])});function y$(O){if(!Cw.isAbsolute(O))throw new F("projectPath must be absolute")}var m$=()=>{let O=new Ew;return O.get("/",async(x)=>{let $=x.req.query("projectPath");if(!$)throw new F("projectPath query parameter is required");return y$($),x.json(await Zx.getInstance().getStatus($))}),O.post("/",async(x)=>{let $=E(yw,await x.req.json());if(!$.success)throw new F("Invalid workspace trust request");let{projectPath:w,action:Q}=$.data;y$(w);let Y=Zx.getInstance(),J=Q==="trust"?await Y.trust(w):await Y.revoke(w);return await P$(),x.json({...J,reloadRequired:J.sensitiveSources>0})}),O};var IO=$O("Service"),Nx=[],H1,f0,C0,U0,q0,h$=new Map,g$=new Map,aw=new Set([".css",".html",".js",".json",".svg"]),ow=1024,nw=3600000;function tw(O,x){if(!O)return 0;let $=O.split(",").map((w)=>{let[Q,...Y]=w.trim().toLowerCase().split(";"),J=Y.find((M)=>M.trim().startsWith("q=")),K=J?Number(J.trim().slice(2)):1;return{name:Q,quality:Number.isFinite(K)?Math.max(0,Math.min(1,K)):0}});return $.find((w)=>w.name===x)?.quality??$.find((w)=>w.name==="*")?.quality??0}function p$(){if(C0)return;let O=()=>{f.collectStaleEmptySessions().then((x)=>{if(x>0)IO.info(`[SessionGC] removed ${x} stale empty session(s)`)}).catch((x)=>{IO.warn("[SessionGC] failed to collect stale empty sessions:",x)})};O(),C0=setInterval(O,nw),C0.unref?.()}function sw(){if(!C0)return;clearInterval(C0),C0=void 0}function rw(O){return["br","gzip"].map(($)=>({encoding:$,quality:tw(O,$)})).filter(($)=>$.quality>0).sort(($,w)=>w.quality-$.quality||($.encoding==="br"?-1:1))[0]?.encoding}function ew(O){let x=h$.get(O);if(x)return x;let $=Q1(O);return h$.set(O,$),$}function O3(O,x,$){let w=`${$}:${O}`,Q=g$.get(w);if(Q)return Q;let Y=$==="br"?uw(x,{params:{[vw.BROTLI_PARAM_QUALITY]:5}}):dw(x,{level:6});return g$.set(w,Y),Y}function x3(){let O=hw(pw(import.meta.url)),x=[J0(O,"web"),J0(e(),"dist/web"),J0(e(),"packages/cli/dist/web")];for(let $ of x){let w=J0($,"index.html");if(Yx(w)){if(Q1(w,"utf-8").includes("/assets/"))return IO.debug(`[Server] Found web dist at: ${$}`),$}}return null}function $3(){let O=new iw;O.onError((Q,Y)=>{if(IO.error("[Server] Request error:",Q),Q instanceof v$){let K=new nO(Q.message,{resource:"workspace_agent_resources",limit:Q.capacity});return Y.json(K.toObject(),429)}if(Q instanceof ZO)return Y.json(Q.toObject(),Q.statusCode);let J=Q instanceof Error?Q.message:String(Q);return Y.json({error:{code:"INTERNAL_ERROR",message:J}},500)}),O.use(async(Q,Y)=>{let J=process.env.BLADE_SERVER_PASSWORD;if(!J)return Y();let K=Q.req.path;if(K==="/"||K==="/favicon.svg"||K.startsWith("/assets/")||K.endsWith(".html")||K.endsWith(".js")||K.endsWith(".css"))return Y();let M=Q.req.header("Authorization");if(!M?.startsWith("Basic "))return Q.header("WWW-Authenticate",'Basic realm="Blade Server"'),Q.json({error:{code:"UNAUTHORIZED",message:"Authentication required"}},401);let B=Buffer.from(M.slice(6),"base64").toString(),[H,b]=B.split(":"),S=process.env.BLADE_SERVER_USERNAME??"blade";if(H!==S||b!==J)return Q.json({error:{code:"UNAUTHORIZED",message:"Invalid credentials"}},401);return Y()}),O.use(async(Q,Y)=>{let J=Q.req.path==="/health"||Q.req.path==="/global/health"||Q.req.path.startsWith("/assets/");if(!J)IO.debug(`[Server] ${Q.req.method} ${Q.req.path}`);let K=Date.now();if(await Y(),!J){let M=Date.now()-K;IO.debug(`[Server] ${Q.req.method} ${Q.req.path} - ${Q.res.status} (${M}ms)`)}}),O.use(lw({origin(Q){if(!Q)return;if(Q.startsWith("http://localhost:"))return Q;if(Q.startsWith("http://127.0.0.1:"))return Q;if(Q==="tauri://localhost"||Q==="http://tauri.localhost")return Q;if(Nx.includes(Q))return Q;return}})),O.use(async(Q,Y)=>{let J=Q.req.query("directory")||Q.req.header("x-blade-directory")||e();try{J=decodeURIComponent(J)}catch{}return Q.set("directory",J),Y()});let x=C4(),$=Hx();U0=x,q0=$,H1=x.recoverQueuedTasks,f0=new S1({dispatch:(Q)=>x.dispatchTask(Q),store:Jx}),O.route("/global",Ax()),O.route("/events",$.app),O.route("/sessions",x.app),O.route("/tasks",D$(x)),O.route("/teams",I$()),O.route("/schedules",Y$(Jx,f0)),O.route("/configs",Gx()),O.route("/permissions",y4()),O.route("/plugins",n4()),O.route("/hooks",Rx()),O.route("/workspace-trust",m$()),O.route("/providers",w$()),O.route("/models",hx()),O.route("/projects",r4()),O.route("/suggestions",K$()),O.route("/terminal",E$()),O.route("/mcp",fx()),O.route("/skills",V$()),O.get("/health",(Q)=>{return Q.json({healthy:!0,version:F0()})});let w=x3();if(w)IO.info(`[Server] Serving static files from ${w}`),O.get("/favicon.svg",()=>{let Q=J0(w,"favicon.svg");if(!Yx(Q))return new Response(null,{status:404});return new Response(Q1(Q),{headers:{"Content-Type":"image/svg+xml","Cache-Control":"public, max-age=86400"}})}),O.get("/assets/*",(Q)=>{let Y=J0(w,Q.req.path);if(!Yx(Y))return Q.json({error:{code:"NOT_FOUND",message:`File not found: ${Q.req.path}`}},404);let J=ew(Y),K=gw(Y).toLowerCase(),B={".js":"application/javascript",".css":"text/css",".html":"text/html",".json":"application/json",".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".svg":"image/svg+xml",".ico":"image/x-icon",".woff":"font/woff",".woff2":"font/woff2",".ttf":"font/ttf",".eot":"application/vnd.ms-fontobject"}[K]||"application/octet-stream",H=aw.has(K)&&J.byteLength>=ow?rw(Q.req.header("Accept-Encoding")):void 0,b=H?O3(Y,J,H):J;return new Response(new Uint8Array(b),{headers:{"Content-Type":B,"Content-Length":String(b.byteLength),"Cache-Control":"public, max-age=31536000, immutable",Vary:"Accept-Encoding",...H?{"Content-Encoding":H}:{}}})}),O.get("/",(Q)=>{let Y=J0(w,"index.html"),J=Q1(Y,"utf-8");return Q.html(J,200,{"Cache-Control":"no-cache"})}),O.get("*",(Q)=>{let Y=Q.req.path;if(Y.includes("."))return Q.json({error:{code:"NOT_FOUND",message:`File not found: ${Y}`}},404);let J=J0(w,"index.html"),K=Q1(J,"utf-8");return Q.html(K,200,{"Cache-Control":"no-cache"})});else IO.warn('[Server] Web UI not found. Run "cd packages/cli/web && bun run build" to enable web interface.'),O.get("/",(Q)=>{return Q.json({message:"Blade API Server",version:F0(),webUI:!1,hint:'Web UI not built. Run "cd packages/cli/web && bun run build" to enable.',endpoints:{health:"/health",sessions:"/sessions",configs:"/configs",permissions:"/permissions",providers:"/providers"}})}),O.all("*",(Q)=>{return Q.json({error:{code:"NOT_FOUND",message:`Route not found: ${Q.req.path}`}},404)});return O}function w3(){let O=mw(),x=[];for(let $ of Object.keys(O)){let w=O[$];if(!w)continue;for(let Q of w){if(Q.internal||Q.family!=="IPv4")continue;if(Q.address.startsWith("172."))continue;x.push(Q.address)}}return x}function u$(){return typeof globalThis.Bun<"u"}function d$(O,x){let $=globalThis.Bun,w=(Y)=>{try{return $.serve({hostname:x.hostname,port:Y,fetch:O.fetch,idleTimeout:0,websocket:Qx})}catch(J){IO.error("Failed to start Bun server:",J);return}},Q=x.port===0?w(4096)??w(0):w(x.port);if(!Q)throw Error(`Failed to start Bun server on port ${x.port}`);return{url:Q.url,port:Q.port,hostname:Q.hostname,stop:async()=>{Q.stop(!0)}}}function Q3(O,x){return new Promise(($,w)=>{let Q=Pw(async(B,H)=>{let b=new AbortController,S=()=>{if(!b.signal.aborted)b.abort("client-disconnected")},q=()=>S(),u=()=>{if(!H.writableEnded)S()};if(B.once("aborted",q),H.once("close",u),B.aborted||H.destroyed)S();try{let v=new URL(B.url||"/",`http://${B.headers.host}`),QO=new Headers;for(let[I,GO]of Object.entries(B.headers))if(GO)if(Array.isArray(GO))for(let m of GO)QO.append(I,m);else QO.set(I,GO);let VO;if(B.method!=="GET"&&B.method!=="HEAD")VO=(await new Promise((GO,m)=>{let r=[],UO=()=>{B.off("data",DO),B.off("end",o),B.off("error",a),b.signal.removeEventListener("abort",PO)},DO=(BO)=>r.push(BO),o=()=>{UO(),GO(Buffer.concat(r))},a=(BO)=>{UO(),m(BO)},PO=()=>{UO(),m(b.signal.reason)};if(B.on("data",DO),B.once("end",o),B.once("error",a),b.signal.addEventListener("abort",PO,{once:!0}),b.signal.aborted)PO()})).toString();let A=new Request(v.toString(),{method:B.method,headers:QO,body:VO,signal:b.signal}),c=await O.fetch(A);if(H.statusCode=c.status,c.headers.forEach((I,GO)=>{H.setHeader(GO,I)}),c.body){let I=c.body.getReader(),GO=async()=>{let{done:m,value:r}=await I.read();if(m){H.end();return}return H.write(r),GO()};await GO()}else{let I=await c.text();H.end(I)}}catch(v){if(b.signal.aborted)return;IO.error("[Server] Node request error:",v),H.statusCode=500,H.end(JSON.stringify({error:{code:"INTERNAL_ERROR",message:"Internal server error"}}))}finally{B.off("aborted",q),H.off("close",u)}}),Y=new cw({noServer:!0}),J=e();C$(Y,()=>J),Q.on("upgrade",(B,H,b)=>{if(new URL(B.url||"/",`http://${B.headers.host}`).pathname==="/terminal/ws")Y.handleUpgrade(B,H,b,(q)=>{Y.emit("connection",q,B)});else H.destroy()});let K=(B)=>{return new Promise((H,b)=>{Q.once("error",(S)=>{if(S.code==="EADDRINUSE")b(S);else b(S)}),Q.listen(B,x.hostname,()=>{let S=Q.address();if(S&&typeof S==="object")H(S.port);else H(B)})})};(async()=>{let B;if(x.port===0)try{B=await K(4096)}catch{B=await K(0)}else B=await K(x.port);let H=new URL(`http://${x.hostname==="0.0.0.0"?"localhost":x.hostname}:${B}`);$({url:H,port:B,hostname:x.hostname,stop:async()=>{return new Promise((b)=>{Y.close(()=>{Q.close(()=>b())})})}})})().catch(w)})}var l$;((Y7)=>{let O,x,$,w=(H,b,S)=>{if(O!==H)return Promise.resolve();if($)return $;let q,u,v,QO,VO,A;try{VO=b?.shutdown("server-shutdown")}catch(c){q=c}try{A=S?.shutdown("server-shutdown")}catch(c){u=c}try{f0?.stop()}catch(c){v=c}try{sw()}catch(c){QO=c}return $=(async()=>{let c=Promise.resolve().then(()=>H.stop()),[I,GO,m]=await Promise.allSettled([VO??Promise.resolve(),A??Promise.resolve(),c]),r;try{i$()}catch(o){r=o}let DO=[q,I.status==="rejected"?I.reason:void 0,u,GO.status==="rejected"?GO.reason:void 0,v,QO,m.status==="rejected"?m.reason:void 0,r].find((o)=>o!==void 0);if(DO!==void 0){if(O===H)$=void 0;throw DO}if(O===H){if(O=void 0,x=void 0,U0===b)U0=void 0;if(q0===S)q0=void 0;H1=void 0,f0=void 0}IO.info("[Server] Blade server stopped")})(),$};function Q(){if(!x)x=$3();return x}Y7.getApp=Q;function Y(H){Nx=H.cors??[];let b=Q();if(u$())O=d$(b,H),$=void 0,IO.info(`[Server] Blade server listening on ${O.url} (Bun runtime)`);else throw Error("Blade web server requires Bun runtime. Please run with Bun: `bun run blade web` or install Bun from https://bun.sh");let S=O,q=U0,u=q0;return H1?.().catch((v)=>{IO.warn("[Server] Failed to recover queued tasks:",v)}),f0?.start(),p$(),{url:S.url,port:S.port,hostname:S.hostname,stop:()=>w(S,q,u)}}Y7.listen=Y;async function J(H){Nx=H.cors??[];let b=Q();if(u$())O=d$(b,H),IO.info(`[Server] Blade server listening on ${O.url} (Bun runtime)`);else O=await Q3(b,H),IO.info(`[Server] Blade server listening on ${O.url} (Node.js runtime)`);$=void 0;let S=O,q=U0,u=q0;try{await H1?.()}catch(v){IO.warn("[Server] Failed to recover queued tasks:",v)}return f0?.start(),p$(),{url:S.url,port:S.port,hostname:S.hostname,stop:()=>w(S,q,u)}}Y7.listenAsync=J;function K(){return O!==void 0}Y7.isRunning=K;function M(){return U0?.getCoordinationStats()}Y7.getSessionCoordinationStatsForTests=M;function B(){return{global:q0?.getSseConnectionStats(),session:U0?.getSseConnectionStats()}}Y7.getSseConnectionStatsForTests=B})(l$||={});export{J3 as a,Y3 as b,w3 as c,l$ as d};
|