@rallycry/conveyor-agent 6.0.1 → 6.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/setup/commands.ts","../src/connection/task-connection.ts","../src/connection/task-connection-rpc.ts","../src/connection/project-connection.ts","../src/utils/logger.ts","../src/runner/worktree.ts","../src/setup/config.ts","../src/setup/codespace.ts","../src/runner/agent-runner.ts","../src/execution/event-handlers.ts","../src/execution/event-processor.ts","../src/execution/query-executor.ts","../src/execution/pack-runner-prompt.ts","../src/execution/tag-context-resolver.ts","../src/execution/mode-prompt.ts","../src/execution/system-prompt.ts","../src/execution/prompt-builder.ts","../src/tools/index.ts","../src/tools/common-tools.ts","../src/tools/pm-tools.ts","../src/tools/discovery-tools.ts","../src/execution/tool-access.ts","../src/execution/cost-tracker.ts","../src/runner/plan-sync.ts","../src/runner/runner-setup.ts","../src/runner/runner-helpers.ts","../src/runner/project-runner.ts","../src/runner/project-chat-handler.ts","../src/runner/file-cache.ts"],"sourcesContent":["import { spawn, execSync, type ChildProcess } from \"node:child_process\";\n\nexport function runSetupCommand(\n cmd: string,\n cwd: string,\n onOutput: (stream: \"stdout\" | \"stderr\", data: string) => void,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(\"sh\", [\"-c\", cmd], {\n cwd,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: { ...process.env },\n });\n\n child.stdout.on(\"data\", (chunk: Buffer) => {\n onOutput(\"stdout\", chunk.toString());\n });\n\n child.stderr.on(\"data\", (chunk: Buffer) => {\n onOutput(\"stderr\", chunk.toString());\n });\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Setup command exited with code ${code}`));\n }\n });\n\n child.on(\"error\", (err) => {\n reject(err);\n });\n });\n}\n\nconst AUTH_TOKEN_TIMEOUT_MS = 30_000;\n\nexport function runAuthTokenCommand(cmd: string, userEmail: string, cwd: string): string | null {\n try {\n const output = execSync(`${cmd} ${JSON.stringify(userEmail)}`, {\n cwd,\n timeout: AUTH_TOKEN_TIMEOUT_MS,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n env: { ...process.env },\n });\n const token = output.toString().trim();\n return token || null;\n } catch {\n // Return null to maintain API contract - errors are logged at the connection layer\n return null;\n }\n}\n\nexport function runStartCommand(\n cmd: string,\n cwd: string,\n onOutput: (stream: \"stdout\" | \"stderr\", data: string) => void,\n): ChildProcess {\n const child = spawn(\"sh\", [\"-c\", cmd], {\n cwd,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n detached: true,\n env: { ...process.env },\n });\n\n child.stdout.on(\"data\", (chunk: Buffer) => {\n onOutput(\"stdout\", chunk.toString());\n });\n\n child.stderr.on(\"data\", (chunk: Buffer) => {\n onOutput(\"stderr\", chunk.toString());\n });\n\n child.unref();\n return child;\n}\n","import { io, type Socket } from \"socket.io-client\";\nimport type {\n AgentRunnerConfig,\n TaskContext,\n AgentEvent,\n IncomingMessagePayload,\n QuestionAnswerPayload,\n AgentQuestion,\n ChatMessageResponse,\n TaskFileResponse,\n TaskLookupResponse,\n SubtaskCreatePayload,\n SubtaskUpdateFields,\n SubtaskResponse,\n StartChildCloudBuildResponse,\n AgentMode,\n SetModePayload,\n IconListItem,\n GenerateIconResponse,\n UpdateTaskPropertiesPayload,\n TaskPropertiesResponse,\n TriggerIdentificationResponse,\n ModeTransitionPayload,\n IncidentDTO,\n TaskIncidentDTO,\n} from \"../types.js\";\nimport { runAuthTokenCommand } from \"../setup/commands.js\";\nimport * as rpc from \"./task-connection-rpc.js\";\n\nexport class ConveyorConnection {\n private socket: Socket | null = null;\n private config: AgentRunnerConfig;\n private eventBuffer: { event: AgentEvent }[] = [];\n private flushTimer: ReturnType<typeof setTimeout> | null = null;\n private static readonly EVENT_BATCH_MS = 500;\n\n private earlyMessages: IncomingMessagePayload[] = [];\n private earlyStop = false;\n private earlySoftStop = false;\n private earlyModeChanges: SetModePayload[] = [];\n private chatMessageCallback: ((msg: IncomingMessagePayload) => void) | null = null;\n private stopCallback: (() => void) | null = null;\n private softStopCallback: (() => void) | null = null;\n private modeChangeCallback: ((data: SetModePayload) => void) | null = null;\n private runStartCommandCallback: (() => void) | null = null;\n private pendingQuestionResolvers = new Map<string, (answers: Record<string, string>) => void>();\n\n constructor(config: AgentRunnerConfig) {\n this.config = config;\n }\n\n connect(): Promise<void> {\n return new Promise((resolve, reject) => {\n let settled = false;\n let attempts = 0;\n const maxInitialAttempts = 30;\n\n this.socket = io(this.config.conveyorApiUrl, {\n auth: { taskToken: this.config.taskToken, runnerMode: this.config.mode ?? \"task\" },\n transports: [\"websocket\"],\n reconnection: true,\n reconnectionAttempts: Infinity,\n reconnectionDelay: 2000,\n reconnectionDelayMax: 30000,\n randomizationFactor: 0.3,\n extraHeaders: { \"ngrok-skip-browser-warning\": \"true\" },\n });\n\n this.socket.on(\"agentRunner:incomingMessage\", (msg: IncomingMessagePayload) => {\n if (this.chatMessageCallback) this.chatMessageCallback(msg);\n else this.earlyMessages.push(msg);\n });\n\n this.socket.on(\"agentRunner:stop\", () => {\n if (this.stopCallback) this.stopCallback();\n else this.earlyStop = true;\n });\n\n this.socket.on(\"agentRunner:softStop\", () => {\n if (this.softStopCallback) this.softStopCallback();\n else this.earlySoftStop = true;\n });\n\n this.socket.on(\"agentRunner:questionAnswer\", (data: QuestionAnswerPayload) => {\n const resolver = this.pendingQuestionResolvers.get(data.requestId);\n if (resolver) {\n this.pendingQuestionResolvers.delete(data.requestId);\n resolver(data.answers);\n }\n });\n\n this.socket.on(\"agentRunner:setMode\", (data: SetModePayload) => {\n if (this.modeChangeCallback) this.modeChangeCallback(data);\n else this.earlyModeChanges.push(data);\n });\n\n this.socket.on(\"agentRunner:runStartCommand\", () => {\n if (this.runStartCommandCallback) this.runStartCommandCallback();\n });\n\n this.socket.on(\n \"agentRunner:runAuthTokenCommand\",\n (\n data: { userEmail: string },\n cb: (r: { ok: boolean; token?: string; error?: string }) => void,\n ) => this.handleRunAuthTokenCommand(data.userEmail, cb),\n );\n\n this.socket.on(\"connect\", () => {\n if (!settled) {\n settled = true;\n resolve();\n }\n });\n\n this.socket.io.on(\"reconnect_attempt\", () => {\n attempts++;\n if (!settled && attempts >= maxInitialAttempts) {\n settled = true;\n reject(new Error(`Failed to connect after ${maxInitialAttempts} attempts`));\n }\n });\n });\n }\n\n fetchChatMessages(limit?: number, taskId?: string): Promise<ChatMessageResponse[]> {\n return rpc.fetchChatMessages(this.socket, limit, taskId);\n }\n\n fetchTaskFiles(): Promise<TaskFileResponse[]> {\n return rpc.fetchTaskFiles(this.socket);\n }\n\n fetchTaskFile(fileId: string): Promise<TaskFileResponse> {\n return rpc.fetchTaskFile(this.socket, fileId);\n }\n\n fetchTaskContext(): Promise<TaskContext> {\n return rpc.fetchTaskContext(this.socket);\n }\n\n sendEvent(event: AgentEvent): void {\n if (!this.socket) throw new Error(\"Not connected\");\n this.eventBuffer.push({ event });\n if (!this.flushTimer) {\n this.flushTimer = setTimeout(() => this.flushEvents(), ConveyorConnection.EVENT_BATCH_MS);\n }\n }\n\n flushEvents(): void {\n if (this.flushTimer) {\n clearTimeout(this.flushTimer);\n this.flushTimer = null;\n }\n if (!this.socket || this.eventBuffer.length === 0) return;\n for (const entry of this.eventBuffer) this.socket.emit(\"agentRunner:event\", entry);\n this.eventBuffer = [];\n }\n\n updateStatus(status: string): void {\n if (!this.socket) throw new Error(\"Not connected\");\n this.socket.emit(\"agentRunner:statusUpdate\", { status });\n }\n\n postChatMessage(content: string): void {\n if (!this.socket) throw new Error(\"Not connected\");\n this.socket.emit(\"agentRunner:chatMessage\", { content });\n }\n\n createPR(params: {\n title: string;\n body: string;\n baseBranch?: string;\n }): Promise<{ url: string; number: number }> {\n return rpc.createPR(this.socket, params);\n }\n\n askUserQuestion(requestId: string, questions: AgentQuestion[]): Promise<Record<string, string>> {\n if (!this.socket) throw new Error(\"Not connected\");\n this.socket.emit(\"agentRunner:askUserQuestion\", { requestId, questions });\n return new Promise((resolve) => {\n this.pendingQuestionResolvers.set(requestId, resolve);\n });\n }\n\n cancelPendingQuestions(): void {\n this.pendingQuestionResolvers.clear();\n }\n\n storeSessionId(sessionId: string): void {\n if (!this.socket) return;\n this.socket.emit(\"agentRunner:storeSessionId\", { sessionId });\n }\n\n updateTaskFields(fields: { plan?: string; description?: string }): void {\n if (!this.socket) throw new Error(\"Not connected\");\n this.socket.emit(\"agentRunner:updateTaskFields\", { fields });\n }\n\n onChatMessage(callback: (message: IncomingMessagePayload) => void): void {\n this.chatMessageCallback = callback;\n for (const msg of this.earlyMessages) callback(msg);\n this.earlyMessages = [];\n }\n\n onStopRequested(callback: () => void): void {\n this.stopCallback = callback;\n if (this.earlyStop) {\n callback();\n this.earlyStop = false;\n }\n }\n\n onSoftStopRequested(callback: () => void): void {\n this.softStopCallback = callback;\n if (this.earlySoftStop) {\n callback();\n this.earlySoftStop = false;\n }\n }\n\n onModeChange(callback: (data: SetModePayload) => void): void {\n this.modeChangeCallback = callback;\n for (const data of this.earlyModeChanges) callback(data);\n this.earlyModeChanges = [];\n }\n\n onRunStartCommand(callback: () => void): void {\n this.runStartCommandCallback = callback;\n }\n\n private handleRunAuthTokenCommand(\n userEmail: string,\n cb: (r: { ok: boolean; token?: string; error?: string }) => void,\n ): void {\n try {\n if (process.env.CODESPACES !== \"true\") {\n cb({ ok: false, error: \"Auth token command only available in codespace environments\" });\n return;\n }\n const authCmd = process.env.CONVEYOR_AUTH_TOKEN_COMMAND;\n if (!authCmd) {\n cb({ ok: false, error: \"CONVEYOR_AUTH_TOKEN_COMMAND not configured\" });\n return;\n }\n const token = runAuthTokenCommand(authCmd, userEmail, this.config.workspaceDir);\n if (!token) {\n cb({\n ok: false,\n error: `Auth token command returned empty output. Command: ${authCmd}, Working Dir: ${this.config.workspaceDir}`,\n });\n return;\n }\n cb({ ok: true, token });\n } catch (error) {\n cb({\n ok: false,\n error: error instanceof Error ? error.message : \"Auth token command failed\",\n });\n }\n }\n\n emitModeChanged(agentMode?: AgentMode | null): void {\n if (!this.socket) return;\n this.socket.emit(\"agentRunner:modeChanged\", { agentMode });\n }\n\n trackSpending(params: {\n agentId: string;\n sessionId: string;\n totalCostUsd: number;\n onSubscription: boolean;\n modelUsage?: {\n model: string;\n inputTokens: number;\n outputTokens: number;\n cacheReadInputTokens: number;\n cacheCreationInputTokens: number;\n costUSD: number;\n }[];\n }): void {\n if (!this.socket) throw new Error(\"Not connected\");\n this.socket.emit(\"agentRunner:trackSpending\", params);\n }\n\n emitStatus(status: string): void {\n if (!this.socket) return;\n this.socket.emit(\"agentRunner:statusUpdate\", { status });\n }\n\n emitRateLimitPause(resetsAt: string): void {\n if (!this.socket) return;\n this.socket.emit(\"agentRunner:rateLimitPause\", { resetsAt });\n }\n\n sendHeartbeat(): void {\n if (!this.socket) return;\n this.socket.emit(\"agentRunner:heartbeat\", {});\n }\n\n sendTypingStart(): void {\n this.sendEvent({ type: \"agent_typing_start\" });\n }\n sendTypingStop(): void {\n this.sendEvent({ type: \"agent_typing_stop\" });\n }\n\n createSubtask(data: SubtaskCreatePayload): Promise<{ id: string }> {\n return rpc.createSubtask(this.socket, data);\n }\n\n updateSubtask(subtaskId: string, fields: SubtaskUpdateFields): void {\n if (!this.socket) throw new Error(\"Not connected\");\n this.socket.emit(\"agentRunner:updateSubtask\", { subtaskId, fields });\n }\n\n deleteSubtask(subtaskId: string): void {\n if (!this.socket) throw new Error(\"Not connected\");\n this.socket.emit(\"agentRunner:deleteSubtask\", { subtaskId });\n }\n\n listSubtasks(): Promise<SubtaskResponse[]> {\n return rpc.listSubtasks(this.socket);\n }\n\n fetchCliHistory(\n taskId?: string,\n limit?: number,\n source?: string,\n ): Promise<{ event: AgentEvent; time: string }[]> {\n return rpc.fetchCliHistory(this.socket, taskId ?? this.config.taskId, limit, source);\n }\n\n startChildCloudBuild(childTaskId: string): Promise<StartChildCloudBuildResponse> {\n return rpc.startChildCloudBuild(this.socket, childTaskId);\n }\n\n approveAndMergePR(\n childTaskId: string,\n ): Promise<{ merged: boolean; queued?: boolean; childTaskId: string; prNumber: number }> {\n return rpc.approveAndMergePR(this.socket, childTaskId);\n }\n\n postChildChatMessage(childTaskId: string, content: string): Promise<void> {\n return rpc.postChildChatMessage(this.socket, childTaskId, content);\n }\n\n updateChildStatus(childTaskId: string, status: string): Promise<void> {\n return rpc.updateChildStatus(this.socket, childTaskId, status);\n }\n\n stopChildBuild(childTaskId: string): Promise<void> {\n return rpc.stopChildBuild(this.socket, childTaskId);\n }\n\n fetchTask(slugOrId: string): Promise<TaskLookupResponse> {\n return rpc.fetchTask(this.socket, slugOrId);\n }\n\n updateTaskProperties(data: UpdateTaskPropertiesPayload): void {\n if (!this.socket) throw new Error(\"Not connected\");\n this.socket.emit(\"agentRunner:updateTaskProperties\", data);\n }\n\n listIcons(): Promise<IconListItem[]> {\n return rpc.listIcons(this.socket);\n }\n\n generateTaskIcon(\n prompt: string,\n aspectRatio?: \"auto\" | \"portrait\" | \"landscape\" | \"square\",\n ): Promise<GenerateIconResponse> {\n return rpc.generateTaskIcon(this.socket, prompt, aspectRatio);\n }\n\n getTaskProperties(): Promise<TaskPropertiesResponse> {\n return rpc.getTaskProperties(this.socket);\n }\n triggerIdentification(): Promise<TriggerIdentificationResponse> {\n return rpc.triggerIdentification(this.socket);\n }\n\n emitModeTransition(payload: ModeTransitionPayload): void {\n if (!this.socket) return;\n this.socket.emit(\"agentRunner:modeTransition\", payload);\n }\n\n searchIncidents(status?: string, source?: string): Promise<IncidentDTO[]> {\n return rpc.searchIncidents(this.socket, status, source);\n }\n\n getTaskIncidents(taskId?: string): Promise<TaskIncidentDTO[]> {\n return rpc.getTaskIncidents(this.socket, taskId);\n }\n\n disconnect(): void {\n this.flushEvents();\n this.socket?.disconnect();\n this.socket = null;\n }\n}\n","import type { Socket } from \"socket.io-client\";\nimport type {\n AgentEvent,\n ChatMessageResponse,\n TaskFileResponse,\n TaskContext,\n TaskLookupResponse,\n SubtaskCreatePayload,\n SubtaskResponse,\n StartChildCloudBuildResponse,\n IconListItem,\n GenerateIconResponse,\n TaskPropertiesResponse,\n TriggerIdentificationResponse,\n SocketResponse,\n IncidentDTO,\n TaskIncidentDTO,\n} from \"../types.js\";\n\nfunction requireSocket(socket: Socket | null): Socket {\n if (!socket) throw new Error(\"Not connected\");\n return socket;\n}\n\nfunction emitRpc<T>(socket: Socket, event: string, data: unknown): Promise<T> {\n return new Promise((resolve, reject) => {\n socket.emit(event, data, (response: SocketResponse<T>): void => {\n if (response.success && response.data) resolve(response.data);\n else reject(new Error(response.error ?? `Failed: ${event}`));\n });\n });\n}\n\nfunction emitRpcVoid(socket: Socket, event: string, data: unknown): Promise<void> {\n return new Promise((resolve, reject) => {\n socket.emit(event, data, (response: SocketResponse<void>): void => {\n if (response.success) resolve();\n else reject(new Error(response.error ?? `Failed: ${event}`));\n });\n });\n}\n\nexport function fetchChatMessages(\n socket: Socket | null,\n limit?: number,\n taskId?: string,\n): Promise<ChatMessageResponse[]> {\n return emitRpc(requireSocket(socket), \"agentRunner:getChatMessages\", { limit, taskId });\n}\n\nexport function fetchTaskFiles(socket: Socket | null): Promise<TaskFileResponse[]> {\n return emitRpc(requireSocket(socket), \"agentRunner:getTaskFiles\", {});\n}\n\nexport function fetchTaskFile(socket: Socket | null, fileId: string): Promise<TaskFileResponse> {\n return emitRpc(requireSocket(socket), \"agentRunner:getTaskFile\", { fileId });\n}\n\nexport function fetchTaskContext(socket: Socket | null): Promise<TaskContext> {\n return emitRpc(requireSocket(socket), \"agentRunner:getTaskContext\", {});\n}\n\nexport function createPR(\n socket: Socket | null,\n params: { title: string; body: string; baseBranch?: string },\n): Promise<{ url: string; number: number }> {\n return emitRpc(requireSocket(socket), \"agentRunner:createPR\", params);\n}\n\nexport function createSubtask(\n socket: Socket | null,\n data: SubtaskCreatePayload,\n): Promise<{ id: string }> {\n return emitRpc(requireSocket(socket), \"agentRunner:createSubtask\", data);\n}\n\nexport function listSubtasks(socket: Socket | null): Promise<SubtaskResponse[]> {\n return emitRpc(requireSocket(socket), \"agentRunner:listSubtasks\", {});\n}\n\nexport function fetchCliHistory(\n socket: Socket | null,\n taskId: string,\n limit?: number,\n source?: string,\n): Promise<{ event: AgentEvent; time: string }[]> {\n const s = requireSocket(socket);\n const timeout = 10_000;\n return Promise.race([\n emitRpc<{ event: AgentEvent; time: string }[]>(s, \"agentRunner:getCliHistory\", {\n taskId,\n limit,\n source,\n }),\n new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error(\"CLI history request timed out\")), timeout);\n }),\n ]);\n}\n\nexport function startChildCloudBuild(\n socket: Socket | null,\n childTaskId: string,\n): Promise<StartChildCloudBuildResponse> {\n return emitRpc(requireSocket(socket), \"agentRunner:startChildCloudBuild\", { childTaskId });\n}\n\nexport function approveAndMergePR(\n socket: Socket | null,\n childTaskId: string,\n): Promise<{ merged: boolean; queued?: boolean; childTaskId: string; prNumber: number }> {\n return emitRpc(requireSocket(socket), \"agentRunner:approveAndMergePR\", { childTaskId });\n}\n\nexport function postChildChatMessage(\n socket: Socket | null,\n childTaskId: string,\n content: string,\n): Promise<void> {\n return emitRpcVoid(requireSocket(socket), \"agentRunner:postChildChatMessage\", {\n childTaskId,\n content,\n });\n}\n\nexport function updateChildStatus(\n socket: Socket | null,\n childTaskId: string,\n status: string,\n): Promise<void> {\n return emitRpcVoid(requireSocket(socket), \"agentRunner:updateChildStatus\", {\n childTaskId,\n status,\n });\n}\n\nexport function stopChildBuild(socket: Socket | null, childTaskId: string): Promise<void> {\n return emitRpcVoid(requireSocket(socket), \"agentRunner:stopChildBuild\", { childTaskId });\n}\n\nexport function fetchTask(socket: Socket | null, slugOrId: string): Promise<TaskLookupResponse> {\n return emitRpc(requireSocket(socket), \"agentRunner:getTask\", { slugOrId });\n}\n\nexport function listIcons(socket: Socket | null): Promise<IconListItem[]> {\n return emitRpc(requireSocket(socket), \"agentRunner:listIcons\", {});\n}\n\nexport function generateTaskIcon(\n socket: Socket | null,\n prompt: string,\n aspectRatio?: \"auto\" | \"portrait\" | \"landscape\" | \"square\",\n): Promise<GenerateIconResponse> {\n return emitRpc(requireSocket(socket), \"agentRunner:generateTaskIcon\", { prompt, aspectRatio });\n}\n\nexport function getTaskProperties(socket: Socket | null): Promise<TaskPropertiesResponse> {\n return emitRpc(requireSocket(socket), \"agentRunner:getTaskProperties\", {});\n}\n\nexport function triggerIdentification(\n socket: Socket | null,\n): Promise<TriggerIdentificationResponse> {\n return emitRpc(requireSocket(socket), \"agentRunner:triggerIdentification\", {});\n}\n\nexport function searchIncidents(\n socket: Socket | null,\n status?: string,\n source?: string,\n): Promise<IncidentDTO[]> {\n return emitRpc(requireSocket(socket), \"agentRunner:searchIncidents\", { status, source });\n}\n\nexport function getTaskIncidents(\n socket: Socket | null,\n taskId?: string,\n): Promise<TaskIncidentDTO[]> {\n return emitRpc(requireSocket(socket), \"agentRunner:getTaskIncidents\", { taskId });\n}\n","import { io, type Socket } from \"socket.io-client\";\n\nexport interface ProjectConnectionConfig {\n apiUrl: string;\n projectToken: string;\n projectId: string;\n}\n\nexport interface TaskAssignment {\n taskId: string;\n taskToken: string;\n apiUrl: string;\n mode: string;\n branch: string;\n devBranch: string;\n useWorktree?: boolean;\n isAuto?: boolean;\n useSandbox?: boolean;\n}\n\nexport interface IncomingChatMessage {\n content: string;\n userId: string;\n files?: {\n id: string;\n fileName: string;\n mimeType: string;\n downloadUrl: string;\n content?: string;\n contentEncoding?: \"base64\" | \"utf-8\";\n }[];\n}\n\nexport interface ChatHistoryMessage {\n role: string;\n content: string;\n userId: string | null;\n userName?: string;\n createdAt: string;\n}\n\nexport interface AgentContext {\n projectName: string;\n projectDescription: string | null;\n agentId: string | null;\n agentName: string | null;\n agentInstructions: string;\n model: string;\n agentSettings: Record<string, unknown> | null;\n}\n\nexport class ProjectConnection {\n private socket: Socket | null = null;\n private config: ProjectConnectionConfig;\n private taskAssignmentCallback: ((assignment: TaskAssignment) => void) | null = null;\n private stopTaskCallback: ((data: { taskId: string }) => void) | null = null;\n private shutdownCallback: (() => void) | null = null;\n private chatMessageCallback: ((msg: IncomingChatMessage) => void) | null = null;\n private earlyChatMessages: IncomingChatMessage[] = [];\n\n constructor(config: ProjectConnectionConfig) {\n this.config = config;\n }\n\n connect(): Promise<void> {\n return new Promise((resolve, reject) => {\n let settled = false;\n let attempts = 0;\n const maxInitialAttempts = 30;\n\n this.socket = io(this.config.apiUrl, {\n auth: { projectToken: this.config.projectToken },\n transports: [\"websocket\"],\n reconnection: true,\n reconnectionAttempts: Infinity,\n reconnectionDelay: 2000,\n reconnectionDelayMax: 30000,\n randomizationFactor: 0.3,\n extraHeaders: {\n \"ngrok-skip-browser-warning\": \"true\",\n },\n });\n\n this.socket.on(\"projectRunner:assignTask\", (data: TaskAssignment) => {\n if (this.taskAssignmentCallback) {\n this.taskAssignmentCallback(data);\n }\n });\n\n this.socket.on(\"projectRunner:stopTask\", (data: { taskId: string }) => {\n if (this.stopTaskCallback) {\n this.stopTaskCallback(data);\n }\n });\n\n this.socket.on(\"projectRunner:shutdown\", () => {\n if (this.shutdownCallback) {\n this.shutdownCallback();\n }\n });\n\n this.socket.on(\"projectRunner:incomingChatMessage\", (msg: IncomingChatMessage) => {\n if (this.chatMessageCallback) {\n this.chatMessageCallback(msg);\n } else {\n this.earlyChatMessages.push(msg);\n }\n });\n\n this.socket.on(\"connect\", () => {\n if (!settled) {\n settled = true;\n resolve();\n }\n });\n\n this.socket.io.on(\"reconnect_attempt\", () => {\n attempts++;\n if (!settled && attempts >= maxInitialAttempts) {\n settled = true;\n reject(new Error(`Failed to connect after ${maxInitialAttempts} attempts`));\n }\n });\n });\n }\n\n onTaskAssignment(callback: (assignment: TaskAssignment) => void): void {\n this.taskAssignmentCallback = callback;\n }\n\n onStopTask(callback: (data: { taskId: string }) => void): void {\n this.stopTaskCallback = callback;\n }\n\n onShutdown(callback: () => void): void {\n this.shutdownCallback = callback;\n }\n\n onChatMessage(callback: (msg: IncomingChatMessage) => void): void {\n this.chatMessageCallback = callback;\n for (const msg of this.earlyChatMessages) {\n callback(msg);\n }\n this.earlyChatMessages = [];\n }\n\n sendHeartbeat(): void {\n if (!this.socket) return;\n this.socket.emit(\"projectRunner:heartbeat\", {});\n }\n\n emitTaskStarted(taskId: string): void {\n if (!this.socket) return;\n this.socket.emit(\"projectRunner:taskStarted\", { taskId });\n }\n\n emitTaskStopped(taskId: string, reason: string): void {\n if (!this.socket) return;\n this.socket.emit(\"projectRunner:taskStopped\", { taskId, reason });\n }\n\n emitEvent(event: Record<string, unknown>): void {\n if (!this.socket) return;\n this.socket.emit(\"conveyor:projectAgentEvent\", event);\n }\n\n emitChatMessage(content: string): Promise<void> {\n const socket = this.socket;\n if (!socket) return Promise.reject(new Error(\"Not connected\"));\n\n return new Promise((resolve, reject) => {\n socket.emit(\n \"conveyor:projectAgentChatMessage\",\n { content },\n (response: { success: boolean; error?: string }) => {\n if (response.success) resolve();\n else reject(new Error(response.error ?? \"Failed to send chat message\"));\n },\n );\n });\n }\n\n emitAgentStatus(status: string): void {\n if (!this.socket) return;\n this.socket.emit(\"conveyor:projectAgentStatus\", { status });\n }\n\n fetchAgentContext(): Promise<AgentContext | null> {\n const socket = this.socket;\n if (!socket) return Promise.reject(new Error(\"Not connected\"));\n\n return new Promise((resolve, reject) => {\n socket.emit(\n \"projectRunner:getAgentContext\",\n (response: { success: boolean; data?: AgentContext | null; error?: string }) => {\n if (response.success) resolve(response.data ?? null);\n else reject(new Error(response.error ?? \"Failed to fetch agent context\"));\n },\n );\n });\n }\n\n fetchChatHistory(limit?: number): Promise<ChatHistoryMessage[]> {\n const socket = this.socket;\n if (!socket) return Promise.reject(new Error(\"Not connected\"));\n\n return new Promise((resolve, reject) => {\n socket.emit(\n \"projectRunner:getChatHistory\",\n { limit },\n (response: { success: boolean; data?: ChatHistoryMessage[]; error?: string }) => {\n if (response.success && response.data) resolve(response.data);\n else reject(new Error(response.error ?? \"Failed to fetch chat history\"));\n },\n );\n });\n }\n\n disconnect(): void {\n this.socket?.disconnect();\n this.socket = null;\n }\n}\n","import winston from \"winston\";\n\nconst { combine, timestamp, printf, colorize } = winston.format;\n\nconst customFormat = printf(({ level, message, timestamp: ts, service, ...meta }) => {\n const svc = service ? `[${service}] ` : \"\";\n const metaStr = Object.keys(meta).length ? ` ${JSON.stringify(meta)}` : \"\";\n return `${ts} [${level}]: ${svc}${message}${metaStr}`;\n});\n\nexport const logger = winston.createLogger({\n level: process.env.LOG_LEVEL ?? \"info\",\n format: combine(timestamp({ format: \"YYYY-MM-DD HH:mm:ss\" }), combine(colorize(), customFormat)),\n transports: [new winston.transports.Console()],\n});\n\nexport function createServiceLogger(serviceName: string): winston.Logger {\n return logger.child({ service: serviceName });\n}\n\nexport function errorMeta(error: unknown): { message: string; stack?: string; code?: string } {\n if (error instanceof Error) {\n return {\n message: error.message,\n stack: error.stack,\n ...(\"code\" in error && typeof error.code === \"string\" ? { code: error.code } : {}),\n };\n }\n return { message: String(error) };\n}\n\nexport default logger;\n","import { execSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nconst WORKTREE_DIR = \".worktrees\";\n\nexport function ensureWorktree(projectDir: string, taskId: string, branch?: string): string {\n if (projectDir.includes(`/${WORKTREE_DIR}/`)) {\n // already inside a worktree, don't nest\n return projectDir;\n }\n\n const worktreePath = join(projectDir, WORKTREE_DIR, taskId);\n\n if (existsSync(worktreePath)) {\n if (branch) {\n try {\n execSync(`git checkout --detach origin/${branch}`, {\n cwd: worktreePath,\n stdio: \"ignore\",\n });\n } catch {\n /* branch doesn't exist on remote yet */\n }\n }\n return worktreePath;\n }\n\n const ref = branch ? `origin/${branch}` : \"HEAD\";\n execSync(`git worktree add --detach \"${worktreePath}\" ${ref}`, {\n cwd: projectDir,\n stdio: \"ignore\",\n });\n\n return worktreePath;\n}\n\nexport function removeWorktree(projectDir: string, taskId: string): void {\n const worktreePath = join(projectDir, WORKTREE_DIR, taskId);\n if (!existsSync(worktreePath)) return;\n try {\n execSync(`git worktree remove \"${worktreePath}\" --force`, {\n cwd: projectDir,\n stdio: \"ignore\",\n });\n } catch {\n /* best effort */\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { TaskContext } from \"../types.js\";\n\nexport interface ConveyorConfig {\n setupCommand?: string;\n startCommand?: string;\n previewPort?: number;\n}\n\nconst DEVCONTAINER_PATH = \".devcontainer/conveyor/devcontainer.json\";\n\nexport async function loadForwardPorts(workspaceDir: string): Promise<number[]> {\n try {\n const raw = await readFile(join(workspaceDir, DEVCONTAINER_PATH), \"utf-8\");\n const parsed = JSON.parse(raw) as { forwardPorts?: number[] };\n return parsed.forwardPorts ?? [];\n } catch {\n return [];\n }\n}\n\n/**\n * Build a ConveyorConfig from project-level settings returned in TaskContext.\n * Returns null when no actionable fields are present.\n */\nexport function loadProjectConfig(taskContext: TaskContext): ConveyorConfig | null {\n const ps = taskContext.projectSettings as\n | {\n setupCommand?: string;\n startCommand?: string;\n previewPort?: number;\n }\n | undefined;\n if (!ps) return null;\n if (!ps.setupCommand && !ps.startCommand) return null;\n return {\n setupCommand: ps.setupCommand,\n startCommand: ps.startCommand,\n previewPort: ps.previewPort,\n };\n}\n\n/**\n * Load config from env vars (project-level settings injected via bootstrap).\n */\nexport function loadConveyorConfig(_workspaceDir?: string): ConveyorConfig | null {\n const envSetup = process.env.CONVEYOR_SETUP_COMMAND;\n const envStart = process.env.CONVEYOR_START_COMMAND;\n const envPort = process.env.CONVEYOR_PREVIEW_PORT;\n if (envSetup || envStart) {\n return {\n setupCommand: envSetup,\n startCommand: envStart,\n previewPort: envPort ? Number(envPort) : undefined,\n };\n }\n\n return null;\n}\n","import { execSync } from \"node:child_process\";\n\nexport function unshallowRepo(workspaceDir: string): void {\n try {\n execSync(\"git fetch --unshallow\", {\n cwd: workspaceDir,\n stdio: \"ignore\",\n timeout: 60_000,\n });\n } catch {\n // Already unshallowed or not a shallow clone — ignore\n }\n}\n","/* oxlint-disable max-lines, max-dependencies -- AgentRunner lifecycle is a single cohesive class; splitting would fragment state management */\nimport { randomUUID } from \"node:crypto\";\nimport { execSync } from \"node:child_process\";\nimport type { SDKUserMessage } from \"@anthropic-ai/claude-agent-sdk\";\nimport type {\n AgentRunnerConfig,\n AgentRunnerCallbacks,\n AgentRunnerStatus,\n TaskContext,\n MultimodalBlock,\n AgentMode,\n} from \"../types.js\";\n\nimport { ConveyorConnection } from \"../connection/index.js\";\nimport { runSdkQuery, CostTracker } from \"../execution/index.js\";\nimport { ensureWorktree } from \"./worktree.js\";\nimport { PlanSync } from \"./plan-sync.js\";\nimport * as setup from \"./runner-setup.js\";\nimport {\n handleAutoModeRestart,\n buildQueryHost,\n buildMessageContent,\n formatThinkingSetting,\n type IncomingFile,\n} from \"./runner-helpers.js\";\nimport { createServiceLogger } from \"../utils/logger.js\";\n\nconst logger = createServiceLogger(\"AgentRunner\");\n\nconst HEARTBEAT_INTERVAL_MS = 30_000;\nconst IDLE_TIMEOUT_MS = 30 * 60 * 1000;\n\nexport class AgentRunner {\n private config: AgentRunnerConfig;\n private connection: ConveyorConnection;\n private callbacks: AgentRunnerCallbacks;\n private _state: AgentRunnerStatus = \"connecting\";\n private stopped = false;\n private interrupted = false;\n private inputResolver: ((msg: SDKUserMessage | null) => void) | null = null;\n private pendingMessages: SDKUserMessage[] = [];\n private setupLog: string[] = [];\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private taskContext: TaskContext | null = null;\n private planSync: PlanSync;\n private costTracker = new CostTracker();\n private worktreeActive = false;\n private agentMode: AgentMode | null = null;\n private hasExitedPlanMode = false;\n private pendingModeRestart = false;\n private sessionIds = new Map<string, string>();\n private lastQueryModeRestart = false;\n private startCommandStarted = false;\n private prNudgeCount = 0;\n private idleTimer: ReturnType<typeof setTimeout> | null = null;\n private idleCheckInterval: ReturnType<typeof setInterval> | null = null;\n private conveyorConfig: import(\"../setup/index.js\").ConveyorConfig | null = null;\n private _queryHost: ReturnType<typeof buildQueryHost> | null = null;\n\n constructor(config: AgentRunnerConfig, callbacks: AgentRunnerCallbacks) {\n this.config = config;\n this.connection = new ConveyorConnection(config);\n this.callbacks = callbacks;\n this.planSync = new PlanSync(config.workspaceDir, this.connection);\n }\n\n get state(): AgentRunnerStatus {\n return this._state;\n }\n\n private get effectiveAgentMode(): AgentMode {\n if (this.agentMode) return this.agentMode;\n if (this.config.mode === \"pm\") {\n return this.config.isAuto ? \"auto\" : \"discovery\";\n }\n return \"building\";\n }\n\n private async setState(status: AgentRunnerStatus): Promise<void> {\n this._state = status;\n this.connection.emitStatus(status);\n await this.callbacks.onStatusChange(status);\n }\n\n private startHeartbeat(): void {\n this.heartbeatTimer = setInterval(() => {\n if (!this.stopped) this.connection.sendHeartbeat();\n }, HEARTBEAT_INTERVAL_MS);\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n }\n\n private clearIdleTimers(): void {\n if (this.idleTimer) {\n clearTimeout(this.idleTimer);\n this.idleTimer = null;\n }\n if (this.idleCheckInterval) {\n clearInterval(this.idleCheckInterval);\n this.idleCheckInterval = null;\n }\n }\n\n async start(): Promise<void> {\n await this.setState(\"connecting\");\n await this.connection.connect();\n\n this.connection.onStopRequested(() => this.stop());\n this.connection.onSoftStopRequested(() => this.softStop());\n this.connection.onChatMessage((message) =>\n this.injectHumanMessage(message.content, message.files),\n );\n this.connection.onModeChange((data) => this.handleModeChange(data.agentMode));\n this.connection.onRunStartCommand(() => this.handleRunStartCommand());\n\n await this.setState(\"connected\");\n this.connection.sendEvent({ type: \"connected\", taskId: this.config.taskId });\n this.startHeartbeat();\n\n if (process.env.CODESPACES === \"true\") {\n const result = await setup.runSetupSafe(\n this.config,\n this.connection,\n this.callbacks,\n this.setupLog,\n this.effectiveAgentMode,\n (s) => this.setState(s as AgentRunnerStatus),\n );\n if (!result.ok) {\n this.stopHeartbeat();\n await this.setState(\"error\");\n this.connection.disconnect();\n return;\n }\n this.conveyorConfig = result.conveyorConfig;\n }\n\n this.tryInitWorktree();\n if (!(await this.fetchAndInitContext())) return;\n\n this.tryPostContextWorktree();\n this.checkoutWorktreeBranch();\n await this.executeInitialMode();\n await this.runCoreLoop();\n\n this.stopHeartbeat();\n await this.setState(\"finished\");\n this.connection.disconnect();\n }\n\n private tryInitWorktree(): void {\n if (\n process.env.CODESPACES !== \"true\" &&\n process.env.CONVEYOR_USE_WORKTREE !== \"false\" &&\n (this.config.mode === \"pm\" || process.env.CONVEYOR_USE_WORKTREE === \"true\")\n ) {\n this.activateWorktree(\"[conveyor] Using worktree:\");\n }\n }\n\n private async fetchAndInitContext(): Promise<boolean> {\n await this.setState(\"fetching_context\");\n try {\n this.taskContext = await this.connection.fetchTaskContext();\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Failed to fetch task context\";\n this.connection.sendEvent({ type: \"error\", message });\n await this.callbacks.onEvent({ type: \"error\", message });\n this.stopHeartbeat();\n await this.setState(\"error\");\n this.connection.disconnect();\n return false;\n }\n\n this.taskContext._runnerSessionId = randomUUID();\n if (this.taskContext.agentMode) this.agentMode = this.taskContext.agentMode;\n this.logEffectiveSettings();\n\n if (process.env.CODESPACES === \"true\") setup.unshallowRepo(this.config.workspaceDir);\n return true;\n }\n\n private tryPostContextWorktree(): void {\n if (\n process.env.CODESPACES !== \"true\" &&\n process.env.CONVEYOR_USE_WORKTREE !== \"false\" &&\n !this.worktreeActive &&\n this.taskContext?.useWorktree\n ) {\n this.activateWorktree(\"[conveyor] Using worktree (from task config):\");\n }\n }\n\n private activateWorktree(logPrefix: string): void {\n try {\n const worktreePath = ensureWorktree(this.config.workspaceDir, this.config.taskId);\n this.config = { ...this.config, workspaceDir: worktreePath };\n this.planSync.updateWorkspaceDir(worktreePath);\n this.worktreeActive = true;\n setup.pushSetupLog(this.setupLog, `${logPrefix} ${worktreePath}`);\n } catch (error) {\n const msg = error instanceof Error ? error.message : \"Unknown error\";\n setup.pushSetupLog(\n this.setupLog,\n `[conveyor] Worktree creation failed, using shared workspace: ${msg}`,\n );\n }\n }\n\n private checkoutWorktreeBranch(): void {\n if (!this.worktreeActive || !this.taskContext?.githubBranch) return;\n try {\n const branch = this.taskContext.githubBranch;\n execSync(`git fetch origin ${branch} && git checkout ${branch}`, {\n cwd: this.config.workspaceDir,\n stdio: \"ignore\",\n });\n } catch {\n // branch may not exist remotely yet\n }\n }\n\n private needsPRNudge(): boolean {\n if (!this.config.isAuto || this.stopped) return false;\n const maxNudges =\n this.taskContext?.agentSettings?.maxPrNudges ?? this.config.agentSettings?.maxPrNudges ?? 3;\n if (this.prNudgeCount >= maxNudges) return false;\n const status = this.taskContext?.status;\n return status === \"InProgress\" && !this.taskContext?.githubPRUrl;\n }\n\n private async maybeSendPRNudge(): Promise<boolean> {\n const fresh = await this.connection.fetchTaskContext().catch(() => null);\n if (fresh) this.taskContext = fresh;\n if (!this.needsPRNudge()) return false;\n\n this.prNudgeCount++;\n const ctx = this.taskContext ?? fresh;\n if (!ctx) return false;\n\n const maxNudges =\n this.taskContext?.agentSettings?.maxPrNudges ?? this.config.agentSettings?.maxPrNudges ?? 3;\n\n if (this.prNudgeCount >= maxNudges) {\n this.connection.postChatMessage(\n `Auto-mode agent failed to open a PR after ${maxNudges} nudges. Shutting down.`,\n );\n this.stop();\n return true;\n }\n\n await this.sendPRNudgeQuery(ctx, maxNudges);\n return true;\n }\n\n private async sendPRNudgeQuery(ctx: TaskContext, maxNudges: number): Promise<void> {\n const isFirst = this.prNudgeCount === 1;\n const chatMsg = isFirst\n ? \"Auto-nudge: Task is still In Progress with no PR. Prompting agent to continue...\"\n : `Auto-nudge (attempt ${this.prNudgeCount}/${maxNudges}): Task still has no PR. Prompting agent again...`;\n const prompt = isFirst\n ? \"You are in Auto mode and your task is still In Progress with no pull request. You MUST create a pull request before finishing. Use the create_pull_request tool now to open a PR for your changes. If you are blocked, explain what is preventing you from creating a PR.\"\n : `This is reminder ${this.prNudgeCount} of ${maxNudges}. You MUST open a pull request using create_pull_request NOW or explain what is blocking you. Do NOT go idle — either create the PR or describe the specific blocker.`;\n\n this.connection.postChatMessage(chatMsg);\n await this.setState(\"running\");\n await this.runQuerySafe(ctx, prompt);\n }\n\n private async executeInitialMode(): Promise<void> {\n if (!this.taskContext) return;\n const mode = this.effectiveAgentMode;\n const shouldRun =\n mode === \"building\" ||\n mode === \"auto\" ||\n (mode === \"review\" && !!this.taskContext.isParentTask);\n if (shouldRun) {\n await this.setState(\"running\");\n await this.runQuerySafe(this.taskContext);\n if (!this.stopped && (this._state as string) !== \"error\") {\n const nudged = await this.maybeSendPRNudge();\n if (!nudged) await this.setState(\"idle\");\n }\n } else {\n await this.setState(\"idle\");\n }\n }\n\n private async runQuerySafe(\n context: TaskContext,\n followUp?: string | MultimodalBlock[],\n ): Promise<void> {\n this.lastQueryModeRestart = false;\n try {\n await runSdkQuery(this.asQueryHost(), context, followUp);\n if (this.pendingModeRestart) {\n this.lastQueryModeRestart = true;\n this.pendingModeRestart = false;\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n this.connection.sendEvent({ type: \"error\", message });\n await this.callbacks.onEvent({ type: \"error\", message });\n await this.setState(\"error\");\n }\n }\n\n private async handleModeRestartCycle(): Promise<void> {\n if (!this.taskContext) return;\n await handleAutoModeRestart(\n { agentMode: this.agentMode, sessionIds: this.sessionIds, taskContext: this.taskContext },\n this.connection,\n (s) => this.setState(s as AgentRunnerStatus),\n (ctx) => this.runQuerySafe(ctx),\n async () => {\n try {\n return await this.connection.fetchTaskContext();\n } catch {\n return null;\n }\n },\n );\n this.taskContext =\n (await this.connection.fetchTaskContext().catch(() => null)) ?? this.taskContext;\n if (!this.stopped && (this._state as string) !== \"error\") {\n const nudged = await this.maybeSendPRNudge();\n if (!nudged) await this.setState(\"idle\");\n }\n }\n\n private async runCoreLoop(): Promise<void> {\n if (!this.taskContext) return;\n while (!this.stopped) {\n if (this.lastQueryModeRestart) {\n this.lastQueryModeRestart = false;\n await this.handleModeRestartCycle();\n continue;\n }\n\n if (this._state === \"idle\") {\n const msg = await this.waitForUserContent();\n if (!msg) {\n if (this.interrupted && !this.stopped) {\n this.interrupted = false;\n continue;\n }\n break;\n }\n await this.setState(\"running\");\n this.interrupted = false;\n await this.runQuerySafe(this.taskContext, msg);\n if (this.interrupted) this.interrupted = false;\n if (!this.stopped && (this._state as string) !== \"error\") await this.setState(\"idle\");\n } else if (this._state === \"error\") {\n await this.setState(\"idle\");\n } else {\n break;\n }\n }\n }\n\n private handleRunStartCommand(): void {\n if (!this.conveyorConfig?.startCommand || this.startCommandStarted) return;\n this.startCommandStarted = true;\n setup.rerunStartCommand(this.conveyorConfig, this.config, this.connection, this.setupLog);\n }\n\n private logEffectiveSettings(): void {\n if (!this.taskContext) return;\n const s = this.taskContext.agentSettings ?? this.config.agentSettings ?? {};\n const model = this.taskContext.model || this.config.model;\n const thinking = formatThinkingSetting(s.thinking);\n logger.info(\"Effective agent settings\", {\n model,\n mode: this.config.mode ?? \"task\",\n effort: s.effort ?? \"default\",\n thinking,\n maxBudget: s.maxBudgetUsd ?? 50,\n maxTurns: s.maxTurns ?? \"unlimited\",\n ...(s.betas?.length ? { betas: s.betas } : {}),\n ...(s.disallowedTools?.length ? { disallowedTools: s.disallowedTools } : {}),\n ...(s.enableFileCheckpointing ? { checkpointing: \"on\" } : {}),\n });\n }\n\n private injectHumanMessage(content: string, files?: IncomingFile[]): void {\n const messageContent = buildMessageContent(content, files);\n const msg: SDKUserMessage = {\n type: \"user\" as const,\n session_id: \"\",\n message: { role: \"user\" as const, content: messageContent },\n parent_tool_use_id: null,\n };\n if (this.inputResolver) {\n const resolve = this.inputResolver;\n this.inputResolver = null;\n resolve(msg);\n } else {\n this.pendingMessages.push(msg);\n // If there's an active query, interrupt it so the agent picks up the new message\n if (this._queryHost?.activeQuery) {\n this.softStop();\n }\n }\n }\n\n private waitForMessage(): Promise<SDKUserMessage | null> {\n this.clearIdleTimers();\n return new Promise<SDKUserMessage | null>((resolve) => {\n this.idleCheckInterval = setInterval(() => {\n if (this.stopped || this.interrupted) {\n this.clearIdleTimers();\n this.inputResolver = null;\n resolve(null);\n }\n }, 1000);\n this.idleTimer = setTimeout(() => {\n this.clearIdleTimers();\n this.inputResolver = null;\n logger.info(\"Idle timeout reached, shutting down\", {\n idleMinutes: IDLE_TIMEOUT_MS / 60_000,\n });\n this.connection.postChatMessage(\n `Agent idle for ${IDLE_TIMEOUT_MS / 60_000} minutes with no new messages — shutting down.`,\n );\n resolve(null);\n }, IDLE_TIMEOUT_MS);\n this.inputResolver = (msg: SDKUserMessage | null) => {\n this.clearIdleTimers();\n resolve(msg);\n };\n });\n }\n\n private async waitForUserContent(): Promise<string | MultimodalBlock[] | null> {\n if (this.pendingMessages.length > 0) {\n const content = this.pendingMessages.shift()?.message.content;\n return (content as string | MultimodalBlock[]) ?? null;\n }\n const msg = await this.waitForMessage();\n return (msg?.message.content as string | MultimodalBlock[]) ?? null;\n }\n\n async *createInputStream(\n initialPrompt: string | MultimodalBlock[],\n ): AsyncGenerator<SDKUserMessage, void, unknown> {\n const makeUserMessage = (content: string | MultimodalBlock[]): SDKUserMessage => ({\n type: \"user\" as const,\n session_id: \"\",\n message: { role: \"user\" as const, content },\n parent_tool_use_id: null,\n });\n\n yield makeUserMessage(initialPrompt);\n\n try {\n while (!this.stopped && !this.interrupted) {\n if (this.pendingMessages.length > 0) {\n const next = this.pendingMessages.shift();\n if (next) yield next;\n continue;\n }\n this.connection.emitStatus(\"waiting_for_input\");\n await this.callbacks.onStatusChange(\"waiting_for_input\");\n const msg = await this.waitForMessage();\n if (!msg) break;\n this.connection.emitStatus(\"running\");\n await this.callbacks.onStatusChange(\"running\");\n yield msg;\n }\n } finally {\n this.clearIdleTimers();\n }\n }\n\n private asQueryHost() {\n const host = buildQueryHost({\n config: this.config,\n connection: this.connection,\n callbacks: this.callbacks,\n setupLog: this.setupLog,\n costTracker: this.costTracker,\n planSync: this.planSync,\n sessionIds: this.sessionIds,\n getEffectiveAgentMode: () => this.effectiveAgentMode,\n getIsParentTask: () => !!this.taskContext?.isParentTask,\n getHasExitedPlanMode: () => this.hasExitedPlanMode,\n setHasExitedPlanMode: (val) => {\n this.hasExitedPlanMode = val;\n },\n getPendingModeRestart: () => this.pendingModeRestart,\n setPendingModeRestart: (val) => {\n this.pendingModeRestart = val;\n },\n isStopped: () => this.stopped || this.interrupted,\n createInputStream: (prompt) => this.createInputStream(prompt),\n onModeTransition: (newMode) => {\n this.agentMode = newMode;\n },\n });\n this._queryHost = host;\n return host;\n }\n\n private handleModeChange(newAgentMode?: AgentMode): void {\n if (this.config.mode !== \"pm\") return;\n if (newAgentMode) this.agentMode = newAgentMode;\n const effectiveMode = this.effectiveAgentMode;\n this.connection.emitModeChanged(effectiveMode);\n this.connection.postChatMessage(\n `Mode switched to **${effectiveMode}**${effectiveMode === \"building\" ? \" — I now have direct coding access.\" : \"\"}`,\n );\n\n // Auto-transition Open → InProgress when switching to building\n if (effectiveMode === \"building\" && this.taskContext?.status === \"Open\") {\n this.connection.updateStatus(\"InProgress\");\n this.taskContext.status = \"InProgress\";\n }\n }\n\n softStop(): void {\n this.interrupted = true;\n\n // Interrupt the active SDK query if one is running\n const host = this._queryHost;\n if (host?.activeQuery) {\n const q = host.activeQuery as { interrupt?: () => Promise<void> };\n if (typeof q.interrupt === \"function\") {\n void q.interrupt();\n }\n host.activeQuery = null;\n }\n\n // Unblock any pending input wait so the core loop continues\n if (this.inputResolver) {\n this.inputResolver(null);\n this.inputResolver = null;\n }\n }\n\n stop(): void {\n this.stopped = true;\n this.clearIdleTimers();\n if (this.inputResolver) {\n this.inputResolver(null);\n this.inputResolver = null;\n }\n }\n}\n","import type {\n SDKAssistantMessage,\n SDKResultMessage,\n SDKResultSuccess,\n SDKResultError,\n SDKSystemMessage,\n SDKCompactBoundaryMessage,\n SDKTaskStartedMessage,\n SDKTaskProgressMessage,\n SDKRateLimitEvent,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport type { TaskContext, ActivityEventSummary } from \"../types.js\";\nimport type { QueryHost } from \"./query-executor.js\";\n\nexport type UsageInfo = {\n input_tokens?: number;\n cache_read_input_tokens?: number;\n cache_creation_input_tokens?: number;\n};\n\n/** Convert a resetsAt value (epoch seconds, epoch ms, or ISO string) to an ISO string. */\nfunction epochSecondsToISO(value: unknown): string | undefined {\n if (typeof value === \"string\") return value;\n if (typeof value !== \"number\" || value <= 0) return undefined;\n // Heuristic: epoch seconds for dates after 2000 are < 1e12; milliseconds are >= 1e12\n const ms = value < 1e12 ? value * 1000 : value;\n return new Date(ms).toISOString();\n}\n\nexport async function processAssistantEvent(\n event: SDKAssistantMessage,\n host: QueryHost,\n turnToolCalls: ActivityEventSummary[],\n): Promise<void> {\n const { content } = event.message;\n const turnTextParts: string[] = [];\n\n for (const block of content) {\n if (block.type === \"text\") {\n turnTextParts.push(block.text);\n host.connection.sendEvent({ type: \"message\", content: block.text });\n await host.callbacks.onEvent({ type: \"message\", content: block.text });\n } else if (block.type === \"tool_use\") {\n const inputStr = typeof block.input === \"string\" ? block.input : JSON.stringify(block.input);\n const isContentTool = [\"edit\", \"write\"].includes(block.name.toLowerCase());\n const inputLimit = isContentTool ? 10_000 : 500;\n const summary: ActivityEventSummary = {\n tool: block.name,\n input: inputStr.slice(0, inputLimit),\n timestamp: new Date().toISOString(),\n };\n turnToolCalls.push(summary);\n host.connection.sendEvent({ type: \"tool_use\", tool: block.name, input: inputStr });\n await host.callbacks.onEvent({ type: \"tool_use\", tool: block.name, input: inputStr });\n }\n }\n\n if (turnTextParts.length > 0) {\n host.connection.postChatMessage(turnTextParts.join(\"\\n\\n\"));\n }\n\n if (turnToolCalls.length > 0) {\n host.connection.sendEvent({ type: \"turn_end\", toolCalls: [...turnToolCalls] });\n turnToolCalls.length = 0;\n }\n}\n\nconst API_ERROR_PATTERN = /API Error: [45]\\d\\d/;\nconst IMAGE_ERROR_PATTERN = /Could not process image/i;\n\nfunction isRetriableMessage(msg: string): boolean {\n if (IMAGE_ERROR_PATTERN.test(msg)) return true;\n if (API_ERROR_PATTERN.test(msg)) return true;\n return false;\n}\n\nfunction aggregateModelUsage(modelUsage: Record<string, unknown>): {\n queryInputTokens: number;\n contextWindow: number;\n totalInputTokens: number;\n totalCacheRead: number;\n totalCacheCreation: number;\n} {\n let queryInputTokens = 0;\n let contextWindow = 0;\n let totalInputTokens = 0;\n let totalCacheRead = 0;\n let totalCacheCreation = 0;\n for (const data of Object.values(modelUsage)) {\n const d = data as {\n inputTokens?: number;\n cacheReadInputTokens?: number;\n cacheCreationInputTokens?: number;\n };\n const input = d.inputTokens ?? 0;\n const cacheRead = d.cacheReadInputTokens ?? 0;\n const cacheCreation = d.cacheCreationInputTokens ?? 0;\n totalInputTokens += input;\n totalCacheRead += cacheRead;\n totalCacheCreation += cacheCreation;\n queryInputTokens += input + cacheRead + cacheCreation;\n const cw = (data as { contextWindow?: number }).contextWindow ?? 0;\n if (cw > contextWindow) contextWindow = cw;\n }\n return { queryInputTokens, contextWindow, totalInputTokens, totalCacheRead, totalCacheCreation };\n}\n\nfunction emitContextUpdate(\n modelUsage: Record<string, unknown>,\n host: QueryHost,\n context: TaskContext,\n lastAssistantUsage?: UsageInfo,\n): void {\n const usage = aggregateModelUsage(modelUsage);\n let { contextWindow } = usage;\n\n // Override contextWindow when 1M beta is enabled but SDK reports ≤200K\n const settings = context.agentSettings ?? host.config.agentSettings ?? {};\n const has1mBeta = (settings.betas as string[] | undefined)?.includes(\"context-1m-2025-08-07\");\n if (has1mBeta && contextWindow > 0 && contextWindow <= 200_000) {\n contextWindow = 1_000_000;\n }\n\n if (contextWindow > 0) {\n // Current context fill = last API call's input tokens (per-call, not cumulative)\n const currentContextTokens = lastAssistantUsage\n ? (lastAssistantUsage.input_tokens ?? 0) +\n (lastAssistantUsage.cache_read_input_tokens ?? 0) +\n (lastAssistantUsage.cache_creation_input_tokens ?? 0)\n : usage.queryInputTokens;\n\n host.connection.sendEvent({\n type: \"context_update\",\n contextTokens: currentContextTokens,\n contextWindow,\n inputTokens: usage.totalInputTokens,\n cacheReadInputTokens: usage.totalCacheRead,\n cacheCreationInputTokens: usage.totalCacheCreation,\n totalTokensUsed: usage.queryInputTokens,\n });\n }\n}\n\nfunction trackCostSpending(host: QueryHost, context: TaskContext, cumulativeTotal: number): void {\n if (cumulativeTotal > 0 && context.agentId && context._runnerSessionId) {\n const breakdown = host.costTracker.modelBreakdown;\n host.connection.trackSpending({\n agentId: context.agentId,\n sessionId: context._runnerSessionId,\n totalCostUsd: cumulativeTotal,\n onSubscription: host.config.mode === \"pm\" || !!process.env.CLAUDE_CODE_OAUTH_TOKEN,\n modelUsage: breakdown.length > 0 ? breakdown : undefined,\n });\n }\n}\n\nfunction handleSuccessResult(\n event: SDKResultSuccess,\n host: QueryHost,\n context: TaskContext,\n startTime: number,\n lastAssistantUsage?: UsageInfo,\n): { totalCostUsd: number; retriable: boolean } {\n const durationMs = Date.now() - startTime;\n const summary = event.result || \"Task completed.\";\n const retriable = isRetriableMessage(summary);\n\n const cumulativeTotal = host.costTracker.addQueryCost(event.total_cost_usd);\n\n const { modelUsage } = event;\n if (modelUsage && typeof modelUsage === \"object\") {\n host.costTracker.addModelUsage(modelUsage);\n }\n\n host.connection.sendEvent({ type: \"completed\", summary, costUsd: cumulativeTotal, durationMs });\n\n if (modelUsage && typeof modelUsage === \"object\") {\n emitContextUpdate(modelUsage as Record<string, unknown>, host, context, lastAssistantUsage);\n }\n\n trackCostSpending(host, context, cumulativeTotal);\n\n return { totalCostUsd: cumulativeTotal, retriable };\n}\n\nfunction handleErrorResult(\n event: SDKResultError,\n host: QueryHost,\n): { retriable: boolean; staleSession?: boolean } {\n const errorMsg =\n event.errors.length > 0 ? event.errors.join(\", \") : `Agent stopped: ${event.subtype}`;\n\n // Check for stale session error pattern\n const isStaleSession = errorMsg.includes(\"No conversation found with session ID\");\n\n if (isStaleSession) {\n // Suppress the error event for stale session - this will be handled by session recovery\n return { retriable: false, staleSession: true };\n }\n\n const retriable = isRetriableMessage(errorMsg);\n host.connection.sendEvent({ type: \"error\", message: errorMsg });\n return { retriable };\n}\n\nfunction handleResultEvent(\n event: SDKResultMessage,\n host: QueryHost,\n context: TaskContext,\n startTime: number,\n lastAssistantUsage?: UsageInfo,\n): { totalCostUsd: number; retriable: boolean; resultSummary?: string; staleSession?: boolean } {\n const resultSummary =\n event.subtype === \"success\"\n ? (event as SDKResultSuccess).result\n : (event as SDKResultError).errors.join(\", \");\n\n if (event.subtype === \"success\") {\n const result = handleSuccessResult(\n event as SDKResultSuccess,\n host,\n context,\n startTime,\n lastAssistantUsage,\n );\n return { ...result, resultSummary };\n }\n\n const result = handleErrorResult(event as SDKResultError, host);\n return { totalCostUsd: 0, ...result, resultSummary };\n}\n\nexport async function emitResultEvent(\n event: SDKResultMessage,\n host: QueryHost,\n context: TaskContext,\n startTime: number,\n lastAssistantUsage?: UsageInfo,\n): Promise<{ retriable: boolean; resultSummary?: string; staleSession?: boolean }> {\n const result = handleResultEvent(event, host, context, startTime, lastAssistantUsage);\n const durationMs = Date.now() - startTime;\n\n if (event.subtype === \"success\") {\n const successEvent = event as SDKResultSuccess;\n const summary = successEvent.result || \"Task completed.\";\n await host.callbacks.onEvent({\n type: \"completed\",\n summary,\n costUsd: result.totalCostUsd,\n durationMs,\n });\n } else if (!result.staleSession) {\n // Only emit error event if it's not a stale session (which is handled by recovery logic)\n const errorEvent = event as SDKResultError;\n const errorMsg =\n errorEvent.errors.length > 0\n ? errorEvent.errors.join(\", \")\n : `Agent stopped: ${errorEvent.subtype}`;\n await host.callbacks.onEvent({ type: \"error\", message: errorMsg });\n }\n\n return {\n retriable: result.retriable,\n resultSummary: result.resultSummary,\n staleSession: result.staleSession,\n };\n}\n\nexport function handleRateLimitEvent(\n event: SDKRateLimitEvent,\n host: QueryHost,\n): string | undefined {\n const { rate_limit_info } = event;\n const status = rate_limit_info.status;\n\n // Send structured rate limit update for persistence\n if (rate_limit_info.utilization !== undefined && rate_limit_info.rateLimitType) {\n host.connection.sendEvent({\n type: \"rate_limit_update\",\n rateLimitType: rate_limit_info.rateLimitType,\n utilization: rate_limit_info.utilization,\n status,\n });\n }\n\n if (status === \"rejected\") {\n const resetsAt = epochSecondsToISO(rate_limit_info.resetsAt);\n const resetsAtDisplay = resetsAt ?? \"unknown\";\n const message = `Rate limit rejected (type: ${rate_limit_info.rateLimitType ?? \"unknown\"}, resets at: ${resetsAtDisplay})`;\n host.connection.sendEvent({ type: \"error\", message });\n void host.callbacks.onEvent({ type: \"error\", message });\n return resetsAt;\n } else if (status === \"allowed_warning\") {\n const utilization = rate_limit_info.utilization\n ? `${Math.round(rate_limit_info.utilization * 100)}%`\n : \"high\";\n const message = `Rate limit warning: ${utilization} utilization (type: ${rate_limit_info.rateLimitType ?? \"unknown\"})`;\n host.connection.sendEvent({ type: \"thinking\", message });\n void host.callbacks.onEvent({ type: \"thinking\", message });\n }\n return undefined;\n}\n\nexport async function handleSystemEvent(\n event: SDKSystemMessage,\n host: QueryHost,\n context: TaskContext,\n sessionIdStored: boolean,\n): Promise<boolean> {\n if (event.subtype !== \"init\") return false;\n if (event.session_id && !sessionIdStored) {\n host.connection.storeSessionId(event.session_id);\n context.claudeSessionId = event.session_id;\n }\n await host.callbacks.onEvent({\n type: \"thinking\",\n message: `Agent initialized (model: ${event.model})`,\n });\n return !!(event.session_id && !sessionIdStored);\n}\n\nexport function handleSystemSubevents(\n systemEvent: SDKCompactBoundaryMessage | SDKTaskStartedMessage | SDKTaskProgressMessage,\n host: QueryHost,\n): void {\n if (systemEvent.subtype === \"compact_boundary\") {\n void host.callbacks.onEvent({\n type: \"context_compacted\",\n trigger: systemEvent.compact_metadata.trigger,\n preTokens: systemEvent.compact_metadata.pre_tokens,\n });\n } else if (systemEvent.subtype === \"task_started\") {\n void host.callbacks.onEvent({\n type: \"subagent_started\",\n sdkTaskId: systemEvent.task_id,\n description: systemEvent.description,\n });\n } else if (systemEvent.subtype === \"task_progress\") {\n void host.callbacks.onEvent({\n type: \"subagent_progress\",\n sdkTaskId: systemEvent.task_id,\n description: systemEvent.description,\n toolUses: systemEvent.usage?.tool_uses ?? 0,\n durationMs: systemEvent.usage?.duration_ms ?? 0,\n });\n }\n}\n\nexport function handleToolProgressEvent(event: unknown, host: QueryHost): void {\n const msg = event as { tool_name?: string; elapsed_time_seconds?: number };\n void host.callbacks.onEvent({\n type: \"tool_progress\",\n toolName: msg.tool_name ?? \"\",\n elapsedSeconds: msg.elapsed_time_seconds ?? 0,\n });\n}\n\nexport async function handleAssistantCase(\n event: SDKAssistantMessage,\n host: QueryHost,\n turnToolCalls: ActivityEventSummary[],\n): Promise<UsageInfo | undefined> {\n await processAssistantEvent(event, host, turnToolCalls);\n const msgUsage = (event.message as { usage?: UsageInfo }).usage;\n return msgUsage ?? undefined;\n}\n\nexport async function handleResultCase(\n event: SDKResultMessage,\n host: QueryHost,\n context: TaskContext,\n startTime: number,\n isTyping: boolean,\n lastAssistantUsage: UsageInfo | undefined,\n): Promise<{\n retriable: boolean;\n resultSummary?: string;\n staleSession?: boolean;\n stoppedTyping: boolean;\n}> {\n let stoppedTyping = false;\n if (isTyping) {\n host.connection.sendTypingStop();\n stoppedTyping = true;\n }\n const resultInfo = await emitResultEvent(event, host, context, startTime, lastAssistantUsage);\n return {\n retriable: resultInfo.retriable,\n resultSummary: resultInfo.resultSummary,\n staleSession: resultInfo.staleSession,\n stoppedTyping,\n };\n}\n","import type {\n SDKMessage,\n SDKAssistantMessage,\n SDKResultMessage,\n SDKSystemMessage,\n SDKCompactBoundaryMessage,\n SDKTaskStartedMessage,\n SDKTaskProgressMessage,\n SDKRateLimitEvent,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport type { TaskContext, ActivityEventSummary } from \"../types.js\";\nimport type { QueryHost } from \"./query-executor.js\";\nimport type { UsageInfo } from \"./event-handlers.js\";\nimport {\n handleAssistantCase,\n handleResultCase,\n handleRateLimitEvent,\n handleSystemEvent,\n handleSystemSubevents,\n handleToolProgressEvent,\n} from \"./event-handlers.js\";\n\n/** Mutable state bag threaded through the event loop. */\ninterface EventLoopState {\n sessionIdStored: boolean;\n isTyping: boolean;\n retriable: boolean;\n resultSummary: string | undefined;\n rateLimitResetsAt: string | undefined;\n staleSession: boolean | undefined;\n lastAssistantUsage: UsageInfo | undefined;\n turnToolCalls: ActivityEventSummary[];\n}\n\nfunction stopTypingIfNeeded(host: QueryHost, isTyping: boolean): void {\n if (isTyping) host.connection.sendTypingStop();\n}\n\nasync function processSystemCase(\n event:\n | SDKSystemMessage\n | SDKCompactBoundaryMessage\n | SDKTaskStartedMessage\n | SDKTaskProgressMessage,\n host: QueryHost,\n context: TaskContext,\n state: EventLoopState,\n): Promise<void> {\n if (event.subtype === \"init\") {\n const stored = await handleSystemEvent(event, host, context, state.sessionIdStored);\n if (stored) state.sessionIdStored = true;\n } else {\n handleSystemSubevents(\n event as SDKCompactBoundaryMessage | SDKTaskStartedMessage | SDKTaskProgressMessage,\n host,\n );\n }\n}\n\nasync function processAssistantCase(\n event: SDKAssistantMessage,\n host: QueryHost,\n state: EventLoopState,\n): Promise<void> {\n if (!state.isTyping) {\n setTimeout(() => host.connection.sendTypingStart(), 200);\n state.isTyping = true;\n }\n const usage = await handleAssistantCase(event, host, state.turnToolCalls);\n if (usage) state.lastAssistantUsage = usage;\n}\n\nasync function processResultCase(\n event: SDKResultMessage,\n host: QueryHost,\n context: TaskContext,\n startTime: number,\n state: EventLoopState,\n): Promise<void> {\n const info = await handleResultCase(\n event,\n host,\n context,\n startTime,\n state.isTyping,\n state.lastAssistantUsage,\n );\n if (info.stoppedTyping) state.isTyping = false;\n state.retriable = info.retriable;\n state.resultSummary = info.resultSummary;\n if (info.staleSession) state.staleSession = true;\n}\n\nexport async function processEvents(\n events: AsyncGenerator<SDKMessage, void>,\n context: TaskContext,\n host: QueryHost,\n): Promise<{\n retriable: boolean;\n resultSummary?: string;\n modeRestart?: boolean;\n rateLimitResetsAt?: string;\n staleSession?: boolean;\n}> {\n const startTime = Date.now();\n let lastStatusEmit = Date.now();\n const STATUS_REEMIT_INTERVAL_MS = 5_000;\n\n const state: EventLoopState = {\n sessionIdStored: false,\n isTyping: false,\n retriable: false,\n resultSummary: undefined,\n rateLimitResetsAt: undefined,\n staleSession: undefined,\n lastAssistantUsage: undefined,\n turnToolCalls: [],\n };\n\n for await (const event of events) {\n if (host.isStopped()) break;\n\n // Re-emit \"running\" periodically so missed status events self-correct\n const now = Date.now();\n if (now - lastStatusEmit >= STATUS_REEMIT_INTERVAL_MS) {\n host.connection.emitStatus(\"running\");\n lastStatusEmit = now;\n }\n\n if (host.pendingModeRestart) {\n stopTypingIfNeeded(host, state.isTyping);\n return { retriable: false, modeRestart: true };\n }\n\n switch (event.type) {\n case \"system\":\n await processSystemCase(event as SDKSystemMessage, host, context, state);\n break;\n case \"assistant\":\n await processAssistantCase(event as SDKAssistantMessage, host, state);\n break;\n case \"result\":\n await processResultCase(event as SDKResultMessage, host, context, startTime, state);\n break;\n case \"rate_limit_event\": {\n const resetsAt = handleRateLimitEvent(event as SDKRateLimitEvent, host);\n if (resetsAt) state.rateLimitResetsAt = resetsAt;\n break;\n }\n case \"tool_progress\":\n handleToolProgressEvent(event, host);\n break;\n }\n }\n\n stopTypingIfNeeded(host, state.isTyping);\n\n return {\n retriable: state.retriable,\n resultSummary: state.resultSummary,\n rateLimitResetsAt: state.rateLimitResetsAt,\n ...(state.staleSession && { staleSession: state.staleSession }),\n };\n}\n","/* oxlint-disable max-lines -- query orchestration + retry logic is cohesive; splitting would scatter tightly-coupled control flow */\nimport {\n query,\n type SDKMessage,\n type SDKUserMessage,\n type HookEvent,\n type HookCallbackMatcher,\n type HookJSONOutput,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport type { ConveyorConnection } from \"../connection/index.js\";\nimport { createServiceLogger } from \"../utils/logger.js\";\nimport type {\n AgentRunnerConfig,\n AgentRunnerCallbacks,\n TaskContext,\n MultimodalBlock,\n AgentMode,\n} from \"../types.js\";\nimport { buildInitialPrompt } from \"./prompt-builder.js\";\nimport { buildSystemPrompt } from \"./system-prompt.js\";\nimport { createConveyorMcpServer } from \"../tools/index.js\";\nimport { processEvents } from \"./event-processor.js\";\nimport type { CostTracker } from \"./cost-tracker.js\";\nimport { buildCanUseTool } from \"./tool-access.js\";\n\nconst logger = createServiceLogger(\"QueryExecutor\");\nconst API_ERROR_PATTERN = /API Error: [45]\\d\\d/;\nconst IMAGE_ERROR_PATTERN = /Could not process image/i;\nconst RETRY_DELAYS_MS = [60_000, 120_000, 180_000, 300_000];\n\nexport interface QueryHost {\n config: AgentRunnerConfig;\n connection: ConveyorConnection;\n callbacks: AgentRunnerCallbacks;\n setupLog: string[];\n costTracker: CostTracker;\n agentMode: AgentMode;\n isParentTask: boolean;\n hasExitedPlanMode: boolean;\n pendingModeRestart: boolean;\n sessionIds: Map<string, string>;\n activeQuery: AsyncGenerator<SDKMessage, void> | null;\n isStopped(): boolean;\n createInputStream(\n prompt: string | MultimodalBlock[],\n ): AsyncGenerator<SDKUserMessage, void, unknown>;\n snapshotPlanFiles(): void;\n syncPlanFile(): void;\n onModeTransition?: (newMode: AgentMode) => void;\n}\n\n// ── Query options builder ───────────────────────────────────────────────────\n\nfunction buildHooks(host: QueryHost): Partial<Record<HookEvent, HookCallbackMatcher[]>> {\n return {\n PostToolUse: [\n {\n hooks: [\n async (input): Promise<HookJSONOutput> => {\n if (input.hook_event_name === \"PostToolUse\") {\n const output =\n typeof input.tool_response === \"string\"\n ? input.tool_response.slice(0, 500)\n : JSON.stringify(input.tool_response).slice(0, 500);\n host.connection.sendEvent({\n type: \"tool_result\",\n tool: input.tool_name,\n output,\n isError: false,\n });\n }\n return await Promise.resolve({ continue: true } as HookJSONOutput);\n },\n ],\n timeout: 5,\n },\n ],\n };\n}\n\nfunction buildSandboxConfig(host: QueryHost): Record<string, unknown> {\n const apiHostname = new URL(host.config.conveyorApiUrl).hostname;\n return {\n enabled: true,\n autoAllowBashIfSandboxed: true,\n allowUnsandboxedCommands: false,\n filesystem: {\n allowWrite: [`${host.config.workspaceDir}/**`],\n denyRead: [\"/etc/shadow\", \"/etc/passwd\", \"**/.env\", \"**/.env.*\"],\n denyWrite: [\"**/.env\", \"**/.env.*\", \"**/node_modules/**\"],\n },\n network: {\n allowedDomains: [apiHostname, \"api.anthropic.com\"],\n allowManagedDomainsOnly: true,\n allowLocalBinding: true,\n },\n };\n}\n\nfunction isReadOnlyMode(mode: AgentMode, hasExitedPlanMode: boolean): boolean {\n return mode === \"discovery\" || mode === \"help\" || (mode === \"auto\" && !hasExitedPlanMode);\n}\n\nfunction buildDisallowedTools(\n settings: { disallowedTools?: string[] },\n mode: AgentMode,\n hasExitedPlanMode: boolean,\n): string[] | undefined {\n const modeDisallowed = isReadOnlyMode(mode, hasExitedPlanMode)\n ? [\"TodoWrite\", \"TodoRead\", \"NotebookEdit\"]\n : [];\n const configured = settings.disallowedTools ?? [];\n const combined = [...configured, ...modeDisallowed];\n return combined.length > 0 ? combined : undefined;\n}\n\nfunction buildQueryOptions(host: QueryHost, context: TaskContext): Record<string, unknown> {\n const settings = context.agentSettings ?? host.config.agentSettings ?? {};\n const mode = host.agentMode;\n\n // Read-only modes (auto pre-exit, discovery, help) need acceptEdits so canUseTool is called.\n // This is critical for ALL agent types (PM and task/codespace) because:\n // - It enforces plan-file-only writes during planning\n // - It intercepts ExitPlanMode to trigger the mode restart that switches MCP tools\n // from PM tools to building tools (which includes create_pull_request)\n // Without this, codespace agents in auto mode never get create_pull_request after ExitPlanMode.\n const isCloud = host.config.mode === \"pm\";\n const isReadOnly = isReadOnlyMode(mode, host.hasExitedPlanMode);\n const needsCanUseTool = isReadOnly;\n\n const systemPromptText = buildSystemPrompt(\n host.config.mode,\n context,\n host.config,\n host.setupLog,\n mode,\n );\n const settingSources = (settings.settingSources ?? [\"user\", \"project\"]) as (\n | \"user\"\n | \"project\"\n | \"local\"\n )[];\n\n const baseOptions: Record<string, unknown> = {\n model: context.model || host.config.model,\n systemPrompt: {\n type: \"preset\",\n preset: \"claude_code\",\n append: systemPromptText || undefined,\n },\n settingSources,\n cwd: host.config.workspaceDir,\n permissionMode: needsCanUseTool ? \"acceptEdits\" : \"bypassPermissions\",\n allowDangerouslySkipPermissions: !needsCanUseTool,\n canUseTool: buildCanUseTool(host),\n tools: { type: \"preset\" as const, preset: \"claude_code\" as const },\n mcpServers: { conveyor: createConveyorMcpServer(host.connection, host.config, context, mode) },\n hooks: buildHooks(host),\n maxTurns: settings.maxTurns,\n effort: settings.effort,\n thinking: settings.thinking,\n betas: settings.betas,\n maxBudgetUsd: settings.maxBudgetUsd ?? 50,\n disallowedTools: buildDisallowedTools(settings, mode, host.hasExitedPlanMode),\n enableFileCheckpointing: settings.enableFileCheckpointing,\n stderr: (data: string) => {\n logger.warn(\"Claude Code stderr\", { data: data.trimEnd() });\n },\n };\n\n // Minimal sandbox config for read-only cloud modes to enable autoAllowBashIfSandboxed.\n // Only apply to PM/cloud agents — codespace agents have their own isolation.\n if (isCloud && isReadOnly) {\n baseOptions.sandbox = buildSandboxConfig(host);\n }\n\n return baseOptions;\n}\n\n// ── Multimodal prompt builder ────────────────────────────────────────────\n\ntype ImageMediaType = \"image/gif\" | \"image/jpeg\" | \"image/png\" | \"image/webp\";\n\nfunction buildMultimodalPrompt(\n textPrompt: string,\n context: TaskContext,\n skipImages = false,\n): string | MultimodalBlock[] {\n if (skipImages) return textPrompt;\n\n const taskImages = (context.files ?? []).filter(\n (f) => f.content && f.contentEncoding === \"base64\",\n );\n const chatImages: { fileName: string; mimeType: string; content: string }[] = [];\n for (const msg of context.chatHistory) {\n for (const f of msg.files ?? []) {\n if (f.content && f.contentEncoding === \"base64\") {\n chatImages.push({ fileName: f.fileName, mimeType: f.mimeType, content: f.content });\n }\n }\n }\n\n if (taskImages.length === 0 && chatImages.length === 0) return textPrompt;\n\n const blocks: MultimodalBlock[] = [{ type: \"text\", text: textPrompt }];\n for (const file of taskImages) {\n blocks.push({\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: file.mimeType as ImageMediaType,\n data: file.content ?? \"\",\n },\n });\n blocks.push({ type: \"text\", text: `[Attached image: ${file.fileName} (${file.mimeType})]` });\n }\n for (const file of chatImages) {\n blocks.push({\n type: \"image\",\n source: { type: \"base64\", media_type: file.mimeType as ImageMediaType, data: file.content },\n });\n blocks.push({ type: \"text\", text: `[Chat image: ${file.fileName} (${file.mimeType})]` });\n }\n return blocks;\n}\n\n// ── Follow-up prompt builder ─────────────────────────────────────────────\n\nasync function buildFollowUpPrompt(\n host: QueryHost,\n context: TaskContext,\n followUpContent: string | MultimodalBlock[],\n): Promise<string | MultimodalBlock[]> {\n const isPmMode = host.config.mode === \"pm\";\n const followUpText =\n typeof followUpContent === \"string\"\n ? followUpContent\n : followUpContent\n .filter((b): b is Extract<MultimodalBlock, { type: \"text\" }> => b.type === \"text\")\n .map((b) => b.text)\n .join(\"\\n\");\n\n const followUpImages =\n typeof followUpContent === \"string\"\n ? []\n : followUpContent.filter(\n (b): b is Extract<MultimodalBlock, { type: \"image\" }> => b.type === \"image\",\n );\n\n const textPrompt = isPmMode\n ? `${await buildInitialPrompt(host.config.mode, context, host.config.isAuto, host.agentMode)}\\n\\n---\\n\\nThe team says:\\n${followUpText}`\n : followUpText;\n\n if (isPmMode) {\n const prompt = buildMultimodalPrompt(textPrompt, context);\n if (followUpImages.length > 0 && Array.isArray(prompt)) {\n prompt.push(...followUpImages);\n }\n return prompt;\n }\n if (followUpImages.length > 0) {\n return [{ type: \"text\", text: textPrompt }, ...followUpImages];\n }\n return textPrompt;\n}\n\n// ── SDK query execution ──────────────────────────────────────────────────\n\nexport async function runSdkQuery(\n host: QueryHost,\n context: TaskContext,\n followUpContent?: string | MultimodalBlock[],\n): Promise<void> {\n if (host.isStopped()) return;\n\n const mode = host.agentMode;\n const isDiscoveryLike = mode === \"discovery\" || mode === \"help\";\n const needsPlanSync = isDiscoveryLike || (mode === \"auto\" && !host.hasExitedPlanMode);\n if (needsPlanSync) {\n host.snapshotPlanFiles();\n }\n\n const options = buildQueryOptions(host, context);\n const resume = context.claudeSessionId ?? undefined;\n\n if (followUpContent) {\n const prompt = await buildFollowUpPrompt(host, context, followUpContent);\n const agentQuery = query({\n prompt: typeof prompt === \"string\" ? prompt : host.createInputStream(prompt),\n options: { ...options, resume },\n });\n host.activeQuery = agentQuery;\n try {\n await runWithRetry(agentQuery, context, host, options);\n } finally {\n host.activeQuery = null;\n }\n } else if (isDiscoveryLike) {\n return;\n } else {\n const initialPrompt = await buildInitialPrompt(\n host.config.mode,\n context,\n host.config.isAuto,\n mode,\n );\n const prompt = buildMultimodalPrompt(initialPrompt, context);\n const agentQuery = query({\n prompt: host.createInputStream(prompt),\n options: { ...options, resume },\n });\n host.activeQuery = agentQuery;\n try {\n await runWithRetry(agentQuery, context, host, options);\n } finally {\n host.activeQuery = null;\n }\n }\n\n if (needsPlanSync) {\n host.syncPlanFile();\n }\n}\n\n// ── Retry logic ──────────────────────────────────────────────────────────\n\nasync function buildRetryQuery(\n host: QueryHost,\n context: TaskContext,\n options: Record<string, unknown>,\n lastErrorWasImage: boolean,\n): Promise<AsyncGenerator<SDKMessage, void>> {\n if (lastErrorWasImage) {\n host.connection.postChatMessage(\n \"An attached image could not be processed. Retrying without images...\",\n );\n }\n const retryPrompt = buildMultimodalPrompt(\n await buildInitialPrompt(host.config.mode, context, host.config.isAuto, host.agentMode),\n context,\n lastErrorWasImage,\n );\n return query({\n prompt: host.createInputStream(retryPrompt),\n options: { ...options, resume: undefined },\n });\n}\n\nasync function handleStaleSession(\n context: TaskContext,\n host: QueryHost,\n options: Record<string, unknown>,\n): Promise<void> {\n context.claudeSessionId = null;\n host.connection.storeSessionId(\"\");\n const freshPrompt = buildMultimodalPrompt(\n await buildInitialPrompt(host.config.mode, context, host.config.isAuto, host.agentMode),\n context,\n );\n const freshQuery = query({\n prompt: host.createInputStream(freshPrompt),\n options: { ...options, resume: undefined },\n });\n return runWithRetry(freshQuery, context, host, options);\n}\n\nasync function waitForRetryDelay(host: QueryHost, delayMs: number): Promise<void> {\n await new Promise<void>((resolve) => {\n const timer = setTimeout(resolve, delayMs);\n const checkStopped = setInterval(() => {\n if (host.isStopped()) {\n clearTimeout(timer);\n clearInterval(checkStopped);\n resolve();\n }\n }, 1000);\n setTimeout(() => clearInterval(checkStopped), delayMs + 100);\n });\n}\n\nfunction isStaleOrExitedSession(error: unknown, context: TaskContext): boolean {\n if (!(error instanceof Error)) return false;\n if (error.message.includes(\"No conversation found with session ID\")) return true;\n return !!context.claudeSessionId && error.message.includes(\"process exited\");\n}\n\nfunction isRetriableError(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n return API_ERROR_PATTERN.test(error.message) || IMAGE_ERROR_PATTERN.test(error.message);\n}\n\nfunction classifyImageError(error: unknown): boolean {\n return error instanceof Error && IMAGE_ERROR_PATTERN.test(error.message);\n}\n\nasync function emitRetryStatus(host: QueryHost, attempt: number, delayMs: number): Promise<void> {\n const delayMin = Math.round(delayMs / 60_000);\n host.connection.postChatMessage(\n `API error encountered. Retrying in ${delayMin} minute${delayMin > 1 ? \"s\" : \"\"}... (attempt ${attempt + 1}/${RETRY_DELAYS_MS.length})`,\n );\n host.connection.sendEvent({\n type: \"error\",\n message: `API error, retrying in ${delayMin}m (${attempt + 1}/${RETRY_DELAYS_MS.length})`,\n });\n host.connection.emitStatus(\"waiting_for_input\");\n await host.callbacks.onStatusChange(\"waiting_for_input\");\n\n await waitForRetryDelay(host, delayMs);\n\n host.connection.emitStatus(\"running\");\n await host.callbacks.onStatusChange(\"running\");\n}\n\nfunction handleRateLimitPause(host: QueryHost, rateLimitResetsAt: string): void {\n host.connection.emitRateLimitPause(rateLimitResetsAt);\n host.connection.postChatMessage(\n `Rate limited. The task will be automatically re-queued and resume after ${new Date(rateLimitResetsAt).toLocaleString()}.`,\n );\n}\n\ntype RetryOutcome = { action: \"return\" } | { action: \"continue\"; lastErrorWasImage: boolean };\n\nfunction handleRetryError(\n error: unknown,\n context: TaskContext,\n host: QueryHost,\n options: Record<string, unknown>,\n prevImageError: boolean,\n): RetryOutcome | Promise<void> {\n if (isStaleOrExitedSession(error, context) && context.claudeSessionId) {\n return handleStaleSession(context, host, options);\n }\n if (!isRetriableError(error)) throw error;\n return { action: \"continue\", lastErrorWasImage: classifyImageError(error) || prevImageError };\n}\n\nasync function runWithRetry(\n initialQuery: AsyncGenerator<SDKMessage, void>,\n context: TaskContext,\n host: QueryHost,\n options: Record<string, unknown>,\n): Promise<void> {\n let lastErrorWasImage = false;\n\n for (let attempt = 0; attempt <= RETRY_DELAYS_MS.length; attempt++) {\n if (host.isStopped()) return;\n\n const agentQuery =\n attempt === 0\n ? initialQuery\n : await buildRetryQuery(host, context, options, lastErrorWasImage);\n\n try {\n const { retriable, resultSummary, modeRestart, rateLimitResetsAt, staleSession } =\n await processEvents(agentQuery, context, host);\n if (modeRestart || host.isStopped()) return;\n\n if (rateLimitResetsAt) {\n handleRateLimitPause(host, rateLimitResetsAt);\n return;\n }\n\n // Handle stale session result errors (same recovery as thrown exceptions)\n if (staleSession && context.claudeSessionId) {\n return handleStaleSession(context, host, options);\n }\n\n if (!retriable) return;\n lastErrorWasImage = IMAGE_ERROR_PATTERN.test(resultSummary ?? \"\");\n } catch (error) {\n const outcome = handleRetryError(error, context, host, options, lastErrorWasImage);\n if (outcome instanceof Promise) return outcome;\n if (outcome.action === \"return\") return;\n lastErrorWasImage = outcome.lastErrorWasImage;\n }\n\n if (attempt >= RETRY_DELAYS_MS.length) {\n host.connection.postChatMessage(\n `Agent shutting down after ${RETRY_DELAYS_MS.length} failed retry attempts due to API errors. ` +\n `The task will resume automatically when the codespace restarts.`,\n );\n return;\n }\n\n await emitRetryStatus(host, attempt, RETRY_DELAYS_MS[attempt]);\n }\n}\n","import type { TaskContext, ChatMessage } from \"../types.js\";\n\nfunction findLastAgentMessageIndex(history: ChatMessage[]): number {\n for (let i = history.length - 1; i >= 0; i--) {\n if (history[i].role === \"assistant\") return i;\n }\n return -1;\n}\n\nfunction formatProjectAgents(projectAgents: NonNullable<TaskContext[\"projectAgents\"]>): string[] {\n const parts: string[] = [``, `## Project Agents`];\n for (const pa of projectAgents) {\n const role = pa.role ? `role: ${pa.role}` : \"role: unassigned\";\n const sp =\n pa.storyPoints === null || pa.storyPoints === undefined\n ? \"\"\n : `, story points: ${pa.storyPoints}`;\n parts.push(`- ${pa.agent.name} (${role}${sp})`);\n }\n return parts;\n}\n\nfunction formatStoryPoints(storyPoints: NonNullable<TaskContext[\"storyPoints\"]>): string[] {\n const parts: string[] = [``, `## Story Point Tiers`];\n for (const sp of storyPoints) {\n const desc = sp.description ? ` — ${sp.description}` : \"\";\n parts.push(`- Value ${sp.value}: \"${sp.name}\"${desc}`);\n }\n return parts;\n}\n\nexport function buildPackRunnerSystemPrompt(\n context: TaskContext,\n config: { instructions: string; workspaceDir: string },\n setupLog: string[],\n): string {\n const parts: string[] = [\n `You are an autonomous Pack Runner managing child tasks for the \"${context.title}\" project.`,\n `You are running locally with full access to the repository and task management tools.`,\n `Your job is to sequentially execute child tasks by firing cloud builds, reviewing their PRs, and merging them.`,\n ``,\n `## Child Task Status Lifecycle`,\n `- \"Planning\" — Not ready for execution. Skip it (or escalate if blocking).`,\n `- \"Open\" — Ready to execute. Use start_child_cloud_build to fire it.`,\n `- \"InProgress\" — Currently being worked on by a Task Runner. Wait — it will move to ReviewPR when done.`,\n `- \"ReviewPR\" — Task Runner finished and opened a PR. Review and merge it.`,\n `- \"ReviewDev\" — PR was merged to dev. This child is complete. Move on.`,\n `- \"Complete\" — Fully done. Move on.`,\n ``,\n `## Autonomous Loop`,\n `Follow this loop each time you are launched or relaunched:`,\n ``,\n `1. Call list_subtasks to see the current state of all child tasks.`,\n ` The response includes PR info (githubPRNumber, githubPRUrl) and agent assignment (agentId).`,\n ``,\n `2. Evaluate each child by status (in ordinal order):`,\n ` - \"ReviewPR\": Review and merge its PR with approve_and_merge_pr.`,\n ` - If merge fails due to pending CI: post a status update to chat, state you are going idle, and the system will relaunch you to try again.`,\n ` - If merge fails due to failed CI: use get_task_cli(childTaskId) to check what went wrong. Escalate to the team in chat.`,\n ` - \"InProgress\": A Task Runner is actively working on this child. Do nothing — wait for it to finish.`,\n ` - \"Open\": This is the next child to execute. Fire it with start_child_cloud_build.`,\n ` - If it fails because the child is missing story points or an agent: notify the team in chat and go idle.`,\n ` - \"ReviewDev\" / \"Complete\": Already done. Skip.`,\n ` - \"Planning\": Not ready. If this is blocking progress, notify the team.`,\n ``,\n `3. After merging a PR: run \\`git pull origin ${context.baseBranch}\\` to get the merged changes before firing the next child.`,\n ``,\n `4. After firing a child build: report which task you fired to chat, then explicitly state you are going idle. The system will relaunch you when the child completes or changes status.`,\n ``,\n `5. When ALL children are in \"ReviewDev\" or \"Complete\" (no \"Open\", \"InProgress\", or \"ReviewPR\" remaining): do a final review, summarize results in chat, and mark this parent task complete with update_task_status(\"Complete\").`,\n ``,\n `## Important Rules`,\n `- Process children ONE at a time, in ordinal order.`,\n `- After firing a child build OR when waiting on CI, explicitly state you are going idle. The system will disconnect you and relaunch when there's a status change.`,\n `- Do NOT attempt to write code yourself. Your role is coordination only.`,\n `- If a child is stuck in \"InProgress\" for an unusually long time, use get_task_cli(childTaskId) to check its logs and escalate to the team if it appears stuck.`,\n `- You can use get_task(childTaskId) to get a child's full details including PR URL and branch.`,\n `- list_subtasks returns PR info (githubPRNumber, githubPRUrl) and agent assignment (agentId) for each child — use this to verify readiness before firing builds.`,\n `- You can use read_task_chat to check for team messages.`,\n ];\n\n if (context.storyPoints && context.storyPoints.length > 0) {\n parts.push(...formatStoryPoints(context.storyPoints));\n }\n\n if (context.projectAgents && context.projectAgents.length > 0) {\n parts.push(...formatProjectAgents(context.projectAgents));\n }\n\n if (setupLog.length > 0) {\n parts.push(``, `## Environment setup log`, \"```\", ...setupLog, \"```\");\n }\n\n if (context.agentInstructions) {\n parts.push(``, `## Agent Instructions`, context.agentInstructions);\n }\n if (config.instructions) {\n parts.push(``, `## Additional Instructions`, config.instructions);\n }\n\n parts.push(\n ``,\n `Your responses are sent directly to the task chat — the team sees everything you say.`,\n `Do NOT call the post_to_chat tool for your own task; your replies already appear in chat automatically.`,\n `Only use post_to_chat if you need to message a different task's chat (e.g. a child task).`,\n `Use read_task_chat only if you need to re-read earlier messages beyond the chat context above.`,\n );\n\n return parts.join(\"\\n\");\n}\n\nexport function buildPackRunnerInstructions(\n context: TaskContext,\n scenario: \"fresh\" | \"idle_relaunch\" | \"feedback_relaunch\",\n): string[] {\n const parts: string[] = [`\\n## Instructions`];\n\n if (scenario === \"fresh\") {\n parts.push(\n `You are the Pack Runner for this task and its subtasks.`,\n `Begin your autonomous loop immediately: call list_subtasks to assess the current state.`,\n `If any child is in \"ReviewPR\" status, review and merge its PR first.`,\n `Then fire the next \"Open\" child task.`,\n );\n } else if (scenario === \"idle_relaunch\") {\n parts.push(\n `You have been relaunched — a child task likely changed status (completed work, opened a PR, or was merged).`,\n `Call list_subtasks to check the current state of all children.`,\n `Look for children in \"ReviewPR\" status first — review and merge their PRs.`,\n `If a child you previously fired is now in \"ReviewDev\", it was merged. Pull latest with \\`git pull origin ${context.baseBranch}\\` and continue to the next \"Open\" child.`,\n `If no children need action (all InProgress or waiting), state you are going idle.`,\n );\n } else {\n const lastAgentIdx = findLastAgentMessageIndex(context.chatHistory);\n const newMessages = context.chatHistory\n .slice(lastAgentIdx + 1)\n .filter((m) => m.role === \"user\");\n parts.push(\n `You have been relaunched with new messages.`,\n `\\nNew messages since your last run:`,\n ...newMessages.map((m) => `[${m.userName ?? \"user\"}]: ${m.content}`),\n `\\nAfter addressing the feedback, resume your autonomous loop: call list_subtasks and proceed accordingly.`,\n );\n }\n\n return parts;\n}\n","import { readFile, readdir } from \"node:fs/promises\";\nimport type { TaskContext } from \"../types.js\";\n\ninterface ResolvedEntry {\n type: \"rule\" | \"file\" | \"folder\" | \"doc\";\n path: string;\n label?: string;\n content: string | null;\n charCount: number;\n}\n\ninterface ResolvedTagContext {\n tagName: string;\n description: string | null;\n entries: ResolvedEntry[];\n}\n\nconst TYPE_PRIORITY: Record<string, number> = { rule: 0, file: 1, folder: 2, doc: 3 };\n\n// Binary file extensions to skip content injection\nconst BINARY_EXTENSIONS = new Set([\n \".png\",\n \".jpg\",\n \".jpeg\",\n \".gif\",\n \".webp\",\n \".ico\",\n \".svg\",\n \".bmp\",\n \".mp3\",\n \".mp4\",\n \".wav\",\n \".avi\",\n \".mov\",\n \".pdf\",\n \".zip\",\n \".tar\",\n \".gz\",\n \".woff\",\n \".woff2\",\n \".ttf\",\n \".eot\",\n \".otf\",\n \".exe\",\n \".dll\",\n \".so\",\n \".dylib\",\n \".wasm\",\n]);\n\nfunction isBinaryPath(filePath: string): boolean {\n const ext = filePath.slice(filePath.lastIndexOf(\".\")).toLowerCase();\n return BINARY_EXTENSIONS.has(ext);\n}\n\nfunction getContextBudgetChars(_model: string, betas?: string[]): number {\n const contextWindow = betas?.some((b) => b.includes(\"context-1m\")) ? 1_000_000 : 200_000;\n // 25% of context window, ~4 chars per token\n return contextWindow * 0.25 * 4;\n}\n\nasync function readFileContent(filePath: string, maxChars: number): Promise<string | null> {\n try {\n if (isBinaryPath(filePath)) return null;\n const content = await readFile(filePath, \"utf-8\");\n if (content.length > maxChars) {\n const omitted = content.length - maxChars;\n return content.slice(0, maxChars) + `\\n[... truncated, ${omitted} chars omitted]`;\n }\n return content;\n } catch {\n return null;\n }\n}\n\nasync function readFolderListing(folderPath: string): Promise<string | null> {\n try {\n const entries = await readdir(folderPath);\n return `Files: ${entries.join(\", \")}`;\n } catch {\n return null;\n }\n}\n\nasync function resolveEntry(\n entry: { type: string; path: string; label?: string },\n budget: { remaining: number },\n): Promise<ResolvedEntry> {\n const result: ResolvedEntry = {\n type: entry.type as ResolvedEntry[\"type\"],\n path: entry.path,\n label: entry.label,\n content: null,\n charCount: 0,\n };\n\n if (budget.remaining <= 0) return result;\n\n if (entry.type === \"doc\") {\n // doc type references project documents in DB — skip content injection\n return result;\n }\n\n if (entry.type === \"folder\") {\n const listing = await readFolderListing(entry.path);\n if (listing) {\n result.content = listing;\n result.charCount = listing.length;\n budget.remaining -= listing.length;\n }\n return result;\n }\n\n // rule or file — read from disk\n // Single file cap: 50% of remaining budget\n const maxChars = Math.floor(budget.remaining * 0.5) || budget.remaining;\n const content = await readFileContent(entry.path, maxChars);\n if (content) {\n result.content = content;\n result.charCount = content.length;\n budget.remaining -= content.length;\n }\n return result;\n}\n\nfunction formatEntry(entry: ResolvedEntry): string {\n const label = entry.label ? ` (${entry.label})` : \"\";\n const header = `#### ${entry.path}${label} (${entry.type})`;\n\n if (entry.content === null) {\n return `> ${entry.type}: ${entry.path}${label}`;\n }\n\n if (entry.type === \"folder\") {\n return `${header}\\n${entry.content}`;\n }\n\n // rule or file — wrap in code fence\n return `${header}\\n\\`\\`\\`\\n${entry.content}\\n\\`\\`\\``;\n}\n\nfunction formatResolvedTags(resolved: ResolvedTagContext[]): string {\n const parts: string[] = [`\\n## Tag Context`];\n\n for (const tag of resolved) {\n if (tag.entries.length === 0) continue;\n const desc = tag.description ? ` — ${tag.description}` : \"\";\n parts.push(`\\n### Tag: \"${tag.tagName}\"${desc}`);\n\n const contentEntries = tag.entries.filter((e) => e.content !== null);\n const pointerEntries = tag.entries.filter((e) => e.content === null);\n\n for (const entry of contentEntries) {\n parts.push(`\\n${formatEntry(entry)}`);\n }\n\n if (pointerEntries.length > 0) {\n parts.push(``);\n parts.push(`> Budget limit reached. Remaining linked files (read manually if needed):`);\n for (const entry of pointerEntries) {\n parts.push(formatEntry(entry));\n }\n }\n }\n\n return parts.join(\"\\n\");\n}\n\nexport async function resolveTagContext(\n projectTags: TaskContext[\"projectTags\"],\n taskTagIds: string[],\n model: string,\n betas?: string[],\n): Promise<{ injectedSection: string; stats: { injected: number; skipped: number } }> {\n if (!projectTags?.length || !taskTagIds.length) {\n return { injectedSection: \"\", stats: { injected: 0, skipped: 0 } };\n }\n\n const taskTagIdSet = new Set(taskTagIds);\n const assignedTags = projectTags.filter((t) => taskTagIdSet.has(t.id));\n\n if (assignedTags.length === 0) {\n return { injectedSection: \"\", stats: { injected: 0, skipped: 0 } };\n }\n\n // Collect all entries across tags, sorted by type priority\n const allEntries: { tagIndex: number; entry: { type: string; path: string; label?: string } }[] =\n [];\n for (let i = 0; i < assignedTags.length; i++) {\n const tag = assignedTags[i];\n if (!tag.contextPaths?.length) continue;\n const sorted = [...tag.contextPaths].sort(\n (a, b) => (TYPE_PRIORITY[a.type] ?? 99) - (TYPE_PRIORITY[b.type] ?? 99),\n );\n for (const entry of sorted) {\n allEntries.push({ tagIndex: i, entry });\n }\n }\n\n if (allEntries.length === 0) {\n return { injectedSection: \"\", stats: { injected: 0, skipped: 0 } };\n }\n\n const budgetChars = getContextBudgetChars(model, betas);\n const budget = { remaining: budgetChars };\n let injected = 0;\n let skipped = 0;\n\n // Resolve all entries\n const resolved: ResolvedTagContext[] = assignedTags.map((t) => ({\n tagName: t.name,\n description: t.description,\n entries: [],\n }));\n\n for (const { tagIndex, entry } of allEntries) {\n const result = await resolveEntry(entry, budget);\n resolved[tagIndex].entries.push(result);\n if (result.content === null) {\n skipped++;\n } else {\n injected++;\n }\n }\n\n return {\n injectedSection: formatResolvedTags(resolved),\n stats: { injected, skipped },\n };\n}\n","import type { AgentMode, TaskContext } from \"../types.js\";\n\nfunction buildPropertyInstructions(context: TaskContext): string[] {\n const parts: string[] = [];\n parts.push(\n ``,\n `### Proactive Property Management`,\n `As you plan this task, proactively fill in task properties when you have enough context:`,\n `- Once you understand the scope, use set_story_points to assign a value`,\n `- Use set_task_tags to categorize the work`,\n `- For icons: FIRST call list_icons to check for existing matches. Use set_task_icon if one fits.`,\n ` Only call generate_task_icon if no existing icon is a good fit.`,\n `- Use set_task_title if the current title doesn't accurately reflect the plan`,\n ``,\n `Don't wait for the user to ask — fill these in naturally as the plan takes shape.`,\n `If the user adjusts the plan significantly, update the properties to match.`,\n );\n\n if (context.storyPoints && context.storyPoints.length > 0) {\n parts.push(``, `Available story point tiers:`);\n for (const sp of context.storyPoints) {\n const desc = sp.description ? ` — ${sp.description}` : \"\";\n parts.push(`- Value ${sp.value}: \"${sp.name}\"${desc}`);\n }\n }\n\n if (context.projectTags && context.projectTags.length > 0) {\n parts.push(``, `Available project tags:`);\n for (const tag of context.projectTags) {\n const desc = tag.description ? ` — ${tag.description}` : \"\";\n parts.push(`- ID: \"${tag.id}\", Name: \"${tag.name}\"${desc}`);\n if (tag.contextPaths?.length) {\n for (const link of tag.contextPaths) {\n const label = link.label ? ` (${link.label})` : \"\";\n parts.push(` → ${link.type}: ${link.path}${label}`);\n }\n }\n }\n }\n\n return parts;\n}\n\nfunction buildDiscoveryPrompt(context?: TaskContext): string {\n const parts = [\n `\\n## Mode: Discovery`,\n `You are in Discovery mode — helping plan and scope this task.`,\n `- You have read-only codebase access (can read files, run git commands, search code)`,\n `- You can write plan files in .claude/plans/ only — no other file writes`,\n `- You can create and manage subtasks`,\n `- Goal: collaborate with the user to create a clear plan`,\n `- Proactively fill task properties (SP, tags, icon) as the plan takes shape`,\n ``,\n `### Self-Identification Tools`,\n `Use these MCP tools to set your own task properties:`,\n `- \\`update_task\\` — save your plan and description`,\n `- \\`set_story_points\\` — assign story points`,\n `- \\`set_task_title\\` — set an accurate title`,\n `- \\`set_task_tags\\` — categorize the work`,\n `- \\`set_task_icon\\` / \\`generate_task_icon\\` — set a task icon (call \\`list_icons\\` first)`,\n ``,\n `### Self-Update vs Subtasks`,\n `- If the work fits in a single task (1-3 SP), update YOUR OWN plan and properties — do not create subtasks`,\n `- Only create subtasks when the work genuinely requires multiple independent pieces (e.g., Pack-tier work, 8+ SP)`,\n ``,\n `### Finishing Planning`,\n `Once your plan is complete and all required properties are set, call the **ExitPlanMode** tool.`,\n `- Required before ExitPlanMode will succeed: **plan** (via update_task), **story points** (via set_story_points), **title** (via set_task_title)`,\n `- ExitPlanMode validates these properties and moves the task to Open status`,\n `- It does NOT start building — the team controls when to switch to Build mode`,\n ];\n if (context) parts.push(...buildPropertyInstructions(context));\n return parts.join(\"\\n\");\n}\n\nfunction buildAutoPrompt(context?: TaskContext): string {\n const parts = [\n `\\n## Mode: Auto`,\n `You are in Auto mode — operating autonomously through planning → building → PR.`,\n ``,\n `### Phase 1: Discovery & Planning (current)`,\n `- You have read-only codebase access (can read files, run git commands, search code)`,\n `- You can write plan files in .claude/plans/ only — no other file writes`,\n `- You have MCP tools for task properties: update_task, set_story_points, set_task_tags, set_task_icon, set_task_title`,\n ``,\n `### Required before transitioning:`,\n `Before calling ExitPlanMode, you MUST fill in ALL of these:`,\n `1. **Plan** — Save a clear implementation plan using update_task`,\n `2. **Story Points** — Assign via set_story_points`,\n `3. **Title** — Set an accurate title via set_task_title (if the current one is vague or \"Untitled\")`,\n ``,\n `### Transitioning to Building:`,\n `When your plan is complete and all required properties are set, call the **ExitPlanMode** tool.`,\n `- If any required properties are missing, ExitPlanMode will be denied with details on what's missing`,\n `- Once ExitPlanMode succeeds, the system will automatically restart your session in Building mode with the appropriate model`,\n `- You do NOT need to do anything after calling ExitPlanMode — the transition is handled for you`,\n ``,\n `### Autonomous Guidelines:`,\n `- Make decisions independently — do not ask the team for approval at each step`,\n `- Only escalate when genuinely blocked (ambiguous requirements, missing access, conflicting instructions)`,\n `- Be thorough in discovery: read relevant files, understand the codebase architecture, then plan`,\n ];\n if (context) parts.push(...buildPropertyInstructions(context));\n return parts.join(\"\\n\");\n}\n\nexport function buildModePrompt(\n agentMode: AgentMode | null | undefined,\n context?: TaskContext,\n): string | null {\n switch (agentMode) {\n case \"discovery\":\n return buildDiscoveryPrompt(context);\n case \"building\":\n return [\n `\\n## Mode: Building`,\n `You are in Building mode — executing the plan.`,\n `- You have full coding access (read, write, edit, bash, git)`,\n `- Safety rules: no destructive operations, use --force-with-lease instead of --force`,\n `- If this is a leaf task (no children): execute the plan directly`,\n `- Goal: implement the plan, run tests, open a PR when done`,\n ].join(\"\\n\");\n case \"review\":\n return [\n `\\n## Mode: Review`,\n `You are in Review mode — reviewing and coordinating.`,\n `- You have read-only access plus light edit capability (can suggest fixes, run tests, check linting)`,\n `- For parent tasks: you can manage children, review child PRs, fire next child builds`,\n `- You have Pack Runner coordination tools (list_subtasks, fire builds, approve PRs)`,\n `- Goal: ensure quality, provide feedback, coordinate progression`,\n ].join(\"\\n\");\n case \"auto\":\n return buildAutoPrompt(context);\n default:\n return null;\n }\n}\n","import type { RunnerMode, AgentMode, TaskContext } from \"../types.js\";\nimport { buildPackRunnerSystemPrompt } from \"./pack-runner-prompt.js\";\nimport { buildModePrompt } from \"./mode-prompt.js\";\n\nfunction formatProjectAgentLine(pa: NonNullable<TaskContext[\"projectAgents\"]>[number]): string {\n const role = pa.role ? `role: ${pa.role}` : \"role: unassigned\";\n const sp =\n pa.storyPoints === null || pa.storyPoints === undefined\n ? \"\"\n : `, story points: ${pa.storyPoints}`;\n return `- ${pa.agent.name} (${role}${sp})`;\n}\n\nfunction buildPmPreamble(context: TaskContext): string[] {\n const parts = [\n `You are an AI project manager helping to plan tasks for the \"${context.title}\" project.`,\n `You are running locally with full access to the repository.`,\n `You can read files, search code, and run shell commands (e.g. git log, git diff) to understand the codebase. You cannot write or edit files.`,\n `\\nEnvironment (ready, no setup required):`,\n `- Repository is cloned at your current working directory.`,\n `- You can read files and run git commands to understand the codebase before writing task plans.`,\n `- Check the dev branch (e.g. run: git fetch && git checkout dev || git checkout main) to understand the current state of the codebase that agents will branch off of.`,\n `\\nWorkflow:`,\n `- You can draft and iterate on plans in .claude/plans/*.md — these files are automatically synced to the task.`,\n `- You can also use update_task directly to save the plan to the task.`,\n `- After saving the plan, end your turn with a summary reply (the team sees your responses in chat automatically). Do NOT attempt to execute the plan yourself.`,\n `- A separate task agent will handle execution after the team reviews and approves your plan.`,\n ];\n if (context.isParentTask) {\n parts.push(\n `\\nYou are the Project Manager for this set of tasks.`,\n `This task has child tasks (subtasks) that are tracked on the board.`,\n `Your role is to coordinate, plan, and manage the subtasks — not to write code directly.`,\n `Use the subtask tools (create_subtask, update_subtask, list_subtasks) to manage work breakdown.`,\n );\n }\n if (context.storyPoints && context.storyPoints.length > 0) {\n parts.push(`\\nStory Point Tiers:`);\n for (const sp of context.storyPoints) {\n const desc = sp.description ? ` — ${sp.description}` : \"\";\n parts.push(`- Value ${sp.value}: \"${sp.name}\"${desc}`);\n }\n }\n if (context.projectAgents && context.projectAgents.length > 0) {\n parts.push(`\\nProject Agents:`);\n for (const pa of context.projectAgents) {\n parts.push(formatProjectAgentLine(pa));\n }\n }\n return parts;\n}\n\nfunction buildActivePreamble(context: TaskContext, workspaceDir: string): string[] {\n return [\n `You are an AI project manager in ACTIVE mode for the \"${context.title}\" project.`,\n `You have direct coding access to the repository at ${workspaceDir}.`,\n `You can edit files, run tests, and make commits.`,\n `You still have access to all PM tools (subtasks, update_task, chat).`,\n `\\nEnvironment (ready, no setup required):`,\n `- Repository is cloned at your current working directory.`,\n `- You can read, write, and edit files directly.`,\n `- You can run shell commands including git, build tools, and test runners.`,\n context.githubBranch ? `- You are working on branch: \\`${context.githubBranch}\\`` : \"\",\n `\\nSafety rules:`,\n `- Stay within the project directory (${workspaceDir}).`,\n `- Do NOT run \\`git push --force\\` or \\`git reset --hard\\`. Use \\`--force-with-lease\\` if needed.`,\n `- Do NOT delete \\`.env\\` files or modify \\`node_modules\\`.`,\n `- Do NOT run destructive commands like \\`rm -rf /\\`.`,\n `\\nWorkflow:`,\n `- You can make code changes, fix bugs, run tests, and commit directly.`,\n `- When done with changes, summarize what you did in your reply.`,\n `- If you toggled into active mode temporarily, mention when you're done so the team can switch you back to planning mode.`,\n ].filter(Boolean);\n}\n\nfunction buildTaskAgentPreamble(context: TaskContext): string[] {\n return [\n `You are an AI agent working on a task for the \"${context.title}\" project.`,\n `You are running inside a GitHub Codespace with full access to the repository.`,\n `\\nEnvironment (fully ready — do NOT verify or set up):`,\n `- Repository is cloned at your current working directory.`,\n `- Branch \\`${context.githubBranch}\\` is already checked out.`,\n `- All dependencies are installed, database is migrated, and the dev server is running.`,\n `- Git is configured. Commit and push directly to this branch.`,\n `\\nIMPORTANT — Skip all environment verification. Do NOT run any of the following:`,\n `- bun/npm install, pip install, or any dependency installation`,\n `- bun build, bun lint, bun test, bun typecheck, or any build/check commands as a \"first step\"`,\n `- bun db:generate, bun db:push, prisma migrate, or any database setup`,\n `- bun dev, npm start, or any dev server startup commands`,\n `- pwd, ls, echo, or exploratory shell commands to \"check\" the environment`,\n `Only run these if you encounter a specific error that requires it.`,\n `Start reading the task plan and writing code immediately.`,\n `\\nGit safety — STRICT rules:`,\n `- NEVER run \\`git checkout main\\`, \\`git checkout dev\\`, or switch to any branch other than \\`${context.githubBranch}\\`.`,\n `- NEVER create new branches (no \\`git checkout -b\\`, \\`git switch -c\\`, etc.).`,\n `- This branch was created from \\`${context.baseBranch}\\`. PRs will automatically target that branch.`,\n `- If \\`git push\\` fails with \"non-fast-forward\", run \\`git push --force-with-lease origin ${context.githubBranch}\\`. This branch is exclusively yours — force-with-lease is safe.`,\n ];\n}\n\nexport function buildSystemPrompt(\n mode: RunnerMode | undefined,\n context: TaskContext,\n config: { instructions: string; workspaceDir: string; isAuto?: boolean },\n setupLog: string[],\n agentMode?: AgentMode | null,\n): string {\n const isPm = mode === \"pm\";\n const isPmActive = isPm && agentMode === \"building\";\n const isPackRunner = isPm && !!config.isAuto && !!context.isParentTask;\n\n if (isPackRunner) {\n return buildPackRunnerSystemPrompt(context, config, setupLog);\n }\n\n const parts = isPmActive\n ? buildActivePreamble(context, config.workspaceDir)\n : isPm\n ? buildPmPreamble(context)\n : buildTaskAgentPreamble(context);\n\n if (setupLog.length > 0) {\n parts.push(\n `\\nEnvironment setup log (already executed before you started — proof that setup succeeded):`,\n \"```\",\n ...setupLog,\n \"```\",\n );\n }\n\n if (context.agentInstructions) {\n parts.push(`\\nAgent Instructions:\\n${context.agentInstructions}`);\n }\n if (config.instructions) {\n parts.push(`\\nAdditional Instructions:\\n${config.instructions}`);\n }\n parts.push(\n `\\nYour responses are sent directly to the task chat — the team sees everything you say.`,\n `Do NOT call the post_to_chat tool for your own task; your replies already appear in chat automatically.`,\n `Only use post_to_chat if you need to message a different task's chat (e.g. a parent task via get_task).`,\n `Use read_task_chat only if you need to re-read earlier messages beyond the chat context above.`,\n );\n if (!isPm || isPmActive) {\n parts.push(\n `Use the mcp__conveyor__create_pull_request tool to open PRs — do NOT use gh CLI or shell commands for PR creation.`,\n );\n }\n\n const modePrompt = buildModePrompt(agentMode, context);\n if (modePrompt) {\n parts.push(modePrompt);\n }\n\n return parts.join(\"\\n\");\n}\n","import type { RunnerMode, AgentMode, TaskContext, ChatMessage } from \"../types.js\";\nimport { buildPackRunnerInstructions } from \"./pack-runner-prompt.js\";\nimport { resolveTagContext } from \"./tag-context-resolver.js\";\n\nexport { buildSystemPrompt } from \"./system-prompt.js\";\n\nfunction formatFileSize(bytes: number | undefined): string {\n if (bytes === undefined) return \"\";\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${Math.round(bytes / 1024)}KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n}\n\nfunction findLastAgentMessageIndex(history: ChatMessage[]): number {\n for (let i = history.length - 1; i >= 0; i--) {\n if (history[i].role === \"assistant\") return i;\n }\n return -1;\n}\n\nfunction detectRelaunchScenario(\n context: TaskContext,\n trustChatHistory = false,\n): \"fresh\" | \"idle_relaunch\" | \"feedback_relaunch\" {\n const lastAgentIdx = findLastAgentMessageIndex(context.chatHistory);\n if (lastAgentIdx === -1) return \"fresh\";\n\n // For PM/Pack Runner agents, chat history with assistant messages is a reliable\n // indicator of prior work (only PMs post as assistant to their own chat during planning).\n // For task agents, only claudeSessionId and githubPRUrl are reliable — assistant\n // messages in chat may be from a prior PM agent, not from a prior task agent run.\n const hasPriorWork = !!context.githubPRUrl || !!context.claudeSessionId || trustChatHistory;\n if (!hasPriorWork) return \"fresh\";\n\n const messagesAfterAgent = context.chatHistory.slice(lastAgentIdx + 1);\n const hasNewUserMessages = messagesAfterAgent.some((m) => m.role === \"user\");\n return hasNewUserMessages ? \"feedback_relaunch\" : \"idle_relaunch\";\n}\n\nfunction buildRelaunchWithSession(\n mode: RunnerMode | undefined,\n context: TaskContext,\n agentMode?: AgentMode | null,\n): string | null {\n const scenario = detectRelaunchScenario(context);\n if (!context.claudeSessionId || scenario === \"fresh\") return null;\n\n const parts: string[] = [];\n const lastAgentIdx = findLastAgentMessageIndex(context.chatHistory);\n\n if (mode === \"pm\") {\n const newMessages = context.chatHistory\n .slice(lastAgentIdx + 1)\n .filter((m) => m.role === \"user\");\n if (newMessages.length > 0) {\n parts.push(\n `You have been relaunched. Here are new messages since your last session:`,\n ...newMessages.map((m) => `[${m.userName ?? \"user\"}]: ${m.content}`),\n );\n } else {\n parts.push(`You have been relaunched. No new messages since your last session.`);\n }\n parts.push(\n `\\nYou are the project manager for this task.`,\n `Review the context above and wait for the team to provide instructions before taking action.`,\n );\n } else if (scenario === \"feedback_relaunch\") {\n const newMessages = context.chatHistory\n .slice(lastAgentIdx + 1)\n .filter((m) => m.role === \"user\");\n parts.push(\n `You have been relaunched with new feedback.`,\n `Work on the git branch \"${context.githubBranch}\". Stay on this branch — do not checkout or create other branches.`,\n `\\nNew messages since your last run:`,\n ...newMessages.map((m) => `[${m.userName ?? \"user\"}]: ${m.content}`),\n `\\nAddress the requested changes. Do NOT re-investigate the codebase from scratch or write a new plan — review the feedback and implement the changes directly.`,\n `Commit and push your updates.`,\n );\n if (context.githubPRUrl) {\n parts.push(\n `An existing PR is open at ${context.githubPRUrl} — push to the same branch. Do NOT create a new PR.`,\n );\n } else {\n parts.push(\n `When finished, use the mcp__conveyor__create_pull_request tool to open a PR. Do NOT use gh CLI.`,\n );\n }\n } else {\n parts.push(\n `You were relaunched but no new instructions have been given since your last run.`,\n `Work on the git branch \"${context.githubBranch}\". Stay on this branch — do not checkout or create other branches.`,\n `Run \\`git log --oneline -10\\` to review what you already committed.`,\n `Review the current state of the codebase and verify everything is working correctly.`,\n );\n if (agentMode === \"auto\" || agentMode === \"building\") {\n parts.push(\n `If work is incomplete, continue implementing the plan. When finished, commit, push, and use mcp__conveyor__create_pull_request to open a PR.`,\n `Do NOT go idle or wait for instructions — you are in auto mode.`,\n );\n } else {\n parts.push(\n `Reply with a brief status update (visible in chat), then wait for further instructions.`,\n );\n }\n if (context.githubPRUrl) {\n parts.push(`An existing PR is open at ${context.githubPRUrl}. Do not create a new PR.`);\n }\n }\n\n return parts.join(\"\\n\");\n}\n\ninterface FileAttachment {\n fileName: string;\n mimeType: string;\n fileSize?: number;\n content?: string;\n contentEncoding?: string;\n downloadUrl?: string;\n fileId?: string;\n}\n\nfunction formatChatFile(file: FileAttachment): string[] {\n const sizeStr = file.fileSize ? `, ${formatFileSize(file.fileSize)}` : \"\";\n if (file.content && file.contentEncoding === \"utf-8\") {\n return [\n `[Attached: ${file.fileName} (${file.mimeType}${sizeStr})]`,\n \"```\",\n file.content,\n \"```\",\n ];\n }\n if (!file.content) {\n return [`[Attached: ${file.fileName} (${file.mimeType}${sizeStr})]: ${file.downloadUrl}`];\n }\n if (file.content && file.contentEncoding === \"base64\") {\n return [\n `[Attached image: ${file.fileName} (${file.mimeType}${sizeStr}) — use get_task_file(\"${file.fileId}\") to view]`,\n ];\n }\n return [`[Attached: ${file.fileName} (${file.mimeType}${sizeStr})]`];\n}\n\nfunction formatTaskFile(file: FileAttachment): string[] {\n if (file.content && file.contentEncoding === \"utf-8\") {\n return [`\\n### ${file.fileName} (${file.mimeType})`, \"```\", file.content, \"```\"];\n }\n if (file.content && file.contentEncoding === \"base64\") {\n const size = formatFileSize(file.fileSize);\n return [\n `- [Attached image: ${file.fileName} (${file.mimeType}${size ? `, ${size}` : \"\"}) — use get_task_file(\"${file.fileId}\") to view]`,\n ];\n }\n if (!file.content) {\n return [`- **${file.fileName}** (${file.mimeType}): ${file.downloadUrl}`];\n }\n return [];\n}\n\nfunction formatChatHistory(chatHistory: TaskContext[\"chatHistory\"]): string[] {\n const relevant = chatHistory.slice(-20);\n const parts = [`\\n## Recent Chat Context`];\n for (const msg of relevant) {\n const sender = msg.userName ?? msg.role;\n parts.push(`[${sender}]: ${msg.content}`);\n if (msg.files?.length) {\n for (const file of msg.files) {\n parts.push(...formatChatFile(file));\n }\n }\n }\n return parts;\n}\n\nasync function resolveTaskTagContext(context: TaskContext): Promise<string | null> {\n if (!context.projectTags?.length || !context.taskTagIds?.length) return null;\n const { injectedSection } = await resolveTagContext(\n context.projectTags,\n context.taskTagIds,\n context.model,\n context.agentSettings?.betas,\n );\n return injectedSection || null;\n}\n\nasync function buildTaskBody(context: TaskContext): Promise<string[]> {\n const parts: string[] = [];\n parts.push(`# Task: ${context.title}`);\n if (context.description) {\n parts.push(`\\n## Description\\n${context.description}`);\n }\n if (context.plan) {\n parts.push(`\\n## Plan\\n${context.plan}`);\n }\n\n if (context.files && context.files.length > 0) {\n parts.push(`\\n## Attached Files`);\n for (const file of context.files) {\n parts.push(...formatTaskFile(file));\n }\n }\n\n if (context.repoRefs && context.repoRefs.length > 0) {\n parts.push(`\\n## Repository References`);\n for (const ref of context.repoRefs) {\n const icon = ref.refType === \"folder\" ? \"folder\" : \"file\";\n parts.push(`- [${icon}] \\`${ref.path}\\``);\n }\n }\n\n const tagSection = await resolveTaskTagContext(context);\n if (tagSection) parts.push(tagSection);\n\n if (context.chatHistory.length > 0) {\n parts.push(...formatChatHistory(context.chatHistory));\n }\n\n return parts;\n}\n\nfunction buildFreshInstructions(\n isPm: boolean,\n isAutoMode: boolean,\n context: TaskContext,\n agentMode?: AgentMode | null,\n): string[] {\n // After auto→building transition, agent needs building instructions\n // PM→building only happens through auto mode, so always include anti-idle guidance\n if (isPm && agentMode === \"building\") {\n return [\n `Your plan has been approved. Begin implementing it now.`,\n `Work on the git branch \"${context.githubBranch}\". Stay on this branch — do not checkout or create other branches.`,\n `Start by reading the relevant source files mentioned in the plan, then write code.`,\n `When finished, commit and push your changes, then use the mcp__conveyor__create_pull_request tool to open a PR. Do NOT use gh CLI.`,\n `\\nCRITICAL: You are in Auto mode. Do NOT report status, ask for confirmation, or go idle without making code changes.`,\n `Your FIRST action must be reading source files from the plan, then immediately writing code.`,\n `Do NOT summarize the plan or say \"ready to implement\" — start implementing.`,\n `When all changes are committed and pushed, use mcp__conveyor__create_pull_request to open a PR.`,\n `If you are genuinely blocked, explain the specific blocker — do not go idle silently.`,\n ];\n }\n if (isAutoMode && isPm) {\n return [\n `You are operating autonomously. Begin planning immediately.`,\n `1. Explore the codebase to understand the architecture and relevant files`,\n `2. Draft a clear implementation plan and save it with update_task`,\n `3. Set story points (set_story_points), tags (set_task_tags), and title (set_task_title)`,\n `4. When the plan and all required properties are set, call ExitPlanMode to transition to building`,\n `Do NOT wait for team input — proceed autonomously.`,\n ];\n }\n if (isPm && context.isParentTask) {\n return [\n `You are the project manager for this task and its subtasks.`,\n `Use list_subtasks to review the current state of child tasks.`,\n `The task details are provided above. Wait for the team to provide instructions before taking action.`,\n `When you finish planning, save the plan with update_task and end your turn. Your reply will be visible to the team in chat.`,\n ];\n }\n if (isPm) {\n return [\n `You are the project manager for this task.`,\n `The task details are provided above. Wait for the team to ask questions or provide additional requirements before starting to plan.`,\n `When you finish planning, save the plan with update_task and end your turn. Your reply summarizing the plan will be visible in chat. A separate task agent will execute the plan after review.`,\n ];\n }\n const parts = [\n `Begin executing the task plan above immediately.`,\n `Your FIRST action should be reading the relevant source files mentioned in the plan, then writing code. Do NOT run install, build, lint, test, or dev server commands first — the environment is already set up.`,\n `Work on the git branch \"${context.githubBranch}\". Stay on this branch for the entire task. Do not checkout or create other branches.`,\n `Your replies are visible to the team in chat — briefly describe what you're doing when you begin meaningful implementation, and again when the PR is ready.`,\n `When finished, commit your changes, then run \\`git fetch origin ${context.githubBranch}\\` and \\`git push origin ${context.githubBranch}\\` (use --force-with-lease if push fails). Then use the mcp__conveyor__create_pull_request tool to open a PR. Do NOT use gh CLI or any other method to create PRs.`,\n ];\n if (isAutoMode) {\n parts.push(\n `\\nCRITICAL: You are in Auto mode. Do NOT report status, ask for confirmation, or go idle without making code changes.`,\n `Do NOT summarize the plan or say \"ready to implement\" — start implementing immediately.`,\n `When all changes are committed and pushed, you MUST use mcp__conveyor__create_pull_request to open a PR before finishing.`,\n `If you are genuinely blocked, explain the specific blocker — do not go idle silently.`,\n );\n }\n return parts;\n}\n\nfunction buildFeedbackInstructions(context: TaskContext, isPm: boolean): string[] {\n const lastAgentIdx = findLastAgentMessageIndex(context.chatHistory);\n const newMessages = context.chatHistory.slice(lastAgentIdx + 1).filter((m) => m.role === \"user\");\n if (isPm) {\n return [\n `You were relaunched with new feedback since your last run.`,\n `You are the project manager for this task.`,\n `\\nNew messages since your last run:`,\n ...newMessages.map((m) => `[${m.userName ?? \"user\"}]: ${m.content}`),\n `\\nReview these messages and wait for the team to provide instructions before taking action.`,\n ];\n }\n const parts = [\n `You have been relaunched to address feedback on your previous work.`,\n `Work on the git branch \"${context.githubBranch}\". Stay on this branch — do not checkout or create other branches.`,\n `Start by running \\`git log --oneline -10\\` and \\`git diff HEAD~3 HEAD --stat\\` to review what you already committed.`,\n `\\nNew messages since your last run:`,\n ...newMessages.map((m) => `[${m.userName ?? \"user\"}]: ${m.content}`),\n `\\nAddress the requested changes directly. Do NOT re-investigate the codebase from scratch or write a new plan — go straight to implementing the feedback.`,\n `Commit and push your updates.`,\n ];\n if (context.githubPRUrl) {\n parts.push(\n `An existing PR is open at ${context.githubPRUrl} — push to the same branch to update it. Do NOT create a new PR.`,\n );\n } else {\n parts.push(\n `When finished, use the mcp__conveyor__create_pull_request tool to open a PR. Do NOT use gh CLI or any other method to create PRs.`,\n );\n }\n return parts;\n}\n\nfunction buildInstructions(\n mode: RunnerMode | undefined,\n context: TaskContext,\n scenario: \"fresh\" | \"idle_relaunch\" | \"feedback_relaunch\",\n agentMode?: AgentMode | null,\n): string[] {\n const parts: string[] = [`\\n## Instructions`];\n const isPm = mode === \"pm\";\n\n if (scenario === \"fresh\") {\n parts.push(...buildFreshInstructions(isPm, agentMode === \"auto\", context, agentMode));\n return parts;\n }\n\n if (scenario === \"idle_relaunch\") {\n if (isPm && (agentMode === \"building\" || agentMode === \"review\" || agentMode === \"auto\")) {\n // PM agent in building/review mode (e.g. after auto transition) — give building instructions\n parts.push(\n `You were relaunched but no new instructions have been given since your last run.`,\n `Work on the git branch \"${context.githubBranch}\". Stay on this branch — do not checkout or create other branches.`,\n `Run \\`git log --oneline -10\\` to review what you already committed, then verify the current state is correct.`,\n `Reply with a brief status update summarizing where things stand (visible in chat).`,\n `Then wait for further instructions — do NOT redo work that was already completed.`,\n );\n if (context.githubPRUrl) {\n parts.push(`An existing PR is open at ${context.githubPRUrl}. Do not create a new PR.`);\n }\n } else if (isPm) {\n parts.push(\n `You were relaunched but no new instructions have been given since your last run.`,\n `You are the project manager for this task.`,\n `Wait for the team to provide instructions before taking action.`,\n );\n } else {\n parts.push(\n `You were relaunched but no new instructions have been given since your last run.`,\n `Work on the git branch \"${context.githubBranch}\". Stay on this branch — do not checkout or create other branches.`,\n `Run \\`git log --oneline -10\\` to review what you already committed, then verify the current state is correct.`,\n );\n if (agentMode === \"auto\" || agentMode === \"building\") {\n parts.push(\n `If work is incomplete, continue implementing the plan. When finished, commit, push, and use mcp__conveyor__create_pull_request to open a PR.`,\n `Do NOT go idle or wait for instructions — you are in auto mode.`,\n );\n } else {\n parts.push(\n `Reply with a brief status update summarizing where things stand (visible in chat).`,\n `Then wait for further instructions — do NOT redo work that was already completed.`,\n );\n }\n if (context.githubPRUrl) {\n parts.push(`An existing PR is open at ${context.githubPRUrl}. Do not create a new PR.`);\n }\n }\n return parts;\n }\n\n parts.push(...buildFeedbackInstructions(context, isPm));\n return parts;\n}\n\nexport async function buildInitialPrompt(\n mode: RunnerMode | undefined,\n context: TaskContext,\n isAuto?: boolean,\n agentMode?: AgentMode | null,\n): Promise<string> {\n const isPackRunner = mode === \"pm\" && !!isAuto && !!context.isParentTask;\n\n if (!isPackRunner) {\n const sessionRelaunch = buildRelaunchWithSession(mode, context, agentMode);\n if (sessionRelaunch) return sessionRelaunch;\n }\n\n const isPm = mode === \"pm\";\n const scenario = detectRelaunchScenario(context, isPm);\n const body = await buildTaskBody(context);\n const instructions = isPackRunner\n ? buildPackRunnerInstructions(context, scenario)\n : buildInstructions(mode, context, scenario, agentMode);\n return [...body, ...instructions].join(\"\\n\");\n}\n","import { createSdkMcpServer } from \"@anthropic-ai/claude-agent-sdk\";\nimport type { ConveyorConnection } from \"../connection/index.js\";\nimport type { AgentRunnerConfig, AgentMode, TaskContext } from \"../types.js\";\nimport { buildCommonTools } from \"./common-tools.js\";\nimport { buildPmTools, buildUpdateTaskTool } from \"./pm-tools.js\";\nimport { buildDiscoveryTools } from \"./discovery-tools.js\";\n\nexport function textResult(text: string): { content: { type: \"text\"; text: string }[] } {\n return { content: [{ type: \"text\" as const, text }] };\n}\n\nexport function imageBlock(\n data: string,\n mimeType: string,\n): { type: \"image\"; data: string; mimeType: string } {\n return { type: \"image\" as const, data, mimeType };\n}\n\nfunction getTaskModeTools(agentMode: AgentMode | undefined, connection: ConveyorConnection) {\n // Task-mode agents need update_task in discovery/auto to save their plan,\n // but should NOT get subtask or pack management tools.\n if (agentMode === \"discovery\" || agentMode === \"auto\") {\n return [buildUpdateTaskTool(connection)];\n }\n return [];\n}\n\nfunction getModeTools(\n agentMode: AgentMode | undefined,\n connection: ConveyorConnection,\n config: AgentRunnerConfig,\n context?: TaskContext,\n) {\n if (config.mode === \"task\") return getTaskModeTools(agentMode, connection);\n\n switch (agentMode) {\n case \"building\":\n return context?.isParentTask\n ? buildPmTools(connection, context?.storyPoints, { includePackTools: true })\n : [];\n case \"review\":\n case \"auto\":\n case \"discovery\":\n case \"help\":\n return buildPmTools(connection, context?.storyPoints, {\n includePackTools: !!context?.isParentTask,\n });\n default:\n return config.mode === \"pm\"\n ? buildPmTools(connection, context?.storyPoints, { includePackTools: false })\n : [];\n }\n}\n\n// oxlint-disable-next-line typescript/explicit-function-return-type\nexport function createConveyorMcpServer(\n connection: ConveyorConnection,\n config: AgentRunnerConfig,\n context?: TaskContext,\n agentMode?: AgentMode,\n) {\n const commonTools = buildCommonTools(connection, config);\n const effectiveMode = agentMode ?? context?.agentMode ?? undefined;\n const modeTools = getModeTools(effectiveMode, connection, config, context);\n\n const discoveryTools =\n effectiveMode === \"discovery\" || effectiveMode === \"auto\"\n ? buildDiscoveryTools(connection, context)\n : [];\n\n return createSdkMcpServer({\n name: \"conveyor\",\n tools: [...commonTools, ...modeTools, ...discoveryTools],\n });\n}\n","import { tool } from \"@anthropic-ai/claude-agent-sdk\";\nimport { z } from \"zod\";\nimport type { ConveyorConnection } from \"../connection/index.js\";\nimport type { AgentRunnerConfig, AgentEvent } from \"../types.js\";\nimport { textResult, imageBlock } from \"./index.js\";\n\ntype ContentBlock =\n | { type: \"text\"; text: string }\n | { type: \"image\"; data: string; mimeType: string };\n\nfunction isImageMimeType(mimeType: string): boolean {\n return mimeType.startsWith(\"image/\");\n}\n\ntype EventRecord = Record<string, unknown>;\n\nconst cliEventFormatters: Record<string, (e: EventRecord) => string> = {\n thinking: (e) => (e.message as string) ?? \"\",\n tool_use: (e) => `${e.tool}: ${(e.input as string)?.slice(0, 1000) ?? \"\"}`,\n tool_result: (e) =>\n `${e.tool} → ${(e.output as string)?.slice(0, 500) ?? \"\"}${e.isError ? \" [ERROR]\" : \"\"}`,\n message: (e) => (e.content as string) ?? \"\",\n error: (e) => `ERROR: ${(e.message as string) ?? \"\"}`,\n completed: (e) =>\n `Completed: ${(e.summary as string) ?? \"\"} (cost: $${e.costUsd ?? \"?\"}, duration: ${e.durationMs ?? \"?\"}ms)`,\n setup_output: (e) => `[${(e.stream as string) ?? \"stdout\"}] ${(e.data as string) ?? \"\"}`,\n start_command_output: (e) => `[${(e.stream as string) ?? \"stdout\"}] ${(e.data as string) ?? \"\"}`,\n turn_end: (e) => `Turn complete (${(e.toolCalls as unknown[])?.length ?? 0} tool calls)`,\n};\n\nfunction formatCliEvent(e: AgentEvent): string {\n const formatter = cliEventFormatters[e.type];\n return formatter ? formatter(e as unknown as EventRecord) : JSON.stringify(e);\n}\n\nfunction buildReadTaskChatTool(connection: ConveyorConnection) {\n return tool(\n \"read_task_chat\",\n \"Read recent messages from a task chat. Omit task_id to read the current task's chat, or provide a child task ID to read a child's chat.\",\n {\n limit: z.number().optional().describe(\"Number of recent messages to fetch (default 20)\"),\n task_id: z\n .string()\n .optional()\n .describe(\"Child task ID to read chat from. Omit to read the current task's chat.\"),\n },\n async ({ limit, task_id }) => {\n try {\n const messages = await connection.fetchChatMessages(limit, task_id);\n return textResult(JSON.stringify(messages, null, 2));\n } catch {\n return textResult(\n JSON.stringify({\n note: \"Could not fetch live chat. Chat history was provided in the initial context.\",\n }),\n );\n }\n },\n { annotations: { readOnlyHint: true } },\n );\n}\n\nfunction buildPostToChatTool(connection: ConveyorConnection) {\n return tool(\n \"post_to_chat\",\n \"Post a message to a task chat. Your normal replies already appear in chat — only use this for explicit out-of-band updates or posting to a child task's chat.\",\n {\n message: z.string().describe(\"The message to post to the team\"),\n task_id: z\n .string()\n .optional()\n .describe(\"Child task ID to post to. Omit to post to the current task's chat.\"),\n },\n async ({ message, task_id }) => {\n try {\n if (task_id) {\n await connection.postChildChatMessage(task_id, message);\n return textResult(`Message posted to child task ${task_id} chat.`);\n }\n connection.postChatMessage(message);\n return textResult(\"Message posted to task chat.\");\n } catch (error) {\n return textResult(\n `Failed to post message: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n );\n}\n\nfunction buildUpdateTaskStatusTool(connection: ConveyorConnection) {\n return tool(\n \"update_task_status\",\n \"Update a task's status on the Kanban board. Omit task_id to update the current task, or provide a child task ID to update a child's status.\",\n {\n status: z\n .enum([\"InProgress\", \"ReviewPR\", \"ReviewDev\", \"Complete\"])\n .describe(\"The new status for the task\"),\n task_id: z\n .string()\n .optional()\n .describe(\"Child task ID to update. Omit to update the current task.\"),\n },\n async ({ status, task_id }) => {\n try {\n if (task_id) {\n await connection.updateChildStatus(task_id, status);\n return textResult(`Child task ${task_id} status updated to ${status}.`);\n }\n connection.updateStatus(status);\n return textResult(`Task status updated to ${status}.`);\n } catch (error) {\n return textResult(\n `Failed to update status: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n );\n}\n\nfunction buildGetTaskPlanTool(connection: ConveyorConnection, config: AgentRunnerConfig) {\n return tool(\n \"get_task_plan\",\n \"Re-read the latest task plan in case it was updated\",\n {},\n async () => {\n try {\n const ctx = await connection.fetchTaskContext();\n return textResult(ctx.plan ?? \"No plan available.\");\n } catch {\n return textResult(`Task ID: ${config.taskId} - could not fetch updated plan.`);\n }\n },\n { annotations: { readOnlyHint: true } },\n );\n}\n\nfunction buildGetTaskTool(connection: ConveyorConnection) {\n return tool(\n \"get_task\",\n \"Look up a task by slug or ID to get its title, description, plan, and status\",\n {\n slug_or_id: z.string().describe(\"The task slug (e.g. 'my-task') or CUID\"),\n },\n async ({ slug_or_id }) => {\n try {\n const task = await connection.fetchTask(slug_or_id);\n return textResult(JSON.stringify(task, null, 2));\n } catch (error) {\n return textResult(\n `Failed to get task: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n { annotations: { readOnlyHint: true } },\n );\n}\n\nfunction buildGetTaskCliTool(connection: ConveyorConnection) {\n return tool(\n \"get_task_cli\",\n \"Read CLI execution logs from a task. Returns agent reasoning, tool calls, setup output, and other execution events. Use 'source' to filter: 'agent' for agent reasoning/tool calls only, 'application' for setup/dev-server output only.\",\n {\n task_id: z\n .string()\n .optional()\n .describe(\"Task ID or slug. Omit to read logs from the current task.\"),\n source: z\n .enum([\"agent\", \"application\"])\n .optional()\n .describe(\"Filter by log source. Omit for all logs.\"),\n limit: z\n .number()\n .optional()\n .describe(\"Max number of log entries to return (default 50, max 500).\"),\n },\n async ({ task_id, source, limit }) => {\n try {\n const effectiveLimit = Math.min(limit ?? 50, 500);\n const result = await connection.fetchCliHistory(task_id, effectiveLimit, source);\n const formatted = result\n .map((entry) => {\n const time = entry.time;\n const e = entry.event;\n return `[${time}] [${e.type}] ${formatCliEvent(e)}`;\n })\n .join(\"\\n\");\n return textResult(formatted || \"No CLI logs found.\");\n } catch (error) {\n return textResult(\n `Failed to fetch CLI logs: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n { annotations: { readOnlyHint: true } },\n );\n}\n\nfunction buildListTaskFilesTool(connection: ConveyorConnection) {\n return tool(\n \"list_task_files\",\n \"List all files attached to this task with metadata (name, type, size) and download URLs\",\n {},\n async () => {\n try {\n const files = await connection.fetchTaskFiles();\n const metadata = files.map(({ content: _c, ...rest }) => rest);\n const content: ContentBlock[] = [\n { type: \"text\" as const, text: JSON.stringify(metadata, null, 2) },\n ];\n for (const file of files) {\n if (file.content && file.contentEncoding === \"base64\" && isImageMimeType(file.mimeType)) {\n content.push(imageBlock(file.content, file.mimeType));\n }\n }\n return { content };\n } catch {\n return textResult(\"Failed to list task files.\");\n }\n },\n { annotations: { readOnlyHint: true } },\n );\n}\n\nfunction buildGetTaskFileTool(connection: ConveyorConnection) {\n return tool(\n \"get_task_file\",\n \"Get a specific task file's content and download URL by file ID\",\n { fileId: z.string().describe(\"The file ID to retrieve\") },\n async ({ fileId }) => {\n try {\n const file = await connection.fetchTaskFile(fileId);\n const { content: rawContent, ...metadata } = file;\n const content: ContentBlock[] = [\n { type: \"text\" as const, text: JSON.stringify(metadata, null, 2) },\n ];\n if (rawContent && file.contentEncoding === \"base64\" && isImageMimeType(file.mimeType)) {\n content.push(imageBlock(rawContent, file.mimeType));\n } else if (rawContent) {\n content[0] = { type: \"text\" as const, text: JSON.stringify(file, null, 2) };\n }\n return { content };\n } catch (error) {\n return textResult(\n `Failed to get task file: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n { annotations: { readOnlyHint: true } },\n );\n}\n\nfunction buildSearchIncidentsTool(connection: ConveyorConnection) {\n return tool(\n \"search_incidents\",\n \"Search incidents in the current project. Optionally filter by status (Open, Acknowledged, Investigating, Resolved, Closed) or source.\",\n {\n status: z.string().optional().describe(\"Filter by incident status\"),\n source: z\n .string()\n .optional()\n .describe(\"Filter by source (e.g., 'conveyor', 'agent', 'build')\"),\n },\n async ({ status, source }) => {\n try {\n const incidents = await connection.searchIncidents(status, source);\n return textResult(JSON.stringify(incidents, null, 2));\n } catch (error) {\n return textResult(\n `Failed to search incidents: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n { annotations: { readOnlyHint: true } },\n );\n}\n\nfunction buildGetTaskIncidentsTool(connection: ConveyorConnection) {\n return tool(\n \"get_task_incidents\",\n \"Get all incidents linked to the current task (or a specified task). Returns full incident details including title, description, severity, status, and source.\",\n {\n task_id: z.string().optional().describe(\"Task ID (defaults to current task)\"),\n },\n async ({ task_id }) => {\n try {\n const incidents = await connection.getTaskIncidents(task_id);\n return textResult(JSON.stringify(incidents, null, 2));\n } catch (error) {\n return textResult(\n `Failed to get task incidents: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n { annotations: { readOnlyHint: true } },\n );\n}\n\nfunction buildCreatePullRequestTool(connection: ConveyorConnection) {\n return tool(\n \"create_pull_request\",\n \"Create a GitHub pull request for this task. Use this instead of gh CLI or git commands to create PRs.\",\n {\n title: z.string().describe(\"The PR title\"),\n body: z.string().describe(\"The PR description/body in markdown\"),\n },\n async ({ title, body }) => {\n try {\n const result = await connection.createPR({ title, body });\n connection.sendEvent({\n type: \"pr_created\",\n url: result.url,\n number: result.number,\n });\n return textResult(`Pull request #${result.number} created: ${result.url}`);\n } catch (error) {\n const msg = error instanceof Error ? error.message : \"Unknown error\";\n return textResult(`Failed to create pull request: ${msg}`);\n }\n },\n );\n}\n\nexport function buildCommonTools(connection: ConveyorConnection, config: AgentRunnerConfig) {\n return [\n buildReadTaskChatTool(connection),\n buildPostToChatTool(connection),\n buildUpdateTaskStatusTool(connection),\n buildGetTaskPlanTool(connection, config),\n buildGetTaskTool(connection),\n buildGetTaskCliTool(connection),\n buildListTaskFilesTool(connection),\n buildGetTaskFileTool(connection),\n buildSearchIncidentsTool(connection),\n buildGetTaskIncidentsTool(connection),\n buildCreatePullRequestTool(connection),\n ];\n}\n","import { tool } from \"@anthropic-ai/claude-agent-sdk\";\nimport { z } from \"zod\";\nimport type { ConveyorConnection } from \"../connection/index.js\";\nimport type { TaskContext } from \"../types.js\";\nimport { textResult } from \"./index.js\";\n\nexport function buildStoryPointDescription(storyPoints?: TaskContext[\"storyPoints\"]): string {\n if (storyPoints && storyPoints.length > 0) {\n const tiers = storyPoints.map((sp) => `${sp.value}=${sp.name}`).join(\", \");\n return `Story point value (${tiers})`;\n }\n return \"Story point value (1=Common, 2=Magic, 3=Rare, 5=Unique)\";\n}\n\nfunction buildSubtaskTools(connection: ConveyorConnection, spDescription: string) {\n return [\n tool(\n \"create_subtask\",\n \"Create a subtask under the current parent task. Use for breaking complex tasks into smaller pieces.\",\n {\n title: z.string().describe(\"Subtask title\"),\n description: z.string().optional().describe(\"Brief description\"),\n plan: z.string().optional().describe(\"Implementation plan in markdown\"),\n ordinal: z.number().optional().describe(\"Step/order number (0-based)\"),\n storyPointValue: z.number().optional().describe(spDescription),\n },\n async (params) => {\n try {\n const result = await connection.createSubtask(params);\n return textResult(`Subtask created with ID: ${result.id}`);\n } catch (error) {\n return textResult(\n `Failed to create subtask: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n ),\n tool(\n \"update_subtask\",\n \"Update an existing subtask's fields\",\n {\n subtaskId: z.string().describe(\"The subtask ID to update\"),\n title: z.string().optional(),\n description: z.string().optional(),\n plan: z.string().optional(),\n ordinal: z.number().optional(),\n storyPointValue: z.number().optional().describe(spDescription),\n },\n async ({ subtaskId, ...fields }) => {\n try {\n await Promise.resolve(connection.updateSubtask(subtaskId, fields));\n return textResult(\"Subtask updated.\");\n } catch (error) {\n return textResult(`Failed: ${error instanceof Error ? error.message : \"Unknown error\"}`);\n }\n },\n ),\n tool(\n \"delete_subtask\",\n \"Delete a subtask\",\n { subtaskId: z.string().describe(\"The subtask ID to delete\") },\n async ({ subtaskId }) => {\n try {\n await Promise.resolve(connection.deleteSubtask(subtaskId));\n return textResult(\"Subtask deleted.\");\n } catch (error) {\n return textResult(`Failed: ${error instanceof Error ? error.message : \"Unknown error\"}`);\n }\n },\n ),\n tool(\n \"list_subtasks\",\n \"List all subtasks under the current parent task. Returns status, PR info (githubPRNumber, githubPRUrl), agent assignment (agentId), and plan for each child.\",\n {},\n async () => {\n try {\n const subtasks = await connection.listSubtasks();\n return textResult(JSON.stringify(subtasks, null, 2));\n } catch {\n return textResult(\"Failed to list subtasks.\");\n }\n },\n { annotations: { readOnlyHint: true } },\n ),\n ];\n}\n\nexport function buildUpdateTaskTool(connection: ConveyorConnection) {\n return tool(\n \"update_task\",\n \"Save the finalized task plan and/or description\",\n {\n plan: z.string().optional().describe(\"The task plan in markdown\"),\n description: z.string().optional().describe(\"Updated task description\"),\n },\n async ({ plan, description }) => {\n try {\n await Promise.resolve(connection.updateTaskFields({ plan, description }));\n return textResult(\"Task updated successfully.\");\n } catch {\n return textResult(\"Failed to update task.\");\n }\n },\n );\n}\n\nexport function buildPmTools(\n connection: ConveyorConnection,\n storyPoints?: TaskContext[\"storyPoints\"],\n options?: { includePackTools?: boolean },\n) {\n const spDescription = buildStoryPointDescription(storyPoints);\n const tools = [buildUpdateTaskTool(connection), ...buildSubtaskTools(connection, spDescription)];\n\n if (!options?.includePackTools) return tools;\n return [...tools, ...buildPackTools(connection)];\n}\n\nfunction buildPackTools(connection: ConveyorConnection) {\n return [\n tool(\n \"start_child_cloud_build\",\n \"Start a cloud build for a child task. The child must be in Open status with story points and an agent assigned.\",\n {\n childTaskId: z.string().describe(\"The child task ID to start a cloud build for\"),\n },\n async ({ childTaskId }) => {\n try {\n const result = await connection.startChildCloudBuild(childTaskId);\n return textResult(`Cloud build started for child task: ${result.childTaskId}`);\n } catch (error) {\n return textResult(\n `Failed to start child cloud build: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n ),\n tool(\n \"stop_child_build\",\n \"Stop a running cloud build for a child task. Sends a stop signal to the child agent.\",\n {\n childTaskId: z.string().describe(\"The child task ID whose build should be stopped\"),\n },\n async ({ childTaskId }) => {\n try {\n await connection.stopChildBuild(childTaskId);\n return textResult(`Stop signal sent to child task: ${childTaskId}`);\n } catch (error) {\n return textResult(\n `Failed to stop child build: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n ),\n tool(\n \"approve_and_merge_pr\",\n \"Approve and merge a child task's pull request. Only succeeds if all CI/CD checks are passing. Returns an error if checks are pending (retry after waiting) or failed (investigate). The child task must be in ReviewPR status.\",\n {\n childTaskId: z\n .string()\n .describe(\"The child task ID whose PR should be approved and merged\"),\n },\n async ({ childTaskId }) => {\n try {\n const result = await connection.approveAndMergePR(childTaskId);\n if (result.merged) {\n return textResult(\n `PR #${result.prNumber} approved and merged for task ${result.childTaskId}. Task status updated to ReviewDev.`,\n );\n }\n return textResult(\n `PR #${result.prNumber} merge queued for task ${result.childTaskId} — CI checks still in progress. The PR will auto-merge when all checks pass. Do NOT proceed as if merged. Wait for the child task status to change to ReviewDev before continuing.`,\n );\n } catch (error) {\n return textResult(\n `Failed to approve and merge PR: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n ),\n ];\n}\n","import { tool } from \"@anthropic-ai/claude-agent-sdk\";\nimport { z } from \"zod\";\nimport type { ConveyorConnection } from \"../connection/index.js\";\nimport type { TaskContext } from \"../types.js\";\nimport { textResult } from \"./index.js\";\nimport { buildStoryPointDescription } from \"./pm-tools.js\";\n\nfunction buildIconTools(connection: ConveyorConnection) {\n return [\n tool(\n \"list_icons\",\n \"List available icons (default library + user-created). Returns icon IDs, names, and whether they're defaults. Call this FIRST before set_task_icon to check for existing matches.\",\n {},\n async () => {\n try {\n const icons = await connection.listIcons();\n return textResult(JSON.stringify(icons, null, 2));\n } catch (error) {\n return textResult(\n `Failed to list icons: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n { annotations: { readOnlyHint: true } },\n ),\n tool(\n \"set_task_icon\",\n \"Assign an existing icon to this task by its ID. Use list_icons first to find a matching icon.\",\n {\n iconId: z.string().describe(\"The icon ID to assign\"),\n },\n async ({ iconId }) => {\n try {\n await Promise.resolve(connection.updateTaskProperties({ iconId }));\n return textResult(\"Icon assigned to task.\");\n } catch (error) {\n return textResult(\n `Failed to set icon: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n ),\n tool(\n \"generate_task_icon\",\n \"Generate a new SVG icon using AI and assign it to this task. Only use if no existing icon from list_icons is a good fit. Provide a concise visual description.\",\n {\n prompt: z\n .string()\n .describe(\n \"Description of the icon to generate (e.g. 'minimal flat gear and wrench icon')\",\n ),\n aspectRatio: z\n .enum([\"auto\", \"portrait\", \"landscape\", \"square\"])\n .optional()\n .describe(\"Icon aspect ratio, defaults to square\"),\n },\n async ({ prompt, aspectRatio }) => {\n try {\n const result = await connection.generateTaskIcon(prompt, aspectRatio ?? \"square\");\n return textResult(`Icon generated and assigned: ${result.iconId}`);\n } catch (error) {\n return textResult(\n `Failed to generate icon: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n ),\n ];\n}\n\nexport function buildDiscoveryTools(connection: ConveyorConnection, context?: TaskContext) {\n const spDescription = buildStoryPointDescription(context?.storyPoints);\n\n return [\n tool(\n \"set_story_points\",\n \"Set the story point estimate for this task. Use after understanding the scope of the work.\",\n { value: z.number().describe(spDescription) },\n async ({ value }) => {\n try {\n await Promise.resolve(connection.updateTaskProperties({ storyPointValue: value }));\n return textResult(`Story points set to ${value}`);\n } catch (error) {\n return textResult(\n `Failed to set story points: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n ),\n tool(\n \"set_task_tags\",\n \"Assign tags to this task from the project's available tags. Use the tag IDs from the project tags list.\",\n {\n tagIds: z.array(z.string()).describe(\"Array of tag IDs to assign\"),\n },\n async ({ tagIds }) => {\n try {\n await Promise.resolve(connection.updateTaskProperties({ tagIds }));\n return textResult(`Tags assigned: ${tagIds.length} tag(s)`);\n } catch (error) {\n return textResult(\n `Failed to set tags: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n ),\n tool(\n \"set_task_title\",\n \"Update the task title to better reflect the planned work.\",\n {\n title: z.string().describe(\"The new task title\"),\n },\n async ({ title }) => {\n try {\n await Promise.resolve(connection.updateTaskProperties({ title }));\n return textResult(`Task title updated to: ${title}`);\n } catch (error) {\n return textResult(\n `Failed to update title: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n );\n }\n },\n ),\n ...buildIconTools(connection),\n ];\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { QueryHost } from \"./query-executor.js\";\n\nconst PM_PLAN_FILE_TOOLS = new Set([\"Write\", \"Edit\", \"MultiEdit\"]);\nconst DESTRUCTIVE_CMD_PATTERN =\n /git\\s+push\\s+--force(?!\\s*-with-lease)|git\\s+reset\\s+--hard|rm\\s+-rf\\s+\\//;\n\ntype ToolResult =\n | { behavior: \"allow\"; updatedInput?: Record<string, unknown> }\n | { behavior: \"deny\"; message: string };\n\nfunction isPlanFile(input: Record<string, unknown>): boolean {\n const filePath = String(input.file_path ?? input.path ?? \"\");\n return filePath.includes(\".claude/plans/\");\n}\n\nfunction handleDiscoveryToolAccess(toolName: string, input: Record<string, unknown>): ToolResult {\n if (PM_PLAN_FILE_TOOLS.has(toolName)) {\n if (isPlanFile(input)) {\n return { behavior: \"allow\", updatedInput: input };\n }\n return {\n behavior: \"deny\",\n message: \"Discovery mode is read-only. File writes are restricted to plan files.\",\n };\n }\n return { behavior: \"allow\", updatedInput: input };\n}\n\nfunction handleBuildingToolAccess(toolName: string, input: Record<string, unknown>): ToolResult {\n if (toolName === \"Bash\") {\n const cmd = String(input.command ?? \"\");\n if (DESTRUCTIVE_CMD_PATTERN.test(cmd)) {\n return {\n behavior: \"deny\",\n message: \"Destructive operation blocked. Use safer alternatives.\",\n };\n }\n }\n return { behavior: \"allow\", updatedInput: input };\n}\n\nfunction handleReviewToolAccess(\n toolName: string,\n input: Record<string, unknown>,\n isParentTask: boolean,\n): ToolResult {\n if (isParentTask) {\n return handleBuildingToolAccess(toolName, input);\n }\n if (PM_PLAN_FILE_TOOLS.has(toolName)) {\n if (isPlanFile(input)) {\n return { behavior: \"allow\", updatedInput: input };\n }\n return {\n behavior: \"deny\",\n message: \"Review mode restricts file writes. Use bash to run tests and linting instead.\",\n };\n }\n if (toolName === \"Bash\") {\n const cmd = String(input.command ?? \"\");\n if (DESTRUCTIVE_CMD_PATTERN.test(cmd)) {\n return { behavior: \"deny\", message: \"Destructive operation blocked in review mode.\" };\n }\n }\n return { behavior: \"allow\", updatedInput: input };\n}\n\nfunction handleAutoToolAccess(\n toolName: string,\n input: Record<string, unknown>,\n hasExitedPlanMode: boolean,\n isParentTask: boolean,\n): ToolResult {\n if (hasExitedPlanMode) {\n return isParentTask\n ? handleReviewToolAccess(toolName, input, true)\n : handleBuildingToolAccess(toolName, input);\n }\n if (PM_PLAN_FILE_TOOLS.has(toolName)) {\n if (isPlanFile(input)) {\n return { behavior: \"allow\", updatedInput: input };\n }\n return {\n behavior: \"deny\",\n message:\n \"You are in auto plan mode. File writes are restricted to plan files. Call ExitPlanMode when your plan is ready to start building.\",\n };\n }\n return { behavior: \"allow\", updatedInput: input };\n}\n\nasync function handleExitPlanMode(\n host: QueryHost,\n input: Record<string, unknown>,\n): Promise<ToolResult> {\n try {\n // Flush any locally-written plan files to the server before validation.\n // syncPlanFile fires updateTaskFields (fire-and-forget), and Socket.IO\n // guarantees ordering on a single connection, so the update will be\n // processed before the subsequent getTaskProperties request-response.\n host.syncPlanFile();\n\n const taskProps = await host.connection.getTaskProperties();\n const missingProps: string[] = [];\n\n if (!taskProps.plan?.trim()) missingProps.push(\"plan (save via update_task)\");\n if (!taskProps.storyPointId) missingProps.push(\"story points (use set_story_points)\");\n if (!taskProps.title || taskProps.title === \"Untitled\")\n missingProps.push(\"title (use set_task_title)\");\n\n if (missingProps.length > 0) {\n return {\n behavior: \"deny\" as const,\n message: [\n \"Cannot exit plan mode yet. Required task properties are missing:\",\n ...missingProps.map((p) => `- ${p}`),\n \"\",\n \"Fill these in using MCP tools, then try ExitPlanMode again.\",\n ].join(\"\\n\"),\n };\n }\n\n await host.connection.triggerIdentification();\n host.hasExitedPlanMode = true;\n\n if (host.agentMode === \"discovery\") {\n // Discovery mode: identify → Open, but do NOT restart into building.\n // The user controls when to switch modes.\n host.connection.postChatMessage(\n \"Task identified and moved to Open. Switch to Build mode when ready to start implementation.\",\n );\n return { behavior: \"allow\" as const, updatedInput: input };\n }\n\n const newMode = host.isParentTask ? \"review\" : \"building\";\n host.pendingModeRestart = true;\n if (host.onModeTransition) {\n host.onModeTransition(newMode);\n }\n\n return { behavior: \"allow\" as const, updatedInput: input };\n } catch (err) {\n return {\n behavior: \"deny\" as const,\n message: `Identification failed: ${err instanceof Error ? err.message : String(err)}. Fix the issue and try again.`,\n };\n }\n}\n\nasync function handleAskUserQuestion(\n host: QueryHost,\n input: Record<string, unknown>,\n): Promise<ToolResult> {\n const QUESTION_TIMEOUT_MS = 5 * 60 * 1000;\n const questions = input.questions as {\n question: string;\n header: string;\n options: { label: string; description: string; preview?: string }[];\n multiSelect?: boolean;\n }[];\n\n const requestId = randomUUID();\n host.connection.emitStatus(\"waiting_for_input\");\n host.connection.sendEvent({\n type: \"tool_use\",\n tool: \"AskUserQuestion\",\n input: JSON.stringify(input),\n });\n\n const answerPromise = host.connection.askUserQuestion(requestId, questions);\n const timeoutPromise = new Promise<null>((resolve) => {\n setTimeout(() => resolve(null), QUESTION_TIMEOUT_MS);\n });\n\n const answers = await Promise.race([answerPromise, timeoutPromise]);\n host.connection.emitStatus(\"running\");\n\n if (!answers) {\n return {\n behavior: \"deny\",\n message:\n \"User did not respond to clarifying questions in time. Proceed with your best judgment.\",\n };\n }\n\n return { behavior: \"allow\", updatedInput: { questions: input.questions, answers } };\n}\n\nexport function buildCanUseTool(\n host: QueryHost,\n): (toolName: string, input: Record<string, unknown>) => Promise<ToolResult> {\n return async (toolName, input) => {\n if (\n toolName === \"ExitPlanMode\" &&\n (host.agentMode === \"auto\" || host.agentMode === \"discovery\") &&\n !host.hasExitedPlanMode\n ) {\n return await handleExitPlanMode(host, input);\n }\n\n if (toolName === \"AskUserQuestion\") {\n return await handleAskUserQuestion(host, input);\n }\n\n switch (host.agentMode) {\n case \"discovery\":\n return handleDiscoveryToolAccess(toolName, input);\n case \"building\":\n return handleBuildingToolAccess(toolName, input);\n case \"review\":\n return handleReviewToolAccess(toolName, input, host.isParentTask);\n case \"auto\":\n return handleAutoToolAccess(toolName, input, host.hasExitedPlanMode, host.isParentTask);\n default:\n return { behavior: \"allow\", updatedInput: input };\n }\n };\n}\n","export interface ModelUsageEntry {\n model: string;\n inputTokens: number;\n outputTokens: number;\n cacheReadInputTokens: number;\n cacheCreationInputTokens: number;\n costUSD: number;\n}\n\nexport class CostTracker {\n private cumulativeCostUsd = 0;\n private modelUsage = new Map<string, ModelUsageEntry>();\n\n /** Add cost from a completed query and return the running total */\n addQueryCost(queryCostUsd: number): number {\n this.cumulativeCostUsd += queryCostUsd;\n return this.cumulativeCostUsd;\n }\n\n /** Merge per-model usage from a completed query */\n addModelUsage(\n usage: Record<\n string,\n {\n inputTokens?: number;\n outputTokens?: number;\n cacheReadInputTokens?: number;\n cacheCreationInputTokens?: number;\n costUSD?: number;\n }\n >,\n ): void {\n for (const [model, data] of Object.entries(usage)) {\n const existing = this.modelUsage.get(model) ?? {\n model,\n inputTokens: 0,\n outputTokens: 0,\n cacheReadInputTokens: 0,\n cacheCreationInputTokens: 0,\n costUSD: 0,\n };\n existing.inputTokens += data.inputTokens ?? 0;\n existing.outputTokens += data.outputTokens ?? 0;\n existing.cacheReadInputTokens += data.cacheReadInputTokens ?? 0;\n existing.cacheCreationInputTokens += data.cacheCreationInputTokens ?? 0;\n existing.costUSD += data.costUSD ?? 0;\n this.modelUsage.set(model, existing);\n }\n }\n\n get totalCostUsd(): number {\n return this.cumulativeCostUsd;\n }\n\n get modelBreakdown(): ModelUsageEntry[] {\n return [...this.modelUsage.values()];\n }\n}\n","import { readdirSync, statSync, readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { ConveyorConnection } from \"../connection/index.js\";\n\nexport class PlanSync {\n private planFileSnapshot = new Map<string, number>();\n private lockedPlanFile: string | null = null;\n private workspaceDir: string;\n private connection: ConveyorConnection;\n\n constructor(workspaceDir: string, connection: ConveyorConnection) {\n this.workspaceDir = workspaceDir;\n this.connection = connection;\n }\n\n updateWorkspaceDir(workspaceDir: string): void {\n this.workspaceDir = workspaceDir;\n }\n\n private getPlanDirs(): string[] {\n return [join(homedir(), \".claude\", \"plans\"), join(this.workspaceDir, \".claude\", \"plans\")];\n }\n\n snapshotPlanFiles(): void {\n this.planFileSnapshot.clear();\n this.lockedPlanFile = null;\n for (const plansDir of this.getPlanDirs()) {\n try {\n for (const file of readdirSync(plansDir).filter((f) => f.endsWith(\".md\"))) {\n try {\n const fullPath = join(plansDir, file);\n const stat = statSync(fullPath);\n this.planFileSnapshot.set(fullPath, stat.mtimeMs);\n } catch {\n continue;\n }\n }\n } catch {\n /* plans dir doesn't exist yet */\n }\n }\n }\n\n private findNewestPlanFile(): { path: string; mtime: number } | null {\n let newest: { path: string; mtime: number } | null = null;\n for (const plansDir of this.getPlanDirs()) {\n let files: string[];\n try {\n files = readdirSync(plansDir).filter((f) => f.endsWith(\".md\"));\n } catch {\n continue;\n }\n\n for (const file of files) {\n const fullPath = join(plansDir, file);\n try {\n const stat = statSync(fullPath);\n const prevMtime = this.planFileSnapshot.get(fullPath);\n const isNew = prevMtime === undefined || stat.mtimeMs > prevMtime;\n if (isNew && (!newest || stat.mtimeMs > newest.mtime)) {\n newest = { path: fullPath, mtime: stat.mtimeMs };\n }\n } catch {\n continue;\n }\n }\n }\n return newest;\n }\n\n syncPlanFile(): void {\n if (this.lockedPlanFile) {\n try {\n const content = readFileSync(this.lockedPlanFile, \"utf-8\").trim();\n if (content) {\n this.connection.updateTaskFields({ plan: content });\n const fileName = this.lockedPlanFile.split(\"/\").pop() ?? \"plan\";\n this.connection.postChatMessage(`Synced local plan file (${fileName}) to the task plan.`);\n }\n } catch {\n /* locked file was deleted */\n }\n return;\n }\n\n const newest = this.findNewestPlanFile();\n if (newest) {\n this.lockedPlanFile = newest.path;\n const content = readFileSync(newest.path, \"utf-8\").trim();\n if (content) {\n this.connection.updateTaskFields({ plan: content });\n const fileName = newest.path.split(\"/\").pop() ?? \"plan\";\n this.connection.postChatMessage(\n `Detected local plan file (${fileName}) and synced it to the task plan.`,\n );\n }\n }\n }\n}\n","import type { AgentRunnerConfig, AgentRunnerCallbacks, AgentEvent, AgentMode } from \"../types.js\";\nimport type { ConveyorConnection } from \"../connection/index.js\";\nimport {\n loadConveyorConfig,\n loadForwardPorts,\n runSetupCommand,\n runStartCommand,\n unshallowRepo,\n type ConveyorConfig,\n} from \"../setup/index.js\";\n\nexport { unshallowRepo };\n\nconst MAX_SETUP_LOG_LINES = 50;\n\nexport function pushSetupLog(setupLog: string[], line: string): void {\n setupLog.push(line);\n if (setupLog.length > MAX_SETUP_LOG_LINES) {\n setupLog.splice(0, setupLog.length - MAX_SETUP_LOG_LINES);\n }\n}\n\nexport async function executeSetupConfig(\n config: ConveyorConfig,\n runnerConfig: AgentRunnerConfig,\n connection: ConveyorConnection,\n setupLog: string[],\n): Promise<void> {\n if (config.setupCommand) {\n pushSetupLog(setupLog, `$ ${config.setupCommand}`);\n await runSetupCommand(config.setupCommand, runnerConfig.workspaceDir, (stream, data) => {\n connection.sendEvent({ type: \"setup_output\", stream, data });\n (stream === \"stderr\" ? process.stderr : process.stdout).write(data);\n for (const line of data.split(\"\\n\").filter(Boolean)) {\n pushSetupLog(setupLog, `[${stream}] ${line}`);\n }\n });\n pushSetupLog(setupLog, \"(exit 0)\");\n }\n\n if (config.startCommand) {\n pushSetupLog(setupLog, `$ ${config.startCommand} & (background)`);\n runStartCommand(config.startCommand, runnerConfig.workspaceDir, (stream, data) => {\n connection.sendEvent({ type: \"start_command_output\", stream, data });\n (stream === \"stderr\" ? process.stderr : process.stdout).write(data);\n });\n }\n}\n\nasync function checkoutTaskBranch(\n runnerConfig: AgentRunnerConfig,\n connection: ConveyorConnection,\n callbacks: AgentRunnerCallbacks,\n setupLog: string[],\n): Promise<boolean> {\n const taskBranch = process.env.CONVEYOR_TASK_BRANCH;\n if (!taskBranch) return true;\n\n pushSetupLog(setupLog, `[conveyor] Switching to task branch ${taskBranch}...`);\n connection.sendEvent({\n type: \"setup_output\",\n stream: \"stdout\",\n data: `Switching to task branch ${taskBranch}...\\n`,\n });\n try {\n await runSetupCommand(\n `git fetch origin ${taskBranch} && git checkout ${taskBranch}`,\n runnerConfig.workspaceDir,\n (stream, data) => {\n connection.sendEvent({ type: \"setup_output\", stream, data });\n for (const line of data.split(\"\\n\").filter(Boolean)) {\n pushSetupLog(setupLog, `[${stream}] ${line}`);\n }\n },\n );\n pushSetupLog(setupLog, `[conveyor] Switched to ${taskBranch}`);\n return true;\n } catch (error) {\n const message = `Failed to checkout ${taskBranch}: ${error instanceof Error ? error.message : \"unknown error\"}`;\n connection.sendEvent({ type: \"setup_error\", message });\n await callbacks.onEvent({ type: \"setup_error\", message });\n connection.postChatMessage(`Failed to switch to task branch \\`${taskBranch}\\`.\\n\\n${message}`);\n return false;\n }\n}\n\nexport async function runSetupSafe(\n runnerConfig: AgentRunnerConfig,\n connection: ConveyorConnection,\n callbacks: AgentRunnerCallbacks,\n setupLog: string[],\n _effectiveAgentMode: AgentMode,\n setState: (status: string) => Promise<void>,\n): Promise<{ ok: boolean; conveyorConfig: ConveyorConfig | null }> {\n await setState(\"setup\");\n\n // Fast path: project runner already checked out the branch and ran setup/start\n // commands. Only load the config (for previewPort) and emit setup_complete.\n if (process.env.CONVEYOR_FROM_PROJECT_RUNNER === \"true\") {\n const config = await loadConveyorConfig(runnerConfig.workspaceDir);\n const setupEvent: AgentEvent = {\n type: \"setup_complete\",\n previewPort: config?.previewPort ?? undefined,\n };\n connection.sendEvent(setupEvent);\n await callbacks.onEvent(setupEvent);\n return { ok: true, conveyorConfig: config };\n }\n\n const ports = await loadForwardPorts(runnerConfig.workspaceDir);\n if (ports.length > 0 && process.env.CODESPACE_NAME) {\n const visibility = ports.map((p) => `${p}:public`).join(\" \");\n runStartCommand(\n `gh codespace ports visibility ${visibility} -c \"${process.env.CODESPACE_NAME}\" 2>/dev/null`,\n runnerConfig.workspaceDir,\n () => undefined,\n );\n }\n\n // Switch to the task branch — codespace boots on baseBranch for prebuild\n // cache, then the agent checks out the actual task branch here.\n // This MUST happen before the pullBranch merge so that dev code is merged\n // into the task branch, not into baseBranch (which would be a no-op).\n if (!(await checkoutTaskBranch(runnerConfig, connection, callbacks, setupLog))) {\n return { ok: false, conveyorConfig: null };\n }\n\n // pullBranch rebase removed — task branch is created from latest baseBranch SHA,\n // so there's nothing to reconcile. Prebuild staleness is a non-issue in practice.\n\n const config = await loadConveyorConfig(runnerConfig.workspaceDir);\n if (!config) {\n connection.sendEvent({ type: \"setup_complete\" });\n await callbacks.onEvent({ type: \"setup_complete\" });\n return { ok: true, conveyorConfig: null };\n }\n\n try {\n await executeSetupConfig(config, runnerConfig, connection, setupLog);\n const setupEvent: AgentEvent = {\n type: \"setup_complete\",\n previewPort: config.previewPort ?? undefined,\n };\n connection.sendEvent(setupEvent);\n await callbacks.onEvent(setupEvent);\n return { ok: true, conveyorConfig: config };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Setup failed\";\n connection.sendEvent({ type: \"setup_error\", message });\n await callbacks.onEvent({ type: \"setup_error\", message });\n connection.postChatMessage(\n `Environment setup failed: ${message}\\nThe agent cannot start until this is resolved.`,\n );\n return { ok: false, conveyorConfig: null };\n }\n}\n\nexport function rerunStartCommand(\n conveyorConfig: ConveyorConfig,\n runnerConfig: AgentRunnerConfig,\n connection: ConveyorConnection,\n setupLog: string[],\n): void {\n if (!conveyorConfig.startCommand) return;\n\n pushSetupLog(setupLog, `$ ${conveyorConfig.startCommand} & (background, re-trigger)`);\n connection.sendEvent({ type: \"start_command_started\" });\n\n runStartCommand(conveyorConfig.startCommand, runnerConfig.workspaceDir, (stream, data) => {\n connection.sendEvent({ type: \"start_command_output\", stream, data });\n (stream === \"stderr\" ? process.stderr : process.stdout).write(data);\n });\n\n const setupEvent: AgentEvent = {\n type: \"setup_complete\",\n previewPort: conveyorConfig.previewPort ?? undefined,\n };\n connection.sendEvent(setupEvent);\n}\n","import type { SDKUserMessage } from \"@anthropic-ai/claude-agent-sdk\";\nimport type {\n AgentRunnerConfig,\n AgentRunnerCallbacks,\n TaskContext,\n MultimodalBlock,\n AgentMode,\n} from \"../types.js\";\nimport type { ConveyorConnection } from \"../connection/index.js\";\nimport type { QueryHost } from \"../execution/index.js\";\nimport type { CostTracker } from \"../execution/cost-tracker.js\";\nimport type { PlanSync } from \"./plan-sync.js\";\n\n// ── Message content builder ──────────────────────────────────────────────\n\ntype ImageMediaType = \"image/gif\" | \"image/jpeg\" | \"image/png\" | \"image/webp\";\ntype TextBlock = { type: \"text\"; text: string };\ntype ImageBlock = {\n type: \"image\";\n source: { type: \"base64\"; media_type: ImageMediaType; data: string };\n};\ntype ContentBlock = TextBlock | ImageBlock;\n\nexport interface IncomingFile {\n id: string;\n fileName: string;\n mimeType: string;\n downloadUrl: string;\n content?: string;\n contentEncoding?: \"base64\" | \"utf-8\";\n}\n\nfunction buildFileBlock(f: IncomingFile): ContentBlock[] {\n if (f.content && f.contentEncoding === \"base64\") {\n return [\n {\n type: \"image\",\n source: { type: \"base64\", media_type: f.mimeType as ImageMediaType, data: f.content },\n },\n { type: \"text\", text: `[Attached image: ${f.fileName} (${f.mimeType})]` },\n ];\n }\n if (f.content && f.contentEncoding === \"utf-8\") {\n return [\n {\n type: \"text\",\n text: `[Attached file: ${f.fileName} (${f.mimeType})]\\n\\`\\`\\`\\n${f.content}\\n\\`\\`\\``,\n },\n ];\n }\n return [\n {\n type: \"text\",\n text: `[Attached file: ${f.fileName} (${f.mimeType})] Download: ${f.downloadUrl}`,\n },\n ];\n}\n\nexport function buildMessageContent(\n content: string,\n files?: IncomingFile[],\n): string | ContentBlock[] {\n if (!files?.length) return content;\n const blocks: ContentBlock[] = [{ type: \"text\", text: content }];\n for (const f of files) blocks.push(...buildFileBlock(f));\n return blocks;\n}\n\nexport function formatThinkingSetting(thinking?: { type?: string; budgetTokens?: number }): string {\n if (thinking?.type === \"enabled\") return `enabled(${thinking.budgetTokens ?? \"?\"})`;\n return thinking?.type ?? \"default\";\n}\n\n// ── Mode transition ──────────────────────────────────────────────────────\n\nfunction getModelForMode(\n context: TaskContext,\n mode: AgentMode | null,\n isParentTask?: boolean,\n): string | null {\n if (mode === \"building\" && !isParentTask) {\n return context.builderModel ?? context.model;\n }\n return context.pmModel ?? context.model;\n}\n\nexport interface ModeRestartState {\n agentMode: AgentMode | null;\n sessionIds: Map<string, string>;\n taskContext: TaskContext;\n}\n\nexport async function handleAutoModeRestart(\n state: ModeRestartState,\n connection: ConveyorConnection,\n setState: (status: string) => Promise<void>,\n runQuerySafe: (context: TaskContext) => Promise<void>,\n fetchFreshContext: () => Promise<TaskContext | null>,\n): Promise<void> {\n const { taskContext } = state;\n const currentModel = taskContext.model;\n const currentSessionId = taskContext.claudeSessionId;\n\n if (currentSessionId && currentModel) {\n state.sessionIds.set(currentModel, currentSessionId);\n }\n\n const newMode = state.agentMode;\n const isParentTask = !!taskContext.isParentTask;\n const newModel = getModelForMode(taskContext, newMode, isParentTask);\n\n // Always start fresh session on auto mode transition.\n // Ensures MCP tools are re-registered for the new mode (building gets create_pull_request).\n taskContext.claudeSessionId = null;\n connection.storeSessionId(\"\");\n\n if (newModel) taskContext.model = newModel;\n taskContext.agentMode = newMode;\n\n connection.emitModeTransition({ fromMode: \"auto\", toMode: newMode ?? \"building\" });\n connection.emitModeChanged(newMode);\n connection.postChatMessage(\n `Transitioning to **${newMode}** mode${newModel ? ` with ${newModel}` : \"\"}. Restarting session...`,\n );\n\n const freshContext = await fetchFreshContext();\n if (freshContext) {\n freshContext._runnerSessionId = taskContext._runnerSessionId;\n freshContext.claudeSessionId = taskContext.claudeSessionId;\n freshContext.agentMode = newMode;\n if (newModel) freshContext.model = newModel;\n state.taskContext = freshContext;\n }\n\n await setState(\"running\");\n await runQuerySafe(state.taskContext);\n}\n\n// ── QueryHost builder ────────────────────────────────────────────────────\n\nexport interface QueryHostDeps {\n config: AgentRunnerConfig;\n connection: ConveyorConnection;\n callbacks: AgentRunnerCallbacks;\n setupLog: string[];\n costTracker: CostTracker;\n planSync: PlanSync;\n sessionIds: Map<string, string>;\n getEffectiveAgentMode: () => AgentMode;\n getIsParentTask: () => boolean;\n getHasExitedPlanMode: () => boolean;\n setHasExitedPlanMode: (val: boolean) => void;\n getPendingModeRestart: () => boolean;\n setPendingModeRestart: (val: boolean) => void;\n isStopped: () => boolean;\n createInputStream: (\n prompt: string | MultimodalBlock[],\n ) => AsyncGenerator<SDKUserMessage, void, unknown>;\n onModeTransition: (newMode: AgentMode) => void;\n}\n\nexport function buildQueryHost(deps: QueryHostDeps): QueryHost {\n return {\n config: deps.config,\n connection: deps.connection,\n callbacks: deps.callbacks,\n setupLog: deps.setupLog,\n costTracker: deps.costTracker,\n get agentMode(): AgentMode {\n return deps.getEffectiveAgentMode();\n },\n get isParentTask(): boolean {\n return deps.getIsParentTask();\n },\n get hasExitedPlanMode(): boolean {\n return deps.getHasExitedPlanMode();\n },\n set hasExitedPlanMode(val: boolean) {\n deps.setHasExitedPlanMode(val);\n },\n get pendingModeRestart(): boolean {\n return deps.getPendingModeRestart();\n },\n set pendingModeRestart(val: boolean) {\n deps.setPendingModeRestart(val);\n },\n sessionIds: deps.sessionIds,\n activeQuery: null,\n isStopped: deps.isStopped,\n createInputStream: deps.createInputStream,\n snapshotPlanFiles: () => deps.planSync.snapshotPlanFiles(),\n syncPlanFile: () => deps.planSync.syncPlanFile(),\n onModeTransition: deps.onModeTransition,\n };\n}\n","import { fork, type ChildProcess } from \"node:child_process\";\nimport { execSync } from \"node:child_process\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { ProjectEnvironmentStatus } from \"@project/shared\";\nimport { ProjectConnection, type TaskAssignment } from \"../connection/index.js\";\nimport { runSetupCommand, runStartCommand } from \"../setup/commands.js\";\nimport { ensureWorktree, removeWorktree } from \"./worktree.js\";\nimport { handleProjectChatMessage } from \"./project-chat-handler.js\";\nimport { createServiceLogger, errorMeta } from \"../utils/logger.js\";\n\nconst logger = createServiceLogger(\"ProjectRunner\");\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nexport interface ProjectRunnerConfig {\n conveyorApiUrl: string;\n projectToken: string;\n projectId: string;\n projectDir: string;\n}\n\ninterface ActiveAgent {\n process: ChildProcess;\n worktreePath: string;\n mode: string;\n usesWorktree: boolean;\n}\n\nconst HEARTBEAT_INTERVAL_MS = 30_000;\nconst MAX_CONCURRENT = Math.max(1, parseInt(process.env.CONVEYOR_MAX_CONCURRENT ?? \"10\", 10) || 10);\nconst STOP_TIMEOUT_MS = 30_000;\nconst START_CMD_KILL_TIMEOUT_MS = 5_000;\n\nfunction setupWorkDir(\n projectDir: string,\n assignment: TaskAssignment,\n): { workDir: string; usesWorktree: boolean } {\n const { taskId, branch, devBranch, useWorktree } = assignment;\n const shortId = taskId.slice(0, 8);\n const shouldWorktree = useWorktree === true;\n\n let workDir: string;\n if (shouldWorktree) {\n workDir = ensureWorktree(projectDir, taskId, devBranch);\n } else {\n workDir = projectDir;\n }\n\n if (branch && branch !== devBranch) {\n try {\n execSync(`git checkout ${branch}`, { cwd: workDir, stdio: \"ignore\" });\n } catch {\n try {\n execSync(`git checkout -b ${branch}`, { cwd: workDir, stdio: \"ignore\" });\n } catch {\n logger.warn(\"Could not checkout branch\", { taskId: shortId, branch });\n }\n }\n }\n\n return { workDir, usesWorktree: shouldWorktree };\n}\n\nfunction spawnChildAgent(assignment: TaskAssignment, workDir: string): ChildProcess {\n const { taskToken, apiUrl, taskId, mode, isAuto, useSandbox } = assignment;\n const cliPath = path.resolve(__dirname, \"cli.js\");\n\n const childEnv = { ...process.env };\n delete childEnv.CONVEYOR_PROJECT_TOKEN;\n delete childEnv.CONVEYOR_PROJECT_ID;\n\n const child = fork(cliPath, [], {\n env: {\n ...childEnv,\n CONVEYOR_API_URL: apiUrl,\n CONVEYOR_TASK_TOKEN: taskToken,\n CONVEYOR_TASK_ID: taskId,\n CONVEYOR_MODE: mode,\n CONVEYOR_WORKSPACE: workDir,\n CONVEYOR_USE_WORKTREE: \"false\",\n CONVEYOR_AGENT_MODE: isAuto ? \"auto\" : \"\",\n CONVEYOR_IS_AUTO: isAuto ? \"true\" : \"false\",\n CONVEYOR_USE_SANDBOX: useSandbox === true ? \"true\" : \"false\",\n CONVEYOR_FROM_PROJECT_RUNNER: \"true\",\n },\n cwd: workDir,\n stdio: [\"pipe\", \"pipe\", \"pipe\", \"ipc\"],\n });\n\n child.stdin?.on(\"error\", () => {});\n child.stdout?.on(\"error\", () => {});\n child.stderr?.on(\"error\", () => {});\n\n const shortId = taskId.slice(0, 8);\n child.stdout?.on(\"data\", (data: Buffer) => {\n const lines = data.toString().trimEnd().split(\"\\n\");\n for (const line of lines) {\n logger.info(line, { taskId: shortId });\n }\n });\n child.stderr?.on(\"data\", (data: Buffer) => {\n const lines = data.toString().trimEnd().split(\"\\n\");\n for (const line of lines) {\n logger.error(line, { taskId: shortId });\n }\n });\n\n return child;\n}\n\nexport class ProjectRunner {\n private connection: ProjectConnection;\n private projectDir: string;\n private activeAgents = new Map<string, ActiveAgent>();\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private stopping = false;\n private resolveLifecycle: (() => void) | null = null;\n\n // Start command process management\n private startCommandChild: ChildProcess | null = null;\n private startCommandRunning = false;\n private setupComplete = false;\n\n constructor(config: ProjectRunnerConfig) {\n this.projectDir = config.projectDir;\n this.connection = new ProjectConnection({\n apiUrl: config.conveyorApiUrl,\n projectToken: config.projectToken,\n projectId: config.projectId,\n });\n }\n\n private checkoutWorkspaceBranch(): void {\n const workspaceBranch = process.env.CONVEYOR_WORKSPACE_BRANCH;\n if (!workspaceBranch) return;\n\n try {\n execSync(`git fetch origin ${workspaceBranch}`, { cwd: this.projectDir, stdio: \"pipe\" });\n execSync(`git checkout ${workspaceBranch}`, { cwd: this.projectDir, stdio: \"pipe\" });\n logger.info(\"Checked out workspace branch\", { workspaceBranch });\n } catch (err) {\n logger.warn(\"Failed to checkout workspace branch, continuing on current branch\", {\n workspaceBranch,\n ...errorMeta(err),\n });\n }\n }\n\n private async executeSetupCommand(): Promise<void> {\n const cmd = process.env.CONVEYOR_SETUP_COMMAND;\n if (!cmd) return;\n\n logger.info(\"Running setup command\", { command: cmd });\n try {\n await runSetupCommand(cmd, this.projectDir, (stream, data) => {\n this.connection.emitEvent({ type: \"setup_output\", stream, data });\n (stream === \"stderr\" ? process.stderr : process.stdout).write(data);\n });\n logger.info(\"Setup command completed\");\n } catch (error) {\n logger.error(\"Setup command failed\", errorMeta(error));\n this.connection.emitEvent({\n type: \"setup_error\",\n message: error instanceof Error ? error.message : \"Setup command failed\",\n });\n throw error;\n }\n }\n\n private executeStartCommand(): void {\n const cmd = process.env.CONVEYOR_START_COMMAND;\n if (!cmd) return;\n\n logger.info(\"Running start command\", { command: cmd });\n const child = runStartCommand(cmd, this.projectDir, (stream, data) => {\n this.connection.emitEvent({ type: \"start_command_output\", stream, data });\n (stream === \"stderr\" ? process.stderr : process.stdout).write(data);\n });\n\n this.startCommandChild = child;\n this.startCommandRunning = true;\n\n child.on(\"exit\", (code, signal) => {\n this.startCommandRunning = false;\n this.startCommandChild = null;\n logger.info(\"Start command exited\", { code, signal });\n this.connection.emitEvent({\n type: \"start_command_exited\",\n code,\n signal,\n message: `Start command exited with code ${code}`,\n });\n });\n\n child.on(\"error\", (err) => {\n this.startCommandRunning = false;\n this.startCommandChild = null;\n logger.error(\"Start command error\", errorMeta(err));\n });\n }\n\n async killStartCommand(): Promise<void> {\n const child = this.startCommandChild;\n if (!child || !this.startCommandRunning) return;\n\n logger.info(\"Killing start command\");\n\n // Try SIGTERM on the process group (detached process)\n try {\n if (child.pid) process.kill(-child.pid, \"SIGTERM\");\n } catch {\n child.kill(\"SIGTERM\");\n }\n\n // Wait up to 5s, then SIGKILL\n await new Promise<void>((resolve) => {\n const timer = setTimeout(() => {\n if (this.startCommandRunning && child.pid) {\n try {\n process.kill(-child.pid, \"SIGKILL\");\n } catch {\n child.kill(\"SIGKILL\");\n }\n }\n resolve();\n }, START_CMD_KILL_TIMEOUT_MS);\n\n child.on(\"exit\", () => {\n clearTimeout(timer);\n resolve();\n });\n });\n\n this.startCommandChild = null;\n this.startCommandRunning = false;\n }\n\n async restartStartCommand(): Promise<void> {\n await this.killStartCommand();\n this.executeStartCommand();\n }\n\n getEnvironmentStatus(): ProjectEnvironmentStatus {\n let currentBranch = \"unknown\";\n try {\n currentBranch = execSync(\"git branch --show-current\", {\n cwd: this.projectDir,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n })\n .toString()\n .trim();\n } catch {\n // best effort\n }\n\n return {\n setupComplete: this.setupComplete,\n startCommandRunning: this.startCommandRunning,\n currentBranch,\n previewPort: Number(process.env.CONVEYOR_PREVIEW_PORT) || null,\n };\n }\n\n async start(): Promise<void> {\n this.checkoutWorkspaceBranch();\n await this.connection.connect();\n\n // Run setup command (blocking), then start command (background)\n try {\n await this.executeSetupCommand();\n this.executeStartCommand();\n this.setupComplete = true;\n\n this.connection.emitEvent({\n type: \"setup_complete\",\n previewPort: Number(process.env.CONVEYOR_PREVIEW_PORT) || undefined,\n startCommandRunning: this.startCommandRunning,\n });\n } catch (error) {\n logger.error(\"Environment setup failed\", errorMeta(error));\n // Continue anyway — task agents use worktrees and don't need the main dir's dev server\n this.setupComplete = false;\n }\n\n this.connection.onTaskAssignment((assignment) => {\n this.handleAssignment(assignment);\n });\n\n this.connection.onStopTask((data) => {\n this.handleStopTask(data.taskId);\n });\n\n this.connection.onShutdown(() => {\n logger.info(\"Received shutdown signal from server\");\n void this.stop();\n });\n\n this.connection.onChatMessage((msg) => {\n logger.debug(\"Received project chat message\");\n void handleProjectChatMessage(msg, this.connection, this.projectDir);\n });\n\n this.heartbeatTimer = setInterval(() => {\n this.connection.sendHeartbeat();\n }, HEARTBEAT_INTERVAL_MS);\n\n logger.info(\"Connected, waiting for task assignments\");\n\n await new Promise<void>((resolve) => {\n this.resolveLifecycle = resolve;\n process.on(\"SIGTERM\", () => void this.stop());\n process.on(\"SIGINT\", () => void this.stop());\n });\n }\n\n private handleAssignment(assignment: TaskAssignment): void {\n const { taskId, mode } = assignment;\n const shortId = taskId.slice(0, 8);\n\n if (this.activeAgents.has(taskId)) {\n logger.info(\"Task already running, skipping\", { taskId: shortId });\n return;\n }\n\n if (this.activeAgents.size >= MAX_CONCURRENT) {\n logger.warn(\"Max concurrent agents reached, rejecting task\", {\n maxConcurrent: MAX_CONCURRENT,\n taskId: shortId,\n });\n this.connection.emitTaskStopped(taskId, \"max_concurrent_reached\");\n return;\n }\n\n try {\n try {\n execSync(\"git fetch origin\", { cwd: this.projectDir, stdio: \"ignore\" });\n } catch {\n logger.warn(\"Git fetch failed\", { taskId: shortId });\n }\n\n const { workDir, usesWorktree } = setupWorkDir(this.projectDir, assignment);\n const child = spawnChildAgent(assignment, workDir);\n\n this.activeAgents.set(taskId, {\n process: child,\n worktreePath: workDir,\n mode,\n usesWorktree,\n });\n this.connection.emitTaskStarted(taskId);\n\n logger.info(\"Started task\", { taskId: shortId, mode, workDir });\n\n child.on(\"exit\", (code) => {\n this.activeAgents.delete(taskId);\n const reason = code === 0 ? \"completed\" : `exited with code ${code}`;\n this.connection.emitTaskStopped(taskId, reason);\n logger.info(\"Task exited\", { taskId: shortId, reason });\n\n if (code === 0 && usesWorktree) {\n try {\n removeWorktree(this.projectDir, taskId);\n } catch {\n // best effort\n }\n }\n });\n } catch (error) {\n logger.error(\"Failed to start task\", {\n taskId: shortId,\n ...errorMeta(error),\n });\n this.connection.emitTaskStopped(\n taskId,\n `start_failed: ${error instanceof Error ? error.message : \"Unknown\"}`,\n );\n }\n }\n\n private handleStopTask(taskId: string): void {\n const agent = this.activeAgents.get(taskId);\n if (!agent) return;\n\n const shortId = taskId.slice(0, 8);\n logger.info(\"Stopping task\", { taskId: shortId });\n\n agent.process.kill(\"SIGTERM\");\n\n const timer = setTimeout(() => {\n if (this.activeAgents.has(taskId)) {\n agent.process.kill(\"SIGKILL\");\n }\n }, STOP_TIMEOUT_MS);\n\n agent.process.on(\"exit\", () => {\n clearTimeout(timer);\n if (agent.usesWorktree) {\n try {\n removeWorktree(this.projectDir, taskId);\n } catch {\n // best effort\n }\n }\n });\n }\n\n async stop(): Promise<void> {\n if (this.stopping) return;\n this.stopping = true;\n\n logger.info(\"Shutting down\");\n\n // Kill the start command process before stopping agents\n await this.killStartCommand();\n\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n\n const stopPromises = [...this.activeAgents.keys()].map(\n (taskId) =>\n new Promise<void>((resolve) => {\n const agent = this.activeAgents.get(taskId);\n if (!agent) {\n resolve();\n return;\n }\n agent.process.on(\"exit\", () => {\n resolve();\n });\n this.handleStopTask(taskId);\n }),\n );\n\n await Promise.race([\n Promise.all(stopPromises),\n new Promise<void>((resolve) => {\n setTimeout(resolve, 60_000);\n }),\n ]);\n\n this.connection.disconnect();\n logger.info(\"Shutdown complete\");\n\n if (this.resolveLifecycle) {\n this.resolveLifecycle();\n this.resolveLifecycle = null;\n }\n }\n}\n","import { query, type SDKAssistantMessage } from \"@anthropic-ai/claude-agent-sdk\";\nimport type {\n ProjectConnection,\n IncomingChatMessage,\n ChatHistoryMessage,\n AgentContext,\n} from \"../connection/index.js\";\nimport { createServiceLogger, errorMeta } from \"../utils/logger.js\";\n\nconst logger = createServiceLogger(\"ProjectChat\");\n\nconst FALLBACK_MODEL = \"claude-sonnet-4-20250514\";\n\nfunction buildSystemPrompt(projectDir: string, agentCtx: AgentContext | null): string {\n const parts: string[] = [];\n\n if (agentCtx?.agentInstructions) {\n parts.push(agentCtx.agentInstructions);\n }\n\n const projectName = agentCtx?.projectName ?? \"this project\";\n parts.push(`\\nYou are the project management assistant for ${projectName}.`);\n if (agentCtx?.projectDescription) {\n parts.push(`Project description: ${agentCtx.projectDescription}`);\n }\n\n parts.push(\n `You are running locally on the developer's machine with full access to the codebase at: ${projectDir}`,\n ``,\n `Your role is to help team members:`,\n `- Discuss project direction and priorities`,\n `- Answer questions about the codebase, architecture, and implementation`,\n `- Help plan new work and break it into tasks`,\n `- Review code and suggest improvements`,\n ``,\n `You have access to the local filesystem through your tools. Use them to read code,`,\n `understand the project structure, and provide informed answers.`,\n ``,\n `Keep responses concise and helpful. When referencing code, cite specific files and line numbers.`,\n );\n\n return parts.join(\"\\n\");\n}\n\nfunction buildPrompt(message: IncomingChatMessage, chatHistory: ChatHistoryMessage[]): string {\n const parts: string[] = [];\n\n if (chatHistory.length > 0) {\n parts.push(\"Recent conversation history:\");\n for (const msg of chatHistory.slice(-20)) {\n const prefix = msg.role === \"assistant\" ? \"Agent\" : (msg.userName ?? \"User\");\n parts.push(`[${prefix}]: ${msg.content}`);\n }\n parts.push(\"\");\n }\n\n parts.push(`Latest message from the user:\\n${message.content}`);\n return parts.join(\"\\n\");\n}\n\ninterface ToolCallSummary {\n tool: string;\n input?: string;\n timestamp: string;\n}\n\nfunction processContentBlock(\n block: { type: string; text?: string; name?: string; input?: unknown },\n responseParts: string[],\n turnToolCalls: ToolCallSummary[],\n): void {\n if (block.type === \"text\" && block.text) {\n responseParts.push(block.text);\n } else if (block.type === \"tool_use\" && block.name) {\n const inputStr = typeof block.input === \"string\" ? block.input : JSON.stringify(block.input);\n turnToolCalls.push({\n tool: block.name,\n input: inputStr.slice(0, 10_000),\n timestamp: new Date().toISOString(),\n });\n logger.debug(\"Tool use\", { tool: block.name });\n }\n}\n\nasync function fetchContext(connection: ProjectConnection): Promise<{\n agentCtx: AgentContext | null;\n chatHistory: ChatHistoryMessage[];\n}> {\n let agentCtx: AgentContext | null = null;\n try {\n agentCtx = await connection.fetchAgentContext();\n } catch {\n logger.warn(\"Could not fetch agent context, using defaults\");\n }\n\n let chatHistory: ChatHistoryMessage[] = [];\n try {\n chatHistory = await connection.fetchChatHistory(30);\n } catch {\n logger.warn(\"Could not fetch chat history, proceeding without it\");\n }\n\n return { agentCtx, chatHistory };\n}\n\nfunction buildChatQueryOptions(\n agentCtx: AgentContext | null,\n projectDir: string,\n): Record<string, unknown> {\n const model = agentCtx?.model || FALLBACK_MODEL;\n const settings = agentCtx?.agentSettings ?? {};\n return {\n model,\n systemPrompt: {\n type: \"preset\",\n preset: \"claude_code\",\n append: buildSystemPrompt(projectDir, agentCtx),\n },\n cwd: projectDir,\n permissionMode: \"bypassPermissions\",\n allowDangerouslySkipPermissions: true,\n tools: { type: \"preset\" as const, preset: \"claude_code\" as const },\n maxTurns: (settings.maxTurns as number | undefined) ?? 15,\n maxBudgetUsd: (settings.maxBudgetUsd as number | undefined) ?? 5,\n effort: settings.effort as \"low\" | \"medium\" | \"high\" | \"max\" | undefined,\n thinking: settings.thinking as\n | { type: \"adaptive\" }\n | { type: \"enabled\"; budgetTokens: number }\n | { type: \"disabled\" }\n | undefined,\n };\n}\n\nfunction processEventStream(\n event: { type: string },\n connection: ProjectConnection,\n responseParts: string[],\n turnToolCalls: ToolCallSummary[],\n isTyping: { value: boolean },\n): boolean {\n if (event.type === \"assistant\") {\n if (!isTyping.value) {\n setTimeout(() => connection.emitEvent({ type: \"agent_typing_start\" }), 200);\n isTyping.value = true;\n }\n\n const assistantEvent = event as SDKAssistantMessage;\n for (const block of assistantEvent.message.content) {\n processContentBlock(block, responseParts, turnToolCalls);\n }\n\n if (turnToolCalls.length > 0) {\n connection.emitEvent({ type: \"activity_block\", events: [...turnToolCalls] });\n turnToolCalls.length = 0;\n }\n return false;\n }\n if (event.type === \"result\") {\n if (isTyping.value) {\n connection.emitEvent({ type: \"agent_typing_stop\" });\n isTyping.value = false;\n }\n return true;\n }\n return false;\n}\n\nasync function runChatQuery(\n message: IncomingChatMessage,\n connection: ProjectConnection,\n projectDir: string,\n): Promise<void> {\n const { agentCtx, chatHistory } = await fetchContext(connection);\n const options = buildChatQueryOptions(agentCtx, projectDir);\n const prompt = buildPrompt(message, chatHistory);\n\n const events = query({ prompt, options });\n\n const responseParts: string[] = [];\n const turnToolCalls: ToolCallSummary[] = [];\n const isTyping = { value: false };\n\n for await (const event of events) {\n const done = processEventStream(event, connection, responseParts, turnToolCalls, isTyping);\n if (done) break;\n }\n\n if (isTyping.value) {\n connection.emitEvent({ type: \"agent_typing_stop\" });\n }\n\n const responseText = responseParts.join(\"\\n\\n\").trim();\n if (responseText) {\n await connection.emitChatMessage(responseText);\n }\n}\n\nexport async function handleProjectChatMessage(\n message: IncomingChatMessage,\n connection: ProjectConnection,\n projectDir: string,\n): Promise<void> {\n connection.emitAgentStatus(\"busy\");\n\n try {\n await runChatQuery(message, connection, projectDir);\n } catch (error) {\n logger.error(\"Failed to handle message\", errorMeta(error));\n try {\n await connection.emitChatMessage(\n \"I encountered an error processing your message. Please try again.\",\n );\n } catch {\n // best effort\n }\n } finally {\n connection.emitAgentStatus(\"idle\");\n }\n}\n","// 50MB\nconst DEFAULT_MAX_SIZE_BYTES = 50 * 1024 * 1024;\n// 1 hour\nconst DEFAULT_TTL_MS = 60 * 60 * 1000;\n\ninterface CacheEntry {\n content: Buffer;\n mimeType: string;\n fileName: string;\n createdAt: number;\n size: number;\n}\n\nexport class FileCache {\n private cache = new Map<string, CacheEntry>();\n private currentSize = 0;\n private readonly maxSizeBytes: number;\n private readonly ttlMs: number;\n\n constructor(maxSizeBytes = DEFAULT_MAX_SIZE_BYTES, ttlMs = DEFAULT_TTL_MS) {\n this.maxSizeBytes = maxSizeBytes;\n this.ttlMs = ttlMs;\n }\n\n get(fileId: string): CacheEntry | null {\n const entry = this.cache.get(fileId);\n if (!entry) return null;\n\n if (Date.now() - entry.createdAt > this.ttlMs) {\n this.delete(fileId);\n return null;\n }\n\n this.cache.delete(fileId);\n this.cache.set(fileId, entry);\n return entry;\n }\n\n set(fileId: string, content: Buffer, mimeType: string, fileName: string): void {\n if (this.cache.has(fileId)) {\n this.delete(fileId);\n }\n\n const size = content.byteLength;\n\n if (size > this.maxSizeBytes) return;\n\n while (this.currentSize + size > this.maxSizeBytes && this.cache.size > 0) {\n const oldestKey = this.cache.keys().next().value;\n if (oldestKey !== undefined) {\n this.delete(oldestKey);\n }\n }\n\n this.cache.set(fileId, {\n content,\n mimeType,\n fileName,\n createdAt: Date.now(),\n size,\n });\n this.currentSize += size;\n }\n\n private delete(fileId: string): void {\n const entry = this.cache.get(fileId);\n if (entry) {\n this.currentSize -= entry.size;\n this.cache.delete(fileId);\n }\n }\n\n clear(): void {\n this.cache.clear();\n this.currentSize = 0;\n }\n\n get stats(): { entries: number; sizeBytes: number; maxSizeBytes: number } {\n return {\n entries: this.cache.size,\n sizeBytes: this.currentSize,\n maxSizeBytes: this.maxSizeBytes,\n };\n }\n}\n"],"mappings":";AAAA,SAAS,OAAO,gBAAmC;AAE5C,SAAS,gBACd,KACA,KACA,UACe;AACf,SAAO,IAAI,QAAQ,CAACA,UAAS,WAAW;AACtC,UAAM,QAAQ,MAAM,MAAM,CAAC,MAAM,GAAG,GAAG;AAAA,MACrC;AAAA,MACA,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,MAChC,KAAK,EAAE,GAAG,QAAQ,IAAI;AAAA,IACxB,CAAC;AAED,UAAM,OAAO,GAAG,QAAQ,CAAC,UAAkB;AACzC,eAAS,UAAU,MAAM,SAAS,CAAC;AAAA,IACrC,CAAC;AAED,UAAM,OAAO,GAAG,QAAQ,CAAC,UAAkB;AACzC,eAAS,UAAU,MAAM,SAAS,CAAC;AAAA,IACrC,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,UAAI,SAAS,GAAG;AACd,QAAAA,SAAQ;AAAA,MACV,OAAO;AACL,eAAO,IAAI,MAAM,kCAAkC,IAAI,EAAE,CAAC;AAAA,MAC5D;AAAA,IACF,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,QAAQ;AACzB,aAAO,GAAG;AAAA,IACZ,CAAC;AAAA,EACH,CAAC;AACH;AAEA,IAAM,wBAAwB;AAEvB,SAAS,oBAAoB,KAAa,WAAmB,KAA4B;AAC9F,MAAI;AACF,UAAM,SAAS,SAAS,GAAG,GAAG,IAAI,KAAK,UAAU,SAAS,CAAC,IAAI;AAAA,MAC7D;AAAA,MACA,SAAS;AAAA,MACT,OAAO,CAAC,UAAU,QAAQ,QAAQ;AAAA,MAClC,KAAK,EAAE,GAAG,QAAQ,IAAI;AAAA,IACxB,CAAC;AACD,UAAM,QAAQ,OAAO,SAAS,EAAE,KAAK;AACrC,WAAO,SAAS;AAAA,EAClB,QAAQ;AAEN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,gBACd,KACA,KACA,UACc;AACd,QAAM,QAAQ,MAAM,MAAM,CAAC,MAAM,GAAG,GAAG;AAAA,IACrC;AAAA,IACA,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,IAChC,UAAU;AAAA,IACV,KAAK,EAAE,GAAG,QAAQ,IAAI;AAAA,EACxB,CAAC;AAED,QAAM,OAAO,GAAG,QAAQ,CAAC,UAAkB;AACzC,aAAS,UAAU,MAAM,SAAS,CAAC;AAAA,EACrC,CAAC;AAED,QAAM,OAAO,GAAG,QAAQ,CAAC,UAAkB;AACzC,aAAS,UAAU,MAAM,SAAS,CAAC;AAAA,EACrC,CAAC;AAED,QAAM,MAAM;AACZ,SAAO;AACT;;;AC5EA,SAAS,UAAuB;;;ACmBhC,SAAS,cAAc,QAA+B;AACpD,MAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,eAAe;AAC5C,SAAO;AACT;AAEA,SAAS,QAAW,QAAgB,OAAe,MAA2B;AAC5E,SAAO,IAAI,QAAQ,CAACC,UAAS,WAAW;AACtC,WAAO,KAAK,OAAO,MAAM,CAAC,aAAsC;AAC9D,UAAI,SAAS,WAAW,SAAS,KAAM,CAAAA,SAAQ,SAAS,IAAI;AAAA,UACvD,QAAO,IAAI,MAAM,SAAS,SAAS,WAAW,KAAK,EAAE,CAAC;AAAA,IAC7D,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,YAAY,QAAgB,OAAe,MAA8B;AAChF,SAAO,IAAI,QAAQ,CAACA,UAAS,WAAW;AACtC,WAAO,KAAK,OAAO,MAAM,CAAC,aAAyC;AACjE,UAAI,SAAS,QAAS,CAAAA,SAAQ;AAAA,UACzB,QAAO,IAAI,MAAM,SAAS,SAAS,WAAW,KAAK,EAAE,CAAC;AAAA,IAC7D,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,kBACd,QACA,OACA,QACgC;AAChC,SAAO,QAAQ,cAAc,MAAM,GAAG,+BAA+B,EAAE,OAAO,OAAO,CAAC;AACxF;AAEO,SAAS,eAAe,QAAoD;AACjF,SAAO,QAAQ,cAAc,MAAM,GAAG,4BAA4B,CAAC,CAAC;AACtE;AAEO,SAAS,cAAc,QAAuB,QAA2C;AAC9F,SAAO,QAAQ,cAAc,MAAM,GAAG,2BAA2B,EAAE,OAAO,CAAC;AAC7E;AAEO,SAAS,iBAAiB,QAA6C;AAC5E,SAAO,QAAQ,cAAc,MAAM,GAAG,8BAA8B,CAAC,CAAC;AACxE;AAEO,SAAS,SACd,QACA,QAC0C;AAC1C,SAAO,QAAQ,cAAc,MAAM,GAAG,wBAAwB,MAAM;AACtE;AAEO,SAAS,cACd,QACA,MACyB;AACzB,SAAO,QAAQ,cAAc,MAAM,GAAG,6BAA6B,IAAI;AACzE;AAEO,SAAS,aAAa,QAAmD;AAC9E,SAAO,QAAQ,cAAc,MAAM,GAAG,4BAA4B,CAAC,CAAC;AACtE;AAEO,SAAS,gBACd,QACA,QACA,OACA,QACgD;AAChD,QAAM,IAAI,cAAc,MAAM;AAC9B,QAAM,UAAU;AAChB,SAAO,QAAQ,KAAK;AAAA,IAClB,QAA+C,GAAG,6BAA6B;AAAA,MAC7E;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,IACD,IAAI,QAAe,CAAC,GAAG,WAAW;AAChC,iBAAW,MAAM,OAAO,IAAI,MAAM,+BAA+B,CAAC,GAAG,OAAO;AAAA,IAC9E,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,qBACd,QACA,aACuC;AACvC,SAAO,QAAQ,cAAc,MAAM,GAAG,oCAAoC,EAAE,YAAY,CAAC;AAC3F;AAEO,SAAS,kBACd,QACA,aACuF;AACvF,SAAO,QAAQ,cAAc,MAAM,GAAG,iCAAiC,EAAE,YAAY,CAAC;AACxF;AAEO,SAAS,qBACd,QACA,aACA,SACe;AACf,SAAO,YAAY,cAAc,MAAM,GAAG,oCAAoC;AAAA,IAC5E;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEO,SAAS,kBACd,QACA,aACA,QACe;AACf,SAAO,YAAY,cAAc,MAAM,GAAG,iCAAiC;AAAA,IACzE;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEO,SAAS,eAAe,QAAuB,aAAoC;AACxF,SAAO,YAAY,cAAc,MAAM,GAAG,8BAA8B,EAAE,YAAY,CAAC;AACzF;AAEO,SAAS,UAAU,QAAuB,UAA+C;AAC9F,SAAO,QAAQ,cAAc,MAAM,GAAG,uBAAuB,EAAE,SAAS,CAAC;AAC3E;AAEO,SAAS,UAAU,QAAgD;AACxE,SAAO,QAAQ,cAAc,MAAM,GAAG,yBAAyB,CAAC,CAAC;AACnE;AAEO,SAAS,iBACd,QACA,QACA,aAC+B;AAC/B,SAAO,QAAQ,cAAc,MAAM,GAAG,gCAAgC,EAAE,QAAQ,YAAY,CAAC;AAC/F;AAEO,SAAS,kBAAkB,QAAwD;AACxF,SAAO,QAAQ,cAAc,MAAM,GAAG,iCAAiC,CAAC,CAAC;AAC3E;AAEO,SAAS,sBACd,QACwC;AACxC,SAAO,QAAQ,cAAc,MAAM,GAAG,qCAAqC,CAAC,CAAC;AAC/E;AAEO,SAAS,gBACd,QACA,QACA,QACwB;AACxB,SAAO,QAAQ,cAAc,MAAM,GAAG,+BAA+B,EAAE,QAAQ,OAAO,CAAC;AACzF;AAEO,SAAS,iBACd,QACA,QAC4B;AAC5B,SAAO,QAAQ,cAAc,MAAM,GAAG,gCAAgC,EAAE,OAAO,CAAC;AAClF;;;ADtJO,IAAM,qBAAN,MAAM,oBAAmB;AAAA,EACtB,SAAwB;AAAA,EACxB;AAAA,EACA,cAAuC,CAAC;AAAA,EACxC,aAAmD;AAAA,EAC3D,OAAwB,iBAAiB;AAAA,EAEjC,gBAA0C,CAAC;AAAA,EAC3C,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,mBAAqC,CAAC;AAAA,EACtC,sBAAsE;AAAA,EACtE,eAAoC;AAAA,EACpC,mBAAwC;AAAA,EACxC,qBAA8D;AAAA,EAC9D,0BAA+C;AAAA,EAC/C,2BAA2B,oBAAI,IAAuD;AAAA,EAE9F,YAAY,QAA2B;AACrC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,UAAyB;AACvB,WAAO,IAAI,QAAQ,CAACC,UAAS,WAAW;AACtC,UAAI,UAAU;AACd,UAAI,WAAW;AACf,YAAM,qBAAqB;AAE3B,WAAK,SAAS,GAAG,KAAK,OAAO,gBAAgB;AAAA,QAC3C,MAAM,EAAE,WAAW,KAAK,OAAO,WAAW,YAAY,KAAK,OAAO,QAAQ,OAAO;AAAA,QACjF,YAAY,CAAC,WAAW;AAAA,QACxB,cAAc;AAAA,QACd,sBAAsB;AAAA,QACtB,mBAAmB;AAAA,QACnB,sBAAsB;AAAA,QACtB,qBAAqB;AAAA,QACrB,cAAc,EAAE,8BAA8B,OAAO;AAAA,MACvD,CAAC;AAED,WAAK,OAAO,GAAG,+BAA+B,CAAC,QAAgC;AAC7E,YAAI,KAAK,oBAAqB,MAAK,oBAAoB,GAAG;AAAA,YACrD,MAAK,cAAc,KAAK,GAAG;AAAA,MAClC,CAAC;AAED,WAAK,OAAO,GAAG,oBAAoB,MAAM;AACvC,YAAI,KAAK,aAAc,MAAK,aAAa;AAAA,YACpC,MAAK,YAAY;AAAA,MACxB,CAAC;AAED,WAAK,OAAO,GAAG,wBAAwB,MAAM;AAC3C,YAAI,KAAK,iBAAkB,MAAK,iBAAiB;AAAA,YAC5C,MAAK,gBAAgB;AAAA,MAC5B,CAAC;AAED,WAAK,OAAO,GAAG,8BAA8B,CAAC,SAAgC;AAC5E,cAAM,WAAW,KAAK,yBAAyB,IAAI,KAAK,SAAS;AACjE,YAAI,UAAU;AACZ,eAAK,yBAAyB,OAAO,KAAK,SAAS;AACnD,mBAAS,KAAK,OAAO;AAAA,QACvB;AAAA,MACF,CAAC;AAED,WAAK,OAAO,GAAG,uBAAuB,CAAC,SAAyB;AAC9D,YAAI,KAAK,mBAAoB,MAAK,mBAAmB,IAAI;AAAA,YACpD,MAAK,iBAAiB,KAAK,IAAI;AAAA,MACtC,CAAC;AAED,WAAK,OAAO,GAAG,+BAA+B,MAAM;AAClD,YAAI,KAAK,wBAAyB,MAAK,wBAAwB;AAAA,MACjE,CAAC;AAED,WAAK,OAAO;AAAA,QACV;AAAA,QACA,CACE,MACA,OACG,KAAK,0BAA0B,KAAK,WAAW,EAAE;AAAA,MACxD;AAEA,WAAK,OAAO,GAAG,WAAW,MAAM;AAC9B,YAAI,CAAC,SAAS;AACZ,oBAAU;AACV,UAAAA,SAAQ;AAAA,QACV;AAAA,MACF,CAAC;AAED,WAAK,OAAO,GAAG,GAAG,qBAAqB,MAAM;AAC3C;AACA,YAAI,CAAC,WAAW,YAAY,oBAAoB;AAC9C,oBAAU;AACV,iBAAO,IAAI,MAAM,2BAA2B,kBAAkB,WAAW,CAAC;AAAA,QAC5E;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,kBAAkB,OAAgB,QAAiD;AACjF,WAAW,kBAAkB,KAAK,QAAQ,OAAO,MAAM;AAAA,EACzD;AAAA,EAEA,iBAA8C;AAC5C,WAAW,eAAe,KAAK,MAAM;AAAA,EACvC;AAAA,EAEA,cAAc,QAA2C;AACvD,WAAW,cAAc,KAAK,QAAQ,MAAM;AAAA,EAC9C;AAAA,EAEA,mBAAyC;AACvC,WAAW,iBAAiB,KAAK,MAAM;AAAA,EACzC;AAAA,EAEA,UAAU,OAAyB;AACjC,QAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,eAAe;AACjD,SAAK,YAAY,KAAK,EAAE,MAAM,CAAC;AAC/B,QAAI,CAAC,KAAK,YAAY;AACpB,WAAK,aAAa,WAAW,MAAM,KAAK,YAAY,GAAG,oBAAmB,cAAc;AAAA,IAC1F;AAAA,EACF;AAAA,EAEA,cAAoB;AAClB,QAAI,KAAK,YAAY;AACnB,mBAAa,KAAK,UAAU;AAC5B,WAAK,aAAa;AAAA,IACpB;AACA,QAAI,CAAC,KAAK,UAAU,KAAK,YAAY,WAAW,EAAG;AACnD,eAAW,SAAS,KAAK,YAAa,MAAK,OAAO,KAAK,qBAAqB,KAAK;AACjF,SAAK,cAAc,CAAC;AAAA,EACtB;AAAA,EAEA,aAAa,QAAsB;AACjC,QAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,eAAe;AACjD,SAAK,OAAO,KAAK,4BAA4B,EAAE,OAAO,CAAC;AAAA,EACzD;AAAA,EAEA,gBAAgB,SAAuB;AACrC,QAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,eAAe;AACjD,SAAK,OAAO,KAAK,2BAA2B,EAAE,QAAQ,CAAC;AAAA,EACzD;AAAA,EAEA,SAAS,QAIoC;AAC3C,WAAW,SAAS,KAAK,QAAQ,MAAM;AAAA,EACzC;AAAA,EAEA,gBAAgB,WAAmB,WAA6D;AAC9F,QAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,eAAe;AACjD,SAAK,OAAO,KAAK,+BAA+B,EAAE,WAAW,UAAU,CAAC;AACxE,WAAO,IAAI,QAAQ,CAACA,aAAY;AAC9B,WAAK,yBAAyB,IAAI,WAAWA,QAAO;AAAA,IACtD,CAAC;AAAA,EACH;AAAA,EAEA,yBAA+B;AAC7B,SAAK,yBAAyB,MAAM;AAAA,EACtC;AAAA,EAEA,eAAe,WAAyB;AACtC,QAAI,CAAC,KAAK,OAAQ;AAClB,SAAK,OAAO,KAAK,8BAA8B,EAAE,UAAU,CAAC;AAAA,EAC9D;AAAA,EAEA,iBAAiB,QAAuD;AACtE,QAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,eAAe;AACjD,SAAK,OAAO,KAAK,gCAAgC,EAAE,OAAO,CAAC;AAAA,EAC7D;AAAA,EAEA,cAAc,UAA2D;AACvE,SAAK,sBAAsB;AAC3B,eAAW,OAAO,KAAK,cAAe,UAAS,GAAG;AAClD,SAAK,gBAAgB,CAAC;AAAA,EACxB;AAAA,EAEA,gBAAgB,UAA4B;AAC1C,SAAK,eAAe;AACpB,QAAI,KAAK,WAAW;AAClB,eAAS;AACT,WAAK,YAAY;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,oBAAoB,UAA4B;AAC9C,SAAK,mBAAmB;AACxB,QAAI,KAAK,eAAe;AACtB,eAAS;AACT,WAAK,gBAAgB;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,aAAa,UAAgD;AAC3D,SAAK,qBAAqB;AAC1B,eAAW,QAAQ,KAAK,iBAAkB,UAAS,IAAI;AACvD,SAAK,mBAAmB,CAAC;AAAA,EAC3B;AAAA,EAEA,kBAAkB,UAA4B;AAC5C,SAAK,0BAA0B;AAAA,EACjC;AAAA,EAEQ,0BACN,WACA,IACM;AACN,QAAI;AACF,UAAI,QAAQ,IAAI,eAAe,QAAQ;AACrC,WAAG,EAAE,IAAI,OAAO,OAAO,8DAA8D,CAAC;AACtF;AAAA,MACF;AACA,YAAM,UAAU,QAAQ,IAAI;AAC5B,UAAI,CAAC,SAAS;AACZ,WAAG,EAAE,IAAI,OAAO,OAAO,6CAA6C,CAAC;AACrE;AAAA,MACF;AACA,YAAM,QAAQ,oBAAoB,SAAS,WAAW,KAAK,OAAO,YAAY;AAC9E,UAAI,CAAC,OAAO;AACV,WAAG;AAAA,UACD,IAAI;AAAA,UACJ,OAAO,sDAAsD,OAAO,kBAAkB,KAAK,OAAO,YAAY;AAAA,QAChH,CAAC;AACD;AAAA,MACF;AACA,SAAG,EAAE,IAAI,MAAM,MAAM,CAAC;AAAA,IACxB,SAAS,OAAO;AACd,SAAG;AAAA,QACD,IAAI;AAAA,QACJ,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAClD,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,gBAAgB,WAAoC;AAClD,QAAI,CAAC,KAAK,OAAQ;AAClB,SAAK,OAAO,KAAK,2BAA2B,EAAE,UAAU,CAAC;AAAA,EAC3D;AAAA,EAEA,cAAc,QAaL;AACP,QAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,eAAe;AACjD,SAAK,OAAO,KAAK,6BAA6B,MAAM;AAAA,EACtD;AAAA,EAEA,WAAW,QAAsB;AAC/B,QAAI,CAAC,KAAK,OAAQ;AAClB,SAAK,OAAO,KAAK,4BAA4B,EAAE,OAAO,CAAC;AAAA,EACzD;AAAA,EAEA,mBAAmB,UAAwB;AACzC,QAAI,CAAC,KAAK,OAAQ;AAClB,SAAK,OAAO,KAAK,8BAA8B,EAAE,SAAS,CAAC;AAAA,EAC7D;AAAA,EAEA,gBAAsB;AACpB,QAAI,CAAC,KAAK,OAAQ;AAClB,SAAK,OAAO,KAAK,yBAAyB,CAAC,CAAC;AAAA,EAC9C;AAAA,EAEA,kBAAwB;AACtB,SAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAAA,EAC/C;AAAA,EACA,iBAAuB;AACrB,SAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAAA,EAC9C;AAAA,EAEA,cAAc,MAAqD;AACjE,WAAW,cAAc,KAAK,QAAQ,IAAI;AAAA,EAC5C;AAAA,EAEA,cAAc,WAAmB,QAAmC;AAClE,QAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,eAAe;AACjD,SAAK,OAAO,KAAK,6BAA6B,EAAE,WAAW,OAAO,CAAC;AAAA,EACrE;AAAA,EAEA,cAAc,WAAyB;AACrC,QAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,eAAe;AACjD,SAAK,OAAO,KAAK,6BAA6B,EAAE,UAAU,CAAC;AAAA,EAC7D;AAAA,EAEA,eAA2C;AACzC,WAAW,aAAa,KAAK,MAAM;AAAA,EACrC;AAAA,EAEA,gBACE,QACA,OACA,QACgD;AAChD,WAAW,gBAAgB,KAAK,QAAQ,UAAU,KAAK,OAAO,QAAQ,OAAO,MAAM;AAAA,EACrF;AAAA,EAEA,qBAAqB,aAA4D;AAC/E,WAAW,qBAAqB,KAAK,QAAQ,WAAW;AAAA,EAC1D;AAAA,EAEA,kBACE,aACuF;AACvF,WAAW,kBAAkB,KAAK,QAAQ,WAAW;AAAA,EACvD;AAAA,EAEA,qBAAqB,aAAqB,SAAgC;AACxE,WAAW,qBAAqB,KAAK,QAAQ,aAAa,OAAO;AAAA,EACnE;AAAA,EAEA,kBAAkB,aAAqB,QAA+B;AACpE,WAAW,kBAAkB,KAAK,QAAQ,aAAa,MAAM;AAAA,EAC/D;AAAA,EAEA,eAAe,aAAoC;AACjD,WAAW,eAAe,KAAK,QAAQ,WAAW;AAAA,EACpD;AAAA,EAEA,UAAU,UAA+C;AACvD,WAAW,UAAU,KAAK,QAAQ,QAAQ;AAAA,EAC5C;AAAA,EAEA,qBAAqB,MAAyC;AAC5D,QAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,eAAe;AACjD,SAAK,OAAO,KAAK,oCAAoC,IAAI;AAAA,EAC3D;AAAA,EAEA,YAAqC;AACnC,WAAW,UAAU,KAAK,MAAM;AAAA,EAClC;AAAA,EAEA,iBACE,QACA,aAC+B;AAC/B,WAAW,iBAAiB,KAAK,QAAQ,QAAQ,WAAW;AAAA,EAC9D;AAAA,EAEA,oBAAqD;AACnD,WAAW,kBAAkB,KAAK,MAAM;AAAA,EAC1C;AAAA,EACA,wBAAgE;AAC9D,WAAW,sBAAsB,KAAK,MAAM;AAAA,EAC9C;AAAA,EAEA,mBAAmB,SAAsC;AACvD,QAAI,CAAC,KAAK,OAAQ;AAClB,SAAK,OAAO,KAAK,8BAA8B,OAAO;AAAA,EACxD;AAAA,EAEA,gBAAgB,QAAiB,QAAyC;AACxE,WAAW,gBAAgB,KAAK,QAAQ,QAAQ,MAAM;AAAA,EACxD;AAAA,EAEA,iBAAiB,QAA6C;AAC5D,WAAW,iBAAiB,KAAK,QAAQ,MAAM;AAAA,EACjD;AAAA,EAEA,aAAmB;AACjB,SAAK,YAAY;AACjB,SAAK,QAAQ,WAAW;AACxB,SAAK,SAAS;AAAA,EAChB;AACF;;;AEhZA,SAAS,MAAAC,WAAuB;AAmDzB,IAAM,oBAAN,MAAwB;AAAA,EACrB,SAAwB;AAAA,EACxB;AAAA,EACA,yBAAwE;AAAA,EACxE,mBAAgE;AAAA,EAChE,mBAAwC;AAAA,EACxC,sBAAmE;AAAA,EACnE,oBAA2C,CAAC;AAAA,EAEpD,YAAY,QAAiC;AAC3C,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,UAAyB;AACvB,WAAO,IAAI,QAAQ,CAACC,UAAS,WAAW;AACtC,UAAI,UAAU;AACd,UAAI,WAAW;AACf,YAAM,qBAAqB;AAE3B,WAAK,SAASD,IAAG,KAAK,OAAO,QAAQ;AAAA,QACnC,MAAM,EAAE,cAAc,KAAK,OAAO,aAAa;AAAA,QAC/C,YAAY,CAAC,WAAW;AAAA,QACxB,cAAc;AAAA,QACd,sBAAsB;AAAA,QACtB,mBAAmB;AAAA,QACnB,sBAAsB;AAAA,QACtB,qBAAqB;AAAA,QACrB,cAAc;AAAA,UACZ,8BAA8B;AAAA,QAChC;AAAA,MACF,CAAC;AAED,WAAK,OAAO,GAAG,4BAA4B,CAAC,SAAyB;AACnE,YAAI,KAAK,wBAAwB;AAC/B,eAAK,uBAAuB,IAAI;AAAA,QAClC;AAAA,MACF,CAAC;AAED,WAAK,OAAO,GAAG,0BAA0B,CAAC,SAA6B;AACrE,YAAI,KAAK,kBAAkB;AACzB,eAAK,iBAAiB,IAAI;AAAA,QAC5B;AAAA,MACF,CAAC;AAED,WAAK,OAAO,GAAG,0BAA0B,MAAM;AAC7C,YAAI,KAAK,kBAAkB;AACzB,eAAK,iBAAiB;AAAA,QACxB;AAAA,MACF,CAAC;AAED,WAAK,OAAO,GAAG,qCAAqC,CAAC,QAA6B;AAChF,YAAI,KAAK,qBAAqB;AAC5B,eAAK,oBAAoB,GAAG;AAAA,QAC9B,OAAO;AACL,eAAK,kBAAkB,KAAK,GAAG;AAAA,QACjC;AAAA,MACF,CAAC;AAED,WAAK,OAAO,GAAG,WAAW,MAAM;AAC9B,YAAI,CAAC,SAAS;AACZ,oBAAU;AACV,UAAAC,SAAQ;AAAA,QACV;AAAA,MACF,CAAC;AAED,WAAK,OAAO,GAAG,GAAG,qBAAqB,MAAM;AAC3C;AACA,YAAI,CAAC,WAAW,YAAY,oBAAoB;AAC9C,oBAAU;AACV,iBAAO,IAAI,MAAM,2BAA2B,kBAAkB,WAAW,CAAC;AAAA,QAC5E;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,iBAAiB,UAAsD;AACrE,SAAK,yBAAyB;AAAA,EAChC;AAAA,EAEA,WAAW,UAAoD;AAC7D,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEA,WAAW,UAA4B;AACrC,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEA,cAAc,UAAoD;AAChE,SAAK,sBAAsB;AAC3B,eAAW,OAAO,KAAK,mBAAmB;AACxC,eAAS,GAAG;AAAA,IACd;AACA,SAAK,oBAAoB,CAAC;AAAA,EAC5B;AAAA,EAEA,gBAAsB;AACpB,QAAI,CAAC,KAAK,OAAQ;AAClB,SAAK,OAAO,KAAK,2BAA2B,CAAC,CAAC;AAAA,EAChD;AAAA,EAEA,gBAAgB,QAAsB;AACpC,QAAI,CAAC,KAAK,OAAQ;AAClB,SAAK,OAAO,KAAK,6BAA6B,EAAE,OAAO,CAAC;AAAA,EAC1D;AAAA,EAEA,gBAAgB,QAAgB,QAAsB;AACpD,QAAI,CAAC,KAAK,OAAQ;AAClB,SAAK,OAAO,KAAK,6BAA6B,EAAE,QAAQ,OAAO,CAAC;AAAA,EAClE;AAAA,EAEA,UAAU,OAAsC;AAC9C,QAAI,CAAC,KAAK,OAAQ;AAClB,SAAK,OAAO,KAAK,8BAA8B,KAAK;AAAA,EACtD;AAAA,EAEA,gBAAgB,SAAgC;AAC9C,UAAM,SAAS,KAAK;AACpB,QAAI,CAAC,OAAQ,QAAO,QAAQ,OAAO,IAAI,MAAM,eAAe,CAAC;AAE7D,WAAO,IAAI,QAAQ,CAACA,UAAS,WAAW;AACtC,aAAO;AAAA,QACL;AAAA,QACA,EAAE,QAAQ;AAAA,QACV,CAAC,aAAmD;AAClD,cAAI,SAAS,QAAS,CAAAA,SAAQ;AAAA,cACzB,QAAO,IAAI,MAAM,SAAS,SAAS,6BAA6B,CAAC;AAAA,QACxE;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,gBAAgB,QAAsB;AACpC,QAAI,CAAC,KAAK,OAAQ;AAClB,SAAK,OAAO,KAAK,+BAA+B,EAAE,OAAO,CAAC;AAAA,EAC5D;AAAA,EAEA,oBAAkD;AAChD,UAAM,SAAS,KAAK;AACpB,QAAI,CAAC,OAAQ,QAAO,QAAQ,OAAO,IAAI,MAAM,eAAe,CAAC;AAE7D,WAAO,IAAI,QAAQ,CAACA,UAAS,WAAW;AACtC,aAAO;AAAA,QACL;AAAA,QACA,CAAC,aAA+E;AAC9E,cAAI,SAAS,QAAS,CAAAA,SAAQ,SAAS,QAAQ,IAAI;AAAA,cAC9C,QAAO,IAAI,MAAM,SAAS,SAAS,+BAA+B,CAAC;AAAA,QAC1E;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,iBAAiB,OAA+C;AAC9D,UAAM,SAAS,KAAK;AACpB,QAAI,CAAC,OAAQ,QAAO,QAAQ,OAAO,IAAI,MAAM,eAAe,CAAC;AAE7D,WAAO,IAAI,QAAQ,CAACA,UAAS,WAAW;AACtC,aAAO;AAAA,QACL;AAAA,QACA,EAAE,MAAM;AAAA,QACR,CAAC,aAAgF;AAC/E,cAAI,SAAS,WAAW,SAAS,KAAM,CAAAA,SAAQ,SAAS,IAAI;AAAA,cACvD,QAAO,IAAI,MAAM,SAAS,SAAS,8BAA8B,CAAC;AAAA,QACzE;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,aAAmB;AACjB,SAAK,QAAQ,WAAW;AACxB,SAAK,SAAS;AAAA,EAChB;AACF;;;AC9NA,OAAO,aAAa;AAEpB,IAAM,EAAE,SAAS,WAAW,QAAQ,SAAS,IAAI,QAAQ;AAEzD,IAAM,eAAe,OAAO,CAAC,EAAE,OAAO,SAAS,WAAW,IAAI,SAAS,GAAG,KAAK,MAAM;AACnF,QAAM,MAAM,UAAU,IAAI,OAAO,OAAO;AACxC,QAAM,UAAU,OAAO,KAAK,IAAI,EAAE,SAAS,IAAI,KAAK,UAAU,IAAI,CAAC,KAAK;AACxE,SAAO,GAAG,EAAE,KAAK,KAAK,MAAM,GAAG,GAAG,OAAO,GAAG,OAAO;AACrD,CAAC;AAEM,IAAM,SAAS,QAAQ,aAAa;AAAA,EACzC,OAAO,QAAQ,IAAI,aAAa;AAAA,EAChC,QAAQ,QAAQ,UAAU,EAAE,QAAQ,sBAAsB,CAAC,GAAG,QAAQ,SAAS,GAAG,YAAY,CAAC;AAAA,EAC/F,YAAY,CAAC,IAAI,QAAQ,WAAW,QAAQ,CAAC;AAC/C,CAAC;AAEM,SAAS,oBAAoB,aAAqC;AACvE,SAAO,OAAO,MAAM,EAAE,SAAS,YAAY,CAAC;AAC9C;AAEO,SAAS,UAAU,OAAoE;AAC5F,MAAI,iBAAiB,OAAO;AAC1B,WAAO;AAAA,MACL,SAAS,MAAM;AAAA,MACf,OAAO,MAAM;AAAA,MACb,GAAI,UAAU,SAAS,OAAO,MAAM,SAAS,WAAW,EAAE,MAAM,MAAM,KAAK,IAAI,CAAC;AAAA,IAClF;AAAA,EACF;AACA,SAAO,EAAE,SAAS,OAAO,KAAK,EAAE;AAClC;;;AC7BA,SAAS,YAAAC,iBAAgB;AACzB,SAAS,kBAAkB;AAC3B,SAAS,YAAY;AAErB,IAAM,eAAe;AAEd,SAAS,eAAe,YAAoB,QAAgB,QAAyB;AAC1F,MAAI,WAAW,SAAS,IAAI,YAAY,GAAG,GAAG;AAE5C,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,KAAK,YAAY,cAAc,MAAM;AAE1D,MAAI,WAAW,YAAY,GAAG;AAC5B,QAAI,QAAQ;AACV,UAAI;AACF,QAAAA,UAAS,gCAAgC,MAAM,IAAI;AAAA,UACjD,KAAK;AAAA,UACL,OAAO;AAAA,QACT,CAAC;AAAA,MACH,QAAQ;AAAA,MAER;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,SAAS,UAAU,MAAM,KAAK;AAC1C,EAAAA,UAAS,8BAA8B,YAAY,KAAK,GAAG,IAAI;AAAA,IAC7D,KAAK;AAAA,IACL,OAAO;AAAA,EACT,CAAC;AAED,SAAO;AACT;AAEO,SAAS,eAAe,YAAoB,QAAsB;AACvE,QAAM,eAAe,KAAK,YAAY,cAAc,MAAM;AAC1D,MAAI,CAAC,WAAW,YAAY,EAAG;AAC/B,MAAI;AACF,IAAAA,UAAS,wBAAwB,YAAY,aAAa;AAAA,MACxD,KAAK;AAAA,MACL,OAAO;AAAA,IACT,CAAC;AAAA,EACH,QAAQ;AAAA,EAER;AACF;;;AChDA,SAAS,gBAAgB;AACzB,SAAS,QAAAC,aAAY;AASrB,IAAM,oBAAoB;AAE1B,eAAsB,iBAAiB,cAAyC;AAC9E,MAAI;AACF,UAAM,MAAM,MAAM,SAASA,MAAK,cAAc,iBAAiB,GAAG,OAAO;AACzE,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,WAAO,OAAO,gBAAgB,CAAC;AAAA,EACjC,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AA0BO,SAAS,mBAAmB,eAA+C;AAChF,QAAM,WAAW,QAAQ,IAAI;AAC7B,QAAM,WAAW,QAAQ,IAAI;AAC7B,QAAM,UAAU,QAAQ,IAAI;AAC5B,MAAI,YAAY,UAAU;AACxB,WAAO;AAAA,MACL,cAAc;AAAA,MACd,cAAc;AAAA,MACd,aAAa,UAAU,OAAO,OAAO,IAAI;AAAA,IAC3C;AAAA,EACF;AAEA,SAAO;AACT;;;AC3DA,SAAS,YAAAC,iBAAgB;AAElB,SAAS,cAAc,cAA4B;AACxD,MAAI;AACF,IAAAA,UAAS,yBAAyB;AAAA,MAChC,KAAK;AAAA,MACL,OAAO;AAAA,MACP,SAAS;AAAA,IACX,CAAC;AAAA,EACH,QAAQ;AAAA,EAER;AACF;;;ACXA,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,YAAAC,iBAAgB;;;ACmBzB,SAAS,kBAAkB,OAAoC;AAC7D,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI,OAAO,UAAU,YAAY,SAAS,EAAG,QAAO;AAEpD,QAAM,KAAK,QAAQ,OAAO,QAAQ,MAAO;AACzC,SAAO,IAAI,KAAK,EAAE,EAAE,YAAY;AAClC;AAEA,eAAsB,sBACpB,OACA,MACA,eACe;AACf,QAAM,EAAE,QAAQ,IAAI,MAAM;AAC1B,QAAM,gBAA0B,CAAC;AAEjC,aAAW,SAAS,SAAS;AAC3B,QAAI,MAAM,SAAS,QAAQ;AACzB,oBAAc,KAAK,MAAM,IAAI;AAC7B,WAAK,WAAW,UAAU,EAAE,MAAM,WAAW,SAAS,MAAM,KAAK,CAAC;AAClE,YAAM,KAAK,UAAU,QAAQ,EAAE,MAAM,WAAW,SAAS,MAAM,KAAK,CAAC;AAAA,IACvE,WAAW,MAAM,SAAS,YAAY;AACpC,YAAM,WAAW,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ,KAAK,UAAU,MAAM,KAAK;AAC3F,YAAM,gBAAgB,CAAC,QAAQ,OAAO,EAAE,SAAS,MAAM,KAAK,YAAY,CAAC;AACzE,YAAM,aAAa,gBAAgB,MAAS;AAC5C,YAAM,UAAgC;AAAA,QACpC,MAAM,MAAM;AAAA,QACZ,OAAO,SAAS,MAAM,GAAG,UAAU;AAAA,QACnC,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC;AACA,oBAAc,KAAK,OAAO;AAC1B,WAAK,WAAW,UAAU,EAAE,MAAM,YAAY,MAAM,MAAM,MAAM,OAAO,SAAS,CAAC;AACjF,YAAM,KAAK,UAAU,QAAQ,EAAE,MAAM,YAAY,MAAM,MAAM,MAAM,OAAO,SAAS,CAAC;AAAA,IACtF;AAAA,EACF;AAEA,MAAI,cAAc,SAAS,GAAG;AAC5B,SAAK,WAAW,gBAAgB,cAAc,KAAK,MAAM,CAAC;AAAA,EAC5D;AAEA,MAAI,cAAc,SAAS,GAAG;AAC5B,SAAK,WAAW,UAAU,EAAE,MAAM,YAAY,WAAW,CAAC,GAAG,aAAa,EAAE,CAAC;AAC7E,kBAAc,SAAS;AAAA,EACzB;AACF;AAEA,IAAM,oBAAoB;AAC1B,IAAM,sBAAsB;AAE5B,SAAS,mBAAmB,KAAsB;AAChD,MAAI,oBAAoB,KAAK,GAAG,EAAG,QAAO;AAC1C,MAAI,kBAAkB,KAAK,GAAG,EAAG,QAAO;AACxC,SAAO;AACT;AAEA,SAAS,oBAAoB,YAM3B;AACA,MAAI,mBAAmB;AACvB,MAAI,gBAAgB;AACpB,MAAI,mBAAmB;AACvB,MAAI,iBAAiB;AACrB,MAAI,qBAAqB;AACzB,aAAW,QAAQ,OAAO,OAAO,UAAU,GAAG;AAC5C,UAAM,IAAI;AAKV,UAAM,QAAQ,EAAE,eAAe;AAC/B,UAAM,YAAY,EAAE,wBAAwB;AAC5C,UAAM,gBAAgB,EAAE,4BAA4B;AACpD,wBAAoB;AACpB,sBAAkB;AAClB,0BAAsB;AACtB,wBAAoB,QAAQ,YAAY;AACxC,UAAM,KAAM,KAAoC,iBAAiB;AACjE,QAAI,KAAK,cAAe,iBAAgB;AAAA,EAC1C;AACA,SAAO,EAAE,kBAAkB,eAAe,kBAAkB,gBAAgB,mBAAmB;AACjG;AAEA,SAAS,kBACP,YACA,MACA,SACA,oBACM;AACN,QAAM,QAAQ,oBAAoB,UAAU;AAC5C,MAAI,EAAE,cAAc,IAAI;AAGxB,QAAM,WAAW,QAAQ,iBAAiB,KAAK,OAAO,iBAAiB,CAAC;AACxE,QAAM,YAAa,SAAS,OAAgC,SAAS,uBAAuB;AAC5F,MAAI,aAAa,gBAAgB,KAAK,iBAAiB,KAAS;AAC9D,oBAAgB;AAAA,EAClB;AAEA,MAAI,gBAAgB,GAAG;AAErB,UAAM,uBAAuB,sBACxB,mBAAmB,gBAAgB,MACnC,mBAAmB,2BAA2B,MAC9C,mBAAmB,+BAA+B,KACnD,MAAM;AAEV,SAAK,WAAW,UAAU;AAAA,MACxB,MAAM;AAAA,MACN,eAAe;AAAA,MACf;AAAA,MACA,aAAa,MAAM;AAAA,MACnB,sBAAsB,MAAM;AAAA,MAC5B,0BAA0B,MAAM;AAAA,MAChC,iBAAiB,MAAM;AAAA,IACzB,CAAC;AAAA,EACH;AACF;AAEA,SAAS,kBAAkB,MAAiB,SAAsB,iBAA+B;AAC/F,MAAI,kBAAkB,KAAK,QAAQ,WAAW,QAAQ,kBAAkB;AACtE,UAAM,YAAY,KAAK,YAAY;AACnC,SAAK,WAAW,cAAc;AAAA,MAC5B,SAAS,QAAQ;AAAA,MACjB,WAAW,QAAQ;AAAA,MACnB,cAAc;AAAA,MACd,gBAAgB,KAAK,OAAO,SAAS,QAAQ,CAAC,CAAC,QAAQ,IAAI;AAAA,MAC3D,YAAY,UAAU,SAAS,IAAI,YAAY;AAAA,IACjD,CAAC;AAAA,EACH;AACF;AAEA,SAAS,oBACP,OACA,MACA,SACA,WACA,oBAC8C;AAC9C,QAAM,aAAa,KAAK,IAAI,IAAI;AAChC,QAAM,UAAU,MAAM,UAAU;AAChC,QAAM,YAAY,mBAAmB,OAAO;AAE5C,QAAM,kBAAkB,KAAK,YAAY,aAAa,MAAM,cAAc;AAE1E,QAAM,EAAE,WAAW,IAAI;AACvB,MAAI,cAAc,OAAO,eAAe,UAAU;AAChD,SAAK,YAAY,cAAc,UAAU;AAAA,EAC3C;AAEA,OAAK,WAAW,UAAU,EAAE,MAAM,aAAa,SAAS,SAAS,iBAAiB,WAAW,CAAC;AAE9F,MAAI,cAAc,OAAO,eAAe,UAAU;AAChD,sBAAkB,YAAuC,MAAM,SAAS,kBAAkB;AAAA,EAC5F;AAEA,oBAAkB,MAAM,SAAS,eAAe;AAEhD,SAAO,EAAE,cAAc,iBAAiB,UAAU;AACpD;AAEA,SAAS,kBACP,OACA,MACgD;AAChD,QAAM,WACJ,MAAM,OAAO,SAAS,IAAI,MAAM,OAAO,KAAK,IAAI,IAAI,kBAAkB,MAAM,OAAO;AAGrF,QAAM,iBAAiB,SAAS,SAAS,uCAAuC;AAEhF,MAAI,gBAAgB;AAElB,WAAO,EAAE,WAAW,OAAO,cAAc,KAAK;AAAA,EAChD;AAEA,QAAM,YAAY,mBAAmB,QAAQ;AAC7C,OAAK,WAAW,UAAU,EAAE,MAAM,SAAS,SAAS,SAAS,CAAC;AAC9D,SAAO,EAAE,UAAU;AACrB;AAEA,SAAS,kBACP,OACA,MACA,SACA,WACA,oBAC8F;AAC9F,QAAM,gBACJ,MAAM,YAAY,YACb,MAA2B,SAC3B,MAAyB,OAAO,KAAK,IAAI;AAEhD,MAAI,MAAM,YAAY,WAAW;AAC/B,UAAMC,UAAS;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,WAAO,EAAE,GAAGA,SAAQ,cAAc;AAAA,EACpC;AAEA,QAAM,SAAS,kBAAkB,OAAyB,IAAI;AAC9D,SAAO,EAAE,cAAc,GAAG,GAAG,QAAQ,cAAc;AACrD;AAEA,eAAsB,gBACpB,OACA,MACA,SACA,WACA,oBACiF;AACjF,QAAM,SAAS,kBAAkB,OAAO,MAAM,SAAS,WAAW,kBAAkB;AACpF,QAAM,aAAa,KAAK,IAAI,IAAI;AAEhC,MAAI,MAAM,YAAY,WAAW;AAC/B,UAAM,eAAe;AACrB,UAAM,UAAU,aAAa,UAAU;AACvC,UAAM,KAAK,UAAU,QAAQ;AAAA,MAC3B,MAAM;AAAA,MACN;AAAA,MACA,SAAS,OAAO;AAAA,MAChB;AAAA,IACF,CAAC;AAAA,EACH,WAAW,CAAC,OAAO,cAAc;AAE/B,UAAM,aAAa;AACnB,UAAM,WACJ,WAAW,OAAO,SAAS,IACvB,WAAW,OAAO,KAAK,IAAI,IAC3B,kBAAkB,WAAW,OAAO;AAC1C,UAAM,KAAK,UAAU,QAAQ,EAAE,MAAM,SAAS,SAAS,SAAS,CAAC;AAAA,EACnE;AAEA,SAAO;AAAA,IACL,WAAW,OAAO;AAAA,IAClB,eAAe,OAAO;AAAA,IACtB,cAAc,OAAO;AAAA,EACvB;AACF;AAEO,SAAS,qBACd,OACA,MACoB;AACpB,QAAM,EAAE,gBAAgB,IAAI;AAC5B,QAAM,SAAS,gBAAgB;AAG/B,MAAI,gBAAgB,gBAAgB,UAAa,gBAAgB,eAAe;AAC9E,SAAK,WAAW,UAAU;AAAA,MACxB,MAAM;AAAA,MACN,eAAe,gBAAgB;AAAA,MAC/B,aAAa,gBAAgB;AAAA,MAC7B;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,WAAW,YAAY;AACzB,UAAM,WAAW,kBAAkB,gBAAgB,QAAQ;AAC3D,UAAM,kBAAkB,YAAY;AACpC,UAAM,UAAU,8BAA8B,gBAAgB,iBAAiB,SAAS,gBAAgB,eAAe;AACvH,SAAK,WAAW,UAAU,EAAE,MAAM,SAAS,QAAQ,CAAC;AACpD,SAAK,KAAK,UAAU,QAAQ,EAAE,MAAM,SAAS,QAAQ,CAAC;AACtD,WAAO;AAAA,EACT,WAAW,WAAW,mBAAmB;AACvC,UAAM,cAAc,gBAAgB,cAChC,GAAG,KAAK,MAAM,gBAAgB,cAAc,GAAG,CAAC,MAChD;AACJ,UAAM,UAAU,uBAAuB,WAAW,uBAAuB,gBAAgB,iBAAiB,SAAS;AACnH,SAAK,WAAW,UAAU,EAAE,MAAM,YAAY,QAAQ,CAAC;AACvD,SAAK,KAAK,UAAU,QAAQ,EAAE,MAAM,YAAY,QAAQ,CAAC;AAAA,EAC3D;AACA,SAAO;AACT;AAEA,eAAsB,kBACpB,OACA,MACA,SACA,iBACkB;AAClB,MAAI,MAAM,YAAY,OAAQ,QAAO;AACrC,MAAI,MAAM,cAAc,CAAC,iBAAiB;AACxC,SAAK,WAAW,eAAe,MAAM,UAAU;AAC/C,YAAQ,kBAAkB,MAAM;AAAA,EAClC;AACA,QAAM,KAAK,UAAU,QAAQ;AAAA,IAC3B,MAAM;AAAA,IACN,SAAS,6BAA6B,MAAM,KAAK;AAAA,EACnD,CAAC;AACD,SAAO,CAAC,EAAE,MAAM,cAAc,CAAC;AACjC;AAEO,SAAS,sBACd,aACA,MACM;AACN,MAAI,YAAY,YAAY,oBAAoB;AAC9C,SAAK,KAAK,UAAU,QAAQ;AAAA,MAC1B,MAAM;AAAA,MACN,SAAS,YAAY,iBAAiB;AAAA,MACtC,WAAW,YAAY,iBAAiB;AAAA,IAC1C,CAAC;AAAA,EACH,WAAW,YAAY,YAAY,gBAAgB;AACjD,SAAK,KAAK,UAAU,QAAQ;AAAA,MAC1B,MAAM;AAAA,MACN,WAAW,YAAY;AAAA,MACvB,aAAa,YAAY;AAAA,IAC3B,CAAC;AAAA,EACH,WAAW,YAAY,YAAY,iBAAiB;AAClD,SAAK,KAAK,UAAU,QAAQ;AAAA,MAC1B,MAAM;AAAA,MACN,WAAW,YAAY;AAAA,MACvB,aAAa,YAAY;AAAA,MACzB,UAAU,YAAY,OAAO,aAAa;AAAA,MAC1C,YAAY,YAAY,OAAO,eAAe;AAAA,IAChD,CAAC;AAAA,EACH;AACF;AAEO,SAAS,wBAAwB,OAAgB,MAAuB;AAC7E,QAAM,MAAM;AACZ,OAAK,KAAK,UAAU,QAAQ;AAAA,IAC1B,MAAM;AAAA,IACN,UAAU,IAAI,aAAa;AAAA,IAC3B,gBAAgB,IAAI,wBAAwB;AAAA,EAC9C,CAAC;AACH;AAEA,eAAsB,oBACpB,OACA,MACA,eACgC;AAChC,QAAM,sBAAsB,OAAO,MAAM,aAAa;AACtD,QAAM,WAAY,MAAM,QAAkC;AAC1D,SAAO,YAAY;AACrB;AAEA,eAAsB,iBACpB,OACA,MACA,SACA,WACA,UACA,oBAMC;AACD,MAAI,gBAAgB;AACpB,MAAI,UAAU;AACZ,SAAK,WAAW,eAAe;AAC/B,oBAAgB;AAAA,EAClB;AACA,QAAM,aAAa,MAAM,gBAAgB,OAAO,MAAM,SAAS,WAAW,kBAAkB;AAC5F,SAAO;AAAA,IACL,WAAW,WAAW;AAAA,IACtB,eAAe,WAAW;AAAA,IAC1B,cAAc,WAAW;AAAA,IACzB;AAAA,EACF;AACF;;;ACtWA,SAAS,mBAAmB,MAAiB,UAAyB;AACpE,MAAI,SAAU,MAAK,WAAW,eAAe;AAC/C;AAEA,eAAe,kBACb,OAKA,MACA,SACA,OACe;AACf,MAAI,MAAM,YAAY,QAAQ;AAC5B,UAAM,SAAS,MAAM,kBAAkB,OAAO,MAAM,SAAS,MAAM,eAAe;AAClF,QAAI,OAAQ,OAAM,kBAAkB;AAAA,EACtC,OAAO;AACL;AAAA,MACE;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,qBACb,OACA,MACA,OACe;AACf,MAAI,CAAC,MAAM,UAAU;AACnB,eAAW,MAAM,KAAK,WAAW,gBAAgB,GAAG,GAAG;AACvD,UAAM,WAAW;AAAA,EACnB;AACA,QAAM,QAAQ,MAAM,oBAAoB,OAAO,MAAM,MAAM,aAAa;AACxE,MAAI,MAAO,OAAM,qBAAqB;AACxC;AAEA,eAAe,kBACb,OACA,MACA,SACA,WACA,OACe;AACf,QAAM,OAAO,MAAM;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AACA,MAAI,KAAK,cAAe,OAAM,WAAW;AACzC,QAAM,YAAY,KAAK;AACvB,QAAM,gBAAgB,KAAK;AAC3B,MAAI,KAAK,aAAc,OAAM,eAAe;AAC9C;AAEA,eAAsB,cACpB,QACA,SACA,MAOC;AACD,QAAM,YAAY,KAAK,IAAI;AAC3B,MAAI,iBAAiB,KAAK,IAAI;AAC9B,QAAM,4BAA4B;AAElC,QAAM,QAAwB;AAAA,IAC5B,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,WAAW;AAAA,IACX,eAAe;AAAA,IACf,mBAAmB;AAAA,IACnB,cAAc;AAAA,IACd,oBAAoB;AAAA,IACpB,eAAe,CAAC;AAAA,EAClB;AAEA,mBAAiB,SAAS,QAAQ;AAChC,QAAI,KAAK,UAAU,EAAG;AAGtB,UAAM,MAAM,KAAK,IAAI;AACrB,QAAI,MAAM,kBAAkB,2BAA2B;AACrD,WAAK,WAAW,WAAW,SAAS;AACpC,uBAAiB;AAAA,IACnB;AAEA,QAAI,KAAK,oBAAoB;AAC3B,yBAAmB,MAAM,MAAM,QAAQ;AACvC,aAAO,EAAE,WAAW,OAAO,aAAa,KAAK;AAAA,IAC/C;AAEA,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK;AACH,cAAM,kBAAkB,OAA2B,MAAM,SAAS,KAAK;AACvE;AAAA,MACF,KAAK;AACH,cAAM,qBAAqB,OAA8B,MAAM,KAAK;AACpE;AAAA,MACF,KAAK;AACH,cAAM,kBAAkB,OAA2B,MAAM,SAAS,WAAW,KAAK;AAClF;AAAA,MACF,KAAK,oBAAoB;AACvB,cAAM,WAAW,qBAAqB,OAA4B,IAAI;AACtE,YAAI,SAAU,OAAM,oBAAoB;AACxC;AAAA,MACF;AAAA,MACA,KAAK;AACH,gCAAwB,OAAO,IAAI;AACnC;AAAA,IACJ;AAAA,EACF;AAEA,qBAAmB,MAAM,MAAM,QAAQ;AAEvC,SAAO;AAAA,IACL,WAAW,MAAM;AAAA,IACjB,eAAe,MAAM;AAAA,IACrB,mBAAmB,MAAM;AAAA,IACzB,GAAI,MAAM,gBAAgB,EAAE,cAAc,MAAM,aAAa;AAAA,EAC/D;AACF;;;AClKA;AAAA,EACE;AAAA,OAMK;;;ACNP,SAAS,0BAA0B,SAAgC;AACjE,WAAS,IAAI,QAAQ,SAAS,GAAG,KAAK,GAAG,KAAK;AAC5C,QAAI,QAAQ,CAAC,EAAE,SAAS,YAAa,QAAO;AAAA,EAC9C;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,eAAoE;AAC/F,QAAM,QAAkB,CAAC,IAAI,mBAAmB;AAChD,aAAW,MAAM,eAAe;AAC9B,UAAM,OAAO,GAAG,OAAO,SAAS,GAAG,IAAI,KAAK;AAC5C,UAAM,KACJ,GAAG,gBAAgB,QAAQ,GAAG,gBAAgB,SAC1C,KACA,mBAAmB,GAAG,WAAW;AACvC,UAAM,KAAK,KAAK,GAAG,MAAM,IAAI,KAAK,IAAI,GAAG,EAAE,GAAG;AAAA,EAChD;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,aAAgE;AACzF,QAAM,QAAkB,CAAC,IAAI,sBAAsB;AACnD,aAAW,MAAM,aAAa;AAC5B,UAAM,OAAO,GAAG,cAAc,WAAM,GAAG,WAAW,KAAK;AACvD,UAAM,KAAK,WAAW,GAAG,KAAK,MAAM,GAAG,IAAI,IAAI,IAAI,EAAE;AAAA,EACvD;AACA,SAAO;AACT;AAEO,SAAS,4BACd,SACA,QACA,UACQ;AACR,QAAM,QAAkB;AAAA,IACtB,mEAAmE,QAAQ,KAAK;AAAA,IAChF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,gDAAgD,QAAQ,UAAU;AAAA,IAClE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,QAAQ,eAAe,QAAQ,YAAY,SAAS,GAAG;AACzD,UAAM,KAAK,GAAG,kBAAkB,QAAQ,WAAW,CAAC;AAAA,EACtD;AAEA,MAAI,QAAQ,iBAAiB,QAAQ,cAAc,SAAS,GAAG;AAC7D,UAAM,KAAK,GAAG,oBAAoB,QAAQ,aAAa,CAAC;AAAA,EAC1D;AAEA,MAAI,SAAS,SAAS,GAAG;AACvB,UAAM,KAAK,IAAI,4BAA4B,OAAO,GAAG,UAAU,KAAK;AAAA,EACtE;AAEA,MAAI,QAAQ,mBAAmB;AAC7B,UAAM,KAAK,IAAI,yBAAyB,QAAQ,iBAAiB;AAAA,EACnE;AACA,MAAI,OAAO,cAAc;AACvB,UAAM,KAAK,IAAI,8BAA8B,OAAO,YAAY;AAAA,EAClE;AAEA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEO,SAAS,4BACd,SACA,UACU;AACV,QAAM,QAAkB,CAAC;AAAA,gBAAmB;AAE5C,MAAI,aAAa,SAAS;AACxB,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,WAAW,aAAa,iBAAiB;AACvC,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA,4GAA4G,QAAQ,UAAU;AAAA,MAC9H;AAAA,IACF;AAAA,EACF,OAAO;AACL,UAAM,eAAe,0BAA0B,QAAQ,WAAW;AAClE,UAAM,cAAc,QAAQ,YACzB,MAAM,eAAe,CAAC,EACtB,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM;AAClC,UAAM;AAAA,MACJ;AAAA,MACA;AAAA;AAAA,MACA,GAAG,YAAY,IAAI,CAAC,MAAM,IAAI,EAAE,YAAY,MAAM,MAAM,EAAE,OAAO,EAAE;AAAA,MACnE;AAAA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;AClJA,SAAS,YAAAC,WAAU,eAAe;AAiBlC,IAAM,gBAAwC,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,EAAE;AAGpF,IAAM,oBAAoB,oBAAI,IAAI;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,aAAa,UAA2B;AAC/C,QAAM,MAAM,SAAS,MAAM,SAAS,YAAY,GAAG,CAAC,EAAE,YAAY;AAClE,SAAO,kBAAkB,IAAI,GAAG;AAClC;AAEA,SAAS,sBAAsB,QAAgB,OAA0B;AACvE,QAAM,gBAAgB,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,YAAY,CAAC,IAAI,MAAY;AAEjF,SAAO,gBAAgB,OAAO;AAChC;AAEA,eAAe,gBAAgB,UAAkB,UAA0C;AACzF,MAAI;AACF,QAAI,aAAa,QAAQ,EAAG,QAAO;AACnC,UAAM,UAAU,MAAMA,UAAS,UAAU,OAAO;AAChD,QAAI,QAAQ,SAAS,UAAU;AAC7B,YAAM,UAAU,QAAQ,SAAS;AACjC,aAAO,QAAQ,MAAM,GAAG,QAAQ,IAAI;AAAA,kBAAqB,OAAO;AAAA,IAClE;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,kBAAkB,YAA4C;AAC3E,MAAI;AACF,UAAM,UAAU,MAAM,QAAQ,UAAU;AACxC,WAAO,UAAU,QAAQ,KAAK,IAAI,CAAC;AAAA,EACrC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,aACb,OACA,QACwB;AACxB,QAAM,SAAwB;AAAA,IAC5B,MAAM,MAAM;AAAA,IACZ,MAAM,MAAM;AAAA,IACZ,OAAO,MAAM;AAAA,IACb,SAAS;AAAA,IACT,WAAW;AAAA,EACb;AAEA,MAAI,OAAO,aAAa,EAAG,QAAO;AAElC,MAAI,MAAM,SAAS,OAAO;AAExB,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,SAAS,UAAU;AAC3B,UAAM,UAAU,MAAM,kBAAkB,MAAM,IAAI;AAClD,QAAI,SAAS;AACX,aAAO,UAAU;AACjB,aAAO,YAAY,QAAQ;AAC3B,aAAO,aAAa,QAAQ;AAAA,IAC9B;AACA,WAAO;AAAA,EACT;AAIA,QAAM,WAAW,KAAK,MAAM,OAAO,YAAY,GAAG,KAAK,OAAO;AAC9D,QAAM,UAAU,MAAM,gBAAgB,MAAM,MAAM,QAAQ;AAC1D,MAAI,SAAS;AACX,WAAO,UAAU;AACjB,WAAO,YAAY,QAAQ;AAC3B,WAAO,aAAa,QAAQ;AAAA,EAC9B;AACA,SAAO;AACT;AAEA,SAAS,YAAY,OAA8B;AACjD,QAAM,QAAQ,MAAM,QAAQ,KAAK,MAAM,KAAK,MAAM;AAClD,QAAM,SAAS,QAAQ,MAAM,IAAI,GAAG,KAAK,KAAK,MAAM,IAAI;AAExD,MAAI,MAAM,YAAY,MAAM;AAC1B,WAAO,KAAK,MAAM,IAAI,KAAK,MAAM,IAAI,GAAG,KAAK;AAAA,EAC/C;AAEA,MAAI,MAAM,SAAS,UAAU;AAC3B,WAAO,GAAG,MAAM;AAAA,EAAK,MAAM,OAAO;AAAA,EACpC;AAGA,SAAO,GAAG,MAAM;AAAA;AAAA,EAAa,MAAM,OAAO;AAAA;AAC5C;AAEA,SAAS,mBAAmB,UAAwC;AAClE,QAAM,QAAkB,CAAC;AAAA,eAAkB;AAE3C,aAAW,OAAO,UAAU;AAC1B,QAAI,IAAI,QAAQ,WAAW,EAAG;AAC9B,UAAM,OAAO,IAAI,cAAc,WAAM,IAAI,WAAW,KAAK;AACzD,UAAM,KAAK;AAAA,YAAe,IAAI,OAAO,IAAI,IAAI,EAAE;AAE/C,UAAM,iBAAiB,IAAI,QAAQ,OAAO,CAAC,MAAM,EAAE,YAAY,IAAI;AACnE,UAAM,iBAAiB,IAAI,QAAQ,OAAO,CAAC,MAAM,EAAE,YAAY,IAAI;AAEnE,eAAW,SAAS,gBAAgB;AAClC,YAAM,KAAK;AAAA,EAAK,YAAY,KAAK,CAAC,EAAE;AAAA,IACtC;AAEA,QAAI,eAAe,SAAS,GAAG;AAC7B,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,2EAA2E;AACtF,iBAAW,SAAS,gBAAgB;AAClC,cAAM,KAAK,YAAY,KAAK,CAAC;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,eAAsB,kBACpB,aACA,YACA,OACA,OACoF;AACpF,MAAI,CAAC,aAAa,UAAU,CAAC,WAAW,QAAQ;AAC9C,WAAO,EAAE,iBAAiB,IAAI,OAAO,EAAE,UAAU,GAAG,SAAS,EAAE,EAAE;AAAA,EACnE;AAEA,QAAM,eAAe,IAAI,IAAI,UAAU;AACvC,QAAM,eAAe,YAAY,OAAO,CAAC,MAAM,aAAa,IAAI,EAAE,EAAE,CAAC;AAErE,MAAI,aAAa,WAAW,GAAG;AAC7B,WAAO,EAAE,iBAAiB,IAAI,OAAO,EAAE,UAAU,GAAG,SAAS,EAAE,EAAE;AAAA,EACnE;AAGA,QAAM,aACJ,CAAC;AACH,WAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC5C,UAAM,MAAM,aAAa,CAAC;AAC1B,QAAI,CAAC,IAAI,cAAc,OAAQ;AAC/B,UAAM,SAAS,CAAC,GAAG,IAAI,YAAY,EAAE;AAAA,MACnC,CAAC,GAAG,OAAO,cAAc,EAAE,IAAI,KAAK,OAAO,cAAc,EAAE,IAAI,KAAK;AAAA,IACtE;AACA,eAAW,SAAS,QAAQ;AAC1B,iBAAW,KAAK,EAAE,UAAU,GAAG,MAAM,CAAC;AAAA,IACxC;AAAA,EACF;AAEA,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO,EAAE,iBAAiB,IAAI,OAAO,EAAE,UAAU,GAAG,SAAS,EAAE,EAAE;AAAA,EACnE;AAEA,QAAM,cAAc,sBAAsB,OAAO,KAAK;AACtD,QAAM,SAAS,EAAE,WAAW,YAAY;AACxC,MAAI,WAAW;AACf,MAAI,UAAU;AAGd,QAAM,WAAiC,aAAa,IAAI,CAAC,OAAO;AAAA,IAC9D,SAAS,EAAE;AAAA,IACX,aAAa,EAAE;AAAA,IACf,SAAS,CAAC;AAAA,EACZ,EAAE;AAEF,aAAW,EAAE,UAAU,MAAM,KAAK,YAAY;AAC5C,UAAM,SAAS,MAAM,aAAa,OAAO,MAAM;AAC/C,aAAS,QAAQ,EAAE,QAAQ,KAAK,MAAM;AACtC,QAAI,OAAO,YAAY,MAAM;AAC3B;AAAA,IACF,OAAO;AACL;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,iBAAiB,mBAAmB,QAAQ;AAAA,IAC5C,OAAO,EAAE,UAAU,QAAQ;AAAA,EAC7B;AACF;;;ACnOA,SAAS,0BAA0B,SAAgC;AACjE,QAAM,QAAkB,CAAC;AACzB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,QAAQ,eAAe,QAAQ,YAAY,SAAS,GAAG;AACzD,UAAM,KAAK,IAAI,8BAA8B;AAC7C,eAAW,MAAM,QAAQ,aAAa;AACpC,YAAM,OAAO,GAAG,cAAc,WAAM,GAAG,WAAW,KAAK;AACvD,YAAM,KAAK,WAAW,GAAG,KAAK,MAAM,GAAG,IAAI,IAAI,IAAI,EAAE;AAAA,IACvD;AAAA,EACF;AAEA,MAAI,QAAQ,eAAe,QAAQ,YAAY,SAAS,GAAG;AACzD,UAAM,KAAK,IAAI,yBAAyB;AACxC,eAAW,OAAO,QAAQ,aAAa;AACrC,YAAM,OAAO,IAAI,cAAc,WAAM,IAAI,WAAW,KAAK;AACzD,YAAM,KAAK,UAAU,IAAI,EAAE,aAAa,IAAI,IAAI,IAAI,IAAI,EAAE;AAC1D,UAAI,IAAI,cAAc,QAAQ;AAC5B,mBAAW,QAAQ,IAAI,cAAc;AACnC,gBAAM,QAAQ,KAAK,QAAQ,KAAK,KAAK,KAAK,MAAM;AAChD,gBAAM,KAAK,cAAS,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,EAAE;AAAA,QACvD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,SAA+B;AAC3D,QAAM,QAAQ;AAAA,IACZ;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI,QAAS,OAAM,KAAK,GAAG,0BAA0B,OAAO,CAAC;AAC7D,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,gBAAgB,SAA+B;AACtD,QAAM,QAAQ;AAAA,IACZ;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI,QAAS,OAAM,KAAK,GAAG,0BAA0B,OAAO,CAAC;AAC7D,SAAO,MAAM,KAAK,IAAI;AACxB;AAEO,SAAS,gBACd,WACA,SACe;AACf,UAAQ,WAAW;AAAA,IACjB,KAAK;AACH,aAAO,qBAAqB,OAAO;AAAA,IACrC,KAAK;AACH,aAAO;AAAA,QACL;AAAA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,IACb,KAAK;AACH,aAAO;AAAA,QACL;AAAA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,IACb,KAAK;AACH,aAAO,gBAAgB,OAAO;AAAA,IAChC;AACE,aAAO;AAAA,EACX;AACF;;;ACpIA,SAAS,uBAAuB,IAA+D;AAC7F,QAAM,OAAO,GAAG,OAAO,SAAS,GAAG,IAAI,KAAK;AAC5C,QAAM,KACJ,GAAG,gBAAgB,QAAQ,GAAG,gBAAgB,SAC1C,KACA,mBAAmB,GAAG,WAAW;AACvC,SAAO,KAAK,GAAG,MAAM,IAAI,KAAK,IAAI,GAAG,EAAE;AACzC;AAEA,SAAS,gBAAgB,SAAgC;AACvD,QAAM,QAAQ;AAAA,IACZ,gEAAgE,QAAQ,KAAK;AAAA,IAC7E;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI,QAAQ,cAAc;AACxB,UAAM;AAAA,MACJ;AAAA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,QAAQ,eAAe,QAAQ,YAAY,SAAS,GAAG;AACzD,UAAM,KAAK;AAAA,mBAAsB;AACjC,eAAW,MAAM,QAAQ,aAAa;AACpC,YAAM,OAAO,GAAG,cAAc,WAAM,GAAG,WAAW,KAAK;AACvD,YAAM,KAAK,WAAW,GAAG,KAAK,MAAM,GAAG,IAAI,IAAI,IAAI,EAAE;AAAA,IACvD;AAAA,EACF;AACA,MAAI,QAAQ,iBAAiB,QAAQ,cAAc,SAAS,GAAG;AAC7D,UAAM,KAAK;AAAA,gBAAmB;AAC9B,eAAW,MAAM,QAAQ,eAAe;AACtC,YAAM,KAAK,uBAAuB,EAAE,CAAC;AAAA,IACvC;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,SAAsB,cAAgC;AACjF,SAAO;AAAA,IACL,yDAAyD,QAAQ,KAAK;AAAA,IACtE,sDAAsD,YAAY;AAAA,IAClE;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,eAAe,kCAAkC,QAAQ,YAAY,OAAO;AAAA,IACpF;AAAA;AAAA,IACA,wCAAwC,YAAY;AAAA,IACpD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,OAAO,OAAO;AAClB;AAEA,SAAS,uBAAuB,SAAgC;AAC9D,SAAO;AAAA,IACL,kDAAkD,QAAQ,KAAK;AAAA,IAC/D;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA,cAAc,QAAQ,YAAY;AAAA,IAClC;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA,iGAAiG,QAAQ,YAAY;AAAA,IACrH;AAAA,IACA,oCAAoC,QAAQ,UAAU;AAAA,IACtD,6FAA6F,QAAQ,YAAY;AAAA,EACnH;AACF;AAEO,SAAS,kBACd,MACA,SACA,QACA,UACA,WACQ;AACR,QAAM,OAAO,SAAS;AACtB,QAAM,aAAa,QAAQ,cAAc;AACzC,QAAM,eAAe,QAAQ,CAAC,CAAC,OAAO,UAAU,CAAC,CAAC,QAAQ;AAE1D,MAAI,cAAc;AAChB,WAAO,4BAA4B,SAAS,QAAQ,QAAQ;AAAA,EAC9D;AAEA,QAAM,QAAQ,aACV,oBAAoB,SAAS,OAAO,YAAY,IAChD,OACE,gBAAgB,OAAO,IACvB,uBAAuB,OAAO;AAEpC,MAAI,SAAS,SAAS,GAAG;AACvB,UAAM;AAAA,MACJ;AAAA;AAAA,MACA;AAAA,MACA,GAAG;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,mBAAmB;AAC7B,UAAM,KAAK;AAAA;AAAA,EAA0B,QAAQ,iBAAiB,EAAE;AAAA,EAClE;AACA,MAAI,OAAO,cAAc;AACvB,UAAM,KAAK;AAAA;AAAA,EAA+B,OAAO,YAAY,EAAE;AAAA,EACjE;AACA,QAAM;AAAA,IACJ;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI,CAAC,QAAQ,YAAY;AACvB,UAAM;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AAEA,QAAM,aAAa,gBAAgB,WAAW,OAAO;AACrD,MAAI,YAAY;AACd,UAAM,KAAK,UAAU;AAAA,EACvB;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;;;ACpJA,SAAS,eAAe,OAAmC;AACzD,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,QAAQ,KAAM,QAAO,GAAG,KAAK;AACjC,MAAI,QAAQ,OAAO,KAAM,QAAO,GAAG,KAAK,MAAM,QAAQ,IAAI,CAAC;AAC3D,SAAO,IAAI,SAAS,OAAO,OAAO,QAAQ,CAAC,CAAC;AAC9C;AAEA,SAASC,2BAA0B,SAAgC;AACjE,WAAS,IAAI,QAAQ,SAAS,GAAG,KAAK,GAAG,KAAK;AAC5C,QAAI,QAAQ,CAAC,EAAE,SAAS,YAAa,QAAO;AAAA,EAC9C;AACA,SAAO;AACT;AAEA,SAAS,uBACP,SACA,mBAAmB,OAC8B;AACjD,QAAM,eAAeA,2BAA0B,QAAQ,WAAW;AAClE,MAAI,iBAAiB,GAAI,QAAO;AAMhC,QAAM,eAAe,CAAC,CAAC,QAAQ,eAAe,CAAC,CAAC,QAAQ,mBAAmB;AAC3E,MAAI,CAAC,aAAc,QAAO;AAE1B,QAAM,qBAAqB,QAAQ,YAAY,MAAM,eAAe,CAAC;AACrE,QAAM,qBAAqB,mBAAmB,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM;AAC3E,SAAO,qBAAqB,sBAAsB;AACpD;AAEA,SAAS,yBACP,MACA,SACA,WACe;AACf,QAAM,WAAW,uBAAuB,OAAO;AAC/C,MAAI,CAAC,QAAQ,mBAAmB,aAAa,QAAS,QAAO;AAE7D,QAAM,QAAkB,CAAC;AACzB,QAAM,eAAeA,2BAA0B,QAAQ,WAAW;AAElE,MAAI,SAAS,MAAM;AACjB,UAAM,cAAc,QAAQ,YACzB,MAAM,eAAe,CAAC,EACtB,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM;AAClC,QAAI,YAAY,SAAS,GAAG;AAC1B,YAAM;AAAA,QACJ;AAAA,QACA,GAAG,YAAY,IAAI,CAAC,MAAM,IAAI,EAAE,YAAY,MAAM,MAAM,EAAE,OAAO,EAAE;AAAA,MACrE;AAAA,IACF,OAAO;AACL,YAAM,KAAK,oEAAoE;AAAA,IACjF;AACA,UAAM;AAAA,MACJ;AAAA;AAAA,MACA;AAAA,IACF;AAAA,EACF,WAAW,aAAa,qBAAqB;AAC3C,UAAM,cAAc,QAAQ,YACzB,MAAM,eAAe,CAAC,EACtB,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM;AAClC,UAAM;AAAA,MACJ;AAAA,MACA,2BAA2B,QAAQ,YAAY;AAAA,MAC/C;AAAA;AAAA,MACA,GAAG,YAAY,IAAI,CAAC,MAAM,IAAI,EAAE,YAAY,MAAM,MAAM,EAAE,OAAO,EAAE;AAAA,MACnE;AAAA;AAAA,MACA;AAAA,IACF;AACA,QAAI,QAAQ,aAAa;AACvB,YAAM;AAAA,QACJ,6BAA6B,QAAQ,WAAW;AAAA,MAClD;AAAA,IACF,OAAO;AACL,YAAM;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAAA,EACF,OAAO;AACL,UAAM;AAAA,MACJ;AAAA,MACA,2BAA2B,QAAQ,YAAY;AAAA,MAC/C;AAAA,MACA;AAAA,IACF;AACA,QAAI,cAAc,UAAU,cAAc,YAAY;AACpD,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,MACF;AAAA,IACF,OAAO;AACL,YAAM;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AACA,QAAI,QAAQ,aAAa;AACvB,YAAM,KAAK,6BAA6B,QAAQ,WAAW,2BAA2B;AAAA,IACxF;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAYA,SAAS,eAAe,MAAgC;AACtD,QAAM,UAAU,KAAK,WAAW,KAAK,eAAe,KAAK,QAAQ,CAAC,KAAK;AACvE,MAAI,KAAK,WAAW,KAAK,oBAAoB,SAAS;AACpD,WAAO;AAAA,MACL,cAAc,KAAK,QAAQ,KAAK,KAAK,QAAQ,GAAG,OAAO;AAAA,MACvD;AAAA,MACA,KAAK;AAAA,MACL;AAAA,IACF;AAAA,EACF;AACA,MAAI,CAAC,KAAK,SAAS;AACjB,WAAO,CAAC,cAAc,KAAK,QAAQ,KAAK,KAAK,QAAQ,GAAG,OAAO,OAAO,KAAK,WAAW,EAAE;AAAA,EAC1F;AACA,MAAI,KAAK,WAAW,KAAK,oBAAoB,UAAU;AACrD,WAAO;AAAA,MACL,oBAAoB,KAAK,QAAQ,KAAK,KAAK,QAAQ,GAAG,OAAO,+BAA0B,KAAK,MAAM;AAAA,IACpG;AAAA,EACF;AACA,SAAO,CAAC,cAAc,KAAK,QAAQ,KAAK,KAAK,QAAQ,GAAG,OAAO,IAAI;AACrE;AAEA,SAAS,eAAe,MAAgC;AACtD,MAAI,KAAK,WAAW,KAAK,oBAAoB,SAAS;AACpD,WAAO,CAAC;AAAA,MAAS,KAAK,QAAQ,KAAK,KAAK,QAAQ,KAAK,OAAO,KAAK,SAAS,KAAK;AAAA,EACjF;AACA,MAAI,KAAK,WAAW,KAAK,oBAAoB,UAAU;AACrD,UAAM,OAAO,eAAe,KAAK,QAAQ;AACzC,WAAO;AAAA,MACL,sBAAsB,KAAK,QAAQ,KAAK,KAAK,QAAQ,GAAG,OAAO,KAAK,IAAI,KAAK,EAAE,+BAA0B,KAAK,MAAM;AAAA,IACtH;AAAA,EACF;AACA,MAAI,CAAC,KAAK,SAAS;AACjB,WAAO,CAAC,OAAO,KAAK,QAAQ,OAAO,KAAK,QAAQ,MAAM,KAAK,WAAW,EAAE;AAAA,EAC1E;AACA,SAAO,CAAC;AACV;AAEA,SAAS,kBAAkB,aAAmD;AAC5E,QAAM,WAAW,YAAY,MAAM,GAAG;AACtC,QAAM,QAAQ,CAAC;AAAA,uBAA0B;AACzC,aAAW,OAAO,UAAU;AAC1B,UAAM,SAAS,IAAI,YAAY,IAAI;AACnC,UAAM,KAAK,IAAI,MAAM,MAAM,IAAI,OAAO,EAAE;AACxC,QAAI,IAAI,OAAO,QAAQ;AACrB,iBAAW,QAAQ,IAAI,OAAO;AAC5B,cAAM,KAAK,GAAG,eAAe,IAAI,CAAC;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,sBAAsB,SAA8C;AACjF,MAAI,CAAC,QAAQ,aAAa,UAAU,CAAC,QAAQ,YAAY,OAAQ,QAAO;AACxE,QAAM,EAAE,gBAAgB,IAAI,MAAM;AAAA,IAChC,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ,eAAe;AAAA,EACzB;AACA,SAAO,mBAAmB;AAC5B;AAEA,eAAe,cAAc,SAAyC;AACpE,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,WAAW,QAAQ,KAAK,EAAE;AACrC,MAAI,QAAQ,aAAa;AACvB,UAAM,KAAK;AAAA;AAAA,EAAqB,QAAQ,WAAW,EAAE;AAAA,EACvD;AACA,MAAI,QAAQ,MAAM;AAChB,UAAM,KAAK;AAAA;AAAA,EAAc,QAAQ,IAAI,EAAE;AAAA,EACzC;AAEA,MAAI,QAAQ,SAAS,QAAQ,MAAM,SAAS,GAAG;AAC7C,UAAM,KAAK;AAAA,kBAAqB;AAChC,eAAW,QAAQ,QAAQ,OAAO;AAChC,YAAM,KAAK,GAAG,eAAe,IAAI,CAAC;AAAA,IACpC;AAAA,EACF;AAEA,MAAI,QAAQ,YAAY,QAAQ,SAAS,SAAS,GAAG;AACnD,UAAM,KAAK;AAAA,yBAA4B;AACvC,eAAW,OAAO,QAAQ,UAAU;AAClC,YAAM,OAAO,IAAI,YAAY,WAAW,WAAW;AACnD,YAAM,KAAK,MAAM,IAAI,OAAO,IAAI,IAAI,IAAI;AAAA,IAC1C;AAAA,EACF;AAEA,QAAM,aAAa,MAAM,sBAAsB,OAAO;AACtD,MAAI,WAAY,OAAM,KAAK,UAAU;AAErC,MAAI,QAAQ,YAAY,SAAS,GAAG;AAClC,UAAM,KAAK,GAAG,kBAAkB,QAAQ,WAAW,CAAC;AAAA,EACtD;AAEA,SAAO;AACT;AAEA,SAAS,uBACP,MACA,YACA,SACA,WACU;AAGV,MAAI,QAAQ,cAAc,YAAY;AACpC,WAAO;AAAA,MACL;AAAA,MACA,2BAA2B,QAAQ,YAAY;AAAA,MAC/C;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,cAAc,MAAM;AACtB,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,QAAQ,QAAQ,cAAc;AAChC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,MAAM;AACR,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA,2BAA2B,QAAQ,YAAY;AAAA,IAC/C;AAAA,IACA,mEAAmE,QAAQ,YAAY,4BAA4B,QAAQ,YAAY;AAAA,EACzI;AACA,MAAI,YAAY;AACd,UAAM;AAAA,MACJ;AAAA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,0BAA0B,SAAsB,MAAyB;AAChF,QAAM,eAAeA,2BAA0B,QAAQ,WAAW;AAClE,QAAM,cAAc,QAAQ,YAAY,MAAM,eAAe,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM;AAC/F,MAAI,MAAM;AACR,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MACA,GAAG,YAAY,IAAI,CAAC,MAAM,IAAI,EAAE,YAAY,MAAM,MAAM,EAAE,OAAO,EAAE;AAAA,MACnE;AAAA;AAAA,IACF;AAAA,EACF;AACA,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA,2BAA2B,QAAQ,YAAY;AAAA,IAC/C;AAAA,IACA;AAAA;AAAA,IACA,GAAG,YAAY,IAAI,CAAC,MAAM,IAAI,EAAE,YAAY,MAAM,MAAM,EAAE,OAAO,EAAE;AAAA,IACnE;AAAA;AAAA,IACA;AAAA,EACF;AACA,MAAI,QAAQ,aAAa;AACvB,UAAM;AAAA,MACJ,6BAA6B,QAAQ,WAAW;AAAA,IAClD;AAAA,EACF,OAAO;AACL,UAAM;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,kBACP,MACA,SACA,UACA,WACU;AACV,QAAM,QAAkB,CAAC;AAAA,gBAAmB;AAC5C,QAAM,OAAO,SAAS;AAEtB,MAAI,aAAa,SAAS;AACxB,UAAM,KAAK,GAAG,uBAAuB,MAAM,cAAc,QAAQ,SAAS,SAAS,CAAC;AACpF,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,iBAAiB;AAChC,QAAI,SAAS,cAAc,cAAc,cAAc,YAAY,cAAc,SAAS;AAExF,YAAM;AAAA,QACJ;AAAA,QACA,2BAA2B,QAAQ,YAAY;AAAA,QAC/C;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,UAAI,QAAQ,aAAa;AACvB,cAAM,KAAK,6BAA6B,QAAQ,WAAW,2BAA2B;AAAA,MACxF;AAAA,IACF,WAAW,MAAM;AACf,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,OAAO;AACL,YAAM;AAAA,QACJ;AAAA,QACA,2BAA2B,QAAQ,YAAY;AAAA,QAC/C;AAAA,MACF;AACA,UAAI,cAAc,UAAU,cAAc,YAAY;AACpD,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,QACF;AAAA,MACF,OAAO;AACL,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,UAAI,QAAQ,aAAa;AACvB,cAAM,KAAK,6BAA6B,QAAQ,WAAW,2BAA2B;AAAA,MACxF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,QAAM,KAAK,GAAG,0BAA0B,SAAS,IAAI,CAAC;AACtD,SAAO;AACT;AAEA,eAAsB,mBACpB,MACA,SACA,QACA,WACiB;AACjB,QAAM,eAAe,SAAS,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,QAAQ;AAE5D,MAAI,CAAC,cAAc;AACjB,UAAM,kBAAkB,yBAAyB,MAAM,SAAS,SAAS;AACzE,QAAI,gBAAiB,QAAO;AAAA,EAC9B;AAEA,QAAM,OAAO,SAAS;AACtB,QAAM,WAAW,uBAAuB,SAAS,IAAI;AACrD,QAAM,OAAO,MAAM,cAAc,OAAO;AACxC,QAAM,eAAe,eACjB,4BAA4B,SAAS,QAAQ,IAC7C,kBAAkB,MAAM,SAAS,UAAU,SAAS;AACxD,SAAO,CAAC,GAAG,MAAM,GAAG,YAAY,EAAE,KAAK,IAAI;AAC7C;;;AC9YA,SAAS,0BAA0B;;;ACAnC,SAAS,YAAY;AACrB,SAAS,SAAS;AASlB,SAAS,gBAAgB,UAA2B;AAClD,SAAO,SAAS,WAAW,QAAQ;AACrC;AAIA,IAAM,qBAAiE;AAAA,EACrE,UAAU,CAAC,MAAO,EAAE,WAAsB;AAAA,EAC1C,UAAU,CAAC,MAAM,GAAG,EAAE,IAAI,KAAM,EAAE,OAAkB,MAAM,GAAG,GAAI,KAAK,EAAE;AAAA,EACxE,aAAa,CAAC,MACZ,GAAG,EAAE,IAAI,WAAO,EAAE,QAAmB,MAAM,GAAG,GAAG,KAAK,EAAE,GAAG,EAAE,UAAU,aAAa,EAAE;AAAA,EACxF,SAAS,CAAC,MAAO,EAAE,WAAsB;AAAA,EACzC,OAAO,CAAC,MAAM,UAAW,EAAE,WAAsB,EAAE;AAAA,EACnD,WAAW,CAAC,MACV,cAAe,EAAE,WAAsB,EAAE,YAAY,EAAE,WAAW,GAAG,eAAe,EAAE,cAAc,GAAG;AAAA,EACzG,cAAc,CAAC,MAAM,IAAK,EAAE,UAAqB,QAAQ,KAAM,EAAE,QAAmB,EAAE;AAAA,EACtF,sBAAsB,CAAC,MAAM,IAAK,EAAE,UAAqB,QAAQ,KAAM,EAAE,QAAmB,EAAE;AAAA,EAC9F,UAAU,CAAC,MAAM,kBAAmB,EAAE,WAAyB,UAAU,CAAC;AAC5E;AAEA,SAAS,eAAe,GAAuB;AAC7C,QAAM,YAAY,mBAAmB,EAAE,IAAI;AAC3C,SAAO,YAAY,UAAU,CAA2B,IAAI,KAAK,UAAU,CAAC;AAC9E;AAEA,SAAS,sBAAsB,YAAgC;AAC7D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,iDAAiD;AAAA,MACvF,SAAS,EACN,OAAO,EACP,SAAS,EACT,SAAS,wEAAwE;AAAA,IACtF;AAAA,IACA,OAAO,EAAE,OAAO,QAAQ,MAAM;AAC5B,UAAI;AACF,cAAM,WAAW,MAAM,WAAW,kBAAkB,OAAO,OAAO;AAClE,eAAO,WAAW,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,MACrD,QAAQ;AACN,eAAO;AAAA,UACL,KAAK,UAAU;AAAA,YACb,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,IACA,EAAE,aAAa,EAAE,cAAc,KAAK,EAAE;AAAA,EACxC;AACF;AAEA,SAAS,oBAAoB,YAAgC;AAC3D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,SAAS,EAAE,OAAO,EAAE,SAAS,iCAAiC;AAAA,MAC9D,SAAS,EACN,OAAO,EACP,SAAS,EACT,SAAS,oEAAoE;AAAA,IAClF;AAAA,IACA,OAAO,EAAE,SAAS,QAAQ,MAAM;AAC9B,UAAI;AACF,YAAI,SAAS;AACX,gBAAM,WAAW,qBAAqB,SAAS,OAAO;AACtD,iBAAO,WAAW,gCAAgC,OAAO,QAAQ;AAAA,QACnE;AACA,mBAAW,gBAAgB,OAAO;AAClC,eAAO,WAAW,8BAA8B;AAAA,MAClD,SAAS,OAAO;AACd,eAAO;AAAA,UACL,2BAA2B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACrF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,0BAA0B,YAAgC;AACjE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,QAAQ,EACL,KAAK,CAAC,cAAc,YAAY,aAAa,UAAU,CAAC,EACxD,SAAS,6BAA6B;AAAA,MACzC,SAAS,EACN,OAAO,EACP,SAAS,EACT,SAAS,2DAA2D;AAAA,IACzE;AAAA,IACA,OAAO,EAAE,QAAQ,QAAQ,MAAM;AAC7B,UAAI;AACF,YAAI,SAAS;AACX,gBAAM,WAAW,kBAAkB,SAAS,MAAM;AAClD,iBAAO,WAAW,cAAc,OAAO,sBAAsB,MAAM,GAAG;AAAA,QACxE;AACA,mBAAW,aAAa,MAAM;AAC9B,eAAO,WAAW,0BAA0B,MAAM,GAAG;AAAA,MACvD,SAAS,OAAO;AACd,eAAO;AAAA,UACL,4BAA4B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACtF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB,YAAgC,QAA2B;AACvF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,CAAC;AAAA,IACD,YAAY;AACV,UAAI;AACF,cAAM,MAAM,MAAM,WAAW,iBAAiB;AAC9C,eAAO,WAAW,IAAI,QAAQ,oBAAoB;AAAA,MACpD,QAAQ;AACN,eAAO,WAAW,YAAY,OAAO,MAAM,kCAAkC;AAAA,MAC/E;AAAA,IACF;AAAA,IACA,EAAE,aAAa,EAAE,cAAc,KAAK,EAAE;AAAA,EACxC;AACF;AAEA,SAAS,iBAAiB,YAAgC;AACxD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,YAAY,EAAE,OAAO,EAAE,SAAS,wCAAwC;AAAA,IAC1E;AAAA,IACA,OAAO,EAAE,WAAW,MAAM;AACxB,UAAI;AACF,cAAM,OAAO,MAAM,WAAW,UAAU,UAAU;AAClD,eAAO,WAAW,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,MACjD,SAAS,OAAO;AACd,eAAO;AAAA,UACL,uBAAuB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACjF;AAAA,MACF;AAAA,IACF;AAAA,IACA,EAAE,aAAa,EAAE,cAAc,KAAK,EAAE;AAAA,EACxC;AACF;AAEA,SAAS,oBAAoB,YAAgC;AAC3D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,SAAS,EACN,OAAO,EACP,SAAS,EACT,SAAS,2DAA2D;AAAA,MACvE,QAAQ,EACL,KAAK,CAAC,SAAS,aAAa,CAAC,EAC7B,SAAS,EACT,SAAS,0CAA0C;AAAA,MACtD,OAAO,EACJ,OAAO,EACP,SAAS,EACT,SAAS,4DAA4D;AAAA,IAC1E;AAAA,IACA,OAAO,EAAE,SAAS,QAAQ,MAAM,MAAM;AACpC,UAAI;AACF,cAAM,iBAAiB,KAAK,IAAI,SAAS,IAAI,GAAG;AAChD,cAAM,SAAS,MAAM,WAAW,gBAAgB,SAAS,gBAAgB,MAAM;AAC/E,cAAM,YAAY,OACf,IAAI,CAAC,UAAU;AACd,gBAAM,OAAO,MAAM;AACnB,gBAAM,IAAI,MAAM;AAChB,iBAAO,IAAI,IAAI,MAAM,EAAE,IAAI,KAAK,eAAe,CAAC,CAAC;AAAA,QACnD,CAAC,EACA,KAAK,IAAI;AACZ,eAAO,WAAW,aAAa,oBAAoB;AAAA,MACrD,SAAS,OAAO;AACd,eAAO;AAAA,UACL,6BAA6B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACvF;AAAA,MACF;AAAA,IACF;AAAA,IACA,EAAE,aAAa,EAAE,cAAc,KAAK,EAAE;AAAA,EACxC;AACF;AAEA,SAAS,uBAAuB,YAAgC;AAC9D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,CAAC;AAAA,IACD,YAAY;AACV,UAAI;AACF,cAAM,QAAQ,MAAM,WAAW,eAAe;AAC9C,cAAM,WAAW,MAAM,IAAI,CAAC,EAAE,SAAS,IAAI,GAAG,KAAK,MAAM,IAAI;AAC7D,cAAM,UAA0B;AAAA,UAC9B,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,UAAU,MAAM,CAAC,EAAE;AAAA,QACnE;AACA,mBAAW,QAAQ,OAAO;AACxB,cAAI,KAAK,WAAW,KAAK,oBAAoB,YAAY,gBAAgB,KAAK,QAAQ,GAAG;AACvF,oBAAQ,KAAK,WAAW,KAAK,SAAS,KAAK,QAAQ,CAAC;AAAA,UACtD;AAAA,QACF;AACA,eAAO,EAAE,QAAQ;AAAA,MACnB,QAAQ;AACN,eAAO,WAAW,4BAA4B;AAAA,MAChD;AAAA,IACF;AAAA,IACA,EAAE,aAAa,EAAE,cAAc,KAAK,EAAE;AAAA,EACxC;AACF;AAEA,SAAS,qBAAqB,YAAgC;AAC5D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,yBAAyB,EAAE;AAAA,IACzD,OAAO,EAAE,OAAO,MAAM;AACpB,UAAI;AACF,cAAM,OAAO,MAAM,WAAW,cAAc,MAAM;AAClD,cAAM,EAAE,SAAS,YAAY,GAAG,SAAS,IAAI;AAC7C,cAAM,UAA0B;AAAA,UAC9B,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,UAAU,MAAM,CAAC,EAAE;AAAA,QACnE;AACA,YAAI,cAAc,KAAK,oBAAoB,YAAY,gBAAgB,KAAK,QAAQ,GAAG;AACrF,kBAAQ,KAAK,WAAW,YAAY,KAAK,QAAQ,CAAC;AAAA,QACpD,WAAW,YAAY;AACrB,kBAAQ,CAAC,IAAI,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,MAAM,MAAM,CAAC,EAAE;AAAA,QAC5E;AACA,eAAO,EAAE,QAAQ;AAAA,MACnB,SAAS,OAAO;AACd,eAAO;AAAA,UACL,4BAA4B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACtF;AAAA,MACF;AAAA,IACF;AAAA,IACA,EAAE,aAAa,EAAE,cAAc,KAAK,EAAE;AAAA,EACxC;AACF;AAEA,SAAS,yBAAyB,YAAgC;AAChE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2BAA2B;AAAA,MAClE,QAAQ,EACL,OAAO,EACP,SAAS,EACT,SAAS,uDAAuD;AAAA,IACrE;AAAA,IACA,OAAO,EAAE,QAAQ,OAAO,MAAM;AAC5B,UAAI;AACF,cAAM,YAAY,MAAM,WAAW,gBAAgB,QAAQ,MAAM;AACjE,eAAO,WAAW,KAAK,UAAU,WAAW,MAAM,CAAC,CAAC;AAAA,MACtD,SAAS,OAAO;AACd,eAAO;AAAA,UACL,+BAA+B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QACzF;AAAA,MACF;AAAA,IACF;AAAA,IACA,EAAE,aAAa,EAAE,cAAc,KAAK,EAAE;AAAA,EACxC;AACF;AAEA,SAAS,0BAA0B,YAAgC;AACjE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,oCAAoC;AAAA,IAC9E;AAAA,IACA,OAAO,EAAE,QAAQ,MAAM;AACrB,UAAI;AACF,cAAM,YAAY,MAAM,WAAW,iBAAiB,OAAO;AAC3D,eAAO,WAAW,KAAK,UAAU,WAAW,MAAM,CAAC,CAAC;AAAA,MACtD,SAAS,OAAO;AACd,eAAO;AAAA,UACL,iCAAiC,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,QAC3F;AAAA,MACF;AAAA,IACF;AAAA,IACA,EAAE,aAAa,EAAE,cAAc,KAAK,EAAE;AAAA,EACxC;AACF;AAEA,SAAS,2BAA2B,YAAgC;AAClE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,OAAO,EAAE,OAAO,EAAE,SAAS,cAAc;AAAA,MACzC,MAAM,EAAE,OAAO,EAAE,SAAS,qCAAqC;AAAA,IACjE;AAAA,IACA,OAAO,EAAE,OAAO,KAAK,MAAM;AACzB,UAAI;AACF,cAAM,SAAS,MAAM,WAAW,SAAS,EAAE,OAAO,KAAK,CAAC;AACxD,mBAAW,UAAU;AAAA,UACnB,MAAM;AAAA,UACN,KAAK,OAAO;AAAA,UACZ,QAAQ,OAAO;AAAA,QACjB,CAAC;AACD,eAAO,WAAW,iBAAiB,OAAO,MAAM,aAAa,OAAO,GAAG,EAAE;AAAA,MAC3E,SAAS,OAAO;AACd,cAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU;AACrD,eAAO,WAAW,kCAAkC,GAAG,EAAE;AAAA,MAC3D;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,iBAAiB,YAAgC,QAA2B;AAC1F,SAAO;AAAA,IACL,sBAAsB,UAAU;AAAA,IAChC,oBAAoB,UAAU;AAAA,IAC9B,0BAA0B,UAAU;AAAA,IACpC,qBAAqB,YAAY,MAAM;AAAA,IACvC,iBAAiB,UAAU;AAAA,IAC3B,oBAAoB,UAAU;AAAA,IAC9B,uBAAuB,UAAU;AAAA,IACjC,qBAAqB,UAAU;AAAA,IAC/B,yBAAyB,UAAU;AAAA,IACnC,0BAA0B,UAAU;AAAA,IACpC,2BAA2B,UAAU;AAAA,EACvC;AACF;;;ACjVA,SAAS,QAAAC,aAAY;AACrB,SAAS,KAAAC,UAAS;AAKX,SAAS,2BAA2B,aAAkD;AAC3F,MAAI,eAAe,YAAY,SAAS,GAAG;AACzC,UAAM,QAAQ,YAAY,IAAI,CAAC,OAAO,GAAG,GAAG,KAAK,IAAI,GAAG,IAAI,EAAE,EAAE,KAAK,IAAI;AACzE,WAAO,sBAAsB,KAAK;AAAA,EACpC;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,YAAgC,eAAuB;AAChF,SAAO;AAAA,IACLC;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,QACE,OAAOC,GAAE,OAAO,EAAE,SAAS,eAAe;AAAA,QAC1C,aAAaA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,mBAAmB;AAAA,QAC/D,MAAMA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,iCAAiC;AAAA,QACtE,SAASA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,6BAA6B;AAAA,QACrE,iBAAiBA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,aAAa;AAAA,MAC/D;AAAA,MACA,OAAO,WAAW;AAChB,YAAI;AACF,gBAAM,SAAS,MAAM,WAAW,cAAc,MAAM;AACpD,iBAAO,WAAW,4BAA4B,OAAO,EAAE,EAAE;AAAA,QAC3D,SAAS,OAAO;AACd,iBAAO;AAAA,YACL,6BAA6B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,UACvF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACAD;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,QACE,WAAWC,GAAE,OAAO,EAAE,SAAS,0BAA0B;AAAA,QACzD,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,QAC3B,aAAaA,GAAE,OAAO,EAAE,SAAS;AAAA,QACjC,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,QAC1B,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,QAC7B,iBAAiBA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,aAAa;AAAA,MAC/D;AAAA,MACA,OAAO,EAAE,WAAW,GAAG,OAAO,MAAM;AAClC,YAAI;AACF,gBAAM,QAAQ,QAAQ,WAAW,cAAc,WAAW,MAAM,CAAC;AACjE,iBAAO,WAAW,kBAAkB;AAAA,QACtC,SAAS,OAAO;AACd,iBAAO,WAAW,WAAW,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAAA,QACzF;AAAA,MACF;AAAA,IACF;AAAA,IACAD;AAAA,MACE;AAAA,MACA;AAAA,MACA,EAAE,WAAWC,GAAE,OAAO,EAAE,SAAS,0BAA0B,EAAE;AAAA,MAC7D,OAAO,EAAE,UAAU,MAAM;AACvB,YAAI;AACF,gBAAM,QAAQ,QAAQ,WAAW,cAAc,SAAS,CAAC;AACzD,iBAAO,WAAW,kBAAkB;AAAA,QACtC,SAAS,OAAO;AACd,iBAAO,WAAW,WAAW,iBAAiB,QAAQ,MAAM,UAAU,eAAe,EAAE;AAAA,QACzF;AAAA,MACF;AAAA,IACF;AAAA,IACAD;AAAA,MACE;AAAA,MACA;AAAA,MACA,CAAC;AAAA,MACD,YAAY;AACV,YAAI;AACF,gBAAM,WAAW,MAAM,WAAW,aAAa;AAC/C,iBAAO,WAAW,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,QACrD,QAAQ;AACN,iBAAO,WAAW,0BAA0B;AAAA,QAC9C;AAAA,MACF;AAAA,MACA,EAAE,aAAa,EAAE,cAAc,KAAK,EAAE;AAAA,IACxC;AAAA,EACF;AACF;AAEO,SAAS,oBAAoB,YAAgC;AAClE,SAAOA;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,MAAMC,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2BAA2B;AAAA,MAChE,aAAaA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0BAA0B;AAAA,IACxE;AAAA,IACA,OAAO,EAAE,MAAM,YAAY,MAAM;AAC/B,UAAI;AACF,cAAM,QAAQ,QAAQ,WAAW,iBAAiB,EAAE,MAAM,YAAY,CAAC,CAAC;AACxE,eAAO,WAAW,4BAA4B;AAAA,MAChD,QAAQ;AACN,eAAO,WAAW,wBAAwB;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,aACd,YACA,aACA,SACA;AACA,QAAM,gBAAgB,2BAA2B,WAAW;AAC5D,QAAM,QAAQ,CAAC,oBAAoB,UAAU,GAAG,GAAG,kBAAkB,YAAY,aAAa,CAAC;AAE/F,MAAI,CAAC,SAAS,iBAAkB,QAAO;AACvC,SAAO,CAAC,GAAG,OAAO,GAAG,eAAe,UAAU,CAAC;AACjD;AAEA,SAAS,eAAe,YAAgC;AACtD,SAAO;AAAA,IACLD;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,QACE,aAAaC,GAAE,OAAO,EAAE,SAAS,8CAA8C;AAAA,MACjF;AAAA,MACA,OAAO,EAAE,YAAY,MAAM;AACzB,YAAI;AACF,gBAAM,SAAS,MAAM,WAAW,qBAAqB,WAAW;AAChE,iBAAO,WAAW,uCAAuC,OAAO,WAAW,EAAE;AAAA,QAC/E,SAAS,OAAO;AACd,iBAAO;AAAA,YACL,sCAAsC,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,UAChG;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACAD;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,QACE,aAAaC,GAAE,OAAO,EAAE,SAAS,iDAAiD;AAAA,MACpF;AAAA,MACA,OAAO,EAAE,YAAY,MAAM;AACzB,YAAI;AACF,gBAAM,WAAW,eAAe,WAAW;AAC3C,iBAAO,WAAW,mCAAmC,WAAW,EAAE;AAAA,QACpE,SAAS,OAAO;AACd,iBAAO;AAAA,YACL,+BAA+B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,UACzF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACAD;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,QACE,aAAaC,GACV,OAAO,EACP,SAAS,0DAA0D;AAAA,MACxE;AAAA,MACA,OAAO,EAAE,YAAY,MAAM;AACzB,YAAI;AACF,gBAAM,SAAS,MAAM,WAAW,kBAAkB,WAAW;AAC7D,cAAI,OAAO,QAAQ;AACjB,mBAAO;AAAA,cACL,OAAO,OAAO,QAAQ,iCAAiC,OAAO,WAAW;AAAA,YAC3E;AAAA,UACF;AACA,iBAAO;AAAA,YACL,OAAO,OAAO,QAAQ,0BAA0B,OAAO,WAAW;AAAA,UACpE;AAAA,QACF,SAAS,OAAO;AACd,iBAAO;AAAA,YACL,mCAAmC,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,UAC7F;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACrLA,SAAS,QAAAC,aAAY;AACrB,SAAS,KAAAC,UAAS;AAMlB,SAAS,eAAe,YAAgC;AACtD,SAAO;AAAA,IACLC;AAAA,MACE;AAAA,MACA;AAAA,MACA,CAAC;AAAA,MACD,YAAY;AACV,YAAI;AACF,gBAAM,QAAQ,MAAM,WAAW,UAAU;AACzC,iBAAO,WAAW,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,QAClD,SAAS,OAAO;AACd,iBAAO;AAAA,YACL,yBAAyB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,UACnF;AAAA,QACF;AAAA,MACF;AAAA,MACA,EAAE,aAAa,EAAE,cAAc,KAAK,EAAE;AAAA,IACxC;AAAA,IACAA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,QACE,QAAQC,GAAE,OAAO,EAAE,SAAS,uBAAuB;AAAA,MACrD;AAAA,MACA,OAAO,EAAE,OAAO,MAAM;AACpB,YAAI;AACF,gBAAM,QAAQ,QAAQ,WAAW,qBAAqB,EAAE,OAAO,CAAC,CAAC;AACjE,iBAAO,WAAW,wBAAwB;AAAA,QAC5C,SAAS,OAAO;AACd,iBAAO;AAAA,YACL,uBAAuB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,UACjF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACAD;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,QACE,QAAQC,GACL,OAAO,EACP;AAAA,UACC;AAAA,QACF;AAAA,QACF,aAAaA,GACV,KAAK,CAAC,QAAQ,YAAY,aAAa,QAAQ,CAAC,EAChD,SAAS,EACT,SAAS,uCAAuC;AAAA,MACrD;AAAA,MACA,OAAO,EAAE,QAAQ,YAAY,MAAM;AACjC,YAAI;AACF,gBAAM,SAAS,MAAM,WAAW,iBAAiB,QAAQ,eAAe,QAAQ;AAChF,iBAAO,WAAW,gCAAgC,OAAO,MAAM,EAAE;AAAA,QACnE,SAAS,OAAO;AACd,iBAAO;AAAA,YACL,4BAA4B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,UACtF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,oBAAoB,YAAgC,SAAuB;AACzF,QAAM,gBAAgB,2BAA2B,SAAS,WAAW;AAErE,SAAO;AAAA,IACLD;AAAA,MACE;AAAA,MACA;AAAA,MACA,EAAE,OAAOC,GAAE,OAAO,EAAE,SAAS,aAAa,EAAE;AAAA,MAC5C,OAAO,EAAE,MAAM,MAAM;AACnB,YAAI;AACF,gBAAM,QAAQ,QAAQ,WAAW,qBAAqB,EAAE,iBAAiB,MAAM,CAAC,CAAC;AACjF,iBAAO,WAAW,uBAAuB,KAAK,EAAE;AAAA,QAClD,SAAS,OAAO;AACd,iBAAO;AAAA,YACL,+BAA+B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,UACzF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACAD;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,QACE,QAAQC,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,4BAA4B;AAAA,MACnE;AAAA,MACA,OAAO,EAAE,OAAO,MAAM;AACpB,YAAI;AACF,gBAAM,QAAQ,QAAQ,WAAW,qBAAqB,EAAE,OAAO,CAAC,CAAC;AACjE,iBAAO,WAAW,kBAAkB,OAAO,MAAM,SAAS;AAAA,QAC5D,SAAS,OAAO;AACd,iBAAO;AAAA,YACL,uBAAuB,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,UACjF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACAD;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,QACE,OAAOC,GAAE,OAAO,EAAE,SAAS,oBAAoB;AAAA,MACjD;AAAA,MACA,OAAO,EAAE,MAAM,MAAM;AACnB,YAAI;AACF,gBAAM,QAAQ,QAAQ,WAAW,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAChE,iBAAO,WAAW,0BAA0B,KAAK,EAAE;AAAA,QACrD,SAAS,OAAO;AACd,iBAAO;AAAA,YACL,2BAA2B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,UACrF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,GAAG,eAAe,UAAU;AAAA,EAC9B;AACF;;;AHtHO,SAAS,WAAW,MAA6D;AACtF,SAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,KAAK,CAAC,EAAE;AACtD;AAEO,SAAS,WACd,MACA,UACmD;AACnD,SAAO,EAAE,MAAM,SAAkB,MAAM,SAAS;AAClD;AAEA,SAAS,iBAAiB,WAAkC,YAAgC;AAG1F,MAAI,cAAc,eAAe,cAAc,QAAQ;AACrD,WAAO,CAAC,oBAAoB,UAAU,CAAC;AAAA,EACzC;AACA,SAAO,CAAC;AACV;AAEA,SAAS,aACP,WACA,YACA,QACA,SACA;AACA,MAAI,OAAO,SAAS,OAAQ,QAAO,iBAAiB,WAAW,UAAU;AAEzE,UAAQ,WAAW;AAAA,IACjB,KAAK;AACH,aAAO,SAAS,eACZ,aAAa,YAAY,SAAS,aAAa,EAAE,kBAAkB,KAAK,CAAC,IACzE,CAAC;AAAA,IACP,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,aAAa,YAAY,SAAS,aAAa;AAAA,QACpD,kBAAkB,CAAC,CAAC,SAAS;AAAA,MAC/B,CAAC;AAAA,IACH;AACE,aAAO,OAAO,SAAS,OACnB,aAAa,YAAY,SAAS,aAAa,EAAE,kBAAkB,MAAM,CAAC,IAC1E,CAAC;AAAA,EACT;AACF;AAGO,SAAS,wBACd,YACA,QACA,SACA,WACA;AACA,QAAM,cAAc,iBAAiB,YAAY,MAAM;AACvD,QAAM,gBAAgB,aAAa,SAAS,aAAa;AACzD,QAAM,YAAY,aAAa,eAAe,YAAY,QAAQ,OAAO;AAEzE,QAAM,iBACJ,kBAAkB,eAAe,kBAAkB,SAC/C,oBAAoB,YAAY,OAAO,IACvC,CAAC;AAEP,SAAO,mBAAmB;AAAA,IACxB,MAAM;AAAA,IACN,OAAO,CAAC,GAAG,aAAa,GAAG,WAAW,GAAG,cAAc;AAAA,EACzD,CAAC;AACH;;;AI1EA,SAAS,kBAAkB;AAG3B,IAAM,qBAAqB,oBAAI,IAAI,CAAC,SAAS,QAAQ,WAAW,CAAC;AACjE,IAAM,0BACJ;AAMF,SAAS,WAAW,OAAyC;AAC3D,QAAM,WAAW,OAAO,MAAM,aAAa,MAAM,QAAQ,EAAE;AAC3D,SAAO,SAAS,SAAS,gBAAgB;AAC3C;AAEA,SAAS,0BAA0B,UAAkB,OAA4C;AAC/F,MAAI,mBAAmB,IAAI,QAAQ,GAAG;AACpC,QAAI,WAAW,KAAK,GAAG;AACrB,aAAO,EAAE,UAAU,SAAS,cAAc,MAAM;AAAA,IAClD;AACA,WAAO;AAAA,MACL,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,EACF;AACA,SAAO,EAAE,UAAU,SAAS,cAAc,MAAM;AAClD;AAEA,SAAS,yBAAyB,UAAkB,OAA4C;AAC9F,MAAI,aAAa,QAAQ;AACvB,UAAM,MAAM,OAAO,MAAM,WAAW,EAAE;AACtC,QAAI,wBAAwB,KAAK,GAAG,GAAG;AACrC,aAAO;AAAA,QACL,UAAU;AAAA,QACV,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,UAAU,SAAS,cAAc,MAAM;AAClD;AAEA,SAAS,uBACP,UACA,OACA,cACY;AACZ,MAAI,cAAc;AAChB,WAAO,yBAAyB,UAAU,KAAK;AAAA,EACjD;AACA,MAAI,mBAAmB,IAAI,QAAQ,GAAG;AACpC,QAAI,WAAW,KAAK,GAAG;AACrB,aAAO,EAAE,UAAU,SAAS,cAAc,MAAM;AAAA,IAClD;AACA,WAAO;AAAA,MACL,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,EACF;AACA,MAAI,aAAa,QAAQ;AACvB,UAAM,MAAM,OAAO,MAAM,WAAW,EAAE;AACtC,QAAI,wBAAwB,KAAK,GAAG,GAAG;AACrC,aAAO,EAAE,UAAU,QAAQ,SAAS,gDAAgD;AAAA,IACtF;AAAA,EACF;AACA,SAAO,EAAE,UAAU,SAAS,cAAc,MAAM;AAClD;AAEA,SAAS,qBACP,UACA,OACA,mBACA,cACY;AACZ,MAAI,mBAAmB;AACrB,WAAO,eACH,uBAAuB,UAAU,OAAO,IAAI,IAC5C,yBAAyB,UAAU,KAAK;AAAA,EAC9C;AACA,MAAI,mBAAmB,IAAI,QAAQ,GAAG;AACpC,QAAI,WAAW,KAAK,GAAG;AACrB,aAAO,EAAE,UAAU,SAAS,cAAc,MAAM;AAAA,IAClD;AACA,WAAO;AAAA,MACL,UAAU;AAAA,MACV,SACE;AAAA,IACJ;AAAA,EACF;AACA,SAAO,EAAE,UAAU,SAAS,cAAc,MAAM;AAClD;AAEA,eAAe,mBACb,MACA,OACqB;AACrB,MAAI;AAKF,SAAK,aAAa;AAElB,UAAM,YAAY,MAAM,KAAK,WAAW,kBAAkB;AAC1D,UAAM,eAAyB,CAAC;AAEhC,QAAI,CAAC,UAAU,MAAM,KAAK,EAAG,cAAa,KAAK,6BAA6B;AAC5E,QAAI,CAAC,UAAU,aAAc,cAAa,KAAK,qCAAqC;AACpF,QAAI,CAAC,UAAU,SAAS,UAAU,UAAU;AAC1C,mBAAa,KAAK,4BAA4B;AAEhD,QAAI,aAAa,SAAS,GAAG;AAC3B,aAAO;AAAA,QACL,UAAU;AAAA,QACV,SAAS;AAAA,UACP;AAAA,UACA,GAAG,aAAa,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AAAA,UACnC;AAAA,UACA;AAAA,QACF,EAAE,KAAK,IAAI;AAAA,MACb;AAAA,IACF;AAEA,UAAM,KAAK,WAAW,sBAAsB;AAC5C,SAAK,oBAAoB;AAEzB,QAAI,KAAK,cAAc,aAAa;AAGlC,WAAK,WAAW;AAAA,QACd;AAAA,MACF;AACA,aAAO,EAAE,UAAU,SAAkB,cAAc,MAAM;AAAA,IAC3D;AAEA,UAAM,UAAU,KAAK,eAAe,WAAW;AAC/C,SAAK,qBAAqB;AAC1B,QAAI,KAAK,kBAAkB;AACzB,WAAK,iBAAiB,OAAO;AAAA,IAC/B;AAEA,WAAO,EAAE,UAAU,SAAkB,cAAc,MAAM;AAAA,EAC3D,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,UAAU;AAAA,MACV,SAAS,0BAA0B,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IACrF;AAAA,EACF;AACF;AAEA,eAAe,sBACb,MACA,OACqB;AACrB,QAAM,sBAAsB,IAAI,KAAK;AACrC,QAAM,YAAY,MAAM;AAOxB,QAAM,YAAY,WAAW;AAC7B,OAAK,WAAW,WAAW,mBAAmB;AAC9C,OAAK,WAAW,UAAU;AAAA,IACxB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO,KAAK,UAAU,KAAK;AAAA,EAC7B,CAAC;AAED,QAAM,gBAAgB,KAAK,WAAW,gBAAgB,WAAW,SAAS;AAC1E,QAAM,iBAAiB,IAAI,QAAc,CAACC,aAAY;AACpD,eAAW,MAAMA,SAAQ,IAAI,GAAG,mBAAmB;AAAA,EACrD,CAAC;AAED,QAAM,UAAU,MAAM,QAAQ,KAAK,CAAC,eAAe,cAAc,CAAC;AAClE,OAAK,WAAW,WAAW,SAAS;AAEpC,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,MACL,UAAU;AAAA,MACV,SACE;AAAA,IACJ;AAAA,EACF;AAEA,SAAO,EAAE,UAAU,SAAS,cAAc,EAAE,WAAW,MAAM,WAAW,QAAQ,EAAE;AACpF;AAEO,SAAS,gBACd,MAC2E;AAC3E,SAAO,OAAO,UAAU,UAAU;AAChC,QACE,aAAa,mBACZ,KAAK,cAAc,UAAU,KAAK,cAAc,gBACjD,CAAC,KAAK,mBACN;AACA,aAAO,MAAM,mBAAmB,MAAM,KAAK;AAAA,IAC7C;AAEA,QAAI,aAAa,mBAAmB;AAClC,aAAO,MAAM,sBAAsB,MAAM,KAAK;AAAA,IAChD;AAEA,YAAQ,KAAK,WAAW;AAAA,MACtB,KAAK;AACH,eAAO,0BAA0B,UAAU,KAAK;AAAA,MAClD,KAAK;AACH,eAAO,yBAAyB,UAAU,KAAK;AAAA,MACjD,KAAK;AACH,eAAO,uBAAuB,UAAU,OAAO,KAAK,YAAY;AAAA,MAClE,KAAK;AACH,eAAO,qBAAqB,UAAU,OAAO,KAAK,mBAAmB,KAAK,YAAY;AAAA,MACxF;AACE,eAAO,EAAE,UAAU,SAAS,cAAc,MAAM;AAAA,IACpD;AAAA,EACF;AACF;;;AVjMA,IAAMC,UAAS,oBAAoB,eAAe;AAClD,IAAMC,qBAAoB;AAC1B,IAAMC,uBAAsB;AAC5B,IAAM,kBAAkB,CAAC,KAAQ,MAAS,MAAS,GAAO;AAyB1D,SAAS,WAAW,MAAoE;AACtF,SAAO;AAAA,IACL,aAAa;AAAA,MACX;AAAA,QACE,OAAO;AAAA,UACL,OAAO,UAAmC;AACxC,gBAAI,MAAM,oBAAoB,eAAe;AAC3C,oBAAM,SACJ,OAAO,MAAM,kBAAkB,WAC3B,MAAM,cAAc,MAAM,GAAG,GAAG,IAChC,KAAK,UAAU,MAAM,aAAa,EAAE,MAAM,GAAG,GAAG;AACtD,mBAAK,WAAW,UAAU;AAAA,gBACxB,MAAM;AAAA,gBACN,MAAM,MAAM;AAAA,gBACZ;AAAA,gBACA,SAAS;AAAA,cACX,CAAC;AAAA,YACH;AACA,mBAAO,MAAM,QAAQ,QAAQ,EAAE,UAAU,KAAK,CAAmB;AAAA,UACnE;AAAA,QACF;AAAA,QACA,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,MAA0C;AACpE,QAAM,cAAc,IAAI,IAAI,KAAK,OAAO,cAAc,EAAE;AACxD,SAAO;AAAA,IACL,SAAS;AAAA,IACT,0BAA0B;AAAA,IAC1B,0BAA0B;AAAA,IAC1B,YAAY;AAAA,MACV,YAAY,CAAC,GAAG,KAAK,OAAO,YAAY,KAAK;AAAA,MAC7C,UAAU,CAAC,eAAe,eAAe,WAAW,WAAW;AAAA,MAC/D,WAAW,CAAC,WAAW,aAAa,oBAAoB;AAAA,IAC1D;AAAA,IACA,SAAS;AAAA,MACP,gBAAgB,CAAC,aAAa,mBAAmB;AAAA,MACjD,yBAAyB;AAAA,MACzB,mBAAmB;AAAA,IACrB;AAAA,EACF;AACF;AAEA,SAAS,eAAe,MAAiB,mBAAqC;AAC5E,SAAO,SAAS,eAAe,SAAS,UAAW,SAAS,UAAU,CAAC;AACzE;AAEA,SAAS,qBACP,UACA,MACA,mBACsB;AACtB,QAAM,iBAAiB,eAAe,MAAM,iBAAiB,IACzD,CAAC,aAAa,YAAY,cAAc,IACxC,CAAC;AACL,QAAM,aAAa,SAAS,mBAAmB,CAAC;AAChD,QAAM,WAAW,CAAC,GAAG,YAAY,GAAG,cAAc;AAClD,SAAO,SAAS,SAAS,IAAI,WAAW;AAC1C;AAEA,SAAS,kBAAkB,MAAiB,SAA+C;AACzF,QAAM,WAAW,QAAQ,iBAAiB,KAAK,OAAO,iBAAiB,CAAC;AACxE,QAAM,OAAO,KAAK;AAQlB,QAAM,UAAU,KAAK,OAAO,SAAS;AACrC,QAAM,aAAa,eAAe,MAAM,KAAK,iBAAiB;AAC9D,QAAM,kBAAkB;AAExB,QAAM,mBAAmB;AAAA,IACvB,KAAK,OAAO;AAAA,IACZ;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,IACL;AAAA,EACF;AACA,QAAM,iBAAkB,SAAS,kBAAkB,CAAC,QAAQ,SAAS;AAMrE,QAAM,cAAuC;AAAA,IAC3C,OAAO,QAAQ,SAAS,KAAK,OAAO;AAAA,IACpC,cAAc;AAAA,MACZ,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ,oBAAoB;AAAA,IAC9B;AAAA,IACA;AAAA,IACA,KAAK,KAAK,OAAO;AAAA,IACjB,gBAAgB,kBAAkB,gBAAgB;AAAA,IAClD,iCAAiC,CAAC;AAAA,IAClC,YAAY,gBAAgB,IAAI;AAAA,IAChC,OAAO,EAAE,MAAM,UAAmB,QAAQ,cAAuB;AAAA,IACjE,YAAY,EAAE,UAAU,wBAAwB,KAAK,YAAY,KAAK,QAAQ,SAAS,IAAI,EAAE;AAAA,IAC7F,OAAO,WAAW,IAAI;AAAA,IACtB,UAAU,SAAS;AAAA,IACnB,QAAQ,SAAS;AAAA,IACjB,UAAU,SAAS;AAAA,IACnB,OAAO,SAAS;AAAA,IAChB,cAAc,SAAS,gBAAgB;AAAA,IACvC,iBAAiB,qBAAqB,UAAU,MAAM,KAAK,iBAAiB;AAAA,IAC5E,yBAAyB,SAAS;AAAA,IAClC,QAAQ,CAAC,SAAiB;AACxB,MAAAF,QAAO,KAAK,sBAAsB,EAAE,MAAM,KAAK,QAAQ,EAAE,CAAC;AAAA,IAC5D;AAAA,EACF;AAIA,MAAI,WAAW,YAAY;AACzB,gBAAY,UAAU,mBAAmB,IAAI;AAAA,EAC/C;AAEA,SAAO;AACT;AAMA,SAAS,sBACP,YACA,SACA,aAAa,OACe;AAC5B,MAAI,WAAY,QAAO;AAEvB,QAAM,cAAc,QAAQ,SAAS,CAAC,GAAG;AAAA,IACvC,CAAC,MAAM,EAAE,WAAW,EAAE,oBAAoB;AAAA,EAC5C;AACA,QAAM,aAAwE,CAAC;AAC/E,aAAW,OAAO,QAAQ,aAAa;AACrC,eAAW,KAAK,IAAI,SAAS,CAAC,GAAG;AAC/B,UAAI,EAAE,WAAW,EAAE,oBAAoB,UAAU;AAC/C,mBAAW,KAAK,EAAE,UAAU,EAAE,UAAU,UAAU,EAAE,UAAU,SAAS,EAAE,QAAQ,CAAC;AAAA,MACpF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,WAAW,WAAW,KAAK,WAAW,WAAW,EAAG,QAAO;AAE/D,QAAM,SAA4B,CAAC,EAAE,MAAM,QAAQ,MAAM,WAAW,CAAC;AACrE,aAAW,QAAQ,YAAY;AAC7B,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,YAAY,KAAK;AAAA,QACjB,MAAM,KAAK,WAAW;AAAA,MACxB;AAAA,IACF,CAAC;AACD,WAAO,KAAK,EAAE,MAAM,QAAQ,MAAM,oBAAoB,KAAK,QAAQ,KAAK,KAAK,QAAQ,KAAK,CAAC;AAAA,EAC7F;AACA,aAAW,QAAQ,YAAY;AAC7B,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,QAAQ,EAAE,MAAM,UAAU,YAAY,KAAK,UAA4B,MAAM,KAAK,QAAQ;AAAA,IAC5F,CAAC;AACD,WAAO,KAAK,EAAE,MAAM,QAAQ,MAAM,gBAAgB,KAAK,QAAQ,KAAK,KAAK,QAAQ,KAAK,CAAC;AAAA,EACzF;AACA,SAAO;AACT;AAIA,eAAe,oBACb,MACA,SACA,iBACqC;AACrC,QAAM,WAAW,KAAK,OAAO,SAAS;AACtC,QAAM,eACJ,OAAO,oBAAoB,WACvB,kBACA,gBACG,OAAO,CAAC,MAAuD,EAAE,SAAS,MAAM,EAChF,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,KAAK,IAAI;AAElB,QAAM,iBACJ,OAAO,oBAAoB,WACvB,CAAC,IACD,gBAAgB;AAAA,IACd,CAAC,MAAwD,EAAE,SAAS;AAAA,EACtE;AAEN,QAAM,aAAa,WACf,GAAG,MAAM,mBAAmB,KAAK,OAAO,MAAM,SAAS,KAAK,OAAO,QAAQ,KAAK,SAAS,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAA8B,YAAY,KACpI;AAEJ,MAAI,UAAU;AACZ,UAAM,SAAS,sBAAsB,YAAY,OAAO;AACxD,QAAI,eAAe,SAAS,KAAK,MAAM,QAAQ,MAAM,GAAG;AACtD,aAAO,KAAK,GAAG,cAAc;AAAA,IAC/B;AACA,WAAO;AAAA,EACT;AACA,MAAI,eAAe,SAAS,GAAG;AAC7B,WAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,WAAW,GAAG,GAAG,cAAc;AAAA,EAC/D;AACA,SAAO;AACT;AAIA,eAAsB,YACpB,MACA,SACA,iBACe;AACf,MAAI,KAAK,UAAU,EAAG;AAEtB,QAAM,OAAO,KAAK;AAClB,QAAM,kBAAkB,SAAS,eAAe,SAAS;AACzD,QAAM,gBAAgB,mBAAoB,SAAS,UAAU,CAAC,KAAK;AACnE,MAAI,eAAe;AACjB,SAAK,kBAAkB;AAAA,EACzB;AAEA,QAAM,UAAU,kBAAkB,MAAM,OAAO;AAC/C,QAAM,SAAS,QAAQ,mBAAmB;AAE1C,MAAI,iBAAiB;AACnB,UAAM,SAAS,MAAM,oBAAoB,MAAM,SAAS,eAAe;AACvE,UAAM,aAAa,MAAM;AAAA,MACvB,QAAQ,OAAO,WAAW,WAAW,SAAS,KAAK,kBAAkB,MAAM;AAAA,MAC3E,SAAS,EAAE,GAAG,SAAS,OAAO;AAAA,IAChC,CAAC;AACD,SAAK,cAAc;AACnB,QAAI;AACF,YAAM,aAAa,YAAY,SAAS,MAAM,OAAO;AAAA,IACvD,UAAE;AACA,WAAK,cAAc;AAAA,IACrB;AAAA,EACF,WAAW,iBAAiB;AAC1B;AAAA,EACF,OAAO;AACL,UAAM,gBAAgB,MAAM;AAAA,MAC1B,KAAK,OAAO;AAAA,MACZ;AAAA,MACA,KAAK,OAAO;AAAA,MACZ;AAAA,IACF;AACA,UAAM,SAAS,sBAAsB,eAAe,OAAO;AAC3D,UAAM,aAAa,MAAM;AAAA,MACvB,QAAQ,KAAK,kBAAkB,MAAM;AAAA,MACrC,SAAS,EAAE,GAAG,SAAS,OAAO;AAAA,IAChC,CAAC;AACD,SAAK,cAAc;AACnB,QAAI;AACF,YAAM,aAAa,YAAY,SAAS,MAAM,OAAO;AAAA,IACvD,UAAE;AACA,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAEA,MAAI,eAAe;AACjB,SAAK,aAAa;AAAA,EACpB;AACF;AAIA,eAAe,gBACb,MACA,SACA,SACA,mBAC2C;AAC3C,MAAI,mBAAmB;AACrB,SAAK,WAAW;AAAA,MACd;AAAA,IACF;AAAA,EACF;AACA,QAAM,cAAc;AAAA,IAClB,MAAM,mBAAmB,KAAK,OAAO,MAAM,SAAS,KAAK,OAAO,QAAQ,KAAK,SAAS;AAAA,IACtF;AAAA,IACA;AAAA,EACF;AACA,SAAO,MAAM;AAAA,IACX,QAAQ,KAAK,kBAAkB,WAAW;AAAA,IAC1C,SAAS,EAAE,GAAG,SAAS,QAAQ,OAAU;AAAA,EAC3C,CAAC;AACH;AAEA,eAAe,mBACb,SACA,MACA,SACe;AACf,UAAQ,kBAAkB;AAC1B,OAAK,WAAW,eAAe,EAAE;AACjC,QAAM,cAAc;AAAA,IAClB,MAAM,mBAAmB,KAAK,OAAO,MAAM,SAAS,KAAK,OAAO,QAAQ,KAAK,SAAS;AAAA,IACtF;AAAA,EACF;AACA,QAAM,aAAa,MAAM;AAAA,IACvB,QAAQ,KAAK,kBAAkB,WAAW;AAAA,IAC1C,SAAS,EAAE,GAAG,SAAS,QAAQ,OAAU;AAAA,EAC3C,CAAC;AACD,SAAO,aAAa,YAAY,SAAS,MAAM,OAAO;AACxD;AAEA,eAAe,kBAAkB,MAAiB,SAAgC;AAChF,QAAM,IAAI,QAAc,CAACG,aAAY;AACnC,UAAM,QAAQ,WAAWA,UAAS,OAAO;AACzC,UAAM,eAAe,YAAY,MAAM;AACrC,UAAI,KAAK,UAAU,GAAG;AACpB,qBAAa,KAAK;AAClB,sBAAc,YAAY;AAC1B,QAAAA,SAAQ;AAAA,MACV;AAAA,IACF,GAAG,GAAI;AACP,eAAW,MAAM,cAAc,YAAY,GAAG,UAAU,GAAG;AAAA,EAC7D,CAAC;AACH;AAEA,SAAS,uBAAuB,OAAgB,SAA+B;AAC7E,MAAI,EAAE,iBAAiB,OAAQ,QAAO;AACtC,MAAI,MAAM,QAAQ,SAAS,uCAAuC,EAAG,QAAO;AAC5E,SAAO,CAAC,CAAC,QAAQ,mBAAmB,MAAM,QAAQ,SAAS,gBAAgB;AAC7E;AAEA,SAAS,iBAAiB,OAAyB;AACjD,MAAI,EAAE,iBAAiB,OAAQ,QAAO;AACtC,SAAOF,mBAAkB,KAAK,MAAM,OAAO,KAAKC,qBAAoB,KAAK,MAAM,OAAO;AACxF;AAEA,SAAS,mBAAmB,OAAyB;AACnD,SAAO,iBAAiB,SAASA,qBAAoB,KAAK,MAAM,OAAO;AACzE;AAEA,eAAe,gBAAgB,MAAiB,SAAiB,SAAgC;AAC/F,QAAM,WAAW,KAAK,MAAM,UAAU,GAAM;AAC5C,OAAK,WAAW;AAAA,IACd,sCAAsC,QAAQ,UAAU,WAAW,IAAI,MAAM,EAAE,gBAAgB,UAAU,CAAC,IAAI,gBAAgB,MAAM;AAAA,EACtI;AACA,OAAK,WAAW,UAAU;AAAA,IACxB,MAAM;AAAA,IACN,SAAS,0BAA0B,QAAQ,MAAM,UAAU,CAAC,IAAI,gBAAgB,MAAM;AAAA,EACxF,CAAC;AACD,OAAK,WAAW,WAAW,mBAAmB;AAC9C,QAAM,KAAK,UAAU,eAAe,mBAAmB;AAEvD,QAAM,kBAAkB,MAAM,OAAO;AAErC,OAAK,WAAW,WAAW,SAAS;AACpC,QAAM,KAAK,UAAU,eAAe,SAAS;AAC/C;AAEA,SAAS,qBAAqB,MAAiB,mBAAiC;AAC9E,OAAK,WAAW,mBAAmB,iBAAiB;AACpD,OAAK,WAAW;AAAA,IACd,2EAA2E,IAAI,KAAK,iBAAiB,EAAE,eAAe,CAAC;AAAA,EACzH;AACF;AAIA,SAAS,iBACP,OACA,SACA,MACA,SACA,gBAC8B;AAC9B,MAAI,uBAAuB,OAAO,OAAO,KAAK,QAAQ,iBAAiB;AACrE,WAAO,mBAAmB,SAAS,MAAM,OAAO;AAAA,EAClD;AACA,MAAI,CAAC,iBAAiB,KAAK,EAAG,OAAM;AACpC,SAAO,EAAE,QAAQ,YAAY,mBAAmB,mBAAmB,KAAK,KAAK,eAAe;AAC9F;AAEA,eAAe,aACb,cACA,SACA,MACA,SACe;AACf,MAAI,oBAAoB;AAExB,WAAS,UAAU,GAAG,WAAW,gBAAgB,QAAQ,WAAW;AAClE,QAAI,KAAK,UAAU,EAAG;AAEtB,UAAM,aACJ,YAAY,IACR,eACA,MAAM,gBAAgB,MAAM,SAAS,SAAS,iBAAiB;AAErE,QAAI;AACF,YAAM,EAAE,WAAW,eAAe,aAAa,mBAAmB,aAAa,IAC7E,MAAM,cAAc,YAAY,SAAS,IAAI;AAC/C,UAAI,eAAe,KAAK,UAAU,EAAG;AAErC,UAAI,mBAAmB;AACrB,6BAAqB,MAAM,iBAAiB;AAC5C;AAAA,MACF;AAGA,UAAI,gBAAgB,QAAQ,iBAAiB;AAC3C,eAAO,mBAAmB,SAAS,MAAM,OAAO;AAAA,MAClD;AAEA,UAAI,CAAC,UAAW;AAChB,0BAAoBA,qBAAoB,KAAK,iBAAiB,EAAE;AAAA,IAClE,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,OAAO,SAAS,MAAM,SAAS,iBAAiB;AACjF,UAAI,mBAAmB,QAAS,QAAO;AACvC,UAAI,QAAQ,WAAW,SAAU;AACjC,0BAAoB,QAAQ;AAAA,IAC9B;AAEA,QAAI,WAAW,gBAAgB,QAAQ;AACrC,WAAK,WAAW;AAAA,QACd,6BAA6B,gBAAgB,MAAM;AAAA,MAErD;AACA;AAAA,IACF;AAEA,UAAM,gBAAgB,MAAM,SAAS,gBAAgB,OAAO,CAAC;AAAA,EAC/D;AACF;;;AW7dO,IAAM,cAAN,MAAkB;AAAA,EACf,oBAAoB;AAAA,EACpB,aAAa,oBAAI,IAA6B;AAAA;AAAA,EAGtD,aAAa,cAA8B;AACzC,SAAK,qBAAqB;AAC1B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,cACE,OAUM;AACN,eAAW,CAAC,OAAO,IAAI,KAAK,OAAO,QAAQ,KAAK,GAAG;AACjD,YAAM,WAAW,KAAK,WAAW,IAAI,KAAK,KAAK;AAAA,QAC7C;AAAA,QACA,aAAa;AAAA,QACb,cAAc;AAAA,QACd,sBAAsB;AAAA,QACtB,0BAA0B;AAAA,QAC1B,SAAS;AAAA,MACX;AACA,eAAS,eAAe,KAAK,eAAe;AAC5C,eAAS,gBAAgB,KAAK,gBAAgB;AAC9C,eAAS,wBAAwB,KAAK,wBAAwB;AAC9D,eAAS,4BAA4B,KAAK,4BAA4B;AACtE,eAAS,WAAW,KAAK,WAAW;AACpC,WAAK,WAAW,IAAI,OAAO,QAAQ;AAAA,IACrC;AAAA,EACF;AAAA,EAEA,IAAI,eAAuB;AACzB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,iBAAoC;AACtC,WAAO,CAAC,GAAG,KAAK,WAAW,OAAO,CAAC;AAAA,EACrC;AACF;;;ACzDA,SAAS,aAAa,UAAU,oBAAoB;AACpD,SAAS,eAAe;AACxB,SAAS,QAAAE,aAAY;AAGd,IAAM,WAAN,MAAe;AAAA,EACZ,mBAAmB,oBAAI,IAAoB;AAAA,EAC3C,iBAAgC;AAAA,EAChC;AAAA,EACA;AAAA,EAER,YAAY,cAAsB,YAAgC;AAChE,SAAK,eAAe;AACpB,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,mBAAmB,cAA4B;AAC7C,SAAK,eAAe;AAAA,EACtB;AAAA,EAEQ,cAAwB;AAC9B,WAAO,CAACA,MAAK,QAAQ,GAAG,WAAW,OAAO,GAAGA,MAAK,KAAK,cAAc,WAAW,OAAO,CAAC;AAAA,EAC1F;AAAA,EAEA,oBAA0B;AACxB,SAAK,iBAAiB,MAAM;AAC5B,SAAK,iBAAiB;AACtB,eAAW,YAAY,KAAK,YAAY,GAAG;AACzC,UAAI;AACF,mBAAW,QAAQ,YAAY,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,KAAK,CAAC,GAAG;AACzE,cAAI;AACF,kBAAM,WAAWA,MAAK,UAAU,IAAI;AACpC,kBAAM,OAAO,SAAS,QAAQ;AAC9B,iBAAK,iBAAiB,IAAI,UAAU,KAAK,OAAO;AAAA,UAClD,QAAQ;AACN;AAAA,UACF;AAAA,QACF;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,qBAA6D;AACnE,QAAI,SAAiD;AACrD,eAAW,YAAY,KAAK,YAAY,GAAG;AACzC,UAAI;AACJ,UAAI;AACF,gBAAQ,YAAY,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,KAAK,CAAC;AAAA,MAC/D,QAAQ;AACN;AAAA,MACF;AAEA,iBAAW,QAAQ,OAAO;AACxB,cAAM,WAAWA,MAAK,UAAU,IAAI;AACpC,YAAI;AACF,gBAAM,OAAO,SAAS,QAAQ;AAC9B,gBAAM,YAAY,KAAK,iBAAiB,IAAI,QAAQ;AACpD,gBAAM,QAAQ,cAAc,UAAa,KAAK,UAAU;AACxD,cAAI,UAAU,CAAC,UAAU,KAAK,UAAU,OAAO,QAAQ;AACrD,qBAAS,EAAE,MAAM,UAAU,OAAO,KAAK,QAAQ;AAAA,UACjD;AAAA,QACF,QAAQ;AACN;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,eAAqB;AACnB,QAAI,KAAK,gBAAgB;AACvB,UAAI;AACF,cAAM,UAAU,aAAa,KAAK,gBAAgB,OAAO,EAAE,KAAK;AAChE,YAAI,SAAS;AACX,eAAK,WAAW,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAClD,gBAAM,WAAW,KAAK,eAAe,MAAM,GAAG,EAAE,IAAI,KAAK;AACzD,eAAK,WAAW,gBAAgB,2BAA2B,QAAQ,qBAAqB;AAAA,QAC1F;AAAA,MACF,QAAQ;AAAA,MAER;AACA;AAAA,IACF;AAEA,UAAM,SAAS,KAAK,mBAAmB;AACvC,QAAI,QAAQ;AACV,WAAK,iBAAiB,OAAO;AAC7B,YAAM,UAAU,aAAa,OAAO,MAAM,OAAO,EAAE,KAAK;AACxD,UAAI,SAAS;AACX,aAAK,WAAW,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAClD,cAAM,WAAW,OAAO,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK;AACjD,aAAK,WAAW;AAAA,UACd,6BAA6B,QAAQ;AAAA,QACvC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACtFA,IAAM,sBAAsB;AAErB,SAAS,aAAa,UAAoB,MAAoB;AACnE,WAAS,KAAK,IAAI;AAClB,MAAI,SAAS,SAAS,qBAAqB;AACzC,aAAS,OAAO,GAAG,SAAS,SAAS,mBAAmB;AAAA,EAC1D;AACF;AAEA,eAAsB,mBACpB,QACA,cACA,YACA,UACe;AACf,MAAI,OAAO,cAAc;AACvB,iBAAa,UAAU,KAAK,OAAO,YAAY,EAAE;AACjD,UAAM,gBAAgB,OAAO,cAAc,aAAa,cAAc,CAAC,QAAQ,SAAS;AACtF,iBAAW,UAAU,EAAE,MAAM,gBAAgB,QAAQ,KAAK,CAAC;AAC3D,OAAC,WAAW,WAAW,QAAQ,SAAS,QAAQ,QAAQ,MAAM,IAAI;AAClE,iBAAW,QAAQ,KAAK,MAAM,IAAI,EAAE,OAAO,OAAO,GAAG;AACnD,qBAAa,UAAU,IAAI,MAAM,KAAK,IAAI,EAAE;AAAA,MAC9C;AAAA,IACF,CAAC;AACD,iBAAa,UAAU,UAAU;AAAA,EACnC;AAEA,MAAI,OAAO,cAAc;AACvB,iBAAa,UAAU,KAAK,OAAO,YAAY,kBAAkB;AACjE,oBAAgB,OAAO,cAAc,aAAa,cAAc,CAAC,QAAQ,SAAS;AAChF,iBAAW,UAAU,EAAE,MAAM,wBAAwB,QAAQ,KAAK,CAAC;AACnE,OAAC,WAAW,WAAW,QAAQ,SAAS,QAAQ,QAAQ,MAAM,IAAI;AAAA,IACpE,CAAC;AAAA,EACH;AACF;AAEA,eAAe,mBACb,cACA,YACA,WACA,UACkB;AAClB,QAAM,aAAa,QAAQ,IAAI;AAC/B,MAAI,CAAC,WAAY,QAAO;AAExB,eAAa,UAAU,uCAAuC,UAAU,KAAK;AAC7E,aAAW,UAAU;AAAA,IACnB,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,MAAM,4BAA4B,UAAU;AAAA;AAAA,EAC9C,CAAC;AACD,MAAI;AACF,UAAM;AAAA,MACJ,oBAAoB,UAAU,oBAAoB,UAAU;AAAA,MAC5D,aAAa;AAAA,MACb,CAAC,QAAQ,SAAS;AAChB,mBAAW,UAAU,EAAE,MAAM,gBAAgB,QAAQ,KAAK,CAAC;AAC3D,mBAAW,QAAQ,KAAK,MAAM,IAAI,EAAE,OAAO,OAAO,GAAG;AACnD,uBAAa,UAAU,IAAI,MAAM,KAAK,IAAI,EAAE;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AACA,iBAAa,UAAU,0BAA0B,UAAU,EAAE;AAC7D,WAAO;AAAA,EACT,SAAS,OAAO;AACd,UAAM,UAAU,sBAAsB,UAAU,KAAK,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAC7G,eAAW,UAAU,EAAE,MAAM,eAAe,QAAQ,CAAC;AACrD,UAAM,UAAU,QAAQ,EAAE,MAAM,eAAe,QAAQ,CAAC;AACxD,eAAW,gBAAgB,qCAAqC,UAAU;AAAA;AAAA,EAAU,OAAO,EAAE;AAC7F,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,aACpB,cACA,YACA,WACA,UACA,qBACA,UACiE;AACjE,QAAM,SAAS,OAAO;AAItB,MAAI,QAAQ,IAAI,iCAAiC,QAAQ;AACvD,UAAMC,UAAS,MAAM,mBAAmB,aAAa,YAAY;AACjE,UAAM,aAAyB;AAAA,MAC7B,MAAM;AAAA,MACN,aAAaA,SAAQ,eAAe;AAAA,IACtC;AACA,eAAW,UAAU,UAAU;AAC/B,UAAM,UAAU,QAAQ,UAAU;AAClC,WAAO,EAAE,IAAI,MAAM,gBAAgBA,QAAO;AAAA,EAC5C;AAEA,QAAM,QAAQ,MAAM,iBAAiB,aAAa,YAAY;AAC9D,MAAI,MAAM,SAAS,KAAK,QAAQ,IAAI,gBAAgB;AAClD,UAAM,aAAa,MAAM,IAAI,CAAC,MAAM,GAAG,CAAC,SAAS,EAAE,KAAK,GAAG;AAC3D;AAAA,MACE,iCAAiC,UAAU,QAAQ,QAAQ,IAAI,cAAc;AAAA,MAC7E,aAAa;AAAA,MACb,MAAM;AAAA,IACR;AAAA,EACF;AAMA,MAAI,CAAE,MAAM,mBAAmB,cAAc,YAAY,WAAW,QAAQ,GAAI;AAC9E,WAAO,EAAE,IAAI,OAAO,gBAAgB,KAAK;AAAA,EAC3C;AAKA,QAAM,SAAS,MAAM,mBAAmB,aAAa,YAAY;AACjE,MAAI,CAAC,QAAQ;AACX,eAAW,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC/C,UAAM,UAAU,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAClD,WAAO,EAAE,IAAI,MAAM,gBAAgB,KAAK;AAAA,EAC1C;AAEA,MAAI;AACF,UAAM,mBAAmB,QAAQ,cAAc,YAAY,QAAQ;AACnE,UAAM,aAAyB;AAAA,MAC7B,MAAM;AAAA,MACN,aAAa,OAAO,eAAe;AAAA,IACrC;AACA,eAAW,UAAU,UAAU;AAC/B,UAAM,UAAU,QAAQ,UAAU;AAClC,WAAO,EAAE,IAAI,MAAM,gBAAgB,OAAO;AAAA,EAC5C,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,eAAW,UAAU,EAAE,MAAM,eAAe,QAAQ,CAAC;AACrD,UAAM,UAAU,QAAQ,EAAE,MAAM,eAAe,QAAQ,CAAC;AACxD,eAAW;AAAA,MACT,6BAA6B,OAAO;AAAA;AAAA,IACtC;AACA,WAAO,EAAE,IAAI,OAAO,gBAAgB,KAAK;AAAA,EAC3C;AACF;AAEO,SAAS,kBACd,gBACA,cACA,YACA,UACM;AACN,MAAI,CAAC,eAAe,aAAc;AAElC,eAAa,UAAU,KAAK,eAAe,YAAY,8BAA8B;AACrF,aAAW,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEtD,kBAAgB,eAAe,cAAc,aAAa,cAAc,CAAC,QAAQ,SAAS;AACxF,eAAW,UAAU,EAAE,MAAM,wBAAwB,QAAQ,KAAK,CAAC;AACnE,KAAC,WAAW,WAAW,QAAQ,SAAS,QAAQ,QAAQ,MAAM,IAAI;AAAA,EACpE,CAAC;AAED,QAAM,aAAyB;AAAA,IAC7B,MAAM;AAAA,IACN,aAAa,eAAe,eAAe;AAAA,EAC7C;AACA,aAAW,UAAU,UAAU;AACjC;;;AClJA,SAAS,eAAe,GAAiC;AACvD,MAAI,EAAE,WAAW,EAAE,oBAAoB,UAAU;AAC/C,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,QAAQ,EAAE,MAAM,UAAU,YAAY,EAAE,UAA4B,MAAM,EAAE,QAAQ;AAAA,MACtF;AAAA,MACA,EAAE,MAAM,QAAQ,MAAM,oBAAoB,EAAE,QAAQ,KAAK,EAAE,QAAQ,KAAK;AAAA,IAC1E;AAAA,EACF;AACA,MAAI,EAAE,WAAW,EAAE,oBAAoB,SAAS;AAC9C,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,MAAM,mBAAmB,EAAE,QAAQ,KAAK,EAAE,QAAQ;AAAA;AAAA,EAAe,EAAE,OAAO;AAAA;AAAA,MAC5E;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,MAAM,mBAAmB,EAAE,QAAQ,KAAK,EAAE,QAAQ,gBAAgB,EAAE,WAAW;AAAA,IACjF;AAAA,EACF;AACF;AAEO,SAAS,oBACd,SACA,OACyB;AACzB,MAAI,CAAC,OAAO,OAAQ,QAAO;AAC3B,QAAM,SAAyB,CAAC,EAAE,MAAM,QAAQ,MAAM,QAAQ,CAAC;AAC/D,aAAW,KAAK,MAAO,QAAO,KAAK,GAAG,eAAe,CAAC,CAAC;AACvD,SAAO;AACT;AAEO,SAAS,sBAAsB,UAA6D;AACjG,MAAI,UAAU,SAAS,UAAW,QAAO,WAAW,SAAS,gBAAgB,GAAG;AAChF,SAAO,UAAU,QAAQ;AAC3B;AAIA,SAAS,gBACP,SACA,MACA,cACe;AACf,MAAI,SAAS,cAAc,CAAC,cAAc;AACxC,WAAO,QAAQ,gBAAgB,QAAQ;AAAA,EACzC;AACA,SAAO,QAAQ,WAAW,QAAQ;AACpC;AAQA,eAAsB,sBACpB,OACA,YACA,UACA,cACA,mBACe;AACf,QAAM,EAAE,YAAY,IAAI;AACxB,QAAM,eAAe,YAAY;AACjC,QAAM,mBAAmB,YAAY;AAErC,MAAI,oBAAoB,cAAc;AACpC,UAAM,WAAW,IAAI,cAAc,gBAAgB;AAAA,EACrD;AAEA,QAAM,UAAU,MAAM;AACtB,QAAM,eAAe,CAAC,CAAC,YAAY;AACnC,QAAM,WAAW,gBAAgB,aAAa,SAAS,YAAY;AAInE,cAAY,kBAAkB;AAC9B,aAAW,eAAe,EAAE;AAE5B,MAAI,SAAU,aAAY,QAAQ;AAClC,cAAY,YAAY;AAExB,aAAW,mBAAmB,EAAE,UAAU,QAAQ,QAAQ,WAAW,WAAW,CAAC;AACjF,aAAW,gBAAgB,OAAO;AAClC,aAAW;AAAA,IACT,sBAAsB,OAAO,UAAU,WAAW,SAAS,QAAQ,KAAK,EAAE;AAAA,EAC5E;AAEA,QAAM,eAAe,MAAM,kBAAkB;AAC7C,MAAI,cAAc;AAChB,iBAAa,mBAAmB,YAAY;AAC5C,iBAAa,kBAAkB,YAAY;AAC3C,iBAAa,YAAY;AACzB,QAAI,SAAU,cAAa,QAAQ;AACnC,UAAM,cAAc;AAAA,EACtB;AAEA,QAAM,SAAS,SAAS;AACxB,QAAM,aAAa,MAAM,WAAW;AACtC;AAyBO,SAAS,eAAe,MAAgC;AAC7D,SAAO;AAAA,IACL,QAAQ,KAAK;AAAA,IACb,YAAY,KAAK;AAAA,IACjB,WAAW,KAAK;AAAA,IAChB,UAAU,KAAK;AAAA,IACf,aAAa,KAAK;AAAA,IAClB,IAAI,YAAuB;AACzB,aAAO,KAAK,sBAAsB;AAAA,IACpC;AAAA,IACA,IAAI,eAAwB;AAC1B,aAAO,KAAK,gBAAgB;AAAA,IAC9B;AAAA,IACA,IAAI,oBAA6B;AAC/B,aAAO,KAAK,qBAAqB;AAAA,IACnC;AAAA,IACA,IAAI,kBAAkB,KAAc;AAClC,WAAK,qBAAqB,GAAG;AAAA,IAC/B;AAAA,IACA,IAAI,qBAA8B;AAChC,aAAO,KAAK,sBAAsB;AAAA,IACpC;AAAA,IACA,IAAI,mBAAmB,KAAc;AACnC,WAAK,sBAAsB,GAAG;AAAA,IAChC;AAAA,IACA,YAAY,KAAK;AAAA,IACjB,aAAa;AAAA,IACb,WAAW,KAAK;AAAA,IAChB,mBAAmB,KAAK;AAAA,IACxB,mBAAmB,MAAM,KAAK,SAAS,kBAAkB;AAAA,IACzD,cAAc,MAAM,KAAK,SAAS,aAAa;AAAA,IAC/C,kBAAkB,KAAK;AAAA,EACzB;AACF;;;AjBvKA,IAAMC,UAAS,oBAAoB,aAAa;AAEhD,IAAM,wBAAwB;AAC9B,IAAM,kBAAkB,KAAK,KAAK;AAE3B,IAAM,cAAN,MAAkB;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAA4B;AAAA,EAC5B,UAAU;AAAA,EACV,cAAc;AAAA,EACd,gBAA+D;AAAA,EAC/D,kBAAoC,CAAC;AAAA,EACrC,WAAqB,CAAC;AAAA,EACtB,iBAAwD;AAAA,EACxD,cAAkC;AAAA,EAClC;AAAA,EACA,cAAc,IAAI,YAAY;AAAA,EAC9B,iBAAiB;AAAA,EACjB,YAA8B;AAAA,EAC9B,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,aAAa,oBAAI,IAAoB;AAAA,EACrC,uBAAuB;AAAA,EACvB,sBAAsB;AAAA,EACtB,eAAe;AAAA,EACf,YAAkD;AAAA,EAClD,oBAA2D;AAAA,EAC3D,iBAAoE;AAAA,EACpE,aAAuD;AAAA,EAE/D,YAAY,QAA2B,WAAiC;AACtE,SAAK,SAAS;AACd,SAAK,aAAa,IAAI,mBAAmB,MAAM;AAC/C,SAAK,YAAY;AACjB,SAAK,WAAW,IAAI,SAAS,OAAO,cAAc,KAAK,UAAU;AAAA,EACnE;AAAA,EAEA,IAAI,QAA2B;AAC7B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAY,qBAAgC;AAC1C,QAAI,KAAK,UAAW,QAAO,KAAK;AAChC,QAAI,KAAK,OAAO,SAAS,MAAM;AAC7B,aAAO,KAAK,OAAO,SAAS,SAAS;AAAA,IACvC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,SAAS,QAA0C;AAC/D,SAAK,SAAS;AACd,SAAK,WAAW,WAAW,MAAM;AACjC,UAAM,KAAK,UAAU,eAAe,MAAM;AAAA,EAC5C;AAAA,EAEQ,iBAAuB;AAC7B,SAAK,iBAAiB,YAAY,MAAM;AACtC,UAAI,CAAC,KAAK,QAAS,MAAK,WAAW,cAAc;AAAA,IACnD,GAAG,qBAAqB;AAAA,EAC1B;AAAA,EAEQ,gBAAsB;AAC5B,QAAI,KAAK,gBAAgB;AACvB,oBAAc,KAAK,cAAc;AACjC,WAAK,iBAAiB;AAAA,IACxB;AAAA,EACF;AAAA,EAEQ,kBAAwB;AAC9B,QAAI,KAAK,WAAW;AAClB,mBAAa,KAAK,SAAS;AAC3B,WAAK,YAAY;AAAA,IACnB;AACA,QAAI,KAAK,mBAAmB;AAC1B,oBAAc,KAAK,iBAAiB;AACpC,WAAK,oBAAoB;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,KAAK,SAAS,YAAY;AAChC,UAAM,KAAK,WAAW,QAAQ;AAE9B,SAAK,WAAW,gBAAgB,MAAM,KAAK,KAAK,CAAC;AACjD,SAAK,WAAW,oBAAoB,MAAM,KAAK,SAAS,CAAC;AACzD,SAAK,WAAW;AAAA,MAAc,CAAC,YAC7B,KAAK,mBAAmB,QAAQ,SAAS,QAAQ,KAAK;AAAA,IACxD;AACA,SAAK,WAAW,aAAa,CAAC,SAAS,KAAK,iBAAiB,KAAK,SAAS,CAAC;AAC5E,SAAK,WAAW,kBAAkB,MAAM,KAAK,sBAAsB,CAAC;AAEpE,UAAM,KAAK,SAAS,WAAW;AAC/B,SAAK,WAAW,UAAU,EAAE,MAAM,aAAa,QAAQ,KAAK,OAAO,OAAO,CAAC;AAC3E,SAAK,eAAe;AAEpB,QAAI,QAAQ,IAAI,eAAe,QAAQ;AACrC,YAAM,SAAS,MAAY;AAAA,QACzB,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,CAAC,MAAM,KAAK,SAAS,CAAsB;AAAA,MAC7C;AACA,UAAI,CAAC,OAAO,IAAI;AACd,aAAK,cAAc;AACnB,cAAM,KAAK,SAAS,OAAO;AAC3B,aAAK,WAAW,WAAW;AAC3B;AAAA,MACF;AACA,WAAK,iBAAiB,OAAO;AAAA,IAC/B;AAEA,SAAK,gBAAgB;AACrB,QAAI,CAAE,MAAM,KAAK,oBAAoB,EAAI;AAEzC,SAAK,uBAAuB;AAC5B,SAAK,uBAAuB;AAC5B,UAAM,KAAK,mBAAmB;AAC9B,UAAM,KAAK,YAAY;AAEvB,SAAK,cAAc;AACnB,UAAM,KAAK,SAAS,UAAU;AAC9B,SAAK,WAAW,WAAW;AAAA,EAC7B;AAAA,EAEQ,kBAAwB;AAC9B,QACE,QAAQ,IAAI,eAAe,UAC3B,QAAQ,IAAI,0BAA0B,YACrC,KAAK,OAAO,SAAS,QAAQ,QAAQ,IAAI,0BAA0B,SACpE;AACA,WAAK,iBAAiB,4BAA4B;AAAA,IACpD;AAAA,EACF;AAAA,EAEA,MAAc,sBAAwC;AACpD,UAAM,KAAK,SAAS,kBAAkB;AACtC,QAAI;AACF,WAAK,cAAc,MAAM,KAAK,WAAW,iBAAiB;AAAA,IAC5D,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,WAAK,WAAW,UAAU,EAAE,MAAM,SAAS,QAAQ,CAAC;AACpD,YAAM,KAAK,UAAU,QAAQ,EAAE,MAAM,SAAS,QAAQ,CAAC;AACvD,WAAK,cAAc;AACnB,YAAM,KAAK,SAAS,OAAO;AAC3B,WAAK,WAAW,WAAW;AAC3B,aAAO;AAAA,IACT;AAEA,SAAK,YAAY,mBAAmBC,YAAW;AAC/C,QAAI,KAAK,YAAY,UAAW,MAAK,YAAY,KAAK,YAAY;AAClE,SAAK,qBAAqB;AAE1B,QAAI,QAAQ,IAAI,eAAe,OAAQ,CAAM,cAAc,KAAK,OAAO,YAAY;AACnF,WAAO;AAAA,EACT;AAAA,EAEQ,yBAA+B;AACrC,QACE,QAAQ,IAAI,eAAe,UAC3B,QAAQ,IAAI,0BAA0B,WACtC,CAAC,KAAK,kBACN,KAAK,aAAa,aAClB;AACA,WAAK,iBAAiB,+CAA+C;AAAA,IACvE;AAAA,EACF;AAAA,EAEQ,iBAAiB,WAAyB;AAChD,QAAI;AACF,YAAM,eAAe,eAAe,KAAK,OAAO,cAAc,KAAK,OAAO,MAAM;AAChF,WAAK,SAAS,EAAE,GAAG,KAAK,QAAQ,cAAc,aAAa;AAC3D,WAAK,SAAS,mBAAmB,YAAY;AAC7C,WAAK,iBAAiB;AACtB,MAAM,aAAa,KAAK,UAAU,GAAG,SAAS,IAAI,YAAY,EAAE;AAAA,IAClE,SAAS,OAAO;AACd,YAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU;AACrD,MAAM;AAAA,QACJ,KAAK;AAAA,QACL,gEAAgE,GAAG;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,yBAA+B;AACrC,QAAI,CAAC,KAAK,kBAAkB,CAAC,KAAK,aAAa,aAAc;AAC7D,QAAI;AACF,YAAM,SAAS,KAAK,YAAY;AAChC,MAAAC,UAAS,oBAAoB,MAAM,oBAAoB,MAAM,IAAI;AAAA,QAC/D,KAAK,KAAK,OAAO;AAAA,QACjB,OAAO;AAAA,MACT,CAAC;AAAA,IACH,QAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEQ,eAAwB;AAC9B,QAAI,CAAC,KAAK,OAAO,UAAU,KAAK,QAAS,QAAO;AAChD,UAAM,YACJ,KAAK,aAAa,eAAe,eAAe,KAAK,OAAO,eAAe,eAAe;AAC5F,QAAI,KAAK,gBAAgB,UAAW,QAAO;AAC3C,UAAM,SAAS,KAAK,aAAa;AACjC,WAAO,WAAW,gBAAgB,CAAC,KAAK,aAAa;AAAA,EACvD;AAAA,EAEA,MAAc,mBAAqC;AACjD,UAAM,QAAQ,MAAM,KAAK,WAAW,iBAAiB,EAAE,MAAM,MAAM,IAAI;AACvE,QAAI,MAAO,MAAK,cAAc;AAC9B,QAAI,CAAC,KAAK,aAAa,EAAG,QAAO;AAEjC,SAAK;AACL,UAAM,MAAM,KAAK,eAAe;AAChC,QAAI,CAAC,IAAK,QAAO;AAEjB,UAAM,YACJ,KAAK,aAAa,eAAe,eAAe,KAAK,OAAO,eAAe,eAAe;AAE5F,QAAI,KAAK,gBAAgB,WAAW;AAClC,WAAK,WAAW;AAAA,QACd,6CAA6C,SAAS;AAAA,MACxD;AACA,WAAK,KAAK;AACV,aAAO;AAAA,IACT;AAEA,UAAM,KAAK,iBAAiB,KAAK,SAAS;AAC1C,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,iBAAiB,KAAkB,WAAkC;AACjF,UAAM,UAAU,KAAK,iBAAiB;AACtC,UAAM,UAAU,UACZ,qFACA,uBAAuB,KAAK,YAAY,IAAI,SAAS;AACzD,UAAM,SAAS,UACX,8QACA,oBAAoB,KAAK,YAAY,OAAO,SAAS;AAEzD,SAAK,WAAW,gBAAgB,OAAO;AACvC,UAAM,KAAK,SAAS,SAAS;AAC7B,UAAM,KAAK,aAAa,KAAK,MAAM;AAAA,EACrC;AAAA,EAEA,MAAc,qBAAoC;AAChD,QAAI,CAAC,KAAK,YAAa;AACvB,UAAM,OAAO,KAAK;AAClB,UAAM,YACJ,SAAS,cACT,SAAS,UACR,SAAS,YAAY,CAAC,CAAC,KAAK,YAAY;AAC3C,QAAI,WAAW;AACb,YAAM,KAAK,SAAS,SAAS;AAC7B,YAAM,KAAK,aAAa,KAAK,WAAW;AACxC,UAAI,CAAC,KAAK,WAAY,KAAK,WAAsB,SAAS;AACxD,cAAM,SAAS,MAAM,KAAK,iBAAiB;AAC3C,YAAI,CAAC,OAAQ,OAAM,KAAK,SAAS,MAAM;AAAA,MACzC;AAAA,IACF,OAAO;AACL,YAAM,KAAK,SAAS,MAAM;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,MAAc,aACZ,SACA,UACe;AACf,SAAK,uBAAuB;AAC5B,QAAI;AACF,YAAM,YAAY,KAAK,YAAY,GAAG,SAAS,QAAQ;AACvD,UAAI,KAAK,oBAAoB;AAC3B,aAAK,uBAAuB;AAC5B,aAAK,qBAAqB;AAAA,MAC5B;AAAA,IACF,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,WAAK,WAAW,UAAU,EAAE,MAAM,SAAS,QAAQ,CAAC;AACpD,YAAM,KAAK,UAAU,QAAQ,EAAE,MAAM,SAAS,QAAQ,CAAC;AACvD,YAAM,KAAK,SAAS,OAAO;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,MAAc,yBAAwC;AACpD,QAAI,CAAC,KAAK,YAAa;AACvB,UAAM;AAAA,MACJ,EAAE,WAAW,KAAK,WAAW,YAAY,KAAK,YAAY,aAAa,KAAK,YAAY;AAAA,MACxF,KAAK;AAAA,MACL,CAAC,MAAM,KAAK,SAAS,CAAsB;AAAA,MAC3C,CAAC,QAAQ,KAAK,aAAa,GAAG;AAAA,MAC9B,YAAY;AACV,YAAI;AACF,iBAAO,MAAM,KAAK,WAAW,iBAAiB;AAAA,QAChD,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AACA,SAAK,cACF,MAAM,KAAK,WAAW,iBAAiB,EAAE,MAAM,MAAM,IAAI,KAAM,KAAK;AACvE,QAAI,CAAC,KAAK,WAAY,KAAK,WAAsB,SAAS;AACxD,YAAM,SAAS,MAAM,KAAK,iBAAiB;AAC3C,UAAI,CAAC,OAAQ,OAAM,KAAK,SAAS,MAAM;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,MAAc,cAA6B;AACzC,QAAI,CAAC,KAAK,YAAa;AACvB,WAAO,CAAC,KAAK,SAAS;AACpB,UAAI,KAAK,sBAAsB;AAC7B,aAAK,uBAAuB;AAC5B,cAAM,KAAK,uBAAuB;AAClC;AAAA,MACF;AAEA,UAAI,KAAK,WAAW,QAAQ;AAC1B,cAAM,MAAM,MAAM,KAAK,mBAAmB;AAC1C,YAAI,CAAC,KAAK;AACR,cAAI,KAAK,eAAe,CAAC,KAAK,SAAS;AACrC,iBAAK,cAAc;AACnB;AAAA,UACF;AACA;AAAA,QACF;AACA,cAAM,KAAK,SAAS,SAAS;AAC7B,aAAK,cAAc;AACnB,cAAM,KAAK,aAAa,KAAK,aAAa,GAAG;AAC7C,YAAI,KAAK,YAAa,MAAK,cAAc;AACzC,YAAI,CAAC,KAAK,WAAY,KAAK,WAAsB,QAAS,OAAM,KAAK,SAAS,MAAM;AAAA,MACtF,WAAW,KAAK,WAAW,SAAS;AAClC,cAAM,KAAK,SAAS,MAAM;AAAA,MAC5B,OAAO;AACL;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,wBAA8B;AACpC,QAAI,CAAC,KAAK,gBAAgB,gBAAgB,KAAK,oBAAqB;AACpE,SAAK,sBAAsB;AAC3B,IAAM,kBAAkB,KAAK,gBAAgB,KAAK,QAAQ,KAAK,YAAY,KAAK,QAAQ;AAAA,EAC1F;AAAA,EAEQ,uBAA6B;AACnC,QAAI,CAAC,KAAK,YAAa;AACvB,UAAM,IAAI,KAAK,YAAY,iBAAiB,KAAK,OAAO,iBAAiB,CAAC;AAC1E,UAAM,QAAQ,KAAK,YAAY,SAAS,KAAK,OAAO;AACpD,UAAM,WAAW,sBAAsB,EAAE,QAAQ;AACjD,IAAAF,QAAO,KAAK,4BAA4B;AAAA,MACtC;AAAA,MACA,MAAM,KAAK,OAAO,QAAQ;AAAA,MAC1B,QAAQ,EAAE,UAAU;AAAA,MACpB;AAAA,MACA,WAAW,EAAE,gBAAgB;AAAA,MAC7B,UAAU,EAAE,YAAY;AAAA,MACxB,GAAI,EAAE,OAAO,SAAS,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAAA,MAC5C,GAAI,EAAE,iBAAiB,SAAS,EAAE,iBAAiB,EAAE,gBAAgB,IAAI,CAAC;AAAA,MAC1E,GAAI,EAAE,0BAA0B,EAAE,eAAe,KAAK,IAAI,CAAC;AAAA,IAC7D,CAAC;AAAA,EACH;AAAA,EAEQ,mBAAmB,SAAiB,OAA8B;AACxE,UAAM,iBAAiB,oBAAoB,SAAS,KAAK;AACzD,UAAM,MAAsB;AAAA,MAC1B,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,SAAS,EAAE,MAAM,QAAiB,SAAS,eAAe;AAAA,MAC1D,oBAAoB;AAAA,IACtB;AACA,QAAI,KAAK,eAAe;AACtB,YAAMG,WAAU,KAAK;AACrB,WAAK,gBAAgB;AACrB,MAAAA,SAAQ,GAAG;AAAA,IACb,OAAO;AACL,WAAK,gBAAgB,KAAK,GAAG;AAE7B,UAAI,KAAK,YAAY,aAAa;AAChC,aAAK,SAAS;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,iBAAiD;AACvD,SAAK,gBAAgB;AACrB,WAAO,IAAI,QAA+B,CAACA,aAAY;AACrD,WAAK,oBAAoB,YAAY,MAAM;AACzC,YAAI,KAAK,WAAW,KAAK,aAAa;AACpC,eAAK,gBAAgB;AACrB,eAAK,gBAAgB;AACrB,UAAAA,SAAQ,IAAI;AAAA,QACd;AAAA,MACF,GAAG,GAAI;AACP,WAAK,YAAY,WAAW,MAAM;AAChC,aAAK,gBAAgB;AACrB,aAAK,gBAAgB;AACrB,QAAAH,QAAO,KAAK,uCAAuC;AAAA,UACjD,aAAa,kBAAkB;AAAA,QACjC,CAAC;AACD,aAAK,WAAW;AAAA,UACd,kBAAkB,kBAAkB,GAAM;AAAA,QAC5C;AACA,QAAAG,SAAQ,IAAI;AAAA,MACd,GAAG,eAAe;AAClB,WAAK,gBAAgB,CAAC,QAA+B;AACnD,aAAK,gBAAgB;AACrB,QAAAA,SAAQ,GAAG;AAAA,MACb;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,qBAAiE;AAC7E,QAAI,KAAK,gBAAgB,SAAS,GAAG;AACnC,YAAM,UAAU,KAAK,gBAAgB,MAAM,GAAG,QAAQ;AACtD,aAAQ,WAA0C;AAAA,IACpD;AACA,UAAM,MAAM,MAAM,KAAK,eAAe;AACtC,WAAQ,KAAK,QAAQ,WAA0C;AAAA,EACjE;AAAA,EAEA,OAAO,kBACL,eAC+C;AAC/C,UAAM,kBAAkB,CAAC,aAAyD;AAAA,MAChF,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,SAAS,EAAE,MAAM,QAAiB,QAAQ;AAAA,MAC1C,oBAAoB;AAAA,IACtB;AAEA,UAAM,gBAAgB,aAAa;AAEnC,QAAI;AACF,aAAO,CAAC,KAAK,WAAW,CAAC,KAAK,aAAa;AACzC,YAAI,KAAK,gBAAgB,SAAS,GAAG;AACnC,gBAAM,OAAO,KAAK,gBAAgB,MAAM;AACxC,cAAI,KAAM,OAAM;AAChB;AAAA,QACF;AACA,aAAK,WAAW,WAAW,mBAAmB;AAC9C,cAAM,KAAK,UAAU,eAAe,mBAAmB;AACvD,cAAM,MAAM,MAAM,KAAK,eAAe;AACtC,YAAI,CAAC,IAAK;AACV,aAAK,WAAW,WAAW,SAAS;AACpC,cAAM,KAAK,UAAU,eAAe,SAAS;AAC7C,cAAM;AAAA,MACR;AAAA,IACF,UAAE;AACA,WAAK,gBAAgB;AAAA,IACvB;AAAA,EACF;AAAA,EAEQ,cAAc;AACpB,UAAM,OAAO,eAAe;AAAA,MAC1B,QAAQ,KAAK;AAAA,MACb,YAAY,KAAK;AAAA,MACjB,WAAW,KAAK;AAAA,MAChB,UAAU,KAAK;AAAA,MACf,aAAa,KAAK;AAAA,MAClB,UAAU,KAAK;AAAA,MACf,YAAY,KAAK;AAAA,MACjB,uBAAuB,MAAM,KAAK;AAAA,MAClC,iBAAiB,MAAM,CAAC,CAAC,KAAK,aAAa;AAAA,MAC3C,sBAAsB,MAAM,KAAK;AAAA,MACjC,sBAAsB,CAAC,QAAQ;AAC7B,aAAK,oBAAoB;AAAA,MAC3B;AAAA,MACA,uBAAuB,MAAM,KAAK;AAAA,MAClC,uBAAuB,CAAC,QAAQ;AAC9B,aAAK,qBAAqB;AAAA,MAC5B;AAAA,MACA,WAAW,MAAM,KAAK,WAAW,KAAK;AAAA,MACtC,mBAAmB,CAAC,WAAW,KAAK,kBAAkB,MAAM;AAAA,MAC5D,kBAAkB,CAAC,YAAY;AAC7B,aAAK,YAAY;AAAA,MACnB;AAAA,IACF,CAAC;AACD,SAAK,aAAa;AAClB,WAAO;AAAA,EACT;AAAA,EAEQ,iBAAiB,cAAgC;AACvD,QAAI,KAAK,OAAO,SAAS,KAAM;AAC/B,QAAI,aAAc,MAAK,YAAY;AACnC,UAAM,gBAAgB,KAAK;AAC3B,SAAK,WAAW,gBAAgB,aAAa;AAC7C,SAAK,WAAW;AAAA,MACd,sBAAsB,aAAa,KAAK,kBAAkB,aAAa,6CAAwC,EAAE;AAAA,IACnH;AAGA,QAAI,kBAAkB,cAAc,KAAK,aAAa,WAAW,QAAQ;AACvE,WAAK,WAAW,aAAa,YAAY;AACzC,WAAK,YAAY,SAAS;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,WAAiB;AACf,SAAK,cAAc;AAGnB,UAAM,OAAO,KAAK;AAClB,QAAI,MAAM,aAAa;AACrB,YAAM,IAAI,KAAK;AACf,UAAI,OAAO,EAAE,cAAc,YAAY;AACrC,aAAK,EAAE,UAAU;AAAA,MACnB;AACA,WAAK,cAAc;AAAA,IACrB;AAGA,QAAI,KAAK,eAAe;AACtB,WAAK,cAAc,IAAI;AACvB,WAAK,gBAAgB;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,OAAa;AACX,SAAK,UAAU;AACf,SAAK,gBAAgB;AACrB,QAAI,KAAK,eAAe;AACtB,WAAK,cAAc,IAAI;AACvB,WAAK,gBAAgB;AAAA,IACvB;AAAA,EACF;AACF;;;AkBziBA,SAAS,YAA+B;AACxC,SAAS,YAAAC,iBAAgB;AACzB,YAAY,UAAU;AACtB,SAAS,qBAAqB;;;ACH9B,SAAS,SAAAC,cAAuC;AAShD,IAAMC,UAAS,oBAAoB,aAAa;AAEhD,IAAM,iBAAiB;AAEvB,SAASC,mBAAkB,YAAoB,UAAuC;AACpF,QAAM,QAAkB,CAAC;AAEzB,MAAI,UAAU,mBAAmB;AAC/B,UAAM,KAAK,SAAS,iBAAiB;AAAA,EACvC;AAEA,QAAM,cAAc,UAAU,eAAe;AAC7C,QAAM,KAAK;AAAA,+CAAkD,WAAW,GAAG;AAC3E,MAAI,UAAU,oBAAoB;AAChC,UAAM,KAAK,wBAAwB,SAAS,kBAAkB,EAAE;AAAA,EAClE;AAEA,QAAM;AAAA,IACJ,2FAA2F,UAAU;AAAA,IACrG;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,YAAY,SAA8B,aAA2C;AAC5F,QAAM,QAAkB,CAAC;AAEzB,MAAI,YAAY,SAAS,GAAG;AAC1B,UAAM,KAAK,8BAA8B;AACzC,eAAW,OAAO,YAAY,MAAM,GAAG,GAAG;AACxC,YAAM,SAAS,IAAI,SAAS,cAAc,UAAW,IAAI,YAAY;AACrE,YAAM,KAAK,IAAI,MAAM,MAAM,IAAI,OAAO,EAAE;AAAA,IAC1C;AACA,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,QAAM,KAAK;AAAA,EAAkC,QAAQ,OAAO,EAAE;AAC9D,SAAO,MAAM,KAAK,IAAI;AACxB;AAQA,SAAS,oBACP,OACA,eACA,eACM;AACN,MAAI,MAAM,SAAS,UAAU,MAAM,MAAM;AACvC,kBAAc,KAAK,MAAM,IAAI;AAAA,EAC/B,WAAW,MAAM,SAAS,cAAc,MAAM,MAAM;AAClD,UAAM,WAAW,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ,KAAK,UAAU,MAAM,KAAK;AAC3F,kBAAc,KAAK;AAAA,MACjB,MAAM,MAAM;AAAA,MACZ,OAAO,SAAS,MAAM,GAAG,GAAM;AAAA,MAC/B,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,CAAC;AACD,IAAAD,QAAO,MAAM,YAAY,EAAE,MAAM,MAAM,KAAK,CAAC;AAAA,EAC/C;AACF;AAEA,eAAe,aAAa,YAGzB;AACD,MAAI,WAAgC;AACpC,MAAI;AACF,eAAW,MAAM,WAAW,kBAAkB;AAAA,EAChD,QAAQ;AACN,IAAAA,QAAO,KAAK,+CAA+C;AAAA,EAC7D;AAEA,MAAI,cAAoC,CAAC;AACzC,MAAI;AACF,kBAAc,MAAM,WAAW,iBAAiB,EAAE;AAAA,EACpD,QAAQ;AACN,IAAAA,QAAO,KAAK,qDAAqD;AAAA,EACnE;AAEA,SAAO,EAAE,UAAU,YAAY;AACjC;AAEA,SAAS,sBACP,UACA,YACyB;AACzB,QAAM,QAAQ,UAAU,SAAS;AACjC,QAAM,WAAW,UAAU,iBAAiB,CAAC;AAC7C,SAAO;AAAA,IACL;AAAA,IACA,cAAc;AAAA,MACZ,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQC,mBAAkB,YAAY,QAAQ;AAAA,IAChD;AAAA,IACA,KAAK;AAAA,IACL,gBAAgB;AAAA,IAChB,iCAAiC;AAAA,IACjC,OAAO,EAAE,MAAM,UAAmB,QAAQ,cAAuB;AAAA,IACjE,UAAW,SAAS,YAAmC;AAAA,IACvD,cAAe,SAAS,gBAAuC;AAAA,IAC/D,QAAQ,SAAS;AAAA,IACjB,UAAU,SAAS;AAAA,EAKrB;AACF;AAEA,SAAS,mBACP,OACA,YACA,eACA,eACA,UACS;AACT,MAAI,MAAM,SAAS,aAAa;AAC9B,QAAI,CAAC,SAAS,OAAO;AACnB,iBAAW,MAAM,WAAW,UAAU,EAAE,MAAM,qBAAqB,CAAC,GAAG,GAAG;AAC1E,eAAS,QAAQ;AAAA,IACnB;AAEA,UAAM,iBAAiB;AACvB,eAAW,SAAS,eAAe,QAAQ,SAAS;AAClD,0BAAoB,OAAO,eAAe,aAAa;AAAA,IACzD;AAEA,QAAI,cAAc,SAAS,GAAG;AAC5B,iBAAW,UAAU,EAAE,MAAM,kBAAkB,QAAQ,CAAC,GAAG,aAAa,EAAE,CAAC;AAC3E,oBAAc,SAAS;AAAA,IACzB;AACA,WAAO;AAAA,EACT;AACA,MAAI,MAAM,SAAS,UAAU;AAC3B,QAAI,SAAS,OAAO;AAClB,iBAAW,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAClD,eAAS,QAAQ;AAAA,IACnB;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,eAAe,aACb,SACA,YACA,YACe;AACf,QAAM,EAAE,UAAU,YAAY,IAAI,MAAM,aAAa,UAAU;AAC/D,QAAM,UAAU,sBAAsB,UAAU,UAAU;AAC1D,QAAM,SAAS,YAAY,SAAS,WAAW;AAE/C,QAAM,SAASC,OAAM,EAAE,QAAQ,QAAQ,CAAC;AAExC,QAAM,gBAA0B,CAAC;AACjC,QAAM,gBAAmC,CAAC;AAC1C,QAAM,WAAW,EAAE,OAAO,MAAM;AAEhC,mBAAiB,SAAS,QAAQ;AAChC,UAAM,OAAO,mBAAmB,OAAO,YAAY,eAAe,eAAe,QAAQ;AACzF,QAAI,KAAM;AAAA,EACZ;AAEA,MAAI,SAAS,OAAO;AAClB,eAAW,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAAA,EACpD;AAEA,QAAM,eAAe,cAAc,KAAK,MAAM,EAAE,KAAK;AACrD,MAAI,cAAc;AAChB,UAAM,WAAW,gBAAgB,YAAY;AAAA,EAC/C;AACF;AAEA,eAAsB,yBACpB,SACA,YACA,YACe;AACf,aAAW,gBAAgB,MAAM;AAEjC,MAAI;AACF,UAAM,aAAa,SAAS,YAAY,UAAU;AAAA,EACpD,SAAS,OAAO;AACd,IAAAF,QAAO,MAAM,4BAA4B,UAAU,KAAK,CAAC;AACzD,QAAI;AACF,YAAM,WAAW;AAAA,QACf;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF,UAAE;AACA,eAAW,gBAAgB,MAAM;AAAA,EACnC;AACF;;;AD/MA,IAAMG,UAAS,oBAAoB,eAAe;AAElD,IAAM,aAAa,cAAc,YAAY,GAAG;AAChD,IAAM,YAAiB,aAAQ,UAAU;AAgBzC,IAAMC,yBAAwB;AAC9B,IAAM,iBAAiB,KAAK,IAAI,GAAG,SAAS,QAAQ,IAAI,2BAA2B,MAAM,EAAE,KAAK,EAAE;AAClG,IAAM,kBAAkB;AACxB,IAAM,4BAA4B;AAElC,SAAS,aACP,YACA,YAC4C;AAC5C,QAAM,EAAE,QAAQ,QAAQ,WAAW,YAAY,IAAI;AACnD,QAAM,UAAU,OAAO,MAAM,GAAG,CAAC;AACjC,QAAM,iBAAiB,gBAAgB;AAEvC,MAAI;AACJ,MAAI,gBAAgB;AAClB,cAAU,eAAe,YAAY,QAAQ,SAAS;AAAA,EACxD,OAAO;AACL,cAAU;AAAA,EACZ;AAEA,MAAI,UAAU,WAAW,WAAW;AAClC,QAAI;AACF,MAAAC,UAAS,gBAAgB,MAAM,IAAI,EAAE,KAAK,SAAS,OAAO,SAAS,CAAC;AAAA,IACtE,QAAQ;AACN,UAAI;AACF,QAAAA,UAAS,mBAAmB,MAAM,IAAI,EAAE,KAAK,SAAS,OAAO,SAAS,CAAC;AAAA,MACzE,QAAQ;AACN,QAAAF,QAAO,KAAK,6BAA6B,EAAE,QAAQ,SAAS,OAAO,CAAC;AAAA,MACtE;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,SAAS,cAAc,eAAe;AACjD;AAEA,SAAS,gBAAgB,YAA4B,SAA+B;AAClF,QAAM,EAAE,WAAW,QAAQ,QAAQ,MAAM,QAAQ,WAAW,IAAI;AAChE,QAAM,UAAe,aAAQ,WAAW,QAAQ;AAEhD,QAAM,WAAW,EAAE,GAAG,QAAQ,IAAI;AAClC,SAAO,SAAS;AAChB,SAAO,SAAS;AAEhB,QAAM,QAAQ,KAAK,SAAS,CAAC,GAAG;AAAA,IAC9B,KAAK;AAAA,MACH,GAAG;AAAA,MACH,kBAAkB;AAAA,MAClB,qBAAqB;AAAA,MACrB,kBAAkB;AAAA,MAClB,eAAe;AAAA,MACf,oBAAoB;AAAA,MACpB,uBAAuB;AAAA,MACvB,qBAAqB,SAAS,SAAS;AAAA,MACvC,kBAAkB,SAAS,SAAS;AAAA,MACpC,sBAAsB,eAAe,OAAO,SAAS;AAAA,MACrD,8BAA8B;AAAA,IAChC;AAAA,IACA,KAAK;AAAA,IACL,OAAO,CAAC,QAAQ,QAAQ,QAAQ,KAAK;AAAA,EACvC,CAAC;AAED,QAAM,OAAO,GAAG,SAAS,MAAM;AAAA,EAAC,CAAC;AACjC,QAAM,QAAQ,GAAG,SAAS,MAAM;AAAA,EAAC,CAAC;AAClC,QAAM,QAAQ,GAAG,SAAS,MAAM;AAAA,EAAC,CAAC;AAElC,QAAM,UAAU,OAAO,MAAM,GAAG,CAAC;AACjC,QAAM,QAAQ,GAAG,QAAQ,CAAC,SAAiB;AACzC,UAAM,QAAQ,KAAK,SAAS,EAAE,QAAQ,EAAE,MAAM,IAAI;AAClD,eAAW,QAAQ,OAAO;AACxB,MAAAA,QAAO,KAAK,MAAM,EAAE,QAAQ,QAAQ,CAAC;AAAA,IACvC;AAAA,EACF,CAAC;AACD,QAAM,QAAQ,GAAG,QAAQ,CAAC,SAAiB;AACzC,UAAM,QAAQ,KAAK,SAAS,EAAE,QAAQ,EAAE,MAAM,IAAI;AAClD,eAAW,QAAQ,OAAO;AACxB,MAAAA,QAAO,MAAM,MAAM,EAAE,QAAQ,QAAQ,CAAC;AAAA,IACxC;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEO,IAAM,gBAAN,MAAoB;AAAA,EACjB;AAAA,EACA;AAAA,EACA,eAAe,oBAAI,IAAyB;AAAA,EAC5C,iBAAwD;AAAA,EACxD,WAAW;AAAA,EACX,mBAAwC;AAAA;AAAA,EAGxC,oBAAyC;AAAA,EACzC,sBAAsB;AAAA,EACtB,gBAAgB;AAAA,EAExB,YAAY,QAA6B;AACvC,SAAK,aAAa,OAAO;AACzB,SAAK,aAAa,IAAI,kBAAkB;AAAA,MACtC,QAAQ,OAAO;AAAA,MACf,cAAc,OAAO;AAAA,MACrB,WAAW,OAAO;AAAA,IACpB,CAAC;AAAA,EACH;AAAA,EAEQ,0BAAgC;AACtC,UAAM,kBAAkB,QAAQ,IAAI;AACpC,QAAI,CAAC,gBAAiB;AAEtB,QAAI;AACF,MAAAE,UAAS,oBAAoB,eAAe,IAAI,EAAE,KAAK,KAAK,YAAY,OAAO,OAAO,CAAC;AACvF,MAAAA,UAAS,gBAAgB,eAAe,IAAI,EAAE,KAAK,KAAK,YAAY,OAAO,OAAO,CAAC;AACnF,MAAAF,QAAO,KAAK,gCAAgC,EAAE,gBAAgB,CAAC;AAAA,IACjE,SAAS,KAAK;AACZ,MAAAA,QAAO,KAAK,qEAAqE;AAAA,QAC/E;AAAA,QACA,GAAG,UAAU,GAAG;AAAA,MAClB,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAc,sBAAqC;AACjD,UAAM,MAAM,QAAQ,IAAI;AACxB,QAAI,CAAC,IAAK;AAEV,IAAAA,QAAO,KAAK,yBAAyB,EAAE,SAAS,IAAI,CAAC;AACrD,QAAI;AACF,YAAM,gBAAgB,KAAK,KAAK,YAAY,CAAC,QAAQ,SAAS;AAC5D,aAAK,WAAW,UAAU,EAAE,MAAM,gBAAgB,QAAQ,KAAK,CAAC;AAChE,SAAC,WAAW,WAAW,QAAQ,SAAS,QAAQ,QAAQ,MAAM,IAAI;AAAA,MACpE,CAAC;AACD,MAAAA,QAAO,KAAK,yBAAyB;AAAA,IACvC,SAAS,OAAO;AACd,MAAAA,QAAO,MAAM,wBAAwB,UAAU,KAAK,CAAC;AACrD,WAAK,WAAW,UAAU;AAAA,QACxB,MAAM;AAAA,QACN,SAAS,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MACpD,CAAC;AACD,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEQ,sBAA4B;AAClC,UAAM,MAAM,QAAQ,IAAI;AACxB,QAAI,CAAC,IAAK;AAEV,IAAAA,QAAO,KAAK,yBAAyB,EAAE,SAAS,IAAI,CAAC;AACrD,UAAM,QAAQ,gBAAgB,KAAK,KAAK,YAAY,CAAC,QAAQ,SAAS;AACpE,WAAK,WAAW,UAAU,EAAE,MAAM,wBAAwB,QAAQ,KAAK,CAAC;AACxE,OAAC,WAAW,WAAW,QAAQ,SAAS,QAAQ,QAAQ,MAAM,IAAI;AAAA,IACpE,CAAC;AAED,SAAK,oBAAoB;AACzB,SAAK,sBAAsB;AAE3B,UAAM,GAAG,QAAQ,CAAC,MAAM,WAAW;AACjC,WAAK,sBAAsB;AAC3B,WAAK,oBAAoB;AACzB,MAAAA,QAAO,KAAK,wBAAwB,EAAE,MAAM,OAAO,CAAC;AACpD,WAAK,WAAW,UAAU;AAAA,QACxB,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,SAAS,kCAAkC,IAAI;AAAA,MACjD,CAAC;AAAA,IACH,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,QAAQ;AACzB,WAAK,sBAAsB;AAC3B,WAAK,oBAAoB;AACzB,MAAAA,QAAO,MAAM,uBAAuB,UAAU,GAAG,CAAC;AAAA,IACpD,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,mBAAkC;AACtC,UAAM,QAAQ,KAAK;AACnB,QAAI,CAAC,SAAS,CAAC,KAAK,oBAAqB;AAEzC,IAAAA,QAAO,KAAK,uBAAuB;AAGnC,QAAI;AACF,UAAI,MAAM,IAAK,SAAQ,KAAK,CAAC,MAAM,KAAK,SAAS;AAAA,IACnD,QAAQ;AACN,YAAM,KAAK,SAAS;AAAA,IACtB;AAGA,UAAM,IAAI,QAAc,CAACG,aAAY;AACnC,YAAM,QAAQ,WAAW,MAAM;AAC7B,YAAI,KAAK,uBAAuB,MAAM,KAAK;AACzC,cAAI;AACF,oBAAQ,KAAK,CAAC,MAAM,KAAK,SAAS;AAAA,UACpC,QAAQ;AACN,kBAAM,KAAK,SAAS;AAAA,UACtB;AAAA,QACF;AACA,QAAAA,SAAQ;AAAA,MACV,GAAG,yBAAyB;AAE5B,YAAM,GAAG,QAAQ,MAAM;AACrB,qBAAa,KAAK;AAClB,QAAAA,SAAQ;AAAA,MACV,CAAC;AAAA,IACH,CAAC;AAED,SAAK,oBAAoB;AACzB,SAAK,sBAAsB;AAAA,EAC7B;AAAA,EAEA,MAAM,sBAAqC;AACzC,UAAM,KAAK,iBAAiB;AAC5B,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEA,uBAAiD;AAC/C,QAAI,gBAAgB;AACpB,QAAI;AACF,sBAAgBD,UAAS,6BAA6B;AAAA,QACpD,KAAK,KAAK;AAAA,QACV,OAAO,CAAC,UAAU,QAAQ,QAAQ;AAAA,MACpC,CAAC,EACE,SAAS,EACT,KAAK;AAAA,IACV,QAAQ;AAAA,IAER;AAEA,WAAO;AAAA,MACL,eAAe,KAAK;AAAA,MACpB,qBAAqB,KAAK;AAAA,MAC1B;AAAA,MACA,aAAa,OAAO,QAAQ,IAAI,qBAAqB,KAAK;AAAA,IAC5D;AAAA,EACF;AAAA,EAEA,MAAM,QAAuB;AAC3B,SAAK,wBAAwB;AAC7B,UAAM,KAAK,WAAW,QAAQ;AAG9B,QAAI;AACF,YAAM,KAAK,oBAAoB;AAC/B,WAAK,oBAAoB;AACzB,WAAK,gBAAgB;AAErB,WAAK,WAAW,UAAU;AAAA,QACxB,MAAM;AAAA,QACN,aAAa,OAAO,QAAQ,IAAI,qBAAqB,KAAK;AAAA,QAC1D,qBAAqB,KAAK;AAAA,MAC5B,CAAC;AAAA,IACH,SAAS,OAAO;AACd,MAAAF,QAAO,MAAM,4BAA4B,UAAU,KAAK,CAAC;AAEzD,WAAK,gBAAgB;AAAA,IACvB;AAEA,SAAK,WAAW,iBAAiB,CAAC,eAAe;AAC/C,WAAK,iBAAiB,UAAU;AAAA,IAClC,CAAC;AAED,SAAK,WAAW,WAAW,CAAC,SAAS;AACnC,WAAK,eAAe,KAAK,MAAM;AAAA,IACjC,CAAC;AAED,SAAK,WAAW,WAAW,MAAM;AAC/B,MAAAA,QAAO,KAAK,sCAAsC;AAClD,WAAK,KAAK,KAAK;AAAA,IACjB,CAAC;AAED,SAAK,WAAW,cAAc,CAAC,QAAQ;AACrC,MAAAA,QAAO,MAAM,+BAA+B;AAC5C,WAAK,yBAAyB,KAAK,KAAK,YAAY,KAAK,UAAU;AAAA,IACrE,CAAC;AAED,SAAK,iBAAiB,YAAY,MAAM;AACtC,WAAK,WAAW,cAAc;AAAA,IAChC,GAAGC,sBAAqB;AAExB,IAAAD,QAAO,KAAK,yCAAyC;AAErD,UAAM,IAAI,QAAc,CAACG,aAAY;AACnC,WAAK,mBAAmBA;AACxB,cAAQ,GAAG,WAAW,MAAM,KAAK,KAAK,KAAK,CAAC;AAC5C,cAAQ,GAAG,UAAU,MAAM,KAAK,KAAK,KAAK,CAAC;AAAA,IAC7C,CAAC;AAAA,EACH;AAAA,EAEQ,iBAAiB,YAAkC;AACzD,UAAM,EAAE,QAAQ,KAAK,IAAI;AACzB,UAAM,UAAU,OAAO,MAAM,GAAG,CAAC;AAEjC,QAAI,KAAK,aAAa,IAAI,MAAM,GAAG;AACjC,MAAAH,QAAO,KAAK,kCAAkC,EAAE,QAAQ,QAAQ,CAAC;AACjE;AAAA,IACF;AAEA,QAAI,KAAK,aAAa,QAAQ,gBAAgB;AAC5C,MAAAA,QAAO,KAAK,iDAAiD;AAAA,QAC3D,eAAe;AAAA,QACf,QAAQ;AAAA,MACV,CAAC;AACD,WAAK,WAAW,gBAAgB,QAAQ,wBAAwB;AAChE;AAAA,IACF;AAEA,QAAI;AACF,UAAI;AACF,QAAAE,UAAS,oBAAoB,EAAE,KAAK,KAAK,YAAY,OAAO,SAAS,CAAC;AAAA,MACxE,QAAQ;AACN,QAAAF,QAAO,KAAK,oBAAoB,EAAE,QAAQ,QAAQ,CAAC;AAAA,MACrD;AAEA,YAAM,EAAE,SAAS,aAAa,IAAI,aAAa,KAAK,YAAY,UAAU;AAC1E,YAAM,QAAQ,gBAAgB,YAAY,OAAO;AAEjD,WAAK,aAAa,IAAI,QAAQ;AAAA,QAC5B,SAAS;AAAA,QACT,cAAc;AAAA,QACd;AAAA,QACA;AAAA,MACF,CAAC;AACD,WAAK,WAAW,gBAAgB,MAAM;AAEtC,MAAAA,QAAO,KAAK,gBAAgB,EAAE,QAAQ,SAAS,MAAM,QAAQ,CAAC;AAE9D,YAAM,GAAG,QAAQ,CAAC,SAAS;AACzB,aAAK,aAAa,OAAO,MAAM;AAC/B,cAAM,SAAS,SAAS,IAAI,cAAc,oBAAoB,IAAI;AAClE,aAAK,WAAW,gBAAgB,QAAQ,MAAM;AAC9C,QAAAA,QAAO,KAAK,eAAe,EAAE,QAAQ,SAAS,OAAO,CAAC;AAEtD,YAAI,SAAS,KAAK,cAAc;AAC9B,cAAI;AACF,2BAAe,KAAK,YAAY,MAAM;AAAA,UACxC,QAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,MAAAA,QAAO,MAAM,wBAAwB;AAAA,QACnC,QAAQ;AAAA,QACR,GAAG,UAAU,KAAK;AAAA,MACpB,CAAC;AACD,WAAK,WAAW;AAAA,QACd;AAAA,QACA,iBAAiB,iBAAiB,QAAQ,MAAM,UAAU,SAAS;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,eAAe,QAAsB;AAC3C,UAAM,QAAQ,KAAK,aAAa,IAAI,MAAM;AAC1C,QAAI,CAAC,MAAO;AAEZ,UAAM,UAAU,OAAO,MAAM,GAAG,CAAC;AACjC,IAAAA,QAAO,KAAK,iBAAiB,EAAE,QAAQ,QAAQ,CAAC;AAEhD,UAAM,QAAQ,KAAK,SAAS;AAE5B,UAAM,QAAQ,WAAW,MAAM;AAC7B,UAAI,KAAK,aAAa,IAAI,MAAM,GAAG;AACjC,cAAM,QAAQ,KAAK,SAAS;AAAA,MAC9B;AAAA,IACF,GAAG,eAAe;AAElB,UAAM,QAAQ,GAAG,QAAQ,MAAM;AAC7B,mBAAa,KAAK;AAClB,UAAI,MAAM,cAAc;AACtB,YAAI;AACF,yBAAe,KAAK,YAAY,MAAM;AAAA,QACxC,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,OAAsB;AAC1B,QAAI,KAAK,SAAU;AACnB,SAAK,WAAW;AAEhB,IAAAA,QAAO,KAAK,eAAe;AAG3B,UAAM,KAAK,iBAAiB;AAE5B,QAAI,KAAK,gBAAgB;AACvB,oBAAc,KAAK,cAAc;AACjC,WAAK,iBAAiB;AAAA,IACxB;AAEA,UAAM,eAAe,CAAC,GAAG,KAAK,aAAa,KAAK,CAAC,EAAE;AAAA,MACjD,CAAC,WACC,IAAI,QAAc,CAACG,aAAY;AAC7B,cAAM,QAAQ,KAAK,aAAa,IAAI,MAAM;AAC1C,YAAI,CAAC,OAAO;AACV,UAAAA,SAAQ;AACR;AAAA,QACF;AACA,cAAM,QAAQ,GAAG,QAAQ,MAAM;AAC7B,UAAAA,SAAQ;AAAA,QACV,CAAC;AACD,aAAK,eAAe,MAAM;AAAA,MAC5B,CAAC;AAAA,IACL;AAEA,UAAM,QAAQ,KAAK;AAAA,MACjB,QAAQ,IAAI,YAAY;AAAA,MACxB,IAAI,QAAc,CAACA,aAAY;AAC7B,mBAAWA,UAAS,GAAM;AAAA,MAC5B,CAAC;AAAA,IACH,CAAC;AAED,SAAK,WAAW,WAAW;AAC3B,IAAAH,QAAO,KAAK,mBAAmB;AAE/B,QAAI,KAAK,kBAAkB;AACzB,WAAK,iBAAiB;AACtB,WAAK,mBAAmB;AAAA,IAC1B;AAAA,EACF;AACF;;;AEncA,IAAM,yBAAyB,KAAK,OAAO;AAE3C,IAAM,iBAAiB,KAAK,KAAK;AAU1B,IAAM,YAAN,MAAgB;AAAA,EACb,QAAQ,oBAAI,IAAwB;AAAA,EACpC,cAAc;AAAA,EACL;AAAA,EACA;AAAA,EAEjB,YAAY,eAAe,wBAAwB,QAAQ,gBAAgB;AACzE,SAAK,eAAe;AACpB,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,IAAI,QAAmC;AACrC,UAAM,QAAQ,KAAK,MAAM,IAAI,MAAM;AACnC,QAAI,CAAC,MAAO,QAAO;AAEnB,QAAI,KAAK,IAAI,IAAI,MAAM,YAAY,KAAK,OAAO;AAC7C,WAAK,OAAO,MAAM;AAClB,aAAO;AAAA,IACT;AAEA,SAAK,MAAM,OAAO,MAAM;AACxB,SAAK,MAAM,IAAI,QAAQ,KAAK;AAC5B,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,QAAgB,SAAiB,UAAkB,UAAwB;AAC7E,QAAI,KAAK,MAAM,IAAI,MAAM,GAAG;AAC1B,WAAK,OAAO,MAAM;AAAA,IACpB;AAEA,UAAM,OAAO,QAAQ;AAErB,QAAI,OAAO,KAAK,aAAc;AAE9B,WAAO,KAAK,cAAc,OAAO,KAAK,gBAAgB,KAAK,MAAM,OAAO,GAAG;AACzE,YAAM,YAAY,KAAK,MAAM,KAAK,EAAE,KAAK,EAAE;AAC3C,UAAI,cAAc,QAAW;AAC3B,aAAK,OAAO,SAAS;AAAA,MACvB;AAAA,IACF;AAEA,SAAK,MAAM,IAAI,QAAQ;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,KAAK,IAAI;AAAA,MACpB;AAAA,IACF,CAAC;AACD,SAAK,eAAe;AAAA,EACtB;AAAA,EAEQ,OAAO,QAAsB;AACnC,UAAM,QAAQ,KAAK,MAAM,IAAI,MAAM;AACnC,QAAI,OAAO;AACT,WAAK,eAAe,MAAM;AAC1B,WAAK,MAAM,OAAO,MAAM;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,QAAc;AACZ,SAAK,MAAM,MAAM;AACjB,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,IAAI,QAAsE;AACxE,WAAO;AAAA,MACL,SAAS,KAAK,MAAM;AAAA,MACpB,WAAW,KAAK;AAAA,MAChB,cAAc,KAAK;AAAA,IACrB;AAAA,EACF;AACF;","names":["resolve","resolve","resolve","io","resolve","execSync","join","execSync","randomUUID","execSync","result","readFile","findLastAgentMessageIndex","tool","z","tool","z","tool","z","tool","z","resolve","logger","API_ERROR_PATTERN","IMAGE_ERROR_PATTERN","resolve","join","config","logger","randomUUID","execSync","resolve","execSync","query","logger","buildSystemPrompt","query","logger","HEARTBEAT_INTERVAL_MS","execSync","resolve"]}