@x-otto/service 0.0.1-alpha.2 → 0.1.0-alpha.9

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.js CHANGED
@@ -1,6 +1,6 @@
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{exportSessionTrace as le,otlpExporterFromEnv as ue,parseTraceParent as de}from"@x-otto/otel";import{BREAKPOINT_POINTS as fe,summarizeTrace as pe,traceToSpans as me}from"@x-otto/agent";import{traceEventsToTimeline as he}from"@x-otto/trace-view";import{streamSSE as ge}from"hono/streaming";import{globalAgentJobRegistry as _e}from"@x-otto/runtime";import{DEFAULT_WORKSPACE_KEY as ve,isValidWorkspaceId as ye}from"@x-otto/workspace";import{defineHook as be}from"@x-otto/hooks";import{SqlitePersistence as xe,StorageHost as Se,acquireDb as Ce,releaseDb as we}from"@x-otto/persistence";import{SCHEDULE_LEASE_MIGRATIONS as Te}from"@x-otto/schedule";function Ee(e){return e?a(`sha256`).update(e).digest(`hex`).slice(0,16):`local`}function De(e){if(!e)return;let t=/^Bearer\s+(.+)$/i.exec(e);return t?t[1]:void 0}function Oe(e){try{return new URL(e??`/`,`http://localhost`).searchParams.get(`token`)??void 0}catch{return}}const g=h(`@x-otto/service:websocket-manager`),ke=new Set([`localhost`,`127.0.0.1`,`::1`,`[::1]`]);var Ae=class extends re{wss;clients=new Map;sessionSubscriptions=new Map;options;maxMessagesPerSecond;maxConnections;clientId=0;clientIdentities=new Map;onClientDisconnected;onClientPing;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?(g.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):(g.warn(`ws upgrade rejected: invalid auth token`),this.rejectUpgrade(t,`401 Unauthorized`),!0):(g.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 ke.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=Ee(Oe(t?.url));this.clientIdentities.set(n,r),g.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){g.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){g.warn({clientId:n},`invalid message`);return}if(this.handleSystemClientMessage(n,r))return;this.emit(`message`,n,r)}catch{g.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),g.debug({clientId:n,identity:r,identityStillOnline:e},`client disconnected`)}),e.on(`error`,e=>{g.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()}}),this.onClientPing?.(e)}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 je=h(`@x-otto/service:session-event-wire`);function Me(e,t,n){return oe(e,t,n).map(e=>({type:`Session.event`,data:Ne(e)}))}function Ne(e){return e.kind===`error`?(je.error({sessionId:e.sessionId,code:e.code,message:e.message},`session error`),{...e,message:e.code===`STREAM_ERROR`?`stream error`:`session error`}):e.kind===`prompt.end`&&e.errorMessage?{...e,errorMessage:`request failed`}:e}var Pe=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=Me(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 Fe=h(`@x-otto/service:trace-bridge`);var Ie=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){Fe.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 Le(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 Re=h(`@x-otto/service:debug-bridge`);var ze=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)}),this.devtools.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.breakpoints.get(t)?this.devtools.breakpoints.set(t,e.enabled!==!1):Re.warn({point:t},`setBreakpoint unknown point, dropped`):Re.warn(`setBreakpoint command missing point, dropped`);return}if(e.type===`setBreakpointsActive`){e.active===!1?this.devtools.breakpoints.disableAll():this.devtools.breakpoints.enableAll();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=Le(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 Be(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},heartbeatAllForClient(e){let n=[];for(let[r,a]of t.entries())a===e&&(i(r),n.push(r));return n},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 _=h(`@x-otto/service:inbound-router`);function v(e,t){let n=e[t];return typeof n==`string`?n:void 0}function Ve(e,t){let n=e[t];return typeof n==`boolean`?n:void 0}function He(e,t){let n=e[t];return typeof n==`number`?n:void 0}function Ue(e,t){let n=e[t];return typeof n==`object`&&n&&!Array.isArray(n)?n:void 0}function We(e){let t=Ue(e,`answers`);if(!t)return null;let n=v(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:v(t,`freeformText`)}}function Ge(e){let t=v(e,`message`);return t?{message:t,sessionId:v(e,`sessionId`)}:null}function Ke(e){let t=v(e,`approvalId`),n=Ve(e,`approved`);return!t||n===void 0?null:{approvalId:t,approved:n,sessionId:v(e,`sessionId`)}}function qe(e){let t=v(e,`requestId`);if(!t)return null;let n=e.cancelled===!0;return{requestId:t,answers:n?null:We(e),cancelled:n,sessionId:v(e,`sessionId`)}}function Je(e){let t=v(e,`requestId`),n=v(e,`action`);return!t||!n?null:{requestId:t,action:n,feedback:v(e,`feedback`),sessionId:v(e,`sessionId`)}}function y(e){let t=v(e,`sessionId`);if(!t)return null;let n=He(e,`since`);return n===void 0?{sessionId:t}:{sessionId:t,since:n}}function Ye(e){return{seq:He(e,`seq`),pauseId:v(e,`pauseId`),depth:He(e,`depth`)}}function Xe(e){let t=v(e,`point`),n=Ve(e,`enabled`);return t===void 0||n===void 0?null:{point:t,enabled:n}}function Ze(e){let t=Ve(e,`active`);return t===void 0?null:{active:t}}var Qe=class{writeLease=Be();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&&_.debug({identity:e,released:t},`write-lease released on disconnect`)},this.ws.onClientPing=e=>{this.writeLease.heartbeatAllForClient(this.ws.identityOf?.(e)??e)}}dispatch(e,t){let{type:n,data:r}=t,i=this.ws.identityOf?.(e)??e;switch(_.debug({clientId:e,identity:i,type:n},`message from client`),n){case`Runtime.ping`:break;case`Session.subscribe`:{let t=y(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=y(r);t&&this.ws.unsubscribeClient(e,t.sessionId);break}case`Session.writeLease.acquire`:{let t=y(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=y(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=y(r);if(!t||!t.sessionId)break;let n=this.writeLease.forceAcquire(t.sessionId,i);_.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=Ge(r);if(t){let n=t.sessionId;if(n&&!this.writeLease.canClientWrite(n,i)){let t=this.writeLease.ownerOf(n);_.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=Ke(r);e&&this.handleApproval(e);break}case`Chat.askUserResponse`:{let e=qe(r);e&&this.handleAskUserResponse(e);break}case`Chat.planApprovalResponse`:{let e=Je(r);e&&this.handlePlanApprovalResponse(e);break}case`Debugger.resume`:case`Debugger.stepOver`:case`Debugger.stepInto`:case`Debugger.disable`:this.handleDebugCommand(n,Ye(r),r);break;case`Debugger.setBreakpoint`:{let e=Xe(r);e&&this.handleDebugSetBreakpoint(e);break}case`Debugger.setBreakpointsActive`:{let e=Ze(r);e&&this.handleDebugSetBreakpointsActive(e);break}default:_.warn({type:n},`unknown client message type (dropped)`)}}replaySince(e,t,n){if(!this.readEventsSince)return;let r=this.readEventsSince(t,n);if(!r.ok){_.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=>{_.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),_.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),_.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),_.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=Ue(i,`payload`);this.bridge.send({type:e,seq:t??0,...n===void 0?{}:{pauseId:n},...r===void 0?{}:{depth:r}},a)}handleDebugSetBreakpoint({point:e,enabled:t}){this.bridge&&this.bridge.send({type:`setBreakpoint`,seq:0,point:e,enabled:t})}handleDebugSetBreakpointsActive({active:e}){this.bridge&&this.bridge.send({type:`setBreakpointsActive`,seq:0,active:e})}};function $e(e,t){let n=Buffer.from(e),r=Buffer.from(t);return n.length===r.length?s(n,r):!1}function et(e){return/^Bearer\s+(.+)$/i.exec(e.req.header(`authorization`)??``)?.[1]??``}function tt(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 nt(e){let t=new m;return t.get(`/`,t=>t.json(e.getAuthorityDescriptor())),t}function rt(e){return e.session.messages().map(e=>{let t=it(e);return{role:e.role,content:at(e),timestamp:`timestamp`in e?e.timestamp:void 0,toolCalls:ot(e),...t.length>0?{a2ui:t}:{}}})}function it(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 at(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 ot(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 st=h(`@x-otto/service:chat`);function ct(e){return Ee(De(e.req.header(`Authorization`)))}function lt(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=ct(t);if(a&&!a.canClientWrite(i.id,o)){let e=a.ownerOf(i.id);return st.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=>{st.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(rt(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=ct(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=ct(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 ut(e,t){let n=f(e,t);return n===``||!n.startsWith(`..${ee}`)&&n!==`..`&&!u(n)}function dt(t,n){if(n.startsWith(`~`))return null;let i=p(t),a=p(i,n);if(!ut(i,a))return null;if(e(a))try{let e=r(a);if(!ut(r(i),e))return null}catch{return null}return a}function ft(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=dt(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=dt(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 pt=[`conversation`,`code`,`both`];function mt(e){return typeof e==`string`&&pt.includes(e)}function b(e){return!!e&&typeof e==`object`&&typeof e.sessionId==`string`}function ht(e){return e===void 0||typeof e==`number`}function gt(e){return b(e)?ht(e.to):!1}function _t(e){return b(e)&&typeof e.seq==`number`}function vt(e){if(!b(e))return!1;let t=e;return typeof t.seq==`number`&&mt(t.mode)&&(t.truncate===void 0||typeof t.truncate==`boolean`)}function yt(e){if(!b(e))return!1;let t=e;return typeof t.seq==`number`&&(t.newId===void 0||typeof t.newId==`string`)}const x=h(`@x-otto/service:timetravel`);function bt(e){if(e===void 0)return;let t=Number(e);return Number.isInteger(t)?t:void 0}function xt(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:S(400)},400)}}),t.post(`/:id/checkpoints/:seq/restore`,async e=>{let t=e.req.param(`id`),r=bt(e.req.param(`seq`)),i=await e.req.json().catch(()=>({})),a={sessionId:t,seq:r,mode:i.mode,truncate:i.truncate};if(!vt(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=Ct(n);return x.error({sessionId:t,err:n},`checkpoint restore failed`),e.json({error:S(r)},r)}}),t.post(`/:id/checkpoints/:seq/fork`,async e=>{let t=e.req.param(`id`),r={sessionId:t,seq:bt(e.req.param(`seq`)),newId:(await e.req.json().catch(()=>({}))).newId};if(!yt(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=Ct(n);return x.error({sessionId:t,err:n},`checkpoint fork failed`),e.json({error:S(r)},r)}}),t.get(`/:id/traceback`,async e=>{let t=e.req.param(`id`),r={sessionId:t,seq:bt(e.req.query(`to`))};if(!_t(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(!gt({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:S(400)},400)}}),t.get(`/:id/trace/summary`,async t=>{let n=t.req.param(`id`);try{let r=await pe(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:S(400)},400)}}),t.get(`/:id/trace/spans`,async t=>{let n=t.req.param(`id`);try{let r=await me(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:S(400)},400)}}),t.get(`/:id/trace/timeline`,async t=>{let n=t.req.param(`id`);try{let r=await he(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:S(400)},400)}}),t.post(`/:id/otel-export`,async t=>{let n=ue();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 le(r,i,n,{includeContent:t.req.query(`includeContent`)===`true`,traceParent:de(t.req.header(`traceparent`))});return t.json({sessionId:r,exported:a},a.ok?200:502)}),t}function St(e){return e instanceof Error?e.message:String(e)}function Ct(e){return/not found|unknown/i.test(St(e))?404:400}function S(e){return e===404?`not found`:`request failed`}function wt(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=>{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(rt(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/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);if(!i)return t.json({status:`error`,message:`model not found: ${r}`},404);try{await n.applyModelWithContextFit?.(i)}catch{}return t.json({status:`ok`,model:{id:i.id,provider:i.provider}})}),t.delete(`/:id/model`,e=>e.json({status:`error`,message:`model overlay is not implemented`},501)),t.route(`/`,ft(e)),t.route(`/`,xt(e)),t}Object.freeze({status:`aborted`});function C(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 w=class extends Error{constructor(){super(`Encountered Promise during synchronous parse. Use .parseAsync() instead.`)}},Tt=class extends Error{constructor(e){super(`Encountered unidirectional transform during encode: ${e}`),this.name=`ZodEncodeError`}};const Et={};function T(e){return e&&Object.assign(Et,e),Et}function Dt(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 E(e,t){return typeof t==`bigint`?t.toString():t}function D(e){return{get value(){{let t=e();return Object.defineProperty(this,`value`,{value:t}),t}throw Error(`cached value already set`)}}}function O(e){return e==null}function Ot(e){let t=e.startsWith(`^`)?1:0,n=e.endsWith(`$`)?e.length-1:e.length;return e.slice(t,n)}const kt=Symbol(`evaluating`);function k(e,t,n){let r;Object.defineProperty(e,t,{get(){if(r!==kt)return r===void 0&&(r=kt,r=n()),r},set(n){Object.defineProperty(e,t,{value:n})},configurable:!0})}function A(e,t,n){Object.defineProperty(e,t,{value:n,writable:!0,enumerable:!0,configurable:!0})}function j(...e){let t={};for(let n of e)Object.assign(t,Object.getOwnPropertyDescriptors(n));return Object.defineProperties({},t)}function At(e){return JSON.stringify(e)}const jt=`captureStackTrace`in Error?Error.captureStackTrace:(...e)=>{};function M(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const Mt=D(()=>{if(typeof navigator<`u`&&navigator?.userAgent?.includes(`Cloudflare`))return!1;try{return Function(``),!0}catch{return!1}});function N(e){if(M(e)===!1)return!1;let t=e.constructor;if(t===void 0||typeof t!=`function`)return!0;let n=t.prototype;return!(M(n)===!1||Object.prototype.hasOwnProperty.call(n,`isPrototypeOf`)===!1)}function Nt(e){return N(e)?{...e}:Array.isArray(e)?[...e]:e}const Pt=new Set([`string`,`number`,`symbol`]);function Ft(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function P(e,t,n){let r=new e._zod.constr(t??e._zod.def);return(!t||n?.parent)&&(r._zod.parent=e),r}function F(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 It(e){return Object.keys(e).filter(t=>e[t]._zod.optin===`optional`&&e[t]._zod.optout===`optional`)}-Number.MAX_VALUE,Number.MAX_VALUE;function Lt(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 P(e,j(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 A(this,`shape`,e),e},checks:[]}))}function Rt(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 P(e,j(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 A(this,`shape`,r),r},checks:[]}))}function zt(e,t){if(!N(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 P(e,j(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t};return A(this,`shape`,n),n}}))}function Bt(e,t){if(!N(t))throw Error(`Invalid input to safeExtend: expected a plain object`);return P(e,j(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t};return A(this,`shape`,n),n}}))}function Vt(e,t){return P(e,j(e._zod.def,{get shape(){let n={...e._zod.def.shape,...t._zod.def.shape};return A(this,`shape`,n),n},get catchall(){return t._zod.def.catchall},checks:[]}))}function Ht(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 P(t,j(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 A(this,`shape`,i),i},checks:[]}))}function Ut(e,t,n){return P(t,j(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 A(this,`shape`,i),i}}))}function I(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 Wt(e,t){return t.map(t=>{var n;return(n=t).path??(n.path=[]),t.path.unshift(e),t})}function L(e){return typeof e==`string`?e:e?.message}function R(e,t,n){let r={...e,path:e.path??[]};return e.message||(r.message=L(e.inst?._zod.def?.error?.(e))??L(t?.error?.(e))??L(n.customError?.(e))??L(n.localeError?.(e))??`Invalid input`),delete r.inst,delete r.continue,t?.reportInput||delete r.input,r}function Gt(e){return Array.isArray(e)?`array`:typeof e==`string`?`string`:`unknown`}function z(...e){let[t,n,r]=e;return typeof t==`string`?{message:t,code:`custom`,input:n,inst:r}:{...t}}const Kt=(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,E,2),Object.defineProperty(e,`toString`,{value:()=>e.message,enumerable:!1})},qt=C(`$ZodError`,Kt),Jt=C(`$ZodError`,Kt,{Parent:Error});function Yt(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 Xt(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 Zt=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 w;if(o.issues.length){let t=new(i?.Err??e)(o.issues.map(e=>R(e,a,T())));throw jt(t,i?.callee),t}return o.value},Qt=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=>R(e,a,T())));throw jt(t,i?.callee),t}return o.value},B=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 w;return a.issues.length?{success:!1,error:new(e??qt)(a.issues.map(e=>R(e,i,T())))}:{success:!0,data:a.value}},$t=B(Jt),V=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=>R(e,i,T())))}:{success:!0,data:a.value}},en=V(Jt),tn=e=>(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return Zt(e)(t,n,i)},nn=e=>(t,n,r)=>Zt(e)(t,n,r),rn=e=>async(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return Qt(e)(t,n,i)},an=e=>async(t,n,r)=>Qt(e)(t,n,r),on=e=>(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return B(e)(t,n,i)},sn=e=>(t,n,r)=>B(e)(t,n,r),cn=e=>async(t,n,r)=>{let i=r?Object.assign(r,{direction:`backward`}):{direction:`backward`};return V(e)(t,n,i)},ln=e=>async(t,n,r)=>V(e)(t,n,r),H=C(`$ZodCheck`,(e,t)=>{var n;e._zod??={},e._zod.def=t,(n=e._zod).onattach??(n.onattach=[])}),un=C(`$ZodCheckMaxLength`,(e,t)=>{var n;H.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!O(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=Gt(r);n.issues.push({origin:i,code:`too_big`,maximum:t.maximum,inclusive:!0,input:r,inst:e,continue:!t.abort})}}),dn=C(`$ZodCheckMinLength`,(e,t)=>{var n;H.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!O(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=Gt(r);n.issues.push({origin:i,code:`too_small`,minimum:t.minimum,inclusive:!0,input:r,inst:e,continue:!t.abort})}}),fn=C(`$ZodCheckLengthEquals`,(e,t)=>{var n;H.init(e,t),(n=e._zod.def).when??(n.when=e=>{let t=e.value;return!O(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=Gt(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})}}),pn=C(`$ZodCheckOverwrite`,(e,t)=>{H.init(e,t),e._zod.check=e=>{e.value=t.tx(e.value)}});var mn=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
- `))}};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(`
3
+ `))}};const hn={major:4,minor:3,patch:6},U=C(`$ZodType`,(e,t)=>{var n;e??={},e._zod.def=t,e._zod.bag=e._zod.bag||{},e._zod.version=hn;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=I(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 w;if(i||o instanceof Promise)i=(i??Promise.resolve()).then(async()=>{await o,e.issues.length!==t&&(r||=I(e,t))});else{if(e.issues.length===t)continue;r||=I(e,t)}}return i?i.then(()=>e):e},n=(n,i,a)=>{if(I(n))return n.aborted=!0,n;let o=t(i,r,a);if(o instanceof Promise){if(a.async===!1)throw new w;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 w;return o.then(e=>t(e,r,a))}return t(o,r,a)}}k(e,`~standard`,()=>({validate:t=>{try{let n=$t(e,t);return n.success?{value:n.data}:{issues:n.error?.issues}}catch{return en(e,t).then(e=>e.success?{value:e.data}:{issues:e.error?.issues})}},vendor:`zod`,version:1}))}),gn=C(`$ZodUnknown`,(e,t)=>{U.init(e,t),e._zod.parse=e=>e}),_n=C(`$ZodNever`,(e,t)=>{U.init(e,t),e._zod.parse=(t,n)=>(t.issues.push({expected:`never`,code:`invalid_type`,input:t.value,inst:e}),t)});function vn(e,t,n){e.issues.length&&t.issues.push(...Wt(n,e.issues)),t.value[n]=e.value}const yn=C(`$ZodArray`,(e,t)=>{U.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=>vn(t,n,e))):vn(s,n,e)}return a.length?Promise.all(a).then(()=>n):n}});function W(e,t,n,r,i){if(e.issues.length){if(i&&!(n in r))return;t.issues.push(...Wt(n,e.issues))}e.value===void 0?n in r&&(t.value[n]=void 0):t.value[n]=e.value}function bn(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=It(e.shape);return{...e,keys:t,keySet:new Set(t),numKeys:t.length,optionalKeys:new Set(n)}}function xn(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=>W(e,n,i,t,u))):W(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 Sn=C(`$ZodObject`,(e,t)=>{if(U.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=D(()=>bn(t));k(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=M,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=>W(n,t,e,s,r))):W(i,t,e,s,r)}return i?xn(c,s,t,o,n.value,e):c.length?Promise.all(c).then(()=>t):t}}),Cn=C(`$ZodObjectJIT`,(e,t)=>{Sn.init(e,t);let n=e._zod.parse,r=D(()=>bn(t)),i=e=>{let t=new mn([`shape`,`payload`,`ctx`]),n=r.value,i=e=>{let t=At(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=At(r),s=e[r]?._zod?.optout===`optional`;t.write(`const ${n} = ${i(r)};`),s?t.write(`
4
4
  if (${n}.issues.length) {
5
5
  if (${o} in input) {
6
6
  payload.issues = payload.issues.concat(${n}.issues.map(iss => ({
@@ -34,11 +34,11 @@ import{existsSync as e,readFileSync as t,readdirSync as n,realpathSync as r,stat
34
34
  newResult[${o}] = ${n}.value;
35
35
  }
36
36
 
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>
37
+ `)}t.write(`payload.value = newResult;`),t.write(`return payload;`);let s=t.compile();return(t,n)=>s(e,t,n)},a,o=M,s=!Et.jitless,c=s&&Mt.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?xn([],p,d,f,u,e):d):n(d,f):(d.issues.push({expected:`object`,code:`invalid_type`,input:p,inst:e}),d)}});function wn(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=>!I(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=>R(e,r,T())))}),t)}const Tn=C(`$ZodUnion`,(e,t)=>{U.init(e,t),k(e._zod,`optin`,()=>t.options.some(e=>e._zod.optin===`optional`)?`optional`:void 0),k(e._zod,`optout`,()=>t.options.some(e=>e._zod.optout===`optional`)?`optional`:void 0),k(e._zod,`values`,()=>{if(t.options.every(e=>e._zod.values))return new Set(t.options.flatMap(e=>Array.from(e._zod.values)))}),k(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=>Ot(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=>wn(t,i,e,a)):wn(s,i,e,a)}}),En=C(`$ZodIntersection`,(e,t)=>{U.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])=>On(e,t,n)):On(e,i,a)}});function Dn(e,t){if(e===t||e instanceof Date&&t instanceof Date&&+e==+t)return{valid:!0,data:e};if(N(e)&&N(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=Dn(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=Dn(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 On(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}),I(e))return e;let o=Dn(t.value,n.value);if(!o.valid)throw Error(`Unmergable intersection. Error path: ${JSON.stringify(o.mergeErrorPath)}`);return e.value=o.data,e}const kn=C(`$ZodEnum`,(e,t)=>{U.init(e,t);let n=Dt(t.entries),r=new Set(n);e._zod.values=r,e._zod.pattern=RegExp(`^(${n.filter(e=>Pt.has(typeof e)).map(e=>typeof e==`string`?Ft(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}}),An=C(`$ZodTransform`,(e,t)=>{U.init(e,t),e._zod.parse=(n,r)=>{if(r.direction===`backward`)throw new Tt(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 w;return n.value=i,n}});function jn(e,t){return e.issues.length&&t===void 0?{issues:[],value:void 0}:e}const Mn=C(`$ZodOptional`,(e,t)=>{U.init(e,t),e._zod.optin=`optional`,e._zod.optout=`optional`,k(e._zod,`values`,()=>t.innerType._zod.values?new Set([...t.innerType._zod.values,void 0]):void 0),k(e._zod,`pattern`,()=>{let e=t.innerType._zod.pattern;return e?RegExp(`^(${Ot(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=>jn(t,e.value)):jn(r,e.value)}return e.value===void 0?e:t.innerType._zod.run(e,n)}}),Nn=C(`$ZodExactOptional`,(e,t)=>{Mn.init(e,t),k(e._zod,`values`,()=>t.innerType._zod.values),k(e._zod,`pattern`,()=>t.innerType._zod.pattern),e._zod.parse=(e,n)=>t.innerType._zod.run(e,n)}),Pn=C(`$ZodNullable`,(e,t)=>{U.init(e,t),k(e._zod,`optin`,()=>t.innerType._zod.optin),k(e._zod,`optout`,()=>t.innerType._zod.optout),k(e._zod,`pattern`,()=>{let e=t.innerType._zod.pattern;return e?RegExp(`^(${Ot(e.source)}|null)$`):void 0}),k(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)}),Fn=C(`$ZodDefault`,(e,t)=>{U.init(e,t),e._zod.optin=`optional`,k(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=>In(e,t)):In(r,t)}});function In(e,t){return e.value===void 0&&(e.value=t.defaultValue),e}const Ln=C(`$ZodPrefault`,(e,t)=>{U.init(e,t),e._zod.optin=`optional`,k(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))}),Rn=C(`$ZodNonOptional`,(e,t)=>{U.init(e,t),k(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=>zn(t,e)):zn(i,e)}});function zn(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 Bn=C(`$ZodCatch`,(e,t)=>{U.init(e,t),k(e._zod,`optin`,()=>t.innerType._zod.optin),k(e._zod,`optout`,()=>t.innerType._zod.optout),k(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=>R(e,n,T()))},input:e.value}),e.issues=[]),e)):(e.value=r.value,r.issues.length&&(e.value=t.catchValue({...e,error:{issues:r.issues.map(e=>R(e,n,T()))},input:e.value}),e.issues=[]),e)}}),Vn=C(`$ZodPipe`,(e,t)=>{U.init(e,t),k(e._zod,`values`,()=>t.in._zod.values),k(e._zod,`optin`,()=>t.in._zod.optin),k(e._zod,`optout`,()=>t.out._zod.optout),k(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=>G(e,t.in,n)):G(r,t.in,n)}let r=t.in._zod.run(e,n);return r instanceof Promise?r.then(e=>G(e,t.out,n)):G(r,t.out,n)}});function G(e,t,n){return e.issues.length?(e.aborted=!0,e):t._zod.run({value:e.value,issues:e.issues},n)}const Hn=C(`$ZodReadonly`,(e,t)=>{U.init(e,t),k(e._zod,`propValues`,()=>t.innerType._zod.propValues),k(e._zod,`values`,()=>t.innerType._zod.values),k(e._zod,`optin`,()=>t.innerType?._zod?.optin),k(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(Un):Un(r)}});function Un(e){return e.value=Object.freeze(e.value),e}const Wn=C(`$ZodCustom`,(e,t)=>{H.init(e,t),U.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=>Gn(t,n,r,e));Gn(i,n,r,e)}});function Gn(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(z(e))}}var Kn,qn=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 Jn(){return new qn}(Kn=globalThis).__zod_globalRegistry??(Kn.__zod_globalRegistry=Jn());const K=globalThis.__zod_globalRegistry;function Yn(e){return new e({type:`unknown`})}function Xn(e,t){return new e({type:`never`,...F(t)})}function Zn(e,t){return new un({check:`max_length`,...F(t),maximum:e})}function Qn(e,t){return new dn({check:`min_length`,...F(t),minimum:e})}function $n(e,t){return new fn({check:`length_equals`,...F(t),length:e})}function er(e){return new pn({check:`overwrite`,tx:e})}function tr(e,t,n){return new e({type:`array`,element:t,...F(n)})}function nr(e,t,n){return new e({type:`custom`,check:`custom`,fn:t,...F(n)})}function rr(e){let t=ir(n=>(n.addIssue=e=>{if(typeof e==`string`)n.issues.push(z(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(z(r))}},e(n.value,n)));return t}function ir(e,t){let n=new H({check:`custom`,...F(t)});return n._zod.check=e,n}function ar(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??K,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 q(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,q(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`&&J(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 or(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 sr(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:Y(t,`input`,e.processors),output:Y(t,`output`,e.processors)}},enumerable:!1,writable:!1}),n}catch{throw Error(`Error converting schema to JSON.`)}}function J(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 J(r.element,n);if(r.type===`set`)return J(r.valueType,n);if(r.type===`lazy`)return J(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 J(r.innerType,n);if(r.type===`intersection`)return J(r.left,n)||J(r.right,n);if(r.type===`record`||r.type===`map`)return J(r.keyType,n)||J(r.valueType,n);if(r.type===`pipe`)return J(r.in,n)||J(r.out,n);if(r.type===`object`){for(let e in r.shape)if(J(r.shape[e],n))return!0;return!1}if(r.type===`union`){for(let e of r.options)if(J(e,n))return!0;return!1}if(r.type===`tuple`){for(let e of r.items)if(J(e,n))return!0;return!!(r.rest&&J(r.rest,n))}return!1}const cr=(e,t={})=>n=>{let r=ar({...n,processors:t});return q(e,r),or(r,e),sr(r,e)},Y=(e,t,n={})=>r=>{let{libraryOptions:i,target:a}=r??{},o=ar({...i??{},target:a,io:t,processors:n});return q(e,o),or(o,e),sr(o,e)},lr=(e,t,n,r)=>{n.not={}},ur=(e,t,n,r)=>{let i=e._zod.def,a=Dt(i.entries);a.every(e=>typeof e==`number`)&&(n.type=`number`),a.every(e=>typeof e==`string`)&&(n.type=`string`),n.enum=a},dr=(e,t,n,r)=>{if(t.unrepresentable===`throw`)throw Error(`Custom types cannot be represented in JSON Schema`)},fr=(e,t,n,r)=>{if(t.unrepresentable===`throw`)throw Error(`Transforms cannot be represented in JSON Schema`)},pr=(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=q(a.element,t,{...r,path:[...r.path,`items`]})},mr=(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]=q(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=q(a.catchall,t,{...r,path:[...r.path,`additionalProperties`]})):t.io===`output`&&(i.additionalProperties=!1)},hr=(e,t,n,r)=>{let i=e._zod.def,a=i.inclusive===!1,o=i.options.map((e,n)=>q(e,t,{...r,path:[...r.path,a?`oneOf`:`anyOf`,n]}));a?n.oneOf=o:n.anyOf=o},gr=(e,t,n,r)=>{let i=e._zod.def,a=q(i.left,t,{...r,path:[...r.path,`allOf`,0]}),o=q(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]]},_r=(e,t,n,r)=>{let i=e._zod.def,a=q(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`}]},vr=(e,t,n,r)=>{let i=e._zod.def;q(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType},yr=(e,t,n,r)=>{let i=e._zod.def;q(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType,n.default=JSON.parse(JSON.stringify(i.defaultValue))},br=(e,t,n,r)=>{let i=e._zod.def;q(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)))},xr=(e,t,n,r)=>{let i=e._zod.def;q(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},Sr=(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;q(a,t,r);let o=t.seen.get(e);o.ref=a},Cr=(e,t,n,r)=>{let i=e._zod.def;q(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType,n.readOnly=!0},wr=(e,t,n,r)=>{let i=e._zod.def;q(i.innerType,t,r);let a=t.seen.get(e);a.ref=i.innerType},Tr=(e,t)=>{qt.init(e,t),e.name=`ZodError`,Object.defineProperties(e,{format:{value:t=>Xt(e,t)},flatten:{value:t=>Yt(e,t)},addIssue:{value:t=>{e.issues.push(t),e.message=JSON.stringify(e.issues,E,2)}},addIssues:{value:t=>{e.issues.push(...t),e.message=JSON.stringify(e.issues,E,2)}},isEmpty:{get(){return e.issues.length===0}}})};C(`ZodError`,Tr);const X=C(`ZodError`,Tr,{Parent:Error}),Er=Zt(X),Dr=Qt(X),Or=B(X),kr=V(X),Ar=tn(X),jr=nn(X),Mr=rn(X),Nr=an(X),Pr=on(X),Fr=sn(X),Ir=cn(X),Lr=ln(X),Z=C(`ZodType`,(e,t)=>(U.init(e,t),Object.assign(e[`~standard`],{jsonSchema:{input:Y(e,`input`),output:Y(e,`output`)}}),e.toJSONSchema=cr(e,{}),e.def=t,e.type=t.type,Object.defineProperty(e,`_def`,{value:t}),e.check=(...n)=>e.clone(j(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)=>P(e,t,n),e.brand=()=>e,e.register=((t,n)=>(t.add(e,n),e)),e.parse=(t,n)=>Er(e,t,n,{callee:e.parse}),e.safeParse=(t,n)=>Or(e,t,n),e.parseAsync=async(t,n)=>Dr(e,t,n,{callee:e.parseAsync}),e.safeParseAsync=async(t,n)=>kr(e,t,n),e.spa=e.safeParseAsync,e.encode=(t,n)=>Ar(e,t,n),e.decode=(t,n)=>jr(e,t,n),e.encodeAsync=async(t,n)=>Mr(e,t,n),e.decodeAsync=async(t,n)=>Nr(e,t,n),e.safeEncode=(t,n)=>Pr(e,t,n),e.safeDecode=(t,n)=>Fr(e,t,n),e.safeEncodeAsync=async(t,n)=>Ir(e,t,n),e.safeDecodeAsync=async(t,n)=>Lr(e,t,n),e.refine=(t,n)=>e.check(yi(t,n)),e.superRefine=t=>e.check(bi(t)),e.overwrite=t=>e.check(er(t)),e.optional=()=>ti(e),e.exactOptional=()=>ri(e),e.nullable=()=>ai(e),e.nullish=()=>ti(ai(e)),e.nonoptional=t=>di(e,t),e.array=()=>Ur(e),e.or=t=>qr([e,t]),e.and=t=>Yr(e,t),e.transform=t=>hi(e,$r(t)),e.default=t=>si(e,t),e.prefault=t=>li(e,t),e.catch=t=>pi(e,t),e.pipe=t=>hi(e,t),e.readonly=()=>_i(e),e.describe=t=>{let n=e.clone();return K.add(n,{description:t}),n},Object.defineProperty(e,`description`,{get(){return K.get(e)?.description},configurable:!0}),e.meta=(...t)=>{if(t.length===0)return K.get(e);let n=e.clone();return K.add(n,t[0]),n},e.isOptional=()=>e.safeParse(void 0).success,e.isNullable=()=>e.safeParse(null).success,e.apply=t=>t(e),e)),Rr=C(`ZodUnknown`,(e,t)=>{gn.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(e,t,n)=>void 0});function zr(){return Yn(Rr)}const Br=C(`ZodNever`,(e,t)=>{_n.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>lr(e,t,n,r)});function Vr(e){return Xn(Br,e)}const Hr=C(`ZodArray`,(e,t)=>{yn.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>pr(e,t,n,r),e.element=t.element,e.min=(t,n)=>e.check(Qn(t,n)),e.nonempty=t=>e.check(Qn(1,t)),e.max=(t,n)=>e.check(Zn(t,n)),e.length=(t,n)=>e.check($n(t,n)),e.unwrap=()=>e.element});function Ur(e,t){return tr(Hr,e,t)}const Wr=C(`ZodObject`,(e,t)=>{Cn.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>mr(e,t,n,r),k(e,`shape`,()=>t.shape),e.keyof=()=>Zr(Object.keys(e._zod.def.shape)),e.catchall=t=>e.clone({...e._zod.def,catchall:t}),e.passthrough=()=>e.clone({...e._zod.def,catchall:zr()}),e.loose=()=>e.clone({...e._zod.def,catchall:zr()}),e.strict=()=>e.clone({...e._zod.def,catchall:Vr()}),e.strip=()=>e.clone({...e._zod.def,catchall:void 0}),e.extend=t=>zt(e,t),e.safeExtend=t=>Bt(e,t),e.merge=t=>Vt(e,t),e.pick=t=>Lt(e,t),e.omit=t=>Rt(e,t),e.partial=(...t)=>Ht(ei,e,t[0]),e.required=(...t)=>Ut(ui,e,t[0])});function Gr(e,t){return new Wr({type:`object`,shape:e??{},...F(t)})}const Kr=C(`ZodUnion`,(e,t)=>{Tn.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>hr(e,t,n,r),e.options=t.options});function qr(e,t){return new Kr({type:`union`,options:e,...F(t)})}const Jr=C(`ZodIntersection`,(e,t)=>{En.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>gr(e,t,n,r)});function Yr(e,t){return new Jr({type:`intersection`,left:e,right:t})}const Xr=C(`ZodEnum`,(e,t)=>{kn.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>ur(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 Xr({...t,checks:[],...F(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 Xr({...t,checks:[],...F(r),entries:i})}});function Zr(e,t){return new Xr({type:`enum`,entries:Array.isArray(e)?Object.fromEntries(e.map(e=>[e,e])):e,...F(t)})}const Qr=C(`ZodTransform`,(e,t)=>{An.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>fr(e,t,n,r),e._zod.parse=(n,r)=>{if(r.direction===`backward`)throw new Tt(e.constructor.name);n.addIssue=r=>{if(typeof r==`string`)n.issues.push(z(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(z(t))}};let i=t.transform(n.value,n);return i instanceof Promise?i.then(e=>(n.value=e,n)):(n.value=i,n)}});function $r(e){return new Qr({type:`transform`,transform:e})}const ei=C(`ZodOptional`,(e,t)=>{Mn.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>wr(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function ti(e){return new ei({type:`optional`,innerType:e})}const ni=C(`ZodExactOptional`,(e,t)=>{Nn.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>wr(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function ri(e){return new ni({type:`optional`,innerType:e})}const ii=C(`ZodNullable`,(e,t)=>{Pn.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>_r(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function ai(e){return new ii({type:`nullable`,innerType:e})}const oi=C(`ZodDefault`,(e,t)=>{Fn.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>yr(e,t,n,r),e.unwrap=()=>e._zod.def.innerType,e.removeDefault=e.unwrap});function si(e,t){return new oi({type:`default`,innerType:e,get defaultValue(){return typeof t==`function`?t():Nt(t)}})}const ci=C(`ZodPrefault`,(e,t)=>{Ln.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>br(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function li(e,t){return new ci({type:`prefault`,innerType:e,get defaultValue(){return typeof t==`function`?t():Nt(t)}})}const ui=C(`ZodNonOptional`,(e,t)=>{Rn.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>vr(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function di(e,t){return new ui({type:`nonoptional`,innerType:e,...F(t)})}const fi=C(`ZodCatch`,(e,t)=>{Bn.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>xr(e,t,n,r),e.unwrap=()=>e._zod.def.innerType,e.removeCatch=e.unwrap});function pi(e,t){return new fi({type:`catch`,innerType:e,catchValue:typeof t==`function`?t:()=>t})}const mi=C(`ZodPipe`,(e,t)=>{Vn.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Sr(e,t,n,r),e.in=t.in,e.out=t.out});function hi(e,t){return new mi({type:`pipe`,in:e,out:t})}const gi=C(`ZodReadonly`,(e,t)=>{Hn.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>Cr(e,t,n,r),e.unwrap=()=>e._zod.def.innerType});function _i(e){return new gi({type:`readonly`,innerType:e})}const vi=C(`ZodCustom`,(e,t)=>{Wn.init(e,t),Z.init(e,t),e._zod.processJSONSchema=(t,n,r)=>dr(e,t,n,r)});function yi(e,t={}){return nr(vi,e,t)}function bi(e){return rr(e)}const xi=Zr([`readonly`,`confirm`,`auto`]),Si=Zr([`low`,`medium`,`high`,`xhigh`,`max`]),Ci=Gr({mode:xi}),wi=Gr({level:Si});function Ti(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=Ci.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=wi.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 Ei(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?.breakpoints.list();return e.json({breakpoints:n})}),n}const Di=fe.map(e=>e.point),Oi=[`continue`,`next`,`step`,`over`,`stop`];function ki(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=fe.map(({point:e})=>{let t=n().breakpoints.get(e);return{point:e,enabled:t?.enabled??!1,set:t!==void 0}});return e.json({breakpoints:t})}),t.put(`/breakpoints/:point`,async e=>{let t=e.req.param(`point`);if(!Di.includes(t))return e.json({error:`unknown breakpoint point: ${t}`},400);let r=(await e.req.json().catch(()=>({enabled:!0}))).enabled??!0,i=n().breakpoints.set(t,r);return e.json({breakpoint:i})}),t.post(`/breakpoints/enable-all`,e=>(n().breakpoints.enableAll(),e.json({status:`ok`}))),t.post(`/breakpoints/disable-all`,e=>(n().breakpoints.disableAll(),e.json({status:`ok`}))),t.get(`/state`,e=>{let t=n().breakpoints.list(),r=t.filter(e=>e.enabled).length,i=n().controller.pending();return e.json({enabled:!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 Oi.includes(i)?(n.send({type:i,seq:0,...r.depth===void 0?{}:{depth:r.depth}},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:0},{systemPrompt:r.systemPrompt,injectMessages:r.injectMessages?.map(e=>({role:e.role,content:e.content})),llmParams:r.llmParams}),t.json({status:`ok`}))}),t}const Ai={trace:0,debug:1,info:2,warn:3,error:4,fatal:5};function ji(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&&Ai[i]!==void 0){let e=Ai[i];o=o.filter(t=>(Ai[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?ge(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 Mi(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 Ni(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=[..._e.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=_e.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=_e.get(t);return r?e.json({job:n(r)}):e.json({error:`job not found`},404)}),t}function Pi(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.get(`/platform`,async t=>{if(!e.app.isFeedbackAvailable())return t.json({error:`feedback plugin not available`},503);let n=await e.app.resolveFeedbackPlatform();return t.json({platform:n})}),t.get(`/issues`,async t=>{if(!e.app.isFeedbackAvailable())return t.json({error:`feedback plugin not available`},503);let n=t.req.query(`state`),r=t.req.query(`limit`)?Number(t.req.query(`limit`)):void 0,i=await e.app.listFeedbackIssues({...n?{state:n}:{},...r!==void 0&&Number.isFinite(r)?{limitPerSource:r}:{}});return t.json(i)}),t.get(`/resolved`,async t=>{if(!e.app.isFeedbackAvailable())return t.json({error:`feedback plugin not available`},503);let n=await e.app.listFeedbackResolvedMarks();return t.json({marks:n})}),t.post(`/resolved`,async t=>{if(!e.app.isFeedbackAvailable())return t.json({error:`feedback plugin not available`},503);let n=await t.req.json().catch(()=>({}));if(!n.source||![`github`,`coding`].includes(n.source))return t.json({error:`source must be one of github|coding`},400);if(!n.platformIssueId)return t.json({error:`platformIssueId is required`},400);let r=await e.app.markFeedbackResolved({source:n.source,platformIssueId:n.platformIssueId,url:n.url??``,title:n.title??``});return t.json({ok:r})}),t.delete(`/resolved`,async t=>{if(!e.app.isFeedbackAvailable())return t.json({error:`feedback plugin not available`},503);let n=await t.req.json().catch(()=>({}));if(!n.source||![`github`,`coding`].includes(n.source))return t.json({error:`source must be one of github|coding`},400);if(!n.platformIssueId)return t.json({error:`platformIssueId is required`},400);let r=await e.app.unmarkFeedbackResolved(n.source,n.platformIssueId);return t.json({ok:r})}),t.post(`/coding-issue-url`,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);let r=e.app.buildFeedbackCodingIssueUrl({title:n.title,reproduce:n.reproduce,expected:n.expected,actual:n.actual,envInfo:n.envInfo??``,repo:n.repo??``});return t.json({url:r})}),t}function Q(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||!$e(et(e),r.token))return e.json({error:`forbidden`},403);await n()},binding:t}}function Fi(){return async(e,t)=>{let n=e.req.param(`wsKey`);if(!n)return e.json({error:`missing_workspace_key`},400);if(n!==ve&&(!n.startsWith(`ws_`)||!ye(n.slice(3))))return e.json({error:`invalid_workspace_key`},400);await t()}}function Ii(e){let t=e.req.query(`ws`);return t?t===ve?t:!t.startsWith(`ws_`)||!ye(t.slice(3))?null:t:null}var Li=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 Ri=new Li,$=h(`@x-otto/service:storage`);function zi(e){let t=new m,{middleware:n,binding:r}=Q(e);t.use(`/:namespace/:wsKey/*`,Fi()),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 $.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 $.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 $.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 $.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 $.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 Ri.emit({namespace:n,wsKey:r,docId:o,entry:t.entry,ts:Date.now()}),e.json({seq:t.seq,ts:Date.now()})}catch(t){return $.error({namespace:n,docId:o,error:t},`entry append failed`),e.json({error:`storage_error`},500)}}),t}const Bi=[`/api/health`,`/api/storage`];function Vi(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(!$e(et(t),e))return t.json({error:`forbidden`},403);await n()};n.use(`/api/*`,(e,t)=>{let n=e.req.path;return Bi.some(e=>n===e||n.startsWith(`${e}/`))?t():r(e,t)})}return n.route(`/api/health`,tt(e)),n.route(`/api/authority`,nt(e)),n.route(`/api/chat`,lt(e)),n.route(`/api/sessions`,wt(e)),n.route(`/api/storage`,zi(e)),n.route(`/api/setting`,Ti(e)),n.route(`/api/devtools`,Ei(e,t.devtools||null)),n.route(`/api/debugger`,ki(e)),n.route(`/api/logs`,ji(e)),n.route(`/api/catalog`,Mi(e)),n.route(`/api/jobs`,Ni(e)),n.route(`/api/plugin-feedback`,Pi(e)),t.staticDir&&n.get(`*`,t=>e.static(t)),n.notFound(e=>e.text(`not found`,404)),n}var Hi=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 Ui=h(`@x-otto/service`),Wi={".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 Gi=class{httpApp;server;host;port;staticDir;apiToken;wsAuthToken;authority;eventLog=new Hi;bridges=new Map;traceBridges=new Map;router;state=`idle`;evictTimer;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 Ae({allowedOrigins:t.cors?[t.cors]:void 0,authToken:t.wsAuthToken}),e.devtools&&(this.bridge=new ze(e.devtools,this.ws)),this.router=new Qe(this.ws,this.app,this.bridge,(e,t)=>this.eventLog.readFrom(e,t)),this.httpApp=Vi(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(be({name:`service_session_attach`,timing:`session.created`,priority:5,handle:t})),e.registerHook(be({name:`service_session_restore_attach`,timing:`session.restored`,priority:5,handle:t})),e.registerHook(be({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:rt(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.state===`stopped`)throw Error(`CodingService is terminated; construct a new instance to restart`);if(this.state!==`running`){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.state=`running`,this.evictTimer=setInterval(()=>this.router.writeLease.evictStale(),22e3),this.evictTimer.unref?.(),this.bridge?.attach(),Ui.info({host:this.host,port:this.port},`service started`),e()})})}}async stop(){if(this.state===`running`){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(),this.evictTimer&&=(clearInterval(this.evictTimer),void 0),new Promise(e=>{let t=!1,n=()=>{t||(t=!0,clearTimeout(r),this.state=`stopped`,e())};this.server.closeAllConnections();let r=setTimeout(()=>{Ui.warn(`service stop timed out after 5000ms; forcing resolve`),n()},5e3);this.server.close(()=>{Ui.info(`service stopped`),n()})})}}attachSession(e){if(this.bridges.has(e.id))return;let t=new Pe(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 Ie(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=Wi[l(i)]||`application/octet-stream`,o=t(i);return new Response(o,{headers:{"Content-Type":a}})}};function Ki(e,t){return new Gi(e,t)}function qi(){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 Ji=h(`@x-otto/service:access`);function Yi(){return async(e,t)=>{let n=Date.now();await t();let r=Date.now()-n;Ji.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 Xi(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 Zi(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 $i(e){let t=new m,{middleware:n,binding:r}=Q(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=ea(t,i,Ii(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=Ii(e)||void 0,a=Number.parseInt(e.req.query(`since`)??`0`,10)||0,o=new AbortController,s=ea(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 ea(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(Ri.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 ta=h(`@x-otto/service:sync`);function na(e){let t=new m,{middleware:n,binding:r}=Q(e);return t.use(`/:namespace/:wsKey/*`,Fi()),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),ta.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 ta.error({namespace:n,error:t},`sync pull failed`),e.json({error:`storage_error`},500)}}),t}const ra=h(`@x-otto/service:schedule-lease`);function ia(e,t){let n=new m,{middleware:r,binding:i}=t;n.use(`/:wsKey/*`,Fi()),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 ra.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 ra.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 ra.error({wsKey:t,error:n},`schedule lease release failed`),e.json({error:`lease_error`},500)}}),n}const aa=h(`@x-otto/service:persistenced`),oa=3001,sa=[`sessions`,`schedules`];async function ca(e){let t=e.port??3001,n=e.host??`127.0.0.1`,r=e.namespaces??sa,i=`${e.dir}/storage.db`,a=new Se({namespaces:r,backend:e=>new xe({dbPath:i,namespace:e,wal:!0})}),o=Ce(`${e.dir}/schedule-lease.db`,!0,Te),s={app:{storage:{storageHost:{host:a,token:e.token}}}},c=Q(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(`*`,qi()),l.use(`*`,Yi()),l.use(`*`,Xi({defaultRps:e.rateLimitRps??100})),l.use(`*`,Zi({maxBodyBytes:e.maxBodyBytes??10485760})),l.get(`/health`,e=>e.json({status:`ok`,service:`otto-persistenced`,uptime:process.uptime(),namespaces:r})),l.route(`/api/storage`,zi(s)),l.route(`/api/events`,$i(s)),l.route(`/api/sync`,na(s)),l.route(`/api/schedules`,ia(o,c)),l.notFound(e=>e.text(`not found`,404));let u=ne({fetch:l.fetch,port:t,hostname:n});u.once(`close`,()=>we(o)),u.on(`error`,e=>aa.error({err:e},`persistenced server error`));let d=()=>(u.closeAllConnections?.(),new Promise(e=>u.close(()=>e())));return 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}`,stop:d})}),u.once(`error`,r)})}export{Gi as CodingService,ze as DebugBridge,Pe as EventBridge,Li as EventBus,Qe as InboundRouter,oa as PERSISTENCED_DEFAULT_PORT,Hi as SessionEventLog,Ae as WebSocketManager,Ki as createCodingService,ae as createProjectorState,Me as encodeSessionEvent,Ri as eventBus,ca as startPersistenced};
44
44
  //# sourceMappingURL=index.js.map