@workerdeck/core 1.0.0 → 1.2.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/build/index.d.mts +14 -2
- package/build/index.mjs +37 -25
- package/build/index.mjs.map +1 -1
- package/package.json +14 -14
package/build/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["#done","#waiter","#buffer","#events","#seq","#activityCount","#proseCount","#contextUsage","#resetSeq","#lastActivityAt","#fold","#listeners","#recordFor","#open","#settle","#records","#sweep","#settleCounter","DEFAULT_APPROVAL_TIMEOUT_MS","#cwd","#config","#permissionMode","#status","#sdkSessionId","#log","#apiKeySource","#pending","#model","#subagents","#engineTitle","#totalCostUsd","#numTurns","#started","#runPromise","#run","#closed","#input","#emit","#query","#settleApproval","#setStatus","#subscribers","sdkQuery","#backfillHistory","#buildOptions","#fetchCapabilities","#fetchContextUsage","#fetchRateLimits","#handleMessage","#canUseTool","#turnOverWhileBlocked","#fetchEngineTitle","#capabilitiesEmitted","#subscriptionType","#resolveQuestionByPolicy","#statusDetail","#config","#model","#permissionMode","#modelAlias","#restore","#log","#messages","#pendingToolCalls","#dispatched","#numTurns","#totalUsage","#turnAccum","#status","#pendingApprovals","#modelId","#started","#turnChain","#setStatus","#closed","#parked","#abort","#restingOnDeferred","#buildSnapshot","#subscribers","#emit","#scheduleTurn","#settlePendingCall","#dispatchSingle","#applyExecutionResult","#runTurn","#dispatchCall","#announceParked","#dispatchPending","#finishTurn","#statusDetail","#options","#execute","#allowsNetwork","#fetchText","#slots","#settle","#options","#early","#applyAnswer","#options","sdkListSessions","#output","#trace","#feed","#closed","#nextId","#pending","#write","#notificationHandler","#requestHandler","#buffer","#traceLine","#dispatch","#byThread","#settleCounter","#settle","#cwd","#config","#permissionMode","#model","#reasoningEffort","#sdkSessionId","#status","#log","#approvals","#resolvedModel","#totalCostUsd","#numTurns","#agents","#started","#turnChain","#warnUntrustedProject","#backfillPending","#backfillHistory","#setStatus","#probeSkills","#childEnv","#emit","#openScratchConnection","#closed","#refreshSkills","#buildInput","#queue","#scheduleTurn","#imageDir","#settleApproval","#interruptTurn","#clearNow","#threadLoaded","#connection","#ensureThread","#clearedThreads","#resumedHistory","#activeTurn","#subscribers","#runTurn","#readWorkspaceWrite","#workspaceWrite","#handleNotification","#answerServerRequest","#resolvedEffort","#skillsRefresh","#skillsFingerprint","#mcpStatus","#producedPaths","#replayTurns","#newTurnState","#replayingHistory","#handleItemCompleted","#turnSandboxPolicy","#finishTurn","#isRootThread","#settleAgentTurn","#threadIdOf","#notifications","#emitToolUse","#emitToolResult","#agentFor","#emitDelta","#handleItemProgress","#itemProgress","#reasoningDelta","#emitRateLimits","#requestApproval","#resolveQuestionByPolicy","#itemCompleted","#emitFileProduced","#emitAssistant","#emitContextUsage","#planType","#statusDetail"],"sources":["../src/lib/attachments.ts","../src/lib/input-queue.ts","../src/lib/patch.ts","../src/lib/normalize.ts","../src/lib/event-log.ts","../src/lib/replay.ts","../src/lib/subscribers.ts","../src/lib/title.ts","../src/engines/claude/subagents.ts","../src/engines/claude/runner.ts","../src/engines/provider/runner.ts","../src/engines/claude/auth.ts","../src/executors/quickjs-executor.ts","../src/lib/pending-registry.ts","../src/executors/browser-bridge-executor.ts","../src/executors/deferred-executor.ts","../src/engines/provider/tools.ts","../src/engines/provider/web-fetch.ts","../src/engines/provider/session.ts","../src/engines/claude/catalog.ts","../src/engines/claude/adapter.ts","../src/engines/codex/connect.ts","../src/engines/codex/jsonrpc.ts","../src/engines/codex/subagents.ts","../src/engines/codex/trust.ts","../src/engines/codex/runner.ts","../src/engines/codex/catalog.ts","../src/engines/codex/process.ts","../src/engines/codex/adapter.ts","../src/engines/provider/adapter.ts","../src/engines/adapter.ts"],"sourcesContent":["import type { MessageAttachment } from '@workerdeck/protocol'\n\nexport type AttachmentInput = MessageAttachment & {\n data: string\n}\n\nexport type AttachmentKind = 'image' | 'document' | 'text'\n\n// The four the Anthropic API accepts; image/heic — what an iPhone shoots — is not one, and\n// clients transcode before upload.\nconst IMAGE_TYPES = new Set(['image/jpeg', 'image/png', 'image/gif', 'image/webp'])\n\nconst TEXT_TYPES = new Set([\n 'application/json',\n 'application/xml',\n 'application/yaml',\n 'application/x-yaml',\n 'application/toml',\n 'application/javascript',\n 'application/typescript',\n 'application/x-sh',\n 'application/x-httpd-php',\n 'application/sql',\n])\n\nexport function normalizeMediaType(mediaType: string): string {\n return mediaType.split(';')[0]!.trim().toLowerCase()\n}\n\nexport function attachmentKind(mediaType: string): AttachmentKind | null {\n const type = normalizeMediaType(mediaType)\n if (IMAGE_TYPES.has(type)) {\n return 'image'\n }\n if (type === 'application/pdf') {\n return 'document'\n }\n if (type.startsWith('text/') || TEXT_TYPES.has(type)) {\n return 'text'\n }\n return null\n}\n\nexport const SUPPORTED_ATTACHMENT_TYPES = [...IMAGE_TYPES, 'application/pdf', 'text/*'].join(', ')\n\nexport function attachmentContentBlocks(attachments: readonly AttachmentInput[]): Array<Record<string, unknown>> {\n return attachments.map((attachment) => {\n const mediaType = normalizeMediaType(attachment.mediaType)\n switch (attachmentKind(mediaType)) {\n case 'image': {\n return {\n type: 'image',\n source: { type: 'base64', media_type: mediaType, data: attachment.data },\n }\n }\n case 'document': {\n return {\n type: 'document',\n source: { type: 'base64', media_type: mediaType, data: attachment.data },\n title: attachment.name,\n }\n }\n case 'text': {\n return {\n type: 'text',\n text: `<attachment name=\"${attachment.name}\" type=\"${mediaType}\">\\n${decodeText(attachment.data)}\\n</attachment>`,\n }\n }\n default: {\n throw new Error(`unsupported attachment media type: ${attachment.mediaType}`)\n }\n }\n })\n}\n\nexport function attachmentRef(attachment: AttachmentInput): MessageAttachment {\n return {\n id: attachment.id,\n name: attachment.name,\n mediaType: attachment.mediaType,\n bytes: attachment.bytes,\n }\n}\n\nfunction decodeText(base64: string): string {\n return Buffer.from(base64, 'base64').toString('utf8')\n}\n","import type { SDKUserMessage } from '@anthropic-ai/claude-agent-sdk'\n\nexport class InputQueue implements AsyncIterable<SDKUserMessage> {\n #buffer: SDKUserMessage[] = []\n #waiter: ((result: IteratorResult<SDKUserMessage>) => void) | null = null\n #done = false\n\n push(message: SDKUserMessage): void {\n if (this.#done) {\n return\n }\n if (this.#waiter) {\n const resolve = this.#waiter\n this.#waiter = null\n resolve({ value: message, done: false })\n } else {\n this.#buffer.push(message)\n }\n }\n\n end(): void {\n if (this.#done) {\n return\n }\n this.#done = true\n if (this.#waiter) {\n const resolve = this.#waiter\n this.#waiter = null\n resolve({ value: undefined, done: true })\n }\n }\n\n [Symbol.asyncIterator](): AsyncIterator<SDKUserMessage> {\n return {\n next: (): Promise<IteratorResult<SDKUserMessage>> => {\n const buffered = this.#buffer.shift()\n if (buffered !== undefined) {\n return Promise.resolve({ value: buffered, done: false })\n }\n if (this.#done) {\n return Promise.resolve({ value: undefined, done: true })\n }\n return new Promise((resolve) => {\n this.#waiter = resolve\n })\n },\n return: (): Promise<IteratorResult<SDKUserMessage>> => {\n this.end()\n return Promise.resolve({ value: undefined, done: true })\n },\n }\n }\n}\n","import type { FilePatch, PatchHunk } from '@workerdeck/protocol'\n\nconst MAX_PATCH_LINES = 400\n\n// `@@ -oldStart,oldLines +newStart,newLines @@` — an absent count means 1 (a single-line hunk).\nconst HUNK_HEADER = /^@@ -(\\d+)(?:,(\\d+))? \\+(\\d+)(?:,(\\d+))? @@/\n\nfunction capHunks(hunks: PatchHunk[]): { hunks: PatchHunk[]; truncated?: boolean } {\n const kept: PatchHunk[] = []\n let lines = 0\n for (const hunk of hunks) {\n if (lines + hunk.lines.length > MAX_PATCH_LINES && kept.length > 0) {\n return { hunks: kept, truncated: true }\n }\n kept.push(hunk)\n lines += hunk.lines.length\n }\n return { hunks: kept }\n}\n\nfunction isHunk(value: unknown): value is PatchHunk {\n const hunk = value as Partial<PatchHunk> | null\n return (\n !!hunk &&\n typeof hunk.oldStart === 'number' &&\n typeof hunk.oldLines === 'number' &&\n typeof hunk.newStart === 'number' &&\n typeof hunk.newLines === 'number' &&\n Array.isArray(hunk.lines) &&\n hunk.lines.every((line) => typeof line === 'string')\n )\n}\n\nexport function filePatchFromToolResult(result: unknown): FilePatch | undefined {\n const output = result as { filePath?: unknown; structuredPatch?: unknown; originalFile?: unknown; type?: unknown } | null | undefined\n if (!output || !Array.isArray(output.structuredPatch)) {\n return undefined\n }\n const hunks = output.structuredPatch.filter(isHunk)\n if (hunks.length === 0) {\n return undefined\n }\n const { hunks: kept, truncated } = capHunks(hunks)\n return {\n ...(typeof output.filePath === 'string' && { path: output.filePath }),\n ...(output.type === 'create' || output.originalFile === null\n ? ({ kind: 'create' } as const)\n : output.type === 'update' || typeof output.originalFile === 'string'\n ? ({ kind: 'update' } as const)\n : {}),\n hunks: kept,\n ...(truncated && { truncated }),\n }\n}\n\nexport function parseUnifiedDiff(diff: string, path?: string): FilePatch | undefined {\n const hunks: PatchHunk[] = []\n let current: PatchHunk | undefined\n for (const line of diff.split('\\n')) {\n const header = HUNK_HEADER.exec(line)\n if (header) {\n current = {\n oldStart: Number(header[1]),\n oldLines: header[2] === undefined ? 1 : Number(header[2]),\n newStart: Number(header[3]),\n newLines: header[4] === undefined ? 1 : Number(header[4]),\n lines: [],\n }\n hunks.push(current)\n continue\n }\n if (!current) {\n continue\n }\n if (line.startsWith(' ') || line.startsWith('-') || line.startsWith('+')) {\n current.lines.push(line)\n } else if (line === '') {\n // A blank line is a context line whose trailing space was stripped in transit; dropping\n // it would silently shift every line number after it.\n current.lines.push(' ')\n } else {\n current = undefined\n }\n }\n if (hunks.length === 0) {\n return undefined\n }\n const { hunks: kept, truncated } = capHunks(hunks)\n return { ...(path && { path }), hunks: kept, ...(truncated && { truncated }) }\n}\n","import type { McpServerStatus, SDKMessage } from '@anthropic-ai/claude-agent-sdk'\nimport type { ApiMessage, ContentBlock, McpServerStatusInfo, ModelOption, SessionEventBody, TextBlock } from '@workerdeck/protocol'\nimport { filePatchFromToolResult } from './patch.ts'\n\nconst FAMILY_ORDER = ['fable', 'opus', 'sonnet', 'haiku']\n\nfunction singleToolResult(message: ApiMessage): boolean {\n const content = message.content\n if (!Array.isArray(content)) {\n return false\n }\n return content.filter((block) => block.type === 'tool_result').length === 1\n}\n\nconst SYNTHETIC_USER_PREFIXES = ['<task-notification>', '<local-command-caveat>']\n\nexport function isSyntheticUserText(message: ApiMessage): boolean {\n const content = message.content\n const text =\n typeof content === 'string'\n ? content\n : Array.isArray(content)\n ? content.find((block): block is TextBlock => block.type === 'text')?.text\n : undefined\n if (typeof text !== 'string') {\n return false\n }\n const head = text.trimStart()\n return SYNTHETIC_USER_PREFIXES.some((prefix) => head.startsWith(prefix))\n}\n\nexport function toApiMessage(message: unknown): ApiMessage {\n const m = message as {\n role?: 'user' | 'assistant'\n content: string | ContentBlock[]\n model?: string\n stop_reason?: string | null\n usage?: ApiMessage['usage']\n }\n return {\n role: m.role ?? 'assistant',\n content: m.content,\n model: m.model,\n stop_reason: m.stop_reason,\n usage: m.usage,\n }\n}\n\nexport type UsageRateLimits = {\n subscription_type?: string | null\n rate_limits_available?: boolean\n rate_limits?: {\n five_hour?: UsageWindow\n seven_day?: UsageWindow\n seven_day_opus?: UsageWindow\n seven_day_sonnet?: UsageWindow\n seven_day_oauth_apps?: UsageWindow\n model_scoped?: Array<{ display_name: string; utilization: number | null }>\n } | null\n}\n\ntype UsageWindow = { utilization: number | null; resets_at?: string | null } | null | undefined\n\nexport function rateLimitEventsFromUsage(usage: UsageRateLimits): SessionEventBody[] {\n if (!usage.rate_limits_available || !usage.rate_limits) {\n return []\n }\n const limits = usage.rate_limits\n const events: SessionEventBody[] = []\n const seen = new Set<string>()\n const push = (rateLimitType: string, window: UsageWindow): void => {\n if (!window || window.utilization === null || seen.has(rateLimitType)) {\n return\n }\n seen.add(rateLimitType)\n const resetsAt = window.resets_at ? Date.parse(window.resets_at) : NaN\n events.push({\n type: 'rate_limit',\n info: {\n status: 'allowed',\n rateLimitType,\n utilization: window.utilization,\n ...(Number.isFinite(resetsAt) ? { resetsAt: resetsAt / 1000 } : {}),\n },\n })\n }\n push('five_hour', limits.five_hour)\n push('seven_day', limits.seven_day)\n push('seven_day_opus', limits.seven_day_opus)\n push('seven_day_sonnet', limits.seven_day_sonnet)\n push('seven_day_oauth_apps', limits.seven_day_oauth_apps)\n for (const bucket of limits.model_scoped ?? []) {\n const slug = bucket.display_name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_')\n if (slug) {\n push(`seven_day_${slug}`, bucket)\n }\n }\n return events\n}\n\n// `config` carries a stdio server's env and an HTTP server's headers, routinely API tokens:\n// this is the one place they are dropped, and they must stay dropped.\nexport function mcpStatusInfo(status: McpServerStatus): McpServerStatusInfo {\n const config = status.config as { type?: string; command?: string; args?: string[]; url?: string } | undefined\n const transport = config?.type ?? (config?.command ? 'stdio' : undefined)\n return {\n name: status.name,\n status: status.status,\n scope: status.scope,\n error: status.error,\n serverInfo: status.serverInfo,\n transport: transport === 'stdio' || transport === 'http' || transport === 'sse' || transport === 'sdk' ? transport : undefined,\n command: config?.command,\n args: config?.args,\n url: config?.url,\n tools: status.tools?.map((tool) => ({\n name: tool.name,\n description: tool.description,\n annotations: tool.annotations,\n })),\n }\n}\n\nexport type SdkModelInfo = {\n value: string\n resolvedModel?: string\n displayName: string\n description?: string\n supportedEffortLevels?: string[]\n supportsEffort?: boolean\n}\n\nexport function defaultModelFromSdk(models: readonly SdkModelInfo[]): string | undefined {\n return models.find((model) => model.value === 'default')?.resolvedModel\n}\n\nexport function modelOptionsFromSdk(models: readonly SdkModelInfo[]): ModelOption[] {\n const rows = models.filter((model) => model.value !== 'default')\n const derivedCounts = new Map<string, number>()\n for (const model of rows) {\n const derived = friendlyModelName(model.resolvedModel ?? model.value)\n if (derived) {\n derivedCounts.set(derived, (derivedCounts.get(derived) ?? 0) + 1)\n }\n }\n\n const seenFamilies = new Set<string>()\n const options: ModelOption[] = rows.map((model) => {\n const family = modelFamily(model.resolvedModel ?? model.value)\n const primary = !seenFamilies.has(family)\n seenFamilies.add(family)\n const derived = friendlyModelName(model.resolvedModel ?? model.value)\n return {\n value: model.value,\n resolvedModel: model.resolvedModel,\n displayName: derived && derivedCounts.get(derived) === 1 ? derived : model.displayName,\n description: model.description,\n primary,\n reasoningEfforts: model.supportedEffortLevels ?? (model.supportsEffort === false ? [] : undefined),\n }\n })\n\n return options\n .map((option, index) => ({ option, index }))\n .sort((a, b) => {\n const rankA = familyRank(a.option)\n const rankB = familyRank(b.option)\n return rankA === rankB ? a.index - b.index : rankA - rankB\n })\n .map(({ option }) => option)\n}\n\nfunction familyRank(option: ModelOption): number {\n const rank = FAMILY_ORDER.indexOf(modelFamily(option.resolvedModel ?? option.value))\n return rank === -1 ? FAMILY_ORDER.length : rank\n}\n\n// The shared id-parsing prelude: strip the '[variant]' suffix, lowercase, split on '-', drop the 'claude' prefix.\nfunction modelIdParts(id: string): string[] {\n const withoutVariant = id.split('[')[0] ?? id\n const parts = withoutVariant.toLowerCase().split('-').filter(Boolean)\n if (parts[0] === 'claude') {\n parts.shift()\n }\n return parts\n}\n\nexport function friendlyModelName(id: string): string | null {\n const parts = modelIdParts(id)\n const family = parts.shift()\n if (!family) {\n return null\n }\n const version = parts.filter((part) => !/^\\d{8}$/.test(part))\n if (version.length === 0 || version.some((part) => !/^\\d+$/.test(part))) {\n return null\n }\n return `${family.charAt(0).toUpperCase()}${family.slice(1)} ${version.join('.')}`\n}\n\nfunction modelFamily(id: string): string {\n const parts = modelIdParts(id)\n return parts[0] ?? id\n}\n\nexport function normalizeSdkMessage(msg: SDKMessage): SessionEventBody | null {\n switch (msg.type) {\n case 'assistant': {\n return {\n type: 'assistant_message',\n message: toApiMessage(msg.message),\n parentToolUseId: msg.parent_tool_use_id,\n uuid: msg.uuid,\n }\n }\n case 'user': {\n const message = toApiMessage(msg.message)\n return {\n type: 'user_message',\n message,\n parentToolUseId: msg.parent_tool_use_id,\n replay: 'isReplay' in msg && msg.isReplay === true ? true : undefined,\n synthetic: msg.isSynthetic === true || msg.origin?.kind === 'task-notification' || isSyntheticUserText(message) ? true : undefined,\n patch: singleToolResult(message) ? filePatchFromToolResult(msg.tool_use_result) : undefined,\n uuid: msg.uuid,\n }\n }\n case 'stream_event': {\n return {\n type: 'stream_delta',\n event: msg.event as { type: string; [key: string]: unknown },\n parentToolUseId: msg.parent_tool_use_id,\n uuid: msg.uuid,\n }\n }\n case 'result': {\n return {\n type: 'turn_result',\n subtype: msg.subtype,\n isError: msg.is_error,\n durationMs: msg.duration_ms,\n numTurns: msg.num_turns,\n totalCostUsd: msg.total_cost_usd,\n result: msg.subtype === 'success' ? msg.result : undefined,\n errors: msg.subtype === 'success' ? undefined : msg.errors,\n usage: msg.usage,\n }\n }\n case 'conversation_reset': {\n return { type: 'conversation_reset', sdkSessionId: msg.new_conversation_id }\n }\n case 'rate_limit_event': {\n return {\n type: 'rate_limit',\n info: {\n status: msg.rate_limit_info.status,\n rateLimitType: msg.rate_limit_info.rateLimitType,\n utilization: msg.rate_limit_info.utilization,\n resetsAt: msg.rate_limit_info.resetsAt,\n isUsingOverage: msg.rate_limit_info.isUsingOverage,\n },\n }\n }\n case 'system': {\n if (msg.subtype === 'init' || msg.subtype === 'session_state_changed') {\n return null\n }\n return { type: 'sdk_event', payload: msg as unknown as { type: string } }\n }\n default: {\n return { type: 'sdk_event', payload: msg as unknown as { type: string } }\n }\n }\n}\n","import {\n contextReading,\n transcriptActivity,\n transcriptProse,\n type ContextReading,\n type SessionEvent,\n type SessionEventBody,\n} from '@workerdeck/protocol'\n\nexport class EventLog {\n #events: SessionEvent[] = []\n #seq = 0\n #activityCount = 0\n #proseCount = 0\n #contextUsage: ContextReading | undefined\n #resetSeq = 0\n #lastActivityAt: number | undefined\n\n get events(): readonly SessionEvent[] {\n return this.#events\n }\n\n get seq(): number {\n return this.#seq\n }\n\n get activityCount(): number {\n return this.#activityCount\n }\n\n /** The unread badge's unit — see `transcriptProse`. Folded here so a restored log recomputes it. */\n get proseCount(): number {\n return this.#proseCount\n }\n\n get contextUsage(): ContextReading | undefined {\n return this.#contextUsage\n }\n\n get resetSeq(): number {\n return this.#resetSeq\n }\n\n get lastActivityAt(): number | undefined {\n return this.#lastActivityAt\n }\n\n append(body: SessionEventBody): SessionEvent {\n const event: SessionEvent = { ...body, seq: ++this.#seq, ts: Date.now() }\n this.#lastActivityAt = event.ts\n this.#fold(event)\n this.#events.push(event)\n return event\n }\n\n at(seq: number): SessionEvent | undefined {\n return this.#events.find((event) => event.seq === seq)\n }\n\n restore(events: readonly SessionEvent[], seq: number, lastActivityAt: number | undefined): void {\n this.#events = [...events]\n this.#seq = seq\n this.#activityCount = 0\n this.#proseCount = 0\n this.#contextUsage = undefined\n this.#resetSeq = 0\n for (const event of this.#events) {\n this.#fold(event)\n }\n this.#lastActivityAt = lastActivityAt\n }\n\n #fold(event: SessionEvent): void {\n this.#activityCount += transcriptActivity(event)\n this.#proseCount += transcriptProse(event)\n this.#contextUsage = contextReading(event) ?? this.#contextUsage\n if (event.type === 'conversation_reset') {\n this.#resetSeq = event.seq\n this.#contextUsage = undefined\n }\n }\n}\n","import {\n imagePartRef,\n replayCoalesceKey,\n replayRetains,\n TOOL_RESULT_HEAD_CHARS,\n transcriptContent,\n type SessionEvent,\n type ToolResultBlock,\n} from '@workerdeck/protocol'\n\nexport function staleReplaySeqs(events: readonly SessionEvent[], afterSeq: number): Set<number> {\n const stale = new Set<number>()\n const seen = new Set<string>()\n for (let index = events.length - 1; index >= 0; index--) {\n const event = events[index]!\n if (event.seq <= afterSeq) {\n break\n }\n const key = replayCoalesceKey(event)\n if (key === undefined) {\n continue\n }\n if (seen.has(key)) {\n stale.add(event.seq)\n } else {\n seen.add(key)\n }\n }\n return stale\n}\n\nexport function replaySlice(\n events: readonly SessionEvent[],\n options: {\n afterSeq: number\n resetSeq?: number\n coalesceReplay?: boolean\n truncateResults?: boolean\n imageRefs?: boolean\n },\n): SessionEvent[] {\n const { afterSeq, resetSeq = 0, coalesceReplay, truncateResults, imageRefs } = options\n const stale = coalesceReplay ? staleReplaySeqs(events, afterSeq) : undefined\n const lastSeq = events[events.length - 1]?.seq ?? 0\n const out: SessionEvent[] = []\n for (const event of events) {\n if (event.seq <= afterSeq) {\n continue\n }\n if (event.seq < resetSeq && transcriptContent(event)) {\n continue\n }\n if (stale?.has(event.seq)) {\n continue\n }\n if (coalesceReplay && event.seq !== lastSeq && !replayRetains(event)) {\n continue\n }\n // Refs before heads: part indices are stamped from the stored array, which truncation reshapes.\n let delivered = event\n if (imageRefs) {\n delivered = refImageParts(delivered)\n }\n if (truncateResults) {\n delivered = truncateResultBlocks(delivered)\n }\n out.push(delivered)\n }\n return out\n}\n\nexport function truncateResultBlocks(event: SessionEvent): SessionEvent {\n if (event.type !== 'user_message') {\n return event\n }\n const content = event.message.content\n if (!Array.isArray(content)) {\n return event\n }\n let cut = false\n const blocks = content.map((block) => {\n if (block.type !== 'tool_result') {\n return block\n }\n const result = block as ToolResultBlock\n if (result.truncated) {\n return block\n }\n const total = resultChars(result.content)\n if (total <= TOOL_RESULT_HEAD_CHARS) {\n return block\n }\n cut = true\n return {\n ...result,\n content: headOf(result.content, TOOL_RESULT_HEAD_CHARS),\n truncated: true,\n total_chars: total,\n } satisfies ToolResultBlock\n })\n if (!cut) {\n return event\n }\n return { ...event, message: { ...event.message, content: blocks } }\n}\n\nfunction resultChars(content: ToolResultBlock['content']): number {\n if (typeof content === 'string') {\n return content.length\n }\n if (!Array.isArray(content)) {\n return 0\n }\n return content.reduce((total, part, index) => total + (typeof part.text === 'string' ? part.text.length + (index > 0 ? 1 : 0) : 0), 0)\n}\n\nfunction headOf(content: ToolResultBlock['content'], chars: number): ToolResultBlock['content'] {\n if (typeof content === 'string') {\n return content.slice(0, chars)\n }\n if (!Array.isArray(content)) {\n return content\n }\n const parts: Array<{ type: string; text?: string; [key: string]: unknown }> = []\n let used = 0\n for (const part of content) {\n if (part.type === 'image_ref') {\n parts.push(part)\n continue\n }\n if (typeof part.text !== 'string') {\n continue\n }\n // `continue`, not `break`: an exhausted text budget must not strand the refs after it.\n if (used >= chars) {\n continue\n }\n const text = part.text.slice(0, chars - used)\n parts.push({ ...part, text })\n used += text.length + 1\n }\n return parts\n}\n\nexport function refImageParts(event: SessionEvent): SessionEvent {\n if (event.type !== 'user_message') {\n return event\n }\n const content = event.message.content\n if (!Array.isArray(content)) {\n return event\n }\n let changed = false\n const blocks = content.map((block) => {\n if (block.type !== 'tool_result') {\n return block\n }\n const result = block as ToolResultBlock\n const parts = result.content\n if (!Array.isArray(parts)) {\n return block\n }\n let blockChanged = false\n const mapped = parts.map((part, index) => {\n const ref = imagePartRef(part, index)\n if (!ref) {\n return part\n }\n blockChanged = true\n return ref\n })\n if (!blockChanged) {\n return block\n }\n changed = true\n return { ...result, content: mapped } satisfies ToolResultBlock\n })\n if (!changed) {\n return event\n }\n return { ...event, message: { ...event.message, content: blocks } }\n}\n","import type { SessionEvent } from '@workerdeck/protocol'\nimport type { SessionEventListener } from '../runner-interface.ts'\nimport { refImageParts, replaySlice } from './replay.ts'\n\nexport type SubscribeOptions = {\n coalesceReplay?: boolean\n truncateResults?: boolean\n imageRefs?: boolean\n}\n\nexport class SubscriberSet {\n readonly #listeners = new Map<SessionEventListener, SubscribeOptions>()\n\n // The replay runs before the listener joins the set: joining first would deliver a live\n // event emitted mid-replay ahead of the buffered events preceding it.\n subscribe(\n events: readonly SessionEvent[],\n listener: SessionEventListener,\n afterSeq = 0,\n options?: SubscribeOptions,\n resetSeq = 0,\n ): () => void {\n const asked = options ?? {}\n for (const event of replaySlice(events, { ...asked, afterSeq, resetSeq })) {\n listener(event)\n }\n this.#listeners.set(listener, asked)\n return () => {\n this.#listeners.delete(listener)\n }\n }\n\n clear(): void {\n this.#listeners.clear()\n }\n\n emit(event: SessionEvent): void {\n for (const [listener, asked] of this.#listeners) {\n try {\n listener(asked.imageRefs ? refImageParts(event) : event)\n } catch {}\n }\n }\n}\n","import type { CreateSessionRequest } from '@workerdeck/protocol'\n\ntype TitleSource = Pick<CreateSessionRequest, 'meta' | 'prompt'>\n\nexport function hostTitle(meta: CreateSessionRequest['meta']): string | undefined {\n const title = meta?.title\n return typeof title === 'string' && title.length > 0 ? title : undefined\n}\n\nexport function sessionTitle(config: TitleSource, engineTitle?: string): string | undefined {\n const host = hostTitle(config.meta)\n if (host) {\n return host\n }\n if (engineTitle) {\n return engineTitle\n }\n const prompt = config.prompt\n if (!prompt) {\n return undefined\n }\n return prompt.length > 80 ? prompt.slice(0, 77) + '…' : prompt\n}\n\nexport function withTitle<C extends TitleSource>(config: C, title: string | undefined): C {\n const meta = { ...config.meta }\n if (title) {\n meta.title = title\n } else {\n delete meta.title\n }\n return { ...config, meta }\n}\n","import { SUBAGENT_HISTORY, type ContentBlock, type SessionEventBody, type SubagentInfo } from '@workerdeck/protocol'\n\ntype TrackedSubagent = SubagentInfo & {\n settledOrder?: number\n background?: 'live' | 'replay'\n}\n\nconst SPAWNER_NAMES = new Set(['Task', 'Agent'])\n\nexport class SubagentTracker {\n #records = new Map<string, TrackedSubagent>()\n #settleCounter = 0\n\n observe(body: SessionEventBody, ts: number): void {\n switch (body.type) {\n case 'assistant_message': {\n if (body.parentToolUseId != null) {\n const record = this.#recordFor(body.parentToolUseId, ts)\n record.toolCount += toolUseBlocks(body.message.content).length\n return\n }\n for (const block of toolUseBlocks(body.message.content)) {\n if (!SPAWNER_NAMES.has(block.name)) {\n continue\n }\n this.#open(block, ts)\n }\n return\n }\n case 'user_message': {\n if (body.parentToolUseId != null) {\n this.#recordFor(body.parentToolUseId, ts)\n return\n }\n const note = parseTaskNotification(firstText(body.message.content))\n if (note) {\n const record = this.#recordFor(note.toolUseId, ts)\n const status = note.status === 'completed' ? 'done' : 'failed'\n if (record.status !== status) {\n this.#settle(record, status)\n }\n return\n }\n const content = body.message.content\n if (typeof content === 'string') {\n return\n }\n for (const block of content) {\n if (block.type !== 'tool_result') {\n continue\n }\n const result = block as {\n tool_use_id?: unknown\n is_error?: unknown\n content?: unknown\n }\n if (typeof result.tool_use_id !== 'string') {\n continue\n }\n if (result.is_error !== true && isLaunchAck(result.content)) {\n const record = this.#recordFor(result.tool_use_id, ts)\n if (record.background !== 'live') {\n record.background = body.replay === true ? 'replay' : 'live'\n }\n continue\n }\n const record = this.#records.get(result.tool_use_id)\n if (!record) {\n continue\n }\n if (result.is_error !== true && record.background !== undefined) {\n continue\n }\n const status = result.is_error === true ? 'failed' : 'done'\n if (record.status === status) {\n continue\n }\n this.#settle(record, status)\n }\n return\n }\n case 'sdk_event': {\n const p = body.payload as {\n type?: unknown\n subtype?: unknown\n tool_use_id?: unknown\n status?: unknown\n subagent_type?: unknown\n description?: unknown\n }\n if (p.type !== 'system' || typeof p.tool_use_id !== 'string') {\n return\n }\n if (p.subtype === 'task_started') {\n const record = this.#recordFor(p.tool_use_id, ts)\n record.background = 'live'\n record.agentType ??= cleaned(p.subagent_type)\n record.description ??= cleaned(p.description)\n return\n }\n if (p.subtype === 'task_notification') {\n const record = this.#recordFor(p.tool_use_id, ts)\n const status = p.status === 'completed' ? 'done' : 'failed'\n if (record.status !== status) {\n this.#settle(record, status)\n }\n return\n }\n return\n }\n case 'turn_result': {\n this.#sweep(false)\n return\n }\n case 'session_closed': {\n this.#sweep(true)\n return\n }\n case 'status_changed': {\n if (body.status === 'idle') {\n this.#sweep(false)\n } else if (body.status === 'failed' || body.status === 'closed') {\n this.#sweep(true)\n }\n return\n }\n case 'conversation_reset': {\n this.#records.clear()\n return\n }\n default: {\n return\n }\n }\n }\n\n list(): SubagentInfo[] | undefined {\n if (this.#records.size === 0) {\n return undefined\n }\n const out: SubagentInfo[] = []\n for (const r of this.#records.values()) {\n out.push({\n toolUseId: r.toolUseId,\n agentType: r.agentType,\n description: r.description,\n status: r.status,\n startedAt: r.startedAt,\n toolCount: r.toolCount,\n })\n }\n return out\n }\n\n #recordFor(toolUseId: string, ts: number): TrackedSubagent {\n let record = this.#records.get(toolUseId)\n if (!record) {\n record = { toolUseId, status: 'running', startedAt: ts, toolCount: 0 }\n this.#records.set(toolUseId, record)\n }\n return record\n }\n\n #open(block: { id: string; input: unknown }, ts: number): void {\n const record = this.#recordFor(block.id, ts)\n const input = block.input as { subagent_type?: unknown; description?: unknown } | null | undefined\n record.agentType ??= cleaned(input?.subagent_type)\n record.description ??= cleaned(input?.description)\n }\n\n #sweep(final: boolean): void {\n for (const record of this.#records.values()) {\n if (record.status !== 'running') {\n continue\n }\n if (!final && record.background === 'live') {\n continue\n }\n this.#settle(record, 'failed')\n }\n }\n\n #settle(record: TrackedSubagent, status: 'done' | 'failed'): void {\n record.status = status\n record.settledOrder = ++this.#settleCounter\n let settled = 0\n for (const r of this.#records.values()) {\n if (r.settledOrder !== undefined) {\n settled++\n }\n }\n while (settled > SUBAGENT_HISTORY) {\n let oldestId: string | undefined\n let oldestOrder = Infinity\n for (const r of this.#records.values()) {\n if (r.settledOrder === undefined || r.settledOrder >= oldestOrder) {\n continue\n }\n oldestId = r.toolUseId\n oldestOrder = r.settledOrder\n }\n if (oldestId === undefined) {\n break\n }\n this.#records.delete(oldestId)\n settled--\n }\n }\n}\n\nfunction isLaunchAck(content: unknown): boolean {\n const text = typeof content === 'string' ? content : firstText(Array.isArray(content) ? content : [])\n return typeof text === 'string' && text.trimStart().startsWith('Async agent launched')\n}\n\nfunction parseTaskNotification(text: string | undefined): { toolUseId: string; status: string } | undefined {\n if (text === undefined || !text.trimStart().startsWith('<task-notification>')) {\n return undefined\n }\n const toolUseId = /<tool-use-id>\\s*([^<\\s]+)\\s*<\\/tool-use-id>/.exec(text)?.[1]\n if (toolUseId === undefined) {\n return undefined\n }\n const status = /<status>\\s*([^<]*?)\\s*<\\/status>/.exec(text)?.[1] ?? ''\n return { toolUseId, status }\n}\n\nfunction firstText(content: string | ContentBlock[] | unknown[]): string | undefined {\n if (typeof content === 'string') {\n return content\n }\n for (const block of content) {\n const b = block as { type?: unknown; text?: unknown } | null | undefined\n if (b?.type === 'text' && typeof b.text === 'string') {\n return b.text\n }\n }\n return undefined\n}\n\nfunction cleaned(value: unknown): string | undefined {\n if (typeof value !== 'string') {\n return undefined\n }\n const text = value.trim()\n if (text === '') {\n return undefined\n }\n return text.length > 80 ? text.slice(0, 79) + '…' : text\n}\n\nfunction toolUseBlocks(content: string | ContentBlock[]): Array<{ id: string; name: string; input: unknown }> {\n if (typeof content === 'string') {\n return []\n }\n const blocks: Array<{ id: string; name: string; input: unknown }> = []\n for (const block of content) {\n if (block.type !== 'tool_use') {\n continue\n }\n const b = block as { id?: unknown; name?: unknown; input?: unknown }\n if (typeof b.id !== 'string' || typeof b.name !== 'string') {\n continue\n }\n blocks.push({ id: b.id, name: b.name, input: b.input })\n }\n return blocks\n}\n","import { randomUUID } from 'node:crypto'\nimport {\n getSessionInfo,\n getSessionMessages,\n query as sdkQuery,\n type CanUseTool,\n type Options,\n type PermissionResult,\n type Query,\n type SDKMessage,\n type SDKSessionInfo,\n type SDKUserMessage,\n type SessionMessage,\n} from '@anthropic-ai/claude-agent-sdk'\nimport {\n ENGINE_CAPABILITIES,\n type CreateSessionRequest,\n type McpServerStatusInfo,\n type PermissionMode,\n type PermissionRequest,\n type SessionEvent,\n type SessionEventBody,\n type SessionInfo,\n type SessionStatus,\n} from '@workerdeck/protocol'\nimport { type AttachmentInput, attachmentContentBlocks, attachmentRef } from '../../lib/attachments.ts'\nimport { InputQueue } from '../../lib/input-queue.ts'\nimport {\n type UsageRateLimits,\n defaultModelFromSdk,\n isSyntheticUserText,\n mcpStatusInfo,\n modelOptionsFromSdk,\n normalizeSdkMessage,\n rateLimitEventsFromUsage,\n toApiMessage,\n} from '../../lib/normalize.ts'\nimport type { PermissionDecision, Runner, SessionEventListener } from '../../runner-interface.ts'\nimport { EventLog } from '../../lib/event-log.ts'\nimport { SubscriberSet, type SubscribeOptions } from '../../lib/subscribers.ts'\nimport { hostTitle, sessionTitle, withTitle } from '../../lib/title.ts'\nimport { SubagentTracker } from './subagents.ts'\n\nexport type QueryFn = (params: { prompt: AsyncIterable<SDKUserMessage>; options?: Options }) => Query\n\nexport type HistoryFn = (sdkSessionId: string, options: { dir?: string }) => Promise<SessionMessage[]>\n\nexport type SessionInfoFn = (sdkSessionId: string, options: { dir?: string }) => Promise<SDKSessionInfo | undefined>\n\nexport type SessionRunnerConfig = CreateSessionRequest & {\n queryFn?: QueryFn\n env?: Record<string, string | undefined>\n pathToClaudeCodeExecutable?: string\n extraOptions?: Partial<Options>\n defaultApprovalTimeoutMs?: number\n backfillHistory?: boolean\n historyFn?: HistoryFn\n sessionInfoFn?: SessionInfoFn\n}\n\ntype PendingApproval = {\n request: PermissionRequest\n resolve: (result: PermissionResult) => void\n timer: ReturnType<typeof setTimeout>\n}\n\nconst DEFAULT_APPROVAL_TIMEOUT_MS = 300_000\n\nexport class SessionRunner implements Runner {\n readonly id: string\n readonly createdAt: number\n\n #config: SessionRunnerConfig\n readonly #cwd: string\n #log = new EventLog()\n #subscribers = new SubscriberSet()\n #status: SessionStatus = 'starting'\n #statusDetail: string | undefined\n #sdkSessionId: string | undefined\n #model: string | undefined\n #apiKeySource: string | undefined\n #permissionMode: PermissionMode | undefined\n #pending = new Map<string, PendingApproval>()\n #turnOverWhileBlocked = false\n #subagents = new SubagentTracker()\n #totalCostUsd: number | undefined\n #numTurns: number | undefined\n #input = new InputQueue()\n #query: Query | undefined\n #capabilitiesEmitted = false\n #subscriptionType: string | undefined\n #engineTitle: string | undefined\n #started = false\n #closed = false\n #runPromise: Promise<void> | undefined\n\n constructor(config: SessionRunnerConfig, id: string = randomUUID()) {\n if (!config.cwd) {\n throw new Error('the claude engine requires a cwd')\n }\n this.#cwd = config.cwd\n this.#config = config\n this.#permissionMode = config.permissionMode\n this.id = id\n this.createdAt = Date.now()\n }\n\n get status(): SessionStatus {\n return this.#status\n }\n\n get sdkSessionId(): string | undefined {\n return this.#sdkSessionId\n }\n\n get lastSeq(): number {\n return this.#log.seq\n }\n\n get apiKeySource(): string | undefined {\n return this.#apiKeySource\n }\n\n get pendingApprovals(): PermissionRequest[] {\n return [...this.#pending.values()].map((p) => p.request)\n }\n\n info(): SessionInfo {\n return {\n id: this.id,\n sdkSessionId: this.#sdkSessionId,\n status: this.#status,\n cwd: this.#cwd,\n profile: this.#config.profile,\n engine: 'claude',\n capabilities: ENGINE_CAPABILITIES.claude,\n model: this.#model ?? this.#config.model,\n permissionMode: this.#permissionMode,\n canBypassPermissions: this.#config.permissionMode === 'bypassPermissions' || this.#config.allowDangerouslySkipPermissions === true,\n apiKeySource: this.#apiKeySource,\n createdAt: this.createdAt,\n lastSeq: this.#log.seq,\n activityCount: this.#log.activityCount,\n proseCount: this.#log.proseCount,\n contextUsage: this.#log.contextUsage,\n pendingPermissionCount: this.#pending.size,\n subagents: this.#subagents.list(),\n meta: this.#config.meta,\n scope: this.#config.scope,\n title: sessionTitle(this.#config, this.#engineTitle),\n totalCostUsd: this.#totalCostUsd,\n numTurns: this.#numTurns,\n lastActivityAt: this.#log.lastActivityAt,\n }\n }\n\n setTitle(title: string | undefined): void {\n this.#config = withTitle(this.#config, title)\n }\n\n start(): Promise<void> {\n if (this.#started) {\n return this.#runPromise!\n }\n this.#started = true\n if (this.#config.prompt) {\n this.sendMessage(this.#config.prompt)\n }\n this.#runPromise = this.#run()\n return this.#runPromise\n }\n\n sendMessage(text: string, attachments?: readonly AttachmentInput[]): void {\n if (this.#closed) {\n throw new Error('session is closed')\n }\n const blocks = attachments?.length ? attachmentContentBlocks(attachments) : []\n // A message may be attachments alone; an empty text block is not valid API input.\n const content = blocks.length\n ? ([...blocks, ...(text ? [{ type: 'text', text }] : [])] as unknown as SDKUserMessage['message']['content'])\n : text\n this.#input.push({\n type: 'user',\n message: { role: 'user', content },\n parent_tool_use_id: null,\n session_id: this.#sdkSessionId,\n })\n this.#emit({\n type: 'user_message',\n message: { role: 'user', content: text },\n parentToolUseId: null,\n attachments: attachments?.length ? attachments.map(attachmentRef) : undefined,\n uuid: randomUUID(),\n })\n }\n\n async mcpServers(): Promise<McpServerStatusInfo[] | undefined> {\n const query = this.#query\n if (typeof query?.mcpServerStatus !== 'function') {\n return undefined\n }\n return (await query.mcpServerStatus()).map(mcpStatusInfo)\n }\n\n async reconnectMcpServer(name: string): Promise<void> {\n const query = this.#query\n if (typeof query?.reconnectMcpServer !== 'function') {\n throw new Error('this session cannot reconnect MCP servers')\n }\n await query.reconnectMcpServer(name)\n }\n\n async setMcpServerEnabled(name: string, enabled: boolean): Promise<void> {\n const query = this.#query\n if (typeof query?.toggleMcpServer !== 'function') {\n throw new Error('this session cannot enable or disable MCP servers')\n }\n await query.toggleMcpServer(name, enabled)\n }\n\n resolvePermission(requestId: string, decision: PermissionDecision): boolean {\n const pending = this.#pending.get(requestId)\n if (!pending) {\n return false\n }\n this.#settleApproval(requestId, pending, decision, 'client')\n return true\n }\n\n async interrupt(): Promise<void> {\n await this.#query?.interrupt()\n }\n\n async clearContext(): Promise<void> {\n if (this.#status === 'closed' || this.#status === 'failed') {\n throw new Error('session is closed')\n }\n this.sendMessage('/clear')\n }\n\n async setPermissionMode(mode: PermissionMode): Promise<void> {\n await this.#query?.setPermissionMode(mode)\n this.#permissionMode = mode\n this.#emit({ type: 'permission_mode_changed', mode })\n }\n\n async setModel(model?: string): Promise<void> {\n await this.#query?.setModel(model)\n this.#model = model\n this.#emit({ type: 'model_changed', model })\n }\n\n fail(message: string): void {\n if (this.#closed) {\n return\n }\n this.#emit({ type: 'session_error', message })\n this.#setStatus('failed')\n this.close('error')\n }\n\n close(reason: 'client' | 'server' | 'error' = 'client'): void {\n if (this.#closed) {\n return\n }\n this.#closed = true\n for (const [id, pending] of this.#pending) {\n this.#settleApproval(id, pending, { behavior: 'deny', message: 'Session closed' }, 'policy')\n }\n this.#input.end()\n this.#query?.close()\n this.#emit({ type: 'session_closed', reason })\n this.#setStatus('closed')\n }\n\n eventAt(seq: number): SessionEvent | undefined {\n return this.#log.at(seq)\n }\n\n subscribe(listener: SessionEventListener, afterSeq = 0, options?: SubscribeOptions): () => void {\n return this.#subscribers.subscribe(this.#log.events, listener, afterSeq, options, this.#log.resetSeq)\n }\n\n async #run(): Promise<void> {\n const queryFn = this.#config.queryFn ?? (sdkQuery as QueryFn)\n try {\n await this.#backfillHistory()\n if (this.#closed) {\n return\n }\n this.#query = queryFn({ prompt: this.#input, options: this.#buildOptions() })\n if (!this.#config.prompt) {\n this.#setStatus('idle')\n void this.#fetchCapabilities()\n void this.#fetchContextUsage()\n void this.#fetchRateLimits()\n }\n for await (const message of this.#query) {\n this.#handleMessage(message)\n }\n if (!this.#closed) {\n this.#closed = true\n this.#input.end()\n this.#emit({ type: 'session_closed', reason: 'server' })\n this.#setStatus('closed')\n }\n } catch (error) {\n if (!this.#closed) {\n this.#emit({\n type: 'session_error',\n message: error instanceof Error ? error.message : String(error),\n })\n this.#setStatus('failed')\n this.close('error')\n }\n }\n }\n\n async #backfillHistory(): Promise<void> {\n const c = this.#config\n if (!c.resume || c.backfillHistory === false) {\n return\n }\n const historyFn = c.historyFn ?? ((sessionId: string, options: { dir?: string }) => getSessionMessages(sessionId, options))\n let messages: SessionMessage[]\n try {\n messages = await historyFn(c.resume, { dir: this.#cwd })\n } catch {\n return\n }\n for (const m of messages) {\n if (this.#closed) {\n return\n }\n if (m.type === 'user') {\n const message = toApiMessage(m.message)\n this.#emit({\n type: 'user_message',\n message,\n parentToolUseId: m.parent_tool_use_id,\n replay: true,\n synthetic: isSyntheticUserText(message) ? true : undefined,\n uuid: m.uuid,\n })\n } else if (m.type === 'assistant') {\n this.#emit({\n type: 'assistant_message',\n message: toApiMessage(m.message),\n parentToolUseId: m.parent_tool_use_id,\n replay: true,\n uuid: m.uuid,\n })\n }\n }\n }\n\n #buildOptions(): Options {\n const c = this.#config\n const options: Options = {\n cwd: this.#cwd,\n permissionMode: c.permissionMode,\n allowedTools: c.allowedTools,\n disallowedTools: c.disallowedTools,\n mcpServers: c.mcpServers as Options['mcpServers'],\n settingSources: c.settingSources,\n model: c.model,\n maxTurns: c.maxTurns,\n maxBudgetUsd: c.maxBudgetUsd,\n resume: c.resume,\n forkSession: c.forkSession,\n effort: c.reasoningEffort as Options['effort'],\n includePartialMessages: c.includePartialMessages ?? true,\n forwardSubagentText: true,\n canUseTool: this.#canUseTool,\n env: c.env,\n pathToClaudeCodeExecutable: c.pathToClaudeCodeExecutable,\n ...(c.permissionMode === 'bypassPermissions' || c.allowDangerouslySkipPermissions ? { allowDangerouslySkipPermissions: true } : {}),\n ...c.extraOptions,\n }\n return options\n }\n\n #handleMessage(msg: SDKMessage): void {\n if (msg.type === 'system' && msg.subtype === 'init') {\n this.#sdkSessionId = msg.session_id\n this.#model = msg.model\n this.#permissionMode = msg.permissionMode\n this.#apiKeySource = msg.apiKeySource\n this.#emit({\n type: 'system_init',\n sdkSessionId: msg.session_id,\n model: msg.model,\n cwd: msg.cwd,\n apiKeySource: msg.apiKeySource,\n tools: msg.tools,\n skills: msg.skills,\n slashCommands: msg.slash_commands,\n permissionMode: msg.permissionMode,\n claudeCodeVersion: msg.claude_code_version,\n mcpServers: msg.mcp_servers,\n })\n this.#turnOverWhileBlocked = false\n this.#setStatus('running')\n void this.#fetchCapabilities()\n void this.#fetchContextUsage()\n void this.#fetchRateLimits()\n void this.#fetchEngineTitle()\n return\n }\n if (msg.type === 'system' && msg.subtype === 'session_state_changed') {\n if (this.#pending.size > 0) {\n if (msg.state === 'idle') {\n this.#turnOverWhileBlocked = true\n } else if (msg.state === 'running') {\n this.#turnOverWhileBlocked = false\n }\n return\n }\n if (msg.state === 'idle') {\n this.#setStatus('idle')\n } else if (msg.state === 'running') {\n this.#setStatus('running')\n }\n return\n }\n const body = normalizeSdkMessage(msg)\n if (body) {\n this.#emit(body)\n if (body.type === 'conversation_reset') {\n if (body.sdkSessionId) {\n this.#sdkSessionId = body.sdkSessionId\n }\n void this.#fetchContextUsage()\n }\n if (body.type === 'turn_result') {\n this.#totalCostUsd = body.totalCostUsd\n this.#numTurns = body.numTurns\n if (this.#pending.size === 0) {\n this.#setStatus('idle')\n } else {\n this.#turnOverWhileBlocked = true\n }\n void this.#fetchContextUsage()\n void this.#fetchRateLimits()\n void this.#fetchEngineTitle()\n }\n }\n }\n\n async #fetchCapabilities(): Promise<void> {\n if (this.#capabilitiesEmitted) {\n return\n }\n const query = this.#query\n if (typeof query?.supportedModels !== 'function' || typeof query.supportedCommands !== 'function') {\n return\n }\n try {\n const [models, commands] = await Promise.all([query.supportedModels(), query.supportedCommands()])\n if (this.#closed || this.#capabilitiesEmitted) {\n return\n }\n this.#capabilitiesEmitted = true\n this.#emit({\n type: 'capabilities',\n models: modelOptionsFromSdk(models),\n defaultModel: defaultModelFromSdk(models),\n commands: commands.map((c) => ({\n name: c.name,\n description: c.description,\n argumentHint: c.argumentHint,\n aliases: c.aliases,\n })),\n })\n } catch {}\n }\n\n async #fetchEngineTitle(): Promise<void> {\n if (hostTitle(this.#config.meta)) {\n return\n }\n const sdkSessionId = this.#sdkSessionId\n if (!sdkSessionId) {\n return\n }\n const read = this.#config.sessionInfoFn ?? getSessionInfo\n try {\n const info = await read(sdkSessionId, { dir: this.#cwd })\n if (this.#closed || !info) {\n return\n }\n const summary = info.summary && info.summary !== info.firstPrompt ? info.summary : undefined\n const title = info.customTitle || summary\n if (title) {\n this.#engineTitle = title\n }\n } catch {}\n }\n\n async #fetchContextUsage(): Promise<void> {\n const query = this.#query\n if (typeof query?.getContextUsage !== 'function') {\n return\n }\n try {\n const usage = await query.getContextUsage()\n if (this.#closed) {\n return\n }\n this.#emit({\n type: 'context_usage',\n usage: {\n categories: usage.categories.map((c) => ({\n name: c.name,\n tokens: c.tokens,\n color: c.color,\n })),\n totalTokens: usage.totalTokens,\n maxTokens: usage.maxTokens,\n percentage: usage.percentage,\n model: usage.model,\n },\n })\n } catch {}\n }\n\n async #fetchRateLimits(): Promise<void> {\n const query = this.#query as { usage_EXPERIMENTAL_MAY_CHANGE_DO_NOT_RELY_ON_THIS_API_YET?: () => Promise<unknown> } | undefined\n const fetchUsage = query?.usage_EXPERIMENTAL_MAY_CHANGE_DO_NOT_RELY_ON_THIS_API_YET\n if (typeof fetchUsage !== 'function') {\n return\n }\n try {\n const usage = (await fetchUsage.call(query)) as UsageRateLimits\n if (this.#closed) {\n return\n }\n const subscriptionType = usage.subscription_type\n if (subscriptionType && subscriptionType !== this.#subscriptionType) {\n this.#subscriptionType = subscriptionType\n this.#emit({ type: 'plan_info', subscriptionType })\n }\n for (const body of rateLimitEventsFromUsage(usage)) {\n this.#emit(body)\n }\n } catch {}\n }\n\n #canUseTool: CanUseTool = (toolName, input, options) => {\n const id = randomUUID()\n const timeoutMs = this.#config.approvalTimeoutMs ?? this.#config.defaultApprovalTimeoutMs ?? DEFAULT_APPROVAL_TIMEOUT_MS\n const request: PermissionRequest = {\n id,\n toolName,\n input,\n toolUseId: options.toolUseID,\n title: options.title,\n displayName: options.displayName,\n description: options.description,\n decisionReason: options.decisionReason,\n agentId: options.agentID,\n expiresAt: Date.now() + timeoutMs,\n }\n const questionBehavior = this.#config.questionBehavior ?? 'ask'\n if (toolName === 'AskUserQuestion' && questionBehavior !== 'ask') {\n delete request.expiresAt\n return Promise.resolve(this.#resolveQuestionByPolicy(request, questionBehavior))\n }\n return new Promise<PermissionResult>((resolve) => {\n const timer = setTimeout(() => {\n const pending = this.#pending.get(id)\n if (pending) {\n this.#settleApproval(id, pending, { behavior: 'deny', message: 'Approval timed out' }, 'timeout')\n }\n }, timeoutMs)\n this.#pending.set(id, { request, resolve, timer })\n options.signal.addEventListener('abort', () => {\n const pending = this.#pending.get(id)\n if (pending) {\n this.#settleApproval(id, pending, { behavior: 'deny', message: 'Turn aborted' }, 'policy')\n }\n })\n this.#emit({ type: 'permission_requested', request })\n this.#setStatus('awaiting_approval')\n })\n }\n\n #resolveQuestionByPolicy(request: PermissionRequest, mode: 'auto' | 'deny'): PermissionResult {\n this.#emit({ type: 'permission_requested', request })\n if (mode === 'deny') {\n const message = 'Interactive questions are disabled for this session — choose the most reasonable option yourself and continue.'\n this.#emit({\n type: 'permission_resolved',\n requestId: request.id,\n behavior: 'deny',\n resolvedBy: 'policy',\n message,\n })\n return { behavior: 'deny', message, toolUseID: request.toolUseId }\n }\n this.#emit({\n type: 'permission_resolved',\n requestId: request.id,\n behavior: 'allow',\n resolvedBy: 'policy',\n })\n return {\n behavior: 'allow',\n updatedInput: { ...request.input, answers: recommendedAnswers(request.input) },\n toolUseID: request.toolUseId,\n }\n }\n\n #settleApproval(id: string, pending: PendingApproval, decision: PermissionDecision, resolvedBy: 'client' | 'timeout' | 'policy'): void {\n clearTimeout(pending.timer)\n this.#pending.delete(id)\n if (decision.behavior === 'allow') {\n pending.resolve({\n behavior: 'allow',\n updatedInput: decision.updatedInput ?? pending.request.input,\n toolUseID: pending.request.toolUseId,\n })\n } else {\n pending.resolve({\n behavior: 'deny',\n message: decision.message ?? 'Denied',\n interrupt: decision.interrupt,\n toolUseID: pending.request.toolUseId,\n })\n }\n this.#emit({\n type: 'permission_resolved',\n requestId: id,\n behavior: decision.behavior,\n resolvedBy,\n message: decision.behavior === 'deny' ? (decision.message ?? 'Denied') : undefined,\n })\n if (this.#pending.size === 0) {\n const endedWhileBlocked = this.#turnOverWhileBlocked\n this.#turnOverWhileBlocked = false\n if (endedWhileBlocked) {\n this.#setStatus('idle')\n } else if (this.#status === 'awaiting_approval') {\n this.#setStatus('running')\n }\n }\n }\n\n #setStatus(status: SessionStatus, detail?: string): void {\n if (this.#status === status && this.#statusDetail === detail) {\n return\n }\n if (this.#status === 'closed' || this.#status === 'failed') {\n return\n }\n this.#status = status\n this.#statusDetail = detail\n this.#emit({ type: 'status_changed', status, detail })\n }\n\n #emit(body: SessionEventBody): void {\n const event = this.#log.append(body)\n this.#subagents.observe(body, event.ts)\n this.#subscribers.emit(event)\n }\n}\n\nfunction recommendedAnswers(input: Record<string, unknown>): Record<string, string> {\n const answers: Record<string, string> = {}\n const questions = Array.isArray(input.questions) ? input.questions : []\n for (const entry of questions) {\n const q = entry as { question?: unknown; options?: unknown }\n if (typeof q.question !== 'string' || !Array.isArray(q.options)) {\n continue\n }\n const first = q.options[0] as { label?: unknown } | undefined\n if (typeof first?.label === 'string') {\n answers[q.question] = first.label\n }\n }\n return answers\n}\n","import { randomUUID } from 'node:crypto'\nimport { ToolLoopAgent, generateText, isStepCount, type LanguageModel, type ModelMessage, type ToolSet } from 'ai'\nimport {\n ENGINE_CAPABILITIES,\n snapshotRetains,\n type ContentBlock,\n type CreateSessionRequest,\n type McpServerStatusInfo,\n type PermissionDecisionSource,\n type PermissionMode,\n type PermissionRequest,\n type SessionEvent,\n type SessionEventBody,\n type SessionInfo,\n type SessionStatus,\n type ToolExecutionBackend,\n} from '@workerdeck/protocol'\nimport type { SandboxVfs } from '@workerdeck/sandbox'\nimport { type AttachmentInput, attachmentRef, normalizeMediaType } from '../../lib/attachments.ts'\nimport type { ParkedExecution, PermissionDecision, Runner, RunnerSnapshot, SessionEventListener } from '../../runner-interface.ts'\nimport type { ToolExecutionCall, ToolExecutionResult, ToolExecutor } from '../../executors/tool-executor.ts'\nimport { EventLog } from '../../lib/event-log.ts'\nimport { SubscriberSet, type SubscribeOptions } from '../../lib/subscribers.ts'\nimport { sessionTitle, withTitle } from '../../lib/title.ts'\n\nconst SUPPORTED_PERMISSION_MODES: readonly PermissionMode[] = ['default', 'bypassPermissions', 'dontAsk']\n\nexport type AiSdkRunnerConfig = Omit<CreateSessionRequest, 'cwd'> & {\n cwd?: string\n languageModel: LanguageModel\n tools?: ToolSet\n instructions?: string\n maxSteps?: number\n executor?: ToolExecutor\n executableTools?: string[]\n vfs?: SandboxVfs\n executionLimits?: { timeoutMs?: number; memoryLimitBytes?: number }\n executionBackend?: ToolExecutionBackend\n shouldApprove?: (call: { toolName: string; input: unknown }) => boolean\n approvalTimeoutMs?: number\n resolveModel?: (modelId: string | undefined) => LanguageModel\n reportMcpServers?: () => Promise<McpServerStatusInfo[] | undefined>\n onClose?: () => void | Promise<void>\n restore?: RunnerSnapshot\n}\n\nexport type PendingToolCall = {\n toolCallId: string\n toolName: string\n input: unknown\n deferred?: boolean\n expiresAt?: number\n}\n\nexport type AiSdkSessionState = {\n messages: ModelMessage[]\n pendingToolCalls: PendingToolCall[]\n dispatched: string[]\n numTurns: number\n totalUsage: { input: number; output: number; cacheWrite: number; cacheRead: number }\n turnAccum?: { startedAt: number; input: number; output: number; cacheWrite: number; cacheRead: number }\n permissionMode: PermissionMode\n model?: string\n lastActivityAt?: number\n parkedAt?: number\n}\n\nexport type ToolCallOutput = { type: 'text'; value: string } | { type: 'json'; value: unknown }\n\nexport class AiSdkRunner implements Runner {\n readonly id: string\n readonly createdAt: number\n\n #config: AiSdkRunnerConfig\n #model: LanguageModel\n #log = new EventLog()\n #subscribers = new SubscriberSet()\n #status: SessionStatus = 'starting'\n #statusDetail: string | undefined\n #permissionMode: PermissionMode\n #messages: ModelMessage[] = []\n #pendingToolCalls = new Map<string, PendingToolCall>()\n #dispatched = new Set<string>()\n #turnChain: Promise<void> = Promise.resolve()\n #abort: AbortController | undefined\n #turnAccum: { startedAt: number; input: number; output: number; cacheWrite: number; cacheRead: number } | undefined\n #numTurns = 0\n #totalUsage = { input: 0, output: 0, cacheWrite: 0, cacheRead: 0 }\n #started = false\n #closed = false\n #parked = false\n #modelAlias: string | undefined\n #pendingApprovals = new Map<\n string,\n {\n request: PermissionRequest\n toolCallId: string\n timer: ReturnType<typeof setTimeout>\n }\n >()\n\n constructor(config: AiSdkRunnerConfig, id: string = randomUUID()) {\n const mode = config.permissionMode ?? 'default'\n if (!SUPPORTED_PERMISSION_MODES.includes(mode)) {\n throw new Error(`permission mode '${mode}' is not supported by the AI SDK engine`)\n }\n this.#config = config\n this.#model = config.languageModel\n this.#permissionMode = mode\n this.#modelAlias = config.model\n this.id = config.restore?.id ?? id\n this.createdAt = config.restore?.createdAt ?? Date.now()\n if (config.restore) {\n this.#restore(config.restore)\n }\n }\n\n #restore(snapshot: RunnerSnapshot): void {\n if (snapshot.engine !== 'provider') {\n throw new Error(`cannot restore a '${snapshot.engine}' snapshot into the AI SDK engine`)\n }\n const state = snapshot.state as AiSdkSessionState | undefined\n if (!state || !Array.isArray(state.messages)) {\n throw new Error('session snapshot is missing its provider-engine state')\n }\n this.#log.restore(snapshot.events, snapshot.seq, state.lastActivityAt)\n this.#messages = [...state.messages]\n for (const call of state.pendingToolCalls) {\n this.#pendingToolCalls.set(call.toolCallId, call)\n }\n this.#dispatched = new Set(state.dispatched)\n this.#numTurns = state.numTurns\n this.#totalUsage = { ...state.totalUsage }\n this.#turnAccum = state.turnAccum ? { ...state.turnAccum } : undefined\n if (this.#turnAccum && state.parkedAt !== undefined) {\n this.#turnAccum.startedAt += Date.now() - state.parkedAt\n }\n this.#permissionMode = state.permissionMode\n this.#status = this.#pendingToolCalls.size > 0 ? 'parked' : 'idle'\n if (state.model !== undefined && state.model !== this.#modelAlias && this.#config.resolveModel) {\n this.#modelAlias = state.model\n this.#model = this.#config.resolveModel(state.model)\n }\n }\n\n get status(): SessionStatus {\n return this.#status\n }\n\n get lastSeq(): number {\n return this.#log.seq\n }\n\n get messages(): ModelMessage[] {\n return [...this.#messages]\n }\n\n get pendingToolCalls(): PendingToolCall[] {\n return [...this.#pendingToolCalls.values()]\n }\n\n get pendingApprovals(): PermissionRequest[] {\n return [...this.#pendingApprovals.values()].map((a) => a.request)\n }\n\n get vfs(): SandboxVfs | undefined {\n return this.#config.vfs\n }\n\n info(): SessionInfo {\n return {\n id: this.id,\n status: this.#status,\n // Never process.cwd(): this engine opens no directory, and the gateway's own deploy path\n // has no business on a client surface.\n cwd: this.#config.cwd ?? '',\n profile: this.#config.profile,\n engine: 'provider',\n capabilities: this.#config.shouldApprove\n ? { ...ENGINE_CAPABILITIES.provider, interactiveApprovals: true }\n : ENGINE_CAPABILITIES.provider,\n model: this.#modelId(),\n permissionMode: this.#permissionMode,\n createdAt: this.createdAt,\n lastSeq: this.#log.seq,\n activityCount: this.#log.activityCount,\n proseCount: this.#log.proseCount,\n contextUsage: this.#log.contextUsage,\n pendingPermissionCount: this.#pendingApprovals.size,\n meta: this.#config.meta,\n scope: this.#config.scope,\n title: sessionTitle(this.#config),\n numTurns: this.#numTurns || undefined,\n lastActivityAt: this.#log.lastActivityAt,\n }\n }\n\n start(): Promise<void> {\n if (this.#started) {\n return this.#turnChain\n }\n this.#started = true\n if (this.#config.restore) {\n return this.#turnChain\n }\n this.#setStatus('idle')\n if (this.#config.prompt) {\n this.sendMessage(this.#config.prompt)\n }\n return this.#turnChain\n }\n\n park(): RunnerSnapshot | undefined {\n if (this.#closed || this.#parked) {\n return undefined\n }\n if (this.#abort || !this.#restingOnDeferred()) {\n return undefined\n }\n this.#setStatus('parked')\n const snapshot = this.#buildSnapshot()\n this.#parked = true\n this.#subscribers.clear()\n try {\n void Promise.resolve(this.#config.onClose?.()).catch(() => {})\n } catch {}\n return snapshot\n }\n\n snapshot(): RunnerSnapshot | undefined {\n if (this.#closed || this.#parked || this.#abort) {\n return undefined\n }\n if (this.#pendingToolCalls.size > 0 && !this.#restingOnDeferred()) {\n return undefined\n }\n return this.#buildSnapshot()\n }\n\n #buildSnapshot(): RunnerSnapshot {\n const parked: ParkedExecution[] = [...this.#pendingToolCalls.values()].map((call) => ({\n executionId: call.toolCallId,\n toolName: call.toolName,\n expiresAt: call.expiresAt,\n }))\n const state: AiSdkSessionState = {\n messages: this.#messages,\n pendingToolCalls: [...this.#pendingToolCalls.values()],\n dispatched: [...this.#dispatched],\n numTurns: this.#numTurns,\n totalUsage: { ...this.#totalUsage },\n turnAccum: this.#turnAccum ? { ...this.#turnAccum } : undefined,\n permissionMode: this.#permissionMode,\n model: this.#modelAlias,\n lastActivityAt: this.#log.lastActivityAt,\n parkedAt: Date.now(),\n }\n return {\n engine: 'provider',\n id: this.id,\n createdAt: this.createdAt,\n seq: this.#log.seq,\n events: this.#log.events.filter((event) => snapshotRetains(event)),\n vfs: this.#config.vfs?.snapshot(),\n parked,\n state,\n }\n }\n\n sendMessage(text: string, attachments?: readonly AttachmentInput[]): void {\n if (this.#parked) {\n throw new Error('session is parked')\n }\n if (this.#closed) {\n throw new Error('session is closed')\n }\n const content = attachments?.length\n ? [\n ...attachments.map((attachment) => ({\n type: 'file' as const,\n data: attachment.data,\n mediaType: normalizeMediaType(attachment.mediaType),\n filename: attachment.name,\n })),\n ...(text ? [{ type: 'text' as const, text }] : []),\n ]\n : text\n this.#messages.push({ role: 'user', content })\n this.#emit({\n type: 'user_message',\n message: { role: 'user', content: text },\n parentToolUseId: null,\n attachments: attachments?.length ? attachments.map(attachmentRef) : undefined,\n uuid: randomUUID(),\n })\n this.#scheduleTurn()\n }\n\n resolveToolCall(toolCallId: string, output: ToolCallOutput, options?: { isError?: boolean }): boolean {\n if (!this.#settlePendingCall(toolCallId, output, options?.isError === true)) {\n return false\n }\n if (this.#pendingToolCalls.size === 0) {\n this.#scheduleTurn()\n }\n return true\n }\n\n #settlePendingCall(toolCallId: string, output: ToolCallOutput, isError: boolean): boolean {\n const pending = this.#pendingToolCalls.get(toolCallId)\n if (!pending || this.#closed || this.#parked) {\n return false\n }\n this.#pendingToolCalls.delete(toolCallId)\n let insertAt = this.#messages.length\n while (insertAt > 0 && this.#messages[insertAt - 1]!.role === 'user') {\n insertAt--\n }\n this.#messages.splice(insertAt, 0, {\n role: 'tool',\n content: [\n {\n type: 'tool-result',\n toolCallId,\n toolName: pending.toolName,\n output: (isError ? { type: 'error-text', value: textValue(output) } : output) as never,\n },\n ],\n })\n this.#emit({\n type: 'user_message',\n message: {\n role: 'user',\n content: [\n {\n type: 'tool_result',\n tool_use_id: toolCallId,\n content: textValue(output),\n is_error: isError || undefined,\n },\n ],\n },\n parentToolUseId: null,\n synthetic: true,\n uuid: randomUUID(),\n })\n return true\n }\n\n resolvePermission(requestId: string, decision: PermissionDecision): boolean {\n const approval = this.#pendingApprovals.get(requestId)\n if (!approval) {\n return false\n }\n clearTimeout(approval.timer)\n this.#pendingApprovals.delete(requestId)\n const source: PermissionDecisionSource = 'client'\n if (decision.behavior === 'allow') {\n this.#emit({\n type: 'permission_resolved',\n requestId,\n behavior: 'allow',\n resolvedBy: source,\n })\n this.#dispatchSingle(approval.toolCallId)\n } else {\n const message = decision.message ?? 'Permission denied by user'\n this.#emit({\n type: 'permission_resolved',\n requestId,\n behavior: 'deny',\n resolvedBy: source,\n message,\n })\n this.#applyExecutionResult(approval.toolCallId, {\n status: 'failed',\n reason: 'permission_denied',\n error: message,\n })\n if (decision.interrupt) {\n void this.interrupt()\n }\n }\n return true\n }\n\n emitFileDelivered(file: { path: string; bytes: number; description?: string }): void {\n if (this.#closed || this.#parked) {\n return\n }\n this.#emit({ type: 'file_delivered', ...file })\n }\n\n async generateDigest(prompt: string): Promise<string> {\n const result = await generateText({\n model: this.#model,\n prompt,\n abortSignal: this.#abort?.signal,\n })\n const accum = this.#turnAccum\n if (accum) {\n accum.input += result.usage.inputTokens ?? 0\n accum.output += result.usage.outputTokens ?? 0\n accum.cacheWrite += result.usage.inputTokenDetails?.cacheWriteTokens ?? 0\n accum.cacheRead += result.usage.inputTokenDetails?.cacheReadTokens ?? 0\n }\n return result.text\n }\n\n async clearContext(): Promise<void> {\n if (this.#status === 'closed' || this.#status === 'failed') {\n throw new Error('session is closed')\n }\n const run = this.#turnChain.then(() => {\n if (this.#closed) {\n throw new Error('session is closed')\n }\n // Waiting cannot resolve parked external work — a bridged result is owed by a client that\n // may answer in two days, and the messages it splices into are what a clear would drop.\n if (this.#pendingToolCalls.size > 0) {\n throw new Error('cannot clear context while tool calls are outstanding')\n }\n this.#messages = []\n this.#emit({ type: 'conversation_reset' })\n })\n this.#turnChain = run.then(\n () => undefined,\n () => undefined,\n )\n await run\n }\n\n async interrupt(): Promise<void> {\n if (this.#abort) {\n this.#abort.abort()\n } else if (this.#pendingToolCalls.size > 0) {\n const accum = this.#turnAccum ?? { startedAt: Date.now(), input: 0, output: 0, cacheWrite: 0, cacheRead: 0 }\n for (const call of Array.from(this.#pendingToolCalls.values())) {\n this.#settlePendingCall(call.toolCallId, { type: 'text', value: 'interrupted' }, true)\n }\n this.#dispatched.clear()\n this.#numTurns += 1\n this.#emit({\n type: 'turn_result',\n subtype: 'error_during_execution',\n isError: true,\n durationMs: Date.now() - accum.startedAt,\n numTurns: this.#numTurns,\n totalCostUsd: 0,\n errors: ['interrupted'],\n usage: turnUsage(accum),\n })\n this.#turnAccum = undefined\n this.#setStatus('idle')\n }\n await this.#turnChain\n }\n\n async setPermissionMode(mode: PermissionMode): Promise<void> {\n if (!SUPPORTED_PERMISSION_MODES.includes(mode)) {\n throw new Error(`permission mode '${mode}' is not supported by the AI SDK engine`)\n }\n this.#permissionMode = mode\n this.#emit({ type: 'permission_mode_changed', mode })\n }\n\n async setModel(model?: string): Promise<void> {\n const resolve = this.#config.resolveModel\n if (!resolve) {\n throw new Error('set_model is not supported by this session')\n }\n this.#model = resolve(model)\n this.#modelAlias = model\n this.#emit({ type: 'model_changed', model })\n }\n\n fail(message: string): void {\n if (this.#closed) {\n return\n }\n this.#emit({ type: 'session_error', message })\n this.#setStatus('failed')\n this.close('error')\n }\n\n close(reason: 'client' | 'server' | 'error' = 'client'): void {\n if (this.#closed || this.#parked) {\n return\n }\n this.#closed = true\n this.#abort?.abort()\n this.#pendingToolCalls.clear()\n this.#dispatched.clear()\n for (const { timer } of this.#pendingApprovals.values()) {\n clearTimeout(timer)\n }\n this.#pendingApprovals.clear()\n this.#emit({ type: 'session_closed', reason })\n this.#setStatus('closed')\n try {\n void Promise.resolve(this.#config.onClose?.()).catch(() => {})\n } catch {}\n }\n\n eventAt(seq: number): SessionEvent | undefined {\n return this.#log.at(seq)\n }\n\n subscribe(listener: SessionEventListener, afterSeq = 0, options?: SubscribeOptions): () => void {\n return this.#subscribers.subscribe(this.#log.events, listener, afterSeq, options, this.#log.resetSeq)\n }\n\n #scheduleTurn(): void {\n this.#turnChain = this.#turnChain.then(() => this.#runTurn())\n }\n\n settleExecution(executionId: string, result: ToolExecutionResult): boolean {\n if (this.#closed || this.#parked) {\n return false\n }\n if (!this.#pendingToolCalls.has(executionId)) {\n return false\n }\n this.#applyExecutionResult(executionId, result)\n return true\n }\n\n #dispatchPending(): void {\n const executor = this.#config.executor\n if (!executor) {\n return\n }\n const executable = this.#config.executableTools\n const needsApproval = this.#permissionMode === 'default' && this.#config.shouldApprove\n const inFlight: Array<Promise<unknown>> = []\n let anyDeferred = false\n let anyAwaiting = false\n for (const call of Array.from(this.#pendingToolCalls.values())) {\n if (executable && !executable.includes(call.toolName)) {\n continue\n }\n if (this.#dispatched.has(call.toolCallId)) {\n continue\n }\n if (needsApproval && needsApproval({ toolName: call.toolName, input: call.input as Record<string, unknown> })) {\n if ([...this.#pendingApprovals.values()].some((a) => a.toolCallId === call.toolCallId)) {\n anyAwaiting = true\n continue\n }\n const requestId = randomUUID()\n const timeoutMs = this.#config.approvalTimeoutMs ?? 120_000\n const request: PermissionRequest = {\n id: requestId,\n toolName: call.toolName,\n input: call.input as Record<string, unknown>,\n toolUseId: call.toolCallId,\n title: `Agent wants to run ${call.toolName}`,\n displayName: call.toolName,\n expiresAt: Date.now() + timeoutMs,\n }\n const timer = setTimeout(() => {\n if (!this.#pendingApprovals.has(requestId)) {\n return\n }\n this.resolvePermission(requestId, {\n behavior: 'deny',\n message: 'Approval timed out',\n })\n }, timeoutMs)\n this.#pendingApprovals.set(requestId, { request, toolCallId: call.toolCallId, timer })\n this.#emit({ type: 'permission_requested', request })\n anyAwaiting = true\n continue\n }\n this.#dispatched.add(call.toolCallId)\n const dispatched = this.#dispatchCall(executor, call)\n anyDeferred ||= dispatched.deferred\n inFlight.push(dispatched.promise)\n }\n if (anyAwaiting) {\n this.#setStatus('awaiting_approval')\n }\n if (anyDeferred) {\n void Promise.allSettled(inFlight).then(() => this.#announceParked())\n }\n }\n\n #dispatchSingle(toolCallId: string): void {\n const executor = this.#config.executor\n if (!executor) {\n return\n }\n const call = this.#pendingToolCalls.get(toolCallId)\n if (!call || this.#dispatched.has(toolCallId)) {\n return\n }\n this.#dispatched.add(toolCallId)\n const dispatched = this.#dispatchCall(executor, call)\n if (dispatched.deferred) {\n void dispatched.promise.then(() => this.#announceParked())\n }\n }\n\n #dispatchCall(executor: ToolExecutor, call: PendingToolCall): { deferred: boolean; promise: Promise<void> } {\n const toolCall: ToolExecutionCall = {\n executionId: call.toolCallId,\n sessionId: this.id,\n tool: call.toolName,\n input: call.input,\n vfs: this.#config.vfs,\n limits: this.#config.executionLimits,\n signal: this.#abort?.signal,\n }\n const profile = executor.describe?.(toolCall) ?? {}\n call.deferred = profile.deferred === true ? true : undefined\n call.expiresAt = profile.timeoutMs === undefined ? undefined : Date.now() + profile.timeoutMs\n this.#emit({\n type: 'execution_dispatched',\n executionId: call.toolCallId,\n toolName: call.toolName,\n backend: profile.backend ?? this.#config.executionBackend ?? 'server',\n deferred: call.deferred,\n expiresAt: call.expiresAt,\n })\n const promise = executor\n .dispatch(toolCall)\n .then((dispatch) => {\n // 'pending' means the result arrives later, through settleExecution().\n if (dispatch.status === 'settled') {\n this.#applyExecutionResult(call.toolCallId, dispatch.result)\n }\n })\n .catch((error: unknown) => {\n this.#applyExecutionResult(call.toolCallId, {\n status: 'failed',\n reason: 'dispatch_error',\n error: error instanceof Error ? error.message : String(error),\n })\n })\n return { deferred: call.deferred === true, promise }\n }\n\n #announceParked(): void {\n if (this.#closed || this.#parked || this.#abort) {\n return\n }\n if (this.#restingOnDeferred()) {\n this.#setStatus('parked')\n }\n }\n\n #restingOnDeferred(): boolean {\n if (this.#pendingToolCalls.size === 0) {\n return false\n }\n for (const call of this.#pendingToolCalls.values()) {\n if (call.deferred !== true) {\n return false\n }\n }\n return true\n }\n\n #applyExecutionResult(executionId: string, result: ToolExecutionResult): void {\n // A parked instance is not the session any more: its rehydrated successor owns the pending\n // call, and applying here would write into a discarded history.\n if (this.#closed || this.#parked) {\n return\n }\n this.#dispatched.delete(executionId)\n if (result.status === 'ok') {\n this.#emit({\n type: 'execution_result',\n executionId,\n output: { type: 'json', value: result.output },\n logs: result.logs,\n })\n this.resolveToolCall(executionId, { type: 'json', value: result.output })\n return\n }\n this.#emit({\n type: 'execution_failed',\n executionId,\n reason: result.reason,\n error: result.error,\n logs: result.logs,\n })\n this.resolveToolCall(executionId, { type: 'text', value: `${result.reason}: ${result.error}` }, { isError: true })\n }\n\n async #runTurn(): Promise<void> {\n if (this.#closed || this.#parked || this.#pendingToolCalls.size > 0) {\n return\n }\n if (this.#messages.at(-1)?.role === 'assistant') {\n return\n }\n this.#setStatus('running')\n const agent = new ToolLoopAgent({\n model: this.#model,\n tools: this.#config.tools ?? {},\n instructions: this.#config.instructions,\n stopWhen: isStepCount(this.#config.maxSteps ?? 20),\n })\n const abort = new AbortController()\n this.#abort = abort\n const accum = (this.#turnAccum ??= {\n startedAt: Date.now(),\n input: 0,\n output: 0,\n cacheWrite: 0,\n cacheRead: 0,\n })\n let blocks: ContentBlock[] = []\n const textBuf = new Map<string, string>()\n const reasoningBuf = new Map<string, string>()\n const flush = (): void => {\n if (blocks.length === 0) {\n return\n }\n this.#emit({\n type: 'assistant_message',\n message: { role: 'assistant', content: blocks, model: this.#modelId() },\n parentToolUseId: null,\n uuid: randomUUID(),\n })\n blocks = []\n }\n try {\n const result = await agent.stream({\n messages: [...this.#messages],\n abortSignal: abort.signal,\n })\n const partials = this.#config.includePartialMessages !== false\n const emitToolResult = (toolCallId: string, content: string, isError?: boolean): void => {\n flush()\n this.#emit({\n type: 'user_message',\n message: {\n role: 'user',\n content: [{ type: 'tool_result', tool_use_id: toolCallId, content, is_error: isError }],\n },\n parentToolUseId: null,\n synthetic: true,\n uuid: randomUUID(),\n })\n }\n let streamError: unknown\n for await (const part of result.fullStream) {\n if (this.#closed) {\n break\n }\n switch (part.type) {\n case 'text-delta': {\n textBuf.set(part.id, (textBuf.get(part.id) ?? '') + part.text)\n if (partials) {\n this.#emit({\n type: 'stream_delta',\n event: { type: 'content_block_delta', delta: { type: 'text_delta', text: part.text } },\n parentToolUseId: null,\n uuid: randomUUID(),\n })\n }\n break\n }\n case 'text-end': {\n const text = textBuf.get(part.id)\n textBuf.delete(part.id)\n if (text) {\n blocks.push({ type: 'text', text })\n }\n break\n }\n case 'reasoning-delta': {\n reasoningBuf.set(part.id, (reasoningBuf.get(part.id) ?? '') + part.text)\n if (partials) {\n this.#emit({\n type: 'stream_delta',\n event: { type: 'content_block_delta', delta: { type: 'thinking_delta', thinking: part.text } },\n parentToolUseId: null,\n uuid: randomUUID(),\n })\n }\n break\n }\n case 'reasoning-end': {\n const thinking = reasoningBuf.get(part.id)\n reasoningBuf.delete(part.id)\n if (thinking) {\n blocks.push({ type: 'thinking', thinking })\n }\n break\n }\n case 'tool-call': {\n blocks.push({\n type: 'tool_use',\n id: part.toolCallId,\n name: part.toolName,\n input: part.input,\n })\n flush()\n break\n }\n case 'tool-result': {\n emitToolResult(part.toolCallId, typeof part.output === 'string' ? part.output : JSON.stringify(part.output))\n break\n }\n case 'tool-error': {\n emitToolResult(part.toolCallId, errorText(part.error), true)\n break\n }\n case 'finish-step': {\n flush()\n break\n }\n case 'error': {\n streamError ??= part.error\n break\n }\n default: {\n break\n }\n }\n }\n flush()\n if (streamError !== undefined) {\n throw streamError\n }\n if (abort.signal.aborted) {\n throw new Error('interrupted')\n }\n const [responseMessages, usage, toolCalls, text] = await Promise.all([\n result.responseMessages,\n result.totalUsage,\n result.toolCalls,\n result.text,\n ])\n if (this.#closed) {\n return\n }\n accum.input += usage.inputTokens ?? 0\n accum.output += usage.outputTokens ?? 0\n accum.cacheWrite += usage.inputTokenDetails?.cacheWriteTokens ?? 0\n accum.cacheRead += usage.inputTokenDetails?.cacheReadTokens ?? 0\n this.#messages.push(...(responseMessages as ModelMessage[]))\n const settled = new Set<string>()\n for (const message of responseMessages as ModelMessage[]) {\n if (message.role !== 'tool' || !Array.isArray(message.content)) {\n continue\n }\n for (const part of message.content) {\n if (part.type === 'tool-result') {\n settled.add(part.toolCallId)\n }\n }\n }\n for (const call of toolCalls) {\n if (settled.has(call.toolCallId)) {\n continue\n }\n this.#pendingToolCalls.set(call.toolCallId, {\n toolCallId: call.toolCallId,\n toolName: call.toolName,\n input: call.input,\n })\n }\n if (this.#pendingToolCalls.size > 0) {\n this.#dispatchPending()\n return\n }\n this.#finishTurn(text)\n } catch (error) {\n if (this.#closed) {\n return\n }\n for (const [, thinking] of reasoningBuf) {\n if (thinking) {\n blocks.push({ type: 'thinking', thinking })\n }\n }\n for (const [, text] of textBuf) {\n if (text) {\n blocks.push({ type: 'text', text })\n }\n }\n flush()\n const message = error instanceof Error ? error.message : String(error)\n this.#numTurns += 1\n this.#emit({\n type: 'turn_result',\n subtype: 'error_during_execution',\n isError: true,\n durationMs: Date.now() - accum.startedAt,\n numTurns: this.#numTurns,\n totalCostUsd: 0,\n errors: [abort.signal.aborted ? 'interrupted' : message],\n usage: turnUsage(accum),\n })\n this.#turnAccum = undefined\n this.#setStatus('idle')\n } finally {\n if (this.#abort === abort) {\n this.#abort = undefined\n }\n }\n }\n\n #finishTurn(text: string): void {\n const accum = this.#turnAccum ?? { startedAt: Date.now(), input: 0, output: 0, cacheWrite: 0, cacheRead: 0 }\n this.#numTurns += 1\n this.#totalUsage.input += accum.input\n this.#totalUsage.output += accum.output\n this.#totalUsage.cacheWrite += accum.cacheWrite\n this.#totalUsage.cacheRead += accum.cacheRead\n this.#emit({\n type: 'turn_result',\n subtype: 'success',\n isError: false,\n durationMs: Date.now() - accum.startedAt,\n numTurns: this.#numTurns,\n totalCostUsd: 0,\n result: text,\n usage: turnUsage(accum),\n })\n this.#turnAccum = undefined\n this.#setStatus('idle')\n }\n\n #modelId(): string | undefined {\n const model = this.#model\n if (typeof model === 'string') {\n return model\n }\n return (model as { modelId?: string }).modelId\n }\n\n async mcpServers(): Promise<McpServerStatusInfo[] | undefined> {\n return (await this.#config.reportMcpServers?.()) ?? []\n }\n\n setTitle(title: string | undefined): void {\n this.#config = withTitle(this.#config, title)\n }\n\n #setStatus(status: SessionStatus, detail?: string): void {\n // Deduped on the (status, detail) pair: deduping on status alone would swallow a new detail\n // for an unchanged status, which is the one update a detail exists to carry.\n if (this.#status === status && this.#statusDetail === detail) {\n return\n }\n if (this.#status === 'closed' || this.#status === 'failed') {\n return\n }\n this.#status = status\n this.#statusDetail = detail\n this.#emit({ type: 'status_changed', status, detail })\n }\n\n #emit(body: SessionEventBody): void {\n this.#subscribers.emit(this.#log.append(body))\n }\n}\n\nfunction turnUsage(accum: { input: number; output: number; cacheWrite: number; cacheRead: number }) {\n return {\n input_tokens: accum.input,\n output_tokens: accum.output,\n cache_creation_input_tokens: accum.cacheWrite,\n cache_read_input_tokens: accum.cacheRead,\n }\n}\n\nfunction textValue(output: ToolCallOutput): string {\n return output.type === 'text' ? output.value : JSON.stringify(output.value)\n}\n\nfunction errorText(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n","import { execFile } from 'node:child_process'\nimport { existsSync } from 'node:fs'\nimport { createRequire } from 'node:module'\n\nexport type ClaudeAuthStatus = 'logged_in' | 'logged_out' | 'unknown'\n\nexport type ClaudeAuthProbe = (env: Record<string, string | undefined>) => Promise<ClaudeAuthStatus>\n\nexport function resolveBundledClaudeExecutable(): string | undefined {\n try {\n // Two hops: the platform package is a dependency of the SDK, not of this one, so under\n // pnpm's strict layout it resolves only from the SDK's own location.\n const fromHere = createRequire(import.meta.url)\n const fromSdk = createRequire(fromHere.resolve('@anthropic-ai/claude-agent-sdk'))\n const suffix = process.platform === 'win32' ? '.exe' : ''\n const platforms =\n process.platform === 'linux' ? [`linux-${process.arch}`, `linux-${process.arch}-musl`] : [`${process.platform}-${process.arch}`]\n for (const platform of platforms) {\n try {\n const path = fromSdk.resolve(`@anthropic-ai/claude-agent-sdk-${platform}/claude${suffix}`)\n if (existsSync(path)) {\n return path\n }\n } catch {}\n }\n } catch {}\n return undefined\n}\n\nexport function checkClaudeAuth(\n env: Record<string, string | undefined>,\n options: { executable?: string; timeoutMs?: number } = {},\n): Promise<ClaudeAuthStatus> {\n const executable = options.executable ?? resolveBundledClaudeExecutable()\n if (!executable) {\n return Promise.resolve('unknown')\n }\n return new Promise((resolve) => {\n execFile(\n executable,\n ['auth', 'status'],\n { env: env as NodeJS.ProcessEnv, timeout: options.timeoutMs ?? 10_000 },\n // The exit code is ignored on purpose: 2.1.217 exits 1 on a logged-out verdict where\n // other versions exit 0, so only the parsed `loggedIn` boolean is a verdict.\n (_error, stdout) => {\n try {\n const parsed = JSON.parse(stdout) as { loggedIn?: unknown }\n if (typeof parsed.loggedIn === 'boolean') {\n resolve(parsed.loggedIn ? 'logged_in' : 'logged_out')\n return\n }\n } catch {}\n resolve('unknown')\n },\n )\n })\n}\n","import { runScript, type SandboxEngine } from '@workerdeck/sandbox'\nimport type { ToolExecutionCall, ToolExecutionDispatch, ToolExecutionResult, ToolExecutor } from './tool-executor.ts'\n\nexport type HostFetch = (url: string, signal: AbortSignal) => Promise<string>\n\nexport type QuickJsExecutorOptions = {\n engine: SandboxEngine\n // Matched host-side: the guest is never told the allowlist and never holds a credential.\n allowedHosts?: string[]\n hostFetch?: HostFetch\n // The guest's interrupt deadline does not cover host-function time, so every granted\n // capability needs its own bound. Default 10000.\n fetchTimeoutMs?: number\n defaultTimeoutMs?: number\n defaultMemoryLimitBytes?: number\n}\n\ntype EvalScriptInput = { script?: unknown }\n\nexport class QuickJsExecutor implements ToolExecutor {\n #options: QuickJsExecutorOptions\n\n constructor(options: QuickJsExecutorOptions) {\n this.#options = options\n }\n\n async dispatch(call: ToolExecutionCall): Promise<ToolExecutionDispatch> {\n return {\n executionId: call.executionId,\n status: 'settled',\n result: await this.#execute(call),\n }\n }\n\n async #execute(call: ToolExecutionCall): Promise<ToolExecutionResult> {\n if (call.tool !== 'eval_script') {\n return {\n status: 'failed',\n reason: 'unsupported_tool',\n error: `tool '${call.tool}' is not executable by the QuickJS backend`,\n }\n }\n const script = (call.input as EvalScriptInput | undefined)?.script\n if (typeof script !== 'string') {\n return {\n status: 'failed',\n reason: 'invalid_input',\n error: 'eval_script requires a string `script` input',\n }\n }\n const result = await runScript(this.#options.engine, {\n script,\n vfs: call.vfs,\n signal: call.signal,\n timeoutMs: call.limits?.timeoutMs ?? this.#options.defaultTimeoutMs ?? 5000,\n memoryLimitBytes: call.limits?.memoryLimitBytes ?? this.#options.defaultMemoryLimitBytes ?? 64 * 1024 * 1024,\n fetchText: this.#allowsNetwork() ? (url) => this.#fetchText(url, call.signal) : undefined,\n })\n const logs = result.logs.map((l) => `[${l.level}] ${l.text}`)\n return result.ok ? { status: 'ok', output: result.value, logs } : { status: 'failed', reason: result.reason, error: result.error, logs }\n }\n\n #allowsNetwork(): boolean {\n return (this.#options.allowedHosts?.length ?? 0) > 0\n }\n\n async #fetchText(url: string, outer: AbortSignal | undefined): Promise<string> {\n if (!isHostAllowed(url, this.#options.allowedHosts ?? [])) {\n throw new Error(`host not allowed: ${safeHost(url) ?? url}`)\n }\n const controller = new AbortController()\n const onOuterAbort = () => controller.abort()\n outer?.addEventListener('abort', onOuterAbort)\n const timer = setTimeout(() => controller.abort(), this.#options.fetchTimeoutMs ?? 10_000)\n try {\n const fetchImpl = this.#options.hostFetch ?? defaultHostFetch\n return await fetchImpl(url, controller.signal)\n } finally {\n clearTimeout(timer)\n outer?.removeEventListener('abort', onOuterAbort)\n }\n }\n}\n\nasync function defaultHostFetch(url: string, signal: AbortSignal): Promise<string> {\n const response = await fetch(url, { signal })\n if (!response.ok) {\n throw new Error(`request failed: ${response.status}`)\n }\n return await response.text()\n}\n\nfunction safeHost(url: string): string | undefined {\n try {\n return new URL(url).hostname\n } catch {\n return undefined\n }\n}\n\nexport function isHostAllowed(url: string, allowedHosts: string[]): boolean {\n let parsed: URL\n try {\n parsed = new URL(url)\n } catch {\n return false\n }\n if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') {\n return false\n }\n const host = parsed.hostname.toLowerCase()\n return allowedHosts.some((entry) => {\n const pattern = entry.trim().toLowerCase()\n if (!pattern) {\n return false\n }\n if (pattern.startsWith('*.')) {\n return host.endsWith(pattern.slice(1))\n }\n return host === pattern\n })\n}\n","export type PendingKind = 'approval' | 'tool_call' | 'execution'\n\nexport type SettledBy = 'client' | 'timeout' | 'policy' | 'server'\n\nexport type PendingOutcome<T> =\n | { ok: true; value: T; settledBy: SettledBy }\n | { ok: false; reason: string; error: string; settledBy: SettledBy }\n\nexport type PendingEntry = {\n id: string\n kind: PendingKind\n createdAt: number\n expiresAt?: number\n meta?: Record<string, unknown>\n}\n\ntype Slot<T> = PendingEntry & {\n resolve: (outcome: PendingOutcome<T>) => void\n timer?: ReturnType<typeof setTimeout>\n}\n\nexport type RegisterOptions<T> = {\n id: string\n kind: PendingKind\n timeoutMs?: number\n meta?: Record<string, unknown>\n onSettle?: (outcome: PendingOutcome<T>, entry: PendingEntry) => void\n}\n\nexport class PendingRequestRegistry {\n #slots = new Map<string, Slot<unknown>>()\n\n get size(): number {\n return this.#slots.size\n }\n\n // The outcome promise never rejects: a timeout or cancellation resolves `ok: false`, so a\n // caller feeds the failure back into the agent loop instead of unwinding it.\n register<T>(options: RegisterOptions<T>): Promise<PendingOutcome<T>> {\n if (this.#slots.has(options.id)) {\n throw new Error(`pending request '${options.id}' is already registered`)\n }\n const entry: PendingEntry = {\n id: options.id,\n kind: options.kind,\n createdAt: Date.now(),\n expiresAt: options.timeoutMs === undefined ? undefined : Date.now() + options.timeoutMs,\n meta: options.meta,\n }\n return new Promise<PendingOutcome<T>>((resolve) => {\n const slot: Slot<T> = {\n ...entry,\n resolve: (outcome) => {\n options.onSettle?.(outcome, entry)\n resolve(outcome)\n },\n }\n if (options.timeoutMs !== undefined) {\n slot.timer = setTimeout(() => {\n this.#settle(options.id, {\n ok: false,\n reason: 'timeout',\n error: `request timed out after ${options.timeoutMs}ms`,\n settledBy: 'timeout',\n })\n }, options.timeoutMs)\n slot.timer.unref?.()\n }\n this.#slots.set(options.id, slot as Slot<unknown>)\n })\n }\n\n settle<T>(id: string, value: T, settledBy: SettledBy = 'client'): boolean {\n return this.#settle(id, { ok: true, value, settledBy })\n }\n\n fail(id: string, reason: string, error: string, settledBy: SettledBy = 'server'): boolean {\n return this.#settle(id, { ok: false, reason, error, settledBy })\n }\n\n has(id: string): boolean {\n return this.#slots.has(id)\n }\n\n get(id: string): PendingEntry | undefined {\n const slot = this.#slots.get(id)\n return slot && toEntry(slot)\n }\n\n list(kind?: PendingKind): PendingEntry[] {\n const entries = [...this.#slots.values()].map(toEntry)\n return kind ? entries.filter((e) => e.kind === kind) : entries\n }\n\n cancelAll(reason: string, error: string, kind?: PendingKind): number {\n let canceled = 0\n // Snapshot first: settling mutates the map being iterated.\n for (const slot of Array.from(this.#slots.values())) {\n if (kind && slot.kind !== kind) {\n continue\n }\n if (this.#settle(slot.id, { ok: false, reason, error, settledBy: 'server' })) {\n canceled += 1\n }\n }\n return canceled\n }\n\n #settle(id: string, outcome: PendingOutcome<unknown>): boolean {\n const slot = this.#slots.get(id)\n if (!slot) {\n return false\n }\n clearTimeout(slot.timer)\n this.#slots.delete(id)\n slot.resolve(outcome)\n return true\n }\n}\n\nfunction toEntry(slot: Slot<unknown>): PendingEntry {\n return {\n id: slot.id,\n kind: slot.kind,\n createdAt: slot.createdAt,\n expiresAt: slot.expiresAt,\n meta: slot.meta,\n }\n}\n","import type { ToolCallRequestFrame, ToolExecutionOutput } from '@workerdeck/protocol'\nimport { PendingRequestRegistry, type PendingOutcome } from '../lib/pending-registry.ts'\nimport type { ToolExecutionCall, ToolExecutionDispatch, ToolExecutionResult, ToolExecutor } from './tool-executor.ts'\n\nexport type BridgeAnswer = { output: ToolExecutionOutput; logs?: string[] } | { reason: string; error: string; logs?: string[] }\n\nexport type BrowserBridgeExecutorOptions = {\n send: (frame: ToolCallRequestFrame) => boolean\n cancel?: (executionId: string, reason: string) => void\n timeoutMs?: number\n onResult?: (executionId: string, result: ToolExecutionResult) => void\n registry?: PendingRequestRegistry\n}\n\nexport class BrowserBridgeExecutor implements ToolExecutor {\n readonly registry: PendingRequestRegistry\n #options: BrowserBridgeExecutorOptions\n // A client answer can beat its own registration; held briefly here or it is dropped.\n #early = new Map<string, BridgeAnswer>()\n\n constructor(options: BrowserBridgeExecutorOptions) {\n this.#options = options\n this.registry = options.registry ?? new PendingRequestRegistry()\n }\n\n async dispatch(call: ToolExecutionCall): Promise<ToolExecutionDispatch> {\n const timeoutMs = call.limits?.timeoutMs ?? this.#options.timeoutMs ?? 60_000\n const expiresAt = Date.now() + timeoutMs\n const frame: ToolCallRequestFrame = {\n type: 'tool_call_request',\n executionId: call.executionId,\n toolName: call.tool,\n input: call.input,\n vfsSeed: call.vfs?.snapshot(),\n limits: call.limits,\n expiresAt,\n }\n\n const settled = this.registry.register<BridgeAnswer>({\n id: call.executionId,\n kind: 'tool_call',\n timeoutMs,\n meta: { toolName: call.tool, sessionId: call.sessionId },\n })\n\n if (!this.#options.send(frame)) {\n this.registry.fail(call.executionId, 'no_client', 'no client is attached to execute this call')\n return {\n executionId: call.executionId,\n status: 'settled',\n result: toExecutionResult(await settled),\n }\n }\n\n const early = this.#early.get(call.executionId)\n if (early) {\n this.#early.delete(call.executionId)\n this.#applyAnswer(call.executionId, early)\n }\n\n // Only fail here: the settle handler owns the cancel, so a non-client failure notifies\n // the client exactly once.\n const onAbort = () => {\n this.registry.fail(call.executionId, 'aborted', 'the turn was interrupted')\n }\n call.signal?.addEventListener('abort', onAbort, { once: true })\n void settled.then((outcome) => {\n call.signal?.removeEventListener('abort', onAbort)\n if (!outcome.ok && outcome.settledBy !== 'client') {\n this.#options.cancel?.(call.executionId, outcome.reason)\n }\n this.#options.onResult?.(call.executionId, toExecutionResult(outcome))\n })\n\n return { executionId: call.executionId, status: 'pending' }\n }\n\n resolve(executionId: string, answer: BridgeAnswer): boolean {\n if (!this.registry.has(executionId)) {\n // Racing a dispatch still in flight; hold it for the drain above.\n this.#early.set(executionId, answer)\n setTimeout(() => this.#early.delete(executionId), 5000).unref?.()\n return false\n }\n return this.#applyAnswer(executionId, answer)\n }\n\n #applyAnswer(executionId: string, answer: BridgeAnswer): boolean {\n return 'output' in answer\n ? this.registry.settle(executionId, answer, 'client')\n : this.registry.fail(executionId, answer.reason, answer.error, 'client')\n }\n}\n\nexport function toExecutionResult(outcome: PendingOutcome<BridgeAnswer>): ToolExecutionResult {\n if (outcome.ok && 'output' in outcome.value) {\n const { output, logs } = outcome.value\n return { status: 'ok', output: output.value, logs }\n }\n if (outcome.ok) {\n const failure = outcome.value as { reason: string; error: string; logs?: string[] }\n return { status: 'failed', reason: failure.reason, error: failure.error, logs: failure.logs }\n }\n return { status: 'failed', reason: outcome.reason, error: outcome.error }\n}\n","import type { ToolExecutionBackend } from '@workerdeck/protocol'\nimport type { ToolExecutionCall, ToolExecutionDispatch, ToolExecutionProfile, ToolExecutor } from './tool-executor.ts'\n\nexport type DeferredDispatch = {\n executionId: string\n sessionId: string\n tool: string\n input: unknown\n vfsSeed?: Record<string, string>\n limits?: { timeoutMs?: number; memoryLimitBytes?: number }\n expiresAt?: number\n}\n\nexport type DeferredExecutorOptions = {\n onDispatch: (call: DeferredDispatch) => void | Promise<void>\n timeoutMs?: number\n backend?: ToolExecutionBackend\n}\n\nexport class DeferredExecutor implements ToolExecutor {\n readonly backend: ToolExecutionBackend\n readonly timeoutMs: number | undefined\n #options: DeferredExecutorOptions\n\n constructor(options: DeferredExecutorOptions) {\n this.#options = options\n this.backend = options.backend ?? 'remote'\n this.timeoutMs = options.timeoutMs\n }\n\n describe(): ToolExecutionProfile {\n return { backend: this.backend, deferred: true, timeoutMs: this.timeoutMs }\n }\n\n async dispatch(call: ToolExecutionCall): Promise<ToolExecutionDispatch> {\n await this.#options.onDispatch({\n executionId: call.executionId,\n sessionId: call.sessionId,\n tool: call.tool,\n input: call.input,\n vfsSeed: call.vfs?.snapshot(),\n limits: call.limits,\n expiresAt: this.timeoutMs === undefined ? undefined : Date.now() + this.timeoutMs,\n })\n return { executionId: call.executionId, status: 'pending' }\n }\n}\n","import { tool, type Tool, type ToolSet } from 'ai'\nimport { z } from 'zod'\nimport { createVfs, type SandboxVfs } from '@workerdeck/sandbox'\nimport type { ToolExecutionResult, ToolExecutor } from '../../executors/tool-executor.ts'\nimport type { WebFetchFn } from './web-fetch.ts'\n\nexport type ToolTrust = 'sandboxed' | 'authoritative'\n\nexport type ToolDefinition = {\n name: string\n trust: ToolTrust\n tool: Tool\n}\n\nexport type ToolContextOptions = {\n executor: ToolExecutor\n sessionId: string\n vfs?: SandboxVfs\n search?: (query: string, limit: number) => Promise<Array<{ title: string; url: string; snippet?: string }>>\n download?: (url: string) => Promise<{ contentType?: string; text: string }>\n webFetch?: WebFetchFn\n onFileDelivered?: (file: { path: string; bytes: number; description?: string }) => void\n limits?: { timeoutMs?: number; memoryLimitBytes?: number }\n onDispatch?: (executionId: string, toolName: string) => void\n onSettle?: (executionId: string, result: ToolExecutionResult) => void\n}\n\nexport type ToolContext = {\n vfs: SandboxVfs\n tools: ToolSet\n definitions: ToolDefinition[]\n sandboxedToolNames: string[]\n}\n\nconst MAX_FILE_BYTES = 1024 * 1024\n\nexport function createToolContext(options: ToolContextOptions): ToolContext {\n const vfs = options.vfs ?? createVfs()\n const definitions: ToolDefinition[] = []\n\n definitions.push({\n name: 'fs_list',\n trust: 'authoritative',\n tool: tool({\n description: 'List files in the scratch filesystem.',\n inputSchema: z.object({ dir: z.string().default('/').describe('Directory to list') }),\n execute: async ({ dir }) => ({ files: vfs.list(dir) }),\n }),\n })\n definitions.push({\n name: 'fs_read',\n trust: 'authoritative',\n tool: tool({\n description: 'Read a file from the scratch filesystem.',\n inputSchema: z.object({ path: z.string() }),\n execute: async ({ path }) => {\n const content = vfs.read(path)\n if (content === undefined) {\n return { error: `no such file: ${path}` }\n }\n return { content: truncate(content) }\n },\n }),\n })\n definitions.push({\n name: 'fs_write',\n trust: 'authoritative',\n tool: tool({\n description: 'Write a file to the scratch filesystem.',\n inputSchema: z.object({ path: z.string(), content: z.string() }),\n execute: async ({ path, content }) => {\n vfs.write(path, content)\n return { path, bytes: content.length }\n },\n }),\n })\n\n if (options.onFileDelivered) {\n const onFileDelivered = options.onFileDelivered\n definitions.push({\n name: 'deliver_file',\n trust: 'authoritative',\n tool: tool({\n description:\n 'Hand a file from the scratch filesystem over to the user as a deliverable. Write it with fs_write first, then deliver it.',\n inputSchema: z.object({\n path: z.string().describe('Path of an existing file in the scratch filesystem'),\n description: z.string().optional().describe('What this file is, for the recipient'),\n }),\n execute: async ({ path, description }) => {\n const content = vfs.read(path)\n if (content === undefined) {\n return { error: `no such file: ${path}` }\n }\n const file = { path, bytes: content.length, description }\n onFileDelivered(file)\n return { delivered: true, ...file }\n },\n }),\n })\n }\n\n if (options.search) {\n const search = options.search\n definitions.push({\n name: 'web_search',\n trust: 'authoritative',\n tool: tool({\n description: 'Search the web for pages relevant to a query.',\n inputSchema: z.object({\n query: z.string(),\n limit: z.number().int().min(1).max(25).default(5),\n }),\n execute: async ({ query, limit }) => ({ results: await search(query, limit) }),\n }),\n })\n }\n if (options.download) {\n const download = options.download\n definitions.push({\n name: 'download',\n trust: 'authoritative',\n tool: tool({\n description: 'Fetch a URL and store its text in the scratch filesystem for later evaluation.',\n inputSchema: z.object({\n url: z.string().describe('Absolute http(s) URL'),\n path: z.string().describe('Where to store it in the scratch filesystem'),\n }),\n execute: async ({ url, path }) => {\n try {\n const { text, contentType } = await download(url)\n const stored = truncate(text)\n vfs.write(path, stored)\n return { path, bytes: stored.length, contentType }\n } catch (error) {\n // A failed fetch is data the agent can react to, not a turn-ending throw.\n return { error: error instanceof Error ? error.message : String(error) }\n }\n },\n }),\n })\n }\n\n if (options.webFetch) {\n const webFetch = options.webFetch\n definitions.push({\n name: 'web_fetch',\n trust: 'authoritative',\n tool: tool({\n description:\n 'Fetch a web page and process its content against a prompt. Returns the answer ' +\n '(or the page as markdown). Distinct from download: use web_fetch to answer a ' +\n 'question about a page, download to store raw text for eval_script.',\n inputSchema: z.object({\n url: z.string().describe('Absolute http(s) URL'),\n prompt: z.string().describe('What to extract or answer from the page'),\n }),\n execute: async ({ url, prompt }) => {\n try {\n return await webFetch(url, prompt)\n } catch (error) {\n // A failed fetch is data the agent can react to, not a turn-ending throw.\n return { error: error instanceof Error ? error.message : String(error) }\n }\n },\n }),\n })\n }\n\n definitions.push({\n name: 'eval_script',\n trust: 'sandboxed',\n tool: tool({\n description:\n 'Evaluate a JavaScript snippet in a sandbox to parse, score, or extract from files. ' +\n 'Globals: vfs.read(path), vfs.write(path, text), vfs.list(dir), console.log. ' +\n 'The value of the last expression is returned. No network or host access.',\n inputSchema: z.object({ script: z.string() }),\n }),\n })\n\n const tools: ToolSet = {}\n for (const definition of definitions) {\n tools[definition.name] = definition.tool\n }\n\n return {\n vfs,\n tools,\n definitions,\n sandboxedToolNames: definitions.filter((d) => d.trust === 'sandboxed').map((d) => d.name),\n }\n}\n\nexport function withMcpTools(context: ToolContext, mcpTools: ToolSet): ToolContext {\n return withHostTools(\n context,\n Object.fromEntries(Object.entries(mcpTools).map(([name, mcpTool]) => [name, { tool: mcpTool, trust: 'authoritative' as const }])),\n 'MCP tool',\n )\n}\n\nexport type HostToolDefinition = {\n tool: Tool\n trust: ToolTrust\n}\n\nexport function withHostTools(context: ToolContext, hostTools: Record<string, HostToolDefinition>, kind = 'host tool'): ToolContext {\n const entries = Object.entries(hostTools)\n if (entries.length === 0) {\n return context\n }\n const definitions = [...context.definitions]\n const tools: ToolSet = { ...context.tools }\n const sandboxedToolNames = [...context.sandboxedToolNames]\n for (const [name, { tool: hostTool, trust }] of entries) {\n if (name in tools) {\n // A collision would let a host tool shadow `eval_script`, or an MCP name promote untrusted\n // execution to authoritative.\n throw new Error(`${kind} '${name}' collides with an existing tool of the same name`)\n }\n const executes = typeof (hostTool as { execute?: unknown }).execute === 'function'\n if (trust === 'sandboxed' && executes) {\n throw new Error(\n `${kind} '${name}' is declared sandboxed but has an \\`execute\\` — it would run in ` +\n 'this process with full authority. Drop `execute` so it rides the ToolExecutor seam.',\n )\n }\n if (trust === 'authoritative' && !executes) {\n throw new Error(\n `${kind} '${name}' is declared authoritative but has no \\`execute\\` — nothing would ` +\n 'ever answer its calls and the turn would stall.',\n )\n }\n definitions.push({ name, trust, tool: hostTool })\n tools[name] = hostTool\n if (trust === 'sandboxed') {\n sandboxedToolNames.push(name)\n }\n }\n return { ...context, tools, definitions, sandboxedToolNames }\n}\n\nfunction truncate(text: string): string {\n return text.length > MAX_FILE_BYTES ? text.slice(0, MAX_FILE_BYTES) : text\n}\n","import { lookup } from 'node:dns/promises'\n\nexport type WebFetchResult = {\n url: string\n digest?: string\n markdown?: string\n truncated?: boolean\n notice?: string\n redirectUrl?: string\n error?: string\n}\n\nexport type WebFetchFn = (url: string, prompt: string) => Promise<WebFetchResult>\n\nexport type WebFetchDigest = (markdown: string, prompt: string) => Promise<string>\n\nexport type WebFetchOptions = {\n fetchImpl?: typeof fetch\n maxContentBytes?: number\n maxMarkdownBytes?: number\n cacheTtlMs?: number\n allowedHosts?: string[]\n timeoutMs?: number\n digest?: WebFetchDigest\n}\n\nconst MAX_CACHE_ENTRIES = 64\nconst MAX_REDIRECTS = 5\n\ntype CacheEntry = { expiresAt: number; page: WebFetchResult }\n\nexport function createWebFetch(options: WebFetchOptions = {}): WebFetchFn {\n const fetchImpl = options.fetchImpl ?? fetch\n const maxContentBytes = options.maxContentBytes ?? 1024 * 1024\n const maxMarkdownBytes = options.maxMarkdownBytes ?? 50 * 1024\n const cacheTtlMs = options.cacheTtlMs ?? 15 * 60 * 1000\n const cache = new Map<string, CacheEntry>()\n\n const fetchPage = async (rawUrl: string): Promise<WebFetchResult> => {\n const cached = cache.get(rawUrl)\n if (cached && cached.expiresAt > Date.now()) {\n return cached.page\n }\n\n let url = parseUrl(rawUrl)\n if (!url) {\n return { url: rawUrl, error: 'only absolute http(s) URLs are supported' }\n }\n\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), options.timeoutMs ?? 30_000)\n try {\n let response: Response\n for (let hop = 0; ; hop++) {\n const denied = await denyReason(url, options.allowedHosts)\n if (denied) {\n return { url: url.href, error: denied }\n }\n response = await fetchImpl(url.href, {\n redirect: 'manual',\n signal: controller.signal,\n })\n if (response.status < 300 || response.status >= 400) {\n break\n }\n const location = response.headers.get('location')\n if (!location) {\n return { url: url.href, error: `redirect (${response.status}) without a location` }\n }\n const target = parseUrl(new URL(location, url).href)\n if (!target) {\n return { url: url.href, error: `redirect to unsupported URL: ${location}` }\n }\n if (target.host !== url.host) {\n return {\n url: url.href,\n redirectUrl: target.href,\n notice: `redirected to a different host (${target.host}); not followed automatically`,\n }\n }\n if (hop >= MAX_REDIRECTS) {\n return { url: url.href, error: 'too many redirects' }\n }\n url = target\n }\n if (!response.ok) {\n return { url: url.href, error: `request failed: ${response.status}` }\n }\n const declared = Number(response.headers.get('content-length') ?? '')\n if (declared > maxContentBytes) {\n return { url: url.href, error: `response too large (${declared} bytes)` }\n }\n const body = await readCapped(response, maxContentBytes)\n if (body === undefined) {\n return { url: url.href, error: `response too large (> ${maxContentBytes} bytes)` }\n }\n const contentType = response.headers.get('content-type') ?? ''\n const text = contentType.includes('html') || looksLikeHtml(body) ? htmlToMarkdown(body) : body\n const truncated = text.length > maxMarkdownBytes\n const page: WebFetchResult = {\n url: url.href,\n markdown: truncated ? text.slice(0, maxMarkdownBytes) : text,\n truncated: truncated || undefined,\n }\n if (cache.size >= MAX_CACHE_ENTRIES) {\n const oldest = cache.keys().next().value\n if (oldest !== undefined) {\n cache.delete(oldest)\n }\n }\n cache.set(rawUrl, { expiresAt: Date.now() + cacheTtlMs, page })\n return page\n } catch (error) {\n const message = controller.signal.aborted ? 'request timed out' : error instanceof Error ? error.message : String(error)\n return { url: url.href, error: message }\n } finally {\n clearTimeout(timer)\n }\n }\n\n return async (rawUrl, prompt) => {\n const page = await fetchPage(rawUrl)\n if (page.error || page.notice || !options.digest || page.markdown === undefined) {\n return page\n }\n try {\n const digest = await options.digest(page.markdown, prompt)\n return { url: page.url, digest, truncated: page.truncated }\n } catch {\n // Digest is best-effort sugar over the fetch: fall back to the markdown.\n return page\n }\n }\n}\n\nfunction parseUrl(raw: string): URL | undefined {\n try {\n const url = new URL(raw)\n return url.protocol === 'https:' || url.protocol === 'http:' ? url : undefined\n } catch {\n return undefined\n }\n}\n\n// Resolution happens here and again inside fetch — a DNS-rebinding TOCTOU this tier accepts;\n// operators who need pinning supply `fetchImpl` with a pinned agent.\nasync function denyReason(url: URL, allowedHosts: string[] | undefined): Promise<string | null> {\n const host = url.hostname.toLowerCase()\n if (allowedHosts && allowedHosts.length > 0 && !hostMatches(host, allowedHosts)) {\n return `host not allowed: ${host}`\n }\n if (host === 'localhost' || host.endsWith('.localhost')) {\n return `host not allowed: ${host}`\n }\n const literal = host.replace(/^\\[|\\]$/g, '')\n if (isPrivateAddress(literal)) {\n return `address not allowed: ${literal}`\n }\n if (/^[\\d.]+$/.test(literal) || literal.includes(':')) {\n return null\n } // public literal IP\n let addresses: Array<{ address: string }>\n try {\n addresses = await lookup(literal, { all: true })\n } catch {\n return `cannot resolve host: ${host}`\n }\n for (const { address } of addresses) {\n if (isPrivateAddress(address)) {\n return `host resolves to a private address: ${host}`\n }\n }\n return null\n}\n\nfunction hostMatches(host: string, allowedHosts: string[]): boolean {\n return allowedHosts.some((entry) => {\n const pattern = entry.trim().toLowerCase()\n if (!pattern) {\n return false\n }\n if (pattern.startsWith('*.')) {\n return host.endsWith(pattern.slice(1))\n }\n return host === pattern\n })\n}\n\nexport function isPrivateAddress(address: string): boolean {\n const ip = address.toLowerCase()\n if (ip.includes(':')) {\n if (ip === '::' || ip === '::1') {\n return true\n }\n const mapped = /^::ffff:(\\d+\\.\\d+\\.\\d+\\.\\d+)$/.exec(ip)\n if (mapped) {\n return isPrivateAddress(mapped[1]!)\n }\n return ip.startsWith('fc') || ip.startsWith('fd') || /^fe[89ab]/.test(ip)\n }\n const parts = ip.split('.').map(Number)\n if (parts.length !== 4 || parts.some((n) => Number.isNaN(n) || n < 0 || n > 255)) {\n return false\n }\n const [a, b] = parts as [number, number, number, number]\n if (a === 0 || a === 10 || a === 127) {\n return true\n }\n if (a === 100 && b! >= 64 && b! <= 127) {\n return true\n } // CGNAT\n if (a === 169 && b === 254) {\n return true\n }\n if (a === 172 && b! >= 16 && b! <= 31) {\n return true\n }\n if (a === 192 && b === 168) {\n return true\n }\n return a >= 224 // multicast + reserved\n}\n\nasync function readCapped(response: Response, maxBytes: number): Promise<string | undefined> {\n if (!response.body) {\n const text = await response.text()\n return text.length > maxBytes ? undefined : text\n }\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n let out = ''\n for (;;) {\n const { done, value } = await reader.read()\n if (done) {\n break\n }\n out += decoder.decode(value, { stream: true })\n if (out.length > maxBytes) {\n await reader.cancel().catch(() => {})\n return undefined\n }\n }\n return out + decoder.decode()\n}\n\nfunction looksLikeHtml(body: string): boolean {\n return /<(!doctype|html|head|body)[\\s>]/i.test(body.slice(0, 1024))\n}\n\nexport function htmlToMarkdown(html: string): string {\n let text = html\n .replace(/<!--[\\s\\S]*?-->/g, '')\n .replace(/<(script|style|noscript|svg|template|iframe)\\b[\\s\\S]*?<\\/\\1>/gi, '')\n .replace(/<(head)\\b[\\s\\S]*?<\\/\\1>/gi, '')\n text = text\n .replace(/<h([1-6])[^>]*>([\\s\\S]*?)<\\/h\\1>/gi, (_, level: string, body: string) => {\n return `\\n\\n${'#'.repeat(Number(level))} ${stripTags(body).trim()}\\n\\n`\n })\n .replace(/<pre[^>]*>([\\s\\S]*?)<\\/pre>/gi, (_, body: string) => {\n return `\\n\\n\\`\\`\\`\\n${decodeEntities(body.replace(/<[^>]+>/g, ''))}\\n\\`\\`\\`\\n\\n`\n })\n .replace(/<a\\s[^>]*href=[\"']([^\"']+)[\"'][^>]*>([\\s\\S]*?)<\\/a>/gi, (_, href: string, body: string) => {\n const label = stripTags(body).trim()\n if (!label || href.startsWith('#') || href.startsWith('javascript:')) {\n return label\n }\n return label === href ? label : `[${label}](${href})`\n })\n .replace(/<li[^>]*>/gi, '\\n- ')\n .replace(/<\\/(p|div|section|article|tr|table|ul|ol|blockquote|figure)>/gi, '\\n\\n')\n .replace(/<(br|hr)\\s*\\/?>/gi, '\\n')\n .replace(/<(strong|b)>([\\s\\S]*?)<\\/\\1>/gi, '**$2**')\n .replace(/<(em|i)>([\\s\\S]*?)<\\/\\1>/gi, '*$2*')\n .replace(/<code[^>]*>([\\s\\S]*?)<\\/code>/gi, '`$1`')\n text = decodeEntities(text.replace(/<[^>]+>/g, ''))\n return text\n .replace(/[ \\t]+\\n/g, '\\n')\n .replace(/\\n{3,}/g, '\\n\\n')\n .replace(/[ \\t]{2,}/g, ' ')\n .trim()\n}\n\nfunction stripTags(html: string): string {\n return decodeEntities(html.replace(/<[^>]+>/g, ''))\n}\n\nfunction decodeEntities(text: string): string {\n return text\n .replace(/&#(\\d+);/g, (_, code: string) => String.fromCodePoint(Number(code)))\n .replace(/&#x([\\da-f]+);/gi, (_, code: string) => String.fromCodePoint(parseInt(code, 16)))\n .replace(/ /g, ' ')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/"/g, '\"')\n .replace(/'|'/g, \"'\")\n .replace(/&/g, '&')\n}\n","import type { LanguageModel, ToolSet } from 'ai'\nimport type { McpServerConfigWire, McpServerStatusInfo, McpServerToolInfo, ProfileInfo, SessionCapability } from '@workerdeck/protocol'\nimport { createVfs } from '@workerdeck/sandbox'\nimport { AiSdkRunner, type AiSdkRunnerConfig } from './runner.ts'\nimport { createToolContext, withHostTools, withMcpTools, type HostToolDefinition, type ToolContextOptions } from './tools.ts'\nimport type { ToolExecutionCall, ToolExecutionProfile, ToolExecutor } from '../../executors/tool-executor.ts'\nimport { createWebFetch, type WebFetchFn, type WebFetchOptions } from './web-fetch.ts'\n\nexport type EngineSessionOptions = {\n config: AiSdkRunnerConfig\n profile?: ProfileInfo\n resolveModel: (profile: ProfileInfo | undefined, config: AiSdkRunnerConfig) => LanguageModel\n selectExecutor: (() => ToolExecutor) | ((call: ToolExecutionCall) => ToolExecutor)\n backend?: 'server' | 'browser' | 'managed' | 'remote' | ((call: ToolExecutionCall) => 'server' | 'browser' | 'managed' | 'remote')\n capabilities?: {\n search?: ToolContextOptions['search']\n download?: ToolContextOptions['download']\n webFetch?: WebFetchFn | (Omit<WebFetchOptions, 'digest'> & { digest?: WebFetchOptions['digest'] | false })\n deliverFiles?: boolean\n }\n mcp?: McpConnection\n mcpTools?: ToolSet\n tools?: Record<string, HostToolDefinition>\n instructions?: string\n executionLimits?: { timeoutMs?: number; memoryLimitBytes?: number }\n shouldApprove?: (call: { toolName: string; input: unknown }) => boolean\n approvalTimeoutMs?: number\n seedVfs?: Record<string, string>\n id?: string\n}\n\nconst CAPABILITY_TOOLS = {\n search: 'web_search',\n download: 'download',\n webFetch: 'web_fetch',\n deliverFiles: 'deliver_file',\n} as const satisfies Record<string, SessionCapability>\n\nexport function createEngineSession(options: EngineSessionOptions): AiSdkRunner {\n const vfs = options.config.vfs ?? createVfs(options.config.restore ? options.config.restore.vfs : options.seedVfs)\n // The selector's arity picks the form: 0-arg selects once, 1-arg routes per call.\n const isPerCall = options.selectExecutor.length > 0\n const executor: ToolExecutor = isPerCall\n ? {\n describe(call: ToolExecutionCall): ToolExecutionProfile {\n const target = (options.selectExecutor as (call: ToolExecutionCall) => ToolExecutor)(call)\n const backend = typeof options.backend === 'function' ? options.backend(call) : options.backend\n return { ...target.describe?.(call), ...(backend ? { backend } : {}) }\n },\n dispatch(call: ToolExecutionCall) {\n const target = (options.selectExecutor as (call: ToolExecutionCall) => ToolExecutor)(call)\n return target.dispatch(call)\n },\n }\n : (options.selectExecutor as () => ToolExecutor)()\n // The request value wins only because the gateway already 400s a request that widens the\n // profile's grants; a host calling this directly owes that check itself.\n const granted = options.config.capabilities ?? options.profile?.session?.capabilities\n const isGranted = (key: keyof typeof CAPABILITY_TOOLS): boolean => granted === undefined || granted.includes(CAPABILITY_TOOLS[key])\n // The runner does not exist yet while the tools are built; the capabilities below reach back\n // into it lazily, and only ever run mid-turn.\n let runner: AiSdkRunner | undefined\n const webFetchCap = isGranted('webFetch') ? options.capabilities?.webFetch : undefined\n const webFetch =\n typeof webFetchCap === 'function'\n ? webFetchCap\n : webFetchCap\n ? createWebFetch({\n ...webFetchCap,\n digest:\n webFetchCap.digest === false\n ? undefined\n : (webFetchCap.digest ??\n ((markdown, prompt) =>\n runner!.generateDigest(\n 'Answer the request below using ONLY this web page content.\\n\\n' +\n `<page>\\n${markdown}\\n</page>\\n\\nRequest: ${prompt}`,\n ))),\n })\n : undefined\n const base = createToolContext({\n executor,\n sessionId: 'pending',\n vfs,\n search: isGranted('search') ? options.capabilities?.search : undefined,\n download: isGranted('download') ? options.capabilities?.download : undefined,\n webFetch,\n onFileDelivered:\n options.capabilities?.deliverFiles === false || !isGranted('deliverFiles') ? undefined : (file) => runner?.emitFileDelivered(file),\n })\n const declaredServers = options.profile?.session?.mcpServers\n const connected = options.mcp?.tools ?? options.mcpTools\n requireDeclaredServers(options.profile?.name ?? '(unnamed)', declaredServers, options.mcp, connected)\n const mcpTools = selectMcpTools(connected, declaredServers)\n const withMcp = mcpTools ? withMcpTools(base, mcpTools) : base\n const context = options.tools ? withHostTools(withMcp, options.tools) : withMcp\n\n runner = new AiSdkRunner(\n {\n ...options.config,\n languageModel: options.resolveModel(options.profile, options.config),\n instructions: options.profile?.session?.instructions ?? options.instructions ?? options.config.instructions,\n tools: context.tools,\n vfs,\n executor,\n executableTools: context.sandboxedToolNames,\n executionBackend: typeof options.backend === 'function' ? undefined : (options.backend ?? 'server'),\n executionLimits: options.executionLimits,\n shouldApprove: options.shouldApprove,\n approvalTimeoutMs: options.approvalTimeoutMs,\n reportMcpServers: options.mcp\n ? () =>\n Promise.resolve(\n declaredServers === undefined ? options.mcp!.servers : options.mcp!.servers.filter((s) => declaredServers.includes(s.name)),\n )\n : undefined,\n },\n options.id,\n )\n return runner\n}\n\nfunction requireDeclaredServers(\n profileName: string,\n declared: string[] | undefined,\n mcp: McpConnection | undefined,\n tools: ToolSet | undefined,\n): void {\n if (!declared || declared.length === 0) {\n return\n }\n const missing = declared.filter((name) => {\n if (mcp) {\n const server = mcp.servers.find((s) => s.name === name)\n return !server || server.status !== 'connected'\n }\n return !Object.keys(tools ?? {}).some((tool) => tool.split('__')[0] === name)\n })\n if (missing.length === 0) {\n return\n }\n const reasons = missing\n .map((name) => {\n const error = mcp?.servers.find((s) => s.name === name)?.error\n return error ? `${name} (${error})` : name\n })\n .join(', ')\n throw new Error(\n `profile '${profileName}' declares MCP server(s) that are not connected: ${reasons}. ` +\n 'A session missing a declared server is a session whose agent silently cannot do its job.',\n )\n}\n\nfunction selectMcpTools(tools: ToolSet | undefined, servers: string[] | undefined): ToolSet | undefined {\n if (!tools || servers === undefined) {\n return tools\n }\n const allowed = new Set(servers)\n return Object.fromEntries(Object.entries(tools).filter(([name]) => allowed.has(name.split('__')[0]!)))\n}\n\nexport type McpConnection = {\n tools: ToolSet\n servers: McpServerStatusInfo[]\n close: () => Promise<void>\n}\n\nexport async function connectMcpTools(\n servers: Record<string, McpServerConfigWire>,\n options: {\n // May fire more than once per server: a transport failure surfaces through the client's\n // uncaught-error channel as well as the connect failure.\n onError?: (name: string, error: unknown) => void\n required?: boolean\n } = {},\n): Promise<McpConnection> {\n const entries = Object.entries(servers)\n if (entries.length === 0) {\n return { tools: {}, servers: [], close: async () => {} }\n }\n\n const { createMCPClient } = await import('@ai-sdk/mcp')\n const clients: Array<{ close: () => Promise<void> }> = []\n const tools: ToolSet = {}\n const statuses: McpServerStatusInfo[] = []\n const closeAll = async (): Promise<void> => {\n await Promise.allSettled(clients.map((c) => c.close()))\n }\n\n for (const [name, server] of entries) {\n const identity = describeServer(server)\n try {\n const client = await createMCPClient({\n transport: toTransport(server),\n onUncaughtError: (error) => options.onError?.(name, error),\n })\n clients.push(client as unknown as { close: () => Promise<void> })\n const connected = await client.tools()\n for (const [toolName, mcpTool] of Object.entries(connected)) {\n tools[`${name}__${toolName}`] = mcpTool as ToolSet[string]\n }\n statuses.push({\n name,\n status: 'connected',\n ...identity,\n // Unnamespaced: this is the server's own view of itself, and `<server>__` is routing.\n tools: Object.entries(connected).map(([toolName, mcpTool]) => toToolInfo(toolName, mcpTool)),\n })\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n statuses.push({ name, status: 'failed', error: message, ...identity })\n options.onError?.(name, error)\n if (options.required) {\n await closeAll()\n throw new Error(`MCP server '${name}' failed to connect: ${message}`, { cause: error })\n }\n }\n }\n\n return { tools, servers: statuses, close: closeAll }\n}\n\n// Identity minus secrets: `headers` must never travel.\nfunction describeServer(server: McpServerConfigWire): Pick<McpServerStatusInfo, 'transport' | 'url' | 'command' | 'args'> {\n if ('url' in server) {\n return { transport: server.type === 'sse' ? 'sse' : 'http', url: server.url }\n }\n return { transport: 'stdio', command: server.command, args: server.args }\n}\n\n// A zod `inputSchema` carries no JSON Schema document; only a `jsonSchema()` wrapper does, so\n// that is the only case parameters are reported.\nfunction toToolInfo(name: string, mcpTool: unknown): McpServerToolInfo {\n const { description, inputSchema } = (mcpTool ?? {}) as {\n description?: unknown\n inputSchema?: { jsonSchema?: unknown }\n }\n return {\n name,\n description: typeof description === 'string' ? description : undefined,\n inputSchema: inputSchema?.jsonSchema,\n }\n}\n\nfunction toTransport(server: McpServerConfigWire) {\n if (!('url' in server)) {\n throw new Error(\n 'stdio MCP servers are not supported by the model-agnostic engine (use an http or sse ' +\n 'server, or run this session under a Claude profile)',\n )\n }\n return server.type === 'sse'\n ? { type: 'sse' as const, url: server.url, headers: server.headers }\n : { type: 'http' as const, url: server.url, headers: server.headers }\n}\n","import type { ModelCatalog } from '../adapter.ts'\n\nexport const CLAUDE_CATALOG: ModelCatalog = {\n provenance:\n 'supportedModels() of @anthropic-ai/claude-agent-sdk 0.3.221 (Claude Code CLI), ' +\n 'extracted 2026-08-05; older-model rows hand-maintained',\n models: [\n {\n value: 'claude-fable-5[1m]',\n resolvedModel: 'claude-fable-5',\n displayName: 'Fable 5',\n description: 'Fable 5 · Most capable for your hardest and longest-running tasks',\n primary: true,\n reasoningEfforts: ['low', 'medium', 'high', 'xhigh', 'max'],\n },\n {\n value: 'opus[1m]',\n resolvedModel: 'claude-opus-5[1m]',\n displayName: 'Opus 5',\n description: 'Opus 5 with 1M context · Best for everyday, complex tasks',\n primary: true,\n reasoningEfforts: ['low', 'medium', 'high', 'xhigh', 'max'],\n },\n {\n value: 'claude-opus-4-8',\n resolvedModel: 'claude-opus-4-8',\n displayName: 'Opus 4.8',\n description: 'Opus 4.8 · Previous Opus generation',\n },\n {\n value: 'sonnet',\n resolvedModel: 'claude-sonnet-5',\n displayName: 'Sonnet 5',\n description: 'Sonnet 5 · Efficient for routine tasks',\n primary: true,\n reasoningEfforts: ['low', 'medium', 'high', 'xhigh', 'max'],\n },\n {\n value: 'claude-sonnet-4-6',\n resolvedModel: 'claude-sonnet-4-6',\n displayName: 'Sonnet 4.6',\n description: 'Sonnet 4.6 · Previous Sonnet generation',\n },\n {\n value: 'haiku',\n resolvedModel: 'claude-haiku-4-5-20251001',\n displayName: 'Haiku 4.5',\n description: 'Haiku 4.5 · Fastest for quick answers',\n primary: true,\n // Explicitly none, not absent: an absent field means \"the engine's default set\".\n reasoningEfforts: [],\n },\n ],\n}\n","import { listSessions as sdkListSessions } from '@anthropic-ai/claude-agent-sdk'\nimport { ENGINE_CAPABILITIES } from '@workerdeck/protocol'\nimport { checkClaudeAuth } from './auth.ts'\nimport { SessionRunner } from './runner.ts'\nimport type { EngineAdapter } from '../adapter.ts'\nimport { CLAUDE_CATALOG } from './catalog.ts'\n\nexport const claudeAdapter: EngineAdapter = {\n engine: 'claude',\n capabilities: ENGINE_CAPABILITIES.claude,\n catalog: CLAUDE_CATALOG,\n async checkAvailability(profile, env) {\n const status = await checkClaudeAuth(env)\n if (status === 'logged_in') {\n return { available: true }\n }\n if (status === 'logged_out') {\n return {\n available: false,\n reason:\n `no usable Claude credentials for this profile's environment — log in under its ` +\n `config dir (CLAUDE_CONFIG_DIR=${profile.configDir ?? '~/.claude'} claude auth login) ` +\n 'or set ANTHROPIC_API_KEY',\n }\n }\n return { available: 'unknown' }\n },\n createRunner({ config, restore, id }) {\n if (restore) {\n throw new Error('the Claude engine cannot rebuild a parked session')\n }\n return new SessionRunner(config, id)\n },\n async listSessions({ dir, limit, offset }) {\n const sessions = await sdkListSessions({ dir, limit, offset })\n return sessions.map((s) => ({\n sessionId: s.sessionId,\n summary: s.summary,\n lastModified: s.lastModified,\n createdAt: s.createdAt,\n customTitle: s.customTitle,\n firstPrompt: s.firstPrompt,\n gitBranch: s.gitBranch,\n cwd: s.cwd,\n }))\n },\n}\n","import { PROTOCOL_VERSION } from '@workerdeck/protocol'\n\n/**\n * The operator's environment reaches the child whole — WorkerDeck resolves no credential of its\n * own — and the profile's CODEX_HOME is the one key it pins, last, so a profile always wins over\n * an inherited value. Every path that spawns or connects to an app-server goes through here.\n */\nexport function codexChildEnv(base: Record<string, string | undefined>, codexHome?: string): Record<string, string> {\n const env: Record<string, string> = {}\n for (const [key, value] of Object.entries(base)) {\n if (value !== undefined) {\n env[key] = value\n }\n }\n if (codexHome) {\n env.CODEX_HOME = codexHome\n }\n return env\n}\n\n/** `experimentalApi` gates the granular approval policy and there is no non-experimental fallback, so it is not per-call-site. */\nexport const INITIALIZE_PARAMS = {\n clientInfo: {\n name: 'workerdeck',\n title: 'WorkerDeck',\n version: `protocol-${PROTOCOL_VERSION}`,\n },\n capabilities: { experimentalApi: true },\n} as const\n","import { appendFileSync } from 'node:fs'\nimport type { Readable, Writable } from 'node:stream'\n\nexport const CODEX_TRACE_ENV = 'WORKERDECK_CODEX_TRACE'\n\nexport class JsonRpcError extends Error {\n readonly code: number\n constructor(code: number, message: string) {\n super(message)\n this.name = 'JsonRpcError'\n this.code = code\n }\n}\n\ntype Pending = {\n method: string\n resolve: (result: unknown) => void\n reject: (error: Error) => void\n}\n\nexport class JsonRpcStdioConnection {\n #output: Writable\n #nextId = 1\n #pending = new Map<number, Pending>()\n #buffer = ''\n #closed = false\n #notificationHandler: ((method: string, params: unknown) => void) | undefined\n #trace: string | undefined\n #requestHandler: ((method: string, params: unknown, id: string | number) => Promise<unknown>) | undefined\n\n constructor(options: { input: Readable; output: Writable }) {\n this.#output = options.output\n this.#trace = process.env[CODEX_TRACE_ENV] || undefined\n options.input.on('data', (chunk: Buffer | string) => this.#feed(String(chunk)))\n // Stream errors surface via the process wrapper's exit handling; this only prevents an unhandled crash between the two.\n options.input.on('error', () => {})\n options.output.on('error', () => {})\n }\n\n request(method: string, params?: unknown): Promise<unknown> {\n if (this.#closed) {\n return Promise.reject(new Error(`codex app-server is closed (${method})`))\n }\n const id = this.#nextId++\n return new Promise((resolve, reject) => {\n this.#pending.set(id, { method, resolve, reject })\n this.#write({ id, method, ...(params === undefined ? {} : { params }) })\n })\n }\n\n notify(method: string, params?: unknown): void {\n if (this.#closed) {\n return\n }\n this.#write({ method, ...(params === undefined ? {} : { params }) })\n }\n\n onNotification(handler: (method: string, params: unknown) => void): void {\n this.#notificationHandler = handler\n }\n\n onRequest(handler: (method: string, params: unknown, id: string | number) => Promise<unknown>): void {\n this.#requestHandler = handler\n }\n\n fail(message: string): void {\n if (this.#closed) {\n return\n }\n this.#closed = true\n const pending = [...this.#pending.values()]\n this.#pending.clear()\n for (const entry of pending) {\n entry.reject(new Error(`${message} (awaiting ${entry.method})`))\n }\n }\n\n #write(payload: object): void {\n try {\n this.#output.write(JSON.stringify(payload) + '\\n')\n } catch {\n // A broken pipe races the exit event; the wrapper's fail() explains it.\n }\n }\n\n #feed(chunk: string): void {\n this.#buffer += chunk\n let newline: number\n while ((newline = this.#buffer.indexOf('\\n')) >= 0) {\n const line = this.#buffer.slice(0, newline).trim()\n this.#buffer = this.#buffer.slice(newline + 1)\n if (!line) {\n continue\n }\n let message: Record<string, unknown>\n try {\n message = JSON.parse(line) as Record<string, unknown>\n } catch {\n continue // never let one garbled line kill the session\n }\n this.#traceLine(message)\n this.#dispatch(message)\n }\n }\n\n #traceLine(message: Record<string, unknown>): void {\n if (!this.#trace) {\n return\n }\n const method = message.method\n if (typeof method !== 'string') {\n return\n }\n // account/* and login* are the one place this protocol carries a masked credential fragment.\n if (method.startsWith('account/') || method.startsWith('login')) {\n return\n }\n try {\n appendFileSync(this.#trace, JSON.stringify(message) + '\\n')\n } catch {\n // Unwritable path, full disk: tracing is never worth failing a session.\n }\n }\n\n #dispatch(message: Record<string, unknown>): void {\n const { id, method } = message\n if (typeof method === 'string') {\n if (id === undefined || id === null) {\n this.#notificationHandler?.(method, message.params)\n return\n }\n const respond = (payload: object) => this.#write({ id: id as string | number, ...payload })\n const handler = this.#requestHandler\n if (!handler) {\n respond({ error: { code: -32601, message: `no handler for server request '${method}'` } })\n return\n }\n handler(method, message.params, id as string | number).then(\n (result) => respond({ result: result ?? {} }),\n (error: unknown) =>\n respond({\n error: {\n code: error instanceof JsonRpcError ? error.code : -32603,\n message: error instanceof Error ? error.message : String(error),\n },\n }),\n )\n return\n }\n if (id === undefined || id === null) {\n return\n }\n const pending = this.#pending.get(id as number)\n if (!pending) {\n return\n }\n this.#pending.delete(id as number)\n if (message.error !== undefined && message.error !== null) {\n const error = message.error as { code?: number; message?: string }\n pending.reject(new JsonRpcError(error.code ?? -32603, error.message ?? `request '${pending.method}' failed`))\n return\n }\n pending.resolve(message.result)\n }\n}\n","import { SUBAGENT_HISTORY, type SubagentInfo } from '@workerdeck/protocol'\n\nexport class CodexAgentTracker {\n #byThread = new Map<string, CodexAgent>()\n #settleCounter = 0\n\n get(agentThreadId: string): CodexAgent | undefined {\n return this.#byThread.get(agentThreadId)\n }\n\n open(agentThreadId: string, toolUseId: string, agentType: string | undefined, ts: number): CodexAgent {\n let record = this.#byThread.get(agentThreadId)\n if (!record) {\n record = {\n agentThreadId,\n toolUseId,\n status: 'running',\n startedAt: ts,\n toolCount: 0,\n counted: new Set(),\n }\n this.#byThread.set(agentThreadId, record)\n }\n record.agentType ??= agentType\n return record\n }\n\n revive(record: CodexAgent): void {\n record.status = 'running'\n record.settledOrder = undefined\n }\n\n #settle(record: CodexAgent, status: 'done' | 'failed'): void {\n record.status = status\n record.settledOrder = ++this.#settleCounter\n let settled = 0\n for (const r of this.#byThread.values()) {\n if (r.settledOrder !== undefined) {\n settled++\n }\n }\n while (settled > SUBAGENT_HISTORY) {\n let oldest: CodexAgent | undefined\n for (const r of this.#byThread.values()) {\n if (r.settledOrder === undefined) {\n continue\n }\n if (!oldest || r.settledOrder < oldest.settledOrder!) {\n oldest = r\n }\n }\n if (!oldest) {\n break\n }\n this.#byThread.delete(oldest.agentThreadId)\n settled--\n }\n }\n\n settle(record: CodexAgent, status: 'done' | 'failed'): void {\n if (record.status === status) {\n return\n }\n this.#settle(record, status)\n }\n\n sweep(): void {\n for (const record of this.#byThread.values()) {\n if (record.status === 'running') {\n this.#settle(record, 'failed')\n }\n }\n }\n\n forget(): void {\n this.#byThread.clear()\n }\n\n threadIds(): string[] {\n return Array.from(this.#byThread.keys())\n }\n\n list(): SubagentInfo[] | undefined {\n if (this.#byThread.size === 0) {\n return undefined\n }\n const out: SubagentInfo[] = []\n for (const r of this.#byThread.values()) {\n out.push({\n toolUseId: r.toolUseId,\n agentType: r.agentType,\n status: r.status,\n startedAt: r.startedAt,\n toolCount: r.toolCount,\n })\n }\n return out\n }\n}\n\nexport type CodexAgent = {\n agentThreadId: string\n toolUseId: string\n agentType?: string\n status: 'running' | 'done' | 'failed'\n startedAt: number\n toolCount: number\n // `imageGeneration` re-emits its card with the finished input, so ids are counted once.\n counted: Set<string>\n anchored?: boolean\n // Insertion order cannot stand in: a slow early agent settles after a fast late one.\n settledOrder?: number\n}\n","import { existsSync, readFileSync, realpathSync, statSync } from 'node:fs'\nimport { dirname, join, resolve, sep } from 'node:path'\n\nconst BARE_KEY = /[A-Za-z0-9_-]/\n\nfunction skipWs(text: string, pos: number): number {\n let i = pos\n while (i < text.length && (text[i] === ' ' || text[i] === '\\t')) {\n i++\n }\n return i\n}\n\ntype Parsed<T> = { value: T; end: number } | undefined\n\nfunction parseBasicString(text: string, pos: number): Parsed<string> {\n let out = ''\n let i = pos + 1\n while (i < text.length) {\n const ch = text[i]\n if (ch === '\"') {\n return { value: out, end: i + 1 }\n }\n if (ch === '\\\\') {\n const esc = text[i + 1]\n if (esc === 'b') {\n out += '\\b'\n } else if (esc === 't') {\n out += '\\t'\n } else if (esc === 'n') {\n out += '\\n'\n } else if (esc === 'f') {\n out += '\\f'\n } else if (esc === 'r') {\n out += '\\r'\n } else if (esc === '\"') {\n out += '\"'\n } else if (esc === '\\\\') {\n out += '\\\\'\n } else if (esc === 'u' || esc === 'U') {\n const width = esc === 'u' ? 4 : 8\n const hex = text.slice(i + 2, i + 2 + width)\n if (hex.length !== width || !/^[0-9A-Fa-f]+$/.test(hex)) {\n return undefined\n }\n const code = Number.parseInt(hex, 16)\n if (code > 0x10ffff) {\n return undefined\n }\n out += String.fromCodePoint(code)\n i += width\n } else {\n return undefined\n }\n i += 2\n continue\n }\n out += ch\n i++\n }\n return undefined\n}\n\nfunction parseLiteralString(text: string, pos: number): Parsed<string> {\n const close = text.indexOf(\"'\", pos + 1)\n if (close === -1) {\n return undefined\n }\n return { value: text.slice(pos + 1, close), end: close + 1 }\n}\n\nfunction parseKeyPath(text: string, pos: number): Parsed<string[]> {\n const keys: string[] = []\n let i = pos\n for (;;) {\n i = skipWs(text, i)\n const ch = text[i]\n if (ch === '\"' || ch === \"'\") {\n const str = ch === '\"' ? parseBasicString(text, i) : parseLiteralString(text, i)\n if (!str) {\n return undefined\n }\n keys.push(str.value)\n i = str.end\n } else if (ch !== undefined && BARE_KEY.test(ch)) {\n let end = i\n while (end < text.length && BARE_KEY.test(text[end])) {\n end++\n }\n keys.push(text.slice(i, end))\n i = end\n } else {\n return undefined\n }\n i = skipWs(text, i)\n if (text[i] !== '.') {\n return { value: keys, end: i }\n }\n i++\n }\n}\n\n// Returns the bracket depth carried onto the next line (0 = the value is complete); undefined\n// refuses the whole file rather than guess what codex would read.\nfunction scanValueLine(text: string, pos: number, depth: number): { depth: number; value?: string } | undefined {\n let i = skipWs(text, pos)\n if (depth === 0 && (text[i] === '\"' || text[i] === \"'\")) {\n if (text.startsWith('\"\"\"', i) || text.startsWith(\"'''\", i)) {\n return undefined\n }\n const str = text[i] === '\"' ? parseBasicString(text, i) : parseLiteralString(text, i)\n if (!str) {\n return undefined\n }\n const rest = skipWs(text, str.end)\n if (rest < text.length && text[rest] !== '#') {\n return undefined\n }\n return { depth: 0, value: str.value }\n }\n while (i < text.length) {\n const ch = text[i]\n if (ch === '#') {\n break\n }\n if (ch === '\"' || ch === \"'\") {\n if (text.startsWith('\"\"\"', i) || text.startsWith(\"'''\", i)) {\n return undefined\n }\n const str = ch === '\"' ? parseBasicString(text, i) : parseLiteralString(text, i)\n if (!str) {\n return undefined\n }\n i = str.end\n continue\n }\n if (ch === '[' || ch === '{') {\n depth++\n } else if (ch === ']' || ch === '}') {\n depth--\n if (depth < 0) {\n return undefined\n }\n }\n i++\n }\n return { depth }\n}\n\nexport function parseProjectTrustEntries(source: string): Map<string, string> | undefined {\n const entries = new Map<string, string>()\n let section: string[] = []\n let carryDepth = 0\n for (const rawLine of source.split('\\n')) {\n const line = rawLine.endsWith('\\r') ? rawLine.slice(0, -1) : rawLine\n if (carryDepth > 0) {\n const scanned = scanValueLine(line, 0, carryDepth)\n if (!scanned) {\n return undefined\n }\n carryDepth = scanned.depth\n continue\n }\n const start = skipWs(line, 0)\n if (start >= line.length || line[start] === '#') {\n continue\n }\n if (line[start] === '[') {\n const array = line.startsWith('[[', start)\n const path = parseKeyPath(line, start + (array ? 2 : 1))\n if (!path) {\n return undefined\n }\n const close = array ? ']]' : ']'\n if (!line.startsWith(close, path.end)) {\n return undefined\n }\n const rest = skipWs(line, path.end + close.length)\n if (rest < line.length && line[rest] !== '#') {\n return undefined\n }\n if (array && path.value[0] === 'projects') {\n return undefined\n }\n section = path.value\n continue\n }\n const key = parseKeyPath(line, start)\n if (!key) {\n return undefined\n }\n if (line[key.end] !== '=') {\n return undefined\n }\n const scanned = scanValueLine(line, key.end + 1, 0)\n if (!scanned) {\n return undefined\n }\n carryDepth = scanned.depth\n const full = [...section, ...key.value]\n if (full[0] !== 'projects') {\n continue\n }\n // `projects = {...}` / `projects.\"<p>\" = {...}`: whole-entry forms this reader does not\n // interpret — refuse rather than miss a trust_level inside.\n if (full.length < 3) {\n return undefined\n }\n if (full.length === 3 && full[2] === 'trust_level') {\n if (carryDepth !== 0 || scanned.value === undefined) {\n return undefined\n }\n const project = full[1] as string\n const existing = entries.get(project)\n if (existing !== undefined && existing !== scanned.value) {\n return undefined\n }\n entries.set(project, scanned.value)\n }\n }\n if (carryDepth > 0) {\n return undefined\n }\n return entries\n}\n\nfunction mainRepositoryTrusted(gitRootDir: string, canonical: Map<string, string>): boolean {\n const gitPath = join(gitRootDir, '.git')\n try {\n if (!statSync(gitPath).isFile()) {\n return false\n }\n const match = /^gitdir:[ \\t]*(.+?)[ \\t]*$/m.exec(readFileSync(gitPath, 'utf8'))\n if (!match) {\n return false\n }\n const gitdir = resolve(gitRootDir, match[1])\n const at = gitdir.lastIndexOf(`${sep}.git${sep}`)\n if (at <= 0) {\n return false\n }\n let main = gitdir.slice(0, at)\n try {\n main = realpathSync(main)\n } catch {}\n return canonical.get(main) === 'trusted'\n } catch {\n return false\n }\n}\n\nexport function untrustedProjectNotice(options: { cwd: string; codexHome: string }): string | undefined {\n let cwd: string\n try {\n cwd = realpathSync(options.cwd)\n } catch {\n return undefined\n }\n let home = resolve(options.codexHome)\n try {\n home = realpathSync(options.codexHome)\n } catch {}\n const chain: string[] = []\n let dir = cwd\n for (;;) {\n chain.push(dir)\n if (existsSync(join(dir, '.git'))) {\n break\n }\n const parent = dirname(dir)\n if (parent === dir) {\n break\n }\n dir = parent\n }\n const anchor = chain[chain.length - 1] as string\n const gitRoot = existsSync(join(anchor, '.git')) ? anchor : undefined\n const layers = (gitRoot ? chain : [cwd]).filter((layer) => {\n if (!existsSync(join(layer, '.codex', 'config.toml'))) {\n return false\n }\n try {\n // The cwd whose `.codex` IS the codex home: that config is the base config and always loads.\n return realpathSync(join(layer, '.codex')) !== home\n } catch {\n return false\n }\n })\n if (layers.length === 0) {\n return undefined\n }\n const homeConfigPath = join(options.codexHome, 'config.toml')\n let source = ''\n try {\n source = readFileSync(homeConfigPath, 'utf8')\n } catch (error) {\n // Absent = knowably no trust entries; unreadable = unknowable, silence.\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n return undefined\n }\n }\n const entries = parseProjectTrustEntries(source)\n if (!entries) {\n return undefined\n }\n for (const value of entries.values()) {\n if (value !== 'trusted' && value !== 'untrusted') {\n return undefined\n }\n }\n // Two spellings of one directory with conflicting verdicts keep the trusted one — the\n // direction that stays silent.\n const canonical = new Map<string, string>()\n for (const [key, value] of entries) {\n let path = key\n try {\n path = realpathSync(key)\n } catch {}\n if (canonical.get(path) === 'trusted') {\n continue\n }\n canonical.set(path, value)\n }\n const rootTrusted = gitRoot !== undefined && (canonical.get(gitRoot) === 'trusted' || mainRepositoryTrusted(gitRoot, canonical))\n const ignored = layers.filter((layer) => {\n const entry = canonical.get(layer)\n if (entry !== undefined) {\n return entry !== 'trusted'\n }\n return !rootTrusted\n })\n if (ignored.length === 0) {\n return undefined\n }\n const trustDir = gitRoot ?? cwd\n const configs = ignored.map((layer) => join(layer, '.codex', 'config.toml'))\n const what = configs.length === 1 ? `its project config (${configs[0]}) is` : `its project configs (${configs.join(', ')}) are`\n return (\n `codex does not trust this directory, so ${what} being ignored — MCP servers and ` +\n `settings declared there will be missing from this session. To trust it, run codex once ` +\n `in ${trustDir} and accept the trust prompt, or add [projects.\"${trustDir}\"] with ` +\n `trust_level = \"trusted\" to ${homeConfigPath}.`\n )\n}\n","import { createHash, randomUUID } from 'node:crypto'\nimport { mkdirSync, rmSync, statSync, writeFileSync } from 'node:fs'\nimport { homedir, tmpdir } from 'node:os'\nimport { join } from 'node:path'\nimport {\n ENGINE_CAPABILITIES,\n type ContentBlock,\n type CreateSessionRequest,\n type FilePatch,\n type McpServerStatusInfo,\n type PermissionDecisionSource,\n type PermissionMode,\n type PermissionRequest,\n type SessionEvent,\n type SessionEventBody,\n type SessionInfo,\n type SessionStatus,\n type SkillInfo,\n type UserQuestion,\n} from '@workerdeck/protocol'\nimport { attachmentKind, attachmentRef, normalizeMediaType, type AttachmentInput } from '../../lib/attachments.ts'\nimport { parseUnifiedDiff } from '../../lib/patch.ts'\nimport type { PermissionDecision, Runner, SessionEventListener } from '../../runner-interface.ts'\nimport { EventLog } from '../../lib/event-log.ts'\nimport { SubscriberSet, type SubscribeOptions } from '../../lib/subscribers.ts'\nimport { sessionTitle, withTitle } from '../../lib/title.ts'\nimport { codexChildEnv, INITIALIZE_PARAMS } from './connect.ts'\nimport { JsonRpcError } from './jsonrpc.ts'\nimport { CodexAgentTracker, type CodexAgent } from './subagents.ts'\nimport { untrustedProjectNotice } from './trust.ts'\nimport type {\n AppServerCollabAgentToolCallItem,\n AppServerCommandApprovalParams,\n AppServerConnection,\n AppServerConnectFn,\n AppServerElicitationParams,\n AppServerFileChangeApprovalParams,\n AppServerHistoryTurn,\n AppServerImageGenerationItem,\n AppServerItem,\n AppServerMcpServerStatus,\n AppServerMcpServerStatusResponse,\n AppServerMcpStatusUpdate,\n AppServerPermissionsApprovalParams,\n AppServerPlanUpdate,\n AppServerRateLimits,\n AppServerSkillMetadata,\n AppServerSkillsListResponse,\n AppServerTokenUsage,\n AppServerTokenUsageUpdate,\n AppServerTurn,\n AppServerUnknownItem,\n AppServerUserInput,\n AppServerUserInputParams,\n AppServerUserInputQuestion,\n AppServerUserMessageItem,\n} from './types.ts'\n\nconst THREAD_SANDBOX_BY_MODE: Partial<Record<PermissionMode, string>> = {\n default: 'read-only',\n acceptEdits: 'workspace-write',\n auto: 'workspace-write',\n bypassPermissions: 'danger-full-access',\n}\n\n// Only `#turnSandboxPolicy` may send the workspaceWrite entry: every unstated field of that\n// variant is serde-defaulted, so a bare object resets the operator's networkAccess and\n// writableRoots on every turn.\nconst TURN_SANDBOX_BY_MODE: Partial<Record<PermissionMode, { type: string }>> = {\n default: { type: 'readOnly' },\n acceptEdits: { type: 'workspaceWrite' },\n auto: { type: 'workspaceWrite' },\n bypassPermissions: { type: 'dangerFullAccess' },\n}\n\ntype CodexWorkspaceWrite = {\n writableRoots: string[]\n networkAccess: boolean\n excludeTmpdirEnvVar: boolean\n excludeSlashTmp: boolean\n}\n\nconst GRANULAR_ASK = {\n granular: {\n sandbox_approval: true,\n rules: true,\n mcp_elicitations: true,\n request_permissions: true,\n skill_approval: true,\n },\n}\nconst GRANULAR_NEVER = {\n granular: {\n sandbox_approval: false,\n rules: false,\n mcp_elicitations: false,\n request_permissions: false,\n skill_approval: false,\n },\n}\nconst THREAD_SCOPED_NOTIFICATIONS = new Set(['turn/started', 'turn/completed', 'thread/tokenUsage/updated'])\n\nconst APPROVAL_POLICY_BY_MODE: Partial<Record<PermissionMode, object>> = {\n default: GRANULAR_ASK,\n acceptEdits: GRANULAR_ASK,\n auto: GRANULAR_ASK,\n bypassPermissions: GRANULAR_NEVER,\n}\n\nconst APPROVALS_REVIEWER_BY_MODE: Partial<Record<PermissionMode, string>> = {\n default: 'user',\n acceptEdits: 'user',\n auto: 'auto_review',\n bypassPermissions: 'user',\n}\n\nconst DEFAULT_APPROVAL_TIMEOUT_MS = 300_000\n\nexport const CODEX_IMAGE_TOOL = 'CodexImageGeneration'\n\nexport const CODEX_AGENT_TOOL = 'CodexAgent'\n\nexport const CODEX_COLLAB_TOOL = 'CodexCollab'\n\nfunction agentName(agentPath: string | null | undefined): string | undefined {\n if (typeof agentPath !== 'string') {\n return undefined\n }\n const name = agentPath.split('/').filter(Boolean).at(-1)\n return name || undefined\n}\n\nfunction collabInput(item: AppServerCollabAgentToolCallItem): Record<string, unknown> {\n return {\n tool: item.tool,\n ...(item.receiverThreadIds?.length ? { receiverThreadIds: item.receiverThreadIds } : {}),\n ...(item.prompt ? { prompt: item.prompt } : {}),\n ...(item.model ? { model: item.model } : {}),\n }\n}\n\nfunction turnReport(turn: AppServerTurn): string | undefined {\n const items = Array.isArray(turn.items) ? turn.items : []\n for (let index = items.length - 1; index >= 0; index--) {\n const item = items[index]\n if (item?.type === 'agentMessage' && typeof item.text === 'string' && item.text) {\n return item.text\n }\n }\n return undefined\n}\n\nconst MAX_IMAGE_RESULT_CHARS = 512\n\nfunction shortResult(result: string): boolean {\n return result.length > 0 && result.length <= MAX_IMAGE_RESULT_CHARS && !result.startsWith('data:')\n}\n\nfunction producedFileId(path: string): string {\n return createHash('sha256').update(path).digest('hex').slice(0, 32)\n}\n\nconst PRODUCED_MEDIA_TYPES: Record<string, string> = {\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n gif: 'image/gif',\n webp: 'image/webp',\n svg: 'image/svg+xml',\n pdf: 'application/pdf',\n}\n\nfunction producedMediaType(path: string): string | undefined {\n const extension = path.slice(path.lastIndexOf('.') + 1).toLowerCase()\n return PRODUCED_MEDIA_TYPES[extension]\n}\n\nfunction skillInfo(skill: AppServerSkillMetadata): SkillInfo {\n return {\n name: skill.name,\n ...(skill.description ? { description: skill.description } : {}),\n ...((skill.interface?.shortDescription ?? skill.shortDescription)\n ? { shortDescription: skill.interface?.shortDescription ?? skill.shortDescription }\n : {}),\n ...(skill.interface?.displayName ? { displayName: skill.interface.displayName } : {}),\n ...(skill.interface?.defaultPrompt ? { defaultPrompt: skill.interface.defaultPrompt } : {}),\n ...(skill.scope ? { scope: skill.scope } : {}),\n // Codex omits `enabled` for a skill it considers live; defaulting to false would hide it.\n enabled: skill.enabled !== false,\n }\n}\n\nfunction mcpStatusOf(\n authStatus: string | undefined,\n update: { status: string; failureReason?: string } | undefined,\n hasTools: boolean,\n): string {\n if (update?.status === 'failed') {\n return update.failureReason === 'reauthenticationRequired' ? 'needs-auth' : 'failed'\n }\n if (update?.status === 'cancelled') {\n return 'failed'\n }\n if (authStatus === 'notLoggedIn') {\n return 'needs-auth'\n }\n if (update?.status === 'ready') {\n return 'connected'\n }\n if (hasTools) {\n return 'connected'\n }\n return 'pending'\n}\n\nfunction mcpServerInfo(\n server: AppServerMcpServerStatus,\n update: { status: string; error?: string; failureReason?: string } | undefined,\n): McpServerStatusInfo {\n const tools = Object.entries(server.tools ?? {}).flatMap(([key, tool]) => {\n if (!tool) {\n return []\n }\n const annotations = tool.annotations\n return [\n {\n name: tool.name ?? key,\n ...(tool.description ? { description: tool.description } : {}),\n ...(tool.inputSchema !== undefined ? { inputSchema: tool.inputSchema } : {}),\n ...(annotations\n ? {\n annotations: {\n ...(annotations.readOnlyHint != null ? { readOnly: annotations.readOnlyHint } : {}),\n ...(annotations.destructiveHint != null ? { destructive: annotations.destructiveHint } : {}),\n ...(annotations.openWorldHint != null ? { openWorld: annotations.openWorldHint } : {}),\n },\n }\n : {}),\n },\n ]\n })\n return {\n name: server.name,\n status: mcpStatusOf(server.authStatus ?? undefined, update, tools.length > 0),\n ...(update?.error ? { error: update.error } : {}),\n ...(server.serverInfo?.name ? { serverInfo: { name: server.serverInfo.name, version: server.serverInfo.version ?? '' } } : {}),\n ...(tools.length > 0 ? { tools } : {}),\n }\n}\n\nfunction imageGenerationInput(item: AppServerImageGenerationItem): Record<string, unknown> {\n return {\n ...(item.revisedPrompt ? { prompt: item.revisedPrompt } : {}),\n ...(item.savedPath ? { savedPath: item.savedPath } : {}),\n }\n}\n\nfunction offeredDecisions(params: unknown): Set<string> | undefined {\n const raw = (params as { availableDecisions?: unknown })?.availableDecisions\n if (!Array.isArray(raw)) {\n return undefined\n }\n const names = new Set<string>()\n for (const entry of raw) {\n if (typeof entry === 'string') {\n names.add(entry)\n } else if (entry && typeof entry === 'object') {\n for (const key of Object.keys(entry)) {\n names.add(key)\n }\n }\n }\n return names.size > 0 ? names : undefined\n}\n\nfunction pickDecision(behavior: 'allow' | 'deny', interrupt: boolean, offered: Set<string> | undefined): string | undefined {\n const has = (name: string) => !offered || offered.has(name)\n if (behavior === 'allow') {\n return has('accept') ? 'accept' : undefined\n }\n if (interrupt && has('cancel')) {\n return 'cancel'\n }\n return 'decline'\n}\n\nfunction userQuestionsFromCodex(questions: readonly AppServerUserInputQuestion[]): UserQuestion[] {\n return questions.map((question) => ({\n question: question.question,\n header: question.header ?? '',\n options: (question.options ?? []).map((option) => ({\n label: option.label,\n description: option.description,\n })),\n }))\n}\n\nfunction historyUserText(item: AppServerUserMessageItem): string {\n if (!Array.isArray(item.content)) {\n return ''\n }\n let images = 0\n const text = item.content\n .map((part) => {\n const candidate = part as { type?: string; text?: unknown } | null\n if (candidate?.type === 'text' && typeof candidate.text === 'string') {\n return candidate.text\n }\n if (typeof candidate?.type === 'string' && candidate.type.toLowerCase().includes('image')) {\n images += 1\n }\n return ''\n })\n .filter(Boolean)\n .join('\\n')\n if (text) {\n return text\n }\n return images > 0 ? `[${images === 1 ? 'image' : `${images} images`}]` : ''\n}\n\nfunction codexAnswers(\n questions: readonly AppServerUserInputQuestion[],\n answers: Record<string, unknown> | undefined,\n): Record<string, { answers: string[] }> {\n const out: Record<string, { answers: string[] }> = {}\n for (const question of questions) {\n const value = answers?.[question.question] ?? answers?.[question.id]\n if (typeof value === 'string' && value.length > 0) {\n out[question.id] = { answers: [value] }\n }\n }\n return out\n}\n\ntype ApprovalSurface = Pick<PermissionRequest, 'toolName' | 'input' | 'title' | 'displayName' | 'description' | 'decisionReason'>\n\ntype ApprovalChannel = {\n describe(params: unknown): ApprovalSurface\n itemId(params: unknown): string | undefined\n allow(\n params: unknown,\n updatedInput: Record<string, unknown> | undefined,\n offered: Set<string> | undefined,\n ): { response: unknown; decision?: string } | undefined\n deny(params: unknown, interrupt: boolean, offered: Set<string> | undefined): { response: unknown; decision?: string }\n}\n\nfunction decisionChannel(describe: (params: unknown) => ApprovalSurface, itemId: (params: unknown) => string | undefined): ApprovalChannel {\n return {\n describe,\n itemId,\n allow: (_params, _updatedInput, offered) => {\n const decision = pickDecision('allow', false, offered)\n return decision ? { response: { decision }, decision } : undefined\n },\n deny: (_params, interrupt, offered) => {\n const decision = pickDecision('deny', interrupt, offered)!\n return { response: { decision }, decision }\n },\n }\n}\n\nconst APPROVAL_CHANNELS: Record<string, ApprovalChannel> = {\n 'item/commandExecution/requestApproval': decisionChannel(\n (raw) => {\n const params = raw as AppServerCommandApprovalParams\n const command = params.command ?? undefined\n return {\n toolName: 'CodexCommand',\n input: {\n ...(command !== undefined ? { command } : {}),\n ...(params.cwd ? { cwd: params.cwd } : {}),\n ...(params.reason ? { reason: params.reason } : {}),\n },\n title: params.reason ?? (command ? `Codex wants to run: ${command}` : 'Codex wants to run a command'),\n displayName: 'Run command',\n description: params.reason && command ? command : (params.cwd ?? undefined),\n decisionReason: params.reason ?? undefined,\n }\n },\n (raw) => (raw as AppServerCommandApprovalParams).itemId,\n ),\n 'item/fileChange/requestApproval': decisionChannel(\n (raw) => {\n const params = raw as AppServerFileChangeApprovalParams\n return {\n toolName: 'CodexFileChange',\n input: {\n ...(params.grantRoot ? { grantRoot: params.grantRoot } : {}),\n ...(params.reason ? { reason: params.reason } : {}),\n },\n title: params.reason ?? 'Codex wants to apply file changes',\n displayName: 'Apply file changes',\n description: params.grantRoot ? `write access under ${params.grantRoot}` : undefined,\n decisionReason: params.reason ?? undefined,\n }\n },\n (raw) => (raw as AppServerFileChangeApprovalParams).itemId,\n ),\n 'item/permissions/requestApproval': {\n describe: (raw) => {\n const params = raw as AppServerPermissionsApprovalParams\n return {\n toolName: 'CodexPermissions',\n input: {\n ...(params.permissions ? { permissions: params.permissions } : {}),\n ...(params.cwd ? { cwd: params.cwd } : {}),\n ...(params.reason ? { reason: params.reason } : {}),\n },\n title: params.reason ?? 'Codex requests additional permissions',\n displayName: 'Grant permissions',\n description: undefined,\n decisionReason: params.reason ?? undefined,\n }\n },\n itemId: (raw) => (raw as AppServerPermissionsApprovalParams).itemId,\n allow: (raw, updatedInput) => ({\n response: {\n permissions:\n (updatedInput?.permissions as Record<string, unknown> | undefined) ??\n (raw as AppServerPermissionsApprovalParams).permissions ??\n {},\n },\n }),\n deny: () => ({ response: { permissions: {} } }),\n },\n 'item/tool/requestUserInput': {\n describe: (raw) => ({\n toolName: 'AskUserQuestion',\n input: {\n questions: userQuestionsFromCodex((raw as AppServerUserInputParams).questions ?? []),\n },\n title: 'Codex asks a question',\n displayName: 'Answer questions',\n description: undefined,\n decisionReason: undefined,\n }),\n itemId: (raw) => (raw as AppServerUserInputParams).itemId,\n allow: (raw, updatedInput) => ({\n response: {\n answers: codexAnswers(\n (raw as AppServerUserInputParams).questions ?? [],\n updatedInput?.answers as Record<string, unknown> | undefined,\n ),\n },\n }),\n deny: () => ({ response: { answers: {} } }),\n },\n 'mcpServer/elicitation/request': {\n describe: (raw) => {\n const params = raw as AppServerElicitationParams\n return {\n toolName: 'CodexMcpElicitation',\n input: {\n ...(params.serverName ? { serverName: params.serverName } : {}),\n ...(params.message ? { message: params.message } : {}),\n ...(params.mode ? { mode: params.mode } : {}),\n ...(params.requestedSchema !== undefined ? { requestedSchema: params.requestedSchema } : {}),\n ...(params.url ? { url: params.url } : {}),\n },\n title: params.serverName ? `MCP server '${params.serverName}' requests input` : 'An MCP server requests input',\n displayName: 'MCP elicitation',\n description: params.message ?? undefined,\n decisionReason: undefined,\n }\n },\n itemId: () => undefined,\n allow: (_raw, updatedInput) => ({\n response: {\n action: 'accept',\n ...(updatedInput !== undefined ? { content: updatedInput } : {}),\n },\n }),\n deny: (_raw, interrupt) => ({ response: { action: interrupt ? 'cancel' : 'decline' } }),\n },\n}\n\ntype PendingCodexApproval = {\n request: PermissionRequest\n channel: ApprovalChannel\n params: unknown\n offered: Set<string> | undefined\n wireId: string | number | undefined\n timer: ReturnType<typeof setTimeout>\n respond: (response: unknown) => void\n}\n\nexport type CodexRunnerConfig = CreateSessionRequest & {\n connectFn: AppServerConnectFn\n env?: Record<string, string | undefined>\n codexHome?: string\n defaultApprovalTimeoutMs?: number\n backfillHistory?: boolean\n}\n\ntype QueuedTurn = { input: AppServerUserInput[] }\n\nfunction rateLimitWindowName(minutes: number | null | undefined): string | undefined {\n if (typeof minutes !== 'number' || !Number.isFinite(minutes) || minutes <= 0) {\n return undefined\n }\n if (minutes === 300) {\n return 'five_hour'\n }\n if (minutes === 10_080) {\n return 'seven_day'\n }\n return `window_${minutes}m`\n}\n\ntype ActiveTurn = {\n nonce: string\n turnId?: string\n interrupted: boolean\n finalText?: string\n lastError?: string\n usage: AppServerTokenUsage\n sawUsage: boolean\n contextTokens?: number\n contextWindow?: number\n toolUseEmitted: Set<string>\n sectionIndex: Map<string, number>\n settled: boolean\n resolve: (outcome: AppServerTurn) => void\n reject: (error: Error) => void\n}\n\nexport class CodexRunner implements Runner {\n readonly id: string\n readonly createdAt: number\n\n #config: CodexRunnerConfig\n readonly #cwd: string\n #log = new EventLog()\n #subscribers = new SubscriberSet()\n #status: SessionStatus = 'starting'\n #statusDetail: string | undefined\n #sdkSessionId: string | undefined\n #model: string | undefined\n #permissionMode: PermissionMode\n #reasoningEffort: string | undefined\n #resolvedModel: string | undefined\n #planType: string | undefined\n #resolvedEffort: string | undefined\n #queue: QueuedTurn[] = []\n #turnChain: Promise<void> = Promise.resolve()\n #activeTurn: ActiveTurn | undefined\n #connection: AppServerConnection | undefined\n #workspaceWrite: CodexWorkspaceWrite | undefined\n #threadLoaded = false\n #numTurns = 0\n #totalCostUsd: number | undefined\n #started = false\n #closed = false\n #imageDir: string | undefined\n #approvals = new Map<string, PendingCodexApproval>()\n #backfillPending = false\n #resumedHistory: { turns: AppServerHistoryTurn[]; partial: boolean } | undefined\n #replayingHistory = false\n #skillsFingerprint: string | undefined\n #skillsRefresh: Promise<void> | undefined\n #producedPaths = new Set<string>()\n #mcpStatus = new Map<string, { status: string; error?: string; failureReason?: string }>()\n #agents = new CodexAgentTracker()\n #clearedThreads = new Set<string>()\n\n constructor(config: CodexRunnerConfig, id: string = randomUUID()) {\n const mode = config.permissionMode ?? 'default'\n if (!ENGINE_CAPABILITIES.codex.permissionModes.includes(mode)) {\n throw new Error(`permission mode '${mode}' is not supported by the codex engine`)\n }\n if (config.forkSession) {\n throw new Error('the codex engine cannot fork a resumed thread')\n }\n if (!config.cwd) {\n throw new Error('the codex engine requires a cwd')\n }\n this.#cwd = config.cwd\n this.#config = config\n this.#permissionMode = mode\n this.#model = config.model\n this.#reasoningEffort = config.reasoningEffort\n this.#sdkSessionId = config.resume\n this.id = id\n this.createdAt = Date.now()\n }\n\n #childEnv(): Record<string, string> {\n return codexChildEnv(this.#config.env ?? process.env, this.#config.codexHome)\n }\n\n get status(): SessionStatus {\n return this.#status\n }\n\n get sdkSessionId(): string | undefined {\n return this.#sdkSessionId\n }\n\n get lastSeq(): number {\n return this.#log.seq\n }\n\n get pendingApprovals(): PermissionRequest[] {\n return [...this.#approvals.values()].map((pending) => pending.request)\n }\n\n info(): SessionInfo {\n return {\n id: this.id,\n sdkSessionId: this.#sdkSessionId,\n status: this.#status,\n cwd: this.#cwd,\n profile: this.#config.profile,\n engine: 'codex',\n capabilities: ENGINE_CAPABILITIES.codex,\n model: this.#model ?? this.#resolvedModel,\n permissionMode: this.#permissionMode,\n canBypassPermissions: true,\n createdAt: this.createdAt,\n lastSeq: this.#log.seq,\n activityCount: this.#log.activityCount,\n proseCount: this.#log.proseCount,\n contextUsage: this.#log.contextUsage,\n pendingPermissionCount: this.#approvals.size,\n meta: this.#config.meta,\n scope: this.#config.scope,\n title: sessionTitle(this.#config),\n totalCostUsd: this.#totalCostUsd,\n numTurns: this.#numTurns || undefined,\n lastActivityAt: this.#log.lastActivityAt,\n subagents: this.#agents.list(),\n }\n }\n\n setTitle(title: string | undefined): void {\n this.#config = withTitle(this.#config, title)\n }\n\n start(): Promise<void> {\n if (this.#started) {\n return this.#turnChain\n }\n this.#started = true\n this.#warnUntrustedProject()\n if (this.#config.resume && this.#config.backfillHistory !== false) {\n this.#backfillPending = true\n this.#turnChain = this.#turnChain.then(() => this.#backfillHistory())\n } else {\n this.#setStatus('idle')\n }\n if (this.#config.prompt) {\n this.sendMessage(this.#config.prompt)\n }\n if (!this.#config.prompt && !this.#config.resume) {\n void this.#probeSkills()\n }\n return this.#turnChain\n }\n\n #warnUntrustedProject(): void {\n if (this.#permissionMode !== 'default') {\n return\n }\n try {\n const env = this.#childEnv()\n const pin = env.CODEX_HOME\n if (pin !== undefined && pin.length === 0) {\n return\n }\n const codexHome = pin ?? join(env.HOME ?? homedir(), '.codex')\n const message = untrustedProjectNotice({ cwd: this.#cwd, codexHome })\n if (message) {\n this.#emit({ type: 'session_error', message })\n }\n } catch {}\n }\n\n async #probeSkills(): Promise<void> {\n let connection: AppServerConnection | undefined\n try {\n connection = await this.#openScratchConnection()\n if (this.#closed) {\n return\n }\n await this.#refreshSkills(connection)\n } catch {\n } finally {\n connection?.close()\n }\n }\n\n async #openScratchConnection(): Promise<AppServerConnection> {\n const connection = this.#config.connectFn({ env: this.#childEnv() })\n try {\n await connection.request('initialize', INITIALIZE_PARAMS)\n connection.notify('initialized')\n return connection\n } catch (error) {\n connection.close()\n throw error\n }\n }\n\n sendMessage(text: string, attachments?: readonly AttachmentInput[]): void {\n if (this.#closed) {\n throw new Error('session is closed')\n }\n if (text.trim() === '/clear' && !attachments?.length) {\n void this.clearContext().catch((error: unknown) => {\n this.#emit({\n type: 'session_error',\n message: `could not clear the conversation: ${error instanceof Error ? error.message : String(error)}`,\n })\n })\n return\n }\n const input = this.#buildInput(text, attachments ?? [])\n const echo = () =>\n this.#emit({\n type: 'user_message',\n message: { role: 'user', content: text },\n parentToolUseId: null,\n attachments: attachments?.length ? attachments.map(attachmentRef) : undefined,\n uuid: randomUUID(),\n })\n if (this.#backfillPending) {\n this.#turnChain = this.#turnChain.then(echo)\n } else {\n echo()\n }\n this.#queue.push({ input })\n this.#scheduleTurn()\n }\n\n #buildInput(text: string, attachments: readonly AttachmentInput[]): AppServerUserInput[] {\n const parts: AppServerUserInput[] = []\n for (const attachment of attachments) {\n const mediaType = normalizeMediaType(attachment.mediaType)\n switch (attachmentKind(mediaType)) {\n case 'image': {\n this.#imageDir ??= join(tmpdir(), `workerdeck-codex-${this.id}`)\n mkdirSync(this.#imageDir, { recursive: true })\n const ext = mediaType.split('/')[1] ?? 'bin'\n const path = join(this.#imageDir, `${attachment.id}.${ext}`)\n writeFileSync(path, Buffer.from(attachment.data, 'base64'))\n parts.push({ type: 'localImage', path })\n break\n }\n case 'text': {\n parts.push({\n type: 'text',\n text:\n `<attachment name=\"${attachment.name}\" type=\"${mediaType}\">\\n` +\n `${Buffer.from(attachment.data, 'base64').toString('utf8')}\\n</attachment>`,\n })\n break\n }\n default: {\n throw new Error(`unsupported attachment media type for the codex engine: ${attachment.mediaType}`)\n }\n }\n }\n if (text) {\n parts.push({ type: 'text', text })\n }\n return parts\n }\n\n resolvePermission(requestId: string, decision: PermissionDecision): boolean {\n const pending = this.#approvals.get(requestId)\n if (!pending) {\n return false\n }\n this.#settleApproval(requestId, pending, decision, 'client')\n return true\n }\n\n async interrupt(): Promise<void> {\n for (const [id, pending] of this.#approvals) {\n this.#settleApproval(id, pending, { behavior: 'deny', message: 'interrupted', interrupt: true }, 'policy')\n }\n await this.#interruptTurn()\n await this.#turnChain\n }\n\n async clearContext(): Promise<void> {\n if (this.#closed) {\n throw new Error('session is closed')\n }\n const run = this.#turnChain.then(() => this.#clearNow())\n this.#turnChain = run.then(\n () => undefined,\n () => undefined,\n )\n await run\n }\n\n async #clearNow(): Promise<void> {\n if (this.#closed) {\n throw new Error('session is closed')\n }\n const previousThread = this.#sdkSessionId\n this.#sdkSessionId = undefined\n this.#threadLoaded = false\n if (this.#connection) {\n try {\n await this.#ensureThread()\n } catch (error) {\n this.#sdkSessionId = previousThread\n this.#threadLoaded = false\n throw error\n }\n }\n for (const agent of this.#agents.threadIds()) {\n this.#clearedThreads.add(agent)\n }\n this.#agents.forget()\n for (const [id, pending] of this.#approvals) {\n this.#settleApproval(id, pending, { behavior: 'deny', message: 'the conversation was cleared' }, 'policy')\n }\n this.#resumedHistory = undefined\n this.#emit({ type: 'conversation_reset', sdkSessionId: this.#sdkSessionId })\n }\n\n async #interruptTurn(): Promise<void> {\n const active = this.#activeTurn\n const connection = this.#connection\n if (active && !active.settled) {\n active.interrupted = true\n if (connection && active.turnId && this.#sdkSessionId) {\n try {\n await connection.request('turn/interrupt', {\n threadId: this.#sdkSessionId,\n turnId: active.turnId,\n })\n } catch {}\n } else if (connection) {\n // No turn id yet: nothing to address the interrupt to, so end the child. The thread\n // survives on disk and the next message respawns into it.\n connection.close()\n if (this.#connection === connection) {\n this.#connection = undefined\n }\n active.reject(new Error('interrupted'))\n }\n }\n }\n\n async setPermissionMode(mode: PermissionMode): Promise<void> {\n if (!ENGINE_CAPABILITIES.codex.permissionModes.includes(mode)) {\n throw new Error(`permission mode '${mode}' is not supported by the codex engine`)\n }\n if (this.#activeTurn) {\n throw new Error(\"cannot change the permission mode mid-turn (the running turn's sandbox is fixed)\")\n }\n this.#permissionMode = mode\n this.#emit({ type: 'permission_mode_changed', mode })\n }\n\n async setModel(model?: string): Promise<void> {\n if (this.#activeTurn) {\n throw new Error(\"cannot change the model mid-turn (the running turn's model is fixed)\")\n }\n this.#model = model\n this.#emit({ type: 'model_changed', model })\n }\n\n fail(message: string): void {\n if (this.#closed) {\n return\n }\n this.#emit({ type: 'session_error', message })\n this.#setStatus('failed')\n this.close('error')\n }\n\n close(reason: 'client' | 'server' | 'error' = 'client'): void {\n if (this.#closed) {\n return\n }\n this.#closed = true\n this.#queue.length = 0\n for (const [id, pending] of this.#approvals) {\n this.#settleApproval(id, pending, { behavior: 'deny', message: 'Session closed' }, 'policy')\n }\n this.#connection?.close()\n this.#connection = undefined\n this.#agents.sweep()\n this.#activeTurn?.reject(new Error('session closed'))\n if (this.#imageDir) {\n try {\n rmSync(this.#imageDir, { recursive: true, force: true })\n } catch {}\n }\n this.#emit({ type: 'session_closed', reason })\n this.#setStatus('closed')\n }\n\n eventAt(seq: number): SessionEvent | undefined {\n return this.#log.at(seq)\n }\n\n subscribe(listener: SessionEventListener, afterSeq = 0, options?: SubscribeOptions): () => void {\n return this.#subscribers.subscribe(this.#log.events, listener, afterSeq, options, this.#log.resetSeq)\n }\n\n #scheduleTurn(): void {\n this.#turnChain = this.#turnChain.then(() => this.#runTurn())\n }\n\n async #readWorkspaceWrite(connection: AppServerConnection): Promise<void> {\n this.#workspaceWrite = undefined\n try {\n const result = (await connection.request('config/read', { cwd: this.#cwd })) as {\n config?: { sandbox_workspace_write?: Record<string, unknown> | null } | null\n }\n const block = result?.config?.sandbox_workspace_write\n if (!block) {\n return\n }\n const roots = block.writable_roots\n this.#workspaceWrite = {\n writableRoots: Array.isArray(roots) ? roots.filter((r): r is string => typeof r === 'string') : [],\n networkAccess: block.network_access === true,\n excludeTmpdirEnvVar: block.exclude_tmpdir_env_var === true,\n excludeSlashTmp: block.exclude_slash_tmp === true,\n }\n } catch {}\n }\n\n #turnSandboxPolicy(): { type: string } | undefined {\n const policy = TURN_SANDBOX_BY_MODE[this.#permissionMode]\n if (policy?.type !== 'workspaceWrite' || !this.#workspaceWrite) {\n return policy\n }\n return { type: 'workspaceWrite', ...this.#workspaceWrite }\n }\n\n async #ensureThread(): Promise<AppServerConnection> {\n if (this.#closed) {\n throw new Error('session is closed')\n }\n let connection = this.#connection\n if (!connection) {\n connection = this.#config.connectFn({ env: this.#childEnv() })\n this.#connection = connection\n this.#threadLoaded = false\n connection.onNotification((method, params) => this.#handleNotification(method, params))\n connection.onRequest((method, params, id) => this.#answerServerRequest(method, params, id))\n connection.onClose((message) => {\n if (this.#connection === connection) {\n this.#connection = undefined\n this.#threadLoaded = false\n }\n for (const [id, pending] of this.#approvals) {\n this.#settleApproval(id, pending, { behavior: 'deny', message }, 'policy')\n }\n this.#agents.sweep()\n this.#activeTurn?.reject(new Error(message))\n })\n try {\n await connection.request('initialize', INITIALIZE_PARAMS)\n } catch (error) {\n // Don't leave a half-initialized child around: the next message must respawn from scratch.\n connection.close()\n if (this.#connection === connection) {\n this.#connection = undefined\n }\n if (error instanceof JsonRpcError) {\n throw new Error(\n 'codex app-server rejected initialize (capabilities.experimentalApi: true — required ' +\n 'for the granular approval policy, and WorkerDeck has no non-experimental fallback): ' +\n error.message,\n { cause: error },\n )\n }\n throw error\n }\n connection.notify('initialized')\n await this.#readWorkspaceWrite(connection)\n }\n if (!this.#threadLoaded) {\n const options: Record<string, unknown> = {\n cwd: this.#cwd,\n approvalPolicy: APPROVAL_POLICY_BY_MODE[this.#permissionMode],\n sandbox: THREAD_SANDBOX_BY_MODE[this.#permissionMode],\n approvalsReviewer: APPROVALS_REVIEWER_BY_MODE[this.#permissionMode],\n }\n if (this.#model) {\n options.model = this.#model\n }\n const resuming = this.#sdkSessionId !== undefined\n const result = (\n resuming\n ? await connection.request('thread/resume', { threadId: this.#sdkSessionId, ...options })\n : await connection.request('thread/start', options)\n ) as {\n thread?: { id?: string; turns?: AppServerHistoryTurn[] }\n model?: string | null\n reasoningEffort?: string | null\n turnsBackwardsCursor?: string | null\n }\n if (typeof result?.thread?.id === 'string') {\n this.#sdkSessionId = result.thread.id\n }\n if (typeof result?.model === 'string') {\n this.#resolvedModel = result.model\n }\n if (typeof result?.reasoningEffort === 'string') {\n this.#resolvedEffort = result.reasoningEffort\n }\n if (resuming && this.#backfillPending && !this.#resumedHistory) {\n this.#resumedHistory = {\n turns: Array.isArray(result?.thread?.turns) ? result.thread.turns : [],\n partial: typeof result?.turnsBackwardsCursor === 'string',\n }\n }\n this.#threadLoaded = true\n }\n void this.#refreshSkills(connection)\n return connection\n }\n\n async #refreshSkills(connection: AppServerConnection): Promise<void> {\n if (this.#skillsRefresh) {\n return this.#skillsRefresh\n }\n const run = (async () => {\n try {\n const result = (await connection.request('skills/list', {\n cwds: [this.#cwd],\n })) as AppServerSkillsListResponse\n if (this.#closed) {\n return\n }\n const entries = Array.isArray(result?.data) ? result.data : []\n const seen = new Set<string>()\n const skills: SkillInfo[] = []\n for (const entry of entries) {\n for (const skill of entry?.skills ?? []) {\n if (typeof skill?.name !== 'string' || seen.has(skill.name)) {\n continue\n }\n seen.add(skill.name)\n skills.push(skillInfo(skill))\n }\n }\n skills.sort((a, b) => a.name.localeCompare(b.name))\n const fingerprint = JSON.stringify(skills)\n if (fingerprint === this.#skillsFingerprint) {\n return\n }\n this.#skillsFingerprint = fingerprint\n this.#emit({ type: 'skills', skills })\n } catch {\n } finally {\n this.#skillsRefresh = undefined\n }\n })()\n this.#skillsRefresh = run\n return run\n }\n\n async mcpServers(): Promise<McpServerStatusInfo[] | undefined> {\n if (this.#closed) {\n return undefined\n }\n const live = this.#connection\n let scratch: AppServerConnection | undefined\n try {\n const connection = live ?? (scratch = await this.#openScratchConnection())\n const result = (await connection.request('mcpServerStatus/list', {})) as AppServerMcpServerStatusResponse\n return (result?.data ?? []).map((server) => mcpServerInfo(server, this.#mcpStatus.get(server.name)))\n } catch {\n return undefined\n } finally {\n scratch?.close()\n }\n }\n\n #emitFileProduced(path: string, toolUseId: string): void {\n if (this.#producedPaths.has(path)) {\n return\n }\n this.#producedPaths.add(path)\n let bytes: number | undefined\n try {\n const stat = statSync(path)\n if (stat.isFile()) {\n bytes = stat.size\n }\n } catch {}\n this.#emit({\n type: 'file_produced',\n fileId: producedFileId(path),\n path,\n ...(producedMediaType(path) ? { mediaType: producedMediaType(path) } : {}),\n ...(bytes !== undefined ? { bytes } : {}),\n toolUseId,\n })\n }\n\n async #backfillHistory(): Promise<void> {\n try {\n if (this.#closed) {\n return\n }\n const connection = await this.#ensureThread()\n const resumed = this.#resumedHistory\n this.#resumedHistory = undefined\n let turns = resumed?.turns ?? []\n let partialReason: string | undefined\n if (resumed?.partial) {\n try {\n const read = (await connection.request('thread/read', {\n threadId: this.#sdkSessionId,\n includeTurns: true,\n })) as { thread?: { turns?: AppServerHistoryTurn[] } }\n const full = read?.thread?.turns\n if (Array.isArray(full) && full.length >= turns.length) {\n turns = full\n } else {\n partialReason = 'thread/read returned less history than the resume page'\n }\n } catch (error) {\n partialReason = error instanceof Error ? error.message : String(error)\n }\n }\n if (partialReason) {\n this.#emit({\n type: 'session_error',\n message: `Resumed thread history is incomplete — older turns could not be loaded (${partialReason})`,\n })\n }\n this.#replayTurns(turns)\n } catch {\n } finally {\n this.#backfillPending = false\n this.#setStatus('idle')\n }\n }\n\n #replayTurns(turns: readonly AppServerHistoryTurn[]): void {\n for (const turn of turns) {\n if (this.#closed) {\n return\n }\n const state = this.#newTurnState()\n this.#replayingHistory = true\n try {\n for (const item of turn.items ?? []) {\n if (item.type === 'userMessage') {\n const text = historyUserText(item)\n if (!text) {\n continue\n }\n this.#emit({\n type: 'user_message',\n message: { role: 'user', content: text },\n parentToolUseId: null,\n uuid: `${state.nonce}:${item.id}`,\n })\n continue\n }\n this.#handleItemCompleted(item, state)\n }\n } finally {\n this.#replayingHistory = false\n }\n }\n }\n\n #newTurnState(): ActiveTurn {\n return {\n nonce: randomUUID(),\n interrupted: false,\n usage: {\n inputTokens: 0,\n cachedInputTokens: 0,\n cacheWriteInputTokens: 0,\n outputTokens: 0,\n reasoningOutputTokens: 0,\n totalTokens: 0,\n },\n sawUsage: false,\n toolUseEmitted: new Set(),\n sectionIndex: new Map(),\n settled: false,\n resolve: () => {},\n reject: () => {},\n }\n }\n\n async #runTurn(): Promise<void> {\n if (this.#closed) {\n return\n }\n const turn = this.#queue.shift()\n if (!turn) {\n return\n }\n this.#setStatus('running')\n const startedAt = Date.now()\n const active: ActiveTurn = this.#newTurnState()\n const outcome = new Promise<AppServerTurn>((resolve, reject) => {\n active.resolve = (turnResult) => {\n if (active.settled) {\n return\n }\n active.settled = true\n resolve(turnResult)\n }\n active.reject = (error) => {\n if (active.settled) {\n return\n }\n active.settled = true\n reject(error)\n }\n })\n this.#activeTurn = active\n try {\n const connection = await this.#ensureThread()\n const params: Record<string, unknown> = {\n threadId: this.#sdkSessionId,\n input: turn.input,\n cwd: this.#cwd,\n approvalPolicy: APPROVAL_POLICY_BY_MODE[this.#permissionMode],\n sandboxPolicy: this.#turnSandboxPolicy(),\n approvalsReviewer: APPROVALS_REVIEWER_BY_MODE[this.#permissionMode],\n }\n const model = this.#model ?? this.#resolvedModel\n if (model) {\n params.model = model\n }\n const effort = this.#reasoningEffort ?? this.#resolvedEffort\n if (effort) {\n params.effort = effort\n }\n // The terminal signal is the `turn/completed` notification; this response's timing is\n // unspecified, so it only contributes the turn id or a failure.\n connection.request('turn/start', params).then(\n (result) => {\n const started = (result as { turn?: AppServerTurn })?.turn\n if (!started) {\n return\n }\n active.turnId ??= started.id\n if (started.status && started.status !== 'inProgress') {\n active.resolve(started)\n }\n },\n (error: unknown) => active.reject(error instanceof Error ? error : new Error(String(error))),\n )\n const result = await outcome\n if (this.#closed) {\n return\n }\n if (result.status === 'completed') {\n this.#finishTurn('success', startedAt, active)\n } else {\n const reason =\n result.status === 'interrupted'\n ? 'interrupted'\n : (result.error?.message ?? active.lastError ?? 'codex app-server ended the turn without a result')\n this.#finishTurn('failure', startedAt, active, [reason])\n }\n } catch (error) {\n if (this.#closed) {\n return\n }\n const message = error instanceof Error ? error.message : String(error)\n this.#finishTurn('failure', startedAt, active, [active.interrupted ? 'interrupted' : message])\n } finally {\n if (this.#activeTurn === active) {\n this.#activeTurn = undefined\n }\n }\n }\n\n #handleNotification(method: string, params: unknown): void {\n if (this.#closed) {\n return\n }\n if (THREAD_SCOPED_NOTIFICATIONS.has(method) && !this.#isRootThread(params)) {\n if (method === 'turn/completed') {\n this.#settleAgentTurn(params)\n } else if (method === 'turn/started') {\n const threadId = this.#threadIdOf(params)\n const record = threadId ? this.#agents.get(threadId) : undefined\n if (record && record.status !== 'running') {\n this.#agents.revive(record)\n }\n }\n return\n }\n this.#notifications[method]?.(params)\n }\n\n #isRootThread(params: unknown): boolean {\n const threadId = this.#threadIdOf(params)\n if (threadId === undefined) {\n return true\n }\n return threadId === this.#sdkSessionId\n }\n\n #threadIdOf(params: unknown): string | undefined {\n const threadId = (params as { threadId?: unknown })?.threadId\n return typeof threadId === 'string' ? threadId : undefined\n }\n\n #agentFor(params: unknown): CodexAgent | undefined {\n const threadId = this.#threadIdOf(params)\n if (threadId === undefined || threadId === this.#sdkSessionId) {\n return undefined\n }\n const known = this.#agents.get(threadId)\n if (known) {\n return known\n }\n if (this.#clearedThreads.has(threadId)) {\n return undefined\n }\n const nonce = this.#activeTurn?.nonce ?? 'codex'\n const record = this.#agents.open(threadId, `${nonce}:agent:${threadId}`, undefined, Date.now())\n record.anchored = true\n this.#emitToolUse(record.toolUseId, CODEX_AGENT_TOOL, { agentThreadId: threadId })\n return record\n }\n\n #settleAgentTurn(params: unknown): void {\n const threadId = this.#threadIdOf(params)\n const record = threadId ? this.#agents.get(threadId) : undefined\n if (!record || record.status !== 'running') {\n return\n }\n const turn = (params as { turn?: AppServerTurn })?.turn\n const status = turn?.status === 'completed' ? 'done' : 'failed'\n this.#agents.settle(record, status)\n const report = (turn ? turnReport(turn) : undefined) ?? turn?.error?.message ?? (status === 'done' ? '' : (turn?.status ?? 'failed'))\n this.#emitToolResult(record.toolUseId, report, status === 'failed')\n }\n\n #reasoningDelta(method: string): (params: unknown) => void {\n return (params) => {\n const active = this.#activeTurn\n if (!active) {\n return\n }\n const payload = params as {\n delta?: string\n itemId?: string\n contentIndex?: number\n summaryIndex?: number\n }\n if (typeof payload?.delta !== 'string' || !payload.delta) {\n return\n }\n const index = payload.contentIndex ?? payload.summaryIndex ?? 0\n const agent = this.#agentFor(params)\n // Both the agent and the method ride the key. sectionIndex lives on the root turn, and whether\n // app-server item ids are unique across a turn's threads is unverified (docs/GOTCHAS.md\n // §Codex), so two agents must not be able to share a section counter; the two reasoning\n // streams must never share a section boundary either.\n const key = `${agent?.toolUseId ?? ''}:${payload.itemId ?? ''}:${method}`\n const previous = active.sectionIndex.get(key)\n active.sectionIndex.set(key, index)\n const separator = previous !== undefined && index > previous ? '\\n\\n' : ''\n this.#emitDelta({ type: 'thinking_delta', thinking: separator + payload.delta }, agent?.toolUseId ?? null)\n }\n }\n\n #itemProgress = (params: unknown): void => {\n const active = this.#activeTurn\n if (!active) {\n return\n }\n const item = (params as { item?: AppServerItem })?.item\n if (item) {\n this.#handleItemProgress(item, active, this.#agentFor(params))\n }\n }\n\n readonly #notifications: Record<string, (params: unknown) => void> = {\n 'thread/started': (params) => {\n const thread = (params as { thread?: { id?: string } })?.thread\n if (typeof thread?.id === 'string') {\n this.#sdkSessionId = thread.id\n }\n },\n 'turn/started': (params) => {\n const active = this.#activeTurn\n const turn = (params as { turn?: AppServerTurn })?.turn\n if (active && turn && !active.turnId) {\n active.turnId = turn.id\n }\n },\n 'turn/completed': (params) => {\n const active = this.#activeTurn\n const turn = (params as { turn?: AppServerTurn })?.turn\n if (!active || !turn) {\n return\n }\n if (active.turnId && turn.id && turn.id !== active.turnId) {\n return\n }\n active.resolve(turn)\n },\n 'item/started': this.#itemProgress,\n 'item/updated': this.#itemProgress,\n 'item/completed': (params) => {\n const active = this.#activeTurn\n if (!active) {\n return\n }\n const item = (params as { item?: AppServerItem })?.item\n if (item) {\n this.#handleItemCompleted(item, active, this.#agentFor(params))\n }\n },\n 'item/agentMessage/delta': (params) => {\n if (!this.#activeTurn) {\n return\n }\n const delta = (params as { delta?: string })?.delta\n if (typeof delta === 'string' && delta) {\n this.#emitDelta({ type: 'text_delta', text: delta }, this.#agentFor(params)?.toolUseId ?? null)\n }\n },\n 'item/reasoning/textDelta': this.#reasoningDelta('item/reasoning/textDelta'),\n 'item/reasoning/summaryTextDelta': this.#reasoningDelta('item/reasoning/summaryTextDelta'),\n 'thread/tokenUsage/updated': (params) => {\n const active = this.#activeTurn\n if (!active) {\n return\n }\n const last = (params as AppServerTokenUsageUpdate)?.tokenUsage?.last\n if (!last) {\n return\n }\n active.sawUsage = true\n active.usage.inputTokens += last.inputTokens ?? 0\n active.usage.cachedInputTokens += last.cachedInputTokens ?? 0\n active.usage.cacheWriteInputTokens = (active.usage.cacheWriteInputTokens ?? 0) + (last.cacheWriteInputTokens ?? 0)\n active.usage.outputTokens += last.outputTokens ?? 0\n active.usage.reasoningOutputTokens += last.reasoningOutputTokens ?? 0\n const update = params as AppServerTokenUsageUpdate\n active.contextTokens = last.totalTokens ?? undefined\n active.contextWindow = update.tokenUsage?.modelContextWindow ?? undefined\n },\n 'mcpServer/startupStatus/updated': (params) => {\n const update = params as AppServerMcpStatusUpdate\n if (typeof update?.name !== 'string') {\n return\n }\n this.#mcpStatus.set(update.name, {\n status: typeof update.status === 'string' ? update.status : 'starting',\n ...(update.error ? { error: update.error } : {}),\n ...(update.failureReason ? { failureReason: update.failureReason } : {}),\n })\n },\n 'skills/changed': () => {\n const connection = this.#connection\n if (connection) {\n void this.#refreshSkills(connection)\n }\n },\n 'account/rateLimits/updated': (params) => {\n this.#emitRateLimits((params as { rateLimits?: AppServerRateLimits })?.rateLimits)\n },\n 'turn/plan/updated': (params) => {\n const active = this.#activeTurn\n if (!active) {\n return\n }\n const plan = (params as AppServerPlanUpdate)?.plan\n if (!Array.isArray(plan)) {\n return\n }\n this.#emit({\n type: 'sdk_event',\n payload: {\n type: 'codex.todo_list',\n id: `${active.nonce}:plan`,\n items: plan.map((step) => ({ text: step.step, completed: step.status === 'completed' })),\n },\n })\n },\n 'serverRequest/resolved': (params) => {\n const requestId = (params as { requestId?: string | number })?.requestId\n if (requestId === undefined) {\n return\n }\n for (const [id, pending] of this.#approvals) {\n if (pending.wireId === requestId) {\n // Reported as a deny because codex's own choice is unknowable; the message says who decided.\n this.#settleApproval(id, pending, { behavior: 'deny', message: 'resolved by codex' }, 'policy')\n return\n }\n }\n },\n // Mostly retry noise (`willRetry: true`); the last message is what explains a turn that\n // fails without carrying its own error.\n error: (params) => {\n const active = this.#activeTurn\n const error = (params as { error?: { message?: string } })?.error\n if (active && typeof error?.message === 'string') {\n active.lastError = error.message\n }\n },\n }\n\n async #answerServerRequest(method: string, params: unknown, wireId?: string | number): Promise<unknown> {\n const channel = APPROVAL_CHANNELS[method]\n if (channel) {\n return this.#requestApproval(channel, method, params, wireId)\n }\n throw new JsonRpcError(-32601, `workerdeck does not handle server request '${method}'`)\n }\n\n #requestApproval(channel: ApprovalChannel, method: string, params: unknown, wireId: string | number | undefined): Promise<unknown> {\n if (method === 'item/tool/requestUserInput') {\n const behavior = this.#config.questionBehavior ?? 'ask'\n if (behavior !== 'ask') {\n return Promise.resolve(this.#resolveQuestionByPolicy(channel, params, behavior))\n }\n }\n const id = randomUUID()\n const timeoutMs = this.#config.approvalTimeoutMs ?? this.#config.defaultApprovalTimeoutMs ?? DEFAULT_APPROVAL_TIMEOUT_MS\n const itemId = channel.itemId(params)\n const request: PermissionRequest = {\n id,\n ...channel.describe(params),\n toolUseId: itemId ? `${this.#activeTurn?.nonce ?? 'codex'}:${itemId}` : id,\n expiresAt: Date.now() + timeoutMs,\n }\n return new Promise<unknown>((resolve) => {\n const timer = setTimeout(() => {\n const pending = this.#approvals.get(id)\n if (pending) {\n this.#settleApproval(id, pending, { behavior: 'deny', message: 'Approval timed out' }, 'timeout')\n }\n }, timeoutMs)\n this.#approvals.set(id, {\n request,\n channel,\n params,\n offered: offeredDecisions(params),\n wireId,\n timer,\n respond: resolve,\n })\n this.#emit({ type: 'permission_requested', request })\n if (this.#activeTurn) {\n this.#setStatus('awaiting_approval')\n }\n })\n }\n\n #resolveQuestionByPolicy(channel: ApprovalChannel, params: unknown, mode: 'auto' | 'deny'): unknown {\n const itemId = channel.itemId(params)\n const request: PermissionRequest = {\n id: randomUUID(),\n ...channel.describe(params),\n toolUseId: itemId ? `${this.#activeTurn?.nonce ?? 'codex'}:${itemId}` : randomUUID(),\n }\n this.#emit({ type: 'permission_requested', request })\n if (mode === 'deny') {\n this.#emit({\n type: 'permission_resolved',\n requestId: request.id,\n behavior: 'deny',\n resolvedBy: 'policy',\n message: 'Interactive questions are disabled for this session — choose the most reasonable option yourself and continue.',\n })\n return { answers: {} }\n }\n const answers: Record<string, { answers: string[] }> = {}\n for (const question of (params as AppServerUserInputParams).questions ?? []) {\n const first = question.options?.[0]?.label\n if (first) {\n answers[question.id] = { answers: [first] }\n }\n }\n this.#emit({\n type: 'permission_resolved',\n requestId: request.id,\n behavior: 'allow',\n resolvedBy: 'policy',\n })\n return { answers }\n }\n\n #settleApproval(id: string, pending: PendingCodexApproval, decision: PermissionDecision, resolvedBy: PermissionDecisionSource): void {\n clearTimeout(pending.timer)\n this.#approvals.delete(id)\n let behavior = decision.behavior\n let message = decision.behavior === 'deny' ? (decision.message ?? 'Denied') : undefined\n let sent: { response: unknown; decision?: string }\n if (decision.behavior === 'allow') {\n const allowed = pending.channel.allow(pending.params, decision.updatedInput, pending.offered)\n if (allowed) {\n sent = allowed\n } else {\n behavior = 'deny'\n resolvedBy = 'policy'\n message = 'codex offered no plain accept for this request (only broader session/policy grants) — denied instead'\n sent = pending.channel.deny(pending.params, false, pending.offered)\n }\n } else {\n sent = pending.channel.deny(pending.params, decision.interrupt === true, pending.offered)\n }\n pending.respond(sent.response)\n this.#emit({ type: 'permission_resolved', requestId: id, behavior, resolvedBy, message })\n if (behavior === 'deny' && decision.behavior === 'deny' && decision.interrupt && sent.decision !== 'cancel') {\n void this.#interruptTurn()\n }\n if (!this.#closed && this.#approvals.size === 0 && this.#status === 'awaiting_approval') {\n this.#setStatus('running')\n }\n }\n\n #handleItemProgress(item: AppServerItem, active: ActiveTurn, agent?: CodexAgent): void {\n const id = `${active.nonce}:${item.id}`\n if (item.type === 'subAgentActivity') {\n this.#itemCompleted.subAgentActivity(item, active, id, agent)\n return\n }\n if (item.type === 'commandExecution' && !active.toolUseEmitted.has(id)) {\n active.toolUseEmitted.add(id)\n this.#emitToolUse(id, 'CodexCommand', { command: item.command }, agent)\n return\n }\n if (item.type === 'mcpToolCall' && !active.toolUseEmitted.has(id)) {\n active.toolUseEmitted.add(id)\n this.#emitToolUse(id, `mcp__${item.server}__${item.tool}`, item.arguments, agent)\n return\n }\n if (item.type === 'collabAgentToolCall' && !active.toolUseEmitted.has(id)) {\n active.toolUseEmitted.add(id)\n this.#emitToolUse(id, CODEX_COLLAB_TOOL, collabInput(item), agent)\n return\n }\n if (item.type === 'imageGeneration' && !active.toolUseEmitted.has(id)) {\n active.toolUseEmitted.add(id)\n this.#emitToolUse(id, CODEX_IMAGE_TOOL, imageGenerationInput(item), agent)\n if (item.savedPath) {\n this.#emitFileProduced(item.savedPath, id)\n }\n }\n }\n\n #handleItemCompleted(item: AppServerItem, active: ActiveTurn, agent?: CodexAgent): void {\n const id = `${active.nonce}:${item.id}`\n const handler = this.#itemCompleted[item.type] as\n | ((item: AppServerItem, active: ActiveTurn, id: string, agent?: CodexAgent) => void)\n | undefined\n if (handler) {\n handler(item, active, id, agent)\n return\n }\n const unknown = item as AppServerUnknownItem\n this.#emit({ type: 'sdk_event', payload: { type: `codex.${unknown.type}`, item: unknown } })\n }\n\n readonly #itemCompleted: {\n [K in AppServerItem['type']]: (item: Extract<AppServerItem, { type: K }>, active: ActiveTurn, id: string, agent?: CodexAgent) => void\n } = {\n userMessage: (item, active, _id, agent) => {\n if (!agent) {\n return\n }\n const text = historyUserText(item)\n if (!text) {\n return\n }\n this.#emit({\n type: 'user_message',\n message: { role: 'user', content: text },\n parentToolUseId: agent.toolUseId,\n uuid: `${active.nonce}:${item.id}`,\n })\n },\n agentMessage: (item, active, id, agent) => {\n const text = typeof item.text === 'string' ? item.text : ''\n this.#emitAssistant(id, [{ type: 'text', text }], agent?.toolUseId ?? null)\n if (!agent) {\n active.finalText = text\n }\n },\n reasoning: (item, _active, id, agent) => {\n const summary = Array.isArray(item.summary) ? item.summary.filter(Boolean) : []\n const content = Array.isArray(item.content) ? item.content.filter(Boolean) : []\n const thinking = (summary.length > 0 ? summary : content).join('\\n\\n')\n if (thinking) {\n this.#emitAssistant(id, [{ type: 'thinking', thinking }], agent?.toolUseId ?? null)\n }\n },\n commandExecution: (item, active, id, agent) => {\n if (!active.toolUseEmitted.has(id)) {\n active.toolUseEmitted.add(id)\n this.#emitToolUse(id, 'CodexCommand', { command: item.command }, agent)\n }\n const exitCode = item.exitCode ?? undefined\n const failed = item.status === 'failed' || item.status === 'declined' || (exitCode !== undefined && exitCode !== 0)\n const output = (item.aggregatedOutput ?? '') + (exitCode !== undefined && exitCode !== 0 ? `\\n(exit code ${exitCode})` : '')\n this.#emitToolResult(id, output, failed, undefined, agent?.toolUseId ?? null)\n },\n fileChange: (item, _active, id, agent) => {\n this.#emitToolUse(id, 'CodexFileChange', { changes: item.changes }, agent)\n const lines = item.changes.map((change) => {\n const kind = typeof change.kind === 'string' ? change.kind : change.kind?.type\n return `${kind ?? 'change'}: ${change.path}`\n })\n // A patch names one file, and a multi-file edit has no honest way to say which.\n const only = item.changes.length === 1 ? item.changes[0] : undefined\n this.#emitToolResult(\n id,\n lines.join('\\n') || item.status,\n item.status === 'failed' || item.status === 'declined',\n only?.diff ? parseUnifiedDiff(only.diff, only.path) : undefined,\n agent?.toolUseId ?? null,\n )\n },\n mcpToolCall: (item, active, id, agent) => {\n if (!active.toolUseEmitted.has(id)) {\n active.toolUseEmitted.add(id)\n this.#emitToolUse(id, `mcp__${item.server}__${item.tool}`, item.arguments, agent)\n }\n const isError = (item.error !== undefined && item.error !== null) || item.status === 'failed'\n this.#emitToolResult(\n id,\n item.error?.message ?? (item.result === undefined || item.result === null ? '' : JSON.stringify(item.result)),\n isError,\n undefined,\n agent?.toolUseId ?? null,\n )\n },\n webSearch: (item, _active, id, agent) => {\n this.#emitToolUse(id, 'CodexWebSearch', { query: item.query }, agent)\n this.#emitToolResult(id, '', false, undefined, agent?.toolUseId ?? null)\n },\n imageGeneration: (item, active, id, agent) => {\n // Re-emitted without the `toolUseEmitted` guard: `savedPath` only exists now, and the\n // reducer upserts a tool_use by id, so this replaces the in-progress card's input.\n active.toolUseEmitted.add(id)\n this.#emitToolUse(id, CODEX_IMAGE_TOOL, imageGenerationInput(item), agent)\n if (item.savedPath) {\n this.#emitFileProduced(item.savedPath, id)\n }\n const lines = [\n item.savedPath ? `Saved to ${item.savedPath}` : 'No saved path reported',\n ...(shortResult(item.result) ? [item.result] : []),\n ]\n this.#emitToolResult(id, lines.join('\\n'), item.status === 'failed', undefined, agent?.toolUseId ?? null)\n },\n imageView: (item, _active, id, agent) => {\n this.#emitToolUse(id, 'CodexImageView', { path: item.path }, agent)\n this.#emitToolResult(id, item.path, false, undefined, agent?.toolUseId ?? null)\n },\n subAgentActivity: (item, _active, id, agent) => {\n if (this.#replayingHistory) {\n if (item.kind !== 'started') {\n return\n }\n this.#emitToolUse(\n id,\n CODEX_AGENT_TOOL,\n {\n ...(agentName(item.agentPath) ? { subagent_type: agentName(item.agentPath) } : {}),\n agentThreadId: item.agentThreadId,\n ...(item.agentPath ? { agentPath: item.agentPath } : {}),\n },\n agent,\n )\n // A resumed thread's history holds the root's items only, so a replayed agent row closes\n // neutrally: the one claim history cannot back is that the agent failed.\n this.#emitToolResult(\n id,\n \"(ran in its own thread — its work is not part of this thread's stored history)\",\n false,\n undefined,\n agent?.toolUseId ?? null,\n )\n return\n }\n const record = this.#agents.get(item.agentThreadId) ?? this.#agents.open(item.agentThreadId, id, undefined, Date.now())\n const name = agentName(item.agentPath)\n const relabel = record.agentType === undefined && name !== undefined\n if (relabel) {\n record.agentType = name\n }\n if (!record.anchored || relabel) {\n record.anchored = true\n this.#emitToolUse(\n record.toolUseId,\n CODEX_AGENT_TOOL,\n {\n ...(record.agentType ? { subagent_type: record.agentType } : {}),\n agentThreadId: item.agentThreadId,\n ...(item.agentPath ? { agentPath: item.agentPath } : {}),\n },\n agent,\n )\n }\n if (item.kind === 'interrupted') {\n if (record.status === 'running') {\n this.#agents.settle(record, 'failed')\n this.#emitToolResult(record.toolUseId, 'interrupted', true)\n }\n return\n }\n if (item.kind !== 'started' && record.status !== 'running') {\n this.#agents.revive(record)\n }\n },\n collabAgentToolCall: (item, active, id, agent) => {\n if (!active.toolUseEmitted.has(id)) {\n active.toolUseEmitted.add(id)\n this.#emitToolUse(id, CODEX_COLLAB_TOOL, collabInput(item), agent)\n }\n if (item.status === 'inProgress') {\n return\n }\n const failed = item.status === 'failed' || item.status === 'declined'\n this.#emitToolResult(id, failed ? item.status : '', failed, undefined, agent?.toolUseId ?? null)\n },\n }\n\n #emitDelta(delta: { type: 'text_delta'; text: string } | { type: 'thinking_delta'; thinking: string }, parent: string | null): void {\n if (this.#config.includePartialMessages === false) {\n return\n }\n this.#emit({\n type: 'stream_delta',\n event: { type: 'content_block_delta', delta },\n parentToolUseId: parent,\n uuid: randomUUID(),\n })\n }\n\n #emitAssistant(uuid: string, content: ContentBlock[], parent: string | null): void {\n this.#emit({\n type: 'assistant_message',\n message: { role: 'assistant', content, model: this.#model ?? this.#resolvedModel },\n parentToolUseId: parent,\n uuid,\n })\n }\n\n #emitToolUse(id: string, name: string, input: unknown, agent?: CodexAgent): void {\n if (agent && !agent.counted.has(id)) {\n agent.counted.add(id)\n agent.toolCount += 1\n }\n this.#emit({\n type: 'assistant_message',\n message: {\n role: 'assistant',\n content: [{ type: 'tool_use', id, name, input }],\n model: this.#model ?? this.#resolvedModel,\n },\n parentToolUseId: agent?.toolUseId ?? null,\n uuid: `${id}-use`,\n })\n }\n\n #emitToolResult(toolUseId: string, content: string, isError: boolean, patch?: FilePatch, parent: string | null = null): void {\n this.#emit({\n type: 'user_message',\n message: {\n role: 'user',\n content: [{ type: 'tool_result', tool_use_id: toolUseId, content, is_error: isError || undefined }],\n },\n parentToolUseId: parent,\n synthetic: true,\n patch,\n uuid: `${toolUseId}-result`,\n })\n }\n\n #finishTurn(kind: 'success' | 'failure', startedAt: number, active: ActiveTurn, errors?: string[]): void {\n for (const [id, pending] of this.#approvals) {\n this.#settleApproval(id, pending, { behavior: 'deny', message: 'Turn ended' }, 'policy')\n }\n this.#numTurns += 1\n this.#totalCostUsd = 0\n const usage = active.sawUsage ? active.usage : undefined\n this.#emit({\n type: 'turn_result',\n subtype: kind === 'success' ? 'success' : 'error_during_execution',\n isError: kind !== 'success',\n durationMs: Date.now() - startedAt,\n numTurns: this.#numTurns,\n totalCostUsd: 0,\n result: kind === 'success' ? (active.finalText ?? '') : undefined,\n errors,\n usage: usage\n ? {\n input_tokens: Math.max(0, usage.inputTokens - usage.cachedInputTokens),\n output_tokens: usage.outputTokens + usage.reasoningOutputTokens,\n cache_creation_input_tokens: usage.cacheWriteInputTokens ?? 0,\n cache_read_input_tokens: usage.cachedInputTokens,\n }\n : undefined,\n })\n this.#emitContextUsage(active)\n this.#setStatus('idle')\n }\n\n #emitRateLimits(limits: AppServerRateLimits | undefined | null): void {\n if (!limits) {\n return\n }\n const status = limits.rateLimitReachedType ? 'rejected' : 'allowed'\n for (const window of [limits.primary, limits.secondary]) {\n if (!window || window.usedPercent === null || window.usedPercent === undefined) {\n continue\n }\n this.#emit({\n type: 'rate_limit',\n info: {\n status,\n rateLimitType: rateLimitWindowName(window.windowDurationMins),\n utilization: window.usedPercent,\n ...(typeof window.resetsAt === 'number' ? { resetsAt: window.resetsAt } : {}),\n },\n })\n }\n if (limits.planType && limits.planType !== this.#planType) {\n this.#planType = limits.planType\n this.#emit({ type: 'plan_info', subscriptionType: limits.planType })\n }\n }\n\n #emitContextUsage(active: ActiveTurn): void {\n const totalTokens = active.contextTokens\n const maxTokens = active.contextWindow\n if (totalTokens === undefined || !maxTokens || maxTokens <= 0) {\n return\n }\n this.#emit({\n type: 'context_usage',\n usage: {\n categories: [],\n totalTokens,\n maxTokens,\n percentage: Math.min(100, (totalTokens / maxTokens) * 100),\n model: this.#model ?? this.#resolvedModel,\n },\n })\n }\n\n #setStatus(status: SessionStatus, detail?: string): void {\n // Deduped on the (status, detail) pair: deduping on status alone would swallow a new detail\n // for an unchanged status, which is the one update a detail exists to carry.\n if (this.#status === status && this.#statusDetail === detail) {\n return\n }\n if (this.#status === 'closed' || this.#status === 'failed') {\n return\n }\n this.#status = status\n this.#statusDetail = detail\n this.#emit({ type: 'status_changed', status, detail })\n }\n\n #emit(body: SessionEventBody): void {\n if (this.#replayingHistory && (body.type === 'assistant_message' || body.type === 'user_message')) {\n body = { ...body, replay: true }\n }\n this.#subscribers.emit(this.#log.append(body))\n }\n}\n","import type { ModelCatalog } from '../adapter.ts'\n\n/**\n * The Codex engine's model catalog, seeded from the binary's own embedded model\n * table (see `provenance` for the version) — that table, not the SDK's stale\n * `ModelReasoningEffort` union, is the truth about which reasoning efforts each\n * model takes. Mapping decisions: the internal `codex-auto-review` row is dropped\n * (the codex analogue of the CLI's `default` sentinel), `primary` mirrors the\n * binary's own `visibility` field so both UIs group the way codex's picker does,\n * and `reasoningEfforts` carries `supported_reasoning_levels` verbatim — `max`\n * and `ultra` go beyond the SDK union, so trust the binary and keep strings open.\n *\n * **Refresh procedure** (release checklist): extract the embedded JSON from the\n * platform binary and diff. The two-hop resolve is NOT optional — under pnpm's\n * strict layout the platform package is a dependency of `@openai/codex` and\n * resolves only from that wrapper's location (MODULE_NOT_FOUND otherwise), the\n * same two hops `resolveBundledCodexExecutable` makes.\n *\n * node -e 'const d=require(\"fs\").readFileSync(process.argv[1]);\n * const s=d.indexOf(`{\\n \"models\": [`);\n * let i=s,n=0; do{n+=(d[i]===123)-(d[i]===125);i++}while(n);\n * const c=JSON.parse(d.slice(s,i));\n * for(const m of c.models) console.log(m.slug, m.display_name,\n * m.visibility, m.supported_reasoning_levels.map(l=>l.effort).join(\",\"))'\\\n * \"$(node -p 'const{createRequire}=require(\"module\");\n * const w=require.resolve(\"@openai/codex/package.json\");\n * createRequire(w).resolve(\"@openai/codex-darwin-arm64/package.json\")\n * .replace(\"package.json\",\"vendor/aarch64-apple-darwin/bin/codex\")')\"\n */\nexport const CODEX_CATALOG: ModelCatalog = {\n provenance: 'embedded model presets of @openai/codex@0.149.0 (darwin-arm64 binary), extracted 2026-08-22',\n models: [\n {\n value: 'gpt-5.6-sol',\n resolvedModel: 'gpt-5.6-sol',\n displayName: 'GPT-5.6 Sol',\n description: 'Latest frontier agentic coding model.',\n primary: true,\n reasoningEfforts: ['low', 'medium', 'high', 'xhigh', 'max', 'ultra'],\n },\n {\n value: 'gpt-5.6-terra',\n resolvedModel: 'gpt-5.6-terra',\n displayName: 'GPT-5.6 Terra',\n description: 'Balanced agentic coding model for everyday work.',\n primary: true,\n reasoningEfforts: ['low', 'medium', 'high', 'xhigh', 'max', 'ultra'],\n },\n {\n value: 'gpt-5.6-luna',\n resolvedModel: 'gpt-5.6-luna',\n displayName: 'GPT-5.6 Luna',\n description: 'Fast and affordable agentic coding model.',\n primary: true,\n reasoningEfforts: ['low', 'medium', 'high', 'xhigh', 'max'],\n },\n {\n value: 'gpt-5.5',\n resolvedModel: 'gpt-5.5',\n displayName: 'GPT-5.5',\n description: 'Frontier model for complex coding, research, and real-world work.',\n primary: true,\n reasoningEfforts: ['low', 'medium', 'high', 'xhigh'],\n },\n {\n value: 'gpt-5.4',\n resolvedModel: 'gpt-5.4',\n displayName: 'GPT-5.4',\n description: 'Strong model for everyday coding.',\n reasoningEfforts: ['low', 'medium', 'high', 'xhigh'],\n },\n {\n value: 'gpt-5.4-mini',\n resolvedModel: 'gpt-5.4-mini',\n displayName: 'GPT-5.4 Mini',\n description: 'Small, fast, and cost-efficient model for simpler coding tasks.',\n reasoningEfforts: ['low', 'medium', 'high', 'xhigh'],\n },\n {\n value: 'gpt-5.2',\n resolvedModel: 'gpt-5.2',\n displayName: 'GPT-5.2',\n description: 'Optimized for professional work and long-running agents.',\n primary: true,\n reasoningEfforts: ['low', 'medium', 'high', 'xhigh'],\n },\n ],\n}\n","import { spawn } from 'node:child_process'\nimport { JsonRpcStdioConnection } from './jsonrpc.ts'\nimport type { AppServerConnection } from './types.ts'\n\nconst STDERR_TAIL_BYTES = 4096\n\nexport function connectAppServer(options: { executable: string; env: Record<string, string> }): AppServerConnection {\n const child = spawn(options.executable, ['app-server'], {\n env: options.env,\n stdio: ['pipe', 'pipe', 'pipe'],\n })\n const rpc = new JsonRpcStdioConnection({ input: child.stdout, output: child.stdin })\n\n let stderrTail = ''\n child.stderr.on('data', (chunk: Buffer) => {\n stderrTail = (stderrTail + String(chunk)).slice(-STDERR_TAIL_BYTES)\n })\n\n let closeHandler: ((message: string) => void) | undefined\n let done = false\n const settle = (message: string) => {\n if (done) {\n return\n }\n done = true\n rpc.fail(message)\n closeHandler?.(message)\n }\n child.on('error', (error) => settle(`codex app-server failed to start: ${error.message}`))\n child.on('exit', (code, signal) => {\n const tail = stderrTail.trim()\n settle(`codex app-server exited (${signal ?? `code ${code}`})` + (tail ? `: ${tail.slice(-500)}` : ''))\n })\n\n return {\n request: (method, params) => rpc.request(method, params),\n notify: (method, params) => rpc.notify(method, params),\n onNotification: (handler) => rpc.onNotification(handler),\n onRequest: (handler) => rpc.onRequest(handler),\n onClose: (handler) => {\n closeHandler = handler\n },\n close: () => {\n // Suppress the exit callback so a deliberate close doesn't read as a crash.\n done = true\n rpc.fail('codex app-server connection closed')\n child.kill()\n },\n }\n}\n","import { execFile } from 'node:child_process'\nimport { existsSync, realpathSync } from 'node:fs'\nimport { createRequire } from 'node:module'\nimport { ENGINE_CAPABILITIES, type ProfileInfo, type SdkSessionSummary } from '@workerdeck/protocol'\nimport type { EngineAdapter, EngineAvailability } from '../adapter.ts'\nimport { CodexRunner } from './runner.ts'\nimport { CODEX_CATALOG } from './catalog.ts'\nimport { codexChildEnv, INITIALIZE_PARAMS } from './connect.ts'\nimport { connectAppServer } from './process.ts'\nimport type { AppServerConnectFn, AppServerThreadListResponse, AppServerThreadSummary } from './types.ts'\n\nconst NOT_INSTALLED = '@openai/codex is not installed — add it (an optional peer of @workerdeck/core) to run codex profiles'\n\nexport function resolveBundledCodexExecutable(): string | undefined {\n const triple = targetTriple()\n if (!triple) {\n return undefined\n }\n try {\n // Two hops: the platform package is a dependency of @openai/codex, not of this one, so under\n // pnpm's strict layout it resolves only from @openai/codex's own location.\n const fromHere = createRequire(import.meta.url)\n const wrapper = fromHere.resolve('@openai/codex/package.json')\n const fromWrapper = createRequire(wrapper)\n const platformPackage = fromWrapper.resolve(`@openai/codex-${platformPackageSuffix()}/package.json`)\n const path = platformPackage.replace(/package\\.json$/, `vendor/${triple}/bin/codex`)\n if (existsSync(path)) {\n return path\n }\n } catch {}\n return undefined\n}\n\nfunction targetTriple(): string | undefined {\n const { platform, arch } = process\n if (platform === 'darwin') {\n return arch === 'arm64' ? 'aarch64-apple-darwin' : 'x86_64-apple-darwin'\n }\n if (platform === 'linux') {\n return arch === 'arm64' ? 'aarch64-unknown-linux-musl' : 'x86_64-unknown-linux-musl'\n }\n if (platform === 'win32') {\n return 'x86_64-pc-windows-msvc'\n }\n return undefined\n}\n\nfunction platformPackageSuffix(): string {\n return `${process.platform}-${process.arch}`\n}\n\nasync function checkCodexAvailability(\n profile: ProfileInfo,\n env: Record<string, string | undefined>,\n options: { timeoutMs?: number } = {},\n): Promise<EngineAvailability> {\n const executable = resolveBundledCodexExecutable()\n if (!executable) {\n return { available: false, reason: NOT_INSTALLED }\n }\n const childEnv = codexChildEnv(env, profile.codexHome)\n return new Promise((resolve) => {\n execFile(executable, ['login', 'status'], { env: childEnv, timeout: options.timeoutMs ?? 10_000 }, (error, stdout, stderr) => {\n if (!error) {\n resolve({ available: true })\n return\n }\n // The verdict line lands on stderr (0.146.0); check both streams so a future move doesn't\n // degrade every verdict to 'unknown'. Neither stream may reach `reason`: the success line\n // carries a masked key fragment.\n if (`${stdout}\\n${stderr}`.includes('Not logged in')) {\n // Presence checks on the NAMES only; values are never read.\n const hint = childEnv.CODEX_API_KEY\n ? ' CODEX_API_KEY is read only by `codex exec`, never by the app-server — run ' +\n '`codex login --with-api-key` under this profile’s CODEX_HOME to persist it.'\n : childEnv.OPENAI_API_KEY\n ? ' OPENAI_API_KEY is not used by codex — run `codex login --with-api-key` under this profile’s CODEX_HOME.'\n : ''\n resolve({\n available: false,\n reason:\n `codex is not logged in for this profile's environment — run \\`codex login\\`` +\n (profile.codexHome ? ` with CODEX_HOME=${profile.codexHome}` : '') +\n `.${hint}`,\n })\n return\n }\n // An errored probe (not a verdict) is not evidence of a missing login.\n resolve({ available: 'unknown' })\n })\n })\n}\n\nconst LIST_PAGE_SIZE = 100\nconst MAX_LIST_PAGES = 40\n\nfunction cwdFilter(dir: string): string[] {\n const forms = new Set([dir])\n try {\n forms.add(realpathSync(dir))\n } catch {}\n return [...forms]\n}\n\nfunction secondsToMs(value: number | null | undefined): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value * 1000 : undefined\n}\n\nfunction summarizeThread(row: AppServerThreadSummary): SdkSessionSummary {\n const name = typeof row.name === 'string' && row.name.length > 0 ? row.name : undefined\n const preview = typeof row.preview === 'string' && row.preview.length > 0 ? row.preview : undefined\n return {\n // The resume handle is the row's `id`; codex's own `sessionId` field is a different value.\n sessionId: row.id,\n summary: name ?? preview ?? row.id,\n lastModified: secondsToMs(row.updatedAt) ?? secondsToMs(row.createdAt) ?? 0,\n createdAt: secondsToMs(row.createdAt),\n customTitle: name,\n firstPrompt: preview,\n gitBranch: typeof row.gitInfo?.branch === 'string' && row.gitInfo.branch.length > 0 ? row.gitInfo.branch : undefined,\n cwd: typeof row.cwd === 'string' ? row.cwd : undefined,\n }\n}\n\nexport async function listCodexSessions(options: {\n connectFn: AppServerConnectFn\n profile?: ProfileInfo\n env: Record<string, string | undefined>\n dir?: string\n limit?: number\n offset?: number\n}): Promise<SdkSessionSummary[]> {\n const childEnv = codexChildEnv(options.env, options.profile?.codexHome)\n const connection = options.connectFn({ env: childEnv })\n const rows: AppServerThreadSummary[] = []\n try {\n await connection.request('initialize', INITIALIZE_PARAMS)\n connection.notify('initialized')\n const base: Record<string, unknown> = {\n limit: LIST_PAGE_SIZE,\n sortKey: 'updated_at',\n ...(options.dir ? { cwd: cwdFilter(options.dir) } : {}),\n }\n const want = options.limit === undefined ? undefined : (options.offset ?? 0) + options.limit\n let cursor: string | undefined\n for (let page = 0; page < MAX_LIST_PAGES; page++) {\n const result = (await connection.request('thread/list', {\n ...base,\n ...(cursor ? { cursor } : {}),\n })) as AppServerThreadListResponse\n const data = Array.isArray(result?.data) ? result.data : []\n rows.push(...data)\n if (want !== undefined && rows.length >= want) {\n break\n }\n if (data.length === 0 || typeof result?.nextCursor !== 'string') {\n break\n }\n cursor = result.nextCursor\n }\n } finally {\n connection.close()\n }\n const summaries = rows\n // An ephemeral thread was never materialized on disk — nothing to resume.\n .filter((row) => typeof row.id === 'string' && row.id.length > 0 && !row.ephemeral)\n .map(summarizeThread)\n const start = options.offset ?? 0\n return options.limit === undefined ? summaries.slice(start) : summaries.slice(start, start + options.limit)\n}\n\nexport const codexAdapter: EngineAdapter = {\n engine: 'codex',\n capabilities: ENGINE_CAPABILITIES.codex,\n catalog: CODEX_CATALOG,\n checkAvailability: (profile, env) => checkCodexAvailability(profile, env),\n createRunner({ config, profile, restore, id }) {\n if (restore) {\n throw new Error('the codex engine cannot rebuild a parked session')\n }\n const executable = (config as { codexPathOverride?: string }).codexPathOverride ?? resolveBundledCodexExecutable()\n if (!executable) {\n throw new Error(NOT_INSTALLED)\n }\n return new CodexRunner(\n {\n ...config,\n codexHome: profile?.codexHome,\n connectFn: (options) => connectAppServer({ executable, ...options }),\n },\n id,\n )\n },\n async listSessions(options) {\n const executable = resolveBundledCodexExecutable()\n if (!executable) {\n throw new Error(NOT_INSTALLED)\n }\n return listCodexSessions({\n ...options,\n connectFn: (connect) => connectAppServer({ executable, ...connect }),\n })\n },\n}\n","import { ENGINE_CAPABILITIES } from '@workerdeck/protocol'\nimport type { EngineAdapter } from '../adapter.ts'\n\nexport const providerAdapter: EngineAdapter = {\n engine: 'provider',\n capabilities: ENGINE_CAPABILITIES.provider,\n catalog: { models: [], provenance: 'provider model ids are operator-declared (provider.models)' },\n async checkAvailability(profile, env) {\n const keyEnv = profile.provider?.apiKeyEnv\n // The host hook may resolve credentials some other way: unknown, not unavailable.\n if (!keyEnv) {\n return { available: 'unknown' }\n }\n const value = env[keyEnv]\n if (value !== undefined && value !== '') {\n return { available: true }\n }\n return {\n available: false,\n reason: `${keyEnv} is not set in the server environment (profile '${profile.name}' names it as apiKeyEnv)`,\n }\n },\n createRunner() {\n throw new Error(\"provider-engine runners are built by the host's createEngineRunner hook, not the adapter\")\n },\n}\n","import type { EngineCapabilities, ModelOption, ProfileEngine, ProfileInfo, SdkSessionSummary } from '@workerdeck/protocol'\nimport type { Runner, RunnerSnapshot } from '../runner-interface.ts'\nimport type { SessionRunnerConfig } from './claude/runner.ts'\n\nexport type EngineAvailability = { available: true } | { available: false; reason: string } | { available: 'unknown' }\n\nexport type ModelCatalog = {\n models: ModelOption[]\n provenance: string\n}\n\nexport type EngineRunnerRequest = {\n config: SessionRunnerConfig\n profile?: ProfileInfo\n restore?: RunnerSnapshot\n id?: string\n}\n\nexport interface EngineAdapter {\n readonly engine: ProfileEngine\n readonly capabilities: EngineCapabilities\n readonly catalog: ModelCatalog\n checkAvailability(profile: ProfileInfo, env: Record<string, string | undefined>): Promise<EngineAvailability>\n createRunner(request: EngineRunnerRequest): Runner | Promise<Runner>\n listSessions?(options: {\n profile?: ProfileInfo\n env: Record<string, string | undefined>\n dir?: string\n limit?: number\n offset?: number\n }): Promise<SdkSessionSummary[]>\n}\n\nimport { claudeAdapter } from './claude/adapter.ts'\nimport { codexAdapter } from './codex/adapter.ts'\nimport { providerAdapter } from './provider/adapter.ts'\n\nconst ADAPTERS: Record<ProfileEngine, EngineAdapter> = {\n claude: claudeAdapter,\n codex: codexAdapter,\n provider: providerAdapter,\n}\n\nexport function getEngineAdapter(engine: ProfileEngine | undefined): EngineAdapter {\n return ADAPTERS[engine ?? 'claude']\n}\n"],"mappings":";;;;;;;;;;;;;AAUA,MAAM,cAAc,IAAI,IAAI;CAAC;CAAc;CAAa;CAAa;CAAa,CAAC;AAEnF,MAAM,aAAa,IAAI,IAAI;CACzB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,SAAgB,mBAAmB,WAA2B;AAC5D,QAAO,UAAU,MAAM,IAAI,CAAC,GAAI,MAAM,CAAC,aAAa;;AAGtD,SAAgB,eAAe,WAA0C;CACvE,MAAM,OAAO,mBAAmB,UAAU;AAC1C,KAAI,YAAY,IAAI,KAAK,CACvB,QAAO;AAET,KAAI,SAAS,kBACX,QAAO;AAET,KAAI,KAAK,WAAW,QAAQ,IAAI,WAAW,IAAI,KAAK,CAClD,QAAO;AAET,QAAO;;AAGT,MAAa,6BAA6B;CAAC,GAAG;CAAa;CAAmB;CAAS,CAAC,KAAK,KAAK;AAElG,SAAgB,wBAAwB,aAAyE;AAC/G,QAAO,YAAY,KAAK,eAAe;EACrC,MAAM,YAAY,mBAAmB,WAAW,UAAU;AAC1D,UAAQ,eAAe,UAAU,EAAjC;GACE,KAAK,QACH,QAAO;IACL,MAAM;IACN,QAAQ;KAAE,MAAM;KAAU,YAAY;KAAW,MAAM,WAAW;KAAM;IACzE;GAEH,KAAK,WACH,QAAO;IACL,MAAM;IACN,QAAQ;KAAE,MAAM;KAAU,YAAY;KAAW,MAAM,WAAW;KAAM;IACxE,OAAO,WAAW;IACnB;GAEH,KAAK,OACH,QAAO;IACL,MAAM;IACN,MAAM,qBAAqB,WAAW,KAAK,UAAU,UAAU,MAAM,WAAW,WAAW,KAAK,CAAC;IAClG;GAEH,QACE,OAAM,IAAI,MAAM,sCAAsC,WAAW,YAAY;;GAGjF;;AAGJ,SAAgB,cAAc,YAAgD;AAC5E,QAAO;EACL,IAAI,WAAW;EACf,MAAM,WAAW;EACjB,WAAW,WAAW;EACtB,OAAO,WAAW;EACnB;;AAGH,SAAS,WAAW,QAAwB;AAC1C,QAAO,OAAO,KAAK,QAAQ,SAAS,CAAC,SAAS,OAAO;;;;ACnFvD,IAAa,aAAb,MAAiE;CAC/D,UAA4B,EAAE;CAC9B,UAAqE;CACrE,QAAQ;CAER,KAAK,SAA+B;AAClC,MAAI,MAAA,KACF;AAEF,MAAI,MAAA,QAAc;GAChB,MAAM,UAAU,MAAA;AAChB,SAAA,SAAe;AACf,WAAQ;IAAE,OAAO;IAAS,MAAM;IAAO,CAAC;QAExC,OAAA,OAAa,KAAK,QAAQ;;CAI9B,MAAY;AACV,MAAI,MAAA,KACF;AAEF,QAAA,OAAa;AACb,MAAI,MAAA,QAAc;GAChB,MAAM,UAAU,MAAA;AAChB,SAAA,SAAe;AACf,WAAQ;IAAE,OAAO,KAAA;IAAW,MAAM;IAAM,CAAC;;;CAI7C,CAAC,OAAO,iBAAgD;AACtD,SAAO;GACL,YAAqD;IACnD,MAAM,WAAW,MAAA,OAAa,OAAO;AACrC,QAAI,aAAa,KAAA,EACf,QAAO,QAAQ,QAAQ;KAAE,OAAO;KAAU,MAAM;KAAO,CAAC;AAE1D,QAAI,MAAA,KACF,QAAO,QAAQ,QAAQ;KAAE,OAAO,KAAA;KAAW,MAAM;KAAM,CAAC;AAE1D,WAAO,IAAI,SAAS,YAAY;AAC9B,WAAA,SAAe;MACf;;GAEJ,cAAuD;AACrD,SAAK,KAAK;AACV,WAAO,QAAQ,QAAQ;KAAE,OAAO,KAAA;KAAW,MAAM;KAAM,CAAC;;GAE3D;;;;;AChDL,MAAM,kBAAkB;AAGxB,MAAM,cAAc;AAEpB,SAAS,SAAS,OAAiE;CACjF,MAAM,OAAoB,EAAE;CAC5B,IAAI,QAAQ;AACZ,MAAK,MAAM,QAAQ,OAAO;AACxB,MAAI,QAAQ,KAAK,MAAM,SAAS,mBAAmB,KAAK,SAAS,EAC/D,QAAO;GAAE,OAAO;GAAM,WAAW;GAAM;AAEzC,OAAK,KAAK,KAAK;AACf,WAAS,KAAK,MAAM;;AAEtB,QAAO,EAAE,OAAO,MAAM;;AAGxB,SAAS,OAAO,OAAoC;CAClD,MAAM,OAAO;AACb,QACE,CAAC,CAAC,QACF,OAAO,KAAK,aAAa,YACzB,OAAO,KAAK,aAAa,YACzB,OAAO,KAAK,aAAa,YACzB,OAAO,KAAK,aAAa,YACzB,MAAM,QAAQ,KAAK,MAAM,IACzB,KAAK,MAAM,OAAO,SAAS,OAAO,SAAS,SAAS;;AAIxD,SAAgB,wBAAwB,QAAwC;CAC9E,MAAM,SAAS;AACf,KAAI,CAAC,UAAU,CAAC,MAAM,QAAQ,OAAO,gBAAgB,CACnD;CAEF,MAAM,QAAQ,OAAO,gBAAgB,OAAO,OAAO;AACnD,KAAI,MAAM,WAAW,EACnB;CAEF,MAAM,EAAE,OAAO,MAAM,cAAc,SAAS,MAAM;AAClD,QAAO;EACL,GAAI,OAAO,OAAO,aAAa,YAAY,EAAE,MAAM,OAAO,UAAU;EACpE,GAAI,OAAO,SAAS,YAAY,OAAO,iBAAiB,OACnD,EAAE,MAAM,UAAU,GACnB,OAAO,SAAS,YAAY,OAAO,OAAO,iBAAiB,WACxD,EAAE,MAAM,UAAU,GACnB,EAAE;EACR,OAAO;EACP,GAAI,aAAa,EAAE,WAAW;EAC/B;;AAGH,SAAgB,iBAAiB,MAAc,MAAsC;CACnF,MAAM,QAAqB,EAAE;CAC7B,IAAI;AACJ,MAAK,MAAM,QAAQ,KAAK,MAAM,KAAK,EAAE;EACnC,MAAM,SAAS,YAAY,KAAK,KAAK;AACrC,MAAI,QAAQ;AACV,aAAU;IACR,UAAU,OAAO,OAAO,GAAG;IAC3B,UAAU,OAAO,OAAO,KAAA,IAAY,IAAI,OAAO,OAAO,GAAG;IACzD,UAAU,OAAO,OAAO,GAAG;IAC3B,UAAU,OAAO,OAAO,KAAA,IAAY,IAAI,OAAO,OAAO,GAAG;IACzD,OAAO,EAAE;IACV;AACD,SAAM,KAAK,QAAQ;AACnB;;AAEF,MAAI,CAAC,QACH;AAEF,MAAI,KAAK,WAAW,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,WAAW,IAAI,CACtE,SAAQ,MAAM,KAAK,KAAK;WACf,SAAS,GAGlB,SAAQ,MAAM,KAAK,IAAI;MAEvB,WAAU,KAAA;;AAGd,KAAI,MAAM,WAAW,EACnB;CAEF,MAAM,EAAE,OAAO,MAAM,cAAc,SAAS,MAAM;AAClD,QAAO;EAAE,GAAI,QAAQ,EAAE,MAAM;EAAG,OAAO;EAAM,GAAI,aAAa,EAAE,WAAW;EAAG;;;;ACpFhF,MAAM,eAAe;CAAC;CAAS;CAAQ;CAAU;CAAQ;AAEzD,SAAS,iBAAiB,SAA8B;CACtD,MAAM,UAAU,QAAQ;AACxB,KAAI,CAAC,MAAM,QAAQ,QAAQ,CACzB,QAAO;AAET,QAAO,QAAQ,QAAQ,UAAU,MAAM,SAAS,cAAc,CAAC,WAAW;;AAG5E,MAAM,0BAA0B,CAAC,uBAAuB,yBAAyB;AAEjF,SAAgB,oBAAoB,SAA8B;CAChE,MAAM,UAAU,QAAQ;CACxB,MAAM,OACJ,OAAO,YAAY,WACf,UACA,MAAM,QAAQ,QAAQ,GACpB,QAAQ,MAAM,UAA8B,MAAM,SAAS,OAAO,EAAE,OACpE,KAAA;AACR,KAAI,OAAO,SAAS,SAClB,QAAO;CAET,MAAM,OAAO,KAAK,WAAW;AAC7B,QAAO,wBAAwB,MAAM,WAAW,KAAK,WAAW,OAAO,CAAC;;AAG1E,SAAgB,aAAa,SAA8B;CACzD,MAAM,IAAI;AAOV,QAAO;EACL,MAAM,EAAE,QAAQ;EAChB,SAAS,EAAE;EACX,OAAO,EAAE;EACT,aAAa,EAAE;EACf,OAAO,EAAE;EACV;;AAkBH,SAAgB,yBAAyB,OAA4C;AACnF,KAAI,CAAC,MAAM,yBAAyB,CAAC,MAAM,YACzC,QAAO,EAAE;CAEX,MAAM,SAAS,MAAM;CACrB,MAAM,SAA6B,EAAE;CACrC,MAAM,uBAAO,IAAI,KAAa;CAC9B,MAAM,QAAQ,eAAuB,WAA8B;AACjE,MAAI,CAAC,UAAU,OAAO,gBAAgB,QAAQ,KAAK,IAAI,cAAc,CACnE;AAEF,OAAK,IAAI,cAAc;EACvB,MAAM,WAAW,OAAO,YAAY,KAAK,MAAM,OAAO,UAAU,GAAG;AACnE,SAAO,KAAK;GACV,MAAM;GACN,MAAM;IACJ,QAAQ;IACR;IACA,aAAa,OAAO;IACpB,GAAI,OAAO,SAAS,SAAS,GAAG,EAAE,UAAU,WAAW,KAAM,GAAG,EAAE;IACnE;GACF,CAAC;;AAEJ,MAAK,aAAa,OAAO,UAAU;AACnC,MAAK,aAAa,OAAO,UAAU;AACnC,MAAK,kBAAkB,OAAO,eAAe;AAC7C,MAAK,oBAAoB,OAAO,iBAAiB;AACjD,MAAK,wBAAwB,OAAO,qBAAqB;AACzD,MAAK,MAAM,UAAU,OAAO,gBAAgB,EAAE,EAAE;EAC9C,MAAM,OAAO,OAAO,aACjB,MAAM,CACN,aAAa,CACb,QAAQ,eAAe,IAAI;AAC9B,MAAI,KACF,MAAK,aAAa,QAAQ,OAAO;;AAGrC,QAAO;;AAKT,SAAgB,cAAc,QAA8C;CAC1E,MAAM,SAAS,OAAO;CACtB,MAAM,YAAY,QAAQ,SAAS,QAAQ,UAAU,UAAU,KAAA;AAC/D,QAAO;EACL,MAAM,OAAO;EACb,QAAQ,OAAO;EACf,OAAO,OAAO;EACd,OAAO,OAAO;EACd,YAAY,OAAO;EACnB,WAAW,cAAc,WAAW,cAAc,UAAU,cAAc,SAAS,cAAc,QAAQ,YAAY,KAAA;EACrH,SAAS,QAAQ;EACjB,MAAM,QAAQ;EACd,KAAK,QAAQ;EACb,OAAO,OAAO,OAAO,KAAK,UAAU;GAClC,MAAM,KAAK;GACX,aAAa,KAAK;GAClB,aAAa,KAAK;GACnB,EAAE;EACJ;;AAYH,SAAgB,oBAAoB,QAAqD;AACvF,QAAO,OAAO,MAAM,UAAU,MAAM,UAAU,UAAU,EAAE;;AAG5D,SAAgB,oBAAoB,QAAgD;CAClF,MAAM,OAAO,OAAO,QAAQ,UAAU,MAAM,UAAU,UAAU;CAChE,MAAM,gCAAgB,IAAI,KAAqB;AAC/C,MAAK,MAAM,SAAS,MAAM;EACxB,MAAM,UAAU,kBAAkB,MAAM,iBAAiB,MAAM,MAAM;AACrE,MAAI,QACF,eAAc,IAAI,UAAU,cAAc,IAAI,QAAQ,IAAI,KAAK,EAAE;;CAIrE,MAAM,+BAAe,IAAI,KAAa;AAgBtC,QAf+B,KAAK,KAAK,UAAU;EACjD,MAAM,SAAS,YAAY,MAAM,iBAAiB,MAAM,MAAM;EAC9D,MAAM,UAAU,CAAC,aAAa,IAAI,OAAO;AACzC,eAAa,IAAI,OAAO;EACxB,MAAM,UAAU,kBAAkB,MAAM,iBAAiB,MAAM,MAAM;AACrE,SAAO;GACL,OAAO,MAAM;GACb,eAAe,MAAM;GACrB,aAAa,WAAW,cAAc,IAAI,QAAQ,KAAK,IAAI,UAAU,MAAM;GAC3E,aAAa,MAAM;GACnB;GACA,kBAAkB,MAAM,0BAA0B,MAAM,mBAAmB,QAAQ,EAAE,GAAG,KAAA;GACzF;GAGW,CACX,KAAK,QAAQ,WAAW;EAAE;EAAQ;EAAO,EAAE,CAC3C,MAAM,GAAG,MAAM;EACd,MAAM,QAAQ,WAAW,EAAE,OAAO;EAClC,MAAM,QAAQ,WAAW,EAAE,OAAO;AAClC,SAAO,UAAU,QAAQ,EAAE,QAAQ,EAAE,QAAQ,QAAQ;GACrD,CACD,KAAK,EAAE,aAAa,OAAO;;AAGhC,SAAS,WAAW,QAA6B;CAC/C,MAAM,OAAO,aAAa,QAAQ,YAAY,OAAO,iBAAiB,OAAO,MAAM,CAAC;AACpF,QAAO,SAAS,KAAK,aAAa,SAAS;;AAI7C,SAAS,aAAa,IAAsB;CAE1C,MAAM,SADiB,GAAG,MAAM,IAAI,CAAC,MAAM,IACd,aAAa,CAAC,MAAM,IAAI,CAAC,OAAO,QAAQ;AACrE,KAAI,MAAM,OAAO,SACf,OAAM,OAAO;AAEf,QAAO;;AAGT,SAAgB,kBAAkB,IAA2B;CAC3D,MAAM,QAAQ,aAAa,GAAG;CAC9B,MAAM,SAAS,MAAM,OAAO;AAC5B,KAAI,CAAC,OACH,QAAO;CAET,MAAM,UAAU,MAAM,QAAQ,SAAS,CAAC,UAAU,KAAK,KAAK,CAAC;AAC7D,KAAI,QAAQ,WAAW,KAAK,QAAQ,MAAM,SAAS,CAAC,QAAQ,KAAK,KAAK,CAAC,CACrE,QAAO;AAET,QAAO,GAAG,OAAO,OAAO,EAAE,CAAC,aAAa,GAAG,OAAO,MAAM,EAAE,CAAC,GAAG,QAAQ,KAAK,IAAI;;AAGjF,SAAS,YAAY,IAAoB;AAEvC,QADc,aAAa,GACf,CAAC,MAAM;;AAGrB,SAAgB,oBAAoB,KAA0C;AAC5E,SAAQ,IAAI,MAAZ;EACE,KAAK,YACH,QAAO;GACL,MAAM;GACN,SAAS,aAAa,IAAI,QAAQ;GAClC,iBAAiB,IAAI;GACrB,MAAM,IAAI;GACX;EAEH,KAAK,QAAQ;GACX,MAAM,UAAU,aAAa,IAAI,QAAQ;AACzC,UAAO;IACL,MAAM;IACN;IACA,iBAAiB,IAAI;IACrB,QAAQ,cAAc,OAAO,IAAI,aAAa,OAAO,OAAO,KAAA;IAC5D,WAAW,IAAI,gBAAgB,QAAQ,IAAI,QAAQ,SAAS,uBAAuB,oBAAoB,QAAQ,GAAG,OAAO,KAAA;IACzH,OAAO,iBAAiB,QAAQ,GAAG,wBAAwB,IAAI,gBAAgB,GAAG,KAAA;IAClF,MAAM,IAAI;IACX;;EAEH,KAAK,eACH,QAAO;GACL,MAAM;GACN,OAAO,IAAI;GACX,iBAAiB,IAAI;GACrB,MAAM,IAAI;GACX;EAEH,KAAK,SACH,QAAO;GACL,MAAM;GACN,SAAS,IAAI;GACb,SAAS,IAAI;GACb,YAAY,IAAI;GAChB,UAAU,IAAI;GACd,cAAc,IAAI;GAClB,QAAQ,IAAI,YAAY,YAAY,IAAI,SAAS,KAAA;GACjD,QAAQ,IAAI,YAAY,YAAY,KAAA,IAAY,IAAI;GACpD,OAAO,IAAI;GACZ;EAEH,KAAK,qBACH,QAAO;GAAE,MAAM;GAAsB,cAAc,IAAI;GAAqB;EAE9E,KAAK,mBACH,QAAO;GACL,MAAM;GACN,MAAM;IACJ,QAAQ,IAAI,gBAAgB;IAC5B,eAAe,IAAI,gBAAgB;IACnC,aAAa,IAAI,gBAAgB;IACjC,UAAU,IAAI,gBAAgB;IAC9B,gBAAgB,IAAI,gBAAgB;IACrC;GACF;EAEH,KAAK;AACH,OAAI,IAAI,YAAY,UAAU,IAAI,YAAY,wBAC5C,QAAO;AAET,UAAO;IAAE,MAAM;IAAa,SAAS;IAAoC;EAE3E,QACE,QAAO;GAAE,MAAM;GAAa,SAAS;GAAoC;;;;;ACxQ/E,IAAa,WAAb,MAAsB;CACpB,UAA0B,EAAE;CAC5B,OAAO;CACP,iBAAiB;CACjB,cAAc;CACd;CACA,YAAY;CACZ;CAEA,IAAI,SAAkC;AACpC,SAAO,MAAA;;CAGT,IAAI,MAAc;AAChB,SAAO,MAAA;;CAGT,IAAI,gBAAwB;AAC1B,SAAO,MAAA;;;CAIT,IAAI,aAAqB;AACvB,SAAO,MAAA;;CAGT,IAAI,eAA2C;AAC7C,SAAO,MAAA;;CAGT,IAAI,WAAmB;AACrB,SAAO,MAAA;;CAGT,IAAI,iBAAqC;AACvC,SAAO,MAAA;;CAGT,OAAO,MAAsC;EAC3C,MAAM,QAAsB;GAAE,GAAG;GAAM,KAAK,EAAE,MAAA;GAAW,IAAI,KAAK,KAAK;GAAE;AACzE,QAAA,iBAAuB,MAAM;AAC7B,QAAA,KAAW,MAAM;AACjB,QAAA,OAAa,KAAK,MAAM;AACxB,SAAO;;CAGT,GAAG,KAAuC;AACxC,SAAO,MAAA,OAAa,MAAM,UAAU,MAAM,QAAQ,IAAI;;CAGxD,QAAQ,QAAiC,KAAa,gBAA0C;AAC9F,QAAA,SAAe,CAAC,GAAG,OAAO;AAC1B,QAAA,MAAY;AACZ,QAAA,gBAAsB;AACtB,QAAA,aAAmB;AACnB,QAAA,eAAqB,KAAA;AACrB,QAAA,WAAiB;AACjB,OAAK,MAAM,SAAS,MAAA,OAClB,OAAA,KAAW,MAAM;AAEnB,QAAA,iBAAuB;;CAGzB,MAAM,OAA2B;AAC/B,QAAA,iBAAuB,mBAAmB,MAAM;AAChD,QAAA,cAAoB,gBAAgB,MAAM;AAC1C,QAAA,eAAqB,eAAe,MAAM,IAAI,MAAA;AAC9C,MAAI,MAAM,SAAS,sBAAsB;AACvC,SAAA,WAAiB,MAAM;AACvB,SAAA,eAAqB,KAAA;;;;;;ACpE3B,SAAgB,gBAAgB,QAAiC,UAA+B;CAC9F,MAAM,wBAAQ,IAAI,KAAa;CAC/B,MAAM,uBAAO,IAAI,KAAa;AAC9B,MAAK,IAAI,QAAQ,OAAO,SAAS,GAAG,SAAS,GAAG,SAAS;EACvD,MAAM,QAAQ,OAAO;AACrB,MAAI,MAAM,OAAO,SACf;EAEF,MAAM,MAAM,kBAAkB,MAAM;AACpC,MAAI,QAAQ,KAAA,EACV;AAEF,MAAI,KAAK,IAAI,IAAI,CACf,OAAM,IAAI,MAAM,IAAI;MAEpB,MAAK,IAAI,IAAI;;AAGjB,QAAO;;AAGT,SAAgB,YACd,QACA,SAOgB;CAChB,MAAM,EAAE,UAAU,WAAW,GAAG,gBAAgB,iBAAiB,cAAc;CAC/E,MAAM,QAAQ,iBAAiB,gBAAgB,QAAQ,SAAS,GAAG,KAAA;CACnE,MAAM,UAAU,OAAO,OAAO,SAAS,IAAI,OAAO;CAClD,MAAM,MAAsB,EAAE;AAC9B,MAAK,MAAM,SAAS,QAAQ;AAC1B,MAAI,MAAM,OAAO,SACf;AAEF,MAAI,MAAM,MAAM,YAAY,kBAAkB,MAAM,CAClD;AAEF,MAAI,OAAO,IAAI,MAAM,IAAI,CACvB;AAEF,MAAI,kBAAkB,MAAM,QAAQ,WAAW,CAAC,cAAc,MAAM,CAClE;EAGF,IAAI,YAAY;AAChB,MAAI,UACF,aAAY,cAAc,UAAU;AAEtC,MAAI,gBACF,aAAY,qBAAqB,UAAU;AAE7C,MAAI,KAAK,UAAU;;AAErB,QAAO;;AAGT,SAAgB,qBAAqB,OAAmC;AACtE,KAAI,MAAM,SAAS,eACjB,QAAO;CAET,MAAM,UAAU,MAAM,QAAQ;AAC9B,KAAI,CAAC,MAAM,QAAQ,QAAQ,CACzB,QAAO;CAET,IAAI,MAAM;CACV,MAAM,SAAS,QAAQ,KAAK,UAAU;AACpC,MAAI,MAAM,SAAS,cACjB,QAAO;EAET,MAAM,SAAS;AACf,MAAI,OAAO,UACT,QAAO;EAET,MAAM,QAAQ,YAAY,OAAO,QAAQ;AACzC,MAAI,SAAS,uBACX,QAAO;AAET,QAAM;AACN,SAAO;GACL,GAAG;GACH,SAAS,OAAO,OAAO,SAAS,uBAAuB;GACvD,WAAW;GACX,aAAa;GACd;GACD;AACF,KAAI,CAAC,IACH,QAAO;AAET,QAAO;EAAE,GAAG;EAAO,SAAS;GAAE,GAAG,MAAM;GAAS,SAAS;GAAQ;EAAE;;AAGrE,SAAS,YAAY,SAA6C;AAChE,KAAI,OAAO,YAAY,SACrB,QAAO,QAAQ;AAEjB,KAAI,CAAC,MAAM,QAAQ,QAAQ,CACzB,QAAO;AAET,QAAO,QAAQ,QAAQ,OAAO,MAAM,UAAU,SAAS,OAAO,KAAK,SAAS,WAAW,KAAK,KAAK,UAAU,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE;;AAGxI,SAAS,OAAO,SAAqC,OAA2C;AAC9F,KAAI,OAAO,YAAY,SACrB,QAAO,QAAQ,MAAM,GAAG,MAAM;AAEhC,KAAI,CAAC,MAAM,QAAQ,QAAQ,CACzB,QAAO;CAET,MAAM,QAAwE,EAAE;CAChF,IAAI,OAAO;AACX,MAAK,MAAM,QAAQ,SAAS;AAC1B,MAAI,KAAK,SAAS,aAAa;AAC7B,SAAM,KAAK,KAAK;AAChB;;AAEF,MAAI,OAAO,KAAK,SAAS,SACvB;AAGF,MAAI,QAAQ,MACV;EAEF,MAAM,OAAO,KAAK,KAAK,MAAM,GAAG,QAAQ,KAAK;AAC7C,QAAM,KAAK;GAAE,GAAG;GAAM;GAAM,CAAC;AAC7B,UAAQ,KAAK,SAAS;;AAExB,QAAO;;AAGT,SAAgB,cAAc,OAAmC;AAC/D,KAAI,MAAM,SAAS,eACjB,QAAO;CAET,MAAM,UAAU,MAAM,QAAQ;AAC9B,KAAI,CAAC,MAAM,QAAQ,QAAQ,CACzB,QAAO;CAET,IAAI,UAAU;CACd,MAAM,SAAS,QAAQ,KAAK,UAAU;AACpC,MAAI,MAAM,SAAS,cACjB,QAAO;EAET,MAAM,SAAS;EACf,MAAM,QAAQ,OAAO;AACrB,MAAI,CAAC,MAAM,QAAQ,MAAM,CACvB,QAAO;EAET,IAAI,eAAe;EACnB,MAAM,SAAS,MAAM,KAAK,MAAM,UAAU;GACxC,MAAM,MAAM,aAAa,MAAM,MAAM;AACrC,OAAI,CAAC,IACH,QAAO;AAET,kBAAe;AACf,UAAO;IACP;AACF,MAAI,CAAC,aACH,QAAO;AAET,YAAU;AACV,SAAO;GAAE,GAAG;GAAQ,SAAS;GAAQ;GACrC;AACF,KAAI,CAAC,QACH,QAAO;AAET,QAAO;EAAE,GAAG;EAAO,SAAS;GAAE,GAAG,MAAM;GAAS,SAAS;GAAQ;EAAE;;;;AC1KrE,IAAa,gBAAb,MAA2B;CACzB,6BAAsB,IAAI,KAA6C;CAIvE,UACE,QACA,UACA,WAAW,GACX,SACA,WAAW,GACC;EACZ,MAAM,QAAQ,WAAW,EAAE;AAC3B,OAAK,MAAM,SAAS,YAAY,QAAQ;GAAE,GAAG;GAAO;GAAU;GAAU,CAAC,CACvE,UAAS,MAAM;AAEjB,QAAA,UAAgB,IAAI,UAAU,MAAM;AACpC,eAAa;AACX,SAAA,UAAgB,OAAO,SAAS;;;CAIpC,QAAc;AACZ,QAAA,UAAgB,OAAO;;CAGzB,KAAK,OAA2B;AAC9B,OAAK,MAAM,CAAC,UAAU,UAAU,MAAA,UAC9B,KAAI;AACF,YAAS,MAAM,YAAY,cAAc,MAAM,GAAG,MAAM;UAClD;;;;;ACpCd,SAAgB,UAAU,MAAwD;CAChF,MAAM,QAAQ,MAAM;AACpB,QAAO,OAAO,UAAU,YAAY,MAAM,SAAS,IAAI,QAAQ,KAAA;;AAGjE,SAAgB,aAAa,QAAqB,aAA0C;CAC1F,MAAM,OAAO,UAAU,OAAO,KAAK;AACnC,KAAI,KACF,QAAO;AAET,KAAI,YACF,QAAO;CAET,MAAM,SAAS,OAAO;AACtB,KAAI,CAAC,OACH;AAEF,QAAO,OAAO,SAAS,KAAK,OAAO,MAAM,GAAG,GAAG,GAAG,MAAM;;AAG1D,SAAgB,UAAiC,QAAW,OAA8B;CACxF,MAAM,OAAO,EAAE,GAAG,OAAO,MAAM;AAC/B,KAAI,MACF,MAAK,QAAQ;KAEb,QAAO,KAAK;AAEd,QAAO;EAAE,GAAG;EAAQ;EAAM;;;;ACxB5B,MAAM,gBAAgB,IAAI,IAAI,CAAC,QAAQ,QAAQ,CAAC;AAEhD,IAAa,kBAAb,MAA6B;CAC3B,2BAAW,IAAI,KAA8B;CAC7C,iBAAiB;CAEjB,QAAQ,MAAwB,IAAkB;AAChD,UAAQ,KAAK,MAAb;GACE,KAAK;AACH,QAAI,KAAK,mBAAmB,MAAM;KAChC,MAAM,SAAS,MAAA,UAAgB,KAAK,iBAAiB,GAAG;AACxD,YAAO,aAAa,cAAc,KAAK,QAAQ,QAAQ,CAAC;AACxD;;AAEF,SAAK,MAAM,SAAS,cAAc,KAAK,QAAQ,QAAQ,EAAE;AACvD,SAAI,CAAC,cAAc,IAAI,MAAM,KAAK,CAChC;AAEF,WAAA,KAAW,OAAO,GAAG;;AAEvB;GAEF,KAAK,gBAAgB;AACnB,QAAI,KAAK,mBAAmB,MAAM;AAChC,WAAA,UAAgB,KAAK,iBAAiB,GAAG;AACzC;;IAEF,MAAM,OAAO,sBAAsB,UAAU,KAAK,QAAQ,QAAQ,CAAC;AACnE,QAAI,MAAM;KACR,MAAM,SAAS,MAAA,UAAgB,KAAK,WAAW,GAAG;KAClD,MAAM,SAAS,KAAK,WAAW,cAAc,SAAS;AACtD,SAAI,OAAO,WAAW,OACpB,OAAA,OAAa,QAAQ,OAAO;AAE9B;;IAEF,MAAM,UAAU,KAAK,QAAQ;AAC7B,QAAI,OAAO,YAAY,SACrB;AAEF,SAAK,MAAM,SAAS,SAAS;AAC3B,SAAI,MAAM,SAAS,cACjB;KAEF,MAAM,SAAS;AAKf,SAAI,OAAO,OAAO,gBAAgB,SAChC;AAEF,SAAI,OAAO,aAAa,QAAQ,YAAY,OAAO,QAAQ,EAAE;MAC3D,MAAM,SAAS,MAAA,UAAgB,OAAO,aAAa,GAAG;AACtD,UAAI,OAAO,eAAe,OACxB,QAAO,aAAa,KAAK,WAAW,OAAO,WAAW;AAExD;;KAEF,MAAM,SAAS,MAAA,QAAc,IAAI,OAAO,YAAY;AACpD,SAAI,CAAC,OACH;AAEF,SAAI,OAAO,aAAa,QAAQ,OAAO,eAAe,KAAA,EACpD;KAEF,MAAM,SAAS,OAAO,aAAa,OAAO,WAAW;AACrD,SAAI,OAAO,WAAW,OACpB;AAEF,WAAA,OAAa,QAAQ,OAAO;;AAE9B;;GAEF,KAAK,aAAa;IAChB,MAAM,IAAI,KAAK;AAQf,QAAI,EAAE,SAAS,YAAY,OAAO,EAAE,gBAAgB,SAClD;AAEF,QAAI,EAAE,YAAY,gBAAgB;KAChC,MAAM,SAAS,MAAA,UAAgB,EAAE,aAAa,GAAG;AACjD,YAAO,aAAa;AACpB,YAAO,cAAc,QAAQ,EAAE,cAAc;AAC7C,YAAO,gBAAgB,QAAQ,EAAE,YAAY;AAC7C;;AAEF,QAAI,EAAE,YAAY,qBAAqB;KACrC,MAAM,SAAS,MAAA,UAAgB,EAAE,aAAa,GAAG;KACjD,MAAM,SAAS,EAAE,WAAW,cAAc,SAAS;AACnD,SAAI,OAAO,WAAW,OACpB,OAAA,OAAa,QAAQ,OAAO;AAE9B;;AAEF;;GAEF,KAAK;AACH,UAAA,MAAY,MAAM;AAClB;GAEF,KAAK;AACH,UAAA,MAAY,KAAK;AACjB;GAEF,KAAK;AACH,QAAI,KAAK,WAAW,OAClB,OAAA,MAAY,MAAM;aACT,KAAK,WAAW,YAAY,KAAK,WAAW,SACrD,OAAA,MAAY,KAAK;AAEnB;GAEF,KAAK;AACH,UAAA,QAAc,OAAO;AACrB;GAEF,QACE;;;CAKN,OAAmC;AACjC,MAAI,MAAA,QAAc,SAAS,EACzB;EAEF,MAAM,MAAsB,EAAE;AAC9B,OAAK,MAAM,KAAK,MAAA,QAAc,QAAQ,CACpC,KAAI,KAAK;GACP,WAAW,EAAE;GACb,WAAW,EAAE;GACb,aAAa,EAAE;GACf,QAAQ,EAAE;GACV,WAAW,EAAE;GACb,WAAW,EAAE;GACd,CAAC;AAEJ,SAAO;;CAGT,WAAW,WAAmB,IAA6B;EACzD,IAAI,SAAS,MAAA,QAAc,IAAI,UAAU;AACzC,MAAI,CAAC,QAAQ;AACX,YAAS;IAAE;IAAW,QAAQ;IAAW,WAAW;IAAI,WAAW;IAAG;AACtE,SAAA,QAAc,IAAI,WAAW,OAAO;;AAEtC,SAAO;;CAGT,MAAM,OAAuC,IAAkB;EAC7D,MAAM,SAAS,MAAA,UAAgB,MAAM,IAAI,GAAG;EAC5C,MAAM,QAAQ,MAAM;AACpB,SAAO,cAAc,QAAQ,OAAO,cAAc;AAClD,SAAO,gBAAgB,QAAQ,OAAO,YAAY;;CAGpD,OAAO,OAAsB;AAC3B,OAAK,MAAM,UAAU,MAAA,QAAc,QAAQ,EAAE;AAC3C,OAAI,OAAO,WAAW,UACpB;AAEF,OAAI,CAAC,SAAS,OAAO,eAAe,OAClC;AAEF,SAAA,OAAa,QAAQ,SAAS;;;CAIlC,QAAQ,QAAyB,QAAiC;AAChE,SAAO,SAAS;AAChB,SAAO,eAAe,EAAE,MAAA;EACxB,IAAI,UAAU;AACd,OAAK,MAAM,KAAK,MAAA,QAAc,QAAQ,CACpC,KAAI,EAAE,iBAAiB,KAAA,EACrB;AAGJ,SAAO,UAAU,kBAAkB;GACjC,IAAI;GACJ,IAAI,cAAc;AAClB,QAAK,MAAM,KAAK,MAAA,QAAc,QAAQ,EAAE;AACtC,QAAI,EAAE,iBAAiB,KAAA,KAAa,EAAE,gBAAgB,YACpD;AAEF,eAAW,EAAE;AACb,kBAAc,EAAE;;AAElB,OAAI,aAAa,KAAA,EACf;AAEF,SAAA,QAAc,OAAO,SAAS;AAC9B;;;;AAKN,SAAS,YAAY,SAA2B;CAC9C,MAAM,OAAO,OAAO,YAAY,WAAW,UAAU,UAAU,MAAM,QAAQ,QAAQ,GAAG,UAAU,EAAE,CAAC;AACrG,QAAO,OAAO,SAAS,YAAY,KAAK,WAAW,CAAC,WAAW,uBAAuB;;AAGxF,SAAS,sBAAsB,MAA6E;AAC1G,KAAI,SAAS,KAAA,KAAa,CAAC,KAAK,WAAW,CAAC,WAAW,sBAAsB,CAC3E;CAEF,MAAM,YAAY,8CAA8C,KAAK,KAAK,GAAG;AAC7E,KAAI,cAAc,KAAA,EAChB;AAGF,QAAO;EAAE;EAAW,QADL,mCAAmC,KAAK,KAAK,GAAG,MAAM;EACzC;;AAG9B,SAAS,UAAU,SAAkE;AACnF,KAAI,OAAO,YAAY,SACrB,QAAO;AAET,MAAK,MAAM,SAAS,SAAS;EAC3B,MAAM,IAAI;AACV,MAAI,GAAG,SAAS,UAAU,OAAO,EAAE,SAAS,SAC1C,QAAO,EAAE;;;AAMf,SAAS,QAAQ,OAAoC;AACnD,KAAI,OAAO,UAAU,SACnB;CAEF,MAAM,OAAO,MAAM,MAAM;AACzB,KAAI,SAAS,GACX;AAEF,QAAO,KAAK,SAAS,KAAK,KAAK,MAAM,GAAG,GAAG,GAAG,MAAM;;AAGtD,SAAS,cAAc,SAAuF;AAC5G,KAAI,OAAO,YAAY,SACrB,QAAO,EAAE;CAEX,MAAM,SAA8D,EAAE;AACtE,MAAK,MAAM,SAAS,SAAS;AAC3B,MAAI,MAAM,SAAS,WACjB;EAEF,MAAM,IAAI;AACV,MAAI,OAAO,EAAE,OAAO,YAAY,OAAO,EAAE,SAAS,SAChD;AAEF,SAAO,KAAK;GAAE,IAAI,EAAE;GAAI,MAAM,EAAE;GAAM,OAAO,EAAE;GAAO,CAAC;;AAEzD,QAAO;;;;ACxMT,MAAMkB,gCAA8B;AAEpC,IAAa,gBAAb,MAA6C;CAC3C;CACA;CAEA;CACA;CACA,OAAO,IAAI,UAAU;CACrB,eAAe,IAAI,eAAe;CAClC,UAAyB;CACzB;CACA;CACA;CACA;CACA;CACA,2BAAW,IAAI,KAA8B;CAC7C,wBAAwB;CACxB,aAAa,IAAI,iBAAiB;CAClC;CACA;CACA,SAAS,IAAI,YAAY;CACzB;CACA,uBAAuB;CACvB;CACA;CACA,WAAW;CACX,UAAU;CACV;CAEA,YAAY,QAA6B,KAAa,YAAY,EAAE;AAClE,MAAI,CAAC,OAAO,IACV,OAAM,IAAI,MAAM,mCAAmC;AAErD,QAAA,MAAY,OAAO;AACnB,QAAA,SAAe;AACf,QAAA,iBAAuB,OAAO;AAC9B,OAAK,KAAK;AACV,OAAK,YAAY,KAAK,KAAK;;CAG7B,IAAI,SAAwB;AAC1B,SAAO,MAAA;;CAGT,IAAI,eAAmC;AACrC,SAAO,MAAA;;CAGT,IAAI,UAAkB;AACpB,SAAO,MAAA,IAAU;;CAGnB,IAAI,eAAmC;AACrC,SAAO,MAAA;;CAGT,IAAI,mBAAwC;AAC1C,SAAO,CAAC,GAAG,MAAA,QAAc,QAAQ,CAAC,CAAC,KAAK,MAAM,EAAE,QAAQ;;CAG1D,OAAoB;AAClB,SAAO;GACL,IAAI,KAAK;GACT,cAAc,MAAA;GACd,QAAQ,MAAA;GACR,KAAK,MAAA;GACL,SAAS,MAAA,OAAa;GACtB,QAAQ;GACR,cAAc,oBAAoB;GAClC,OAAO,MAAA,SAAe,MAAA,OAAa;GACnC,gBAAgB,MAAA;GAChB,sBAAsB,MAAA,OAAa,mBAAmB,uBAAuB,MAAA,OAAa,oCAAoC;GAC9H,cAAc,MAAA;GACd,WAAW,KAAK;GAChB,SAAS,MAAA,IAAU;GACnB,eAAe,MAAA,IAAU;GACzB,YAAY,MAAA,IAAU;GACtB,cAAc,MAAA,IAAU;GACxB,wBAAwB,MAAA,QAAc;GACtC,WAAW,MAAA,UAAgB,MAAM;GACjC,MAAM,MAAA,OAAa;GACnB,OAAO,MAAA,OAAa;GACpB,OAAO,aAAa,MAAA,QAAc,MAAA,YAAkB;GACpD,cAAc,MAAA;GACd,UAAU,MAAA;GACV,gBAAgB,MAAA,IAAU;GAC3B;;CAGH,SAAS,OAAiC;AACxC,QAAA,SAAe,UAAU,MAAA,QAAc,MAAM;;CAG/C,QAAuB;AACrB,MAAI,MAAA,QACF,QAAO,MAAA;AAET,QAAA,UAAgB;AAChB,MAAI,MAAA,OAAa,OACf,MAAK,YAAY,MAAA,OAAa,OAAO;AAEvC,QAAA,aAAmB,MAAA,KAAW;AAC9B,SAAO,MAAA;;CAGT,YAAY,MAAc,aAAgD;AACxE,MAAI,MAAA,OACF,OAAM,IAAI,MAAM,oBAAoB;EAEtC,MAAM,SAAS,aAAa,SAAS,wBAAwB,YAAY,GAAG,EAAE;EAE9E,MAAM,UAAU,OAAO,SAClB,CAAC,GAAG,QAAQ,GAAI,OAAO,CAAC;GAAE,MAAM;GAAQ;GAAM,CAAC,GAAG,EAAE,CAAE,GACvD;AACJ,QAAA,MAAY,KAAK;GACf,MAAM;GACN,SAAS;IAAE,MAAM;IAAQ;IAAS;GAClC,oBAAoB;GACpB,YAAY,MAAA;GACb,CAAC;AACF,QAAA,KAAW;GACT,MAAM;GACN,SAAS;IAAE,MAAM;IAAQ,SAAS;IAAM;GACxC,iBAAiB;GACjB,aAAa,aAAa,SAAS,YAAY,IAAI,cAAc,GAAG,KAAA;GACpE,MAAM,YAAY;GACnB,CAAC;;CAGJ,MAAM,aAAyD;EAC7D,MAAM,QAAQ,MAAA;AACd,MAAI,OAAO,OAAO,oBAAoB,WACpC;AAEF,UAAQ,MAAM,MAAM,iBAAiB,EAAE,IAAI,cAAc;;CAG3D,MAAM,mBAAmB,MAA6B;EACpD,MAAM,QAAQ,MAAA;AACd,MAAI,OAAO,OAAO,uBAAuB,WACvC,OAAM,IAAI,MAAM,4CAA4C;AAE9D,QAAM,MAAM,mBAAmB,KAAK;;CAGtC,MAAM,oBAAoB,MAAc,SAAiC;EACvE,MAAM,QAAQ,MAAA;AACd,MAAI,OAAO,OAAO,oBAAoB,WACpC,OAAM,IAAI,MAAM,oDAAoD;AAEtE,QAAM,MAAM,gBAAgB,MAAM,QAAQ;;CAG5C,kBAAkB,WAAmB,UAAuC;EAC1E,MAAM,UAAU,MAAA,QAAc,IAAI,UAAU;AAC5C,MAAI,CAAC,QACH,QAAO;AAET,QAAA,eAAqB,WAAW,SAAS,UAAU,SAAS;AAC5D,SAAO;;CAGT,MAAM,YAA2B;AAC/B,QAAM,MAAA,OAAa,WAAW;;CAGhC,MAAM,eAA8B;AAClC,MAAI,MAAA,WAAiB,YAAY,MAAA,WAAiB,SAChD,OAAM,IAAI,MAAM,oBAAoB;AAEtC,OAAK,YAAY,SAAS;;CAG5B,MAAM,kBAAkB,MAAqC;AAC3D,QAAM,MAAA,OAAa,kBAAkB,KAAK;AAC1C,QAAA,iBAAuB;AACvB,QAAA,KAAW;GAAE,MAAM;GAA2B;GAAM,CAAC;;CAGvD,MAAM,SAAS,OAA+B;AAC5C,QAAM,MAAA,OAAa,SAAS,MAAM;AAClC,QAAA,QAAc;AACd,QAAA,KAAW;GAAE,MAAM;GAAiB;GAAO,CAAC;;CAG9C,KAAK,SAAuB;AAC1B,MAAI,MAAA,OACF;AAEF,QAAA,KAAW;GAAE,MAAM;GAAiB;GAAS,CAAC;AAC9C,QAAA,UAAgB,SAAS;AACzB,OAAK,MAAM,QAAQ;;CAGrB,MAAM,SAAwC,UAAgB;AAC5D,MAAI,MAAA,OACF;AAEF,QAAA,SAAe;AACf,OAAK,MAAM,CAAC,IAAI,YAAY,MAAA,QAC1B,OAAA,eAAqB,IAAI,SAAS;GAAE,UAAU;GAAQ,SAAS;GAAkB,EAAE,SAAS;AAE9F,QAAA,MAAY,KAAK;AACjB,QAAA,OAAa,OAAO;AACpB,QAAA,KAAW;GAAE,MAAM;GAAkB;GAAQ,CAAC;AAC9C,QAAA,UAAgB,SAAS;;CAG3B,QAAQ,KAAuC;AAC7C,SAAO,MAAA,IAAU,GAAG,IAAI;;CAG1B,UAAU,UAAgC,WAAW,GAAG,SAAwC;AAC9F,SAAO,MAAA,YAAkB,UAAU,MAAA,IAAU,QAAQ,UAAU,UAAU,SAAS,MAAA,IAAU,SAAS;;CAGvG,OAAA,MAA4B;EAC1B,MAAM,UAAU,MAAA,OAAa,WAAYwB;AACzC,MAAI;AACF,SAAM,MAAA,iBAAuB;AAC7B,OAAI,MAAA,OACF;AAEF,SAAA,QAAc,QAAQ;IAAE,QAAQ,MAAA;IAAa,SAAS,MAAA,cAAoB;IAAE,CAAC;AAC7E,OAAI,CAAC,MAAA,OAAa,QAAQ;AACxB,UAAA,UAAgB,OAAO;AAClB,UAAA,mBAAyB;AACzB,UAAA,mBAAyB;AACzB,UAAA,iBAAuB;;AAE9B,cAAW,MAAM,WAAW,MAAA,MAC1B,OAAA,cAAoB,QAAQ;AAE9B,OAAI,CAAC,MAAA,QAAc;AACjB,UAAA,SAAe;AACf,UAAA,MAAY,KAAK;AACjB,UAAA,KAAW;KAAE,MAAM;KAAkB,QAAQ;KAAU,CAAC;AACxD,UAAA,UAAgB,SAAS;;WAEpB,OAAO;AACd,OAAI,CAAC,MAAA,QAAc;AACjB,UAAA,KAAW;KACT,MAAM;KACN,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;KAChE,CAAC;AACF,UAAA,UAAgB,SAAS;AACzB,SAAK,MAAM,QAAQ;;;;CAKzB,OAAA,kBAAwC;EACtC,MAAM,IAAI,MAAA;AACV,MAAI,CAAC,EAAE,UAAU,EAAE,oBAAoB,MACrC;EAEF,MAAM,YAAY,EAAE,eAAe,WAAmB,YAA8B,mBAAmB,WAAW,QAAQ;EAC1H,IAAI;AACJ,MAAI;AACF,cAAW,MAAM,UAAU,EAAE,QAAQ,EAAE,KAAK,MAAA,KAAW,CAAC;UAClD;AACN;;AAEF,OAAK,MAAM,KAAK,UAAU;AACxB,OAAI,MAAA,OACF;AAEF,OAAI,EAAE,SAAS,QAAQ;IACrB,MAAM,UAAU,aAAa,EAAE,QAAQ;AACvC,UAAA,KAAW;KACT,MAAM;KACN;KACA,iBAAiB,EAAE;KACnB,QAAQ;KACR,WAAW,oBAAoB,QAAQ,GAAG,OAAO,KAAA;KACjD,MAAM,EAAE;KACT,CAAC;cACO,EAAE,SAAS,YACpB,OAAA,KAAW;IACT,MAAM;IACN,SAAS,aAAa,EAAE,QAAQ;IAChC,iBAAiB,EAAE;IACnB,QAAQ;IACR,MAAM,EAAE;IACT,CAAC;;;CAKR,gBAAyB;EACvB,MAAM,IAAI,MAAA;AAsBV,SAAO;GApBL,KAAK,MAAA;GACL,gBAAgB,EAAE;GAClB,cAAc,EAAE;GAChB,iBAAiB,EAAE;GACnB,YAAY,EAAE;GACd,gBAAgB,EAAE;GAClB,OAAO,EAAE;GACT,UAAU,EAAE;GACZ,cAAc,EAAE;GAChB,QAAQ,EAAE;GACV,aAAa,EAAE;GACf,QAAQ,EAAE;GACV,wBAAwB,EAAE,0BAA0B;GACpD,qBAAqB;GACrB,YAAY,MAAA;GACZ,KAAK,EAAE;GACP,4BAA4B,EAAE;GAC9B,GAAI,EAAE,mBAAmB,uBAAuB,EAAE,kCAAkC,EAAE,iCAAiC,MAAM,GAAG,EAAE;GAClI,GAAG,EAAE;GAEO;;CAGhB,eAAe,KAAuB;AACpC,MAAI,IAAI,SAAS,YAAY,IAAI,YAAY,QAAQ;AACnD,SAAA,eAAqB,IAAI;AACzB,SAAA,QAAc,IAAI;AAClB,SAAA,iBAAuB,IAAI;AAC3B,SAAA,eAAqB,IAAI;AACzB,SAAA,KAAW;IACT,MAAM;IACN,cAAc,IAAI;IAClB,OAAO,IAAI;IACX,KAAK,IAAI;IACT,cAAc,IAAI;IAClB,OAAO,IAAI;IACX,QAAQ,IAAI;IACZ,eAAe,IAAI;IACnB,gBAAgB,IAAI;IACpB,mBAAmB,IAAI;IACvB,YAAY,IAAI;IACjB,CAAC;AACF,SAAA,uBAA6B;AAC7B,SAAA,UAAgB,UAAU;AACrB,SAAA,mBAAyB;AACzB,SAAA,mBAAyB;AACzB,SAAA,iBAAuB;AACvB,SAAA,kBAAwB;AAC7B;;AAEF,MAAI,IAAI,SAAS,YAAY,IAAI,YAAY,yBAAyB;AACpE,OAAI,MAAA,QAAc,OAAO,GAAG;AAC1B,QAAI,IAAI,UAAU,OAChB,OAAA,uBAA6B;aACpB,IAAI,UAAU,UACvB,OAAA,uBAA6B;AAE/B;;AAEF,OAAI,IAAI,UAAU,OAChB,OAAA,UAAgB,OAAO;YACd,IAAI,UAAU,UACvB,OAAA,UAAgB,UAAU;AAE5B;;EAEF,MAAM,OAAO,oBAAoB,IAAI;AACrC,MAAI,MAAM;AACR,SAAA,KAAW,KAAK;AAChB,OAAI,KAAK,SAAS,sBAAsB;AACtC,QAAI,KAAK,aACP,OAAA,eAAqB,KAAK;AAEvB,UAAA,mBAAyB;;AAEhC,OAAI,KAAK,SAAS,eAAe;AAC/B,UAAA,eAAqB,KAAK;AAC1B,UAAA,WAAiB,KAAK;AACtB,QAAI,MAAA,QAAc,SAAS,EACzB,OAAA,UAAgB,OAAO;QAEvB,OAAA,uBAA6B;AAE1B,UAAA,mBAAyB;AACzB,UAAA,iBAAuB;AACvB,UAAA,kBAAwB;;;;CAKnC,OAAA,oBAA0C;AACxC,MAAI,MAAA,oBACF;EAEF,MAAM,QAAQ,MAAA;AACd,MAAI,OAAO,OAAO,oBAAoB,cAAc,OAAO,MAAM,sBAAsB,WACrF;AAEF,MAAI;GACF,MAAM,CAAC,QAAQ,YAAY,MAAM,QAAQ,IAAI,CAAC,MAAM,iBAAiB,EAAE,MAAM,mBAAmB,CAAC,CAAC;AAClG,OAAI,MAAA,UAAgB,MAAA,oBAClB;AAEF,SAAA,sBAA4B;AAC5B,SAAA,KAAW;IACT,MAAM;IACN,QAAQ,oBAAoB,OAAO;IACnC,cAAc,oBAAoB,OAAO;IACzC,UAAU,SAAS,KAAK,OAAO;KAC7B,MAAM,EAAE;KACR,aAAa,EAAE;KACf,cAAc,EAAE;KAChB,SAAS,EAAE;KACZ,EAAE;IACJ,CAAC;UACI;;CAGV,OAAA,mBAAyC;AACvC,MAAI,UAAU,MAAA,OAAa,KAAK,CAC9B;EAEF,MAAM,eAAe,MAAA;AACrB,MAAI,CAAC,aACH;EAEF,MAAM,OAAO,MAAA,OAAa,iBAAiB;AAC3C,MAAI;GACF,MAAM,OAAO,MAAM,KAAK,cAAc,EAAE,KAAK,MAAA,KAAW,CAAC;AACzD,OAAI,MAAA,UAAgB,CAAC,KACnB;GAEF,MAAM,UAAU,KAAK,WAAW,KAAK,YAAY,KAAK,cAAc,KAAK,UAAU,KAAA;GACnF,MAAM,QAAQ,KAAK,eAAe;AAClC,OAAI,MACF,OAAA,cAAoB;UAEhB;;CAGV,OAAA,oBAA0C;EACxC,MAAM,QAAQ,MAAA;AACd,MAAI,OAAO,OAAO,oBAAoB,WACpC;AAEF,MAAI;GACF,MAAM,QAAQ,MAAM,MAAM,iBAAiB;AAC3C,OAAI,MAAA,OACF;AAEF,SAAA,KAAW;IACT,MAAM;IACN,OAAO;KACL,YAAY,MAAM,WAAW,KAAK,OAAO;MACvC,MAAM,EAAE;MACR,QAAQ,EAAE;MACV,OAAO,EAAE;MACV,EAAE;KACH,aAAa,MAAM;KACnB,WAAW,MAAM;KACjB,YAAY,MAAM;KAClB,OAAO,MAAM;KACd;IACF,CAAC;UACI;;CAGV,OAAA,kBAAwC;EACtC,MAAM,QAAQ,MAAA;EACd,MAAM,aAAa,OAAO;AAC1B,MAAI,OAAO,eAAe,WACxB;AAEF,MAAI;GACF,MAAM,QAAS,MAAM,WAAW,KAAK,MAAM;AAC3C,OAAI,MAAA,OACF;GAEF,MAAM,mBAAmB,MAAM;AAC/B,OAAI,oBAAoB,qBAAqB,MAAA,kBAAwB;AACnE,UAAA,mBAAyB;AACzB,UAAA,KAAW;KAAE,MAAM;KAAa;KAAkB,CAAC;;AAErD,QAAK,MAAM,QAAQ,yBAAyB,MAAM,CAChD,OAAA,KAAW,KAAK;UAEZ;;CAGV,eAA2B,UAAU,OAAO,YAAY;EACtD,MAAM,KAAK,YAAY;EACvB,MAAM,YAAY,MAAA,OAAa,qBAAqB,MAAA,OAAa,4BAA4BxB;EAC7F,MAAM,UAA6B;GACjC;GACA;GACA;GACA,WAAW,QAAQ;GACnB,OAAO,QAAQ;GACf,aAAa,QAAQ;GACrB,aAAa,QAAQ;GACrB,gBAAgB,QAAQ;GACxB,SAAS,QAAQ;GACjB,WAAW,KAAK,KAAK,GAAG;GACzB;EACD,MAAM,mBAAmB,MAAA,OAAa,oBAAoB;AAC1D,MAAI,aAAa,qBAAqB,qBAAqB,OAAO;AAChE,UAAO,QAAQ;AACf,UAAO,QAAQ,QAAQ,MAAA,wBAA8B,SAAS,iBAAiB,CAAC;;AAElF,SAAO,IAAI,SAA2B,YAAY;GAChD,MAAM,QAAQ,iBAAiB;IAC7B,MAAM,UAAU,MAAA,QAAc,IAAI,GAAG;AACrC,QAAI,QACF,OAAA,eAAqB,IAAI,SAAS;KAAE,UAAU;KAAQ,SAAS;KAAsB,EAAE,UAAU;MAElG,UAAU;AACb,SAAA,QAAc,IAAI,IAAI;IAAE;IAAS;IAAS;IAAO,CAAC;AAClD,WAAQ,OAAO,iBAAiB,eAAe;IAC7C,MAAM,UAAU,MAAA,QAAc,IAAI,GAAG;AACrC,QAAI,QACF,OAAA,eAAqB,IAAI,SAAS;KAAE,UAAU;KAAQ,SAAS;KAAgB,EAAE,SAAS;KAE5F;AACF,SAAA,KAAW;IAAE,MAAM;IAAwB;IAAS,CAAC;AACrD,SAAA,UAAgB,oBAAoB;IACpC;;CAGJ,yBAAyB,SAA4B,MAAyC;AAC5F,QAAA,KAAW;GAAE,MAAM;GAAwB;GAAS,CAAC;AACrD,MAAI,SAAS,QAAQ;GACnB,MAAM,UAAU;AAChB,SAAA,KAAW;IACT,MAAM;IACN,WAAW,QAAQ;IACnB,UAAU;IACV,YAAY;IACZ;IACD,CAAC;AACF,UAAO;IAAE,UAAU;IAAQ;IAAS,WAAW,QAAQ;IAAW;;AAEpE,QAAA,KAAW;GACT,MAAM;GACN,WAAW,QAAQ;GACnB,UAAU;GACV,YAAY;GACb,CAAC;AACF,SAAO;GACL,UAAU;GACV,cAAc;IAAE,GAAG,QAAQ;IAAO,SAAS,mBAAmB,QAAQ,MAAM;IAAE;GAC9E,WAAW,QAAQ;GACpB;;CAGH,gBAAgB,IAAY,SAA0B,UAA8B,YAAmD;AACrI,eAAa,QAAQ,MAAM;AAC3B,QAAA,QAAc,OAAO,GAAG;AACxB,MAAI,SAAS,aAAa,QACxB,SAAQ,QAAQ;GACd,UAAU;GACV,cAAc,SAAS,gBAAgB,QAAQ,QAAQ;GACvD,WAAW,QAAQ,QAAQ;GAC5B,CAAC;MAEF,SAAQ,QAAQ;GACd,UAAU;GACV,SAAS,SAAS,WAAW;GAC7B,WAAW,SAAS;GACpB,WAAW,QAAQ,QAAQ;GAC5B,CAAC;AAEJ,QAAA,KAAW;GACT,MAAM;GACN,WAAW;GACX,UAAU,SAAS;GACnB;GACA,SAAS,SAAS,aAAa,SAAU,SAAS,WAAW,WAAY,KAAA;GAC1E,CAAC;AACF,MAAI,MAAA,QAAc,SAAS,GAAG;GAC5B,MAAM,oBAAoB,MAAA;AAC1B,SAAA,uBAA6B;AAC7B,OAAI,kBACF,OAAA,UAAgB,OAAO;YACd,MAAA,WAAiB,oBAC1B,OAAA,UAAgB,UAAU;;;CAKhC,WAAW,QAAuB,QAAuB;AACvD,MAAI,MAAA,WAAiB,UAAU,MAAA,iBAAuB,OACpD;AAEF,MAAI,MAAA,WAAiB,YAAY,MAAA,WAAiB,SAChD;AAEF,QAAA,SAAe;AACf,QAAA,eAAqB;AACrB,QAAA,KAAW;GAAE,MAAM;GAAkB;GAAQ;GAAQ,CAAC;;CAGxD,MAAM,MAA8B;EAClC,MAAM,QAAQ,MAAA,IAAU,OAAO,KAAK;AACpC,QAAA,UAAgB,QAAQ,MAAM,MAAM,GAAG;AACvC,QAAA,YAAkB,KAAK,MAAM;;;AAIjC,SAAS,mBAAmB,OAAwD;CAClF,MAAM,UAAkC,EAAE;CAC1C,MAAM,YAAY,MAAM,QAAQ,MAAM,UAAU,GAAG,MAAM,YAAY,EAAE;AACvE,MAAK,MAAM,SAAS,WAAW;EAC7B,MAAM,IAAI;AACV,MAAI,OAAO,EAAE,aAAa,YAAY,CAAC,MAAM,QAAQ,EAAE,QAAQ,CAC7D;EAEF,MAAM,QAAQ,EAAE,QAAQ;AACxB,MAAI,OAAO,OAAO,UAAU,SAC1B,SAAQ,EAAE,YAAY,MAAM;;AAGhC,QAAO;;;;AC/oBT,MAAM,6BAAwD;CAAC;CAAW;CAAqB;CAAU;AA4CzG,IAAa,cAAb,MAA2C;CACzC;CACA;CAEA;CACA;CACA,OAAO,IAAI,UAAU;CACrB,eAAe,IAAI,eAAe;CAClC,UAAyB;CACzB;CACA;CACA,YAA4B,EAAE;CAC9B,oCAAoB,IAAI,KAA8B;CACtD,8BAAc,IAAI,KAAa;CAC/B,aAA4B,QAAQ,SAAS;CAC7C;CACA;CACA,YAAY;CACZ,cAAc;EAAE,OAAO;EAAG,QAAQ;EAAG,YAAY;EAAG,WAAW;EAAG;CAClE,WAAW;CACX,UAAU;CACV,UAAU;CACV;CACA,oCAAoB,IAAI,KAOrB;CAEH,YAAY,QAA2B,KAAa,YAAY,EAAE;EAChE,MAAM,OAAO,OAAO,kBAAkB;AACtC,MAAI,CAAC,2BAA2B,SAAS,KAAK,CAC5C,OAAM,IAAI,MAAM,oBAAoB,KAAK,yCAAyC;AAEpF,QAAA,SAAe;AACf,QAAA,QAAc,OAAO;AACrB,QAAA,iBAAuB;AACvB,QAAA,aAAmB,OAAO;AAC1B,OAAK,KAAK,OAAO,SAAS,MAAM;AAChC,OAAK,YAAY,OAAO,SAAS,aAAa,KAAK,KAAK;AACxD,MAAI,OAAO,QACT,OAAA,QAAc,OAAO,QAAQ;;CAIjC,SAAS,UAAgC;AACvC,MAAI,SAAS,WAAW,WACtB,OAAM,IAAI,MAAM,qBAAqB,SAAS,OAAO,mCAAmC;EAE1F,MAAM,QAAQ,SAAS;AACvB,MAAI,CAAC,SAAS,CAAC,MAAM,QAAQ,MAAM,SAAS,CAC1C,OAAM,IAAI,MAAM,wDAAwD;AAE1E,QAAA,IAAU,QAAQ,SAAS,QAAQ,SAAS,KAAK,MAAM,eAAe;AACtE,QAAA,WAAiB,CAAC,GAAG,MAAM,SAAS;AACpC,OAAK,MAAM,QAAQ,MAAM,iBACvB,OAAA,iBAAuB,IAAI,KAAK,YAAY,KAAK;AAEnD,QAAA,aAAmB,IAAI,IAAI,MAAM,WAAW;AAC5C,QAAA,WAAiB,MAAM;AACvB,QAAA,aAAmB,EAAE,GAAG,MAAM,YAAY;AAC1C,QAAA,YAAkB,MAAM,YAAY,EAAE,GAAG,MAAM,WAAW,GAAG,KAAA;AAC7D,MAAI,MAAA,aAAmB,MAAM,aAAa,KAAA,EACxC,OAAA,UAAgB,aAAa,KAAK,KAAK,GAAG,MAAM;AAElD,QAAA,iBAAuB,MAAM;AAC7B,QAAA,SAAe,MAAA,iBAAuB,OAAO,IAAI,WAAW;AAC5D,MAAI,MAAM,UAAU,KAAA,KAAa,MAAM,UAAU,MAAA,cAAoB,MAAA,OAAa,cAAc;AAC9F,SAAA,aAAmB,MAAM;AACzB,SAAA,QAAc,MAAA,OAAa,aAAa,MAAM,MAAM;;;CAIxD,IAAI,SAAwB;AAC1B,SAAO,MAAA;;CAGT,IAAI,UAAkB;AACpB,SAAO,MAAA,IAAU;;CAGnB,IAAI,WAA2B;AAC7B,SAAO,CAAC,GAAG,MAAA,SAAe;;CAG5B,IAAI,mBAAsC;AACxC,SAAO,CAAC,GAAG,MAAA,iBAAuB,QAAQ,CAAC;;CAG7C,IAAI,mBAAwC;AAC1C,SAAO,CAAC,GAAG,MAAA,iBAAuB,QAAQ,CAAC,CAAC,KAAK,MAAM,EAAE,QAAQ;;CAGnE,IAAI,MAA8B;AAChC,SAAO,MAAA,OAAa;;CAGtB,OAAoB;AAClB,SAAO;GACL,IAAI,KAAK;GACT,QAAQ,MAAA;GAGR,KAAK,MAAA,OAAa,OAAO;GACzB,SAAS,MAAA,OAAa;GACtB,QAAQ;GACR,cAAc,MAAA,OAAa,gBACvB;IAAE,GAAG,oBAAoB;IAAU,sBAAsB;IAAM,GAC/D,oBAAoB;GACxB,OAAO,MAAA,SAAe;GACtB,gBAAgB,MAAA;GAChB,WAAW,KAAK;GAChB,SAAS,MAAA,IAAU;GACnB,eAAe,MAAA,IAAU;GACzB,YAAY,MAAA,IAAU;GACtB,cAAc,MAAA,IAAU;GACxB,wBAAwB,MAAA,iBAAuB;GAC/C,MAAM,MAAA,OAAa;GACnB,OAAO,MAAA,OAAa;GACpB,OAAO,aAAa,MAAA,OAAa;GACjC,UAAU,MAAA,YAAkB,KAAA;GAC5B,gBAAgB,MAAA,IAAU;GAC3B;;CAGH,QAAuB;AACrB,MAAI,MAAA,QACF,QAAO,MAAA;AAET,QAAA,UAAgB;AAChB,MAAI,MAAA,OAAa,QACf,QAAO,MAAA;AAET,QAAA,UAAgB,OAAO;AACvB,MAAI,MAAA,OAAa,OACf,MAAK,YAAY,MAAA,OAAa,OAAO;AAEvC,SAAO,MAAA;;CAGT,OAAmC;AACjC,MAAI,MAAA,UAAgB,MAAA,OAClB;AAEF,MAAI,MAAA,SAAe,CAAC,MAAA,mBAAyB,CAC3C;AAEF,QAAA,UAAgB,SAAS;EACzB,MAAM,WAAW,MAAA,eAAqB;AACtC,QAAA,SAAe;AACf,QAAA,YAAkB,OAAO;AACzB,MAAI;AACG,WAAQ,QAAQ,MAAA,OAAa,WAAW,CAAC,CAAC,YAAY,GAAG;UACxD;AACR,SAAO;;CAGT,WAAuC;AACrC,MAAI,MAAA,UAAgB,MAAA,UAAgB,MAAA,MAClC;AAEF,MAAI,MAAA,iBAAuB,OAAO,KAAK,CAAC,MAAA,mBAAyB,CAC/D;AAEF,SAAO,MAAA,eAAqB;;CAG9B,iBAAiC;EAC/B,MAAM,SAA4B,CAAC,GAAG,MAAA,iBAAuB,QAAQ,CAAC,CAAC,KAAK,UAAU;GACpF,aAAa,KAAK;GAClB,UAAU,KAAK;GACf,WAAW,KAAK;GACjB,EAAE;EACH,MAAM,QAA2B;GAC/B,UAAU,MAAA;GACV,kBAAkB,CAAC,GAAG,MAAA,iBAAuB,QAAQ,CAAC;GACtD,YAAY,CAAC,GAAG,MAAA,WAAiB;GACjC,UAAU,MAAA;GACV,YAAY,EAAE,GAAG,MAAA,YAAkB;GACnC,WAAW,MAAA,YAAkB,EAAE,GAAG,MAAA,WAAiB,GAAG,KAAA;GACtD,gBAAgB,MAAA;GAChB,OAAO,MAAA;GACP,gBAAgB,MAAA,IAAU;GAC1B,UAAU,KAAK,KAAK;GACrB;AACD,SAAO;GACL,QAAQ;GACR,IAAI,KAAK;GACT,WAAW,KAAK;GAChB,KAAK,MAAA,IAAU;GACf,QAAQ,MAAA,IAAU,OAAO,QAAQ,UAAU,gBAAgB,MAAM,CAAC;GAClE,KAAK,MAAA,OAAa,KAAK,UAAU;GACjC;GACA;GACD;;CAGH,YAAY,MAAc,aAAgD;AACxE,MAAI,MAAA,OACF,OAAM,IAAI,MAAM,oBAAoB;AAEtC,MAAI,MAAA,OACF,OAAM,IAAI,MAAM,oBAAoB;EAEtC,MAAM,UAAU,aAAa,SACzB,CACE,GAAG,YAAY,KAAK,gBAAgB;GAClC,MAAM;GACN,MAAM,WAAW;GACjB,WAAW,mBAAmB,WAAW,UAAU;GACnD,UAAU,WAAW;GACtB,EAAE,EACH,GAAI,OAAO,CAAC;GAAE,MAAM;GAAiB;GAAM,CAAC,GAAG,EAAE,CAClD,GACD;AACJ,QAAA,SAAe,KAAK;GAAE,MAAM;GAAQ;GAAS,CAAC;AAC9C,QAAA,KAAW;GACT,MAAM;GACN,SAAS;IAAE,MAAM;IAAQ,SAAS;IAAM;GACxC,iBAAiB;GACjB,aAAa,aAAa,SAAS,YAAY,IAAI,cAAc,GAAG,KAAA;GACpE,MAAM,YAAY;GACnB,CAAC;AACF,QAAA,cAAoB;;CAGtB,gBAAgB,YAAoB,QAAwB,SAA0C;AACpG,MAAI,CAAC,MAAA,kBAAwB,YAAY,QAAQ,SAAS,YAAY,KAAK,CACzE,QAAO;AAET,MAAI,MAAA,iBAAuB,SAAS,EAClC,OAAA,cAAoB;AAEtB,SAAO;;CAGT,mBAAmB,YAAoB,QAAwB,SAA2B;EACxF,MAAM,UAAU,MAAA,iBAAuB,IAAI,WAAW;AACtD,MAAI,CAAC,WAAW,MAAA,UAAgB,MAAA,OAC9B,QAAO;AAET,QAAA,iBAAuB,OAAO,WAAW;EACzC,IAAI,WAAW,MAAA,SAAe;AAC9B,SAAO,WAAW,KAAK,MAAA,SAAe,WAAW,GAAI,SAAS,OAC5D;AAEF,QAAA,SAAe,OAAO,UAAU,GAAG;GACjC,MAAM;GACN,SAAS,CACP;IACE,MAAM;IACN;IACA,UAAU,QAAQ;IAClB,QAAS,UAAU;KAAE,MAAM;KAAc,OAAO,UAAU,OAAO;KAAE,GAAG;IACvE,CACF;GACF,CAAC;AACF,QAAA,KAAW;GACT,MAAM;GACN,SAAS;IACP,MAAM;IACN,SAAS,CACP;KACE,MAAM;KACN,aAAa;KACb,SAAS,UAAU,OAAO;KAC1B,UAAU,WAAW,KAAA;KACtB,CACF;IACF;GACD,iBAAiB;GACjB,WAAW;GACX,MAAM,YAAY;GACnB,CAAC;AACF,SAAO;;CAGT,kBAAkB,WAAmB,UAAuC;EAC1E,MAAM,WAAW,MAAA,iBAAuB,IAAI,UAAU;AACtD,MAAI,CAAC,SACH,QAAO;AAET,eAAa,SAAS,MAAM;AAC5B,QAAA,iBAAuB,OAAO,UAAU;EACxC,MAAM,SAAmC;AACzC,MAAI,SAAS,aAAa,SAAS;AACjC,SAAA,KAAW;IACT,MAAM;IACN;IACA,UAAU;IACV,YAAY;IACb,CAAC;AACF,SAAA,eAAqB,SAAS,WAAW;SACpC;GACL,MAAM,UAAU,SAAS,WAAW;AACpC,SAAA,KAAW;IACT,MAAM;IACN;IACA,UAAU;IACV,YAAY;IACZ;IACD,CAAC;AACF,SAAA,qBAA2B,SAAS,YAAY;IAC9C,QAAQ;IACR,QAAQ;IACR,OAAO;IACR,CAAC;AACF,OAAI,SAAS,UACN,MAAK,WAAW;;AAGzB,SAAO;;CAGT,kBAAkB,MAAmE;AACnF,MAAI,MAAA,UAAgB,MAAA,OAClB;AAEF,QAAA,KAAW;GAAE,MAAM;GAAkB,GAAG;GAAM,CAAC;;CAGjD,MAAM,eAAe,QAAiC;EACpD,MAAM,SAAS,MAAM,aAAa;GAChC,OAAO,MAAA;GACP;GACA,aAAa,MAAA,OAAa;GAC3B,CAAC;EACF,MAAM,QAAQ,MAAA;AACd,MAAI,OAAO;AACT,SAAM,SAAS,OAAO,MAAM,eAAe;AAC3C,SAAM,UAAU,OAAO,MAAM,gBAAgB;AAC7C,SAAM,cAAc,OAAO,MAAM,mBAAmB,oBAAoB;AACxE,SAAM,aAAa,OAAO,MAAM,mBAAmB,mBAAmB;;AAExE,SAAO,OAAO;;CAGhB,MAAM,eAA8B;AAClC,MAAI,MAAA,WAAiB,YAAY,MAAA,WAAiB,SAChD,OAAM,IAAI,MAAM,oBAAoB;EAEtC,MAAM,MAAM,MAAA,UAAgB,WAAW;AACrC,OAAI,MAAA,OACF,OAAM,IAAI,MAAM,oBAAoB;AAItC,OAAI,MAAA,iBAAuB,OAAO,EAChC,OAAM,IAAI,MAAM,wDAAwD;AAE1E,SAAA,WAAiB,EAAE;AACnB,SAAA,KAAW,EAAE,MAAM,sBAAsB,CAAC;IAC1C;AACF,QAAA,YAAkB,IAAI,WACd,KAAA,SACA,KAAA,EACP;AACD,QAAM;;CAGR,MAAM,YAA2B;AAC/B,MAAI,MAAA,MACF,OAAA,MAAY,OAAO;WACV,MAAA,iBAAuB,OAAO,GAAG;GAC1C,MAAM,QAAQ,MAAA,aAAmB;IAAE,WAAW,KAAK,KAAK;IAAE,OAAO;IAAG,QAAQ;IAAG,YAAY;IAAG,WAAW;IAAG;AAC5G,QAAK,MAAM,QAAQ,MAAM,KAAK,MAAA,iBAAuB,QAAQ,CAAC,CAC5D,OAAA,kBAAwB,KAAK,YAAY;IAAE,MAAM;IAAQ,OAAO;IAAe,EAAE,KAAK;AAExF,SAAA,WAAiB,OAAO;AACxB,SAAA,YAAkB;AAClB,SAAA,KAAW;IACT,MAAM;IACN,SAAS;IACT,SAAS;IACT,YAAY,KAAK,KAAK,GAAG,MAAM;IAC/B,UAAU,MAAA;IACV,cAAc;IACd,QAAQ,CAAC,cAAc;IACvB,OAAO,UAAU,MAAM;IACxB,CAAC;AACF,SAAA,YAAkB,KAAA;AAClB,SAAA,UAAgB,OAAO;;AAEzB,QAAM,MAAA;;CAGR,MAAM,kBAAkB,MAAqC;AAC3D,MAAI,CAAC,2BAA2B,SAAS,KAAK,CAC5C,OAAM,IAAI,MAAM,oBAAoB,KAAK,yCAAyC;AAEpF,QAAA,iBAAuB;AACvB,QAAA,KAAW;GAAE,MAAM;GAA2B;GAAM,CAAC;;CAGvD,MAAM,SAAS,OAA+B;EAC5C,MAAM,UAAU,MAAA,OAAa;AAC7B,MAAI,CAAC,QACH,OAAM,IAAI,MAAM,6CAA6C;AAE/D,QAAA,QAAc,QAAQ,MAAM;AAC5B,QAAA,aAAmB;AACnB,QAAA,KAAW;GAAE,MAAM;GAAiB;GAAO,CAAC;;CAG9C,KAAK,SAAuB;AAC1B,MAAI,MAAA,OACF;AAEF,QAAA,KAAW;GAAE,MAAM;GAAiB;GAAS,CAAC;AAC9C,QAAA,UAAgB,SAAS;AACzB,OAAK,MAAM,QAAQ;;CAGrB,MAAM,SAAwC,UAAgB;AAC5D,MAAI,MAAA,UAAgB,MAAA,OAClB;AAEF,QAAA,SAAe;AACf,QAAA,OAAa,OAAO;AACpB,QAAA,iBAAuB,OAAO;AAC9B,QAAA,WAAiB,OAAO;AACxB,OAAK,MAAM,EAAE,WAAW,MAAA,iBAAuB,QAAQ,CACrD,cAAa,MAAM;AAErB,QAAA,iBAAuB,OAAO;AAC9B,QAAA,KAAW;GAAE,MAAM;GAAkB;GAAQ,CAAC;AAC9C,QAAA,UAAgB,SAAS;AACzB,MAAI;AACG,WAAQ,QAAQ,MAAA,OAAa,WAAW,CAAC,CAAC,YAAY,GAAG;UACxD;;CAGV,QAAQ,KAAuC;AAC7C,SAAO,MAAA,IAAU,GAAG,IAAI;;CAG1B,UAAU,UAAgC,WAAW,GAAG,SAAwC;AAC9F,SAAO,MAAA,YAAkB,UAAU,MAAA,IAAU,QAAQ,UAAU,UAAU,SAAS,MAAA,IAAU,SAAS;;CAGvG,gBAAsB;AACpB,QAAA,YAAkB,MAAA,UAAgB,WAAW,MAAA,SAAe,CAAC;;CAG/D,gBAAgB,aAAqB,QAAsC;AACzE,MAAI,MAAA,UAAgB,MAAA,OAClB,QAAO;AAET,MAAI,CAAC,MAAA,iBAAuB,IAAI,YAAY,CAC1C,QAAO;AAET,QAAA,qBAA2B,aAAa,OAAO;AAC/C,SAAO;;CAGT,mBAAyB;EACvB,MAAM,WAAW,MAAA,OAAa;AAC9B,MAAI,CAAC,SACH;EAEF,MAAM,aAAa,MAAA,OAAa;EAChC,MAAM,gBAAgB,MAAA,mBAAyB,aAAa,MAAA,OAAa;EACzE,MAAM,WAAoC,EAAE;EAC5C,IAAI,cAAc;EAClB,IAAI,cAAc;AAClB,OAAK,MAAM,QAAQ,MAAM,KAAK,MAAA,iBAAuB,QAAQ,CAAC,EAAE;AAC9D,OAAI,cAAc,CAAC,WAAW,SAAS,KAAK,SAAS,CACnD;AAEF,OAAI,MAAA,WAAiB,IAAI,KAAK,WAAW,CACvC;AAEF,OAAI,iBAAiB,cAAc;IAAE,UAAU,KAAK;IAAU,OAAO,KAAK;IAAkC,CAAC,EAAE;AAC7G,QAAI,CAAC,GAAG,MAAA,iBAAuB,QAAQ,CAAC,CAAC,MAAM,MAAM,EAAE,eAAe,KAAK,WAAW,EAAE;AACtF,mBAAc;AACd;;IAEF,MAAM,YAAY,YAAY;IAC9B,MAAM,YAAY,MAAA,OAAa,qBAAqB;IACpD,MAAM,UAA6B;KACjC,IAAI;KACJ,UAAU,KAAK;KACf,OAAO,KAAK;KACZ,WAAW,KAAK;KAChB,OAAO,sBAAsB,KAAK;KAClC,aAAa,KAAK;KAClB,WAAW,KAAK,KAAK,GAAG;KACzB;IACD,MAAM,QAAQ,iBAAiB;AAC7B,SAAI,CAAC,MAAA,iBAAuB,IAAI,UAAU,CACxC;AAEF,UAAK,kBAAkB,WAAW;MAChC,UAAU;MACV,SAAS;MACV,CAAC;OACD,UAAU;AACb,UAAA,iBAAuB,IAAI,WAAW;KAAE;KAAS,YAAY,KAAK;KAAY;KAAO,CAAC;AACtF,UAAA,KAAW;KAAE,MAAM;KAAwB;KAAS,CAAC;AACrD,kBAAc;AACd;;AAEF,SAAA,WAAiB,IAAI,KAAK,WAAW;GACrC,MAAM,aAAa,MAAA,aAAmB,UAAU,KAAK;AACrD,mBAAgB,WAAW;AAC3B,YAAS,KAAK,WAAW,QAAQ;;AAEnC,MAAI,YACF,OAAA,UAAgB,oBAAoB;AAEtC,MAAI,YACG,SAAQ,WAAW,SAAS,CAAC,WAAW,MAAA,gBAAsB,CAAC;;CAIxE,gBAAgB,YAA0B;EACxC,MAAM,WAAW,MAAA,OAAa;AAC9B,MAAI,CAAC,SACH;EAEF,MAAM,OAAO,MAAA,iBAAuB,IAAI,WAAW;AACnD,MAAI,CAAC,QAAQ,MAAA,WAAiB,IAAI,WAAW,CAC3C;AAEF,QAAA,WAAiB,IAAI,WAAW;EAChC,MAAM,aAAa,MAAA,aAAmB,UAAU,KAAK;AACrD,MAAI,WAAW,SACR,YAAW,QAAQ,WAAW,MAAA,gBAAsB,CAAC;;CAI9D,cAAc,UAAwB,MAAsE;EAC1G,MAAM,WAA8B;GAClC,aAAa,KAAK;GAClB,WAAW,KAAK;GAChB,MAAM,KAAK;GACX,OAAO,KAAK;GACZ,KAAK,MAAA,OAAa;GAClB,QAAQ,MAAA,OAAa;GACrB,QAAQ,MAAA,OAAa;GACtB;EACD,MAAM,UAAU,SAAS,WAAW,SAAS,IAAI,EAAE;AACnD,OAAK,WAAW,QAAQ,aAAa,OAAO,OAAO,KAAA;AACnD,OAAK,YAAY,QAAQ,cAAc,KAAA,IAAY,KAAA,IAAY,KAAK,KAAK,GAAG,QAAQ;AACpF,QAAA,KAAW;GACT,MAAM;GACN,aAAa,KAAK;GAClB,UAAU,KAAK;GACf,SAAS,QAAQ,WAAW,MAAA,OAAa,oBAAoB;GAC7D,UAAU,KAAK;GACf,WAAW,KAAK;GACjB,CAAC;EACF,MAAM,UAAU,SACb,SAAS,SAAS,CAClB,MAAM,aAAa;AAElB,OAAI,SAAS,WAAW,UACtB,OAAA,qBAA2B,KAAK,YAAY,SAAS,OAAO;IAE9D,CACD,OAAO,UAAmB;AACzB,SAAA,qBAA2B,KAAK,YAAY;IAC1C,QAAQ;IACR,QAAQ;IACR,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;IAC9D,CAAC;IACF;AACJ,SAAO;GAAE,UAAU,KAAK,aAAa;GAAM;GAAS;;CAGtD,kBAAwB;AACtB,MAAI,MAAA,UAAgB,MAAA,UAAgB,MAAA,MAClC;AAEF,MAAI,MAAA,mBAAyB,CAC3B,OAAA,UAAgB,SAAS;;CAI7B,qBAA8B;AAC5B,MAAI,MAAA,iBAAuB,SAAS,EAClC,QAAO;AAET,OAAK,MAAM,QAAQ,MAAA,iBAAuB,QAAQ,CAChD,KAAI,KAAK,aAAa,KACpB,QAAO;AAGX,SAAO;;CAGT,sBAAsB,aAAqB,QAAmC;AAG5E,MAAI,MAAA,UAAgB,MAAA,OAClB;AAEF,QAAA,WAAiB,OAAO,YAAY;AACpC,MAAI,OAAO,WAAW,MAAM;AAC1B,SAAA,KAAW;IACT,MAAM;IACN;IACA,QAAQ;KAAE,MAAM;KAAQ,OAAO,OAAO;KAAQ;IAC9C,MAAM,OAAO;IACd,CAAC;AACF,QAAK,gBAAgB,aAAa;IAAE,MAAM;IAAQ,OAAO,OAAO;IAAQ,CAAC;AACzE;;AAEF,QAAA,KAAW;GACT,MAAM;GACN;GACA,QAAQ,OAAO;GACf,OAAO,OAAO;GACd,MAAM,OAAO;GACd,CAAC;AACF,OAAK,gBAAgB,aAAa;GAAE,MAAM;GAAQ,OAAO,GAAG,OAAO,OAAO,IAAI,OAAO;GAAS,EAAE,EAAE,SAAS,MAAM,CAAC;;CAGpH,OAAA,UAAgC;AAC9B,MAAI,MAAA,UAAgB,MAAA,UAAgB,MAAA,iBAAuB,OAAO,EAChE;AAEF,MAAI,MAAA,SAAe,GAAG,GAAG,EAAE,SAAS,YAClC;AAEF,QAAA,UAAgB,UAAU;EAC1B,MAAM,QAAQ,IAAI,cAAc;GAC9B,OAAO,MAAA;GACP,OAAO,MAAA,OAAa,SAAS,EAAE;GAC/B,cAAc,MAAA,OAAa;GAC3B,UAAU,YAAY,MAAA,OAAa,YAAY,GAAG;GACnD,CAAC;EACF,MAAM,QAAQ,IAAI,iBAAiB;AACnC,QAAA,QAAc;EACd,MAAM,QAAS,MAAA,cAAoB;GACjC,WAAW,KAAK,KAAK;GACrB,OAAO;GACP,QAAQ;GACR,YAAY;GACZ,WAAW;GACZ;EACD,IAAI,SAAyB,EAAE;EAC/B,MAAM,0BAAU,IAAI,KAAqB;EACzC,MAAM,+BAAe,IAAI,KAAqB;EAC9C,MAAM,cAAoB;AACxB,OAAI,OAAO,WAAW,EACpB;AAEF,SAAA,KAAW;IACT,MAAM;IACN,SAAS;KAAE,MAAM;KAAa,SAAS;KAAQ,OAAO,MAAA,SAAe;KAAE;IACvE,iBAAiB;IACjB,MAAM,YAAY;IACnB,CAAC;AACF,YAAS,EAAE;;AAEb,MAAI;GACF,MAAM,SAAS,MAAM,MAAM,OAAO;IAChC,UAAU,CAAC,GAAG,MAAA,SAAe;IAC7B,aAAa,MAAM;IACpB,CAAC;GACF,MAAM,WAAW,MAAA,OAAa,2BAA2B;GACzD,MAAM,kBAAkB,YAAoB,SAAiB,YAA4B;AACvF,WAAO;AACP,UAAA,KAAW;KACT,MAAM;KACN,SAAS;MACP,MAAM;MACN,SAAS,CAAC;OAAE,MAAM;OAAe,aAAa;OAAY;OAAS,UAAU;OAAS,CAAC;MACxF;KACD,iBAAiB;KACjB,WAAW;KACX,MAAM,YAAY;KACnB,CAAC;;GAEJ,IAAI;AACJ,cAAW,MAAM,QAAQ,OAAO,YAAY;AAC1C,QAAI,MAAA,OACF;AAEF,YAAQ,KAAK,MAAb;KACE,KAAK;AACH,cAAQ,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,GAAG,IAAI,MAAM,KAAK,KAAK;AAC9D,UAAI,SACF,OAAA,KAAW;OACT,MAAM;OACN,OAAO;QAAE,MAAM;QAAuB,OAAO;SAAE,MAAM;SAAc,MAAM,KAAK;SAAM;QAAE;OACtF,iBAAiB;OACjB,MAAM,YAAY;OACnB,CAAC;AAEJ;KAEF,KAAK,YAAY;MACf,MAAM,OAAO,QAAQ,IAAI,KAAK,GAAG;AACjC,cAAQ,OAAO,KAAK,GAAG;AACvB,UAAI,KACF,QAAO,KAAK;OAAE,MAAM;OAAQ;OAAM,CAAC;AAErC;;KAEF,KAAK;AACH,mBAAa,IAAI,KAAK,KAAK,aAAa,IAAI,KAAK,GAAG,IAAI,MAAM,KAAK,KAAK;AACxE,UAAI,SACF,OAAA,KAAW;OACT,MAAM;OACN,OAAO;QAAE,MAAM;QAAuB,OAAO;SAAE,MAAM;SAAkB,UAAU,KAAK;SAAM;QAAE;OAC9F,iBAAiB;OACjB,MAAM,YAAY;OACnB,CAAC;AAEJ;KAEF,KAAK,iBAAiB;MACpB,MAAM,WAAW,aAAa,IAAI,KAAK,GAAG;AAC1C,mBAAa,OAAO,KAAK,GAAG;AAC5B,UAAI,SACF,QAAO,KAAK;OAAE,MAAM;OAAY;OAAU,CAAC;AAE7C;;KAEF,KAAK;AACH,aAAO,KAAK;OACV,MAAM;OACN,IAAI,KAAK;OACT,MAAM,KAAK;OACX,OAAO,KAAK;OACb,CAAC;AACF,aAAO;AACP;KAEF,KAAK;AACH,qBAAe,KAAK,YAAY,OAAO,KAAK,WAAW,WAAW,KAAK,SAAS,KAAK,UAAU,KAAK,OAAO,CAAC;AAC5G;KAEF,KAAK;AACH,qBAAe,KAAK,YAAY,UAAU,KAAK,MAAM,EAAE,KAAK;AAC5D;KAEF,KAAK;AACH,aAAO;AACP;KAEF,KAAK;AACH,sBAAgB,KAAK;AACrB;KAEF,QACE;;;AAIN,UAAO;AACP,OAAI,gBAAgB,KAAA,EAClB,OAAM;AAER,OAAI,MAAM,OAAO,QACf,OAAM,IAAI,MAAM,cAAc;GAEhC,MAAM,CAAC,kBAAkB,OAAO,WAAW,QAAQ,MAAM,QAAQ,IAAI;IACnE,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;IACR,CAAC;AACF,OAAI,MAAA,OACF;AAEF,SAAM,SAAS,MAAM,eAAe;AACpC,SAAM,UAAU,MAAM,gBAAgB;AACtC,SAAM,cAAc,MAAM,mBAAmB,oBAAoB;AACjE,SAAM,aAAa,MAAM,mBAAmB,mBAAmB;AAC/D,SAAA,SAAe,KAAK,GAAI,iBAAoC;GAC5D,MAAM,0BAAU,IAAI,KAAa;AACjC,QAAK,MAAM,WAAW,kBAAoC;AACxD,QAAI,QAAQ,SAAS,UAAU,CAAC,MAAM,QAAQ,QAAQ,QAAQ,CAC5D;AAEF,SAAK,MAAM,QAAQ,QAAQ,QACzB,KAAI,KAAK,SAAS,cAChB,SAAQ,IAAI,KAAK,WAAW;;AAIlC,QAAK,MAAM,QAAQ,WAAW;AAC5B,QAAI,QAAQ,IAAI,KAAK,WAAW,CAC9B;AAEF,UAAA,iBAAuB,IAAI,KAAK,YAAY;KAC1C,YAAY,KAAK;KACjB,UAAU,KAAK;KACf,OAAO,KAAK;KACb,CAAC;;AAEJ,OAAI,MAAA,iBAAuB,OAAO,GAAG;AACnC,UAAA,iBAAuB;AACvB;;AAEF,SAAA,WAAiB,KAAK;WACf,OAAO;AACd,OAAI,MAAA,OACF;AAEF,QAAK,MAAM,GAAG,aAAa,aACzB,KAAI,SACF,QAAO,KAAK;IAAE,MAAM;IAAY;IAAU,CAAC;AAG/C,QAAK,MAAM,GAAG,SAAS,QACrB,KAAI,KACF,QAAO,KAAK;IAAE,MAAM;IAAQ;IAAM,CAAC;AAGvC,UAAO;GACP,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AACtE,SAAA,YAAkB;AAClB,SAAA,KAAW;IACT,MAAM;IACN,SAAS;IACT,SAAS;IACT,YAAY,KAAK,KAAK,GAAG,MAAM;IAC/B,UAAU,MAAA;IACV,cAAc;IACd,QAAQ,CAAC,MAAM,OAAO,UAAU,gBAAgB,QAAQ;IACxD,OAAO,UAAU,MAAM;IACxB,CAAC;AACF,SAAA,YAAkB,KAAA;AAClB,SAAA,UAAgB,OAAO;YACf;AACR,OAAI,MAAA,UAAgB,MAClB,OAAA,QAAc,KAAA;;;CAKpB,YAAY,MAAoB;EAC9B,MAAM,QAAQ,MAAA,aAAmB;GAAE,WAAW,KAAK,KAAK;GAAE,OAAO;GAAG,QAAQ;GAAG,YAAY;GAAG,WAAW;GAAG;AAC5G,QAAA,YAAkB;AAClB,QAAA,WAAiB,SAAS,MAAM;AAChC,QAAA,WAAiB,UAAU,MAAM;AACjC,QAAA,WAAiB,cAAc,MAAM;AACrC,QAAA,WAAiB,aAAa,MAAM;AACpC,QAAA,KAAW;GACT,MAAM;GACN,SAAS;GACT,SAAS;GACT,YAAY,KAAK,KAAK,GAAG,MAAM;GAC/B,UAAU,MAAA;GACV,cAAc;GACd,QAAQ;GACR,OAAO,UAAU,MAAM;GACxB,CAAC;AACF,QAAA,YAAkB,KAAA;AAClB,QAAA,UAAgB,OAAO;;CAGzB,WAA+B;EAC7B,MAAM,QAAQ,MAAA;AACd,MAAI,OAAO,UAAU,SACnB,QAAO;AAET,SAAQ,MAA+B;;CAGzC,MAAM,aAAyD;AAC7D,SAAQ,MAAM,MAAA,OAAa,oBAAoB,IAAK,EAAE;;CAGxD,SAAS,OAAiC;AACxC,QAAA,SAAe,UAAU,MAAA,QAAc,MAAM;;CAG/C,WAAW,QAAuB,QAAuB;AAGvD,MAAI,MAAA,WAAiB,UAAU,MAAA,iBAAuB,OACpD;AAEF,MAAI,MAAA,WAAiB,YAAY,MAAA,WAAiB,SAChD;AAEF,QAAA,SAAe;AACf,QAAA,eAAqB;AACrB,QAAA,KAAW;GAAE,MAAM;GAAkB;GAAQ;GAAQ,CAAC;;CAGxD,MAAM,MAA8B;AAClC,QAAA,YAAkB,KAAK,MAAA,IAAU,OAAO,KAAK,CAAC;;;AAIlD,SAAS,UAAU,OAAiF;AAClG,QAAO;EACL,cAAc,MAAM;EACpB,eAAe,MAAM;EACrB,6BAA6B,MAAM;EACnC,yBAAyB,MAAM;EAChC;;AAGH,SAAS,UAAU,QAAgC;AACjD,QAAO,OAAO,SAAS,SAAS,OAAO,QAAQ,KAAK,UAAU,OAAO,MAAM;;AAG7E,SAAS,UAAU,OAAwB;AACzC,QAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;;;;ACz8B/D,SAAgB,iCAAqD;AACnE,KAAI;EAIF,MAAM,UAAU,cADC,cAAc,OAAO,KAAK,IACL,CAAC,QAAQ,iCAAiC,CAAC;EACjF,MAAM,SAAS,QAAQ,aAAa,UAAU,SAAS;EACvD,MAAM,YACJ,QAAQ,aAAa,UAAU,CAAC,SAAS,QAAQ,QAAQ,SAAS,QAAQ,KAAK,OAAO,GAAG,CAAC,GAAG,QAAQ,SAAS,GAAG,QAAQ,OAAO;AAClI,OAAK,MAAM,YAAY,UACrB,KAAI;GACF,MAAM,OAAO,QAAQ,QAAQ,kCAAkC,SAAS,SAAS,SAAS;AAC1F,OAAI,WAAW,KAAK,CAClB,QAAO;UAEH;SAEJ;;AAIV,SAAgB,gBACd,KACA,UAAuD,EAAE,EAC9B;CAC3B,MAAM,aAAa,QAAQ,cAAc,gCAAgC;AACzE,KAAI,CAAC,WACH,QAAO,QAAQ,QAAQ,UAAU;AAEnC,QAAO,IAAI,SAAS,YAAY;AAC9B,WACE,YACA,CAAC,QAAQ,SAAS,EAClB;GAAO;GAA0B,SAAS,QAAQ,aAAa;GAAQ,GAGtE,QAAQ,WAAW;AAClB,OAAI;IACF,MAAM,SAAS,KAAK,MAAM,OAAO;AACjC,QAAI,OAAO,OAAO,aAAa,WAAW;AACxC,aAAQ,OAAO,WAAW,cAAc,aAAa;AACrD;;WAEI;AACR,WAAQ,UAAU;IAErB;GACD;;;;ACpCJ,IAAa,kBAAb,MAAqD;CACnD;CAEA,YAAY,SAAiC;AAC3C,QAAA,UAAgB;;CAGlB,MAAM,SAAS,MAAyD;AACtE,SAAO;GACL,aAAa,KAAK;GAClB,QAAQ;GACR,QAAQ,MAAM,MAAA,QAAc,KAAK;GAClC;;CAGH,OAAA,QAAe,MAAuD;AACpE,MAAI,KAAK,SAAS,cAChB,QAAO;GACL,QAAQ;GACR,QAAQ;GACR,OAAO,SAAS,KAAK,KAAK;GAC3B;EAEH,MAAM,SAAU,KAAK,OAAuC;AAC5D,MAAI,OAAO,WAAW,SACpB,QAAO;GACL,QAAQ;GACR,QAAQ;GACR,OAAO;GACR;EAEH,MAAM,SAAS,MAAM,UAAU,MAAA,QAAc,QAAQ;GACnD;GACA,KAAK,KAAK;GACV,QAAQ,KAAK;GACb,WAAW,KAAK,QAAQ,aAAa,MAAA,QAAc,oBAAoB;GACvE,kBAAkB,KAAK,QAAQ,oBAAoB,MAAA,QAAc,2BAA2B,KAAK,OAAO;GACxG,WAAW,MAAA,eAAqB,IAAI,QAAQ,MAAA,UAAgB,KAAK,KAAK,OAAO,GAAG,KAAA;GACjF,CAAC;EACF,MAAM,OAAO,OAAO,KAAK,KAAK,MAAM,IAAI,EAAE,MAAM,IAAI,EAAE,OAAO;AAC7D,SAAO,OAAO,KAAK;GAAE,QAAQ;GAAM,QAAQ,OAAO;GAAO;GAAM,GAAG;GAAE,QAAQ;GAAU,QAAQ,OAAO;GAAQ,OAAO,OAAO;GAAO;GAAM;;CAG1I,iBAA0B;AACxB,UAAQ,MAAA,QAAc,cAAc,UAAU,KAAK;;CAGrD,OAAA,UAAiB,KAAa,OAAiD;AAC7E,MAAI,CAAC,cAAc,KAAK,MAAA,QAAc,gBAAgB,EAAE,CAAC,CACvD,OAAM,IAAI,MAAM,qBAAqB,SAAS,IAAI,IAAI,MAAM;EAE9D,MAAM,aAAa,IAAI,iBAAiB;EACxC,MAAM,qBAAqB,WAAW,OAAO;AAC7C,SAAO,iBAAiB,SAAS,aAAa;EAC9C,MAAM,QAAQ,iBAAiB,WAAW,OAAO,EAAE,MAAA,QAAc,kBAAkB,IAAO;AAC1F,MAAI;AAEF,UAAO,OADW,MAAA,QAAc,aAAa,kBACtB,KAAK,WAAW,OAAO;YACtC;AACR,gBAAa,MAAM;AACnB,UAAO,oBAAoB,SAAS,aAAa;;;;AAKvD,eAAe,iBAAiB,KAAa,QAAsC;CACjF,MAAM,WAAW,MAAM,MAAM,KAAK,EAAE,QAAQ,CAAC;AAC7C,KAAI,CAAC,SAAS,GACZ,OAAM,IAAI,MAAM,mBAAmB,SAAS,SAAS;AAEvD,QAAO,MAAM,SAAS,MAAM;;AAG9B,SAAS,SAAS,KAAiC;AACjD,KAAI;AACF,SAAO,IAAI,IAAI,IAAI,CAAC;SACd;AACN;;;AAIJ,SAAgB,cAAc,KAAa,cAAiC;CAC1E,IAAI;AACJ,KAAI;AACF,WAAS,IAAI,IAAI,IAAI;SACf;AACN,SAAO;;AAET,KAAI,OAAO,aAAa,YAAY,OAAO,aAAa,QACtD,QAAO;CAET,MAAM,OAAO,OAAO,SAAS,aAAa;AAC1C,QAAO,aAAa,MAAM,UAAU;EAClC,MAAM,UAAU,MAAM,MAAM,CAAC,aAAa;AAC1C,MAAI,CAAC,QACH,QAAO;AAET,MAAI,QAAQ,WAAW,KAAK,CAC1B,QAAO,KAAK,SAAS,QAAQ,MAAM,EAAE,CAAC;AAExC,SAAO,SAAS;GAChB;;;;AC3FJ,IAAa,yBAAb,MAAoC;CAClC,yBAAS,IAAI,KAA4B;CAEzC,IAAI,OAAe;AACjB,SAAO,MAAA,MAAY;;CAKrB,SAAY,SAAyD;AACnE,MAAI,MAAA,MAAY,IAAI,QAAQ,GAAG,CAC7B,OAAM,IAAI,MAAM,oBAAoB,QAAQ,GAAG,yBAAyB;EAE1E,MAAM,QAAsB;GAC1B,IAAI,QAAQ;GACZ,MAAM,QAAQ;GACd,WAAW,KAAK,KAAK;GACrB,WAAW,QAAQ,cAAc,KAAA,IAAY,KAAA,IAAY,KAAK,KAAK,GAAG,QAAQ;GAC9E,MAAM,QAAQ;GACf;AACD,SAAO,IAAI,SAA4B,YAAY;GACjD,MAAM,OAAgB;IACpB,GAAG;IACH,UAAU,YAAY;AACpB,aAAQ,WAAW,SAAS,MAAM;AAClC,aAAQ,QAAQ;;IAEnB;AACD,OAAI,QAAQ,cAAc,KAAA,GAAW;AACnC,SAAK,QAAQ,iBAAiB;AAC5B,WAAA,OAAa,QAAQ,IAAI;MACvB,IAAI;MACJ,QAAQ;MACR,OAAO,2BAA2B,QAAQ,UAAU;MACpD,WAAW;MACZ,CAAC;OACD,QAAQ,UAAU;AACrB,SAAK,MAAM,SAAS;;AAEtB,SAAA,MAAY,IAAI,QAAQ,IAAI,KAAsB;IAClD;;CAGJ,OAAU,IAAY,OAAU,YAAuB,UAAmB;AACxE,SAAO,MAAA,OAAa,IAAI;GAAE,IAAI;GAAM;GAAO;GAAW,CAAC;;CAGzD,KAAK,IAAY,QAAgB,OAAe,YAAuB,UAAmB;AACxF,SAAO,MAAA,OAAa,IAAI;GAAE,IAAI;GAAO;GAAQ;GAAO;GAAW,CAAC;;CAGlE,IAAI,IAAqB;AACvB,SAAO,MAAA,MAAY,IAAI,GAAG;;CAG5B,IAAI,IAAsC;EACxC,MAAM,OAAO,MAAA,MAAY,IAAI,GAAG;AAChC,SAAO,QAAQ,QAAQ,KAAK;;CAG9B,KAAK,MAAoC;EACvC,MAAM,UAAU,CAAC,GAAG,MAAA,MAAY,QAAQ,CAAC,CAAC,IAAI,QAAQ;AACtD,SAAO,OAAO,QAAQ,QAAQ,MAAM,EAAE,SAAS,KAAK,GAAG;;CAGzD,UAAU,QAAgB,OAAe,MAA4B;EACnE,IAAI,WAAW;AAEf,OAAK,MAAM,QAAQ,MAAM,KAAK,MAAA,MAAY,QAAQ,CAAC,EAAE;AACnD,OAAI,QAAQ,KAAK,SAAS,KACxB;AAEF,OAAI,MAAA,OAAa,KAAK,IAAI;IAAE,IAAI;IAAO;IAAQ;IAAO,WAAW;IAAU,CAAC,CAC1E,aAAY;;AAGhB,SAAO;;CAGT,QAAQ,IAAY,SAA2C;EAC7D,MAAM,OAAO,MAAA,MAAY,IAAI,GAAG;AAChC,MAAI,CAAC,KACH,QAAO;AAET,eAAa,KAAK,MAAM;AACxB,QAAA,MAAY,OAAO,GAAG;AACtB,OAAK,QAAQ,QAAQ;AACrB,SAAO;;;AAIX,SAAS,QAAQ,MAAmC;AAClD,QAAO;EACL,IAAI,KAAK;EACT,MAAM,KAAK;EACX,WAAW,KAAK;EAChB,WAAW,KAAK;EAChB,MAAM,KAAK;EACZ;;;;ACjHH,IAAa,wBAAb,MAA2D;CACzD;CACA;CAEA,yBAAS,IAAI,KAA2B;CAExC,YAAY,SAAuC;AACjD,QAAA,UAAgB;AAChB,OAAK,WAAW,QAAQ,YAAY,IAAI,wBAAwB;;CAGlE,MAAM,SAAS,MAAyD;EACtE,MAAM,YAAY,KAAK,QAAQ,aAAa,MAAA,QAAc,aAAa;EACvE,MAAM,YAAY,KAAK,KAAK,GAAG;EAC/B,MAAM,QAA8B;GAClC,MAAM;GACN,aAAa,KAAK;GAClB,UAAU,KAAK;GACf,OAAO,KAAK;GACZ,SAAS,KAAK,KAAK,UAAU;GAC7B,QAAQ,KAAK;GACb;GACD;EAED,MAAM,UAAU,KAAK,SAAS,SAAuB;GACnD,IAAI,KAAK;GACT,MAAM;GACN;GACA,MAAM;IAAE,UAAU,KAAK;IAAM,WAAW,KAAK;IAAW;GACzD,CAAC;AAEF,MAAI,CAAC,MAAA,QAAc,KAAK,MAAM,EAAE;AAC9B,QAAK,SAAS,KAAK,KAAK,aAAa,aAAa,6CAA6C;AAC/F,UAAO;IACL,aAAa,KAAK;IAClB,QAAQ;IACR,QAAQ,kBAAkB,MAAM,QAAQ;IACzC;;EAGH,MAAM,QAAQ,MAAA,MAAY,IAAI,KAAK,YAAY;AAC/C,MAAI,OAAO;AACT,SAAA,MAAY,OAAO,KAAK,YAAY;AACpC,SAAA,YAAkB,KAAK,aAAa,MAAM;;EAK5C,MAAM,gBAAgB;AACpB,QAAK,SAAS,KAAK,KAAK,aAAa,WAAW,2BAA2B;;AAE7E,OAAK,QAAQ,iBAAiB,SAAS,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1D,UAAQ,MAAM,YAAY;AAC7B,QAAK,QAAQ,oBAAoB,SAAS,QAAQ;AAClD,OAAI,CAAC,QAAQ,MAAM,QAAQ,cAAc,SACvC,OAAA,QAAc,SAAS,KAAK,aAAa,QAAQ,OAAO;AAE1D,SAAA,QAAc,WAAW,KAAK,aAAa,kBAAkB,QAAQ,CAAC;IACtE;AAEF,SAAO;GAAE,aAAa,KAAK;GAAa,QAAQ;GAAW;;CAG7D,QAAQ,aAAqB,QAA+B;AAC1D,MAAI,CAAC,KAAK,SAAS,IAAI,YAAY,EAAE;AAEnC,SAAA,MAAY,IAAI,aAAa,OAAO;AACpC,oBAAiB,MAAA,MAAY,OAAO,YAAY,EAAE,IAAK,CAAC,SAAS;AACjE,UAAO;;AAET,SAAO,MAAA,YAAkB,aAAa,OAAO;;CAG/C,aAAa,aAAqB,QAA+B;AAC/D,SAAO,YAAY,SACf,KAAK,SAAS,OAAO,aAAa,QAAQ,SAAS,GACnD,KAAK,SAAS,KAAK,aAAa,OAAO,QAAQ,OAAO,OAAO,SAAS;;;AAI9E,SAAgB,kBAAkB,SAA4D;AAC5F,KAAI,QAAQ,MAAM,YAAY,QAAQ,OAAO;EAC3C,MAAM,EAAE,QAAQ,SAAS,QAAQ;AACjC,SAAO;GAAE,QAAQ;GAAM,QAAQ,OAAO;GAAO;GAAM;;AAErD,KAAI,QAAQ,IAAI;EACd,MAAM,UAAU,QAAQ;AACxB,SAAO;GAAE,QAAQ;GAAU,QAAQ,QAAQ;GAAQ,OAAO,QAAQ;GAAO,MAAM,QAAQ;GAAM;;AAE/F,QAAO;EAAE,QAAQ;EAAU,QAAQ,QAAQ;EAAQ,OAAO,QAAQ;EAAO;;;;ACpF3E,IAAa,mBAAb,MAAsD;CACpD;CACA;CACA;CAEA,YAAY,SAAkC;AAC5C,QAAA,UAAgB;AAChB,OAAK,UAAU,QAAQ,WAAW;AAClC,OAAK,YAAY,QAAQ;;CAG3B,WAAiC;AAC/B,SAAO;GAAE,SAAS,KAAK;GAAS,UAAU;GAAM,WAAW,KAAK;GAAW;;CAG7E,MAAM,SAAS,MAAyD;AACtE,QAAM,MAAA,QAAc,WAAW;GAC7B,aAAa,KAAK;GAClB,WAAW,KAAK;GAChB,MAAM,KAAK;GACX,OAAO,KAAK;GACZ,SAAS,KAAK,KAAK,UAAU;GAC7B,QAAQ,KAAK;GACb,WAAW,KAAK,cAAc,KAAA,IAAY,KAAA,IAAY,KAAK,KAAK,GAAG,KAAK;GACzE,CAAC;AACF,SAAO;GAAE,aAAa,KAAK;GAAa,QAAQ;GAAW;;;;;ACV/D,MAAM,iBAAiB,OAAO;AAE9B,SAAgB,kBAAkB,SAA0C;CAC1E,MAAM,MAAM,QAAQ,OAAO,WAAW;CACtC,MAAM,cAAgC,EAAE;AAExC,aAAY,KAAK;EACf,MAAM;EACN,OAAO;EACP,MAAM,KAAK;GACT,aAAa;GACb,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,QAAQ,IAAI,CAAC,SAAS,oBAAoB,EAAE,CAAC;GACrF,SAAS,OAAO,EAAE,WAAW,EAAE,OAAO,IAAI,KAAK,IAAI,EAAE;GACtD,CAAC;EACH,CAAC;AACF,aAAY,KAAK;EACf,MAAM;EACN,OAAO;EACP,MAAM,KAAK;GACT,aAAa;GACb,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;GAC3C,SAAS,OAAO,EAAE,WAAW;IAC3B,MAAM,UAAU,IAAI,KAAK,KAAK;AAC9B,QAAI,YAAY,KAAA,EACd,QAAO,EAAE,OAAO,iBAAiB,QAAQ;AAE3C,WAAO,EAAE,SAAS,SAAS,QAAQ,EAAE;;GAExC,CAAC;EACH,CAAC;AACF,aAAY,KAAK;EACf,MAAM;EACN,OAAO;EACP,MAAM,KAAK;GACT,aAAa;GACb,aAAa,EAAE,OAAO;IAAE,MAAM,EAAE,QAAQ;IAAE,SAAS,EAAE,QAAQ;IAAE,CAAC;GAChE,SAAS,OAAO,EAAE,MAAM,cAAc;AACpC,QAAI,MAAM,MAAM,QAAQ;AACxB,WAAO;KAAE;KAAM,OAAO,QAAQ;KAAQ;;GAEzC,CAAC;EACH,CAAC;AAEF,KAAI,QAAQ,iBAAiB;EAC3B,MAAM,kBAAkB,QAAQ;AAChC,cAAY,KAAK;GACf,MAAM;GACN,OAAO;GACP,MAAM,KAAK;IACT,aACE;IACF,aAAa,EAAE,OAAO;KACpB,MAAM,EAAE,QAAQ,CAAC,SAAS,qDAAqD;KAC/E,aAAa,EAAE,QAAQ,CAAC,UAAU,CAAC,SAAS,uCAAuC;KACpF,CAAC;IACF,SAAS,OAAO,EAAE,MAAM,kBAAkB;KACxC,MAAM,UAAU,IAAI,KAAK,KAAK;AAC9B,SAAI,YAAY,KAAA,EACd,QAAO,EAAE,OAAO,iBAAiB,QAAQ;KAE3C,MAAM,OAAO;MAAE;MAAM,OAAO,QAAQ;MAAQ;MAAa;AACzD,qBAAgB,KAAK;AACrB,YAAO;MAAE,WAAW;MAAM,GAAG;MAAM;;IAEtC,CAAC;GACH,CAAC;;AAGJ,KAAI,QAAQ,QAAQ;EAClB,MAAM,SAAS,QAAQ;AACvB,cAAY,KAAK;GACf,MAAM;GACN,OAAO;GACP,MAAM,KAAK;IACT,aAAa;IACb,aAAa,EAAE,OAAO;KACpB,OAAO,EAAE,QAAQ;KACjB,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,GAAG,CAAC,QAAQ,EAAE;KAClD,CAAC;IACF,SAAS,OAAO,EAAE,OAAO,aAAa,EAAE,SAAS,MAAM,OAAO,OAAO,MAAM,EAAE;IAC9E,CAAC;GACH,CAAC;;AAEJ,KAAI,QAAQ,UAAU;EACpB,MAAM,WAAW,QAAQ;AACzB,cAAY,KAAK;GACf,MAAM;GACN,OAAO;GACP,MAAM,KAAK;IACT,aAAa;IACb,aAAa,EAAE,OAAO;KACpB,KAAK,EAAE,QAAQ,CAAC,SAAS,uBAAuB;KAChD,MAAM,EAAE,QAAQ,CAAC,SAAS,8CAA8C;KACzE,CAAC;IACF,SAAS,OAAO,EAAE,KAAK,WAAW;AAChC,SAAI;MACF,MAAM,EAAE,MAAM,gBAAgB,MAAM,SAAS,IAAI;MACjD,MAAM,SAAS,SAAS,KAAK;AAC7B,UAAI,MAAM,MAAM,OAAO;AACvB,aAAO;OAAE;OAAM,OAAO,OAAO;OAAQ;OAAa;cAC3C,OAAO;AAEd,aAAO,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,EAAE;;;IAG7E,CAAC;GACH,CAAC;;AAGJ,KAAI,QAAQ,UAAU;EACpB,MAAM,WAAW,QAAQ;AACzB,cAAY,KAAK;GACf,MAAM;GACN,OAAO;GACP,MAAM,KAAK;IACT,aACE;IAGF,aAAa,EAAE,OAAO;KACpB,KAAK,EAAE,QAAQ,CAAC,SAAS,uBAAuB;KAChD,QAAQ,EAAE,QAAQ,CAAC,SAAS,0CAA0C;KACvE,CAAC;IACF,SAAS,OAAO,EAAE,KAAK,aAAa;AAClC,SAAI;AACF,aAAO,MAAM,SAAS,KAAK,OAAO;cAC3B,OAAO;AAEd,aAAO,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,EAAE;;;IAG7E,CAAC;GACH,CAAC;;AAGJ,aAAY,KAAK;EACf,MAAM;EACN,OAAO;EACP,MAAM,KAAK;GACT,aACE;GAGF,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;GAC9C,CAAC;EACH,CAAC;CAEF,MAAM,QAAiB,EAAE;AACzB,MAAK,MAAM,cAAc,YACvB,OAAM,WAAW,QAAQ,WAAW;AAGtC,QAAO;EACL;EACA;EACA;EACA,oBAAoB,YAAY,QAAQ,MAAM,EAAE,UAAU,YAAY,CAAC,KAAK,MAAM,EAAE,KAAK;EAC1F;;AAGH,SAAgB,aAAa,SAAsB,UAAgC;AACjF,QAAO,cACL,SACA,OAAO,YAAY,OAAO,QAAQ,SAAS,CAAC,KAAK,CAAC,MAAM,aAAa,CAAC,MAAM;EAAE,MAAM;EAAS,OAAO;EAA0B,CAAC,CAAC,CAAC,EACjI,WACD;;AAQH,SAAgB,cAAc,SAAsB,WAA+C,OAAO,aAA0B;CAClI,MAAM,UAAU,OAAO,QAAQ,UAAU;AACzC,KAAI,QAAQ,WAAW,EACrB,QAAO;CAET,MAAM,cAAc,CAAC,GAAG,QAAQ,YAAY;CAC5C,MAAM,QAAiB,EAAE,GAAG,QAAQ,OAAO;CAC3C,MAAM,qBAAqB,CAAC,GAAG,QAAQ,mBAAmB;AAC1D,MAAK,MAAM,CAAC,MAAM,EAAE,MAAM,UAAU,YAAY,SAAS;AACvD,MAAI,QAAQ,MAGV,OAAM,IAAI,MAAM,GAAG,KAAK,IAAI,KAAK,mDAAmD;EAEtF,MAAM,WAAW,OAAQ,SAAmC,YAAY;AACxE,MAAI,UAAU,eAAe,SAC3B,OAAM,IAAI,MACR,GAAG,KAAK,IAAI,KAAK,wJAElB;AAEH,MAAI,UAAU,mBAAmB,CAAC,SAChC,OAAM,IAAI,MACR,GAAG,KAAK,IAAI,KAAK,oHAElB;AAEH,cAAY,KAAK;GAAE;GAAM;GAAO,MAAM;GAAU,CAAC;AACjD,QAAM,QAAQ;AACd,MAAI,UAAU,YACZ,oBAAmB,KAAK,KAAK;;AAGjC,QAAO;EAAE,GAAG;EAAS;EAAO;EAAa;EAAoB;;AAG/D,SAAS,SAAS,MAAsB;AACtC,QAAO,KAAK,SAAS,iBAAiB,KAAK,MAAM,GAAG,eAAe,GAAG;;;;AC1NxE,MAAM,oBAAoB;AAC1B,MAAM,gBAAgB;AAItB,SAAgB,eAAe,UAA2B,EAAE,EAAc;CACxE,MAAM,YAAY,QAAQ,aAAa;CACvC,MAAM,kBAAkB,QAAQ,mBAAmB,OAAO;CAC1D,MAAM,mBAAmB,QAAQ,oBAAoB,KAAK;CAC1D,MAAM,aAAa,QAAQ,cAAc,MAAU;CACnD,MAAM,wBAAQ,IAAI,KAAyB;CAE3C,MAAM,YAAY,OAAO,WAA4C;EACnE,MAAM,SAAS,MAAM,IAAI,OAAO;AAChC,MAAI,UAAU,OAAO,YAAY,KAAK,KAAK,CACzC,QAAO,OAAO;EAGhB,IAAI,MAAM,SAAS,OAAO;AAC1B,MAAI,CAAC,IACH,QAAO;GAAE,KAAK;GAAQ,OAAO;GAA4C;EAG3E,MAAM,aAAa,IAAI,iBAAiB;EACxC,MAAM,QAAQ,iBAAiB,WAAW,OAAO,EAAE,QAAQ,aAAa,IAAO;AAC/E,MAAI;GACF,IAAI;AACJ,QAAK,IAAI,MAAM,IAAK,OAAO;IACzB,MAAM,SAAS,MAAM,WAAW,KAAK,QAAQ,aAAa;AAC1D,QAAI,OACF,QAAO;KAAE,KAAK,IAAI;KAAM,OAAO;KAAQ;AAEzC,eAAW,MAAM,UAAU,IAAI,MAAM;KACnC,UAAU;KACV,QAAQ,WAAW;KACpB,CAAC;AACF,QAAI,SAAS,SAAS,OAAO,SAAS,UAAU,IAC9C;IAEF,MAAM,WAAW,SAAS,QAAQ,IAAI,WAAW;AACjD,QAAI,CAAC,SACH,QAAO;KAAE,KAAK,IAAI;KAAM,OAAO,aAAa,SAAS,OAAO;KAAuB;IAErF,MAAM,SAAS,SAAS,IAAI,IAAI,UAAU,IAAI,CAAC,KAAK;AACpD,QAAI,CAAC,OACH,QAAO;KAAE,KAAK,IAAI;KAAM,OAAO,gCAAgC;KAAY;AAE7E,QAAI,OAAO,SAAS,IAAI,KACtB,QAAO;KACL,KAAK,IAAI;KACT,aAAa,OAAO;KACpB,QAAQ,mCAAmC,OAAO,KAAK;KACxD;AAEH,QAAI,OAAO,cACT,QAAO;KAAE,KAAK,IAAI;KAAM,OAAO;KAAsB;AAEvD,UAAM;;AAER,OAAI,CAAC,SAAS,GACZ,QAAO;IAAE,KAAK,IAAI;IAAM,OAAO,mBAAmB,SAAS;IAAU;GAEvE,MAAM,WAAW,OAAO,SAAS,QAAQ,IAAI,iBAAiB,IAAI,GAAG;AACrE,OAAI,WAAW,gBACb,QAAO;IAAE,KAAK,IAAI;IAAM,OAAO,uBAAuB,SAAS;IAAU;GAE3E,MAAM,OAAO,MAAM,WAAW,UAAU,gBAAgB;AACxD,OAAI,SAAS,KAAA,EACX,QAAO;IAAE,KAAK,IAAI;IAAM,OAAO,yBAAyB,gBAAgB;IAAU;GAGpF,MAAM,QADc,SAAS,QAAQ,IAAI,eAAe,IAAI,IACnC,SAAS,OAAO,IAAI,cAAc,KAAK,GAAG,eAAe,KAAK,GAAG;GAC1F,MAAM,YAAY,KAAK,SAAS;GAChC,MAAM,OAAuB;IAC3B,KAAK,IAAI;IACT,UAAU,YAAY,KAAK,MAAM,GAAG,iBAAiB,GAAG;IACxD,WAAW,aAAa,KAAA;IACzB;AACD,OAAI,MAAM,QAAQ,mBAAmB;IACnC,MAAM,SAAS,MAAM,MAAM,CAAC,MAAM,CAAC;AACnC,QAAI,WAAW,KAAA,EACb,OAAM,OAAO,OAAO;;AAGxB,SAAM,IAAI,QAAQ;IAAE,WAAW,KAAK,KAAK,GAAG;IAAY;IAAM,CAAC;AAC/D,UAAO;WACA,OAAO;GACd,MAAM,UAAU,WAAW,OAAO,UAAU,sBAAsB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AACxH,UAAO;IAAE,KAAK,IAAI;IAAM,OAAO;IAAS;YAChC;AACR,gBAAa,MAAM;;;AAIvB,QAAO,OAAO,QAAQ,WAAW;EAC/B,MAAM,OAAO,MAAM,UAAU,OAAO;AACpC,MAAI,KAAK,SAAS,KAAK,UAAU,CAAC,QAAQ,UAAU,KAAK,aAAa,KAAA,EACpE,QAAO;AAET,MAAI;GACF,MAAM,SAAS,MAAM,QAAQ,OAAO,KAAK,UAAU,OAAO;AAC1D,UAAO;IAAE,KAAK,KAAK;IAAK;IAAQ,WAAW,KAAK;IAAW;UACrD;AAEN,UAAO;;;;AAKb,SAAS,SAAS,KAA8B;AAC9C,KAAI;EACF,MAAM,MAAM,IAAI,IAAI,IAAI;AACxB,SAAO,IAAI,aAAa,YAAY,IAAI,aAAa,UAAU,MAAM,KAAA;SAC/D;AACN;;;AAMJ,eAAe,WAAW,KAAU,cAA4D;CAC9F,MAAM,OAAO,IAAI,SAAS,aAAa;AACvC,KAAI,gBAAgB,aAAa,SAAS,KAAK,CAAC,YAAY,MAAM,aAAa,CAC7E,QAAO,qBAAqB;AAE9B,KAAI,SAAS,eAAe,KAAK,SAAS,aAAa,CACrD,QAAO,qBAAqB;CAE9B,MAAM,UAAU,KAAK,QAAQ,YAAY,GAAG;AAC5C,KAAI,iBAAiB,QAAQ,CAC3B,QAAO,wBAAwB;AAEjC,KAAI,WAAW,KAAK,QAAQ,IAAI,QAAQ,SAAS,IAAI,CACnD,QAAO;CAET,IAAI;AACJ,KAAI;AACF,cAAY,MAAM,OAAO,SAAS,EAAE,KAAK,MAAM,CAAC;SAC1C;AACN,SAAO,wBAAwB;;AAEjC,MAAK,MAAM,EAAE,aAAa,UACxB,KAAI,iBAAiB,QAAQ,CAC3B,QAAO,uCAAuC;AAGlD,QAAO;;AAGT,SAAS,YAAY,MAAc,cAAiC;AAClE,QAAO,aAAa,MAAM,UAAU;EAClC,MAAM,UAAU,MAAM,MAAM,CAAC,aAAa;AAC1C,MAAI,CAAC,QACH,QAAO;AAET,MAAI,QAAQ,WAAW,KAAK,CAC1B,QAAO,KAAK,SAAS,QAAQ,MAAM,EAAE,CAAC;AAExC,SAAO,SAAS;GAChB;;AAGJ,SAAgB,iBAAiB,SAA0B;CACzD,MAAM,KAAK,QAAQ,aAAa;AAChC,KAAI,GAAG,SAAS,IAAI,EAAE;AACpB,MAAI,OAAO,QAAQ,OAAO,MACxB,QAAO;EAET,MAAM,SAAS,gCAAgC,KAAK,GAAG;AACvD,MAAI,OACF,QAAO,iBAAiB,OAAO,GAAI;AAErC,SAAO,GAAG,WAAW,KAAK,IAAI,GAAG,WAAW,KAAK,IAAI,YAAY,KAAK,GAAG;;CAE3E,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,OAAO;AACvC,KAAI,MAAM,WAAW,KAAK,MAAM,MAAM,MAAM,OAAO,MAAM,EAAE,IAAI,IAAI,KAAK,IAAI,IAAI,CAC9E,QAAO;CAET,MAAM,CAAC,GAAG,KAAK;AACf,KAAI,MAAM,KAAK,MAAM,MAAM,MAAM,IAC/B,QAAO;AAET,KAAI,MAAM,OAAO,KAAM,MAAM,KAAM,IACjC,QAAO;AAET,KAAI,MAAM,OAAO,MAAM,IACrB,QAAO;AAET,KAAI,MAAM,OAAO,KAAM,MAAM,KAAM,GACjC,QAAO;AAET,KAAI,MAAM,OAAO,MAAM,IACrB,QAAO;AAET,QAAO,KAAK;;AAGd,eAAe,WAAW,UAAoB,UAA+C;AAC3F,KAAI,CAAC,SAAS,MAAM;EAClB,MAAM,OAAO,MAAM,SAAS,MAAM;AAClC,SAAO,KAAK,SAAS,WAAW,KAAA,IAAY;;CAE9C,MAAM,SAAS,SAAS,KAAK,WAAW;CACxC,MAAM,UAAU,IAAI,aAAa;CACjC,IAAI,MAAM;AACV,UAAS;EACP,MAAM,EAAE,MAAM,UAAU,MAAM,OAAO,MAAM;AAC3C,MAAI,KACF;AAEF,SAAO,QAAQ,OAAO,OAAO,EAAE,QAAQ,MAAM,CAAC;AAC9C,MAAI,IAAI,SAAS,UAAU;AACzB,SAAM,OAAO,QAAQ,CAAC,YAAY,GAAG;AACrC;;;AAGJ,QAAO,MAAM,QAAQ,QAAQ;;AAG/B,SAAS,cAAc,MAAuB;AAC5C,QAAO,mCAAmC,KAAK,KAAK,MAAM,GAAG,KAAK,CAAC;;AAGrE,SAAgB,eAAe,MAAsB;CACnD,IAAI,OAAO,KACR,QAAQ,oBAAoB,GAAG,CAC/B,QAAQ,kEAAkE,GAAG,CAC7E,QAAQ,6BAA6B,GAAG;AAC3C,QAAO,KACJ,QAAQ,uCAAuC,GAAG,OAAe,SAAiB;AACjF,SAAO,OAAO,IAAI,OAAO,OAAO,MAAM,CAAC,CAAC,GAAG,UAAU,KAAK,CAAC,MAAM,CAAC;GAClE,CACD,QAAQ,kCAAkC,GAAG,SAAiB;AAC7D,SAAO,eAAe,eAAe,KAAK,QAAQ,YAAY,GAAG,CAAC,CAAC;GACnE,CACD,QAAQ,0DAA0D,GAAG,MAAc,SAAiB;EACnG,MAAM,QAAQ,UAAU,KAAK,CAAC,MAAM;AACpC,MAAI,CAAC,SAAS,KAAK,WAAW,IAAI,IAAI,KAAK,WAAW,cAAc,CAClE,QAAO;AAET,SAAO,UAAU,OAAO,QAAQ,IAAI,MAAM,IAAI,KAAK;GACnD,CACD,QAAQ,eAAe,OAAO,CAC9B,QAAQ,kEAAkE,OAAO,CACjF,QAAQ,qBAAqB,KAAK,CAClC,QAAQ,kCAAkC,SAAS,CACnD,QAAQ,8BAA8B,OAAO,CAC7C,QAAQ,mCAAmC,OAAO;AACrD,QAAO,eAAe,KAAK,QAAQ,YAAY,GAAG,CAAC;AACnD,QAAO,KACJ,QAAQ,aAAa,KAAK,CAC1B,QAAQ,WAAW,OAAO,CAC1B,QAAQ,cAAc,IAAI,CAC1B,MAAM;;AAGX,SAAS,UAAU,MAAsB;AACvC,QAAO,eAAe,KAAK,QAAQ,YAAY,GAAG,CAAC;;AAGrD,SAAS,eAAe,MAAsB;AAC5C,QAAO,KACJ,QAAQ,cAAc,GAAG,SAAiB,OAAO,cAAc,OAAO,KAAK,CAAC,CAAC,CAC7E,QAAQ,qBAAqB,GAAG,SAAiB,OAAO,cAAc,SAAS,MAAM,GAAG,CAAC,CAAC,CAC1F,QAAQ,WAAW,IAAI,CACvB,QAAQ,SAAS,IAAI,CACrB,QAAQ,SAAS,IAAI,CACrB,QAAQ,WAAW,KAAI,CACvB,QAAQ,iBAAiB,IAAI,CAC7B,QAAQ,UAAU,IAAI;;;;ACxQ3B,MAAM,mBAAmB;CACvB,QAAQ;CACR,UAAU;CACV,UAAU;CACV,cAAc;CACf;AAED,SAAgB,oBAAoB,SAA4C;CAC9E,MAAM,MAAM,QAAQ,OAAO,OAAO,UAAU,QAAQ,OAAO,UAAU,QAAQ,OAAO,QAAQ,MAAM,QAAQ,QAAQ;CAGlH,MAAM,WADY,QAAQ,eAAe,SAAS,IAE9C;EACE,SAAS,MAA+C;GACtD,MAAM,SAAU,QAAQ,eAA6D,KAAK;GAC1F,MAAM,UAAU,OAAO,QAAQ,YAAY,aAAa,QAAQ,QAAQ,KAAK,GAAG,QAAQ;AACxF,UAAO;IAAE,GAAG,OAAO,WAAW,KAAK;IAAE,GAAI,UAAU,EAAE,SAAS,GAAG,EAAE;IAAG;;EAExE,SAAS,MAAyB;AAEhC,UADgB,QAAQ,eAA6D,KACxE,CAAC,SAAS,KAAK;;EAE/B,GACA,QAAQ,gBAAuC;CAGpD,MAAM,UAAU,QAAQ,OAAO,gBAAgB,QAAQ,SAAS,SAAS;CACzE,MAAM,aAAa,QAAgD,YAAY,KAAA,KAAa,QAAQ,SAAS,iBAAiB,KAAK;CAGnI,IAAI;CACJ,MAAM,cAAc,UAAU,WAAW,GAAG,QAAQ,cAAc,WAAW,KAAA;CAC7E,MAAM,WACJ,OAAO,gBAAgB,aACnB,cACA,cACE,eAAe;EACb,GAAG;EACH,QACE,YAAY,WAAW,QACnB,KAAA,IACC,YAAY,YACX,UAAU,WACV,OAAQ,eACN;;UACa,SAAS,wBAAwB,SAC/C;EACV,CAAC,GACF,KAAA;CACR,MAAM,OAAO,kBAAkB;EAC7B;EACA,WAAW;EACX;EACA,QAAQ,UAAU,SAAS,GAAG,QAAQ,cAAc,SAAS,KAAA;EAC7D,UAAU,UAAU,WAAW,GAAG,QAAQ,cAAc,WAAW,KAAA;EACnE;EACA,iBACE,QAAQ,cAAc,iBAAiB,SAAS,CAAC,UAAU,eAAe,GAAG,KAAA,KAAa,SAAS,QAAQ,kBAAkB,KAAK;EACrI,CAAC;CACF,MAAM,kBAAkB,QAAQ,SAAS,SAAS;CAClD,MAAM,YAAY,QAAQ,KAAK,SAAS,QAAQ;AAChD,wBAAuB,QAAQ,SAAS,QAAQ,aAAa,iBAAiB,QAAQ,KAAK,UAAU;CACrG,MAAM,WAAW,eAAe,WAAW,gBAAgB;CAC3D,MAAM,UAAU,WAAW,aAAa,MAAM,SAAS,GAAG;CAC1D,MAAM,UAAU,QAAQ,QAAQ,cAAc,SAAS,QAAQ,MAAM,GAAG;AAExE,UAAS,IAAI,YACX;EACE,GAAG,QAAQ;EACX,eAAe,QAAQ,aAAa,QAAQ,SAAS,QAAQ,OAAO;EACpE,cAAc,QAAQ,SAAS,SAAS,gBAAgB,QAAQ,gBAAgB,QAAQ,OAAO;EAC/F,OAAO,QAAQ;EACf;EACA;EACA,iBAAiB,QAAQ;EACzB,kBAAkB,OAAO,QAAQ,YAAY,aAAa,KAAA,IAAa,QAAQ,WAAW;EAC1F,iBAAiB,QAAQ;EACzB,eAAe,QAAQ;EACvB,mBAAmB,QAAQ;EAC3B,kBAAkB,QAAQ,YAEpB,QAAQ,QACN,oBAAoB,KAAA,IAAY,QAAQ,IAAK,UAAU,QAAQ,IAAK,QAAQ,QAAQ,MAAM,gBAAgB,SAAS,EAAE,KAAK,CAAC,CAC5H,GACH,KAAA;EACL,EACD,QAAQ,GACT;AACD,QAAO;;AAGT,SAAS,uBACP,aACA,UACA,KACA,OACM;AACN,KAAI,CAAC,YAAY,SAAS,WAAW,EACnC;CAEF,MAAM,UAAU,SAAS,QAAQ,SAAS;AACxC,MAAI,KAAK;GACP,MAAM,SAAS,IAAI,QAAQ,MAAM,MAAM,EAAE,SAAS,KAAK;AACvD,UAAO,CAAC,UAAU,OAAO,WAAW;;AAEtC,SAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC,CAAC,MAAM,SAAS,KAAK,MAAM,KAAK,CAAC,OAAO,KAAK;GAC7E;AACF,KAAI,QAAQ,WAAW,EACrB;CAEF,MAAM,UAAU,QACb,KAAK,SAAS;EACb,MAAM,QAAQ,KAAK,QAAQ,MAAM,MAAM,EAAE,SAAS,KAAK,EAAE;AACzD,SAAO,QAAQ,GAAG,KAAK,IAAI,MAAM,KAAK;GACtC,CACD,KAAK,KAAK;AACb,OAAM,IAAI,MACR,YAAY,YAAY,mDAAmD,QAAQ,4FAEpF;;AAGH,SAAS,eAAe,OAA4B,SAAoD;AACtG,KAAI,CAAC,SAAS,YAAY,KAAA,EACxB,QAAO;CAET,MAAM,UAAU,IAAI,IAAI,QAAQ;AAChC,QAAO,OAAO,YAAY,OAAO,QAAQ,MAAM,CAAC,QAAQ,CAAC,UAAU,QAAQ,IAAI,KAAK,MAAM,KAAK,CAAC,GAAI,CAAC,CAAC;;AASxG,eAAsB,gBACpB,SACA,UAKI,EAAE,EACkB;CACxB,MAAM,UAAU,OAAO,QAAQ,QAAQ;AACvC,KAAI,QAAQ,WAAW,EACrB,QAAO;EAAE,OAAO,EAAE;EAAE,SAAS,EAAE;EAAE,OAAO,YAAY;EAAI;CAG1D,MAAM,EAAE,oBAAoB,MAAM,OAAO;CACzC,MAAM,UAAiD,EAAE;CACzD,MAAM,QAAiB,EAAE;CACzB,MAAM,WAAkC,EAAE;CAC1C,MAAM,WAAW,YAA2B;AAC1C,QAAM,QAAQ,WAAW,QAAQ,KAAK,MAAM,EAAE,OAAO,CAAC,CAAC;;AAGzD,MAAK,MAAM,CAAC,MAAM,WAAW,SAAS;EACpC,MAAM,WAAW,eAAe,OAAO;AACvC,MAAI;GACF,MAAM,SAAS,MAAM,gBAAgB;IACnC,WAAW,YAAY,OAAO;IAC9B,kBAAkB,UAAU,QAAQ,UAAU,MAAM,MAAM;IAC3D,CAAC;AACF,WAAQ,KAAK,OAAoD;GACjE,MAAM,YAAY,MAAM,OAAO,OAAO;AACtC,QAAK,MAAM,CAAC,UAAU,YAAY,OAAO,QAAQ,UAAU,CACzD,OAAM,GAAG,KAAK,IAAI,cAAc;AAElC,YAAS,KAAK;IACZ;IACA,QAAQ;IACR,GAAG;IAEH,OAAO,OAAO,QAAQ,UAAU,CAAC,KAAK,CAAC,UAAU,aAAa,WAAW,UAAU,QAAQ,CAAC;IAC7F,CAAC;WACK,OAAO;GACd,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AACtE,YAAS,KAAK;IAAE;IAAM,QAAQ;IAAU,OAAO;IAAS,GAAG;IAAU,CAAC;AACtE,WAAQ,UAAU,MAAM,MAAM;AAC9B,OAAI,QAAQ,UAAU;AACpB,UAAM,UAAU;AAChB,UAAM,IAAI,MAAM,eAAe,KAAK,uBAAuB,WAAW,EAAE,OAAO,OAAO,CAAC;;;;AAK7F,QAAO;EAAE;EAAO,SAAS;EAAU,OAAO;EAAU;;AAItD,SAAS,eAAe,QAAkG;AACxH,KAAI,SAAS,OACX,QAAO;EAAE,WAAW,OAAO,SAAS,QAAQ,QAAQ;EAAQ,KAAK,OAAO;EAAK;AAE/E,QAAO;EAAE,WAAW;EAAS,SAAS,OAAO;EAAS,MAAM,OAAO;EAAM;;AAK3E,SAAS,WAAW,MAAc,SAAqC;CACrE,MAAM,EAAE,aAAa,gBAAiB,WAAW,EAAE;AAInD,QAAO;EACL;EACA,aAAa,OAAO,gBAAgB,WAAW,cAAc,KAAA;EAC7D,aAAa,aAAa;EAC3B;;AAGH,SAAS,YAAY,QAA6B;AAChD,KAAI,EAAE,SAAS,QACb,OAAM,IAAI,MACR,2IAED;AAEH,QAAO,OAAO,SAAS,QACnB;EAAE,MAAM;EAAgB,KAAK,OAAO;EAAK,SAAS,OAAO;EAAS,GAClE;EAAE,MAAM;EAAiB,KAAK,OAAO;EAAK,SAAS,OAAO;EAAS;;;;AC3PzE,MAAa,iBAA+B;CAC1C,YACE;CAEF,QAAQ;EACN;GACE,OAAO;GACP,eAAe;GACf,aAAa;GACb,aAAa;GACb,SAAS;GACT,kBAAkB;IAAC;IAAO;IAAU;IAAQ;IAAS;IAAM;GAC5D;EACD;GACE,OAAO;GACP,eAAe;GACf,aAAa;GACb,aAAa;GACb,SAAS;GACT,kBAAkB;IAAC;IAAO;IAAU;IAAQ;IAAS;IAAM;GAC5D;EACD;GACE,OAAO;GACP,eAAe;GACf,aAAa;GACb,aAAa;GACd;EACD;GACE,OAAO;GACP,eAAe;GACf,aAAa;GACb,aAAa;GACb,SAAS;GACT,kBAAkB;IAAC;IAAO;IAAU;IAAQ;IAAS;IAAM;GAC5D;EACD;GACE,OAAO;GACP,eAAe;GACf,aAAa;GACb,aAAa;GACd;EACD;GACE,OAAO;GACP,eAAe;GACf,aAAa;GACb,aAAa;GACb,SAAS;GAET,kBAAkB,EAAE;GACrB;EACF;CACF;;;AC9CD,MAAa,gBAA+B;CAC1C,QAAQ;CACR,cAAc,oBAAoB;CAClC,SAAS;CACT,MAAM,kBAAkB,SAAS,KAAK;EACpC,MAAM,SAAS,MAAM,gBAAgB,IAAI;AACzC,MAAI,WAAW,YACb,QAAO,EAAE,WAAW,MAAM;AAE5B,MAAI,WAAW,aACb,QAAO;GACL,WAAW;GACX,QACE,gHACiC,QAAQ,aAAa,YAAY;GAErE;AAEH,SAAO,EAAE,WAAW,WAAW;;CAEjC,aAAa,EAAE,QAAQ,SAAS,MAAM;AACpC,MAAI,QACF,OAAM,IAAI,MAAM,oDAAoD;AAEtE,SAAO,IAAI,cAAc,QAAQ,GAAG;;CAEtC,MAAM,aAAa,EAAE,KAAK,OAAO,UAAU;AAEzC,UAAO,MADgBmF,aAAgB;GAAE;GAAK;GAAO;GAAQ,CAAC,EAC9C,KAAK,OAAO;GAC1B,WAAW,EAAE;GACb,SAAS,EAAE;GACX,cAAc,EAAE;GAChB,WAAW,EAAE;GACb,aAAa,EAAE;GACf,aAAa,EAAE;GACf,WAAW,EAAE;GACb,KAAK,EAAE;GACR,EAAE;;CAEN;;;;;;;;ACvCD,SAAgB,cAAc,MAA0C,WAA4C;CAClH,MAAM,MAA8B,EAAE;AACtC,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,CAC7C,KAAI,UAAU,KAAA,EACZ,KAAI,OAAO;AAGf,KAAI,UACF,KAAI,aAAa;AAEnB,QAAO;;;AAIT,MAAa,oBAAoB;CAC/B,YAAY;EACV,MAAM;EACN,OAAO;EACP,SAAS,YAAY;EACtB;CACD,cAAc,EAAE,iBAAiB,MAAM;CACxC;ACvBD,IAAa,eAAb,cAAkC,MAAM;CACtC;CACA,YAAY,MAAc,SAAiB;AACzC,QAAM,QAAQ;AACd,OAAK,OAAO;AACZ,OAAK,OAAO;;;AAUhB,IAAa,yBAAb,MAAoC;CAClC;CACA,UAAU;CACV,2BAAW,IAAI,KAAsB;CACrC,UAAU;CACV,UAAU;CACV;CACA;CACA;CAEA,YAAY,SAAgD;AAC1D,QAAA,SAAe,QAAQ;AACvB,QAAA,QAAc,QAAQ,IAAA,6BAAwB,KAAA;AAC9C,UAAQ,MAAM,GAAG,SAAS,UAA2B,MAAA,KAAW,OAAO,MAAM,CAAC,CAAC;AAE/E,UAAQ,MAAM,GAAG,eAAe,GAAG;AACnC,UAAQ,OAAO,GAAG,eAAe,GAAG;;CAGtC,QAAQ,QAAgB,QAAoC;AAC1D,MAAI,MAAA,OACF,QAAO,QAAQ,uBAAO,IAAI,MAAM,+BAA+B,OAAO,GAAG,CAAC;EAE5E,MAAM,KAAK,MAAA;AACX,SAAO,IAAI,SAAS,SAAS,WAAW;AACtC,SAAA,QAAc,IAAI,IAAI;IAAE;IAAQ;IAAS;IAAQ,CAAC;AAClD,SAAA,MAAY;IAAE;IAAI;IAAQ,GAAI,WAAW,KAAA,IAAY,EAAE,GAAG,EAAE,QAAQ;IAAG,CAAC;IACxE;;CAGJ,OAAO,QAAgB,QAAwB;AAC7C,MAAI,MAAA,OACF;AAEF,QAAA,MAAY;GAAE;GAAQ,GAAI,WAAW,KAAA,IAAY,EAAE,GAAG,EAAE,QAAQ;GAAG,CAAC;;CAGtE,eAAe,SAA0D;AACvE,QAAA,sBAA4B;;CAG9B,UAAU,SAA2F;AACnG,QAAA,iBAAuB;;CAGzB,KAAK,SAAuB;AAC1B,MAAI,MAAA,OACF;AAEF,QAAA,SAAe;EACf,MAAM,UAAU,CAAC,GAAG,MAAA,QAAc,QAAQ,CAAC;AAC3C,QAAA,QAAc,OAAO;AACrB,OAAK,MAAM,SAAS,QAClB,OAAM,uBAAO,IAAI,MAAM,GAAG,QAAQ,aAAa,MAAM,OAAO,GAAG,CAAC;;CAIpE,OAAO,SAAuB;AAC5B,MAAI;AACF,SAAA,OAAa,MAAM,KAAK,UAAU,QAAQ,GAAG,KAAK;UAC5C;;CAKV,MAAM,OAAqB;AACzB,QAAA,UAAgB;EAChB,IAAI;AACJ,UAAQ,UAAU,MAAA,OAAa,QAAQ,KAAK,KAAK,GAAG;GAClD,MAAM,OAAO,MAAA,OAAa,MAAM,GAAG,QAAQ,CAAC,MAAM;AAClD,SAAA,SAAe,MAAA,OAAa,MAAM,UAAU,EAAE;AAC9C,OAAI,CAAC,KACH;GAEF,IAAI;AACJ,OAAI;AACF,cAAU,KAAK,MAAM,KAAK;WACpB;AACN;;AAEF,SAAA,UAAgB,QAAQ;AACxB,SAAA,SAAe,QAAQ;;;CAI3B,WAAW,SAAwC;AACjD,MAAI,CAAC,MAAA,MACH;EAEF,MAAM,SAAS,QAAQ;AACvB,MAAI,OAAO,WAAW,SACpB;AAGF,MAAI,OAAO,WAAW,WAAW,IAAI,OAAO,WAAW,QAAQ,CAC7D;AAEF,MAAI;AACF,kBAAe,MAAA,OAAa,KAAK,UAAU,QAAQ,GAAG,KAAK;UACrD;;CAKV,UAAU,SAAwC;EAChD,MAAM,EAAE,IAAI,WAAW;AACvB,MAAI,OAAO,WAAW,UAAU;AAC9B,OAAI,OAAO,KAAA,KAAa,OAAO,MAAM;AACnC,UAAA,sBAA4B,QAAQ,QAAQ,OAAO;AACnD;;GAEF,MAAM,WAAW,YAAoB,MAAA,MAAY;IAAM;IAAuB,GAAG;IAAS,CAAC;GAC3F,MAAM,UAAU,MAAA;AAChB,OAAI,CAAC,SAAS;AACZ,YAAQ,EAAE,OAAO;KAAE,MAAM;KAAQ,SAAS,kCAAkC,OAAO;KAAI,EAAE,CAAC;AAC1F;;AAEF,WAAQ,QAAQ,QAAQ,QAAQ,GAAsB,CAAC,MACpD,WAAW,QAAQ,EAAE,QAAQ,UAAU,EAAE,EAAE,CAAC,GAC5C,UACC,QAAQ,EACN,OAAO;IACL,MAAM,iBAAiB,eAAe,MAAM,OAAO;IACnD,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;IAChE,EACF,CAAC,CACL;AACD;;AAEF,MAAI,OAAO,KAAA,KAAa,OAAO,KAC7B;EAEF,MAAM,UAAU,MAAA,QAAc,IAAI,GAAa;AAC/C,MAAI,CAAC,QACH;AAEF,QAAA,QAAc,OAAO,GAAa;AAClC,MAAI,QAAQ,UAAU,KAAA,KAAa,QAAQ,UAAU,MAAM;GACzD,MAAM,QAAQ,QAAQ;AACtB,WAAQ,OAAO,IAAI,aAAa,MAAM,QAAQ,QAAQ,MAAM,WAAW,YAAY,QAAQ,OAAO,UAAU,CAAC;AAC7G;;AAEF,UAAQ,QAAQ,QAAQ,OAAO;;;;;AChKnC,IAAa,oBAAb,MAA+B;CAC7B,4BAAY,IAAI,KAAyB;CACzC,iBAAiB;CAEjB,IAAI,eAA+C;AACjD,SAAO,MAAA,SAAe,IAAI,cAAc;;CAG1C,KAAK,eAAuB,WAAmB,WAA+B,IAAwB;EACpG,IAAI,SAAS,MAAA,SAAe,IAAI,cAAc;AAC9C,MAAI,CAAC,QAAQ;AACX,YAAS;IACP;IACA;IACA,QAAQ;IACR,WAAW;IACX,WAAW;IACX,yBAAS,IAAI,KAAK;IACnB;AACD,SAAA,SAAe,IAAI,eAAe,OAAO;;AAE3C,SAAO,cAAc;AACrB,SAAO;;CAGT,OAAO,QAA0B;AAC/B,SAAO,SAAS;AAChB,SAAO,eAAe,KAAA;;CAGxB,QAAQ,QAAoB,QAAiC;AAC3D,SAAO,SAAS;AAChB,SAAO,eAAe,EAAE,MAAA;EACxB,IAAI,UAAU;AACd,OAAK,MAAM,KAAK,MAAA,SAAe,QAAQ,CACrC,KAAI,EAAE,iBAAiB,KAAA,EACrB;AAGJ,SAAO,UAAU,kBAAkB;GACjC,IAAI;AACJ,QAAK,MAAM,KAAK,MAAA,SAAe,QAAQ,EAAE;AACvC,QAAI,EAAE,iBAAiB,KAAA,EACrB;AAEF,QAAI,CAAC,UAAU,EAAE,eAAe,OAAO,aACrC,UAAS;;AAGb,OAAI,CAAC,OACH;AAEF,SAAA,SAAe,OAAO,OAAO,cAAc;AAC3C;;;CAIJ,OAAO,QAAoB,QAAiC;AAC1D,MAAI,OAAO,WAAW,OACpB;AAEF,QAAA,OAAa,QAAQ,OAAO;;CAG9B,QAAc;AACZ,OAAK,MAAM,UAAU,MAAA,SAAe,QAAQ,CAC1C,KAAI,OAAO,WAAW,UACpB,OAAA,OAAa,QAAQ,SAAS;;CAKpC,SAAe;AACb,QAAA,SAAe,OAAO;;CAGxB,YAAsB;AACpB,SAAO,MAAM,KAAK,MAAA,SAAe,MAAM,CAAC;;CAG1C,OAAmC;AACjC,MAAI,MAAA,SAAe,SAAS,EAC1B;EAEF,MAAM,MAAsB,EAAE;AAC9B,OAAK,MAAM,KAAK,MAAA,SAAe,QAAQ,CACrC,KAAI,KAAK;GACP,WAAW,EAAE;GACb,WAAW,EAAE;GACb,QAAQ,EAAE;GACV,WAAW,EAAE;GACb,WAAW,EAAE;GACd,CAAC;AAEJ,SAAO;;;;;AC7FX,MAAM,WAAW;AAEjB,SAAS,OAAO,MAAc,KAAqB;CACjD,IAAI,IAAI;AACR,QAAO,IAAI,KAAK,WAAW,KAAK,OAAO,OAAO,KAAK,OAAO,KACxD;AAEF,QAAO;;AAKT,SAAS,iBAAiB,MAAc,KAA6B;CACnE,IAAI,MAAM;CACV,IAAI,IAAI,MAAM;AACd,QAAO,IAAI,KAAK,QAAQ;EACtB,MAAM,KAAK,KAAK;AAChB,MAAI,OAAO,KACT,QAAO;GAAE,OAAO;GAAK,KAAK,IAAI;GAAG;AAEnC,MAAI,OAAO,MAAM;GACf,MAAM,MAAM,KAAK,IAAI;AACrB,OAAI,QAAQ,IACV,QAAO;YACE,QAAQ,IACjB,QAAO;YACE,QAAQ,IACjB,QAAO;YACE,QAAQ,IACjB,QAAO;YACE,QAAQ,IACjB,QAAO;YACE,QAAQ,KACjB,QAAO;YACE,QAAQ,KACjB,QAAO;YACE,QAAQ,OAAO,QAAQ,KAAK;IACrC,MAAM,QAAQ,QAAQ,MAAM,IAAI;IAChC,MAAM,MAAM,KAAK,MAAM,IAAI,GAAG,IAAI,IAAI,MAAM;AAC5C,QAAI,IAAI,WAAW,SAAS,CAAC,iBAAiB,KAAK,IAAI,CACrD;IAEF,MAAM,OAAO,OAAO,SAAS,KAAK,GAAG;AACrC,QAAI,OAAO,QACT;AAEF,WAAO,OAAO,cAAc,KAAK;AACjC,SAAK;SAEL;AAEF,QAAK;AACL;;AAEF,SAAO;AACP;;;AAKJ,SAAS,mBAAmB,MAAc,KAA6B;CACrE,MAAM,QAAQ,KAAK,QAAQ,KAAK,MAAM,EAAE;AACxC,KAAI,UAAU,GACZ;AAEF,QAAO;EAAE,OAAO,KAAK,MAAM,MAAM,GAAG,MAAM;EAAE,KAAK,QAAQ;EAAG;;AAG9D,SAAS,aAAa,MAAc,KAA+B;CACjE,MAAM,OAAiB,EAAE;CACzB,IAAI,IAAI;AACR,UAAS;AACP,MAAI,OAAO,MAAM,EAAE;EACnB,MAAM,KAAK,KAAK;AAChB,MAAI,OAAO,QAAO,OAAO,KAAK;GAC5B,MAAM,MAAM,OAAO,OAAM,iBAAiB,MAAM,EAAE,GAAG,mBAAmB,MAAM,EAAE;AAChF,OAAI,CAAC,IACH;AAEF,QAAK,KAAK,IAAI,MAAM;AACpB,OAAI,IAAI;aACC,OAAO,KAAA,KAAa,SAAS,KAAK,GAAG,EAAE;GAChD,IAAI,MAAM;AACV,UAAO,MAAM,KAAK,UAAU,SAAS,KAAK,KAAK,KAAK,CAClD;AAEF,QAAK,KAAK,KAAK,MAAM,GAAG,IAAI,CAAC;AAC7B,OAAI;QAEJ;AAEF,MAAI,OAAO,MAAM,EAAE;AACnB,MAAI,KAAK,OAAO,IACd,QAAO;GAAE,OAAO;GAAM,KAAK;GAAG;AAEhC;;;AAMJ,SAAS,cAAc,MAAc,KAAa,OAA8D;CAC9G,IAAI,IAAI,OAAO,MAAM,IAAI;AACzB,KAAI,UAAU,MAAM,KAAK,OAAO,QAAO,KAAK,OAAO,MAAM;AACvD,MAAI,KAAK,WAAW,UAAO,EAAE,IAAI,KAAK,WAAW,OAAO,EAAE,CACxD;EAEF,MAAM,MAAM,KAAK,OAAO,OAAM,iBAAiB,MAAM,EAAE,GAAG,mBAAmB,MAAM,EAAE;AACrF,MAAI,CAAC,IACH;EAEF,MAAM,OAAO,OAAO,MAAM,IAAI,IAAI;AAClC,MAAI,OAAO,KAAK,UAAU,KAAK,UAAU,IACvC;AAEF,SAAO;GAAE,OAAO;GAAG,OAAO,IAAI;GAAO;;AAEvC,QAAO,IAAI,KAAK,QAAQ;EACtB,MAAM,KAAK,KAAK;AAChB,MAAI,OAAO,IACT;AAEF,MAAI,OAAO,QAAO,OAAO,KAAK;AAC5B,OAAI,KAAK,WAAW,UAAO,EAAE,IAAI,KAAK,WAAW,OAAO,EAAE,CACxD;GAEF,MAAM,MAAM,OAAO,OAAM,iBAAiB,MAAM,EAAE,GAAG,mBAAmB,MAAM,EAAE;AAChF,OAAI,CAAC,IACH;AAEF,OAAI,IAAI;AACR;;AAEF,MAAI,OAAO,OAAO,OAAO,IACvB;WACS,OAAO,OAAO,OAAO,KAAK;AACnC;AACA,OAAI,QAAQ,EACV;;AAGJ;;AAEF,QAAO,EAAE,OAAO;;AAGlB,SAAgB,yBAAyB,QAAiD;CACxF,MAAM,0BAAU,IAAI,KAAqB;CACzC,IAAI,UAAoB,EAAE;CAC1B,IAAI,aAAa;AACjB,MAAK,MAAM,WAAW,OAAO,MAAM,KAAK,EAAE;EACxC,MAAM,OAAO,QAAQ,SAAS,KAAK,GAAG,QAAQ,MAAM,GAAG,GAAG,GAAG;AAC7D,MAAI,aAAa,GAAG;GAClB,MAAM,UAAU,cAAc,MAAM,GAAG,WAAW;AAClD,OAAI,CAAC,QACH;AAEF,gBAAa,QAAQ;AACrB;;EAEF,MAAM,QAAQ,OAAO,MAAM,EAAE;AAC7B,MAAI,SAAS,KAAK,UAAU,KAAK,WAAW,IAC1C;AAEF,MAAI,KAAK,WAAW,KAAK;GACvB,MAAM,QAAQ,KAAK,WAAW,MAAM,MAAM;GAC1C,MAAM,OAAO,aAAa,MAAM,SAAS,QAAQ,IAAI,GAAG;AACxD,OAAI,CAAC,KACH;GAEF,MAAM,QAAQ,QAAQ,OAAO;AAC7B,OAAI,CAAC,KAAK,WAAW,OAAO,KAAK,IAAI,CACnC;GAEF,MAAM,OAAO,OAAO,MAAM,KAAK,MAAM,MAAM,OAAO;AAClD,OAAI,OAAO,KAAK,UAAU,KAAK,UAAU,IACvC;AAEF,OAAI,SAAS,KAAK,MAAM,OAAO,WAC7B;AAEF,aAAU,KAAK;AACf;;EAEF,MAAM,MAAM,aAAa,MAAM,MAAM;AACrC,MAAI,CAAC,IACH;AAEF,MAAI,KAAK,IAAI,SAAS,IACpB;EAEF,MAAM,UAAU,cAAc,MAAM,IAAI,MAAM,GAAG,EAAE;AACnD,MAAI,CAAC,QACH;AAEF,eAAa,QAAQ;EACrB,MAAM,OAAO,CAAC,GAAG,SAAS,GAAG,IAAI,MAAM;AACvC,MAAI,KAAK,OAAO,WACd;AAIF,MAAI,KAAK,SAAS,EAChB;AAEF,MAAI,KAAK,WAAW,KAAK,KAAK,OAAO,eAAe;AAClD,OAAI,eAAe,KAAK,QAAQ,UAAU,KAAA,EACxC;GAEF,MAAM,UAAU,KAAK;GACrB,MAAM,WAAW,QAAQ,IAAI,QAAQ;AACrC,OAAI,aAAa,KAAA,KAAa,aAAa,QAAQ,MACjD;AAEF,WAAQ,IAAI,SAAS,QAAQ,MAAM;;;AAGvC,KAAI,aAAa,EACf;AAEF,QAAO;;AAGT,SAAS,sBAAsB,YAAoB,WAAyC;CAC1F,MAAM,UAAU,KAAK,YAAY,OAAO;AACxC,KAAI;AACF,MAAI,CAAC,SAAS,QAAQ,CAAC,QAAQ,CAC7B,QAAO;EAET,MAAM,QAAQ,8BAA8B,KAAK,aAAa,SAAS,OAAO,CAAC;AAC/E,MAAI,CAAC,MACH,QAAO;EAET,MAAM,SAAS,QAAQ,YAAY,MAAM,GAAG;EAC5C,MAAM,KAAK,OAAO,YAAY,GAAG,IAAI,MAAM,MAAM;AACjD,MAAI,MAAM,EACR,QAAO;EAET,IAAI,OAAO,OAAO,MAAM,GAAG,GAAG;AAC9B,MAAI;AACF,UAAO,aAAa,KAAK;UACnB;AACR,SAAO,UAAU,IAAI,KAAK,KAAK;SACzB;AACN,SAAO;;;AAIX,SAAgB,uBAAuB,SAAiE;CACtG,IAAI;AACJ,KAAI;AACF,QAAM,aAAa,QAAQ,IAAI;SACzB;AACN;;CAEF,IAAI,OAAO,QAAQ,QAAQ,UAAU;AACrC,KAAI;AACF,SAAO,aAAa,QAAQ,UAAU;SAChC;CACR,MAAM,QAAkB,EAAE;CAC1B,IAAI,MAAM;AACV,UAAS;AACP,QAAM,KAAK,IAAI;AACf,MAAI,WAAW,KAAK,KAAK,OAAO,CAAC,CAC/B;EAEF,MAAM,SAAS,QAAQ,IAAI;AAC3B,MAAI,WAAW,IACb;AAEF,QAAM;;CAER,MAAM,SAAS,MAAM,MAAM,SAAS;CACpC,MAAM,UAAU,WAAW,KAAK,QAAQ,OAAO,CAAC,GAAG,SAAS,KAAA;CAC5D,MAAM,UAAU,UAAU,QAAQ,CAAC,IAAI,EAAE,QAAQ,UAAU;AACzD,MAAI,CAAC,WAAW,KAAK,OAAO,UAAU,cAAc,CAAC,CACnD,QAAO;AAET,MAAI;AAEF,UAAO,aAAa,KAAK,OAAO,SAAS,CAAC,KAAK;UACzC;AACN,UAAO;;GAET;AACF,KAAI,OAAO,WAAW,EACpB;CAEF,MAAM,iBAAiB,KAAK,QAAQ,WAAW,cAAc;CAC7D,IAAI,SAAS;AACb,KAAI;AACF,WAAS,aAAa,gBAAgB,OAAO;UACtC,OAAO;AAEd,MAAK,MAAgC,SAAS,SAC5C;;CAGJ,MAAM,UAAU,yBAAyB,OAAO;AAChD,KAAI,CAAC,QACH;AAEF,MAAK,MAAM,SAAS,QAAQ,QAAQ,CAClC,KAAI,UAAU,aAAa,UAAU,YACnC;CAKJ,MAAM,4BAAY,IAAI,KAAqB;AAC3C,MAAK,MAAM,CAAC,KAAK,UAAU,SAAS;EAClC,IAAI,OAAO;AACX,MAAI;AACF,UAAO,aAAa,IAAI;UAClB;AACR,MAAI,UAAU,IAAI,KAAK,KAAK,UAC1B;AAEF,YAAU,IAAI,MAAM,MAAM;;CAE5B,MAAM,cAAc,YAAY,KAAA,MAAc,UAAU,IAAI,QAAQ,KAAK,aAAa,sBAAsB,SAAS,UAAU;CAC/H,MAAM,UAAU,OAAO,QAAQ,UAAU;EACvC,MAAM,QAAQ,UAAU,IAAI,MAAM;AAClC,MAAI,UAAU,KAAA,EACZ,QAAO,UAAU;AAEnB,SAAO,CAAC;GACR;AACF,KAAI,QAAQ,WAAW,EACrB;CAEF,MAAM,WAAW,WAAW;CAC5B,MAAM,UAAU,QAAQ,KAAK,UAAU,KAAK,OAAO,UAAU,cAAc,CAAC;AAE5E,QACE,2CAFW,QAAQ,WAAW,IAAI,uBAAuB,QAAQ,GAAG,QAAQ,wBAAwB,QAAQ,KAAK,KAAK,CAAC,OAEvE,6HAE1C,SAAS,kDAAkD,SAAS,qCAC5C,eAAe;;;;AC3RjD,MAAM,yBAAkE;CACtE,SAAS;CACT,aAAa;CACb,MAAM;CACN,mBAAmB;CACpB;AAKD,MAAM,uBAA0E;CAC9E,SAAS,EAAE,MAAM,YAAY;CAC7B,aAAa,EAAE,MAAM,kBAAkB;CACvC,MAAM,EAAE,MAAM,kBAAkB;CAChC,mBAAmB,EAAE,MAAM,oBAAoB;CAChD;AASD,MAAM,eAAe,EACnB,UAAU;CACR,kBAAkB;CAClB,OAAO;CACP,kBAAkB;CAClB,qBAAqB;CACrB,gBAAgB;CACjB,EACF;AACD,MAAM,iBAAiB,EACrB,UAAU;CACR,kBAAkB;CAClB,OAAO;CACP,kBAAkB;CAClB,qBAAqB;CACrB,gBAAgB;CACjB,EACF;AACD,MAAM,8BAA8B,IAAI,IAAI;CAAC;CAAgB;CAAkB;CAA4B,CAAC;AAE5G,MAAM,0BAAmE;CACvE,SAAS;CACT,aAAa;CACb,MAAM;CACN,mBAAmB;CACpB;AAED,MAAM,6BAAsE;CAC1E,SAAS;CACT,aAAa;CACb,MAAM;CACN,mBAAmB;CACpB;AAED,MAAM,8BAA8B;AAEpC,MAAa,mBAAmB;AAEhC,MAAa,mBAAmB;AAEhC,MAAa,oBAAoB;AAEjC,SAAS,UAAU,WAA0D;AAC3E,KAAI,OAAO,cAAc,SACvB;AAGF,QADa,UAAU,MAAM,IAAI,CAAC,OAAO,QAAQ,CAAC,GAAG,GAC1C,IAAI,KAAA;;AAGjB,SAAS,YAAY,MAAiE;AACpF,QAAO;EACL,MAAM,KAAK;EACX,GAAI,KAAK,mBAAmB,SAAS,EAAE,mBAAmB,KAAK,mBAAmB,GAAG,EAAE;EACvF,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,QAAQ,GAAG,EAAE;EAC9C,GAAI,KAAK,QAAQ,EAAE,OAAO,KAAK,OAAO,GAAG,EAAE;EAC5C;;AAGH,SAAS,WAAW,MAAyC;CAC3D,MAAM,QAAQ,MAAM,QAAQ,KAAK,MAAM,GAAG,KAAK,QAAQ,EAAE;AACzD,MAAK,IAAI,QAAQ,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS;EACtD,MAAM,OAAO,MAAM;AACnB,MAAI,MAAM,SAAS,kBAAkB,OAAO,KAAK,SAAS,YAAY,KAAK,KACzE,QAAO,KAAK;;;AAMlB,MAAM,yBAAyB;AAE/B,SAAS,YAAY,QAAyB;AAC5C,QAAO,OAAO,SAAS,KAAK,OAAO,UAAU,0BAA0B,CAAC,OAAO,WAAW,QAAQ;;AAGpG,SAAS,eAAe,MAAsB;AAC5C,QAAO,WAAW,SAAS,CAAC,OAAO,KAAK,CAAC,OAAO,MAAM,CAAC,MAAM,GAAG,GAAG;;AAGrE,MAAM,uBAA+C;CACnD,KAAK;CACL,KAAK;CACL,MAAM;CACN,KAAK;CACL,MAAM;CACN,KAAK;CACL,KAAK;CACN;AAED,SAAS,kBAAkB,MAAkC;AAE3D,QAAO,qBADW,KAAK,MAAM,KAAK,YAAY,IAAI,GAAG,EAAE,CAAC,aACnB;;AAGvC,SAAS,UAAU,OAA0C;AAC3D,QAAO;EACL,MAAM,MAAM;EACZ,GAAI,MAAM,cAAc,EAAE,aAAa,MAAM,aAAa,GAAG,EAAE;EAC/D,GAAK,MAAM,WAAW,oBAAoB,MAAM,mBAC5C,EAAE,kBAAkB,MAAM,WAAW,oBAAoB,MAAM,kBAAkB,GACjF,EAAE;EACN,GAAI,MAAM,WAAW,cAAc,EAAE,aAAa,MAAM,UAAU,aAAa,GAAG,EAAE;EACpF,GAAI,MAAM,WAAW,gBAAgB,EAAE,eAAe,MAAM,UAAU,eAAe,GAAG,EAAE;EAC1F,GAAI,MAAM,QAAQ,EAAE,OAAO,MAAM,OAAO,GAAG,EAAE;EAE7C,SAAS,MAAM,YAAY;EAC5B;;AAGH,SAAS,YACP,YACA,QACA,UACQ;AACR,KAAI,QAAQ,WAAW,SACrB,QAAO,OAAO,kBAAkB,6BAA6B,eAAe;AAE9E,KAAI,QAAQ,WAAW,YACrB,QAAO;AAET,KAAI,eAAe,cACjB,QAAO;AAET,KAAI,QAAQ,WAAW,QACrB,QAAO;AAET,KAAI,SACF,QAAO;AAET,QAAO;;AAGT,SAAS,cACP,QACA,QACqB;CACrB,MAAM,QAAQ,OAAO,QAAQ,OAAO,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,KAAK,UAAU;AACxE,MAAI,CAAC,KACH,QAAO,EAAE;EAEX,MAAM,cAAc,KAAK;AACzB,SAAO,CACL;GACE,MAAM,KAAK,QAAQ;GACnB,GAAI,KAAK,cAAc,EAAE,aAAa,KAAK,aAAa,GAAG,EAAE;GAC7D,GAAI,KAAK,gBAAgB,KAAA,IAAY,EAAE,aAAa,KAAK,aAAa,GAAG,EAAE;GAC3E,GAAI,cACA,EACE,aAAa;IACX,GAAI,YAAY,gBAAgB,OAAO,EAAE,UAAU,YAAY,cAAc,GAAG,EAAE;IAClF,GAAI,YAAY,mBAAmB,OAAO,EAAE,aAAa,YAAY,iBAAiB,GAAG,EAAE;IAC3F,GAAI,YAAY,iBAAiB,OAAO,EAAE,WAAW,YAAY,eAAe,GAAG,EAAE;IACtF,EACF,GACD,EAAE;GACP,CACF;GACD;AACF,QAAO;EACL,MAAM,OAAO;EACb,QAAQ,YAAY,OAAO,cAAc,KAAA,GAAW,QAAQ,MAAM,SAAS,EAAE;EAC7E,GAAI,QAAQ,QAAQ,EAAE,OAAO,OAAO,OAAO,GAAG,EAAE;EAChD,GAAI,OAAO,YAAY,OAAO,EAAE,YAAY;GAAE,MAAM,OAAO,WAAW;GAAM,SAAS,OAAO,WAAW,WAAW;GAAI,EAAE,GAAG,EAAE;EAC7H,GAAI,MAAM,SAAS,IAAI,EAAE,OAAO,GAAG,EAAE;EACtC;;AAGH,SAAS,qBAAqB,MAA6D;AACzF,QAAO;EACL,GAAI,KAAK,gBAAgB,EAAE,QAAQ,KAAK,eAAe,GAAG,EAAE;EAC5D,GAAI,KAAK,YAAY,EAAE,WAAW,KAAK,WAAW,GAAG,EAAE;EACxD;;AAGH,SAAS,iBAAiB,QAA0C;CAClE,MAAM,MAAO,QAA6C;AAC1D,KAAI,CAAC,MAAM,QAAQ,IAAI,CACrB;CAEF,MAAM,wBAAQ,IAAI,KAAa;AAC/B,MAAK,MAAM,SAAS,IAClB,KAAI,OAAO,UAAU,SACnB,OAAM,IAAI,MAAM;UACP,SAAS,OAAO,UAAU,SACnC,MAAK,MAAM,OAAO,OAAO,KAAK,MAAM,CAClC,OAAM,IAAI,IAAI;AAIpB,QAAO,MAAM,OAAO,IAAI,QAAQ,KAAA;;AAGlC,SAAS,aAAa,UAA4B,WAAoB,SAAsD;CAC1H,MAAM,OAAO,SAAiB,CAAC,WAAW,QAAQ,IAAI,KAAK;AAC3D,KAAI,aAAa,QACf,QAAO,IAAI,SAAS,GAAG,WAAW,KAAA;AAEpC,KAAI,aAAa,IAAI,SAAS,CAC5B,QAAO;AAET,QAAO;;AAGT,SAAS,uBAAuB,WAAkE;AAChG,QAAO,UAAU,KAAK,cAAc;EAClC,UAAU,SAAS;EACnB,QAAQ,SAAS,UAAU;EAC3B,UAAU,SAAS,WAAW,EAAE,EAAE,KAAK,YAAY;GACjD,OAAO,OAAO;GACd,aAAa,OAAO;GACrB,EAAE;EACJ,EAAE;;AAGL,SAAS,gBAAgB,MAAwC;AAC/D,KAAI,CAAC,MAAM,QAAQ,KAAK,QAAQ,CAC9B,QAAO;CAET,IAAI,SAAS;CACb,MAAM,OAAO,KAAK,QACf,KAAK,SAAS;EACb,MAAM,YAAY;AAClB,MAAI,WAAW,SAAS,UAAU,OAAO,UAAU,SAAS,SAC1D,QAAO,UAAU;AAEnB,MAAI,OAAO,WAAW,SAAS,YAAY,UAAU,KAAK,aAAa,CAAC,SAAS,QAAQ,CACvF,WAAU;AAEZ,SAAO;GACP,CACD,OAAO,QAAQ,CACf,KAAK,KAAK;AACb,KAAI,KACF,QAAO;AAET,QAAO,SAAS,IAAI,IAAI,WAAW,IAAI,UAAU,GAAG,OAAO,SAAS,KAAK;;AAG3E,SAAS,aACP,WACA,SACuC;CACvC,MAAM,MAA6C,EAAE;AACrD,MAAK,MAAM,YAAY,WAAW;EAChC,MAAM,QAAQ,UAAU,SAAS,aAAa,UAAU,SAAS;AACjE,MAAI,OAAO,UAAU,YAAY,MAAM,SAAS,EAC9C,KAAI,SAAS,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE;;AAG3C,QAAO;;AAgBT,SAAS,gBAAgB,UAAgD,QAAkE;AACzI,QAAO;EACL;EACA;EACA,QAAQ,SAAS,eAAe,YAAY;GAC1C,MAAM,WAAW,aAAa,SAAS,OAAO,QAAQ;AACtD,UAAO,WAAW;IAAE,UAAU,EAAE,UAAU;IAAE;IAAU,GAAG,KAAA;;EAE3D,OAAO,SAAS,WAAW,YAAY;GACrC,MAAM,WAAW,aAAa,QAAQ,WAAW,QAAQ;AACzD,UAAO;IAAE,UAAU,EAAE,UAAU;IAAE;IAAU;;EAE9C;;AAGH,MAAM,oBAAqD;CACzD,yCAAyC,iBACtC,QAAQ;EACP,MAAM,SAAS;EACf,MAAM,UAAU,OAAO,WAAW,KAAA;AAClC,SAAO;GACL,UAAU;GACV,OAAO;IACL,GAAI,YAAY,KAAA,IAAY,EAAE,SAAS,GAAG,EAAE;IAC5C,GAAI,OAAO,MAAM,EAAE,KAAK,OAAO,KAAK,GAAG,EAAE;IACzC,GAAI,OAAO,SAAS,EAAE,QAAQ,OAAO,QAAQ,GAAG,EAAE;IACnD;GACD,OAAO,OAAO,WAAW,UAAU,uBAAuB,YAAY;GACtE,aAAa;GACb,aAAa,OAAO,UAAU,UAAU,UAAW,OAAO,OAAO,KAAA;GACjE,gBAAgB,OAAO,UAAU,KAAA;GAClC;KAEF,QAAS,IAAuC,OAClD;CACD,mCAAmC,iBAChC,QAAQ;EACP,MAAM,SAAS;AACf,SAAO;GACL,UAAU;GACV,OAAO;IACL,GAAI,OAAO,YAAY,EAAE,WAAW,OAAO,WAAW,GAAG,EAAE;IAC3D,GAAI,OAAO,SAAS,EAAE,QAAQ,OAAO,QAAQ,GAAG,EAAE;IACnD;GACD,OAAO,OAAO,UAAU;GACxB,aAAa;GACb,aAAa,OAAO,YAAY,sBAAsB,OAAO,cAAc,KAAA;GAC3E,gBAAgB,OAAO,UAAU,KAAA;GAClC;KAEF,QAAS,IAA0C,OACrD;CACD,oCAAoC;EAClC,WAAW,QAAQ;GACjB,MAAM,SAAS;AACf,UAAO;IACL,UAAU;IACV,OAAO;KACL,GAAI,OAAO,cAAc,EAAE,aAAa,OAAO,aAAa,GAAG,EAAE;KACjE,GAAI,OAAO,MAAM,EAAE,KAAK,OAAO,KAAK,GAAG,EAAE;KACzC,GAAI,OAAO,SAAS,EAAE,QAAQ,OAAO,QAAQ,GAAG,EAAE;KACnD;IACD,OAAO,OAAO,UAAU;IACxB,aAAa;IACb,aAAa,KAAA;IACb,gBAAgB,OAAO,UAAU,KAAA;IAClC;;EAEH,SAAS,QAAS,IAA2C;EAC7D,QAAQ,KAAK,kBAAkB,EAC7B,UAAU,EACR,aACG,cAAc,eACd,IAA2C,eAC5C,EAAE,EACL,EACF;EACD,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,EAAE,EAAE;EAC/C;CACD,8BAA8B;EAC5B,WAAW,SAAS;GAClB,UAAU;GACV,OAAO,EACL,WAAW,uBAAwB,IAAiC,aAAa,EAAE,CAAC,EACrF;GACD,OAAO;GACP,aAAa;GACb,aAAa,KAAA;GACb,gBAAgB,KAAA;GACjB;EACD,SAAS,QAAS,IAAiC;EACnD,QAAQ,KAAK,kBAAkB,EAC7B,UAAU,EACR,SAAS,aACN,IAAiC,aAAa,EAAE,EACjD,cAAc,QACf,EACF,EACF;EACD,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE;EAC3C;CACD,iCAAiC;EAC/B,WAAW,QAAQ;GACjB,MAAM,SAAS;AACf,UAAO;IACL,UAAU;IACV,OAAO;KACL,GAAI,OAAO,aAAa,EAAE,YAAY,OAAO,YAAY,GAAG,EAAE;KAC9D,GAAI,OAAO,UAAU,EAAE,SAAS,OAAO,SAAS,GAAG,EAAE;KACrD,GAAI,OAAO,OAAO,EAAE,MAAM,OAAO,MAAM,GAAG,EAAE;KAC5C,GAAI,OAAO,oBAAoB,KAAA,IAAY,EAAE,iBAAiB,OAAO,iBAAiB,GAAG,EAAE;KAC3F,GAAI,OAAO,MAAM,EAAE,KAAK,OAAO,KAAK,GAAG,EAAE;KAC1C;IACD,OAAO,OAAO,aAAa,eAAe,OAAO,WAAW,oBAAoB;IAChF,aAAa;IACb,aAAa,OAAO,WAAW,KAAA;IAC/B,gBAAgB,KAAA;IACjB;;EAEH,cAAc,KAAA;EACd,QAAQ,MAAM,kBAAkB,EAC9B,UAAU;GACR,QAAQ;GACR,GAAI,iBAAiB,KAAA,IAAY,EAAE,SAAS,cAAc,GAAG,EAAE;GAChE,EACF;EACD,OAAO,MAAM,eAAe,EAAE,UAAU,EAAE,QAAQ,YAAY,WAAW,WAAW,EAAE;EACvF;CACF;AAsBD,SAAS,oBAAoB,SAAwD;AACnF,KAAI,OAAO,YAAY,YAAY,CAAC,OAAO,SAAS,QAAQ,IAAI,WAAW,EACzE;AAEF,KAAI,YAAY,IACd,QAAO;AAET,KAAI,YAAY,MACd,QAAO;AAET,QAAO,UAAU,QAAQ;;AAoB3B,IAAa,cAAb,MAA2C;CACzC;CACA;CAEA;CACA;CACA,OAAO,IAAI,UAAU;CACrB,eAAe,IAAI,eAAe;CAClC,UAAyB;CACzB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,SAAuB,EAAE;CACzB,aAA4B,QAAQ,SAAS;CAC7C;CACA;CACA;CACA,gBAAgB;CAChB,YAAY;CACZ;CACA,WAAW;CACX,UAAU;CACV;CACA,6BAAa,IAAI,KAAmC;CACpD,mBAAmB;CACnB;CACA,oBAAoB;CACpB;CACA;CACA,iCAAiB,IAAI,KAAa;CAClC,6BAAa,IAAI,KAAyE;CAC1F,UAAU,IAAI,mBAAmB;CACjC,kCAAkB,IAAI,KAAa;CAEnC,YAAY,QAA2B,KAAa,YAAY,EAAE;EAChE,MAAM,OAAO,OAAO,kBAAkB;AACtC,MAAI,CAAC,oBAAoB,MAAM,gBAAgB,SAAS,KAAK,CAC3D,OAAM,IAAI,MAAM,oBAAoB,KAAK,wCAAwC;AAEnF,MAAI,OAAO,YACT,OAAM,IAAI,MAAM,gDAAgD;AAElE,MAAI,CAAC,OAAO,IACV,OAAM,IAAI,MAAM,kCAAkC;AAEpD,QAAA,MAAY,OAAO;AACnB,QAAA,SAAe;AACf,QAAA,iBAAuB;AACvB,QAAA,QAAc,OAAO;AACrB,QAAA,kBAAwB,OAAO;AAC/B,QAAA,eAAqB,OAAO;AAC5B,OAAK,KAAK;AACV,OAAK,YAAY,KAAK,KAAK;;CAG7B,YAAoC;AAClC,SAAO,cAAc,MAAA,OAAa,OAAO,QAAQ,KAAK,MAAA,OAAa,UAAU;;CAG/E,IAAI,SAAwB;AAC1B,SAAO,MAAA;;CAGT,IAAI,eAAmC;AACrC,SAAO,MAAA;;CAGT,IAAI,UAAkB;AACpB,SAAO,MAAA,IAAU;;CAGnB,IAAI,mBAAwC;AAC1C,SAAO,CAAC,GAAG,MAAA,UAAgB,QAAQ,CAAC,CAAC,KAAK,YAAY,QAAQ,QAAQ;;CAGxE,OAAoB;AAClB,SAAO;GACL,IAAI,KAAK;GACT,cAAc,MAAA;GACd,QAAQ,MAAA;GACR,KAAK,MAAA;GACL,SAAS,MAAA,OAAa;GACtB,QAAQ;GACR,cAAc,oBAAoB;GAClC,OAAO,MAAA,SAAe,MAAA;GACtB,gBAAgB,MAAA;GAChB,sBAAsB;GACtB,WAAW,KAAK;GAChB,SAAS,MAAA,IAAU;GACnB,eAAe,MAAA,IAAU;GACzB,YAAY,MAAA,IAAU;GACtB,cAAc,MAAA,IAAU;GACxB,wBAAwB,MAAA,UAAgB;GACxC,MAAM,MAAA,OAAa;GACnB,OAAO,MAAA,OAAa;GACpB,OAAO,aAAa,MAAA,OAAa;GACjC,cAAc,MAAA;GACd,UAAU,MAAA,YAAkB,KAAA;GAC5B,gBAAgB,MAAA,IAAU;GAC1B,WAAW,MAAA,OAAa,MAAM;GAC/B;;CAGH,SAAS,OAAiC;AACxC,QAAA,SAAe,UAAU,MAAA,QAAc,MAAM;;CAG/C,QAAuB;AACrB,MAAI,MAAA,QACF,QAAO,MAAA;AAET,QAAA,UAAgB;AAChB,QAAA,sBAA4B;AAC5B,MAAI,MAAA,OAAa,UAAU,MAAA,OAAa,oBAAoB,OAAO;AACjE,SAAA,kBAAwB;AACxB,SAAA,YAAkB,MAAA,UAAgB,WAAW,MAAA,iBAAuB,CAAC;QAErE,OAAA,UAAgB,OAAO;AAEzB,MAAI,MAAA,OAAa,OACf,MAAK,YAAY,MAAA,OAAa,OAAO;AAEvC,MAAI,CAAC,MAAA,OAAa,UAAU,CAAC,MAAA,OAAa,OACnC,OAAA,aAAmB;AAE1B,SAAO,MAAA;;CAGT,wBAA8B;AAC5B,MAAI,MAAA,mBAAyB,UAC3B;AAEF,MAAI;GACF,MAAM,MAAM,MAAA,UAAgB;GAC5B,MAAM,MAAM,IAAI;AAChB,OAAI,QAAQ,KAAA,KAAa,IAAI,WAAW,EACtC;GAEF,MAAM,YAAY,OAAO,KAAK,IAAI,QAAQ,SAAS,EAAE,SAAS;GAC9D,MAAM,UAAU,uBAAuB;IAAE,KAAK,MAAA;IAAW;IAAW,CAAC;AACrE,OAAI,QACF,OAAA,KAAW;IAAE,MAAM;IAAiB;IAAS,CAAC;UAE1C;;CAGV,OAAA,cAAoC;EAClC,IAAI;AACJ,MAAI;AACF,gBAAa,MAAM,MAAA,uBAA6B;AAChD,OAAI,MAAA,OACF;AAEF,SAAM,MAAA,cAAoB,WAAW;UAC/B,WACE;AACR,eAAY,OAAO;;;CAIvB,OAAA,wBAA6D;EAC3D,MAAM,aAAa,MAAA,OAAa,UAAU,EAAE,KAAK,MAAA,UAAgB,EAAE,CAAC;AACpE,MAAI;AACF,SAAM,WAAW,QAAQ,cAAc,kBAAkB;AACzD,cAAW,OAAO,cAAc;AAChC,UAAO;WACA,OAAO;AACd,cAAW,OAAO;AAClB,SAAM;;;CAIV,YAAY,MAAc,aAAgD;AACxE,MAAI,MAAA,OACF,OAAM,IAAI,MAAM,oBAAoB;AAEtC,MAAI,KAAK,MAAM,KAAK,YAAY,CAAC,aAAa,QAAQ;AAC/C,QAAK,cAAc,CAAC,OAAO,UAAmB;AACjD,UAAA,KAAW;KACT,MAAM;KACN,SAAS,qCAAqC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;KACrG,CAAC;KACF;AACF;;EAEF,MAAM,QAAQ,MAAA,WAAiB,MAAM,eAAe,EAAE,CAAC;EACvD,MAAM,aACJ,MAAA,KAAW;GACT,MAAM;GACN,SAAS;IAAE,MAAM;IAAQ,SAAS;IAAM;GACxC,iBAAiB;GACjB,aAAa,aAAa,SAAS,YAAY,IAAI,cAAc,GAAG,KAAA;GACpE,MAAM,YAAY;GACnB,CAAC;AACJ,MAAI,MAAA,gBACF,OAAA,YAAkB,MAAA,UAAgB,KAAK,KAAK;MAE5C,OAAM;AAER,QAAA,MAAY,KAAK,EAAE,OAAO,CAAC;AAC3B,QAAA,cAAoB;;CAGtB,YAAY,MAAc,aAA+D;EACvF,MAAM,QAA8B,EAAE;AACtC,OAAK,MAAM,cAAc,aAAa;GACpC,MAAM,YAAY,mBAAmB,WAAW,UAAU;AAC1D,WAAQ,eAAe,UAAU,EAAjC;IACE,KAAK,SAAS;AACZ,WAAA,aAAmB,KAAK,QAAQ,EAAE,oBAAoB,KAAK,KAAK;AAChE,eAAU,MAAA,UAAgB,EAAE,WAAW,MAAM,CAAC;KAC9C,MAAM,MAAM,UAAU,MAAM,IAAI,CAAC,MAAM;KACvC,MAAM,OAAO,KAAK,MAAA,UAAgB,GAAG,WAAW,GAAG,GAAG,MAAM;AAC5D,mBAAc,MAAM,OAAO,KAAK,WAAW,MAAM,SAAS,CAAC;AAC3D,WAAM,KAAK;MAAE,MAAM;MAAc;MAAM,CAAC;AACxC;;IAEF,KAAK;AACH,WAAM,KAAK;MACT,MAAM;MACN,MACE,qBAAqB,WAAW,KAAK,UAAU,UAAU,MACtD,OAAO,KAAK,WAAW,MAAM,SAAS,CAAC,SAAS,OAAO,CAAC;MAC9D,CAAC;AACF;IAEF,QACE,OAAM,IAAI,MAAM,2DAA2D,WAAW,YAAY;;;AAIxG,MAAI,KACF,OAAM,KAAK;GAAE,MAAM;GAAQ;GAAM,CAAC;AAEpC,SAAO;;CAGT,kBAAkB,WAAmB,UAAuC;EAC1E,MAAM,UAAU,MAAA,UAAgB,IAAI,UAAU;AAC9C,MAAI,CAAC,QACH,QAAO;AAET,QAAA,eAAqB,WAAW,SAAS,UAAU,SAAS;AAC5D,SAAO;;CAGT,MAAM,YAA2B;AAC/B,OAAK,MAAM,CAAC,IAAI,YAAY,MAAA,UAC1B,OAAA,eAAqB,IAAI,SAAS;GAAE,UAAU;GAAQ,SAAS;GAAe,WAAW;GAAM,EAAE,SAAS;AAE5G,QAAM,MAAA,eAAqB;AAC3B,QAAM,MAAA;;CAGR,MAAM,eAA8B;AAClC,MAAI,MAAA,OACF,OAAM,IAAI,MAAM,oBAAoB;EAEtC,MAAM,MAAM,MAAA,UAAgB,WAAW,MAAA,UAAgB,CAAC;AACxD,QAAA,YAAkB,IAAI,WACd,KAAA,SACA,KAAA,EACP;AACD,QAAM;;CAGR,OAAA,WAAiC;AAC/B,MAAI,MAAA,OACF,OAAM,IAAI,MAAM,oBAAoB;EAEtC,MAAM,iBAAiB,MAAA;AACvB,QAAA,eAAqB,KAAA;AACrB,QAAA,eAAqB;AACrB,MAAI,MAAA,WACF,KAAI;AACF,SAAM,MAAA,cAAoB;WACnB,OAAO;AACd,SAAA,eAAqB;AACrB,SAAA,eAAqB;AACrB,SAAM;;AAGV,OAAK,MAAM,SAAS,MAAA,OAAa,WAAW,CAC1C,OAAA,eAAqB,IAAI,MAAM;AAEjC,QAAA,OAAa,QAAQ;AACrB,OAAK,MAAM,CAAC,IAAI,YAAY,MAAA,UAC1B,OAAA,eAAqB,IAAI,SAAS;GAAE,UAAU;GAAQ,SAAS;GAAgC,EAAE,SAAS;AAE5G,QAAA,iBAAuB,KAAA;AACvB,QAAA,KAAW;GAAE,MAAM;GAAsB,cAAc,MAAA;GAAoB,CAAC;;CAG9E,OAAA,gBAAsC;EACpC,MAAM,SAAS,MAAA;EACf,MAAM,aAAa,MAAA;AACnB,MAAI,UAAU,CAAC,OAAO,SAAS;AAC7B,UAAO,cAAc;AACrB,OAAI,cAAc,OAAO,UAAU,MAAA,aACjC,KAAI;AACF,UAAM,WAAW,QAAQ,kBAAkB;KACzC,UAAU,MAAA;KACV,QAAQ,OAAO;KAChB,CAAC;WACI;YACC,YAAY;AAGrB,eAAW,OAAO;AAClB,QAAI,MAAA,eAAqB,WACvB,OAAA,aAAmB,KAAA;AAErB,WAAO,uBAAO,IAAI,MAAM,cAAc,CAAC;;;;CAK7C,MAAM,kBAAkB,MAAqC;AAC3D,MAAI,CAAC,oBAAoB,MAAM,gBAAgB,SAAS,KAAK,CAC3D,OAAM,IAAI,MAAM,oBAAoB,KAAK,wCAAwC;AAEnF,MAAI,MAAA,WACF,OAAM,IAAI,MAAM,mFAAmF;AAErG,QAAA,iBAAuB;AACvB,QAAA,KAAW;GAAE,MAAM;GAA2B;GAAM,CAAC;;CAGvD,MAAM,SAAS,OAA+B;AAC5C,MAAI,MAAA,WACF,OAAM,IAAI,MAAM,uEAAuE;AAEzF,QAAA,QAAc;AACd,QAAA,KAAW;GAAE,MAAM;GAAiB;GAAO,CAAC;;CAG9C,KAAK,SAAuB;AAC1B,MAAI,MAAA,OACF;AAEF,QAAA,KAAW;GAAE,MAAM;GAAiB;GAAS,CAAC;AAC9C,QAAA,UAAgB,SAAS;AACzB,OAAK,MAAM,QAAQ;;CAGrB,MAAM,SAAwC,UAAgB;AAC5D,MAAI,MAAA,OACF;AAEF,QAAA,SAAe;AACf,QAAA,MAAY,SAAS;AACrB,OAAK,MAAM,CAAC,IAAI,YAAY,MAAA,UAC1B,OAAA,eAAqB,IAAI,SAAS;GAAE,UAAU;GAAQ,SAAS;GAAkB,EAAE,SAAS;AAE9F,QAAA,YAAkB,OAAO;AACzB,QAAA,aAAmB,KAAA;AACnB,QAAA,OAAa,OAAO;AACpB,QAAA,YAAkB,uBAAO,IAAI,MAAM,iBAAiB,CAAC;AACrD,MAAI,MAAA,SACF,KAAI;AACF,UAAO,MAAA,UAAgB;IAAE,WAAW;IAAM,OAAO;IAAM,CAAC;UAClD;AAEV,QAAA,KAAW;GAAE,MAAM;GAAkB;GAAQ,CAAC;AAC9C,QAAA,UAAgB,SAAS;;CAG3B,QAAQ,KAAuC;AAC7C,SAAO,MAAA,IAAU,GAAG,IAAI;;CAG1B,UAAU,UAAgC,WAAW,GAAG,SAAwC;AAC9F,SAAO,MAAA,YAAkB,UAAU,MAAA,IAAU,QAAQ,UAAU,UAAU,SAAS,MAAA,IAAU,SAAS;;CAGvG,gBAAsB;AACpB,QAAA,YAAkB,MAAA,UAAgB,WAAW,MAAA,SAAe,CAAC;;CAG/D,OAAA,mBAA0B,YAAgD;AACxE,QAAA,iBAAuB,KAAA;AACvB,MAAI;GAIF,MAAM,SAAQ,MAHQ,WAAW,QAAQ,eAAe,EAAE,KAAK,MAAA,KAAW,CAAC,GAGrD,QAAQ;AAC9B,OAAI,CAAC,MACH;GAEF,MAAM,QAAQ,MAAM;AACpB,SAAA,iBAAuB;IACrB,eAAe,MAAM,QAAQ,MAAM,GAAG,MAAM,QAAQ,MAAmB,OAAO,MAAM,SAAS,GAAG,EAAE;IAClG,eAAe,MAAM,mBAAmB;IACxC,qBAAqB,MAAM,2BAA2B;IACtD,iBAAiB,MAAM,sBAAsB;IAC9C;UACK;;CAGV,qBAAmD;EACjD,MAAM,SAAS,qBAAqB,MAAA;AACpC,MAAI,QAAQ,SAAS,oBAAoB,CAAC,MAAA,eACxC,QAAO;AAET,SAAO;GAAE,MAAM;GAAkB,GAAG,MAAA;GAAsB;;CAG5D,OAAA,eAAoD;AAClD,MAAI,MAAA,OACF,OAAM,IAAI,MAAM,oBAAoB;EAEtC,IAAI,aAAa,MAAA;AACjB,MAAI,CAAC,YAAY;AACf,gBAAa,MAAA,OAAa,UAAU,EAAE,KAAK,MAAA,UAAgB,EAAE,CAAC;AAC9D,SAAA,aAAmB;AACnB,SAAA,eAAqB;AACrB,cAAW,gBAAgB,QAAQ,WAAW,MAAA,mBAAyB,QAAQ,OAAO,CAAC;AACvF,cAAW,WAAW,QAAQ,QAAQ,OAAO,MAAA,oBAA0B,QAAQ,QAAQ,GAAG,CAAC;AAC3F,cAAW,SAAS,YAAY;AAC9B,QAAI,MAAA,eAAqB,YAAY;AACnC,WAAA,aAAmB,KAAA;AACnB,WAAA,eAAqB;;AAEvB,SAAK,MAAM,CAAC,IAAI,YAAY,MAAA,UAC1B,OAAA,eAAqB,IAAI,SAAS;KAAE,UAAU;KAAQ;KAAS,EAAE,SAAS;AAE5E,UAAA,OAAa,OAAO;AACpB,UAAA,YAAkB,OAAO,IAAI,MAAM,QAAQ,CAAC;KAC5C;AACF,OAAI;AACF,UAAM,WAAW,QAAQ,cAAc,kBAAkB;YAClD,OAAO;AAEd,eAAW,OAAO;AAClB,QAAI,MAAA,eAAqB,WACvB,OAAA,aAAmB,KAAA;AAErB,QAAI,iBAAiB,aACnB,OAAM,IAAI,MACR,6KAEE,MAAM,SACR,EAAE,OAAO,OAAO,CACjB;AAEH,UAAM;;AAER,cAAW,OAAO,cAAc;AAChC,SAAM,MAAA,mBAAyB,WAAW;;AAE5C,MAAI,CAAC,MAAA,cAAoB;GACvB,MAAM,UAAmC;IACvC,KAAK,MAAA;IACL,gBAAgB,wBAAwB,MAAA;IACxC,SAAS,uBAAuB,MAAA;IAChC,mBAAmB,2BAA2B,MAAA;IAC/C;AACD,OAAI,MAAA,MACF,SAAQ,QAAQ,MAAA;GAElB,MAAM,WAAW,MAAA,iBAAuB,KAAA;GACxC,MAAM,SACJ,WACI,MAAM,WAAW,QAAQ,iBAAiB;IAAE,UAAU,MAAA;IAAoB,GAAG;IAAS,CAAC,GACvF,MAAM,WAAW,QAAQ,gBAAgB,QAAQ;AAOvD,OAAI,OAAO,QAAQ,QAAQ,OAAO,SAChC,OAAA,eAAqB,OAAO,OAAO;AAErC,OAAI,OAAO,QAAQ,UAAU,SAC3B,OAAA,gBAAsB,OAAO;AAE/B,OAAI,OAAO,QAAQ,oBAAoB,SACrC,OAAA,iBAAuB,OAAO;AAEhC,OAAI,YAAY,MAAA,mBAAyB,CAAC,MAAA,eACxC,OAAA,iBAAuB;IACrB,OAAO,MAAM,QAAQ,QAAQ,QAAQ,MAAM,GAAG,OAAO,OAAO,QAAQ,EAAE;IACtE,SAAS,OAAO,QAAQ,yBAAyB;IAClD;AAEH,SAAA,eAAqB;;AAElB,QAAA,cAAoB,WAAW;AACpC,SAAO;;CAGT,OAAA,cAAqB,YAAgD;AACnE,MAAI,MAAA,cACF,QAAO,MAAA;EAET,MAAM,OAAO,YAAY;AACvB,OAAI;IACF,MAAM,SAAU,MAAM,WAAW,QAAQ,eAAe,EACtD,MAAM,CAAC,MAAA,IAAU,EAClB,CAAC;AACF,QAAI,MAAA,OACF;IAEF,MAAM,UAAU,MAAM,QAAQ,QAAQ,KAAK,GAAG,OAAO,OAAO,EAAE;IAC9D,MAAM,uBAAO,IAAI,KAAa;IAC9B,MAAM,SAAsB,EAAE;AAC9B,SAAK,MAAM,SAAS,QAClB,MAAK,MAAM,SAAS,OAAO,UAAU,EAAE,EAAE;AACvC,SAAI,OAAO,OAAO,SAAS,YAAY,KAAK,IAAI,MAAM,KAAK,CACzD;AAEF,UAAK,IAAI,MAAM,KAAK;AACpB,YAAO,KAAK,UAAU,MAAM,CAAC;;AAGjC,WAAO,MAAM,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,KAAK,CAAC;IACnD,MAAM,cAAc,KAAK,UAAU,OAAO;AAC1C,QAAI,gBAAgB,MAAA,kBAClB;AAEF,UAAA,oBAA0B;AAC1B,UAAA,KAAW;KAAE,MAAM;KAAU;KAAQ,CAAC;WAChC,WACE;AACR,UAAA,gBAAsB,KAAA;;MAEtB;AACJ,QAAA,gBAAsB;AACtB,SAAO;;CAGT,MAAM,aAAyD;AAC7D,MAAI,MAAA,OACF;EAEF,MAAM,OAAO,MAAA;EACb,IAAI;AACJ,MAAI;AAGF,YAAQ,OAFW,SAAS,UAAU,MAAM,MAAA,uBAA6B,GACxC,QAAQ,wBAAwB,EAAE,CAAC,GACpD,QAAQ,EAAE,EAAE,KAAK,WAAW,cAAc,QAAQ,MAAA,UAAgB,IAAI,OAAO,KAAK,CAAC,CAAC;UAC9F;AACN;YACQ;AACR,YAAS,OAAO;;;CAIpB,kBAAkB,MAAc,WAAyB;AACvD,MAAI,MAAA,cAAoB,IAAI,KAAK,CAC/B;AAEF,QAAA,cAAoB,IAAI,KAAK;EAC7B,IAAI;AACJ,MAAI;GACF,MAAM,OAAO,SAAS,KAAK;AAC3B,OAAI,KAAK,QAAQ,CACf,SAAQ,KAAK;UAET;AACR,QAAA,KAAW;GACT,MAAM;GACN,QAAQ,eAAe,KAAK;GAC5B;GACA,GAAI,kBAAkB,KAAK,GAAG,EAAE,WAAW,kBAAkB,KAAK,EAAE,GAAG,EAAE;GACzE,GAAI,UAAU,KAAA,IAAY,EAAE,OAAO,GAAG,EAAE;GACxC;GACD,CAAC;;CAGJ,OAAA,kBAAwC;AACtC,MAAI;AACF,OAAI,MAAA,OACF;GAEF,MAAM,aAAa,MAAM,MAAA,cAAoB;GAC7C,MAAM,UAAU,MAAA;AAChB,SAAA,iBAAuB,KAAA;GACvB,IAAI,QAAQ,SAAS,SAAS,EAAE;GAChC,IAAI;AACJ,OAAI,SAAS,QACX,KAAI;IAKF,MAAM,QAAO,MAJO,WAAW,QAAQ,eAAe;KACpD,UAAU,MAAA;KACV,cAAc;KACf,CAAC,GACiB,QAAQ;AAC3B,QAAI,MAAM,QAAQ,KAAK,IAAI,KAAK,UAAU,MAAM,OAC9C,SAAQ;QAER,iBAAgB;YAEX,OAAO;AACd,oBAAgB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;;AAG1E,OAAI,cACF,OAAA,KAAW;IACT,MAAM;IACN,SAAS,2EAA2E,cAAc;IACnG,CAAC;AAEJ,SAAA,YAAkB,MAAM;UAClB,WACE;AACR,SAAA,kBAAwB;AACxB,SAAA,UAAgB,OAAO;;;CAI3B,aAAa,OAA8C;AACzD,OAAK,MAAM,QAAQ,OAAO;AACxB,OAAI,MAAA,OACF;GAEF,MAAM,QAAQ,MAAA,cAAoB;AAClC,SAAA,mBAAyB;AACzB,OAAI;AACF,SAAK,MAAM,QAAQ,KAAK,SAAS,EAAE,EAAE;AACnC,SAAI,KAAK,SAAS,eAAe;MAC/B,MAAM,OAAO,gBAAgB,KAAK;AAClC,UAAI,CAAC,KACH;AAEF,YAAA,KAAW;OACT,MAAM;OACN,SAAS;QAAE,MAAM;QAAQ,SAAS;QAAM;OACxC,iBAAiB;OACjB,MAAM,GAAG,MAAM,MAAM,GAAG,KAAK;OAC9B,CAAC;AACF;;AAEF,WAAA,oBAA0B,MAAM,MAAM;;aAEhC;AACR,UAAA,mBAAyB;;;;CAK/B,gBAA4B;AAC1B,SAAO;GACL,OAAO,YAAY;GACnB,aAAa;GACb,OAAO;IACL,aAAa;IACb,mBAAmB;IACnB,uBAAuB;IACvB,cAAc;IACd,uBAAuB;IACvB,aAAa;IACd;GACD,UAAU;GACV,gCAAgB,IAAI,KAAK;GACzB,8BAAc,IAAI,KAAK;GACvB,SAAS;GACT,eAAe;GACf,cAAc;GACf;;CAGH,OAAA,UAAgC;AAC9B,MAAI,MAAA,OACF;EAEF,MAAM,OAAO,MAAA,MAAY,OAAO;AAChC,MAAI,CAAC,KACH;AAEF,QAAA,UAAgB,UAAU;EAC1B,MAAM,YAAY,KAAK,KAAK;EAC5B,MAAM,SAAqB,MAAA,cAAoB;EAC/C,MAAM,UAAU,IAAI,SAAwB,SAAS,WAAW;AAC9D,UAAO,WAAW,eAAe;AAC/B,QAAI,OAAO,QACT;AAEF,WAAO,UAAU;AACjB,YAAQ,WAAW;;AAErB,UAAO,UAAU,UAAU;AACzB,QAAI,OAAO,QACT;AAEF,WAAO,UAAU;AACjB,WAAO,MAAM;;IAEf;AACF,QAAA,aAAmB;AACnB,MAAI;GACF,MAAM,aAAa,MAAM,MAAA,cAAoB;GAC7C,MAAM,SAAkC;IACtC,UAAU,MAAA;IACV,OAAO,KAAK;IACZ,KAAK,MAAA;IACL,gBAAgB,wBAAwB,MAAA;IACxC,eAAe,MAAA,mBAAyB;IACxC,mBAAmB,2BAA2B,MAAA;IAC/C;GACD,MAAM,QAAQ,MAAA,SAAe,MAAA;AAC7B,OAAI,MACF,QAAO,QAAQ;GAEjB,MAAM,SAAS,MAAA,mBAAyB,MAAA;AACxC,OAAI,OACF,QAAO,SAAS;AAIlB,cAAW,QAAQ,cAAc,OAAO,CAAC,MACtC,WAAW;IACV,MAAM,UAAW,QAAqC;AACtD,QAAI,CAAC,QACH;AAEF,WAAO,WAAW,QAAQ;AAC1B,QAAI,QAAQ,UAAU,QAAQ,WAAW,aACvC,QAAO,QAAQ,QAAQ;OAG1B,UAAmB,OAAO,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,MAAM,CAAC,CAAC,CAC7F;GACD,MAAM,SAAS,MAAM;AACrB,OAAI,MAAA,OACF;AAEF,OAAI,OAAO,WAAW,YACpB,OAAA,WAAiB,WAAW,WAAW,OAAO;QACzC;IACL,MAAM,SACJ,OAAO,WAAW,gBACd,gBACC,OAAO,OAAO,WAAW,OAAO,aAAa;AACpD,UAAA,WAAiB,WAAW,WAAW,QAAQ,CAAC,OAAO,CAAC;;WAEnD,OAAO;AACd,OAAI,MAAA,OACF;GAEF,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AACtE,SAAA,WAAiB,WAAW,WAAW,QAAQ,CAAC,OAAO,cAAc,gBAAgB,QAAQ,CAAC;YACtF;AACR,OAAI,MAAA,eAAqB,OACvB,OAAA,aAAmB,KAAA;;;CAKzB,oBAAoB,QAAgB,QAAuB;AACzD,MAAI,MAAA,OACF;AAEF,MAAI,4BAA4B,IAAI,OAAO,IAAI,CAAC,MAAA,aAAmB,OAAO,EAAE;AAC1E,OAAI,WAAW,iBACb,OAAA,gBAAsB,OAAO;YACpB,WAAW,gBAAgB;IACpC,MAAM,WAAW,MAAA,WAAiB,OAAO;IACzC,MAAM,SAAS,WAAW,MAAA,OAAa,IAAI,SAAS,GAAG,KAAA;AACvD,QAAI,UAAU,OAAO,WAAW,UAC9B,OAAA,OAAa,OAAO,OAAO;;AAG/B;;AAEF,QAAA,cAAoB,UAAU,OAAO;;CAGvC,cAAc,QAA0B;EACtC,MAAM,WAAW,MAAA,WAAiB,OAAO;AACzC,MAAI,aAAa,KAAA,EACf,QAAO;AAET,SAAO,aAAa,MAAA;;CAGtB,YAAY,QAAqC;EAC/C,MAAM,WAAY,QAAmC;AACrD,SAAO,OAAO,aAAa,WAAW,WAAW,KAAA;;CAGnD,UAAU,QAAyC;EACjD,MAAM,WAAW,MAAA,WAAiB,OAAO;AACzC,MAAI,aAAa,KAAA,KAAa,aAAa,MAAA,aACzC;EAEF,MAAM,QAAQ,MAAA,OAAa,IAAI,SAAS;AACxC,MAAI,MACF,QAAO;AAET,MAAI,MAAA,eAAqB,IAAI,SAAS,CACpC;EAEF,MAAM,QAAQ,MAAA,YAAkB,SAAS;EACzC,MAAM,SAAS,MAAA,OAAa,KAAK,UAAU,GAAG,MAAM,SAAS,YAAY,KAAA,GAAW,KAAK,KAAK,CAAC;AAC/F,SAAO,WAAW;AAClB,QAAA,YAAkB,OAAO,WAAW,kBAAkB,EAAE,eAAe,UAAU,CAAC;AAClF,SAAO;;CAGT,iBAAiB,QAAuB;EACtC,MAAM,WAAW,MAAA,WAAiB,OAAO;EACzC,MAAM,SAAS,WAAW,MAAA,OAAa,IAAI,SAAS,GAAG,KAAA;AACvD,MAAI,CAAC,UAAU,OAAO,WAAW,UAC/B;EAEF,MAAM,OAAQ,QAAqC;EACnD,MAAM,SAAS,MAAM,WAAW,cAAc,SAAS;AACvD,QAAA,OAAa,OAAO,QAAQ,OAAO;EACnC,MAAM,UAAU,OAAO,WAAW,KAAK,GAAG,KAAA,MAAc,MAAM,OAAO,YAAY,WAAW,SAAS,KAAM,MAAM,UAAU;AAC3H,QAAA,eAAqB,OAAO,WAAW,QAAQ,WAAW,SAAS;;CAGrE,gBAAgB,QAA2C;AACzD,UAAQ,WAAW;GACjB,MAAM,SAAS,MAAA;AACf,OAAI,CAAC,OACH;GAEF,MAAM,UAAU;AAMhB,OAAI,OAAO,SAAS,UAAU,YAAY,CAAC,QAAQ,MACjD;GAEF,MAAM,QAAQ,QAAQ,gBAAgB,QAAQ,gBAAgB;GAC9D,MAAM,QAAQ,MAAA,SAAe,OAAO;GAKpC,MAAM,MAAM,GAAG,OAAO,aAAa,GAAG,GAAG,QAAQ,UAAU,GAAG,GAAG;GACjE,MAAM,WAAW,OAAO,aAAa,IAAI,IAAI;AAC7C,UAAO,aAAa,IAAI,KAAK,MAAM;GACnC,MAAM,YAAY,aAAa,KAAA,KAAa,QAAQ,WAAW,SAAS;AACxE,SAAA,UAAgB;IAAE,MAAM;IAAkB,UAAU,YAAY,QAAQ;IAAO,EAAE,OAAO,aAAa,KAAK;;;CAI9G,iBAAiB,WAA0B;EACzC,MAAM,SAAS,MAAA;AACf,MAAI,CAAC,OACH;EAEF,MAAM,OAAQ,QAAqC;AACnD,MAAI,KACF,OAAA,mBAAyB,MAAM,QAAQ,MAAA,SAAe,OAAO,CAAC;;CAIlE,iBAAqE;EACnE,mBAAmB,WAAW;GAC5B,MAAM,SAAU,QAAyC;AACzD,OAAI,OAAO,QAAQ,OAAO,SACxB,OAAA,eAAqB,OAAO;;EAGhC,iBAAiB,WAAW;GAC1B,MAAM,SAAS,MAAA;GACf,MAAM,OAAQ,QAAqC;AACnD,OAAI,UAAU,QAAQ,CAAC,OAAO,OAC5B,QAAO,SAAS,KAAK;;EAGzB,mBAAmB,WAAW;GAC5B,MAAM,SAAS,MAAA;GACf,MAAM,OAAQ,QAAqC;AACnD,OAAI,CAAC,UAAU,CAAC,KACd;AAEF,OAAI,OAAO,UAAU,KAAK,MAAM,KAAK,OAAO,OAAO,OACjD;AAEF,UAAO,QAAQ,KAAK;;EAEtB,gBAAgB,MAAA;EAChB,gBAAgB,MAAA;EAChB,mBAAmB,WAAW;GAC5B,MAAM,SAAS,MAAA;AACf,OAAI,CAAC,OACH;GAEF,MAAM,OAAQ,QAAqC;AACnD,OAAI,KACF,OAAA,oBAA0B,MAAM,QAAQ,MAAA,SAAe,OAAO,CAAC;;EAGnE,4BAA4B,WAAW;AACrC,OAAI,CAAC,MAAA,WACH;GAEF,MAAM,QAAS,QAA+B;AAC9C,OAAI,OAAO,UAAU,YAAY,MAC/B,OAAA,UAAgB;IAAE,MAAM;IAAc,MAAM;IAAO,EAAE,MAAA,SAAe,OAAO,EAAE,aAAa,KAAK;;EAGnG,4BAA4B,MAAA,eAAqB,2BAA2B;EAC5E,mCAAmC,MAAA,eAAqB,kCAAkC;EAC1F,8BAA8B,WAAW;GACvC,MAAM,SAAS,MAAA;AACf,OAAI,CAAC,OACH;GAEF,MAAM,OAAQ,QAAsC,YAAY;AAChE,OAAI,CAAC,KACH;AAEF,UAAO,WAAW;AAClB,UAAO,MAAM,eAAe,KAAK,eAAe;AAChD,UAAO,MAAM,qBAAqB,KAAK,qBAAqB;AAC5D,UAAO,MAAM,yBAAyB,OAAO,MAAM,yBAAyB,MAAM,KAAK,yBAAyB;AAChH,UAAO,MAAM,gBAAgB,KAAK,gBAAgB;AAClD,UAAO,MAAM,yBAAyB,KAAK,yBAAyB;GACpE,MAAM,SAAS;AACf,UAAO,gBAAgB,KAAK,eAAe,KAAA;AAC3C,UAAO,gBAAgB,OAAO,YAAY,sBAAsB,KAAA;;EAElE,oCAAoC,WAAW;GAC7C,MAAM,SAAS;AACf,OAAI,OAAO,QAAQ,SAAS,SAC1B;AAEF,SAAA,UAAgB,IAAI,OAAO,MAAM;IAC/B,QAAQ,OAAO,OAAO,WAAW,WAAW,OAAO,SAAS;IAC5D,GAAI,OAAO,QAAQ,EAAE,OAAO,OAAO,OAAO,GAAG,EAAE;IAC/C,GAAI,OAAO,gBAAgB,EAAE,eAAe,OAAO,eAAe,GAAG,EAAE;IACxE,CAAC;;EAEJ,wBAAwB;GACtB,MAAM,aAAa,MAAA;AACnB,OAAI,WACG,OAAA,cAAoB,WAAW;;EAGxC,+BAA+B,WAAW;AACxC,SAAA,eAAsB,QAAiD,WAAW;;EAEpF,sBAAsB,WAAW;GAC/B,MAAM,SAAS,MAAA;AACf,OAAI,CAAC,OACH;GAEF,MAAM,OAAQ,QAAgC;AAC9C,OAAI,CAAC,MAAM,QAAQ,KAAK,CACtB;AAEF,SAAA,KAAW;IACT,MAAM;IACN,SAAS;KACP,MAAM;KACN,IAAI,GAAG,OAAO,MAAM;KACpB,OAAO,KAAK,KAAK,UAAU;MAAE,MAAM,KAAK;MAAM,WAAW,KAAK,WAAW;MAAa,EAAE;KACzF;IACF,CAAC;;EAEJ,2BAA2B,WAAW;GACpC,MAAM,YAAa,QAA4C;AAC/D,OAAI,cAAc,KAAA,EAChB;AAEF,QAAK,MAAM,CAAC,IAAI,YAAY,MAAA,UAC1B,KAAI,QAAQ,WAAW,WAAW;AAEhC,UAAA,eAAqB,IAAI,SAAS;KAAE,UAAU;KAAQ,SAAS;KAAqB,EAAE,SAAS;AAC/F;;;EAMN,QAAQ,WAAW;GACjB,MAAM,SAAS,MAAA;GACf,MAAM,QAAS,QAA6C;AAC5D,OAAI,UAAU,OAAO,OAAO,YAAY,SACtC,QAAO,YAAY,MAAM;;EAG9B;CAED,OAAA,oBAA2B,QAAgB,QAAiB,QAA4C;EACtG,MAAM,UAAU,kBAAkB;AAClC,MAAI,QACF,QAAO,MAAA,gBAAsB,SAAS,QAAQ,QAAQ,OAAO;AAE/D,QAAM,IAAI,aAAa,QAAQ,8CAA8C,OAAO,GAAG;;CAGzF,iBAAiB,SAA0B,QAAgB,QAAiB,QAAuD;AACjI,MAAI,WAAW,8BAA8B;GAC3C,MAAM,WAAW,MAAA,OAAa,oBAAoB;AAClD,OAAI,aAAa,MACf,QAAO,QAAQ,QAAQ,MAAA,wBAA8B,SAAS,QAAQ,SAAS,CAAC;;EAGpF,MAAM,KAAK,YAAY;EACvB,MAAM,YAAY,MAAA,OAAa,qBAAqB,MAAA,OAAa,4BAA4B;EAC7F,MAAM,SAAS,QAAQ,OAAO,OAAO;EACrC,MAAM,UAA6B;GACjC;GACA,GAAG,QAAQ,SAAS,OAAO;GAC3B,WAAW,SAAS,GAAG,MAAA,YAAkB,SAAS,QAAQ,GAAG,WAAW;GACxE,WAAW,KAAK,KAAK,GAAG;GACzB;AACD,SAAO,IAAI,SAAkB,YAAY;GACvC,MAAM,QAAQ,iBAAiB;IAC7B,MAAM,UAAU,MAAA,UAAgB,IAAI,GAAG;AACvC,QAAI,QACF,OAAA,eAAqB,IAAI,SAAS;KAAE,UAAU;KAAQ,SAAS;KAAsB,EAAE,UAAU;MAElG,UAAU;AACb,SAAA,UAAgB,IAAI,IAAI;IACtB;IACA;IACA;IACA,SAAS,iBAAiB,OAAO;IACjC;IACA;IACA,SAAS;IACV,CAAC;AACF,SAAA,KAAW;IAAE,MAAM;IAAwB;IAAS,CAAC;AACrD,OAAI,MAAA,WACF,OAAA,UAAgB,oBAAoB;IAEtC;;CAGJ,yBAAyB,SAA0B,QAAiB,MAAgC;EAClG,MAAM,SAAS,QAAQ,OAAO,OAAO;EACrC,MAAM,UAA6B;GACjC,IAAI,YAAY;GAChB,GAAG,QAAQ,SAAS,OAAO;GAC3B,WAAW,SAAS,GAAG,MAAA,YAAkB,SAAS,QAAQ,GAAG,WAAW,YAAY;GACrF;AACD,QAAA,KAAW;GAAE,MAAM;GAAwB;GAAS,CAAC;AACrD,MAAI,SAAS,QAAQ;AACnB,SAAA,KAAW;IACT,MAAM;IACN,WAAW,QAAQ;IACnB,UAAU;IACV,YAAY;IACZ,SAAS;IACV,CAAC;AACF,UAAO,EAAE,SAAS,EAAE,EAAE;;EAExB,MAAM,UAAiD,EAAE;AACzD,OAAK,MAAM,YAAa,OAAoC,aAAa,EAAE,EAAE;GAC3E,MAAM,QAAQ,SAAS,UAAU,IAAI;AACrC,OAAI,MACF,SAAQ,SAAS,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE;;AAG/C,QAAA,KAAW;GACT,MAAM;GACN,WAAW,QAAQ;GACnB,UAAU;GACV,YAAY;GACb,CAAC;AACF,SAAO,EAAE,SAAS;;CAGpB,gBAAgB,IAAY,SAA+B,UAA8B,YAA4C;AACnI,eAAa,QAAQ,MAAM;AAC3B,QAAA,UAAgB,OAAO,GAAG;EAC1B,IAAI,WAAW,SAAS;EACxB,IAAI,UAAU,SAAS,aAAa,SAAU,SAAS,WAAW,WAAY,KAAA;EAC9E,IAAI;AACJ,MAAI,SAAS,aAAa,SAAS;GACjC,MAAM,UAAU,QAAQ,QAAQ,MAAM,QAAQ,QAAQ,SAAS,cAAc,QAAQ,QAAQ;AAC7F,OAAI,QACF,QAAO;QACF;AACL,eAAW;AACX,iBAAa;AACb,cAAU;AACV,WAAO,QAAQ,QAAQ,KAAK,QAAQ,QAAQ,OAAO,QAAQ,QAAQ;;QAGrE,QAAO,QAAQ,QAAQ,KAAK,QAAQ,QAAQ,SAAS,cAAc,MAAM,QAAQ,QAAQ;AAE3F,UAAQ,QAAQ,KAAK,SAAS;AAC9B,QAAA,KAAW;GAAE,MAAM;GAAuB,WAAW;GAAI;GAAU;GAAY;GAAS,CAAC;AACzF,MAAI,aAAa,UAAU,SAAS,aAAa,UAAU,SAAS,aAAa,KAAK,aAAa,SAC5F,OAAA,eAAqB;AAE5B,MAAI,CAAC,MAAA,UAAgB,MAAA,UAAgB,SAAS,KAAK,MAAA,WAAiB,oBAClE,OAAA,UAAgB,UAAU;;CAI9B,oBAAoB,MAAqB,QAAoB,OAA0B;EACrF,MAAM,KAAK,GAAG,OAAO,MAAM,GAAG,KAAK;AACnC,MAAI,KAAK,SAAS,oBAAoB;AACpC,SAAA,cAAoB,iBAAiB,MAAM,QAAQ,IAAI,MAAM;AAC7D;;AAEF,MAAI,KAAK,SAAS,sBAAsB,CAAC,OAAO,eAAe,IAAI,GAAG,EAAE;AACtE,UAAO,eAAe,IAAI,GAAG;AAC7B,SAAA,YAAkB,IAAI,gBAAgB,EAAE,SAAS,KAAK,SAAS,EAAE,MAAM;AACvE;;AAEF,MAAI,KAAK,SAAS,iBAAiB,CAAC,OAAO,eAAe,IAAI,GAAG,EAAE;AACjE,UAAO,eAAe,IAAI,GAAG;AAC7B,SAAA,YAAkB,IAAI,QAAQ,KAAK,OAAO,IAAI,KAAK,QAAQ,KAAK,WAAW,MAAM;AACjF;;AAEF,MAAI,KAAK,SAAS,yBAAyB,CAAC,OAAO,eAAe,IAAI,GAAG,EAAE;AACzE,UAAO,eAAe,IAAI,GAAG;AAC7B,SAAA,YAAkB,IAAI,mBAAmB,YAAY,KAAK,EAAE,MAAM;AAClE;;AAEF,MAAI,KAAK,SAAS,qBAAqB,CAAC,OAAO,eAAe,IAAI,GAAG,EAAE;AACrE,UAAO,eAAe,IAAI,GAAG;AAC7B,SAAA,YAAkB,IAAI,kBAAkB,qBAAqB,KAAK,EAAE,MAAM;AAC1E,OAAI,KAAK,UACP,OAAA,iBAAuB,KAAK,WAAW,GAAG;;;CAKhD,qBAAqB,MAAqB,QAAoB,OAA0B;EACtF,MAAM,KAAK,GAAG,OAAO,MAAM,GAAG,KAAK;EACnC,MAAM,UAAU,MAAA,cAAoB,KAAK;AAGzC,MAAI,SAAS;AACX,WAAQ,MAAM,QAAQ,IAAI,MAAM;AAChC;;EAEF,MAAM,UAAU;AAChB,QAAA,KAAW;GAAE,MAAM;GAAa,SAAS;IAAE,MAAM,SAAS,QAAQ;IAAQ,MAAM;IAAS;GAAE,CAAC;;CAG9F,iBAEI;EACF,cAAc,MAAM,QAAQ,KAAK,UAAU;AACzC,OAAI,CAAC,MACH;GAEF,MAAM,OAAO,gBAAgB,KAAK;AAClC,OAAI,CAAC,KACH;AAEF,SAAA,KAAW;IACT,MAAM;IACN,SAAS;KAAE,MAAM;KAAQ,SAAS;KAAM;IACxC,iBAAiB,MAAM;IACvB,MAAM,GAAG,OAAO,MAAM,GAAG,KAAK;IAC/B,CAAC;;EAEJ,eAAe,MAAM,QAAQ,IAAI,UAAU;GACzC,MAAM,OAAO,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO;AACzD,SAAA,cAAoB,IAAI,CAAC;IAAE,MAAM;IAAQ;IAAM,CAAC,EAAE,OAAO,aAAa,KAAK;AAC3E,OAAI,CAAC,MACH,QAAO,YAAY;;EAGvB,YAAY,MAAM,SAAS,IAAI,UAAU;GACvC,MAAM,UAAU,MAAM,QAAQ,KAAK,QAAQ,GAAG,KAAK,QAAQ,OAAO,QAAQ,GAAG,EAAE;GAC/E,MAAM,UAAU,MAAM,QAAQ,KAAK,QAAQ,GAAG,KAAK,QAAQ,OAAO,QAAQ,GAAG,EAAE;GAC/E,MAAM,YAAY,QAAQ,SAAS,IAAI,UAAU,SAAS,KAAK,OAAO;AACtE,OAAI,SACF,OAAA,cAAoB,IAAI,CAAC;IAAE,MAAM;IAAY;IAAU,CAAC,EAAE,OAAO,aAAa,KAAK;;EAGvF,mBAAmB,MAAM,QAAQ,IAAI,UAAU;AAC7C,OAAI,CAAC,OAAO,eAAe,IAAI,GAAG,EAAE;AAClC,WAAO,eAAe,IAAI,GAAG;AAC7B,UAAA,YAAkB,IAAI,gBAAgB,EAAE,SAAS,KAAK,SAAS,EAAE,MAAM;;GAEzE,MAAM,WAAW,KAAK,YAAY,KAAA;GAClC,MAAM,SAAS,KAAK,WAAW,YAAY,KAAK,WAAW,cAAe,aAAa,KAAA,KAAa,aAAa;GACjH,MAAM,UAAU,KAAK,oBAAoB,OAAO,aAAa,KAAA,KAAa,aAAa,IAAI,gBAAgB,SAAS,KAAK;AACzH,SAAA,eAAqB,IAAI,QAAQ,QAAQ,KAAA,GAAW,OAAO,aAAa,KAAK;;EAE/E,aAAa,MAAM,SAAS,IAAI,UAAU;AACxC,SAAA,YAAkB,IAAI,mBAAmB,EAAE,SAAS,KAAK,SAAS,EAAE,MAAM;GAC1E,MAAM,QAAQ,KAAK,QAAQ,KAAK,WAAW;AAEzC,WAAO,IADM,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO,OAAO,MAAM,SACxD,SAAS,IAAI,OAAO;KACtC;GAEF,MAAM,OAAO,KAAK,QAAQ,WAAW,IAAI,KAAK,QAAQ,KAAK,KAAA;AAC3D,SAAA,eACE,IACA,MAAM,KAAK,KAAK,IAAI,KAAK,QACzB,KAAK,WAAW,YAAY,KAAK,WAAW,YAC5C,MAAM,OAAO,iBAAiB,KAAK,MAAM,KAAK,KAAK,GAAG,KAAA,GACtD,OAAO,aAAa,KACrB;;EAEH,cAAc,MAAM,QAAQ,IAAI,UAAU;AACxC,OAAI,CAAC,OAAO,eAAe,IAAI,GAAG,EAAE;AAClC,WAAO,eAAe,IAAI,GAAG;AAC7B,UAAA,YAAkB,IAAI,QAAQ,KAAK,OAAO,IAAI,KAAK,QAAQ,KAAK,WAAW,MAAM;;GAEnF,MAAM,UAAW,KAAK,UAAU,KAAA,KAAa,KAAK,UAAU,QAAS,KAAK,WAAW;AACrF,SAAA,eACE,IACA,KAAK,OAAO,YAAY,KAAK,WAAW,KAAA,KAAa,KAAK,WAAW,OAAO,KAAK,KAAK,UAAU,KAAK,OAAO,GAC5G,SACA,KAAA,GACA,OAAO,aAAa,KACrB;;EAEH,YAAY,MAAM,SAAS,IAAI,UAAU;AACvC,SAAA,YAAkB,IAAI,kBAAkB,EAAE,OAAO,KAAK,OAAO,EAAE,MAAM;AACrE,SAAA,eAAqB,IAAI,IAAI,OAAO,KAAA,GAAW,OAAO,aAAa,KAAK;;EAE1E,kBAAkB,MAAM,QAAQ,IAAI,UAAU;AAG5C,UAAO,eAAe,IAAI,GAAG;AAC7B,SAAA,YAAkB,IAAI,kBAAkB,qBAAqB,KAAK,EAAE,MAAM;AAC1E,OAAI,KAAK,UACP,OAAA,iBAAuB,KAAK,WAAW,GAAG;GAE5C,MAAM,QAAQ,CACZ,KAAK,YAAY,YAAY,KAAK,cAAc,0BAChD,GAAI,YAAY,KAAK,OAAO,GAAG,CAAC,KAAK,OAAO,GAAG,EAAE,CAClD;AACD,SAAA,eAAqB,IAAI,MAAM,KAAK,KAAK,EAAE,KAAK,WAAW,UAAU,KAAA,GAAW,OAAO,aAAa,KAAK;;EAE3G,YAAY,MAAM,SAAS,IAAI,UAAU;AACvC,SAAA,YAAkB,IAAI,kBAAkB,EAAE,MAAM,KAAK,MAAM,EAAE,MAAM;AACnE,SAAA,eAAqB,IAAI,KAAK,MAAM,OAAO,KAAA,GAAW,OAAO,aAAa,KAAK;;EAEjF,mBAAmB,MAAM,SAAS,IAAI,UAAU;AAC9C,OAAI,MAAA,kBAAwB;AAC1B,QAAI,KAAK,SAAS,UAChB;AAEF,UAAA,YACE,IACA,kBACA;KACE,GAAI,UAAU,KAAK,UAAU,GAAG,EAAE,eAAe,UAAU,KAAK,UAAU,EAAE,GAAG,EAAE;KACjF,eAAe,KAAK;KACpB,GAAI,KAAK,YAAY,EAAE,WAAW,KAAK,WAAW,GAAG,EAAE;KACxD,EACD,MACD;AAGD,UAAA,eACE,IACA,kFACA,OACA,KAAA,GACA,OAAO,aAAa,KACrB;AACD;;GAEF,MAAM,SAAS,MAAA,OAAa,IAAI,KAAK,cAAc,IAAI,MAAA,OAAa,KAAK,KAAK,eAAe,IAAI,KAAA,GAAW,KAAK,KAAK,CAAC;GACvH,MAAM,OAAO,UAAU,KAAK,UAAU;GACtC,MAAM,UAAU,OAAO,cAAc,KAAA,KAAa,SAAS,KAAA;AAC3D,OAAI,QACF,QAAO,YAAY;AAErB,OAAI,CAAC,OAAO,YAAY,SAAS;AAC/B,WAAO,WAAW;AAClB,UAAA,YACE,OAAO,WACP,kBACA;KACE,GAAI,OAAO,YAAY,EAAE,eAAe,OAAO,WAAW,GAAG,EAAE;KAC/D,eAAe,KAAK;KACpB,GAAI,KAAK,YAAY,EAAE,WAAW,KAAK,WAAW,GAAG,EAAE;KACxD,EACD,MACD;;AAEH,OAAI,KAAK,SAAS,eAAe;AAC/B,QAAI,OAAO,WAAW,WAAW;AAC/B,WAAA,OAAa,OAAO,QAAQ,SAAS;AACrC,WAAA,eAAqB,OAAO,WAAW,eAAe,KAAK;;AAE7D;;AAEF,OAAI,KAAK,SAAS,aAAa,OAAO,WAAW,UAC/C,OAAA,OAAa,OAAO,OAAO;;EAG/B,sBAAsB,MAAM,QAAQ,IAAI,UAAU;AAChD,OAAI,CAAC,OAAO,eAAe,IAAI,GAAG,EAAE;AAClC,WAAO,eAAe,IAAI,GAAG;AAC7B,UAAA,YAAkB,IAAI,mBAAmB,YAAY,KAAK,EAAE,MAAM;;AAEpE,OAAI,KAAK,WAAW,aAClB;GAEF,MAAM,SAAS,KAAK,WAAW,YAAY,KAAK,WAAW;AAC3D,SAAA,eAAqB,IAAI,SAAS,KAAK,SAAS,IAAI,QAAQ,KAAA,GAAW,OAAO,aAAa,KAAK;;EAEnG;CAED,WAAW,OAA4F,QAA6B;AAClI,MAAI,MAAA,OAAa,2BAA2B,MAC1C;AAEF,QAAA,KAAW;GACT,MAAM;GACN,OAAO;IAAE,MAAM;IAAuB;IAAO;GAC7C,iBAAiB;GACjB,MAAM,YAAY;GACnB,CAAC;;CAGJ,eAAe,MAAc,SAAyB,QAA6B;AACjF,QAAA,KAAW;GACT,MAAM;GACN,SAAS;IAAE,MAAM;IAAa;IAAS,OAAO,MAAA,SAAe,MAAA;IAAqB;GAClF,iBAAiB;GACjB;GACD,CAAC;;CAGJ,aAAa,IAAY,MAAc,OAAgB,OAA0B;AAC/E,MAAI,SAAS,CAAC,MAAM,QAAQ,IAAI,GAAG,EAAE;AACnC,SAAM,QAAQ,IAAI,GAAG;AACrB,SAAM,aAAa;;AAErB,QAAA,KAAW;GACT,MAAM;GACN,SAAS;IACP,MAAM;IACN,SAAS,CAAC;KAAE,MAAM;KAAY;KAAI;KAAM;KAAO,CAAC;IAChD,OAAO,MAAA,SAAe,MAAA;IACvB;GACD,iBAAiB,OAAO,aAAa;GACrC,MAAM,GAAG,GAAG;GACb,CAAC;;CAGJ,gBAAgB,WAAmB,SAAiB,SAAkB,OAAmB,SAAwB,MAAY;AAC3H,QAAA,KAAW;GACT,MAAM;GACN,SAAS;IACP,MAAM;IACN,SAAS,CAAC;KAAE,MAAM;KAAe,aAAa;KAAW;KAAS,UAAU,WAAW,KAAA;KAAW,CAAC;IACpG;GACD,iBAAiB;GACjB,WAAW;GACX;GACA,MAAM,GAAG,UAAU;GACpB,CAAC;;CAGJ,YAAY,MAA6B,WAAmB,QAAoB,QAAyB;AACvG,OAAK,MAAM,CAAC,IAAI,YAAY,MAAA,UAC1B,OAAA,eAAqB,IAAI,SAAS;GAAE,UAAU;GAAQ,SAAS;GAAc,EAAE,SAAS;AAE1F,QAAA,YAAkB;AAClB,QAAA,eAAqB;EACrB,MAAM,QAAQ,OAAO,WAAW,OAAO,QAAQ,KAAA;AAC/C,QAAA,KAAW;GACT,MAAM;GACN,SAAS,SAAS,YAAY,YAAY;GAC1C,SAAS,SAAS;GAClB,YAAY,KAAK,KAAK,GAAG;GACzB,UAAU,MAAA;GACV,cAAc;GACd,QAAQ,SAAS,YAAa,OAAO,aAAa,KAAM,KAAA;GACxD;GACA,OAAO,QACH;IACE,cAAc,KAAK,IAAI,GAAG,MAAM,cAAc,MAAM,kBAAkB;IACtE,eAAe,MAAM,eAAe,MAAM;IAC1C,6BAA6B,MAAM,yBAAyB;IAC5D,yBAAyB,MAAM;IAChC,GACD,KAAA;GACL,CAAC;AACF,QAAA,iBAAuB,OAAO;AAC9B,QAAA,UAAgB,OAAO;;CAGzB,gBAAgB,QAAsD;AACpE,MAAI,CAAC,OACH;EAEF,MAAM,SAAS,OAAO,uBAAuB,aAAa;AAC1D,OAAK,MAAM,UAAU,CAAC,OAAO,SAAS,OAAO,UAAU,EAAE;AACvD,OAAI,CAAC,UAAU,OAAO,gBAAgB,QAAQ,OAAO,gBAAgB,KAAA,EACnE;AAEF,SAAA,KAAW;IACT,MAAM;IACN,MAAM;KACJ;KACA,eAAe,oBAAoB,OAAO,mBAAmB;KAC7D,aAAa,OAAO;KACpB,GAAI,OAAO,OAAO,aAAa,WAAW,EAAE,UAAU,OAAO,UAAU,GAAG,EAAE;KAC7E;IACF,CAAC;;AAEJ,MAAI,OAAO,YAAY,OAAO,aAAa,MAAA,UAAgB;AACzD,SAAA,WAAiB,OAAO;AACxB,SAAA,KAAW;IAAE,MAAM;IAAa,kBAAkB,OAAO;IAAU,CAAC;;;CAIxE,kBAAkB,QAA0B;EAC1C,MAAM,cAAc,OAAO;EAC3B,MAAM,YAAY,OAAO;AACzB,MAAI,gBAAgB,KAAA,KAAa,CAAC,aAAa,aAAa,EAC1D;AAEF,QAAA,KAAW;GACT,MAAM;GACN,OAAO;IACL,YAAY,EAAE;IACd;IACA;IACA,YAAY,KAAK,IAAI,KAAM,cAAc,YAAa,IAAI;IAC1D,OAAO,MAAA,SAAe,MAAA;IACvB;GACF,CAAC;;CAGJ,WAAW,QAAuB,QAAuB;AAGvD,MAAI,MAAA,WAAiB,UAAU,MAAA,iBAAuB,OACpD;AAEF,MAAI,MAAA,WAAiB,YAAY,MAAA,WAAiB,SAChD;AAEF,QAAA,SAAe;AACf,QAAA,eAAqB;AACrB,QAAA,KAAW;GAAE,MAAM;GAAkB;GAAQ;GAAQ,CAAC;;CAGxD,MAAM,MAA8B;AAClC,MAAI,MAAA,qBAA2B,KAAK,SAAS,uBAAuB,KAAK,SAAS,gBAChF,QAAO;GAAE,GAAG;GAAM,QAAQ;GAAM;AAElC,QAAA,YAAkB,KAAK,MAAA,IAAU,OAAO,KAAK,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACz5DlD,MAAa,gBAA8B;CACzC,YAAY;CACZ,QAAQ;EACN;GACE,OAAO;GACP,eAAe;GACf,aAAa;GACb,aAAa;GACb,SAAS;GACT,kBAAkB;IAAC;IAAO;IAAU;IAAQ;IAAS;IAAO;IAAQ;GACrE;EACD;GACE,OAAO;GACP,eAAe;GACf,aAAa;GACb,aAAa;GACb,SAAS;GACT,kBAAkB;IAAC;IAAO;IAAU;IAAQ;IAAS;IAAO;IAAQ;GACrE;EACD;GACE,OAAO;GACP,eAAe;GACf,aAAa;GACb,aAAa;GACb,SAAS;GACT,kBAAkB;IAAC;IAAO;IAAU;IAAQ;IAAS;IAAM;GAC5D;EACD;GACE,OAAO;GACP,eAAe;GACf,aAAa;GACb,aAAa;GACb,SAAS;GACT,kBAAkB;IAAC;IAAO;IAAU;IAAQ;IAAQ;GACrD;EACD;GACE,OAAO;GACP,eAAe;GACf,aAAa;GACb,aAAa;GACb,kBAAkB;IAAC;IAAO;IAAU;IAAQ;IAAQ;GACrD;EACD;GACE,OAAO;GACP,eAAe;GACf,aAAa;GACb,aAAa;GACb,kBAAkB;IAAC;IAAO;IAAU;IAAQ;IAAQ;GACrD;EACD;GACE,OAAO;GACP,eAAe;GACf,aAAa;GACb,aAAa;GACb,SAAS;GACT,kBAAkB;IAAC;IAAO;IAAU;IAAQ;IAAQ;GACrD;EACF;CACF;;;ACnFD,MAAM,oBAAoB;AAE1B,SAAgB,iBAAiB,SAAmF;CAClH,MAAM,QAAQ,MAAM,QAAQ,YAAY,CAAC,aAAa,EAAE;EACtD,KAAK,QAAQ;EACb,OAAO;GAAC;GAAQ;GAAQ;GAAO;EAChC,CAAC;CACF,MAAM,MAAM,IAAI,uBAAuB;EAAE,OAAO,MAAM;EAAQ,QAAQ,MAAM;EAAO,CAAC;CAEpF,IAAI,aAAa;AACjB,OAAM,OAAO,GAAG,SAAS,UAAkB;AACzC,gBAAc,aAAa,OAAO,MAAM,EAAE,MAAM,CAAC,kBAAkB;GACnE;CAEF,IAAI;CACJ,IAAI,OAAO;CACX,MAAM,UAAU,YAAoB;AAClC,MAAI,KACF;AAEF,SAAO;AACP,MAAI,KAAK,QAAQ;AACjB,iBAAe,QAAQ;;AAEzB,OAAM,GAAG,UAAU,UAAU,OAAO,qCAAqC,MAAM,UAAU,CAAC;AAC1F,OAAM,GAAG,SAAS,MAAM,WAAW;EACjC,MAAM,OAAO,WAAW,MAAM;AAC9B,SAAO,4BAA4B,UAAU,QAAQ,OAAO,MAAM,OAAO,KAAK,KAAK,MAAM,KAAK,KAAK,IAAI;GACvG;AAEF,QAAO;EACL,UAAU,QAAQ,WAAW,IAAI,QAAQ,QAAQ,OAAO;EACxD,SAAS,QAAQ,WAAW,IAAI,OAAO,QAAQ,OAAO;EACtD,iBAAiB,YAAY,IAAI,eAAe,QAAQ;EACxD,YAAY,YAAY,IAAI,UAAU,QAAQ;EAC9C,UAAU,YAAY;AACpB,kBAAe;;EAEjB,aAAa;AAEX,UAAO;AACP,OAAI,KAAK,qCAAqC;AAC9C,SAAM,MAAM;;EAEf;;;;ACrCH,MAAM,gBAAgB;AAEtB,SAAgB,gCAAoD;CAClE,MAAM,SAAS,cAAc;AAC7B,KAAI,CAAC,OACH;AAEF,KAAI;EAOF,MAAM,OAFc,cAFH,cAAc,OAAO,KAAK,IACnB,CAAC,QAAQ,6BACQ,CACN,CAAC,QAAQ,iBAAiB,uBAAuB,CAAC,eACzD,CAAC,QAAQ,kBAAkB,UAAU,OAAO,YAAY;AACpF,MAAI,WAAW,KAAK,CAClB,QAAO;SAEH;;AAIV,SAAS,eAAmC;CAC1C,MAAM,EAAE,UAAU,SAAS;AAC3B,KAAI,aAAa,SACf,QAAO,SAAS,UAAU,yBAAyB;AAErD,KAAI,aAAa,QACf,QAAO,SAAS,UAAU,+BAA+B;AAE3D,KAAI,aAAa,QACf,QAAO;;AAKX,SAAS,wBAAgC;AACvC,QAAO,GAAG,QAAQ,SAAS,GAAG,QAAQ;;AAGxC,eAAe,uBACb,SACA,KACA,UAAkC,EAAE,EACP;CAC7B,MAAM,aAAa,+BAA+B;AAClD,KAAI,CAAC,WACH,QAAO;EAAE,WAAW;EAAO,QAAQ;EAAe;CAEpD,MAAM,WAAW,cAAc,KAAK,QAAQ,UAAU;AACtD,QAAO,IAAI,SAAS,YAAY;AAC9B,WAAS,YAAY,CAAC,SAAS,SAAS,EAAE;GAAE,KAAK;GAAU,SAAS,QAAQ,aAAa;GAAQ,GAAG,OAAO,QAAQ,WAAW;AAC5H,OAAI,CAAC,OAAO;AACV,YAAQ,EAAE,WAAW,MAAM,CAAC;AAC5B;;AAKF,OAAI,GAAG,OAAO,IAAI,SAAS,SAAS,gBAAgB,EAAE;IAEpD,MAAM,OAAO,SAAS,gBAClB,2JAEA,SAAS,iBACP,6GACA;AACN,YAAQ;KACN,WAAW;KACX,QACE,iFACC,QAAQ,YAAY,oBAAoB,QAAQ,cAAc,MAC/D,IAAI;KACP,CAAC;AACF;;AAGF,WAAQ,EAAE,WAAW,WAAW,CAAC;IACjC;GACF;;AAGJ,MAAM,iBAAiB;AACvB,MAAM,iBAAiB;AAEvB,SAAS,UAAU,KAAuB;CACxC,MAAM,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC;AAC5B,KAAI;AACF,QAAM,IAAI,aAAa,IAAI,CAAC;SACtB;AACR,QAAO,CAAC,GAAG,MAAM;;AAGnB,SAAS,YAAY,OAAsD;AACzE,QAAO,OAAO,UAAU,YAAY,OAAO,SAAS,MAAM,GAAG,QAAQ,MAAO,KAAA;;AAG9E,SAAS,gBAAgB,KAAgD;CACvE,MAAM,OAAO,OAAO,IAAI,SAAS,YAAY,IAAI,KAAK,SAAS,IAAI,IAAI,OAAO,KAAA;CAC9E,MAAM,UAAU,OAAO,IAAI,YAAY,YAAY,IAAI,QAAQ,SAAS,IAAI,IAAI,UAAU,KAAA;AAC1F,QAAO;EAEL,WAAW,IAAI;EACf,SAAS,QAAQ,WAAW,IAAI;EAChC,cAAc,YAAY,IAAI,UAAU,IAAI,YAAY,IAAI,UAAU,IAAI;EAC1E,WAAW,YAAY,IAAI,UAAU;EACrC,aAAa;EACb,aAAa;EACb,WAAW,OAAO,IAAI,SAAS,WAAW,YAAY,IAAI,QAAQ,OAAO,SAAS,IAAI,IAAI,QAAQ,SAAS,KAAA;EAC3G,KAAK,OAAO,IAAI,QAAQ,WAAW,IAAI,MAAM,KAAA;EAC9C;;AAGH,eAAsB,kBAAkB,SAOP;CAC/B,MAAM,WAAW,cAAc,QAAQ,KAAK,QAAQ,SAAS,UAAU;CACvE,MAAM,aAAa,QAAQ,UAAU,EAAE,KAAK,UAAU,CAAC;CACvD,MAAM,OAAiC,EAAE;AACzC,KAAI;AACF,QAAM,WAAW,QAAQ,cAAc,kBAAkB;AACzD,aAAW,OAAO,cAAc;EAChC,MAAM,OAAgC;GACpC,OAAO;GACP,SAAS;GACT,GAAI,QAAQ,MAAM,EAAE,KAAK,UAAU,QAAQ,IAAI,EAAE,GAAG,EAAE;GACvD;EACD,MAAM,OAAO,QAAQ,UAAU,KAAA,IAAY,KAAA,KAAa,QAAQ,UAAU,KAAK,QAAQ;EACvF,IAAI;AACJ,OAAK,IAAI,OAAO,GAAG,OAAO,gBAAgB,QAAQ;GAChD,MAAM,SAAU,MAAM,WAAW,QAAQ,eAAe;IACtD,GAAG;IACH,GAAI,SAAS,EAAE,QAAQ,GAAG,EAAE;IAC7B,CAAC;GACF,MAAM,OAAO,MAAM,QAAQ,QAAQ,KAAK,GAAG,OAAO,OAAO,EAAE;AAC3D,QAAK,KAAK,GAAG,KAAK;AAClB,OAAI,SAAS,KAAA,KAAa,KAAK,UAAU,KACvC;AAEF,OAAI,KAAK,WAAW,KAAK,OAAO,QAAQ,eAAe,SACrD;AAEF,YAAS,OAAO;;WAEV;AACR,aAAW,OAAO;;CAEpB,MAAM,YAAY,KAEf,QAAQ,QAAQ,OAAO,IAAI,OAAO,YAAY,IAAI,GAAG,SAAS,KAAK,CAAC,IAAI,UAAU,CAClF,IAAI,gBAAgB;CACvB,MAAM,QAAQ,QAAQ,UAAU;AAChC,QAAO,QAAQ,UAAU,KAAA,IAAY,UAAU,MAAM,MAAM,GAAG,UAAU,MAAM,OAAO,QAAQ,QAAQ,MAAM;;AAG7G,MAAa,eAA8B;CACzC,QAAQ;CACR,cAAc,oBAAoB;CAClC,SAAS;CACT,oBAAoB,SAAS,QAAQ,uBAAuB,SAAS,IAAI;CACzE,aAAa,EAAE,QAAQ,SAAS,SAAS,MAAM;AAC7C,MAAI,QACF,OAAM,IAAI,MAAM,mDAAmD;EAErE,MAAM,aAAc,OAA0C,qBAAqB,+BAA+B;AAClH,MAAI,CAAC,WACH,OAAM,IAAI,MAAM,cAAc;AAEhC,SAAO,IAAI,YACT;GACE,GAAG;GACH,WAAW,SAAS;GACpB,YAAY,YAAY,iBAAiB;IAAE;IAAY,GAAG;IAAS,CAAC;GACrE,EACD,GACD;;CAEH,MAAM,aAAa,SAAS;EAC1B,MAAM,aAAa,+BAA+B;AAClD,MAAI,CAAC,WACH,OAAM,IAAI,MAAM,cAAc;AAEhC,SAAO,kBAAkB;GACvB,GAAG;GACH,YAAY,YAAY,iBAAiB;IAAE;IAAY,GAAG;IAAS,CAAC;GACrE,CAAC;;CAEL;;;ACxMD,MAAa,kBAAiC;CAC5C,QAAQ;CACR,cAAc,oBAAoB;CAClC,SAAS;EAAE,QAAQ,EAAE;EAAE,YAAY;EAA8D;CACjG,MAAM,kBAAkB,SAAS,KAAK;EACpC,MAAM,SAAS,QAAQ,UAAU;AAEjC,MAAI,CAAC,OACH,QAAO,EAAE,WAAW,WAAW;EAEjC,MAAM,QAAQ,IAAI;AAClB,MAAI,UAAU,KAAA,KAAa,UAAU,GACnC,QAAO,EAAE,WAAW,MAAM;AAE5B,SAAO;GACL,WAAW;GACX,QAAQ,GAAG,OAAO,kDAAkD,QAAQ,KAAK;GAClF;;CAEH,eAAe;AACb,QAAM,IAAI,MAAM,2FAA2F;;CAE9G;;;ACYD,MAAM,WAAiD;CACrD,QAAQ;CACR,OAAO;CACP,UAAU;CACX;AAED,SAAgB,iBAAiB,QAAkD;AACjF,QAAO,SAAS,UAAU"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["DEFAULT_APPROVAL_TIMEOUT_MS","sdkQuery","sdkListSessions"],"sources":["../src/lib/attachments.ts","../src/lib/input-queue.ts","../src/lib/patch.ts","../src/lib/normalize.ts","../src/lib/event-log.ts","../src/lib/replay.ts","../src/lib/subscribers.ts","../src/lib/title.ts","../src/engines/claude/subagents.ts","../src/engines/claude/runner.ts","../src/engines/provider/runner.ts","../src/engines/claude/auth.ts","../src/executors/quickjs-executor.ts","../src/lib/pending-registry.ts","../src/executors/browser-bridge-executor.ts","../src/executors/deferred-executor.ts","../src/engines/provider/tools.ts","../src/engines/provider/web-fetch.ts","../src/engines/provider/session.ts","../src/engines/claude/catalog.ts","../src/engines/claude/adapter.ts","../src/engines/codex/connect.ts","../src/engines/codex/jsonrpc.ts","../src/engines/codex/subagents.ts","../src/engines/codex/trust.ts","../src/engines/codex/runner.ts","../src/engines/codex/catalog.ts","../src/engines/codex/process.ts","../src/engines/codex/adapter.ts","../src/engines/provider/adapter.ts","../src/engines/adapter.ts"],"sourcesContent":["import type { MessageAttachment } from '@workerdeck/protocol'\n\nexport type AttachmentInput = MessageAttachment & {\n data: string\n}\n\nexport type AttachmentKind = 'image' | 'document' | 'text'\n\n// The four the Anthropic API accepts; image/heic — what an iPhone shoots — is not one, and\n// clients transcode before upload.\nconst IMAGE_TYPES = new Set(['image/jpeg', 'image/png', 'image/gif', 'image/webp'])\n\nconst TEXT_TYPES = new Set([\n 'application/json',\n 'application/xml',\n 'application/yaml',\n 'application/x-yaml',\n 'application/toml',\n 'application/javascript',\n 'application/typescript',\n 'application/x-sh',\n 'application/x-httpd-php',\n 'application/sql',\n])\n\nexport function normalizeMediaType(mediaType: string): string {\n return mediaType.split(';')[0]!.trim().toLowerCase()\n}\n\nexport function attachmentKind(mediaType: string): AttachmentKind | null {\n const type = normalizeMediaType(mediaType)\n if (IMAGE_TYPES.has(type)) {\n return 'image'\n }\n if (type === 'application/pdf') {\n return 'document'\n }\n if (type.startsWith('text/') || TEXT_TYPES.has(type)) {\n return 'text'\n }\n return null\n}\n\nexport const SUPPORTED_ATTACHMENT_TYPES = [...IMAGE_TYPES, 'application/pdf', 'text/*'].join(', ')\n\nexport function attachmentContentBlocks(attachments: readonly AttachmentInput[]): Array<Record<string, unknown>> {\n return attachments.map((attachment) => {\n const mediaType = normalizeMediaType(attachment.mediaType)\n switch (attachmentKind(mediaType)) {\n case 'image': {\n return {\n type: 'image',\n source: { type: 'base64', media_type: mediaType, data: attachment.data },\n }\n }\n case 'document': {\n return {\n type: 'document',\n source: { type: 'base64', media_type: mediaType, data: attachment.data },\n title: attachment.name,\n }\n }\n case 'text': {\n return {\n type: 'text',\n text: `<attachment name=\"${attachment.name}\" type=\"${mediaType}\">\\n${decodeText(attachment.data)}\\n</attachment>`,\n }\n }\n default: {\n throw new Error(`unsupported attachment media type: ${attachment.mediaType}`)\n }\n }\n })\n}\n\nexport function attachmentRef(attachment: AttachmentInput): MessageAttachment {\n return {\n id: attachment.id,\n name: attachment.name,\n mediaType: attachment.mediaType,\n bytes: attachment.bytes,\n }\n}\n\nfunction decodeText(base64: string): string {\n return Buffer.from(base64, 'base64').toString('utf8')\n}\n","import type { SDKUserMessage } from '@anthropic-ai/claude-agent-sdk'\n\nexport class InputQueue implements AsyncIterable<SDKUserMessage> {\n #buffer: SDKUserMessage[] = []\n #waiter: ((result: IteratorResult<SDKUserMessage>) => void) | null = null\n #done = false\n\n push(message: SDKUserMessage): void {\n if (this.#done) {\n return\n }\n if (this.#waiter) {\n const resolve = this.#waiter\n this.#waiter = null\n resolve({ value: message, done: false })\n } else {\n this.#buffer.push(message)\n }\n }\n\n end(): void {\n if (this.#done) {\n return\n }\n this.#done = true\n if (this.#waiter) {\n const resolve = this.#waiter\n this.#waiter = null\n resolve({ value: undefined, done: true })\n }\n }\n\n [Symbol.asyncIterator](): AsyncIterator<SDKUserMessage> {\n return {\n next: (): Promise<IteratorResult<SDKUserMessage>> => {\n const buffered = this.#buffer.shift()\n if (buffered !== undefined) {\n return Promise.resolve({ value: buffered, done: false })\n }\n if (this.#done) {\n return Promise.resolve({ value: undefined, done: true })\n }\n return new Promise((resolve) => {\n this.#waiter = resolve\n })\n },\n return: (): Promise<IteratorResult<SDKUserMessage>> => {\n this.end()\n return Promise.resolve({ value: undefined, done: true })\n },\n }\n }\n}\n","import type { FilePatch, PatchHunk } from '@workerdeck/protocol'\n\nconst MAX_PATCH_LINES = 400\n\n// `@@ -oldStart,oldLines +newStart,newLines @@` — an absent count means 1 (a single-line hunk).\nconst HUNK_HEADER = /^@@ -(\\d+)(?:,(\\d+))? \\+(\\d+)(?:,(\\d+))? @@/\n\nfunction capHunks(hunks: PatchHunk[]): { hunks: PatchHunk[]; truncated?: boolean } {\n const kept: PatchHunk[] = []\n let lines = 0\n for (const hunk of hunks) {\n if (lines + hunk.lines.length > MAX_PATCH_LINES && kept.length > 0) {\n return { hunks: kept, truncated: true }\n }\n kept.push(hunk)\n lines += hunk.lines.length\n }\n return { hunks: kept }\n}\n\nfunction isHunk(value: unknown): value is PatchHunk {\n const hunk = value as Partial<PatchHunk> | null\n return (\n !!hunk &&\n typeof hunk.oldStart === 'number' &&\n typeof hunk.oldLines === 'number' &&\n typeof hunk.newStart === 'number' &&\n typeof hunk.newLines === 'number' &&\n Array.isArray(hunk.lines) &&\n hunk.lines.every((line) => typeof line === 'string')\n )\n}\n\nexport function filePatchFromToolResult(result: unknown): FilePatch | undefined {\n const output = result as { filePath?: unknown; structuredPatch?: unknown; originalFile?: unknown; type?: unknown } | null | undefined\n if (!output || !Array.isArray(output.structuredPatch)) {\n return undefined\n }\n const hunks = output.structuredPatch.filter(isHunk)\n if (hunks.length === 0) {\n return undefined\n }\n const { hunks: kept, truncated } = capHunks(hunks)\n return {\n ...(typeof output.filePath === 'string' && { path: output.filePath }),\n ...(output.type === 'create' || output.originalFile === null\n ? ({ kind: 'create' } as const)\n : output.type === 'update' || typeof output.originalFile === 'string'\n ? ({ kind: 'update' } as const)\n : {}),\n hunks: kept,\n ...(truncated && { truncated }),\n }\n}\n\nexport function parseUnifiedDiff(diff: string, path?: string): FilePatch | undefined {\n const hunks: PatchHunk[] = []\n let current: PatchHunk | undefined\n for (const line of diff.split('\\n')) {\n const header = HUNK_HEADER.exec(line)\n if (header) {\n current = {\n oldStart: Number(header[1]),\n oldLines: header[2] === undefined ? 1 : Number(header[2]),\n newStart: Number(header[3]),\n newLines: header[4] === undefined ? 1 : Number(header[4]),\n lines: [],\n }\n hunks.push(current)\n continue\n }\n if (!current) {\n continue\n }\n if (line.startsWith(' ') || line.startsWith('-') || line.startsWith('+')) {\n current.lines.push(line)\n } else if (line === '') {\n // A blank line is a context line whose trailing space was stripped in transit; dropping\n // it would silently shift every line number after it.\n current.lines.push(' ')\n } else {\n current = undefined\n }\n }\n if (hunks.length === 0) {\n return undefined\n }\n const { hunks: kept, truncated } = capHunks(hunks)\n return { ...(path && { path }), hunks: kept, ...(truncated && { truncated }) }\n}\n","import type { McpServerStatus, SDKMessage } from '@anthropic-ai/claude-agent-sdk'\nimport type { ApiMessage, ContentBlock, McpServerStatusInfo, ModelOption, SessionEventBody, TextBlock } from '@workerdeck/protocol'\nimport { filePatchFromToolResult } from './patch.ts'\n\nconst FAMILY_ORDER = ['fable', 'opus', 'sonnet', 'haiku']\n\nfunction singleToolResult(message: ApiMessage): boolean {\n const content = message.content\n if (!Array.isArray(content)) {\n return false\n }\n return content.filter((block) => block.type === 'tool_result').length === 1\n}\n\nconst SYNTHETIC_USER_PREFIXES = ['<task-notification>', '<local-command-caveat>']\n\nexport function isSyntheticUserText(message: ApiMessage): boolean {\n const content = message.content\n const text =\n typeof content === 'string'\n ? content\n : Array.isArray(content)\n ? content.find((block): block is TextBlock => block.type === 'text')?.text\n : undefined\n if (typeof text !== 'string') {\n return false\n }\n const head = text.trimStart()\n return SYNTHETIC_USER_PREFIXES.some((prefix) => head.startsWith(prefix))\n}\n\nexport function toApiMessage(message: unknown): ApiMessage {\n const m = message as {\n role?: 'user' | 'assistant'\n content: string | ContentBlock[]\n model?: string\n stop_reason?: string | null\n usage?: ApiMessage['usage']\n }\n return {\n role: m.role ?? 'assistant',\n content: m.content,\n model: m.model,\n stop_reason: m.stop_reason,\n usage: m.usage,\n }\n}\n\nexport type UsageRateLimits = {\n subscription_type?: string | null\n rate_limits_available?: boolean\n rate_limits?: {\n five_hour?: UsageWindow\n seven_day?: UsageWindow\n seven_day_opus?: UsageWindow\n seven_day_sonnet?: UsageWindow\n seven_day_oauth_apps?: UsageWindow\n model_scoped?: Array<{ display_name: string; utilization: number | null }>\n } | null\n}\n\ntype UsageWindow = { utilization: number | null; resets_at?: string | null } | null | undefined\n\nexport function rateLimitEventsFromUsage(usage: UsageRateLimits): SessionEventBody[] {\n if (!usage.rate_limits_available || !usage.rate_limits) {\n return []\n }\n const limits = usage.rate_limits\n const events: SessionEventBody[] = []\n const seen = new Set<string>()\n const push = (rateLimitType: string, window: UsageWindow): void => {\n if (!window || window.utilization === null || seen.has(rateLimitType)) {\n return\n }\n seen.add(rateLimitType)\n const resetsAt = window.resets_at ? Date.parse(window.resets_at) : NaN\n events.push({\n type: 'rate_limit',\n info: {\n status: 'allowed',\n rateLimitType,\n utilization: window.utilization,\n ...(Number.isFinite(resetsAt) ? { resetsAt: resetsAt / 1000 } : {}),\n },\n })\n }\n push('five_hour', limits.five_hour)\n push('seven_day', limits.seven_day)\n push('seven_day_opus', limits.seven_day_opus)\n push('seven_day_sonnet', limits.seven_day_sonnet)\n push('seven_day_oauth_apps', limits.seven_day_oauth_apps)\n for (const bucket of limits.model_scoped ?? []) {\n const slug = bucket.display_name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_')\n if (slug) {\n push(`seven_day_${slug}`, bucket)\n }\n }\n return events\n}\n\n// `config` carries a stdio server's env and an HTTP server's headers, routinely API tokens:\n// this is the one place they are dropped, and they must stay dropped.\nexport function mcpStatusInfo(status: McpServerStatus): McpServerStatusInfo {\n const config = status.config as { type?: string; command?: string; args?: string[]; url?: string } | undefined\n const transport = config?.type ?? (config?.command ? 'stdio' : undefined)\n return {\n name: status.name,\n status: status.status,\n scope: status.scope,\n error: status.error,\n serverInfo: status.serverInfo,\n transport: transport === 'stdio' || transport === 'http' || transport === 'sse' || transport === 'sdk' ? transport : undefined,\n command: config?.command,\n args: config?.args,\n url: config?.url,\n tools: status.tools?.map((tool) => ({\n name: tool.name,\n description: tool.description,\n annotations: tool.annotations,\n })),\n }\n}\n\nexport type SdkModelInfo = {\n value: string\n resolvedModel?: string\n displayName: string\n description?: string\n supportedEffortLevels?: string[]\n supportsEffort?: boolean\n}\n\nexport function defaultModelFromSdk(models: readonly SdkModelInfo[]): string | undefined {\n return models.find((model) => model.value === 'default')?.resolvedModel\n}\n\nexport function modelOptionsFromSdk(models: readonly SdkModelInfo[]): ModelOption[] {\n const rows = models.filter((model) => model.value !== 'default')\n const derivedCounts = new Map<string, number>()\n for (const model of rows) {\n const derived = friendlyModelName(model.resolvedModel ?? model.value)\n if (derived) {\n derivedCounts.set(derived, (derivedCounts.get(derived) ?? 0) + 1)\n }\n }\n\n const seenFamilies = new Set<string>()\n const options: ModelOption[] = rows.map((model) => {\n const family = modelFamily(model.resolvedModel ?? model.value)\n const primary = !seenFamilies.has(family)\n seenFamilies.add(family)\n const derived = friendlyModelName(model.resolvedModel ?? model.value)\n return {\n value: model.value,\n resolvedModel: model.resolvedModel,\n displayName: derived && derivedCounts.get(derived) === 1 ? derived : model.displayName,\n description: model.description,\n primary,\n reasoningEfforts: model.supportedEffortLevels ?? (model.supportsEffort === false ? [] : undefined),\n }\n })\n\n return options\n .map((option, index) => ({ option, index }))\n .sort((a, b) => {\n const rankA = familyRank(a.option)\n const rankB = familyRank(b.option)\n return rankA === rankB ? a.index - b.index : rankA - rankB\n })\n .map(({ option }) => option)\n}\n\nfunction familyRank(option: ModelOption): number {\n const rank = FAMILY_ORDER.indexOf(modelFamily(option.resolvedModel ?? option.value))\n return rank === -1 ? FAMILY_ORDER.length : rank\n}\n\n// The shared id-parsing prelude: strip the '[variant]' suffix, lowercase, split on '-', drop the 'claude' prefix.\nfunction modelIdParts(id: string): string[] {\n const withoutVariant = id.split('[')[0] ?? id\n const parts = withoutVariant.toLowerCase().split('-').filter(Boolean)\n if (parts[0] === 'claude') {\n parts.shift()\n }\n return parts\n}\n\nexport function friendlyModelName(id: string): string | null {\n const parts = modelIdParts(id)\n const family = parts.shift()\n if (!family) {\n return null\n }\n const version = parts.filter((part) => !/^\\d{8}$/.test(part))\n if (version.length === 0 || version.some((part) => !/^\\d+$/.test(part))) {\n return null\n }\n return `${family.charAt(0).toUpperCase()}${family.slice(1)} ${version.join('.')}`\n}\n\nfunction modelFamily(id: string): string {\n const parts = modelIdParts(id)\n return parts[0] ?? id\n}\n\nexport function normalizeSdkMessage(msg: SDKMessage): SessionEventBody | null {\n switch (msg.type) {\n case 'assistant': {\n return {\n type: 'assistant_message',\n message: toApiMessage(msg.message),\n parentToolUseId: msg.parent_tool_use_id,\n uuid: msg.uuid,\n }\n }\n case 'user': {\n const message = toApiMessage(msg.message)\n return {\n type: 'user_message',\n message,\n parentToolUseId: msg.parent_tool_use_id,\n replay: 'isReplay' in msg && msg.isReplay === true ? true : undefined,\n synthetic: msg.isSynthetic === true || msg.origin?.kind === 'task-notification' || isSyntheticUserText(message) ? true : undefined,\n patch: singleToolResult(message) ? filePatchFromToolResult(msg.tool_use_result) : undefined,\n uuid: msg.uuid,\n }\n }\n case 'stream_event': {\n return {\n type: 'stream_delta',\n event: msg.event as { type: string; [key: string]: unknown },\n parentToolUseId: msg.parent_tool_use_id,\n uuid: msg.uuid,\n }\n }\n case 'result': {\n return {\n type: 'turn_result',\n subtype: msg.subtype,\n isError: msg.is_error,\n durationMs: msg.duration_ms,\n numTurns: msg.num_turns,\n totalCostUsd: msg.total_cost_usd,\n result: msg.subtype === 'success' ? msg.result : undefined,\n errors: msg.subtype === 'success' ? undefined : msg.errors,\n usage: msg.usage,\n }\n }\n case 'conversation_reset': {\n return { type: 'conversation_reset', sdkSessionId: msg.new_conversation_id }\n }\n case 'rate_limit_event': {\n return {\n type: 'rate_limit',\n info: {\n status: msg.rate_limit_info.status,\n rateLimitType: msg.rate_limit_info.rateLimitType,\n utilization: msg.rate_limit_info.utilization,\n resetsAt: msg.rate_limit_info.resetsAt,\n isUsingOverage: msg.rate_limit_info.isUsingOverage,\n },\n }\n }\n case 'system': {\n if (msg.subtype === 'init' || msg.subtype === 'session_state_changed') {\n return null\n }\n return { type: 'sdk_event', payload: msg as unknown as { type: string } }\n }\n default: {\n return { type: 'sdk_event', payload: msg as unknown as { type: string } }\n }\n }\n}\n","import {\n contextReading,\n transcriptActivity,\n transcriptProse,\n type ContextReading,\n type SessionEvent,\n type SessionEventBody,\n} from '@workerdeck/protocol'\n\nexport class EventLog {\n #events: SessionEvent[] = []\n #seq = 0\n #activityCount = 0\n #proseCount = 0\n #contextUsage: ContextReading | undefined\n #resetSeq = 0\n #lastActivityAt: number | undefined\n\n get events(): readonly SessionEvent[] {\n return this.#events\n }\n\n get seq(): number {\n return this.#seq\n }\n\n get activityCount(): number {\n return this.#activityCount\n }\n\n /** The unread badge's unit — see `transcriptProse`. Folded here so a restored log recomputes it. */\n get proseCount(): number {\n return this.#proseCount\n }\n\n get contextUsage(): ContextReading | undefined {\n return this.#contextUsage\n }\n\n get resetSeq(): number {\n return this.#resetSeq\n }\n\n get lastActivityAt(): number | undefined {\n return this.#lastActivityAt\n }\n\n append(body: SessionEventBody): SessionEvent {\n const event: SessionEvent = { ...body, seq: ++this.#seq, ts: Date.now() }\n this.#lastActivityAt = event.ts\n this.#fold(event)\n this.#events.push(event)\n return event\n }\n\n at(seq: number): SessionEvent | undefined {\n return this.#events.find((event) => event.seq === seq)\n }\n\n restore(events: readonly SessionEvent[], seq: number, lastActivityAt: number | undefined): void {\n this.#events = [...events]\n this.#seq = seq\n this.#activityCount = 0\n this.#proseCount = 0\n this.#contextUsage = undefined\n this.#resetSeq = 0\n for (const event of this.#events) {\n this.#fold(event)\n }\n this.#lastActivityAt = lastActivityAt\n }\n\n #fold(event: SessionEvent): void {\n this.#activityCount += transcriptActivity(event)\n this.#proseCount += transcriptProse(event)\n this.#contextUsage = contextReading(event) ?? this.#contextUsage\n if (event.type === 'conversation_reset') {\n this.#resetSeq = event.seq\n this.#contextUsage = undefined\n }\n }\n}\n","import {\n imagePartRef,\n replayCoalesceKey,\n replayRetains,\n TOOL_RESULT_HEAD_CHARS,\n transcriptContent,\n type SessionEvent,\n type ToolResultBlock,\n} from '@workerdeck/protocol'\n\nexport function staleReplaySeqs(events: readonly SessionEvent[], afterSeq: number): Set<number> {\n const stale = new Set<number>()\n const seen = new Set<string>()\n for (let index = events.length - 1; index >= 0; index--) {\n const event = events[index]!\n if (event.seq <= afterSeq) {\n break\n }\n const key = replayCoalesceKey(event)\n if (key === undefined) {\n continue\n }\n if (seen.has(key)) {\n stale.add(event.seq)\n } else {\n seen.add(key)\n }\n }\n return stale\n}\n\nexport function replaySlice(\n events: readonly SessionEvent[],\n options: {\n afterSeq: number\n resetSeq?: number\n coalesceReplay?: boolean\n truncateResults?: boolean\n imageRefs?: boolean\n },\n): SessionEvent[] {\n const { afterSeq, resetSeq = 0, coalesceReplay, truncateResults, imageRefs } = options\n const stale = coalesceReplay ? staleReplaySeqs(events, afterSeq) : undefined\n const lastSeq = events[events.length - 1]?.seq ?? 0\n const out: SessionEvent[] = []\n for (const event of events) {\n if (event.seq <= afterSeq) {\n continue\n }\n if (event.seq < resetSeq && transcriptContent(event)) {\n continue\n }\n if (stale?.has(event.seq)) {\n continue\n }\n if (coalesceReplay && event.seq !== lastSeq && !replayRetains(event)) {\n continue\n }\n // Refs before heads: part indices are stamped from the stored array, which truncation reshapes.\n let delivered = event\n if (imageRefs) {\n delivered = refImageParts(delivered)\n }\n if (truncateResults) {\n delivered = truncateResultBlocks(delivered)\n }\n out.push(delivered)\n }\n return out\n}\n\nexport function truncateResultBlocks(event: SessionEvent): SessionEvent {\n if (event.type !== 'user_message') {\n return event\n }\n const content = event.message.content\n if (!Array.isArray(content)) {\n return event\n }\n let cut = false\n const blocks = content.map((block) => {\n if (block.type !== 'tool_result') {\n return block\n }\n const result = block as ToolResultBlock\n if (result.truncated) {\n return block\n }\n const total = resultChars(result.content)\n if (total <= TOOL_RESULT_HEAD_CHARS) {\n return block\n }\n cut = true\n return {\n ...result,\n content: headOf(result.content, TOOL_RESULT_HEAD_CHARS),\n truncated: true,\n total_chars: total,\n } satisfies ToolResultBlock\n })\n if (!cut) {\n return event\n }\n return { ...event, message: { ...event.message, content: blocks } }\n}\n\nfunction resultChars(content: ToolResultBlock['content']): number {\n if (typeof content === 'string') {\n return content.length\n }\n if (!Array.isArray(content)) {\n return 0\n }\n return content.reduce((total, part, index) => total + (typeof part.text === 'string' ? part.text.length + (index > 0 ? 1 : 0) : 0), 0)\n}\n\nfunction headOf(content: ToolResultBlock['content'], chars: number): ToolResultBlock['content'] {\n if (typeof content === 'string') {\n return content.slice(0, chars)\n }\n if (!Array.isArray(content)) {\n return content\n }\n const parts: Array<{ type: string; text?: string; [key: string]: unknown }> = []\n let used = 0\n for (const part of content) {\n if (part.type === 'image_ref') {\n parts.push(part)\n continue\n }\n if (typeof part.text !== 'string') {\n continue\n }\n // `continue`, not `break`: an exhausted text budget must not strand the refs after it.\n if (used >= chars) {\n continue\n }\n const text = part.text.slice(0, chars - used)\n parts.push({ ...part, text })\n used += text.length + 1\n }\n return parts\n}\n\nexport function refImageParts(event: SessionEvent): SessionEvent {\n if (event.type !== 'user_message') {\n return event\n }\n const content = event.message.content\n if (!Array.isArray(content)) {\n return event\n }\n let changed = false\n const blocks = content.map((block) => {\n if (block.type !== 'tool_result') {\n return block\n }\n const result = block as ToolResultBlock\n const parts = result.content\n if (!Array.isArray(parts)) {\n return block\n }\n let blockChanged = false\n const mapped = parts.map((part, index) => {\n const ref = imagePartRef(part, index)\n if (!ref) {\n return part\n }\n blockChanged = true\n return ref\n })\n if (!blockChanged) {\n return block\n }\n changed = true\n return { ...result, content: mapped } satisfies ToolResultBlock\n })\n if (!changed) {\n return event\n }\n return { ...event, message: { ...event.message, content: blocks } }\n}\n","import type { SessionEvent } from '@workerdeck/protocol'\nimport type { SessionEventListener } from '../runner-interface.ts'\nimport { refImageParts, replaySlice } from './replay.ts'\n\nexport type SubscribeOptions = {\n coalesceReplay?: boolean\n truncateResults?: boolean\n imageRefs?: boolean\n}\n\nexport class SubscriberSet {\n readonly #listeners = new Map<SessionEventListener, SubscribeOptions>()\n\n // The replay runs before the listener joins the set: joining first would deliver a live\n // event emitted mid-replay ahead of the buffered events preceding it.\n subscribe(\n events: readonly SessionEvent[],\n listener: SessionEventListener,\n afterSeq = 0,\n options?: SubscribeOptions,\n resetSeq = 0,\n ): () => void {\n const asked = options ?? {}\n for (const event of replaySlice(events, { ...asked, afterSeq, resetSeq })) {\n listener(event)\n }\n this.#listeners.set(listener, asked)\n return () => {\n this.#listeners.delete(listener)\n }\n }\n\n clear(): void {\n this.#listeners.clear()\n }\n\n emit(event: SessionEvent): void {\n for (const [listener, asked] of this.#listeners) {\n try {\n listener(asked.imageRefs ? refImageParts(event) : event)\n } catch {}\n }\n }\n}\n","import type { CreateSessionRequest } from '@workerdeck/protocol'\n\ntype TitleSource = Pick<CreateSessionRequest, 'meta' | 'prompt'>\n\nexport function hostTitle(meta: CreateSessionRequest['meta']): string | undefined {\n const title = meta?.title\n return typeof title === 'string' && title.length > 0 ? title : undefined\n}\n\nexport function sessionTitle(config: TitleSource, engineTitle?: string): string | undefined {\n const host = hostTitle(config.meta)\n if (host) {\n return host\n }\n if (engineTitle) {\n return engineTitle\n }\n const prompt = config.prompt\n if (!prompt) {\n return undefined\n }\n return prompt.length > 80 ? prompt.slice(0, 77) + '…' : prompt\n}\n\nexport function withTitle<C extends TitleSource>(config: C, title: string | undefined): C {\n const meta = { ...config.meta }\n if (title) {\n meta.title = title\n } else {\n delete meta.title\n }\n return { ...config, meta }\n}\n","import { SUBAGENT_HISTORY, type ContentBlock, type SessionEventBody, type SubagentInfo } from '@workerdeck/protocol'\n\ntype TrackedSubagent = SubagentInfo & {\n settledOrder?: number\n background?: 'live' | 'replay'\n}\n\nconst SPAWNER_NAMES = new Set(['Task', 'Agent'])\n\nexport class SubagentTracker {\n #records = new Map<string, TrackedSubagent>()\n #settleCounter = 0\n\n observe(body: SessionEventBody, ts: number): void {\n switch (body.type) {\n case 'assistant_message': {\n if (body.parentToolUseId != null) {\n const record = this.#recordFor(body.parentToolUseId, ts)\n record.toolCount += toolUseBlocks(body.message.content).length\n return\n }\n for (const block of toolUseBlocks(body.message.content)) {\n if (!SPAWNER_NAMES.has(block.name)) {\n continue\n }\n this.#open(block, ts)\n }\n return\n }\n case 'user_message': {\n if (body.parentToolUseId != null) {\n this.#recordFor(body.parentToolUseId, ts)\n return\n }\n const note = parseTaskNotification(firstText(body.message.content))\n if (note) {\n const record = this.#recordFor(note.toolUseId, ts)\n const status = note.status === 'completed' ? 'done' : 'failed'\n if (record.status !== status) {\n this.#settle(record, status)\n }\n return\n }\n const content = body.message.content\n if (typeof content === 'string') {\n return\n }\n for (const block of content) {\n if (block.type !== 'tool_result') {\n continue\n }\n const result = block as {\n tool_use_id?: unknown\n is_error?: unknown\n content?: unknown\n }\n if (typeof result.tool_use_id !== 'string') {\n continue\n }\n if (result.is_error !== true && isLaunchAck(result.content)) {\n const record = this.#recordFor(result.tool_use_id, ts)\n if (record.background !== 'live') {\n record.background = body.replay === true ? 'replay' : 'live'\n }\n continue\n }\n const record = this.#records.get(result.tool_use_id)\n if (!record) {\n continue\n }\n if (result.is_error !== true && record.background !== undefined) {\n continue\n }\n const status = result.is_error === true ? 'failed' : 'done'\n if (record.status === status) {\n continue\n }\n this.#settle(record, status)\n }\n return\n }\n case 'sdk_event': {\n const p = body.payload as {\n type?: unknown\n subtype?: unknown\n tool_use_id?: unknown\n status?: unknown\n subagent_type?: unknown\n description?: unknown\n }\n if (p.type !== 'system' || typeof p.tool_use_id !== 'string') {\n return\n }\n if (p.subtype === 'task_started') {\n const record = this.#recordFor(p.tool_use_id, ts)\n record.background = 'live'\n record.agentType ??= cleaned(p.subagent_type)\n record.description ??= cleaned(p.description)\n return\n }\n if (p.subtype === 'task_notification') {\n const record = this.#recordFor(p.tool_use_id, ts)\n const status = p.status === 'completed' ? 'done' : 'failed'\n if (record.status !== status) {\n this.#settle(record, status)\n }\n return\n }\n return\n }\n case 'turn_result': {\n this.#sweep(false)\n return\n }\n case 'session_closed': {\n this.#sweep(true)\n return\n }\n case 'status_changed': {\n if (body.status === 'idle') {\n this.#sweep(false)\n } else if (body.status === 'failed' || body.status === 'closed') {\n this.#sweep(true)\n }\n return\n }\n case 'conversation_reset': {\n this.#records.clear()\n return\n }\n default: {\n return\n }\n }\n }\n\n list(): SubagentInfo[] | undefined {\n if (this.#records.size === 0) {\n return undefined\n }\n const out: SubagentInfo[] = []\n for (const r of this.#records.values()) {\n out.push({\n toolUseId: r.toolUseId,\n agentType: r.agentType,\n description: r.description,\n status: r.status,\n startedAt: r.startedAt,\n toolCount: r.toolCount,\n })\n }\n return out\n }\n\n #recordFor(toolUseId: string, ts: number): TrackedSubagent {\n let record = this.#records.get(toolUseId)\n if (!record) {\n record = { toolUseId, status: 'running', startedAt: ts, toolCount: 0 }\n this.#records.set(toolUseId, record)\n }\n return record\n }\n\n #open(block: { id: string; input: unknown }, ts: number): void {\n const record = this.#recordFor(block.id, ts)\n const input = block.input as { subagent_type?: unknown; description?: unknown } | null | undefined\n record.agentType ??= cleaned(input?.subagent_type)\n record.description ??= cleaned(input?.description)\n }\n\n #sweep(final: boolean): void {\n for (const record of this.#records.values()) {\n if (record.status !== 'running') {\n continue\n }\n if (!final && record.background === 'live') {\n continue\n }\n this.#settle(record, 'failed')\n }\n }\n\n #settle(record: TrackedSubagent, status: 'done' | 'failed'): void {\n record.status = status\n record.settledOrder = ++this.#settleCounter\n let settled = 0\n for (const r of this.#records.values()) {\n if (r.settledOrder !== undefined) {\n settled++\n }\n }\n while (settled > SUBAGENT_HISTORY) {\n let oldestId: string | undefined\n let oldestOrder = Infinity\n for (const r of this.#records.values()) {\n if (r.settledOrder === undefined || r.settledOrder >= oldestOrder) {\n continue\n }\n oldestId = r.toolUseId\n oldestOrder = r.settledOrder\n }\n if (oldestId === undefined) {\n break\n }\n this.#records.delete(oldestId)\n settled--\n }\n }\n}\n\nfunction isLaunchAck(content: unknown): boolean {\n const text = typeof content === 'string' ? content : firstText(Array.isArray(content) ? content : [])\n return typeof text === 'string' && text.trimStart().startsWith('Async agent launched')\n}\n\nfunction parseTaskNotification(text: string | undefined): { toolUseId: string; status: string } | undefined {\n if (text === undefined || !text.trimStart().startsWith('<task-notification>')) {\n return undefined\n }\n const toolUseId = /<tool-use-id>\\s*([^<\\s]+)\\s*<\\/tool-use-id>/.exec(text)?.[1]\n if (toolUseId === undefined) {\n return undefined\n }\n const status = /<status>\\s*([^<]*?)\\s*<\\/status>/.exec(text)?.[1] ?? ''\n return { toolUseId, status }\n}\n\nfunction firstText(content: string | ContentBlock[] | unknown[]): string | undefined {\n if (typeof content === 'string') {\n return content\n }\n for (const block of content) {\n const b = block as { type?: unknown; text?: unknown } | null | undefined\n if (b?.type === 'text' && typeof b.text === 'string') {\n return b.text\n }\n }\n return undefined\n}\n\nfunction cleaned(value: unknown): string | undefined {\n if (typeof value !== 'string') {\n return undefined\n }\n const text = value.trim()\n if (text === '') {\n return undefined\n }\n return text.length > 80 ? text.slice(0, 79) + '…' : text\n}\n\nfunction toolUseBlocks(content: string | ContentBlock[]): Array<{ id: string; name: string; input: unknown }> {\n if (typeof content === 'string') {\n return []\n }\n const blocks: Array<{ id: string; name: string; input: unknown }> = []\n for (const block of content) {\n if (block.type !== 'tool_use') {\n continue\n }\n const b = block as { id?: unknown; name?: unknown; input?: unknown }\n if (typeof b.id !== 'string' || typeof b.name !== 'string') {\n continue\n }\n blocks.push({ id: b.id, name: b.name, input: b.input })\n }\n return blocks\n}\n","import { randomUUID } from 'node:crypto'\nimport {\n getSessionInfo,\n getSessionMessages,\n query as sdkQuery,\n type CanUseTool,\n type Options,\n type PermissionResult,\n type Query,\n type SDKMessage,\n type SDKSessionInfo,\n type SDKUserMessage,\n type SessionMessage,\n} from '@anthropic-ai/claude-agent-sdk'\nimport {\n ENGINE_CAPABILITIES,\n type CreateSessionRequest,\n type McpServerStatusInfo,\n type PermissionMode,\n type PermissionRequest,\n type SessionEvent,\n type SessionEventBody,\n type SessionInfo,\n type SessionStatus,\n} from '@workerdeck/protocol'\nimport { type AttachmentInput, attachmentContentBlocks, attachmentRef } from '../../lib/attachments.ts'\nimport { InputQueue } from '../../lib/input-queue.ts'\nimport {\n type UsageRateLimits,\n defaultModelFromSdk,\n isSyntheticUserText,\n mcpStatusInfo,\n modelOptionsFromSdk,\n normalizeSdkMessage,\n rateLimitEventsFromUsage,\n toApiMessage,\n} from '../../lib/normalize.ts'\nimport type { PermissionDecision, Runner, SessionEventListener } from '../../runner-interface.ts'\nimport { EventLog } from '../../lib/event-log.ts'\nimport { SubscriberSet, type SubscribeOptions } from '../../lib/subscribers.ts'\nimport { hostTitle, sessionTitle, withTitle } from '../../lib/title.ts'\nimport { SubagentTracker } from './subagents.ts'\n\nexport type QueryFn = (params: { prompt: AsyncIterable<SDKUserMessage>; options?: Options }) => Query\n\nexport type HistoryFn = (sdkSessionId: string, options: { dir?: string }) => Promise<SessionMessage[]>\n\nexport type SessionInfoFn = (sdkSessionId: string, options: { dir?: string }) => Promise<SDKSessionInfo | undefined>\n\nexport type SessionRunnerConfig = CreateSessionRequest & {\n queryFn?: QueryFn\n env?: Record<string, string | undefined>\n pathToClaudeCodeExecutable?: string\n extraOptions?: Partial<Options>\n defaultApprovalTimeoutMs?: number\n backfillHistory?: boolean\n historyFn?: HistoryFn\n sessionInfoFn?: SessionInfoFn\n}\n\ntype PendingApproval = {\n request: PermissionRequest\n resolve: (result: PermissionResult) => void\n timer: ReturnType<typeof setTimeout>\n}\n\nconst DEFAULT_APPROVAL_TIMEOUT_MS = 300_000\n\nexport class SessionRunner implements Runner {\n readonly id: string\n readonly createdAt: number\n\n #config: SessionRunnerConfig\n readonly #cwd: string\n #log = new EventLog()\n #subscribers = new SubscriberSet()\n #status: SessionStatus = 'starting'\n #statusDetail: string | undefined\n #sdkSessionId: string | undefined\n #model: string | undefined\n #apiKeySource: string | undefined\n #permissionMode: PermissionMode | undefined\n #pending = new Map<string, PendingApproval>()\n #turnOverWhileBlocked = false\n #subagents = new SubagentTracker()\n #totalCostUsd: number | undefined\n #numTurns: number | undefined\n #input = new InputQueue()\n #query: Query | undefined\n #capabilitiesEmitted = false\n #subscriptionType: string | undefined\n #engineTitle: string | undefined\n #started = false\n #closed = false\n #runPromise: Promise<void> | undefined\n\n constructor(config: SessionRunnerConfig, id: string = randomUUID()) {\n if (!config.cwd) {\n throw new Error('the claude engine requires a cwd')\n }\n this.#cwd = config.cwd\n this.#config = config\n this.#permissionMode = config.permissionMode\n this.id = id\n this.createdAt = Date.now()\n }\n\n get status(): SessionStatus {\n return this.#status\n }\n\n get sdkSessionId(): string | undefined {\n return this.#sdkSessionId\n }\n\n get lastSeq(): number {\n return this.#log.seq\n }\n\n get apiKeySource(): string | undefined {\n return this.#apiKeySource\n }\n\n get pendingApprovals(): PermissionRequest[] {\n return [...this.#pending.values()].map((p) => p.request)\n }\n\n info(): SessionInfo {\n return {\n id: this.id,\n sdkSessionId: this.#sdkSessionId,\n status: this.#status,\n cwd: this.#cwd,\n profile: this.#config.profile,\n engine: 'claude',\n capabilities: ENGINE_CAPABILITIES.claude,\n model: this.#model ?? this.#config.model,\n permissionMode: this.#permissionMode,\n canBypassPermissions: this.#config.permissionMode === 'bypassPermissions' || this.#config.allowDangerouslySkipPermissions === true,\n apiKeySource: this.#apiKeySource,\n createdAt: this.createdAt,\n lastSeq: this.#log.seq,\n activityCount: this.#log.activityCount,\n proseCount: this.#log.proseCount,\n contextUsage: this.#log.contextUsage,\n pendingPermissionCount: this.#pending.size,\n subagents: this.#subagents.list(),\n meta: this.#config.meta,\n scope: this.#config.scope,\n title: sessionTitle(this.#config, this.#engineTitle),\n totalCostUsd: this.#totalCostUsd,\n numTurns: this.#numTurns,\n lastActivityAt: this.#log.lastActivityAt,\n }\n }\n\n setTitle(title: string | undefined): void {\n this.#config = withTitle(this.#config, title)\n }\n\n start(): Promise<void> {\n if (this.#started) {\n return this.#runPromise!\n }\n this.#started = true\n if (this.#config.prompt) {\n this.sendMessage(this.#config.prompt)\n }\n this.#runPromise = this.#run()\n return this.#runPromise\n }\n\n sendMessage(text: string, attachments?: readonly AttachmentInput[]): void {\n if (this.#closed) {\n throw new Error('session is closed')\n }\n const blocks = attachments?.length ? attachmentContentBlocks(attachments) : []\n // A message may be attachments alone; an empty text block is not valid API input.\n const content = blocks.length\n ? ([...blocks, ...(text ? [{ type: 'text', text }] : [])] as unknown as SDKUserMessage['message']['content'])\n : text\n this.#input.push({\n type: 'user',\n message: { role: 'user', content },\n parent_tool_use_id: null,\n session_id: this.#sdkSessionId,\n })\n this.#emit({\n type: 'user_message',\n message: { role: 'user', content: text },\n parentToolUseId: null,\n attachments: attachments?.length ? attachments.map(attachmentRef) : undefined,\n uuid: randomUUID(),\n })\n }\n\n async mcpServers(): Promise<McpServerStatusInfo[] | undefined> {\n const query = this.#query\n if (typeof query?.mcpServerStatus !== 'function') {\n return undefined\n }\n return (await query.mcpServerStatus()).map(mcpStatusInfo)\n }\n\n async reconnectMcpServer(name: string): Promise<void> {\n const query = this.#query\n if (typeof query?.reconnectMcpServer !== 'function') {\n throw new Error('this session cannot reconnect MCP servers')\n }\n await query.reconnectMcpServer(name)\n }\n\n async setMcpServerEnabled(name: string, enabled: boolean): Promise<void> {\n const query = this.#query\n if (typeof query?.toggleMcpServer !== 'function') {\n throw new Error('this session cannot enable or disable MCP servers')\n }\n await query.toggleMcpServer(name, enabled)\n }\n\n resolvePermission(requestId: string, decision: PermissionDecision): boolean {\n const pending = this.#pending.get(requestId)\n if (!pending) {\n return false\n }\n this.#settleApproval(requestId, pending, decision, 'client')\n return true\n }\n\n async interrupt(): Promise<void> {\n await this.#query?.interrupt()\n }\n\n async clearContext(): Promise<void> {\n if (this.#status === 'closed' || this.#status === 'failed') {\n throw new Error('session is closed')\n }\n this.sendMessage('/clear')\n }\n\n async setPermissionMode(mode: PermissionMode): Promise<void> {\n await this.#query?.setPermissionMode(mode)\n this.#permissionMode = mode\n this.#emit({ type: 'permission_mode_changed', mode })\n }\n\n async setModel(model?: string): Promise<void> {\n await this.#query?.setModel(model)\n this.#model = model\n this.#emit({ type: 'model_changed', model })\n }\n\n fail(message: string): void {\n if (this.#closed) {\n return\n }\n this.#emit({ type: 'session_error', message })\n this.#setStatus('failed')\n this.close('error')\n }\n\n close(reason: 'client' | 'server' | 'error' = 'client'): void {\n if (this.#closed) {\n return\n }\n this.#closed = true\n for (const [id, pending] of this.#pending) {\n this.#settleApproval(id, pending, { behavior: 'deny', message: 'Session closed' }, 'policy')\n }\n this.#input.end()\n this.#query?.close()\n this.#emit({ type: 'session_closed', reason })\n this.#setStatus('closed')\n }\n\n eventAt(seq: number): SessionEvent | undefined {\n return this.#log.at(seq)\n }\n\n subscribe(listener: SessionEventListener, afterSeq = 0, options?: SubscribeOptions): () => void {\n return this.#subscribers.subscribe(this.#log.events, listener, afterSeq, options, this.#log.resetSeq)\n }\n\n async #run(): Promise<void> {\n const queryFn = this.#config.queryFn ?? (sdkQuery as QueryFn)\n try {\n await this.#backfillHistory()\n if (this.#closed) {\n return\n }\n this.#query = queryFn({ prompt: this.#input, options: this.#buildOptions() })\n if (!this.#config.prompt) {\n this.#setStatus('idle')\n void this.#fetchCapabilities()\n void this.#fetchContextUsage()\n void this.#fetchRateLimits()\n }\n for await (const message of this.#query) {\n this.#handleMessage(message)\n }\n if (!this.#closed) {\n this.#closed = true\n this.#input.end()\n this.#emit({ type: 'session_closed', reason: 'server' })\n this.#setStatus('closed')\n }\n } catch (error) {\n if (!this.#closed) {\n this.#emit({\n type: 'session_error',\n message: error instanceof Error ? error.message : String(error),\n })\n this.#setStatus('failed')\n this.close('error')\n }\n }\n }\n\n async #backfillHistory(): Promise<void> {\n const c = this.#config\n if (!c.resume || c.backfillHistory === false) {\n return\n }\n const historyFn = c.historyFn ?? ((sessionId: string, options: { dir?: string }) => getSessionMessages(sessionId, options))\n let messages: SessionMessage[]\n try {\n messages = await historyFn(c.resume, { dir: this.#cwd })\n } catch {\n return\n }\n for (const m of messages) {\n if (this.#closed) {\n return\n }\n if (m.type === 'user') {\n const message = toApiMessage(m.message)\n this.#emit({\n type: 'user_message',\n message,\n parentToolUseId: m.parent_tool_use_id,\n replay: true,\n synthetic: isSyntheticUserText(message) ? true : undefined,\n uuid: m.uuid,\n })\n } else if (m.type === 'assistant') {\n this.#emit({\n type: 'assistant_message',\n message: toApiMessage(m.message),\n parentToolUseId: m.parent_tool_use_id,\n replay: true,\n uuid: m.uuid,\n })\n }\n }\n }\n\n #buildOptions(): Options {\n const c = this.#config\n const options: Options = {\n cwd: this.#cwd,\n permissionMode: c.permissionMode,\n allowedTools: c.allowedTools,\n disallowedTools: c.disallowedTools,\n mcpServers: c.mcpServers as Options['mcpServers'],\n settingSources: c.settingSources,\n model: c.model,\n maxTurns: c.maxTurns,\n maxBudgetUsd: c.maxBudgetUsd,\n resume: c.resume,\n forkSession: c.forkSession,\n effort: c.reasoningEffort as Options['effort'],\n includePartialMessages: c.includePartialMessages ?? true,\n forwardSubagentText: true,\n canUseTool: this.#canUseTool,\n env: c.env,\n pathToClaudeCodeExecutable: c.pathToClaudeCodeExecutable,\n ...(c.permissionMode === 'bypassPermissions' || c.allowDangerouslySkipPermissions ? { allowDangerouslySkipPermissions: true } : {}),\n ...c.extraOptions,\n }\n return options\n }\n\n #handleMessage(msg: SDKMessage): void {\n if (msg.type === 'system' && msg.subtype === 'init') {\n this.#sdkSessionId = msg.session_id\n this.#model = msg.model\n this.#permissionMode = msg.permissionMode\n this.#apiKeySource = msg.apiKeySource\n this.#emit({\n type: 'system_init',\n sdkSessionId: msg.session_id,\n model: msg.model,\n cwd: msg.cwd,\n apiKeySource: msg.apiKeySource,\n tools: msg.tools,\n skills: msg.skills,\n slashCommands: msg.slash_commands,\n permissionMode: msg.permissionMode,\n claudeCodeVersion: msg.claude_code_version,\n mcpServers: msg.mcp_servers,\n })\n this.#turnOverWhileBlocked = false\n this.#setStatus('running')\n void this.#fetchCapabilities()\n void this.#fetchContextUsage()\n void this.#fetchRateLimits()\n void this.#fetchEngineTitle()\n return\n }\n if (msg.type === 'system' && msg.subtype === 'session_state_changed') {\n if (this.#pending.size > 0) {\n if (msg.state === 'idle') {\n this.#turnOverWhileBlocked = true\n } else if (msg.state === 'running') {\n this.#turnOverWhileBlocked = false\n }\n return\n }\n if (msg.state === 'idle') {\n this.#setStatus('idle')\n } else if (msg.state === 'running') {\n this.#setStatus('running')\n }\n return\n }\n const body = normalizeSdkMessage(msg)\n if (body) {\n this.#emit(body)\n if (body.type === 'conversation_reset') {\n if (body.sdkSessionId) {\n this.#sdkSessionId = body.sdkSessionId\n }\n void this.#fetchContextUsage()\n }\n if (body.type === 'turn_result') {\n this.#totalCostUsd = body.totalCostUsd\n this.#numTurns = body.numTurns\n if (this.#pending.size === 0) {\n this.#setStatus('idle')\n } else {\n this.#turnOverWhileBlocked = true\n }\n void this.#fetchContextUsage()\n void this.#fetchRateLimits()\n void this.#fetchEngineTitle()\n }\n }\n }\n\n async #fetchCapabilities(): Promise<void> {\n if (this.#capabilitiesEmitted) {\n return\n }\n const query = this.#query\n if (typeof query?.supportedModels !== 'function' || typeof query.supportedCommands !== 'function') {\n return\n }\n try {\n const [models, commands] = await Promise.all([query.supportedModels(), query.supportedCommands()])\n if (this.#closed || this.#capabilitiesEmitted) {\n return\n }\n this.#capabilitiesEmitted = true\n this.#emit({\n type: 'capabilities',\n models: modelOptionsFromSdk(models),\n defaultModel: defaultModelFromSdk(models),\n commands: commands.map((c) => ({\n name: c.name,\n description: c.description,\n argumentHint: c.argumentHint,\n aliases: c.aliases,\n })),\n })\n } catch {}\n }\n\n async #fetchEngineTitle(): Promise<void> {\n if (hostTitle(this.#config.meta)) {\n return\n }\n const sdkSessionId = this.#sdkSessionId\n if (!sdkSessionId) {\n return\n }\n const read = this.#config.sessionInfoFn ?? getSessionInfo\n try {\n const info = await read(sdkSessionId, { dir: this.#cwd })\n if (this.#closed || !info) {\n return\n }\n const summary = info.summary && info.summary !== info.firstPrompt ? info.summary : undefined\n const title = info.customTitle || summary\n if (title) {\n this.#engineTitle = title\n }\n } catch {}\n }\n\n async #fetchContextUsage(): Promise<void> {\n const query = this.#query\n if (typeof query?.getContextUsage !== 'function') {\n return\n }\n try {\n const usage = await query.getContextUsage()\n if (this.#closed) {\n return\n }\n this.#emit({\n type: 'context_usage',\n usage: {\n categories: usage.categories.map((c) => ({\n name: c.name,\n tokens: c.tokens,\n color: c.color,\n })),\n totalTokens: usage.totalTokens,\n maxTokens: usage.maxTokens,\n percentage: usage.percentage,\n model: usage.model,\n },\n })\n } catch {}\n }\n\n async #fetchRateLimits(): Promise<void> {\n const query = this.#query as { usage_EXPERIMENTAL_MAY_CHANGE_DO_NOT_RELY_ON_THIS_API_YET?: () => Promise<unknown> } | undefined\n const fetchUsage = query?.usage_EXPERIMENTAL_MAY_CHANGE_DO_NOT_RELY_ON_THIS_API_YET\n if (typeof fetchUsage !== 'function') {\n return\n }\n try {\n const usage = (await fetchUsage.call(query)) as UsageRateLimits\n if (this.#closed) {\n return\n }\n const subscriptionType = usage.subscription_type\n if (subscriptionType && subscriptionType !== this.#subscriptionType) {\n this.#subscriptionType = subscriptionType\n this.#emit({ type: 'plan_info', subscriptionType })\n }\n for (const body of rateLimitEventsFromUsage(usage)) {\n this.#emit(body)\n }\n } catch {}\n }\n\n #canUseTool: CanUseTool = (toolName, input, options) => {\n const id = randomUUID()\n const timeoutMs = this.#config.approvalTimeoutMs ?? this.#config.defaultApprovalTimeoutMs ?? DEFAULT_APPROVAL_TIMEOUT_MS\n const request: PermissionRequest = {\n id,\n toolName,\n input,\n toolUseId: options.toolUseID,\n title: options.title,\n displayName: options.displayName,\n description: options.description,\n decisionReason: options.decisionReason,\n agentId: options.agentID,\n expiresAt: Date.now() + timeoutMs,\n }\n const questionBehavior = this.#config.questionBehavior ?? 'ask'\n if (toolName === 'AskUserQuestion' && questionBehavior !== 'ask') {\n delete request.expiresAt\n return Promise.resolve(this.#resolveQuestionByPolicy(request, questionBehavior))\n }\n return new Promise<PermissionResult>((resolve) => {\n const timer = setTimeout(() => {\n const pending = this.#pending.get(id)\n if (pending) {\n this.#settleApproval(id, pending, { behavior: 'deny', message: 'Approval timed out' }, 'timeout')\n }\n }, timeoutMs)\n this.#pending.set(id, { request, resolve, timer })\n options.signal.addEventListener('abort', () => {\n const pending = this.#pending.get(id)\n if (pending) {\n this.#settleApproval(id, pending, { behavior: 'deny', message: 'Turn aborted' }, 'policy')\n }\n })\n this.#emit({ type: 'permission_requested', request })\n this.#setStatus('awaiting_approval')\n })\n }\n\n #resolveQuestionByPolicy(request: PermissionRequest, mode: 'auto' | 'deny'): PermissionResult {\n this.#emit({ type: 'permission_requested', request })\n if (mode === 'deny') {\n const message = 'Interactive questions are disabled for this session — choose the most reasonable option yourself and continue.'\n this.#emit({\n type: 'permission_resolved',\n requestId: request.id,\n behavior: 'deny',\n resolvedBy: 'policy',\n message,\n })\n return { behavior: 'deny', message, toolUseID: request.toolUseId }\n }\n this.#emit({\n type: 'permission_resolved',\n requestId: request.id,\n behavior: 'allow',\n resolvedBy: 'policy',\n })\n return {\n behavior: 'allow',\n updatedInput: { ...request.input, answers: recommendedAnswers(request.input) },\n toolUseID: request.toolUseId,\n }\n }\n\n #settleApproval(id: string, pending: PendingApproval, decision: PermissionDecision, resolvedBy: 'client' | 'timeout' | 'policy'): void {\n clearTimeout(pending.timer)\n this.#pending.delete(id)\n if (decision.behavior === 'allow') {\n pending.resolve({\n behavior: 'allow',\n updatedInput: decision.updatedInput ?? pending.request.input,\n toolUseID: pending.request.toolUseId,\n })\n } else {\n pending.resolve({\n behavior: 'deny',\n message: decision.message ?? 'Denied',\n interrupt: decision.interrupt,\n toolUseID: pending.request.toolUseId,\n })\n }\n this.#emit({\n type: 'permission_resolved',\n requestId: id,\n behavior: decision.behavior,\n resolvedBy,\n message: decision.behavior === 'deny' ? (decision.message ?? 'Denied') : undefined,\n })\n if (this.#pending.size === 0) {\n const endedWhileBlocked = this.#turnOverWhileBlocked\n this.#turnOverWhileBlocked = false\n if (endedWhileBlocked) {\n this.#setStatus('idle')\n } else if (this.#status === 'awaiting_approval') {\n this.#setStatus('running')\n }\n }\n }\n\n #setStatus(status: SessionStatus, detail?: string): void {\n if (this.#status === status && this.#statusDetail === detail) {\n return\n }\n if (this.#status === 'closed' || this.#status === 'failed') {\n return\n }\n this.#status = status\n this.#statusDetail = detail\n this.#emit({ type: 'status_changed', status, detail })\n }\n\n #emit(body: SessionEventBody): void {\n const event = this.#log.append(body)\n this.#subagents.observe(body, event.ts)\n this.#subscribers.emit(event)\n }\n}\n\nfunction recommendedAnswers(input: Record<string, unknown>): Record<string, string> {\n const answers: Record<string, string> = {}\n const questions = Array.isArray(input.questions) ? input.questions : []\n for (const entry of questions) {\n const q = entry as { question?: unknown; options?: unknown }\n if (typeof q.question !== 'string' || !Array.isArray(q.options)) {\n continue\n }\n const first = q.options[0] as { label?: unknown } | undefined\n if (typeof first?.label === 'string') {\n answers[q.question] = first.label\n }\n }\n return answers\n}\n","import { randomUUID } from 'node:crypto'\nimport { ToolLoopAgent, generateText, isStepCount, type LanguageModel, type ModelMessage, type ToolSet } from 'ai'\nimport {\n ENGINE_CAPABILITIES,\n snapshotRetains,\n type ContentBlock,\n type CreateSessionRequest,\n type McpServerStatusInfo,\n type PermissionDecisionSource,\n type PermissionMode,\n type PermissionRequest,\n type SessionEvent,\n type SessionEventBody,\n type SessionInfo,\n type SessionStatus,\n type ToolExecutionBackend,\n} from '@workerdeck/protocol'\nimport type { SandboxVfs } from '@workerdeck/sandbox'\nimport { type AttachmentInput, attachmentRef, normalizeMediaType } from '../../lib/attachments.ts'\nimport type { ParkedExecution, PermissionDecision, Runner, RunnerSnapshot, SessionEventListener } from '../../runner-interface.ts'\nimport type { ToolExecutionCall, ToolExecutionResult, ToolExecutor } from '../../executors/tool-executor.ts'\nimport { EventLog } from '../../lib/event-log.ts'\nimport { SubscriberSet, type SubscribeOptions } from '../../lib/subscribers.ts'\nimport { sessionTitle, withTitle } from '../../lib/title.ts'\n\nconst SUPPORTED_PERMISSION_MODES: readonly PermissionMode[] = ['default', 'bypassPermissions', 'dontAsk']\n\nexport type AiSdkRunnerConfig = Omit<CreateSessionRequest, 'cwd'> & {\n cwd?: string\n languageModel: LanguageModel\n tools?: ToolSet\n instructions?: string\n maxSteps?: number\n executor?: ToolExecutor\n executableTools?: string[]\n vfs?: SandboxVfs\n executionLimits?: { timeoutMs?: number; memoryLimitBytes?: number }\n executionBackend?: ToolExecutionBackend\n shouldApprove?: (call: { toolName: string; input: unknown }) => boolean\n approvalTimeoutMs?: number\n resolveModel?: (modelId: string | undefined) => LanguageModel\n reportMcpServers?: () => Promise<McpServerStatusInfo[] | undefined>\n onClose?: () => void | Promise<void>\n restore?: RunnerSnapshot\n}\n\nexport type PendingToolCall = {\n toolCallId: string\n toolName: string\n input: unknown\n deferred?: boolean\n expiresAt?: number\n}\n\nexport type AiSdkSessionState = {\n messages: ModelMessage[]\n pendingToolCalls: PendingToolCall[]\n dispatched: string[]\n numTurns: number\n totalUsage: { input: number; output: number; cacheWrite: number; cacheRead: number }\n turnAccum?: { startedAt: number; input: number; output: number; cacheWrite: number; cacheRead: number }\n permissionMode: PermissionMode\n model?: string\n lastActivityAt?: number\n parkedAt?: number\n}\n\nexport type ToolCallOutput = { type: 'text'; value: string } | { type: 'json'; value: unknown }\n\nexport class AiSdkRunner implements Runner {\n readonly id: string\n readonly createdAt: number\n\n #config: AiSdkRunnerConfig\n #model: LanguageModel\n #log = new EventLog()\n #subscribers = new SubscriberSet()\n #status: SessionStatus = 'starting'\n #statusDetail: string | undefined\n #permissionMode: PermissionMode\n #messages: ModelMessage[] = []\n #pendingToolCalls = new Map<string, PendingToolCall>()\n #dispatched = new Set<string>()\n #turnChain: Promise<void> = Promise.resolve()\n #abort: AbortController | undefined\n #turnAccum: { startedAt: number; input: number; output: number; cacheWrite: number; cacheRead: number } | undefined\n #numTurns = 0\n #totalUsage = { input: 0, output: 0, cacheWrite: 0, cacheRead: 0 }\n #started = false\n #closed = false\n #parked = false\n #modelAlias: string | undefined\n #pendingApprovals = new Map<\n string,\n {\n request: PermissionRequest\n toolCallId: string\n timer: ReturnType<typeof setTimeout>\n }\n >()\n\n constructor(config: AiSdkRunnerConfig, id: string = randomUUID()) {\n const mode = config.permissionMode ?? 'default'\n if (!SUPPORTED_PERMISSION_MODES.includes(mode)) {\n throw new Error(`permission mode '${mode}' is not supported by the AI SDK engine`)\n }\n this.#config = config\n this.#model = config.languageModel\n this.#permissionMode = mode\n this.#modelAlias = config.model\n this.id = config.restore?.id ?? id\n this.createdAt = config.restore?.createdAt ?? Date.now()\n if (config.restore) {\n this.#restore(config.restore)\n }\n }\n\n #restore(snapshot: RunnerSnapshot): void {\n if (snapshot.engine !== 'provider') {\n throw new Error(`cannot restore a '${snapshot.engine}' snapshot into the AI SDK engine`)\n }\n const state = snapshot.state as AiSdkSessionState | undefined\n if (!state || !Array.isArray(state.messages)) {\n throw new Error('session snapshot is missing its provider-engine state')\n }\n this.#log.restore(snapshot.events, snapshot.seq, state.lastActivityAt)\n this.#messages = [...state.messages]\n for (const call of state.pendingToolCalls) {\n this.#pendingToolCalls.set(call.toolCallId, call)\n }\n this.#dispatched = new Set(state.dispatched)\n this.#numTurns = state.numTurns\n this.#totalUsage = { ...state.totalUsage }\n this.#turnAccum = state.turnAccum ? { ...state.turnAccum } : undefined\n if (this.#turnAccum && state.parkedAt !== undefined) {\n this.#turnAccum.startedAt += Date.now() - state.parkedAt\n }\n this.#permissionMode = state.permissionMode\n this.#status = this.#pendingToolCalls.size > 0 ? 'parked' : 'idle'\n if (state.model !== undefined && state.model !== this.#modelAlias && this.#config.resolveModel) {\n this.#modelAlias = state.model\n this.#model = this.#config.resolveModel(state.model)\n }\n }\n\n get status(): SessionStatus {\n return this.#status\n }\n\n get lastSeq(): number {\n return this.#log.seq\n }\n\n get messages(): ModelMessage[] {\n return [...this.#messages]\n }\n\n get pendingToolCalls(): PendingToolCall[] {\n return [...this.#pendingToolCalls.values()]\n }\n\n get pendingApprovals(): PermissionRequest[] {\n return [...this.#pendingApprovals.values()].map((a) => a.request)\n }\n\n get vfs(): SandboxVfs | undefined {\n return this.#config.vfs\n }\n\n info(): SessionInfo {\n return {\n id: this.id,\n status: this.#status,\n // Never process.cwd(): this engine opens no directory, and the gateway's own deploy path\n // has no business on a client surface.\n cwd: this.#config.cwd ?? '',\n profile: this.#config.profile,\n engine: 'provider',\n capabilities: this.#config.shouldApprove\n ? { ...ENGINE_CAPABILITIES.provider, interactiveApprovals: true }\n : ENGINE_CAPABILITIES.provider,\n model: this.#modelId(),\n permissionMode: this.#permissionMode,\n createdAt: this.createdAt,\n lastSeq: this.#log.seq,\n activityCount: this.#log.activityCount,\n proseCount: this.#log.proseCount,\n contextUsage: this.#log.contextUsage,\n pendingPermissionCount: this.#pendingApprovals.size,\n meta: this.#config.meta,\n scope: this.#config.scope,\n title: sessionTitle(this.#config),\n numTurns: this.#numTurns || undefined,\n lastActivityAt: this.#log.lastActivityAt,\n }\n }\n\n start(): Promise<void> {\n if (this.#started) {\n return this.#turnChain\n }\n this.#started = true\n if (this.#config.restore) {\n return this.#turnChain\n }\n this.#setStatus('idle')\n if (this.#config.prompt) {\n this.sendMessage(this.#config.prompt)\n }\n return this.#turnChain\n }\n\n park(): RunnerSnapshot | undefined {\n if (this.#closed || this.#parked) {\n return undefined\n }\n if (this.#abort || !this.#restingOnDeferred()) {\n return undefined\n }\n this.#setStatus('parked')\n const snapshot = this.#buildSnapshot()\n this.#parked = true\n this.#subscribers.clear()\n try {\n void Promise.resolve(this.#config.onClose?.()).catch(() => {})\n } catch {}\n return snapshot\n }\n\n snapshot(): RunnerSnapshot | undefined {\n if (this.#closed || this.#parked || this.#abort) {\n return undefined\n }\n if (this.#pendingToolCalls.size > 0 && !this.#restingOnDeferred()) {\n return undefined\n }\n return this.#buildSnapshot()\n }\n\n #buildSnapshot(): RunnerSnapshot {\n const parked: ParkedExecution[] = [...this.#pendingToolCalls.values()].map((call) => ({\n executionId: call.toolCallId,\n toolName: call.toolName,\n expiresAt: call.expiresAt,\n }))\n const state: AiSdkSessionState = {\n messages: this.#messages,\n pendingToolCalls: [...this.#pendingToolCalls.values()],\n dispatched: [...this.#dispatched],\n numTurns: this.#numTurns,\n totalUsage: { ...this.#totalUsage },\n turnAccum: this.#turnAccum ? { ...this.#turnAccum } : undefined,\n permissionMode: this.#permissionMode,\n model: this.#modelAlias,\n lastActivityAt: this.#log.lastActivityAt,\n parkedAt: Date.now(),\n }\n return {\n engine: 'provider',\n id: this.id,\n createdAt: this.createdAt,\n seq: this.#log.seq,\n events: this.#log.events.filter((event) => snapshotRetains(event)),\n vfs: this.#config.vfs?.snapshot(),\n parked,\n state,\n }\n }\n\n sendMessage(text: string, attachments?: readonly AttachmentInput[]): void {\n if (this.#parked) {\n throw new Error('session is parked')\n }\n if (this.#closed) {\n throw new Error('session is closed')\n }\n const content = attachments?.length\n ? [\n ...attachments.map((attachment) => ({\n type: 'file' as const,\n data: attachment.data,\n mediaType: normalizeMediaType(attachment.mediaType),\n filename: attachment.name,\n })),\n ...(text ? [{ type: 'text' as const, text }] : []),\n ]\n : text\n this.#messages.push({ role: 'user', content })\n this.#emit({\n type: 'user_message',\n message: { role: 'user', content: text },\n parentToolUseId: null,\n attachments: attachments?.length ? attachments.map(attachmentRef) : undefined,\n uuid: randomUUID(),\n })\n this.#scheduleTurn()\n }\n\n resolveToolCall(toolCallId: string, output: ToolCallOutput, options?: { isError?: boolean }): boolean {\n if (!this.#settlePendingCall(toolCallId, output, options?.isError === true)) {\n return false\n }\n if (this.#pendingToolCalls.size === 0) {\n this.#scheduleTurn()\n }\n return true\n }\n\n #settlePendingCall(toolCallId: string, output: ToolCallOutput, isError: boolean): boolean {\n const pending = this.#pendingToolCalls.get(toolCallId)\n if (!pending || this.#closed || this.#parked) {\n return false\n }\n this.#pendingToolCalls.delete(toolCallId)\n let insertAt = this.#messages.length\n while (insertAt > 0 && this.#messages[insertAt - 1]!.role === 'user') {\n insertAt--\n }\n this.#messages.splice(insertAt, 0, {\n role: 'tool',\n content: [\n {\n type: 'tool-result',\n toolCallId,\n toolName: pending.toolName,\n output: (isError ? { type: 'error-text', value: textValue(output) } : output) as never,\n },\n ],\n })\n this.#emit({\n type: 'user_message',\n message: {\n role: 'user',\n content: [\n {\n type: 'tool_result',\n tool_use_id: toolCallId,\n content: textValue(output),\n is_error: isError || undefined,\n },\n ],\n },\n parentToolUseId: null,\n synthetic: true,\n uuid: randomUUID(),\n })\n return true\n }\n\n resolvePermission(requestId: string, decision: PermissionDecision): boolean {\n const approval = this.#pendingApprovals.get(requestId)\n if (!approval) {\n return false\n }\n clearTimeout(approval.timer)\n this.#pendingApprovals.delete(requestId)\n const source: PermissionDecisionSource = 'client'\n if (decision.behavior === 'allow') {\n this.#emit({\n type: 'permission_resolved',\n requestId,\n behavior: 'allow',\n resolvedBy: source,\n })\n this.#dispatchSingle(approval.toolCallId)\n } else {\n const message = decision.message ?? 'Permission denied by user'\n this.#emit({\n type: 'permission_resolved',\n requestId,\n behavior: 'deny',\n resolvedBy: source,\n message,\n })\n this.#applyExecutionResult(approval.toolCallId, {\n status: 'failed',\n reason: 'permission_denied',\n error: message,\n })\n if (decision.interrupt) {\n void this.interrupt()\n }\n }\n return true\n }\n\n emitFileDelivered(file: { path: string; bytes: number; description?: string }): void {\n if (this.#closed || this.#parked) {\n return\n }\n this.#emit({ type: 'file_delivered', ...file })\n }\n\n async generateDigest(prompt: string): Promise<string> {\n const result = await generateText({\n model: this.#model,\n prompt,\n abortSignal: this.#abort?.signal,\n })\n const accum = this.#turnAccum\n if (accum) {\n accum.input += result.usage.inputTokens ?? 0\n accum.output += result.usage.outputTokens ?? 0\n accum.cacheWrite += result.usage.inputTokenDetails?.cacheWriteTokens ?? 0\n accum.cacheRead += result.usage.inputTokenDetails?.cacheReadTokens ?? 0\n }\n return result.text\n }\n\n async clearContext(): Promise<void> {\n if (this.#status === 'closed' || this.#status === 'failed') {\n throw new Error('session is closed')\n }\n const run = this.#turnChain.then(() => {\n if (this.#closed) {\n throw new Error('session is closed')\n }\n // Waiting cannot resolve parked external work — a bridged result is owed by a client that\n // may answer in two days, and the messages it splices into are what a clear would drop.\n if (this.#pendingToolCalls.size > 0) {\n throw new Error('cannot clear context while tool calls are outstanding')\n }\n this.#messages = []\n this.#emit({ type: 'conversation_reset' })\n })\n this.#turnChain = run.then(\n () => undefined,\n () => undefined,\n )\n await run\n }\n\n async interrupt(): Promise<void> {\n if (this.#abort) {\n this.#abort.abort()\n } else if (this.#pendingToolCalls.size > 0) {\n const accum = this.#turnAccum ?? { startedAt: Date.now(), input: 0, output: 0, cacheWrite: 0, cacheRead: 0 }\n for (const call of Array.from(this.#pendingToolCalls.values())) {\n this.#settlePendingCall(call.toolCallId, { type: 'text', value: 'interrupted' }, true)\n }\n this.#dispatched.clear()\n this.#numTurns += 1\n this.#emit({\n type: 'turn_result',\n subtype: 'error_during_execution',\n isError: true,\n durationMs: Date.now() - accum.startedAt,\n numTurns: this.#numTurns,\n totalCostUsd: 0,\n errors: ['interrupted'],\n usage: turnUsage(accum),\n })\n this.#turnAccum = undefined\n this.#setStatus('idle')\n }\n await this.#turnChain\n }\n\n async setPermissionMode(mode: PermissionMode): Promise<void> {\n if (!SUPPORTED_PERMISSION_MODES.includes(mode)) {\n throw new Error(`permission mode '${mode}' is not supported by the AI SDK engine`)\n }\n this.#permissionMode = mode\n this.#emit({ type: 'permission_mode_changed', mode })\n }\n\n async setModel(model?: string): Promise<void> {\n const resolve = this.#config.resolveModel\n if (!resolve) {\n throw new Error('set_model is not supported by this session')\n }\n this.#model = resolve(model)\n this.#modelAlias = model\n this.#emit({ type: 'model_changed', model })\n }\n\n fail(message: string): void {\n if (this.#closed) {\n return\n }\n this.#emit({ type: 'session_error', message })\n this.#setStatus('failed')\n this.close('error')\n }\n\n close(reason: 'client' | 'server' | 'error' = 'client'): void {\n if (this.#closed || this.#parked) {\n return\n }\n this.#closed = true\n this.#abort?.abort()\n this.#pendingToolCalls.clear()\n this.#dispatched.clear()\n for (const { timer } of this.#pendingApprovals.values()) {\n clearTimeout(timer)\n }\n this.#pendingApprovals.clear()\n this.#emit({ type: 'session_closed', reason })\n this.#setStatus('closed')\n try {\n void Promise.resolve(this.#config.onClose?.()).catch(() => {})\n } catch {}\n }\n\n eventAt(seq: number): SessionEvent | undefined {\n return this.#log.at(seq)\n }\n\n subscribe(listener: SessionEventListener, afterSeq = 0, options?: SubscribeOptions): () => void {\n return this.#subscribers.subscribe(this.#log.events, listener, afterSeq, options, this.#log.resetSeq)\n }\n\n #scheduleTurn(): void {\n this.#turnChain = this.#turnChain.then(() => this.#runTurn())\n }\n\n settleExecution(executionId: string, result: ToolExecutionResult): boolean {\n if (this.#closed || this.#parked) {\n return false\n }\n if (!this.#pendingToolCalls.has(executionId)) {\n return false\n }\n this.#applyExecutionResult(executionId, result)\n return true\n }\n\n #dispatchPending(): void {\n const executor = this.#config.executor\n if (!executor) {\n return\n }\n const executable = this.#config.executableTools\n const needsApproval = this.#permissionMode === 'default' && this.#config.shouldApprove\n const inFlight: Array<Promise<unknown>> = []\n let anyDeferred = false\n let anyAwaiting = false\n for (const call of Array.from(this.#pendingToolCalls.values())) {\n if (executable && !executable.includes(call.toolName)) {\n continue\n }\n if (this.#dispatched.has(call.toolCallId)) {\n continue\n }\n if (needsApproval && needsApproval({ toolName: call.toolName, input: call.input as Record<string, unknown> })) {\n if ([...this.#pendingApprovals.values()].some((a) => a.toolCallId === call.toolCallId)) {\n anyAwaiting = true\n continue\n }\n const requestId = randomUUID()\n const timeoutMs = this.#config.approvalTimeoutMs ?? 120_000\n const request: PermissionRequest = {\n id: requestId,\n toolName: call.toolName,\n input: call.input as Record<string, unknown>,\n toolUseId: call.toolCallId,\n title: `Agent wants to run ${call.toolName}`,\n displayName: call.toolName,\n expiresAt: Date.now() + timeoutMs,\n }\n const timer = setTimeout(() => {\n if (!this.#pendingApprovals.has(requestId)) {\n return\n }\n this.resolvePermission(requestId, {\n behavior: 'deny',\n message: 'Approval timed out',\n })\n }, timeoutMs)\n this.#pendingApprovals.set(requestId, { request, toolCallId: call.toolCallId, timer })\n this.#emit({ type: 'permission_requested', request })\n anyAwaiting = true\n continue\n }\n this.#dispatched.add(call.toolCallId)\n const dispatched = this.#dispatchCall(executor, call)\n anyDeferred ||= dispatched.deferred\n inFlight.push(dispatched.promise)\n }\n if (anyAwaiting) {\n this.#setStatus('awaiting_approval')\n }\n if (anyDeferred) {\n void Promise.allSettled(inFlight).then(() => this.#announceParked())\n }\n }\n\n #dispatchSingle(toolCallId: string): void {\n const executor = this.#config.executor\n if (!executor) {\n return\n }\n const call = this.#pendingToolCalls.get(toolCallId)\n if (!call || this.#dispatched.has(toolCallId)) {\n return\n }\n this.#dispatched.add(toolCallId)\n const dispatched = this.#dispatchCall(executor, call)\n if (dispatched.deferred) {\n void dispatched.promise.then(() => this.#announceParked())\n }\n }\n\n #dispatchCall(executor: ToolExecutor, call: PendingToolCall): { deferred: boolean; promise: Promise<void> } {\n const toolCall: ToolExecutionCall = {\n executionId: call.toolCallId,\n sessionId: this.id,\n tool: call.toolName,\n input: call.input,\n vfs: this.#config.vfs,\n limits: this.#config.executionLimits,\n signal: this.#abort?.signal,\n }\n const profile = executor.describe?.(toolCall) ?? {}\n call.deferred = profile.deferred === true ? true : undefined\n call.expiresAt = profile.timeoutMs === undefined ? undefined : Date.now() + profile.timeoutMs\n this.#emit({\n type: 'execution_dispatched',\n executionId: call.toolCallId,\n toolName: call.toolName,\n backend: profile.backend ?? this.#config.executionBackend ?? 'server',\n deferred: call.deferred,\n expiresAt: call.expiresAt,\n })\n const promise = executor\n .dispatch(toolCall)\n .then((dispatch) => {\n // 'pending' means the result arrives later, through settleExecution().\n if (dispatch.status === 'settled') {\n this.#applyExecutionResult(call.toolCallId, dispatch.result)\n }\n })\n .catch((error: unknown) => {\n this.#applyExecutionResult(call.toolCallId, {\n status: 'failed',\n reason: 'dispatch_error',\n error: error instanceof Error ? error.message : String(error),\n })\n })\n return { deferred: call.deferred === true, promise }\n }\n\n #announceParked(): void {\n if (this.#closed || this.#parked || this.#abort) {\n return\n }\n if (this.#restingOnDeferred()) {\n this.#setStatus('parked')\n }\n }\n\n #restingOnDeferred(): boolean {\n if (this.#pendingToolCalls.size === 0) {\n return false\n }\n for (const call of this.#pendingToolCalls.values()) {\n if (call.deferred !== true) {\n return false\n }\n }\n return true\n }\n\n #applyExecutionResult(executionId: string, result: ToolExecutionResult): void {\n // A parked instance is not the session any more: its rehydrated successor owns the pending\n // call, and applying here would write into a discarded history.\n if (this.#closed || this.#parked) {\n return\n }\n this.#dispatched.delete(executionId)\n if (result.status === 'ok') {\n this.#emit({\n type: 'execution_result',\n executionId,\n output: { type: 'json', value: result.output },\n logs: result.logs,\n })\n this.resolveToolCall(executionId, { type: 'json', value: result.output })\n return\n }\n this.#emit({\n type: 'execution_failed',\n executionId,\n reason: result.reason,\n error: result.error,\n logs: result.logs,\n })\n this.resolveToolCall(executionId, { type: 'text', value: `${result.reason}: ${result.error}` }, { isError: true })\n }\n\n async #runTurn(): Promise<void> {\n if (this.#closed || this.#parked || this.#pendingToolCalls.size > 0) {\n return\n }\n if (this.#messages.at(-1)?.role === 'assistant') {\n return\n }\n this.#setStatus('running')\n const agent = new ToolLoopAgent({\n model: this.#model,\n tools: this.#config.tools ?? {},\n instructions: this.#config.instructions,\n stopWhen: isStepCount(this.#config.maxSteps ?? 20),\n })\n const abort = new AbortController()\n this.#abort = abort\n const accum = (this.#turnAccum ??= {\n startedAt: Date.now(),\n input: 0,\n output: 0,\n cacheWrite: 0,\n cacheRead: 0,\n })\n let blocks: ContentBlock[] = []\n const textBuf = new Map<string, string>()\n const reasoningBuf = new Map<string, string>()\n const flush = (): void => {\n if (blocks.length === 0) {\n return\n }\n this.#emit({\n type: 'assistant_message',\n message: { role: 'assistant', content: blocks, model: this.#modelId() },\n parentToolUseId: null,\n uuid: randomUUID(),\n })\n blocks = []\n }\n try {\n const result = await agent.stream({\n messages: [...this.#messages],\n abortSignal: abort.signal,\n })\n const partials = this.#config.includePartialMessages !== false\n const emitToolResult = (toolCallId: string, content: string, isError?: boolean): void => {\n flush()\n this.#emit({\n type: 'user_message',\n message: {\n role: 'user',\n content: [{ type: 'tool_result', tool_use_id: toolCallId, content, is_error: isError }],\n },\n parentToolUseId: null,\n synthetic: true,\n uuid: randomUUID(),\n })\n }\n let streamError: unknown\n for await (const part of result.fullStream) {\n if (this.#closed) {\n break\n }\n switch (part.type) {\n case 'text-delta': {\n textBuf.set(part.id, (textBuf.get(part.id) ?? '') + part.text)\n if (partials) {\n this.#emit({\n type: 'stream_delta',\n event: { type: 'content_block_delta', delta: { type: 'text_delta', text: part.text } },\n parentToolUseId: null,\n uuid: randomUUID(),\n })\n }\n break\n }\n case 'text-end': {\n const text = textBuf.get(part.id)\n textBuf.delete(part.id)\n if (text) {\n blocks.push({ type: 'text', text })\n }\n break\n }\n case 'reasoning-delta': {\n reasoningBuf.set(part.id, (reasoningBuf.get(part.id) ?? '') + part.text)\n if (partials) {\n this.#emit({\n type: 'stream_delta',\n event: { type: 'content_block_delta', delta: { type: 'thinking_delta', thinking: part.text } },\n parentToolUseId: null,\n uuid: randomUUID(),\n })\n }\n break\n }\n case 'reasoning-end': {\n const thinking = reasoningBuf.get(part.id)\n reasoningBuf.delete(part.id)\n if (thinking) {\n blocks.push({ type: 'thinking', thinking })\n }\n break\n }\n case 'tool-call': {\n blocks.push({\n type: 'tool_use',\n id: part.toolCallId,\n name: part.toolName,\n input: part.input,\n })\n flush()\n break\n }\n case 'tool-result': {\n emitToolResult(part.toolCallId, typeof part.output === 'string' ? part.output : JSON.stringify(part.output))\n break\n }\n case 'tool-error': {\n emitToolResult(part.toolCallId, errorText(part.error), true)\n break\n }\n case 'finish-step': {\n flush()\n break\n }\n case 'error': {\n streamError ??= part.error\n break\n }\n default: {\n break\n }\n }\n }\n flush()\n if (streamError !== undefined) {\n throw streamError\n }\n if (abort.signal.aborted) {\n throw new Error('interrupted')\n }\n const [responseMessages, usage, toolCalls, text] = await Promise.all([\n result.responseMessages,\n result.totalUsage,\n result.toolCalls,\n result.text,\n ])\n if (this.#closed) {\n return\n }\n accum.input += usage.inputTokens ?? 0\n accum.output += usage.outputTokens ?? 0\n accum.cacheWrite += usage.inputTokenDetails?.cacheWriteTokens ?? 0\n accum.cacheRead += usage.inputTokenDetails?.cacheReadTokens ?? 0\n this.#messages.push(...(responseMessages as ModelMessage[]))\n const settled = new Set<string>()\n for (const message of responseMessages as ModelMessage[]) {\n if (message.role !== 'tool' || !Array.isArray(message.content)) {\n continue\n }\n for (const part of message.content) {\n if (part.type === 'tool-result') {\n settled.add(part.toolCallId)\n }\n }\n }\n for (const call of toolCalls) {\n if (settled.has(call.toolCallId)) {\n continue\n }\n this.#pendingToolCalls.set(call.toolCallId, {\n toolCallId: call.toolCallId,\n toolName: call.toolName,\n input: call.input,\n })\n }\n if (this.#pendingToolCalls.size > 0) {\n this.#dispatchPending()\n return\n }\n this.#finishTurn(text)\n } catch (error) {\n if (this.#closed) {\n return\n }\n for (const [, thinking] of reasoningBuf) {\n if (thinking) {\n blocks.push({ type: 'thinking', thinking })\n }\n }\n for (const [, text] of textBuf) {\n if (text) {\n blocks.push({ type: 'text', text })\n }\n }\n flush()\n const message = error instanceof Error ? error.message : String(error)\n this.#numTurns += 1\n this.#emit({\n type: 'turn_result',\n subtype: 'error_during_execution',\n isError: true,\n durationMs: Date.now() - accum.startedAt,\n numTurns: this.#numTurns,\n totalCostUsd: 0,\n errors: [abort.signal.aborted ? 'interrupted' : message],\n usage: turnUsage(accum),\n })\n this.#turnAccum = undefined\n this.#setStatus('idle')\n } finally {\n if (this.#abort === abort) {\n this.#abort = undefined\n }\n }\n }\n\n #finishTurn(text: string): void {\n const accum = this.#turnAccum ?? { startedAt: Date.now(), input: 0, output: 0, cacheWrite: 0, cacheRead: 0 }\n this.#numTurns += 1\n this.#totalUsage.input += accum.input\n this.#totalUsage.output += accum.output\n this.#totalUsage.cacheWrite += accum.cacheWrite\n this.#totalUsage.cacheRead += accum.cacheRead\n this.#emit({\n type: 'turn_result',\n subtype: 'success',\n isError: false,\n durationMs: Date.now() - accum.startedAt,\n numTurns: this.#numTurns,\n totalCostUsd: 0,\n result: text,\n usage: turnUsage(accum),\n })\n this.#turnAccum = undefined\n this.#setStatus('idle')\n }\n\n #modelId(): string | undefined {\n const model = this.#model\n if (typeof model === 'string') {\n return model\n }\n return (model as { modelId?: string }).modelId\n }\n\n async mcpServers(): Promise<McpServerStatusInfo[] | undefined> {\n return (await this.#config.reportMcpServers?.()) ?? []\n }\n\n setTitle(title: string | undefined): void {\n this.#config = withTitle(this.#config, title)\n }\n\n #setStatus(status: SessionStatus, detail?: string): void {\n // Deduped on the (status, detail) pair: deduping on status alone would swallow a new detail\n // for an unchanged status, which is the one update a detail exists to carry.\n if (this.#status === status && this.#statusDetail === detail) {\n return\n }\n if (this.#status === 'closed' || this.#status === 'failed') {\n return\n }\n this.#status = status\n this.#statusDetail = detail\n this.#emit({ type: 'status_changed', status, detail })\n }\n\n #emit(body: SessionEventBody): void {\n this.#subscribers.emit(this.#log.append(body))\n }\n}\n\nfunction turnUsage(accum: { input: number; output: number; cacheWrite: number; cacheRead: number }) {\n return {\n input_tokens: accum.input,\n output_tokens: accum.output,\n cache_creation_input_tokens: accum.cacheWrite,\n cache_read_input_tokens: accum.cacheRead,\n }\n}\n\nfunction textValue(output: ToolCallOutput): string {\n return output.type === 'text' ? output.value : JSON.stringify(output.value)\n}\n\nfunction errorText(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n","import { execFile } from 'node:child_process'\nimport { existsSync } from 'node:fs'\nimport { createRequire } from 'node:module'\n\nexport type ClaudeAuthStatus = 'logged_in' | 'logged_out' | 'unknown'\n\nexport type ClaudeAuthProbe = (env: Record<string, string | undefined>) => Promise<ClaudeAuthStatus>\n\nexport function resolveBundledClaudeExecutable(): string | undefined {\n try {\n // Two hops: the platform package is a dependency of the SDK, not of this one, so under\n // pnpm's strict layout it resolves only from the SDK's own location.\n const fromHere = createRequire(import.meta.url)\n const fromSdk = createRequire(fromHere.resolve('@anthropic-ai/claude-agent-sdk'))\n const suffix = process.platform === 'win32' ? '.exe' : ''\n const platforms =\n process.platform === 'linux' ? [`linux-${process.arch}`, `linux-${process.arch}-musl`] : [`${process.platform}-${process.arch}`]\n for (const platform of platforms) {\n try {\n const path = fromSdk.resolve(`@anthropic-ai/claude-agent-sdk-${platform}/claude${suffix}`)\n if (existsSync(path)) {\n return path\n }\n } catch {}\n }\n } catch {}\n return undefined\n}\n\nexport function checkClaudeAuth(\n env: Record<string, string | undefined>,\n options: { executable?: string; timeoutMs?: number } = {},\n): Promise<ClaudeAuthStatus> {\n const executable = options.executable ?? resolveBundledClaudeExecutable()\n if (!executable) {\n return Promise.resolve('unknown')\n }\n return new Promise((resolve) => {\n execFile(\n executable,\n ['auth', 'status'],\n { env: env as NodeJS.ProcessEnv, timeout: options.timeoutMs ?? 10_000 },\n // The exit code is ignored on purpose: 2.1.217 exits 1 on a logged-out verdict where\n // other versions exit 0, so only the parsed `loggedIn` boolean is a verdict.\n (_error, stdout) => {\n try {\n const parsed = JSON.parse(stdout) as { loggedIn?: unknown }\n if (typeof parsed.loggedIn === 'boolean') {\n resolve(parsed.loggedIn ? 'logged_in' : 'logged_out')\n return\n }\n } catch {}\n resolve('unknown')\n },\n )\n })\n}\n","import { runScript, type SandboxEngine } from '@workerdeck/sandbox'\nimport type { ToolExecutionCall, ToolExecutionDispatch, ToolExecutionResult, ToolExecutor } from './tool-executor.ts'\n\nexport type HostFetch = (url: string, signal: AbortSignal) => Promise<string>\n\nexport type QuickJsExecutorOptions = {\n engine: SandboxEngine\n // Matched host-side: the guest is never told the allowlist and never holds a credential.\n allowedHosts?: string[]\n hostFetch?: HostFetch\n // The guest's interrupt deadline does not cover host-function time, so every granted\n // capability needs its own bound. Default 10000.\n fetchTimeoutMs?: number\n defaultTimeoutMs?: number\n defaultMemoryLimitBytes?: number\n}\n\ntype EvalScriptInput = { script?: unknown }\n\nexport class QuickJsExecutor implements ToolExecutor {\n #options: QuickJsExecutorOptions\n\n constructor(options: QuickJsExecutorOptions) {\n this.#options = options\n }\n\n async dispatch(call: ToolExecutionCall): Promise<ToolExecutionDispatch> {\n return {\n executionId: call.executionId,\n status: 'settled',\n result: await this.#execute(call),\n }\n }\n\n async #execute(call: ToolExecutionCall): Promise<ToolExecutionResult> {\n if (call.tool !== 'eval_script') {\n return {\n status: 'failed',\n reason: 'unsupported_tool',\n error: `tool '${call.tool}' is not executable by the QuickJS backend`,\n }\n }\n const script = (call.input as EvalScriptInput | undefined)?.script\n if (typeof script !== 'string') {\n return {\n status: 'failed',\n reason: 'invalid_input',\n error: 'eval_script requires a string `script` input',\n }\n }\n const result = await runScript(this.#options.engine, {\n script,\n vfs: call.vfs,\n signal: call.signal,\n timeoutMs: call.limits?.timeoutMs ?? this.#options.defaultTimeoutMs ?? 5000,\n memoryLimitBytes: call.limits?.memoryLimitBytes ?? this.#options.defaultMemoryLimitBytes ?? 64 * 1024 * 1024,\n fetchText: this.#allowsNetwork() ? (url) => this.#fetchText(url, call.signal) : undefined,\n })\n const logs = result.logs.map((l) => `[${l.level}] ${l.text}`)\n return result.ok ? { status: 'ok', output: result.value, logs } : { status: 'failed', reason: result.reason, error: result.error, logs }\n }\n\n #allowsNetwork(): boolean {\n return (this.#options.allowedHosts?.length ?? 0) > 0\n }\n\n async #fetchText(url: string, outer: AbortSignal | undefined): Promise<string> {\n if (!isHostAllowed(url, this.#options.allowedHosts ?? [])) {\n throw new Error(`host not allowed: ${safeHost(url) ?? url}`)\n }\n const controller = new AbortController()\n const onOuterAbort = () => controller.abort()\n outer?.addEventListener('abort', onOuterAbort)\n const timer = setTimeout(() => controller.abort(), this.#options.fetchTimeoutMs ?? 10_000)\n try {\n const fetchImpl = this.#options.hostFetch ?? defaultHostFetch\n return await fetchImpl(url, controller.signal)\n } finally {\n clearTimeout(timer)\n outer?.removeEventListener('abort', onOuterAbort)\n }\n }\n}\n\nasync function defaultHostFetch(url: string, signal: AbortSignal): Promise<string> {\n const response = await fetch(url, { signal })\n if (!response.ok) {\n throw new Error(`request failed: ${response.status}`)\n }\n return await response.text()\n}\n\nfunction safeHost(url: string): string | undefined {\n try {\n return new URL(url).hostname\n } catch {\n return undefined\n }\n}\n\nexport function isHostAllowed(url: string, allowedHosts: string[]): boolean {\n let parsed: URL\n try {\n parsed = new URL(url)\n } catch {\n return false\n }\n if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') {\n return false\n }\n const host = parsed.hostname.toLowerCase()\n return allowedHosts.some((entry) => {\n const pattern = entry.trim().toLowerCase()\n if (!pattern) {\n return false\n }\n if (pattern.startsWith('*.')) {\n return host.endsWith(pattern.slice(1))\n }\n return host === pattern\n })\n}\n","export type PendingKind = 'approval' | 'tool_call' | 'execution'\n\nexport type SettledBy = 'client' | 'timeout' | 'policy' | 'server'\n\nexport type PendingOutcome<T> =\n | { ok: true; value: T; settledBy: SettledBy }\n | { ok: false; reason: string; error: string; settledBy: SettledBy }\n\nexport type PendingEntry = {\n id: string\n kind: PendingKind\n createdAt: number\n expiresAt?: number\n meta?: Record<string, unknown>\n}\n\ntype Slot<T> = PendingEntry & {\n resolve: (outcome: PendingOutcome<T>) => void\n timer?: ReturnType<typeof setTimeout>\n}\n\nexport type RegisterOptions<T> = {\n id: string\n kind: PendingKind\n timeoutMs?: number\n meta?: Record<string, unknown>\n onSettle?: (outcome: PendingOutcome<T>, entry: PendingEntry) => void\n}\n\nexport class PendingRequestRegistry {\n #slots = new Map<string, Slot<unknown>>()\n\n get size(): number {\n return this.#slots.size\n }\n\n // The outcome promise never rejects: a timeout or cancellation resolves `ok: false`, so a\n // caller feeds the failure back into the agent loop instead of unwinding it.\n register<T>(options: RegisterOptions<T>): Promise<PendingOutcome<T>> {\n if (this.#slots.has(options.id)) {\n throw new Error(`pending request '${options.id}' is already registered`)\n }\n const entry: PendingEntry = {\n id: options.id,\n kind: options.kind,\n createdAt: Date.now(),\n expiresAt: options.timeoutMs === undefined ? undefined : Date.now() + options.timeoutMs,\n meta: options.meta,\n }\n return new Promise<PendingOutcome<T>>((resolve) => {\n const slot: Slot<T> = {\n ...entry,\n resolve: (outcome) => {\n options.onSettle?.(outcome, entry)\n resolve(outcome)\n },\n }\n if (options.timeoutMs !== undefined) {\n slot.timer = setTimeout(() => {\n this.#settle(options.id, {\n ok: false,\n reason: 'timeout',\n error: `request timed out after ${options.timeoutMs}ms`,\n settledBy: 'timeout',\n })\n }, options.timeoutMs)\n slot.timer.unref?.()\n }\n this.#slots.set(options.id, slot as Slot<unknown>)\n })\n }\n\n settle<T>(id: string, value: T, settledBy: SettledBy = 'client'): boolean {\n return this.#settle(id, { ok: true, value, settledBy })\n }\n\n fail(id: string, reason: string, error: string, settledBy: SettledBy = 'server'): boolean {\n return this.#settle(id, { ok: false, reason, error, settledBy })\n }\n\n has(id: string): boolean {\n return this.#slots.has(id)\n }\n\n get(id: string): PendingEntry | undefined {\n const slot = this.#slots.get(id)\n return slot && toEntry(slot)\n }\n\n list(kind?: PendingKind): PendingEntry[] {\n const entries = [...this.#slots.values()].map(toEntry)\n return kind ? entries.filter((e) => e.kind === kind) : entries\n }\n\n cancelAll(reason: string, error: string, kind?: PendingKind): number {\n let canceled = 0\n // Snapshot first: settling mutates the map being iterated.\n for (const slot of Array.from(this.#slots.values())) {\n if (kind && slot.kind !== kind) {\n continue\n }\n if (this.#settle(slot.id, { ok: false, reason, error, settledBy: 'server' })) {\n canceled += 1\n }\n }\n return canceled\n }\n\n #settle(id: string, outcome: PendingOutcome<unknown>): boolean {\n const slot = this.#slots.get(id)\n if (!slot) {\n return false\n }\n clearTimeout(slot.timer)\n this.#slots.delete(id)\n slot.resolve(outcome)\n return true\n }\n}\n\nfunction toEntry(slot: Slot<unknown>): PendingEntry {\n return {\n id: slot.id,\n kind: slot.kind,\n createdAt: slot.createdAt,\n expiresAt: slot.expiresAt,\n meta: slot.meta,\n }\n}\n","import type { ToolCallRequestFrame, ToolExecutionOutput } from '@workerdeck/protocol'\nimport { PendingRequestRegistry, type PendingOutcome } from '../lib/pending-registry.ts'\nimport type { ToolExecutionCall, ToolExecutionDispatch, ToolExecutionResult, ToolExecutor } from './tool-executor.ts'\n\nexport type BridgeAnswer = { output: ToolExecutionOutput; logs?: string[] } | { reason: string; error: string; logs?: string[] }\n\nexport type BrowserBridgeExecutorOptions = {\n send: (frame: ToolCallRequestFrame) => boolean\n cancel?: (executionId: string, reason: string) => void\n timeoutMs?: number\n onResult?: (executionId: string, result: ToolExecutionResult) => void\n registry?: PendingRequestRegistry\n}\n\nexport class BrowserBridgeExecutor implements ToolExecutor {\n readonly registry: PendingRequestRegistry\n #options: BrowserBridgeExecutorOptions\n // A client answer can beat its own registration; held briefly here or it is dropped.\n #early = new Map<string, BridgeAnswer>()\n\n constructor(options: BrowserBridgeExecutorOptions) {\n this.#options = options\n this.registry = options.registry ?? new PendingRequestRegistry()\n }\n\n async dispatch(call: ToolExecutionCall): Promise<ToolExecutionDispatch> {\n const timeoutMs = call.limits?.timeoutMs ?? this.#options.timeoutMs ?? 60_000\n const expiresAt = Date.now() + timeoutMs\n const frame: ToolCallRequestFrame = {\n type: 'tool_call_request',\n executionId: call.executionId,\n toolName: call.tool,\n input: call.input,\n vfsSeed: call.vfs?.snapshot(),\n limits: call.limits,\n expiresAt,\n }\n\n const settled = this.registry.register<BridgeAnswer>({\n id: call.executionId,\n kind: 'tool_call',\n timeoutMs,\n meta: { toolName: call.tool, sessionId: call.sessionId },\n })\n\n if (!this.#options.send(frame)) {\n this.registry.fail(call.executionId, 'no_client', 'no client is attached to execute this call')\n return {\n executionId: call.executionId,\n status: 'settled',\n result: toExecutionResult(await settled),\n }\n }\n\n const early = this.#early.get(call.executionId)\n if (early) {\n this.#early.delete(call.executionId)\n this.#applyAnswer(call.executionId, early)\n }\n\n // Only fail here: the settle handler owns the cancel, so a non-client failure notifies\n // the client exactly once.\n const onAbort = () => {\n this.registry.fail(call.executionId, 'aborted', 'the turn was interrupted')\n }\n call.signal?.addEventListener('abort', onAbort, { once: true })\n void settled.then((outcome) => {\n call.signal?.removeEventListener('abort', onAbort)\n if (!outcome.ok && outcome.settledBy !== 'client') {\n this.#options.cancel?.(call.executionId, outcome.reason)\n }\n this.#options.onResult?.(call.executionId, toExecutionResult(outcome))\n })\n\n return { executionId: call.executionId, status: 'pending' }\n }\n\n resolve(executionId: string, answer: BridgeAnswer): boolean {\n if (!this.registry.has(executionId)) {\n // Racing a dispatch still in flight; hold it for the drain above.\n this.#early.set(executionId, answer)\n setTimeout(() => this.#early.delete(executionId), 5000).unref?.()\n return false\n }\n return this.#applyAnswer(executionId, answer)\n }\n\n #applyAnswer(executionId: string, answer: BridgeAnswer): boolean {\n return 'output' in answer\n ? this.registry.settle(executionId, answer, 'client')\n : this.registry.fail(executionId, answer.reason, answer.error, 'client')\n }\n}\n\nexport function toExecutionResult(outcome: PendingOutcome<BridgeAnswer>): ToolExecutionResult {\n if (outcome.ok && 'output' in outcome.value) {\n const { output, logs } = outcome.value\n return { status: 'ok', output: output.value, logs }\n }\n if (outcome.ok) {\n const failure = outcome.value as { reason: string; error: string; logs?: string[] }\n return { status: 'failed', reason: failure.reason, error: failure.error, logs: failure.logs }\n }\n return { status: 'failed', reason: outcome.reason, error: outcome.error }\n}\n","import type { ToolExecutionBackend } from '@workerdeck/protocol'\nimport type { ToolExecutionCall, ToolExecutionDispatch, ToolExecutionProfile, ToolExecutor } from './tool-executor.ts'\n\nexport type DeferredDispatch = {\n executionId: string\n sessionId: string\n tool: string\n input: unknown\n vfsSeed?: Record<string, string>\n limits?: { timeoutMs?: number; memoryLimitBytes?: number }\n expiresAt?: number\n}\n\nexport type DeferredExecutorOptions = {\n onDispatch: (call: DeferredDispatch) => void | Promise<void>\n timeoutMs?: number\n backend?: ToolExecutionBackend\n}\n\nexport class DeferredExecutor implements ToolExecutor {\n readonly backend: ToolExecutionBackend\n readonly timeoutMs: number | undefined\n #options: DeferredExecutorOptions\n\n constructor(options: DeferredExecutorOptions) {\n this.#options = options\n this.backend = options.backend ?? 'remote'\n this.timeoutMs = options.timeoutMs\n }\n\n describe(): ToolExecutionProfile {\n return { backend: this.backend, deferred: true, timeoutMs: this.timeoutMs }\n }\n\n async dispatch(call: ToolExecutionCall): Promise<ToolExecutionDispatch> {\n await this.#options.onDispatch({\n executionId: call.executionId,\n sessionId: call.sessionId,\n tool: call.tool,\n input: call.input,\n vfsSeed: call.vfs?.snapshot(),\n limits: call.limits,\n expiresAt: this.timeoutMs === undefined ? undefined : Date.now() + this.timeoutMs,\n })\n return { executionId: call.executionId, status: 'pending' }\n }\n}\n","import { tool, type Tool, type ToolSet } from 'ai'\nimport { z } from 'zod'\nimport { createVfs, type SandboxVfs } from '@workerdeck/sandbox'\nimport type { ToolExecutionResult, ToolExecutor } from '../../executors/tool-executor.ts'\nimport type { WebFetchFn } from './web-fetch.ts'\n\nexport type ToolTrust = 'sandboxed' | 'authoritative'\n\nexport type ToolDefinition = {\n name: string\n trust: ToolTrust\n tool: Tool\n}\n\nexport type ToolContextOptions = {\n executor: ToolExecutor\n sessionId: string\n vfs?: SandboxVfs\n search?: (query: string, limit: number) => Promise<Array<{ title: string; url: string; snippet?: string }>>\n download?: (url: string) => Promise<{ contentType?: string; text: string }>\n webFetch?: WebFetchFn\n onFileDelivered?: (file: { path: string; bytes: number; description?: string }) => void\n limits?: { timeoutMs?: number; memoryLimitBytes?: number }\n onDispatch?: (executionId: string, toolName: string) => void\n onSettle?: (executionId: string, result: ToolExecutionResult) => void\n}\n\nexport type ToolContext = {\n vfs: SandboxVfs\n tools: ToolSet\n definitions: ToolDefinition[]\n sandboxedToolNames: string[]\n}\n\nconst MAX_FILE_BYTES = 1024 * 1024\n\nexport function createToolContext(options: ToolContextOptions): ToolContext {\n const vfs = options.vfs ?? createVfs()\n const definitions: ToolDefinition[] = []\n\n definitions.push({\n name: 'fs_list',\n trust: 'authoritative',\n tool: tool({\n description: 'List files in the scratch filesystem.',\n inputSchema: z.object({ dir: z.string().default('/').describe('Directory to list') }),\n execute: async ({ dir }) => ({ files: vfs.list(dir) }),\n }),\n })\n definitions.push({\n name: 'fs_read',\n trust: 'authoritative',\n tool: tool({\n description: 'Read a file from the scratch filesystem.',\n inputSchema: z.object({ path: z.string() }),\n execute: async ({ path }) => {\n const content = vfs.read(path)\n if (content === undefined) {\n return { error: `no such file: ${path}` }\n }\n return { content: truncate(content) }\n },\n }),\n })\n definitions.push({\n name: 'fs_write',\n trust: 'authoritative',\n tool: tool({\n description: 'Write a file to the scratch filesystem.',\n inputSchema: z.object({ path: z.string(), content: z.string() }),\n execute: async ({ path, content }) => {\n vfs.write(path, content)\n return { path, bytes: content.length }\n },\n }),\n })\n\n if (options.onFileDelivered) {\n const onFileDelivered = options.onFileDelivered\n definitions.push({\n name: 'deliver_file',\n trust: 'authoritative',\n tool: tool({\n description:\n 'Hand a file from the scratch filesystem over to the user as a deliverable. Write it with fs_write first, then deliver it.',\n inputSchema: z.object({\n path: z.string().describe('Path of an existing file in the scratch filesystem'),\n description: z.string().optional().describe('What this file is, for the recipient'),\n }),\n execute: async ({ path, description }) => {\n const content = vfs.read(path)\n if (content === undefined) {\n return { error: `no such file: ${path}` }\n }\n const file = { path, bytes: content.length, description }\n onFileDelivered(file)\n return { delivered: true, ...file }\n },\n }),\n })\n }\n\n if (options.search) {\n const search = options.search\n definitions.push({\n name: 'web_search',\n trust: 'authoritative',\n tool: tool({\n description: 'Search the web for pages relevant to a query.',\n inputSchema: z.object({\n query: z.string(),\n limit: z.number().int().min(1).max(25).default(5),\n }),\n execute: async ({ query, limit }) => ({ results: await search(query, limit) }),\n }),\n })\n }\n if (options.download) {\n const download = options.download\n definitions.push({\n name: 'download',\n trust: 'authoritative',\n tool: tool({\n description: 'Fetch a URL and store its text in the scratch filesystem for later evaluation.',\n inputSchema: z.object({\n url: z.string().describe('Absolute http(s) URL'),\n path: z.string().describe('Where to store it in the scratch filesystem'),\n }),\n execute: async ({ url, path }) => {\n try {\n const { text, contentType } = await download(url)\n const stored = truncate(text)\n vfs.write(path, stored)\n return { path, bytes: stored.length, contentType }\n } catch (error) {\n // A failed fetch is data the agent can react to, not a turn-ending throw.\n return { error: error instanceof Error ? error.message : String(error) }\n }\n },\n }),\n })\n }\n\n if (options.webFetch) {\n const webFetch = options.webFetch\n definitions.push({\n name: 'web_fetch',\n trust: 'authoritative',\n tool: tool({\n description:\n 'Fetch a web page and process its content against a prompt. Returns the answer ' +\n '(or the page as markdown). Distinct from download: use web_fetch to answer a ' +\n 'question about a page, download to store raw text for eval_script.',\n inputSchema: z.object({\n url: z.string().describe('Absolute http(s) URL'),\n prompt: z.string().describe('What to extract or answer from the page'),\n }),\n execute: async ({ url, prompt }) => {\n try {\n return await webFetch(url, prompt)\n } catch (error) {\n // A failed fetch is data the agent can react to, not a turn-ending throw.\n return { error: error instanceof Error ? error.message : String(error) }\n }\n },\n }),\n })\n }\n\n definitions.push({\n name: 'eval_script',\n trust: 'sandboxed',\n tool: tool({\n description:\n 'Evaluate a JavaScript snippet in a sandbox to parse, score, or extract from files. ' +\n 'Globals: vfs.read(path), vfs.write(path, text), vfs.list(dir), console.log. ' +\n 'The value of the last expression is returned. No network or host access.',\n inputSchema: z.object({ script: z.string() }),\n }),\n })\n\n const tools: ToolSet = {}\n for (const definition of definitions) {\n tools[definition.name] = definition.tool\n }\n\n return {\n vfs,\n tools,\n definitions,\n sandboxedToolNames: definitions.filter((d) => d.trust === 'sandboxed').map((d) => d.name),\n }\n}\n\nexport function withMcpTools(context: ToolContext, mcpTools: ToolSet): ToolContext {\n return withHostTools(\n context,\n Object.fromEntries(Object.entries(mcpTools).map(([name, mcpTool]) => [name, { tool: mcpTool, trust: 'authoritative' as const }])),\n 'MCP tool',\n )\n}\n\nexport type HostToolDefinition = {\n tool: Tool\n trust: ToolTrust\n}\n\nexport function withHostTools(context: ToolContext, hostTools: Record<string, HostToolDefinition>, kind = 'host tool'): ToolContext {\n const entries = Object.entries(hostTools)\n if (entries.length === 0) {\n return context\n }\n const definitions = [...context.definitions]\n const tools: ToolSet = { ...context.tools }\n const sandboxedToolNames = [...context.sandboxedToolNames]\n for (const [name, { tool: hostTool, trust }] of entries) {\n if (name in tools) {\n // A collision would let a host tool shadow `eval_script`, or an MCP name promote untrusted\n // execution to authoritative.\n throw new Error(`${kind} '${name}' collides with an existing tool of the same name`)\n }\n const executes = typeof (hostTool as { execute?: unknown }).execute === 'function'\n if (trust === 'sandboxed' && executes) {\n throw new Error(\n `${kind} '${name}' is declared sandboxed but has an \\`execute\\` — it would run in ` +\n 'this process with full authority. Drop `execute` so it rides the ToolExecutor seam.',\n )\n }\n if (trust === 'authoritative' && !executes) {\n throw new Error(\n `${kind} '${name}' is declared authoritative but has no \\`execute\\` — nothing would ` +\n 'ever answer its calls and the turn would stall.',\n )\n }\n definitions.push({ name, trust, tool: hostTool })\n tools[name] = hostTool\n if (trust === 'sandboxed') {\n sandboxedToolNames.push(name)\n }\n }\n return { ...context, tools, definitions, sandboxedToolNames }\n}\n\nfunction truncate(text: string): string {\n return text.length > MAX_FILE_BYTES ? text.slice(0, MAX_FILE_BYTES) : text\n}\n","import { lookup } from 'node:dns/promises'\n\nexport type WebFetchResult = {\n url: string\n digest?: string\n markdown?: string\n truncated?: boolean\n notice?: string\n redirectUrl?: string\n error?: string\n}\n\nexport type WebFetchFn = (url: string, prompt: string) => Promise<WebFetchResult>\n\nexport type WebFetchDigest = (markdown: string, prompt: string) => Promise<string>\n\nexport type WebFetchOptions = {\n fetchImpl?: typeof fetch\n maxContentBytes?: number\n maxMarkdownBytes?: number\n cacheTtlMs?: number\n allowedHosts?: string[]\n timeoutMs?: number\n digest?: WebFetchDigest\n}\n\nconst MAX_CACHE_ENTRIES = 64\nconst MAX_REDIRECTS = 5\n\ntype CacheEntry = { expiresAt: number; page: WebFetchResult }\n\nexport function createWebFetch(options: WebFetchOptions = {}): WebFetchFn {\n const fetchImpl = options.fetchImpl ?? fetch\n const maxContentBytes = options.maxContentBytes ?? 1024 * 1024\n const maxMarkdownBytes = options.maxMarkdownBytes ?? 50 * 1024\n const cacheTtlMs = options.cacheTtlMs ?? 15 * 60 * 1000\n const cache = new Map<string, CacheEntry>()\n\n const fetchPage = async (rawUrl: string): Promise<WebFetchResult> => {\n const cached = cache.get(rawUrl)\n if (cached && cached.expiresAt > Date.now()) {\n return cached.page\n }\n\n let url = parseUrl(rawUrl)\n if (!url) {\n return { url: rawUrl, error: 'only absolute http(s) URLs are supported' }\n }\n\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), options.timeoutMs ?? 30_000)\n try {\n let response: Response\n for (let hop = 0; ; hop++) {\n const denied = await denyReason(url, options.allowedHosts)\n if (denied) {\n return { url: url.href, error: denied }\n }\n response = await fetchImpl(url.href, {\n redirect: 'manual',\n signal: controller.signal,\n })\n if (response.status < 300 || response.status >= 400) {\n break\n }\n const location = response.headers.get('location')\n if (!location) {\n return { url: url.href, error: `redirect (${response.status}) without a location` }\n }\n const target = parseUrl(new URL(location, url).href)\n if (!target) {\n return { url: url.href, error: `redirect to unsupported URL: ${location}` }\n }\n if (target.host !== url.host) {\n return {\n url: url.href,\n redirectUrl: target.href,\n notice: `redirected to a different host (${target.host}); not followed automatically`,\n }\n }\n if (hop >= MAX_REDIRECTS) {\n return { url: url.href, error: 'too many redirects' }\n }\n url = target\n }\n if (!response.ok) {\n return { url: url.href, error: `request failed: ${response.status}` }\n }\n const declared = Number(response.headers.get('content-length') ?? '')\n if (declared > maxContentBytes) {\n return { url: url.href, error: `response too large (${declared} bytes)` }\n }\n const body = await readCapped(response, maxContentBytes)\n if (body === undefined) {\n return { url: url.href, error: `response too large (> ${maxContentBytes} bytes)` }\n }\n const contentType = response.headers.get('content-type') ?? ''\n const text = contentType.includes('html') || looksLikeHtml(body) ? htmlToMarkdown(body) : body\n const truncated = text.length > maxMarkdownBytes\n const page: WebFetchResult = {\n url: url.href,\n markdown: truncated ? text.slice(0, maxMarkdownBytes) : text,\n truncated: truncated || undefined,\n }\n if (cache.size >= MAX_CACHE_ENTRIES) {\n const oldest = cache.keys().next().value\n if (oldest !== undefined) {\n cache.delete(oldest)\n }\n }\n cache.set(rawUrl, { expiresAt: Date.now() + cacheTtlMs, page })\n return page\n } catch (error) {\n const message = controller.signal.aborted ? 'request timed out' : error instanceof Error ? error.message : String(error)\n return { url: url.href, error: message }\n } finally {\n clearTimeout(timer)\n }\n }\n\n return async (rawUrl, prompt) => {\n const page = await fetchPage(rawUrl)\n if (page.error || page.notice || !options.digest || page.markdown === undefined) {\n return page\n }\n try {\n const digest = await options.digest(page.markdown, prompt)\n return { url: page.url, digest, truncated: page.truncated }\n } catch {\n // Digest is best-effort sugar over the fetch: fall back to the markdown.\n return page\n }\n }\n}\n\nfunction parseUrl(raw: string): URL | undefined {\n try {\n const url = new URL(raw)\n return url.protocol === 'https:' || url.protocol === 'http:' ? url : undefined\n } catch {\n return undefined\n }\n}\n\n// Resolution happens here and again inside fetch — a DNS-rebinding TOCTOU this tier accepts;\n// operators who need pinning supply `fetchImpl` with a pinned agent.\nasync function denyReason(url: URL, allowedHosts: string[] | undefined): Promise<string | null> {\n const host = url.hostname.toLowerCase()\n if (allowedHosts && allowedHosts.length > 0 && !hostMatches(host, allowedHosts)) {\n return `host not allowed: ${host}`\n }\n if (host === 'localhost' || host.endsWith('.localhost')) {\n return `host not allowed: ${host}`\n }\n const literal = host.replace(/^\\[|\\]$/g, '')\n if (isPrivateAddress(literal)) {\n return `address not allowed: ${literal}`\n }\n if (/^[\\d.]+$/.test(literal) || literal.includes(':')) {\n return null\n } // public literal IP\n let addresses: Array<{ address: string }>\n try {\n addresses = await lookup(literal, { all: true })\n } catch {\n return `cannot resolve host: ${host}`\n }\n for (const { address } of addresses) {\n if (isPrivateAddress(address)) {\n return `host resolves to a private address: ${host}`\n }\n }\n return null\n}\n\nfunction hostMatches(host: string, allowedHosts: string[]): boolean {\n return allowedHosts.some((entry) => {\n const pattern = entry.trim().toLowerCase()\n if (!pattern) {\n return false\n }\n if (pattern.startsWith('*.')) {\n return host.endsWith(pattern.slice(1))\n }\n return host === pattern\n })\n}\n\nexport function isPrivateAddress(address: string): boolean {\n const ip = address.toLowerCase()\n if (ip.includes(':')) {\n if (ip === '::' || ip === '::1') {\n return true\n }\n const mapped = /^::ffff:(\\d+\\.\\d+\\.\\d+\\.\\d+)$/.exec(ip)\n if (mapped) {\n return isPrivateAddress(mapped[1]!)\n }\n return ip.startsWith('fc') || ip.startsWith('fd') || /^fe[89ab]/.test(ip)\n }\n const parts = ip.split('.').map(Number)\n if (parts.length !== 4 || parts.some((n) => Number.isNaN(n) || n < 0 || n > 255)) {\n return false\n }\n const [a, b] = parts as [number, number, number, number]\n if (a === 0 || a === 10 || a === 127) {\n return true\n }\n if (a === 100 && b! >= 64 && b! <= 127) {\n return true\n } // CGNAT\n if (a === 169 && b === 254) {\n return true\n }\n if (a === 172 && b! >= 16 && b! <= 31) {\n return true\n }\n if (a === 192 && b === 168) {\n return true\n }\n return a >= 224 // multicast + reserved\n}\n\nasync function readCapped(response: Response, maxBytes: number): Promise<string | undefined> {\n if (!response.body) {\n const text = await response.text()\n return text.length > maxBytes ? undefined : text\n }\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n let out = ''\n for (;;) {\n const { done, value } = await reader.read()\n if (done) {\n break\n }\n out += decoder.decode(value, { stream: true })\n if (out.length > maxBytes) {\n await reader.cancel().catch(() => {})\n return undefined\n }\n }\n return out + decoder.decode()\n}\n\nfunction looksLikeHtml(body: string): boolean {\n return /<(!doctype|html|head|body)[\\s>]/i.test(body.slice(0, 1024))\n}\n\nexport function htmlToMarkdown(html: string): string {\n let text = html\n .replace(/<!--[\\s\\S]*?-->/g, '')\n .replace(/<(script|style|noscript|svg|template|iframe)\\b[\\s\\S]*?<\\/\\1>/gi, '')\n .replace(/<(head)\\b[\\s\\S]*?<\\/\\1>/gi, '')\n text = text\n .replace(/<h([1-6])[^>]*>([\\s\\S]*?)<\\/h\\1>/gi, (_, level: string, body: string) => {\n return `\\n\\n${'#'.repeat(Number(level))} ${stripTags(body).trim()}\\n\\n`\n })\n .replace(/<pre[^>]*>([\\s\\S]*?)<\\/pre>/gi, (_, body: string) => {\n return `\\n\\n\\`\\`\\`\\n${decodeEntities(body.replace(/<[^>]+>/g, ''))}\\n\\`\\`\\`\\n\\n`\n })\n .replace(/<a\\s[^>]*href=[\"']([^\"']+)[\"'][^>]*>([\\s\\S]*?)<\\/a>/gi, (_, href: string, body: string) => {\n const label = stripTags(body).trim()\n if (!label || href.startsWith('#') || href.startsWith('javascript:')) {\n return label\n }\n return label === href ? label : `[${label}](${href})`\n })\n .replace(/<li[^>]*>/gi, '\\n- ')\n .replace(/<\\/(p|div|section|article|tr|table|ul|ol|blockquote|figure)>/gi, '\\n\\n')\n .replace(/<(br|hr)\\s*\\/?>/gi, '\\n')\n .replace(/<(strong|b)>([\\s\\S]*?)<\\/\\1>/gi, '**$2**')\n .replace(/<(em|i)>([\\s\\S]*?)<\\/\\1>/gi, '*$2*')\n .replace(/<code[^>]*>([\\s\\S]*?)<\\/code>/gi, '`$1`')\n text = decodeEntities(text.replace(/<[^>]+>/g, ''))\n return text\n .replace(/[ \\t]+\\n/g, '\\n')\n .replace(/\\n{3,}/g, '\\n\\n')\n .replace(/[ \\t]{2,}/g, ' ')\n .trim()\n}\n\nfunction stripTags(html: string): string {\n return decodeEntities(html.replace(/<[^>]+>/g, ''))\n}\n\nfunction decodeEntities(text: string): string {\n return text\n .replace(/&#(\\d+);/g, (_, code: string) => String.fromCodePoint(Number(code)))\n .replace(/&#x([\\da-f]+);/gi, (_, code: string) => String.fromCodePoint(parseInt(code, 16)))\n .replace(/ /g, ' ')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/"/g, '\"')\n .replace(/'|'/g, \"'\")\n .replace(/&/g, '&')\n}\n","import type { LanguageModel, ToolSet } from 'ai'\nimport type { McpServerConfigWire, McpServerStatusInfo, McpServerToolInfo, ProfileInfo, SessionCapability } from '@workerdeck/protocol'\nimport { createVfs } from '@workerdeck/sandbox'\nimport { AiSdkRunner, type AiSdkRunnerConfig } from './runner.ts'\nimport { createToolContext, withHostTools, withMcpTools, type HostToolDefinition, type ToolContextOptions } from './tools.ts'\nimport type { ToolExecutionCall, ToolExecutionProfile, ToolExecutor } from '../../executors/tool-executor.ts'\nimport { createWebFetch, type WebFetchFn, type WebFetchOptions } from './web-fetch.ts'\n\nexport type EngineSessionOptions = {\n config: AiSdkRunnerConfig\n profile?: ProfileInfo\n resolveModel: (profile: ProfileInfo | undefined, config: AiSdkRunnerConfig) => LanguageModel\n selectExecutor: (() => ToolExecutor) | ((call: ToolExecutionCall) => ToolExecutor)\n backend?: 'server' | 'browser' | 'managed' | 'remote' | ((call: ToolExecutionCall) => 'server' | 'browser' | 'managed' | 'remote')\n capabilities?: {\n search?: ToolContextOptions['search']\n download?: ToolContextOptions['download']\n webFetch?: WebFetchFn | (Omit<WebFetchOptions, 'digest'> & { digest?: WebFetchOptions['digest'] | false })\n deliverFiles?: boolean\n }\n mcp?: McpConnection\n mcpTools?: ToolSet\n tools?: Record<string, HostToolDefinition>\n instructions?: string\n executionLimits?: { timeoutMs?: number; memoryLimitBytes?: number }\n shouldApprove?: (call: { toolName: string; input: unknown }) => boolean\n approvalTimeoutMs?: number\n seedVfs?: Record<string, string>\n id?: string\n}\n\nconst CAPABILITY_TOOLS = {\n search: 'web_search',\n download: 'download',\n webFetch: 'web_fetch',\n deliverFiles: 'deliver_file',\n} as const satisfies Record<string, SessionCapability>\n\nexport function createEngineSession(options: EngineSessionOptions): AiSdkRunner {\n const vfs = options.config.vfs ?? createVfs(options.config.restore ? options.config.restore.vfs : options.seedVfs)\n // The selector's arity picks the form: 0-arg selects once, 1-arg routes per call.\n const isPerCall = options.selectExecutor.length > 0\n const executor: ToolExecutor = isPerCall\n ? {\n describe(call: ToolExecutionCall): ToolExecutionProfile {\n const target = (options.selectExecutor as (call: ToolExecutionCall) => ToolExecutor)(call)\n const backend = typeof options.backend === 'function' ? options.backend(call) : options.backend\n return { ...target.describe?.(call), ...(backend ? { backend } : {}) }\n },\n dispatch(call: ToolExecutionCall) {\n const target = (options.selectExecutor as (call: ToolExecutionCall) => ToolExecutor)(call)\n return target.dispatch(call)\n },\n }\n : (options.selectExecutor as () => ToolExecutor)()\n // The request value wins only because the gateway already 400s a request that widens the\n // profile's grants; a host calling this directly owes that check itself.\n const granted = options.config.capabilities ?? options.profile?.session?.capabilities\n const isGranted = (key: keyof typeof CAPABILITY_TOOLS): boolean => granted === undefined || granted.includes(CAPABILITY_TOOLS[key])\n // The runner does not exist yet while the tools are built; the capabilities below reach back\n // into it lazily, and only ever run mid-turn.\n let runner: AiSdkRunner | undefined\n const webFetchCap = isGranted('webFetch') ? options.capabilities?.webFetch : undefined\n const webFetch =\n typeof webFetchCap === 'function'\n ? webFetchCap\n : webFetchCap\n ? createWebFetch({\n ...webFetchCap,\n digest:\n webFetchCap.digest === false\n ? undefined\n : (webFetchCap.digest ??\n ((markdown, prompt) =>\n runner!.generateDigest(\n 'Answer the request below using ONLY this web page content.\\n\\n' +\n `<page>\\n${markdown}\\n</page>\\n\\nRequest: ${prompt}`,\n ))),\n })\n : undefined\n const base = createToolContext({\n executor,\n sessionId: 'pending',\n vfs,\n search: isGranted('search') ? options.capabilities?.search : undefined,\n download: isGranted('download') ? options.capabilities?.download : undefined,\n webFetch,\n onFileDelivered:\n options.capabilities?.deliverFiles === false || !isGranted('deliverFiles') ? undefined : (file) => runner?.emitFileDelivered(file),\n })\n const declaredServers = options.profile?.session?.mcpServers\n const connected = options.mcp?.tools ?? options.mcpTools\n requireDeclaredServers(options.profile?.name ?? '(unnamed)', declaredServers, options.mcp, connected)\n const mcpTools = selectMcpTools(connected, declaredServers)\n const withMcp = mcpTools ? withMcpTools(base, mcpTools) : base\n const context = options.tools ? withHostTools(withMcp, options.tools) : withMcp\n\n runner = new AiSdkRunner(\n {\n ...options.config,\n languageModel: options.resolveModel(options.profile, options.config),\n instructions: options.profile?.session?.instructions ?? options.instructions ?? options.config.instructions,\n tools: context.tools,\n vfs,\n executor,\n executableTools: context.sandboxedToolNames,\n executionBackend: typeof options.backend === 'function' ? undefined : (options.backend ?? 'server'),\n executionLimits: options.executionLimits,\n shouldApprove: options.shouldApprove,\n approvalTimeoutMs: options.approvalTimeoutMs,\n reportMcpServers: options.mcp\n ? () =>\n Promise.resolve(\n declaredServers === undefined ? options.mcp!.servers : options.mcp!.servers.filter((s) => declaredServers.includes(s.name)),\n )\n : undefined,\n },\n options.id,\n )\n return runner\n}\n\nfunction requireDeclaredServers(\n profileName: string,\n declared: string[] | undefined,\n mcp: McpConnection | undefined,\n tools: ToolSet | undefined,\n): void {\n if (!declared || declared.length === 0) {\n return\n }\n const missing = declared.filter((name) => {\n if (mcp) {\n const server = mcp.servers.find((s) => s.name === name)\n return !server || server.status !== 'connected'\n }\n return !Object.keys(tools ?? {}).some((tool) => tool.split('__')[0] === name)\n })\n if (missing.length === 0) {\n return\n }\n const reasons = missing\n .map((name) => {\n const error = mcp?.servers.find((s) => s.name === name)?.error\n return error ? `${name} (${error})` : name\n })\n .join(', ')\n throw new Error(\n `profile '${profileName}' declares MCP server(s) that are not connected: ${reasons}. ` +\n 'A session missing a declared server is a session whose agent silently cannot do its job.',\n )\n}\n\nfunction selectMcpTools(tools: ToolSet | undefined, servers: string[] | undefined): ToolSet | undefined {\n if (!tools || servers === undefined) {\n return tools\n }\n const allowed = new Set(servers)\n return Object.fromEntries(Object.entries(tools).filter(([name]) => allowed.has(name.split('__')[0]!)))\n}\n\nexport type McpConnection = {\n tools: ToolSet\n servers: McpServerStatusInfo[]\n close: () => Promise<void>\n}\n\nexport async function connectMcpTools(\n servers: Record<string, McpServerConfigWire>,\n options: {\n // May fire more than once per server: a transport failure surfaces through the client's\n // uncaught-error channel as well as the connect failure.\n onError?: (name: string, error: unknown) => void\n required?: boolean\n } = {},\n): Promise<McpConnection> {\n const entries = Object.entries(servers)\n if (entries.length === 0) {\n return { tools: {}, servers: [], close: async () => {} }\n }\n\n const { createMCPClient } = await import('@ai-sdk/mcp')\n const clients: Array<{ close: () => Promise<void> }> = []\n const tools: ToolSet = {}\n const statuses: McpServerStatusInfo[] = []\n const closeAll = async (): Promise<void> => {\n await Promise.allSettled(clients.map((c) => c.close()))\n }\n\n for (const [name, server] of entries) {\n const identity = describeServer(server)\n try {\n const client = await createMCPClient({\n transport: toTransport(server),\n onUncaughtError: (error) => options.onError?.(name, error),\n })\n clients.push(client as unknown as { close: () => Promise<void> })\n const connected = await client.tools()\n for (const [toolName, mcpTool] of Object.entries(connected)) {\n tools[`${name}__${toolName}`] = mcpTool as ToolSet[string]\n }\n statuses.push({\n name,\n status: 'connected',\n ...identity,\n // Unnamespaced: this is the server's own view of itself, and `<server>__` is routing.\n tools: Object.entries(connected).map(([toolName, mcpTool]) => toToolInfo(toolName, mcpTool)),\n })\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n statuses.push({ name, status: 'failed', error: message, ...identity })\n options.onError?.(name, error)\n if (options.required) {\n await closeAll()\n throw new Error(`MCP server '${name}' failed to connect: ${message}`, { cause: error })\n }\n }\n }\n\n return { tools, servers: statuses, close: closeAll }\n}\n\n// Identity minus secrets: `headers` must never travel.\nfunction describeServer(server: McpServerConfigWire): Pick<McpServerStatusInfo, 'transport' | 'url' | 'command' | 'args'> {\n if ('url' in server) {\n return { transport: server.type === 'sse' ? 'sse' : 'http', url: server.url }\n }\n return { transport: 'stdio', command: server.command, args: server.args }\n}\n\n// A zod `inputSchema` carries no JSON Schema document; only a `jsonSchema()` wrapper does, so\n// that is the only case parameters are reported.\nfunction toToolInfo(name: string, mcpTool: unknown): McpServerToolInfo {\n const { description, inputSchema } = (mcpTool ?? {}) as {\n description?: unknown\n inputSchema?: { jsonSchema?: unknown }\n }\n return {\n name,\n description: typeof description === 'string' ? description : undefined,\n inputSchema: inputSchema?.jsonSchema,\n }\n}\n\nfunction toTransport(server: McpServerConfigWire) {\n if (!('url' in server)) {\n throw new Error(\n 'stdio MCP servers are not supported by the model-agnostic engine (use an http or sse ' +\n 'server, or run this session under a Claude profile)',\n )\n }\n return server.type === 'sse'\n ? { type: 'sse' as const, url: server.url, headers: server.headers }\n : { type: 'http' as const, url: server.url, headers: server.headers }\n}\n","import type { ModelCatalog } from '../adapter.ts'\n\nexport const CLAUDE_CATALOG: ModelCatalog = {\n provenance:\n 'supportedModels() of @anthropic-ai/claude-agent-sdk 0.3.258 (Claude Code CLI), ' +\n 'extracted 2026-09-02; older-model rows hand-maintained',\n models: [\n {\n value: 'claude-fable-5-1[1m]',\n resolvedModel: 'claude-fable-5-1',\n displayName: 'Fable 5.1',\n description: 'Fable 5.1 · Most capable for your hardest and longest-running tasks',\n primary: true,\n reasoningEfforts: ['low', 'medium', 'high', 'xhigh', 'max'],\n },\n {\n value: 'claude-fable-5[1m]',\n resolvedModel: 'claude-fable-5',\n displayName: 'Fable 5',\n description: 'Fable 5 · Previous Fable generation',\n },\n {\n value: 'opus[1m]',\n resolvedModel: 'claude-opus-5[1m]',\n displayName: 'Opus 5',\n description: 'Opus 5 with 1M context · Best for everyday, complex tasks',\n primary: true,\n reasoningEfforts: ['low', 'medium', 'high', 'xhigh', 'max'],\n },\n {\n value: 'claude-opus-4-8',\n resolvedModel: 'claude-opus-4-8',\n displayName: 'Opus 4.8',\n description: 'Opus 4.8 · Previous Opus generation',\n },\n {\n value: 'sonnet',\n resolvedModel: 'claude-sonnet-5',\n displayName: 'Sonnet 5',\n description: 'Sonnet 5 · Efficient for routine tasks',\n primary: true,\n reasoningEfforts: ['low', 'medium', 'high', 'xhigh', 'max'],\n },\n {\n value: 'claude-sonnet-4-6',\n resolvedModel: 'claude-sonnet-4-6',\n displayName: 'Sonnet 4.6',\n description: 'Sonnet 4.6 · Previous Sonnet generation',\n },\n {\n value: 'haiku',\n resolvedModel: 'claude-haiku-4-5-20251001',\n displayName: 'Haiku 4.5',\n description: 'Haiku 4.5 · Fastest for quick answers',\n primary: true,\n // Explicitly none, not absent: an absent field means \"the engine's default set\".\n reasoningEfforts: [],\n },\n ],\n}\n","import { listSessions as sdkListSessions } from '@anthropic-ai/claude-agent-sdk'\nimport { ENGINE_CAPABILITIES } from '@workerdeck/protocol'\nimport { checkClaudeAuth } from './auth.ts'\nimport { SessionRunner } from './runner.ts'\nimport type { EngineAdapter } from '../adapter.ts'\nimport { CLAUDE_CATALOG } from './catalog.ts'\n\nexport const claudeAdapter: EngineAdapter = {\n engine: 'claude',\n capabilities: ENGINE_CAPABILITIES.claude,\n catalog: CLAUDE_CATALOG,\n async checkAvailability(profile, env) {\n const status = await checkClaudeAuth(env)\n if (status === 'logged_in') {\n return { available: true }\n }\n if (status === 'logged_out') {\n return {\n available: false,\n reason:\n `no usable Claude credentials for this profile's environment — log in under its ` +\n `config dir (CLAUDE_CONFIG_DIR=${profile.configDir ?? '~/.claude'} claude auth login) ` +\n 'or set ANTHROPIC_API_KEY',\n }\n }\n return { available: 'unknown' }\n },\n createRunner({ config, restore, id }) {\n if (restore) {\n throw new Error('the Claude engine cannot rebuild a parked session')\n }\n return new SessionRunner(config, id)\n },\n async listSessions({ dir, limit, offset }) {\n const sessions = await sdkListSessions({ dir, limit, offset })\n return sessions.map((s) => ({\n sessionId: s.sessionId,\n summary: s.summary,\n lastModified: s.lastModified,\n createdAt: s.createdAt,\n customTitle: s.customTitle,\n firstPrompt: s.firstPrompt,\n gitBranch: s.gitBranch,\n cwd: s.cwd,\n }))\n },\n}\n","import { PROTOCOL_VERSION } from '@workerdeck/protocol'\n\n/**\n * The operator's environment reaches the child whole — WorkerDeck resolves no credential of its\n * own — and the profile's CODEX_HOME is the one key it pins, last, so a profile always wins over\n * an inherited value. Every path that spawns or connects to an app-server goes through here.\n */\nexport function codexChildEnv(base: Record<string, string | undefined>, codexHome?: string): Record<string, string> {\n const env: Record<string, string> = {}\n for (const [key, value] of Object.entries(base)) {\n if (value !== undefined) {\n env[key] = value\n }\n }\n if (codexHome) {\n env.CODEX_HOME = codexHome\n }\n return env\n}\n\n/** `experimentalApi` gates the granular approval policy and there is no non-experimental fallback, so it is not per-call-site. */\nexport const INITIALIZE_PARAMS = {\n clientInfo: {\n name: 'workerdeck',\n title: 'WorkerDeck',\n version: `protocol-${PROTOCOL_VERSION}`,\n },\n capabilities: { experimentalApi: true },\n} as const\n","import { appendFileSync } from 'node:fs'\nimport type { Readable, Writable } from 'node:stream'\n\nexport const CODEX_TRACE_ENV = 'WORKERDECK_CODEX_TRACE'\n\nexport class JsonRpcError extends Error {\n readonly code: number\n constructor(code: number, message: string) {\n super(message)\n this.name = 'JsonRpcError'\n this.code = code\n }\n}\n\ntype Pending = {\n method: string\n resolve: (result: unknown) => void\n reject: (error: Error) => void\n}\n\nexport class JsonRpcStdioConnection {\n #output: Writable\n #nextId = 1\n #pending = new Map<number, Pending>()\n #buffer = ''\n #closed = false\n #notificationHandler: ((method: string, params: unknown) => void) | undefined\n #trace: string | undefined\n #requestHandler: ((method: string, params: unknown, id: string | number) => Promise<unknown>) | undefined\n\n constructor(options: { input: Readable; output: Writable }) {\n this.#output = options.output\n this.#trace = process.env[CODEX_TRACE_ENV] || undefined\n options.input.on('data', (chunk: Buffer | string) => this.#feed(String(chunk)))\n // Stream errors surface via the process wrapper's exit handling; this only prevents an unhandled crash between the two.\n options.input.on('error', () => {})\n options.output.on('error', () => {})\n }\n\n request(method: string, params?: unknown): Promise<unknown> {\n if (this.#closed) {\n return Promise.reject(new Error(`codex app-server is closed (${method})`))\n }\n const id = this.#nextId++\n return new Promise((resolve, reject) => {\n this.#pending.set(id, { method, resolve, reject })\n this.#write({ id, method, ...(params === undefined ? {} : { params }) })\n })\n }\n\n notify(method: string, params?: unknown): void {\n if (this.#closed) {\n return\n }\n this.#write({ method, ...(params === undefined ? {} : { params }) })\n }\n\n onNotification(handler: (method: string, params: unknown) => void): void {\n this.#notificationHandler = handler\n }\n\n onRequest(handler: (method: string, params: unknown, id: string | number) => Promise<unknown>): void {\n this.#requestHandler = handler\n }\n\n fail(message: string): void {\n if (this.#closed) {\n return\n }\n this.#closed = true\n const pending = [...this.#pending.values()]\n this.#pending.clear()\n for (const entry of pending) {\n entry.reject(new Error(`${message} (awaiting ${entry.method})`))\n }\n }\n\n #write(payload: object): void {\n try {\n this.#output.write(JSON.stringify(payload) + '\\n')\n } catch {\n // A broken pipe races the exit event; the wrapper's fail() explains it.\n }\n }\n\n #feed(chunk: string): void {\n this.#buffer += chunk\n let newline: number\n while ((newline = this.#buffer.indexOf('\\n')) >= 0) {\n const line = this.#buffer.slice(0, newline).trim()\n this.#buffer = this.#buffer.slice(newline + 1)\n if (!line) {\n continue\n }\n let message: Record<string, unknown>\n try {\n message = JSON.parse(line) as Record<string, unknown>\n } catch {\n continue // never let one garbled line kill the session\n }\n this.#traceLine(message)\n this.#dispatch(message)\n }\n }\n\n #traceLine(message: Record<string, unknown>): void {\n if (!this.#trace) {\n return\n }\n const method = message.method\n if (typeof method !== 'string') {\n return\n }\n // account/* and login* are the one place this protocol carries a masked credential fragment.\n if (method.startsWith('account/') || method.startsWith('login')) {\n return\n }\n try {\n appendFileSync(this.#trace, JSON.stringify(message) + '\\n')\n } catch {\n // Unwritable path, full disk: tracing is never worth failing a session.\n }\n }\n\n #dispatch(message: Record<string, unknown>): void {\n const { id, method } = message\n if (typeof method === 'string') {\n if (id === undefined || id === null) {\n this.#notificationHandler?.(method, message.params)\n return\n }\n const respond = (payload: object) => this.#write({ id: id as string | number, ...payload })\n const handler = this.#requestHandler\n if (!handler) {\n respond({ error: { code: -32601, message: `no handler for server request '${method}'` } })\n return\n }\n handler(method, message.params, id as string | number).then(\n (result) => respond({ result: result ?? {} }),\n (error: unknown) =>\n respond({\n error: {\n code: error instanceof JsonRpcError ? error.code : -32603,\n message: error instanceof Error ? error.message : String(error),\n },\n }),\n )\n return\n }\n if (id === undefined || id === null) {\n return\n }\n const pending = this.#pending.get(id as number)\n if (!pending) {\n return\n }\n this.#pending.delete(id as number)\n if (message.error !== undefined && message.error !== null) {\n const error = message.error as { code?: number; message?: string }\n pending.reject(new JsonRpcError(error.code ?? -32603, error.message ?? `request '${pending.method}' failed`))\n return\n }\n pending.resolve(message.result)\n }\n}\n","import { SUBAGENT_HISTORY, type SubagentInfo } from '@workerdeck/protocol'\n\nexport class CodexAgentTracker {\n #byThread = new Map<string, CodexAgent>()\n #settleCounter = 0\n\n get(agentThreadId: string): CodexAgent | undefined {\n return this.#byThread.get(agentThreadId)\n }\n\n open(agentThreadId: string, toolUseId: string, agentType: string | undefined, ts: number): CodexAgent {\n let record = this.#byThread.get(agentThreadId)\n if (!record) {\n record = {\n agentThreadId,\n toolUseId,\n status: 'running',\n startedAt: ts,\n toolCount: 0,\n counted: new Set(),\n }\n this.#byThread.set(agentThreadId, record)\n }\n record.agentType ??= agentType\n return record\n }\n\n revive(record: CodexAgent): void {\n record.status = 'running'\n record.settledOrder = undefined\n }\n\n #settle(record: CodexAgent, status: 'done' | 'failed'): void {\n record.status = status\n record.settledOrder = ++this.#settleCounter\n let settled = 0\n for (const r of this.#byThread.values()) {\n if (r.settledOrder !== undefined) {\n settled++\n }\n }\n while (settled > SUBAGENT_HISTORY) {\n let oldest: CodexAgent | undefined\n for (const r of this.#byThread.values()) {\n if (r.settledOrder === undefined) {\n continue\n }\n if (!oldest || r.settledOrder < oldest.settledOrder!) {\n oldest = r\n }\n }\n if (!oldest) {\n break\n }\n this.#byThread.delete(oldest.agentThreadId)\n settled--\n }\n }\n\n settle(record: CodexAgent, status: 'done' | 'failed'): void {\n if (record.status === status) {\n return\n }\n this.#settle(record, status)\n }\n\n sweep(): void {\n for (const record of this.#byThread.values()) {\n if (record.status === 'running') {\n this.#settle(record, 'failed')\n }\n }\n }\n\n forget(): void {\n this.#byThread.clear()\n }\n\n threadIds(): string[] {\n return Array.from(this.#byThread.keys())\n }\n\n list(): SubagentInfo[] | undefined {\n if (this.#byThread.size === 0) {\n return undefined\n }\n const out: SubagentInfo[] = []\n for (const r of this.#byThread.values()) {\n out.push({\n toolUseId: r.toolUseId,\n agentType: r.agentType,\n status: r.status,\n startedAt: r.startedAt,\n toolCount: r.toolCount,\n })\n }\n return out\n }\n}\n\nexport type CodexAgent = {\n agentThreadId: string\n toolUseId: string\n agentType?: string\n status: 'running' | 'done' | 'failed'\n startedAt: number\n toolCount: number\n // `imageGeneration` re-emits its card with the finished input, so ids are counted once.\n counted: Set<string>\n anchored?: boolean\n // Insertion order cannot stand in: a slow early agent settles after a fast late one.\n settledOrder?: number\n}\n","import { existsSync, readFileSync, realpathSync, statSync } from 'node:fs'\nimport { dirname, join, resolve, sep } from 'node:path'\n\nconst BARE_KEY = /[A-Za-z0-9_-]/\n\nfunction skipWs(text: string, pos: number): number {\n let i = pos\n while (i < text.length && (text[i] === ' ' || text[i] === '\\t')) {\n i++\n }\n return i\n}\n\ntype Parsed<T> = { value: T; end: number } | undefined\n\nfunction parseBasicString(text: string, pos: number): Parsed<string> {\n let out = ''\n let i = pos + 1\n while (i < text.length) {\n const ch = text[i]\n if (ch === '\"') {\n return { value: out, end: i + 1 }\n }\n if (ch === '\\\\') {\n const esc = text[i + 1]\n if (esc === 'b') {\n out += '\\b'\n } else if (esc === 't') {\n out += '\\t'\n } else if (esc === 'n') {\n out += '\\n'\n } else if (esc === 'f') {\n out += '\\f'\n } else if (esc === 'r') {\n out += '\\r'\n } else if (esc === '\"') {\n out += '\"'\n } else if (esc === '\\\\') {\n out += '\\\\'\n } else if (esc === 'u' || esc === 'U') {\n const width = esc === 'u' ? 4 : 8\n const hex = text.slice(i + 2, i + 2 + width)\n if (hex.length !== width || !/^[0-9A-Fa-f]+$/.test(hex)) {\n return undefined\n }\n const code = Number.parseInt(hex, 16)\n if (code > 0x10ffff) {\n return undefined\n }\n out += String.fromCodePoint(code)\n i += width\n } else {\n return undefined\n }\n i += 2\n continue\n }\n out += ch\n i++\n }\n return undefined\n}\n\nfunction parseLiteralString(text: string, pos: number): Parsed<string> {\n const close = text.indexOf(\"'\", pos + 1)\n if (close === -1) {\n return undefined\n }\n return { value: text.slice(pos + 1, close), end: close + 1 }\n}\n\nfunction parseKeyPath(text: string, pos: number): Parsed<string[]> {\n const keys: string[] = []\n let i = pos\n for (;;) {\n i = skipWs(text, i)\n const ch = text[i]\n if (ch === '\"' || ch === \"'\") {\n const str = ch === '\"' ? parseBasicString(text, i) : parseLiteralString(text, i)\n if (!str) {\n return undefined\n }\n keys.push(str.value)\n i = str.end\n } else if (ch !== undefined && BARE_KEY.test(ch)) {\n let end = i\n while (end < text.length && BARE_KEY.test(text[end])) {\n end++\n }\n keys.push(text.slice(i, end))\n i = end\n } else {\n return undefined\n }\n i = skipWs(text, i)\n if (text[i] !== '.') {\n return { value: keys, end: i }\n }\n i++\n }\n}\n\n// Returns the bracket depth carried onto the next line (0 = the value is complete); undefined\n// refuses the whole file rather than guess what codex would read.\nfunction scanValueLine(text: string, pos: number, depth: number): { depth: number; value?: string } | undefined {\n let i = skipWs(text, pos)\n if (depth === 0 && (text[i] === '\"' || text[i] === \"'\")) {\n if (text.startsWith('\"\"\"', i) || text.startsWith(\"'''\", i)) {\n return undefined\n }\n const str = text[i] === '\"' ? parseBasicString(text, i) : parseLiteralString(text, i)\n if (!str) {\n return undefined\n }\n const rest = skipWs(text, str.end)\n if (rest < text.length && text[rest] !== '#') {\n return undefined\n }\n return { depth: 0, value: str.value }\n }\n while (i < text.length) {\n const ch = text[i]\n if (ch === '#') {\n break\n }\n if (ch === '\"' || ch === \"'\") {\n if (text.startsWith('\"\"\"', i) || text.startsWith(\"'''\", i)) {\n return undefined\n }\n const str = ch === '\"' ? parseBasicString(text, i) : parseLiteralString(text, i)\n if (!str) {\n return undefined\n }\n i = str.end\n continue\n }\n if (ch === '[' || ch === '{') {\n depth++\n } else if (ch === ']' || ch === '}') {\n depth--\n if (depth < 0) {\n return undefined\n }\n }\n i++\n }\n return { depth }\n}\n\nexport function parseProjectTrustEntries(source: string): Map<string, string> | undefined {\n const entries = new Map<string, string>()\n let section: string[] = []\n let carryDepth = 0\n for (const rawLine of source.split('\\n')) {\n const line = rawLine.endsWith('\\r') ? rawLine.slice(0, -1) : rawLine\n if (carryDepth > 0) {\n const scanned = scanValueLine(line, 0, carryDepth)\n if (!scanned) {\n return undefined\n }\n carryDepth = scanned.depth\n continue\n }\n const start = skipWs(line, 0)\n if (start >= line.length || line[start] === '#') {\n continue\n }\n if (line[start] === '[') {\n const array = line.startsWith('[[', start)\n const path = parseKeyPath(line, start + (array ? 2 : 1))\n if (!path) {\n return undefined\n }\n const close = array ? ']]' : ']'\n if (!line.startsWith(close, path.end)) {\n return undefined\n }\n const rest = skipWs(line, path.end + close.length)\n if (rest < line.length && line[rest] !== '#') {\n return undefined\n }\n if (array && path.value[0] === 'projects') {\n return undefined\n }\n section = path.value\n continue\n }\n const key = parseKeyPath(line, start)\n if (!key) {\n return undefined\n }\n if (line[key.end] !== '=') {\n return undefined\n }\n const scanned = scanValueLine(line, key.end + 1, 0)\n if (!scanned) {\n return undefined\n }\n carryDepth = scanned.depth\n const full = [...section, ...key.value]\n if (full[0] !== 'projects') {\n continue\n }\n // `projects = {...}` / `projects.\"<p>\" = {...}`: whole-entry forms this reader does not\n // interpret — refuse rather than miss a trust_level inside.\n if (full.length < 3) {\n return undefined\n }\n if (full.length === 3 && full[2] === 'trust_level') {\n if (carryDepth !== 0 || scanned.value === undefined) {\n return undefined\n }\n const project = full[1] as string\n const existing = entries.get(project)\n if (existing !== undefined && existing !== scanned.value) {\n return undefined\n }\n entries.set(project, scanned.value)\n }\n }\n if (carryDepth > 0) {\n return undefined\n }\n return entries\n}\n\nfunction mainRepositoryTrusted(gitRootDir: string, canonical: Map<string, string>): boolean {\n const gitPath = join(gitRootDir, '.git')\n try {\n if (!statSync(gitPath).isFile()) {\n return false\n }\n const match = /^gitdir:[ \\t]*(.+?)[ \\t]*$/m.exec(readFileSync(gitPath, 'utf8'))\n if (!match) {\n return false\n }\n const gitdir = resolve(gitRootDir, match[1])\n const at = gitdir.lastIndexOf(`${sep}.git${sep}`)\n if (at <= 0) {\n return false\n }\n let main = gitdir.slice(0, at)\n try {\n main = realpathSync(main)\n } catch {}\n return canonical.get(main) === 'trusted'\n } catch {\n return false\n }\n}\n\nexport function untrustedProjectNotice(options: { cwd: string; codexHome: string }): string | undefined {\n let cwd: string\n try {\n cwd = realpathSync(options.cwd)\n } catch {\n return undefined\n }\n let home = resolve(options.codexHome)\n try {\n home = realpathSync(options.codexHome)\n } catch {}\n const chain: string[] = []\n let dir = cwd\n for (;;) {\n chain.push(dir)\n if (existsSync(join(dir, '.git'))) {\n break\n }\n const parent = dirname(dir)\n if (parent === dir) {\n break\n }\n dir = parent\n }\n const anchor = chain[chain.length - 1] as string\n const gitRoot = existsSync(join(anchor, '.git')) ? anchor : undefined\n const layers = (gitRoot ? chain : [cwd]).filter((layer) => {\n if (!existsSync(join(layer, '.codex', 'config.toml'))) {\n return false\n }\n try {\n // The cwd whose `.codex` IS the codex home: that config is the base config and always loads.\n return realpathSync(join(layer, '.codex')) !== home\n } catch {\n return false\n }\n })\n if (layers.length === 0) {\n return undefined\n }\n const homeConfigPath = join(options.codexHome, 'config.toml')\n let source = ''\n try {\n source = readFileSync(homeConfigPath, 'utf8')\n } catch (error) {\n // Absent = knowably no trust entries; unreadable = unknowable, silence.\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n return undefined\n }\n }\n const entries = parseProjectTrustEntries(source)\n if (!entries) {\n return undefined\n }\n for (const value of entries.values()) {\n if (value !== 'trusted' && value !== 'untrusted') {\n return undefined\n }\n }\n // Two spellings of one directory with conflicting verdicts keep the trusted one — the\n // direction that stays silent.\n const canonical = new Map<string, string>()\n for (const [key, value] of entries) {\n let path = key\n try {\n path = realpathSync(key)\n } catch {}\n if (canonical.get(path) === 'trusted') {\n continue\n }\n canonical.set(path, value)\n }\n const rootTrusted = gitRoot !== undefined && (canonical.get(gitRoot) === 'trusted' || mainRepositoryTrusted(gitRoot, canonical))\n const ignored = layers.filter((layer) => {\n const entry = canonical.get(layer)\n if (entry !== undefined) {\n return entry !== 'trusted'\n }\n return !rootTrusted\n })\n if (ignored.length === 0) {\n return undefined\n }\n const trustDir = gitRoot ?? cwd\n const configs = ignored.map((layer) => join(layer, '.codex', 'config.toml'))\n const what = configs.length === 1 ? `its project config (${configs[0]}) is` : `its project configs (${configs.join(', ')}) are`\n return (\n `codex does not trust this directory, so ${what} being ignored — MCP servers and ` +\n `settings declared there will be missing from this session. To trust it, run codex once ` +\n `in ${trustDir} and accept the trust prompt, or add [projects.\"${trustDir}\"] with ` +\n `trust_level = \"trusted\" to ${homeConfigPath}.`\n )\n}\n","import { createHash, randomUUID } from 'node:crypto'\nimport { mkdirSync, rmSync, statSync, writeFileSync } from 'node:fs'\nimport { homedir, tmpdir } from 'node:os'\nimport { join } from 'node:path'\nimport {\n ENGINE_CAPABILITIES,\n type ContentBlock,\n type CreateSessionRequest,\n type FilePatch,\n type McpServerStatusInfo,\n type PermissionDecisionSource,\n type PermissionMode,\n type PermissionRequest,\n type SessionEvent,\n type SessionEventBody,\n type SessionInfo,\n type SessionStatus,\n type SkillInfo,\n type UserQuestion,\n} from '@workerdeck/protocol'\nimport { attachmentKind, attachmentRef, normalizeMediaType, type AttachmentInput } from '../../lib/attachments.ts'\nimport { parseUnifiedDiff } from '../../lib/patch.ts'\nimport type { PermissionDecision, Runner, SessionEventListener } from '../../runner-interface.ts'\nimport { EventLog } from '../../lib/event-log.ts'\nimport { SubscriberSet, type SubscribeOptions } from '../../lib/subscribers.ts'\nimport { sessionTitle, withTitle } from '../../lib/title.ts'\nimport { codexChildEnv, INITIALIZE_PARAMS } from './connect.ts'\nimport { JsonRpcError } from './jsonrpc.ts'\nimport { CodexAgentTracker, type CodexAgent } from './subagents.ts'\nimport { untrustedProjectNotice } from './trust.ts'\nimport type {\n AppServerCollabAgentToolCallItem,\n AppServerCommandApprovalParams,\n AppServerConnection,\n AppServerConnectFn,\n AppServerElicitationParams,\n AppServerFileChangeApprovalParams,\n AppServerHistoryTurn,\n AppServerImageGenerationItem,\n AppServerItem,\n AppServerMcpServerStatus,\n AppServerMcpServerStatusResponse,\n AppServerMcpStatusUpdate,\n AppServerPermissionsApprovalParams,\n AppServerPlanUpdate,\n AppServerRateLimits,\n AppServerSkillMetadata,\n AppServerSkillsListResponse,\n AppServerTokenUsage,\n AppServerTokenUsageUpdate,\n AppServerTurn,\n AppServerUnknownItem,\n AppServerUserInput,\n AppServerUserInputParams,\n AppServerUserInputQuestion,\n AppServerUserMessageItem,\n} from './types.ts'\n\nconst THREAD_SANDBOX_BY_MODE: Partial<Record<PermissionMode, string>> = {\n default: 'read-only',\n acceptEdits: 'workspace-write',\n auto: 'workspace-write',\n bypassPermissions: 'danger-full-access',\n}\n\n// Only `#turnSandboxPolicy` may send the workspaceWrite entry: every unstated field of that\n// variant is serde-defaulted, so a bare object resets the operator's networkAccess and\n// writableRoots on every turn.\nconst TURN_SANDBOX_BY_MODE: Partial<Record<PermissionMode, { type: string }>> = {\n default: { type: 'readOnly' },\n acceptEdits: { type: 'workspaceWrite' },\n auto: { type: 'workspaceWrite' },\n bypassPermissions: { type: 'dangerFullAccess' },\n}\n\ntype CodexWorkspaceWrite = {\n writableRoots: string[]\n networkAccess: boolean\n excludeTmpdirEnvVar: boolean\n excludeSlashTmp: boolean\n}\n\nconst GRANULAR_ASK = {\n granular: {\n sandbox_approval: true,\n rules: true,\n mcp_elicitations: true,\n request_permissions: true,\n skill_approval: true,\n },\n}\nconst GRANULAR_NEVER = {\n granular: {\n sandbox_approval: false,\n rules: false,\n mcp_elicitations: false,\n request_permissions: false,\n skill_approval: false,\n },\n}\nconst THREAD_SCOPED_NOTIFICATIONS = new Set(['turn/started', 'turn/completed', 'thread/tokenUsage/updated'])\n\nconst APPROVAL_POLICY_BY_MODE: Partial<Record<PermissionMode, object>> = {\n default: GRANULAR_ASK,\n acceptEdits: GRANULAR_ASK,\n auto: GRANULAR_ASK,\n bypassPermissions: GRANULAR_NEVER,\n}\n\nconst APPROVALS_REVIEWER_BY_MODE: Partial<Record<PermissionMode, string>> = {\n default: 'user',\n acceptEdits: 'user',\n auto: 'auto_review',\n bypassPermissions: 'user',\n}\n\nconst DEFAULT_APPROVAL_TIMEOUT_MS = 300_000\n\nexport const CODEX_IMAGE_TOOL = 'CodexImageGeneration'\n\nexport const CODEX_AGENT_TOOL = 'CodexAgent'\n\nexport const CODEX_COLLAB_TOOL = 'CodexCollab'\n\nfunction agentName(agentPath: string | null | undefined): string | undefined {\n if (typeof agentPath !== 'string') {\n return undefined\n }\n const name = agentPath.split('/').filter(Boolean).at(-1)\n return name || undefined\n}\n\nfunction collabInput(item: AppServerCollabAgentToolCallItem): Record<string, unknown> {\n return {\n tool: item.tool,\n ...(item.receiverThreadIds?.length ? { receiverThreadIds: item.receiverThreadIds } : {}),\n ...(item.prompt ? { prompt: item.prompt } : {}),\n ...(item.model ? { model: item.model } : {}),\n }\n}\n\nfunction turnReport(turn: AppServerTurn): string | undefined {\n const items = Array.isArray(turn.items) ? turn.items : []\n for (let index = items.length - 1; index >= 0; index--) {\n const item = items[index]\n if (item?.type === 'agentMessage' && typeof item.text === 'string' && item.text) {\n return item.text\n }\n }\n return undefined\n}\n\nconst MAX_IMAGE_RESULT_CHARS = 512\n\nfunction shortResult(result: string): boolean {\n return result.length > 0 && result.length <= MAX_IMAGE_RESULT_CHARS && !result.startsWith('data:')\n}\n\nfunction producedFileId(path: string): string {\n return createHash('sha256').update(path).digest('hex').slice(0, 32)\n}\n\nconst PRODUCED_MEDIA_TYPES: Record<string, string> = {\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n gif: 'image/gif',\n webp: 'image/webp',\n svg: 'image/svg+xml',\n pdf: 'application/pdf',\n}\n\nfunction producedMediaType(path: string): string | undefined {\n const extension = path.slice(path.lastIndexOf('.') + 1).toLowerCase()\n return PRODUCED_MEDIA_TYPES[extension]\n}\n\nfunction skillInfo(skill: AppServerSkillMetadata): SkillInfo {\n return {\n name: skill.name,\n ...(skill.description ? { description: skill.description } : {}),\n ...((skill.interface?.shortDescription ?? skill.shortDescription)\n ? { shortDescription: skill.interface?.shortDescription ?? skill.shortDescription }\n : {}),\n ...(skill.interface?.displayName ? { displayName: skill.interface.displayName } : {}),\n ...(skill.interface?.defaultPrompt ? { defaultPrompt: skill.interface.defaultPrompt } : {}),\n ...(skill.scope ? { scope: skill.scope } : {}),\n // Codex omits `enabled` for a skill it considers live; defaulting to false would hide it.\n enabled: skill.enabled !== false,\n }\n}\n\nfunction mcpStatusOf(\n authStatus: string | undefined,\n update: { status: string; failureReason?: string } | undefined,\n hasTools: boolean,\n): string {\n if (update?.status === 'failed') {\n return update.failureReason === 'reauthenticationRequired' ? 'needs-auth' : 'failed'\n }\n if (update?.status === 'cancelled') {\n return 'failed'\n }\n if (authStatus === 'notLoggedIn') {\n return 'needs-auth'\n }\n if (update?.status === 'ready') {\n return 'connected'\n }\n if (hasTools) {\n return 'connected'\n }\n return 'pending'\n}\n\nfunction mcpServerInfo(\n server: AppServerMcpServerStatus,\n update: { status: string; error?: string; failureReason?: string } | undefined,\n): McpServerStatusInfo {\n const tools = Object.entries(server.tools ?? {}).flatMap(([key, tool]) => {\n if (!tool) {\n return []\n }\n const annotations = tool.annotations\n return [\n {\n name: tool.name ?? key,\n ...(tool.description ? { description: tool.description } : {}),\n ...(tool.inputSchema !== undefined ? { inputSchema: tool.inputSchema } : {}),\n ...(annotations\n ? {\n annotations: {\n ...(annotations.readOnlyHint != null ? { readOnly: annotations.readOnlyHint } : {}),\n ...(annotations.destructiveHint != null ? { destructive: annotations.destructiveHint } : {}),\n ...(annotations.openWorldHint != null ? { openWorld: annotations.openWorldHint } : {}),\n },\n }\n : {}),\n },\n ]\n })\n return {\n name: server.name,\n status: mcpStatusOf(server.authStatus ?? undefined, update, tools.length > 0),\n ...(update?.error ? { error: update.error } : {}),\n ...(server.serverInfo?.name ? { serverInfo: { name: server.serverInfo.name, version: server.serverInfo.version ?? '' } } : {}),\n ...(tools.length > 0 ? { tools } : {}),\n }\n}\n\nfunction imageGenerationInput(item: AppServerImageGenerationItem): Record<string, unknown> {\n return {\n ...(item.revisedPrompt ? { prompt: item.revisedPrompt } : {}),\n ...(item.savedPath ? { savedPath: item.savedPath } : {}),\n }\n}\n\nfunction offeredDecisions(params: unknown): Set<string> | undefined {\n const raw = (params as { availableDecisions?: unknown })?.availableDecisions\n if (!Array.isArray(raw)) {\n return undefined\n }\n const names = new Set<string>()\n for (const entry of raw) {\n if (typeof entry === 'string') {\n names.add(entry)\n } else if (entry && typeof entry === 'object') {\n for (const key of Object.keys(entry)) {\n names.add(key)\n }\n }\n }\n return names.size > 0 ? names : undefined\n}\n\nfunction pickDecision(behavior: 'allow' | 'deny', interrupt: boolean, offered: Set<string> | undefined): string | undefined {\n const has = (name: string) => !offered || offered.has(name)\n if (behavior === 'allow') {\n return has('accept') ? 'accept' : undefined\n }\n if (interrupt && has('cancel')) {\n return 'cancel'\n }\n return 'decline'\n}\n\nfunction userQuestionsFromCodex(questions: readonly AppServerUserInputQuestion[]): UserQuestion[] {\n return questions.map((question) => ({\n question: question.question,\n header: question.header ?? '',\n options: (question.options ?? []).map((option) => ({\n label: option.label,\n description: option.description,\n })),\n }))\n}\n\nfunction historyUserText(item: AppServerUserMessageItem): string {\n if (!Array.isArray(item.content)) {\n return ''\n }\n let images = 0\n const text = item.content\n .map((part) => {\n const candidate = part as { type?: string; text?: unknown } | null\n if (candidate?.type === 'text' && typeof candidate.text === 'string') {\n return candidate.text\n }\n if (typeof candidate?.type === 'string' && candidate.type.toLowerCase().includes('image')) {\n images += 1\n }\n return ''\n })\n .filter(Boolean)\n .join('\\n')\n if (text) {\n return text\n }\n return images > 0 ? `[${images === 1 ? 'image' : `${images} images`}]` : ''\n}\n\nfunction codexAnswers(\n questions: readonly AppServerUserInputQuestion[],\n answers: Record<string, unknown> | undefined,\n): Record<string, { answers: string[] }> {\n const out: Record<string, { answers: string[] }> = {}\n for (const question of questions) {\n const value = answers?.[question.question] ?? answers?.[question.id]\n if (typeof value === 'string' && value.length > 0) {\n out[question.id] = { answers: [value] }\n }\n }\n return out\n}\n\ntype ApprovalSurface = Pick<PermissionRequest, 'toolName' | 'input' | 'title' | 'displayName' | 'description' | 'decisionReason'>\n\ntype ApprovalChannel = {\n describe(params: unknown): ApprovalSurface\n itemId(params: unknown): string | undefined\n allow(\n params: unknown,\n updatedInput: Record<string, unknown> | undefined,\n offered: Set<string> | undefined,\n ): { response: unknown; decision?: string } | undefined\n deny(params: unknown, interrupt: boolean, offered: Set<string> | undefined): { response: unknown; decision?: string }\n}\n\nfunction decisionChannel(describe: (params: unknown) => ApprovalSurface, itemId: (params: unknown) => string | undefined): ApprovalChannel {\n return {\n describe,\n itemId,\n allow: (_params, _updatedInput, offered) => {\n const decision = pickDecision('allow', false, offered)\n return decision ? { response: { decision }, decision } : undefined\n },\n deny: (_params, interrupt, offered) => {\n const decision = pickDecision('deny', interrupt, offered)!\n return { response: { decision }, decision }\n },\n }\n}\n\nconst APPROVAL_CHANNELS: Record<string, ApprovalChannel> = {\n 'item/commandExecution/requestApproval': decisionChannel(\n (raw) => {\n const params = raw as AppServerCommandApprovalParams\n const command = params.command ?? undefined\n return {\n toolName: 'CodexCommand',\n input: {\n ...(command !== undefined ? { command } : {}),\n ...(params.cwd ? { cwd: params.cwd } : {}),\n ...(params.reason ? { reason: params.reason } : {}),\n },\n title: params.reason ?? (command ? `Codex wants to run: ${command}` : 'Codex wants to run a command'),\n displayName: 'Run command',\n description: params.reason && command ? command : (params.cwd ?? undefined),\n decisionReason: params.reason ?? undefined,\n }\n },\n (raw) => (raw as AppServerCommandApprovalParams).itemId,\n ),\n 'item/fileChange/requestApproval': decisionChannel(\n (raw) => {\n const params = raw as AppServerFileChangeApprovalParams\n return {\n toolName: 'CodexFileChange',\n input: {\n ...(params.grantRoot ? { grantRoot: params.grantRoot } : {}),\n ...(params.reason ? { reason: params.reason } : {}),\n },\n title: params.reason ?? 'Codex wants to apply file changes',\n displayName: 'Apply file changes',\n description: params.grantRoot ? `write access under ${params.grantRoot}` : undefined,\n decisionReason: params.reason ?? undefined,\n }\n },\n (raw) => (raw as AppServerFileChangeApprovalParams).itemId,\n ),\n 'item/permissions/requestApproval': {\n describe: (raw) => {\n const params = raw as AppServerPermissionsApprovalParams\n return {\n toolName: 'CodexPermissions',\n input: {\n ...(params.permissions ? { permissions: params.permissions } : {}),\n ...(params.cwd ? { cwd: params.cwd } : {}),\n ...(params.reason ? { reason: params.reason } : {}),\n },\n title: params.reason ?? 'Codex requests additional permissions',\n displayName: 'Grant permissions',\n description: undefined,\n decisionReason: params.reason ?? undefined,\n }\n },\n itemId: (raw) => (raw as AppServerPermissionsApprovalParams).itemId,\n allow: (raw, updatedInput) => ({\n response: {\n permissions:\n (updatedInput?.permissions as Record<string, unknown> | undefined) ??\n (raw as AppServerPermissionsApprovalParams).permissions ??\n {},\n },\n }),\n deny: () => ({ response: { permissions: {} } }),\n },\n 'item/tool/requestUserInput': {\n describe: (raw) => ({\n toolName: 'AskUserQuestion',\n input: {\n questions: userQuestionsFromCodex((raw as AppServerUserInputParams).questions ?? []),\n },\n title: 'Codex asks a question',\n displayName: 'Answer questions',\n description: undefined,\n decisionReason: undefined,\n }),\n itemId: (raw) => (raw as AppServerUserInputParams).itemId,\n allow: (raw, updatedInput) => ({\n response: {\n answers: codexAnswers(\n (raw as AppServerUserInputParams).questions ?? [],\n updatedInput?.answers as Record<string, unknown> | undefined,\n ),\n },\n }),\n deny: () => ({ response: { answers: {} } }),\n },\n 'mcpServer/elicitation/request': {\n describe: (raw) => {\n const params = raw as AppServerElicitationParams\n return {\n toolName: 'CodexMcpElicitation',\n input: {\n ...(params.serverName ? { serverName: params.serverName } : {}),\n ...(params.message ? { message: params.message } : {}),\n ...(params.mode ? { mode: params.mode } : {}),\n ...(params.requestedSchema !== undefined ? { requestedSchema: params.requestedSchema } : {}),\n ...(params.url ? { url: params.url } : {}),\n },\n title: params.serverName ? `MCP server '${params.serverName}' requests input` : 'An MCP server requests input',\n displayName: 'MCP elicitation',\n description: params.message ?? undefined,\n decisionReason: undefined,\n }\n },\n itemId: () => undefined,\n allow: (_raw, updatedInput) => ({\n response: {\n action: 'accept',\n ...(updatedInput !== undefined ? { content: updatedInput } : {}),\n },\n }),\n deny: (_raw, interrupt) => ({ response: { action: interrupt ? 'cancel' : 'decline' } }),\n },\n}\n\ntype PendingCodexApproval = {\n request: PermissionRequest\n channel: ApprovalChannel\n params: unknown\n offered: Set<string> | undefined\n wireId: string | number | undefined\n timer: ReturnType<typeof setTimeout>\n respond: (response: unknown) => void\n}\n\nexport type CodexRunnerConfig = CreateSessionRequest & {\n connectFn: AppServerConnectFn\n env?: Record<string, string | undefined>\n codexHome?: string\n defaultApprovalTimeoutMs?: number\n backfillHistory?: boolean\n}\n\ntype QueuedTurn = { input: AppServerUserInput[] }\n\nfunction rateLimitWindowName(minutes: number | null | undefined): string | undefined {\n if (typeof minutes !== 'number' || !Number.isFinite(minutes) || minutes <= 0) {\n return undefined\n }\n if (minutes === 300) {\n return 'five_hour'\n }\n if (minutes === 10_080) {\n return 'seven_day'\n }\n return `window_${minutes}m`\n}\n\ntype ActiveTurn = {\n nonce: string\n turnId?: string\n interrupted: boolean\n finalText?: string\n lastError?: string\n usage: AppServerTokenUsage\n sawUsage: boolean\n contextTokens?: number\n contextWindow?: number\n toolUseEmitted: Set<string>\n sectionIndex: Map<string, number>\n settled: boolean\n resolve: (outcome: AppServerTurn) => void\n reject: (error: Error) => void\n}\n\nexport class CodexRunner implements Runner {\n readonly id: string\n readonly createdAt: number\n\n #config: CodexRunnerConfig\n readonly #cwd: string\n #log = new EventLog()\n #subscribers = new SubscriberSet()\n #status: SessionStatus = 'starting'\n #statusDetail: string | undefined\n #sdkSessionId: string | undefined\n #model: string | undefined\n #permissionMode: PermissionMode\n #reasoningEffort: string | undefined\n #resolvedModel: string | undefined\n #planType: string | undefined\n #resolvedEffort: string | undefined\n #queue: QueuedTurn[] = []\n #turnChain: Promise<void> = Promise.resolve()\n #activeTurn: ActiveTurn | undefined\n #connection: AppServerConnection | undefined\n #workspaceWrite: CodexWorkspaceWrite | undefined\n #threadLoaded = false\n #numTurns = 0\n #totalCostUsd: number | undefined\n #started = false\n #closed = false\n #imageDir: string | undefined\n #approvals = new Map<string, PendingCodexApproval>()\n #backfillPending = false\n #resumedHistory: { turns: AppServerHistoryTurn[]; partial: boolean } | undefined\n #replayingHistory = false\n #skillsFingerprint: string | undefined\n #skillsRefresh: Promise<void> | undefined\n #producedPaths = new Set<string>()\n #mcpStatus = new Map<string, { status: string; error?: string; failureReason?: string }>()\n #agents = new CodexAgentTracker()\n #clearedThreads = new Set<string>()\n\n constructor(config: CodexRunnerConfig, id: string = randomUUID()) {\n const mode = config.permissionMode ?? 'default'\n if (!ENGINE_CAPABILITIES.codex.permissionModes.includes(mode)) {\n throw new Error(`permission mode '${mode}' is not supported by the codex engine`)\n }\n if (config.forkSession) {\n throw new Error('the codex engine cannot fork a resumed thread')\n }\n if (!config.cwd) {\n throw new Error('the codex engine requires a cwd')\n }\n this.#cwd = config.cwd\n this.#config = config\n this.#permissionMode = mode\n this.#model = config.model\n this.#reasoningEffort = config.reasoningEffort\n this.#sdkSessionId = config.resume\n this.id = id\n this.createdAt = Date.now()\n }\n\n #childEnv(): Record<string, string> {\n return codexChildEnv(this.#config.env ?? process.env, this.#config.codexHome)\n }\n\n get status(): SessionStatus {\n return this.#status\n }\n\n get sdkSessionId(): string | undefined {\n return this.#sdkSessionId\n }\n\n get lastSeq(): number {\n return this.#log.seq\n }\n\n get pendingApprovals(): PermissionRequest[] {\n return [...this.#approvals.values()].map((pending) => pending.request)\n }\n\n info(): SessionInfo {\n return {\n id: this.id,\n sdkSessionId: this.#sdkSessionId,\n status: this.#status,\n cwd: this.#cwd,\n profile: this.#config.profile,\n engine: 'codex',\n capabilities: ENGINE_CAPABILITIES.codex,\n model: this.#model ?? this.#resolvedModel,\n permissionMode: this.#permissionMode,\n canBypassPermissions: true,\n createdAt: this.createdAt,\n lastSeq: this.#log.seq,\n activityCount: this.#log.activityCount,\n proseCount: this.#log.proseCount,\n contextUsage: this.#log.contextUsage,\n pendingPermissionCount: this.#approvals.size,\n meta: this.#config.meta,\n scope: this.#config.scope,\n title: sessionTitle(this.#config),\n totalCostUsd: this.#totalCostUsd,\n numTurns: this.#numTurns || undefined,\n lastActivityAt: this.#log.lastActivityAt,\n subagents: this.#agents.list(),\n }\n }\n\n setTitle(title: string | undefined): void {\n this.#config = withTitle(this.#config, title)\n }\n\n start(): Promise<void> {\n if (this.#started) {\n return this.#turnChain\n }\n this.#started = true\n this.#warnUntrustedProject()\n if (this.#config.resume && this.#config.backfillHistory !== false) {\n this.#backfillPending = true\n this.#turnChain = this.#turnChain.then(() => this.#backfillHistory())\n } else {\n this.#setStatus('idle')\n }\n if (this.#config.prompt) {\n this.sendMessage(this.#config.prompt)\n }\n if (!this.#config.prompt && !this.#config.resume) {\n void this.#probeSkills()\n }\n return this.#turnChain\n }\n\n #warnUntrustedProject(): void {\n if (this.#permissionMode !== 'default') {\n return\n }\n try {\n const env = this.#childEnv()\n const pin = env.CODEX_HOME\n if (pin !== undefined && pin.length === 0) {\n return\n }\n const codexHome = pin ?? join(env.HOME ?? homedir(), '.codex')\n const message = untrustedProjectNotice({ cwd: this.#cwd, codexHome })\n if (message) {\n this.#emit({ type: 'session_error', message })\n }\n } catch {}\n }\n\n async #probeSkills(): Promise<void> {\n let connection: AppServerConnection | undefined\n try {\n connection = await this.#openScratchConnection()\n if (this.#closed) {\n return\n }\n await this.#refreshSkills(connection)\n } catch {\n } finally {\n connection?.close()\n }\n }\n\n async #openScratchConnection(): Promise<AppServerConnection> {\n const connection = this.#config.connectFn({ env: this.#childEnv() })\n try {\n await connection.request('initialize', INITIALIZE_PARAMS)\n connection.notify('initialized')\n return connection\n } catch (error) {\n connection.close()\n throw error\n }\n }\n\n sendMessage(text: string, attachments?: readonly AttachmentInput[]): void {\n if (this.#closed) {\n throw new Error('session is closed')\n }\n if (text.trim() === '/clear' && !attachments?.length) {\n void this.clearContext().catch((error: unknown) => {\n this.#emit({\n type: 'session_error',\n message: `could not clear the conversation: ${error instanceof Error ? error.message : String(error)}`,\n })\n })\n return\n }\n const input = this.#buildInput(text, attachments ?? [])\n const echo = () =>\n this.#emit({\n type: 'user_message',\n message: { role: 'user', content: text },\n parentToolUseId: null,\n attachments: attachments?.length ? attachments.map(attachmentRef) : undefined,\n uuid: randomUUID(),\n })\n if (this.#backfillPending) {\n this.#turnChain = this.#turnChain.then(echo)\n } else {\n echo()\n }\n this.#queue.push({ input })\n this.#scheduleTurn()\n }\n\n #buildInput(text: string, attachments: readonly AttachmentInput[]): AppServerUserInput[] {\n const parts: AppServerUserInput[] = []\n for (const attachment of attachments) {\n const mediaType = normalizeMediaType(attachment.mediaType)\n switch (attachmentKind(mediaType)) {\n case 'image': {\n this.#imageDir ??= join(tmpdir(), `workerdeck-codex-${this.id}`)\n mkdirSync(this.#imageDir, { recursive: true })\n const ext = mediaType.split('/')[1] ?? 'bin'\n const path = join(this.#imageDir, `${attachment.id}.${ext}`)\n writeFileSync(path, Buffer.from(attachment.data, 'base64'))\n parts.push({ type: 'localImage', path })\n break\n }\n case 'text': {\n parts.push({\n type: 'text',\n text:\n `<attachment name=\"${attachment.name}\" type=\"${mediaType}\">\\n` +\n `${Buffer.from(attachment.data, 'base64').toString('utf8')}\\n</attachment>`,\n })\n break\n }\n default: {\n throw new Error(`unsupported attachment media type for the codex engine: ${attachment.mediaType}`)\n }\n }\n }\n if (text) {\n parts.push({ type: 'text', text })\n }\n return parts\n }\n\n resolvePermission(requestId: string, decision: PermissionDecision): boolean {\n const pending = this.#approvals.get(requestId)\n if (!pending) {\n return false\n }\n this.#settleApproval(requestId, pending, decision, 'client')\n return true\n }\n\n async interrupt(): Promise<void> {\n for (const [id, pending] of this.#approvals) {\n this.#settleApproval(id, pending, { behavior: 'deny', message: 'interrupted', interrupt: true }, 'policy')\n }\n await this.#interruptTurn()\n await this.#turnChain\n }\n\n async clearContext(): Promise<void> {\n if (this.#closed) {\n throw new Error('session is closed')\n }\n const run = this.#turnChain.then(() => this.#clearNow())\n this.#turnChain = run.then(\n () => undefined,\n () => undefined,\n )\n await run\n }\n\n async #clearNow(): Promise<void> {\n if (this.#closed) {\n throw new Error('session is closed')\n }\n const previousThread = this.#sdkSessionId\n this.#sdkSessionId = undefined\n this.#threadLoaded = false\n if (this.#connection) {\n try {\n await this.#ensureThread()\n } catch (error) {\n this.#sdkSessionId = previousThread\n this.#threadLoaded = false\n throw error\n }\n }\n for (const agent of this.#agents.threadIds()) {\n this.#clearedThreads.add(agent)\n }\n this.#agents.forget()\n for (const [id, pending] of this.#approvals) {\n this.#settleApproval(id, pending, { behavior: 'deny', message: 'the conversation was cleared' }, 'policy')\n }\n this.#resumedHistory = undefined\n this.#emit({ type: 'conversation_reset', sdkSessionId: this.#sdkSessionId })\n }\n\n async #interruptTurn(): Promise<void> {\n const active = this.#activeTurn\n const connection = this.#connection\n if (active && !active.settled) {\n active.interrupted = true\n if (connection && active.turnId && this.#sdkSessionId) {\n try {\n await connection.request('turn/interrupt', {\n threadId: this.#sdkSessionId,\n turnId: active.turnId,\n })\n } catch {}\n } else if (connection) {\n // No turn id yet: nothing to address the interrupt to, so end the child. The thread\n // survives on disk and the next message respawns into it.\n connection.close()\n if (this.#connection === connection) {\n this.#connection = undefined\n }\n active.reject(new Error('interrupted'))\n }\n }\n }\n\n async setPermissionMode(mode: PermissionMode): Promise<void> {\n if (!ENGINE_CAPABILITIES.codex.permissionModes.includes(mode)) {\n throw new Error(`permission mode '${mode}' is not supported by the codex engine`)\n }\n if (this.#activeTurn) {\n throw new Error(\"cannot change the permission mode mid-turn (the running turn's sandbox is fixed)\")\n }\n this.#permissionMode = mode\n this.#emit({ type: 'permission_mode_changed', mode })\n }\n\n async setModel(model?: string): Promise<void> {\n if (this.#activeTurn) {\n throw new Error(\"cannot change the model mid-turn (the running turn's model is fixed)\")\n }\n this.#model = model\n this.#emit({ type: 'model_changed', model })\n }\n\n fail(message: string): void {\n if (this.#closed) {\n return\n }\n this.#emit({ type: 'session_error', message })\n this.#setStatus('failed')\n this.close('error')\n }\n\n close(reason: 'client' | 'server' | 'error' = 'client'): void {\n if (this.#closed) {\n return\n }\n this.#closed = true\n this.#queue.length = 0\n for (const [id, pending] of this.#approvals) {\n this.#settleApproval(id, pending, { behavior: 'deny', message: 'Session closed' }, 'policy')\n }\n this.#connection?.close()\n this.#connection = undefined\n this.#agents.sweep()\n this.#activeTurn?.reject(new Error('session closed'))\n if (this.#imageDir) {\n try {\n rmSync(this.#imageDir, { recursive: true, force: true })\n } catch {}\n }\n this.#emit({ type: 'session_closed', reason })\n this.#setStatus('closed')\n }\n\n eventAt(seq: number): SessionEvent | undefined {\n return this.#log.at(seq)\n }\n\n subscribe(listener: SessionEventListener, afterSeq = 0, options?: SubscribeOptions): () => void {\n return this.#subscribers.subscribe(this.#log.events, listener, afterSeq, options, this.#log.resetSeq)\n }\n\n #scheduleTurn(): void {\n this.#turnChain = this.#turnChain.then(() => this.#runTurn())\n }\n\n async #readWorkspaceWrite(connection: AppServerConnection): Promise<void> {\n this.#workspaceWrite = undefined\n try {\n const result = (await connection.request('config/read', { cwd: this.#cwd })) as {\n config?: { sandbox_workspace_write?: Record<string, unknown> | null } | null\n }\n const block = result?.config?.sandbox_workspace_write\n if (!block) {\n return\n }\n const roots = block.writable_roots\n this.#workspaceWrite = {\n writableRoots: Array.isArray(roots) ? roots.filter((r): r is string => typeof r === 'string') : [],\n networkAccess: block.network_access === true,\n excludeTmpdirEnvVar: block.exclude_tmpdir_env_var === true,\n excludeSlashTmp: block.exclude_slash_tmp === true,\n }\n } catch {}\n }\n\n #turnSandboxPolicy(): { type: string } | undefined {\n const policy = TURN_SANDBOX_BY_MODE[this.#permissionMode]\n if (policy?.type !== 'workspaceWrite' || !this.#workspaceWrite) {\n return policy\n }\n return { type: 'workspaceWrite', ...this.#workspaceWrite }\n }\n\n async #ensureThread(): Promise<AppServerConnection> {\n if (this.#closed) {\n throw new Error('session is closed')\n }\n let connection = this.#connection\n if (!connection) {\n connection = this.#config.connectFn({ env: this.#childEnv() })\n this.#connection = connection\n this.#threadLoaded = false\n connection.onNotification((method, params) => this.#handleNotification(method, params))\n connection.onRequest((method, params, id) => this.#answerServerRequest(method, params, id))\n connection.onClose((message) => {\n if (this.#connection === connection) {\n this.#connection = undefined\n this.#threadLoaded = false\n }\n for (const [id, pending] of this.#approvals) {\n this.#settleApproval(id, pending, { behavior: 'deny', message }, 'policy')\n }\n this.#agents.sweep()\n this.#activeTurn?.reject(new Error(message))\n })\n try {\n await connection.request('initialize', INITIALIZE_PARAMS)\n } catch (error) {\n // Don't leave a half-initialized child around: the next message must respawn from scratch.\n connection.close()\n if (this.#connection === connection) {\n this.#connection = undefined\n }\n if (error instanceof JsonRpcError) {\n throw new Error(\n 'codex app-server rejected initialize (capabilities.experimentalApi: true — required ' +\n 'for the granular approval policy, and WorkerDeck has no non-experimental fallback): ' +\n error.message,\n { cause: error },\n )\n }\n throw error\n }\n connection.notify('initialized')\n await this.#readWorkspaceWrite(connection)\n }\n if (!this.#threadLoaded) {\n const options: Record<string, unknown> = {\n cwd: this.#cwd,\n approvalPolicy: APPROVAL_POLICY_BY_MODE[this.#permissionMode],\n sandbox: THREAD_SANDBOX_BY_MODE[this.#permissionMode],\n approvalsReviewer: APPROVALS_REVIEWER_BY_MODE[this.#permissionMode],\n }\n if (this.#model) {\n options.model = this.#model\n }\n const resuming = this.#sdkSessionId !== undefined\n const result = (\n resuming\n ? await connection.request('thread/resume', { threadId: this.#sdkSessionId, ...options })\n : await connection.request('thread/start', options)\n ) as {\n thread?: { id?: string; turns?: AppServerHistoryTurn[] }\n model?: string | null\n reasoningEffort?: string | null\n turnsBackwardsCursor?: string | null\n }\n if (typeof result?.thread?.id === 'string') {\n this.#sdkSessionId = result.thread.id\n }\n if (typeof result?.model === 'string') {\n this.#resolvedModel = result.model\n }\n if (typeof result?.reasoningEffort === 'string') {\n this.#resolvedEffort = result.reasoningEffort\n }\n if (resuming && this.#backfillPending && !this.#resumedHistory) {\n this.#resumedHistory = {\n turns: Array.isArray(result?.thread?.turns) ? result.thread.turns : [],\n partial: typeof result?.turnsBackwardsCursor === 'string',\n }\n }\n this.#threadLoaded = true\n }\n void this.#refreshSkills(connection)\n return connection\n }\n\n async #refreshSkills(connection: AppServerConnection): Promise<void> {\n if (this.#skillsRefresh) {\n return this.#skillsRefresh\n }\n const run = (async () => {\n try {\n const result = (await connection.request('skills/list', {\n cwds: [this.#cwd],\n })) as AppServerSkillsListResponse\n if (this.#closed) {\n return\n }\n const entries = Array.isArray(result?.data) ? result.data : []\n const seen = new Set<string>()\n const skills: SkillInfo[] = []\n for (const entry of entries) {\n for (const skill of entry?.skills ?? []) {\n if (typeof skill?.name !== 'string' || seen.has(skill.name)) {\n continue\n }\n seen.add(skill.name)\n skills.push(skillInfo(skill))\n }\n }\n skills.sort((a, b) => a.name.localeCompare(b.name))\n const fingerprint = JSON.stringify(skills)\n if (fingerprint === this.#skillsFingerprint) {\n return\n }\n this.#skillsFingerprint = fingerprint\n this.#emit({ type: 'skills', skills })\n } catch {\n } finally {\n this.#skillsRefresh = undefined\n }\n })()\n this.#skillsRefresh = run\n return run\n }\n\n async mcpServers(): Promise<McpServerStatusInfo[] | undefined> {\n if (this.#closed) {\n return undefined\n }\n const live = this.#connection\n let scratch: AppServerConnection | undefined\n try {\n const connection = live ?? (scratch = await this.#openScratchConnection())\n const result = (await connection.request('mcpServerStatus/list', {})) as AppServerMcpServerStatusResponse\n return (result?.data ?? []).map((server) => mcpServerInfo(server, this.#mcpStatus.get(server.name)))\n } catch {\n return undefined\n } finally {\n scratch?.close()\n }\n }\n\n #emitFileProduced(path: string, toolUseId: string): void {\n if (this.#producedPaths.has(path)) {\n return\n }\n this.#producedPaths.add(path)\n let bytes: number | undefined\n try {\n const stat = statSync(path)\n if (stat.isFile()) {\n bytes = stat.size\n }\n } catch {}\n this.#emit({\n type: 'file_produced',\n fileId: producedFileId(path),\n path,\n ...(producedMediaType(path) ? { mediaType: producedMediaType(path) } : {}),\n ...(bytes !== undefined ? { bytes } : {}),\n toolUseId,\n })\n }\n\n async #backfillHistory(): Promise<void> {\n try {\n if (this.#closed) {\n return\n }\n const connection = await this.#ensureThread()\n const resumed = this.#resumedHistory\n this.#resumedHistory = undefined\n let turns = resumed?.turns ?? []\n let partialReason: string | undefined\n if (resumed?.partial) {\n try {\n const read = (await connection.request('thread/read', {\n threadId: this.#sdkSessionId,\n includeTurns: true,\n })) as { thread?: { turns?: AppServerHistoryTurn[] } }\n const full = read?.thread?.turns\n if (Array.isArray(full) && full.length >= turns.length) {\n turns = full\n } else {\n partialReason = 'thread/read returned less history than the resume page'\n }\n } catch (error) {\n partialReason = error instanceof Error ? error.message : String(error)\n }\n }\n if (partialReason) {\n this.#emit({\n type: 'session_error',\n message: `Resumed thread history is incomplete — older turns could not be loaded (${partialReason})`,\n })\n }\n this.#replayTurns(turns)\n } catch {\n } finally {\n this.#backfillPending = false\n this.#setStatus('idle')\n }\n }\n\n #replayTurns(turns: readonly AppServerHistoryTurn[]): void {\n for (const turn of turns) {\n if (this.#closed) {\n return\n }\n const state = this.#newTurnState()\n this.#replayingHistory = true\n try {\n for (const item of turn.items ?? []) {\n if (item.type === 'userMessage') {\n const text = historyUserText(item)\n if (!text) {\n continue\n }\n this.#emit({\n type: 'user_message',\n message: { role: 'user', content: text },\n parentToolUseId: null,\n uuid: `${state.nonce}:${item.id}`,\n })\n continue\n }\n this.#handleItemCompleted(item, state)\n }\n } finally {\n this.#replayingHistory = false\n }\n }\n }\n\n #newTurnState(): ActiveTurn {\n return {\n nonce: randomUUID(),\n interrupted: false,\n usage: {\n inputTokens: 0,\n cachedInputTokens: 0,\n cacheWriteInputTokens: 0,\n outputTokens: 0,\n reasoningOutputTokens: 0,\n totalTokens: 0,\n },\n sawUsage: false,\n toolUseEmitted: new Set(),\n sectionIndex: new Map(),\n settled: false,\n resolve: () => {},\n reject: () => {},\n }\n }\n\n async #runTurn(): Promise<void> {\n if (this.#closed) {\n return\n }\n const turn = this.#queue.shift()\n if (!turn) {\n return\n }\n this.#setStatus('running')\n const startedAt = Date.now()\n const active: ActiveTurn = this.#newTurnState()\n const outcome = new Promise<AppServerTurn>((resolve, reject) => {\n active.resolve = (turnResult) => {\n if (active.settled) {\n return\n }\n active.settled = true\n resolve(turnResult)\n }\n active.reject = (error) => {\n if (active.settled) {\n return\n }\n active.settled = true\n reject(error)\n }\n })\n this.#activeTurn = active\n try {\n const connection = await this.#ensureThread()\n const params: Record<string, unknown> = {\n threadId: this.#sdkSessionId,\n input: turn.input,\n cwd: this.#cwd,\n approvalPolicy: APPROVAL_POLICY_BY_MODE[this.#permissionMode],\n sandboxPolicy: this.#turnSandboxPolicy(),\n approvalsReviewer: APPROVALS_REVIEWER_BY_MODE[this.#permissionMode],\n }\n const model = this.#model ?? this.#resolvedModel\n if (model) {\n params.model = model\n }\n const effort = this.#reasoningEffort ?? this.#resolvedEffort\n if (effort) {\n params.effort = effort\n }\n // The terminal signal is the `turn/completed` notification; this response's timing is\n // unspecified, so it only contributes the turn id or a failure.\n connection.request('turn/start', params).then(\n (result) => {\n const started = (result as { turn?: AppServerTurn })?.turn\n if (!started) {\n return\n }\n active.turnId ??= started.id\n if (started.status && started.status !== 'inProgress') {\n active.resolve(started)\n }\n },\n (error: unknown) => active.reject(error instanceof Error ? error : new Error(String(error))),\n )\n const result = await outcome\n if (this.#closed) {\n return\n }\n if (result.status === 'completed') {\n this.#finishTurn('success', startedAt, active)\n } else {\n const reason =\n result.status === 'interrupted'\n ? 'interrupted'\n : (result.error?.message ?? active.lastError ?? 'codex app-server ended the turn without a result')\n this.#finishTurn('failure', startedAt, active, [reason])\n }\n } catch (error) {\n if (this.#closed) {\n return\n }\n const message = error instanceof Error ? error.message : String(error)\n this.#finishTurn('failure', startedAt, active, [active.interrupted ? 'interrupted' : message])\n } finally {\n if (this.#activeTurn === active) {\n this.#activeTurn = undefined\n }\n }\n }\n\n #handleNotification(method: string, params: unknown): void {\n if (this.#closed) {\n return\n }\n if (THREAD_SCOPED_NOTIFICATIONS.has(method) && !this.#isRootThread(params)) {\n if (method === 'turn/completed') {\n this.#settleAgentTurn(params)\n } else if (method === 'turn/started') {\n const threadId = this.#threadIdOf(params)\n const record = threadId ? this.#agents.get(threadId) : undefined\n if (record && record.status !== 'running') {\n this.#agents.revive(record)\n }\n }\n return\n }\n this.#notifications[method]?.(params)\n }\n\n #isRootThread(params: unknown): boolean {\n const threadId = this.#threadIdOf(params)\n if (threadId === undefined) {\n return true\n }\n return threadId === this.#sdkSessionId\n }\n\n #threadIdOf(params: unknown): string | undefined {\n const threadId = (params as { threadId?: unknown })?.threadId\n return typeof threadId === 'string' ? threadId : undefined\n }\n\n #agentFor(params: unknown): CodexAgent | undefined {\n const threadId = this.#threadIdOf(params)\n if (threadId === undefined || threadId === this.#sdkSessionId) {\n return undefined\n }\n const known = this.#agents.get(threadId)\n if (known) {\n return known\n }\n if (this.#clearedThreads.has(threadId)) {\n return undefined\n }\n const nonce = this.#activeTurn?.nonce ?? 'codex'\n const record = this.#agents.open(threadId, `${nonce}:agent:${threadId}`, undefined, Date.now())\n record.anchored = true\n this.#emitToolUse(record.toolUseId, CODEX_AGENT_TOOL, { agentThreadId: threadId })\n return record\n }\n\n #settleAgentTurn(params: unknown): void {\n const threadId = this.#threadIdOf(params)\n const record = threadId ? this.#agents.get(threadId) : undefined\n if (!record || record.status !== 'running') {\n return\n }\n const turn = (params as { turn?: AppServerTurn })?.turn\n const status = turn?.status === 'completed' ? 'done' : 'failed'\n this.#agents.settle(record, status)\n const report = (turn ? turnReport(turn) : undefined) ?? turn?.error?.message ?? (status === 'done' ? '' : (turn?.status ?? 'failed'))\n this.#emitToolResult(record.toolUseId, report, status === 'failed')\n }\n\n #reasoningDelta(method: string): (params: unknown) => void {\n return (params) => {\n const active = this.#activeTurn\n if (!active) {\n return\n }\n const payload = params as {\n delta?: string\n itemId?: string\n contentIndex?: number\n summaryIndex?: number\n }\n if (typeof payload?.delta !== 'string' || !payload.delta) {\n return\n }\n const index = payload.contentIndex ?? payload.summaryIndex ?? 0\n const agent = this.#agentFor(params)\n // Both the agent and the method ride the key. sectionIndex lives on the root turn, and whether\n // app-server item ids are unique across a turn's threads is unverified (docs/GOTCHAS.md\n // §Codex), so two agents must not be able to share a section counter; the two reasoning\n // streams must never share a section boundary either.\n const key = `${agent?.toolUseId ?? ''}:${payload.itemId ?? ''}:${method}`\n const previous = active.sectionIndex.get(key)\n active.sectionIndex.set(key, index)\n const separator = previous !== undefined && index > previous ? '\\n\\n' : ''\n this.#emitDelta({ type: 'thinking_delta', thinking: separator + payload.delta }, agent?.toolUseId ?? null)\n }\n }\n\n #itemProgress = (params: unknown): void => {\n const active = this.#activeTurn\n if (!active) {\n return\n }\n const item = (params as { item?: AppServerItem })?.item\n if (item) {\n this.#handleItemProgress(item, active, this.#agentFor(params))\n }\n }\n\n readonly #notifications: Record<string, (params: unknown) => void> = {\n 'thread/started': (params) => {\n const thread = (params as { thread?: { id?: string } })?.thread\n if (typeof thread?.id === 'string') {\n this.#sdkSessionId = thread.id\n }\n },\n 'turn/started': (params) => {\n const active = this.#activeTurn\n const turn = (params as { turn?: AppServerTurn })?.turn\n if (active && turn && !active.turnId) {\n active.turnId = turn.id\n }\n },\n 'turn/completed': (params) => {\n const active = this.#activeTurn\n const turn = (params as { turn?: AppServerTurn })?.turn\n if (!active || !turn) {\n return\n }\n if (active.turnId && turn.id && turn.id !== active.turnId) {\n return\n }\n active.resolve(turn)\n },\n 'item/started': this.#itemProgress,\n 'item/updated': this.#itemProgress,\n 'item/completed': (params) => {\n const active = this.#activeTurn\n if (!active) {\n return\n }\n const item = (params as { item?: AppServerItem })?.item\n if (item) {\n this.#handleItemCompleted(item, active, this.#agentFor(params))\n }\n },\n 'item/agentMessage/delta': (params) => {\n if (!this.#activeTurn) {\n return\n }\n const delta = (params as { delta?: string })?.delta\n if (typeof delta === 'string' && delta) {\n this.#emitDelta({ type: 'text_delta', text: delta }, this.#agentFor(params)?.toolUseId ?? null)\n }\n },\n 'item/reasoning/textDelta': this.#reasoningDelta('item/reasoning/textDelta'),\n 'item/reasoning/summaryTextDelta': this.#reasoningDelta('item/reasoning/summaryTextDelta'),\n 'thread/tokenUsage/updated': (params) => {\n const active = this.#activeTurn\n if (!active) {\n return\n }\n const last = (params as AppServerTokenUsageUpdate)?.tokenUsage?.last\n if (!last) {\n return\n }\n active.sawUsage = true\n active.usage.inputTokens += last.inputTokens ?? 0\n active.usage.cachedInputTokens += last.cachedInputTokens ?? 0\n active.usage.cacheWriteInputTokens = (active.usage.cacheWriteInputTokens ?? 0) + (last.cacheWriteInputTokens ?? 0)\n active.usage.outputTokens += last.outputTokens ?? 0\n active.usage.reasoningOutputTokens += last.reasoningOutputTokens ?? 0\n const update = params as AppServerTokenUsageUpdate\n active.contextTokens = last.totalTokens ?? undefined\n active.contextWindow = update.tokenUsage?.modelContextWindow ?? undefined\n },\n 'mcpServer/startupStatus/updated': (params) => {\n const update = params as AppServerMcpStatusUpdate\n if (typeof update?.name !== 'string') {\n return\n }\n this.#mcpStatus.set(update.name, {\n status: typeof update.status === 'string' ? update.status : 'starting',\n ...(update.error ? { error: update.error } : {}),\n ...(update.failureReason ? { failureReason: update.failureReason } : {}),\n })\n },\n 'skills/changed': () => {\n const connection = this.#connection\n if (connection) {\n void this.#refreshSkills(connection)\n }\n },\n 'account/rateLimits/updated': (params) => {\n this.#emitRateLimits((params as { rateLimits?: AppServerRateLimits })?.rateLimits)\n },\n 'turn/plan/updated': (params) => {\n const active = this.#activeTurn\n if (!active) {\n return\n }\n const plan = (params as AppServerPlanUpdate)?.plan\n if (!Array.isArray(plan)) {\n return\n }\n this.#emit({\n type: 'sdk_event',\n payload: {\n type: 'codex.todo_list',\n id: `${active.nonce}:plan`,\n items: plan.map((step) => ({ text: step.step, completed: step.status === 'completed' })),\n },\n })\n },\n 'serverRequest/resolved': (params) => {\n const requestId = (params as { requestId?: string | number })?.requestId\n if (requestId === undefined) {\n return\n }\n for (const [id, pending] of this.#approvals) {\n if (pending.wireId === requestId) {\n // Reported as a deny because codex's own choice is unknowable; the message says who decided.\n this.#settleApproval(id, pending, { behavior: 'deny', message: 'resolved by codex' }, 'policy')\n return\n }\n }\n },\n // Mostly retry noise (`willRetry: true`); the last message is what explains a turn that\n // fails without carrying its own error.\n error: (params) => {\n const active = this.#activeTurn\n const error = (params as { error?: { message?: string } })?.error\n if (active && typeof error?.message === 'string') {\n active.lastError = error.message\n }\n },\n }\n\n async #answerServerRequest(method: string, params: unknown, wireId?: string | number): Promise<unknown> {\n const channel = APPROVAL_CHANNELS[method]\n if (channel) {\n return this.#requestApproval(channel, method, params, wireId)\n }\n throw new JsonRpcError(-32601, `workerdeck does not handle server request '${method}'`)\n }\n\n #requestApproval(channel: ApprovalChannel, method: string, params: unknown, wireId: string | number | undefined): Promise<unknown> {\n if (method === 'item/tool/requestUserInput') {\n const behavior = this.#config.questionBehavior ?? 'ask'\n if (behavior !== 'ask') {\n return Promise.resolve(this.#resolveQuestionByPolicy(channel, params, behavior))\n }\n }\n const id = randomUUID()\n const timeoutMs = this.#config.approvalTimeoutMs ?? this.#config.defaultApprovalTimeoutMs ?? DEFAULT_APPROVAL_TIMEOUT_MS\n const itemId = channel.itemId(params)\n const request: PermissionRequest = {\n id,\n ...channel.describe(params),\n toolUseId: itemId ? `${this.#activeTurn?.nonce ?? 'codex'}:${itemId}` : id,\n expiresAt: Date.now() + timeoutMs,\n }\n return new Promise<unknown>((resolve) => {\n const timer = setTimeout(() => {\n const pending = this.#approvals.get(id)\n if (pending) {\n this.#settleApproval(id, pending, { behavior: 'deny', message: 'Approval timed out' }, 'timeout')\n }\n }, timeoutMs)\n this.#approvals.set(id, {\n request,\n channel,\n params,\n offered: offeredDecisions(params),\n wireId,\n timer,\n respond: resolve,\n })\n this.#emit({ type: 'permission_requested', request })\n if (this.#activeTurn) {\n this.#setStatus('awaiting_approval')\n }\n })\n }\n\n #resolveQuestionByPolicy(channel: ApprovalChannel, params: unknown, mode: 'auto' | 'deny'): unknown {\n const itemId = channel.itemId(params)\n const request: PermissionRequest = {\n id: randomUUID(),\n ...channel.describe(params),\n toolUseId: itemId ? `${this.#activeTurn?.nonce ?? 'codex'}:${itemId}` : randomUUID(),\n }\n this.#emit({ type: 'permission_requested', request })\n if (mode === 'deny') {\n this.#emit({\n type: 'permission_resolved',\n requestId: request.id,\n behavior: 'deny',\n resolvedBy: 'policy',\n message: 'Interactive questions are disabled for this session — choose the most reasonable option yourself and continue.',\n })\n return { answers: {} }\n }\n const answers: Record<string, { answers: string[] }> = {}\n for (const question of (params as AppServerUserInputParams).questions ?? []) {\n const first = question.options?.[0]?.label\n if (first) {\n answers[question.id] = { answers: [first] }\n }\n }\n this.#emit({\n type: 'permission_resolved',\n requestId: request.id,\n behavior: 'allow',\n resolvedBy: 'policy',\n })\n return { answers }\n }\n\n #settleApproval(id: string, pending: PendingCodexApproval, decision: PermissionDecision, resolvedBy: PermissionDecisionSource): void {\n clearTimeout(pending.timer)\n this.#approvals.delete(id)\n let behavior = decision.behavior\n let message = decision.behavior === 'deny' ? (decision.message ?? 'Denied') : undefined\n let sent: { response: unknown; decision?: string }\n if (decision.behavior === 'allow') {\n const allowed = pending.channel.allow(pending.params, decision.updatedInput, pending.offered)\n if (allowed) {\n sent = allowed\n } else {\n behavior = 'deny'\n resolvedBy = 'policy'\n message = 'codex offered no plain accept for this request (only broader session/policy grants) — denied instead'\n sent = pending.channel.deny(pending.params, false, pending.offered)\n }\n } else {\n sent = pending.channel.deny(pending.params, decision.interrupt === true, pending.offered)\n }\n pending.respond(sent.response)\n this.#emit({ type: 'permission_resolved', requestId: id, behavior, resolvedBy, message })\n if (behavior === 'deny' && decision.behavior === 'deny' && decision.interrupt && sent.decision !== 'cancel') {\n void this.#interruptTurn()\n }\n if (!this.#closed && this.#approvals.size === 0 && this.#status === 'awaiting_approval') {\n this.#setStatus('running')\n }\n }\n\n #handleItemProgress(item: AppServerItem, active: ActiveTurn, agent?: CodexAgent): void {\n const id = `${active.nonce}:${item.id}`\n if (item.type === 'subAgentActivity') {\n this.#itemCompleted.subAgentActivity(item, active, id, agent)\n return\n }\n if (item.type === 'commandExecution' && !active.toolUseEmitted.has(id)) {\n active.toolUseEmitted.add(id)\n this.#emitToolUse(id, 'CodexCommand', { command: item.command }, agent)\n return\n }\n if (item.type === 'mcpToolCall' && !active.toolUseEmitted.has(id)) {\n active.toolUseEmitted.add(id)\n this.#emitToolUse(id, `mcp__${item.server}__${item.tool}`, item.arguments, agent)\n return\n }\n if (item.type === 'collabAgentToolCall' && !active.toolUseEmitted.has(id)) {\n active.toolUseEmitted.add(id)\n this.#emitToolUse(id, CODEX_COLLAB_TOOL, collabInput(item), agent)\n return\n }\n if (item.type === 'imageGeneration' && !active.toolUseEmitted.has(id)) {\n active.toolUseEmitted.add(id)\n this.#emitToolUse(id, CODEX_IMAGE_TOOL, imageGenerationInput(item), agent)\n if (item.savedPath) {\n this.#emitFileProduced(item.savedPath, id)\n }\n }\n }\n\n #handleItemCompleted(item: AppServerItem, active: ActiveTurn, agent?: CodexAgent): void {\n const id = `${active.nonce}:${item.id}`\n const handler = this.#itemCompleted[item.type] as\n | ((item: AppServerItem, active: ActiveTurn, id: string, agent?: CodexAgent) => void)\n | undefined\n if (handler) {\n handler(item, active, id, agent)\n return\n }\n const unknown = item as AppServerUnknownItem\n this.#emit({ type: 'sdk_event', payload: { type: `codex.${unknown.type}`, item: unknown } })\n }\n\n readonly #itemCompleted: {\n [K in AppServerItem['type']]: (item: Extract<AppServerItem, { type: K }>, active: ActiveTurn, id: string, agent?: CodexAgent) => void\n } = {\n userMessage: (item, active, _id, agent) => {\n if (!agent) {\n return\n }\n const text = historyUserText(item)\n if (!text) {\n return\n }\n this.#emit({\n type: 'user_message',\n message: { role: 'user', content: text },\n parentToolUseId: agent.toolUseId,\n uuid: `${active.nonce}:${item.id}`,\n })\n },\n agentMessage: (item, active, id, agent) => {\n const text = typeof item.text === 'string' ? item.text : ''\n this.#emitAssistant(id, [{ type: 'text', text }], agent?.toolUseId ?? null)\n if (!agent) {\n active.finalText = text\n }\n },\n reasoning: (item, _active, id, agent) => {\n const summary = Array.isArray(item.summary) ? item.summary.filter(Boolean) : []\n const content = Array.isArray(item.content) ? item.content.filter(Boolean) : []\n const thinking = (summary.length > 0 ? summary : content).join('\\n\\n')\n if (thinking) {\n this.#emitAssistant(id, [{ type: 'thinking', thinking }], agent?.toolUseId ?? null)\n }\n },\n commandExecution: (item, active, id, agent) => {\n if (!active.toolUseEmitted.has(id)) {\n active.toolUseEmitted.add(id)\n this.#emitToolUse(id, 'CodexCommand', { command: item.command }, agent)\n }\n const exitCode = item.exitCode ?? undefined\n const failed = item.status === 'failed' || item.status === 'declined' || (exitCode !== undefined && exitCode !== 0)\n const output = (item.aggregatedOutput ?? '') + (exitCode !== undefined && exitCode !== 0 ? `\\n(exit code ${exitCode})` : '')\n this.#emitToolResult(id, output, failed, undefined, agent?.toolUseId ?? null)\n },\n fileChange: (item, _active, id, agent) => {\n this.#emitToolUse(id, 'CodexFileChange', { changes: item.changes }, agent)\n const lines = item.changes.map((change) => {\n const kind = typeof change.kind === 'string' ? change.kind : change.kind?.type\n return `${kind ?? 'change'}: ${change.path}`\n })\n // A patch names one file, and a multi-file edit has no honest way to say which.\n const only = item.changes.length === 1 ? item.changes[0] : undefined\n this.#emitToolResult(\n id,\n lines.join('\\n') || item.status,\n item.status === 'failed' || item.status === 'declined',\n only?.diff ? parseUnifiedDiff(only.diff, only.path) : undefined,\n agent?.toolUseId ?? null,\n )\n },\n mcpToolCall: (item, active, id, agent) => {\n if (!active.toolUseEmitted.has(id)) {\n active.toolUseEmitted.add(id)\n this.#emitToolUse(id, `mcp__${item.server}__${item.tool}`, item.arguments, agent)\n }\n const isError = (item.error !== undefined && item.error !== null) || item.status === 'failed'\n this.#emitToolResult(\n id,\n item.error?.message ?? (item.result === undefined || item.result === null ? '' : JSON.stringify(item.result)),\n isError,\n undefined,\n agent?.toolUseId ?? null,\n )\n },\n webSearch: (item, _active, id, agent) => {\n this.#emitToolUse(id, 'CodexWebSearch', { query: item.query }, agent)\n this.#emitToolResult(id, '', false, undefined, agent?.toolUseId ?? null)\n },\n imageGeneration: (item, active, id, agent) => {\n // Re-emitted without the `toolUseEmitted` guard: `savedPath` only exists now, and the\n // reducer upserts a tool_use by id, so this replaces the in-progress card's input.\n active.toolUseEmitted.add(id)\n this.#emitToolUse(id, CODEX_IMAGE_TOOL, imageGenerationInput(item), agent)\n if (item.savedPath) {\n this.#emitFileProduced(item.savedPath, id)\n }\n const lines = [\n item.savedPath ? `Saved to ${item.savedPath}` : 'No saved path reported',\n ...(shortResult(item.result) ? [item.result] : []),\n ]\n this.#emitToolResult(id, lines.join('\\n'), item.status === 'failed', undefined, agent?.toolUseId ?? null)\n },\n imageView: (item, _active, id, agent) => {\n this.#emitToolUse(id, 'CodexImageView', { path: item.path }, agent)\n this.#emitToolResult(id, item.path, false, undefined, agent?.toolUseId ?? null)\n },\n // Codex auto-compacts silently. Before this arm the item fell through to `sdk_event`, which no\n // client renders — so the conversation kept going, the model quietly stopped being able to see\n // the top of it, and the transcript said nothing had happened.\n contextCompaction: (_item, _active, id, agent) => {\n this.#emit({ type: 'context_compacted', uuid: id, parentToolUseId: agent?.toolUseId ?? null })\n },\n subAgentActivity: (item, _active, id, agent) => {\n if (this.#replayingHistory) {\n if (item.kind !== 'started') {\n return\n }\n this.#emitToolUse(\n id,\n CODEX_AGENT_TOOL,\n {\n ...(agentName(item.agentPath) ? { subagent_type: agentName(item.agentPath) } : {}),\n agentThreadId: item.agentThreadId,\n ...(item.agentPath ? { agentPath: item.agentPath } : {}),\n },\n agent,\n )\n // A resumed thread's history holds the root's items only, so a replayed agent row closes\n // neutrally: the one claim history cannot back is that the agent failed.\n this.#emitToolResult(\n id,\n \"(ran in its own thread — its work is not part of this thread's stored history)\",\n false,\n undefined,\n agent?.toolUseId ?? null,\n )\n return\n }\n const record = this.#agents.get(item.agentThreadId) ?? this.#agents.open(item.agentThreadId, id, undefined, Date.now())\n const name = agentName(item.agentPath)\n const relabel = record.agentType === undefined && name !== undefined\n if (relabel) {\n record.agentType = name\n }\n if (!record.anchored || relabel) {\n record.anchored = true\n this.#emitToolUse(\n record.toolUseId,\n CODEX_AGENT_TOOL,\n {\n ...(record.agentType ? { subagent_type: record.agentType } : {}),\n agentThreadId: item.agentThreadId,\n ...(item.agentPath ? { agentPath: item.agentPath } : {}),\n },\n agent,\n )\n }\n if (item.kind === 'interrupted') {\n if (record.status === 'running') {\n this.#agents.settle(record, 'failed')\n this.#emitToolResult(record.toolUseId, 'interrupted', true)\n }\n return\n }\n if (item.kind !== 'started' && record.status !== 'running') {\n this.#agents.revive(record)\n }\n },\n collabAgentToolCall: (item, active, id, agent) => {\n if (!active.toolUseEmitted.has(id)) {\n active.toolUseEmitted.add(id)\n this.#emitToolUse(id, CODEX_COLLAB_TOOL, collabInput(item), agent)\n }\n if (item.status === 'inProgress') {\n return\n }\n const failed = item.status === 'failed' || item.status === 'declined'\n this.#emitToolResult(id, failed ? item.status : '', failed, undefined, agent?.toolUseId ?? null)\n },\n }\n\n #emitDelta(delta: { type: 'text_delta'; text: string } | { type: 'thinking_delta'; thinking: string }, parent: string | null): void {\n if (this.#config.includePartialMessages === false) {\n return\n }\n this.#emit({\n type: 'stream_delta',\n event: { type: 'content_block_delta', delta },\n parentToolUseId: parent,\n uuid: randomUUID(),\n })\n }\n\n #emitAssistant(uuid: string, content: ContentBlock[], parent: string | null): void {\n this.#emit({\n type: 'assistant_message',\n message: { role: 'assistant', content, model: this.#model ?? this.#resolvedModel },\n parentToolUseId: parent,\n uuid,\n })\n }\n\n #emitToolUse(id: string, name: string, input: unknown, agent?: CodexAgent): void {\n if (agent && !agent.counted.has(id)) {\n agent.counted.add(id)\n agent.toolCount += 1\n }\n this.#emit({\n type: 'assistant_message',\n message: {\n role: 'assistant',\n content: [{ type: 'tool_use', id, name, input }],\n model: this.#model ?? this.#resolvedModel,\n },\n parentToolUseId: agent?.toolUseId ?? null,\n uuid: `${id}-use`,\n })\n }\n\n #emitToolResult(toolUseId: string, content: string, isError: boolean, patch?: FilePatch, parent: string | null = null): void {\n this.#emit({\n type: 'user_message',\n message: {\n role: 'user',\n content: [{ type: 'tool_result', tool_use_id: toolUseId, content, is_error: isError || undefined }],\n },\n parentToolUseId: parent,\n synthetic: true,\n patch,\n uuid: `${toolUseId}-result`,\n })\n }\n\n #finishTurn(kind: 'success' | 'failure', startedAt: number, active: ActiveTurn, errors?: string[]): void {\n for (const [id, pending] of this.#approvals) {\n this.#settleApproval(id, pending, { behavior: 'deny', message: 'Turn ended' }, 'policy')\n }\n this.#numTurns += 1\n this.#totalCostUsd = 0\n const usage = active.sawUsage ? active.usage : undefined\n this.#emit({\n type: 'turn_result',\n subtype: kind === 'success' ? 'success' : 'error_during_execution',\n isError: kind !== 'success',\n durationMs: Date.now() - startedAt,\n numTurns: this.#numTurns,\n totalCostUsd: 0,\n result: kind === 'success' ? (active.finalText ?? '') : undefined,\n errors,\n usage: usage\n ? {\n input_tokens: Math.max(0, usage.inputTokens - usage.cachedInputTokens),\n output_tokens: usage.outputTokens + usage.reasoningOutputTokens,\n cache_creation_input_tokens: usage.cacheWriteInputTokens ?? 0,\n cache_read_input_tokens: usage.cachedInputTokens,\n }\n : undefined,\n })\n this.#emitContextUsage(active)\n this.#setStatus('idle')\n }\n\n #emitRateLimits(limits: AppServerRateLimits | undefined | null): void {\n if (!limits) {\n return\n }\n const status = limits.rateLimitReachedType ? 'rejected' : 'allowed'\n for (const window of [limits.primary, limits.secondary]) {\n if (!window || window.usedPercent === null || window.usedPercent === undefined) {\n continue\n }\n this.#emit({\n type: 'rate_limit',\n info: {\n status,\n rateLimitType: rateLimitWindowName(window.windowDurationMins),\n utilization: window.usedPercent,\n ...(typeof window.resetsAt === 'number' ? { resetsAt: window.resetsAt } : {}),\n },\n })\n }\n if (limits.planType && limits.planType !== this.#planType) {\n this.#planType = limits.planType\n this.#emit({ type: 'plan_info', subscriptionType: limits.planType })\n }\n }\n\n #emitContextUsage(active: ActiveTurn): void {\n const totalTokens = active.contextTokens\n const maxTokens = active.contextWindow\n if (totalTokens === undefined || !maxTokens || maxTokens <= 0) {\n return\n }\n this.#emit({\n type: 'context_usage',\n usage: {\n categories: [],\n totalTokens,\n maxTokens,\n percentage: Math.min(100, (totalTokens / maxTokens) * 100),\n model: this.#model ?? this.#resolvedModel,\n },\n })\n }\n\n #setStatus(status: SessionStatus, detail?: string): void {\n // Deduped on the (status, detail) pair: deduping on status alone would swallow a new detail\n // for an unchanged status, which is the one update a detail exists to carry.\n if (this.#status === status && this.#statusDetail === detail) {\n return\n }\n if (this.#status === 'closed' || this.#status === 'failed') {\n return\n }\n this.#status = status\n this.#statusDetail = detail\n this.#emit({ type: 'status_changed', status, detail })\n }\n\n #emit(body: SessionEventBody): void {\n if (this.#replayingHistory && (body.type === 'assistant_message' || body.type === 'user_message')) {\n body = { ...body, replay: true }\n }\n this.#subscribers.emit(this.#log.append(body))\n }\n}\n","import type { ModelCatalog } from '../adapter.ts'\n\n/**\n * The Codex engine's model catalog, seeded from the binary's own embedded model\n * table (see `provenance` for the version) — that table, not the SDK's stale\n * `ModelReasoningEffort` union, is the truth about which reasoning efforts each\n * model takes. Mapping decisions: the internal `codex-auto-review` row is dropped\n * (the codex analogue of the CLI's `default` sentinel), `primary` mirrors the\n * binary's own `visibility` field so both UIs group the way codex's picker does,\n * and `reasoningEfforts` carries `supported_reasoning_levels` verbatim — `max`\n * and `ultra` go beyond the SDK union, so trust the binary and keep strings open.\n *\n * **Refresh procedure** (release checklist): extract the embedded JSON from the\n * platform binary and diff. The two-hop resolve is NOT optional — under pnpm's\n * strict layout the platform package is a dependency of `@openai/codex` and\n * resolves only from that wrapper's location (MODULE_NOT_FOUND otherwise), the\n * same two hops `resolveBundledCodexExecutable` makes.\n *\n * node -e 'const d=require(\"fs\").readFileSync(process.argv[1]);\n * const s=d.indexOf(`{\\n \"models\": [`);\n * let i=s,n=0; do{n+=(d[i]===123)-(d[i]===125);i++}while(n);\n * const c=JSON.parse(d.slice(s,i));\n * for(const m of c.models) console.log(m.slug, m.display_name,\n * m.visibility, m.supported_reasoning_levels.map(l=>l.effort).join(\",\"))'\\\n * \"$(node -p 'const{createRequire}=require(\"module\");\n * const w=require.resolve(\"@openai/codex/package.json\");\n * createRequire(w).resolve(\"@openai/codex-darwin-arm64/package.json\")\n * .replace(\"package.json\",\"vendor/aarch64-apple-darwin/bin/codex\")')\"\n */\nexport const CODEX_CATALOG: ModelCatalog = {\n provenance:\n 'embedded model presets of @openai/codex@0.151.0 (darwin-arm64 binary), ' +\n 're-extracted 2026-09-02 and unchanged since 0.149.0',\n models: [\n {\n value: 'gpt-5.6-sol',\n resolvedModel: 'gpt-5.6-sol',\n displayName: 'GPT-5.6 Sol',\n description: 'Latest frontier agentic coding model.',\n primary: true,\n reasoningEfforts: ['low', 'medium', 'high', 'xhigh', 'max', 'ultra'],\n },\n {\n value: 'gpt-5.6-terra',\n resolvedModel: 'gpt-5.6-terra',\n displayName: 'GPT-5.6 Terra',\n description: 'Balanced agentic coding model for everyday work.',\n primary: true,\n reasoningEfforts: ['low', 'medium', 'high', 'xhigh', 'max', 'ultra'],\n },\n {\n value: 'gpt-5.6-luna',\n resolvedModel: 'gpt-5.6-luna',\n displayName: 'GPT-5.6 Luna',\n description: 'Fast and affordable agentic coding model.',\n primary: true,\n reasoningEfforts: ['low', 'medium', 'high', 'xhigh', 'max'],\n },\n {\n value: 'gpt-5.5',\n resolvedModel: 'gpt-5.5',\n displayName: 'GPT-5.5',\n description: 'Frontier model for complex coding, research, and real-world work.',\n primary: true,\n reasoningEfforts: ['low', 'medium', 'high', 'xhigh'],\n },\n {\n value: 'gpt-5.4',\n resolvedModel: 'gpt-5.4',\n displayName: 'GPT-5.4',\n description: 'Strong model for everyday coding.',\n reasoningEfforts: ['low', 'medium', 'high', 'xhigh'],\n },\n {\n value: 'gpt-5.4-mini',\n resolvedModel: 'gpt-5.4-mini',\n displayName: 'GPT-5.4 Mini',\n description: 'Small, fast, and cost-efficient model for simpler coding tasks.',\n reasoningEfforts: ['low', 'medium', 'high', 'xhigh'],\n },\n {\n value: 'gpt-5.2',\n resolvedModel: 'gpt-5.2',\n displayName: 'GPT-5.2',\n description: 'Optimized for professional work and long-running agents.',\n primary: true,\n reasoningEfforts: ['low', 'medium', 'high', 'xhigh'],\n },\n ],\n}\n","import { spawn } from 'node:child_process'\nimport { JsonRpcStdioConnection } from './jsonrpc.ts'\nimport type { AppServerConnection } from './types.ts'\n\nconst STDERR_TAIL_BYTES = 4096\n\nexport function connectAppServer(options: { executable: string; env: Record<string, string> }): AppServerConnection {\n const child = spawn(options.executable, ['app-server'], {\n env: options.env,\n stdio: ['pipe', 'pipe', 'pipe'],\n })\n const rpc = new JsonRpcStdioConnection({ input: child.stdout, output: child.stdin })\n\n let stderrTail = ''\n child.stderr.on('data', (chunk: Buffer) => {\n stderrTail = (stderrTail + String(chunk)).slice(-STDERR_TAIL_BYTES)\n })\n\n let closeHandler: ((message: string) => void) | undefined\n let done = false\n const settle = (message: string) => {\n if (done) {\n return\n }\n done = true\n rpc.fail(message)\n closeHandler?.(message)\n }\n child.on('error', (error) => settle(`codex app-server failed to start: ${error.message}`))\n child.on('exit', (code, signal) => {\n const tail = stderrTail.trim()\n settle(`codex app-server exited (${signal ?? `code ${code}`})` + (tail ? `: ${tail.slice(-500)}` : ''))\n })\n\n return {\n request: (method, params) => rpc.request(method, params),\n notify: (method, params) => rpc.notify(method, params),\n onNotification: (handler) => rpc.onNotification(handler),\n onRequest: (handler) => rpc.onRequest(handler),\n onClose: (handler) => {\n closeHandler = handler\n },\n close: () => {\n // Suppress the exit callback so a deliberate close doesn't read as a crash.\n done = true\n rpc.fail('codex app-server connection closed')\n child.kill()\n },\n }\n}\n","import { execFile } from 'node:child_process'\nimport { existsSync, realpathSync } from 'node:fs'\nimport { createRequire } from 'node:module'\nimport { ENGINE_CAPABILITIES, type ProfileInfo, type SdkSessionSummary } from '@workerdeck/protocol'\nimport type { EngineAdapter, EngineAvailability } from '../adapter.ts'\nimport { CodexRunner } from './runner.ts'\nimport { CODEX_CATALOG } from './catalog.ts'\nimport { codexChildEnv, INITIALIZE_PARAMS } from './connect.ts'\nimport { connectAppServer } from './process.ts'\nimport type { AppServerConnectFn, AppServerThreadListResponse, AppServerThreadSummary } from './types.ts'\n\nconst NOT_INSTALLED = '@openai/codex is not installed — add it (an optional peer of @workerdeck/core) to run codex profiles'\n\nexport function resolveBundledCodexExecutable(): string | undefined {\n const triple = targetTriple()\n if (!triple) {\n return undefined\n }\n try {\n // Two hops: the platform package is a dependency of @openai/codex, not of this one, so under\n // pnpm's strict layout it resolves only from @openai/codex's own location.\n const fromHere = createRequire(import.meta.url)\n const wrapper = fromHere.resolve('@openai/codex/package.json')\n const fromWrapper = createRequire(wrapper)\n const platformPackage = fromWrapper.resolve(`@openai/codex-${platformPackageSuffix()}/package.json`)\n const path = platformPackage.replace(/package\\.json$/, `vendor/${triple}/bin/codex`)\n if (existsSync(path)) {\n return path\n }\n } catch {}\n return undefined\n}\n\nfunction targetTriple(): string | undefined {\n const { platform, arch } = process\n if (platform === 'darwin') {\n return arch === 'arm64' ? 'aarch64-apple-darwin' : 'x86_64-apple-darwin'\n }\n if (platform === 'linux') {\n return arch === 'arm64' ? 'aarch64-unknown-linux-musl' : 'x86_64-unknown-linux-musl'\n }\n if (platform === 'win32') {\n return 'x86_64-pc-windows-msvc'\n }\n return undefined\n}\n\nfunction platformPackageSuffix(): string {\n return `${process.platform}-${process.arch}`\n}\n\nasync function checkCodexAvailability(\n profile: ProfileInfo,\n env: Record<string, string | undefined>,\n options: { timeoutMs?: number } = {},\n): Promise<EngineAvailability> {\n const executable = resolveBundledCodexExecutable()\n if (!executable) {\n return { available: false, reason: NOT_INSTALLED }\n }\n const childEnv = codexChildEnv(env, profile.codexHome)\n return new Promise((resolve) => {\n execFile(executable, ['login', 'status'], { env: childEnv, timeout: options.timeoutMs ?? 10_000 }, (error, stdout, stderr) => {\n if (!error) {\n resolve({ available: true })\n return\n }\n // The verdict line lands on stderr (0.146.0); check both streams so a future move doesn't\n // degrade every verdict to 'unknown'. Neither stream may reach `reason`: the success line\n // carries a masked key fragment.\n if (`${stdout}\\n${stderr}`.includes('Not logged in')) {\n // Presence checks on the NAMES only; values are never read.\n const hint = childEnv.CODEX_API_KEY\n ? ' CODEX_API_KEY is read only by `codex exec`, never by the app-server — run ' +\n '`codex login --with-api-key` under this profile’s CODEX_HOME to persist it.'\n : childEnv.OPENAI_API_KEY\n ? ' OPENAI_API_KEY is not used by codex — run `codex login --with-api-key` under this profile’s CODEX_HOME.'\n : ''\n resolve({\n available: false,\n reason:\n `codex is not logged in for this profile's environment — run \\`codex login\\`` +\n (profile.codexHome ? ` with CODEX_HOME=${profile.codexHome}` : '') +\n `.${hint}`,\n })\n return\n }\n // An errored probe (not a verdict) is not evidence of a missing login.\n resolve({ available: 'unknown' })\n })\n })\n}\n\nconst LIST_PAGE_SIZE = 100\nconst MAX_LIST_PAGES = 40\n\nfunction cwdFilter(dir: string): string[] {\n const forms = new Set([dir])\n try {\n forms.add(realpathSync(dir))\n } catch {}\n return [...forms]\n}\n\nfunction secondsToMs(value: number | null | undefined): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value * 1000 : undefined\n}\n\nfunction summarizeThread(row: AppServerThreadSummary): SdkSessionSummary {\n const name = typeof row.name === 'string' && row.name.length > 0 ? row.name : undefined\n const preview = typeof row.preview === 'string' && row.preview.length > 0 ? row.preview : undefined\n return {\n // The resume handle is the row's `id`; codex's own `sessionId` field is a different value.\n sessionId: row.id,\n summary: name ?? preview ?? row.id,\n lastModified: secondsToMs(row.updatedAt) ?? secondsToMs(row.createdAt) ?? 0,\n createdAt: secondsToMs(row.createdAt),\n customTitle: name,\n firstPrompt: preview,\n gitBranch: typeof row.gitInfo?.branch === 'string' && row.gitInfo.branch.length > 0 ? row.gitInfo.branch : undefined,\n cwd: typeof row.cwd === 'string' ? row.cwd : undefined,\n }\n}\n\nexport async function listCodexSessions(options: {\n connectFn: AppServerConnectFn\n profile?: ProfileInfo\n env: Record<string, string | undefined>\n dir?: string\n limit?: number\n offset?: number\n}): Promise<SdkSessionSummary[]> {\n const childEnv = codexChildEnv(options.env, options.profile?.codexHome)\n const connection = options.connectFn({ env: childEnv })\n const rows: AppServerThreadSummary[] = []\n try {\n await connection.request('initialize', INITIALIZE_PARAMS)\n connection.notify('initialized')\n const base: Record<string, unknown> = {\n limit: LIST_PAGE_SIZE,\n sortKey: 'updated_at',\n ...(options.dir ? { cwd: cwdFilter(options.dir) } : {}),\n }\n const want = options.limit === undefined ? undefined : (options.offset ?? 0) + options.limit\n let cursor: string | undefined\n for (let page = 0; page < MAX_LIST_PAGES; page++) {\n const result = (await connection.request('thread/list', {\n ...base,\n ...(cursor ? { cursor } : {}),\n })) as AppServerThreadListResponse\n const data = Array.isArray(result?.data) ? result.data : []\n rows.push(...data)\n if (want !== undefined && rows.length >= want) {\n break\n }\n if (data.length === 0 || typeof result?.nextCursor !== 'string') {\n break\n }\n cursor = result.nextCursor\n }\n } finally {\n connection.close()\n }\n const summaries = rows\n // An ephemeral thread was never materialized on disk — nothing to resume.\n .filter((row) => typeof row.id === 'string' && row.id.length > 0 && !row.ephemeral)\n .map(summarizeThread)\n const start = options.offset ?? 0\n return options.limit === undefined ? summaries.slice(start) : summaries.slice(start, start + options.limit)\n}\n\nexport const codexAdapter: EngineAdapter = {\n engine: 'codex',\n capabilities: ENGINE_CAPABILITIES.codex,\n catalog: CODEX_CATALOG,\n checkAvailability: (profile, env) => checkCodexAvailability(profile, env),\n createRunner({ config, profile, restore, id }) {\n if (restore) {\n throw new Error('the codex engine cannot rebuild a parked session')\n }\n const executable = (config as { codexPathOverride?: string }).codexPathOverride ?? resolveBundledCodexExecutable()\n if (!executable) {\n throw new Error(NOT_INSTALLED)\n }\n return new CodexRunner(\n {\n ...config,\n codexHome: profile?.codexHome,\n connectFn: (options) => connectAppServer({ executable, ...options }),\n },\n id,\n )\n },\n async listSessions(options) {\n const executable = resolveBundledCodexExecutable()\n if (!executable) {\n throw new Error(NOT_INSTALLED)\n }\n return listCodexSessions({\n ...options,\n connectFn: (connect) => connectAppServer({ executable, ...connect }),\n })\n },\n}\n","import { ENGINE_CAPABILITIES } from '@workerdeck/protocol'\nimport type { EngineAdapter } from '../adapter.ts'\n\nexport const providerAdapter: EngineAdapter = {\n engine: 'provider',\n capabilities: ENGINE_CAPABILITIES.provider,\n catalog: { models: [], provenance: 'provider model ids are operator-declared (provider.models)' },\n async checkAvailability(profile, env) {\n const keyEnv = profile.provider?.apiKeyEnv\n // The host hook may resolve credentials some other way: unknown, not unavailable.\n if (!keyEnv) {\n return { available: 'unknown' }\n }\n const value = env[keyEnv]\n if (value !== undefined && value !== '') {\n return { available: true }\n }\n return {\n available: false,\n reason: `${keyEnv} is not set in the server environment (profile '${profile.name}' names it as apiKeyEnv)`,\n }\n },\n createRunner() {\n throw new Error(\"provider-engine runners are built by the host's createEngineRunner hook, not the adapter\")\n },\n}\n","import type { EngineCapabilities, ModelOption, ProfileEngine, ProfileInfo, SdkSessionSummary } from '@workerdeck/protocol'\nimport type { Runner, RunnerSnapshot } from '../runner-interface.ts'\nimport type { SessionRunnerConfig } from './claude/runner.ts'\n\nexport type EngineAvailability = { available: true } | { available: false; reason: string } | { available: 'unknown' }\n\nexport type ModelCatalog = {\n models: ModelOption[]\n provenance: string\n}\n\nexport type EngineRunnerRequest = {\n config: SessionRunnerConfig\n profile?: ProfileInfo\n restore?: RunnerSnapshot\n id?: string\n}\n\nexport interface EngineAdapter {\n readonly engine: ProfileEngine\n readonly capabilities: EngineCapabilities\n readonly catalog: ModelCatalog\n checkAvailability(profile: ProfileInfo, env: Record<string, string | undefined>): Promise<EngineAvailability>\n createRunner(request: EngineRunnerRequest): Runner | Promise<Runner>\n listSessions?(options: {\n profile?: ProfileInfo\n env: Record<string, string | undefined>\n dir?: string\n limit?: number\n offset?: number\n }): Promise<SdkSessionSummary[]>\n}\n\nimport { claudeAdapter } from './claude/adapter.ts'\nimport { codexAdapter } from './codex/adapter.ts'\nimport { providerAdapter } from './provider/adapter.ts'\n\nconst ADAPTERS: Record<ProfileEngine, EngineAdapter> = {\n claude: claudeAdapter,\n codex: codexAdapter,\n provider: providerAdapter,\n}\n\nexport function getEngineAdapter(engine: ProfileEngine | undefined): EngineAdapter {\n return ADAPTERS[engine ?? 'claude']\n}\n"],"mappings":"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"}
|