@x-otto/service 0.0.1-alpha.2 → 0.0.1-alpha.3

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/index.d.ts CHANGED
@@ -462,6 +462,17 @@ interface WriteLeaseManager {
462
462
  previousOwner: string | undefined;
463
463
  newOwner: string;
464
464
  };
465
+ /**
466
+ * RFC-381 M2:刷新持有者心跳(kill -9 存活证明)。仅持有者可刷新(幂等 no-op)。
467
+ * 供 WS ping/pong 看门狗调用——心跳超时(如 3× ping 间隔)的持有者视为死租约,
468
+ * 可由 `evictStale` 接管。
469
+ */
470
+ heartbeat(sessionId: string, clientId: string): void;
471
+ /**
472
+ * RFC-381 M2:驱逐超时未心跳的死租约。返回被驱逐的 sessionId 列表。
473
+ * 由看门狗定时调用(调用方定周期);被驱逐后新 acquire 可正常接管。
474
+ */
475
+ evictStale(now?: number): string[];
465
476
  }
466
477
  type WriteLeaseAcquireResult = {
467
478
  kind: 'acquired';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/message-serializer.ts","../src/types.ts","../src/session-event-log.ts","../src/websocket-manager.ts","../src/debug-bridge.ts","../src/write-lease-manager.ts","../src/inbound-router.ts","../src/coding-service.ts","../src/event-bridge.ts","../src/session-event-wire.ts","../src/persistenced-app.ts","../src/event-bus.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/message-serializer.ts","../src/types.ts","../src/session-event-log.ts","../src/websocket-manager.ts","../src/debug-bridge.ts","../src/write-lease-manager.ts","../src/inbound-router.ts","../src/coding-service.ts","../src/event-bridge.ts","../src/session-event-wire.ts","../src/persistenced-app.ts","../src/event-bus.ts"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import{existsSync as e,readFileSync as t,readdirSync as n,realpathSync as r,statSync as i}from"node:fs";import{createHash as a,randomUUID as o,timingSafeEqual as s}from"node:crypto";import{dirname as c,extname as l,isAbsolute as u,join as d,relative as f,resolve as p,sep as ee}from"node:path";import{Hono as m}from"hono";import{createAdaptorServer as te,serve as ne}from"@hono/node-server";import{TypedEventEmitter as re,createLogger as h}from"@x-otto/shared";import{WebSocketServer as ie}from"ws";import{createProjectorState as ae,projectSessionEvent as oe,shouldShowPulseSurvey as se}from"@x-otto/session-contract";import{cors as ce}from"hono/cors";import{isCheckpointForkParams as le,isCheckpointRestoreParams as ue,isReplaySeekParams as de,isReplayStartParams as fe}from"@x-otto/devtools";import{exportSessionTrace as pe,otlpExporterFromEnv as me}from"@x-otto/otel";import{BREAKPOINT_POINTS as he,summarizeTrace as ge,traceToSpans as _e}from"@x-otto/agent";import{traceEventsToTimeline as ve}from"@x-otto/trace-view";import{streamSSE as ye}from"hono/streaming";import{globalAgentJobRegistry as g}from"@x-otto/runtime";import{DEFAULT_WORKSPACE_KEY as be,isValidWorkspaceId as xe}from"@x-otto/workspace";import{defineHook as Se}from"@x-otto/hooks";import{SqlitePersistence as Ce,StorageHost as we,acquireDb as Te,releaseDb as Ee}from"@x-otto/persistence";import{SCHEDULE_LEASE_MIGRATIONS as De}from"@x-otto/schedule";function Oe(e){return e?a(`sha256`).update(e).digest(`hex`).slice(0,16):`local`}function ke(e){if(!e)return;let t=/^Bearer\s+(.+)$/i.exec(e);return t?t[1]:void 0}function Ae(e){try{return new URL(e??`/`,`http://localhost`).searchParams.get(`token`)??void 0}catch{return}}const _=h(`@x-otto/service:websocket-manager`),je=new Set([`localhost`,`127.0.0.1`,`::1`,`[::1]`]);var Me=class extends re{wss;clients=new Map;sessionSubscriptions=new Map;options;maxMessagesPerSecond;maxConnections;clientId=0;clientIdentities=new Map;onClientDisconnected;identityOf(e){return this.clientIdentities.get(e)??e}get clientCount(){return this.clients.size}constructor(e={}){super(),this.options=e,this.maxMessagesPerSecond=e.maxMessagesPerSecond??100,this.maxConnections=e.maxConnections??256,this.wss=new ie({noServer:!0,maxPayload:e.maxPayloadBytes??1048576}),this.wss.on(`connection`,this.onConnection)}handleUpgrade(e,t,n,r){return r===`/ws`?this.isOriginAllowed(e)?this.isTokenValid(e)?this.clients.size>=this.maxConnections?(_.warn({active:this.clients.size},`ws upgrade rejected: max connections reached`),this.rejectUpgrade(t,`503 Service Unavailable`),!0):(this.wss.handleUpgrade(e,t,n,t=>this.wss.emit(`connection`,t,e)),!0):(_.warn(`ws upgrade rejected: invalid auth token`),this.rejectUpgrade(t,`401 Unauthorized`),!0):(_.warn({origin:e.headers.origin},`ws upgrade rejected: origin not allowed`),this.rejectUpgrade(t,`403 Forbidden`),!0):!1}rejectUpgrade(e,t){e.on(`error`,()=>{});try{e.write(`HTTP/1.1 ${t}\r\nConnection: close\r\n\r\n`),e.destroy()}catch{}}isOriginAllowed(e){let t=e.headers.origin;if(!t||this.options.allowedOrigins?.includes(t))return!0;try{return je.has(new URL(t).hostname)}catch{return!1}}isTokenValid(e){let{authToken:t}=this.options;if(!t)return!0;try{let n=new URL(e.url??`/`,`http://localhost`).searchParams.get(`token`);if(n===null)return!1;let r=Buffer.from(n),i=Buffer.from(t);return r.length===i.length&&s(r,i)}catch{return!1}}broadcast(e){let t=JSON.stringify(e);for(let[,e]of this.clients)e.readyState===e.OPEN&&e.send(t)}sendToSession(e,t){this.sendToSubscribers(e,t)}sendToSubscribers(e,t){let n=this.sessionSubscriptions.get(e);if(!n||n.size===0)return;let r=JSON.stringify(t);for(let e of n){let t=this.clients.get(e);t&&t.readyState===t.OPEN&&t.send(r)}}subscribeClient(e,t){t&&(this.sessionSubscriptions.has(t)||this.sessionSubscriptions.set(t,new Set),this.sessionSubscriptions.get(t)?.add(e))}unsubscribeClient(e,t){t&&this.sessionSubscriptions.get(t)?.delete(e)}clearSessionSubscriptions(e){this.sessionSubscriptions.delete(e)}sendToClient(e,t){let n=this.clients.get(e);n&&n.readyState===n.OPEN&&n.send(JSON.stringify(t))}sendToIdentity(e,t){let n=JSON.stringify(t);for(let[t,r]of this.clientIdentities){if(r!==e)continue;let i=this.clients.get(t);i&&i.readyState===i.OPEN&&i.send(n)}}close(){for(let[,e]of this.clients)e.close();this.clients.clear(),this.sessionSubscriptions.clear(),this.wss.close()}onConnection=(e,t)=>{let n=String(++this.clientId);this.clients.set(n,e);let r=Oe(Ae(t?.url));this.clientIdentities.set(n,r),_.debug({clientId:n,identity:r},`client connected`),this.sendToClient(n,{type:`Runtime.connected`,data:{clientId:n}});let i=[];e.on(`message`,t=>{let r=Date.now(),a=r-1e3;for(;i.length>0&&i[0]<=a;)i.shift();if(i.length>=this.maxMessagesPerSecond){_.warn({clientId:n},`ws client rate limit exceeded, closing`),e.close(1008,`rate limit exceeded`);return}i.push(r);try{let e=JSON.parse(t.toString()),r=this.normalizeClientMessage(e);if(!r){_.warn({clientId:n},`invalid message`);return}if(this.handleSystemClientMessage(n,r))return;this.emit(`message`,n,r)}catch{_.warn({clientId:n},`invalid message`)}}),e.on(`close`,()=>{this.clients.delete(n);for(let[,e]of this.sessionSubscriptions)e.delete(n);this.clientIdentities.delete(n);let e=[...this.clientIdentities.values()].includes(r);e||this.onClientDisconnected?.(r),_.debug({clientId:n,identity:r,identityStillOnline:e},`client disconnected`)}),e.on(`error`,e=>{_.warn({clientId:n,err:e.message},`client error`)})};handleSystemClientMessage(e,t){switch(t.type){case`Runtime.ping`:return this.handleRuntimePing(e),!0;default:return!1}}handleRuntimePing(e){this.sendToClient(e,{type:`Runtime.pong`,data:{timestamp:Date.now()}})}normalizeClientMessage(e){if(!e||typeof e!=`object`||Array.isArray(e))return null;let t=e;if(typeof t.method==`string`){let e=t.method,n=this.asRecord(t.params);return typeof t.id==`number`&&(n.seq===void 0&&(n.seq=t.id),n.requestId===void 0&&(n.requestId=t.id)),{type:e,data:n}}return null}asRecord(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:{}}};const Ne=h(`@x-otto/service:session-event-wire`);function Pe(e,t){return oe(e,t).map(e=>({type:`Session.event`,data:Fe(e)}))}function Fe(e){return e.kind===`error`?(Ne.error({sessionId:e.sessionId,code:e.code,message:e.message},`session error`),{...e,message:e.code===`STREAM_ERROR`?`stream error`:`session error`}):e}var Ie=class{unsubscribeSession;projector=ae();pulseSurveyState={};constructor(e,t,n){this.session=e,this.sender=t,this.app=n}attach(){this.unsubscribeSession=this.session.subscribe(e=>{let t=Pe(e,this.projector);for(let n of t)this.sender.sendToSession(e.sessionId,n);e.type===`prompt.end`&&this.maybeSendPulseSurvey(e.sessionId),e.type===`tool.call.end`&&this.maybeSendA2uiRendererPayload(e.sessionId,e)})}async maybeSendA2uiRendererPayload(e,t){if(this.app)try{let n={role:`tool_result`,name:t.toolCall.name,toolCallId:t.toolCall.id,content:[{type:`text`,text:t.resultText??``}],details:t.details},r=await this.app.resolveA2uiRendererPayload(n);if(!r||r.length===0)return;this.sender.sendToSession(e,{type:`Session.event`,data:{sessionId:e,kind:`a2ui.payload`,forToolCallId:t.toolCall.id,components:r}})}catch{}}maybeSendPulseSurvey(e){if(!this.app||!this.app.isFeedbackAvailable())return;let t=this.app.getPulseSurveyConfig();se(this.projector.currentTurn,{enabled:t?.enabled??!0,probability:t?.probability??.05,minTurnGap:t?.min_turn_gap??20,forcedUpgradeActive:!1},this.pulseSurveyState)&&(this.pulseSurveyState.lastShownTurn=this.projector.currentTurn,this.sender.sendToSession(e,{type:`Session.event`,data:{sessionId:e,kind:`pulse-survey.show`}}))}detach(){this.unsubscribeSession?.(),this.unsubscribeSession=void 0}};const Le=h(`@x-otto/service:trace-bridge`);var Re=class{iterator;stopped=!1;constructor(e,t,n){this.sessionId=e,this.traceStore=t,this.sender=n}attach(){this.iterator||(this.stopped=!1,this.iterator=this.traceStore.tail(this.sessionId)[Symbol.asyncIterator](),this.pump())}async pump(){let e=this.iterator;if(e)try{for(;!this.stopped;){let{value:t,done:n}=await e.next();if(n||this.stopped||!t)break;this.sender.sendToSubscribers(this.sessionId,{type:`Trace.event`,data:{sessionId:this.sessionId,seq:t.seq,event:t.entry}})}}catch(e){Le.warn({sessionId:this.sessionId,err:e instanceof Error?e.message:String(e)},`trace tail terminated`)}}detach(){this.stopped=!0,this.iterator?.return?.(),this.iterator=void 0}};function ze(e){switch(e.type){case`Debugger.paused`:return[{type:`Debugger.paused`,data:{reason:`breakpoint`,pauseId:e.pauseId,point:e.snapshot?.point,snapshot:e.snapshot,timestamp:new Date().toISOString()}}];case`Debugger.resumed`:return[{type:`Debugger.resumed`,data:{pauseId:e.pauseId,command:e.command,timestamp:new Date().toISOString()}}];case`Debugger.commandRejected`:return[{type:`Debugger.commandRejected`,data:{code:e.code,pauseId:e.pauseId,command:e.command,timestamp:new Date().toISOString()}}];default:return[]}}const Be=h(`@x-otto/service:debug-bridge`);var Ve=class extends re{logId=0;attached=!1;unsubs=[];logs=[];pauseSessionMap=new Map;constructor(e,t){super(),this.devtools=e,this.sender=t}attach(){if(this.attached)return;this.attached=!0;let e=this.devtools.controller;this.unsubs.push(e.on(`Debugger.paused`,({pauseId:e,snapshot:t})=>{let n=this.extractSessionId(t);n&&this.pauseSessionMap.set(e,n),this.forwardDebugEvent({type:`Debugger.paused`,pauseId:e,snapshot:t},n)}),e.on(`Debugger.resumed`,({pauseId:e,command:t})=>{let n=this.pauseSessionMap.get(e);this.pauseSessionMap.delete(e),this.forwardDebugEvent({type:`Debugger.resumed`,pauseId:e,command:t},n)}),e.on(`Debugger.commandRejected`,e=>{let t=e.pauseId,n=t?this.pauseSessionMap.get(t):void 0;this.forwardDebugEvent({type:`Debugger.commandRejected`,...e},n)}),e.on(`Log.entryAdded`,e=>{this.handleLogMessage(e)}))}detach(){for(let e of this.unsubs)e();this.unsubs.length=0,this.attached=!1,this.pauseSessionMap.clear()}extractSessionId(e){let t=e?.metadata?.sessionId;return typeof t==`string`&&t?t:void 0}get isConnected(){return this.attached}send(e,t){if(e.type===`setBreakpoint`){let t=e.point;t?this.devtools.debugger.setBreakpoint(t,e.enabled!==!1):Be.warn(`setBreakpoint command missing point, dropped`);return}if(e.type===`setBreakpointsActive`){e.active===!1?this.devtools.debugger.disableAllBreakpoints():this.devtools.debugger.enableAllBreakpoints();return}let n=typeof e.pauseId==`string`?e.pauseId:void 0;this.devtools.controller.resume(e,t,n)}getLogs(){return[...this.logs]}forwardDebugEvent(e,t){let n=ze(e);for(let e of n)t?this.sender.sendToSession(t,e):this.sender.broadcast(e)}handleLogMessage(e){if(e.level!==void 0||typeof e.msg==`string`){let t=e.time,n=typeof t==`number`?new Date(t).toISOString():typeof t==`string`?t:new Date().toISOString(),r={id:++this.logId,timestamp:n,level:this.normalizeLevel(e.level),module:e.name??`unknown`,message:e.msg??JSON.stringify(e),data:e};this.logs.push(r),this.logs.length>2e3&&this.logs.splice(0,this.logs.length-2e3),this.sender.broadcast({type:`Log.entryAdded`,data:{entry:r}}),this.emit(`Log.entryAdded`,r)}}normalizeLevel(e){if(typeof e==`string`){let t=e.toLowerCase();if([`trace`,`debug`,`info`,`warn`,`error`,`fatal`].includes(t))return t}return typeof e==`number`?e<=10?`trace`:e<=20?`debug`:e<=30?`info`:e<=40?`warn`:e<=50?`error`:`fatal`:`info`}};function He(){let e=new Map;return{acquire(t,n){let r=e.get(t);return r===void 0||r===n?(e.set(t,n),{kind:`acquired`}):{kind:`denied`,leaseOwner:r}},release(t,n){let r=e.get(t);return r===void 0||r!==n?!1:(e.delete(t),!0)},releaseAllForClient(t){let n=[];for(let[r,i]of e.entries())i===t&&(e.delete(r),n.push(r));return n},ownerOf(t){return e.get(t)},canClientWrite(t,n){let r=e.get(t);return r===void 0||r===n},forceAcquire(t,n){let r=e.get(t);return e.set(t,n),{previousOwner:r,newOwner:n}}}}const v=h(`@x-otto/service:inbound-router`);function y(e,t){let n=e[t];return typeof n==`string`?n:void 0}function Ue(e,t){let n=e[t];return typeof n==`boolean`?n:void 0}function We(e,t){let n=e[t];return typeof n==`number`?n:void 0}function Ge(e,t){let n=e[t];return typeof n==`object`&&n&&!Array.isArray(n)?n:void 0}function Ke(e){let t=Ge(e,`answers`);if(!t)return null;let n=y(t,`answer`);return n===void 0?null:{answer:n,acceptedRecommendation:t.acceptedRecommendation===!0,resolvedBy:t.resolvedBy===`auto_recommendation`?`auto_recommendation`:`human`,selectedOptionLabels:Array.isArray(t.selectedOptionLabels)?t.selectedOptionLabels.filter(e=>typeof e==`string`):void 0,freeformText:y(t,`freeformText`)}}function qe(e){let t=y(e,`message`);return t?{message:t,sessionId:y(e,`sessionId`)}:null}function Je(e){let t=y(e,`approvalId`),n=Ue(e,`approved`);return!t||n===void 0?null:{approvalId:t,approved:n,sessionId:y(e,`sessionId`)}}function Ye(e){let t=y(e,`requestId`);if(!t)return null;let n=e.cancelled===!0;return{requestId:t,answers:n?null:Ke(e),cancelled:n,sessionId:y(e,`sessionId`)}}function Xe(e){let t=y(e,`requestId`),n=y(e,`action`);return!t||!n?null:{requestId:t,action:n,feedback:y(e,`feedback`),sessionId:y(e,`sessionId`)}}function b(e){let t=y(e,`sessionId`);if(!t)return null;let n=We(e,`since`);return n===void 0?{sessionId:t}:{sessionId:t,since:n}}function Ze(e){return{seq:We(e,`seq`),pauseId:y(e,`pauseId`),depth:We(e,`depth`)}}function Qe(e){let t=y(e,`point`),n=Ue(e,`enabled`);return t===void 0||n===void 0?null:{point:t,enabled:n}}function $e(e){let t=Ue(e,`active`);return t===void 0?null:{active:t}}var et=class{writeLease=He();constructor(e,t,n,r){this.ws=e,this.app=t,this.bridge=n,this.readEventsSince=r,this.ws.onClientDisconnected=e=>{let t=this.writeLease.releaseAllForClient(e);t.length>0&&v.debug({identity:e,released:t},`write-lease released on disconnect`)}}dispatch(e,t){let{type:n,data:r}=t,i=this.ws.identityOf?.(e)??e;switch(v.debug({clientId:e,identity:i,type:n},`message from client`),n){case`Session.subscribe`:{let t=b(r);t&&(this.ws.subscribeClient(e,t.sessionId),t.since!==void 0&&this.replaySince(e,t.sessionId,t.since));break}case`Session.unsubscribe`:{let t=b(r);t&&this.ws.unsubscribeClient(e,t.sessionId);break}case`Session.writeLease.acquire`:{let t=b(r);if(!t||!t.sessionId)break;let n=this.writeLease.acquire(t.sessionId,i);n.kind===`acquired`?this.ws.sendToClient(e,{type:`Runtime.writeLease`,data:{sessionId:t.sessionId,state:`acquired`,leaseOwner:i}}):this.ws.sendToClient(e,{type:`Runtime.writeLease`,data:{sessionId:t.sessionId,state:`denied`,reason:`lease held by another client`,leaseOwner:n.leaseOwner}});break}case`Session.writeLease.release`:{let t=b(r);if(!t||!t.sessionId)break;let n=this.writeLease.release(t.sessionId,i);this.ws.sendToClient(e,{type:`Runtime.writeLease`,data:{sessionId:t.sessionId,state:n?`released`:`not-held`,leaseOwner:n?void 0:this.writeLease.ownerOf(t.sessionId)}});break}case`Session.writeLease.force_acquire`:{let t=b(r);if(!t||!t.sessionId)break;let n=this.writeLease.forceAcquire(t.sessionId,i);v.warn({sessionId:t.sessionId,newOwner:i,previousOwner:n.previousOwner},`write-lease force-acquired`),n.previousOwner&&n.previousOwner!==i&&(this.ws.sendToIdentity?.bind(this.ws)??this.ws.sendToClient.bind(this.ws))(n.previousOwner,{type:`Runtime.writeLease`,data:{sessionId:t.sessionId,state:`released`,reason:`forced_by_other_client`,leaseOwner:n.newOwner}}),this.ws.sendToClient(e,{type:`Runtime.writeLease`,data:{sessionId:t.sessionId,state:`acquired`,leaseOwner:n.newOwner}});break}case`Chat.query`:{let t=qe(r);if(t){let n=t.sessionId;if(n&&!this.writeLease.canClientWrite(n,i)){let t=this.writeLease.ownerOf(n);v.info({sessionId:n,clientId:e,identity:i,leaseOwner:t},`Chat.query denied by write-lease`),this.ws.sendToClient(e,{type:`Runtime.error`,data:{sessionId:n,code:`WRITE_LEASE_DENIED`,message:`chat query denied — write-lease held by another client`,leaseOwner:t}});break}this.handleQuery(e,t)}break}case`Chat.approval`:{let e=Je(r);e&&this.handleApproval(e);break}case`Chat.askUserResponse`:{let e=Ye(r);e&&this.handleAskUserResponse(e);break}case`Chat.planApprovalResponse`:{let e=Xe(r);e&&this.handlePlanApprovalResponse(e);break}case`Debugger.resume`:case`Debugger.stepOver`:case`Debugger.stepInto`:case`Debugger.disable`:this.handleDebugCommand(n,Ze(r),r);break;case`Debugger.setBreakpoint`:{let e=Qe(r);e&&this.handleDebugSetBreakpoint(e);break}case`Debugger.setBreakpointsActive`:{let e=$e(r);e&&this.handleDebugSetBreakpointsActive(e);break}default:v.debug({type:n},`unknown client message type`)}}replaySince(e,t,n){if(!this.readEventsSince)return;let r=this.readEventsSince(t,n);if(!r.ok){v.warn({sessionId:t,after:n,oldest:r.oldestAvailable},`event log gap; client must resync`),this.ws.sendToClient(e,{type:`Runtime.error`,data:{sessionId:t,message:`event history gap — re-fetch the session snapshot`,code:`EVENT_LOG_GAP`}});return}for(let t of r.events){let n=t.message.type===`Session.event`?{...t.message,data:{...t.message.data,seq:t.seq}}:t.message;this.ws.sendToClient(e,n)}}resolveSession(e){return e?this.app.getSession(e):this.app.getActiveSession()}handleQuery(e,{message:t,sessionId:n}){let r=this.resolveSession(n);r&&r.prompt(t).catch(t=>{v.error({sessionId:r.id,err:t},`prompt failed`),this.ws.sendToClient(e,{type:`Runtime.error`,data:{sessionId:r.id,message:`prompt failed`,code:`PROMPT_FAILED`}})})}handleApproval({approvalId:e,approved:t,sessionId:n}){let r=this.resolveSession(n);r&&(r.resolveApproval(e,t),v.debug({sessionId:r.id,approved:t},`approval resolved`))}handleAskUserResponse({requestId:e,answers:t,sessionId:n}){let r=this.resolveSession(n);r&&(r.resolveAskUser(e,t),v.debug({sessionId:r.id,requestId:e},`ask_user resolved`))}handlePlanApprovalResponse({requestId:e,action:t,feedback:n,sessionId:r}){let i=this.resolveSession(r);i&&(i.resolvePlanApproval(e,t,n),v.debug({sessionId:i.id,action:t,requestId:e},`plan approval resolved`))}handleDebugCommand(e,{seq:t,pauseId:n,depth:r},i){if(!this.bridge)return;let a=Ge(i,`payload`);this.bridge.send({type:e,seq:t??Date.now(),...n===void 0?{}:{pauseId:n},...r===void 0?{}:{depth:r}},a)}handleDebugSetBreakpoint({point:e,enabled:t}){this.bridge&&this.bridge.send({type:`setBreakpoint`,seq:Date.now(),point:e,enabled:t})}handleDebugSetBreakpointsActive({active:e}){this.bridge&&this.bridge.send({type:`setBreakpointsActive`,seq:Date.now(),active:e})}};function tt(e,t){let n=Buffer.from(e),r=Buffer.from(t);return n.length===r.length?s(n,r):!1}function nt(e){return/^Bearer\s+(.+)$/i.exec(e.req.header(`authorization`)??``)?.[1]??``}function rt(e){let t=new m;return t.get(`/`,t=>{let n=e.app.storage.storageHost;return t.json({status:`ok`,service:`otto-coding`,uptime:process.uptime(),namespaces:n?.host?n.host.listNamespaces():null})}),t}function it(e){let t=new m;return t.get(`/`,t=>t.json(e.getAuthorityDescriptor())),t}function at(e){return e.session.messages().map(e=>{let t=ot(e);return{role:e.role,content:st(e),timestamp:`timestamp`in e?e.timestamp:void 0,toolCalls:ct(e),...t.length>0?{a2ui:t}:{}}})}function ot(e){return Array.isArray(e.content)?e.content.filter(e=>e&&typeof e==`object`&&e.type===`a2ui`&&Array.isArray(e.components)).map(e=>e.components):[]}function st(e){return typeof e.content==`string`?e.content:Array.isArray(e.content)?e.content.filter(e=>e.type===`text`).map(e=>e.text).join(``):``}function ct(e){return Array.isArray(e.content)?e.content.filter(e=>e.type===`tool_call`).map(e=>({id:e.id??``,name:e.name??``,parameters:e.arguments??{}})):[]}const lt=h(`@x-otto/service:chat`);function ut(e){return Oe(ke(e.req.header(`Authorization`)))}function dt(e){let t=new m;return t.post(`/query`,async t=>{let{message:n,sessionId:r}=await t.req.json().catch(()=>({}));if(!n)return t.json({status:`error`,message:`message is required`},400);let i=r?e.getSession(r):e.getActiveSession();if(!i)return t.json({status:`error`,message:`no active session`},404);let a=e.router.writeLease,o=ut(t);if(a&&!a.canClientWrite(i.id,o)){let e=a.ownerOf(i.id);return lt.info({sessionId:i.id,clientId:o,leaseOwner:e},`HTTP /query denied by write-lease`),t.json({status:`error`,message:`write-lease held by another client`,leaseOwner:e},409)}return i.prompt(n).catch(t=>{lt.error({sessionId:i.id,err:t},`prompt failed`),e.ws.sendToSession(i.id,{type:`Runtime.error`,data:{sessionId:i.id,message:`prompt failed`,code:`PROMPT_FAILED`}})}),t.json({status:`ok`,message:`prompt accepted`,sessionId:i.id})}),t.get(`/messages`,t=>{let n=e.getActiveSession();return n?t.json(at(n)):t.json([])}),t.post(`/interrupt`,t=>{let n=e.getActiveSession();if(!n)return t.json({status:`error`,message:`no active session`},404);let r=e.router.writeLease,i=ut(t);if(r&&!r.canClientWrite(n.id,i)){let e=r.ownerOf(n.id);return t.json({status:`error`,message:`write-lease held by another client`,leaseOwner:e},409)}return n.abort(),t.json({status:`ok`,message:`interrupted`})}),t.delete(`/clear`,async t=>{let n=e.getActiveSession();if(!n)return t.json({status:`error`,message:`no active session`},404);let r=e.router.writeLease,i=ut(t);if(r&&!r.canClientWrite(n.id,i)){let e=r.ownerOf(n.id);return t.json({status:`error`,message:`write-lease held by another client`,leaseOwner:e},409)}return await n.clearContext(),t.json({status:`ok`,message:`cleared`})}),t}function ft(e,t){let n=f(e,t);return n===``||!n.startsWith(`..${ee}`)&&n!==`..`&&!u(n)}function pt(t,n){if(n.startsWith(`~`))return null;let i=p(t),a=p(i,n);if(!ft(i,a))return null;if(e(a))try{let e=r(a);if(!ft(r(i),e))return null}catch{return null}return a}function mt(t){let r=new m;return r.post(`/verify-path`,async e=>{let n=(await e.req.json().catch(()=>({}))).path,r=t.app.workspaceDir;if(!n)return e.json({exists:!1,isDirectory:!1,error:`path is required`},400);if(!r)return e.json({exists:!1,isDirectory:!1,error:`workspace not configured`},403);let a=pt(r,n);if(!a)return e.json({exists:!1,isDirectory:!1,error:`path is outside workspace`},403);try{let t=i(a);return e.json({exists:!0,isDirectory:t.isDirectory(),path:a})}catch{return e.json({exists:!1,isDirectory:!1,path:a})}}),r.post(`/browse-directory`,async r=>{let i=await r.req.json().catch(()=>({})),a=t.app.workspaceDir,o=i.showHidden??!1;if(!a)return r.json({currentPath:null,parentPath:null,directories:[],error:`workspace not configured`},403);let s=p(a),l=pt(a,i.path||s);if(!l)return r.json({currentPath:null,parentPath:null,directories:[],error:`path is outside workspace`},403);let u=l===s?s:c(l);if(!e(l))return r.json({currentPath:l,parentPath:u,directories:[],error:`path does not exist`});try{let e=n(l,{withFileTypes:!0}).filter(e=>e.isDirectory()).filter(e=>o||!e.name.startsWith(`.`)).map(e=>({name:e.name,path:d(l,e.name)})).sort((e,t)=>e.name.localeCompare(t.name));return r.json({currentPath:l,parentPath:u,directories:e,error:null})}catch{return r.json({currentPath:l,parentPath:u,directories:[],error:`failed to read directory`})}}),r.get(`/files`,e=>{let r=e.req.query(`query`);try{let i=n(t.app.workspaceDir,{withFileTypes:!0}).map(e=>({path:d(t.app.workspaceDir,e.name),name:e.name,isFile:e.isFile()}));if(r){let e=r.toLowerCase();i=i.filter(t=>t.name.toLowerCase().includes(e))}return e.json({files:i})}catch{return e.json({files:[]})}}),r}const x=h(`@x-otto/service:timetravel`);function S(e){if(e===void 0)return;let t=Number(e);return Number.isInteger(t)?t:void 0}function ht(e){let t=new m,n=()=>e.app.sessionManager;return t.get(`/:id/checkpoints`,async e=>{let t=await n().listCheckpoints(e.req.param(`id`));return e.json({sessionId:e.req.param(`id`),checkpoints:t})}),t.post(`/:id/checkpoints`,async e=>{let t=e.req.param(`id`),r=await e.req.json().catch(()=>({}));try{let i=await n().createCheckpoint(t,{label:r.label,files:r.files});return e.json({checkpoint:i})}catch(n){return x.error({sessionId:t,err:n},`createCheckpoint failed`),e.json({error:C(400)},400)}}),t.post(`/:id/checkpoints/:seq/restore`,async e=>{let t=e.req.param(`id`),r=S(e.req.param(`seq`)),i=await e.req.json().catch(()=>({})),a={sessionId:t,seq:r,mode:i.mode,truncate:i.truncate};if(!ue(a))return e.json({error:`invalid Checkpoint.restore params (need seq:number, mode)`},400);try{return a.truncate?await n().rollbackToCheckpoint(a.sessionId,a.seq,a.mode):await n().restoreCheckpoint(a.sessionId,a.seq,a.mode),e.json({status:`ok`,sessionId:t,seq:a.seq,mode:a.mode,truncated:!!a.truncate})}catch(n){let r=_t(n);return x.error({sessionId:t,err:n},`checkpoint restore failed`),e.json({error:C(r)},r)}}),t.post(`/:id/checkpoints/:seq/fork`,async e=>{let t=e.req.param(`id`),r={sessionId:t,seq:S(e.req.param(`seq`)),newId:(await e.req.json().catch(()=>({}))).newId};if(!le(r))return e.json({error:`invalid Checkpoint.fork params (need seq:number)`},400);try{let i=await n().forkFromCheckpoint(r.sessionId,r.seq,r.newId);return e.json({status:`ok`,forkedSessionId:i.id,sourceSessionId:t,fromSeq:r.seq})}catch(n){let r=_t(n);return x.error({sessionId:t,err:n},`checkpoint fork failed`),e.json({error:C(r)},r)}}),t.get(`/:id/traceback`,async e=>{let t=e.req.param(`id`),r={sessionId:t,seq:S(e.req.query(`to`))};if(!de(r))return e.json({error:`query param "to" (trace seq) is required and must be an integer`},400);let i=await n().traceback(t,r.seq);return e.json(i)}),t.post(`/:id/replay`,async e=>{let t=e.req.param(`id`),r=await e.req.json().catch(()=>({}));if(!fe({sessionId:t,to:r.to}))return e.json({error:`invalid Replay.start params`},400);try{let i=await n().replaySession(t,r.newId);return e.json({status:`ok`,replaySessionId:i.id,sourceSessionId:t})}catch(n){return x.error({sessionId:t,err:n},`replay start failed`),e.json({error:C(400)},400)}}),t.get(`/:id/trace/summary`,async t=>{let n=t.req.param(`id`);try{let r=await ge(e.app.storage.traceStore.read(n));return t.json({sessionId:n,...r})}catch(e){return x.error({sessionId:n,err:e},`trace summary failed`),t.json({error:C(400)},400)}}),t.get(`/:id/trace/spans`,async t=>{let n=t.req.param(`id`);try{let r=await _e(e.app.storage.traceStore.read(n));return t.json({sessionId:n,spans:r})}catch(e){return x.error({sessionId:n,err:e},`trace spans failed`),t.json({error:C(400)},400)}}),t.get(`/:id/trace/timeline`,async t=>{let n=t.req.param(`id`);try{let r=await ve(e.app.storage.traceStore.read(n));return t.json(r)}catch(e){return x.error({sessionId:n,err:e},`trace timeline failed`),t.json({error:C(400)},400)}}),t.post(`/:id/otel-export`,async t=>{let n=me();if(!n)return t.json({error:`OTel export not enabled (set OTEL_EXPORTER_OTLP_ENDPOINT to opt in)`},503);let r=t.req.param(`id`),i=[];for await(let t of e.app.storage.traceStore.read(r))i.push(t.entry);let a=await pe(r,i,n,{includeContent:t.req.query(`includeContent`)===`true`});return t.json({sessionId:r,exported:a},a.ok?200:502)}),t}function gt(e){return e instanceof Error?e.message:String(e)}function _t(e){return/not found|unknown/i.test(gt(e))?404:400}function C(e){return e===404?`not found`:`request failed`}function vt(e){let t=new m;return t.get(`/`,t=>{let n=e.app.listSessions();return t.json(n.map(t=>({id:t.id,createdAt:t.createdAt.toISOString(),updatedAt:t.updatedAt?.toISOString(),messageCount:t.messageCount,workingDirectory:e.app.workspaceDir,title:t.title??t.id,status:t.status})))}),t.post(`/`,async t=>{await t.req.json().catch(()=>({}));let n=await e.app.createSession();return t.json({status:`ok`,message:`session created`,session:{id:n.id,workingDirectory:e.app.workspaceDir,createdAt:new Date().toISOString()}})}),t.get(`/current`,t=>{let n=e.getActiveSession();return n?t.json({id:n.id,workingDirectory:e.app.workspaceDir,messageCount:n.session.messages().length,status:n.status}):t.json({status:`error`,message:`no active session`},404)}),t.get(`/bridge-info`,t=>{let n=e.getActiveSession();return t.json({sessionId:n?.id??null})}),t.get(`/:id/messages`,t=>{let n=e.getSession(t.req.param(`id`));return n?t.json(at(n)):t.json([],404)}),t.get(`/:id/snapshot`,t=>{let n=e.getSessionSnapshot(t.req.param(`id`));return n?t.json(n):t.json({status:`error`,message:`session not found`},404)}),t.post(`/:id/resume`,t=>e.getSession(t.req.param(`id`))?t.json({status:`error`,message:`resume is not implemented`},501):t.json({status:`error`,message:`session not found`},404)),t.get(`/:id/trace`,async t=>{let n=t.req.param(`id`),r=e=>{if(e===void 0)return;let t=Number(e);return Number.isFinite(t)?t:void 0},i={from:r(t.req.query(`from`)),to:r(t.req.query(`to`))};try{let r=[];for await(let t of e.app.storage.traceStore.read(n,i))r.push({seq:t.seq,event:t.entry});return t.json({sessionId:n,events:r})}catch{return t.json({sessionId:n,events:[],error:`failed to read trace`},500)}}),t.get(`/:id/export`,t=>{let n=e.getSession(t.req.param(`id`));return n?t.json({id:n.id,messages:n.session.messages(),exportedAt:new Date().toISOString()}):t.json({status:`error`,message:`session not found`},404)}),t.get(`/:id/model`,t=>{let n=e.getSession(t.req.param(`id`));if(!n)return t.json({},404);let r=n.model;return t.json(r?{id:r.id,provider:r.provider}:{})}),t.put(`/:id/model`,async t=>{let n=e.getSession(t.req.param(`id`));if(!n)return t.json({status:`error`,message:`session not found`},404);let r=(await t.req.json().catch(()=>({}))).modelId;if(!r)return t.json({status:`error`,message:`modelId is required`},400);let i=e.app.getAllModels().find(e=>e.id===r);return i?(n.model=i,t.json({status:`ok`,model:{id:i.id,provider:i.provider}})):t.json({status:`error`,message:`model not found: ${r}`},404)}),t.delete(`/:id/model`,e=>e.json({status:`error`,message:`model overlay is not implemented`},501)),t.route(`/`,mt(e)),t.route(`/`,ht(e)),t}Object.freeze({status:`aborted`});function w(e,t,n){function r(n,r){if(n._zod||Object.defineProperty(n,`_zod`,{value:{def:r,constr:o,traits:new Set},enumerable:!1}),n._zod.traits.has(e))return;n._zod.traits.add(e),t(n,r);let i=o.prototype,a=Object.keys(i);for(let e=0;e<a.length;e++){let t=a[e];t in n||(n[t]=i[t].bind(n))}}let i=n?.Parent??Object;class a extends i{}Object.defineProperty(a,`name`,{value:e});function o(e){var t;let i=n?.Parent?new a:this;r(i,e),(t=i._zod).deferred??(t.deferred=[]);for(let e of i._zod.deferred)e();return i}return Object.defineProperty(o,`init`,{value:r}),Object.defineProperty(o,Symbol.hasInstance,{value:t=>n?.Parent&&t instanceof n.Parent?!0:t?._zod?.traits?.has(e)}),Object.defineProperty(o,`name`,{value:e}),o}var T=class extends Error{constructor(){super(`Encountered Promise during synchronous parse. Use .parseAsync() instead.`)}},yt=class extends Error{constructor(e){super(`Encountered unidirectional transform during encode: ${e}`),this.name=`ZodEncodeError`}};const E={};function D(e){return e&&Object.assign(E,e),E}function bt(e){let t=Object.values(e).filter(e=>typeof e==`number`);return Object.entries(e).filter(([e,n])=>t.indexOf(+e)===-1).map(([e,t])=>t)}function xt(e,t){return typeof t==`bigint`?t.toString():t}function St(e){return{get value(){{let t=e();return Object.defineProperty(this,`value`,{value:t}),t}throw Error(`cached value already set`)}}}function Ct(e){return e==null}function wt(e){let t=e.startsWith(`^`)?1:0,n=e.endsWith(`$`)?e.length-1:e.length;return e.slice(t,n)}const Tt=Symbol(`evaluating`);function O(e,t,n){let r;Object.defineProperty(e,t,{get(){if(r!==Tt)return r===void 0&&(r=Tt,r=n()),r},set(n){Object.defineProperty(e,t,{value:n})},configurable:!0})}function k(e,t,n){Object.defineProperty(e,t,{value:n,writable:!0,enumerable:!0,configurable:!0})}function A(...e){let t={};for(let n of e)Object.assign(t,Object.getOwnPropertyDescriptors(n));return Object.defineProperties({},t)}function Et(e){return JSON.stringify(e)}const Dt=`captureStackTrace`in Error?Error.captureStackTrace:(...e)=>{};function j(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const Ot=St(()=>{if(typeof navigator<`u`&&navigator?.userAgent?.includes(`Cloudflare`))return!1;try{return Function(``),!0}catch{return!1}});function M(e){if(j(e)===!1)return!1;let t=e.constructor;if(t===void 0||typeof t!=`function`)return!0;let n=t.prototype;return!(j(n)===!1||Object.prototype.hasOwnProperty.call(n,`isPrototypeOf`)===!1)}function kt(e){return M(e)?{...e}:Array.isArray(e)?[...e]:e}const At=new Set([`string`,`number`,`symbol`]);function jt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function N(e,t,n){let r=new e._zod.constr(t??e._zod.def);return(!t||n?.parent)&&(r._zod.parent=e),r}function P(e){let t=e;if(!t)return{};if(typeof t==`string`)return{error:()=>t};if(t?.message!==void 0){if(t?.error!==void 0)throw Error("Cannot specify both `message` and `error` params");t.error=t.message}return delete t.message,typeof t.error==`string`?{...t,error:()=>t.error}:t}function Mt(e){return Object.keys(e).filter(t=>e[t]._zod.optin===`optional`&&e[t]._zod.optout===`optional`)}-Number.MAX_VALUE,Number.MAX_VALUE;function Nt(e,t){let n=e._zod.def,r=n.checks;if(r&&r.length>0)throw Error(`.pick() cannot be used on object schemas containing refinements`);return N(e,A(e._zod.def,{get shape(){let e={};for(let r in t){if(!(r in n.shape))throw Error(`Unrecognized key: "${r}"`);t[r]&&(e[r]=n.shape[r])}return k(this,`shape`,e),e},checks:[]}))}function Pt(e,t){let n=e._zod.def,r=n.checks;if(r&&r.length>0)throw Error(`.omit() cannot be used on object schemas containing refinements`);return N(e,A(e._zod.def,{get shape(){let r={...e._zod.def.shape};for(let e in t){if(!(e in n.shape))throw Error(`Unrecognized key: "${e}"`);t[e]&&delete r[e]}return k(this,`shape`,r),r},checks:[]}))}function Ft(e,t){if(!M(t))throw Error(`Invalid input to extend: expected a plain object`);let n=e._zod.def.checks;if(n&&n.length>0){let n=e._zod.def.shape;for(let e in t)if(Object.getOwnPropertyDescriptor(n,e)!==void 0)throw Error("Cannot overwrite keys on object schemas containing refinements. Use `.safeExtend()` instead.")}return N(e,A(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t};return k(this,`shape`,n),n}}))}function It(e,t){if(!M(t))throw Error(`Invalid input to safeExtend: expected a plain object`);return N(e,A(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t};return k(this,`shape`,n),n}}))}function Lt(e,t){return N(e,A(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t._zod.def.shape};return k(this,`shape`,n),n},get catchall(){return t._zod.def.catchall},checks:[]}))}function Rt(e,t,n){let r=t._zod.def.checks;if(r&&r.length>0)throw Error(`.partial() cannot be used on object schemas containing refinements`);return N(t,A(t._zod.def,{get shape(){let r=t._zod.def.shape,i={...r};if(n)for(let t in n){if(!(t in r))throw Error(`Unrecognized key: "${t}"`);n[t]&&(i[t]=e?new e({type:`optional`,innerType:r[t]}):r[t])}else for(let t in r)i[t]=e?new e({type:`optional`,innerType:r[t]}):r[t];return k(this,`shape`,i),i},checks:[]}))}function zt(e,t,n){return N(t,A(t._zod.def,{get shape(){let r=t._zod.def.shape,i={...r};if(n)for(let t in n){if(!(t in i))throw Error(`Unrecognized key: "${t}"`);n[t]&&(i[t]=new e({type:`nonoptional`,innerType:r[t]}))}else for(let t in r)i[t]=new e({type:`nonoptional`,innerType:r[t]});return k(this,`shape`,i),i}}))}function F(e,t=0){if(e.aborted===!0)return!0;for(let n=t;n<e.issues.length;n++)if(e.issues[n]?.continue!==!0)return!0;return!1}function Bt(e,t){return t.map(t=>{var n;return(n=t).path??(n.path=[]),t.path.unshift(e),t})}function I(e){return typeof e==`string`?e:e?.message}function L(e,t,n){let r={...e,path:e.path??[]};return e.message||(r.message=I(e.inst?._zod.def?.error?.(e))??I(t?.error?.(e))??I(n.customError?.(e))??I(n.localeError?.(e))??`Invalid input`),delete r.inst,delete r.continue,t?.reportInput||delete r.input,r}function Vt(e){return Array.isArray(e)?`array`:typeof e==`string`?`string`:`unknown`}function R(...e){let[t,n,r]=e;return typeof t==`string`?{message:t,code:`custom`,input:n,inst:r}:{...t}}const Ht=(e,t)=>{e.name=`$ZodError`,Object.defineProperty(e,`_zod`,{value:e._zod,enumerable:!1}),Object.defineProperty(e,`issues`,{value:t,enumerable:!1}),e.message=JSON.stringify(t,xt,2),Object.defineProperty(e,`toString`,{value:()=>e.message,enumerable:!1})},Ut=w(`$ZodError`,Ht),Wt=w(`$ZodError`,Ht,{Parent:Error});function Gt(e,t=e=>e.message){let n={},r=[];for(let i of e.issues)i.path.length>0?(n[i.path[0]]=n[i.path[0]]||[],n[i.path[0]].push(t(i))):r.push(t(i));return{formErrors:r,fieldErrors:n}}function Kt(e,t=e=>e.message){let n={_errors:[]},r=e=>{for(let i of e.issues)if(i.code===`invalid_union`&&i.errors.length)i.errors.map(e=>r({issues:e}));else if(i.code===`invalid_key`)r({issues:i.issues});else if(i.code===`invalid_element`)r({issues:i.issues});else if(i.path.length===0)n._errors.push(t(i));else{let e=n,r=0;for(;r<i.path.length;){let n=i.path[r];r===i.path.length-1?(e[n]=e[n]||{_errors:[]},e[n]._errors.push(t(i))):e[n]=e[n]||{_errors:[]},e=e[n],r++}}};return r(e),n}const qt=e=>(t,n,r,i)=>{let a=r?Object.assign(r,{async:!1}):{async:!1},o=t._zod.run({value:n,issues:[]},a);if(o instanceof Promise)throw new T;if(o.issues.length){let t=new(i?.Err??e)(o.issues.map(e=>L(e,a,D())));throw Dt(t,i?.callee),t}return o.value},Jt=e=>async(t,n,r,i)=>{let a=r?Object.assign(r,{async:!0}):{async:!0},o=t._zod.run({value:n,issues:[]},a);if(o instanceof Promise&&(o=await o),o.issues.length){let t=new(i?.Err??e)(o.issues.map(e=>L(e,a,D())));throw Dt(t,i?.callee),t}return o.value},z=e=>(t,n,r)=>{let i=r?{...r,async:!1}:{async:!1},a=t._zod.run({value:n,issues:[]},i);if(a instanceof Promise)throw new T;return a.issues.length?{success:!1,error:new(e??Ut)(a.issues.map(e=>L(e,i,D())))}:{success:!0,data:a.value}},Yt=z(Wt),B=e=>async(t,n,r)=>{let i=r?Object.assign(r,{async:!0}):{async:!0},a=t._zod.run({value:n,issues:[]},i);return a instanceof Promise&&(a=await a),a.issues.length?{success:!1,error:new e(a.issues.map(e=>L(e,i,D())))}:{success:!0,data:a.value}},Xt=B(Wt),Zt=e=>(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return qt(e)(t,n,i)},Qt=e=>(t,n,r)=>qt(e)(t,n,r),$t=e=>async(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return Jt(e)(t,n,i)},en=e=>async(t,n,r)=>Jt(e)(t,n,r),tn=e=>(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return z(e)(t,n,i)},nn=e=>(t,n,r)=>z(e)(t,n,r),rn=e=>async(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return B(e)(t,n,i)},an=e=>async(t,n,r)=>B(e)(t,n,r),V=w(`$ZodCheck`,(e,t)=>{var n;e._zod??={},e._zod.def=t,(n=e._zod).onattach??(n.onattach=[])}),on=w(`$ZodCheckMaxLength`,(e,t)=>{var n;V.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!Ct(t)&&t.length!==void 0}),e._zod.onattach.push(e=>{let n=e._zod.bag.maximum??1/0;t.maximum<n&&(e._zod.bag.maximum=t.maximum)}),e._zod.check=n=>{let r=n.value;if(r.length<=t.maximum)return;let i=Vt(r);n.issues.push({origin:i,code:`too_big`,maximum:t.maximum,inclusive:!0,input:r,inst:e,continue:!t.abort})}}),sn=w(`$ZodCheckMinLength`,(e,t)=>{var n;V.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!Ct(t)&&t.length!==void 0}),e._zod.onattach.push(e=>{let n=e._zod.bag.minimum??-1/0;t.minimum>n&&(e._zod.bag.minimum=t.minimum)}),e._zod.check=n=>{let r=n.value;if(r.length>=t.minimum)return;let i=Vt(r);n.issues.push({origin:i,code:`too_small`,minimum:t.minimum,inclusive:!0,input:r,inst:e,continue:!t.abort})}}),cn=w(`$ZodCheckLengthEquals`,(e,t)=>{var n;V.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!Ct(t)&&t.length!==void 0}),e._zod.onattach.push(e=>{let n=e._zod.bag;n.minimum=t.length,n.maximum=t.length,n.length=t.length}),e._zod.check=n=>{let r=n.value,i=r.length;if(i===t.length)return;let a=Vt(r),o=i>t.length;n.issues.push({origin:a,...o?{code:`too_big`,maximum:t.length}:{code:`too_small`,minimum:t.length},inclusive:!0,exact:!0,input:n.value,inst:e,continue:!t.abort})}}),ln=w(`$ZodCheckOverwrite`,(e,t)=>{V.init(e,t),e._zod.check=e=>{e.value=t.tx(e.value)}});var un=class{constructor(e=[]){this.content=[],this.indent=0,this&&(this.args=e)}indented(e){this.indent+=1,e(this),--this.indent}write(e){if(typeof e==`function`){e(this,{execution:`sync`}),e(this,{execution:`async`});return}let t=e.split(`
1
+ import{existsSync as e,readFileSync as t,readdirSync as n,realpathSync as r,statSync as i}from"node:fs";import{createHash as a,randomUUID as o,timingSafeEqual as s}from"node:crypto";import{dirname as c,extname as l,isAbsolute as u,join as d,relative as f,resolve as p,sep as ee}from"node:path";import{Hono as m}from"hono";import{createAdaptorServer as te,serve as ne}from"@hono/node-server";import{TypedEventEmitter as re,createLogger as h}from"@x-otto/shared";import{WebSocketServer as ie}from"ws";import{createProjectorState as ae,projectSessionEvent as oe,shouldShowPulseSurvey as se}from"@x-otto/session-contract";import{cors as ce}from"hono/cors";import{isCheckpointForkParams as le,isCheckpointRestoreParams as ue,isReplaySeekParams as de,isReplayStartParams as fe}from"@x-otto/devtools";import{exportSessionTrace as pe,otlpExporterFromEnv as me}from"@x-otto/otel";import{BREAKPOINT_POINTS as he,summarizeTrace as ge,traceToSpans as _e}from"@x-otto/agent";import{traceEventsToTimeline as ve}from"@x-otto/trace-view";import{streamSSE as ye}from"hono/streaming";import{globalAgentJobRegistry as g}from"@x-otto/runtime";import{DEFAULT_WORKSPACE_KEY as be,isValidWorkspaceId as xe}from"@x-otto/workspace";import{defineHook as Se}from"@x-otto/hooks";import{SqlitePersistence as Ce,StorageHost as we,acquireDb as Te,releaseDb as Ee}from"@x-otto/persistence";import{SCHEDULE_LEASE_MIGRATIONS as De}from"@x-otto/schedule";function Oe(e){return e?a(`sha256`).update(e).digest(`hex`).slice(0,16):`local`}function ke(e){if(!e)return;let t=/^Bearer\s+(.+)$/i.exec(e);return t?t[1]:void 0}function Ae(e){try{return new URL(e??`/`,`http://localhost`).searchParams.get(`token`)??void 0}catch{return}}const _=h(`@x-otto/service:websocket-manager`),je=new Set([`localhost`,`127.0.0.1`,`::1`,`[::1]`]);var Me=class extends re{wss;clients=new Map;sessionSubscriptions=new Map;options;maxMessagesPerSecond;maxConnections;clientId=0;clientIdentities=new Map;onClientDisconnected;identityOf(e){return this.clientIdentities.get(e)??e}get clientCount(){return this.clients.size}constructor(e={}){super(),this.options=e,this.maxMessagesPerSecond=e.maxMessagesPerSecond??100,this.maxConnections=e.maxConnections??256,this.wss=new ie({noServer:!0,maxPayload:e.maxPayloadBytes??1048576}),this.wss.on(`connection`,this.onConnection)}handleUpgrade(e,t,n,r){return r===`/ws`?this.isOriginAllowed(e)?this.isTokenValid(e)?this.clients.size>=this.maxConnections?(_.warn({active:this.clients.size},`ws upgrade rejected: max connections reached`),this.rejectUpgrade(t,`503 Service Unavailable`),!0):(this.wss.handleUpgrade(e,t,n,t=>this.wss.emit(`connection`,t,e)),!0):(_.warn(`ws upgrade rejected: invalid auth token`),this.rejectUpgrade(t,`401 Unauthorized`),!0):(_.warn({origin:e.headers.origin},`ws upgrade rejected: origin not allowed`),this.rejectUpgrade(t,`403 Forbidden`),!0):!1}rejectUpgrade(e,t){e.on(`error`,()=>{});try{e.write(`HTTP/1.1 ${t}\r\nConnection: close\r\n\r\n`),e.destroy()}catch{}}isOriginAllowed(e){let t=e.headers.origin;if(!t||this.options.allowedOrigins?.includes(t))return!0;try{return je.has(new URL(t).hostname)}catch{return!1}}isTokenValid(e){let{authToken:t}=this.options;if(!t)return!0;try{let n=new URL(e.url??`/`,`http://localhost`).searchParams.get(`token`);if(n===null)return!1;let r=Buffer.from(n),i=Buffer.from(t);return r.length===i.length&&s(r,i)}catch{return!1}}broadcast(e){let t=JSON.stringify(e);for(let[,e]of this.clients)e.readyState===e.OPEN&&e.send(t)}sendToSession(e,t){this.sendToSubscribers(e,t)}sendToSubscribers(e,t){let n=this.sessionSubscriptions.get(e);if(!n||n.size===0)return;let r=JSON.stringify(t);for(let e of n){let t=this.clients.get(e);t&&t.readyState===t.OPEN&&t.send(r)}}subscribeClient(e,t){t&&(this.sessionSubscriptions.has(t)||this.sessionSubscriptions.set(t,new Set),this.sessionSubscriptions.get(t)?.add(e))}unsubscribeClient(e,t){t&&this.sessionSubscriptions.get(t)?.delete(e)}clearSessionSubscriptions(e){this.sessionSubscriptions.delete(e)}sendToClient(e,t){let n=this.clients.get(e);n&&n.readyState===n.OPEN&&n.send(JSON.stringify(t))}sendToIdentity(e,t){let n=JSON.stringify(t);for(let[t,r]of this.clientIdentities){if(r!==e)continue;let i=this.clients.get(t);i&&i.readyState===i.OPEN&&i.send(n)}}close(){for(let[,e]of this.clients)e.close();this.clients.clear(),this.sessionSubscriptions.clear(),this.wss.close()}onConnection=(e,t)=>{let n=String(++this.clientId);this.clients.set(n,e);let r=Oe(Ae(t?.url));this.clientIdentities.set(n,r),_.debug({clientId:n,identity:r},`client connected`),this.sendToClient(n,{type:`Runtime.connected`,data:{clientId:n}});let i=[];e.on(`message`,t=>{let r=Date.now(),a=r-1e3;for(;i.length>0&&i[0]<=a;)i.shift();if(i.length>=this.maxMessagesPerSecond){_.warn({clientId:n},`ws client rate limit exceeded, closing`),e.close(1008,`rate limit exceeded`);return}i.push(r);try{let e=JSON.parse(t.toString()),r=this.normalizeClientMessage(e);if(!r){_.warn({clientId:n},`invalid message`);return}if(this.handleSystemClientMessage(n,r))return;this.emit(`message`,n,r)}catch{_.warn({clientId:n},`invalid message`)}}),e.on(`close`,()=>{this.clients.delete(n);for(let[,e]of this.sessionSubscriptions)e.delete(n);this.clientIdentities.delete(n);let e=[...this.clientIdentities.values()].includes(r);e||this.onClientDisconnected?.(r),_.debug({clientId:n,identity:r,identityStillOnline:e},`client disconnected`)}),e.on(`error`,e=>{_.warn({clientId:n,err:e.message},`client error`)})};handleSystemClientMessage(e,t){switch(t.type){case`Runtime.ping`:return this.handleRuntimePing(e),!0;default:return!1}}handleRuntimePing(e){this.sendToClient(e,{type:`Runtime.pong`,data:{timestamp:Date.now()}})}normalizeClientMessage(e){if(!e||typeof e!=`object`||Array.isArray(e))return null;let t=e;if(typeof t.method==`string`){let e=t.method,n=this.asRecord(t.params);return typeof t.id==`number`&&(n.seq===void 0&&(n.seq=t.id),n.requestId===void 0&&(n.requestId=t.id)),{type:e,data:n}}return null}asRecord(e){return e&&typeof e==`object`&&!Array.isArray(e)?e:{}}};const Ne=h(`@x-otto/service:session-event-wire`);function Pe(e,t){return oe(e,t).map(e=>({type:`Session.event`,data:Fe(e)}))}function Fe(e){return e.kind===`error`?(Ne.error({sessionId:e.sessionId,code:e.code,message:e.message},`session error`),{...e,message:e.code===`STREAM_ERROR`?`stream error`:`session error`}):e}var Ie=class{unsubscribeSession;projector=ae();pulseSurveyState={};constructor(e,t,n){this.session=e,this.sender=t,this.app=n}attach(){this.unsubscribeSession=this.session.subscribe(e=>{let t=Pe(e,this.projector);for(let n of t)this.sender.sendToSession(e.sessionId,n);e.type===`prompt.end`&&this.maybeSendPulseSurvey(e.sessionId),e.type===`tool.call.end`&&this.maybeSendA2uiRendererPayload(e.sessionId,e)})}async maybeSendA2uiRendererPayload(e,t){if(this.app)try{let n={role:`tool_result`,name:t.toolCall.name,toolCallId:t.toolCall.id,content:[{type:`text`,text:t.resultText??``}],details:t.details},r=await this.app.resolveA2uiRendererPayload(n);if(!r||r.length===0)return;this.sender.sendToSession(e,{type:`Session.event`,data:{sessionId:e,kind:`a2ui.payload`,forToolCallId:t.toolCall.id,components:r}})}catch{}}maybeSendPulseSurvey(e){if(!this.app||!this.app.isFeedbackAvailable())return;let t=this.app.getPulseSurveyConfig();se(this.projector.currentTurn,{enabled:t?.enabled??!0,probability:t?.probability??.05,minTurnGap:t?.min_turn_gap??20,forcedUpgradeActive:!1},this.pulseSurveyState)&&(this.pulseSurveyState.lastShownTurn=this.projector.currentTurn,this.sender.sendToSession(e,{type:`Session.event`,data:{sessionId:e,kind:`pulse-survey.show`}}))}detach(){this.unsubscribeSession?.(),this.unsubscribeSession=void 0}};const Le=h(`@x-otto/service:trace-bridge`);var Re=class{iterator;stopped=!1;constructor(e,t,n){this.sessionId=e,this.traceStore=t,this.sender=n}attach(){this.iterator||(this.stopped=!1,this.iterator=this.traceStore.tail(this.sessionId)[Symbol.asyncIterator](),this.pump())}async pump(){let e=this.iterator;if(e)try{for(;!this.stopped;){let{value:t,done:n}=await e.next();if(n||this.stopped||!t)break;this.sender.sendToSubscribers(this.sessionId,{type:`Trace.event`,data:{sessionId:this.sessionId,seq:t.seq,event:t.entry}})}}catch(e){Le.warn({sessionId:this.sessionId,err:e instanceof Error?e.message:String(e)},`trace tail terminated`)}}detach(){this.stopped=!0,this.iterator?.return?.(),this.iterator=void 0}};function ze(e){switch(e.type){case`Debugger.paused`:return[{type:`Debugger.paused`,data:{reason:`breakpoint`,pauseId:e.pauseId,point:e.snapshot?.point,snapshot:e.snapshot,timestamp:new Date().toISOString()}}];case`Debugger.resumed`:return[{type:`Debugger.resumed`,data:{pauseId:e.pauseId,command:e.command,timestamp:new Date().toISOString()}}];case`Debugger.commandRejected`:return[{type:`Debugger.commandRejected`,data:{code:e.code,pauseId:e.pauseId,command:e.command,timestamp:new Date().toISOString()}}];default:return[]}}const Be=h(`@x-otto/service:debug-bridge`);var Ve=class extends re{logId=0;attached=!1;unsubs=[];logs=[];pauseSessionMap=new Map;constructor(e,t){super(),this.devtools=e,this.sender=t}attach(){if(this.attached)return;this.attached=!0;let e=this.devtools.controller;this.unsubs.push(e.on(`Debugger.paused`,({pauseId:e,snapshot:t})=>{let n=this.extractSessionId(t);n&&this.pauseSessionMap.set(e,n),this.forwardDebugEvent({type:`Debugger.paused`,pauseId:e,snapshot:t},n)}),e.on(`Debugger.resumed`,({pauseId:e,command:t})=>{let n=this.pauseSessionMap.get(e);this.pauseSessionMap.delete(e),this.forwardDebugEvent({type:`Debugger.resumed`,pauseId:e,command:t},n)}),e.on(`Debugger.commandRejected`,e=>{let t=e.pauseId,n=t?this.pauseSessionMap.get(t):void 0;this.forwardDebugEvent({type:`Debugger.commandRejected`,...e},n)}),e.on(`Log.entryAdded`,e=>{this.handleLogMessage(e)}))}detach(){for(let e of this.unsubs)e();this.unsubs.length=0,this.attached=!1,this.pauseSessionMap.clear()}extractSessionId(e){let t=e?.metadata?.sessionId;return typeof t==`string`&&t?t:void 0}get isConnected(){return this.attached}send(e,t){if(e.type===`setBreakpoint`){let t=e.point;t?this.devtools.debugger.setBreakpoint(t,e.enabled!==!1):Be.warn(`setBreakpoint command missing point, dropped`);return}if(e.type===`setBreakpointsActive`){e.active===!1?this.devtools.debugger.disableAllBreakpoints():this.devtools.debugger.enableAllBreakpoints();return}let n=typeof e.pauseId==`string`?e.pauseId:void 0;this.devtools.controller.resume(e,t,n)}getLogs(){return[...this.logs]}forwardDebugEvent(e,t){let n=ze(e);for(let e of n)t?this.sender.sendToSession(t,e):this.sender.broadcast(e)}handleLogMessage(e){if(e.level!==void 0||typeof e.msg==`string`){let t=e.time,n=typeof t==`number`?new Date(t).toISOString():typeof t==`string`?t:new Date().toISOString(),r={id:++this.logId,timestamp:n,level:this.normalizeLevel(e.level),module:e.name??`unknown`,message:e.msg??JSON.stringify(e),data:e};this.logs.push(r),this.logs.length>2e3&&this.logs.splice(0,this.logs.length-2e3),this.sender.broadcast({type:`Log.entryAdded`,data:{entry:r}}),this.emit(`Log.entryAdded`,r)}}normalizeLevel(e){if(typeof e==`string`){let t=e.toLowerCase();if([`trace`,`debug`,`info`,`warn`,`error`,`fatal`].includes(t))return t}return typeof e==`number`?e<=10?`trace`:e<=20?`debug`:e<=30?`info`:e<=40?`warn`:e<=50?`error`:`fatal`:`info`}};function He(e={}){let t=new Map,n=new Map,r=e.staleAfterMs??45e3,i=e=>{n.set(e,Date.now())};return{acquire(e,n){let r=t.get(e);return r===void 0||r===n?(t.set(e,n),i(e),{kind:`acquired`}):{kind:`denied`,leaseOwner:r}},release(e,r){let i=t.get(e);return i===void 0||i!==r?!1:(t.delete(e),n.delete(e),!0)},releaseAllForClient(e){let r=[];for(let[i,a]of t.entries())a===e&&(t.delete(i),n.delete(i),r.push(i));return r},ownerOf(e){return t.get(e)},canClientWrite(e,n){let r=t.get(e);return r===void 0||r===n},forceAcquire(e,n){let r=t.get(e);return t.set(e,n),i(e),{previousOwner:r,newOwner:n}},heartbeat(e,n){t.get(e)===n&&i(e)},evictStale(e=Date.now()){let i=[];for(let[a,o]of n.entries())e-o>r&&(t.delete(a),n.delete(a),i.push(a));return i}}}const v=h(`@x-otto/service:inbound-router`);function y(e,t){let n=e[t];return typeof n==`string`?n:void 0}function Ue(e,t){let n=e[t];return typeof n==`boolean`?n:void 0}function We(e,t){let n=e[t];return typeof n==`number`?n:void 0}function Ge(e,t){let n=e[t];return typeof n==`object`&&n&&!Array.isArray(n)?n:void 0}function Ke(e){let t=Ge(e,`answers`);if(!t)return null;let n=y(t,`answer`);return n===void 0?null:{answer:n,acceptedRecommendation:t.acceptedRecommendation===!0,resolvedBy:t.resolvedBy===`auto_recommendation`?`auto_recommendation`:`human`,selectedOptionLabels:Array.isArray(t.selectedOptionLabels)?t.selectedOptionLabels.filter(e=>typeof e==`string`):void 0,freeformText:y(t,`freeformText`)}}function qe(e){let t=y(e,`message`);return t?{message:t,sessionId:y(e,`sessionId`)}:null}function Je(e){let t=y(e,`approvalId`),n=Ue(e,`approved`);return!t||n===void 0?null:{approvalId:t,approved:n,sessionId:y(e,`sessionId`)}}function Ye(e){let t=y(e,`requestId`);if(!t)return null;let n=e.cancelled===!0;return{requestId:t,answers:n?null:Ke(e),cancelled:n,sessionId:y(e,`sessionId`)}}function Xe(e){let t=y(e,`requestId`),n=y(e,`action`);return!t||!n?null:{requestId:t,action:n,feedback:y(e,`feedback`),sessionId:y(e,`sessionId`)}}function b(e){let t=y(e,`sessionId`);if(!t)return null;let n=We(e,`since`);return n===void 0?{sessionId:t}:{sessionId:t,since:n}}function Ze(e){return{seq:We(e,`seq`),pauseId:y(e,`pauseId`),depth:We(e,`depth`)}}function Qe(e){let t=y(e,`point`),n=Ue(e,`enabled`);return t===void 0||n===void 0?null:{point:t,enabled:n}}function $e(e){let t=Ue(e,`active`);return t===void 0?null:{active:t}}var et=class{writeLease=He();constructor(e,t,n,r){this.ws=e,this.app=t,this.bridge=n,this.readEventsSince=r,this.ws.onClientDisconnected=e=>{let t=this.writeLease.releaseAllForClient(e);t.length>0&&v.debug({identity:e,released:t},`write-lease released on disconnect`)}}dispatch(e,t){let{type:n,data:r}=t,i=this.ws.identityOf?.(e)??e;switch(v.debug({clientId:e,identity:i,type:n},`message from client`),n){case`Session.subscribe`:{let t=b(r);t&&(this.ws.subscribeClient(e,t.sessionId),t.since!==void 0&&this.replaySince(e,t.sessionId,t.since));break}case`Session.unsubscribe`:{let t=b(r);t&&this.ws.unsubscribeClient(e,t.sessionId);break}case`Session.writeLease.acquire`:{let t=b(r);if(!t||!t.sessionId)break;let n=this.writeLease.acquire(t.sessionId,i);n.kind===`acquired`?this.ws.sendToClient(e,{type:`Runtime.writeLease`,data:{sessionId:t.sessionId,state:`acquired`,leaseOwner:i}}):this.ws.sendToClient(e,{type:`Runtime.writeLease`,data:{sessionId:t.sessionId,state:`denied`,reason:`lease held by another client`,leaseOwner:n.leaseOwner}});break}case`Session.writeLease.release`:{let t=b(r);if(!t||!t.sessionId)break;let n=this.writeLease.release(t.sessionId,i);this.ws.sendToClient(e,{type:`Runtime.writeLease`,data:{sessionId:t.sessionId,state:n?`released`:`not-held`,leaseOwner:n?void 0:this.writeLease.ownerOf(t.sessionId)}});break}case`Session.writeLease.force_acquire`:{let t=b(r);if(!t||!t.sessionId)break;let n=this.writeLease.forceAcquire(t.sessionId,i);v.warn({sessionId:t.sessionId,newOwner:i,previousOwner:n.previousOwner},`write-lease force-acquired`),n.previousOwner&&n.previousOwner!==i&&(this.ws.sendToIdentity?.bind(this.ws)??this.ws.sendToClient.bind(this.ws))(n.previousOwner,{type:`Runtime.writeLease`,data:{sessionId:t.sessionId,state:`released`,reason:`forced_by_other_client`,leaseOwner:n.newOwner}}),this.ws.sendToClient(e,{type:`Runtime.writeLease`,data:{sessionId:t.sessionId,state:`acquired`,leaseOwner:n.newOwner}});break}case`Chat.query`:{let t=qe(r);if(t){let n=t.sessionId;if(n&&!this.writeLease.canClientWrite(n,i)){let t=this.writeLease.ownerOf(n);v.info({sessionId:n,clientId:e,identity:i,leaseOwner:t},`Chat.query denied by write-lease`),this.ws.sendToClient(e,{type:`Runtime.error`,data:{sessionId:n,code:`WRITE_LEASE_DENIED`,message:`chat query denied — write-lease held by another client`,leaseOwner:t}});break}this.handleQuery(e,t)}break}case`Chat.approval`:{let e=Je(r);e&&this.handleApproval(e);break}case`Chat.askUserResponse`:{let e=Ye(r);e&&this.handleAskUserResponse(e);break}case`Chat.planApprovalResponse`:{let e=Xe(r);e&&this.handlePlanApprovalResponse(e);break}case`Debugger.resume`:case`Debugger.stepOver`:case`Debugger.stepInto`:case`Debugger.disable`:this.handleDebugCommand(n,Ze(r),r);break;case`Debugger.setBreakpoint`:{let e=Qe(r);e&&this.handleDebugSetBreakpoint(e);break}case`Debugger.setBreakpointsActive`:{let e=$e(r);e&&this.handleDebugSetBreakpointsActive(e);break}default:v.debug({type:n},`unknown client message type`)}}replaySince(e,t,n){if(!this.readEventsSince)return;let r=this.readEventsSince(t,n);if(!r.ok){v.warn({sessionId:t,after:n,oldest:r.oldestAvailable},`event log gap; client must resync`),this.ws.sendToClient(e,{type:`Runtime.error`,data:{sessionId:t,message:`event history gap — re-fetch the session snapshot`,code:`EVENT_LOG_GAP`}});return}for(let t of r.events){let n=t.message.type===`Session.event`?{...t.message,data:{...t.message.data,seq:t.seq}}:t.message;this.ws.sendToClient(e,n)}}resolveSession(e){return e?this.app.getSession(e):this.app.getActiveSession()}handleQuery(e,{message:t,sessionId:n}){let r=this.resolveSession(n);r&&r.prompt(t).catch(t=>{v.error({sessionId:r.id,err:t},`prompt failed`),this.ws.sendToClient(e,{type:`Runtime.error`,data:{sessionId:r.id,message:`prompt failed`,code:`PROMPT_FAILED`}})})}handleApproval({approvalId:e,approved:t,sessionId:n}){let r=this.resolveSession(n);r&&(r.resolveApproval(e,t),v.debug({sessionId:r.id,approved:t},`approval resolved`))}handleAskUserResponse({requestId:e,answers:t,sessionId:n}){let r=this.resolveSession(n);r&&(r.resolveAskUser(e,t),v.debug({sessionId:r.id,requestId:e},`ask_user resolved`))}handlePlanApprovalResponse({requestId:e,action:t,feedback:n,sessionId:r}){let i=this.resolveSession(r);i&&(i.resolvePlanApproval(e,t,n),v.debug({sessionId:i.id,action:t,requestId:e},`plan approval resolved`))}handleDebugCommand(e,{seq:t,pauseId:n,depth:r},i){if(!this.bridge)return;let a=Ge(i,`payload`);this.bridge.send({type:e,seq:t??Date.now(),...n===void 0?{}:{pauseId:n},...r===void 0?{}:{depth:r}},a)}handleDebugSetBreakpoint({point:e,enabled:t}){this.bridge&&this.bridge.send({type:`setBreakpoint`,seq:Date.now(),point:e,enabled:t})}handleDebugSetBreakpointsActive({active:e}){this.bridge&&this.bridge.send({type:`setBreakpointsActive`,seq:Date.now(),active:e})}};function tt(e,t){let n=Buffer.from(e),r=Buffer.from(t);return n.length===r.length?s(n,r):!1}function nt(e){return/^Bearer\s+(.+)$/i.exec(e.req.header(`authorization`)??``)?.[1]??``}function rt(e){let t=new m;return t.get(`/`,t=>{let n=e.app.storage.storageHost;return t.json({status:`ok`,service:`otto-coding`,uptime:process.uptime(),namespaces:n?.host?n.host.listNamespaces():null})}),t}function it(e){let t=new m;return t.get(`/`,t=>t.json(e.getAuthorityDescriptor())),t}function at(e){return e.session.messages().map(e=>{let t=ot(e);return{role:e.role,content:st(e),timestamp:`timestamp`in e?e.timestamp:void 0,toolCalls:ct(e),...t.length>0?{a2ui:t}:{}}})}function ot(e){return Array.isArray(e.content)?e.content.filter(e=>e&&typeof e==`object`&&e.type===`a2ui`&&Array.isArray(e.components)).map(e=>e.components):[]}function st(e){return typeof e.content==`string`?e.content:Array.isArray(e.content)?e.content.filter(e=>e.type===`text`).map(e=>e.text).join(``):``}function ct(e){return Array.isArray(e.content)?e.content.filter(e=>e.type===`tool_call`).map(e=>({id:e.id??``,name:e.name??``,parameters:e.arguments??{}})):[]}const lt=h(`@x-otto/service:chat`);function ut(e){return Oe(ke(e.req.header(`Authorization`)))}function dt(e){let t=new m;return t.post(`/query`,async t=>{let{message:n,sessionId:r}=await t.req.json().catch(()=>({}));if(!n)return t.json({status:`error`,message:`message is required`},400);let i=r?e.getSession(r):e.getActiveSession();if(!i)return t.json({status:`error`,message:`no active session`},404);let a=e.router.writeLease,o=ut(t);if(a&&!a.canClientWrite(i.id,o)){let e=a.ownerOf(i.id);return lt.info({sessionId:i.id,clientId:o,leaseOwner:e},`HTTP /query denied by write-lease`),t.json({status:`error`,message:`write-lease held by another client`,leaseOwner:e},409)}return i.prompt(n).catch(t=>{lt.error({sessionId:i.id,err:t},`prompt failed`),e.ws.sendToSession(i.id,{type:`Runtime.error`,data:{sessionId:i.id,message:`prompt failed`,code:`PROMPT_FAILED`}})}),t.json({status:`ok`,message:`prompt accepted`,sessionId:i.id})}),t.get(`/messages`,t=>{let n=e.getActiveSession();return n?t.json(at(n)):t.json([])}),t.post(`/interrupt`,t=>{let n=e.getActiveSession();if(!n)return t.json({status:`error`,message:`no active session`},404);let r=e.router.writeLease,i=ut(t);if(r&&!r.canClientWrite(n.id,i)){let e=r.ownerOf(n.id);return t.json({status:`error`,message:`write-lease held by another client`,leaseOwner:e},409)}return n.abort(),t.json({status:`ok`,message:`interrupted`})}),t.delete(`/clear`,async t=>{let n=e.getActiveSession();if(!n)return t.json({status:`error`,message:`no active session`},404);let r=e.router.writeLease,i=ut(t);if(r&&!r.canClientWrite(n.id,i)){let e=r.ownerOf(n.id);return t.json({status:`error`,message:`write-lease held by another client`,leaseOwner:e},409)}return await n.clearContext(),t.json({status:`ok`,message:`cleared`})}),t}function ft(e,t){let n=f(e,t);return n===``||!n.startsWith(`..${ee}`)&&n!==`..`&&!u(n)}function pt(t,n){if(n.startsWith(`~`))return null;let i=p(t),a=p(i,n);if(!ft(i,a))return null;if(e(a))try{let e=r(a);if(!ft(r(i),e))return null}catch{return null}return a}function mt(t){let r=new m;return r.post(`/verify-path`,async e=>{let n=(await e.req.json().catch(()=>({}))).path,r=t.app.workspaceDir;if(!n)return e.json({exists:!1,isDirectory:!1,error:`path is required`},400);if(!r)return e.json({exists:!1,isDirectory:!1,error:`workspace not configured`},403);let a=pt(r,n);if(!a)return e.json({exists:!1,isDirectory:!1,error:`path is outside workspace`},403);try{let t=i(a);return e.json({exists:!0,isDirectory:t.isDirectory(),path:a})}catch{return e.json({exists:!1,isDirectory:!1,path:a})}}),r.post(`/browse-directory`,async r=>{let i=await r.req.json().catch(()=>({})),a=t.app.workspaceDir,o=i.showHidden??!1;if(!a)return r.json({currentPath:null,parentPath:null,directories:[],error:`workspace not configured`},403);let s=p(a),l=pt(a,i.path||s);if(!l)return r.json({currentPath:null,parentPath:null,directories:[],error:`path is outside workspace`},403);let u=l===s?s:c(l);if(!e(l))return r.json({currentPath:l,parentPath:u,directories:[],error:`path does not exist`});try{let e=n(l,{withFileTypes:!0}).filter(e=>e.isDirectory()).filter(e=>o||!e.name.startsWith(`.`)).map(e=>({name:e.name,path:d(l,e.name)})).sort((e,t)=>e.name.localeCompare(t.name));return r.json({currentPath:l,parentPath:u,directories:e,error:null})}catch{return r.json({currentPath:l,parentPath:u,directories:[],error:`failed to read directory`})}}),r.get(`/files`,e=>{let r=e.req.query(`query`);try{let i=n(t.app.workspaceDir,{withFileTypes:!0}).map(e=>({path:d(t.app.workspaceDir,e.name),name:e.name,isFile:e.isFile()}));if(r){let e=r.toLowerCase();i=i.filter(t=>t.name.toLowerCase().includes(e))}return e.json({files:i})}catch{return e.json({files:[]})}}),r}const x=h(`@x-otto/service:timetravel`);function S(e){if(e===void 0)return;let t=Number(e);return Number.isInteger(t)?t:void 0}function ht(e){let t=new m,n=()=>e.app.sessionManager;return t.get(`/:id/checkpoints`,async e=>{let t=await n().listCheckpoints(e.req.param(`id`));return e.json({sessionId:e.req.param(`id`),checkpoints:t})}),t.post(`/:id/checkpoints`,async e=>{let t=e.req.param(`id`),r=await e.req.json().catch(()=>({}));try{let i=await n().createCheckpoint(t,{label:r.label,files:r.files});return e.json({checkpoint:i})}catch(n){return x.error({sessionId:t,err:n},`createCheckpoint failed`),e.json({error:C(400)},400)}}),t.post(`/:id/checkpoints/:seq/restore`,async e=>{let t=e.req.param(`id`),r=S(e.req.param(`seq`)),i=await e.req.json().catch(()=>({})),a={sessionId:t,seq:r,mode:i.mode,truncate:i.truncate};if(!ue(a))return e.json({error:`invalid Checkpoint.restore params (need seq:number, mode)`},400);try{return a.truncate?await n().rollbackToCheckpoint(a.sessionId,a.seq,a.mode):await n().restoreCheckpoint(a.sessionId,a.seq,a.mode),e.json({status:`ok`,sessionId:t,seq:a.seq,mode:a.mode,truncated:!!a.truncate})}catch(n){let r=_t(n);return x.error({sessionId:t,err:n},`checkpoint restore failed`),e.json({error:C(r)},r)}}),t.post(`/:id/checkpoints/:seq/fork`,async e=>{let t=e.req.param(`id`),r={sessionId:t,seq:S(e.req.param(`seq`)),newId:(await e.req.json().catch(()=>({}))).newId};if(!le(r))return e.json({error:`invalid Checkpoint.fork params (need seq:number)`},400);try{let i=await n().forkFromCheckpoint(r.sessionId,r.seq,r.newId);return e.json({status:`ok`,forkedSessionId:i.id,sourceSessionId:t,fromSeq:r.seq})}catch(n){let r=_t(n);return x.error({sessionId:t,err:n},`checkpoint fork failed`),e.json({error:C(r)},r)}}),t.get(`/:id/traceback`,async e=>{let t=e.req.param(`id`),r={sessionId:t,seq:S(e.req.query(`to`))};if(!de(r))return e.json({error:`query param "to" (trace seq) is required and must be an integer`},400);let i=await n().traceback(t,r.seq);return e.json(i)}),t.post(`/:id/replay`,async e=>{let t=e.req.param(`id`),r=await e.req.json().catch(()=>({}));if(!fe({sessionId:t,to:r.to}))return e.json({error:`invalid Replay.start params`},400);try{let i=await n().replaySession(t,r.newId);return e.json({status:`ok`,replaySessionId:i.id,sourceSessionId:t})}catch(n){return x.error({sessionId:t,err:n},`replay start failed`),e.json({error:C(400)},400)}}),t.get(`/:id/trace/summary`,async t=>{let n=t.req.param(`id`);try{let r=await ge(e.app.storage.traceStore.read(n));return t.json({sessionId:n,...r})}catch(e){return x.error({sessionId:n,err:e},`trace summary failed`),t.json({error:C(400)},400)}}),t.get(`/:id/trace/spans`,async t=>{let n=t.req.param(`id`);try{let r=await _e(e.app.storage.traceStore.read(n));return t.json({sessionId:n,spans:r})}catch(e){return x.error({sessionId:n,err:e},`trace spans failed`),t.json({error:C(400)},400)}}),t.get(`/:id/trace/timeline`,async t=>{let n=t.req.param(`id`);try{let r=await ve(e.app.storage.traceStore.read(n));return t.json(r)}catch(e){return x.error({sessionId:n,err:e},`trace timeline failed`),t.json({error:C(400)},400)}}),t.post(`/:id/otel-export`,async t=>{let n=me();if(!n)return t.json({error:`OTel export not enabled (set OTEL_EXPORTER_OTLP_ENDPOINT to opt in)`},503);let r=t.req.param(`id`),i=[];for await(let t of e.app.storage.traceStore.read(r))i.push(t.entry);let a=await pe(r,i,n,{includeContent:t.req.query(`includeContent`)===`true`});return t.json({sessionId:r,exported:a},a.ok?200:502)}),t}function gt(e){return e instanceof Error?e.message:String(e)}function _t(e){return/not found|unknown/i.test(gt(e))?404:400}function C(e){return e===404?`not found`:`request failed`}function vt(e){let t=new m;return t.get(`/`,t=>{let n=e.app.listSessions();return t.json(n.map(t=>({id:t.id,createdAt:t.createdAt.toISOString(),updatedAt:t.updatedAt?.toISOString(),messageCount:t.messageCount,workingDirectory:e.app.workspaceDir,title:t.title??t.id,status:t.status})))}),t.post(`/`,async t=>{await t.req.json().catch(()=>({}));let n=await e.app.createSession();return t.json({status:`ok`,message:`session created`,session:{id:n.id,workingDirectory:e.app.workspaceDir,createdAt:new Date().toISOString()}})}),t.get(`/current`,t=>{let n=e.getActiveSession();return n?t.json({id:n.id,workingDirectory:e.app.workspaceDir,messageCount:n.session.messages().length,status:n.status}):t.json({status:`error`,message:`no active session`},404)}),t.get(`/bridge-info`,t=>{let n=e.getActiveSession();return t.json({sessionId:n?.id??null})}),t.get(`/:id/messages`,t=>{let n=e.getSession(t.req.param(`id`));return n?t.json(at(n)):t.json([],404)}),t.get(`/:id/snapshot`,t=>{let n=e.getSessionSnapshot(t.req.param(`id`));return n?t.json(n):t.json({status:`error`,message:`session not found`},404)}),t.post(`/:id/resume`,t=>e.getSession(t.req.param(`id`))?t.json({status:`error`,message:`resume is not implemented`},501):t.json({status:`error`,message:`session not found`},404)),t.get(`/:id/trace`,async t=>{let n=t.req.param(`id`),r=e=>{if(e===void 0)return;let t=Number(e);return Number.isFinite(t)?t:void 0},i={from:r(t.req.query(`from`)),to:r(t.req.query(`to`))};try{let r=[];for await(let t of e.app.storage.traceStore.read(n,i))r.push({seq:t.seq,event:t.entry});return t.json({sessionId:n,events:r})}catch{return t.json({sessionId:n,events:[],error:`failed to read trace`},500)}}),t.get(`/:id/export`,t=>{let n=e.getSession(t.req.param(`id`));return n?t.json({id:n.id,messages:n.session.messages(),exportedAt:new Date().toISOString()}):t.json({status:`error`,message:`session not found`},404)}),t.get(`/:id/model`,t=>{let n=e.getSession(t.req.param(`id`));if(!n)return t.json({},404);let r=n.model;return t.json(r?{id:r.id,provider:r.provider}:{})}),t.put(`/:id/model`,async t=>{let n=e.getSession(t.req.param(`id`));if(!n)return t.json({status:`error`,message:`session not found`},404);let r=(await t.req.json().catch(()=>({}))).modelId;if(!r)return t.json({status:`error`,message:`modelId is required`},400);let i=e.app.getAllModels().find(e=>e.id===r);return i?(n.model=i,t.json({status:`ok`,model:{id:i.id,provider:i.provider}})):t.json({status:`error`,message:`model not found: ${r}`},404)}),t.delete(`/:id/model`,e=>e.json({status:`error`,message:`model overlay is not implemented`},501)),t.route(`/`,mt(e)),t.route(`/`,ht(e)),t}Object.freeze({status:`aborted`});function w(e,t,n){function r(n,r){if(n._zod||Object.defineProperty(n,`_zod`,{value:{def:r,constr:o,traits:new Set},enumerable:!1}),n._zod.traits.has(e))return;n._zod.traits.add(e),t(n,r);let i=o.prototype,a=Object.keys(i);for(let e=0;e<a.length;e++){let t=a[e];t in n||(n[t]=i[t].bind(n))}}let i=n?.Parent??Object;class a extends i{}Object.defineProperty(a,`name`,{value:e});function o(e){var t;let i=n?.Parent?new a:this;r(i,e),(t=i._zod).deferred??(t.deferred=[]);for(let e of i._zod.deferred)e();return i}return Object.defineProperty(o,`init`,{value:r}),Object.defineProperty(o,Symbol.hasInstance,{value:t=>n?.Parent&&t instanceof n.Parent?!0:t?._zod?.traits?.has(e)}),Object.defineProperty(o,`name`,{value:e}),o}var T=class extends Error{constructor(){super(`Encountered Promise during synchronous parse. Use .parseAsync() instead.`)}},yt=class extends Error{constructor(e){super(`Encountered unidirectional transform during encode: ${e}`),this.name=`ZodEncodeError`}};const E={};function D(e){return e&&Object.assign(E,e),E}function bt(e){let t=Object.values(e).filter(e=>typeof e==`number`);return Object.entries(e).filter(([e,n])=>t.indexOf(+e)===-1).map(([e,t])=>t)}function xt(e,t){return typeof t==`bigint`?t.toString():t}function St(e){return{get value(){{let t=e();return Object.defineProperty(this,`value`,{value:t}),t}throw Error(`cached value already set`)}}}function Ct(e){return e==null}function wt(e){let t=e.startsWith(`^`)?1:0,n=e.endsWith(`$`)?e.length-1:e.length;return e.slice(t,n)}const Tt=Symbol(`evaluating`);function O(e,t,n){let r;Object.defineProperty(e,t,{get(){if(r!==Tt)return r===void 0&&(r=Tt,r=n()),r},set(n){Object.defineProperty(e,t,{value:n})},configurable:!0})}function k(e,t,n){Object.defineProperty(e,t,{value:n,writable:!0,enumerable:!0,configurable:!0})}function A(...e){let t={};for(let n of e)Object.assign(t,Object.getOwnPropertyDescriptors(n));return Object.defineProperties({},t)}function Et(e){return JSON.stringify(e)}const Dt=`captureStackTrace`in Error?Error.captureStackTrace:(...e)=>{};function j(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const Ot=St(()=>{if(typeof navigator<`u`&&navigator?.userAgent?.includes(`Cloudflare`))return!1;try{return Function(``),!0}catch{return!1}});function M(e){if(j(e)===!1)return!1;let t=e.constructor;if(t===void 0||typeof t!=`function`)return!0;let n=t.prototype;return!(j(n)===!1||Object.prototype.hasOwnProperty.call(n,`isPrototypeOf`)===!1)}function kt(e){return M(e)?{...e}:Array.isArray(e)?[...e]:e}const At=new Set([`string`,`number`,`symbol`]);function jt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function N(e,t,n){let r=new e._zod.constr(t??e._zod.def);return(!t||n?.parent)&&(r._zod.parent=e),r}function P(e){let t=e;if(!t)return{};if(typeof t==`string`)return{error:()=>t};if(t?.message!==void 0){if(t?.error!==void 0)throw Error("Cannot specify both `message` and `error` params");t.error=t.message}return delete t.message,typeof t.error==`string`?{...t,error:()=>t.error}:t}function Mt(e){return Object.keys(e).filter(t=>e[t]._zod.optin===`optional`&&e[t]._zod.optout===`optional`)}-Number.MAX_VALUE,Number.MAX_VALUE;function Nt(e,t){let n=e._zod.def,r=n.checks;if(r&&r.length>0)throw Error(`.pick() cannot be used on object schemas containing refinements`);return N(e,A(e._zod.def,{get shape(){let e={};for(let r in t){if(!(r in n.shape))throw Error(`Unrecognized key: "${r}"`);t[r]&&(e[r]=n.shape[r])}return k(this,`shape`,e),e},checks:[]}))}function Pt(e,t){let n=e._zod.def,r=n.checks;if(r&&r.length>0)throw Error(`.omit() cannot be used on object schemas containing refinements`);return N(e,A(e._zod.def,{get shape(){let r={...e._zod.def.shape};for(let e in t){if(!(e in n.shape))throw Error(`Unrecognized key: "${e}"`);t[e]&&delete r[e]}return k(this,`shape`,r),r},checks:[]}))}function Ft(e,t){if(!M(t))throw Error(`Invalid input to extend: expected a plain object`);let n=e._zod.def.checks;if(n&&n.length>0){let n=e._zod.def.shape;for(let e in t)if(Object.getOwnPropertyDescriptor(n,e)!==void 0)throw Error("Cannot overwrite keys on object schemas containing refinements. Use `.safeExtend()` instead.")}return N(e,A(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t};return k(this,`shape`,n),n}}))}function It(e,t){if(!M(t))throw Error(`Invalid input to safeExtend: expected a plain object`);return N(e,A(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t};return k(this,`shape`,n),n}}))}function Lt(e,t){return N(e,A(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t._zod.def.shape};return k(this,`shape`,n),n},get catchall(){return t._zod.def.catchall},checks:[]}))}function Rt(e,t,n){let r=t._zod.def.checks;if(r&&r.length>0)throw Error(`.partial() cannot be used on object schemas containing refinements`);return N(t,A(t._zod.def,{get shape(){let r=t._zod.def.shape,i={...r};if(n)for(let t in n){if(!(t in r))throw Error(`Unrecognized key: "${t}"`);n[t]&&(i[t]=e?new e({type:`optional`,innerType:r[t]}):r[t])}else for(let t in r)i[t]=e?new e({type:`optional`,innerType:r[t]}):r[t];return k(this,`shape`,i),i},checks:[]}))}function zt(e,t,n){return N(t,A(t._zod.def,{get shape(){let r=t._zod.def.shape,i={...r};if(n)for(let t in n){if(!(t in i))throw Error(`Unrecognized key: "${t}"`);n[t]&&(i[t]=new e({type:`nonoptional`,innerType:r[t]}))}else for(let t in r)i[t]=new e({type:`nonoptional`,innerType:r[t]});return k(this,`shape`,i),i}}))}function F(e,t=0){if(e.aborted===!0)return!0;for(let n=t;n<e.issues.length;n++)if(e.issues[n]?.continue!==!0)return!0;return!1}function Bt(e,t){return t.map(t=>{var n;return(n=t).path??(n.path=[]),t.path.unshift(e),t})}function I(e){return typeof e==`string`?e:e?.message}function L(e,t,n){let r={...e,path:e.path??[]};return e.message||(r.message=I(e.inst?._zod.def?.error?.(e))??I(t?.error?.(e))??I(n.customError?.(e))??I(n.localeError?.(e))??`Invalid input`),delete r.inst,delete r.continue,t?.reportInput||delete r.input,r}function Vt(e){return Array.isArray(e)?`array`:typeof e==`string`?`string`:`unknown`}function R(...e){let[t,n,r]=e;return typeof t==`string`?{message:t,code:`custom`,input:n,inst:r}:{...t}}const Ht=(e,t)=>{e.name=`$ZodError`,Object.defineProperty(e,`_zod`,{value:e._zod,enumerable:!1}),Object.defineProperty(e,`issues`,{value:t,enumerable:!1}),e.message=JSON.stringify(t,xt,2),Object.defineProperty(e,`toString`,{value:()=>e.message,enumerable:!1})},Ut=w(`$ZodError`,Ht),Wt=w(`$ZodError`,Ht,{Parent:Error});function Gt(e,t=e=>e.message){let n={},r=[];for(let i of e.issues)i.path.length>0?(n[i.path[0]]=n[i.path[0]]||[],n[i.path[0]].push(t(i))):r.push(t(i));return{formErrors:r,fieldErrors:n}}function Kt(e,t=e=>e.message){let n={_errors:[]},r=e=>{for(let i of e.issues)if(i.code===`invalid_union`&&i.errors.length)i.errors.map(e=>r({issues:e}));else if(i.code===`invalid_key`)r({issues:i.issues});else if(i.code===`invalid_element`)r({issues:i.issues});else if(i.path.length===0)n._errors.push(t(i));else{let e=n,r=0;for(;r<i.path.length;){let n=i.path[r];r===i.path.length-1?(e[n]=e[n]||{_errors:[]},e[n]._errors.push(t(i))):e[n]=e[n]||{_errors:[]},e=e[n],r++}}};return r(e),n}const qt=e=>(t,n,r,i)=>{let a=r?Object.assign(r,{async:!1}):{async:!1},o=t._zod.run({value:n,issues:[]},a);if(o instanceof Promise)throw new T;if(o.issues.length){let t=new(i?.Err??e)(o.issues.map(e=>L(e,a,D())));throw Dt(t,i?.callee),t}return o.value},Jt=e=>async(t,n,r,i)=>{let a=r?Object.assign(r,{async:!0}):{async:!0},o=t._zod.run({value:n,issues:[]},a);if(o instanceof Promise&&(o=await o),o.issues.length){let t=new(i?.Err??e)(o.issues.map(e=>L(e,a,D())));throw Dt(t,i?.callee),t}return o.value},z=e=>(t,n,r)=>{let i=r?{...r,async:!1}:{async:!1},a=t._zod.run({value:n,issues:[]},i);if(a instanceof Promise)throw new T;return a.issues.length?{success:!1,error:new(e??Ut)(a.issues.map(e=>L(e,i,D())))}:{success:!0,data:a.value}},Yt=z(Wt),B=e=>async(t,n,r)=>{let i=r?Object.assign(r,{async:!0}):{async:!0},a=t._zod.run({value:n,issues:[]},i);return a instanceof Promise&&(a=await a),a.issues.length?{success:!1,error:new e(a.issues.map(e=>L(e,i,D())))}:{success:!0,data:a.value}},Xt=B(Wt),Zt=e=>(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return qt(e)(t,n,i)},Qt=e=>(t,n,r)=>qt(e)(t,n,r),$t=e=>async(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return Jt(e)(t,n,i)},en=e=>async(t,n,r)=>Jt(e)(t,n,r),tn=e=>(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return z(e)(t,n,i)},nn=e=>(t,n,r)=>z(e)(t,n,r),rn=e=>async(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return B(e)(t,n,i)},an=e=>async(t,n,r)=>B(e)(t,n,r),V=w(`$ZodCheck`,(e,t)=>{var n;e._zod??={},e._zod.def=t,(n=e._zod).onattach??(n.onattach=[])}),on=w(`$ZodCheckMaxLength`,(e,t)=>{var n;V.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!Ct(t)&&t.length!==void 0}),e._zod.onattach.push(e=>{let n=e._zod.bag.maximum??1/0;t.maximum<n&&(e._zod.bag.maximum=t.maximum)}),e._zod.check=n=>{let r=n.value;if(r.length<=t.maximum)return;let i=Vt(r);n.issues.push({origin:i,code:`too_big`,maximum:t.maximum,inclusive:!0,input:r,inst:e,continue:!t.abort})}}),sn=w(`$ZodCheckMinLength`,(e,t)=>{var n;V.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!Ct(t)&&t.length!==void 0}),e._zod.onattach.push(e=>{let n=e._zod.bag.minimum??-1/0;t.minimum>n&&(e._zod.bag.minimum=t.minimum)}),e._zod.check=n=>{let r=n.value;if(r.length>=t.minimum)return;let i=Vt(r);n.issues.push({origin:i,code:`too_small`,minimum:t.minimum,inclusive:!0,input:r,inst:e,continue:!t.abort})}}),cn=w(`$ZodCheckLengthEquals`,(e,t)=>{var n;V.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!Ct(t)&&t.length!==void 0}),e._zod.onattach.push(e=>{let n=e._zod.bag;n.minimum=t.length,n.maximum=t.length,n.length=t.length}),e._zod.check=n=>{let r=n.value,i=r.length;if(i===t.length)return;let a=Vt(r),o=i>t.length;n.issues.push({origin:a,...o?{code:`too_big`,maximum:t.length}:{code:`too_small`,minimum:t.length},inclusive:!0,exact:!0,input:n.value,inst:e,continue:!t.abort})}}),ln=w(`$ZodCheckOverwrite`,(e,t)=>{V.init(e,t),e._zod.check=e=>{e.value=t.tx(e.value)}});var un=class{constructor(e=[]){this.content=[],this.indent=0,this&&(this.args=e)}indented(e){this.indent+=1,e(this),--this.indent}write(e){if(typeof e==`function`){e(this,{execution:`sync`}),e(this,{execution:`async`});return}let t=e.split(`
2
2
  `).filter(e=>e),n=Math.min(...t.map(e=>e.length-e.trimStart().length)),r=t.map(e=>e.slice(n)).map(e=>` `.repeat(this.indent*2)+e);for(let e of r)this.content.push(e)}compile(){let e=Function,t=this?.args,n=[...(this?.content??[``]).map(e=>` ${e}`)];return new e(...t,n.join(`
3
3
  `))}};const dn={major:4,minor:3,patch:6},H=w(`$ZodType`,(e,t)=>{var n;e??={},e._zod.def=t,e._zod.bag=e._zod.bag||{},e._zod.version=dn;let r=[...e._zod.def.checks??[]];e._zod.traits.has(`$ZodCheck`)&&r.unshift(e);for(let t of r)for(let n of t._zod.onattach)n(e);if(r.length===0)(n=e._zod).deferred??(n.deferred=[]),e._zod.deferred?.push(()=>{e._zod.run=e._zod.parse});else{let t=(e,t,n)=>{let r=F(e),i;for(let a of t){if(a._zod.def.when){if(!a._zod.def.when(e))continue}else if(r)continue;let t=e.issues.length,o=a._zod.check(e);if(o instanceof Promise&&n?.async===!1)throw new T;if(i||o instanceof Promise)i=(i??Promise.resolve()).then(async()=>{await o,e.issues.length!==t&&(r||=F(e,t))});else{if(e.issues.length===t)continue;r||=F(e,t)}}return i?i.then(()=>e):e},n=(n,i,a)=>{if(F(n))return n.aborted=!0,n;let o=t(i,r,a);if(o instanceof Promise){if(a.async===!1)throw new T;return o.then(t=>e._zod.parse(t,a))}return e._zod.parse(o,a)};e._zod.run=(i,a)=>{if(a.skipChecks)return e._zod.parse(i,a);if(a.direction===`backward`){let t=e._zod.parse({value:i.value,issues:[]},{...a,skipChecks:!0});return t instanceof Promise?t.then(e=>n(e,i,a)):n(t,i,a)}let o=e._zod.parse(i,a);if(o instanceof Promise){if(a.async===!1)throw new T;return o.then(e=>t(e,r,a))}return t(o,r,a)}}O(e,`~standard`,()=>({validate:t=>{try{let n=Yt(e,t);return n.success?{value:n.data}:{issues:n.error?.issues}}catch{return Xt(e,t).then(e=>e.success?{value:e.data}:{issues:e.error?.issues})}},vendor:`zod`,version:1}))}),fn=w(`$ZodUnknown`,(e,t)=>{H.init(e,t),e._zod.parse=e=>e}),pn=w(`$ZodNever`,(e,t)=>{H.init(e,t),e._zod.parse=(t,n)=>(t.issues.push({expected:`never`,code:`invalid_type`,input:t.value,inst:e}),t)});function mn(e,t,n){e.issues.length&&t.issues.push(...Bt(n,e.issues)),t.value[n]=e.value}const hn=w(`$ZodArray`,(e,t)=>{H.init(e,t),e._zod.parse=(n,r)=>{let i=n.value;if(!Array.isArray(i))return n.issues.push({expected:`array`,code:`invalid_type`,input:i,inst:e}),n;n.value=Array(i.length);let a=[];for(let e=0;e<i.length;e++){let o=i[e],s=t.element._zod.run({value:o,issues:[]},r);s instanceof Promise?a.push(s.then(t=>mn(t,n,e))):mn(s,n,e)}return a.length?Promise.all(a).then(()=>n):n}});function U(e,t,n,r,i){if(e.issues.length){if(i&&!(n in r))return;t.issues.push(...Bt(n,e.issues))}e.value===void 0?n in r&&(t.value[n]=void 0):t.value[n]=e.value}function gn(e){let t=Object.keys(e.shape);for(let n of t)if(!e.shape?.[n]?._zod?.traits?.has(`$ZodType`))throw Error(`Invalid element at key "${n}": expected a Zod schema`);let n=Mt(e.shape);return{...e,keys:t,keySet:new Set(t),numKeys:t.length,optionalKeys:new Set(n)}}function _n(e,t,n,r,i,a){let o=[],s=i.keySet,c=i.catchall._zod,l=c.def.type,u=c.optout===`optional`;for(let i in t){if(s.has(i))continue;if(l===`never`){o.push(i);continue}let a=c.run({value:t[i],issues:[]},r);a instanceof Promise?e.push(a.then(e=>U(e,n,i,t,u))):U(a,n,i,t,u)}return o.length&&n.issues.push({code:`unrecognized_keys`,keys:o,input:t,inst:a}),e.length?Promise.all(e).then(()=>n):n}const vn=w(`$ZodObject`,(e,t)=>{if(H.init(e,t),!Object.getOwnPropertyDescriptor(t,`shape`)?.get){let e=t.shape;Object.defineProperty(t,`shape`,{get:()=>{let n={...e};return Object.defineProperty(t,`shape`,{value:n}),n}})}let n=St(()=>gn(t));O(e._zod,`propValues`,()=>{let e=t.shape,n={};for(let t in e){let r=e[t]._zod;if(r.values){n[t]??(n[t]=new Set);for(let e of r.values)n[t].add(e)}}return n});let r=j,i=t.catchall,a;e._zod.parse=(t,o)=>{a??=n.value;let s=t.value;if(!r(s))return t.issues.push({expected:`object`,code:`invalid_type`,input:s,inst:e}),t;t.value={};let c=[],l=a.shape;for(let e of a.keys){let n=l[e],r=n._zod.optout===`optional`,i=n._zod.run({value:s[e],issues:[]},o);i instanceof Promise?c.push(i.then(n=>U(n,t,e,s,r))):U(i,t,e,s,r)}return i?_n(c,s,t,o,n.value,e):c.length?Promise.all(c).then(()=>t):t}}),yn=w(`$ZodObjectJIT`,(e,t)=>{vn.init(e,t);let n=e._zod.parse,r=St(()=>gn(t)),i=e=>{let t=new un([`shape`,`payload`,`ctx`]),n=r.value,i=e=>{let t=Et(e);return`shape[${t}]._zod.run({ value: input[${t}], issues: [] }, ctx)`};t.write(`const input = payload.value;`);let a=Object.create(null),o=0;for(let e of n.keys)a[e]=`key_${o++}`;t.write(`const newResult = {};`);for(let r of n.keys){let n=a[r],o=Et(r),s=e[r]?._zod?.optout===`optional`;t.write(`const ${n} = ${i(r)};`),s?t.write(`
4
4
  if (${n}.issues.length) {
@@ -36,9 +36,9 @@ import{existsSync as e,readFileSync as t,readdirSync as n,realpathSync as r,stat
36
36
 
37
37
  `)}t.write(`payload.value = newResult;`),t.write(`return payload;`);let s=t.compile();return(t,n)=>s(e,t,n)},a,o=j,s=!E.jitless,c=s&&Ot.value,l=t.catchall,u;e._zod.parse=(d,f)=>{u??=r.value;let p=d.value;return o(p)?s&&c&&f?.async===!1&&f.jitless!==!0?(a||=i(t.shape),d=a(d,f),l?_n([],p,d,f,u,e):d):n(d,f):(d.issues.push({expected:`object`,code:`invalid_type`,input:p,inst:e}),d)}});function bn(e,t,n,r){for(let n of e)if(n.issues.length===0)return t.value=n.value,t;let i=e.filter(e=>!F(e));return i.length===1?(t.value=i[0].value,i[0]):(t.issues.push({code:`invalid_union`,input:t.value,inst:n,errors:e.map(e=>e.issues.map(e=>L(e,r,D())))}),t)}const xn=w(`$ZodUnion`,(e,t)=>{H.init(e,t),O(e._zod,`optin`,()=>t.options.some(e=>e._zod.optin===`optional`)?`optional`:void 0),O(e._zod,`optout`,()=>t.options.some(e=>e._zod.optout===`optional`)?`optional`:void 0),O(e._zod,`values`,()=>{if(t.options.every(e=>e._zod.values))return new Set(t.options.flatMap(e=>Array.from(e._zod.values)))}),O(e._zod,`pattern`,()=>{if(t.options.every(e=>e._zod.pattern)){let e=t.options.map(e=>e._zod.pattern);return RegExp(`^(${e.map(e=>wt(e.source)).join(`|`)})$`)}});let n=t.options.length===1,r=t.options[0]._zod.run;e._zod.parse=(i,a)=>{if(n)return r(i,a);let o=!1,s=[];for(let e of t.options){let t=e._zod.run({value:i.value,issues:[]},a);if(t instanceof Promise)s.push(t),o=!0;else{if(t.issues.length===0)return t;s.push(t)}}return o?Promise.all(s).then(t=>bn(t,i,e,a)):bn(s,i,e,a)}}),Sn=w(`$ZodIntersection`,(e,t)=>{H.init(e,t),e._zod.parse=(e,n)=>{let r=e.value,i=t.left._zod.run({value:r,issues:[]},n),a=t.right._zod.run({value:r,issues:[]},n);return i instanceof Promise||a instanceof Promise?Promise.all([i,a]).then(([t,n])=>wn(e,t,n)):wn(e,i,a)}});function Cn(e,t){if(e===t||e instanceof Date&&t instanceof Date&&+e==+t)return{valid:!0,data:e};if(M(e)&&M(t)){let n=Object.keys(t),r=Object.keys(e).filter(e=>n.indexOf(e)!==-1),i={...e,...t};for(let n of r){let r=Cn(e[n],t[n]);if(!r.valid)return{valid:!1,mergeErrorPath:[n,...r.mergeErrorPath]};i[n]=r.data}return{valid:!0,data:i}}if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return{valid:!1,mergeErrorPath:[]};let n=[];for(let r=0;r<e.length;r++){let i=e[r],a=t[r],o=Cn(i,a);if(!o.valid)return{valid:!1,mergeErrorPath:[r,...o.mergeErrorPath]};n.push(o.data)}return{valid:!0,data:n}}return{valid:!1,mergeErrorPath:[]}}function wn(e,t,n){let r=new Map,i;for(let n of t.issues)if(n.code===`unrecognized_keys`){i??=n;for(let e of n.keys)r.has(e)||r.set(e,{}),r.get(e).l=!0}else e.issues.push(n);for(let t of n.issues)if(t.code===`unrecognized_keys`)for(let e of t.keys)r.has(e)||r.set(e,{}),r.get(e).r=!0;else e.issues.push(t);let a=[...r].filter(([,e])=>e.l&&e.r).map(([e])=>e);if(a.length&&i&&e.issues.push({...i,keys:a}),F(e))return e;let o=Cn(t.value,n.value);if(!o.valid)throw Error(`Unmergable intersection. Error path: ${JSON.stringify(o.mergeErrorPath)}`);return e.value=o.data,e}const Tn=w(`$ZodEnum`,(e,t)=>{H.init(e,t);let n=bt(t.entries),r=new Set(n);e._zod.values=r,e._zod.pattern=RegExp(`^(${n.filter(e=>At.has(typeof e)).map(e=>typeof e==`string`?jt(e):e.toString()).join(`|`)})$`),e._zod.parse=(t,i)=>{let a=t.value;return r.has(a)||t.issues.push({code:`invalid_value`,values:n,input:a,inst:e}),t}}),En=w(`$ZodTransform`,(e,t)=>{H.init(e,t),e._zod.parse=(n,r)=>{if(r.direction===`backward`)throw new yt(e.constructor.name);let i=t.transform(n.value,n);if(r.async)return(i instanceof Promise?i:Promise.resolve(i)).then(e=>(n.value=e,n));if(i instanceof Promise)throw new T;return n.value=i,n}});function Dn(e,t){return e.issues.length&&t===void 0?{issues:[],value:void 0}:e}const On=w(`$ZodOptional`,(e,t)=>{H.init(e,t),e._zod.optin=`optional`,e._zod.optout=`optional`,O(e._zod,`values`,()=>t.innerType._zod.values?new Set([...t.innerType._zod.values,void 0]):void 0),O(e._zod,`pattern`,()=>{let e=t.innerType._zod.pattern;return e?RegExp(`^(${wt(e.source)})?$`):void 0}),e._zod.parse=(e,n)=>{if(t.innerType._zod.optin===`optional`){let r=t.innerType._zod.run(e,n);return r instanceof Promise?r.then(t=>Dn(t,e.value)):Dn(r,e.value)}return e.value===void 0?e:t.innerType._zod.run(e,n)}}),kn=w(`$ZodExactOptional`,(e,t)=>{On.init(e,t),O(e._zod,`values`,()=>t.innerType._zod.values),O(e._zod,`pattern`,()=>t.innerType._zod.pattern),e._zod.parse=(e,n)=>t.innerType._zod.run(e,n)}),An=w(`$ZodNullable`,(e,t)=>{H.init(e,t),O(e._zod,`optin`,()=>t.innerType._zod.optin),O(e._zod,`optout`,()=>t.innerType._zod.optout),O(e._zod,`pattern`,()=>{let e=t.innerType._zod.pattern;return e?RegExp(`^(${wt(e.source)}|null)$`):void 0}),O(e._zod,`values`,()=>t.innerType._zod.values?new Set([...t.innerType._zod.values,null]):void 0),e._zod.parse=(e,n)=>e.value===null?e:t.innerType._zod.run(e,n)}),jn=w(`$ZodDefault`,(e,t)=>{H.init(e,t),e._zod.optin=`optional`,O(e._zod,`values`,()=>t.innerType._zod.values),e._zod.parse=(e,n)=>{if(n.direction===`backward`)return t.innerType._zod.run(e,n);if(e.value===void 0)return e.value=t.defaultValue,e;let r=t.innerType._zod.run(e,n);return r instanceof Promise?r.then(e=>Mn(e,t)):Mn(r,t)}});function Mn(e,t){return e.value===void 0&&(e.value=t.defaultValue),e}const Nn=w(`$ZodPrefault`,(e,t)=>{H.init(e,t),e._zod.optin=`optional`,O(e._zod,`values`,()=>t.innerType._zod.values),e._zod.parse=(e,n)=>(n.direction===`backward`||e.value===void 0&&(e.value=t.defaultValue),t.innerType._zod.run(e,n))}),Pn=w(`$ZodNonOptional`,(e,t)=>{H.init(e,t),O(e._zod,`values`,()=>{let e=t.innerType._zod.values;return e?new Set([...e].filter(e=>e!==void 0)):void 0}),e._zod.parse=(n,r)=>{let i=t.innerType._zod.run(n,r);return i instanceof Promise?i.then(t=>Fn(t,e)):Fn(i,e)}});function Fn(e,t){return!e.issues.length&&e.value===void 0&&e.issues.push({code:`invalid_type`,expected:`nonoptional`,input:e.value,inst:t}),e}const In=w(`$ZodCatch`,(e,t)=>{H.init(e,t),O(e._zod,`optin`,()=>t.innerType._zod.optin),O(e._zod,`optout`,()=>t.innerType._zod.optout),O(e._zod,`values`,()=>t.innerType._zod.values),e._zod.parse=(e,n)=>{if(n.direction===`backward`)return t.innerType._zod.run(e,n);let r=t.innerType._zod.run(e,n);return r instanceof Promise?r.then(r=>(e.value=r.value,r.issues.length&&(e.value=t.catchValue({...e,error:{issues:r.issues.map(e=>L(e,n,D()))},input:e.value}),e.issues=[]),e)):(e.value=r.value,r.issues.length&&(e.value=t.catchValue({...e,error:{issues:r.issues.map(e=>L(e,n,D()))},input:e.value}),e.issues=[]),e)}}),Ln=w(`$ZodPipe`,(e,t)=>{H.init(e,t),O(e._zod,`values`,()=>t.in._zod.values),O(e._zod,`optin`,()=>t.in._zod.optin),O(e._zod,`optout`,()=>t.out._zod.optout),O(e._zod,`propValues`,()=>t.in._zod.propValues),e._zod.parse=(e,n)=>{if(n.direction===`backward`){let r=t.out._zod.run(e,n);return r instanceof Promise?r.then(e=>W(e,t.in,n)):W(r,t.in,n)}let r=t.in._zod.run(e,n);return r instanceof Promise?r.then(e=>W(e,t.out,n)):W(r,t.out,n)}});function W(e,t,n){return e.issues.length?(e.aborted=!0,e):t._zod.run({value:e.value,issues:e.issues},n)}const Rn=w(`$ZodReadonly`,(e,t)=>{H.init(e,t),O(e._zod,`propValues`,()=>t.innerType._zod.propValues),O(e._zod,`values`,()=>t.innerType._zod.values),O(e._zod,`optin`,()=>t.innerType?._zod?.optin),O(e._zod,`optout`,()=>t.innerType?._zod?.optout),e._zod.parse=(e,n)=>{if(n.direction===`backward`)return t.innerType._zod.run(e,n);let r=t.innerType._zod.run(e,n);return r instanceof Promise?r.then(zn):zn(r)}});function zn(e){return e.value=Object.freeze(e.value),e}const Bn=w(`$ZodCustom`,(e,t)=>{V.init(e,t),H.init(e,t),e._zod.parse=(e,t)=>e,e._zod.check=n=>{let r=n.value,i=t.fn(r);if(i instanceof Promise)return i.then(t=>Vn(t,n,r,e));Vn(i,n,r,e)}});function Vn(e,t,n,r){if(!e){let e={code:`custom`,input:n,inst:r,path:[...r._zod.def.path??[]],continue:!r._zod.def.abort};r._zod.def.params&&(e.params=r._zod.def.params),t.issues.push(R(e))}}var Hn,Un=class{constructor(){this._map=new WeakMap,this._idmap=new Map}add(e,...t){let n=t[0];return this._map.set(e,n),n&&typeof n==`object`&&`id`in n&&this._idmap.set(n.id,e),this}clear(){return this._map=new WeakMap,this._idmap=new Map,this}remove(e){let t=this._map.get(e);return t&&typeof t==`object`&&`id`in t&&this._idmap.delete(t.id),this._map.delete(e),this}get(e){let t=e._zod.parent;if(t){let n={...this.get(t)??{}};delete n.id;let r={...n,...this._map.get(e)};return Object.keys(r).length?r:void 0}return this._map.get(e)}has(e){return this._map.has(e)}};function Wn(){return new Un}(Hn=globalThis).__zod_globalRegistry??(Hn.__zod_globalRegistry=Wn());const G=globalThis.__zod_globalRegistry;function Gn(e){return new e({type:`unknown`})}function Kn(e,t){return new e({type:`never`,...P(t)})}function qn(e,t){return new on({check:`max_length`,...P(t),maximum:e})}function Jn(e,t){return new sn({check:`min_length`,...P(t),minimum:e})}function Yn(e,t){return new cn({check:`length_equals`,...P(t),length:e})}function Xn(e){return new ln({check:`overwrite`,tx:e})}function Zn(e,t,n){return new e({type:`array`,element:t,...P(n)})}function Qn(e,t,n){return new e({type:`custom`,check:`custom`,fn:t,...P(n)})}function $n(e){let t=er(n=>(n.addIssue=e=>{if(typeof e==`string`)n.issues.push(R(e,n.value,t._zod.def));else{let r=e;r.fatal&&(r.continue=!1),r.code??=`custom`,r.input??=n.value,r.inst??=t,r.continue??=!t._zod.def.abort,n.issues.push(R(r))}},e(n.value,n)));return t}function er(e,t){let n=new V({check:`custom`,...P(t)});return n._zod.check=e,n}function tr(e){let t=e?.target??`draft-2020-12`;return t===`draft-4`&&(t=`draft-04`),t===`draft-7`&&(t=`draft-07`),{processors:e.processors??{},metadataRegistry:e?.metadata??G,target:t,unrepresentable:e?.unrepresentable??`throw`,override:e?.override??(()=>{}),io:e?.io??`output`,counter:0,seen:new Map,cycles:e?.cycles??`ref`,reused:e?.reused??`inline`,external:e?.external??void 0}}function K(e,t,n={path:[],schemaPath:[]}){var r;let i=e._zod.def,a=t.seen.get(e);if(a)return a.count++,n.schemaPath.includes(e)&&(a.cycle=n.path),a.schema;let o={schema:{},count:1,cycle:void 0,path:n.path};t.seen.set(e,o);let s=e._zod.toJSONSchema?.();if(s)o.schema=s;else{let r={...n,schemaPath:[...n.schemaPath,e],path:n.path};if(e._zod.processJSONSchema)e._zod.processJSONSchema(t,o.schema,r);else{let n=o.schema,a=t.processors[i.type];if(!a)throw Error(`[toJSONSchema]: Non-representable type encountered: ${i.type}`);a(e,t,n,r)}let a=e._zod.parent;a&&(o.ref||=a,K(a,t,r),t.seen.get(a).isParent=!0)}let c=t.metadataRegistry.get(e);return c&&Object.assign(o.schema,c),t.io===`input`&&q(e)&&(delete o.schema.examples,delete o.schema.default),t.io===`input`&&o.schema._prefault&&((r=o.schema).default??(r.default=o.schema._prefault)),delete o.schema._prefault,t.seen.get(e).schema}function nr(e,t){let n=e.seen.get(t);if(!n)throw Error(`Unprocessed schema. This is a bug in Zod.`);let r=new Map;for(let t of e.seen.entries()){let n=e.metadataRegistry.get(t[0])?.id;if(n){let e=r.get(n);if(e&&e!==t[0])throw Error(`Duplicate schema id "${n}" detected during JSON Schema conversion. Two different schemas cannot share the same id when converted together.`);r.set(n,t[0])}}let i=t=>{let r=e.target===`draft-2020-12`?`$defs`:`definitions`;if(e.external){let n=e.external.registry.get(t[0])?.id,i=e.external.uri??(e=>e);if(n)return{ref:i(n)};let a=t[1].defId??t[1].schema.id??`schema${e.counter++}`;return t[1].defId=a,{defId:a,ref:`${i(`__shared`)}#/${r}/${a}`}}if(t[1]===n)return{ref:`#`};let i=`#/${r}/`,a=t[1].schema.id??`__schema${e.counter++}`;return{defId:a,ref:i+a}},a=e=>{if(e[1].schema.$ref)return;let t=e[1],{ref:n,defId:r}=i(e);t.def={...t.schema},r&&(t.defId=r);let a=t.schema;for(let e in a)delete a[e];a.$ref=n};if(e.cycles===`throw`)for(let t of e.seen.entries()){let e=t[1];if(e.cycle)throw Error(`Cycle detected: #/${e.cycle?.join(`/`)}/<root>
38
38
 
39
- Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.`)}for(let n of e.seen.entries()){let r=n[1];if(t===n[0]){a(n);continue}if(e.external){let r=e.external.registry.get(n[0])?.id;if(t!==n[0]&&r){a(n);continue}}if(e.metadataRegistry.get(n[0])?.id){a(n);continue}if(r.cycle){a(n);continue}if(r.count>1&&e.reused===`ref`){a(n);continue}}}function rr(e,t){let n=e.seen.get(t);if(!n)throw Error(`Unprocessed schema. This is a bug in Zod.`);let r=t=>{let n=e.seen.get(t);if(n.ref===null)return;let i=n.def??n.schema,a={...i},o=n.ref;if(n.ref=null,o){r(o);let n=e.seen.get(o),s=n.schema;if(s.$ref&&(e.target===`draft-07`||e.target===`draft-04`||e.target===`openapi-3.0`)?(i.allOf=i.allOf??[],i.allOf.push(s)):Object.assign(i,s),Object.assign(i,a),t._zod.parent===o)for(let e in i)e===`$ref`||e===`allOf`||e in a||delete i[e];if(s.$ref&&n.def)for(let e in i)e===`$ref`||e===`allOf`||e in n.def&&JSON.stringify(i[e])===JSON.stringify(n.def[e])&&delete i[e]}let s=t._zod.parent;if(s&&s!==o){r(s);let t=e.seen.get(s);if(t?.schema.$ref&&(i.$ref=t.schema.$ref,t.def))for(let e in i)e===`$ref`||e===`allOf`||e in t.def&&JSON.stringify(i[e])===JSON.stringify(t.def[e])&&delete i[e]}e.override({zodSchema:t,jsonSchema:i,path:n.path??[]})};for(let t of[...e.seen.entries()].reverse())r(t[0]);let i={};if(e.target===`draft-2020-12`?i.$schema=`https://json-schema.org/draft/2020-12/schema`:e.target===`draft-07`?i.$schema=`http://json-schema.org/draft-07/schema#`:e.target===`draft-04`?i.$schema=`http://json-schema.org/draft-04/schema#`:e.target,e.external?.uri){let n=e.external.registry.get(t)?.id;if(!n)throw Error("Schema is missing an `id` property");i.$id=e.external.uri(n)}Object.assign(i,n.def??n.schema);let a=e.external?.defs??{};for(let t of e.seen.entries()){let e=t[1];e.def&&e.defId&&(a[e.defId]=e.def)}e.external||Object.keys(a).length>0&&(e.target===`draft-2020-12`?i.$defs=a:i.definitions=a);try{let n=JSON.parse(JSON.stringify(i));return Object.defineProperty(n,`~standard`,{value:{...t[`~standard`],jsonSchema:{input:J(t,`input`,e.processors),output:J(t,`output`,e.processors)}},enumerable:!1,writable:!1}),n}catch{throw Error(`Error converting schema to JSON.`)}}function q(e,t){let n=t??{seen:new Set};if(n.seen.has(e))return!1;n.seen.add(e);let r=e._zod.def;if(r.type===`transform`)return!0;if(r.type===`array`)return q(r.element,n);if(r.type===`set`)return q(r.valueType,n);if(r.type===`lazy`)return q(r.getter(),n);if(r.type===`promise`||r.type===`optional`||r.type===`nonoptional`||r.type===`nullable`||r.type===`readonly`||r.type===`default`||r.type===`prefault`)return q(r.innerType,n);if(r.type===`intersection`)return q(r.left,n)||q(r.right,n);if(r.type===`record`||r.type===`map`)return q(r.keyType,n)||q(r.valueType,n);if(r.type===`pipe`)return q(r.in,n)||q(r.out,n);if(r.type===`object`){for(let e in r.shape)if(q(r.shape[e],n))return!0;return!1}if(r.type===`union`){for(let e of r.options)if(q(e,n))return!0;return!1}if(r.type===`tuple`){for(let e of r.items)if(q(e,n))return!0;return!!(r.rest&&q(r.rest,n))}return!1}const ir=(e,t={})=>n=>{let r=tr({...n,processors:t});return K(e,r),nr(r,e),rr(r,e)},J=(e,t,n={})=>r=>{let{libraryOptions:i,target:a}=r??{},o=tr({...i??{},target:a,io:t,processors:n});return K(e,o),nr(o,e),rr(o,e)},ar=(e,t,n,r)=>{n.not={}},or=(e,t,n,r)=>{let i=e._zod.def,a=bt(i.entries);a.every(e=>typeof e==`number`)&&(n.type=`number`),a.every(e=>typeof e==`string`)&&(n.type=`string`),n.enum=a},sr=(e,t,n,r)=>{if(t.unrepresentable===`throw`)throw Error(`Custom types cannot be represented in JSON Schema`)},cr=(e,t,n,r)=>{if(t.unrepresentable===`throw`)throw Error(`Transforms cannot be represented in JSON Schema`)},lr=(e,t,n,r)=>{let i=n,a=e._zod.def,{minimum:o,maximum:s}=e._zod.bag;typeof o==`number`&&(i.minItems=o),typeof s==`number`&&(i.maxItems=s),i.type=`array`,i.items=K(a.element,t,{...r,path:[...r.path,`items`]})},ur=(e,t,n,r)=>{let i=n,a=e._zod.def;i.type=`object`,i.properties={};let o=a.shape;for(let e in o)i.properties[e]=K(o[e],t,{...r,path:[...r.path,`properties`,e]});let s=new Set(Object.keys(o)),c=new Set([...s].filter(e=>{let n=a.shape[e]._zod;return t.io===`input`?n.optin===void 0:n.optout===void 0}));c.size>0&&(i.required=Array.from(c)),a.catchall?._zod.def.type===`never`?i.additionalProperties=!1:a.catchall?a.catchall&&(i.additionalProperties=K(a.catchall,t,{...r,path:[...r.path,`additionalProperties`]})):t.io===`output`&&(i.additionalProperties=!1)},dr=(e,t,n,r)=>{let i=e._zod.def,a=i.inclusive===!1,o=i.options.map((e,n)=>K(e,t,{...r,path:[...r.path,a?`oneOf`:`anyOf`,n]}));a?n.oneOf=o:n.anyOf=o},fr=(e,t,n,r)=>{let i=e._zod.def,a=K(i.left,t,{...r,path:[...r.path,`allOf`,0]}),o=K(i.right,t,{...r,path:[...r.path,`allOf`,1]}),s=e=>`allOf`in e&&Object.keys(e).length===1;n.allOf=[...s(a)?a.allOf:[a],...s(o)?o.allOf:[o]]},pr=(e,t,n,r)=>{let i=e._zod.def,a=K(i.innerType,t,r),o=t.seen.get(e);t.target===`openapi-3.0`?(o.ref=i.innerType,n.nullable=!0):n.anyOf=[a,{type:`null`}]},mr=(e,t,n,r)=>{let i=e._zod.def;K(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType},hr=(e,t,n,r)=>{let i=e._zod.def;K(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType,n.default=JSON.parse(JSON.stringify(i.defaultValue))},gr=(e,t,n,r)=>{let i=e._zod.def;K(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType,t.io===`input`&&(n._prefault=JSON.parse(JSON.stringify(i.defaultValue)))},_r=(e,t,n,r)=>{let i=e._zod.def;K(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType;let o;try{o=i.catchValue(void 0)}catch{throw Error(`Dynamic catch values are not supported in JSON Schema`)}n.default=o},vr=(e,t,n,r)=>{let i=e._zod.def,a=t.io===`input`?i.in._zod.def.type===`transform`?i.out:i.in:i.out;K(a,t,r);let o=t.seen.get(e);o.ref=a},yr=(e,t,n,r)=>{let i=e._zod.def;K(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType,n.readOnly=!0},br=(e,t,n,r)=>{let i=e._zod.def;K(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType},xr=(e,t)=>{Ut.init(e,t),e.name=`ZodError`,Object.defineProperties(e,{format:{value:t=>Kt(e,t)},flatten:{value:t=>Gt(e,t)},addIssue:{value:t=>{e.issues.push(t),e.message=JSON.stringify(e.issues,xt,2)}},addIssues:{value:t=>{e.issues.push(...t),e.message=JSON.stringify(e.issues,xt,2)}},isEmpty:{get(){return e.issues.length===0}}})};w(`ZodError`,xr);const Y=w(`ZodError`,xr,{Parent:Error}),Sr=qt(Y),Cr=Jt(Y),wr=z(Y),Tr=B(Y),Er=Zt(Y),Dr=Qt(Y),Or=$t(Y),kr=en(Y),Ar=tn(Y),jr=nn(Y),Mr=rn(Y),Nr=an(Y),X=w(`ZodType`,(e,t)=>(H.init(e,t),Object.assign(e[`~standard`],{jsonSchema:{input:J(e,`input`),output:J(e,`output`)}}),e.toJSONSchema=ir(e,{}),e.def=t,e.type=t.type,Object.defineProperty(e,`_def`,{value:t}),e.check=(...n)=>e.clone(A(t,{checks:[...t.checks??[],...n.map(e=>typeof e==`function`?{_zod:{check:e,def:{check:`custom`},onattach:[]}}:e)]}),{parent:!0}),e.with=e.check,e.clone=(t,n)=>N(e,t,n),e.brand=()=>e,e.register=((t,n)=>(t.add(e,n),e)),e.parse=(t,n)=>Sr(e,t,n,{callee:e.parse}),e.safeParse=(t,n)=>wr(e,t,n),e.parseAsync=async(t,n)=>Cr(e,t,n,{callee:e.parseAsync}),e.safeParseAsync=async(t,n)=>Tr(e,t,n),e.spa=e.safeParseAsync,e.encode=(t,n)=>Er(e,t,n),e.decode=(t,n)=>Dr(e,t,n),e.encodeAsync=async(t,n)=>Or(e,t,n),e.decodeAsync=async(t,n)=>kr(e,t,n),e.safeEncode=(t,n)=>Ar(e,t,n),e.safeDecode=(t,n)=>jr(e,t,n),e.safeEncodeAsync=async(t,n)=>Mr(e,t,n),e.safeDecodeAsync=async(t,n)=>Nr(e,t,n),e.refine=(t,n)=>e.check(hi(t,n)),e.superRefine=t=>e.check(gi(t)),e.overwrite=t=>e.check(Xn(t)),e.optional=()=>Zr(e),e.exactOptional=()=>$r(e),e.nullable=()=>ti(e),e.nullish=()=>Zr(ti(e)),e.nonoptional=t=>si(e,t),e.array=()=>zr(e),e.or=t=>Ur([e,t]),e.and=t=>Gr(e,t),e.transform=t=>di(e,Yr(t)),e.default=t=>ri(e,t),e.prefault=t=>ai(e,t),e.catch=t=>li(e,t),e.pipe=t=>di(e,t),e.readonly=()=>pi(e),e.describe=t=>{let n=e.clone();return G.add(n,{description:t}),n},Object.defineProperty(e,`description`,{get(){return G.get(e)?.description},configurable:!0}),e.meta=(...t)=>{if(t.length===0)return G.get(e);let n=e.clone();return G.add(n,t[0]),n},e.isOptional=()=>e.safeParse(void 0).success,e.isNullable=()=>e.safeParse(null).success,e.apply=t=>t(e),e)),Pr=w(`ZodUnknown`,(e,t)=>{fn.init(e,t),X.init(e,t),e._zod.processJSONSchema=(e,t,n)=>void 0});function Fr(){return Gn(Pr)}const Ir=w(`ZodNever`,(e,t)=>{pn.init(e,t),X.init(e,t),e._zod.processJSONSchema=(t,n,r)=>ar(e,t,n,r)});function Lr(e){return Kn(Ir,e)}const Rr=w(`ZodArray`,(e,t)=>{hn.init(e,t),X.init(e,t),e._zod.processJSONSchema=(t,n,r)=>lr(e,t,n,r),e.element=t.element,e.min=(t,n)=>e.check(Jn(t,n)),e.nonempty=t=>e.check(Jn(1,t)),e.max=(t,n)=>e.check(qn(t,n)),e.length=(t,n)=>e.check(Yn(t,n)),e.unwrap=()=>e.element});function zr(e,t){return Zn(Rr,e,t)}const Br=w(`ZodObject`,(e,t)=>{yn.init(e,t),X.init(e,t),e._zod.processJSONSchema=(t,n,r)=>ur(e,t,n,r),O(e,`shape`,()=>t.shape),e.keyof=()=>qr(Object.keys(e._zod.def.shape)),e.catchall=t=>e.clone({...e._zod.def,catchall:t}),e.passthrough=()=>e.clone({...e._zod.def,catchall:Fr()}),e.loose=()=>e.clone({...e._zod.def,catchall:Fr()}),e.strict=()=>e.clone({...e._zod.def,catchall:Lr()}),e.strip=()=>e.clone({...e._zod.def,catchall:void 0}),e.extend=t=>Ft(e,t),e.safeExtend=t=>It(e,t),e.merge=t=>Lt(e,t),e.pick=t=>Nt(e,t),e.omit=t=>Pt(e,t),e.partial=(...t)=>Rt(Xr,e,t[0]),e.required=(...t)=>zt(oi,e,t[0])});function Vr(e,t){return new Br({type:`object`,shape:e??{},...P(t)})}const Hr=w(`ZodUnion`,(e,t)=>{xn.init(e,t),X.init(e,t),e._zod.processJSONSchema=(t,n,r)=>dr(e,t,n,r),e.options=t.options});function Ur(e,t){return new Hr({type:`union`,options:e,...P(t)})}const Wr=w(`ZodIntersection`,(e,t)=>{Sn.init(e,t),X.init(e,t),e._zod.processJSONSchema=(t,n,r)=>fr(e,t,n,r)});function Gr(e,t){return new Wr({type:`intersection`,left:e,right:t})}const Kr=w(`ZodEnum`,(e,t)=>{Tn.init(e,t),X.init(e,t),e._zod.processJSONSchema=(t,n,r)=>or(e,t,n,r),e.enum=t.entries,e.options=Object.values(t.entries);let n=new Set(Object.keys(t.entries));e.extract=(e,r)=>{let i={};for(let r of e)if(n.has(r))i[r]=t.entries[r];else throw Error(`Key ${r} not found in enum`);return new Kr({...t,checks:[],...P(r),entries:i})},e.exclude=(e,r)=>{let i={...t.entries};for(let t of e)if(n.has(t))delete i[t];else throw Error(`Key ${t} not found in enum`);return new Kr({...t,checks:[],...P(r),entries:i})}});function qr(e,t){return new Kr({type:`enum`,entries:Array.isArray(e)?Object.fromEntries(e.map(e=>[e,e])):e,...P(t)})}const Jr=w(`ZodTransform`,(e,t)=>{En.init(e,t),X.init(e,t),e._zod.processJSONSchema=(t,n,r)=>cr(e,t,n,r),e._zod.parse=(n,r)=>{if(r.direction===`backward`)throw new yt(e.constructor.name);n.addIssue=r=>{if(typeof r==`string`)n.issues.push(R(r,n.value,t));else{let t=r;t.fatal&&(t.continue=!1),t.code??=`custom`,t.input??=n.value,t.inst??=e,n.issues.push(R(t))}};let i=t.transform(n.value,n);return i instanceof Promise?i.then(e=>(n.value=e,n)):(n.value=i,n)}});function Yr(e){return new Jr({type:`transform`,transform:e})}const Xr=w(`ZodOptional`,(e,t)=>{On.init(e,t),X.init(e,t),e._zod.processJSONSchema=(t,n,r)=>br(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Zr(e){return new Xr({type:`optional`,innerType:e})}const Qr=w(`ZodExactOptional`,(e,t)=>{kn.init(e,t),X.init(e,t),e._zod.processJSONSchema=(t,n,r)=>br(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function $r(e){return new Qr({type:`optional`,innerType:e})}const ei=w(`ZodNullable`,(e,t)=>{An.init(e,t),X.init(e,t),e._zod.processJSONSchema=(t,n,r)=>pr(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function ti(e){return new ei({type:`nullable`,innerType:e})}const ni=w(`ZodDefault`,(e,t)=>{jn.init(e,t),X.init(e,t),e._zod.processJSONSchema=(t,n,r)=>hr(e,t,n,r),e.unwrap=()=>e._zod.def.innerType,e.removeDefault=e.unwrap});function ri(e,t){return new ni({type:`default`,innerType:e,get defaultValue(){return typeof t==`function`?t():kt(t)}})}const ii=w(`ZodPrefault`,(e,t)=>{Nn.init(e,t),X.init(e,t),e._zod.processJSONSchema=(t,n,r)=>gr(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function ai(e,t){return new ii({type:`prefault`,innerType:e,get defaultValue(){return typeof t==`function`?t():kt(t)}})}const oi=w(`ZodNonOptional`,(e,t)=>{Pn.init(e,t),X.init(e,t),e._zod.processJSONSchema=(t,n,r)=>mr(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function si(e,t){return new oi({type:`nonoptional`,innerType:e,...P(t)})}const ci=w(`ZodCatch`,(e,t)=>{In.init(e,t),X.init(e,t),e._zod.processJSONSchema=(t,n,r)=>_r(e,t,n,r),e.unwrap=()=>e._zod.def.innerType,e.removeCatch=e.unwrap});function li(e,t){return new ci({type:`catch`,innerType:e,catchValue:typeof t==`function`?t:()=>t})}const ui=w(`ZodPipe`,(e,t)=>{Ln.init(e,t),X.init(e,t),e._zod.processJSONSchema=(t,n,r)=>vr(e,t,n,r),e.in=t.in,e.out=t.out});function di(e,t){return new ui({type:`pipe`,in:e,out:t})}const fi=w(`ZodReadonly`,(e,t)=>{Rn.init(e,t),X.init(e,t),e._zod.processJSONSchema=(t,n,r)=>yr(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function pi(e){return new fi({type:`readonly`,innerType:e})}const mi=w(`ZodCustom`,(e,t)=>{Bn.init(e,t),X.init(e,t),e._zod.processJSONSchema=(t,n,r)=>sr(e,t,n,r)});function hi(e,t={}){return Qn(mi,e,t)}function gi(e){return $n(e)}const _i=qr([`readonly`,`confirm`,`auto`]),vi=qr([`low`,`medium`,`high`,`xhigh`,`max`]),yi=Vr({mode:_i}),bi=Vr({level:vi});function xi(e){let t=new m;return t.get(`/`,t=>{let n=e.getActiveSession();return t.json({workingDirectory:e.app.workspaceDir,model:n?.model?.id,modelProvider:n?.model?.provider})}),t.put(`/`,async t=>{let n=await t.req.json().catch(()=>({}));try{let r=await e.app.updateSettings(n);return t.json({status:`ok`,settings:{model:r.model,thinking_level:r.thinking_level,permission_mode:r.permission_mode}})}catch(e){return t.json({status:`error`,message:`setting update failed: ${e instanceof Error?e.message:String(e)}`},500)}}),t.get(`/providers`,t=>{let n=e.app.listProviders();return t.json(n.map(e=>({id:e,name:e,models:[]})))}),t.get(`/models`,t=>{t.header(`Cache-Control`,`public, max-age=300`);try{let n=e.app.getAllModels();return t.json({models:n.map(e=>({id:e.id,provider:e.provider,name:e.name,reasoning:e.reasoning,input:e.input,contextWindow:e.contextWindow,maxOutputTokens:e.maxOutputTokens,cost:e.cost,...e.thinkingLevels?{thinkingLevels:e.thinkingLevels}:{}}))})}catch{return t.json({error:`failed to list models`},500)}}),t.post(`/verify-model`,async t=>{let n=await t.req.json().catch(()=>({}));if(typeof n.model!=`string`||!n.model)return t.json({valid:!1,error:`model is required`},400);try{return e.app.resolveModel(n.model),t.json({valid:!0})}catch{return t.json({valid:!1,error:`model not found`})}}),t.post(`/mode`,async t=>{let n;try{n=await t.req.json()}catch{return t.json({status:`error`,message:`invalid JSON body`},400)}let r=yi.safeParse(n);if(!r.success)return t.json({status:`error`,message:`invalid mode: ${r.error.issues.map(e=>e.message).join(`; `)}`},400);try{return await e.app.updateSettings({permission_mode:r.data.mode}),t.json({status:`ok`})}catch(e){return t.json({status:`error`,message:`mode switch failed: ${e instanceof Error?e.message:String(e)}`},500)}}),t.post(`/autonomy`,async e=>(await e.req.json().catch(()=>({})),e.json({status:`error`,message:`autonomy is not a configurable setting field; use PUT /api/setting to update permission_mode or thinking_level`},501))),t.post(`/thinking`,async t=>{let n;try{n=await t.req.json()}catch{return t.json({status:`error`,message:`invalid JSON body`},400)}let r=bi.safeParse(n);if(!r.success)return t.json({status:`error`,message:`invalid thinking level: ${r.error.issues.map(e=>e.message).join(`; `)}`},400);try{return await e.app.updateSettings({thinking_level:r.data.level}),t.json({status:`ok`})}catch(e){return t.json({status:`error`,message:`thinking switch failed: ${e instanceof Error?e.message:String(e)}`},500)}}),t}function Si(e,t){let n=new m;return n.get(`/status`,e=>e.json({enabled:t!==null})),n.use(`/*`,async(e,n)=>{if(!t)return e.json({error:`debugger not enabled`},503);await n()}),n.get(`/breakpoints`,e=>{let n=t?.debugger.listBreakpoints();return e.json({breakpoints:n})}),n}const Ci=he.map(e=>e.point);function wi(e){let t=new m,n=()=>e.app.devtools;return t.use(`/*`,async(e,t)=>{if(!n())return e.json({error:`debugger not available (start with --inspect)`},503);await t()}),t.get(`/breakpoints`,e=>{let t=n().debugger,r=he.map(({point:e})=>{let n=t.getBreakpoint(e);return{point:e,enabled:n?.enabled??!1,set:n!==void 0}});return e.json({breakpoints:r})}),t.put(`/breakpoints/:point`,async e=>{let t=e.req.param(`point`);if(!Ci.includes(t))return e.json({error:`unknown breakpoint point: ${t}`},400);let r=(await e.req.json().catch(()=>({enabled:!0}))).enabled??!0,i=n().debugger.setBreakpoint(t,r);return e.json({breakpoint:i})}),t.post(`/breakpoints/enable-all`,e=>(n().debugger.enableAllBreakpoints(),e.json({status:`ok`}))),t.post(`/breakpoints/disable-all`,e=>(n().debugger.disableAllBreakpoints(),e.json({status:`ok`}))),t.get(`/state`,e=>{let t=n().debugger.listBreakpoints(),r=t.filter(e=>e.enabled).length,i=n().controller.pending();return e.json({enabled:!0,connected:!0,breakpoints:{total:t.length,enabled:r},paused:i.length>0,pendingPauses:i.map(e=>({pauseId:e.pauseId,point:e.snapshot.point,turn:e.snapshot.turn,frameDepth:e.snapshot.frameDepth,messagesCount:e.snapshot.messagesCount,lastToolName:e.snapshot.lastToolName,tokenUsage:e.snapshot.tokenUsage,systemPrompt:e.snapshot.systemPrompt,llmParams:e.snapshot.llmParams,messagesSummary:e.snapshot.messagesSummary}))})}),t.post(`/resume`,async t=>{let n=e.bridge;if(!n)return t.json({error:`debug bridge not available`},503);if(!n.isConnected)return t.json({error:`debug bridge not connected to worker — command cannot be delivered`},503);let r=await t.req.json().catch(()=>({})),i=r.command??`continue`;return[`continue`,`next`,`step`,`over`,`stop`].includes(i)?(n.send({type:i,seq:Date.now(),depth:0},r.payload),t.json({status:`ok`,command:i})):t.json({error:`invalid command: ${i}`},400)}),t.post(`/inject`,async t=>{let n=e.bridge;if(!n)return t.json({error:`debug bridge not available`},503);if(!n.isConnected)return t.json({error:`debug bridge not connected to worker — command cannot be delivered`},503);let r=await t.req.json().catch(()=>null);return!r||r.injectMessages===void 0&&r.systemPrompt===void 0&&r.llmParams===void 0?t.json({error:`at least one of injectMessages, systemPrompt, or llmParams is required`},400):(n.send({type:`continue`,seq:Date.now()},{systemPrompt:r.systemPrompt,injectMessages:r.injectMessages?.map(e=>({role:e.role,content:e.content})),llmParams:r.llmParams}),t.json({status:`ok`}))}),t}const Ti={trace:0,debug:1,info:2,warn:3,error:4,fatal:5};function Ei(e){let t=new m;return t.get(`/history`,t=>{if(!e.bridge)return t.json({entries:[],total:0});let n=Number(t.req.query(`limit`)??100),r=Number.isFinite(n)&&n>0?Math.min(n,2e3):100,i=t.req.query(`level`),a=t.req.query(`module`),o=e.bridge.getLogs();if(i&&Ti[i]!==void 0){let e=Ti[i];o=o.filter(t=>(Ti[t.level]??0)>=e)}a&&(o=o.filter(e=>e.module.includes(a)));let s=o.length;return o=o.slice(-r),t.json({entries:o,total:s})}),t.get(`/stream`,t=>e.bridge?ye(t,async t=>{let n=e.bridge?.on(`Log.entryAdded`,e=>{t.writeSSE({event:`log`,data:JSON.stringify(e)})});await new Promise(e=>{t.onAbort(()=>{n?.(),e()})})}):t.text(`debugger not enabled`,503)),t}function Di(e){let t=new m;return t.get(`/extensions`,t=>t.json({extensions:e.app.extensions.list()})),t.post(`/extensions/toggle`,async t=>{let n=await t.req.json().catch(()=>({}));if(!n.category||!n.id||typeof n.enabled!=`boolean`)return t.json({error:`category, id, enabled required`},400);try{return await e.app.extensions.setEnabled(n.category,n.id,n.enabled),t.json({ok:!0})}catch(e){return t.json({error:e instanceof Error?e.message:String(e)},400)}}),t.get(`/commands`,t=>{let n=e.app.listFileCommands();return t.json({commands:n.map(e=>({name:e.name,description:e.description,argumentHint:e.argumentHint,source:e.source,scope:e.scope,pluginId:e.pluginId}))})}),t.get(`/sigil`,async t=>{let n=t.req.query(`q`)??``,r=t.req.query(`sigil`),i=r===`#`||r===`@`?r:void 0,a=Number(t.req.query(`max`)??`50`),o=Number.isFinite(a)&&a>0?a:50,s=await e.app.pluginInput.searchAsync(n,i,o);return t.json({entries:s})}),t.post(`/sigil/expand`,async t=>{let n=await t.req.json().catch(()=>({}));if(typeof n.text!=`string`)return t.json({error:`text required`},400);let r=await e.app.expandSigilChips(n.text,{uiHost:!1,skipPrefixes:new Set([`model`])});return t.json({text:r})}),t.get(`/plugin-status-items`,t=>{let n=e.app.getPluginStatusItems();return t.json({items:n})}),t.get(`/plugin-menu-items`,t=>{let n=e.app.getGlobalMenuItems();return t.json({items:n})}),t.get(`/shortcuts`,t=>t.json({shortcuts:e.app.getShortcuts()})),t.post(`/shortcuts`,async t=>{let n=await t.req.json().catch(()=>({}));if(typeof n.name!=`string`||typeof n.text!=`string`)return t.json({error:`name and text are required`},400);try{return await e.app.saveShortcut(n.name,n.text,n.previousName),t.json({shortcuts:e.app.getShortcuts()})}catch(e){return t.json({error:e instanceof Error?e.message:String(e)},400)}}),t.delete(`/shortcuts/:name`,async t=>(await e.app.deleteShortcut(t.req.param(`name`)),t.json({shortcuts:e.app.getShortcuts()}))),t.get(`/plugin-renderers`,t=>{let n=e.app.getPluginRenderers();return t.json({renderers:n})}),t.get(`/plugin-status-widgets`,t=>{let n=e.app.getPluginStatusWidgets();return t.json({widgets:n})}),t.get(`/plugin-file-viewers`,t=>{let n=e.app.getPluginFileViewers();return t.json({viewers:n})}),t}function Oi(e){let t=new m;function n(e){return{id:e.id,sessionId:e.sessionId,title:e.title,origin:e.origin,status:e.status,startedAt:e.startedAt,hasDiff:e.diff!=null}}return t.get(`/`,e=>{let t=[...g.list()].sort((e,t)=>t.startedAt-e.startedAt);return e.json({jobs:t.map(n)})}),t.get(`/:id/diff`,e=>{let t=e.req.param(`id`),n=g.get(t);return n?n.diff==null?e.json({error:`diff not ready (job may still be running)`},409):e.json({id:n.id,diff:n.diff}):e.json({error:`job not found`},404)}),t.get(`/:id`,e=>{let t=e.req.param(`id`),r=g.get(t);return r?e.json({job:n(r)}):e.json({error:`job not found`},404)}),t}function ki(e){let t=new m;return t.get(`/status`,t=>e.app.isFeedbackAvailable()?t.json({available:!0}):t.json({available:!1},503)),t.post(`/pulse-survey`,async t=>{if(!e.app.isFeedbackAvailable())return t.json({error:`feedback plugin not available`},503);let n=await t.req.json().catch(()=>({}));return!n.rating||![`good`,`neutral`,`bad`].includes(n.rating)?t.json({error:`rating must be one of good|neutral|bad`},400):n.sdkVersion?(e.app.recordPulseSurvey({ts:Date.now(),rating:n.rating,comment:n.comment,sdkVersion:n.sdkVersion,modelId:n.modelId}),t.json({ok:!0})):t.json({error:`sdkVersion is required`},400)}),t.post(`/issue`,async t=>{if(!e.app.isFeedbackAvailable())return t.json({error:`feedback plugin not available`},503);let n=await t.req.json().catch(()=>({}));if(!n.title)return t.json({error:`title is required`},400);if(!n.repo)return t.json({error:`repo is required`},400);let r=e.app.buildFeedbackIssueUrl({title:n.title,reproduce:n.reproduce,expected:n.expected,actual:n.actual,envInfo:n.envInfo??``,repo:n.repo});return r?t.json({url:r}):t.json({error:`feedback plugin does not support buildIssueUrl`},503)}),t}function Z(e){let t=()=>e.app.storage.storageHost??null;return{middleware:async(e,n)=>{let r=t();if(!r)return e.json({error:`storage_host_not_configured`},404);if(!r.token||!tt(nt(e),r.token))return e.json({error:`forbidden`},403);await n()},binding:t}}function Ai(){return async(e,t)=>{let n=e.req.param(`wsKey`);if(!n)return e.json({error:`missing_workspace_key`},400);if(n!==be&&(!n.startsWith(`ws_`)||!xe(n.slice(3))))return e.json({error:`invalid_workspace_key`},400);await t()}}function ji(e){let t=e.req.query(`ws`);return t?t===be?t:!t.startsWith(`ws_`)||!xe(t.slice(3))?null:t:null}var Mi=class{listeners=new Map;on(e,t){return this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t),()=>{this.listeners.get(e)?.delete(t)}}emit(e){let t=this.listeners.get(e.namespace);if(t)for(let n of t)try{n(e)}catch{}}reset(){this.listeners.clear()}get listenerCount(){let e=0;for(let t of this.listeners.values())e+=t.size;return e}};const Ni=new Mi,Q=h(`@x-otto/service:storage`);function Pi(e){let t=new m,{middleware:n,binding:r}=Z(e);t.use(`/:namespace/:wsKey/*`,Ai()),t.use(`*`,n);let i=e=>{let t=r(),n=e.req.param(`namespace`),i=e.req.param(`wsKey`);return!t||!n||!i||!t.host.has(n)?null:{namespace:n,wsKey:i,host:t.host}};return t.get(`/:namespace/:wsKey`,async e=>{let t=i(e);if(!t)return e.json({error:`unknown_namespace`},404);let{namespace:n,wsKey:r,host:a}=t;try{let t=e.req.header(`X-Agent-Id`),i=e.req.query(`scope`),o=e.req.query(`page`);if(o===void 0){let o=await a.list(n,r,t,i);return e.json({ids:o})}let s=Number.parseInt(o,10),c=Number.parseInt(e.req.query(`pageSize`)??``,10),l=await a.listPaginated(n,r,{page:Number.isFinite(s)&&s>=0?s:0,pageSize:Number.isFinite(c)&&c>0?c:20,sortBy:e.req.query(`sortBy`)??`updatedAt`,order:e.req.query(`order`)===`asc`?`asc`:`desc`});return e.json(l)}catch(t){return Q.error({namespace:n,wsKey:r,error:t},`storage list failed`),e.json({error:`storage_error`},500)}}),t.get(`/:namespace/:wsKey/recent`,async e=>{let t=i(e);if(!t)return e.json({error:`unknown_namespace`},404);let{namespace:n,wsKey:r,host:a}=t;try{let t=Math.max(1,Math.min(1e3,Number(e.req.query(`limit`))||50)),i=await a.list(n,r),o=[];for(let e of i){let t=await a.load(n,r,e);!t||t.metadata?.archived||o.push({id:e,lastActiveAt:t.metadata?.lastActiveAt??t.metadata?.createdAt??0})}return o.sort((e,t)=>t.lastActiveAt-e.lastActiveAt),e.json({ids:o.slice(0,t).map(e=>e.id)})}catch(t){return Q.error({namespace:n,wsKey:r,error:t},`storage recent list failed`),e.json({error:`storage_error`},500)}}),t.get(`/:namespace/:wsKey/:id`,async e=>{let t=i(e);if(!t)return e.json({error:`unknown_namespace`},404);let{namespace:n,wsKey:r,host:a}=t;try{let t=await a.load(n,r,e.req.param(`id`));return t===null?e.json({error:`not_found`},404):e.json(t)}catch(t){return Q.error({namespace:n,wsKey:r,error:t},`storage load failed`),e.json({error:`storage_error`},500)}}),t.put(`/:namespace/:wsKey/:id`,async e=>{let t=i(e);if(!t)return e.json({error:`unknown_namespace`},404);let{namespace:n,wsKey:r,host:a}=t,o=await e.req.json().catch(()=>void 0);if(o===void 0)return e.json({error:`invalid_body`},400);try{let t=e.req.header(`X-Agent-Id`);return await a.save(n,r,e.req.param(`id`),o,t),e.json({ok:!0})}catch(t){return Q.error({namespace:n,wsKey:r,error:t},`storage save failed`),e.json({error:`storage_error`},500)}}),t.delete(`/:namespace/:wsKey/:id`,async e=>{let t=i(e);if(!t)return e.json({error:`unknown_namespace`},404);let{namespace:n,wsKey:r,host:a}=t;try{return await a.delete(n,r,e.req.param(`id`))?e.json({ok:!0}):e.json({error:`not_found`},404)}catch(t){return Q.error({namespace:n,wsKey:r,error:t},`storage delete failed`),e.json({error:`storage_error`},500)}}),t.post(`/:namespace/:wsKey/:id/entries`,async e=>{let t=i(e);if(!t)return e.json({error:`unknown_namespace`},404);let{namespace:n,wsKey:r,host:a}=t,o=e.req.param(`id`),s=await e.req.json().catch(()=>void 0);if(s===void 0)return e.json({error:`invalid_body`},400);try{let t=await a.appendEntry(n,r,o,s);return Ni.emit({namespace:n,wsKey:r,docId:o,entry:t.entry,ts:Date.now()}),e.json({seq:t.seq,ts:Date.now()})}catch(t){return Q.error({namespace:n,docId:o,error:t},`entry append failed`),e.json({error:`storage_error`},500)}}),t}const Fi=[`/api/health`,`/api/storage`];function Ii(e,t={}){let n=new m;if(t.corsOrigin&&n.use(`/api/*`,ce({origin:t.corsOrigin,allowMethods:[`GET`,`POST`,`PUT`,`DELETE`,`OPTIONS`],allowHeaders:[`Content-Type`,`Authorization`]})),t.authToken){let e=t.authToken,r=async(t,n)=>{if(!tt(nt(t),e))return t.json({error:`forbidden`},403);await n()};n.use(`/api/*`,(e,t)=>{let n=e.req.path;return Fi.some(e=>n===e||n.startsWith(`${e}/`))?t():r(e,t)})}return n.route(`/api/health`,rt(e)),n.route(`/api/authority`,it(e)),n.route(`/api/chat`,dt(e)),n.route(`/api/sessions`,vt(e)),n.route(`/api/storage`,Pi(e)),n.route(`/api/setting`,xi(e)),n.route(`/api/devtools`,Si(e,t.devtools||null)),n.route(`/api/debugger`,wi(e)),n.route(`/api/logs`,Ei(e)),n.route(`/api/catalog`,Di(e)),n.route(`/api/jobs`,Oi(e)),n.route(`/api/plugin-feedback`,ki(e)),t.staticDir&&n.get(`*`,t=>e.static(t)),n.notFound(e=>e.text(`not found`,404)),n}var Li=class{buffers=new Map;cursors=new Map;constructor(e=512){this.capacity=e}append(e,t){let n=(this.cursors.get(e)??0)+1;this.cursors.set(e,n);let r=this.buffers.get(e)??[];return r.push({seq:n,message:t}),r.length>this.capacity&&r.splice(0,r.length-this.capacity),this.buffers.set(e,r),n}cursorOf(e){return this.cursors.get(e)??0}readFrom(e,t){let n=this.cursorOf(e);if(t>n)return{ok:!1,reason:`gap`,oldestAvailable:n};if(t===n)return{ok:!0,events:[]};let r=this.buffers.get(e)??[],i=r[0]?.seq??n+1;return t+1<i?{ok:!1,reason:`gap`,oldestAvailable:i}:{ok:!0,events:r.filter(e=>e.seq>t)}}clear(e){this.buffers.delete(e),this.cursors.delete(e)}};const Ri=h(`@x-otto/service`),zi={".html":`text/html`,".js":`application/javascript`,".css":`text/css`,".json":`application/json`,".png":`image/png`,".svg":`image/svg+xml`,".ico":`image/x-icon`,".woff2":`font/woff2`,".woff":`font/woff`};var Bi=class{httpApp;server;host;port;staticDir;apiToken;wsAuthToken;authority;eventLog=new Li;bridges=new Map;traceBridges=new Map;router;started=!1;bridge=null;ws;get httpServer(){return this.server}constructor(e,t){this.app=e,this.host=t.host??`127.0.0.1`,this.port=t.port,this.staticDir=t.staticDir,this.apiToken=t.apiToken,this.wsAuthToken=t.wsAuthToken,this.authority=Object.freeze({instanceId:t.authorityId??o(),workspaceDir:e.workspaceDir,protocolVersion:1,capabilities:Object.freeze([`session.snapshot`,`session.subscribe`])}),this.ws=new Me({allowedOrigins:t.cors?[t.cors]:void 0,authToken:t.wsAuthToken}),e.devtools&&(this.bridge=new Ve(e.devtools,this.ws)),this.router=new et(this.ws,this.app,this.bridge,(e,t)=>this.eventLog.readFrom(e,t)),this.httpApp=Ii(this,{corsOrigin:t.cors,devtools:e.devtools??void 0,staticDir:t.staticDir,debug:this.bridge,authToken:t.apiToken}),this.server=te({fetch:this.httpApp.fetch})}registerHooks(e){let t=({sessionId:e})=>{let t=this.getSession(e);t&&this.attachSession(t)};e.registerHook(Se({name:`service_session_attach`,timing:`session.created`,priority:5,handle:t})),e.registerHook(Se({name:`service_session_restore_attach`,timing:`session.restored`,priority:5,handle:t})),e.registerHook(Se({name:`service_session_detach`,timing:`session.deleted`,priority:5,handle:({sessionId:e})=>{this.detachSession(e)}}))}unregisterHooks(e){e.unregisterHook(`service_session_attach`),e.unregisterHook(`service_session_restore_attach`),e.unregisterHook(`service_session_detach`)}getSession(e){return this.app.getSession(e)}getActiveSession(){return this.app.getActiveSession()}getAuthorityDescriptor(){return this.authority}getSessionSnapshot(e){let t=this.getSession(e);if(t)return{authority:this.authority,session:{id:t.id,status:t.status,messageCount:t.session.messages().length,messages:at(t)},cursor:this.eventLog.cursorOf(e),snapshotAt:new Date().toISOString()}}readSessionEventsSince(e,t){return this.eventLog.readFrom(e,t)}onUpgrade=(e,t,n)=>{let r=new URL(e.url??`/`,`http://${this.host}:${this.port}`);this.ws.handleUpgrade(e,t,n,r.pathname)||t.destroy()};onWsMessage=(e,t)=>{this.router.dispatch(e,t)};async start(){if(!this.started){if(!(this.host===`127.0.0.1`||this.host===`::1`||this.host===`localhost`)&&(!this.apiToken||!this.wsAuthToken))throw Error(`Refusing to bind non-loopback host "${this.host}" without both apiToken and wsAuthToken: the HTTP API and the WS control channel each expose full tool execution and are authenticated independently. Set options.apiToken AND options.wsAuthToken, or bind to 127.0.0.1.`);return this.server.on(`upgrade`,this.onUpgrade),this.ws.on(`message`,this.onWsMessage),this.registerHooks(this.app),new Promise((e,t)=>{let n=e=>{this.server.off(`error`,n),this.server.off(`upgrade`,this.onUpgrade),this.ws.off(`message`,this.onWsMessage),this.unregisterHooks(this.app),t(e)};this.server.on(`error`,n),this.server.listen(this.port,this.host,()=>{this.server.off(`error`,n),this.started=!0,this.bridge?.attach(),Ri.info({host:this.host,port:this.port},`service started`),e()})})}}async stop(){if(this.started){this.bridge?.detach();for(let[,e]of this.bridges)e.detach();this.bridges.clear();for(let[,e]of this.traceBridges)e.detach();return this.traceBridges.clear(),this.server.off(`upgrade`,this.onUpgrade),this.ws.off(`message`,this.onWsMessage),this.unregisterHooks(this.app),this.ws.close(),new Promise(e=>{this.server.close(()=>{this.started=!1,Ri.info(`service stopped`),e()})})}}attachSession(e){if(this.bridges.has(e.id))return;let t=new Ie(e,{broadcast:e=>this.ws.broadcast(e),sendToSession:(e,t)=>{let n=this.eventLog.append(e,t),r=t.type===`Session.event`?{...t,data:{...t.data,seq:n}}:t;this.ws.sendToSession(e,r)},sendToSubscribers:(e,t)=>this.ws.sendToSubscribers(e,t)},this.app);t.attach(),this.bridges.set(e.id,t);let n=new Re(e.id,this.app.storage.traceStore,this.ws);n.attach(),this.traceBridges.set(e.id,n)}detachSession(e){let t=this.bridges.get(e);t&&(t.detach(),this.bridges.delete(e));let n=this.traceBridges.get(e);n&&(n.detach(),this.traceBridges.delete(e)),this.ws.clearSessionSubscriptions(e),this.eventLog.clear(e)}static(n){if(!this.staticDir)return n.text(`not found`,404);let r=n.req.path;(r===`/`||!r.includes(`.`))&&(r=`/index.html`);let i=d(this.staticDir,r);if(i!==this.staticDir&&!i.startsWith(this.staticDir+ee))return n.text(`forbidden`,403);if(!e(i)){let r=d(this.staticDir,`index.html`);if(e(r)){let e=t(r);return new Response(e,{headers:{"Content-Type":`text/html`}})}return n.text(`not found`,404)}let a=zi[l(i)]||`application/octet-stream`,o=t(i);return new Response(o,{headers:{"Content-Type":a}})}};function Vi(e,t){return new Bi(e,t)}function Hi(){return async(e,t)=>{let n=e.req.header(`X-Request-Id`)??o();e.set(`requestId`,n),e.header(`X-Request-Id`,n),await t()}}const Ui=h(`@x-otto/service:access`);function Wi(){return async(e,t)=>{let n=Date.now();await t();let r=Date.now()-n;Ui.info({requestId:e.get(`requestId`)??``,method:e.req.method,path:e.req.path,status:e.res.status,latency:r},`${e.req.method} ${e.req.path} → ${e.res.status} ${r}ms`)}}function Gi(e){let t=e.defaultRps,n=e.burst??t,r=new Map,i=setInterval(()=>{let e=Date.now()-5*6e4;for(let[t,n]of r)n.lastRefill<e&&r.delete(t)},6e4);i.unref&&i.unref();function a(e){return`${e.req.param(`namespace`)??e.req.path.split(`/`)[2]??`root`}:${e.req.header(`X-Forwarded-For`)?.split(`,`)[0]?.trim()??e.req.header(`X-Real-IP`)??`127.0.0.1`}`}return async(e,i)=>{let o=a(e),s=Date.now(),c=r.get(o);c||(c={tokens:n,lastRefill:s},r.set(o,c));let l=(s-c.lastRefill)/1e3;return c.tokens=Math.min(n,c.tokens+l*t),c.lastRefill=s,c.tokens>=1?(c.tokens--,i()):e.json({error:`rate_limit_exceeded`},429)}}const Ki=h(`@x-otto/service:events`);function qi(e){let t=new m,{middleware:n,binding:r}=Z(e);return t.use(`*`,n),t.get(`/`,async e=>{let t=r();if(!t)return e.json({error:`storage_host_not_configured`},404);let n=e.req.query(`topics`);if(!n)return e.json({error:`missing_topics`},400);let i=n.split(`,`).map(e=>e.trim()).filter(Boolean);if(i.length===0)return e.json({error:`missing_topics`},400);for(let n of i)if(!t.host.has(n))return e.json({error:`unknown_namespace: ${n}`},404);let a=Ji(t,i,ji(e)||void 0,Number.parseInt(e.req.query(`since`)??`0`,10)||0,200,new AbortController,{includeTopic:!0});return new Response(a,{headers:{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`,"X-Accel-Buffering":`no`}})}),t.get(`/:namespace`,async e=>{let t=r(),n=e.req.param(`namespace`);if(!t||!n||!t.host.has(n))return e.json({error:`unknown_namespace`},404);let i=ji(e)||void 0,a=Number.parseInt(e.req.query(`since`)??`0`,10)||0,o=new AbortController,s=Ji(t,[n],i,a,200,o,{includeTopic:!1});return new Response(s,{headers:{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`,"X-Accel-Buffering":`no`}})}),t}function Ji(e,t,n,r,i,a,o){let s=a.signal;return new ReadableStream({async start(c){let l=[];for(let e of t)l.push(Ni.on(e,e=>{try{if(n!==void 0&&e.wsKey!==n)return;let t={docId:e.docId,entry:e.entry,ts:e.ts};o.includeTopic&&(t.topic=e.namespace),c.enqueue(`event: append\ndata: ${JSON.stringify(t)}\n\n`)}catch{}}));let u=setInterval(()=>{try{c.enqueue(`: ping
39
+ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.`)}for(let n of e.seen.entries()){let r=n[1];if(t===n[0]){a(n);continue}if(e.external){let r=e.external.registry.get(n[0])?.id;if(t!==n[0]&&r){a(n);continue}}if(e.metadataRegistry.get(n[0])?.id){a(n);continue}if(r.cycle){a(n);continue}if(r.count>1&&e.reused===`ref`){a(n);continue}}}function rr(e,t){let n=e.seen.get(t);if(!n)throw Error(`Unprocessed schema. This is a bug in Zod.`);let r=t=>{let n=e.seen.get(t);if(n.ref===null)return;let i=n.def??n.schema,a={...i},o=n.ref;if(n.ref=null,o){r(o);let n=e.seen.get(o),s=n.schema;if(s.$ref&&(e.target===`draft-07`||e.target===`draft-04`||e.target===`openapi-3.0`)?(i.allOf=i.allOf??[],i.allOf.push(s)):Object.assign(i,s),Object.assign(i,a),t._zod.parent===o)for(let e in i)e===`$ref`||e===`allOf`||e in a||delete i[e];if(s.$ref&&n.def)for(let e in i)e===`$ref`||e===`allOf`||e in n.def&&JSON.stringify(i[e])===JSON.stringify(n.def[e])&&delete i[e]}let s=t._zod.parent;if(s&&s!==o){r(s);let t=e.seen.get(s);if(t?.schema.$ref&&(i.$ref=t.schema.$ref,t.def))for(let e in i)e===`$ref`||e===`allOf`||e in t.def&&JSON.stringify(i[e])===JSON.stringify(t.def[e])&&delete i[e]}e.override({zodSchema:t,jsonSchema:i,path:n.path??[]})};for(let t of[...e.seen.entries()].reverse())r(t[0]);let i={};if(e.target===`draft-2020-12`?i.$schema=`https://json-schema.org/draft/2020-12/schema`:e.target===`draft-07`?i.$schema=`http://json-schema.org/draft-07/schema#`:e.target===`draft-04`?i.$schema=`http://json-schema.org/draft-04/schema#`:e.target,e.external?.uri){let n=e.external.registry.get(t)?.id;if(!n)throw Error("Schema is missing an `id` property");i.$id=e.external.uri(n)}Object.assign(i,n.def??n.schema);let a=e.external?.defs??{};for(let t of e.seen.entries()){let e=t[1];e.def&&e.defId&&(a[e.defId]=e.def)}e.external||Object.keys(a).length>0&&(e.target===`draft-2020-12`?i.$defs=a:i.definitions=a);try{let n=JSON.parse(JSON.stringify(i));return Object.defineProperty(n,`~standard`,{value:{...t[`~standard`],jsonSchema:{input:J(t,`input`,e.processors),output:J(t,`output`,e.processors)}},enumerable:!1,writable:!1}),n}catch{throw Error(`Error converting schema to JSON.`)}}function q(e,t){let n=t??{seen:new Set};if(n.seen.has(e))return!1;n.seen.add(e);let r=e._zod.def;if(r.type===`transform`)return!0;if(r.type===`array`)return q(r.element,n);if(r.type===`set`)return q(r.valueType,n);if(r.type===`lazy`)return q(r.getter(),n);if(r.type===`promise`||r.type===`optional`||r.type===`nonoptional`||r.type===`nullable`||r.type===`readonly`||r.type===`default`||r.type===`prefault`)return q(r.innerType,n);if(r.type===`intersection`)return q(r.left,n)||q(r.right,n);if(r.type===`record`||r.type===`map`)return q(r.keyType,n)||q(r.valueType,n);if(r.type===`pipe`)return q(r.in,n)||q(r.out,n);if(r.type===`object`){for(let e in r.shape)if(q(r.shape[e],n))return!0;return!1}if(r.type===`union`){for(let e of r.options)if(q(e,n))return!0;return!1}if(r.type===`tuple`){for(let e of r.items)if(q(e,n))return!0;return!!(r.rest&&q(r.rest,n))}return!1}const ir=(e,t={})=>n=>{let r=tr({...n,processors:t});return K(e,r),nr(r,e),rr(r,e)},J=(e,t,n={})=>r=>{let{libraryOptions:i,target:a}=r??{},o=tr({...i??{},target:a,io:t,processors:n});return K(e,o),nr(o,e),rr(o,e)},ar=(e,t,n,r)=>{n.not={}},or=(e,t,n,r)=>{let i=e._zod.def,a=bt(i.entries);a.every(e=>typeof e==`number`)&&(n.type=`number`),a.every(e=>typeof e==`string`)&&(n.type=`string`),n.enum=a},sr=(e,t,n,r)=>{if(t.unrepresentable===`throw`)throw Error(`Custom types cannot be represented in JSON Schema`)},cr=(e,t,n,r)=>{if(t.unrepresentable===`throw`)throw Error(`Transforms cannot be represented in JSON Schema`)},lr=(e,t,n,r)=>{let i=n,a=e._zod.def,{minimum:o,maximum:s}=e._zod.bag;typeof o==`number`&&(i.minItems=o),typeof s==`number`&&(i.maxItems=s),i.type=`array`,i.items=K(a.element,t,{...r,path:[...r.path,`items`]})},ur=(e,t,n,r)=>{let i=n,a=e._zod.def;i.type=`object`,i.properties={};let o=a.shape;for(let e in o)i.properties[e]=K(o[e],t,{...r,path:[...r.path,`properties`,e]});let s=new Set(Object.keys(o)),c=new Set([...s].filter(e=>{let n=a.shape[e]._zod;return t.io===`input`?n.optin===void 0:n.optout===void 0}));c.size>0&&(i.required=Array.from(c)),a.catchall?._zod.def.type===`never`?i.additionalProperties=!1:a.catchall?a.catchall&&(i.additionalProperties=K(a.catchall,t,{...r,path:[...r.path,`additionalProperties`]})):t.io===`output`&&(i.additionalProperties=!1)},dr=(e,t,n,r)=>{let i=e._zod.def,a=i.inclusive===!1,o=i.options.map((e,n)=>K(e,t,{...r,path:[...r.path,a?`oneOf`:`anyOf`,n]}));a?n.oneOf=o:n.anyOf=o},fr=(e,t,n,r)=>{let i=e._zod.def,a=K(i.left,t,{...r,path:[...r.path,`allOf`,0]}),o=K(i.right,t,{...r,path:[...r.path,`allOf`,1]}),s=e=>`allOf`in e&&Object.keys(e).length===1;n.allOf=[...s(a)?a.allOf:[a],...s(o)?o.allOf:[o]]},pr=(e,t,n,r)=>{let i=e._zod.def,a=K(i.innerType,t,r),o=t.seen.get(e);t.target===`openapi-3.0`?(o.ref=i.innerType,n.nullable=!0):n.anyOf=[a,{type:`null`}]},mr=(e,t,n,r)=>{let i=e._zod.def;K(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType},hr=(e,t,n,r)=>{let i=e._zod.def;K(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType,n.default=JSON.parse(JSON.stringify(i.defaultValue))},gr=(e,t,n,r)=>{let i=e._zod.def;K(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType,t.io===`input`&&(n._prefault=JSON.parse(JSON.stringify(i.defaultValue)))},_r=(e,t,n,r)=>{let i=e._zod.def;K(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType;let o;try{o=i.catchValue(void 0)}catch{throw Error(`Dynamic catch values are not supported in JSON Schema`)}n.default=o},vr=(e,t,n,r)=>{let i=e._zod.def,a=t.io===`input`?i.in._zod.def.type===`transform`?i.out:i.in:i.out;K(a,t,r);let o=t.seen.get(e);o.ref=a},yr=(e,t,n,r)=>{let i=e._zod.def;K(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType,n.readOnly=!0},br=(e,t,n,r)=>{let i=e._zod.def;K(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType},xr=(e,t)=>{Ut.init(e,t),e.name=`ZodError`,Object.defineProperties(e,{format:{value:t=>Kt(e,t)},flatten:{value:t=>Gt(e,t)},addIssue:{value:t=>{e.issues.push(t),e.message=JSON.stringify(e.issues,xt,2)}},addIssues:{value:t=>{e.issues.push(...t),e.message=JSON.stringify(e.issues,xt,2)}},isEmpty:{get(){return e.issues.length===0}}})};w(`ZodError`,xr);const Y=w(`ZodError`,xr,{Parent:Error}),Sr=qt(Y),Cr=Jt(Y),wr=z(Y),Tr=B(Y),Er=Zt(Y),Dr=Qt(Y),Or=$t(Y),kr=en(Y),Ar=tn(Y),jr=nn(Y),Mr=rn(Y),Nr=an(Y),X=w(`ZodType`,(e,t)=>(H.init(e,t),Object.assign(e[`~standard`],{jsonSchema:{input:J(e,`input`),output:J(e,`output`)}}),e.toJSONSchema=ir(e,{}),e.def=t,e.type=t.type,Object.defineProperty(e,`_def`,{value:t}),e.check=(...n)=>e.clone(A(t,{checks:[...t.checks??[],...n.map(e=>typeof e==`function`?{_zod:{check:e,def:{check:`custom`},onattach:[]}}:e)]}),{parent:!0}),e.with=e.check,e.clone=(t,n)=>N(e,t,n),e.brand=()=>e,e.register=((t,n)=>(t.add(e,n),e)),e.parse=(t,n)=>Sr(e,t,n,{callee:e.parse}),e.safeParse=(t,n)=>wr(e,t,n),e.parseAsync=async(t,n)=>Cr(e,t,n,{callee:e.parseAsync}),e.safeParseAsync=async(t,n)=>Tr(e,t,n),e.spa=e.safeParseAsync,e.encode=(t,n)=>Er(e,t,n),e.decode=(t,n)=>Dr(e,t,n),e.encodeAsync=async(t,n)=>Or(e,t,n),e.decodeAsync=async(t,n)=>kr(e,t,n),e.safeEncode=(t,n)=>Ar(e,t,n),e.safeDecode=(t,n)=>jr(e,t,n),e.safeEncodeAsync=async(t,n)=>Mr(e,t,n),e.safeDecodeAsync=async(t,n)=>Nr(e,t,n),e.refine=(t,n)=>e.check(hi(t,n)),e.superRefine=t=>e.check(gi(t)),e.overwrite=t=>e.check(Xn(t)),e.optional=()=>Zr(e),e.exactOptional=()=>$r(e),e.nullable=()=>ti(e),e.nullish=()=>Zr(ti(e)),e.nonoptional=t=>si(e,t),e.array=()=>zr(e),e.or=t=>Ur([e,t]),e.and=t=>Gr(e,t),e.transform=t=>di(e,Yr(t)),e.default=t=>ri(e,t),e.prefault=t=>ai(e,t),e.catch=t=>li(e,t),e.pipe=t=>di(e,t),e.readonly=()=>pi(e),e.describe=t=>{let n=e.clone();return G.add(n,{description:t}),n},Object.defineProperty(e,`description`,{get(){return G.get(e)?.description},configurable:!0}),e.meta=(...t)=>{if(t.length===0)return G.get(e);let n=e.clone();return G.add(n,t[0]),n},e.isOptional=()=>e.safeParse(void 0).success,e.isNullable=()=>e.safeParse(null).success,e.apply=t=>t(e),e)),Pr=w(`ZodUnknown`,(e,t)=>{fn.init(e,t),X.init(e,t),e._zod.processJSONSchema=(e,t,n)=>void 0});function Fr(){return Gn(Pr)}const Ir=w(`ZodNever`,(e,t)=>{pn.init(e,t),X.init(e,t),e._zod.processJSONSchema=(t,n,r)=>ar(e,t,n,r)});function Lr(e){return Kn(Ir,e)}const Rr=w(`ZodArray`,(e,t)=>{hn.init(e,t),X.init(e,t),e._zod.processJSONSchema=(t,n,r)=>lr(e,t,n,r),e.element=t.element,e.min=(t,n)=>e.check(Jn(t,n)),e.nonempty=t=>e.check(Jn(1,t)),e.max=(t,n)=>e.check(qn(t,n)),e.length=(t,n)=>e.check(Yn(t,n)),e.unwrap=()=>e.element});function zr(e,t){return Zn(Rr,e,t)}const Br=w(`ZodObject`,(e,t)=>{yn.init(e,t),X.init(e,t),e._zod.processJSONSchema=(t,n,r)=>ur(e,t,n,r),O(e,`shape`,()=>t.shape),e.keyof=()=>qr(Object.keys(e._zod.def.shape)),e.catchall=t=>e.clone({...e._zod.def,catchall:t}),e.passthrough=()=>e.clone({...e._zod.def,catchall:Fr()}),e.loose=()=>e.clone({...e._zod.def,catchall:Fr()}),e.strict=()=>e.clone({...e._zod.def,catchall:Lr()}),e.strip=()=>e.clone({...e._zod.def,catchall:void 0}),e.extend=t=>Ft(e,t),e.safeExtend=t=>It(e,t),e.merge=t=>Lt(e,t),e.pick=t=>Nt(e,t),e.omit=t=>Pt(e,t),e.partial=(...t)=>Rt(Xr,e,t[0]),e.required=(...t)=>zt(oi,e,t[0])});function Vr(e,t){return new Br({type:`object`,shape:e??{},...P(t)})}const Hr=w(`ZodUnion`,(e,t)=>{xn.init(e,t),X.init(e,t),e._zod.processJSONSchema=(t,n,r)=>dr(e,t,n,r),e.options=t.options});function Ur(e,t){return new Hr({type:`union`,options:e,...P(t)})}const Wr=w(`ZodIntersection`,(e,t)=>{Sn.init(e,t),X.init(e,t),e._zod.processJSONSchema=(t,n,r)=>fr(e,t,n,r)});function Gr(e,t){return new Wr({type:`intersection`,left:e,right:t})}const Kr=w(`ZodEnum`,(e,t)=>{Tn.init(e,t),X.init(e,t),e._zod.processJSONSchema=(t,n,r)=>or(e,t,n,r),e.enum=t.entries,e.options=Object.values(t.entries);let n=new Set(Object.keys(t.entries));e.extract=(e,r)=>{let i={};for(let r of e)if(n.has(r))i[r]=t.entries[r];else throw Error(`Key ${r} not found in enum`);return new Kr({...t,checks:[],...P(r),entries:i})},e.exclude=(e,r)=>{let i={...t.entries};for(let t of e)if(n.has(t))delete i[t];else throw Error(`Key ${t} not found in enum`);return new Kr({...t,checks:[],...P(r),entries:i})}});function qr(e,t){return new Kr({type:`enum`,entries:Array.isArray(e)?Object.fromEntries(e.map(e=>[e,e])):e,...P(t)})}const Jr=w(`ZodTransform`,(e,t)=>{En.init(e,t),X.init(e,t),e._zod.processJSONSchema=(t,n,r)=>cr(e,t,n,r),e._zod.parse=(n,r)=>{if(r.direction===`backward`)throw new yt(e.constructor.name);n.addIssue=r=>{if(typeof r==`string`)n.issues.push(R(r,n.value,t));else{let t=r;t.fatal&&(t.continue=!1),t.code??=`custom`,t.input??=n.value,t.inst??=e,n.issues.push(R(t))}};let i=t.transform(n.value,n);return i instanceof Promise?i.then(e=>(n.value=e,n)):(n.value=i,n)}});function Yr(e){return new Jr({type:`transform`,transform:e})}const Xr=w(`ZodOptional`,(e,t)=>{On.init(e,t),X.init(e,t),e._zod.processJSONSchema=(t,n,r)=>br(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function Zr(e){return new Xr({type:`optional`,innerType:e})}const Qr=w(`ZodExactOptional`,(e,t)=>{kn.init(e,t),X.init(e,t),e._zod.processJSONSchema=(t,n,r)=>br(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function $r(e){return new Qr({type:`optional`,innerType:e})}const ei=w(`ZodNullable`,(e,t)=>{An.init(e,t),X.init(e,t),e._zod.processJSONSchema=(t,n,r)=>pr(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function ti(e){return new ei({type:`nullable`,innerType:e})}const ni=w(`ZodDefault`,(e,t)=>{jn.init(e,t),X.init(e,t),e._zod.processJSONSchema=(t,n,r)=>hr(e,t,n,r),e.unwrap=()=>e._zod.def.innerType,e.removeDefault=e.unwrap});function ri(e,t){return new ni({type:`default`,innerType:e,get defaultValue(){return typeof t==`function`?t():kt(t)}})}const ii=w(`ZodPrefault`,(e,t)=>{Nn.init(e,t),X.init(e,t),e._zod.processJSONSchema=(t,n,r)=>gr(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function ai(e,t){return new ii({type:`prefault`,innerType:e,get defaultValue(){return typeof t==`function`?t():kt(t)}})}const oi=w(`ZodNonOptional`,(e,t)=>{Pn.init(e,t),X.init(e,t),e._zod.processJSONSchema=(t,n,r)=>mr(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function si(e,t){return new oi({type:`nonoptional`,innerType:e,...P(t)})}const ci=w(`ZodCatch`,(e,t)=>{In.init(e,t),X.init(e,t),e._zod.processJSONSchema=(t,n,r)=>_r(e,t,n,r),e.unwrap=()=>e._zod.def.innerType,e.removeCatch=e.unwrap});function li(e,t){return new ci({type:`catch`,innerType:e,catchValue:typeof t==`function`?t:()=>t})}const ui=w(`ZodPipe`,(e,t)=>{Ln.init(e,t),X.init(e,t),e._zod.processJSONSchema=(t,n,r)=>vr(e,t,n,r),e.in=t.in,e.out=t.out});function di(e,t){return new ui({type:`pipe`,in:e,out:t})}const fi=w(`ZodReadonly`,(e,t)=>{Rn.init(e,t),X.init(e,t),e._zod.processJSONSchema=(t,n,r)=>yr(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function pi(e){return new fi({type:`readonly`,innerType:e})}const mi=w(`ZodCustom`,(e,t)=>{Bn.init(e,t),X.init(e,t),e._zod.processJSONSchema=(t,n,r)=>sr(e,t,n,r)});function hi(e,t={}){return Qn(mi,e,t)}function gi(e){return $n(e)}const _i=qr([`readonly`,`confirm`,`auto`]),vi=qr([`low`,`medium`,`high`,`xhigh`,`max`]),yi=Vr({mode:_i}),bi=Vr({level:vi});function xi(e){let t=new m;return t.get(`/`,t=>{let n=e.getActiveSession();return t.json({workingDirectory:e.app.workspaceDir,model:n?.model?.id,modelProvider:n?.model?.provider})}),t.put(`/`,async t=>{let n=await t.req.json().catch(()=>({}));try{let r=await e.app.updateSettings(n);return t.json({status:`ok`,settings:{model:r.model,thinking_level:r.thinking_level,permission_mode:r.permission_mode}})}catch(e){return t.json({status:`error`,message:`setting update failed: ${e instanceof Error?e.message:String(e)}`},500)}}),t.get(`/providers`,t=>{let n=e.app.listProviders();return t.json(n.map(e=>({id:e,name:e,models:[]})))}),t.get(`/models`,t=>{t.header(`Cache-Control`,`public, max-age=300`);try{let n=e.app.getAllModels();return t.json({models:n.map(e=>({id:e.id,provider:e.provider,name:e.name,reasoning:e.reasoning,input:e.input,contextWindow:e.contextWindow,maxOutputTokens:e.maxOutputTokens,cost:e.cost,...e.thinkingLevels?{thinkingLevels:e.thinkingLevels}:{}}))})}catch{return t.json({error:`failed to list models`},500)}}),t.post(`/verify-model`,async t=>{let n=await t.req.json().catch(()=>({}));if(typeof n.model!=`string`||!n.model)return t.json({valid:!1,error:`model is required`},400);try{return e.app.resolveModel(n.model),t.json({valid:!0})}catch{return t.json({valid:!1,error:`model not found`})}}),t.post(`/mode`,async t=>{let n;try{n=await t.req.json()}catch{return t.json({status:`error`,message:`invalid JSON body`},400)}let r=yi.safeParse(n);if(!r.success)return t.json({status:`error`,message:`invalid mode: ${r.error.issues.map(e=>e.message).join(`; `)}`},400);try{return await e.app.updateSettings({permission_mode:r.data.mode}),t.json({status:`ok`})}catch(e){return t.json({status:`error`,message:`mode switch failed: ${e instanceof Error?e.message:String(e)}`},500)}}),t.post(`/autonomy`,async e=>(await e.req.json().catch(()=>({})),e.json({status:`error`,message:`autonomy is not a configurable setting field; use PUT /api/setting to update permission_mode or thinking_level`},501))),t.post(`/thinking`,async t=>{let n;try{n=await t.req.json()}catch{return t.json({status:`error`,message:`invalid JSON body`},400)}let r=bi.safeParse(n);if(!r.success)return t.json({status:`error`,message:`invalid thinking level: ${r.error.issues.map(e=>e.message).join(`; `)}`},400);try{return await e.app.updateSettings({thinking_level:r.data.level}),t.json({status:`ok`})}catch(e){return t.json({status:`error`,message:`thinking switch failed: ${e instanceof Error?e.message:String(e)}`},500)}}),t}function Si(e,t){let n=new m;return n.get(`/status`,e=>e.json({enabled:t!==null})),n.use(`/*`,async(e,n)=>{if(!t)return e.json({error:`debugger not enabled`},503);await n()}),n.get(`/breakpoints`,e=>{let n=t?.debugger.listBreakpoints();return e.json({breakpoints:n})}),n}const Ci=he.map(e=>e.point);function wi(e){let t=new m,n=()=>e.app.devtools;return t.use(`/*`,async(e,t)=>{if(!n())return e.json({error:`debugger not available (start with --inspect)`},503);await t()}),t.get(`/breakpoints`,e=>{let t=n().debugger,r=he.map(({point:e})=>{let n=t.getBreakpoint(e);return{point:e,enabled:n?.enabled??!1,set:n!==void 0}});return e.json({breakpoints:r})}),t.put(`/breakpoints/:point`,async e=>{let t=e.req.param(`point`);if(!Ci.includes(t))return e.json({error:`unknown breakpoint point: ${t}`},400);let r=(await e.req.json().catch(()=>({enabled:!0}))).enabled??!0,i=n().debugger.setBreakpoint(t,r);return e.json({breakpoint:i})}),t.post(`/breakpoints/enable-all`,e=>(n().debugger.enableAllBreakpoints(),e.json({status:`ok`}))),t.post(`/breakpoints/disable-all`,e=>(n().debugger.disableAllBreakpoints(),e.json({status:`ok`}))),t.get(`/state`,e=>{let t=n().debugger.listBreakpoints(),r=t.filter(e=>e.enabled).length,i=n().controller.pending();return e.json({enabled:!0,connected:!0,breakpoints:{total:t.length,enabled:r},paused:i.length>0,pendingPauses:i.map(e=>({pauseId:e.pauseId,point:e.snapshot.point,turn:e.snapshot.turn,frameDepth:e.snapshot.frameDepth,messagesCount:e.snapshot.messagesCount,lastToolName:e.snapshot.lastToolName,tokenUsage:e.snapshot.tokenUsage,systemPrompt:e.snapshot.systemPrompt,llmParams:e.snapshot.llmParams,messagesSummary:e.snapshot.messagesSummary}))})}),t.post(`/resume`,async t=>{let n=e.bridge;if(!n)return t.json({error:`debug bridge not available`},503);if(!n.isConnected)return t.json({error:`debug bridge not connected to worker — command cannot be delivered`},503);let r=await t.req.json().catch(()=>({})),i=r.command??`continue`;return[`continue`,`next`,`step`,`over`,`stop`].includes(i)?(n.send({type:i,seq:Date.now(),depth:0},r.payload),t.json({status:`ok`,command:i})):t.json({error:`invalid command: ${i}`},400)}),t.post(`/inject`,async t=>{let n=e.bridge;if(!n)return t.json({error:`debug bridge not available`},503);if(!n.isConnected)return t.json({error:`debug bridge not connected to worker — command cannot be delivered`},503);let r=await t.req.json().catch(()=>null);return!r||r.injectMessages===void 0&&r.systemPrompt===void 0&&r.llmParams===void 0?t.json({error:`at least one of injectMessages, systemPrompt, or llmParams is required`},400):(n.send({type:`continue`,seq:Date.now()},{systemPrompt:r.systemPrompt,injectMessages:r.injectMessages?.map(e=>({role:e.role,content:e.content})),llmParams:r.llmParams}),t.json({status:`ok`}))}),t}const Ti={trace:0,debug:1,info:2,warn:3,error:4,fatal:5};function Ei(e){let t=new m;return t.get(`/history`,t=>{if(!e.bridge)return t.json({entries:[],total:0});let n=Number(t.req.query(`limit`)??100),r=Number.isFinite(n)&&n>0?Math.min(n,2e3):100,i=t.req.query(`level`),a=t.req.query(`module`),o=e.bridge.getLogs();if(i&&Ti[i]!==void 0){let e=Ti[i];o=o.filter(t=>(Ti[t.level]??0)>=e)}a&&(o=o.filter(e=>e.module.includes(a)));let s=o.length;return o=o.slice(-r),t.json({entries:o,total:s})}),t.get(`/stream`,t=>e.bridge?ye(t,async t=>{let n=e.bridge?.on(`Log.entryAdded`,e=>{t.writeSSE({event:`log`,data:JSON.stringify(e)})});await new Promise(e=>{t.onAbort(()=>{n?.(),e()})})}):t.text(`debugger not enabled`,503)),t}function Di(e){let t=new m;return t.get(`/extensions`,t=>t.json({extensions:e.app.extensions.list()})),t.post(`/extensions/toggle`,async t=>{let n=await t.req.json().catch(()=>({}));if(!n.category||!n.id||typeof n.enabled!=`boolean`)return t.json({error:`category, id, enabled required`},400);try{return await e.app.extensions.setEnabled(n.category,n.id,n.enabled),t.json({ok:!0})}catch(e){return t.json({error:e instanceof Error?e.message:String(e)},400)}}),t.get(`/commands`,t=>{let n=e.app.listFileCommands();return t.json({commands:n.map(e=>({name:e.name,description:e.description,argumentHint:e.argumentHint,source:e.source,scope:e.scope,pluginId:e.pluginId}))})}),t.get(`/sigil`,async t=>{let n=t.req.query(`q`)??``,r=t.req.query(`sigil`),i=r===`#`||r===`@`?r:void 0,a=Number(t.req.query(`max`)??`50`),o=Number.isFinite(a)&&a>0?a:50,s=await e.app.pluginInput.searchAsync(n,i,o);return t.json({entries:s})}),t.post(`/sigil/expand`,async t=>{let n=await t.req.json().catch(()=>({}));if(typeof n.text!=`string`)return t.json({error:`text required`},400);let r=await e.app.expandSigilChips(n.text,{uiHost:!1,skipPrefixes:new Set([`model`])});return t.json({text:r})}),t.get(`/plugin-status-items`,t=>{let n=e.app.getPluginStatusItems();return t.json({items:n})}),t.get(`/plugin-menu-items`,t=>{let n=e.app.getGlobalMenuItems();return t.json({items:n})}),t.get(`/shortcuts`,t=>t.json({shortcuts:e.app.getShortcuts()})),t.post(`/shortcuts`,async t=>{let n=await t.req.json().catch(()=>({}));if(typeof n.name!=`string`||typeof n.text!=`string`)return t.json({error:`name and text are required`},400);try{return await e.app.saveShortcut(n.name,n.text,n.previousName),t.json({shortcuts:e.app.getShortcuts()})}catch(e){return t.json({error:e instanceof Error?e.message:String(e)},400)}}),t.delete(`/shortcuts/:name`,async t=>(await e.app.deleteShortcut(t.req.param(`name`)),t.json({shortcuts:e.app.getShortcuts()}))),t.get(`/plugin-renderers`,t=>{let n=e.app.getPluginRenderers();return t.json({renderers:n})}),t.get(`/plugin-status-widgets`,t=>{let n=e.app.getPluginStatusWidgets();return t.json({widgets:n})}),t.get(`/plugin-file-viewers`,t=>{let n=e.app.getPluginFileViewers();return t.json({viewers:n})}),t}function Oi(e){let t=new m;function n(e){return{id:e.id,sessionId:e.sessionId,title:e.title,origin:e.origin,status:e.status,startedAt:e.startedAt,hasDiff:e.diff!=null}}return t.get(`/`,e=>{let t=[...g.list()].sort((e,t)=>t.startedAt-e.startedAt);return e.json({jobs:t.map(n)})}),t.get(`/:id/diff`,e=>{let t=e.req.param(`id`),n=g.get(t);return n?n.diff==null?e.json({error:`diff not ready (job may still be running)`},409):e.json({id:n.id,diff:n.diff}):e.json({error:`job not found`},404)}),t.get(`/:id`,e=>{let t=e.req.param(`id`),r=g.get(t);return r?e.json({job:n(r)}):e.json({error:`job not found`},404)}),t}function ki(e){let t=new m;return t.get(`/status`,t=>e.app.isFeedbackAvailable()?t.json({available:!0}):t.json({available:!1},503)),t.post(`/pulse-survey`,async t=>{if(!e.app.isFeedbackAvailable())return t.json({error:`feedback plugin not available`},503);let n=await t.req.json().catch(()=>({}));return!n.rating||![`good`,`neutral`,`bad`].includes(n.rating)?t.json({error:`rating must be one of good|neutral|bad`},400):n.sdkVersion?(e.app.recordPulseSurvey({ts:Date.now(),rating:n.rating,comment:n.comment,sdkVersion:n.sdkVersion,modelId:n.modelId}),t.json({ok:!0})):t.json({error:`sdkVersion is required`},400)}),t.post(`/issue`,async t=>{if(!e.app.isFeedbackAvailable())return t.json({error:`feedback plugin not available`},503);let n=await t.req.json().catch(()=>({}));if(!n.title)return t.json({error:`title is required`},400);if(!n.repo)return t.json({error:`repo is required`},400);let r=e.app.buildFeedbackIssueUrl({title:n.title,reproduce:n.reproduce,expected:n.expected,actual:n.actual,envInfo:n.envInfo??``,repo:n.repo});return r?t.json({url:r}):t.json({error:`feedback plugin does not support buildIssueUrl`},503)}),t}function Z(e){let t=()=>e.app.storage.storageHost??null;return{middleware:async(e,n)=>{let r=t();if(!r)return e.json({error:`storage_host_not_configured`},404);if(!r.token||!tt(nt(e),r.token))return e.json({error:`forbidden`},403);await n()},binding:t}}function Ai(){return async(e,t)=>{let n=e.req.param(`wsKey`);if(!n)return e.json({error:`missing_workspace_key`},400);if(n!==be&&(!n.startsWith(`ws_`)||!xe(n.slice(3))))return e.json({error:`invalid_workspace_key`},400);await t()}}function ji(e){let t=e.req.query(`ws`);return t?t===be?t:!t.startsWith(`ws_`)||!xe(t.slice(3))?null:t:null}var Mi=class{listeners=new Map;on(e,t){return this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t),()=>{this.listeners.get(e)?.delete(t)}}emit(e){let t=this.listeners.get(e.namespace);if(t)for(let n of t)try{n(e)}catch{}}reset(){this.listeners.clear()}get listenerCount(){let e=0;for(let t of this.listeners.values())e+=t.size;return e}};const Ni=new Mi,Q=h(`@x-otto/service:storage`);function Pi(e){let t=new m,{middleware:n,binding:r}=Z(e);t.use(`/:namespace/:wsKey/*`,Ai()),t.use(`*`,n);let i=e=>{let t=r(),n=e.req.param(`namespace`),i=e.req.param(`wsKey`);return!t||!n||!i||!t.host.has(n)?null:{namespace:n,wsKey:i,host:t.host}};return t.get(`/:namespace/:wsKey`,async e=>{let t=i(e);if(!t)return e.json({error:`unknown_namespace`},404);let{namespace:n,wsKey:r,host:a}=t;try{let t=e.req.header(`X-Agent-Id`),i=e.req.query(`scope`),o=e.req.query(`page`);if(o===void 0){let o=await a.list(n,r,t,i);return e.json({ids:o})}let s=Number.parseInt(o,10),c=Number.parseInt(e.req.query(`pageSize`)??``,10),l=await a.listPaginated(n,r,{page:Number.isFinite(s)&&s>=0?s:0,pageSize:Number.isFinite(c)&&c>0?c:20,sortBy:e.req.query(`sortBy`)??`updatedAt`,order:e.req.query(`order`)===`asc`?`asc`:`desc`});return e.json(l)}catch(t){return Q.error({namespace:n,wsKey:r,error:t},`storage list failed`),e.json({error:`storage_error`},500)}}),t.get(`/:namespace/:wsKey/recent`,async e=>{let t=i(e);if(!t)return e.json({error:`unknown_namespace`},404);let{namespace:n,wsKey:r,host:a}=t;try{let t=Math.max(1,Math.min(1e3,Number(e.req.query(`limit`))||50)),i=await a.list(n,r),o=[];for(let e of i){let t=await a.load(n,r,e);!t||t.metadata?.archived||o.push({id:e,lastActiveAt:t.metadata?.lastActiveAt??t.metadata?.createdAt??0})}return o.sort((e,t)=>t.lastActiveAt-e.lastActiveAt),e.json({ids:o.slice(0,t).map(e=>e.id)})}catch(t){return Q.error({namespace:n,wsKey:r,error:t},`storage recent list failed`),e.json({error:`storage_error`},500)}}),t.get(`/:namespace/:wsKey/:id`,async e=>{let t=i(e);if(!t)return e.json({error:`unknown_namespace`},404);let{namespace:n,wsKey:r,host:a}=t;try{let t=await a.load(n,r,e.req.param(`id`));return t===null?e.json({error:`not_found`},404):e.json(t)}catch(t){return Q.error({namespace:n,wsKey:r,error:t},`storage load failed`),e.json({error:`storage_error`},500)}}),t.put(`/:namespace/:wsKey/:id`,async e=>{let t=i(e);if(!t)return e.json({error:`unknown_namespace`},404);let{namespace:n,wsKey:r,host:a}=t,o=await e.req.json().catch(()=>void 0);if(o===void 0)return e.json({error:`invalid_body`},400);try{let t=e.req.header(`X-Agent-Id`);return await a.save(n,r,e.req.param(`id`),o,t),e.json({ok:!0})}catch(t){return Q.error({namespace:n,wsKey:r,error:t},`storage save failed`),e.json({error:`storage_error`},500)}}),t.delete(`/:namespace/:wsKey/:id`,async e=>{let t=i(e);if(!t)return e.json({error:`unknown_namespace`},404);let{namespace:n,wsKey:r,host:a}=t;try{return await a.delete(n,r,e.req.param(`id`))?e.json({ok:!0}):e.json({error:`not_found`},404)}catch(t){return Q.error({namespace:n,wsKey:r,error:t},`storage delete failed`),e.json({error:`storage_error`},500)}}),t.post(`/:namespace/:wsKey/:id/entries`,async e=>{let t=i(e);if(!t)return e.json({error:`unknown_namespace`},404);let{namespace:n,wsKey:r,host:a}=t,o=e.req.param(`id`),s=await e.req.json().catch(()=>void 0);if(s===void 0)return e.json({error:`invalid_body`},400);try{let t=await a.appendEntry(n,r,o,s);return Ni.emit({namespace:n,wsKey:r,docId:o,entry:t.entry,ts:Date.now()}),e.json({seq:t.seq,ts:Date.now()})}catch(t){return Q.error({namespace:n,docId:o,error:t},`entry append failed`),e.json({error:`storage_error`},500)}}),t}const Fi=[`/api/health`,`/api/storage`];function Ii(e,t={}){let n=new m;if(t.corsOrigin&&n.use(`/api/*`,ce({origin:t.corsOrigin,allowMethods:[`GET`,`POST`,`PUT`,`DELETE`,`OPTIONS`],allowHeaders:[`Content-Type`,`Authorization`]})),t.authToken){let e=t.authToken,r=async(t,n)=>{if(!tt(nt(t),e))return t.json({error:`forbidden`},403);await n()};n.use(`/api/*`,(e,t)=>{let n=e.req.path;return Fi.some(e=>n===e||n.startsWith(`${e}/`))?t():r(e,t)})}return n.route(`/api/health`,rt(e)),n.route(`/api/authority`,it(e)),n.route(`/api/chat`,dt(e)),n.route(`/api/sessions`,vt(e)),n.route(`/api/storage`,Pi(e)),n.route(`/api/setting`,xi(e)),n.route(`/api/devtools`,Si(e,t.devtools||null)),n.route(`/api/debugger`,wi(e)),n.route(`/api/logs`,Ei(e)),n.route(`/api/catalog`,Di(e)),n.route(`/api/jobs`,Oi(e)),n.route(`/api/plugin-feedback`,ki(e)),t.staticDir&&n.get(`*`,t=>e.static(t)),n.notFound(e=>e.text(`not found`,404)),n}var Li=class{buffers=new Map;cursors=new Map;constructor(e=512){this.capacity=e}append(e,t){let n=(this.cursors.get(e)??0)+1;this.cursors.set(e,n);let r=this.buffers.get(e)??[];return r.push({seq:n,message:t}),r.length>this.capacity&&r.splice(0,r.length-this.capacity),this.buffers.set(e,r),n}cursorOf(e){return this.cursors.get(e)??0}readFrom(e,t){let n=this.cursorOf(e);if(t>n)return{ok:!1,reason:`gap`,oldestAvailable:n};if(t===n)return{ok:!0,events:[]};let r=this.buffers.get(e)??[],i=r[0]?.seq??n+1;return t+1<i?{ok:!1,reason:`gap`,oldestAvailable:i}:{ok:!0,events:r.filter(e=>e.seq>t)}}clear(e){this.buffers.delete(e),this.cursors.delete(e)}};const Ri=h(`@x-otto/service`),zi={".html":`text/html`,".js":`application/javascript`,".css":`text/css`,".json":`application/json`,".png":`image/png`,".svg":`image/svg+xml`,".ico":`image/x-icon`,".woff2":`font/woff2`,".woff":`font/woff`};var Bi=class{httpApp;server;host;port;staticDir;apiToken;wsAuthToken;authority;eventLog=new Li;bridges=new Map;traceBridges=new Map;router;started=!1;bridge=null;ws;get httpServer(){return this.server}constructor(e,t){this.app=e,this.host=t.host??`127.0.0.1`,this.port=t.port,this.staticDir=t.staticDir,this.apiToken=t.apiToken,this.wsAuthToken=t.wsAuthToken,this.authority=Object.freeze({instanceId:t.authorityId??o(),workspaceDir:e.workspaceDir,protocolVersion:1,capabilities:Object.freeze([`session.snapshot`,`session.subscribe`])}),this.ws=new Me({allowedOrigins:t.cors?[t.cors]:void 0,authToken:t.wsAuthToken}),e.devtools&&(this.bridge=new Ve(e.devtools,this.ws)),this.router=new et(this.ws,this.app,this.bridge,(e,t)=>this.eventLog.readFrom(e,t)),this.httpApp=Ii(this,{corsOrigin:t.cors,devtools:e.devtools??void 0,staticDir:t.staticDir,debug:this.bridge,authToken:t.apiToken}),this.server=te({fetch:this.httpApp.fetch})}registerHooks(e){let t=({sessionId:e})=>{let t=this.getSession(e);t&&this.attachSession(t)};e.registerHook(Se({name:`service_session_attach`,timing:`session.created`,priority:5,handle:t})),e.registerHook(Se({name:`service_session_restore_attach`,timing:`session.restored`,priority:5,handle:t})),e.registerHook(Se({name:`service_session_detach`,timing:`session.deleted`,priority:5,handle:({sessionId:e})=>{this.detachSession(e)}}))}unregisterHooks(e){e.unregisterHook(`service_session_attach`),e.unregisterHook(`service_session_restore_attach`),e.unregisterHook(`service_session_detach`)}getSession(e){return this.app.getSession(e)}getActiveSession(){return this.app.getActiveSession()}getAuthorityDescriptor(){return this.authority}getSessionSnapshot(e){let t=this.getSession(e);if(t)return{authority:this.authority,session:{id:t.id,status:t.status,messageCount:t.session.messages().length,messages:at(t)},cursor:this.eventLog.cursorOf(e),snapshotAt:new Date().toISOString()}}readSessionEventsSince(e,t){return this.eventLog.readFrom(e,t)}onUpgrade=(e,t,n)=>{let r=new URL(e.url??`/`,`http://${this.host}:${this.port}`);this.ws.handleUpgrade(e,t,n,r.pathname)||t.destroy()};onWsMessage=(e,t)=>{this.router.dispatch(e,t)};async start(){if(!this.started){if(!(this.host===`127.0.0.1`||this.host===`::1`||this.host===`localhost`)&&(!this.apiToken||!this.wsAuthToken))throw Error(`Refusing to bind non-loopback host "${this.host}" without both apiToken and wsAuthToken: the HTTP API and the WS control channel each expose full tool execution and are authenticated independently. Set options.apiToken AND options.wsAuthToken, or bind to 127.0.0.1.`);return this.server.on(`upgrade`,this.onUpgrade),this.ws.on(`message`,this.onWsMessage),this.registerHooks(this.app),new Promise((e,t)=>{let n=e=>{this.server.off(`error`,n),this.server.off(`upgrade`,this.onUpgrade),this.ws.off(`message`,this.onWsMessage),this.unregisterHooks(this.app),t(e)};this.server.on(`error`,n),this.server.listen(this.port,this.host,()=>{this.server.off(`error`,n),this.started=!0,this.bridge?.attach(),Ri.info({host:this.host,port:this.port},`service started`),e()})})}}async stop(){if(this.started){this.bridge?.detach();for(let[,e]of this.bridges)e.detach();this.bridges.clear();for(let[,e]of this.traceBridges)e.detach();return this.traceBridges.clear(),this.server.off(`upgrade`,this.onUpgrade),this.ws.off(`message`,this.onWsMessage),this.unregisterHooks(this.app),this.ws.close(),new Promise(e=>{this.server.close(()=>{this.started=!1,Ri.info(`service stopped`),e()})})}}attachSession(e){if(this.bridges.has(e.id))return;let t=new Ie(e,{broadcast:e=>this.ws.broadcast(e),sendToSession:(e,t)=>{let n=this.eventLog.append(e,t),r=t.type===`Session.event`?{...t,data:{...t.data,seq:n}}:t;this.ws.sendToSession(e,r)},sendToSubscribers:(e,t)=>this.ws.sendToSubscribers(e,t)},this.app);t.attach(),this.bridges.set(e.id,t);let n=new Re(e.id,this.app.storage.traceStore,this.ws);n.attach(),this.traceBridges.set(e.id,n)}detachSession(e){let t=this.bridges.get(e);t&&(t.detach(),this.bridges.delete(e));let n=this.traceBridges.get(e);n&&(n.detach(),this.traceBridges.delete(e)),this.ws.clearSessionSubscriptions(e),this.eventLog.clear(e)}static(n){if(!this.staticDir)return n.text(`not found`,404);let r=n.req.path;(r===`/`||!r.includes(`.`))&&(r=`/index.html`);let i=d(this.staticDir,r);if(i!==this.staticDir&&!i.startsWith(this.staticDir+ee))return n.text(`forbidden`,403);if(!e(i)){let r=d(this.staticDir,`index.html`);if(e(r)){let e=t(r);return new Response(e,{headers:{"Content-Type":`text/html`}})}return n.text(`not found`,404)}let a=zi[l(i)]||`application/octet-stream`,o=t(i);return new Response(o,{headers:{"Content-Type":a}})}};function Vi(e,t){return new Bi(e,t)}function Hi(){return async(e,t)=>{let n=e.req.header(`X-Request-Id`)??o();e.set(`requestId`,n),e.header(`X-Request-Id`,n),await t()}}const Ui=h(`@x-otto/service:access`);function Wi(){return async(e,t)=>{let n=Date.now();await t();let r=Date.now()-n;Ui.info({requestId:e.get(`requestId`)??``,method:e.req.method,path:e.req.path,status:e.res.status,latency:r},`${e.req.method} ${e.req.path} → ${e.res.status} ${r}ms`)}}function Gi(e){let t=e.defaultRps,n=e.burst??t,r=new Map,i=setInterval(()=>{let e=Date.now()-5*6e4;for(let[t,n]of r)n.lastRefill<e&&r.delete(t)},6e4);i.unref&&i.unref();function a(e){return`${e.req.param(`namespace`)??e.req.path.split(`/`)[2]??`root`}:${e.req.header(`X-Forwarded-For`)?.split(`,`)[0]?.trim()??e.req.header(`X-Real-IP`)??`127.0.0.1`}`}return async(e,i)=>{let o=a(e),s=Date.now(),c=r.get(o);c||(c={tokens:n,lastRefill:s},r.set(o,c));let l=(s-c.lastRefill)/1e3;return c.tokens=Math.min(n,c.tokens+l*t),c.lastRefill=s,c.tokens>=1?(c.tokens--,i()):e.json({error:`rate_limit_exceeded`},429)}}function Ki(e){let t=e.maxBodyBytes;return async(e,n)=>{let r=e.req.header(`Content-Length`);if(r!==void 0){let n=Number(r);if(Number.isFinite(n)&&n>t)return e.json({error:`payload_too_large`},413)}let i=e.req.raw.body;if(!i)return n();let a=i.getReader(),o=[],s=0,c=!1;try{for(;;){let{done:e,value:n}=await a.read();if(e)break;if(s+=n.byteLength,s>t){c=!0,await a.cancel().catch(()=>void 0);break}o.push(n)}}catch{return n()}if(c)return e.json({error:`payload_too_large`},413);let l=new Uint8Array(s),u=0;for(let e of o)l.set(e,u),u+=e.byteLength;return e.req.raw=new Request(e.req.raw,{body:l}),n()}}const qi=h(`@x-otto/service:events`);function Ji(e){let t=new m,{middleware:n,binding:r}=Z(e);return t.use(`*`,n),t.get(`/`,async e=>{let t=r();if(!t)return e.json({error:`storage_host_not_configured`},404);let n=e.req.query(`topics`);if(!n)return e.json({error:`missing_topics`},400);let i=n.split(`,`).map(e=>e.trim()).filter(Boolean);if(i.length===0)return e.json({error:`missing_topics`},400);for(let n of i)if(!t.host.has(n))return e.json({error:`unknown_namespace: ${n}`},404);let a=Yi(t,i,ji(e)||void 0,Number.parseInt(e.req.query(`since`)??`0`,10)||0,200,new AbortController,{includeTopic:!0});return new Response(a,{headers:{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`,"X-Accel-Buffering":`no`}})}),t.get(`/:namespace`,async e=>{let t=r(),n=e.req.param(`namespace`);if(!t||!n||!t.host.has(n))return e.json({error:`unknown_namespace`},404);let i=ji(e)||void 0,a=Number.parseInt(e.req.query(`since`)??`0`,10)||0,o=new AbortController,s=Yi(t,[n],i,a,200,o,{includeTopic:!1});return new Response(s,{headers:{"Content-Type":`text/event-stream`,"Cache-Control":`no-cache`,Connection:`keep-alive`,"X-Accel-Buffering":`no`}})}),t}function Yi(e,t,n,r,i,a,o){let s=a.signal;return new ReadableStream({async start(c){let l=[];for(let e of t)l.push(Ni.on(e,e=>{try{if(n!==void 0&&e.wsKey!==n)return;let t={docId:e.docId,entry:e.entry,ts:e.ts};o.includeTopic&&(t.topic=e.namespace),c.enqueue(`event: append\ndata: ${JSON.stringify(t)}\n\n`)}catch{}}));let u=setInterval(()=>{try{c.enqueue(`: ping
40
40
 
41
- `)}catch{a.abort()}},3e4);u.unref?.(),s.addEventListener(`abort`,()=>{clearInterval(u),l.forEach(e=>e())},{once:!0});let d=t.map(async t=>{try{for await(let a of e.host.streamEvents(t,n,r,i,s)){if(s.aborted)break;try{let e=a.op===`delete`?`delete`:`update`,n={id:a.doc_id,updatedAt:a.ts};o.includeTopic&&(n.topic=t),c.enqueue(`event: ${e}\ndata: ${JSON.stringify(n)}\n\n`)}catch{break}}}catch(e){s.aborted||Ki.error({topic:t,error:e},`sse poller error`)}});await Promise.allSettled(d)},cancel(){a.abort()}})}const Yi=h(`@x-otto/service:sync`);function Xi(e){let t=new m,{middleware:n,binding:r}=Z(e);return t.use(`/:namespace/:wsKey/*`,Ai()),t.use(`*`,n),t.post(`/:namespace/:wsKey/push`,async e=>{let t=r(),n=e.req.param(`namespace`),i=e.req.param(`wsKey`);if(!t||!n||!i||!t.host.has(n))return e.json({error:`unknown_namespace`},404);let a=await e.req.json().catch(()=>void 0);if(!a||!Array.isArray(a.ops))return e.json({error:`invalid_body`},400);let{ops:o}=a,s=e.req.header(`X-Agent-Id`),c=0,l=0,u=[];for(let e of o)try{switch(e.type){case`save`:if(typeof e.id!=`string`||e.data===void 0){l++;continue}await t.host.save(n,i,e.id,e.data,s),c++;break;case`delete`:if(typeof e.id!=`string`){l++;continue}await t.host.delete(n,i,e.id),c++;break;default:l++}}catch(t){l++,u.push(e.id),Yi.warn({namespace:n,wsKey:i,opType:e.type,id:e.id,error:t},`sync push op failed`)}return e.json({accepted:c,rejected:l,conflicts:u})}),t.get(`/:namespace/:wsKey/pull`,async e=>{let t=r(),n=e.req.param(`namespace`),i=e.req.param(`wsKey`);if(!t||!n||!i||!t.host.has(n))return e.json({error:`unknown_namespace`},404);let a=Number.parseInt(e.req.query(`since`)??`0`,10)||0,o=e.req.query(`ids`),s=o?o.split(`,`).map(e=>e.trim()).filter(Boolean):void 0;try{let{documents:r,cursor:o}=await t.host.getChangesSince(n,i,a,s),c={};for(let[e,t]of r)c[e]=t;return e.json({documents:c,cursor:o})}catch(t){return Yi.error({namespace:n,error:t},`sync pull failed`),e.json({error:`storage_error`},500)}}),t}const $=h(`@x-otto/service:schedule-lease`);function Zi(e,t){let n=new m,{middleware:r,binding:i}=t;n.use(`/:wsKey/*`,Ai()),n.use(`*`,r);let a=e.prepare(`INSERT INTO schedule_lease (ws_key, token, renewed_at) VALUES (?, ?, ?)
41
+ `)}catch{a.abort()}},3e4);u.unref?.(),s.addEventListener(`abort`,()=>{clearInterval(u),l.forEach(e=>e())},{once:!0});let d=t.map(async t=>{try{for await(let a of e.host.streamEvents(t,n,r,i,s)){if(s.aborted)break;try{let e=a.op===`delete`?`delete`:`update`,n={id:a.doc_id,updatedAt:a.ts};o.includeTopic&&(n.topic=t),c.enqueue(`event: ${e}\ndata: ${JSON.stringify(n)}\n\n`)}catch{break}}}catch(e){s.aborted||qi.error({topic:t,error:e},`sse poller error`)}});await Promise.allSettled(d)},cancel(){a.abort()}})}const Xi=h(`@x-otto/service:sync`);function Zi(e){let t=new m,{middleware:n,binding:r}=Z(e);return t.use(`/:namespace/:wsKey/*`,Ai()),t.use(`*`,n),t.post(`/:namespace/:wsKey/push`,async e=>{let t=r(),n=e.req.param(`namespace`),i=e.req.param(`wsKey`);if(!t||!n||!i||!t.host.has(n))return e.json({error:`unknown_namespace`},404);let a=await e.req.json().catch(()=>void 0);if(!a||!Array.isArray(a.ops))return e.json({error:`invalid_body`},400);let{ops:o}=a,s=e.req.header(`X-Agent-Id`),c=0,l=0,u=[];for(let e of o)try{switch(e.type){case`save`:if(typeof e.id!=`string`||e.data===void 0){l++;continue}await t.host.save(n,i,e.id,e.data,s),c++;break;case`delete`:if(typeof e.id!=`string`){l++;continue}await t.host.delete(n,i,e.id),c++;break;default:l++}}catch(t){l++,u.push(e.id),Xi.warn({namespace:n,wsKey:i,opType:e.type,id:e.id,error:t},`sync push op failed`)}return e.json({accepted:c,rejected:l,conflicts:u})}),t.get(`/:namespace/:wsKey/pull`,async e=>{let t=r(),n=e.req.param(`namespace`),i=e.req.param(`wsKey`);if(!t||!n||!i||!t.host.has(n))return e.json({error:`unknown_namespace`},404);let a=Number.parseInt(e.req.query(`since`)??`0`,10)||0,o=e.req.query(`ids`),s=o?o.split(`,`).map(e=>e.trim()).filter(Boolean):void 0;try{let{documents:r,cursor:o}=await t.host.getChangesSince(n,i,a,s),c={};for(let[e,t]of r)c[e]=t;return e.json({documents:c,cursor:o})}catch(t){return Xi.error({namespace:n,error:t},`sync pull failed`),e.json({error:`storage_error`},500)}}),t}const $=h(`@x-otto/service:schedule-lease`);function Qi(e,t){let n=new m,{middleware:r,binding:i}=t;n.use(`/:wsKey/*`,Ai()),n.use(`*`,r);let a=e.prepare(`INSERT INTO schedule_lease (ws_key, token, renewed_at) VALUES (?, ?, ?)
42
42
  ON CONFLICT(ws_key) DO UPDATE SET token = excluded.token, renewed_at = excluded.renewed_at
43
- WHERE excluded.renewed_at - schedule_lease.renewed_at > ?`),o=e.prepare(`UPDATE schedule_lease SET renewed_at = ? WHERE ws_key = ? AND token = ?`),s=e.prepare(`DELETE FROM schedule_lease WHERE ws_key = ? AND token = ?`),c=async e=>{let t=await e.req.json().catch(()=>void 0);return!t||typeof t.token!=`string`||t.token.length===0?null:{token:t.token}};return n.post(`/:wsKey/lease/acquire`,async e=>{if(!i())return e.json({error:`storage_host_not_configured`},404);let t=e.req.param(`wsKey`),n=await c(e);if(!n)return e.json({error:`invalid_body`},400);try{let r=Date.now(),i=a.run(t,n.token,r,18e4);return e.json({acquired:i.changes>0})}catch(n){return $.error({wsKey:t,error:n},`schedule lease acquire failed`),e.json({error:`lease_error`},500)}}),n.post(`/:wsKey/lease/renew`,async e=>{if(!i())return e.json({error:`storage_host_not_configured`},404);let t=e.req.param(`wsKey`),n=await c(e);if(!n)return e.json({error:`invalid_body`},400);try{let r=Date.now(),i=o.run(r,t,n.token);return e.json({renewed:i.changes>0})}catch(n){return $.error({wsKey:t,error:n},`schedule lease renew failed`),e.json({error:`lease_error`},500)}}),n.post(`/:wsKey/lease/release`,async e=>{if(!i())return e.json({error:`storage_host_not_configured`},404);let t=e.req.param(`wsKey`),n=await c(e);if(!n)return e.json({error:`invalid_body`},400);try{return s.run(t,n.token),e.json({released:!0})}catch(n){return $.error({wsKey:t,error:n},`schedule lease release failed`),e.json({error:`lease_error`},500)}}),n}const Qi=3001,$i=[`sessions`,`schedules`];async function ea(e){let t=e.port??3001,n=e.host??`127.0.0.1`,r=e.namespaces??$i,i=`${e.dir}/storage.db`,a=new we({namespaces:r,backend:e=>new Ce({dbPath:i,namespace:e,wal:!0})}),o=Te(`${e.dir}/schedule-lease.db`,!0,De),s={app:{storage:{storageHost:{host:a,token:e.token}}}},c=Z(s),l=new m;e.corsOrigin&&l.use(`/api/*`,ce({origin:e.corsOrigin,allowMethods:[`GET`,`POST`,`PUT`,`DELETE`,`OPTIONS`],allowHeaders:[`Content-Type`,`Authorization`]})),l.use(`*`,Hi()),l.use(`*`,Wi()),l.use(`*`,Gi({defaultRps:e.rateLimitRps??100})),l.get(`/health`,e=>e.json({status:`ok`,service:`otto-persistenced`,uptime:process.uptime(),namespaces:r})),l.route(`/api/storage`,Pi(s)),l.route(`/api/events`,qi(s)),l.route(`/api/sync`,Xi(s)),l.route(`/api/schedules`,Zi(o,c)),l.notFound(e=>e.text(`not found`,404));let u=ne({fetch:l.fetch,port:t,hostname:n});return u.once(`close`,()=>Ee(o)),new Promise((e,r)=>{u.once(`listening`,()=>{let r=u.address();e({app:l,server:u,host:a,url:`http://${n}:${typeof r==`object`&&r?r.port:t}`})}),u.once(`error`,r)})}export{Bi as CodingService,Ve as DebugBridge,Ie as EventBridge,Mi as EventBus,et as InboundRouter,Qi as PERSISTENCED_DEFAULT_PORT,Li as SessionEventLog,Me as WebSocketManager,Vi as createCodingService,ae as createProjectorState,Pe as encodeSessionEvent,Ni as eventBus,ea as startPersistenced};
43
+ WHERE excluded.renewed_at - schedule_lease.renewed_at > ?`),o=e.prepare(`UPDATE schedule_lease SET renewed_at = ? WHERE ws_key = ? AND token = ?`),s=e.prepare(`DELETE FROM schedule_lease WHERE ws_key = ? AND token = ?`),c=async e=>{let t=await e.req.json().catch(()=>void 0);return!t||typeof t.token!=`string`||t.token.length===0?null:{token:t.token}};return n.post(`/:wsKey/lease/acquire`,async e=>{if(!i())return e.json({error:`storage_host_not_configured`},404);let t=e.req.param(`wsKey`),n=await c(e);if(!n)return e.json({error:`invalid_body`},400);try{let r=Date.now(),i=a.run(t,n.token,r,18e4);return e.json({acquired:i.changes>0})}catch(n){return $.error({wsKey:t,error:n},`schedule lease acquire failed`),e.json({error:`lease_error`},500)}}),n.post(`/:wsKey/lease/renew`,async e=>{if(!i())return e.json({error:`storage_host_not_configured`},404);let t=e.req.param(`wsKey`),n=await c(e);if(!n)return e.json({error:`invalid_body`},400);try{let r=Date.now(),i=o.run(r,t,n.token);return e.json({renewed:i.changes>0})}catch(n){return $.error({wsKey:t,error:n},`schedule lease renew failed`),e.json({error:`lease_error`},500)}}),n.post(`/:wsKey/lease/release`,async e=>{if(!i())return e.json({error:`storage_host_not_configured`},404);let t=e.req.param(`wsKey`),n=await c(e);if(!n)return e.json({error:`invalid_body`},400);try{return s.run(t,n.token),e.json({released:!0})}catch(n){return $.error({wsKey:t,error:n},`schedule lease release failed`),e.json({error:`lease_error`},500)}}),n}const $i=3001,ea=[`sessions`,`schedules`];async function ta(e){let t=e.port??3001,n=e.host??`127.0.0.1`,r=e.namespaces??ea,i=`${e.dir}/storage.db`,a=new we({namespaces:r,backend:e=>new Ce({dbPath:i,namespace:e,wal:!0})}),o=Te(`${e.dir}/schedule-lease.db`,!0,De),s={app:{storage:{storageHost:{host:a,token:e.token}}}},c=Z(s),l=new m;e.corsOrigin&&l.use(`/api/*`,ce({origin:e.corsOrigin,allowMethods:[`GET`,`POST`,`PUT`,`DELETE`,`OPTIONS`],allowHeaders:[`Content-Type`,`Authorization`]})),l.use(`*`,Hi()),l.use(`*`,Wi()),l.use(`*`,Gi({defaultRps:e.rateLimitRps??100})),l.use(`*`,Ki({maxBodyBytes:e.maxBodyBytes??10485760})),l.get(`/health`,e=>e.json({status:`ok`,service:`otto-persistenced`,uptime:process.uptime(),namespaces:r})),l.route(`/api/storage`,Pi(s)),l.route(`/api/events`,Ji(s)),l.route(`/api/sync`,Zi(s)),l.route(`/api/schedules`,Qi(o,c)),l.notFound(e=>e.text(`not found`,404));let u=ne({fetch:l.fetch,port:t,hostname:n});return u.once(`close`,()=>Ee(o)),new Promise((e,r)=>{u.once(`listening`,()=>{let r=u.address();e({app:l,server:u,host:a,url:`http://${n}:${typeof r==`object`&&r?r.port:t}`})}),u.once(`error`,r)})}export{Bi as CodingService,Ve as DebugBridge,Ie as EventBridge,Mi as EventBus,et as InboundRouter,$i as PERSISTENCED_DEFAULT_PORT,Li as SessionEventLog,Me as WebSocketManager,Vi as createCodingService,ae as createProjectorState,Pe as encodeSessionEvent,Ni as eventBus,ta as startPersistenced};
44
44
  //# sourceMappingURL=index.js.map