@x-otto/service 0.0.1-alpha.0
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/README.md +119 -0
- package/dist/index.d.ts +617 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["logger","logger","logger","logger","logger","logger","logger","initializer","util.jsonStringifyReplacer","core.$ZodAsyncError","util.finalizeIssue","core.config","parse","errors.$ZodRealError","parseAsync","errors.$ZodError","safeParse","safeParseAsync","encode","decode","encodeAsync","decodeAsync","safeEncode","safeDecode","safeEncodeAsync","safeDecodeAsync","util.nullish","util.getLengthableOrigin","util.aborted","core.$ZodAsyncError","safeParse","safeParseAsync","util.prefixIssues","util.optionalKeys","util.cached","isObject","util.isObject","util.esc","allowsEval","util.allowsEval","util.finalizeIssue","core.config","util.cleanRegex","util.isPlainObject","util.getEnumValues","util.escapeRegex","core.$ZodEncodeError","util.issue","util.normalizeParams","checks.$ZodCheckMaxLength","checks.$ZodCheckMinLength","checks.$ZodCheckLengthEquals","checks.$ZodCheckOverwrite","issue","util.issue","checks.$ZodCheck","describe","meta","process","process","core.formatError","core.flattenError","util.jsonStringifyReplacer","core.$constructor","util.mergeDefs","core.clone","parse.parse","parse.safeParse","parse.parseAsync","parse.safeParseAsync","parse.encode","parse.decode","parse.encodeAsync","parse.decodeAsync","parse.safeEncode","parse.safeDecode","parse.safeEncodeAsync","parse.safeDecodeAsync","checks.overwrite","processors.unknownProcessor","core._unknown","processors.neverProcessor","core._never","processors.arrayProcessor","checks.minLength","checks.maxLength","checks.length","core._array","processors.objectProcessor","util.extend","util.safeExtend","util.merge","util.pick","util.omit","util.partial","util.required","util.normalizeParams","processors.unionProcessor","processors.intersectionProcessor","processors.enumProcessor","processors.transformProcessor","core.$ZodEncodeError","issue","util.issue","processors.optionalProcessor","processors.nullableProcessor","processors.defaultProcessor","util.shallowClone","processors.prefaultProcessor","processors.nonoptionalProcessor","processors.catchProcessor","processors.pipeProcessor","processors.readonlyProcessor","processors.customProcessor","core._refine","core._superRefine","core.describe","core.meta","z.enum","z.object","logger","logger","logger","logger","logger"],"sources":["../src/websocket-manager.ts","../src/session-event-wire.ts","../src/event-bridge.ts","../src/trace-bridge.ts","../src/debug-event-router.ts","../src/debug-bridge.ts","../src/write-lease-manager.ts","../src/inbound-router.ts","../src/routes/auth.ts","../src/routes/health.ts","../src/routes/authority.ts","../src/message-serializer.ts","../src/routes/chat.ts","../src/routes/workspace.ts","../src/routes/timetravel.ts","../src/routes/sessions.ts","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/core.js","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/util.js","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/errors.js","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/parse.js","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/checks.js","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/doc.js","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/versions.js","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/schemas.js","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/registries.js","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/api.js","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/to-json-schema.js","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/core/json-schema-processors.js","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/classic/errors.js","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/classic/parse.js","../../../node_modules/.pnpm/zod@4.3.6/node_modules/zod/v4/classic/schemas.js","../src/routes/setting.ts","../src/routes/devtools.ts","../src/routes/debugger.ts","../src/routes/logs.ts","../src/routes/catalog.ts","../src/routes/jobs.ts","../src/routes/plugin-feedback.ts","../src/middleware/storage-auth.ts","../src/middleware/workspace-auth.ts","../src/event-bus.ts","../src/routes/storage.ts","../src/create-app.ts","../src/session-event-log.ts","../src/coding-service.ts","../src/middleware/request-id.ts","../src/middleware/access-log.ts","../src/middleware/rate-limit.ts","../src/routes/events.ts","../src/routes/sync.ts","../src/routes/schedule-lease.ts","../src/persistenced-app.ts"],"sourcesContent":["import { WebSocketServer } from 'ws'\nimport { timingSafeEqual } from 'node:crypto'\nimport { createLogger, TypedEventEmitter } from '@x-otto/shared'\nimport type { WebSocket } from 'ws'\nimport type { IncomingMessage } from 'node:http'\nimport type { Socket } from 'node:net'\nimport type { WebSocketMessage, WebSocketClientMessage } from './types'\n\nconst logger = createLogger('@x-otto/service:websocket-manager')\n\nexport type WebSocketClientHandler = (clientId: string, message: WebSocketClientMessage) => void\n\ninterface WebSocketManagerEvents {\n message: (clientId: string, message: WebSocketClientMessage) => void\n}\n\nexport interface WebSocketManagerOptions {\n allowedOrigins?: string[]\n\n authToken?: string\n maxPayloadBytes?: number\n maxMessagesPerSecond?: number\n maxConnections?: number\n}\n\nconst DEFAULT_MAX_PAYLOAD = 1024 * 1024\nconst DEFAULT_MAX_MESSAGES_PER_SECOND = 100\nconst DEFAULT_MAX_CONNECTIONS = 256\nconst LOOPBACK_HOSTNAMES = new Set(['localhost', '127.0.0.1', '::1', '[::1]'])\n\nexport class WebSocketManager extends TypedEventEmitter<WebSocketManagerEvents> {\n private readonly wss: WebSocketServer\n private readonly clients = new Map<string, WebSocket>()\n private readonly sessionSubscriptions = new Map<string, Set<string>>()\n private readonly options: WebSocketManagerOptions\n private readonly maxMessagesPerSecond: number\n private readonly maxConnections: number\n private clientId = 0\n /** RFC-335 S4:client 断连触发点——InboundRouter 释放 write-lease。 */\n onClientDisconnected?: (clientId: string) => void\n\n get clientCount(): number {\n return this.clients.size\n }\n\n constructor(options: WebSocketManagerOptions = {}) {\n super()\n this.options = options\n this.maxMessagesPerSecond = options.maxMessagesPerSecond ?? DEFAULT_MAX_MESSAGES_PER_SECOND\n this.maxConnections = options.maxConnections ?? DEFAULT_MAX_CONNECTIONS\n this.wss = new WebSocketServer({\n noServer: true,\n maxPayload: options.maxPayloadBytes ?? DEFAULT_MAX_PAYLOAD,\n })\n this.wss.on('connection', this.onConnection)\n }\n\n handleUpgrade(request: IncomingMessage, socket: Socket, head: Buffer, pathname: string): boolean {\n if (pathname !== '/ws') {\n return false\n }\n\n if (!this.isOriginAllowed(request)) {\n logger.warn({ origin: request.headers.origin }, 'ws upgrade rejected: origin not allowed')\n this.rejectUpgrade(socket, '403 Forbidden')\n return true\n }\n if (!this.isTokenValid(request)) {\n logger.warn('ws upgrade rejected: invalid auth token')\n this.rejectUpgrade(socket, '401 Unauthorized')\n return true\n }\n if (this.clients.size >= this.maxConnections) {\n logger.warn({ active: this.clients.size }, 'ws upgrade rejected: max connections reached')\n this.rejectUpgrade(socket, '503 Service Unavailable')\n return true\n }\n\n this.wss.handleUpgrade(request, socket, head, (ws) => this.wss.emit('connection', ws, request))\n\n return true\n }\n\n private rejectUpgrade(socket: Socket, status: string): void {\n socket.on('error', () => {})\n try {\n socket.write(`HTTP/1.1 ${status}\\r\\nConnection: close\\r\\n\\r\\n`)\n socket.destroy()\n } catch {}\n }\n\n private isOriginAllowed(request: IncomingMessage): boolean {\n const origin = request.headers.origin\n if (!origin) {\n return true\n }\n if (this.options.allowedOrigins?.includes(origin)) {\n return true\n }\n try {\n return LOOPBACK_HOSTNAMES.has(new URL(origin).hostname)\n } catch {\n return false\n }\n }\n\n private isTokenValid(request: IncomingMessage): boolean {\n const { authToken } = this.options\n if (!authToken) {\n return true\n }\n try {\n const url = new URL(request.url ?? '/', 'http://localhost')\n const provided = url.searchParams.get('token')\n if (provided === null) {\n return false\n }\n const a = Buffer.from(provided)\n const b = Buffer.from(authToken)\n return a.length === b.length && timingSafeEqual(a, b)\n } catch {\n return false\n }\n }\n\n broadcast(message: WebSocketMessage): void {\n const payload = JSON.stringify(message)\n for (const [, ws] of this.clients) {\n if (ws.readyState === ws.OPEN) {\n ws.send(payload)\n }\n }\n }\n\n sendToSession(sessionId: string, message: WebSocketMessage): void {\n this.sendToSubscribers(sessionId, message)\n }\n\n sendToSubscribers(sessionId: string, message: WebSocketMessage): void {\n const subscribers = this.sessionSubscriptions.get(sessionId)\n if (!subscribers || subscribers.size === 0) {\n return\n }\n\n const payload = JSON.stringify(message)\n for (const clientId of subscribers) {\n const ws = this.clients.get(clientId)\n if (ws && ws.readyState === ws.OPEN) {\n ws.send(payload)\n }\n }\n }\n\n subscribeClient(clientId: string, sessionId: string): void {\n if (!sessionId) {\n return\n }\n if (!this.sessionSubscriptions.has(sessionId)) {\n this.sessionSubscriptions.set(sessionId, new Set())\n }\n this.sessionSubscriptions.get(sessionId)?.add(clientId)\n }\n\n unsubscribeClient(clientId: string, sessionId: string): void {\n if (!sessionId) {\n return\n }\n this.sessionSubscriptions.get(sessionId)?.delete(clientId)\n }\n\n clearSessionSubscriptions(sessionId: string): void {\n this.sessionSubscriptions.delete(sessionId)\n }\n\n sendToClient(clientId: string, message: WebSocketMessage): void {\n const ws = this.clients.get(clientId)\n if (ws && ws.readyState === ws.OPEN) {\n ws.send(JSON.stringify(message))\n }\n }\n\n close(): void {\n for (const [, ws] of this.clients) {\n ws.close()\n }\n this.clients.clear()\n this.sessionSubscriptions.clear()\n this.wss.close()\n }\n\n private onConnection = (ws: WebSocket) => {\n const clientId = String(++this.clientId)\n this.clients.set(clientId, ws)\n\n logger.debug({ clientId }, 'client connected')\n this.sendToClient(clientId, { type: 'Runtime.connected', data: { clientId } })\n\n const recentTimestamps: number[] = []\n\n ws.on('message', (raw: Buffer) => {\n const now = Date.now()\n const cutoff = now - 1000\n while (recentTimestamps.length > 0 && recentTimestamps[0]! <= cutoff) {\n recentTimestamps.shift()\n }\n if (recentTimestamps.length >= this.maxMessagesPerSecond) {\n logger.warn({ clientId }, 'ws client rate limit exceeded, closing')\n ws.close(1008, 'rate limit exceeded')\n return\n }\n recentTimestamps.push(now)\n\n try {\n const parsed = JSON.parse(raw.toString()) as unknown\n const message = this.normalizeClientMessage(parsed)\n if (!message) {\n logger.warn({ clientId }, 'invalid message')\n return\n }\n\n if (this.handleSystemClientMessage(clientId, message)) {\n return\n }\n\n this.emit('message', clientId, message)\n } catch {\n logger.warn({ clientId }, 'invalid message')\n }\n })\n\n ws.on('close', () => {\n this.clients.delete(clientId)\n\n for (const [, subscribers] of this.sessionSubscriptions) {\n subscribers.delete(clientId)\n }\n // RFC-335 S4:client 断连时供上层(InboundRouter 的 write-lease manager)释放锁/锁\n this.onClientDisconnected?.(clientId)\n\n logger.debug({ clientId }, 'client disconnected')\n })\n\n ws.on('error', (err) => {\n logger.warn({ clientId, err: err.message }, 'client error')\n })\n }\n\n private handleSystemClientMessage(clientId: string, message: WebSocketClientMessage): boolean {\n switch (message.type) {\n case 'Runtime.ping':\n this.handleRuntimePing(clientId)\n return true\n default:\n return false\n }\n }\n\n private handleRuntimePing(clientId: string): void {\n this.sendToClient(clientId, {\n type: 'Runtime.pong',\n data: { timestamp: Date.now() },\n })\n }\n\n private normalizeClientMessage(raw: unknown): WebSocketClientMessage | null {\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n return null\n }\n\n const value = raw as Record<string, unknown>\n\n if (typeof value.method === 'string') {\n const method = value.method\n const data = this.asRecord(value.params)\n\n if (typeof value.id === 'number') {\n if (data.seq === undefined) {\n data.seq = value.id\n }\n if (data.requestId === undefined) {\n data.requestId = value.id\n }\n }\n\n return {\n type: method as WebSocketClientMessage['type'],\n data,\n }\n }\n\n return null\n }\n\n private asRecord(value: unknown): Record<string, unknown> {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n return value as Record<string, unknown>\n }\n\n return {}\n }\n}\n","/**\n * session-event-wire.ts — AgentSessionEvent → 中性 SessionEvent(session-contract 单一投影)\n * → WS 线消息 `Session.event`。\n *\n * 分层职责:\n * - **投影**归 @x-otto/session-contract `projectSessionEvent`(cli/tui/web 共享,单一真源)。\n * - **脱敏**归本线边界:投影器忠实带真实 error.message(cli/tui 本地消费需要全文),但跨网络下发\n * 前必须抹掉(可能含 auth.json 路径 / secret key)——安全不变量。\n *\n * 状态:投影器持集合累加器(delegated/todoList/turn),故 per-session 一份(EventBridge 持有)。\n */\nimport { createLogger } from '@x-otto/shared'\nimport {\n projectSessionEvent,\n createProjectorState,\n type ProjectorState,\n type SessionEvent,\n} from '@x-otto/session-contract'\nimport type { AgentSessionEvent } from '@x-otto/agent'\nimport type { WebSocketMessage } from './types'\n\nconst logger = createLogger('@x-otto/service:session-event-wire')\n\nexport { createProjectorState, type ProjectorState }\n\n/** 投影 + 脱敏 + 包装为 WS `Session.event`。projector 为调用方持有的 per-session 累加器。 */\nexport function encodeSessionEvent(\n event: AgentSessionEvent,\n projector: ProjectorState,\n): WebSocketMessage[] {\n const projected = projectSessionEvent(event, projector)\n return projected.map((se) => ({ type: 'Session.event', data: sanitize(se) }))\n}\n\n/** error 事件的真实 message 在线边界抹为通用文案(保 code 供前端区分),其余事件原样透传。\n * 真实细节落服务端日志(ops 可见),绝不上 wire。 */\nfunction sanitize(se: SessionEvent): SessionEvent {\n if (se.kind === 'error') {\n logger.error({ sessionId: se.sessionId, code: se.code, message: se.message }, 'session error')\n return {\n ...se,\n message: se.code === 'STREAM_ERROR' ? 'stream error' : 'session error',\n }\n }\n return se\n}\n","import { encodeSessionEvent, createProjectorState, type ProjectorState } from './session-event-wire'\nimport type { IMessageSender } from './types'\nimport type { AgentSession, ServiceHostPort } from '@x-otto/coding'\nimport { shouldShowPulseSurvey, type PulseSurveyTriggerState } from '@x-otto/session-contract'\n\nexport class EventBridge {\n private unsubscribeSession?: () => void\n /** per-session 投影累加器(delegated/todoList/turn)。 */\n private projector: ProjectorState = createProjectorState()\n /**\n * RFC-209 §2.5:满意度脉冲调查触发状态(进程内存态,per-session,不持久化跨会话——\n * 同 CLI 侧 `interactive-events.ts` 的 `pulseSurveyTriggerState` 语义,各自独立维护\n * 互不干扰:TUI 与 web-ui 是两个并发客户端,各自的展示节奏不应互相耦合)。\n */\n private pulseSurveyState: PulseSurveyTriggerState = {}\n\n constructor(\n private readonly session: AgentSession,\n private readonly sender: IMessageSender,\n /**\n * 可选——供 `pulse-survey.show` 触发判定读取 `mars.getPulseSurveyConfig()`\n * 与 `mars.isFeedbackAvailable()`。测试/未来其他消费方可不传(该判定分支静默跳过)。\n */\n private readonly app?: ServiceHostPort,\n ) {}\n\n attach(): void {\n this.unsubscribeSession = this.session.subscribe((event) => {\n const messages = encodeSessionEvent(event, this.projector)\n for (const msg of messages) {\n this.sender.sendToSession(event.sessionId, msg)\n }\n if (event.type === 'prompt.end') {\n this.maybeSendPulseSurvey(event.sessionId)\n }\n if (event.type === 'tool.call.end') {\n void this.maybeSendA2uiRendererPayload(event.sessionId, event)\n }\n })\n }\n\n /**\n * RFC-210 D5(M4):`tool.call.end` 之后的旁路编排(同 maybeSendPulseSurvey 模式,\n * 不进 encodeSessionEvent 纯投影)——对该工具调用的结果消息跑插件 `a2ui.renderer`\n * toPayload,命中则追加 `a2ui.payload` 事件下发。web-ui 经 React catalog 渲染(M5)。\n * fail-soft:无 mars / 无插件命中 / toPayload 全部失败 → 静默跳过(默认渲染兜底)。\n * async fire-and-forget:toPayload 有 2s 超时(ui-renderer-loader),不阻塞事件主流。\n */\n private async maybeSendA2uiRendererPayload(\n sessionId: string,\n event: { toolCall: { id: string; name: string }; resultText?: string; details?: Record<string, unknown> },\n ): Promise<void> {\n if (!this.app) return\n try {\n // 构造与 TUI 渲染分发同构的消息形状(matcher 维度 role/toolName/contentType)。\n // 携带 details 字段(修复 P0-B1:此前事件只带 resultText 预览,a2ui 渲染器\n // toPayload 读 m?.details 永远为 null,跨端渲染完全失效)。\n const message = {\n role: 'tool_result',\n name: event.toolCall.name,\n toolCallId: event.toolCall.id,\n content: [{ type: 'text', text: event.resultText ?? '' }],\n details: event.details,\n }\n const components = await this.app.resolveA2uiRendererPayload(message)\n if (!components || components.length === 0) return\n this.sender.sendToSession(sessionId, {\n type: 'Session.event',\n data: { sessionId, kind: 'a2ui.payload', forToolCallId: event.toolCall.id, components },\n })\n } catch {\n // fail-soft:payload 管线绝不影响会话事件主流\n }\n }\n\n /**\n * RFC-209 §2.5:`prompt.end` 之后的旁路编排——不是 `encodeSessionEvent` 投影产出的分支\n * (该函数保持纯投影职责不变),而是本类在收到投影消息之后**额外**追加的判定+发送。\n * Feedback 插件未装载时 `isFeedbackAvailable()` 为 false,静默跳过(fail-soft,同 §2.6)。\n * web-ui 无 TUI 的 forced-upgrade Band A 硬模态概念,`forcedUpgradeActive` 恒 false。\n */\n private maybeSendPulseSurvey(sessionId: string): void {\n if (!this.app || !this.app.isFeedbackAvailable()) return\n const cfg = this.app.getPulseSurveyConfig()\n const shouldShow = shouldShowPulseSurvey(\n this.projector.currentTurn,\n {\n enabled: cfg?.enabled ?? true,\n probability: cfg?.probability ?? 0.05,\n minTurnGap: cfg?.min_turn_gap ?? 20,\n forcedUpgradeActive: false,\n },\n this.pulseSurveyState,\n )\n if (!shouldShow) return\n this.pulseSurveyState.lastShownTurn = this.projector.currentTurn\n this.sender.sendToSession(sessionId, { type: 'Session.event', data: { sessionId, kind: 'pulse-survey.show' } })\n }\n\n detach(): void {\n this.unsubscribeSession?.()\n this.unsubscribeSession = undefined\n }\n}\n","import { createLogger } from '@x-otto/shared'\nimport type { TraceEvent } from '@x-otto/agent'\nimport type { AppendLog } from '@x-otto/persistence'\nimport type { IMessageSender } from './types'\n\nconst logger = createLogger('@x-otto/service:trace-bridge')\n\nexport class TraceBridge {\n private iterator?: AsyncIterator<{ seq: number; entry: TraceEvent }>\n private stopped = false\n\n constructor(\n private readonly sessionId: string,\n private readonly traceStore: AppendLog<TraceEvent>,\n private readonly sender: IMessageSender,\n ) {}\n\n attach(): void {\n if (this.iterator) {\n return\n }\n this.stopped = false\n this.iterator = this.traceStore.tail(this.sessionId)[Symbol.asyncIterator]()\n void this.pump()\n }\n\n private async pump(): Promise<void> {\n const it = this.iterator\n if (!it) {\n return\n }\n try {\n while (!this.stopped) {\n const { value, done } = await it.next()\n if (done || this.stopped || !value) {\n break\n }\n this.sender.sendToSubscribers(this.sessionId, {\n type: 'Trace.event',\n data: { sessionId: this.sessionId, seq: value.seq, event: value.entry },\n })\n }\n } catch (err) {\n logger.warn(\n { sessionId: this.sessionId, err: err instanceof Error ? err.message : String(err) },\n 'trace tail terminated',\n )\n }\n }\n\n detach(): void {\n this.stopped = true\n void this.iterator?.return?.()\n this.iterator = undefined\n }\n}\n","import type { WebSocketMessage } from './types'\n\nexport function routeDebugEvent(event: Record<string, unknown>): WebSocketMessage[] {\n switch (event.type) {\n case 'Debugger.paused':\n return [\n {\n type: 'Debugger.paused',\n data: {\n reason: 'breakpoint',\n pauseId: event.pauseId as string,\n point: (event.snapshot as Record<string, unknown>)?.point,\n snapshot: event.snapshot as Record<string, unknown>,\n timestamp: new Date().toISOString(),\n },\n },\n ]\n\n case 'Debugger.resumed':\n return [\n {\n type: 'Debugger.resumed',\n data: {\n pauseId: event.pauseId as string,\n command: event.command,\n timestamp: new Date().toISOString(),\n },\n },\n ]\n\n case 'Debugger.commandRejected':\n return [\n {\n type: 'Debugger.commandRejected',\n data: {\n code: event.code as string,\n pauseId: event.pauseId as string | undefined,\n command: event.command,\n timestamp: new Date().toISOString(),\n },\n },\n ]\n\n default:\n return []\n }\n}\n","import { createLogger, TypedEventEmitter } from '@x-otto/shared'\nimport { routeDebugEvent } from './debug-event-router'\nimport type { IMessageSender, LogEntryData } from './types'\nimport type { BreakpointPoint, Devtools } from '@x-otto/devtools'\nimport type { PauseResumePayload } from '@x-otto/devtools'\n\nconst logger = createLogger('@x-otto/service:debug-bridge')\n\nexport type LogEntry = LogEntryData\n\ninterface DebugBridgeEvents {\n 'Debugger.paused': (data: Record<string, unknown>) => void\n 'Debugger.resumed': (data: Record<string, unknown>) => void\n 'Debugger.commandRejected': (data: Record<string, unknown>) => void\n 'Log.entryAdded': (entry: LogEntryData) => void\n}\n\ninterface SendCommand {\n type: string\n seq: number\n depth?: number\n [extra: string]: unknown\n}\n\nexport class DebugBridge extends TypedEventEmitter<DebugBridgeEvents> {\n private logId = 0\n private attached = false\n private readonly unsubs: Array<() => void> = []\n private readonly logs: LogEntryData[] = []\n /**\n * RFC-222 D3:`pauseId → sessionId` 映射——`Debugger.paused` 事件携带完整\n * snapshot(`metadata.sessionId`),但 `Debugger.resumed`/`commandRejected`\n * 只携带 `pauseId`/`command`,不重复携带 snapshot。记录映射使后两者也能按\n * session 路由;`resumed` 触发后该 pauseId 已终结,随即清理避免无界增长。\n */\n private readonly pauseSessionMap = new Map<string, string>()\n\n constructor(\n private readonly devtools: Devtools,\n private readonly sender: IMessageSender,\n ) {\n super()\n }\n\n attach(): void {\n if (this.attached) {\n return\n }\n this.attached = true\n\n const controller = this.devtools.controller\n this.unsubs.push(\n controller.on('Debugger.paused', ({ pauseId, snapshot }) => {\n const sessionId = this.extractSessionId(snapshot)\n if (sessionId) {\n this.pauseSessionMap.set(pauseId, sessionId)\n }\n this.forwardDebugEvent({ type: 'Debugger.paused', pauseId, snapshot }, sessionId)\n }),\n controller.on('Debugger.resumed', ({ pauseId, command }) => {\n const sessionId = this.pauseSessionMap.get(pauseId)\n this.pauseSessionMap.delete(pauseId) // 该 pauseId 已终结,清理映射\n this.forwardDebugEvent({ type: 'Debugger.resumed', pauseId, command }, sessionId)\n }),\n controller.on('Debugger.commandRejected', (data) => {\n const pauseId = data.pauseId\n const sessionId = pauseId ? this.pauseSessionMap.get(pauseId) : undefined\n this.forwardDebugEvent({ type: 'Debugger.commandRejected', ...data }, sessionId)\n }),\n controller.on('Log.entryAdded', (message) => {\n // RFC-222 D3:Log.entryAdded 无 session 上下文(pino 全局日志管道),\n // 本次范围内维持 broadcast,不做按 session 路由(见 RFC-222 §4 D3 决策段)。\n this.handleLogMessage(message as Record<string, unknown>)\n }),\n )\n }\n\n detach(): void {\n for (const unsub of this.unsubs) {\n unsub()\n }\n this.unsubs.length = 0\n this.attached = false\n this.pauseSessionMap.clear()\n }\n\n /** snapshot.metadata.sessionId 提取(RFC-222 D3,缺省/非字符串时返回 undefined)。 */\n private extractSessionId(snapshot: unknown): string | undefined {\n const metadata = (snapshot as { metadata?: Record<string, unknown> } | undefined)?.metadata\n const sessionId = metadata?.sessionId\n return typeof sessionId === 'string' && sessionId ? sessionId : undefined\n }\n\n /** 进程内直连:attach 即可达(旧语义=worker WS socket 打开)。REST 端点据此判断可送达。 */\n get isConnected(): boolean {\n return this.attached\n }\n\n send(command: SendCommand, payload?: PauseResumePayload): void {\n if (command.type === 'setBreakpoint') {\n const point = command.point as BreakpointPoint | undefined\n if (point) {\n this.devtools.debugger.setBreakpoint(point, command.enabled !== false)\n } else {\n logger.warn('setBreakpoint command missing point, dropped')\n }\n return\n }\n\n if (command.type === 'setBreakpointsActive') {\n if (command.active === false) {\n this.devtools.debugger.disableAllBreakpoints()\n } else {\n this.devtools.debugger.enableAllBreakpoints()\n }\n return\n }\n\n const pauseId = typeof command.pauseId === 'string' ? command.pauseId : undefined\n this.devtools.controller.resume(command, payload, pauseId)\n }\n\n getLogs(): LogEntryData[] {\n return [...this.logs]\n }\n\n /**\n * RFC-222 D3:`sessionId` 已知时定向路由到该 session 的订阅者(`sendToSession`),\n * 避免调试事件跨 session 泄漏;`sessionId` 未知(如 snapshot 未携带 metadata.sessionId\n * 的历史/边缘调用点)时降级为 `broadcast`,不强行拆分导致事件丢失可见性。\n */\n private forwardDebugEvent(event: Record<string, unknown>, sessionId?: string): void {\n const messages = routeDebugEvent(event)\n for (const msg of messages) {\n if (sessionId) {\n this.sender.sendToSession(sessionId, msg)\n } else {\n this.sender.broadcast(msg)\n }\n }\n }\n\n private handleLogMessage(event: Record<string, unknown>): void {\n if (typeof event.level !== 'undefined' || typeof event.msg === 'string') {\n const rawTime = event.time\n const timestamp =\n typeof rawTime === 'number'\n ? new Date(rawTime).toISOString()\n : typeof rawTime === 'string'\n ? rawTime\n : new Date().toISOString()\n\n const entry: LogEntryData = {\n id: ++this.logId,\n timestamp,\n level: this.normalizeLevel(event.level),\n module: (event.name as string) ?? 'unknown',\n message: (event.msg as string) ?? JSON.stringify(event),\n data: event,\n }\n\n this.logs.push(entry)\n if (this.logs.length > 2000) {\n this.logs.splice(0, this.logs.length - 2000)\n }\n\n this.sender.broadcast({\n type: 'Log.entryAdded',\n data: { entry },\n })\n\n this.emit('Log.entryAdded', entry)\n }\n }\n\n private normalizeLevel(level: unknown): string {\n if (typeof level === 'string') {\n const l = level.toLowerCase()\n if (['trace', 'debug', 'info', 'warn', 'error', 'fatal'].includes(l)) {\n return l\n }\n }\n\n if (typeof level === 'number') {\n if (level <= 10) {\n return 'trace'\n }\n if (level <= 20) {\n return 'debug'\n }\n if (level <= 30) {\n return 'info'\n }\n if (level <= 40) {\n return 'warn'\n }\n if (level <= 50) {\n return 'error'\n }\n return 'fatal'\n }\n\n return 'info'\n }\n}\n","/**\n * RFC-335 S4 协议面:写租约管理器(write lease)。\n *\n * 唯一写权语义(同一 session 至多 1 client 持有写权):\n * - acquire(idempotent by same clientId):同 clientId 重复 acquire 视为 no-op;\n * 另一 clientId 申请在 released 前 deny。\n * - release:仅持有者可 release;非持有者 release 视为 no-op(不报错——防下线风暴)。\n * - releaseAllForClient:该 client 断连重置——唯一强清理端点。\n *\n * 实现主调点是 inbound-router:WS 显式 verb 派单 acquire/release,\n * ws.onclose / server-shutdown 走 releaseAllForClient。无 timer、无心跳。\n * 死租约终态:kill -9 / 网络断 → 下一 attach 收到 denied,\n * receive 明确报错(deny reason 含另一 clientId), 下 a client 需\n * explicit `--force` 类 override(后续 PR)或人工冻结老 client。\n * 这是 RFC-335 §S4 第一期在我 5 明文「不扩服务新 timer/state machine」\n * 的最低必要面——deny-early反馈 &后面的 disconnect 释放点。\n */\n\nexport interface WriteLeaseManager {\n /** 申请 sessionId 的唯一写权。返回结果不抛错:denied/acquired 当事儿类型。 */\n acquire(sessionId: string, clientId: string): WriteLeaseAcquireResult\n /** 释放 sessionId 的写权。仅持有者可 release。返回是否真释放了(幂等)。 */\n release(sessionId: string, clientId: string): boolean\n /** 清理某个 client 名下的所有写租约(断连清理点)。返回被释放的 sessionId 列表。 */\n releaseAllForClient(clientId: string): string[]\n /** ownerOf:debug/UI 需要现处 leaseOwner。 */\n ownerOf(sessionId: string): string | undefined\n /** canClientWrite(sessionId, clientId):Chat.query/Chat.* 的前置校验。 */\n canClientWrite(sessionId: string, clientId: string): boolean\n /**\n * RFC-335 S4 补丁:force_acquire——强抢走 sessionId 的写权(不论原持有者问同)。\n * 用于 kill -9 后原来 client 占着 lease 没释放的人工接管场景。\n * 返回原 owner(若有)及新 owner 状态。\n * **审计语义**:调用方负责把本 action 记为「显式人工 force」——非普通共享;\n * 原 owner 后续才需改为「写权被剥夺」。\n */\n forceAcquire(sessionId: string, clientId: string): {\n previousOwner: string | undefined\n newOwner: string\n }\n}\n\nexport type WriteLeaseAcquireResult =\n | { kind: 'acquired' }\n | { kind: 'denied'; /** 强 owner clientId——拒绝反馈调用方需呈现 owner */ leaseOwner: string }\n\nexport function createWriteLeaseManager(): WriteLeaseManager {\n /** sessionId → ownerClientId */\n const owners = new Map<string, string>()\n\n return {\n acquire(sessionId, clientId) {\n const owner = owners.get(sessionId)\n // 已持有 / 无 owner → acquire(后者是干净路径;前者是 idempotent reconnect)\n if (owner === undefined || owner === clientId) {\n owners.set(sessionId, clientId)\n return { kind: 'acquired' }\n }\n return { kind: 'denied', leaseOwner: owner }\n },\n release(sessionId, clientId) {\n const owner = owners.get(sessionId)\n if (owner === undefined || owner !== clientId) return false\n owners.delete(sessionId)\n return true\n },\n releaseAllForClient(clientId) {\n const released: string[] = []\n for (const [sessionId, owner] of owners.entries()) {\n if (owner === clientId) {\n owners.delete(sessionId)\n released.push(sessionId)\n }\n }\n return released\n },\n ownerOf(sessionId) {\n return owners.get(sessionId)\n },\n canClientWrite(sessionId, clientId) {\n const owner = owners.get(sessionId)\n return owner === undefined || owner === clientId\n },\n forceAcquire(sessionId, clientId) {\n const previousOwner = owners.get(sessionId)\n owners.set(sessionId, clientId)\n return { previousOwner, newOwner: clientId }\n },\n }\n}\n","import { createLogger } from '@x-otto/shared'\nimport type { GrillAnswer } from '@x-otto/agent'\nimport type { WebSocketManager } from './websocket-manager'\nimport type {\n WebSocketClientMessage,\n ChatQueryData,\n ChatApprovalData,\n ChatAskUserResponseData,\n ChatPlanApprovalResponseData,\n SessionSubscribeData,\n DebuggerCommandData,\n DebuggerSetBreakpointData,\n DebuggerSetBreakpointsActiveData,\n} from './types'\nimport type { DebugBridge } from './debug-bridge'\nimport type { EventLogRead } from './session-event-log'\nimport type { ServiceHostPort } from '@x-otto/coding'\nimport type { PauseResumePayload } from '@x-otto/devtools'\nimport { createWriteLeaseManager, type WriteLeaseManager } from './write-lease-manager'\n\nconst logger = createLogger('@x-otto/service:inbound-router')\n\nfunction extractString(data: Record<string, unknown>, key: string): string | undefined {\n const v = data[key]\n return typeof v === 'string' ? v : undefined\n}\n\nfunction extractBoolean(data: Record<string, unknown>, key: string): boolean | undefined {\n const v = data[key]\n return typeof v === 'boolean' ? v : undefined\n}\n\nfunction extractNumber(data: Record<string, unknown>, key: string): number | undefined {\n const v = data[key]\n return typeof v === 'number' ? v : undefined\n}\n\nfunction extractRecord(\n data: Record<string, unknown>,\n key: string,\n): Record<string, unknown> | undefined {\n const v = data[key]\n return v !== null && typeof v === 'object' && !Array.isArray(v)\n ? (v as Record<string, unknown>)\n : undefined\n}\n\n/** 校验 answers 必填字段后再构造 GrillAnswer——畸形对象不得 as-cast 直达引擎 HITL。 */\nfunction parseGrillAnswer(data: Record<string, unknown>): GrillAnswer | null {\n const rec = extractRecord(data, 'answers')\n if (!rec) return null\n const answer = extractString(rec, 'answer')\n if (answer === undefined) return null\n return {\n answer,\n acceptedRecommendation: rec.acceptedRecommendation === true,\n resolvedBy: rec.resolvedBy === 'auto_recommendation' ? 'auto_recommendation' : 'human',\n selectedOptionLabels: Array.isArray(rec.selectedOptionLabels)\n ? rec.selectedOptionLabels.filter((x): x is string => typeof x === 'string')\n : undefined,\n freeformText: extractString(rec, 'freeformText'),\n }\n}\n\nfunction parseChatQuery(data: Record<string, unknown>): ChatQueryData | null {\n const message = extractString(data, 'message')\n if (!message) {\n return null\n }\n return { message, sessionId: extractString(data, 'sessionId') }\n}\n\nfunction parseChatApproval(data: Record<string, unknown>): ChatApprovalData | null {\n const approvalId = extractString(data, 'approvalId')\n const approved = extractBoolean(data, 'approved')\n if (!approvalId || approved === undefined) {\n return null\n }\n return { approvalId, approved, sessionId: extractString(data, 'sessionId') }\n}\n\nfunction parseChatAskUserResponse(data: Record<string, unknown>): ChatAskUserResponseData | null {\n const requestId = extractString(data, 'requestId')\n if (!requestId) {\n return null\n }\n const cancelled = data.cancelled === true\n const answers = cancelled ? null : parseGrillAnswer(data)\n return { requestId, answers, cancelled, sessionId: extractString(data, 'sessionId') }\n}\n\nfunction parseChatPlanApprovalResponse(\n data: Record<string, unknown>,\n): ChatPlanApprovalResponseData | null {\n const requestId = extractString(data, 'requestId')\n const action = extractString(data, 'action')\n if (!requestId || !action) {\n return null\n }\n return {\n requestId,\n action,\n feedback: extractString(data, 'feedback'),\n sessionId: extractString(data, 'sessionId'),\n }\n}\n\nfunction parseSessionSubscribe(data: Record<string, unknown>): SessionSubscribeData | null {\n const sessionId = extractString(data, 'sessionId')\n if (!sessionId) {\n return null\n }\n // RFC-335 M3:`since` = 客户端持有的事件游标(通常取自 snapshot.cursor)。\n // 缺省表示\"只要实时流\",与旧客户端行为一致(向后兼容)。\n const since = extractNumber(data, 'since')\n return since === undefined ? { sessionId } : { sessionId, since }\n}\n\nfunction parseDebuggerCommand(data: Record<string, unknown>): DebuggerCommandData {\n return {\n seq: extractNumber(data, 'seq'),\n pauseId: extractString(data, 'pauseId'),\n depth: extractNumber(data, 'depth'),\n }\n}\n\nfunction parseDebuggerSetBreakpoint(\n data: Record<string, unknown>,\n): DebuggerSetBreakpointData | null {\n const point = extractString(data, 'point')\n const enabled = extractBoolean(data, 'enabled')\n if (point === undefined || enabled === undefined) {\n return null\n }\n return { point, enabled }\n}\n\nfunction parseDebuggerSetBreakpointsActive(\n data: Record<string, unknown>,\n): DebuggerSetBreakpointsActiveData | null {\n const active = extractBoolean(data, 'active')\n if (active === undefined) {\n return null\n }\n return { active }\n}\n\nexport class InboundRouter {\n /** RFC-335 S4 协议面:session 写租约 per-session 单持有者裁决。仅由 dispatch 路径 mutation。 */\n private readonly writeLease: WriteLeaseManager = createWriteLeaseManager()\n\n constructor(\n private readonly ws: WebSocketManager,\n private readonly app: ServiceHostPort,\n private readonly bridge: DebugBridge | null,\n /**\n * RFC-335 M3:按 cursor 读取待补发事件。以回调注入而非直接依赖 CodingService,\n * 避免 router ↔ service 循环依赖(CodingService 已持有 router)。\n * 未注入时 `since` 参数被忽略,退化为纯实时订阅(旧行为)。\n */\n private readonly readEventsSince?: (sessionId: string, after: number) => EventLogRead,\n ) {\n // RFC-335 S4:client 断连唯一打通点——释放它名下的写租约\n this.ws.onClientDisconnected = (clientId) => {\n const released = this.writeLease.releaseAllForClient(clientId)\n if (released.length > 0) {\n logger.debug({ clientId, released }, 'write-lease released on disconnect')\n }\n }\n }\n\n dispatch(clientId: string, message: WebSocketClientMessage): void {\n const { type, data } = message\n\n logger.debug({ clientId, type }, 'message from client')\n\n switch (type) {\n case 'Session.subscribe': {\n const parsed = parseSessionSubscribe(data)\n if (parsed) {\n // 顺序不可颠倒:**先订阅再补发**。若先补发再订阅,两者之间产生的事件\n // 仍会丢失——那正是本里程碑要根除的缺口。先订阅可能导致个别事件既被\n // 实时推送又被补发,客户端按 seq 幂等去重即可(重复可恢复,遗漏不可)。\n this.ws.subscribeClient(clientId, parsed.sessionId)\n if (parsed.since !== undefined) {\n this.replaySince(clientId, parsed.sessionId, parsed.since)\n }\n }\n break\n }\n\n case 'Session.unsubscribe': {\n const parsed = parseSessionSubscribe(data)\n if (parsed) {\n this.ws.unsubscribeClient(clientId, parsed.sessionId)\n }\n break\n }\n\n case 'Session.writeLease.acquire': {\n const parsed = parseSessionSubscribe(data)\n if (!parsed || !parsed.sessionId) break\n const result = this.writeLease.acquire(parsed.sessionId, clientId)\n if (result.kind === 'acquired') {\n this.ws.sendToClient(clientId, {\n type: 'Runtime.writeLease',\n data: {\n sessionId: parsed.sessionId,\n state: 'acquired',\n leaseOwner: clientId,\n },\n })\n } else {\n this.ws.sendToClient(clientId, {\n type: 'Runtime.writeLease',\n data: {\n sessionId: parsed.sessionId,\n state: 'denied',\n reason: 'lease held by another client',\n leaseOwner: result.leaseOwner,\n },\n })\n }\n break\n }\n\n case 'Session.writeLease.release': {\n const parsed = parseSessionSubscribe(data)\n if (!parsed || !parsed.sessionId) break\n const released = this.writeLease.release(parsed.sessionId, clientId)\n this.ws.sendToClient(clientId, {\n type: 'Runtime.writeLease',\n data: {\n sessionId: parsed.sessionId,\n state: released ? 'released' : 'not-held',\n leaseOwner: released ? undefined : this.writeLease.ownerOf(parsed.sessionId),\n },\n })\n break\n }\n\n /**\n * RFC-335 S4 补丁:force_acquire——显式人工强抢写权(kill -9 stuck lease 唯一正式\n * 解锁口)。原 owner 若仍旧订阅,必须收到「写权被剥夺」通知——不允许静默剥夺。\n * 审计:logger.warn 带 clientId/sessionId/previousOwner/newOwner 字段。\n */\n case 'Session.writeLease.force_acquire': {\n const parsed = parseSessionSubscribe(data)\n if (!parsed || !parsed.sessionId) break\n const r = this.writeLease.forceAcquire(parsed.sessionId, clientId)\n // 审计——force 是高权动作(非 routine acquire)\n logger.warn(\n {\n sessionId: parsed.sessionId,\n newOwner: clientId,\n previousOwner: r.previousOwner,\n },\n 'write-lease force-acquired',\n )\n // 原 owner(若不同人)收「写权被剥夺」定向通知(RFC-222 D2 同型)\n if (r.previousOwner && r.previousOwner !== clientId) {\n this.ws.sendToClient(r.previousOwner, {\n type: 'Runtime.writeLease',\n data: {\n sessionId: parsed.sessionId,\n state: 'released',\n reason: 'forced_by_other_client',\n leaseOwner: r.newOwner,\n },\n })\n }\n // 新 owner 收 acquired\n this.ws.sendToClient(clientId, {\n type: 'Runtime.writeLease',\n data: {\n sessionId: parsed.sessionId,\n state: 'acquired',\n leaseOwner: r.newOwner,\n },\n })\n break\n }\n\n case 'Chat.query': {\n const parsed = parseChatQuery(data)\n if (parsed) {\n // RFC-335 S4:写租约前置校验——另一 client 持有 → 当 null 处理,返回\n // Runtime.error 定向给发送者(RFC-222 D2 同型——不广播、不静默)。\n const sid = parsed.sessionId\n if (sid && !this.writeLease.canClientWrite(sid, clientId)) {\n const owner = this.writeLease.ownerOf(sid)\n logger.info({ sessionId: sid, clientId, leaseOwner: owner }, 'Chat.query denied by write-lease')\n this.ws.sendToClient(clientId, {\n type: 'Runtime.error',\n data: {\n sessionId: sid,\n code: 'WRITE_LEASE_DENIED',\n message: 'chat query denied — write-lease held by another client',\n leaseOwner: owner,\n },\n })\n break\n }\n this.handleQuery(clientId, parsed)\n }\n break\n }\n\n case 'Chat.approval': {\n const parsed = parseChatApproval(data)\n if (parsed) {\n this.handleApproval(parsed)\n }\n break\n }\n\n case 'Chat.askUserResponse': {\n const parsed = parseChatAskUserResponse(data)\n if (parsed) {\n this.handleAskUserResponse(parsed)\n }\n break\n }\n\n case 'Chat.planApprovalResponse': {\n const parsed = parseChatPlanApprovalResponse(data)\n if (parsed) {\n this.handlePlanApprovalResponse(parsed)\n }\n break\n }\n\n case 'Debugger.resume':\n case 'Debugger.stepOver':\n case 'Debugger.stepInto':\n case 'Debugger.disable':\n this.handleDebugCommand(type, parseDebuggerCommand(data), data)\n break\n\n case 'Debugger.setBreakpoint': {\n const parsed = parseDebuggerSetBreakpoint(data)\n if (parsed) {\n this.handleDebugSetBreakpoint(parsed)\n }\n break\n }\n\n case 'Debugger.setBreakpointsActive': {\n const parsed = parseDebuggerSetBreakpointsActive(data)\n if (parsed) {\n this.handleDebugSetBreakpointsActive(parsed)\n }\n break\n }\n\n default:\n logger.debug({ type }, 'unknown client message type')\n }\n }\n\n /**\n * RFC-335 M3:补发 `after` 之后的事件,衔接 snapshot 与实时流。\n *\n * 缺口(cursor 已被环形缓冲逐出)时**必须**显式告知客户端重新水合,绝不静默补发\n * \"能补的那部分\"——那会让客户端以为序列完整,实则中间缺一段且永远无法察觉。\n */\n private replaySince(clientId: string, sessionId: string, after: number): void {\n if (!this.readEventsSince) {\n return\n }\n const result = this.readEventsSince(sessionId, after)\n if (!result.ok) {\n logger.warn({ sessionId, after, oldest: result.oldestAvailable }, 'event log gap; client must resync')\n this.ws.sendToClient(clientId, {\n type: 'Runtime.error',\n data: {\n sessionId,\n message: 'event history gap — re-fetch the session snapshot',\n code: 'EVENT_LOG_GAP',\n },\n })\n return\n }\n for (const event of result.events) {\n const sequenced = event.message.type === 'Session.event'\n ? { ...event.message, data: { ...event.message.data, seq: event.seq } }\n : event.message\n this.ws.sendToClient(clientId, sequenced)\n }\n }\n\n private resolveSession(sessionId?: string) {\n return sessionId ? this.app.getSession(sessionId) : this.app.getActiveSession()\n }\n\n /**\n * RFC-222 D2:prompt 被拒绝(如并发 isBusy 守卫)时的错误必须**定向**发给触发本次\n * 请求的客户端(`sendToClient`),不得广播给该 session 的全部订阅者(`sendToSession`)\n * ——多端场景下正在正常执行中的其他客户端不应收到与自己无关的 \"prompt failed\"。\n */\n private handleQuery(clientId: string, { message, sessionId }: ChatQueryData): void {\n const session = this.resolveSession(sessionId)\n if (!session) {\n return\n }\n\n session.prompt(message).catch((err: Error) => {\n logger.error({ sessionId: session.id, err }, 'prompt failed')\n this.ws.sendToClient(clientId, {\n type: 'Runtime.error',\n data: { sessionId: session.id, message: 'prompt failed', code: 'PROMPT_FAILED' },\n })\n })\n }\n\n private handleApproval({ approvalId, approved, sessionId }: ChatApprovalData): void {\n const session = this.resolveSession(sessionId)\n if (!session) {\n return\n }\n\n session.resolveApproval(approvalId, approved)\n logger.debug({ sessionId: session.id, approved }, 'approval resolved')\n }\n\n private handleAskUserResponse({ requestId, answers, sessionId }: ChatAskUserResponseData): void {\n const session = this.resolveSession(sessionId)\n if (!session) {\n return\n }\n\n session.resolveAskUser(requestId, answers)\n logger.debug({ sessionId: session.id, requestId }, 'ask_user resolved')\n }\n\n private handlePlanApprovalResponse({\n requestId,\n action,\n feedback,\n sessionId,\n }: ChatPlanApprovalResponseData): void {\n const session = this.resolveSession(sessionId)\n if (!session) {\n return\n }\n\n session.resolvePlanApproval(requestId, action, feedback)\n logger.debug({ sessionId: session.id, action, requestId }, 'plan approval resolved')\n }\n\n private handleDebugCommand(\n method: string,\n { seq, pauseId, depth }: DebuggerCommandData,\n rawData: Record<string, unknown>,\n ): void {\n if (!this.bridge) {\n return\n }\n\n const payload = extractRecord(rawData, 'payload') as PauseResumePayload | undefined\n\n this.bridge.send(\n {\n type: method,\n seq: seq ?? Date.now(),\n ...(pauseId !== undefined ? { pauseId } : {}),\n ...(depth !== undefined ? { depth } : {}),\n },\n payload,\n )\n }\n\n private handleDebugSetBreakpoint({ point, enabled }: DebuggerSetBreakpointData): void {\n if (!this.bridge) {\n return\n }\n this.bridge.send({ type: 'setBreakpoint', seq: Date.now(), point, enabled })\n }\n\n private handleDebugSetBreakpointsActive({ active }: DebuggerSetBreakpointsActiveData): void {\n if (!this.bridge) {\n return\n }\n this.bridge.send({ type: 'setBreakpointsActive', seq: Date.now(), active })\n }\n}\n","import { timingSafeEqual } from 'node:crypto'\nimport type { Context } from 'hono'\n\nexport function tokenMatches(provided: string, expected: string): boolean {\n const providedBuffer = Buffer.from(provided)\n const expectedBuffer = Buffer.from(expected)\n if (providedBuffer.length !== expectedBuffer.length) {\n return false\n }\n return timingSafeEqual(providedBuffer, expectedBuffer)\n}\n\nexport function bearerToken(c: Context): string {\n const match = /^Bearer\\s+(.+)$/i.exec(c.req.header('authorization') ?? '')\n return match?.[1] ?? ''\n}\n\n","import { Hono } from 'hono'\nimport type { CodingService } from '../coding-service'\n\nexport function createHealthRoute(context: CodingService): Hono {\n const app = new Hono()\n\n app.get('/', (c) => {\n const storageHost = context.app.storage.storageHost\n return c.json({\n status: 'ok',\n service: 'otto-coding',\n uptime: process.uptime(),\n namespaces: storageHost?.host ? storageHost.host.listNamespaces() : null,\n })\n })\n\n return app\n}\n\n","import { Hono } from 'hono'\nimport type { CodingService } from '../coding-service'\n\n/**\n * RFC-335 M1:Session Authority 身份端点。\n *\n * 用途:客户端(TUI service client / Web UI / daemon 生命周期壳)据此识别\"我连上的是\n * 哪一个 Authority 实例\"——实例重启后 `instanceId` 必变,客户端可据此判定需要重新水合,\n * 而不是把陈旧订阅当作仍然有效。\n *\n * 安全姿态:**不进 `AUTH_PUBLIC_BASES` 豁免名单**——descriptor 含 `workspaceDir`(路径信息),\n * 故随其余 `/api/*` 一起走默认拒绝的 Bearer 鉴权。它不是 token、不授予任何能力,\n * 但也不该对未鉴权访问者暴露。\n */\nexport function createAuthorityRoute(context: CodingService): Hono {\n const app = new Hono()\n\n app.get('/', (c) => {\n return c.json(context.getAuthorityDescriptor())\n })\n\n return app\n}\n","import type { AgentSession } from '@x-otto/coding'\nimport type { AgentMessage } from '@x-otto/agent'\nimport type { TextContent, ToolCall } from '@x-otto/ai'\n\nexport interface SerializedToolCall {\n id: string\n name: string\n parameters: Record<string, unknown>\n}\n\nexport interface SerializedMessage {\n role: string\n content: string\n timestamp: number | undefined\n toolCalls: SerializedToolCall[]\n /**\n * RFC-210 D5(M4,评审 A5 REST 水合缺口修复):消息 content 数组中的 a2ui block\n * 组件树透传(此前 extractContent 只取 text block,a2ui 数据在历史水合路径丢失)。\n * 无 a2ui block 时字段缺省(不占 wire 体积)。web-ui 水合层(message-hydration)按\n * 此字段渲染 React catalog(M5)。\n */\n a2ui?: unknown[][]\n}\n\nexport function serializeSessionMessages(session: AgentSession): SerializedMessage[] {\n const messages = session.session.messages() as AgentMessage[]\n return messages.map((msg) => {\n const a2uiBlocks = extractA2uiBlocks(msg)\n return {\n role: msg.role,\n content: extractTextContent(msg),\n timestamp: 'timestamp' in msg ? (msg.timestamp as number) : undefined,\n toolCalls: extractToolCalls(msg),\n ...(a2uiBlocks.length > 0 ? { a2ui: a2uiBlocks } : {}),\n }\n })\n}\n\n/** 提取 content 数组中全部 a2ui block 的组件树(每个 block 一棵树)。 */\nfunction extractA2uiBlocks(msg: AgentMessage): unknown[][] {\n if (!Array.isArray(msg.content)) return []\n return (msg.content as unknown as Array<Record<string, unknown>>)\n .filter((b) => b && typeof b === 'object' && b.type === 'a2ui' && Array.isArray(b.components))\n .map((b) => b.components as unknown[])\n}\n\nfunction extractTextContent(msg: AgentMessage): string {\n if (typeof msg.content === 'string') {\n return msg.content\n }\n if (Array.isArray(msg.content)) {\n return (msg.content as unknown[])\n .filter((b): b is TextContent => (b as TextContent).type === 'text')\n .map((b) => b.text)\n .join('')\n }\n return ''\n}\n\nfunction extractToolCalls(msg: AgentMessage): SerializedToolCall[] {\n if (!Array.isArray(msg.content)) {\n return []\n }\n return (msg.content as unknown[])\n .filter((b): b is ToolCall => (b as ToolCall).type === 'tool_call')\n .map((b) => ({\n id: b.id ?? '',\n name: b.name ?? '',\n parameters: b.arguments ?? {},\n }))\n}\n","import { Hono } from 'hono'\nimport { createLogger } from '@x-otto/shared'\nimport { serializeSessionMessages } from '../message-serializer'\nimport type { CodingService } from '../coding-service'\n\nconst logger = createLogger('@x-otto/service:chat')\n\nexport function createChatRoute(service: CodingService): Hono {\n const app = new Hono()\n\n app.post('/query', async (c) => {\n const body = await c.req\n .json<{ message: string; sessionId?: string }>()\n .catch(() => ({}) as { message?: string; sessionId?: string })\n const { message, sessionId } = body\n\n if (!message) {\n return c.json({ status: 'error', message: 'message is required' }, 400)\n }\n\n const session = sessionId ? service.getSession(sessionId) : service.getActiveSession()\n\n if (!session) {\n return c.json({ status: 'error', message: 'no active session' }, 404)\n }\n\n session.prompt(message).catch((err: Error) => {\n logger.error({ sessionId: session.id, err }, 'prompt failed')\n service.ws.sendToSession(session.id, {\n type: 'Runtime.error',\n data: { sessionId: session.id, message: 'prompt failed', code: 'PROMPT_FAILED' },\n })\n })\n\n return c.json({\n status: 'ok',\n message: 'prompt accepted',\n sessionId: session.id,\n })\n })\n\n app.get('/messages', (c) => {\n const session = service.getActiveSession()\n if (!session) {\n return c.json([])\n }\n return c.json(serializeSessionMessages(session))\n })\n\n app.post('/interrupt', (c) => {\n const session = service.getActiveSession()\n if (!session) {\n return c.json({ status: 'error', message: 'no active session' }, 404)\n }\n session.abort()\n return c.json({ status: 'ok', message: 'interrupted' })\n })\n\n app.delete('/clear', async (c) => {\n const session = service.getActiveSession()\n if (!session) {\n return c.json({ status: 'error', message: 'no active session' }, 404)\n }\n // B4:/clear 走 clearContext()(打 clear 边界 + 驱逐 L2 记忆 + publish session.cleared),\n // 不用 compact('',messages().length)——messages() 是完整转录,先前若已压缩则 count>分支长度,\n // in-memory guard 直接 return 整条 no-op 仍报 ok;且 compact 写的是压缩边界不是 clear 边界。\n await session.clearContext()\n return c.json({ status: 'ok', message: 'cleared' })\n })\n\n return app\n}\n\n","import { Hono } from 'hono'\nimport { existsSync, statSync, readdirSync, realpathSync } from 'node:fs'\nimport { resolve, dirname, join, relative, isAbsolute, sep } from 'node:path'\nimport type { CodingService } from '../coding-service'\n\nfunction isContained(root: string, target: string): boolean {\n const rel = relative(root, target)\n return rel === '' || (!rel.startsWith(`..${sep}`) && rel !== '..' && !isAbsolute(rel))\n}\n\nfunction confineToWorkspace(workspaceDir: string, targetPath: string): string | null {\n if (targetPath.startsWith('~')) {\n return null\n }\n const root = resolve(workspaceDir)\n const resolved = resolve(root, targetPath)\n if (!isContained(root, resolved)) {\n return null\n }\n\n if (existsSync(resolved)) {\n try {\n const real = realpathSync(resolved)\n const realRoot = realpathSync(root)\n if (!isContained(realRoot, real)) {\n return null\n }\n } catch {\n return null\n }\n }\n return resolved\n}\n\nexport function createWorkspaceRoute(context: CodingService): Hono {\n const app = new Hono()\n\n app.post('/verify-path', async (c) => {\n const body = await c.req.json<{ path?: string }>().catch(() => ({}) as { path?: string })\n const targetPath = body.path\n const workspaceDir = context.app.workspaceDir\n\n if (!targetPath) {\n return c.json({ exists: false, isDirectory: false, error: 'path is required' }, 400)\n }\n if (!workspaceDir) {\n return c.json({ exists: false, isDirectory: false, error: 'workspace not configured' }, 403)\n }\n\n const resolved = confineToWorkspace(workspaceDir, targetPath)\n if (!resolved) {\n return c.json({ exists: false, isDirectory: false, error: 'path is outside workspace' }, 403)\n }\n\n try {\n const stat = statSync(resolved)\n return c.json({\n exists: true,\n isDirectory: stat.isDirectory(),\n path: resolved,\n })\n } catch {\n return c.json({ exists: false, isDirectory: false, path: resolved })\n }\n })\n\n app.post('/browse-directory', async (c) => {\n const body = await c.req\n .json<{ path?: string; showHidden?: boolean }>()\n .catch(() => ({}) as { path?: string; showHidden?: boolean })\n const workspaceDir = context.app.workspaceDir\n const showHidden = body.showHidden ?? false\n\n if (!workspaceDir) {\n return c.json(\n { currentPath: null, parentPath: null, directories: [], error: 'workspace not configured' },\n 403,\n )\n }\n\n const root = resolve(workspaceDir)\n const resolved = confineToWorkspace(workspaceDir, body.path || root)\n if (!resolved) {\n return c.json(\n {\n currentPath: null,\n parentPath: null,\n directories: [],\n error: 'path is outside workspace',\n },\n 403,\n )\n }\n\n const parentPath = resolved === root ? root : dirname(resolved)\n\n if (!existsSync(resolved)) {\n return c.json({\n currentPath: resolved,\n parentPath,\n directories: [],\n error: 'path does not exist',\n })\n }\n\n try {\n const entries = readdirSync(resolved, { withFileTypes: true })\n const directories = entries\n .filter((e) => e.isDirectory())\n .filter((e) => showHidden || !e.name.startsWith('.'))\n .map((e) => ({ name: e.name, path: join(resolved, e.name) }))\n .sort((a, b) => a.name.localeCompare(b.name))\n\n return c.json({\n currentPath: resolved,\n parentPath,\n directories,\n error: null,\n })\n } catch {\n return c.json({\n currentPath: resolved,\n parentPath,\n directories: [],\n error: 'failed to read directory',\n })\n }\n })\n\n app.get('/files', (c) => {\n const query = c.req.query('query')\n try {\n const entries = readdirSync(context.app.workspaceDir, { withFileTypes: true })\n let files = entries.map((e) => ({\n path: join(context.app.workspaceDir, e.name),\n name: e.name,\n isFile: e.isFile(),\n }))\n if (query) {\n const q = query.toLowerCase()\n files = files.filter((f) => f.name.toLowerCase().includes(q))\n }\n return c.json({ files })\n } catch {\n return c.json({ files: [] })\n }\n })\n\n return app\n}\n","import { Hono } from 'hono'\nimport {\n isCheckpointForkParams,\n isCheckpointRestoreParams,\n isReplaySeekParams,\n isReplayStartParams,\n} from '@x-otto/devtools'\nimport { exportSessionTrace, otlpExporterFromEnv } from '@x-otto/otel'\nimport { createLogger } from '@x-otto/shared'\nimport { summarizeTrace, traceToSpans } from '@x-otto/agent'\nimport type { TraceEvent } from '@x-otto/agent'\nimport { traceEventsToTimeline } from '@x-otto/trace-view'\nimport type { CodingService } from '../coding-service'\n\nconst logger = createLogger('@x-otto/service:timetravel')\n\nfunction parseSeq(raw: string | undefined): number | undefined {\n if (raw === undefined) {\n return undefined\n }\n const n = Number(raw)\n return Number.isInteger(n) ? n : undefined\n}\n\nexport function createTimeTravelRoute(context: CodingService): Hono {\n const app = new Hono()\n const manager = () => context.app.sessionManager\n\n app.get('/:id/checkpoints', async (c) => {\n const list = await manager().listCheckpoints(c.req.param('id'))\n return c.json({ sessionId: c.req.param('id'), checkpoints: list })\n })\n\n app.post('/:id/checkpoints', async (c) => {\n const sessionId = c.req.param('id')\n const body = await c.req\n .json<{ label?: string; files?: string[] }>()\n .catch(() => ({}) as { label?: string; files?: string[] })\n try {\n const cp = await manager().createCheckpoint(sessionId, {\n label: body.label,\n files: body.files,\n })\n return c.json({ checkpoint: cp })\n } catch (error) {\n logger.error({ sessionId, err: error }, 'createCheckpoint failed')\n return c.json({ error: clientMessage(400) }, 400)\n }\n })\n\n app.post('/:id/checkpoints/:seq/restore', async (c) => {\n const sessionId = c.req.param('id')\n const seq = parseSeq(c.req.param('seq'))\n const body = await c.req\n .json<{ mode?: string; truncate?: boolean }>()\n .catch(() => ({}) as { mode?: string; truncate?: boolean })\n const params = { sessionId, seq, mode: body.mode, truncate: body.truncate }\n if (!isCheckpointRestoreParams(params)) {\n return c.json({ error: 'invalid Checkpoint.restore params (need seq:number, mode)' }, 400)\n }\n try {\n if (params.truncate) {\n await manager().rollbackToCheckpoint(params.sessionId, params.seq, params.mode)\n } else {\n await manager().restoreCheckpoint(params.sessionId, params.seq, params.mode)\n }\n return c.json({\n status: 'ok',\n sessionId,\n seq: params.seq,\n mode: params.mode,\n truncated: !!params.truncate,\n })\n } catch (error) {\n const status = notFoundStatus(error)\n logger.error({ sessionId, err: error }, 'checkpoint restore failed')\n return c.json({ error: clientMessage(status) }, status)\n }\n })\n\n app.post('/:id/checkpoints/:seq/fork', async (c) => {\n const sessionId = c.req.param('id')\n const seq = parseSeq(c.req.param('seq'))\n const body = await c.req.json<{ newId?: string }>().catch(() => ({}) as { newId?: string })\n const params = { sessionId, seq, newId: body.newId }\n if (!isCheckpointForkParams(params)) {\n return c.json({ error: 'invalid Checkpoint.fork params (need seq:number)' }, 400)\n }\n try {\n const forked = await manager().forkFromCheckpoint(params.sessionId, params.seq, params.newId)\n return c.json({\n status: 'ok',\n forkedSessionId: forked.id,\n sourceSessionId: sessionId,\n fromSeq: params.seq,\n })\n } catch (error) {\n const status = notFoundStatus(error)\n logger.error({ sessionId, err: error }, 'checkpoint fork failed')\n return c.json({ error: clientMessage(status) }, status)\n }\n })\n\n app.get('/:id/traceback', async (c) => {\n const sessionId = c.req.param('id')\n const params = { sessionId, seq: parseSeq(c.req.query('to')) }\n if (!isReplaySeekParams(params)) {\n return c.json(\n { error: 'query param \"to\" (trace seq) is required and must be an integer' },\n 400,\n )\n }\n const view = await manager().traceback(sessionId, params.seq)\n return c.json(view)\n })\n\n app.post('/:id/replay', async (c) => {\n const sessionId = c.req.param('id')\n const body = await c.req\n .json<{ to?: number; newId?: string }>()\n .catch(() => ({}) as { to?: number; newId?: string })\n const params = { sessionId, to: body.to }\n if (!isReplayStartParams(params)) {\n return c.json({ error: 'invalid Replay.start params' }, 400)\n }\n try {\n const replayed = await manager().replaySession(sessionId, body.newId)\n return c.json({ status: 'ok', replaySessionId: replayed.id, sourceSessionId: sessionId })\n } catch (error) {\n logger.error({ sessionId, err: error }, 'replay start failed')\n return c.json({ error: clientMessage(400) }, 400)\n }\n })\n\n app.get('/:id/trace/summary', async (c) => {\n const sessionId = c.req.param('id')\n try {\n const summary = await summarizeTrace(context.app.storage.traceStore.read(sessionId))\n return c.json({ sessionId, ...summary })\n } catch (error) {\n logger.error({ sessionId, err: error }, 'trace summary failed')\n return c.json({ error: clientMessage(400) }, 400)\n }\n })\n\n app.get('/:id/trace/spans', async (c) => {\n const sessionId = c.req.param('id')\n try {\n const spans = await traceToSpans(context.app.storage.traceStore.read(sessionId))\n return c.json({ sessionId, spans })\n } catch (error) {\n logger.error({ sessionId, err: error }, 'trace spans failed')\n return c.json({ error: clientMessage(400) }, 400)\n }\n })\n\n app.get('/:id/trace/timeline', async (c) => {\n const sessionId = c.req.param('id')\n try {\n const timeline = await traceEventsToTimeline(\n context.app.storage.traceStore.read(sessionId),\n )\n return c.json(timeline)\n } catch (error) {\n logger.error({ sessionId, err: error }, 'trace timeline failed')\n return c.json({ error: clientMessage(400) }, 400)\n }\n })\n\n app.post('/:id/otel-export', async (c) => {\n const exporter = otlpExporterFromEnv()\n if (!exporter) {\n return c.json(\n { error: 'OTel export not enabled (set OTEL_EXPORTER_OTLP_ENDPOINT to opt in)' },\n 503,\n )\n }\n const sessionId = c.req.param('id')\n const events: TraceEvent[] = []\n for await (const record of context.app.storage.traceStore.read(sessionId)) {\n events.push(record.entry)\n }\n const result = await exportSessionTrace(sessionId, events, exporter, {\n includeContent: c.req.query('includeContent') === 'true',\n })\n return c.json({ sessionId, exported: result }, result.ok ? 200 : 502)\n })\n\n return app\n}\n\nfunction message(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n\nfunction notFoundStatus(error: unknown): 400 | 404 {\n return /not found|unknown/i.test(message(error)) ? 404 : 400\n}\n\nfunction clientMessage(status: number): string {\n return status === 404 ? 'not found' : 'request failed'\n}\n","import { Hono } from 'hono'\nimport { serializeSessionMessages } from '../message-serializer'\nimport { createWorkspaceRoute } from './workspace'\nimport { createTimeTravelRoute } from './timetravel'\nimport type { CodingService } from '../coding-service'\n\nexport function createSessionsRoute(context: CodingService): Hono {\n const app = new Hono()\n\n app.get('/', (c) => {\n const sessions = context.app.listSessions()\n return c.json(\n sessions.map((s) => ({\n id: s.id,\n createdAt: s.createdAt.toISOString(),\n updatedAt: s.updatedAt?.toISOString(),\n messageCount: s.messageCount,\n workingDirectory: context.app.workspaceDir,\n // RFC-078 M133-02:读真源标题(listSessions 已经 resolveSessionTitle 回落链解析),\n // 不再退化为 model/id。\n title: s.title ?? s.id,\n status: s.status,\n })),\n )\n })\n\n app.post('/', async (c) => {\n await c.req.json<{ workingDirectory?: string }>().catch(() => ({}))\n const session = await context.app.createSession()\n return c.json({\n status: 'ok',\n message: 'session created',\n session: {\n id: session.id,\n workingDirectory: context.app.workspaceDir,\n createdAt: new Date().toISOString(),\n },\n })\n })\n\n app.get('/current', (c) => {\n const session = context.getActiveSession()\n if (!session) {\n return c.json({ status: 'error', message: 'no active session' }, 404)\n }\n return c.json({\n id: session.id,\n workingDirectory: context.app.workspaceDir,\n messageCount: session.session.messages().length,\n status: session.status,\n })\n })\n\n /**\n * RFC-331 M3(D4):`bridgeMode` 已删除——它恒为 `false` 且没有任何路径能让它变 true\n * (全仓零写入点、零客户端消费)。保留一个恒假的能力标志会让调用方以为存在\"bridge 模式\"\n * 这一运行形态并据此分支。本端点现在只回答它真正知道的事:当前 active session 是谁。\n */\n app.get('/bridge-info', (c) => {\n const session = context.getActiveSession()\n return c.json({\n sessionId: session?.id ?? null,\n })\n })\n\n app.get('/:id/messages', (c) => {\n const session = context.getSession(c.req.param('id'))\n if (!session) {\n return c.json([], 404)\n }\n return c.json(serializeSessionMessages(session))\n })\n\n /**\n * RFC-335 M1:只读水合快照(authority 身份 + session 投影 + 快照时刻)。\n *\n * 与 `/messages` 的区别:快照带 `authority.instanceId`/`protocolVersion`,使客户端能\n * 判定\"这份水合来自哪个 Authority 实例\",实例重启后可据此强制重新水合。\n *\n * **协议边界(不可粉饰)**:本端点与 WS `Session.subscribe` 之间**没有原子接续**——\n * 先取快照再订阅,两步之间产生的事件会丢。故它只是 M1 的水合契约,不是 daemon/TUI\n * client 的终局协议;带 cursor/sequence 的原子接续见 RFC-335 M3(T335-06)。\n *\n * 不回退 active session:id 不存在即 404(避免客户端误把别的会话当成目标会话)。\n */\n app.get('/:id/snapshot', (c) => {\n const snapshot = context.getSessionSnapshot(c.req.param('id'))\n if (!snapshot) {\n return c.json({ status: 'error', message: 'session not found' }, 404)\n }\n return c.json(snapshot)\n })\n\n /**\n * RFC-331 M3(D4)复核结论:**501 是诚实的,保留**。\n *\n * 与已删除的 `bridgeMode`/`connected` 不同——那两个是**谎报事实**(恒假的能力标志、\n * 用启用标志冒充连接态),而 501 明确告诉调用方\"该能力未实现\",不会误导任何分支决策。\n *\n * 不在本里程碑实现的理由:`CodingService`/`App` 当前没有可接的 resume 语义\n * (会话恢复走 `PersistenceSync.restore` + TUI 侧编排,不是一个 HTTP 端点能独立完成的\n * 动作——它涉及 active session 切换、订阅接续、write lease)。要实现须先定义 REST 侧的\n * 会话激活语义,属独立设计而非 stub 清理。\n *\n * 移除或实现的触发条件:出现真实 REST 客户端需求时(当前全仓零客户端,`web-ui` 用的是\n * `/api/debugger/resume`,与本端点无关)。\n */\n app.post('/:id/resume', (c) => {\n const session = context.getSession(c.req.param('id'))\n if (!session) {\n return c.json({ status: 'error', message: 'session not found' }, 404)\n }\n return c.json({ status: 'error', message: 'resume is not implemented' }, 501)\n })\n\n app.get('/:id/trace', async (c) => {\n const sessionId = c.req.param('id')\n const parseSeq = (raw: string | undefined): number | undefined => {\n if (raw === undefined) {\n return undefined\n }\n const n = Number(raw)\n return Number.isFinite(n) ? n : undefined\n }\n const range = { from: parseSeq(c.req.query('from')), to: parseSeq(c.req.query('to')) }\n\n try {\n const events: Array<{ seq: number; event: unknown }> = []\n for await (const record of context.app.storage.traceStore.read(sessionId, range)) {\n events.push({ seq: record.seq, event: record.entry })\n }\n return c.json({ sessionId, events })\n } catch {\n return c.json({ sessionId, events: [], error: 'failed to read trace' }, 500)\n }\n })\n\n app.get('/:id/export', (c) => {\n const session = context.getSession(c.req.param('id'))\n if (!session) {\n return c.json({ status: 'error', message: 'session not found' }, 404)\n }\n return c.json({\n id: session.id,\n messages: session.session.messages(),\n exportedAt: new Date().toISOString(),\n })\n })\n\n app.get('/:id/model', (c) => {\n const session = context.getSession(c.req.param('id'))\n if (!session) {\n return c.json({}, 404)\n }\n const model = session.model\n return c.json(model ? { id: model.id, provider: model.provider } : {})\n })\n\n app.put('/:id/model', async (c) => {\n const session = context.getSession(c.req.param('id'))\n if (!session) {\n return c.json({ status: 'error', message: 'session not found' }, 404)\n }\n\n const body = await c.req.json<{ modelId?: string }>().catch(() => ({}) as { modelId?: string })\n const modelId = body.modelId\n if (!modelId) {\n return c.json({ status: 'error', message: 'modelId is required' }, 400)\n }\n\n // 精确匹配 registry 已注册模型(不走 resolveModel()——它对未注册 id 有\"回退派生\"\n // 行为,会静默用默认模板拼一个近似模型返回,不适合用户显式选择模型这个场景:\n // 选了 X 就该是 X,找不到就该报错,不该被悄悄替换成别的模型)。\n const model = context.app.getAllModels().find((m) => m.id === modelId)\n if (!model) {\n return c.json({ status: 'error', message: `model not found: ${modelId}` }, 404)\n }\n\n session.model = model\n // 不调用 App.syncSessionToolsFor()(CLI /model 命令会调,见\n // packages/cli/src/commands/interactive-model.ts)——已核实该方法主要解决的是 MCP\n // 工具异步连接后刷新 session.tools 快照本身,而\"模型切换后工具集是否随新模型的\n // supportsTools 能力变化\"这一步已经在 prompt() 调用点做了运行时判断(见\n // packages/runtime/src/session/agent-session.ts:703\n // `tools: this.model.supportsTools === false ? [] : this.tools`,每次 prompt 都\n // 重新判断,不依赖静态快照)——所以本端点不调用它也不会导致\"切到不支持工具的模型\n // 后仍然带着旧工具集崩溃\"这类风险。ServiceHostPort 也未暴露该方法,维持窄接口。\n return c.json({\n status: 'ok',\n model: { id: model.id, provider: model.provider },\n })\n })\n\n app.delete('/:id/model', (c) => {\n return c.json({ status: 'error', message: 'model overlay is not implemented' }, 501)\n })\n\n app.route('/', createWorkspaceRoute(context))\n app.route('/', createTimeTravelRoute(context))\n\n return app\n}\n\n","/** A special constant with type `never` */\nexport const NEVER = Object.freeze({\n status: \"aborted\",\n});\nexport /*@__NO_SIDE_EFFECTS__*/ function $constructor(name, initializer, params) {\n function init(inst, def) {\n if (!inst._zod) {\n Object.defineProperty(inst, \"_zod\", {\n value: {\n def,\n constr: _,\n traits: new Set(),\n },\n enumerable: false,\n });\n }\n if (inst._zod.traits.has(name)) {\n return;\n }\n inst._zod.traits.add(name);\n initializer(inst, def);\n // support prototype modifications\n const proto = _.prototype;\n const keys = Object.keys(proto);\n for (let i = 0; i < keys.length; i++) {\n const k = keys[i];\n if (!(k in inst)) {\n inst[k] = proto[k].bind(inst);\n }\n }\n }\n // doesn't work if Parent has a constructor with arguments\n const Parent = params?.Parent ?? Object;\n class Definition extends Parent {\n }\n Object.defineProperty(Definition, \"name\", { value: name });\n function _(def) {\n var _a;\n const inst = params?.Parent ? new Definition() : this;\n init(inst, def);\n (_a = inst._zod).deferred ?? (_a.deferred = []);\n for (const fn of inst._zod.deferred) {\n fn();\n }\n return inst;\n }\n Object.defineProperty(_, \"init\", { value: init });\n Object.defineProperty(_, Symbol.hasInstance, {\n value: (inst) => {\n if (params?.Parent && inst instanceof params.Parent)\n return true;\n return inst?._zod?.traits?.has(name);\n },\n });\n Object.defineProperty(_, \"name\", { value: name });\n return _;\n}\n////////////////////////////// UTILITIES ///////////////////////////////////////\nexport const $brand = Symbol(\"zod_brand\");\nexport class $ZodAsyncError extends Error {\n constructor() {\n super(`Encountered Promise during synchronous parse. Use .parseAsync() instead.`);\n }\n}\nexport class $ZodEncodeError extends Error {\n constructor(name) {\n super(`Encountered unidirectional transform during encode: ${name}`);\n this.name = \"ZodEncodeError\";\n }\n}\nexport const globalConfig = {};\nexport function config(newConfig) {\n if (newConfig)\n Object.assign(globalConfig, newConfig);\n return globalConfig;\n}\n","// functions\nexport function assertEqual(val) {\n return val;\n}\nexport function assertNotEqual(val) {\n return val;\n}\nexport function assertIs(_arg) { }\nexport function assertNever(_x) {\n throw new Error(\"Unexpected value in exhaustive check\");\n}\nexport function assert(_) { }\nexport function getEnumValues(entries) {\n const numericValues = Object.values(entries).filter((v) => typeof v === \"number\");\n const values = Object.entries(entries)\n .filter(([k, _]) => numericValues.indexOf(+k) === -1)\n .map(([_, v]) => v);\n return values;\n}\nexport function joinValues(array, separator = \"|\") {\n return array.map((val) => stringifyPrimitive(val)).join(separator);\n}\nexport function jsonStringifyReplacer(_, value) {\n if (typeof value === \"bigint\")\n return value.toString();\n return value;\n}\nexport function cached(getter) {\n const set = false;\n return {\n get value() {\n if (!set) {\n const value = getter();\n Object.defineProperty(this, \"value\", { value });\n return value;\n }\n throw new Error(\"cached value already set\");\n },\n };\n}\nexport function nullish(input) {\n return input === null || input === undefined;\n}\nexport function cleanRegex(source) {\n const start = source.startsWith(\"^\") ? 1 : 0;\n const end = source.endsWith(\"$\") ? source.length - 1 : source.length;\n return source.slice(start, end);\n}\nexport function floatSafeRemainder(val, step) {\n const valDecCount = (val.toString().split(\".\")[1] || \"\").length;\n const stepString = step.toString();\n let stepDecCount = (stepString.split(\".\")[1] || \"\").length;\n if (stepDecCount === 0 && /\\d?e-\\d?/.test(stepString)) {\n const match = stepString.match(/\\d?e-(\\d?)/);\n if (match?.[1]) {\n stepDecCount = Number.parseInt(match[1]);\n }\n }\n const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount;\n const valInt = Number.parseInt(val.toFixed(decCount).replace(\".\", \"\"));\n const stepInt = Number.parseInt(step.toFixed(decCount).replace(\".\", \"\"));\n return (valInt % stepInt) / 10 ** decCount;\n}\nconst EVALUATING = Symbol(\"evaluating\");\nexport function defineLazy(object, key, getter) {\n let value = undefined;\n Object.defineProperty(object, key, {\n get() {\n if (value === EVALUATING) {\n // Circular reference detected, return undefined to break the cycle\n return undefined;\n }\n if (value === undefined) {\n value = EVALUATING;\n value = getter();\n }\n return value;\n },\n set(v) {\n Object.defineProperty(object, key, {\n value: v,\n // configurable: true,\n });\n // object[key] = v;\n },\n configurable: true,\n });\n}\nexport function objectClone(obj) {\n return Object.create(Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj));\n}\nexport function assignProp(target, prop, value) {\n Object.defineProperty(target, prop, {\n value,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n}\nexport function mergeDefs(...defs) {\n const mergedDescriptors = {};\n for (const def of defs) {\n const descriptors = Object.getOwnPropertyDescriptors(def);\n Object.assign(mergedDescriptors, descriptors);\n }\n return Object.defineProperties({}, mergedDescriptors);\n}\nexport function cloneDef(schema) {\n return mergeDefs(schema._zod.def);\n}\nexport function getElementAtPath(obj, path) {\n if (!path)\n return obj;\n return path.reduce((acc, key) => acc?.[key], obj);\n}\nexport function promiseAllObject(promisesObj) {\n const keys = Object.keys(promisesObj);\n const promises = keys.map((key) => promisesObj[key]);\n return Promise.all(promises).then((results) => {\n const resolvedObj = {};\n for (let i = 0; i < keys.length; i++) {\n resolvedObj[keys[i]] = results[i];\n }\n return resolvedObj;\n });\n}\nexport function randomString(length = 10) {\n const chars = \"abcdefghijklmnopqrstuvwxyz\";\n let str = \"\";\n for (let i = 0; i < length; i++) {\n str += chars[Math.floor(Math.random() * chars.length)];\n }\n return str;\n}\nexport function esc(str) {\n return JSON.stringify(str);\n}\nexport function slugify(input) {\n return input\n .toLowerCase()\n .trim()\n .replace(/[^\\w\\s-]/g, \"\")\n .replace(/[\\s_-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\nexport const captureStackTrace = (\"captureStackTrace\" in Error ? Error.captureStackTrace : (..._args) => { });\nexport function isObject(data) {\n return typeof data === \"object\" && data !== null && !Array.isArray(data);\n}\nexport const allowsEval = cached(() => {\n // @ts-ignore\n if (typeof navigator !== \"undefined\" && navigator?.userAgent?.includes(\"Cloudflare\")) {\n return false;\n }\n try {\n const F = Function;\n new F(\"\");\n return true;\n }\n catch (_) {\n return false;\n }\n});\nexport function isPlainObject(o) {\n if (isObject(o) === false)\n return false;\n // modified constructor\n const ctor = o.constructor;\n if (ctor === undefined)\n return true;\n if (typeof ctor !== \"function\")\n return true;\n // modified prototype\n const prot = ctor.prototype;\n if (isObject(prot) === false)\n return false;\n // ctor doesn't have static `isPrototypeOf`\n if (Object.prototype.hasOwnProperty.call(prot, \"isPrototypeOf\") === false) {\n return false;\n }\n return true;\n}\nexport function shallowClone(o) {\n if (isPlainObject(o))\n return { ...o };\n if (Array.isArray(o))\n return [...o];\n return o;\n}\nexport function numKeys(data) {\n let keyCount = 0;\n for (const key in data) {\n if (Object.prototype.hasOwnProperty.call(data, key)) {\n keyCount++;\n }\n }\n return keyCount;\n}\nexport const getParsedType = (data) => {\n const t = typeof data;\n switch (t) {\n case \"undefined\":\n return \"undefined\";\n case \"string\":\n return \"string\";\n case \"number\":\n return Number.isNaN(data) ? \"nan\" : \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"function\":\n return \"function\";\n case \"bigint\":\n return \"bigint\";\n case \"symbol\":\n return \"symbol\";\n case \"object\":\n if (Array.isArray(data)) {\n return \"array\";\n }\n if (data === null) {\n return \"null\";\n }\n if (data.then && typeof data.then === \"function\" && data.catch && typeof data.catch === \"function\") {\n return \"promise\";\n }\n if (typeof Map !== \"undefined\" && data instanceof Map) {\n return \"map\";\n }\n if (typeof Set !== \"undefined\" && data instanceof Set) {\n return \"set\";\n }\n if (typeof Date !== \"undefined\" && data instanceof Date) {\n return \"date\";\n }\n // @ts-ignore\n if (typeof File !== \"undefined\" && data instanceof File) {\n return \"file\";\n }\n return \"object\";\n default:\n throw new Error(`Unknown data type: ${t}`);\n }\n};\nexport const propertyKeyTypes = new Set([\"string\", \"number\", \"symbol\"]);\nexport const primitiveTypes = new Set([\"string\", \"number\", \"bigint\", \"boolean\", \"symbol\", \"undefined\"]);\nexport function escapeRegex(str) {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n// zod-specific utils\nexport function clone(inst, def, params) {\n const cl = new inst._zod.constr(def ?? inst._zod.def);\n if (!def || params?.parent)\n cl._zod.parent = inst;\n return cl;\n}\nexport function normalizeParams(_params) {\n const params = _params;\n if (!params)\n return {};\n if (typeof params === \"string\")\n return { error: () => params };\n if (params?.message !== undefined) {\n if (params?.error !== undefined)\n throw new Error(\"Cannot specify both `message` and `error` params\");\n params.error = params.message;\n }\n delete params.message;\n if (typeof params.error === \"string\")\n return { ...params, error: () => params.error };\n return params;\n}\nexport function createTransparentProxy(getter) {\n let target;\n return new Proxy({}, {\n get(_, prop, receiver) {\n target ?? (target = getter());\n return Reflect.get(target, prop, receiver);\n },\n set(_, prop, value, receiver) {\n target ?? (target = getter());\n return Reflect.set(target, prop, value, receiver);\n },\n has(_, prop) {\n target ?? (target = getter());\n return Reflect.has(target, prop);\n },\n deleteProperty(_, prop) {\n target ?? (target = getter());\n return Reflect.deleteProperty(target, prop);\n },\n ownKeys(_) {\n target ?? (target = getter());\n return Reflect.ownKeys(target);\n },\n getOwnPropertyDescriptor(_, prop) {\n target ?? (target = getter());\n return Reflect.getOwnPropertyDescriptor(target, prop);\n },\n defineProperty(_, prop, descriptor) {\n target ?? (target = getter());\n return Reflect.defineProperty(target, prop, descriptor);\n },\n });\n}\nexport function stringifyPrimitive(value) {\n if (typeof value === \"bigint\")\n return value.toString() + \"n\";\n if (typeof value === \"string\")\n return `\"${value}\"`;\n return `${value}`;\n}\nexport function optionalKeys(shape) {\n return Object.keys(shape).filter((k) => {\n return shape[k]._zod.optin === \"optional\" && shape[k]._zod.optout === \"optional\";\n });\n}\nexport const NUMBER_FORMAT_RANGES = {\n safeint: [Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER],\n int32: [-2147483648, 2147483647],\n uint32: [0, 4294967295],\n float32: [-3.4028234663852886e38, 3.4028234663852886e38],\n float64: [-Number.MAX_VALUE, Number.MAX_VALUE],\n};\nexport const BIGINT_FORMAT_RANGES = {\n int64: [/* @__PURE__*/ BigInt(\"-9223372036854775808\"), /* @__PURE__*/ BigInt(\"9223372036854775807\")],\n uint64: [/* @__PURE__*/ BigInt(0), /* @__PURE__*/ BigInt(\"18446744073709551615\")],\n};\nexport function pick(schema, mask) {\n const currDef = schema._zod.def;\n const checks = currDef.checks;\n const hasChecks = checks && checks.length > 0;\n if (hasChecks) {\n throw new Error(\".pick() cannot be used on object schemas containing refinements\");\n }\n const def = mergeDefs(schema._zod.def, {\n get shape() {\n const newShape = {};\n for (const key in mask) {\n if (!(key in currDef.shape)) {\n throw new Error(`Unrecognized key: \"${key}\"`);\n }\n if (!mask[key])\n continue;\n newShape[key] = currDef.shape[key];\n }\n assignProp(this, \"shape\", newShape); // self-caching\n return newShape;\n },\n checks: [],\n });\n return clone(schema, def);\n}\nexport function omit(schema, mask) {\n const currDef = schema._zod.def;\n const checks = currDef.checks;\n const hasChecks = checks && checks.length > 0;\n if (hasChecks) {\n throw new Error(\".omit() cannot be used on object schemas containing refinements\");\n }\n const def = mergeDefs(schema._zod.def, {\n get shape() {\n const newShape = { ...schema._zod.def.shape };\n for (const key in mask) {\n if (!(key in currDef.shape)) {\n throw new Error(`Unrecognized key: \"${key}\"`);\n }\n if (!mask[key])\n continue;\n delete newShape[key];\n }\n assignProp(this, \"shape\", newShape); // self-caching\n return newShape;\n },\n checks: [],\n });\n return clone(schema, def);\n}\nexport function extend(schema, shape) {\n if (!isPlainObject(shape)) {\n throw new Error(\"Invalid input to extend: expected a plain object\");\n }\n const checks = schema._zod.def.checks;\n const hasChecks = checks && checks.length > 0;\n if (hasChecks) {\n // Only throw if new shape overlaps with existing shape\n // Use getOwnPropertyDescriptor to check key existence without accessing values\n const existingShape = schema._zod.def.shape;\n for (const key in shape) {\n if (Object.getOwnPropertyDescriptor(existingShape, key) !== undefined) {\n throw new Error(\"Cannot overwrite keys on object schemas containing refinements. Use `.safeExtend()` instead.\");\n }\n }\n }\n const def = mergeDefs(schema._zod.def, {\n get shape() {\n const _shape = { ...schema._zod.def.shape, ...shape };\n assignProp(this, \"shape\", _shape); // self-caching\n return _shape;\n },\n });\n return clone(schema, def);\n}\nexport function safeExtend(schema, shape) {\n if (!isPlainObject(shape)) {\n throw new Error(\"Invalid input to safeExtend: expected a plain object\");\n }\n const def = mergeDefs(schema._zod.def, {\n get shape() {\n const _shape = { ...schema._zod.def.shape, ...shape };\n assignProp(this, \"shape\", _shape); // self-caching\n return _shape;\n },\n });\n return clone(schema, def);\n}\nexport function merge(a, b) {\n const def = mergeDefs(a._zod.def, {\n get shape() {\n const _shape = { ...a._zod.def.shape, ...b._zod.def.shape };\n assignProp(this, \"shape\", _shape); // self-caching\n return _shape;\n },\n get catchall() {\n return b._zod.def.catchall;\n },\n checks: [], // delete existing checks\n });\n return clone(a, def);\n}\nexport function partial(Class, schema, mask) {\n const currDef = schema._zod.def;\n const checks = currDef.checks;\n const hasChecks = checks && checks.length > 0;\n if (hasChecks) {\n throw new Error(\".partial() cannot be used on object schemas containing refinements\");\n }\n const def = mergeDefs(schema._zod.def, {\n get shape() {\n const oldShape = schema._zod.def.shape;\n const shape = { ...oldShape };\n if (mask) {\n for (const key in mask) {\n if (!(key in oldShape)) {\n throw new Error(`Unrecognized key: \"${key}\"`);\n }\n if (!mask[key])\n continue;\n // if (oldShape[key]!._zod.optin === \"optional\") continue;\n shape[key] = Class\n ? new Class({\n type: \"optional\",\n innerType: oldShape[key],\n })\n : oldShape[key];\n }\n }\n else {\n for (const key in oldShape) {\n // if (oldShape[key]!._zod.optin === \"optional\") continue;\n shape[key] = Class\n ? new Class({\n type: \"optional\",\n innerType: oldShape[key],\n })\n : oldShape[key];\n }\n }\n assignProp(this, \"shape\", shape); // self-caching\n return shape;\n },\n checks: [],\n });\n return clone(schema, def);\n}\nexport function required(Class, schema, mask) {\n const def = mergeDefs(schema._zod.def, {\n get shape() {\n const oldShape = schema._zod.def.shape;\n const shape = { ...oldShape };\n if (mask) {\n for (const key in mask) {\n if (!(key in shape)) {\n throw new Error(`Unrecognized key: \"${key}\"`);\n }\n if (!mask[key])\n continue;\n // overwrite with non-optional\n shape[key] = new Class({\n type: \"nonoptional\",\n innerType: oldShape[key],\n });\n }\n }\n else {\n for (const key in oldShape) {\n // overwrite with non-optional\n shape[key] = new Class({\n type: \"nonoptional\",\n innerType: oldShape[key],\n });\n }\n }\n assignProp(this, \"shape\", shape); // self-caching\n return shape;\n },\n });\n return clone(schema, def);\n}\n// invalid_type | too_big | too_small | invalid_format | not_multiple_of | unrecognized_keys | invalid_union | invalid_key | invalid_element | invalid_value | custom\nexport function aborted(x, startIndex = 0) {\n if (x.aborted === true)\n return true;\n for (let i = startIndex; i < x.issues.length; i++) {\n if (x.issues[i]?.continue !== true) {\n return true;\n }\n }\n return false;\n}\nexport function prefixIssues(path, issues) {\n return issues.map((iss) => {\n var _a;\n (_a = iss).path ?? (_a.path = []);\n iss.path.unshift(path);\n return iss;\n });\n}\nexport function unwrapMessage(message) {\n return typeof message === \"string\" ? message : message?.message;\n}\nexport function finalizeIssue(iss, ctx, config) {\n const full = { ...iss, path: iss.path ?? [] };\n // for backwards compatibility\n if (!iss.message) {\n const message = unwrapMessage(iss.inst?._zod.def?.error?.(iss)) ??\n unwrapMessage(ctx?.error?.(iss)) ??\n unwrapMessage(config.customError?.(iss)) ??\n unwrapMessage(config.localeError?.(iss)) ??\n \"Invalid input\";\n full.message = message;\n }\n // delete (full as any).def;\n delete full.inst;\n delete full.continue;\n if (!ctx?.reportInput) {\n delete full.input;\n }\n return full;\n}\nexport function getSizableOrigin(input) {\n if (input instanceof Set)\n return \"set\";\n if (input instanceof Map)\n return \"map\";\n // @ts-ignore\n if (input instanceof File)\n return \"file\";\n return \"unknown\";\n}\nexport function getLengthableOrigin(input) {\n if (Array.isArray(input))\n return \"array\";\n if (typeof input === \"string\")\n return \"string\";\n return \"unknown\";\n}\nexport function parsedType(data) {\n const t = typeof data;\n switch (t) {\n case \"number\": {\n return Number.isNaN(data) ? \"nan\" : \"number\";\n }\n case \"object\": {\n if (data === null) {\n return \"null\";\n }\n if (Array.isArray(data)) {\n return \"array\";\n }\n const obj = data;\n if (obj && Object.getPrototypeOf(obj) !== Object.prototype && \"constructor\" in obj && obj.constructor) {\n return obj.constructor.name;\n }\n }\n }\n return t;\n}\nexport function issue(...args) {\n const [iss, input, inst] = args;\n if (typeof iss === \"string\") {\n return {\n message: iss,\n code: \"custom\",\n input,\n inst,\n };\n }\n return { ...iss };\n}\nexport function cleanEnum(obj) {\n return Object.entries(obj)\n .filter(([k, _]) => {\n // return true if NaN, meaning it's not a number, thus a string key\n return Number.isNaN(Number.parseInt(k, 10));\n })\n .map((el) => el[1]);\n}\n// Codec utility functions\nexport function base64ToUint8Array(base64) {\n const binaryString = atob(base64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes;\n}\nexport function uint8ArrayToBase64(bytes) {\n let binaryString = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binaryString += String.fromCharCode(bytes[i]);\n }\n return btoa(binaryString);\n}\nexport function base64urlToUint8Array(base64url) {\n const base64 = base64url.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padding = \"=\".repeat((4 - (base64.length % 4)) % 4);\n return base64ToUint8Array(base64 + padding);\n}\nexport function uint8ArrayToBase64url(bytes) {\n return uint8ArrayToBase64(bytes).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=/g, \"\");\n}\nexport function hexToUint8Array(hex) {\n const cleanHex = hex.replace(/^0x/, \"\");\n if (cleanHex.length % 2 !== 0) {\n throw new Error(\"Invalid hex string length\");\n }\n const bytes = new Uint8Array(cleanHex.length / 2);\n for (let i = 0; i < cleanHex.length; i += 2) {\n bytes[i / 2] = Number.parseInt(cleanHex.slice(i, i + 2), 16);\n }\n return bytes;\n}\nexport function uint8ArrayToHex(bytes) {\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n// instanceof\nexport class Class {\n constructor(..._args) { }\n}\n","import { $constructor } from \"./core.js\";\nimport * as util from \"./util.js\";\nconst initializer = (inst, def) => {\n inst.name = \"$ZodError\";\n Object.defineProperty(inst, \"_zod\", {\n value: inst._zod,\n enumerable: false,\n });\n Object.defineProperty(inst, \"issues\", {\n value: def,\n enumerable: false,\n });\n inst.message = JSON.stringify(def, util.jsonStringifyReplacer, 2);\n Object.defineProperty(inst, \"toString\", {\n value: () => inst.message,\n enumerable: false,\n });\n};\nexport const $ZodError = $constructor(\"$ZodError\", initializer);\nexport const $ZodRealError = $constructor(\"$ZodError\", initializer, { Parent: Error });\nexport function flattenError(error, mapper = (issue) => issue.message) {\n const fieldErrors = {};\n const formErrors = [];\n for (const sub of error.issues) {\n if (sub.path.length > 0) {\n fieldErrors[sub.path[0]] = fieldErrors[sub.path[0]] || [];\n fieldErrors[sub.path[0]].push(mapper(sub));\n }\n else {\n formErrors.push(mapper(sub));\n }\n }\n return { formErrors, fieldErrors };\n}\nexport function formatError(error, mapper = (issue) => issue.message) {\n const fieldErrors = { _errors: [] };\n const processError = (error) => {\n for (const issue of error.issues) {\n if (issue.code === \"invalid_union\" && issue.errors.length) {\n issue.errors.map((issues) => processError({ issues }));\n }\n else if (issue.code === \"invalid_key\") {\n processError({ issues: issue.issues });\n }\n else if (issue.code === \"invalid_element\") {\n processError({ issues: issue.issues });\n }\n else if (issue.path.length === 0) {\n fieldErrors._errors.push(mapper(issue));\n }\n else {\n let curr = fieldErrors;\n let i = 0;\n while (i < issue.path.length) {\n const el = issue.path[i];\n const terminal = i === issue.path.length - 1;\n if (!terminal) {\n curr[el] = curr[el] || { _errors: [] };\n }\n else {\n curr[el] = curr[el] || { _errors: [] };\n curr[el]._errors.push(mapper(issue));\n }\n curr = curr[el];\n i++;\n }\n }\n }\n };\n processError(error);\n return fieldErrors;\n}\nexport function treeifyError(error, mapper = (issue) => issue.message) {\n const result = { errors: [] };\n const processError = (error, path = []) => {\n var _a, _b;\n for (const issue of error.issues) {\n if (issue.code === \"invalid_union\" && issue.errors.length) {\n // regular union error\n issue.errors.map((issues) => processError({ issues }, issue.path));\n }\n else if (issue.code === \"invalid_key\") {\n processError({ issues: issue.issues }, issue.path);\n }\n else if (issue.code === \"invalid_element\") {\n processError({ issues: issue.issues }, issue.path);\n }\n else {\n const fullpath = [...path, ...issue.path];\n if (fullpath.length === 0) {\n result.errors.push(mapper(issue));\n continue;\n }\n let curr = result;\n let i = 0;\n while (i < fullpath.length) {\n const el = fullpath[i];\n const terminal = i === fullpath.length - 1;\n if (typeof el === \"string\") {\n curr.properties ?? (curr.properties = {});\n (_a = curr.properties)[el] ?? (_a[el] = { errors: [] });\n curr = curr.properties[el];\n }\n else {\n curr.items ?? (curr.items = []);\n (_b = curr.items)[el] ?? (_b[el] = { errors: [] });\n curr = curr.items[el];\n }\n if (terminal) {\n curr.errors.push(mapper(issue));\n }\n i++;\n }\n }\n }\n };\n processError(error);\n return result;\n}\n/** Format a ZodError as a human-readable string in the following form.\n *\n * From\n *\n * ```ts\n * ZodError {\n * issues: [\n * {\n * expected: 'string',\n * code: 'invalid_type',\n * path: [ 'username' ],\n * message: 'Invalid input: expected string'\n * },\n * {\n * expected: 'number',\n * code: 'invalid_type',\n * path: [ 'favoriteNumbers', 1 ],\n * message: 'Invalid input: expected number'\n * }\n * ];\n * }\n * ```\n *\n * to\n *\n * ```\n * username\n * ✖ Expected number, received string at \"username\n * favoriteNumbers[0]\n * ✖ Invalid input: expected number\n * ```\n */\nexport function toDotPath(_path) {\n const segs = [];\n const path = _path.map((seg) => (typeof seg === \"object\" ? seg.key : seg));\n for (const seg of path) {\n if (typeof seg === \"number\")\n segs.push(`[${seg}]`);\n else if (typeof seg === \"symbol\")\n segs.push(`[${JSON.stringify(String(seg))}]`);\n else if (/[^\\w$]/.test(seg))\n segs.push(`[${JSON.stringify(seg)}]`);\n else {\n if (segs.length)\n segs.push(\".\");\n segs.push(seg);\n }\n }\n return segs.join(\"\");\n}\nexport function prettifyError(error) {\n const lines = [];\n // sort by path length\n const issues = [...error.issues].sort((a, b) => (a.path ?? []).length - (b.path ?? []).length);\n // Process each issue\n for (const issue of issues) {\n lines.push(`✖ ${issue.message}`);\n if (issue.path?.length)\n lines.push(` → at ${toDotPath(issue.path)}`);\n }\n // Convert Map to formatted string\n return lines.join(\"\\n\");\n}\n","import * as core from \"./core.js\";\nimport * as errors from \"./errors.js\";\nimport * as util from \"./util.js\";\nexport const _parse = (_Err) => (schema, value, _ctx, _params) => {\n const ctx = _ctx ? Object.assign(_ctx, { async: false }) : { async: false };\n const result = schema._zod.run({ value, issues: [] }, ctx);\n if (result instanceof Promise) {\n throw new core.$ZodAsyncError();\n }\n if (result.issues.length) {\n const e = new (_params?.Err ?? _Err)(result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())));\n util.captureStackTrace(e, _params?.callee);\n throw e;\n }\n return result.value;\n};\nexport const parse = /* @__PURE__*/ _parse(errors.$ZodRealError);\nexport const _parseAsync = (_Err) => async (schema, value, _ctx, params) => {\n const ctx = _ctx ? Object.assign(_ctx, { async: true }) : { async: true };\n let result = schema._zod.run({ value, issues: [] }, ctx);\n if (result instanceof Promise)\n result = await result;\n if (result.issues.length) {\n const e = new (params?.Err ?? _Err)(result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())));\n util.captureStackTrace(e, params?.callee);\n throw e;\n }\n return result.value;\n};\nexport const parseAsync = /* @__PURE__*/ _parseAsync(errors.$ZodRealError);\nexport const _safeParse = (_Err) => (schema, value, _ctx) => {\n const ctx = _ctx ? { ..._ctx, async: false } : { async: false };\n const result = schema._zod.run({ value, issues: [] }, ctx);\n if (result instanceof Promise) {\n throw new core.$ZodAsyncError();\n }\n return result.issues.length\n ? {\n success: false,\n error: new (_Err ?? errors.$ZodError)(result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config()))),\n }\n : { success: true, data: result.value };\n};\nexport const safeParse = /* @__PURE__*/ _safeParse(errors.$ZodRealError);\nexport const _safeParseAsync = (_Err) => async (schema, value, _ctx) => {\n const ctx = _ctx ? Object.assign(_ctx, { async: true }) : { async: true };\n let result = schema._zod.run({ value, issues: [] }, ctx);\n if (result instanceof Promise)\n result = await result;\n return result.issues.length\n ? {\n success: false,\n error: new _Err(result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config()))),\n }\n : { success: true, data: result.value };\n};\nexport const safeParseAsync = /* @__PURE__*/ _safeParseAsync(errors.$ZodRealError);\nexport const _encode = (_Err) => (schema, value, _ctx) => {\n const ctx = _ctx ? Object.assign(_ctx, { direction: \"backward\" }) : { direction: \"backward\" };\n return _parse(_Err)(schema, value, ctx);\n};\nexport const encode = /* @__PURE__*/ _encode(errors.$ZodRealError);\nexport const _decode = (_Err) => (schema, value, _ctx) => {\n return _parse(_Err)(schema, value, _ctx);\n};\nexport const decode = /* @__PURE__*/ _decode(errors.$ZodRealError);\nexport const _encodeAsync = (_Err) => async (schema, value, _ctx) => {\n const ctx = _ctx ? Object.assign(_ctx, { direction: \"backward\" }) : { direction: \"backward\" };\n return _parseAsync(_Err)(schema, value, ctx);\n};\nexport const encodeAsync = /* @__PURE__*/ _encodeAsync(errors.$ZodRealError);\nexport const _decodeAsync = (_Err) => async (schema, value, _ctx) => {\n return _parseAsync(_Err)(schema, value, _ctx);\n};\nexport const decodeAsync = /* @__PURE__*/ _decodeAsync(errors.$ZodRealError);\nexport const _safeEncode = (_Err) => (schema, value, _ctx) => {\n const ctx = _ctx ? Object.assign(_ctx, { direction: \"backward\" }) : { direction: \"backward\" };\n return _safeParse(_Err)(schema, value, ctx);\n};\nexport const safeEncode = /* @__PURE__*/ _safeEncode(errors.$ZodRealError);\nexport const _safeDecode = (_Err) => (schema, value, _ctx) => {\n return _safeParse(_Err)(schema, value, _ctx);\n};\nexport const safeDecode = /* @__PURE__*/ _safeDecode(errors.$ZodRealError);\nexport const _safeEncodeAsync = (_Err) => async (schema, value, _ctx) => {\n const ctx = _ctx ? Object.assign(_ctx, { direction: \"backward\" }) : { direction: \"backward\" };\n return _safeParseAsync(_Err)(schema, value, ctx);\n};\nexport const safeEncodeAsync = /* @__PURE__*/ _safeEncodeAsync(errors.$ZodRealError);\nexport const _safeDecodeAsync = (_Err) => async (schema, value, _ctx) => {\n return _safeParseAsync(_Err)(schema, value, _ctx);\n};\nexport const safeDecodeAsync = /* @__PURE__*/ _safeDecodeAsync(errors.$ZodRealError);\n","// import { $ZodType } from \"./schemas.js\";\nimport * as core from \"./core.js\";\nimport * as regexes from \"./regexes.js\";\nimport * as util from \"./util.js\";\nexport const $ZodCheck = /*@__PURE__*/ core.$constructor(\"$ZodCheck\", (inst, def) => {\n var _a;\n inst._zod ?? (inst._zod = {});\n inst._zod.def = def;\n (_a = inst._zod).onattach ?? (_a.onattach = []);\n});\nconst numericOriginMap = {\n number: \"number\",\n bigint: \"bigint\",\n object: \"date\",\n};\nexport const $ZodCheckLessThan = /*@__PURE__*/ core.$constructor(\"$ZodCheckLessThan\", (inst, def) => {\n $ZodCheck.init(inst, def);\n const origin = numericOriginMap[typeof def.value];\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n const curr = (def.inclusive ? bag.maximum : bag.exclusiveMaximum) ?? Number.POSITIVE_INFINITY;\n if (def.value < curr) {\n if (def.inclusive)\n bag.maximum = def.value;\n else\n bag.exclusiveMaximum = def.value;\n }\n });\n inst._zod.check = (payload) => {\n if (def.inclusive ? payload.value <= def.value : payload.value < def.value) {\n return;\n }\n payload.issues.push({\n origin,\n code: \"too_big\",\n maximum: typeof def.value === \"object\" ? def.value.getTime() : def.value,\n input: payload.value,\n inclusive: def.inclusive,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckGreaterThan = /*@__PURE__*/ core.$constructor(\"$ZodCheckGreaterThan\", (inst, def) => {\n $ZodCheck.init(inst, def);\n const origin = numericOriginMap[typeof def.value];\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n const curr = (def.inclusive ? bag.minimum : bag.exclusiveMinimum) ?? Number.NEGATIVE_INFINITY;\n if (def.value > curr) {\n if (def.inclusive)\n bag.minimum = def.value;\n else\n bag.exclusiveMinimum = def.value;\n }\n });\n inst._zod.check = (payload) => {\n if (def.inclusive ? payload.value >= def.value : payload.value > def.value) {\n return;\n }\n payload.issues.push({\n origin,\n code: \"too_small\",\n minimum: typeof def.value === \"object\" ? def.value.getTime() : def.value,\n input: payload.value,\n inclusive: def.inclusive,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckMultipleOf = \n/*@__PURE__*/ core.$constructor(\"$ZodCheckMultipleOf\", (inst, def) => {\n $ZodCheck.init(inst, def);\n inst._zod.onattach.push((inst) => {\n var _a;\n (_a = inst._zod.bag).multipleOf ?? (_a.multipleOf = def.value);\n });\n inst._zod.check = (payload) => {\n if (typeof payload.value !== typeof def.value)\n throw new Error(\"Cannot mix number and bigint in multiple_of check.\");\n const isMultiple = typeof payload.value === \"bigint\"\n ? payload.value % def.value === BigInt(0)\n : util.floatSafeRemainder(payload.value, def.value) === 0;\n if (isMultiple)\n return;\n payload.issues.push({\n origin: typeof payload.value,\n code: \"not_multiple_of\",\n divisor: def.value,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckNumberFormat = /*@__PURE__*/ core.$constructor(\"$ZodCheckNumberFormat\", (inst, def) => {\n $ZodCheck.init(inst, def); // no format checks\n def.format = def.format || \"float64\";\n const isInt = def.format?.includes(\"int\");\n const origin = isInt ? \"int\" : \"number\";\n const [minimum, maximum] = util.NUMBER_FORMAT_RANGES[def.format];\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n bag.format = def.format;\n bag.minimum = minimum;\n bag.maximum = maximum;\n if (isInt)\n bag.pattern = regexes.integer;\n });\n inst._zod.check = (payload) => {\n const input = payload.value;\n if (isInt) {\n if (!Number.isInteger(input)) {\n // invalid_format issue\n // payload.issues.push({\n // expected: def.format,\n // format: def.format,\n // code: \"invalid_format\",\n // input,\n // inst,\n // });\n // invalid_type issue\n payload.issues.push({\n expected: origin,\n format: def.format,\n code: \"invalid_type\",\n continue: false,\n input,\n inst,\n });\n return;\n // not_multiple_of issue\n // payload.issues.push({\n // code: \"not_multiple_of\",\n // origin: \"number\",\n // input,\n // inst,\n // divisor: 1,\n // });\n }\n if (!Number.isSafeInteger(input)) {\n if (input > 0) {\n // too_big\n payload.issues.push({\n input,\n code: \"too_big\",\n maximum: Number.MAX_SAFE_INTEGER,\n note: \"Integers must be within the safe integer range.\",\n inst,\n origin,\n inclusive: true,\n continue: !def.abort,\n });\n }\n else {\n // too_small\n payload.issues.push({\n input,\n code: \"too_small\",\n minimum: Number.MIN_SAFE_INTEGER,\n note: \"Integers must be within the safe integer range.\",\n inst,\n origin,\n inclusive: true,\n continue: !def.abort,\n });\n }\n return;\n }\n }\n if (input < minimum) {\n payload.issues.push({\n origin: \"number\",\n input,\n code: \"too_small\",\n minimum,\n inclusive: true,\n inst,\n continue: !def.abort,\n });\n }\n if (input > maximum) {\n payload.issues.push({\n origin: \"number\",\n input,\n code: \"too_big\",\n maximum,\n inclusive: true,\n inst,\n continue: !def.abort,\n });\n }\n };\n});\nexport const $ZodCheckBigIntFormat = /*@__PURE__*/ core.$constructor(\"$ZodCheckBigIntFormat\", (inst, def) => {\n $ZodCheck.init(inst, def); // no format checks\n const [minimum, maximum] = util.BIGINT_FORMAT_RANGES[def.format];\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n bag.format = def.format;\n bag.minimum = minimum;\n bag.maximum = maximum;\n });\n inst._zod.check = (payload) => {\n const input = payload.value;\n if (input < minimum) {\n payload.issues.push({\n origin: \"bigint\",\n input,\n code: \"too_small\",\n minimum: minimum,\n inclusive: true,\n inst,\n continue: !def.abort,\n });\n }\n if (input > maximum) {\n payload.issues.push({\n origin: \"bigint\",\n input,\n code: \"too_big\",\n maximum,\n inclusive: true,\n inst,\n continue: !def.abort,\n });\n }\n };\n});\nexport const $ZodCheckMaxSize = /*@__PURE__*/ core.$constructor(\"$ZodCheckMaxSize\", (inst, def) => {\n var _a;\n $ZodCheck.init(inst, def);\n (_a = inst._zod.def).when ?? (_a.when = (payload) => {\n const val = payload.value;\n return !util.nullish(val) && val.size !== undefined;\n });\n inst._zod.onattach.push((inst) => {\n const curr = (inst._zod.bag.maximum ?? Number.POSITIVE_INFINITY);\n if (def.maximum < curr)\n inst._zod.bag.maximum = def.maximum;\n });\n inst._zod.check = (payload) => {\n const input = payload.value;\n const size = input.size;\n if (size <= def.maximum)\n return;\n payload.issues.push({\n origin: util.getSizableOrigin(input),\n code: \"too_big\",\n maximum: def.maximum,\n inclusive: true,\n input,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckMinSize = /*@__PURE__*/ core.$constructor(\"$ZodCheckMinSize\", (inst, def) => {\n var _a;\n $ZodCheck.init(inst, def);\n (_a = inst._zod.def).when ?? (_a.when = (payload) => {\n const val = payload.value;\n return !util.nullish(val) && val.size !== undefined;\n });\n inst._zod.onattach.push((inst) => {\n const curr = (inst._zod.bag.minimum ?? Number.NEGATIVE_INFINITY);\n if (def.minimum > curr)\n inst._zod.bag.minimum = def.minimum;\n });\n inst._zod.check = (payload) => {\n const input = payload.value;\n const size = input.size;\n if (size >= def.minimum)\n return;\n payload.issues.push({\n origin: util.getSizableOrigin(input),\n code: \"too_small\",\n minimum: def.minimum,\n inclusive: true,\n input,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckSizeEquals = /*@__PURE__*/ core.$constructor(\"$ZodCheckSizeEquals\", (inst, def) => {\n var _a;\n $ZodCheck.init(inst, def);\n (_a = inst._zod.def).when ?? (_a.when = (payload) => {\n const val = payload.value;\n return !util.nullish(val) && val.size !== undefined;\n });\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n bag.minimum = def.size;\n bag.maximum = def.size;\n bag.size = def.size;\n });\n inst._zod.check = (payload) => {\n const input = payload.value;\n const size = input.size;\n if (size === def.size)\n return;\n const tooBig = size > def.size;\n payload.issues.push({\n origin: util.getSizableOrigin(input),\n ...(tooBig ? { code: \"too_big\", maximum: def.size } : { code: \"too_small\", minimum: def.size }),\n inclusive: true,\n exact: true,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckMaxLength = /*@__PURE__*/ core.$constructor(\"$ZodCheckMaxLength\", (inst, def) => {\n var _a;\n $ZodCheck.init(inst, def);\n (_a = inst._zod.def).when ?? (_a.when = (payload) => {\n const val = payload.value;\n return !util.nullish(val) && val.length !== undefined;\n });\n inst._zod.onattach.push((inst) => {\n const curr = (inst._zod.bag.maximum ?? Number.POSITIVE_INFINITY);\n if (def.maximum < curr)\n inst._zod.bag.maximum = def.maximum;\n });\n inst._zod.check = (payload) => {\n const input = payload.value;\n const length = input.length;\n if (length <= def.maximum)\n return;\n const origin = util.getLengthableOrigin(input);\n payload.issues.push({\n origin,\n code: \"too_big\",\n maximum: def.maximum,\n inclusive: true,\n input,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckMinLength = /*@__PURE__*/ core.$constructor(\"$ZodCheckMinLength\", (inst, def) => {\n var _a;\n $ZodCheck.init(inst, def);\n (_a = inst._zod.def).when ?? (_a.when = (payload) => {\n const val = payload.value;\n return !util.nullish(val) && val.length !== undefined;\n });\n inst._zod.onattach.push((inst) => {\n const curr = (inst._zod.bag.minimum ?? Number.NEGATIVE_INFINITY);\n if (def.minimum > curr)\n inst._zod.bag.minimum = def.minimum;\n });\n inst._zod.check = (payload) => {\n const input = payload.value;\n const length = input.length;\n if (length >= def.minimum)\n return;\n const origin = util.getLengthableOrigin(input);\n payload.issues.push({\n origin,\n code: \"too_small\",\n minimum: def.minimum,\n inclusive: true,\n input,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckLengthEquals = /*@__PURE__*/ core.$constructor(\"$ZodCheckLengthEquals\", (inst, def) => {\n var _a;\n $ZodCheck.init(inst, def);\n (_a = inst._zod.def).when ?? (_a.when = (payload) => {\n const val = payload.value;\n return !util.nullish(val) && val.length !== undefined;\n });\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n bag.minimum = def.length;\n bag.maximum = def.length;\n bag.length = def.length;\n });\n inst._zod.check = (payload) => {\n const input = payload.value;\n const length = input.length;\n if (length === def.length)\n return;\n const origin = util.getLengthableOrigin(input);\n const tooBig = length > def.length;\n payload.issues.push({\n origin,\n ...(tooBig ? { code: \"too_big\", maximum: def.length } : { code: \"too_small\", minimum: def.length }),\n inclusive: true,\n exact: true,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckStringFormat = /*@__PURE__*/ core.$constructor(\"$ZodCheckStringFormat\", (inst, def) => {\n var _a, _b;\n $ZodCheck.init(inst, def);\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n bag.format = def.format;\n if (def.pattern) {\n bag.patterns ?? (bag.patterns = new Set());\n bag.patterns.add(def.pattern);\n }\n });\n if (def.pattern)\n (_a = inst._zod).check ?? (_a.check = (payload) => {\n def.pattern.lastIndex = 0;\n if (def.pattern.test(payload.value))\n return;\n payload.issues.push({\n origin: \"string\",\n code: \"invalid_format\",\n format: def.format,\n input: payload.value,\n ...(def.pattern ? { pattern: def.pattern.toString() } : {}),\n inst,\n continue: !def.abort,\n });\n });\n else\n (_b = inst._zod).check ?? (_b.check = () => { });\n});\nexport const $ZodCheckRegex = /*@__PURE__*/ core.$constructor(\"$ZodCheckRegex\", (inst, def) => {\n $ZodCheckStringFormat.init(inst, def);\n inst._zod.check = (payload) => {\n def.pattern.lastIndex = 0;\n if (def.pattern.test(payload.value))\n return;\n payload.issues.push({\n origin: \"string\",\n code: \"invalid_format\",\n format: \"regex\",\n input: payload.value,\n pattern: def.pattern.toString(),\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckLowerCase = /*@__PURE__*/ core.$constructor(\"$ZodCheckLowerCase\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.lowercase);\n $ZodCheckStringFormat.init(inst, def);\n});\nexport const $ZodCheckUpperCase = /*@__PURE__*/ core.$constructor(\"$ZodCheckUpperCase\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.uppercase);\n $ZodCheckStringFormat.init(inst, def);\n});\nexport const $ZodCheckIncludes = /*@__PURE__*/ core.$constructor(\"$ZodCheckIncludes\", (inst, def) => {\n $ZodCheck.init(inst, def);\n const escapedRegex = util.escapeRegex(def.includes);\n const pattern = new RegExp(typeof def.position === \"number\" ? `^.{${def.position}}${escapedRegex}` : escapedRegex);\n def.pattern = pattern;\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n bag.patterns ?? (bag.patterns = new Set());\n bag.patterns.add(pattern);\n });\n inst._zod.check = (payload) => {\n if (payload.value.includes(def.includes, def.position))\n return;\n payload.issues.push({\n origin: \"string\",\n code: \"invalid_format\",\n format: \"includes\",\n includes: def.includes,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckStartsWith = /*@__PURE__*/ core.$constructor(\"$ZodCheckStartsWith\", (inst, def) => {\n $ZodCheck.init(inst, def);\n const pattern = new RegExp(`^${util.escapeRegex(def.prefix)}.*`);\n def.pattern ?? (def.pattern = pattern);\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n bag.patterns ?? (bag.patterns = new Set());\n bag.patterns.add(pattern);\n });\n inst._zod.check = (payload) => {\n if (payload.value.startsWith(def.prefix))\n return;\n payload.issues.push({\n origin: \"string\",\n code: \"invalid_format\",\n format: \"starts_with\",\n prefix: def.prefix,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckEndsWith = /*@__PURE__*/ core.$constructor(\"$ZodCheckEndsWith\", (inst, def) => {\n $ZodCheck.init(inst, def);\n const pattern = new RegExp(`.*${util.escapeRegex(def.suffix)}$`);\n def.pattern ?? (def.pattern = pattern);\n inst._zod.onattach.push((inst) => {\n const bag = inst._zod.bag;\n bag.patterns ?? (bag.patterns = new Set());\n bag.patterns.add(pattern);\n });\n inst._zod.check = (payload) => {\n if (payload.value.endsWith(def.suffix))\n return;\n payload.issues.push({\n origin: \"string\",\n code: \"invalid_format\",\n format: \"ends_with\",\n suffix: def.suffix,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\n///////////////////////////////////\n///// $ZodCheckProperty /////\n///////////////////////////////////\nfunction handleCheckPropertyResult(result, payload, property) {\n if (result.issues.length) {\n payload.issues.push(...util.prefixIssues(property, result.issues));\n }\n}\nexport const $ZodCheckProperty = /*@__PURE__*/ core.$constructor(\"$ZodCheckProperty\", (inst, def) => {\n $ZodCheck.init(inst, def);\n inst._zod.check = (payload) => {\n const result = def.schema._zod.run({\n value: payload.value[def.property],\n issues: [],\n }, {});\n if (result instanceof Promise) {\n return result.then((result) => handleCheckPropertyResult(result, payload, def.property));\n }\n handleCheckPropertyResult(result, payload, def.property);\n return;\n };\n});\nexport const $ZodCheckMimeType = /*@__PURE__*/ core.$constructor(\"$ZodCheckMimeType\", (inst, def) => {\n $ZodCheck.init(inst, def);\n const mimeSet = new Set(def.mime);\n inst._zod.onattach.push((inst) => {\n inst._zod.bag.mime = def.mime;\n });\n inst._zod.check = (payload) => {\n if (mimeSet.has(payload.value.type))\n return;\n payload.issues.push({\n code: \"invalid_value\",\n values: def.mime,\n input: payload.value.type,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCheckOverwrite = /*@__PURE__*/ core.$constructor(\"$ZodCheckOverwrite\", (inst, def) => {\n $ZodCheck.init(inst, def);\n inst._zod.check = (payload) => {\n payload.value = def.tx(payload.value);\n };\n});\n","export class Doc {\n constructor(args = []) {\n this.content = [];\n this.indent = 0;\n if (this)\n this.args = args;\n }\n indented(fn) {\n this.indent += 1;\n fn(this);\n this.indent -= 1;\n }\n write(arg) {\n if (typeof arg === \"function\") {\n arg(this, { execution: \"sync\" });\n arg(this, { execution: \"async\" });\n return;\n }\n const content = arg;\n const lines = content.split(\"\\n\").filter((x) => x);\n const minIndent = Math.min(...lines.map((x) => x.length - x.trimStart().length));\n const dedented = lines.map((x) => x.slice(minIndent)).map((x) => \" \".repeat(this.indent * 2) + x);\n for (const line of dedented) {\n this.content.push(line);\n }\n }\n compile() {\n const F = Function;\n const args = this?.args;\n const content = this?.content ?? [``];\n const lines = [...content.map((x) => ` ${x}`)];\n // console.log(lines.join(\"\\n\"));\n return new F(...args, lines.join(\"\\n\"));\n }\n}\n","export const version = {\n major: 4,\n minor: 3,\n patch: 6,\n};\n","import * as checks from \"./checks.js\";\nimport * as core from \"./core.js\";\nimport { Doc } from \"./doc.js\";\nimport { parse, parseAsync, safeParse, safeParseAsync } from \"./parse.js\";\nimport * as regexes from \"./regexes.js\";\nimport * as util from \"./util.js\";\nimport { version } from \"./versions.js\";\nexport const $ZodType = /*@__PURE__*/ core.$constructor(\"$ZodType\", (inst, def) => {\n var _a;\n inst ?? (inst = {});\n inst._zod.def = def; // set _def property\n inst._zod.bag = inst._zod.bag || {}; // initialize _bag object\n inst._zod.version = version;\n const checks = [...(inst._zod.def.checks ?? [])];\n // if inst is itself a checks.$ZodCheck, run it as a check\n if (inst._zod.traits.has(\"$ZodCheck\")) {\n checks.unshift(inst);\n }\n for (const ch of checks) {\n for (const fn of ch._zod.onattach) {\n fn(inst);\n }\n }\n if (checks.length === 0) {\n // deferred initializer\n // inst._zod.parse is not yet defined\n (_a = inst._zod).deferred ?? (_a.deferred = []);\n inst._zod.deferred?.push(() => {\n inst._zod.run = inst._zod.parse;\n });\n }\n else {\n const runChecks = (payload, checks, ctx) => {\n let isAborted = util.aborted(payload);\n let asyncResult;\n for (const ch of checks) {\n if (ch._zod.def.when) {\n const shouldRun = ch._zod.def.when(payload);\n if (!shouldRun)\n continue;\n }\n else if (isAborted) {\n continue;\n }\n const currLen = payload.issues.length;\n const _ = ch._zod.check(payload);\n if (_ instanceof Promise && ctx?.async === false) {\n throw new core.$ZodAsyncError();\n }\n if (asyncResult || _ instanceof Promise) {\n asyncResult = (asyncResult ?? Promise.resolve()).then(async () => {\n await _;\n const nextLen = payload.issues.length;\n if (nextLen === currLen)\n return;\n if (!isAborted)\n isAborted = util.aborted(payload, currLen);\n });\n }\n else {\n const nextLen = payload.issues.length;\n if (nextLen === currLen)\n continue;\n if (!isAborted)\n isAborted = util.aborted(payload, currLen);\n }\n }\n if (asyncResult) {\n return asyncResult.then(() => {\n return payload;\n });\n }\n return payload;\n };\n const handleCanaryResult = (canary, payload, ctx) => {\n // abort if the canary is aborted\n if (util.aborted(canary)) {\n canary.aborted = true;\n return canary;\n }\n // run checks first, then\n const checkResult = runChecks(payload, checks, ctx);\n if (checkResult instanceof Promise) {\n if (ctx.async === false)\n throw new core.$ZodAsyncError();\n return checkResult.then((checkResult) => inst._zod.parse(checkResult, ctx));\n }\n return inst._zod.parse(checkResult, ctx);\n };\n inst._zod.run = (payload, ctx) => {\n if (ctx.skipChecks) {\n return inst._zod.parse(payload, ctx);\n }\n if (ctx.direction === \"backward\") {\n // run canary\n // initial pass (no checks)\n const canary = inst._zod.parse({ value: payload.value, issues: [] }, { ...ctx, skipChecks: true });\n if (canary instanceof Promise) {\n return canary.then((canary) => {\n return handleCanaryResult(canary, payload, ctx);\n });\n }\n return handleCanaryResult(canary, payload, ctx);\n }\n // forward\n const result = inst._zod.parse(payload, ctx);\n if (result instanceof Promise) {\n if (ctx.async === false)\n throw new core.$ZodAsyncError();\n return result.then((result) => runChecks(result, checks, ctx));\n }\n return runChecks(result, checks, ctx);\n };\n }\n // Lazy initialize ~standard to avoid creating objects for every schema\n util.defineLazy(inst, \"~standard\", () => ({\n validate: (value) => {\n try {\n const r = safeParse(inst, value);\n return r.success ? { value: r.data } : { issues: r.error?.issues };\n }\n catch (_) {\n return safeParseAsync(inst, value).then((r) => (r.success ? { value: r.data } : { issues: r.error?.issues }));\n }\n },\n vendor: \"zod\",\n version: 1,\n }));\n});\nexport { clone } from \"./util.js\";\nexport const $ZodString = /*@__PURE__*/ core.$constructor(\"$ZodString\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.pattern = [...(inst?._zod.bag?.patterns ?? [])].pop() ?? regexes.string(inst._zod.bag);\n inst._zod.parse = (payload, _) => {\n if (def.coerce)\n try {\n payload.value = String(payload.value);\n }\n catch (_) { }\n if (typeof payload.value === \"string\")\n return payload;\n payload.issues.push({\n expected: \"string\",\n code: \"invalid_type\",\n input: payload.value,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodStringFormat = /*@__PURE__*/ core.$constructor(\"$ZodStringFormat\", (inst, def) => {\n // check initialization must come first\n checks.$ZodCheckStringFormat.init(inst, def);\n $ZodString.init(inst, def);\n});\nexport const $ZodGUID = /*@__PURE__*/ core.$constructor(\"$ZodGUID\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.guid);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodUUID = /*@__PURE__*/ core.$constructor(\"$ZodUUID\", (inst, def) => {\n if (def.version) {\n const versionMap = {\n v1: 1,\n v2: 2,\n v3: 3,\n v4: 4,\n v5: 5,\n v6: 6,\n v7: 7,\n v8: 8,\n };\n const v = versionMap[def.version];\n if (v === undefined)\n throw new Error(`Invalid UUID version: \"${def.version}\"`);\n def.pattern ?? (def.pattern = regexes.uuid(v));\n }\n else\n def.pattern ?? (def.pattern = regexes.uuid());\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodEmail = /*@__PURE__*/ core.$constructor(\"$ZodEmail\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.email);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodURL = /*@__PURE__*/ core.$constructor(\"$ZodURL\", (inst, def) => {\n $ZodStringFormat.init(inst, def);\n inst._zod.check = (payload) => {\n try {\n // Trim whitespace from input\n const trimmed = payload.value.trim();\n // @ts-ignore\n const url = new URL(trimmed);\n if (def.hostname) {\n def.hostname.lastIndex = 0;\n if (!def.hostname.test(url.hostname)) {\n payload.issues.push({\n code: \"invalid_format\",\n format: \"url\",\n note: \"Invalid hostname\",\n pattern: def.hostname.source,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n }\n }\n if (def.protocol) {\n def.protocol.lastIndex = 0;\n if (!def.protocol.test(url.protocol.endsWith(\":\") ? url.protocol.slice(0, -1) : url.protocol)) {\n payload.issues.push({\n code: \"invalid_format\",\n format: \"url\",\n note: \"Invalid protocol\",\n pattern: def.protocol.source,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n }\n }\n // Set the output value based on normalize flag\n if (def.normalize) {\n // Use normalized URL\n payload.value = url.href;\n }\n else {\n // Preserve the original input (trimmed)\n payload.value = trimmed;\n }\n return;\n }\n catch (_) {\n payload.issues.push({\n code: \"invalid_format\",\n format: \"url\",\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n }\n };\n});\nexport const $ZodEmoji = /*@__PURE__*/ core.$constructor(\"$ZodEmoji\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.emoji());\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodNanoID = /*@__PURE__*/ core.$constructor(\"$ZodNanoID\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.nanoid);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodCUID = /*@__PURE__*/ core.$constructor(\"$ZodCUID\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.cuid);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodCUID2 = /*@__PURE__*/ core.$constructor(\"$ZodCUID2\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.cuid2);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodULID = /*@__PURE__*/ core.$constructor(\"$ZodULID\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.ulid);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodXID = /*@__PURE__*/ core.$constructor(\"$ZodXID\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.xid);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodKSUID = /*@__PURE__*/ core.$constructor(\"$ZodKSUID\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.ksuid);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodISODateTime = /*@__PURE__*/ core.$constructor(\"$ZodISODateTime\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.datetime(def));\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodISODate = /*@__PURE__*/ core.$constructor(\"$ZodISODate\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.date);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodISOTime = /*@__PURE__*/ core.$constructor(\"$ZodISOTime\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.time(def));\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodISODuration = /*@__PURE__*/ core.$constructor(\"$ZodISODuration\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.duration);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodIPv4 = /*@__PURE__*/ core.$constructor(\"$ZodIPv4\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.ipv4);\n $ZodStringFormat.init(inst, def);\n inst._zod.bag.format = `ipv4`;\n});\nexport const $ZodIPv6 = /*@__PURE__*/ core.$constructor(\"$ZodIPv6\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.ipv6);\n $ZodStringFormat.init(inst, def);\n inst._zod.bag.format = `ipv6`;\n inst._zod.check = (payload) => {\n try {\n // @ts-ignore\n new URL(`http://[${payload.value}]`);\n // return;\n }\n catch {\n payload.issues.push({\n code: \"invalid_format\",\n format: \"ipv6\",\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n }\n };\n});\nexport const $ZodMAC = /*@__PURE__*/ core.$constructor(\"$ZodMAC\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.mac(def.delimiter));\n $ZodStringFormat.init(inst, def);\n inst._zod.bag.format = `mac`;\n});\nexport const $ZodCIDRv4 = /*@__PURE__*/ core.$constructor(\"$ZodCIDRv4\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.cidrv4);\n $ZodStringFormat.init(inst, def);\n});\nexport const $ZodCIDRv6 = /*@__PURE__*/ core.$constructor(\"$ZodCIDRv6\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.cidrv6); // not used for validation\n $ZodStringFormat.init(inst, def);\n inst._zod.check = (payload) => {\n const parts = payload.value.split(\"/\");\n try {\n if (parts.length !== 2)\n throw new Error();\n const [address, prefix] = parts;\n if (!prefix)\n throw new Error();\n const prefixNum = Number(prefix);\n if (`${prefixNum}` !== prefix)\n throw new Error();\n if (prefixNum < 0 || prefixNum > 128)\n throw new Error();\n // @ts-ignore\n new URL(`http://[${address}]`);\n }\n catch {\n payload.issues.push({\n code: \"invalid_format\",\n format: \"cidrv6\",\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n }\n };\n});\n////////////////////////////// ZodBase64 //////////////////////////////\nexport function isValidBase64(data) {\n if (data === \"\")\n return true;\n if (data.length % 4 !== 0)\n return false;\n try {\n // @ts-ignore\n atob(data);\n return true;\n }\n catch {\n return false;\n }\n}\nexport const $ZodBase64 = /*@__PURE__*/ core.$constructor(\"$ZodBase64\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.base64);\n $ZodStringFormat.init(inst, def);\n inst._zod.bag.contentEncoding = \"base64\";\n inst._zod.check = (payload) => {\n if (isValidBase64(payload.value))\n return;\n payload.issues.push({\n code: \"invalid_format\",\n format: \"base64\",\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\n////////////////////////////// ZodBase64 //////////////////////////////\nexport function isValidBase64URL(data) {\n if (!regexes.base64url.test(data))\n return false;\n const base64 = data.replace(/[-_]/g, (c) => (c === \"-\" ? \"+\" : \"/\"));\n const padded = base64.padEnd(Math.ceil(base64.length / 4) * 4, \"=\");\n return isValidBase64(padded);\n}\nexport const $ZodBase64URL = /*@__PURE__*/ core.$constructor(\"$ZodBase64URL\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.base64url);\n $ZodStringFormat.init(inst, def);\n inst._zod.bag.contentEncoding = \"base64url\";\n inst._zod.check = (payload) => {\n if (isValidBase64URL(payload.value))\n return;\n payload.issues.push({\n code: \"invalid_format\",\n format: \"base64url\",\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodE164 = /*@__PURE__*/ core.$constructor(\"$ZodE164\", (inst, def) => {\n def.pattern ?? (def.pattern = regexes.e164);\n $ZodStringFormat.init(inst, def);\n});\n////////////////////////////// ZodJWT //////////////////////////////\nexport function isValidJWT(token, algorithm = null) {\n try {\n const tokensParts = token.split(\".\");\n if (tokensParts.length !== 3)\n return false;\n const [header] = tokensParts;\n if (!header)\n return false;\n // @ts-ignore\n const parsedHeader = JSON.parse(atob(header));\n if (\"typ\" in parsedHeader && parsedHeader?.typ !== \"JWT\")\n return false;\n if (!parsedHeader.alg)\n return false;\n if (algorithm && (!(\"alg\" in parsedHeader) || parsedHeader.alg !== algorithm))\n return false;\n return true;\n }\n catch {\n return false;\n }\n}\nexport const $ZodJWT = /*@__PURE__*/ core.$constructor(\"$ZodJWT\", (inst, def) => {\n $ZodStringFormat.init(inst, def);\n inst._zod.check = (payload) => {\n if (isValidJWT(payload.value, def.alg))\n return;\n payload.issues.push({\n code: \"invalid_format\",\n format: \"jwt\",\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodCustomStringFormat = /*@__PURE__*/ core.$constructor(\"$ZodCustomStringFormat\", (inst, def) => {\n $ZodStringFormat.init(inst, def);\n inst._zod.check = (payload) => {\n if (def.fn(payload.value))\n return;\n payload.issues.push({\n code: \"invalid_format\",\n format: def.format,\n input: payload.value,\n inst,\n continue: !def.abort,\n });\n };\n});\nexport const $ZodNumber = /*@__PURE__*/ core.$constructor(\"$ZodNumber\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.pattern = inst._zod.bag.pattern ?? regexes.number;\n inst._zod.parse = (payload, _ctx) => {\n if (def.coerce)\n try {\n payload.value = Number(payload.value);\n }\n catch (_) { }\n const input = payload.value;\n if (typeof input === \"number\" && !Number.isNaN(input) && Number.isFinite(input)) {\n return payload;\n }\n const received = typeof input === \"number\"\n ? Number.isNaN(input)\n ? \"NaN\"\n : !Number.isFinite(input)\n ? \"Infinity\"\n : undefined\n : undefined;\n payload.issues.push({\n expected: \"number\",\n code: \"invalid_type\",\n input,\n inst,\n ...(received ? { received } : {}),\n });\n return payload;\n };\n});\nexport const $ZodNumberFormat = /*@__PURE__*/ core.$constructor(\"$ZodNumberFormat\", (inst, def) => {\n checks.$ZodCheckNumberFormat.init(inst, def);\n $ZodNumber.init(inst, def); // no format checks\n});\nexport const $ZodBoolean = /*@__PURE__*/ core.$constructor(\"$ZodBoolean\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.pattern = regexes.boolean;\n inst._zod.parse = (payload, _ctx) => {\n if (def.coerce)\n try {\n payload.value = Boolean(payload.value);\n }\n catch (_) { }\n const input = payload.value;\n if (typeof input === \"boolean\")\n return payload;\n payload.issues.push({\n expected: \"boolean\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodBigInt = /*@__PURE__*/ core.$constructor(\"$ZodBigInt\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.pattern = regexes.bigint;\n inst._zod.parse = (payload, _ctx) => {\n if (def.coerce)\n try {\n payload.value = BigInt(payload.value);\n }\n catch (_) { }\n if (typeof payload.value === \"bigint\")\n return payload;\n payload.issues.push({\n expected: \"bigint\",\n code: \"invalid_type\",\n input: payload.value,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodBigIntFormat = /*@__PURE__*/ core.$constructor(\"$ZodBigIntFormat\", (inst, def) => {\n checks.$ZodCheckBigIntFormat.init(inst, def);\n $ZodBigInt.init(inst, def); // no format checks\n});\nexport const $ZodSymbol = /*@__PURE__*/ core.$constructor(\"$ZodSymbol\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, _ctx) => {\n const input = payload.value;\n if (typeof input === \"symbol\")\n return payload;\n payload.issues.push({\n expected: \"symbol\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodUndefined = /*@__PURE__*/ core.$constructor(\"$ZodUndefined\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.pattern = regexes.undefined;\n inst._zod.values = new Set([undefined]);\n inst._zod.optin = \"optional\";\n inst._zod.optout = \"optional\";\n inst._zod.parse = (payload, _ctx) => {\n const input = payload.value;\n if (typeof input === \"undefined\")\n return payload;\n payload.issues.push({\n expected: \"undefined\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodNull = /*@__PURE__*/ core.$constructor(\"$ZodNull\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.pattern = regexes.null;\n inst._zod.values = new Set([null]);\n inst._zod.parse = (payload, _ctx) => {\n const input = payload.value;\n if (input === null)\n return payload;\n payload.issues.push({\n expected: \"null\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodAny = /*@__PURE__*/ core.$constructor(\"$ZodAny\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload) => payload;\n});\nexport const $ZodUnknown = /*@__PURE__*/ core.$constructor(\"$ZodUnknown\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload) => payload;\n});\nexport const $ZodNever = /*@__PURE__*/ core.$constructor(\"$ZodNever\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, _ctx) => {\n payload.issues.push({\n expected: \"never\",\n code: \"invalid_type\",\n input: payload.value,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodVoid = /*@__PURE__*/ core.$constructor(\"$ZodVoid\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, _ctx) => {\n const input = payload.value;\n if (typeof input === \"undefined\")\n return payload;\n payload.issues.push({\n expected: \"void\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodDate = /*@__PURE__*/ core.$constructor(\"$ZodDate\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, _ctx) => {\n if (def.coerce) {\n try {\n payload.value = new Date(payload.value);\n }\n catch (_err) { }\n }\n const input = payload.value;\n const isDate = input instanceof Date;\n const isValidDate = isDate && !Number.isNaN(input.getTime());\n if (isValidDate)\n return payload;\n payload.issues.push({\n expected: \"date\",\n code: \"invalid_type\",\n input,\n ...(isDate ? { received: \"Invalid Date\" } : {}),\n inst,\n });\n return payload;\n };\n});\nfunction handleArrayResult(result, final, index) {\n if (result.issues.length) {\n final.issues.push(...util.prefixIssues(index, result.issues));\n }\n final.value[index] = result.value;\n}\nexport const $ZodArray = /*@__PURE__*/ core.$constructor(\"$ZodArray\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, ctx) => {\n const input = payload.value;\n if (!Array.isArray(input)) {\n payload.issues.push({\n expected: \"array\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n }\n payload.value = Array(input.length);\n const proms = [];\n for (let i = 0; i < input.length; i++) {\n const item = input[i];\n const result = def.element._zod.run({\n value: item,\n issues: [],\n }, ctx);\n if (result instanceof Promise) {\n proms.push(result.then((result) => handleArrayResult(result, payload, i)));\n }\n else {\n handleArrayResult(result, payload, i);\n }\n }\n if (proms.length) {\n return Promise.all(proms).then(() => payload);\n }\n return payload; //handleArrayResultsAsync(parseResults, final);\n };\n});\nfunction handlePropertyResult(result, final, key, input, isOptionalOut) {\n if (result.issues.length) {\n // For optional-out schemas, ignore errors on absent keys\n if (isOptionalOut && !(key in input)) {\n return;\n }\n final.issues.push(...util.prefixIssues(key, result.issues));\n }\n if (result.value === undefined) {\n if (key in input) {\n final.value[key] = undefined;\n }\n }\n else {\n final.value[key] = result.value;\n }\n}\nfunction normalizeDef(def) {\n const keys = Object.keys(def.shape);\n for (const k of keys) {\n if (!def.shape?.[k]?._zod?.traits?.has(\"$ZodType\")) {\n throw new Error(`Invalid element at key \"${k}\": expected a Zod schema`);\n }\n }\n const okeys = util.optionalKeys(def.shape);\n return {\n ...def,\n keys,\n keySet: new Set(keys),\n numKeys: keys.length,\n optionalKeys: new Set(okeys),\n };\n}\nfunction handleCatchall(proms, input, payload, ctx, def, inst) {\n const unrecognized = [];\n // iterate over input keys\n const keySet = def.keySet;\n const _catchall = def.catchall._zod;\n const t = _catchall.def.type;\n const isOptionalOut = _catchall.optout === \"optional\";\n for (const key in input) {\n if (keySet.has(key))\n continue;\n if (t === \"never\") {\n unrecognized.push(key);\n continue;\n }\n const r = _catchall.run({ value: input[key], issues: [] }, ctx);\n if (r instanceof Promise) {\n proms.push(r.then((r) => handlePropertyResult(r, payload, key, input, isOptionalOut)));\n }\n else {\n handlePropertyResult(r, payload, key, input, isOptionalOut);\n }\n }\n if (unrecognized.length) {\n payload.issues.push({\n code: \"unrecognized_keys\",\n keys: unrecognized,\n input,\n inst,\n });\n }\n if (!proms.length)\n return payload;\n return Promise.all(proms).then(() => {\n return payload;\n });\n}\nexport const $ZodObject = /*@__PURE__*/ core.$constructor(\"$ZodObject\", (inst, def) => {\n // requires cast because technically $ZodObject doesn't extend\n $ZodType.init(inst, def);\n // const sh = def.shape;\n const desc = Object.getOwnPropertyDescriptor(def, \"shape\");\n if (!desc?.get) {\n const sh = def.shape;\n Object.defineProperty(def, \"shape\", {\n get: () => {\n const newSh = { ...sh };\n Object.defineProperty(def, \"shape\", {\n value: newSh,\n });\n return newSh;\n },\n });\n }\n const _normalized = util.cached(() => normalizeDef(def));\n util.defineLazy(inst._zod, \"propValues\", () => {\n const shape = def.shape;\n const propValues = {};\n for (const key in shape) {\n const field = shape[key]._zod;\n if (field.values) {\n propValues[key] ?? (propValues[key] = new Set());\n for (const v of field.values)\n propValues[key].add(v);\n }\n }\n return propValues;\n });\n const isObject = util.isObject;\n const catchall = def.catchall;\n let value;\n inst._zod.parse = (payload, ctx) => {\n value ?? (value = _normalized.value);\n const input = payload.value;\n if (!isObject(input)) {\n payload.issues.push({\n expected: \"object\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n }\n payload.value = {};\n const proms = [];\n const shape = value.shape;\n for (const key of value.keys) {\n const el = shape[key];\n const isOptionalOut = el._zod.optout === \"optional\";\n const r = el._zod.run({ value: input[key], issues: [] }, ctx);\n if (r instanceof Promise) {\n proms.push(r.then((r) => handlePropertyResult(r, payload, key, input, isOptionalOut)));\n }\n else {\n handlePropertyResult(r, payload, key, input, isOptionalOut);\n }\n }\n if (!catchall) {\n return proms.length ? Promise.all(proms).then(() => payload) : payload;\n }\n return handleCatchall(proms, input, payload, ctx, _normalized.value, inst);\n };\n});\nexport const $ZodObjectJIT = /*@__PURE__*/ core.$constructor(\"$ZodObjectJIT\", (inst, def) => {\n // requires cast because technically $ZodObject doesn't extend\n $ZodObject.init(inst, def);\n const superParse = inst._zod.parse;\n const _normalized = util.cached(() => normalizeDef(def));\n const generateFastpass = (shape) => {\n const doc = new Doc([\"shape\", \"payload\", \"ctx\"]);\n const normalized = _normalized.value;\n const parseStr = (key) => {\n const k = util.esc(key);\n return `shape[${k}]._zod.run({ value: input[${k}], issues: [] }, ctx)`;\n };\n doc.write(`const input = payload.value;`);\n const ids = Object.create(null);\n let counter = 0;\n for (const key of normalized.keys) {\n ids[key] = `key_${counter++}`;\n }\n // A: preserve key order {\n doc.write(`const newResult = {};`);\n for (const key of normalized.keys) {\n const id = ids[key];\n const k = util.esc(key);\n const schema = shape[key];\n const isOptionalOut = schema?._zod?.optout === \"optional\";\n doc.write(`const ${id} = ${parseStr(key)};`);\n if (isOptionalOut) {\n // For optional-out schemas, ignore errors on absent keys\n doc.write(`\n if (${id}.issues.length) {\n if (${k} in input) {\n payload.issues = payload.issues.concat(${id}.issues.map(iss => ({\n ...iss,\n path: iss.path ? [${k}, ...iss.path] : [${k}]\n })));\n }\n }\n \n if (${id}.value === undefined) {\n if (${k} in input) {\n newResult[${k}] = undefined;\n }\n } else {\n newResult[${k}] = ${id}.value;\n }\n \n `);\n }\n else {\n doc.write(`\n if (${id}.issues.length) {\n payload.issues = payload.issues.concat(${id}.issues.map(iss => ({\n ...iss,\n path: iss.path ? [${k}, ...iss.path] : [${k}]\n })));\n }\n \n if (${id}.value === undefined) {\n if (${k} in input) {\n newResult[${k}] = undefined;\n }\n } else {\n newResult[${k}] = ${id}.value;\n }\n \n `);\n }\n }\n doc.write(`payload.value = newResult;`);\n doc.write(`return payload;`);\n const fn = doc.compile();\n return (payload, ctx) => fn(shape, payload, ctx);\n };\n let fastpass;\n const isObject = util.isObject;\n const jit = !core.globalConfig.jitless;\n const allowsEval = util.allowsEval;\n const fastEnabled = jit && allowsEval.value; // && !def.catchall;\n const catchall = def.catchall;\n let value;\n inst._zod.parse = (payload, ctx) => {\n value ?? (value = _normalized.value);\n const input = payload.value;\n if (!isObject(input)) {\n payload.issues.push({\n expected: \"object\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n }\n if (jit && fastEnabled && ctx?.async === false && ctx.jitless !== true) {\n // always synchronous\n if (!fastpass)\n fastpass = generateFastpass(def.shape);\n payload = fastpass(payload, ctx);\n if (!catchall)\n return payload;\n return handleCatchall([], input, payload, ctx, value, inst);\n }\n return superParse(payload, ctx);\n };\n});\nfunction handleUnionResults(results, final, inst, ctx) {\n for (const result of results) {\n if (result.issues.length === 0) {\n final.value = result.value;\n return final;\n }\n }\n const nonaborted = results.filter((r) => !util.aborted(r));\n if (nonaborted.length === 1) {\n final.value = nonaborted[0].value;\n return nonaborted[0];\n }\n final.issues.push({\n code: \"invalid_union\",\n input: final.value,\n inst,\n errors: results.map((result) => result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config()))),\n });\n return final;\n}\nexport const $ZodUnion = /*@__PURE__*/ core.$constructor(\"$ZodUnion\", (inst, def) => {\n $ZodType.init(inst, def);\n util.defineLazy(inst._zod, \"optin\", () => def.options.some((o) => o._zod.optin === \"optional\") ? \"optional\" : undefined);\n util.defineLazy(inst._zod, \"optout\", () => def.options.some((o) => o._zod.optout === \"optional\") ? \"optional\" : undefined);\n util.defineLazy(inst._zod, \"values\", () => {\n if (def.options.every((o) => o._zod.values)) {\n return new Set(def.options.flatMap((option) => Array.from(option._zod.values)));\n }\n return undefined;\n });\n util.defineLazy(inst._zod, \"pattern\", () => {\n if (def.options.every((o) => o._zod.pattern)) {\n const patterns = def.options.map((o) => o._zod.pattern);\n return new RegExp(`^(${patterns.map((p) => util.cleanRegex(p.source)).join(\"|\")})$`);\n }\n return undefined;\n });\n const single = def.options.length === 1;\n const first = def.options[0]._zod.run;\n inst._zod.parse = (payload, ctx) => {\n if (single) {\n return first(payload, ctx);\n }\n let async = false;\n const results = [];\n for (const option of def.options) {\n const result = option._zod.run({\n value: payload.value,\n issues: [],\n }, ctx);\n if (result instanceof Promise) {\n results.push(result);\n async = true;\n }\n else {\n if (result.issues.length === 0)\n return result;\n results.push(result);\n }\n }\n if (!async)\n return handleUnionResults(results, payload, inst, ctx);\n return Promise.all(results).then((results) => {\n return handleUnionResults(results, payload, inst, ctx);\n });\n };\n});\nfunction handleExclusiveUnionResults(results, final, inst, ctx) {\n const successes = results.filter((r) => r.issues.length === 0);\n if (successes.length === 1) {\n final.value = successes[0].value;\n return final;\n }\n if (successes.length === 0) {\n // No matches - same as regular union\n final.issues.push({\n code: \"invalid_union\",\n input: final.value,\n inst,\n errors: results.map((result) => result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config()))),\n });\n }\n else {\n // Multiple matches - exclusive union failure\n final.issues.push({\n code: \"invalid_union\",\n input: final.value,\n inst,\n errors: [],\n inclusive: false,\n });\n }\n return final;\n}\nexport const $ZodXor = /*@__PURE__*/ core.$constructor(\"$ZodXor\", (inst, def) => {\n $ZodUnion.init(inst, def);\n def.inclusive = false;\n const single = def.options.length === 1;\n const first = def.options[0]._zod.run;\n inst._zod.parse = (payload, ctx) => {\n if (single) {\n return first(payload, ctx);\n }\n let async = false;\n const results = [];\n for (const option of def.options) {\n const result = option._zod.run({\n value: payload.value,\n issues: [],\n }, ctx);\n if (result instanceof Promise) {\n results.push(result);\n async = true;\n }\n else {\n results.push(result);\n }\n }\n if (!async)\n return handleExclusiveUnionResults(results, payload, inst, ctx);\n return Promise.all(results).then((results) => {\n return handleExclusiveUnionResults(results, payload, inst, ctx);\n });\n };\n});\nexport const $ZodDiscriminatedUnion = \n/*@__PURE__*/\ncore.$constructor(\"$ZodDiscriminatedUnion\", (inst, def) => {\n def.inclusive = false;\n $ZodUnion.init(inst, def);\n const _super = inst._zod.parse;\n util.defineLazy(inst._zod, \"propValues\", () => {\n const propValues = {};\n for (const option of def.options) {\n const pv = option._zod.propValues;\n if (!pv || Object.keys(pv).length === 0)\n throw new Error(`Invalid discriminated union option at index \"${def.options.indexOf(option)}\"`);\n for (const [k, v] of Object.entries(pv)) {\n if (!propValues[k])\n propValues[k] = new Set();\n for (const val of v) {\n propValues[k].add(val);\n }\n }\n }\n return propValues;\n });\n const disc = util.cached(() => {\n const opts = def.options;\n const map = new Map();\n for (const o of opts) {\n const values = o._zod.propValues?.[def.discriminator];\n if (!values || values.size === 0)\n throw new Error(`Invalid discriminated union option at index \"${def.options.indexOf(o)}\"`);\n for (const v of values) {\n if (map.has(v)) {\n throw new Error(`Duplicate discriminator value \"${String(v)}\"`);\n }\n map.set(v, o);\n }\n }\n return map;\n });\n inst._zod.parse = (payload, ctx) => {\n const input = payload.value;\n if (!util.isObject(input)) {\n payload.issues.push({\n code: \"invalid_type\",\n expected: \"object\",\n input,\n inst,\n });\n return payload;\n }\n const opt = disc.value.get(input?.[def.discriminator]);\n if (opt) {\n return opt._zod.run(payload, ctx);\n }\n if (def.unionFallback) {\n return _super(payload, ctx);\n }\n // no matching discriminator\n payload.issues.push({\n code: \"invalid_union\",\n errors: [],\n note: \"No matching discriminator\",\n discriminator: def.discriminator,\n input,\n path: [def.discriminator],\n inst,\n });\n return payload;\n };\n});\nexport const $ZodIntersection = /*@__PURE__*/ core.$constructor(\"$ZodIntersection\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, ctx) => {\n const input = payload.value;\n const left = def.left._zod.run({ value: input, issues: [] }, ctx);\n const right = def.right._zod.run({ value: input, issues: [] }, ctx);\n const async = left instanceof Promise || right instanceof Promise;\n if (async) {\n return Promise.all([left, right]).then(([left, right]) => {\n return handleIntersectionResults(payload, left, right);\n });\n }\n return handleIntersectionResults(payload, left, right);\n };\n});\nfunction mergeValues(a, b) {\n // const aType = parse.t(a);\n // const bType = parse.t(b);\n if (a === b) {\n return { valid: true, data: a };\n }\n if (a instanceof Date && b instanceof Date && +a === +b) {\n return { valid: true, data: a };\n }\n if (util.isPlainObject(a) && util.isPlainObject(b)) {\n const bKeys = Object.keys(b);\n const sharedKeys = Object.keys(a).filter((key) => bKeys.indexOf(key) !== -1);\n const newObj = { ...a, ...b };\n for (const key of sharedKeys) {\n const sharedValue = mergeValues(a[key], b[key]);\n if (!sharedValue.valid) {\n return {\n valid: false,\n mergeErrorPath: [key, ...sharedValue.mergeErrorPath],\n };\n }\n newObj[key] = sharedValue.data;\n }\n return { valid: true, data: newObj };\n }\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) {\n return { valid: false, mergeErrorPath: [] };\n }\n const newArray = [];\n for (let index = 0; index < a.length; index++) {\n const itemA = a[index];\n const itemB = b[index];\n const sharedValue = mergeValues(itemA, itemB);\n if (!sharedValue.valid) {\n return {\n valid: false,\n mergeErrorPath: [index, ...sharedValue.mergeErrorPath],\n };\n }\n newArray.push(sharedValue.data);\n }\n return { valid: true, data: newArray };\n }\n return { valid: false, mergeErrorPath: [] };\n}\nfunction handleIntersectionResults(result, left, right) {\n // Track which side(s) report each key as unrecognized\n const unrecKeys = new Map();\n let unrecIssue;\n for (const iss of left.issues) {\n if (iss.code === \"unrecognized_keys\") {\n unrecIssue ?? (unrecIssue = iss);\n for (const k of iss.keys) {\n if (!unrecKeys.has(k))\n unrecKeys.set(k, {});\n unrecKeys.get(k).l = true;\n }\n }\n else {\n result.issues.push(iss);\n }\n }\n for (const iss of right.issues) {\n if (iss.code === \"unrecognized_keys\") {\n for (const k of iss.keys) {\n if (!unrecKeys.has(k))\n unrecKeys.set(k, {});\n unrecKeys.get(k).r = true;\n }\n }\n else {\n result.issues.push(iss);\n }\n }\n // Report only keys unrecognized by BOTH sides\n const bothKeys = [...unrecKeys].filter(([, f]) => f.l && f.r).map(([k]) => k);\n if (bothKeys.length && unrecIssue) {\n result.issues.push({ ...unrecIssue, keys: bothKeys });\n }\n if (util.aborted(result))\n return result;\n const merged = mergeValues(left.value, right.value);\n if (!merged.valid) {\n throw new Error(`Unmergable intersection. Error path: ` + `${JSON.stringify(merged.mergeErrorPath)}`);\n }\n result.value = merged.data;\n return result;\n}\nexport const $ZodTuple = /*@__PURE__*/ core.$constructor(\"$ZodTuple\", (inst, def) => {\n $ZodType.init(inst, def);\n const items = def.items;\n inst._zod.parse = (payload, ctx) => {\n const input = payload.value;\n if (!Array.isArray(input)) {\n payload.issues.push({\n input,\n inst,\n expected: \"tuple\",\n code: \"invalid_type\",\n });\n return payload;\n }\n payload.value = [];\n const proms = [];\n const reversedIndex = [...items].reverse().findIndex((item) => item._zod.optin !== \"optional\");\n const optStart = reversedIndex === -1 ? 0 : items.length - reversedIndex;\n if (!def.rest) {\n const tooBig = input.length > items.length;\n const tooSmall = input.length < optStart - 1;\n if (tooBig || tooSmall) {\n payload.issues.push({\n ...(tooBig\n ? { code: \"too_big\", maximum: items.length, inclusive: true }\n : { code: \"too_small\", minimum: items.length }),\n input,\n inst,\n origin: \"array\",\n });\n return payload;\n }\n }\n let i = -1;\n for (const item of items) {\n i++;\n if (i >= input.length)\n if (i >= optStart)\n continue;\n const result = item._zod.run({\n value: input[i],\n issues: [],\n }, ctx);\n if (result instanceof Promise) {\n proms.push(result.then((result) => handleTupleResult(result, payload, i)));\n }\n else {\n handleTupleResult(result, payload, i);\n }\n }\n if (def.rest) {\n const rest = input.slice(items.length);\n for (const el of rest) {\n i++;\n const result = def.rest._zod.run({\n value: el,\n issues: [],\n }, ctx);\n if (result instanceof Promise) {\n proms.push(result.then((result) => handleTupleResult(result, payload, i)));\n }\n else {\n handleTupleResult(result, payload, i);\n }\n }\n }\n if (proms.length)\n return Promise.all(proms).then(() => payload);\n return payload;\n };\n});\nfunction handleTupleResult(result, final, index) {\n if (result.issues.length) {\n final.issues.push(...util.prefixIssues(index, result.issues));\n }\n final.value[index] = result.value;\n}\nexport const $ZodRecord = /*@__PURE__*/ core.$constructor(\"$ZodRecord\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, ctx) => {\n const input = payload.value;\n if (!util.isPlainObject(input)) {\n payload.issues.push({\n expected: \"record\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n }\n const proms = [];\n const values = def.keyType._zod.values;\n if (values) {\n payload.value = {};\n const recordKeys = new Set();\n for (const key of values) {\n if (typeof key === \"string\" || typeof key === \"number\" || typeof key === \"symbol\") {\n recordKeys.add(typeof key === \"number\" ? key.toString() : key);\n const result = def.valueType._zod.run({ value: input[key], issues: [] }, ctx);\n if (result instanceof Promise) {\n proms.push(result.then((result) => {\n if (result.issues.length) {\n payload.issues.push(...util.prefixIssues(key, result.issues));\n }\n payload.value[key] = result.value;\n }));\n }\n else {\n if (result.issues.length) {\n payload.issues.push(...util.prefixIssues(key, result.issues));\n }\n payload.value[key] = result.value;\n }\n }\n }\n let unrecognized;\n for (const key in input) {\n if (!recordKeys.has(key)) {\n unrecognized = unrecognized ?? [];\n unrecognized.push(key);\n }\n }\n if (unrecognized && unrecognized.length > 0) {\n payload.issues.push({\n code: \"unrecognized_keys\",\n input,\n inst,\n keys: unrecognized,\n });\n }\n }\n else {\n payload.value = {};\n for (const key of Reflect.ownKeys(input)) {\n if (key === \"__proto__\")\n continue;\n let keyResult = def.keyType._zod.run({ value: key, issues: [] }, ctx);\n if (keyResult instanceof Promise) {\n throw new Error(\"Async schemas not supported in object keys currently\");\n }\n // Numeric string fallback: if key is a numeric string and failed, retry with Number(key)\n // This handles z.number(), z.literal([1, 2, 3]), and unions containing numeric literals\n const checkNumericKey = typeof key === \"string\" && regexes.number.test(key) && keyResult.issues.length;\n if (checkNumericKey) {\n const retryResult = def.keyType._zod.run({ value: Number(key), issues: [] }, ctx);\n if (retryResult instanceof Promise) {\n throw new Error(\"Async schemas not supported in object keys currently\");\n }\n if (retryResult.issues.length === 0) {\n keyResult = retryResult;\n }\n }\n if (keyResult.issues.length) {\n if (def.mode === \"loose\") {\n // Pass through unchanged\n payload.value[key] = input[key];\n }\n else {\n // Default \"strict\" behavior: error on invalid key\n payload.issues.push({\n code: \"invalid_key\",\n origin: \"record\",\n issues: keyResult.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())),\n input: key,\n path: [key],\n inst,\n });\n }\n continue;\n }\n const result = def.valueType._zod.run({ value: input[key], issues: [] }, ctx);\n if (result instanceof Promise) {\n proms.push(result.then((result) => {\n if (result.issues.length) {\n payload.issues.push(...util.prefixIssues(key, result.issues));\n }\n payload.value[keyResult.value] = result.value;\n }));\n }\n else {\n if (result.issues.length) {\n payload.issues.push(...util.prefixIssues(key, result.issues));\n }\n payload.value[keyResult.value] = result.value;\n }\n }\n }\n if (proms.length) {\n return Promise.all(proms).then(() => payload);\n }\n return payload;\n };\n});\nexport const $ZodMap = /*@__PURE__*/ core.$constructor(\"$ZodMap\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, ctx) => {\n const input = payload.value;\n if (!(input instanceof Map)) {\n payload.issues.push({\n expected: \"map\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n }\n const proms = [];\n payload.value = new Map();\n for (const [key, value] of input) {\n const keyResult = def.keyType._zod.run({ value: key, issues: [] }, ctx);\n const valueResult = def.valueType._zod.run({ value: value, issues: [] }, ctx);\n if (keyResult instanceof Promise || valueResult instanceof Promise) {\n proms.push(Promise.all([keyResult, valueResult]).then(([keyResult, valueResult]) => {\n handleMapResult(keyResult, valueResult, payload, key, input, inst, ctx);\n }));\n }\n else {\n handleMapResult(keyResult, valueResult, payload, key, input, inst, ctx);\n }\n }\n if (proms.length)\n return Promise.all(proms).then(() => payload);\n return payload;\n };\n});\nfunction handleMapResult(keyResult, valueResult, final, key, input, inst, ctx) {\n if (keyResult.issues.length) {\n if (util.propertyKeyTypes.has(typeof key)) {\n final.issues.push(...util.prefixIssues(key, keyResult.issues));\n }\n else {\n final.issues.push({\n code: \"invalid_key\",\n origin: \"map\",\n input,\n inst,\n issues: keyResult.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())),\n });\n }\n }\n if (valueResult.issues.length) {\n if (util.propertyKeyTypes.has(typeof key)) {\n final.issues.push(...util.prefixIssues(key, valueResult.issues));\n }\n else {\n final.issues.push({\n origin: \"map\",\n code: \"invalid_element\",\n input,\n inst,\n key: key,\n issues: valueResult.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())),\n });\n }\n }\n final.value.set(keyResult.value, valueResult.value);\n}\nexport const $ZodSet = /*@__PURE__*/ core.$constructor(\"$ZodSet\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, ctx) => {\n const input = payload.value;\n if (!(input instanceof Set)) {\n payload.issues.push({\n input,\n inst,\n expected: \"set\",\n code: \"invalid_type\",\n });\n return payload;\n }\n const proms = [];\n payload.value = new Set();\n for (const item of input) {\n const result = def.valueType._zod.run({ value: item, issues: [] }, ctx);\n if (result instanceof Promise) {\n proms.push(result.then((result) => handleSetResult(result, payload)));\n }\n else\n handleSetResult(result, payload);\n }\n if (proms.length)\n return Promise.all(proms).then(() => payload);\n return payload;\n };\n});\nfunction handleSetResult(result, final) {\n if (result.issues.length) {\n final.issues.push(...result.issues);\n }\n final.value.add(result.value);\n}\nexport const $ZodEnum = /*@__PURE__*/ core.$constructor(\"$ZodEnum\", (inst, def) => {\n $ZodType.init(inst, def);\n const values = util.getEnumValues(def.entries);\n const valuesSet = new Set(values);\n inst._zod.values = valuesSet;\n inst._zod.pattern = new RegExp(`^(${values\n .filter((k) => util.propertyKeyTypes.has(typeof k))\n .map((o) => (typeof o === \"string\" ? util.escapeRegex(o) : o.toString()))\n .join(\"|\")})$`);\n inst._zod.parse = (payload, _ctx) => {\n const input = payload.value;\n if (valuesSet.has(input)) {\n return payload;\n }\n payload.issues.push({\n code: \"invalid_value\",\n values,\n input,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodLiteral = /*@__PURE__*/ core.$constructor(\"$ZodLiteral\", (inst, def) => {\n $ZodType.init(inst, def);\n if (def.values.length === 0) {\n throw new Error(\"Cannot create literal schema with no valid values\");\n }\n const values = new Set(def.values);\n inst._zod.values = values;\n inst._zod.pattern = new RegExp(`^(${def.values\n .map((o) => (typeof o === \"string\" ? util.escapeRegex(o) : o ? util.escapeRegex(o.toString()) : String(o)))\n .join(\"|\")})$`);\n inst._zod.parse = (payload, _ctx) => {\n const input = payload.value;\n if (values.has(input)) {\n return payload;\n }\n payload.issues.push({\n code: \"invalid_value\",\n values: def.values,\n input,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodFile = /*@__PURE__*/ core.$constructor(\"$ZodFile\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, _ctx) => {\n const input = payload.value;\n // @ts-ignore\n if (input instanceof File)\n return payload;\n payload.issues.push({\n expected: \"file\",\n code: \"invalid_type\",\n input,\n inst,\n });\n return payload;\n };\n});\nexport const $ZodTransform = /*@__PURE__*/ core.$constructor(\"$ZodTransform\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, ctx) => {\n if (ctx.direction === \"backward\") {\n throw new core.$ZodEncodeError(inst.constructor.name);\n }\n const _out = def.transform(payload.value, payload);\n if (ctx.async) {\n const output = _out instanceof Promise ? _out : Promise.resolve(_out);\n return output.then((output) => {\n payload.value = output;\n return payload;\n });\n }\n if (_out instanceof Promise) {\n throw new core.$ZodAsyncError();\n }\n payload.value = _out;\n return payload;\n };\n});\nfunction handleOptionalResult(result, input) {\n if (result.issues.length && input === undefined) {\n return { issues: [], value: undefined };\n }\n return result;\n}\nexport const $ZodOptional = /*@__PURE__*/ core.$constructor(\"$ZodOptional\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.optin = \"optional\";\n inst._zod.optout = \"optional\";\n util.defineLazy(inst._zod, \"values\", () => {\n return def.innerType._zod.values ? new Set([...def.innerType._zod.values, undefined]) : undefined;\n });\n util.defineLazy(inst._zod, \"pattern\", () => {\n const pattern = def.innerType._zod.pattern;\n return pattern ? new RegExp(`^(${util.cleanRegex(pattern.source)})?$`) : undefined;\n });\n inst._zod.parse = (payload, ctx) => {\n if (def.innerType._zod.optin === \"optional\") {\n const result = def.innerType._zod.run(payload, ctx);\n if (result instanceof Promise)\n return result.then((r) => handleOptionalResult(r, payload.value));\n return handleOptionalResult(result, payload.value);\n }\n if (payload.value === undefined) {\n return payload;\n }\n return def.innerType._zod.run(payload, ctx);\n };\n});\nexport const $ZodExactOptional = /*@__PURE__*/ core.$constructor(\"$ZodExactOptional\", (inst, def) => {\n // Call parent init - inherits optin/optout = \"optional\"\n $ZodOptional.init(inst, def);\n // Override values/pattern to NOT add undefined\n util.defineLazy(inst._zod, \"values\", () => def.innerType._zod.values);\n util.defineLazy(inst._zod, \"pattern\", () => def.innerType._zod.pattern);\n // Override parse to just delegate (no undefined handling)\n inst._zod.parse = (payload, ctx) => {\n return def.innerType._zod.run(payload, ctx);\n };\n});\nexport const $ZodNullable = /*@__PURE__*/ core.$constructor(\"$ZodNullable\", (inst, def) => {\n $ZodType.init(inst, def);\n util.defineLazy(inst._zod, \"optin\", () => def.innerType._zod.optin);\n util.defineLazy(inst._zod, \"optout\", () => def.innerType._zod.optout);\n util.defineLazy(inst._zod, \"pattern\", () => {\n const pattern = def.innerType._zod.pattern;\n return pattern ? new RegExp(`^(${util.cleanRegex(pattern.source)}|null)$`) : undefined;\n });\n util.defineLazy(inst._zod, \"values\", () => {\n return def.innerType._zod.values ? new Set([...def.innerType._zod.values, null]) : undefined;\n });\n inst._zod.parse = (payload, ctx) => {\n // Forward direction (decode): allow null to pass through\n if (payload.value === null)\n return payload;\n return def.innerType._zod.run(payload, ctx);\n };\n});\nexport const $ZodDefault = /*@__PURE__*/ core.$constructor(\"$ZodDefault\", (inst, def) => {\n $ZodType.init(inst, def);\n // inst._zod.qin = \"true\";\n inst._zod.optin = \"optional\";\n util.defineLazy(inst._zod, \"values\", () => def.innerType._zod.values);\n inst._zod.parse = (payload, ctx) => {\n if (ctx.direction === \"backward\") {\n return def.innerType._zod.run(payload, ctx);\n }\n // Forward direction (decode): apply defaults for undefined input\n if (payload.value === undefined) {\n payload.value = def.defaultValue;\n /**\n * $ZodDefault returns the default value immediately in forward direction.\n * It doesn't pass the default value into the validator (\"prefault\"). There's no reason to pass the default value through validation. The validity of the default is enforced by TypeScript statically. Otherwise, it's the responsibility of the user to ensure the default is valid. In the case of pipes with divergent in/out types, you can specify the default on the `in` schema of your ZodPipe to set a \"prefault\" for the pipe. */\n return payload;\n }\n // Forward direction: continue with default handling\n const result = def.innerType._zod.run(payload, ctx);\n if (result instanceof Promise) {\n return result.then((result) => handleDefaultResult(result, def));\n }\n return handleDefaultResult(result, def);\n };\n});\nfunction handleDefaultResult(payload, def) {\n if (payload.value === undefined) {\n payload.value = def.defaultValue;\n }\n return payload;\n}\nexport const $ZodPrefault = /*@__PURE__*/ core.$constructor(\"$ZodPrefault\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.optin = \"optional\";\n util.defineLazy(inst._zod, \"values\", () => def.innerType._zod.values);\n inst._zod.parse = (payload, ctx) => {\n if (ctx.direction === \"backward\") {\n return def.innerType._zod.run(payload, ctx);\n }\n // Forward direction (decode): apply prefault for undefined input\n if (payload.value === undefined) {\n payload.value = def.defaultValue;\n }\n return def.innerType._zod.run(payload, ctx);\n };\n});\nexport const $ZodNonOptional = /*@__PURE__*/ core.$constructor(\"$ZodNonOptional\", (inst, def) => {\n $ZodType.init(inst, def);\n util.defineLazy(inst._zod, \"values\", () => {\n const v = def.innerType._zod.values;\n return v ? new Set([...v].filter((x) => x !== undefined)) : undefined;\n });\n inst._zod.parse = (payload, ctx) => {\n const result = def.innerType._zod.run(payload, ctx);\n if (result instanceof Promise) {\n return result.then((result) => handleNonOptionalResult(result, inst));\n }\n return handleNonOptionalResult(result, inst);\n };\n});\nfunction handleNonOptionalResult(payload, inst) {\n if (!payload.issues.length && payload.value === undefined) {\n payload.issues.push({\n code: \"invalid_type\",\n expected: \"nonoptional\",\n input: payload.value,\n inst,\n });\n }\n return payload;\n}\nexport const $ZodSuccess = /*@__PURE__*/ core.$constructor(\"$ZodSuccess\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, ctx) => {\n if (ctx.direction === \"backward\") {\n throw new core.$ZodEncodeError(\"ZodSuccess\");\n }\n const result = def.innerType._zod.run(payload, ctx);\n if (result instanceof Promise) {\n return result.then((result) => {\n payload.value = result.issues.length === 0;\n return payload;\n });\n }\n payload.value = result.issues.length === 0;\n return payload;\n };\n});\nexport const $ZodCatch = /*@__PURE__*/ core.$constructor(\"$ZodCatch\", (inst, def) => {\n $ZodType.init(inst, def);\n util.defineLazy(inst._zod, \"optin\", () => def.innerType._zod.optin);\n util.defineLazy(inst._zod, \"optout\", () => def.innerType._zod.optout);\n util.defineLazy(inst._zod, \"values\", () => def.innerType._zod.values);\n inst._zod.parse = (payload, ctx) => {\n if (ctx.direction === \"backward\") {\n return def.innerType._zod.run(payload, ctx);\n }\n // Forward direction (decode): apply catch logic\n const result = def.innerType._zod.run(payload, ctx);\n if (result instanceof Promise) {\n return result.then((result) => {\n payload.value = result.value;\n if (result.issues.length) {\n payload.value = def.catchValue({\n ...payload,\n error: {\n issues: result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())),\n },\n input: payload.value,\n });\n payload.issues = [];\n }\n return payload;\n });\n }\n payload.value = result.value;\n if (result.issues.length) {\n payload.value = def.catchValue({\n ...payload,\n error: {\n issues: result.issues.map((iss) => util.finalizeIssue(iss, ctx, core.config())),\n },\n input: payload.value,\n });\n payload.issues = [];\n }\n return payload;\n };\n});\nexport const $ZodNaN = /*@__PURE__*/ core.$constructor(\"$ZodNaN\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, _ctx) => {\n if (typeof payload.value !== \"number\" || !Number.isNaN(payload.value)) {\n payload.issues.push({\n input: payload.value,\n inst,\n expected: \"nan\",\n code: \"invalid_type\",\n });\n return payload;\n }\n return payload;\n };\n});\nexport const $ZodPipe = /*@__PURE__*/ core.$constructor(\"$ZodPipe\", (inst, def) => {\n $ZodType.init(inst, def);\n util.defineLazy(inst._zod, \"values\", () => def.in._zod.values);\n util.defineLazy(inst._zod, \"optin\", () => def.in._zod.optin);\n util.defineLazy(inst._zod, \"optout\", () => def.out._zod.optout);\n util.defineLazy(inst._zod, \"propValues\", () => def.in._zod.propValues);\n inst._zod.parse = (payload, ctx) => {\n if (ctx.direction === \"backward\") {\n const right = def.out._zod.run(payload, ctx);\n if (right instanceof Promise) {\n return right.then((right) => handlePipeResult(right, def.in, ctx));\n }\n return handlePipeResult(right, def.in, ctx);\n }\n const left = def.in._zod.run(payload, ctx);\n if (left instanceof Promise) {\n return left.then((left) => handlePipeResult(left, def.out, ctx));\n }\n return handlePipeResult(left, def.out, ctx);\n };\n});\nfunction handlePipeResult(left, next, ctx) {\n if (left.issues.length) {\n // prevent further checks\n left.aborted = true;\n return left;\n }\n return next._zod.run({ value: left.value, issues: left.issues }, ctx);\n}\nexport const $ZodCodec = /*@__PURE__*/ core.$constructor(\"$ZodCodec\", (inst, def) => {\n $ZodType.init(inst, def);\n util.defineLazy(inst._zod, \"values\", () => def.in._zod.values);\n util.defineLazy(inst._zod, \"optin\", () => def.in._zod.optin);\n util.defineLazy(inst._zod, \"optout\", () => def.out._zod.optout);\n util.defineLazy(inst._zod, \"propValues\", () => def.in._zod.propValues);\n inst._zod.parse = (payload, ctx) => {\n const direction = ctx.direction || \"forward\";\n if (direction === \"forward\") {\n const left = def.in._zod.run(payload, ctx);\n if (left instanceof Promise) {\n return left.then((left) => handleCodecAResult(left, def, ctx));\n }\n return handleCodecAResult(left, def, ctx);\n }\n else {\n const right = def.out._zod.run(payload, ctx);\n if (right instanceof Promise) {\n return right.then((right) => handleCodecAResult(right, def, ctx));\n }\n return handleCodecAResult(right, def, ctx);\n }\n };\n});\nfunction handleCodecAResult(result, def, ctx) {\n if (result.issues.length) {\n // prevent further checks\n result.aborted = true;\n return result;\n }\n const direction = ctx.direction || \"forward\";\n if (direction === \"forward\") {\n const transformed = def.transform(result.value, result);\n if (transformed instanceof Promise) {\n return transformed.then((value) => handleCodecTxResult(result, value, def.out, ctx));\n }\n return handleCodecTxResult(result, transformed, def.out, ctx);\n }\n else {\n const transformed = def.reverseTransform(result.value, result);\n if (transformed instanceof Promise) {\n return transformed.then((value) => handleCodecTxResult(result, value, def.in, ctx));\n }\n return handleCodecTxResult(result, transformed, def.in, ctx);\n }\n}\nfunction handleCodecTxResult(left, value, nextSchema, ctx) {\n // Check if transform added any issues\n if (left.issues.length) {\n left.aborted = true;\n return left;\n }\n return nextSchema._zod.run({ value, issues: left.issues }, ctx);\n}\nexport const $ZodReadonly = /*@__PURE__*/ core.$constructor(\"$ZodReadonly\", (inst, def) => {\n $ZodType.init(inst, def);\n util.defineLazy(inst._zod, \"propValues\", () => def.innerType._zod.propValues);\n util.defineLazy(inst._zod, \"values\", () => def.innerType._zod.values);\n util.defineLazy(inst._zod, \"optin\", () => def.innerType?._zod?.optin);\n util.defineLazy(inst._zod, \"optout\", () => def.innerType?._zod?.optout);\n inst._zod.parse = (payload, ctx) => {\n if (ctx.direction === \"backward\") {\n return def.innerType._zod.run(payload, ctx);\n }\n const result = def.innerType._zod.run(payload, ctx);\n if (result instanceof Promise) {\n return result.then(handleReadonlyResult);\n }\n return handleReadonlyResult(result);\n };\n});\nfunction handleReadonlyResult(payload) {\n payload.value = Object.freeze(payload.value);\n return payload;\n}\nexport const $ZodTemplateLiteral = /*@__PURE__*/ core.$constructor(\"$ZodTemplateLiteral\", (inst, def) => {\n $ZodType.init(inst, def);\n const regexParts = [];\n for (const part of def.parts) {\n if (typeof part === \"object\" && part !== null) {\n // is Zod schema\n if (!part._zod.pattern) {\n // if (!source)\n throw new Error(`Invalid template literal part, no pattern found: ${[...part._zod.traits].shift()}`);\n }\n const source = part._zod.pattern instanceof RegExp ? part._zod.pattern.source : part._zod.pattern;\n if (!source)\n throw new Error(`Invalid template literal part: ${part._zod.traits}`);\n const start = source.startsWith(\"^\") ? 1 : 0;\n const end = source.endsWith(\"$\") ? source.length - 1 : source.length;\n regexParts.push(source.slice(start, end));\n }\n else if (part === null || util.primitiveTypes.has(typeof part)) {\n regexParts.push(util.escapeRegex(`${part}`));\n }\n else {\n throw new Error(`Invalid template literal part: ${part}`);\n }\n }\n inst._zod.pattern = new RegExp(`^${regexParts.join(\"\")}$`);\n inst._zod.parse = (payload, _ctx) => {\n if (typeof payload.value !== \"string\") {\n payload.issues.push({\n input: payload.value,\n inst,\n expected: \"string\",\n code: \"invalid_type\",\n });\n return payload;\n }\n inst._zod.pattern.lastIndex = 0;\n if (!inst._zod.pattern.test(payload.value)) {\n payload.issues.push({\n input: payload.value,\n inst,\n code: \"invalid_format\",\n format: def.format ?? \"template_literal\",\n pattern: inst._zod.pattern.source,\n });\n return payload;\n }\n return payload;\n };\n});\nexport const $ZodFunction = /*@__PURE__*/ core.$constructor(\"$ZodFunction\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._def = def;\n inst._zod.def = def;\n inst.implement = (func) => {\n if (typeof func !== \"function\") {\n throw new Error(\"implement() must be called with a function\");\n }\n return function (...args) {\n const parsedArgs = inst._def.input ? parse(inst._def.input, args) : args;\n const result = Reflect.apply(func, this, parsedArgs);\n if (inst._def.output) {\n return parse(inst._def.output, result);\n }\n return result;\n };\n };\n inst.implementAsync = (func) => {\n if (typeof func !== \"function\") {\n throw new Error(\"implementAsync() must be called with a function\");\n }\n return async function (...args) {\n const parsedArgs = inst._def.input ? await parseAsync(inst._def.input, args) : args;\n const result = await Reflect.apply(func, this, parsedArgs);\n if (inst._def.output) {\n return await parseAsync(inst._def.output, result);\n }\n return result;\n };\n };\n inst._zod.parse = (payload, _ctx) => {\n if (typeof payload.value !== \"function\") {\n payload.issues.push({\n code: \"invalid_type\",\n expected: \"function\",\n input: payload.value,\n inst,\n });\n return payload;\n }\n // Check if output is a promise type to determine if we should use async implementation\n const hasPromiseOutput = inst._def.output && inst._def.output._zod.def.type === \"promise\";\n if (hasPromiseOutput) {\n payload.value = inst.implementAsync(payload.value);\n }\n else {\n payload.value = inst.implement(payload.value);\n }\n return payload;\n };\n inst.input = (...args) => {\n const F = inst.constructor;\n if (Array.isArray(args[0])) {\n return new F({\n type: \"function\",\n input: new $ZodTuple({\n type: \"tuple\",\n items: args[0],\n rest: args[1],\n }),\n output: inst._def.output,\n });\n }\n return new F({\n type: \"function\",\n input: args[0],\n output: inst._def.output,\n });\n };\n inst.output = (output) => {\n const F = inst.constructor;\n return new F({\n type: \"function\",\n input: inst._def.input,\n output,\n });\n };\n return inst;\n});\nexport const $ZodPromise = /*@__PURE__*/ core.$constructor(\"$ZodPromise\", (inst, def) => {\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, ctx) => {\n return Promise.resolve(payload.value).then((inner) => def.innerType._zod.run({ value: inner, issues: [] }, ctx));\n };\n});\nexport const $ZodLazy = /*@__PURE__*/ core.$constructor(\"$ZodLazy\", (inst, def) => {\n $ZodType.init(inst, def);\n // let _innerType!: any;\n // util.defineLazy(def, \"getter\", () => {\n // if (!_innerType) {\n // _innerType = def.getter();\n // }\n // return () => _innerType;\n // });\n util.defineLazy(inst._zod, \"innerType\", () => def.getter());\n util.defineLazy(inst._zod, \"pattern\", () => inst._zod.innerType?._zod?.pattern);\n util.defineLazy(inst._zod, \"propValues\", () => inst._zod.innerType?._zod?.propValues);\n util.defineLazy(inst._zod, \"optin\", () => inst._zod.innerType?._zod?.optin ?? undefined);\n util.defineLazy(inst._zod, \"optout\", () => inst._zod.innerType?._zod?.optout ?? undefined);\n inst._zod.parse = (payload, ctx) => {\n const inner = inst._zod.innerType;\n return inner._zod.run(payload, ctx);\n };\n});\nexport const $ZodCustom = /*@__PURE__*/ core.$constructor(\"$ZodCustom\", (inst, def) => {\n checks.$ZodCheck.init(inst, def);\n $ZodType.init(inst, def);\n inst._zod.parse = (payload, _) => {\n return payload;\n };\n inst._zod.check = (payload) => {\n const input = payload.value;\n const r = def.fn(input);\n if (r instanceof Promise) {\n return r.then((r) => handleRefineResult(r, payload, input, inst));\n }\n handleRefineResult(r, payload, input, inst);\n return;\n };\n});\nfunction handleRefineResult(result, payload, input, inst) {\n if (!result) {\n const _iss = {\n code: \"custom\",\n input,\n inst, // incorporates params.error into issue reporting\n path: [...(inst._zod.def.path ?? [])], // incorporates params.error into issue reporting\n continue: !inst._zod.def.abort,\n // params: inst._zod.def.params,\n };\n if (inst._zod.def.params)\n _iss.params = inst._zod.def.params;\n payload.issues.push(util.issue(_iss));\n }\n}\n","var _a;\nexport const $output = Symbol(\"ZodOutput\");\nexport const $input = Symbol(\"ZodInput\");\nexport class $ZodRegistry {\n constructor() {\n this._map = new WeakMap();\n this._idmap = new Map();\n }\n add(schema, ..._meta) {\n const meta = _meta[0];\n this._map.set(schema, meta);\n if (meta && typeof meta === \"object\" && \"id\" in meta) {\n this._idmap.set(meta.id, schema);\n }\n return this;\n }\n clear() {\n this._map = new WeakMap();\n this._idmap = new Map();\n return this;\n }\n remove(schema) {\n const meta = this._map.get(schema);\n if (meta && typeof meta === \"object\" && \"id\" in meta) {\n this._idmap.delete(meta.id);\n }\n this._map.delete(schema);\n return this;\n }\n get(schema) {\n // return this._map.get(schema) as any;\n // inherit metadata\n const p = schema._zod.parent;\n if (p) {\n const pm = { ...(this.get(p) ?? {}) };\n delete pm.id; // do not inherit id\n const f = { ...pm, ...this._map.get(schema) };\n return Object.keys(f).length ? f : undefined;\n }\n return this._map.get(schema);\n }\n has(schema) {\n return this._map.has(schema);\n }\n}\n// registries\nexport function registry() {\n return new $ZodRegistry();\n}\n(_a = globalThis).__zod_globalRegistry ?? (_a.__zod_globalRegistry = registry());\nexport const globalRegistry = globalThis.__zod_globalRegistry;\n","import * as checks from \"./checks.js\";\nimport * as registries from \"./registries.js\";\nimport * as schemas from \"./schemas.js\";\nimport * as util from \"./util.js\";\n// @__NO_SIDE_EFFECTS__\nexport function _string(Class, params) {\n return new Class({\n type: \"string\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _coercedString(Class, params) {\n return new Class({\n type: \"string\",\n coerce: true,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _email(Class, params) {\n return new Class({\n type: \"string\",\n format: \"email\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _guid(Class, params) {\n return new Class({\n type: \"string\",\n format: \"guid\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uuid(Class, params) {\n return new Class({\n type: \"string\",\n format: \"uuid\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uuidv4(Class, params) {\n return new Class({\n type: \"string\",\n format: \"uuid\",\n check: \"string_format\",\n abort: false,\n version: \"v4\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uuidv6(Class, params) {\n return new Class({\n type: \"string\",\n format: \"uuid\",\n check: \"string_format\",\n abort: false,\n version: \"v6\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uuidv7(Class, params) {\n return new Class({\n type: \"string\",\n format: \"uuid\",\n check: \"string_format\",\n abort: false,\n version: \"v7\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _url(Class, params) {\n return new Class({\n type: \"string\",\n format: \"url\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _emoji(Class, params) {\n return new Class({\n type: \"string\",\n format: \"emoji\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _nanoid(Class, params) {\n return new Class({\n type: \"string\",\n format: \"nanoid\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _cuid(Class, params) {\n return new Class({\n type: \"string\",\n format: \"cuid\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _cuid2(Class, params) {\n return new Class({\n type: \"string\",\n format: \"cuid2\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _ulid(Class, params) {\n return new Class({\n type: \"string\",\n format: \"ulid\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _xid(Class, params) {\n return new Class({\n type: \"string\",\n format: \"xid\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _ksuid(Class, params) {\n return new Class({\n type: \"string\",\n format: \"ksuid\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _ipv4(Class, params) {\n return new Class({\n type: \"string\",\n format: \"ipv4\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _ipv6(Class, params) {\n return new Class({\n type: \"string\",\n format: \"ipv6\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _mac(Class, params) {\n return new Class({\n type: \"string\",\n format: \"mac\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _cidrv4(Class, params) {\n return new Class({\n type: \"string\",\n format: \"cidrv4\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _cidrv6(Class, params) {\n return new Class({\n type: \"string\",\n format: \"cidrv6\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _base64(Class, params) {\n return new Class({\n type: \"string\",\n format: \"base64\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _base64url(Class, params) {\n return new Class({\n type: \"string\",\n format: \"base64url\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _e164(Class, params) {\n return new Class({\n type: \"string\",\n format: \"e164\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _jwt(Class, params) {\n return new Class({\n type: \"string\",\n format: \"jwt\",\n check: \"string_format\",\n abort: false,\n ...util.normalizeParams(params),\n });\n}\nexport const TimePrecision = {\n Any: null,\n Minute: -1,\n Second: 0,\n Millisecond: 3,\n Microsecond: 6,\n};\n// @__NO_SIDE_EFFECTS__\nexport function _isoDateTime(Class, params) {\n return new Class({\n type: \"string\",\n format: \"datetime\",\n check: \"string_format\",\n offset: false,\n local: false,\n precision: null,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _isoDate(Class, params) {\n return new Class({\n type: \"string\",\n format: \"date\",\n check: \"string_format\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _isoTime(Class, params) {\n return new Class({\n type: \"string\",\n format: \"time\",\n check: \"string_format\",\n precision: null,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _isoDuration(Class, params) {\n return new Class({\n type: \"string\",\n format: \"duration\",\n check: \"string_format\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _number(Class, params) {\n return new Class({\n type: \"number\",\n checks: [],\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _coercedNumber(Class, params) {\n return new Class({\n type: \"number\",\n coerce: true,\n checks: [],\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _int(Class, params) {\n return new Class({\n type: \"number\",\n check: \"number_format\",\n abort: false,\n format: \"safeint\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _float32(Class, params) {\n return new Class({\n type: \"number\",\n check: \"number_format\",\n abort: false,\n format: \"float32\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _float64(Class, params) {\n return new Class({\n type: \"number\",\n check: \"number_format\",\n abort: false,\n format: \"float64\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _int32(Class, params) {\n return new Class({\n type: \"number\",\n check: \"number_format\",\n abort: false,\n format: \"int32\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uint32(Class, params) {\n return new Class({\n type: \"number\",\n check: \"number_format\",\n abort: false,\n format: \"uint32\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _boolean(Class, params) {\n return new Class({\n type: \"boolean\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _coercedBoolean(Class, params) {\n return new Class({\n type: \"boolean\",\n coerce: true,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _bigint(Class, params) {\n return new Class({\n type: \"bigint\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _coercedBigint(Class, params) {\n return new Class({\n type: \"bigint\",\n coerce: true,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _int64(Class, params) {\n return new Class({\n type: \"bigint\",\n check: \"bigint_format\",\n abort: false,\n format: \"int64\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uint64(Class, params) {\n return new Class({\n type: \"bigint\",\n check: \"bigint_format\",\n abort: false,\n format: \"uint64\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _symbol(Class, params) {\n return new Class({\n type: \"symbol\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _undefined(Class, params) {\n return new Class({\n type: \"undefined\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _null(Class, params) {\n return new Class({\n type: \"null\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _any(Class) {\n return new Class({\n type: \"any\",\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _unknown(Class) {\n return new Class({\n type: \"unknown\",\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _never(Class, params) {\n return new Class({\n type: \"never\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _void(Class, params) {\n return new Class({\n type: \"void\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _date(Class, params) {\n return new Class({\n type: \"date\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _coercedDate(Class, params) {\n return new Class({\n type: \"date\",\n coerce: true,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _nan(Class, params) {\n return new Class({\n type: \"nan\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _lt(value, params) {\n return new checks.$ZodCheckLessThan({\n check: \"less_than\",\n ...util.normalizeParams(params),\n value,\n inclusive: false,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _lte(value, params) {\n return new checks.$ZodCheckLessThan({\n check: \"less_than\",\n ...util.normalizeParams(params),\n value,\n inclusive: true,\n });\n}\nexport { \n/** @deprecated Use `z.lte()` instead. */\n_lte as _max, };\n// @__NO_SIDE_EFFECTS__\nexport function _gt(value, params) {\n return new checks.$ZodCheckGreaterThan({\n check: \"greater_than\",\n ...util.normalizeParams(params),\n value,\n inclusive: false,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _gte(value, params) {\n return new checks.$ZodCheckGreaterThan({\n check: \"greater_than\",\n ...util.normalizeParams(params),\n value,\n inclusive: true,\n });\n}\nexport { \n/** @deprecated Use `z.gte()` instead. */\n_gte as _min, };\n// @__NO_SIDE_EFFECTS__\nexport function _positive(params) {\n return _gt(0, params);\n}\n// negative\n// @__NO_SIDE_EFFECTS__\nexport function _negative(params) {\n return _lt(0, params);\n}\n// nonpositive\n// @__NO_SIDE_EFFECTS__\nexport function _nonpositive(params) {\n return _lte(0, params);\n}\n// nonnegative\n// @__NO_SIDE_EFFECTS__\nexport function _nonnegative(params) {\n return _gte(0, params);\n}\n// @__NO_SIDE_EFFECTS__\nexport function _multipleOf(value, params) {\n return new checks.$ZodCheckMultipleOf({\n check: \"multiple_of\",\n ...util.normalizeParams(params),\n value,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _maxSize(maximum, params) {\n return new checks.$ZodCheckMaxSize({\n check: \"max_size\",\n ...util.normalizeParams(params),\n maximum,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _minSize(minimum, params) {\n return new checks.$ZodCheckMinSize({\n check: \"min_size\",\n ...util.normalizeParams(params),\n minimum,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _size(size, params) {\n return new checks.$ZodCheckSizeEquals({\n check: \"size_equals\",\n ...util.normalizeParams(params),\n size,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _maxLength(maximum, params) {\n const ch = new checks.$ZodCheckMaxLength({\n check: \"max_length\",\n ...util.normalizeParams(params),\n maximum,\n });\n return ch;\n}\n// @__NO_SIDE_EFFECTS__\nexport function _minLength(minimum, params) {\n return new checks.$ZodCheckMinLength({\n check: \"min_length\",\n ...util.normalizeParams(params),\n minimum,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _length(length, params) {\n return new checks.$ZodCheckLengthEquals({\n check: \"length_equals\",\n ...util.normalizeParams(params),\n length,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _regex(pattern, params) {\n return new checks.$ZodCheckRegex({\n check: \"string_format\",\n format: \"regex\",\n ...util.normalizeParams(params),\n pattern,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _lowercase(params) {\n return new checks.$ZodCheckLowerCase({\n check: \"string_format\",\n format: \"lowercase\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _uppercase(params) {\n return new checks.$ZodCheckUpperCase({\n check: \"string_format\",\n format: \"uppercase\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _includes(includes, params) {\n return new checks.$ZodCheckIncludes({\n check: \"string_format\",\n format: \"includes\",\n ...util.normalizeParams(params),\n includes,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _startsWith(prefix, params) {\n return new checks.$ZodCheckStartsWith({\n check: \"string_format\",\n format: \"starts_with\",\n ...util.normalizeParams(params),\n prefix,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _endsWith(suffix, params) {\n return new checks.$ZodCheckEndsWith({\n check: \"string_format\",\n format: \"ends_with\",\n ...util.normalizeParams(params),\n suffix,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _property(property, schema, params) {\n return new checks.$ZodCheckProperty({\n check: \"property\",\n property,\n schema,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _mime(types, params) {\n return new checks.$ZodCheckMimeType({\n check: \"mime_type\",\n mime: types,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _overwrite(tx) {\n return new checks.$ZodCheckOverwrite({\n check: \"overwrite\",\n tx,\n });\n}\n// normalize\n// @__NO_SIDE_EFFECTS__\nexport function _normalize(form) {\n return _overwrite((input) => input.normalize(form));\n}\n// trim\n// @__NO_SIDE_EFFECTS__\nexport function _trim() {\n return _overwrite((input) => input.trim());\n}\n// toLowerCase\n// @__NO_SIDE_EFFECTS__\nexport function _toLowerCase() {\n return _overwrite((input) => input.toLowerCase());\n}\n// toUpperCase\n// @__NO_SIDE_EFFECTS__\nexport function _toUpperCase() {\n return _overwrite((input) => input.toUpperCase());\n}\n// slugify\n// @__NO_SIDE_EFFECTS__\nexport function _slugify() {\n return _overwrite((input) => util.slugify(input));\n}\n// @__NO_SIDE_EFFECTS__\nexport function _array(Class, element, params) {\n return new Class({\n type: \"array\",\n element,\n // get element() {\n // return element;\n // },\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _union(Class, options, params) {\n return new Class({\n type: \"union\",\n options,\n ...util.normalizeParams(params),\n });\n}\nexport function _xor(Class, options, params) {\n return new Class({\n type: \"union\",\n options,\n inclusive: false,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _discriminatedUnion(Class, discriminator, options, params) {\n return new Class({\n type: \"union\",\n options,\n discriminator,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _intersection(Class, left, right) {\n return new Class({\n type: \"intersection\",\n left,\n right,\n });\n}\n// export function _tuple(\n// Class: util.SchemaClass<schemas.$ZodTuple>,\n// items: [],\n// params?: string | $ZodTupleParams\n// ): schemas.$ZodTuple<[], null>;\n// @__NO_SIDE_EFFECTS__\nexport function _tuple(Class, items, _paramsOrRest, _params) {\n const hasRest = _paramsOrRest instanceof schemas.$ZodType;\n const params = hasRest ? _params : _paramsOrRest;\n const rest = hasRest ? _paramsOrRest : null;\n return new Class({\n type: \"tuple\",\n items,\n rest,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _record(Class, keyType, valueType, params) {\n return new Class({\n type: \"record\",\n keyType,\n valueType,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _map(Class, keyType, valueType, params) {\n return new Class({\n type: \"map\",\n keyType,\n valueType,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _set(Class, valueType, params) {\n return new Class({\n type: \"set\",\n valueType,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _enum(Class, values, params) {\n const entries = Array.isArray(values) ? Object.fromEntries(values.map((v) => [v, v])) : values;\n // if (Array.isArray(values)) {\n // for (const value of values) {\n // entries[value] = value;\n // }\n // } else {\n // Object.assign(entries, values);\n // }\n // const entries: util.EnumLike = {};\n // for (const val of values) {\n // entries[val] = val;\n // }\n return new Class({\n type: \"enum\",\n entries,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\n/** @deprecated This API has been merged into `z.enum()`. Use `z.enum()` instead.\n *\n * ```ts\n * enum Colors { red, green, blue }\n * z.enum(Colors);\n * ```\n */\nexport function _nativeEnum(Class, entries, params) {\n return new Class({\n type: \"enum\",\n entries,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _literal(Class, value, params) {\n return new Class({\n type: \"literal\",\n values: Array.isArray(value) ? value : [value],\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _file(Class, params) {\n return new Class({\n type: \"file\",\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _transform(Class, fn) {\n return new Class({\n type: \"transform\",\n transform: fn,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _optional(Class, innerType) {\n return new Class({\n type: \"optional\",\n innerType,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _nullable(Class, innerType) {\n return new Class({\n type: \"nullable\",\n innerType,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _default(Class, innerType, defaultValue) {\n return new Class({\n type: \"default\",\n innerType,\n get defaultValue() {\n return typeof defaultValue === \"function\" ? defaultValue() : util.shallowClone(defaultValue);\n },\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _nonoptional(Class, innerType, params) {\n return new Class({\n type: \"nonoptional\",\n innerType,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _success(Class, innerType) {\n return new Class({\n type: \"success\",\n innerType,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _catch(Class, innerType, catchValue) {\n return new Class({\n type: \"catch\",\n innerType,\n catchValue: (typeof catchValue === \"function\" ? catchValue : () => catchValue),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _pipe(Class, in_, out) {\n return new Class({\n type: \"pipe\",\n in: in_,\n out,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _readonly(Class, innerType) {\n return new Class({\n type: \"readonly\",\n innerType,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _templateLiteral(Class, parts, params) {\n return new Class({\n type: \"template_literal\",\n parts,\n ...util.normalizeParams(params),\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _lazy(Class, getter) {\n return new Class({\n type: \"lazy\",\n getter,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _promise(Class, innerType) {\n return new Class({\n type: \"promise\",\n innerType,\n });\n}\n// @__NO_SIDE_EFFECTS__\nexport function _custom(Class, fn, _params) {\n const norm = util.normalizeParams(_params);\n norm.abort ?? (norm.abort = true); // default to abort:false\n const schema = new Class({\n type: \"custom\",\n check: \"custom\",\n fn: fn,\n ...norm,\n });\n return schema;\n}\n// same as _custom but defaults to abort:false\n// @__NO_SIDE_EFFECTS__\nexport function _refine(Class, fn, _params) {\n const schema = new Class({\n type: \"custom\",\n check: \"custom\",\n fn: fn,\n ...util.normalizeParams(_params),\n });\n return schema;\n}\n// @__NO_SIDE_EFFECTS__\nexport function _superRefine(fn) {\n const ch = _check((payload) => {\n payload.addIssue = (issue) => {\n if (typeof issue === \"string\") {\n payload.issues.push(util.issue(issue, payload.value, ch._zod.def));\n }\n else {\n // for Zod 3 backwards compatibility\n const _issue = issue;\n if (_issue.fatal)\n _issue.continue = false;\n _issue.code ?? (_issue.code = \"custom\");\n _issue.input ?? (_issue.input = payload.value);\n _issue.inst ?? (_issue.inst = ch);\n _issue.continue ?? (_issue.continue = !ch._zod.def.abort); // abort is always undefined, so this is always true...\n payload.issues.push(util.issue(_issue));\n }\n };\n return fn(payload.value, payload);\n });\n return ch;\n}\n// @__NO_SIDE_EFFECTS__\nexport function _check(fn, params) {\n const ch = new checks.$ZodCheck({\n check: \"custom\",\n ...util.normalizeParams(params),\n });\n ch._zod.check = fn;\n return ch;\n}\n// @__NO_SIDE_EFFECTS__\nexport function describe(description) {\n const ch = new checks.$ZodCheck({ check: \"describe\" });\n ch._zod.onattach = [\n (inst) => {\n const existing = registries.globalRegistry.get(inst) ?? {};\n registries.globalRegistry.add(inst, { ...existing, description });\n },\n ];\n ch._zod.check = () => { }; // no-op check\n return ch;\n}\n// @__NO_SIDE_EFFECTS__\nexport function meta(metadata) {\n const ch = new checks.$ZodCheck({ check: \"meta\" });\n ch._zod.onattach = [\n (inst) => {\n const existing = registries.globalRegistry.get(inst) ?? {};\n registries.globalRegistry.add(inst, { ...existing, ...metadata });\n },\n ];\n ch._zod.check = () => { }; // no-op check\n return ch;\n}\n// @__NO_SIDE_EFFECTS__\nexport function _stringbool(Classes, _params) {\n const params = util.normalizeParams(_params);\n let truthyArray = params.truthy ?? [\"true\", \"1\", \"yes\", \"on\", \"y\", \"enabled\"];\n let falsyArray = params.falsy ?? [\"false\", \"0\", \"no\", \"off\", \"n\", \"disabled\"];\n if (params.case !== \"sensitive\") {\n truthyArray = truthyArray.map((v) => (typeof v === \"string\" ? v.toLowerCase() : v));\n falsyArray = falsyArray.map((v) => (typeof v === \"string\" ? v.toLowerCase() : v));\n }\n const truthySet = new Set(truthyArray);\n const falsySet = new Set(falsyArray);\n const _Codec = Classes.Codec ?? schemas.$ZodCodec;\n const _Boolean = Classes.Boolean ?? schemas.$ZodBoolean;\n const _String = Classes.String ?? schemas.$ZodString;\n const stringSchema = new _String({ type: \"string\", error: params.error });\n const booleanSchema = new _Boolean({ type: \"boolean\", error: params.error });\n const codec = new _Codec({\n type: \"pipe\",\n in: stringSchema,\n out: booleanSchema,\n transform: ((input, payload) => {\n let data = input;\n if (params.case !== \"sensitive\")\n data = data.toLowerCase();\n if (truthySet.has(data)) {\n return true;\n }\n else if (falsySet.has(data)) {\n return false;\n }\n else {\n payload.issues.push({\n code: \"invalid_value\",\n expected: \"stringbool\",\n values: [...truthySet, ...falsySet],\n input: payload.value,\n inst: codec,\n continue: false,\n });\n return {};\n }\n }),\n reverseTransform: ((input, _payload) => {\n if (input === true) {\n return truthyArray[0] || \"true\";\n }\n else {\n return falsyArray[0] || \"false\";\n }\n }),\n error: params.error,\n });\n return codec;\n}\n// @__NO_SIDE_EFFECTS__\nexport function _stringFormat(Class, format, fnOrRegex, _params = {}) {\n const params = util.normalizeParams(_params);\n const def = {\n ...util.normalizeParams(_params),\n check: \"string_format\",\n type: \"string\",\n format,\n fn: typeof fnOrRegex === \"function\" ? fnOrRegex : (val) => fnOrRegex.test(val),\n ...params,\n };\n if (fnOrRegex instanceof RegExp) {\n def.pattern = fnOrRegex;\n }\n const inst = new Class(def);\n return inst;\n}\n","import { globalRegistry } from \"./registries.js\";\n// function initializeContext<T extends schemas.$ZodType>(inputs: JSONSchemaGeneratorParams<T>): ToJSONSchemaContext<T> {\n// return {\n// processor: inputs.processor,\n// metadataRegistry: inputs.metadata ?? globalRegistry,\n// target: inputs.target ?? \"draft-2020-12\",\n// unrepresentable: inputs.unrepresentable ?? \"throw\",\n// };\n// }\nexport function initializeContext(params) {\n // Normalize target: convert old non-hyphenated versions to hyphenated versions\n let target = params?.target ?? \"draft-2020-12\";\n if (target === \"draft-4\")\n target = \"draft-04\";\n if (target === \"draft-7\")\n target = \"draft-07\";\n return {\n processors: params.processors ?? {},\n metadataRegistry: params?.metadata ?? globalRegistry,\n target,\n unrepresentable: params?.unrepresentable ?? \"throw\",\n override: params?.override ?? (() => { }),\n io: params?.io ?? \"output\",\n counter: 0,\n seen: new Map(),\n cycles: params?.cycles ?? \"ref\",\n reused: params?.reused ?? \"inline\",\n external: params?.external ?? undefined,\n };\n}\nexport function process(schema, ctx, _params = { path: [], schemaPath: [] }) {\n var _a;\n const def = schema._zod.def;\n // check for schema in seens\n const seen = ctx.seen.get(schema);\n if (seen) {\n seen.count++;\n // check if cycle\n const isCycle = _params.schemaPath.includes(schema);\n if (isCycle) {\n seen.cycle = _params.path;\n }\n return seen.schema;\n }\n // initialize\n const result = { schema: {}, count: 1, cycle: undefined, path: _params.path };\n ctx.seen.set(schema, result);\n // custom method overrides default behavior\n const overrideSchema = schema._zod.toJSONSchema?.();\n if (overrideSchema) {\n result.schema = overrideSchema;\n }\n else {\n const params = {\n ..._params,\n schemaPath: [..._params.schemaPath, schema],\n path: _params.path,\n };\n if (schema._zod.processJSONSchema) {\n schema._zod.processJSONSchema(ctx, result.schema, params);\n }\n else {\n const _json = result.schema;\n const processor = ctx.processors[def.type];\n if (!processor) {\n throw new Error(`[toJSONSchema]: Non-representable type encountered: ${def.type}`);\n }\n processor(schema, ctx, _json, params);\n }\n const parent = schema._zod.parent;\n if (parent) {\n // Also set ref if processor didn't (for inheritance)\n if (!result.ref)\n result.ref = parent;\n process(parent, ctx, params);\n ctx.seen.get(parent).isParent = true;\n }\n }\n // metadata\n const meta = ctx.metadataRegistry.get(schema);\n if (meta)\n Object.assign(result.schema, meta);\n if (ctx.io === \"input\" && isTransforming(schema)) {\n // examples/defaults only apply to output type of pipe\n delete result.schema.examples;\n delete result.schema.default;\n }\n // set prefault as default\n if (ctx.io === \"input\" && result.schema._prefault)\n (_a = result.schema).default ?? (_a.default = result.schema._prefault);\n delete result.schema._prefault;\n // pulling fresh from ctx.seen in case it was overwritten\n const _result = ctx.seen.get(schema);\n return _result.schema;\n}\nexport function extractDefs(ctx, schema\n// params: EmitParams\n) {\n // iterate over seen map;\n const root = ctx.seen.get(schema);\n if (!root)\n throw new Error(\"Unprocessed schema. This is a bug in Zod.\");\n // Track ids to detect duplicates across different schemas\n const idToSchema = new Map();\n for (const entry of ctx.seen.entries()) {\n const id = ctx.metadataRegistry.get(entry[0])?.id;\n if (id) {\n const existing = idToSchema.get(id);\n if (existing && existing !== entry[0]) {\n throw new Error(`Duplicate schema id \"${id}\" detected during JSON Schema conversion. Two different schemas cannot share the same id when converted together.`);\n }\n idToSchema.set(id, entry[0]);\n }\n }\n // returns a ref to the schema\n // defId will be empty if the ref points to an external schema (or #)\n const makeURI = (entry) => {\n // comparing the seen objects because sometimes\n // multiple schemas map to the same seen object.\n // e.g. lazy\n // external is configured\n const defsSegment = ctx.target === \"draft-2020-12\" ? \"$defs\" : \"definitions\";\n if (ctx.external) {\n const externalId = ctx.external.registry.get(entry[0])?.id; // ?? \"__shared\";// `__schema${ctx.counter++}`;\n // check if schema is in the external registry\n const uriGenerator = ctx.external.uri ?? ((id) => id);\n if (externalId) {\n return { ref: uriGenerator(externalId) };\n }\n // otherwise, add to __shared\n const id = entry[1].defId ?? entry[1].schema.id ?? `schema${ctx.counter++}`;\n entry[1].defId = id; // set defId so it will be reused if needed\n return { defId: id, ref: `${uriGenerator(\"__shared\")}#/${defsSegment}/${id}` };\n }\n if (entry[1] === root) {\n return { ref: \"#\" };\n }\n // self-contained schema\n const uriPrefix = `#`;\n const defUriPrefix = `${uriPrefix}/${defsSegment}/`;\n const defId = entry[1].schema.id ?? `__schema${ctx.counter++}`;\n return { defId, ref: defUriPrefix + defId };\n };\n // stored cached version in `def` property\n // remove all properties, set $ref\n const extractToDef = (entry) => {\n // if the schema is already a reference, do not extract it\n if (entry[1].schema.$ref) {\n return;\n }\n const seen = entry[1];\n const { ref, defId } = makeURI(entry);\n seen.def = { ...seen.schema };\n // defId won't be set if the schema is a reference to an external schema\n // or if the schema is the root schema\n if (defId)\n seen.defId = defId;\n // wipe away all properties except $ref\n const schema = seen.schema;\n for (const key in schema) {\n delete schema[key];\n }\n schema.$ref = ref;\n };\n // throw on cycles\n // break cycles\n if (ctx.cycles === \"throw\") {\n for (const entry of ctx.seen.entries()) {\n const seen = entry[1];\n if (seen.cycle) {\n throw new Error(\"Cycle detected: \" +\n `#/${seen.cycle?.join(\"/\")}/<root>` +\n '\\n\\nSet the `cycles` parameter to `\"ref\"` to resolve cyclical schemas with defs.');\n }\n }\n }\n // extract schemas into $defs\n for (const entry of ctx.seen.entries()) {\n const seen = entry[1];\n // convert root schema to # $ref\n if (schema === entry[0]) {\n extractToDef(entry); // this has special handling for the root schema\n continue;\n }\n // extract schemas that are in the external registry\n if (ctx.external) {\n const ext = ctx.external.registry.get(entry[0])?.id;\n if (schema !== entry[0] && ext) {\n extractToDef(entry);\n continue;\n }\n }\n // extract schemas with `id` meta\n const id = ctx.metadataRegistry.get(entry[0])?.id;\n if (id) {\n extractToDef(entry);\n continue;\n }\n // break cycles\n if (seen.cycle) {\n // any\n extractToDef(entry);\n continue;\n }\n // extract reused schemas\n if (seen.count > 1) {\n if (ctx.reused === \"ref\") {\n extractToDef(entry);\n // biome-ignore lint:\n continue;\n }\n }\n }\n}\nexport function finalize(ctx, schema) {\n const root = ctx.seen.get(schema);\n if (!root)\n throw new Error(\"Unprocessed schema. This is a bug in Zod.\");\n // flatten refs - inherit properties from parent schemas\n const flattenRef = (zodSchema) => {\n const seen = ctx.seen.get(zodSchema);\n // already processed\n if (seen.ref === null)\n return;\n const schema = seen.def ?? seen.schema;\n const _cached = { ...schema };\n const ref = seen.ref;\n seen.ref = null; // prevent infinite recursion\n if (ref) {\n flattenRef(ref);\n const refSeen = ctx.seen.get(ref);\n const refSchema = refSeen.schema;\n // merge referenced schema into current\n if (refSchema.$ref && (ctx.target === \"draft-07\" || ctx.target === \"draft-04\" || ctx.target === \"openapi-3.0\")) {\n // older drafts can't combine $ref with other properties\n schema.allOf = schema.allOf ?? [];\n schema.allOf.push(refSchema);\n }\n else {\n Object.assign(schema, refSchema);\n }\n // restore child's own properties (child wins)\n Object.assign(schema, _cached);\n const isParentRef = zodSchema._zod.parent === ref;\n // For parent chain, child is a refinement - remove parent-only properties\n if (isParentRef) {\n for (const key in schema) {\n if (key === \"$ref\" || key === \"allOf\")\n continue;\n if (!(key in _cached)) {\n delete schema[key];\n }\n }\n }\n // When ref was extracted to $defs, remove properties that match the definition\n if (refSchema.$ref && refSeen.def) {\n for (const key in schema) {\n if (key === \"$ref\" || key === \"allOf\")\n continue;\n if (key in refSeen.def && JSON.stringify(schema[key]) === JSON.stringify(refSeen.def[key])) {\n delete schema[key];\n }\n }\n }\n }\n // If parent was extracted (has $ref), propagate $ref to this schema\n // This handles cases like: readonly().meta({id}).describe()\n // where processor sets ref to innerType but parent should be referenced\n const parent = zodSchema._zod.parent;\n if (parent && parent !== ref) {\n // Ensure parent is processed first so its def has inherited properties\n flattenRef(parent);\n const parentSeen = ctx.seen.get(parent);\n if (parentSeen?.schema.$ref) {\n schema.$ref = parentSeen.schema.$ref;\n // De-duplicate with parent's definition\n if (parentSeen.def) {\n for (const key in schema) {\n if (key === \"$ref\" || key === \"allOf\")\n continue;\n if (key in parentSeen.def && JSON.stringify(schema[key]) === JSON.stringify(parentSeen.def[key])) {\n delete schema[key];\n }\n }\n }\n }\n }\n // execute overrides\n ctx.override({\n zodSchema: zodSchema,\n jsonSchema: schema,\n path: seen.path ?? [],\n });\n };\n for (const entry of [...ctx.seen.entries()].reverse()) {\n flattenRef(entry[0]);\n }\n const result = {};\n if (ctx.target === \"draft-2020-12\") {\n result.$schema = \"https://json-schema.org/draft/2020-12/schema\";\n }\n else if (ctx.target === \"draft-07\") {\n result.$schema = \"http://json-schema.org/draft-07/schema#\";\n }\n else if (ctx.target === \"draft-04\") {\n result.$schema = \"http://json-schema.org/draft-04/schema#\";\n }\n else if (ctx.target === \"openapi-3.0\") {\n // OpenAPI 3.0 schema objects should not include a $schema property\n }\n else {\n // Arbitrary string values are allowed but won't have a $schema property set\n }\n if (ctx.external?.uri) {\n const id = ctx.external.registry.get(schema)?.id;\n if (!id)\n throw new Error(\"Schema is missing an `id` property\");\n result.$id = ctx.external.uri(id);\n }\n Object.assign(result, root.def ?? root.schema);\n // build defs object\n const defs = ctx.external?.defs ?? {};\n for (const entry of ctx.seen.entries()) {\n const seen = entry[1];\n if (seen.def && seen.defId) {\n defs[seen.defId] = seen.def;\n }\n }\n // set definitions in result\n if (ctx.external) {\n }\n else {\n if (Object.keys(defs).length > 0) {\n if (ctx.target === \"draft-2020-12\") {\n result.$defs = defs;\n }\n else {\n result.definitions = defs;\n }\n }\n }\n try {\n // this \"finalizes\" this schema and ensures all cycles are removed\n // each call to finalize() is functionally independent\n // though the seen map is shared\n const finalized = JSON.parse(JSON.stringify(result));\n Object.defineProperty(finalized, \"~standard\", {\n value: {\n ...schema[\"~standard\"],\n jsonSchema: {\n input: createStandardJSONSchemaMethod(schema, \"input\", ctx.processors),\n output: createStandardJSONSchemaMethod(schema, \"output\", ctx.processors),\n },\n },\n enumerable: false,\n writable: false,\n });\n return finalized;\n }\n catch (_err) {\n throw new Error(\"Error converting schema to JSON.\");\n }\n}\nfunction isTransforming(_schema, _ctx) {\n const ctx = _ctx ?? { seen: new Set() };\n if (ctx.seen.has(_schema))\n return false;\n ctx.seen.add(_schema);\n const def = _schema._zod.def;\n if (def.type === \"transform\")\n return true;\n if (def.type === \"array\")\n return isTransforming(def.element, ctx);\n if (def.type === \"set\")\n return isTransforming(def.valueType, ctx);\n if (def.type === \"lazy\")\n return isTransforming(def.getter(), ctx);\n if (def.type === \"promise\" ||\n def.type === \"optional\" ||\n def.type === \"nonoptional\" ||\n def.type === \"nullable\" ||\n def.type === \"readonly\" ||\n def.type === \"default\" ||\n def.type === \"prefault\") {\n return isTransforming(def.innerType, ctx);\n }\n if (def.type === \"intersection\") {\n return isTransforming(def.left, ctx) || isTransforming(def.right, ctx);\n }\n if (def.type === \"record\" || def.type === \"map\") {\n return isTransforming(def.keyType, ctx) || isTransforming(def.valueType, ctx);\n }\n if (def.type === \"pipe\") {\n return isTransforming(def.in, ctx) || isTransforming(def.out, ctx);\n }\n if (def.type === \"object\") {\n for (const key in def.shape) {\n if (isTransforming(def.shape[key], ctx))\n return true;\n }\n return false;\n }\n if (def.type === \"union\") {\n for (const option of def.options) {\n if (isTransforming(option, ctx))\n return true;\n }\n return false;\n }\n if (def.type === \"tuple\") {\n for (const item of def.items) {\n if (isTransforming(item, ctx))\n return true;\n }\n if (def.rest && isTransforming(def.rest, ctx))\n return true;\n return false;\n }\n return false;\n}\n/**\n * Creates a toJSONSchema method for a schema instance.\n * This encapsulates the logic of initializing context, processing, extracting defs, and finalizing.\n */\nexport const createToJSONSchemaMethod = (schema, processors = {}) => (params) => {\n const ctx = initializeContext({ ...params, processors });\n process(schema, ctx);\n extractDefs(ctx, schema);\n return finalize(ctx, schema);\n};\nexport const createStandardJSONSchemaMethod = (schema, io, processors = {}) => (params) => {\n const { libraryOptions, target } = params ?? {};\n const ctx = initializeContext({ ...(libraryOptions ?? {}), target, io, processors });\n process(schema, ctx);\n extractDefs(ctx, schema);\n return finalize(ctx, schema);\n};\n","import { extractDefs, finalize, initializeContext, process, } from \"./to-json-schema.js\";\nimport { getEnumValues } from \"./util.js\";\nconst formatMap = {\n guid: \"uuid\",\n url: \"uri\",\n datetime: \"date-time\",\n json_string: \"json-string\",\n regex: \"\", // do not set\n};\n// ==================== SIMPLE TYPE PROCESSORS ====================\nexport const stringProcessor = (schema, ctx, _json, _params) => {\n const json = _json;\n json.type = \"string\";\n const { minimum, maximum, format, patterns, contentEncoding } = schema._zod\n .bag;\n if (typeof minimum === \"number\")\n json.minLength = minimum;\n if (typeof maximum === \"number\")\n json.maxLength = maximum;\n // custom pattern overrides format\n if (format) {\n json.format = formatMap[format] ?? format;\n if (json.format === \"\")\n delete json.format; // empty format is not valid\n // JSON Schema format: \"time\" requires a full time with offset or Z\n // z.iso.time() does not include timezone information, so format: \"time\" should never be used\n if (format === \"time\") {\n delete json.format;\n }\n }\n if (contentEncoding)\n json.contentEncoding = contentEncoding;\n if (patterns && patterns.size > 0) {\n const regexes = [...patterns];\n if (regexes.length === 1)\n json.pattern = regexes[0].source;\n else if (regexes.length > 1) {\n json.allOf = [\n ...regexes.map((regex) => ({\n ...(ctx.target === \"draft-07\" || ctx.target === \"draft-04\" || ctx.target === \"openapi-3.0\"\n ? { type: \"string\" }\n : {}),\n pattern: regex.source,\n })),\n ];\n }\n }\n};\nexport const numberProcessor = (schema, ctx, _json, _params) => {\n const json = _json;\n const { minimum, maximum, format, multipleOf, exclusiveMaximum, exclusiveMinimum } = schema._zod.bag;\n if (typeof format === \"string\" && format.includes(\"int\"))\n json.type = \"integer\";\n else\n json.type = \"number\";\n if (typeof exclusiveMinimum === \"number\") {\n if (ctx.target === \"draft-04\" || ctx.target === \"openapi-3.0\") {\n json.minimum = exclusiveMinimum;\n json.exclusiveMinimum = true;\n }\n else {\n json.exclusiveMinimum = exclusiveMinimum;\n }\n }\n if (typeof minimum === \"number\") {\n json.minimum = minimum;\n if (typeof exclusiveMinimum === \"number\" && ctx.target !== \"draft-04\") {\n if (exclusiveMinimum >= minimum)\n delete json.minimum;\n else\n delete json.exclusiveMinimum;\n }\n }\n if (typeof exclusiveMaximum === \"number\") {\n if (ctx.target === \"draft-04\" || ctx.target === \"openapi-3.0\") {\n json.maximum = exclusiveMaximum;\n json.exclusiveMaximum = true;\n }\n else {\n json.exclusiveMaximum = exclusiveMaximum;\n }\n }\n if (typeof maximum === \"number\") {\n json.maximum = maximum;\n if (typeof exclusiveMaximum === \"number\" && ctx.target !== \"draft-04\") {\n if (exclusiveMaximum <= maximum)\n delete json.maximum;\n else\n delete json.exclusiveMaximum;\n }\n }\n if (typeof multipleOf === \"number\")\n json.multipleOf = multipleOf;\n};\nexport const booleanProcessor = (_schema, _ctx, json, _params) => {\n json.type = \"boolean\";\n};\nexport const bigintProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"BigInt cannot be represented in JSON Schema\");\n }\n};\nexport const symbolProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Symbols cannot be represented in JSON Schema\");\n }\n};\nexport const nullProcessor = (_schema, ctx, json, _params) => {\n if (ctx.target === \"openapi-3.0\") {\n json.type = \"string\";\n json.nullable = true;\n json.enum = [null];\n }\n else {\n json.type = \"null\";\n }\n};\nexport const undefinedProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Undefined cannot be represented in JSON Schema\");\n }\n};\nexport const voidProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Void cannot be represented in JSON Schema\");\n }\n};\nexport const neverProcessor = (_schema, _ctx, json, _params) => {\n json.not = {};\n};\nexport const anyProcessor = (_schema, _ctx, _json, _params) => {\n // empty schema accepts anything\n};\nexport const unknownProcessor = (_schema, _ctx, _json, _params) => {\n // empty schema accepts anything\n};\nexport const dateProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Date cannot be represented in JSON Schema\");\n }\n};\nexport const enumProcessor = (schema, _ctx, json, _params) => {\n const def = schema._zod.def;\n const values = getEnumValues(def.entries);\n // Number enums can have both string and number values\n if (values.every((v) => typeof v === \"number\"))\n json.type = \"number\";\n if (values.every((v) => typeof v === \"string\"))\n json.type = \"string\";\n json.enum = values;\n};\nexport const literalProcessor = (schema, ctx, json, _params) => {\n const def = schema._zod.def;\n const vals = [];\n for (const val of def.values) {\n if (val === undefined) {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Literal `undefined` cannot be represented in JSON Schema\");\n }\n else {\n // do not add to vals\n }\n }\n else if (typeof val === \"bigint\") {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"BigInt literals cannot be represented in JSON Schema\");\n }\n else {\n vals.push(Number(val));\n }\n }\n else {\n vals.push(val);\n }\n }\n if (vals.length === 0) {\n // do nothing (an undefined literal was stripped)\n }\n else if (vals.length === 1) {\n const val = vals[0];\n json.type = val === null ? \"null\" : typeof val;\n if (ctx.target === \"draft-04\" || ctx.target === \"openapi-3.0\") {\n json.enum = [val];\n }\n else {\n json.const = val;\n }\n }\n else {\n if (vals.every((v) => typeof v === \"number\"))\n json.type = \"number\";\n if (vals.every((v) => typeof v === \"string\"))\n json.type = \"string\";\n if (vals.every((v) => typeof v === \"boolean\"))\n json.type = \"boolean\";\n if (vals.every((v) => v === null))\n json.type = \"null\";\n json.enum = vals;\n }\n};\nexport const nanProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"NaN cannot be represented in JSON Schema\");\n }\n};\nexport const templateLiteralProcessor = (schema, _ctx, json, _params) => {\n const _json = json;\n const pattern = schema._zod.pattern;\n if (!pattern)\n throw new Error(\"Pattern not found in template literal\");\n _json.type = \"string\";\n _json.pattern = pattern.source;\n};\nexport const fileProcessor = (schema, _ctx, json, _params) => {\n const _json = json;\n const file = {\n type: \"string\",\n format: \"binary\",\n contentEncoding: \"binary\",\n };\n const { minimum, maximum, mime } = schema._zod.bag;\n if (minimum !== undefined)\n file.minLength = minimum;\n if (maximum !== undefined)\n file.maxLength = maximum;\n if (mime) {\n if (mime.length === 1) {\n file.contentMediaType = mime[0];\n Object.assign(_json, file);\n }\n else {\n Object.assign(_json, file); // shared props at root\n _json.anyOf = mime.map((m) => ({ contentMediaType: m })); // only contentMediaType differs\n }\n }\n else {\n Object.assign(_json, file);\n }\n};\nexport const successProcessor = (_schema, _ctx, json, _params) => {\n json.type = \"boolean\";\n};\nexport const customProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Custom types cannot be represented in JSON Schema\");\n }\n};\nexport const functionProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Function types cannot be represented in JSON Schema\");\n }\n};\nexport const transformProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Transforms cannot be represented in JSON Schema\");\n }\n};\nexport const mapProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Map cannot be represented in JSON Schema\");\n }\n};\nexport const setProcessor = (_schema, ctx, _json, _params) => {\n if (ctx.unrepresentable === \"throw\") {\n throw new Error(\"Set cannot be represented in JSON Schema\");\n }\n};\n// ==================== COMPOSITE TYPE PROCESSORS ====================\nexport const arrayProcessor = (schema, ctx, _json, params) => {\n const json = _json;\n const def = schema._zod.def;\n const { minimum, maximum } = schema._zod.bag;\n if (typeof minimum === \"number\")\n json.minItems = minimum;\n if (typeof maximum === \"number\")\n json.maxItems = maximum;\n json.type = \"array\";\n json.items = process(def.element, ctx, { ...params, path: [...params.path, \"items\"] });\n};\nexport const objectProcessor = (schema, ctx, _json, params) => {\n const json = _json;\n const def = schema._zod.def;\n json.type = \"object\";\n json.properties = {};\n const shape = def.shape;\n for (const key in shape) {\n json.properties[key] = process(shape[key], ctx, {\n ...params,\n path: [...params.path, \"properties\", key],\n });\n }\n // required keys\n const allKeys = new Set(Object.keys(shape));\n const requiredKeys = new Set([...allKeys].filter((key) => {\n const v = def.shape[key]._zod;\n if (ctx.io === \"input\") {\n return v.optin === undefined;\n }\n else {\n return v.optout === undefined;\n }\n }));\n if (requiredKeys.size > 0) {\n json.required = Array.from(requiredKeys);\n }\n // catchall\n if (def.catchall?._zod.def.type === \"never\") {\n // strict\n json.additionalProperties = false;\n }\n else if (!def.catchall) {\n // regular\n if (ctx.io === \"output\")\n json.additionalProperties = false;\n }\n else if (def.catchall) {\n json.additionalProperties = process(def.catchall, ctx, {\n ...params,\n path: [...params.path, \"additionalProperties\"],\n });\n }\n};\nexport const unionProcessor = (schema, ctx, json, params) => {\n const def = schema._zod.def;\n // Exclusive unions (inclusive === false) use oneOf (exactly one match) instead of anyOf (one or more matches)\n // This includes both z.xor() and discriminated unions\n const isExclusive = def.inclusive === false;\n const options = def.options.map((x, i) => process(x, ctx, {\n ...params,\n path: [...params.path, isExclusive ? \"oneOf\" : \"anyOf\", i],\n }));\n if (isExclusive) {\n json.oneOf = options;\n }\n else {\n json.anyOf = options;\n }\n};\nexport const intersectionProcessor = (schema, ctx, json, params) => {\n const def = schema._zod.def;\n const a = process(def.left, ctx, {\n ...params,\n path: [...params.path, \"allOf\", 0],\n });\n const b = process(def.right, ctx, {\n ...params,\n path: [...params.path, \"allOf\", 1],\n });\n const isSimpleIntersection = (val) => \"allOf\" in val && Object.keys(val).length === 1;\n const allOf = [\n ...(isSimpleIntersection(a) ? a.allOf : [a]),\n ...(isSimpleIntersection(b) ? b.allOf : [b]),\n ];\n json.allOf = allOf;\n};\nexport const tupleProcessor = (schema, ctx, _json, params) => {\n const json = _json;\n const def = schema._zod.def;\n json.type = \"array\";\n const prefixPath = ctx.target === \"draft-2020-12\" ? \"prefixItems\" : \"items\";\n const restPath = ctx.target === \"draft-2020-12\" ? \"items\" : ctx.target === \"openapi-3.0\" ? \"items\" : \"additionalItems\";\n const prefixItems = def.items.map((x, i) => process(x, ctx, {\n ...params,\n path: [...params.path, prefixPath, i],\n }));\n const rest = def.rest\n ? process(def.rest, ctx, {\n ...params,\n path: [...params.path, restPath, ...(ctx.target === \"openapi-3.0\" ? [def.items.length] : [])],\n })\n : null;\n if (ctx.target === \"draft-2020-12\") {\n json.prefixItems = prefixItems;\n if (rest) {\n json.items = rest;\n }\n }\n else if (ctx.target === \"openapi-3.0\") {\n json.items = {\n anyOf: prefixItems,\n };\n if (rest) {\n json.items.anyOf.push(rest);\n }\n json.minItems = prefixItems.length;\n if (!rest) {\n json.maxItems = prefixItems.length;\n }\n }\n else {\n json.items = prefixItems;\n if (rest) {\n json.additionalItems = rest;\n }\n }\n // length\n const { minimum, maximum } = schema._zod.bag;\n if (typeof minimum === \"number\")\n json.minItems = minimum;\n if (typeof maximum === \"number\")\n json.maxItems = maximum;\n};\nexport const recordProcessor = (schema, ctx, _json, params) => {\n const json = _json;\n const def = schema._zod.def;\n json.type = \"object\";\n // For looseRecord with regex patterns, use patternProperties\n // This correctly represents \"only validate keys matching the pattern\" semantics\n // and composes well with allOf (intersections)\n const keyType = def.keyType;\n const keyBag = keyType._zod.bag;\n const patterns = keyBag?.patterns;\n if (def.mode === \"loose\" && patterns && patterns.size > 0) {\n // Use patternProperties for looseRecord with regex patterns\n const valueSchema = process(def.valueType, ctx, {\n ...params,\n path: [...params.path, \"patternProperties\", \"*\"],\n });\n json.patternProperties = {};\n for (const pattern of patterns) {\n json.patternProperties[pattern.source] = valueSchema;\n }\n }\n else {\n // Default behavior: use propertyNames + additionalProperties\n if (ctx.target === \"draft-07\" || ctx.target === \"draft-2020-12\") {\n json.propertyNames = process(def.keyType, ctx, {\n ...params,\n path: [...params.path, \"propertyNames\"],\n });\n }\n json.additionalProperties = process(def.valueType, ctx, {\n ...params,\n path: [...params.path, \"additionalProperties\"],\n });\n }\n // Add required for keys with discrete values (enum, literal, etc.)\n const keyValues = keyType._zod.values;\n if (keyValues) {\n const validKeyValues = [...keyValues].filter((v) => typeof v === \"string\" || typeof v === \"number\");\n if (validKeyValues.length > 0) {\n json.required = validKeyValues;\n }\n }\n};\nexport const nullableProcessor = (schema, ctx, json, params) => {\n const def = schema._zod.def;\n const inner = process(def.innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n if (ctx.target === \"openapi-3.0\") {\n seen.ref = def.innerType;\n json.nullable = true;\n }\n else {\n json.anyOf = [inner, { type: \"null\" }];\n }\n};\nexport const nonoptionalProcessor = (schema, ctx, _json, params) => {\n const def = schema._zod.def;\n process(def.innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = def.innerType;\n};\nexport const defaultProcessor = (schema, ctx, json, params) => {\n const def = schema._zod.def;\n process(def.innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = def.innerType;\n json.default = JSON.parse(JSON.stringify(def.defaultValue));\n};\nexport const prefaultProcessor = (schema, ctx, json, params) => {\n const def = schema._zod.def;\n process(def.innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = def.innerType;\n if (ctx.io === \"input\")\n json._prefault = JSON.parse(JSON.stringify(def.defaultValue));\n};\nexport const catchProcessor = (schema, ctx, json, params) => {\n const def = schema._zod.def;\n process(def.innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = def.innerType;\n let catchValue;\n try {\n catchValue = def.catchValue(undefined);\n }\n catch {\n throw new Error(\"Dynamic catch values are not supported in JSON Schema\");\n }\n json.default = catchValue;\n};\nexport const pipeProcessor = (schema, ctx, _json, params) => {\n const def = schema._zod.def;\n const innerType = ctx.io === \"input\" ? (def.in._zod.def.type === \"transform\" ? def.out : def.in) : def.out;\n process(innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = innerType;\n};\nexport const readonlyProcessor = (schema, ctx, json, params) => {\n const def = schema._zod.def;\n process(def.innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = def.innerType;\n json.readOnly = true;\n};\nexport const promiseProcessor = (schema, ctx, _json, params) => {\n const def = schema._zod.def;\n process(def.innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = def.innerType;\n};\nexport const optionalProcessor = (schema, ctx, _json, params) => {\n const def = schema._zod.def;\n process(def.innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = def.innerType;\n};\nexport const lazyProcessor = (schema, ctx, _json, params) => {\n const innerType = schema._zod.innerType;\n process(innerType, ctx, params);\n const seen = ctx.seen.get(schema);\n seen.ref = innerType;\n};\n// ==================== ALL PROCESSORS ====================\nexport const allProcessors = {\n string: stringProcessor,\n number: numberProcessor,\n boolean: booleanProcessor,\n bigint: bigintProcessor,\n symbol: symbolProcessor,\n null: nullProcessor,\n undefined: undefinedProcessor,\n void: voidProcessor,\n never: neverProcessor,\n any: anyProcessor,\n unknown: unknownProcessor,\n date: dateProcessor,\n enum: enumProcessor,\n literal: literalProcessor,\n nan: nanProcessor,\n template_literal: templateLiteralProcessor,\n file: fileProcessor,\n success: successProcessor,\n custom: customProcessor,\n function: functionProcessor,\n transform: transformProcessor,\n map: mapProcessor,\n set: setProcessor,\n array: arrayProcessor,\n object: objectProcessor,\n union: unionProcessor,\n intersection: intersectionProcessor,\n tuple: tupleProcessor,\n record: recordProcessor,\n nullable: nullableProcessor,\n nonoptional: nonoptionalProcessor,\n default: defaultProcessor,\n prefault: prefaultProcessor,\n catch: catchProcessor,\n pipe: pipeProcessor,\n readonly: readonlyProcessor,\n promise: promiseProcessor,\n optional: optionalProcessor,\n lazy: lazyProcessor,\n};\nexport function toJSONSchema(input, params) {\n if (\"_idmap\" in input) {\n // Registry case\n const registry = input;\n const ctx = initializeContext({ ...params, processors: allProcessors });\n const defs = {};\n // First pass: process all schemas to build the seen map\n for (const entry of registry._idmap.entries()) {\n const [_, schema] = entry;\n process(schema, ctx);\n }\n const schemas = {};\n const external = {\n registry,\n uri: params?.uri,\n defs,\n };\n // Update the context with external configuration\n ctx.external = external;\n // Second pass: emit each schema\n for (const entry of registry._idmap.entries()) {\n const [key, schema] = entry;\n extractDefs(ctx, schema);\n schemas[key] = finalize(ctx, schema);\n }\n if (Object.keys(defs).length > 0) {\n const defsSegment = ctx.target === \"draft-2020-12\" ? \"$defs\" : \"definitions\";\n schemas.__shared = {\n [defsSegment]: defs,\n };\n }\n return { schemas };\n }\n // Single schema case\n const ctx = initializeContext({ ...params, processors: allProcessors });\n process(input, ctx);\n extractDefs(ctx, input);\n return finalize(ctx, input);\n}\n","import * as core from \"../core/index.js\";\nimport { $ZodError } from \"../core/index.js\";\nimport * as util from \"../core/util.js\";\nconst initializer = (inst, issues) => {\n $ZodError.init(inst, issues);\n inst.name = \"ZodError\";\n Object.defineProperties(inst, {\n format: {\n value: (mapper) => core.formatError(inst, mapper),\n // enumerable: false,\n },\n flatten: {\n value: (mapper) => core.flattenError(inst, mapper),\n // enumerable: false,\n },\n addIssue: {\n value: (issue) => {\n inst.issues.push(issue);\n inst.message = JSON.stringify(inst.issues, util.jsonStringifyReplacer, 2);\n },\n // enumerable: false,\n },\n addIssues: {\n value: (issues) => {\n inst.issues.push(...issues);\n inst.message = JSON.stringify(inst.issues, util.jsonStringifyReplacer, 2);\n },\n // enumerable: false,\n },\n isEmpty: {\n get() {\n return inst.issues.length === 0;\n },\n // enumerable: false,\n },\n });\n // Object.defineProperty(inst, \"isEmpty\", {\n // get() {\n // return inst.issues.length === 0;\n // },\n // });\n};\nexport const ZodError = core.$constructor(\"ZodError\", initializer);\nexport const ZodRealError = core.$constructor(\"ZodError\", initializer, {\n Parent: Error,\n});\n// /** @deprecated Use `z.core.$ZodErrorMapCtx` instead. */\n// export type ErrorMapCtx = core.$ZodErrorMapCtx;\n","import * as core from \"../core/index.js\";\nimport { ZodRealError } from \"./errors.js\";\nexport const parse = /* @__PURE__ */ core._parse(ZodRealError);\nexport const parseAsync = /* @__PURE__ */ core._parseAsync(ZodRealError);\nexport const safeParse = /* @__PURE__ */ core._safeParse(ZodRealError);\nexport const safeParseAsync = /* @__PURE__ */ core._safeParseAsync(ZodRealError);\n// Codec functions\nexport const encode = /* @__PURE__ */ core._encode(ZodRealError);\nexport const decode = /* @__PURE__ */ core._decode(ZodRealError);\nexport const encodeAsync = /* @__PURE__ */ core._encodeAsync(ZodRealError);\nexport const decodeAsync = /* @__PURE__ */ core._decodeAsync(ZodRealError);\nexport const safeEncode = /* @__PURE__ */ core._safeEncode(ZodRealError);\nexport const safeDecode = /* @__PURE__ */ core._safeDecode(ZodRealError);\nexport const safeEncodeAsync = /* @__PURE__ */ core._safeEncodeAsync(ZodRealError);\nexport const safeDecodeAsync = /* @__PURE__ */ core._safeDecodeAsync(ZodRealError);\n","import * as core from \"../core/index.js\";\nimport { util } from \"../core/index.js\";\nimport * as processors from \"../core/json-schema-processors.js\";\nimport { createStandardJSONSchemaMethod, createToJSONSchemaMethod } from \"../core/to-json-schema.js\";\nimport * as checks from \"./checks.js\";\nimport * as iso from \"./iso.js\";\nimport * as parse from \"./parse.js\";\nexport const ZodType = /*@__PURE__*/ core.$constructor(\"ZodType\", (inst, def) => {\n core.$ZodType.init(inst, def);\n Object.assign(inst[\"~standard\"], {\n jsonSchema: {\n input: createStandardJSONSchemaMethod(inst, \"input\"),\n output: createStandardJSONSchemaMethod(inst, \"output\"),\n },\n });\n inst.toJSONSchema = createToJSONSchemaMethod(inst, {});\n inst.def = def;\n inst.type = def.type;\n Object.defineProperty(inst, \"_def\", { value: def });\n // base methods\n inst.check = (...checks) => {\n return inst.clone(util.mergeDefs(def, {\n checks: [\n ...(def.checks ?? []),\n ...checks.map((ch) => typeof ch === \"function\" ? { _zod: { check: ch, def: { check: \"custom\" }, onattach: [] } } : ch),\n ],\n }), {\n parent: true,\n });\n };\n inst.with = inst.check;\n inst.clone = (def, params) => core.clone(inst, def, params);\n inst.brand = () => inst;\n inst.register = ((reg, meta) => {\n reg.add(inst, meta);\n return inst;\n });\n // parsing\n inst.parse = (data, params) => parse.parse(inst, data, params, { callee: inst.parse });\n inst.safeParse = (data, params) => parse.safeParse(inst, data, params);\n inst.parseAsync = async (data, params) => parse.parseAsync(inst, data, params, { callee: inst.parseAsync });\n inst.safeParseAsync = async (data, params) => parse.safeParseAsync(inst, data, params);\n inst.spa = inst.safeParseAsync;\n // encoding/decoding\n inst.encode = (data, params) => parse.encode(inst, data, params);\n inst.decode = (data, params) => parse.decode(inst, data, params);\n inst.encodeAsync = async (data, params) => parse.encodeAsync(inst, data, params);\n inst.decodeAsync = async (data, params) => parse.decodeAsync(inst, data, params);\n inst.safeEncode = (data, params) => parse.safeEncode(inst, data, params);\n inst.safeDecode = (data, params) => parse.safeDecode(inst, data, params);\n inst.safeEncodeAsync = async (data, params) => parse.safeEncodeAsync(inst, data, params);\n inst.safeDecodeAsync = async (data, params) => parse.safeDecodeAsync(inst, data, params);\n // refinements\n inst.refine = (check, params) => inst.check(refine(check, params));\n inst.superRefine = (refinement) => inst.check(superRefine(refinement));\n inst.overwrite = (fn) => inst.check(checks.overwrite(fn));\n // wrappers\n inst.optional = () => optional(inst);\n inst.exactOptional = () => exactOptional(inst);\n inst.nullable = () => nullable(inst);\n inst.nullish = () => optional(nullable(inst));\n inst.nonoptional = (params) => nonoptional(inst, params);\n inst.array = () => array(inst);\n inst.or = (arg) => union([inst, arg]);\n inst.and = (arg) => intersection(inst, arg);\n inst.transform = (tx) => pipe(inst, transform(tx));\n inst.default = (def) => _default(inst, def);\n inst.prefault = (def) => prefault(inst, def);\n // inst.coalesce = (def, params) => coalesce(inst, def, params);\n inst.catch = (params) => _catch(inst, params);\n inst.pipe = (target) => pipe(inst, target);\n inst.readonly = () => readonly(inst);\n // meta\n inst.describe = (description) => {\n const cl = inst.clone();\n core.globalRegistry.add(cl, { description });\n return cl;\n };\n Object.defineProperty(inst, \"description\", {\n get() {\n return core.globalRegistry.get(inst)?.description;\n },\n configurable: true,\n });\n inst.meta = (...args) => {\n if (args.length === 0) {\n return core.globalRegistry.get(inst);\n }\n const cl = inst.clone();\n core.globalRegistry.add(cl, args[0]);\n return cl;\n };\n // helpers\n inst.isOptional = () => inst.safeParse(undefined).success;\n inst.isNullable = () => inst.safeParse(null).success;\n inst.apply = (fn) => fn(inst);\n return inst;\n});\n/** @internal */\nexport const _ZodString = /*@__PURE__*/ core.$constructor(\"_ZodString\", (inst, def) => {\n core.$ZodString.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.stringProcessor(inst, ctx, json, params);\n const bag = inst._zod.bag;\n inst.format = bag.format ?? null;\n inst.minLength = bag.minimum ?? null;\n inst.maxLength = bag.maximum ?? null;\n // validations\n inst.regex = (...args) => inst.check(checks.regex(...args));\n inst.includes = (...args) => inst.check(checks.includes(...args));\n inst.startsWith = (...args) => inst.check(checks.startsWith(...args));\n inst.endsWith = (...args) => inst.check(checks.endsWith(...args));\n inst.min = (...args) => inst.check(checks.minLength(...args));\n inst.max = (...args) => inst.check(checks.maxLength(...args));\n inst.length = (...args) => inst.check(checks.length(...args));\n inst.nonempty = (...args) => inst.check(checks.minLength(1, ...args));\n inst.lowercase = (params) => inst.check(checks.lowercase(params));\n inst.uppercase = (params) => inst.check(checks.uppercase(params));\n // transforms\n inst.trim = () => inst.check(checks.trim());\n inst.normalize = (...args) => inst.check(checks.normalize(...args));\n inst.toLowerCase = () => inst.check(checks.toLowerCase());\n inst.toUpperCase = () => inst.check(checks.toUpperCase());\n inst.slugify = () => inst.check(checks.slugify());\n});\nexport const ZodString = /*@__PURE__*/ core.$constructor(\"ZodString\", (inst, def) => {\n core.$ZodString.init(inst, def);\n _ZodString.init(inst, def);\n inst.email = (params) => inst.check(core._email(ZodEmail, params));\n inst.url = (params) => inst.check(core._url(ZodURL, params));\n inst.jwt = (params) => inst.check(core._jwt(ZodJWT, params));\n inst.emoji = (params) => inst.check(core._emoji(ZodEmoji, params));\n inst.guid = (params) => inst.check(core._guid(ZodGUID, params));\n inst.uuid = (params) => inst.check(core._uuid(ZodUUID, params));\n inst.uuidv4 = (params) => inst.check(core._uuidv4(ZodUUID, params));\n inst.uuidv6 = (params) => inst.check(core._uuidv6(ZodUUID, params));\n inst.uuidv7 = (params) => inst.check(core._uuidv7(ZodUUID, params));\n inst.nanoid = (params) => inst.check(core._nanoid(ZodNanoID, params));\n inst.guid = (params) => inst.check(core._guid(ZodGUID, params));\n inst.cuid = (params) => inst.check(core._cuid(ZodCUID, params));\n inst.cuid2 = (params) => inst.check(core._cuid2(ZodCUID2, params));\n inst.ulid = (params) => inst.check(core._ulid(ZodULID, params));\n inst.base64 = (params) => inst.check(core._base64(ZodBase64, params));\n inst.base64url = (params) => inst.check(core._base64url(ZodBase64URL, params));\n inst.xid = (params) => inst.check(core._xid(ZodXID, params));\n inst.ksuid = (params) => inst.check(core._ksuid(ZodKSUID, params));\n inst.ipv4 = (params) => inst.check(core._ipv4(ZodIPv4, params));\n inst.ipv6 = (params) => inst.check(core._ipv6(ZodIPv6, params));\n inst.cidrv4 = (params) => inst.check(core._cidrv4(ZodCIDRv4, params));\n inst.cidrv6 = (params) => inst.check(core._cidrv6(ZodCIDRv6, params));\n inst.e164 = (params) => inst.check(core._e164(ZodE164, params));\n // iso\n inst.datetime = (params) => inst.check(iso.datetime(params));\n inst.date = (params) => inst.check(iso.date(params));\n inst.time = (params) => inst.check(iso.time(params));\n inst.duration = (params) => inst.check(iso.duration(params));\n});\nexport function string(params) {\n return core._string(ZodString, params);\n}\nexport const ZodStringFormat = /*@__PURE__*/ core.$constructor(\"ZodStringFormat\", (inst, def) => {\n core.$ZodStringFormat.init(inst, def);\n _ZodString.init(inst, def);\n});\nexport const ZodEmail = /*@__PURE__*/ core.$constructor(\"ZodEmail\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodEmail.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function email(params) {\n return core._email(ZodEmail, params);\n}\nexport const ZodGUID = /*@__PURE__*/ core.$constructor(\"ZodGUID\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodGUID.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function guid(params) {\n return core._guid(ZodGUID, params);\n}\nexport const ZodUUID = /*@__PURE__*/ core.$constructor(\"ZodUUID\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodUUID.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function uuid(params) {\n return core._uuid(ZodUUID, params);\n}\nexport function uuidv4(params) {\n return core._uuidv4(ZodUUID, params);\n}\n// ZodUUIDv6\nexport function uuidv6(params) {\n return core._uuidv6(ZodUUID, params);\n}\n// ZodUUIDv7\nexport function uuidv7(params) {\n return core._uuidv7(ZodUUID, params);\n}\nexport const ZodURL = /*@__PURE__*/ core.$constructor(\"ZodURL\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodURL.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function url(params) {\n return core._url(ZodURL, params);\n}\nexport function httpUrl(params) {\n return core._url(ZodURL, {\n protocol: /^https?$/,\n hostname: core.regexes.domain,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodEmoji = /*@__PURE__*/ core.$constructor(\"ZodEmoji\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodEmoji.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function emoji(params) {\n return core._emoji(ZodEmoji, params);\n}\nexport const ZodNanoID = /*@__PURE__*/ core.$constructor(\"ZodNanoID\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodNanoID.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function nanoid(params) {\n return core._nanoid(ZodNanoID, params);\n}\nexport const ZodCUID = /*@__PURE__*/ core.$constructor(\"ZodCUID\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodCUID.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function cuid(params) {\n return core._cuid(ZodCUID, params);\n}\nexport const ZodCUID2 = /*@__PURE__*/ core.$constructor(\"ZodCUID2\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodCUID2.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function cuid2(params) {\n return core._cuid2(ZodCUID2, params);\n}\nexport const ZodULID = /*@__PURE__*/ core.$constructor(\"ZodULID\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodULID.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function ulid(params) {\n return core._ulid(ZodULID, params);\n}\nexport const ZodXID = /*@__PURE__*/ core.$constructor(\"ZodXID\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodXID.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function xid(params) {\n return core._xid(ZodXID, params);\n}\nexport const ZodKSUID = /*@__PURE__*/ core.$constructor(\"ZodKSUID\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodKSUID.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function ksuid(params) {\n return core._ksuid(ZodKSUID, params);\n}\nexport const ZodIPv4 = /*@__PURE__*/ core.$constructor(\"ZodIPv4\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodIPv4.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function ipv4(params) {\n return core._ipv4(ZodIPv4, params);\n}\nexport const ZodMAC = /*@__PURE__*/ core.$constructor(\"ZodMAC\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodMAC.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function mac(params) {\n return core._mac(ZodMAC, params);\n}\nexport const ZodIPv6 = /*@__PURE__*/ core.$constructor(\"ZodIPv6\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodIPv6.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function ipv6(params) {\n return core._ipv6(ZodIPv6, params);\n}\nexport const ZodCIDRv4 = /*@__PURE__*/ core.$constructor(\"ZodCIDRv4\", (inst, def) => {\n core.$ZodCIDRv4.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function cidrv4(params) {\n return core._cidrv4(ZodCIDRv4, params);\n}\nexport const ZodCIDRv6 = /*@__PURE__*/ core.$constructor(\"ZodCIDRv6\", (inst, def) => {\n core.$ZodCIDRv6.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function cidrv6(params) {\n return core._cidrv6(ZodCIDRv6, params);\n}\nexport const ZodBase64 = /*@__PURE__*/ core.$constructor(\"ZodBase64\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodBase64.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function base64(params) {\n return core._base64(ZodBase64, params);\n}\nexport const ZodBase64URL = /*@__PURE__*/ core.$constructor(\"ZodBase64URL\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodBase64URL.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function base64url(params) {\n return core._base64url(ZodBase64URL, params);\n}\nexport const ZodE164 = /*@__PURE__*/ core.$constructor(\"ZodE164\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodE164.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function e164(params) {\n return core._e164(ZodE164, params);\n}\nexport const ZodJWT = /*@__PURE__*/ core.$constructor(\"ZodJWT\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodJWT.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function jwt(params) {\n return core._jwt(ZodJWT, params);\n}\nexport const ZodCustomStringFormat = /*@__PURE__*/ core.$constructor(\"ZodCustomStringFormat\", (inst, def) => {\n // ZodStringFormat.init(inst, def);\n core.$ZodCustomStringFormat.init(inst, def);\n ZodStringFormat.init(inst, def);\n});\nexport function stringFormat(format, fnOrRegex, _params = {}) {\n return core._stringFormat(ZodCustomStringFormat, format, fnOrRegex, _params);\n}\nexport function hostname(_params) {\n return core._stringFormat(ZodCustomStringFormat, \"hostname\", core.regexes.hostname, _params);\n}\nexport function hex(_params) {\n return core._stringFormat(ZodCustomStringFormat, \"hex\", core.regexes.hex, _params);\n}\nexport function hash(alg, params) {\n const enc = params?.enc ?? \"hex\";\n const format = `${alg}_${enc}`;\n const regex = core.regexes[format];\n if (!regex)\n throw new Error(`Unrecognized hash format: ${format}`);\n return core._stringFormat(ZodCustomStringFormat, format, regex, params);\n}\nexport const ZodNumber = /*@__PURE__*/ core.$constructor(\"ZodNumber\", (inst, def) => {\n core.$ZodNumber.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.numberProcessor(inst, ctx, json, params);\n inst.gt = (value, params) => inst.check(checks.gt(value, params));\n inst.gte = (value, params) => inst.check(checks.gte(value, params));\n inst.min = (value, params) => inst.check(checks.gte(value, params));\n inst.lt = (value, params) => inst.check(checks.lt(value, params));\n inst.lte = (value, params) => inst.check(checks.lte(value, params));\n inst.max = (value, params) => inst.check(checks.lte(value, params));\n inst.int = (params) => inst.check(int(params));\n inst.safe = (params) => inst.check(int(params));\n inst.positive = (params) => inst.check(checks.gt(0, params));\n inst.nonnegative = (params) => inst.check(checks.gte(0, params));\n inst.negative = (params) => inst.check(checks.lt(0, params));\n inst.nonpositive = (params) => inst.check(checks.lte(0, params));\n inst.multipleOf = (value, params) => inst.check(checks.multipleOf(value, params));\n inst.step = (value, params) => inst.check(checks.multipleOf(value, params));\n // inst.finite = (params) => inst.check(core.finite(params));\n inst.finite = () => inst;\n const bag = inst._zod.bag;\n inst.minValue =\n Math.max(bag.minimum ?? Number.NEGATIVE_INFINITY, bag.exclusiveMinimum ?? Number.NEGATIVE_INFINITY) ?? null;\n inst.maxValue =\n Math.min(bag.maximum ?? Number.POSITIVE_INFINITY, bag.exclusiveMaximum ?? Number.POSITIVE_INFINITY) ?? null;\n inst.isInt = (bag.format ?? \"\").includes(\"int\") || Number.isSafeInteger(bag.multipleOf ?? 0.5);\n inst.isFinite = true;\n inst.format = bag.format ?? null;\n});\nexport function number(params) {\n return core._number(ZodNumber, params);\n}\nexport const ZodNumberFormat = /*@__PURE__*/ core.$constructor(\"ZodNumberFormat\", (inst, def) => {\n core.$ZodNumberFormat.init(inst, def);\n ZodNumber.init(inst, def);\n});\nexport function int(params) {\n return core._int(ZodNumberFormat, params);\n}\nexport function float32(params) {\n return core._float32(ZodNumberFormat, params);\n}\nexport function float64(params) {\n return core._float64(ZodNumberFormat, params);\n}\nexport function int32(params) {\n return core._int32(ZodNumberFormat, params);\n}\nexport function uint32(params) {\n return core._uint32(ZodNumberFormat, params);\n}\nexport const ZodBoolean = /*@__PURE__*/ core.$constructor(\"ZodBoolean\", (inst, def) => {\n core.$ZodBoolean.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.booleanProcessor(inst, ctx, json, params);\n});\nexport function boolean(params) {\n return core._boolean(ZodBoolean, params);\n}\nexport const ZodBigInt = /*@__PURE__*/ core.$constructor(\"ZodBigInt\", (inst, def) => {\n core.$ZodBigInt.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.bigintProcessor(inst, ctx, json, params);\n inst.gte = (value, params) => inst.check(checks.gte(value, params));\n inst.min = (value, params) => inst.check(checks.gte(value, params));\n inst.gt = (value, params) => inst.check(checks.gt(value, params));\n inst.gte = (value, params) => inst.check(checks.gte(value, params));\n inst.min = (value, params) => inst.check(checks.gte(value, params));\n inst.lt = (value, params) => inst.check(checks.lt(value, params));\n inst.lte = (value, params) => inst.check(checks.lte(value, params));\n inst.max = (value, params) => inst.check(checks.lte(value, params));\n inst.positive = (params) => inst.check(checks.gt(BigInt(0), params));\n inst.negative = (params) => inst.check(checks.lt(BigInt(0), params));\n inst.nonpositive = (params) => inst.check(checks.lte(BigInt(0), params));\n inst.nonnegative = (params) => inst.check(checks.gte(BigInt(0), params));\n inst.multipleOf = (value, params) => inst.check(checks.multipleOf(value, params));\n const bag = inst._zod.bag;\n inst.minValue = bag.minimum ?? null;\n inst.maxValue = bag.maximum ?? null;\n inst.format = bag.format ?? null;\n});\nexport function bigint(params) {\n return core._bigint(ZodBigInt, params);\n}\nexport const ZodBigIntFormat = /*@__PURE__*/ core.$constructor(\"ZodBigIntFormat\", (inst, def) => {\n core.$ZodBigIntFormat.init(inst, def);\n ZodBigInt.init(inst, def);\n});\n// int64\nexport function int64(params) {\n return core._int64(ZodBigIntFormat, params);\n}\n// uint64\nexport function uint64(params) {\n return core._uint64(ZodBigIntFormat, params);\n}\nexport const ZodSymbol = /*@__PURE__*/ core.$constructor(\"ZodSymbol\", (inst, def) => {\n core.$ZodSymbol.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.symbolProcessor(inst, ctx, json, params);\n});\nexport function symbol(params) {\n return core._symbol(ZodSymbol, params);\n}\nexport const ZodUndefined = /*@__PURE__*/ core.$constructor(\"ZodUndefined\", (inst, def) => {\n core.$ZodUndefined.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.undefinedProcessor(inst, ctx, json, params);\n});\nfunction _undefined(params) {\n return core._undefined(ZodUndefined, params);\n}\nexport { _undefined as undefined };\nexport const ZodNull = /*@__PURE__*/ core.$constructor(\"ZodNull\", (inst, def) => {\n core.$ZodNull.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.nullProcessor(inst, ctx, json, params);\n});\nfunction _null(params) {\n return core._null(ZodNull, params);\n}\nexport { _null as null };\nexport const ZodAny = /*@__PURE__*/ core.$constructor(\"ZodAny\", (inst, def) => {\n core.$ZodAny.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.anyProcessor(inst, ctx, json, params);\n});\nexport function any() {\n return core._any(ZodAny);\n}\nexport const ZodUnknown = /*@__PURE__*/ core.$constructor(\"ZodUnknown\", (inst, def) => {\n core.$ZodUnknown.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.unknownProcessor(inst, ctx, json, params);\n});\nexport function unknown() {\n return core._unknown(ZodUnknown);\n}\nexport const ZodNever = /*@__PURE__*/ core.$constructor(\"ZodNever\", (inst, def) => {\n core.$ZodNever.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.neverProcessor(inst, ctx, json, params);\n});\nexport function never(params) {\n return core._never(ZodNever, params);\n}\nexport const ZodVoid = /*@__PURE__*/ core.$constructor(\"ZodVoid\", (inst, def) => {\n core.$ZodVoid.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.voidProcessor(inst, ctx, json, params);\n});\nfunction _void(params) {\n return core._void(ZodVoid, params);\n}\nexport { _void as void };\nexport const ZodDate = /*@__PURE__*/ core.$constructor(\"ZodDate\", (inst, def) => {\n core.$ZodDate.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.dateProcessor(inst, ctx, json, params);\n inst.min = (value, params) => inst.check(checks.gte(value, params));\n inst.max = (value, params) => inst.check(checks.lte(value, params));\n const c = inst._zod.bag;\n inst.minDate = c.minimum ? new Date(c.minimum) : null;\n inst.maxDate = c.maximum ? new Date(c.maximum) : null;\n});\nexport function date(params) {\n return core._date(ZodDate, params);\n}\nexport const ZodArray = /*@__PURE__*/ core.$constructor(\"ZodArray\", (inst, def) => {\n core.$ZodArray.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.arrayProcessor(inst, ctx, json, params);\n inst.element = def.element;\n inst.min = (minLength, params) => inst.check(checks.minLength(minLength, params));\n inst.nonempty = (params) => inst.check(checks.minLength(1, params));\n inst.max = (maxLength, params) => inst.check(checks.maxLength(maxLength, params));\n inst.length = (len, params) => inst.check(checks.length(len, params));\n inst.unwrap = () => inst.element;\n});\nexport function array(element, params) {\n return core._array(ZodArray, element, params);\n}\n// .keyof\nexport function keyof(schema) {\n const shape = schema._zod.def.shape;\n return _enum(Object.keys(shape));\n}\nexport const ZodObject = /*@__PURE__*/ core.$constructor(\"ZodObject\", (inst, def) => {\n core.$ZodObjectJIT.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.objectProcessor(inst, ctx, json, params);\n util.defineLazy(inst, \"shape\", () => {\n return def.shape;\n });\n inst.keyof = () => _enum(Object.keys(inst._zod.def.shape));\n inst.catchall = (catchall) => inst.clone({ ...inst._zod.def, catchall: catchall });\n inst.passthrough = () => inst.clone({ ...inst._zod.def, catchall: unknown() });\n inst.loose = () => inst.clone({ ...inst._zod.def, catchall: unknown() });\n inst.strict = () => inst.clone({ ...inst._zod.def, catchall: never() });\n inst.strip = () => inst.clone({ ...inst._zod.def, catchall: undefined });\n inst.extend = (incoming) => {\n return util.extend(inst, incoming);\n };\n inst.safeExtend = (incoming) => {\n return util.safeExtend(inst, incoming);\n };\n inst.merge = (other) => util.merge(inst, other);\n inst.pick = (mask) => util.pick(inst, mask);\n inst.omit = (mask) => util.omit(inst, mask);\n inst.partial = (...args) => util.partial(ZodOptional, inst, args[0]);\n inst.required = (...args) => util.required(ZodNonOptional, inst, args[0]);\n});\nexport function object(shape, params) {\n const def = {\n type: \"object\",\n shape: shape ?? {},\n ...util.normalizeParams(params),\n };\n return new ZodObject(def);\n}\n// strictObject\nexport function strictObject(shape, params) {\n return new ZodObject({\n type: \"object\",\n shape,\n catchall: never(),\n ...util.normalizeParams(params),\n });\n}\n// looseObject\nexport function looseObject(shape, params) {\n return new ZodObject({\n type: \"object\",\n shape,\n catchall: unknown(),\n ...util.normalizeParams(params),\n });\n}\nexport const ZodUnion = /*@__PURE__*/ core.$constructor(\"ZodUnion\", (inst, def) => {\n core.$ZodUnion.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.unionProcessor(inst, ctx, json, params);\n inst.options = def.options;\n});\nexport function union(options, params) {\n return new ZodUnion({\n type: \"union\",\n options: options,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodXor = /*@__PURE__*/ core.$constructor(\"ZodXor\", (inst, def) => {\n ZodUnion.init(inst, def);\n core.$ZodXor.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.unionProcessor(inst, ctx, json, params);\n inst.options = def.options;\n});\n/** Creates an exclusive union (XOR) where exactly one option must match.\n * Unlike regular unions that succeed when any option matches, xor fails if\n * zero or more than one option matches the input. */\nexport function xor(options, params) {\n return new ZodXor({\n type: \"union\",\n options: options,\n inclusive: false,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodDiscriminatedUnion = /*@__PURE__*/ core.$constructor(\"ZodDiscriminatedUnion\", (inst, def) => {\n ZodUnion.init(inst, def);\n core.$ZodDiscriminatedUnion.init(inst, def);\n});\nexport function discriminatedUnion(discriminator, options, params) {\n // const [options, params] = args;\n return new ZodDiscriminatedUnion({\n type: \"union\",\n options,\n discriminator,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodIntersection = /*@__PURE__*/ core.$constructor(\"ZodIntersection\", (inst, def) => {\n core.$ZodIntersection.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.intersectionProcessor(inst, ctx, json, params);\n});\nexport function intersection(left, right) {\n return new ZodIntersection({\n type: \"intersection\",\n left: left,\n right: right,\n });\n}\nexport const ZodTuple = /*@__PURE__*/ core.$constructor(\"ZodTuple\", (inst, def) => {\n core.$ZodTuple.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.tupleProcessor(inst, ctx, json, params);\n inst.rest = (rest) => inst.clone({\n ...inst._zod.def,\n rest: rest,\n });\n});\nexport function tuple(items, _paramsOrRest, _params) {\n const hasRest = _paramsOrRest instanceof core.$ZodType;\n const params = hasRest ? _params : _paramsOrRest;\n const rest = hasRest ? _paramsOrRest : null;\n return new ZodTuple({\n type: \"tuple\",\n items: items,\n rest,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodRecord = /*@__PURE__*/ core.$constructor(\"ZodRecord\", (inst, def) => {\n core.$ZodRecord.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.recordProcessor(inst, ctx, json, params);\n inst.keyType = def.keyType;\n inst.valueType = def.valueType;\n});\nexport function record(keyType, valueType, params) {\n return new ZodRecord({\n type: \"record\",\n keyType,\n valueType: valueType,\n ...util.normalizeParams(params),\n });\n}\n// type alksjf = core.output<core.$ZodRecordKey>;\nexport function partialRecord(keyType, valueType, params) {\n const k = core.clone(keyType);\n k._zod.values = undefined;\n return new ZodRecord({\n type: \"record\",\n keyType: k,\n valueType: valueType,\n ...util.normalizeParams(params),\n });\n}\nexport function looseRecord(keyType, valueType, params) {\n return new ZodRecord({\n type: \"record\",\n keyType,\n valueType: valueType,\n mode: \"loose\",\n ...util.normalizeParams(params),\n });\n}\nexport const ZodMap = /*@__PURE__*/ core.$constructor(\"ZodMap\", (inst, def) => {\n core.$ZodMap.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.mapProcessor(inst, ctx, json, params);\n inst.keyType = def.keyType;\n inst.valueType = def.valueType;\n inst.min = (...args) => inst.check(core._minSize(...args));\n inst.nonempty = (params) => inst.check(core._minSize(1, params));\n inst.max = (...args) => inst.check(core._maxSize(...args));\n inst.size = (...args) => inst.check(core._size(...args));\n});\nexport function map(keyType, valueType, params) {\n return new ZodMap({\n type: \"map\",\n keyType: keyType,\n valueType: valueType,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodSet = /*@__PURE__*/ core.$constructor(\"ZodSet\", (inst, def) => {\n core.$ZodSet.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.setProcessor(inst, ctx, json, params);\n inst.min = (...args) => inst.check(core._minSize(...args));\n inst.nonempty = (params) => inst.check(core._minSize(1, params));\n inst.max = (...args) => inst.check(core._maxSize(...args));\n inst.size = (...args) => inst.check(core._size(...args));\n});\nexport function set(valueType, params) {\n return new ZodSet({\n type: \"set\",\n valueType: valueType,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodEnum = /*@__PURE__*/ core.$constructor(\"ZodEnum\", (inst, def) => {\n core.$ZodEnum.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.enumProcessor(inst, ctx, json, params);\n inst.enum = def.entries;\n inst.options = Object.values(def.entries);\n const keys = new Set(Object.keys(def.entries));\n inst.extract = (values, params) => {\n const newEntries = {};\n for (const value of values) {\n if (keys.has(value)) {\n newEntries[value] = def.entries[value];\n }\n else\n throw new Error(`Key ${value} not found in enum`);\n }\n return new ZodEnum({\n ...def,\n checks: [],\n ...util.normalizeParams(params),\n entries: newEntries,\n });\n };\n inst.exclude = (values, params) => {\n const newEntries = { ...def.entries };\n for (const value of values) {\n if (keys.has(value)) {\n delete newEntries[value];\n }\n else\n throw new Error(`Key ${value} not found in enum`);\n }\n return new ZodEnum({\n ...def,\n checks: [],\n ...util.normalizeParams(params),\n entries: newEntries,\n });\n };\n});\nfunction _enum(values, params) {\n const entries = Array.isArray(values) ? Object.fromEntries(values.map((v) => [v, v])) : values;\n return new ZodEnum({\n type: \"enum\",\n entries,\n ...util.normalizeParams(params),\n });\n}\nexport { _enum as enum };\n/** @deprecated This API has been merged into `z.enum()`. Use `z.enum()` instead.\n *\n * ```ts\n * enum Colors { red, green, blue }\n * z.enum(Colors);\n * ```\n */\nexport function nativeEnum(entries, params) {\n return new ZodEnum({\n type: \"enum\",\n entries,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodLiteral = /*@__PURE__*/ core.$constructor(\"ZodLiteral\", (inst, def) => {\n core.$ZodLiteral.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.literalProcessor(inst, ctx, json, params);\n inst.values = new Set(def.values);\n Object.defineProperty(inst, \"value\", {\n get() {\n if (def.values.length > 1) {\n throw new Error(\"This schema contains multiple valid literal values. Use `.values` instead.\");\n }\n return def.values[0];\n },\n });\n});\nexport function literal(value, params) {\n return new ZodLiteral({\n type: \"literal\",\n values: Array.isArray(value) ? value : [value],\n ...util.normalizeParams(params),\n });\n}\nexport const ZodFile = /*@__PURE__*/ core.$constructor(\"ZodFile\", (inst, def) => {\n core.$ZodFile.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.fileProcessor(inst, ctx, json, params);\n inst.min = (size, params) => inst.check(core._minSize(size, params));\n inst.max = (size, params) => inst.check(core._maxSize(size, params));\n inst.mime = (types, params) => inst.check(core._mime(Array.isArray(types) ? types : [types], params));\n});\nexport function file(params) {\n return core._file(ZodFile, params);\n}\nexport const ZodTransform = /*@__PURE__*/ core.$constructor(\"ZodTransform\", (inst, def) => {\n core.$ZodTransform.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.transformProcessor(inst, ctx, json, params);\n inst._zod.parse = (payload, _ctx) => {\n if (_ctx.direction === \"backward\") {\n throw new core.$ZodEncodeError(inst.constructor.name);\n }\n payload.addIssue = (issue) => {\n if (typeof issue === \"string\") {\n payload.issues.push(util.issue(issue, payload.value, def));\n }\n else {\n // for Zod 3 backwards compatibility\n const _issue = issue;\n if (_issue.fatal)\n _issue.continue = false;\n _issue.code ?? (_issue.code = \"custom\");\n _issue.input ?? (_issue.input = payload.value);\n _issue.inst ?? (_issue.inst = inst);\n // _issue.continue ??= true;\n payload.issues.push(util.issue(_issue));\n }\n };\n const output = def.transform(payload.value, payload);\n if (output instanceof Promise) {\n return output.then((output) => {\n payload.value = output;\n return payload;\n });\n }\n payload.value = output;\n return payload;\n };\n});\nexport function transform(fn) {\n return new ZodTransform({\n type: \"transform\",\n transform: fn,\n });\n}\nexport const ZodOptional = /*@__PURE__*/ core.$constructor(\"ZodOptional\", (inst, def) => {\n core.$ZodOptional.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.optionalProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function optional(innerType) {\n return new ZodOptional({\n type: \"optional\",\n innerType: innerType,\n });\n}\nexport const ZodExactOptional = /*@__PURE__*/ core.$constructor(\"ZodExactOptional\", (inst, def) => {\n core.$ZodExactOptional.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.optionalProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function exactOptional(innerType) {\n return new ZodExactOptional({\n type: \"optional\",\n innerType: innerType,\n });\n}\nexport const ZodNullable = /*@__PURE__*/ core.$constructor(\"ZodNullable\", (inst, def) => {\n core.$ZodNullable.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.nullableProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function nullable(innerType) {\n return new ZodNullable({\n type: \"nullable\",\n innerType: innerType,\n });\n}\n// nullish\nexport function nullish(innerType) {\n return optional(nullable(innerType));\n}\nexport const ZodDefault = /*@__PURE__*/ core.$constructor(\"ZodDefault\", (inst, def) => {\n core.$ZodDefault.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.defaultProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n inst.removeDefault = inst.unwrap;\n});\nexport function _default(innerType, defaultValue) {\n return new ZodDefault({\n type: \"default\",\n innerType: innerType,\n get defaultValue() {\n return typeof defaultValue === \"function\" ? defaultValue() : util.shallowClone(defaultValue);\n },\n });\n}\nexport const ZodPrefault = /*@__PURE__*/ core.$constructor(\"ZodPrefault\", (inst, def) => {\n core.$ZodPrefault.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.prefaultProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function prefault(innerType, defaultValue) {\n return new ZodPrefault({\n type: \"prefault\",\n innerType: innerType,\n get defaultValue() {\n return typeof defaultValue === \"function\" ? defaultValue() : util.shallowClone(defaultValue);\n },\n });\n}\nexport const ZodNonOptional = /*@__PURE__*/ core.$constructor(\"ZodNonOptional\", (inst, def) => {\n core.$ZodNonOptional.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.nonoptionalProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function nonoptional(innerType, params) {\n return new ZodNonOptional({\n type: \"nonoptional\",\n innerType: innerType,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodSuccess = /*@__PURE__*/ core.$constructor(\"ZodSuccess\", (inst, def) => {\n core.$ZodSuccess.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.successProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function success(innerType) {\n return new ZodSuccess({\n type: \"success\",\n innerType: innerType,\n });\n}\nexport const ZodCatch = /*@__PURE__*/ core.$constructor(\"ZodCatch\", (inst, def) => {\n core.$ZodCatch.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.catchProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n inst.removeCatch = inst.unwrap;\n});\nfunction _catch(innerType, catchValue) {\n return new ZodCatch({\n type: \"catch\",\n innerType: innerType,\n catchValue: (typeof catchValue === \"function\" ? catchValue : () => catchValue),\n });\n}\nexport { _catch as catch };\nexport const ZodNaN = /*@__PURE__*/ core.$constructor(\"ZodNaN\", (inst, def) => {\n core.$ZodNaN.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.nanProcessor(inst, ctx, json, params);\n});\nexport function nan(params) {\n return core._nan(ZodNaN, params);\n}\nexport const ZodPipe = /*@__PURE__*/ core.$constructor(\"ZodPipe\", (inst, def) => {\n core.$ZodPipe.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.pipeProcessor(inst, ctx, json, params);\n inst.in = def.in;\n inst.out = def.out;\n});\nexport function pipe(in_, out) {\n return new ZodPipe({\n type: \"pipe\",\n in: in_,\n out: out,\n // ...util.normalizeParams(params),\n });\n}\nexport const ZodCodec = /*@__PURE__*/ core.$constructor(\"ZodCodec\", (inst, def) => {\n ZodPipe.init(inst, def);\n core.$ZodCodec.init(inst, def);\n});\nexport function codec(in_, out, params) {\n return new ZodCodec({\n type: \"pipe\",\n in: in_,\n out: out,\n transform: params.decode,\n reverseTransform: params.encode,\n });\n}\nexport const ZodReadonly = /*@__PURE__*/ core.$constructor(\"ZodReadonly\", (inst, def) => {\n core.$ZodReadonly.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.readonlyProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function readonly(innerType) {\n return new ZodReadonly({\n type: \"readonly\",\n innerType: innerType,\n });\n}\nexport const ZodTemplateLiteral = /*@__PURE__*/ core.$constructor(\"ZodTemplateLiteral\", (inst, def) => {\n core.$ZodTemplateLiteral.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.templateLiteralProcessor(inst, ctx, json, params);\n});\nexport function templateLiteral(parts, params) {\n return new ZodTemplateLiteral({\n type: \"template_literal\",\n parts,\n ...util.normalizeParams(params),\n });\n}\nexport const ZodLazy = /*@__PURE__*/ core.$constructor(\"ZodLazy\", (inst, def) => {\n core.$ZodLazy.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.lazyProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.getter();\n});\nexport function lazy(getter) {\n return new ZodLazy({\n type: \"lazy\",\n getter: getter,\n });\n}\nexport const ZodPromise = /*@__PURE__*/ core.$constructor(\"ZodPromise\", (inst, def) => {\n core.$ZodPromise.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.promiseProcessor(inst, ctx, json, params);\n inst.unwrap = () => inst._zod.def.innerType;\n});\nexport function promise(innerType) {\n return new ZodPromise({\n type: \"promise\",\n innerType: innerType,\n });\n}\nexport const ZodFunction = /*@__PURE__*/ core.$constructor(\"ZodFunction\", (inst, def) => {\n core.$ZodFunction.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.functionProcessor(inst, ctx, json, params);\n});\nexport function _function(params) {\n return new ZodFunction({\n type: \"function\",\n input: Array.isArray(params?.input) ? tuple(params?.input) : (params?.input ?? array(unknown())),\n output: params?.output ?? unknown(),\n });\n}\nexport { _function as function };\nexport const ZodCustom = /*@__PURE__*/ core.$constructor(\"ZodCustom\", (inst, def) => {\n core.$ZodCustom.init(inst, def);\n ZodType.init(inst, def);\n inst._zod.processJSONSchema = (ctx, json, params) => processors.customProcessor(inst, ctx, json, params);\n});\n// custom checks\nexport function check(fn) {\n const ch = new core.$ZodCheck({\n check: \"custom\",\n // ...util.normalizeParams(params),\n });\n ch._zod.check = fn;\n return ch;\n}\nexport function custom(fn, _params) {\n return core._custom(ZodCustom, fn ?? (() => true), _params);\n}\nexport function refine(fn, _params = {}) {\n return core._refine(ZodCustom, fn, _params);\n}\n// superRefine\nexport function superRefine(fn) {\n return core._superRefine(fn);\n}\n// Re-export describe and meta from core\nexport const describe = core.describe;\nexport const meta = core.meta;\nfunction _instanceof(cls, params = {}) {\n const inst = new ZodCustom({\n type: \"custom\",\n check: \"custom\",\n fn: (data) => data instanceof cls,\n abort: true,\n ...util.normalizeParams(params),\n });\n inst._zod.bag.Class = cls;\n // Override check to emit invalid_type instead of custom\n inst._zod.check = (payload) => {\n if (!(payload.value instanceof cls)) {\n payload.issues.push({\n code: \"invalid_type\",\n expected: cls.name,\n input: payload.value,\n inst,\n path: [...(inst._zod.def.path ?? [])],\n });\n }\n };\n return inst;\n}\nexport { _instanceof as instanceof };\n// stringbool\nexport const stringbool = (...args) => core._stringbool({\n Codec: ZodCodec,\n Boolean: ZodBoolean,\n String: ZodString,\n}, ...args);\nexport function json(params) {\n const jsonSchema = lazy(() => {\n return union([string(params), number(), boolean(), _null(), array(jsonSchema), record(string(), jsonSchema)]);\n });\n return jsonSchema;\n}\n// preprocess\n// /** @deprecated Use `z.pipe()` and `z.transform()` instead. */\nexport function preprocess(fn, schema) {\n return pipe(transform(fn), schema);\n}\n","import { Hono } from 'hono'\nimport { z } from 'zod'\nimport { CodingService } from '../coding-service'\n\nconst permissionModeSchema = z.enum(['readonly', 'confirm', 'auto'])\nconst thinkingLevelSchema = z.enum(['low', 'medium', 'high', 'xhigh', 'max'])\nconst modeBodySchema = z.object({ mode: permissionModeSchema })\nconst thinkingBodySchema = z.object({ level: thinkingLevelSchema })\n\nexport function createSettingRoute(service: CodingService): Hono {\n const app = new Hono()\n\n app.get('/', (c) => {\n const active = service.getActiveSession()\n return c.json({\n workingDirectory: service.app.workspaceDir,\n model: active?.model?.id,\n modelProvider: active?.model?.provider,\n })\n })\n\n app.put('/', async (c) => {\n const body = await c.req.json().catch(() => ({}))\n try {\n const updated = await service.app.updateSettings(body)\n return c.json({ status: 'ok', settings: { model: updated.model, thinking_level: updated.thinking_level, permission_mode: updated.permission_mode } })\n } catch (err) {\n return c.json({ status: 'error', message: `setting update failed: ${err instanceof Error ? err.message : String(err)}` }, 500)\n }\n })\n\n app.get('/providers', (c) => {\n const providerApis = service.app.listProviders()\n return c.json(\n providerApis.map((api) => ({\n id: api,\n name: api,\n models: [],\n })),\n )\n })\n\n app.get('/models', (c) => {\n c.header('Cache-Control', 'public, max-age=300')\n try {\n const models = service.app.getAllModels()\n return c.json({\n models: models.map((m) => ({\n id: m.id,\n provider: m.provider,\n name: m.name,\n reasoning: m.reasoning,\n input: m.input,\n contextWindow: m.contextWindow,\n maxOutputTokens: m.maxOutputTokens,\n cost: m.cost,\n ...(m.thinkingLevels ? { thinkingLevels: m.thinkingLevels } : {}),\n })),\n })\n } catch {\n return c.json({ error: 'failed to list models' }, 500)\n }\n })\n\n app.post('/verify-model', async (c) => {\n const body = await c.req.json<{ model?: string }>().catch(() => ({}) as { model?: string })\n if (typeof body.model !== 'string' || !body.model) {\n return c.json({ valid: false, error: 'model is required' }, 400)\n }\n try {\n service.app.resolveModel(body.model)\n return c.json({ valid: true })\n } catch {\n return c.json({ valid: false, error: 'model not found' })\n }\n })\n\n app.post('/mode', async (c) => {\n let body: unknown\n try {\n body = await c.req.json()\n } catch {\n return c.json({ status: 'error', message: 'invalid JSON body' }, 400)\n }\n const parsed = modeBodySchema.safeParse(body)\n if (!parsed.success) {\n return c.json({ status: 'error', message: `invalid mode: ${parsed.error.issues.map((i) => i.message).join('; ')}` }, 400)\n }\n try {\n await service.app.updateSettings({ permission_mode: parsed.data.mode })\n return c.json({ status: 'ok' })\n } catch (err) {\n return c.json({ status: 'error', message: `mode switch failed: ${err instanceof Error ? err.message : String(err)}` }, 500)\n }\n })\n\n app.post('/autonomy', async (c) => {\n await c.req.json().catch(() => ({}))\n return c.json({ status: 'error', message: 'autonomy is not a configurable setting field; use PUT /api/setting to update permission_mode or thinking_level' }, 501)\n })\n\n app.post('/thinking', async (c) => {\n let body: unknown\n try {\n body = await c.req.json()\n } catch {\n return c.json({ status: 'error', message: 'invalid JSON body' }, 400)\n }\n const parsed = thinkingBodySchema.safeParse(body)\n if (!parsed.success) {\n return c.json({ status: 'error', message: `invalid thinking level: ${parsed.error.issues.map((i) => i.message).join('; ')}` }, 400)\n }\n try {\n await service.app.updateSettings({ thinking_level: parsed.data.level })\n return c.json({ status: 'ok' })\n } catch (err) {\n return c.json({ status: 'error', message: `thinking switch failed: ${err instanceof Error ? err.message : String(err)}` }, 500)\n }\n })\n\n return app\n}\n\n","import { Hono } from 'hono'\nimport type { Devtools } from '@x-otto/devtools'\nimport type { CodingService } from '../coding-service'\n\nexport function createDevtoolsRoute(_context: CodingService, devtools: Devtools | null): Hono {\n const app = new Hono()\n\n /**\n * RFC-331 M3(D4):只报**能报的事实**。\n *\n * 此前同时返回 `enabled` 与 `connected`,且二者都等于 `devtools !== null`——\n * `connected` 是虚构的:`Devtools`(packages/devtools/src/devtools.ts)根本没有连接\n * 概念(无 client/socket/session 状态),\"已启用\"不等于\"有调试器连着\"。客户端据此\n * 显示\"调试器已连接\"就是谎报。\n *\n * 故删除 `connected`,只保留可诚实回答的 `enabled`。将来 devtools 真有连接态时,\n * 应由 Devtools 暴露真实状态再补该字段,而不是继续用启用标志冒充。\n */\n app.get('/status', (c) => {\n return c.json({\n enabled: devtools !== null,\n })\n })\n\n app.use('/*', async (c, next) => {\n if (!devtools) {\n return c.json({ error: 'debugger not enabled' }, 503)\n }\n\n await next()\n return\n })\n\n app.get('/breakpoints', (c) => {\n const list = devtools?.debugger.listBreakpoints()\n return c.json({ breakpoints: list })\n })\n\n return app\n}\n","import { Hono } from 'hono'\nimport { BREAKPOINT_POINTS, type BreakpointPoint } from '@x-otto/agent'\nimport type { CodingService } from '../coding-service'\n\nconst BREAKPOINT_NAMES = BREAKPOINT_POINTS.map((d) => d.point)\n\nexport function createDebuggerRoute(context: CodingService): Hono {\n const app = new Hono()\n const devtools = () => context.app.devtools\n\n app.use('/*', async (c, next) => {\n if (!devtools()) {\n return c.json({ error: 'debugger not available (start with --inspect)' }, 503)\n }\n await next()\n return undefined\n })\n\n app.get('/breakpoints', (c) => {\n const d = devtools()!.debugger\n const list = BREAKPOINT_POINTS.map(({ point }) => {\n const bp = d.getBreakpoint(point)\n return { point, enabled: bp?.enabled ?? false, set: bp !== undefined }\n })\n return c.json({ breakpoints: list })\n })\n\n app.put('/breakpoints/:point', async (c) => {\n const point = c.req.param('point')\n if (!(BREAKPOINT_NAMES as readonly string[]).includes(point)) {\n return c.json({ error: `unknown breakpoint point: ${point}` }, 400)\n }\n const body = await c.req.json<{ enabled?: boolean }>().catch(() => ({ enabled: true }))\n const enabled = body.enabled ?? true\n const d = devtools()!.debugger\n const bp = d.setBreakpoint(point as BreakpointPoint, enabled)\n return c.json({ breakpoint: bp })\n })\n\n app.post('/breakpoints/enable-all', (c) => {\n devtools()!.debugger.enableAllBreakpoints()\n return c.json({ status: 'ok' })\n })\n\n app.post('/breakpoints/disable-all', (c) => {\n devtools()!.debugger.disableAllBreakpoints()\n return c.json({ status: 'ok' })\n })\n\n app.get('/state', (c) => {\n const d = devtools()!.debugger\n const all = d.listBreakpoints()\n const enabled = all.filter((bp) => bp.enabled).length\n const pending = devtools()!.controller.pending()\n return c.json({\n enabled: true,\n connected: true,\n breakpoints: { total: all.length, enabled },\n paused: pending.length > 0,\n pendingPauses: pending.map((p) => ({\n pauseId: p.pauseId,\n point: p.snapshot.point,\n turn: p.snapshot.turn,\n })),\n })\n })\n\n app.post('/resume', async (c) => {\n const bridge = context.bridge\n if (!bridge) {\n return c.json({ error: 'debug bridge not available' }, 503)\n }\n if (!bridge.isConnected) {\n return c.json(\n { error: 'debug bridge not connected to worker — command cannot be delivered' },\n 503,\n )\n }\n const body = await c.req\n .json<{ command?: string; payload?: Record<string, unknown> }>()\n .catch((): { command?: string; payload?: Record<string, unknown> } => ({}))\n const command = body.command ?? 'continue'\n if (!['continue', 'next', 'step', 'over', 'stop'].includes(command)) {\n return c.json({ error: `invalid command: ${command}` }, 400)\n }\n bridge.send(\n { type: command, seq: Date.now(), depth: 0 },\n body.payload as Parameters<typeof bridge.send>[1],\n )\n return c.json({ status: 'ok', command })\n })\n\n app.post('/inject', async (c) => {\n const bridge = context.bridge\n if (!bridge) {\n return c.json({ error: 'debug bridge not available' }, 503)\n }\n if (!bridge.isConnected) {\n return c.json(\n { error: 'debug bridge not connected to worker — command cannot be delivered' },\n 503,\n )\n }\n const body = await c.req\n .json<{\n injectMessages?: { role: string; content: string }[]\n systemPrompt?: string\n llmParams?: Record<string, unknown>\n }>()\n .catch(() => null)\n if (\n !body ||\n (body.injectMessages === undefined &&\n body.systemPrompt === undefined &&\n body.llmParams === undefined)\n ) {\n return c.json(\n { error: 'at least one of injectMessages, systemPrompt, or llmParams is required' },\n 400,\n )\n }\n bridge.send(\n { type: 'continue', seq: Date.now() },\n {\n systemPrompt: body.systemPrompt,\n injectMessages: body.injectMessages?.map((m) => ({\n role: m.role as 'user' | 'system',\n content: m.content,\n })),\n llmParams: body.llmParams as {\n temperature?: number\n maxTokens?: number\n thinkingLevel?: string\n },\n },\n )\n return c.json({ status: 'ok' })\n })\n\n return app\n}\n","import { Hono } from 'hono'\nimport { streamSSE } from 'hono/streaming'\nimport type { CodingService } from '../coding-service'\n\nconst LOG_LEVEL_SEVERITY: Record<string, number> = {\n trace: 0,\n debug: 1,\n info: 2,\n warn: 3,\n error: 4,\n fatal: 5,\n}\n\nexport function createLoggerRoute(context: CodingService): Hono {\n const app = new Hono()\n\n app.get('/history', (c) => {\n if (!context.bridge) {\n return c.json({ entries: [], total: 0 })\n }\n\n const rawLimit = Number(c.req.query('limit') ?? 100)\n const limit = Number.isFinite(rawLimit) && rawLimit > 0 ? Math.min(rawLimit, 2000) : 100\n const level = c.req.query('level')\n const module = c.req.query('module')\n\n let entries = context.bridge.getLogs()\n if (level && LOG_LEVEL_SEVERITY[level] !== undefined) {\n const minSeverity = LOG_LEVEL_SEVERITY[level]\n entries = entries.filter((e) => (LOG_LEVEL_SEVERITY[e.level] ?? 0) >= minSeverity)\n }\n if (module) {\n entries = entries.filter((e) => e.module.includes(module))\n }\n const total = entries.length\n entries = entries.slice(-limit)\n\n return c.json({ entries, total })\n })\n\n app.get('/stream', (c) => {\n if (!context.bridge) {\n return c.text('debugger not enabled', 503)\n }\n\n return streamSSE(c, async (stream) => {\n const unsubscribe = context.bridge?.on('Log.entryAdded', (entry) => {\n stream.writeSSE({ event: 'log', data: JSON.stringify(entry) })\n })\n\n await new Promise<void>((resolve) => {\n stream.onAbort(() => {\n unsubscribe?.()\n resolve()\n })\n })\n })\n })\n\n return app\n}\n","import { Hono } from 'hono'\nimport type { ExtensionCategory } from '@x-otto/coding'\nimport { CodingService } from '../coding-service'\n\n/**\n * catalog 路由(RFC-044 M044-05):把 App 已产出的「扩展/sigil 目录」暴露给非 TUI 前端\n * (web-ui / GUI)。会话流走 WS、历史水合走 /api/sessions/:id/messages、模型目录走\n * /api/setting/models(均已存在);本路由补齐 extension 启停面 + #/@ 条目检索。\n *\n * 只读快照 + 启停控制;数据权威仍是 App(service 不持有副本)。\n */\nexport function createCatalogRoute(service: CodingService): Hono {\n const app = new Hono()\n\n /** 扩展启停目录(mcp/skill/agent/plugin bundle,含已禁用项供重启用)。 */\n app.get('/extensions', (c) => {\n return c.json({ extensions: service.app.extensions.list() })\n })\n\n /** 切换某扩展启停(路由到对应 provider;落盘 + 实时/下轮生效由 provider 定)。 */\n app.post('/extensions/toggle', async (c) => {\n const body = await c.req\n .json<{ category?: string; id?: string; enabled?: boolean }>()\n .catch(() => ({}) as { category?: string; id?: string; enabled?: boolean })\n if (!body.category || !body.id || typeof body.enabled !== 'boolean') {\n return c.json({ error: 'category, id, enabled required' }, 400)\n }\n try {\n await service.app.extensions.setEnabled(\n body.category as ExtensionCategory,\n body.id,\n body.enabled,\n )\n return c.json({ ok: true })\n } catch (e) {\n return c.json({ error: e instanceof Error ? e.message : String(e) }, 400)\n }\n })\n\n /**\n * 文件/插件命令目录(`.otto/.claude/commands` + 插件命令)。只暴露可序列化元数据\n * (name/description/argumentHint/source/scope/pluginId),不含 body(执行细节)。\n * 内置 CLI slash 命令(/clear 等)前端各自实现 handler,不经此暴露。\n */\n app.get('/commands', (c) => {\n const cmds = service.app.listFileCommands()\n return c.json({\n commands: cmds.map((cmd) => ({\n name: cmd.name,\n description: cmd.description,\n argumentHint: cmd.argumentHint,\n source: cmd.source,\n scope: cmd.scope,\n pluginId: cmd.pluginId,\n })),\n })\n })\n\n /** #/@ 条目检索(含 dynamic provider 如 @file 懒查,走 searchAsync)。 */\n app.get('/sigil', async (c) => {\n const q = c.req.query('q') ?? ''\n const sigilParam = c.req.query('sigil')\n const sigil = sigilParam === '#' || sigilParam === '@' ? sigilParam : undefined\n const maxRaw = Number(c.req.query('max') ?? '50')\n const max = Number.isFinite(maxRaw) && maxRaw > 0 ? maxRaw : 50\n const entries = await service.app.pluginInput.searchAsync(q, sigil, max)\n return c.json({ entries })\n })\n\n /**\n * RFC-210 D7:@ 资源提交时展开——web-ui 提交消息前调此端点,把文本中的\n * `[@kind:param]` chip / `@path:行范围` / `@def:符号` 展开为实际内容(与 TUI 提交\n * 管线同一 `expandSigilChips` 实现,服务端进程执行 resolve)。\n * `uiHost: false`:uiHostOnly resolver(@clipboard 读桌面剪贴板类)跳过执行、chip\n * 原样保留——防\"浏览器请求读服务器剪贴板\"信任边界混淆(评审 B11/RFC-209 同款拆分)。\n * `skipPrefixes: ['model']`:@model 是 action 型 chip(切模型副作用),web-ui 侧\n * 对等语义未定义前统一跳过(原样透传给 LLM 无害)。\n */\n app.post('/sigil/expand', async (c) => {\n const body = await c.req.json<{ text?: string }>().catch(() => ({}) as { text?: string })\n if (typeof body.text !== 'string') {\n return c.json({ error: 'text required' }, 400)\n }\n const text = await service.app.expandSigilChips(body.text, {\n uiHost: false,\n skipPrefixes: new Set(['model']),\n })\n return c.json({ text })\n })\n\n /**\n * RFC-105 D10/M105-8:插件状态栏条目——web-ui 消费与 TUI 同样的前端无关解析逻辑\n * (App.getPluginStatusItems() = resolveStatusItems(activePlugins()))。\n * 条目 = { id: \"pluginId:itemId\", text: \"显示文案\" }——纯数据,前端各自渲染。\n */\n app.get('/plugin-status-items', (c) => {\n const items = service.app.getPluginStatusItems()\n return c.json({ items })\n })\n\n /**\n * RFC-105 D10/M105-8:插件全局菜单贡献——web-ui 消费与 TUI /extension 列表同样的\n * 解析逻辑(App.getGlobalMenuItems() = resolveGlobalMenuItems(activePlugins()))。\n */\n app.get('/plugin-menu-items', (c) => {\n const items = service.app.getGlobalMenuItems()\n return c.json({ items })\n })\n\n /**\n * RFC-233:用户自定义 `[@shortcut:name]` 文本快捷方式——TUI(`/shortcuts` 命令)与\n * web-ui 共用同一套 App.getShortcuts/saveShortcut/deleteShortcut 权威实现,本路由\n * 只是薄转发(同 sigil/expand 端点模式)。\n */\n app.get('/shortcuts', (c) => {\n return c.json({ shortcuts: service.app.getShortcuts() })\n })\n\n app.post('/shortcuts', async (c) => {\n const body = await c.req\n .json<{ name?: string; text?: string; previousName?: string }>()\n .catch(() => ({}) as { name?: string; text?: string; previousName?: string })\n if (typeof body.name !== 'string' || typeof body.text !== 'string') {\n return c.json({ error: 'name and text are required' }, 400)\n }\n try {\n await service.app.saveShortcut(body.name, body.text, body.previousName)\n return c.json({ shortcuts: service.app.getShortcuts() })\n } catch (e) {\n return c.json({ error: e instanceof Error ? e.message : String(e) }, 400)\n }\n })\n\n app.delete('/shortcuts/:name', async (c) => {\n await service.app.deleteShortcut(c.req.param('name'))\n return c.json({ shortcuts: service.app.getShortcuts() })\n })\n\n /**\n * RFC-105 D10/M105-8:插件消息渲染器元数据——web-ui 查看当前已注册的渲染器列表\n * (matcher 信息),供 web 前端决定是否为特定消息类型自定义渲染。\n */\n app.get('/plugin-renderers', (c) => {\n const renderers = service.app.getPluginRenderers()\n return c.json({ renderers })\n })\n\n /**\n * RFC-206 M9 前置子任务②:插件状态栏代码式徽标元数据——只暴露 id/pluginId/tickMs,\n * 不含渲染函数本体(`render` 依赖 `@x-otto/tui` 特有的运行时执行面,无法跨 HTTP 边界\n * 传输,见 `packages/coding/src/types.ts` ServiceHostPort.getPluginStatusWidgets 头\n * 注释、RFC-206 § 2.4 D8)。用途是\"这里有插件贡献的动态徽标可用\"的展示提示。\n */\n app.get('/plugin-status-widgets', (c) => {\n const widgets = service.app.getPluginStatusWidgets()\n return c.json({ widgets })\n })\n\n /**\n * RFC-206 M9 前置子任务②:插件文件查看器候选元数据——只暴露 id/pluginId/label/matcher,\n * 不含渲染函数本体(同上,`render` 依赖终端列宽等 TUI 特有上下文)。\n */\n app.get('/plugin-file-viewers', (c) => {\n const viewers = service.app.getPluginFileViewers()\n return c.json({ viewers })\n })\n\n return app\n}\n","import { Hono } from 'hono'\nimport { globalAgentJobRegistry } from '@x-otto/runtime'\nimport type { AgentSessionJob } from '@x-otto/runtime'\nimport type { CodingService } from '../coding-service'\n\n/**\n * RFC-351 M1:作业列表 + 工件 diff 端点。\n *\n * 只读——service 不暴露 startJob/cancel(RFC-117 D6 安全边界:前端不得成为任务创建入口)。\n * 作业列表来自 globalAgentJobRegistry(模块级单例,所有进程共享同一份)。\n */\nexport function createJobsRoute(_context: CodingService): Hono {\n const app = new Hono()\n\n /** 作业列表投影——只暴露前端需要的字段。 */\n function projectJob(job: AgentSessionJob) {\n return {\n id: job.id,\n sessionId: job.sessionId,\n title: job.title,\n origin: job.origin,\n status: job.status,\n startedAt: job.startedAt,\n hasDiff: job.diff != null,\n }\n }\n\n app.get('/', (c) => {\n const jobs = globalAgentJobRegistry.list()\n // 按开始时间降序(最新的在前)\n const sorted = [...jobs].sort((a, b) => b.startedAt - a.startedAt)\n return c.json({ jobs: sorted.map(projectJob) })\n })\n\n app.get('/:id/diff', (c) => {\n const jobId = c.req.param('id')\n const job = globalAgentJobRegistry.get(jobId)\n if (!job) {\n return c.json({ error: 'job not found' }, 404)\n }\n if (job.diff == null) {\n return c.json({ error: 'diff not ready (job may still be running)' }, 409)\n }\n return c.json({ id: job.id, diff: job.diff })\n })\n\n app.get('/:id', (c) => {\n const jobId = c.req.param('id')\n const job = globalAgentJobRegistry.get(jobId)\n if (!job) {\n return c.json({ error: 'job not found' }, 404)\n }\n return c.json({ job: projectJob(job) })\n })\n\n return app\n}\n","import { Hono } from 'hono'\nimport { CodingService } from '../coding-service'\n\n/**\n * plugin-feedback 路由(RFC-209 §2.5/§3.1):暴露 Feedback 插件业务契约给 web-ui。\n *\n * 与 catalog.ts 的 D8 既有模式一致——只读快照 + 写操作转发,数据权威仍是 App(经\n * ServiceHostPort 窄接口间接调用 FeedbackRegistry,service 不持有具体插件实现引用)。\n *\n * **安全边界(RFC-209 §2.5/重要事项规则7)**:本文件绝不引用 `submitIssueViaGh`\n * ——issue 提交端点只调用 `buildFeedbackIssueUrl`(`ServiceHostPort.buildFeedbackIssueUrl`\n * 内部只调用插件的 `buildIssueUrl`,物理上没有到达 gh CLI 调用路径的代码),防止 web-ui\n * 浏览器请求误触发服务器侧 gh CLI 调用。\n */\nexport function createPluginFeedbackRoute(service: CodingService): Hono {\n const app = new Hono()\n\n /** 插件是否已装载——web-ui 据此决定是否展示反馈相关 UI(503 而非 500,见 RFC-209 §2.6)。 */\n app.get('/status', (c) => {\n const available = service.app.isFeedbackAvailable()\n if (!available) {\n return c.json({ available: false }, 503)\n }\n return c.json({ available: true })\n })\n\n /** 满意度评分提交——与 TUI 走同一个 FeedbackRegistry/同一份数据落地。 */\n app.post('/pulse-survey', async (c) => {\n if (!service.app.isFeedbackAvailable()) {\n return c.json({ error: 'feedback plugin not available' }, 503)\n }\n const body = await c.req\n .json<{ rating?: string; comment?: string; sdkVersion?: string; modelId?: string }>()\n .catch(() => ({}) as { rating?: string; comment?: string; sdkVersion?: string; modelId?: string })\n if (!body.rating || !['good', 'neutral', 'bad'].includes(body.rating)) {\n return c.json({ error: 'rating must be one of good|neutral|bad' }, 400)\n }\n if (!body.sdkVersion) {\n return c.json({ error: 'sdkVersion is required' }, 400)\n }\n service.app.recordPulseSurvey({\n ts: Date.now(),\n rating: body.rating as 'good' | 'neutral' | 'bad',\n comment: body.comment,\n sdkVersion: body.sdkVersion,\n modelId: body.modelId,\n })\n return c.json({ ok: true })\n })\n\n /**\n * Issue 反馈提交——**只调用 buildFeedbackIssueUrl**(构造预填 URL,不执行任何子进程/\n * 网络调用),前端拿到 URL 后自行 `window.open()`。不支持 gh CLI 通道(RFC-209 §2.5:\n * web-ui 场景下浏览器请求与本地终端 gh 认证是完全不同的信任边界)。\n */\n app.post('/issue', async (c) => {\n if (!service.app.isFeedbackAvailable()) {\n return c.json({ error: 'feedback plugin not available' }, 503)\n }\n const body = await c.req\n .json<{ title?: string; reproduce?: string; expected?: string; actual?: string; envInfo?: string; repo?: string }>()\n .catch(() => ({}) as { title?: string; reproduce?: string; expected?: string; actual?: string; envInfo?: string; repo?: string })\n if (!body.title) {\n return c.json({ error: 'title is required' }, 400)\n }\n if (!body.repo) {\n return c.json({ error: 'repo is required' }, 400)\n }\n const url = service.app.buildFeedbackIssueUrl({\n title: body.title,\n reproduce: body.reproduce,\n expected: body.expected,\n actual: body.actual,\n envInfo: body.envInfo ?? '',\n repo: body.repo,\n })\n if (!url) {\n return c.json({ error: 'feedback plugin does not support buildIssueUrl' }, 503)\n }\n return c.json({ url })\n })\n\n return app\n}\n","import type { Context, Next } from 'hono'\nimport type { StorageHostBinding } from '@x-otto/coding'\nimport { tokenMatches, bearerToken } from '../routes/auth'\n\n/**\n * storage / events / sync 路由 + 鉴权所需的**最小宿主上下文**(M93-01,RFC-057 §3 D7)。\n * 完整 `CodingService` 结构满足之;persistenced 独立服务用裸对象满足——取代原\n * `as unknown as CodingService` 假 context 断言,恢复编译期保护。\n */\nexport interface StorageRouteContext {\n app: { storage: { storageHost: StorageHostBinding | null } }\n}\n\n/**\n * Storage Bearer 鉴权中间件工厂(M28-06 重构収敛)。\n *\n * storage / events / sync 三个路由共用完全一致的鉴权模型:\n * - 宿主未配置 → 404(特性关闭)\n * - token 空/不匹配 → 403\n * - 通过 → next()\n *\n * 返回 `binding()` 函子供路由在鉴权后获取最新 binding(支持运行时替换)。\n */\nexport function storageAuth(context: StorageRouteContext): {\n middleware: (c: Context, next: Next) => Promise<void>\n binding: () => StorageHostBinding | null\n} {\n const binding = () => context.app.storage.storageHost ?? null\n\n const middleware = async (c: Context, next: Next) => {\n const storage = binding()\n if (!storage) {\n return c.json({ error: 'storage_host_not_configured' }, 404) as unknown as void\n }\n if (!storage.token || !tokenMatches(bearerToken(c), storage.token)) {\n return c.json({ error: 'forbidden' }, 403) as unknown as void\n }\n await next()\n }\n\n return { middleware, binding }\n}\n","import { DEFAULT_WORKSPACE_KEY, isValidWorkspaceId } from '@x-otto/workspace'\nimport type { Context, Next } from 'hono'\n\n/**\n * workspaceAuth 返回 Hono 中间件:从 URL 路径提取 `:wsKey`,校验格式。\n * - wsKey 不以 `ws_` 开头或 id 非法 → 400\n * - 通过 → next()\n *\n * 第二层(scope check):TokenClaims.workspaces 与 wsKey 交集——留钩子,\n * 待 M29 identity 在生产环境承载多租户时接入。\n */\nexport function workspaceAuth(): (c: Context, next: Next) => Promise<void> {\n return async (c, next) => {\n const wsKey = c.req.param('wsKey')\n if (!wsKey) {\n return c.json({ error: 'missing_workspace_key' }, 400) as unknown as void\n }\n\n if (wsKey !== DEFAULT_WORKSPACE_KEY) {\n if (!wsKey.startsWith('ws_') || !isValidWorkspaceId(wsKey.slice(3))) {\n return c.json({ error: 'invalid_workspace_key' }, 400) as unknown as void\n }\n }\n\n await next()\n }\n}\n\n/** 从 wsKey 提取 id(去 `ws_` 前缀),已校验。 */\nexport function parseWorkspaceId(wsKey: string): string {\n const id = wsKey.startsWith('ws_') ? wsKey.slice(3) : wsKey\n return id\n}\n\n/**\n * 查询参数 `?ws=` 的格式校验(events 路由用——wsKey 不在 path 而在 query)。\n */\nexport function validateWsQuery(c: Context): string | null {\n const wsParam = c.req.query('ws')\n if (!wsParam) return null\n if (wsParam === DEFAULT_WORKSPACE_KEY) return wsParam\n if (!wsParam.startsWith('ws_')) return null\n const id = wsParam.slice(3)\n if (!isValidWorkspaceId(id)) return null\n return wsParam\n}\n","/**\n * 进程内事件总线(M29-04-01)。\n *\n * SSE 路由和 storage append 路由共享此实例:\n * - SSE: `eventBus.on(topic, cb)` 订阅 append 事件 → SSE push\n * - Storage: `eventBus.emit(event)` 发布 append 事件 → 广播给所有 SSE 订阅者\n *\n * 设计决策:模块级单例而非 CodingService 成员——\n * 两个独立路由(events.ts 和 storage.ts)都需要访问同一实例,\n * 单例避免了通过 CodingService 传参的耦合。\n */\nexport interface AppendEvent {\n /** topic,如 'sessions'。 */\n namespace: string\n /**\n * workspace 分区键。SSE live-push 据此按订阅者 wsKey 过滤——缺省(legacy/单租户)\n * 不携带则订阅者收全量。多租户下 emit 必带,订阅者按 wsKey 隔离(防 B12 跨 workspace 泄漏)。\n */\n wsKey?: string\n docId: string\n entry: unknown\n /** Unix ms。 */\n ts: number\n}\n\nexport type Unsubscribe = () => void\n\nexport class EventBus {\n private listeners = new Map<string, Set<(event: AppendEvent) => void>>()\n\n /**\n * 订阅某个 namespace 的 append 事件。\n * @returns 取消订阅函数。\n */\n on(namespace: string, callback: (event: AppendEvent) => void): Unsubscribe {\n if (!this.listeners.has(namespace)) {\n this.listeners.set(namespace, new Set())\n }\n this.listeners.get(namespace)!.add(callback)\n return () => {\n this.listeners.get(namespace)?.delete(callback)\n }\n }\n\n /**\n * 发布 append 事件到所有订阅了对应 namespace 的监听器。\n * 单个监听器异常不影响其他监听器。\n */\n emit(event: AppendEvent): void {\n const cbs = this.listeners.get(event.namespace)\n if (!cbs) return\n for (const cb of cbs) {\n try {\n cb(event)\n } catch {}\n }\n }\n\n /** 仅测试使用。 */\n reset(): void {\n this.listeners.clear()\n }\n\n /** 调试/测试用。 */\n get listenerCount(): number {\n let count = 0\n for (const set of this.listeners.values()) {\n count += set.size\n }\n return count\n }\n}\n\nexport const eventBus = new EventBus()\n","import { Hono } from 'hono'\nimport { createLogger } from '@x-otto/shared'\nimport { storageAuth } from '../middleware/storage-auth'\nimport { workspaceAuth } from '../middleware/workspace-auth'\nimport { eventBus } from '../event-bus'\n\nimport type { Context } from 'hono'\nimport type { StorageHost } from '@x-otto/persistence'\nimport type { StorageRouteContext } from '../middleware/storage-auth'\n\nconst logger = createLogger('@x-otto/service:storage')\n\nexport function createStorageRoute(context: StorageRouteContext): Hono {\n const app = new Hono()\n const { middleware, binding } = storageAuth(context)\n\n app.use('/:namespace/:wsKey/*', workspaceAuth())\n app.use('*', middleware)\n\n const resolveHost = (\n c: Context,\n ): { namespace: string; wsKey: string; host: StorageHost } | null => {\n const storage = binding()\n const namespace = c.req.param('namespace')\n const wsKey = c.req.param('wsKey')\n if (!storage || !namespace || !wsKey || !storage.host.has(namespace)) {\n return null\n }\n return { namespace, wsKey, host: storage.host }\n }\n\n app.get('/:namespace/:wsKey', async (c) => {\n const resolved = resolveHost(c)\n if (!resolved) {\n return c.json({ error: 'unknown_namespace' }, 404)\n }\n const { namespace, wsKey, host } = resolved\n\n try {\n const agentId = c.req.header('X-Agent-Id')\n const scope = c.req.query('scope') as 'owned' | 'visible' | 'all' | undefined\n const page = c.req.query('page')\n\n if (page === undefined) {\n const ids = await host.list(namespace, wsKey, agentId, scope)\n return c.json({ ids })\n }\n\n // F12:0-based page,与 host.listPaginated 契约对齐(StorageHost 已改 0-based)。\n // 用显式 Number.isFinite 判断而非 `|| 0`——`0 || 0` 无风险但 `parseInt('0')||1`\n // 曾把合法的 page=0(首页)误判为缺省值升成 1,是本次一并修复的第二处 bug。\n const parsedPage = Number.parseInt(page, 10)\n const parsedPageSize = Number.parseInt(c.req.query('pageSize') ?? '', 10)\n const result = await host.listPaginated(namespace, wsKey, {\n page: Number.isFinite(parsedPage) && parsedPage >= 0 ? parsedPage : 0,\n pageSize: Number.isFinite(parsedPageSize) && parsedPageSize > 0 ? parsedPageSize : 20,\n sortBy: c.req.query('sortBy') ?? 'updatedAt',\n order: c.req.query('order') === 'asc' ? 'asc' : 'desc',\n })\n return c.json(result)\n } catch (error) {\n logger.error({ namespace, wsKey, error }, 'storage list failed')\n return c.json({ error: 'storage_error' }, 500)\n }\n })\n\n app.get('/:namespace/:wsKey/:id', async (c) => {\n const resolved = resolveHost(c)\n if (!resolved) {\n return c.json({ error: 'unknown_namespace' }, 404)\n }\n const { namespace, wsKey, host } = resolved\n\n try {\n const document = await host.load(namespace, wsKey, c.req.param('id'))\n if (document === null) {\n return c.json({ error: 'not_found' }, 404)\n }\n return c.json(document)\n } catch (error) {\n logger.error({ namespace, wsKey, error }, 'storage load failed')\n return c.json({ error: 'storage_error' }, 500)\n }\n })\n\n app.put('/:namespace/:wsKey/:id', async (c) => {\n const resolved = resolveHost(c)\n if (!resolved) {\n return c.json({ error: 'unknown_namespace' }, 404)\n }\n const { namespace, wsKey, host } = resolved\n\n const document = await c.req.json().catch(() => undefined)\n if (document === undefined) {\n return c.json({ error: 'invalid_body' }, 400)\n }\n\n try {\n const agentId = c.req.header('X-Agent-Id')\n await host.save(namespace, wsKey, c.req.param('id'), document, agentId)\n return c.json({ ok: true })\n } catch (error) {\n logger.error({ namespace, wsKey, error }, 'storage save failed')\n return c.json({ error: 'storage_error' }, 500)\n }\n })\n\n app.delete('/:namespace/:wsKey/:id', async (c) => {\n const resolved = resolveHost(c)\n if (!resolved) {\n return c.json({ error: 'unknown_namespace' }, 404)\n }\n const { namespace, wsKey, host } = resolved\n\n try {\n const removed = await host.delete(namespace, wsKey, c.req.param('id'))\n return removed ? c.json({ ok: true }) : c.json({ error: 'not_found' }, 404)\n } catch (error) {\n logger.error({ namespace, wsKey, error }, 'storage delete failed')\n return c.json({ error: 'storage_error' }, 500)\n }\n })\n\n app.post('/:namespace/:wsKey/:id/entries', async (c) => {\n const resolved = resolveHost(c)\n if (!resolved) {\n return c.json({ error: 'unknown_namespace' }, 404)\n }\n const { namespace, wsKey, host } = resolved\n const docId = c.req.param('id')\n\n const body = await c.req.json().catch(() => undefined)\n if (body === undefined) {\n return c.json({ error: 'invalid_body' }, 400)\n }\n\n try {\n const result = await host.appendEntry(namespace, wsKey, docId, body)\n\n eventBus.emit({\n namespace,\n wsKey,\n docId,\n entry: result.entry,\n ts: Date.now(),\n })\n\n return c.json({ seq: result.seq, ts: Date.now() })\n } catch (error) {\n logger.error({ namespace, docId, error }, 'entry append failed')\n return c.json({ error: 'storage_error' }, 500)\n }\n })\n\n return app\n}\n","import { Hono, type Context, type Next } from 'hono'\nimport { cors } from 'hono/cors'\nimport { tokenMatches, bearerToken } from './routes/auth'\nimport { createHealthRoute } from './routes/health'\nimport { createAuthorityRoute } from './routes/authority'\nimport { createChatRoute } from './routes/chat'\nimport { createSessionsRoute } from './routes/sessions'\nimport { createSettingRoute } from './routes/setting'\nimport { createDevtoolsRoute } from './routes/devtools'\nimport { createDebuggerRoute } from './routes/debugger'\nimport { createLoggerRoute } from './routes/logs'\nimport { createCatalogRoute } from './routes/catalog'\nimport { createJobsRoute } from './routes/jobs'\nimport { createPluginFeedbackRoute } from './routes/plugin-feedback'\nimport { createStorageRoute } from './routes/storage'\nimport type { Devtools } from '@x-otto/devtools'\nimport type { CodingService } from './coding-service'\nimport type { DebugBridge } from './debug-bridge'\n\ninterface AppOptions {\n corsOrigin?: string\n devtools?: Devtools\n staticDir?: string\n debug?: DebugBridge | null\n\n authToken?: string\n}\n\n/**\n * 鉴权豁免路由(默认拒绝下的白名单)——其余 `/api/*` 一律要求 token。\n * - `/api/health`:存活探针,公开(无敏感数据)。\n * - `/api/storage`:自带 `storageAuth` 中间件(独立 token 体系),不套主鉴权以免双重/冲突。\n *\n * 终局架构 review:此前是「保护清单」(AUTH_PROTECTED_BASES) ——新增 `/api/*` 路由会**默认无鉴权\n * (fail-open)**。改为默认拒绝 + 显式豁免,安全姿态从 opt-in 翻为 opt-out。\n */\nconst AUTH_PUBLIC_BASES = ['/api/health', '/api/storage']\n\nexport function createApp(context: CodingService, options: AppOptions = {}): Hono {\n const app = new Hono()\n\n if (options.corsOrigin) {\n app.use(\n '/api/*',\n cors({\n origin: options.corsOrigin,\n allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],\n allowHeaders: ['Content-Type', 'Authorization'],\n }),\n )\n }\n\n if (options.authToken) {\n const token = options.authToken\n const requireAuth = async (c: Context, next: Next) => {\n if (!tokenMatches(bearerToken(c), token)) {\n return c.json({ error: 'forbidden' }, 403) as unknown as void\n }\n await next()\n }\n // 默认拒绝:保护全部 /api/*,仅显式豁免 AUTH_PUBLIC_BASES(health/storage)。\n // 必须 `return` 中间件结果以传播 requireAuth 失败时的 403 Response(否则 Hono 丢短路、续跑路由)。\n app.use('/api/*', (c: Context, next: Next) => {\n const path = c.req.path\n const exempt = AUTH_PUBLIC_BASES.some((b) => path === b || path.startsWith(`${b}/`))\n return exempt ? next() : requireAuth(c, next)\n })\n }\n\n app.route('/api/health', createHealthRoute(context))\n // RFC-335 M1:authority descriptor 含 workspaceDir,故不进 AUTH_PUBLIC_BASES 豁免。\n app.route('/api/authority', createAuthorityRoute(context))\n app.route('/api/chat', createChatRoute(context))\n app.route('/api/sessions', createSessionsRoute(context))\n app.route('/api/storage', createStorageRoute(context))\n app.route('/api/setting', createSettingRoute(context))\n app.route('/api/devtools', createDevtoolsRoute(context, options.devtools || null))\n app.route('/api/debugger', createDebuggerRoute(context))\n app.route('/api/logs', createLoggerRoute(context))\n app.route('/api/catalog', createCatalogRoute(context))\n app.route('/api/jobs', createJobsRoute(context))\n app.route('/api/plugin-feedback', createPluginFeedbackRoute(context))\n\n if (options.staticDir) {\n app.get('*', (c) => {\n return context.static(c)\n })\n }\n\n app.notFound((c) => {\n return c.text('not found', 404)\n })\n\n return app\n}\n","/**\n * session-event-log.ts — per-session 有界事件日志(RFC-335 M3)。\n *\n * ## 解决的问题\n *\n * M1 遗留的协议缺口:客户端水合流程是「① 取 snapshot → ② WS 订阅」,而 service 侧\n * `WebSocketManager.sendToSubscribers()` 在零订阅者时**直接丢弃**事件(无重放、无回退)。\n * 于是 ①②之间产生的事件永久丢失——客户端看到的转录会缺一段,且**自己无从察觉**。\n * 这正是 M1 未承诺\"无缝接续\"的原因。\n *\n * ## 保证的精确边界(不可含糊)\n *\n * 本机制只覆盖 **`Session.event` 域**(会话转录流:prompt/stream/tool/turn 等)。\n * **不覆盖**:\n * - `Trace.event`(TraceBridge 直接经 `ws` 下发,有自己的 append-log 与 seq 体系)\n * - `Debugger.*`(DebugBridge 直接经 `ws` 下发,属调试域)\n * - `Runtime.error` 类瞬时通知(如 `routes/chat.ts` 的 PROMPT_FAILED)\n * 这些不进本日志,故**没有**补发保证。宣称\"无丢事件\"时必须限定为 Session.event 域,\n * 否则就是超出实现的承诺。\n *\n * ## 客户端协议约束(MUST)\n *\n * 补发经定向 `sendToClient`、实时流经 `sendToSubscribers`,两条通道交错时**wire 到达\n * 顺序不等于 seq 顺序**(尤其存在 a2ui payload 这类 async fire-and-forget 旁路)。\n * 客户端 **MUST 按 `seq` 排序处理并按 `seq` 幂等去重**,不得假定\"先到 = 更早\"。\n * seq 本身由 `append()` 同步分配,始终单调正确。\n *\n * ## 机制\n *\n * authority 为每个 session 维护单调递增序列号与一段有界历史。snapshot 返回当时的\n * `cursor`;客户端订阅时带上它,服务端把 `cursor` 之后的事件先行补发,再接实时流。\n *\n * ## 为什么必须有界,以及有界带来的诚实代价\n *\n * 会话事件是无界流(长任务可产出海量 token 事件),全量保留必然 OOM。故采用环形缓冲。\n * 但这意味着**落后太多的客户端请求的事件可能已被逐出**——此时绝不能假装成功:\n * `readFrom()` 会返回 `{ ok: false, reason: 'gap' }`,调用方必须让客户端重新走\n * snapshot 全量水合。**静默返回\"能补的那部分\"是最危险的做法**:客户端会以为自己\n * 拿到了完整序列,实则中间缺了一段,且永远不会发现。\n */\nimport type { WebSocketMessage } from './types'\n\n/** 单条已编号事件。`seq` 在单个 session 内单调递增,从 1 开始。 */\nexport interface SequencedEvent {\n seq: number\n message: WebSocketMessage\n}\n\nexport type EventLogRead =\n /** 成功:`events` 是 cursor 之后的全部事件(可能为空,表示客户端已是最新)。 */\n | { ok: true; events: SequencedEvent[] }\n /**\n * 失败:请求的 cursor 已被环形缓冲逐出,无法补齐中间缺口。\n * 调用方**必须**让客户端重新全量水合,不得降级为部分补发。\n */\n | { ok: false; reason: 'gap'; oldestAvailable: number }\n\n/** 每个 session 保留的事件条数上限。超出即逐出最旧的。 */\nconst DEFAULT_CAPACITY = 512\n\nexport class SessionEventLog {\n private readonly buffers = new Map<string, SequencedEvent[]>()\n private readonly cursors = new Map<string, number>()\n\n constructor(private readonly capacity: number = DEFAULT_CAPACITY) {}\n\n /** 追加一条事件并返回其序列号。序列号由本方法唯一分配,调用方不得自行编号。 */\n append(sessionId: string, message: WebSocketMessage): number {\n const seq = (this.cursors.get(sessionId) ?? 0) + 1\n this.cursors.set(sessionId, seq)\n\n const buffer = this.buffers.get(sessionId) ?? []\n buffer.push({ seq, message })\n // 环形逐出:只保留最近 capacity 条。\n if (buffer.length > this.capacity) {\n buffer.splice(0, buffer.length - this.capacity)\n }\n this.buffers.set(sessionId, buffer)\n return seq\n }\n\n /** 当前游标(= 已分配的最大序列号)。session 无事件时为 0。 */\n cursorOf(sessionId: string): number {\n return this.cursors.get(sessionId) ?? 0\n }\n\n /**\n * 读取 `after` 之后的事件。\n *\n * `after === cursorOf()` → 成功且为空(客户端已最新)。\n * `after` 早于缓冲区最旧一条 → `gap` 失败(中间已被逐出,无法诚实补齐)。\n */\n readFrom(sessionId: string, after: number): EventLogRead {\n const cursor = this.cursorOf(sessionId)\n if (after > cursor) {\n // 客户端游标超前于服务端:只可能是它连到了另一个 authority 实例(重启/换机),\n // 其序列号空间与本实例无关,必须重新水合。\n return { ok: false, reason: 'gap', oldestAvailable: cursor }\n }\n if (after === cursor) {\n return { ok: true, events: [] }\n }\n\n const buffer = this.buffers.get(sessionId) ?? []\n const oldest = buffer[0]?.seq ?? cursor + 1\n // after 之后的第一条应是 after+1;若它已被逐出即产生不可弥补的缺口。\n if (after + 1 < oldest) {\n return { ok: false, reason: 'gap', oldestAvailable: oldest }\n }\n return { ok: true, events: buffer.filter((e) => e.seq > after) }\n }\n\n /** 会话结束/detach 时清理,避免 Map 无界增长。 */\n clear(sessionId: string): void {\n this.buffers.delete(sessionId)\n this.cursors.delete(sessionId)\n }\n}\n","import { readFileSync, existsSync } from 'node:fs'\nimport { randomUUID } from 'node:crypto'\nimport { join, extname, sep } from 'node:path'\nimport { Hono, type Context } from 'hono'\nimport { createAdaptorServer } from '@hono/node-server'\nimport { createLogger } from '@x-otto/shared'\nimport { WebSocketManager } from './websocket-manager'\nimport { EventBridge } from './event-bridge'\nimport { TraceBridge } from './trace-bridge'\nimport { DebugBridge } from './debug-bridge'\nimport { InboundRouter } from './inbound-router'\nimport { createApp } from './create-app'\nimport { SessionEventLog } from './session-event-log'\nimport { serializeSessionMessages } from './message-serializer'\nimport { type IncomingMessage, type Server } from 'node:http'\nimport type {\n AuthorityDescriptor,\n CodingServiceOptions,\n IMessageSender,\n SessionSnapshot,\n WebSocketClientMessage,\n} from './types'\nimport type { Socket } from 'node:net'\nimport type { AgentSession, ServiceHostPort } from '@x-otto/coding'\nimport { defineHook } from '@x-otto/hooks'\n\nconst logger = createLogger('@x-otto/service')\n\nconst MIME_TYPES: Record<string, string> = {\n '.html': 'text/html',\n '.js': 'application/javascript',\n '.css': 'text/css',\n '.json': 'application/json',\n '.png': 'image/png',\n '.svg': 'image/svg+xml',\n '.ico': 'image/x-icon',\n '.woff2': 'font/woff2',\n '.woff': 'font/woff',\n}\n\nexport class CodingService {\n private readonly httpApp: Hono\n private readonly server: Server\n private readonly host: string\n private readonly port: number\n private readonly staticDir?: string\n private readonly apiToken?: string\n private readonly wsAuthToken?: string\n /** RFC-335 M1:本 Authority 实例的非秘密身份;只用于 lifecycle state 与客户端重连判别。 */\n private readonly authority: AuthorityDescriptor\n /** RFC-335 M3:per-session 事件序列号 + 有界历史,支撑 snapshot→subscribe 无缝接续。 */\n private readonly eventLog = new SessionEventLog()\n private readonly bridges = new Map<string, EventBridge>()\n private readonly traceBridges = new Map<string, TraceBridge>()\n private readonly router: InboundRouter\n private started = false\n\n public readonly bridge: DebugBridge | null = null\n public readonly ws: WebSocketManager\n\n get httpServer(): Server {\n return this.server\n }\n\n constructor(\n public readonly app: ServiceHostPort,\n options: CodingServiceOptions,\n ) {\n this.host = options.host ?? '127.0.0.1'\n this.port = options.port\n this.staticDir = options.staticDir\n this.apiToken = options.apiToken\n this.wsAuthToken = options.wsAuthToken\n // 冻结(含 capabilities 数组):`getAuthorityDescriptor()` 直接返回本引用,\n // 冻结后进程内调用方无法 push/改写能力声明,descriptor 保持只读事实。\n this.authority = Object.freeze({\n instanceId: options.authorityId ?? randomUUID(),\n workspaceDir: app.workspaceDir,\n protocolVersion: 1,\n capabilities: Object.freeze(['session.snapshot', 'session.subscribe'] as const),\n })\n\n this.ws = new WebSocketManager({\n allowedOrigins: options.cors ? [options.cors] : undefined,\n authToken: options.wsAuthToken,\n })\n\n if (app.devtools) {\n this.bridge = new DebugBridge(app.devtools, this.ws)\n }\n\n this.router = new InboundRouter(this.ws, this.app, this.bridge, (sessionId, after) =>\n this.eventLog.readFrom(sessionId, after),\n )\n\n this.httpApp = createApp(this, {\n corsOrigin: options.cors,\n devtools: app.devtools ?? undefined,\n staticDir: options.staticDir,\n debug: this.bridge,\n authToken: options.apiToken,\n })\n\n this.server = createAdaptorServer({\n fetch: this.httpApp.fetch,\n }) as Server\n }\n\n registerHooks(app: ServiceHostPort): void {\n const attachOnEvent = ({ sessionId }: { sessionId: string }) => {\n const session = this.getSession(sessionId)\n if (session) {\n this.attachSession(session)\n }\n }\n\n app.registerHook(\n defineHook({\n name: 'service_session_attach',\n timing: 'session.created',\n priority: 5,\n handle: attachOnEvent,\n }),\n )\n\n app.registerHook(\n defineHook({\n name: 'service_session_restore_attach',\n timing: 'session.restored',\n priority: 5,\n handle: attachOnEvent,\n }),\n )\n\n app.registerHook(\n defineHook({\n name: 'service_session_detach',\n timing: 'session.deleted',\n priority: 5,\n handle: ({ sessionId }) => {\n this.detachSession(sessionId)\n },\n }),\n )\n }\n\n unregisterHooks(app: ServiceHostPort): void {\n app.unregisterHook('service_session_attach')\n\n app.unregisterHook('service_session_restore_attach')\n app.unregisterHook('service_session_detach')\n }\n\n getSession(sessionId: string): AgentSession | undefined {\n return this.app.getSession(sessionId)\n }\n\n getActiveSession(): AgentSession | undefined {\n return this.app.getActiveSession()\n }\n\n /** RFC-335 M1:可序列化的唯一 session authority 描述符。 */\n getAuthorityDescriptor(): AuthorityDescriptor {\n return this.authority\n }\n\n /**\n * RFC-335 M1/M3:只读水合快照,携带 `cursor`(拍摄快照时该 session 的事件序列号)。\n *\n * 客户端凭 `cursor` 订阅(`Session.subscribe` 带 `since`)即可获得**无缝接续**:\n * 服务端先补发 cursor 之后的事件,再转实时流。若 cursor 已被环形缓冲逐出,服务端\n * 会明确回报 gap 而非静默少发(见 `SessionEventLog`)。\n */\n getSessionSnapshot(sessionId: string): SessionSnapshot | undefined {\n const session = this.getSession(sessionId)\n if (!session) return undefined\n return {\n authority: this.authority,\n session: {\n id: session.id,\n status: session.status,\n messageCount: session.session.messages().length,\n messages: serializeSessionMessages(session),\n },\n // 先读 cursor 再序列化消息会有极窄窗口让 cursor 偏旧(多补发几条已含在快照里的\n // 事件)。宁可**重复**也不能**遗漏**:重复事件客户端可按 seq 幂等去重,遗漏则不可恢复。\n cursor: this.eventLog.cursorOf(sessionId),\n snapshotAt: new Date().toISOString(),\n }\n }\n\n /** RFC-335 M3:读取 cursor 之后的事件(供 WS 订阅补发)。 */\n readSessionEventsSince(sessionId: string, after: number) {\n return this.eventLog.readFrom(sessionId, after)\n }\n\n private readonly onUpgrade = (req: IncomingMessage, socket: Socket, head: Buffer): void => {\n const url = new URL(req.url ?? '/', `http://${this.host}:${this.port}`)\n const handled = this.ws.handleUpgrade(req, socket, head, url.pathname)\n\n if (!handled) {\n socket.destroy()\n }\n }\n\n private readonly onWsMessage = (clientId: string, message: WebSocketClientMessage): void => {\n this.router.dispatch(clientId, message)\n }\n\n async start(): Promise<void> {\n if (this.started) {\n return\n }\n\n const isLoopback = this.host === '127.0.0.1' || this.host === '::1' || this.host === 'localhost'\n // HTTP API(apiToken)与 WS 控制通道(wsAuthToken)各自暴露完整工具执行,且鉴权独立:\n // WS 的 isTokenValid 在 authToken 为空时直接放行。只查 apiToken 会让嵌入方误以为安全\n // 却把 WS 通道裸露给未鉴权远端 → 非环回必须两者齐备(RFC-074 后续 review 发现的 P1)。\n if (!isLoopback && (!this.apiToken || !this.wsAuthToken)) {\n throw new Error(\n `Refusing to bind non-loopback host \"${this.host}\" without both apiToken and wsAuthToken: ` +\n `the HTTP API and the WS control channel each expose full tool execution and are authenticated ` +\n `independently. Set options.apiToken AND options.wsAuthToken, or bind to 127.0.0.1.`,\n )\n }\n\n this.server.on('upgrade', this.onUpgrade)\n this.ws.on('message', this.onWsMessage)\n this.registerHooks(this.app)\n\n return new Promise<void>((resolve, reject) => {\n const onListenError = (err: Error): void => {\n // 回滚 listen 前已挂的接线,避免泄漏 + 重试 start 双重注册(hooks 挂到共享 hookRegistry)。\n this.server.off('error', onListenError)\n this.server.off('upgrade', this.onUpgrade)\n this.ws.off('message', this.onWsMessage)\n this.unregisterHooks(this.app)\n reject(err)\n }\n this.server.on('error', onListenError)\n this.server.listen(this.port, this.host, () => {\n this.server.off('error', onListenError)\n this.started = true\n this.bridge?.attach()\n logger.info({ host: this.host, port: this.port }, 'service started')\n resolve()\n })\n })\n }\n\n async stop(): Promise<void> {\n if (!this.started) {\n return\n }\n\n this.bridge?.detach()\n\n for (const [, bridge] of this.bridges) {\n bridge.detach()\n }\n this.bridges.clear()\n\n for (const [, traceBridge] of this.traceBridges) {\n traceBridge.detach()\n }\n this.traceBridges.clear()\n\n this.server.off('upgrade', this.onUpgrade)\n this.ws.off('message', this.onWsMessage)\n this.unregisterHooks(this.app)\n this.ws.close()\n\n return new Promise<void>((resolve) => {\n this.server.close(() => {\n this.started = false\n logger.info('service stopped')\n resolve()\n })\n })\n }\n\n attachSession(session: AgentSession): void {\n if (this.bridges.has(session.id)) {\n return\n }\n\n // RFC-335 M3:在扇出**之前**给事件编号并入日志。\n //\n // 必须记录在 `sendToSession` 这一层而非 WebSocketManager 内部:零订阅者时\n // `sendToSubscribers` 会直接丢弃消息(这正是 snapshot→subscribe 丢事件的根因),\n // 而日志的意义恰恰是保留那些\"当时没人听\"的事件供后续 cursor 补发。\n const recordingSender: IMessageSender = {\n broadcast: (message) => this.ws.broadcast(message),\n sendToSession: (sessionId, message) => {\n const seq = this.eventLog.append(sessionId, message)\n // The wire envelope carries the authority-assigned sequence. Replay and\n // live fan-out may interleave, so client arrival order is not a sequence.\n const sequenced = message.type === 'Session.event'\n ? { ...message, data: { ...message.data, seq } }\n : message\n this.ws.sendToSession(sessionId, sequenced)\n },\n // ⚠️ 不经事件日志:走此路径的消息**没有补发保证**。\n // Session.event 域的事件必须用上面的 `sendToSession`;此处保留仅为满足\n // IMessageSender 契约(当前 EventBridge 不调用它)。若未来有人用它发会话事件,\n // 那些事件会在 snapshot→subscribe 窗口内静默丢失。\n sendToSubscribers: (sessionId, message) => this.ws.sendToSubscribers(sessionId, message),\n }\n const bridge = new EventBridge(session, recordingSender, this.app)\n bridge.attach()\n this.bridges.set(session.id, bridge)\n\n const traceBridge = new TraceBridge(session.id, this.app.storage.traceStore, this.ws)\n traceBridge.attach()\n this.traceBridges.set(session.id, traceBridge)\n }\n\n detachSession(sessionId: string): void {\n const bridge = this.bridges.get(sessionId)\n if (bridge) {\n bridge.detach()\n this.bridges.delete(sessionId)\n }\n\n const traceBridge = this.traceBridges.get(sessionId)\n if (traceBridge) {\n traceBridge.detach()\n this.traceBridges.delete(sessionId)\n }\n\n this.ws.clearSessionSubscriptions(sessionId)\n // 会话已销毁,其事件历史不再有补发意义 —— 不清理会让 Map 随会话数无界增长。\n this.eventLog.clear(sessionId)\n }\n\n static(c: Context): Response {\n if (!this.staticDir) {\n return c.text('not found', 404)\n }\n\n let filePath = c.req.path\n if (filePath === '/' || !filePath.includes('.')) {\n filePath = '/index.html'\n }\n\n const fullPath = join(this.staticDir, filePath)\n\n if (fullPath !== this.staticDir && !fullPath.startsWith(this.staticDir + sep)) {\n return c.text('forbidden', 403)\n }\n\n if (!existsSync(fullPath)) {\n const indexPath = join(this.staticDir, 'index.html')\n if (existsSync(indexPath)) {\n const content = readFileSync(indexPath)\n return new Response(content, {\n headers: { 'Content-Type': 'text/html' },\n })\n }\n return c.text('not found', 404)\n }\n\n const ext = extname(fullPath)\n const mime = MIME_TYPES[ext] || 'application/octet-stream'\n const content = readFileSync(fullPath)\n return new Response(content, {\n headers: { 'Content-Type': mime },\n })\n }\n}\n\nexport function createCodingService(\n app: ServiceHostPort,\n options: CodingServiceOptions,\n): CodingService {\n return new CodingService(app, options)\n}\n","import type { Context, Next } from 'hono'\nimport { randomUUID } from 'node:crypto'\n\n/**\n * requestId 中间件(M28-02-01)。\n *\n * 每个 HTTP 请求注入唯一 UUID —— 优先使用 `X-Request-Id` 头(上游代理已分配),\n * 缺失时自动生成。同时设置 `X-Request-Id` 响应头。\n *\n * 用法:\n * app.use('*', requestId())\n * // 下游用 c.get('requestId') 读取\n */\nexport function requestId(): (c: Context, next: Next) => Promise<void> {\n return async (c: Context, next: Next) => {\n const id = c.req.header('X-Request-Id') ?? randomUUID()\n c.set('requestId', id)\n c.header('X-Request-Id', id)\n await next()\n }\n}\n","import type { Context, Next } from 'hono'\nimport { createLogger } from '@x-otto/shared'\n\nconst logger = createLogger('@x-otto/service:access')\n\n/**\n * accessLog 中间件(M28-02-02)。\n *\n * 记录每个 HTTP 请求的 method / path / status / latency(ms)。\n * 依赖 `requestId` 中间件先行注入 `c.get('requestId')`(缺失时仍可工作)。\n *\n * 用法:\n * app.use('*', requestId())\n * app.use('*', accessLog())\n */\nexport function accessLog(): (c: Context, next: Next) => Promise<void> {\n return async (c: Context, next: Next) => {\n const start = Date.now()\n await next()\n const latency = Date.now() - start\n\n logger.info(\n {\n requestId: (c.get('requestId') as string | undefined) ?? '',\n method: c.req.method,\n path: c.req.path,\n status: c.res.status,\n latency,\n },\n `${c.req.method} ${c.req.path} → ${c.res.status} ${latency}ms`,\n )\n }\n}\n","import type { Context, Next } from 'hono'\n\n/**\n * 限流中间件(M28-02-03)。\n *\n * Token bucket 算法:每 namespace+ip 有独立 bucket,默认 100 req/s。\n * 超出速率 → 429 Too Many Requests。\n *\n * 用法:\n * app.use('*', rateLimit({ defaultRps: 100 }))\n */\nexport interface RateLimitOptions {\n /** 默认每秒请求配额。缺省 100。 */\n defaultRps: number\n /** bucket 最大容量(允许短时突发),默认 = defaultRps。 */\n burst?: number\n}\n\ninterface Bucket {\n tokens: number\n lastRefill: number\n}\n\nexport function rateLimit(options: RateLimitOptions) {\n const rate = options.defaultRps\n const burst = options.burst ?? rate\n\n const buckets = new Map<string, Bucket>()\n\n const cleanupInterval = setInterval(() => {\n const cutoff = Date.now() - 5 * 60_000\n for (const [k, b] of buckets) {\n if (b.lastRefill < cutoff) {\n buckets.delete(k)\n }\n }\n }, 60_000)\n if (cleanupInterval.unref) {\n cleanupInterval.unref()\n }\n\n function key(c: Context): string {\n const ns = c.req.param('namespace') ?? c.req.path.split('/')[2] ?? 'root'\n const ip =\n c.req.header('X-Forwarded-For')?.split(',')[0]?.trim() ??\n c.req.header('X-Real-IP') ??\n '127.0.0.1'\n return `${ns}:${ip}`\n }\n\n return async (c: Context, next: Next) => {\n const k = key(c)\n const now = Date.now()\n\n let bucket = buckets.get(k)\n if (!bucket) {\n bucket = { tokens: burst, lastRefill: now }\n buckets.set(k, bucket)\n }\n\n const elapsed = (now - bucket.lastRefill) / 1000\n bucket.tokens = Math.min(burst, bucket.tokens + elapsed * rate)\n bucket.lastRefill = now\n\n if (bucket.tokens >= 1) {\n bucket.tokens--\n return next()\n }\n\n return c.json({ error: 'rate_limit_exceeded' }, 429)\n }\n}\n","import { Hono } from 'hono'\nimport { createLogger } from '@x-otto/shared'\nimport { storageAuth } from '../middleware/storage-auth'\nimport { validateWsQuery } from '../middleware/workspace-auth'\nimport { eventBus } from '../event-bus'\n\nimport type { StorageRouteContext } from '../middleware/storage-auth'\nimport type { StorageHostBinding } from '@x-otto/coding'\n\nconst logger = createLogger('@x-otto/service:events')\nconst POLL_MS = 200\n\nexport function createEventsRoute(context: StorageRouteContext): Hono {\n const app = new Hono()\n const { middleware, binding } = storageAuth(context)\n\n app.use('*', middleware)\n\n app.get('/', async (c) => {\n const storage = binding()\n if (!storage) {\n return c.json({ error: 'storage_host_not_configured' }, 404)\n }\n\n const topicsRaw = c.req.query('topics')\n if (!topicsRaw) {\n return c.json({ error: 'missing_topics' }, 400)\n }\n\n const topics = topicsRaw\n .split(',')\n .map((t) => t.trim())\n .filter(Boolean)\n\n if (topics.length === 0) {\n return c.json({ error: 'missing_topics' }, 400)\n }\n\n for (const topic of topics) {\n if (!storage.host.has(topic)) {\n return c.json({ error: `unknown_namespace: ${topic}` }, 404)\n }\n }\n\n const wsKey = validateWsQuery(c) || undefined\n const since = Number.parseInt(c.req.query('since') ?? '0', 10) || 0\n\n const abort = new AbortController()\n\n const stream = createTopicStream(storage, topics, wsKey, since, POLL_MS, abort, {\n includeTopic: true,\n })\n\n return new Response(stream, {\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n 'X-Accel-Buffering': 'no',\n },\n })\n })\n\n app.get('/:namespace', async (c) => {\n const storage = binding()\n const namespace = c.req.param('namespace')\n if (!storage || !namespace || !storage.host.has(namespace)) {\n return c.json({ error: 'unknown_namespace' }, 404)\n }\n\n const wsKey = validateWsQuery(c) || undefined\n const since = Number.parseInt(c.req.query('since') ?? '0', 10) || 0\n\n const abort = new AbortController()\n\n const stream = createTopicStream(storage, [namespace], wsKey, since, POLL_MS, abort, {\n includeTopic: false,\n })\n\n return new Response(stream, {\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n 'X-Accel-Buffering': 'no',\n },\n })\n })\n\n return app\n}\n\ninterface StreamOptions {\n includeTopic: boolean\n}\n\nfunction createTopicStream(\n storage: StorageHostBinding,\n topics: string[],\n wsKey: string | undefined,\n since: number,\n pollMs: number,\n abort: AbortController,\n opts: StreamOptions,\n): ReadableStream {\n const signal = abort.signal\n return new ReadableStream({\n async start(controller) {\n const unsubs: Array<() => void> = []\n\n for (const topic of topics) {\n unsubs.push(\n eventBus.on(topic, (ev) => {\n try {\n // B12 修复:按订阅者 wsKey 隔离 live-push(镜像 poll 路径的 streamEvents wsKey 过滤)。\n // 订阅者指定了 wsKey 时,只放行同 workspace 的事件——防跨 workspace 泄漏(多租户前置)。\n // 订阅者未指定 wsKey(legacy/admin 全量)则不过滤。\n if (wsKey !== undefined && ev.wsKey !== wsKey) {\n return\n }\n const payload: Record<string, unknown> = {\n docId: ev.docId,\n entry: ev.entry,\n ts: ev.ts,\n }\n if (opts.includeTopic) {\n payload.topic = ev.namespace\n }\n controller.enqueue(`event: append\\ndata: ${JSON.stringify(payload)}\\n\\n`)\n } catch {}\n }),\n )\n }\n\n const HEARTBEAT_MS = 30_000\n const heartbeat = setInterval(() => {\n try {\n controller.enqueue(`: ping\\n\\n`)\n } catch {\n abort.abort()\n }\n }, HEARTBEAT_MS)\n heartbeat.unref?.()\n\n signal.addEventListener(\n 'abort',\n () => {\n clearInterval(heartbeat)\n unsubs.forEach((fn) => fn())\n },\n { once: true },\n )\n\n const pollers = topics.map(async (topic) => {\n try {\n for await (const event of storage.host.streamEvents(\n topic,\n wsKey,\n since,\n pollMs,\n signal,\n )) {\n if (signal.aborted) break\n try {\n const eventType = event.op === 'delete' ? 'delete' : 'update'\n const payload: Record<string, unknown> = {\n id: event.doc_id,\n updatedAt: event.ts,\n }\n if (opts.includeTopic) {\n payload.topic = topic\n }\n controller.enqueue(`event: ${eventType}\\ndata: ${JSON.stringify(payload)}\\n\\n`)\n } catch {\n break\n }\n }\n } catch (error) {\n if (!signal.aborted) {\n logger.error({ topic, error }, 'sse poller error')\n }\n }\n })\n\n await Promise.allSettled(pollers)\n },\n cancel() {\n abort.abort()\n },\n })\n}\n","import { Hono } from 'hono'\nimport { createLogger } from '@x-otto/shared'\nimport { storageAuth } from '../middleware/storage-auth'\nimport { workspaceAuth } from '../middleware/workspace-auth'\n\nimport type { StorageRouteContext } from '../middleware/storage-auth'\n\nconst logger = createLogger('@x-otto/service:sync')\n\nexport function createSyncRoute(context: StorageRouteContext): Hono {\n const app = new Hono()\n const { middleware, binding } = storageAuth(context)\n\n app.use('/:namespace/:wsKey/*', workspaceAuth())\n app.use('*', middleware)\n\n app.post('/:namespace/:wsKey/push', async (c) => {\n const storage = binding()\n const namespace = c.req.param('namespace')\n const wsKey = c.req.param('wsKey')\n if (!storage || !namespace || !wsKey || !storage.host.has(namespace)) {\n return c.json({ error: 'unknown_namespace' }, 404)\n }\n\n const body = (await c.req.json().catch(() => undefined)) as\n | { ops?: Array<{ type: string; id: string; data?: unknown; timestamp: number }> }\n | undefined\n\n if (!body || !Array.isArray(body.ops)) {\n return c.json({ error: 'invalid_body' }, 400)\n }\n\n const { ops } = body\n const agentId = c.req.header('X-Agent-Id')\n let accepted = 0\n let rejected = 0\n const conflicts: string[] = []\n\n for (const op of ops) {\n try {\n switch (op.type) {\n case 'save':\n if (typeof op.id !== 'string' || op.data === undefined) {\n rejected++\n continue\n }\n await storage.host.save(namespace, wsKey, op.id, op.data, agentId)\n accepted++\n break\n case 'delete':\n if (typeof op.id !== 'string') {\n rejected++\n continue\n }\n await storage.host.delete(namespace, wsKey, op.id)\n accepted++\n break\n default:\n rejected++\n }\n } catch (error) {\n rejected++\n conflicts.push(op.id)\n logger.warn({ namespace, wsKey, opType: op.type, id: op.id, error }, 'sync push op failed')\n }\n }\n\n return c.json({ accepted, rejected, conflicts })\n })\n\n app.get('/:namespace/:wsKey/pull', async (c) => {\n const storage = binding()\n const namespace = c.req.param('namespace')\n const wsKey = c.req.param('wsKey')\n if (!storage || !namespace || !wsKey || !storage.host.has(namespace)) {\n return c.json({ error: 'unknown_namespace' }, 404)\n }\n\n const since = Number.parseInt(c.req.query('since') ?? '0', 10) || 0\n const idsParam = c.req.query('ids')\n const ids = idsParam\n ? idsParam\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean)\n : undefined\n\n try {\n const { documents, cursor } = await storage.host.getChangesSince(namespace, wsKey, since, ids)\n const docs: Record<string, unknown | null> = {}\n for (const [id, data] of documents) {\n docs[id] = data\n }\n\n return c.json({ documents: docs, cursor })\n } catch (error) {\n logger.error({ namespace, error }, 'sync pull failed')\n return c.json({ error: 'storage_error' }, 500)\n }\n })\n\n return app\n}\n","import { Hono } from 'hono'\nimport { createLogger } from '@x-otto/shared'\nimport { workspaceAuth } from '../middleware/workspace-auth'\n\nimport type { acquireDb } from '@x-otto/persistence'\nimport type { storageAuth } from '../middleware/storage-auth'\n\nconst logger = createLogger('@x-otto/service:schedule-lease')\n\n/** 服务端时钟判定 lease 是否已失活(RFC-169 D3c:180s)。 */\nconst STALE_MS = 180_000\n\n/**\n * schedule-lease.ts —— RFC-169 D3b: 定时任务触发所有权的服务端仲裁三端点。\n *\n * 不复用 `StorageHost`/`Persistence<T>` 抽象——lease 语义要求 `INSERT ... ON CONFLICT`\n * 条件更新(CAS),`Persistence.save()` 是无条件覆盖写,表达不了\"仅在无记录或已失活时才\n * 允许接管\"这个约束。直接持有 D3a 的独立 SQLite `Database` 句柄,用预编译语句实现。\n *\n * 鉴权复用现有 `storageAuth`(bearer token)+ `workspaceAuth`(wsKey 格式校验)中间件——\n * 不引入新鉴权模型(RFC-169 §4 重要事项规则 2)。\n *\n * M2 里程碑完成审核(子 agent 独立评审)发现:acquire 端点原实现是 SELECT(检查 stale)\n * 后接一条独立 upsert(执行)的两段式——在当前单进程 Node.js + 同步 better-sqlite3 架构下\n * 两条语句间零 yield 点,事件循环 microtask FIFO 排序恰好保证了原子性,但这是一个**隐含\n * 前提**:若未来在两条语句之间插入了任何 `await`(如加日志/加检查),TOCTOU 竞态窗口会\n * 凭空打开且无从察觉。改为 SQLite 原生 `INSERT ... ON CONFLICT DO UPDATE ... WHERE` 单条\n * 语句——WHERE 子句只在已存在记录确已 stale 时才允许 UPDATE 生效(`changes` 记 1),新记录\n * 走 INSERT 分支无条件成功;不依赖任何 JS 层的事件循环时序假设,纯 SQL 级别原子 CAS。\n */\nexport function createScheduleLeaseRoute(\n db: ReturnType<typeof acquireDb>,\n auth: ReturnType<typeof storageAuth>,\n): Hono {\n const app = new Hono()\n const { middleware, binding } = auth\n\n app.use('/:wsKey/*', workspaceAuth())\n app.use('*', middleware)\n\n // Atomic CAS acquire: unconditional INSERT for a brand-new ws_key; for an existing row,\n // the UPDATE only fires (changes=1) when the existing lease is stale (excluded.renewed_at\n // is the new `now` being inserted, unqualified `renewed_at` refers to the pre-update row).\n const acquireStmt = db.prepare<[string, string, number, number]>(\n `INSERT INTO schedule_lease (ws_key, token, renewed_at) VALUES (?, ?, ?)\n ON CONFLICT(ws_key) DO UPDATE SET token = excluded.token, renewed_at = excluded.renewed_at\n WHERE excluded.renewed_at - schedule_lease.renewed_at > ?`,\n )\n const renewStmt = db.prepare<[number, string, string]>(\n 'UPDATE schedule_lease SET renewed_at = ? WHERE ws_key = ? AND token = ?',\n )\n const deleteStmt = db.prepare<[string, string]>(\n 'DELETE FROM schedule_lease WHERE ws_key = ? AND token = ?',\n )\n\n const parseBody = async (c: import('hono').Context): Promise<{ token: string } | null> => {\n const body = await c.req.json().catch(() => undefined) as { token?: unknown } | undefined\n if (!body || typeof body.token !== 'string' || body.token.length === 0) {\n return null\n }\n return { token: body.token }\n }\n\n app.post('/:wsKey/lease/acquire', async (c) => {\n if (!binding()) return c.json({ error: 'storage_host_not_configured' }, 404)\n const wsKey = c.req.param('wsKey')\n const body = await parseBody(c)\n if (!body) return c.json({ error: 'invalid_body' }, 400)\n\n try {\n const now = Date.now()\n // `changes > 0` covers both branches: a brand-new ws_key always inserts (unconditional);\n // an existing ws_key only updates when the WHERE clause (staleness check) is satisfied —\n // SQLite reports changes=0 for a no-op ON CONFLICT DO UPDATE ... WHERE <false>.\n const result = acquireStmt.run(wsKey, body.token, now, STALE_MS)\n return c.json({ acquired: result.changes > 0 })\n } catch (error) {\n logger.error({ wsKey, error }, 'schedule lease acquire failed')\n return c.json({ error: 'lease_error' }, 500)\n }\n })\n\n app.post('/:wsKey/lease/renew', async (c) => {\n if (!binding()) return c.json({ error: 'storage_host_not_configured' }, 404)\n const wsKey = c.req.param('wsKey')\n const body = await parseBody(c)\n if (!body) return c.json({ error: 'invalid_body' }, 400)\n\n try {\n const now = Date.now()\n const result = renewStmt.run(now, wsKey, body.token)\n return c.json({ renewed: result.changes > 0 })\n } catch (error) {\n logger.error({ wsKey, error }, 'schedule lease renew failed')\n return c.json({ error: 'lease_error' }, 500)\n }\n })\n\n app.post('/:wsKey/lease/release', async (c) => {\n if (!binding()) return c.json({ error: 'storage_host_not_configured' }, 404)\n const wsKey = c.req.param('wsKey')\n const body = await parseBody(c)\n if (!body) return c.json({ error: 'invalid_body' }, 400)\n\n try {\n // Idempotent — releasing a lease you don't hold (or that's already gone) is not an error.\n deleteStmt.run(wsKey, body.token)\n return c.json({ released: true })\n } catch (error) {\n logger.error({ wsKey, error }, 'schedule lease release failed')\n return c.json({ error: 'lease_error' }, 500)\n }\n })\n\n return app\n}\n","import { Hono } from 'hono'\nimport { cors } from 'hono/cors'\nimport { serve } from '@hono/node-server'\nimport { StorageHost, SqlitePersistence, acquireDb, releaseDb } from '@x-otto/persistence'\n// RFC-161 M2:SCHEDULE_LEASE_MIGRATIONS 已迁至 @x-otto/schedule,直连新真源。\nimport { SCHEDULE_LEASE_MIGRATIONS } from '@x-otto/schedule'\n\nimport { requestId } from './middleware/request-id'\nimport { accessLog } from './middleware/access-log'\nimport { rateLimit } from './middleware/rate-limit'\nimport { storageAuth } from './middleware/storage-auth'\nimport { createStorageRoute } from './routes/storage'\nimport { createEventsRoute } from './routes/events'\nimport { createSyncRoute } from './routes/sync'\nimport { createScheduleLeaseRoute } from './routes/schedule-lease'\n\nimport type { Server } from 'node:http'\nimport type { Persistence } from '@x-otto/persistence'\nimport type { StorageRouteContext } from './middleware/storage-auth'\n\nexport interface PersistencedOptions {\n dir: string\n port?: number\n /** 必填,fail-closed。 */\n token: string\n /** 默认 sessions;knowledge/archive namespace 已退场,memory=文件。 */\n namespaces?: string[]\n /** 默认 127.0.0.1;0.0.0.0 = 公网暴露。 */\n host?: string\n /** 默认不启用 CORS。 */\n corsOrigin?: string\n rateLimitRps?: number\n maxBodyBytes?: number\n}\n\n/** persistenced 服务默认监听端口——族内单源(cli/persistenced.ts 复用,消除双源漂移)。 */\nexport const PERSISTENCED_DEFAULT_PORT = 3001\nconst DEFAULT_PORT = PERSISTENCED_DEFAULT_PORT\nconst DEFAULT_HOST = '127.0.0.1'\n// RFC-169 D3:'schedules' 是 RemoteScheduleStore(generic storage.ts 路由,snapshot-per-id\n// 定义存储)的 namespace——与 'schedules' 前缀的 lease 子路由(schedule-lease.ts,独立\n// db 文件,仅负责触发所有权仲裁)是两个正交的关注点,只是恰好共用同一 URL 段前缀\n// (/api/storage/schedules/... vs /api/schedules/.../lease/...,路径结构不冲突)。\nconst DEFAULT_NAMESPACES = ['sessions', 'schedules']\n\n/**\n * 启动 persistenced 独立服务。\n *\n * 返回 { app, server, host: StorageHost } 供测试注入/优雅退出。\n */\nexport async function startPersistenced(options: PersistencedOptions): Promise<{\n app: Hono\n server: Server\n host: StorageHost\n url: string\n}> {\n const port = options.port ?? DEFAULT_PORT\n const hostname = options.host ?? DEFAULT_HOST\n const namespaces = options.namespaces ?? DEFAULT_NAMESPACES\n const dbPath = `${options.dir}/storage.db`\n\n const host = new StorageHost({\n namespaces,\n backend: (ns: string): Persistence<unknown> =>\n new SqlitePersistence({\n dbPath,\n namespace: ns,\n wal: true,\n }),\n })\n\n // RFC-169 D3a:schedule_lease 表走独立 db 文件 + 独立 migration 段——不能和上面的\n // blob 快照 storage.db 共用 acquireDb() 调用(同一 db 路径注入不同 migration 段会撞\n // acquireDb 的 fail-fast 段冲突守卫,见 sqlite-db-cache.ts:134-140)。\n const leaseDbPath = `${options.dir}/schedule-lease.db`\n const leaseDb = acquireDb(leaseDbPath, true, SCHEDULE_LEASE_MIGRATIONS)\n\n // 用最小 StorageRouteContext 取代 `as unknown as CodingService` 假 context——\n // 路由只需 mars.storage.storageHost,此处编译期校验该形状(含 token: string fail-closed)。\n const context: StorageRouteContext = {\n app: {\n storage: { storageHost: { host, token: options.token } },\n },\n }\n const auth = storageAuth(context)\n\n const app = new Hono()\n\n if (options.corsOrigin) {\n app.use(\n '/api/*',\n cors({\n origin: options.corsOrigin,\n allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],\n allowHeaders: ['Content-Type', 'Authorization'],\n }),\n )\n }\n\n app.use('*', requestId())\n app.use('*', accessLog())\n app.use('*', rateLimit({ defaultRps: options.rateLimitRps ?? 100 }))\n\n app.get('/health', (c) =>\n c.json({\n status: 'ok',\n service: 'otto-persistenced',\n uptime: process.uptime(),\n namespaces,\n }),\n )\n\n app.route('/api/storage', createStorageRoute(context))\n app.route('/api/events', createEventsRoute(context))\n app.route('/api/sync', createSyncRoute(context))\n app.route('/api/schedules', createScheduleLeaseRoute(leaseDb, auth))\n\n app.notFound((c) => c.text('not found', 404))\n\n const server = serve({ fetch: app.fetch, port, hostname: hostname }) as unknown as Server\n\n // 优雅退出释放 lease db 引用(对齐 SqlitePersistence.close() 的既有释放模式,\n // acquireDb/releaseDb 是引用计数缓存——同路径其它消费方仍存活时物理连接不会真的关闭)。\n server.once('close', () => releaseDb(leaseDb))\n\n return new Promise((resolve, reject) => {\n server.once('listening', () => {\n const addr = server.address()\n const actualPort = typeof addr === 'object' && addr ? addr.port : port\n resolve({\n app,\n server,\n host,\n url: `http://${hostname}:${actualPort}`,\n })\n })\n server.once('error', reject)\n })\n}\n"],"x_google_ignoreList":[16,17,18,19,20,21,22,23,24,25,26,27,28,29,30],"mappings":"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"}
|