@spencer-kit/coder-studio 0.3.9 → 0.3.10

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,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../server/src/web-ui-routing.ts", "../../../server/src/auth/login-protection.ts", "../../../server/src/auth/plugin.ts", "../../../server/src/auth/index.ts", "../../../server/src/bus/event-bus.ts", "../../../server/src/config.ts", "../../../core/src/runtime.ts", "../../../providers/src/claude/config-schema.ts", "../../../providers/src/claude/idle-heuristics.ts", "../../../providers/src/claude/supervisor-eval.ts", "../../../providers/src/claude/definition.ts", "../../../providers/src/codex/config-schema.ts", "../../../providers/src/codex/stdout-heuristics.ts", "../../../providers/src/codex/supervisor-eval.ts", "../../../providers/src/codex/definition.ts", "../../../providers/src/registry.ts", "../../../providers/src/index.ts", "../../../utils/src/direct-execution.ts", "../../../utils/src/windows-shim.ts", "../../../utils/src/windows-shim-resolver.ts", "../../../utils/src/index.ts", "../../../server/src/fs/image.ts", "../../../server/src/fs/file-io.ts", "../../../server/src/routes/file-asset.ts", "../../../server/src/uploads/constants.ts", "../../../server/src/uploads/paths.ts", "../../../server/src/uploads/cleanup.ts", "../../../server/src/routes/uploads.ts", "../../../server/src/app.ts", "../../../server/src/git/auto-fetch.ts", "../../../server/src/provider-runtime/command-runner.ts", "../../../server/src/provider-runtime/command-check.ts", "../../../server/src/provider-runtime/e2e-provider-mock.ts", "../../../server/src/provider-runtime/install-manager.ts", "../../../core/src/domain/events.ts", "../../../core/src/domain/mcp.ts", "../../../core/src/domain/provider-install.ts", "../../../core/src/domain/supervisor.ts", "../../../core/src/domain/types.ts", "../../../core/src/protocol/messages.ts", "../../../core/src/protocol/topics.ts", "../../../core/src/provider/definition.ts", "../../../core/src/provider/idle-heuristics.ts", "../../../core/src/index.ts", "../../../server/src/provider-config.ts", "../../../server/src/storage/repositories/session-repo.ts", "../../../server/src/session/pty-state-detector.ts", "../../../server/src/session/state-shadow-comparator.ts", "../../../server/src/session/manager.ts", "../../../server/src/storage/database.ts", "../../../server/src/storage/schema-version.ts", "../../../server/src/storage/db.ts", "../../../server/src/storage/repositories/auth-login-block-repo.ts", "../../../server/src/storage/repositories/auth-session-repo.ts", "../../../server/src/storage/repositories/provider-config-repo.ts", "../../../server/src/storage/repositories/settings-repo.ts", "../../../server/src/storage/repositories/supervisor-cycle-attempt-repo.ts", "../../../server/src/storage/repositories/supervisor-cycle-repo.ts", "../../../server/src/storage/repositories/supervisor-repo.ts", "../../../server/src/terminal/snapshot-render.ts", "../../../server/src/supervisor/context-builder.ts", "../../../server/src/terminal/pty-host.ts", "../../../server/src/supervisor/settings.ts", "../../../server/src/supervisor/evaluator.ts", "../../../server/src/supervisor/injector.ts", "../../../server/src/supervisor/scheduler.ts", "../../../server/src/supervisor/manager.ts", "../../../server/src/supervisor/target-store.ts", "../../../server/src/terminal/active-terminal.ts", "../../../server/src/terminal/constants.ts", "../../../server/src/terminal/ring-buffer.ts", "../../../server/src/terminal/terminal-snapshot-buffer.ts", "../../../server/src/terminal/types.ts", "../../../server/src/terminal/manager.ts", "../../../server/src/workspace/validator.ts", "../../../server/src/fs/gitignore.ts", "../../../server/src/fs/watcher.ts", "../../../server/src/workspace/manager.ts", "../../../server/src/ws/activation.ts", "../../../server/src/ws/dispatch.ts", "../../../server/src/ws/fencing.ts", "../../../server/src/commands/terminal.ts", "../../../server/src/ws/stream-buffer.ts", "../../../server/src/ws/client.ts", "../../../server/src/ws/topic-class.ts", "../../../server/src/ws/hub.ts", "../../../server/src/commands/workspace.ts", "../../../server/src/commands/workspace-activity.ts", "../../../server/src/commands/activation.ts", "../../../server/src/commands/connection.ts", "../../../server/src/provider-runtime/runtime-status.ts", "../../../server/src/commands/session.ts", "../../../server/src/fs/tree.ts", "../../../server/src/commands/file.ts", "../../../server/src/constants/git.ts", "../../../server/src/git/status-parser.ts", "../../../server/src/git/cli.ts", "../../../server/src/git/diff.ts", "../../../server/src/commands/git-events.ts", "../../../server/src/commands/git.ts", "../../../server/src/config/config-io.ts", "../../../server/src/commands/settings.ts", "../../../server/src/commands/provider.ts", "../../../server/src/commands/supervisor.ts", "../../../server/src/git/worktree.ts", "../../../server/src/commands/worktree.ts", "../../../server/src/commands/fencing.ts", "../../../server/src/commands/index.ts", "../../../server/src/server.ts", "../../../server/src/storage/repositories/terminal-repo.ts", "../../../server/src/storage/repositories/workspace-repo.ts", "../../../server/src/storage/index.ts", "../../../server/src/terminal/index.ts", "../../../server/src/index.ts", "../../src/cli.ts", "../../src/auth-control.ts", "../../src/config-store.ts", "../../src/browser.ts", "../../src/log-excerpt.ts", "../../src/node-version.ts", "../../src/package-manifest.ts", "../../src/parse-args.ts", "../../src/pm2-control.ts", "../../src/prompts.ts", "../../src/server-control.ts", "../../src/server-runner.ts", "../../src/embed.ts", "../../src/server-url.ts", "../../src/bin.ts"],
4
- "sourcesContent": ["import type { FastifyRequest } from \"fastify\";\n\nconst RESERVED_PREFIXES = [\"/api/\", \"/auth/\", \"/internal/\", \"/assets/\"];\nconst RESERVED_EXACT_PATHS = new Set([\"/api\", \"/auth\", \"/assets\", \"/healthz\", \"/internal\", \"/ws\"]);\nconst ROOT_PUBLIC_FILE_PATHS = new Set([\"/favicon.ico\", \"/index.html\", \"/task-complete.wav\"]);\n\nexport function getRequestPathname(url: string): string {\n return url.split(\"?\", 1)[0] || \"/\";\n}\n\nexport function isFileLikePath(pathname: string): boolean {\n return /\\/[^/?]+\\.[^/?/]+$/.test(pathname);\n}\n\nexport function isReservedWebPath(pathname: string): boolean {\n return (\n RESERVED_EXACT_PATHS.has(pathname) ||\n RESERVED_PREFIXES.some((prefix) => pathname.startsWith(prefix))\n );\n}\n\nexport function isPublicStaticPath(pathname: string): boolean {\n return pathname.startsWith(\"/assets/\") || ROOT_PUBLIC_FILE_PATHS.has(pathname);\n}\n\nexport function isFrontendNavigationRequest(\n request: Pick<FastifyRequest, \"method\" | \"url\" | \"headers\">\n): boolean {\n if (request.method !== \"GET\" && request.method !== \"HEAD\") {\n return false;\n }\n\n const pathname = getRequestPathname(request.url);\n if (isReservedWebPath(pathname) || isPublicStaticPath(pathname) || isFileLikePath(pathname)) {\n return false;\n }\n\n const accept = request.headers.accept ?? \"\";\n return accept.includes(\"text/html\");\n}\n", "import type { FastifyRequest } from \"fastify\";\nimport {\n type AuthLoginBlockRecord,\n AuthLoginBlockRepo,\n} from \"../storage/repositories/auth-login-block-repo.js\";\n\nexport const LOGIN_FAILURE_LIMIT = 10;\nexport const LOGIN_WINDOW_MS = 24 * 60 * 60 * 1000;\nexport const LOGIN_BLOCK_MS = 24 * 60 * 60 * 1000;\n\nexport interface ActiveLoginBlock {\n ip: string;\n failedCount: number;\n blockedUntil: number;\n}\n\nfunction parseForwardedIp(rawHeader: string | string[] | undefined): string | null {\n const headerValue = Array.isArray(rawHeader) ? rawHeader[0] : rawHeader;\n if (!headerValue) {\n return null;\n }\n\n const clientIp = headerValue\n .split(\",\")\n .map((entry) => entry.trim())\n .find(Boolean);\n\n return clientIp ?? null;\n}\n\nexport function resolveClientIp(request: Pick<FastifyRequest, \"headers\" | \"ip\">): string {\n return parseForwardedIp(request.headers[\"x-forwarded-for\"]) ?? request.ip;\n}\n\nexport class AuthLoginProtection {\n constructor(private readonly repo: AuthLoginBlockRepo) {}\n\n getActiveBlock(ip: string, now: number): ActiveLoginBlock | null {\n const record = this.repo.get(ip);\n if (!record) {\n return null;\n }\n\n if (record.blockedUntil !== null && record.blockedUntil > now) {\n return {\n ip,\n failedCount: record.failedCount,\n blockedUntil: record.blockedUntil,\n };\n }\n\n if (this.shouldReset(record, now)) {\n this.repo.delete(ip);\n }\n\n return null;\n }\n\n recordFailure(ip: string, now: number): AuthLoginBlockRecord {\n return this.repo.recordFailure(\n ip,\n now,\n now - LOGIN_WINDOW_MS,\n LOGIN_FAILURE_LIMIT,\n LOGIN_BLOCK_MS\n );\n }\n\n clearFailures(ip: string): void {\n this.repo.delete(ip);\n }\n\n private shouldReset(record: AuthLoginBlockRecord, now: number): boolean {\n if (record.blockedUntil !== null && record.blockedUntil <= now) {\n return true;\n }\n\n return now - record.lastFailedAt > LOGIN_WINDOW_MS;\n }\n}\n", "import { randomBytes } from \"node:crypto\";\nimport type { FastifyReply, FastifyRequest } from \"fastify\";\nimport type { ServerConfig } from \"../config.js\";\nimport type { AuthLoginBlockRepo } from \"../storage/repositories/auth-login-block-repo.js\";\nimport type { AuthSessionRepo } from \"../storage/repositories/auth-session-repo.js\";\nimport {\n getRequestPathname,\n isFrontendNavigationRequest as isFrontendNavigationRequestForWebUi,\n isPublicStaticPath,\n} from \"../web-ui-routing.js\";\nimport { AuthLoginProtection, resolveClientIp } from \"./login-protection.js\";\n\nconst AUTH_COOKIE_NAME = \"coder_studio_auth\";\n\nconst isPublicPath = (path: string) => {\n const pathname = getRequestPathname(path);\n\n return (\n pathname === \"/\" ||\n pathname === \"/login\" ||\n pathname === \"/healthz\" ||\n pathname === \"/auth/status\" ||\n pathname === \"/auth/login\" ||\n pathname === \"/auth/logout\" ||\n pathname.startsWith(\"/@\") ||\n isPublicStaticPath(pathname)\n );\n};\n\nconst parseCookies = (cookieHeader?: string) => {\n if (!cookieHeader) {\n return {} as Record<string, string>;\n }\n\n return cookieHeader\n .split(\";\")\n .map((part) => part.trim())\n .filter(Boolean)\n .reduce<Record<string, string>>((acc, part) => {\n const [key, ...rest] = part.split(\"=\");\n if (!key) {\n return acc;\n }\n acc[key] = rest.join(\"=\");\n return acc;\n }, {});\n};\n\nconst encodeAuthCookieValue = (value: string): string => encodeURIComponent(value);\n\nconst decodeAuthCookieValue = (value: string): string => {\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n};\n\ninterface AuthDeps {\n config: ServerConfig;\n authSessionRepo: AuthSessionRepo;\n authLoginBlockRepo: AuthLoginBlockRepo;\n}\n\nconst isFrontendNavigationRequest = (request: FastifyRequest, deps: AuthDeps): boolean => {\n if (!deps.config.webRoot) {\n return false;\n }\n return isFrontendNavigationRequestForWebUi(request);\n};\n\nconst isAuthenticatedRequest = (request: FastifyRequest, deps: AuthDeps): boolean => {\n if (!deps.config.auth.enabled) {\n return true;\n }\n\n const cookies = parseCookies(request.headers.cookie);\n const authCookie = cookies[AUTH_COOKIE_NAME];\n if (!authCookie) {\n return false;\n }\n\n const token = decodeAuthCookieValue(authCookie);\n return deps.authSessionRepo.touch(token, Date.now());\n};\n\nexport const createAuthGuard = (deps: AuthDeps) => {\n return async (request: FastifyRequest, reply: FastifyReply) => {\n if (\n !deps.config.auth.enabled ||\n isPublicPath(request.url) ||\n request.url === \"/auth/login\" ||\n request.url === \"/auth/logout\"\n ) {\n return;\n }\n\n if (isAuthenticatedRequest(request, deps)) {\n return;\n }\n\n if (isFrontendNavigationRequest(request, deps)) {\n return reply.redirect(\"/login\");\n }\n\n reply.status(401).send({\n ok: false,\n error: \"Authentication required\",\n });\n };\n};\n\nexport const registerAuthStatusRoute = (deps: AuthDeps) => {\n return async (request: FastifyRequest, reply: FastifyReply) => {\n return reply.send({\n ok: true,\n authEnabled: deps.config.auth.enabled,\n authenticated: isAuthenticatedRequest(request, deps),\n });\n };\n};\n\nexport const registerAuthRoutes = (deps: AuthDeps) => {\n const loginProtection = new AuthLoginProtection(deps.authLoginBlockRepo);\n\n return async (request: FastifyRequest<{ Body: { password?: string } }>, reply: FastifyReply) => {\n if (!deps.config.auth.enabled || !deps.config.auth.password) {\n return reply.send({ ok: true, authEnabled: false, authenticated: true });\n }\n\n const now = Date.now();\n const ip = resolveClientIp(request);\n const activeBlock = loginProtection.getActiveBlock(ip, now);\n if (activeBlock) {\n return reply.status(429).send({\n ok: false,\n blocked: true,\n ip,\n blockedUntil: activeBlock.blockedUntil,\n error: \"Too many failed attempts\",\n });\n }\n\n if (request.body?.password !== deps.config.auth.password) {\n loginProtection.recordFailure(ip, now);\n return reply.status(401).send({ ok: false, error: \"Invalid password\" });\n }\n\n loginProtection.clearFailures(ip);\n const token = randomBytes(32).toString(\"hex\");\n deps.authSessionRepo.create(token, now);\n\n reply.header(\n \"Set-Cookie\",\n `${AUTH_COOKIE_NAME}=${encodeAuthCookieValue(token)}; HttpOnly; Path=/; SameSite=Lax`\n );\n return reply.send({ ok: true, authEnabled: true, authenticated: true });\n };\n};\n\nexport const registerAuthLogoutRoute = (deps: AuthDeps) => {\n return async (request: FastifyRequest, reply: FastifyReply) => {\n const cookies = parseCookies(request.headers.cookie);\n const authCookie = cookies[AUTH_COOKIE_NAME];\n\n if (authCookie) {\n deps.authSessionRepo.delete(decodeAuthCookieValue(authCookie));\n }\n\n reply.header(\"Set-Cookie\", `${AUTH_COOKIE_NAME}=; HttpOnly; Path=/; Max-Age=0; SameSite=Lax`);\n\n return reply.send({\n ok: true,\n authEnabled: deps.config.auth.enabled,\n authenticated: false,\n });\n };\n};\n", "export {\n createAuthGuard,\n registerAuthLogoutRoute,\n registerAuthRoutes,\n registerAuthStatusRoute,\n} from \"./plugin.js\";\n", "/**\n * Event Bus for Domain Events\n *\n * Implements the mixed C approach from spec \u00A74.0:\n * - Carries Service layer semantic events only\n * - Synchronous pub/sub pattern\n * - Used for session state changes, workspace metadata, git state, fs dirty\n */\n\nimport type { DomainEvent } from \"@coder-studio/core\";\n\nexport type Unsubscribe = () => void;\nexport type EventHandler<E extends DomainEvent = DomainEvent> = (event: E) => void;\n\nexport class EventBus {\n private handlers = new Map<DomainEvent[\"type\"], Set<EventHandler>>();\n\n /**\n * Emit a domain event to all subscribers\n * Synchronously calls all handlers\n */\n emit(event: DomainEvent): void {\n const handlers = this.handlers.get(event.type);\n if (!handlers) return;\n\n for (const handler of handlers) {\n try {\n handler(event);\n } catch (error) {\n // Log error but don't break other handlers\n console.error(`Error in event handler for ${event.type}:`, error);\n }\n }\n }\n\n /**\n * Subscribe to a specific event type\n * Returns unsubscribe function\n */\n on<E extends DomainEvent>(type: E[\"type\"], handler: EventHandler<E>): Unsubscribe {\n if (!this.handlers.has(type)) {\n this.handlers.set(type, new Set());\n }\n\n const handlers = this.handlers.get(type)!;\n handlers.add(handler as EventHandler);\n\n return () => {\n handlers.delete(handler as EventHandler);\n if (handlers.size === 0) {\n this.handlers.delete(type);\n }\n };\n }\n\n /**\n * Remove all handlers (used during shutdown)\n */\n clear(): void {\n this.handlers.clear();\n }\n}\n", "/**\n * Server Configuration\n *\n * Parses CLI args and environment variables.\n *\n * Database path resolution:\n * - Development: uses OS temp directory so SQLite files stay out of the repo\n * - Production: uses ~/.coder-studio/data/coder-studio.db by default\n */\n\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nexport interface ServerConfig {\n host: string;\n port: number;\n dataDir: string;\n uploadsDir: string;\n logLevel: \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\";\n webRoot?: string;\n appVersion?: string;\n auth: {\n enabled: boolean;\n password?: string;\n };\n}\n\nlet cachedTestUploadsDir: string | undefined;\nlet cachedAppVersion: string | undefined;\n\nfunction parseLogLevel(value: string | undefined): ServerConfig[\"logLevel\"] | undefined {\n switch (value) {\n case \"trace\":\n case \"debug\":\n case \"info\":\n case \"warn\":\n case \"error\":\n return value;\n default:\n return undefined;\n }\n}\n\nfunction resolveDefaultAppVersion(): string {\n if (cachedAppVersion) {\n return cachedAppVersion;\n }\n\n const packageJsonPath = [new URL(\"../../cli/package.json\", import.meta.url)].find((candidate) =>\n fs.existsSync(candidate)\n );\n\n if (!packageJsonPath) {\n cachedAppVersion = \"0.0.0\";\n return cachedAppVersion;\n }\n\n try {\n const pkg = JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\")) as { version?: unknown };\n cachedAppVersion = typeof pkg.version === \"string\" ? pkg.version : \"0.0.0\";\n } catch {\n cachedAppVersion = \"0.0.0\";\n }\n\n return cachedAppVersion;\n}\n\n/**\n * Resolve the database file path.\n *\n * In development (NODE_ENV !== 'production') the DB is placed in the OS temp\n * directory so it never pollutes the working tree. In production the path\n * defaults to ~/.coder-studio/data/coder-studio.db and can be overridden via\n * the DATA_DIR env var.\n */\nfunction resolveDbPath(explicit?: string): string {\n if (explicit) return explicit;\n if (process.env.NODE_ENV !== \"production\") {\n return path.join(os.tmpdir(), \"coder-studio-dev.db\");\n }\n return path.join(os.homedir(), \".coder-studio\", \"data\", \"coder-studio.db\");\n}\n\nfunction getOrCreateTestUploadsDir(): string {\n if (cachedTestUploadsDir) {\n return cachedTestUploadsDir;\n }\n\n cachedTestUploadsDir = fs.mkdtempSync(path.join(os.tmpdir(), \"coder-studio-test-uploads-\"));\n return cachedTestUploadsDir;\n}\n\nfunction resolveUploadsDir(explicit?: string): string {\n if (explicit) {\n return explicit;\n }\n if (process.env.NODE_ENV === \"test\") {\n return getOrCreateTestUploadsDir();\n }\n if (process.env.NODE_ENV === \"development\") {\n return path.join(os.tmpdir(), \"coder-studio-dev\", \"uploads\");\n }\n return path.join(os.homedir(), \".coder-studio\", \"uploads\");\n}\n\n/**\n * Parse server configuration from environment and CLI args\n */\nexport function parseServerConfig(overrides?: Partial<ServerConfig>): ServerConfig {\n const noAuth = process.env.NO_AUTH === \"true\";\n const password = process.env.AUTH_PASSWORD;\n const dataDir = resolveDbPath(overrides?.dataDir || process.env.DATA_DIR);\n const uploadsDir = resolveUploadsDir(overrides?.uploadsDir || process.env.UPLOADS_DIR);\n\n // NOTE: use `??` on port so callers can pass 0 to request an\n // OS-assigned port. `||` would silently fall through to 4173 for port=0.\n return {\n host: overrides?.host || process.env.HOST || \"localhost\",\n port: overrides?.port ?? parseInt(process.env.PORT || \"4173\", 10),\n dataDir,\n uploadsDir,\n logLevel: overrides?.logLevel ?? parseLogLevel(process.env.LOG_LEVEL) ?? \"info\",\n webRoot: overrides?.webRoot,\n appVersion:\n overrides?.appVersion ?? process.env.CODER_STUDIO_APP_VERSION ?? resolveDefaultAppVersion(),\n auth: overrides?.auth || {\n enabled: !noAuth && !!password,\n password,\n },\n };\n}\n\n/**\n * Ensure the database parent directory exists for file-backed databases.\n */\nexport function ensureDataDir(config: ServerConfig): void {\n if (config.dataDir === \":memory:\") {\n return;\n }\n\n fs.mkdirSync(path.dirname(config.dataDir), { recursive: true });\n}\n", "import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\n\nexport interface RuntimeConfig {\n host: string;\n port: number;\n pid: number;\n token: string;\n serverInstanceId: string;\n startedAt: number;\n}\n\nexport function getRuntimeDir(): string {\n const override = process.env.CODER_STUDIO_RUNTIME_DIR;\n if (override && override.trim()) {\n return override;\n }\n\n return join(homedir(), \".coder-studio\");\n}\n\nexport function getRuntimePath(): string {\n const pathOverride = process.env.CODER_STUDIO_RUNTIME_JSON_PATH;\n if (pathOverride && pathOverride.trim()) {\n return pathOverride;\n }\n\n return join(getRuntimeDir(), \"runtime.json\");\n}\n\nexport function readRuntimeConfig(): RuntimeConfig | null {\n const runtimePath = getRuntimePath();\n if (!existsSync(runtimePath)) {\n return null;\n }\n\n try {\n const config = JSON.parse(readFileSync(runtimePath, \"utf-8\")) as Partial<RuntimeConfig>;\n if (\n typeof config.port !== \"number\" ||\n typeof config.pid !== \"number\" ||\n typeof config.token !== \"string\" ||\n typeof config.serverInstanceId !== \"string\" ||\n typeof config.startedAt !== \"number\"\n ) {\n return null;\n }\n\n return {\n host: typeof config.host === \"string\" ? config.host : \"localhost\",\n port: config.port,\n pid: config.pid,\n token: config.token,\n serverInstanceId: config.serverInstanceId,\n startedAt: config.startedAt,\n };\n } catch {\n return null;\n }\n}\n\nexport function writeRuntimeConfig(config: RuntimeConfig): void {\n const runtimePath = getRuntimePath();\n const runtimeDir = dirname(runtimePath);\n if (!existsSync(runtimeDir)) {\n mkdirSync(runtimeDir, { recursive: true });\n }\n\n writeFileSync(runtimePath, JSON.stringify(config, null, 2), \"utf-8\");\n}\n\nexport function deleteRuntimeConfig(): void {\n const runtimePath = getRuntimePath();\n if (existsSync(runtimePath)) {\n unlinkSync(runtimePath);\n }\n}\n", "import { z } from \"zod\";\n\n/**\n * Claude Code configuration schema\n * Validates provider-specific settings\n */\nexport const claudeConfigSchema = z.object({\n // Model selection\n model: z\n .enum([\n \"claude-3-opus\",\n \"claude-3-sonnet\",\n \"claude-3-haiku\",\n \"claude-sonnet-4-5\",\n \"claude-sonnet-4-6\",\n \"claude-opus-4-6\",\n ])\n .optional(),\n\n // Maximum turns (null = unlimited)\n maxTurns: z.number().int().positive().nullable().optional(),\n\n // Additional CLI arguments\n additionalArgs: z.array(z.string()).optional(),\n\n // Environment variables to pass to Claude CLI\n envVars: z.record(z.string(), z.string()).optional(),\n});\n\nexport type ClaudeConfig = z.infer<typeof claudeConfigSchema>;\n", "import type { IdleHeuristics } from \"@coder-studio/core\";\n\nexport const claudeIdleHeuristics: IdleHeuristics = {\n idlePromptPatterns: [],\n idleDebounceMs: 4000,\n};\n", "import type { ProviderConfig, SupervisorEvalCommandRequest } from \"@coder-studio/core\";\nimport { claudeConfigSchema } from \"./config-schema.js\";\n\nexport function buildClaudeSupervisorEvalCommand(\n config: ProviderConfig,\n req: SupervisorEvalCommandRequest\n) {\n const cfg = claudeConfigSchema.parse(config);\n const model = req.model ?? cfg.model;\n\n return {\n argv: [\n \"claude\",\n \"-p\",\n req.prompt,\n \"--output-format\",\n \"json\",\n ...(model ? [\"--model\", model] : []),\n ...(cfg.additionalArgs ?? []),\n ],\n cwd: req.workspacePath,\n env: {\n ...(cfg.envVars ?? {}),\n ...(req.apiKey ? { ANTHROPIC_API_KEY: req.apiKey } : {}),\n CODER_STUDIO_SESSION_ID: req.sessionId,\n },\n };\n}\n", "import type { ProviderConfig, ProviderDefinition } from \"@coder-studio/core\";\n\nimport { claudeConfigSchema } from \"./config-schema.js\";\nimport { claudeIdleHeuristics } from \"./idle-heuristics.js\";\nimport { buildClaudeSupervisorEvalCommand } from \"./supervisor-eval.js\";\n\nexport const claudeInstallMetadata = {\n prerequisites: [\"npm\"],\n manualGuideKeys: [\"provider.install.nodejs.manual\", \"provider.install.claude.manual\"],\n docUrls: {\n provider: \"https://docs.anthropic.com/en/docs/claude-code/getting-started\",\n prerequisites: {\n npm: \"https://nodejs.org/en/download\",\n },\n },\n strategies: {\n win32: [\n {\n id: \"winget-nodejs-lts\",\n kind: \"prerequisite\",\n targetCommand: \"npm\",\n requiresCommands: [\"winget\"],\n command: \"winget\",\n args: [\"install\", \"--id\", \"OpenJS.NodeJS.LTS\", \"--exact\", \"--silent\"],\n },\n {\n id: \"npm-install-claude\",\n kind: \"provider\",\n targetCommand: \"claude\",\n requiresCommands: [\"npm\"],\n command: \"npm\",\n args: [\"install\", \"-g\", \"@anthropic-ai/claude-code\"],\n },\n ],\n darwin: [\n {\n id: \"brew-node\",\n kind: \"prerequisite\",\n targetCommand: \"npm\",\n requiresCommands: [\"brew\"],\n command: \"brew\",\n args: [\"install\", \"node\"],\n },\n {\n id: \"npm-install-claude\",\n kind: \"provider\",\n targetCommand: \"claude\",\n requiresCommands: [\"npm\"],\n command: \"npm\",\n args: [\"install\", \"-g\", \"@anthropic-ai/claude-code\"],\n },\n ],\n linux: [\n {\n id: \"npm-install-claude\",\n kind: \"provider\",\n targetCommand: \"claude\",\n requiresCommands: [\"npm\"],\n command: \"npm\",\n args: [\"install\", \"-g\", \"@anthropic-ai/claude-code\"],\n },\n ],\n },\n} satisfies ProviderDefinition[\"install\"];\n\n/**\n * Claude Code provider definition.\n */\nexport const claudeDefinition: ProviderDefinition = {\n // ===== Metadata =====\n id: \"claude\",\n displayName: \"Claude Code\",\n badge: \"Claude\",\n capability: \"full\",\n install: claudeInstallMetadata,\n\n // ===== Command construction =====\n buildCommand(config: ProviderConfig, ctx) {\n const cfg = claudeConfigSchema.parse(config);\n const modelArg = cfg.model ? [\"--model\", cfg.model] : [];\n\n return {\n argv: [\"claude\", ...modelArg, ...(cfg.additionalArgs ?? [])],\n env: {\n ...(cfg.envVars ?? {}),\n CODER_STUDIO_SESSION_ID: ctx.sessionId,\n },\n cwd: ctx.workspacePath,\n };\n },\n\n buildSupervisorEvalCommand: buildClaudeSupervisorEvalCommand,\n\n // ===== Configuration =====\n configSchema: claudeConfigSchema,\n defaultConfig: {},\n\n // ===== Runtime requirements =====\n requiredCommands: [\"claude\"],\n idleHeuristics: claudeIdleHeuristics,\n};\n", "import { z } from \"zod\";\n\n/**\n * Codex configuration schema\n */\nexport const codexConfigSchema = z.object({\n model: z.string().min(1).optional(),\n additionalArgs: z.array(z.string()).default([]),\n envVars: z.record(z.string(), z.string()).default({}),\n});\n\nexport type CodexConfig = z.infer<typeof codexConfigSchema>;\n", "/**\n * Codex stdout heuristics for session detection\n * Limited mode: extracts session ID and detects idle state from stdout\n */\n\n/**\n * Session ID extraction patterns\n * Matches various formats Codex may output\n */\nexport const sessionIdPatterns: RegExp[] = [\n // Format: \"Session ID: abc123-def456\"\n /Session ID:\\s*([a-f0-9-]{6,})/i,\n\n // Format: \"session: abc123\"\n /^session:\\s*([a-f0-9-]{6,})/im,\n\n // Format: \"[session-abc123]\"\n /\\[session-([a-f0-9-]{6,})\\]/i,\n\n // Format: JSON-like: {\"session_id\": \"abc123\"}\n /\"session_id\":\\s*\"([a-f0-9-]{6,})\"/i,\n];\n\n/**\n * Idle prompt detection patterns\n * Matches when Codex is waiting for user input\n */\nexport const idlePromptPatterns: RegExp[] = [\n // Standard prompt: newline + \"> \" or \"$ \"\n /\\n>\\s*$/,\n /\\n\\$\\s*$/,\n\n // Codex-specific: newline + \">>> \"\n /\\n>>>\\s*$/,\n\n // Prompt with cursor indicator\n /\\n.*\\u2588\\s*$/, // \u2588 cursor\n];\n\n/**\n * Idle detection debounce time\n * Wait this long after detecting idle pattern before marking as idle\n */\nexport const idleDebounceMs = 3000;\n\n/**\n * Extract session ID from stdout buffer\n * Returns first matched session ID or null\n */\nexport function extractSessionId(buffer: string): string | null {\n // Keep last 4096 chars for pattern matching\n const recent = buffer.slice(-4096);\n\n for (const pattern of sessionIdPatterns) {\n const matches = recent.match(pattern);\n if (matches && matches[1]) {\n return matches[1];\n }\n }\n\n return null;\n}\n\n/**\n * Check if stdout indicates idle state\n * Returns true if idle prompt pattern detected\n */\nexport function detectIdlePrompt(buffer: string): boolean {\n const recent = buffer.slice(-4096);\n\n for (const pattern of idlePromptPatterns) {\n if (pattern.test(recent)) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Validate extracted session ID format\n * Ensures ID meets minimum requirements\n */\nexport function isValidSessionId(id: string): boolean {\n // Minimum 6 chars, alphanumeric + dashes\n return /^[a-f0-9-]{6,}$/i.test(id);\n}\n\n/**\n * Parse completion indicator from stdout\n * May detect explicit completion messages\n */\nexport function detectCompletion(buffer: string): boolean {\n const recent = buffer.slice(-2048);\n\n // Common completion indicators\n const completionPatterns = [\n /\\n(complete|finished|done)\\s*\\.\\s*$/i,\n /\u2713\\s*$/, // Checkmark at end\n /Task completed/i,\n /\\n(complete|finished|done)\\s*$/i,\n ];\n\n return completionPatterns.some((pattern) => pattern.test(recent));\n}\n", "import type { ProviderConfig, SupervisorEvalCommandRequest } from \"@coder-studio/core\";\nimport { codexConfigSchema } from \"./config-schema.js\";\n\n/**\n * Build the argv Codex needs to act as a supervisor evaluator.\n *\n * We require `--json` so stdout is a JSONL event stream instead of the\n * default human banner (\"OpenAI Codex v\u2026\", token usage, etc.). The\n * evaluator extractor then picks the final `item.completed` event of\n * type `agent_message` and parses its `.text` as JSON.\n *\n * We also pin `-s read-only` and `--skip-git-repo-check` so evaluations\n * never mutate the workspace and don't choke when the cwd isn't a repo.\n */\nexport function buildCodexSupervisorEvalCommand(\n config: ProviderConfig,\n req: SupervisorEvalCommandRequest\n) {\n const cfg = codexConfigSchema.parse(config);\n\n return {\n argv: [\n \"codex\",\n \"exec\",\n \"--json\",\n \"-s\",\n \"read-only\",\n \"--skip-git-repo-check\",\n ...(req.model ? [\"-m\", req.model] : []),\n ...cfg.additionalArgs,\n req.prompt,\n ],\n cwd: req.workspacePath,\n env: {\n ...cfg.envVars,\n ...(req.apiKey ? { OPENAI_API_KEY: req.apiKey } : {}),\n CODER_STUDIO_SESSION_ID: req.sessionId,\n },\n };\n}\n", "import type { ProviderConfig, ProviderDefinition } from \"@coder-studio/core\";\n\nimport { type CodexConfig, codexConfigSchema } from \"./config-schema.js\";\nimport { idleDebounceMs, idlePromptPatterns, sessionIdPatterns } from \"./stdout-heuristics.js\";\nimport { buildCodexSupervisorEvalCommand } from \"./supervisor-eval.js\";\n\nexport const codexInstallMetadata = {\n prerequisites: [\"npm\"],\n manualGuideKeys: [\"provider.install.nodejs.manual\", \"provider.install.codex.manual\"],\n docUrls: {\n provider: \"https://help.openai.com/en/articles/11096431-openai-codex-ci-getting-started\",\n prerequisites: {\n npm: \"https://nodejs.org/en/download\",\n },\n },\n strategies: {\n win32: [\n {\n id: \"winget-nodejs-lts\",\n kind: \"prerequisite\",\n targetCommand: \"npm\",\n requiresCommands: [\"winget\"],\n command: \"winget\",\n args: [\"install\", \"--id\", \"OpenJS.NodeJS.LTS\", \"--exact\", \"--silent\"],\n },\n {\n id: \"npm-install-codex\",\n kind: \"provider\",\n targetCommand: \"codex\",\n requiresCommands: [\"npm\"],\n command: \"npm\",\n args: [\"install\", \"-g\", \"@openai/codex\"],\n },\n ],\n darwin: [\n {\n id: \"brew-node\",\n kind: \"prerequisite\",\n targetCommand: \"npm\",\n requiresCommands: [\"brew\"],\n command: \"brew\",\n args: [\"install\", \"node\"],\n },\n {\n id: \"npm-install-codex\",\n kind: \"provider\",\n targetCommand: \"codex\",\n requiresCommands: [\"npm\"],\n command: \"npm\",\n args: [\"install\", \"-g\", \"@openai/codex\"],\n },\n ],\n linux: [\n {\n id: \"npm-install-codex\",\n kind: \"provider\",\n targetCommand: \"codex\",\n requiresCommands: [\"npm\"],\n command: \"npm\",\n args: [\"install\", \"-g\", \"@openai/codex\"],\n },\n ],\n },\n} satisfies ProviderDefinition[\"install\"];\n\n/**\n * Codex provider definition.\n */\nexport const codexDefinition: ProviderDefinition = {\n // ===== Metadata =====\n id: \"codex\",\n displayName: \"Codex\",\n badge: \"Codex\",\n capability: \"full\",\n install: codexInstallMetadata,\n\n // ===== Command construction =====\n buildCommand(config: ProviderConfig, ctx) {\n const cfg = codexConfigSchema.parse(config);\n\n return {\n argv: [\"codex\", ...cfg.additionalArgs],\n env: {\n ...cfg.envVars,\n CODER_STUDIO_SESSION_ID: ctx.sessionId,\n },\n cwd: ctx.workspacePath,\n };\n },\n\n // Full mode: no resume support yet (Codex CLI may support it later)\n buildSupervisorEvalCommand: buildCodexSupervisorEvalCommand,\n\n // ===== Configuration =====\n configSchema: codexConfigSchema,\n defaultConfig: {\n additionalArgs: [],\n envVars: {},\n } satisfies CodexConfig,\n\n // ===== Runtime requirements =====\n requiredCommands: [\"codex\"],\n idleHeuristics: {\n sessionIdPatterns,\n idlePromptPatterns,\n idleDebounceMs,\n },\n};\n", "import type { ProviderDefinition } from \"@coder-studio/core\";\n\nimport { claudeDefinition } from \"./claude/definition.js\";\nimport { codexDefinition } from \"./codex/definition.js\";\n\n/**\n * Static registry of all available providers\n * Provider list is fixed at build time\n *\n * Adding a new provider:\n * 1. Create packages/providers/src/<name>/definition.ts\n * 2. Implement ProviderDefinition interface\n * 3. Import and add to this array\n * 4. Frontend automatically receives updated list via provider.list command\n */\nexport const providerRegistry: ProviderDefinition[] = [claudeDefinition, codexDefinition];\n\n/**\n * Get provider by ID\n */\nexport function getProviderById(id: string): ProviderDefinition | undefined {\n return providerRegistry.find((provider) => provider.id === id);\n}\n\n/**\n * Check if provider ID is valid\n */\nexport function isValidProviderId(id: string): boolean {\n return providerRegistry.some((provider) => provider.id === id);\n}\n\n/**\n * Get all provider IDs\n */\nexport function getAllProviderIds(): string[] {\n return providerRegistry.map((provider) => provider.id);\n}\n\n/**\n * Get providers by capability level\n */\nexport function getProvidersByCapability(\n capability: \"full\" | \"limited\" | \"unsupported\"\n): ProviderDefinition[] {\n return providerRegistry.filter((provider) => provider.capability === capability);\n}\n", "// Provider definitions\n\n// Claude-specific exports\nexport { type ClaudeConfig, claudeConfigSchema } from \"./claude/config-schema.js\";\nexport { claudeDefinition } from \"./claude/definition.js\";\n// Codex-specific exports\nexport { type CodexConfig, codexConfigSchema } from \"./codex/config-schema.js\";\nexport { codexDefinition } from \"./codex/definition.js\";\nexport {\n detectCompletion,\n detectIdlePrompt,\n extractSessionId,\n idleDebounceMs,\n idlePromptPatterns,\n isValidSessionId,\n sessionIdPatterns,\n} from \"./codex/stdout-heuristics.js\";\n// Provider registry\nexport {\n getAllProviderIds,\n getProviderById,\n getProvidersByCapability,\n isValidProviderId,\n providerRegistry,\n} from \"./registry.js\";\n", "import { posix, resolve } from \"node:path\";\n\nfunction isWindowsDrivePath(path: string): boolean {\n return /^[A-Za-z]:\\//.test(path);\n}\n\nfunction normalizeComparablePath(path: string): string {\n let normalized = path.replace(/\\\\/g, \"/\");\n\n if (/^\\/[A-Za-z]:\\//.test(normalized)) {\n normalized = normalized.slice(1);\n }\n\n if (normalized.startsWith(\"//\")) {\n normalized = `//${posix.normalize(normalized.slice(2))}`;\n } else {\n normalized = posix.normalize(normalized);\n }\n\n if (isWindowsDrivePath(normalized) || normalized.startsWith(\"//\")) {\n normalized = normalized.toLowerCase();\n }\n\n return normalized;\n}\n\nfunction normalizeModuleUrlPath(moduleUrl: string): string | null {\n let url: URL;\n\n try {\n url = new URL(moduleUrl);\n } catch {\n return null;\n }\n\n if (url.protocol !== \"file:\") {\n return null;\n }\n\n const path = `${url.host ? `//${url.host}` : \"\"}${decodeURIComponent(url.pathname)}`;\n return normalizeComparablePath(path);\n}\n\nfunction normalizeArgvPath(argv1: string): string {\n const isAbsoluteWindowsPath = /^[A-Za-z]:[\\\\/]/.test(argv1) || /^\\\\\\\\/.test(argv1);\n return normalizeComparablePath(isAbsoluteWindowsPath ? argv1 : resolve(argv1));\n}\n\nexport function isDirectExecution(\n moduleUrl: string,\n argv1: string | undefined = process.argv[1]\n): boolean {\n if (argv1 === undefined) {\n return false;\n }\n\n const modulePath = normalizeModuleUrlPath(moduleUrl);\n\n if (modulePath === null) {\n return false;\n }\n\n return modulePath === normalizeArgvPath(argv1);\n}\n", "/**\n * Helpers for spawning child processes that may resolve to Windows .cmd / .bat\n * shims.\n *\n * Why: Node 18.20.2 / 20.12.2 / 21.7.2 (CVE-2024-27980) refuses to spawn\n * .cmd or .bat files unless `shell: true` is set. The shims below ship as\n * .cmd on Windows, so they need shell:true; native executables (git, etc.)\n * must keep shell:false to avoid breaking argument escaping.\n */\n\nconst WINDOWS_CMD_SHIMS = new Set([\"pnpm\", \"npm\", \"npx\"]);\n\nexport function shouldUseShellForCommand(\n command: string,\n platform: NodeJS.Platform = process.platform\n): boolean {\n return platform === \"win32\" && WINDOWS_CMD_SHIMS.has(command.toLowerCase());\n}\n", "/**\n * Resolve a spawn argv on Windows by walking PATH+PATHEXT and unwrapping\n * npm-style cmd-shims into their underlying `node <entry.js>` invocation.\n *\n * Why: node-pty on Windows calls Win32 CreateProcess directly, which only\n * auto-appends `.exe` and cannot run `.cmd`/`.bat` shims. Tools installed by\n * npm (codex, claude, pnpm, \u2026) ship as `.cmd` shims that wrap a node entry\n * script. On POSIX the kernel handles the equivalent via shebang; we replicate\n * that step on Windows so node-pty receives an argv it can actually spawn.\n *\n * On non-win32 platforms this is a no-op (returns argv unchanged).\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nconst DEFAULT_PATHEXT = \".COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC\";\n\nexport interface ResolveSpawnArgvDeps {\n platform?: NodeJS.Platform;\n pathEnv?: string;\n pathExt?: string;\n readFileSync?: (file: string) => string;\n existsSync?: (file: string) => boolean;\n}\n\nexport interface ParsedCmdShim {\n node: string;\n entry: string;\n}\n\nexport function resolveSpawnArgv(\n argv: readonly string[],\n deps: ResolveSpawnArgvDeps = {}\n): string[] {\n const platform = deps.platform ?? process.platform;\n if (platform !== \"win32\") {\n return [...argv];\n }\n const command = argv[0];\n if (command === undefined) {\n return [];\n }\n const restArgs = argv.slice(1);\n\n const readFileSync = deps.readFileSync ?? ((file: string) => fs.readFileSync(file, \"utf8\"));\n const existsSync = deps.existsSync ?? fs.existsSync;\n const pathEnv = deps.pathEnv ?? process.env.Path ?? process.env.PATH ?? \"\";\n const pathExt = deps.pathExt ?? process.env.PATHEXT ?? DEFAULT_PATHEXT;\n\n const resolved = resolveExecutablePath(command, pathEnv, pathExt, existsSync);\n if (!resolved) {\n // Let node-pty surface its own ENOENT \u2014 keeps existing error semantics.\n return [...argv];\n }\n\n const ext = path.win32.extname(resolved).toLowerCase();\n if (ext === \".exe\" || ext === \".com\") {\n return [resolved, ...restArgs];\n }\n if (ext === \".cmd\" || ext === \".bat\") {\n let content: string;\n try {\n content = readFileSync(resolved);\n } catch {\n return [\"cmd.exe\", \"/d\", \"/s\", \"/c\", resolved, ...restArgs];\n }\n const parsed = parseCmdShim(resolved, content);\n if (parsed) {\n return [parsed.node, parsed.entry, ...restArgs];\n }\n return [\"cmd.exe\", \"/d\", \"/s\", \"/c\", resolved, ...restArgs];\n }\n // Unknown extension (e.g. .ps1, .vbs): leave argv untouched and let the\n // caller/OS decide. Wrapping with cmd.exe wouldn't help these anyway.\n return [...argv];\n}\n\nexport function parseCmdShim(shimPath: string, content: string): ParsedCmdShim | null {\n const dp0Dir = path.win32.dirname(shimPath);\n\n // Match the dispatch line: a quoted .js entry followed by %*\n const entryMatch = content.match(/\"([^\"\\r\\n]+\\.js)\"\\s+%\\*/i);\n const entryRaw = entryMatch?.[1];\n if (!entryRaw) {\n return null;\n }\n const entry = expandShimVars(entryRaw, dp0Dir);\n\n // Try to find a quoted node executable reference; prefer one that points at\n // an absolute/dp0-relative location, falling back to bare `node` otherwise.\n const nodeMatch = content.match(/\"([^\"\\r\\n]*node\\.exe)\"/i) ?? content.match(/\"([^\"\\r\\n]*node)\"/i);\n const nodeRaw = nodeMatch?.[1];\n const node = nodeRaw ? expandShimVars(nodeRaw, dp0Dir) : \"node\";\n\n return { node, entry };\n}\n\nfunction expandShimVars(value: string, dp0Dir: string): string {\n // %~dp0 and %dp0% both expand to the directory containing the shim,\n // canonically with a trailing backslash.\n const dp0WithSlash = dp0Dir.endsWith(\"\\\\\") ? dp0Dir : `${dp0Dir}\\\\`;\n let expanded = value;\n expanded = expanded.replace(/%~dp0/gi, dp0WithSlash);\n expanded = expanded.replace(/%dp0%/gi, dp0WithSlash);\n\n if (path.win32.isAbsolute(expanded)) {\n return path.win32.normalize(expanded);\n }\n return path.win32.resolve(dp0Dir, expanded);\n}\n\nfunction parsePathExt(pathExt: string): string[] {\n return pathExt\n .split(\";\")\n .map((entry) => entry.trim().toLowerCase())\n .filter((entry) => entry.length > 0);\n}\n\nfunction resolveExecutablePath(\n command: string,\n pathEnv: string,\n pathExt: string,\n existsSync: (file: string) => boolean\n): string | null {\n const hasExt = path.win32.extname(command).length > 0;\n const extensions = parsePathExt(pathExt);\n\n if (path.win32.isAbsolute(command)) {\n if (existsSync(command)) {\n return command;\n }\n if (!hasExt) {\n for (const ext of extensions) {\n const candidate = command + ext;\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n }\n return null;\n }\n\n const dirs = pathEnv\n .split(\";\")\n .map((dir) => dir.trim())\n .filter((dir) => dir.length > 0);\n\n for (const dir of dirs) {\n if (hasExt) {\n const candidate = path.win32.join(dir, command);\n if (existsSync(candidate)) {\n return candidate;\n }\n continue;\n }\n for (const ext of extensions) {\n const candidate = path.win32.join(dir, command + ext);\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n }\n return null;\n}\n", "export { isDirectExecution } from \"./direct-execution.js\";\nexport { shouldUseShellForCommand } from \"./windows-shim.js\";\nexport type {\n ParsedCmdShim,\n ResolveSpawnArgvDeps,\n} from \"./windows-shim-resolver.js\";\nexport { parseCmdShim, resolveSpawnArgv } from \"./windows-shim-resolver.js\";\n", "/**\n * Image file detection.\n *\n * Used by both the `file.read` command (to decide whether a file should be\n * streamed as an image instead of decoded as UTF-8 text) and the\n * `/api/file` HTTP endpoint (to guard which files are allowed through and\n * to pick the right Content-Type).\n *\n * Detection is intentionally extension-based, not content-sniffing:\n * - It stays consistent between `file.read` and the static endpoint.\n * - File trees in practice already use extensions faithfully.\n * - Content-sniffing every open would require a second stat/read round\n * trip and complicate the \"is this text?\" path.\n */\n\nimport { extname } from \"path\";\n\nexport interface ImageTypeInfo {\n mime: string;\n /**\n * True when the file is really a text format (SVG) that we *display* as an\n * image by default. The editor UI uses this to offer an \"edit as text\"\n * toggle so users can still tweak SVG source.\n */\n isTextBacked: boolean;\n}\n\nconst IMAGE_MIME_BY_EXT: Record<string, ImageTypeInfo> = {\n \".png\": { mime: \"image/png\", isTextBacked: false },\n \".jpg\": { mime: \"image/jpeg\", isTextBacked: false },\n \".jpeg\": { mime: \"image/jpeg\", isTextBacked: false },\n \".gif\": { mime: \"image/gif\", isTextBacked: false },\n \".webp\": { mime: \"image/webp\", isTextBacked: false },\n \".bmp\": { mime: \"image/bmp\", isTextBacked: false },\n \".ico\": { mime: \"image/x-icon\", isTextBacked: false },\n \".svg\": { mime: \"image/svg+xml\", isTextBacked: true },\n};\n\nexport function getImageTypeInfo(filePath: string): ImageTypeInfo | null {\n const ext = extname(filePath).toLowerCase();\n return IMAGE_MIME_BY_EXT[ext] ?? null;\n}\n\nexport function isImageFile(filePath: string): boolean {\n return getImageTypeInfo(filePath) !== null;\n}\n", "/**\n * File IO operations with conflict detection.\n */\n\nimport { createHash } from \"crypto\";\nimport { readFile as fsReadFile, writeFile as fsWriteFile, mkdir, rm, stat } from \"fs/promises\";\nimport { dirname, isAbsolute, relative, resolve } from \"path\";\nimport { getImageTypeInfo } from \"./image.js\";\n\nexport interface FileReadTextResult {\n kind: \"text\";\n content: string;\n baseHash: string;\n encoding: \"utf-8\";\n}\n\nexport interface FileReadImageResult {\n kind: \"image\";\n mime: string;\n /** URL the web client can drop into an <img src>. Relative so auth cookie applies. */\n url: string;\n /** File size in bytes. Useful for the editor chrome (\"PNG \u00B7 34.2 KB\"). */\n size: number;\n /**\n * True for SVG: even though we return an image URL, the file is really\n * text and the UI should offer an \"edit as text\" toggle.\n */\n isTextBacked: boolean;\n}\n\nexport type FileReadResult = FileReadTextResult | FileReadImageResult;\n\nexport interface FileWriteResult {\n newHash: string;\n}\n\nasync function statSafe(path: string) {\n try {\n return await stat(path);\n } catch {\n return null;\n }\n}\n\nexport async function createFile(rootPath: string, relPath: string): Promise<void> {\n const abs = resolveSafe(rootPath, relPath);\n const existing = await statSafe(abs);\n\n if (existing) {\n throw { code: \"already_exists\", message: \"File already exists\" };\n }\n\n await mkdir(dirname(abs), { recursive: true });\n await fsWriteFile(abs, \"\", \"utf-8\");\n}\n\nexport async function createDirectory(rootPath: string, relPath: string): Promise<void> {\n const abs = resolveSafe(rootPath, relPath);\n const existing = await statSafe(abs);\n\n if (existing) {\n throw { code: \"already_exists\", message: \"Directory already exists\" };\n }\n\n await mkdir(abs, { recursive: true });\n}\n\nexport async function deleteEntry(rootPath: string, relPath: string): Promise<void> {\n const abs = resolveSafe(rootPath, relPath);\n const existing = await statSafe(abs);\n\n if (!existing) {\n throw { code: \"not_found\", message: \"Target not found\" };\n }\n\n await rm(abs, { recursive: true });\n}\n\n/**\n * Resolves a relative path safely to prevent path escape attacks.\n * Throws an error if the resolved path escapes the workspace root.\n *\n * @param root - Workspace root directory\n * @param relPath - Relative path within workspace\n * @returns Absolute path safely resolved within workspace\n */\nexport function resolveSafe(root: string, relPath: string): string {\n const absRoot = resolve(root);\n const abs = resolve(absRoot, relPath);\n\n // Prevent path escape: resolved path must stay inside the workspace root.\n const rel = relative(absRoot, abs);\n if (rel === \"..\" || rel.startsWith(`..${\"/\"}`) || isAbsolute(rel)) {\n throw { code: \"path_escape\", message: \"Path escapes workspace root\" };\n }\n\n return abs;\n}\n\n/**\n * Reads a file from the workspace.\n *\n * For images (extension allowlist), returns a URL the client can use with\n * a native <img> tag so we don't bloat the WebSocket channel with base64\n * payloads. For everything else, reads as UTF-8 text and includes a\n * baseHash for write-time conflict detection.\n *\n * @param workspaceId - Workspace id (used to construct the asset URL for images)\n * @param rootPath - Workspace root path\n * @param relPath - Relative file path\n */\nexport async function readFile(\n workspaceId: string,\n rootPath: string,\n relPath: string\n): Promise<FileReadResult> {\n const abs = resolveSafe(rootPath, relPath);\n\n const imageType = getImageTypeInfo(relPath);\n if (imageType) {\n const stats = await stat(abs);\n const params = new URLSearchParams({\n workspaceId,\n path: relPath,\n });\n return {\n kind: \"image\",\n mime: imageType.mime,\n url: `/api/file?${params.toString()}`,\n size: stats.size,\n isTextBacked: imageType.isTextBacked,\n };\n }\n\n const content = await fsReadFile(abs, \"utf-8\");\n const baseHash = createHash(\"sha256\").update(content).digest(\"hex\");\n\n return {\n kind: \"text\",\n content,\n baseHash,\n encoding: \"utf-8\",\n };\n}\n\n/**\n * Writes a file to the workspace with conflict detection.\n * If the file changed externally since reading (baseHash mismatch),\n * throws conflict error.\n *\n * @param rootPath - Workspace root path\n * @param relPath - Relative file path\n * @param content - New content to write\n * @param baseHash - Hash of original content (optional)\n * @returns New hash after write\n */\nexport async function writeFile(\n rootPath: string,\n relPath: string,\n content: string,\n baseHash?: string\n): Promise<FileWriteResult> {\n const abs = resolveSafe(rootPath, relPath);\n\n // Conflict check if baseHash provided\n if (baseHash) {\n const current = await fsReadFile(abs, \"utf-8\").catch(() => \"\");\n const currentHash = createHash(\"sha256\").update(current).digest(\"hex\");\n\n if (currentHash !== baseHash) {\n throw {\n code: \"conflict\",\n message: \"File has been modified externally\",\n details: {\n expectedHash: baseHash,\n actualHash: currentHash,\n },\n };\n }\n }\n\n // Ensure parent directory exists\n await mkdir(dirname(abs), { recursive: true });\n\n // Write new content\n await fsWriteFile(abs, content, \"utf-8\");\n const newHash = createHash(\"sha256\").update(content).digest(\"hex\");\n\n return { newHash };\n}\n", "/**\n * /api/file \u2014 binary file streaming endpoint.\n *\n * This exists so the web client can render image previews via native\n * `<img src>` without forcing us to base64-encode large files onto the\n * WebSocket channel. Scope is deliberately narrow:\n *\n * - GET only, read only.\n * - Allowed mime types gated by `getImageTypeInfo` (extension allowlist).\n * Non-image files 404 so the endpoint isn't a general exfiltration\n * channel against the workspace.\n * - `resolveSafe` rejects any path that escapes the workspace root.\n * - Auth is inherited from the global `onRequest` guard in `app.ts`\n * (cookie-based), same model as every other non-public route.\n *\n * Browsers attach the auth cookie automatically for `<img src=\"/api/file?\u2026\">`\n * requests, so no extra work is needed on the client beyond constructing\n * the URL.\n */\n\nimport type { FastifyInstance, FastifyReply, FastifyRequest } from \"fastify\";\nimport { createReadStream } from \"fs\";\nimport { realpath, stat } from \"fs/promises\";\nimport { isAbsolute, relative } from \"path\";\nimport { resolveSafe } from \"../fs/file-io.js\";\nimport { getImageTypeInfo } from \"../fs/image.js\";\nimport type { WorkspaceManager } from \"../workspace/manager.js\";\n\nfunction isPathInsideRoot(rootPath: string, targetPath: string): boolean {\n const rel = relative(rootPath, targetPath);\n return rel !== \"..\" && !rel.startsWith(`..${\"/\"}`) && !isAbsolute(rel);\n}\n\ninterface FileAssetQuery {\n workspaceId?: string;\n path?: string;\n}\n\nexport function registerFileAssetRoutes(\n app: FastifyInstance,\n deps: { workspaceMgr: WorkspaceManager }\n) {\n app.get(\n \"/api/file\",\n async (request: FastifyRequest<{ Querystring: FileAssetQuery }>, reply: FastifyReply) => {\n const { workspaceId, path: relPath } = request.query;\n\n if (!workspaceId || !relPath) {\n return reply.status(400).send({ ok: false, error: \"workspaceId and path are required\" });\n }\n\n const workspace = deps.workspaceMgr.get(workspaceId);\n if (!workspace) {\n return reply.status(404).send({ ok: false, error: \"workspace_not_found\" });\n }\n\n const typeInfo = getImageTypeInfo(relPath);\n if (!typeInfo) {\n // Enforce allowlist: this endpoint exists for image previews only,\n // not as a generic file fetcher. Text files keep using file.read\n // over WS where we can attach baseHash / encoding metadata.\n return reply.status(404).send({ ok: false, error: \"not_an_image\" });\n }\n\n let absPath: string;\n try {\n absPath = resolveSafe(workspace.path, relPath);\n } catch {\n return reply.status(400).send({ ok: false, error: \"path_escape\" });\n }\n\n try {\n const [realWorkspacePath, realAssetPath] = await Promise.all([\n realpath(workspace.path),\n realpath(absPath),\n ]);\n\n if (!isPathInsideRoot(realWorkspacePath, realAssetPath)) {\n return reply.status(400).send({ ok: false, error: \"path_escape\" });\n }\n } catch {\n return reply.status(404).send({ ok: false, error: \"not_found\" });\n }\n\n let fileSize: number;\n try {\n const stats = await stat(absPath);\n if (!stats.isFile()) {\n return reply.status(404).send({ ok: false, error: \"not_a_file\" });\n }\n fileSize = stats.size;\n } catch {\n return reply.status(404).send({ ok: false, error: \"not_found\" });\n }\n\n // no-store here is deliberate: the editor re-fetches on demand and we\n // want changes on disk to reflect immediately without stale caches.\n reply\n .header(\"Content-Type\", typeInfo.mime)\n .header(\"Content-Length\", String(fileSize))\n .header(\"Cache-Control\", \"no-store\")\n .header(\"X-Content-Type-Options\", \"nosniff\");\n\n return reply.send(createReadStream(absPath));\n }\n );\n}\n", "export const UPLOAD_TTL_HOURS = 72;\nexport const UPLOAD_BUCKET_MAX_BYTES = 200 * 1024 * 1024;\nexport const MAX_FILE_BYTES = 50 * 1024 * 1024;\nexport const MAX_FILES_PER_BATCH = 20;\nexport const STARTUP_GC_DELAY_MS = 5_000;\n", "import { randomUUID } from \"node:crypto\";\nimport { lstat, mkdir } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nconst MAX_FILENAME_LENGTH = 64;\nconst KEEP_FILENAME_CHAR = /[a-zA-Z0-9._\u4E00-\u9FFF \\-]/;\nconst WORKSPACE_ID_RE = /^[a-zA-Z0-9_-]+$/;\n\nexport function sanitizeOriginalName(input: string): string {\n let sanitized = \"\";\n\n for (const char of input.trim()) {\n sanitized += KEEP_FILENAME_CHAR.test(char) ? char : \"_\";\n }\n\n sanitized = sanitized.replace(/^\\.+/, \"\");\n\n if (sanitized.length === 0 || /^[_\\s]*$/.test(sanitized)) {\n return \"file\";\n }\n\n if (sanitized.length <= MAX_FILENAME_LENGTH) {\n return sanitized;\n }\n\n const lastDot = sanitized.lastIndexOf(\".\");\n if (lastDot > 0 && sanitized.length - lastDot <= 16) {\n const ext = sanitized.slice(lastDot);\n const stem = sanitized.slice(0, MAX_FILENAME_LENGTH - ext.length);\n return stem + ext;\n }\n\n return sanitized.slice(0, MAX_FILENAME_LENGTH);\n}\n\nexport function validateWorkspaceId(id: string): void {\n if (!WORKSPACE_ID_RE.test(id)) {\n throw new Error(`invalid workspace id: ${JSON.stringify(id)}`);\n }\n}\n\nexport interface GenerateBucketPathInput {\n uploadsDir: string;\n workspaceId: string;\n originalName: string;\n now?: Date;\n}\n\nexport interface GenerateBucketPathResult {\n dir: string;\n absolutePath: string;\n uuid8: string;\n sanitizedName: string;\n}\n\nexport async function assertNoSymlinkInPath(rootDir: string, targetDir: string): Promise<void> {\n const resolvedRoot = path.resolve(rootDir);\n const resolvedTarget = path.resolve(targetDir);\n\n if (resolvedTarget !== resolvedRoot && !resolvedTarget.startsWith(`${resolvedRoot}${path.sep}`)) {\n throw new Error(`target dir escaped uploads root: ${resolvedTarget}`);\n }\n\n let current = resolvedRoot;\n const relative = path.relative(resolvedRoot, resolvedTarget);\n if (!relative) {\n return;\n }\n\n for (const segment of relative.split(path.sep)) {\n current = path.join(current, segment);\n try {\n const info = await lstat(current);\n if (info.isSymbolicLink()) {\n throw new Error(`symlinked upload path segment is not allowed: ${current}`);\n }\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code === \"ENOENT\") {\n continue;\n }\n throw error;\n }\n }\n}\n\nasync function assertDirectorySegmentSafe(segmentPath: string): Promise<void> {\n const info = await lstat(segmentPath);\n if (info.isSymbolicLink()) {\n throw new Error(`symlinked upload path segment is not allowed: ${segmentPath}`);\n }\n if (!info.isDirectory()) {\n throw new Error(`upload path segment is not a directory: ${segmentPath}`);\n }\n}\n\nexport async function ensureSafeUploadDir(rootDir: string, targetDir: string): Promise<void> {\n const resolvedRoot = path.resolve(rootDir);\n const resolvedTarget = path.resolve(targetDir);\n\n if (resolvedTarget !== resolvedRoot && !resolvedTarget.startsWith(`${resolvedRoot}${path.sep}`)) {\n throw new Error(`target dir escaped uploads root: ${resolvedTarget}`);\n }\n\n try {\n await assertDirectorySegmentSafe(resolvedRoot);\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code !== \"ENOENT\") {\n throw error;\n }\n await mkdir(resolvedRoot, { recursive: true });\n await assertDirectorySegmentSafe(resolvedRoot);\n }\n\n const relative = path.relative(resolvedRoot, resolvedTarget);\n if (!relative) {\n return;\n }\n\n let current = resolvedRoot;\n for (const segment of relative.split(path.sep)) {\n current = path.join(current, segment);\n\n try {\n await assertDirectorySegmentSafe(current);\n continue;\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code !== \"ENOENT\") {\n throw error;\n }\n }\n\n try {\n await mkdir(current);\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code !== \"EEXIST\") {\n throw error;\n }\n }\n\n await assertDirectorySegmentSafe(current);\n }\n}\n\nexport function generateBucketPath(input: GenerateBucketPathInput): GenerateBucketPathResult {\n validateWorkspaceId(input.workspaceId);\n\n const now = input.now ?? new Date();\n const dateStr = now.toISOString().slice(0, 10);\n const dir = path.join(input.uploadsDir, input.workspaceId, dateStr);\n const sanitizedName = sanitizeOriginalName(input.originalName);\n const uuid8 = randomUUID().replace(/-/g, \"\").slice(0, 8);\n const absolutePath = path.resolve(dir, `${uuid8}-${sanitizedName}`);\n const uploadsRoot = `${path.resolve(input.uploadsDir)}${path.sep}`;\n\n if (!absolutePath.startsWith(uploadsRoot)) {\n throw new Error(`generated upload path escaped uploads root: ${absolutePath}`);\n }\n\n return {\n dir,\n absolutePath,\n uuid8,\n sanitizedName,\n };\n}\n", "import { readdir, rm, rmdir, stat, unlink } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { UPLOAD_BUCKET_MAX_BYTES, UPLOAD_TTL_HOURS } from \"./constants.js\";\nimport { validateWorkspaceId } from \"./paths.js\";\n\ninterface UploadLogger {\n warn(ctx: Record<string, unknown>, message: string): void;\n}\n\ninterface FileEntry {\n absPath: string;\n size: number;\n mtimeMs: number;\n}\n\nconst WORKSPACE_ID_RE_FOR_GC = /^[a-zA-Z0-9_-]+$/;\n\nasync function listFilesRecursive(root: string): Promise<FileEntry[]> {\n let entries: import(\"node:fs\").Dirent[];\n try {\n entries = await readdir(root, { withFileTypes: true });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return [];\n }\n throw error;\n }\n\n const files: FileEntry[] = [];\n for (const entry of entries) {\n const childPath = path.join(root, entry.name);\n if (entry.isDirectory()) {\n files.push(...(await listFilesRecursive(childPath)));\n continue;\n }\n\n if (!entry.isFile()) {\n continue;\n }\n\n const fileStat = await stat(childPath);\n files.push({\n absPath: childPath,\n size: fileStat.size,\n mtimeMs: fileStat.mtimeMs,\n });\n }\n\n return files;\n}\n\nasync function pruneEmptyDirectories(root: string): Promise<void> {\n let entries: import(\"node:fs\").Dirent[];\n try {\n entries = await readdir(root, { withFileTypes: true });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return;\n }\n throw error;\n }\n\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n continue;\n }\n await pruneEmptyDirectories(path.join(root, entry.name));\n }\n\n const remainingEntries = await readdir(root).catch(() => [] as string[]);\n if (remainingEntries.length === 0) {\n await rmdir(root).catch(() => undefined);\n }\n}\n\nexport async function deleteWorkspaceUploads(\n uploadsDir: string,\n workspaceId: string\n): Promise<void> {\n validateWorkspaceId(workspaceId);\n const bucket = path.join(uploadsDir, workspaceId);\n await rm(bucket, { recursive: true, force: true });\n}\n\nexport async function enforceBucketCap(\n uploadsDir: string,\n workspaceId: string,\n capBytes: number,\n logger?: UploadLogger\n): Promise<void> {\n validateWorkspaceId(workspaceId);\n const bucket = path.join(uploadsDir, workspaceId);\n const files = await listFilesRecursive(bucket);\n const totalBytes = files.reduce((sum, file) => sum + file.size, 0);\n\n if (totalBytes <= capBytes) {\n return;\n }\n\n files.sort((a, b) => a.mtimeMs - b.mtimeMs);\n let remainingBytes = totalBytes;\n\n for (const file of files) {\n if (remainingBytes <= capBytes) {\n break;\n }\n\n try {\n await unlink(file.absPath);\n remainingBytes -= file.size;\n } catch (error) {\n logger?.warn(\n { err: error, file: file.absPath },\n \"failed to evict file during bucket cap enforcement\"\n );\n }\n }\n\n await pruneEmptyDirectories(bucket);\n}\n\nexport async function runStartupGc(uploadsDir: string, logger?: UploadLogger): Promise<void> {\n const cutoffMs = Date.now() - UPLOAD_TTL_HOURS * 3_600_000;\n\n let workspaceEntries: import(\"node:fs\").Dirent[];\n try {\n workspaceEntries = await readdir(uploadsDir, { withFileTypes: true });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return;\n }\n logger?.warn({ err: error, uploadsDir }, \"startup gc: failed to list root\");\n return;\n }\n\n for (const workspaceEntry of workspaceEntries) {\n if (!workspaceEntry.isDirectory()) {\n continue;\n }\n\n const workspaceDir = path.join(uploadsDir, workspaceEntry.name);\n const dateEntries = await readdir(workspaceDir, { withFileTypes: true }).catch(\n () => [] as import(\"node:fs\").Dirent[]\n );\n\n for (const dateEntry of dateEntries) {\n if (!dateEntry.isDirectory()) {\n continue;\n }\n\n const dateDir = path.join(workspaceDir, dateEntry.name);\n const files = await listFilesRecursive(dateDir);\n\n for (const file of files) {\n if (file.mtimeMs >= cutoffMs) {\n continue;\n }\n\n try {\n await unlink(file.absPath);\n } catch (error) {\n logger?.warn({ err: error, filePath: file.absPath }, \"startup gc: failed on file\");\n }\n }\n\n await pruneEmptyDirectories(dateDir);\n }\n\n if (WORKSPACE_ID_RE_FOR_GC.test(workspaceEntry.name)) {\n await enforceBucketCap(uploadsDir, workspaceEntry.name, UPLOAD_BUCKET_MAX_BYTES, logger);\n }\n\n await pruneEmptyDirectories(workspaceDir);\n }\n}\n", "import { createWriteStream } from \"node:fs\";\nimport { rm, stat, writeFile } from \"node:fs/promises\";\nimport { pipeline } from \"node:stream/promises\";\nimport type { FastifyInstance, FastifyReply, FastifyRequest } from \"fastify\";\nimport { enforceBucketCap } from \"../uploads/cleanup.js\";\nimport { MAX_FILES_PER_BATCH, UPLOAD_BUCKET_MAX_BYTES } from \"../uploads/constants.js\";\nimport { ensureSafeUploadDir, generateBucketPath } from \"../uploads/paths.js\";\n\ninterface UploadLogger {\n warn(ctx: Record<string, unknown>, message: string): void;\n}\n\ninterface Deps {\n uploadsDir: string;\n workspaceMgr: { get(id: string): { path: string } | null | undefined };\n}\n\ninterface UploadedFileMeta {\n path: string;\n originalName: string;\n size: number;\n}\n\ntype WorkspaceLookup = { path: string };\n\nfunction inferClipboardFilename(\n filename: string | undefined,\n mimeType: string | undefined,\n now: Date\n): string {\n const trimmed = filename?.trim();\n if (trimmed) {\n return trimmed;\n }\n\n const hhmmss = now.toISOString().slice(11, 19).replace(/:/g, \"\");\n let ext = \"bin\";\n if (mimeType === \"image/png\") {\n ext = \"png\";\n } else if (mimeType === \"image/jpeg\") {\n ext = \"jpg\";\n } else if (mimeType === \"image/webp\") {\n ext = \"webp\";\n } else if (mimeType === \"application/pdf\") {\n ext = \"pdf\";\n }\n\n return `screenshot-${hhmmss}.${ext}`;\n}\n\nasync function cleanupWrittenFiles(files: UploadedFileMeta[]): Promise<void> {\n await Promise.all(files.map((file) => rm(file.path, { force: true })));\n}\n\nfunction getRequestLogger(request: FastifyRequest): UploadLogger | undefined {\n const logger = request.log as UploadLogger | undefined;\n if (logger && typeof logger.warn === \"function\") {\n return logger;\n }\n return undefined;\n}\n\nasync function rejectAndCleanup(\n reply: FastifyReply,\n written: UploadedFileMeta[],\n statusCode: number,\n error: string\n) {\n await cleanupWrittenFiles(written);\n return reply.status(statusCode).send({ ok: false, error });\n}\n\nfunction getActiveWorkspace(deps: Deps, workspaceId: string | undefined): WorkspaceLookup | null {\n if (!workspaceId) {\n return null;\n }\n\n return deps.workspaceMgr.get(workspaceId) ?? null;\n}\n\nasync function ensureWorkspaceStillActive(\n deps: Deps,\n workspaceId: string | undefined,\n reply: FastifyReply,\n written: UploadedFileMeta[]\n): Promise<WorkspaceLookup | null> {\n const workspace = getActiveWorkspace(deps, workspaceId);\n if (!workspace) {\n await rejectAndCleanup(reply, written, 404, \"workspace_not_found\");\n return null;\n }\n\n return workspace;\n}\n\nfunction lockWorkspaceId(\n currentWorkspaceId: string | undefined,\n nextWorkspaceId: string\n): string | \"mismatch\" {\n if (!currentWorkspaceId) {\n return nextWorkspaceId;\n }\n return currentWorkspaceId === nextWorkspaceId ? currentWorkspaceId : \"mismatch\";\n}\n\nexport function registerUploadsRoute(app: FastifyInstance, deps: Deps): void {\n app.post(\"/api/uploads\", async (request: FastifyRequest, reply: FastifyReply) => {\n if (!request.isMultipart()) {\n return reply.status(400).send({ ok: false, error: \"expected_multipart\" });\n }\n\n let workspaceId: string | undefined;\n let workspaceValidated = false;\n let fileCount = 0;\n const written: UploadedFileMeta[] = [];\n const logger = getRequestLogger(request);\n\n try {\n const parts = request.parts();\n for await (const part of parts) {\n if (part.type === \"field\" && part.fieldname === \"workspaceId\") {\n const lockedWorkspaceId = lockWorkspaceId(workspaceId, String(part.value));\n if (lockedWorkspaceId === \"mismatch\") {\n return rejectAndCleanup(reply, written, 400, \"workspace_mismatch\");\n }\n workspaceId = lockedWorkspaceId;\n if (!getActiveWorkspace(deps, workspaceId)) {\n return rejectAndCleanup(reply, written, 404, \"workspace_not_found\");\n }\n workspaceValidated = true;\n continue;\n }\n\n if (part.type === \"field\" && part.fieldname === \"files\") {\n if (!workspaceId) {\n return rejectAndCleanup(reply, written, 400, \"workspace_required\");\n }\n\n fileCount += 1;\n if (fileCount > MAX_FILES_PER_BATCH) {\n return rejectAndCleanup(reply, written, 400, \"too_many_files\");\n }\n\n const now = new Date();\n const originalName = inferClipboardFilename(undefined, part.mimetype, now);\n const target = generateBucketPath({\n uploadsDir: deps.uploadsDir,\n workspaceId,\n originalName,\n now,\n });\n\n if (!(await ensureWorkspaceStillActive(deps, workspaceId, reply, written))) {\n return;\n }\n\n try {\n await ensureSafeUploadDir(deps.uploadsDir, target.dir);\n await writeFile(target.absolutePath, String(part.value));\n } catch (error) {\n await rm(target.absolutePath, { force: true });\n await cleanupWrittenFiles(written);\n logger?.warn({ err: error }, \"upload write failed\");\n return reply.status(500).send({ ok: false, error: \"write_failed\" });\n }\n\n try {\n const fileStat = await stat(target.absolutePath);\n written.push({\n path: target.absolutePath,\n originalName,\n size: fileStat.size,\n });\n } catch (error) {\n await rm(target.absolutePath, { force: true });\n await cleanupWrittenFiles(written);\n logger?.warn({ err: error }, \"upload stat failed\");\n return reply.status(500).send({ ok: false, error: \"write_failed\" });\n }\n\n continue;\n }\n\n if (part.type !== \"file\" || part.fieldname !== \"files\") {\n if (part.type === \"file\") {\n part.file.resume();\n }\n continue;\n }\n\n if (!workspaceId) {\n part.file.resume();\n return rejectAndCleanup(reply, written, 400, \"workspace_required\");\n }\n\n fileCount += 1;\n if (fileCount > MAX_FILES_PER_BATCH) {\n part.file.resume();\n return rejectAndCleanup(reply, written, 400, \"too_many_files\");\n }\n\n const now = new Date();\n const originalName = inferClipboardFilename(part.filename, part.mimetype, now);\n const target = generateBucketPath({\n uploadsDir: deps.uploadsDir,\n workspaceId,\n originalName,\n now,\n });\n\n if (!(await ensureWorkspaceStillActive(deps, workspaceId, reply, written))) {\n part.file.resume();\n return;\n }\n\n try {\n await ensureSafeUploadDir(deps.uploadsDir, target.dir);\n await pipeline(part.file, createWriteStream(target.absolutePath));\n } catch (error) {\n await rm(target.absolutePath, { force: true });\n await cleanupWrittenFiles(written);\n logger?.warn({ err: error }, \"upload write failed\");\n return reply.status(500).send({ ok: false, error: \"write_failed\" });\n }\n\n if (part.file.truncated) {\n await rm(target.absolutePath, { force: true });\n await cleanupWrittenFiles(written);\n return reply.status(413).send({ ok: false, error: \"file_too_large\" });\n }\n\n try {\n const fileStat = await stat(target.absolutePath);\n written.push({\n path: target.absolutePath,\n originalName,\n size: fileStat.size,\n });\n } catch (error) {\n await rm(target.absolutePath, { force: true });\n await cleanupWrittenFiles(written);\n logger?.warn({ err: error }, \"upload stat failed\");\n return reply.status(500).send({ ok: false, error: \"write_failed\" });\n }\n }\n } catch (error) {\n await cleanupWrittenFiles(written);\n if ((error as { code?: string }).code === \"FST_REQ_FILE_TOO_LARGE\") {\n return reply.status(413).send({ ok: false, error: \"file_too_large\" });\n }\n logger?.warn({ err: error }, \"upload parse failed\");\n return reply.status(400).send({ ok: false, error: \"parse_failed\" });\n }\n\n if (!workspaceId) {\n return rejectAndCleanup(reply, written, 400, \"workspace_required\");\n }\n\n if (!workspaceValidated) {\n return rejectAndCleanup(reply, written, 404, \"workspace_not_found\");\n }\n\n if (written.length === 0) {\n return rejectAndCleanup(reply, written, 400, \"no_files\");\n }\n\n if (!(await ensureWorkspaceStillActive(deps, workspaceId, reply, written))) {\n return;\n }\n\n void enforceBucketCap(deps.uploadsDir, workspaceId, UPLOAD_BUCKET_MAX_BYTES, logger).catch(\n (error) => logger?.warn({ err: error }, \"bucket cap enforcement failed\")\n );\n\n return reply.send({ ok: true, files: written });\n });\n}\n", "/**\n * Fastify App Assembly\n *\n * Builds the Fastify application with all routes and middleware\n */\n\nimport compress from \"@fastify/compress\";\nimport cors from \"@fastify/cors\";\nimport multipart from \"@fastify/multipart\";\nimport staticPlugin from \"@fastify/static\";\nimport websocket, { type WebSocket } from \"@fastify/websocket\";\nimport type { FastifyRequest } from \"fastify\";\nimport Fastify, { type FastifyInstance, type FastifyServerOptions } from \"fastify\";\nimport {\n createAuthGuard,\n registerAuthLogoutRoute,\n registerAuthRoutes,\n registerAuthStatusRoute,\n} from \"./auth/index.js\";\nimport type { ServerConfig } from \"./config.js\";\nimport { registerFileAssetRoutes } from \"./routes/file-asset.js\";\nimport { registerUploadsRoute } from \"./routes/uploads.js\";\nimport type { Database } from \"./storage/database.js\";\nimport type { AuthLoginBlockRepo } from \"./storage/repositories/auth-login-block-repo.js\";\nimport type { AuthSessionRepo } from \"./storage/repositories/auth-session-repo.js\";\nimport { MAX_FILE_BYTES, MAX_FILES_PER_BATCH } from \"./uploads/constants.js\";\nimport { isFrontendNavigationRequest } from \"./web-ui-routing.js\";\nimport type { WorkspaceManager } from \"./workspace/manager.js\";\nimport type { WsHub } from \"./ws/hub.js\";\n\ninterface AppDeps {\n wsHub: WsHub;\n db: Database;\n webRoot?: string;\n workspaceMgr: WorkspaceManager;\n config: ServerConfig;\n authSessionRepo: AuthSessionRepo;\n authLoginBlockRepo: AuthLoginBlockRepo;\n logger?: FastifyServerOptions[\"logger\"];\n}\n\n/**\n * Build Fastify application\n */\nexport async function buildFastifyApp(deps: AppDeps): Promise<FastifyInstance> {\n const app = Fastify({\n logger: deps.logger ?? {\n level: \"info\",\n transport: {\n target: \"pino-pretty\",\n options: {\n translateTime: \"HH:MM:ss Z\",\n ignore: \"pid,hostname\",\n },\n },\n },\n });\n\n // WebSocket plugin - routes must be registered within this scope\n await app.register(async function (fastify) {\n await fastify.register(websocket, {\n options: {\n // permessage-deflate: terminal ANSI streams (repeated escape codes,\n // whitespace, color sequences) typically compress 5-10x. Cross-message\n // context takeover is left enabled (default) so the zlib dictionary\n // persists across frames for highest ratio on continuous streams.\n perMessageDeflate: {\n threshold: 1024,\n zlibDeflateOptions: { level: 6 },\n },\n },\n });\n\n // WebSocket endpoint - connection is the WebSocket directly in v11+\n fastify.get(\"/ws\", { websocket: true }, (connection: WebSocket, req: FastifyRequest) => {\n deps.wsHub.handleConnection(connection, req);\n });\n });\n\n // Phase 2: Configurable auth middleware\n app.addHook(\n \"onRequest\",\n createAuthGuard({\n config: deps.config,\n authSessionRepo: deps.authSessionRepo,\n authLoginBlockRepo: deps.authLoginBlockRepo,\n })\n );\n\n await app.register(compress);\n\n await app.register(multipart, {\n limits: {\n fileSize: MAX_FILE_BYTES,\n files: MAX_FILES_PER_BATCH,\n },\n isPartAFile: (fieldName, contentType, fileName) =>\n fieldName === \"files\" || contentType === \"application/octet-stream\" || fileName !== undefined,\n });\n\n // CORS configuration (development mode)\n await app.register(cors, {\n origin: true, // Allow all origins in development\n methods: [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"OPTIONS\"],\n allowedHeaders: [\"Content-Type\", \"Authorization\"],\n credentials: true,\n });\n\n // Auth endpoints\n app.get(\n \"/auth/status\",\n registerAuthStatusRoute({\n config: deps.config,\n authSessionRepo: deps.authSessionRepo,\n authLoginBlockRepo: deps.authLoginBlockRepo,\n })\n );\n app.post(\n \"/auth/login\",\n registerAuthRoutes({\n config: deps.config,\n authSessionRepo: deps.authSessionRepo,\n authLoginBlockRepo: deps.authLoginBlockRepo,\n })\n );\n app.post(\n \"/auth/logout\",\n registerAuthLogoutRoute({\n config: deps.config,\n authSessionRepo: deps.authSessionRepo,\n authLoginBlockRepo: deps.authLoginBlockRepo,\n })\n );\n\n // Health check endpoint\n app.get(\"/healthz\", async () => {\n return { ok: true };\n });\n\n // /api/file \u2014 binary streaming endpoint used by the editor's image preview.\n // Auth is inherited from the global onRequest cookie guard above, so this\n // only needs its own path-safety and allowlist checks.\n registerFileAssetRoutes(app, {\n workspaceMgr: deps.workspaceMgr,\n });\n\n registerUploadsRoute(app, {\n uploadsDir: deps.config.uploadsDir,\n workspaceMgr: deps.workspaceMgr,\n });\n\n // Static file serving (for web UI)\n if (deps.webRoot) {\n app.register(staticPlugin, {\n root: deps.webRoot,\n prefix: \"/\",\n wildcard: false,\n globIgnore: [\"index.html\", \"assets/**\"],\n maxAge: \"1y\",\n immutable: true,\n });\n\n app.register(staticPlugin, {\n root: `${deps.webRoot}/assets`,\n prefix: \"/assets/\",\n maxAge: \"1y\",\n immutable: true,\n wildcard: true,\n decorateReply: false,\n });\n\n app.get(\"/\", async (_request, reply) => {\n return reply.sendFile(\"index.html\", {\n maxAge: 0,\n immutable: false,\n });\n });\n\n app.get(\"/index.html\", async (_request, reply) => {\n return reply.sendFile(\"index.html\", {\n maxAge: 0,\n immutable: false,\n });\n });\n\n app.get(\"/*\", async (request, reply) => {\n if (!isFrontendNavigationRequest(request)) {\n return reply.callNotFound();\n }\n return reply.sendFile(\"index.html\", {\n maxAge: 0,\n immutable: false,\n });\n });\n }\n\n return app;\n}\n", "import type { EventBus } from \"../bus/event-bus.js\";\nimport type { SettingsRepo } from \"../storage/repositories/settings-repo.js\";\nimport type { WorkspaceManager } from \"../workspace/manager.js\";\n\nconst PERIOD_SETTING_KEY = \"git.autofetchPeriodSec\";\nconst DEFAULT_PERIOD_SEC = 180;\nconst TICK_INTERVAL_MS = 1_000;\nconst OPEN_TIME_COOLDOWN_MS = 5 * 60 * 1_000;\nconst MAX_CONSECUTIVE_FAILURES = 3;\nconst JITTER_RATIO = 0.1;\n\nexport interface AutoFetchRuntime {\n registerViewer(clientId: string, workspaceId: string): void;\n unregisterViewer(clientId: string): void;\n triggerOpenTimeFetch(workspaceId: string): void;\n recordSuccess(workspaceId: string): void;\n recordFailure(workspaceId: string): void;\n getLastFetchAt(workspaceId: string): number | undefined;\n runExclusive?<T>(workspaceId: string, op: () => Promise<T>): Promise<T>;\n start(): void;\n stop(): void;\n}\n\nexport interface AutoFetchDeps {\n workspaceMgr: Pick<WorkspaceManager, \"get\">;\n eventBus: EventBus;\n settingsRepo: Pick<SettingsRepo, \"get\">;\n runFetch: (workspaceId: string) => Promise<void>;\n now?: () => number;\n random?: () => number;\n setTimeout?: typeof globalThis.setTimeout;\n setInterval?: typeof globalThis.setInterval;\n clearInterval?: typeof globalThis.clearInterval;\n clearTimeout?: typeof globalThis.clearTimeout;\n}\n\ninterface WorkspaceFetchState {\n viewerCount: number;\n lastFetchAt?: number;\n consecutiveFailures: number;\n inFlight: boolean;\n blocked: boolean;\n nextFetchAt?: number;\n waiters: Array<() => void>;\n}\n\nexport class AutoFetchScheduler implements AutoFetchRuntime {\n private readonly clientWorkspaceMap = new Map<string, string>();\n private readonly workspaceStateMap = new Map<string, WorkspaceFetchState>();\n private readonly now: () => number;\n private readonly random: () => number;\n private readonly setTimeoutFn: typeof globalThis.setTimeout;\n private readonly setIntervalFn: typeof globalThis.setInterval;\n private readonly clearIntervalFn: typeof globalThis.clearInterval;\n private readonly clearTimeoutFn: typeof globalThis.clearTimeout;\n private readonly pendingTimeouts = new Set<ReturnType<typeof setTimeout>>();\n private tickTimer: ReturnType<typeof setInterval> | null = null;\n private stopped = false;\n\n constructor(private readonly deps: AutoFetchDeps) {\n this.now = deps.now ?? Date.now;\n this.random = deps.random ?? (() => 0.5);\n this.setTimeoutFn = deps.setTimeout ?? globalThis.setTimeout;\n this.setIntervalFn = deps.setInterval ?? globalThis.setInterval;\n this.clearIntervalFn = deps.clearInterval ?? globalThis.clearInterval;\n this.clearTimeoutFn = deps.clearTimeout ?? globalThis.clearTimeout;\n this.start();\n }\n\n registerViewer(clientId: string, workspaceId: string): void {\n const previousWorkspaceId = this.clientWorkspaceMap.get(clientId);\n if (previousWorkspaceId === workspaceId) {\n return;\n }\n\n if (previousWorkspaceId) {\n this.unregisterViewer(clientId);\n }\n\n this.clientWorkspaceMap.set(clientId, workspaceId);\n\n const state = this.getOrCreateState(workspaceId);\n state.viewerCount += 1;\n if (state.viewerCount === 1) {\n state.blocked = false;\n state.consecutiveFailures = 0;\n }\n\n this.ensureNextPeriodicFetch(state, false);\n }\n\n unregisterViewer(clientId: string): void {\n const workspaceId = this.clientWorkspaceMap.get(clientId);\n if (!workspaceId) {\n return;\n }\n\n this.clientWorkspaceMap.delete(clientId);\n\n const state = this.workspaceStateMap.get(workspaceId);\n if (!state) {\n return;\n }\n\n state.viewerCount = Math.max(0, state.viewerCount - 1);\n if (state.viewerCount === 0) {\n state.blocked = false;\n state.consecutiveFailures = 0;\n state.nextFetchAt = undefined;\n }\n }\n\n triggerOpenTimeFetch(workspaceId: string): void {\n const state = this.getOrCreateState(workspaceId);\n const lastFetchAt = state.lastFetchAt;\n\n if (this.stopped || state.inFlight) {\n return;\n }\n\n if (lastFetchAt !== undefined && this.now() - lastFetchAt < OPEN_TIME_COOLDOWN_MS) {\n return;\n }\n\n const timer = this.setTimeoutFn(() => {\n this.pendingTimeouts.delete(timer);\n if (this.stopped) {\n return;\n }\n void this.fetchWorkspace(workspaceId, \"open\");\n }, 0);\n this.pendingTimeouts.add(timer);\n }\n\n recordSuccess(workspaceId: string): void {\n const state = this.getOrCreateState(workspaceId);\n state.lastFetchAt = this.now();\n state.consecutiveFailures = 0;\n state.blocked = false;\n state.nextFetchAt = undefined;\n this.ensureNextPeriodicFetch(state, true);\n }\n\n recordFailure(workspaceId: string): void {\n const state = this.getOrCreateState(workspaceId);\n state.consecutiveFailures += 1;\n state.nextFetchAt = undefined;\n\n if (state.consecutiveFailures >= MAX_CONSECUTIVE_FAILURES) {\n state.blocked = true;\n return;\n }\n\n this.ensureNextPeriodicFetch(state, true);\n }\n\n getLastFetchAt(workspaceId: string): number | undefined {\n return this.workspaceStateMap.get(workspaceId)?.lastFetchAt;\n }\n\n async runExclusive<T>(workspaceId: string, op: () => Promise<T>): Promise<T> {\n const release = await this.acquireWorkspaceOperation(workspaceId);\n try {\n return await op();\n } finally {\n release();\n }\n }\n\n start(): void {\n if (this.tickTimer) {\n return;\n }\n\n this.stopped = false;\n this.tickTimer = this.setIntervalFn(() => {\n this.evaluateDueFetches();\n }, TICK_INTERVAL_MS);\n }\n\n stop(): void {\n if (this.tickTimer) {\n this.clearIntervalFn(this.tickTimer);\n this.tickTimer = null;\n }\n\n this.stopped = true;\n for (const timer of this.pendingTimeouts) {\n this.clearTimeoutFn(timer);\n }\n this.pendingTimeouts.clear();\n }\n\n private evaluateDueFetches(): void {\n const now = this.now();\n\n for (const [workspaceId, state] of this.workspaceStateMap) {\n if (!this.shouldCheckWorkspace(state)) {\n continue;\n }\n\n if (state.nextFetchAt === undefined) {\n this.ensureNextPeriodicFetch(state, false);\n }\n\n if (state.nextFetchAt === undefined || state.nextFetchAt > now) {\n continue;\n }\n\n void this.fetchWorkspace(workspaceId, \"periodic\", state.nextFetchAt);\n }\n }\n\n private shouldCheckWorkspace(state: WorkspaceFetchState): boolean {\n return this.getPeriodMs() > 0 && state.viewerCount > 0 && !state.inFlight && !state.blocked;\n }\n\n private ensureNextPeriodicFetch(state: WorkspaceFetchState, resetSchedule: boolean): void {\n const periodMs = this.getPeriodMs();\n if (periodMs <= 0 || state.viewerCount <= 0 || state.blocked || state.inFlight) {\n return;\n }\n\n if (!resetSchedule && state.nextFetchAt !== undefined) {\n return;\n }\n\n if (state.lastFetchAt === undefined) {\n state.nextFetchAt = this.now();\n return;\n }\n\n const nextFetchAt = state.lastFetchAt + this.getJitteredPeriodMs(periodMs);\n state.nextFetchAt = Math.max(this.now(), nextFetchAt);\n }\n\n private getPeriodMs(): number {\n const configuredPeriodSec = this.deps.settingsRepo.get<number>(PERIOD_SETTING_KEY);\n const periodSec = configuredPeriodSec ?? DEFAULT_PERIOD_SEC;\n return Math.max(0, periodSec) * 1_000;\n }\n\n private getJitteredPeriodMs(periodMs: number): number {\n const jitterScale = 1 + (this.random() - 0.5) * 2 * JITTER_RATIO;\n return Math.round(periodMs * jitterScale);\n }\n\n private getOrCreateState(workspaceId: string): WorkspaceFetchState {\n const existingState = this.workspaceStateMap.get(workspaceId);\n if (existingState) {\n return existingState;\n }\n\n const state: WorkspaceFetchState = {\n viewerCount: 0,\n consecutiveFailures: 0,\n inFlight: false,\n blocked: false,\n waiters: [],\n };\n this.workspaceStateMap.set(workspaceId, state);\n return state;\n }\n\n private async fetchWorkspace(\n workspaceId: string,\n mode: \"open\" | \"periodic\",\n scheduledAt?: number\n ): Promise<void> {\n if (this.stopped) {\n return;\n }\n\n const state = this.getOrCreateState(workspaceId);\n if (state.inFlight || state.blocked) {\n return;\n }\n\n if (!this.deps.workspaceMgr.get(workspaceId)) {\n state.nextFetchAt = undefined;\n return;\n }\n\n await this.runExclusive(workspaceId, async () => {\n const currentState = this.getOrCreateState(workspaceId);\n if (this.stopped || currentState.blocked) {\n return;\n }\n\n if (!this.deps.workspaceMgr.get(workspaceId)) {\n currentState.nextFetchAt = undefined;\n return;\n }\n\n if (mode === \"open\") {\n const lastFetchAt = currentState.lastFetchAt;\n if (lastFetchAt !== undefined && this.now() - lastFetchAt < OPEN_TIME_COOLDOWN_MS) {\n return;\n }\n } else if (\n scheduledAt !== undefined &&\n currentState.lastFetchAt !== undefined &&\n currentState.lastFetchAt >= scheduledAt\n ) {\n return;\n }\n\n try {\n await this.deps.runFetch(workspaceId);\n this.recordSuccess(workspaceId);\n } catch {\n this.recordFailure(workspaceId);\n }\n });\n }\n\n private acquireWorkspaceOperation(workspaceId: string): Promise<() => void> {\n const state = this.getOrCreateState(workspaceId);\n\n return new Promise((resolve) => {\n const grant = () => {\n state.inFlight = true;\n state.nextFetchAt = undefined;\n\n let released = false;\n resolve(() => {\n if (released) {\n return;\n }\n released = true;\n\n const next = state.waiters.shift();\n if (next) {\n next();\n return;\n }\n\n state.inFlight = false;\n this.ensureNextPeriodicFetch(state, true);\n });\n };\n\n if (state.inFlight) {\n state.waiters.push(grant);\n return;\n }\n\n grant();\n });\n }\n}\n", "import { spawn } from \"node:child_process\";\nimport { shouldUseShellForCommand } from \"@coder-studio/utils\";\n\nexport type CommandRunnerOptions = { windowsHide?: boolean };\n\nexport interface CommandRunnerResult {\n stdout: string;\n stderr: string;\n}\n\nexport type CommandRunner = (\n file: string,\n args: string[],\n options?: CommandRunnerOptions\n) => Promise<CommandRunnerResult>;\n\nexport async function runCommandAsString(\n file: string,\n args: string[],\n options?: CommandRunnerOptions\n): Promise<CommandRunnerResult> {\n return new Promise((resolve, reject) => {\n const child = spawn(file, args, {\n shell: shouldUseShellForCommand(file, process.platform),\n windowsHide: options?.windowsHide ?? true,\n });\n\n const stdoutChunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n\n child.stdout?.on(\"data\", (chunk: string | Buffer) => {\n stdoutChunks.push(typeof chunk === \"string\" ? Buffer.from(chunk) : chunk);\n });\n\n child.stderr?.on(\"data\", (chunk: string | Buffer) => {\n stderrChunks.push(typeof chunk === \"string\" ? Buffer.from(chunk) : chunk);\n });\n\n child.on(\"error\", (error) => {\n reject(\n Object.assign(error, {\n stdout: Buffer.concat(stdoutChunks).toString(\"utf8\"),\n stderr: Buffer.concat(stderrChunks).toString(\"utf8\"),\n })\n );\n });\n\n child.on(\"close\", (code) => {\n const stdout = Buffer.concat(stdoutChunks).toString(\"utf8\");\n const stderr = Buffer.concat(stderrChunks).toString(\"utf8\");\n\n if (code === 0) {\n resolve({ stdout, stderr });\n return;\n }\n\n reject(\n Object.assign(new Error(`Command failed with exit code ${code ?? \"unknown\"}`), {\n exitCode: code ?? undefined,\n stdout,\n stderr,\n })\n );\n });\n });\n}\n", "export type CommandAvailabilityCheck = (command: string) => Promise<boolean>;\n\nimport { type CommandRunner, runCommandAsString } from \"./command-runner.js\";\n\nexport interface CommandCheckDeps {\n platform?: NodeJS.Platform;\n runCommand?: CommandRunner;\n}\n\nexport function getCommandLookupExecutable(platform: NodeJS.Platform): \"where\" | \"which\" {\n return platform === \"win32\" ? \"where\" : \"which\";\n}\n\nexport async function checkCommandAvailable(\n command: string,\n deps: CommandCheckDeps = {}\n): Promise<boolean> {\n const platform = deps.platform ?? process.platform;\n const runCommand = deps.runCommand ?? runCommandAsString;\n const lookup = getCommandLookupExecutable(platform);\n\n try {\n const { stdout } = await runCommand(lookup, [command], { windowsHide: true });\n return stdout.trim().length > 0;\n } catch {\n return false;\n }\n}\n", "import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { type CommandAvailabilityCheck, checkCommandAvailable } from \"./command-check.js\";\nimport { type CommandRunner, runCommandAsString } from \"./command-runner.js\";\n\ntype MockProviderId = \"claude\" | \"codex\";\ntype MockInstallResult = \"success\" | \"permission_denied\" | \"command_not_found\";\n\ninterface MockInstallBehavior {\n result: MockInstallResult;\n message?: string;\n}\n\ninterface ProviderMockState {\n commands?: Partial<Record<string, boolean>>;\n installBehavior?: Partial<Record<MockProviderId, MockInstallBehavior>>;\n}\n\ninterface ProviderMockOverrides {\n commandExists: CommandAvailabilityCheck;\n runCommand: CommandRunner;\n}\n\nconst PROVIDER_INSTALL_PACKAGES: Record<MockProviderId, string> = {\n claude: \"@anthropic-ai/claude-code\",\n codex: \"@openai/codex\",\n};\n\nconst PROVIDER_COMMAND_SCRIPTS: Record<MockProviderId, string> = {\n claude: `#!/usr/bin/env bash\nset -euo pipefail\ntrap 'exit 0' TERM INT\nprintf 'Mock Claude ready\\\\n'\nwhile true; do\n sleep 1\ndone\n`,\n codex: `#!/usr/bin/env bash\nset -euo pipefail\ntrap 'exit 0' TERM INT\nprintf 'Session ID: abcdef-123456\\\\n> '\nwhile true; do\n sleep 1\ndone\n`,\n};\n\nexport function createE2EProviderMockOverrides(\n env: NodeJS.ProcessEnv = process.env\n): ProviderMockOverrides | null {\n const statePath = env.CODER_STUDIO_E2E_PROVIDER_STATE_PATH;\n if (!statePath) {\n return null;\n }\n\n const binDir = env.CODER_STUDIO_E2E_PROVIDER_BIN_DIR;\n const debugLogPath = env.CODER_STUDIO_E2E_PROVIDER_DEBUG_LOG_PATH;\n\n appendDebugLog(debugLogPath, `init statePath=${statePath} binDir=${binDir ?? \"\"}`);\n\n const commandExists: CommandAvailabilityCheck = async (command: string) => {\n const state = readMockState(statePath);\n const override = state.commands?.[command];\n appendDebugLog(\n debugLogPath,\n `commandExists ${command} override=${String(override)} state=${JSON.stringify(state.commands ?? {})}`\n );\n\n if (typeof override === \"boolean\") {\n return override;\n }\n\n return checkCommandAvailable(command);\n };\n\n const runCommand: CommandRunner = async (file, args, options) => {\n const providerId = getInstallProviderId(file, args);\n appendDebugLog(\n debugLogPath,\n `runCommand ${file} ${args.join(\" \")} provider=${providerId ?? \"none\"}`\n );\n if (!providerId) {\n return runCommandAsString(file, args, options);\n }\n\n const state = readMockState(statePath);\n const behavior = state.installBehavior?.[providerId];\n appendDebugLog(\n debugLogPath,\n `behavior ${providerId} ${JSON.stringify(behavior)} state=${JSON.stringify(state)}`\n );\n if (!behavior) {\n return runCommandAsString(file, args, options);\n }\n\n if (behavior.result === \"success\") {\n writeMockState(statePath, (draft) => {\n draft.commands ??= {};\n draft.commands[providerId] = true;\n });\n\n if (binDir) {\n ensureProviderCommand(binDir, providerId);\n }\n\n appendDebugLog(debugLogPath, `install success ${providerId}`);\n\n return {\n stdout: `installed ${providerId}`,\n stderr: \"\",\n };\n }\n\n const message =\n behavior.message ??\n (behavior.result === \"permission_denied\" ? \"permission denied\" : \"command not found\");\n\n throw Object.assign(new Error(message), {\n exitCode: 1,\n stdout: \"\",\n stderr: message,\n });\n };\n\n return {\n commandExists,\n runCommand,\n };\n}\n\nfunction getInstallProviderId(file: string, args: string[]): MockProviderId | null {\n if (file !== \"npm\" || args.length !== 3) {\n return null;\n }\n\n if (args[0] !== \"install\" || args[1] !== \"-g\") {\n return null;\n }\n\n const packageName = args[2];\n if (packageName === PROVIDER_INSTALL_PACKAGES.claude) {\n return \"claude\";\n }\n if (packageName === PROVIDER_INSTALL_PACKAGES.codex) {\n return \"codex\";\n }\n\n return null;\n}\n\nfunction readMockState(statePath: string): ProviderMockState {\n if (!existsSync(statePath)) {\n return {};\n }\n\n const raw = readFileSync(statePath, \"utf8\");\n if (!raw.trim()) {\n return {};\n }\n\n try {\n return JSON.parse(raw) as ProviderMockState;\n } catch (error) {\n throw new Error(\n `Invalid provider mock state at ${statePath}: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n\nfunction writeMockState(\n statePath: string,\n updater: (state: ProviderMockState) => void\n): ProviderMockState {\n const nextState = readMockState(statePath);\n updater(nextState);\n mkdirSync(dirname(statePath), { recursive: true });\n writeFileSync(statePath, JSON.stringify(nextState, null, 2));\n return nextState;\n}\n\nfunction ensureProviderCommand(binDir: string, providerId: MockProviderId): void {\n mkdirSync(binDir, { recursive: true });\n const scriptPath = join(binDir, providerId);\n writeFileSync(scriptPath, PROVIDER_COMMAND_SCRIPTS[providerId], \"utf8\");\n chmodSync(scriptPath, 0o755);\n}\n\nfunction appendDebugLog(path: string | undefined, line: string): void {\n if (!path) {\n return;\n }\n\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, `${line}\\n`, { flag: \"a\" });\n}\n", "import { randomUUID } from \"node:crypto\";\nimport type {\n ProviderDefinition,\n ProviderInstallFailure,\n ProviderInstallJobSnapshot,\n ProviderInstallStepSnapshot,\n} from \"@coder-studio/core\";\nimport {\n type CommandAvailabilityCheck,\n type CommandCheckDeps,\n checkCommandAvailable,\n} from \"./command-check.js\";\nimport { type CommandRunner, runCommandAsString } from \"./command-runner.js\";\n\nconst EXCERPT_LIMIT = 400;\n\nexport interface InstallManagerDeps extends CommandCheckDeps {\n commandExists?: CommandAvailabilityCheck;\n runCommand?: CommandRunner;\n}\n\nexport class ProviderInstallManager {\n private readonly providers = new Map<string, ProviderDefinition>();\n private readonly jobs = new Map<string, ProviderInstallJobSnapshot>();\n private readonly activeJobIdsByProviderId = new Map<string, string>();\n private readonly inFlightStartsByProviderId = new Map<\n string,\n Promise<ProviderInstallJobSnapshot>\n >();\n private readonly deps: InstallManagerDeps;\n\n constructor(providers: ProviderDefinition[], deps: InstallManagerDeps = {}) {\n this.deps = deps;\n for (const provider of providers) {\n this.providers.set(provider.id, provider);\n }\n }\n\n async start(providerId: string): Promise<ProviderInstallJobSnapshot> {\n const activeJob = this.getActiveJob(providerId);\n if (activeJob) {\n return cloneJobSnapshot(activeJob);\n }\n\n const inFlightStart = this.inFlightStartsByProviderId.get(providerId);\n if (inFlightStart) {\n return cloneJobSnapshot(await inFlightStart);\n }\n\n const startPromise = this.prepareAndStart(providerId);\n this.inFlightStartsByProviderId.set(providerId, startPromise);\n\n try {\n return cloneJobSnapshot(await startPromise);\n } finally {\n if (this.inFlightStartsByProviderId.get(providerId) === startPromise) {\n this.inFlightStartsByProviderId.delete(providerId);\n }\n }\n }\n\n get(jobId: string): ProviderInstallJobSnapshot | undefined {\n const job = this.jobs.get(jobId);\n return job ? cloneJobSnapshot(job) : undefined;\n }\n\n private async prepareAndStart(providerId: string): Promise<ProviderInstallJobSnapshot> {\n const provider = this.providers.get(providerId);\n if (!provider) {\n throw { code: \"unknown_provider\", message: `Provider not found: ${providerId}` };\n }\n\n const job = await this.prepare(provider);\n this.jobs.set(job.jobId, job);\n\n if (job.status === \"queued\") {\n this.activeJobIdsByProviderId.set(provider.id, job.jobId);\n void this.runPreparedJob(provider, job);\n }\n\n return job;\n }\n\n private async prepare(provider: ProviderDefinition): Promise<ProviderInstallJobSnapshot> {\n const platform = this.deps.platform ?? process.platform;\n const strategies = provider.install.strategies[platform] ?? [];\n const availableCommands = new Set<string>();\n\n const missingProviderCommands = await this.collectMissing(\n provider.requiredCommands,\n availableCommands\n );\n if (missingProviderCommands.length === 0) {\n return {\n jobId: randomUUID(),\n providerId: provider.id,\n strategyIds: [],\n status: \"succeeded\",\n steps: [],\n };\n }\n\n const missingPrerequisites = await this.collectMissing(\n provider.install.prerequisites,\n availableCommands\n );\n\n const dependencyCommands = new Set<string>();\n for (const strategy of strategies) {\n for (const command of strategy.requiresCommands) {\n dependencyCommands.add(command);\n }\n }\n\n for (const command of dependencyCommands) {\n if (availableCommands.has(command)) {\n continue;\n }\n if (await this.commandExists(command)) {\n availableCommands.add(command);\n }\n }\n\n const remainingProviderCommands = new Set(missingProviderCommands);\n const remainingPrerequisites = new Set(missingPrerequisites);\n const reachableCommands = new Set(availableCommands);\n const selectedStrategyIds = new Set<string>();\n const selectedSteps: ProviderInstallStepSnapshot[] = [];\n let progressed = true;\n\n while (progressed) {\n progressed = false;\n\n for (const strategy of strategies) {\n if (selectedStrategyIds.has(strategy.id)) {\n continue;\n }\n\n const requiresMet = strategy.requiresCommands.every((command) =>\n reachableCommands.has(command)\n );\n if (!requiresMet) {\n continue;\n }\n\n if (\n strategy.kind === \"prerequisite\" &&\n remainingPrerequisites.has(strategy.targetCommand)\n ) {\n selectedStrategyIds.add(strategy.id);\n selectedSteps.push(\n this.createInstallStep(strategy.kind, strategy.targetCommand, strategy)\n );\n remainingPrerequisites.delete(strategy.targetCommand);\n reachableCommands.add(strategy.targetCommand);\n progressed = true;\n continue;\n }\n\n if (strategy.kind === \"provider\" && remainingProviderCommands.has(strategy.targetCommand)) {\n selectedStrategyIds.add(strategy.id);\n selectedSteps.push(\n this.createInstallStep(strategy.kind, strategy.targetCommand, strategy)\n );\n remainingProviderCommands.delete(strategy.targetCommand);\n reachableCommands.add(strategy.targetCommand);\n progressed = true;\n }\n }\n }\n\n const jobId = randomUUID();\n if (remainingPrerequisites.size > 0) {\n const failedStep = this.createCheckStep(\n \"prerequisite\",\n [...remainingPrerequisites][0] ?? \"\",\n \"provider.install.step.prerequisite.missing\"\n );\n return {\n jobId,\n providerId: provider.id,\n strategyIds: [...selectedStrategyIds],\n status: \"failed\",\n steps: [...selectedSteps, failedStep],\n failure: this.createFailure(\n provider,\n failedStep,\n \"missing_prerequisite\",\n `Missing prerequisite commands: ${[...remainingPrerequisites].join(\", \")}`,\n [...remainingPrerequisites]\n ),\n };\n }\n\n if (remainingProviderCommands.size > 0) {\n const failedStep = this.createCheckStep(\n \"provider\",\n [...remainingProviderCommands][0] ?? \"\",\n \"provider.install.step.provider.unsupported\"\n );\n return {\n jobId,\n providerId: provider.id,\n strategyIds: [...selectedStrategyIds],\n status: \"failed\",\n steps: [...selectedSteps, failedStep],\n failure: this.createFailure(\n provider,\n failedStep,\n \"unsupported_platform\",\n `No supported install strategy for commands: ${[...remainingProviderCommands].join(\", \")}`,\n [...remainingProviderCommands]\n ),\n };\n }\n\n selectedSteps.push({\n id: `verify-provider-${provider.id}`,\n titleKey: `provider.install.step.verify.${provider.id}`,\n kind: \"verify\",\n command: provider.requiredCommands[0] ?? provider.id,\n args: [\"--version\"],\n status: \"pending\",\n });\n return {\n jobId,\n providerId: provider.id,\n strategyIds: [...selectedStrategyIds],\n status: \"queued\",\n currentStepId: selectedSteps[0]?.id,\n steps: selectedSteps,\n };\n }\n\n private async runPreparedJob(\n provider: ProviderDefinition,\n job: ProviderInstallJobSnapshot\n ): Promise<void> {\n const runCommand = this.deps.runCommand ?? runCommandAsString;\n\n job.status = \"running\";\n this.jobs.set(job.jobId, job);\n\n for (const step of job.steps) {\n job.currentStepId = step.id;\n step.status = \"running\";\n step.startedAt = Date.now();\n this.jobs.set(job.jobId, job);\n\n try {\n if (step.kind === \"verify\") {\n const available = await this.commandExists(step.command);\n if (!available) {\n step.status = \"failed\";\n step.finishedAt = Date.now();\n job.status = \"failed\";\n job.failure = this.createFailure(\n provider,\n step,\n \"verification_failed\",\n `Verification failed for command: ${step.command}`,\n [step.command]\n );\n this.clearActiveJob(provider.id, job.jobId);\n this.jobs.set(job.jobId, job);\n return;\n }\n } else {\n const result = await runCommand(step.command, step.args, { windowsHide: true });\n step.stdoutExcerpt = excerpt(result.stdout);\n step.stderrExcerpt = excerpt(result.stderr);\n }\n\n step.status = \"succeeded\";\n step.exitCode = 0;\n step.finishedAt = Date.now();\n this.jobs.set(job.jobId, job);\n } catch (error) {\n const details = getErrorDetails(error);\n step.status = \"failed\";\n step.finishedAt = Date.now();\n step.exitCode = details.exitCode;\n step.stdoutExcerpt = excerpt(details.stdout);\n step.stderrExcerpt = excerpt(details.stderr || details.message);\n job.status = \"failed\";\n job.failure = this.normalizeFailure(provider, step, error);\n this.clearActiveJob(provider.id, job.jobId);\n this.jobs.set(job.jobId, job);\n return;\n }\n }\n\n job.status = \"succeeded\";\n job.currentStepId = undefined;\n this.clearActiveJob(provider.id, job.jobId);\n this.jobs.set(job.jobId, job);\n }\n\n private async collectMissing(\n commands: string[],\n availableCommands?: Set<string>\n ): Promise<string[]> {\n const missing: string[] = [];\n\n for (const command of commands) {\n if (await this.commandExists(command)) {\n availableCommands?.add(command);\n } else {\n missing.push(command);\n }\n }\n\n return missing;\n }\n\n private async commandExists(command: string): Promise<boolean> {\n const commandExists =\n this.deps.commandExists ??\n ((candidate: string) => checkCommandAvailable(candidate, this.deps));\n return commandExists(command);\n }\n\n private normalizeFailure(\n provider: ProviderDefinition,\n step: ProviderInstallStepSnapshot,\n error: unknown\n ): ProviderInstallFailure {\n const details = getErrorDetails(error);\n const haystack = `${details.message}\\n${details.stderr}\\n${details.stdout}`.toLowerCase();\n\n let code: ProviderInstallFailure[\"code\"] = \"command_failed\";\n if (\n haystack.includes(\"permission denied\") ||\n haystack.includes(\"eacces\") ||\n haystack.includes(\"eperm\")\n ) {\n code = \"permission_denied\";\n } else if (\n haystack.includes(\"not found\") ||\n haystack.includes(\"is not recognized\") ||\n haystack.includes(\"enoent\")\n ) {\n code = \"command_not_found\";\n }\n\n return this.createFailure(\n provider,\n {\n ...step,\n exitCode: details.exitCode,\n stdoutExcerpt: excerpt(details.stdout),\n stderrExcerpt: excerpt(details.stderr || details.message),\n },\n code,\n details.message || `Install step failed: ${step.command}`,\n []\n );\n }\n\n private createFailure(\n provider: ProviderDefinition,\n step: ProviderInstallStepSnapshot,\n code: ProviderInstallFailure[\"code\"],\n message: string,\n missingCommands: string[]\n ): ProviderInstallFailure {\n return {\n code,\n providerId: provider.id,\n failedStepId: step.id,\n message,\n command: step.command,\n args: step.args,\n exitCode: step.exitCode,\n stdoutExcerpt: step.stdoutExcerpt,\n stderrExcerpt: step.stderrExcerpt,\n missingCommands,\n manualGuideKeys: provider.install.manualGuideKeys,\n docUrls: provider.install.docUrls,\n };\n }\n\n private createInstallStep(\n kind: \"prerequisite\" | \"provider\",\n targetCommand: string,\n strategy: {\n command: string;\n args: string[];\n }\n ): ProviderInstallStepSnapshot {\n return {\n id: `install-${kind}-${targetCommand}`,\n titleKey: `provider.install.step.${kind}.${targetCommand}`,\n kind: \"install\",\n command: strategy.command,\n args: strategy.args,\n status: \"pending\",\n };\n }\n\n private createCheckStep(\n kind: \"prerequisite\" | \"provider\",\n targetCommand: string,\n titleKey: string\n ): ProviderInstallStepSnapshot {\n return {\n id: `install-${kind}-${targetCommand}`,\n titleKey,\n kind: \"check\",\n command: targetCommand,\n args: [],\n status: \"failed\",\n };\n }\n\n private clearActiveJob(providerId: string, jobId: string): void {\n if (this.activeJobIdsByProviderId.get(providerId) === jobId) {\n this.activeJobIdsByProviderId.delete(providerId);\n }\n }\n\n private getActiveJob(providerId: string): ProviderInstallJobSnapshot | undefined {\n const activeJobId = this.activeJobIdsByProviderId.get(providerId);\n if (!activeJobId) {\n return undefined;\n }\n\n const activeJob = this.jobs.get(activeJobId);\n if (activeJob && (activeJob.status === \"queued\" || activeJob.status === \"running\")) {\n return activeJob;\n }\n\n this.activeJobIdsByProviderId.delete(providerId);\n return undefined;\n }\n}\n\nfunction getErrorDetails(error: unknown): {\n message: string;\n exitCode?: number;\n stdout: string;\n stderr: string;\n} {\n if (error instanceof Error) {\n const record = error as Error & {\n code?: number | string;\n exitCode?: number;\n stdout?: string;\n stderr?: string;\n };\n return {\n message: error.message,\n exitCode:\n typeof record.exitCode === \"number\"\n ? record.exitCode\n : typeof record.code === \"number\"\n ? record.code\n : undefined,\n stdout: record.stdout ?? \"\",\n stderr: record.stderr ?? \"\",\n };\n }\n\n if (typeof error === \"string\") {\n return {\n message: error,\n stdout: \"\",\n stderr: \"\",\n };\n }\n\n return {\n message: \"Unknown install failure\",\n stdout: \"\",\n stderr: \"\",\n };\n}\n\nfunction excerpt(value: string | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n return value.slice(0, EXCERPT_LIMIT);\n}\n\nfunction cloneJobSnapshot(job: ProviderInstallJobSnapshot): ProviderInstallJobSnapshot {\n return {\n jobId: job.jobId,\n providerId: job.providerId,\n strategyIds: [...job.strategyIds],\n status: job.status,\n currentStepId: job.currentStepId,\n steps: job.steps.map(cloneStepSnapshot),\n failure: job.failure ? cloneFailure(job.failure) : undefined,\n };\n}\n\nfunction cloneStepSnapshot(step: ProviderInstallStepSnapshot): ProviderInstallStepSnapshot {\n return {\n id: step.id,\n titleKey: step.titleKey,\n kind: step.kind,\n command: step.command,\n args: [...step.args],\n status: step.status,\n startedAt: step.startedAt,\n finishedAt: step.finishedAt,\n exitCode: step.exitCode,\n stdoutExcerpt: step.stdoutExcerpt,\n stderrExcerpt: step.stderrExcerpt,\n };\n}\n\nfunction cloneFailure(failure: ProviderInstallFailure): ProviderInstallFailure {\n return {\n code: failure.code,\n providerId: failure.providerId,\n failedStepId: failure.failedStepId,\n message: failure.message,\n command: failure.command,\n args: [...failure.args],\n exitCode: failure.exitCode,\n stdoutExcerpt: failure.stdoutExcerpt,\n stderrExcerpt: failure.stderrExcerpt,\n missingCommands: [...failure.missingCommands],\n manualGuideKeys: [...failure.manualGuideKeys],\n docUrls: {\n provider: failure.docUrls.provider,\n prerequisites: { ...failure.docUrls.prerequisites },\n },\n };\n}\n", "// DomainEvent type union for EventBus (spec \u00A74.0)\n\nimport type { SessionState, Workspace } from \"./types\";\n\nexport type DomainEvent =\n | {\n type: \"session.state.changed\";\n sessionId: string;\n workspaceId?: string;\n from: SessionState;\n to: SessionState;\n session?: import(\"./types\").Session;\n }\n | {\n type: \"session.lifecycle\";\n sessionId: string;\n workspaceId?: string;\n event: \"started\" | \"turn_completed\" | \"stopped\" | \"removed\";\n }\n | { type: \"workspace.meta.changed\"; workspaceId: string; patch: Partial<Workspace> }\n | {\n type: \"git.state.changed\";\n workspaceId: string;\n treeChanged?: boolean;\n branchChanged?: boolean;\n worktreeChanged?: boolean;\n }\n | { type: \"fs.dirty\"; workspaceId: string; reason: string }\n | {\n type: \"terminal.created\";\n workspaceId: string;\n terminalId: string;\n kind: \"agent\" | \"shell\";\n title: string;\n cwd: string;\n }\n | { type: \"terminal.output\"; workspaceId: string; terminalId: string; chunk: Buffer; seq: number }\n | { type: \"terminal.exited\"; workspaceId: string; terminalId: string; exitCode: number };\n", "/**\n * MCP Server Types (Phase 4)\n *\n * Types for MCP (Model Context Protocol) server management.\n */\n\nexport interface McpServerConfig {\n /** Server name/identifier */\n name: string;\n /** Server command (e.g., 'npx', 'node', 'python') */\n command: string;\n /** Command arguments */\n args: string[];\n /** Environment variables */\n env?: Record<string, string>;\n /** Whether the server is enabled */\n enabled: boolean;\n /** Server description */\n description?: string;\n}\n\nexport interface McpServerStatus {\n /** Server name */\n name: string;\n /** Connection status */\n status: \"connected\" | \"disconnected\" | \"error\" | \"starting\";\n /** Last error message */\n error?: string;\n /** Available tools from this server */\n tools?: string[];\n /** Available resources from this server */\n resources?: string[];\n}\n\nexport interface McpConfig {\n /** MCP servers by provider */\n servers: {\n claude: McpServerConfig[];\n codex: McpServerConfig[];\n };\n}\n", "export interface ProviderInstallDocUrls {\n provider: string;\n prerequisites: Partial<Record<string, string>>;\n}\n\nexport interface ProviderRuntimeStatusEntry {\n providerId: string;\n available: boolean;\n missingCommands: string[];\n missingPrerequisites: string[];\n autoInstallSupported: boolean;\n installReadiness: \"ready\" | \"missing_prerequisite\" | \"unsupported_platform\";\n manualGuideKeys: string[];\n docUrls: ProviderInstallDocUrls;\n}\n\nexport interface ProviderRuntimeStatusResponse {\n providers: Record<string, ProviderRuntimeStatusEntry>;\n}\n\nexport interface ProviderInstallStepSnapshot {\n id: string;\n titleKey: string;\n kind: \"check\" | \"install\" | \"verify\";\n command: string;\n args: string[];\n status: \"pending\" | \"running\" | \"succeeded\" | \"failed\";\n startedAt?: number;\n finishedAt?: number;\n exitCode?: number;\n stdoutExcerpt?: string;\n stderrExcerpt?: string;\n}\n\nexport interface ProviderInstallFailure {\n code:\n | \"missing_prerequisite\"\n | \"unsupported_platform\"\n | \"permission_denied\"\n | \"command_not_found\"\n | \"command_failed\"\n | \"verification_failed\"\n | \"unknown_failure\";\n providerId: string;\n failedStepId: string;\n message: string;\n command: string;\n args: string[];\n exitCode?: number;\n stdoutExcerpt?: string;\n stderrExcerpt?: string;\n missingCommands: string[];\n manualGuideKeys: string[];\n docUrls: ProviderInstallDocUrls;\n}\n\nexport interface ProviderInstallJobSnapshot {\n jobId: string;\n providerId: string;\n strategyIds: string[];\n status: \"queued\" | \"running\" | \"succeeded\" | \"failed\";\n currentStepId?: string;\n steps: ProviderInstallStepSnapshot[];\n failure?: ProviderInstallFailure;\n}\n", "// Supervisor domain types (PRD \u00A716)\n\nexport type SupervisorState =\n | \"inactive\"\n | \"idle\"\n | \"evaluating\"\n | \"injecting\"\n | \"paused\"\n | \"error\"\n | \"stopped\";\n\nexport type CycleStatus =\n | \"queued\"\n | \"evaluating\"\n | \"completed\"\n | \"injected\"\n | \"failed\"\n | \"cancelled\";\n\nexport type CycleTrigger = \"turn_completed\" | \"manual\" | \"scheduled\";\n\nexport type SupervisorStopReason =\n | \"objective_complete\"\n | \"max_supervision_count_reached\"\n | \"supervisor_uncertain\";\n\nexport type SupervisorPlanStepStatus = \"pending\" | \"in_progress\" | \"done\";\n\nexport interface SupervisorPlanStep {\n id: string;\n title: string;\n status: SupervisorPlanStepStatus;\n}\n\nexport interface SupervisorTargetMemory {\n targetId: string;\n planGenerated: boolean;\n plan: SupervisorPlanStep[];\n activeStepId?: string;\n progressSummary?: string;\n lastGuidance?: string;\n stalledCount: number;\n updatedAt: number;\n}\n\nexport interface SupervisorCycleStepUpdate {\n id: string;\n status: SupervisorPlanStepStatus;\n}\n\nexport interface SupervisorCycleTargetRecord {\n cycleId: string;\n targetId: string;\n startedAt: number;\n completedAt: number;\n result: \"continue\" | \"stop\" | \"error\";\n stopReason?: \"objective_complete\" | \"supervisor_uncertain\";\n reason?: string;\n guidance?: string;\n progressSummary?: string;\n activeStepId?: string;\n stepUpdates?: SupervisorCycleStepUpdate[];\n injected?: boolean;\n attemptCount?: number;\n errorReason?: string;\n}\n\nexport type SupervisorCycleAttemptStatus = \"evaluating\" | \"completed\" | \"failed\" | \"cancelled\";\n\nexport type EvidenceSource = \"headless_snapshot\" | \"transcript\" | \"terminal_fallback\";\n\nexport interface SupervisorCycle {\n id: string;\n supervisorId: string;\n sessionId: string;\n status: CycleStatus;\n trigger: CycleTrigger;\n evidenceSource: EvidenceSource;\n objective: string;\n evaluatorProviderId: string;\n turnId?: string;\n progress?: number;\n result?: string;\n injectedGuidance?: string;\n createdAt: number;\n completedAt?: number;\n errorReason?: string;\n}\n\nexport interface SupervisorCycleAttempt {\n id: string;\n cycleId: string;\n attemptIndex: number;\n status: SupervisorCycleAttemptStatus;\n startedAt: number;\n completedAt?: number;\n errorReason?: string;\n providerModel?: string;\n}\n\nexport interface SupervisorCycleAttemptPatch {\n status?: SupervisorCycleAttemptStatus;\n completedAt?: number | null;\n errorReason?: string | null;\n providerModel?: string | null;\n}\n\nexport interface Supervisor {\n id: string;\n sessionId: string;\n workspaceId: string;\n targetId: string;\n state: SupervisorState;\n objective: string;\n evaluatorProviderId: string;\n evaluatorModel?: string;\n maxSupervisionCount: number;\n completedSupervisionCount: number;\n scheduledAt?: number;\n stopReason?: SupervisorStopReason;\n currentTargetMemory?: SupervisorTargetMemory;\n recentTargetCycles?: SupervisorCycleTargetRecord[];\n cycles: SupervisorCycle[];\n lastCycleAt?: number;\n lastEvaluatedTurnId?: string;\n errorReason?: string;\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface SupervisorConfig {\n maxCyclesPerSession: number;\n terminalLinesForEvaluation: number;\n guidanceMaxChars: number;\n guidanceDedupeWindow: number;\n}\n\nexport const DEFAULT_SUPERVISOR_EVALUATION_TIMEOUT_SEC = 600;\nexport const MAX_SUPERVISOR_EVALUATION_TIMEOUT_SEC = 86_400;\nexport const DEFAULT_SUPERVISOR_RETRY_ENABLED = false;\nexport const DEFAULT_SUPERVISOR_RETRY_MAX_COUNT = 0;\nexport const MAX_SUPERVISOR_RETRY_MAX_COUNT = 20;\nexport const DEFAULT_SUPERVISOR_RETRY_DELAY_SEC = 10;\nexport const MAX_SUPERVISOR_RETRY_DELAY_SEC = 3_600;\nexport const DEFAULT_SUPERVISOR_RETRY_ON_TIMEOUT = true;\nexport const DEFAULT_SUPERVISOR_RETRY_ON_EVALUATOR_ERROR = false;\n\nexport function resolveSupervisorEvaluationTimeoutSec(value: unknown): number {\n if (typeof value !== \"number\" || !Number.isFinite(value) || !Number.isSafeInteger(value)) {\n return DEFAULT_SUPERVISOR_EVALUATION_TIMEOUT_SEC;\n }\n\n if (value < 1 || value > MAX_SUPERVISOR_EVALUATION_TIMEOUT_SEC) {\n return DEFAULT_SUPERVISOR_EVALUATION_TIMEOUT_SEC;\n }\n\n return value;\n}\n\nexport function resolveSupervisorRetryEnabled(value: unknown): boolean {\n return typeof value === \"boolean\" ? value : DEFAULT_SUPERVISOR_RETRY_ENABLED;\n}\n\nexport function resolveSupervisorRetryMaxCount(value: unknown): number {\n if (typeof value !== \"number\" || !Number.isFinite(value) || !Number.isSafeInteger(value)) {\n return DEFAULT_SUPERVISOR_RETRY_MAX_COUNT;\n }\n\n if (value < 0 || value > MAX_SUPERVISOR_RETRY_MAX_COUNT) {\n return DEFAULT_SUPERVISOR_RETRY_MAX_COUNT;\n }\n\n return value;\n}\n\nexport function resolveSupervisorRetryDelaySec(value: unknown): number {\n if (typeof value !== \"number\" || !Number.isFinite(value) || !Number.isSafeInteger(value)) {\n return DEFAULT_SUPERVISOR_RETRY_DELAY_SEC;\n }\n\n if (value < 1 || value > MAX_SUPERVISOR_RETRY_DELAY_SEC) {\n return DEFAULT_SUPERVISOR_RETRY_DELAY_SEC;\n }\n\n return value;\n}\n\nexport function resolveSupervisorRetryOnTimeout(value: unknown): boolean {\n return typeof value === \"boolean\" ? value : DEFAULT_SUPERVISOR_RETRY_ON_TIMEOUT;\n}\n\nexport function resolveSupervisorRetryOnEvaluatorError(value: unknown): boolean {\n return typeof value === \"boolean\" ? value : DEFAULT_SUPERVISOR_RETRY_ON_EVALUATOR_ERROR;\n}\n\nexport const DEFAULT_SUPERVISOR_CONFIG: SupervisorConfig = {\n maxCyclesPerSession: 100,\n terminalLinesForEvaluation: 500,\n guidanceMaxChars: 2000,\n guidanceDedupeWindow: 2,\n};\n", "// Core domain types (spec \u00A712.1)\n\nexport type {\n ProviderInstallDocUrls,\n ProviderInstallFailure,\n ProviderInstallJobSnapshot,\n ProviderInstallStepSnapshot,\n ProviderRuntimeStatusEntry,\n ProviderRuntimeStatusResponse,\n} from \"./provider-install\";\n\nexport interface Workspace {\n name?: string;\n isActive?: boolean;\n unreadCount?: number;\n id: string;\n path: string;\n targetRuntime: \"native\" | \"wsl\";\n wslDistro?: string;\n openedAt: number;\n lastActiveAt: number;\n uiState: UiState;\n}\n\nexport interface WorkspacePaneNode {\n id: string;\n type: \"leaf\" | \"split\";\n sessionId?: string;\n direction?: \"horizontal\" | \"vertical\";\n children?: WorkspacePaneNode[];\n}\n\nexport interface UiState {\n leftPanelWidth: number;\n bottomPanelHeight: number;\n focusMode: boolean;\n activeSessionId?: string;\n paneLayout?: WorkspacePaneNode;\n}\n\nexport interface WorkspaceLastViewedTarget {\n workspaceId: string;\n sessionId?: string;\n updatedAt: number;\n}\n\nexport interface Terminal {\n id: string;\n workspaceId: string;\n kind: \"agent\" | \"shell\";\n title: string;\n cwd: string;\n argv: string[];\n env?: Record<string, string>;\n cols: number;\n rows: number;\n alive: boolean;\n createdAt: number;\n endedAt?: number;\n exitCode?: number;\n}\n\nexport interface Session {\n id: string;\n workspaceId: string;\n terminalId: string;\n providerId: string;\n state: SessionState;\n capability: \"full\" | \"limited\" | \"unsupported\";\n startedAt: number;\n lastActiveAt: number;\n endedAt?: number;\n completionPercent?: number;\n errorReason?: string;\n /**\n * Human-friendly title derived from the user's first submitted instruction\n * (trimmed/truncated to SESSION_TITLE_MAX_LENGTH). Assigned once on first\n * submit and never overwritten afterwards. Undefined until the user sends\n * their first message.\n */\n title?: string;\n}\n\n/**\n * Maximum character length for {@link Session.title}. The first submitted\n * instruction is trimmed and truncated to this length (with an ellipsis when\n * clipped) before being persisted.\n */\nexport const SESSION_TITLE_MAX_LENGTH = 10;\n\nexport type SessionState = \"draft\" | \"starting\" | \"running\" | \"idle\" | \"ended\";\n\nexport interface GitStatus {\n branch: string;\n ahead: number;\n behind: number;\n headSha?: string;\n headShortSha?: string;\n headSubject?: string;\n /**\n * Files with a non-blank index status. Includes staged deletions (index\n * status 'D'); consumers showing a staged-files badge should count this\n * array directly rather than diffing against `deleted`.\n */\n staged: GitFileChange[];\n modified: GitFileChange[];\n untracked: GitFileChange[];\n /** Worktree-only deletions (index unchanged, file removed in working tree). */\n deleted: GitFileChange[];\n}\n\nexport type GitChangeStatus = \"added\" | \"modified\" | \"deleted\" | \"renamed\" | \"untracked\";\n\nexport interface GitFileChange {\n path: string;\n oldPath?: string; // for renames\n status?: GitChangeStatus;\n}\n\nexport interface GitCommitSummary {\n sha: string;\n shortSha: string;\n subject: string;\n authorName: string;\n authoredAt: number;\n}\n\nexport interface GitBranch {\n name: string; // Branch name (e.g., \"main\", \"origin/feature\")\n isRemote: boolean; // Whether it's a remote branch\n isCurrent: boolean; // Whether it's the current branch\n remote?: string; // Remote name (e.g., \"origin\")\n linkedWorktreePath?: string; // Path of another worktree using this branch, if any\n}\n\nexport interface WorktreeInfo {\n name: string;\n path: string;\n branch: string;\n commit: string;\n status: \"clean\" | \"dirty\";\n}\n\nexport interface FileNode {\n name: string;\n path: string;\n kind: \"file\" | \"dir\";\n children?: FileNode[];\n size?: number;\n mtime?: number;\n}\n\nexport interface Settings {\n defaultProviderId: string;\n notifications: {\n enabled: boolean;\n soundEnabled: boolean;\n };\n supervisor: {\n evaluationTimeoutSec: number;\n };\n appearance: {\n themeId: string;\n terminalRenderer: \"standard\" | \"compatibility\";\n locale: \"zh\" | \"en\";\n };\n providerConfigs: Record<string, ProviderConfig>;\n}\n\nexport interface ProviderConfig {\n [key: string]: unknown;\n}\n\n/**\n * Derive a compact session title from a raw input buffer (the bytes a user\n * just submitted to the agent terminal). Returns undefined when the buffer\n * contains nothing meaningful after trimming.\n *\n * Rules:\n * - Collapse all whitespace (including newlines) into single spaces.\n * - Trim leading/trailing whitespace.\n * - Truncate to SESSION_TITLE_MAX_LENGTH; if clipped, the final character is\n * replaced with an ellipsis (\"\u2026\") so the total length is still at most\n * SESSION_TITLE_MAX_LENGTH.\n */\nexport function deriveSessionTitle(raw: string): string | undefined {\n const normalized = raw.replace(/\\s+/g, \" \").trim();\n if (!normalized) return undefined;\n\n if (normalized.length <= SESSION_TITLE_MAX_LENGTH) {\n return normalized;\n }\n\n // Reserve the last slot for the ellipsis so we stay within the budget.\n return normalized.slice(0, SESSION_TITLE_MAX_LENGTH - 1) + \"\u2026\";\n}\n", "import { z } from \"zod\";\n\nexport const TERMINAL_BINARY_PROTOCOL_VERSION = 1;\nexport const TERMINAL_BINARY_HEADER_SIZE = 16;\n\nexport const TerminalBinaryFrameType = {\n Output: 1,\n Replay: 2,\n Input: 3,\n Snapshot: 4,\n} as const;\n\nexport type TerminalBinaryFrameType =\n (typeof TerminalBinaryFrameType)[keyof typeof TerminalBinaryFrameType];\n\nexport interface TerminalBinaryFrameHeader {\n version: number;\n type: TerminalBinaryFrameType;\n flags: number;\n meta: number;\n streamId: number;\n payloadSize: number;\n}\n\nexport interface TerminalBinaryEventData {\n transport: \"binary\";\n streamId: number;\n size: number;\n}\n\nexport interface TerminalReplayBinaryResult {\n status: \"ok\";\n transport: \"binary\";\n streamId: number;\n size: number;\n seq: number;\n}\n\nexport interface TerminalSnapshotBinaryResult {\n status: \"ok\";\n transport: \"binary\";\n streamId: number;\n size: number;\n seq: number;\n rows: number;\n cols: number;\n source: \"headless\";\n}\n\nexport const TERMINAL_INPUT_ACTIVITIES = [\n \"typing\",\n \"submit\",\n \"internal_submit\",\n \"system\",\n \"control\",\n] as const;\n\nexport type TerminalInputActivity = (typeof TERMINAL_INPUT_ACTIVITIES)[number];\n\nexport interface TerminalInputBinaryArgs {\n terminalId: string;\n activity?: TerminalInputActivity;\n submittedText?: string;\n transport: \"binary\";\n streamId: number;\n size: number;\n}\n\nexport interface TerminalInputBase64Args {\n terminalId: string;\n bytes: string;\n activity?: TerminalInputActivity;\n submittedText?: string;\n}\n\nexport const encodeTerminalBinaryFrame = (\n header: TerminalBinaryFrameHeader,\n payload: Uint8Array\n): Uint8Array => {\n if (payload.byteLength !== header.payloadSize) {\n throw new Error(\"Terminal binary payload size does not match header\");\n }\n\n const frame = new Uint8Array(TERMINAL_BINARY_HEADER_SIZE + payload.byteLength);\n const view = new DataView(frame.buffer);\n view.setUint8(0, header.version);\n view.setUint8(1, header.type);\n view.setUint16(2, header.flags);\n view.setUint32(4, header.meta);\n view.setUint32(8, header.streamId);\n view.setUint32(12, header.payloadSize);\n frame.set(payload, TERMINAL_BINARY_HEADER_SIZE);\n return frame;\n};\n\nexport const decodeTerminalBinaryFrame = (\n frame: ArrayBuffer | Uint8Array\n): {\n header: TerminalBinaryFrameHeader;\n payload: Uint8Array;\n} => {\n const bytes = frame instanceof Uint8Array ? frame : new Uint8Array(frame);\n if (bytes.byteLength < TERMINAL_BINARY_HEADER_SIZE) {\n throw new Error(\"Terminal binary frame is too short\");\n }\n\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const header: TerminalBinaryFrameHeader = {\n version: view.getUint8(0),\n type: view.getUint8(1) as TerminalBinaryFrameType,\n flags: view.getUint16(2),\n meta: view.getUint32(4),\n streamId: view.getUint32(8),\n payloadSize: view.getUint32(12),\n };\n\n const payload = bytes.subarray(TERMINAL_BINARY_HEADER_SIZE);\n if (payload.byteLength !== header.payloadSize) {\n throw new Error(\"Terminal binary frame payload length mismatch\");\n }\n\n return { header, payload };\n};\n\nexport const TERMINAL_BINARY_OUTPUT_VERSION = 2;\n\nexport interface TerminalOutputFrameHeader {\n topic: string;\n seq: number;\n streamId: number;\n payloadSize: number;\n}\n\nexport interface DecodedTerminalOutputFrame {\n topic: string;\n seq: number;\n streamId: number;\n payload: Uint8Array;\n}\n\nexport const encodeTerminalOutputFrame = (\n header: TerminalOutputFrameHeader,\n payload: Uint8Array\n): Uint8Array => {\n if (payload.byteLength !== header.payloadSize) {\n throw new Error(\"Terminal output payload size does not match header\");\n }\n\n const topicBytes = new TextEncoder().encode(header.topic);\n const frame = new Uint8Array(\n TERMINAL_BINARY_HEADER_SIZE + topicBytes.length + payload.byteLength\n );\n const view = new DataView(frame.buffer);\n view.setUint8(0, TERMINAL_BINARY_OUTPUT_VERSION);\n view.setUint8(1, TerminalBinaryFrameType.Output);\n view.setUint16(2, topicBytes.length, false);\n view.setUint32(4, header.seq, false);\n view.setUint32(8, header.streamId, false);\n view.setUint32(12, payload.byteLength, false);\n frame.set(topicBytes, TERMINAL_BINARY_HEADER_SIZE);\n frame.set(payload, TERMINAL_BINARY_HEADER_SIZE + topicBytes.length);\n return frame;\n};\n\nexport const decodeTerminalOutputFrame = (\n frame: ArrayBuffer | Uint8Array\n): DecodedTerminalOutputFrame => {\n const bytes = frame instanceof Uint8Array ? frame : new Uint8Array(frame);\n if (bytes.byteLength < TERMINAL_BINARY_HEADER_SIZE) {\n throw new Error(\"Terminal output frame is too short\");\n }\n\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const version = view.getUint8(0);\n if (version !== TERMINAL_BINARY_OUTPUT_VERSION) {\n throw new Error(\n `Expected output frame version ${TERMINAL_BINARY_OUTPUT_VERSION}, got ${version}`\n );\n }\n\n const topicLength = view.getUint16(2, false);\n const seq = view.getUint32(4, false);\n const streamId = view.getUint32(8, false);\n const payloadSize = view.getUint32(12, false);\n if (bytes.byteLength < TERMINAL_BINARY_HEADER_SIZE + topicLength) {\n throw new Error(\"Terminal output frame topic is truncated\");\n }\n\n const topic = new TextDecoder().decode(\n bytes.subarray(TERMINAL_BINARY_HEADER_SIZE, TERMINAL_BINARY_HEADER_SIZE + topicLength)\n );\n const payload = bytes.subarray(TERMINAL_BINARY_HEADER_SIZE + topicLength);\n if (payload.byteLength !== payloadSize) {\n throw new Error(\"Terminal output frame payload length mismatch\");\n }\n\n return { topic, seq, streamId, payload };\n};\n\n// Command: client \u2192 server, expects Result\nexport const CommandMessage = z.object({\n kind: z.literal(\"command\"),\n id: z.string().uuid(),\n op: z.string(),\n args: z.unknown(),\n});\n\n// Result: server \u2192 client, response to Command\nexport const ResultMessage = z.object({\n kind: z.literal(\"result\"),\n id: z.string().uuid(),\n ok: z.boolean(),\n data: z.unknown().optional(),\n error: z\n .object({\n code: z.string(),\n message: z.string(),\n details: z.unknown().optional(),\n })\n .optional(),\n});\n\n// Event: server \u2192 client, unsolicited state change\nexport const EventMessage = z.object({\n kind: z.literal(\"event\"),\n topic: z.string(),\n seq: z.number().int().nonnegative(),\n timestamp: z.number().int().positive(),\n data: z.unknown(),\n});\n\n// Subscribe: client \u2192 server, declare interest in topics\nexport const SubscribeMessage = z.object({\n kind: z.literal(\"subscribe\"),\n topics: z.array(z.string()),\n});\n\n// Unsubscribe: client \u2192 server, cancel interest\nexport const UnsubscribeMessage = z.object({\n kind: z.literal(\"unsubscribe\"),\n topics: z.array(z.string()),\n});\n\n// Resync: client \u2192 server, request missed events after reconnect\nexport const ResyncMessage = z.object({\n kind: z.literal(\"resync\"),\n lastSeen: z.record(z.string(), z.number()),\n});\n\n// Client \u2192 Server messages\nexport const ClientMessage = z.discriminatedUnion(\"kind\", [\n CommandMessage,\n SubscribeMessage,\n UnsubscribeMessage,\n ResyncMessage,\n]);\n\n// Server \u2192 Client messages\nexport const ServerMessage = z.discriminatedUnion(\"kind\", [ResultMessage, EventMessage]);\n\n// Type exports\nexport type Command = z.infer<typeof CommandMessage>;\nexport type Result = z.infer<typeof ResultMessage>;\nexport type Event = z.infer<typeof EventMessage>;\nexport type Subscribe = z.infer<typeof SubscribeMessage>;\nexport type Unsubscribe = z.infer<typeof UnsubscribeMessage>;\nexport type Resync = z.infer<typeof ResyncMessage>;\nexport type ClientToServer = z.infer<typeof ClientMessage>;\nexport type ServerToClient = z.infer<typeof ServerMessage>;\n", "// Topic naming follows spec \u00A73.3: hierarchical, supports glob subscription\n\nexport const Topics = {\n // Connection-level\n connectionStatus: \"connection.status\",\n connectionReady: \"connection.ready\",\n\n // Workspace-level\n workspaceMeta: (id: string) => `workspace.${id}.meta`,\n workspaceFsDirty: (id: string) => `workspace.${id}.fs.dirty`,\n workspaceGitState: (id: string) => `workspace.${id}.git.state`,\n workspaceAll: (id: string) => `workspace.${id}.*`,\n\n // Session-level\n sessionState: (workspaceId: string, sessionId: string) =>\n `workspace.${workspaceId}.session.${sessionId}.state`,\n sessionLifecycle: (workspaceId: string, sessionId: string) =>\n `workspace.${workspaceId}.session.${sessionId}.lifecycle`,\n sessionProgress: (workspaceId: string, sessionId: string) =>\n `workspace.${workspaceId}.session.${sessionId}.progress`,\n sessionsAll: (workspaceId: string) => `workspace.${workspaceId}.session.*`,\n\n // Terminal-level\n terminalCreated: (workspaceId: string, terminalId: string) =>\n `workspace.${workspaceId}.terminal.${terminalId}.created`,\n terminalOutput: (workspaceId: string, terminalId: string) =>\n `workspace.${workspaceId}.terminal.${terminalId}.output`,\n terminalExit: (workspaceId: string, terminalId: string) =>\n `workspace.${workspaceId}.terminal.${terminalId}.exit`,\n terminalsAll: (workspaceId: string) => `workspace.${workspaceId}.terminal.*`,\n\n // Notification\n notificationToast: \"notification.toast\",\n\n // Supervisor-level (Phase 3)\n supervisorState: (workspaceId: string, sessionId: string) =>\n `workspace.${workspaceId}.session.${sessionId}.supervisor.state`,\n supervisorCycle: (workspaceId: string, sessionId: string) =>\n `workspace.${workspaceId}.session.${sessionId}.supervisor.cycle`,\n} as const;\n", "import type { ZodSchema } from \"zod\";\nimport type { ProviderConfig, ProviderInstallDocUrls } from \"../domain/types\";\nimport type { IdleHeuristics } from \"./idle-heuristics\";\n\nexport interface ProviderInstallStrategy {\n id: string;\n kind: \"prerequisite\" | \"provider\";\n targetCommand: string;\n requiresCommands: string[];\n command: string;\n args: string[];\n}\n\nexport interface ProviderInstallMetadata {\n prerequisites: string[];\n manualGuideKeys: string[];\n docUrls: ProviderInstallDocUrls;\n strategies: Partial<Record<NodeJS.Platform, ProviderInstallStrategy[]>>;\n}\n\nexport interface SupervisorEvalCommandRequest {\n prompt: string;\n sessionId: string;\n workspacePath: string;\n apiKey?: string;\n model?: string;\n outputFile?: string;\n}\n\nexport interface ProviderDefinition {\n // Metadata\n id: string;\n displayName: string;\n badge: string;\n /**\n * Declarative label for UI badges and docs only.\n * Runtime behavior must read hooks/events directly.\n */\n capability: \"full\" | \"limited\" | \"unsupported\";\n install: ProviderInstallMetadata;\n\n // Command construction\n buildCommand(\n config: ProviderConfig,\n ctx: LaunchContext\n ): {\n argv: string[];\n env: Record<string, string>;\n cwd: string;\n };\n\n buildSupervisorEvalCommand?(\n config: ProviderConfig,\n req: SupervisorEvalCommandRequest\n ): {\n argv: string[];\n outputFile?: string;\n cwd?: string;\n env?: Record<string, string>;\n } | null;\n\n // Configuration\n configSchema: ZodSchema<ProviderConfig>;\n defaultConfig: ProviderConfig;\n\n // Runtime requirements\n requiredCommands: string[];\n\n /** PTY-output-based idle detection used by the session manager. */\n idleHeuristics?: IdleHeuristics;\n}\n\nexport interface LaunchContext {\n sessionId: string;\n workspacePath: string;\n}\n", "export interface IdleHeuristics {\n /** Regex patterns indicating the CLI is idle at a prompt. */\n idlePromptPatterns: RegExp[];\n /** Wait this many ms after the last output before declaring idle. */\n idleDebounceMs: number;\n /** Optional regexes that can extract a session identifier from stdout. */\n sessionIdPatterns?: RegExp[];\n}\n", "// Protocol\n\nexport * from \"./domain/events\";\nexport * from \"./domain/mcp\";\nexport * from \"./domain/provider-install\";\nexport * from \"./domain/supervisor\";\n// Domain\nexport * from \"./domain/types\";\nexport * from \"./protocol/messages\";\nexport * from \"./protocol/topics\";\n\n// Provider\nexport * from \"./provider/definition\";\nexport * from \"./provider/idle-heuristics\";\n", "import type { ProviderConfig, ProviderDefinition } from \"@coder-studio/core\";\nimport { z } from \"zod\";\n\nexport const SUPPORTED_PROVIDER_IDS = [\"claude\", \"codex\"] as const;\n\nconst supportedProviderIds = new Set<string>(SUPPORTED_PROVIDER_IDS);\n\nexport const ProviderLaunchConfigInputSchema = z\n .object({\n additionalArgs: z.array(z.string()).optional(),\n envVars: z.record(z.string(), z.string()).optional(),\n })\n .strict();\n\nexport const ProviderSettingsSchema = z\n .object({\n claude: ProviderLaunchConfigInputSchema.optional(),\n codex: ProviderLaunchConfigInputSchema.optional(),\n })\n .strict();\n\nconst ProviderLaunchConfigSchema = z.object({\n additionalArgs: z.array(z.string()).default([]),\n envVars: z.record(z.string(), z.string()).optional(),\n});\n\nexport function isSupportedProviderId(\n providerId: string\n): providerId is (typeof SUPPORTED_PROVIDER_IDS)[number] {\n return supportedProviderIds.has(providerId);\n}\n\nexport function sanitizeProviderLaunchConfig(config: unknown): {\n additionalArgs: string[];\n envVars?: Record<string, string>;\n} {\n const parsed = ProviderLaunchConfigSchema.safeParse(config);\n return parsed.success ? parsed.data : { additionalArgs: [] };\n}\n\nexport function mergeProviderLaunchConfig(\n provider: ProviderDefinition,\n config: unknown\n): ProviderConfig {\n return {\n ...(provider.defaultConfig as Record<string, unknown>),\n ...sanitizeProviderLaunchConfig(config),\n };\n}\n", "import type { Session, SessionState } from \"@coder-studio/core\";\nimport type { Database } from \"../database.js\";\n\n/**\n * Database row representation for Session table\n */\nexport interface SessionRow {\n id: string;\n workspace_id: string;\n terminal_id: string;\n provider_id: string;\n capability: \"full\" | \"limited\" | \"unsupported\";\n state: SessionState;\n started_at: number | null;\n ended_at: number | null;\n last_active_at: number;\n completion_percent: number | null;\n error_reason: string | null;\n archived: number; // SQLite uses 0/1 for boolean\n title: string | null;\n draft?: string | null;\n}\n\nexport function rowToSession(row: SessionRow): Session {\n return {\n id: row.id,\n workspaceId: row.workspace_id,\n terminalId: row.terminal_id,\n providerId: row.provider_id,\n state: row.state,\n capability: row.capability,\n startedAt: row.started_at ?? row.last_active_at,\n lastActiveAt: row.last_active_at,\n endedAt: row.ended_at ?? undefined,\n completionPercent: row.completion_percent ?? undefined,\n errorReason: row.error_reason ?? undefined,\n title: row.title ?? undefined,\n ...(row.draft != null ? { draft: row.draft } : {}),\n };\n}\n\nexport function sessionToRow(session: Session & { draft?: string }): SessionRow {\n return {\n id: session.id,\n workspace_id: session.workspaceId,\n terminal_id: session.terminalId,\n provider_id: session.providerId,\n state: session.state,\n capability: session.capability,\n started_at: session.startedAt ?? session.lastActiveAt,\n last_active_at: session.lastActiveAt,\n ended_at: session.endedAt ?? null,\n completion_percent: session.completionPercent ?? null,\n error_reason: session.errorReason ?? null,\n archived: 0,\n draft: session.draft ?? null,\n title: session.title ?? null,\n };\n}\n\n/**\n * Input type for creating a new session\n */\nexport interface NewSession {\n id: string;\n workspaceId: string;\n terminalId: string;\n providerId: string;\n state: SessionState;\n capability: \"full\" | \"limited\" | \"unsupported\";\n startedAt: number;\n lastActiveAt: number;\n completionPercent?: number;\n errorReason?: string;\n}\n\n/**\n * Session repository for CRUD operations\n */\nexport class SessionRepo {\n constructor(private db: Database) {}\n\n /**\n * Lists all sessions for a workspace\n */\n listByWorkspace(workspaceId: string): Session[] {\n const rows = this.db\n .prepare(\"SELECT * FROM sessions WHERE workspace_id = ? ORDER BY started_at DESC\")\n .all(workspaceId) as unknown as SessionRow[];\n return rows.map(rowToSession);\n }\n\n /**\n * Finds a session by ID\n */\n findById(id: string): Session | undefined {\n const row = this.db.prepare(\"SELECT * FROM sessions WHERE id = ?\").get(id) as\n | SessionRow\n | undefined;\n return row ? rowToSession(row) : undefined;\n }\n\n /**\n * Finds a session by terminal ID (1:1 relationship)\n */\n findByTerminalId(terminalId: string): Session | undefined {\n const row = this.db.prepare(\"SELECT * FROM sessions WHERE terminal_id = ?\").get(terminalId) as\n | SessionRow\n | undefined;\n return row ? rowToSession(row) : undefined;\n }\n\n /**\n * Lists all active (non-ended) sessions for a workspace\n */\n listActiveByWorkspace(workspaceId: string): Session[] {\n const rows = this.db\n .prepare(\n \"SELECT * FROM sessions WHERE workspace_id = ? AND ended_at IS NULL ORDER BY started_at DESC\"\n )\n .all(workspaceId) as unknown as SessionRow[];\n return rows.map(rowToSession);\n }\n\n /**\n * Creates a new session\n */\n create(session: NewSession): Session {\n const stmt = this.db.prepare(`\n INSERT INTO sessions (id, workspace_id, terminal_id, provider_id, capability, state, started_at, last_active_at, completion_percent, error_reason)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n stmt.run(\n session.id,\n session.workspaceId,\n session.terminalId,\n session.providerId,\n session.capability,\n session.state,\n session.startedAt,\n session.lastActiveAt,\n session.completionPercent ?? null,\n session.errorReason ?? null\n );\n\n return this.findById(session.id)!;\n }\n\n /**\n * Updates session state\n */\n updateState(id: string, state: SessionState): void {\n const stmt = this.db.prepare(\"UPDATE sessions SET state = ? WHERE id = ?\");\n stmt.run(state, id);\n }\n\n /**\n * Updates last active timestamp\n */\n updateLastActive(id: string, lastActiveAt: number): void {\n const stmt = this.db.prepare(\"UPDATE sessions SET last_active_at = ? WHERE id = ?\");\n stmt.run(lastActiveAt, id);\n }\n\n /**\n * Marks a session as ended\n */\n markEnded(id: string, endedAt: number): void {\n const stmt = this.db.prepare(\"UPDATE sessions SET ended_at = ?, state = ? WHERE id = ?\");\n stmt.run(endedAt, \"ended\", id);\n }\n\n /**\n * Updates completion percent (for full capability sessions)\n */\n updateCompletionPercent(id: string, completionPercent: number): void {\n const stmt = this.db.prepare(\"UPDATE sessions SET completion_percent = ? WHERE id = ?\");\n stmt.run(completionPercent, id);\n }\n\n /**\n * Sets error reason\n */\n setError(id: string, errorReason: string): void {\n const stmt = this.db.prepare(\"UPDATE sessions SET error_reason = ? WHERE id = ?\");\n stmt.run(errorReason, id);\n }\n\n /**\n * Archives a session\n */\n archive(id: string): void {\n const stmt = this.db.prepare(\"UPDATE sessions SET archived = 1 WHERE id = ?\");\n stmt.run(id);\n }\n\n /**\n * Deletes a session by ID\n */\n delete(id: string): void {\n const stmt = this.db.prepare(\"DELETE FROM sessions WHERE id = ?\");\n stmt.run(id);\n }\n}\n", "import type { IdleHeuristics } from \"@coder-studio/core\";\n\nexport type PtyDerivedState = \"running\" | \"idle\";\n\nexport interface PtyStateDetectorOptions {\n heuristics: IdleHeuristics;\n onStateChange: (state: PtyDerivedState) => void;\n}\n\nconst RECENT_BUFFER_LIMIT = 4096;\n\nexport class PtyStateDetector {\n private currentState: PtyDerivedState | null = null;\n private idleTimer: NodeJS.Timeout | null = null;\n private recentBuffer = \"\";\n\n constructor(private readonly options: PtyStateDetectorOptions) {}\n\n feed(chunk: Buffer): void {\n this.transitionTo(\"running\");\n this.recentBuffer = `${this.recentBuffer}${chunk.toString(\"utf8\")}`.slice(-RECENT_BUFFER_LIMIT);\n\n if (this.matchesIdlePrompt()) {\n this.clearIdleTimer();\n this.transitionTo(\"idle\");\n return;\n }\n\n this.scheduleIdleDebounce();\n }\n\n dispose(): void {\n this.clearIdleTimer();\n }\n\n private transitionTo(state: PtyDerivedState): void {\n if (this.currentState === state) {\n return;\n }\n\n this.currentState = state;\n this.options.onStateChange(state);\n }\n\n private matchesIdlePrompt(): boolean {\n return this.options.heuristics.idlePromptPatterns.some((pattern) =>\n pattern.test(this.recentBuffer)\n );\n }\n\n private scheduleIdleDebounce(): void {\n this.clearIdleTimer();\n this.idleTimer = setTimeout(() => {\n this.transitionTo(\"idle\");\n }, this.options.heuristics.idleDebounceMs);\n }\n\n private clearIdleTimer(): void {\n if (this.idleTimer === null) {\n return;\n }\n\n clearTimeout(this.idleTimer);\n this.idleTimer = null;\n }\n}\n", "import type { SessionState } from \"@coder-studio/core\";\n\nimport type { PtyDerivedState } from \"./pty-state-detector.js\";\n\nexport interface ShadowComparatorSnapshot {\n hookState: SessionState | null;\n ptyState: PtyDerivedState | null;\n lastDivergedAt: number | null;\n}\n\nexport interface ShadowComparator {\n observeHookState(state: SessionState): void;\n observePtyState(state: PtyDerivedState): void;\n snapshot(): ShadowComparatorSnapshot;\n}\n\nfunction areStatesAligned(\n hookState: SessionState | null,\n ptyState: PtyDerivedState | null\n): boolean {\n if (!hookState || !ptyState) {\n return true;\n }\n\n return (\n (hookState === \"running\" && ptyState === \"running\") ||\n (hookState === \"idle\" && ptyState === \"idle\")\n );\n}\n\nexport function createShadowComparator(\n log: (info: Record<string, unknown>) => void\n): ShadowComparator {\n let hookState: SessionState | null = null;\n let ptyState: PtyDerivedState | null = null;\n let lastDivergedAt: number | null = null;\n\n const compare = () => {\n if (areStatesAligned(hookState, ptyState)) {\n return;\n }\n\n lastDivergedAt = Date.now();\n log({\n metric: \"session.state.shadow.diverge\",\n hookState,\n ptyState,\n at: lastDivergedAt,\n });\n };\n\n return {\n observeHookState(state) {\n hookState = state;\n compare();\n },\n observePtyState(state) {\n ptyState = state;\n compare();\n },\n snapshot() {\n return {\n hookState,\n ptyState,\n lastDivergedAt,\n };\n },\n };\n}\n", "/**\n * Session Manager (spec \u00A74.6)\n *\n * Session is a business wrapper around an agent-kind Terminal.\n * It manages Agent domain semantics and the PTY-driven state machine.\n */\n\nimport type {\n DomainEvent,\n ProviderDefinition,\n Session,\n SessionState,\n TerminalInputActivity,\n} from \"@coder-studio/core\";\nimport { deriveSessionTitle } from \"@coder-studio/core\";\nimport type { EventBus, Unsubscribe } from \"../bus/event-bus.js\";\nimport { mergeProviderLaunchConfig } from \"../provider-config.js\";\nimport type { ProviderConfigRepo } from \"../storage/repositories/provider-config-repo.js\";\nimport { type SessionRow, sessionToRow } from \"../storage/repositories/session-repo.js\";\nimport type { TerminalManager } from \"../terminal/manager.js\";\nimport type { RenderOptions } from \"../terminal/snapshot-render.js\";\nimport type { TerminalSpec } from \"../terminal/types.js\";\nimport type { Broadcaster } from \"../ws/hub.js\";\nimport { PtyStateDetector } from \"./pty-state-detector.js\";\nimport { createShadowComparator, type ShadowComparator } from \"./state-shadow-comparator.js\";\nimport type { SessionDatabase } from \"./types.js\";\n\nexport interface CreateSessionRequest {\n workspaceId: string;\n workspacePath: string;\n providerId: string;\n provider: ProviderDefinition;\n draft?: string;\n}\n\nexport interface SessionLogger {\n warn(context: Record<string, unknown>, message: string): void;\n}\n\nexport interface SessionManagerDeps {\n terminalMgr: TerminalManager;\n eventBus: EventBus;\n db: SessionDatabase;\n broadcaster: Broadcaster;\n providerRegistry: ProviderDefinition[];\n providerConfigRepo: ProviderConfigRepo;\n logger?: SessionLogger;\n}\n\n/**\n * Generate unique session ID\n */\nfunction generateSessionId(): string {\n return `sess_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Session Manager handles:\n * - Creating sessions via provider configuration\n * - Managing session state machine\n * - Broadcasting session events\n */\nconst NOOP_SESSION_LOGGER: SessionLogger = {\n warn: () => {},\n};\n\ntype TerminalExitedEvent = Extract<DomainEvent, { type: \"terminal.exited\" }>;\ntype TerminalOutputEvent = Extract<DomainEvent, { type: \"terminal.output\" }>;\n\nexport class SessionManager {\n private sessions = new Map<string, ActiveSession>();\n private terminalToSession = new Map<string, string>();\n private detectors = new Map<string, PtyStateDetector>();\n private comparators = new Map<string, ShadowComparator>();\n private detectorUnsubscribes = new Map<string, Unsubscribe>();\n private readonly logger: SessionLogger;\n\n constructor(private readonly deps: SessionManagerDeps) {\n this.logger = deps.logger ?? NOOP_SESSION_LOGGER;\n\n this.deps.eventBus.on(\"terminal.exited\", (event: TerminalExitedEvent) => {\n this.onTerminalExit(event.terminalId, event.exitCode);\n });\n }\n\n /**\n * Create a new session with provider\n */\n async create(req: CreateSessionRequest): Promise<Session> {\n const sessionId = generateSessionId();\n const launchConfig = this.getLaunchConfig(req.providerId, req.provider);\n\n // Build command from provider (pass config and context)\n const cmd = req.provider.buildCommand(launchConfig, {\n workspacePath: req.workspacePath,\n sessionId,\n });\n\n // Create terminal spec\n const terminalSpec: TerminalSpec = {\n workspaceId: req.workspaceId,\n kind: \"agent\",\n argv: cmd.argv,\n cwd: cmd.cwd,\n env: {\n ...cmd.env,\n CODER_STUDIO_SESSION_ID: sessionId,\n },\n title: req.provider.displayName,\n };\n\n // Create terminal (delegates to TerminalManager)\n const terminal = this.deps.terminalMgr.create(terminalSpec);\n\n // Register session only after terminal creation succeeds so failed creates\n // do not leak half-created sessions into memory or hydration state.\n const active = new ActiveSession({\n id: sessionId,\n workspaceId: req.workspaceId,\n providerId: req.providerId,\n terminalId: terminal.id,\n capability: req.provider.capability,\n state: \"starting\",\n draft: req.draft,\n });\n\n this.sessions.set(sessionId, active);\n this.terminalToSession.set(terminal.id, sessionId);\n this.attachShadowDetector(active, req.provider);\n\n // Persist initial (`starting`) row so subsequent update() calls have a\n // target to UPDATE and so a crash between here and the optimistic idle\n // promotion below still leaves a sane DB state.\n this.deps.db.insert(active.toRow());\n\n // Emit the initial `starting` snapshot so clients can latch session\n // creation before any optimistic transition fires.\n this.emitStateChanged(active, null, \"starting\");\n\n return active.toDTO();\n }\n\n /**\n * Stop a running session\n */\n async stop(sessionId: string): Promise<void> {\n const session = this.sessions.get(sessionId);\n if (!session) {\n throw new Error(`Session not found: ${sessionId}`);\n }\n\n if (session.state === \"ended\") {\n this.terminalToSession.delete(session.terminalId);\n this.cleanupDetector(session.id);\n return;\n }\n\n await this.deps.terminalMgr.close(session.terminalId);\n\n const latestSession = this.sessions.get(session.id);\n if (!latestSession || latestSession.state === \"ended\") {\n return;\n }\n\n this.finishSession(\n latestSession,\n this.terminalToSession.has(latestSession.terminalId) ? undefined : 0\n );\n }\n\n async hydrate(): Promise<void> {\n const persistedSessions = this.deps.db.listHydratable();\n\n for (const session of persistedSessions) {\n if (this.sessions.has(session.id)) {\n continue;\n }\n\n const nextState = this.resolveHydratedState(session);\n const hydrated = new ActiveSession({\n id: session.id,\n workspaceId: session.workspaceId,\n providerId: session.providerId,\n terminalId: session.terminalId,\n capability: session.capability,\n state: nextState,\n title: session.title,\n startedAt: session.startedAt,\n lastActiveAt: session.lastActiveAt,\n endedAt: session.endedAt,\n completionPercent: session.completionPercent,\n errorReason: session.errorReason,\n });\n\n this.sessions.set(session.id, hydrated);\n this.terminalToSession.set(session.terminalId, session.id);\n\n if (nextState !== session.state) {\n this.deps.db.update(session.id, { state: nextState });\n }\n }\n }\n\n private resolveHydratedState(session: Session): SessionState {\n if (session.state === \"draft\") {\n return \"draft\";\n }\n\n const activeTerminal = this.deps.terminalMgr.get(session.terminalId);\n if (activeTerminal?.alive) {\n return session.state;\n }\n\n if (session.state === \"ended\") {\n return session.state;\n }\n\n return \"ended\";\n }\n\n private getLaunchConfig(providerId: string, provider: ProviderDefinition) {\n return mergeProviderLaunchConfig(provider, this.deps.providerConfigRepo.get(providerId));\n }\n\n /**\n * Get session by ID\n */\n get(sessionId: string): Session | undefined {\n return this.sessions.get(sessionId)?.toDTO();\n }\n\n /**\n * Get all sessions for a workspace\n */\n getForWorkspace(workspaceId: string): Session[] {\n return Array.from(this.sessions.values())\n .filter((s) => s.workspaceId === workspaceId)\n .map((s) => s.toDTO());\n }\n\n async stopForWorkspace(workspaceId: string): Promise<void> {\n const sessions = Array.from(this.sessions.values()).filter(\n (session) => session.workspaceId === workspaceId\n );\n\n for (const session of sessions) {\n if (session.state === \"ended\") {\n this.terminalToSession.delete(session.terminalId);\n this.cleanupDetector(session.id);\n continue;\n }\n\n await this.stop(session.id);\n }\n }\n\n deleteEndedForWorkspace(workspaceId: string): void {\n const endedSessions = Array.from(this.sessions.values()).filter(\n (session) => session.workspaceId === workspaceId && session.state === \"ended\"\n );\n\n for (const session of endedSessions) {\n this.sessions.delete(session.id);\n this.terminalToSession.delete(session.terminalId);\n this.cleanupDetector(session.id);\n }\n }\n\n /**\n * Mark a session as actively running again after a submitted message reaches\n * its terminal. Also captures the session title on the *first* submit so the\n * UI can show something more meaningful than \"SESSION-XX\".\n *\n * The title is assigned at most once per session (idempotent): once\n * `session.title` is set, later submits never overwrite it, even across\n * resumes, restarts, or rehydrations.\n */\n onTerminalInput(\n terminalId: string,\n activity: TerminalInputActivity = \"typing\",\n text?: string\n ): void {\n const sessionId = this.terminalToSession.get(terminalId);\n if (!sessionId) return;\n\n const session = this.sessions.get(sessionId);\n if (!session) return;\n\n this.applyTerminalInputActivity(session, activity, text, { armTurnCompletion: true });\n }\n\n private applyTerminalInputActivity(\n session: ActiveSession,\n activity: TerminalInputActivity,\n text: string | undefined,\n options: { armTurnCompletion: boolean }\n ): void {\n if (activity === \"control\" || activity === \"typing\") {\n return;\n }\n\n if (activity === \"internal_submit\") {\n if (options.armTurnCompletion) {\n session.awaitingTurnCompletion = true;\n session.sawOutputSinceTurnStart = false;\n }\n const prev = session.state;\n if (session.state !== \"running\") {\n session.state = \"running\";\n session.lastActiveAt = Date.now();\n this.deps.db.update(session.id, {\n state: \"running\",\n lastActiveAt: session.lastActiveAt,\n });\n this.emitStateChanged(session, prev, \"running\");\n }\n return;\n }\n\n if (activity !== \"submit\") return;\n\n const submittedText = text;\n if (submittedText?.trim()) {\n session.latestSubmittedUserInput = submittedText.trim();\n }\n if (options.armTurnCompletion) {\n session.awaitingTurnCompletion = true;\n session.sawOutputSinceTurnStart = false;\n }\n\n // Title capture runs independently of state transitions: a session that\n // is still 'starting' or 'running' when the user types won't flip state\n // here, but we still want to record the first instruction as the title.\n const titleChanged = this.maybeAssignTitle(session, submittedText);\n\n const prev = session.state;\n const shouldResume = session.state === \"idle\" || session.state === \"starting\";\n\n if (shouldResume) {\n session.state = \"running\";\n session.lastActiveAt = Date.now();\n\n this.deps.db.update(session.id, {\n state: \"running\",\n lastActiveAt: session.lastActiveAt,\n });\n\n this.emitStateChanged(session, prev, \"running\");\n } else if (titleChanged) {\n // State stayed the same, but the DTO changed (title added) and the UI\n // subscribes via state.changed broadcasts \u2014 fire a no-op transition so\n // the fresh DTO is pushed to clients.\n this.emitStateChanged(session, prev, session.state);\n }\n }\n\n /**\n * Session-level input writes to the underlying PTY and updates session activity.\n */\n sendInput(\n sessionId: string,\n bytes: Buffer,\n activity: TerminalInputActivity = \"typing\",\n submittedText?: string\n ): void {\n const session = this.sessions.get(sessionId);\n if (!session) {\n throw new Error(`Session not found: ${sessionId}`);\n }\n\n const text =\n activity === \"submit\" || activity === \"internal_submit\"\n ? (submittedText ?? bytes.toString(\"utf-8\"))\n : undefined;\n const rollbackArm = this.armTurnCompletionBeforeWrite(session, activity);\n\n try {\n this.deps.terminalMgr.write(session.terminalId, bytes);\n } catch (error) {\n rollbackArm?.();\n throw error;\n }\n\n this.applyTerminalInputActivity(session, activity, text, { armTurnCompletion: false });\n this.flushPendingPtyIdle(session);\n }\n\n /**\n * Session-level resize forwards to the underlying PTY.\n */\n resize(sessionId: string, cols: number, rows: number): void {\n const session = this.sessions.get(sessionId);\n if (!session) {\n throw new Error(`Session not found: ${sessionId}`);\n }\n\n this.deps.terminalMgr.resize(session.terminalId, cols, rows);\n }\n\n /**\n * Read the last N bytes of terminal output for a session.\n */\n getOutputTail(sessionId: string, bytes: number = 4096): Buffer {\n const session = this.sessions.get(sessionId);\n if (!session) {\n return Buffer.alloc(0);\n }\n\n return this.deps.terminalMgr.getRingBufferTail(session.terminalId, bytes);\n }\n\n /**\n * Render the current session snapshot to plain text for supervisor use.\n */\n async getRenderedSnapshot(sessionId: string, options: RenderOptions): Promise<string> {\n const session = this.sessions.get(sessionId);\n if (!session) {\n return \"\";\n }\n\n return this.deps.terminalMgr.getRenderedSnapshot(session.terminalId, options);\n }\n\n /**\n * Return the most recent submitted user input observed for the session.\n */\n getLatestSubmittedUserInput(sessionId: string): string | undefined {\n return this.sessions.get(sessionId)?.latestSubmittedUserInput;\n }\n\n /**\n * Resolve the session that owns a terminal, if any.\n */\n findSessionIdByTerminal(terminalId: string): string | undefined {\n return this.terminalToSession.get(terminalId);\n }\n\n /**\n * Assigns a title to the session from the first submitted instruction, if\n * one hasn't been assigned yet. Returns true when a new title was persisted.\n */\n private maybeAssignTitle(session: ActiveSession, text: string | undefined): boolean {\n if (session.title) return false;\n if (!text) return false;\n\n const title = deriveSessionTitle(text);\n\n if (!title) return false;\n\n session.title = title;\n this.deps.db.update(session.id, { title });\n return true;\n }\n\n /**\n * Handle terminal exit event\n */\n onTerminalExit(terminalId: string, exitCode: number): void {\n const sessionId = this.terminalToSession.get(terminalId);\n if (!sessionId) return;\n\n const session = this.sessions.get(sessionId);\n if (!session) return;\n\n this.finishSession(session, exitCode);\n }\n\n /**\n * Delete a session\n * Only allowed for sessions in 'ended' state\n */\n delete(sessionId: string): void {\n const session = this.sessions.get(sessionId);\n if (!session) {\n throw new Error(`Session not found: ${sessionId}`);\n }\n\n if (session.state !== \"ended\") {\n throw new Error(`Cannot delete session in state: ${session.state}`);\n }\n\n // Remove from memory\n this.sessions.delete(sessionId);\n this.terminalToSession.delete(session.terminalId);\n this.cleanupDetector(sessionId);\n\n // Delete from database\n this.deps.db.delete(sessionId);\n\n // Emit removed event\n this.deps.eventBus.emit({\n type: \"session.lifecycle\",\n workspaceId: session.workspaceId,\n sessionId,\n event: \"removed\",\n } as DomainEvent);\n }\n\n /**\n * Emit state changed event\n */\n private emitStateChanged(\n session: ActiveSession,\n from: SessionState | null,\n to: SessionState\n ): void {\n this.comparators.get(session.id)?.observeHookState(session.state);\n const event: Extract<DomainEvent, { type: \"session.state.changed\" }> = {\n type: \"session.state.changed\",\n sessionId: session.id,\n workspaceId: session.workspaceId,\n from: from ?? \"draft\",\n to,\n session: session.toDTO(),\n };\n this.deps.eventBus.emit(event);\n }\n\n private armTurnCompletionBeforeWrite(\n session: ActiveSession,\n activity: TerminalInputActivity\n ): (() => void) | null {\n if (activity !== \"submit\" && activity !== \"internal_submit\") {\n return null;\n }\n\n const previousAwaitingTurnCompletion = session.awaitingTurnCompletion;\n const previousSawOutputSinceTurnStart = session.sawOutputSinceTurnStart;\n session.awaitingTurnCompletion = true;\n session.sawOutputSinceTurnStart = false;\n\n return () => {\n session.awaitingTurnCompletion = previousAwaitingTurnCompletion;\n session.sawOutputSinceTurnStart = previousSawOutputSinceTurnStart;\n };\n }\n\n private flushPendingPtyIdle(session: ActiveSession): void {\n const ptyState = this.comparators.get(session.id)?.snapshot().ptyState;\n if (ptyState !== \"idle\") {\n return;\n }\n\n this.transitionSessionToIdle(session);\n }\n\n private transitionSessionToIdle(activeSession: ActiveSession): void {\n const prev = activeSession.state;\n if (prev !== \"running\" && prev !== \"starting\") {\n return;\n }\n\n if (prev === \"running\" && !activeSession.sawOutputSinceTurnStart) {\n return;\n }\n\n const shouldEmitTurnCompleted = prev === \"running\" && activeSession.awaitingTurnCompletion;\n activeSession.state = \"idle\";\n activeSession.awaitingTurnCompletion = false;\n activeSession.sawOutputSinceTurnStart = false;\n if (!activeSession.startedAt) {\n activeSession.startedAt = Date.now();\n }\n this.deps.db.update(activeSession.id, {\n state: \"idle\",\n startedAt: activeSession.startedAt,\n });\n this.emitStateChanged(activeSession, prev, \"idle\");\n if (shouldEmitTurnCompleted) {\n this.deps.eventBus.emit({\n type: \"session.lifecycle\",\n workspaceId: activeSession.workspaceId,\n sessionId: activeSession.id,\n event: \"turn_completed\",\n } as DomainEvent);\n }\n }\n\n private attachShadowDetector(session: ActiveSession, provider: ProviderDefinition): void {\n if (!provider.idleHeuristics) {\n return;\n }\n\n const comparator = createShadowComparator((info) => {\n this.logger.warn(\n {\n ...info,\n sessionId: session.id,\n terminalId: session.terminalId,\n providerId: session.providerId,\n },\n \"[SessionManager] PTY shadow state divergence\"\n );\n });\n\n const detector = new PtyStateDetector({\n heuristics: provider.idleHeuristics,\n onStateChange: (state) => {\n const activeSession = this.sessions.get(session.id);\n if (!activeSession) {\n return;\n }\n\n const prev = activeSession.state;\n if (state === \"idle\" && (prev === \"running\" || prev === \"starting\")) {\n this.transitionSessionToIdle(activeSession);\n }\n\n comparator.observePtyState(state);\n },\n });\n\n const unsubscribe = this.deps.eventBus.on(\"terminal.output\", (event: TerminalOutputEvent) => {\n if (event.terminalId !== session.terminalId) {\n return;\n }\n\n const activeSession = this.sessions.get(session.id);\n if (activeSession?.awaitingTurnCompletion) {\n activeSession.sawOutputSinceTurnStart = true;\n }\n\n detector.feed(event.chunk);\n });\n\n this.comparators.set(session.id, comparator);\n this.detectors.set(session.id, detector);\n this.detectorUnsubscribes.set(session.id, unsubscribe);\n }\n\n private cleanupDetector(sessionId: string): void {\n this.detectorUnsubscribes.get(sessionId)?.();\n this.detectorUnsubscribes.delete(sessionId);\n this.detectors.get(sessionId)?.dispose();\n this.detectors.delete(sessionId);\n this.comparators.delete(sessionId);\n }\n\n private finishSession(session: ActiveSession, exitCode: number | undefined): void {\n const prev = session.state;\n session.state = \"ended\";\n session.endedAt = Date.now();\n session.exitCode = exitCode;\n this.terminalToSession.delete(session.terminalId);\n this.cleanupDetector(session.id);\n\n this.deps.db.update(session.id, {\n state: \"ended\",\n endedAt: session.endedAt,\n });\n\n this.emitStateChanged(session, prev, \"ended\");\n }\n}\n\n/**\n * Active session with mutable state\n */\nclass ActiveSession {\n id: string;\n workspaceId: string;\n terminalId: string;\n providerId: string;\n state: SessionState;\n capability: \"full\" | \"limited\" | \"unsupported\";\n startedAt?: number;\n lastActiveAt: number;\n endedAt?: number;\n completionPercent?: number;\n errorReason?: string;\n exitCode?: number;\n draft?: string;\n title?: string;\n latestSubmittedUserInput?: string;\n awaitingTurnCompletion = false;\n sawOutputSinceTurnStart = false;\n\n constructor(data: {\n id: string;\n workspaceId: string;\n providerId: string;\n terminalId: string;\n capability: \"full\" | \"limited\" | \"unsupported\";\n state: SessionState;\n draft?: string;\n title?: string;\n startedAt?: number;\n lastActiveAt?: number;\n endedAt?: number;\n completionPercent?: number;\n errorReason?: string;\n }) {\n this.id = data.id;\n this.workspaceId = data.workspaceId;\n this.providerId = data.providerId;\n this.terminalId = data.terminalId;\n this.capability = data.capability;\n this.state = data.state;\n this.draft = data.draft;\n this.title = data.title;\n this.startedAt = data.startedAt ?? Date.now();\n this.lastActiveAt = data.lastActiveAt ?? this.startedAt;\n this.endedAt = data.endedAt;\n this.completionPercent = data.completionPercent;\n this.errorReason = data.errorReason;\n }\n\n toDTO(): Session {\n return {\n id: this.id,\n workspaceId: this.workspaceId,\n terminalId: this.terminalId,\n providerId: this.providerId,\n state: this.state,\n capability: this.capability,\n startedAt: this.startedAt ?? Date.now(),\n lastActiveAt: this.lastActiveAt,\n endedAt: this.endedAt,\n completionPercent: this.completionPercent,\n errorReason: this.errorReason,\n title: this.title,\n };\n }\n\n toRow(): SessionRow {\n return sessionToRow({\n ...this.toDTO(),\n ...(this.draft !== undefined ? { draft: this.draft } : {}),\n });\n }\n}\n", "import { DatabaseSync } from \"node:sqlite\";\n\nexport type Database = DatabaseSync;\n\nexport function withTransaction<T>(db: Database, fn: () => T): T {\n db.exec(\"BEGIN\");\n try {\n const result = fn();\n db.exec(\"COMMIT\");\n return result;\n } catch (error) {\n if (db.isTransaction) {\n db.exec(\"ROLLBACK\");\n }\n throw error;\n }\n}\n", "import { DatabaseSync } from \"node:sqlite\";\nimport { readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport type { Database } from \"./database.js\";\n\ninterface SchemaEntryRow {\n type: string;\n name: string;\n tbl_name: string;\n sql: string | null;\n}\n\ninterface SchemaEntry {\n type: string;\n name: string;\n tableName: string;\n sql: string;\n}\n\ninterface UserVersionRow {\n user_version: number;\n}\n\nexport type SchemaState = \"empty\" | \"current\" | \"v1\" | \"v2\" | \"incompatible\";\n\nexport interface SchemaDetection {\n state: SchemaState;\n userVersion: number;\n mismatch: string | null;\n}\n\nexport const CURRENT_SCHEMA_VERSION = 2;\n\nconst CURRENT_SCHEMA_PATH = join(import.meta.dirname, \"migrations\", \"001_init.sql\");\n\nexport const CURRENT_SCHEMA_SQL = readFileSync(CURRENT_SCHEMA_PATH, \"utf-8\");\n\nexport const V1_SCHEMA_SQL = `\nCREATE TABLE workspaces (\n id TEXT PRIMARY KEY,\n path TEXT NOT NULL UNIQUE,\n target_runtime TEXT NOT NULL,\n wsl_distro TEXT,\n opened_at INTEGER NOT NULL,\n last_active_at INTEGER NOT NULL,\n ui_state TEXT\n);\n\nCREATE TABLE terminals (\n id TEXT PRIMARY KEY,\n workspace_id TEXT NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,\n kind TEXT NOT NULL,\n cwd TEXT NOT NULL,\n argv TEXT NOT NULL,\n env TEXT,\n title TEXT,\n cols INTEGER NOT NULL,\n rows INTEGER NOT NULL,\n created_at INTEGER NOT NULL,\n ended_at INTEGER,\n exit_code INTEGER\n);\n\nCREATE INDEX idx_terminals_workspace ON terminals(workspace_id);\nCREATE INDEX idx_terminals_kind ON terminals(workspace_id, kind);\n\nCREATE TABLE sessions (\n id TEXT PRIMARY KEY,\n workspace_id TEXT NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,\n terminal_id TEXT NOT NULL REFERENCES terminals(id) ON DELETE CASCADE,\n provider_id TEXT NOT NULL,\n capability TEXT NOT NULL,\n state TEXT NOT NULL,\n started_at INTEGER NOT NULL,\n ended_at INTEGER,\n last_active_at INTEGER NOT NULL,\n completion_percent INTEGER,\n error_reason TEXT,\n archived BOOLEAN DEFAULT 0,\n title TEXT\n);\n\nCREATE INDEX idx_sessions_workspace ON sessions(workspace_id);\nCREATE UNIQUE INDEX idx_sessions_terminal ON sessions(terminal_id);\nCREATE UNIQUE INDEX idx_sessions_id_workspace ON sessions(id, workspace_id);\n\nCREATE TABLE provider_configs (\n provider_id TEXT PRIMARY KEY,\n config TEXT NOT NULL\n);\n\nCREATE TABLE user_settings (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n);\n\nCREATE TABLE auth_sessions (\n token TEXT PRIMARY KEY,\n created_at INTEGER NOT NULL,\n last_seen_at INTEGER NOT NULL\n);\n\nCREATE INDEX idx_auth_sessions_last_seen_at ON auth_sessions(last_seen_at);\n\nCREATE TABLE supervisors (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL UNIQUE,\n workspace_id TEXT NOT NULL,\n state TEXT NOT NULL,\n objective TEXT NOT NULL,\n evaluator_provider_id TEXT NOT NULL,\n last_cycle_at INTEGER,\n last_evaluated_turn_id TEXT,\n error_reason TEXT,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL,\n FOREIGN KEY (session_id, workspace_id) REFERENCES sessions(id, workspace_id) ON DELETE CASCADE,\n FOREIGN KEY (workspace_id) REFERENCES workspaces(id) ON DELETE CASCADE\n);\n\nCREATE INDEX idx_supervisors_workspace ON supervisors(workspace_id);\nCREATE INDEX idx_supervisors_session ON supervisors(session_id);\nCREATE UNIQUE INDEX idx_supervisors_id_session ON supervisors(id, session_id);\n\nCREATE TABLE supervisor_cycles (\n id TEXT PRIMARY KEY,\n supervisor_id TEXT NOT NULL,\n session_id TEXT NOT NULL,\n status TEXT NOT NULL,\n trigger TEXT NOT NULL,\n evidence_source TEXT NOT NULL,\n objective TEXT NOT NULL,\n evaluator_provider_id TEXT NOT NULL,\n turn_id TEXT,\n progress INTEGER,\n result TEXT,\n injected_guidance TEXT,\n error_reason TEXT,\n created_at INTEGER NOT NULL,\n completed_at INTEGER,\n FOREIGN KEY (supervisor_id, session_id) REFERENCES supervisors(id, session_id) ON DELETE CASCADE,\n FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE\n);\n\nCREATE INDEX idx_supervisor_cycles_supervisor ON supervisor_cycles(supervisor_id, created_at DESC);\nCREATE INDEX idx_supervisor_cycles_session ON supervisor_cycles(session_id, created_at DESC);\n\nCREATE TABLE auth_login_blocks (\n ip TEXT PRIMARY KEY,\n failed_count INTEGER NOT NULL,\n first_failed_at INTEGER NOT NULL,\n last_failed_at INTEGER NOT NULL,\n blocked_until INTEGER\n);\n\nCREATE INDEX idx_auth_login_blocks_blocked_until ON auth_login_blocks(blocked_until);\n\nCREATE TABLE auth_login_failures (\n ip TEXT NOT NULL,\n failed_at INTEGER NOT NULL\n);\n\nCREATE INDEX idx_auth_login_failures_ip_failed_at ON auth_login_failures(ip, failed_at);\n`;\n\nexport const V2_SCHEMA_SQL = `\nCREATE TABLE workspaces (\n id TEXT PRIMARY KEY,\n path TEXT NOT NULL UNIQUE,\n target_runtime TEXT NOT NULL,\n wsl_distro TEXT,\n opened_at INTEGER NOT NULL,\n last_active_at INTEGER NOT NULL,\n ui_state TEXT\n);\n\nCREATE TABLE terminals (\n id TEXT PRIMARY KEY,\n workspace_id TEXT NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,\n kind TEXT NOT NULL,\n cwd TEXT NOT NULL,\n argv TEXT NOT NULL,\n env TEXT,\n title TEXT,\n cols INTEGER NOT NULL,\n rows INTEGER NOT NULL,\n created_at INTEGER NOT NULL,\n ended_at INTEGER,\n exit_code INTEGER\n);\n\nCREATE INDEX idx_terminals_workspace ON terminals(workspace_id);\nCREATE INDEX idx_terminals_kind ON terminals(workspace_id, kind);\n\nCREATE TABLE sessions (\n id TEXT PRIMARY KEY,\n workspace_id TEXT NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,\n terminal_id TEXT NOT NULL REFERENCES terminals(id) ON DELETE CASCADE,\n provider_id TEXT NOT NULL,\n capability TEXT NOT NULL,\n state TEXT NOT NULL,\n started_at INTEGER NOT NULL,\n ended_at INTEGER,\n last_active_at INTEGER NOT NULL,\n completion_percent INTEGER,\n error_reason TEXT,\n archived BOOLEAN DEFAULT 0,\n title TEXT\n);\n\nCREATE INDEX idx_sessions_workspace ON sessions(workspace_id);\nCREATE UNIQUE INDEX idx_sessions_terminal ON sessions(terminal_id);\nCREATE UNIQUE INDEX idx_sessions_id_workspace ON sessions(id, workspace_id);\n\nCREATE TABLE provider_configs (\n provider_id TEXT PRIMARY KEY,\n config TEXT NOT NULL\n);\n\nCREATE TABLE user_settings (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n);\n\nCREATE TABLE auth_sessions (\n token TEXT PRIMARY KEY,\n created_at INTEGER NOT NULL,\n last_seen_at INTEGER NOT NULL\n);\n\nCREATE INDEX idx_auth_sessions_last_seen_at ON auth_sessions(last_seen_at);\n\nCREATE TABLE supervisors (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL UNIQUE,\n workspace_id TEXT NOT NULL,\n state TEXT NOT NULL,\n objective TEXT NOT NULL,\n evaluator_provider_id TEXT NOT NULL,\n last_cycle_at INTEGER,\n last_evaluated_turn_id TEXT,\n error_reason TEXT,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL,\n evaluator_model TEXT,\n max_supervision_count INTEGER NOT NULL DEFAULT 0,\n completed_supervision_count INTEGER NOT NULL DEFAULT 0,\n scheduled_at INTEGER,\n stop_reason TEXT,\n FOREIGN KEY (session_id, workspace_id) REFERENCES sessions(id, workspace_id) ON DELETE CASCADE,\n FOREIGN KEY (workspace_id) REFERENCES workspaces(id) ON DELETE CASCADE\n);\n\nCREATE INDEX idx_supervisors_workspace ON supervisors(workspace_id);\nCREATE INDEX idx_supervisors_session ON supervisors(session_id);\nCREATE UNIQUE INDEX idx_supervisors_id_session ON supervisors(id, session_id);\n\nCREATE TABLE supervisor_cycles (\n id TEXT PRIMARY KEY,\n supervisor_id TEXT NOT NULL,\n session_id TEXT NOT NULL,\n status TEXT NOT NULL,\n trigger TEXT NOT NULL,\n evidence_source TEXT NOT NULL,\n objective TEXT NOT NULL,\n evaluator_provider_id TEXT NOT NULL,\n turn_id TEXT,\n progress INTEGER,\n result TEXT,\n injected_guidance TEXT,\n error_reason TEXT,\n created_at INTEGER NOT NULL,\n completed_at INTEGER,\n FOREIGN KEY (supervisor_id, session_id) REFERENCES supervisors(id, session_id) ON DELETE CASCADE,\n FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE\n);\n\nCREATE INDEX idx_supervisor_cycles_supervisor ON supervisor_cycles(supervisor_id, created_at DESC);\nCREATE INDEX idx_supervisor_cycles_session ON supervisor_cycles(session_id, created_at DESC);\n\nCREATE TABLE supervisor_cycle_attempts (\n id TEXT PRIMARY KEY,\n cycle_id TEXT NOT NULL REFERENCES supervisor_cycles(id) ON DELETE CASCADE,\n attempt_index INTEGER NOT NULL,\n status TEXT NOT NULL,\n started_at INTEGER NOT NULL,\n completed_at INTEGER,\n error_reason TEXT,\n provider_model TEXT\n);\n\nCREATE INDEX idx_supervisor_cycle_attempts_cycle ON supervisor_cycle_attempts(cycle_id, attempt_index);\n\nCREATE TABLE auth_login_blocks (\n ip TEXT PRIMARY KEY,\n failed_count INTEGER NOT NULL,\n first_failed_at INTEGER NOT NULL,\n last_failed_at INTEGER NOT NULL,\n blocked_until INTEGER\n);\n\nCREATE INDEX idx_auth_login_blocks_blocked_until ON auth_login_blocks(blocked_until);\n\nCREATE TABLE auth_login_failures (\n ip TEXT NOT NULL,\n failed_at INTEGER NOT NULL\n);\n\nCREATE INDEX idx_auth_login_failures_ip_failed_at ON auth_login_failures(ip, failed_at);\n`;\n\nfunction normalizeSql(sql: string | null): string {\n return (sql ?? \"\").replace(/\\s+/g, \" \").trim();\n}\n\nfunction listSchemaEntries(db: Database): SchemaEntry[] {\n const rows = db\n .prepare(\n `\n SELECT type, name, tbl_name, sql\n FROM sqlite_master\n WHERE type IN ('table', 'index', 'view', 'trigger')\n AND name NOT LIKE 'sqlite_%'\n ORDER BY type, name\n `\n )\n .all() as unknown as SchemaEntryRow[];\n\n return rows.map((row) => ({\n type: row.type,\n name: row.name,\n tableName: row.tbl_name,\n sql: normalizeSql(row.sql),\n }));\n}\n\nfunction schemaEntrySignature(entry: SchemaEntry): string {\n return `${entry.type}:${entry.name}:${entry.tableName}:${entry.sql}`;\n}\n\nfunction buildSchemaEntries(schemaSql: string): SchemaEntry[] {\n const db = new DatabaseSync(\":memory:\");\n try {\n db.exec(schemaSql);\n return listSchemaEntries(db);\n } finally {\n db.close();\n }\n}\n\nconst CURRENT_SCHEMA_ENTRIES = buildSchemaEntries(CURRENT_SCHEMA_SQL);\nconst V1_SCHEMA_ENTRIES = buildSchemaEntries(V1_SCHEMA_SQL);\nconst V2_SCHEMA_ENTRIES = buildSchemaEntries(V2_SCHEMA_SQL);\n\nfunction hasExactFingerprint(\n actualEntries: SchemaEntry[],\n expectedEntries: SchemaEntry[]\n): boolean {\n if (actualEntries.length !== expectedEntries.length) {\n return false;\n }\n\n return actualEntries.every(\n (entry, index) => schemaEntrySignature(entry) === schemaEntrySignature(expectedEntries[index]!)\n );\n}\n\nfunction describeSchemaMismatch(expected: SchemaEntry[], actual: SchemaEntry[]): string {\n const expectedByName = new Map(expected.map((entry) => [`${entry.type}:${entry.name}`, entry]));\n const actualByName = new Map(actual.map((entry) => [`${entry.type}:${entry.name}`, entry]));\n const keys = new Set([...expectedByName.keys(), ...actualByName.keys()]);\n\n for (const key of keys) {\n const expectedEntry = expectedByName.get(key);\n const actualEntry = actualByName.get(key);\n\n if (!expectedEntry) {\n return `unexpected ${actualEntry?.type ?? \"schema object\"} ${actualEntry?.name ?? key}`;\n }\n\n if (!actualEntry) {\n return `missing ${expectedEntry.type} ${expectedEntry.name}`;\n }\n\n if (schemaEntrySignature(expectedEntry) !== schemaEntrySignature(actualEntry)) {\n return `definition mismatch for ${expectedEntry.type} ${expectedEntry.name}`;\n }\n }\n\n return \"unknown schema drift\";\n}\n\nexport function detectSchema(db: Database): SchemaDetection {\n const actualEntries = listSchemaEntries(db);\n const userVersionRow = db.prepare(\"PRAGMA user_version\").get() as UserVersionRow | undefined;\n const userVersion = userVersionRow?.user_version ?? 0;\n\n if (actualEntries.length === 0) {\n return {\n state: \"empty\",\n userVersion,\n mismatch: null,\n };\n }\n\n if (hasExactFingerprint(actualEntries, CURRENT_SCHEMA_ENTRIES)) {\n return {\n state: \"current\",\n userVersion,\n mismatch: null,\n };\n }\n\n if (hasExactFingerprint(actualEntries, V1_SCHEMA_ENTRIES)) {\n return {\n state: \"v1\",\n userVersion,\n mismatch: null,\n };\n }\n\n if (hasExactFingerprint(actualEntries, V2_SCHEMA_ENTRIES)) {\n return {\n state: CURRENT_SCHEMA_VERSION === 2 ? \"current\" : \"v2\",\n userVersion,\n mismatch: null,\n };\n }\n\n return {\n state: \"incompatible\",\n userVersion,\n mismatch: describeSchemaMismatch(CURRENT_SCHEMA_ENTRIES, actualEntries),\n };\n}\n\nexport function stampCurrentSchemaVersion(db: Database): void {\n db.exec(`PRAGMA user_version = ${CURRENT_SCHEMA_VERSION}`);\n}\n\nexport function stampSchemaVersion(db: Database, version: number): void {\n db.exec(`PRAGMA user_version = ${version}`);\n}\n\nexport class IncompatibleSchemaError extends Error {\n readonly code = \"db_incompatible_schema\";\n\n constructor(dbPath: string, mismatch: string) {\n super(\n `db_incompatible_schema: Database schema mismatch detected at ${dbPath}: ${mismatch}. ` +\n \"This build requires the current baseline schema. Delete the local database file and restart.\"\n );\n this.name = \"IncompatibleSchemaError\";\n }\n}\n", "import { DatabaseSync } from \"node:sqlite\";\nimport { type Database, withTransaction } from \"./database.js\";\nimport {\n CURRENT_SCHEMA_SQL,\n CURRENT_SCHEMA_VERSION,\n detectSchema,\n IncompatibleSchemaError,\n stampCurrentSchemaVersion,\n stampSchemaVersion,\n} from \"./schema-version.js\";\n\ninterface IntegrityCheckRow {\n integrity_check: string;\n}\n\ninterface TableNameRow {\n name: string;\n}\n\ninterface ColumnInfoRow {\n name: string;\n}\n\nconst LEGACY_TABLES = [\"hook_registrations\", \"_migrations\"] as const;\nconst LEGACY_SESSION_COLUMNS = [\"resume_id\", \"transcript_path\"] as const;\n\nfunction hasTable(db: Database, tableName: string): boolean {\n const row = db\n .prepare(\"SELECT name FROM sqlite_master WHERE type='table' AND name = ?\")\n .get(tableName) as TableNameRow | undefined;\n return row?.name === tableName;\n}\n\nfunction getSessionColumns(db: Database): Set<string> {\n if (!hasTable(db, \"sessions\")) {\n return new Set();\n }\n\n const rows = db.prepare(\"PRAGMA table_info(sessions)\").all() as unknown as ColumnInfoRow[];\n return new Set(rows.map((row) => row.name));\n}\n\nfunction detectLegacySchema(db: Database): string[] {\n const reasons: string[] = [];\n\n for (const tableName of LEGACY_TABLES) {\n if (hasTable(db, tableName)) {\n reasons.push(`legacy table ${tableName}`);\n }\n }\n\n const sessionColumns = getSessionColumns(db);\n for (const columnName of LEGACY_SESSION_COLUMNS) {\n if (sessionColumns.has(columnName)) {\n reasons.push(`legacy sessions column ${columnName}`);\n }\n }\n\n return reasons;\n}\n\nfunction throwIfLegacySchema(db: Database, dbPath: string): void {\n const reasons = detectLegacySchema(db);\n if (reasons.length === 0) {\n return;\n }\n\n throw new IncompatibleSchemaError(dbPath, `legacy schema detected (${reasons.join(\", \")})`);\n}\n\nfunction initializeSchema(db: Database): void {\n withTransaction(db, () => {\n db.exec(CURRENT_SCHEMA_SQL);\n });\n}\n\nfunction upgradeSchemaV1ToV2(db: Database): void {\n withTransaction(db, () => {\n db.exec(\"ALTER TABLE supervisors ADD COLUMN evaluator_model TEXT\");\n db.exec(\"ALTER TABLE supervisors ADD COLUMN max_supervision_count INTEGER NOT NULL DEFAULT 0\");\n db.exec(\n \"ALTER TABLE supervisors ADD COLUMN completed_supervision_count INTEGER NOT NULL DEFAULT 0\"\n );\n db.exec(\"ALTER TABLE supervisors ADD COLUMN scheduled_at INTEGER\");\n db.exec(\"ALTER TABLE supervisors ADD COLUMN stop_reason TEXT\");\n db.exec(`\n CREATE TABLE supervisor_cycle_attempts (\n id TEXT PRIMARY KEY,\n cycle_id TEXT NOT NULL REFERENCES supervisor_cycles(id) ON DELETE CASCADE,\n attempt_index INTEGER NOT NULL,\n status TEXT NOT NULL,\n started_at INTEGER NOT NULL,\n completed_at INTEGER,\n error_reason TEXT,\n provider_model TEXT\n )\n `);\n db.exec(\n \"CREATE INDEX idx_supervisor_cycle_attempts_cycle ON supervisor_cycle_attempts(cycle_id, attempt_index)\"\n );\n stampSchemaVersion(db, 2);\n });\n}\n\nfunction assertCurrentSchema(db: Database, dbPath: string): void {\n const detection = detectSchema(db);\n if (detection.state !== \"current\") {\n throw new IncompatibleSchemaError(dbPath, detection.mismatch ?? \"unknown schema drift\");\n }\n}\n\nfunction initializeOrUpgradeSchema(db: Database, dbPath: string): void {\n throwIfLegacySchema(db, dbPath);\n\n const detection = detectSchema(db);\n\n switch (detection.state) {\n case \"empty\":\n initializeSchema(db);\n assertCurrentSchema(db, dbPath);\n return;\n\n case \"current\":\n if (detection.userVersion !== CURRENT_SCHEMA_VERSION) {\n stampCurrentSchemaVersion(db);\n }\n assertCurrentSchema(db, dbPath);\n return;\n\n case \"v1\":\n upgradeSchemaV1ToV2(db);\n assertCurrentSchema(db, dbPath);\n return;\n\n case \"v2\":\n if (detection.userVersion !== CURRENT_SCHEMA_VERSION) {\n stampCurrentSchemaVersion(db);\n }\n assertCurrentSchema(db, dbPath);\n return;\n\n case \"incompatible\":\n throw new IncompatibleSchemaError(dbPath, detection.mismatch ?? \"unknown schema drift\");\n }\n}\n\n/**\n * Opens a SQLite database with WAL mode and foreign key constraints enabled.\n * Runs an integrity check on startup.\n *\n * @param dbPath - Path to the SQLite database file\n * @returns Database instance\n */\nexport function openDatabase(dbPath: string): Database {\n const db = new DatabaseSync(dbPath);\n\n try {\n db.exec(\"PRAGMA journal_mode = WAL\");\n db.exec(\"PRAGMA foreign_keys = ON\");\n\n const integrityResult = db\n .prepare(\"PRAGMA integrity_check\")\n .all() as unknown as IntegrityCheckRow[];\n if (integrityResult[0]?.integrity_check !== \"ok\") {\n throw new Error(`Database integrity check failed: ${JSON.stringify(integrityResult)}`);\n }\n\n initializeOrUpgradeSchema(db, dbPath);\n\n return db;\n } catch (error) {\n try {\n if (db.isOpen) {\n db.close();\n }\n } catch {\n // Preserve the startup failure as the primary error.\n }\n\n throw error;\n }\n}\n\n/**\n * Retained as a compatibility entry point for tests that initialize :memory:\n * databases explicitly before wiring command handlers.\n */\nexport function runMigrations(db: Database): void {\n initializeOrUpgradeSchema(db, \":memory:\");\n}\n\n/**\n * Closes the database connection gracefully.\n *\n * @param db - Database instance\n */\nexport function closeDatabase(db: Database): void {\n if (db.isOpen) {\n db.close();\n }\n}\n", "import { type Database, withTransaction } from \"../database.js\";\n\nexport interface AuthLoginBlockRecord {\n ip: string;\n failedCount: number;\n firstFailedAt: number;\n lastFailedAt: number;\n blockedUntil: number | null;\n}\n\ninterface AuthLoginBlockRow {\n ip: string;\n failed_count: number;\n first_failed_at: number;\n last_failed_at: number;\n blocked_until: number | null;\n}\n\ninterface AuthLoginFailureStatsRow {\n failed_count: number;\n first_failed_at: number | null;\n last_failed_at: number | null;\n}\n\nconst toRecord = (row: AuthLoginBlockRow): AuthLoginBlockRecord => ({\n ip: row.ip,\n failedCount: row.failed_count,\n firstFailedAt: row.first_failed_at,\n lastFailedAt: row.last_failed_at,\n blockedUntil: row.blocked_until,\n});\n\nexport class AuthLoginBlockRepo {\n constructor(private readonly db: Database) {}\n\n get(ip: string): AuthLoginBlockRecord | null {\n const row = this.db\n .prepare(`\n SELECT ip, failed_count, first_failed_at, last_failed_at, blocked_until\n FROM auth_login_blocks\n WHERE ip = ?\n `)\n .get(ip) as AuthLoginBlockRow | undefined;\n\n return row ? toRecord(row) : null;\n }\n\n upsert(record: AuthLoginBlockRecord): AuthLoginBlockRecord {\n this.db\n .prepare(`\n INSERT INTO auth_login_blocks (\n ip, failed_count, first_failed_at, last_failed_at, blocked_until\n ) VALUES (?, ?, ?, ?, ?)\n ON CONFLICT(ip) DO UPDATE SET\n failed_count = excluded.failed_count,\n first_failed_at = excluded.first_failed_at,\n last_failed_at = excluded.last_failed_at,\n blocked_until = excluded.blocked_until\n `)\n .run(\n record.ip,\n record.failedCount,\n record.firstFailedAt,\n record.lastFailedAt,\n record.blockedUntil\n );\n\n return record;\n }\n\n recordFailure(\n ip: string,\n now: number,\n windowStart: number,\n failureLimit: number,\n blockDurationMs: number\n ): AuthLoginBlockRecord {\n return withTransaction(this.db, () => {\n this.db\n .prepare(`\n DELETE FROM auth_login_failures\n WHERE ip = ? AND failed_at < ?\n `)\n .run(ip, windowStart);\n\n this.db\n .prepare(`\n INSERT INTO auth_login_failures (ip, failed_at)\n VALUES (?, ?)\n `)\n .run(ip, now);\n\n const stats = this.db\n .prepare(`\n SELECT\n COUNT(*) AS failed_count,\n MIN(failed_at) AS first_failed_at,\n MAX(failed_at) AS last_failed_at\n FROM auth_login_failures\n WHERE ip = ?\n `)\n .get(ip) as unknown as AuthLoginFailureStatsRow;\n\n const record: AuthLoginBlockRecord = {\n ip,\n failedCount: stats.failed_count,\n firstFailedAt: stats.first_failed_at ?? now,\n lastFailedAt: stats.last_failed_at ?? now,\n blockedUntil: stats.failed_count >= failureLimit ? now + blockDurationMs : null,\n };\n\n return this.upsert(record);\n });\n }\n\n delete(ip: string): boolean {\n return withTransaction(this.db, () => {\n const blockResult = this.db.prepare(\"DELETE FROM auth_login_blocks WHERE ip = ?\").run(ip);\n const failureResult = this.db.prepare(\"DELETE FROM auth_login_failures WHERE ip = ?\").run(ip);\n return Number(blockResult.changes) + Number(failureResult.changes) > 0;\n });\n }\n\n listActiveBlocks(now: number): AuthLoginBlockRecord[] {\n const rows = this.db\n .prepare(`\n SELECT ip, failed_count, first_failed_at, last_failed_at, blocked_until\n FROM auth_login_blocks\n WHERE blocked_until IS NOT NULL AND blocked_until > ?\n ORDER BY blocked_until DESC, ip ASC\n `)\n .all(now) as unknown as AuthLoginBlockRow[];\n\n return rows.map(toRecord);\n }\n}\n", "import type { Database } from \"../database.js\";\n\nexport interface AuthSession {\n token: string;\n createdAt: number;\n lastSeenAt: number;\n}\n\nexport class AuthSessionRepo {\n constructor(private readonly db: Database) {}\n\n create(token: string, now: number): AuthSession {\n this.db\n .prepare(`\n INSERT INTO auth_sessions (token, created_at, last_seen_at)\n VALUES (?, ?, ?)\n `)\n .run(token, now, now);\n\n return {\n token,\n createdAt: now,\n lastSeenAt: now,\n };\n }\n\n touch(token: string, now: number): boolean {\n const result = this.db\n .prepare(`\n UPDATE auth_sessions\n SET last_seen_at = ?\n WHERE token = ?\n `)\n .run(now, token);\n\n return result.changes > 0;\n }\n\n delete(token: string): void {\n this.db.prepare(\"DELETE FROM auth_sessions WHERE token = ?\").run(token);\n }\n}\n", "import type { ProviderConfig } from \"@coder-studio/core\";\nimport type { Database } from \"../database.js\";\n\n/**\n * Provider configuration repository\n */\nexport class ProviderConfigRepo {\n constructor(private db: Database) {}\n\n /**\n * Gets a provider configuration by provider ID\n */\n get(providerId: string): ProviderConfig | undefined {\n const row = this.db\n .prepare(\"SELECT config FROM provider_configs WHERE provider_id = ?\")\n .get(providerId) as { config: string } | undefined;\n\n return row ? (JSON.parse(row.config) as ProviderConfig) : undefined;\n }\n\n /**\n * Sets a provider configuration\n * Creates the configuration if it doesn't exist, updates if it does\n */\n set(providerId: string, config: ProviderConfig): void {\n const stmt = this.db.prepare(`\n INSERT INTO provider_configs (provider_id, config)\n VALUES (?, ?)\n ON CONFLICT(provider_id) DO UPDATE SET config = excluded.config\n `);\n\n stmt.run(providerId, JSON.stringify(config));\n }\n\n /**\n * Deletes a provider configuration by provider ID\n */\n delete(providerId: string): void {\n const stmt = this.db.prepare(\"DELETE FROM provider_configs WHERE provider_id = ?\");\n stmt.run(providerId);\n }\n\n /**\n * Lists all provider IDs that have configurations\n */\n listProviderIds(): string[] {\n const rows = this.db.prepare(\"SELECT provider_id FROM provider_configs\").all() as {\n provider_id: string;\n }[];\n return rows.map((row) => row.provider_id);\n }\n\n /**\n * Gets all provider configurations as a key-value object\n */\n getAll(): Record<string, ProviderConfig> {\n const rows = this.db.prepare(\"SELECT provider_id, config FROM provider_configs\").all() as {\n provider_id: string;\n config: string;\n }[];\n\n const result: Record<string, ProviderConfig> = {};\n for (const row of rows) {\n result[row.provider_id] = JSON.parse(row.config) as ProviderConfig;\n }\n\n return result;\n }\n}\n", "import type { Database } from \"../database.js\";\n\n/**\n * Settings repository for key-value storage\n * Stores JSON values for various settings\n *\n * Known keys:\n * - `git.autofetchPeriodSec`: polling interval for active-workspace background fetch.\n * Defaults to 180 seconds; `0` disables periodic polling while preserving\n * open-time fetch and manual fetch.\n */\nexport class SettingsRepo {\n constructor(private db: Database) {}\n\n /**\n * Gets a setting value by key\n * @returns The parsed JSON value, or undefined if not found\n */\n get<T = unknown>(key: string): T | undefined {\n const row = this.db.prepare(\"SELECT value FROM user_settings WHERE key = ?\").get(key) as\n | { value: string }\n | undefined;\n\n return row ? (JSON.parse(row.value) as T) : undefined;\n }\n\n /**\n * Sets a setting value\n * Creates the setting if it doesn't exist, updates if it does\n */\n set<T>(key: string, value: T): void {\n const stmt = this.db.prepare(`\n INSERT INTO user_settings (key, value)\n VALUES (?, ?)\n ON CONFLICT(key) DO UPDATE SET value = excluded.value\n `);\n\n stmt.run(key, JSON.stringify(value));\n }\n\n /**\n * Deletes a setting by key\n */\n delete(key: string): void {\n const stmt = this.db.prepare(\"DELETE FROM user_settings WHERE key = ?\");\n stmt.run(key);\n }\n\n /**\n * Lists all settings keys\n */\n listKeys(): string[] {\n const rows = this.db.prepare(\"SELECT key FROM user_settings\").all() as { key: string }[];\n return rows.map((row) => row.key);\n }\n\n /**\n * Gets all settings as a key-value object\n */\n getAll(): Record<string, unknown> {\n const rows = this.db.prepare(\"SELECT key, value FROM user_settings\").all() as {\n key: string;\n value: string;\n }[];\n\n const result: Record<string, unknown> = {};\n for (const row of rows) {\n result[row.key] = JSON.parse(row.value);\n }\n\n return result;\n }\n}\n", "import type {\n SupervisorCycleAttempt,\n SupervisorCycleAttemptPatch,\n SupervisorCycleAttemptStatus,\n} from \"@coder-studio/core\";\nimport type { Database } from \"../database.js\";\n\ninterface SupervisorCycleAttemptRow {\n id: string;\n cycle_id: string;\n attempt_index: number;\n status: SupervisorCycleAttemptStatus;\n started_at: number;\n completed_at: number | null;\n error_reason: string | null;\n provider_model: string | null;\n}\n\nexport type NewSupervisorCycleAttempt = SupervisorCycleAttempt;\n\nexport type SupervisorCycleAttemptUpdatePatch = SupervisorCycleAttemptPatch;\n\nexport class SupervisorCycleAttemptRepo {\n constructor(private readonly db: Database) {}\n\n create(input: NewSupervisorCycleAttempt): SupervisorCycleAttempt {\n this.db\n .prepare(\n `INSERT INTO supervisor_cycle_attempts (id, cycle_id, attempt_index, status, started_at, completed_at, error_reason, provider_model)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)`\n )\n .run(\n input.id,\n input.cycleId,\n input.attemptIndex,\n input.status,\n input.startedAt,\n input.completedAt ?? null,\n input.errorReason ?? null,\n input.providerModel ?? null\n );\n\n return this.findById(input.id)!;\n }\n\n findById(id: string): SupervisorCycleAttempt | undefined {\n const row = this.db.prepare(\"SELECT * FROM supervisor_cycle_attempts WHERE id = ?\").get(id) as\n | SupervisorCycleAttemptRow\n | undefined;\n return row ? this.rowToAttempt(row) : undefined;\n }\n\n listForCycle(cycleId: string): SupervisorCycleAttempt[] {\n const rows = this.db\n .prepare(\n \"SELECT * FROM supervisor_cycle_attempts WHERE cycle_id = ? ORDER BY attempt_index ASC\"\n )\n .all(cycleId) as unknown as SupervisorCycleAttemptRow[];\n return rows.map((row) => this.rowToAttempt(row));\n }\n\n update(id: string, patch: SupervisorCycleAttemptUpdatePatch): SupervisorCycleAttempt {\n const assignments: string[] = [];\n const params: Record<string, number | string | null> = { id };\n\n if (patch.status !== undefined) {\n assignments.push(\"status = @status\");\n params.status = patch.status;\n }\n if (patch.completedAt !== undefined) {\n assignments.push(\"completed_at = @completedAt\");\n params.completedAt = patch.completedAt;\n }\n if (patch.errorReason !== undefined) {\n assignments.push(\"error_reason = @errorReason\");\n params.errorReason = patch.errorReason;\n }\n if (patch.providerModel !== undefined) {\n assignments.push(\"provider_model = @providerModel\");\n params.providerModel = patch.providerModel;\n }\n\n if (assignments.length === 0) {\n const existing = this.findById(id);\n if (!existing) {\n throw new Error(`Supervisor cycle attempt not found: ${id}`);\n }\n return existing;\n }\n\n const result = this.db\n .prepare(`UPDATE supervisor_cycle_attempts SET ${assignments.join(\", \")} WHERE id = @id`)\n .run(params);\n\n if (result.changes === 0) {\n throw new Error(`Supervisor cycle attempt not found: ${id}`);\n }\n\n return this.findById(id)!;\n }\n\n deleteForCycle(cycleId: string): void {\n this.db.prepare(\"DELETE FROM supervisor_cycle_attempts WHERE cycle_id = ?\").run(cycleId);\n }\n\n private rowToAttempt(row: SupervisorCycleAttemptRow): SupervisorCycleAttempt {\n return {\n id: row.id,\n cycleId: row.cycle_id,\n attemptIndex: row.attempt_index,\n status: row.status,\n startedAt: row.started_at,\n completedAt: row.completed_at ?? undefined,\n errorReason: row.error_reason ?? undefined,\n providerModel: row.provider_model ?? undefined,\n };\n }\n}\n", "import type { SupervisorCycle } from \"@coder-studio/core\";\nimport type { Database } from \"../database.js\";\n\ninterface SupervisorCycleRow {\n id: string;\n supervisor_id: string;\n session_id: string;\n status: SupervisorCycle[\"status\"];\n trigger: SupervisorCycle[\"trigger\"];\n evidence_source: SupervisorCycle[\"evidenceSource\"];\n objective: string;\n evaluator_provider_id: string;\n turn_id: string | null;\n progress: number | null;\n result: string | null;\n injected_guidance: string | null;\n error_reason: string | null;\n created_at: number;\n completed_at: number | null;\n}\n\nexport interface SupervisorCycleUpdatePatch {\n status?: SupervisorCycle[\"status\"];\n progress?: number | null;\n result?: string | null;\n injectedGuidance?: string | null;\n errorReason?: string | null;\n completedAt?: number | null;\n}\n\nexport class SupervisorCycleRepo {\n constructor(private readonly db: Database) {}\n\n create(input: SupervisorCycle): SupervisorCycle {\n this.db\n .prepare(\n `INSERT INTO supervisor_cycles (id, supervisor_id, session_id, status, trigger, evidence_source, objective, evaluator_provider_id, turn_id, progress, result, injected_guidance, error_reason, created_at, completed_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`\n )\n .run(\n input.id,\n input.supervisorId,\n input.sessionId,\n input.status,\n input.trigger,\n input.evidenceSource,\n input.objective,\n input.evaluatorProviderId,\n input.turnId ?? null,\n input.progress ?? null,\n input.result ?? null,\n input.injectedGuidance ?? null,\n input.errorReason ?? null,\n input.createdAt,\n input.completedAt ?? null\n );\n\n return this.findById(input.id)!;\n }\n\n findById(id: string): SupervisorCycle | undefined {\n const row = this.db.prepare(\"SELECT * FROM supervisor_cycles WHERE id = ?\").get(id) as\n | SupervisorCycleRow\n | undefined;\n return row ? this.rowToCycle(row) : undefined;\n }\n\n listRecentForSupervisor(supervisorId: string, limit: number): SupervisorCycle[] {\n const rows = this.db\n .prepare(\n \"SELECT * FROM supervisor_cycles WHERE supervisor_id = ? ORDER BY created_at DESC LIMIT ?\"\n )\n .all(supervisorId, limit) as unknown as SupervisorCycleRow[];\n return rows.map((row) => this.rowToCycle(row));\n }\n\n update(id: string, patch: SupervisorCycleUpdatePatch): SupervisorCycle {\n const assignments: string[] = [];\n const params: Record<string, number | string | null> = { id };\n\n if (patch.status !== undefined) {\n assignments.push(\"status = @status\");\n params.status = patch.status;\n }\n if (patch.progress !== undefined) {\n assignments.push(\"progress = @progress\");\n params.progress = patch.progress;\n }\n if (patch.result !== undefined) {\n assignments.push(\"result = @result\");\n params.result = patch.result;\n }\n if (patch.injectedGuidance !== undefined) {\n assignments.push(\"injected_guidance = @injectedGuidance\");\n params.injectedGuidance = patch.injectedGuidance;\n }\n if (patch.errorReason !== undefined) {\n assignments.push(\"error_reason = @errorReason\");\n params.errorReason = patch.errorReason;\n }\n if (patch.completedAt !== undefined) {\n assignments.push(\"completed_at = @completedAt\");\n params.completedAt = patch.completedAt;\n }\n\n if (assignments.length === 0) {\n const existing = this.findById(id);\n if (!existing) {\n throw new Error(`Supervisor cycle not found: ${id}`);\n }\n return existing;\n }\n\n const result = this.db\n .prepare(`UPDATE supervisor_cycles SET ${assignments.join(\", \")} WHERE id = @id`)\n .run(params);\n\n if (result.changes === 0) {\n throw new Error(`Supervisor cycle not found: ${id}`);\n }\n\n return this.findById(id)!;\n }\n\n pruneOldest(supervisorId: string, keep: number): void {\n this.db\n .prepare(\n `DELETE FROM supervisor_cycles\n WHERE id IN (\n SELECT id FROM supervisor_cycles\n WHERE supervisor_id = ?\n ORDER BY created_at DESC\n LIMIT -1 OFFSET ?\n )`\n )\n .run(supervisorId, keep);\n }\n\n private rowToCycle(row: SupervisorCycleRow): SupervisorCycle {\n return {\n id: row.id,\n supervisorId: row.supervisor_id,\n sessionId: row.session_id,\n status: row.status,\n trigger: row.trigger,\n evidenceSource: row.evidence_source,\n objective: row.objective,\n evaluatorProviderId: row.evaluator_provider_id,\n turnId: row.turn_id ?? undefined,\n progress: row.progress ?? undefined,\n result: row.result ?? undefined,\n injectedGuidance: row.injected_guidance ?? undefined,\n errorReason: row.error_reason ?? undefined,\n createdAt: row.created_at,\n completedAt: row.completed_at ?? undefined,\n };\n }\n}\n", "import type { Supervisor, SupervisorState, SupervisorStopReason } from \"@coder-studio/core\";\nimport type { Database } from \"../database.js\";\n\ninterface SupervisorRow {\n id: string;\n session_id: string;\n workspace_id: string;\n state: SupervisorState;\n objective: string;\n evaluator_provider_id: string;\n evaluator_model: string | null;\n max_supervision_count: number;\n completed_supervision_count: number;\n scheduled_at: number | null;\n stop_reason: SupervisorStopReason | null;\n last_cycle_at: number | null;\n last_evaluated_turn_id: string | null;\n error_reason: string | null;\n created_at: number;\n updated_at: number;\n}\n\nexport interface NewSupervisor {\n id: string;\n sessionId: string;\n workspaceId: string;\n state: SupervisorState;\n objective: string;\n evaluatorProviderId: string;\n evaluatorModel?: string;\n maxSupervisionCount: number;\n completedSupervisionCount: number;\n scheduledAt?: number;\n stopReason?: SupervisorStopReason;\n lastCycleAt?: number;\n lastEvaluatedTurnId?: string;\n errorReason?: string;\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface SupervisorUpdatePatch {\n state?: SupervisorState;\n objective?: string;\n evaluatorProviderId?: string;\n evaluatorModel?: string | null;\n maxSupervisionCount?: number;\n completedSupervisionCount?: number;\n scheduledAt?: number | null;\n stopReason?: SupervisorStopReason | null;\n lastCycleAt?: number | null;\n lastEvaluatedTurnId?: string | null;\n errorReason?: string | null;\n updatedAt?: number;\n}\n\nexport class SupervisorRepo {\n constructor(private readonly db: Database) {}\n\n create(input: NewSupervisor): Supervisor {\n this.db\n .prepare(\n `INSERT INTO supervisors (id, session_id, workspace_id, state, objective, evaluator_provider_id, evaluator_model, max_supervision_count, completed_supervision_count, scheduled_at, stop_reason, last_cycle_at, last_evaluated_turn_id, error_reason, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`\n )\n .run(\n input.id,\n input.sessionId,\n input.workspaceId,\n input.state,\n input.objective,\n input.evaluatorProviderId,\n input.evaluatorModel ?? null,\n input.maxSupervisionCount ?? 0,\n input.completedSupervisionCount ?? 0,\n input.scheduledAt ?? null,\n input.stopReason ?? null,\n input.lastCycleAt ?? null,\n input.lastEvaluatedTurnId ?? null,\n input.errorReason ?? null,\n input.createdAt,\n input.updatedAt\n );\n\n return this.findById(input.id)!;\n }\n\n findById(id: string): Supervisor | undefined {\n const row = this.db.prepare(\"SELECT * FROM supervisors WHERE id = ?\").get(id) as\n | SupervisorRow\n | undefined;\n return row ? this.rowToSupervisor(row) : undefined;\n }\n\n getBySessionId(sessionId: string): Supervisor | undefined {\n const row = this.db.prepare(\"SELECT * FROM supervisors WHERE session_id = ?\").get(sessionId) as\n | SupervisorRow\n | undefined;\n return row ? this.rowToSupervisor(row) : undefined;\n }\n\n listAll(): Supervisor[] {\n const rows = this.db\n .prepare(\"SELECT * FROM supervisors ORDER BY created_at ASC\")\n .all() as unknown as SupervisorRow[];\n return rows.map((row) => this.rowToSupervisor(row));\n }\n\n update(id: string, patch: SupervisorUpdatePatch): Supervisor {\n const assignments = [\"updated_at = @updatedAt\"];\n const params: Record<string, number | string | null> = {\n id,\n updatedAt: patch.updatedAt ?? Date.now(),\n };\n\n if (patch.state !== undefined) {\n assignments.push(\"state = @state\");\n params.state = patch.state;\n }\n if (patch.objective !== undefined) {\n assignments.push(\"objective = @objective\");\n params.objective = patch.objective;\n }\n if (patch.evaluatorProviderId !== undefined) {\n assignments.push(\"evaluator_provider_id = @evaluatorProviderId\");\n params.evaluatorProviderId = patch.evaluatorProviderId;\n }\n if (patch.evaluatorModel !== undefined) {\n assignments.push(\"evaluator_model = @evaluatorModel\");\n params.evaluatorModel = patch.evaluatorModel;\n }\n if (patch.maxSupervisionCount !== undefined) {\n assignments.push(\"max_supervision_count = @maxSupervisionCount\");\n params.maxSupervisionCount = patch.maxSupervisionCount;\n }\n if (patch.completedSupervisionCount !== undefined) {\n assignments.push(\"completed_supervision_count = @completedSupervisionCount\");\n params.completedSupervisionCount = patch.completedSupervisionCount;\n }\n if (patch.scheduledAt !== undefined) {\n assignments.push(\"scheduled_at = @scheduledAt\");\n params.scheduledAt = patch.scheduledAt;\n }\n if (patch.stopReason !== undefined) {\n assignments.push(\"stop_reason = @stopReason\");\n params.stopReason = patch.stopReason;\n }\n if (patch.lastCycleAt !== undefined) {\n assignments.push(\"last_cycle_at = @lastCycleAt\");\n params.lastCycleAt = patch.lastCycleAt;\n }\n if (patch.lastEvaluatedTurnId !== undefined) {\n assignments.push(\"last_evaluated_turn_id = @lastEvaluatedTurnId\");\n params.lastEvaluatedTurnId = patch.lastEvaluatedTurnId;\n }\n if (patch.errorReason !== undefined) {\n assignments.push(\"error_reason = @errorReason\");\n params.errorReason = patch.errorReason;\n }\n\n const result = this.db\n .prepare(`UPDATE supervisors SET ${assignments.join(\", \")} WHERE id = @id`)\n .run(params);\n\n if (result.changes === 0) {\n throw new Error(`Supervisor not found: ${id}`);\n }\n\n return this.findById(id)!;\n }\n\n delete(id: string): void {\n this.db.prepare(\"DELETE FROM supervisors WHERE id = ?\").run(id);\n }\n\n private rowToSupervisor(row: SupervisorRow): Supervisor {\n return {\n id: row.id,\n sessionId: row.session_id,\n workspaceId: row.workspace_id,\n targetId: row.id,\n state: row.state,\n objective: row.objective,\n evaluatorProviderId: row.evaluator_provider_id,\n evaluatorModel: row.evaluator_model ?? undefined,\n maxSupervisionCount: row.max_supervision_count,\n completedSupervisionCount: row.completed_supervision_count,\n scheduledAt: row.scheduled_at ?? undefined,\n stopReason: row.stop_reason ?? undefined,\n currentTargetMemory: undefined,\n recentTargetCycles: [],\n cycles: [],\n lastCycleAt: row.last_cycle_at ?? undefined,\n lastEvaluatedTurnId: row.last_evaluated_turn_id ?? undefined,\n errorReason: row.error_reason ?? undefined,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n };\n }\n}\n", "export interface RenderOptions {\n maxLines: number;\n maxChars: number;\n}\n\nexport function stripAnsi(text: string): string {\n return text\n .replace(/\\x1b\\[[0-9;<>?]*[a-zA-Z>=~]/g, \"\")\n .replace(/\\x1b\\][^\\x07\\x1b]*(?:\\x07|\\x1b\\\\)/g, \"\")\n .replace(/\\x1b/g, \"\")\n .trim();\n}\n\nexport function renderSnapshotToText(data: Buffer, options: RenderOptions): string {\n const text = stripAnsi(data.toString(\"utf8\"));\n const lines = text.split(\"\\n\");\n\n while (lines.length > 0 && lines.at(-1)?.trim() === \"\") {\n lines.pop();\n }\n\n return lines.slice(-options.maxLines).join(\"\\n\").slice(-options.maxChars);\n}\n", "import type {\n ProviderDefinition,\n SessionState,\n Supervisor,\n SupervisorTargetMemory,\n} from \"@coder-studio/core\";\nimport type { FastifyBaseLogger } from \"fastify\";\nimport type { SessionManager } from \"../session/manager.js\";\nimport type { TerminalManager } from \"../terminal/manager.js\";\nimport type { WorkspaceManager } from \"../workspace/manager.js\";\n\nexport { stripAnsi } from \"../terminal/snapshot-render.js\";\n\nconst NOOP_LOGGER: FastifyBaseLogger = {\n child: () => NOOP_LOGGER,\n debug: () => {},\n error: () => {},\n fatal: () => {},\n info: () => {},\n level: \"silent\",\n silent: () => {},\n trace: () => {},\n warn: () => {},\n};\n\nconst TERMINAL_MAX_LINES = 200;\nconst TERMINAL_MAX_CHARS = 12_000;\nexport interface SupervisorEvaluationContext {\n objective: string;\n sessionId: string;\n workspaceId: string;\n workspacePath: string;\n sessionProviderId: string;\n evaluatorProviderId: string;\n sessionState: SessionState;\n transcriptExcerpt?: string;\n terminalExcerpt?: string;\n lastTurnId?: string;\n evidenceSource: \"headless_snapshot\" | \"transcript\" | \"terminal_fallback\";\n /** Latest user input from the current turn (for supervisor context) */\n latestUserInput?: string;\n targetMemory: SupervisorTargetMemory;\n}\n\nexport class SupervisorContextBuilder {\n private readonly logger: FastifyBaseLogger;\n\n constructor(\n private readonly deps: {\n workspaceMgr: WorkspaceManager;\n sessionMgr: SessionManager;\n terminalMgr: TerminalManager;\n providerRegistry: ProviderDefinition[];\n logger?: FastifyBaseLogger;\n }\n ) {\n this.logger = deps.logger ?? NOOP_LOGGER;\n }\n\n async build(\n supervisor: Supervisor,\n targetMemory: SupervisorTargetMemory\n ): Promise<SupervisorEvaluationContext> {\n const session = this.deps.sessionMgr.get(supervisor.sessionId);\n const workspace = this.deps.workspaceMgr.get(supervisor.workspaceId);\n\n if (!session || !workspace) {\n throw {\n code: \"supervisor_not_found\",\n message: \"Supervisor session context is unavailable\",\n };\n }\n\n let renderedSnapshot = \"\";\n try {\n renderedSnapshot = await this.deps.sessionMgr.getRenderedSnapshot(session.id, {\n maxLines: TERMINAL_MAX_LINES,\n maxChars: TERMINAL_MAX_CHARS,\n });\n } catch (error) {\n this.logger.warn(\n { err: error, sessionId: session.id },\n \"Supervisor headless snapshot read failed\"\n );\n }\n\n const latestUserInput = this.deps.sessionMgr.getLatestSubmittedUserInput(session.id);\n\n this.logger.info(\n {\n metric: \"supervisor.evidence.built\",\n sessionId: session.id,\n workspaceId: workspace.id,\n evidenceSource: \"headless_snapshot\",\n terminalCharCount: renderedSnapshot.length,\n },\n \"supervisor evidence built\"\n );\n\n return {\n objective: supervisor.objective,\n sessionId: session.id,\n workspaceId: workspace.id,\n workspacePath: workspace.path,\n sessionProviderId: session.providerId,\n evaluatorProviderId: supervisor.evaluatorProviderId,\n sessionState: session.state,\n transcriptExcerpt: undefined,\n terminalExcerpt: renderedSnapshot,\n lastTurnId: undefined,\n evidenceSource: \"headless_snapshot\",\n latestUserInput,\n targetMemory,\n };\n }\n}\n", "/**\n * PTY Host Implementation\n *\n * Concrete implementation of PtyHost using node-pty\n */\n\nimport { chmodSync, existsSync, statSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { resolveSpawnArgv } from \"@coder-studio/utils\";\nimport type * as NodePty from \"node-pty\";\nimport type { PtyHost, PtyProcess, PtySpawnOptions } from \"./types.js\";\n\nconst require = createRequire(import.meta.url);\nconst NODE_PTY_PKG = \"node-pty/package.json\";\n\n/**\n * Options for kill escalation polling\n */\nexport interface KillEscalationOptions {\n /** Poll interval in milliseconds */\n pollIntervalMs?: number;\n /** Maximum time to wait before escalating to SIGKILL */\n timeoutMs?: number;\n}\n\n/** Default polling interval */\nconst DEFAULT_POLL_INTERVAL_MS = 50;\n\n/** Default timeout before SIGKILL escalation */\nconst DEFAULT_TIMEOUT_MS = 2000;\n\nexport function ensureNodePtySpawnHelperExecutable(\n deps: {\n platform?: NodeJS.Platform;\n arch?: NodeJS.Architecture;\n resolve?: (id: string) => string;\n existsSync?: (path: string) => boolean;\n statSync?: (path: string) => { mode: number };\n chmodSync?: (path: string, mode: number) => void;\n } = {}\n): void {\n const platform = deps.platform ?? process.platform;\n if (platform !== \"darwin\") {\n return;\n }\n const arch = deps.arch ?? process.arch;\n\n const resolve = deps.resolve ?? ((id: string) => require.resolve(id));\n const fileExists = deps.existsSync ?? existsSync;\n const stat = deps.statSync ?? statSync;\n const chmod = deps.chmodSync ?? chmodSync;\n\n let packageJsonPath: string;\n try {\n packageJsonPath = resolve(NODE_PTY_PKG);\n } catch {\n return;\n }\n\n const packageDir = path.dirname(packageJsonPath);\n const helperDir = arch === \"arm64\" ? \"darwin-arm64\" : arch === \"x64\" ? \"darwin-x64\" : null;\n if (!helperDir) {\n return;\n }\n\n const helperPath = path.join(packageDir, \"prebuilds\", helperDir, \"spawn-helper\");\n\n try {\n if (!fileExists(helperPath)) {\n return;\n }\n\n const currentMode = stat(helperPath).mode;\n const executableMode = currentMode | 0o111;\n if (executableMode === currentMode) {\n return;\n }\n\n chmod(helperPath, executableMode);\n } catch {\n // Best-effort repair only. Fall back to node-pty's normal startup path.\n }\n}\n\n/**\n * Send signal to process and all its children (process group)\n *\n * @param pid - Process ID (will use -pid for process group)\n * @param signal - Signal to send\n * @returns true if signal was sent successfully, false otherwise\n */\nexport function killProcessGroup(pid: number, signal: NodeJS.Signals): boolean {\n try {\n // Negative PID means kill the process group\n // This ensures all child processes are terminated as well\n process.kill(-pid, signal);\n return true;\n } catch {\n // Fallback to regular kill if process group doesn't exist\n try {\n process.kill(pid, signal);\n return true;\n } catch {\n return false;\n }\n }\n}\n\n/**\n * Check if a process group or process is still alive\n *\n * Mirrors the same group-first, pid-fallback semantics used when sending signals.\n *\n * @param pid - Process ID (will use -pid for process group first)\n * @returns true if the process group or process exists, false otherwise\n */\nfunction isProcessAlive(pid: number): boolean {\n try {\n process.kill(-pid, 0);\n return true;\n } catch {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n }\n}\n\n/**\n * Escalate from SIGTERM to SIGKILL with polling\n *\n * This function sends SIGTERM, then polls to check if the process\n * has exited. If it hasn't exited within the timeout window, SIGKILL\n * is sent.\n *\n * @param pid - Process ID\n * @param signal - Initial signal to send\n * @param options - Polling options\n * @returns Promise resolving to true if any signal was sent, false if initial signal failed\n */\nexport async function escalateKillWithPolling(\n pid: number,\n signal: NodeJS.Signals,\n options?: KillEscalationOptions\n): Promise<boolean> {\n const pollIntervalMs = options?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n // For non-SIGTERM signals, just send directly without polling\n if (signal !== \"SIGTERM\") {\n return killProcessGroup(pid, signal);\n }\n\n // Send SIGTERM\n const sent = killProcessGroup(pid, \"SIGTERM\");\n if (!sent) {\n return false;\n }\n\n // Check immediately if process already exited\n if (!isProcessAlive(pid)) {\n return true;\n }\n\n // Poll until timeout\n const startTime = Date.now();\n const deadline = startTime + timeoutMs;\n\n while (Date.now() < deadline) {\n // Wait for next poll interval\n await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));\n\n // Check if process group has exited\n if (!isProcessAlive(pid)) {\n return true;\n }\n }\n\n // Process survived timeout, escalate to SIGKILL\n killProcessGroup(pid, \"SIGKILL\");\n return true;\n}\n\n/**\n * Real PTY host using node-pty\n * Note: node-pty is loaded lazily to avoid native module loading errors during startup\n */\nexport class NodePtyHost implements PtyHost {\n spawn(argv: string[], options: PtySpawnOptions): PtyProcess {\n ensureNodePtySpawnHelperExecutable();\n\n // Lazy load node-pty to avoid native module loading errors\n let pty: typeof NodePty;\n try {\n pty = require(\"node-pty\");\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n throw new Error(`node-pty native module not available. ${message}`);\n }\n\n if (argv.length === 0) {\n throw new Error(\"PTY spawn requires a command\");\n }\n\n // On Windows, node-pty calls Win32 CreateProcess directly and cannot run\n // .cmd/.bat shims. resolveSpawnArgv walks PATH+PATHEXT and unwraps\n // npm-style cmd-shims into a `node <entry.js>` invocation. On non-win32\n // platforms this returns argv unchanged.\n const [command, ...args] = resolveSpawnArgv(argv, {\n pathEnv: options.env.Path ?? options.env.PATH,\n pathExt: options.env.PATHEXT,\n });\n if (command === undefined) {\n throw new Error(\"PTY spawn requires a command\");\n }\n\n const ptyProcess = pty.spawn(command, args, {\n cwd: options.cwd,\n env: options.env,\n cols: options.cols,\n rows: options.rows,\n });\n\n return {\n onData: (callback) => {\n ptyProcess.onData(callback);\n },\n onExit: (callback) => {\n ptyProcess.onExit(({ exitCode }: { exitCode: number }) => callback({ exitCode }));\n },\n write: (data) => {\n if (Buffer.isBuffer(data)) {\n ptyProcess.write(data.toString(\"utf-8\"));\n } else {\n ptyProcess.write(data);\n }\n },\n resize: (cols, rows) => {\n ptyProcess.resize(cols, rows);\n },\n kill: async (signal: NodeJS.Signals = \"SIGTERM\") => {\n const pid = ptyProcess.pid;\n\n if (pid > 0) {\n // First try node-pty's built-in kill\n try {\n ptyProcess.kill(signal);\n } catch {\n // Ignore errors from ptyProcess.kill\n }\n\n // Also send to process group to ensure child processes are terminated\n // This handles cases where shell spawns child processes\n try {\n await escalateKillWithPolling(pid, signal);\n } catch {\n // Silently ignore errors from escalation polling\n }\n }\n },\n };\n }\n}\n", "import {\n DEFAULT_SUPERVISOR_EVALUATION_TIMEOUT_SEC,\n DEFAULT_SUPERVISOR_RETRY_DELAY_SEC,\n DEFAULT_SUPERVISOR_RETRY_ENABLED,\n DEFAULT_SUPERVISOR_RETRY_MAX_COUNT,\n DEFAULT_SUPERVISOR_RETRY_ON_EVALUATOR_ERROR,\n DEFAULT_SUPERVISOR_RETRY_ON_TIMEOUT,\n resolveSupervisorEvaluationTimeoutSec,\n resolveSupervisorRetryDelaySec,\n resolveSupervisorRetryEnabled,\n resolveSupervisorRetryMaxCount,\n resolveSupervisorRetryOnEvaluatorError,\n resolveSupervisorRetryOnTimeout,\n} from \"@coder-studio/core\";\nimport type { SettingsRepo } from \"../storage/repositories/settings-repo.js\";\n\nexport const SUPERVISOR_EVALUATION_TIMEOUT_SETTING_KEY = \"supervisor.evaluationTimeoutSec\";\nexport const SUPERVISOR_RETRY_ENABLED_SETTING_KEY = \"supervisor.retryEnabled\";\nexport const SUPERVISOR_RETRY_MAX_COUNT_SETTING_KEY = \"supervisor.retryMaxCount\";\nexport const SUPERVISOR_RETRY_DELAY_SEC_SETTING_KEY = \"supervisor.retryDelaySec\";\nexport const SUPERVISOR_RETRY_ON_TIMEOUT_SETTING_KEY = \"supervisor.retryOnTimeout\";\nexport const SUPERVISOR_RETRY_ON_EVALUATOR_ERROR_SETTING_KEY = \"supervisor.retryOnEvaluatorError\";\n\nexport interface SupervisorRetrySettings {\n retryEnabled: boolean;\n retryMaxCount: number;\n retryDelaySec: number;\n retryOnTimeout: boolean;\n retryOnEvaluatorError: boolean;\n}\n\nexport function getSupervisorEvaluationTimeoutMs(settingsRepo?: Pick<SettingsRepo, \"get\">): number {\n let storedValue: number | undefined;\n try {\n storedValue = settingsRepo?.get<number>(SUPERVISOR_EVALUATION_TIMEOUT_SETTING_KEY);\n } catch {\n storedValue = DEFAULT_SUPERVISOR_EVALUATION_TIMEOUT_SEC;\n }\n\n const timeoutSec = resolveSupervisorEvaluationTimeoutSec(storedValue);\n return timeoutSec * 1000;\n}\n\nfunction getSettingOrDefault<T>(\n settingsRepo: Pick<SettingsRepo, \"get\"> | undefined,\n key: string,\n fallback: T\n): T {\n try {\n return (settingsRepo?.get<T>(key) ?? fallback) as T;\n } catch {\n return fallback;\n }\n}\n\nexport function getSupervisorRetrySettings(\n settingsRepo?: Pick<SettingsRepo, \"get\">\n): SupervisorRetrySettings {\n return {\n retryEnabled: resolveSupervisorRetryEnabled(\n getSettingOrDefault(\n settingsRepo,\n SUPERVISOR_RETRY_ENABLED_SETTING_KEY,\n DEFAULT_SUPERVISOR_RETRY_ENABLED\n )\n ),\n retryMaxCount: resolveSupervisorRetryMaxCount(\n getSettingOrDefault(\n settingsRepo,\n SUPERVISOR_RETRY_MAX_COUNT_SETTING_KEY,\n DEFAULT_SUPERVISOR_RETRY_MAX_COUNT\n )\n ),\n retryDelaySec: resolveSupervisorRetryDelaySec(\n getSettingOrDefault(\n settingsRepo,\n SUPERVISOR_RETRY_DELAY_SEC_SETTING_KEY,\n DEFAULT_SUPERVISOR_RETRY_DELAY_SEC\n )\n ),\n retryOnTimeout: resolveSupervisorRetryOnTimeout(\n getSettingOrDefault(\n settingsRepo,\n SUPERVISOR_RETRY_ON_TIMEOUT_SETTING_KEY,\n DEFAULT_SUPERVISOR_RETRY_ON_TIMEOUT\n )\n ),\n retryOnEvaluatorError: resolveSupervisorRetryOnEvaluatorError(\n getSettingOrDefault(\n settingsRepo,\n SUPERVISOR_RETRY_ON_EVALUATOR_ERROR_SETTING_KEY,\n DEFAULT_SUPERVISOR_RETRY_ON_EVALUATOR_ERROR\n )\n ),\n };\n}\n", "import { spawn } from \"node:child_process\";\nimport {\n DEFAULT_SUPERVISOR_CONFIG,\n type ProviderDefinition,\n type Supervisor,\n type SupervisorConfig,\n type SupervisorCycleStepUpdate,\n type SupervisorPlanStep,\n type SupervisorStopReason,\n} from \"@coder-studio/core\";\nimport type { FastifyBaseLogger } from \"fastify\";\nimport { mergeProviderLaunchConfig } from \"../provider-config.js\";\nimport type { ProviderConfigRepo } from \"../storage/repositories/provider-config-repo.js\";\nimport type { SettingsRepo } from \"../storage/repositories/settings-repo.js\";\nimport { escalateKillWithPolling } from \"../terminal/pty-host.js\";\nimport type { SupervisorEvaluationContext } from \"./context-builder.js\";\nimport { getSupervisorEvaluationTimeoutMs } from \"./settings.js\";\n\nconst NOOP_LOGGER: FastifyBaseLogger = {\n child: () => NOOP_LOGGER,\n debug: () => {},\n error: () => {},\n fatal: () => {},\n info: () => {},\n level: \"silent\",\n silent: () => {},\n trace: () => {},\n warn: () => {},\n};\n\nexport interface SupervisorEvaluationResult {\n status: \"continue\" | \"stop\";\n stopReason?: Extract<SupervisorStopReason, \"objective_complete\" | \"supervisor_uncertain\">;\n reason: string;\n guidance?: string;\n plan?: SupervisorPlanStep[];\n activeStepId?: string;\n progressSummary?: string;\n stepUpdates?: SupervisorCycleStepUpdate[];\n}\n\nexport type SupervisorResult = SupervisorEvaluationResult;\n\ninterface EvaluateOptions {\n signal?: AbortSignal;\n}\n\nexport class SupervisorEvaluator {\n private readonly config: SupervisorConfig;\n private readonly logger: FastifyBaseLogger;\n\n constructor(\n private readonly deps: {\n providerRegistry: ProviderDefinition[];\n providerConfigRepo: ProviderConfigRepo;\n settingsRepo?: Pick<SettingsRepo, \"get\">;\n timeoutMs?: number;\n config?: SupervisorConfig;\n logger?: FastifyBaseLogger;\n }\n ) {\n this.config = deps.config ?? DEFAULT_SUPERVISOR_CONFIG;\n this.logger = deps.logger ?? NOOP_LOGGER;\n }\n\n async evaluate(\n supervisor: Supervisor,\n context: SupervisorEvaluationContext,\n options: EvaluateOptions = {}\n ): Promise<SupervisorEvaluationResult> {\n const provider = this.deps.providerRegistry.find(\n (item) => item.id === supervisor.evaluatorProviderId\n );\n if (!provider?.buildSupervisorEvalCommand) {\n throw {\n code: \"supervisor_invalid_evaluator_provider\",\n message: \"Evaluator provider does not support headless eval\",\n };\n }\n\n const config = mergeProviderLaunchConfig(\n provider,\n this.deps.providerConfigRepo.get(provider.id)\n );\n\n const prompt = buildPrompt(context);\n const command = provider.buildSupervisorEvalCommand(config, {\n prompt,\n sessionId: supervisor.sessionId,\n workspacePath: context.workspacePath,\n model:\n typeof supervisor.evaluatorModel === \"string\" && supervisor.evaluatorModel.trim()\n ? supervisor.evaluatorModel.trim()\n : typeof config.model === \"string\"\n ? config.model\n : undefined,\n });\n\n if (!command) {\n throw {\n code: \"supervisor_invalid_evaluator_provider\",\n message: \"Evaluator provider returned null command\",\n };\n }\n\n const stdout = await runCommand(\n command,\n this.deps.timeoutMs ?? getSupervisorEvaluationTimeoutMs(this.deps.settingsRepo),\n options\n );\n\n let payloadText: string;\n try {\n payloadText = extractSupervisorPayload(stdout, provider.id);\n } catch (error) {\n const lines = stdout.trim().split(/\\r?\\n/).filter(Boolean);\n debugCodexUnparseableOutput(\n this.logger,\n supervisor,\n context,\n command,\n prompt,\n stdout,\n scanCodexStream(lines)\n );\n throw error;\n }\n\n return parseSupervisorEvaluationResult(payloadText, this.config.guidanceMaxChars);\n }\n}\n\nfunction buildPrompt(context: SupervisorEvaluationContext): string {\n const lines: string[] = [\n \"You are an autonomous supervisor for a target-scoped software task.\",\n \"Your job is to keep the agent moving toward the objective until the objective is complete.\",\n \"\",\n \"Return JSON only.\",\n \"\",\n \"Decision policy:\",\n '- Prefer \"continue\" whenever there is a reasonable next action.',\n \"- Do not ask the user to decide, clarify, or choose among implementation options.\",\n \"- When information is incomplete, choose a conservative next action based on the objective, target memory, latest user input, and terminal snapshot.\",\n \"- Stop only when the objective is complete, or when continuing would likely push the agent in an unsafe or clearly unsupported direction.\",\n \"\",\n \"Stage decision policy:\",\n \"- Use the target memory as the current supervision state.\",\n \"- Base your decision on the objective, current plan, activeStepId, progressSummary, lastGuidance, stalledCount, latest user input, and terminal snapshot.\",\n \"- Identify which plan step is currently active.\",\n \"- Decide whether the active step is done, still in progress, blocked, or obsolete.\",\n \"- If the active step is done, advance to the next useful step.\",\n \"- If the active step is still in progress, give guidance that moves it forward.\",\n \"- If the agent appears stuck or repeated the same action, give a different concrete next action.\",\n \"- If the plan is obsolete, update only the affected steps unless a full replacement is necessary.\",\n \"\",\n \"Allowed statuses:\",\n '- \"continue\": more work is needed; include \"reason\" and \"guidance\".',\n '- \"stop\": supervision should stop; include \"stopReason\" and \"reason\".',\n \"\",\n \"Allowed stop reasons:\",\n '- \"objective_complete\"',\n '- \"supervisor_uncertain\"',\n \"\",\n 'Use \"objective_complete\" only when the objective has been satisfied.',\n 'Use \"supervisor_uncertain\" only as a last resort when no useful next action can be inferred and additional guidance would likely be misleading.',\n \"\",\n 'Guidance requirements for \"continue\":',\n \"- Give one concrete next action or a short ordered set of concrete actions.\",\n \"- Focus on the highest-value step toward completing the objective.\",\n \"- Be specific enough for the supervised agent to act without asking the user.\",\n \"- Avoid generic reminders, encouragement, or restating the objective.\",\n \"- If verification is needed, tell the agent exactly what to verify next.\",\n \"- If implementation is needed, point to the likely area, behavior, or file/module based on available evidence.\",\n \"\",\n \"Planning policy:\",\n \"- If planGenerated is false, include a plan with 3 to 7 milestone-sized steps.\",\n \"- If planGenerated is true, update progress incrementally.\",\n \"- Do not rewrite the full plan unless the existing plan is clearly wrong or obsolete.\",\n \"- Use stepUpdates to mark completed or active steps when the terminal snapshot shows progress.\",\n \"- Keep activeStepId aligned with the next useful step.\",\n \"\",\n \"Output schema:\",\n \"For continue:\",\n \"{\",\n ' \"status\": \"continue\",',\n ' \"reason\": \"brief explanation of why more work is needed\",',\n ' \"guidance\": \"specific next action for the supervised agent\",',\n ' \"plan\": optional array of plan steps,',\n ' \"activeStepId\": optional step id,',\n ' \"progressSummary\": optional brief progress summary,',\n ' \"stepUpdates\": optional array of { \"id\": string, \"status\": \"pending\" | \"in_progress\" | \"done\" }',\n \"}\",\n \"\",\n \"For stop:\",\n \"{\",\n ' \"status\": \"stop\",',\n ' \"stopReason\": \"objective_complete\" | \"supervisor_uncertain\",',\n ' \"reason\": \"brief explanation\"',\n \"}\",\n \"\",\n \"Current objective:\",\n context.objective,\n \"\",\n \"Current target memory:\",\n JSON.stringify(context.targetMemory, null, 2),\n \"\",\n \"Latest user input:\",\n context.latestUserInput?.trim() || \"(none)\",\n \"\",\n \"Current terminal snapshot:\",\n context.terminalExcerpt || \"(no output yet)\",\n ];\n\n return lines.join(\"\\n\");\n}\n\nasync function runCommand(\n command: { argv: string[]; cwd?: string; env?: Record<string, string> },\n timeoutMs: number,\n options: EvaluateOptions = {}\n): Promise<string> {\n if (options.signal?.aborted) {\n throw createSupervisorEvalAbortedError();\n }\n\n return await new Promise((resolve, reject) => {\n const child = spawn(command.argv[0]!, command.argv.slice(1), {\n cwd: command.cwd,\n detached: process.platform !== \"win32\",\n env: { ...process.env, ...command.env },\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n windowsHide: true,\n });\n\n const stdout: Buffer[] = [];\n const stderr: Buffer[] = [];\n let settled = false;\n let terminationError: {\n code: \"supervisor_eval_timeout\" | \"supervisor_eval_aborted\";\n message: string;\n } | null = null;\n\n const cleanup = () => {\n clearTimeout(timer);\n options.signal?.removeEventListener(\"abort\", onAbort);\n };\n\n const settleReject = (error: unknown) => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n reject(error);\n };\n\n const settleResolve = (value: string) => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n resolve(value);\n };\n\n const terminate = (error: {\n code: \"supervisor_eval_timeout\" | \"supervisor_eval_aborted\";\n message: string;\n }) => {\n if (terminationError) {\n return;\n }\n terminationError = error;\n\n if (typeof child.pid !== \"number\" || child.pid <= 0) {\n settleReject(error);\n return;\n }\n\n void escalateKillWithPolling(child.pid, \"SIGTERM\").catch(() => {\n // Best-effort only. The exit/error event still decides final settlement.\n });\n };\n\n const onAbort = () => {\n terminate(createSupervisorEvalAbortedError());\n };\n\n const timer = setTimeout(() => {\n terminate({\n code: \"supervisor_eval_timeout\",\n message: `Supervisor evaluator timed out after ${timeoutMs}ms`,\n });\n }, timeoutMs);\n\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n child.stdout?.on(\"data\", (chunk) => stdout.push(Buffer.from(chunk)));\n child.stderr?.on(\"data\", (chunk) => stderr.push(Buffer.from(chunk)));\n child.on(\"error\", (error) => {\n if (terminationError) {\n settleReject(terminationError);\n return;\n }\n settleReject(error);\n });\n child.on(\"exit\", (code) => {\n if (terminationError) {\n settleReject(terminationError);\n return;\n }\n if (code !== 0) {\n settleReject({\n code: \"supervisor_eval_failed\",\n message:\n Buffer.concat(stderr).toString(\"utf8\").trim() || `Evaluator exited with code ${code}`,\n });\n return;\n }\n\n settleResolve(Buffer.concat(stdout).toString(\"utf8\"));\n });\n });\n}\n\nfunction createSupervisorEvalAbortedError(): {\n code: \"supervisor_eval_aborted\";\n message: string;\n} {\n return {\n code: \"supervisor_eval_aborted\",\n message: \"Supervisor evaluator aborted\",\n };\n}\n\n/**\n * Strip a ```json \u2026 ``` (or bare ```\u2026```) markdown fence if present.\n */\nfunction stripCodeFence(text: string): string {\n const fenced = text.match(/```(?:json|JSON)?\\s*\\n?([\\s\\S]*?)\\n?```/);\n return fenced ? fenced[1]!.trim() : text;\n}\n\ntype CodexCompletedCandidate = {\n sourceType: \"agent_message\" | \"assistant_message\" | \"command_execution\" | \"reasoning\";\n content: string;\n};\n\ninterface CodexStreamScan {\n /** Completed items that may contain the final evaluator payload. */\n completedItemCandidates: CodexCompletedCandidate[];\n /** True if any recognizable codex event was seen (thread/turn/item). */\n isCodexStream: boolean;\n /** True if the stream included a `turn.completed` event. */\n turnCompleted: boolean;\n /** Populated when the stream reported `turn.failed`. */\n turnFailure: string | null;\n /** Total output_tokens reported by `turn.completed`, if any. */\n outputTokens: number | null;\n}\n\n/**\n * Walk a codex `exec --json` JSONL stream and collect completed-item content\n * that may contain the model's final answer.\n */\nfunction scanCodexStream(lines: string[]): CodexStreamScan {\n const scan: CodexStreamScan = {\n completedItemCandidates: [],\n isCodexStream: false,\n turnCompleted: false,\n turnFailure: null,\n outputTokens: null,\n };\n\n for (const line of lines) {\n let event: unknown;\n try {\n event = JSON.parse(line);\n } catch {\n continue;\n }\n if (!event || typeof event !== \"object\") {\n continue;\n }\n const record = event as Record<string, unknown>;\n const type = record.type;\n\n if (\n type === \"thread.started\" ||\n type === \"turn.started\" ||\n type === \"turn.completed\" ||\n type === \"turn.failed\" ||\n type === \"item.started\" ||\n type === \"item.updated\" ||\n type === \"item.completed\"\n ) {\n scan.isCodexStream = true;\n }\n\n if (type === \"turn.completed\") {\n scan.turnCompleted = true;\n const usage = record.usage;\n if (\n usage &&\n typeof usage === \"object\" &&\n typeof (usage as Record<string, unknown>).output_tokens === \"number\"\n ) {\n scan.outputTokens = (usage as Record<string, unknown>).output_tokens as number;\n }\n }\n\n if (type === \"turn.failed\") {\n const error = record.error;\n if (\n error &&\n typeof error === \"object\" &&\n typeof (error as Record<string, unknown>).message === \"string\"\n ) {\n scan.turnFailure = (error as Record<string, unknown>).message as string;\n } else {\n scan.turnFailure = \"codex turn failed\";\n }\n }\n\n if (type === \"item.completed\") {\n const item = record.item;\n if (!item || typeof item !== \"object\") {\n continue;\n }\n const itemRecord = item as Record<string, unknown>;\n const itemType = itemRecord.type ?? itemRecord.item_type;\n if (\n (itemType === \"agent_message\" ||\n itemType === \"assistant_message\" ||\n itemType === \"reasoning\") &&\n typeof itemRecord.text === \"string\"\n ) {\n scan.completedItemCandidates.push({\n sourceType: itemType,\n content: itemRecord.text,\n });\n continue;\n }\n if (itemType === \"command_execution\" && typeof itemRecord.aggregated_output === \"string\") {\n scan.completedItemCandidates.push({\n sourceType: \"command_execution\",\n content: itemRecord.aggregated_output,\n });\n }\n }\n }\n\n return scan;\n}\n\nfunction buildStdoutPreview(output: string, maxChars = 4000): string {\n return output.length <= maxChars\n ? output\n : `${output.slice(0, maxChars)}\\n\u2026[truncated ${output.length - maxChars} chars]`;\n}\n\nfunction debugCodexUnparseableOutput(\n logger: FastifyBaseLogger,\n supervisor: Supervisor,\n context: SupervisorEvaluationContext,\n command: { argv: string[]; cwd?: string; env?: Record<string, string> },\n prompt: string,\n output: string,\n scan: CodexStreamScan\n): void {\n logger.warn(\n {\n supervisorId: supervisor.id,\n sessionId: supervisor.sessionId,\n evaluatorProviderId: supervisor.evaluatorProviderId,\n sessionProviderId: context.sessionProviderId,\n outputTokens: scan.outputTokens,\n turnCompleted: scan.turnCompleted,\n turnFailure: scan.turnFailure,\n completedItemCandidateCount: scan.completedItemCandidates.length,\n completedItemCandidates: scan.completedItemCandidates.map((candidate, index) => ({\n index,\n sourceType: candidate.sourceType,\n contentPreview: buildStdoutPreview(candidate.content, 500),\n })),\n commandArgv: command.argv,\n commandCwd: command.cwd,\n prompt,\n rawStdout: buildStdoutPreview(output),\n },\n \"Supervisor evaluator debug: codex output was not parseable\"\n );\n}\n\n/**\n * Extract the supervisor's payload text from the provider's output.\n * For Codex: scans JSONL stream for agent_message/reasoning items.\n * For Claude: parses the result envelope or plain text.\n */\nfunction extractSupervisorPayload(output: string, providerId: string): string {\n const trimmed = output.trim();\n if (!trimmed) {\n throw new Error(\"Supervisor returned empty output\");\n }\n\n const lines = trimmed.split(/\\r?\\n/).filter(Boolean);\n\n if (providerId === \"codex\") {\n if (!trimmed.startsWith(\"{\") && !trimmed.startsWith(\"[\")) {\n return stripCodeFence(trimmed);\n }\n\n const scan = scanCodexStream(lines);\n\n if (!scan.isCodexStream && (trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\"))) {\n return stripCodeFence(trimmed);\n }\n\n if (scan.turnFailure) {\n throw new Error(`Supervisor (codex) failed: ${scan.turnFailure}`);\n }\n\n // Prefer agent_message, then reasoning, then assistant_message.\n // Iterate in reverse so the last occurrence wins.\n for (let i = scan.completedItemCandidates.length - 1; i >= 0; i--) {\n const candidate = scan.completedItemCandidates[i]!;\n if (\n candidate.sourceType === \"agent_message\" ||\n candidate.sourceType === \"reasoning\" ||\n candidate.sourceType === \"assistant_message\"\n ) {\n const stripped = stripCodeFence(candidate.content).trim();\n if (stripped) {\n return stripped;\n }\n }\n }\n\n // Last resort: try to extract plain text from any line\n for (let i = lines.length - 1; i >= 0; i--) {\n const line = lines[i]!;\n // Skip obvious JSON/event lines\n if (line.startsWith(\"{\") || line.startsWith(\"[\")) {\n continue;\n }\n const text = line.trim();\n if (text && !scan.isCodexStream) {\n return stripCodeFence(text);\n }\n }\n\n // Codex stream but no agent_message found\n const tokenHint = scan.outputTokens !== null ? ` (${scan.outputTokens} output tokens)` : \"\";\n throw new Error(\"Supervisor (codex) completed without returning a message\" + tokenHint);\n }\n\n // Claude path: try result envelope, then plain text\n for (let i = lines.length - 1; i >= 0; i--) {\n const line = lines[i]!;\n try {\n const parsed = JSON.parse(line);\n if (typeof parsed === \"object\" && parsed !== null && \"result\" in parsed) {\n const result = (parsed as Record<string, unknown>).result;\n if (typeof result === \"string\") {\n return stripCodeFence(result).trim();\n }\n }\n } catch {\n // not JSON, continue\n }\n }\n\n // Plain text: use the last non-empty line\n for (let i = lines.length - 1; i >= 0; i--) {\n const text = lines[i]!.trim();\n if (text) {\n return stripCodeFence(text);\n }\n }\n\n throw new Error(\"Supervisor did not return a recognizable message\");\n}\n\nfunction parseSupervisorEvaluationResult(\n payloadText: string,\n guidanceMaxChars: number\n): SupervisorEvaluationResult {\n let parsed: unknown;\n try {\n parsed = JSON.parse(stripCodeFence(payloadText));\n } catch (error) {\n throw new Error(\n `Supervisor returned invalid JSON: ${error instanceof Error ? error.message : \"parse failed\"}`\n );\n }\n\n if (!parsed || typeof parsed !== \"object\") {\n throw new Error(\"Supervisor returned invalid evaluation payload\");\n }\n\n const record = parsed as Record<string, unknown>;\n const status = record.status;\n const reason = record.reason;\n\n if (\n (status !== \"continue\" && status !== \"stop\") ||\n typeof reason !== \"string\" ||\n !reason.trim()\n ) {\n throw new Error(\"Supervisor returned invalid evaluation payload\");\n }\n\n if (status === \"stop\") {\n const stopReason = record.stopReason;\n if (stopReason !== \"objective_complete\" && stopReason !== \"supervisor_uncertain\") {\n throw new Error(\"Supervisor stop result is missing a valid stopReason\");\n }\n\n return {\n status,\n stopReason,\n reason: reason.trim(),\n };\n }\n\n const guidance =\n typeof record.guidance === \"string\" && record.guidance.trim()\n ? record.guidance.trim().slice(0, guidanceMaxChars)\n : undefined;\n\n const plan: SupervisorPlanStep[] | undefined = Array.isArray(record.plan)\n ? record.plan.flatMap<SupervisorPlanStep>((value) => {\n if (!value || typeof value !== \"object\") {\n return [];\n }\n const step = value as Record<string, unknown>;\n if (\n typeof step.id !== \"string\" ||\n typeof step.title !== \"string\" ||\n (step.status !== \"pending\" && step.status !== \"in_progress\" && step.status !== \"done\")\n ) {\n return [];\n }\n return [{ id: step.id, title: step.title, status: step.status }];\n })\n : undefined;\n\n const stepUpdates: SupervisorCycleStepUpdate[] | undefined = Array.isArray(record.stepUpdates)\n ? record.stepUpdates.flatMap<SupervisorCycleStepUpdate>((value) => {\n if (!value || typeof value !== \"object\") {\n return [];\n }\n const update = value as Record<string, unknown>;\n if (\n typeof update.id !== \"string\" ||\n (update.status !== \"pending\" &&\n update.status !== \"in_progress\" &&\n update.status !== \"done\")\n ) {\n return [];\n }\n return [{ id: update.id, status: update.status }];\n })\n : undefined;\n\n return {\n status,\n reason: reason.trim(),\n guidance,\n plan,\n activeStepId:\n typeof record.activeStepId === \"string\" && record.activeStepId.trim()\n ? record.activeStepId\n : undefined,\n progressSummary:\n typeof record.progressSummary === \"string\" && record.progressSummary.trim()\n ? record.progressSummary.trim()\n : undefined,\n stepUpdates,\n };\n}\n", "import { createHash } from \"node:crypto\";\nimport {\n DEFAULT_SUPERVISOR_CONFIG,\n type SessionState,\n type Supervisor,\n type SupervisorConfig,\n type SupervisorCycle,\n} from \"@coder-studio/core\";\nimport type { SessionManager } from \"../session/manager.js\";\nimport type { TerminalManager } from \"../terminal/manager.js\";\n\nexport const INJECTABLE_SESSION_STATES: ReadonlySet<SessionState> = new Set<SessionState>([\n \"idle\",\n \"running\",\n]);\n\n/**\n * Explain why a given session state cannot accept injection. Returned\n * messages are user-facing: they should describe the lifecycle phase in\n * terms the operator can act on (e.g. wait for the CLI to finish booting,\n * resume the session, etc.).\n */\nexport function describeNonInjectableState(state: SessionState): string {\n switch (state) {\n case \"starting\":\n return \"session is still starting up (provider CLI has not completed its first turn yet)\";\n case \"ended\":\n return \"session has already ended\";\n case \"draft\":\n return \"session is still a draft and has no terminal attached\";\n default:\n return `session state \"${state}\" does not accept injection`;\n }\n}\n\nexport class SupervisorInjector {\n private readonly config: SupervisorConfig;\n\n constructor(\n readonly deps: {\n sessionMgr: SessionManager;\n terminalMgr: TerminalManager;\n config?: SupervisorConfig;\n }\n ) {\n this.config = deps.config ?? DEFAULT_SUPERVISOR_CONFIG;\n }\n\n async inject(\n supervisor: Supervisor,\n input: { message: string },\n recentCycles: SupervisorCycle[],\n options: { signal?: AbortSignal } = {}\n ): Promise<{ injected: boolean; text: string }> {\n if (options.signal?.aborted) {\n throw {\n code: \"supervisor_eval_aborted\",\n message: \"Supervisor evaluator aborted\",\n };\n }\n\n const session = this.deps.sessionMgr.get(supervisor.sessionId);\n if (!session) {\n throw {\n code: \"inject_target_unavailable\",\n message: `Session ${supervisor.sessionId} is not available for injection`,\n };\n }\n if (!INJECTABLE_SESSION_STATES.has(session.state)) {\n throw {\n code: \"inject_target_unavailable\",\n message: `Cannot inject into session ${supervisor.sessionId}: ${describeNonInjectableState(session.state)}`,\n };\n }\n\n const message = input.message.slice(0, this.config.guidanceMaxChars);\n const text = `[Supervisor] ${message}`;\n\n const hash = createHash(\"sha1\").update(text).digest(\"hex\");\n const duplicate = recentCycles\n .slice(0, this.config.guidanceDedupeWindow)\n .map((cycle) => cycle.injectedGuidance)\n .filter((value): value is string => Boolean(value))\n .some((value) => createHash(\"sha1\").update(value).digest(\"hex\") === hash);\n\n if (duplicate) {\n return { injected: false, text };\n }\n\n if (options.signal?.aborted) {\n throw {\n code: \"supervisor_eval_aborted\",\n message: \"Supervisor evaluator aborted\",\n };\n }\n\n // Wrap with bracketed-paste so the TUI doesn't interpret any embedded\n // characters as slash-commands / keybindings. Terminate with \\r so the\n // receiving CLI actually submits the message.\n const BRACKETED_PASTE_START = \"\\x1b[200~\";\n const BRACKETED_PASTE_END = \"\\x1b[201~\";\n const SUBMIT = \"\\r\";\n const payload = `${BRACKETED_PASTE_START}${text}${BRACKETED_PASTE_END}${SUBMIT}`;\n\n this.deps.sessionMgr.sendInput(session.id, Buffer.from(payload, \"utf8\"), \"internal_submit\");\n return { injected: true, text };\n }\n}\n", "import type { DomainEvent } from \"@coder-studio/core\";\nimport type { EventBus } from \"../bus/event-bus.js\";\n\ntype SessionLifecycleEvent = Extract<DomainEvent, { type: \"session.lifecycle\" }>;\n\nexport class SupervisorScheduler {\n private unsubscribe: (() => void) | null = null;\n private scheduledTimer: ReturnType<typeof setTimeout> | null = null;\n private readonly scheduledRetryDelayMs = 1_000;\n private readonly retryAtBySupervisorId = new Map<string, number>();\n\n constructor(\n private readonly deps: {\n eventBus: EventBus;\n onTurnCompleted: (sessionId: string) => void;\n listScheduledSupervisors?: () => Array<{ supervisorId: string; scheduledAt: number }>;\n onScheduledDue?: (supervisorId: string) => void;\n }\n ) {}\n\n start(): void {\n this.unsubscribe?.();\n this.unsubscribe = this.deps.eventBus.on(\n \"session.lifecycle\",\n (event: SessionLifecycleEvent) => {\n if (event.event !== \"turn_completed\") {\n return;\n }\n this.deps.onTurnCompleted(event.sessionId);\n }\n );\n }\n\n refresh(): void {\n this.clearScheduledTimer();\n\n const scheduled = this.deps.listScheduledSupervisors?.() ?? [];\n this.pruneRetryState(scheduled);\n if (scheduled.length === 0) {\n return;\n }\n\n const now = Date.now();\n const nextAt = scheduled.reduce((earliest, item) => {\n const candidate = this.getNextAttemptAt(item, now);\n return candidate < earliest ? candidate : earliest;\n }, Number.POSITIVE_INFINITY);\n if (!Number.isFinite(nextAt)) {\n return;\n }\n\n const delayMs = Math.max(nextAt - now, 0);\n this.scheduledTimer = setTimeout(() => {\n this.scheduledTimer = null;\n const current = this.deps.listScheduledSupervisors?.() ?? [];\n this.pruneRetryState(current);\n\n const dueAt = Date.now();\n const due = current.filter(\n (item) =>\n item.scheduledAt <= dueAt &&\n (this.retryAtBySupervisorId.get(item.supervisorId) ?? Number.NEGATIVE_INFINITY) <= dueAt\n );\n for (const item of due) {\n this.retryAtBySupervisorId.set(item.supervisorId, dueAt + this.scheduledRetryDelayMs);\n this.deps.onScheduledDue?.(item.supervisorId);\n }\n this.refresh();\n }, delayMs);\n this.scheduledTimer.unref?.();\n }\n\n stop(): void {\n this.unsubscribe?.();\n this.unsubscribe = null;\n this.clearScheduledTimer();\n this.retryAtBySupervisorId.clear();\n }\n\n private clearScheduledTimer(): void {\n if (this.scheduledTimer) {\n clearTimeout(this.scheduledTimer);\n this.scheduledTimer = null;\n }\n }\n\n private getNextAttemptAt(\n item: { supervisorId: string; scheduledAt: number },\n now: number\n ): number {\n if (item.scheduledAt > now) {\n return item.scheduledAt;\n }\n\n const retryAt = this.retryAtBySupervisorId.get(item.supervisorId);\n return retryAt && retryAt > now ? retryAt : item.scheduledAt;\n }\n\n private pruneRetryState(scheduled: Array<{ supervisorId: string; scheduledAt: number }>): void {\n const scheduledIds = new Set(scheduled.map((item) => item.supervisorId));\n for (const supervisorId of this.retryAtBySupervisorId.keys()) {\n if (!scheduledIds.has(supervisorId)) {\n this.retryAtBySupervisorId.delete(supervisorId);\n }\n }\n }\n}\n", "import {\n type CycleStatus,\n DEFAULT_SUPERVISOR_CONFIG,\n type DomainEvent,\n type ProviderDefinition,\n type Supervisor,\n type SupervisorConfig,\n type SupervisorCycle,\n type SupervisorCycleTargetRecord,\n type SupervisorState,\n type SupervisorTargetMemory,\n Topics,\n} from \"@coder-studio/core\";\nimport type { FastifyBaseLogger } from \"fastify\";\nimport type { EventBus } from \"../bus/event-bus.js\";\nimport type { SessionManager } from \"../session/manager.js\";\nimport type { ProviderConfigRepo } from \"../storage/repositories/provider-config-repo.js\";\nimport type { SettingsRepo } from \"../storage/repositories/settings-repo.js\";\nimport type { SupervisorCycleAttemptRepo } from \"../storage/repositories/supervisor-cycle-attempt-repo.js\";\nimport type { SupervisorCycleRepo } from \"../storage/repositories/supervisor-cycle-repo.js\";\nimport type { SupervisorRepo } from \"../storage/repositories/supervisor-repo.js\";\nimport type { TerminalManager } from \"../terminal/manager.js\";\nimport type { WorkspaceManager } from \"../workspace/manager.js\";\nimport type { Broadcaster } from \"../ws/hub.js\";\nimport type { SupervisorEvaluationContext } from \"./context-builder.js\";\nimport { SupervisorContextBuilder } from \"./context-builder.js\";\nimport { SupervisorEvaluator } from \"./evaluator.js\";\nimport {\n describeNonInjectableState,\n INJECTABLE_SESSION_STATES,\n SupervisorInjector,\n} from \"./injector.js\";\nimport { SupervisorScheduler } from \"./scheduler.js\";\nimport { getSupervisorRetrySettings } from \"./settings.js\";\nimport type { SupervisorTargetMeta } from \"./target-store.js\";\n\nconst NOOP_LOGGER: FastifyBaseLogger = {\n child: () => NOOP_LOGGER,\n debug: () => {},\n error: () => {},\n fatal: () => {},\n info: () => {},\n level: \"silent\",\n silent: () => {},\n trace: () => {},\n warn: () => {},\n};\n\ntype SessionLifecycleEvent = Extract<DomainEvent, { type: \"session.lifecycle\" }>;\n\n/**\n * Internal handoff between the synchronous `beginCycle` and the async\n * `finishCycle` phases of a supervisor evaluation.\n */\ninterface StartedCycle {\n cycle: SupervisorCycle;\n supervisor: Supervisor;\n context: SupervisorEvaluationContext;\n targetId: string;\n retry: SupervisorRetrySnapshot;\n trigger: \"turn_completed\" | \"manual\" | \"scheduled\";\n}\n\ninterface DeferredCompletion {\n promise: Promise<void>;\n resolve: () => void;\n}\n\ninterface SupervisorRetrySnapshot {\n retryEnabled: boolean;\n retryMaxCount: number;\n retryDelayMs: number;\n retryOnTimeout: boolean;\n retryOnEvaluatorError: boolean;\n}\n\nexport interface SupervisorManagerDeps {\n eventBus: EventBus;\n broadcaster: Broadcaster;\n terminalMgr: TerminalManager;\n workspaceMgr: WorkspaceManager;\n sessionMgr: SessionManager;\n providerRegistry: ProviderDefinition[];\n providerConfigRepo: ProviderConfigRepo;\n settingsRepo: Pick<SettingsRepo, \"get\">;\n supervisorRepo: SupervisorRepo;\n cycleRepo: SupervisorCycleRepo;\n cycleAttemptRepo: Pick<\n SupervisorCycleAttemptRepo,\n \"create\" | \"update\" | \"listForCycle\" | \"deleteForCycle\"\n >;\n targetStore: {\n createTargetFiles: typeof import(\"./target-store.js\").createTargetFiles;\n resetTargetFiles: typeof import(\"./target-store.js\").resetTargetFiles;\n readTargetMeta: typeof import(\"./target-store.js\").readTargetMeta;\n loadTargetMemory: typeof import(\"./target-store.js\").loadTargetMemory;\n saveTargetMeta: typeof import(\"./target-store.js\").saveTargetMeta;\n saveTargetMemory: typeof import(\"./target-store.js\").saveTargetMemory;\n appendTargetCycleRecord: typeof import(\"./target-store.js\").appendTargetCycleRecord;\n markTargetSuperseded: typeof import(\"./target-store.js\").markTargetSuperseded;\n readTargetCycleRecords: typeof import(\"./target-store.js\").readTargetCycleRecords;\n };\n logger?: FastifyBaseLogger;\n config?: SupervisorConfig;\n}\n\nexport interface CreateSupervisorRequest {\n sessionId: string;\n workspaceId: string;\n objective: string;\n evaluatorProviderId: string;\n evaluatorModel?: string;\n maxSupervisionCount?: number;\n scheduledAt?: number;\n}\n\nexport interface UpdateSupervisorRequest {\n objective?: string;\n evaluatorProviderId?: string;\n evaluatorModel?: string | null;\n maxSupervisionCount?: number;\n scheduledAt?: number | null;\n}\n\nfunction createDeferredCompletion(): DeferredCompletion {\n let resolve = () => {};\n const promise = new Promise<void>((innerResolve) => {\n resolve = innerResolve;\n });\n return { promise, resolve };\n}\n\nfunction generateSupervisorId(): string {\n return `sup_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n}\n\nfunction generateCycleId(): string {\n return `cycle_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n}\n\nfunction generateAttemptId(): string {\n return `attempt_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n}\n\nfunction messageOf(error: unknown, fallback: string): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (error && typeof error === \"object\" && \"message\" in error) {\n const value = (error as { message: unknown }).message;\n if (typeof value === \"string\") {\n return value;\n }\n }\n return fallback;\n}\n\nfunction logFailure(\n logger: FastifyBaseLogger,\n error: unknown,\n context: Record<string, unknown>,\n message: string\n): void {\n logger.error({ ...context, err: error }, message);\n}\n\nexport class SupervisorManager {\n private readonly supervisors = new Map<string, Supervisor>();\n private readonly supervisorsBySession = new Map<string, string>();\n private readonly inFlight = new Set<string>();\n private readonly pendingDeletes = new Set<string>();\n private readonly pendingPauses = new Set<string>();\n private readonly pendingObjectiveUpdates = new Set<string>();\n private readonly evaluationAbortControllers = new Map<string, AbortController>();\n private readonly inFlightCompletions = new Map<string, DeferredCompletion>();\n private readonly scheduler: SupervisorScheduler;\n private readonly contextBuilder: SupervisorContextBuilder;\n private readonly evaluator: SupervisorEvaluator;\n private readonly injector: SupervisorInjector;\n private readonly logger: FastifyBaseLogger;\n private readonly config: SupervisorConfig;\n private lifecycleUnsubscribe: (() => void) | null = null;\n\n constructor(private readonly deps: SupervisorManagerDeps) {\n this.logger = deps.logger ?? NOOP_LOGGER;\n this.config = deps.config ?? DEFAULT_SUPERVISOR_CONFIG;\n this.contextBuilder = new SupervisorContextBuilder({\n workspaceMgr: deps.workspaceMgr,\n sessionMgr: deps.sessionMgr,\n terminalMgr: deps.terminalMgr,\n providerRegistry: deps.providerRegistry,\n logger: this.logger,\n });\n this.evaluator = new SupervisorEvaluator({\n providerRegistry: deps.providerRegistry,\n providerConfigRepo: deps.providerConfigRepo,\n settingsRepo: deps.settingsRepo,\n config: this.config,\n logger: this.logger,\n });\n this.injector = new SupervisorInjector({\n sessionMgr: deps.sessionMgr,\n terminalMgr: deps.terminalMgr,\n config: this.config,\n });\n this.scheduler = new SupervisorScheduler({\n eventBus: deps.eventBus,\n onTurnCompleted: (sessionId) => {\n const supervisorId = this.supervisorsBySession.get(sessionId);\n if (supervisorId) {\n void this.runEvaluation(supervisorId, \"turn_completed\").catch((error) => {\n this.logger.warn({ err: error, supervisorId }, \"Supervisor auto-evaluation failed\");\n });\n }\n },\n listScheduledSupervisors: () => this.listScheduledSupervisors(),\n onScheduledDue: (supervisorId) => {\n void this.runEvaluation(supervisorId, \"scheduled\").catch((error) => {\n this.logger.warn(\n { err: error, supervisorId },\n \"Supervisor scheduled auto-evaluation failed\"\n );\n });\n },\n });\n }\n\n async hydrate(): Promise<void> {\n this.supervisors.clear();\n this.supervisorsBySession.clear();\n\n for (const supervisor of this.deps.supervisorRepo.listAll()) {\n const hydratedWithTarget = await this.hydrateTargetState(supervisor);\n const normalizedState =\n hydratedWithTarget.state === \"evaluating\" || hydratedWithTarget.state === \"injecting\"\n ? \"idle\"\n : hydratedWithTarget.state;\n\n const recovered =\n normalizedState === hydratedWithTarget.state\n ? hydratedWithTarget\n : this.withCurrentTargetState(\n this.deps.supervisorRepo.update(hydratedWithTarget.id, {\n state: normalizedState,\n errorReason: null,\n updatedAt: Date.now(),\n })\n );\n\n // Any cycle still in a transient state belongs to a previous server\n // process (or a long-fixed buggy code path). Mark it as failed so it\n // doesn't sit forever in the UI as \"queued\"/\"evaluating\".\n const stale = this.deps.cycleRepo\n .listRecentForSupervisor(hydratedWithTarget.id, this.config.maxCyclesPerSession)\n .filter((cycle) => cycle.status === \"queued\" || cycle.status === \"evaluating\");\n for (const cycle of stale) {\n try {\n this.deps.cycleRepo.update(cycle.id, {\n status: \"failed\",\n errorReason: \"Orphaned before server restart\",\n completedAt: Date.now(),\n });\n } catch (error) {\n this.logger.warn(\n { err: error, cycleId: cycle.id, supervisorId: hydratedWithTarget.id },\n \"Failed to clean up stale cycle on hydrate\"\n );\n }\n }\n\n this.storeSnapshot(this.attachCycles(recovered));\n }\n\n this.lifecycleUnsubscribe?.();\n this.lifecycleUnsubscribe = this.deps.eventBus.on(\n \"session.lifecycle\",\n (event: SessionLifecycleEvent) => {\n if (event.event !== \"removed\") {\n return;\n }\n const supervisorId = this.supervisorsBySession.get(event.sessionId);\n if (supervisorId) {\n void this.delete(supervisorId).catch((error) => {\n this.logger.warn({ err: error, supervisorId }, \"Auto-delete on session removal failed\");\n });\n }\n }\n );\n\n this.scheduler.start();\n this.scheduler.refresh();\n }\n\n stop(): void {\n this.scheduler.stop();\n this.lifecycleUnsubscribe?.();\n this.lifecycleUnsubscribe = null;\n }\n\n get(id: string): Supervisor | undefined {\n return this.supervisors.get(id);\n }\n\n getBySession(sessionId: string): Supervisor | undefined {\n const supervisorId = this.supervisorsBySession.get(sessionId);\n return supervisorId ? this.supervisors.get(supervisorId) : undefined;\n }\n\n async deleteForWorkspace(workspaceId: string): Promise<void> {\n const supervisorIds = Array.from(this.supervisors.values())\n .filter((supervisor) => supervisor.workspaceId === workspaceId)\n .map((supervisor) => supervisor.id);\n const pending: Promise<void>[] = [];\n\n for (const supervisorId of supervisorIds) {\n const supervisor = this.supervisors.get(supervisorId);\n if (!supervisor) {\n continue;\n }\n\n this.pendingDeletes.add(supervisorId);\n if (!this.inFlight.has(supervisorId)) {\n this.deleteNow(supervisor);\n continue;\n }\n\n this.evaluationAbortControllers.get(supervisorId)?.abort();\n const completion = this.inFlightCompletions.get(supervisorId);\n if (completion) {\n pending.push(completion.promise);\n }\n }\n\n await Promise.all(pending);\n }\n\n async create(req: CreateSupervisorRequest): Promise<Supervisor> {\n const session = this.deps.sessionMgr.get(req.sessionId);\n if (!session) {\n throw {\n code: \"supervisor_not_found\",\n message: `Session ${req.sessionId} not found`,\n };\n }\n if (session.state === \"draft\") {\n throw {\n code: \"supervisor_unsupported_provider\",\n message: \"Draft sessions cannot enable supervisor\",\n };\n }\n const sessionProvider = this.requireSessionProvider(session.providerId);\n if (!this.supportsSupervisor(sessionProvider)) {\n throw {\n code: \"supervisor_unsupported_provider\",\n message: `Provider ${session.providerId} does not support supervisor-driven sessions`,\n };\n }\n if (this.supervisorsBySession.has(req.sessionId)) {\n throw {\n code: \"supervisor_already_exists\",\n message: `Supervisor already exists for ${req.sessionId}`,\n };\n }\n\n this.assertEvaluatorProvider(req.evaluatorProviderId);\n\n const now = Date.now();\n const objective = req.objective.trim();\n const workspace = this.requireWorkspace(req.workspaceId);\n const supervisorId = generateSupervisorId();\n const supervisor = this.attachCycles(\n this.deps.supervisorRepo.create({\n id: supervisorId,\n sessionId: req.sessionId,\n workspaceId: req.workspaceId,\n state: \"idle\",\n objective,\n evaluatorProviderId: req.evaluatorProviderId,\n evaluatorModel: req.evaluatorModel?.trim() || undefined,\n maxSupervisionCount: req.maxSupervisionCount ?? 0,\n completedSupervisionCount: 0,\n scheduledAt: req.scheduledAt,\n createdAt: now,\n updatedAt: now,\n })\n );\n let enriched: Supervisor;\n try {\n await this.deps.targetStore.createTargetFiles(workspace.path, {\n targetId: supervisorId,\n sessionId: req.sessionId,\n workspaceId: req.workspaceId,\n objective,\n createdAt: now,\n });\n\n enriched = await this.attachTargetState(supervisor, workspace.path);\n } catch (error) {\n this.deps.supervisorRepo.delete(supervisor.id);\n throw error;\n }\n\n this.storeSnapshot(enriched);\n this.broadcastState(enriched, \"created\");\n this.scheduler.refresh();\n return enriched;\n }\n\n async update(id: string, patch: UpdateSupervisorRequest): Promise<Supervisor> {\n let current = this.requireSupervisor(id);\n\n if (patch.evaluatorProviderId) {\n this.assertEvaluatorProvider(patch.evaluatorProviderId);\n }\n\n const nextObjective =\n patch.objective !== undefined ? patch.objective.trim() : current.objective;\n const objectiveChanged = patch.objective !== undefined && nextObjective !== current.objective;\n\n if (objectiveChanged && this.inFlight.has(id)) {\n this.pendingObjectiveUpdates.add(id);\n this.evaluationAbortControllers.get(id)?.abort();\n await this.inFlightCompletions.get(id)?.promise;\n current = this.requireSupervisor(id);\n }\n\n const workspace = this.requireWorkspace(current.workspaceId);\n const nextPatch: Parameters<SupervisorRepo[\"update\"]>[1] = {\n objective: nextObjective,\n evaluatorProviderId: patch.evaluatorProviderId ?? current.evaluatorProviderId,\n evaluatorModel:\n patch.evaluatorModel === undefined\n ? current.evaluatorModel\n : patch.evaluatorModel?.trim() || null,\n maxSupervisionCount: patch.maxSupervisionCount ?? current.maxSupervisionCount,\n scheduledAt: patch.scheduledAt === undefined ? current.scheduledAt : patch.scheduledAt,\n state: objectiveChanged\n ? current.state === \"paused\"\n ? \"paused\"\n : \"idle\"\n : current.state === \"error\"\n ? \"idle\"\n : current.state,\n stopReason: objectiveChanged ? null : current.stopReason,\n completedSupervisionCount: objectiveChanged ? 0 : current.completedSupervisionCount,\n lastEvaluatedTurnId: objectiveChanged ? null : current.lastEvaluatedTurnId,\n errorReason: null,\n updatedAt: Date.now(),\n };\n\n const rollbackPatch = this.toSupervisorUpdatePatch(current, Date.now());\n this.deps.supervisorRepo.update(id, nextPatch);\n\n if (objectiveChanged) {\n try {\n await this.deps.targetStore.resetTargetFiles(workspace.path, {\n targetId: current.targetId,\n sessionId: current.sessionId,\n workspaceId: current.workspaceId,\n objective: nextObjective,\n createdAt: nextPatch.updatedAt ?? Date.now(),\n });\n } catch (error) {\n try {\n this.deps.supervisorRepo.update(id, rollbackPatch);\n } catch (rollbackError) {\n this.logger.error(\n { err: rollbackError, supervisorId: id },\n \"Failed to roll back supervisor after target reset failure\"\n );\n }\n throw error;\n }\n }\n\n const enriched = await this.hydratePersistedSupervisor(id, workspace.path);\n if (!enriched) {\n await this.markTargetCancelledIfActive(workspace.path, current).catch(() => {});\n throw this.supervisorNotFoundError(id);\n }\n\n this.storeSnapshot(enriched);\n this.broadcastState(enriched, \"updated\");\n this.scheduler.refresh();\n return enriched;\n }\n\n async pause(id: string): Promise<Supervisor> {\n if (this.inFlight.has(id)) {\n this.pendingPauses.add(id);\n this.evaluationAbortControllers.get(id)?.abort();\n }\n\n const updated = this.attachCycles(\n this.withCurrentTargetState(\n this.deps.supervisorRepo.update(id, {\n state: \"paused\",\n updatedAt: Date.now(),\n })\n )\n );\n\n this.storeSnapshot(updated);\n this.broadcastState(updated, \"state_changed\");\n this.scheduler.refresh();\n return updated;\n }\n\n async resume(id: string): Promise<Supervisor> {\n const updated = this.attachCycles(\n this.withCurrentTargetState(\n this.deps.supervisorRepo.update(id, {\n state: \"idle\",\n errorReason: null,\n updatedAt: Date.now(),\n })\n )\n );\n\n this.storeSnapshot(updated);\n this.broadcastState(updated, \"state_changed\");\n this.scheduler.refresh();\n return updated;\n }\n\n async delete(id: string): Promise<void> {\n const supervisor = this.requireSupervisor(id);\n\n if (this.inFlight.has(id)) {\n this.pendingDeletes.add(id);\n this.evaluationAbortControllers.get(id)?.abort();\n await this.inFlightCompletions.get(id)?.promise;\n this.scheduler.refresh();\n return;\n }\n\n this.deleteNow(supervisor);\n }\n\n /**\n * Start a manual evaluation cycle and return as soon as the cycle is\n * created. The heavy evaluator+injector work continues in the background\n * and broadcasts cycle/state updates as it progresses.\n *\n * This is what the WS `supervisor.trigger` command calls, so the web\n * client never has to wait for the (potentially slow) evaluator to finish.\n */\n async triggerEvaluation(id: string): Promise<SupervisorCycle> {\n const started = await this.beginCycle(id, \"manual\");\n if (!started) {\n throw {\n code: \"supervisor_internal_error\",\n message: `Supervisor ${id} could not start an evaluation cycle`,\n };\n }\n\n // Fire-and-forget the rest of the evaluation. Errors are surfaced via\n // broadcasts (cycle \u2192 failed, state \u2192 error).\n void this.finishCycle(started).catch((error) => {\n this.logger.warn(\n { err: error, supervisorId: id, cycleId: started.cycle.id },\n \"Supervisor manual evaluation failed\"\n );\n });\n\n return started.cycle;\n }\n\n /**\n * Run a supervisor evaluation synchronously end-to-end. Used for the\n * auto trigger path (scheduler) and for tests that want to observe the\n * final cycle outcome.\n */\n async runEvaluation(\n supervisorId: string,\n trigger: \"turn_completed\" | \"scheduled\" = \"turn_completed\"\n ): Promise<SupervisorCycle | null> {\n const started = await this.beginCycle(supervisorId, trigger);\n if (!started) {\n return null;\n }\n return await this.finishCycle(started);\n }\n\n /**\n * Synchronous portion of an evaluation cycle: validates preconditions,\n * builds evaluator context, flips state \u2192 'evaluating', creates an\n * in-flight cycle row, and broadcasts both.\n *\n * Returns `null` when auto triggers should be skipped silently\n * (duplicate turnId, wrong state, ...). Throws for manual trigger\n * preconditions the user needs to know about (paused, busy, missing\n * session). Always releases `inFlight` if we bail out before handing\n * off to {@link finishCycle}.\n */\n private async beginCycle(\n id: string,\n trigger: \"turn_completed\" | \"manual\" | \"scheduled\"\n ): Promise<StartedCycle | null> {\n const supervisor = this.requireSupervisor(id);\n const session = this.deps.sessionMgr.get(supervisor.sessionId);\n\n if (!session) {\n throw {\n code: \"supervisor_not_found\",\n message: `Session ${supervisor.sessionId} not found`,\n };\n }\n\n if (this.inFlight.has(id)) {\n if (trigger === \"manual\") {\n throw {\n code: \"supervisor_busy\",\n message: `Supervisor ${id} is already evaluating`,\n };\n }\n return null;\n }\n\n if (supervisor.state === \"paused\") {\n if (trigger === \"manual\") {\n throw {\n code: \"supervisor_paused\",\n message: `Supervisor ${id} is paused`,\n };\n }\n return null;\n }\n\n if (supervisor.state === \"stopped\") {\n if (trigger === \"manual\") {\n throw {\n code: \"supervisor_stopped\",\n message: `Supervisor ${id} is stopped`,\n };\n }\n return null;\n }\n\n if (\n (trigger === \"turn_completed\" || trigger === \"scheduled\") &&\n (supervisor.state !== \"idle\" || (session.state !== \"running\" && session.state !== \"idle\"))\n ) {\n return null;\n }\n\n if (\n supervisor.maxSupervisionCount > 0 &&\n supervisor.completedSupervisionCount >= supervisor.maxSupervisionCount\n ) {\n const stopped = this.attachCycles(\n this.deps.supervisorRepo.update(id, {\n state: \"stopped\",\n stopReason: \"max_supervision_count_reached\",\n updatedAt: Date.now(),\n })\n );\n this.storeSnapshot(stopped);\n this.broadcastState(stopped, \"state_changed\");\n this.scheduler.refresh();\n return null;\n }\n\n // If scheduled execution is set but the scheduled time has not arrived yet,\n // skip turn_completed triggers. Only after the scheduled time passes will\n // turn_completed triggers proceed with evaluation.\n if (trigger === \"turn_completed\") {\n if (\n supervisor.scheduledAt !== undefined &&\n supervisor.scheduledAt !== null &&\n supervisor.scheduledAt > Date.now()\n ) {\n return null;\n }\n }\n\n if (trigger === \"scheduled\") {\n if (supervisor.scheduledAt === undefined || supervisor.scheduledAt > Date.now()) {\n return null;\n }\n }\n\n // Manual trigger: fail fast if the session can't receive injection yet.\n // Without this guard we would burn an evaluator turn only to have the\n // injector reject the session right after (e.g. Codex sessions stuck in\n // 'starting' because the provider hasn't reported TurnCompleted).\n if (trigger === \"manual\" && !INJECTABLE_SESSION_STATES.has(session.state)) {\n throw {\n code: \"supervisor_session_not_ready\",\n message: `Supervisor ${id} cannot evaluate now: ${describeNonInjectableState(session.state)}`,\n };\n }\n\n this.inFlight.add(id);\n this.evaluationAbortControllers.set(id, new AbortController());\n this.inFlightCompletions.set(id, createDeferredCompletion());\n\n try {\n const retrySettings = getSupervisorRetrySettings(this.deps.settingsRepo);\n const workspace = this.requireWorkspace(supervisor.workspaceId);\n const hydratedSupervisor = await this.attachTargetState(supervisor, workspace.path);\n const targetMemory = hydratedSupervisor.currentTargetMemory;\n if (!targetMemory) {\n throw new Error(`Missing target memory for supervisor ${supervisor.id}`);\n }\n const context = await this.contextBuilder.build(hydratedSupervisor, targetMemory);\n if (\n trigger === \"turn_completed\" &&\n context.lastTurnId &&\n context.lastTurnId === supervisor.lastEvaluatedTurnId\n ) {\n this.releaseInFlight(id);\n return null;\n }\n\n const shouldConsumeScheduledAt =\n trigger === \"scheduled\" ||\n (trigger === \"turn_completed\" &&\n supervisor.scheduledAt !== undefined &&\n supervisor.scheduledAt !== null &&\n supervisor.scheduledAt <= Date.now());\n\n const evaluatingSupervisor = this.attachCycles(\n this.withCurrentTargetState(\n this.deps.supervisorRepo.update(supervisor.id, {\n state: \"evaluating\",\n scheduledAt: shouldConsumeScheduledAt ? null : (supervisor.scheduledAt ?? undefined),\n stopReason: null,\n errorReason: null,\n updatedAt: Date.now(),\n })\n )\n );\n this.storeSnapshot(evaluatingSupervisor);\n this.broadcastState(evaluatingSupervisor, \"state_changed\");\n this.scheduler.refresh();\n\n const activeCycle = this.deps.cycleRepo.create({\n id: generateCycleId(),\n supervisorId: supervisor.id,\n sessionId: supervisor.sessionId,\n status: \"evaluating\",\n trigger,\n evidenceSource: context.evidenceSource,\n objective: supervisor.objective,\n evaluatorProviderId: supervisor.evaluatorProviderId,\n turnId: context.lastTurnId,\n createdAt: Date.now(),\n });\n this.broadcastCycle(evaluatingSupervisor, activeCycle, \"created\");\n\n return {\n cycle: activeCycle,\n supervisor: hydratedSupervisor,\n context,\n targetId: hydratedSupervisor.targetId,\n trigger,\n retry: {\n retryEnabled: retrySettings.retryEnabled,\n retryMaxCount: retrySettings.retryMaxCount,\n retryDelayMs: retrySettings.retryDelaySec * 1000,\n retryOnTimeout: retrySettings.retryOnTimeout,\n retryOnEvaluatorError: retrySettings.retryOnEvaluatorError,\n },\n };\n } catch (error: unknown) {\n // Error happened BEFORE we created a cycle (usually contextBuilder or\n // the state\u2192evaluating write). Make sure we don't leave the\n // supervisor stuck and release inFlight ourselves.\n this.releaseInFlight(id);\n this.markSupervisorError(id, error);\n throw error;\n }\n }\n\n /**\n * Asynchronous portion of an evaluation cycle: runs the evaluator, optionally\n * injects guidance, persists the final cycle outcome, and flips state back\n * to 'idle' (or 'error'/'paused'). Always releases `inFlight`.\n */\n private async finishCycle(started: StartedCycle): Promise<SupervisorCycle> {\n const { cycle: activeCycle, context, targetId } = started;\n const supervisorId = activeCycle.supervisorId;\n\n try {\n const signal = this.evaluationAbortControllers.get(supervisorId)?.signal;\n const evaluation = await this.executeCycleWithRetry(started, signal);\n const finalized = await this.finalizeSuccessfulCycle(\n activeCycle,\n context,\n evaluation,\n targetId\n );\n\n if (this.pendingDeletes.has(supervisorId)) {\n this.pendingDeletes.delete(supervisorId);\n this.deleteNow(finalized.supervisor);\n }\n\n return finalized.cycle;\n } catch (error: unknown) {\n if (isSupervisorEvalAborted(error)) {\n const cancelled = this.isCancellationRequested(supervisorId);\n const abortedCycle = this.deps.cycleRepo.update(activeCycle.id, {\n status: cancelled ? \"cancelled\" : \"failed\",\n errorReason: cancelled ? null : messageOf(error, \"Supervisor evaluator aborted\"),\n completedAt: Date.now(),\n });\n\n const currentSupervisor =\n this.supervisors.get(supervisorId) ?? this.requireSupervisor(supervisorId);\n\n if (this.pendingDeletes.has(supervisorId)) {\n const workspace = this.deps.workspaceMgr.get(currentSupervisor.workspaceId);\n if (workspace) {\n await this.writeErrorTargetCycleRecord(\n workspace.path,\n targetId,\n activeCycle,\n abortedCycle.errorReason ?? \"Supervisor evaluator aborted\"\n );\n await this.markTargetCancelledIfActive(workspace.path, currentSupervisor);\n }\n this.broadcastCycle(currentSupervisor, abortedCycle, \"updated\");\n this.pendingDeletes.delete(supervisorId);\n this.deleteNow(currentSupervisor);\n return abortedCycle;\n }\n\n if (this.pendingObjectiveUpdates.has(supervisorId)) {\n const nextState: SupervisorState = this.pendingPauses.has(supervisorId)\n ? \"paused\"\n : \"idle\";\n const recoveredSupervisor = this.attachCycles(\n this.deps.supervisorRepo.update(supervisorId, {\n state: nextState,\n stopReason: null,\n errorReason: null,\n updatedAt: Date.now(),\n })\n );\n\n this.storeSnapshot(recoveredSupervisor);\n this.broadcastCycle(recoveredSupervisor, abortedCycle, \"updated\");\n this.broadcastState(recoveredSupervisor, \"state_changed\");\n this.deps.cycleRepo.pruneOldest(supervisorId, this.config.maxCyclesPerSession);\n this.scheduler.refresh();\n\n return abortedCycle;\n }\n\n if (currentSupervisor.targetId !== targetId) {\n const workspace = this.deps.workspaceMgr.get(currentSupervisor.workspaceId);\n const enriched = this.attachCycles(\n workspace\n ? await this.attachTargetState(currentSupervisor, workspace.path)\n : currentSupervisor\n );\n if (workspace && abortedCycle.status === \"failed\") {\n await this.writeErrorTargetCycleRecord(\n workspace.path,\n targetId,\n activeCycle,\n abortedCycle.errorReason ?? \"Supervisor evaluator aborted\"\n );\n }\n this.storeSnapshot(enriched);\n this.broadcastCycle(enriched, abortedCycle, \"updated\");\n this.deps.cycleRepo.pruneOldest(supervisorId, this.config.maxCyclesPerSession);\n this.scheduler.refresh();\n this.pendingPauses.delete(supervisorId);\n return abortedCycle;\n }\n\n const latestState = this.supervisors.get(supervisorId)?.state;\n const nextState: SupervisorState =\n cancelled || latestState === \"paused\" ? \"paused\" : \"idle\";\n const recoveredSupervisor = this.attachCycles(\n this.deps.supervisorRepo.update(supervisorId, {\n state: nextState,\n stopReason: null,\n errorReason: null,\n updatedAt: Date.now(),\n })\n );\n\n this.storeSnapshot(recoveredSupervisor);\n const workspace = this.deps.workspaceMgr.get(recoveredSupervisor.workspaceId);\n if (workspace && abortedCycle.status === \"failed\") {\n await this.writeErrorTargetCycleRecord(\n workspace.path,\n targetId,\n activeCycle,\n abortedCycle.errorReason ?? \"Supervisor evaluator aborted\"\n );\n }\n this.broadcastCycle(recoveredSupervisor, abortedCycle, \"updated\");\n this.broadcastState(recoveredSupervisor, \"state_changed\");\n this.deps.cycleRepo.pruneOldest(supervisorId, this.config.maxCyclesPerSession);\n this.scheduler.refresh();\n this.pendingPauses.delete(supervisorId);\n\n return abortedCycle;\n }\n\n logFailure(\n this.logger,\n error,\n { supervisorId, cycleId: activeCycle.id },\n \"Supervisor evaluation failed\"\n );\n const reason = messageOf(error, \"Supervisor evaluation failed\");\n const failedCycle = this.deps.cycleRepo.update(activeCycle.id, {\n status: \"failed\",\n errorReason: reason,\n completedAt: Date.now(),\n });\n const currentSupervisor =\n this.supervisors.get(supervisorId) ?? this.requireSupervisor(supervisorId);\n const workspace = this.deps.workspaceMgr.get(currentSupervisor.workspaceId);\n if (currentSupervisor.targetId !== targetId) {\n const enriched = this.attachCycles(\n workspace\n ? await this.attachTargetState(currentSupervisor, workspace.path)\n : currentSupervisor\n );\n if (workspace) {\n await this.writeErrorTargetCycleRecord(\n workspace.path,\n targetId,\n activeCycle,\n failedCycle.errorReason ?? reason\n );\n }\n this.storeSnapshot(enriched);\n this.broadcastCycle(enriched, failedCycle, \"updated\");\n\n if (this.pendingDeletes.has(supervisorId)) {\n this.pendingDeletes.delete(supervisorId);\n this.deleteNow(enriched);\n }\n\n throw error;\n }\n\n const failedSupervisor = this.attachCycles(\n this.deps.supervisorRepo.update(supervisorId, {\n state: \"error\",\n stopReason: null,\n errorReason: reason,\n updatedAt: Date.now(),\n })\n );\n\n this.storeSnapshot(failedSupervisor);\n if (workspace) {\n await this.writeErrorTargetCycleRecord(\n workspace.path,\n targetId,\n activeCycle,\n failedCycle.errorReason ?? reason\n );\n }\n this.broadcastCycle(failedSupervisor, failedCycle, \"updated\");\n this.broadcastState(failedSupervisor, \"state_changed\");\n\n if (this.pendingDeletes.has(supervisorId)) {\n this.pendingDeletes.delete(supervisorId);\n this.deleteNow(failedSupervisor);\n }\n\n throw error;\n } finally {\n this.pendingObjectiveUpdates.delete(supervisorId);\n this.pendingPauses.delete(supervisorId);\n this.releaseInFlight(supervisorId);\n }\n }\n\n private async executeCycleWithRetry(\n started: StartedCycle,\n signal?: AbortSignal\n ): Promise<{\n evaluation: Awaited<ReturnType<SupervisorEvaluator[\"evaluate\"]>>;\n injected: boolean;\n injectedText?: string;\n }> {\n const supervisor = started.supervisor;\n\n for (let attemptIndex = 0; ; attemptIndex += 1) {\n const attempt = this.deps.cycleAttemptRepo.create({\n id: generateAttemptId(),\n cycleId: started.cycle.id,\n attemptIndex,\n status: \"evaluating\",\n startedAt: Date.now(),\n });\n\n try {\n const evaluation = await this.evaluator.evaluate(supervisor, started.context, { signal });\n this.deps.cycleAttemptRepo.update(attempt.id, {\n status: \"completed\",\n completedAt: Date.now(),\n providerModel: supervisor.evaluatorModel ?? null,\n });\n\n if (evaluation.status === \"stop\") {\n return {\n evaluation,\n injected: false,\n };\n }\n\n if (!evaluation.guidance?.trim()) {\n return {\n evaluation,\n injected: false,\n };\n }\n\n if (signal?.aborted || this.pendingPauses.has(supervisor.id)) {\n throw { code: \"supervisor_eval_aborted\", message: \"Supervisor evaluator aborted\" };\n }\n\n const currentSupervisor =\n this.supervisors.get(supervisor.id) ?? this.requireSupervisor(supervisor.id);\n if (currentSupervisor.targetId !== started.targetId) {\n return {\n evaluation,\n injected: false,\n };\n }\n\n const injectingSupervisor = this.attachCycles(\n this.withCurrentTargetState(\n this.deps.supervisorRepo.update(supervisor.id, {\n state: \"injecting\",\n updatedAt: Date.now(),\n })\n )\n );\n this.storeSnapshot(injectingSupervisor);\n this.broadcastState(injectingSupervisor, \"state_changed\");\n\n const recentCycles = this.deps.cycleRepo\n .listRecentForSupervisor(supervisor.id, this.config.guidanceDedupeWindow + 1)\n .filter((cycle) => cycle.id !== started.cycle.id);\n\n const injection = await this.injector.inject(\n injectingSupervisor,\n {\n message: evaluation.guidance,\n },\n recentCycles,\n { signal }\n );\n\n return {\n evaluation,\n injected: injection.injected,\n injectedText: injection.injected ? injection.text : undefined,\n };\n } catch (error) {\n if (isSupervisorEvalAborted(error)) {\n const cancelled = this.isCancellationRequested(supervisor.id);\n this.deps.cycleAttemptRepo.update(attempt.id, {\n status: cancelled ? \"cancelled\" : \"failed\",\n completedAt: Date.now(),\n errorReason: cancelled ? null : messageOf(error, \"Supervisor evaluator aborted\"),\n });\n throw error;\n }\n\n const reason = messageOf(error, \"Supervisor evaluation failed\");\n this.deps.cycleAttemptRepo.update(attempt.id, {\n status: \"failed\",\n completedAt: Date.now(),\n errorReason: reason,\n });\n\n if (!this.shouldRetryAttempt(error, attemptIndex, started.retry)) {\n throw error;\n }\n\n await this.sleep(started.retry.retryDelayMs, signal);\n\n const evaluatingSupervisor = this.attachCycles(\n this.withCurrentTargetState(\n this.deps.supervisorRepo.update(supervisor.id, {\n state: \"evaluating\",\n updatedAt: Date.now(),\n })\n )\n );\n this.storeSnapshot(evaluatingSupervisor);\n this.broadcastState(evaluatingSupervisor, \"state_changed\");\n }\n }\n }\n\n private async finalizeSuccessfulCycle(\n activeCycle: SupervisorCycle,\n context: SupervisorEvaluationContext,\n result: {\n evaluation: Awaited<ReturnType<SupervisorEvaluator[\"evaluate\"]>>;\n injected: boolean;\n injectedText?: string;\n },\n targetId: string\n ): Promise<{ cycle: SupervisorCycle; supervisor: Supervisor }> {\n const workspace = this.requireWorkspace(context.workspaceId);\n const currentSupervisor =\n this.supervisors.get(activeCycle.supervisorId) ??\n this.requireSupervisor(activeCycle.supervisorId);\n const targetMemory =\n targetId === currentSupervisor.targetId && currentSupervisor.currentTargetMemory\n ? currentSupervisor.currentTargetMemory\n : await this.deps.targetStore.loadTargetMemory(workspace.path, targetId);\n const finalStatus: CycleStatus = result.injected ? \"injected\" : \"completed\";\n const cycleReason =\n result.evaluation.status === \"stop\"\n ? result.evaluation.reason\n : result.injected\n ? result.injectedText\n : result.evaluation.guidance\n ? `Skipped duplicate: ${result.evaluation.guidance}`\n : undefined;\n\n const finishedCycle = this.deps.cycleRepo.update(activeCycle.id, {\n status: finalStatus,\n result: cycleReason ?? null,\n injectedGuidance: result.injectedText ?? null,\n errorReason: null,\n completedAt: Date.now(),\n });\n\n const nextTargetMemory = this.applyEvaluationToTargetMemory(\n targetMemory,\n result.evaluation,\n result.injectedText,\n finishedCycle.completedAt ?? Date.now()\n );\n await this.deps.targetStore.saveTargetMemory(workspace.path, targetId, nextTargetMemory);\n\n const cycleRecord: SupervisorCycleTargetRecord =\n result.evaluation.status === \"stop\"\n ? {\n cycleId: activeCycle.id,\n targetId,\n startedAt: activeCycle.createdAt,\n completedAt: finishedCycle.completedAt ?? Date.now(),\n result: \"stop\",\n stopReason: result.evaluation.stopReason,\n reason: result.evaluation.reason,\n progressSummary: result.evaluation.progressSummary ?? nextTargetMemory.progressSummary,\n activeStepId: result.evaluation.activeStepId ?? nextTargetMemory.activeStepId,\n stepUpdates: result.evaluation.stepUpdates,\n injected: false,\n attemptCount: this.deps.cycleAttemptRepo.listForCycle(activeCycle.id).length,\n }\n : {\n cycleId: activeCycle.id,\n targetId,\n startedAt: activeCycle.createdAt,\n completedAt: finishedCycle.completedAt ?? Date.now(),\n result: \"continue\",\n reason: result.evaluation.reason,\n guidance: result.injected ? result.injectedText : result.evaluation.guidance,\n progressSummary: nextTargetMemory.progressSummary,\n activeStepId: nextTargetMemory.activeStepId,\n stepUpdates: result.evaluation.stepUpdates,\n injected: result.injected,\n attemptCount: this.deps.cycleAttemptRepo.listForCycle(activeCycle.id).length,\n };\n await this.deps.targetStore.appendTargetCycleRecord(workspace.path, targetId, cycleRecord);\n\n if (result.evaluation.status === \"stop\") {\n await this.updateTargetMetaStatus(workspace.path, targetId, {\n status: result.evaluation.stopReason === \"objective_complete\" ? \"completed\" : \"cancelled\",\n completedAt: finishedCycle.completedAt ?? Date.now(),\n });\n }\n\n if (currentSupervisor.targetId !== targetId) {\n const enriched = this.attachCycles(\n await this.attachTargetState(currentSupervisor, workspace.path)\n );\n this.storeSnapshot(enriched);\n this.broadcastCycle(enriched, finishedCycle, \"updated\");\n this.deps.cycleRepo.pruneOldest(activeCycle.supervisorId, this.config.maxCyclesPerSession);\n this.scheduler.refresh();\n return { cycle: finishedCycle, supervisor: enriched };\n }\n\n const finishedSupervisor = this.attachCycles(\n this.withCurrentTargetState(\n this.deps.supervisorRepo.update(activeCycle.supervisorId, {\n state: result.evaluation.status === \"stop\" ? \"stopped\" : \"idle\",\n completedSupervisionCount:\n (this.supervisors.get(activeCycle.supervisorId)?.completedSupervisionCount ?? 0) + 1,\n stopReason: result.evaluation.status === \"stop\" ? result.evaluation.stopReason : null,\n lastCycleAt: finishedCycle.completedAt,\n lastEvaluatedTurnId: context.lastTurnId ?? undefined,\n errorReason: null,\n updatedAt: Date.now(),\n })\n )\n );\n const enriched = await this.attachTargetState(finishedSupervisor, workspace.path);\n\n this.storeSnapshot(enriched);\n this.broadcastCycle(enriched, finishedCycle, \"updated\");\n this.broadcastState(enriched, \"state_changed\");\n this.deps.cycleRepo.pruneOldest(activeCycle.supervisorId, this.config.maxCyclesPerSession);\n this.scheduler.refresh();\n\n return { cycle: finishedCycle, supervisor: enriched };\n }\n\n /**\n * Flip a supervisor to 'error' state when something blows up before we\n * had a chance to create a cycle. Without this the supervisor can get\n * stuck in whatever state it happened to be in (usually 'evaluating').\n */\n private markSupervisorError(id: string, error: unknown): void {\n logFailure(\n this.logger,\n error,\n { supervisorId: id },\n \"Supervisor evaluation failed before cycle creation\"\n );\n const reason = messageOf(error, \"Supervisor evaluation failed\");\n try {\n const failed = this.attachCycles(\n this.deps.supervisorRepo.update(id, {\n state: \"error\",\n errorReason: reason,\n updatedAt: Date.now(),\n })\n );\n this.storeSnapshot(failed);\n this.broadcastState(failed, \"state_changed\");\n } catch (writeError) {\n this.logger.warn(\n { err: writeError, supervisorId: id },\n \"Failed to persist supervisor error state\"\n );\n }\n }\n\n private requireSessionProvider(providerId: string): ProviderDefinition {\n const provider = this.deps.providerRegistry.find((item) => item.id === providerId);\n if (!provider) {\n throw {\n code: \"supervisor_unsupported_provider\",\n message: `Provider ${providerId} is not registered`,\n };\n }\n return provider;\n }\n\n private supportsSupervisor(provider: ProviderDefinition): boolean {\n return provider.capability === \"full\";\n }\n\n private requireWorkspace(workspaceId: string): { id: string; path: string } {\n const workspace = this.deps.workspaceMgr.get(workspaceId);\n if (!workspace) {\n throw {\n code: \"supervisor_not_found\",\n message: `Workspace ${workspaceId} not found`,\n };\n }\n return workspace;\n }\n\n private async createLegacyTargetFilesIfMissing(\n workspacePath: string,\n supervisor: Supervisor\n ): Promise<void> {\n try {\n await this.deps.targetStore.readTargetMeta(workspacePath, supervisor.targetId);\n } catch (error) {\n if (\n !error ||\n typeof error !== \"object\" ||\n !(\"code\" in error) ||\n (error as { code?: string }).code !== \"ENOENT\"\n ) {\n throw error;\n }\n await this.deps.targetStore.createTargetFiles(workspacePath, {\n targetId: supervisor.targetId,\n sessionId: supervisor.sessionId,\n workspaceId: supervisor.workspaceId,\n objective: supervisor.objective,\n createdAt: supervisor.createdAt,\n });\n }\n }\n\n private async attachTargetState(\n supervisor: Supervisor,\n workspacePath: string\n ): Promise<Supervisor> {\n await this.createLegacyTargetFilesIfMissing(workspacePath, supervisor);\n const [currentTargetMemory, recentTargetCycles] = await Promise.all([\n this.deps.targetStore.loadTargetMemory(workspacePath, supervisor.targetId),\n this.deps.targetStore.readTargetCycleRecords(workspacePath, supervisor.targetId, 20),\n ]);\n\n return {\n ...supervisor,\n currentTargetMemory,\n recentTargetCycles,\n };\n }\n\n private async hydrateTargetState(supervisor: Supervisor): Promise<Supervisor> {\n const workspace = this.deps.workspaceMgr.get(supervisor.workspaceId);\n if (!workspace) {\n return supervisor;\n }\n return await this.attachTargetState(supervisor, workspace.path);\n }\n\n private async hydratePersistedSupervisor(\n supervisorId: string,\n workspacePath: string\n ): Promise<Supervisor | null> {\n const persisted = this.deps.supervisorRepo.findById(supervisorId);\n if (!persisted) {\n return null;\n }\n\n const hydrated = await this.attachTargetState(this.attachCycles(persisted), workspacePath);\n const latest = this.deps.supervisorRepo.findById(supervisorId);\n if (!latest) {\n return null;\n }\n\n if (latest.targetId !== hydrated.targetId) {\n return await this.attachTargetState(this.attachCycles(latest), workspacePath);\n }\n\n return {\n ...this.attachCycles(latest),\n currentTargetMemory: hydrated.currentTargetMemory,\n recentTargetCycles: hydrated.recentTargetCycles,\n };\n }\n\n private withCurrentTargetState(supervisor: Supervisor): Supervisor {\n const current = this.supervisors.get(supervisor.id);\n if (!current || current.targetId !== supervisor.targetId) {\n return supervisor;\n }\n return {\n ...supervisor,\n currentTargetMemory: current.currentTargetMemory,\n recentTargetCycles: current.recentTargetCycles,\n };\n }\n\n private isCancellationRequested(supervisorId: string): boolean {\n return this.pendingPauses.has(supervisorId) || this.pendingObjectiveUpdates.has(supervisorId);\n }\n\n private toSupervisorUpdatePatch(\n supervisor: Supervisor,\n updatedAt: number\n ): Parameters<SupervisorRepo[\"update\"]>[1] {\n return {\n state: supervisor.state,\n objective: supervisor.objective,\n evaluatorProviderId: supervisor.evaluatorProviderId,\n evaluatorModel: supervisor.evaluatorModel ?? null,\n maxSupervisionCount: supervisor.maxSupervisionCount,\n completedSupervisionCount: supervisor.completedSupervisionCount,\n scheduledAt: supervisor.scheduledAt ?? null,\n stopReason: supervisor.stopReason ?? null,\n lastCycleAt: supervisor.lastCycleAt ?? null,\n lastEvaluatedTurnId: supervisor.lastEvaluatedTurnId ?? null,\n errorReason: supervisor.errorReason ?? null,\n updatedAt,\n };\n }\n\n private applyEvaluationToTargetMemory(\n memory: SupervisorTargetMemory,\n evaluation: Awaited<ReturnType<SupervisorEvaluator[\"evaluate\"]>>,\n injectedText: string | undefined,\n updatedAt: number\n ): SupervisorTargetMemory {\n let plan = memory.plan;\n if (evaluation.plan && evaluation.plan.length > 0) {\n plan = evaluation.plan;\n } else if (evaluation.stepUpdates?.length) {\n const updates = new Map(evaluation.stepUpdates.map((step) => [step.id, step.status]));\n plan = memory.plan.map((step) =>\n updates.has(step.id) ? { ...step, status: updates.get(step.id)! } : step\n );\n }\n\n const progressSummary = evaluation.progressSummary ?? memory.progressSummary;\n const lastGuidance =\n evaluation.status === \"continue\"\n ? (injectedText ?? evaluation.guidance ?? memory.lastGuidance)\n : memory.lastGuidance;\n const stalledCount =\n evaluation.status === \"continue\" &&\n !evaluation.progressSummary &&\n !evaluation.stepUpdates?.length\n ? memory.stalledCount + 1\n : 0;\n\n return {\n ...memory,\n planGenerated: memory.planGenerated || Boolean(evaluation.plan?.length),\n plan,\n activeStepId: evaluation.activeStepId ?? memory.activeStepId,\n progressSummary,\n lastGuidance,\n stalledCount,\n updatedAt,\n };\n }\n\n private async updateTargetMetaStatus(\n workspacePath: string,\n targetId: string,\n patch: Partial<Pick<SupervisorTargetMeta, \"status\" | \"supersededBy\" | \"completedAt\">>\n ): Promise<void> {\n const current = await this.deps.targetStore.readTargetMeta(workspacePath, targetId);\n const nextPatch =\n current.status === \"superseded\" && patch.status && patch.status !== \"superseded\"\n ? {\n ...patch,\n status: current.status,\n supersededBy: current.supersededBy,\n }\n : patch;\n await this.deps.targetStore.saveTargetMeta(workspacePath, targetId, {\n ...current,\n ...nextPatch,\n updatedAt: Date.now(),\n });\n }\n\n private async writeErrorTargetCycleRecord(\n workspacePath: string,\n targetId: string,\n cycle: SupervisorCycle,\n errorReason: string\n ): Promise<void> {\n await this.deps.targetStore.appendTargetCycleRecord(workspacePath, targetId, {\n cycleId: cycle.id,\n targetId,\n startedAt: cycle.createdAt,\n completedAt: Date.now(),\n result: \"error\",\n errorReason,\n attemptCount: this.deps.cycleAttemptRepo.listForCycle(cycle.id).length,\n });\n }\n\n private async markTargetCancelledIfActive(\n workspacePath: string,\n supervisor: Supervisor\n ): Promise<void> {\n const meta = await this.deps.targetStore\n .readTargetMeta(workspacePath, supervisor.targetId)\n .catch(() => null);\n if (!meta || meta.status === \"completed\" || meta.status === \"superseded\") {\n return;\n }\n await this.updateTargetMetaStatus(workspacePath, supervisor.targetId, {\n status: \"cancelled\",\n completedAt: meta.completedAt ?? Date.now(),\n });\n }\n\n private assertEvaluatorProvider(providerId: string): void {\n const provider = this.deps.providerRegistry.find((item) => item.id === providerId);\n if (!provider?.buildSupervisorEvalCommand) {\n throw {\n code: \"supervisor_invalid_evaluator_provider\",\n message: `Provider ${providerId} cannot evaluate supervisors`,\n };\n }\n const hasConfig = this.deps.providerConfigRepo.get(providerId) ?? provider.defaultConfig;\n if (!hasConfig) {\n throw {\n code: \"missing_evaluator_config\",\n message: `Missing config for evaluator provider ${providerId}`,\n };\n }\n }\n\n private attachCycles(supervisor: Supervisor): Supervisor {\n return {\n ...supervisor,\n cycles: this.deps.cycleRepo.listRecentForSupervisor(supervisor.id, 20),\n };\n }\n\n private listScheduledSupervisors(): Array<{ supervisorId: string; scheduledAt: number }> {\n return Array.from(this.supervisors.values())\n .filter(\n (supervisor) =>\n supervisor.state === \"idle\" &&\n typeof supervisor.scheduledAt === \"number\" &&\n Number.isFinite(supervisor.scheduledAt)\n )\n .map((supervisor) => ({\n supervisorId: supervisor.id,\n scheduledAt: supervisor.scheduledAt!,\n }));\n }\n\n private storeSnapshot(supervisor: Supervisor): void {\n this.supervisors.set(supervisor.id, supervisor);\n this.supervisorsBySession.set(supervisor.sessionId, supervisor.id);\n }\n\n private deleteNow(supervisor: Supervisor): void {\n const workspace = this.deps.workspaceMgr.get(supervisor.workspaceId);\n if (workspace) {\n void this.markTargetCancelledIfActive(workspace.path, supervisor).catch((error) => {\n this.logger.warn(\n { err: error, supervisorId: supervisor.id, targetId: supervisor.targetId },\n \"Failed to mark target cancelled during supervisor delete\"\n );\n });\n }\n this.deps.supervisorRepo.delete(supervisor.id);\n this.supervisors.delete(supervisor.id);\n this.supervisorsBySession.delete(supervisor.sessionId);\n this.pendingDeletes.delete(supervisor.id);\n this.pendingPauses.delete(supervisor.id);\n this.pendingObjectiveUpdates.delete(supervisor.id);\n this.releaseInFlight(supervisor.id);\n this.scheduler.refresh();\n\n this.deps.broadcaster.broadcast(\n Topics.supervisorState(supervisor.workspaceId, supervisor.sessionId),\n { supervisorId: supervisor.id, event: \"deleted\" }\n );\n }\n\n private releaseInFlight(supervisorId: string): void {\n this.inFlight.delete(supervisorId);\n this.evaluationAbortControllers.delete(supervisorId);\n this.inFlightCompletions.get(supervisorId)?.resolve();\n this.inFlightCompletions.delete(supervisorId);\n }\n\n private supervisorNotFoundError(id: string): { code: \"supervisor_not_found\"; message: string } {\n return {\n code: \"supervisor_not_found\",\n message: `Supervisor ${id} not found`,\n };\n }\n\n private requireSupervisor(id: string): Supervisor {\n const supervisor = this.supervisors.get(id);\n if (!supervisor) {\n throw this.supervisorNotFoundError(id);\n }\n return supervisor;\n }\n\n private broadcastState(\n supervisor: Supervisor,\n event: \"created\" | \"updated\" | \"state_changed\"\n ): void {\n this.deps.broadcaster.broadcast(\n Topics.supervisorState(supervisor.workspaceId, supervisor.sessionId),\n { supervisor, event }\n );\n }\n\n private broadcastCycle(\n supervisor: Supervisor,\n cycle: SupervisorCycle,\n event: \"created\" | \"updated\"\n ): void {\n this.deps.broadcaster.broadcast(\n Topics.supervisorCycle(supervisor.workspaceId, supervisor.sessionId),\n { cycle, event }\n );\n }\n\n private shouldRetryAttempt(\n error: unknown,\n attemptIndex: number,\n retry: SupervisorRetrySnapshot\n ): boolean {\n if (!retry.retryEnabled) {\n return false;\n }\n if (attemptIndex >= retry.retryMaxCount) {\n return false;\n }\n\n const code =\n error && typeof error === \"object\" && \"code\" in error\n ? (error as { code?: unknown }).code\n : undefined;\n\n if (code === \"supervisor_eval_timeout\") {\n return retry.retryOnTimeout;\n }\n\n if (code === \"supervisor_eval_failed\") {\n return retry.retryOnEvaluatorError;\n }\n\n return false;\n }\n\n private async sleep(delayMs: number, signal?: AbortSignal): Promise<void> {\n if (delayMs <= 0) {\n return;\n }\n\n if (signal?.aborted) {\n throw { code: \"supervisor_eval_aborted\", message: \"Supervisor evaluator aborted\" };\n }\n\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, delayMs);\n timer.unref?.();\n\n const onAbort = () => {\n clearTimeout(timer);\n signal?.removeEventListener(\"abort\", onAbort);\n reject({ code: \"supervisor_eval_aborted\", message: \"Supervisor evaluator aborted\" });\n };\n\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n }\n}\n\nfunction isSupervisorEvalAborted(error: unknown): error is {\n code: \"supervisor_eval_aborted\";\n message: string;\n} {\n return (\n !!error &&\n typeof error === \"object\" &&\n (error as { code?: unknown }).code === \"supervisor_eval_aborted\"\n );\n}\n", "import { mkdir, mkdtemp, readFile, rename, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport type { SupervisorCycleTargetRecord, SupervisorTargetMemory } from \"@coder-studio/core\";\n\nexport interface SupervisorTargetMeta {\n targetId: string;\n sessionId: string;\n workspaceId: string;\n objective: string;\n status: \"active\" | \"completed\" | \"cancelled\" | \"superseded\";\n createdAt: number;\n updatedAt: number;\n supersededBy: string | null;\n completedAt: number | null;\n}\n\nfunction targetDir(workspacePath: string, targetId: string): string {\n return join(workspacePath, \".coder-studio\", \"supervisor\", \"targets\", targetId);\n}\n\nfunction metaPath(workspacePath: string, targetId: string): string {\n return join(targetDir(workspacePath, targetId), \"meta.json\");\n}\n\nfunction memoryPath(workspacePath: string, targetId: string): string {\n return join(targetDir(workspacePath, targetId), \"memory.json\");\n}\n\nfunction cyclesPath(workspacePath: string, targetId: string): string {\n return join(targetDir(workspacePath, targetId), \"cycles.jsonl\");\n}\n\nfunction metaFilePath(dirPath: string): string {\n return join(dirPath, \"meta.json\");\n}\n\nfunction memoryFilePath(dirPath: string): string {\n return join(dirPath, \"memory.json\");\n}\n\nfunction cyclesFilePath(dirPath: string): string {\n return join(dirPath, \"cycles.jsonl\");\n}\n\nfunction hasCode(error: unknown, code: string): boolean {\n return Boolean(\n error &&\n typeof error === \"object\" &&\n \"code\" in error &&\n (error as { code?: unknown }).code === code\n );\n}\n\nfunction errorMessage(error: unknown, fallback: string): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (error && typeof error === \"object\" && \"message\" in error) {\n const value = (error as { message?: unknown }).message;\n if (typeof value === \"string\") {\n return value;\n }\n }\n return fallback;\n}\n\nasync function writeJsonIfMissing(path: string, value: unknown): Promise<void> {\n try {\n await writeFile(path, JSON.stringify(value, null, 2) + \"\\n\", {\n encoding: \"utf-8\",\n flag: \"wx\",\n });\n } catch (error) {\n if (!hasCode(error, \"EEXIST\")) {\n throw error;\n }\n }\n}\n\nfunction buildTargetMeta(input: {\n targetId: string;\n sessionId: string;\n workspaceId: string;\n objective: string;\n createdAt: number;\n}): SupervisorTargetMeta {\n return {\n targetId: input.targetId,\n sessionId: input.sessionId,\n workspaceId: input.workspaceId,\n objective: input.objective,\n status: \"active\",\n createdAt: input.createdAt,\n updatedAt: input.createdAt,\n supersededBy: null,\n completedAt: null,\n };\n}\n\nfunction buildTargetMemory(targetId: string, createdAt: number): SupervisorTargetMemory {\n return {\n targetId,\n planGenerated: false,\n plan: [],\n stalledCount: 0,\n updatedAt: createdAt,\n };\n}\n\nasync function writeResetTargetFiles(\n dirPath: string,\n input: {\n targetId: string;\n sessionId: string;\n workspaceId: string;\n objective: string;\n createdAt: number;\n }\n): Promise<void> {\n await mkdir(dirPath, { recursive: true });\n await writeFile(\n metaFilePath(dirPath),\n JSON.stringify(buildTargetMeta(input), null, 2) + \"\\n\",\n \"utf-8\"\n );\n await writeFile(\n memoryFilePath(dirPath),\n JSON.stringify(buildTargetMemory(input.targetId, input.createdAt), null, 2) + \"\\n\",\n \"utf-8\"\n );\n await writeFile(cyclesFilePath(dirPath), \"\", \"utf-8\");\n}\n\nexport async function createTargetFiles(\n workspacePath: string,\n input: {\n targetId: string;\n sessionId: string;\n workspaceId: string;\n objective: string;\n createdAt: number;\n }\n): Promise<void> {\n const dir = targetDir(workspacePath, input.targetId);\n await mkdir(dir, { recursive: true });\n await writeJsonIfMissing(metaPath(workspacePath, input.targetId), buildTargetMeta(input));\n await writeJsonIfMissing(\n memoryPath(workspacePath, input.targetId),\n buildTargetMemory(input.targetId, input.createdAt)\n );\n}\n\nexport async function resetTargetFiles(\n workspacePath: string,\n input: {\n targetId: string;\n sessionId: string;\n workspaceId: string;\n objective: string;\n createdAt: number;\n }\n): Promise<void> {\n const dir = targetDir(workspacePath, input.targetId);\n const parentDir = dirname(dir);\n const backupDir = `${dir}.backup-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n\n await mkdir(parentDir, { recursive: true });\n const stagingDir = await mkdtemp(join(parentDir, `${input.targetId}.reset-`));\n\n let backupCreated = false;\n let promoted = false;\n let restored = false;\n\n try {\n await writeResetTargetFiles(stagingDir, input);\n\n try {\n await rename(dir, backupDir);\n backupCreated = true;\n } catch (error) {\n if (!hasCode(error, \"ENOENT\")) {\n throw error;\n }\n }\n\n try {\n await rename(stagingDir, dir);\n promoted = true;\n } catch (promoteError) {\n if (backupCreated) {\n try {\n await rename(backupDir, dir);\n backupCreated = false;\n restored = true;\n } catch (restoreError) {\n throw new Error(\n `Failed to promote target reset (${errorMessage(\n promoteError,\n \"unknown promote error\"\n )}); restore also failed (${errorMessage(restoreError, \"unknown restore error\")})`\n );\n }\n }\n throw promoteError;\n }\n } catch (error) {\n if (restored || !backupCreated) {\n await rm(stagingDir, { recursive: true, force: true }).catch(() => {});\n }\n throw error;\n }\n\n if (backupCreated) {\n await rm(backupDir, { recursive: true, force: true }).catch(() => {});\n }\n if (!promoted) {\n await rm(stagingDir, { recursive: true, force: true }).catch(() => {});\n }\n}\n\nexport async function readTargetMeta(\n workspacePath: string,\n targetId: string\n): Promise<SupervisorTargetMeta> {\n return JSON.parse(\n await readFile(metaPath(workspacePath, targetId), \"utf-8\")\n ) as SupervisorTargetMeta;\n}\n\nexport async function loadTargetMemory(\n workspacePath: string,\n targetId: string\n): Promise<SupervisorTargetMemory> {\n return JSON.parse(\n await readFile(memoryPath(workspacePath, targetId), \"utf-8\")\n ) as SupervisorTargetMemory;\n}\n\nexport async function saveTargetMemory(\n workspacePath: string,\n targetId: string,\n memory: SupervisorTargetMemory\n): Promise<void> {\n await mkdir(dirname(memoryPath(workspacePath, targetId)), { recursive: true });\n await writeFile(\n memoryPath(workspacePath, targetId),\n JSON.stringify(memory, null, 2) + \"\\n\",\n \"utf-8\"\n );\n}\n\nexport async function appendTargetCycleRecord(\n workspacePath: string,\n targetId: string,\n record: SupervisorCycleTargetRecord\n): Promise<void> {\n await mkdir(dirname(cyclesPath(workspacePath, targetId)), { recursive: true });\n await writeFile(cyclesPath(workspacePath, targetId), JSON.stringify(record) + \"\\n\", {\n encoding: \"utf-8\",\n flag: \"a\",\n });\n}\n\nexport async function saveTargetMeta(\n workspacePath: string,\n targetId: string,\n meta: SupervisorTargetMeta\n): Promise<void> {\n await mkdir(dirname(metaPath(workspacePath, targetId)), { recursive: true });\n await writeFile(metaPath(workspacePath, targetId), JSON.stringify(meta, null, 2) + \"\\n\", \"utf-8\");\n}\n\nexport async function readTargetCycleRecords(\n workspacePath: string,\n targetId: string,\n limit = 20\n): Promise<SupervisorCycleTargetRecord[]> {\n const content = await readFile(cyclesPath(workspacePath, targetId), \"utf-8\").catch(() => \"\");\n return content\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line) => JSON.parse(line) as SupervisorCycleTargetRecord)\n .slice(-limit)\n .reverse();\n}\n\nexport async function markTargetSuperseded(\n workspacePath: string,\n targetId: string,\n nextTargetId: string,\n updatedAt: number\n): Promise<void> {\n const meta = await readTargetMeta(workspacePath, targetId);\n await saveTargetMeta(workspacePath, targetId, {\n ...meta,\n status: \"superseded\",\n supersededBy: nextTargetId,\n updatedAt,\n });\n}\n", "// Active terminal instance (spec \u00A74.5)\n\nimport type { Terminal } from \"@coder-studio/core\";\nimport { RingBuffer } from \"./ring-buffer\";\nimport type { HeadlessSnapshotBuffer } from \"./terminal-snapshot-buffer\";\nimport type { PtyProcess, TerminalSpec } from \"./types\";\n\n/**\n * Active terminal object that holds PTY instance and ring buffer\n */\nexport class ActiveTerminal {\n public alive = true;\n public exitCode?: number;\n public cleanupTimer: NodeJS.Timeout | null = null;\n // Track current PTY dimensions so TerminalManager.resize() can skip\n // redundant pty.resize() calls. Each unnecessary pty.resize() sends\n // SIGWINCH to the child process (e.g. codex), which triggers a full\n // clear-screen + repaint cycle. Under WebSocket back-pressure the\n // StreamBuffer may drop the clear-screen frame while delivering the\n // repaint frame, causing duplicate content on the frontend.\n public currentCols: number;\n public currentRows: number;\n\n constructor(\n public readonly id: string,\n public readonly spec: TerminalSpec,\n public readonly pty: PtyProcess,\n public readonly ringBuffer: RingBuffer,\n public readonly snapshotBuffer: HeadlessSnapshotBuffer | undefined,\n public readonly createdAt: number = Date.now()\n ) {\n this.currentCols = spec.cols ?? 120;\n this.currentRows = spec.rows ?? 30;\n }\n\n /**\n * Convert to DTO (Data Transfer Object) for external use\n */\n toDTO(): Terminal {\n return {\n id: this.id,\n workspaceId: this.spec.workspaceId,\n kind: this.spec.kind,\n title: this.spec.title ?? this.spec.argv.join(\" \"),\n cwd: this.spec.cwd,\n argv: this.spec.argv,\n cols: this.spec.cols ?? 120,\n rows: this.spec.rows ?? 30,\n alive: this.alive,\n createdAt: this.createdAt,\n endedAt: this.alive ? undefined : Date.now(),\n exitCode: this.exitCode,\n };\n }\n\n /**\n * Convert to database row for persistence\n */\n toRow(): Terminal {\n return this.toDTO();\n }\n}\n", "export const RING_BUFFER_SIZE = 64 * 1024 * 1024;\nexport const TERMINAL_SNAPSHOT_SCROLLBACK = 1000;\n", "// Ring buffer implementation for terminal output (spec \u00A74.5)\n\n/**\n * Circular overwrite ring buffer for terminal output.\n * Buffer size is configurable at construction time.\n */\nexport class RingBuffer {\n private buffer: Buffer;\n private writePos = 0;\n private totalBytes = 0;\n\n constructor(private readonly size: number) {\n this.buffer = Buffer.alloc(size);\n }\n\n /**\n * Append a chunk of data to the ring buffer\n * Returns the sequence number (cumulative byte count)\n */\n append(chunk: Buffer): { seq: number } {\n if (chunk.length === 0) {\n return { seq: this.totalBytes };\n }\n\n // Write in circular fashion\n let remaining = chunk.length;\n let offset = 0;\n\n while (remaining > 0) {\n const availableSpace = this.size - this.writePos;\n const writeLength = Math.min(remaining, availableSpace);\n\n chunk.copy(this.buffer, this.writePos, offset, offset + writeLength);\n\n this.writePos = (this.writePos + writeLength) % this.size;\n offset += writeLength;\n remaining -= writeLength;\n }\n\n this.totalBytes += chunk.length;\n\n return { seq: this.totalBytes };\n }\n\n /**\n * Replay data from a given sequence number\n * Returns the data and new sequence number, or 'too_old' if data was overwritten\n */\n replayFrom(lastSeq: number): { status: \"ok\"; data: Buffer; seq: number } | { status: \"too_old\" } {\n if (lastSeq >= this.totalBytes) {\n // No new data\n return { status: \"ok\", data: Buffer.alloc(0), seq: this.totalBytes };\n }\n\n const bytesToRead = this.totalBytes - lastSeq;\n\n // Check if requested data is still in buffer\n if (bytesToRead > this.size) {\n return { status: \"too_old\" };\n }\n\n // Extract data from circular buffer\n const data = Buffer.alloc(bytesToRead);\n let readPos = this.writePos - bytesToRead;\n if (readPos < 0) {\n readPos += this.size;\n }\n\n let remaining = bytesToRead;\n let offset = 0;\n\n while (remaining > 0) {\n const availableBytes = this.size - readPos;\n const readLength = Math.min(remaining, availableBytes);\n\n this.buffer.copy(data, offset, readPos, readPos + readLength);\n\n readPos = (readPos + readLength) % this.size;\n offset += readLength;\n remaining -= readLength;\n }\n\n return { status: \"ok\", data, seq: this.totalBytes };\n }\n\n /**\n * Get a snapshot of current valid bytes in the buffer\n */\n snapshot(): Buffer {\n const validBytes = Math.min(this.totalBytes, this.size);\n const startPos = this.totalBytes > this.size ? this.writePos : 0;\n\n const snapshot = Buffer.alloc(validBytes);\n let readPos = startPos;\n let remaining = validBytes;\n let offset = 0;\n\n while (remaining > 0) {\n const availableBytes = this.size - readPos;\n const readLength = Math.min(remaining, availableBytes);\n\n this.buffer.copy(snapshot, offset, readPos, readPos + readLength);\n\n readPos = (readPos + readLength) % this.size;\n offset += readLength;\n remaining -= readLength;\n }\n\n return snapshot;\n }\n\n /**\n * Read the last N bytes currently retained in the buffer.\n * Reads directly from the circular buffer \u2014 O(N), not O(size).\n */\n tail(bytes: number): Buffer {\n if (bytes <= 0) {\n return Buffer.alloc(0);\n }\n\n const validBytes = Math.min(this.totalBytes, this.size);\n const bytesToRead = Math.min(bytes, validBytes);\n\n if (bytesToRead === 0) {\n return Buffer.alloc(0);\n }\n\n let readPos = this.writePos - bytesToRead;\n if (readPos < 0) {\n readPos += this.size;\n }\n\n const result = Buffer.allocUnsafe(bytesToRead);\n let remaining = bytesToRead;\n let offset = 0;\n\n while (remaining > 0) {\n const availableBytes = this.size - readPos;\n const readLength = Math.min(remaining, availableBytes);\n\n this.buffer.copy(result, offset, readPos, readPos + readLength);\n\n readPos = (readPos + readLength) % this.size;\n offset += readLength;\n remaining -= readLength;\n }\n\n return result;\n }\n\n /**\n * Get current sequence number (total bytes written)\n */\n getSeq(): number {\n return this.totalBytes;\n }\n}\n", "import { SerializeAddon } from \"@xterm/addon-serialize\";\nimport type { Terminal as HeadlessTerminal } from \"@xterm/headless\";\nimport XtermHeadless from \"@xterm/headless\";\nimport { TERMINAL_SNAPSHOT_SCROLLBACK } from \"./constants\";\n\nconst { Terminal } = XtermHeadless;\n\nexport interface TerminalSnapshotResult {\n data: Buffer;\n seq: number;\n cols: number;\n rows: number;\n}\n\nexport class SnapshotUnsupportedError extends Error {\n constructor(message = \"Terminal snapshot buffer is unavailable\") {\n super(message);\n this.name = \"SnapshotUnsupportedError\";\n }\n}\n\nexport class HeadlessSnapshotBuffer {\n private term: HeadlessTerminal | null;\n private addon: SerializeAddon | null;\n private cols: number;\n private rows: number;\n private mirroredSeq = 0;\n private disabledState = false;\n private disposed = false;\n private pendingWriteCount = 0;\n private drainResolvers: Array<() => void> = [];\n\n constructor(options: { cols: number; rows: number; scrollback?: number }) {\n this.cols = options.cols;\n this.rows = options.rows;\n this.term = new Terminal({\n cols: options.cols,\n rows: options.rows,\n scrollback: options.scrollback ?? TERMINAL_SNAPSHOT_SCROLLBACK,\n allowProposedApi: true,\n });\n this.addon = new SerializeAddon();\n this.term.loadAddon(this.addon);\n }\n\n get disabled(): boolean {\n return this.disabledState;\n }\n\n write(chunk: Buffer, seq: number): void {\n const term = this.requireTerminal();\n\n this.pendingWriteCount += 1;\n try {\n term.write(chunk, () => {\n this.mirroredSeq = seq;\n this.pendingWriteCount = Math.max(0, this.pendingWriteCount - 1);\n this.resolveDrainIfIdle();\n });\n } catch (error) {\n this.pendingWriteCount = Math.max(0, this.pendingWriteCount - 1);\n this.disable();\n throw error;\n }\n }\n\n resize(cols: number, rows: number): void {\n const term = this.requireTerminal();\n\n try {\n term.resize(cols, rows);\n this.cols = cols;\n this.rows = rows;\n } catch (error) {\n this.disable();\n throw error;\n }\n }\n\n async snapshot(): Promise<TerminalSnapshotResult> {\n this.requireTerminal();\n const addon = this.requireAddon();\n\n await this.waitForPendingWrites();\n\n try {\n const serialized = addon.serialize();\n return {\n data: Buffer.from(serialized, \"utf8\"),\n seq: this.mirroredSeq,\n cols: this.cols,\n rows: this.rows,\n };\n } catch (error) {\n this.disable();\n throw error;\n }\n }\n\n dispose(): void {\n if (this.disposed) {\n return;\n }\n\n this.disposed = true;\n this.term?.dispose();\n this.addon?.dispose();\n this.term = null;\n this.addon = null;\n this.disabledState = true;\n this.pendingWriteCount = 0;\n this.resolveDrainIfIdle();\n }\n\n private waitForPendingWrites(): Promise<void> {\n if (this.pendingWriteCount === 0) {\n return Promise.resolve();\n }\n\n return new Promise((resolve) => {\n this.drainResolvers.push(resolve);\n });\n }\n\n private resolveDrainIfIdle(): void {\n if (this.pendingWriteCount !== 0) {\n return;\n }\n\n const resolvers = this.drainResolvers;\n this.drainResolvers = [];\n for (const resolve of resolvers) {\n resolve();\n }\n }\n\n private requireTerminal(): HeadlessTerminal {\n if (this.disposed || this.disabledState || !this.term) {\n throw new SnapshotUnsupportedError();\n }\n\n return this.term;\n }\n\n private requireAddon(): SerializeAddon {\n if (this.disposed || this.disabledState || !this.addon) {\n throw new SnapshotUnsupportedError();\n }\n\n return this.addon;\n }\n\n private disable(): void {\n this.disabledState = true;\n this.resolveDrainIfIdle();\n }\n}\n", "// Terminal types (spec \u00A74.5)\n\nimport type { Terminal } from \"@coder-studio/core\";\n\n/**\n * Specification for creating a new terminal\n */\nexport interface TerminalSpec {\n workspaceId: string;\n kind: \"agent\" | \"shell\";\n argv: string[];\n cwd: string;\n env?: Record<string, string>;\n cols?: number;\n rows?: number;\n title?: string;\n}\n\n/**\n * Options for spawning a PTY process\n */\nexport interface PtySpawnOptions {\n cwd: string;\n env: Record<string, string>;\n cols: number;\n rows: number;\n}\n\n/**\n * Result of replay operation\n */\nexport type ReplayResult =\n | { status: \"ok\"; data: Buffer; seq: number }\n | { status: \"too_old\" }\n | { status: \"unknown\" };\n\n/**\n * Error thrown when terminal is not alive\n */\nexport class TerminalNotAliveError extends Error {\n constructor(message = \"Terminal is not alive\") {\n super(message);\n this.name = \"TerminalNotAliveError\";\n }\n}\n\n/**\n * Error thrown when terminal spawn fails synchronously\n */\nexport class TerminalSpawnError extends Error {\n readonly code = \"terminal_spawn_failed\";\n\n constructor(\n public readonly kind: \"spawn_failed_sync\",\n public readonly cause: Error,\n public readonly details?: {\n command?: string;\n cwd?: string;\n terminalKind?: \"agent\" | \"shell\";\n }\n ) {\n super(`Terminal spawn failed: ${cause.message}`);\n this.name = \"TerminalSpawnError\";\n }\n}\n\n/**\n * PTY process interface (abstraction over node-pty)\n */\nexport interface PtyProcess {\n onData(callback: (data: string) => void): void;\n onExit(callback: (event: { exitCode: number }) => void): void;\n write(data: Buffer | string): void;\n resize(cols: number, rows: number): void;\n kill(signal?: NodeJS.Signals): Promise<void>;\n}\n\n/**\n * PTY host interface (abstraction for testing)\n */\nexport interface PtyHost {\n spawn(argv: string[], options: PtySpawnOptions): PtyProcess;\n}\n\n/**\n * Broadcaster interface (for WebSocket broadcast)\n */\nexport interface Broadcaster {\n broadcast(topic: string, payload: unknown): void;\n}\n\n/**\n * Database interface for terminal persistence\n */\nexport interface TerminalDatabase {\n insert(terminal: Terminal): void;\n markEnded(id: string, endedAt: number, exitCode: number): void;\n}\n\n/**\n * Terminal ID type\n */\nexport type TerminalId = string;\n", "// Terminal manager implementation (spec \u00A74.5)\n\nimport type { DomainEvent, Terminal } from \"@coder-studio/core\";\nimport type { EventBus } from \"../bus/event-bus\";\nimport { ActiveTerminal } from \"./active-terminal\";\nimport { RING_BUFFER_SIZE } from \"./constants\";\nimport { RingBuffer } from \"./ring-buffer\";\nimport { type RenderOptions, renderSnapshotToText } from \"./snapshot-render\";\nimport { HeadlessSnapshotBuffer } from \"./terminal-snapshot-buffer\";\nimport type {\n PtyHost,\n PtyProcess,\n ReplayResult,\n TerminalDatabase,\n TerminalId,\n TerminalSpec,\n} from \"./types\";\nimport { TerminalSpawnError } from \"./types\";\n\nfunction isTerminalTraceEnabled(): boolean {\n return process.env.CODER_STUDIO_TERMINAL_TRACE === \"1\";\n}\n\nfunction countOccurrences(text: string, needle: string): number {\n return text.split(needle).length - 1;\n}\n\nfunction summarizeTerminalData(data: string | Buffer) {\n const text = typeof data === \"string\" ? data : data.toString(\"utf8\");\n return {\n length: typeof data === \"string\" ? Buffer.byteLength(data, \"utf8\") : data.byteLength,\n syncStart: countOccurrences(text, \"\\x1b[?2026h\"),\n syncEnd: countOccurrences(text, \"\\x1b[?2026l\"),\n clearToEnd: countOccurrences(text, \"\\x1b[J\"),\n clearScreen: countOccurrences(text, \"\\x1b[2J\"),\n eraseLine: countOccurrences(text, \"\\x1b[K\"),\n cursorHome: countOccurrences(text, \"\\x1b[1;1H\"),\n dsr: countOccurrences(text, \"\\x1b[6n\"),\n da: countOccurrences(text, \"\\x1b[c\"),\n reverseIndex: countOccurrences(text, \"\\x1bM\"),\n cursorMoves: text.match(/\\x1b\\[[0-9;]*[Hf]/g)?.length ?? 0,\n scrollRegions: text.match(/\\x1b\\[[0-9;]*r/g)?.slice(0, 6) ?? [],\n };\n}\n\nfunction traceTerminal(\n terminalId: TerminalId,\n event: string,\n details: Record<string, unknown> = {}\n) {\n if (!isTerminalTraceEnabled()) {\n return;\n }\n\n console.debug(\"[terminal-trace]\", {\n at: Date.now(),\n terminalId,\n event,\n ...details,\n });\n}\n\ntype SnapshotResult =\n | { status: \"ok\"; data: Buffer; seq: number; cols: number; rows: number }\n | { status: \"unsupported\" };\n\n/**\n * Generate unique terminal ID\n */\nfunction generateId(): string {\n return `term_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Terminal manager - manages PTY lifecycle and ring buffers\n */\nexport class TerminalManager {\n private terminals = new Map<TerminalId, ActiveTerminal>();\n private explicitCloseWaiters = new Map<\n TerminalId,\n {\n signal: NodeJS.Signals;\n killCompleted: Promise<void>;\n markKillCompleted: () => void;\n finalized: boolean;\n promise: Promise<void>;\n resolve: () => void;\n }\n >();\n\n constructor(\n private readonly deps: {\n ptyHost: PtyHost;\n eventBus: EventBus;\n db: TerminalDatabase;\n }\n ) {}\n\n /**\n * Create a new terminal with PTY process\n */\n create(spec: TerminalSpec): Terminal {\n const id = generateId();\n\n // The PTY output is always rendered by xterm.js on the frontend, so force\n // a full-color terminal environment regardless of the server's parent TTY\n // (e.g. tmux's screen-256color, kitty's xterm-kitty, or CI's dumb).\n // FORCE_COLOR makes agent CLIs that are spawned directly (e.g. Claude Code\n // via Ink/chalk, Codex) emit ANSI colors without relying on the user's\n // shell rc to set it. spec.env can still override explicitly.\n const terminalEnv: Record<string, string> = {\n ...Object.fromEntries(\n Object.entries(process.env).filter((e): e is [string, string] => e[1] != null)\n ),\n TERM: \"xterm-256color\",\n COLORTERM: \"truecolor\",\n FORCE_COLOR: \"3\",\n ...spec.env,\n };\n\n let pty: PtyProcess;\n try {\n pty = this.deps.ptyHost.spawn(spec.argv, {\n cwd: spec.cwd,\n env: terminalEnv,\n cols: spec.cols ?? 120,\n rows: spec.rows ?? 30,\n });\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n throw new TerminalSpawnError(\"spawn_failed_sync\", error, {\n command: spec.argv[0],\n cwd: spec.cwd,\n terminalKind: spec.kind,\n });\n }\n\n const ringBuffer = new RingBuffer(RING_BUFFER_SIZE);\n let snapshotBuffer: HeadlessSnapshotBuffer | undefined;\n\n if (spec.kind === \"shell\" || spec.kind === \"agent\") {\n try {\n snapshotBuffer = new HeadlessSnapshotBuffer({\n cols: spec.cols ?? 120,\n rows: spec.rows ?? 30,\n });\n } catch (err) {\n traceTerminal(id, \"snapshot.init.error\", {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n // Create active terminal\n const active = new ActiveTerminal(id, spec, pty, ringBuffer, snapshotBuffer);\n\n // Wire up PTY events\n this.wireEvents(active);\n\n // Store in memory and persist to database\n this.terminals.set(id, active);\n this.deps.db.insert(active.toRow());\n\n // Emit terminal.created DomainEvent\n const event: DomainEvent = {\n type: \"terminal.created\",\n workspaceId: spec.workspaceId,\n terminalId: id,\n kind: spec.kind,\n title: spec.title ?? \"\",\n cwd: spec.cwd,\n } satisfies DomainEvent;\n this.deps.eventBus.emit(event);\n\n return active.toDTO();\n }\n\n /**\n * Wire up PTY process events\n */\n private wireEvents(active: ActiveTerminal): void {\n const { pty, ringBuffer, spec, id } = active;\n\n // Handle PTY output\n pty.onData((data: string) => {\n const buffer = Buffer.from(data, \"utf-8\");\n const { seq } = ringBuffer.append(buffer);\n traceTerminal(id, \"pty.output\", {\n workspaceId: spec.workspaceId,\n seq,\n summary: summarizeTerminalData(buffer),\n });\n\n // Emit terminal.output DomainEvent\n const event: DomainEvent = {\n type: \"terminal.output\",\n workspaceId: spec.workspaceId,\n terminalId: id,\n chunk: buffer,\n seq,\n } satisfies DomainEvent;\n this.deps.eventBus.emit(event);\n\n if (active.snapshotBuffer && !active.snapshotBuffer.disabled) {\n try {\n active.snapshotBuffer.write(buffer, seq);\n } catch (err) {\n traceTerminal(id, \"snapshot.write.error\", {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n });\n\n // Handle PTY exit\n pty.onExit(({ exitCode }: { exitCode: number }) => {\n active.alive = false;\n active.exitCode = exitCode;\n\n // Emit terminal.exited DomainEvent\n const event: DomainEvent = {\n type: \"terminal.exited\",\n workspaceId: spec.workspaceId,\n terminalId: id,\n exitCode,\n } satisfies DomainEvent;\n this.deps.eventBus.emit(event);\n\n const explicitClose = this.explicitCloseWaiters.get(id);\n if (explicitClose) {\n void explicitClose.killCompleted.finally(() => {\n if (!explicitClose.finalized) {\n explicitClose.finalized = true;\n this.finalizeTerminal(active);\n }\n this.explicitCloseWaiters.delete(id);\n explicitClose.resolve();\n });\n } else {\n // Keep ActiveTerminal object for 1s to allow replay, then cleanup\n active.cleanupTimer = setTimeout(() => {\n this.finalizeTerminal(active);\n }, 1000);\n }\n\n // Mark as ended in database\n this.deps.db.markEnded(id, Date.now(), exitCode);\n });\n }\n\n private finalizeTerminal(active: ActiveTerminal): void {\n if (active.cleanupTimer) {\n clearTimeout(active.cleanupTimer);\n active.cleanupTimer = null;\n }\n active.snapshotBuffer?.dispose();\n this.terminals.delete(active.id);\n }\n\n /**\n * Write data to terminal\n */\n write(terminalId: TerminalId, bytes: Buffer): void {\n const terminal = this.terminals.get(terminalId);\n if (!terminal) {\n throw new Error(`Terminal not found: ${terminalId}`);\n }\n if (!terminal.alive) {\n throw new Error(\"Terminal is not alive\");\n }\n\n traceTerminal(terminalId, \"pty.write\", {\n summary: summarizeTerminalData(bytes),\n });\n terminal.pty.write(bytes);\n }\n\n /**\n * Resize terminal.\n *\n * Skips the syscall when cols/rows haven't changed. Every pty.resize()\n * delivers SIGWINCH to the child, and TUI apps (codex, claude) respond\n * with a full clear-screen + repaint. That redraw data floods the\n * StreamBuffer; under back-pressure the oldest frames (the clear-screen)\n * are dropped while the repaint frames survive, causing the frontend to\n * render repaint content without a preceding clear \u2014 visible as\n * duplicate content blocks.\n */\n resize(terminalId: TerminalId, cols: number, rows: number): void {\n const terminal = this.terminals.get(terminalId);\n if (!terminal || !terminal.alive) {\n return;\n }\n\n if (terminal.currentCols === cols && terminal.currentRows === rows) {\n traceTerminal(terminalId, \"pty.resize.skip\", { cols, rows });\n return;\n }\n\n traceTerminal(terminalId, \"pty.resize\", {\n prevCols: terminal.currentCols,\n prevRows: terminal.currentRows,\n cols,\n rows,\n });\n terminal.currentCols = cols;\n terminal.currentRows = rows;\n terminal.pty.resize(cols, rows);\n if (terminal.snapshotBuffer && !terminal.snapshotBuffer.disabled) {\n try {\n terminal.snapshotBuffer.resize(cols, rows);\n } catch (err) {\n traceTerminal(terminalId, \"snapshot.resize.error\", {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n }\n\n /**\n * Kill terminal process\n */\n kill(terminalId: TerminalId, signal: NodeJS.Signals = \"SIGTERM\"): void {\n const terminal = this.terminals.get(terminalId);\n if (terminal) {\n void terminal.pty.kill(signal);\n }\n }\n\n close(terminalId: TerminalId, signal: NodeJS.Signals = \"SIGTERM\"): Promise<void> {\n const terminal = this.terminals.get(terminalId);\n if (!terminal) {\n return Promise.resolve();\n }\n\n if (!terminal.alive) {\n const existing = this.explicitCloseWaiters.get(terminalId);\n if (existing) {\n if (!existing.finalized) {\n existing.finalized = true;\n this.finalizeTerminal(terminal);\n }\n return existing.promise;\n }\n\n this.finalizeTerminal(terminal);\n return Promise.resolve();\n }\n\n const existing = this.explicitCloseWaiters.get(terminalId);\n if (existing) {\n if (existing.signal !== signal) {\n terminal.pty.kill(signal);\n }\n return existing.promise;\n }\n\n let resolve = () => {};\n const promise = new Promise<void>((innerResolve) => {\n resolve = innerResolve;\n });\n let markKillCompleted = () => {};\n const killCompleted = new Promise<void>((innerResolve) => {\n markKillCompleted = innerResolve;\n });\n this.explicitCloseWaiters.set(terminalId, {\n signal,\n killCompleted,\n markKillCompleted,\n finalized: false,\n promise,\n resolve,\n });\n void terminal.pty.kill(signal).finally(() => {\n const waiter = this.explicitCloseWaiters.get(terminalId);\n if (!waiter) {\n return;\n }\n\n waiter.markKillCompleted();\n });\n return promise;\n }\n\n killForWorkspace(workspaceId: string, signal: NodeJS.Signals = \"SIGTERM\"): void {\n for (const terminal of this.terminals.values()) {\n if (terminal.spec.workspaceId !== workspaceId || !terminal.alive) {\n continue;\n }\n\n void terminal.pty.kill(signal);\n }\n }\n\n async closeForWorkspace(workspaceId: string, signal: NodeJS.Signals = \"SIGTERM\"): Promise<void> {\n const closes: Promise<void>[] = [];\n\n for (const terminal of this.terminals.values()) {\n if (terminal.spec.workspaceId !== workspaceId) {\n continue;\n }\n\n closes.push(this.close(terminal.id, signal));\n }\n\n await Promise.all(closes);\n }\n\n /**\n * Get active terminal by ID\n */\n get(terminalId: TerminalId): ActiveTerminal | undefined {\n return this.terminals.get(terminalId);\n }\n\n /**\n * Replay terminal output from a given sequence number\n */\n replay(terminalId: TerminalId, lastSeq: number): ReplayResult {\n const terminal = this.terminals.get(terminalId);\n if (terminal) {\n const result = terminal.ringBuffer.replayFrom(lastSeq);\n traceTerminal(terminalId, \"replay\", {\n lastSeq,\n status: result.status,\n seq: result.status === \"ok\" ? result.seq : undefined,\n size: result.status === \"ok\" ? result.data.byteLength : undefined,\n summary: result.status === \"ok\" ? summarizeTerminalData(result.data) : undefined,\n });\n return result;\n }\n\n return { status: \"unknown\" };\n }\n\n /**\n * Serialize the current terminal screen state for hard-refresh recovery.\n */\n async snapshot(terminalId: TerminalId): Promise<SnapshotResult> {\n const terminal = this.terminals.get(terminalId);\n if (!terminal || !terminal.snapshotBuffer) {\n return { status: \"unsupported\" };\n }\n\n if (terminal.snapshotBuffer.disabled) {\n return { status: \"unsupported\" };\n }\n\n try {\n const result = await terminal.snapshotBuffer.snapshot();\n return {\n status: \"ok\",\n data: result.data,\n seq: result.seq,\n cols: result.cols,\n rows: result.rows,\n };\n } catch (err) {\n traceTerminal(terminalId, \"snapshot.unsupported\", {\n error: err instanceof Error ? err.message : String(err),\n });\n return { status: \"unsupported\" };\n }\n }\n\n /**\n * Render the current terminal snapshot to plain text for supervisor use.\n */\n async getRenderedSnapshot(terminalId: TerminalId, options: RenderOptions): Promise<string> {\n const snapshot = await this.snapshot(terminalId);\n if (snapshot.status !== \"ok\") {\n return \"\";\n }\n\n return renderSnapshotToText(snapshot.data, options);\n }\n\n /**\n * Read the last N bytes of terminal output from the active ring buffer.\n */\n getRingBufferTail(terminalId: TerminalId, bytes: number): Buffer {\n const terminal = this.terminals.get(terminalId);\n if (terminal) {\n return terminal.ringBuffer.tail(bytes);\n }\n\n return Buffer.alloc(0);\n }\n\n /**\n * Get all active terminals\n */\n getAll(): ActiveTerminal[] {\n return Array.from(this.terminals.values());\n }\n\n /**\n * Clean up all terminals (for graceful shutdown)\n */\n shutdown(): void {\n for (const waiter of this.explicitCloseWaiters.values()) {\n waiter.resolve();\n }\n this.explicitCloseWaiters.clear();\n\n for (const terminal of this.terminals.values()) {\n if (terminal.alive) {\n void terminal.pty.kill(\"SIGTERM\");\n }\n this.finalizeTerminal(terminal);\n }\n this.terminals.clear();\n }\n}\n", "/**\n * Workspace path validation and permission checks.\n */\n\nimport { constants } from \"fs\";\nimport { access, stat } from \"fs/promises\";\n\nexport interface ValidationResult {\n valid: boolean;\n error?: string;\n}\n\n/**\n * Validates that a path exists, is a directory, and is readable/writable.\n */\nexport async function validatePath(path: string): Promise<ValidationResult> {\n try {\n // Check if path exists\n const stats = await stat(path);\n\n // Check if it's a directory\n if (!stats.isDirectory()) {\n return { valid: false, error: \"Path is not a directory\" };\n }\n\n // Check read permissions\n await access(path, constants.R_OK);\n\n // Check write permissions\n await access(path, constants.W_OK);\n\n return { valid: true };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return { valid: false, error: \"Path does not exist\" };\n }\n if ((error as NodeJS.ErrnoException).code === \"EACCES\") {\n return { valid: false, error: \"Permission denied\" };\n }\n return { valid: false, error: `Validation failed: ${(error as Error).message}` };\n }\n}\n\n/**\n * Validates workspace path with detailed error messages.\n */\nexport class WorkspaceValidator {\n async validate(path: string): Promise<void> {\n const result = await validatePath(path);\n\n if (!result.valid) {\n throw new Error(`Invalid workspace path: ${result.error}`);\n }\n }\n}\n", "/**\n * .gitignore parser and filter using the 'ignore' library.\n */\n\nimport { existsSync, readFileSync } from \"fs\";\nimport ignore from \"ignore\";\nimport { join, relative } from \"path\";\n\nconst DEFAULT_WATCHER_IGNORED_PATTERNS: RegExp[] = [\n /(^|\\/)node_modules(\\/|$)/,\n /\\.DS_Store/,\n /Thumbs\\.db/,\n /(^|\\/)\\.playwright-mcp(\\/|$)/,\n];\n\nfunction normalizePath(path: string): string {\n return path.replace(/\\\\/g, \"/\");\n}\n\nfunction relativeToRoot(rootPath: string, path: string): string {\n return normalizePath(relative(rootPath, path));\n}\n\nfunction isDefaultTreeIgnored(name: string): boolean {\n return name.startsWith(\".\") || name === \"node_modules\" || name === \".git\";\n}\n\nfunction isTreeHidden(name: string): boolean {\n return name === \".git\";\n}\n\nfunction isAlwaysTreeIgnored(name: string): boolean {\n return name === \"node_modules\" || name === \".git\";\n}\n\nfunction isIgnoredByGitignore(ig: ReturnType<typeof ignore>, path: string): boolean {\n if (!path || path.startsWith(\"..\")) {\n return false;\n }\n return ig.ignores(path) || ig.ignores(`${path}/`);\n}\n\n/**\n * Creates a filter function that respects .gitignore rules for a given directory.\n * Returns false if the entry should be skipped (ignored), true if it should be included.\n *\n * @param rootPath - Workspace root path (for .gitignore resolution)\n * @param dirPath - Current directory being read\n * @returns Filter function: (name: string) => boolean\n */\nexport function createGitignoreFilter(\n rootPath: string,\n dirPath: string\n): (name: string) => boolean {\n const gitignorePath = join(rootPath, \".gitignore\");\n\n if (!existsSync(gitignorePath)) {\n // No .gitignore: default to skipping dotfiles, node_modules, .git\n return (name: string) => !isDefaultTreeIgnored(name);\n }\n\n const gitignoreContent = readFileSync(gitignorePath, \"utf-8\");\n const ig = ignore().add(gitignoreContent);\n\n return (name: string) => {\n if (isAlwaysTreeIgnored(name)) {\n return false;\n }\n\n const relativePath = relativeToRoot(rootPath, join(dirPath, name));\n return !isIgnoredByGitignore(ig, relativePath);\n };\n}\n\n/**\n * Creates a filter for directory tree visibility.\n * Returns false if the entry should be hidden from the tree, true otherwise.\n */\nexport function createTreeVisibilityFilter(): (name: string) => boolean {\n return (name: string) => !isTreeHidden(name);\n}\n\n/**\n * Creates a filter for the file watcher (chokidar).\n * Returns a function suitable for chokidar's `ignored` option.\n */\nexport function createWatcherIgnoreFilter(rootPath: string): (path: string) => boolean {\n const gitignorePath = join(rootPath, \".gitignore\");\n\n if (!existsSync(gitignorePath)) {\n // Default: ignore obvious noise, but keep .git metadata watched so git\n // operations can trigger refreshes.\n return (path: string) =>\n DEFAULT_WATCHER_IGNORED_PATTERNS.some((p) => p.test(normalizePath(path)));\n }\n\n const gitignoreContent = readFileSync(gitignorePath, \"utf-8\");\n const ig = ignore().add(gitignoreContent);\n\n return (path: string) => {\n const normalizedPath = normalizePath(path);\n if (DEFAULT_WATCHER_IGNORED_PATTERNS.some((p) => p.test(normalizedPath))) {\n return true;\n }\n\n const relativePath = relativeToRoot(rootPath, path);\n return isIgnoredByGitignore(ig, relativePath);\n };\n}\n", "/**\n * WorkspaceWatcher - File system watcher with throttled dirty signal.\n * Uses .gitignore for ignore rules.\n */\n\nimport { Topics } from \"@coder-studio/core\";\nimport type { FSWatcher } from \"chokidar\";\nimport chokidar from \"chokidar\";\nimport { createWatcherIgnoreFilter } from \"./gitignore.js\";\n\nexport interface Broadcaster {\n broadcast(topic: string, data: unknown): void;\n}\n\n/**\n * Watches a workspace directory for file changes and broadcasts dirty signals.\n * Uses standard debounce (200ms) with a 1-second max wait to avoid starvation\n * during continuous file activity.\n */\nexport class WorkspaceWatcher {\n private chokidar: FSWatcher;\n private dirtyTimer: NodeJS.Timeout | null = null;\n private firstDirtyTime: number | null = null;\n private pendingReason: \"fs_change\" | \"git_metadata\" | null = null;\n private pendingWorktreeChanged = false;\n private readonly DEBOUNCE_MS = 200;\n private readonly MAX_WAIT_MS = 1_000;\n\n constructor(\n private workspaceId: string,\n rootPath: string,\n private broadcaster?: Broadcaster\n ) {\n const shouldIgnore = createWatcherIgnoreFilter(rootPath);\n\n this.chokidar = chokidar.watch(rootPath, {\n ignored: shouldIgnore,\n ignoreInitial: true,\n persistent: true,\n });\n\n this.chokidar.on(\"all\", (_eventName, changedPath) => this.markDirty(changedPath));\n }\n\n /**\n * Standard debounce with max wait to avoid starvation.\n * Each file change resets the timer by 200ms. If changes\n * continue for over 1s, forces a broadcast anyway.\n */\n private markDirty(changedPath?: string): void {\n const now = Date.now();\n if (this.firstDirtyTime === null) {\n this.firstDirtyTime = now;\n }\n\n if (changedPath && this.isWorktreeMetadataPath(changedPath)) {\n this.pendingWorktreeChanged = true;\n }\n\n if (changedPath && !this.isGitMetadataPath(changedPath)) {\n this.pendingReason = \"fs_change\";\n } else if (changedPath && this.pendingReason !== \"fs_change\") {\n this.pendingReason = \"git_metadata\";\n } else if (this.pendingReason === null) {\n this.pendingReason = \"fs_change\";\n }\n\n const elapsed = now - this.firstDirtyTime;\n const delay = Math.min(this.DEBOUNCE_MS, Math.max(0, this.MAX_WAIT_MS - elapsed));\n\n if (this.dirtyTimer) {\n clearTimeout(this.dirtyTimer);\n }\n\n this.dirtyTimer = setTimeout(() => this.flushDirty(), delay);\n }\n\n private flushDirty(): void {\n this.broadcaster?.broadcast(Topics.workspaceFsDirty(this.workspaceId), {\n reason: this.pendingReason ?? \"fs_change\",\n });\n if (this.pendingWorktreeChanged) {\n this.broadcaster?.broadcast(Topics.workspaceGitState(this.workspaceId), {\n worktreeChanged: true,\n });\n }\n this.dirtyTimer = null;\n this.firstDirtyTime = null;\n this.pendingReason = null;\n this.pendingWorktreeChanged = false;\n }\n\n private isGitMetadataPath(changedPath: string): boolean {\n return changedPath.replace(/\\\\/g, \"/\").includes(\"/.git/\");\n }\n\n private isWorktreeMetadataPath(changedPath: string): boolean {\n const normalized = changedPath.replace(/\\\\/g, \"/\");\n return normalized.includes(\"/.git/worktrees\");\n }\n\n /**\n * Stops watching and cleans up resources.\n */\n async close(): Promise<void> {\n if (this.dirtyTimer) {\n clearTimeout(this.dirtyTimer);\n this.dirtyTimer = null;\n }\n await this.chokidar.close();\n }\n}\n", "/**\n * WorkspaceManager - Manages workspace lifecycle (open/close/list).\n */\n\nimport type { DomainEvent, Workspace } from \"@coder-studio/core\";\nimport type { Database } from \"../storage/database.js\";\nimport { WorkspaceValidator } from \"./validator.js\";\n\nexport interface OpenWorkspaceRequest {\n path: string;\n wslDistro?: string;\n}\n\nexport interface EventBus {\n emit(event: DomainEvent): void;\n on(type: DomainEvent[\"type\"], handler: (event: DomainEvent) => void): () => void;\n}\n\nexport interface AutoFetchRuntime {\n triggerOpenTimeFetch(workspaceId: string): void;\n recordSuccess(workspaceId: string): void;\n getLastFetchAt(workspaceId: string): number | undefined;\n}\n\nexport interface WorkspaceManagerDeps {\n db: Database;\n eventBus: EventBus;\n broadcaster?: Broadcaster;\n autoFetch?: AutoFetchRuntime;\n teardown?: (workspaceId: string) => void | Promise<void>;\n onClose?: (workspaceId: string) => void | Promise<void>;\n}\n\n/**\n * Generates a unique workspace ID.\n */\nfunction generateWorkspaceId(): string {\n return `ws_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;\n}\n\n/**\n * WorkspaceManager handles workspace lifecycle operations.\n * It validates paths, checks runtime requirements, persists to DB,\n * and broadcasts metadata changes via EventBus.\n */\nexport class WorkspaceManager {\n private validator = new WorkspaceValidator();\n private watchers = new Map<string, WorkspaceWatcher>();\n\n constructor(private deps: WorkspaceManagerDeps) {}\n\n private startWatcher(workspaceId: string, rootPath: string): void {\n if (!this.deps.broadcaster || this.watchers.has(workspaceId)) {\n return;\n }\n\n this.watchers.set(\n workspaceId,\n new WorkspaceWatcher(workspaceId, rootPath, this.deps.broadcaster)\n );\n }\n\n hydrateWatchers(): void {\n for (const workspace of this.list()) {\n this.startWatcher(workspace.id, workspace.path);\n }\n }\n\n updateUiState(workspaceId: string, uiState: Workspace[\"uiState\"]): void {\n const workspace = this.get(workspaceId);\n if (!workspace) {\n throw new Error(`Workspace not found: ${workspaceId}`);\n }\n\n this.deps.db\n .prepare(\"UPDATE workspaces SET ui_state = ? WHERE id = ?\")\n .run(JSON.stringify(uiState), workspaceId);\n\n this.deps.eventBus.emit({\n type: \"workspace.meta.changed\",\n workspaceId,\n patch: { uiState },\n });\n }\n\n /**\n * Opens a new workspace.\n *\n * 1. Validates path exists and is accessible\n * 2. Checks if workspace already exists for this path\n * 3. Persists workspace to database (or returns existing)\n * 4. Emits metadata change event\n *\n * @param req - Open workspace request\n * @returns Created or existing workspace\n */\n async open(req: OpenWorkspaceRequest): Promise<Workspace> {\n // 1. Validate path\n await this.validator.validate(req.path);\n\n // 2. Check if workspace already exists for this path\n const existing = this.getByPath(req.path);\n if (existing) {\n // Update last active timestamp and return existing\n this.touch(existing.id);\n\n // Start watcher if not already watching (e.g., after server restart)\n this.startWatcher(existing.id, existing.path);\n\n this.deps.eventBus.emit({\n type: \"workspace.meta.changed\",\n workspaceId: existing.id,\n patch: { lastActiveAt: Date.now() },\n });\n this.deps.autoFetch?.triggerOpenTimeFetch(existing.id);\n return existing;\n }\n\n // 3. Persist to DB\n const workspace: Workspace = {\n id: generateWorkspaceId(),\n path: req.path,\n targetRuntime: \"native\",\n wslDistro: req.wslDistro,\n openedAt: Date.now(),\n lastActiveAt: Date.now(),\n uiState: {\n leftPanelWidth: 250,\n bottomPanelHeight: 200,\n focusMode: false,\n paneLayout: {\n id: \"root\",\n type: \"leaf\",\n },\n },\n };\n\n this.deps.db\n .prepare(\n `INSERT INTO workspaces (id, path, target_runtime, wsl_distro, opened_at, last_active_at, ui_state)\n VALUES (?, ?, ?, ?, ?, ?, ?)`\n )\n .run(\n workspace.id,\n workspace.path,\n \"native\",\n workspace.wslDistro ?? null,\n workspace.openedAt,\n workspace.lastActiveAt,\n JSON.stringify(workspace.uiState)\n );\n\n // 3. Emit event\n this.deps.eventBus.emit({\n type: \"workspace.meta.changed\",\n workspaceId: workspace.id,\n patch: workspace,\n });\n\n // Start file system watcher\n this.startWatcher(workspace.id, workspace.path);\n this.deps.autoFetch?.triggerOpenTimeFetch(workspace.id);\n\n return workspace;\n }\n\n /**\n * Closes a workspace.\n *\n * @param workspaceId - Workspace ID to close\n */\n async close(workspaceId: string): Promise<void> {\n const workspace = this.get(workspaceId);\n if (!workspace) {\n throw new Error(`Workspace not found: ${workspaceId}`);\n }\n\n // Stop file system watcher\n const watcher = this.watchers.get(workspaceId);\n if (watcher) {\n await watcher.close();\n this.watchers.delete(workspaceId);\n }\n\n if (this.deps.teardown) {\n await this.deps.teardown(workspaceId);\n }\n\n // Delete from DB (cascade deletes terminals and sessions)\n this.deps.db.prepare(\"DELETE FROM workspaces WHERE id = ?\").run(workspaceId);\n\n if (this.deps.onClose) {\n try {\n await this.deps.onClose(workspaceId);\n } catch (err) {\n console.warn(\"[workspace] onClose hook failed:\", err);\n }\n }\n\n // Emit event\n this.deps.eventBus.emit({\n type: \"workspace.meta.changed\",\n workspaceId: workspaceId,\n patch: { lastActiveAt: Date.now() },\n });\n }\n\n /**\n * Lists all open workspaces.\n *\n * @returns Array of workspaces\n */\n list(): Workspace[] {\n const rows = this.deps.db\n .prepare(\n `SELECT id, path, target_runtime, wsl_distro, opened_at, last_active_at, ui_state\n FROM workspaces\n ORDER BY last_active_at DESC`\n )\n .all() as Array<{\n id: string;\n path: string;\n target_runtime: string;\n wsl_distro: string | null;\n opened_at: number;\n last_active_at: number;\n ui_state: string;\n }>;\n\n return rows.map((row) => ({\n id: row.id,\n path: row.path,\n targetRuntime: row.target_runtime as \"native\" | \"wsl\",\n wslDistro: row.wsl_distro ?? undefined,\n openedAt: row.opened_at,\n lastActiveAt: row.last_active_at,\n uiState: JSON.parse(row.ui_state),\n }));\n }\n\n /**\n * Gets a single workspace by ID.\n *\n * @param workspaceId - Workspace ID\n * @returns Workspace or undefined\n */\n get(workspaceId: string): Workspace | undefined {\n const row = this.deps.db\n .prepare(\n `SELECT id, path, target_runtime, wsl_distro, opened_at, last_active_at, ui_state\n FROM workspaces\n WHERE id = ?`\n )\n .get(workspaceId) as\n | {\n id: string;\n path: string;\n target_runtime: string;\n wsl_distro: string | null;\n opened_at: number;\n last_active_at: number;\n ui_state: string;\n }\n | undefined;\n\n if (!row) return undefined;\n\n return {\n id: row.id,\n path: row.path,\n targetRuntime: row.target_runtime as \"native\" | \"wsl\",\n wslDistro: row.wsl_distro ?? undefined,\n openedAt: row.opened_at,\n lastActiveAt: row.last_active_at,\n uiState: JSON.parse(row.ui_state),\n };\n }\n\n /**\n * Gets a workspace by path.\n *\n * @param path - Workspace path\n * @returns Workspace or undefined\n */\n getByPath(path: string): Workspace | undefined {\n const row = this.deps.db\n .prepare(\n `SELECT id, path, target_runtime, wsl_distro, opened_at, last_active_at, ui_state\n FROM workspaces\n WHERE path = ?`\n )\n .get(path) as\n | {\n id: string;\n path: string;\n target_runtime: string;\n wsl_distro: string | null;\n opened_at: number;\n last_active_at: number;\n ui_state: string;\n }\n | undefined;\n\n if (!row) return undefined;\n\n return {\n id: row.id,\n path: row.path,\n targetRuntime: row.target_runtime as \"native\" | \"wsl\",\n wslDistro: row.wsl_distro ?? undefined,\n openedAt: row.opened_at,\n lastActiveAt: row.last_active_at,\n uiState: JSON.parse(row.ui_state),\n };\n }\n\n /**\n * Updates workspace last active timestamp.\n *\n * @param workspaceId - Workspace ID\n */\n touch(workspaceId: string): void {\n const now = Date.now();\n this.deps.db\n .prepare(\"UPDATE workspaces SET last_active_at = ? WHERE id = ?\")\n .run(now, workspaceId);\n }\n\n recordFetch(workspaceId: string): void {\n this.deps.autoFetch?.recordSuccess(workspaceId);\n }\n}\n\nimport { WorkspaceWatcher } from \"../fs/watcher.js\";\n\nexport interface Broadcaster {\n broadcast(topic: string, data: unknown): void;\n}\n", "import type { FastifyRequest } from \"fastify\";\n\nexport interface ActivationLease {\n clientInstanceId: string;\n wsClientId: string;\n generation: number;\n issuedAt: number;\n graceUntil: number | null;\n ip: string;\n userAgent: string;\n}\n\nexport interface ActivationClaimResult {\n active: true;\n generation: number;\n recoveryMode: \"fresh\" | \"grace_recover\" | \"takeover\";\n displacedWsClientId: string | null;\n}\n\nexport interface ActivationManagerOptions {\n graceMs: number;\n}\n\nconst DEFAULT_OPTIONS: ActivationManagerOptions = {\n graceMs: 3_000,\n};\n\nexport class ActivationManager {\n private readonly options: ActivationManagerOptions;\n private lease: ActivationLease | null = null;\n private generation = 0;\n\n constructor(options?: Partial<ActivationManagerOptions>) {\n this.options = { ...DEFAULT_OPTIONS, ...options };\n }\n\n claim(\n clientInstanceId: string,\n wsClientId: string,\n request: FastifyRequest\n ): ActivationClaimResult {\n const now = Date.now();\n const activeLease = this.getLease();\n\n if (activeLease && activeLease.clientInstanceId === clientInstanceId) {\n const isGraceRecovery = activeLease.graceUntil !== null && now <= activeLease.graceUntil;\n const displacedWsClientId =\n isGraceRecovery || activeLease.wsClientId === wsClientId ? null : activeLease.wsClientId;\n\n activeLease.wsClientId = wsClientId;\n activeLease.graceUntil = null;\n\n return {\n active: true,\n generation: activeLease.generation,\n recoveryMode: \"grace_recover\",\n displacedWsClientId,\n };\n }\n\n const displacedWsClientId =\n activeLease && activeLease.clientInstanceId !== clientInstanceId\n ? activeLease.wsClientId\n : null;\n const recoveryMode = displacedWsClientId === null ? \"fresh\" : \"takeover\";\n\n this.generation += 1;\n this.lease = {\n clientInstanceId,\n wsClientId,\n generation: this.generation,\n issuedAt: now,\n graceUntil: null,\n ip: request.ip,\n userAgent: request.headers[\"user-agent\"] ?? \"\",\n };\n\n return {\n active: true,\n generation: this.lease.generation,\n recoveryMode,\n displacedWsClientId,\n };\n }\n\n release(clientInstanceId: string, generation: number): void {\n const lease = this.getLease();\n if (!lease) {\n return;\n }\n\n if (lease.clientInstanceId !== clientInstanceId || lease.generation !== generation) {\n return;\n }\n\n this.lease = null;\n }\n\n onSocketClosed(wsClientId: string): void {\n const lease = this.getLease();\n if (!lease || lease.wsClientId !== wsClientId) {\n return;\n }\n\n lease.graceUntil = Date.now() + this.options.graceMs;\n }\n\n getLease(): ActivationLease | null {\n if (!this.lease) {\n return null;\n }\n\n return this.lease;\n }\n}\n", "/**\n * Command Dispatch\n *\n * Routes commands to handlers and validates input\n */\n\nimport type { Command, ProviderDefinition, Result } from \"@coder-studio/core\";\nimport { z } from \"zod\";\nimport type { EventBus } from \"../bus/event-bus.js\";\nimport type { AutoFetchRuntime } from \"../git/auto-fetch.js\";\nimport type { ProviderInstallManager } from \"../provider-runtime/install-manager.js\";\nimport type { RuntimeStatusDeps } from \"../provider-runtime/runtime-status.js\";\nimport type { SessionManager } from \"../session/manager.js\";\nimport type { Database } from \"../storage/database.js\";\nimport type { SupervisorManager } from \"../supervisor/manager.js\";\nimport type { TerminalManager } from \"../terminal/manager.js\";\nimport type { WorkspaceManager } from \"../workspace/manager.js\";\nimport type { ActivationManager } from \"./activation.js\";\nimport type { FencingManager } from \"./fencing.js\";\nimport type { Broadcaster } from \"./hub.js\";\n\n/**\n * Command context - injected dependencies for handlers\n */\nexport interface CommandContext {\n workspaceMgr: WorkspaceManager;\n sessionMgr: SessionManager;\n terminalMgr: TerminalManager;\n eventBus: EventBus;\n broadcaster: Broadcaster;\n db: Database;\n providerRegistry: ProviderDefinition[];\n fencingMgr: FencingManager;\n supervisorMgr: SupervisorManager;\n autoFetch: AutoFetchRuntime;\n providerRuntimeDeps?: RuntimeStatusDeps;\n providerInstallMgr?: ProviderInstallManager;\n activationMgr: ActivationManager;\n}\n\n/**\n * Command handler type\n */\nexport type CommandHandler<A = unknown, R = unknown> = (\n args: A,\n ctx: CommandContext,\n clientId?: string\n) => Promise<R>;\n\ntype CommandSchema = z.ZodTypeAny;\n\n/**\n * Registry of all command handlers\n */\nconst handlers = new Map<string, CommandHandler>();\n\n/**\n * Registry of all command schemas\n */\nconst schemas = new Map<string, CommandSchema>();\nconst ACTIVATION_ALLOWLIST = new Set([\n \"activation.claim\",\n \"activation.release\",\n \"connection.probe\",\n]);\n\n/**\n * Register a command handler\n */\nexport function registerCommand<S extends CommandSchema, R>(\n op: string,\n schema: S,\n handler: CommandHandler<z.output<S>, R>\n): void {\n handlers.set(op, handler as CommandHandler);\n schemas.set(op, schema);\n}\n\n/**\n * Dispatch a command to its handler\n */\nexport async function dispatch(\n msg: Command,\n ctx: CommandContext,\n clientId?: string\n): Promise<Result> {\n const isWsDispatch =\n clientId !== undefined && typeof ctx.broadcaster.getRequestMetadata === \"function\";\n\n if (isWsDispatch && !ACTIVATION_ALLOWLIST.has(msg.op)) {\n const active = ctx.activationMgr.getLease();\n if (!active || active.wsClientId !== clientId) {\n return {\n kind: \"result\",\n id: msg.id,\n ok: false,\n error: {\n code: \"activation_required\",\n message: \"This tab is no longer the active session\",\n },\n };\n }\n }\n\n const handler = handlers.get(msg.op);\n\n if (!handler) {\n return {\n kind: \"result\",\n id: msg.id,\n ok: false,\n error: {\n code: \"unknown_op\",\n message: `Unknown operation: ${msg.op}`,\n },\n };\n }\n\n try {\n const schema = schemas.get(msg.op);\n let args = msg.args;\n\n if (schema) {\n args = schema.parse(msg.args);\n }\n\n const data = await handler(args, ctx, clientId);\n\n return {\n kind: \"result\",\n id: msg.id,\n ok: true,\n data,\n };\n } catch (error: unknown) {\n const normalizedError = normalizeError(error);\n\n return {\n kind: \"result\",\n id: msg.id,\n ok: false,\n error: normalizedError,\n };\n }\n}\n\n/**\n * Normalize error to protocol format\n */\nfunction normalizeError(error: unknown): Result[\"error\"] {\n const candidate = error as {\n name?: string;\n code?: string;\n message?: string;\n details?: unknown;\n errors?: unknown;\n };\n\n if (candidate.name === \"ZodError\") {\n return {\n code: \"validation_error\",\n message: \"Invalid arguments\",\n details: candidate.errors,\n };\n }\n\n if (candidate.code) {\n return {\n code: candidate.code,\n message: candidate.message ?? String(candidate.code),\n details: candidate.details,\n };\n }\n\n return {\n code: \"internal_error\",\n message: candidate.message || \"An internal error occurred\",\n };\n}\n\n/**\n * Get all registered commands\n */\nexport function getRegisteredCommands(): string[] {\n return Array.from(handlers.keys());\n}\n", "/**\n * Fencing Token Management (Phase 3)\n *\n * Implements Controller/Observer model for multi-tab concurrency.\n * Only one tab can be the Controller with write access.\n */\n\nimport type { FastifyRequest } from \"fastify\";\n\nexport interface FencingToken {\n /** Unique client ID */\n clientId: string;\n /** Tab/session identifier */\n tabId: string;\n /** When the token was issued */\n issuedAt: number;\n /** Token expiration time */\n expiresAt: number;\n /** Client IP address */\n ip: string;\n /** User agent string */\n userAgent: string;\n}\n\nexport interface FencingManagerOptions {\n /** Heartbeat interval for visible tabs (ms) */\n visibleHeartbeatMs: number;\n /** Heartbeat interval for hidden tabs (ms) */\n hiddenHeartbeatMs: number;\n /** Token expiration time (ms) */\n tokenExpirationMs: number;\n /** Grace period for tab refresh (ms) */\n refreshGraceMs: number;\n}\n\nconst DEFAULT_OPTIONS: FencingManagerOptions = {\n visibleHeartbeatMs: 10000, // 10 seconds\n hiddenHeartbeatMs: 20000, // 20 seconds\n tokenExpirationMs: 30000, // 30 seconds\n refreshGraceMs: 3000, // 3 seconds\n};\n\n/**\n * Manages fencing tokens for workspace write access.\n */\nexport class FencingManager {\n private options: FencingManagerOptions;\n // workspaceId -> FencingToken\n private tokens = new Map<string, FencingToken>();\n // clientId -> last heartbeat timestamp\n private heartbeats = new Map<string, number>();\n // workspaceId -> { clientId, closedAt, ip, ua } (for grace period)\n private lastWriter = new Map<\n string,\n {\n clientId: string;\n closedAt: number;\n ip: string;\n userAgent: string;\n }\n >();\n\n constructor(options?: Partial<FencingManagerOptions>) {\n this.options = { ...DEFAULT_OPTIONS, ...options };\n }\n\n /**\n * Request controller status for a workspace.\n * Returns whether this client is now the controller.\n */\n requestControl(\n workspaceId: string,\n clientId: string,\n tabId: string,\n request: FastifyRequest\n ): { isController: boolean; reason?: string } {\n const now = Date.now();\n const ip = request.ip;\n const userAgent = request.headers[\"user-agent\"] ?? \"\";\n\n // Check if there's an existing controller\n const existing = this.tokens.get(workspaceId);\n\n if (existing) {\n // Check if existing token is expired\n if (now > existing.expiresAt) {\n // Token expired, take over\n this.tokens.delete(workspaceId);\n } else if (existing.clientId === clientId) {\n // Same client, refresh token\n return this.issueToken(workspaceId, clientId, tabId, ip, userAgent);\n } else {\n // Another client is controller\n return {\n isController: false,\n reason: \"another_tab_active\",\n };\n }\n }\n\n // Check grace period for tab refresh\n const lastWriter = this.lastWriter.get(workspaceId);\n if (lastWriter && now - lastWriter.closedAt < this.options.refreshGraceMs) {\n if (lastWriter.ip === ip && lastWriter.userAgent === userAgent) {\n // Same origin refresh, grant control\n return this.issueToken(workspaceId, clientId, tabId, ip, userAgent);\n }\n }\n\n // No existing controller, become one\n return this.issueToken(workspaceId, clientId, tabId, ip, userAgent);\n }\n\n /**\n * Record a heartbeat from a controller.\n */\n heartbeat(workspaceId: string, clientId: string): boolean {\n const token = this.tokens.get(workspaceId);\n if (!token || token.clientId !== clientId) {\n return false;\n }\n\n // Update heartbeat timestamp\n this.heartbeats.set(clientId, Date.now());\n\n // Extend token expiration\n token.expiresAt = Date.now() + this.options.tokenExpirationMs;\n\n return true;\n }\n\n /**\n * Release controller status.\n */\n release(workspaceId: string, clientId: string): void {\n const token = this.tokens.get(workspaceId);\n if (token && token.clientId === clientId) {\n // Store last writer info for grace period\n this.lastWriter.set(workspaceId, {\n clientId: token.clientId,\n closedAt: Date.now(),\n ip: token.ip,\n userAgent: token.userAgent,\n });\n\n this.tokens.delete(workspaceId);\n this.heartbeats.delete(clientId);\n }\n }\n\n /**\n * Check if a client is the current controller.\n */\n isController(workspaceId: string, clientId: string): boolean {\n const token = this.tokens.get(workspaceId);\n return token?.clientId === clientId;\n }\n\n /**\n * Get the current controller info for a workspace.\n */\n getController(workspaceId: string): FencingToken | undefined {\n const token = this.tokens.get(workspaceId);\n if (token && Date.now() <= token.expiresAt) {\n return token;\n }\n return undefined;\n }\n\n /**\n * Check if controller is unresponsive (no heartbeat).\n */\n isControllerUnresponsive(workspaceId: string): boolean {\n const token = this.tokens.get(workspaceId);\n if (!token) {\n return true;\n }\n\n const lastHeartbeat = this.heartbeats.get(token.clientId);\n if (!lastHeartbeat) {\n return true;\n }\n\n // Consider unresponsive if no heartbeat for 2x the visible heartbeat interval\n const unresponsiveThreshold = this.options.visibleHeartbeatMs * 2;\n return Date.now() - lastHeartbeat > unresponsiveThreshold;\n }\n\n /**\n * Force takeover of controller status.\n * Used when controller is unresponsive.\n */\n forceTakeover(\n workspaceId: string,\n clientId: string,\n tabId: string,\n request: FastifyRequest\n ): { success: boolean; reason?: string } {\n if (!this.isControllerUnresponsive(workspaceId)) {\n return {\n success: false,\n reason: \"controller_responsive\",\n };\n }\n\n // Clear existing token\n this.tokens.delete(workspaceId);\n\n // Issue new token\n const ip = request.ip;\n const userAgent = request.headers[\"user-agent\"] ?? \"\";\n const result = this.issueToken(workspaceId, clientId, tabId, ip, userAgent);\n\n return { success: result.isController };\n }\n\n /**\n * Issue a new fencing token.\n */\n private issueToken(\n workspaceId: string,\n clientId: string,\n tabId: string,\n ip: string,\n userAgent: string\n ): { isController: boolean } {\n const now = Date.now();\n\n const token: FencingToken = {\n clientId,\n tabId,\n issuedAt: now,\n expiresAt: now + this.options.tokenExpirationMs,\n ip,\n userAgent,\n };\n\n this.tokens.set(workspaceId, token);\n this.heartbeats.set(clientId, now);\n\n // Clear last writer info\n this.lastWriter.delete(workspaceId);\n\n return { isController: true };\n }\n\n /**\n * Clean up expired tokens.\n */\n cleanup(): void {\n const now = Date.now();\n\n for (const [workspaceId, token] of this.tokens) {\n if (now > token.expiresAt) {\n this.tokens.delete(workspaceId);\n this.heartbeats.delete(token.clientId);\n }\n }\n\n // Clean up old last writer records (older than grace period * 2)\n const graceCutoff = now - this.options.refreshGraceMs * 2;\n for (const [workspaceId, lastWriter] of this.lastWriter) {\n if (lastWriter.closedAt < graceCutoff) {\n this.lastWriter.delete(workspaceId);\n }\n }\n }\n}\n", "/**\n * Terminal Commands\n */\n\nimport { basename } from \"node:path\";\nimport {\n encodeTerminalBinaryFrame,\n TERMINAL_BINARY_PROTOCOL_VERSION,\n TERMINAL_INPUT_ACTIVITIES,\n TerminalBinaryFrameType,\n type TerminalInputActivity,\n TerminalInputBase64Args,\n TerminalInputBinaryArgs,\n TerminalSnapshotBinaryResult,\n} from \"@coder-studio/core\";\nimport { z } from \"zod\";\nimport { registerCommand } from \"../ws/dispatch.js\";\n\nconst TerminalInputActivitySchema = z.enum(TERMINAL_INPUT_ACTIVITIES).optional();\n\nconst TerminalInputSchema = z.union([\n z.object({\n terminalId: z.string(),\n bytes: z.string(),\n activity: TerminalInputActivitySchema,\n submittedText: z.string().optional(),\n }),\n z.object({\n terminalId: z.string(),\n transport: z.literal(\"binary\"),\n streamId: z.number().int().nonnegative(),\n size: z.number().int().nonnegative(),\n activity: TerminalInputActivitySchema,\n submittedText: z.string().optional(),\n }),\n]);\n\nconst pendingTerminalInput = new Map<number, { args: TerminalInputBinaryArgs; payload: Buffer }>();\nlet nextOutboundBinaryStreamId = 0;\n\nfunction decodeTerminalInput(args: TerminalInputBase64Args | TerminalInputBinaryArgs): Buffer {\n if (\"bytes\" in args) {\n return Buffer.from(args.bytes, \"base64\");\n }\n\n const pending = pendingTerminalInput.get(args.streamId);\n if (!pending) {\n throw {\n code: \"terminal_input_binary_missing\",\n message: \"Missing binary terminal input payload\",\n };\n }\n pendingTerminalInput.delete(args.streamId);\n return pending.payload;\n}\n\nfunction normalizeTerminalInputActivity(\n activity: TerminalInputActivity | undefined\n): TerminalInputActivity | undefined {\n return activity;\n}\n\nexport function registerPendingTerminalInput(args: TerminalInputBinaryArgs, payload: Buffer): void {\n pendingTerminalInput.set(args.streamId, { args, payload });\n}\n\nexport function clearPendingTerminalInput(streamId: number): void {\n pendingTerminalInput.delete(streamId);\n}\n\nfunction allocateOutboundBinaryStreamId(): number {\n nextOutboundBinaryStreamId = (nextOutboundBinaryStreamId + 1) >>> 0;\n return nextOutboundBinaryStreamId;\n}\n\nfunction sendTerminalBinaryFrame(\n clientId: string | undefined,\n ctx: Parameters<typeof registerCommand>[2] extends (\n args: unknown,\n ctx: infer T,\n clientId?: string\n ) => Promise<unknown>\n ? T\n : never,\n frame: {\n type: (typeof TerminalBinaryFrameType)[keyof typeof TerminalBinaryFrameType];\n meta: number;\n streamId: number;\n payload: Buffer;\n }\n): void {\n if (!clientId) {\n return;\n }\n\n ctx.broadcaster.sendBinaryToClient(\n clientId,\n Buffer.from(\n encodeTerminalBinaryFrame(\n {\n version: TERMINAL_BINARY_PROTOCOL_VERSION,\n type: frame.type,\n flags: 0,\n meta: frame.meta,\n streamId: frame.streamId,\n payloadSize: frame.payload.length,\n },\n frame.payload\n )\n )\n );\n}\n\nfunction resolveShellCommand(): { argv: string[]; title: string } {\n if (process.platform === \"win32\") {\n const shellPath = process.env.ComSpec || process.env.COMSPEC || \"cmd.exe\";\n return {\n argv: [shellPath],\n title: basename(shellPath) || shellPath,\n };\n }\n\n const shellPath = process.env.SHELL || \"/bin/bash\";\n const shellName = basename(shellPath);\n const argv = shellName === \"cmd.exe\" ? [shellPath] : [shellPath, \"-i\"];\n\n return {\n argv,\n title: shellName || shellPath,\n };\n}\n\n// terminal.list\nregisterCommand(\n \"terminal.list\",\n z.object({\n workspaceId: z.string(),\n }),\n async (args, ctx) => {\n return ctx.terminalMgr\n .getAll()\n .map((terminal) => terminal.toDTO())\n .filter((terminal) => terminal.workspaceId === args.workspaceId);\n }\n);\n\n// terminal.create\nregisterCommand(\n \"terminal.create\",\n z.object({\n workspaceId: z.string(),\n cols: z.number().int().positive().optional(),\n rows: z.number().int().positive().optional(),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n const shell = resolveShellCommand();\n\n // Create shell terminal\n const terminal = ctx.terminalMgr.create({\n workspaceId: args.workspaceId,\n kind: \"shell\",\n argv: shell.argv,\n title: shell.title,\n cwd: workspace.path,\n cols: args.cols ?? 120,\n rows: args.rows ?? 30,\n });\n\n return terminal;\n }\n);\n\n// terminal.replay\nregisterCommand(\n \"terminal.replay\",\n z.object({\n terminalId: z.string(),\n lastSeq: z.number().int().nonnegative().optional(),\n }),\n async (args, ctx, clientId) => {\n const replay = ctx.terminalMgr.replay(args.terminalId, args.lastSeq ?? 0);\n\n if (replay.status !== \"ok\") {\n return replay;\n }\n\n const streamId = allocateOutboundBinaryStreamId();\n sendTerminalBinaryFrame(clientId, ctx, {\n type: TerminalBinaryFrameType.Replay,\n meta: replay.seq,\n streamId,\n payload: replay.data,\n });\n\n return {\n status: \"ok\" as const,\n transport: \"binary\" as const,\n streamId,\n size: replay.data.length,\n seq: replay.seq,\n };\n }\n);\n\n// terminal.snapshot\nregisterCommand(\n \"terminal.snapshot\",\n z.object({\n terminalId: z.string(),\n }),\n async (args, ctx, clientId) => {\n const snapshot = await ctx.terminalMgr.snapshot(args.terminalId);\n\n if (snapshot.status !== \"ok\") {\n return snapshot;\n }\n\n const streamId = allocateOutboundBinaryStreamId();\n sendTerminalBinaryFrame(clientId, ctx, {\n type: TerminalBinaryFrameType.Snapshot,\n meta: snapshot.seq,\n streamId,\n payload: snapshot.data,\n });\n\n return {\n status: \"ok\" as const,\n transport: \"binary\" as const,\n streamId,\n size: snapshot.data.length,\n seq: snapshot.seq,\n rows: snapshot.rows,\n cols: snapshot.cols,\n source: \"headless\" as const,\n } satisfies TerminalSnapshotBinaryResult;\n }\n);\n\n// terminal.close\nregisterCommand(\n \"terminal.close\",\n z.object({\n terminalId: z.string(),\n }),\n async (args, ctx) => {\n await ctx.terminalMgr.close(args.terminalId);\n }\n);\n\n// terminal.input\nregisterCommand(\"terminal.input\", TerminalInputSchema, async (args, ctx) => {\n const buffer = decodeTerminalInput(args);\n const sessionId = ctx.sessionMgr.findSessionIdByTerminal(args.terminalId);\n if (sessionId) {\n ctx.sessionMgr.sendInput(\n sessionId,\n buffer,\n normalizeTerminalInputActivity(args.activity),\n args.submittedText\n );\n return;\n }\n\n ctx.terminalMgr.write(args.terminalId, buffer);\n});\n\n// terminal.resize\nregisterCommand(\n \"terminal.resize\",\n z.object({\n terminalId: z.string(),\n cols: z.number().int().positive(),\n rows: z.number().int().positive(),\n }),\n async (args, ctx) => {\n const sessionId = ctx.sessionMgr.findSessionIdByTerminal(args.terminalId);\n if (sessionId) {\n ctx.sessionMgr.resize(sessionId, args.cols, args.rows);\n return;\n }\n\n ctx.terminalMgr.resize(args.terminalId, args.cols, args.rows);\n }\n);\n", "export interface Frame {\n data: string | Buffer;\n size: number;\n}\n\nexport interface StreamBufferDropOldestEvent {\n topic: string;\n frameSize: number;\n bucketBytes: number;\n bucketLength: number;\n}\n\nexport interface StreamBufferEvictTopicEvent {\n topic: string;\n frames: number;\n bytes: number;\n}\n\nexport interface StreamBufferOptions {\n topicCap: number;\n topicLruCap: number;\n onDropOldest?: (event: StreamBufferDropOldestEvent) => void;\n onEvictTopic?: (event: StreamBufferEvictTopicEvent) => void;\n}\n\nexport const STREAM_BUFFER_DEFAULTS: StreamBufferOptions = {\n topicCap: 512 * 1024,\n topicLruCap: 8,\n};\n\nexport class StreamBuffer {\n private readonly buckets = new Map<string, Frame[]>();\n private readonly bucketBytes = new Map<string, number>();\n private cursor = 0;\n private destroyed = false;\n\n constructor(private readonly options: StreamBufferOptions = STREAM_BUFFER_DEFAULTS) {}\n\n enqueue(topic: string, frame: Frame): void {\n if (this.destroyed) return;\n\n let bucket = this.buckets.get(topic);\n if (!bucket) {\n while (this.buckets.size >= this.options.topicLruCap) {\n const oldest = this.buckets.keys().next().value;\n if (oldest === undefined) break;\n const oldestBucket = this.buckets.get(oldest);\n const oldestBytes = this.bucketBytes.get(oldest) ?? 0;\n this.options.onEvictTopic?.({\n topic: oldest,\n frames: oldestBucket?.length ?? 0,\n bytes: oldestBytes,\n });\n this.buckets.delete(oldest);\n this.bucketBytes.delete(oldest);\n }\n bucket = [];\n this.buckets.set(topic, bucket);\n this.bucketBytes.set(topic, 0);\n } else {\n const bytes = this.bucketBytes.get(topic) ?? 0;\n this.buckets.delete(topic);\n this.buckets.set(topic, bucket);\n this.bucketBytes.delete(topic);\n this.bucketBytes.set(topic, bytes);\n }\n\n bucket.push(frame);\n let bytes = (this.bucketBytes.get(topic) ?? 0) + frame.size;\n\n while (bytes > this.options.topicCap && bucket.length > 1) {\n const dropped = bucket.shift()!;\n bytes -= dropped.size;\n this.options.onDropOldest?.({\n topic,\n frameSize: dropped.size,\n bucketBytes: bytes,\n bucketLength: bucket.length,\n });\n }\n\n this.bucketBytes.set(topic, bytes);\n }\n\n drain(maxBytes: number, send: (data: string | Buffer) => boolean): void {\n if (this.destroyed) return;\n let sent = 0;\n let sentAny = false;\n const startCursor = this.cursor;\n\n while (sent < maxBytes && this.buckets.size > 0) {\n const topics = [...this.buckets.keys()];\n let drainedThisRound = 0;\n\n for (let i = 0; i < topics.length && sent < maxBytes; i++) {\n const idx = (startCursor + i) % topics.length;\n const topic = topics[idx]!;\n const bucket = this.buckets.get(topic);\n if (!bucket || bucket.length === 0) continue;\n\n const next = bucket[0]!;\n if (!send(next.data)) {\n if (sentAny) this.cursor = startCursor + 1;\n return;\n }\n\n bucket.shift();\n sent += next.size;\n sentAny = true;\n drainedThisRound++;\n\n const remaining = (this.bucketBytes.get(topic) ?? 0) - next.size;\n if (bucket.length === 0) {\n this.buckets.delete(topic);\n this.bucketBytes.delete(topic);\n } else {\n this.bucketBytes.set(topic, remaining);\n }\n }\n\n if (drainedThisRound === 0) break;\n }\n\n if (sentAny) this.cursor = startCursor + 1;\n }\n\n isEmpty(): boolean {\n return this.buckets.size === 0;\n }\n\n destroy(): void {\n this.destroyed = true;\n this.buckets.clear();\n this.bucketBytes.clear();\n }\n}\n", "/**\n * WebSocket Client\n *\n * Manages a single WebSocket connection:\n * - Send commands, events, results\n * - Subscription management\n * - Backpressure handling\n */\n\nimport type { ClientToServer, Event, ServerToClient } from \"@coder-studio/core\";\nimport WebSocket from \"ws\";\nimport {\n type Frame,\n STREAM_BUFFER_DEFAULTS,\n StreamBuffer,\n type StreamBufferDropOldestEvent,\n type StreamBufferEvictTopicEvent,\n} from \"./stream-buffer.js\";\n\nconst HIGH_WATER = 1024 * 1024;\nconst LOW_WATER = 256 * 1024;\nconst FLUSH_INTERVAL_MS = 30;\nconst STREAM_BUFFER_WARN_INTERVAL_MS = 5000;\n\nexport type ClientId = string;\nexport type MessageHandler = (msg: ClientToServer | Buffer) => void;\nexport type CloseHandler = () => void;\nexport interface WsClientLogger {\n warn(context: Record<string, unknown>, message: string): void;\n}\n\nconst NOOP_LOGGER: WsClientLogger = {\n warn: () => {},\n};\n\nexport class WsClient {\n readonly id: ClientId;\n private subscriptions = new Set<string>();\n private readonly streamBuffer: StreamBuffer;\n private flushTimer: NodeJS.Timeout | null = null;\n private messageHandler: MessageHandler | null = null;\n private closeHandler: CloseHandler | null = null;\n private isAlive = true;\n private droppedFramesSinceLastWarn = 0;\n private droppedBytesSinceLastWarn = 0;\n private evictedTopicsSinceLastWarn = 0;\n private evictedFramesSinceLastWarn = 0;\n private evictedBytesSinceLastWarn = 0;\n private lastStreamBufferWarnAt = 0;\n private readonly logger: WsClientLogger;\n\n constructor(\n private readonly socket: WebSocket,\n id: ClientId,\n logger?: WsClientLogger\n ) {\n this.id = id;\n this.logger = logger ?? NOOP_LOGGER;\n this.streamBuffer = new StreamBuffer({\n ...STREAM_BUFFER_DEFAULTS,\n onDropOldest: (event) => this.handleStreamBufferDrop(event),\n onEvictTopic: (event) => this.handleStreamBufferEviction(event),\n });\n this.setupSocketHandlers();\n }\n\n private markAlive(): void {\n this.isAlive = true;\n }\n\n private setupSocketHandlers(): void {\n this.socket.on(\"message\", (data: Buffer, isBinary: boolean) => {\n this.markAlive();\n\n if (isBinary) {\n this.messageHandler?.(data);\n return;\n }\n\n try {\n const msg = JSON.parse(data.toString()) as ClientToServer;\n this.messageHandler?.(msg);\n } catch (error) {\n console.error(`Failed to parse message from client ${this.id}:`, error);\n }\n });\n\n this.socket.on(\"close\", () => {\n this.isAlive = false;\n this.clearFlushTimer();\n this.streamBuffer.destroy();\n this.closeHandler?.();\n });\n\n this.socket.on(\"pong\", () => {\n this.markAlive();\n });\n }\n\n /**\n * Register message handler\n */\n onMessage(handler: MessageHandler): void {\n this.messageHandler = handler;\n }\n\n /**\n * Register close handler\n */\n onClose(handler: CloseHandler): void {\n this.closeHandler = handler;\n }\n\n /**\n * Control-class send: bypasses application-level backpressure.\n * Stream-class senders go through sendStream() instead.\n */\n sendControl(msg: ServerToClient): boolean {\n if (this.socket.readyState !== WebSocket.OPEN) {\n return false;\n }\n try {\n this.socket.send(JSON.stringify(msg));\n return true;\n } catch (error) {\n console.error(`Failed to send message to client ${this.id}:`, error);\n return false;\n }\n }\n\n sendControlAndClose(msg: ServerToClient, code: number, reason: string): boolean {\n if (this.socket.readyState !== WebSocket.OPEN) {\n return false;\n }\n\n try {\n this.socket.send(JSON.stringify(msg), () => {\n this.socket.close(code, reason);\n });\n return true;\n } catch (error) {\n console.error(`Failed to send message to client ${this.id}:`, error);\n return false;\n }\n }\n\n sendBinary(data: Buffer): boolean {\n if (this.socket.readyState !== WebSocket.OPEN) {\n return false;\n }\n try {\n this.socket.send(data, { binary: true });\n return true;\n } catch (error) {\n console.error(`Failed to send binary frame to client ${this.id}:`, error);\n return false;\n }\n }\n\n /**\n * Backwards-compatible alias for sendControl.\n * Kept so existing call sites (hub.send, dispatch results, sendToClient) compile unchanged.\n */\n send(msg: ServerToClient): boolean {\n return this.sendControl(msg);\n }\n\n /**\n * Stream-class send: queued per-topic, drop-oldest on overflow.\n * Caller-side ordering is preserved within a topic; across topics the\n * flusher uses fair rotation. Frontend recovers via seq-gap + replay.\n */\n sendStream(topic: string, msg: ServerToClient | Buffer): void {\n if (this.socket.readyState !== WebSocket.OPEN) return;\n\n const frame = this.createFrame(msg);\n\n const buffered = this.socket.bufferedAmount ?? 0;\n if (buffered < HIGH_WATER && this.streamBuffer.isEmpty()) {\n if (!this.sendFrame(frame.data)) {\n console.error(`Failed to send stream frame to client ${this.id}`);\n }\n return;\n }\n\n this.streamBuffer.enqueue(topic, frame);\n this.flushStream();\n }\n\n /**\n * Sugar for stream-class events (mirrors sendEvent for control class).\n */\n sendEventStream(topic: string, data: unknown, seq: number = 0): void {\n const event: Event = {\n kind: \"event\",\n topic,\n seq,\n timestamp: Date.now(),\n data,\n };\n this.sendStream(topic, event);\n }\n\n private createFrame(msg: ServerToClient | Buffer): Frame {\n if (Buffer.isBuffer(msg)) {\n return {\n data: msg,\n size: msg.byteLength,\n };\n }\n\n const data = JSON.stringify(msg);\n return {\n data,\n size: Buffer.byteLength(data, \"utf8\"),\n };\n }\n\n private sendFrame(data: string | Buffer): boolean {\n try {\n if (Buffer.isBuffer(data)) {\n this.socket.send(data, { binary: true });\n } else {\n this.socket.send(data);\n }\n return true;\n } catch {\n return false;\n }\n }\n\n private flushStream(): void {\n if (this.socket.readyState !== WebSocket.OPEN) {\n this.clearFlushTimer();\n this.streamBuffer.destroy();\n return;\n }\n\n const buffered = this.socket.bufferedAmount ?? 0;\n if (buffered < LOW_WATER) {\n const headroom = HIGH_WATER - buffered;\n this.streamBuffer.drain(headroom, (data) => {\n try {\n if (Buffer.isBuffer(data)) {\n this.socket.send(data, { binary: true });\n } else {\n this.socket.send(data);\n }\n return true;\n } catch (error) {\n console.error(`Stream send failed for client ${this.id}:`, error);\n return false;\n }\n });\n }\n\n if (this.streamBuffer.isEmpty()) {\n this.clearFlushTimer();\n } else {\n this.ensureFlushTimer();\n }\n }\n\n private ensureFlushTimer(): void {\n if (this.flushTimer) return;\n this.flushTimer = setInterval(() => this.flushStream(), FLUSH_INTERVAL_MS);\n }\n\n private clearFlushTimer(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n }\n\n private handleStreamBufferDrop(event: StreamBufferDropOldestEvent): void {\n this.droppedFramesSinceLastWarn += 1;\n this.droppedBytesSinceLastWarn += event.frameSize;\n this.warnStreamBufferPressure(\"topic-cap\", event.topic);\n }\n\n private handleStreamBufferEviction(event: StreamBufferEvictTopicEvent): void {\n this.evictedTopicsSinceLastWarn += 1;\n this.evictedFramesSinceLastWarn += event.frames;\n this.evictedBytesSinceLastWarn += event.bytes;\n this.warnStreamBufferPressure(\"topic-lru\", event.topic);\n }\n\n private warnStreamBufferPressure(reason: \"topic-cap\" | \"topic-lru\", topic: string): void {\n const now = Date.now();\n if (now - this.lastStreamBufferWarnAt < STREAM_BUFFER_WARN_INTERVAL_MS) {\n return;\n }\n\n this.logger.warn(\n {\n reason,\n clientId: this.id,\n topic,\n bufferedAmount: this.socket.bufferedAmount ?? 0,\n droppedFrames: this.droppedFramesSinceLastWarn,\n droppedBytes: this.droppedBytesSinceLastWarn,\n evictedTopics: this.evictedTopicsSinceLastWarn,\n evictedFrames: this.evictedFramesSinceLastWarn,\n evictedBytes: this.evictedBytesSinceLastWarn,\n },\n \"Stream buffer pressure\"\n );\n\n this.lastStreamBufferWarnAt = now;\n this.droppedFramesSinceLastWarn = 0;\n this.droppedBytesSinceLastWarn = 0;\n this.evictedTopicsSinceLastWarn = 0;\n this.evictedFramesSinceLastWarn = 0;\n this.evictedBytesSinceLastWarn = 0;\n }\n\n /**\n * Send an event message\n */\n sendEvent(topic: string, data: unknown, seq: number = 0): boolean {\n const event: Event = {\n kind: \"event\",\n topic,\n seq,\n timestamp: Date.now(),\n data,\n };\n return this.send(event);\n }\n\n sendEventAndClose(\n topic: string,\n data: unknown,\n code: number,\n reason: string,\n seq: number = 0\n ): boolean {\n const event: Event = {\n kind: \"event\",\n topic,\n seq,\n timestamp: Date.now(),\n data,\n };\n return this.sendControlAndClose(event, code, reason);\n }\n\n /**\n * Check if client subscribes to a topic (supports glob patterns)\n */\n subscribesTo(topic: string): boolean {\n for (const pattern of this.subscriptions) {\n if (this.matchTopic(pattern, topic)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Add subscriptions\n */\n subscribe(topics: string[]): void {\n for (const topic of topics) {\n this.subscriptions.add(topic);\n }\n }\n\n /**\n * Remove subscriptions\n */\n unsubscribe(topics: string[]): void {\n for (const topic of topics) {\n this.subscriptions.delete(topic);\n }\n }\n\n /**\n * Check if connection is alive\n */\n get alive(): boolean {\n return this.isAlive && this.socket.readyState === WebSocket.OPEN;\n }\n\n /**\n * Ping the client\n */\n ping(): void {\n if (this.socket.readyState === WebSocket.OPEN) {\n this.isAlive = false;\n this.socket.ping();\n }\n }\n\n /**\n * Close the connection\n */\n close(code?: number, reason?: string): void {\n this.socket.close(code, reason);\n }\n\n /**\n * Simple glob pattern matching for topics\n * Supports * as wildcard (e.g., \"workspace.42.*\" matches \"workspace.42.session.1.state\")\n */\n private matchTopic(pattern: string, topic: string): boolean {\n if (pattern === topic) return true;\n if (pattern === \"*\") return true;\n\n // Split pattern and topic into parts\n const patternParts = pattern.split(\".\");\n const topicParts = topic.split(\".\");\n\n // Match each part\n for (let i = 0; i < patternParts.length; i++) {\n const pp = patternParts[i];\n\n // * matches any single part\n if (pp === \"*\") {\n // If this is the last part in pattern, match everything\n if (i === patternParts.length - 1) {\n return true;\n }\n continue;\n }\n\n // If pattern part doesn't match topic part\n if (i >= topicParts.length || pp !== topicParts[i]) {\n return false;\n }\n }\n\n // Pattern matched all parts\n return patternParts.length <= topicParts.length;\n }\n}\n", "const STREAM_TOPIC_RE = /^workspace\\.[^.]+\\.terminal\\.[^.]+\\.output$/;\n\nexport function isStreamTopic(topic: string): boolean {\n return STREAM_TOPIC_RE.test(topic);\n}\n", "/**\n * WebSocket Hub\n *\n * Manages all WebSocket connections:\n * - Single writer enforcement (Phase 1)\n * - Connection handling and routing\n * - Event bus subscription and broadcasting\n * - Topic-based routing\n */\n\nimport type {\n ClientToServer,\n Command,\n DomainEvent,\n ServerToClient,\n TerminalInputBinaryArgs,\n} from \"@coder-studio/core\";\nimport { encodeTerminalOutputFrame, Topics } from \"@coder-studio/core\";\nimport type { FastifyBaseLogger, FastifyRequest } from \"fastify\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport type WebSocket from \"ws\";\nimport { EventBus } from \"../bus/event-bus.js\";\nimport { clearPendingTerminalInput, registerPendingTerminalInput } from \"../commands/terminal.js\";\nimport type { ServerConfig } from \"../config.js\";\nimport { ClientId, WsClient } from \"./client.js\";\nimport { type CommandContext, dispatch } from \"./dispatch.js\";\nimport type { FencingManager } from \"./fencing.js\";\nimport { isStreamTopic } from \"./topic-class.js\";\n\ninterface WsHubDeps {\n eventBus: EventBus;\n commandContext: CommandContext | null;\n config: ServerConfig;\n fencingMgr: FencingManager;\n logger?: FastifyBaseLogger;\n}\n\nconst BINARY_PAYLOAD_TIMEOUT_MS = 5000;\n\ninterface BinaryWaiter {\n resolve: (payload: Buffer) => void;\n reject: (error: Error) => void;\n timer: NodeJS.Timeout;\n}\n\nconst isBinaryTerminalInputArgs = (args: unknown): args is TerminalInputBinaryArgs => {\n return (\n typeof args === \"object\" &&\n args !== null &&\n \"transport\" in args &&\n (args as { transport?: unknown }).transport === \"binary\"\n );\n};\n\n/**\n * Broadcaster interface for fan-out of domain events to subscribed clients.\n * Used by FsWatcher and SupervisorManager; WsHub is the only implementation.\n * Internally routes via isStreamTopic so callers don't have to classify.\n */\nexport interface Broadcaster {\n broadcast(topic: string, data: unknown): void;\n sendToClient(clientId: ClientId, msg: ServerToClient): boolean;\n sendBinaryToClient(clientId: ClientId, data: Buffer): boolean;\n getRequestMetadata?(clientId: ClientId): FastifyRequest | undefined;\n revokeAndCloseClient?(clientId: ClientId, generation: number): void;\n}\n\nexport class WsHub implements Broadcaster {\n private clients = new Map<ClientId, WsClient>();\n private clientRequests = new Map<ClientId, FastifyRequest>();\n private eventUnsubscribers: (() => void)[] = [];\n private nextStreamId = 1;\n // Per-client queue of waiters for the next inbound binary frame. The\n // terminal.input protocol sends a JSON command immediately followed by a\n // binary payload \u2014 the JSON is dispatched synchronously, so we have to\n // await the binary frame here before letting the handler run.\n private pendingBinaryWaiters = new Map<ClientId, BinaryWaiter[]>();\n\n constructor(private readonly deps: WsHubDeps) {\n this.subscribeToEvents();\n }\n\n setLogger(logger: FastifyBaseLogger): void {\n this.deps.logger = logger;\n }\n\n setCommandContext(commandContext: CommandContext): void {\n this.deps.commandContext = commandContext;\n }\n\n /**\n * Handle a new WebSocket connection\n */\n handleConnection(socket: WebSocket, req: FastifyRequest): void {\n const client = new WsClient(socket, uuidv4(), this.deps.logger);\n this.clients.set(client.id, client);\n this.clientRequests.set(client.id, req);\n\n // Send initial connection metadata. Writer status is established later by\n // fencing.request, but the UI still needs the app version immediately.\n client.sendEvent(\"connection.status\", {\n status: \"connected\",\n clientId: client.id,\n authEnabled: this.deps.config.auth.enabled,\n binaryTerminalTransport: true,\n version: this.deps.config.appVersion ?? \"0.0.0\",\n serverInstanceId: `server-${process.pid}`,\n isWriter: false,\n });\n\n // Setup handlers\n client.onMessage((msg) => this.routeMessage(client, msg));\n client.onClose(() => this.handleClose(client));\n }\n\n /**\n * Route incoming message from client\n */\n private async routeMessage(client: WsClient, msg: ClientToServer | Buffer): Promise<void> {\n if (Buffer.isBuffer(msg)) {\n this.deliverBinaryPayload(client.id, msg);\n return;\n }\n\n switch (msg.kind) {\n case \"subscribe\":\n client.subscribe(msg.topics);\n break;\n\n case \"unsubscribe\":\n client.unsubscribe(msg.topics);\n break;\n\n case \"command\": {\n const commandContext = this.getCommandContext();\n let pendingBinaryStreamId: number | null = null;\n if (msg.op === \"terminal.input\" && isBinaryTerminalInputArgs(msg.args)) {\n // The JSON command arrives one frame ahead of its binary payload.\n // Wait for the payload before dispatching so the handler can decode\n // synchronously by streamId.\n try {\n const payload = await this.awaitBinaryPayload(client.id);\n registerPendingTerminalInput(msg.args, payload);\n pendingBinaryStreamId = msg.args.streamId;\n } catch (error) {\n client.send({\n kind: \"result\",\n id: msg.id,\n ok: false,\n error: {\n code: \"terminal_input_binary_timeout\",\n message:\n error instanceof Error\n ? error.message\n : \"Timeout waiting for terminal input binary payload\",\n },\n });\n break;\n }\n }\n const result = await dispatch(msg as Command, commandContext, client.id);\n if (\n pendingBinaryStreamId !== null &&\n !result.ok &&\n result.error?.code === \"validation_error\"\n ) {\n clearPendingTerminalInput(pendingBinaryStreamId);\n }\n client.send(result);\n break;\n }\n\n case \"resync\":\n this.handleResync(client, msg.lastSeen);\n break;\n }\n }\n\n private awaitBinaryPayload(clientId: ClientId): Promise<Buffer> {\n return new Promise<Buffer>((resolve, reject) => {\n const timer = setTimeout(() => {\n const waiters = this.pendingBinaryWaiters.get(clientId);\n if (!waiters) return;\n const idx = waiters.findIndex((w) => w.timer === timer);\n if (idx === -1) return;\n waiters.splice(idx, 1);\n if (waiters.length === 0) {\n this.pendingBinaryWaiters.delete(clientId);\n }\n reject(new Error(\"Timeout waiting for terminal input binary payload\"));\n }, BINARY_PAYLOAD_TIMEOUT_MS);\n\n const waiter: BinaryWaiter = { resolve, reject, timer };\n const queue = this.pendingBinaryWaiters.get(clientId);\n if (queue) {\n queue.push(waiter);\n } else {\n this.pendingBinaryWaiters.set(clientId, [waiter]);\n }\n });\n }\n\n private deliverBinaryPayload(clientId: ClientId, payload: Buffer): void {\n const queue = this.pendingBinaryWaiters.get(clientId);\n if (!queue || queue.length === 0) {\n return;\n }\n const waiter = queue.shift()!;\n if (queue.length === 0) {\n this.pendingBinaryWaiters.delete(clientId);\n }\n clearTimeout(waiter.timer);\n waiter.resolve(payload);\n }\n\n private discardPendingBinaryWaiters(clientId: ClientId): void {\n const queue = this.pendingBinaryWaiters.get(clientId);\n if (!queue) return;\n this.pendingBinaryWaiters.delete(clientId);\n for (const waiter of queue) {\n clearTimeout(waiter.timer);\n waiter.reject(new Error(\"Client disconnected before binary payload arrived\"));\n }\n }\n\n /**\n * Handle resync request\n */\n private handleResync(client: WsClient, lastSeen: Record<string, number>): void {\n const commandContext = this.getCommandContext();\n const workspaces = commandContext.workspaceMgr.list();\n for (const workspace of workspaces) {\n const workspaceTopic = Topics.workspaceMeta(workspace.id);\n if (client.subscribesTo(workspaceTopic)) {\n client.sendEvent(workspaceTopic, workspace);\n }\n\n const sessions = commandContext.sessionMgr.getForWorkspace(workspace.id);\n for (const session of sessions) {\n const sessionTopic = Topics.sessionState(workspace.id, session.id);\n if (!client.subscribesTo(sessionTopic)) {\n continue;\n }\n client.sendEvent(sessionTopic, session);\n }\n }\n\n client.sendEvent(\"connection.status\", {\n status: \"resynced\",\n topics: Object.keys(lastSeen),\n });\n }\n\n /**\n * Handle client close\n */\n private handleClose(client: WsClient): void {\n this.clients.delete(client.id);\n this.clientRequests.delete(client.id);\n this.discardPendingBinaryWaiters(client.id);\n this.deps.commandContext?.autoFetch.unregisterViewer(client.id);\n this.deps.commandContext?.activationMgr.onSocketClosed(client.id);\n\n // Release fencing tokens held by this client\n // FencingManager tracks by clientId internally\n // Note: FencingManager doesn't have a method to release by clientId yet\n // This will be handled by the client calling fencing.release before disconnect\n }\n\n /**\n * Takeover: Force close existing writer and accept new one\n * DEPRECATED: This is now handled through fencing.takeover command\n * Kept for backward compatibility\n */\n async takeover(newClient: WsClient): Promise<void> {\n // Note: This method is deprecated in favor of FencingManager\n // Keeping for backward compatibility\n this.clients.set(newClient.id, newClient);\n }\n\n /**\n * Broadcast to all subscribed clients.\n * Routes by isStreamTopic: stream topics go through the per-topic queued\n * path; everything else goes through the control path (never dropped).\n */\n broadcast(topic: string, payload: unknown): void {\n const stream = isStreamTopic(topic);\n for (const client of this.clients.values()) {\n if (!client.subscribesTo(topic)) continue;\n if (stream && Buffer.isBuffer(payload)) {\n this.sendTerminalStreamToClient(client, topic, payload, 0);\n } else if (stream) {\n client.sendEventStream(topic, payload);\n } else {\n client.sendEvent(topic, payload);\n }\n }\n }\n\n /**\n * Send message to specific client\n */\n sendToClient(clientId: ClientId, msg: ServerToClient): boolean {\n const client = this.clients.get(clientId);\n if (!client) return false;\n return client.send(msg);\n }\n\n sendBinaryToClient(clientId: ClientId, data: Buffer): boolean {\n const client = this.clients.get(clientId);\n if (!client) return false;\n return client.sendBinary(data);\n }\n\n revokeAndCloseClient(clientId: ClientId, generation: number): void {\n const client = this.clients.get(clientId);\n if (!client) {\n return;\n }\n\n client.sendEventAndClose(\n \"activation.revoked\",\n {\n reason: \"displaced\",\n generation,\n },\n 4001,\n \"single_active_displaced\"\n );\n }\n\n getRequestMetadata(clientId: ClientId): FastifyRequest | undefined {\n return this.clientRequests.get(clientId);\n }\n\n /**\n * Get the current writer client\n * DEPRECATED: Writer tracking now handled by FencingManager\n */\n getWriter(): WsClient | null {\n // Note: This method is deprecated in favor of FencingManager\n return null;\n }\n\n /**\n * Ping all clients for keepalive\n */\n pingAll(): void {\n for (const client of this.clients.values()) {\n if (!client.alive) {\n client.close(1011, \"keepalive_timeout\");\n continue;\n }\n client.ping();\n }\n }\n\n /**\n * Close all connections\n */\n closeAll(): void {\n for (const client of this.clients.values()) {\n client.close();\n }\n this.clients.clear();\n this.clientRequests.clear();\n }\n\n /**\n * Subscribe to domain events and broadcast them\n */\n private subscribeToEvents(): void {\n // Subscribe to all domain event types\n const eventTypes: DomainEvent[\"type\"][] = [\n \"session.state.changed\",\n \"session.lifecycle\",\n \"workspace.meta.changed\",\n \"git.state.changed\",\n \"fs.dirty\",\n \"terminal.created\",\n \"terminal.output\",\n \"terminal.exited\",\n ];\n\n for (const type of eventTypes) {\n const unsub = this.deps.eventBus.on(type, (event) => {\n this.handleDomainEvent(event);\n });\n this.eventUnsubscribers.push(unsub);\n }\n }\n\n /**\n * Convert domain event to WebSocket event and broadcast\n */\n private handleDomainEvent(event: DomainEvent): void {\n if (event.type === \"terminal.output\") {\n const topic = Topics.terminalOutput(event.workspaceId, event.terminalId);\n for (const client of this.clients.values()) {\n if (!client.subscribesTo(topic)) continue;\n this.sendTerminalStreamToClient(client, topic, event.chunk, event.seq);\n }\n return;\n }\n\n let topic: string;\n let data: unknown;\n\n switch (event.type) {\n case \"session.state.changed\":\n if (!event.workspaceId) {\n return;\n }\n topic = Topics.sessionState(event.workspaceId, event.sessionId);\n data = event.session ?? {\n state: event.to,\n from: event.from,\n };\n break;\n\n case \"session.lifecycle\":\n if (!event.workspaceId) {\n return;\n }\n topic = Topics.sessionLifecycle(event.workspaceId, event.sessionId);\n data = {\n event: event.event,\n };\n break;\n\n case \"workspace.meta.changed\":\n topic = Topics.workspaceMeta(event.workspaceId);\n data = event.patch;\n break;\n\n case \"git.state.changed\":\n topic = Topics.workspaceGitState(event.workspaceId);\n data = {\n treeChanged: Boolean(event.treeChanged),\n branchChanged: Boolean(event.branchChanged),\n worktreeChanged: Boolean(event.worktreeChanged),\n };\n break;\n\n case \"fs.dirty\":\n topic = Topics.workspaceFsDirty(event.workspaceId);\n data = { reason: event.reason };\n break;\n\n case \"terminal.created\":\n topic = Topics.terminalCreated(event.workspaceId, event.terminalId);\n data = {\n id: event.terminalId,\n kind: event.kind,\n title: event.title,\n cwd: event.cwd,\n workspaceId: event.workspaceId,\n };\n break;\n\n case \"terminal.exited\":\n topic = Topics.terminalExit(event.workspaceId, event.terminalId);\n data = {\n code: event.exitCode,\n };\n break;\n\n default:\n return;\n }\n\n this.broadcast(topic, data);\n }\n\n private sendTerminalStreamToClient(\n client: WsClient,\n topic: string,\n payload: Buffer,\n seq: number\n ): void {\n const streamId = this.allocateStreamId();\n client.sendStream(\n topic,\n Buffer.from(\n encodeTerminalOutputFrame({ topic, seq, streamId, payloadSize: payload.length }, payload)\n )\n );\n }\n\n private allocateStreamId(): number {\n const id = this.nextStreamId;\n this.nextStreamId += 1;\n return id;\n }\n\n private getCommandContext(): CommandContext {\n if (!this.deps.commandContext) {\n throw new Error(\"WebSocket command context has not been initialized\");\n }\n return this.deps.commandContext;\n }\n\n /**\n * Cleanup event subscriptions\n */\n destroy(): void {\n for (const unsub of this.eventUnsubscribers) {\n unsub();\n }\n this.eventUnsubscribers = [];\n this.closeAll();\n }\n}\n", "/**\n * Workspace Commands\n */\n\nimport { readdir } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { z } from \"zod\";\nimport { registerCommand } from \"../ws/dispatch.js\";\n\n// workspace.list\nregisterCommand(\"workspace.list\", z.object({}), async (_args, ctx) => {\n return ctx.workspaceMgr.list();\n});\n\n// workspace.browse - List directories for path selection\nregisterCommand(\n \"workspace.browse\",\n z.object({\n path: z.string().optional(),\n }),\n async (args) => {\n const basePath = args.path || homedir();\n const entries = await readdir(basePath, { withFileTypes: true });\n\n const directories = entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => ({\n name: entry.name,\n path: join(basePath, entry.name),\n }))\n .sort((a, b) => a.name.localeCompare(b.name));\n\n return {\n currentPath: basePath,\n parentPath: basePath !== \"/\" ? join(basePath, \"..\") : null,\n directories,\n };\n }\n);\n\n// workspace.open\nregisterCommand(\n \"workspace.open\",\n z.object({\n path: z.string(),\n }),\n async (args, ctx) => {\n return ctx.workspaceMgr.open({\n path: args.path,\n });\n }\n);\n\n// workspace.close\nregisterCommand(\n \"workspace.close\",\n z.object({\n id: z.string(),\n }),\n async (args, ctx) => {\n await ctx.workspaceMgr.close(args.id);\n }\n);\n\nregisterCommand(\n \"workspace.uiState.set\",\n z.object({\n workspaceId: z.string(),\n uiState: z.object({\n leftPanelWidth: z.number(),\n bottomPanelHeight: z.number(),\n focusMode: z.boolean(),\n activeSessionId: z.string().optional(),\n paneLayout: z\n .object({\n id: z.string(),\n type: z.enum([\"leaf\", \"split\"]),\n sessionId: z.string().optional(),\n direction: z.enum([\"horizontal\", \"vertical\"]).optional(),\n children: z\n .lazy(() =>\n z.array(\n z.object({\n id: z.string(),\n type: z.enum([\"leaf\", \"split\"]),\n sessionId: z.string().optional(),\n direction: z.enum([\"horizontal\", \"vertical\"]).optional(),\n children: z.any().optional(),\n })\n )\n )\n .optional(),\n })\n .optional(),\n }),\n }),\n async (args, ctx) => {\n ctx.workspaceMgr.updateUiState(args.workspaceId, args.uiState);\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n return workspace;\n }\n);\n", "import type { WorkspaceLastViewedTarget } from \"@coder-studio/core\";\nimport { z } from \"zod\";\nimport { registerCommand } from \"../ws/dispatch.js\";\n\nconst WORKSPACE_LAST_VIEWED_TARGET_KEY = \"workspace.lastViewedTarget\";\nconst workspaceLastViewedTargetSchema = z.object({\n workspaceId: z.string(),\n sessionId: z.string().optional(),\n updatedAt: z.number(),\n});\n\nfunction parseWorkspaceLastViewedTarget(value: string): WorkspaceLastViewedTarget | null {\n try {\n const parsed = JSON.parse(value);\n const result = workspaceLastViewedTargetSchema.safeParse(parsed);\n return result.success ? result.data : null;\n } catch {\n return null;\n }\n}\n\nregisterCommand(\n \"workspace.activate\",\n z.object({\n workspaceId: z.string(),\n }),\n async (args, ctx, clientId) => {\n if (!clientId) {\n return {};\n }\n\n ctx.autoFetch.registerViewer(clientId, args.workspaceId);\n return {};\n }\n);\n\nregisterCommand(\"workspace.deactivate\", z.object({}), async (_args, ctx, clientId) => {\n if (!clientId) {\n return {};\n }\n\n ctx.autoFetch.unregisterViewer(clientId);\n return {};\n});\n\nregisterCommand(\"workspace.lastViewedTarget.get\", z.object({}), async (_args, ctx) => {\n const row = ctx.db\n .prepare(\"SELECT value FROM user_settings WHERE key = ?\")\n .get(WORKSPACE_LAST_VIEWED_TARGET_KEY) as { value: string } | undefined;\n\n if (!row) {\n return null;\n }\n\n return parseWorkspaceLastViewedTarget(row.value);\n});\n\nregisterCommand(\n \"workspace.lastViewedTarget.set\",\n z.object({\n workspaceId: z.string(),\n sessionId: z.string().optional(),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw {\n code: \"workspace_not_found\",\n message: `Workspace not found: ${args.workspaceId}`,\n };\n }\n\n const session = args.sessionId ? ctx.sessionMgr.get(args.sessionId) : undefined;\n\n const nextTarget: WorkspaceLastViewedTarget = {\n workspaceId: args.workspaceId,\n sessionId: session && session.workspaceId === args.workspaceId ? session.id : undefined,\n updatedAt: Date.now(),\n };\n\n ctx.db\n .prepare(\n `\n INSERT INTO user_settings (key, value)\n VALUES (?, ?)\n ON CONFLICT(key) DO UPDATE SET value = excluded.value\n `\n )\n .run(WORKSPACE_LAST_VIEWED_TARGET_KEY, JSON.stringify(nextTarget));\n\n return nextTarget;\n }\n);\n", "import { z } from \"zod\";\nimport { registerCommand } from \"../ws/dispatch.js\";\n\nregisterCommand(\n \"activation.claim\",\n z.object({ clientInstanceId: z.string().min(1) }),\n async (args, ctx, clientId) => {\n if (!clientId) {\n throw {\n code: \"activation_request_unavailable\",\n message: \"Activation claim requires websocket request metadata\",\n };\n }\n\n const request = ctx.broadcaster.getRequestMetadata?.(clientId);\n if (!request) {\n throw {\n code: \"activation_request_unavailable\",\n message: \"Activation claim requires websocket request metadata\",\n };\n }\n\n const claim = ctx.activationMgr.claim(args.clientInstanceId, clientId, request);\n if (claim.displacedWsClientId) {\n ctx.broadcaster.revokeAndCloseClient?.(claim.displacedWsClientId, claim.generation);\n }\n\n return claim;\n }\n);\n\nregisterCommand(\n \"activation.release\",\n z.object({ clientInstanceId: z.string(), generation: z.number().int().positive() }),\n async (args, ctx, clientId) => {\n const lease = ctx.activationMgr.getLease();\n if (!clientId || !lease || lease.wsClientId !== clientId) {\n return { ok: false };\n }\n\n ctx.activationMgr.release(args.clientInstanceId, args.generation);\n return { ok: true };\n }\n);\n", "import { z } from \"zod\";\nimport { registerCommand } from \"../ws/dispatch.js\";\n\nregisterCommand(\"connection.probe\", z.object({}).default({}), async () => {\n return { ok: true as const };\n});\n", "import type { ProviderDefinition, ProviderRuntimeStatusResponse } from \"@coder-studio/core\";\nimport {\n type CommandAvailabilityCheck,\n type CommandCheckDeps,\n checkCommandAvailable,\n} from \"./command-check.js\";\n\nexport interface RuntimeStatusDeps extends CommandCheckDeps {\n commandExists?: CommandAvailabilityCheck;\n}\n\nfunction canAutoInstall(\n provider: ProviderDefinition,\n platform: NodeJS.Platform,\n missingCommands: string[],\n missingPrerequisites: string[],\n availableCommands: Set<string>\n): boolean {\n const strategies = provider.install.strategies[platform] ?? [];\n const remainingCommands = new Set(missingCommands);\n const remainingPrerequisites = new Set(missingPrerequisites);\n const reachableCommands = new Set(availableCommands);\n let progressed = true;\n\n while (progressed) {\n progressed = false;\n\n for (const strategy of strategies) {\n const requiresMet = strategy.requiresCommands.every((command) =>\n reachableCommands.has(command)\n );\n\n if (\n strategy.kind === \"prerequisite\" &&\n remainingPrerequisites.has(strategy.targetCommand) &&\n requiresMet\n ) {\n remainingPrerequisites.delete(strategy.targetCommand);\n reachableCommands.add(strategy.targetCommand);\n progressed = true;\n continue;\n }\n\n if (\n strategy.kind === \"provider\" &&\n remainingCommands.has(strategy.targetCommand) &&\n requiresMet\n ) {\n remainingCommands.delete(strategy.targetCommand);\n reachableCommands.add(strategy.targetCommand);\n progressed = true;\n }\n }\n }\n\n return remainingCommands.size === 0 && strategies.length > 0;\n}\n\nexport async function buildProviderRuntimeStatus(\n providers: ProviderDefinition[],\n deps: RuntimeStatusDeps = {}\n): Promise<ProviderRuntimeStatusResponse> {\n const platform = deps.platform ?? process.platform;\n const commandExists =\n deps.commandExists ?? ((command: string) => checkCommandAvailable(command, deps));\n const result: ProviderRuntimeStatusResponse = { providers: {} };\n\n for (const provider of providers) {\n const strategies = provider.install.strategies[platform] ?? [];\n const strategyDependencyCommands = new Set<string>();\n for (const strategy of strategies) {\n for (const command of strategy.requiresCommands) {\n strategyDependencyCommands.add(command);\n }\n }\n\n const missingCommands: string[] = [];\n const availableCommands = new Set<string>();\n for (const command of provider.requiredCommands) {\n if (await commandExists(command)) {\n availableCommands.add(command);\n } else {\n missingCommands.push(command);\n }\n }\n\n const missingPrerequisites: string[] = [];\n for (const command of provider.install.prerequisites) {\n if (await commandExists(command)) {\n availableCommands.add(command);\n } else {\n missingPrerequisites.push(command);\n }\n }\n\n for (const command of strategyDependencyCommands) {\n if (availableCommands.has(command)) {\n continue;\n }\n\n if (await commandExists(command)) {\n availableCommands.add(command);\n }\n }\n\n const autoInstallSupported = canAutoInstall(\n provider,\n platform,\n missingCommands,\n missingPrerequisites,\n availableCommands\n );\n const available = missingCommands.length === 0;\n\n result.providers[provider.id] = {\n providerId: provider.id,\n available,\n missingCommands,\n missingPrerequisites,\n autoInstallSupported,\n installReadiness: available\n ? \"ready\"\n : autoInstallSupported\n ? missingPrerequisites.length === 0\n ? \"ready\"\n : \"missing_prerequisite\"\n : \"unsupported_platform\",\n manualGuideKeys: provider.install.manualGuideKeys,\n docUrls: provider.install.docUrls,\n };\n }\n\n return result;\n}\n", "/**\n * Session Commands\n */\n\nimport type { ProviderDefinition } from \"@coder-studio/core\";\nimport { z } from \"zod\";\nimport { buildProviderRuntimeStatus } from \"../provider-runtime/runtime-status.js\";\nimport { registerCommand } from \"../ws/dispatch.js\";\n\nfunction getProviderFromRegistry(\n providerId: string,\n registry: ProviderDefinition[]\n): ProviderDefinition | undefined {\n return registry.find((provider) => provider.id === providerId);\n}\n\n// session.list\nregisterCommand(\n \"session.list\",\n z.object({\n workspaceId: z.string(),\n }),\n async (args, ctx) => {\n return ctx.sessionMgr.getForWorkspace(args.workspaceId);\n }\n);\n\n// session.create\nregisterCommand(\n \"session.create\",\n z.object({\n workspaceId: z.string(),\n providerId: z.string(),\n draft: z.string().optional(),\n }),\n async (args, ctx) => {\n // Get workspace\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n const provider = getProviderFromRegistry(args.providerId, ctx.providerRegistry);\n if (!provider) {\n throw { code: \"unknown_provider\", message: `Provider not found: ${args.providerId}` };\n }\n\n const runtimeStatus = await buildProviderRuntimeStatus([provider], ctx.providerRuntimeDeps);\n const providerStatus = runtimeStatus.providers[provider.id];\n\n if (!providerStatus?.available) {\n throw {\n code: \"provider_cli_missing\",\n message: \"Provider CLI is not installed\",\n details: {\n providerId: provider.id,\n missingCommands: providerStatus?.missingCommands ?? provider.requiredCommands,\n },\n };\n }\n\n return ctx.sessionMgr.create({\n workspaceId: args.workspaceId,\n workspacePath: workspace.path,\n providerId: args.providerId,\n provider,\n draft: args.draft,\n });\n }\n);\n\n// session.stop\nregisterCommand(\n \"session.stop\",\n z.object({\n sessionId: z.string(),\n }),\n async (args, ctx) => {\n await ctx.sessionMgr.stop(args.sessionId);\n }\n);\n\n// session.remove\nregisterCommand(\n \"session.remove\",\n z.object({\n sessionId: z.string(),\n }),\n async (args, ctx) => {\n const session = ctx.sessionMgr.get(args.sessionId);\n if (!session) {\n throw { code: \"session_not_found\", message: `Session not found: ${args.sessionId}` };\n }\n\n if (session.state !== \"ended\") {\n throw { code: \"invalid_state\", message: `Cannot remove session in state: ${session.state}` };\n }\n\n ctx.sessionMgr.delete(args.sessionId);\n }\n);\n", "/**\n * Lazy file tree builder.\n * Returns only direct children of a directory (no recursion).\n */\n\nimport type { FileNode } from \"@coder-studio/core\";\nimport { readdir, stat } from \"fs/promises\";\nimport { join, relative } from \"path\";\nimport { createGitignoreFilter, createTreeVisibilityFilter } from \"./gitignore.js\";\n\nexport interface ReadTreeResult {\n path: string;\n children: FileNode[];\n}\n\n/**\n * Builds a file tree for a workspace directory.\n * Only returns direct children of the requested directory (lazy loading).\n * Directories have `children: undefined` to signal \"not loaded yet\".\n *\n * @param rootPath - Workspace root path\n * @param subdir - Optional subdirectory to read from\n * @returns File tree structure with only direct children\n */\nexport async function readTree(rootPath: string, subdir?: string): Promise<ReadTreeResult> {\n const targetPath = subdir ? join(rootPath, subdir) : rootPath;\n const filter = createTreeVisibilityFilter();\n\n const entries = await readdir(targetPath, { withFileTypes: true });\n const nodes: FileNode[] = [];\n\n for (const entry of entries) {\n if (!filter(entry.name)) {\n continue;\n }\n\n const fullPath = join(targetPath, entry.name);\n const relPath = relative(rootPath, fullPath);\n\n if (entry.isDirectory()) {\n nodes.push({\n name: entry.name,\n path: relPath,\n kind: \"dir\",\n children: undefined, // Not loaded yet - client will request on expand\n });\n } else if (entry.isFile()) {\n const stats = await stat(fullPath);\n nodes.push({\n name: entry.name,\n path: relPath,\n kind: \"file\",\n size: stats.size,\n mtime: stats.mtimeMs,\n });\n }\n }\n\n // Sort: directories first, then files, alphabetically within each group\n nodes.sort((a, b) => {\n if (a.kind !== b.kind) {\n return a.kind === \"dir\" ? -1 : 1;\n }\n return a.name.localeCompare(b.name);\n });\n\n return {\n path: subdir || \".\",\n children: nodes,\n };\n}\n\nexport interface SearchFilesResult {\n files: FileNode[];\n}\n\nexport async function searchFiles(\n rootPath: string,\n query: string,\n limit = 10\n): Promise<SearchFilesResult> {\n const normalizedQuery = query.trim().toLowerCase();\n if (!normalizedQuery) {\n return { files: [] };\n }\n\n const matches: Array<{ path: string; name: string; fullPath: string; rank: number }> = [];\n\n async function walk(dirPath: string): Promise<void> {\n const filter = createGitignoreFilter(rootPath, dirPath);\n const entries = await readdir(dirPath, { withFileTypes: true });\n\n const filteredEntries = entries.filter((entry) => filter(entry.name));\n filteredEntries.sort((a, b) => a.name.localeCompare(b.name));\n\n for (const entry of filteredEntries) {\n const fullPath = join(dirPath, entry.name);\n const relPath = relative(rootPath, fullPath);\n\n if (entry.isDirectory()) {\n await walk(fullPath);\n continue;\n }\n\n if (entry.isFile()) {\n const rank = scoreFilenameMatch(entry.name, normalizedQuery);\n if (rank === null) {\n continue;\n }\n\n matches.push({\n path: relPath,\n name: entry.name,\n fullPath,\n rank,\n });\n }\n }\n }\n\n await walk(rootPath);\n\n const files: FileNode[] = [];\n for (const match of matches\n .sort((a, b) => {\n if (a.rank !== b.rank) {\n return a.rank - b.rank;\n }\n\n const nameCompare = a.name.toLowerCase().localeCompare(b.name.toLowerCase());\n if (nameCompare !== 0) {\n return nameCompare;\n }\n\n const depthCompare = a.path.split(\"/\").length - b.path.split(\"/\").length;\n if (depthCompare !== 0) {\n return depthCompare;\n }\n\n return a.path.toLowerCase().localeCompare(b.path.toLowerCase());\n })\n .slice(0, limit)) {\n const stats = await stat(match.fullPath);\n files.push({\n name: match.name,\n path: match.path,\n kind: \"file\",\n size: stats.size,\n mtime: stats.mtimeMs,\n });\n }\n\n return { files };\n}\n\nfunction scoreFilenameMatch(name: string, query: string): number | null {\n const normalizedName = name.toLowerCase();\n const baseName = normalizedName.replace(/\\.[^.]+$/, \"\");\n\n if (normalizedName === query) {\n return 0;\n }\n\n if (baseName === query) {\n return 1;\n }\n\n if (normalizedName.startsWith(query)) {\n return 2;\n }\n\n if (baseName.startsWith(query)) {\n return 3;\n }\n\n if (normalizedName.includes(query)) {\n return 4;\n }\n\n if (baseName.includes(query)) {\n return 5;\n }\n\n if (isSubsequence(query, normalizedName)) {\n return 6;\n }\n\n return null;\n}\n\nfunction isSubsequence(query: string, candidate: string): boolean {\n let index = 0;\n\n for (const char of candidate) {\n if (char === query[index]) {\n index += 1;\n if (index === query.length) {\n return true;\n }\n }\n }\n\n return query.length === 0;\n}\n", "/**\n * File System Commands\n */\n\nimport { z } from \"zod\";\nimport { createDirectory, createFile, deleteEntry, readFile, writeFile } from \"../fs/file-io.js\";\nimport { readTree, searchFiles } from \"../fs/tree.js\";\nimport { registerCommand } from \"../ws/dispatch.js\";\n\n// file.readTree\nregisterCommand(\n \"file.readTree\",\n z.object({\n workspaceId: z.string(),\n subPath: z.string().optional(),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n return readTree(workspace.path, args.subPath);\n }\n);\n\n// file.search\nregisterCommand(\n \"file.search\",\n z.object({\n workspaceId: z.string(),\n query: z.string(),\n limit: z.number().int().positive().max(50).optional(),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n return searchFiles(workspace.path, args.query, args.limit ?? 10);\n }\n);\n\n// file.read\nregisterCommand(\n \"file.read\",\n z.object({\n workspaceId: z.string(),\n path: z.string(),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n return readFile(args.workspaceId, workspace.path, args.path);\n }\n);\n\n// file.create\nregisterCommand(\n \"file.create\",\n z.object({\n workspaceId: z.string(),\n path: z.string(),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n await createFile(workspace.path, args.path);\n ctx.eventBus.emit({\n type: \"fs.dirty\",\n workspaceId: args.workspaceId,\n reason: \"fs_change\",\n });\n return { ok: true };\n }\n);\n\n// file.mkdir\nregisterCommand(\n \"file.mkdir\",\n z.object({\n workspaceId: z.string(),\n path: z.string(),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n await createDirectory(workspace.path, args.path);\n ctx.eventBus.emit({\n type: \"fs.dirty\",\n workspaceId: args.workspaceId,\n reason: \"fs_change\",\n });\n return { ok: true };\n }\n);\n\n// file.delete\nregisterCommand(\n \"file.delete\",\n z.object({\n workspaceId: z.string(),\n path: z.string(),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n await deleteEntry(workspace.path, args.path);\n ctx.eventBus.emit({\n type: \"fs.dirty\",\n workspaceId: args.workspaceId,\n reason: \"fs_change\",\n });\n return { ok: true };\n }\n);\n\n// file.write\nregisterCommand(\n \"file.write\",\n z.object({\n workspaceId: z.string(),\n path: z.string(),\n content: z.string(),\n baseHash: z.string().optional(), // For conflict detection\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n const result = await writeFile(workspace.path, args.path, args.content, args.baseHash);\n ctx.eventBus.emit({\n type: \"fs.dirty\",\n workspaceId: args.workspaceId,\n reason: \"file_content\",\n });\n return result;\n }\n);\n", "/**\n * Git-related constants\n */\n\n/**\n * Common git remote names used for remote branch detection\n */\nexport const GIT_COMMON_REMOTES = [\"origin/\", \"upstream/\"] as const;\n", "/**\n * Git status parser for porcelain=v2 format.\n */\n\nimport type { GitChangeStatus, GitFileChange, GitStatus } from \"@coder-studio/core\";\n\n/**\n * Parses git status --porcelain=v2 --branch output.\n *\n * Format reference: https://git-scm.com/docs/git-status#_porcelain_format_version_2\n *\n * @param porcelainV2 - Output from git status --porcelain=v2 --branch\n * @returns Structured git status\n */\nexport function parseStatus(porcelainV2: string): GitStatus {\n let branch = \"\";\n let ahead = 0;\n let behind = 0;\n let headSha: string | undefined;\n const staged: GitFileChange[] = [];\n const modified: GitFileChange[] = [];\n const untracked: GitFileChange[] = [];\n const deleted: GitFileChange[] = [];\n const records = porcelainV2.includes(\"\\0\")\n ? porcelainV2.split(\"\\0\").filter((record) => record.length > 0)\n : porcelainV2.split(\"\\n\").filter((record) => record.length > 0);\n\n for (let index = 0; index < records.length; index += 1) {\n const record = records[index];\n if (!record) {\n continue;\n }\n\n if (record.startsWith(\"# branch.oid \")) {\n const oid = record.substring(\"# branch.oid \".length);\n if (oid && oid !== \"(initial)\") {\n headSha = oid;\n }\n continue;\n }\n\n if (record.startsWith(\"# branch.head \")) {\n branch = record.substring(\"# branch.head \".length);\n continue;\n }\n\n if (record.startsWith(\"# branch.ab \")) {\n const match = record.match(/# branch\\.ab \\+(\\d+) -(\\d+)/);\n const nextAhead = match?.[1];\n const nextBehind = match?.[2];\n if (nextAhead && nextBehind) {\n ahead = parseInt(nextAhead, 10);\n behind = parseInt(nextBehind, 10);\n }\n continue;\n }\n\n if (record.startsWith(\"1 \")) {\n parseOrdinaryChangedEntry(record, staged, modified, deleted);\n continue;\n }\n\n if (record.startsWith(\"2 \")) {\n const oldPath = records[index + 1];\n parseRenamedEntry(record, oldPath, staged, modified, deleted);\n if (oldPath) {\n index += 1;\n }\n continue;\n }\n\n if (record.startsWith(\"? \")) {\n untracked.push({ path: record.substring(2), status: \"untracked\" });\n }\n }\n\n return {\n branch,\n ahead,\n behind,\n headSha,\n headShortSha: headSha?.slice(0, 7),\n staged,\n modified,\n untracked,\n deleted,\n };\n}\n\n/**\n * Parses a regular changed entry line (format 1).\n */\nfunction parseOrdinaryChangedEntry(\n record: string,\n staged: GitFileChange[],\n modified: GitFileChange[],\n deleted: GitFileChange[]\n): void {\n const parts = record.split(\" \");\n const xy = parts[1]; // XY status codes\n if (!xy) {\n return;\n }\n\n const path = parts.slice(8).join(\" \");\n if (!path) {\n return;\n }\n\n pushChange({ path }, xy, staged, modified, deleted);\n}\n\n/**\n * Parses a renamed entry line (format 2). In NUL-delimited mode the old path\n * is carried in the following record rather than inline.\n */\nfunction parseRenamedEntry(\n record: string,\n oldPathRecord: string | undefined,\n staged: GitFileChange[],\n modified: GitFileChange[],\n deleted: GitFileChange[]\n): void {\n const parts = record.split(\" \");\n const xy = parts[1];\n if (!xy) {\n return;\n }\n\n const pathTokens = parts.slice(9);\n const pathAndMaybeOldPath = pathTokens.join(\" \");\n const inlinePathParts = pathAndMaybeOldPath.split(\"\\t\");\n const fallbackPath =\n !oldPathRecord && inlinePathParts.length === 1 && pathTokens.length > 1\n ? pathTokens.slice(0, -1).join(\" \")\n : undefined;\n const path = fallbackPath ?? inlinePathParts[0];\n if (!path) {\n return;\n }\n\n const oldPath =\n (oldPathRecord && !oldPathRecord.startsWith(\"#\") ? oldPathRecord : undefined) ??\n inlinePathParts[1] ??\n (pathTokens.length > 1 ? pathTokens[pathTokens.length - 1] : undefined);\n pushChange({ path, oldPath }, xy, staged, modified, deleted);\n}\n\nfunction pushChange(\n change: GitFileChange,\n xy: string,\n staged: GitFileChange[],\n modified: GitFileChange[],\n deleted: GitFileChange[]\n): void {\n const indexStatus = xy[0];\n const worktreeStatus = xy[1];\n\n if (indexStatus && indexStatus !== \".\" && indexStatus !== \" \") {\n staged.push({\n ...change,\n status: resolveGitChangeStatus(indexStatus, change.oldPath),\n });\n }\n\n if (!worktreeStatus || worktreeStatus === \".\" || worktreeStatus === \" \") {\n return;\n }\n\n if (worktreeStatus === \"D\") {\n deleted.push({ path: change.path, status: \"deleted\" });\n return;\n }\n\n modified.push({\n path: change.path,\n oldPath: change.oldPath,\n status: resolveGitChangeStatus(worktreeStatus, change.oldPath),\n });\n}\n\nfunction resolveGitChangeStatus(code: string, oldPath?: string): GitChangeStatus {\n switch (code) {\n case \"A\":\n return \"added\";\n case \"D\":\n return \"deleted\";\n case \"R\":\n return \"renamed\";\n case \"C\":\n return oldPath ? \"renamed\" : \"added\";\n case \"U\":\n return \"modified\";\n case \"M\":\n case \"T\":\n default:\n return oldPath ? \"renamed\" : \"modified\";\n }\n}\n", "/**\n * Git CLI operations - Wrapper around git commands.\n */\n\nimport type { GitBranch, GitCommitSummary, GitStatus } from \"@coder-studio/core\";\nimport { execFile } from \"child_process\";\nimport { mkdir, mkdtemp, rm, writeFile } from \"fs/promises\";\nimport os from \"os\";\nimport path from \"path\";\nimport { GIT_COMMON_REMOTES } from \"../constants/git.js\";\nimport { parseStatus } from \"./status-parser.js\";\n\nexport interface GitCommandResult {\n stdout: string;\n stderr: string;\n}\n\ninterface RunGitOptions {\n env?: NodeJS.ProcessEnv;\n timeoutMs?: number;\n stdin?: string;\n config?: GitConfigOverride[];\n}\n\ninterface GitRemoteBranchTarget {\n remote: string;\n branch: string;\n}\n\ntype GitConfigOverride = [key: string, value: string];\n\nexport interface GitHttpAuth {\n username: string;\n password: string;\n}\n\ninterface GitSyncSuccessResult {\n success: boolean;\n message: string;\n remote?: string;\n branch?: string;\n updated?: boolean;\n}\n\nexport interface GitAuthFailureDetails {\n operation: \"push\" | \"pull\" | \"fetch\";\n remote?: string;\n remoteUrl?: string;\n remoteLabel: string;\n host?: string;\n reason: \"missing_credentials\" | \"invalid_credentials\" | \"authorization_failed\";\n authMode: \"username_password\" | \"unsupported\";\n canPrompt: boolean;\n usernameHint?: string;\n}\n\nconst GIT_NETWORK_TIMEOUT_MS = 3 * 60 * 1000;\n\n/**\n * Executes a git command in the specified working directory.\n *\n * @param cwd - Working directory\n * @param args - Git command arguments\n * @returns Command output\n */\nexport async function runGit(\n cwd: string,\n args: string[],\n options: RunGitOptions = {}\n): Promise<GitCommandResult> {\n return new Promise((resolve, reject) => {\n const gitArgs = [\n ...(options.config?.flatMap(([key, value]) => [\"-c\", `${key}=${value}`]) ?? []),\n ...args,\n ];\n\n const child = execFile(\n \"git\",\n gitArgs,\n {\n cwd,\n env: {\n ...process.env,\n GIT_TERMINAL_PROMPT: \"0\",\n // Force C locale so prompt detection (e.g. askpass `grep \"username\"`)\n // and parsers do not break on systems running git in another language.\n LC_ALL: \"C\",\n LANG: \"C\",\n ...options.env,\n },\n maxBuffer: 10 * 1024 * 1024,\n timeout: options.timeoutMs,\n windowsHide: true,\n },\n (err, stdout, stderr) => {\n if (err) {\n reject(new GitError(err.message, stderr));\n } else {\n resolve({ stdout, stderr });\n }\n }\n );\n\n if (options.stdin !== undefined && child.stdin) {\n child.stdin.on(\"error\", () => {});\n child.stdin.end(options.stdin);\n }\n });\n}\n\n/**\n * Error thrown when git command fails.\n */\nexport class GitError extends Error {\n constructor(\n message: string,\n public readonly stderr: string\n ) {\n super(message);\n this.name = \"GitError\";\n }\n}\n\n/**\n * Error thrown when a git network operation fails authentication.\n * The dispatcher serializes `code` and `details` onto the protocol error.\n */\nexport class GitAuthError extends Error {\n constructor(\n message: string,\n public readonly code: \"git_auth_required\" | \"git_auth_failed\",\n public readonly details: GitAuthFailureDetails\n ) {\n super(message);\n this.name = \"GitAuthError\";\n }\n}\n\ninterface GitAuthContext {\n remote?: string;\n remoteUrl?: string;\n operation: \"push\" | \"pull\" | \"fetch\";\n attemptedCredentialAuth?: boolean;\n}\n\ninterface RemoteUrlMetadata {\n protocol?: string;\n host?: string;\n path?: string;\n sanitizedUrl?: string;\n canPrompt: boolean;\n}\n\ninterface PreparedGitAuthExecution {\n env?: NodeJS.ProcessEnv;\n config?: GitConfigOverride[];\n cleanup: () => Promise<void>;\n}\n\n/**\n * Get git status for a workspace.\n */\nexport async function getGitStatus(cwd: string): Promise<GitStatus> {\n const { stdout: statusOutput } = await runGit(cwd, [\n \"status\",\n \"--porcelain=v2\",\n \"-z\",\n \"--branch\",\n \"--untracked-files=all\",\n ]);\n const status = parseStatus(statusOutput);\n\n if (!status.headSha) {\n return status;\n }\n\n const { stdout: headSubjectOutput } = await runGit(cwd, [\"show\", \"-s\", \"--format=%s\", \"HEAD\"]);\n return {\n ...status,\n headSubject: headSubjectOutput.trim(),\n };\n}\n\n/**\n * Get recent commit history for the current HEAD.\n */\nexport async function getGitHistory(cwd: string, limit = 5): Promise<GitCommitSummary[]> {\n try {\n const { stdout } = await runGit(cwd, [\n \"log\",\n `--max-count=${Math.max(1, limit)}`,\n \"--format=%H%x1f%h%x1f%s%x1f%an%x1f%at%x1e\",\n ]);\n\n return stdout\n .split(\"\\x1e\")\n .map((record) => record.trim())\n .filter((record) => record.length > 0)\n .map((record) => {\n const [sha = \"\", shortSha = \"\", subject = \"\", authorName = \"\", authoredAt = \"0\"] =\n record.split(\"\\x1f\");\n return {\n sha,\n shortSha,\n subject,\n authorName,\n authoredAt: Number.parseInt(authoredAt, 10) * 1000,\n };\n })\n .filter((entry) => entry.sha && entry.subject);\n } catch (error) {\n if (error instanceof GitError && /does not have any commits yet/i.test(error.stderr)) {\n return [];\n }\n\n throw error;\n }\n}\n\n/**\n * Get the full patch for a specific commit.\n */\nexport async function getGitCommitDiff(cwd: string, sha: string): Promise<string> {\n const { stdout } = await runGit(cwd, [\n \"show\",\n \"--format=medium\",\n \"--no-color\",\n \"--end-of-options\",\n sha,\n ]);\n return stdout;\n}\n\n/**\n * Get compact git status text for supervisor evaluation prompts.\n */\nexport async function getGitStatusSummary(cwd: string): Promise<string> {\n const { stdout } = await runGit(cwd, [\"status\", \"--short\"]);\n return stdout.trim();\n}\n\n/**\n * Get compact git diff stats for supervisor evaluation prompts.\n */\nexport async function getGitDiffStatSummary(cwd: string): Promise<string> {\n const { stdout } = await runGit(cwd, [\"diff\", \"--stat\"]);\n return stdout.trim();\n}\n\n/**\n * Stage files for commit.\n */\nexport async function stageFiles(cwd: string, paths: string[]): Promise<void> {\n if (paths.length === 0) return;\n await runGit(cwd, [\"add\", ...paths]);\n}\n\n/**\n * Unstage files.\n */\nexport async function unstageFiles(cwd: string, paths: string[]): Promise<void> {\n if (paths.length === 0) return;\n await runGit(cwd, [\"reset\", \"HEAD\", \"--\", ...paths]);\n}\n\n/**\n * Discard changes to files.\n */\nexport async function discardChanges(cwd: string, paths: string[]): Promise<void> {\n if (paths.length === 0) return;\n\n const trackedPaths: string[] = [];\n const untrackedPaths: string[] = [];\n\n for (const path of paths) {\n try {\n await runGit(cwd, [\"ls-files\", \"--error-unmatch\", \"--\", path]);\n trackedPaths.push(path);\n } catch {\n untrackedPaths.push(path);\n }\n }\n\n if (trackedPaths.length > 0) {\n await runGit(cwd, [\"restore\", \"--staged\", \"--worktree\", \"--\", ...trackedPaths]);\n }\n\n if (untrackedPaths.length > 0) {\n await runGit(cwd, [\"clean\", \"-fd\", \"--\", ...untrackedPaths]);\n }\n}\n\n/**\n * Create a commit.\n */\nexport async function commitChanges(cwd: string, message: string): Promise<{ sha: string }> {\n const { stdout } = await runGit(cwd, [\"commit\", \"-m\", message]);\n\n // Extract SHA from output\n const match = stdout.match(/\\[.* ([a-f0-9]+)\\]/);\n const sha = match?.[1] ?? \"\";\n\n return { sha };\n}\n\n/**\n * Push changes to remote.\n */\nexport async function runGitPush(\n cwd: string,\n options?: {\n remote?: string;\n branch?: string;\n force?: boolean;\n auth?: GitHttpAuth;\n }\n): Promise<GitSyncSuccessResult> {\n const args = [\"push\"];\n let remote = options?.remote;\n let branch = options?.branch;\n\n if (options?.force) {\n args.push(\"--force\");\n }\n\n if (!remote || !branch) {\n const pushTarget = await resolveRemoteBranchTarget(cwd, \"push\");\n remote = remote ?? pushTarget?.remote;\n branch = branch ?? pushTarget?.branch;\n }\n\n if (!remote || !branch) {\n const upstreamTarget = await resolveRemoteBranchTarget(cwd, \"upstream\");\n remote = remote ?? upstreamTarget?.remote;\n branch = branch ?? upstreamTarget?.branch;\n }\n\n if (!remote && branch) {\n remote = (await getPreferredRemote(cwd)) ?? \"origin\";\n }\n\n if (!remote) {\n remote = (await getPreferredRemote(cwd)) ?? undefined;\n }\n\n const summaryBranch = branch ?? (await getCurrentBranchName(cwd));\n\n if (remote && branch) {\n args.push(remote, `HEAD:${branch}`);\n } else if (remote) {\n args.push(\"--set-upstream\", remote, \"HEAD\");\n }\n const remoteUrl = remote ? await getRemoteUrl(cwd, remote) : null;\n const remoteMetadata = parseRemoteUrlMetadata(remoteUrl ?? undefined);\n const authExecution = await prepareGitAuthExecution(options?.auth, remoteMetadata);\n\n try {\n const { stdout, stderr } = await runGit(cwd, args, {\n timeoutMs: GIT_NETWORK_TIMEOUT_MS,\n env: authExecution.env,\n config: authExecution.config,\n });\n\n if (options?.auth) {\n await persistGitHttpCredentials(cwd, options.auth, remoteMetadata);\n }\n\n return {\n success: true,\n message: \"Push completed successfully\",\n remote,\n branch: summaryBranch,\n updated: !isPushUpToDate(stdout, stderr),\n };\n } catch (error) {\n throw normalizeGitAuthFailure(error, {\n operation: \"push\",\n remote,\n remoteUrl: remoteMetadata.sanitizedUrl ?? remoteUrl ?? undefined,\n attemptedCredentialAuth: Boolean(options?.auth),\n });\n } finally {\n await authExecution.cleanup();\n }\n}\n\n/**\n * Pull changes from remote.\n */\nexport async function runGitPull(\n cwd: string,\n options?: {\n remote?: string;\n branch?: string;\n auth?: GitHttpAuth;\n }\n): Promise<GitSyncSuccessResult & { updatedFiles?: string[] }> {\n const args = [\"pull\"];\n let remote = options?.remote;\n let branch = options?.branch;\n\n if (!remote || !branch) {\n const upstreamTarget = await resolveRemoteBranchTarget(cwd, \"upstream\");\n remote = remote ?? upstreamTarget?.remote;\n branch = branch ?? upstreamTarget?.branch;\n }\n\n if (!remote && branch) {\n remote = (await getPreferredRemote(cwd)) ?? \"origin\";\n }\n\n const summaryBranch = branch ?? (await getCurrentBranchName(cwd));\n\n if (remote && branch) {\n args.push(remote, branch);\n }\n const remoteUrl = remote ? await getRemoteUrl(cwd, remote) : null;\n const remoteMetadata = parseRemoteUrlMetadata(remoteUrl ?? undefined);\n const authExecution = await prepareGitAuthExecution(options?.auth, remoteMetadata);\n\n try {\n const { stdout, stderr } = await runGit(cwd, args, {\n timeoutMs: GIT_NETWORK_TIMEOUT_MS,\n env: authExecution.env,\n config: authExecution.config,\n });\n\n if (options?.auth) {\n await persistGitHttpCredentials(cwd, options.auth, remoteMetadata);\n }\n\n // Parse updated files from output\n const updatedFiles: string[] = [];\n const fileMatches = stdout.matchAll(\n /Updating\\s+([a-f0-9]+)\\.\\.\\.([a-f0-9]+)\\nFast-forward\\n([\\s\\S]*)/g\n );\n for (const match of fileMatches) {\n const filesSection = match[3] ?? \"\";\n const fileLines = filesSection.split(\"\\n\").filter((line) => line.trim());\n for (const line of fileLines) {\n const fileMatch = line.match(/^\\s+\\S+\\s+(\\S+)/);\n if (fileMatch && fileMatch[1]) {\n updatedFiles.push(fileMatch[1]);\n }\n }\n }\n\n return {\n success: true,\n message: \"Pull completed successfully\",\n remote,\n branch: summaryBranch,\n updated: !isPullUpToDate(stdout, stderr),\n updatedFiles,\n };\n } catch (error) {\n throw normalizeGitAuthFailure(error, {\n operation: \"pull\",\n remote,\n remoteUrl: remoteMetadata.sanitizedUrl ?? remoteUrl ?? undefined,\n attemptedCredentialAuth: Boolean(options?.auth),\n });\n } finally {\n await authExecution.cleanup();\n }\n}\n\n/**\n * Fetch remote refs without merging. Used by manual fetch + background auto-fetch.\n */\nexport interface RunGitFetchOptions {\n remote?: string;\n prune?: boolean;\n auth?: GitHttpAuth;\n timeoutMs?: number;\n}\n\nexport async function runGitFetch(\n cwd: string,\n options?: RunGitFetchOptions\n): Promise<{ success: boolean; message: string; updatedRefs: string[] }> {\n const args = [\"fetch\"];\n const remote = options?.remote;\n const metadataRemote = remote ?? (await getPreferredRemote(cwd)) ?? undefined;\n const prune = options?.prune ?? true;\n\n if (remote) {\n args.push(remote);\n } else {\n args.push(\"--all\");\n }\n\n if (prune) {\n args.push(\"--prune\");\n }\n\n const remoteUrl = metadataRemote ? await getRemoteUrl(cwd, metadataRemote) : null;\n const remoteMetadata = parseRemoteUrlMetadata(remoteUrl ?? undefined);\n const authExecution = await prepareGitAuthExecution(options?.auth, remoteMetadata);\n\n try {\n const { stdout, stderr } = await runGit(cwd, args, {\n timeoutMs: options?.timeoutMs ?? GIT_NETWORK_TIMEOUT_MS,\n env: authExecution.env,\n config: authExecution.config,\n });\n\n if (options?.auth) {\n await persistGitHttpCredentials(cwd, options.auth, remoteMetadata);\n }\n\n const message = stdout || stderr || \"Fetch completed successfully\";\n return {\n success: true,\n message,\n updatedRefs: parseFetchUpdatedRefs(stderr),\n };\n } catch (error) {\n throw normalizeGitAuthFailure(error, {\n operation: \"fetch\",\n remote: metadataRemote,\n remoteUrl: remoteMetadata.sanitizedUrl ?? remoteUrl ?? undefined,\n attemptedCredentialAuth: Boolean(options?.auth),\n });\n } finally {\n await authExecution.cleanup();\n }\n}\n\nfunction parseFetchUpdatedRefs(stderr: string): string[] {\n const refs: string[] = [];\n for (const rawLine of stderr.split(\"\\n\")) {\n const line = rawLine.trimEnd();\n const arrowIndex = line.indexOf(\" -> \");\n if (arrowIndex < 0) continue;\n const target = line.slice(arrowIndex + 4).trim();\n if (!target) continue;\n refs.push(target);\n }\n return refs;\n}\n\n/**\n * Checkout a branch or commit.\n */\nexport async function runGitCheckout(\n cwd: string,\n ref: string,\n options?: {\n createBranch?: boolean;\n }\n): Promise<{ success: boolean; message: string; branch?: string }> {\n const args = [\"checkout\"];\n const formatCheckoutError = (error: unknown, fallbackMessage: string) =>\n error instanceof GitError\n ? error.stderr.trim() || error.message || fallbackMessage\n : fallbackMessage;\n\n // Detect remote branch refs by querying actual configured remotes\n let isRemoteRef = false;\n try {\n const { stdout: remoteList } = await runGit(cwd, [\"remote\"]);\n const remotes = remoteList.trim().split(\"\\n\").filter(Boolean);\n // Check if ref starts with any configured remote (e.g., 'origin/main')\n isRemoteRef = remotes.some((remote) => ref.startsWith(`${remote}/`));\n } catch {\n // Fall back to common remotes if git remote fails\n isRemoteRef = GIT_COMMON_REMOTES.some((remote) => ref.startsWith(remote));\n }\n\n // If remote branch ref, auto-create tracking branch\n if (isRemoteRef && !options?.createBranch) {\n const remoteSeparatorIndex = ref.indexOf(\"/\");\n const branchName = remoteSeparatorIndex >= 0 ? ref.slice(remoteSeparatorIndex + 1) : ref;\n\n try {\n await runGit(cwd, [\"show-ref\", \"--verify\", \"--quiet\", `refs/heads/${branchName}`]);\n const { stdout, stderr } = await runGit(cwd, [\"checkout\", branchName]);\n const message = stdout || stderr || `Checkout to ${branchName} completed`;\n return { success: true, message, branch: branchName };\n } catch {\n args.push(\"-b\", branchName, ref);\n }\n\n try {\n const { stdout, stderr } = await runGit(cwd, args);\n const message = stdout || stderr || `Checkout to ${ref} completed`;\n\n // For remote branch checkout, we know the branch name from the ref\n return { success: true, message, branch: branchName };\n } catch (error) {\n return {\n success: false,\n message: formatCheckoutError(error, `Failed to checkout remote branch '${ref}'`),\n };\n }\n } else {\n // Original logic for local branches and createBranch flag\n if (options?.createBranch) {\n args.push(\"-b\");\n }\n args.push(ref);\n\n try {\n const { stdout, stderr } = await runGit(cwd, args);\n\n // Extract branch name from output\n const branchMatch = stdout.match(/Switched to (?:a new branch|branch) '([^']+)'/);\n const branch = branchMatch?.[1] ?? ref;\n\n const message = stdout || stderr || `Checkout to ${ref} completed`;\n\n return { success: true, message, branch };\n } catch (error) {\n return {\n success: false,\n message: formatCheckoutError(error, `Failed to checkout '${ref}'`),\n };\n }\n }\n}\n\n/**\n * Create a new branch.\n */\nexport async function runGitCreateBranch(\n cwd: string,\n branchName: string,\n options?: {\n startPoint?: string;\n }\n): Promise<{ success: boolean; message: string; branch: string }> {\n const args = [\"branch\", branchName];\n\n if (options?.startPoint) {\n args.push(options.startPoint);\n }\n\n await runGit(cwd, args);\n\n return { success: true, message: `Branch '${branchName}' created`, branch: branchName };\n}\n\n/**\n * List all branches (local and remote) with metadata.\n *\n * @param cwd - Working directory of the git repository\n * @returns Object with branches array and current branch name\n * - branches: Array of GitBranch objects with metadata\n * - current: Current branch name (empty string if detached HEAD or no commits)\n * @throws {GitError} If git commands fail (e.g., not a git repository)\n */\nexport async function runGitListBranches(cwd: string): Promise<{\n branches: GitBranch[];\n current: string;\n}> {\n // Get local branches\n const { stdout: localOutput } = await runGit(cwd, [\"branch\", \"--list\"]);\n const { stdout: localVerboseOutput } = await runGit(cwd, [\"branch\", \"--list\", \"-vv\"]);\n\n // Get remote branches\n const { stdout: remoteOutput } = await runGit(cwd, [\"branch\", \"-r\"]);\n\n const branches: GitBranch[] = [];\n let current = \"\";\n const linkedWorktreePathsByBranch = new Map<string, string>();\n\n const localVerboseLines = localVerboseOutput.split(\"\\n\").filter((line) => line.trim());\n for (const line of localVerboseLines) {\n const normalizedLine = line.replace(/^[*+ ]\\s+/, \"\");\n const branchMatch = normalizedLine.match(/^([^\\s]+)\\s+/);\n const worktreeMatch = line.match(/\\((.+?)\\)\\s/);\n if (!branchMatch?.[1] || !worktreeMatch?.[1]) {\n continue;\n }\n\n const worktreePath = worktreeMatch[1];\n if (worktreePath.startsWith(\"/\") || worktreePath.startsWith(\"~\")) {\n linkedWorktreePathsByBranch.set(branchMatch[1], worktreePath);\n }\n }\n\n // Parse local branches\n const localLines = localOutput.split(\"\\n\").filter((line) => line.trim());\n for (const line of localLines) {\n const isCurrent = line.startsWith(\"*\");\n const name = line.replace(/^[*+ ]\\s+/, \"\").trim();\n\n // Skip detached HEAD indicator\n if (name.startsWith(\"(HEAD detached\")) {\n if (isCurrent) {\n current = \"\"; // Empty string indicates detached state\n }\n continue; // Don't add to branches array\n }\n\n if (linkedWorktreePathsByBranch.has(name) && !isCurrent) {\n continue;\n }\n\n branches.push({\n name,\n isRemote: false,\n isCurrent,\n linkedWorktreePath: linkedWorktreePathsByBranch.get(name),\n });\n if (isCurrent) {\n current = name;\n }\n }\n\n // Parse remote branches\n const remoteLines = remoteOutput.split(\"\\n\").filter((line) => line.trim());\n for (const line of remoteLines) {\n const fullName = line.trim();\n if (fullName.includes(\" -> \")) {\n continue;\n }\n\n const [remote] = fullName.split(\"/\");\n branches.push({\n name: fullName, // Show full name \"origin/main\"\n isRemote: true,\n isCurrent: false,\n remote,\n });\n }\n\n return { branches, current };\n}\n\nasync function resolveRemoteBranchTarget(\n cwd: string,\n mode: \"push\" | \"upstream\"\n): Promise<GitRemoteBranchTarget | null> {\n const symbolicRef = mode === \"push\" ? \"@{push}\" : \"@{upstream}\";\n\n try {\n const { stdout } = await runGit(cwd, [\n \"rev-parse\",\n \"--abbrev-ref\",\n \"--symbolic-full-name\",\n symbolicRef,\n ]);\n const fullRef = stdout.trim();\n if (!fullRef) {\n return null;\n }\n\n const remoteSeparatorIndex = fullRef.indexOf(\"/\");\n if (remoteSeparatorIndex <= 0 || remoteSeparatorIndex === fullRef.length - 1) {\n return null;\n }\n\n return {\n remote: fullRef.slice(0, remoteSeparatorIndex),\n branch: fullRef.slice(remoteSeparatorIndex + 1),\n };\n } catch {\n return null;\n }\n}\n\nasync function getCurrentBranchName(cwd: string): Promise<string | undefined> {\n try {\n const { stdout } = await runGit(cwd, [\"branch\", \"--show-current\"]);\n const branch = stdout.trim();\n return branch || undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction isPushUpToDate(stdout: string, stderr: string): boolean {\n return /Everything up-to-date/i.test(`${stdout}\\n${stderr}`);\n}\n\nfunction isPullUpToDate(stdout: string, stderr: string): boolean {\n return /Already up[ -]to[ -]date\\.?/i.test(`${stdout}\\n${stderr}`);\n}\n\nasync function getPreferredRemote(cwd: string): Promise<string | null> {\n try {\n const { stdout } = await runGit(cwd, [\"remote\"]);\n const remotes = stdout\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean);\n\n if (remotes.length === 0) {\n return null;\n }\n\n return remotes.includes(\"origin\") ? \"origin\" : (remotes[0] ?? null);\n } catch {\n return null;\n }\n}\n\nasync function getRemoteUrl(cwd: string, remote: string): Promise<string | null> {\n try {\n const { stdout } = await runGit(cwd, [\"remote\", \"get-url\", remote]);\n const value = stdout.trim();\n return value || null;\n } catch {\n return null;\n }\n}\n\nasync function prepareGitAuthExecution(\n auth: GitHttpAuth | undefined,\n remoteMetadata: RemoteUrlMetadata\n): Promise<PreparedGitAuthExecution> {\n if (!auth || !remoteMetadata.canPrompt || !remoteMetadata.host) {\n return {\n cleanup: async () => {},\n };\n }\n\n const tempDir = await mkdtemp(path.join(os.tmpdir(), \"coder-studio-git-auth-\"));\n const hooksDir = path.join(tempDir, \"hooks\");\n const askPassPath = path.join(tempDir, \"askpass.sh\");\n\n await mkdir(hooksDir, { recursive: true, mode: 0o700 });\n await writeFile(\n askPassPath,\n [\n \"#!/bin/sh\",\n 'prompt=$(printf \"%s\" \"$1\" | tr \"[:upper:]\" \"[:lower:]\")',\n `if printf \"%s\" \"$prompt\" | grep -q \"username\"; then`,\n ' printf \"%s\" \"$CODER_STUDIO_GIT_AUTH_USERNAME\"',\n \"else\",\n ' printf \"%s\" \"$CODER_STUDIO_GIT_AUTH_PASSWORD\"',\n \"fi\",\n \"\",\n ].join(\"\\n\"),\n { mode: 0o700 }\n );\n\n return {\n env: {\n GIT_ASKPASS: askPassPath,\n SSH_ASKPASS: askPassPath,\n GCM_INTERACTIVE: \"never\",\n CODER_STUDIO_GIT_AUTH_USERNAME: auth.username,\n CODER_STUDIO_GIT_AUTH_PASSWORD: auth.password,\n },\n config: [\n [\"core.hooksPath\", hooksDir],\n [\"credential.helper\", \"\"],\n [\"credential.username\", auth.username],\n ],\n cleanup: async () => {\n await rm(tempDir, { recursive: true, force: true });\n },\n };\n}\n\nasync function persistGitHttpCredentials(\n cwd: string,\n auth: GitHttpAuth,\n remoteMetadata: RemoteUrlMetadata\n): Promise<void> {\n if (!remoteMetadata.canPrompt || !remoteMetadata.host || !remoteMetadata.path) {\n return;\n }\n\n let helperConfigured = false;\n try {\n if (remoteMetadata.sanitizedUrl) {\n const { stdout } = await runGit(\n cwd,\n [\"config\", \"--get-urlmatch\", \"credential.helper\", remoteMetadata.sanitizedUrl],\n {\n timeoutMs: 30000,\n }\n );\n helperConfigured = stdout\n .split(\"\\n\")\n .map((line) => line.trim())\n .some(Boolean);\n } else {\n const { stdout } = await runGit(\n cwd,\n [\"config\", \"--get-regexp\", \"^credential(\\\\..+)?\\\\.helper$\"],\n {\n timeoutMs: 30000,\n }\n );\n helperConfigured = stdout\n .split(\"\\n\")\n .map((line) => line.trim())\n .some(Boolean);\n }\n } catch {\n helperConfigured = false;\n }\n\n if (!helperConfigured) {\n return;\n }\n\n let useHttpPath = false;\n try {\n const configArgs = remoteMetadata.sanitizedUrl\n ? [\"config\", \"--get-urlmatch\", \"credential.useHttpPath\", remoteMetadata.sanitizedUrl]\n : [\"config\", \"--get\", \"credential.useHttpPath\"];\n const { stdout } = await runGit(cwd, configArgs, {\n timeoutMs: 30000,\n });\n useHttpPath = isGitBooleanTrue(stdout);\n } catch {\n useHttpPath = false;\n }\n\n const credentialInput = [\n `protocol=${remoteMetadata.protocol ?? \"https\"}`,\n `host=${remoteMetadata.host}`,\n ...(useHttpPath ? [`path=${remoteMetadata.path}`] : []),\n `username=${auth.username}`,\n `password=${auth.password}`,\n \"\",\n \"\",\n ].join(\"\\n\");\n\n try {\n await runGit(cwd, [\"credential\", \"approve\"], {\n stdin: credentialInput,\n timeoutMs: 30000,\n });\n } catch {\n // Persisting credentials is best-effort and should not fail the git operation.\n }\n}\n\nfunction normalizeGitAuthFailure(error: unknown, context: GitAuthContext): unknown {\n if (!(error instanceof GitError)) {\n return error;\n }\n\n const details = classifyGitAuthFailure(error, context);\n if (!details) {\n return error;\n }\n\n const code = details.canPrompt ? \"git_auth_required\" : \"git_auth_failed\";\n return new GitAuthError(formatGitAuthFailureMessage(details), code, details);\n}\n\nexport function classifyGitAuthFailure(\n error: GitError,\n context: GitAuthContext\n): GitAuthFailureDetails | null {\n const output = `${error.message}\\n${error.stderr}`.toLowerCase();\n const remoteMetadata = describeRemote(context.remote, context.remoteUrl);\n const authPatterns = [\n \"terminal prompts disabled\",\n \"could not read username\",\n \"could not read password\",\n \"authentication failed\",\n \"http basic: access denied\",\n \"invalid username or password\",\n \"invalid username or token\",\n \"support for password authentication was removed\",\n \"requested url returned error: 401\",\n \"requested url returned error: 403\",\n \"write access to repository not granted\",\n \"access denied\",\n \"authentication required\",\n \"permission denied (publickey)\",\n \"could not read from remote repository\",\n ];\n\n if (!authPatterns.some((pattern) => output.includes(pattern))) {\n return null;\n }\n\n const attemptedCredentialAuth = context.attemptedCredentialAuth ?? false;\n const reason =\n output.includes(\"requested url returned error: 403\") ||\n output.includes(\"write access to repository not granted\")\n ? \"authorization_failed\"\n : output.includes(\"terminal prompts disabled\") ||\n output.includes(\"could not read username\") ||\n output.includes(\"could not read password\")\n ? \"missing_credentials\"\n : attemptedCredentialAuth || output.includes(\"access denied\")\n ? \"invalid_credentials\"\n : \"missing_credentials\";\n\n return {\n operation: context.operation,\n remote: context.remote,\n remoteUrl: remoteMetadata.remoteUrl,\n remoteLabel: remoteMetadata.remoteLabel,\n host: remoteMetadata.host,\n reason,\n authMode: remoteMetadata.canPrompt ? \"username_password\" : \"unsupported\",\n canPrompt: remoteMetadata.canPrompt,\n usernameHint: remoteMetadata.usernameHint,\n };\n}\n\nfunction formatGitAuthFailureMessage(details: GitAuthFailureDetails): string {\n if (!details.canPrompt) {\n return `Authentication failed for ${details.remoteLabel}. Configure SSH keys or a credential helper, then try again.`;\n }\n\n if (details.reason === \"authorization_failed\") {\n return `Credentials for ${details.remoteLabel} were accepted, but this account is not allowed to ${details.operation}.`;\n }\n\n if (details.reason === \"invalid_credentials\") {\n return `Credentials for ${details.remoteLabel} were rejected. Enter a valid username and password or personal access token to continue.`;\n }\n\n return `Authentication is required to ${details.operation} ${details.remoteLabel}. Enter your Git username and password or personal access token to continue.`;\n}\n\nfunction describeRemote(remote: string | undefined, remoteUrl: string | undefined) {\n const metadata = parseRemoteUrlMetadata(remoteUrl);\n const remoteLabel = metadata.host\n ? `${remote ?? \"remote\"} (${metadata.host})`\n : (remote ?? \"remote\");\n\n return {\n remoteUrl: metadata.sanitizedUrl ?? remoteUrl,\n remoteLabel,\n host: metadata.host,\n canPrompt: metadata.canPrompt,\n usernameHint: undefined,\n };\n}\n\nfunction parseRemoteUrlMetadata(remoteUrl: string | undefined): RemoteUrlMetadata {\n if (!remoteUrl) {\n return {\n canPrompt: false,\n };\n }\n\n try {\n const parsed = new URL(remoteUrl);\n const pathName = parsed.pathname.replace(/^\\/+/, \"\");\n const sanitized = new URL(remoteUrl);\n sanitized.username = \"\";\n sanitized.password = \"\";\n return {\n protocol: parsed.protocol.replace(/:$/, \"\"),\n host: parsed.host || undefined,\n path: pathName || undefined,\n sanitizedUrl: sanitized.toString(),\n canPrompt: parsed.protocol === \"http:\" || parsed.protocol === \"https:\",\n };\n } catch {\n const sshMatch = remoteUrl.match(/^(?<user>[^@]+)@(?<host>[^:]+):.+$/);\n if (sshMatch?.groups?.host) {\n return {\n protocol: \"ssh\",\n host: sshMatch.groups.host,\n path: remoteUrl.split(\":\").slice(1).join(\":\") || undefined,\n sanitizedUrl: remoteUrl,\n canPrompt: false,\n };\n }\n\n return {\n sanitizedUrl: remoteUrl,\n canPrompt: false,\n };\n }\n}\n\nfunction isGitBooleanTrue(value: string): boolean {\n return [\"true\", \"yes\", \"on\", \"1\"].includes(value.trim().toLowerCase());\n}\n", "/**\n * Git diff operations.\n */\n\nimport { mkdtemp, rm } from \"fs/promises\";\nimport os from \"os\";\nimport path from \"path\";\nimport { GitError, runGit } from \"./cli.js\";\n\nasync function isTrackedPath(cwd: string, filePath: string): Promise<boolean> {\n try {\n await runGit(cwd, [\"ls-files\", \"--error-unmatch\", \"--\", filePath]);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function getUntrackedFileDiff(cwd: string, filePath: string): Promise<string> {\n const tempDir = await mkdtemp(path.join(os.tmpdir(), \"coder-studio-git-diff-\"));\n const tempIndex = path.join(tempDir, \"index\");\n\n try {\n try {\n await runGit(cwd, [\"read-tree\", \"HEAD\"], {\n env: { GIT_INDEX_FILE: tempIndex },\n });\n } catch (error) {\n if (!(error instanceof GitError)) {\n throw error;\n }\n\n // Fresh repositories may not have HEAD yet; an empty temporary index is\n // sufficient for intent-to-add diffs in that case.\n await runGit(cwd, [\"read-tree\", \"--empty\"], {\n env: { GIT_INDEX_FILE: tempIndex },\n });\n }\n\n await runGit(cwd, [\"add\", \"-N\", \"--\", filePath], {\n env: { GIT_INDEX_FILE: tempIndex },\n });\n\n const result = await runGit(cwd, [\"diff\", \"--\", filePath], {\n env: { GIT_INDEX_FILE: tempIndex },\n });\n return result.stdout;\n } finally {\n await rm(tempDir, { recursive: true, force: true });\n }\n}\n\n/**\n * Gets diff for a specific file.\n *\n * @param cwd - Working directory\n * @param path - File path (relative to cwd)\n * @param staged - Whether to show staged diff\n * @returns Diff output\n */\nexport async function getFileDiff(cwd: string, path: string, staged = false): Promise<string> {\n if (!staged && !(await isTrackedPath(cwd, path))) {\n return getUntrackedFileDiff(cwd, path);\n }\n\n const args = staged ? [\"diff\", \"--staged\", \"--\", path] : [\"diff\", \"--\", path];\n const result = await runGit(cwd, args);\n return result.stdout;\n}\n\n/**\n * Gets full diff for the working directory.\n *\n * @param cwd - Working directory\n * @param staged - Whether to show staged diff\n * @returns Diff output\n */\nexport async function getDiff(cwd: string, staged = false): Promise<string> {\n const args = staged ? [\"diff\", \"--staged\"] : [\"diff\"];\n const result = await runGit(cwd, args);\n return result.stdout;\n}\n", "import type { CommandContext } from \"../ws/dispatch.js\";\n\nexport function emitGitStateChanged(\n ctx: CommandContext,\n workspaceId: string,\n options?: {\n treeChanged?: boolean;\n branchChanged?: boolean;\n worktreeChanged?: boolean;\n }\n) {\n ctx.eventBus.emit({\n type: \"git.state.changed\",\n workspaceId,\n treeChanged: options?.treeChanged,\n branchChanged: options?.branchChanged,\n worktreeChanged: options?.worktreeChanged,\n });\n}\n", "/**\n * Git Commands\n */\n\nimport { z } from \"zod\";\nimport {\n commitChanges,\n discardChanges,\n GitAuthError,\n getGitCommitDiff,\n getGitHistory,\n getGitStatus,\n runGitCheckout,\n runGitCreateBranch,\n runGitFetch,\n runGitListBranches,\n runGitPull,\n runGitPush,\n stageFiles,\n unstageFiles,\n} from \"../git/cli.js\";\nimport { getFileDiff } from \"../git/diff.js\";\nimport type { CommandContext } from \"../ws/dispatch.js\";\nimport { registerCommand } from \"../ws/dispatch.js\";\nimport { emitGitStateChanged } from \"./git-events.js\";\n\nconst gitHttpAuthSchema = z.object({\n username: z.string(),\n password: z.string(),\n});\nconst gitCommitRevisionSchema = z\n .string()\n .regex(/^[0-9a-fA-F]{7,64}$/, \"Invalid git commit revision\");\n\nconst GIT_BACKGROUND_FETCH_TIMEOUT_MS = 30 * 1000;\n\nasync function runGitNetworkOperation<T>(\n ctx: CommandContext,\n workspaceId: string,\n op: () => Promise<T>\n): Promise<T> {\n if (!ctx.autoFetch?.runExclusive) {\n return op();\n }\n\n return ctx.autoFetch.runExclusive(workspaceId, op);\n}\n\n// git.status\nregisterCommand(\n \"git.status\",\n z.object({\n workspaceId: z.string(),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n return getGitStatus(workspace.path);\n }\n);\n\n// git.stage\nregisterCommand(\n \"git.stage\",\n z.object({\n workspaceId: z.string(),\n paths: z.array(z.string()),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n await stageFiles(workspace.path, args.paths);\n emitGitStateChanged(ctx, args.workspaceId);\n return {};\n }\n);\n\n// git.diff\nregisterCommand(\n \"git.diff\",\n z.object({\n workspaceId: z.string(),\n path: z.string(),\n staged: z.boolean().optional(),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n return {\n diff: await getFileDiff(workspace.path, args.path, args.staged ?? false),\n };\n }\n);\n\n// git.log\nregisterCommand(\n \"git.log\",\n z.object({\n workspaceId: z.string(),\n limit: z.number().int().min(1).max(50).optional(),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n return {\n entries: await getGitHistory(workspace.path, args.limit ?? 5),\n };\n }\n);\n\n// git.show\nregisterCommand(\n \"git.show\",\n z.object({\n workspaceId: z.string(),\n sha: gitCommitRevisionSchema,\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n return {\n diff: await getGitCommitDiff(workspace.path, args.sha),\n };\n }\n);\n\n// git.unstage\nregisterCommand(\n \"git.unstage\",\n z.object({\n workspaceId: z.string(),\n paths: z.array(z.string()),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n await unstageFiles(workspace.path, args.paths);\n emitGitStateChanged(ctx, args.workspaceId);\n return {};\n }\n);\n\n// git.discard\nregisterCommand(\n \"git.discard\",\n z.object({\n workspaceId: z.string(),\n paths: z.array(z.string()),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n await discardChanges(workspace.path, args.paths);\n emitGitStateChanged(ctx, args.workspaceId, {\n treeChanged: true,\n });\n return {};\n }\n);\n\n// git.commit\nregisterCommand(\n \"git.commit\",\n z.object({\n workspaceId: z.string(),\n message: z.string(),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n const result = await commitChanges(workspace.path, args.message);\n emitGitStateChanged(ctx, args.workspaceId, {\n branchChanged: true,\n worktreeChanged: true,\n });\n return result;\n }\n);\n\n// git.push\nregisterCommand(\n \"git.push\",\n z.object({\n workspaceId: z.string(),\n remote: z.string().optional(),\n branch: z.string().optional(),\n force: z.boolean().optional(),\n auth: gitHttpAuthSchema.optional(),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n const result = await runGitNetworkOperation(ctx, args.workspaceId, () =>\n runGitPush(workspace.path, {\n remote: args.remote,\n branch: args.branch,\n force: args.force,\n auth: args.auth,\n })\n );\n emitGitStateChanged(ctx, args.workspaceId, {\n branchChanged: true,\n worktreeChanged: true,\n });\n return result;\n }\n);\n\n// git.pull\nregisterCommand(\n \"git.pull\",\n z.object({\n workspaceId: z.string(),\n remote: z.string().optional(),\n branch: z.string().optional(),\n auth: gitHttpAuthSchema.optional(),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n const result = await runGitNetworkOperation(ctx, args.workspaceId, () =>\n runGitPull(workspace.path, {\n remote: args.remote,\n branch: args.branch,\n auth: args.auth,\n })\n );\n ctx.workspaceMgr.recordFetch(args.workspaceId);\n emitGitStateChanged(ctx, args.workspaceId, {\n treeChanged: true,\n branchChanged: true,\n worktreeChanged: true,\n });\n return result;\n }\n);\n\n// git.fetch\nregisterCommand(\n \"git.fetch\",\n z.object({\n workspaceId: z.string(),\n remote: z.string().optional(),\n prune: z.boolean().optional(),\n auth: gitHttpAuthSchema.optional(),\n background: z.boolean().optional(),\n }),\n async (args, ctx, clientId) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n try {\n // AutoFetchScheduler already holds the per-workspace lock before it\n // dispatches an internal background fetch. Client-originated requests\n // must still serialize through the shared network-operation gate.\n const isInternalBackgroundFetch = args.background === true && !clientId;\n const runFetch = () =>\n runGitFetch(workspace.path, {\n remote: args.remote,\n prune: args.prune,\n auth: args.auth,\n timeoutMs: args.background ? GIT_BACKGROUND_FETCH_TIMEOUT_MS : undefined,\n });\n const result = isInternalBackgroundFetch\n ? await runFetch()\n : await runGitNetworkOperation(ctx, args.workspaceId, runFetch);\n ctx.workspaceMgr.recordFetch(args.workspaceId);\n emitGitStateChanged(ctx, args.workspaceId, { branchChanged: true });\n return result;\n } catch (err) {\n if (args.background && err instanceof GitAuthError) {\n return { success: false, message: err.message, updatedRefs: [] };\n }\n throw err;\n }\n }\n);\n\n// git.checkout\nregisterCommand(\n \"git.checkout\",\n z.object({\n workspaceId: z.string(),\n ref: z.string(),\n createBranch: z.boolean().optional(),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n const result = await runGitCheckout(workspace.path, args.ref, {\n createBranch: args.createBranch,\n });\n if (result.success) {\n emitGitStateChanged(ctx, args.workspaceId, {\n treeChanged: true,\n branchChanged: true,\n worktreeChanged: true,\n });\n }\n return result;\n }\n);\n\n// git.branch\nregisterCommand(\n \"git.branch\",\n z.object({\n workspaceId: z.string(),\n name: z.string(),\n startPoint: z.string().optional(),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n const result = await runGitCreateBranch(workspace.path, args.name, {\n startPoint: args.startPoint,\n });\n emitGitStateChanged(ctx, args.workspaceId, {\n branchChanged: true,\n worktreeChanged: true,\n });\n return result;\n }\n);\n\n// git.branches\nregisterCommand(\n \"git.branches\",\n z.object({\n workspaceId: z.string(),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n return runGitListBranches(workspace.path);\n }\n);\n", "/**\n * Config file I/O utilities\n *\n * Provides read/write operations for Codex and Claude config files with:\n * - Environment variable override for test isolation\n * - Atomic writes via temp file + rename\n * - Timestamped backups before modifications\n */\n\nimport { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { basename, dirname, join } from \"node:path\";\n\nexport type ConfigType = \"codex\" | \"claude\";\n\nexport interface ConfigReadResult {\n /** Absolute path to the config file */\n configPath: string;\n /** File content (empty string if doesn't exist) */\n content: string;\n /** Whether the file exists */\n exists: boolean;\n}\n\nexport interface ConfigWriteResult {\n /** Whether the write succeeded */\n success: boolean;\n /** Path to the backup file (null if no backup created) */\n backupPath: string | null;\n /** Error message if write failed */\n error?: string;\n}\n\n/**\n * Resolve config file path with environment variable override support.\n *\n * Priority for Codex:\n * 1. CODER_STUDIO_CODEX_HOME (test isolation)\n * 2. CODEX_HOME (existing behavior)\n * 3. ~/.codex (default)\n *\n * Priority for Claude:\n * 1. CODER_STUDIO_CLAUDE_HOME (test isolation)\n * 2. ~/.claude (default)\n */\nexport function resolveConfigPath(configType: ConfigType): string {\n if (configType === \"codex\") {\n const testHome = process.env.CODER_STUDIO_CODEX_HOME;\n if (testHome && testHome.trim()) {\n return join(testHome, \"config.toml\");\n }\n const codexHome = process.env.CODEX_HOME;\n if (codexHome && codexHome.trim()) {\n return join(codexHome, \"config.toml\");\n }\n return join(homedir(), \".codex\", \"config.toml\");\n }\n\n if (configType === \"claude\") {\n const testHome = process.env.CODER_STUDIO_CLAUDE_HOME;\n if (testHome && testHome.trim()) {\n return join(testHome, \"settings.json\");\n }\n return join(homedir(), \".claude\", \"settings.json\");\n }\n\n throw new Error(`Unknown config type: ${configType}`);\n}\n\n/**\n * Read config file content.\n *\n * Returns empty string if file doesn't exist.\n * Never throws - returns exists: false on any error.\n */\nexport function readConfigFile(configType: ConfigType): ConfigReadResult {\n const configPath = resolveConfigPath(configType);\n\n if (!existsSync(configPath)) {\n return { configPath, content: \"\", exists: false };\n }\n\n try {\n const content = readFileSync(configPath, \"utf-8\");\n return { configPath, content, exists: true };\n } catch {\n return { configPath, content: \"\", exists: false };\n }\n}\n\n/**\n * Write config file with atomic write and backup.\n *\n * - Creates parent directory if needed\n * - Creates timestamped backup before overwrite\n * - Atomic write via .tmp file + rename\n */\nexport function writeConfigFile(configType: ConfigType, content: string): ConfigWriteResult {\n try {\n const configPath = resolveConfigPath(configType);\n\n // Ensure parent directory exists\n const parentDir = dirname(configPath);\n if (!existsSync(parentDir)) {\n mkdirSync(parentDir, { recursive: true });\n }\n\n // Create backup if file exists\n let backupPath: string | null = null;\n if (existsSync(configPath)) {\n backupPath = createBackup(configPath);\n }\n\n // Atomic write\n const tempPath = `${configPath}.tmp`;\n writeFileSync(tempPath, content, \"utf-8\");\n renameSync(tempPath, configPath);\n\n return { success: true, backupPath };\n } catch (error) {\n return {\n success: false,\n backupPath: null,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Create timestamped backup of a file.\n *\n * Format: <basename>.bak.<YYYYMMDD-HHmmss>.<ext>\n */\nfunction createBackup(filePath: string): string {\n const original = readFileSync(filePath, \"utf-8\");\n\n const ext = filePath.split(\".\").pop() ?? \"\";\n const base = basename(filePath, `.${ext}`);\n const dir = dirname(filePath);\n\n const ts = formatTimestamp(new Date());\n const backupPath = join(dir, `${base}.bak.${ts}.${ext}`);\n\n writeFileSync(backupPath, original, \"utf-8\");\n return backupPath;\n}\n\n/**\n * Format timestamp for backup filename.\n *\n * Format: YYYYMMDD-HHmmss\n */\nfunction formatTimestamp(d: Date): string {\n const pad = (n: number) => String(n).padStart(2, \"0\");\n return (\n `${d.getFullYear()}${pad(d.getMonth() + 1)}${pad(d.getDate())}` +\n `-${pad(d.getHours())}${pad(d.getMinutes())}${pad(d.getSeconds())}`\n );\n}\n", "/**\n * Settings Commands\n */\n\nimport {\n DEFAULT_SUPERVISOR_EVALUATION_TIMEOUT_SEC,\n MAX_SUPERVISOR_EVALUATION_TIMEOUT_SEC,\n MAX_SUPERVISOR_RETRY_DELAY_SEC,\n MAX_SUPERVISOR_RETRY_MAX_COUNT,\n resolveSupervisorEvaluationTimeoutSec,\n resolveSupervisorRetryDelaySec,\n resolveSupervisorRetryEnabled,\n resolveSupervisorRetryMaxCount,\n resolveSupervisorRetryOnEvaluatorError,\n resolveSupervisorRetryOnTimeout,\n} from \"@coder-studio/core\";\nimport { z } from \"zod\";\nimport { type ConfigType, readConfigFile, writeConfigFile } from \"../config/config-io.js\";\nimport {\n isSupportedProviderId,\n mergeProviderLaunchConfig,\n ProviderLaunchConfigInputSchema,\n ProviderSettingsSchema,\n sanitizeProviderLaunchConfig,\n} from \"../provider-config.js\";\nimport { ProviderConfigRepo } from \"../storage/repositories/provider-config-repo.js\";\nimport {\n SUPERVISOR_EVALUATION_TIMEOUT_SETTING_KEY,\n SUPERVISOR_RETRY_DELAY_SEC_SETTING_KEY,\n SUPERVISOR_RETRY_ENABLED_SETTING_KEY,\n SUPERVISOR_RETRY_MAX_COUNT_SETTING_KEY,\n SUPERVISOR_RETRY_ON_EVALUATOR_ERROR_SETTING_KEY,\n SUPERVISOR_RETRY_ON_TIMEOUT_SETTING_KEY,\n} from \"../supervisor/settings.js\";\nimport { registerCommand } from \"../ws/dispatch.js\";\n\n// Settings schema\nconst SettingsSchema = z.object({\n defaultProviderId: z.string().optional(),\n notifications: z\n .object({\n enabled: z.boolean().optional(),\n soundEnabled: z.boolean().optional(),\n // Legacy field \u2014 accepted for backward compat with older clients but\n // no longer surfaced in the UI. The web client now picks the channel\n // automatically based on workspace focus + page visibility.\n onlyWhenBackgrounded: z.boolean().optional(),\n })\n .optional(),\n supervisor: z\n .object({\n evaluationTimeoutSec: z\n .number()\n .int()\n .min(1)\n .max(MAX_SUPERVISOR_EVALUATION_TIMEOUT_SEC)\n .default(DEFAULT_SUPERVISOR_EVALUATION_TIMEOUT_SEC)\n .optional(),\n retryEnabled: z.boolean().optional(),\n retryMaxCount: z.number().int().min(0).max(MAX_SUPERVISOR_RETRY_MAX_COUNT).optional(),\n retryDelaySec: z.number().int().min(1).max(MAX_SUPERVISOR_RETRY_DELAY_SEC).optional(),\n retryOnTimeout: z.boolean().optional(),\n retryOnEvaluatorError: z.boolean().optional(),\n })\n .optional(),\n appearance: z\n .object({\n theme: z.enum([\"dark\", \"light\"]).optional(),\n themeId: z.string().optional(),\n terminalRenderer: z.enum([\"standard\", \"compatibility\"]).optional(),\n terminalCopyOnSelect: z.boolean().optional(),\n locale: z.enum([\"zh\", \"en\"]).optional(),\n })\n .optional(),\n providers: ProviderSettingsSchema.optional(),\n});\n\n// settings.get\nregisterCommand(\"settings.get\", z.object({}), async (_args, ctx) => {\n const row = ctx.db.prepare(\"SELECT key, value FROM user_settings\").all() as Array<{\n key: string;\n value: string;\n }>;\n\n const settings: Record<string, unknown> = {};\n for (const { key, value } of row) {\n if (key.startsWith(\"providers.\")) {\n continue;\n }\n\n try {\n settings[key] = JSON.parse(value);\n } catch {\n settings[key] = value;\n }\n }\n\n const providerConfigRepo = new ProviderConfigRepo(ctx.db);\n const providerConfigs = providerConfigRepo.getAll();\n for (const [providerId, config] of Object.entries(providerConfigs)) {\n if (!isSupportedProviderId(providerId)) {\n continue;\n }\n\n Object.assign(\n settings,\n flattenSettings(sanitizeProviderLaunchConfig(config), `providers.${providerId}`)\n );\n }\n\n if (Object.prototype.hasOwnProperty.call(settings, SUPERVISOR_EVALUATION_TIMEOUT_SETTING_KEY)) {\n settings[SUPERVISOR_EVALUATION_TIMEOUT_SETTING_KEY] = resolveSupervisorEvaluationTimeoutSec(\n settings[SUPERVISOR_EVALUATION_TIMEOUT_SETTING_KEY]\n );\n }\n if (Object.prototype.hasOwnProperty.call(settings, SUPERVISOR_RETRY_ENABLED_SETTING_KEY)) {\n settings[SUPERVISOR_RETRY_ENABLED_SETTING_KEY] = resolveSupervisorRetryEnabled(\n settings[SUPERVISOR_RETRY_ENABLED_SETTING_KEY]\n );\n }\n if (Object.prototype.hasOwnProperty.call(settings, SUPERVISOR_RETRY_MAX_COUNT_SETTING_KEY)) {\n settings[SUPERVISOR_RETRY_MAX_COUNT_SETTING_KEY] = resolveSupervisorRetryMaxCount(\n settings[SUPERVISOR_RETRY_MAX_COUNT_SETTING_KEY]\n );\n }\n if (Object.prototype.hasOwnProperty.call(settings, SUPERVISOR_RETRY_DELAY_SEC_SETTING_KEY)) {\n settings[SUPERVISOR_RETRY_DELAY_SEC_SETTING_KEY] = resolveSupervisorRetryDelaySec(\n settings[SUPERVISOR_RETRY_DELAY_SEC_SETTING_KEY]\n );\n }\n if (Object.prototype.hasOwnProperty.call(settings, SUPERVISOR_RETRY_ON_TIMEOUT_SETTING_KEY)) {\n settings[SUPERVISOR_RETRY_ON_TIMEOUT_SETTING_KEY] = resolveSupervisorRetryOnTimeout(\n settings[SUPERVISOR_RETRY_ON_TIMEOUT_SETTING_KEY]\n );\n }\n if (\n Object.prototype.hasOwnProperty.call(settings, SUPERVISOR_RETRY_ON_EVALUATOR_ERROR_SETTING_KEY)\n ) {\n settings[SUPERVISOR_RETRY_ON_EVALUATOR_ERROR_SETTING_KEY] =\n resolveSupervisorRetryOnEvaluatorError(\n settings[SUPERVISOR_RETRY_ON_EVALUATOR_ERROR_SETTING_KEY]\n );\n }\n\n return settings;\n});\n\n// settings.update\nregisterCommand(\n \"settings.update\",\n z.object({\n settings: SettingsSchema,\n }),\n async (args, ctx) => {\n const providerConfigRepo = new ProviderConfigRepo(ctx.db);\n const nextSettings = args.settings as Record<string, unknown>;\n const providers =\n nextSettings.providers &&\n typeof nextSettings.providers === \"object\" &&\n !Array.isArray(nextSettings.providers)\n ? (nextSettings.providers as Record<string, unknown>)\n : undefined;\n const { providers: _providers, ...nonProviderSettings } = nextSettings;\n\n // Flatten settings to key-value pairs\n const flatSettings = flattenSettings(nonProviderSettings);\n\n // Update each setting\n const stmt = ctx.db.prepare(`\n INSERT INTO user_settings (key, value)\n VALUES (?, ?)\n ON CONFLICT(key) DO UPDATE SET value = excluded.value\n `);\n\n for (const [key, value] of Object.entries(flatSettings)) {\n stmt.run(key, JSON.stringify(value));\n }\n\n if (providers) {\n for (const [providerId, config] of Object.entries(providers)) {\n providerConfigRepo.set(providerId, sanitizeProviderLaunchConfig(config));\n }\n }\n\n return {\n updated: [\n ...Object.keys(flatSettings),\n ...Object.keys(providers ?? {}).map((providerId) => `providers.${providerId}`),\n ],\n };\n }\n);\n\n// settings.previewCommand\nregisterCommand(\n \"settings.previewCommand\",\n z.object({\n providerId: z.string(),\n config: ProviderLaunchConfigInputSchema,\n workspacePath: z.string().optional(),\n }),\n async (args, ctx) => {\n const provider = ctx.providerRegistry.find((item) => item.id === args.providerId);\n\n if (!provider) {\n throw new Error(`Unknown provider: ${args.providerId}`);\n }\n\n const command = provider.buildCommand(mergeProviderLaunchConfig(provider, args.config), {\n sessionId: \"preview-session\",\n workspacePath: args.workspacePath ?? process.cwd(),\n });\n\n return {\n argv: command.argv,\n cwd: command.cwd,\n env: command.env,\n preview: `${command.argv.join(\" \")}${command.cwd ? ` # cwd=${command.cwd}` : \"\"}`,\n };\n }\n);\n\n/**\n * Flatten nested settings object to dot-notation keys\n */\nfunction flattenSettings(obj: Record<string, unknown>, prefix = \"\"): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n const fullKey = prefix ? `${prefix}.${key}` : key;\n\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n Object.assign(result, flattenSettings(value as Record<string, unknown>, fullKey));\n } else if (value !== undefined) {\n result[fullKey] = value;\n }\n }\n\n return result;\n}\n\n// settings.readConfigFile \u2014 read Codex or Claude config file content\nregisterCommand(\n \"settings.readConfigFile\",\n z.object({\n configType: z.enum([\"codex\", \"claude\"]),\n }),\n async (args) => {\n const result = readConfigFile(args.configType as ConfigType);\n return result;\n }\n);\n\n// settings.writeConfigFile \u2014 write Codex or Claude config file with backup\nregisterCommand(\n \"settings.writeConfigFile\",\n z.object({\n configType: z.enum([\"codex\", \"claude\"]),\n content: z.string(),\n }),\n async (args) => {\n const result = writeConfigFile(args.configType as ConfigType, args.content);\n return result;\n }\n);\n", "import { z } from \"zod\";\nimport { buildProviderRuntimeStatus } from \"../provider-runtime/runtime-status.js\";\nimport { registerCommand } from \"../ws/dispatch.js\";\n\nregisterCommand(\"provider.runtimeStatus\", z.object({}), async (_args, ctx) => {\n return buildProviderRuntimeStatus(ctx.providerRegistry, ctx.providerRuntimeDeps);\n});\n\nregisterCommand(\n \"provider.install.start\",\n z.object({\n providerId: z.string(),\n }),\n async (args, ctx) => {\n if (!ctx.providerInstallMgr) {\n throw {\n code: \"provider_install_unavailable\",\n message: \"Provider install manager not configured\",\n };\n }\n\n return ctx.providerInstallMgr.start(args.providerId);\n }\n);\n\nregisterCommand(\n \"provider.install.get\",\n z.object({\n jobId: z.string(),\n }),\n async (args, ctx) => {\n if (!ctx.providerInstallMgr) {\n throw {\n code: \"provider_install_unavailable\",\n message: \"Provider install manager not configured\",\n };\n }\n\n const job = ctx.providerInstallMgr.get(args.jobId);\n if (!job) {\n throw {\n code: \"provider_install_job_not_found\",\n message: `Install job not found: ${args.jobId}`,\n };\n }\n\n return job;\n }\n);\n", "import { z } from \"zod\";\nimport { registerCommand } from \"../ws/dispatch.js\";\n\nconst supervisorObjectiveSchema = z.string().trim().min(1).max(4000);\nconst createSupervisorSchema = z\n .object({\n sessionId: z.string(),\n workspaceId: z.string(),\n objective: supervisorObjectiveSchema,\n evaluatorProviderId: z.string(),\n evaluatorModel: z.string().trim().min(1).max(200).optional(),\n maxSupervisionCount: z.number().int().min(0).max(Number.MAX_SAFE_INTEGER).optional(),\n scheduledAt: z.number().int().min(0).max(Number.MAX_SAFE_INTEGER).optional(),\n })\n .strict();\nconst updateSupervisorSchema = z\n .object({\n id: z.string(),\n objective: supervisorObjectiveSchema.optional(),\n evaluatorProviderId: z.string().optional(),\n evaluatorModel: z.string().trim().min(1).max(200).nullable().optional(),\n maxSupervisionCount: z.number().int().min(0).max(Number.MAX_SAFE_INTEGER).optional(),\n scheduledAt: z.number().int().min(0).max(Number.MAX_SAFE_INTEGER).nullable().optional(),\n })\n .strict()\n .refine(\n (input) =>\n input.objective !== undefined ||\n input.evaluatorProviderId !== undefined ||\n input.evaluatorModel !== undefined ||\n input.maxSupervisionCount !== undefined ||\n input.scheduledAt !== undefined,\n \"at least one supervisor field is required\"\n );\nconst sessionIdSchema = z.object({ sessionId: z.string() });\nconst supervisorIdSchema = z.object({ id: z.string() });\n\n// supervisor.create\nregisterCommand(\"supervisor.create\", createSupervisorSchema, async (args, ctx) => {\n return {\n supervisor: await ctx.supervisorMgr.create({\n sessionId: args.sessionId,\n workspaceId: args.workspaceId,\n objective: args.objective,\n evaluatorProviderId: args.evaluatorProviderId,\n evaluatorModel: args.evaluatorModel,\n maxSupervisionCount: args.maxSupervisionCount,\n scheduledAt: args.scheduledAt,\n }),\n };\n});\n\n// supervisor.get\nregisterCommand(\"supervisor.get\", sessionIdSchema, async (args, ctx) => {\n return { supervisor: ctx.supervisorMgr.getBySession(args.sessionId) ?? null };\n});\n\n// supervisor.update\nregisterCommand(\"supervisor.update\", updateSupervisorSchema, async (args, ctx) => {\n return {\n supervisor: await ctx.supervisorMgr.update(args.id, {\n objective: args.objective,\n evaluatorProviderId: args.evaluatorProviderId,\n evaluatorModel: args.evaluatorModel,\n maxSupervisionCount: args.maxSupervisionCount,\n scheduledAt: args.scheduledAt,\n }),\n };\n});\n\n// supervisor.delete\nregisterCommand(\"supervisor.delete\", supervisorIdSchema, async (args, ctx) => {\n await ctx.supervisorMgr.delete(args.id);\n return {};\n});\n\n// supervisor.pause\nregisterCommand(\"supervisor.pause\", supervisorIdSchema, async (args, ctx) => {\n return { supervisor: await ctx.supervisorMgr.pause(args.id) };\n});\n\n// supervisor.resume\nregisterCommand(\"supervisor.resume\", supervisorIdSchema, async (args, ctx) => {\n return { supervisor: await ctx.supervisorMgr.resume(args.id) };\n});\n\n// supervisor.trigger\nregisterCommand(\"supervisor.trigger\", supervisorIdSchema, async (args, ctx) => {\n return { cycle: await ctx.supervisorMgr.triggerEvaluation(args.id) };\n});\n", "/**\n * Git Worktree operations (Phase 3)\n *\n * Wrapper around git worktree commands.\n */\n\nimport path from \"node:path\";\nimport type { FileNode, GitStatus, WorktreeInfo } from \"@coder-studio/core\";\nimport { GitError, runGit } from \"./cli.js\";\nimport { parseStatus } from \"./status-parser.js\";\n\nfunction normalizeWorktreePath(worktreePath: string): string {\n return path.resolve(worktreePath);\n}\n\nexport async function getGitCommonDirPath(repoPath: string): Promise<string> {\n const { stdout } = await runGit(repoPath, [\"rev-parse\", \"--git-common-dir\"]);\n return normalizeWorktreePath(path.resolve(repoPath, stdout.trim()));\n}\n\nexport async function resolveWorktreePath(repoPath: string, worktreePath: string): Promise<string> {\n const normalizedRequested = normalizeWorktreePath(worktreePath);\n const worktrees = await listWorktrees(repoPath);\n const matched = worktrees.find(\n (worktree) => normalizeWorktreePath(worktree.path) === normalizedRequested\n );\n\n if (!matched) {\n throw {\n code: \"worktree_not_found\",\n message: `Worktree not found for repository: ${worktreePath}`,\n };\n }\n\n return matched.path;\n}\n\n/**\n * List all worktrees for a repository.\n *\n * @param repoPath - Path to the main repository\n * @returns Array of worktree information\n */\nexport async function listWorktrees(repoPath: string): Promise<WorktreeInfo[]> {\n try {\n const { stdout } = await runGit(repoPath, [\"worktree\", \"list\", \"--porcelain\"]);\n\n const worktrees: WorktreeInfo[] = [];\n const lines = stdout.split(\"\\n\");\n\n let current: Partial<WorktreeInfo> = {};\n\n for (const line of lines) {\n if (line.startsWith(\"worktree \")) {\n if (current.path) {\n worktrees.push(current as WorktreeInfo);\n }\n current = { path: line.substring(9) };\n } else if (line.startsWith(\"HEAD \")) {\n current.commit = line.substring(5).substring(0, 7);\n } else if (line.startsWith(\"branch \")) {\n const branch = line.substring(7);\n current.branch = branch;\n current.name = branch.split(\"/\").pop() || branch;\n } else if (line === \"detached\") {\n current.branch = \"detached HEAD\";\n } else if (line === \"\") {\n // Empty line might indicate end of record\n if (current.path) {\n // Check if dirty by running status\n worktrees.push(current as WorktreeInfo);\n current = {};\n }\n }\n }\n\n // Don't forget the last one\n if (current.path) {\n worktrees.push(current as WorktreeInfo);\n }\n\n // Check dirty status for each worktree\n for (const wt of worktrees) {\n try {\n const status = await getWorktreeStatus(wt.path);\n wt.status =\n status.staged.length > 0 ||\n status.modified.length > 0 ||\n status.untracked.length > 0 ||\n status.deleted.length > 0\n ? \"dirty\"\n : \"clean\";\n } catch {\n wt.status = \"clean\";\n }\n }\n\n return worktrees;\n } catch (error) {\n if (error instanceof GitError) {\n throw new Error(`Failed to list worktrees: ${error.message}`);\n }\n throw error;\n }\n}\n\n/**\n * Get git status for a specific worktree.\n *\n * @param worktreePath - Path to the worktree\n * @returns Git status information\n */\nexport async function getWorktreeStatus(worktreePath: string): Promise<GitStatus> {\n const { stdout } = await runGit(worktreePath, [\n \"status\",\n \"--porcelain=v2\",\n \"-z\",\n \"--branch\",\n \"--untracked-files=all\",\n ]);\n return parseStatus(stdout);\n}\n\n/**\n * Get diff for a worktree.\n *\n * @param worktreePath - Path to the worktree\n * @param staged - Whether to show staged changes\n * @returns Diff output as string\n */\nexport async function getWorktreeDiff(worktreePath: string, staged = false): Promise<string> {\n const args = [\"diff\"];\n if (staged) {\n args.push(\"--staged\");\n }\n const { stdout } = await runGit(worktreePath, args);\n return stdout;\n}\n\n/**\n * Get file tree for a worktree.\n * This is a simplified version that lists top-level files and directories.\n *\n * @param worktreePath - Path to the worktree\n * @returns File tree structure\n */\nexport async function getWorktreeTree(worktreePath: string): Promise<FileNode[]> {\n const { stdout } = await runGit(worktreePath, [\"ls-tree\", \"-l\", \"--name-only\", \"HEAD\"]);\n\n const nodes: FileNode[] = [];\n const lines = stdout.split(\"\\n\").filter(Boolean);\n\n for (const line of lines) {\n const isDir = line.endsWith(\"/\");\n const name = isDir ? line.slice(0, -1) : line;\n const path = `${worktreePath}/${name}`;\n\n nodes.push({\n name,\n path,\n kind: isDir ? \"dir\" : \"file\",\n });\n }\n\n return nodes;\n}\n\n/**\n * Create a new worktree.\n *\n * @param repoPath - Path to the main repository\n * @param branch - Branch name for the new worktree\n * @param path - Path where the worktree should be created\n * @returns The created worktree info\n */\nexport async function createWorktree(\n repoPath: string,\n branch: string,\n worktreePath: string\n): Promise<WorktreeInfo> {\n let createArgs = [\"worktree\", \"add\", worktreePath, branch];\n try {\n await runGit(repoPath, [\"rev-parse\", \"--verify\", \"--quiet\", `${branch}^{commit}`]);\n } catch (error) {\n if (error instanceof GitError) {\n createArgs = [\"worktree\", \"add\", \"-b\", branch, worktreePath];\n } else {\n throw error;\n }\n }\n\n await runGit(repoPath, createArgs);\n\n const worktrees = await listWorktrees(repoPath);\n const normalizedRequested = normalizeWorktreePath(worktreePath);\n const created = worktrees.find((wt) => normalizeWorktreePath(wt.path) === normalizedRequested);\n\n if (!created) {\n throw new Error(\"Failed to find created worktree\");\n }\n\n return created;\n}\n\n/**\n * Remove a worktree.\n *\n * @param repoPath - Path to the main repository\n * @param worktreePath - Path to the worktree to remove\n * @param force - Force removal even if there are uncommitted changes\n */\nexport async function removeWorktree(\n repoPath: string,\n worktreePath: string,\n force = false\n): Promise<void> {\n const args = [\"worktree\", \"remove\", worktreePath];\n if (force) {\n args.push(\"--force\");\n }\n await runGit(repoPath, args);\n}\n", "/**\n * Worktree Commands (Phase 3)\n */\n\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport {\n createWorktree,\n getGitCommonDirPath,\n getWorktreeDiff,\n getWorktreeStatus,\n getWorktreeTree,\n listWorktrees,\n removeWorktree,\n resolveWorktreePath,\n} from \"../git/worktree.js\";\nimport type { CommandContext } from \"../ws/dispatch.js\";\nimport { registerCommand } from \"../ws/dispatch.js\";\nimport { emitGitStateChanged } from \"./git-events.js\";\n\nasync function findRelatedWorkspaceIds(\n ctx: CommandContext,\n workspacePath: string\n): Promise<string[]> {\n const targetCommonDir = await getGitCommonDirPath(workspacePath);\n const relatedWorkspaceIds = await Promise.all(\n ctx.workspaceMgr.list().map(async (workspace) => {\n try {\n const commonDir = await getGitCommonDirPath(workspace.path);\n return commonDir === targetCommonDir ? workspace.id : null;\n } catch {\n return null;\n }\n })\n );\n\n return relatedWorkspaceIds.filter((workspaceId): workspaceId is string => Boolean(workspaceId));\n}\n\nfunction emitWorktreeChangedForWorkspaceIds(ctx: CommandContext, workspaceIds: string[]) {\n for (const workspaceId of workspaceIds) {\n if (!ctx.workspaceMgr.get(workspaceId)) {\n continue;\n }\n emitGitStateChanged(ctx, workspaceId, { worktreeChanged: true });\n }\n}\n\nfunction isWorkspaceOpenForPath(ctx: CommandContext, workspacePath: string): boolean {\n const targetPath = path.resolve(workspacePath);\n return ctx.workspaceMgr\n .list()\n .some((openWorkspace) => path.resolve(openWorkspace.path) === targetPath);\n}\n\n// worktree.list\nregisterCommand(\"worktree.list\", z.object({ workspaceId: z.string() }), async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n return { worktrees: await listWorktrees(workspace.path) };\n});\n\n// worktree.status\nregisterCommand(\n \"worktree.status\",\n z.object({ workspaceId: z.string(), worktreePath: z.string() }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n const worktreePath = await resolveWorktreePath(workspace.path, args.worktreePath);\n return { status: await getWorktreeStatus(worktreePath) };\n }\n);\n\n// worktree.diff\nregisterCommand(\n \"worktree.diff\",\n z.object({\n workspaceId: z.string(),\n worktreePath: z.string(),\n staged: z.boolean().optional().default(false),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n const worktreePath = await resolveWorktreePath(workspace.path, args.worktreePath);\n return { diff: await getWorktreeDiff(worktreePath, args.staged) };\n }\n);\n\n// worktree.tree\nregisterCommand(\n \"worktree.tree\",\n z.object({ workspaceId: z.string(), worktreePath: z.string() }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n const worktreePath = await resolveWorktreePath(workspace.path, args.worktreePath);\n return { tree: await getWorktreeTree(worktreePath) };\n }\n);\n\n// worktree.create\nregisterCommand(\n \"worktree.create\",\n z.object({\n workspaceId: z.string(),\n branch: z.string(),\n path: z.string(),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n const relatedWorkspaceIds = await findRelatedWorkspaceIds(ctx, workspace.path);\n const worktree = await createWorktree(workspace.path, args.branch, args.path);\n emitWorktreeChangedForWorkspaceIds(ctx, relatedWorkspaceIds);\n return { worktree };\n }\n);\n\n// worktree.remove\nregisterCommand(\n \"worktree.remove\",\n z.object({\n workspaceId: z.string(),\n worktreePath: z.string(),\n force: z.boolean().optional().default(false),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n const relatedWorkspaceIds = await findRelatedWorkspaceIds(ctx, workspace.path);\n const worktreePath = await resolveWorktreePath(workspace.path, args.worktreePath);\n if (isWorkspaceOpenForPath(ctx, worktreePath)) {\n throw {\n code: \"worktree_in_use\",\n message: `Cannot remove an open worktree workspace: ${worktreePath}`,\n };\n }\n\n await removeWorktree(workspace.path, worktreePath, args.force);\n emitWorktreeChangedForWorkspaceIds(ctx, relatedWorkspaceIds);\n return {};\n }\n);\n", "/**\n * Fencing command handlers (Phase 3)\n */\n\nimport type { FastifyRequest } from \"fastify\";\nimport { z } from \"zod\";\nimport { registerCommand } from \"../ws/dispatch.js\";\n\nfunction createMockFencingRequest(): FastifyRequest {\n return {\n ip: \"127.0.0.1\",\n headers: { \"user-agent\": \"coder-studio-client\" },\n } as unknown as FastifyRequest;\n}\n\n// fencing.request - Request controller status\nregisterCommand(\n \"fencing.request\",\n z.object({\n workspaceId: z.string(),\n tabId: z.string(),\n }),\n async (args, ctx, clientId) => {\n // Note: in Phase 1, request.ip/userAgent come from WsHub connection\n // For now, use placeholder \u2014 will be refined when WsHub integration is done\n return ctx.fencingMgr.requestControl(\n args.workspaceId,\n clientId!,\n args.tabId,\n createMockFencingRequest()\n );\n }\n);\n\n// fencing.heartbeat - Send heartbeat\nregisterCommand(\n \"fencing.heartbeat\",\n z.object({ workspaceId: z.string() }),\n async (args, ctx, clientId) => {\n const success = ctx.fencingMgr.heartbeat(args.workspaceId, clientId!);\n return { success };\n }\n);\n\n// fencing.release - Release controller status\nregisterCommand(\n \"fencing.release\",\n z.object({ workspaceId: z.string() }),\n async (args, ctx, clientId) => {\n ctx.fencingMgr.release(args.workspaceId, clientId!);\n return {};\n }\n);\n\n// fencing.status - Get current controller status\nregisterCommand(\"fencing.status\", z.object({ workspaceId: z.string() }), async (args, ctx) => {\n const controller = ctx.fencingMgr.getController(args.workspaceId);\n const isUnresponsive = ctx.fencingMgr.isControllerUnresponsive(args.workspaceId);\n return {\n isController: controller != null,\n controller: controller ? { tabId: controller.tabId, issuedAt: controller.issuedAt } : null,\n isUnresponsive,\n };\n});\n\n// fencing.takeover - Force takeover when controller is unresponsive\nregisterCommand(\n \"fencing.takeover\",\n z.object({\n workspaceId: z.string(),\n tabId: z.string(),\n }),\n async (args, ctx, clientId) => {\n return ctx.fencingMgr.forceTakeover(\n args.workspaceId,\n clientId!,\n args.tabId,\n createMockFencingRequest()\n );\n }\n);\n", "/**\n * Command handlers\n *\n * This file imports all command handlers to register them with the dispatch system.\n */\n\nimport \"./workspace.js\";\nimport \"./workspace-activity.js\";\nimport \"./activation.js\";\nimport \"./connection.js\";\nimport \"./session.js\";\nimport \"./terminal.js\";\nimport \"./file.js\";\nimport \"./git.js\";\nimport \"./settings.js\";\nimport \"./provider.js\";\nimport \"./supervisor.js\";\nimport \"./worktree.js\";\nimport \"./fencing.js\";\n", "/**\n * Server Entry Point\n *\n * Creates and assembles all server components.\n */\nimport {\n deleteRuntimeConfig,\n getRuntimePath,\n type RuntimeConfig,\n writeRuntimeConfig,\n} from \"@coder-studio/core/runtime\";\nimport { providerRegistry } from \"@coder-studio/providers\";\nimport { isDirectExecution } from \"@coder-studio/utils\";\nimport type { FastifyInstance } from \"fastify\";\nimport { buildFastifyApp } from \"./app.js\";\nimport { EventBus } from \"./bus/event-bus.js\";\nimport { ensureDataDir, parseServerConfig, type ServerConfig } from \"./config.js\";\nimport { AutoFetchScheduler } from \"./git/auto-fetch.js\";\nimport { runCommandAsString } from \"./provider-runtime/command-runner.js\";\nimport { createE2EProviderMockOverrides } from \"./provider-runtime/e2e-provider-mock.js\";\nimport { ProviderInstallManager } from \"./provider-runtime/install-manager.js\";\nimport type { RuntimeStatusDeps } from \"./provider-runtime/runtime-status.js\";\nimport { SessionManager } from \"./session/manager.js\";\nimport type { Database } from \"./storage/database.js\";\nimport { openDatabase } from \"./storage/db.js\";\nimport { AuthLoginBlockRepo } from \"./storage/repositories/auth-login-block-repo.js\";\nimport { AuthSessionRepo } from \"./storage/repositories/auth-session-repo.js\";\nimport { ProviderConfigRepo } from \"./storage/repositories/provider-config-repo.js\";\nimport { rowToSession, type SessionRow } from \"./storage/repositories/session-repo.js\";\nimport { SettingsRepo } from \"./storage/repositories/settings-repo.js\";\nimport { SupervisorCycleAttemptRepo } from \"./storage/repositories/supervisor-cycle-attempt-repo.js\";\nimport { SupervisorCycleRepo } from \"./storage/repositories/supervisor-cycle-repo.js\";\nimport { SupervisorRepo } from \"./storage/repositories/supervisor-repo.js\";\nimport { SupervisorManager } from \"./supervisor/manager.js\";\nimport * as targetStore from \"./supervisor/target-store.js\";\nimport { TerminalManager } from \"./terminal/manager.js\";\nimport { NodePtyHost } from \"./terminal/pty-host.js\";\nimport type { TerminalDatabase } from \"./terminal/types.js\";\nimport { deleteWorkspaceUploads, runStartupGc } from \"./uploads/cleanup.js\";\nimport { STARTUP_GC_DELAY_MS } from \"./uploads/constants.js\";\nimport { WorkspaceManager } from \"./workspace/manager.js\";\nimport { ActivationManager } from \"./ws/activation.js\";\nimport type { CommandContext } from \"./ws/dispatch.js\";\nimport { dispatch } from \"./ws/dispatch.js\";\nimport { FencingManager } from \"./ws/fencing.js\";\nimport { WsHub } from \"./ws/hub.js\";\n\nimport \"./commands/index.js\";\n\nconst WS_KEEPALIVE_INTERVAL_MS = 15_000;\n\nexport interface Server {\n app: FastifyInstance;\n stop: () => Promise<void>;\n __test__?: { sessionMgr: SessionManager; commandContext: CommandContext };\n}\n\nexport interface ServerRuntimeOptions {\n writeRuntimeConfig?: boolean;\n}\n\nexport async function createServer(\n configOverrides?: Partial<ServerConfig> & ServerRuntimeOptions\n): Promise<Server> {\n const config = parseServerConfig(configOverrides);\n\n ensureDataDir(config);\n\n const db = openDatabase(config.dataDir);\n const eventBus = new EventBus();\n const activationMgr = new ActivationManager();\n const fencingMgr = new FencingManager();\n const wsHub = new WsHub({ eventBus, commandContext: null, config, fencingMgr });\n let workspaceMgr: WorkspaceManager;\n let commandContext: CommandContext;\n\n const terminalMgr = new TerminalManager({\n ptyHost: createPtyHost(),\n eventBus,\n db: createTerminalDatabase(db),\n });\n\n const settingsRepo = new SettingsRepo(db);\n const autoFetch = new AutoFetchScheduler({\n workspaceMgr: { get: (workspaceId) => workspaceMgr.get(workspaceId) },\n eventBus,\n settingsRepo,\n runFetch: async (workspaceId) => {\n if (!workspaceMgr.get(workspaceId)) {\n return;\n }\n\n const result = await dispatch(\n {\n kind: \"command\",\n id: `auto-fetch:${workspaceId}:${Date.now()}`,\n op: \"git.fetch\",\n args: {\n workspaceId,\n background: true,\n },\n },\n commandContext\n );\n\n if (!result.ok) {\n throw new Error(result.error?.message ?? \"Background fetch failed\");\n }\n\n const data = result.data as { success?: boolean; message?: string };\n if (data.success === false) {\n throw new Error(data.message ?? \"Background fetch failed\");\n }\n },\n });\n\n const sessionDb = createSessionDatabase(db);\n const providerConfigRepo = new ProviderConfigRepo(db);\n const sessionMgr = new SessionManager({\n terminalMgr,\n eventBus,\n db: sessionDb,\n broadcaster: wsHub,\n providerRegistry,\n providerConfigRepo,\n });\n\n let supervisorMgr: SupervisorManager | undefined;\n\n workspaceMgr = new WorkspaceManager({\n db,\n eventBus,\n broadcaster: wsHub,\n autoFetch,\n teardown: async (workspaceId) => {\n await supervisorMgr?.deleteForWorkspace(workspaceId);\n await sessionMgr.stopForWorkspace(workspaceId);\n await terminalMgr.closeForWorkspace(workspaceId);\n sessionMgr.deleteEndedForWorkspace(workspaceId);\n },\n onClose: (workspaceId) =>\n deleteWorkspaceUploads(config.uploadsDir, workspaceId).catch((err) =>\n console.warn(\"[uploads] cascade cleanup failed\", { wsId: workspaceId, err })\n ),\n });\n workspaceMgr.hydrateWatchers();\n\n const authSessionRepo = new AuthSessionRepo(db);\n const authLoginBlockRepo = new AuthLoginBlockRepo(db);\n\n const app = await buildFastifyApp({\n wsHub,\n db,\n workspaceMgr,\n webRoot: config.webRoot,\n config,\n authSessionRepo,\n authLoginBlockRepo,\n logger: {\n level: \"info\",\n transport: {\n target: \"pino-pretty\",\n options: {\n translateTime: \"HH:MM:ss Z\",\n ignore: \"pid,hostname\",\n },\n },\n },\n });\n\n wsHub.setLogger(app.log);\n\n const supervisorRepo = new SupervisorRepo(db);\n const cycleRepo = new SupervisorCycleRepo(db);\n const cycleAttemptRepo = new SupervisorCycleAttemptRepo(db);\n supervisorMgr = new SupervisorManager({\n eventBus,\n broadcaster: wsHub,\n terminalMgr,\n workspaceMgr,\n sessionMgr,\n providerRegistry,\n providerConfigRepo,\n settingsRepo,\n supervisorRepo,\n cycleRepo,\n cycleAttemptRepo,\n targetStore,\n logger: app.log,\n });\n await sessionMgr.hydrate();\n await supervisorMgr.hydrate();\n\n const providerMockOverrides = createE2EProviderMockOverrides();\n const providerRuntimeDeps: RuntimeStatusDeps = providerMockOverrides\n ? {\n commandExists: providerMockOverrides.commandExists,\n }\n : {};\n const providerInstallMgr = new ProviderInstallManager(providerRegistry, {\n ...providerRuntimeDeps,\n runCommand: providerMockOverrides?.runCommand ?? runCommandAsString,\n });\n\n commandContext = {\n workspaceMgr,\n sessionMgr,\n terminalMgr,\n eventBus,\n broadcaster: wsHub,\n db,\n providerRegistry,\n fencingMgr,\n supervisorMgr,\n autoFetch,\n providerRuntimeDeps,\n providerInstallMgr,\n activationMgr,\n };\n\n wsHub.setCommandContext(commandContext);\n\n await app.listen({\n host: config.host,\n port: config.port,\n });\n\n if (configOverrides?.writeRuntimeConfig ?? process.env.NODE_ENV === \"production\") {\n const runtime: RuntimeConfig = {\n host: config.host,\n port: extractListenPort(app) ?? config.port,\n pid: process.pid,\n token: `server-${process.pid}`,\n serverInstanceId: `server-${process.pid}`,\n startedAt: Date.now(),\n };\n process.env.CODER_STUDIO_RUNTIME_JSON_PATH = getRuntimePath();\n writeRuntimeConfig(runtime);\n }\n\n const gcTimer = setTimeout(() => {\n runStartupGc(config.uploadsDir, app.log).catch((err) =>\n app.log.warn({ err }, \"startup GC failed\")\n );\n }, STARTUP_GC_DELAY_MS);\n gcTimer.unref();\n\n const wsKeepaliveTimer = setInterval(() => {\n wsHub.pingAll();\n }, WS_KEEPALIVE_INTERVAL_MS);\n wsKeepaliveTimer.unref();\n\n let stopped = false;\n const stopServer = async () => {\n if (stopped) return;\n stopped = true;\n\n clearTimeout(gcTimer);\n clearInterval(wsKeepaliveTimer);\n await app.close();\n autoFetch.stop();\n supervisorMgr.stop();\n terminalMgr.shutdown();\n wsHub.destroy();\n eventBus.clear();\n deleteRuntimeConfig();\n db.close();\n };\n\n const actualPort = extractListenPort(app) ?? config.port;\n console.log(`Server listening on http://${config.host}:${actualPort}`);\n\n return {\n app,\n stop: stopServer,\n __test__: { sessionMgr, commandContext },\n };\n}\n\nfunction extractListenPort(app: FastifyInstance): number | undefined {\n const address = app.server.address();\n if (address && typeof address === \"object\" && typeof address.port === \"number\") {\n return address.port;\n }\n return undefined;\n}\n\nfunction createPtyHost() {\n return new NodePtyHost();\n}\n\nfunction createTerminalDatabase(db: Database): TerminalDatabase {\n return {\n insert: (terminal) => {\n db.prepare(`\n INSERT INTO terminals (id, workspace_id, kind, title, cwd, argv, cols, rows, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).run(\n terminal.id,\n terminal.workspaceId,\n terminal.kind,\n terminal.title,\n terminal.cwd,\n JSON.stringify(terminal.argv),\n terminal.cols,\n terminal.rows,\n terminal.createdAt\n );\n },\n markEnded: (id: string, endedAt: number, exitCode: number) => {\n db.prepare(`\n UPDATE terminals SET ended_at = ?, exit_code = ? WHERE id = ?\n `).run(endedAt, exitCode, id);\n },\n };\n}\n\nfunction createSessionDatabase(db: Database) {\n return {\n insert: (session: SessionRow) => {\n db.prepare(`\n INSERT INTO sessions (id, workspace_id, terminal_id, provider_id, state, capability, started_at, last_active_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `).run(\n session.id,\n session.workspace_id,\n session.terminal_id,\n session.provider_id,\n session.state,\n session.capability,\n session.started_at,\n session.last_active_at\n );\n },\n update: (id: string, patch: Record<string, unknown>) => {\n const keys = Object.keys(patch);\n if (keys.length === 0) return;\n\n const allowedCols = new Set([\n \"terminal_id\",\n \"state\",\n \"started_at\",\n \"ended_at\",\n \"completion_percent\",\n \"error_reason\",\n \"last_active_at\",\n \"title\",\n ]);\n\n const setClauses: string[] = [];\n const values: unknown[] = [];\n for (const key of keys) {\n const col = key.replace(/([A-Z])/g, \"_$1\").toLowerCase();\n if (!allowedCols.has(col)) continue;\n setClauses.push(`${col} = ?`);\n values.push(patch[key]);\n }\n if (setClauses.length === 0) return;\n\n db.prepare(`UPDATE sessions SET ${setClauses.join(\", \")} WHERE id = ?`).run(\n ...(values as Array<string | number | bigint | Uint8Array | null>),\n id\n );\n },\n findById: (id: string) => {\n const row = db.prepare(\"SELECT * FROM sessions WHERE id = ?\").get(id) as\n | SessionRow\n | undefined;\n return row ? rowToSession(row) : undefined;\n },\n findByWorkspaceId: (workspaceId: string) => {\n const rows = db\n .prepare(\"SELECT * FROM sessions WHERE workspace_id = ? ORDER BY started_at DESC\")\n .all(workspaceId) as unknown as SessionRow[];\n return rows.map(rowToSession);\n },\n listHydratable: () => {\n const rows = db\n .prepare(\n \"SELECT * FROM sessions WHERE archived = 0 AND ended_at IS NULL ORDER BY started_at DESC\"\n )\n .all() as unknown as SessionRow[];\n return rows.map(rowToSession);\n },\n delete: (id: string) => {\n db.prepare(\"DELETE FROM sessions WHERE id = ?\").run(id);\n },\n };\n}\n\nif (isDirectExecution(import.meta.url)) {\n const server = await createServer();\n\n process.on(\"SIGINT\", async () => {\n console.log(\"\\nShutting down...\");\n await server.stop();\n process.exit(0);\n });\n\n process.on(\"SIGTERM\", async () => {\n console.log(\"\\nShutting down...\");\n await server.stop();\n process.exit(0);\n });\n}\n", "import type { Terminal } from \"@coder-studio/core\";\nimport type { Database } from \"../database.js\";\n\n/**\n * Database row representation for Terminal table\n */\nexport interface TerminalRow {\n id: string;\n workspace_id: string;\n kind: \"agent\" | \"shell\";\n cwd: string;\n argv: string; // JSON string\n env: string | null; // JSON string\n title: string | null;\n cols: number;\n rows: number;\n created_at: number;\n ended_at: number | null;\n exit_code: number | null;\n}\n\n/**\n * Input type for creating a new terminal\n */\nexport interface NewTerminal {\n id: string;\n workspaceId: string;\n kind: \"agent\" | \"shell\";\n cwd: string;\n argv: string[];\n env?: Record<string, string>;\n title?: string;\n cols: number;\n rows: number;\n createdAt: number;\n}\n\n/**\n * Terminal repository for CRUD operations\n */\nexport class TerminalRepo {\n constructor(private db: Database) {}\n\n /**\n * Lists all terminals for a workspace\n */\n listByWorkspace(workspaceId: string): Terminal[] {\n const rows = this.db\n .prepare(\"SELECT * FROM terminals WHERE workspace_id = ? ORDER BY created_at DESC\")\n .all(workspaceId) as unknown as TerminalRow[];\n return rows.map((row) => this.rowToTerminal(row));\n }\n\n /**\n * Finds a terminal by ID\n */\n findById(id: string): Terminal | undefined {\n const row = this.db.prepare(\"SELECT * FROM terminals WHERE id = ?\").get(id) as\n | TerminalRow\n | undefined;\n return row ? this.rowToTerminal(row) : undefined;\n }\n\n /**\n * Lists all active (non-ended) terminals for a workspace\n */\n listActiveByWorkspace(workspaceId: string): Terminal[] {\n const rows = this.db\n .prepare(\n \"SELECT * FROM terminals WHERE workspace_id = ? AND ended_at IS NULL ORDER BY created_at DESC\"\n )\n .all(workspaceId) as unknown as TerminalRow[];\n return rows.map((row) => this.rowToTerminal(row));\n }\n\n /**\n * Creates a new terminal\n */\n create(terminal: NewTerminal): Terminal {\n const stmt = this.db.prepare(`\n INSERT INTO terminals (id, workspace_id, kind, cwd, argv, env, title, cols, rows, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n stmt.run(\n terminal.id,\n terminal.workspaceId,\n terminal.kind,\n terminal.cwd,\n JSON.stringify(terminal.argv),\n terminal.env ? JSON.stringify(terminal.env) : null,\n terminal.title ?? null,\n terminal.cols,\n terminal.rows,\n terminal.createdAt\n );\n\n return this.findById(terminal.id)!;\n }\n\n /**\n * Marks a terminal as ended\n */\n markEnded(id: string, endedAt: number, exitCode: number): void {\n const stmt = this.db.prepare(\"UPDATE terminals SET ended_at = ?, exit_code = ? WHERE id = ?\");\n stmt.run(endedAt, exitCode, id);\n }\n\n /**\n * Updates terminal dimensions\n */\n updateDimensions(id: string, cols: number, rows: number): void {\n const stmt = this.db.prepare(\"UPDATE terminals SET cols = ?, rows = ? WHERE id = ?\");\n stmt.run(cols, rows, id);\n }\n\n /**\n * Updates terminal title\n */\n updateTitle(id: string, title: string): void {\n const stmt = this.db.prepare(\"UPDATE terminals SET title = ? WHERE id = ?\");\n stmt.run(title, id);\n }\n\n /**\n * Deletes a terminal by ID\n */\n delete(id: string): void {\n const stmt = this.db.prepare(\"DELETE FROM terminals WHERE id = ?\");\n stmt.run(id);\n }\n\n /**\n * Converts a database row to a Terminal domain object\n */\n private rowToTerminal(row: TerminalRow): Terminal {\n return {\n id: row.id,\n workspaceId: row.workspace_id,\n kind: row.kind,\n cwd: row.cwd,\n argv: JSON.parse(row.argv) as string[],\n cols: row.cols,\n rows: row.rows,\n alive: row.ended_at === null,\n createdAt: row.created_at,\n endedAt: row.ended_at ?? undefined,\n exitCode: row.exit_code ?? undefined,\n title: row.title ?? \"\",\n env: row.env ? (JSON.parse(row.env) as Record<string, string>) : undefined,\n };\n }\n}\n", "import type { UiState, Workspace } from \"@coder-studio/core\";\nimport type { Database } from \"../database.js\";\n\n/**\n * Database row representation for Workspace table\n */\nexport interface WorkspaceRow {\n id: string;\n path: string;\n target_runtime: \"native\" | \"wsl\";\n wsl_distro: string | null;\n opened_at: number;\n last_active_at: number;\n ui_state: string; // JSON string\n}\n\n/**\n * Input type for creating a new workspace\n */\nexport interface NewWorkspace {\n id: string;\n path: string;\n targetRuntime: \"native\" | \"wsl\";\n wslDistro?: string;\n openedAt: number;\n lastActiveAt: number;\n uiState: UiState;\n}\n\n/**\n * Workspace repository for CRUD operations\n */\nexport class WorkspaceRepo {\n constructor(private db: Database) {}\n\n /**\n * Lists all workspaces\n */\n list(): Workspace[] {\n const rows = this.db.prepare(\"SELECT * FROM workspaces\").all() as unknown as WorkspaceRow[];\n return rows.map((row) => this.rowToWorkspace(row));\n }\n\n /**\n * Finds a workspace by ID\n */\n findById(id: string): Workspace | undefined {\n const row = this.db.prepare(\"SELECT * FROM workspaces WHERE id = ?\").get(id) as\n | WorkspaceRow\n | undefined;\n return row ? this.rowToWorkspace(row) : undefined;\n }\n\n /**\n * Finds a workspace by path\n */\n findByPath(path: string): Workspace | undefined {\n const row = this.db.prepare(\"SELECT * FROM workspaces WHERE path = ?\").get(path) as\n | WorkspaceRow\n | undefined;\n return row ? this.rowToWorkspace(row) : undefined;\n }\n\n /**\n * Creates a new workspace\n */\n create(workspace: NewWorkspace): Workspace {\n const stmt = this.db.prepare(`\n INSERT INTO workspaces (id, path, target_runtime, wsl_distro, opened_at, last_active_at, ui_state)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `);\n\n stmt.run(\n workspace.id,\n workspace.path,\n workspace.targetRuntime,\n workspace.wslDistro ?? null,\n workspace.openedAt,\n workspace.lastActiveAt,\n JSON.stringify(workspace.uiState)\n );\n\n return this.findById(workspace.id)!;\n }\n\n /**\n * Updates the UI state for a workspace\n */\n updateUiState(id: string, uiState: UiState): void {\n const stmt = this.db.prepare(\"UPDATE workspaces SET ui_state = ? WHERE id = ?\");\n stmt.run(JSON.stringify(uiState), id);\n }\n\n /**\n * Updates the last active timestamp for a workspace\n */\n updateLastActive(id: string, lastActiveAt: number): void {\n const stmt = this.db.prepare(\"UPDATE workspaces SET last_active_at = ? WHERE id = ?\");\n stmt.run(lastActiveAt, id);\n }\n\n /**\n * Deletes a workspace by ID\n */\n delete(id: string): void {\n const stmt = this.db.prepare(\"DELETE FROM workspaces WHERE id = ?\");\n stmt.run(id);\n }\n\n /**\n * Converts a database row to a Workspace domain object\n */\n private rowToWorkspace(row: WorkspaceRow): Workspace {\n return {\n id: row.id,\n path: row.path,\n targetRuntime: row.target_runtime,\n wslDistro: row.wsl_distro ?? undefined,\n openedAt: row.opened_at,\n lastActiveAt: row.last_active_at,\n uiState: JSON.parse(row.ui_state) as UiState,\n };\n }\n}\n", "export { type Database, withTransaction } from \"./database.js\";\nexport { closeDatabase, openDatabase } from \"./db.js\";\nexport {\n type AuthLoginBlockRecord,\n AuthLoginBlockRepo,\n} from \"./repositories/auth-login-block-repo.js\";\nexport { ProviderConfigRepo } from \"./repositories/provider-config-repo.js\";\nexport {\n type NewSession,\n rowToSession,\n SessionRepo,\n type SessionRow,\n sessionToRow,\n} from \"./repositories/session-repo.js\";\nexport { SettingsRepo } from \"./repositories/settings-repo.js\";\nexport {\n type NewSupervisorCycleAttempt,\n SupervisorCycleAttemptRepo,\n type SupervisorCycleAttemptUpdatePatch,\n} from \"./repositories/supervisor-cycle-attempt-repo.js\";\nexport {\n SupervisorCycleRepo,\n type SupervisorCycleUpdatePatch,\n} from \"./repositories/supervisor-cycle-repo.js\";\nexport {\n type NewSupervisor,\n SupervisorRepo,\n type SupervisorUpdatePatch,\n} from \"./repositories/supervisor-repo.js\";\nexport { type NewTerminal, TerminalRepo, type TerminalRow } from \"./repositories/terminal-repo.js\";\nexport {\n type NewWorkspace,\n WorkspaceRepo,\n type WorkspaceRow,\n} from \"./repositories/workspace-repo.js\";\n", "// Terminal module exports\n\nexport { ActiveTerminal } from \"./active-terminal\";\nexport { TerminalManager } from \"./manager\";\nexport { NodePtyHost } from \"./pty-host\";\nexport { RingBuffer } from \"./ring-buffer\";\nexport type {\n Broadcaster,\n PtyHost,\n PtyProcess,\n PtySpawnOptions,\n ReplayResult,\n TerminalDatabase,\n TerminalId,\n TerminalSpec,\n} from \"./types\";\nexport { TerminalNotAliveError, TerminalSpawnError } from \"./types\";\n", "export * from \"./auth/index.js\";\nexport { EventBus } from \"./bus/event-bus.js\";\nexport { parseServerConfig, type ServerConfig } from \"./config.js\";\nexport type { Server } from \"./server.js\";\n// Server entry point\nexport { createServer } from \"./server.js\";\nexport * from \"./storage/index.js\";\nexport * from \"./terminal/index.js\";\nexport { type Broadcaster, WsHub } from \"./ws/hub.js\";\n", "import { existsSync, rmSync } from \"fs\";\nimport { dirname, join } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { clearAuthBlockByIp, listAuthBlocks } from \"./auth-control.js\";\nimport { openBrowser } from \"./browser.js\";\nimport { type CliConfig, readCliConfig, writeCliConfig } from \"./config-store.js\";\nimport { readLogExcerpt } from \"./log-excerpt.js\";\nimport { assertSupportedNodeVersion } from \"./node-version.js\";\nimport { getCliVersion } from \"./package-manifest.js\";\nimport { parseArgs } from \"./parse-args.js\";\nimport { startManagedServer } from \"./pm2-control.js\";\nimport { confirmYesNo, isInteractiveSession } from \"./prompts.js\";\nimport { getServerStatus, type ServerStatus, stopRunningServer } from \"./server-control.js\";\nimport { startServer, verifyLocalDatabaseCompatibility } from \"./server-runner.js\";\nimport { getBrowserUrl, getListenIp, getListenUrl } from \"./server-url.js\";\n\nconst MANAGED_SERVER_WAIT_MS = 5000;\nconst DEFAULT_LOG_TAIL_LINES = 40;\n\nfunction formatConfig(config: CliConfig | null): string {\n return JSON.stringify(config ?? {}, null, 2);\n}\n\nfunction formatStatus(status: ServerStatus): string {\n const listenUrl = getListenUrl(status) ?? \"n/a\";\n const browserUrl = getBrowserUrl(status) ?? \"n/a\";\n const startedAt = status.startedAt === null ? \"n/a\" : new Date(status.startedAt).toISOString();\n\n return [\n `Status: ${status.status}`,\n `Listen host: ${status.host ?? \"n/a\"}`,\n `Listen IP: ${getListenIp(status) ?? \"n/a\"}`,\n `Port: ${status.port ?? \"n/a\"}`,\n `Listen URL: ${listenUrl}`,\n `Local URL: ${browserUrl}`,\n `PID: ${status.pid ?? \"n/a\"}`,\n `Started: ${startedAt}`,\n `Restarts: ${status.restartCount}`,\n `Out log: ${status.outFile}`,\n `Error log: ${status.errFile}`,\n ].join(\"\\n\");\n}\n\nfunction showLogs(\n status: ServerStatus,\n {\n tail = DEFAULT_LOG_TAIL_LINES,\n errorsOnly = false,\n }: { tail?: number; errorsOnly?: boolean } = {}\n): void {\n const paths = errorsOnly ? [status.errFile] : [status.outFile, status.errFile];\n const contents = paths\n .filter((path, index, paths) => paths.indexOf(path) === index)\n .flatMap((path) => {\n const content = readLogExcerpt(path, { maxLines: tail, maxChars: null });\n return content ? [content] : [];\n });\n\n console.log(contents.length === 0 ? \"No logs available.\" : contents.join(\"\\n\"));\n}\n\nfunction showHelp(): void {\n console.log(`\n@spencer-kit/coder-studio - Coder Studio CLI\n\nUSAGE:\n coder-studio [COMMAND]\n\nCOMMANDS:\n serve Start the Coder Studio server in background (default)\n server Alias for serve\n open Start the server if needed and open Coder Studio in a browser\n auth Manage auth login blocks in local server storage\n config Persist CLI host/port/data-dir/password settings\n stop Stop the managed Coder Studio server\n status Show the managed server status\n logs Show the managed server logs\n help Show this help message\n version Show version\n\nOPTIONS:\n --host <string> Save server host for future runs\n --port, -p <number> Save server port for future runs\n --data-dir, -d <path> Save data directory for future runs\n --password <string> Save auth password for future runs\n --restart Restart an already running managed server for serve/open\n --help Show help\n --version, -v Show version\n\nEXAMPLES:\n coder-studio\n coder-studio serve\n coder-studio server\n coder-studio auth ban-list\n coder-studio auth unblock --ip 198.51.100.24\n coder-studio serve --foreground\n coder-studio serve --restart\n coder-studio open\n coder-studio open --restart\n coder-studio status\n coder-studio logs\n coder-studio stop\n coder-studio config --host 0.0.0.0 --port 8080\n`);\n}\n\nfunction showConfigHelp(): void {\n console.log(`\n@spencer-kit/coder-studio - config\n\nUSAGE:\n coder-studio config [OPTIONS]\n coder-studio config help\n\nBEHAVIOR:\n Without options, prints the current saved config.\n Bare serve reads this saved config for future runs.\n\nOPTIONS:\n --host <string> Save server host for future runs\n --port, -p <number> Save server port for future runs\n --data-dir, -d <path> Save data directory for future runs\n --password <string> Save auth password for future runs\n --help Show config help\n\nEXAMPLES:\n coder-studio config\n coder-studio config --host 0.0.0.0\n coder-studio config --port 8080\n coder-studio config --data-dir /tmp/cs-data\n coder-studio config --password sekrit\n coder-studio config --host 0.0.0.0 --port 8080\n`);\n}\n\nfunction showVersion(): void {\n console.log(`@spencer-kit/coder-studio v${getCliVersion(import.meta.url)}`);\n}\n\nfunction formatAuthBlocks(blocks: Awaited<ReturnType<typeof listAuthBlocks>>): string {\n if (blocks.length === 0) {\n return \"No blocked IPs.\";\n }\n\n return JSON.stringify(blocks, null, 2);\n}\n\nfunction resolveManagedScriptPath(): string {\n const currentFile = fileURLToPath(import.meta.url);\n const currentDir = dirname(currentFile);\n const candidates = [\n join(currentDir, \"server-runner.js\"),\n join(currentDir, \"server-runner.mjs\"),\n join(currentDir, \"../src/server-runner.ts\"),\n ];\n\n const scriptPath = candidates.find((candidate) => existsSync(candidate));\n if (!scriptPath) {\n throw new Error(\"Unable to locate the managed server entry script\");\n }\n\n return scriptPath;\n}\n\nfunction isRunningStatus(status: ServerStatus): boolean {\n return status.status === \"running\" || status.status === \"starting\";\n}\n\ninterface ManagedStartupDecision {\n existingStatus: ServerStatus | null;\n restartRequested: boolean;\n}\n\nasync function shouldRestartRunningServer(status: ServerStatus): Promise<boolean> {\n const currentUrl = getBrowserUrl(status) ?? getListenUrl(status) ?? \"the existing server\";\n\n if (!isInteractiveSession()) {\n return false;\n }\n\n return confirmYesNo(`Coder Studio is already running at ${currentUrl}. Restart it? [y/N] `);\n}\n\nasync function prepareManagedStartup(forceRestart = false): Promise<ManagedStartupDecision> {\n const status = await getServerStatus();\n if (!isRunningStatus(status)) {\n return {\n existingStatus: null,\n restartRequested: false,\n };\n }\n\n const restart = forceRestart ? true : await shouldRestartRunningServer(status);\n if (!restart) {\n const currentUrl = getBrowserUrl(status) ?? getListenUrl(status) ?? \"n/a\";\n if (!isInteractiveSession()) {\n console.log(\n `Coder Studio is already running at ${currentUrl}. Service already exists and was not restarted.`\n );\n } else {\n console.log(`Leaving the existing Coder Studio server running at ${currentUrl}.`);\n }\n return {\n existingStatus: status,\n restartRequested: false,\n };\n }\n\n console.log(\"Restarting the managed Coder Studio server...\");\n return {\n existingStatus: null,\n restartRequested: true,\n };\n}\n\nasync function startManagedServerFlow(): Promise<void> {\n await startManagedServer({\n script: resolveManagedScriptPath(),\n cwd: process.cwd(),\n waitMs: MANAGED_SERVER_WAIT_MS,\n });\n}\n\ninterface IncompatibleSchemaErrorLike {\n code: \"db_incompatible_schema\";\n dbPath: string;\n}\n\nfunction parseIncompatibleSchemaError(error: unknown): IncompatibleSchemaErrorLike | null {\n if (!error || typeof error !== \"object\") {\n return null;\n }\n\n const candidate = error as { code?: unknown; dbPath?: unknown };\n if (candidate.code !== \"db_incompatible_schema\" || typeof candidate.dbPath !== \"string\") {\n return null;\n }\n\n return {\n code: \"db_incompatible_schema\",\n dbPath: candidate.dbPath,\n };\n}\n\nasync function handleIncompatibleSchema(error: unknown): Promise<boolean> {\n const payload = parseIncompatibleSchemaError(error);\n if (!payload) {\n return false;\n }\n\n const approved = isInteractiveSession()\n ? await confirmYesNo(\n `Local database is incompatible at ${payload.dbPath}. Delete and rebuild the local database? [y/N] `\n )\n : false;\n\n if (!approved) {\n throw error;\n }\n\n rmSync(payload.dbPath, { force: true });\n return true;\n}\n\nasync function verifyManagedDatabaseCompatibility(): Promise<void> {\n try {\n verifyLocalDatabaseCompatibility();\n } catch (error) {\n const rebuilt = await handleIncompatibleSchema(error);\n if (!rebuilt) {\n throw error;\n }\n\n verifyLocalDatabaseCompatibility();\n }\n}\n\nasync function openManagedServerInBrowser(existingStatus?: ServerStatus | null): Promise<void> {\n const status = existingStatus ?? (await getServerStatus());\n const browserUrl = getBrowserUrl(status);\n\n if (browserUrl === null) {\n throw new Error(\"Unable to determine the running Coder Studio URL.\");\n }\n\n console.log(`Opening Coder Studio in your browser: ${browserUrl}`);\n await openBrowser(browserUrl);\n}\n\nexport async function main(argv = process.argv.slice(2)): Promise<void> {\n assertSupportedNodeVersion();\n const args = parseArgs(argv);\n\n if (args.command === \"config\") {\n if (args.configHelp) {\n showConfigHelp();\n return;\n }\n\n if (\n args.host === undefined &&\n args.port === undefined &&\n args.dataDir === undefined &&\n args.password === undefined\n ) {\n console.log(formatConfig(readCliConfig()));\n return;\n }\n\n const savedConfig = readCliConfig();\n const nextConfig: CliConfig = {\n ...(savedConfig?.host !== undefined ? { host: savedConfig.host } : {}),\n ...(savedConfig?.port !== undefined && savedConfig.port > 0\n ? { port: savedConfig.port }\n : {}),\n ...(savedConfig?.dataDir !== undefined ? { dataDir: savedConfig.dataDir } : {}),\n ...(savedConfig?.password !== undefined ? { password: savedConfig.password } : {}),\n ...(args.host !== undefined ? { host: args.host } : {}),\n ...(args.port !== undefined ? { port: args.port } : {}),\n ...(args.dataDir !== undefined ? { dataDir: args.dataDir } : {}),\n ...(args.password !== undefined ? { password: args.password } : {}),\n };\n writeCliConfig(nextConfig);\n console.log(formatConfig(nextConfig));\n return;\n }\n\n if (args.command === \"stop\") {\n const stopped = await stopRunningServer();\n console.log(stopped ? \"Stopped Coder Studio server.\" : \"No running Coder Studio server found.\");\n return;\n }\n\n if (args.command === \"status\") {\n console.log(formatStatus(await getServerStatus()));\n return;\n }\n\n if (args.command === \"logs\") {\n showLogs(await getServerStatus(), { tail: args.tail, errorsOnly: args.errorsOnly });\n return;\n }\n\n if (args.command === \"help\") {\n showHelp();\n return;\n }\n\n if (args.command === \"version\") {\n showVersion();\n return;\n }\n\n if (args.command === \"auth\") {\n if (args.authCommand === \"ban-list\") {\n console.log(formatAuthBlocks(await listAuthBlocks()));\n return;\n }\n\n if (args.authCommand === \"unblock\") {\n const cleared = await clearAuthBlockByIp(args.ip!);\n console.log(cleared ? `Unblocked IP: ${args.ip}` : `No block found for IP: ${args.ip}`);\n return;\n }\n }\n\n if (args.command === \"open\") {\n const startup = await prepareManagedStartup(args.restart);\n if (startup.existingStatus === null) {\n await verifyManagedDatabaseCompatibility();\n await startManagedServerFlow();\n }\n\n await openManagedServerInBrowser(startup.existingStatus);\n return;\n }\n\n if (args.foreground) {\n const startup = await prepareManagedStartup(args.restart);\n if (startup.existingStatus !== null) {\n return;\n }\n\n if (startup.restartRequested) {\n await stopRunningServer();\n }\n\n console.log(\"Starting Coder Studio Server in foreground...\");\n try {\n await startServer();\n } catch (error) {\n const rebuilt = await handleIncompatibleSchema(error);\n if (!rebuilt) {\n throw error;\n }\n await startServer();\n }\n return;\n }\n\n const startup = await prepareManagedStartup(args.restart);\n if (startup.existingStatus !== null) {\n return;\n }\n\n await verifyManagedDatabaseCompatibility();\n await startManagedServerFlow();\n\n console.log(\"Coder Studio server started in background.\");\n console.log(\"Run `coder-studio status` to inspect the server.\");\n}\n", "import {\n AuthLoginBlockRepo,\n closeDatabase,\n openDatabase,\n parseServerConfig,\n} from \"@coder-studio/server\";\nimport { readCliConfig } from \"./config-store.js\";\n\nexport interface CliAuthBlock {\n ip: string;\n failedCount: number;\n firstFailedAt: number;\n lastFailedAt: number;\n blockedUntil: number;\n}\n\nfunction resolveDataDir(): string {\n const savedConfig = readCliConfig();\n return parseServerConfig({\n ...(savedConfig?.dataDir !== undefined ? { dataDir: savedConfig.dataDir } : {}),\n }).dataDir;\n}\n\nexport async function listAuthBlocks(now = Date.now()): Promise<CliAuthBlock[]> {\n const db = openDatabase(resolveDataDir());\n try {\n const repo = new AuthLoginBlockRepo(db);\n return repo.listActiveBlocks(now).map((record) => ({\n ip: record.ip,\n failedCount: record.failedCount,\n firstFailedAt: record.firstFailedAt,\n lastFailedAt: record.lastFailedAt,\n blockedUntil: record.blockedUntil ?? 0,\n }));\n } finally {\n closeDatabase(db);\n }\n}\n\nexport async function clearAuthBlockByIp(ip: string): Promise<boolean> {\n const db = openDatabase(resolveDataDir());\n try {\n const repo = new AuthLoginBlockRepo(db);\n return repo.delete(ip);\n } finally {\n closeDatabase(db);\n }\n}\n", "import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { basename, join } from \"path\";\n\nconst DEFAULT_DB_FILE = \"coder-studio.db\";\n\nexport interface CliConfig {\n host?: string;\n port?: number;\n dataDir?: string;\n password?: string;\n}\n\nexport function getCliConfigPath(): string {\n return join(homedir(), \".coder-studio\", \"config.json\");\n}\n\nexport function normalizeDataDir(input: string): string {\n if (input.endsWith(\".db\")) {\n return input;\n }\n if (basename(input).includes(\".\")) {\n return input;\n }\n return join(input, DEFAULT_DB_FILE);\n}\n\nexport function readCliConfig(): CliConfig | null {\n const path = getCliConfigPath();\n if (!existsSync(path)) {\n return null;\n }\n\n try {\n const parsed = JSON.parse(readFileSync(path, \"utf-8\")) as CliConfig;\n if (\n (parsed.host !== undefined && typeof parsed.host !== \"string\") ||\n (parsed.port !== undefined && typeof parsed.port !== \"number\") ||\n (parsed.dataDir !== undefined && typeof parsed.dataDir !== \"string\") ||\n (parsed.password !== undefined && typeof parsed.password !== \"string\")\n ) {\n return null;\n }\n return parsed;\n } catch {\n return null;\n }\n}\n\nexport function writeCliConfig(config: CliConfig): void {\n const path = getCliConfigPath();\n const dir = join(homedir(), \".coder-studio\");\n const normalizedConfig: CliConfig = {\n ...(config.host !== undefined ? { host: config.host } : {}),\n ...(config.port !== undefined && config.port > 0 ? { port: config.port } : {}),\n ...(config.dataDir !== undefined ? { dataDir: normalizeDataDir(config.dataDir) } : {}),\n ...(config.password !== undefined ? { password: config.password } : {}),\n };\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(path, JSON.stringify(normalizedConfig, null, 2), \"utf-8\");\n}\n", "import { spawn } from \"node:child_process\";\n\nfunction getOpenCommand(url: string): { command: string; args: string[] } {\n switch (process.platform) {\n case \"darwin\":\n return { command: \"open\", args: [url] };\n case \"win32\":\n return { command: \"cmd\", args: [\"/c\", \"start\", \"\", url] };\n default:\n return { command: \"xdg-open\", args: [url] };\n }\n}\n\nexport async function openBrowser(url: string): Promise<void> {\n const { command, args } = getOpenCommand(url);\n\n await new Promise<void>((resolve, reject) => {\n const child = spawn(command, args, {\n detached: true,\n stdio: \"ignore\",\n windowsHide: true,\n });\n\n child.once(\"error\", reject);\n child.once(\"spawn\", () => {\n child.unref();\n resolve();\n });\n });\n}\n", "import { closeSync, existsSync, openSync, readSync, statSync } from \"fs\";\n\nconst DEFAULT_MAX_LINES = 40;\nconst DEFAULT_MAX_CHARS = 4000;\nconst DEFAULT_MAX_BYTES = 16 * 1024;\n\nexport interface LogExcerptOptions {\n startOffset?: number;\n maxBytes?: number;\n maxLines?: number;\n maxChars?: number | null;\n}\n\nexport const getFileSize = (path: string): number => {\n if (!existsSync(path)) {\n return 0;\n }\n\n try {\n return statSync(path).size;\n } catch {\n return 0;\n }\n};\n\nexport const readLogExcerpt = (\n path: string,\n {\n startOffset = 0,\n maxBytes = DEFAULT_MAX_BYTES,\n maxLines = DEFAULT_MAX_LINES,\n maxChars = DEFAULT_MAX_CHARS,\n }: LogExcerptOptions = {}\n): string | null => {\n if (!existsSync(path)) {\n return null;\n }\n\n const fileSize = getFileSize(path);\n const safeOffset = startOffset > fileSize ? 0 : Math.max(0, startOffset);\n if (fileSize === safeOffset) {\n return null;\n }\n\n const bytesToRead = Math.min(fileSize - safeOffset, maxBytes);\n const readStart = fileSize - bytesToRead;\n const buffer = Buffer.allocUnsafe(bytesToRead);\n const fd = openSync(path, \"r\");\n let content = \"\";\n let startsMidLine = false;\n\n try {\n const bytesRead = readSync(fd, buffer, 0, bytesToRead, readStart);\n if (bytesRead === 0) {\n return null;\n }\n\n if (readStart > safeOffset && readStart > 0) {\n const previousByte = Buffer.alloc(1);\n const previousBytesRead = readSync(fd, previousByte, 0, 1, readStart - 1);\n startsMidLine = previousBytesRead === 1 && previousByte[0] !== 0x0a;\n }\n\n content = buffer.toString(\"utf-8\", 0, bytesRead).trimEnd();\n } finally {\n closeSync(fd);\n }\n\n if (startsMidLine) {\n const firstNewlineIndex = content.indexOf(\"\\n\");\n if (firstNewlineIndex !== -1) {\n content = content.slice(firstNewlineIndex + 1);\n }\n }\n\n if (content.length === 0) {\n return null;\n }\n\n const lines = content\n .split(/\\r?\\n/u)\n .map((line) => line.trimEnd())\n .filter((line) => line.length > 0);\n if (lines.length === 0) {\n return null;\n }\n\n const excerpt = lines.slice(-maxLines).join(\"\\n\");\n if (maxChars === null || excerpt.length <= maxChars) {\n return excerpt;\n }\n\n return `\u2026${excerpt.slice(-maxChars + 1)}`;\n};\n", "export const MINIMUM_NODE_VERSION = \"24.0.0\";\n\nfunction parseVersion(version: string): [number, number, number] {\n const [major = \"0\", minor = \"0\", patch = \"0\"] = version.split(\".\");\n return [\n Number.parseInt(major, 10) || 0,\n Number.parseInt(minor, 10) || 0,\n Number.parseInt(patch, 10) || 0,\n ];\n}\n\nexport function isNodeVersionSupported(version: string): boolean {\n const current = parseVersion(version);\n const minimum = parseVersion(MINIMUM_NODE_VERSION);\n\n for (let index = 0; index < minimum.length; index += 1) {\n const currentPart = current[index] ?? 0;\n const minimumPart = minimum[index] ?? 0;\n if (currentPart > minimumPart) return true;\n if (currentPart < minimumPart) return false;\n }\n\n return true;\n}\n\nexport function assertSupportedNodeVersion(version = process.versions.node): void {\n if (isNodeVersionSupported(version)) {\n return;\n }\n\n throw new Error(\n `Coder Studio requires Node.js >=${MINIMUM_NODE_VERSION} because it uses the built-in node:sqlite module. Current version: ${version}.`\n );\n}\n", "import { existsSync, readFileSync } from \"fs\";\n\ninterface CliPackageManifest {\n version?: string;\n}\n\nexport function resolveCliPackageManifestUrl(importMetaUrl: string): URL {\n const manifestUrl = [\n new URL(\"../package.json\", importMetaUrl),\n new URL(\"../../package.json\", importMetaUrl),\n ].find((candidate) => existsSync(candidate));\n\n if (!manifestUrl) {\n throw new Error(\"Unable to locate CLI package.json\");\n }\n\n return manifestUrl;\n}\n\nexport function getCliPackageManifest(importMetaUrl: string): CliPackageManifest {\n return JSON.parse(\n readFileSync(resolveCliPackageManifestUrl(importMetaUrl), \"utf-8\")\n ) as CliPackageManifest;\n}\n\nexport function getCliVersion(importMetaUrl: string): string {\n return getCliPackageManifest(importMetaUrl).version ?? \"0.0.0\";\n}\n", "type CliCommand =\n | \"serve\"\n | \"open\"\n | \"config\"\n | \"stop\"\n | \"status\"\n | \"logs\"\n | \"help\"\n | \"version\"\n | \"auth\";\ntype AuthCommand = \"ban-list\" | \"unblock\";\n\nexport const RUNTIME_CONFIG_ERROR =\n \"Host, port, data-dir, password, and auth settings must be configured via the config command\";\n\nexport interface CliArgs {\n foreground?: boolean;\n restart?: boolean;\n command?: CliCommand;\n tail?: number;\n errorsOnly?: boolean;\n authCommand?: AuthCommand;\n configHelp?: boolean;\n port?: number;\n host?: string;\n dataDir?: string;\n password?: string;\n noAuth?: boolean;\n ip?: string;\n}\n\nfunction getActiveCommand(args: CliArgs): CliCommand {\n return args.command ?? \"serve\";\n}\n\nfunction clearConfigArgs(args: CliArgs): void {\n delete args.configHelp;\n delete args.port;\n delete args.host;\n delete args.dataDir;\n delete args.password;\n delete args.noAuth;\n}\n\nfunction clearAuthArgs(args: CliArgs): void {\n delete args.authCommand;\n delete args.ip;\n}\n\nfunction clearLogsArgs(args: CliArgs): void {\n delete args.tail;\n delete args.errorsOnly;\n}\n\nfunction setCommand(args: CliArgs, command: CliCommand): void {\n if (command !== \"config\") {\n clearConfigArgs(args);\n }\n\n if (command !== \"auth\") {\n clearAuthArgs(args);\n }\n\n if (command !== \"logs\") {\n clearLogsArgs(args);\n }\n\n if (command !== \"serve\") {\n delete args.foreground;\n }\n\n if (command !== \"serve\" && command !== \"open\") {\n delete args.restart;\n }\n\n args.command = command;\n}\n\nfunction throwUnknownOption(option: string): never {\n throw new Error(`Unknown option: ${option}`);\n}\n\nfunction throwUnknownArgument(argument: string): never {\n throw new Error(`Unknown argument: ${argument}`);\n}\n\nfunction ensureConfigContext(args: CliArgs, option: string): void {\n const command = getActiveCommand(args);\n\n if (command === \"config\") {\n return;\n }\n\n if (command === \"serve\") {\n throw new Error(RUNTIME_CONFIG_ERROR);\n }\n\n throwUnknownOption(option);\n}\n\nfunction readOptionValue(argv: string[], index: number, label: string): string {\n const value = argv[index];\n\n if (value === undefined) {\n throw new Error(`Missing ${label} value`);\n }\n\n return value;\n}\n\nexport function parseArgs(argv: string[]): CliArgs {\n const args: CliArgs = {};\n\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n if (arg === undefined) {\n continue;\n }\n\n switch (arg) {\n case \"serve\":\n case \"open\":\n case \"config\":\n case \"stop\":\n case \"status\":\n case \"logs\":\n case \"version\":\n case \"auth\":\n setCommand(args, arg);\n break;\n\n case \"server\":\n setCommand(args, \"serve\");\n break;\n\n case \"help\":\n case \"--help\":\n case \"-h\":\n if (args.command === \"config\") {\n args.configHelp = true;\n break;\n }\n\n setCommand(args, \"help\");\n break;\n\n case \"--version\":\n case \"-v\":\n setCommand(args, \"version\");\n break;\n\n case \"--foreground\":\n if (getActiveCommand(args) !== \"serve\") {\n throwUnknownOption(arg);\n }\n\n args.foreground = true;\n break;\n\n case \"--restart\": {\n const command = getActiveCommand(args);\n\n if (command !== \"serve\" && command !== \"open\") {\n throwUnknownOption(arg);\n }\n\n args.restart = true;\n break;\n }\n\n case \"--tail\": {\n if (getActiveCommand(args) !== \"logs\") {\n throwUnknownOption(arg);\n }\n\n const tailValue = readOptionValue(argv, i + 1, \"tail\");\n if (!/^[1-9]\\d*$/u.test(tailValue)) {\n throw new Error(\"Invalid tail number\");\n }\n\n const tail = Number(tailValue);\n if (!Number.isSafeInteger(tail)) {\n throw new Error(\"Invalid tail number\");\n }\n\n args.tail = tail;\n i += 1;\n break;\n }\n\n case \"--errors-only\":\n if (getActiveCommand(args) !== \"logs\") {\n throwUnknownOption(arg);\n }\n\n args.errorsOnly = true;\n break;\n\n case \"--port\":\n case \"-p\": {\n ensureConfigContext(args, arg);\n const portValue = readOptionValue(argv, i + 1, \"port\");\n const port = Number.parseInt(portValue, 10);\n\n if (Number.isNaN(port)) {\n throw new Error(\"Invalid port number\");\n }\n\n args.port = port;\n i += 1;\n break;\n }\n\n case \"--host\":\n ensureConfigContext(args, arg);\n args.host = readOptionValue(argv, i + 1, \"host\");\n i += 1;\n break;\n\n case \"--data-dir\":\n case \"-d\":\n ensureConfigContext(args, arg);\n args.dataDir = readOptionValue(argv, i + 1, \"data-dir\");\n i += 1;\n break;\n\n case \"--password\":\n ensureConfigContext(args, arg);\n args.password = readOptionValue(argv, i + 1, \"password\");\n i += 1;\n break;\n\n case \"--no-auth\":\n if (getActiveCommand(args) === \"serve\") {\n throw new Error(RUNTIME_CONFIG_ERROR);\n }\n\n throwUnknownOption(arg);\n\n case \"ban-list\":\n case \"unblock\":\n if (getActiveCommand(args) !== \"auth\") {\n throwUnknownArgument(arg);\n }\n\n args.authCommand = arg;\n break;\n\n case \"--ip\":\n if (getActiveCommand(args) !== \"auth\" || args.authCommand !== \"unblock\") {\n throwUnknownOption(arg);\n }\n\n args.ip = readOptionValue(argv, i + 1, \"ip\");\n i += 1;\n break;\n\n default:\n if (arg.startsWith(\"-\")) {\n throwUnknownOption(arg);\n }\n\n throwUnknownArgument(arg);\n }\n }\n\n if (args.command === undefined) {\n args.command = \"serve\";\n }\n\n if (args.command === \"auth\") {\n if (args.authCommand === undefined) {\n throw new Error(\"Missing auth subcommand\");\n }\n\n if (args.authCommand === \"unblock\" && args.ip === undefined) {\n throw new Error(\"Missing ip value\");\n }\n }\n\n return args;\n}\n", "import { deleteRuntimeConfig, readRuntimeConfig } from \"@coder-studio/core/runtime\";\nimport { mkdirSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\nimport { getFileSize, readLogExcerpt } from \"./log-excerpt.js\";\n\nexport const MANAGED_SERVER_NAME = \"coder-studio-server\";\nconst PM2_RESTART_DELAY_MS = 2000;\nconst PM2_MIN_UPTIME = \"5s\";\nconst PM2_MAX_RESTARTS = 10;\nconst PM2_DELETE_WAIT_MS = 5000;\nconst PM2_DISCONNECT_WAIT_MS = 1000;\nconst STARTUP_POLL_INTERVAL_MS = 100;\nconst STARTUP_FAILURE_GUIDANCE =\n \"Run `coder-studio logs` for details or `coder-studio serve --foreground` for interactive debugging.\";\n\nexport interface ManagedServerStatus {\n status: \"running\" | \"starting\" | \"stopped\" | \"errored\";\n pm2Pid: number | null;\n restartCount: number;\n}\n\nexport interface StartManagedServerOptions {\n script: string;\n cwd: string;\n waitMs: number;\n args?: string[];\n}\n\ninterface Pm2ProcessDescription {\n pid?: number;\n pm2_env?: {\n status?: string;\n restart_time?: number;\n };\n}\n\ninterface StartupLogOffsets {\n outOffset: number;\n errOffset: number;\n}\n\nconst isMissingManagedServerError = (error: unknown): boolean => {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return /not found|process or namespace/i.test(error.message);\n};\n\n/**\n * Detects if PM2 is in a broken state (e.g. pointing to an old worktree).\n */\nconst isPm2BrokenStateError = (error: unknown): boolean => {\n if (!(error instanceof Error)) {\n return false;\n }\n return (\n error.message.includes(\"ProcessContainerFork\") ||\n (error.message.includes(\"Cannot find module\") && error.message.includes(\"pm2\"))\n );\n};\n\ntype Pm2Module = {\n connect: (cb: (err: Error | null) => void) => void;\n disconnect: (cb?: (err: Error | null, data?: unknown) => void) => void;\n describe: (name: string, cb: (err: Error | null, result: unknown[]) => void) => void;\n delete: (name: string, cb: (err: Error | null) => void) => void;\n start: (opts: unknown, cb: (err: Error | null) => void) => void;\n kill: (cb: (err: Error | null) => void) => void;\n};\n\nlet cachedPm2: Pm2Module | null = null;\n\nasync function loadPm2(): Promise<Pm2Module> {\n if (cachedPm2) {\n return cachedPm2;\n }\n\n let pm2Module: Pm2Module;\n try {\n const pm2 = await import(\"pm2\");\n pm2Module = pm2.default as unknown as Pm2Module;\n } catch {\n throw new Error(\n \"pm2 is not installed. Run `npm install -g pm2` to use background server management.\"\n );\n }\n\n cachedPm2 = pm2Module;\n return pm2Module;\n}\n\nconst connectPm2 = async (): Promise<void> => {\n const pm2 = await loadPm2();\n return new Promise((resolve, reject) => {\n pm2.connect((error) => {\n if (error) {\n reject(error);\n return;\n }\n\n resolve();\n });\n });\n};\n\nconst sleep = async (ms: number): Promise<void> =>\n new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n\nconst disconnectPm2 = async (): Promise<void> => {\n const pm2 = await loadPm2();\n await new Promise<void>((resolve) => {\n let settled = false;\n const finish = () => {\n if (settled) {\n return;\n }\n\n settled = true;\n resolve();\n };\n\n const timer = setTimeout(finish, PM2_DISCONNECT_WAIT_MS);\n try {\n pm2.disconnect(() => {\n clearTimeout(timer);\n finish();\n });\n } catch {\n clearTimeout(timer);\n finish();\n }\n });\n};\n\nconst describeManagedServer = async (pm2: Pm2Module): Promise<Pm2ProcessDescription[]> =>\n new Promise((resolve, reject) => {\n pm2.describe(MANAGED_SERVER_NAME, (error, result) => {\n if (error) {\n reject(error);\n return;\n }\n resolve((result ?? []) as Pm2ProcessDescription[]);\n });\n });\n\nconst removeManagedServer = async (pm2: Pm2Module): Promise<void> =>\n new Promise((resolve, reject) => {\n pm2.delete(MANAGED_SERVER_NAME, (error) => {\n if (error) {\n reject(error);\n return;\n }\n resolve();\n });\n });\n\n/**\n * Kill the PM2 daemon to clear stale paths/caches.\n * Used when the daemon is pointing to a deleted worktree.\n */\nconst killPm2Daemon = async (): Promise<void> => {\n const pm2 = await loadPm2();\n return new Promise((resolve) => {\n pm2.kill(() => {\n resolve();\n });\n });\n};\n\n/**\n * Try to connect to PM2, and if it's in a broken state (stale worktree path),\n * kill the daemon and reconnect fresh.\n */\nconst connectWithRecovery = async (): Promise<Pm2Module> => {\n try {\n await connectPm2();\n return loadPm2();\n } catch (error) {\n if (isPm2BrokenStateError(error)) {\n console.warn(\"PM2 daemon is in a stale state. Killing and reconnecting...\");\n try {\n await killPm2Daemon();\n } catch {\n // ignore kill errors\n }\n await sleep(1000);\n // Clear cached module so next loadPm2 gets a fresh instance\n cachedPm2 = null;\n await connectPm2();\n return loadPm2();\n } else {\n throw error;\n }\n }\n};\n\nconst withPm2Connection = async <T>(operation: (pm2: Pm2Module) => Promise<T>): Promise<T> => {\n const pm2 = await connectWithRecovery();\n\n try {\n return await operation(pm2);\n } finally {\n await disconnectPm2();\n }\n};\n\nconst waitForRuntimeReady = async (\n pm2: Pm2Module,\n waitMs: number,\n logOffsets: StartupLogOffsets\n): Promise<void> => {\n const deadline = Date.now() + waitMs;\n\n while (Date.now() <= deadline) {\n if (readRuntimeConfig()) {\n return;\n }\n\n const processes = await describeManagedServer(pm2);\n const process = processes[0];\n if (!process) {\n throw createStartupError(\n \"the managed process exited before runtime data was written\",\n logOffsets\n );\n }\n\n const status = process.pm2_env?.status;\n if (status === \"errored\" || status === \"stopped\") {\n throw createStartupError(`the managed process entered the ${status} state`, logOffsets);\n }\n\n const remainingMs = deadline - Date.now();\n if (remainingMs <= 0) {\n break;\n }\n\n await sleep(Math.min(STARTUP_POLL_INTERVAL_MS, remainingMs));\n }\n\n throw createStartupError(`runtime readiness timed out after ${waitMs}ms`, logOffsets);\n};\n\nconst waitForManagedServerDeletion = async (pm2: Pm2Module, waitMs: number): Promise<void> => {\n const deadline = Date.now() + waitMs;\n\n while (Date.now() <= deadline) {\n const processes = await describeManagedServer(pm2);\n if (processes.length === 0) {\n return;\n }\n\n const remainingMs = deadline - Date.now();\n if (remainingMs <= 0) {\n break;\n }\n\n await sleep(Math.min(STARTUP_POLL_INTERVAL_MS, remainingMs));\n }\n\n throw new Error(`Timed out waiting for the managed server to stop after ${waitMs}ms.`);\n};\n\nconst deleteManagedServerInSession = async (\n pm2: Pm2Module,\n {\n ignoreMissing = false,\n }: {\n ignoreMissing?: boolean;\n } = {}\n): Promise<boolean> => {\n const processes = await describeManagedServer(pm2);\n if (processes.length === 0) {\n return false;\n }\n\n try {\n await removeManagedServer(pm2);\n } catch (error) {\n if (ignoreMissing && isMissingManagedServerError(error)) {\n await waitForManagedServerDeletion(pm2, PM2_DELETE_WAIT_MS);\n return false;\n }\n\n throw error;\n }\n\n await waitForManagedServerDeletion(pm2, PM2_DELETE_WAIT_MS);\n return true;\n};\n\nconst ensureLogDirectory = (): void => {\n mkdirSync(join(homedir(), \".coder-studio\", \"logs\"), { recursive: true });\n};\n\nexport const getLogPaths = () => ({\n outFile: join(homedir(), \".coder-studio\", \"logs\", \"server.out.log\"),\n errFile: join(homedir(), \".coder-studio\", \"logs\", \"server.err.log\"),\n});\n\nconst captureStartupLogOffsets = (): StartupLogOffsets => {\n const { outFile, errFile } = getLogPaths();\n return {\n outOffset: getFileSize(outFile),\n errOffset: getFileSize(errFile),\n };\n};\n\nconst getStartupFailureDetails = (offsets: StartupLogOffsets): string | null => {\n const { outFile, errFile } = getLogPaths();\n const sections: string[] = [];\n const errExcerpt = readLogExcerpt(errFile, { startOffset: offsets.errOffset });\n const outExcerpt =\n outFile === errFile ? null : readLogExcerpt(outFile, { startOffset: offsets.outOffset });\n\n if (errExcerpt) {\n sections.push(`Recent error log excerpt (${errFile}):\\n${errExcerpt}`);\n }\n\n if (outExcerpt) {\n sections.push(`Recent output log excerpt (${outFile}):\\n${outExcerpt}`);\n }\n\n return sections.length === 0 ? null : sections.join(\"\\n\\n\");\n};\n\nconst createStartupError = (reason: string, offsets: StartupLogOffsets): Error => {\n const details = getStartupFailureDetails(offsets);\n const message = [\n `Coder Studio failed to start in background: ${reason}.`,\n ...(details ? [details] : []),\n STARTUP_FAILURE_GUIDANCE,\n ].join(\"\\n\\n\");\n\n return new Error(message);\n};\n\nexport const deleteManagedServer = async ({\n ignoreMissing = false,\n}: {\n ignoreMissing?: boolean;\n} = {}): Promise<boolean> =>\n withPm2Connection((pm2) => deleteManagedServerInSession(pm2, { ignoreMissing }));\n\nexport const startManagedServer = async ({\n script,\n cwd,\n waitMs,\n args,\n}: StartManagedServerOptions): Promise<void> =>\n withPm2Connection(async (pm2) => {\n await deleteManagedServerInSession(pm2, { ignoreMissing: true });\n\n if (readRuntimeConfig()) {\n deleteRuntimeConfig();\n }\n\n ensureLogDirectory();\n const { outFile, errFile } = getLogPaths();\n const logOffsets = captureStartupLogOffsets();\n\n await new Promise<void>((resolve, reject) => {\n pm2.start(\n {\n name: MANAGED_SERVER_NAME,\n script,\n cwd,\n ...(args !== undefined ? { args } : {}),\n env: {\n ...process.env,\n NODE_ENV: \"production\",\n },\n autorestart: true,\n restart_delay: PM2_RESTART_DELAY_MS,\n min_uptime: PM2_MIN_UPTIME,\n max_restarts: PM2_MAX_RESTARTS,\n out_file: outFile,\n error_file: errFile,\n },\n (error) => {\n if (error) {\n reject(error);\n return;\n }\n\n resolve();\n }\n );\n });\n\n await waitForRuntimeReady(pm2, waitMs, logOffsets);\n });\n\nexport const getManagedServerStatus = async (): Promise<ManagedServerStatus> =>\n withPm2Connection(async (pm2) => {\n const processes = await describeManagedServer(pm2);\n const process = processes[0];\n\n if (!process) {\n return {\n status: \"stopped\",\n pm2Pid: null,\n restartCount: 0,\n };\n }\n\n const status = process.pm2_env?.status;\n const restartCount = process.pm2_env?.restart_time ?? 0;\n const pm2Pid = process.pid ?? null;\n\n if (status === \"online\") {\n return {\n status: \"running\",\n pm2Pid,\n restartCount,\n };\n }\n\n if (status === \"launching\") {\n return {\n status: \"starting\",\n pm2Pid,\n restartCount,\n };\n }\n\n if (status === \"stopped\") {\n return {\n status: \"stopped\",\n pm2Pid: null,\n restartCount,\n };\n }\n\n if (pm2Pid === null || pm2Pid === 0) {\n return {\n status: \"stopped\",\n pm2Pid: null,\n restartCount,\n };\n }\n\n return {\n status: \"errored\",\n pm2Pid,\n restartCount,\n };\n });\n", "import { stdin as input, stdout as output } from \"node:process\";\nimport { createInterface } from \"node:readline/promises\";\n\nexport function isInteractiveSession(): boolean {\n return Boolean(input.isTTY && output.isTTY);\n}\n\nexport async function confirmYesNo(prompt: string): Promise<boolean> {\n const rl = createInterface({ input, output });\n\n try {\n const answer = (await rl.question(prompt)).trim().toLowerCase();\n return answer === \"y\" || answer === \"yes\";\n } finally {\n rl.close();\n }\n}\n", "import { deleteRuntimeConfig, readRuntimeConfig } from \"@coder-studio/core/runtime\";\nimport { deleteManagedServer, getLogPaths, getManagedServerStatus } from \"./pm2-control.js\";\n\nexport interface ServerStatus {\n status: \"running\" | \"starting\" | \"stopped\" | \"errored\";\n pid: number | null;\n host: string | null;\n port: number | null;\n restartCount: number;\n outFile: string;\n errFile: string;\n startedAt: number | null;\n}\n\nexport async function stopRunningServer(): Promise<boolean> {\n const stopped = await deleteManagedServer({ ignoreMissing: true });\n\n if (readRuntimeConfig()) {\n deleteRuntimeConfig();\n }\n\n return stopped;\n}\n\nexport async function ensureSingleServer(stop = () => stopRunningServer()): Promise<void> {\n await stop();\n}\n\nexport async function getServerStatus(): Promise<ServerStatus> {\n const managedStatus = await getManagedServerStatus();\n const runtime = readRuntimeConfig();\n const { outFile, errFile } = getLogPaths();\n\n if (managedStatus.status === \"stopped\" || (managedStatus.pm2Pid === null && runtime === null)) {\n if (runtime) {\n deleteRuntimeConfig();\n }\n\n return {\n status: \"stopped\",\n pid: null,\n host: null,\n port: null,\n restartCount: 0,\n outFile,\n errFile,\n startedAt: null,\n };\n }\n\n return {\n status: runtime ? managedStatus.status : \"starting\",\n pid: runtime?.pid ?? managedStatus.pm2Pid,\n host: runtime?.host ?? null,\n port: runtime?.port ?? null,\n restartCount: managedStatus.restartCount,\n outFile,\n errFile,\n startedAt: runtime?.startedAt ?? null,\n };\n}\n", "import type { Server, ServerConfig } from \"@coder-studio/server\";\nimport { closeDatabase, openDatabase, parseServerConfig } from \"@coder-studio/server\";\nimport { mkdirSync } from \"fs\";\nimport { dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { readCliConfig } from \"./config-store.js\";\nimport { getStaticAssetsDir, hasWebAssets } from \"./embed.js\";\nimport { assertSupportedNodeVersion } from \"./node-version.js\";\nimport { getCliVersion } from \"./package-manifest.js\";\n\nconst MISSING_WEB_ASSETS_WARNING = \"Warning: Web assets not found. Frontend will not be available.\";\n\nexport const buildServerConfig = (): Partial<ServerConfig> => {\n const savedConfig = readCliConfig();\n const config: Partial<ServerConfig> = {\n appVersion: getCliVersion(import.meta.url),\n ...(savedConfig?.host !== undefined ? { host: savedConfig.host } : {}),\n ...(savedConfig?.port !== undefined && savedConfig.port > 0 ? { port: savedConfig.port } : {}),\n ...(savedConfig?.dataDir !== undefined ? { dataDir: savedConfig.dataDir } : {}),\n ...(savedConfig?.password !== undefined\n ? {\n auth: {\n enabled: true,\n password: savedConfig.password,\n },\n }\n : {}),\n };\n\n if (hasWebAssets()) {\n return {\n ...config,\n webRoot: getStaticAssetsDir(),\n };\n }\n\n console.warn(MISSING_WEB_ASSETS_WARNING);\n return config;\n};\n\nexport const verifyLocalDatabaseCompatibility = (): void => {\n const config = parseServerConfig(buildServerConfig());\n if (config.dataDir !== \":memory:\") {\n mkdirSync(dirname(config.dataDir), { recursive: true });\n }\n\n const db = openDatabase(config.dataDir);\n closeDatabase(db);\n};\n\nconst createShutdownHandler = (server: Server) => async () => {\n await server.stop();\n process.exit(0);\n};\n\nconst isServerEntrypoint = (moduleUrl: string, argvEntry?: string): boolean => {\n if (argvEntry === undefined) {\n return true;\n }\n\n if (argvEntry.endsWith(\"ProcessContainerFork.js\")) {\n return true;\n }\n\n const modulePath = fileURLToPath(moduleUrl);\n const [entryScript] = argvEntry.split(/\\s+/, 1);\n return entryScript === modulePath;\n};\n\nexport const runServerEntrypoint = async (moduleUrl: string, argvEntry?: string): Promise<void> => {\n if (!isServerEntrypoint(moduleUrl, argvEntry)) {\n return;\n }\n\n await startServer();\n};\n\nexport const startServer = async (): Promise<Server> => {\n assertSupportedNodeVersion();\n const { createServer } = await import(\"@coder-studio/server\");\n const server = await createServer(buildServerConfig());\n const shutdown = createShutdownHandler(server);\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n return server;\n};\n\nvoid runServerEntrypoint(import.meta.url, process.argv[1]);\n", "/**\n * Embed Web Assets\n *\n * Utility functions for checking embedded web assets\n * The actual serving is handled by Fastify static plugin\n */\n\nimport { existsSync } from \"fs\";\nimport { dirname, resolve } from \"path\";\nimport { fileURLToPath } from \"url\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// Path to embedded web assets (relative to dist/esm/index.mjs)\nconst WEB_ASSETS_DIR = resolve(__dirname, \"../web\");\n\n/**\n * Get the static assets directory path\n */\nexport function getStaticAssetsDir(): string {\n return WEB_ASSETS_DIR;\n}\n\n/**\n * Check if web assets exist\n */\nexport function hasWebAssets(): boolean {\n return existsSync(WEB_ASSETS_DIR);\n}\n\n/**\n * Embed web assets (called during CLI startup)\n *\n * Note: This just validates assets exist. The server handles\n * static file serving via the webRoot config option.\n */\nexport async function embedWebAssets(): Promise<void> {\n if (!hasWebAssets()) {\n console.warn(\"Warning: Web assets not found. Frontend will not be available.\");\n }\n}\n", "import type { ServerStatus } from \"./server-control.js\";\n\nfunction isWildcardHost(host: string): boolean {\n return host === \"0.0.0.0\" || host === \"::\" || host === \"::0\";\n}\n\nfunction formatUrlHost(host: string): string {\n return host.includes(\":\") && !host.startsWith(\"[\") ? `[${host}]` : host;\n}\n\nexport function getListenIp(status: ServerStatus): string | null {\n return status.host;\n}\n\nexport function getListenUrl(status: ServerStatus): string | null {\n if (status.host === null || status.port === null) {\n return null;\n }\n\n return `http://${formatUrlHost(status.host)}:${status.port}`;\n}\n\nexport function getBrowserUrl(status: ServerStatus): string | null {\n if (status.port === null) {\n return null;\n }\n\n const host =\n status.host === null || status.host === \"localhost\" || isWildcardHost(status.host)\n ? \"127.0.0.1\"\n : formatUrlHost(status.host);\n\n return `http://${host}:${status.port}`;\n}\n", "import { main } from \"./cli.js\";\n\nvoid main().catch((error) => {\n const message = error instanceof Error ? error.message : String(error);\n console.error(\"CLI error:\", message);\n process.exit(1);\n});\n"],
5
- "mappings": "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AAqBD,cAAa,qBAAqB,OAAO;AAEpE,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgItB,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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",
4
+ "sourcesContent": ["import type { FastifyRequest } from \"fastify\";\n\nconst RESERVED_PREFIXES = [\"/api/\", \"/auth/\", \"/internal/\", \"/assets/\"];\nconst RESERVED_EXACT_PATHS = new Set([\"/api\", \"/auth\", \"/assets\", \"/healthz\", \"/internal\", \"/ws\"]);\nconst ROOT_PUBLIC_FILE_PATHS = new Set([\"/favicon.ico\", \"/index.html\", \"/task-complete.wav\"]);\n\nexport function getRequestPathname(url: string): string {\n return url.split(\"?\", 1)[0] || \"/\";\n}\n\nexport function isFileLikePath(pathname: string): boolean {\n return /\\/[^/?]+\\.[^/?/]+$/.test(pathname);\n}\n\nexport function isReservedWebPath(pathname: string): boolean {\n return (\n RESERVED_EXACT_PATHS.has(pathname) ||\n RESERVED_PREFIXES.some((prefix) => pathname.startsWith(prefix))\n );\n}\n\nexport function isPublicStaticPath(pathname: string): boolean {\n return pathname.startsWith(\"/assets/\") || ROOT_PUBLIC_FILE_PATHS.has(pathname);\n}\n\nexport function isFrontendNavigationRequest(\n request: Pick<FastifyRequest, \"method\" | \"url\" | \"headers\">\n): boolean {\n if (request.method !== \"GET\" && request.method !== \"HEAD\") {\n return false;\n }\n\n const pathname = getRequestPathname(request.url);\n if (isReservedWebPath(pathname) || isPublicStaticPath(pathname) || isFileLikePath(pathname)) {\n return false;\n }\n\n const accept = request.headers.accept ?? \"\";\n return accept.includes(\"text/html\");\n}\n", "import type { FastifyRequest } from \"fastify\";\nimport {\n type AuthLoginBlockRecord,\n AuthLoginBlockRepo,\n} from \"../storage/repositories/auth-login-block-repo.js\";\n\nexport const LOGIN_FAILURE_LIMIT = 10;\nexport const LOGIN_WINDOW_MS = 24 * 60 * 60 * 1000;\nexport const LOGIN_BLOCK_MS = 24 * 60 * 60 * 1000;\n\nexport interface ActiveLoginBlock {\n ip: string;\n failedCount: number;\n blockedUntil: number;\n}\n\nfunction parseForwardedIp(rawHeader: string | string[] | undefined): string | null {\n const headerValue = Array.isArray(rawHeader) ? rawHeader[0] : rawHeader;\n if (!headerValue) {\n return null;\n }\n\n const clientIp = headerValue\n .split(\",\")\n .map((entry) => entry.trim())\n .find(Boolean);\n\n return clientIp ?? null;\n}\n\nexport function resolveClientIp(request: Pick<FastifyRequest, \"headers\" | \"ip\">): string {\n return parseForwardedIp(request.headers[\"x-forwarded-for\"]) ?? request.ip;\n}\n\nexport class AuthLoginProtection {\n constructor(private readonly repo: AuthLoginBlockRepo) {}\n\n getActiveBlock(ip: string, now: number): ActiveLoginBlock | null {\n const record = this.repo.get(ip);\n if (!record) {\n return null;\n }\n\n if (record.blockedUntil !== null && record.blockedUntil > now) {\n return {\n ip,\n failedCount: record.failedCount,\n blockedUntil: record.blockedUntil,\n };\n }\n\n if (this.shouldReset(record, now)) {\n this.repo.delete(ip);\n }\n\n return null;\n }\n\n recordFailure(ip: string, now: number): AuthLoginBlockRecord {\n return this.repo.recordFailure(\n ip,\n now,\n now - LOGIN_WINDOW_MS,\n LOGIN_FAILURE_LIMIT,\n LOGIN_BLOCK_MS\n );\n }\n\n clearFailures(ip: string): void {\n this.repo.delete(ip);\n }\n\n private shouldReset(record: AuthLoginBlockRecord, now: number): boolean {\n if (record.blockedUntil !== null && record.blockedUntil <= now) {\n return true;\n }\n\n return now - record.lastFailedAt > LOGIN_WINDOW_MS;\n }\n}\n", "import { randomBytes } from \"node:crypto\";\nimport type { FastifyReply, FastifyRequest } from \"fastify\";\nimport type { ServerConfig } from \"../config.js\";\nimport type { AuthLoginBlockRepo } from \"../storage/repositories/auth-login-block-repo.js\";\nimport type { AuthSessionRepo } from \"../storage/repositories/auth-session-repo.js\";\nimport {\n getRequestPathname,\n isFrontendNavigationRequest as isFrontendNavigationRequestForWebUi,\n isPublicStaticPath,\n} from \"../web-ui-routing.js\";\nimport { AuthLoginProtection, resolveClientIp } from \"./login-protection.js\";\n\nconst AUTH_COOKIE_NAME = \"coder_studio_auth\";\n\nconst isPublicPath = (path: string) => {\n const pathname = getRequestPathname(path);\n\n return (\n pathname === \"/\" ||\n pathname === \"/login\" ||\n pathname === \"/healthz\" ||\n pathname === \"/auth/status\" ||\n pathname === \"/auth/login\" ||\n pathname === \"/auth/logout\" ||\n pathname.startsWith(\"/@\") ||\n isPublicStaticPath(pathname)\n );\n};\n\nconst parseCookies = (cookieHeader?: string) => {\n if (!cookieHeader) {\n return {} as Record<string, string>;\n }\n\n return cookieHeader\n .split(\";\")\n .map((part) => part.trim())\n .filter(Boolean)\n .reduce<Record<string, string>>((acc, part) => {\n const [key, ...rest] = part.split(\"=\");\n if (!key) {\n return acc;\n }\n acc[key] = rest.join(\"=\");\n return acc;\n }, {});\n};\n\nconst encodeAuthCookieValue = (value: string): string => encodeURIComponent(value);\n\nconst decodeAuthCookieValue = (value: string): string => {\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n};\n\ninterface AuthDeps {\n config: ServerConfig;\n authSessionRepo: AuthSessionRepo;\n authLoginBlockRepo: AuthLoginBlockRepo;\n}\n\nconst isFrontendNavigationRequest = (request: FastifyRequest, deps: AuthDeps): boolean => {\n if (!deps.config.webRoot) {\n return false;\n }\n return isFrontendNavigationRequestForWebUi(request);\n};\n\nconst isAuthenticatedRequest = (request: FastifyRequest, deps: AuthDeps): boolean => {\n if (!deps.config.auth.enabled) {\n return true;\n }\n\n const cookies = parseCookies(request.headers.cookie);\n const authCookie = cookies[AUTH_COOKIE_NAME];\n if (!authCookie) {\n return false;\n }\n\n const token = decodeAuthCookieValue(authCookie);\n return deps.authSessionRepo.touch(token, Date.now());\n};\n\nexport const createAuthGuard = (deps: AuthDeps) => {\n return async (request: FastifyRequest, reply: FastifyReply) => {\n if (\n !deps.config.auth.enabled ||\n isPublicPath(request.url) ||\n request.url === \"/auth/login\" ||\n request.url === \"/auth/logout\"\n ) {\n return;\n }\n\n if (isAuthenticatedRequest(request, deps)) {\n return;\n }\n\n if (isFrontendNavigationRequest(request, deps)) {\n return reply.redirect(\"/login\");\n }\n\n reply.status(401).send({\n ok: false,\n error: \"Authentication required\",\n });\n };\n};\n\nexport const registerAuthStatusRoute = (deps: AuthDeps) => {\n return async (request: FastifyRequest, reply: FastifyReply) => {\n return reply.send({\n ok: true,\n authEnabled: deps.config.auth.enabled,\n authenticated: isAuthenticatedRequest(request, deps),\n });\n };\n};\n\nexport const registerAuthRoutes = (deps: AuthDeps) => {\n const loginProtection = new AuthLoginProtection(deps.authLoginBlockRepo);\n\n return async (request: FastifyRequest<{ Body: { password?: string } }>, reply: FastifyReply) => {\n if (!deps.config.auth.enabled || !deps.config.auth.password) {\n return reply.send({ ok: true, authEnabled: false, authenticated: true });\n }\n\n const now = Date.now();\n const ip = resolveClientIp(request);\n const activeBlock = loginProtection.getActiveBlock(ip, now);\n if (activeBlock) {\n return reply.status(429).send({\n ok: false,\n blocked: true,\n ip,\n blockedUntil: activeBlock.blockedUntil,\n error: \"Too many failed attempts\",\n });\n }\n\n if (request.body?.password !== deps.config.auth.password) {\n loginProtection.recordFailure(ip, now);\n return reply.status(401).send({ ok: false, error: \"Invalid password\" });\n }\n\n loginProtection.clearFailures(ip);\n const token = randomBytes(32).toString(\"hex\");\n deps.authSessionRepo.create(token, now);\n\n reply.header(\n \"Set-Cookie\",\n `${AUTH_COOKIE_NAME}=${encodeAuthCookieValue(token)}; HttpOnly; Path=/; SameSite=Lax`\n );\n return reply.send({ ok: true, authEnabled: true, authenticated: true });\n };\n};\n\nexport const registerAuthLogoutRoute = (deps: AuthDeps) => {\n return async (request: FastifyRequest, reply: FastifyReply) => {\n const cookies = parseCookies(request.headers.cookie);\n const authCookie = cookies[AUTH_COOKIE_NAME];\n\n if (authCookie) {\n deps.authSessionRepo.delete(decodeAuthCookieValue(authCookie));\n }\n\n reply.header(\"Set-Cookie\", `${AUTH_COOKIE_NAME}=; HttpOnly; Path=/; Max-Age=0; SameSite=Lax`);\n\n return reply.send({\n ok: true,\n authEnabled: deps.config.auth.enabled,\n authenticated: false,\n });\n };\n};\n", "export {\n createAuthGuard,\n registerAuthLogoutRoute,\n registerAuthRoutes,\n registerAuthStatusRoute,\n} from \"./plugin.js\";\n", "/**\n * Event Bus for Domain Events\n *\n * Implements the mixed C approach from spec \u00A74.0:\n * - Carries Service layer semantic events only\n * - Synchronous pub/sub pattern\n * - Used for session state changes, workspace metadata, git state, fs dirty\n */\n\nimport type { DomainEvent } from \"@coder-studio/core\";\n\nexport type Unsubscribe = () => void;\nexport type EventHandler<E extends DomainEvent = DomainEvent> = (event: E) => void;\n\nexport class EventBus {\n private handlers = new Map<DomainEvent[\"type\"], Set<EventHandler>>();\n\n /**\n * Emit a domain event to all subscribers\n * Synchronously calls all handlers\n */\n emit(event: DomainEvent): void {\n const handlers = this.handlers.get(event.type);\n if (!handlers) return;\n\n for (const handler of handlers) {\n try {\n handler(event);\n } catch (error) {\n // Log error but don't break other handlers\n console.error(`Error in event handler for ${event.type}:`, error);\n }\n }\n }\n\n /**\n * Subscribe to a specific event type\n * Returns unsubscribe function\n */\n on<E extends DomainEvent>(type: E[\"type\"], handler: EventHandler<E>): Unsubscribe {\n if (!this.handlers.has(type)) {\n this.handlers.set(type, new Set());\n }\n\n const handlers = this.handlers.get(type)!;\n handlers.add(handler as EventHandler);\n\n return () => {\n handlers.delete(handler as EventHandler);\n if (handlers.size === 0) {\n this.handlers.delete(type);\n }\n };\n }\n\n /**\n * Remove all handlers (used during shutdown)\n */\n clear(): void {\n this.handlers.clear();\n }\n}\n", "/**\n * Server Configuration\n *\n * Parses CLI args and environment variables.\n *\n * Database path resolution:\n * - Development: uses OS temp directory so SQLite files stay out of the repo\n * - Production: uses ~/.coder-studio/data/coder-studio.db by default\n */\n\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nexport interface ServerConfig {\n host: string;\n port: number;\n dataDir: string;\n uploadsDir: string;\n logLevel: \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\";\n webRoot?: string;\n appVersion?: string;\n auth: {\n enabled: boolean;\n password?: string;\n };\n}\n\nlet cachedTestUploadsDir: string | undefined;\nlet cachedAppVersion: string | undefined;\n\nfunction parseLogLevel(value: string | undefined): ServerConfig[\"logLevel\"] | undefined {\n switch (value) {\n case \"trace\":\n case \"debug\":\n case \"info\":\n case \"warn\":\n case \"error\":\n return value;\n default:\n return undefined;\n }\n}\n\nfunction resolveDefaultAppVersion(): string {\n if (cachedAppVersion) {\n return cachedAppVersion;\n }\n\n const packageJsonPath = [new URL(\"../../cli/package.json\", import.meta.url)].find((candidate) =>\n fs.existsSync(candidate)\n );\n\n if (!packageJsonPath) {\n cachedAppVersion = \"0.0.0\";\n return cachedAppVersion;\n }\n\n try {\n const pkg = JSON.parse(fs.readFileSync(packageJsonPath, \"utf-8\")) as { version?: unknown };\n cachedAppVersion = typeof pkg.version === \"string\" ? pkg.version : \"0.0.0\";\n } catch {\n cachedAppVersion = \"0.0.0\";\n }\n\n return cachedAppVersion;\n}\n\n/**\n * Resolve the database file path.\n *\n * In development (NODE_ENV !== 'production') the DB is placed in the OS temp\n * directory so it never pollutes the working tree. In production the path\n * defaults to ~/.coder-studio/data/coder-studio.db and can be overridden via\n * the DATA_DIR env var.\n */\nfunction resolveDbPath(explicit?: string): string {\n if (explicit) return explicit;\n if (process.env.NODE_ENV !== \"production\") {\n return path.join(os.tmpdir(), \"coder-studio-dev.db\");\n }\n return path.join(os.homedir(), \".coder-studio\", \"data\", \"coder-studio.db\");\n}\n\nfunction getOrCreateTestUploadsDir(): string {\n if (cachedTestUploadsDir) {\n return cachedTestUploadsDir;\n }\n\n cachedTestUploadsDir = fs.mkdtempSync(path.join(os.tmpdir(), \"coder-studio-test-uploads-\"));\n return cachedTestUploadsDir;\n}\n\nfunction resolveUploadsDir(explicit?: string): string {\n if (explicit) {\n return explicit;\n }\n if (process.env.NODE_ENV === \"test\") {\n return getOrCreateTestUploadsDir();\n }\n if (process.env.NODE_ENV === \"development\") {\n return path.join(os.tmpdir(), \"coder-studio-dev\", \"uploads\");\n }\n return path.join(os.homedir(), \".coder-studio\", \"uploads\");\n}\n\n/**\n * Parse server configuration from environment and CLI args\n */\nexport function parseServerConfig(overrides?: Partial<ServerConfig>): ServerConfig {\n const noAuth = process.env.NO_AUTH === \"true\";\n const password = process.env.AUTH_PASSWORD;\n const dataDir = resolveDbPath(overrides?.dataDir || process.env.DATA_DIR);\n const uploadsDir = resolveUploadsDir(overrides?.uploadsDir || process.env.UPLOADS_DIR);\n\n // NOTE: use `??` on port so callers can pass 0 to request an\n // OS-assigned port. `||` would silently fall through to 4173 for port=0.\n return {\n host: overrides?.host || process.env.HOST || \"localhost\",\n port: overrides?.port ?? parseInt(process.env.PORT || \"4173\", 10),\n dataDir,\n uploadsDir,\n logLevel: overrides?.logLevel ?? parseLogLevel(process.env.LOG_LEVEL) ?? \"info\",\n webRoot: overrides?.webRoot,\n appVersion:\n overrides?.appVersion ?? process.env.CODER_STUDIO_APP_VERSION ?? resolveDefaultAppVersion(),\n auth: overrides?.auth || {\n enabled: !noAuth && !!password,\n password,\n },\n };\n}\n\n/**\n * Ensure the database parent directory exists for file-backed databases.\n */\nexport function ensureDataDir(config: ServerConfig): void {\n if (config.dataDir === \":memory:\") {\n return;\n }\n\n fs.mkdirSync(path.dirname(config.dataDir), { recursive: true });\n}\n", "import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\n\nexport interface RuntimeConfig {\n host: string;\n port: number;\n pid: number;\n token: string;\n serverInstanceId: string;\n startedAt: number;\n}\n\nexport function getRuntimeDir(): string {\n const override = process.env.CODER_STUDIO_RUNTIME_DIR;\n if (override && override.trim()) {\n return override;\n }\n\n return join(homedir(), \".coder-studio\");\n}\n\nexport function getRuntimePath(): string {\n const pathOverride = process.env.CODER_STUDIO_RUNTIME_JSON_PATH;\n if (pathOverride && pathOverride.trim()) {\n return pathOverride;\n }\n\n return join(getRuntimeDir(), \"runtime.json\");\n}\n\nexport function readRuntimeConfig(): RuntimeConfig | null {\n const runtimePath = getRuntimePath();\n if (!existsSync(runtimePath)) {\n return null;\n }\n\n try {\n const config = JSON.parse(readFileSync(runtimePath, \"utf-8\")) as Partial<RuntimeConfig>;\n if (\n typeof config.port !== \"number\" ||\n typeof config.pid !== \"number\" ||\n typeof config.token !== \"string\" ||\n typeof config.serverInstanceId !== \"string\" ||\n typeof config.startedAt !== \"number\"\n ) {\n return null;\n }\n\n return {\n host: typeof config.host === \"string\" ? config.host : \"localhost\",\n port: config.port,\n pid: config.pid,\n token: config.token,\n serverInstanceId: config.serverInstanceId,\n startedAt: config.startedAt,\n };\n } catch {\n return null;\n }\n}\n\nexport function writeRuntimeConfig(config: RuntimeConfig): void {\n const runtimePath = getRuntimePath();\n const runtimeDir = dirname(runtimePath);\n if (!existsSync(runtimeDir)) {\n mkdirSync(runtimeDir, { recursive: true });\n }\n\n writeFileSync(runtimePath, JSON.stringify(config, null, 2), \"utf-8\");\n}\n\nexport function deleteRuntimeConfig(): void {\n const runtimePath = getRuntimePath();\n if (existsSync(runtimePath)) {\n unlinkSync(runtimePath);\n }\n}\n", "import { z } from \"zod\";\n\n/**\n * Claude Code configuration schema\n * Validates provider-specific settings\n */\nexport const claudeConfigSchema = z.object({\n // Model selection\n model: z\n .enum([\n \"claude-3-opus\",\n \"claude-3-sonnet\",\n \"claude-3-haiku\",\n \"claude-sonnet-4-5\",\n \"claude-sonnet-4-6\",\n \"claude-opus-4-6\",\n ])\n .optional(),\n\n // Maximum turns (null = unlimited)\n maxTurns: z.number().int().positive().nullable().optional(),\n\n // Additional CLI arguments\n additionalArgs: z.array(z.string()).optional(),\n\n // Environment variables to pass to Claude CLI\n envVars: z.record(z.string(), z.string()).optional(),\n});\n\nexport type ClaudeConfig = z.infer<typeof claudeConfigSchema>;\n", "import type { IdleHeuristics } from \"@coder-studio/core\";\n\nexport const claudeIdleHeuristics: IdleHeuristics = {\n idlePromptPatterns: [],\n idleDebounceMs: 4000,\n};\n", "import type { ProviderConfig, SupervisorEvalCommandRequest } from \"@coder-studio/core\";\nimport { claudeConfigSchema } from \"./config-schema.js\";\n\nexport function buildClaudeSupervisorEvalCommand(\n config: ProviderConfig,\n req: SupervisorEvalCommandRequest\n) {\n const cfg = claudeConfigSchema.parse(config);\n const model = req.model ?? cfg.model;\n\n return {\n argv: [\n \"claude\",\n \"-p\",\n req.prompt,\n \"--output-format\",\n \"json\",\n ...(model ? [\"--model\", model] : []),\n ...(cfg.additionalArgs ?? []),\n ],\n cwd: req.workspacePath,\n env: {\n ...(cfg.envVars ?? {}),\n ...(req.apiKey ? { ANTHROPIC_API_KEY: req.apiKey } : {}),\n CODER_STUDIO_SESSION_ID: req.sessionId,\n },\n };\n}\n", "import type { ProviderConfig, ProviderDefinition } from \"@coder-studio/core\";\n\nimport { claudeConfigSchema } from \"./config-schema.js\";\nimport { claudeIdleHeuristics } from \"./idle-heuristics.js\";\nimport { buildClaudeSupervisorEvalCommand } from \"./supervisor-eval.js\";\n\nexport const claudeInstallMetadata = {\n prerequisites: [\"npm\"],\n manualGuideKeys: [\"provider.install.nodejs.manual\", \"provider.install.claude.manual\"],\n docUrls: {\n provider: \"https://docs.anthropic.com/en/docs/claude-code/getting-started\",\n prerequisites: {\n npm: \"https://nodejs.org/en/download\",\n },\n },\n strategies: {\n win32: [\n {\n id: \"winget-nodejs-lts\",\n kind: \"prerequisite\",\n targetCommand: \"npm\",\n requiresCommands: [\"winget\"],\n command: \"winget\",\n args: [\"install\", \"--id\", \"OpenJS.NodeJS.LTS\", \"--exact\", \"--silent\"],\n },\n {\n id: \"npm-install-claude\",\n kind: \"provider\",\n targetCommand: \"claude\",\n requiresCommands: [\"npm\"],\n command: \"npm\",\n args: [\"install\", \"-g\", \"@anthropic-ai/claude-code\"],\n },\n ],\n darwin: [\n {\n id: \"brew-node\",\n kind: \"prerequisite\",\n targetCommand: \"npm\",\n requiresCommands: [\"brew\"],\n command: \"brew\",\n args: [\"install\", \"node\"],\n },\n {\n id: \"npm-install-claude\",\n kind: \"provider\",\n targetCommand: \"claude\",\n requiresCommands: [\"npm\"],\n command: \"npm\",\n args: [\"install\", \"-g\", \"@anthropic-ai/claude-code\"],\n },\n ],\n linux: [\n {\n id: \"npm-install-claude\",\n kind: \"provider\",\n targetCommand: \"claude\",\n requiresCommands: [\"npm\"],\n command: \"npm\",\n args: [\"install\", \"-g\", \"@anthropic-ai/claude-code\"],\n },\n ],\n },\n} satisfies ProviderDefinition[\"install\"];\n\n/**\n * Claude Code provider definition.\n */\nexport const claudeDefinition: ProviderDefinition = {\n // ===== Metadata =====\n id: \"claude\",\n displayName: \"Claude Code\",\n badge: \"Claude\",\n capability: \"full\",\n install: claudeInstallMetadata,\n\n // ===== Command construction =====\n buildCommand(config: ProviderConfig, ctx) {\n const cfg = claudeConfigSchema.parse(config);\n const modelArg = cfg.model ? [\"--model\", cfg.model] : [];\n\n return {\n argv: [\"claude\", ...modelArg, ...(cfg.additionalArgs ?? [])],\n env: {\n ...(cfg.envVars ?? {}),\n CODER_STUDIO_SESSION_ID: ctx.sessionId,\n },\n cwd: ctx.workspacePath,\n };\n },\n\n buildSupervisorEvalCommand: buildClaudeSupervisorEvalCommand,\n\n // ===== Configuration =====\n configSchema: claudeConfigSchema,\n defaultConfig: {},\n\n // ===== Runtime requirements =====\n requiredCommands: [\"claude\"],\n idleHeuristics: claudeIdleHeuristics,\n};\n", "import { z } from \"zod\";\n\n/**\n * Codex configuration schema\n */\nexport const codexConfigSchema = z.object({\n model: z.string().min(1).optional(),\n additionalArgs: z.array(z.string()).default([]),\n envVars: z.record(z.string(), z.string()).default({}),\n});\n\nexport type CodexConfig = z.infer<typeof codexConfigSchema>;\n", "/**\n * Codex stdout heuristics for session detection\n * Limited mode: extracts session ID and detects idle state from stdout\n */\n\n/**\n * Session ID extraction patterns\n * Matches various formats Codex may output\n */\nexport const sessionIdPatterns: RegExp[] = [\n // Format: \"Session ID: abc123-def456\"\n /Session ID:\\s*([a-f0-9-]{6,})/i,\n\n // Format: \"session: abc123\"\n /^session:\\s*([a-f0-9-]{6,})/im,\n\n // Format: \"[session-abc123]\"\n /\\[session-([a-f0-9-]{6,})\\]/i,\n\n // Format: JSON-like: {\"session_id\": \"abc123\"}\n /\"session_id\":\\s*\"([a-f0-9-]{6,})\"/i,\n];\n\n/**\n * Idle prompt detection patterns\n * Matches when Codex is waiting for user input\n */\nexport const idlePromptPatterns: RegExp[] = [\n // Standard prompt: newline + \"> \" or \"$ \"\n /\\n>\\s*$/,\n /\\n\\$\\s*$/,\n\n // Codex-specific: newline + \">>> \"\n /\\n>>>\\s*$/,\n\n // Prompt with cursor indicator\n /\\n.*\\u2588\\s*$/, // \u2588 cursor\n];\n\n/**\n * Idle detection debounce time\n * Wait this long after detecting idle pattern before marking as idle\n */\nexport const idleDebounceMs = 3000;\n\n/**\n * Extract session ID from stdout buffer\n * Returns first matched session ID or null\n */\nexport function extractSessionId(buffer: string): string | null {\n // Keep last 4096 chars for pattern matching\n const recent = buffer.slice(-4096);\n\n for (const pattern of sessionIdPatterns) {\n const matches = recent.match(pattern);\n if (matches && matches[1]) {\n return matches[1];\n }\n }\n\n return null;\n}\n\n/**\n * Check if stdout indicates idle state\n * Returns true if idle prompt pattern detected\n */\nexport function detectIdlePrompt(buffer: string): boolean {\n const recent = buffer.slice(-4096);\n\n for (const pattern of idlePromptPatterns) {\n if (pattern.test(recent)) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Validate extracted session ID format\n * Ensures ID meets minimum requirements\n */\nexport function isValidSessionId(id: string): boolean {\n // Minimum 6 chars, alphanumeric + dashes\n return /^[a-f0-9-]{6,}$/i.test(id);\n}\n\n/**\n * Parse completion indicator from stdout\n * May detect explicit completion messages\n */\nexport function detectCompletion(buffer: string): boolean {\n const recent = buffer.slice(-2048);\n\n // Common completion indicators\n const completionPatterns = [\n /\\n(complete|finished|done)\\s*\\.\\s*$/i,\n /\u2713\\s*$/, // Checkmark at end\n /Task completed/i,\n /\\n(complete|finished|done)\\s*$/i,\n ];\n\n return completionPatterns.some((pattern) => pattern.test(recent));\n}\n", "import type { ProviderConfig, SupervisorEvalCommandRequest } from \"@coder-studio/core\";\nimport { codexConfigSchema } from \"./config-schema.js\";\n\n/**\n * Build the argv Codex needs to act as a supervisor evaluator.\n *\n * We require `--json` so stdout is a JSONL event stream instead of the\n * default human banner (\"OpenAI Codex v\u2026\", token usage, etc.). The\n * evaluator extractor then picks the final `item.completed` event of\n * type `agent_message` and parses its `.text` as JSON.\n *\n * We also pin `-s read-only` and `--skip-git-repo-check` so evaluations\n * never mutate the workspace and don't choke when the cwd isn't a repo.\n */\nexport function buildCodexSupervisorEvalCommand(\n config: ProviderConfig,\n req: SupervisorEvalCommandRequest\n) {\n const cfg = codexConfigSchema.parse(config);\n\n return {\n argv: [\n \"codex\",\n \"exec\",\n \"--json\",\n \"-s\",\n \"read-only\",\n \"--skip-git-repo-check\",\n ...(req.model ? [\"-m\", req.model] : []),\n ...cfg.additionalArgs,\n req.prompt,\n ],\n cwd: req.workspacePath,\n env: {\n ...cfg.envVars,\n ...(req.apiKey ? { OPENAI_API_KEY: req.apiKey } : {}),\n CODER_STUDIO_SESSION_ID: req.sessionId,\n },\n };\n}\n", "import type { ProviderConfig, ProviderDefinition } from \"@coder-studio/core\";\n\nimport { type CodexConfig, codexConfigSchema } from \"./config-schema.js\";\nimport { idleDebounceMs, idlePromptPatterns, sessionIdPatterns } from \"./stdout-heuristics.js\";\nimport { buildCodexSupervisorEvalCommand } from \"./supervisor-eval.js\";\n\nexport const codexInstallMetadata = {\n prerequisites: [\"npm\"],\n manualGuideKeys: [\"provider.install.nodejs.manual\", \"provider.install.codex.manual\"],\n docUrls: {\n provider: \"https://help.openai.com/en/articles/11096431-openai-codex-ci-getting-started\",\n prerequisites: {\n npm: \"https://nodejs.org/en/download\",\n },\n },\n strategies: {\n win32: [\n {\n id: \"winget-nodejs-lts\",\n kind: \"prerequisite\",\n targetCommand: \"npm\",\n requiresCommands: [\"winget\"],\n command: \"winget\",\n args: [\"install\", \"--id\", \"OpenJS.NodeJS.LTS\", \"--exact\", \"--silent\"],\n },\n {\n id: \"npm-install-codex\",\n kind: \"provider\",\n targetCommand: \"codex\",\n requiresCommands: [\"npm\"],\n command: \"npm\",\n args: [\"install\", \"-g\", \"@openai/codex\"],\n },\n ],\n darwin: [\n {\n id: \"brew-node\",\n kind: \"prerequisite\",\n targetCommand: \"npm\",\n requiresCommands: [\"brew\"],\n command: \"brew\",\n args: [\"install\", \"node\"],\n },\n {\n id: \"npm-install-codex\",\n kind: \"provider\",\n targetCommand: \"codex\",\n requiresCommands: [\"npm\"],\n command: \"npm\",\n args: [\"install\", \"-g\", \"@openai/codex\"],\n },\n ],\n linux: [\n {\n id: \"npm-install-codex\",\n kind: \"provider\",\n targetCommand: \"codex\",\n requiresCommands: [\"npm\"],\n command: \"npm\",\n args: [\"install\", \"-g\", \"@openai/codex\"],\n },\n ],\n },\n} satisfies ProviderDefinition[\"install\"];\n\n/**\n * Codex provider definition.\n */\nexport const codexDefinition: ProviderDefinition = {\n // ===== Metadata =====\n id: \"codex\",\n displayName: \"Codex\",\n badge: \"Codex\",\n capability: \"full\",\n install: codexInstallMetadata,\n\n // ===== Command construction =====\n buildCommand(config: ProviderConfig, ctx) {\n const cfg = codexConfigSchema.parse(config);\n\n return {\n argv: [\"codex\", ...cfg.additionalArgs],\n env: {\n ...cfg.envVars,\n CODER_STUDIO_SESSION_ID: ctx.sessionId,\n },\n cwd: ctx.workspacePath,\n };\n },\n\n // Full mode: no resume support yet (Codex CLI may support it later)\n buildSupervisorEvalCommand: buildCodexSupervisorEvalCommand,\n\n // ===== Configuration =====\n configSchema: codexConfigSchema,\n defaultConfig: {\n additionalArgs: [],\n envVars: {},\n } satisfies CodexConfig,\n\n // ===== Runtime requirements =====\n requiredCommands: [\"codex\"],\n idleHeuristics: {\n sessionIdPatterns,\n idlePromptPatterns,\n idleDebounceMs,\n },\n};\n", "import type { ProviderDefinition } from \"@coder-studio/core\";\n\nimport { claudeDefinition } from \"./claude/definition.js\";\nimport { codexDefinition } from \"./codex/definition.js\";\n\n/**\n * Static registry of all available providers\n * Provider list is fixed at build time\n *\n * Adding a new provider:\n * 1. Create packages/providers/src/<name>/definition.ts\n * 2. Implement ProviderDefinition interface\n * 3. Import and add to this array\n * 4. Frontend automatically receives updated list via provider.list command\n */\nexport const providerRegistry: ProviderDefinition[] = [claudeDefinition, codexDefinition];\n\n/**\n * Get provider by ID\n */\nexport function getProviderById(id: string): ProviderDefinition | undefined {\n return providerRegistry.find((provider) => provider.id === id);\n}\n\n/**\n * Check if provider ID is valid\n */\nexport function isValidProviderId(id: string): boolean {\n return providerRegistry.some((provider) => provider.id === id);\n}\n\n/**\n * Get all provider IDs\n */\nexport function getAllProviderIds(): string[] {\n return providerRegistry.map((provider) => provider.id);\n}\n\n/**\n * Get providers by capability level\n */\nexport function getProvidersByCapability(\n capability: \"full\" | \"limited\" | \"unsupported\"\n): ProviderDefinition[] {\n return providerRegistry.filter((provider) => provider.capability === capability);\n}\n", "// Provider definitions\n\n// Claude-specific exports\nexport { type ClaudeConfig, claudeConfigSchema } from \"./claude/config-schema.js\";\nexport { claudeDefinition } from \"./claude/definition.js\";\n// Codex-specific exports\nexport { type CodexConfig, codexConfigSchema } from \"./codex/config-schema.js\";\nexport { codexDefinition } from \"./codex/definition.js\";\nexport {\n detectCompletion,\n detectIdlePrompt,\n extractSessionId,\n idleDebounceMs,\n idlePromptPatterns,\n isValidSessionId,\n sessionIdPatterns,\n} from \"./codex/stdout-heuristics.js\";\n// Provider registry\nexport {\n getAllProviderIds,\n getProviderById,\n getProvidersByCapability,\n isValidProviderId,\n providerRegistry,\n} from \"./registry.js\";\n", "import { posix, resolve } from \"node:path\";\n\nfunction isWindowsDrivePath(path: string): boolean {\n return /^[A-Za-z]:\\//.test(path);\n}\n\nfunction normalizeComparablePath(path: string): string {\n let normalized = path.replace(/\\\\/g, \"/\");\n\n if (/^\\/[A-Za-z]:\\//.test(normalized)) {\n normalized = normalized.slice(1);\n }\n\n if (normalized.startsWith(\"//\")) {\n normalized = `//${posix.normalize(normalized.slice(2))}`;\n } else {\n normalized = posix.normalize(normalized);\n }\n\n if (isWindowsDrivePath(normalized) || normalized.startsWith(\"//\")) {\n normalized = normalized.toLowerCase();\n }\n\n return normalized;\n}\n\nfunction normalizeModuleUrlPath(moduleUrl: string): string | null {\n let url: URL;\n\n try {\n url = new URL(moduleUrl);\n } catch {\n return null;\n }\n\n if (url.protocol !== \"file:\") {\n return null;\n }\n\n const path = `${url.host ? `//${url.host}` : \"\"}${decodeURIComponent(url.pathname)}`;\n return normalizeComparablePath(path);\n}\n\nfunction normalizeArgvPath(argv1: string): string {\n const isAbsoluteWindowsPath = /^[A-Za-z]:[\\\\/]/.test(argv1) || /^\\\\\\\\/.test(argv1);\n return normalizeComparablePath(isAbsoluteWindowsPath ? argv1 : resolve(argv1));\n}\n\nexport function isDirectExecution(\n moduleUrl: string,\n argv1: string | undefined = process.argv[1]\n): boolean {\n if (argv1 === undefined) {\n return false;\n }\n\n const modulePath = normalizeModuleUrlPath(moduleUrl);\n\n if (modulePath === null) {\n return false;\n }\n\n return modulePath === normalizeArgvPath(argv1);\n}\n", "/**\n * Helpers for spawning child processes that may resolve to Windows .cmd / .bat\n * shims.\n *\n * Why: Node 18.20.2 / 20.12.2 / 21.7.2 (CVE-2024-27980) refuses to spawn\n * .cmd or .bat files unless `shell: true` is set. The shims below ship as\n * .cmd on Windows, so they need shell:true; native executables (git, etc.)\n * must keep shell:false to avoid breaking argument escaping.\n */\n\nconst WINDOWS_CMD_SHIMS = new Set([\"pnpm\", \"npm\", \"npx\"]);\n\nexport function shouldUseShellForCommand(\n command: string,\n platform: NodeJS.Platform = process.platform\n): boolean {\n return platform === \"win32\" && WINDOWS_CMD_SHIMS.has(command.toLowerCase());\n}\n", "/**\n * Resolve a spawn argv on Windows by walking PATH+PATHEXT and unwrapping\n * npm-style cmd-shims into their underlying `node <entry.js>` invocation.\n *\n * Why: node-pty on Windows calls Win32 CreateProcess directly, which only\n * auto-appends `.exe` and cannot run `.cmd`/`.bat` shims. Tools installed by\n * npm (codex, claude, pnpm, \u2026) ship as `.cmd` shims that wrap a node entry\n * script. On POSIX the kernel handles the equivalent via shebang; we replicate\n * that step on Windows so node-pty receives an argv it can actually spawn.\n *\n * On non-win32 platforms this is a no-op (returns argv unchanged).\n */\n\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nconst DEFAULT_PATHEXT = \".COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC\";\n\nexport interface ResolveSpawnArgvDeps {\n platform?: NodeJS.Platform;\n pathEnv?: string;\n pathExt?: string;\n readFileSync?: (file: string) => string;\n existsSync?: (file: string) => boolean;\n}\n\nexport interface ParsedCmdShim {\n node: string;\n entry: string;\n}\n\nexport function resolveSpawnArgv(\n argv: readonly string[],\n deps: ResolveSpawnArgvDeps = {}\n): string[] {\n const platform = deps.platform ?? process.platform;\n if (platform !== \"win32\") {\n return [...argv];\n }\n const command = argv[0];\n if (command === undefined) {\n return [];\n }\n const restArgs = argv.slice(1);\n\n const readFileSync = deps.readFileSync ?? ((file: string) => fs.readFileSync(file, \"utf8\"));\n const existsSync = deps.existsSync ?? fs.existsSync;\n const pathEnv = deps.pathEnv ?? process.env.Path ?? process.env.PATH ?? \"\";\n const pathExt = deps.pathExt ?? process.env.PATHEXT ?? DEFAULT_PATHEXT;\n\n const resolved = resolveExecutablePath(command, pathEnv, pathExt, existsSync);\n if (!resolved) {\n // Let node-pty surface its own ENOENT \u2014 keeps existing error semantics.\n return [...argv];\n }\n\n const ext = path.win32.extname(resolved).toLowerCase();\n if (ext === \".exe\" || ext === \".com\") {\n return [resolved, ...restArgs];\n }\n if (ext === \".cmd\" || ext === \".bat\") {\n let content: string;\n try {\n content = readFileSync(resolved);\n } catch {\n return [\"cmd.exe\", \"/d\", \"/s\", \"/c\", resolved, ...restArgs];\n }\n const parsed = parseCmdShim(resolved, content);\n if (parsed) {\n return [parsed.node, parsed.entry, ...restArgs];\n }\n return [\"cmd.exe\", \"/d\", \"/s\", \"/c\", resolved, ...restArgs];\n }\n // Unknown extension (e.g. .ps1, .vbs): leave argv untouched and let the\n // caller/OS decide. Wrapping with cmd.exe wouldn't help these anyway.\n return [...argv];\n}\n\nexport function parseCmdShim(shimPath: string, content: string): ParsedCmdShim | null {\n const dp0Dir = path.win32.dirname(shimPath);\n\n // Match the dispatch line: a quoted .js entry followed by %*\n const entryMatch = content.match(/\"([^\"\\r\\n]+\\.js)\"\\s+%\\*/i);\n const entryRaw = entryMatch?.[1];\n if (!entryRaw) {\n return null;\n }\n const entry = expandShimVars(entryRaw, dp0Dir);\n\n // Try to find a quoted node executable reference; prefer one that points at\n // an absolute/dp0-relative location, falling back to bare `node` otherwise.\n const nodeMatch = content.match(/\"([^\"\\r\\n]*node\\.exe)\"/i) ?? content.match(/\"([^\"\\r\\n]*node)\"/i);\n const nodeRaw = nodeMatch?.[1];\n const node = nodeRaw ? expandShimVars(nodeRaw, dp0Dir) : \"node\";\n\n return { node, entry };\n}\n\nfunction expandShimVars(value: string, dp0Dir: string): string {\n // %~dp0 and %dp0% both expand to the directory containing the shim,\n // canonically with a trailing backslash.\n const dp0WithSlash = dp0Dir.endsWith(\"\\\\\") ? dp0Dir : `${dp0Dir}\\\\`;\n let expanded = value;\n expanded = expanded.replace(/%~dp0/gi, dp0WithSlash);\n expanded = expanded.replace(/%dp0%/gi, dp0WithSlash);\n\n if (path.win32.isAbsolute(expanded)) {\n return path.win32.normalize(expanded);\n }\n return path.win32.resolve(dp0Dir, expanded);\n}\n\nfunction parsePathExt(pathExt: string): string[] {\n return pathExt\n .split(\";\")\n .map((entry) => entry.trim().toLowerCase())\n .filter((entry) => entry.length > 0);\n}\n\nfunction resolveExecutablePath(\n command: string,\n pathEnv: string,\n pathExt: string,\n existsSync: (file: string) => boolean\n): string | null {\n const hasExt = path.win32.extname(command).length > 0;\n const extensions = parsePathExt(pathExt);\n\n if (path.win32.isAbsolute(command)) {\n if (existsSync(command)) {\n return command;\n }\n if (!hasExt) {\n for (const ext of extensions) {\n const candidate = command + ext;\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n }\n return null;\n }\n\n const dirs = pathEnv\n .split(\";\")\n .map((dir) => dir.trim())\n .filter((dir) => dir.length > 0);\n\n for (const dir of dirs) {\n if (hasExt) {\n const candidate = path.win32.join(dir, command);\n if (existsSync(candidate)) {\n return candidate;\n }\n continue;\n }\n for (const ext of extensions) {\n const candidate = path.win32.join(dir, command + ext);\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n }\n return null;\n}\n", "export { isDirectExecution } from \"./direct-execution.js\";\nexport { shouldUseShellForCommand } from \"./windows-shim.js\";\nexport type {\n ParsedCmdShim,\n ResolveSpawnArgvDeps,\n} from \"./windows-shim-resolver.js\";\nexport { parseCmdShim, resolveSpawnArgv } from \"./windows-shim-resolver.js\";\n", "/**\n * Image file detection.\n *\n * Used by both the `file.read` command (to decide whether a file should be\n * streamed as an image instead of decoded as UTF-8 text) and the\n * `/api/file` HTTP endpoint (to guard which files are allowed through and\n * to pick the right Content-Type).\n *\n * Detection is intentionally extension-based, not content-sniffing:\n * - It stays consistent between `file.read` and the static endpoint.\n * - File trees in practice already use extensions faithfully.\n * - Content-sniffing every open would require a second stat/read round\n * trip and complicate the \"is this text?\" path.\n */\n\nimport { extname } from \"path\";\n\nexport interface ImageTypeInfo {\n mime: string;\n /**\n * True when the file is really a text format (SVG) that we *display* as an\n * image by default. The editor UI uses this to offer an \"edit as text\"\n * toggle so users can still tweak SVG source.\n */\n isTextBacked: boolean;\n}\n\nconst IMAGE_MIME_BY_EXT: Record<string, ImageTypeInfo> = {\n \".png\": { mime: \"image/png\", isTextBacked: false },\n \".jpg\": { mime: \"image/jpeg\", isTextBacked: false },\n \".jpeg\": { mime: \"image/jpeg\", isTextBacked: false },\n \".gif\": { mime: \"image/gif\", isTextBacked: false },\n \".webp\": { mime: \"image/webp\", isTextBacked: false },\n \".bmp\": { mime: \"image/bmp\", isTextBacked: false },\n \".ico\": { mime: \"image/x-icon\", isTextBacked: false },\n \".svg\": { mime: \"image/svg+xml\", isTextBacked: true },\n};\n\nexport function getImageTypeInfo(filePath: string): ImageTypeInfo | null {\n const ext = extname(filePath).toLowerCase();\n return IMAGE_MIME_BY_EXT[ext] ?? null;\n}\n\nexport function isImageFile(filePath: string): boolean {\n return getImageTypeInfo(filePath) !== null;\n}\n", "/**\n * File IO operations with conflict detection.\n */\n\nimport { createHash } from \"crypto\";\nimport { readFile as fsReadFile, writeFile as fsWriteFile, mkdir, rm, stat } from \"fs/promises\";\nimport { dirname, isAbsolute, relative, resolve } from \"path\";\nimport { getImageTypeInfo } from \"./image.js\";\n\nexport interface FileReadTextResult {\n kind: \"text\";\n content: string;\n baseHash: string;\n encoding: \"utf-8\";\n}\n\nexport interface FileReadImageResult {\n kind: \"image\";\n mime: string;\n /** URL the web client can drop into an <img src>. Relative so auth cookie applies. */\n url: string;\n /** File size in bytes. Useful for the editor chrome (\"PNG \u00B7 34.2 KB\"). */\n size: number;\n /**\n * True for SVG: even though we return an image URL, the file is really\n * text and the UI should offer an \"edit as text\" toggle.\n */\n isTextBacked: boolean;\n /** Version marker for cache-busting and external-refresh detection. */\n version: string;\n}\n\nexport type FileReadResult = FileReadTextResult | FileReadImageResult;\n\nexport interface FileWriteResult {\n newHash: string;\n}\n\nasync function statSafe(path: string) {\n try {\n return await stat(path);\n } catch {\n return null;\n }\n}\n\nexport async function createFile(rootPath: string, relPath: string): Promise<void> {\n const abs = resolveSafe(rootPath, relPath);\n const existing = await statSafe(abs);\n\n if (existing) {\n throw { code: \"already_exists\", message: \"File already exists\" };\n }\n\n await mkdir(dirname(abs), { recursive: true });\n await fsWriteFile(abs, \"\", \"utf-8\");\n}\n\nexport async function createDirectory(rootPath: string, relPath: string): Promise<void> {\n const abs = resolveSafe(rootPath, relPath);\n const existing = await statSafe(abs);\n\n if (existing) {\n throw { code: \"already_exists\", message: \"Directory already exists\" };\n }\n\n await mkdir(abs, { recursive: true });\n}\n\nexport async function deleteEntry(rootPath: string, relPath: string): Promise<void> {\n const abs = resolveSafe(rootPath, relPath);\n const existing = await statSafe(abs);\n\n if (!existing) {\n throw { code: \"not_found\", message: \"Target not found\" };\n }\n\n await rm(abs, { recursive: true });\n}\n\n/**\n * Resolves a relative path safely to prevent path escape attacks.\n * Throws an error if the resolved path escapes the workspace root.\n *\n * @param root - Workspace root directory\n * @param relPath - Relative path within workspace\n * @returns Absolute path safely resolved within workspace\n */\nexport function resolveSafe(root: string, relPath: string): string {\n const absRoot = resolve(root);\n const abs = resolve(absRoot, relPath);\n\n // Prevent path escape: resolved path must stay inside the workspace root.\n const rel = relative(absRoot, abs);\n if (rel === \"..\" || rel.startsWith(`..${\"/\"}`) || isAbsolute(rel)) {\n throw { code: \"path_escape\", message: \"Path escapes workspace root\" };\n }\n\n return abs;\n}\n\n/**\n * Reads a file from the workspace.\n *\n * For images (extension allowlist), returns a URL the client can use with\n * a native <img> tag so we don't bloat the WebSocket channel with base64\n * payloads. For everything else, reads as UTF-8 text and includes a\n * baseHash for write-time conflict detection.\n *\n * @param workspaceId - Workspace id (used to construct the asset URL for images)\n * @param rootPath - Workspace root path\n * @param relPath - Relative file path\n */\nexport async function readFile(\n workspaceId: string,\n rootPath: string,\n relPath: string\n): Promise<FileReadResult> {\n const abs = resolveSafe(rootPath, relPath);\n\n const imageType = getImageTypeInfo(relPath);\n if (imageType) {\n const bytes = await fsReadFile(abs);\n const params = new URLSearchParams({\n workspaceId,\n path: relPath,\n });\n return {\n kind: \"image\",\n mime: imageType.mime,\n url: `/api/file?${params.toString()}`,\n size: bytes.byteLength,\n isTextBacked: imageType.isTextBacked,\n version: createHash(\"sha256\").update(bytes).digest(\"hex\"),\n };\n }\n\n const content = await fsReadFile(abs, \"utf-8\");\n const baseHash = createHash(\"sha256\").update(content).digest(\"hex\");\n\n return {\n kind: \"text\",\n content,\n baseHash,\n encoding: \"utf-8\",\n };\n}\n\n/**\n * Writes a file to the workspace with conflict detection.\n * If the file changed externally since reading (baseHash mismatch),\n * throws conflict error.\n *\n * @param rootPath - Workspace root path\n * @param relPath - Relative file path\n * @param content - New content to write\n * @param baseHash - Hash of original content (optional)\n * @returns New hash after write\n */\nexport async function writeFile(\n rootPath: string,\n relPath: string,\n content: string,\n baseHash?: string\n): Promise<FileWriteResult> {\n const abs = resolveSafe(rootPath, relPath);\n\n // Conflict check if baseHash provided\n if (baseHash) {\n const current = await fsReadFile(abs, \"utf-8\").catch(() => \"\");\n const currentHash = createHash(\"sha256\").update(current).digest(\"hex\");\n\n if (currentHash !== baseHash) {\n throw {\n code: \"conflict\",\n message: \"File has been modified externally\",\n details: {\n expectedHash: baseHash,\n actualHash: currentHash,\n },\n };\n }\n }\n\n // Ensure parent directory exists\n await mkdir(dirname(abs), { recursive: true });\n\n // Write new content\n await fsWriteFile(abs, content, \"utf-8\");\n const newHash = createHash(\"sha256\").update(content).digest(\"hex\");\n\n return { newHash };\n}\n", "/**\n * /api/file \u2014 binary file streaming endpoint.\n *\n * This exists so the web client can render image previews via native\n * `<img src>` without forcing us to base64-encode large files onto the\n * WebSocket channel. Scope is deliberately narrow:\n *\n * - GET only, read only.\n * - Allowed mime types gated by `getImageTypeInfo` (extension allowlist).\n * Non-image files 404 so the endpoint isn't a general exfiltration\n * channel against the workspace.\n * - `resolveSafe` rejects any path that escapes the workspace root.\n * - Auth is inherited from the global `onRequest` guard in `app.ts`\n * (cookie-based), same model as every other non-public route.\n *\n * Browsers attach the auth cookie automatically for `<img src=\"/api/file?\u2026\">`\n * requests, so no extra work is needed on the client beyond constructing\n * the URL.\n */\n\nimport type { FastifyInstance, FastifyReply, FastifyRequest } from \"fastify\";\nimport { createReadStream } from \"fs\";\nimport { realpath, stat } from \"fs/promises\";\nimport { isAbsolute, relative } from \"path\";\nimport { resolveSafe } from \"../fs/file-io.js\";\nimport { getImageTypeInfo } from \"../fs/image.js\";\nimport type { WorkspaceManager } from \"../workspace/manager.js\";\n\nfunction isPathInsideRoot(rootPath: string, targetPath: string): boolean {\n const rel = relative(rootPath, targetPath);\n return rel !== \"..\" && !rel.startsWith(`..${\"/\"}`) && !isAbsolute(rel);\n}\n\ninterface FileAssetQuery {\n workspaceId?: string;\n path?: string;\n}\n\nexport function registerFileAssetRoutes(\n app: FastifyInstance,\n deps: { workspaceMgr: WorkspaceManager }\n) {\n app.get(\n \"/api/file\",\n async (request: FastifyRequest<{ Querystring: FileAssetQuery }>, reply: FastifyReply) => {\n const { workspaceId, path: relPath } = request.query;\n\n if (!workspaceId || !relPath) {\n return reply.status(400).send({ ok: false, error: \"workspaceId and path are required\" });\n }\n\n const workspace = deps.workspaceMgr.get(workspaceId);\n if (!workspace) {\n return reply.status(404).send({ ok: false, error: \"workspace_not_found\" });\n }\n\n const typeInfo = getImageTypeInfo(relPath);\n if (!typeInfo) {\n // Enforce allowlist: this endpoint exists for image previews only,\n // not as a generic file fetcher. Text files keep using file.read\n // over WS where we can attach baseHash / encoding metadata.\n return reply.status(404).send({ ok: false, error: \"not_an_image\" });\n }\n\n let absPath: string;\n try {\n absPath = resolveSafe(workspace.path, relPath);\n } catch {\n return reply.status(400).send({ ok: false, error: \"path_escape\" });\n }\n\n try {\n const [realWorkspacePath, realAssetPath] = await Promise.all([\n realpath(workspace.path),\n realpath(absPath),\n ]);\n\n if (!isPathInsideRoot(realWorkspacePath, realAssetPath)) {\n return reply.status(400).send({ ok: false, error: \"path_escape\" });\n }\n } catch {\n return reply.status(404).send({ ok: false, error: \"not_found\" });\n }\n\n let fileSize: number;\n try {\n const stats = await stat(absPath);\n if (!stats.isFile()) {\n return reply.status(404).send({ ok: false, error: \"not_a_file\" });\n }\n fileSize = stats.size;\n } catch {\n return reply.status(404).send({ ok: false, error: \"not_found\" });\n }\n\n // no-store here is deliberate: the editor re-fetches on demand and we\n // want changes on disk to reflect immediately without stale caches.\n reply\n .header(\"Content-Type\", typeInfo.mime)\n .header(\"Content-Length\", String(fileSize))\n .header(\"Cache-Control\", \"no-store\")\n .header(\"X-Content-Type-Options\", \"nosniff\");\n\n return reply.send(createReadStream(absPath));\n }\n );\n}\n", "export const UPLOAD_TTL_HOURS = 72;\nexport const UPLOAD_BUCKET_MAX_BYTES = 200 * 1024 * 1024;\nexport const MAX_FILE_BYTES = 50 * 1024 * 1024;\nexport const MAX_FILES_PER_BATCH = 20;\nexport const STARTUP_GC_DELAY_MS = 5_000;\n", "import { randomUUID } from \"node:crypto\";\nimport { lstat, mkdir } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nconst MAX_FILENAME_LENGTH = 64;\nconst KEEP_FILENAME_CHAR = /[a-zA-Z0-9._\u4E00-\u9FFF \\-]/;\nconst WORKSPACE_ID_RE = /^[a-zA-Z0-9_-]+$/;\n\nexport function sanitizeOriginalName(input: string): string {\n let sanitized = \"\";\n\n for (const char of input.trim()) {\n sanitized += KEEP_FILENAME_CHAR.test(char) ? char : \"_\";\n }\n\n sanitized = sanitized.replace(/^\\.+/, \"\");\n\n if (sanitized.length === 0 || /^[_\\s]*$/.test(sanitized)) {\n return \"file\";\n }\n\n if (sanitized.length <= MAX_FILENAME_LENGTH) {\n return sanitized;\n }\n\n const lastDot = sanitized.lastIndexOf(\".\");\n if (lastDot > 0 && sanitized.length - lastDot <= 16) {\n const ext = sanitized.slice(lastDot);\n const stem = sanitized.slice(0, MAX_FILENAME_LENGTH - ext.length);\n return stem + ext;\n }\n\n return sanitized.slice(0, MAX_FILENAME_LENGTH);\n}\n\nexport function validateWorkspaceId(id: string): void {\n if (!WORKSPACE_ID_RE.test(id)) {\n throw new Error(`invalid workspace id: ${JSON.stringify(id)}`);\n }\n}\n\nexport interface GenerateBucketPathInput {\n uploadsDir: string;\n workspaceId: string;\n originalName: string;\n now?: Date;\n}\n\nexport interface GenerateBucketPathResult {\n dir: string;\n absolutePath: string;\n uuid8: string;\n sanitizedName: string;\n}\n\nexport async function assertNoSymlinkInPath(rootDir: string, targetDir: string): Promise<void> {\n const resolvedRoot = path.resolve(rootDir);\n const resolvedTarget = path.resolve(targetDir);\n\n if (resolvedTarget !== resolvedRoot && !resolvedTarget.startsWith(`${resolvedRoot}${path.sep}`)) {\n throw new Error(`target dir escaped uploads root: ${resolvedTarget}`);\n }\n\n let current = resolvedRoot;\n const relative = path.relative(resolvedRoot, resolvedTarget);\n if (!relative) {\n return;\n }\n\n for (const segment of relative.split(path.sep)) {\n current = path.join(current, segment);\n try {\n const info = await lstat(current);\n if (info.isSymbolicLink()) {\n throw new Error(`symlinked upload path segment is not allowed: ${current}`);\n }\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code === \"ENOENT\") {\n continue;\n }\n throw error;\n }\n }\n}\n\nasync function assertDirectorySegmentSafe(segmentPath: string): Promise<void> {\n const info = await lstat(segmentPath);\n if (info.isSymbolicLink()) {\n throw new Error(`symlinked upload path segment is not allowed: ${segmentPath}`);\n }\n if (!info.isDirectory()) {\n throw new Error(`upload path segment is not a directory: ${segmentPath}`);\n }\n}\n\nexport async function ensureSafeUploadDir(rootDir: string, targetDir: string): Promise<void> {\n const resolvedRoot = path.resolve(rootDir);\n const resolvedTarget = path.resolve(targetDir);\n\n if (resolvedTarget !== resolvedRoot && !resolvedTarget.startsWith(`${resolvedRoot}${path.sep}`)) {\n throw new Error(`target dir escaped uploads root: ${resolvedTarget}`);\n }\n\n try {\n await assertDirectorySegmentSafe(resolvedRoot);\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code !== \"ENOENT\") {\n throw error;\n }\n await mkdir(resolvedRoot, { recursive: true });\n await assertDirectorySegmentSafe(resolvedRoot);\n }\n\n const relative = path.relative(resolvedRoot, resolvedTarget);\n if (!relative) {\n return;\n }\n\n let current = resolvedRoot;\n for (const segment of relative.split(path.sep)) {\n current = path.join(current, segment);\n\n try {\n await assertDirectorySegmentSafe(current);\n continue;\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code !== \"ENOENT\") {\n throw error;\n }\n }\n\n try {\n await mkdir(current);\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code !== \"EEXIST\") {\n throw error;\n }\n }\n\n await assertDirectorySegmentSafe(current);\n }\n}\n\nexport function generateBucketPath(input: GenerateBucketPathInput): GenerateBucketPathResult {\n validateWorkspaceId(input.workspaceId);\n\n const now = input.now ?? new Date();\n const dateStr = now.toISOString().slice(0, 10);\n const dir = path.join(input.uploadsDir, input.workspaceId, dateStr);\n const sanitizedName = sanitizeOriginalName(input.originalName);\n const uuid8 = randomUUID().replace(/-/g, \"\").slice(0, 8);\n const absolutePath = path.resolve(dir, `${uuid8}-${sanitizedName}`);\n const uploadsRoot = `${path.resolve(input.uploadsDir)}${path.sep}`;\n\n if (!absolutePath.startsWith(uploadsRoot)) {\n throw new Error(`generated upload path escaped uploads root: ${absolutePath}`);\n }\n\n return {\n dir,\n absolutePath,\n uuid8,\n sanitizedName,\n };\n}\n", "import { readdir, rm, rmdir, stat, unlink } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { UPLOAD_BUCKET_MAX_BYTES, UPLOAD_TTL_HOURS } from \"./constants.js\";\nimport { validateWorkspaceId } from \"./paths.js\";\n\ninterface UploadLogger {\n warn(ctx: Record<string, unknown>, message: string): void;\n}\n\ninterface FileEntry {\n absPath: string;\n size: number;\n mtimeMs: number;\n}\n\nconst WORKSPACE_ID_RE_FOR_GC = /^[a-zA-Z0-9_-]+$/;\n\nasync function listFilesRecursive(root: string): Promise<FileEntry[]> {\n let entries: import(\"node:fs\").Dirent[];\n try {\n entries = await readdir(root, { withFileTypes: true });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return [];\n }\n throw error;\n }\n\n const files: FileEntry[] = [];\n for (const entry of entries) {\n const childPath = path.join(root, entry.name);\n if (entry.isDirectory()) {\n files.push(...(await listFilesRecursive(childPath)));\n continue;\n }\n\n if (!entry.isFile()) {\n continue;\n }\n\n const fileStat = await stat(childPath);\n files.push({\n absPath: childPath,\n size: fileStat.size,\n mtimeMs: fileStat.mtimeMs,\n });\n }\n\n return files;\n}\n\nasync function pruneEmptyDirectories(root: string): Promise<void> {\n let entries: import(\"node:fs\").Dirent[];\n try {\n entries = await readdir(root, { withFileTypes: true });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return;\n }\n throw error;\n }\n\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n continue;\n }\n await pruneEmptyDirectories(path.join(root, entry.name));\n }\n\n const remainingEntries = await readdir(root).catch(() => [] as string[]);\n if (remainingEntries.length === 0) {\n await rmdir(root).catch(() => undefined);\n }\n}\n\nexport async function deleteWorkspaceUploads(\n uploadsDir: string,\n workspaceId: string\n): Promise<void> {\n validateWorkspaceId(workspaceId);\n const bucket = path.join(uploadsDir, workspaceId);\n await rm(bucket, { recursive: true, force: true });\n}\n\nexport async function enforceBucketCap(\n uploadsDir: string,\n workspaceId: string,\n capBytes: number,\n logger?: UploadLogger\n): Promise<void> {\n validateWorkspaceId(workspaceId);\n const bucket = path.join(uploadsDir, workspaceId);\n const files = await listFilesRecursive(bucket);\n const totalBytes = files.reduce((sum, file) => sum + file.size, 0);\n\n if (totalBytes <= capBytes) {\n return;\n }\n\n files.sort((a, b) => a.mtimeMs - b.mtimeMs);\n let remainingBytes = totalBytes;\n\n for (const file of files) {\n if (remainingBytes <= capBytes) {\n break;\n }\n\n try {\n await unlink(file.absPath);\n remainingBytes -= file.size;\n } catch (error) {\n logger?.warn(\n { err: error, file: file.absPath },\n \"failed to evict file during bucket cap enforcement\"\n );\n }\n }\n\n await pruneEmptyDirectories(bucket);\n}\n\nexport async function runStartupGc(uploadsDir: string, logger?: UploadLogger): Promise<void> {\n const cutoffMs = Date.now() - UPLOAD_TTL_HOURS * 3_600_000;\n\n let workspaceEntries: import(\"node:fs\").Dirent[];\n try {\n workspaceEntries = await readdir(uploadsDir, { withFileTypes: true });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return;\n }\n logger?.warn({ err: error, uploadsDir }, \"startup gc: failed to list root\");\n return;\n }\n\n for (const workspaceEntry of workspaceEntries) {\n if (!workspaceEntry.isDirectory()) {\n continue;\n }\n\n const workspaceDir = path.join(uploadsDir, workspaceEntry.name);\n const dateEntries = await readdir(workspaceDir, { withFileTypes: true }).catch(\n () => [] as import(\"node:fs\").Dirent[]\n );\n\n for (const dateEntry of dateEntries) {\n if (!dateEntry.isDirectory()) {\n continue;\n }\n\n const dateDir = path.join(workspaceDir, dateEntry.name);\n const files = await listFilesRecursive(dateDir);\n\n for (const file of files) {\n if (file.mtimeMs >= cutoffMs) {\n continue;\n }\n\n try {\n await unlink(file.absPath);\n } catch (error) {\n logger?.warn({ err: error, filePath: file.absPath }, \"startup gc: failed on file\");\n }\n }\n\n await pruneEmptyDirectories(dateDir);\n }\n\n if (WORKSPACE_ID_RE_FOR_GC.test(workspaceEntry.name)) {\n await enforceBucketCap(uploadsDir, workspaceEntry.name, UPLOAD_BUCKET_MAX_BYTES, logger);\n }\n\n await pruneEmptyDirectories(workspaceDir);\n }\n}\n", "import { createWriteStream } from \"node:fs\";\nimport { rm, stat, writeFile } from \"node:fs/promises\";\nimport { pipeline } from \"node:stream/promises\";\nimport type { FastifyInstance, FastifyReply, FastifyRequest } from \"fastify\";\nimport { enforceBucketCap } from \"../uploads/cleanup.js\";\nimport { MAX_FILES_PER_BATCH, UPLOAD_BUCKET_MAX_BYTES } from \"../uploads/constants.js\";\nimport { ensureSafeUploadDir, generateBucketPath } from \"../uploads/paths.js\";\n\ninterface UploadLogger {\n warn(ctx: Record<string, unknown>, message: string): void;\n}\n\ninterface Deps {\n uploadsDir: string;\n workspaceMgr: { get(id: string): { path: string } | null | undefined };\n}\n\ninterface UploadedFileMeta {\n path: string;\n originalName: string;\n size: number;\n}\n\ntype WorkspaceLookup = { path: string };\n\nfunction inferClipboardFilename(\n filename: string | undefined,\n mimeType: string | undefined,\n now: Date\n): string {\n const trimmed = filename?.trim();\n if (trimmed) {\n return trimmed;\n }\n\n const hhmmss = now.toISOString().slice(11, 19).replace(/:/g, \"\");\n let ext = \"bin\";\n if (mimeType === \"image/png\") {\n ext = \"png\";\n } else if (mimeType === \"image/jpeg\") {\n ext = \"jpg\";\n } else if (mimeType === \"image/webp\") {\n ext = \"webp\";\n } else if (mimeType === \"application/pdf\") {\n ext = \"pdf\";\n }\n\n return `screenshot-${hhmmss}.${ext}`;\n}\n\nasync function cleanupWrittenFiles(files: UploadedFileMeta[]): Promise<void> {\n await Promise.all(files.map((file) => rm(file.path, { force: true })));\n}\n\nfunction getRequestLogger(request: FastifyRequest): UploadLogger | undefined {\n const logger = request.log as UploadLogger | undefined;\n if (logger && typeof logger.warn === \"function\") {\n return logger;\n }\n return undefined;\n}\n\nasync function rejectAndCleanup(\n reply: FastifyReply,\n written: UploadedFileMeta[],\n statusCode: number,\n error: string\n) {\n await cleanupWrittenFiles(written);\n return reply.status(statusCode).send({ ok: false, error });\n}\n\nfunction getActiveWorkspace(deps: Deps, workspaceId: string | undefined): WorkspaceLookup | null {\n if (!workspaceId) {\n return null;\n }\n\n return deps.workspaceMgr.get(workspaceId) ?? null;\n}\n\nasync function ensureWorkspaceStillActive(\n deps: Deps,\n workspaceId: string | undefined,\n reply: FastifyReply,\n written: UploadedFileMeta[]\n): Promise<WorkspaceLookup | null> {\n const workspace = getActiveWorkspace(deps, workspaceId);\n if (!workspace) {\n await rejectAndCleanup(reply, written, 404, \"workspace_not_found\");\n return null;\n }\n\n return workspace;\n}\n\nfunction lockWorkspaceId(\n currentWorkspaceId: string | undefined,\n nextWorkspaceId: string\n): string | \"mismatch\" {\n if (!currentWorkspaceId) {\n return nextWorkspaceId;\n }\n return currentWorkspaceId === nextWorkspaceId ? currentWorkspaceId : \"mismatch\";\n}\n\nexport function registerUploadsRoute(app: FastifyInstance, deps: Deps): void {\n app.post(\"/api/uploads\", async (request: FastifyRequest, reply: FastifyReply) => {\n if (!request.isMultipart()) {\n return reply.status(400).send({ ok: false, error: \"expected_multipart\" });\n }\n\n let workspaceId: string | undefined;\n let workspaceValidated = false;\n let fileCount = 0;\n const written: UploadedFileMeta[] = [];\n const logger = getRequestLogger(request);\n\n try {\n const parts = request.parts();\n for await (const part of parts) {\n if (part.type === \"field\" && part.fieldname === \"workspaceId\") {\n const lockedWorkspaceId = lockWorkspaceId(workspaceId, String(part.value));\n if (lockedWorkspaceId === \"mismatch\") {\n return rejectAndCleanup(reply, written, 400, \"workspace_mismatch\");\n }\n workspaceId = lockedWorkspaceId;\n if (!getActiveWorkspace(deps, workspaceId)) {\n return rejectAndCleanup(reply, written, 404, \"workspace_not_found\");\n }\n workspaceValidated = true;\n continue;\n }\n\n if (part.type === \"field\" && part.fieldname === \"files\") {\n if (!workspaceId) {\n return rejectAndCleanup(reply, written, 400, \"workspace_required\");\n }\n\n fileCount += 1;\n if (fileCount > MAX_FILES_PER_BATCH) {\n return rejectAndCleanup(reply, written, 400, \"too_many_files\");\n }\n\n const now = new Date();\n const originalName = inferClipboardFilename(undefined, part.mimetype, now);\n const target = generateBucketPath({\n uploadsDir: deps.uploadsDir,\n workspaceId,\n originalName,\n now,\n });\n\n if (!(await ensureWorkspaceStillActive(deps, workspaceId, reply, written))) {\n return;\n }\n\n try {\n await ensureSafeUploadDir(deps.uploadsDir, target.dir);\n await writeFile(target.absolutePath, String(part.value));\n } catch (error) {\n await rm(target.absolutePath, { force: true });\n await cleanupWrittenFiles(written);\n logger?.warn({ err: error }, \"upload write failed\");\n return reply.status(500).send({ ok: false, error: \"write_failed\" });\n }\n\n try {\n const fileStat = await stat(target.absolutePath);\n written.push({\n path: target.absolutePath,\n originalName,\n size: fileStat.size,\n });\n } catch (error) {\n await rm(target.absolutePath, { force: true });\n await cleanupWrittenFiles(written);\n logger?.warn({ err: error }, \"upload stat failed\");\n return reply.status(500).send({ ok: false, error: \"write_failed\" });\n }\n\n continue;\n }\n\n if (part.type !== \"file\" || part.fieldname !== \"files\") {\n if (part.type === \"file\") {\n part.file.resume();\n }\n continue;\n }\n\n if (!workspaceId) {\n part.file.resume();\n return rejectAndCleanup(reply, written, 400, \"workspace_required\");\n }\n\n fileCount += 1;\n if (fileCount > MAX_FILES_PER_BATCH) {\n part.file.resume();\n return rejectAndCleanup(reply, written, 400, \"too_many_files\");\n }\n\n const now = new Date();\n const originalName = inferClipboardFilename(part.filename, part.mimetype, now);\n const target = generateBucketPath({\n uploadsDir: deps.uploadsDir,\n workspaceId,\n originalName,\n now,\n });\n\n if (!(await ensureWorkspaceStillActive(deps, workspaceId, reply, written))) {\n part.file.resume();\n return;\n }\n\n try {\n await ensureSafeUploadDir(deps.uploadsDir, target.dir);\n await pipeline(part.file, createWriteStream(target.absolutePath));\n } catch (error) {\n await rm(target.absolutePath, { force: true });\n await cleanupWrittenFiles(written);\n logger?.warn({ err: error }, \"upload write failed\");\n return reply.status(500).send({ ok: false, error: \"write_failed\" });\n }\n\n if (part.file.truncated) {\n await rm(target.absolutePath, { force: true });\n await cleanupWrittenFiles(written);\n return reply.status(413).send({ ok: false, error: \"file_too_large\" });\n }\n\n try {\n const fileStat = await stat(target.absolutePath);\n written.push({\n path: target.absolutePath,\n originalName,\n size: fileStat.size,\n });\n } catch (error) {\n await rm(target.absolutePath, { force: true });\n await cleanupWrittenFiles(written);\n logger?.warn({ err: error }, \"upload stat failed\");\n return reply.status(500).send({ ok: false, error: \"write_failed\" });\n }\n }\n } catch (error) {\n await cleanupWrittenFiles(written);\n if ((error as { code?: string }).code === \"FST_REQ_FILE_TOO_LARGE\") {\n return reply.status(413).send({ ok: false, error: \"file_too_large\" });\n }\n logger?.warn({ err: error }, \"upload parse failed\");\n return reply.status(400).send({ ok: false, error: \"parse_failed\" });\n }\n\n if (!workspaceId) {\n return rejectAndCleanup(reply, written, 400, \"workspace_required\");\n }\n\n if (!workspaceValidated) {\n return rejectAndCleanup(reply, written, 404, \"workspace_not_found\");\n }\n\n if (written.length === 0) {\n return rejectAndCleanup(reply, written, 400, \"no_files\");\n }\n\n if (!(await ensureWorkspaceStillActive(deps, workspaceId, reply, written))) {\n return;\n }\n\n void enforceBucketCap(deps.uploadsDir, workspaceId, UPLOAD_BUCKET_MAX_BYTES, logger).catch(\n (error) => logger?.warn({ err: error }, \"bucket cap enforcement failed\")\n );\n\n return reply.send({ ok: true, files: written });\n });\n}\n", "/**\n * Fastify App Assembly\n *\n * Builds the Fastify application with all routes and middleware\n */\n\nimport compress from \"@fastify/compress\";\nimport cors from \"@fastify/cors\";\nimport multipart from \"@fastify/multipart\";\nimport staticPlugin from \"@fastify/static\";\nimport websocket, { type WebSocket } from \"@fastify/websocket\";\nimport type { FastifyRequest } from \"fastify\";\nimport Fastify, { type FastifyInstance, type FastifyServerOptions } from \"fastify\";\nimport {\n createAuthGuard,\n registerAuthLogoutRoute,\n registerAuthRoutes,\n registerAuthStatusRoute,\n} from \"./auth/index.js\";\nimport type { ServerConfig } from \"./config.js\";\nimport { registerFileAssetRoutes } from \"./routes/file-asset.js\";\nimport { registerUploadsRoute } from \"./routes/uploads.js\";\nimport type { Database } from \"./storage/database.js\";\nimport type { AuthLoginBlockRepo } from \"./storage/repositories/auth-login-block-repo.js\";\nimport type { AuthSessionRepo } from \"./storage/repositories/auth-session-repo.js\";\nimport { MAX_FILE_BYTES, MAX_FILES_PER_BATCH } from \"./uploads/constants.js\";\nimport { isFrontendNavigationRequest } from \"./web-ui-routing.js\";\nimport type { WorkspaceManager } from \"./workspace/manager.js\";\nimport type { WsHub } from \"./ws/hub.js\";\n\ninterface AppDeps {\n wsHub: WsHub;\n db: Database;\n webRoot?: string;\n workspaceMgr: WorkspaceManager;\n config: ServerConfig;\n authSessionRepo: AuthSessionRepo;\n authLoginBlockRepo: AuthLoginBlockRepo;\n logger?: FastifyServerOptions[\"logger\"];\n}\n\n/**\n * Build Fastify application\n */\nexport async function buildFastifyApp(deps: AppDeps): Promise<FastifyInstance> {\n const app = Fastify({\n logger: deps.logger ?? {\n level: \"info\",\n transport: {\n target: \"pino-pretty\",\n options: {\n translateTime: \"HH:MM:ss Z\",\n ignore: \"pid,hostname\",\n },\n },\n },\n });\n\n // WebSocket plugin - routes must be registered within this scope\n await app.register(async function (fastify) {\n await fastify.register(websocket, {\n options: {\n // permessage-deflate: terminal ANSI streams (repeated escape codes,\n // whitespace, color sequences) typically compress 5-10x. Cross-message\n // context takeover is left enabled (default) so the zlib dictionary\n // persists across frames for highest ratio on continuous streams.\n perMessageDeflate: {\n threshold: 1024,\n zlibDeflateOptions: { level: 6 },\n },\n },\n });\n\n // WebSocket endpoint - connection is the WebSocket directly in v11+\n fastify.get(\"/ws\", { websocket: true }, (connection: WebSocket, req: FastifyRequest) => {\n deps.wsHub.handleConnection(connection, req);\n });\n });\n\n // Phase 2: Configurable auth middleware\n app.addHook(\n \"onRequest\",\n createAuthGuard({\n config: deps.config,\n authSessionRepo: deps.authSessionRepo,\n authLoginBlockRepo: deps.authLoginBlockRepo,\n })\n );\n\n await app.register(compress);\n\n await app.register(multipart, {\n limits: {\n fileSize: MAX_FILE_BYTES,\n files: MAX_FILES_PER_BATCH,\n },\n isPartAFile: (fieldName, contentType, fileName) =>\n fieldName === \"files\" || contentType === \"application/octet-stream\" || fileName !== undefined,\n });\n\n // CORS configuration (development mode)\n await app.register(cors, {\n origin: true, // Allow all origins in development\n methods: [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"OPTIONS\"],\n allowedHeaders: [\"Content-Type\", \"Authorization\"],\n credentials: true,\n });\n\n // Auth endpoints\n app.get(\n \"/auth/status\",\n registerAuthStatusRoute({\n config: deps.config,\n authSessionRepo: deps.authSessionRepo,\n authLoginBlockRepo: deps.authLoginBlockRepo,\n })\n );\n app.post(\n \"/auth/login\",\n registerAuthRoutes({\n config: deps.config,\n authSessionRepo: deps.authSessionRepo,\n authLoginBlockRepo: deps.authLoginBlockRepo,\n })\n );\n app.post(\n \"/auth/logout\",\n registerAuthLogoutRoute({\n config: deps.config,\n authSessionRepo: deps.authSessionRepo,\n authLoginBlockRepo: deps.authLoginBlockRepo,\n })\n );\n\n // Health check endpoint\n app.get(\"/healthz\", async () => {\n return { ok: true };\n });\n\n // /api/file \u2014 binary streaming endpoint used by the editor's image preview.\n // Auth is inherited from the global onRequest cookie guard above, so this\n // only needs its own path-safety and allowlist checks.\n registerFileAssetRoutes(app, {\n workspaceMgr: deps.workspaceMgr,\n });\n\n registerUploadsRoute(app, {\n uploadsDir: deps.config.uploadsDir,\n workspaceMgr: deps.workspaceMgr,\n });\n\n // Static file serving (for web UI)\n if (deps.webRoot) {\n app.register(staticPlugin, {\n root: deps.webRoot,\n prefix: \"/\",\n wildcard: false,\n globIgnore: [\"index.html\", \"assets/**\"],\n maxAge: \"1y\",\n immutable: true,\n });\n\n app.register(staticPlugin, {\n root: `${deps.webRoot}/assets`,\n prefix: \"/assets/\",\n maxAge: \"1y\",\n immutable: true,\n wildcard: true,\n decorateReply: false,\n });\n\n app.get(\"/\", async (_request, reply) => {\n return reply.sendFile(\"index.html\", {\n maxAge: 0,\n immutable: false,\n });\n });\n\n app.get(\"/index.html\", async (_request, reply) => {\n return reply.sendFile(\"index.html\", {\n maxAge: 0,\n immutable: false,\n });\n });\n\n app.get(\"/*\", async (request, reply) => {\n if (!isFrontendNavigationRequest(request)) {\n return reply.callNotFound();\n }\n return reply.sendFile(\"index.html\", {\n maxAge: 0,\n immutable: false,\n });\n });\n }\n\n return app;\n}\n", "import type { EventBus } from \"../bus/event-bus.js\";\nimport type { SettingsRepo } from \"../storage/repositories/settings-repo.js\";\nimport type { WorkspaceManager } from \"../workspace/manager.js\";\n\nconst PERIOD_SETTING_KEY = \"git.autofetchPeriodSec\";\nconst DEFAULT_PERIOD_SEC = 180;\nconst TICK_INTERVAL_MS = 1_000;\nconst OPEN_TIME_COOLDOWN_MS = 5 * 60 * 1_000;\nconst MAX_CONSECUTIVE_FAILURES = 3;\nconst JITTER_RATIO = 0.1;\n\nexport interface AutoFetchRuntime {\n registerViewer(clientId: string, workspaceId: string): void;\n unregisterViewer(clientId: string): void;\n triggerOpenTimeFetch(workspaceId: string): void;\n recordSuccess(workspaceId: string): void;\n recordFailure(workspaceId: string): void;\n getLastFetchAt(workspaceId: string): number | undefined;\n runExclusive?<T>(workspaceId: string, op: () => Promise<T>): Promise<T>;\n start(): void;\n stop(): void;\n}\n\nexport interface AutoFetchDeps {\n workspaceMgr: Pick<WorkspaceManager, \"get\">;\n eventBus: EventBus;\n settingsRepo: Pick<SettingsRepo, \"get\">;\n runFetch: (workspaceId: string) => Promise<void>;\n now?: () => number;\n random?: () => number;\n setTimeout?: typeof globalThis.setTimeout;\n setInterval?: typeof globalThis.setInterval;\n clearInterval?: typeof globalThis.clearInterval;\n clearTimeout?: typeof globalThis.clearTimeout;\n}\n\ninterface WorkspaceFetchState {\n viewerCount: number;\n lastFetchAt?: number;\n consecutiveFailures: number;\n inFlight: boolean;\n blocked: boolean;\n nextFetchAt?: number;\n waiters: Array<() => void>;\n}\n\nexport class AutoFetchScheduler implements AutoFetchRuntime {\n private readonly clientWorkspaceMap = new Map<string, string>();\n private readonly workspaceStateMap = new Map<string, WorkspaceFetchState>();\n private readonly now: () => number;\n private readonly random: () => number;\n private readonly setTimeoutFn: typeof globalThis.setTimeout;\n private readonly setIntervalFn: typeof globalThis.setInterval;\n private readonly clearIntervalFn: typeof globalThis.clearInterval;\n private readonly clearTimeoutFn: typeof globalThis.clearTimeout;\n private readonly pendingTimeouts = new Set<ReturnType<typeof setTimeout>>();\n private tickTimer: ReturnType<typeof setInterval> | null = null;\n private stopped = false;\n\n constructor(private readonly deps: AutoFetchDeps) {\n this.now = deps.now ?? Date.now;\n this.random = deps.random ?? (() => 0.5);\n this.setTimeoutFn = deps.setTimeout ?? globalThis.setTimeout;\n this.setIntervalFn = deps.setInterval ?? globalThis.setInterval;\n this.clearIntervalFn = deps.clearInterval ?? globalThis.clearInterval;\n this.clearTimeoutFn = deps.clearTimeout ?? globalThis.clearTimeout;\n this.start();\n }\n\n registerViewer(clientId: string, workspaceId: string): void {\n const previousWorkspaceId = this.clientWorkspaceMap.get(clientId);\n if (previousWorkspaceId === workspaceId) {\n return;\n }\n\n if (previousWorkspaceId) {\n this.unregisterViewer(clientId);\n }\n\n this.clientWorkspaceMap.set(clientId, workspaceId);\n\n const state = this.getOrCreateState(workspaceId);\n state.viewerCount += 1;\n if (state.viewerCount === 1) {\n state.blocked = false;\n state.consecutiveFailures = 0;\n }\n\n this.ensureNextPeriodicFetch(state, false);\n }\n\n unregisterViewer(clientId: string): void {\n const workspaceId = this.clientWorkspaceMap.get(clientId);\n if (!workspaceId) {\n return;\n }\n\n this.clientWorkspaceMap.delete(clientId);\n\n const state = this.workspaceStateMap.get(workspaceId);\n if (!state) {\n return;\n }\n\n state.viewerCount = Math.max(0, state.viewerCount - 1);\n if (state.viewerCount === 0) {\n state.blocked = false;\n state.consecutiveFailures = 0;\n state.nextFetchAt = undefined;\n }\n }\n\n triggerOpenTimeFetch(workspaceId: string): void {\n const state = this.getOrCreateState(workspaceId);\n const lastFetchAt = state.lastFetchAt;\n\n if (this.stopped || state.inFlight) {\n return;\n }\n\n if (lastFetchAt !== undefined && this.now() - lastFetchAt < OPEN_TIME_COOLDOWN_MS) {\n return;\n }\n\n const timer = this.setTimeoutFn(() => {\n this.pendingTimeouts.delete(timer);\n if (this.stopped) {\n return;\n }\n void this.fetchWorkspace(workspaceId, \"open\");\n }, 0);\n this.pendingTimeouts.add(timer);\n }\n\n recordSuccess(workspaceId: string): void {\n const state = this.getOrCreateState(workspaceId);\n state.lastFetchAt = this.now();\n state.consecutiveFailures = 0;\n state.blocked = false;\n state.nextFetchAt = undefined;\n this.ensureNextPeriodicFetch(state, true);\n }\n\n recordFailure(workspaceId: string): void {\n const state = this.getOrCreateState(workspaceId);\n state.consecutiveFailures += 1;\n state.nextFetchAt = undefined;\n\n if (state.consecutiveFailures >= MAX_CONSECUTIVE_FAILURES) {\n state.blocked = true;\n return;\n }\n\n this.ensureNextPeriodicFetch(state, true);\n }\n\n getLastFetchAt(workspaceId: string): number | undefined {\n return this.workspaceStateMap.get(workspaceId)?.lastFetchAt;\n }\n\n async runExclusive<T>(workspaceId: string, op: () => Promise<T>): Promise<T> {\n const release = await this.acquireWorkspaceOperation(workspaceId);\n try {\n return await op();\n } finally {\n release();\n }\n }\n\n start(): void {\n if (this.tickTimer) {\n return;\n }\n\n this.stopped = false;\n this.tickTimer = this.setIntervalFn(() => {\n this.evaluateDueFetches();\n }, TICK_INTERVAL_MS);\n }\n\n stop(): void {\n if (this.tickTimer) {\n this.clearIntervalFn(this.tickTimer);\n this.tickTimer = null;\n }\n\n this.stopped = true;\n for (const timer of this.pendingTimeouts) {\n this.clearTimeoutFn(timer);\n }\n this.pendingTimeouts.clear();\n }\n\n private evaluateDueFetches(): void {\n const now = this.now();\n\n for (const [workspaceId, state] of this.workspaceStateMap) {\n if (!this.shouldCheckWorkspace(state)) {\n continue;\n }\n\n if (state.nextFetchAt === undefined) {\n this.ensureNextPeriodicFetch(state, false);\n }\n\n if (state.nextFetchAt === undefined || state.nextFetchAt > now) {\n continue;\n }\n\n void this.fetchWorkspace(workspaceId, \"periodic\", state.nextFetchAt);\n }\n }\n\n private shouldCheckWorkspace(state: WorkspaceFetchState): boolean {\n return this.getPeriodMs() > 0 && state.viewerCount > 0 && !state.inFlight && !state.blocked;\n }\n\n private ensureNextPeriodicFetch(state: WorkspaceFetchState, resetSchedule: boolean): void {\n const periodMs = this.getPeriodMs();\n if (periodMs <= 0 || state.viewerCount <= 0 || state.blocked || state.inFlight) {\n return;\n }\n\n if (!resetSchedule && state.nextFetchAt !== undefined) {\n return;\n }\n\n if (state.lastFetchAt === undefined) {\n state.nextFetchAt = this.now();\n return;\n }\n\n const nextFetchAt = state.lastFetchAt + this.getJitteredPeriodMs(periodMs);\n state.nextFetchAt = Math.max(this.now(), nextFetchAt);\n }\n\n private getPeriodMs(): number {\n const configuredPeriodSec = this.deps.settingsRepo.get<number>(PERIOD_SETTING_KEY);\n const periodSec = configuredPeriodSec ?? DEFAULT_PERIOD_SEC;\n return Math.max(0, periodSec) * 1_000;\n }\n\n private getJitteredPeriodMs(periodMs: number): number {\n const jitterScale = 1 + (this.random() - 0.5) * 2 * JITTER_RATIO;\n return Math.round(periodMs * jitterScale);\n }\n\n private getOrCreateState(workspaceId: string): WorkspaceFetchState {\n const existingState = this.workspaceStateMap.get(workspaceId);\n if (existingState) {\n return existingState;\n }\n\n const state: WorkspaceFetchState = {\n viewerCount: 0,\n consecutiveFailures: 0,\n inFlight: false,\n blocked: false,\n waiters: [],\n };\n this.workspaceStateMap.set(workspaceId, state);\n return state;\n }\n\n private async fetchWorkspace(\n workspaceId: string,\n mode: \"open\" | \"periodic\",\n scheduledAt?: number\n ): Promise<void> {\n if (this.stopped) {\n return;\n }\n\n const state = this.getOrCreateState(workspaceId);\n if (state.inFlight || state.blocked) {\n return;\n }\n\n if (!this.deps.workspaceMgr.get(workspaceId)) {\n state.nextFetchAt = undefined;\n return;\n }\n\n await this.runExclusive(workspaceId, async () => {\n const currentState = this.getOrCreateState(workspaceId);\n if (this.stopped || currentState.blocked) {\n return;\n }\n\n if (!this.deps.workspaceMgr.get(workspaceId)) {\n currentState.nextFetchAt = undefined;\n return;\n }\n\n if (mode === \"open\") {\n const lastFetchAt = currentState.lastFetchAt;\n if (lastFetchAt !== undefined && this.now() - lastFetchAt < OPEN_TIME_COOLDOWN_MS) {\n return;\n }\n } else if (\n scheduledAt !== undefined &&\n currentState.lastFetchAt !== undefined &&\n currentState.lastFetchAt >= scheduledAt\n ) {\n return;\n }\n\n try {\n await this.deps.runFetch(workspaceId);\n this.recordSuccess(workspaceId);\n } catch {\n this.recordFailure(workspaceId);\n }\n });\n }\n\n private acquireWorkspaceOperation(workspaceId: string): Promise<() => void> {\n const state = this.getOrCreateState(workspaceId);\n\n return new Promise((resolve) => {\n const grant = () => {\n state.inFlight = true;\n state.nextFetchAt = undefined;\n\n let released = false;\n resolve(() => {\n if (released) {\n return;\n }\n released = true;\n\n const next = state.waiters.shift();\n if (next) {\n next();\n return;\n }\n\n state.inFlight = false;\n this.ensureNextPeriodicFetch(state, true);\n });\n };\n\n if (state.inFlight) {\n state.waiters.push(grant);\n return;\n }\n\n grant();\n });\n }\n}\n", "import { spawn } from \"node:child_process\";\nimport { shouldUseShellForCommand } from \"@coder-studio/utils\";\n\nexport type CommandRunnerOptions = { windowsHide?: boolean };\n\nexport interface CommandRunnerResult {\n stdout: string;\n stderr: string;\n}\n\nexport type CommandRunner = (\n file: string,\n args: string[],\n options?: CommandRunnerOptions\n) => Promise<CommandRunnerResult>;\n\nexport async function runCommandAsString(\n file: string,\n args: string[],\n options?: CommandRunnerOptions\n): Promise<CommandRunnerResult> {\n return new Promise((resolve, reject) => {\n const child = spawn(file, args, {\n shell: shouldUseShellForCommand(file, process.platform),\n windowsHide: options?.windowsHide ?? true,\n });\n\n const stdoutChunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n\n child.stdout?.on(\"data\", (chunk: string | Buffer) => {\n stdoutChunks.push(typeof chunk === \"string\" ? Buffer.from(chunk) : chunk);\n });\n\n child.stderr?.on(\"data\", (chunk: string | Buffer) => {\n stderrChunks.push(typeof chunk === \"string\" ? Buffer.from(chunk) : chunk);\n });\n\n child.on(\"error\", (error) => {\n reject(\n Object.assign(error, {\n stdout: Buffer.concat(stdoutChunks).toString(\"utf8\"),\n stderr: Buffer.concat(stderrChunks).toString(\"utf8\"),\n })\n );\n });\n\n child.on(\"close\", (code) => {\n const stdout = Buffer.concat(stdoutChunks).toString(\"utf8\");\n const stderr = Buffer.concat(stderrChunks).toString(\"utf8\");\n\n if (code === 0) {\n resolve({ stdout, stderr });\n return;\n }\n\n reject(\n Object.assign(new Error(`Command failed with exit code ${code ?? \"unknown\"}`), {\n exitCode: code ?? undefined,\n stdout,\n stderr,\n })\n );\n });\n });\n}\n", "export type CommandAvailabilityCheck = (command: string) => Promise<boolean>;\n\nimport { type CommandRunner, runCommandAsString } from \"./command-runner.js\";\n\nexport interface CommandCheckDeps {\n platform?: NodeJS.Platform;\n runCommand?: CommandRunner;\n}\n\nexport function getCommandLookupExecutable(platform: NodeJS.Platform): \"where\" | \"which\" {\n return platform === \"win32\" ? \"where\" : \"which\";\n}\n\nexport async function checkCommandAvailable(\n command: string,\n deps: CommandCheckDeps = {}\n): Promise<boolean> {\n const platform = deps.platform ?? process.platform;\n const runCommand = deps.runCommand ?? runCommandAsString;\n const lookup = getCommandLookupExecutable(platform);\n\n try {\n const { stdout } = await runCommand(lookup, [command], { windowsHide: true });\n return stdout.trim().length > 0;\n } catch {\n return false;\n }\n}\n", "import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { type CommandAvailabilityCheck, checkCommandAvailable } from \"./command-check.js\";\nimport { type CommandRunner, runCommandAsString } from \"./command-runner.js\";\n\ntype MockProviderId = \"claude\" | \"codex\";\ntype MockInstallResult = \"success\" | \"permission_denied\" | \"command_not_found\";\n\ninterface MockInstallBehavior {\n result: MockInstallResult;\n message?: string;\n}\n\ninterface ProviderMockState {\n commands?: Partial<Record<string, boolean>>;\n installBehavior?: Partial<Record<MockProviderId, MockInstallBehavior>>;\n}\n\ninterface ProviderMockOverrides {\n commandExists: CommandAvailabilityCheck;\n runCommand: CommandRunner;\n}\n\nconst PROVIDER_INSTALL_PACKAGES: Record<MockProviderId, string> = {\n claude: \"@anthropic-ai/claude-code\",\n codex: \"@openai/codex\",\n};\n\nconst PROVIDER_COMMAND_SCRIPTS: Record<MockProviderId, string> = {\n claude: `#!/usr/bin/env bash\nset -euo pipefail\ntrap 'exit 0' TERM INT\nprintf 'Mock Claude ready\\\\n'\nwhile true; do\n sleep 1\ndone\n`,\n codex: `#!/usr/bin/env bash\nset -euo pipefail\ntrap 'exit 0' TERM INT\nprintf 'Session ID: abcdef-123456\\\\n> '\nwhile true; do\n sleep 1\ndone\n`,\n};\n\nexport function createE2EProviderMockOverrides(\n env: NodeJS.ProcessEnv = process.env\n): ProviderMockOverrides | null {\n const statePath = env.CODER_STUDIO_E2E_PROVIDER_STATE_PATH;\n if (!statePath) {\n return null;\n }\n\n const binDir = env.CODER_STUDIO_E2E_PROVIDER_BIN_DIR;\n const debugLogPath = env.CODER_STUDIO_E2E_PROVIDER_DEBUG_LOG_PATH;\n\n appendDebugLog(debugLogPath, `init statePath=${statePath} binDir=${binDir ?? \"\"}`);\n\n const commandExists: CommandAvailabilityCheck = async (command: string) => {\n const state = readMockState(statePath);\n const override = state.commands?.[command];\n appendDebugLog(\n debugLogPath,\n `commandExists ${command} override=${String(override)} state=${JSON.stringify(state.commands ?? {})}`\n );\n\n if (typeof override === \"boolean\") {\n return override;\n }\n\n return checkCommandAvailable(command);\n };\n\n const runCommand: CommandRunner = async (file, args, options) => {\n const providerId = getInstallProviderId(file, args);\n appendDebugLog(\n debugLogPath,\n `runCommand ${file} ${args.join(\" \")} provider=${providerId ?? \"none\"}`\n );\n if (!providerId) {\n return runCommandAsString(file, args, options);\n }\n\n const state = readMockState(statePath);\n const behavior = state.installBehavior?.[providerId];\n appendDebugLog(\n debugLogPath,\n `behavior ${providerId} ${JSON.stringify(behavior)} state=${JSON.stringify(state)}`\n );\n if (!behavior) {\n return runCommandAsString(file, args, options);\n }\n\n if (behavior.result === \"success\") {\n writeMockState(statePath, (draft) => {\n draft.commands ??= {};\n draft.commands[providerId] = true;\n });\n\n if (binDir) {\n ensureProviderCommand(binDir, providerId);\n }\n\n appendDebugLog(debugLogPath, `install success ${providerId}`);\n\n return {\n stdout: `installed ${providerId}`,\n stderr: \"\",\n };\n }\n\n const message =\n behavior.message ??\n (behavior.result === \"permission_denied\" ? \"permission denied\" : \"command not found\");\n\n throw Object.assign(new Error(message), {\n exitCode: 1,\n stdout: \"\",\n stderr: message,\n });\n };\n\n return {\n commandExists,\n runCommand,\n };\n}\n\nfunction getInstallProviderId(file: string, args: string[]): MockProviderId | null {\n if (file !== \"npm\" || args.length !== 3) {\n return null;\n }\n\n if (args[0] !== \"install\" || args[1] !== \"-g\") {\n return null;\n }\n\n const packageName = args[2];\n if (packageName === PROVIDER_INSTALL_PACKAGES.claude) {\n return \"claude\";\n }\n if (packageName === PROVIDER_INSTALL_PACKAGES.codex) {\n return \"codex\";\n }\n\n return null;\n}\n\nfunction readMockState(statePath: string): ProviderMockState {\n if (!existsSync(statePath)) {\n return {};\n }\n\n const raw = readFileSync(statePath, \"utf8\");\n if (!raw.trim()) {\n return {};\n }\n\n try {\n return JSON.parse(raw) as ProviderMockState;\n } catch (error) {\n throw new Error(\n `Invalid provider mock state at ${statePath}: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n\nfunction writeMockState(\n statePath: string,\n updater: (state: ProviderMockState) => void\n): ProviderMockState {\n const nextState = readMockState(statePath);\n updater(nextState);\n mkdirSync(dirname(statePath), { recursive: true });\n writeFileSync(statePath, JSON.stringify(nextState, null, 2));\n return nextState;\n}\n\nfunction ensureProviderCommand(binDir: string, providerId: MockProviderId): void {\n mkdirSync(binDir, { recursive: true });\n const scriptPath = join(binDir, providerId);\n writeFileSync(scriptPath, PROVIDER_COMMAND_SCRIPTS[providerId], \"utf8\");\n chmodSync(scriptPath, 0o755);\n}\n\nfunction appendDebugLog(path: string | undefined, line: string): void {\n if (!path) {\n return;\n }\n\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, `${line}\\n`, { flag: \"a\" });\n}\n", "import { randomUUID } from \"node:crypto\";\nimport type {\n ProviderDefinition,\n ProviderInstallFailure,\n ProviderInstallJobSnapshot,\n ProviderInstallStepSnapshot,\n} from \"@coder-studio/core\";\nimport {\n type CommandAvailabilityCheck,\n type CommandCheckDeps,\n checkCommandAvailable,\n} from \"./command-check.js\";\nimport { type CommandRunner, runCommandAsString } from \"./command-runner.js\";\n\nconst EXCERPT_LIMIT = 400;\n\nexport interface InstallManagerDeps extends CommandCheckDeps {\n commandExists?: CommandAvailabilityCheck;\n runCommand?: CommandRunner;\n}\n\nexport class ProviderInstallManager {\n private readonly providers = new Map<string, ProviderDefinition>();\n private readonly jobs = new Map<string, ProviderInstallJobSnapshot>();\n private readonly activeJobIdsByProviderId = new Map<string, string>();\n private readonly inFlightStartsByProviderId = new Map<\n string,\n Promise<ProviderInstallJobSnapshot>\n >();\n private readonly deps: InstallManagerDeps;\n\n constructor(providers: ProviderDefinition[], deps: InstallManagerDeps = {}) {\n this.deps = deps;\n for (const provider of providers) {\n this.providers.set(provider.id, provider);\n }\n }\n\n async start(providerId: string): Promise<ProviderInstallJobSnapshot> {\n const activeJob = this.getActiveJob(providerId);\n if (activeJob) {\n return cloneJobSnapshot(activeJob);\n }\n\n const inFlightStart = this.inFlightStartsByProviderId.get(providerId);\n if (inFlightStart) {\n return cloneJobSnapshot(await inFlightStart);\n }\n\n const startPromise = this.prepareAndStart(providerId);\n this.inFlightStartsByProviderId.set(providerId, startPromise);\n\n try {\n return cloneJobSnapshot(await startPromise);\n } finally {\n if (this.inFlightStartsByProviderId.get(providerId) === startPromise) {\n this.inFlightStartsByProviderId.delete(providerId);\n }\n }\n }\n\n get(jobId: string): ProviderInstallJobSnapshot | undefined {\n const job = this.jobs.get(jobId);\n return job ? cloneJobSnapshot(job) : undefined;\n }\n\n private async prepareAndStart(providerId: string): Promise<ProviderInstallJobSnapshot> {\n const provider = this.providers.get(providerId);\n if (!provider) {\n throw { code: \"unknown_provider\", message: `Provider not found: ${providerId}` };\n }\n\n const job = await this.prepare(provider);\n this.jobs.set(job.jobId, job);\n\n if (job.status === \"queued\") {\n this.activeJobIdsByProviderId.set(provider.id, job.jobId);\n void this.runPreparedJob(provider, job);\n }\n\n return job;\n }\n\n private async prepare(provider: ProviderDefinition): Promise<ProviderInstallJobSnapshot> {\n const platform = this.deps.platform ?? process.platform;\n const strategies = provider.install.strategies[platform] ?? [];\n const availableCommands = new Set<string>();\n\n const missingProviderCommands = await this.collectMissing(\n provider.requiredCommands,\n availableCommands\n );\n if (missingProviderCommands.length === 0) {\n return {\n jobId: randomUUID(),\n providerId: provider.id,\n strategyIds: [],\n status: \"succeeded\",\n steps: [],\n };\n }\n\n const missingPrerequisites = await this.collectMissing(\n provider.install.prerequisites,\n availableCommands\n );\n\n const dependencyCommands = new Set<string>();\n for (const strategy of strategies) {\n for (const command of strategy.requiresCommands) {\n dependencyCommands.add(command);\n }\n }\n\n for (const command of dependencyCommands) {\n if (availableCommands.has(command)) {\n continue;\n }\n if (await this.commandExists(command)) {\n availableCommands.add(command);\n }\n }\n\n const remainingProviderCommands = new Set(missingProviderCommands);\n const remainingPrerequisites = new Set(missingPrerequisites);\n const reachableCommands = new Set(availableCommands);\n const selectedStrategyIds = new Set<string>();\n const selectedSteps: ProviderInstallStepSnapshot[] = [];\n let progressed = true;\n\n while (progressed) {\n progressed = false;\n\n for (const strategy of strategies) {\n if (selectedStrategyIds.has(strategy.id)) {\n continue;\n }\n\n const requiresMet = strategy.requiresCommands.every((command) =>\n reachableCommands.has(command)\n );\n if (!requiresMet) {\n continue;\n }\n\n if (\n strategy.kind === \"prerequisite\" &&\n remainingPrerequisites.has(strategy.targetCommand)\n ) {\n selectedStrategyIds.add(strategy.id);\n selectedSteps.push(\n this.createInstallStep(strategy.kind, strategy.targetCommand, strategy)\n );\n remainingPrerequisites.delete(strategy.targetCommand);\n reachableCommands.add(strategy.targetCommand);\n progressed = true;\n continue;\n }\n\n if (strategy.kind === \"provider\" && remainingProviderCommands.has(strategy.targetCommand)) {\n selectedStrategyIds.add(strategy.id);\n selectedSteps.push(\n this.createInstallStep(strategy.kind, strategy.targetCommand, strategy)\n );\n remainingProviderCommands.delete(strategy.targetCommand);\n reachableCommands.add(strategy.targetCommand);\n progressed = true;\n }\n }\n }\n\n const jobId = randomUUID();\n if (remainingPrerequisites.size > 0) {\n const failedStep = this.createCheckStep(\n \"prerequisite\",\n [...remainingPrerequisites][0] ?? \"\",\n \"provider.install.step.prerequisite.missing\"\n );\n return {\n jobId,\n providerId: provider.id,\n strategyIds: [...selectedStrategyIds],\n status: \"failed\",\n steps: [...selectedSteps, failedStep],\n failure: this.createFailure(\n provider,\n failedStep,\n \"missing_prerequisite\",\n `Missing prerequisite commands: ${[...remainingPrerequisites].join(\", \")}`,\n [...remainingPrerequisites]\n ),\n };\n }\n\n if (remainingProviderCommands.size > 0) {\n const failedStep = this.createCheckStep(\n \"provider\",\n [...remainingProviderCommands][0] ?? \"\",\n \"provider.install.step.provider.unsupported\"\n );\n return {\n jobId,\n providerId: provider.id,\n strategyIds: [...selectedStrategyIds],\n status: \"failed\",\n steps: [...selectedSteps, failedStep],\n failure: this.createFailure(\n provider,\n failedStep,\n \"unsupported_platform\",\n `No supported install strategy for commands: ${[...remainingProviderCommands].join(\", \")}`,\n [...remainingProviderCommands]\n ),\n };\n }\n\n selectedSteps.push({\n id: `verify-provider-${provider.id}`,\n titleKey: `provider.install.step.verify.${provider.id}`,\n kind: \"verify\",\n command: provider.requiredCommands[0] ?? provider.id,\n args: [\"--version\"],\n status: \"pending\",\n });\n return {\n jobId,\n providerId: provider.id,\n strategyIds: [...selectedStrategyIds],\n status: \"queued\",\n currentStepId: selectedSteps[0]?.id,\n steps: selectedSteps,\n };\n }\n\n private async runPreparedJob(\n provider: ProviderDefinition,\n job: ProviderInstallJobSnapshot\n ): Promise<void> {\n const runCommand = this.deps.runCommand ?? runCommandAsString;\n\n job.status = \"running\";\n this.jobs.set(job.jobId, job);\n\n for (const step of job.steps) {\n job.currentStepId = step.id;\n step.status = \"running\";\n step.startedAt = Date.now();\n this.jobs.set(job.jobId, job);\n\n try {\n if (step.kind === \"verify\") {\n const available = await this.commandExists(step.command);\n if (!available) {\n step.status = \"failed\";\n step.finishedAt = Date.now();\n job.status = \"failed\";\n job.failure = this.createFailure(\n provider,\n step,\n \"verification_failed\",\n `Verification failed for command: ${step.command}`,\n [step.command]\n );\n this.clearActiveJob(provider.id, job.jobId);\n this.jobs.set(job.jobId, job);\n return;\n }\n } else {\n const result = await runCommand(step.command, step.args, { windowsHide: true });\n step.stdoutExcerpt = excerpt(result.stdout);\n step.stderrExcerpt = excerpt(result.stderr);\n }\n\n step.status = \"succeeded\";\n step.exitCode = 0;\n step.finishedAt = Date.now();\n this.jobs.set(job.jobId, job);\n } catch (error) {\n const details = getErrorDetails(error);\n step.status = \"failed\";\n step.finishedAt = Date.now();\n step.exitCode = details.exitCode;\n step.stdoutExcerpt = excerpt(details.stdout);\n step.stderrExcerpt = excerpt(details.stderr || details.message);\n job.status = \"failed\";\n job.failure = this.normalizeFailure(provider, step, error);\n this.clearActiveJob(provider.id, job.jobId);\n this.jobs.set(job.jobId, job);\n return;\n }\n }\n\n job.status = \"succeeded\";\n job.currentStepId = undefined;\n this.clearActiveJob(provider.id, job.jobId);\n this.jobs.set(job.jobId, job);\n }\n\n private async collectMissing(\n commands: string[],\n availableCommands?: Set<string>\n ): Promise<string[]> {\n const missing: string[] = [];\n\n for (const command of commands) {\n if (await this.commandExists(command)) {\n availableCommands?.add(command);\n } else {\n missing.push(command);\n }\n }\n\n return missing;\n }\n\n private async commandExists(command: string): Promise<boolean> {\n const commandExists =\n this.deps.commandExists ??\n ((candidate: string) => checkCommandAvailable(candidate, this.deps));\n return commandExists(command);\n }\n\n private normalizeFailure(\n provider: ProviderDefinition,\n step: ProviderInstallStepSnapshot,\n error: unknown\n ): ProviderInstallFailure {\n const details = getErrorDetails(error);\n const haystack = `${details.message}\\n${details.stderr}\\n${details.stdout}`.toLowerCase();\n\n let code: ProviderInstallFailure[\"code\"] = \"command_failed\";\n if (\n haystack.includes(\"permission denied\") ||\n haystack.includes(\"eacces\") ||\n haystack.includes(\"eperm\")\n ) {\n code = \"permission_denied\";\n } else if (\n haystack.includes(\"not found\") ||\n haystack.includes(\"is not recognized\") ||\n haystack.includes(\"enoent\")\n ) {\n code = \"command_not_found\";\n }\n\n return this.createFailure(\n provider,\n {\n ...step,\n exitCode: details.exitCode,\n stdoutExcerpt: excerpt(details.stdout),\n stderrExcerpt: excerpt(details.stderr || details.message),\n },\n code,\n details.message || `Install step failed: ${step.command}`,\n []\n );\n }\n\n private createFailure(\n provider: ProviderDefinition,\n step: ProviderInstallStepSnapshot,\n code: ProviderInstallFailure[\"code\"],\n message: string,\n missingCommands: string[]\n ): ProviderInstallFailure {\n return {\n code,\n providerId: provider.id,\n failedStepId: step.id,\n message,\n command: step.command,\n args: step.args,\n exitCode: step.exitCode,\n stdoutExcerpt: step.stdoutExcerpt,\n stderrExcerpt: step.stderrExcerpt,\n missingCommands,\n manualGuideKeys: provider.install.manualGuideKeys,\n docUrls: provider.install.docUrls,\n };\n }\n\n private createInstallStep(\n kind: \"prerequisite\" | \"provider\",\n targetCommand: string,\n strategy: {\n command: string;\n args: string[];\n }\n ): ProviderInstallStepSnapshot {\n return {\n id: `install-${kind}-${targetCommand}`,\n titleKey: `provider.install.step.${kind}.${targetCommand}`,\n kind: \"install\",\n command: strategy.command,\n args: strategy.args,\n status: \"pending\",\n };\n }\n\n private createCheckStep(\n kind: \"prerequisite\" | \"provider\",\n targetCommand: string,\n titleKey: string\n ): ProviderInstallStepSnapshot {\n return {\n id: `install-${kind}-${targetCommand}`,\n titleKey,\n kind: \"check\",\n command: targetCommand,\n args: [],\n status: \"failed\",\n };\n }\n\n private clearActiveJob(providerId: string, jobId: string): void {\n if (this.activeJobIdsByProviderId.get(providerId) === jobId) {\n this.activeJobIdsByProviderId.delete(providerId);\n }\n }\n\n private getActiveJob(providerId: string): ProviderInstallJobSnapshot | undefined {\n const activeJobId = this.activeJobIdsByProviderId.get(providerId);\n if (!activeJobId) {\n return undefined;\n }\n\n const activeJob = this.jobs.get(activeJobId);\n if (activeJob && (activeJob.status === \"queued\" || activeJob.status === \"running\")) {\n return activeJob;\n }\n\n this.activeJobIdsByProviderId.delete(providerId);\n return undefined;\n }\n}\n\nfunction getErrorDetails(error: unknown): {\n message: string;\n exitCode?: number;\n stdout: string;\n stderr: string;\n} {\n if (error instanceof Error) {\n const record = error as Error & {\n code?: number | string;\n exitCode?: number;\n stdout?: string;\n stderr?: string;\n };\n return {\n message: error.message,\n exitCode:\n typeof record.exitCode === \"number\"\n ? record.exitCode\n : typeof record.code === \"number\"\n ? record.code\n : undefined,\n stdout: record.stdout ?? \"\",\n stderr: record.stderr ?? \"\",\n };\n }\n\n if (typeof error === \"string\") {\n return {\n message: error,\n stdout: \"\",\n stderr: \"\",\n };\n }\n\n return {\n message: \"Unknown install failure\",\n stdout: \"\",\n stderr: \"\",\n };\n}\n\nfunction excerpt(value: string | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n return value.slice(0, EXCERPT_LIMIT);\n}\n\nfunction cloneJobSnapshot(job: ProviderInstallJobSnapshot): ProviderInstallJobSnapshot {\n return {\n jobId: job.jobId,\n providerId: job.providerId,\n strategyIds: [...job.strategyIds],\n status: job.status,\n currentStepId: job.currentStepId,\n steps: job.steps.map(cloneStepSnapshot),\n failure: job.failure ? cloneFailure(job.failure) : undefined,\n };\n}\n\nfunction cloneStepSnapshot(step: ProviderInstallStepSnapshot): ProviderInstallStepSnapshot {\n return {\n id: step.id,\n titleKey: step.titleKey,\n kind: step.kind,\n command: step.command,\n args: [...step.args],\n status: step.status,\n startedAt: step.startedAt,\n finishedAt: step.finishedAt,\n exitCode: step.exitCode,\n stdoutExcerpt: step.stdoutExcerpt,\n stderrExcerpt: step.stderrExcerpt,\n };\n}\n\nfunction cloneFailure(failure: ProviderInstallFailure): ProviderInstallFailure {\n return {\n code: failure.code,\n providerId: failure.providerId,\n failedStepId: failure.failedStepId,\n message: failure.message,\n command: failure.command,\n args: [...failure.args],\n exitCode: failure.exitCode,\n stdoutExcerpt: failure.stdoutExcerpt,\n stderrExcerpt: failure.stderrExcerpt,\n missingCommands: [...failure.missingCommands],\n manualGuideKeys: [...failure.manualGuideKeys],\n docUrls: {\n provider: failure.docUrls.provider,\n prerequisites: { ...failure.docUrls.prerequisites },\n },\n };\n}\n", "// DomainEvent type union for EventBus (spec \u00A74.0)\n\nimport type { SessionState, Workspace } from \"./types\";\n\nexport type DomainEvent =\n | {\n type: \"session.state.changed\";\n sessionId: string;\n workspaceId?: string;\n from: SessionState;\n to: SessionState;\n session?: import(\"./types\").Session;\n }\n | {\n type: \"session.lifecycle\";\n sessionId: string;\n workspaceId?: string;\n event: \"started\" | \"turn_completed\" | \"stopped\" | \"removed\";\n }\n | { type: \"workspace.meta.changed\"; workspaceId: string; patch: Partial<Workspace> }\n | {\n type: \"git.state.changed\";\n workspaceId: string;\n treeChanged?: boolean;\n branchChanged?: boolean;\n worktreeChanged?: boolean;\n }\n | { type: \"fs.dirty\"; workspaceId: string; reason: string }\n | {\n type: \"terminal.created\";\n workspaceId: string;\n terminalId: string;\n kind: \"agent\" | \"shell\";\n title: string;\n cwd: string;\n }\n | { type: \"terminal.output\"; workspaceId: string; terminalId: string; chunk: Buffer; seq: number }\n | { type: \"terminal.exited\"; workspaceId: string; terminalId: string; exitCode: number };\n", "/**\n * MCP Server Types (Phase 4)\n *\n * Types for MCP (Model Context Protocol) server management.\n */\n\nexport interface McpServerConfig {\n /** Server name/identifier */\n name: string;\n /** Server command (e.g., 'npx', 'node', 'python') */\n command: string;\n /** Command arguments */\n args: string[];\n /** Environment variables */\n env?: Record<string, string>;\n /** Whether the server is enabled */\n enabled: boolean;\n /** Server description */\n description?: string;\n}\n\nexport interface McpServerStatus {\n /** Server name */\n name: string;\n /** Connection status */\n status: \"connected\" | \"disconnected\" | \"error\" | \"starting\";\n /** Last error message */\n error?: string;\n /** Available tools from this server */\n tools?: string[];\n /** Available resources from this server */\n resources?: string[];\n}\n\nexport interface McpConfig {\n /** MCP servers by provider */\n servers: {\n claude: McpServerConfig[];\n codex: McpServerConfig[];\n };\n}\n", "export interface ProviderInstallDocUrls {\n provider: string;\n prerequisites: Partial<Record<string, string>>;\n}\n\nexport interface ProviderRuntimeStatusEntry {\n providerId: string;\n available: boolean;\n missingCommands: string[];\n missingPrerequisites: string[];\n autoInstallSupported: boolean;\n installReadiness: \"ready\" | \"missing_prerequisite\" | \"unsupported_platform\";\n manualGuideKeys: string[];\n docUrls: ProviderInstallDocUrls;\n}\n\nexport interface ProviderRuntimeStatusResponse {\n providers: Record<string, ProviderRuntimeStatusEntry>;\n}\n\nexport interface ProviderInstallStepSnapshot {\n id: string;\n titleKey: string;\n kind: \"check\" | \"install\" | \"verify\";\n command: string;\n args: string[];\n status: \"pending\" | \"running\" | \"succeeded\" | \"failed\";\n startedAt?: number;\n finishedAt?: number;\n exitCode?: number;\n stdoutExcerpt?: string;\n stderrExcerpt?: string;\n}\n\nexport interface ProviderInstallFailure {\n code:\n | \"missing_prerequisite\"\n | \"unsupported_platform\"\n | \"permission_denied\"\n | \"command_not_found\"\n | \"command_failed\"\n | \"verification_failed\"\n | \"unknown_failure\";\n providerId: string;\n failedStepId: string;\n message: string;\n command: string;\n args: string[];\n exitCode?: number;\n stdoutExcerpt?: string;\n stderrExcerpt?: string;\n missingCommands: string[];\n manualGuideKeys: string[];\n docUrls: ProviderInstallDocUrls;\n}\n\nexport interface ProviderInstallJobSnapshot {\n jobId: string;\n providerId: string;\n strategyIds: string[];\n status: \"queued\" | \"running\" | \"succeeded\" | \"failed\";\n currentStepId?: string;\n steps: ProviderInstallStepSnapshot[];\n failure?: ProviderInstallFailure;\n}\n", "// Supervisor domain types (PRD \u00A716)\n\nexport type SupervisorState =\n | \"inactive\"\n | \"idle\"\n | \"evaluating\"\n | \"injecting\"\n | \"paused\"\n | \"error\"\n | \"stopped\";\n\nexport type CycleStatus =\n | \"queued\"\n | \"evaluating\"\n | \"completed\"\n | \"injected\"\n | \"failed\"\n | \"cancelled\";\n\nexport type CycleTrigger = \"turn_completed\" | \"manual\" | \"scheduled\";\n\nexport type SupervisorStopReason =\n | \"objective_complete\"\n | \"max_supervision_count_reached\"\n | \"supervisor_uncertain\";\n\nexport type SupervisorPlanStepStatus = \"pending\" | \"in_progress\" | \"done\";\n\nexport interface SupervisorPlanStep {\n id: string;\n title: string;\n status: SupervisorPlanStepStatus;\n}\n\nexport interface SupervisorTargetMemory {\n targetId: string;\n planGenerated: boolean;\n plan: SupervisorPlanStep[];\n activeStepId?: string;\n progressSummary?: string;\n lastGuidance?: string;\n stalledCount: number;\n updatedAt: number;\n}\n\nexport interface SupervisorCycleStepUpdate {\n id: string;\n status: SupervisorPlanStepStatus;\n}\n\nexport interface SupervisorCycleTargetRecord {\n cycleId: string;\n targetId: string;\n startedAt: number;\n completedAt: number;\n result: \"continue\" | \"stop\" | \"error\";\n stopReason?: \"objective_complete\" | \"supervisor_uncertain\";\n reason?: string;\n guidance?: string;\n progressSummary?: string;\n activeStepId?: string;\n stepUpdates?: SupervisorCycleStepUpdate[];\n injected?: boolean;\n attemptCount?: number;\n errorReason?: string;\n}\n\nexport type SupervisorCycleAttemptStatus = \"evaluating\" | \"completed\" | \"failed\" | \"cancelled\";\n\nexport type EvidenceSource = \"headless_snapshot\" | \"transcript\" | \"terminal_fallback\";\n\nexport interface SupervisorCycle {\n id: string;\n supervisorId: string;\n sessionId: string;\n status: CycleStatus;\n trigger: CycleTrigger;\n evidenceSource: EvidenceSource;\n objective: string;\n evaluatorProviderId: string;\n turnId?: string;\n progress?: number;\n result?: string;\n injectedGuidance?: string;\n createdAt: number;\n completedAt?: number;\n errorReason?: string;\n}\n\nexport interface SupervisorCycleAttempt {\n id: string;\n cycleId: string;\n attemptIndex: number;\n status: SupervisorCycleAttemptStatus;\n startedAt: number;\n completedAt?: number;\n errorReason?: string;\n providerModel?: string;\n}\n\nexport interface SupervisorCycleAttemptPatch {\n status?: SupervisorCycleAttemptStatus;\n completedAt?: number | null;\n errorReason?: string | null;\n providerModel?: string | null;\n}\n\nexport interface Supervisor {\n id: string;\n sessionId: string;\n workspaceId: string;\n targetId: string;\n state: SupervisorState;\n objective: string;\n evaluatorProviderId: string;\n evaluatorModel?: string;\n maxSupervisionCount: number;\n completedSupervisionCount: number;\n scheduledAt?: number;\n stopReason?: SupervisorStopReason;\n currentTargetMemory?: SupervisorTargetMemory;\n recentTargetCycles?: SupervisorCycleTargetRecord[];\n cycles: SupervisorCycle[];\n lastCycleAt?: number;\n lastEvaluatedTurnId?: string;\n errorReason?: string;\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface SupervisorConfig {\n maxCyclesPerSession: number;\n terminalLinesForEvaluation: number;\n guidanceMaxChars: number;\n guidanceDedupeWindow: number;\n}\n\nexport const DEFAULT_SUPERVISOR_EVALUATION_TIMEOUT_SEC = 600;\nexport const MAX_SUPERVISOR_EVALUATION_TIMEOUT_SEC = 86_400;\nexport const DEFAULT_SUPERVISOR_RETRY_ENABLED = false;\nexport const DEFAULT_SUPERVISOR_RETRY_MAX_COUNT = 0;\nexport const MAX_SUPERVISOR_RETRY_MAX_COUNT = 20;\nexport const DEFAULT_SUPERVISOR_RETRY_DELAY_SEC = 10;\nexport const MAX_SUPERVISOR_RETRY_DELAY_SEC = 3_600;\nexport const DEFAULT_SUPERVISOR_RETRY_ON_TIMEOUT = true;\nexport const DEFAULT_SUPERVISOR_RETRY_ON_EVALUATOR_ERROR = false;\n\nexport function resolveSupervisorEvaluationTimeoutSec(value: unknown): number {\n if (typeof value !== \"number\" || !Number.isFinite(value) || !Number.isSafeInteger(value)) {\n return DEFAULT_SUPERVISOR_EVALUATION_TIMEOUT_SEC;\n }\n\n if (value < 1 || value > MAX_SUPERVISOR_EVALUATION_TIMEOUT_SEC) {\n return DEFAULT_SUPERVISOR_EVALUATION_TIMEOUT_SEC;\n }\n\n return value;\n}\n\nexport function resolveSupervisorRetryEnabled(value: unknown): boolean {\n return typeof value === \"boolean\" ? value : DEFAULT_SUPERVISOR_RETRY_ENABLED;\n}\n\nexport function resolveSupervisorRetryMaxCount(value: unknown): number {\n if (typeof value !== \"number\" || !Number.isFinite(value) || !Number.isSafeInteger(value)) {\n return DEFAULT_SUPERVISOR_RETRY_MAX_COUNT;\n }\n\n if (value < 0 || value > MAX_SUPERVISOR_RETRY_MAX_COUNT) {\n return DEFAULT_SUPERVISOR_RETRY_MAX_COUNT;\n }\n\n return value;\n}\n\nexport function resolveSupervisorRetryDelaySec(value: unknown): number {\n if (typeof value !== \"number\" || !Number.isFinite(value) || !Number.isSafeInteger(value)) {\n return DEFAULT_SUPERVISOR_RETRY_DELAY_SEC;\n }\n\n if (value < 1 || value > MAX_SUPERVISOR_RETRY_DELAY_SEC) {\n return DEFAULT_SUPERVISOR_RETRY_DELAY_SEC;\n }\n\n return value;\n}\n\nexport function resolveSupervisorRetryOnTimeout(value: unknown): boolean {\n return typeof value === \"boolean\" ? value : DEFAULT_SUPERVISOR_RETRY_ON_TIMEOUT;\n}\n\nexport function resolveSupervisorRetryOnEvaluatorError(value: unknown): boolean {\n return typeof value === \"boolean\" ? value : DEFAULT_SUPERVISOR_RETRY_ON_EVALUATOR_ERROR;\n}\n\nexport const DEFAULT_SUPERVISOR_CONFIG: SupervisorConfig = {\n maxCyclesPerSession: 100,\n terminalLinesForEvaluation: 500,\n guidanceMaxChars: 2000,\n guidanceDedupeWindow: 2,\n};\n", "// Core domain types (spec \u00A712.1)\n\nexport type {\n ProviderInstallDocUrls,\n ProviderInstallFailure,\n ProviderInstallJobSnapshot,\n ProviderInstallStepSnapshot,\n ProviderRuntimeStatusEntry,\n ProviderRuntimeStatusResponse,\n} from \"./provider-install\";\n\nexport interface Workspace {\n name?: string;\n isActive?: boolean;\n unreadCount?: number;\n id: string;\n path: string;\n targetRuntime: \"native\" | \"wsl\";\n wslDistro?: string;\n openedAt: number;\n lastActiveAt: number;\n uiState: UiState;\n}\n\nexport interface WorkspacePaneNode {\n id: string;\n type: \"leaf\" | \"split\";\n sessionId?: string;\n direction?: \"horizontal\" | \"vertical\";\n children?: WorkspacePaneNode[];\n}\n\nexport interface UiState {\n leftPanelWidth: number;\n bottomPanelHeight: number;\n focusMode: boolean;\n activeSessionId?: string;\n paneLayout?: WorkspacePaneNode;\n fileTreeExpandedDirs?: string[];\n}\n\nexport interface WorkspaceLastViewedTarget {\n workspaceId: string;\n sessionId?: string;\n updatedAt: number;\n}\n\nexport interface Terminal {\n id: string;\n workspaceId: string;\n kind: \"agent\" | \"shell\";\n title: string;\n cwd: string;\n argv: string[];\n env?: Record<string, string>;\n cols: number;\n rows: number;\n alive: boolean;\n createdAt: number;\n endedAt?: number;\n exitCode?: number;\n}\n\nexport interface Session {\n id: string;\n workspaceId: string;\n terminalId: string;\n providerId: string;\n state: SessionState;\n capability: \"full\" | \"limited\" | \"unsupported\";\n startedAt: number;\n lastActiveAt: number;\n endedAt?: number;\n completionPercent?: number;\n errorReason?: string;\n /**\n * Human-friendly title derived from the user's first submitted instruction\n * (trimmed/truncated to SESSION_TITLE_MAX_LENGTH). Assigned once on first\n * submit and never overwritten afterwards. Undefined until the user sends\n * their first message.\n */\n title?: string;\n}\n\n/**\n * Maximum character length for {@link Session.title}. The first submitted\n * instruction is trimmed and truncated to this length (with an ellipsis when\n * clipped) before being persisted.\n */\nexport const SESSION_TITLE_MAX_LENGTH = 10;\n\nexport type SessionState = \"draft\" | \"starting\" | \"running\" | \"idle\" | \"ended\";\n\nexport interface GitStatus {\n branch: string;\n ahead: number;\n behind: number;\n headSha?: string;\n headShortSha?: string;\n headSubject?: string;\n /**\n * Files with a non-blank index status. Includes staged deletions (index\n * status 'D'); consumers showing a staged-files badge should count this\n * array directly rather than diffing against `deleted`.\n */\n staged: GitFileChange[];\n modified: GitFileChange[];\n untracked: GitFileChange[];\n /** Worktree-only deletions (index unchanged, file removed in working tree). */\n deleted: GitFileChange[];\n}\n\nexport type GitChangeStatus = \"added\" | \"modified\" | \"deleted\" | \"renamed\" | \"untracked\";\n\nexport interface GitFileChange {\n path: string;\n oldPath?: string; // for renames\n status?: GitChangeStatus;\n}\n\nexport interface GitCommitSummary {\n sha: string;\n shortSha: string;\n subject: string;\n authorName: string;\n authoredAt: number;\n}\n\nexport interface GitBranch {\n name: string; // Branch name (e.g., \"main\", \"origin/feature\")\n isRemote: boolean; // Whether it's a remote branch\n isCurrent: boolean; // Whether it's the current branch\n remote?: string; // Remote name (e.g., \"origin\")\n linkedWorktreePath?: string; // Path of another worktree using this branch, if any\n}\n\nexport interface WorktreeInfo {\n name: string;\n path: string;\n branch: string;\n commit: string;\n status: \"clean\" | \"dirty\";\n}\n\nexport interface FileNode {\n name: string;\n path: string;\n kind: \"file\" | \"dir\";\n children?: FileNode[];\n size?: number;\n mtime?: number;\n}\n\nexport interface Settings {\n defaultProviderId: string;\n notifications: {\n enabled: boolean;\n soundEnabled: boolean;\n };\n supervisor: {\n evaluationTimeoutSec: number;\n };\n appearance: {\n themeId: string;\n terminalRenderer: \"standard\" | \"compatibility\";\n locale: \"zh\" | \"en\";\n };\n providerConfigs: Record<string, ProviderConfig>;\n}\n\nexport interface ProviderConfig {\n [key: string]: unknown;\n}\n\n/**\n * Derive a compact session title from a raw input buffer (the bytes a user\n * just submitted to the agent terminal). Returns undefined when the buffer\n * contains nothing meaningful after trimming.\n *\n * Rules:\n * - Collapse all whitespace (including newlines) into single spaces.\n * - Trim leading/trailing whitespace.\n * - Truncate to SESSION_TITLE_MAX_LENGTH; if clipped, the final character is\n * replaced with an ellipsis (\"\u2026\") so the total length is still at most\n * SESSION_TITLE_MAX_LENGTH.\n */\nexport function deriveSessionTitle(raw: string): string | undefined {\n const normalized = raw.replace(/\\s+/g, \" \").trim();\n if (!normalized) return undefined;\n\n if (normalized.length <= SESSION_TITLE_MAX_LENGTH) {\n return normalized;\n }\n\n // Reserve the last slot for the ellipsis so we stay within the budget.\n return normalized.slice(0, SESSION_TITLE_MAX_LENGTH - 1) + \"\u2026\";\n}\n", "import { z } from \"zod\";\n\nexport const TERMINAL_BINARY_PROTOCOL_VERSION = 1;\nexport const TERMINAL_BINARY_HEADER_SIZE = 16;\n\nexport const TerminalBinaryFrameType = {\n Output: 1,\n Replay: 2,\n Input: 3,\n Snapshot: 4,\n} as const;\n\nexport type TerminalBinaryFrameType =\n (typeof TerminalBinaryFrameType)[keyof typeof TerminalBinaryFrameType];\n\nexport interface TerminalBinaryFrameHeader {\n version: number;\n type: TerminalBinaryFrameType;\n flags: number;\n meta: number;\n streamId: number;\n payloadSize: number;\n}\n\nexport interface TerminalBinaryEventData {\n transport: \"binary\";\n streamId: number;\n size: number;\n}\n\nexport interface TerminalReplayBinaryResult {\n status: \"ok\";\n transport: \"binary\";\n streamId: number;\n size: number;\n seq: number;\n}\n\nexport interface TerminalSnapshotBinaryResult {\n status: \"ok\";\n transport: \"binary\";\n streamId: number;\n size: number;\n seq: number;\n rows: number;\n cols: number;\n source: \"headless\";\n}\n\nexport const TERMINAL_INPUT_ACTIVITIES = [\n \"typing\",\n \"submit\",\n \"internal_submit\",\n \"system\",\n \"control\",\n] as const;\n\nexport type TerminalInputActivity = (typeof TERMINAL_INPUT_ACTIVITIES)[number];\n\nexport interface TerminalInputBinaryArgs {\n terminalId: string;\n activity?: TerminalInputActivity;\n submittedText?: string;\n transport: \"binary\";\n streamId: number;\n size: number;\n}\n\nexport interface TerminalInputBase64Args {\n terminalId: string;\n bytes: string;\n activity?: TerminalInputActivity;\n submittedText?: string;\n}\n\nexport const encodeTerminalBinaryFrame = (\n header: TerminalBinaryFrameHeader,\n payload: Uint8Array\n): Uint8Array => {\n if (payload.byteLength !== header.payloadSize) {\n throw new Error(\"Terminal binary payload size does not match header\");\n }\n\n const frame = new Uint8Array(TERMINAL_BINARY_HEADER_SIZE + payload.byteLength);\n const view = new DataView(frame.buffer);\n view.setUint8(0, header.version);\n view.setUint8(1, header.type);\n view.setUint16(2, header.flags);\n view.setUint32(4, header.meta);\n view.setUint32(8, header.streamId);\n view.setUint32(12, header.payloadSize);\n frame.set(payload, TERMINAL_BINARY_HEADER_SIZE);\n return frame;\n};\n\nexport const decodeTerminalBinaryFrame = (\n frame: ArrayBuffer | Uint8Array\n): {\n header: TerminalBinaryFrameHeader;\n payload: Uint8Array;\n} => {\n const bytes = frame instanceof Uint8Array ? frame : new Uint8Array(frame);\n if (bytes.byteLength < TERMINAL_BINARY_HEADER_SIZE) {\n throw new Error(\"Terminal binary frame is too short\");\n }\n\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const header: TerminalBinaryFrameHeader = {\n version: view.getUint8(0),\n type: view.getUint8(1) as TerminalBinaryFrameType,\n flags: view.getUint16(2),\n meta: view.getUint32(4),\n streamId: view.getUint32(8),\n payloadSize: view.getUint32(12),\n };\n\n const payload = bytes.subarray(TERMINAL_BINARY_HEADER_SIZE);\n if (payload.byteLength !== header.payloadSize) {\n throw new Error(\"Terminal binary frame payload length mismatch\");\n }\n\n return { header, payload };\n};\n\nexport const TERMINAL_BINARY_OUTPUT_VERSION = 2;\n\nexport interface TerminalOutputFrameHeader {\n topic: string;\n seq: number;\n streamId: number;\n payloadSize: number;\n}\n\nexport interface DecodedTerminalOutputFrame {\n topic: string;\n seq: number;\n streamId: number;\n payload: Uint8Array;\n}\n\nexport const encodeTerminalOutputFrame = (\n header: TerminalOutputFrameHeader,\n payload: Uint8Array\n): Uint8Array => {\n if (payload.byteLength !== header.payloadSize) {\n throw new Error(\"Terminal output payload size does not match header\");\n }\n\n const topicBytes = new TextEncoder().encode(header.topic);\n const frame = new Uint8Array(\n TERMINAL_BINARY_HEADER_SIZE + topicBytes.length + payload.byteLength\n );\n const view = new DataView(frame.buffer);\n view.setUint8(0, TERMINAL_BINARY_OUTPUT_VERSION);\n view.setUint8(1, TerminalBinaryFrameType.Output);\n view.setUint16(2, topicBytes.length, false);\n view.setUint32(4, header.seq, false);\n view.setUint32(8, header.streamId, false);\n view.setUint32(12, payload.byteLength, false);\n frame.set(topicBytes, TERMINAL_BINARY_HEADER_SIZE);\n frame.set(payload, TERMINAL_BINARY_HEADER_SIZE + topicBytes.length);\n return frame;\n};\n\nexport const decodeTerminalOutputFrame = (\n frame: ArrayBuffer | Uint8Array\n): DecodedTerminalOutputFrame => {\n const bytes = frame instanceof Uint8Array ? frame : new Uint8Array(frame);\n if (bytes.byteLength < TERMINAL_BINARY_HEADER_SIZE) {\n throw new Error(\"Terminal output frame is too short\");\n }\n\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const version = view.getUint8(0);\n if (version !== TERMINAL_BINARY_OUTPUT_VERSION) {\n throw new Error(\n `Expected output frame version ${TERMINAL_BINARY_OUTPUT_VERSION}, got ${version}`\n );\n }\n\n const topicLength = view.getUint16(2, false);\n const seq = view.getUint32(4, false);\n const streamId = view.getUint32(8, false);\n const payloadSize = view.getUint32(12, false);\n if (bytes.byteLength < TERMINAL_BINARY_HEADER_SIZE + topicLength) {\n throw new Error(\"Terminal output frame topic is truncated\");\n }\n\n const topic = new TextDecoder().decode(\n bytes.subarray(TERMINAL_BINARY_HEADER_SIZE, TERMINAL_BINARY_HEADER_SIZE + topicLength)\n );\n const payload = bytes.subarray(TERMINAL_BINARY_HEADER_SIZE + topicLength);\n if (payload.byteLength !== payloadSize) {\n throw new Error(\"Terminal output frame payload length mismatch\");\n }\n\n return { topic, seq, streamId, payload };\n};\n\n// Command: client \u2192 server, expects Result\nexport const CommandMessage = z.object({\n kind: z.literal(\"command\"),\n id: z.string().uuid(),\n op: z.string(),\n args: z.unknown(),\n});\n\n// Result: server \u2192 client, response to Command\nexport const ResultMessage = z.object({\n kind: z.literal(\"result\"),\n id: z.string().uuid(),\n ok: z.boolean(),\n data: z.unknown().optional(),\n error: z\n .object({\n code: z.string(),\n message: z.string(),\n details: z.unknown().optional(),\n })\n .optional(),\n});\n\n// Event: server \u2192 client, unsolicited state change\nexport const EventMessage = z.object({\n kind: z.literal(\"event\"),\n topic: z.string(),\n seq: z.number().int().nonnegative(),\n timestamp: z.number().int().positive(),\n data: z.unknown(),\n});\n\n// Subscribe: client \u2192 server, declare interest in topics\nexport const SubscribeMessage = z.object({\n kind: z.literal(\"subscribe\"),\n topics: z.array(z.string()),\n});\n\n// Unsubscribe: client \u2192 server, cancel interest\nexport const UnsubscribeMessage = z.object({\n kind: z.literal(\"unsubscribe\"),\n topics: z.array(z.string()),\n});\n\n// Resync: client \u2192 server, request missed events after reconnect\nexport const ResyncMessage = z.object({\n kind: z.literal(\"resync\"),\n lastSeen: z.record(z.string(), z.number()),\n});\n\n// Client \u2192 Server messages\nexport const ClientMessage = z.discriminatedUnion(\"kind\", [\n CommandMessage,\n SubscribeMessage,\n UnsubscribeMessage,\n ResyncMessage,\n]);\n\n// Server \u2192 Client messages\nexport const ServerMessage = z.discriminatedUnion(\"kind\", [ResultMessage, EventMessage]);\n\n// Type exports\nexport type Command = z.infer<typeof CommandMessage>;\nexport type Result = z.infer<typeof ResultMessage>;\nexport type Event = z.infer<typeof EventMessage>;\nexport type Subscribe = z.infer<typeof SubscribeMessage>;\nexport type Unsubscribe = z.infer<typeof UnsubscribeMessage>;\nexport type Resync = z.infer<typeof ResyncMessage>;\nexport type ClientToServer = z.infer<typeof ClientMessage>;\nexport type ServerToClient = z.infer<typeof ServerMessage>;\n", "// Topic naming follows spec \u00A73.3: hierarchical, supports glob subscription\n\nexport const Topics = {\n // Connection-level\n connectionStatus: \"connection.status\",\n connectionReady: \"connection.ready\",\n\n // Workspace-level\n workspaceMeta: (id: string) => `workspace.${id}.meta`,\n workspaceFsDirty: (id: string) => `workspace.${id}.fs.dirty`,\n workspaceGitState: (id: string) => `workspace.${id}.git.state`,\n workspaceAll: (id: string) => `workspace.${id}.*`,\n\n // Session-level\n sessionState: (workspaceId: string, sessionId: string) =>\n `workspace.${workspaceId}.session.${sessionId}.state`,\n sessionLifecycle: (workspaceId: string, sessionId: string) =>\n `workspace.${workspaceId}.session.${sessionId}.lifecycle`,\n sessionProgress: (workspaceId: string, sessionId: string) =>\n `workspace.${workspaceId}.session.${sessionId}.progress`,\n sessionsAll: (workspaceId: string) => `workspace.${workspaceId}.session.*`,\n\n // Terminal-level\n terminalCreated: (workspaceId: string, terminalId: string) =>\n `workspace.${workspaceId}.terminal.${terminalId}.created`,\n terminalOutput: (workspaceId: string, terminalId: string) =>\n `workspace.${workspaceId}.terminal.${terminalId}.output`,\n terminalExit: (workspaceId: string, terminalId: string) =>\n `workspace.${workspaceId}.terminal.${terminalId}.exit`,\n terminalsAll: (workspaceId: string) => `workspace.${workspaceId}.terminal.*`,\n\n // Notification\n notificationToast: \"notification.toast\",\n\n // Supervisor-level (Phase 3)\n supervisorState: (workspaceId: string, sessionId: string) =>\n `workspace.${workspaceId}.session.${sessionId}.supervisor.state`,\n supervisorCycle: (workspaceId: string, sessionId: string) =>\n `workspace.${workspaceId}.session.${sessionId}.supervisor.cycle`,\n} as const;\n", "import type { ZodSchema } from \"zod\";\nimport type { ProviderConfig, ProviderInstallDocUrls } from \"../domain/types\";\nimport type { IdleHeuristics } from \"./idle-heuristics\";\n\nexport interface ProviderInstallStrategy {\n id: string;\n kind: \"prerequisite\" | \"provider\";\n targetCommand: string;\n requiresCommands: string[];\n command: string;\n args: string[];\n}\n\nexport interface ProviderInstallMetadata {\n prerequisites: string[];\n manualGuideKeys: string[];\n docUrls: ProviderInstallDocUrls;\n strategies: Partial<Record<NodeJS.Platform, ProviderInstallStrategy[]>>;\n}\n\nexport interface SupervisorEvalCommandRequest {\n prompt: string;\n sessionId: string;\n workspacePath: string;\n apiKey?: string;\n model?: string;\n outputFile?: string;\n}\n\nexport interface ProviderDefinition {\n // Metadata\n id: string;\n displayName: string;\n badge: string;\n /**\n * Declarative label for UI badges and docs only.\n * Runtime behavior must read hooks/events directly.\n */\n capability: \"full\" | \"limited\" | \"unsupported\";\n install: ProviderInstallMetadata;\n\n // Command construction\n buildCommand(\n config: ProviderConfig,\n ctx: LaunchContext\n ): {\n argv: string[];\n env: Record<string, string>;\n cwd: string;\n };\n\n buildSupervisorEvalCommand?(\n config: ProviderConfig,\n req: SupervisorEvalCommandRequest\n ): {\n argv: string[];\n outputFile?: string;\n cwd?: string;\n env?: Record<string, string>;\n } | null;\n\n // Configuration\n configSchema: ZodSchema<ProviderConfig>;\n defaultConfig: ProviderConfig;\n\n // Runtime requirements\n requiredCommands: string[];\n\n /** PTY-output-based idle detection used by the session manager. */\n idleHeuristics?: IdleHeuristics;\n}\n\nexport interface LaunchContext {\n sessionId: string;\n workspacePath: string;\n}\n", "export interface IdleHeuristics {\n /** Regex patterns indicating the CLI is idle at a prompt. */\n idlePromptPatterns: RegExp[];\n /** Wait this many ms after the last output before declaring idle. */\n idleDebounceMs: number;\n /** Optional regexes that can extract a session identifier from stdout. */\n sessionIdPatterns?: RegExp[];\n}\n", "// Protocol\n\nexport * from \"./domain/events\";\nexport * from \"./domain/mcp\";\nexport * from \"./domain/provider-install\";\nexport * from \"./domain/supervisor\";\n// Domain\nexport * from \"./domain/types\";\nexport * from \"./protocol/messages\";\nexport * from \"./protocol/topics\";\n\n// Provider\nexport * from \"./provider/definition\";\nexport * from \"./provider/idle-heuristics\";\n", "import type { ProviderConfig, ProviderDefinition } from \"@coder-studio/core\";\nimport { z } from \"zod\";\n\nexport const SUPPORTED_PROVIDER_IDS = [\"claude\", \"codex\"] as const;\n\nconst supportedProviderIds = new Set<string>(SUPPORTED_PROVIDER_IDS);\n\nexport const ProviderLaunchConfigInputSchema = z\n .object({\n additionalArgs: z.array(z.string()).optional(),\n envVars: z.record(z.string(), z.string()).optional(),\n })\n .strict();\n\nexport const ProviderSettingsSchema = z\n .object({\n claude: ProviderLaunchConfigInputSchema.optional(),\n codex: ProviderLaunchConfigInputSchema.optional(),\n })\n .strict();\n\nconst ProviderLaunchConfigSchema = z.object({\n additionalArgs: z.array(z.string()).default([]),\n envVars: z.record(z.string(), z.string()).optional(),\n});\n\nexport function isSupportedProviderId(\n providerId: string\n): providerId is (typeof SUPPORTED_PROVIDER_IDS)[number] {\n return supportedProviderIds.has(providerId);\n}\n\nexport function sanitizeProviderLaunchConfig(config: unknown): {\n additionalArgs: string[];\n envVars?: Record<string, string>;\n} {\n const parsed = ProviderLaunchConfigSchema.safeParse(config);\n return parsed.success ? parsed.data : { additionalArgs: [] };\n}\n\nexport function mergeProviderLaunchConfig(\n provider: ProviderDefinition,\n config: unknown\n): ProviderConfig {\n return {\n ...(provider.defaultConfig as Record<string, unknown>),\n ...sanitizeProviderLaunchConfig(config),\n };\n}\n", "import type { Session, SessionState } from \"@coder-studio/core\";\nimport type { Database } from \"../database.js\";\n\n/**\n * Database row representation for Session table\n */\nexport interface SessionRow {\n id: string;\n workspace_id: string;\n terminal_id: string;\n provider_id: string;\n capability: \"full\" | \"limited\" | \"unsupported\";\n state: SessionState;\n started_at: number | null;\n ended_at: number | null;\n last_active_at: number;\n completion_percent: number | null;\n error_reason: string | null;\n archived: number; // SQLite uses 0/1 for boolean\n title: string | null;\n draft?: string | null;\n}\n\nexport function rowToSession(row: SessionRow): Session {\n return {\n id: row.id,\n workspaceId: row.workspace_id,\n terminalId: row.terminal_id,\n providerId: row.provider_id,\n state: row.state,\n capability: row.capability,\n startedAt: row.started_at ?? row.last_active_at,\n lastActiveAt: row.last_active_at,\n endedAt: row.ended_at ?? undefined,\n completionPercent: row.completion_percent ?? undefined,\n errorReason: row.error_reason ?? undefined,\n title: row.title ?? undefined,\n ...(row.draft != null ? { draft: row.draft } : {}),\n };\n}\n\nexport function sessionToRow(session: Session & { draft?: string }): SessionRow {\n return {\n id: session.id,\n workspace_id: session.workspaceId,\n terminal_id: session.terminalId,\n provider_id: session.providerId,\n state: session.state,\n capability: session.capability,\n started_at: session.startedAt ?? session.lastActiveAt,\n last_active_at: session.lastActiveAt,\n ended_at: session.endedAt ?? null,\n completion_percent: session.completionPercent ?? null,\n error_reason: session.errorReason ?? null,\n archived: 0,\n draft: session.draft ?? null,\n title: session.title ?? null,\n };\n}\n\n/**\n * Input type for creating a new session\n */\nexport interface NewSession {\n id: string;\n workspaceId: string;\n terminalId: string;\n providerId: string;\n state: SessionState;\n capability: \"full\" | \"limited\" | \"unsupported\";\n startedAt: number;\n lastActiveAt: number;\n completionPercent?: number;\n errorReason?: string;\n}\n\n/**\n * Session repository for CRUD operations\n */\nexport class SessionRepo {\n constructor(private db: Database) {}\n\n /**\n * Lists all sessions for a workspace\n */\n listByWorkspace(workspaceId: string): Session[] {\n const rows = this.db\n .prepare(\"SELECT * FROM sessions WHERE workspace_id = ? ORDER BY started_at DESC\")\n .all(workspaceId) as unknown as SessionRow[];\n return rows.map(rowToSession);\n }\n\n /**\n * Finds a session by ID\n */\n findById(id: string): Session | undefined {\n const row = this.db.prepare(\"SELECT * FROM sessions WHERE id = ?\").get(id) as\n | SessionRow\n | undefined;\n return row ? rowToSession(row) : undefined;\n }\n\n /**\n * Finds a session by terminal ID (1:1 relationship)\n */\n findByTerminalId(terminalId: string): Session | undefined {\n const row = this.db.prepare(\"SELECT * FROM sessions WHERE terminal_id = ?\").get(terminalId) as\n | SessionRow\n | undefined;\n return row ? rowToSession(row) : undefined;\n }\n\n /**\n * Lists all active (non-ended) sessions for a workspace\n */\n listActiveByWorkspace(workspaceId: string): Session[] {\n const rows = this.db\n .prepare(\n \"SELECT * FROM sessions WHERE workspace_id = ? AND ended_at IS NULL ORDER BY started_at DESC\"\n )\n .all(workspaceId) as unknown as SessionRow[];\n return rows.map(rowToSession);\n }\n\n /**\n * Creates a new session\n */\n create(session: NewSession): Session {\n const stmt = this.db.prepare(`\n INSERT INTO sessions (id, workspace_id, terminal_id, provider_id, capability, state, started_at, last_active_at, completion_percent, error_reason)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n stmt.run(\n session.id,\n session.workspaceId,\n session.terminalId,\n session.providerId,\n session.capability,\n session.state,\n session.startedAt,\n session.lastActiveAt,\n session.completionPercent ?? null,\n session.errorReason ?? null\n );\n\n return this.findById(session.id)!;\n }\n\n /**\n * Updates session state\n */\n updateState(id: string, state: SessionState): void {\n const stmt = this.db.prepare(\"UPDATE sessions SET state = ? WHERE id = ?\");\n stmt.run(state, id);\n }\n\n /**\n * Updates last active timestamp\n */\n updateLastActive(id: string, lastActiveAt: number): void {\n const stmt = this.db.prepare(\"UPDATE sessions SET last_active_at = ? WHERE id = ?\");\n stmt.run(lastActiveAt, id);\n }\n\n /**\n * Marks a session as ended\n */\n markEnded(id: string, endedAt: number): void {\n const stmt = this.db.prepare(\"UPDATE sessions SET ended_at = ?, state = ? WHERE id = ?\");\n stmt.run(endedAt, \"ended\", id);\n }\n\n /**\n * Updates completion percent (for full capability sessions)\n */\n updateCompletionPercent(id: string, completionPercent: number): void {\n const stmt = this.db.prepare(\"UPDATE sessions SET completion_percent = ? WHERE id = ?\");\n stmt.run(completionPercent, id);\n }\n\n /**\n * Sets error reason\n */\n setError(id: string, errorReason: string): void {\n const stmt = this.db.prepare(\"UPDATE sessions SET error_reason = ? WHERE id = ?\");\n stmt.run(errorReason, id);\n }\n\n /**\n * Archives a session\n */\n archive(id: string): void {\n const stmt = this.db.prepare(\"UPDATE sessions SET archived = 1 WHERE id = ?\");\n stmt.run(id);\n }\n\n /**\n * Deletes a session by ID\n */\n delete(id: string): void {\n const stmt = this.db.prepare(\"DELETE FROM sessions WHERE id = ?\");\n stmt.run(id);\n }\n}\n", "import type { IdleHeuristics } from \"@coder-studio/core\";\n\nexport type PtyDerivedState = \"running\" | \"idle\";\n\nexport interface PtyStateDetectorOptions {\n heuristics: IdleHeuristics;\n onStateChange: (state: PtyDerivedState) => void;\n}\n\nconst RECENT_BUFFER_LIMIT = 4096;\n\nexport class PtyStateDetector {\n private currentState: PtyDerivedState | null = null;\n private idleTimer: NodeJS.Timeout | null = null;\n private recentBuffer = \"\";\n\n constructor(private readonly options: PtyStateDetectorOptions) {}\n\n feed(chunk: Buffer): void {\n this.transitionTo(\"running\");\n this.recentBuffer = `${this.recentBuffer}${chunk.toString(\"utf8\")}`.slice(-RECENT_BUFFER_LIMIT);\n\n if (this.matchesIdlePrompt()) {\n this.clearIdleTimer();\n this.transitionTo(\"idle\");\n return;\n }\n\n this.scheduleIdleDebounce();\n }\n\n dispose(): void {\n this.clearIdleTimer();\n }\n\n private transitionTo(state: PtyDerivedState): void {\n if (this.currentState === state) {\n return;\n }\n\n this.currentState = state;\n this.options.onStateChange(state);\n }\n\n private matchesIdlePrompt(): boolean {\n return this.options.heuristics.idlePromptPatterns.some((pattern) =>\n pattern.test(this.recentBuffer)\n );\n }\n\n private scheduleIdleDebounce(): void {\n this.clearIdleTimer();\n this.idleTimer = setTimeout(() => {\n this.transitionTo(\"idle\");\n }, this.options.heuristics.idleDebounceMs);\n }\n\n private clearIdleTimer(): void {\n if (this.idleTimer === null) {\n return;\n }\n\n clearTimeout(this.idleTimer);\n this.idleTimer = null;\n }\n}\n", "import type { SessionState } from \"@coder-studio/core\";\n\nimport type { PtyDerivedState } from \"./pty-state-detector.js\";\n\nexport interface ShadowComparatorSnapshot {\n hookState: SessionState | null;\n ptyState: PtyDerivedState | null;\n lastDivergedAt: number | null;\n}\n\nexport interface ShadowComparator {\n observeHookState(state: SessionState): void;\n observePtyState(state: PtyDerivedState): void;\n snapshot(): ShadowComparatorSnapshot;\n}\n\nfunction areStatesAligned(\n hookState: SessionState | null,\n ptyState: PtyDerivedState | null\n): boolean {\n if (!hookState || !ptyState) {\n return true;\n }\n\n return (\n (hookState === \"running\" && ptyState === \"running\") ||\n (hookState === \"idle\" && ptyState === \"idle\")\n );\n}\n\nexport function createShadowComparator(\n log: (info: Record<string, unknown>) => void\n): ShadowComparator {\n let hookState: SessionState | null = null;\n let ptyState: PtyDerivedState | null = null;\n let lastDivergedAt: number | null = null;\n\n const compare = () => {\n if (areStatesAligned(hookState, ptyState)) {\n return;\n }\n\n lastDivergedAt = Date.now();\n log({\n metric: \"session.state.shadow.diverge\",\n hookState,\n ptyState,\n at: lastDivergedAt,\n });\n };\n\n return {\n observeHookState(state) {\n hookState = state;\n compare();\n },\n observePtyState(state) {\n ptyState = state;\n compare();\n },\n snapshot() {\n return {\n hookState,\n ptyState,\n lastDivergedAt,\n };\n },\n };\n}\n", "/**\n * Session Manager (spec \u00A74.6)\n *\n * Session is a business wrapper around an agent-kind Terminal.\n * It manages Agent domain semantics and the PTY-driven state machine.\n */\n\nimport type {\n DomainEvent,\n ProviderDefinition,\n Session,\n SessionState,\n TerminalInputActivity,\n} from \"@coder-studio/core\";\nimport { deriveSessionTitle } from \"@coder-studio/core\";\nimport type { EventBus, Unsubscribe } from \"../bus/event-bus.js\";\nimport { mergeProviderLaunchConfig } from \"../provider-config.js\";\nimport type { ProviderConfigRepo } from \"../storage/repositories/provider-config-repo.js\";\nimport { type SessionRow, sessionToRow } from \"../storage/repositories/session-repo.js\";\nimport type { TerminalManager } from \"../terminal/manager.js\";\nimport type { RenderOptions } from \"../terminal/snapshot-render.js\";\nimport type { TerminalSpec } from \"../terminal/types.js\";\nimport type { Broadcaster } from \"../ws/hub.js\";\nimport { PtyStateDetector } from \"./pty-state-detector.js\";\nimport { createShadowComparator, type ShadowComparator } from \"./state-shadow-comparator.js\";\nimport type { SessionDatabase } from \"./types.js\";\n\nexport interface CreateSessionRequest {\n workspaceId: string;\n workspacePath: string;\n providerId: string;\n provider: ProviderDefinition;\n draft?: string;\n}\n\nexport interface SessionLogger {\n warn(context: Record<string, unknown>, message: string): void;\n}\n\nexport interface SessionManagerDeps {\n terminalMgr: TerminalManager;\n eventBus: EventBus;\n db: SessionDatabase;\n broadcaster: Broadcaster;\n providerRegistry: ProviderDefinition[];\n providerConfigRepo: ProviderConfigRepo;\n logger?: SessionLogger;\n}\n\n/**\n * Generate unique session ID\n */\nfunction generateSessionId(): string {\n return `sess_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Session Manager handles:\n * - Creating sessions via provider configuration\n * - Managing session state machine\n * - Broadcasting session events\n */\nconst NOOP_SESSION_LOGGER: SessionLogger = {\n warn: () => {},\n};\n\ntype TerminalExitedEvent = Extract<DomainEvent, { type: \"terminal.exited\" }>;\ntype TerminalOutputEvent = Extract<DomainEvent, { type: \"terminal.output\" }>;\n\nexport class SessionManager {\n private sessions = new Map<string, ActiveSession>();\n private terminalToSession = new Map<string, string>();\n private detectors = new Map<string, PtyStateDetector>();\n private comparators = new Map<string, ShadowComparator>();\n private detectorUnsubscribes = new Map<string, Unsubscribe>();\n private readonly logger: SessionLogger;\n\n constructor(private readonly deps: SessionManagerDeps) {\n this.logger = deps.logger ?? NOOP_SESSION_LOGGER;\n\n this.deps.eventBus.on(\"terminal.exited\", (event: TerminalExitedEvent) => {\n this.onTerminalExit(event.terminalId, event.exitCode);\n });\n }\n\n /**\n * Create a new session with provider\n */\n async create(req: CreateSessionRequest): Promise<Session> {\n const sessionId = generateSessionId();\n const launchConfig = this.getLaunchConfig(req.providerId, req.provider);\n\n // Build command from provider (pass config and context)\n const cmd = req.provider.buildCommand(launchConfig, {\n workspacePath: req.workspacePath,\n sessionId,\n });\n\n // Create terminal spec\n const terminalSpec: TerminalSpec = {\n workspaceId: req.workspaceId,\n kind: \"agent\",\n argv: cmd.argv,\n cwd: cmd.cwd,\n env: {\n ...cmd.env,\n CODER_STUDIO_SESSION_ID: sessionId,\n },\n title: req.provider.displayName,\n };\n\n // Create terminal (delegates to TerminalManager)\n const terminal = this.deps.terminalMgr.create(terminalSpec);\n\n // Register session only after terminal creation succeeds so failed creates\n // do not leak half-created sessions into memory or hydration state.\n const active = new ActiveSession({\n id: sessionId,\n workspaceId: req.workspaceId,\n providerId: req.providerId,\n terminalId: terminal.id,\n capability: req.provider.capability,\n state: \"starting\",\n draft: req.draft,\n });\n\n this.sessions.set(sessionId, active);\n this.terminalToSession.set(terminal.id, sessionId);\n this.attachShadowDetector(active, req.provider);\n\n // Persist initial (`starting`) row so subsequent update() calls have a\n // target to UPDATE and so a crash between here and the optimistic idle\n // promotion below still leaves a sane DB state.\n this.deps.db.insert(active.toRow());\n\n // Emit the initial `starting` snapshot so clients can latch session\n // creation before any optimistic transition fires.\n this.emitStateChanged(active, null, \"starting\");\n\n return active.toDTO();\n }\n\n /**\n * Stop a running session\n */\n async stop(sessionId: string): Promise<void> {\n const session = this.sessions.get(sessionId);\n if (!session) {\n throw new Error(`Session not found: ${sessionId}`);\n }\n\n if (session.state === \"ended\") {\n this.terminalToSession.delete(session.terminalId);\n this.cleanupDetector(session.id);\n return;\n }\n\n await this.deps.terminalMgr.close(session.terminalId);\n\n const latestSession = this.sessions.get(session.id);\n if (!latestSession || latestSession.state === \"ended\") {\n return;\n }\n\n this.finishSession(\n latestSession,\n this.terminalToSession.has(latestSession.terminalId) ? undefined : 0\n );\n }\n\n async hydrate(): Promise<void> {\n const persistedSessions = this.deps.db.listHydratable();\n\n for (const session of persistedSessions) {\n if (this.sessions.has(session.id)) {\n continue;\n }\n\n const nextState = this.resolveHydratedState(session);\n const hydrated = new ActiveSession({\n id: session.id,\n workspaceId: session.workspaceId,\n providerId: session.providerId,\n terminalId: session.terminalId,\n capability: session.capability,\n state: nextState,\n title: session.title,\n startedAt: session.startedAt,\n lastActiveAt: session.lastActiveAt,\n endedAt: session.endedAt,\n completionPercent: session.completionPercent,\n errorReason: session.errorReason,\n });\n\n this.sessions.set(session.id, hydrated);\n this.terminalToSession.set(session.terminalId, session.id);\n\n if (nextState !== session.state) {\n this.deps.db.update(session.id, { state: nextState });\n }\n }\n }\n\n private resolveHydratedState(session: Session): SessionState {\n if (session.state === \"draft\") {\n return \"draft\";\n }\n\n const activeTerminal = this.deps.terminalMgr.get(session.terminalId);\n if (activeTerminal?.alive) {\n return session.state;\n }\n\n if (session.state === \"ended\") {\n return session.state;\n }\n\n return \"ended\";\n }\n\n private getLaunchConfig(providerId: string, provider: ProviderDefinition) {\n return mergeProviderLaunchConfig(provider, this.deps.providerConfigRepo.get(providerId));\n }\n\n /**\n * Get session by ID\n */\n get(sessionId: string): Session | undefined {\n return this.sessions.get(sessionId)?.toDTO();\n }\n\n /**\n * Get all sessions for a workspace\n */\n getForWorkspace(workspaceId: string): Session[] {\n return Array.from(this.sessions.values())\n .filter((s) => s.workspaceId === workspaceId)\n .map((s) => s.toDTO());\n }\n\n async stopForWorkspace(workspaceId: string): Promise<void> {\n const sessions = Array.from(this.sessions.values()).filter(\n (session) => session.workspaceId === workspaceId\n );\n\n for (const session of sessions) {\n if (session.state === \"ended\") {\n this.terminalToSession.delete(session.terminalId);\n this.cleanupDetector(session.id);\n continue;\n }\n\n await this.stop(session.id);\n }\n }\n\n deleteEndedForWorkspace(workspaceId: string): void {\n const endedSessions = Array.from(this.sessions.values()).filter(\n (session) => session.workspaceId === workspaceId && session.state === \"ended\"\n );\n\n for (const session of endedSessions) {\n this.sessions.delete(session.id);\n this.terminalToSession.delete(session.terminalId);\n this.cleanupDetector(session.id);\n }\n }\n\n /**\n * Mark a session as actively running again after a submitted message reaches\n * its terminal. Also captures the session title on the *first* submit so the\n * UI can show something more meaningful than \"SESSION-XX\".\n *\n * The title is assigned at most once per session (idempotent): once\n * `session.title` is set, later submits never overwrite it, even across\n * resumes, restarts, or rehydrations.\n */\n onTerminalInput(\n terminalId: string,\n activity: TerminalInputActivity = \"typing\",\n text?: string\n ): void {\n const sessionId = this.terminalToSession.get(terminalId);\n if (!sessionId) return;\n\n const session = this.sessions.get(sessionId);\n if (!session) return;\n\n this.applyTerminalInputActivity(session, activity, text, { armTurnCompletion: true });\n }\n\n private applyTerminalInputActivity(\n session: ActiveSession,\n activity: TerminalInputActivity,\n text: string | undefined,\n options: { armTurnCompletion: boolean }\n ): void {\n if (activity === \"control\" || activity === \"typing\") {\n return;\n }\n\n if (activity === \"internal_submit\") {\n if (options.armTurnCompletion) {\n session.awaitingTurnCompletion = true;\n session.sawOutputSinceTurnStart = false;\n }\n const prev = session.state;\n if (session.state !== \"running\") {\n session.state = \"running\";\n session.lastActiveAt = Date.now();\n this.deps.db.update(session.id, {\n state: \"running\",\n lastActiveAt: session.lastActiveAt,\n });\n this.emitStateChanged(session, prev, \"running\");\n }\n return;\n }\n\n if (activity !== \"submit\") return;\n\n const submittedText = text;\n if (submittedText?.trim()) {\n session.latestSubmittedUserInput = submittedText.trim();\n }\n if (options.armTurnCompletion) {\n session.awaitingTurnCompletion = true;\n session.sawOutputSinceTurnStart = false;\n }\n\n // Title capture runs independently of state transitions: a session that\n // is still 'starting' or 'running' when the user types won't flip state\n // here, but we still want to record the first instruction as the title.\n const titleChanged = this.maybeAssignTitle(session, submittedText);\n\n const prev = session.state;\n const shouldResume = session.state === \"idle\" || session.state === \"starting\";\n\n if (shouldResume) {\n session.state = \"running\";\n session.lastActiveAt = Date.now();\n\n this.deps.db.update(session.id, {\n state: \"running\",\n lastActiveAt: session.lastActiveAt,\n });\n\n this.emitStateChanged(session, prev, \"running\");\n } else if (titleChanged) {\n // State stayed the same, but the DTO changed (title added) and the UI\n // subscribes via state.changed broadcasts \u2014 fire a no-op transition so\n // the fresh DTO is pushed to clients.\n this.emitStateChanged(session, prev, session.state);\n }\n }\n\n /**\n * Session-level input writes to the underlying PTY and updates session activity.\n */\n sendInput(\n sessionId: string,\n bytes: Buffer,\n activity: TerminalInputActivity = \"typing\",\n submittedText?: string\n ): void {\n const session = this.sessions.get(sessionId);\n if (!session) {\n throw new Error(`Session not found: ${sessionId}`);\n }\n\n const text =\n activity === \"submit\" || activity === \"internal_submit\"\n ? (submittedText ?? bytes.toString(\"utf-8\"))\n : undefined;\n const rollbackArm = this.armTurnCompletionBeforeWrite(session, activity);\n\n try {\n this.deps.terminalMgr.write(session.terminalId, bytes);\n } catch (error) {\n rollbackArm?.();\n throw error;\n }\n\n this.applyTerminalInputActivity(session, activity, text, { armTurnCompletion: false });\n this.flushPendingPtyIdle(session);\n }\n\n /**\n * Session-level resize forwards to the underlying PTY.\n */\n resize(sessionId: string, cols: number, rows: number): void {\n const session = this.sessions.get(sessionId);\n if (!session) {\n throw new Error(`Session not found: ${sessionId}`);\n }\n\n this.deps.terminalMgr.resize(session.terminalId, cols, rows);\n }\n\n /**\n * Read the last N bytes of terminal output for a session.\n */\n getOutputTail(sessionId: string, bytes: number = 4096): Buffer {\n const session = this.sessions.get(sessionId);\n if (!session) {\n return Buffer.alloc(0);\n }\n\n return this.deps.terminalMgr.getRingBufferTail(session.terminalId, bytes);\n }\n\n /**\n * Render the current session snapshot to plain text for supervisor use.\n */\n async getRenderedSnapshot(sessionId: string, options: RenderOptions): Promise<string> {\n const session = this.sessions.get(sessionId);\n if (!session) {\n return \"\";\n }\n\n return this.deps.terminalMgr.getRenderedSnapshot(session.terminalId, options);\n }\n\n /**\n * Return the most recent submitted user input observed for the session.\n */\n getLatestSubmittedUserInput(sessionId: string): string | undefined {\n return this.sessions.get(sessionId)?.latestSubmittedUserInput;\n }\n\n /**\n * Resolve the session that owns a terminal, if any.\n */\n findSessionIdByTerminal(terminalId: string): string | undefined {\n return this.terminalToSession.get(terminalId);\n }\n\n /**\n * Assigns a title to the session from the first submitted instruction, if\n * one hasn't been assigned yet. Returns true when a new title was persisted.\n */\n private maybeAssignTitle(session: ActiveSession, text: string | undefined): boolean {\n if (session.title) return false;\n if (!text) return false;\n\n const title = deriveSessionTitle(text);\n\n if (!title) return false;\n\n session.title = title;\n this.deps.db.update(session.id, { title });\n return true;\n }\n\n /**\n * Handle terminal exit event\n */\n onTerminalExit(terminalId: string, exitCode: number): void {\n const sessionId = this.terminalToSession.get(terminalId);\n if (!sessionId) return;\n\n const session = this.sessions.get(sessionId);\n if (!session) return;\n\n this.finishSession(session, exitCode);\n }\n\n /**\n * Delete a session\n * Only allowed for sessions in 'ended' state\n */\n delete(sessionId: string): void {\n const session = this.sessions.get(sessionId);\n if (!session) {\n throw new Error(`Session not found: ${sessionId}`);\n }\n\n if (session.state !== \"ended\") {\n throw new Error(`Cannot delete session in state: ${session.state}`);\n }\n\n // Remove from memory\n this.sessions.delete(sessionId);\n this.terminalToSession.delete(session.terminalId);\n this.cleanupDetector(sessionId);\n\n // Delete from database\n this.deps.db.delete(sessionId);\n\n // Emit removed event\n this.deps.eventBus.emit({\n type: \"session.lifecycle\",\n workspaceId: session.workspaceId,\n sessionId,\n event: \"removed\",\n } as DomainEvent);\n }\n\n /**\n * Emit state changed event\n */\n private emitStateChanged(\n session: ActiveSession,\n from: SessionState | null,\n to: SessionState\n ): void {\n this.comparators.get(session.id)?.observeHookState(session.state);\n const event: Extract<DomainEvent, { type: \"session.state.changed\" }> = {\n type: \"session.state.changed\",\n sessionId: session.id,\n workspaceId: session.workspaceId,\n from: from ?? \"draft\",\n to,\n session: session.toDTO(),\n };\n this.deps.eventBus.emit(event);\n }\n\n private armTurnCompletionBeforeWrite(\n session: ActiveSession,\n activity: TerminalInputActivity\n ): (() => void) | null {\n if (activity !== \"submit\" && activity !== \"internal_submit\") {\n return null;\n }\n\n const previousAwaitingTurnCompletion = session.awaitingTurnCompletion;\n const previousSawOutputSinceTurnStart = session.sawOutputSinceTurnStart;\n session.awaitingTurnCompletion = true;\n session.sawOutputSinceTurnStart = false;\n\n return () => {\n session.awaitingTurnCompletion = previousAwaitingTurnCompletion;\n session.sawOutputSinceTurnStart = previousSawOutputSinceTurnStart;\n };\n }\n\n private flushPendingPtyIdle(session: ActiveSession): void {\n const ptyState = this.comparators.get(session.id)?.snapshot().ptyState;\n if (ptyState !== \"idle\") {\n return;\n }\n\n this.transitionSessionToIdle(session);\n }\n\n private transitionSessionToIdle(activeSession: ActiveSession): void {\n const prev = activeSession.state;\n if (prev !== \"running\" && prev !== \"starting\") {\n return;\n }\n\n if (prev === \"running\" && !activeSession.sawOutputSinceTurnStart) {\n return;\n }\n\n const shouldEmitTurnCompleted = prev === \"running\" && activeSession.awaitingTurnCompletion;\n activeSession.state = \"idle\";\n activeSession.awaitingTurnCompletion = false;\n activeSession.sawOutputSinceTurnStart = false;\n if (!activeSession.startedAt) {\n activeSession.startedAt = Date.now();\n }\n this.deps.db.update(activeSession.id, {\n state: \"idle\",\n startedAt: activeSession.startedAt,\n });\n this.emitStateChanged(activeSession, prev, \"idle\");\n if (shouldEmitTurnCompleted) {\n this.deps.eventBus.emit({\n type: \"session.lifecycle\",\n workspaceId: activeSession.workspaceId,\n sessionId: activeSession.id,\n event: \"turn_completed\",\n } as DomainEvent);\n }\n }\n\n private attachShadowDetector(session: ActiveSession, provider: ProviderDefinition): void {\n if (!provider.idleHeuristics) {\n return;\n }\n\n const comparator = createShadowComparator((info) => {\n this.logger.warn(\n {\n ...info,\n sessionId: session.id,\n terminalId: session.terminalId,\n providerId: session.providerId,\n },\n \"[SessionManager] PTY shadow state divergence\"\n );\n });\n\n const detector = new PtyStateDetector({\n heuristics: provider.idleHeuristics,\n onStateChange: (state) => {\n const activeSession = this.sessions.get(session.id);\n if (!activeSession) {\n return;\n }\n\n const prev = activeSession.state;\n if (state === \"idle\" && (prev === \"running\" || prev === \"starting\")) {\n this.transitionSessionToIdle(activeSession);\n }\n\n comparator.observePtyState(state);\n },\n });\n\n const unsubscribe = this.deps.eventBus.on(\"terminal.output\", (event: TerminalOutputEvent) => {\n if (event.terminalId !== session.terminalId) {\n return;\n }\n\n const activeSession = this.sessions.get(session.id);\n if (activeSession?.awaitingTurnCompletion) {\n activeSession.sawOutputSinceTurnStart = true;\n }\n\n detector.feed(event.chunk);\n });\n\n this.comparators.set(session.id, comparator);\n this.detectors.set(session.id, detector);\n this.detectorUnsubscribes.set(session.id, unsubscribe);\n }\n\n private cleanupDetector(sessionId: string): void {\n this.detectorUnsubscribes.get(sessionId)?.();\n this.detectorUnsubscribes.delete(sessionId);\n this.detectors.get(sessionId)?.dispose();\n this.detectors.delete(sessionId);\n this.comparators.delete(sessionId);\n }\n\n private finishSession(session: ActiveSession, exitCode: number | undefined): void {\n const prev = session.state;\n session.state = \"ended\";\n session.endedAt = Date.now();\n session.exitCode = exitCode;\n this.terminalToSession.delete(session.terminalId);\n this.cleanupDetector(session.id);\n\n this.deps.db.update(session.id, {\n state: \"ended\",\n endedAt: session.endedAt,\n });\n\n this.emitStateChanged(session, prev, \"ended\");\n }\n}\n\n/**\n * Active session with mutable state\n */\nclass ActiveSession {\n id: string;\n workspaceId: string;\n terminalId: string;\n providerId: string;\n state: SessionState;\n capability: \"full\" | \"limited\" | \"unsupported\";\n startedAt?: number;\n lastActiveAt: number;\n endedAt?: number;\n completionPercent?: number;\n errorReason?: string;\n exitCode?: number;\n draft?: string;\n title?: string;\n latestSubmittedUserInput?: string;\n awaitingTurnCompletion = false;\n sawOutputSinceTurnStart = false;\n\n constructor(data: {\n id: string;\n workspaceId: string;\n providerId: string;\n terminalId: string;\n capability: \"full\" | \"limited\" | \"unsupported\";\n state: SessionState;\n draft?: string;\n title?: string;\n startedAt?: number;\n lastActiveAt?: number;\n endedAt?: number;\n completionPercent?: number;\n errorReason?: string;\n }) {\n this.id = data.id;\n this.workspaceId = data.workspaceId;\n this.providerId = data.providerId;\n this.terminalId = data.terminalId;\n this.capability = data.capability;\n this.state = data.state;\n this.draft = data.draft;\n this.title = data.title;\n this.startedAt = data.startedAt ?? Date.now();\n this.lastActiveAt = data.lastActiveAt ?? this.startedAt;\n this.endedAt = data.endedAt;\n this.completionPercent = data.completionPercent;\n this.errorReason = data.errorReason;\n }\n\n toDTO(): Session {\n return {\n id: this.id,\n workspaceId: this.workspaceId,\n terminalId: this.terminalId,\n providerId: this.providerId,\n state: this.state,\n capability: this.capability,\n startedAt: this.startedAt ?? Date.now(),\n lastActiveAt: this.lastActiveAt,\n endedAt: this.endedAt,\n completionPercent: this.completionPercent,\n errorReason: this.errorReason,\n title: this.title,\n };\n }\n\n toRow(): SessionRow {\n return sessionToRow({\n ...this.toDTO(),\n ...(this.draft !== undefined ? { draft: this.draft } : {}),\n });\n }\n}\n", "import { DatabaseSync } from \"node:sqlite\";\n\nexport type Database = DatabaseSync;\n\nexport function withTransaction<T>(db: Database, fn: () => T): T {\n db.exec(\"BEGIN\");\n try {\n const result = fn();\n db.exec(\"COMMIT\");\n return result;\n } catch (error) {\n if (db.isTransaction) {\n db.exec(\"ROLLBACK\");\n }\n throw error;\n }\n}\n", "import { DatabaseSync } from \"node:sqlite\";\nimport { readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport type { Database } from \"./database.js\";\n\ninterface SchemaEntryRow {\n type: string;\n name: string;\n tbl_name: string;\n sql: string | null;\n}\n\ninterface SchemaEntry {\n type: string;\n name: string;\n tableName: string;\n sql: string;\n}\n\ninterface UserVersionRow {\n user_version: number;\n}\n\nexport type SchemaState = \"empty\" | \"current\" | \"v1\" | \"v2\" | \"incompatible\";\n\nexport interface SchemaDetection {\n state: SchemaState;\n userVersion: number;\n mismatch: string | null;\n}\n\nexport const CURRENT_SCHEMA_VERSION = 2;\n\nconst CURRENT_SCHEMA_PATH = join(import.meta.dirname, \"migrations\", \"001_init.sql\");\n\nexport const CURRENT_SCHEMA_SQL = readFileSync(CURRENT_SCHEMA_PATH, \"utf-8\");\n\nexport const V1_SCHEMA_SQL = `\nCREATE TABLE workspaces (\n id TEXT PRIMARY KEY,\n path TEXT NOT NULL UNIQUE,\n target_runtime TEXT NOT NULL,\n wsl_distro TEXT,\n opened_at INTEGER NOT NULL,\n last_active_at INTEGER NOT NULL,\n ui_state TEXT\n);\n\nCREATE TABLE terminals (\n id TEXT PRIMARY KEY,\n workspace_id TEXT NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,\n kind TEXT NOT NULL,\n cwd TEXT NOT NULL,\n argv TEXT NOT NULL,\n env TEXT,\n title TEXT,\n cols INTEGER NOT NULL,\n rows INTEGER NOT NULL,\n created_at INTEGER NOT NULL,\n ended_at INTEGER,\n exit_code INTEGER\n);\n\nCREATE INDEX idx_terminals_workspace ON terminals(workspace_id);\nCREATE INDEX idx_terminals_kind ON terminals(workspace_id, kind);\n\nCREATE TABLE sessions (\n id TEXT PRIMARY KEY,\n workspace_id TEXT NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,\n terminal_id TEXT NOT NULL REFERENCES terminals(id) ON DELETE CASCADE,\n provider_id TEXT NOT NULL,\n capability TEXT NOT NULL,\n state TEXT NOT NULL,\n started_at INTEGER NOT NULL,\n ended_at INTEGER,\n last_active_at INTEGER NOT NULL,\n completion_percent INTEGER,\n error_reason TEXT,\n archived BOOLEAN DEFAULT 0,\n title TEXT\n);\n\nCREATE INDEX idx_sessions_workspace ON sessions(workspace_id);\nCREATE UNIQUE INDEX idx_sessions_terminal ON sessions(terminal_id);\nCREATE UNIQUE INDEX idx_sessions_id_workspace ON sessions(id, workspace_id);\n\nCREATE TABLE provider_configs (\n provider_id TEXT PRIMARY KEY,\n config TEXT NOT NULL\n);\n\nCREATE TABLE user_settings (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n);\n\nCREATE TABLE auth_sessions (\n token TEXT PRIMARY KEY,\n created_at INTEGER NOT NULL,\n last_seen_at INTEGER NOT NULL\n);\n\nCREATE INDEX idx_auth_sessions_last_seen_at ON auth_sessions(last_seen_at);\n\nCREATE TABLE supervisors (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL UNIQUE,\n workspace_id TEXT NOT NULL,\n state TEXT NOT NULL,\n objective TEXT NOT NULL,\n evaluator_provider_id TEXT NOT NULL,\n last_cycle_at INTEGER,\n last_evaluated_turn_id TEXT,\n error_reason TEXT,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL,\n FOREIGN KEY (session_id, workspace_id) REFERENCES sessions(id, workspace_id) ON DELETE CASCADE,\n FOREIGN KEY (workspace_id) REFERENCES workspaces(id) ON DELETE CASCADE\n);\n\nCREATE INDEX idx_supervisors_workspace ON supervisors(workspace_id);\nCREATE INDEX idx_supervisors_session ON supervisors(session_id);\nCREATE UNIQUE INDEX idx_supervisors_id_session ON supervisors(id, session_id);\n\nCREATE TABLE supervisor_cycles (\n id TEXT PRIMARY KEY,\n supervisor_id TEXT NOT NULL,\n session_id TEXT NOT NULL,\n status TEXT NOT NULL,\n trigger TEXT NOT NULL,\n evidence_source TEXT NOT NULL,\n objective TEXT NOT NULL,\n evaluator_provider_id TEXT NOT NULL,\n turn_id TEXT,\n progress INTEGER,\n result TEXT,\n injected_guidance TEXT,\n error_reason TEXT,\n created_at INTEGER NOT NULL,\n completed_at INTEGER,\n FOREIGN KEY (supervisor_id, session_id) REFERENCES supervisors(id, session_id) ON DELETE CASCADE,\n FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE\n);\n\nCREATE INDEX idx_supervisor_cycles_supervisor ON supervisor_cycles(supervisor_id, created_at DESC);\nCREATE INDEX idx_supervisor_cycles_session ON supervisor_cycles(session_id, created_at DESC);\n\nCREATE TABLE auth_login_blocks (\n ip TEXT PRIMARY KEY,\n failed_count INTEGER NOT NULL,\n first_failed_at INTEGER NOT NULL,\n last_failed_at INTEGER NOT NULL,\n blocked_until INTEGER\n);\n\nCREATE INDEX idx_auth_login_blocks_blocked_until ON auth_login_blocks(blocked_until);\n\nCREATE TABLE auth_login_failures (\n ip TEXT NOT NULL,\n failed_at INTEGER NOT NULL\n);\n\nCREATE INDEX idx_auth_login_failures_ip_failed_at ON auth_login_failures(ip, failed_at);\n`;\n\nexport const V2_SCHEMA_SQL = `\nCREATE TABLE workspaces (\n id TEXT PRIMARY KEY,\n path TEXT NOT NULL UNIQUE,\n target_runtime TEXT NOT NULL,\n wsl_distro TEXT,\n opened_at INTEGER NOT NULL,\n last_active_at INTEGER NOT NULL,\n ui_state TEXT\n);\n\nCREATE TABLE terminals (\n id TEXT PRIMARY KEY,\n workspace_id TEXT NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,\n kind TEXT NOT NULL,\n cwd TEXT NOT NULL,\n argv TEXT NOT NULL,\n env TEXT,\n title TEXT,\n cols INTEGER NOT NULL,\n rows INTEGER NOT NULL,\n created_at INTEGER NOT NULL,\n ended_at INTEGER,\n exit_code INTEGER\n);\n\nCREATE INDEX idx_terminals_workspace ON terminals(workspace_id);\nCREATE INDEX idx_terminals_kind ON terminals(workspace_id, kind);\n\nCREATE TABLE sessions (\n id TEXT PRIMARY KEY,\n workspace_id TEXT NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,\n terminal_id TEXT NOT NULL REFERENCES terminals(id) ON DELETE CASCADE,\n provider_id TEXT NOT NULL,\n capability TEXT NOT NULL,\n state TEXT NOT NULL,\n started_at INTEGER NOT NULL,\n ended_at INTEGER,\n last_active_at INTEGER NOT NULL,\n completion_percent INTEGER,\n error_reason TEXT,\n archived BOOLEAN DEFAULT 0,\n title TEXT\n);\n\nCREATE INDEX idx_sessions_workspace ON sessions(workspace_id);\nCREATE UNIQUE INDEX idx_sessions_terminal ON sessions(terminal_id);\nCREATE UNIQUE INDEX idx_sessions_id_workspace ON sessions(id, workspace_id);\n\nCREATE TABLE provider_configs (\n provider_id TEXT PRIMARY KEY,\n config TEXT NOT NULL\n);\n\nCREATE TABLE user_settings (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n);\n\nCREATE TABLE auth_sessions (\n token TEXT PRIMARY KEY,\n created_at INTEGER NOT NULL,\n last_seen_at INTEGER NOT NULL\n);\n\nCREATE INDEX idx_auth_sessions_last_seen_at ON auth_sessions(last_seen_at);\n\nCREATE TABLE supervisors (\n id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL UNIQUE,\n workspace_id TEXT NOT NULL,\n state TEXT NOT NULL,\n objective TEXT NOT NULL,\n evaluator_provider_id TEXT NOT NULL,\n last_cycle_at INTEGER,\n last_evaluated_turn_id TEXT,\n error_reason TEXT,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL,\n evaluator_model TEXT,\n max_supervision_count INTEGER NOT NULL DEFAULT 0,\n completed_supervision_count INTEGER NOT NULL DEFAULT 0,\n scheduled_at INTEGER,\n stop_reason TEXT,\n FOREIGN KEY (session_id, workspace_id) REFERENCES sessions(id, workspace_id) ON DELETE CASCADE,\n FOREIGN KEY (workspace_id) REFERENCES workspaces(id) ON DELETE CASCADE\n);\n\nCREATE INDEX idx_supervisors_workspace ON supervisors(workspace_id);\nCREATE INDEX idx_supervisors_session ON supervisors(session_id);\nCREATE UNIQUE INDEX idx_supervisors_id_session ON supervisors(id, session_id);\n\nCREATE TABLE supervisor_cycles (\n id TEXT PRIMARY KEY,\n supervisor_id TEXT NOT NULL,\n session_id TEXT NOT NULL,\n status TEXT NOT NULL,\n trigger TEXT NOT NULL,\n evidence_source TEXT NOT NULL,\n objective TEXT NOT NULL,\n evaluator_provider_id TEXT NOT NULL,\n turn_id TEXT,\n progress INTEGER,\n result TEXT,\n injected_guidance TEXT,\n error_reason TEXT,\n created_at INTEGER NOT NULL,\n completed_at INTEGER,\n FOREIGN KEY (supervisor_id, session_id) REFERENCES supervisors(id, session_id) ON DELETE CASCADE,\n FOREIGN KEY (session_id) REFERENCES sessions(id) ON DELETE CASCADE\n);\n\nCREATE INDEX idx_supervisor_cycles_supervisor ON supervisor_cycles(supervisor_id, created_at DESC);\nCREATE INDEX idx_supervisor_cycles_session ON supervisor_cycles(session_id, created_at DESC);\n\nCREATE TABLE supervisor_cycle_attempts (\n id TEXT PRIMARY KEY,\n cycle_id TEXT NOT NULL REFERENCES supervisor_cycles(id) ON DELETE CASCADE,\n attempt_index INTEGER NOT NULL,\n status TEXT NOT NULL,\n started_at INTEGER NOT NULL,\n completed_at INTEGER,\n error_reason TEXT,\n provider_model TEXT\n);\n\nCREATE INDEX idx_supervisor_cycle_attempts_cycle ON supervisor_cycle_attempts(cycle_id, attempt_index);\n\nCREATE TABLE auth_login_blocks (\n ip TEXT PRIMARY KEY,\n failed_count INTEGER NOT NULL,\n first_failed_at INTEGER NOT NULL,\n last_failed_at INTEGER NOT NULL,\n blocked_until INTEGER\n);\n\nCREATE INDEX idx_auth_login_blocks_blocked_until ON auth_login_blocks(blocked_until);\n\nCREATE TABLE auth_login_failures (\n ip TEXT NOT NULL,\n failed_at INTEGER NOT NULL\n);\n\nCREATE INDEX idx_auth_login_failures_ip_failed_at ON auth_login_failures(ip, failed_at);\n`;\n\nfunction normalizeSql(sql: string | null): string {\n return (sql ?? \"\").replace(/\\s+/g, \" \").trim();\n}\n\nfunction listSchemaEntries(db: Database): SchemaEntry[] {\n const rows = db\n .prepare(\n `\n SELECT type, name, tbl_name, sql\n FROM sqlite_master\n WHERE type IN ('table', 'index', 'view', 'trigger')\n AND name NOT LIKE 'sqlite_%'\n ORDER BY type, name\n `\n )\n .all() as unknown as SchemaEntryRow[];\n\n return rows.map((row) => ({\n type: row.type,\n name: row.name,\n tableName: row.tbl_name,\n sql: normalizeSql(row.sql),\n }));\n}\n\nfunction schemaEntrySignature(entry: SchemaEntry): string {\n return `${entry.type}:${entry.name}:${entry.tableName}:${entry.sql}`;\n}\n\nfunction buildSchemaEntries(schemaSql: string): SchemaEntry[] {\n const db = new DatabaseSync(\":memory:\");\n try {\n db.exec(schemaSql);\n return listSchemaEntries(db);\n } finally {\n db.close();\n }\n}\n\nconst CURRENT_SCHEMA_ENTRIES = buildSchemaEntries(CURRENT_SCHEMA_SQL);\nconst V1_SCHEMA_ENTRIES = buildSchemaEntries(V1_SCHEMA_SQL);\nconst V2_SCHEMA_ENTRIES = buildSchemaEntries(V2_SCHEMA_SQL);\n\nfunction hasExactFingerprint(\n actualEntries: SchemaEntry[],\n expectedEntries: SchemaEntry[]\n): boolean {\n if (actualEntries.length !== expectedEntries.length) {\n return false;\n }\n\n return actualEntries.every(\n (entry, index) => schemaEntrySignature(entry) === schemaEntrySignature(expectedEntries[index]!)\n );\n}\n\nfunction describeSchemaMismatch(expected: SchemaEntry[], actual: SchemaEntry[]): string {\n const expectedByName = new Map(expected.map((entry) => [`${entry.type}:${entry.name}`, entry]));\n const actualByName = new Map(actual.map((entry) => [`${entry.type}:${entry.name}`, entry]));\n const keys = new Set([...expectedByName.keys(), ...actualByName.keys()]);\n\n for (const key of keys) {\n const expectedEntry = expectedByName.get(key);\n const actualEntry = actualByName.get(key);\n\n if (!expectedEntry) {\n return `unexpected ${actualEntry?.type ?? \"schema object\"} ${actualEntry?.name ?? key}`;\n }\n\n if (!actualEntry) {\n return `missing ${expectedEntry.type} ${expectedEntry.name}`;\n }\n\n if (schemaEntrySignature(expectedEntry) !== schemaEntrySignature(actualEntry)) {\n return `definition mismatch for ${expectedEntry.type} ${expectedEntry.name}`;\n }\n }\n\n return \"unknown schema drift\";\n}\n\nexport function detectSchema(db: Database): SchemaDetection {\n const actualEntries = listSchemaEntries(db);\n const userVersionRow = db.prepare(\"PRAGMA user_version\").get() as UserVersionRow | undefined;\n const userVersion = userVersionRow?.user_version ?? 0;\n\n if (actualEntries.length === 0) {\n return {\n state: \"empty\",\n userVersion,\n mismatch: null,\n };\n }\n\n if (hasExactFingerprint(actualEntries, CURRENT_SCHEMA_ENTRIES)) {\n return {\n state: \"current\",\n userVersion,\n mismatch: null,\n };\n }\n\n if (hasExactFingerprint(actualEntries, V1_SCHEMA_ENTRIES)) {\n return {\n state: \"v1\",\n userVersion,\n mismatch: null,\n };\n }\n\n if (hasExactFingerprint(actualEntries, V2_SCHEMA_ENTRIES)) {\n return {\n state: CURRENT_SCHEMA_VERSION === 2 ? \"current\" : \"v2\",\n userVersion,\n mismatch: null,\n };\n }\n\n return {\n state: \"incompatible\",\n userVersion,\n mismatch: describeSchemaMismatch(CURRENT_SCHEMA_ENTRIES, actualEntries),\n };\n}\n\nexport function stampCurrentSchemaVersion(db: Database): void {\n db.exec(`PRAGMA user_version = ${CURRENT_SCHEMA_VERSION}`);\n}\n\nexport function stampSchemaVersion(db: Database, version: number): void {\n db.exec(`PRAGMA user_version = ${version}`);\n}\n\nexport class IncompatibleSchemaError extends Error {\n readonly code = \"db_incompatible_schema\";\n\n constructor(dbPath: string, mismatch: string) {\n super(\n `db_incompatible_schema: Database schema mismatch detected at ${dbPath}: ${mismatch}. ` +\n \"This build requires the current baseline schema. Delete the local database file and restart.\"\n );\n this.name = \"IncompatibleSchemaError\";\n }\n}\n", "import { DatabaseSync } from \"node:sqlite\";\nimport { type Database, withTransaction } from \"./database.js\";\nimport {\n CURRENT_SCHEMA_SQL,\n CURRENT_SCHEMA_VERSION,\n detectSchema,\n IncompatibleSchemaError,\n stampCurrentSchemaVersion,\n stampSchemaVersion,\n} from \"./schema-version.js\";\n\ninterface IntegrityCheckRow {\n integrity_check: string;\n}\n\ninterface TableNameRow {\n name: string;\n}\n\ninterface ColumnInfoRow {\n name: string;\n}\n\nconst LEGACY_TABLES = [\"hook_registrations\", \"_migrations\"] as const;\nconst LEGACY_SESSION_COLUMNS = [\"resume_id\", \"transcript_path\"] as const;\n\nfunction hasTable(db: Database, tableName: string): boolean {\n const row = db\n .prepare(\"SELECT name FROM sqlite_master WHERE type='table' AND name = ?\")\n .get(tableName) as TableNameRow | undefined;\n return row?.name === tableName;\n}\n\nfunction getSessionColumns(db: Database): Set<string> {\n if (!hasTable(db, \"sessions\")) {\n return new Set();\n }\n\n const rows = db.prepare(\"PRAGMA table_info(sessions)\").all() as unknown as ColumnInfoRow[];\n return new Set(rows.map((row) => row.name));\n}\n\nfunction detectLegacySchema(db: Database): string[] {\n const reasons: string[] = [];\n\n for (const tableName of LEGACY_TABLES) {\n if (hasTable(db, tableName)) {\n reasons.push(`legacy table ${tableName}`);\n }\n }\n\n const sessionColumns = getSessionColumns(db);\n for (const columnName of LEGACY_SESSION_COLUMNS) {\n if (sessionColumns.has(columnName)) {\n reasons.push(`legacy sessions column ${columnName}`);\n }\n }\n\n return reasons;\n}\n\nfunction throwIfLegacySchema(db: Database, dbPath: string): void {\n const reasons = detectLegacySchema(db);\n if (reasons.length === 0) {\n return;\n }\n\n throw new IncompatibleSchemaError(dbPath, `legacy schema detected (${reasons.join(\", \")})`);\n}\n\nfunction initializeSchema(db: Database): void {\n withTransaction(db, () => {\n db.exec(CURRENT_SCHEMA_SQL);\n });\n}\n\nfunction upgradeSchemaV1ToV2(db: Database): void {\n withTransaction(db, () => {\n db.exec(\"ALTER TABLE supervisors ADD COLUMN evaluator_model TEXT\");\n db.exec(\"ALTER TABLE supervisors ADD COLUMN max_supervision_count INTEGER NOT NULL DEFAULT 0\");\n db.exec(\n \"ALTER TABLE supervisors ADD COLUMN completed_supervision_count INTEGER NOT NULL DEFAULT 0\"\n );\n db.exec(\"ALTER TABLE supervisors ADD COLUMN scheduled_at INTEGER\");\n db.exec(\"ALTER TABLE supervisors ADD COLUMN stop_reason TEXT\");\n db.exec(`\n CREATE TABLE supervisor_cycle_attempts (\n id TEXT PRIMARY KEY,\n cycle_id TEXT NOT NULL REFERENCES supervisor_cycles(id) ON DELETE CASCADE,\n attempt_index INTEGER NOT NULL,\n status TEXT NOT NULL,\n started_at INTEGER NOT NULL,\n completed_at INTEGER,\n error_reason TEXT,\n provider_model TEXT\n )\n `);\n db.exec(\n \"CREATE INDEX idx_supervisor_cycle_attempts_cycle ON supervisor_cycle_attempts(cycle_id, attempt_index)\"\n );\n stampSchemaVersion(db, 2);\n });\n}\n\nfunction assertCurrentSchema(db: Database, dbPath: string): void {\n const detection = detectSchema(db);\n if (detection.state !== \"current\") {\n throw new IncompatibleSchemaError(dbPath, detection.mismatch ?? \"unknown schema drift\");\n }\n}\n\nfunction initializeOrUpgradeSchema(db: Database, dbPath: string): void {\n throwIfLegacySchema(db, dbPath);\n\n const detection = detectSchema(db);\n\n switch (detection.state) {\n case \"empty\":\n initializeSchema(db);\n assertCurrentSchema(db, dbPath);\n return;\n\n case \"current\":\n if (detection.userVersion !== CURRENT_SCHEMA_VERSION) {\n stampCurrentSchemaVersion(db);\n }\n assertCurrentSchema(db, dbPath);\n return;\n\n case \"v1\":\n upgradeSchemaV1ToV2(db);\n assertCurrentSchema(db, dbPath);\n return;\n\n case \"v2\":\n if (detection.userVersion !== CURRENT_SCHEMA_VERSION) {\n stampCurrentSchemaVersion(db);\n }\n assertCurrentSchema(db, dbPath);\n return;\n\n case \"incompatible\":\n throw new IncompatibleSchemaError(dbPath, detection.mismatch ?? \"unknown schema drift\");\n }\n}\n\n/**\n * Opens a SQLite database with WAL mode and foreign key constraints enabled.\n * Runs an integrity check on startup.\n *\n * @param dbPath - Path to the SQLite database file\n * @returns Database instance\n */\nexport function openDatabase(dbPath: string): Database {\n const db = new DatabaseSync(dbPath);\n\n try {\n db.exec(\"PRAGMA journal_mode = WAL\");\n db.exec(\"PRAGMA foreign_keys = ON\");\n\n const integrityResult = db\n .prepare(\"PRAGMA integrity_check\")\n .all() as unknown as IntegrityCheckRow[];\n if (integrityResult[0]?.integrity_check !== \"ok\") {\n throw new Error(`Database integrity check failed: ${JSON.stringify(integrityResult)}`);\n }\n\n initializeOrUpgradeSchema(db, dbPath);\n\n return db;\n } catch (error) {\n try {\n if (db.isOpen) {\n db.close();\n }\n } catch {\n // Preserve the startup failure as the primary error.\n }\n\n throw error;\n }\n}\n\n/**\n * Retained as a compatibility entry point for tests that initialize :memory:\n * databases explicitly before wiring command handlers.\n */\nexport function runMigrations(db: Database): void {\n initializeOrUpgradeSchema(db, \":memory:\");\n}\n\n/**\n * Closes the database connection gracefully.\n *\n * @param db - Database instance\n */\nexport function closeDatabase(db: Database): void {\n if (db.isOpen) {\n db.close();\n }\n}\n", "import { type Database, withTransaction } from \"../database.js\";\n\nexport interface AuthLoginBlockRecord {\n ip: string;\n failedCount: number;\n firstFailedAt: number;\n lastFailedAt: number;\n blockedUntil: number | null;\n}\n\ninterface AuthLoginBlockRow {\n ip: string;\n failed_count: number;\n first_failed_at: number;\n last_failed_at: number;\n blocked_until: number | null;\n}\n\ninterface AuthLoginFailureStatsRow {\n failed_count: number;\n first_failed_at: number | null;\n last_failed_at: number | null;\n}\n\nconst toRecord = (row: AuthLoginBlockRow): AuthLoginBlockRecord => ({\n ip: row.ip,\n failedCount: row.failed_count,\n firstFailedAt: row.first_failed_at,\n lastFailedAt: row.last_failed_at,\n blockedUntil: row.blocked_until,\n});\n\nexport class AuthLoginBlockRepo {\n constructor(private readonly db: Database) {}\n\n get(ip: string): AuthLoginBlockRecord | null {\n const row = this.db\n .prepare(`\n SELECT ip, failed_count, first_failed_at, last_failed_at, blocked_until\n FROM auth_login_blocks\n WHERE ip = ?\n `)\n .get(ip) as AuthLoginBlockRow | undefined;\n\n return row ? toRecord(row) : null;\n }\n\n upsert(record: AuthLoginBlockRecord): AuthLoginBlockRecord {\n this.db\n .prepare(`\n INSERT INTO auth_login_blocks (\n ip, failed_count, first_failed_at, last_failed_at, blocked_until\n ) VALUES (?, ?, ?, ?, ?)\n ON CONFLICT(ip) DO UPDATE SET\n failed_count = excluded.failed_count,\n first_failed_at = excluded.first_failed_at,\n last_failed_at = excluded.last_failed_at,\n blocked_until = excluded.blocked_until\n `)\n .run(\n record.ip,\n record.failedCount,\n record.firstFailedAt,\n record.lastFailedAt,\n record.blockedUntil\n );\n\n return record;\n }\n\n recordFailure(\n ip: string,\n now: number,\n windowStart: number,\n failureLimit: number,\n blockDurationMs: number\n ): AuthLoginBlockRecord {\n return withTransaction(this.db, () => {\n this.db\n .prepare(`\n DELETE FROM auth_login_failures\n WHERE ip = ? AND failed_at < ?\n `)\n .run(ip, windowStart);\n\n this.db\n .prepare(`\n INSERT INTO auth_login_failures (ip, failed_at)\n VALUES (?, ?)\n `)\n .run(ip, now);\n\n const stats = this.db\n .prepare(`\n SELECT\n COUNT(*) AS failed_count,\n MIN(failed_at) AS first_failed_at,\n MAX(failed_at) AS last_failed_at\n FROM auth_login_failures\n WHERE ip = ?\n `)\n .get(ip) as unknown as AuthLoginFailureStatsRow;\n\n const record: AuthLoginBlockRecord = {\n ip,\n failedCount: stats.failed_count,\n firstFailedAt: stats.first_failed_at ?? now,\n lastFailedAt: stats.last_failed_at ?? now,\n blockedUntil: stats.failed_count >= failureLimit ? now + blockDurationMs : null,\n };\n\n return this.upsert(record);\n });\n }\n\n delete(ip: string): boolean {\n return withTransaction(this.db, () => {\n const blockResult = this.db.prepare(\"DELETE FROM auth_login_blocks WHERE ip = ?\").run(ip);\n const failureResult = this.db.prepare(\"DELETE FROM auth_login_failures WHERE ip = ?\").run(ip);\n return Number(blockResult.changes) + Number(failureResult.changes) > 0;\n });\n }\n\n listActiveBlocks(now: number): AuthLoginBlockRecord[] {\n const rows = this.db\n .prepare(`\n SELECT ip, failed_count, first_failed_at, last_failed_at, blocked_until\n FROM auth_login_blocks\n WHERE blocked_until IS NOT NULL AND blocked_until > ?\n ORDER BY blocked_until DESC, ip ASC\n `)\n .all(now) as unknown as AuthLoginBlockRow[];\n\n return rows.map(toRecord);\n }\n}\n", "import type { Database } from \"../database.js\";\n\nexport interface AuthSession {\n token: string;\n createdAt: number;\n lastSeenAt: number;\n}\n\nexport class AuthSessionRepo {\n constructor(private readonly db: Database) {}\n\n create(token: string, now: number): AuthSession {\n this.db\n .prepare(`\n INSERT INTO auth_sessions (token, created_at, last_seen_at)\n VALUES (?, ?, ?)\n `)\n .run(token, now, now);\n\n return {\n token,\n createdAt: now,\n lastSeenAt: now,\n };\n }\n\n touch(token: string, now: number): boolean {\n const result = this.db\n .prepare(`\n UPDATE auth_sessions\n SET last_seen_at = ?\n WHERE token = ?\n `)\n .run(now, token);\n\n return result.changes > 0;\n }\n\n delete(token: string): void {\n this.db.prepare(\"DELETE FROM auth_sessions WHERE token = ?\").run(token);\n }\n}\n", "import type { ProviderConfig } from \"@coder-studio/core\";\nimport type { Database } from \"../database.js\";\n\n/**\n * Provider configuration repository\n */\nexport class ProviderConfigRepo {\n constructor(private db: Database) {}\n\n /**\n * Gets a provider configuration by provider ID\n */\n get(providerId: string): ProviderConfig | undefined {\n const row = this.db\n .prepare(\"SELECT config FROM provider_configs WHERE provider_id = ?\")\n .get(providerId) as { config: string } | undefined;\n\n return row ? (JSON.parse(row.config) as ProviderConfig) : undefined;\n }\n\n /**\n * Sets a provider configuration\n * Creates the configuration if it doesn't exist, updates if it does\n */\n set(providerId: string, config: ProviderConfig): void {\n const stmt = this.db.prepare(`\n INSERT INTO provider_configs (provider_id, config)\n VALUES (?, ?)\n ON CONFLICT(provider_id) DO UPDATE SET config = excluded.config\n `);\n\n stmt.run(providerId, JSON.stringify(config));\n }\n\n /**\n * Deletes a provider configuration by provider ID\n */\n delete(providerId: string): void {\n const stmt = this.db.prepare(\"DELETE FROM provider_configs WHERE provider_id = ?\");\n stmt.run(providerId);\n }\n\n /**\n * Lists all provider IDs that have configurations\n */\n listProviderIds(): string[] {\n const rows = this.db.prepare(\"SELECT provider_id FROM provider_configs\").all() as {\n provider_id: string;\n }[];\n return rows.map((row) => row.provider_id);\n }\n\n /**\n * Gets all provider configurations as a key-value object\n */\n getAll(): Record<string, ProviderConfig> {\n const rows = this.db.prepare(\"SELECT provider_id, config FROM provider_configs\").all() as {\n provider_id: string;\n config: string;\n }[];\n\n const result: Record<string, ProviderConfig> = {};\n for (const row of rows) {\n result[row.provider_id] = JSON.parse(row.config) as ProviderConfig;\n }\n\n return result;\n }\n}\n", "import type { Database } from \"../database.js\";\n\n/**\n * Settings repository for key-value storage\n * Stores JSON values for various settings\n *\n * Known keys:\n * - `git.autofetchPeriodSec`: polling interval for active-workspace background fetch.\n * Defaults to 180 seconds; `0` disables periodic polling while preserving\n * open-time fetch and manual fetch.\n */\nexport class SettingsRepo {\n constructor(private db: Database) {}\n\n /**\n * Gets a setting value by key\n * @returns The parsed JSON value, or undefined if not found\n */\n get<T = unknown>(key: string): T | undefined {\n const row = this.db.prepare(\"SELECT value FROM user_settings WHERE key = ?\").get(key) as\n | { value: string }\n | undefined;\n\n return row ? (JSON.parse(row.value) as T) : undefined;\n }\n\n /**\n * Sets a setting value\n * Creates the setting if it doesn't exist, updates if it does\n */\n set<T>(key: string, value: T): void {\n const stmt = this.db.prepare(`\n INSERT INTO user_settings (key, value)\n VALUES (?, ?)\n ON CONFLICT(key) DO UPDATE SET value = excluded.value\n `);\n\n stmt.run(key, JSON.stringify(value));\n }\n\n /**\n * Deletes a setting by key\n */\n delete(key: string): void {\n const stmt = this.db.prepare(\"DELETE FROM user_settings WHERE key = ?\");\n stmt.run(key);\n }\n\n /**\n * Lists all settings keys\n */\n listKeys(): string[] {\n const rows = this.db.prepare(\"SELECT key FROM user_settings\").all() as { key: string }[];\n return rows.map((row) => row.key);\n }\n\n /**\n * Gets all settings as a key-value object\n */\n getAll(): Record<string, unknown> {\n const rows = this.db.prepare(\"SELECT key, value FROM user_settings\").all() as {\n key: string;\n value: string;\n }[];\n\n const result: Record<string, unknown> = {};\n for (const row of rows) {\n result[row.key] = JSON.parse(row.value);\n }\n\n return result;\n }\n}\n", "import type {\n SupervisorCycleAttempt,\n SupervisorCycleAttemptPatch,\n SupervisorCycleAttemptStatus,\n} from \"@coder-studio/core\";\nimport type { Database } from \"../database.js\";\n\ninterface SupervisorCycleAttemptRow {\n id: string;\n cycle_id: string;\n attempt_index: number;\n status: SupervisorCycleAttemptStatus;\n started_at: number;\n completed_at: number | null;\n error_reason: string | null;\n provider_model: string | null;\n}\n\nexport type NewSupervisorCycleAttempt = SupervisorCycleAttempt;\n\nexport type SupervisorCycleAttemptUpdatePatch = SupervisorCycleAttemptPatch;\n\nexport class SupervisorCycleAttemptRepo {\n constructor(private readonly db: Database) {}\n\n create(input: NewSupervisorCycleAttempt): SupervisorCycleAttempt {\n this.db\n .prepare(\n `INSERT INTO supervisor_cycle_attempts (id, cycle_id, attempt_index, status, started_at, completed_at, error_reason, provider_model)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)`\n )\n .run(\n input.id,\n input.cycleId,\n input.attemptIndex,\n input.status,\n input.startedAt,\n input.completedAt ?? null,\n input.errorReason ?? null,\n input.providerModel ?? null\n );\n\n return this.findById(input.id)!;\n }\n\n findById(id: string): SupervisorCycleAttempt | undefined {\n const row = this.db.prepare(\"SELECT * FROM supervisor_cycle_attempts WHERE id = ?\").get(id) as\n | SupervisorCycleAttemptRow\n | undefined;\n return row ? this.rowToAttempt(row) : undefined;\n }\n\n listForCycle(cycleId: string): SupervisorCycleAttempt[] {\n const rows = this.db\n .prepare(\n \"SELECT * FROM supervisor_cycle_attempts WHERE cycle_id = ? ORDER BY attempt_index ASC\"\n )\n .all(cycleId) as unknown as SupervisorCycleAttemptRow[];\n return rows.map((row) => this.rowToAttempt(row));\n }\n\n update(id: string, patch: SupervisorCycleAttemptUpdatePatch): SupervisorCycleAttempt {\n const assignments: string[] = [];\n const params: Record<string, number | string | null> = { id };\n\n if (patch.status !== undefined) {\n assignments.push(\"status = @status\");\n params.status = patch.status;\n }\n if (patch.completedAt !== undefined) {\n assignments.push(\"completed_at = @completedAt\");\n params.completedAt = patch.completedAt;\n }\n if (patch.errorReason !== undefined) {\n assignments.push(\"error_reason = @errorReason\");\n params.errorReason = patch.errorReason;\n }\n if (patch.providerModel !== undefined) {\n assignments.push(\"provider_model = @providerModel\");\n params.providerModel = patch.providerModel;\n }\n\n if (assignments.length === 0) {\n const existing = this.findById(id);\n if (!existing) {\n throw new Error(`Supervisor cycle attempt not found: ${id}`);\n }\n return existing;\n }\n\n const result = this.db\n .prepare(`UPDATE supervisor_cycle_attempts SET ${assignments.join(\", \")} WHERE id = @id`)\n .run(params);\n\n if (result.changes === 0) {\n throw new Error(`Supervisor cycle attempt not found: ${id}`);\n }\n\n return this.findById(id)!;\n }\n\n deleteForCycle(cycleId: string): void {\n this.db.prepare(\"DELETE FROM supervisor_cycle_attempts WHERE cycle_id = ?\").run(cycleId);\n }\n\n private rowToAttempt(row: SupervisorCycleAttemptRow): SupervisorCycleAttempt {\n return {\n id: row.id,\n cycleId: row.cycle_id,\n attemptIndex: row.attempt_index,\n status: row.status,\n startedAt: row.started_at,\n completedAt: row.completed_at ?? undefined,\n errorReason: row.error_reason ?? undefined,\n providerModel: row.provider_model ?? undefined,\n };\n }\n}\n", "import type { SupervisorCycle } from \"@coder-studio/core\";\nimport type { Database } from \"../database.js\";\n\ninterface SupervisorCycleRow {\n id: string;\n supervisor_id: string;\n session_id: string;\n status: SupervisorCycle[\"status\"];\n trigger: SupervisorCycle[\"trigger\"];\n evidence_source: SupervisorCycle[\"evidenceSource\"];\n objective: string;\n evaluator_provider_id: string;\n turn_id: string | null;\n progress: number | null;\n result: string | null;\n injected_guidance: string | null;\n error_reason: string | null;\n created_at: number;\n completed_at: number | null;\n}\n\nexport interface SupervisorCycleUpdatePatch {\n status?: SupervisorCycle[\"status\"];\n progress?: number | null;\n result?: string | null;\n injectedGuidance?: string | null;\n errorReason?: string | null;\n completedAt?: number | null;\n}\n\nexport class SupervisorCycleRepo {\n constructor(private readonly db: Database) {}\n\n create(input: SupervisorCycle): SupervisorCycle {\n this.db\n .prepare(\n `INSERT INTO supervisor_cycles (id, supervisor_id, session_id, status, trigger, evidence_source, objective, evaluator_provider_id, turn_id, progress, result, injected_guidance, error_reason, created_at, completed_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`\n )\n .run(\n input.id,\n input.supervisorId,\n input.sessionId,\n input.status,\n input.trigger,\n input.evidenceSource,\n input.objective,\n input.evaluatorProviderId,\n input.turnId ?? null,\n input.progress ?? null,\n input.result ?? null,\n input.injectedGuidance ?? null,\n input.errorReason ?? null,\n input.createdAt,\n input.completedAt ?? null\n );\n\n return this.findById(input.id)!;\n }\n\n findById(id: string): SupervisorCycle | undefined {\n const row = this.db.prepare(\"SELECT * FROM supervisor_cycles WHERE id = ?\").get(id) as\n | SupervisorCycleRow\n | undefined;\n return row ? this.rowToCycle(row) : undefined;\n }\n\n listRecentForSupervisor(supervisorId: string, limit: number): SupervisorCycle[] {\n const rows = this.db\n .prepare(\n \"SELECT * FROM supervisor_cycles WHERE supervisor_id = ? ORDER BY created_at DESC LIMIT ?\"\n )\n .all(supervisorId, limit) as unknown as SupervisorCycleRow[];\n return rows.map((row) => this.rowToCycle(row));\n }\n\n update(id: string, patch: SupervisorCycleUpdatePatch): SupervisorCycle {\n const assignments: string[] = [];\n const params: Record<string, number | string | null> = { id };\n\n if (patch.status !== undefined) {\n assignments.push(\"status = @status\");\n params.status = patch.status;\n }\n if (patch.progress !== undefined) {\n assignments.push(\"progress = @progress\");\n params.progress = patch.progress;\n }\n if (patch.result !== undefined) {\n assignments.push(\"result = @result\");\n params.result = patch.result;\n }\n if (patch.injectedGuidance !== undefined) {\n assignments.push(\"injected_guidance = @injectedGuidance\");\n params.injectedGuidance = patch.injectedGuidance;\n }\n if (patch.errorReason !== undefined) {\n assignments.push(\"error_reason = @errorReason\");\n params.errorReason = patch.errorReason;\n }\n if (patch.completedAt !== undefined) {\n assignments.push(\"completed_at = @completedAt\");\n params.completedAt = patch.completedAt;\n }\n\n if (assignments.length === 0) {\n const existing = this.findById(id);\n if (!existing) {\n throw new Error(`Supervisor cycle not found: ${id}`);\n }\n return existing;\n }\n\n const result = this.db\n .prepare(`UPDATE supervisor_cycles SET ${assignments.join(\", \")} WHERE id = @id`)\n .run(params);\n\n if (result.changes === 0) {\n throw new Error(`Supervisor cycle not found: ${id}`);\n }\n\n return this.findById(id)!;\n }\n\n pruneOldest(supervisorId: string, keep: number): void {\n this.db\n .prepare(\n `DELETE FROM supervisor_cycles\n WHERE id IN (\n SELECT id FROM supervisor_cycles\n WHERE supervisor_id = ?\n ORDER BY created_at DESC\n LIMIT -1 OFFSET ?\n )`\n )\n .run(supervisorId, keep);\n }\n\n private rowToCycle(row: SupervisorCycleRow): SupervisorCycle {\n return {\n id: row.id,\n supervisorId: row.supervisor_id,\n sessionId: row.session_id,\n status: row.status,\n trigger: row.trigger,\n evidenceSource: row.evidence_source,\n objective: row.objective,\n evaluatorProviderId: row.evaluator_provider_id,\n turnId: row.turn_id ?? undefined,\n progress: row.progress ?? undefined,\n result: row.result ?? undefined,\n injectedGuidance: row.injected_guidance ?? undefined,\n errorReason: row.error_reason ?? undefined,\n createdAt: row.created_at,\n completedAt: row.completed_at ?? undefined,\n };\n }\n}\n", "import type { Supervisor, SupervisorState, SupervisorStopReason } from \"@coder-studio/core\";\nimport type { Database } from \"../database.js\";\n\ninterface SupervisorRow {\n id: string;\n session_id: string;\n workspace_id: string;\n state: SupervisorState;\n objective: string;\n evaluator_provider_id: string;\n evaluator_model: string | null;\n max_supervision_count: number;\n completed_supervision_count: number;\n scheduled_at: number | null;\n stop_reason: SupervisorStopReason | null;\n last_cycle_at: number | null;\n last_evaluated_turn_id: string | null;\n error_reason: string | null;\n created_at: number;\n updated_at: number;\n}\n\nexport interface NewSupervisor {\n id: string;\n sessionId: string;\n workspaceId: string;\n state: SupervisorState;\n objective: string;\n evaluatorProviderId: string;\n evaluatorModel?: string;\n maxSupervisionCount: number;\n completedSupervisionCount: number;\n scheduledAt?: number;\n stopReason?: SupervisorStopReason;\n lastCycleAt?: number;\n lastEvaluatedTurnId?: string;\n errorReason?: string;\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface SupervisorUpdatePatch {\n state?: SupervisorState;\n objective?: string;\n evaluatorProviderId?: string;\n evaluatorModel?: string | null;\n maxSupervisionCount?: number;\n completedSupervisionCount?: number;\n scheduledAt?: number | null;\n stopReason?: SupervisorStopReason | null;\n lastCycleAt?: number | null;\n lastEvaluatedTurnId?: string | null;\n errorReason?: string | null;\n updatedAt?: number;\n}\n\nexport class SupervisorRepo {\n constructor(private readonly db: Database) {}\n\n create(input: NewSupervisor): Supervisor {\n this.db\n .prepare(\n `INSERT INTO supervisors (id, session_id, workspace_id, state, objective, evaluator_provider_id, evaluator_model, max_supervision_count, completed_supervision_count, scheduled_at, stop_reason, last_cycle_at, last_evaluated_turn_id, error_reason, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`\n )\n .run(\n input.id,\n input.sessionId,\n input.workspaceId,\n input.state,\n input.objective,\n input.evaluatorProviderId,\n input.evaluatorModel ?? null,\n input.maxSupervisionCount ?? 0,\n input.completedSupervisionCount ?? 0,\n input.scheduledAt ?? null,\n input.stopReason ?? null,\n input.lastCycleAt ?? null,\n input.lastEvaluatedTurnId ?? null,\n input.errorReason ?? null,\n input.createdAt,\n input.updatedAt\n );\n\n return this.findById(input.id)!;\n }\n\n findById(id: string): Supervisor | undefined {\n const row = this.db.prepare(\"SELECT * FROM supervisors WHERE id = ?\").get(id) as\n | SupervisorRow\n | undefined;\n return row ? this.rowToSupervisor(row) : undefined;\n }\n\n getBySessionId(sessionId: string): Supervisor | undefined {\n const row = this.db.prepare(\"SELECT * FROM supervisors WHERE session_id = ?\").get(sessionId) as\n | SupervisorRow\n | undefined;\n return row ? this.rowToSupervisor(row) : undefined;\n }\n\n listAll(): Supervisor[] {\n const rows = this.db\n .prepare(\"SELECT * FROM supervisors ORDER BY created_at ASC\")\n .all() as unknown as SupervisorRow[];\n return rows.map((row) => this.rowToSupervisor(row));\n }\n\n update(id: string, patch: SupervisorUpdatePatch): Supervisor {\n const assignments = [\"updated_at = @updatedAt\"];\n const params: Record<string, number | string | null> = {\n id,\n updatedAt: patch.updatedAt ?? Date.now(),\n };\n\n if (patch.state !== undefined) {\n assignments.push(\"state = @state\");\n params.state = patch.state;\n }\n if (patch.objective !== undefined) {\n assignments.push(\"objective = @objective\");\n params.objective = patch.objective;\n }\n if (patch.evaluatorProviderId !== undefined) {\n assignments.push(\"evaluator_provider_id = @evaluatorProviderId\");\n params.evaluatorProviderId = patch.evaluatorProviderId;\n }\n if (patch.evaluatorModel !== undefined) {\n assignments.push(\"evaluator_model = @evaluatorModel\");\n params.evaluatorModel = patch.evaluatorModel;\n }\n if (patch.maxSupervisionCount !== undefined) {\n assignments.push(\"max_supervision_count = @maxSupervisionCount\");\n params.maxSupervisionCount = patch.maxSupervisionCount;\n }\n if (patch.completedSupervisionCount !== undefined) {\n assignments.push(\"completed_supervision_count = @completedSupervisionCount\");\n params.completedSupervisionCount = patch.completedSupervisionCount;\n }\n if (patch.scheduledAt !== undefined) {\n assignments.push(\"scheduled_at = @scheduledAt\");\n params.scheduledAt = patch.scheduledAt;\n }\n if (patch.stopReason !== undefined) {\n assignments.push(\"stop_reason = @stopReason\");\n params.stopReason = patch.stopReason;\n }\n if (patch.lastCycleAt !== undefined) {\n assignments.push(\"last_cycle_at = @lastCycleAt\");\n params.lastCycleAt = patch.lastCycleAt;\n }\n if (patch.lastEvaluatedTurnId !== undefined) {\n assignments.push(\"last_evaluated_turn_id = @lastEvaluatedTurnId\");\n params.lastEvaluatedTurnId = patch.lastEvaluatedTurnId;\n }\n if (patch.errorReason !== undefined) {\n assignments.push(\"error_reason = @errorReason\");\n params.errorReason = patch.errorReason;\n }\n\n const result = this.db\n .prepare(`UPDATE supervisors SET ${assignments.join(\", \")} WHERE id = @id`)\n .run(params);\n\n if (result.changes === 0) {\n throw new Error(`Supervisor not found: ${id}`);\n }\n\n return this.findById(id)!;\n }\n\n delete(id: string): void {\n this.db.prepare(\"DELETE FROM supervisors WHERE id = ?\").run(id);\n }\n\n private rowToSupervisor(row: SupervisorRow): Supervisor {\n return {\n id: row.id,\n sessionId: row.session_id,\n workspaceId: row.workspace_id,\n targetId: row.id,\n state: row.state,\n objective: row.objective,\n evaluatorProviderId: row.evaluator_provider_id,\n evaluatorModel: row.evaluator_model ?? undefined,\n maxSupervisionCount: row.max_supervision_count,\n completedSupervisionCount: row.completed_supervision_count,\n scheduledAt: row.scheduled_at ?? undefined,\n stopReason: row.stop_reason ?? undefined,\n currentTargetMemory: undefined,\n recentTargetCycles: [],\n cycles: [],\n lastCycleAt: row.last_cycle_at ?? undefined,\n lastEvaluatedTurnId: row.last_evaluated_turn_id ?? undefined,\n errorReason: row.error_reason ?? undefined,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n };\n }\n}\n", "export interface RenderOptions {\n maxLines: number;\n maxChars: number;\n}\n\nexport function stripAnsi(text: string): string {\n return text\n .replace(/\\x1b\\[[0-9;<>?]*[a-zA-Z>=~]/g, \"\")\n .replace(/\\x1b\\][^\\x07\\x1b]*(?:\\x07|\\x1b\\\\)/g, \"\")\n .replace(/\\x1b/g, \"\")\n .trim();\n}\n\nexport function renderSnapshotToText(data: Buffer, options: RenderOptions): string {\n const text = stripAnsi(data.toString(\"utf8\"));\n const lines = text.split(\"\\n\");\n\n while (lines.length > 0 && lines.at(-1)?.trim() === \"\") {\n lines.pop();\n }\n\n return lines.slice(-options.maxLines).join(\"\\n\").slice(-options.maxChars);\n}\n", "import type {\n ProviderDefinition,\n SessionState,\n Supervisor,\n SupervisorTargetMemory,\n} from \"@coder-studio/core\";\nimport type { FastifyBaseLogger } from \"fastify\";\nimport type { SessionManager } from \"../session/manager.js\";\nimport type { TerminalManager } from \"../terminal/manager.js\";\nimport type { WorkspaceManager } from \"../workspace/manager.js\";\n\nexport { stripAnsi } from \"../terminal/snapshot-render.js\";\n\nconst NOOP_LOGGER: FastifyBaseLogger = {\n child: () => NOOP_LOGGER,\n debug: () => {},\n error: () => {},\n fatal: () => {},\n info: () => {},\n level: \"silent\",\n silent: () => {},\n trace: () => {},\n warn: () => {},\n};\n\nconst TERMINAL_MAX_LINES = 200;\nconst TERMINAL_MAX_CHARS = 12_000;\nexport interface SupervisorEvaluationContext {\n objective: string;\n sessionId: string;\n workspaceId: string;\n workspacePath: string;\n sessionProviderId: string;\n evaluatorProviderId: string;\n sessionState: SessionState;\n transcriptExcerpt?: string;\n terminalExcerpt?: string;\n lastTurnId?: string;\n evidenceSource: \"headless_snapshot\" | \"transcript\" | \"terminal_fallback\";\n /** Latest user input from the current turn (for supervisor context) */\n latestUserInput?: string;\n targetMemory: SupervisorTargetMemory;\n}\n\nexport class SupervisorContextBuilder {\n private readonly logger: FastifyBaseLogger;\n\n constructor(\n private readonly deps: {\n workspaceMgr: WorkspaceManager;\n sessionMgr: SessionManager;\n terminalMgr: TerminalManager;\n providerRegistry: ProviderDefinition[];\n logger?: FastifyBaseLogger;\n }\n ) {\n this.logger = deps.logger ?? NOOP_LOGGER;\n }\n\n async build(\n supervisor: Supervisor,\n targetMemory: SupervisorTargetMemory\n ): Promise<SupervisorEvaluationContext> {\n const session = this.deps.sessionMgr.get(supervisor.sessionId);\n const workspace = this.deps.workspaceMgr.get(supervisor.workspaceId);\n\n if (!session || !workspace) {\n throw {\n code: \"supervisor_not_found\",\n message: \"Supervisor session context is unavailable\",\n };\n }\n\n let renderedSnapshot = \"\";\n try {\n renderedSnapshot = await this.deps.sessionMgr.getRenderedSnapshot(session.id, {\n maxLines: TERMINAL_MAX_LINES,\n maxChars: TERMINAL_MAX_CHARS,\n });\n } catch (error) {\n this.logger.warn(\n { err: error, sessionId: session.id },\n \"Supervisor headless snapshot read failed\"\n );\n }\n\n const latestUserInput = this.deps.sessionMgr.getLatestSubmittedUserInput(session.id);\n\n this.logger.info(\n {\n metric: \"supervisor.evidence.built\",\n sessionId: session.id,\n workspaceId: workspace.id,\n evidenceSource: \"headless_snapshot\",\n terminalCharCount: renderedSnapshot.length,\n },\n \"supervisor evidence built\"\n );\n\n return {\n objective: supervisor.objective,\n sessionId: session.id,\n workspaceId: workspace.id,\n workspacePath: workspace.path,\n sessionProviderId: session.providerId,\n evaluatorProviderId: supervisor.evaluatorProviderId,\n sessionState: session.state,\n transcriptExcerpt: undefined,\n terminalExcerpt: renderedSnapshot,\n lastTurnId: undefined,\n evidenceSource: \"headless_snapshot\",\n latestUserInput,\n targetMemory,\n };\n }\n}\n", "/**\n * PTY Host Implementation\n *\n * Concrete implementation of PtyHost using node-pty\n */\n\nimport { chmodSync, existsSync, statSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { resolveSpawnArgv } from \"@coder-studio/utils\";\nimport type * as NodePty from \"node-pty\";\nimport type { PtyHost, PtyProcess, PtySpawnOptions } from \"./types.js\";\n\nconst require = createRequire(import.meta.url);\nconst NODE_PTY_PKG = \"node-pty/package.json\";\n\n/**\n * Options for kill escalation polling\n */\nexport interface KillEscalationOptions {\n /** Poll interval in milliseconds */\n pollIntervalMs?: number;\n /** Maximum time to wait before escalating to SIGKILL */\n timeoutMs?: number;\n}\n\n/** Default polling interval */\nconst DEFAULT_POLL_INTERVAL_MS = 50;\n\n/** Default timeout before SIGKILL escalation */\nconst DEFAULT_TIMEOUT_MS = 2000;\n\nexport function ensureNodePtySpawnHelperExecutable(\n deps: {\n platform?: NodeJS.Platform;\n arch?: NodeJS.Architecture;\n resolve?: (id: string) => string;\n existsSync?: (path: string) => boolean;\n statSync?: (path: string) => { mode: number };\n chmodSync?: (path: string, mode: number) => void;\n } = {}\n): void {\n const platform = deps.platform ?? process.platform;\n if (platform !== \"darwin\") {\n return;\n }\n const arch = deps.arch ?? process.arch;\n\n const resolve = deps.resolve ?? ((id: string) => require.resolve(id));\n const fileExists = deps.existsSync ?? existsSync;\n const stat = deps.statSync ?? statSync;\n const chmod = deps.chmodSync ?? chmodSync;\n\n let packageJsonPath: string;\n try {\n packageJsonPath = resolve(NODE_PTY_PKG);\n } catch {\n return;\n }\n\n const packageDir = path.dirname(packageJsonPath);\n const helperDir = arch === \"arm64\" ? \"darwin-arm64\" : arch === \"x64\" ? \"darwin-x64\" : null;\n if (!helperDir) {\n return;\n }\n\n const helperPath = path.join(packageDir, \"prebuilds\", helperDir, \"spawn-helper\");\n\n try {\n if (!fileExists(helperPath)) {\n return;\n }\n\n const currentMode = stat(helperPath).mode;\n const executableMode = currentMode | 0o111;\n if (executableMode === currentMode) {\n return;\n }\n\n chmod(helperPath, executableMode);\n } catch {\n // Best-effort repair only. Fall back to node-pty's normal startup path.\n }\n}\n\n/**\n * Send signal to process and all its children (process group)\n *\n * @param pid - Process ID (will use -pid for process group)\n * @param signal - Signal to send\n * @returns true if signal was sent successfully, false otherwise\n */\nexport function killProcessGroup(pid: number, signal: NodeJS.Signals): boolean {\n try {\n // Negative PID means kill the process group\n // This ensures all child processes are terminated as well\n process.kill(-pid, signal);\n return true;\n } catch {\n // Fallback to regular kill if process group doesn't exist\n try {\n process.kill(pid, signal);\n return true;\n } catch {\n return false;\n }\n }\n}\n\n/**\n * Check if a process group or process is still alive\n *\n * Mirrors the same group-first, pid-fallback semantics used when sending signals.\n *\n * @param pid - Process ID (will use -pid for process group first)\n * @returns true if the process group or process exists, false otherwise\n */\nfunction isProcessAlive(pid: number): boolean {\n try {\n process.kill(-pid, 0);\n return true;\n } catch {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n }\n}\n\n/**\n * Escalate from SIGTERM to SIGKILL with polling\n *\n * This function sends SIGTERM, then polls to check if the process\n * has exited. If it hasn't exited within the timeout window, SIGKILL\n * is sent.\n *\n * @param pid - Process ID\n * @param signal - Initial signal to send\n * @param options - Polling options\n * @returns Promise resolving to true if any signal was sent, false if initial signal failed\n */\nexport async function escalateKillWithPolling(\n pid: number,\n signal: NodeJS.Signals,\n options?: KillEscalationOptions\n): Promise<boolean> {\n const pollIntervalMs = options?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n // For non-SIGTERM signals, just send directly without polling\n if (signal !== \"SIGTERM\") {\n return killProcessGroup(pid, signal);\n }\n\n // Send SIGTERM\n const sent = killProcessGroup(pid, \"SIGTERM\");\n if (!sent) {\n return false;\n }\n\n // Check immediately if process already exited\n if (!isProcessAlive(pid)) {\n return true;\n }\n\n // Poll until timeout\n const startTime = Date.now();\n const deadline = startTime + timeoutMs;\n\n while (Date.now() < deadline) {\n // Wait for next poll interval\n await new Promise((resolve) => setTimeout(resolve, pollIntervalMs));\n\n // Check if process group has exited\n if (!isProcessAlive(pid)) {\n return true;\n }\n }\n\n // Process survived timeout, escalate to SIGKILL\n killProcessGroup(pid, \"SIGKILL\");\n return true;\n}\n\n/**\n * Real PTY host using node-pty\n * Note: node-pty is loaded lazily to avoid native module loading errors during startup\n */\nexport class NodePtyHost implements PtyHost {\n spawn(argv: string[], options: PtySpawnOptions): PtyProcess {\n ensureNodePtySpawnHelperExecutable();\n\n // Lazy load node-pty to avoid native module loading errors\n let pty: typeof NodePty;\n try {\n pty = require(\"node-pty\");\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n throw new Error(`node-pty native module not available. ${message}`);\n }\n\n if (argv.length === 0) {\n throw new Error(\"PTY spawn requires a command\");\n }\n\n // On Windows, node-pty calls Win32 CreateProcess directly and cannot run\n // .cmd/.bat shims. resolveSpawnArgv walks PATH+PATHEXT and unwraps\n // npm-style cmd-shims into a `node <entry.js>` invocation. On non-win32\n // platforms this returns argv unchanged.\n const [command, ...args] = resolveSpawnArgv(argv, {\n pathEnv: options.env.Path ?? options.env.PATH,\n pathExt: options.env.PATHEXT,\n });\n if (command === undefined) {\n throw new Error(\"PTY spawn requires a command\");\n }\n\n const ptyProcess = pty.spawn(command, args, {\n cwd: options.cwd,\n env: options.env,\n cols: options.cols,\n rows: options.rows,\n });\n\n return {\n onData: (callback) => {\n ptyProcess.onData(callback);\n },\n onExit: (callback) => {\n ptyProcess.onExit(({ exitCode }: { exitCode: number }) => callback({ exitCode }));\n },\n write: (data) => {\n if (Buffer.isBuffer(data)) {\n ptyProcess.write(data.toString(\"utf-8\"));\n } else {\n ptyProcess.write(data);\n }\n },\n resize: (cols, rows) => {\n ptyProcess.resize(cols, rows);\n },\n kill: async (signal: NodeJS.Signals = \"SIGTERM\") => {\n const pid = ptyProcess.pid;\n\n if (pid > 0) {\n // First try node-pty's built-in kill\n try {\n ptyProcess.kill(signal);\n } catch {\n // Ignore errors from ptyProcess.kill\n }\n\n // Also send to process group to ensure child processes are terminated\n // This handles cases where shell spawns child processes\n try {\n await escalateKillWithPolling(pid, signal);\n } catch {\n // Silently ignore errors from escalation polling\n }\n }\n },\n };\n }\n}\n", "import {\n DEFAULT_SUPERVISOR_EVALUATION_TIMEOUT_SEC,\n DEFAULT_SUPERVISOR_RETRY_DELAY_SEC,\n DEFAULT_SUPERVISOR_RETRY_ENABLED,\n DEFAULT_SUPERVISOR_RETRY_MAX_COUNT,\n DEFAULT_SUPERVISOR_RETRY_ON_EVALUATOR_ERROR,\n DEFAULT_SUPERVISOR_RETRY_ON_TIMEOUT,\n resolveSupervisorEvaluationTimeoutSec,\n resolveSupervisorRetryDelaySec,\n resolveSupervisorRetryEnabled,\n resolveSupervisorRetryMaxCount,\n resolveSupervisorRetryOnEvaluatorError,\n resolveSupervisorRetryOnTimeout,\n} from \"@coder-studio/core\";\nimport type { SettingsRepo } from \"../storage/repositories/settings-repo.js\";\n\nexport const SUPERVISOR_EVALUATION_TIMEOUT_SETTING_KEY = \"supervisor.evaluationTimeoutSec\";\nexport const SUPERVISOR_RETRY_ENABLED_SETTING_KEY = \"supervisor.retryEnabled\";\nexport const SUPERVISOR_RETRY_MAX_COUNT_SETTING_KEY = \"supervisor.retryMaxCount\";\nexport const SUPERVISOR_RETRY_DELAY_SEC_SETTING_KEY = \"supervisor.retryDelaySec\";\nexport const SUPERVISOR_RETRY_ON_TIMEOUT_SETTING_KEY = \"supervisor.retryOnTimeout\";\nexport const SUPERVISOR_RETRY_ON_EVALUATOR_ERROR_SETTING_KEY = \"supervisor.retryOnEvaluatorError\";\n\nexport interface SupervisorRetrySettings {\n retryEnabled: boolean;\n retryMaxCount: number;\n retryDelaySec: number;\n retryOnTimeout: boolean;\n retryOnEvaluatorError: boolean;\n}\n\nexport function getSupervisorEvaluationTimeoutMs(settingsRepo?: Pick<SettingsRepo, \"get\">): number {\n let storedValue: number | undefined;\n try {\n storedValue = settingsRepo?.get<number>(SUPERVISOR_EVALUATION_TIMEOUT_SETTING_KEY);\n } catch {\n storedValue = DEFAULT_SUPERVISOR_EVALUATION_TIMEOUT_SEC;\n }\n\n const timeoutSec = resolveSupervisorEvaluationTimeoutSec(storedValue);\n return timeoutSec * 1000;\n}\n\nfunction getSettingOrDefault<T>(\n settingsRepo: Pick<SettingsRepo, \"get\"> | undefined,\n key: string,\n fallback: T\n): T {\n try {\n return (settingsRepo?.get<T>(key) ?? fallback) as T;\n } catch {\n return fallback;\n }\n}\n\nexport function getSupervisorRetrySettings(\n settingsRepo?: Pick<SettingsRepo, \"get\">\n): SupervisorRetrySettings {\n return {\n retryEnabled: resolveSupervisorRetryEnabled(\n getSettingOrDefault(\n settingsRepo,\n SUPERVISOR_RETRY_ENABLED_SETTING_KEY,\n DEFAULT_SUPERVISOR_RETRY_ENABLED\n )\n ),\n retryMaxCount: resolveSupervisorRetryMaxCount(\n getSettingOrDefault(\n settingsRepo,\n SUPERVISOR_RETRY_MAX_COUNT_SETTING_KEY,\n DEFAULT_SUPERVISOR_RETRY_MAX_COUNT\n )\n ),\n retryDelaySec: resolveSupervisorRetryDelaySec(\n getSettingOrDefault(\n settingsRepo,\n SUPERVISOR_RETRY_DELAY_SEC_SETTING_KEY,\n DEFAULT_SUPERVISOR_RETRY_DELAY_SEC\n )\n ),\n retryOnTimeout: resolveSupervisorRetryOnTimeout(\n getSettingOrDefault(\n settingsRepo,\n SUPERVISOR_RETRY_ON_TIMEOUT_SETTING_KEY,\n DEFAULT_SUPERVISOR_RETRY_ON_TIMEOUT\n )\n ),\n retryOnEvaluatorError: resolveSupervisorRetryOnEvaluatorError(\n getSettingOrDefault(\n settingsRepo,\n SUPERVISOR_RETRY_ON_EVALUATOR_ERROR_SETTING_KEY,\n DEFAULT_SUPERVISOR_RETRY_ON_EVALUATOR_ERROR\n )\n ),\n };\n}\n", "import { spawn } from \"node:child_process\";\nimport {\n DEFAULT_SUPERVISOR_CONFIG,\n type ProviderDefinition,\n type Supervisor,\n type SupervisorConfig,\n type SupervisorCycleStepUpdate,\n type SupervisorPlanStep,\n type SupervisorStopReason,\n} from \"@coder-studio/core\";\nimport type { FastifyBaseLogger } from \"fastify\";\nimport { mergeProviderLaunchConfig } from \"../provider-config.js\";\nimport type { ProviderConfigRepo } from \"../storage/repositories/provider-config-repo.js\";\nimport type { SettingsRepo } from \"../storage/repositories/settings-repo.js\";\nimport { escalateKillWithPolling } from \"../terminal/pty-host.js\";\nimport type { SupervisorEvaluationContext } from \"./context-builder.js\";\nimport { getSupervisorEvaluationTimeoutMs } from \"./settings.js\";\n\nconst NOOP_LOGGER: FastifyBaseLogger = {\n child: () => NOOP_LOGGER,\n debug: () => {},\n error: () => {},\n fatal: () => {},\n info: () => {},\n level: \"silent\",\n silent: () => {},\n trace: () => {},\n warn: () => {},\n};\n\nexport interface SupervisorEvaluationResult {\n status: \"continue\" | \"stop\";\n stopReason?: Extract<SupervisorStopReason, \"objective_complete\" | \"supervisor_uncertain\">;\n reason: string;\n guidance?: string;\n plan?: SupervisorPlanStep[];\n activeStepId?: string;\n progressSummary?: string;\n stepUpdates?: SupervisorCycleStepUpdate[];\n}\n\nexport type SupervisorResult = SupervisorEvaluationResult;\n\ninterface EvaluateOptions {\n signal?: AbortSignal;\n}\n\nexport class SupervisorEvaluator {\n private readonly config: SupervisorConfig;\n private readonly logger: FastifyBaseLogger;\n\n constructor(\n private readonly deps: {\n providerRegistry: ProviderDefinition[];\n providerConfigRepo: ProviderConfigRepo;\n settingsRepo?: Pick<SettingsRepo, \"get\">;\n timeoutMs?: number;\n config?: SupervisorConfig;\n logger?: FastifyBaseLogger;\n }\n ) {\n this.config = deps.config ?? DEFAULT_SUPERVISOR_CONFIG;\n this.logger = deps.logger ?? NOOP_LOGGER;\n }\n\n async evaluate(\n supervisor: Supervisor,\n context: SupervisorEvaluationContext,\n options: EvaluateOptions = {}\n ): Promise<SupervisorEvaluationResult> {\n const provider = this.deps.providerRegistry.find(\n (item) => item.id === supervisor.evaluatorProviderId\n );\n if (!provider?.buildSupervisorEvalCommand) {\n throw {\n code: \"supervisor_invalid_evaluator_provider\",\n message: \"Evaluator provider does not support headless eval\",\n };\n }\n\n const config = mergeProviderLaunchConfig(\n provider,\n this.deps.providerConfigRepo.get(provider.id)\n );\n\n const prompt = buildPrompt(context);\n const command = provider.buildSupervisorEvalCommand(config, {\n prompt,\n sessionId: supervisor.sessionId,\n workspacePath: context.workspacePath,\n model:\n typeof supervisor.evaluatorModel === \"string\" && supervisor.evaluatorModel.trim()\n ? supervisor.evaluatorModel.trim()\n : typeof config.model === \"string\"\n ? config.model\n : undefined,\n });\n\n if (!command) {\n throw {\n code: \"supervisor_invalid_evaluator_provider\",\n message: \"Evaluator provider returned null command\",\n };\n }\n\n const stdout = await runCommand(\n command,\n this.deps.timeoutMs ?? getSupervisorEvaluationTimeoutMs(this.deps.settingsRepo),\n options\n );\n\n let payloadText: string;\n try {\n payloadText = extractSupervisorPayload(stdout, provider.id);\n } catch (error) {\n const lines = stdout.trim().split(/\\r?\\n/).filter(Boolean);\n debugCodexUnparseableOutput(\n this.logger,\n supervisor,\n context,\n command,\n prompt,\n stdout,\n scanCodexStream(lines)\n );\n throw error;\n }\n\n return parseSupervisorEvaluationResult(payloadText, this.config.guidanceMaxChars);\n }\n}\n\nfunction buildPrompt(context: SupervisorEvaluationContext): string {\n const lines: string[] = [\n \"You are an autonomous supervisor for a target-scoped software task.\",\n \"Your job is to keep the agent moving toward the objective until the objective is complete.\",\n \"\",\n \"Return JSON only.\",\n \"\",\n \"Decision policy:\",\n '- Prefer \"continue\" whenever there is a reasonable next action.',\n \"- Do not ask the user to decide, clarify, or choose among implementation options.\",\n \"- When information is incomplete, choose a conservative next action based on the objective, target memory, latest user input, and terminal snapshot.\",\n \"- Stop only when the objective is complete, or when continuing would likely push the agent in an unsafe or clearly unsupported direction.\",\n \"\",\n \"Stage decision policy:\",\n \"- Use the target memory as the current supervision state.\",\n \"- Base your decision on the objective, current plan, activeStepId, progressSummary, lastGuidance, stalledCount, latest user input, and terminal snapshot.\",\n \"- Identify which plan step is currently active.\",\n \"- Decide whether the active step is done, still in progress, blocked, or obsolete.\",\n \"- If the active step is done, advance to the next useful step.\",\n \"- If the active step is still in progress, give guidance that moves it forward.\",\n \"- If the agent appears stuck or repeated the same action, give a different concrete next action.\",\n \"- If the plan is obsolete, update only the affected steps unless a full replacement is necessary.\",\n \"\",\n \"Allowed statuses:\",\n '- \"continue\": more work is needed; include \"reason\" and \"guidance\".',\n '- \"stop\": supervision should stop; include \"stopReason\" and \"reason\".',\n \"\",\n \"Allowed stop reasons:\",\n '- \"objective_complete\"',\n '- \"supervisor_uncertain\"',\n \"\",\n 'Use \"objective_complete\" only when the objective has been satisfied.',\n 'Use \"supervisor_uncertain\" only as a last resort when no useful next action can be inferred and additional guidance would likely be misleading.',\n \"\",\n 'Guidance requirements for \"continue\":',\n \"- Give one concrete next action or a short ordered set of concrete actions.\",\n \"- Focus on the highest-value step toward completing the objective.\",\n \"- Be specific enough for the supervised agent to act without asking the user.\",\n \"- Avoid generic reminders, encouragement, or restating the objective.\",\n \"- If verification is needed, tell the agent exactly what to verify next.\",\n \"- If implementation is needed, point to the likely area, behavior, or file/module based on available evidence.\",\n \"\",\n \"Planning policy:\",\n \"- If planGenerated is false, include a plan with 3 to 7 milestone-sized steps.\",\n \"- If planGenerated is true, update progress incrementally.\",\n \"- Do not rewrite the full plan unless the existing plan is clearly wrong or obsolete.\",\n \"- Use stepUpdates to mark completed or active steps when the terminal snapshot shows progress.\",\n \"- Keep activeStepId aligned with the next useful step.\",\n \"\",\n \"Output schema:\",\n \"For continue:\",\n \"{\",\n ' \"status\": \"continue\",',\n ' \"reason\": \"brief explanation of why more work is needed\",',\n ' \"guidance\": \"specific next action for the supervised agent\",',\n ' \"plan\": optional array of plan steps,',\n ' \"activeStepId\": optional step id,',\n ' \"progressSummary\": optional brief progress summary,',\n ' \"stepUpdates\": optional array of { \"id\": string, \"status\": \"pending\" | \"in_progress\" | \"done\" }',\n \"}\",\n \"\",\n \"For stop:\",\n \"{\",\n ' \"status\": \"stop\",',\n ' \"stopReason\": \"objective_complete\" | \"supervisor_uncertain\",',\n ' \"reason\": \"brief explanation\"',\n \"}\",\n \"\",\n \"Current objective:\",\n context.objective,\n \"\",\n \"Current target memory:\",\n JSON.stringify(context.targetMemory, null, 2),\n \"\",\n \"Latest user input:\",\n context.latestUserInput?.trim() || \"(none)\",\n \"\",\n \"Current terminal snapshot:\",\n context.terminalExcerpt || \"(no output yet)\",\n ];\n\n return lines.join(\"\\n\");\n}\n\nasync function runCommand(\n command: { argv: string[]; cwd?: string; env?: Record<string, string> },\n timeoutMs: number,\n options: EvaluateOptions = {}\n): Promise<string> {\n if (options.signal?.aborted) {\n throw createSupervisorEvalAbortedError();\n }\n\n return await new Promise((resolve, reject) => {\n const child = spawn(command.argv[0]!, command.argv.slice(1), {\n cwd: command.cwd,\n detached: process.platform !== \"win32\",\n env: { ...process.env, ...command.env },\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n windowsHide: true,\n });\n\n const stdout: Buffer[] = [];\n const stderr: Buffer[] = [];\n let settled = false;\n let terminationError: {\n code: \"supervisor_eval_timeout\" | \"supervisor_eval_aborted\";\n message: string;\n } | null = null;\n\n const cleanup = () => {\n clearTimeout(timer);\n options.signal?.removeEventListener(\"abort\", onAbort);\n };\n\n const settleReject = (error: unknown) => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n reject(error);\n };\n\n const settleResolve = (value: string) => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n resolve(value);\n };\n\n const terminate = (error: {\n code: \"supervisor_eval_timeout\" | \"supervisor_eval_aborted\";\n message: string;\n }) => {\n if (terminationError) {\n return;\n }\n terminationError = error;\n\n if (typeof child.pid !== \"number\" || child.pid <= 0) {\n settleReject(error);\n return;\n }\n\n void escalateKillWithPolling(child.pid, \"SIGTERM\").catch(() => {\n // Best-effort only. The exit/error event still decides final settlement.\n });\n };\n\n const onAbort = () => {\n terminate(createSupervisorEvalAbortedError());\n };\n\n const timer = setTimeout(() => {\n terminate({\n code: \"supervisor_eval_timeout\",\n message: `Supervisor evaluator timed out after ${timeoutMs}ms`,\n });\n }, timeoutMs);\n\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n child.stdout?.on(\"data\", (chunk) => stdout.push(Buffer.from(chunk)));\n child.stderr?.on(\"data\", (chunk) => stderr.push(Buffer.from(chunk)));\n child.on(\"error\", (error) => {\n if (terminationError) {\n settleReject(terminationError);\n return;\n }\n settleReject(error);\n });\n child.on(\"exit\", (code) => {\n if (terminationError) {\n settleReject(terminationError);\n return;\n }\n if (code !== 0) {\n settleReject({\n code: \"supervisor_eval_failed\",\n message:\n Buffer.concat(stderr).toString(\"utf8\").trim() || `Evaluator exited with code ${code}`,\n });\n return;\n }\n\n settleResolve(Buffer.concat(stdout).toString(\"utf8\"));\n });\n });\n}\n\nfunction createSupervisorEvalAbortedError(): {\n code: \"supervisor_eval_aborted\";\n message: string;\n} {\n return {\n code: \"supervisor_eval_aborted\",\n message: \"Supervisor evaluator aborted\",\n };\n}\n\n/**\n * Strip a ```json \u2026 ``` (or bare ```\u2026```) markdown fence if present.\n */\nfunction stripCodeFence(text: string): string {\n const fenced = text.match(/```(?:json|JSON)?\\s*\\n?([\\s\\S]*?)\\n?```/);\n return fenced ? fenced[1]!.trim() : text;\n}\n\ntype CodexCompletedCandidate = {\n sourceType: \"agent_message\" | \"assistant_message\" | \"command_execution\" | \"reasoning\";\n content: string;\n};\n\ninterface CodexStreamScan {\n /** Completed items that may contain the final evaluator payload. */\n completedItemCandidates: CodexCompletedCandidate[];\n /** True if any recognizable codex event was seen (thread/turn/item). */\n isCodexStream: boolean;\n /** True if the stream included a `turn.completed` event. */\n turnCompleted: boolean;\n /** Populated when the stream reported `turn.failed`. */\n turnFailure: string | null;\n /** Total output_tokens reported by `turn.completed`, if any. */\n outputTokens: number | null;\n}\n\n/**\n * Walk a codex `exec --json` JSONL stream and collect completed-item content\n * that may contain the model's final answer.\n */\nfunction scanCodexStream(lines: string[]): CodexStreamScan {\n const scan: CodexStreamScan = {\n completedItemCandidates: [],\n isCodexStream: false,\n turnCompleted: false,\n turnFailure: null,\n outputTokens: null,\n };\n\n for (const line of lines) {\n let event: unknown;\n try {\n event = JSON.parse(line);\n } catch {\n continue;\n }\n if (!event || typeof event !== \"object\") {\n continue;\n }\n const record = event as Record<string, unknown>;\n const type = record.type;\n\n if (\n type === \"thread.started\" ||\n type === \"turn.started\" ||\n type === \"turn.completed\" ||\n type === \"turn.failed\" ||\n type === \"item.started\" ||\n type === \"item.updated\" ||\n type === \"item.completed\"\n ) {\n scan.isCodexStream = true;\n }\n\n if (type === \"turn.completed\") {\n scan.turnCompleted = true;\n const usage = record.usage;\n if (\n usage &&\n typeof usage === \"object\" &&\n typeof (usage as Record<string, unknown>).output_tokens === \"number\"\n ) {\n scan.outputTokens = (usage as Record<string, unknown>).output_tokens as number;\n }\n }\n\n if (type === \"turn.failed\") {\n const error = record.error;\n if (\n error &&\n typeof error === \"object\" &&\n typeof (error as Record<string, unknown>).message === \"string\"\n ) {\n scan.turnFailure = (error as Record<string, unknown>).message as string;\n } else {\n scan.turnFailure = \"codex turn failed\";\n }\n }\n\n if (type === \"item.completed\") {\n const item = record.item;\n if (!item || typeof item !== \"object\") {\n continue;\n }\n const itemRecord = item as Record<string, unknown>;\n const itemType = itemRecord.type ?? itemRecord.item_type;\n if (\n (itemType === \"agent_message\" ||\n itemType === \"assistant_message\" ||\n itemType === \"reasoning\") &&\n typeof itemRecord.text === \"string\"\n ) {\n scan.completedItemCandidates.push({\n sourceType: itemType,\n content: itemRecord.text,\n });\n continue;\n }\n if (itemType === \"command_execution\" && typeof itemRecord.aggregated_output === \"string\") {\n scan.completedItemCandidates.push({\n sourceType: \"command_execution\",\n content: itemRecord.aggregated_output,\n });\n }\n }\n }\n\n return scan;\n}\n\nfunction buildStdoutPreview(output: string, maxChars = 4000): string {\n return output.length <= maxChars\n ? output\n : `${output.slice(0, maxChars)}\\n\u2026[truncated ${output.length - maxChars} chars]`;\n}\n\nfunction debugCodexUnparseableOutput(\n logger: FastifyBaseLogger,\n supervisor: Supervisor,\n context: SupervisorEvaluationContext,\n command: { argv: string[]; cwd?: string; env?: Record<string, string> },\n prompt: string,\n output: string,\n scan: CodexStreamScan\n): void {\n logger.warn(\n {\n supervisorId: supervisor.id,\n sessionId: supervisor.sessionId,\n evaluatorProviderId: supervisor.evaluatorProviderId,\n sessionProviderId: context.sessionProviderId,\n outputTokens: scan.outputTokens,\n turnCompleted: scan.turnCompleted,\n turnFailure: scan.turnFailure,\n completedItemCandidateCount: scan.completedItemCandidates.length,\n completedItemCandidates: scan.completedItemCandidates.map((candidate, index) => ({\n index,\n sourceType: candidate.sourceType,\n contentPreview: buildStdoutPreview(candidate.content, 500),\n })),\n commandArgv: command.argv,\n commandCwd: command.cwd,\n prompt,\n rawStdout: buildStdoutPreview(output),\n },\n \"Supervisor evaluator debug: codex output was not parseable\"\n );\n}\n\n/**\n * Extract the supervisor's payload text from the provider's output.\n * For Codex: scans JSONL stream for agent_message/reasoning items.\n * For Claude: parses the result envelope or plain text.\n */\nfunction extractSupervisorPayload(output: string, providerId: string): string {\n const trimmed = output.trim();\n if (!trimmed) {\n throw new Error(\"Supervisor returned empty output\");\n }\n\n const lines = trimmed.split(/\\r?\\n/).filter(Boolean);\n\n if (providerId === \"codex\") {\n if (!trimmed.startsWith(\"{\") && !trimmed.startsWith(\"[\")) {\n return stripCodeFence(trimmed);\n }\n\n const scan = scanCodexStream(lines);\n\n if (!scan.isCodexStream && (trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\"))) {\n return stripCodeFence(trimmed);\n }\n\n if (scan.turnFailure) {\n throw new Error(`Supervisor (codex) failed: ${scan.turnFailure}`);\n }\n\n // Prefer agent_message, then reasoning, then assistant_message.\n // Iterate in reverse so the last occurrence wins.\n for (let i = scan.completedItemCandidates.length - 1; i >= 0; i--) {\n const candidate = scan.completedItemCandidates[i]!;\n if (\n candidate.sourceType === \"agent_message\" ||\n candidate.sourceType === \"reasoning\" ||\n candidate.sourceType === \"assistant_message\"\n ) {\n const stripped = stripCodeFence(candidate.content).trim();\n if (stripped) {\n return stripped;\n }\n }\n }\n\n // Last resort: try to extract plain text from any line\n for (let i = lines.length - 1; i >= 0; i--) {\n const line = lines[i]!;\n // Skip obvious JSON/event lines\n if (line.startsWith(\"{\") || line.startsWith(\"[\")) {\n continue;\n }\n const text = line.trim();\n if (text && !scan.isCodexStream) {\n return stripCodeFence(text);\n }\n }\n\n // Codex stream but no agent_message found\n const tokenHint = scan.outputTokens !== null ? ` (${scan.outputTokens} output tokens)` : \"\";\n throw new Error(\"Supervisor (codex) completed without returning a message\" + tokenHint);\n }\n\n // Claude path: try result envelope, then plain text\n for (let i = lines.length - 1; i >= 0; i--) {\n const line = lines[i]!;\n try {\n const parsed = JSON.parse(line);\n if (typeof parsed === \"object\" && parsed !== null && \"result\" in parsed) {\n const result = (parsed as Record<string, unknown>).result;\n if (typeof result === \"string\") {\n return stripCodeFence(result).trim();\n }\n }\n } catch {\n // not JSON, continue\n }\n }\n\n // Plain text: use the last non-empty line\n for (let i = lines.length - 1; i >= 0; i--) {\n const text = lines[i]!.trim();\n if (text) {\n return stripCodeFence(text);\n }\n }\n\n throw new Error(\"Supervisor did not return a recognizable message\");\n}\n\nfunction parseSupervisorEvaluationResult(\n payloadText: string,\n guidanceMaxChars: number\n): SupervisorEvaluationResult {\n let parsed: unknown;\n try {\n parsed = JSON.parse(stripCodeFence(payloadText));\n } catch (error) {\n throw new Error(\n `Supervisor returned invalid JSON: ${error instanceof Error ? error.message : \"parse failed\"}`\n );\n }\n\n if (!parsed || typeof parsed !== \"object\") {\n throw new Error(\"Supervisor returned invalid evaluation payload\");\n }\n\n const record = parsed as Record<string, unknown>;\n const status = record.status;\n const reason = record.reason;\n\n if (\n (status !== \"continue\" && status !== \"stop\") ||\n typeof reason !== \"string\" ||\n !reason.trim()\n ) {\n throw new Error(\"Supervisor returned invalid evaluation payload\");\n }\n\n if (status === \"stop\") {\n const stopReason = record.stopReason;\n if (stopReason !== \"objective_complete\" && stopReason !== \"supervisor_uncertain\") {\n throw new Error(\"Supervisor stop result is missing a valid stopReason\");\n }\n\n return {\n status,\n stopReason,\n reason: reason.trim(),\n };\n }\n\n const guidance =\n typeof record.guidance === \"string\" && record.guidance.trim()\n ? record.guidance.trim().slice(0, guidanceMaxChars)\n : undefined;\n\n const plan: SupervisorPlanStep[] | undefined = Array.isArray(record.plan)\n ? record.plan.flatMap<SupervisorPlanStep>((value) => {\n if (!value || typeof value !== \"object\") {\n return [];\n }\n const step = value as Record<string, unknown>;\n if (\n typeof step.id !== \"string\" ||\n typeof step.title !== \"string\" ||\n (step.status !== \"pending\" && step.status !== \"in_progress\" && step.status !== \"done\")\n ) {\n return [];\n }\n return [{ id: step.id, title: step.title, status: step.status }];\n })\n : undefined;\n\n const stepUpdates: SupervisorCycleStepUpdate[] | undefined = Array.isArray(record.stepUpdates)\n ? record.stepUpdates.flatMap<SupervisorCycleStepUpdate>((value) => {\n if (!value || typeof value !== \"object\") {\n return [];\n }\n const update = value as Record<string, unknown>;\n if (\n typeof update.id !== \"string\" ||\n (update.status !== \"pending\" &&\n update.status !== \"in_progress\" &&\n update.status !== \"done\")\n ) {\n return [];\n }\n return [{ id: update.id, status: update.status }];\n })\n : undefined;\n\n return {\n status,\n reason: reason.trim(),\n guidance,\n plan,\n activeStepId:\n typeof record.activeStepId === \"string\" && record.activeStepId.trim()\n ? record.activeStepId\n : undefined,\n progressSummary:\n typeof record.progressSummary === \"string\" && record.progressSummary.trim()\n ? record.progressSummary.trim()\n : undefined,\n stepUpdates,\n };\n}\n", "import { createHash } from \"node:crypto\";\nimport {\n DEFAULT_SUPERVISOR_CONFIG,\n type SessionState,\n type Supervisor,\n type SupervisorConfig,\n type SupervisorCycle,\n} from \"@coder-studio/core\";\nimport type { SessionManager } from \"../session/manager.js\";\nimport type { TerminalManager } from \"../terminal/manager.js\";\n\nexport const INJECTABLE_SESSION_STATES: ReadonlySet<SessionState> = new Set<SessionState>([\n \"idle\",\n \"running\",\n]);\n\n/**\n * Explain why a given session state cannot accept injection. Returned\n * messages are user-facing: they should describe the lifecycle phase in\n * terms the operator can act on (e.g. wait for the CLI to finish booting,\n * resume the session, etc.).\n */\nexport function describeNonInjectableState(state: SessionState): string {\n switch (state) {\n case \"starting\":\n return \"session is still starting up (provider CLI has not completed its first turn yet)\";\n case \"ended\":\n return \"session has already ended\";\n case \"draft\":\n return \"session is still a draft and has no terminal attached\";\n default:\n return `session state \"${state}\" does not accept injection`;\n }\n}\n\nexport class SupervisorInjector {\n private readonly config: SupervisorConfig;\n\n constructor(\n readonly deps: {\n sessionMgr: SessionManager;\n terminalMgr: TerminalManager;\n config?: SupervisorConfig;\n }\n ) {\n this.config = deps.config ?? DEFAULT_SUPERVISOR_CONFIG;\n }\n\n async inject(\n supervisor: Supervisor,\n input: { message: string },\n recentCycles: SupervisorCycle[],\n options: { signal?: AbortSignal } = {}\n ): Promise<{ injected: boolean; text: string }> {\n if (options.signal?.aborted) {\n throw {\n code: \"supervisor_eval_aborted\",\n message: \"Supervisor evaluator aborted\",\n };\n }\n\n const session = this.deps.sessionMgr.get(supervisor.sessionId);\n if (!session) {\n throw {\n code: \"inject_target_unavailable\",\n message: `Session ${supervisor.sessionId} is not available for injection`,\n };\n }\n if (!INJECTABLE_SESSION_STATES.has(session.state)) {\n throw {\n code: \"inject_target_unavailable\",\n message: `Cannot inject into session ${supervisor.sessionId}: ${describeNonInjectableState(session.state)}`,\n };\n }\n\n const message = input.message.slice(0, this.config.guidanceMaxChars);\n const text = `[Supervisor] ${message}`;\n\n const hash = createHash(\"sha1\").update(text).digest(\"hex\");\n const duplicate = recentCycles\n .slice(0, this.config.guidanceDedupeWindow)\n .map((cycle) => cycle.injectedGuidance)\n .filter((value): value is string => Boolean(value))\n .some((value) => createHash(\"sha1\").update(value).digest(\"hex\") === hash);\n\n if (duplicate) {\n return { injected: false, text };\n }\n\n if (options.signal?.aborted) {\n throw {\n code: \"supervisor_eval_aborted\",\n message: \"Supervisor evaluator aborted\",\n };\n }\n\n // Wrap with bracketed-paste so the TUI doesn't interpret any embedded\n // characters as slash-commands / keybindings. Terminate with \\r so the\n // receiving CLI actually submits the message.\n const BRACKETED_PASTE_START = \"\\x1b[200~\";\n const BRACKETED_PASTE_END = \"\\x1b[201~\";\n const SUBMIT = \"\\r\";\n const payload = `${BRACKETED_PASTE_START}${text}${BRACKETED_PASTE_END}${SUBMIT}`;\n\n this.deps.sessionMgr.sendInput(session.id, Buffer.from(payload, \"utf8\"), \"internal_submit\");\n return { injected: true, text };\n }\n}\n", "import type { DomainEvent } from \"@coder-studio/core\";\nimport type { EventBus } from \"../bus/event-bus.js\";\n\ntype SessionLifecycleEvent = Extract<DomainEvent, { type: \"session.lifecycle\" }>;\n\nexport class SupervisorScheduler {\n private unsubscribe: (() => void) | null = null;\n private scheduledTimer: ReturnType<typeof setTimeout> | null = null;\n private readonly scheduledRetryDelayMs = 1_000;\n private readonly retryAtBySupervisorId = new Map<string, number>();\n\n constructor(\n private readonly deps: {\n eventBus: EventBus;\n onTurnCompleted: (sessionId: string) => void;\n listScheduledSupervisors?: () => Array<{ supervisorId: string; scheduledAt: number }>;\n onScheduledDue?: (supervisorId: string) => void;\n }\n ) {}\n\n start(): void {\n this.unsubscribe?.();\n this.unsubscribe = this.deps.eventBus.on(\n \"session.lifecycle\",\n (event: SessionLifecycleEvent) => {\n if (event.event !== \"turn_completed\") {\n return;\n }\n this.deps.onTurnCompleted(event.sessionId);\n }\n );\n }\n\n refresh(): void {\n this.clearScheduledTimer();\n\n const scheduled = this.deps.listScheduledSupervisors?.() ?? [];\n this.pruneRetryState(scheduled);\n if (scheduled.length === 0) {\n return;\n }\n\n const now = Date.now();\n const nextAt = scheduled.reduce((earliest, item) => {\n const candidate = this.getNextAttemptAt(item, now);\n return candidate < earliest ? candidate : earliest;\n }, Number.POSITIVE_INFINITY);\n if (!Number.isFinite(nextAt)) {\n return;\n }\n\n const delayMs = Math.max(nextAt - now, 0);\n this.scheduledTimer = setTimeout(() => {\n this.scheduledTimer = null;\n const current = this.deps.listScheduledSupervisors?.() ?? [];\n this.pruneRetryState(current);\n\n const dueAt = Date.now();\n const due = current.filter(\n (item) =>\n item.scheduledAt <= dueAt &&\n (this.retryAtBySupervisorId.get(item.supervisorId) ?? Number.NEGATIVE_INFINITY) <= dueAt\n );\n for (const item of due) {\n this.retryAtBySupervisorId.set(item.supervisorId, dueAt + this.scheduledRetryDelayMs);\n this.deps.onScheduledDue?.(item.supervisorId);\n }\n this.refresh();\n }, delayMs);\n this.scheduledTimer.unref?.();\n }\n\n stop(): void {\n this.unsubscribe?.();\n this.unsubscribe = null;\n this.clearScheduledTimer();\n this.retryAtBySupervisorId.clear();\n }\n\n private clearScheduledTimer(): void {\n if (this.scheduledTimer) {\n clearTimeout(this.scheduledTimer);\n this.scheduledTimer = null;\n }\n }\n\n private getNextAttemptAt(\n item: { supervisorId: string; scheduledAt: number },\n now: number\n ): number {\n if (item.scheduledAt > now) {\n return item.scheduledAt;\n }\n\n const retryAt = this.retryAtBySupervisorId.get(item.supervisorId);\n return retryAt && retryAt > now ? retryAt : item.scheduledAt;\n }\n\n private pruneRetryState(scheduled: Array<{ supervisorId: string; scheduledAt: number }>): void {\n const scheduledIds = new Set(scheduled.map((item) => item.supervisorId));\n for (const supervisorId of this.retryAtBySupervisorId.keys()) {\n if (!scheduledIds.has(supervisorId)) {\n this.retryAtBySupervisorId.delete(supervisorId);\n }\n }\n }\n}\n", "import {\n type CycleStatus,\n DEFAULT_SUPERVISOR_CONFIG,\n type DomainEvent,\n type ProviderDefinition,\n type Supervisor,\n type SupervisorConfig,\n type SupervisorCycle,\n type SupervisorCycleTargetRecord,\n type SupervisorState,\n type SupervisorTargetMemory,\n Topics,\n} from \"@coder-studio/core\";\nimport type { FastifyBaseLogger } from \"fastify\";\nimport type { EventBus } from \"../bus/event-bus.js\";\nimport type { SessionManager } from \"../session/manager.js\";\nimport type { ProviderConfigRepo } from \"../storage/repositories/provider-config-repo.js\";\nimport type { SettingsRepo } from \"../storage/repositories/settings-repo.js\";\nimport type { SupervisorCycleAttemptRepo } from \"../storage/repositories/supervisor-cycle-attempt-repo.js\";\nimport type { SupervisorCycleRepo } from \"../storage/repositories/supervisor-cycle-repo.js\";\nimport type { SupervisorRepo } from \"../storage/repositories/supervisor-repo.js\";\nimport type { TerminalManager } from \"../terminal/manager.js\";\nimport type { WorkspaceManager } from \"../workspace/manager.js\";\nimport type { Broadcaster } from \"../ws/hub.js\";\nimport type { SupervisorEvaluationContext } from \"./context-builder.js\";\nimport { SupervisorContextBuilder } from \"./context-builder.js\";\nimport { SupervisorEvaluator } from \"./evaluator.js\";\nimport {\n describeNonInjectableState,\n INJECTABLE_SESSION_STATES,\n SupervisorInjector,\n} from \"./injector.js\";\nimport { SupervisorScheduler } from \"./scheduler.js\";\nimport { getSupervisorRetrySettings } from \"./settings.js\";\nimport type { SupervisorTargetMeta } from \"./target-store.js\";\n\nconst NOOP_LOGGER: FastifyBaseLogger = {\n child: () => NOOP_LOGGER,\n debug: () => {},\n error: () => {},\n fatal: () => {},\n info: () => {},\n level: \"silent\",\n silent: () => {},\n trace: () => {},\n warn: () => {},\n};\n\ntype SessionLifecycleEvent = Extract<DomainEvent, { type: \"session.lifecycle\" }>;\n\n/**\n * Internal handoff between the synchronous `beginCycle` and the async\n * `finishCycle` phases of a supervisor evaluation.\n */\ninterface StartedCycle {\n cycle: SupervisorCycle;\n supervisor: Supervisor;\n context: SupervisorEvaluationContext;\n targetId: string;\n retry: SupervisorRetrySnapshot;\n trigger: \"turn_completed\" | \"manual\" | \"scheduled\";\n}\n\ninterface DeferredCompletion {\n promise: Promise<void>;\n resolve: () => void;\n}\n\ninterface SupervisorRetrySnapshot {\n retryEnabled: boolean;\n retryMaxCount: number;\n retryDelayMs: number;\n retryOnTimeout: boolean;\n retryOnEvaluatorError: boolean;\n}\n\nexport interface SupervisorManagerDeps {\n eventBus: EventBus;\n broadcaster: Broadcaster;\n terminalMgr: TerminalManager;\n workspaceMgr: WorkspaceManager;\n sessionMgr: SessionManager;\n providerRegistry: ProviderDefinition[];\n providerConfigRepo: ProviderConfigRepo;\n settingsRepo: Pick<SettingsRepo, \"get\">;\n supervisorRepo: SupervisorRepo;\n cycleRepo: SupervisorCycleRepo;\n cycleAttemptRepo: Pick<\n SupervisorCycleAttemptRepo,\n \"create\" | \"update\" | \"listForCycle\" | \"deleteForCycle\"\n >;\n targetStore: {\n createTargetFiles: typeof import(\"./target-store.js\").createTargetFiles;\n resetTargetFiles: typeof import(\"./target-store.js\").resetTargetFiles;\n readTargetMeta: typeof import(\"./target-store.js\").readTargetMeta;\n loadTargetMemory: typeof import(\"./target-store.js\").loadTargetMemory;\n saveTargetMeta: typeof import(\"./target-store.js\").saveTargetMeta;\n saveTargetMemory: typeof import(\"./target-store.js\").saveTargetMemory;\n appendTargetCycleRecord: typeof import(\"./target-store.js\").appendTargetCycleRecord;\n markTargetSuperseded: typeof import(\"./target-store.js\").markTargetSuperseded;\n readTargetCycleRecords: typeof import(\"./target-store.js\").readTargetCycleRecords;\n };\n logger?: FastifyBaseLogger;\n config?: SupervisorConfig;\n}\n\nexport interface CreateSupervisorRequest {\n sessionId: string;\n workspaceId: string;\n objective: string;\n evaluatorProviderId: string;\n evaluatorModel?: string;\n maxSupervisionCount?: number;\n scheduledAt?: number;\n}\n\nexport interface UpdateSupervisorRequest {\n objective?: string;\n evaluatorProviderId?: string;\n evaluatorModel?: string | null;\n maxSupervisionCount?: number;\n scheduledAt?: number | null;\n}\n\nfunction createDeferredCompletion(): DeferredCompletion {\n let resolve = () => {};\n const promise = new Promise<void>((innerResolve) => {\n resolve = innerResolve;\n });\n return { promise, resolve };\n}\n\nfunction generateSupervisorId(): string {\n return `sup_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n}\n\nfunction generateCycleId(): string {\n return `cycle_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n}\n\nfunction generateAttemptId(): string {\n return `attempt_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n}\n\nfunction messageOf(error: unknown, fallback: string): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (error && typeof error === \"object\" && \"message\" in error) {\n const value = (error as { message: unknown }).message;\n if (typeof value === \"string\") {\n return value;\n }\n }\n return fallback;\n}\n\nfunction logFailure(\n logger: FastifyBaseLogger,\n error: unknown,\n context: Record<string, unknown>,\n message: string\n): void {\n logger.error({ ...context, err: error }, message);\n}\n\nexport class SupervisorManager {\n private readonly supervisors = new Map<string, Supervisor>();\n private readonly supervisorsBySession = new Map<string, string>();\n private readonly inFlight = new Set<string>();\n private readonly pendingDeletes = new Set<string>();\n private readonly pendingPauses = new Set<string>();\n private readonly pendingObjectiveUpdates = new Set<string>();\n private readonly evaluationAbortControllers = new Map<string, AbortController>();\n private readonly inFlightCompletions = new Map<string, DeferredCompletion>();\n private readonly scheduler: SupervisorScheduler;\n private readonly contextBuilder: SupervisorContextBuilder;\n private readonly evaluator: SupervisorEvaluator;\n private readonly injector: SupervisorInjector;\n private readonly logger: FastifyBaseLogger;\n private readonly config: SupervisorConfig;\n private lifecycleUnsubscribe: (() => void) | null = null;\n\n constructor(private readonly deps: SupervisorManagerDeps) {\n this.logger = deps.logger ?? NOOP_LOGGER;\n this.config = deps.config ?? DEFAULT_SUPERVISOR_CONFIG;\n this.contextBuilder = new SupervisorContextBuilder({\n workspaceMgr: deps.workspaceMgr,\n sessionMgr: deps.sessionMgr,\n terminalMgr: deps.terminalMgr,\n providerRegistry: deps.providerRegistry,\n logger: this.logger,\n });\n this.evaluator = new SupervisorEvaluator({\n providerRegistry: deps.providerRegistry,\n providerConfigRepo: deps.providerConfigRepo,\n settingsRepo: deps.settingsRepo,\n config: this.config,\n logger: this.logger,\n });\n this.injector = new SupervisorInjector({\n sessionMgr: deps.sessionMgr,\n terminalMgr: deps.terminalMgr,\n config: this.config,\n });\n this.scheduler = new SupervisorScheduler({\n eventBus: deps.eventBus,\n onTurnCompleted: (sessionId) => {\n const supervisorId = this.supervisorsBySession.get(sessionId);\n if (supervisorId) {\n void this.runEvaluation(supervisorId, \"turn_completed\").catch((error) => {\n this.logger.warn({ err: error, supervisorId }, \"Supervisor auto-evaluation failed\");\n });\n }\n },\n listScheduledSupervisors: () => this.listScheduledSupervisors(),\n onScheduledDue: (supervisorId) => {\n void this.runEvaluation(supervisorId, \"scheduled\").catch((error) => {\n this.logger.warn(\n { err: error, supervisorId },\n \"Supervisor scheduled auto-evaluation failed\"\n );\n });\n },\n });\n }\n\n async hydrate(): Promise<void> {\n this.supervisors.clear();\n this.supervisorsBySession.clear();\n\n for (const supervisor of this.deps.supervisorRepo.listAll()) {\n const hydratedWithTarget = await this.hydrateTargetState(supervisor);\n const normalizedState =\n hydratedWithTarget.state === \"evaluating\" || hydratedWithTarget.state === \"injecting\"\n ? \"idle\"\n : hydratedWithTarget.state;\n\n const recovered =\n normalizedState === hydratedWithTarget.state\n ? hydratedWithTarget\n : this.withCurrentTargetState(\n this.deps.supervisorRepo.update(hydratedWithTarget.id, {\n state: normalizedState,\n errorReason: null,\n updatedAt: Date.now(),\n })\n );\n\n // Any cycle still in a transient state belongs to a previous server\n // process (or a long-fixed buggy code path). Mark it as failed so it\n // doesn't sit forever in the UI as \"queued\"/\"evaluating\".\n const stale = this.deps.cycleRepo\n .listRecentForSupervisor(hydratedWithTarget.id, this.config.maxCyclesPerSession)\n .filter((cycle) => cycle.status === \"queued\" || cycle.status === \"evaluating\");\n for (const cycle of stale) {\n try {\n this.deps.cycleRepo.update(cycle.id, {\n status: \"failed\",\n errorReason: \"Orphaned before server restart\",\n completedAt: Date.now(),\n });\n } catch (error) {\n this.logger.warn(\n { err: error, cycleId: cycle.id, supervisorId: hydratedWithTarget.id },\n \"Failed to clean up stale cycle on hydrate\"\n );\n }\n }\n\n this.storeSnapshot(this.attachCycles(recovered));\n }\n\n this.lifecycleUnsubscribe?.();\n this.lifecycleUnsubscribe = this.deps.eventBus.on(\n \"session.lifecycle\",\n (event: SessionLifecycleEvent) => {\n if (event.event !== \"removed\") {\n return;\n }\n const supervisorId = this.supervisorsBySession.get(event.sessionId);\n if (supervisorId) {\n void this.delete(supervisorId).catch((error) => {\n this.logger.warn({ err: error, supervisorId }, \"Auto-delete on session removal failed\");\n });\n }\n }\n );\n\n this.scheduler.start();\n this.scheduler.refresh();\n }\n\n stop(): void {\n this.scheduler.stop();\n this.lifecycleUnsubscribe?.();\n this.lifecycleUnsubscribe = null;\n }\n\n get(id: string): Supervisor | undefined {\n return this.supervisors.get(id);\n }\n\n getBySession(sessionId: string): Supervisor | undefined {\n const supervisorId = this.supervisorsBySession.get(sessionId);\n return supervisorId ? this.supervisors.get(supervisorId) : undefined;\n }\n\n async deleteForWorkspace(workspaceId: string): Promise<void> {\n const supervisorIds = Array.from(this.supervisors.values())\n .filter((supervisor) => supervisor.workspaceId === workspaceId)\n .map((supervisor) => supervisor.id);\n const pending: Promise<void>[] = [];\n\n for (const supervisorId of supervisorIds) {\n const supervisor = this.supervisors.get(supervisorId);\n if (!supervisor) {\n continue;\n }\n\n this.pendingDeletes.add(supervisorId);\n if (!this.inFlight.has(supervisorId)) {\n this.deleteNow(supervisor);\n continue;\n }\n\n this.evaluationAbortControllers.get(supervisorId)?.abort();\n const completion = this.inFlightCompletions.get(supervisorId);\n if (completion) {\n pending.push(completion.promise);\n }\n }\n\n await Promise.all(pending);\n }\n\n async create(req: CreateSupervisorRequest): Promise<Supervisor> {\n const session = this.deps.sessionMgr.get(req.sessionId);\n if (!session) {\n throw {\n code: \"supervisor_not_found\",\n message: `Session ${req.sessionId} not found`,\n };\n }\n if (session.state === \"draft\") {\n throw {\n code: \"supervisor_unsupported_provider\",\n message: \"Draft sessions cannot enable supervisor\",\n };\n }\n const sessionProvider = this.requireSessionProvider(session.providerId);\n if (!this.supportsSupervisor(sessionProvider)) {\n throw {\n code: \"supervisor_unsupported_provider\",\n message: `Provider ${session.providerId} does not support supervisor-driven sessions`,\n };\n }\n if (this.supervisorsBySession.has(req.sessionId)) {\n throw {\n code: \"supervisor_already_exists\",\n message: `Supervisor already exists for ${req.sessionId}`,\n };\n }\n\n this.assertEvaluatorProvider(req.evaluatorProviderId);\n\n const now = Date.now();\n const objective = req.objective.trim();\n const workspace = this.requireWorkspace(req.workspaceId);\n const supervisorId = generateSupervisorId();\n const supervisor = this.attachCycles(\n this.deps.supervisorRepo.create({\n id: supervisorId,\n sessionId: req.sessionId,\n workspaceId: req.workspaceId,\n state: \"idle\",\n objective,\n evaluatorProviderId: req.evaluatorProviderId,\n evaluatorModel: req.evaluatorModel?.trim() || undefined,\n maxSupervisionCount: req.maxSupervisionCount ?? 0,\n completedSupervisionCount: 0,\n scheduledAt: req.scheduledAt,\n createdAt: now,\n updatedAt: now,\n })\n );\n let enriched: Supervisor;\n try {\n await this.deps.targetStore.createTargetFiles(workspace.path, {\n targetId: supervisorId,\n sessionId: req.sessionId,\n workspaceId: req.workspaceId,\n objective,\n createdAt: now,\n });\n\n enriched = await this.attachTargetState(supervisor, workspace.path);\n } catch (error) {\n this.deps.supervisorRepo.delete(supervisor.id);\n throw error;\n }\n\n this.storeSnapshot(enriched);\n this.broadcastState(enriched, \"created\");\n this.scheduler.refresh();\n return enriched;\n }\n\n async update(id: string, patch: UpdateSupervisorRequest): Promise<Supervisor> {\n let current = this.requireSupervisor(id);\n\n if (patch.evaluatorProviderId) {\n this.assertEvaluatorProvider(patch.evaluatorProviderId);\n }\n\n const nextObjective =\n patch.objective !== undefined ? patch.objective.trim() : current.objective;\n const objectiveChanged = patch.objective !== undefined && nextObjective !== current.objective;\n\n if (objectiveChanged && this.inFlight.has(id)) {\n this.pendingObjectiveUpdates.add(id);\n this.evaluationAbortControllers.get(id)?.abort();\n await this.inFlightCompletions.get(id)?.promise;\n current = this.requireSupervisor(id);\n }\n\n const workspace = this.requireWorkspace(current.workspaceId);\n const nextPatch: Parameters<SupervisorRepo[\"update\"]>[1] = {\n objective: nextObjective,\n evaluatorProviderId: patch.evaluatorProviderId ?? current.evaluatorProviderId,\n evaluatorModel:\n patch.evaluatorModel === undefined\n ? current.evaluatorModel\n : patch.evaluatorModel?.trim() || null,\n maxSupervisionCount: patch.maxSupervisionCount ?? current.maxSupervisionCount,\n scheduledAt: patch.scheduledAt === undefined ? current.scheduledAt : patch.scheduledAt,\n state: objectiveChanged\n ? current.state === \"paused\"\n ? \"paused\"\n : \"idle\"\n : current.state === \"error\"\n ? \"idle\"\n : current.state,\n stopReason: objectiveChanged ? null : current.stopReason,\n completedSupervisionCount: objectiveChanged ? 0 : current.completedSupervisionCount,\n lastEvaluatedTurnId: objectiveChanged ? null : current.lastEvaluatedTurnId,\n errorReason: null,\n updatedAt: Date.now(),\n };\n\n const rollbackPatch = this.toSupervisorUpdatePatch(current, Date.now());\n this.deps.supervisorRepo.update(id, nextPatch);\n\n if (objectiveChanged) {\n try {\n await this.deps.targetStore.resetTargetFiles(workspace.path, {\n targetId: current.targetId,\n sessionId: current.sessionId,\n workspaceId: current.workspaceId,\n objective: nextObjective,\n createdAt: nextPatch.updatedAt ?? Date.now(),\n });\n } catch (error) {\n try {\n this.deps.supervisorRepo.update(id, rollbackPatch);\n } catch (rollbackError) {\n this.logger.error(\n { err: rollbackError, supervisorId: id },\n \"Failed to roll back supervisor after target reset failure\"\n );\n }\n throw error;\n }\n }\n\n const enriched = await this.hydratePersistedSupervisor(id, workspace.path);\n if (!enriched) {\n await this.markTargetCancelledIfActive(workspace.path, current).catch(() => {});\n throw this.supervisorNotFoundError(id);\n }\n\n this.storeSnapshot(enriched);\n this.broadcastState(enriched, \"updated\");\n this.scheduler.refresh();\n return enriched;\n }\n\n async pause(id: string): Promise<Supervisor> {\n if (this.inFlight.has(id)) {\n this.pendingPauses.add(id);\n this.evaluationAbortControllers.get(id)?.abort();\n }\n\n const updated = this.attachCycles(\n this.withCurrentTargetState(\n this.deps.supervisorRepo.update(id, {\n state: \"paused\",\n updatedAt: Date.now(),\n })\n )\n );\n\n this.storeSnapshot(updated);\n this.broadcastState(updated, \"state_changed\");\n this.scheduler.refresh();\n return updated;\n }\n\n async resume(id: string): Promise<Supervisor> {\n const updated = this.attachCycles(\n this.withCurrentTargetState(\n this.deps.supervisorRepo.update(id, {\n state: \"idle\",\n errorReason: null,\n updatedAt: Date.now(),\n })\n )\n );\n\n this.storeSnapshot(updated);\n this.broadcastState(updated, \"state_changed\");\n this.scheduler.refresh();\n return updated;\n }\n\n async delete(id: string): Promise<void> {\n const supervisor = this.requireSupervisor(id);\n\n if (this.inFlight.has(id)) {\n this.pendingDeletes.add(id);\n this.evaluationAbortControllers.get(id)?.abort();\n await this.inFlightCompletions.get(id)?.promise;\n this.scheduler.refresh();\n return;\n }\n\n this.deleteNow(supervisor);\n }\n\n /**\n * Start a manual evaluation cycle and return as soon as the cycle is\n * created. The heavy evaluator+injector work continues in the background\n * and broadcasts cycle/state updates as it progresses.\n *\n * This is what the WS `supervisor.trigger` command calls, so the web\n * client never has to wait for the (potentially slow) evaluator to finish.\n */\n async triggerEvaluation(id: string): Promise<SupervisorCycle> {\n const started = await this.beginCycle(id, \"manual\");\n if (!started) {\n throw {\n code: \"supervisor_internal_error\",\n message: `Supervisor ${id} could not start an evaluation cycle`,\n };\n }\n\n // Fire-and-forget the rest of the evaluation. Errors are surfaced via\n // broadcasts (cycle \u2192 failed, state \u2192 error).\n void this.finishCycle(started).catch((error) => {\n this.logger.warn(\n { err: error, supervisorId: id, cycleId: started.cycle.id },\n \"Supervisor manual evaluation failed\"\n );\n });\n\n return started.cycle;\n }\n\n /**\n * Run a supervisor evaluation synchronously end-to-end. Used for the\n * auto trigger path (scheduler) and for tests that want to observe the\n * final cycle outcome.\n */\n async runEvaluation(\n supervisorId: string,\n trigger: \"turn_completed\" | \"scheduled\" = \"turn_completed\"\n ): Promise<SupervisorCycle | null> {\n const started = await this.beginCycle(supervisorId, trigger);\n if (!started) {\n return null;\n }\n return await this.finishCycle(started);\n }\n\n /**\n * Synchronous portion of an evaluation cycle: validates preconditions,\n * builds evaluator context, flips state \u2192 'evaluating', creates an\n * in-flight cycle row, and broadcasts both.\n *\n * Returns `null` when auto triggers should be skipped silently\n * (duplicate turnId, wrong state, ...). Throws for manual trigger\n * preconditions the user needs to know about (paused, busy, missing\n * session). Always releases `inFlight` if we bail out before handing\n * off to {@link finishCycle}.\n */\n private async beginCycle(\n id: string,\n trigger: \"turn_completed\" | \"manual\" | \"scheduled\"\n ): Promise<StartedCycle | null> {\n const supervisor = this.requireSupervisor(id);\n const session = this.deps.sessionMgr.get(supervisor.sessionId);\n\n if (!session) {\n throw {\n code: \"supervisor_not_found\",\n message: `Session ${supervisor.sessionId} not found`,\n };\n }\n\n if (this.inFlight.has(id)) {\n if (trigger === \"manual\") {\n throw {\n code: \"supervisor_busy\",\n message: `Supervisor ${id} is already evaluating`,\n };\n }\n return null;\n }\n\n if (supervisor.state === \"paused\") {\n if (trigger === \"manual\") {\n throw {\n code: \"supervisor_paused\",\n message: `Supervisor ${id} is paused`,\n };\n }\n return null;\n }\n\n if (supervisor.state === \"stopped\") {\n if (trigger === \"manual\") {\n throw {\n code: \"supervisor_stopped\",\n message: `Supervisor ${id} is stopped`,\n };\n }\n return null;\n }\n\n if (\n (trigger === \"turn_completed\" || trigger === \"scheduled\") &&\n (supervisor.state !== \"idle\" || (session.state !== \"running\" && session.state !== \"idle\"))\n ) {\n return null;\n }\n\n if (\n supervisor.maxSupervisionCount > 0 &&\n supervisor.completedSupervisionCount >= supervisor.maxSupervisionCount\n ) {\n const stopped = this.attachCycles(\n this.deps.supervisorRepo.update(id, {\n state: \"stopped\",\n stopReason: \"max_supervision_count_reached\",\n updatedAt: Date.now(),\n })\n );\n this.storeSnapshot(stopped);\n this.broadcastState(stopped, \"state_changed\");\n this.scheduler.refresh();\n return null;\n }\n\n // If scheduled execution is set but the scheduled time has not arrived yet,\n // skip turn_completed triggers. Only after the scheduled time passes will\n // turn_completed triggers proceed with evaluation.\n if (trigger === \"turn_completed\") {\n if (\n supervisor.scheduledAt !== undefined &&\n supervisor.scheduledAt !== null &&\n supervisor.scheduledAt > Date.now()\n ) {\n return null;\n }\n }\n\n if (trigger === \"scheduled\") {\n if (supervisor.scheduledAt === undefined || supervisor.scheduledAt > Date.now()) {\n return null;\n }\n }\n\n // Manual trigger: fail fast if the session can't receive injection yet.\n // Without this guard we would burn an evaluator turn only to have the\n // injector reject the session right after (e.g. Codex sessions stuck in\n // 'starting' because the provider hasn't reported TurnCompleted).\n if (trigger === \"manual\" && !INJECTABLE_SESSION_STATES.has(session.state)) {\n throw {\n code: \"supervisor_session_not_ready\",\n message: `Supervisor ${id} cannot evaluate now: ${describeNonInjectableState(session.state)}`,\n };\n }\n\n this.inFlight.add(id);\n this.evaluationAbortControllers.set(id, new AbortController());\n this.inFlightCompletions.set(id, createDeferredCompletion());\n\n try {\n const retrySettings = getSupervisorRetrySettings(this.deps.settingsRepo);\n const workspace = this.requireWorkspace(supervisor.workspaceId);\n const hydratedSupervisor = await this.attachTargetState(supervisor, workspace.path);\n const targetMemory = hydratedSupervisor.currentTargetMemory;\n if (!targetMemory) {\n throw new Error(`Missing target memory for supervisor ${supervisor.id}`);\n }\n const context = await this.contextBuilder.build(hydratedSupervisor, targetMemory);\n if (\n trigger === \"turn_completed\" &&\n context.lastTurnId &&\n context.lastTurnId === supervisor.lastEvaluatedTurnId\n ) {\n this.releaseInFlight(id);\n return null;\n }\n\n const shouldConsumeScheduledAt =\n trigger === \"scheduled\" ||\n (trigger === \"turn_completed\" &&\n supervisor.scheduledAt !== undefined &&\n supervisor.scheduledAt !== null &&\n supervisor.scheduledAt <= Date.now());\n\n const evaluatingSupervisor = this.attachCycles(\n this.withCurrentTargetState(\n this.deps.supervisorRepo.update(supervisor.id, {\n state: \"evaluating\",\n scheduledAt: shouldConsumeScheduledAt ? null : (supervisor.scheduledAt ?? undefined),\n stopReason: null,\n errorReason: null,\n updatedAt: Date.now(),\n })\n )\n );\n this.storeSnapshot(evaluatingSupervisor);\n this.broadcastState(evaluatingSupervisor, \"state_changed\");\n this.scheduler.refresh();\n\n const activeCycle = this.deps.cycleRepo.create({\n id: generateCycleId(),\n supervisorId: supervisor.id,\n sessionId: supervisor.sessionId,\n status: \"evaluating\",\n trigger,\n evidenceSource: context.evidenceSource,\n objective: supervisor.objective,\n evaluatorProviderId: supervisor.evaluatorProviderId,\n turnId: context.lastTurnId,\n createdAt: Date.now(),\n });\n this.broadcastCycle(evaluatingSupervisor, activeCycle, \"created\");\n\n return {\n cycle: activeCycle,\n supervisor: hydratedSupervisor,\n context,\n targetId: hydratedSupervisor.targetId,\n trigger,\n retry: {\n retryEnabled: retrySettings.retryEnabled,\n retryMaxCount: retrySettings.retryMaxCount,\n retryDelayMs: retrySettings.retryDelaySec * 1000,\n retryOnTimeout: retrySettings.retryOnTimeout,\n retryOnEvaluatorError: retrySettings.retryOnEvaluatorError,\n },\n };\n } catch (error: unknown) {\n // Error happened BEFORE we created a cycle (usually contextBuilder or\n // the state\u2192evaluating write). Make sure we don't leave the\n // supervisor stuck and release inFlight ourselves.\n this.releaseInFlight(id);\n this.markSupervisorError(id, error);\n throw error;\n }\n }\n\n /**\n * Asynchronous portion of an evaluation cycle: runs the evaluator, optionally\n * injects guidance, persists the final cycle outcome, and flips state back\n * to 'idle' (or 'error'/'paused'). Always releases `inFlight`.\n */\n private async finishCycle(started: StartedCycle): Promise<SupervisorCycle> {\n const { cycle: activeCycle, context, targetId } = started;\n const supervisorId = activeCycle.supervisorId;\n\n try {\n const signal = this.evaluationAbortControllers.get(supervisorId)?.signal;\n const evaluation = await this.executeCycleWithRetry(started, signal);\n const finalized = await this.finalizeSuccessfulCycle(\n activeCycle,\n context,\n evaluation,\n targetId\n );\n\n if (this.pendingDeletes.has(supervisorId)) {\n this.pendingDeletes.delete(supervisorId);\n this.deleteNow(finalized.supervisor);\n }\n\n return finalized.cycle;\n } catch (error: unknown) {\n if (isSupervisorEvalAborted(error)) {\n const cancelled = this.isCancellationRequested(supervisorId);\n const abortedCycle = this.deps.cycleRepo.update(activeCycle.id, {\n status: cancelled ? \"cancelled\" : \"failed\",\n errorReason: cancelled ? null : messageOf(error, \"Supervisor evaluator aborted\"),\n completedAt: Date.now(),\n });\n\n const currentSupervisor =\n this.supervisors.get(supervisorId) ?? this.requireSupervisor(supervisorId);\n\n if (this.pendingDeletes.has(supervisorId)) {\n const workspace = this.deps.workspaceMgr.get(currentSupervisor.workspaceId);\n if (workspace) {\n await this.writeErrorTargetCycleRecord(\n workspace.path,\n targetId,\n activeCycle,\n abortedCycle.errorReason ?? \"Supervisor evaluator aborted\"\n );\n await this.markTargetCancelledIfActive(workspace.path, currentSupervisor);\n }\n this.broadcastCycle(currentSupervisor, abortedCycle, \"updated\");\n this.pendingDeletes.delete(supervisorId);\n this.deleteNow(currentSupervisor);\n return abortedCycle;\n }\n\n if (this.pendingObjectiveUpdates.has(supervisorId)) {\n const nextState: SupervisorState = this.pendingPauses.has(supervisorId)\n ? \"paused\"\n : \"idle\";\n const recoveredSupervisor = this.attachCycles(\n this.deps.supervisorRepo.update(supervisorId, {\n state: nextState,\n stopReason: null,\n errorReason: null,\n updatedAt: Date.now(),\n })\n );\n\n this.storeSnapshot(recoveredSupervisor);\n this.broadcastCycle(recoveredSupervisor, abortedCycle, \"updated\");\n this.broadcastState(recoveredSupervisor, \"state_changed\");\n this.deps.cycleRepo.pruneOldest(supervisorId, this.config.maxCyclesPerSession);\n this.scheduler.refresh();\n\n return abortedCycle;\n }\n\n if (currentSupervisor.targetId !== targetId) {\n const workspace = this.deps.workspaceMgr.get(currentSupervisor.workspaceId);\n const enriched = this.attachCycles(\n workspace\n ? await this.attachTargetState(currentSupervisor, workspace.path)\n : currentSupervisor\n );\n if (workspace && abortedCycle.status === \"failed\") {\n await this.writeErrorTargetCycleRecord(\n workspace.path,\n targetId,\n activeCycle,\n abortedCycle.errorReason ?? \"Supervisor evaluator aborted\"\n );\n }\n this.storeSnapshot(enriched);\n this.broadcastCycle(enriched, abortedCycle, \"updated\");\n this.deps.cycleRepo.pruneOldest(supervisorId, this.config.maxCyclesPerSession);\n this.scheduler.refresh();\n this.pendingPauses.delete(supervisorId);\n return abortedCycle;\n }\n\n const latestState = this.supervisors.get(supervisorId)?.state;\n const nextState: SupervisorState =\n cancelled || latestState === \"paused\" ? \"paused\" : \"idle\";\n const recoveredSupervisor = this.attachCycles(\n this.deps.supervisorRepo.update(supervisorId, {\n state: nextState,\n stopReason: null,\n errorReason: null,\n updatedAt: Date.now(),\n })\n );\n\n this.storeSnapshot(recoveredSupervisor);\n const workspace = this.deps.workspaceMgr.get(recoveredSupervisor.workspaceId);\n if (workspace && abortedCycle.status === \"failed\") {\n await this.writeErrorTargetCycleRecord(\n workspace.path,\n targetId,\n activeCycle,\n abortedCycle.errorReason ?? \"Supervisor evaluator aborted\"\n );\n }\n this.broadcastCycle(recoveredSupervisor, abortedCycle, \"updated\");\n this.broadcastState(recoveredSupervisor, \"state_changed\");\n this.deps.cycleRepo.pruneOldest(supervisorId, this.config.maxCyclesPerSession);\n this.scheduler.refresh();\n this.pendingPauses.delete(supervisorId);\n\n return abortedCycle;\n }\n\n logFailure(\n this.logger,\n error,\n { supervisorId, cycleId: activeCycle.id },\n \"Supervisor evaluation failed\"\n );\n const reason = messageOf(error, \"Supervisor evaluation failed\");\n const failedCycle = this.deps.cycleRepo.update(activeCycle.id, {\n status: \"failed\",\n errorReason: reason,\n completedAt: Date.now(),\n });\n const currentSupervisor =\n this.supervisors.get(supervisorId) ?? this.requireSupervisor(supervisorId);\n const workspace = this.deps.workspaceMgr.get(currentSupervisor.workspaceId);\n if (currentSupervisor.targetId !== targetId) {\n const enriched = this.attachCycles(\n workspace\n ? await this.attachTargetState(currentSupervisor, workspace.path)\n : currentSupervisor\n );\n if (workspace) {\n await this.writeErrorTargetCycleRecord(\n workspace.path,\n targetId,\n activeCycle,\n failedCycle.errorReason ?? reason\n );\n }\n this.storeSnapshot(enriched);\n this.broadcastCycle(enriched, failedCycle, \"updated\");\n\n if (this.pendingDeletes.has(supervisorId)) {\n this.pendingDeletes.delete(supervisorId);\n this.deleteNow(enriched);\n }\n\n throw error;\n }\n\n const failedSupervisor = this.attachCycles(\n this.deps.supervisorRepo.update(supervisorId, {\n state: \"error\",\n stopReason: null,\n errorReason: reason,\n updatedAt: Date.now(),\n })\n );\n\n this.storeSnapshot(failedSupervisor);\n if (workspace) {\n await this.writeErrorTargetCycleRecord(\n workspace.path,\n targetId,\n activeCycle,\n failedCycle.errorReason ?? reason\n );\n }\n this.broadcastCycle(failedSupervisor, failedCycle, \"updated\");\n this.broadcastState(failedSupervisor, \"state_changed\");\n\n if (this.pendingDeletes.has(supervisorId)) {\n this.pendingDeletes.delete(supervisorId);\n this.deleteNow(failedSupervisor);\n }\n\n throw error;\n } finally {\n this.pendingObjectiveUpdates.delete(supervisorId);\n this.pendingPauses.delete(supervisorId);\n this.releaseInFlight(supervisorId);\n }\n }\n\n private async executeCycleWithRetry(\n started: StartedCycle,\n signal?: AbortSignal\n ): Promise<{\n evaluation: Awaited<ReturnType<SupervisorEvaluator[\"evaluate\"]>>;\n injected: boolean;\n injectedText?: string;\n }> {\n const supervisor = started.supervisor;\n\n for (let attemptIndex = 0; ; attemptIndex += 1) {\n const attempt = this.deps.cycleAttemptRepo.create({\n id: generateAttemptId(),\n cycleId: started.cycle.id,\n attemptIndex,\n status: \"evaluating\",\n startedAt: Date.now(),\n });\n\n try {\n const evaluation = await this.evaluator.evaluate(supervisor, started.context, { signal });\n this.deps.cycleAttemptRepo.update(attempt.id, {\n status: \"completed\",\n completedAt: Date.now(),\n providerModel: supervisor.evaluatorModel ?? null,\n });\n\n if (evaluation.status === \"stop\") {\n return {\n evaluation,\n injected: false,\n };\n }\n\n if (!evaluation.guidance?.trim()) {\n return {\n evaluation,\n injected: false,\n };\n }\n\n if (signal?.aborted || this.pendingPauses.has(supervisor.id)) {\n throw { code: \"supervisor_eval_aborted\", message: \"Supervisor evaluator aborted\" };\n }\n\n const currentSupervisor =\n this.supervisors.get(supervisor.id) ?? this.requireSupervisor(supervisor.id);\n if (currentSupervisor.targetId !== started.targetId) {\n return {\n evaluation,\n injected: false,\n };\n }\n\n const injectingSupervisor = this.attachCycles(\n this.withCurrentTargetState(\n this.deps.supervisorRepo.update(supervisor.id, {\n state: \"injecting\",\n updatedAt: Date.now(),\n })\n )\n );\n this.storeSnapshot(injectingSupervisor);\n this.broadcastState(injectingSupervisor, \"state_changed\");\n\n const recentCycles = this.deps.cycleRepo\n .listRecentForSupervisor(supervisor.id, this.config.guidanceDedupeWindow + 1)\n .filter((cycle) => cycle.id !== started.cycle.id);\n\n const injection = await this.injector.inject(\n injectingSupervisor,\n {\n message: evaluation.guidance,\n },\n recentCycles,\n { signal }\n );\n\n return {\n evaluation,\n injected: injection.injected,\n injectedText: injection.injected ? injection.text : undefined,\n };\n } catch (error) {\n if (isSupervisorEvalAborted(error)) {\n const cancelled = this.isCancellationRequested(supervisor.id);\n this.deps.cycleAttemptRepo.update(attempt.id, {\n status: cancelled ? \"cancelled\" : \"failed\",\n completedAt: Date.now(),\n errorReason: cancelled ? null : messageOf(error, \"Supervisor evaluator aborted\"),\n });\n throw error;\n }\n\n const reason = messageOf(error, \"Supervisor evaluation failed\");\n this.deps.cycleAttemptRepo.update(attempt.id, {\n status: \"failed\",\n completedAt: Date.now(),\n errorReason: reason,\n });\n\n if (!this.shouldRetryAttempt(error, attemptIndex, started.retry)) {\n throw error;\n }\n\n await this.sleep(started.retry.retryDelayMs, signal);\n\n const evaluatingSupervisor = this.attachCycles(\n this.withCurrentTargetState(\n this.deps.supervisorRepo.update(supervisor.id, {\n state: \"evaluating\",\n updatedAt: Date.now(),\n })\n )\n );\n this.storeSnapshot(evaluatingSupervisor);\n this.broadcastState(evaluatingSupervisor, \"state_changed\");\n }\n }\n }\n\n private async finalizeSuccessfulCycle(\n activeCycle: SupervisorCycle,\n context: SupervisorEvaluationContext,\n result: {\n evaluation: Awaited<ReturnType<SupervisorEvaluator[\"evaluate\"]>>;\n injected: boolean;\n injectedText?: string;\n },\n targetId: string\n ): Promise<{ cycle: SupervisorCycle; supervisor: Supervisor }> {\n const workspace = this.requireWorkspace(context.workspaceId);\n const currentSupervisor =\n this.supervisors.get(activeCycle.supervisorId) ??\n this.requireSupervisor(activeCycle.supervisorId);\n const targetMemory =\n targetId === currentSupervisor.targetId && currentSupervisor.currentTargetMemory\n ? currentSupervisor.currentTargetMemory\n : await this.deps.targetStore.loadTargetMemory(workspace.path, targetId);\n const finalStatus: CycleStatus = result.injected ? \"injected\" : \"completed\";\n const cycleReason =\n result.evaluation.status === \"stop\"\n ? result.evaluation.reason\n : result.injected\n ? result.injectedText\n : result.evaluation.guidance\n ? `Skipped duplicate: ${result.evaluation.guidance}`\n : undefined;\n\n const finishedCycle = this.deps.cycleRepo.update(activeCycle.id, {\n status: finalStatus,\n result: cycleReason ?? null,\n injectedGuidance: result.injectedText ?? null,\n errorReason: null,\n completedAt: Date.now(),\n });\n\n const nextTargetMemory = this.applyEvaluationToTargetMemory(\n targetMemory,\n result.evaluation,\n result.injectedText,\n finishedCycle.completedAt ?? Date.now()\n );\n await this.deps.targetStore.saveTargetMemory(workspace.path, targetId, nextTargetMemory);\n\n const cycleRecord: SupervisorCycleTargetRecord =\n result.evaluation.status === \"stop\"\n ? {\n cycleId: activeCycle.id,\n targetId,\n startedAt: activeCycle.createdAt,\n completedAt: finishedCycle.completedAt ?? Date.now(),\n result: \"stop\",\n stopReason: result.evaluation.stopReason,\n reason: result.evaluation.reason,\n progressSummary: result.evaluation.progressSummary ?? nextTargetMemory.progressSummary,\n activeStepId: result.evaluation.activeStepId ?? nextTargetMemory.activeStepId,\n stepUpdates: result.evaluation.stepUpdates,\n injected: false,\n attemptCount: this.deps.cycleAttemptRepo.listForCycle(activeCycle.id).length,\n }\n : {\n cycleId: activeCycle.id,\n targetId,\n startedAt: activeCycle.createdAt,\n completedAt: finishedCycle.completedAt ?? Date.now(),\n result: \"continue\",\n reason: result.evaluation.reason,\n guidance: result.injected ? result.injectedText : result.evaluation.guidance,\n progressSummary: nextTargetMemory.progressSummary,\n activeStepId: nextTargetMemory.activeStepId,\n stepUpdates: result.evaluation.stepUpdates,\n injected: result.injected,\n attemptCount: this.deps.cycleAttemptRepo.listForCycle(activeCycle.id).length,\n };\n await this.deps.targetStore.appendTargetCycleRecord(workspace.path, targetId, cycleRecord);\n\n if (result.evaluation.status === \"stop\") {\n await this.updateTargetMetaStatus(workspace.path, targetId, {\n status: result.evaluation.stopReason === \"objective_complete\" ? \"completed\" : \"cancelled\",\n completedAt: finishedCycle.completedAt ?? Date.now(),\n });\n }\n\n if (currentSupervisor.targetId !== targetId) {\n const enriched = this.attachCycles(\n await this.attachTargetState(currentSupervisor, workspace.path)\n );\n this.storeSnapshot(enriched);\n this.broadcastCycle(enriched, finishedCycle, \"updated\");\n this.deps.cycleRepo.pruneOldest(activeCycle.supervisorId, this.config.maxCyclesPerSession);\n this.scheduler.refresh();\n return { cycle: finishedCycle, supervisor: enriched };\n }\n\n const finishedSupervisor = this.attachCycles(\n this.withCurrentTargetState(\n this.deps.supervisorRepo.update(activeCycle.supervisorId, {\n state: result.evaluation.status === \"stop\" ? \"stopped\" : \"idle\",\n completedSupervisionCount:\n (this.supervisors.get(activeCycle.supervisorId)?.completedSupervisionCount ?? 0) + 1,\n stopReason: result.evaluation.status === \"stop\" ? result.evaluation.stopReason : null,\n lastCycleAt: finishedCycle.completedAt,\n lastEvaluatedTurnId: context.lastTurnId ?? undefined,\n errorReason: null,\n updatedAt: Date.now(),\n })\n )\n );\n const enriched = await this.attachTargetState(finishedSupervisor, workspace.path);\n\n this.storeSnapshot(enriched);\n this.broadcastCycle(enriched, finishedCycle, \"updated\");\n this.broadcastState(enriched, \"state_changed\");\n this.deps.cycleRepo.pruneOldest(activeCycle.supervisorId, this.config.maxCyclesPerSession);\n this.scheduler.refresh();\n\n return { cycle: finishedCycle, supervisor: enriched };\n }\n\n /**\n * Flip a supervisor to 'error' state when something blows up before we\n * had a chance to create a cycle. Without this the supervisor can get\n * stuck in whatever state it happened to be in (usually 'evaluating').\n */\n private markSupervisorError(id: string, error: unknown): void {\n logFailure(\n this.logger,\n error,\n { supervisorId: id },\n \"Supervisor evaluation failed before cycle creation\"\n );\n const reason = messageOf(error, \"Supervisor evaluation failed\");\n try {\n const failed = this.attachCycles(\n this.deps.supervisorRepo.update(id, {\n state: \"error\",\n errorReason: reason,\n updatedAt: Date.now(),\n })\n );\n this.storeSnapshot(failed);\n this.broadcastState(failed, \"state_changed\");\n } catch (writeError) {\n this.logger.warn(\n { err: writeError, supervisorId: id },\n \"Failed to persist supervisor error state\"\n );\n }\n }\n\n private requireSessionProvider(providerId: string): ProviderDefinition {\n const provider = this.deps.providerRegistry.find((item) => item.id === providerId);\n if (!provider) {\n throw {\n code: \"supervisor_unsupported_provider\",\n message: `Provider ${providerId} is not registered`,\n };\n }\n return provider;\n }\n\n private supportsSupervisor(provider: ProviderDefinition): boolean {\n return provider.capability === \"full\";\n }\n\n private requireWorkspace(workspaceId: string): { id: string; path: string } {\n const workspace = this.deps.workspaceMgr.get(workspaceId);\n if (!workspace) {\n throw {\n code: \"supervisor_not_found\",\n message: `Workspace ${workspaceId} not found`,\n };\n }\n return workspace;\n }\n\n private async createLegacyTargetFilesIfMissing(\n workspacePath: string,\n supervisor: Supervisor\n ): Promise<void> {\n try {\n await this.deps.targetStore.readTargetMeta(workspacePath, supervisor.targetId);\n } catch (error) {\n if (\n !error ||\n typeof error !== \"object\" ||\n !(\"code\" in error) ||\n (error as { code?: string }).code !== \"ENOENT\"\n ) {\n throw error;\n }\n await this.deps.targetStore.createTargetFiles(workspacePath, {\n targetId: supervisor.targetId,\n sessionId: supervisor.sessionId,\n workspaceId: supervisor.workspaceId,\n objective: supervisor.objective,\n createdAt: supervisor.createdAt,\n });\n }\n }\n\n private async attachTargetState(\n supervisor: Supervisor,\n workspacePath: string\n ): Promise<Supervisor> {\n await this.createLegacyTargetFilesIfMissing(workspacePath, supervisor);\n const [currentTargetMemory, recentTargetCycles] = await Promise.all([\n this.deps.targetStore.loadTargetMemory(workspacePath, supervisor.targetId),\n this.deps.targetStore.readTargetCycleRecords(workspacePath, supervisor.targetId, 20),\n ]);\n\n return {\n ...supervisor,\n currentTargetMemory,\n recentTargetCycles,\n };\n }\n\n private async hydrateTargetState(supervisor: Supervisor): Promise<Supervisor> {\n const workspace = this.deps.workspaceMgr.get(supervisor.workspaceId);\n if (!workspace) {\n return supervisor;\n }\n return await this.attachTargetState(supervisor, workspace.path);\n }\n\n private async hydratePersistedSupervisor(\n supervisorId: string,\n workspacePath: string\n ): Promise<Supervisor | null> {\n const persisted = this.deps.supervisorRepo.findById(supervisorId);\n if (!persisted) {\n return null;\n }\n\n const hydrated = await this.attachTargetState(this.attachCycles(persisted), workspacePath);\n const latest = this.deps.supervisorRepo.findById(supervisorId);\n if (!latest) {\n return null;\n }\n\n if (latest.targetId !== hydrated.targetId) {\n return await this.attachTargetState(this.attachCycles(latest), workspacePath);\n }\n\n return {\n ...this.attachCycles(latest),\n currentTargetMemory: hydrated.currentTargetMemory,\n recentTargetCycles: hydrated.recentTargetCycles,\n };\n }\n\n private withCurrentTargetState(supervisor: Supervisor): Supervisor {\n const current = this.supervisors.get(supervisor.id);\n if (!current || current.targetId !== supervisor.targetId) {\n return supervisor;\n }\n return {\n ...supervisor,\n currentTargetMemory: current.currentTargetMemory,\n recentTargetCycles: current.recentTargetCycles,\n };\n }\n\n private isCancellationRequested(supervisorId: string): boolean {\n return this.pendingPauses.has(supervisorId) || this.pendingObjectiveUpdates.has(supervisorId);\n }\n\n private toSupervisorUpdatePatch(\n supervisor: Supervisor,\n updatedAt: number\n ): Parameters<SupervisorRepo[\"update\"]>[1] {\n return {\n state: supervisor.state,\n objective: supervisor.objective,\n evaluatorProviderId: supervisor.evaluatorProviderId,\n evaluatorModel: supervisor.evaluatorModel ?? null,\n maxSupervisionCount: supervisor.maxSupervisionCount,\n completedSupervisionCount: supervisor.completedSupervisionCount,\n scheduledAt: supervisor.scheduledAt ?? null,\n stopReason: supervisor.stopReason ?? null,\n lastCycleAt: supervisor.lastCycleAt ?? null,\n lastEvaluatedTurnId: supervisor.lastEvaluatedTurnId ?? null,\n errorReason: supervisor.errorReason ?? null,\n updatedAt,\n };\n }\n\n private applyEvaluationToTargetMemory(\n memory: SupervisorTargetMemory,\n evaluation: Awaited<ReturnType<SupervisorEvaluator[\"evaluate\"]>>,\n injectedText: string | undefined,\n updatedAt: number\n ): SupervisorTargetMemory {\n let plan = memory.plan;\n if (evaluation.plan && evaluation.plan.length > 0) {\n plan = evaluation.plan;\n } else if (evaluation.stepUpdates?.length) {\n const updates = new Map(evaluation.stepUpdates.map((step) => [step.id, step.status]));\n plan = memory.plan.map((step) =>\n updates.has(step.id) ? { ...step, status: updates.get(step.id)! } : step\n );\n }\n\n const progressSummary = evaluation.progressSummary ?? memory.progressSummary;\n const lastGuidance =\n evaluation.status === \"continue\"\n ? (injectedText ?? evaluation.guidance ?? memory.lastGuidance)\n : memory.lastGuidance;\n const stalledCount =\n evaluation.status === \"continue\" &&\n !evaluation.progressSummary &&\n !evaluation.stepUpdates?.length\n ? memory.stalledCount + 1\n : 0;\n\n return {\n ...memory,\n planGenerated: memory.planGenerated || Boolean(evaluation.plan?.length),\n plan,\n activeStepId: evaluation.activeStepId ?? memory.activeStepId,\n progressSummary,\n lastGuidance,\n stalledCount,\n updatedAt,\n };\n }\n\n private async updateTargetMetaStatus(\n workspacePath: string,\n targetId: string,\n patch: Partial<Pick<SupervisorTargetMeta, \"status\" | \"supersededBy\" | \"completedAt\">>\n ): Promise<void> {\n const current = await this.deps.targetStore.readTargetMeta(workspacePath, targetId);\n const nextPatch =\n current.status === \"superseded\" && patch.status && patch.status !== \"superseded\"\n ? {\n ...patch,\n status: current.status,\n supersededBy: current.supersededBy,\n }\n : patch;\n await this.deps.targetStore.saveTargetMeta(workspacePath, targetId, {\n ...current,\n ...nextPatch,\n updatedAt: Date.now(),\n });\n }\n\n private async writeErrorTargetCycleRecord(\n workspacePath: string,\n targetId: string,\n cycle: SupervisorCycle,\n errorReason: string\n ): Promise<void> {\n await this.deps.targetStore.appendTargetCycleRecord(workspacePath, targetId, {\n cycleId: cycle.id,\n targetId,\n startedAt: cycle.createdAt,\n completedAt: Date.now(),\n result: \"error\",\n errorReason,\n attemptCount: this.deps.cycleAttemptRepo.listForCycle(cycle.id).length,\n });\n }\n\n private async markTargetCancelledIfActive(\n workspacePath: string,\n supervisor: Supervisor\n ): Promise<void> {\n const meta = await this.deps.targetStore\n .readTargetMeta(workspacePath, supervisor.targetId)\n .catch(() => null);\n if (!meta || meta.status === \"completed\" || meta.status === \"superseded\") {\n return;\n }\n await this.updateTargetMetaStatus(workspacePath, supervisor.targetId, {\n status: \"cancelled\",\n completedAt: meta.completedAt ?? Date.now(),\n });\n }\n\n private assertEvaluatorProvider(providerId: string): void {\n const provider = this.deps.providerRegistry.find((item) => item.id === providerId);\n if (!provider?.buildSupervisorEvalCommand) {\n throw {\n code: \"supervisor_invalid_evaluator_provider\",\n message: `Provider ${providerId} cannot evaluate supervisors`,\n };\n }\n const hasConfig = this.deps.providerConfigRepo.get(providerId) ?? provider.defaultConfig;\n if (!hasConfig) {\n throw {\n code: \"missing_evaluator_config\",\n message: `Missing config for evaluator provider ${providerId}`,\n };\n }\n }\n\n private attachCycles(supervisor: Supervisor): Supervisor {\n return {\n ...supervisor,\n cycles: this.deps.cycleRepo.listRecentForSupervisor(supervisor.id, 20),\n };\n }\n\n private listScheduledSupervisors(): Array<{ supervisorId: string; scheduledAt: number }> {\n return Array.from(this.supervisors.values())\n .filter(\n (supervisor) =>\n supervisor.state === \"idle\" &&\n typeof supervisor.scheduledAt === \"number\" &&\n Number.isFinite(supervisor.scheduledAt)\n )\n .map((supervisor) => ({\n supervisorId: supervisor.id,\n scheduledAt: supervisor.scheduledAt!,\n }));\n }\n\n private storeSnapshot(supervisor: Supervisor): void {\n this.supervisors.set(supervisor.id, supervisor);\n this.supervisorsBySession.set(supervisor.sessionId, supervisor.id);\n }\n\n private deleteNow(supervisor: Supervisor): void {\n const workspace = this.deps.workspaceMgr.get(supervisor.workspaceId);\n if (workspace) {\n void this.markTargetCancelledIfActive(workspace.path, supervisor).catch((error) => {\n this.logger.warn(\n { err: error, supervisorId: supervisor.id, targetId: supervisor.targetId },\n \"Failed to mark target cancelled during supervisor delete\"\n );\n });\n }\n this.deps.supervisorRepo.delete(supervisor.id);\n this.supervisors.delete(supervisor.id);\n this.supervisorsBySession.delete(supervisor.sessionId);\n this.pendingDeletes.delete(supervisor.id);\n this.pendingPauses.delete(supervisor.id);\n this.pendingObjectiveUpdates.delete(supervisor.id);\n this.releaseInFlight(supervisor.id);\n this.scheduler.refresh();\n\n this.deps.broadcaster.broadcast(\n Topics.supervisorState(supervisor.workspaceId, supervisor.sessionId),\n { supervisorId: supervisor.id, event: \"deleted\" }\n );\n }\n\n private releaseInFlight(supervisorId: string): void {\n this.inFlight.delete(supervisorId);\n this.evaluationAbortControllers.delete(supervisorId);\n this.inFlightCompletions.get(supervisorId)?.resolve();\n this.inFlightCompletions.delete(supervisorId);\n }\n\n private supervisorNotFoundError(id: string): { code: \"supervisor_not_found\"; message: string } {\n return {\n code: \"supervisor_not_found\",\n message: `Supervisor ${id} not found`,\n };\n }\n\n private requireSupervisor(id: string): Supervisor {\n const supervisor = this.supervisors.get(id);\n if (!supervisor) {\n throw this.supervisorNotFoundError(id);\n }\n return supervisor;\n }\n\n private broadcastState(\n supervisor: Supervisor,\n event: \"created\" | \"updated\" | \"state_changed\"\n ): void {\n this.deps.broadcaster.broadcast(\n Topics.supervisorState(supervisor.workspaceId, supervisor.sessionId),\n { supervisor, event }\n );\n }\n\n private broadcastCycle(\n supervisor: Supervisor,\n cycle: SupervisorCycle,\n event: \"created\" | \"updated\"\n ): void {\n this.deps.broadcaster.broadcast(\n Topics.supervisorCycle(supervisor.workspaceId, supervisor.sessionId),\n { cycle, event }\n );\n }\n\n private shouldRetryAttempt(\n error: unknown,\n attemptIndex: number,\n retry: SupervisorRetrySnapshot\n ): boolean {\n if (!retry.retryEnabled) {\n return false;\n }\n if (attemptIndex >= retry.retryMaxCount) {\n return false;\n }\n\n const code =\n error && typeof error === \"object\" && \"code\" in error\n ? (error as { code?: unknown }).code\n : undefined;\n\n if (code === \"supervisor_eval_timeout\") {\n return retry.retryOnTimeout;\n }\n\n if (code === \"supervisor_eval_failed\") {\n return retry.retryOnEvaluatorError;\n }\n\n return false;\n }\n\n private async sleep(delayMs: number, signal?: AbortSignal): Promise<void> {\n if (delayMs <= 0) {\n return;\n }\n\n if (signal?.aborted) {\n throw { code: \"supervisor_eval_aborted\", message: \"Supervisor evaluator aborted\" };\n }\n\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, delayMs);\n timer.unref?.();\n\n const onAbort = () => {\n clearTimeout(timer);\n signal?.removeEventListener(\"abort\", onAbort);\n reject({ code: \"supervisor_eval_aborted\", message: \"Supervisor evaluator aborted\" });\n };\n\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n }\n}\n\nfunction isSupervisorEvalAborted(error: unknown): error is {\n code: \"supervisor_eval_aborted\";\n message: string;\n} {\n return (\n !!error &&\n typeof error === \"object\" &&\n (error as { code?: unknown }).code === \"supervisor_eval_aborted\"\n );\n}\n", "import { mkdir, mkdtemp, readFile, rename, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport type { SupervisorCycleTargetRecord, SupervisorTargetMemory } from \"@coder-studio/core\";\n\nexport interface SupervisorTargetMeta {\n targetId: string;\n sessionId: string;\n workspaceId: string;\n objective: string;\n status: \"active\" | \"completed\" | \"cancelled\" | \"superseded\";\n createdAt: number;\n updatedAt: number;\n supersededBy: string | null;\n completedAt: number | null;\n}\n\nfunction targetDir(workspacePath: string, targetId: string): string {\n return join(workspacePath, \".coder-studio\", \"supervisor\", \"targets\", targetId);\n}\n\nfunction metaPath(workspacePath: string, targetId: string): string {\n return join(targetDir(workspacePath, targetId), \"meta.json\");\n}\n\nfunction memoryPath(workspacePath: string, targetId: string): string {\n return join(targetDir(workspacePath, targetId), \"memory.json\");\n}\n\nfunction cyclesPath(workspacePath: string, targetId: string): string {\n return join(targetDir(workspacePath, targetId), \"cycles.jsonl\");\n}\n\nfunction metaFilePath(dirPath: string): string {\n return join(dirPath, \"meta.json\");\n}\n\nfunction memoryFilePath(dirPath: string): string {\n return join(dirPath, \"memory.json\");\n}\n\nfunction cyclesFilePath(dirPath: string): string {\n return join(dirPath, \"cycles.jsonl\");\n}\n\nfunction hasCode(error: unknown, code: string): boolean {\n return Boolean(\n error &&\n typeof error === \"object\" &&\n \"code\" in error &&\n (error as { code?: unknown }).code === code\n );\n}\n\nfunction errorMessage(error: unknown, fallback: string): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (error && typeof error === \"object\" && \"message\" in error) {\n const value = (error as { message?: unknown }).message;\n if (typeof value === \"string\") {\n return value;\n }\n }\n return fallback;\n}\n\nasync function writeJsonIfMissing(path: string, value: unknown): Promise<void> {\n try {\n await writeFile(path, JSON.stringify(value, null, 2) + \"\\n\", {\n encoding: \"utf-8\",\n flag: \"wx\",\n });\n } catch (error) {\n if (!hasCode(error, \"EEXIST\")) {\n throw error;\n }\n }\n}\n\nfunction buildTargetMeta(input: {\n targetId: string;\n sessionId: string;\n workspaceId: string;\n objective: string;\n createdAt: number;\n}): SupervisorTargetMeta {\n return {\n targetId: input.targetId,\n sessionId: input.sessionId,\n workspaceId: input.workspaceId,\n objective: input.objective,\n status: \"active\",\n createdAt: input.createdAt,\n updatedAt: input.createdAt,\n supersededBy: null,\n completedAt: null,\n };\n}\n\nfunction buildTargetMemory(targetId: string, createdAt: number): SupervisorTargetMemory {\n return {\n targetId,\n planGenerated: false,\n plan: [],\n stalledCount: 0,\n updatedAt: createdAt,\n };\n}\n\nasync function writeResetTargetFiles(\n dirPath: string,\n input: {\n targetId: string;\n sessionId: string;\n workspaceId: string;\n objective: string;\n createdAt: number;\n }\n): Promise<void> {\n await mkdir(dirPath, { recursive: true });\n await writeFile(\n metaFilePath(dirPath),\n JSON.stringify(buildTargetMeta(input), null, 2) + \"\\n\",\n \"utf-8\"\n );\n await writeFile(\n memoryFilePath(dirPath),\n JSON.stringify(buildTargetMemory(input.targetId, input.createdAt), null, 2) + \"\\n\",\n \"utf-8\"\n );\n await writeFile(cyclesFilePath(dirPath), \"\", \"utf-8\");\n}\n\nexport async function createTargetFiles(\n workspacePath: string,\n input: {\n targetId: string;\n sessionId: string;\n workspaceId: string;\n objective: string;\n createdAt: number;\n }\n): Promise<void> {\n const dir = targetDir(workspacePath, input.targetId);\n await mkdir(dir, { recursive: true });\n await writeJsonIfMissing(metaPath(workspacePath, input.targetId), buildTargetMeta(input));\n await writeJsonIfMissing(\n memoryPath(workspacePath, input.targetId),\n buildTargetMemory(input.targetId, input.createdAt)\n );\n}\n\nexport async function resetTargetFiles(\n workspacePath: string,\n input: {\n targetId: string;\n sessionId: string;\n workspaceId: string;\n objective: string;\n createdAt: number;\n }\n): Promise<void> {\n const dir = targetDir(workspacePath, input.targetId);\n const parentDir = dirname(dir);\n const backupDir = `${dir}.backup-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n\n await mkdir(parentDir, { recursive: true });\n const stagingDir = await mkdtemp(join(parentDir, `${input.targetId}.reset-`));\n\n let backupCreated = false;\n let promoted = false;\n let restored = false;\n\n try {\n await writeResetTargetFiles(stagingDir, input);\n\n try {\n await rename(dir, backupDir);\n backupCreated = true;\n } catch (error) {\n if (!hasCode(error, \"ENOENT\")) {\n throw error;\n }\n }\n\n try {\n await rename(stagingDir, dir);\n promoted = true;\n } catch (promoteError) {\n if (backupCreated) {\n try {\n await rename(backupDir, dir);\n backupCreated = false;\n restored = true;\n } catch (restoreError) {\n throw new Error(\n `Failed to promote target reset (${errorMessage(\n promoteError,\n \"unknown promote error\"\n )}); restore also failed (${errorMessage(restoreError, \"unknown restore error\")})`\n );\n }\n }\n throw promoteError;\n }\n } catch (error) {\n if (restored || !backupCreated) {\n await rm(stagingDir, { recursive: true, force: true }).catch(() => {});\n }\n throw error;\n }\n\n if (backupCreated) {\n await rm(backupDir, { recursive: true, force: true }).catch(() => {});\n }\n if (!promoted) {\n await rm(stagingDir, { recursive: true, force: true }).catch(() => {});\n }\n}\n\nexport async function readTargetMeta(\n workspacePath: string,\n targetId: string\n): Promise<SupervisorTargetMeta> {\n return JSON.parse(\n await readFile(metaPath(workspacePath, targetId), \"utf-8\")\n ) as SupervisorTargetMeta;\n}\n\nexport async function loadTargetMemory(\n workspacePath: string,\n targetId: string\n): Promise<SupervisorTargetMemory> {\n return JSON.parse(\n await readFile(memoryPath(workspacePath, targetId), \"utf-8\")\n ) as SupervisorTargetMemory;\n}\n\nexport async function saveTargetMemory(\n workspacePath: string,\n targetId: string,\n memory: SupervisorTargetMemory\n): Promise<void> {\n await mkdir(dirname(memoryPath(workspacePath, targetId)), { recursive: true });\n await writeFile(\n memoryPath(workspacePath, targetId),\n JSON.stringify(memory, null, 2) + \"\\n\",\n \"utf-8\"\n );\n}\n\nexport async function appendTargetCycleRecord(\n workspacePath: string,\n targetId: string,\n record: SupervisorCycleTargetRecord\n): Promise<void> {\n await mkdir(dirname(cyclesPath(workspacePath, targetId)), { recursive: true });\n await writeFile(cyclesPath(workspacePath, targetId), JSON.stringify(record) + \"\\n\", {\n encoding: \"utf-8\",\n flag: \"a\",\n });\n}\n\nexport async function saveTargetMeta(\n workspacePath: string,\n targetId: string,\n meta: SupervisorTargetMeta\n): Promise<void> {\n await mkdir(dirname(metaPath(workspacePath, targetId)), { recursive: true });\n await writeFile(metaPath(workspacePath, targetId), JSON.stringify(meta, null, 2) + \"\\n\", \"utf-8\");\n}\n\nexport async function readTargetCycleRecords(\n workspacePath: string,\n targetId: string,\n limit = 20\n): Promise<SupervisorCycleTargetRecord[]> {\n const content = await readFile(cyclesPath(workspacePath, targetId), \"utf-8\").catch(() => \"\");\n return content\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line) => JSON.parse(line) as SupervisorCycleTargetRecord)\n .slice(-limit)\n .reverse();\n}\n\nexport async function markTargetSuperseded(\n workspacePath: string,\n targetId: string,\n nextTargetId: string,\n updatedAt: number\n): Promise<void> {\n const meta = await readTargetMeta(workspacePath, targetId);\n await saveTargetMeta(workspacePath, targetId, {\n ...meta,\n status: \"superseded\",\n supersededBy: nextTargetId,\n updatedAt,\n });\n}\n", "// Active terminal instance (spec \u00A74.5)\n\nimport type { Terminal } from \"@coder-studio/core\";\nimport { RingBuffer } from \"./ring-buffer\";\nimport type { HeadlessSnapshotBuffer } from \"./terminal-snapshot-buffer\";\nimport type { PtyProcess, TerminalSpec } from \"./types\";\n\n/**\n * Active terminal object that holds PTY instance and ring buffer\n */\nexport class ActiveTerminal {\n public alive = true;\n public exitCode?: number;\n public cleanupTimer: NodeJS.Timeout | null = null;\n // Track current PTY dimensions so TerminalManager.resize() can skip\n // redundant pty.resize() calls. Each unnecessary pty.resize() sends\n // SIGWINCH to the child process (e.g. codex), which triggers a full\n // clear-screen + repaint cycle. Under WebSocket back-pressure the\n // StreamBuffer may drop the clear-screen frame while delivering the\n // repaint frame, causing duplicate content on the frontend.\n public currentCols: number;\n public currentRows: number;\n\n constructor(\n public readonly id: string,\n public readonly spec: TerminalSpec,\n public readonly pty: PtyProcess,\n public readonly ringBuffer: RingBuffer,\n public readonly snapshotBuffer: HeadlessSnapshotBuffer | undefined,\n public readonly createdAt: number = Date.now()\n ) {\n this.currentCols = spec.cols ?? 120;\n this.currentRows = spec.rows ?? 30;\n }\n\n /**\n * Convert to DTO (Data Transfer Object) for external use\n */\n toDTO(): Terminal {\n return {\n id: this.id,\n workspaceId: this.spec.workspaceId,\n kind: this.spec.kind,\n title: this.spec.title ?? this.spec.argv.join(\" \"),\n cwd: this.spec.cwd,\n argv: this.spec.argv,\n cols: this.spec.cols ?? 120,\n rows: this.spec.rows ?? 30,\n alive: this.alive,\n createdAt: this.createdAt,\n endedAt: this.alive ? undefined : Date.now(),\n exitCode: this.exitCode,\n };\n }\n\n /**\n * Convert to database row for persistence\n */\n toRow(): Terminal {\n return this.toDTO();\n }\n}\n", "export const RING_BUFFER_SIZE = 64 * 1024 * 1024;\nexport const TERMINAL_SNAPSHOT_SCROLLBACK = 1000;\n", "// Ring buffer implementation for terminal output (spec \u00A74.5)\n\n/**\n * Circular overwrite ring buffer for terminal output.\n * Buffer size is configurable at construction time.\n */\nexport class RingBuffer {\n private buffer: Buffer;\n private writePos = 0;\n private totalBytes = 0;\n\n constructor(private readonly size: number) {\n this.buffer = Buffer.alloc(size);\n }\n\n /**\n * Append a chunk of data to the ring buffer\n * Returns the sequence number (cumulative byte count)\n */\n append(chunk: Buffer): { seq: number } {\n if (chunk.length === 0) {\n return { seq: this.totalBytes };\n }\n\n // Write in circular fashion\n let remaining = chunk.length;\n let offset = 0;\n\n while (remaining > 0) {\n const availableSpace = this.size - this.writePos;\n const writeLength = Math.min(remaining, availableSpace);\n\n chunk.copy(this.buffer, this.writePos, offset, offset + writeLength);\n\n this.writePos = (this.writePos + writeLength) % this.size;\n offset += writeLength;\n remaining -= writeLength;\n }\n\n this.totalBytes += chunk.length;\n\n return { seq: this.totalBytes };\n }\n\n /**\n * Replay data from a given sequence number\n * Returns the data and new sequence number, or 'too_old' if data was overwritten\n */\n replayFrom(lastSeq: number): { status: \"ok\"; data: Buffer; seq: number } | { status: \"too_old\" } {\n if (lastSeq >= this.totalBytes) {\n // No new data\n return { status: \"ok\", data: Buffer.alloc(0), seq: this.totalBytes };\n }\n\n const bytesToRead = this.totalBytes - lastSeq;\n\n // Check if requested data is still in buffer\n if (bytesToRead > this.size) {\n return { status: \"too_old\" };\n }\n\n // Extract data from circular buffer\n const data = Buffer.alloc(bytesToRead);\n let readPos = this.writePos - bytesToRead;\n if (readPos < 0) {\n readPos += this.size;\n }\n\n let remaining = bytesToRead;\n let offset = 0;\n\n while (remaining > 0) {\n const availableBytes = this.size - readPos;\n const readLength = Math.min(remaining, availableBytes);\n\n this.buffer.copy(data, offset, readPos, readPos + readLength);\n\n readPos = (readPos + readLength) % this.size;\n offset += readLength;\n remaining -= readLength;\n }\n\n return { status: \"ok\", data, seq: this.totalBytes };\n }\n\n /**\n * Get a snapshot of current valid bytes in the buffer\n */\n snapshot(): Buffer {\n const validBytes = Math.min(this.totalBytes, this.size);\n const startPos = this.totalBytes > this.size ? this.writePos : 0;\n\n const snapshot = Buffer.alloc(validBytes);\n let readPos = startPos;\n let remaining = validBytes;\n let offset = 0;\n\n while (remaining > 0) {\n const availableBytes = this.size - readPos;\n const readLength = Math.min(remaining, availableBytes);\n\n this.buffer.copy(snapshot, offset, readPos, readPos + readLength);\n\n readPos = (readPos + readLength) % this.size;\n offset += readLength;\n remaining -= readLength;\n }\n\n return snapshot;\n }\n\n /**\n * Read the last N bytes currently retained in the buffer.\n * Reads directly from the circular buffer \u2014 O(N), not O(size).\n */\n tail(bytes: number): Buffer {\n if (bytes <= 0) {\n return Buffer.alloc(0);\n }\n\n const validBytes = Math.min(this.totalBytes, this.size);\n const bytesToRead = Math.min(bytes, validBytes);\n\n if (bytesToRead === 0) {\n return Buffer.alloc(0);\n }\n\n let readPos = this.writePos - bytesToRead;\n if (readPos < 0) {\n readPos += this.size;\n }\n\n const result = Buffer.allocUnsafe(bytesToRead);\n let remaining = bytesToRead;\n let offset = 0;\n\n while (remaining > 0) {\n const availableBytes = this.size - readPos;\n const readLength = Math.min(remaining, availableBytes);\n\n this.buffer.copy(result, offset, readPos, readPos + readLength);\n\n readPos = (readPos + readLength) % this.size;\n offset += readLength;\n remaining -= readLength;\n }\n\n return result;\n }\n\n /**\n * Get current sequence number (total bytes written)\n */\n getSeq(): number {\n return this.totalBytes;\n }\n}\n", "import { SerializeAddon } from \"@xterm/addon-serialize\";\nimport type { Terminal as HeadlessTerminal } from \"@xterm/headless\";\nimport XtermHeadless from \"@xterm/headless\";\nimport { TERMINAL_SNAPSHOT_SCROLLBACK } from \"./constants\";\n\nconst { Terminal } = XtermHeadless;\n\nexport interface TerminalSnapshotResult {\n data: Buffer;\n seq: number;\n cols: number;\n rows: number;\n}\n\nexport class SnapshotUnsupportedError extends Error {\n constructor(message = \"Terminal snapshot buffer is unavailable\") {\n super(message);\n this.name = \"SnapshotUnsupportedError\";\n }\n}\n\nexport class HeadlessSnapshotBuffer {\n private term: HeadlessTerminal | null;\n private addon: SerializeAddon | null;\n private cols: number;\n private rows: number;\n private mirroredSeq = 0;\n private disabledState = false;\n private disposed = false;\n private pendingWriteCount = 0;\n private drainResolvers: Array<() => void> = [];\n\n constructor(options: { cols: number; rows: number; scrollback?: number }) {\n this.cols = options.cols;\n this.rows = options.rows;\n this.term = new Terminal({\n cols: options.cols,\n rows: options.rows,\n scrollback: options.scrollback ?? TERMINAL_SNAPSHOT_SCROLLBACK,\n allowProposedApi: true,\n });\n this.addon = new SerializeAddon();\n this.term.loadAddon(this.addon);\n }\n\n get disabled(): boolean {\n return this.disabledState;\n }\n\n write(chunk: Buffer, seq: number): void {\n const term = this.requireTerminal();\n\n this.pendingWriteCount += 1;\n try {\n term.write(chunk, () => {\n this.mirroredSeq = seq;\n this.pendingWriteCount = Math.max(0, this.pendingWriteCount - 1);\n this.resolveDrainIfIdle();\n });\n } catch (error) {\n this.pendingWriteCount = Math.max(0, this.pendingWriteCount - 1);\n this.disable();\n throw error;\n }\n }\n\n resize(cols: number, rows: number): void {\n const term = this.requireTerminal();\n\n try {\n term.resize(cols, rows);\n this.cols = cols;\n this.rows = rows;\n } catch (error) {\n this.disable();\n throw error;\n }\n }\n\n async snapshot(): Promise<TerminalSnapshotResult> {\n this.requireTerminal();\n const addon = this.requireAddon();\n\n await this.waitForPendingWrites();\n\n try {\n const serialized = addon.serialize();\n return {\n data: Buffer.from(serialized, \"utf8\"),\n seq: this.mirroredSeq,\n cols: this.cols,\n rows: this.rows,\n };\n } catch (error) {\n this.disable();\n throw error;\n }\n }\n\n dispose(): void {\n if (this.disposed) {\n return;\n }\n\n this.disposed = true;\n this.term?.dispose();\n this.addon?.dispose();\n this.term = null;\n this.addon = null;\n this.disabledState = true;\n this.pendingWriteCount = 0;\n this.resolveDrainIfIdle();\n }\n\n private waitForPendingWrites(): Promise<void> {\n if (this.pendingWriteCount === 0) {\n return Promise.resolve();\n }\n\n return new Promise((resolve) => {\n this.drainResolvers.push(resolve);\n });\n }\n\n private resolveDrainIfIdle(): void {\n if (this.pendingWriteCount !== 0) {\n return;\n }\n\n const resolvers = this.drainResolvers;\n this.drainResolvers = [];\n for (const resolve of resolvers) {\n resolve();\n }\n }\n\n private requireTerminal(): HeadlessTerminal {\n if (this.disposed || this.disabledState || !this.term) {\n throw new SnapshotUnsupportedError();\n }\n\n return this.term;\n }\n\n private requireAddon(): SerializeAddon {\n if (this.disposed || this.disabledState || !this.addon) {\n throw new SnapshotUnsupportedError();\n }\n\n return this.addon;\n }\n\n private disable(): void {\n this.disabledState = true;\n this.resolveDrainIfIdle();\n }\n}\n", "// Terminal types (spec \u00A74.5)\n\nimport type { Terminal } from \"@coder-studio/core\";\n\n/**\n * Specification for creating a new terminal\n */\nexport interface TerminalSpec {\n workspaceId: string;\n kind: \"agent\" | \"shell\";\n argv: string[];\n cwd: string;\n env?: Record<string, string>;\n cols?: number;\n rows?: number;\n title?: string;\n}\n\n/**\n * Options for spawning a PTY process\n */\nexport interface PtySpawnOptions {\n cwd: string;\n env: Record<string, string>;\n cols: number;\n rows: number;\n}\n\n/**\n * Result of replay operation\n */\nexport type ReplayResult =\n | { status: \"ok\"; data: Buffer; seq: number }\n | { status: \"too_old\" }\n | { status: \"unknown\" };\n\n/**\n * Error thrown when terminal is not alive\n */\nexport class TerminalNotAliveError extends Error {\n constructor(message = \"Terminal is not alive\") {\n super(message);\n this.name = \"TerminalNotAliveError\";\n }\n}\n\n/**\n * Error thrown when terminal spawn fails synchronously\n */\nexport class TerminalSpawnError extends Error {\n readonly code = \"terminal_spawn_failed\";\n\n constructor(\n public readonly kind: \"spawn_failed_sync\",\n public readonly cause: Error,\n public readonly details?: {\n command?: string;\n cwd?: string;\n terminalKind?: \"agent\" | \"shell\";\n }\n ) {\n super(`Terminal spawn failed: ${cause.message}`);\n this.name = \"TerminalSpawnError\";\n }\n}\n\n/**\n * PTY process interface (abstraction over node-pty)\n */\nexport interface PtyProcess {\n onData(callback: (data: string) => void): void;\n onExit(callback: (event: { exitCode: number }) => void): void;\n write(data: Buffer | string): void;\n resize(cols: number, rows: number): void;\n kill(signal?: NodeJS.Signals): Promise<void>;\n}\n\n/**\n * PTY host interface (abstraction for testing)\n */\nexport interface PtyHost {\n spawn(argv: string[], options: PtySpawnOptions): PtyProcess;\n}\n\n/**\n * Broadcaster interface (for WebSocket broadcast)\n */\nexport interface Broadcaster {\n broadcast(topic: string, payload: unknown): void;\n}\n\n/**\n * Database interface for terminal persistence\n */\nexport interface TerminalDatabase {\n insert(terminal: Terminal): void;\n markEnded(id: string, endedAt: number, exitCode: number): void;\n}\n\n/**\n * Terminal ID type\n */\nexport type TerminalId = string;\n", "// Terminal manager implementation (spec \u00A74.5)\n\nimport type { DomainEvent, Terminal } from \"@coder-studio/core\";\nimport type { EventBus } from \"../bus/event-bus\";\nimport { ActiveTerminal } from \"./active-terminal\";\nimport { RING_BUFFER_SIZE } from \"./constants\";\nimport { RingBuffer } from \"./ring-buffer\";\nimport { type RenderOptions, renderSnapshotToText } from \"./snapshot-render\";\nimport { HeadlessSnapshotBuffer } from \"./terminal-snapshot-buffer\";\nimport type {\n PtyHost,\n PtyProcess,\n ReplayResult,\n TerminalDatabase,\n TerminalId,\n TerminalSpec,\n} from \"./types\";\nimport { TerminalSpawnError } from \"./types\";\n\nfunction isTerminalTraceEnabled(): boolean {\n return process.env.CODER_STUDIO_TERMINAL_TRACE === \"1\";\n}\n\nfunction countOccurrences(text: string, needle: string): number {\n return text.split(needle).length - 1;\n}\n\nfunction summarizeTerminalData(data: string | Buffer) {\n const text = typeof data === \"string\" ? data : data.toString(\"utf8\");\n return {\n length: typeof data === \"string\" ? Buffer.byteLength(data, \"utf8\") : data.byteLength,\n syncStart: countOccurrences(text, \"\\x1b[?2026h\"),\n syncEnd: countOccurrences(text, \"\\x1b[?2026l\"),\n clearToEnd: countOccurrences(text, \"\\x1b[J\"),\n clearScreen: countOccurrences(text, \"\\x1b[2J\"),\n eraseLine: countOccurrences(text, \"\\x1b[K\"),\n cursorHome: countOccurrences(text, \"\\x1b[1;1H\"),\n dsr: countOccurrences(text, \"\\x1b[6n\"),\n da: countOccurrences(text, \"\\x1b[c\"),\n reverseIndex: countOccurrences(text, \"\\x1bM\"),\n cursorMoves: text.match(/\\x1b\\[[0-9;]*[Hf]/g)?.length ?? 0,\n scrollRegions: text.match(/\\x1b\\[[0-9;]*r/g)?.slice(0, 6) ?? [],\n };\n}\n\nfunction traceTerminal(\n terminalId: TerminalId,\n event: string,\n details: Record<string, unknown> = {}\n) {\n if (!isTerminalTraceEnabled()) {\n return;\n }\n\n console.debug(\"[terminal-trace]\", {\n at: Date.now(),\n terminalId,\n event,\n ...details,\n });\n}\n\ntype SnapshotResult =\n | { status: \"ok\"; data: Buffer; seq: number; cols: number; rows: number }\n | { status: \"unsupported\" };\n\n/**\n * Generate unique terminal ID\n */\nfunction generateId(): string {\n return `term_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Terminal manager - manages PTY lifecycle and ring buffers\n */\nexport class TerminalManager {\n private terminals = new Map<TerminalId, ActiveTerminal>();\n private explicitCloseWaiters = new Map<\n TerminalId,\n {\n signal: NodeJS.Signals;\n killCompleted: Promise<void>;\n markKillCompleted: () => void;\n finalized: boolean;\n promise: Promise<void>;\n resolve: () => void;\n }\n >();\n\n constructor(\n private readonly deps: {\n ptyHost: PtyHost;\n eventBus: EventBus;\n db: TerminalDatabase;\n }\n ) {}\n\n /**\n * Create a new terminal with PTY process\n */\n create(spec: TerminalSpec): Terminal {\n const id = generateId();\n\n // The PTY output is always rendered by xterm.js on the frontend, so force\n // a full-color terminal environment regardless of the server's parent TTY\n // (e.g. tmux's screen-256color, kitty's xterm-kitty, or CI's dumb).\n // FORCE_COLOR makes agent CLIs that are spawned directly (e.g. Claude Code\n // via Ink/chalk, Codex) emit ANSI colors without relying on the user's\n // shell rc to set it. spec.env can still override explicitly.\n const terminalEnv: Record<string, string> = {\n ...Object.fromEntries(\n Object.entries(process.env).filter((e): e is [string, string] => e[1] != null)\n ),\n TERM: \"xterm-256color\",\n COLORTERM: \"truecolor\",\n FORCE_COLOR: \"3\",\n ...spec.env,\n };\n\n let pty: PtyProcess;\n try {\n pty = this.deps.ptyHost.spawn(spec.argv, {\n cwd: spec.cwd,\n env: terminalEnv,\n cols: spec.cols ?? 120,\n rows: spec.rows ?? 30,\n });\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n throw new TerminalSpawnError(\"spawn_failed_sync\", error, {\n command: spec.argv[0],\n cwd: spec.cwd,\n terminalKind: spec.kind,\n });\n }\n\n const ringBuffer = new RingBuffer(RING_BUFFER_SIZE);\n let snapshotBuffer: HeadlessSnapshotBuffer | undefined;\n\n if (spec.kind === \"shell\" || spec.kind === \"agent\") {\n try {\n snapshotBuffer = new HeadlessSnapshotBuffer({\n cols: spec.cols ?? 120,\n rows: spec.rows ?? 30,\n });\n } catch (err) {\n traceTerminal(id, \"snapshot.init.error\", {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n // Create active terminal\n const active = new ActiveTerminal(id, spec, pty, ringBuffer, snapshotBuffer);\n\n // Wire up PTY events\n this.wireEvents(active);\n\n // Store in memory and persist to database\n this.terminals.set(id, active);\n this.deps.db.insert(active.toRow());\n\n // Emit terminal.created DomainEvent\n const event: DomainEvent = {\n type: \"terminal.created\",\n workspaceId: spec.workspaceId,\n terminalId: id,\n kind: spec.kind,\n title: spec.title ?? \"\",\n cwd: spec.cwd,\n } satisfies DomainEvent;\n this.deps.eventBus.emit(event);\n\n return active.toDTO();\n }\n\n /**\n * Wire up PTY process events\n */\n private wireEvents(active: ActiveTerminal): void {\n const { pty, ringBuffer, spec, id } = active;\n\n // Handle PTY output\n pty.onData((data: string) => {\n const buffer = Buffer.from(data, \"utf-8\");\n const { seq } = ringBuffer.append(buffer);\n traceTerminal(id, \"pty.output\", {\n workspaceId: spec.workspaceId,\n seq,\n summary: summarizeTerminalData(buffer),\n });\n\n // Emit terminal.output DomainEvent\n const event: DomainEvent = {\n type: \"terminal.output\",\n workspaceId: spec.workspaceId,\n terminalId: id,\n chunk: buffer,\n seq,\n } satisfies DomainEvent;\n this.deps.eventBus.emit(event);\n\n if (active.snapshotBuffer && !active.snapshotBuffer.disabled) {\n try {\n active.snapshotBuffer.write(buffer, seq);\n } catch (err) {\n traceTerminal(id, \"snapshot.write.error\", {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n });\n\n // Handle PTY exit\n pty.onExit(({ exitCode }: { exitCode: number }) => {\n active.alive = false;\n active.exitCode = exitCode;\n\n // Emit terminal.exited DomainEvent\n const event: DomainEvent = {\n type: \"terminal.exited\",\n workspaceId: spec.workspaceId,\n terminalId: id,\n exitCode,\n } satisfies DomainEvent;\n this.deps.eventBus.emit(event);\n\n const explicitClose = this.explicitCloseWaiters.get(id);\n if (explicitClose) {\n void explicitClose.killCompleted.finally(() => {\n if (!explicitClose.finalized) {\n explicitClose.finalized = true;\n this.finalizeTerminal(active);\n }\n this.explicitCloseWaiters.delete(id);\n explicitClose.resolve();\n });\n } else {\n // Keep ActiveTerminal object for 1s to allow replay, then cleanup\n active.cleanupTimer = setTimeout(() => {\n this.finalizeTerminal(active);\n }, 1000);\n }\n\n // Mark as ended in database\n this.deps.db.markEnded(id, Date.now(), exitCode);\n });\n }\n\n private finalizeTerminal(active: ActiveTerminal): void {\n if (active.cleanupTimer) {\n clearTimeout(active.cleanupTimer);\n active.cleanupTimer = null;\n }\n active.snapshotBuffer?.dispose();\n this.terminals.delete(active.id);\n }\n\n /**\n * Write data to terminal\n */\n write(terminalId: TerminalId, bytes: Buffer): void {\n const terminal = this.terminals.get(terminalId);\n if (!terminal) {\n throw new Error(`Terminal not found: ${terminalId}`);\n }\n if (!terminal.alive) {\n throw new Error(\"Terminal is not alive\");\n }\n\n traceTerminal(terminalId, \"pty.write\", {\n summary: summarizeTerminalData(bytes),\n });\n terminal.pty.write(bytes);\n }\n\n /**\n * Resize terminal.\n *\n * Skips the syscall when cols/rows haven't changed. Every pty.resize()\n * delivers SIGWINCH to the child, and TUI apps (codex, claude) respond\n * with a full clear-screen + repaint. That redraw data floods the\n * StreamBuffer; under back-pressure the oldest frames (the clear-screen)\n * are dropped while the repaint frames survive, causing the frontend to\n * render repaint content without a preceding clear \u2014 visible as\n * duplicate content blocks.\n */\n resize(terminalId: TerminalId, cols: number, rows: number): void {\n const terminal = this.terminals.get(terminalId);\n if (!terminal || !terminal.alive) {\n return;\n }\n\n if (terminal.currentCols === cols && terminal.currentRows === rows) {\n traceTerminal(terminalId, \"pty.resize.skip\", { cols, rows });\n return;\n }\n\n traceTerminal(terminalId, \"pty.resize\", {\n prevCols: terminal.currentCols,\n prevRows: terminal.currentRows,\n cols,\n rows,\n });\n terminal.currentCols = cols;\n terminal.currentRows = rows;\n terminal.pty.resize(cols, rows);\n if (terminal.snapshotBuffer && !terminal.snapshotBuffer.disabled) {\n try {\n terminal.snapshotBuffer.resize(cols, rows);\n } catch (err) {\n traceTerminal(terminalId, \"snapshot.resize.error\", {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n }\n\n /**\n * Kill terminal process\n */\n kill(terminalId: TerminalId, signal: NodeJS.Signals = \"SIGTERM\"): void {\n const terminal = this.terminals.get(terminalId);\n if (terminal) {\n void terminal.pty.kill(signal);\n }\n }\n\n close(terminalId: TerminalId, signal: NodeJS.Signals = \"SIGTERM\"): Promise<void> {\n const terminal = this.terminals.get(terminalId);\n if (!terminal) {\n return Promise.resolve();\n }\n\n if (!terminal.alive) {\n const existing = this.explicitCloseWaiters.get(terminalId);\n if (existing) {\n if (!existing.finalized) {\n existing.finalized = true;\n this.finalizeTerminal(terminal);\n }\n return existing.promise;\n }\n\n this.finalizeTerminal(terminal);\n return Promise.resolve();\n }\n\n const existing = this.explicitCloseWaiters.get(terminalId);\n if (existing) {\n if (existing.signal !== signal) {\n terminal.pty.kill(signal);\n }\n return existing.promise;\n }\n\n let resolve = () => {};\n const promise = new Promise<void>((innerResolve) => {\n resolve = innerResolve;\n });\n let markKillCompleted = () => {};\n const killCompleted = new Promise<void>((innerResolve) => {\n markKillCompleted = innerResolve;\n });\n this.explicitCloseWaiters.set(terminalId, {\n signal,\n killCompleted,\n markKillCompleted,\n finalized: false,\n promise,\n resolve,\n });\n void terminal.pty.kill(signal).finally(() => {\n const waiter = this.explicitCloseWaiters.get(terminalId);\n if (!waiter) {\n return;\n }\n\n waiter.markKillCompleted();\n });\n return promise;\n }\n\n killForWorkspace(workspaceId: string, signal: NodeJS.Signals = \"SIGTERM\"): void {\n for (const terminal of this.terminals.values()) {\n if (terminal.spec.workspaceId !== workspaceId || !terminal.alive) {\n continue;\n }\n\n void terminal.pty.kill(signal);\n }\n }\n\n async closeForWorkspace(workspaceId: string, signal: NodeJS.Signals = \"SIGTERM\"): Promise<void> {\n const closes: Promise<void>[] = [];\n\n for (const terminal of this.terminals.values()) {\n if (terminal.spec.workspaceId !== workspaceId) {\n continue;\n }\n\n closes.push(this.close(terminal.id, signal));\n }\n\n await Promise.all(closes);\n }\n\n /**\n * Get active terminal by ID\n */\n get(terminalId: TerminalId): ActiveTerminal | undefined {\n return this.terminals.get(terminalId);\n }\n\n /**\n * Replay terminal output from a given sequence number\n */\n replay(terminalId: TerminalId, lastSeq: number): ReplayResult {\n const terminal = this.terminals.get(terminalId);\n if (terminal) {\n const result = terminal.ringBuffer.replayFrom(lastSeq);\n traceTerminal(terminalId, \"replay\", {\n lastSeq,\n status: result.status,\n seq: result.status === \"ok\" ? result.seq : undefined,\n size: result.status === \"ok\" ? result.data.byteLength : undefined,\n summary: result.status === \"ok\" ? summarizeTerminalData(result.data) : undefined,\n });\n return result;\n }\n\n return { status: \"unknown\" };\n }\n\n /**\n * Serialize the current terminal screen state for hard-refresh recovery.\n */\n async snapshot(terminalId: TerminalId): Promise<SnapshotResult> {\n const terminal = this.terminals.get(terminalId);\n if (!terminal || !terminal.snapshotBuffer) {\n return { status: \"unsupported\" };\n }\n\n if (terminal.snapshotBuffer.disabled) {\n return { status: \"unsupported\" };\n }\n\n try {\n const result = await terminal.snapshotBuffer.snapshot();\n return {\n status: \"ok\",\n data: result.data,\n seq: result.seq,\n cols: result.cols,\n rows: result.rows,\n };\n } catch (err) {\n traceTerminal(terminalId, \"snapshot.unsupported\", {\n error: err instanceof Error ? err.message : String(err),\n });\n return { status: \"unsupported\" };\n }\n }\n\n /**\n * Render the current terminal snapshot to plain text for supervisor use.\n */\n async getRenderedSnapshot(terminalId: TerminalId, options: RenderOptions): Promise<string> {\n const snapshot = await this.snapshot(terminalId);\n if (snapshot.status !== \"ok\") {\n return \"\";\n }\n\n return renderSnapshotToText(snapshot.data, options);\n }\n\n /**\n * Read the last N bytes of terminal output from the active ring buffer.\n */\n getRingBufferTail(terminalId: TerminalId, bytes: number): Buffer {\n const terminal = this.terminals.get(terminalId);\n if (terminal) {\n return terminal.ringBuffer.tail(bytes);\n }\n\n return Buffer.alloc(0);\n }\n\n /**\n * Get all active terminals\n */\n getAll(): ActiveTerminal[] {\n return Array.from(this.terminals.values());\n }\n\n /**\n * Clean up all terminals (for graceful shutdown)\n */\n shutdown(): void {\n for (const waiter of this.explicitCloseWaiters.values()) {\n waiter.resolve();\n }\n this.explicitCloseWaiters.clear();\n\n for (const terminal of this.terminals.values()) {\n if (terminal.alive) {\n void terminal.pty.kill(\"SIGTERM\");\n }\n this.finalizeTerminal(terminal);\n }\n this.terminals.clear();\n }\n}\n", "/**\n * Workspace path validation and permission checks.\n */\n\nimport { constants } from \"fs\";\nimport { access, stat } from \"fs/promises\";\n\nexport interface ValidationResult {\n valid: boolean;\n error?: string;\n}\n\n/**\n * Validates that a path exists, is a directory, and is readable/writable.\n */\nexport async function validatePath(path: string): Promise<ValidationResult> {\n try {\n // Check if path exists\n const stats = await stat(path);\n\n // Check if it's a directory\n if (!stats.isDirectory()) {\n return { valid: false, error: \"Path is not a directory\" };\n }\n\n // Check read permissions\n await access(path, constants.R_OK);\n\n // Check write permissions\n await access(path, constants.W_OK);\n\n return { valid: true };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return { valid: false, error: \"Path does not exist\" };\n }\n if ((error as NodeJS.ErrnoException).code === \"EACCES\") {\n return { valid: false, error: \"Permission denied\" };\n }\n return { valid: false, error: `Validation failed: ${(error as Error).message}` };\n }\n}\n\n/**\n * Validates workspace path with detailed error messages.\n */\nexport class WorkspaceValidator {\n async validate(path: string): Promise<void> {\n const result = await validatePath(path);\n\n if (!result.valid) {\n throw new Error(`Invalid workspace path: ${result.error}`);\n }\n }\n}\n", "/**\n * .gitignore parser and filter using the 'ignore' library.\n */\n\nimport { existsSync, readFileSync } from \"fs\";\nimport ignore from \"ignore\";\nimport { join, relative } from \"path\";\n\nconst DEFAULT_WATCHER_IGNORED_PATTERNS: RegExp[] = [\n /(^|\\/)node_modules(\\/|$)/,\n /\\.DS_Store/,\n /Thumbs\\.db/,\n /(^|\\/)\\.playwright-mcp(\\/|$)/,\n];\n\nfunction normalizePath(path: string): string {\n return path.replace(/\\\\/g, \"/\");\n}\n\nfunction relativeToRoot(rootPath: string, path: string): string {\n return normalizePath(relative(rootPath, path));\n}\n\nfunction isDefaultTreeIgnored(name: string): boolean {\n return name.startsWith(\".\") || name === \"node_modules\" || name === \".git\";\n}\n\nfunction isTreeHidden(name: string): boolean {\n return name === \".git\";\n}\n\nfunction isAlwaysTreeIgnored(name: string): boolean {\n return name === \"node_modules\" || name === \".git\";\n}\n\nfunction isIgnoredByGitignore(ig: ReturnType<typeof ignore>, path: string): boolean {\n if (!path || path.startsWith(\"..\")) {\n return false;\n }\n return ig.ignores(path) || ig.ignores(`${path}/`);\n}\n\n/**\n * Creates a filter function that respects .gitignore rules for a given directory.\n * Returns false if the entry should be skipped (ignored), true if it should be included.\n *\n * @param rootPath - Workspace root path (for .gitignore resolution)\n * @param dirPath - Current directory being read\n * @returns Filter function: (name: string) => boolean\n */\nexport function createGitignoreFilter(\n rootPath: string,\n dirPath: string\n): (name: string) => boolean {\n const gitignorePath = join(rootPath, \".gitignore\");\n\n if (!existsSync(gitignorePath)) {\n // No .gitignore: default to skipping dotfiles, node_modules, .git\n return (name: string) => !isDefaultTreeIgnored(name);\n }\n\n const gitignoreContent = readFileSync(gitignorePath, \"utf-8\");\n const ig = ignore().add(gitignoreContent);\n\n return (name: string) => {\n if (isAlwaysTreeIgnored(name)) {\n return false;\n }\n\n const relativePath = relativeToRoot(rootPath, join(dirPath, name));\n return !isIgnoredByGitignore(ig, relativePath);\n };\n}\n\n/**\n * Creates a filter for directory tree visibility.\n * Returns false if the entry should be hidden from the tree, true otherwise.\n */\nexport function createTreeVisibilityFilter(): (name: string) => boolean {\n return (name: string) => !isTreeHidden(name);\n}\n\n/**\n * Creates a filter for the file watcher (chokidar).\n * Returns a function suitable for chokidar's `ignored` option.\n */\nexport function createWatcherIgnoreFilter(rootPath: string): (path: string) => boolean {\n void rootPath;\n\n // Watcher coverage intentionally ignores .gitignore so frontend refreshes\n // can react to generated files and other ignored paths. Keep only the\n // hard-coded noise filters here.\n return (path: string) =>\n DEFAULT_WATCHER_IGNORED_PATTERNS.some((p) => p.test(normalizePath(path)));\n}\n", "/**\n * WorkspaceWatcher - File system watcher with throttled dirty signal.\n * Uses .gitignore for ignore rules.\n */\n\nimport { Topics } from \"@coder-studio/core\";\nimport type { FSWatcher } from \"chokidar\";\nimport chokidar from \"chokidar\";\nimport { createWatcherIgnoreFilter } from \"./gitignore.js\";\n\nexport interface Broadcaster {\n broadcast(topic: string, data: unknown): void;\n}\n\n/**\n * Watches a workspace directory for file changes and broadcasts dirty signals.\n * Uses standard debounce (200ms) with a 1-second max wait to avoid starvation\n * during continuous file activity.\n */\nexport class WorkspaceWatcher {\n private chokidar: FSWatcher;\n private dirtyTimer: NodeJS.Timeout | null = null;\n private firstDirtyTime: number | null = null;\n private pendingReason: \"fs_change\" | \"git_metadata\" | null = null;\n private pendingWorktreeChanged = false;\n private readonly DEBOUNCE_MS = 200;\n private readonly MAX_WAIT_MS = 1_000;\n\n constructor(\n private workspaceId: string,\n rootPath: string,\n private broadcaster?: Broadcaster\n ) {\n const shouldIgnore = createWatcherIgnoreFilter(rootPath);\n\n this.chokidar = chokidar.watch(rootPath, {\n ignored: shouldIgnore,\n ignoreInitial: true,\n persistent: true,\n });\n\n this.chokidar.on(\"all\", (_eventName, changedPath) => this.markDirty(changedPath));\n }\n\n /**\n * Standard debounce with max wait to avoid starvation.\n * Each file change resets the timer by 200ms. If changes\n * continue for over 1s, forces a broadcast anyway.\n */\n private markDirty(changedPath?: string): void {\n const now = Date.now();\n if (this.firstDirtyTime === null) {\n this.firstDirtyTime = now;\n }\n\n if (changedPath && this.isWorktreeMetadataPath(changedPath)) {\n this.pendingWorktreeChanged = true;\n }\n\n if (changedPath && !this.isGitMetadataPath(changedPath)) {\n this.pendingReason = \"fs_change\";\n } else if (changedPath && this.pendingReason !== \"fs_change\") {\n this.pendingReason = \"git_metadata\";\n } else if (this.pendingReason === null) {\n this.pendingReason = \"fs_change\";\n }\n\n const elapsed = now - this.firstDirtyTime;\n const delay = Math.min(this.DEBOUNCE_MS, Math.max(0, this.MAX_WAIT_MS - elapsed));\n\n if (this.dirtyTimer) {\n clearTimeout(this.dirtyTimer);\n }\n\n this.dirtyTimer = setTimeout(() => this.flushDirty(), delay);\n }\n\n private flushDirty(): void {\n this.broadcaster?.broadcast(Topics.workspaceFsDirty(this.workspaceId), {\n reason: this.pendingReason ?? \"fs_change\",\n });\n if (this.pendingWorktreeChanged) {\n this.broadcaster?.broadcast(Topics.workspaceGitState(this.workspaceId), {\n worktreeChanged: true,\n });\n }\n this.dirtyTimer = null;\n this.firstDirtyTime = null;\n this.pendingReason = null;\n this.pendingWorktreeChanged = false;\n }\n\n private isGitMetadataPath(changedPath: string): boolean {\n return changedPath.replace(/\\\\/g, \"/\").includes(\"/.git/\");\n }\n\n private isWorktreeMetadataPath(changedPath: string): boolean {\n const normalized = changedPath.replace(/\\\\/g, \"/\");\n return normalized.includes(\"/.git/worktrees\");\n }\n\n /**\n * Stops watching and cleans up resources.\n */\n async close(): Promise<void> {\n if (this.dirtyTimer) {\n clearTimeout(this.dirtyTimer);\n this.dirtyTimer = null;\n }\n await this.chokidar.close();\n }\n}\n", "/**\n * WorkspaceManager - Manages workspace lifecycle (open/close/list).\n */\n\nimport type { DomainEvent, Workspace } from \"@coder-studio/core\";\nimport type { Database } from \"../storage/database.js\";\nimport { WorkspaceValidator } from \"./validator.js\";\n\nexport interface OpenWorkspaceRequest {\n path: string;\n wslDistro?: string;\n}\n\nexport interface EventBus {\n emit(event: DomainEvent): void;\n on(type: DomainEvent[\"type\"], handler: (event: DomainEvent) => void): () => void;\n}\n\nexport interface AutoFetchRuntime {\n triggerOpenTimeFetch(workspaceId: string): void;\n recordSuccess(workspaceId: string): void;\n getLastFetchAt(workspaceId: string): number | undefined;\n}\n\nexport interface WorkspaceManagerDeps {\n db: Database;\n eventBus: EventBus;\n broadcaster?: Broadcaster;\n autoFetch?: AutoFetchRuntime;\n teardown?: (workspaceId: string) => void | Promise<void>;\n onClose?: (workspaceId: string) => void | Promise<void>;\n}\n\n/**\n * Generates a unique workspace ID.\n */\nfunction generateWorkspaceId(): string {\n return `ws_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;\n}\n\n/**\n * WorkspaceManager handles workspace lifecycle operations.\n * It validates paths, checks runtime requirements, persists to DB,\n * and broadcasts metadata changes via EventBus.\n */\nexport class WorkspaceManager {\n private validator = new WorkspaceValidator();\n private watchers = new Map<string, WorkspaceWatcher>();\n\n constructor(private deps: WorkspaceManagerDeps) {}\n\n private startWatcher(workspaceId: string, rootPath: string): void {\n if (!this.deps.broadcaster || this.watchers.has(workspaceId)) {\n return;\n }\n\n this.watchers.set(\n workspaceId,\n new WorkspaceWatcher(workspaceId, rootPath, this.deps.broadcaster)\n );\n }\n\n hydrateWatchers(): void {\n for (const workspace of this.list()) {\n this.startWatcher(workspace.id, workspace.path);\n }\n }\n\n updateUiState(workspaceId: string, uiState: Workspace[\"uiState\"]): void {\n const workspace = this.get(workspaceId);\n if (!workspace) {\n throw new Error(`Workspace not found: ${workspaceId}`);\n }\n\n this.deps.db\n .prepare(\"UPDATE workspaces SET ui_state = ? WHERE id = ?\")\n .run(JSON.stringify(uiState), workspaceId);\n\n this.deps.eventBus.emit({\n type: \"workspace.meta.changed\",\n workspaceId,\n patch: { uiState },\n });\n }\n\n /**\n * Opens a new workspace.\n *\n * 1. Validates path exists and is accessible\n * 2. Checks if workspace already exists for this path\n * 3. Persists workspace to database (or returns existing)\n * 4. Emits metadata change event\n *\n * @param req - Open workspace request\n * @returns Created or existing workspace\n */\n async open(req: OpenWorkspaceRequest): Promise<Workspace> {\n // 1. Validate path\n await this.validator.validate(req.path);\n\n // 2. Check if workspace already exists for this path\n const existing = this.getByPath(req.path);\n if (existing) {\n // Update last active timestamp and return existing\n this.touch(existing.id);\n\n // Start watcher if not already watching (e.g., after server restart)\n this.startWatcher(existing.id, existing.path);\n\n this.deps.eventBus.emit({\n type: \"workspace.meta.changed\",\n workspaceId: existing.id,\n patch: { lastActiveAt: Date.now() },\n });\n this.deps.autoFetch?.triggerOpenTimeFetch(existing.id);\n return existing;\n }\n\n // 3. Persist to DB\n const workspace: Workspace = {\n id: generateWorkspaceId(),\n path: req.path,\n targetRuntime: \"native\",\n wslDistro: req.wslDistro,\n openedAt: Date.now(),\n lastActiveAt: Date.now(),\n uiState: {\n leftPanelWidth: 250,\n bottomPanelHeight: 200,\n focusMode: false,\n paneLayout: {\n id: \"root\",\n type: \"leaf\",\n },\n },\n };\n\n this.deps.db\n .prepare(\n `INSERT INTO workspaces (id, path, target_runtime, wsl_distro, opened_at, last_active_at, ui_state)\n VALUES (?, ?, ?, ?, ?, ?, ?)`\n )\n .run(\n workspace.id,\n workspace.path,\n \"native\",\n workspace.wslDistro ?? null,\n workspace.openedAt,\n workspace.lastActiveAt,\n JSON.stringify(workspace.uiState)\n );\n\n // 3. Emit event\n this.deps.eventBus.emit({\n type: \"workspace.meta.changed\",\n workspaceId: workspace.id,\n patch: workspace,\n });\n\n // Start file system watcher\n this.startWatcher(workspace.id, workspace.path);\n this.deps.autoFetch?.triggerOpenTimeFetch(workspace.id);\n\n return workspace;\n }\n\n /**\n * Closes a workspace.\n *\n * @param workspaceId - Workspace ID to close\n */\n async close(workspaceId: string): Promise<void> {\n const workspace = this.get(workspaceId);\n if (!workspace) {\n throw new Error(`Workspace not found: ${workspaceId}`);\n }\n\n // Stop file system watcher\n const watcher = this.watchers.get(workspaceId);\n if (watcher) {\n await watcher.close();\n this.watchers.delete(workspaceId);\n }\n\n if (this.deps.teardown) {\n await this.deps.teardown(workspaceId);\n }\n\n // Delete from DB (cascade deletes terminals and sessions)\n this.deps.db.prepare(\"DELETE FROM workspaces WHERE id = ?\").run(workspaceId);\n\n if (this.deps.onClose) {\n try {\n await this.deps.onClose(workspaceId);\n } catch (err) {\n console.warn(\"[workspace] onClose hook failed:\", err);\n }\n }\n\n // Emit event\n this.deps.eventBus.emit({\n type: \"workspace.meta.changed\",\n workspaceId: workspaceId,\n patch: { lastActiveAt: Date.now() },\n });\n }\n\n /**\n * Lists all open workspaces.\n *\n * @returns Array of workspaces\n */\n list(): Workspace[] {\n const rows = this.deps.db\n .prepare(\n `SELECT id, path, target_runtime, wsl_distro, opened_at, last_active_at, ui_state\n FROM workspaces\n ORDER BY last_active_at DESC`\n )\n .all() as Array<{\n id: string;\n path: string;\n target_runtime: string;\n wsl_distro: string | null;\n opened_at: number;\n last_active_at: number;\n ui_state: string;\n }>;\n\n return rows.map((row) => ({\n id: row.id,\n path: row.path,\n targetRuntime: row.target_runtime as \"native\" | \"wsl\",\n wslDistro: row.wsl_distro ?? undefined,\n openedAt: row.opened_at,\n lastActiveAt: row.last_active_at,\n uiState: JSON.parse(row.ui_state),\n }));\n }\n\n /**\n * Gets a single workspace by ID.\n *\n * @param workspaceId - Workspace ID\n * @returns Workspace or undefined\n */\n get(workspaceId: string): Workspace | undefined {\n const row = this.deps.db\n .prepare(\n `SELECT id, path, target_runtime, wsl_distro, opened_at, last_active_at, ui_state\n FROM workspaces\n WHERE id = ?`\n )\n .get(workspaceId) as\n | {\n id: string;\n path: string;\n target_runtime: string;\n wsl_distro: string | null;\n opened_at: number;\n last_active_at: number;\n ui_state: string;\n }\n | undefined;\n\n if (!row) return undefined;\n\n return {\n id: row.id,\n path: row.path,\n targetRuntime: row.target_runtime as \"native\" | \"wsl\",\n wslDistro: row.wsl_distro ?? undefined,\n openedAt: row.opened_at,\n lastActiveAt: row.last_active_at,\n uiState: JSON.parse(row.ui_state),\n };\n }\n\n /**\n * Gets a workspace by path.\n *\n * @param path - Workspace path\n * @returns Workspace or undefined\n */\n getByPath(path: string): Workspace | undefined {\n const row = this.deps.db\n .prepare(\n `SELECT id, path, target_runtime, wsl_distro, opened_at, last_active_at, ui_state\n FROM workspaces\n WHERE path = ?`\n )\n .get(path) as\n | {\n id: string;\n path: string;\n target_runtime: string;\n wsl_distro: string | null;\n opened_at: number;\n last_active_at: number;\n ui_state: string;\n }\n | undefined;\n\n if (!row) return undefined;\n\n return {\n id: row.id,\n path: row.path,\n targetRuntime: row.target_runtime as \"native\" | \"wsl\",\n wslDistro: row.wsl_distro ?? undefined,\n openedAt: row.opened_at,\n lastActiveAt: row.last_active_at,\n uiState: JSON.parse(row.ui_state),\n };\n }\n\n /**\n * Updates workspace last active timestamp.\n *\n * @param workspaceId - Workspace ID\n */\n touch(workspaceId: string): void {\n const now = Date.now();\n this.deps.db\n .prepare(\"UPDATE workspaces SET last_active_at = ? WHERE id = ?\")\n .run(now, workspaceId);\n }\n\n recordFetch(workspaceId: string): void {\n this.deps.autoFetch?.recordSuccess(workspaceId);\n }\n}\n\nimport { WorkspaceWatcher } from \"../fs/watcher.js\";\n\nexport interface Broadcaster {\n broadcast(topic: string, data: unknown): void;\n}\n", "import type { FastifyRequest } from \"fastify\";\n\nexport interface ActivationLease {\n clientInstanceId: string;\n wsClientId: string;\n generation: number;\n issuedAt: number;\n graceUntil: number | null;\n ip: string;\n userAgent: string;\n}\n\nexport interface ActivationClaimResult {\n active: true;\n generation: number;\n recoveryMode: \"fresh\" | \"grace_recover\" | \"takeover\";\n displacedWsClientId: string | null;\n}\n\nexport interface ActivationManagerOptions {\n graceMs: number;\n}\n\nconst DEFAULT_OPTIONS: ActivationManagerOptions = {\n graceMs: 3_000,\n};\n\nexport class ActivationManager {\n private readonly options: ActivationManagerOptions;\n private lease: ActivationLease | null = null;\n private generation = 0;\n\n constructor(options?: Partial<ActivationManagerOptions>) {\n this.options = { ...DEFAULT_OPTIONS, ...options };\n }\n\n claim(\n clientInstanceId: string,\n wsClientId: string,\n request: FastifyRequest\n ): ActivationClaimResult {\n const now = Date.now();\n const activeLease = this.getLease();\n\n if (activeLease && activeLease.clientInstanceId === clientInstanceId) {\n const isGraceRecovery = activeLease.graceUntil !== null && now <= activeLease.graceUntil;\n const displacedWsClientId =\n isGraceRecovery || activeLease.wsClientId === wsClientId ? null : activeLease.wsClientId;\n\n activeLease.wsClientId = wsClientId;\n activeLease.graceUntil = null;\n\n return {\n active: true,\n generation: activeLease.generation,\n recoveryMode: \"grace_recover\",\n displacedWsClientId,\n };\n }\n\n const displacedWsClientId =\n activeLease && activeLease.clientInstanceId !== clientInstanceId\n ? activeLease.wsClientId\n : null;\n const recoveryMode = displacedWsClientId === null ? \"fresh\" : \"takeover\";\n\n this.generation += 1;\n this.lease = {\n clientInstanceId,\n wsClientId,\n generation: this.generation,\n issuedAt: now,\n graceUntil: null,\n ip: request.ip,\n userAgent: request.headers[\"user-agent\"] ?? \"\",\n };\n\n return {\n active: true,\n generation: this.lease.generation,\n recoveryMode,\n displacedWsClientId,\n };\n }\n\n release(clientInstanceId: string, generation: number): void {\n const lease = this.getLease();\n if (!lease) {\n return;\n }\n\n if (lease.clientInstanceId !== clientInstanceId || lease.generation !== generation) {\n return;\n }\n\n this.lease = null;\n }\n\n onSocketClosed(wsClientId: string): void {\n const lease = this.getLease();\n if (!lease || lease.wsClientId !== wsClientId) {\n return;\n }\n\n lease.graceUntil = Date.now() + this.options.graceMs;\n }\n\n getLease(): ActivationLease | null {\n if (!this.lease) {\n return null;\n }\n\n return this.lease;\n }\n}\n", "/**\n * Command Dispatch\n *\n * Routes commands to handlers and validates input\n */\n\nimport type { Command, ProviderDefinition, Result } from \"@coder-studio/core\";\nimport { z } from \"zod\";\nimport type { EventBus } from \"../bus/event-bus.js\";\nimport type { AutoFetchRuntime } from \"../git/auto-fetch.js\";\nimport type { ProviderInstallManager } from \"../provider-runtime/install-manager.js\";\nimport type { RuntimeStatusDeps } from \"../provider-runtime/runtime-status.js\";\nimport type { SessionManager } from \"../session/manager.js\";\nimport type { Database } from \"../storage/database.js\";\nimport type { SupervisorManager } from \"../supervisor/manager.js\";\nimport type { TerminalManager } from \"../terminal/manager.js\";\nimport type { WorkspaceManager } from \"../workspace/manager.js\";\nimport type { ActivationManager } from \"./activation.js\";\nimport type { FencingManager } from \"./fencing.js\";\nimport type { Broadcaster } from \"./hub.js\";\n\n/**\n * Command context - injected dependencies for handlers\n */\nexport interface CommandContext {\n workspaceMgr: WorkspaceManager;\n sessionMgr: SessionManager;\n terminalMgr: TerminalManager;\n eventBus: EventBus;\n broadcaster: Broadcaster;\n db: Database;\n providerRegistry: ProviderDefinition[];\n fencingMgr: FencingManager;\n supervisorMgr: SupervisorManager;\n autoFetch: AutoFetchRuntime;\n providerRuntimeDeps?: RuntimeStatusDeps;\n providerInstallMgr?: ProviderInstallManager;\n activationMgr: ActivationManager;\n}\n\n/**\n * Command handler type\n */\nexport type CommandHandler<A = unknown, R = unknown> = (\n args: A,\n ctx: CommandContext,\n clientId?: string\n) => Promise<R>;\n\ntype CommandSchema = z.ZodTypeAny;\n\n/**\n * Registry of all command handlers\n */\nconst handlers = new Map<string, CommandHandler>();\n\n/**\n * Registry of all command schemas\n */\nconst schemas = new Map<string, CommandSchema>();\nconst ACTIVATION_ALLOWLIST = new Set([\n \"activation.claim\",\n \"activation.release\",\n \"connection.probe\",\n]);\n\n/**\n * Register a command handler\n */\nexport function registerCommand<S extends CommandSchema, R>(\n op: string,\n schema: S,\n handler: CommandHandler<z.output<S>, R>\n): void {\n handlers.set(op, handler as CommandHandler);\n schemas.set(op, schema);\n}\n\n/**\n * Dispatch a command to its handler\n */\nexport async function dispatch(\n msg: Command,\n ctx: CommandContext,\n clientId?: string\n): Promise<Result> {\n const isWsDispatch =\n clientId !== undefined && typeof ctx.broadcaster.getRequestMetadata === \"function\";\n\n if (isWsDispatch && !ACTIVATION_ALLOWLIST.has(msg.op)) {\n const active = ctx.activationMgr.getLease();\n if (!active || active.wsClientId !== clientId) {\n return {\n kind: \"result\",\n id: msg.id,\n ok: false,\n error: {\n code: \"activation_required\",\n message: \"This tab is no longer the active session\",\n },\n };\n }\n }\n\n const handler = handlers.get(msg.op);\n\n if (!handler) {\n return {\n kind: \"result\",\n id: msg.id,\n ok: false,\n error: {\n code: \"unknown_op\",\n message: `Unknown operation: ${msg.op}`,\n },\n };\n }\n\n try {\n const schema = schemas.get(msg.op);\n let args = msg.args;\n\n if (schema) {\n args = schema.parse(msg.args);\n }\n\n const data = await handler(args, ctx, clientId);\n\n return {\n kind: \"result\",\n id: msg.id,\n ok: true,\n data,\n };\n } catch (error: unknown) {\n const normalizedError = normalizeError(error);\n\n return {\n kind: \"result\",\n id: msg.id,\n ok: false,\n error: normalizedError,\n };\n }\n}\n\n/**\n * Normalize error to protocol format\n */\nfunction normalizeError(error: unknown): Result[\"error\"] {\n const candidate = error as {\n name?: string;\n code?: string;\n message?: string;\n details?: unknown;\n errors?: unknown;\n };\n\n if (candidate.name === \"ZodError\") {\n return {\n code: \"validation_error\",\n message: \"Invalid arguments\",\n details: candidate.errors,\n };\n }\n\n if (candidate.code) {\n return {\n code: candidate.code,\n message: candidate.message ?? String(candidate.code),\n details: candidate.details,\n };\n }\n\n return {\n code: \"internal_error\",\n message: candidate.message || \"An internal error occurred\",\n };\n}\n\n/**\n * Get all registered commands\n */\nexport function getRegisteredCommands(): string[] {\n return Array.from(handlers.keys());\n}\n", "/**\n * Fencing Token Management (Phase 3)\n *\n * Implements Controller/Observer model for multi-tab concurrency.\n * Only one tab can be the Controller with write access.\n */\n\nimport type { FastifyRequest } from \"fastify\";\n\nexport interface FencingToken {\n /** Unique client ID */\n clientId: string;\n /** Tab/session identifier */\n tabId: string;\n /** When the token was issued */\n issuedAt: number;\n /** Token expiration time */\n expiresAt: number;\n /** Client IP address */\n ip: string;\n /** User agent string */\n userAgent: string;\n}\n\nexport interface FencingManagerOptions {\n /** Heartbeat interval for visible tabs (ms) */\n visibleHeartbeatMs: number;\n /** Heartbeat interval for hidden tabs (ms) */\n hiddenHeartbeatMs: number;\n /** Token expiration time (ms) */\n tokenExpirationMs: number;\n /** Grace period for tab refresh (ms) */\n refreshGraceMs: number;\n}\n\nconst DEFAULT_OPTIONS: FencingManagerOptions = {\n visibleHeartbeatMs: 10000, // 10 seconds\n hiddenHeartbeatMs: 20000, // 20 seconds\n tokenExpirationMs: 30000, // 30 seconds\n refreshGraceMs: 3000, // 3 seconds\n};\n\n/**\n * Manages fencing tokens for workspace write access.\n */\nexport class FencingManager {\n private options: FencingManagerOptions;\n // workspaceId -> FencingToken\n private tokens = new Map<string, FencingToken>();\n // clientId -> last heartbeat timestamp\n private heartbeats = new Map<string, number>();\n // workspaceId -> { clientId, closedAt, ip, ua } (for grace period)\n private lastWriter = new Map<\n string,\n {\n clientId: string;\n closedAt: number;\n ip: string;\n userAgent: string;\n }\n >();\n\n constructor(options?: Partial<FencingManagerOptions>) {\n this.options = { ...DEFAULT_OPTIONS, ...options };\n }\n\n /**\n * Request controller status for a workspace.\n * Returns whether this client is now the controller.\n */\n requestControl(\n workspaceId: string,\n clientId: string,\n tabId: string,\n request: FastifyRequest\n ): { isController: boolean; reason?: string } {\n const now = Date.now();\n const ip = request.ip;\n const userAgent = request.headers[\"user-agent\"] ?? \"\";\n\n // Check if there's an existing controller\n const existing = this.tokens.get(workspaceId);\n\n if (existing) {\n // Check if existing token is expired\n if (now > existing.expiresAt) {\n // Token expired, take over\n this.tokens.delete(workspaceId);\n } else if (existing.clientId === clientId) {\n // Same client, refresh token\n return this.issueToken(workspaceId, clientId, tabId, ip, userAgent);\n } else {\n // Another client is controller\n return {\n isController: false,\n reason: \"another_tab_active\",\n };\n }\n }\n\n // Check grace period for tab refresh\n const lastWriter = this.lastWriter.get(workspaceId);\n if (lastWriter && now - lastWriter.closedAt < this.options.refreshGraceMs) {\n if (lastWriter.ip === ip && lastWriter.userAgent === userAgent) {\n // Same origin refresh, grant control\n return this.issueToken(workspaceId, clientId, tabId, ip, userAgent);\n }\n }\n\n // No existing controller, become one\n return this.issueToken(workspaceId, clientId, tabId, ip, userAgent);\n }\n\n /**\n * Record a heartbeat from a controller.\n */\n heartbeat(workspaceId: string, clientId: string): boolean {\n const token = this.tokens.get(workspaceId);\n if (!token || token.clientId !== clientId) {\n return false;\n }\n\n // Update heartbeat timestamp\n this.heartbeats.set(clientId, Date.now());\n\n // Extend token expiration\n token.expiresAt = Date.now() + this.options.tokenExpirationMs;\n\n return true;\n }\n\n /**\n * Release controller status.\n */\n release(workspaceId: string, clientId: string): void {\n const token = this.tokens.get(workspaceId);\n if (token && token.clientId === clientId) {\n // Store last writer info for grace period\n this.lastWriter.set(workspaceId, {\n clientId: token.clientId,\n closedAt: Date.now(),\n ip: token.ip,\n userAgent: token.userAgent,\n });\n\n this.tokens.delete(workspaceId);\n this.heartbeats.delete(clientId);\n }\n }\n\n /**\n * Check if a client is the current controller.\n */\n isController(workspaceId: string, clientId: string): boolean {\n const token = this.tokens.get(workspaceId);\n return token?.clientId === clientId;\n }\n\n /**\n * Get the current controller info for a workspace.\n */\n getController(workspaceId: string): FencingToken | undefined {\n const token = this.tokens.get(workspaceId);\n if (token && Date.now() <= token.expiresAt) {\n return token;\n }\n return undefined;\n }\n\n /**\n * Check if controller is unresponsive (no heartbeat).\n */\n isControllerUnresponsive(workspaceId: string): boolean {\n const token = this.tokens.get(workspaceId);\n if (!token) {\n return true;\n }\n\n const lastHeartbeat = this.heartbeats.get(token.clientId);\n if (!lastHeartbeat) {\n return true;\n }\n\n // Consider unresponsive if no heartbeat for 2x the visible heartbeat interval\n const unresponsiveThreshold = this.options.visibleHeartbeatMs * 2;\n return Date.now() - lastHeartbeat > unresponsiveThreshold;\n }\n\n /**\n * Force takeover of controller status.\n * Used when controller is unresponsive.\n */\n forceTakeover(\n workspaceId: string,\n clientId: string,\n tabId: string,\n request: FastifyRequest\n ): { success: boolean; reason?: string } {\n if (!this.isControllerUnresponsive(workspaceId)) {\n return {\n success: false,\n reason: \"controller_responsive\",\n };\n }\n\n // Clear existing token\n this.tokens.delete(workspaceId);\n\n // Issue new token\n const ip = request.ip;\n const userAgent = request.headers[\"user-agent\"] ?? \"\";\n const result = this.issueToken(workspaceId, clientId, tabId, ip, userAgent);\n\n return { success: result.isController };\n }\n\n /**\n * Issue a new fencing token.\n */\n private issueToken(\n workspaceId: string,\n clientId: string,\n tabId: string,\n ip: string,\n userAgent: string\n ): { isController: boolean } {\n const now = Date.now();\n\n const token: FencingToken = {\n clientId,\n tabId,\n issuedAt: now,\n expiresAt: now + this.options.tokenExpirationMs,\n ip,\n userAgent,\n };\n\n this.tokens.set(workspaceId, token);\n this.heartbeats.set(clientId, now);\n\n // Clear last writer info\n this.lastWriter.delete(workspaceId);\n\n return { isController: true };\n }\n\n /**\n * Clean up expired tokens.\n */\n cleanup(): void {\n const now = Date.now();\n\n for (const [workspaceId, token] of this.tokens) {\n if (now > token.expiresAt) {\n this.tokens.delete(workspaceId);\n this.heartbeats.delete(token.clientId);\n }\n }\n\n // Clean up old last writer records (older than grace period * 2)\n const graceCutoff = now - this.options.refreshGraceMs * 2;\n for (const [workspaceId, lastWriter] of this.lastWriter) {\n if (lastWriter.closedAt < graceCutoff) {\n this.lastWriter.delete(workspaceId);\n }\n }\n }\n}\n", "/**\n * Terminal Commands\n */\n\nimport { basename } from \"node:path\";\nimport {\n encodeTerminalBinaryFrame,\n TERMINAL_BINARY_PROTOCOL_VERSION,\n TERMINAL_INPUT_ACTIVITIES,\n TerminalBinaryFrameType,\n type TerminalInputActivity,\n TerminalInputBase64Args,\n TerminalInputBinaryArgs,\n TerminalSnapshotBinaryResult,\n} from \"@coder-studio/core\";\nimport { z } from \"zod\";\nimport { registerCommand } from \"../ws/dispatch.js\";\n\nconst TerminalInputActivitySchema = z.enum(TERMINAL_INPUT_ACTIVITIES).optional();\n\nconst TerminalInputSchema = z.union([\n z.object({\n terminalId: z.string(),\n bytes: z.string(),\n activity: TerminalInputActivitySchema,\n submittedText: z.string().optional(),\n }),\n z.object({\n terminalId: z.string(),\n transport: z.literal(\"binary\"),\n streamId: z.number().int().nonnegative(),\n size: z.number().int().nonnegative(),\n activity: TerminalInputActivitySchema,\n submittedText: z.string().optional(),\n }),\n]);\n\nconst pendingTerminalInput = new Map<number, { args: TerminalInputBinaryArgs; payload: Buffer }>();\nlet nextOutboundBinaryStreamId = 0;\n\nfunction decodeTerminalInput(args: TerminalInputBase64Args | TerminalInputBinaryArgs): Buffer {\n if (\"bytes\" in args) {\n return Buffer.from(args.bytes, \"base64\");\n }\n\n const pending = pendingTerminalInput.get(args.streamId);\n if (!pending) {\n throw {\n code: \"terminal_input_binary_missing\",\n message: \"Missing binary terminal input payload\",\n };\n }\n pendingTerminalInput.delete(args.streamId);\n return pending.payload;\n}\n\nfunction normalizeTerminalInputActivity(\n activity: TerminalInputActivity | undefined\n): TerminalInputActivity | undefined {\n return activity;\n}\n\nexport function registerPendingTerminalInput(args: TerminalInputBinaryArgs, payload: Buffer): void {\n pendingTerminalInput.set(args.streamId, { args, payload });\n}\n\nexport function clearPendingTerminalInput(streamId: number): void {\n pendingTerminalInput.delete(streamId);\n}\n\nfunction allocateOutboundBinaryStreamId(): number {\n nextOutboundBinaryStreamId = (nextOutboundBinaryStreamId + 1) >>> 0;\n return nextOutboundBinaryStreamId;\n}\n\nfunction sendTerminalBinaryFrame(\n clientId: string | undefined,\n ctx: Parameters<typeof registerCommand>[2] extends (\n args: unknown,\n ctx: infer T,\n clientId?: string\n ) => Promise<unknown>\n ? T\n : never,\n frame: {\n type: (typeof TerminalBinaryFrameType)[keyof typeof TerminalBinaryFrameType];\n meta: number;\n streamId: number;\n payload: Buffer;\n }\n): void {\n if (!clientId) {\n return;\n }\n\n ctx.broadcaster.sendBinaryToClient(\n clientId,\n Buffer.from(\n encodeTerminalBinaryFrame(\n {\n version: TERMINAL_BINARY_PROTOCOL_VERSION,\n type: frame.type,\n flags: 0,\n meta: frame.meta,\n streamId: frame.streamId,\n payloadSize: frame.payload.length,\n },\n frame.payload\n )\n )\n );\n}\n\nfunction resolveShellCommand(): { argv: string[]; title: string } {\n if (process.platform === \"win32\") {\n const shellPath = process.env.ComSpec || process.env.COMSPEC || \"cmd.exe\";\n return {\n argv: [shellPath],\n title: basename(shellPath) || shellPath,\n };\n }\n\n const shellPath = process.env.SHELL || \"/bin/bash\";\n const shellName = basename(shellPath);\n const argv = shellName === \"cmd.exe\" ? [shellPath] : [shellPath, \"-i\"];\n\n return {\n argv,\n title: shellName || shellPath,\n };\n}\n\n// terminal.list\nregisterCommand(\n \"terminal.list\",\n z.object({\n workspaceId: z.string(),\n }),\n async (args, ctx) => {\n return ctx.terminalMgr\n .getAll()\n .map((terminal) => terminal.toDTO())\n .filter((terminal) => terminal.workspaceId === args.workspaceId);\n }\n);\n\n// terminal.create\nregisterCommand(\n \"terminal.create\",\n z.object({\n workspaceId: z.string(),\n cols: z.number().int().positive().optional(),\n rows: z.number().int().positive().optional(),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n const shell = resolveShellCommand();\n\n // Create shell terminal\n const terminal = ctx.terminalMgr.create({\n workspaceId: args.workspaceId,\n kind: \"shell\",\n argv: shell.argv,\n title: shell.title,\n cwd: workspace.path,\n cols: args.cols ?? 120,\n rows: args.rows ?? 30,\n });\n\n return terminal;\n }\n);\n\n// terminal.replay\nregisterCommand(\n \"terminal.replay\",\n z.object({\n terminalId: z.string(),\n lastSeq: z.number().int().nonnegative().optional(),\n }),\n async (args, ctx, clientId) => {\n const replay = ctx.terminalMgr.replay(args.terminalId, args.lastSeq ?? 0);\n\n if (replay.status !== \"ok\") {\n return replay;\n }\n\n const streamId = allocateOutboundBinaryStreamId();\n sendTerminalBinaryFrame(clientId, ctx, {\n type: TerminalBinaryFrameType.Replay,\n meta: replay.seq,\n streamId,\n payload: replay.data,\n });\n\n return {\n status: \"ok\" as const,\n transport: \"binary\" as const,\n streamId,\n size: replay.data.length,\n seq: replay.seq,\n };\n }\n);\n\n// terminal.snapshot\nregisterCommand(\n \"terminal.snapshot\",\n z.object({\n terminalId: z.string(),\n }),\n async (args, ctx, clientId) => {\n const snapshot = await ctx.terminalMgr.snapshot(args.terminalId);\n\n if (snapshot.status !== \"ok\") {\n return snapshot;\n }\n\n const streamId = allocateOutboundBinaryStreamId();\n sendTerminalBinaryFrame(clientId, ctx, {\n type: TerminalBinaryFrameType.Snapshot,\n meta: snapshot.seq,\n streamId,\n payload: snapshot.data,\n });\n\n return {\n status: \"ok\" as const,\n transport: \"binary\" as const,\n streamId,\n size: snapshot.data.length,\n seq: snapshot.seq,\n rows: snapshot.rows,\n cols: snapshot.cols,\n source: \"headless\" as const,\n } satisfies TerminalSnapshotBinaryResult;\n }\n);\n\n// terminal.close\nregisterCommand(\n \"terminal.close\",\n z.object({\n terminalId: z.string(),\n }),\n async (args, ctx) => {\n await ctx.terminalMgr.close(args.terminalId);\n }\n);\n\n// terminal.input\nregisterCommand(\"terminal.input\", TerminalInputSchema, async (args, ctx) => {\n const buffer = decodeTerminalInput(args);\n const sessionId = ctx.sessionMgr.findSessionIdByTerminal(args.terminalId);\n if (sessionId) {\n ctx.sessionMgr.sendInput(\n sessionId,\n buffer,\n normalizeTerminalInputActivity(args.activity),\n args.submittedText\n );\n return;\n }\n\n ctx.terminalMgr.write(args.terminalId, buffer);\n});\n\n// terminal.resize\nregisterCommand(\n \"terminal.resize\",\n z.object({\n terminalId: z.string(),\n cols: z.number().int().positive(),\n rows: z.number().int().positive(),\n }),\n async (args, ctx) => {\n const sessionId = ctx.sessionMgr.findSessionIdByTerminal(args.terminalId);\n if (sessionId) {\n ctx.sessionMgr.resize(sessionId, args.cols, args.rows);\n return;\n }\n\n ctx.terminalMgr.resize(args.terminalId, args.cols, args.rows);\n }\n);\n", "export interface Frame {\n data: string | Buffer;\n size: number;\n}\n\nexport interface StreamBufferDropOldestEvent {\n topic: string;\n frameSize: number;\n bucketBytes: number;\n bucketLength: number;\n}\n\nexport interface StreamBufferEvictTopicEvent {\n topic: string;\n frames: number;\n bytes: number;\n}\n\nexport interface StreamBufferOptions {\n topicCap: number;\n topicLruCap: number;\n onDropOldest?: (event: StreamBufferDropOldestEvent) => void;\n onEvictTopic?: (event: StreamBufferEvictTopicEvent) => void;\n}\n\nexport const STREAM_BUFFER_DEFAULTS: StreamBufferOptions = {\n topicCap: 512 * 1024,\n topicLruCap: 8,\n};\n\nexport class StreamBuffer {\n private readonly buckets = new Map<string, Frame[]>();\n private readonly bucketBytes = new Map<string, number>();\n private cursor = 0;\n private destroyed = false;\n\n constructor(private readonly options: StreamBufferOptions = STREAM_BUFFER_DEFAULTS) {}\n\n enqueue(topic: string, frame: Frame): void {\n if (this.destroyed) return;\n\n let bucket = this.buckets.get(topic);\n if (!bucket) {\n while (this.buckets.size >= this.options.topicLruCap) {\n const oldest = this.buckets.keys().next().value;\n if (oldest === undefined) break;\n const oldestBucket = this.buckets.get(oldest);\n const oldestBytes = this.bucketBytes.get(oldest) ?? 0;\n this.options.onEvictTopic?.({\n topic: oldest,\n frames: oldestBucket?.length ?? 0,\n bytes: oldestBytes,\n });\n this.buckets.delete(oldest);\n this.bucketBytes.delete(oldest);\n }\n bucket = [];\n this.buckets.set(topic, bucket);\n this.bucketBytes.set(topic, 0);\n } else {\n const bytes = this.bucketBytes.get(topic) ?? 0;\n this.buckets.delete(topic);\n this.buckets.set(topic, bucket);\n this.bucketBytes.delete(topic);\n this.bucketBytes.set(topic, bytes);\n }\n\n bucket.push(frame);\n let bytes = (this.bucketBytes.get(topic) ?? 0) + frame.size;\n\n while (bytes > this.options.topicCap && bucket.length > 1) {\n const dropped = bucket.shift()!;\n bytes -= dropped.size;\n this.options.onDropOldest?.({\n topic,\n frameSize: dropped.size,\n bucketBytes: bytes,\n bucketLength: bucket.length,\n });\n }\n\n this.bucketBytes.set(topic, bytes);\n }\n\n drain(maxBytes: number, send: (data: string | Buffer) => boolean): void {\n if (this.destroyed) return;\n let sent = 0;\n let sentAny = false;\n const startCursor = this.cursor;\n\n while (sent < maxBytes && this.buckets.size > 0) {\n const topics = [...this.buckets.keys()];\n let drainedThisRound = 0;\n\n for (let i = 0; i < topics.length && sent < maxBytes; i++) {\n const idx = (startCursor + i) % topics.length;\n const topic = topics[idx]!;\n const bucket = this.buckets.get(topic);\n if (!bucket || bucket.length === 0) continue;\n\n const next = bucket[0]!;\n if (!send(next.data)) {\n if (sentAny) this.cursor = startCursor + 1;\n return;\n }\n\n bucket.shift();\n sent += next.size;\n sentAny = true;\n drainedThisRound++;\n\n const remaining = (this.bucketBytes.get(topic) ?? 0) - next.size;\n if (bucket.length === 0) {\n this.buckets.delete(topic);\n this.bucketBytes.delete(topic);\n } else {\n this.bucketBytes.set(topic, remaining);\n }\n }\n\n if (drainedThisRound === 0) break;\n }\n\n if (sentAny) this.cursor = startCursor + 1;\n }\n\n isEmpty(): boolean {\n return this.buckets.size === 0;\n }\n\n destroy(): void {\n this.destroyed = true;\n this.buckets.clear();\n this.bucketBytes.clear();\n }\n}\n", "/**\n * WebSocket Client\n *\n * Manages a single WebSocket connection:\n * - Send commands, events, results\n * - Subscription management\n * - Backpressure handling\n */\n\nimport type { ClientToServer, Event, ServerToClient } from \"@coder-studio/core\";\nimport WebSocket from \"ws\";\nimport {\n type Frame,\n STREAM_BUFFER_DEFAULTS,\n StreamBuffer,\n type StreamBufferDropOldestEvent,\n type StreamBufferEvictTopicEvent,\n} from \"./stream-buffer.js\";\n\nconst HIGH_WATER = 1024 * 1024;\nconst LOW_WATER = 256 * 1024;\nconst FLUSH_INTERVAL_MS = 30;\nconst STREAM_BUFFER_WARN_INTERVAL_MS = 5000;\n\nexport type ClientId = string;\nexport type MessageHandler = (msg: ClientToServer | Buffer) => void;\nexport type CloseHandler = () => void;\nexport interface WsClientLogger {\n warn(context: Record<string, unknown>, message: string): void;\n}\n\nconst NOOP_LOGGER: WsClientLogger = {\n warn: () => {},\n};\n\nexport class WsClient {\n readonly id: ClientId;\n private subscriptions = new Set<string>();\n private readonly streamBuffer: StreamBuffer;\n private flushTimer: NodeJS.Timeout | null = null;\n private messageHandler: MessageHandler | null = null;\n private closeHandler: CloseHandler | null = null;\n private isAlive = true;\n private droppedFramesSinceLastWarn = 0;\n private droppedBytesSinceLastWarn = 0;\n private evictedTopicsSinceLastWarn = 0;\n private evictedFramesSinceLastWarn = 0;\n private evictedBytesSinceLastWarn = 0;\n private lastStreamBufferWarnAt = 0;\n private readonly logger: WsClientLogger;\n\n constructor(\n private readonly socket: WebSocket,\n id: ClientId,\n logger?: WsClientLogger\n ) {\n this.id = id;\n this.logger = logger ?? NOOP_LOGGER;\n this.streamBuffer = new StreamBuffer({\n ...STREAM_BUFFER_DEFAULTS,\n onDropOldest: (event) => this.handleStreamBufferDrop(event),\n onEvictTopic: (event) => this.handleStreamBufferEviction(event),\n });\n this.setupSocketHandlers();\n }\n\n private markAlive(): void {\n this.isAlive = true;\n }\n\n private setupSocketHandlers(): void {\n this.socket.on(\"message\", (data: Buffer, isBinary: boolean) => {\n this.markAlive();\n\n if (isBinary) {\n this.messageHandler?.(data);\n return;\n }\n\n try {\n const msg = JSON.parse(data.toString()) as ClientToServer;\n this.messageHandler?.(msg);\n } catch (error) {\n console.error(`Failed to parse message from client ${this.id}:`, error);\n }\n });\n\n this.socket.on(\"close\", () => {\n this.isAlive = false;\n this.clearFlushTimer();\n this.streamBuffer.destroy();\n this.closeHandler?.();\n });\n\n this.socket.on(\"pong\", () => {\n this.markAlive();\n });\n }\n\n /**\n * Register message handler\n */\n onMessage(handler: MessageHandler): void {\n this.messageHandler = handler;\n }\n\n /**\n * Register close handler\n */\n onClose(handler: CloseHandler): void {\n this.closeHandler = handler;\n }\n\n /**\n * Control-class send: bypasses application-level backpressure.\n * Stream-class senders go through sendStream() instead.\n */\n sendControl(msg: ServerToClient): boolean {\n if (this.socket.readyState !== WebSocket.OPEN) {\n return false;\n }\n try {\n this.socket.send(JSON.stringify(msg));\n return true;\n } catch (error) {\n console.error(`Failed to send message to client ${this.id}:`, error);\n return false;\n }\n }\n\n sendControlAndClose(msg: ServerToClient, code: number, reason: string): boolean {\n if (this.socket.readyState !== WebSocket.OPEN) {\n return false;\n }\n\n try {\n this.socket.send(JSON.stringify(msg), () => {\n this.socket.close(code, reason);\n });\n return true;\n } catch (error) {\n console.error(`Failed to send message to client ${this.id}:`, error);\n return false;\n }\n }\n\n sendBinary(data: Buffer): boolean {\n if (this.socket.readyState !== WebSocket.OPEN) {\n return false;\n }\n try {\n this.socket.send(data, { binary: true });\n return true;\n } catch (error) {\n console.error(`Failed to send binary frame to client ${this.id}:`, error);\n return false;\n }\n }\n\n /**\n * Backwards-compatible alias for sendControl.\n * Kept so existing call sites (hub.send, dispatch results, sendToClient) compile unchanged.\n */\n send(msg: ServerToClient): boolean {\n return this.sendControl(msg);\n }\n\n /**\n * Stream-class send: queued per-topic, drop-oldest on overflow.\n * Caller-side ordering is preserved within a topic; across topics the\n * flusher uses fair rotation. Frontend recovers via seq-gap + replay.\n */\n sendStream(topic: string, msg: ServerToClient | Buffer): void {\n if (this.socket.readyState !== WebSocket.OPEN) return;\n\n const frame = this.createFrame(msg);\n\n const buffered = this.socket.bufferedAmount ?? 0;\n if (buffered < HIGH_WATER && this.streamBuffer.isEmpty()) {\n if (!this.sendFrame(frame.data)) {\n console.error(`Failed to send stream frame to client ${this.id}`);\n }\n return;\n }\n\n this.streamBuffer.enqueue(topic, frame);\n this.flushStream();\n }\n\n /**\n * Sugar for stream-class events (mirrors sendEvent for control class).\n */\n sendEventStream(topic: string, data: unknown, seq: number = 0): void {\n const event: Event = {\n kind: \"event\",\n topic,\n seq,\n timestamp: Date.now(),\n data,\n };\n this.sendStream(topic, event);\n }\n\n private createFrame(msg: ServerToClient | Buffer): Frame {\n if (Buffer.isBuffer(msg)) {\n return {\n data: msg,\n size: msg.byteLength,\n };\n }\n\n const data = JSON.stringify(msg);\n return {\n data,\n size: Buffer.byteLength(data, \"utf8\"),\n };\n }\n\n private sendFrame(data: string | Buffer): boolean {\n try {\n if (Buffer.isBuffer(data)) {\n this.socket.send(data, { binary: true });\n } else {\n this.socket.send(data);\n }\n return true;\n } catch {\n return false;\n }\n }\n\n private flushStream(): void {\n if (this.socket.readyState !== WebSocket.OPEN) {\n this.clearFlushTimer();\n this.streamBuffer.destroy();\n return;\n }\n\n const buffered = this.socket.bufferedAmount ?? 0;\n if (buffered < LOW_WATER) {\n const headroom = HIGH_WATER - buffered;\n this.streamBuffer.drain(headroom, (data) => {\n try {\n if (Buffer.isBuffer(data)) {\n this.socket.send(data, { binary: true });\n } else {\n this.socket.send(data);\n }\n return true;\n } catch (error) {\n console.error(`Stream send failed for client ${this.id}:`, error);\n return false;\n }\n });\n }\n\n if (this.streamBuffer.isEmpty()) {\n this.clearFlushTimer();\n } else {\n this.ensureFlushTimer();\n }\n }\n\n private ensureFlushTimer(): void {\n if (this.flushTimer) return;\n this.flushTimer = setInterval(() => this.flushStream(), FLUSH_INTERVAL_MS);\n }\n\n private clearFlushTimer(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n }\n\n private handleStreamBufferDrop(event: StreamBufferDropOldestEvent): void {\n this.droppedFramesSinceLastWarn += 1;\n this.droppedBytesSinceLastWarn += event.frameSize;\n this.warnStreamBufferPressure(\"topic-cap\", event.topic);\n }\n\n private handleStreamBufferEviction(event: StreamBufferEvictTopicEvent): void {\n this.evictedTopicsSinceLastWarn += 1;\n this.evictedFramesSinceLastWarn += event.frames;\n this.evictedBytesSinceLastWarn += event.bytes;\n this.warnStreamBufferPressure(\"topic-lru\", event.topic);\n }\n\n private warnStreamBufferPressure(reason: \"topic-cap\" | \"topic-lru\", topic: string): void {\n const now = Date.now();\n if (now - this.lastStreamBufferWarnAt < STREAM_BUFFER_WARN_INTERVAL_MS) {\n return;\n }\n\n this.logger.warn(\n {\n reason,\n clientId: this.id,\n topic,\n bufferedAmount: this.socket.bufferedAmount ?? 0,\n droppedFrames: this.droppedFramesSinceLastWarn,\n droppedBytes: this.droppedBytesSinceLastWarn,\n evictedTopics: this.evictedTopicsSinceLastWarn,\n evictedFrames: this.evictedFramesSinceLastWarn,\n evictedBytes: this.evictedBytesSinceLastWarn,\n },\n \"Stream buffer pressure\"\n );\n\n this.lastStreamBufferWarnAt = now;\n this.droppedFramesSinceLastWarn = 0;\n this.droppedBytesSinceLastWarn = 0;\n this.evictedTopicsSinceLastWarn = 0;\n this.evictedFramesSinceLastWarn = 0;\n this.evictedBytesSinceLastWarn = 0;\n }\n\n /**\n * Send an event message\n */\n sendEvent(topic: string, data: unknown, seq: number = 0): boolean {\n const event: Event = {\n kind: \"event\",\n topic,\n seq,\n timestamp: Date.now(),\n data,\n };\n return this.send(event);\n }\n\n sendEventAndClose(\n topic: string,\n data: unknown,\n code: number,\n reason: string,\n seq: number = 0\n ): boolean {\n const event: Event = {\n kind: \"event\",\n topic,\n seq,\n timestamp: Date.now(),\n data,\n };\n return this.sendControlAndClose(event, code, reason);\n }\n\n /**\n * Check if client subscribes to a topic (supports glob patterns)\n */\n subscribesTo(topic: string): boolean {\n for (const pattern of this.subscriptions) {\n if (this.matchTopic(pattern, topic)) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Add subscriptions\n */\n subscribe(topics: string[]): void {\n for (const topic of topics) {\n this.subscriptions.add(topic);\n }\n }\n\n /**\n * Remove subscriptions\n */\n unsubscribe(topics: string[]): void {\n for (const topic of topics) {\n this.subscriptions.delete(topic);\n }\n }\n\n /**\n * Check if connection is alive\n */\n get alive(): boolean {\n return this.isAlive && this.socket.readyState === WebSocket.OPEN;\n }\n\n /**\n * Ping the client\n */\n ping(): void {\n if (this.socket.readyState === WebSocket.OPEN) {\n this.isAlive = false;\n this.socket.ping();\n }\n }\n\n /**\n * Close the connection\n */\n close(code?: number, reason?: string): void {\n this.socket.close(code, reason);\n }\n\n /**\n * Simple glob pattern matching for topics\n * Supports * as wildcard (e.g., \"workspace.42.*\" matches \"workspace.42.session.1.state\")\n */\n private matchTopic(pattern: string, topic: string): boolean {\n if (pattern === topic) return true;\n if (pattern === \"*\") return true;\n\n // Split pattern and topic into parts\n const patternParts = pattern.split(\".\");\n const topicParts = topic.split(\".\");\n\n // Match each part\n for (let i = 0; i < patternParts.length; i++) {\n const pp = patternParts[i];\n\n // * matches any single part\n if (pp === \"*\") {\n // If this is the last part in pattern, match everything\n if (i === patternParts.length - 1) {\n return true;\n }\n continue;\n }\n\n // If pattern part doesn't match topic part\n if (i >= topicParts.length || pp !== topicParts[i]) {\n return false;\n }\n }\n\n // Pattern matched all parts\n return patternParts.length <= topicParts.length;\n }\n}\n", "const STREAM_TOPIC_RE = /^workspace\\.[^.]+\\.terminal\\.[^.]+\\.output$/;\n\nexport function isStreamTopic(topic: string): boolean {\n return STREAM_TOPIC_RE.test(topic);\n}\n", "/**\n * WebSocket Hub\n *\n * Manages all WebSocket connections:\n * - Single writer enforcement (Phase 1)\n * - Connection handling and routing\n * - Event bus subscription and broadcasting\n * - Topic-based routing\n */\n\nimport type {\n ClientToServer,\n Command,\n DomainEvent,\n ServerToClient,\n TerminalInputBinaryArgs,\n} from \"@coder-studio/core\";\nimport { encodeTerminalOutputFrame, Topics } from \"@coder-studio/core\";\nimport type { FastifyBaseLogger, FastifyRequest } from \"fastify\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport type WebSocket from \"ws\";\nimport { EventBus } from \"../bus/event-bus.js\";\nimport { clearPendingTerminalInput, registerPendingTerminalInput } from \"../commands/terminal.js\";\nimport type { ServerConfig } from \"../config.js\";\nimport { ClientId, WsClient } from \"./client.js\";\nimport { type CommandContext, dispatch } from \"./dispatch.js\";\nimport type { FencingManager } from \"./fencing.js\";\nimport { isStreamTopic } from \"./topic-class.js\";\n\ninterface WsHubDeps {\n eventBus: EventBus;\n commandContext: CommandContext | null;\n config: ServerConfig;\n fencingMgr: FencingManager;\n logger?: FastifyBaseLogger;\n}\n\nconst BINARY_PAYLOAD_TIMEOUT_MS = 5000;\n\ninterface BinaryWaiter {\n resolve: (payload: Buffer) => void;\n reject: (error: Error) => void;\n timer: NodeJS.Timeout;\n}\n\nconst isBinaryTerminalInputArgs = (args: unknown): args is TerminalInputBinaryArgs => {\n return (\n typeof args === \"object\" &&\n args !== null &&\n \"transport\" in args &&\n (args as { transport?: unknown }).transport === \"binary\"\n );\n};\n\n/**\n * Broadcaster interface for fan-out of domain events to subscribed clients.\n * Used by FsWatcher and SupervisorManager; WsHub is the only implementation.\n * Internally routes via isStreamTopic so callers don't have to classify.\n */\nexport interface Broadcaster {\n broadcast(topic: string, data: unknown): void;\n sendToClient(clientId: ClientId, msg: ServerToClient): boolean;\n sendBinaryToClient(clientId: ClientId, data: Buffer): boolean;\n getRequestMetadata?(clientId: ClientId): FastifyRequest | undefined;\n revokeAndCloseClient?(clientId: ClientId, generation: number): void;\n}\n\nexport class WsHub implements Broadcaster {\n private clients = new Map<ClientId, WsClient>();\n private clientRequests = new Map<ClientId, FastifyRequest>();\n private eventUnsubscribers: (() => void)[] = [];\n private nextStreamId = 1;\n // Per-client queue of waiters for the next inbound binary frame. The\n // terminal.input protocol sends a JSON command immediately followed by a\n // binary payload \u2014 the JSON is dispatched synchronously, so we have to\n // await the binary frame here before letting the handler run.\n private pendingBinaryWaiters = new Map<ClientId, BinaryWaiter[]>();\n\n constructor(private readonly deps: WsHubDeps) {\n this.subscribeToEvents();\n }\n\n setLogger(logger: FastifyBaseLogger): void {\n this.deps.logger = logger;\n }\n\n setCommandContext(commandContext: CommandContext): void {\n this.deps.commandContext = commandContext;\n }\n\n /**\n * Handle a new WebSocket connection\n */\n handleConnection(socket: WebSocket, req: FastifyRequest): void {\n const client = new WsClient(socket, uuidv4(), this.deps.logger);\n this.clients.set(client.id, client);\n this.clientRequests.set(client.id, req);\n\n // Send initial connection metadata. Writer status is established later by\n // fencing.request, but the UI still needs the app version immediately.\n client.sendEvent(\"connection.status\", {\n status: \"connected\",\n clientId: client.id,\n authEnabled: this.deps.config.auth.enabled,\n binaryTerminalTransport: true,\n version: this.deps.config.appVersion ?? \"0.0.0\",\n serverInstanceId: `server-${process.pid}`,\n isWriter: false,\n });\n\n // Setup handlers\n client.onMessage((msg) => this.routeMessage(client, msg));\n client.onClose(() => this.handleClose(client));\n }\n\n /**\n * Route incoming message from client\n */\n private async routeMessage(client: WsClient, msg: ClientToServer | Buffer): Promise<void> {\n if (Buffer.isBuffer(msg)) {\n this.deliverBinaryPayload(client.id, msg);\n return;\n }\n\n switch (msg.kind) {\n case \"subscribe\":\n client.subscribe(msg.topics);\n break;\n\n case \"unsubscribe\":\n client.unsubscribe(msg.topics);\n break;\n\n case \"command\": {\n const commandContext = this.getCommandContext();\n let pendingBinaryStreamId: number | null = null;\n if (msg.op === \"terminal.input\" && isBinaryTerminalInputArgs(msg.args)) {\n // The JSON command arrives one frame ahead of its binary payload.\n // Wait for the payload before dispatching so the handler can decode\n // synchronously by streamId.\n try {\n const payload = await this.awaitBinaryPayload(client.id);\n registerPendingTerminalInput(msg.args, payload);\n pendingBinaryStreamId = msg.args.streamId;\n } catch (error) {\n client.send({\n kind: \"result\",\n id: msg.id,\n ok: false,\n error: {\n code: \"terminal_input_binary_timeout\",\n message:\n error instanceof Error\n ? error.message\n : \"Timeout waiting for terminal input binary payload\",\n },\n });\n break;\n }\n }\n const result = await dispatch(msg as Command, commandContext, client.id);\n if (\n pendingBinaryStreamId !== null &&\n !result.ok &&\n result.error?.code === \"validation_error\"\n ) {\n clearPendingTerminalInput(pendingBinaryStreamId);\n }\n client.send(result);\n break;\n }\n\n case \"resync\":\n this.handleResync(client, msg.lastSeen);\n break;\n }\n }\n\n private awaitBinaryPayload(clientId: ClientId): Promise<Buffer> {\n return new Promise<Buffer>((resolve, reject) => {\n const timer = setTimeout(() => {\n const waiters = this.pendingBinaryWaiters.get(clientId);\n if (!waiters) return;\n const idx = waiters.findIndex((w) => w.timer === timer);\n if (idx === -1) return;\n waiters.splice(idx, 1);\n if (waiters.length === 0) {\n this.pendingBinaryWaiters.delete(clientId);\n }\n reject(new Error(\"Timeout waiting for terminal input binary payload\"));\n }, BINARY_PAYLOAD_TIMEOUT_MS);\n\n const waiter: BinaryWaiter = { resolve, reject, timer };\n const queue = this.pendingBinaryWaiters.get(clientId);\n if (queue) {\n queue.push(waiter);\n } else {\n this.pendingBinaryWaiters.set(clientId, [waiter]);\n }\n });\n }\n\n private deliverBinaryPayload(clientId: ClientId, payload: Buffer): void {\n const queue = this.pendingBinaryWaiters.get(clientId);\n if (!queue || queue.length === 0) {\n return;\n }\n const waiter = queue.shift()!;\n if (queue.length === 0) {\n this.pendingBinaryWaiters.delete(clientId);\n }\n clearTimeout(waiter.timer);\n waiter.resolve(payload);\n }\n\n private discardPendingBinaryWaiters(clientId: ClientId): void {\n const queue = this.pendingBinaryWaiters.get(clientId);\n if (!queue) return;\n this.pendingBinaryWaiters.delete(clientId);\n for (const waiter of queue) {\n clearTimeout(waiter.timer);\n waiter.reject(new Error(\"Client disconnected before binary payload arrived\"));\n }\n }\n\n /**\n * Handle resync request\n */\n private handleResync(client: WsClient, lastSeen: Record<string, number>): void {\n const commandContext = this.getCommandContext();\n const workspaces = commandContext.workspaceMgr.list();\n for (const workspace of workspaces) {\n const workspaceTopic = Topics.workspaceMeta(workspace.id);\n if (client.subscribesTo(workspaceTopic)) {\n client.sendEvent(workspaceTopic, workspace);\n }\n\n const sessions = commandContext.sessionMgr.getForWorkspace(workspace.id);\n for (const session of sessions) {\n const sessionTopic = Topics.sessionState(workspace.id, session.id);\n if (!client.subscribesTo(sessionTopic)) {\n continue;\n }\n client.sendEvent(sessionTopic, session);\n }\n }\n\n client.sendEvent(\"connection.status\", {\n status: \"resynced\",\n topics: Object.keys(lastSeen),\n });\n }\n\n /**\n * Handle client close\n */\n private handleClose(client: WsClient): void {\n this.clients.delete(client.id);\n this.clientRequests.delete(client.id);\n this.discardPendingBinaryWaiters(client.id);\n this.deps.commandContext?.autoFetch.unregisterViewer(client.id);\n this.deps.commandContext?.activationMgr.onSocketClosed(client.id);\n\n // Release fencing tokens held by this client\n // FencingManager tracks by clientId internally\n // Note: FencingManager doesn't have a method to release by clientId yet\n // This will be handled by the client calling fencing.release before disconnect\n }\n\n /**\n * Takeover: Force close existing writer and accept new one\n * DEPRECATED: This is now handled through fencing.takeover command\n * Kept for backward compatibility\n */\n async takeover(newClient: WsClient): Promise<void> {\n // Note: This method is deprecated in favor of FencingManager\n // Keeping for backward compatibility\n this.clients.set(newClient.id, newClient);\n }\n\n /**\n * Broadcast to all subscribed clients.\n * Routes by isStreamTopic: stream topics go through the per-topic queued\n * path; everything else goes through the control path (never dropped).\n */\n broadcast(topic: string, payload: unknown): void {\n const stream = isStreamTopic(topic);\n for (const client of this.clients.values()) {\n if (!client.subscribesTo(topic)) continue;\n if (stream && Buffer.isBuffer(payload)) {\n this.sendTerminalStreamToClient(client, topic, payload, 0);\n } else if (stream) {\n client.sendEventStream(topic, payload);\n } else {\n client.sendEvent(topic, payload);\n }\n }\n }\n\n /**\n * Send message to specific client\n */\n sendToClient(clientId: ClientId, msg: ServerToClient): boolean {\n const client = this.clients.get(clientId);\n if (!client) return false;\n return client.send(msg);\n }\n\n sendBinaryToClient(clientId: ClientId, data: Buffer): boolean {\n const client = this.clients.get(clientId);\n if (!client) return false;\n return client.sendBinary(data);\n }\n\n revokeAndCloseClient(clientId: ClientId, generation: number): void {\n const client = this.clients.get(clientId);\n if (!client) {\n return;\n }\n\n client.sendEventAndClose(\n \"activation.revoked\",\n {\n reason: \"displaced\",\n generation,\n },\n 4001,\n \"single_active_displaced\"\n );\n }\n\n getRequestMetadata(clientId: ClientId): FastifyRequest | undefined {\n return this.clientRequests.get(clientId);\n }\n\n /**\n * Get the current writer client\n * DEPRECATED: Writer tracking now handled by FencingManager\n */\n getWriter(): WsClient | null {\n // Note: This method is deprecated in favor of FencingManager\n return null;\n }\n\n /**\n * Ping all clients for keepalive\n */\n pingAll(): void {\n for (const client of this.clients.values()) {\n if (!client.alive) {\n client.close(1011, \"keepalive_timeout\");\n continue;\n }\n client.ping();\n }\n }\n\n /**\n * Close all connections\n */\n closeAll(): void {\n for (const client of this.clients.values()) {\n client.close();\n }\n this.clients.clear();\n this.clientRequests.clear();\n }\n\n /**\n * Subscribe to domain events and broadcast them\n */\n private subscribeToEvents(): void {\n // Subscribe to all domain event types\n const eventTypes: DomainEvent[\"type\"][] = [\n \"session.state.changed\",\n \"session.lifecycle\",\n \"workspace.meta.changed\",\n \"git.state.changed\",\n \"fs.dirty\",\n \"terminal.created\",\n \"terminal.output\",\n \"terminal.exited\",\n ];\n\n for (const type of eventTypes) {\n const unsub = this.deps.eventBus.on(type, (event) => {\n this.handleDomainEvent(event);\n });\n this.eventUnsubscribers.push(unsub);\n }\n }\n\n /**\n * Convert domain event to WebSocket event and broadcast\n */\n private handleDomainEvent(event: DomainEvent): void {\n if (event.type === \"terminal.output\") {\n const topic = Topics.terminalOutput(event.workspaceId, event.terminalId);\n for (const client of this.clients.values()) {\n if (!client.subscribesTo(topic)) continue;\n this.sendTerminalStreamToClient(client, topic, event.chunk, event.seq);\n }\n return;\n }\n\n let topic: string;\n let data: unknown;\n\n switch (event.type) {\n case \"session.state.changed\":\n if (!event.workspaceId) {\n return;\n }\n topic = Topics.sessionState(event.workspaceId, event.sessionId);\n data = event.session ?? {\n state: event.to,\n from: event.from,\n };\n break;\n\n case \"session.lifecycle\":\n if (!event.workspaceId) {\n return;\n }\n topic = Topics.sessionLifecycle(event.workspaceId, event.sessionId);\n data = {\n event: event.event,\n };\n break;\n\n case \"workspace.meta.changed\":\n topic = Topics.workspaceMeta(event.workspaceId);\n data = event.patch;\n break;\n\n case \"git.state.changed\":\n topic = Topics.workspaceGitState(event.workspaceId);\n data = {\n treeChanged: Boolean(event.treeChanged),\n branchChanged: Boolean(event.branchChanged),\n worktreeChanged: Boolean(event.worktreeChanged),\n };\n break;\n\n case \"fs.dirty\":\n topic = Topics.workspaceFsDirty(event.workspaceId);\n data = { reason: event.reason };\n break;\n\n case \"terminal.created\":\n topic = Topics.terminalCreated(event.workspaceId, event.terminalId);\n data = {\n id: event.terminalId,\n kind: event.kind,\n title: event.title,\n cwd: event.cwd,\n workspaceId: event.workspaceId,\n };\n break;\n\n case \"terminal.exited\":\n topic = Topics.terminalExit(event.workspaceId, event.terminalId);\n data = {\n code: event.exitCode,\n };\n break;\n\n default:\n return;\n }\n\n this.broadcast(topic, data);\n }\n\n private sendTerminalStreamToClient(\n client: WsClient,\n topic: string,\n payload: Buffer,\n seq: number\n ): void {\n const streamId = this.allocateStreamId();\n client.sendStream(\n topic,\n Buffer.from(\n encodeTerminalOutputFrame({ topic, seq, streamId, payloadSize: payload.length }, payload)\n )\n );\n }\n\n private allocateStreamId(): number {\n const id = this.nextStreamId;\n this.nextStreamId += 1;\n return id;\n }\n\n private getCommandContext(): CommandContext {\n if (!this.deps.commandContext) {\n throw new Error(\"WebSocket command context has not been initialized\");\n }\n return this.deps.commandContext;\n }\n\n /**\n * Cleanup event subscriptions\n */\n destroy(): void {\n for (const unsub of this.eventUnsubscribers) {\n unsub();\n }\n this.eventUnsubscribers = [];\n this.closeAll();\n }\n}\n", "/**\n * Workspace Commands\n */\n\nimport { readdir } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { z } from \"zod\";\nimport { registerCommand } from \"../ws/dispatch.js\";\n\n// workspace.list\nregisterCommand(\"workspace.list\", z.object({}), async (_args, ctx) => {\n return ctx.workspaceMgr.list();\n});\n\n// workspace.browse - List directories for path selection\nregisterCommand(\n \"workspace.browse\",\n z.object({\n path: z.string().optional(),\n }),\n async (args) => {\n const basePath = args.path || homedir();\n const entries = await readdir(basePath, { withFileTypes: true });\n\n const directories = entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => ({\n name: entry.name,\n path: join(basePath, entry.name),\n }))\n .sort((a, b) => a.name.localeCompare(b.name));\n\n return {\n currentPath: basePath,\n parentPath: basePath !== \"/\" ? join(basePath, \"..\") : null,\n directories,\n };\n }\n);\n\n// workspace.open\nregisterCommand(\n \"workspace.open\",\n z.object({\n path: z.string(),\n }),\n async (args, ctx) => {\n return ctx.workspaceMgr.open({\n path: args.path,\n });\n }\n);\n\n// workspace.close\nregisterCommand(\n \"workspace.close\",\n z.object({\n id: z.string(),\n }),\n async (args, ctx) => {\n await ctx.workspaceMgr.close(args.id);\n }\n);\n\nregisterCommand(\n \"workspace.uiState.set\",\n z.object({\n workspaceId: z.string(),\n uiState: z.object({\n leftPanelWidth: z.number(),\n bottomPanelHeight: z.number(),\n focusMode: z.boolean(),\n activeSessionId: z.string().optional(),\n fileTreeExpandedDirs: z.array(z.string()).optional(),\n paneLayout: z\n .object({\n id: z.string(),\n type: z.enum([\"leaf\", \"split\"]),\n sessionId: z.string().optional(),\n direction: z.enum([\"horizontal\", \"vertical\"]).optional(),\n children: z\n .lazy(() =>\n z.array(\n z.object({\n id: z.string(),\n type: z.enum([\"leaf\", \"split\"]),\n sessionId: z.string().optional(),\n direction: z.enum([\"horizontal\", \"vertical\"]).optional(),\n children: z.any().optional(),\n })\n )\n )\n .optional(),\n })\n .optional(),\n }),\n }),\n async (args, ctx) => {\n ctx.workspaceMgr.updateUiState(args.workspaceId, args.uiState);\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n return workspace;\n }\n);\n", "import type { WorkspaceLastViewedTarget } from \"@coder-studio/core\";\nimport { z } from \"zod\";\nimport { registerCommand } from \"../ws/dispatch.js\";\n\nconst WORKSPACE_LAST_VIEWED_TARGET_KEY = \"workspace.lastViewedTarget\";\nconst workspaceLastViewedTargetSchema = z.object({\n workspaceId: z.string(),\n sessionId: z.string().optional(),\n updatedAt: z.number(),\n});\n\nfunction parseWorkspaceLastViewedTarget(value: string): WorkspaceLastViewedTarget | null {\n try {\n const parsed = JSON.parse(value);\n const result = workspaceLastViewedTargetSchema.safeParse(parsed);\n return result.success ? result.data : null;\n } catch {\n return null;\n }\n}\n\nregisterCommand(\n \"workspace.activate\",\n z.object({\n workspaceId: z.string(),\n }),\n async (args, ctx, clientId) => {\n if (!clientId) {\n return {};\n }\n\n ctx.autoFetch.registerViewer(clientId, args.workspaceId);\n return {};\n }\n);\n\nregisterCommand(\"workspace.deactivate\", z.object({}), async (_args, ctx, clientId) => {\n if (!clientId) {\n return {};\n }\n\n ctx.autoFetch.unregisterViewer(clientId);\n return {};\n});\n\nregisterCommand(\"workspace.lastViewedTarget.get\", z.object({}), async (_args, ctx) => {\n const row = ctx.db\n .prepare(\"SELECT value FROM user_settings WHERE key = ?\")\n .get(WORKSPACE_LAST_VIEWED_TARGET_KEY) as { value: string } | undefined;\n\n if (!row) {\n return null;\n }\n\n return parseWorkspaceLastViewedTarget(row.value);\n});\n\nregisterCommand(\n \"workspace.lastViewedTarget.set\",\n z.object({\n workspaceId: z.string(),\n sessionId: z.string().optional(),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw {\n code: \"workspace_not_found\",\n message: `Workspace not found: ${args.workspaceId}`,\n };\n }\n\n const session = args.sessionId ? ctx.sessionMgr.get(args.sessionId) : undefined;\n\n const nextTarget: WorkspaceLastViewedTarget = {\n workspaceId: args.workspaceId,\n sessionId: session && session.workspaceId === args.workspaceId ? session.id : undefined,\n updatedAt: Date.now(),\n };\n\n ctx.db\n .prepare(\n `\n INSERT INTO user_settings (key, value)\n VALUES (?, ?)\n ON CONFLICT(key) DO UPDATE SET value = excluded.value\n `\n )\n .run(WORKSPACE_LAST_VIEWED_TARGET_KEY, JSON.stringify(nextTarget));\n\n return nextTarget;\n }\n);\n", "import { z } from \"zod\";\nimport { registerCommand } from \"../ws/dispatch.js\";\n\nregisterCommand(\n \"activation.claim\",\n z.object({ clientInstanceId: z.string().min(1) }),\n async (args, ctx, clientId) => {\n if (!clientId) {\n throw {\n code: \"activation_request_unavailable\",\n message: \"Activation claim requires websocket request metadata\",\n };\n }\n\n const request = ctx.broadcaster.getRequestMetadata?.(clientId);\n if (!request) {\n throw {\n code: \"activation_request_unavailable\",\n message: \"Activation claim requires websocket request metadata\",\n };\n }\n\n const claim = ctx.activationMgr.claim(args.clientInstanceId, clientId, request);\n if (claim.displacedWsClientId) {\n ctx.broadcaster.revokeAndCloseClient?.(claim.displacedWsClientId, claim.generation);\n }\n\n return claim;\n }\n);\n\nregisterCommand(\n \"activation.release\",\n z.object({ clientInstanceId: z.string(), generation: z.number().int().positive() }),\n async (args, ctx, clientId) => {\n const lease = ctx.activationMgr.getLease();\n if (!clientId || !lease || lease.wsClientId !== clientId) {\n return { ok: false };\n }\n\n ctx.activationMgr.release(args.clientInstanceId, args.generation);\n return { ok: true };\n }\n);\n", "import { z } from \"zod\";\nimport { registerCommand } from \"../ws/dispatch.js\";\n\nregisterCommand(\"connection.probe\", z.object({}).default({}), async () => {\n return { ok: true as const };\n});\n", "import type { ProviderDefinition, ProviderRuntimeStatusResponse } from \"@coder-studio/core\";\nimport {\n type CommandAvailabilityCheck,\n type CommandCheckDeps,\n checkCommandAvailable,\n} from \"./command-check.js\";\n\nexport interface RuntimeStatusDeps extends CommandCheckDeps {\n commandExists?: CommandAvailabilityCheck;\n}\n\nfunction canAutoInstall(\n provider: ProviderDefinition,\n platform: NodeJS.Platform,\n missingCommands: string[],\n missingPrerequisites: string[],\n availableCommands: Set<string>\n): boolean {\n const strategies = provider.install.strategies[platform] ?? [];\n const remainingCommands = new Set(missingCommands);\n const remainingPrerequisites = new Set(missingPrerequisites);\n const reachableCommands = new Set(availableCommands);\n let progressed = true;\n\n while (progressed) {\n progressed = false;\n\n for (const strategy of strategies) {\n const requiresMet = strategy.requiresCommands.every((command) =>\n reachableCommands.has(command)\n );\n\n if (\n strategy.kind === \"prerequisite\" &&\n remainingPrerequisites.has(strategy.targetCommand) &&\n requiresMet\n ) {\n remainingPrerequisites.delete(strategy.targetCommand);\n reachableCommands.add(strategy.targetCommand);\n progressed = true;\n continue;\n }\n\n if (\n strategy.kind === \"provider\" &&\n remainingCommands.has(strategy.targetCommand) &&\n requiresMet\n ) {\n remainingCommands.delete(strategy.targetCommand);\n reachableCommands.add(strategy.targetCommand);\n progressed = true;\n }\n }\n }\n\n return remainingCommands.size === 0 && strategies.length > 0;\n}\n\nexport async function buildProviderRuntimeStatus(\n providers: ProviderDefinition[],\n deps: RuntimeStatusDeps = {}\n): Promise<ProviderRuntimeStatusResponse> {\n const platform = deps.platform ?? process.platform;\n const commandExists =\n deps.commandExists ?? ((command: string) => checkCommandAvailable(command, deps));\n const result: ProviderRuntimeStatusResponse = { providers: {} };\n\n for (const provider of providers) {\n const strategies = provider.install.strategies[platform] ?? [];\n const strategyDependencyCommands = new Set<string>();\n for (const strategy of strategies) {\n for (const command of strategy.requiresCommands) {\n strategyDependencyCommands.add(command);\n }\n }\n\n const missingCommands: string[] = [];\n const availableCommands = new Set<string>();\n for (const command of provider.requiredCommands) {\n if (await commandExists(command)) {\n availableCommands.add(command);\n } else {\n missingCommands.push(command);\n }\n }\n\n const missingPrerequisites: string[] = [];\n for (const command of provider.install.prerequisites) {\n if (await commandExists(command)) {\n availableCommands.add(command);\n } else {\n missingPrerequisites.push(command);\n }\n }\n\n for (const command of strategyDependencyCommands) {\n if (availableCommands.has(command)) {\n continue;\n }\n\n if (await commandExists(command)) {\n availableCommands.add(command);\n }\n }\n\n const autoInstallSupported = canAutoInstall(\n provider,\n platform,\n missingCommands,\n missingPrerequisites,\n availableCommands\n );\n const available = missingCommands.length === 0;\n\n result.providers[provider.id] = {\n providerId: provider.id,\n available,\n missingCommands,\n missingPrerequisites,\n autoInstallSupported,\n installReadiness: available\n ? \"ready\"\n : autoInstallSupported\n ? missingPrerequisites.length === 0\n ? \"ready\"\n : \"missing_prerequisite\"\n : \"unsupported_platform\",\n manualGuideKeys: provider.install.manualGuideKeys,\n docUrls: provider.install.docUrls,\n };\n }\n\n return result;\n}\n", "/**\n * Session Commands\n */\n\nimport type { ProviderDefinition } from \"@coder-studio/core\";\nimport { z } from \"zod\";\nimport { buildProviderRuntimeStatus } from \"../provider-runtime/runtime-status.js\";\nimport { registerCommand } from \"../ws/dispatch.js\";\n\nfunction getProviderFromRegistry(\n providerId: string,\n registry: ProviderDefinition[]\n): ProviderDefinition | undefined {\n return registry.find((provider) => provider.id === providerId);\n}\n\n// session.list\nregisterCommand(\n \"session.list\",\n z.object({\n workspaceId: z.string(),\n }),\n async (args, ctx) => {\n return ctx.sessionMgr.getForWorkspace(args.workspaceId);\n }\n);\n\n// session.create\nregisterCommand(\n \"session.create\",\n z.object({\n workspaceId: z.string(),\n providerId: z.string(),\n draft: z.string().optional(),\n }),\n async (args, ctx) => {\n // Get workspace\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n const provider = getProviderFromRegistry(args.providerId, ctx.providerRegistry);\n if (!provider) {\n throw { code: \"unknown_provider\", message: `Provider not found: ${args.providerId}` };\n }\n\n const runtimeStatus = await buildProviderRuntimeStatus([provider], ctx.providerRuntimeDeps);\n const providerStatus = runtimeStatus.providers[provider.id];\n\n if (!providerStatus?.available) {\n throw {\n code: \"provider_cli_missing\",\n message: \"Provider CLI is not installed\",\n details: {\n providerId: provider.id,\n missingCommands: providerStatus?.missingCommands ?? provider.requiredCommands,\n },\n };\n }\n\n return ctx.sessionMgr.create({\n workspaceId: args.workspaceId,\n workspacePath: workspace.path,\n providerId: args.providerId,\n provider,\n draft: args.draft,\n });\n }\n);\n\n// session.stop\nregisterCommand(\n \"session.stop\",\n z.object({\n sessionId: z.string(),\n }),\n async (args, ctx) => {\n await ctx.sessionMgr.stop(args.sessionId);\n }\n);\n\n// session.remove\nregisterCommand(\n \"session.remove\",\n z.object({\n sessionId: z.string(),\n }),\n async (args, ctx) => {\n const session = ctx.sessionMgr.get(args.sessionId);\n if (!session) {\n throw { code: \"session_not_found\", message: `Session not found: ${args.sessionId}` };\n }\n\n if (session.state !== \"ended\") {\n throw { code: \"invalid_state\", message: `Cannot remove session in state: ${session.state}` };\n }\n\n ctx.sessionMgr.delete(args.sessionId);\n }\n);\n", "/**\n * Lazy file tree builder.\n * Returns only direct children of a directory (no recursion).\n */\n\nimport type { FileNode } from \"@coder-studio/core\";\nimport { readdir, stat } from \"fs/promises\";\nimport { join, relative } from \"path\";\nimport { createGitignoreFilter, createTreeVisibilityFilter } from \"./gitignore.js\";\n\nexport interface ReadTreeResult {\n path: string;\n children: FileNode[];\n}\n\n/**\n * Builds a file tree for a workspace directory.\n * Only returns direct children of the requested directory (lazy loading).\n * Directories have `children: undefined` to signal \"not loaded yet\".\n *\n * @param rootPath - Workspace root path\n * @param subdir - Optional subdirectory to read from\n * @returns File tree structure with only direct children\n */\nexport async function readTree(rootPath: string, subdir?: string): Promise<ReadTreeResult> {\n const targetPath = subdir ? join(rootPath, subdir) : rootPath;\n const filter = createTreeVisibilityFilter();\n\n const entries = await readdir(targetPath, { withFileTypes: true });\n const nodes: FileNode[] = [];\n\n for (const entry of entries) {\n if (!filter(entry.name)) {\n continue;\n }\n\n const fullPath = join(targetPath, entry.name);\n const relPath = relative(rootPath, fullPath);\n\n if (entry.isDirectory()) {\n nodes.push({\n name: entry.name,\n path: relPath,\n kind: \"dir\",\n children: undefined, // Not loaded yet - client will request on expand\n });\n } else if (entry.isFile()) {\n const stats = await stat(fullPath);\n nodes.push({\n name: entry.name,\n path: relPath,\n kind: \"file\",\n size: stats.size,\n mtime: stats.mtimeMs,\n });\n }\n }\n\n // Sort: directories first, then files, alphabetically within each group\n nodes.sort((a, b) => {\n if (a.kind !== b.kind) {\n return a.kind === \"dir\" ? -1 : 1;\n }\n return a.name.localeCompare(b.name);\n });\n\n return {\n path: subdir || \".\",\n children: nodes,\n };\n}\n\nexport interface SearchFilesResult {\n files: FileNode[];\n}\n\nexport async function searchFiles(\n rootPath: string,\n query: string,\n limit = 10\n): Promise<SearchFilesResult> {\n const normalizedQuery = query.trim().toLowerCase();\n if (!normalizedQuery) {\n return { files: [] };\n }\n\n const matches: Array<{ path: string; name: string; fullPath: string; rank: number }> = [];\n\n async function walk(dirPath: string): Promise<void> {\n const filter = createGitignoreFilter(rootPath, dirPath);\n const entries = await readdir(dirPath, { withFileTypes: true });\n\n const filteredEntries = entries.filter((entry) => filter(entry.name));\n filteredEntries.sort((a, b) => a.name.localeCompare(b.name));\n\n for (const entry of filteredEntries) {\n const fullPath = join(dirPath, entry.name);\n const relPath = relative(rootPath, fullPath);\n\n if (entry.isDirectory()) {\n await walk(fullPath);\n continue;\n }\n\n if (entry.isFile()) {\n const rank = scoreFilenameMatch(entry.name, normalizedQuery);\n if (rank === null) {\n continue;\n }\n\n matches.push({\n path: relPath,\n name: entry.name,\n fullPath,\n rank,\n });\n }\n }\n }\n\n await walk(rootPath);\n\n const files: FileNode[] = [];\n for (const match of matches\n .sort((a, b) => {\n if (a.rank !== b.rank) {\n return a.rank - b.rank;\n }\n\n const nameCompare = a.name.toLowerCase().localeCompare(b.name.toLowerCase());\n if (nameCompare !== 0) {\n return nameCompare;\n }\n\n const depthCompare = a.path.split(\"/\").length - b.path.split(\"/\").length;\n if (depthCompare !== 0) {\n return depthCompare;\n }\n\n return a.path.toLowerCase().localeCompare(b.path.toLowerCase());\n })\n .slice(0, limit)) {\n const stats = await stat(match.fullPath);\n files.push({\n name: match.name,\n path: match.path,\n kind: \"file\",\n size: stats.size,\n mtime: stats.mtimeMs,\n });\n }\n\n return { files };\n}\n\nfunction scoreFilenameMatch(name: string, query: string): number | null {\n const normalizedName = name.toLowerCase();\n const baseName = normalizedName.replace(/\\.[^.]+$/, \"\");\n\n if (normalizedName === query) {\n return 0;\n }\n\n if (baseName === query) {\n return 1;\n }\n\n if (normalizedName.startsWith(query)) {\n return 2;\n }\n\n if (baseName.startsWith(query)) {\n return 3;\n }\n\n if (normalizedName.includes(query)) {\n return 4;\n }\n\n if (baseName.includes(query)) {\n return 5;\n }\n\n if (isSubsequence(query, normalizedName)) {\n return 6;\n }\n\n return null;\n}\n\nfunction isSubsequence(query: string, candidate: string): boolean {\n let index = 0;\n\n for (const char of candidate) {\n if (char === query[index]) {\n index += 1;\n if (index === query.length) {\n return true;\n }\n }\n }\n\n return query.length === 0;\n}\n", "/**\n * File System Commands\n */\n\nimport { z } from \"zod\";\nimport { createDirectory, createFile, deleteEntry, readFile, writeFile } from \"../fs/file-io.js\";\nimport { readTree, searchFiles } from \"../fs/tree.js\";\nimport { registerCommand } from \"../ws/dispatch.js\";\n\n// file.readTree\nregisterCommand(\n \"file.readTree\",\n z.object({\n workspaceId: z.string(),\n subPath: z.string().optional(),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n return readTree(workspace.path, args.subPath);\n }\n);\n\n// file.search\nregisterCommand(\n \"file.search\",\n z.object({\n workspaceId: z.string(),\n query: z.string(),\n limit: z.number().int().positive().max(50).optional(),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n return searchFiles(workspace.path, args.query, args.limit ?? 10);\n }\n);\n\n// file.read\nregisterCommand(\n \"file.read\",\n z.object({\n workspaceId: z.string(),\n path: z.string(),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n return readFile(args.workspaceId, workspace.path, args.path);\n }\n);\n\n// file.create\nregisterCommand(\n \"file.create\",\n z.object({\n workspaceId: z.string(),\n path: z.string(),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n await createFile(workspace.path, args.path);\n ctx.eventBus.emit({\n type: \"fs.dirty\",\n workspaceId: args.workspaceId,\n reason: \"fs_change\",\n });\n return { ok: true };\n }\n);\n\n// file.mkdir\nregisterCommand(\n \"file.mkdir\",\n z.object({\n workspaceId: z.string(),\n path: z.string(),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n await createDirectory(workspace.path, args.path);\n ctx.eventBus.emit({\n type: \"fs.dirty\",\n workspaceId: args.workspaceId,\n reason: \"fs_change\",\n });\n return { ok: true };\n }\n);\n\n// file.delete\nregisterCommand(\n \"file.delete\",\n z.object({\n workspaceId: z.string(),\n path: z.string(),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n await deleteEntry(workspace.path, args.path);\n ctx.eventBus.emit({\n type: \"fs.dirty\",\n workspaceId: args.workspaceId,\n reason: \"fs_change\",\n });\n return { ok: true };\n }\n);\n\n// file.write\nregisterCommand(\n \"file.write\",\n z.object({\n workspaceId: z.string(),\n path: z.string(),\n content: z.string(),\n baseHash: z.string().optional(), // For conflict detection\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n const result = await writeFile(workspace.path, args.path, args.content, args.baseHash);\n ctx.eventBus.emit({\n type: \"fs.dirty\",\n workspaceId: args.workspaceId,\n reason: \"file_content\",\n });\n return result;\n }\n);\n", "/**\n * Git-related constants\n */\n\n/**\n * Common git remote names used for remote branch detection\n */\nexport const GIT_COMMON_REMOTES = [\"origin/\", \"upstream/\"] as const;\n", "/**\n * Git status parser for porcelain=v2 format.\n */\n\nimport type { GitChangeStatus, GitFileChange, GitStatus } from \"@coder-studio/core\";\n\n/**\n * Parses git status --porcelain=v2 --branch output.\n *\n * Format reference: https://git-scm.com/docs/git-status#_porcelain_format_version_2\n *\n * @param porcelainV2 - Output from git status --porcelain=v2 --branch\n * @returns Structured git status\n */\nexport function parseStatus(porcelainV2: string): GitStatus {\n let branch = \"\";\n let ahead = 0;\n let behind = 0;\n let headSha: string | undefined;\n const staged: GitFileChange[] = [];\n const modified: GitFileChange[] = [];\n const untracked: GitFileChange[] = [];\n const deleted: GitFileChange[] = [];\n const records = porcelainV2.includes(\"\\0\")\n ? porcelainV2.split(\"\\0\").filter((record) => record.length > 0)\n : porcelainV2.split(\"\\n\").filter((record) => record.length > 0);\n\n for (let index = 0; index < records.length; index += 1) {\n const record = records[index];\n if (!record) {\n continue;\n }\n\n if (record.startsWith(\"# branch.oid \")) {\n const oid = record.substring(\"# branch.oid \".length);\n if (oid && oid !== \"(initial)\") {\n headSha = oid;\n }\n continue;\n }\n\n if (record.startsWith(\"# branch.head \")) {\n branch = record.substring(\"# branch.head \".length);\n continue;\n }\n\n if (record.startsWith(\"# branch.ab \")) {\n const match = record.match(/# branch\\.ab \\+(\\d+) -(\\d+)/);\n const nextAhead = match?.[1];\n const nextBehind = match?.[2];\n if (nextAhead && nextBehind) {\n ahead = parseInt(nextAhead, 10);\n behind = parseInt(nextBehind, 10);\n }\n continue;\n }\n\n if (record.startsWith(\"1 \")) {\n parseOrdinaryChangedEntry(record, staged, modified, deleted);\n continue;\n }\n\n if (record.startsWith(\"2 \")) {\n const oldPath = records[index + 1];\n parseRenamedEntry(record, oldPath, staged, modified, deleted);\n if (oldPath) {\n index += 1;\n }\n continue;\n }\n\n if (record.startsWith(\"? \")) {\n untracked.push({ path: record.substring(2), status: \"untracked\" });\n }\n }\n\n return {\n branch,\n ahead,\n behind,\n headSha,\n headShortSha: headSha?.slice(0, 7),\n staged,\n modified,\n untracked,\n deleted,\n };\n}\n\n/**\n * Parses a regular changed entry line (format 1).\n */\nfunction parseOrdinaryChangedEntry(\n record: string,\n staged: GitFileChange[],\n modified: GitFileChange[],\n deleted: GitFileChange[]\n): void {\n const parts = record.split(\" \");\n const xy = parts[1]; // XY status codes\n if (!xy) {\n return;\n }\n\n const path = parts.slice(8).join(\" \");\n if (!path) {\n return;\n }\n\n pushChange({ path }, xy, staged, modified, deleted);\n}\n\n/**\n * Parses a renamed entry line (format 2). In NUL-delimited mode the old path\n * is carried in the following record rather than inline.\n */\nfunction parseRenamedEntry(\n record: string,\n oldPathRecord: string | undefined,\n staged: GitFileChange[],\n modified: GitFileChange[],\n deleted: GitFileChange[]\n): void {\n const parts = record.split(\" \");\n const xy = parts[1];\n if (!xy) {\n return;\n }\n\n const pathTokens = parts.slice(9);\n const pathAndMaybeOldPath = pathTokens.join(\" \");\n const inlinePathParts = pathAndMaybeOldPath.split(\"\\t\");\n const fallbackPath =\n !oldPathRecord && inlinePathParts.length === 1 && pathTokens.length > 1\n ? pathTokens.slice(0, -1).join(\" \")\n : undefined;\n const path = fallbackPath ?? inlinePathParts[0];\n if (!path) {\n return;\n }\n\n const oldPath =\n (oldPathRecord && !oldPathRecord.startsWith(\"#\") ? oldPathRecord : undefined) ??\n inlinePathParts[1] ??\n (pathTokens.length > 1 ? pathTokens[pathTokens.length - 1] : undefined);\n pushChange({ path, oldPath }, xy, staged, modified, deleted);\n}\n\nfunction pushChange(\n change: GitFileChange,\n xy: string,\n staged: GitFileChange[],\n modified: GitFileChange[],\n deleted: GitFileChange[]\n): void {\n const indexStatus = xy[0];\n const worktreeStatus = xy[1];\n\n if (indexStatus && indexStatus !== \".\" && indexStatus !== \" \") {\n staged.push({\n ...change,\n status: resolveGitChangeStatus(indexStatus, change.oldPath),\n });\n }\n\n if (!worktreeStatus || worktreeStatus === \".\" || worktreeStatus === \" \") {\n return;\n }\n\n if (worktreeStatus === \"D\") {\n deleted.push({ path: change.path, status: \"deleted\" });\n return;\n }\n\n modified.push({\n path: change.path,\n oldPath: change.oldPath,\n status: resolveGitChangeStatus(worktreeStatus, change.oldPath),\n });\n}\n\nfunction resolveGitChangeStatus(code: string, oldPath?: string): GitChangeStatus {\n switch (code) {\n case \"A\":\n return \"added\";\n case \"D\":\n return \"deleted\";\n case \"R\":\n return \"renamed\";\n case \"C\":\n return oldPath ? \"renamed\" : \"added\";\n case \"U\":\n return \"modified\";\n case \"M\":\n case \"T\":\n default:\n return oldPath ? \"renamed\" : \"modified\";\n }\n}\n", "/**\n * Git CLI operations - Wrapper around git commands.\n */\n\nimport type { GitBranch, GitCommitSummary, GitStatus } from \"@coder-studio/core\";\nimport { execFile } from \"child_process\";\nimport { mkdir, mkdtemp, rm, writeFile } from \"fs/promises\";\nimport os from \"os\";\nimport path from \"path\";\nimport { GIT_COMMON_REMOTES } from \"../constants/git.js\";\nimport { parseStatus } from \"./status-parser.js\";\n\nexport interface GitCommandResult {\n stdout: string;\n stderr: string;\n}\n\ninterface RunGitOptions {\n env?: NodeJS.ProcessEnv;\n timeoutMs?: number;\n stdin?: string;\n config?: GitConfigOverride[];\n}\n\ninterface GitRemoteBranchTarget {\n remote: string;\n branch: string;\n}\n\ntype GitConfigOverride = [key: string, value: string];\n\nexport interface GitHttpAuth {\n username: string;\n password: string;\n}\n\ninterface GitSyncSuccessResult {\n success: boolean;\n message: string;\n remote?: string;\n branch?: string;\n updated?: boolean;\n}\n\nexport interface GitAuthFailureDetails {\n operation: \"push\" | \"pull\" | \"fetch\";\n remote?: string;\n remoteUrl?: string;\n remoteLabel: string;\n host?: string;\n reason: \"missing_credentials\" | \"invalid_credentials\" | \"authorization_failed\";\n authMode: \"username_password\" | \"unsupported\";\n canPrompt: boolean;\n usernameHint?: string;\n}\n\nconst GIT_NETWORK_TIMEOUT_MS = 3 * 60 * 1000;\n\n/**\n * Executes a git command in the specified working directory.\n *\n * @param cwd - Working directory\n * @param args - Git command arguments\n * @returns Command output\n */\nexport async function runGit(\n cwd: string,\n args: string[],\n options: RunGitOptions = {}\n): Promise<GitCommandResult> {\n return new Promise((resolve, reject) => {\n const gitArgs = [\n ...(options.config?.flatMap(([key, value]) => [\"-c\", `${key}=${value}`]) ?? []),\n ...args,\n ];\n\n const child = execFile(\n \"git\",\n gitArgs,\n {\n cwd,\n env: {\n ...process.env,\n GIT_TERMINAL_PROMPT: \"0\",\n // Force C locale so prompt detection (e.g. askpass `grep \"username\"`)\n // and parsers do not break on systems running git in another language.\n LC_ALL: \"C\",\n LANG: \"C\",\n ...options.env,\n },\n maxBuffer: 10 * 1024 * 1024,\n timeout: options.timeoutMs,\n windowsHide: true,\n },\n (err, stdout, stderr) => {\n if (err) {\n reject(new GitError(err.message, stderr));\n } else {\n resolve({ stdout, stderr });\n }\n }\n );\n\n if (options.stdin !== undefined && child.stdin) {\n child.stdin.on(\"error\", () => {});\n child.stdin.end(options.stdin);\n }\n });\n}\n\n/**\n * Error thrown when git command fails.\n */\nexport class GitError extends Error {\n constructor(\n message: string,\n public readonly stderr: string\n ) {\n super(message);\n this.name = \"GitError\";\n }\n}\n\n/**\n * Error thrown when a git network operation fails authentication.\n * The dispatcher serializes `code` and `details` onto the protocol error.\n */\nexport class GitAuthError extends Error {\n constructor(\n message: string,\n public readonly code: \"git_auth_required\" | \"git_auth_failed\",\n public readonly details: GitAuthFailureDetails\n ) {\n super(message);\n this.name = \"GitAuthError\";\n }\n}\n\ninterface GitAuthContext {\n remote?: string;\n remoteUrl?: string;\n operation: \"push\" | \"pull\" | \"fetch\";\n attemptedCredentialAuth?: boolean;\n}\n\ninterface RemoteUrlMetadata {\n protocol?: string;\n host?: string;\n path?: string;\n sanitizedUrl?: string;\n canPrompt: boolean;\n}\n\ninterface PreparedGitAuthExecution {\n env?: NodeJS.ProcessEnv;\n config?: GitConfigOverride[];\n cleanup: () => Promise<void>;\n}\n\n/**\n * Get git status for a workspace.\n */\nexport async function getGitStatus(cwd: string): Promise<GitStatus> {\n const { stdout: statusOutput } = await runGit(cwd, [\n \"status\",\n \"--porcelain=v2\",\n \"-z\",\n \"--branch\",\n \"--untracked-files=all\",\n ]);\n const status = parseStatus(statusOutput);\n\n if (!status.headSha) {\n return status;\n }\n\n const { stdout: headSubjectOutput } = await runGit(cwd, [\"show\", \"-s\", \"--format=%s\", \"HEAD\"]);\n return {\n ...status,\n headSubject: headSubjectOutput.trim(),\n };\n}\n\n/**\n * Get recent commit history for the current HEAD.\n */\nexport async function getGitHistory(cwd: string, limit = 5): Promise<GitCommitSummary[]> {\n try {\n const { stdout } = await runGit(cwd, [\n \"log\",\n `--max-count=${Math.max(1, limit)}`,\n \"--format=%H%x1f%h%x1f%s%x1f%an%x1f%at%x1e\",\n ]);\n\n return stdout\n .split(\"\\x1e\")\n .map((record) => record.trim())\n .filter((record) => record.length > 0)\n .map((record) => {\n const [sha = \"\", shortSha = \"\", subject = \"\", authorName = \"\", authoredAt = \"0\"] =\n record.split(\"\\x1f\");\n return {\n sha,\n shortSha,\n subject,\n authorName,\n authoredAt: Number.parseInt(authoredAt, 10) * 1000,\n };\n })\n .filter((entry) => entry.sha && entry.subject);\n } catch (error) {\n if (error instanceof GitError && /does not have any commits yet/i.test(error.stderr)) {\n return [];\n }\n\n throw error;\n }\n}\n\n/**\n * Get the full patch for a specific commit.\n */\nexport async function getGitCommitDiff(cwd: string, sha: string): Promise<string> {\n const { stdout } = await runGit(cwd, [\n \"show\",\n \"--format=medium\",\n \"--no-color\",\n \"--end-of-options\",\n sha,\n ]);\n return stdout;\n}\n\n/**\n * Get compact git status text for supervisor evaluation prompts.\n */\nexport async function getGitStatusSummary(cwd: string): Promise<string> {\n const { stdout } = await runGit(cwd, [\"status\", \"--short\"]);\n return stdout.trim();\n}\n\n/**\n * Get compact git diff stats for supervisor evaluation prompts.\n */\nexport async function getGitDiffStatSummary(cwd: string): Promise<string> {\n const { stdout } = await runGit(cwd, [\"diff\", \"--stat\"]);\n return stdout.trim();\n}\n\n/**\n * Stage files for commit.\n */\nexport async function stageFiles(cwd: string, paths: string[]): Promise<void> {\n if (paths.length === 0) return;\n await runGit(cwd, [\"add\", ...paths]);\n}\n\n/**\n * Unstage files.\n */\nexport async function unstageFiles(cwd: string, paths: string[]): Promise<void> {\n if (paths.length === 0) return;\n await runGit(cwd, [\"reset\", \"HEAD\", \"--\", ...paths]);\n}\n\n/**\n * Discard changes to files.\n */\nexport async function discardChanges(cwd: string, paths: string[]): Promise<void> {\n if (paths.length === 0) return;\n\n const trackedPaths: string[] = [];\n const untrackedPaths: string[] = [];\n\n for (const path of paths) {\n try {\n await runGit(cwd, [\"ls-files\", \"--error-unmatch\", \"--\", path]);\n trackedPaths.push(path);\n } catch {\n untrackedPaths.push(path);\n }\n }\n\n if (trackedPaths.length > 0) {\n await runGit(cwd, [\"restore\", \"--staged\", \"--worktree\", \"--\", ...trackedPaths]);\n }\n\n if (untrackedPaths.length > 0) {\n await runGit(cwd, [\"clean\", \"-fd\", \"--\", ...untrackedPaths]);\n }\n}\n\n/**\n * Create a commit.\n */\nexport async function commitChanges(cwd: string, message: string): Promise<{ sha: string }> {\n const { stdout } = await runGit(cwd, [\"commit\", \"-m\", message]);\n\n // Extract SHA from output\n const match = stdout.match(/\\[.* ([a-f0-9]+)\\]/);\n const sha = match?.[1] ?? \"\";\n\n return { sha };\n}\n\n/**\n * Push changes to remote.\n */\nexport async function runGitPush(\n cwd: string,\n options?: {\n remote?: string;\n branch?: string;\n force?: boolean;\n auth?: GitHttpAuth;\n }\n): Promise<GitSyncSuccessResult> {\n const args = [\"push\"];\n let remote = options?.remote;\n let branch = options?.branch;\n\n if (options?.force) {\n args.push(\"--force\");\n }\n\n if (!remote || !branch) {\n const pushTarget = await resolveRemoteBranchTarget(cwd, \"push\");\n remote = remote ?? pushTarget?.remote;\n branch = branch ?? pushTarget?.branch;\n }\n\n if (!remote || !branch) {\n const upstreamTarget = await resolveRemoteBranchTarget(cwd, \"upstream\");\n remote = remote ?? upstreamTarget?.remote;\n branch = branch ?? upstreamTarget?.branch;\n }\n\n if (!remote && branch) {\n remote = (await getPreferredRemote(cwd)) ?? \"origin\";\n }\n\n if (!remote) {\n remote = (await getPreferredRemote(cwd)) ?? undefined;\n }\n\n const summaryBranch = branch ?? (await getCurrentBranchName(cwd));\n\n if (remote && branch) {\n args.push(remote, `HEAD:${branch}`);\n } else if (remote) {\n args.push(\"--set-upstream\", remote, \"HEAD\");\n }\n const remoteUrl = remote ? await getRemoteUrl(cwd, remote) : null;\n const remoteMetadata = parseRemoteUrlMetadata(remoteUrl ?? undefined);\n const authExecution = await prepareGitAuthExecution(options?.auth, remoteMetadata);\n\n try {\n const { stdout, stderr } = await runGit(cwd, args, {\n timeoutMs: GIT_NETWORK_TIMEOUT_MS,\n env: authExecution.env,\n config: authExecution.config,\n });\n\n if (options?.auth) {\n await persistGitHttpCredentials(cwd, options.auth, remoteMetadata);\n }\n\n return {\n success: true,\n message: \"Push completed successfully\",\n remote,\n branch: summaryBranch,\n updated: !isPushUpToDate(stdout, stderr),\n };\n } catch (error) {\n throw normalizeGitAuthFailure(error, {\n operation: \"push\",\n remote,\n remoteUrl: remoteMetadata.sanitizedUrl ?? remoteUrl ?? undefined,\n attemptedCredentialAuth: Boolean(options?.auth),\n });\n } finally {\n await authExecution.cleanup();\n }\n}\n\n/**\n * Pull changes from remote.\n */\nexport async function runGitPull(\n cwd: string,\n options?: {\n remote?: string;\n branch?: string;\n auth?: GitHttpAuth;\n }\n): Promise<GitSyncSuccessResult & { updatedFiles?: string[] }> {\n const args = [\"pull\"];\n let remote = options?.remote;\n let branch = options?.branch;\n\n if (!remote || !branch) {\n const upstreamTarget = await resolveRemoteBranchTarget(cwd, \"upstream\");\n remote = remote ?? upstreamTarget?.remote;\n branch = branch ?? upstreamTarget?.branch;\n }\n\n if (!remote && branch) {\n remote = (await getPreferredRemote(cwd)) ?? \"origin\";\n }\n\n const summaryBranch = branch ?? (await getCurrentBranchName(cwd));\n\n if (remote && branch) {\n args.push(remote, branch);\n }\n const remoteUrl = remote ? await getRemoteUrl(cwd, remote) : null;\n const remoteMetadata = parseRemoteUrlMetadata(remoteUrl ?? undefined);\n const authExecution = await prepareGitAuthExecution(options?.auth, remoteMetadata);\n\n try {\n const { stdout, stderr } = await runGit(cwd, args, {\n timeoutMs: GIT_NETWORK_TIMEOUT_MS,\n env: authExecution.env,\n config: authExecution.config,\n });\n\n if (options?.auth) {\n await persistGitHttpCredentials(cwd, options.auth, remoteMetadata);\n }\n\n // Parse updated files from output\n const updatedFiles: string[] = [];\n const fileMatches = stdout.matchAll(\n /Updating\\s+([a-f0-9]+)\\.\\.\\.([a-f0-9]+)\\nFast-forward\\n([\\s\\S]*)/g\n );\n for (const match of fileMatches) {\n const filesSection = match[3] ?? \"\";\n const fileLines = filesSection.split(\"\\n\").filter((line) => line.trim());\n for (const line of fileLines) {\n const fileMatch = line.match(/^\\s+\\S+\\s+(\\S+)/);\n if (fileMatch && fileMatch[1]) {\n updatedFiles.push(fileMatch[1]);\n }\n }\n }\n\n return {\n success: true,\n message: \"Pull completed successfully\",\n remote,\n branch: summaryBranch,\n updated: !isPullUpToDate(stdout, stderr),\n updatedFiles,\n };\n } catch (error) {\n throw normalizeGitAuthFailure(error, {\n operation: \"pull\",\n remote,\n remoteUrl: remoteMetadata.sanitizedUrl ?? remoteUrl ?? undefined,\n attemptedCredentialAuth: Boolean(options?.auth),\n });\n } finally {\n await authExecution.cleanup();\n }\n}\n\n/**\n * Fetch remote refs without merging. Used by manual fetch + background auto-fetch.\n */\nexport interface RunGitFetchOptions {\n remote?: string;\n prune?: boolean;\n auth?: GitHttpAuth;\n timeoutMs?: number;\n}\n\nexport async function runGitFetch(\n cwd: string,\n options?: RunGitFetchOptions\n): Promise<{ success: boolean; message: string; updatedRefs: string[] }> {\n const args = [\"fetch\"];\n const remote = options?.remote;\n const metadataRemote = remote ?? (await getPreferredRemote(cwd)) ?? undefined;\n const prune = options?.prune ?? true;\n\n if (remote) {\n args.push(remote);\n } else {\n args.push(\"--all\");\n }\n\n if (prune) {\n args.push(\"--prune\");\n }\n\n const remoteUrl = metadataRemote ? await getRemoteUrl(cwd, metadataRemote) : null;\n const remoteMetadata = parseRemoteUrlMetadata(remoteUrl ?? undefined);\n const authExecution = await prepareGitAuthExecution(options?.auth, remoteMetadata);\n\n try {\n const { stdout, stderr } = await runGit(cwd, args, {\n timeoutMs: options?.timeoutMs ?? GIT_NETWORK_TIMEOUT_MS,\n env: authExecution.env,\n config: authExecution.config,\n });\n\n if (options?.auth) {\n await persistGitHttpCredentials(cwd, options.auth, remoteMetadata);\n }\n\n const message = stdout || stderr || \"Fetch completed successfully\";\n return {\n success: true,\n message,\n updatedRefs: parseFetchUpdatedRefs(stderr),\n };\n } catch (error) {\n throw normalizeGitAuthFailure(error, {\n operation: \"fetch\",\n remote: metadataRemote,\n remoteUrl: remoteMetadata.sanitizedUrl ?? remoteUrl ?? undefined,\n attemptedCredentialAuth: Boolean(options?.auth),\n });\n } finally {\n await authExecution.cleanup();\n }\n}\n\nfunction parseFetchUpdatedRefs(stderr: string): string[] {\n const refs: string[] = [];\n for (const rawLine of stderr.split(\"\\n\")) {\n const line = rawLine.trimEnd();\n const arrowIndex = line.indexOf(\" -> \");\n if (arrowIndex < 0) continue;\n const target = line.slice(arrowIndex + 4).trim();\n if (!target) continue;\n refs.push(target);\n }\n return refs;\n}\n\n/**\n * Checkout a branch or commit.\n */\nexport async function runGitCheckout(\n cwd: string,\n ref: string,\n options?: {\n createBranch?: boolean;\n }\n): Promise<{ success: boolean; message: string; branch?: string }> {\n const args = [\"checkout\"];\n const formatCheckoutError = (error: unknown, fallbackMessage: string) =>\n error instanceof GitError\n ? error.stderr.trim() || error.message || fallbackMessage\n : fallbackMessage;\n\n // Detect remote branch refs by querying actual configured remotes\n let isRemoteRef = false;\n try {\n const { stdout: remoteList } = await runGit(cwd, [\"remote\"]);\n const remotes = remoteList.trim().split(\"\\n\").filter(Boolean);\n // Check if ref starts with any configured remote (e.g., 'origin/main')\n isRemoteRef = remotes.some((remote) => ref.startsWith(`${remote}/`));\n } catch {\n // Fall back to common remotes if git remote fails\n isRemoteRef = GIT_COMMON_REMOTES.some((remote) => ref.startsWith(remote));\n }\n\n // If remote branch ref, auto-create tracking branch\n if (isRemoteRef && !options?.createBranch) {\n const remoteSeparatorIndex = ref.indexOf(\"/\");\n const branchName = remoteSeparatorIndex >= 0 ? ref.slice(remoteSeparatorIndex + 1) : ref;\n\n try {\n await runGit(cwd, [\"show-ref\", \"--verify\", \"--quiet\", `refs/heads/${branchName}`]);\n const { stdout, stderr } = await runGit(cwd, [\"checkout\", branchName]);\n const message = stdout || stderr || `Checkout to ${branchName} completed`;\n return { success: true, message, branch: branchName };\n } catch {\n args.push(\"-b\", branchName, ref);\n }\n\n try {\n const { stdout, stderr } = await runGit(cwd, args);\n const message = stdout || stderr || `Checkout to ${ref} completed`;\n\n // For remote branch checkout, we know the branch name from the ref\n return { success: true, message, branch: branchName };\n } catch (error) {\n return {\n success: false,\n message: formatCheckoutError(error, `Failed to checkout remote branch '${ref}'`),\n };\n }\n } else {\n // Original logic for local branches and createBranch flag\n if (options?.createBranch) {\n args.push(\"-b\");\n }\n args.push(ref);\n\n try {\n const { stdout, stderr } = await runGit(cwd, args);\n\n // Extract branch name from output\n const branchMatch = stdout.match(/Switched to (?:a new branch|branch) '([^']+)'/);\n const branch = branchMatch?.[1] ?? ref;\n\n const message = stdout || stderr || `Checkout to ${ref} completed`;\n\n return { success: true, message, branch };\n } catch (error) {\n return {\n success: false,\n message: formatCheckoutError(error, `Failed to checkout '${ref}'`),\n };\n }\n }\n}\n\n/**\n * Create a new branch.\n */\nexport async function runGitCreateBranch(\n cwd: string,\n branchName: string,\n options?: {\n startPoint?: string;\n }\n): Promise<{ success: boolean; message: string; branch: string }> {\n const args = [\"branch\", branchName];\n\n if (options?.startPoint) {\n args.push(options.startPoint);\n }\n\n await runGit(cwd, args);\n\n return { success: true, message: `Branch '${branchName}' created`, branch: branchName };\n}\n\n/**\n * List all branches (local and remote) with metadata.\n *\n * @param cwd - Working directory of the git repository\n * @returns Object with branches array and current branch name\n * - branches: Array of GitBranch objects with metadata\n * - current: Current branch name (empty string if detached HEAD or no commits)\n * @throws {GitError} If git commands fail (e.g., not a git repository)\n */\nexport async function runGitListBranches(cwd: string): Promise<{\n branches: GitBranch[];\n current: string;\n}> {\n // Get local branches\n const { stdout: localOutput } = await runGit(cwd, [\"branch\", \"--list\"]);\n const { stdout: localVerboseOutput } = await runGit(cwd, [\"branch\", \"--list\", \"-vv\"]);\n\n // Get remote branches\n const { stdout: remoteOutput } = await runGit(cwd, [\"branch\", \"-r\"]);\n\n const branches: GitBranch[] = [];\n let current = \"\";\n const linkedWorktreePathsByBranch = new Map<string, string>();\n\n const localVerboseLines = localVerboseOutput.split(\"\\n\").filter((line) => line.trim());\n for (const line of localVerboseLines) {\n const normalizedLine = line.replace(/^[*+ ]\\s+/, \"\");\n const branchMatch = normalizedLine.match(/^([^\\s]+)\\s+/);\n const worktreeMatch = line.match(/\\((.+?)\\)\\s/);\n if (!branchMatch?.[1] || !worktreeMatch?.[1]) {\n continue;\n }\n\n const worktreePath = worktreeMatch[1];\n if (worktreePath.startsWith(\"/\") || worktreePath.startsWith(\"~\")) {\n linkedWorktreePathsByBranch.set(branchMatch[1], worktreePath);\n }\n }\n\n // Parse local branches\n const localLines = localOutput.split(\"\\n\").filter((line) => line.trim());\n for (const line of localLines) {\n const isCurrent = line.startsWith(\"*\");\n const name = line.replace(/^[*+ ]\\s+/, \"\").trim();\n\n // Skip detached HEAD indicator\n if (name.startsWith(\"(HEAD detached\")) {\n if (isCurrent) {\n current = \"\"; // Empty string indicates detached state\n }\n continue; // Don't add to branches array\n }\n\n if (linkedWorktreePathsByBranch.has(name) && !isCurrent) {\n continue;\n }\n\n branches.push({\n name,\n isRemote: false,\n isCurrent,\n linkedWorktreePath: linkedWorktreePathsByBranch.get(name),\n });\n if (isCurrent) {\n current = name;\n }\n }\n\n // Parse remote branches\n const remoteLines = remoteOutput.split(\"\\n\").filter((line) => line.trim());\n for (const line of remoteLines) {\n const fullName = line.trim();\n if (fullName.includes(\" -> \")) {\n continue;\n }\n\n const [remote] = fullName.split(\"/\");\n branches.push({\n name: fullName, // Show full name \"origin/main\"\n isRemote: true,\n isCurrent: false,\n remote,\n });\n }\n\n return { branches, current };\n}\n\nasync function resolveRemoteBranchTarget(\n cwd: string,\n mode: \"push\" | \"upstream\"\n): Promise<GitRemoteBranchTarget | null> {\n const symbolicRef = mode === \"push\" ? \"@{push}\" : \"@{upstream}\";\n\n try {\n const { stdout } = await runGit(cwd, [\n \"rev-parse\",\n \"--abbrev-ref\",\n \"--symbolic-full-name\",\n symbolicRef,\n ]);\n const fullRef = stdout.trim();\n if (!fullRef) {\n return null;\n }\n\n const remoteSeparatorIndex = fullRef.indexOf(\"/\");\n if (remoteSeparatorIndex <= 0 || remoteSeparatorIndex === fullRef.length - 1) {\n return null;\n }\n\n return {\n remote: fullRef.slice(0, remoteSeparatorIndex),\n branch: fullRef.slice(remoteSeparatorIndex + 1),\n };\n } catch {\n return null;\n }\n}\n\nasync function getCurrentBranchName(cwd: string): Promise<string | undefined> {\n try {\n const { stdout } = await runGit(cwd, [\"branch\", \"--show-current\"]);\n const branch = stdout.trim();\n return branch || undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction isPushUpToDate(stdout: string, stderr: string): boolean {\n return /Everything up-to-date/i.test(`${stdout}\\n${stderr}`);\n}\n\nfunction isPullUpToDate(stdout: string, stderr: string): boolean {\n return /Already up[ -]to[ -]date\\.?/i.test(`${stdout}\\n${stderr}`);\n}\n\nasync function getPreferredRemote(cwd: string): Promise<string | null> {\n try {\n const { stdout } = await runGit(cwd, [\"remote\"]);\n const remotes = stdout\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean);\n\n if (remotes.length === 0) {\n return null;\n }\n\n return remotes.includes(\"origin\") ? \"origin\" : (remotes[0] ?? null);\n } catch {\n return null;\n }\n}\n\nasync function getRemoteUrl(cwd: string, remote: string): Promise<string | null> {\n try {\n const { stdout } = await runGit(cwd, [\"remote\", \"get-url\", remote]);\n const value = stdout.trim();\n return value || null;\n } catch {\n return null;\n }\n}\n\nasync function prepareGitAuthExecution(\n auth: GitHttpAuth | undefined,\n remoteMetadata: RemoteUrlMetadata\n): Promise<PreparedGitAuthExecution> {\n if (!auth || !remoteMetadata.canPrompt || !remoteMetadata.host) {\n return {\n cleanup: async () => {},\n };\n }\n\n const tempDir = await mkdtemp(path.join(os.tmpdir(), \"coder-studio-git-auth-\"));\n const hooksDir = path.join(tempDir, \"hooks\");\n const askPassPath = path.join(tempDir, \"askpass.sh\");\n\n await mkdir(hooksDir, { recursive: true, mode: 0o700 });\n await writeFile(\n askPassPath,\n [\n \"#!/bin/sh\",\n 'prompt=$(printf \"%s\" \"$1\" | tr \"[:upper:]\" \"[:lower:]\")',\n `if printf \"%s\" \"$prompt\" | grep -q \"username\"; then`,\n ' printf \"%s\" \"$CODER_STUDIO_GIT_AUTH_USERNAME\"',\n \"else\",\n ' printf \"%s\" \"$CODER_STUDIO_GIT_AUTH_PASSWORD\"',\n \"fi\",\n \"\",\n ].join(\"\\n\"),\n { mode: 0o700 }\n );\n\n return {\n env: {\n GIT_ASKPASS: askPassPath,\n SSH_ASKPASS: askPassPath,\n GCM_INTERACTIVE: \"never\",\n CODER_STUDIO_GIT_AUTH_USERNAME: auth.username,\n CODER_STUDIO_GIT_AUTH_PASSWORD: auth.password,\n },\n config: [\n [\"core.hooksPath\", hooksDir],\n [\"credential.helper\", \"\"],\n [\"credential.username\", auth.username],\n ],\n cleanup: async () => {\n await rm(tempDir, { recursive: true, force: true });\n },\n };\n}\n\nasync function persistGitHttpCredentials(\n cwd: string,\n auth: GitHttpAuth,\n remoteMetadata: RemoteUrlMetadata\n): Promise<void> {\n if (!remoteMetadata.canPrompt || !remoteMetadata.host || !remoteMetadata.path) {\n return;\n }\n\n let helperConfigured = false;\n try {\n if (remoteMetadata.sanitizedUrl) {\n const { stdout } = await runGit(\n cwd,\n [\"config\", \"--get-urlmatch\", \"credential.helper\", remoteMetadata.sanitizedUrl],\n {\n timeoutMs: 30000,\n }\n );\n helperConfigured = stdout\n .split(\"\\n\")\n .map((line) => line.trim())\n .some(Boolean);\n } else {\n const { stdout } = await runGit(\n cwd,\n [\"config\", \"--get-regexp\", \"^credential(\\\\..+)?\\\\.helper$\"],\n {\n timeoutMs: 30000,\n }\n );\n helperConfigured = stdout\n .split(\"\\n\")\n .map((line) => line.trim())\n .some(Boolean);\n }\n } catch {\n helperConfigured = false;\n }\n\n if (!helperConfigured) {\n return;\n }\n\n let useHttpPath = false;\n try {\n const configArgs = remoteMetadata.sanitizedUrl\n ? [\"config\", \"--get-urlmatch\", \"credential.useHttpPath\", remoteMetadata.sanitizedUrl]\n : [\"config\", \"--get\", \"credential.useHttpPath\"];\n const { stdout } = await runGit(cwd, configArgs, {\n timeoutMs: 30000,\n });\n useHttpPath = isGitBooleanTrue(stdout);\n } catch {\n useHttpPath = false;\n }\n\n const credentialInput = [\n `protocol=${remoteMetadata.protocol ?? \"https\"}`,\n `host=${remoteMetadata.host}`,\n ...(useHttpPath ? [`path=${remoteMetadata.path}`] : []),\n `username=${auth.username}`,\n `password=${auth.password}`,\n \"\",\n \"\",\n ].join(\"\\n\");\n\n try {\n await runGit(cwd, [\"credential\", \"approve\"], {\n stdin: credentialInput,\n timeoutMs: 30000,\n });\n } catch {\n // Persisting credentials is best-effort and should not fail the git operation.\n }\n}\n\nfunction normalizeGitAuthFailure(error: unknown, context: GitAuthContext): unknown {\n if (!(error instanceof GitError)) {\n return error;\n }\n\n const details = classifyGitAuthFailure(error, context);\n if (!details) {\n return error;\n }\n\n const code = details.canPrompt ? \"git_auth_required\" : \"git_auth_failed\";\n return new GitAuthError(formatGitAuthFailureMessage(details), code, details);\n}\n\nexport function classifyGitAuthFailure(\n error: GitError,\n context: GitAuthContext\n): GitAuthFailureDetails | null {\n const output = `${error.message}\\n${error.stderr}`.toLowerCase();\n const remoteMetadata = describeRemote(context.remote, context.remoteUrl);\n const authPatterns = [\n \"terminal prompts disabled\",\n \"could not read username\",\n \"could not read password\",\n \"authentication failed\",\n \"http basic: access denied\",\n \"invalid username or password\",\n \"invalid username or token\",\n \"support for password authentication was removed\",\n \"requested url returned error: 401\",\n \"requested url returned error: 403\",\n \"write access to repository not granted\",\n \"access denied\",\n \"authentication required\",\n \"permission denied (publickey)\",\n \"could not read from remote repository\",\n ];\n\n if (!authPatterns.some((pattern) => output.includes(pattern))) {\n return null;\n }\n\n const attemptedCredentialAuth = context.attemptedCredentialAuth ?? false;\n const reason =\n output.includes(\"requested url returned error: 403\") ||\n output.includes(\"write access to repository not granted\")\n ? \"authorization_failed\"\n : output.includes(\"terminal prompts disabled\") ||\n output.includes(\"could not read username\") ||\n output.includes(\"could not read password\")\n ? \"missing_credentials\"\n : attemptedCredentialAuth || output.includes(\"access denied\")\n ? \"invalid_credentials\"\n : \"missing_credentials\";\n\n return {\n operation: context.operation,\n remote: context.remote,\n remoteUrl: remoteMetadata.remoteUrl,\n remoteLabel: remoteMetadata.remoteLabel,\n host: remoteMetadata.host,\n reason,\n authMode: remoteMetadata.canPrompt ? \"username_password\" : \"unsupported\",\n canPrompt: remoteMetadata.canPrompt,\n usernameHint: remoteMetadata.usernameHint,\n };\n}\n\nfunction formatGitAuthFailureMessage(details: GitAuthFailureDetails): string {\n if (!details.canPrompt) {\n return `Authentication failed for ${details.remoteLabel}. Configure SSH keys or a credential helper, then try again.`;\n }\n\n if (details.reason === \"authorization_failed\") {\n return `Credentials for ${details.remoteLabel} were accepted, but this account is not allowed to ${details.operation}.`;\n }\n\n if (details.reason === \"invalid_credentials\") {\n return `Credentials for ${details.remoteLabel} were rejected. Enter a valid username and password or personal access token to continue.`;\n }\n\n return `Authentication is required to ${details.operation} ${details.remoteLabel}. Enter your Git username and password or personal access token to continue.`;\n}\n\nfunction describeRemote(remote: string | undefined, remoteUrl: string | undefined) {\n const metadata = parseRemoteUrlMetadata(remoteUrl);\n const remoteLabel = metadata.host\n ? `${remote ?? \"remote\"} (${metadata.host})`\n : (remote ?? \"remote\");\n\n return {\n remoteUrl: metadata.sanitizedUrl ?? remoteUrl,\n remoteLabel,\n host: metadata.host,\n canPrompt: metadata.canPrompt,\n usernameHint: undefined,\n };\n}\n\nfunction parseRemoteUrlMetadata(remoteUrl: string | undefined): RemoteUrlMetadata {\n if (!remoteUrl) {\n return {\n canPrompt: false,\n };\n }\n\n try {\n const parsed = new URL(remoteUrl);\n const pathName = parsed.pathname.replace(/^\\/+/, \"\");\n const sanitized = new URL(remoteUrl);\n sanitized.username = \"\";\n sanitized.password = \"\";\n return {\n protocol: parsed.protocol.replace(/:$/, \"\"),\n host: parsed.host || undefined,\n path: pathName || undefined,\n sanitizedUrl: sanitized.toString(),\n canPrompt: parsed.protocol === \"http:\" || parsed.protocol === \"https:\",\n };\n } catch {\n const sshMatch = remoteUrl.match(/^(?<user>[^@]+)@(?<host>[^:]+):.+$/);\n if (sshMatch?.groups?.host) {\n return {\n protocol: \"ssh\",\n host: sshMatch.groups.host,\n path: remoteUrl.split(\":\").slice(1).join(\":\") || undefined,\n sanitizedUrl: remoteUrl,\n canPrompt: false,\n };\n }\n\n return {\n sanitizedUrl: remoteUrl,\n canPrompt: false,\n };\n }\n}\n\nfunction isGitBooleanTrue(value: string): boolean {\n return [\"true\", \"yes\", \"on\", \"1\"].includes(value.trim().toLowerCase());\n}\n", "/**\n * Git diff operations.\n */\n\nimport { mkdtemp, rm } from \"fs/promises\";\nimport os from \"os\";\nimport path from \"path\";\nimport { GitError, runGit } from \"./cli.js\";\n\nasync function isTrackedPath(cwd: string, filePath: string): Promise<boolean> {\n try {\n await runGit(cwd, [\"ls-files\", \"--error-unmatch\", \"--\", filePath]);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function getUntrackedFileDiff(cwd: string, filePath: string): Promise<string> {\n const tempDir = await mkdtemp(path.join(os.tmpdir(), \"coder-studio-git-diff-\"));\n const tempIndex = path.join(tempDir, \"index\");\n\n try {\n try {\n await runGit(cwd, [\"read-tree\", \"HEAD\"], {\n env: { GIT_INDEX_FILE: tempIndex },\n });\n } catch (error) {\n if (!(error instanceof GitError)) {\n throw error;\n }\n\n // Fresh repositories may not have HEAD yet; an empty temporary index is\n // sufficient for intent-to-add diffs in that case.\n await runGit(cwd, [\"read-tree\", \"--empty\"], {\n env: { GIT_INDEX_FILE: tempIndex },\n });\n }\n\n await runGit(cwd, [\"add\", \"-N\", \"--\", filePath], {\n env: { GIT_INDEX_FILE: tempIndex },\n });\n\n const result = await runGit(cwd, [\"diff\", \"--\", filePath], {\n env: { GIT_INDEX_FILE: tempIndex },\n });\n return result.stdout;\n } finally {\n await rm(tempDir, { recursive: true, force: true });\n }\n}\n\n/**\n * Gets diff for a specific file.\n *\n * @param cwd - Working directory\n * @param path - File path (relative to cwd)\n * @param staged - Whether to show staged diff\n * @returns Diff output\n */\nexport async function getFileDiff(cwd: string, path: string, staged = false): Promise<string> {\n if (!staged && !(await isTrackedPath(cwd, path))) {\n return getUntrackedFileDiff(cwd, path);\n }\n\n const args = staged ? [\"diff\", \"--staged\", \"--\", path] : [\"diff\", \"--\", path];\n const result = await runGit(cwd, args);\n return result.stdout;\n}\n\n/**\n * Gets full diff for the working directory.\n *\n * @param cwd - Working directory\n * @param staged - Whether to show staged diff\n * @returns Diff output\n */\nexport async function getDiff(cwd: string, staged = false): Promise<string> {\n const args = staged ? [\"diff\", \"--staged\"] : [\"diff\"];\n const result = await runGit(cwd, args);\n return result.stdout;\n}\n", "import type { CommandContext } from \"../ws/dispatch.js\";\n\nexport function emitGitStateChanged(\n ctx: CommandContext,\n workspaceId: string,\n options?: {\n treeChanged?: boolean;\n branchChanged?: boolean;\n worktreeChanged?: boolean;\n }\n) {\n ctx.eventBus.emit({\n type: \"git.state.changed\",\n workspaceId,\n treeChanged: options?.treeChanged,\n branchChanged: options?.branchChanged,\n worktreeChanged: options?.worktreeChanged,\n });\n}\n", "/**\n * Git Commands\n */\n\nimport { z } from \"zod\";\nimport {\n commitChanges,\n discardChanges,\n GitAuthError,\n getGitCommitDiff,\n getGitHistory,\n getGitStatus,\n runGitCheckout,\n runGitCreateBranch,\n runGitFetch,\n runGitListBranches,\n runGitPull,\n runGitPush,\n stageFiles,\n unstageFiles,\n} from \"../git/cli.js\";\nimport { getFileDiff } from \"../git/diff.js\";\nimport type { CommandContext } from \"../ws/dispatch.js\";\nimport { registerCommand } from \"../ws/dispatch.js\";\nimport { emitGitStateChanged } from \"./git-events.js\";\n\nconst gitHttpAuthSchema = z.object({\n username: z.string(),\n password: z.string(),\n});\nconst gitCommitRevisionSchema = z\n .string()\n .regex(/^[0-9a-fA-F]{7,64}$/, \"Invalid git commit revision\");\n\nconst GIT_BACKGROUND_FETCH_TIMEOUT_MS = 30 * 1000;\n\nasync function runGitNetworkOperation<T>(\n ctx: CommandContext,\n workspaceId: string,\n op: () => Promise<T>\n): Promise<T> {\n if (!ctx.autoFetch?.runExclusive) {\n return op();\n }\n\n return ctx.autoFetch.runExclusive(workspaceId, op);\n}\n\n// git.status\nregisterCommand(\n \"git.status\",\n z.object({\n workspaceId: z.string(),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n return getGitStatus(workspace.path);\n }\n);\n\n// git.stage\nregisterCommand(\n \"git.stage\",\n z.object({\n workspaceId: z.string(),\n paths: z.array(z.string()),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n await stageFiles(workspace.path, args.paths);\n emitGitStateChanged(ctx, args.workspaceId);\n return {};\n }\n);\n\n// git.diff\nregisterCommand(\n \"git.diff\",\n z.object({\n workspaceId: z.string(),\n path: z.string(),\n staged: z.boolean().optional(),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n return {\n diff: await getFileDiff(workspace.path, args.path, args.staged ?? false),\n };\n }\n);\n\n// git.log\nregisterCommand(\n \"git.log\",\n z.object({\n workspaceId: z.string(),\n limit: z.number().int().min(1).max(50).optional(),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n return {\n entries: await getGitHistory(workspace.path, args.limit ?? 5),\n };\n }\n);\n\n// git.show\nregisterCommand(\n \"git.show\",\n z.object({\n workspaceId: z.string(),\n sha: gitCommitRevisionSchema,\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n return {\n diff: await getGitCommitDiff(workspace.path, args.sha),\n };\n }\n);\n\n// git.unstage\nregisterCommand(\n \"git.unstage\",\n z.object({\n workspaceId: z.string(),\n paths: z.array(z.string()),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n await unstageFiles(workspace.path, args.paths);\n emitGitStateChanged(ctx, args.workspaceId);\n return {};\n }\n);\n\n// git.discard\nregisterCommand(\n \"git.discard\",\n z.object({\n workspaceId: z.string(),\n paths: z.array(z.string()),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n await discardChanges(workspace.path, args.paths);\n emitGitStateChanged(ctx, args.workspaceId, {\n treeChanged: true,\n });\n return {};\n }\n);\n\n// git.commit\nregisterCommand(\n \"git.commit\",\n z.object({\n workspaceId: z.string(),\n message: z.string(),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n const result = await commitChanges(workspace.path, args.message);\n emitGitStateChanged(ctx, args.workspaceId, {\n branchChanged: true,\n worktreeChanged: true,\n });\n return result;\n }\n);\n\n// git.push\nregisterCommand(\n \"git.push\",\n z.object({\n workspaceId: z.string(),\n remote: z.string().optional(),\n branch: z.string().optional(),\n force: z.boolean().optional(),\n auth: gitHttpAuthSchema.optional(),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n const result = await runGitNetworkOperation(ctx, args.workspaceId, () =>\n runGitPush(workspace.path, {\n remote: args.remote,\n branch: args.branch,\n force: args.force,\n auth: args.auth,\n })\n );\n emitGitStateChanged(ctx, args.workspaceId, {\n branchChanged: true,\n worktreeChanged: true,\n });\n return result;\n }\n);\n\n// git.pull\nregisterCommand(\n \"git.pull\",\n z.object({\n workspaceId: z.string(),\n remote: z.string().optional(),\n branch: z.string().optional(),\n auth: gitHttpAuthSchema.optional(),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n const result = await runGitNetworkOperation(ctx, args.workspaceId, () =>\n runGitPull(workspace.path, {\n remote: args.remote,\n branch: args.branch,\n auth: args.auth,\n })\n );\n ctx.workspaceMgr.recordFetch(args.workspaceId);\n emitGitStateChanged(ctx, args.workspaceId, {\n treeChanged: true,\n branchChanged: true,\n worktreeChanged: true,\n });\n return result;\n }\n);\n\n// git.fetch\nregisterCommand(\n \"git.fetch\",\n z.object({\n workspaceId: z.string(),\n remote: z.string().optional(),\n prune: z.boolean().optional(),\n auth: gitHttpAuthSchema.optional(),\n background: z.boolean().optional(),\n }),\n async (args, ctx, clientId) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n try {\n // AutoFetchScheduler already holds the per-workspace lock before it\n // dispatches an internal background fetch. Client-originated requests\n // must still serialize through the shared network-operation gate.\n const isInternalBackgroundFetch = args.background === true && !clientId;\n const runFetch = () =>\n runGitFetch(workspace.path, {\n remote: args.remote,\n prune: args.prune,\n auth: args.auth,\n timeoutMs: args.background ? GIT_BACKGROUND_FETCH_TIMEOUT_MS : undefined,\n });\n const result = isInternalBackgroundFetch\n ? await runFetch()\n : await runGitNetworkOperation(ctx, args.workspaceId, runFetch);\n ctx.workspaceMgr.recordFetch(args.workspaceId);\n emitGitStateChanged(ctx, args.workspaceId, { branchChanged: true });\n return result;\n } catch (err) {\n if (args.background && err instanceof GitAuthError) {\n return { success: false, message: err.message, updatedRefs: [] };\n }\n throw err;\n }\n }\n);\n\n// git.checkout\nregisterCommand(\n \"git.checkout\",\n z.object({\n workspaceId: z.string(),\n ref: z.string(),\n createBranch: z.boolean().optional(),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n const result = await runGitCheckout(workspace.path, args.ref, {\n createBranch: args.createBranch,\n });\n if (result.success) {\n emitGitStateChanged(ctx, args.workspaceId, {\n treeChanged: true,\n branchChanged: true,\n worktreeChanged: true,\n });\n }\n return result;\n }\n);\n\n// git.branch\nregisterCommand(\n \"git.branch\",\n z.object({\n workspaceId: z.string(),\n name: z.string(),\n startPoint: z.string().optional(),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n const result = await runGitCreateBranch(workspace.path, args.name, {\n startPoint: args.startPoint,\n });\n emitGitStateChanged(ctx, args.workspaceId, {\n branchChanged: true,\n worktreeChanged: true,\n });\n return result;\n }\n);\n\n// git.branches\nregisterCommand(\n \"git.branches\",\n z.object({\n workspaceId: z.string(),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n return runGitListBranches(workspace.path);\n }\n);\n", "/**\n * Config file I/O utilities\n *\n * Provides read/write operations for Codex and Claude config files with:\n * - Environment variable override for test isolation\n * - Atomic writes via temp file + rename\n * - Timestamped backups before modifications\n */\n\nimport { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { basename, dirname, join } from \"node:path\";\n\nexport type ConfigType = \"codex\" | \"claude\";\n\nexport interface ConfigReadResult {\n /** Absolute path to the config file */\n configPath: string;\n /** File content (empty string if doesn't exist) */\n content: string;\n /** Whether the file exists */\n exists: boolean;\n}\n\nexport interface ConfigWriteResult {\n /** Whether the write succeeded */\n success: boolean;\n /** Path to the backup file (null if no backup created) */\n backupPath: string | null;\n /** Error message if write failed */\n error?: string;\n}\n\n/**\n * Resolve config file path with environment variable override support.\n *\n * Priority for Codex:\n * 1. CODER_STUDIO_CODEX_HOME (test isolation)\n * 2. CODEX_HOME (existing behavior)\n * 3. ~/.codex (default)\n *\n * Priority for Claude:\n * 1. CODER_STUDIO_CLAUDE_HOME (test isolation)\n * 2. ~/.claude (default)\n */\nexport function resolveConfigPath(configType: ConfigType): string {\n if (configType === \"codex\") {\n const testHome = process.env.CODER_STUDIO_CODEX_HOME;\n if (testHome && testHome.trim()) {\n return join(testHome, \"config.toml\");\n }\n const codexHome = process.env.CODEX_HOME;\n if (codexHome && codexHome.trim()) {\n return join(codexHome, \"config.toml\");\n }\n return join(homedir(), \".codex\", \"config.toml\");\n }\n\n if (configType === \"claude\") {\n const testHome = process.env.CODER_STUDIO_CLAUDE_HOME;\n if (testHome && testHome.trim()) {\n return join(testHome, \"settings.json\");\n }\n return join(homedir(), \".claude\", \"settings.json\");\n }\n\n throw new Error(`Unknown config type: ${configType}`);\n}\n\n/**\n * Read config file content.\n *\n * Returns empty string if file doesn't exist.\n * Never throws - returns exists: false on any error.\n */\nexport function readConfigFile(configType: ConfigType): ConfigReadResult {\n const configPath = resolveConfigPath(configType);\n\n if (!existsSync(configPath)) {\n return { configPath, content: \"\", exists: false };\n }\n\n try {\n const content = readFileSync(configPath, \"utf-8\");\n return { configPath, content, exists: true };\n } catch {\n return { configPath, content: \"\", exists: false };\n }\n}\n\n/**\n * Write config file with atomic write and backup.\n *\n * - Creates parent directory if needed\n * - Creates timestamped backup before overwrite\n * - Atomic write via .tmp file + rename\n */\nexport function writeConfigFile(configType: ConfigType, content: string): ConfigWriteResult {\n try {\n const configPath = resolveConfigPath(configType);\n\n // Ensure parent directory exists\n const parentDir = dirname(configPath);\n if (!existsSync(parentDir)) {\n mkdirSync(parentDir, { recursive: true });\n }\n\n // Create backup if file exists\n let backupPath: string | null = null;\n if (existsSync(configPath)) {\n backupPath = createBackup(configPath);\n }\n\n // Atomic write\n const tempPath = `${configPath}.tmp`;\n writeFileSync(tempPath, content, \"utf-8\");\n renameSync(tempPath, configPath);\n\n return { success: true, backupPath };\n } catch (error) {\n return {\n success: false,\n backupPath: null,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Create timestamped backup of a file.\n *\n * Format: <basename>.bak.<YYYYMMDD-HHmmss>.<ext>\n */\nfunction createBackup(filePath: string): string {\n const original = readFileSync(filePath, \"utf-8\");\n\n const ext = filePath.split(\".\").pop() ?? \"\";\n const base = basename(filePath, `.${ext}`);\n const dir = dirname(filePath);\n\n const ts = formatTimestamp(new Date());\n const backupPath = join(dir, `${base}.bak.${ts}.${ext}`);\n\n writeFileSync(backupPath, original, \"utf-8\");\n return backupPath;\n}\n\n/**\n * Format timestamp for backup filename.\n *\n * Format: YYYYMMDD-HHmmss\n */\nfunction formatTimestamp(d: Date): string {\n const pad = (n: number) => String(n).padStart(2, \"0\");\n return (\n `${d.getFullYear()}${pad(d.getMonth() + 1)}${pad(d.getDate())}` +\n `-${pad(d.getHours())}${pad(d.getMinutes())}${pad(d.getSeconds())}`\n );\n}\n", "/**\n * Settings Commands\n */\n\nimport {\n DEFAULT_SUPERVISOR_EVALUATION_TIMEOUT_SEC,\n MAX_SUPERVISOR_EVALUATION_TIMEOUT_SEC,\n MAX_SUPERVISOR_RETRY_DELAY_SEC,\n MAX_SUPERVISOR_RETRY_MAX_COUNT,\n resolveSupervisorEvaluationTimeoutSec,\n resolveSupervisorRetryDelaySec,\n resolveSupervisorRetryEnabled,\n resolveSupervisorRetryMaxCount,\n resolveSupervisorRetryOnEvaluatorError,\n resolveSupervisorRetryOnTimeout,\n} from \"@coder-studio/core\";\nimport { z } from \"zod\";\nimport { type ConfigType, readConfigFile, writeConfigFile } from \"../config/config-io.js\";\nimport {\n isSupportedProviderId,\n mergeProviderLaunchConfig,\n ProviderLaunchConfigInputSchema,\n ProviderSettingsSchema,\n sanitizeProviderLaunchConfig,\n} from \"../provider-config.js\";\nimport { ProviderConfigRepo } from \"../storage/repositories/provider-config-repo.js\";\nimport {\n SUPERVISOR_EVALUATION_TIMEOUT_SETTING_KEY,\n SUPERVISOR_RETRY_DELAY_SEC_SETTING_KEY,\n SUPERVISOR_RETRY_ENABLED_SETTING_KEY,\n SUPERVISOR_RETRY_MAX_COUNT_SETTING_KEY,\n SUPERVISOR_RETRY_ON_EVALUATOR_ERROR_SETTING_KEY,\n SUPERVISOR_RETRY_ON_TIMEOUT_SETTING_KEY,\n} from \"../supervisor/settings.js\";\nimport { registerCommand } from \"../ws/dispatch.js\";\n\n// Settings schema\nconst SettingsSchema = z.object({\n defaultProviderId: z.string().optional(),\n notifications: z\n .object({\n enabled: z.boolean().optional(),\n soundEnabled: z.boolean().optional(),\n // Legacy field \u2014 accepted for backward compat with older clients but\n // no longer surfaced in the UI. The web client now picks the channel\n // automatically based on workspace focus + page visibility.\n onlyWhenBackgrounded: z.boolean().optional(),\n })\n .optional(),\n supervisor: z\n .object({\n evaluationTimeoutSec: z\n .number()\n .int()\n .min(1)\n .max(MAX_SUPERVISOR_EVALUATION_TIMEOUT_SEC)\n .default(DEFAULT_SUPERVISOR_EVALUATION_TIMEOUT_SEC)\n .optional(),\n retryEnabled: z.boolean().optional(),\n retryMaxCount: z.number().int().min(0).max(MAX_SUPERVISOR_RETRY_MAX_COUNT).optional(),\n retryDelaySec: z.number().int().min(1).max(MAX_SUPERVISOR_RETRY_DELAY_SEC).optional(),\n retryOnTimeout: z.boolean().optional(),\n retryOnEvaluatorError: z.boolean().optional(),\n })\n .optional(),\n appearance: z\n .object({\n theme: z.enum([\"dark\", \"light\"]).optional(),\n themeId: z.string().optional(),\n terminalRenderer: z.enum([\"standard\", \"compatibility\"]).optional(),\n terminalCopyOnSelect: z.boolean().optional(),\n terminalFontSize: z.number().int().min(10).max(18).optional(),\n desktopTerminalFontSize: z.number().int().min(10).max(18).optional(),\n mobileTerminalFontSize: z.number().int().min(10).max(18).optional(),\n locale: z.enum([\"zh\", \"en\"]).optional(),\n })\n .optional(),\n providers: ProviderSettingsSchema.optional(),\n});\n\n// settings.get\nregisterCommand(\"settings.get\", z.object({}), async (_args, ctx) => {\n const row = ctx.db.prepare(\"SELECT key, value FROM user_settings\").all() as Array<{\n key: string;\n value: string;\n }>;\n\n const settings: Record<string, unknown> = {};\n for (const { key, value } of row) {\n if (key.startsWith(\"providers.\")) {\n continue;\n }\n\n try {\n settings[key] = JSON.parse(value);\n } catch {\n settings[key] = value;\n }\n }\n\n const providerConfigRepo = new ProviderConfigRepo(ctx.db);\n const providerConfigs = providerConfigRepo.getAll();\n for (const [providerId, config] of Object.entries(providerConfigs)) {\n if (!isSupportedProviderId(providerId)) {\n continue;\n }\n\n Object.assign(\n settings,\n flattenSettings(sanitizeProviderLaunchConfig(config), `providers.${providerId}`)\n );\n }\n\n if (Object.prototype.hasOwnProperty.call(settings, SUPERVISOR_EVALUATION_TIMEOUT_SETTING_KEY)) {\n settings[SUPERVISOR_EVALUATION_TIMEOUT_SETTING_KEY] = resolveSupervisorEvaluationTimeoutSec(\n settings[SUPERVISOR_EVALUATION_TIMEOUT_SETTING_KEY]\n );\n }\n if (Object.prototype.hasOwnProperty.call(settings, SUPERVISOR_RETRY_ENABLED_SETTING_KEY)) {\n settings[SUPERVISOR_RETRY_ENABLED_SETTING_KEY] = resolveSupervisorRetryEnabled(\n settings[SUPERVISOR_RETRY_ENABLED_SETTING_KEY]\n );\n }\n if (Object.prototype.hasOwnProperty.call(settings, SUPERVISOR_RETRY_MAX_COUNT_SETTING_KEY)) {\n settings[SUPERVISOR_RETRY_MAX_COUNT_SETTING_KEY] = resolveSupervisorRetryMaxCount(\n settings[SUPERVISOR_RETRY_MAX_COUNT_SETTING_KEY]\n );\n }\n if (Object.prototype.hasOwnProperty.call(settings, SUPERVISOR_RETRY_DELAY_SEC_SETTING_KEY)) {\n settings[SUPERVISOR_RETRY_DELAY_SEC_SETTING_KEY] = resolveSupervisorRetryDelaySec(\n settings[SUPERVISOR_RETRY_DELAY_SEC_SETTING_KEY]\n );\n }\n if (Object.prototype.hasOwnProperty.call(settings, SUPERVISOR_RETRY_ON_TIMEOUT_SETTING_KEY)) {\n settings[SUPERVISOR_RETRY_ON_TIMEOUT_SETTING_KEY] = resolveSupervisorRetryOnTimeout(\n settings[SUPERVISOR_RETRY_ON_TIMEOUT_SETTING_KEY]\n );\n }\n if (\n Object.prototype.hasOwnProperty.call(settings, SUPERVISOR_RETRY_ON_EVALUATOR_ERROR_SETTING_KEY)\n ) {\n settings[SUPERVISOR_RETRY_ON_EVALUATOR_ERROR_SETTING_KEY] =\n resolveSupervisorRetryOnEvaluatorError(\n settings[SUPERVISOR_RETRY_ON_EVALUATOR_ERROR_SETTING_KEY]\n );\n }\n\n return settings;\n});\n\n// settings.update\nregisterCommand(\n \"settings.update\",\n z.object({\n settings: SettingsSchema,\n }),\n async (args, ctx) => {\n const providerConfigRepo = new ProviderConfigRepo(ctx.db);\n const nextSettings = args.settings as Record<string, unknown>;\n const providers =\n nextSettings.providers &&\n typeof nextSettings.providers === \"object\" &&\n !Array.isArray(nextSettings.providers)\n ? (nextSettings.providers as Record<string, unknown>)\n : undefined;\n const { providers: _providers, ...nonProviderSettings } = nextSettings;\n\n // Flatten settings to key-value pairs\n const flatSettings = flattenSettings(nonProviderSettings);\n\n // Update each setting\n const stmt = ctx.db.prepare(`\n INSERT INTO user_settings (key, value)\n VALUES (?, ?)\n ON CONFLICT(key) DO UPDATE SET value = excluded.value\n `);\n\n for (const [key, value] of Object.entries(flatSettings)) {\n stmt.run(key, JSON.stringify(value));\n }\n\n if (providers) {\n for (const [providerId, config] of Object.entries(providers)) {\n providerConfigRepo.set(providerId, sanitizeProviderLaunchConfig(config));\n }\n }\n\n return {\n updated: [\n ...Object.keys(flatSettings),\n ...Object.keys(providers ?? {}).map((providerId) => `providers.${providerId}`),\n ],\n };\n }\n);\n\n// settings.previewCommand\nregisterCommand(\n \"settings.previewCommand\",\n z.object({\n providerId: z.string(),\n config: ProviderLaunchConfigInputSchema,\n workspacePath: z.string().optional(),\n }),\n async (args, ctx) => {\n const provider = ctx.providerRegistry.find((item) => item.id === args.providerId);\n\n if (!provider) {\n throw new Error(`Unknown provider: ${args.providerId}`);\n }\n\n const command = provider.buildCommand(mergeProviderLaunchConfig(provider, args.config), {\n sessionId: \"preview-session\",\n workspacePath: args.workspacePath ?? process.cwd(),\n });\n\n return {\n argv: command.argv,\n cwd: command.cwd,\n env: command.env,\n preview: `${command.argv.join(\" \")}${command.cwd ? ` # cwd=${command.cwd}` : \"\"}`,\n };\n }\n);\n\n/**\n * Flatten nested settings object to dot-notation keys\n */\nfunction flattenSettings(obj: Record<string, unknown>, prefix = \"\"): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n const fullKey = prefix ? `${prefix}.${key}` : key;\n\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n Object.assign(result, flattenSettings(value as Record<string, unknown>, fullKey));\n } else if (value !== undefined) {\n result[fullKey] = value;\n }\n }\n\n return result;\n}\n\n// settings.readConfigFile \u2014 read Codex or Claude config file content\nregisterCommand(\n \"settings.readConfigFile\",\n z.object({\n configType: z.enum([\"codex\", \"claude\"]),\n }),\n async (args) => {\n const result = readConfigFile(args.configType as ConfigType);\n return result;\n }\n);\n\n// settings.writeConfigFile \u2014 write Codex or Claude config file with backup\nregisterCommand(\n \"settings.writeConfigFile\",\n z.object({\n configType: z.enum([\"codex\", \"claude\"]),\n content: z.string(),\n }),\n async (args) => {\n const result = writeConfigFile(args.configType as ConfigType, args.content);\n return result;\n }\n);\n", "import { z } from \"zod\";\nimport { buildProviderRuntimeStatus } from \"../provider-runtime/runtime-status.js\";\nimport { registerCommand } from \"../ws/dispatch.js\";\n\nregisterCommand(\"provider.runtimeStatus\", z.object({}), async (_args, ctx) => {\n return buildProviderRuntimeStatus(ctx.providerRegistry, ctx.providerRuntimeDeps);\n});\n\nregisterCommand(\n \"provider.install.start\",\n z.object({\n providerId: z.string(),\n }),\n async (args, ctx) => {\n if (!ctx.providerInstallMgr) {\n throw {\n code: \"provider_install_unavailable\",\n message: \"Provider install manager not configured\",\n };\n }\n\n return ctx.providerInstallMgr.start(args.providerId);\n }\n);\n\nregisterCommand(\n \"provider.install.get\",\n z.object({\n jobId: z.string(),\n }),\n async (args, ctx) => {\n if (!ctx.providerInstallMgr) {\n throw {\n code: \"provider_install_unavailable\",\n message: \"Provider install manager not configured\",\n };\n }\n\n const job = ctx.providerInstallMgr.get(args.jobId);\n if (!job) {\n throw {\n code: \"provider_install_job_not_found\",\n message: `Install job not found: ${args.jobId}`,\n };\n }\n\n return job;\n }\n);\n", "import { z } from \"zod\";\nimport { registerCommand } from \"../ws/dispatch.js\";\n\nconst supervisorObjectiveSchema = z.string().trim().min(1).max(4000);\nconst createSupervisorSchema = z\n .object({\n sessionId: z.string(),\n workspaceId: z.string(),\n objective: supervisorObjectiveSchema,\n evaluatorProviderId: z.string(),\n evaluatorModel: z.string().trim().min(1).max(200).optional(),\n maxSupervisionCount: z.number().int().min(0).max(Number.MAX_SAFE_INTEGER).optional(),\n scheduledAt: z.number().int().min(0).max(Number.MAX_SAFE_INTEGER).optional(),\n })\n .strict();\nconst updateSupervisorSchema = z\n .object({\n id: z.string(),\n objective: supervisorObjectiveSchema.optional(),\n evaluatorProviderId: z.string().optional(),\n evaluatorModel: z.string().trim().min(1).max(200).nullable().optional(),\n maxSupervisionCount: z.number().int().min(0).max(Number.MAX_SAFE_INTEGER).optional(),\n scheduledAt: z.number().int().min(0).max(Number.MAX_SAFE_INTEGER).nullable().optional(),\n })\n .strict()\n .refine(\n (input) =>\n input.objective !== undefined ||\n input.evaluatorProviderId !== undefined ||\n input.evaluatorModel !== undefined ||\n input.maxSupervisionCount !== undefined ||\n input.scheduledAt !== undefined,\n \"at least one supervisor field is required\"\n );\nconst sessionIdSchema = z.object({ sessionId: z.string() });\nconst supervisorIdSchema = z.object({ id: z.string() });\n\n// supervisor.create\nregisterCommand(\"supervisor.create\", createSupervisorSchema, async (args, ctx) => {\n return {\n supervisor: await ctx.supervisorMgr.create({\n sessionId: args.sessionId,\n workspaceId: args.workspaceId,\n objective: args.objective,\n evaluatorProviderId: args.evaluatorProviderId,\n evaluatorModel: args.evaluatorModel,\n maxSupervisionCount: args.maxSupervisionCount,\n scheduledAt: args.scheduledAt,\n }),\n };\n});\n\n// supervisor.get\nregisterCommand(\"supervisor.get\", sessionIdSchema, async (args, ctx) => {\n return { supervisor: ctx.supervisorMgr.getBySession(args.sessionId) ?? null };\n});\n\n// supervisor.update\nregisterCommand(\"supervisor.update\", updateSupervisorSchema, async (args, ctx) => {\n return {\n supervisor: await ctx.supervisorMgr.update(args.id, {\n objective: args.objective,\n evaluatorProviderId: args.evaluatorProviderId,\n evaluatorModel: args.evaluatorModel,\n maxSupervisionCount: args.maxSupervisionCount,\n scheduledAt: args.scheduledAt,\n }),\n };\n});\n\n// supervisor.delete\nregisterCommand(\"supervisor.delete\", supervisorIdSchema, async (args, ctx) => {\n await ctx.supervisorMgr.delete(args.id);\n return {};\n});\n\n// supervisor.pause\nregisterCommand(\"supervisor.pause\", supervisorIdSchema, async (args, ctx) => {\n return { supervisor: await ctx.supervisorMgr.pause(args.id) };\n});\n\n// supervisor.resume\nregisterCommand(\"supervisor.resume\", supervisorIdSchema, async (args, ctx) => {\n return { supervisor: await ctx.supervisorMgr.resume(args.id) };\n});\n\n// supervisor.trigger\nregisterCommand(\"supervisor.trigger\", supervisorIdSchema, async (args, ctx) => {\n return { cycle: await ctx.supervisorMgr.triggerEvaluation(args.id) };\n});\n", "/**\n * Git Worktree operations (Phase 3)\n *\n * Wrapper around git worktree commands.\n */\n\nimport path from \"node:path\";\nimport type { FileNode, GitStatus, WorktreeInfo } from \"@coder-studio/core\";\nimport { GitError, runGit } from \"./cli.js\";\nimport { parseStatus } from \"./status-parser.js\";\n\nfunction normalizeWorktreePath(worktreePath: string): string {\n return path.resolve(worktreePath);\n}\n\nexport async function getGitCommonDirPath(repoPath: string): Promise<string> {\n const { stdout } = await runGit(repoPath, [\"rev-parse\", \"--git-common-dir\"]);\n return normalizeWorktreePath(path.resolve(repoPath, stdout.trim()));\n}\n\nexport async function resolveWorktreePath(repoPath: string, worktreePath: string): Promise<string> {\n const normalizedRequested = normalizeWorktreePath(worktreePath);\n const worktrees = await listWorktrees(repoPath);\n const matched = worktrees.find(\n (worktree) => normalizeWorktreePath(worktree.path) === normalizedRequested\n );\n\n if (!matched) {\n throw {\n code: \"worktree_not_found\",\n message: `Worktree not found for repository: ${worktreePath}`,\n };\n }\n\n return matched.path;\n}\n\n/**\n * List all worktrees for a repository.\n *\n * @param repoPath - Path to the main repository\n * @returns Array of worktree information\n */\nexport async function listWorktrees(repoPath: string): Promise<WorktreeInfo[]> {\n try {\n const { stdout } = await runGit(repoPath, [\"worktree\", \"list\", \"--porcelain\"]);\n\n const worktrees: WorktreeInfo[] = [];\n const lines = stdout.split(\"\\n\");\n\n let current: Partial<WorktreeInfo> = {};\n\n for (const line of lines) {\n if (line.startsWith(\"worktree \")) {\n if (current.path) {\n worktrees.push(current as WorktreeInfo);\n }\n current = { path: line.substring(9) };\n } else if (line.startsWith(\"HEAD \")) {\n current.commit = line.substring(5).substring(0, 7);\n } else if (line.startsWith(\"branch \")) {\n const branch = line.substring(7);\n current.branch = branch;\n current.name = branch.split(\"/\").pop() || branch;\n } else if (line === \"detached\") {\n current.branch = \"detached HEAD\";\n } else if (line === \"\") {\n // Empty line might indicate end of record\n if (current.path) {\n // Check if dirty by running status\n worktrees.push(current as WorktreeInfo);\n current = {};\n }\n }\n }\n\n // Don't forget the last one\n if (current.path) {\n worktrees.push(current as WorktreeInfo);\n }\n\n // Check dirty status for each worktree\n for (const wt of worktrees) {\n try {\n const status = await getWorktreeStatus(wt.path);\n wt.status =\n status.staged.length > 0 ||\n status.modified.length > 0 ||\n status.untracked.length > 0 ||\n status.deleted.length > 0\n ? \"dirty\"\n : \"clean\";\n } catch {\n wt.status = \"clean\";\n }\n }\n\n return worktrees;\n } catch (error) {\n if (error instanceof GitError) {\n throw new Error(`Failed to list worktrees: ${error.message}`);\n }\n throw error;\n }\n}\n\n/**\n * Get git status for a specific worktree.\n *\n * @param worktreePath - Path to the worktree\n * @returns Git status information\n */\nexport async function getWorktreeStatus(worktreePath: string): Promise<GitStatus> {\n const { stdout } = await runGit(worktreePath, [\n \"status\",\n \"--porcelain=v2\",\n \"-z\",\n \"--branch\",\n \"--untracked-files=all\",\n ]);\n return parseStatus(stdout);\n}\n\n/**\n * Get diff for a worktree.\n *\n * @param worktreePath - Path to the worktree\n * @param staged - Whether to show staged changes\n * @returns Diff output as string\n */\nexport async function getWorktreeDiff(worktreePath: string, staged = false): Promise<string> {\n const args = [\"diff\"];\n if (staged) {\n args.push(\"--staged\");\n }\n const { stdout } = await runGit(worktreePath, args);\n return stdout;\n}\n\n/**\n * Get file tree for a worktree.\n * This is a simplified version that lists top-level files and directories.\n *\n * @param worktreePath - Path to the worktree\n * @returns File tree structure\n */\nexport async function getWorktreeTree(worktreePath: string): Promise<FileNode[]> {\n const { stdout } = await runGit(worktreePath, [\"ls-tree\", \"-l\", \"--name-only\", \"HEAD\"]);\n\n const nodes: FileNode[] = [];\n const lines = stdout.split(\"\\n\").filter(Boolean);\n\n for (const line of lines) {\n const isDir = line.endsWith(\"/\");\n const name = isDir ? line.slice(0, -1) : line;\n const path = `${worktreePath}/${name}`;\n\n nodes.push({\n name,\n path,\n kind: isDir ? \"dir\" : \"file\",\n });\n }\n\n return nodes;\n}\n\n/**\n * Create a new worktree.\n *\n * @param repoPath - Path to the main repository\n * @param branch - Branch name for the new worktree\n * @param path - Path where the worktree should be created\n * @returns The created worktree info\n */\nexport async function createWorktree(\n repoPath: string,\n branch: string,\n worktreePath: string\n): Promise<WorktreeInfo> {\n let createArgs = [\"worktree\", \"add\", worktreePath, branch];\n try {\n await runGit(repoPath, [\"rev-parse\", \"--verify\", \"--quiet\", `${branch}^{commit}`]);\n } catch (error) {\n if (error instanceof GitError) {\n createArgs = [\"worktree\", \"add\", \"-b\", branch, worktreePath];\n } else {\n throw error;\n }\n }\n\n await runGit(repoPath, createArgs);\n\n const worktrees = await listWorktrees(repoPath);\n const normalizedRequested = normalizeWorktreePath(worktreePath);\n const created = worktrees.find((wt) => normalizeWorktreePath(wt.path) === normalizedRequested);\n\n if (!created) {\n throw new Error(\"Failed to find created worktree\");\n }\n\n return created;\n}\n\n/**\n * Remove a worktree.\n *\n * @param repoPath - Path to the main repository\n * @param worktreePath - Path to the worktree to remove\n * @param force - Force removal even if there are uncommitted changes\n */\nexport async function removeWorktree(\n repoPath: string,\n worktreePath: string,\n force = false\n): Promise<void> {\n const args = [\"worktree\", \"remove\", worktreePath];\n if (force) {\n args.push(\"--force\");\n }\n await runGit(repoPath, args);\n}\n", "/**\n * Worktree Commands (Phase 3)\n */\n\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport {\n createWorktree,\n getGitCommonDirPath,\n getWorktreeDiff,\n getWorktreeStatus,\n getWorktreeTree,\n listWorktrees,\n removeWorktree,\n resolveWorktreePath,\n} from \"../git/worktree.js\";\nimport type { CommandContext } from \"../ws/dispatch.js\";\nimport { registerCommand } from \"../ws/dispatch.js\";\nimport { emitGitStateChanged } from \"./git-events.js\";\n\nasync function findRelatedWorkspaceIds(\n ctx: CommandContext,\n workspacePath: string\n): Promise<string[]> {\n const targetCommonDir = await getGitCommonDirPath(workspacePath);\n const relatedWorkspaceIds = await Promise.all(\n ctx.workspaceMgr.list().map(async (workspace) => {\n try {\n const commonDir = await getGitCommonDirPath(workspace.path);\n return commonDir === targetCommonDir ? workspace.id : null;\n } catch {\n return null;\n }\n })\n );\n\n return relatedWorkspaceIds.filter((workspaceId): workspaceId is string => Boolean(workspaceId));\n}\n\nfunction emitWorktreeChangedForWorkspaceIds(ctx: CommandContext, workspaceIds: string[]) {\n for (const workspaceId of workspaceIds) {\n if (!ctx.workspaceMgr.get(workspaceId)) {\n continue;\n }\n emitGitStateChanged(ctx, workspaceId, { worktreeChanged: true });\n }\n}\n\nfunction isWorkspaceOpenForPath(ctx: CommandContext, workspacePath: string): boolean {\n const targetPath = path.resolve(workspacePath);\n return ctx.workspaceMgr\n .list()\n .some((openWorkspace) => path.resolve(openWorkspace.path) === targetPath);\n}\n\n// worktree.list\nregisterCommand(\"worktree.list\", z.object({ workspaceId: z.string() }), async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n return { worktrees: await listWorktrees(workspace.path) };\n});\n\n// worktree.status\nregisterCommand(\n \"worktree.status\",\n z.object({ workspaceId: z.string(), worktreePath: z.string() }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n const worktreePath = await resolveWorktreePath(workspace.path, args.worktreePath);\n return { status: await getWorktreeStatus(worktreePath) };\n }\n);\n\n// worktree.diff\nregisterCommand(\n \"worktree.diff\",\n z.object({\n workspaceId: z.string(),\n worktreePath: z.string(),\n staged: z.boolean().optional().default(false),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n const worktreePath = await resolveWorktreePath(workspace.path, args.worktreePath);\n return { diff: await getWorktreeDiff(worktreePath, args.staged) };\n }\n);\n\n// worktree.tree\nregisterCommand(\n \"worktree.tree\",\n z.object({ workspaceId: z.string(), worktreePath: z.string() }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n const worktreePath = await resolveWorktreePath(workspace.path, args.worktreePath);\n return { tree: await getWorktreeTree(worktreePath) };\n }\n);\n\n// worktree.create\nregisterCommand(\n \"worktree.create\",\n z.object({\n workspaceId: z.string(),\n branch: z.string(),\n path: z.string(),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n const relatedWorkspaceIds = await findRelatedWorkspaceIds(ctx, workspace.path);\n const worktree = await createWorktree(workspace.path, args.branch, args.path);\n emitWorktreeChangedForWorkspaceIds(ctx, relatedWorkspaceIds);\n return { worktree };\n }\n);\n\n// worktree.remove\nregisterCommand(\n \"worktree.remove\",\n z.object({\n workspaceId: z.string(),\n worktreePath: z.string(),\n force: z.boolean().optional().default(false),\n }),\n async (args, ctx) => {\n const workspace = ctx.workspaceMgr.get(args.workspaceId);\n if (!workspace) {\n throw { code: \"workspace_not_found\", message: `Workspace not found: ${args.workspaceId}` };\n }\n\n const relatedWorkspaceIds = await findRelatedWorkspaceIds(ctx, workspace.path);\n const worktreePath = await resolveWorktreePath(workspace.path, args.worktreePath);\n if (isWorkspaceOpenForPath(ctx, worktreePath)) {\n throw {\n code: \"worktree_in_use\",\n message: `Cannot remove an open worktree workspace: ${worktreePath}`,\n };\n }\n\n await removeWorktree(workspace.path, worktreePath, args.force);\n emitWorktreeChangedForWorkspaceIds(ctx, relatedWorkspaceIds);\n return {};\n }\n);\n", "/**\n * Fencing command handlers (Phase 3)\n */\n\nimport type { FastifyRequest } from \"fastify\";\nimport { z } from \"zod\";\nimport { registerCommand } from \"../ws/dispatch.js\";\n\nfunction createMockFencingRequest(): FastifyRequest {\n return {\n ip: \"127.0.0.1\",\n headers: { \"user-agent\": \"coder-studio-client\" },\n } as unknown as FastifyRequest;\n}\n\n// fencing.request - Request controller status\nregisterCommand(\n \"fencing.request\",\n z.object({\n workspaceId: z.string(),\n tabId: z.string(),\n }),\n async (args, ctx, clientId) => {\n // Note: in Phase 1, request.ip/userAgent come from WsHub connection\n // For now, use placeholder \u2014 will be refined when WsHub integration is done\n return ctx.fencingMgr.requestControl(\n args.workspaceId,\n clientId!,\n args.tabId,\n createMockFencingRequest()\n );\n }\n);\n\n// fencing.heartbeat - Send heartbeat\nregisterCommand(\n \"fencing.heartbeat\",\n z.object({ workspaceId: z.string() }),\n async (args, ctx, clientId) => {\n const success = ctx.fencingMgr.heartbeat(args.workspaceId, clientId!);\n return { success };\n }\n);\n\n// fencing.release - Release controller status\nregisterCommand(\n \"fencing.release\",\n z.object({ workspaceId: z.string() }),\n async (args, ctx, clientId) => {\n ctx.fencingMgr.release(args.workspaceId, clientId!);\n return {};\n }\n);\n\n// fencing.status - Get current controller status\nregisterCommand(\"fencing.status\", z.object({ workspaceId: z.string() }), async (args, ctx) => {\n const controller = ctx.fencingMgr.getController(args.workspaceId);\n const isUnresponsive = ctx.fencingMgr.isControllerUnresponsive(args.workspaceId);\n return {\n isController: controller != null,\n controller: controller ? { tabId: controller.tabId, issuedAt: controller.issuedAt } : null,\n isUnresponsive,\n };\n});\n\n// fencing.takeover - Force takeover when controller is unresponsive\nregisterCommand(\n \"fencing.takeover\",\n z.object({\n workspaceId: z.string(),\n tabId: z.string(),\n }),\n async (args, ctx, clientId) => {\n return ctx.fencingMgr.forceTakeover(\n args.workspaceId,\n clientId!,\n args.tabId,\n createMockFencingRequest()\n );\n }\n);\n", "/**\n * Command handlers\n *\n * This file imports all command handlers to register them with the dispatch system.\n */\n\nimport \"./workspace.js\";\nimport \"./workspace-activity.js\";\nimport \"./activation.js\";\nimport \"./connection.js\";\nimport \"./session.js\";\nimport \"./terminal.js\";\nimport \"./file.js\";\nimport \"./git.js\";\nimport \"./settings.js\";\nimport \"./provider.js\";\nimport \"./supervisor.js\";\nimport \"./worktree.js\";\nimport \"./fencing.js\";\n", "/**\n * Server Entry Point\n *\n * Creates and assembles all server components.\n */\nimport {\n deleteRuntimeConfig,\n getRuntimePath,\n type RuntimeConfig,\n writeRuntimeConfig,\n} from \"@coder-studio/core/runtime\";\nimport { providerRegistry } from \"@coder-studio/providers\";\nimport { isDirectExecution } from \"@coder-studio/utils\";\nimport type { FastifyInstance } from \"fastify\";\nimport { buildFastifyApp } from \"./app.js\";\nimport { EventBus } from \"./bus/event-bus.js\";\nimport { ensureDataDir, parseServerConfig, type ServerConfig } from \"./config.js\";\nimport { AutoFetchScheduler } from \"./git/auto-fetch.js\";\nimport { runCommandAsString } from \"./provider-runtime/command-runner.js\";\nimport { createE2EProviderMockOverrides } from \"./provider-runtime/e2e-provider-mock.js\";\nimport { ProviderInstallManager } from \"./provider-runtime/install-manager.js\";\nimport type { RuntimeStatusDeps } from \"./provider-runtime/runtime-status.js\";\nimport { SessionManager } from \"./session/manager.js\";\nimport type { Database } from \"./storage/database.js\";\nimport { openDatabase } from \"./storage/db.js\";\nimport { AuthLoginBlockRepo } from \"./storage/repositories/auth-login-block-repo.js\";\nimport { AuthSessionRepo } from \"./storage/repositories/auth-session-repo.js\";\nimport { ProviderConfigRepo } from \"./storage/repositories/provider-config-repo.js\";\nimport { rowToSession, type SessionRow } from \"./storage/repositories/session-repo.js\";\nimport { SettingsRepo } from \"./storage/repositories/settings-repo.js\";\nimport { SupervisorCycleAttemptRepo } from \"./storage/repositories/supervisor-cycle-attempt-repo.js\";\nimport { SupervisorCycleRepo } from \"./storage/repositories/supervisor-cycle-repo.js\";\nimport { SupervisorRepo } from \"./storage/repositories/supervisor-repo.js\";\nimport { SupervisorManager } from \"./supervisor/manager.js\";\nimport * as targetStore from \"./supervisor/target-store.js\";\nimport { TerminalManager } from \"./terminal/manager.js\";\nimport { NodePtyHost } from \"./terminal/pty-host.js\";\nimport type { TerminalDatabase } from \"./terminal/types.js\";\nimport { deleteWorkspaceUploads, runStartupGc } from \"./uploads/cleanup.js\";\nimport { STARTUP_GC_DELAY_MS } from \"./uploads/constants.js\";\nimport { WorkspaceManager } from \"./workspace/manager.js\";\nimport { ActivationManager } from \"./ws/activation.js\";\nimport type { CommandContext } from \"./ws/dispatch.js\";\nimport { dispatch } from \"./ws/dispatch.js\";\nimport { FencingManager } from \"./ws/fencing.js\";\nimport { WsHub } from \"./ws/hub.js\";\n\nimport \"./commands/index.js\";\n\nconst WS_KEEPALIVE_INTERVAL_MS = 15_000;\n\nexport interface Server {\n app: FastifyInstance;\n stop: () => Promise<void>;\n __test__?: { sessionMgr: SessionManager; commandContext: CommandContext };\n}\n\nexport interface ServerRuntimeOptions {\n writeRuntimeConfig?: boolean;\n}\n\nexport async function createServer(\n configOverrides?: Partial<ServerConfig> & ServerRuntimeOptions\n): Promise<Server> {\n const config = parseServerConfig(configOverrides);\n\n ensureDataDir(config);\n\n const db = openDatabase(config.dataDir);\n const eventBus = new EventBus();\n const activationMgr = new ActivationManager();\n const fencingMgr = new FencingManager();\n const wsHub = new WsHub({ eventBus, commandContext: null, config, fencingMgr });\n let workspaceMgr: WorkspaceManager;\n let commandContext: CommandContext;\n\n const terminalMgr = new TerminalManager({\n ptyHost: createPtyHost(),\n eventBus,\n db: createTerminalDatabase(db),\n });\n\n const settingsRepo = new SettingsRepo(db);\n const autoFetch = new AutoFetchScheduler({\n workspaceMgr: { get: (workspaceId) => workspaceMgr.get(workspaceId) },\n eventBus,\n settingsRepo,\n runFetch: async (workspaceId) => {\n if (!workspaceMgr.get(workspaceId)) {\n return;\n }\n\n const result = await dispatch(\n {\n kind: \"command\",\n id: `auto-fetch:${workspaceId}:${Date.now()}`,\n op: \"git.fetch\",\n args: {\n workspaceId,\n background: true,\n },\n },\n commandContext\n );\n\n if (!result.ok) {\n throw new Error(result.error?.message ?? \"Background fetch failed\");\n }\n\n const data = result.data as { success?: boolean; message?: string };\n if (data.success === false) {\n throw new Error(data.message ?? \"Background fetch failed\");\n }\n },\n });\n\n const sessionDb = createSessionDatabase(db);\n const providerConfigRepo = new ProviderConfigRepo(db);\n const sessionMgr = new SessionManager({\n terminalMgr,\n eventBus,\n db: sessionDb,\n broadcaster: wsHub,\n providerRegistry,\n providerConfigRepo,\n });\n\n let supervisorMgr: SupervisorManager | undefined;\n\n workspaceMgr = new WorkspaceManager({\n db,\n eventBus,\n broadcaster: wsHub,\n autoFetch,\n teardown: async (workspaceId) => {\n await supervisorMgr?.deleteForWorkspace(workspaceId);\n await sessionMgr.stopForWorkspace(workspaceId);\n await terminalMgr.closeForWorkspace(workspaceId);\n sessionMgr.deleteEndedForWorkspace(workspaceId);\n },\n onClose: (workspaceId) =>\n deleteWorkspaceUploads(config.uploadsDir, workspaceId).catch((err) =>\n console.warn(\"[uploads] cascade cleanup failed\", { wsId: workspaceId, err })\n ),\n });\n workspaceMgr.hydrateWatchers();\n\n const authSessionRepo = new AuthSessionRepo(db);\n const authLoginBlockRepo = new AuthLoginBlockRepo(db);\n\n const app = await buildFastifyApp({\n wsHub,\n db,\n workspaceMgr,\n webRoot: config.webRoot,\n config,\n authSessionRepo,\n authLoginBlockRepo,\n logger: {\n level: \"info\",\n transport: {\n target: \"pino-pretty\",\n options: {\n translateTime: \"HH:MM:ss Z\",\n ignore: \"pid,hostname\",\n },\n },\n },\n });\n\n wsHub.setLogger(app.log);\n\n const supervisorRepo = new SupervisorRepo(db);\n const cycleRepo = new SupervisorCycleRepo(db);\n const cycleAttemptRepo = new SupervisorCycleAttemptRepo(db);\n supervisorMgr = new SupervisorManager({\n eventBus,\n broadcaster: wsHub,\n terminalMgr,\n workspaceMgr,\n sessionMgr,\n providerRegistry,\n providerConfigRepo,\n settingsRepo,\n supervisorRepo,\n cycleRepo,\n cycleAttemptRepo,\n targetStore,\n logger: app.log,\n });\n await sessionMgr.hydrate();\n await supervisorMgr.hydrate();\n\n const providerMockOverrides = createE2EProviderMockOverrides();\n const providerRuntimeDeps: RuntimeStatusDeps = providerMockOverrides\n ? {\n commandExists: providerMockOverrides.commandExists,\n }\n : {};\n const providerInstallMgr = new ProviderInstallManager(providerRegistry, {\n ...providerRuntimeDeps,\n runCommand: providerMockOverrides?.runCommand ?? runCommandAsString,\n });\n\n commandContext = {\n workspaceMgr,\n sessionMgr,\n terminalMgr,\n eventBus,\n broadcaster: wsHub,\n db,\n providerRegistry,\n fencingMgr,\n supervisorMgr,\n autoFetch,\n providerRuntimeDeps,\n providerInstallMgr,\n activationMgr,\n };\n\n wsHub.setCommandContext(commandContext);\n\n await app.listen({\n host: config.host,\n port: config.port,\n });\n\n if (configOverrides?.writeRuntimeConfig ?? process.env.NODE_ENV === \"production\") {\n const runtime: RuntimeConfig = {\n host: config.host,\n port: extractListenPort(app) ?? config.port,\n pid: process.pid,\n token: `server-${process.pid}`,\n serverInstanceId: `server-${process.pid}`,\n startedAt: Date.now(),\n };\n process.env.CODER_STUDIO_RUNTIME_JSON_PATH = getRuntimePath();\n writeRuntimeConfig(runtime);\n }\n\n const gcTimer = setTimeout(() => {\n runStartupGc(config.uploadsDir, app.log).catch((err) =>\n app.log.warn({ err }, \"startup GC failed\")\n );\n }, STARTUP_GC_DELAY_MS);\n gcTimer.unref();\n\n const wsKeepaliveTimer = setInterval(() => {\n wsHub.pingAll();\n }, WS_KEEPALIVE_INTERVAL_MS);\n wsKeepaliveTimer.unref();\n\n let stopped = false;\n const stopServer = async () => {\n if (stopped) return;\n stopped = true;\n\n clearTimeout(gcTimer);\n clearInterval(wsKeepaliveTimer);\n await app.close();\n autoFetch.stop();\n supervisorMgr.stop();\n terminalMgr.shutdown();\n wsHub.destroy();\n eventBus.clear();\n deleteRuntimeConfig();\n db.close();\n };\n\n const actualPort = extractListenPort(app) ?? config.port;\n console.log(`Server listening on http://${config.host}:${actualPort}`);\n\n return {\n app,\n stop: stopServer,\n __test__: { sessionMgr, commandContext },\n };\n}\n\nfunction extractListenPort(app: FastifyInstance): number | undefined {\n const address = app.server.address();\n if (address && typeof address === \"object\" && typeof address.port === \"number\") {\n return address.port;\n }\n return undefined;\n}\n\nfunction createPtyHost() {\n return new NodePtyHost();\n}\n\nfunction createTerminalDatabase(db: Database): TerminalDatabase {\n return {\n insert: (terminal) => {\n db.prepare(`\n INSERT INTO terminals (id, workspace_id, kind, title, cwd, argv, cols, rows, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n `).run(\n terminal.id,\n terminal.workspaceId,\n terminal.kind,\n terminal.title,\n terminal.cwd,\n JSON.stringify(terminal.argv),\n terminal.cols,\n terminal.rows,\n terminal.createdAt\n );\n },\n markEnded: (id: string, endedAt: number, exitCode: number) => {\n db.prepare(`\n UPDATE terminals SET ended_at = ?, exit_code = ? WHERE id = ?\n `).run(endedAt, exitCode, id);\n },\n };\n}\n\nfunction createSessionDatabase(db: Database) {\n return {\n insert: (session: SessionRow) => {\n db.prepare(`\n INSERT INTO sessions (id, workspace_id, terminal_id, provider_id, state, capability, started_at, last_active_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n `).run(\n session.id,\n session.workspace_id,\n session.terminal_id,\n session.provider_id,\n session.state,\n session.capability,\n session.started_at,\n session.last_active_at\n );\n },\n update: (id: string, patch: Record<string, unknown>) => {\n const keys = Object.keys(patch);\n if (keys.length === 0) return;\n\n const allowedCols = new Set([\n \"terminal_id\",\n \"state\",\n \"started_at\",\n \"ended_at\",\n \"completion_percent\",\n \"error_reason\",\n \"last_active_at\",\n \"title\",\n ]);\n\n const setClauses: string[] = [];\n const values: unknown[] = [];\n for (const key of keys) {\n const col = key.replace(/([A-Z])/g, \"_$1\").toLowerCase();\n if (!allowedCols.has(col)) continue;\n setClauses.push(`${col} = ?`);\n values.push(patch[key]);\n }\n if (setClauses.length === 0) return;\n\n db.prepare(`UPDATE sessions SET ${setClauses.join(\", \")} WHERE id = ?`).run(\n ...(values as Array<string | number | bigint | Uint8Array | null>),\n id\n );\n },\n findById: (id: string) => {\n const row = db.prepare(\"SELECT * FROM sessions WHERE id = ?\").get(id) as\n | SessionRow\n | undefined;\n return row ? rowToSession(row) : undefined;\n },\n findByWorkspaceId: (workspaceId: string) => {\n const rows = db\n .prepare(\"SELECT * FROM sessions WHERE workspace_id = ? ORDER BY started_at DESC\")\n .all(workspaceId) as unknown as SessionRow[];\n return rows.map(rowToSession);\n },\n listHydratable: () => {\n const rows = db\n .prepare(\n \"SELECT * FROM sessions WHERE archived = 0 AND ended_at IS NULL ORDER BY started_at DESC\"\n )\n .all() as unknown as SessionRow[];\n return rows.map(rowToSession);\n },\n delete: (id: string) => {\n db.prepare(\"DELETE FROM sessions WHERE id = ?\").run(id);\n },\n };\n}\n\nif (isDirectExecution(import.meta.url)) {\n const server = await createServer();\n\n process.on(\"SIGINT\", async () => {\n console.log(\"\\nShutting down...\");\n await server.stop();\n process.exit(0);\n });\n\n process.on(\"SIGTERM\", async () => {\n console.log(\"\\nShutting down...\");\n await server.stop();\n process.exit(0);\n });\n}\n", "import type { Terminal } from \"@coder-studio/core\";\nimport type { Database } from \"../database.js\";\n\n/**\n * Database row representation for Terminal table\n */\nexport interface TerminalRow {\n id: string;\n workspace_id: string;\n kind: \"agent\" | \"shell\";\n cwd: string;\n argv: string; // JSON string\n env: string | null; // JSON string\n title: string | null;\n cols: number;\n rows: number;\n created_at: number;\n ended_at: number | null;\n exit_code: number | null;\n}\n\n/**\n * Input type for creating a new terminal\n */\nexport interface NewTerminal {\n id: string;\n workspaceId: string;\n kind: \"agent\" | \"shell\";\n cwd: string;\n argv: string[];\n env?: Record<string, string>;\n title?: string;\n cols: number;\n rows: number;\n createdAt: number;\n}\n\n/**\n * Terminal repository for CRUD operations\n */\nexport class TerminalRepo {\n constructor(private db: Database) {}\n\n /**\n * Lists all terminals for a workspace\n */\n listByWorkspace(workspaceId: string): Terminal[] {\n const rows = this.db\n .prepare(\"SELECT * FROM terminals WHERE workspace_id = ? ORDER BY created_at DESC\")\n .all(workspaceId) as unknown as TerminalRow[];\n return rows.map((row) => this.rowToTerminal(row));\n }\n\n /**\n * Finds a terminal by ID\n */\n findById(id: string): Terminal | undefined {\n const row = this.db.prepare(\"SELECT * FROM terminals WHERE id = ?\").get(id) as\n | TerminalRow\n | undefined;\n return row ? this.rowToTerminal(row) : undefined;\n }\n\n /**\n * Lists all active (non-ended) terminals for a workspace\n */\n listActiveByWorkspace(workspaceId: string): Terminal[] {\n const rows = this.db\n .prepare(\n \"SELECT * FROM terminals WHERE workspace_id = ? AND ended_at IS NULL ORDER BY created_at DESC\"\n )\n .all(workspaceId) as unknown as TerminalRow[];\n return rows.map((row) => this.rowToTerminal(row));\n }\n\n /**\n * Creates a new terminal\n */\n create(terminal: NewTerminal): Terminal {\n const stmt = this.db.prepare(`\n INSERT INTO terminals (id, workspace_id, kind, cwd, argv, env, title, cols, rows, created_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `);\n\n stmt.run(\n terminal.id,\n terminal.workspaceId,\n terminal.kind,\n terminal.cwd,\n JSON.stringify(terminal.argv),\n terminal.env ? JSON.stringify(terminal.env) : null,\n terminal.title ?? null,\n terminal.cols,\n terminal.rows,\n terminal.createdAt\n );\n\n return this.findById(terminal.id)!;\n }\n\n /**\n * Marks a terminal as ended\n */\n markEnded(id: string, endedAt: number, exitCode: number): void {\n const stmt = this.db.prepare(\"UPDATE terminals SET ended_at = ?, exit_code = ? WHERE id = ?\");\n stmt.run(endedAt, exitCode, id);\n }\n\n /**\n * Updates terminal dimensions\n */\n updateDimensions(id: string, cols: number, rows: number): void {\n const stmt = this.db.prepare(\"UPDATE terminals SET cols = ?, rows = ? WHERE id = ?\");\n stmt.run(cols, rows, id);\n }\n\n /**\n * Updates terminal title\n */\n updateTitle(id: string, title: string): void {\n const stmt = this.db.prepare(\"UPDATE terminals SET title = ? WHERE id = ?\");\n stmt.run(title, id);\n }\n\n /**\n * Deletes a terminal by ID\n */\n delete(id: string): void {\n const stmt = this.db.prepare(\"DELETE FROM terminals WHERE id = ?\");\n stmt.run(id);\n }\n\n /**\n * Converts a database row to a Terminal domain object\n */\n private rowToTerminal(row: TerminalRow): Terminal {\n return {\n id: row.id,\n workspaceId: row.workspace_id,\n kind: row.kind,\n cwd: row.cwd,\n argv: JSON.parse(row.argv) as string[],\n cols: row.cols,\n rows: row.rows,\n alive: row.ended_at === null,\n createdAt: row.created_at,\n endedAt: row.ended_at ?? undefined,\n exitCode: row.exit_code ?? undefined,\n title: row.title ?? \"\",\n env: row.env ? (JSON.parse(row.env) as Record<string, string>) : undefined,\n };\n }\n}\n", "import type { UiState, Workspace } from \"@coder-studio/core\";\nimport type { Database } from \"../database.js\";\n\n/**\n * Database row representation for Workspace table\n */\nexport interface WorkspaceRow {\n id: string;\n path: string;\n target_runtime: \"native\" | \"wsl\";\n wsl_distro: string | null;\n opened_at: number;\n last_active_at: number;\n ui_state: string; // JSON string\n}\n\n/**\n * Input type for creating a new workspace\n */\nexport interface NewWorkspace {\n id: string;\n path: string;\n targetRuntime: \"native\" | \"wsl\";\n wslDistro?: string;\n openedAt: number;\n lastActiveAt: number;\n uiState: UiState;\n}\n\n/**\n * Workspace repository for CRUD operations\n */\nexport class WorkspaceRepo {\n constructor(private db: Database) {}\n\n /**\n * Lists all workspaces\n */\n list(): Workspace[] {\n const rows = this.db.prepare(\"SELECT * FROM workspaces\").all() as unknown as WorkspaceRow[];\n return rows.map((row) => this.rowToWorkspace(row));\n }\n\n /**\n * Finds a workspace by ID\n */\n findById(id: string): Workspace | undefined {\n const row = this.db.prepare(\"SELECT * FROM workspaces WHERE id = ?\").get(id) as\n | WorkspaceRow\n | undefined;\n return row ? this.rowToWorkspace(row) : undefined;\n }\n\n /**\n * Finds a workspace by path\n */\n findByPath(path: string): Workspace | undefined {\n const row = this.db.prepare(\"SELECT * FROM workspaces WHERE path = ?\").get(path) as\n | WorkspaceRow\n | undefined;\n return row ? this.rowToWorkspace(row) : undefined;\n }\n\n /**\n * Creates a new workspace\n */\n create(workspace: NewWorkspace): Workspace {\n const stmt = this.db.prepare(`\n INSERT INTO workspaces (id, path, target_runtime, wsl_distro, opened_at, last_active_at, ui_state)\n VALUES (?, ?, ?, ?, ?, ?, ?)\n `);\n\n stmt.run(\n workspace.id,\n workspace.path,\n workspace.targetRuntime,\n workspace.wslDistro ?? null,\n workspace.openedAt,\n workspace.lastActiveAt,\n JSON.stringify(workspace.uiState)\n );\n\n return this.findById(workspace.id)!;\n }\n\n /**\n * Updates the UI state for a workspace\n */\n updateUiState(id: string, uiState: UiState): void {\n const stmt = this.db.prepare(\"UPDATE workspaces SET ui_state = ? WHERE id = ?\");\n stmt.run(JSON.stringify(uiState), id);\n }\n\n /**\n * Updates the last active timestamp for a workspace\n */\n updateLastActive(id: string, lastActiveAt: number): void {\n const stmt = this.db.prepare(\"UPDATE workspaces SET last_active_at = ? WHERE id = ?\");\n stmt.run(lastActiveAt, id);\n }\n\n /**\n * Deletes a workspace by ID\n */\n delete(id: string): void {\n const stmt = this.db.prepare(\"DELETE FROM workspaces WHERE id = ?\");\n stmt.run(id);\n }\n\n /**\n * Converts a database row to a Workspace domain object\n */\n private rowToWorkspace(row: WorkspaceRow): Workspace {\n return {\n id: row.id,\n path: row.path,\n targetRuntime: row.target_runtime,\n wslDistro: row.wsl_distro ?? undefined,\n openedAt: row.opened_at,\n lastActiveAt: row.last_active_at,\n uiState: JSON.parse(row.ui_state) as UiState,\n };\n }\n}\n", "export { type Database, withTransaction } from \"./database.js\";\nexport { closeDatabase, openDatabase } from \"./db.js\";\nexport {\n type AuthLoginBlockRecord,\n AuthLoginBlockRepo,\n} from \"./repositories/auth-login-block-repo.js\";\nexport { ProviderConfigRepo } from \"./repositories/provider-config-repo.js\";\nexport {\n type NewSession,\n rowToSession,\n SessionRepo,\n type SessionRow,\n sessionToRow,\n} from \"./repositories/session-repo.js\";\nexport { SettingsRepo } from \"./repositories/settings-repo.js\";\nexport {\n type NewSupervisorCycleAttempt,\n SupervisorCycleAttemptRepo,\n type SupervisorCycleAttemptUpdatePatch,\n} from \"./repositories/supervisor-cycle-attempt-repo.js\";\nexport {\n SupervisorCycleRepo,\n type SupervisorCycleUpdatePatch,\n} from \"./repositories/supervisor-cycle-repo.js\";\nexport {\n type NewSupervisor,\n SupervisorRepo,\n type SupervisorUpdatePatch,\n} from \"./repositories/supervisor-repo.js\";\nexport { type NewTerminal, TerminalRepo, type TerminalRow } from \"./repositories/terminal-repo.js\";\nexport {\n type NewWorkspace,\n WorkspaceRepo,\n type WorkspaceRow,\n} from \"./repositories/workspace-repo.js\";\n", "// Terminal module exports\n\nexport { ActiveTerminal } from \"./active-terminal\";\nexport { TerminalManager } from \"./manager\";\nexport { NodePtyHost } from \"./pty-host\";\nexport { RingBuffer } from \"./ring-buffer\";\nexport type {\n Broadcaster,\n PtyHost,\n PtyProcess,\n PtySpawnOptions,\n ReplayResult,\n TerminalDatabase,\n TerminalId,\n TerminalSpec,\n} from \"./types\";\nexport { TerminalNotAliveError, TerminalSpawnError } from \"./types\";\n", "export * from \"./auth/index.js\";\nexport { EventBus } from \"./bus/event-bus.js\";\nexport { parseServerConfig, type ServerConfig } from \"./config.js\";\nexport type { Server } from \"./server.js\";\n// Server entry point\nexport { createServer } from \"./server.js\";\nexport * from \"./storage/index.js\";\nexport * from \"./terminal/index.js\";\nexport { type Broadcaster, WsHub } from \"./ws/hub.js\";\n", "import { existsSync, rmSync } from \"fs\";\nimport { dirname, join } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { clearAuthBlockByIp, listAuthBlocks } from \"./auth-control.js\";\nimport { openBrowser } from \"./browser.js\";\nimport { type CliConfig, readCliConfig, writeCliConfig } from \"./config-store.js\";\nimport { readLogExcerpt } from \"./log-excerpt.js\";\nimport { assertSupportedNodeVersion } from \"./node-version.js\";\nimport { getCliVersion } from \"./package-manifest.js\";\nimport { parseArgs } from \"./parse-args.js\";\nimport { startManagedServer } from \"./pm2-control.js\";\nimport { confirmYesNo, isInteractiveSession } from \"./prompts.js\";\nimport { getServerStatus, type ServerStatus, stopRunningServer } from \"./server-control.js\";\nimport { startServer, verifyLocalDatabaseCompatibility } from \"./server-runner.js\";\nimport { getBrowserUrl, getListenIp, getListenUrl } from \"./server-url.js\";\n\nconst MANAGED_SERVER_WAIT_MS = 5000;\nconst DEFAULT_LOG_TAIL_LINES = 40;\n\nfunction formatConfig(config: CliConfig | null): string {\n return JSON.stringify(config ?? {}, null, 2);\n}\n\nfunction formatStatus(status: ServerStatus): string {\n const listenUrl = getListenUrl(status) ?? \"n/a\";\n const browserUrl = getBrowserUrl(status) ?? \"n/a\";\n const startedAt = status.startedAt === null ? \"n/a\" : new Date(status.startedAt).toISOString();\n\n return [\n `Status: ${status.status}`,\n `Listen host: ${status.host ?? \"n/a\"}`,\n `Listen IP: ${getListenIp(status) ?? \"n/a\"}`,\n `Port: ${status.port ?? \"n/a\"}`,\n `Listen URL: ${listenUrl}`,\n `Local URL: ${browserUrl}`,\n `PID: ${status.pid ?? \"n/a\"}`,\n `Started: ${startedAt}`,\n `Restarts: ${status.restartCount}`,\n `Out log: ${status.outFile}`,\n `Error log: ${status.errFile}`,\n ].join(\"\\n\");\n}\n\nfunction showLogs(\n status: ServerStatus,\n {\n tail = DEFAULT_LOG_TAIL_LINES,\n errorsOnly = false,\n }: { tail?: number; errorsOnly?: boolean } = {}\n): void {\n const paths = errorsOnly ? [status.errFile] : [status.outFile, status.errFile];\n const contents = paths\n .filter((path, index, paths) => paths.indexOf(path) === index)\n .flatMap((path) => {\n const content = readLogExcerpt(path, { maxLines: tail, maxChars: null });\n return content ? [content] : [];\n });\n\n console.log(contents.length === 0 ? \"No logs available.\" : contents.join(\"\\n\"));\n}\n\nfunction showHelp(): void {\n console.log(`\n@spencer-kit/coder-studio - Coder Studio CLI\n\nUSAGE:\n coder-studio [COMMAND]\n\nCOMMANDS:\n serve Start the Coder Studio server in background (default)\n server Alias for serve\n open Start the server if needed and open Coder Studio in a browser\n auth Manage auth login blocks in local server storage\n config Persist CLI host/port/data-dir/password settings\n stop Stop the managed Coder Studio server\n status Show the managed server status\n logs Show the managed server logs\n help Show this help message\n version Show version\n\nOPTIONS:\n --host <string> Save server host for future runs\n --port, -p <number> Save server port for future runs\n --data-dir, -d <path> Save data directory for future runs\n --password <string> Save auth password for future runs\n --restart Restart an already running managed server for serve/open\n --help Show help\n --version, -v Show version\n\nEXAMPLES:\n coder-studio\n coder-studio serve\n coder-studio server\n coder-studio auth ban-list\n coder-studio auth unblock --ip 198.51.100.24\n coder-studio serve --foreground\n coder-studio serve --restart\n coder-studio open\n coder-studio open --restart\n coder-studio status\n coder-studio logs\n coder-studio stop\n coder-studio config --host 0.0.0.0 --port 8080\n`);\n}\n\nfunction showConfigHelp(): void {\n console.log(`\n@spencer-kit/coder-studio - config\n\nUSAGE:\n coder-studio config [OPTIONS]\n coder-studio config help\n\nBEHAVIOR:\n Without options, prints the current saved config.\n Bare serve reads this saved config for future runs.\n\nOPTIONS:\n --host <string> Save server host for future runs\n --port, -p <number> Save server port for future runs\n --data-dir, -d <path> Save data directory for future runs\n --password <string> Save auth password for future runs\n --help Show config help\n\nEXAMPLES:\n coder-studio config\n coder-studio config --host 0.0.0.0\n coder-studio config --port 8080\n coder-studio config --data-dir /tmp/cs-data\n coder-studio config --password sekrit\n coder-studio config --host 0.0.0.0 --port 8080\n`);\n}\n\nfunction showVersion(): void {\n console.log(`@spencer-kit/coder-studio v${getCliVersion(import.meta.url)}`);\n}\n\nfunction formatAuthBlocks(blocks: Awaited<ReturnType<typeof listAuthBlocks>>): string {\n if (blocks.length === 0) {\n return \"No blocked IPs.\";\n }\n\n return JSON.stringify(blocks, null, 2);\n}\n\nfunction resolveManagedScriptPath(): string {\n const currentFile = fileURLToPath(import.meta.url);\n const currentDir = dirname(currentFile);\n const candidates = [\n join(currentDir, \"server-runner.js\"),\n join(currentDir, \"server-runner.mjs\"),\n join(currentDir, \"../src/server-runner.ts\"),\n ];\n\n const scriptPath = candidates.find((candidate) => existsSync(candidate));\n if (!scriptPath) {\n throw new Error(\"Unable to locate the managed server entry script\");\n }\n\n return scriptPath;\n}\n\nfunction isRunningStatus(status: ServerStatus): boolean {\n return status.status === \"running\" || status.status === \"starting\";\n}\n\ninterface ManagedStartupDecision {\n existingStatus: ServerStatus | null;\n restartRequested: boolean;\n}\n\nasync function shouldRestartRunningServer(status: ServerStatus): Promise<boolean> {\n const currentUrl = getBrowserUrl(status) ?? getListenUrl(status) ?? \"the existing server\";\n\n if (!isInteractiveSession()) {\n return false;\n }\n\n return confirmYesNo(`Coder Studio is already running at ${currentUrl}. Restart it? [y/N] `);\n}\n\nasync function prepareManagedStartup(forceRestart = false): Promise<ManagedStartupDecision> {\n const status = await getServerStatus();\n if (!isRunningStatus(status)) {\n return {\n existingStatus: null,\n restartRequested: false,\n };\n }\n\n const restart = forceRestart ? true : await shouldRestartRunningServer(status);\n if (!restart) {\n const currentUrl = getBrowserUrl(status) ?? getListenUrl(status) ?? \"n/a\";\n if (!isInteractiveSession()) {\n console.log(\n `Coder Studio is already running at ${currentUrl}. Service already exists and was not restarted.`\n );\n } else {\n console.log(`Leaving the existing Coder Studio server running at ${currentUrl}.`);\n }\n return {\n existingStatus: status,\n restartRequested: false,\n };\n }\n\n console.log(\"Restarting the managed Coder Studio server...\");\n return {\n existingStatus: null,\n restartRequested: true,\n };\n}\n\nasync function startManagedServerFlow(): Promise<void> {\n await startManagedServer({\n script: resolveManagedScriptPath(),\n cwd: process.cwd(),\n waitMs: MANAGED_SERVER_WAIT_MS,\n });\n}\n\ninterface IncompatibleSchemaErrorLike {\n code: \"db_incompatible_schema\";\n dbPath: string;\n}\n\nfunction parseIncompatibleSchemaError(error: unknown): IncompatibleSchemaErrorLike | null {\n if (!error || typeof error !== \"object\") {\n return null;\n }\n\n const candidate = error as { code?: unknown; dbPath?: unknown };\n if (candidate.code !== \"db_incompatible_schema\" || typeof candidate.dbPath !== \"string\") {\n return null;\n }\n\n return {\n code: \"db_incompatible_schema\",\n dbPath: candidate.dbPath,\n };\n}\n\nasync function handleIncompatibleSchema(error: unknown): Promise<boolean> {\n const payload = parseIncompatibleSchemaError(error);\n if (!payload) {\n return false;\n }\n\n const approved = isInteractiveSession()\n ? await confirmYesNo(\n `Local database is incompatible at ${payload.dbPath}. Delete and rebuild the local database? [y/N] `\n )\n : false;\n\n if (!approved) {\n throw error;\n }\n\n rmSync(payload.dbPath, { force: true });\n return true;\n}\n\nasync function verifyManagedDatabaseCompatibility(): Promise<void> {\n try {\n verifyLocalDatabaseCompatibility();\n } catch (error) {\n const rebuilt = await handleIncompatibleSchema(error);\n if (!rebuilt) {\n throw error;\n }\n\n verifyLocalDatabaseCompatibility();\n }\n}\n\nasync function openManagedServerInBrowser(existingStatus?: ServerStatus | null): Promise<void> {\n const status = existingStatus ?? (await getServerStatus());\n const browserUrl = getBrowserUrl(status);\n\n if (browserUrl === null) {\n throw new Error(\"Unable to determine the running Coder Studio URL.\");\n }\n\n console.log(`Opening Coder Studio in your browser: ${browserUrl}`);\n await openBrowser(browserUrl);\n}\n\nexport async function main(argv = process.argv.slice(2)): Promise<void> {\n assertSupportedNodeVersion();\n const args = parseArgs(argv);\n\n if (args.command === \"config\") {\n if (args.configHelp) {\n showConfigHelp();\n return;\n }\n\n if (\n args.host === undefined &&\n args.port === undefined &&\n args.dataDir === undefined &&\n args.password === undefined\n ) {\n console.log(formatConfig(readCliConfig()));\n return;\n }\n\n const savedConfig = readCliConfig();\n const nextConfig: CliConfig = {\n ...(savedConfig?.host !== undefined ? { host: savedConfig.host } : {}),\n ...(savedConfig?.port !== undefined && savedConfig.port > 0\n ? { port: savedConfig.port }\n : {}),\n ...(savedConfig?.dataDir !== undefined ? { dataDir: savedConfig.dataDir } : {}),\n ...(savedConfig?.password !== undefined ? { password: savedConfig.password } : {}),\n ...(args.host !== undefined ? { host: args.host } : {}),\n ...(args.port !== undefined ? { port: args.port } : {}),\n ...(args.dataDir !== undefined ? { dataDir: args.dataDir } : {}),\n ...(args.password !== undefined ? { password: args.password } : {}),\n };\n writeCliConfig(nextConfig);\n console.log(formatConfig(nextConfig));\n return;\n }\n\n if (args.command === \"stop\") {\n const stopped = await stopRunningServer();\n console.log(stopped ? \"Stopped Coder Studio server.\" : \"No running Coder Studio server found.\");\n return;\n }\n\n if (args.command === \"status\") {\n console.log(formatStatus(await getServerStatus()));\n return;\n }\n\n if (args.command === \"logs\") {\n showLogs(await getServerStatus(), { tail: args.tail, errorsOnly: args.errorsOnly });\n return;\n }\n\n if (args.command === \"help\") {\n showHelp();\n return;\n }\n\n if (args.command === \"version\") {\n showVersion();\n return;\n }\n\n if (args.command === \"auth\") {\n if (args.authCommand === \"ban-list\") {\n console.log(formatAuthBlocks(await listAuthBlocks()));\n return;\n }\n\n if (args.authCommand === \"unblock\") {\n const cleared = await clearAuthBlockByIp(args.ip!);\n console.log(cleared ? `Unblocked IP: ${args.ip}` : `No block found for IP: ${args.ip}`);\n return;\n }\n }\n\n if (args.command === \"open\") {\n const startup = await prepareManagedStartup(args.restart);\n if (startup.existingStatus === null) {\n await verifyManagedDatabaseCompatibility();\n await startManagedServerFlow();\n }\n\n await openManagedServerInBrowser(startup.existingStatus);\n return;\n }\n\n if (args.foreground) {\n const startup = await prepareManagedStartup(args.restart);\n if (startup.existingStatus !== null) {\n return;\n }\n\n if (startup.restartRequested) {\n await stopRunningServer();\n }\n\n console.log(\"Starting Coder Studio Server in foreground...\");\n try {\n await startServer();\n } catch (error) {\n const rebuilt = await handleIncompatibleSchema(error);\n if (!rebuilt) {\n throw error;\n }\n await startServer();\n }\n return;\n }\n\n const startup = await prepareManagedStartup(args.restart);\n if (startup.existingStatus !== null) {\n return;\n }\n\n await verifyManagedDatabaseCompatibility();\n await startManagedServerFlow();\n\n console.log(\"Coder Studio server started in background.\");\n console.log(\"Run `coder-studio status` to inspect the server.\");\n}\n", "import {\n AuthLoginBlockRepo,\n closeDatabase,\n openDatabase,\n parseServerConfig,\n} from \"@coder-studio/server\";\nimport { readCliConfig } from \"./config-store.js\";\n\nexport interface CliAuthBlock {\n ip: string;\n failedCount: number;\n firstFailedAt: number;\n lastFailedAt: number;\n blockedUntil: number;\n}\n\nfunction resolveDataDir(): string {\n const savedConfig = readCliConfig();\n return parseServerConfig({\n ...(savedConfig?.dataDir !== undefined ? { dataDir: savedConfig.dataDir } : {}),\n }).dataDir;\n}\n\nexport async function listAuthBlocks(now = Date.now()): Promise<CliAuthBlock[]> {\n const db = openDatabase(resolveDataDir());\n try {\n const repo = new AuthLoginBlockRepo(db);\n return repo.listActiveBlocks(now).map((record) => ({\n ip: record.ip,\n failedCount: record.failedCount,\n firstFailedAt: record.firstFailedAt,\n lastFailedAt: record.lastFailedAt,\n blockedUntil: record.blockedUntil ?? 0,\n }));\n } finally {\n closeDatabase(db);\n }\n}\n\nexport async function clearAuthBlockByIp(ip: string): Promise<boolean> {\n const db = openDatabase(resolveDataDir());\n try {\n const repo = new AuthLoginBlockRepo(db);\n return repo.delete(ip);\n } finally {\n closeDatabase(db);\n }\n}\n", "import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { basename, join } from \"path\";\n\nconst DEFAULT_DB_FILE = \"coder-studio.db\";\n\nexport interface CliConfig {\n host?: string;\n port?: number;\n dataDir?: string;\n password?: string;\n}\n\nexport function getCliConfigPath(): string {\n return join(homedir(), \".coder-studio\", \"config.json\");\n}\n\nexport function normalizeDataDir(input: string): string {\n if (input.endsWith(\".db\")) {\n return input;\n }\n if (basename(input).includes(\".\")) {\n return input;\n }\n return join(input, DEFAULT_DB_FILE);\n}\n\nexport function readCliConfig(): CliConfig | null {\n const path = getCliConfigPath();\n if (!existsSync(path)) {\n return null;\n }\n\n try {\n const parsed = JSON.parse(readFileSync(path, \"utf-8\")) as CliConfig;\n if (\n (parsed.host !== undefined && typeof parsed.host !== \"string\") ||\n (parsed.port !== undefined && typeof parsed.port !== \"number\") ||\n (parsed.dataDir !== undefined && typeof parsed.dataDir !== \"string\") ||\n (parsed.password !== undefined && typeof parsed.password !== \"string\")\n ) {\n return null;\n }\n return parsed;\n } catch {\n return null;\n }\n}\n\nexport function writeCliConfig(config: CliConfig): void {\n const path = getCliConfigPath();\n const dir = join(homedir(), \".coder-studio\");\n const normalizedConfig: CliConfig = {\n ...(config.host !== undefined ? { host: config.host } : {}),\n ...(config.port !== undefined && config.port > 0 ? { port: config.port } : {}),\n ...(config.dataDir !== undefined ? { dataDir: normalizeDataDir(config.dataDir) } : {}),\n ...(config.password !== undefined ? { password: config.password } : {}),\n };\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(path, JSON.stringify(normalizedConfig, null, 2), \"utf-8\");\n}\n", "import { spawn } from \"node:child_process\";\n\nfunction getOpenCommand(url: string): { command: string; args: string[] } {\n switch (process.platform) {\n case \"darwin\":\n return { command: \"open\", args: [url] };\n case \"win32\":\n return { command: \"cmd\", args: [\"/c\", \"start\", \"\", url] };\n default:\n return { command: \"xdg-open\", args: [url] };\n }\n}\n\nexport async function openBrowser(url: string): Promise<void> {\n const { command, args } = getOpenCommand(url);\n\n await new Promise<void>((resolve, reject) => {\n const child = spawn(command, args, {\n detached: true,\n stdio: \"ignore\",\n windowsHide: true,\n });\n\n child.once(\"error\", reject);\n child.once(\"spawn\", () => {\n child.unref();\n resolve();\n });\n });\n}\n", "import { closeSync, existsSync, openSync, readSync, statSync } from \"fs\";\n\nconst DEFAULT_MAX_LINES = 40;\nconst DEFAULT_MAX_CHARS = 4000;\nconst DEFAULT_MAX_BYTES = 16 * 1024;\n\nexport interface LogExcerptOptions {\n startOffset?: number;\n maxBytes?: number;\n maxLines?: number;\n maxChars?: number | null;\n}\n\nexport const getFileSize = (path: string): number => {\n if (!existsSync(path)) {\n return 0;\n }\n\n try {\n return statSync(path).size;\n } catch {\n return 0;\n }\n};\n\nexport const readLogExcerpt = (\n path: string,\n {\n startOffset = 0,\n maxBytes = DEFAULT_MAX_BYTES,\n maxLines = DEFAULT_MAX_LINES,\n maxChars = DEFAULT_MAX_CHARS,\n }: LogExcerptOptions = {}\n): string | null => {\n if (!existsSync(path)) {\n return null;\n }\n\n const fileSize = getFileSize(path);\n const safeOffset = startOffset > fileSize ? 0 : Math.max(0, startOffset);\n if (fileSize === safeOffset) {\n return null;\n }\n\n const bytesToRead = Math.min(fileSize - safeOffset, maxBytes);\n const readStart = fileSize - bytesToRead;\n const buffer = Buffer.allocUnsafe(bytesToRead);\n const fd = openSync(path, \"r\");\n let content = \"\";\n let startsMidLine = false;\n\n try {\n const bytesRead = readSync(fd, buffer, 0, bytesToRead, readStart);\n if (bytesRead === 0) {\n return null;\n }\n\n if (readStart > safeOffset && readStart > 0) {\n const previousByte = Buffer.alloc(1);\n const previousBytesRead = readSync(fd, previousByte, 0, 1, readStart - 1);\n startsMidLine = previousBytesRead === 1 && previousByte[0] !== 0x0a;\n }\n\n content = buffer.toString(\"utf-8\", 0, bytesRead).trimEnd();\n } finally {\n closeSync(fd);\n }\n\n if (startsMidLine) {\n const firstNewlineIndex = content.indexOf(\"\\n\");\n if (firstNewlineIndex !== -1) {\n content = content.slice(firstNewlineIndex + 1);\n }\n }\n\n if (content.length === 0) {\n return null;\n }\n\n const lines = content\n .split(/\\r?\\n/u)\n .map((line) => line.trimEnd())\n .filter((line) => line.length > 0);\n if (lines.length === 0) {\n return null;\n }\n\n const excerpt = lines.slice(-maxLines).join(\"\\n\");\n if (maxChars === null || excerpt.length <= maxChars) {\n return excerpt;\n }\n\n return `\u2026${excerpt.slice(-maxChars + 1)}`;\n};\n", "export const MINIMUM_NODE_VERSION = \"24.0.0\";\n\nfunction parseVersion(version: string): [number, number, number] {\n const [major = \"0\", minor = \"0\", patch = \"0\"] = version.split(\".\");\n return [\n Number.parseInt(major, 10) || 0,\n Number.parseInt(minor, 10) || 0,\n Number.parseInt(patch, 10) || 0,\n ];\n}\n\nexport function isNodeVersionSupported(version: string): boolean {\n const current = parseVersion(version);\n const minimum = parseVersion(MINIMUM_NODE_VERSION);\n\n for (let index = 0; index < minimum.length; index += 1) {\n const currentPart = current[index] ?? 0;\n const minimumPart = minimum[index] ?? 0;\n if (currentPart > minimumPart) return true;\n if (currentPart < minimumPart) return false;\n }\n\n return true;\n}\n\nexport function assertSupportedNodeVersion(version = process.versions.node): void {\n if (isNodeVersionSupported(version)) {\n return;\n }\n\n throw new Error(\n `Coder Studio requires Node.js >=${MINIMUM_NODE_VERSION} because it uses the built-in node:sqlite module. Current version: ${version}.`\n );\n}\n", "import { existsSync, readFileSync } from \"fs\";\n\ninterface CliPackageManifest {\n version?: string;\n}\n\nexport function resolveCliPackageManifestUrl(importMetaUrl: string): URL {\n const manifestUrl = [\n new URL(\"../package.json\", importMetaUrl),\n new URL(\"../../package.json\", importMetaUrl),\n ].find((candidate) => existsSync(candidate));\n\n if (!manifestUrl) {\n throw new Error(\"Unable to locate CLI package.json\");\n }\n\n return manifestUrl;\n}\n\nexport function getCliPackageManifest(importMetaUrl: string): CliPackageManifest {\n return JSON.parse(\n readFileSync(resolveCliPackageManifestUrl(importMetaUrl), \"utf-8\")\n ) as CliPackageManifest;\n}\n\nexport function getCliVersion(importMetaUrl: string): string {\n return getCliPackageManifest(importMetaUrl).version ?? \"0.0.0\";\n}\n", "type CliCommand =\n | \"serve\"\n | \"open\"\n | \"config\"\n | \"stop\"\n | \"status\"\n | \"logs\"\n | \"help\"\n | \"version\"\n | \"auth\";\ntype AuthCommand = \"ban-list\" | \"unblock\";\n\nexport const RUNTIME_CONFIG_ERROR =\n \"Host, port, data-dir, password, and auth settings must be configured via the config command\";\n\nexport interface CliArgs {\n foreground?: boolean;\n restart?: boolean;\n command?: CliCommand;\n tail?: number;\n errorsOnly?: boolean;\n authCommand?: AuthCommand;\n configHelp?: boolean;\n port?: number;\n host?: string;\n dataDir?: string;\n password?: string;\n noAuth?: boolean;\n ip?: string;\n}\n\nfunction getActiveCommand(args: CliArgs): CliCommand {\n return args.command ?? \"serve\";\n}\n\nfunction clearConfigArgs(args: CliArgs): void {\n delete args.configHelp;\n delete args.port;\n delete args.host;\n delete args.dataDir;\n delete args.password;\n delete args.noAuth;\n}\n\nfunction clearAuthArgs(args: CliArgs): void {\n delete args.authCommand;\n delete args.ip;\n}\n\nfunction clearLogsArgs(args: CliArgs): void {\n delete args.tail;\n delete args.errorsOnly;\n}\n\nfunction setCommand(args: CliArgs, command: CliCommand): void {\n if (command !== \"config\") {\n clearConfigArgs(args);\n }\n\n if (command !== \"auth\") {\n clearAuthArgs(args);\n }\n\n if (command !== \"logs\") {\n clearLogsArgs(args);\n }\n\n if (command !== \"serve\") {\n delete args.foreground;\n }\n\n if (command !== \"serve\" && command !== \"open\") {\n delete args.restart;\n }\n\n args.command = command;\n}\n\nfunction throwUnknownOption(option: string): never {\n throw new Error(`Unknown option: ${option}`);\n}\n\nfunction throwUnknownArgument(argument: string): never {\n throw new Error(`Unknown argument: ${argument}`);\n}\n\nfunction ensureConfigContext(args: CliArgs, option: string): void {\n const command = getActiveCommand(args);\n\n if (command === \"config\") {\n return;\n }\n\n if (command === \"serve\") {\n throw new Error(RUNTIME_CONFIG_ERROR);\n }\n\n throwUnknownOption(option);\n}\n\nfunction readOptionValue(argv: string[], index: number, label: string): string {\n const value = argv[index];\n\n if (value === undefined) {\n throw new Error(`Missing ${label} value`);\n }\n\n return value;\n}\n\nexport function parseArgs(argv: string[]): CliArgs {\n const args: CliArgs = {};\n\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n if (arg === undefined) {\n continue;\n }\n\n switch (arg) {\n case \"serve\":\n case \"open\":\n case \"config\":\n case \"stop\":\n case \"status\":\n case \"logs\":\n case \"version\":\n case \"auth\":\n setCommand(args, arg);\n break;\n\n case \"server\":\n setCommand(args, \"serve\");\n break;\n\n case \"help\":\n case \"--help\":\n case \"-h\":\n if (args.command === \"config\") {\n args.configHelp = true;\n break;\n }\n\n setCommand(args, \"help\");\n break;\n\n case \"--version\":\n case \"-v\":\n setCommand(args, \"version\");\n break;\n\n case \"--foreground\":\n if (getActiveCommand(args) !== \"serve\") {\n throwUnknownOption(arg);\n }\n\n args.foreground = true;\n break;\n\n case \"--restart\": {\n const command = getActiveCommand(args);\n\n if (command !== \"serve\" && command !== \"open\") {\n throwUnknownOption(arg);\n }\n\n args.restart = true;\n break;\n }\n\n case \"--tail\": {\n if (getActiveCommand(args) !== \"logs\") {\n throwUnknownOption(arg);\n }\n\n const tailValue = readOptionValue(argv, i + 1, \"tail\");\n if (!/^[1-9]\\d*$/u.test(tailValue)) {\n throw new Error(\"Invalid tail number\");\n }\n\n const tail = Number(tailValue);\n if (!Number.isSafeInteger(tail)) {\n throw new Error(\"Invalid tail number\");\n }\n\n args.tail = tail;\n i += 1;\n break;\n }\n\n case \"--errors-only\":\n if (getActiveCommand(args) !== \"logs\") {\n throwUnknownOption(arg);\n }\n\n args.errorsOnly = true;\n break;\n\n case \"--port\":\n case \"-p\": {\n ensureConfigContext(args, arg);\n const portValue = readOptionValue(argv, i + 1, \"port\");\n const port = Number.parseInt(portValue, 10);\n\n if (Number.isNaN(port)) {\n throw new Error(\"Invalid port number\");\n }\n\n args.port = port;\n i += 1;\n break;\n }\n\n case \"--host\":\n ensureConfigContext(args, arg);\n args.host = readOptionValue(argv, i + 1, \"host\");\n i += 1;\n break;\n\n case \"--data-dir\":\n case \"-d\":\n ensureConfigContext(args, arg);\n args.dataDir = readOptionValue(argv, i + 1, \"data-dir\");\n i += 1;\n break;\n\n case \"--password\":\n ensureConfigContext(args, arg);\n args.password = readOptionValue(argv, i + 1, \"password\");\n i += 1;\n break;\n\n case \"--no-auth\":\n if (getActiveCommand(args) === \"serve\") {\n throw new Error(RUNTIME_CONFIG_ERROR);\n }\n\n throwUnknownOption(arg);\n\n case \"ban-list\":\n case \"unblock\":\n if (getActiveCommand(args) !== \"auth\") {\n throwUnknownArgument(arg);\n }\n\n args.authCommand = arg;\n break;\n\n case \"--ip\":\n if (getActiveCommand(args) !== \"auth\" || args.authCommand !== \"unblock\") {\n throwUnknownOption(arg);\n }\n\n args.ip = readOptionValue(argv, i + 1, \"ip\");\n i += 1;\n break;\n\n default:\n if (arg.startsWith(\"-\")) {\n throwUnknownOption(arg);\n }\n\n throwUnknownArgument(arg);\n }\n }\n\n if (args.command === undefined) {\n args.command = \"serve\";\n }\n\n if (args.command === \"auth\") {\n if (args.authCommand === undefined) {\n throw new Error(\"Missing auth subcommand\");\n }\n\n if (args.authCommand === \"unblock\" && args.ip === undefined) {\n throw new Error(\"Missing ip value\");\n }\n }\n\n return args;\n}\n", "import { deleteRuntimeConfig, readRuntimeConfig } from \"@coder-studio/core/runtime\";\nimport { mkdirSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\nimport { getFileSize, readLogExcerpt } from \"./log-excerpt.js\";\n\nexport const MANAGED_SERVER_NAME = \"coder-studio-server\";\nconst PM2_RESTART_DELAY_MS = 2000;\nconst PM2_MIN_UPTIME = \"5s\";\nconst PM2_MAX_RESTARTS = 10;\nconst PM2_DELETE_WAIT_MS = 5000;\nconst PM2_DISCONNECT_WAIT_MS = 1000;\nconst STARTUP_POLL_INTERVAL_MS = 100;\nconst STARTUP_FAILURE_GUIDANCE =\n \"Run `coder-studio logs` for details or `coder-studio serve --foreground` for interactive debugging.\";\n\nexport interface ManagedServerStatus {\n status: \"running\" | \"starting\" | \"stopped\" | \"errored\";\n pm2Pid: number | null;\n restartCount: number;\n}\n\nexport interface StartManagedServerOptions {\n script: string;\n cwd: string;\n waitMs: number;\n args?: string[];\n}\n\ninterface Pm2ProcessDescription {\n pid?: number;\n pm2_env?: {\n status?: string;\n restart_time?: number;\n };\n}\n\ninterface StartupLogOffsets {\n outOffset: number;\n errOffset: number;\n}\n\nconst isMissingManagedServerError = (error: unknown): boolean => {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return /not found|process or namespace/i.test(error.message);\n};\n\n/**\n * Detects if PM2 is in a broken state (e.g. pointing to an old worktree).\n */\nconst isPm2BrokenStateError = (error: unknown): boolean => {\n if (!(error instanceof Error)) {\n return false;\n }\n return (\n error.message.includes(\"ProcessContainerFork\") ||\n (error.message.includes(\"Cannot find module\") && error.message.includes(\"pm2\"))\n );\n};\n\ntype Pm2Module = {\n connect: (cb: (err: Error | null) => void) => void;\n disconnect: (cb?: (err: Error | null, data?: unknown) => void) => void;\n describe: (name: string, cb: (err: Error | null, result: unknown[]) => void) => void;\n delete: (name: string, cb: (err: Error | null) => void) => void;\n start: (opts: unknown, cb: (err: Error | null) => void) => void;\n kill: (cb: (err: Error | null) => void) => void;\n};\n\nlet cachedPm2: Pm2Module | null = null;\n\nasync function loadPm2(): Promise<Pm2Module> {\n if (cachedPm2) {\n return cachedPm2;\n }\n\n let pm2Module: Pm2Module;\n try {\n const pm2 = await import(\"pm2\");\n pm2Module = pm2.default as unknown as Pm2Module;\n } catch {\n throw new Error(\n \"pm2 is not installed. Run `npm install -g pm2` to use background server management.\"\n );\n }\n\n cachedPm2 = pm2Module;\n return pm2Module;\n}\n\nconst connectPm2 = async (): Promise<void> => {\n const pm2 = await loadPm2();\n return new Promise((resolve, reject) => {\n pm2.connect((error) => {\n if (error) {\n reject(error);\n return;\n }\n\n resolve();\n });\n });\n};\n\nconst sleep = async (ms: number): Promise<void> =>\n new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n\nconst disconnectPm2 = async (): Promise<void> => {\n const pm2 = await loadPm2();\n await new Promise<void>((resolve) => {\n let settled = false;\n const finish = () => {\n if (settled) {\n return;\n }\n\n settled = true;\n resolve();\n };\n\n const timer = setTimeout(finish, PM2_DISCONNECT_WAIT_MS);\n try {\n pm2.disconnect(() => {\n clearTimeout(timer);\n finish();\n });\n } catch {\n clearTimeout(timer);\n finish();\n }\n });\n};\n\nconst describeManagedServer = async (pm2: Pm2Module): Promise<Pm2ProcessDescription[]> =>\n new Promise((resolve, reject) => {\n pm2.describe(MANAGED_SERVER_NAME, (error, result) => {\n if (error) {\n reject(error);\n return;\n }\n resolve((result ?? []) as Pm2ProcessDescription[]);\n });\n });\n\nconst removeManagedServer = async (pm2: Pm2Module): Promise<void> =>\n new Promise((resolve, reject) => {\n pm2.delete(MANAGED_SERVER_NAME, (error) => {\n if (error) {\n reject(error);\n return;\n }\n resolve();\n });\n });\n\n/**\n * Kill the PM2 daemon to clear stale paths/caches.\n * Used when the daemon is pointing to a deleted worktree.\n */\nconst killPm2Daemon = async (): Promise<void> => {\n const pm2 = await loadPm2();\n return new Promise((resolve) => {\n pm2.kill(() => {\n resolve();\n });\n });\n};\n\n/**\n * Try to connect to PM2, and if it's in a broken state (stale worktree path),\n * kill the daemon and reconnect fresh.\n */\nconst connectWithRecovery = async (): Promise<Pm2Module> => {\n try {\n await connectPm2();\n return loadPm2();\n } catch (error) {\n if (isPm2BrokenStateError(error)) {\n console.warn(\"PM2 daemon is in a stale state. Killing and reconnecting...\");\n try {\n await killPm2Daemon();\n } catch {\n // ignore kill errors\n }\n await sleep(1000);\n // Clear cached module so next loadPm2 gets a fresh instance\n cachedPm2 = null;\n await connectPm2();\n return loadPm2();\n } else {\n throw error;\n }\n }\n};\n\nconst withPm2Connection = async <T>(operation: (pm2: Pm2Module) => Promise<T>): Promise<T> => {\n const pm2 = await connectWithRecovery();\n\n try {\n return await operation(pm2);\n } finally {\n await disconnectPm2();\n }\n};\n\nconst waitForRuntimeReady = async (\n pm2: Pm2Module,\n waitMs: number,\n logOffsets: StartupLogOffsets\n): Promise<void> => {\n const deadline = Date.now() + waitMs;\n\n while (Date.now() <= deadline) {\n if (readRuntimeConfig()) {\n return;\n }\n\n const processes = await describeManagedServer(pm2);\n const process = processes[0];\n if (!process) {\n throw createStartupError(\n \"the managed process exited before runtime data was written\",\n logOffsets\n );\n }\n\n const status = process.pm2_env?.status;\n if (status === \"errored\" || status === \"stopped\") {\n throw createStartupError(`the managed process entered the ${status} state`, logOffsets);\n }\n\n const remainingMs = deadline - Date.now();\n if (remainingMs <= 0) {\n break;\n }\n\n await sleep(Math.min(STARTUP_POLL_INTERVAL_MS, remainingMs));\n }\n\n throw createStartupError(`runtime readiness timed out after ${waitMs}ms`, logOffsets);\n};\n\nconst waitForManagedServerDeletion = async (pm2: Pm2Module, waitMs: number): Promise<void> => {\n const deadline = Date.now() + waitMs;\n\n while (Date.now() <= deadline) {\n const processes = await describeManagedServer(pm2);\n if (processes.length === 0) {\n return;\n }\n\n const remainingMs = deadline - Date.now();\n if (remainingMs <= 0) {\n break;\n }\n\n await sleep(Math.min(STARTUP_POLL_INTERVAL_MS, remainingMs));\n }\n\n throw new Error(`Timed out waiting for the managed server to stop after ${waitMs}ms.`);\n};\n\nconst deleteManagedServerInSession = async (\n pm2: Pm2Module,\n {\n ignoreMissing = false,\n }: {\n ignoreMissing?: boolean;\n } = {}\n): Promise<boolean> => {\n const processes = await describeManagedServer(pm2);\n if (processes.length === 0) {\n return false;\n }\n\n try {\n await removeManagedServer(pm2);\n } catch (error) {\n if (ignoreMissing && isMissingManagedServerError(error)) {\n await waitForManagedServerDeletion(pm2, PM2_DELETE_WAIT_MS);\n return false;\n }\n\n throw error;\n }\n\n await waitForManagedServerDeletion(pm2, PM2_DELETE_WAIT_MS);\n return true;\n};\n\nconst ensureLogDirectory = (): void => {\n mkdirSync(join(homedir(), \".coder-studio\", \"logs\"), { recursive: true });\n};\n\nexport const getLogPaths = () => ({\n outFile: join(homedir(), \".coder-studio\", \"logs\", \"server.out.log\"),\n errFile: join(homedir(), \".coder-studio\", \"logs\", \"server.err.log\"),\n});\n\nconst captureStartupLogOffsets = (): StartupLogOffsets => {\n const { outFile, errFile } = getLogPaths();\n return {\n outOffset: getFileSize(outFile),\n errOffset: getFileSize(errFile),\n };\n};\n\nconst getStartupFailureDetails = (offsets: StartupLogOffsets): string | null => {\n const { outFile, errFile } = getLogPaths();\n const sections: string[] = [];\n const errExcerpt = readLogExcerpt(errFile, { startOffset: offsets.errOffset });\n const outExcerpt =\n outFile === errFile ? null : readLogExcerpt(outFile, { startOffset: offsets.outOffset });\n\n if (errExcerpt) {\n sections.push(`Recent error log excerpt (${errFile}):\\n${errExcerpt}`);\n }\n\n if (outExcerpt) {\n sections.push(`Recent output log excerpt (${outFile}):\\n${outExcerpt}`);\n }\n\n return sections.length === 0 ? null : sections.join(\"\\n\\n\");\n};\n\nconst createStartupError = (reason: string, offsets: StartupLogOffsets): Error => {\n const details = getStartupFailureDetails(offsets);\n const message = [\n `Coder Studio failed to start in background: ${reason}.`,\n ...(details ? [details] : []),\n STARTUP_FAILURE_GUIDANCE,\n ].join(\"\\n\\n\");\n\n return new Error(message);\n};\n\nexport const deleteManagedServer = async ({\n ignoreMissing = false,\n}: {\n ignoreMissing?: boolean;\n} = {}): Promise<boolean> =>\n withPm2Connection((pm2) => deleteManagedServerInSession(pm2, { ignoreMissing }));\n\nexport const startManagedServer = async ({\n script,\n cwd,\n waitMs,\n args,\n}: StartManagedServerOptions): Promise<void> =>\n withPm2Connection(async (pm2) => {\n await deleteManagedServerInSession(pm2, { ignoreMissing: true });\n\n if (readRuntimeConfig()) {\n deleteRuntimeConfig();\n }\n\n ensureLogDirectory();\n const { outFile, errFile } = getLogPaths();\n const logOffsets = captureStartupLogOffsets();\n\n await new Promise<void>((resolve, reject) => {\n pm2.start(\n {\n name: MANAGED_SERVER_NAME,\n script,\n cwd,\n ...(args !== undefined ? { args } : {}),\n env: {\n ...process.env,\n NODE_ENV: \"production\",\n },\n autorestart: true,\n restart_delay: PM2_RESTART_DELAY_MS,\n min_uptime: PM2_MIN_UPTIME,\n max_restarts: PM2_MAX_RESTARTS,\n out_file: outFile,\n error_file: errFile,\n },\n (error) => {\n if (error) {\n reject(error);\n return;\n }\n\n resolve();\n }\n );\n });\n\n await waitForRuntimeReady(pm2, waitMs, logOffsets);\n });\n\nexport const getManagedServerStatus = async (): Promise<ManagedServerStatus> =>\n withPm2Connection(async (pm2) => {\n const processes = await describeManagedServer(pm2);\n const process = processes[0];\n\n if (!process) {\n return {\n status: \"stopped\",\n pm2Pid: null,\n restartCount: 0,\n };\n }\n\n const status = process.pm2_env?.status;\n const restartCount = process.pm2_env?.restart_time ?? 0;\n const pm2Pid = process.pid ?? null;\n\n if (status === \"online\") {\n return {\n status: \"running\",\n pm2Pid,\n restartCount,\n };\n }\n\n if (status === \"launching\") {\n return {\n status: \"starting\",\n pm2Pid,\n restartCount,\n };\n }\n\n if (status === \"stopped\") {\n return {\n status: \"stopped\",\n pm2Pid: null,\n restartCount,\n };\n }\n\n if (pm2Pid === null || pm2Pid === 0) {\n return {\n status: \"stopped\",\n pm2Pid: null,\n restartCount,\n };\n }\n\n return {\n status: \"errored\",\n pm2Pid,\n restartCount,\n };\n });\n", "import { stdin as input, stdout as output } from \"node:process\";\nimport { createInterface } from \"node:readline/promises\";\n\nexport function isInteractiveSession(): boolean {\n return Boolean(input.isTTY && output.isTTY);\n}\n\nexport async function confirmYesNo(prompt: string): Promise<boolean> {\n const rl = createInterface({ input, output });\n\n try {\n const answer = (await rl.question(prompt)).trim().toLowerCase();\n return answer === \"y\" || answer === \"yes\";\n } finally {\n rl.close();\n }\n}\n", "import { deleteRuntimeConfig, readRuntimeConfig } from \"@coder-studio/core/runtime\";\nimport { deleteManagedServer, getLogPaths, getManagedServerStatus } from \"./pm2-control.js\";\n\nexport interface ServerStatus {\n status: \"running\" | \"starting\" | \"stopped\" | \"errored\";\n pid: number | null;\n host: string | null;\n port: number | null;\n restartCount: number;\n outFile: string;\n errFile: string;\n startedAt: number | null;\n}\n\nexport async function stopRunningServer(): Promise<boolean> {\n const stopped = await deleteManagedServer({ ignoreMissing: true });\n\n if (readRuntimeConfig()) {\n deleteRuntimeConfig();\n }\n\n return stopped;\n}\n\nexport async function ensureSingleServer(stop = () => stopRunningServer()): Promise<void> {\n await stop();\n}\n\nexport async function getServerStatus(): Promise<ServerStatus> {\n const managedStatus = await getManagedServerStatus();\n const runtime = readRuntimeConfig();\n const { outFile, errFile } = getLogPaths();\n\n if (managedStatus.status === \"stopped\" || (managedStatus.pm2Pid === null && runtime === null)) {\n if (runtime) {\n deleteRuntimeConfig();\n }\n\n return {\n status: \"stopped\",\n pid: null,\n host: null,\n port: null,\n restartCount: 0,\n outFile,\n errFile,\n startedAt: null,\n };\n }\n\n return {\n status: runtime ? managedStatus.status : \"starting\",\n pid: runtime?.pid ?? managedStatus.pm2Pid,\n host: runtime?.host ?? null,\n port: runtime?.port ?? null,\n restartCount: managedStatus.restartCount,\n outFile,\n errFile,\n startedAt: runtime?.startedAt ?? null,\n };\n}\n", "import type { Server, ServerConfig } from \"@coder-studio/server\";\nimport { closeDatabase, openDatabase, parseServerConfig } from \"@coder-studio/server\";\nimport { mkdirSync } from \"fs\";\nimport { dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { readCliConfig } from \"./config-store.js\";\nimport { getStaticAssetsDir, hasWebAssets } from \"./embed.js\";\nimport { assertSupportedNodeVersion } from \"./node-version.js\";\nimport { getCliVersion } from \"./package-manifest.js\";\n\nconst MISSING_WEB_ASSETS_WARNING = \"Warning: Web assets not found. Frontend will not be available.\";\n\nexport const buildServerConfig = (): Partial<ServerConfig> => {\n const savedConfig = readCliConfig();\n const config: Partial<ServerConfig> = {\n appVersion: getCliVersion(import.meta.url),\n ...(savedConfig?.host !== undefined ? { host: savedConfig.host } : {}),\n ...(savedConfig?.port !== undefined && savedConfig.port > 0 ? { port: savedConfig.port } : {}),\n ...(savedConfig?.dataDir !== undefined ? { dataDir: savedConfig.dataDir } : {}),\n ...(savedConfig?.password !== undefined\n ? {\n auth: {\n enabled: true,\n password: savedConfig.password,\n },\n }\n : {}),\n };\n\n if (hasWebAssets()) {\n return {\n ...config,\n webRoot: getStaticAssetsDir(),\n };\n }\n\n console.warn(MISSING_WEB_ASSETS_WARNING);\n return config;\n};\n\nexport const verifyLocalDatabaseCompatibility = (): void => {\n const config = parseServerConfig(buildServerConfig());\n if (config.dataDir !== \":memory:\") {\n mkdirSync(dirname(config.dataDir), { recursive: true });\n }\n\n const db = openDatabase(config.dataDir);\n closeDatabase(db);\n};\n\nconst createShutdownHandler = (server: Server) => async () => {\n await server.stop();\n process.exit(0);\n};\n\nconst isServerEntrypoint = (moduleUrl: string, argvEntry?: string): boolean => {\n if (argvEntry === undefined) {\n return true;\n }\n\n if (argvEntry.endsWith(\"ProcessContainerFork.js\")) {\n return true;\n }\n\n const modulePath = fileURLToPath(moduleUrl);\n const [entryScript] = argvEntry.split(/\\s+/, 1);\n return entryScript === modulePath;\n};\n\nexport const runServerEntrypoint = async (moduleUrl: string, argvEntry?: string): Promise<void> => {\n if (!isServerEntrypoint(moduleUrl, argvEntry)) {\n return;\n }\n\n await startServer();\n};\n\nexport const startServer = async (): Promise<Server> => {\n assertSupportedNodeVersion();\n const { createServer } = await import(\"@coder-studio/server\");\n const server = await createServer(buildServerConfig());\n const shutdown = createShutdownHandler(server);\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n return server;\n};\n\nvoid runServerEntrypoint(import.meta.url, process.argv[1]);\n", "/**\n * Embed Web Assets\n *\n * Utility functions for checking embedded web assets\n * The actual serving is handled by Fastify static plugin\n */\n\nimport { existsSync } from \"fs\";\nimport { dirname, resolve } from \"path\";\nimport { fileURLToPath } from \"url\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// Path to embedded web assets (relative to dist/esm/index.mjs)\nconst WEB_ASSETS_DIR = resolve(__dirname, \"../web\");\n\n/**\n * Get the static assets directory path\n */\nexport function getStaticAssetsDir(): string {\n return WEB_ASSETS_DIR;\n}\n\n/**\n * Check if web assets exist\n */\nexport function hasWebAssets(): boolean {\n return existsSync(WEB_ASSETS_DIR);\n}\n\n/**\n * Embed web assets (called during CLI startup)\n *\n * Note: This just validates assets exist. The server handles\n * static file serving via the webRoot config option.\n */\nexport async function embedWebAssets(): Promise<void> {\n if (!hasWebAssets()) {\n console.warn(\"Warning: Web assets not found. Frontend will not be available.\");\n }\n}\n", "import type { ServerStatus } from \"./server-control.js\";\n\nfunction isWildcardHost(host: string): boolean {\n return host === \"0.0.0.0\" || host === \"::\" || host === \"::0\";\n}\n\nfunction formatUrlHost(host: string): string {\n return host.includes(\":\") && !host.startsWith(\"[\") ? `[${host}]` : host;\n}\n\nexport function getListenIp(status: ServerStatus): string | null {\n return status.host;\n}\n\nexport function getListenUrl(status: ServerStatus): string | null {\n if (status.host === null || status.port === null) {\n return null;\n }\n\n return `http://${formatUrlHost(status.host)}:${status.port}`;\n}\n\nexport function getBrowserUrl(status: ServerStatus): string | null {\n if (status.port === null) {\n return null;\n }\n\n const host =\n status.host === null || status.host === \"localhost\" || isWildcardHost(status.host)\n ? \"127.0.0.1\"\n : formatUrlHost(status.host);\n\n return `http://${host}:${status.port}`;\n}\n", "import { main } from \"./cli.js\";\n\nvoid main().catch((error) => {\n const message = error instanceof Error ? error.message : String(error);\n console.error(\"CLI error:\", message);\n process.exit(1);\n});\n"],
5
+ "mappings": ";;;;;;;;;;;;AAMO,SAAS,mBAAmB,KAAqB;AACtD,SAAO,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC,KAAK;AACjC;AAEO,SAAS,eAAe,UAA2B;AACxD,SAAO,qBAAqB,KAAK,QAAQ;AAC3C;AAEO,SAAS,kBAAkB,UAA2B;AAC3D,SACE,qBAAqB,IAAI,QAAQ,KACjC,kBAAkB,KAAK,CAAC,WAAW,SAAS,WAAW,MAAM,CAAC;AAElE;AAEO,SAAS,mBAAmB,UAA2B;AAC5D,SAAO,SAAS,WAAW,UAAU,KAAK,uBAAuB,IAAI,QAAQ;AAC/E;AAEO,SAAS,4BACd,SACS;AACT,MAAI,QAAQ,WAAW,SAAS,QAAQ,WAAW,QAAQ;AACzD,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,mBAAmB,QAAQ,GAAG;AAC/C,MAAI,kBAAkB,QAAQ,KAAK,mBAAmB,QAAQ,KAAK,eAAe,QAAQ,GAAG;AAC3F,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,QAAQ,QAAQ,UAAU;AACzC,SAAO,OAAO,SAAS,WAAW;AACpC;AAvCA,IAEM,mBACA,sBACA;AAJN;AAAA;AAAA;AAEA,IAAM,oBAAoB,CAAC,SAAS,UAAU,cAAc,UAAU;AACtE,IAAM,uBAAuB,oBAAI,IAAI,CAAC,QAAQ,SAAS,WAAW,YAAY,aAAa,KAAK,CAAC;AACjG,IAAM,yBAAyB,oBAAI,IAAI,CAAC,gBAAgB,eAAe,oBAAoB,CAAC;AAAA;AAAA;;;ACY5F,SAAS,iBAAiB,WAAyD;AACjF,QAAM,cAAc,MAAM,QAAQ,SAAS,IAAI,UAAU,CAAC,IAAI;AAC9D,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,YACd,MAAM,GAAG,EACT,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAC3B,KAAK,OAAO;AAEf,SAAO,YAAY;AACrB;AAEO,SAAS,gBAAgB,SAAyD;AACvF,SAAO,iBAAiB,QAAQ,QAAQ,iBAAiB,CAAC,KAAK,QAAQ;AACzE;AAhCA,IAMa,qBACA,iBACA,gBA0BA;AAlCb;AAAA;AAAA;AAMO,IAAM,sBAAsB;AAC5B,IAAM,kBAAkB,KAAK,KAAK,KAAK;AACvC,IAAM,iBAAiB,KAAK,KAAK,KAAK;AA0BtC,IAAM,sBAAN,MAA0B;AAAA,MAC/B,YAA6B,MAA0B;AAA1B;AAAA,MAA2B;AAAA,MAA3B;AAAA,MAE7B,eAAe,IAAY,KAAsC;AAC/D,cAAM,SAAS,KAAK,KAAK,IAAI,EAAE;AAC/B,YAAI,CAAC,QAAQ;AACX,iBAAO;AAAA,QACT;AAEA,YAAI,OAAO,iBAAiB,QAAQ,OAAO,eAAe,KAAK;AAC7D,iBAAO;AAAA,YACL;AAAA,YACA,aAAa,OAAO;AAAA,YACpB,cAAc,OAAO;AAAA,UACvB;AAAA,QACF;AAEA,YAAI,KAAK,YAAY,QAAQ,GAAG,GAAG;AACjC,eAAK,KAAK,OAAO,EAAE;AAAA,QACrB;AAEA,eAAO;AAAA,MACT;AAAA,MAEA,cAAc,IAAY,KAAmC;AAC3D,eAAO,KAAK,KAAK;AAAA,UACf;AAAA,UACA;AAAA,UACA,MAAM;AAAA,UACN;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MAEA,cAAc,IAAkB;AAC9B,aAAK,KAAK,OAAO,EAAE;AAAA,MACrB;AAAA,MAEQ,YAAY,QAA8B,KAAsB;AACtE,YAAI,OAAO,iBAAiB,QAAQ,OAAO,gBAAgB,KAAK;AAC9D,iBAAO;AAAA,QACT;AAEA,eAAO,MAAM,OAAO,eAAe;AAAA,MACrC;AAAA,IACF;AAAA;AAAA;;;AC/EA,SAAS,mBAAmB;AAA5B,IAYM,kBAEA,cAeA,cAmBA,uBAEA,uBAcAA,8BAOA,wBAeO,iBA0BA,yBAUA,oBAsCA;AAhKb;AAAA;AAAA;AAKA;AAKA;AAEA,IAAM,mBAAmB;AAEzB,IAAM,eAAe,CAACC,WAAiB;AACrC,YAAM,WAAW,mBAAmBA,MAAI;AAExC,aACE,aAAa,OACb,aAAa,YACb,aAAa,cACb,aAAa,kBACb,aAAa,iBACb,aAAa,kBACb,SAAS,WAAW,IAAI,KACxB,mBAAmB,QAAQ;AAAA,IAE/B;AAEA,IAAM,eAAe,CAAC,iBAA0B;AAC9C,UAAI,CAAC,cAAc;AACjB,eAAO,CAAC;AAAA,MACV;AAEA,aAAO,aACJ,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO,EACd,OAA+B,CAAC,KAAK,SAAS;AAC7C,cAAM,CAAC,KAAK,GAAG,IAAI,IAAI,KAAK,MAAM,GAAG;AACrC,YAAI,CAAC,KAAK;AACR,iBAAO;AAAA,QACT;AACA,YAAI,GAAG,IAAI,KAAK,KAAK,GAAG;AACxB,eAAO;AAAA,MACT,GAAG,CAAC,CAAC;AAAA,IACT;AAEA,IAAM,wBAAwB,CAAC,UAA0B,mBAAmB,KAAK;AAEjF,IAAM,wBAAwB,CAAC,UAA0B;AACvD,UAAI;AACF,eAAO,mBAAmB,KAAK;AAAA,MACjC,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AAQA,IAAMD,+BAA8B,CAAC,SAAyB,SAA4B;AACxF,UAAI,CAAC,KAAK,OAAO,SAAS;AACxB,eAAO;AAAA,MACT;AACA,aAAO,4BAAoC,OAAO;AAAA,IACpD;AAEA,IAAM,yBAAyB,CAAC,SAAyB,SAA4B;AACnF,UAAI,CAAC,KAAK,OAAO,KAAK,SAAS;AAC7B,eAAO;AAAA,MACT;AAEA,YAAM,UAAU,aAAa,QAAQ,QAAQ,MAAM;AACnD,YAAM,aAAa,QAAQ,gBAAgB;AAC3C,UAAI,CAAC,YAAY;AACf,eAAO;AAAA,MACT;AAEA,YAAM,QAAQ,sBAAsB,UAAU;AAC9C,aAAO,KAAK,gBAAgB,MAAM,OAAO,KAAK,IAAI,CAAC;AAAA,IACrD;AAEO,IAAM,kBAAkB,CAAC,SAAmB;AACjD,aAAO,OAAO,SAAyB,UAAwB;AAC7D,YACE,CAAC,KAAK,OAAO,KAAK,WAClB,aAAa,QAAQ,GAAG,KACxB,QAAQ,QAAQ,iBAChB,QAAQ,QAAQ,gBAChB;AACA;AAAA,QACF;AAEA,YAAI,uBAAuB,SAAS,IAAI,GAAG;AACzC;AAAA,QACF;AAEA,YAAIA,6BAA4B,SAAS,IAAI,GAAG;AAC9C,iBAAO,MAAM,SAAS,QAAQ;AAAA,QAChC;AAEA,cAAM,OAAO,GAAG,EAAE,KAAK;AAAA,UACrB,IAAI;AAAA,UACJ,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF;AAEO,IAAM,0BAA0B,CAAC,SAAmB;AACzD,aAAO,OAAO,SAAyB,UAAwB;AAC7D,eAAO,MAAM,KAAK;AAAA,UAChB,IAAI;AAAA,UACJ,aAAa,KAAK,OAAO,KAAK;AAAA,UAC9B,eAAe,uBAAuB,SAAS,IAAI;AAAA,QACrD,CAAC;AAAA,MACH;AAAA,IACF;AAEO,IAAM,qBAAqB,CAAC,SAAmB;AACpD,YAAM,kBAAkB,IAAI,oBAAoB,KAAK,kBAAkB;AAEvE,aAAO,OAAO,SAA0D,UAAwB;AAC9F,YAAI,CAAC,KAAK,OAAO,KAAK,WAAW,CAAC,KAAK,OAAO,KAAK,UAAU;AAC3D,iBAAO,MAAM,KAAK,EAAE,IAAI,MAAM,aAAa,OAAO,eAAe,KAAK,CAAC;AAAA,QACzE;AAEA,cAAM,MAAM,KAAK,IAAI;AACrB,cAAM,KAAK,gBAAgB,OAAO;AAClC,cAAM,cAAc,gBAAgB,eAAe,IAAI,GAAG;AAC1D,YAAI,aAAa;AACf,iBAAO,MAAM,OAAO,GAAG,EAAE,KAAK;AAAA,YAC5B,IAAI;AAAA,YACJ,SAAS;AAAA,YACT;AAAA,YACA,cAAc,YAAY;AAAA,YAC1B,OAAO;AAAA,UACT,CAAC;AAAA,QACH;AAEA,YAAI,QAAQ,MAAM,aAAa,KAAK,OAAO,KAAK,UAAU;AACxD,0BAAgB,cAAc,IAAI,GAAG;AACrC,iBAAO,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,mBAAmB,CAAC;AAAA,QACxE;AAEA,wBAAgB,cAAc,EAAE;AAChC,cAAM,QAAQ,YAAY,EAAE,EAAE,SAAS,KAAK;AAC5C,aAAK,gBAAgB,OAAO,OAAO,GAAG;AAEtC,cAAM;AAAA,UACJ;AAAA,UACA,GAAG,gBAAgB,IAAI,sBAAsB,KAAK,CAAC;AAAA,QACrD;AACA,eAAO,MAAM,KAAK,EAAE,IAAI,MAAM,aAAa,MAAM,eAAe,KAAK,CAAC;AAAA,MACxE;AAAA,IACF;AAEO,IAAM,0BAA0B,CAAC,SAAmB;AACzD,aAAO,OAAO,SAAyB,UAAwB;AAC7D,cAAM,UAAU,aAAa,QAAQ,QAAQ,MAAM;AACnD,cAAM,aAAa,QAAQ,gBAAgB;AAE3C,YAAI,YAAY;AACd,eAAK,gBAAgB,OAAO,sBAAsB,UAAU,CAAC;AAAA,QAC/D;AAEA,cAAM,OAAO,cAAc,GAAG,gBAAgB,8CAA8C;AAE5F,eAAO,MAAM,KAAK;AAAA,UAChB,IAAI;AAAA,UACJ,aAAa,KAAK,OAAO,KAAK;AAAA,UAC9B,eAAe;AAAA,QACjB,CAAC;AAAA,MACH;AAAA,IACF;AAAA;AAAA;;;ACjLA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAca;AAdb;AAAA;AAAA;AAcO,IAAM,WAAN,MAAe;AAAA,MACZ,WAAW,oBAAI,IAA4C;AAAA;AAAA;AAAA;AAAA;AAAA,MAMnE,KAAK,OAA0B;AAC7B,cAAME,YAAW,KAAK,SAAS,IAAI,MAAM,IAAI;AAC7C,YAAI,CAACA,UAAU;AAEf,mBAAW,WAAWA,WAAU;AAC9B,cAAI;AACF,oBAAQ,KAAK;AAAA,UACf,SAAS,OAAO;AAEd,oBAAQ,MAAM,8BAA8B,MAAM,IAAI,KAAK,KAAK;AAAA,UAClE;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,GAA0B,MAAiB,SAAuC;AAChF,YAAI,CAAC,KAAK,SAAS,IAAI,IAAI,GAAG;AAC5B,eAAK,SAAS,IAAI,MAAM,oBAAI,IAAI,CAAC;AAAA,QACnC;AAEA,cAAMA,YAAW,KAAK,SAAS,IAAI,IAAI;AACvC,QAAAA,UAAS,IAAI,OAAuB;AAEpC,eAAO,MAAM;AACX,UAAAA,UAAS,OAAO,OAAuB;AACvC,cAAIA,UAAS,SAAS,GAAG;AACvB,iBAAK,SAAS,OAAO,IAAI;AAAA,UAC3B;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,QAAc;AACZ,aAAK,SAAS,MAAM;AAAA,MACtB;AAAA,IACF;AAAA;AAAA;;;ACnDA,OAAO,QAAQ;AACf,OAAO,QAAQ;AACf,OAAO,UAAU;AAmBjB,SAAS,cAAc,OAAiE;AACtF,UAAQ,OAAO;AAAA,IACb,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,2BAAmC;AAC1C,MAAI,kBAAkB;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkB,CAAC,IAAI,IAAI,0BAA0B,YAAY,GAAG,CAAC,EAAE;AAAA,IAAK,CAAC,cACjF,GAAG,WAAW,SAAS;AAAA,EACzB;AAEA,MAAI,CAAC,iBAAiB;AACpB,uBAAmB;AACnB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,MAAM,KAAK,MAAM,GAAG,aAAa,iBAAiB,OAAO,CAAC;AAChE,uBAAmB,OAAO,IAAI,YAAY,WAAW,IAAI,UAAU;AAAA,EACrE,QAAQ;AACN,uBAAmB;AAAA,EACrB;AAEA,SAAO;AACT;AAUA,SAAS,cAAc,UAA2B;AAChD,MAAI,SAAU,QAAO;AACrB,MAAI,QAAQ,IAAI,aAAa,cAAc;AACzC,WAAO,KAAK,KAAK,GAAG,OAAO,GAAG,qBAAqB;AAAA,EACrD;AACA,SAAO,KAAK,KAAK,GAAG,QAAQ,GAAG,iBAAiB,QAAQ,iBAAiB;AAC3E;AAEA,SAAS,4BAAoC;AAC3C,MAAI,sBAAsB;AACxB,WAAO;AAAA,EACT;AAEA,yBAAuB,GAAG,YAAY,KAAK,KAAK,GAAG,OAAO,GAAG,4BAA4B,CAAC;AAC1F,SAAO;AACT;AAEA,SAAS,kBAAkB,UAA2B;AACpD,MAAI,UAAU;AACZ,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,IAAI,aAAa,QAAQ;AACnC,WAAO,0BAA0B;AAAA,EACnC;AACA,MAAI,QAAQ,IAAI,aAAa,eAAe;AAC1C,WAAO,KAAK,KAAK,GAAG,OAAO,GAAG,oBAAoB,SAAS;AAAA,EAC7D;AACA,SAAO,KAAK,KAAK,GAAG,QAAQ,GAAG,iBAAiB,SAAS;AAC3D;AAKO,SAAS,kBAAkB,WAAiD;AACjF,QAAM,SAAS,QAAQ,IAAI,YAAY;AACvC,QAAM,WAAW,QAAQ,IAAI;AAC7B,QAAM,UAAU,cAAc,WAAW,WAAW,QAAQ,IAAI,QAAQ;AACxE,QAAM,aAAa,kBAAkB,WAAW,cAAc,QAAQ,IAAI,WAAW;AAIrF,SAAO;AAAA,IACL,MAAM,WAAW,QAAQ,QAAQ,IAAI,QAAQ;AAAA,IAC7C,MAAM,WAAW,QAAQ,SAAS,QAAQ,IAAI,QAAQ,QAAQ,EAAE;AAAA,IAChE;AAAA,IACA;AAAA,IACA,UAAU,WAAW,YAAY,cAAc,QAAQ,IAAI,SAAS,KAAK;AAAA,IACzE,SAAS,WAAW;AAAA,IACpB,YACE,WAAW,cAAc,QAAQ,IAAI,4BAA4B,yBAAyB;AAAA,IAC5F,MAAM,WAAW,QAAQ;AAAA,MACvB,SAAS,CAAC,UAAU,CAAC,CAAC;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AACF;AAKO,SAAS,cAAc,QAA4B;AACxD,MAAI,OAAO,YAAY,YAAY;AACjC;AAAA,EACF;AAEA,KAAG,UAAU,KAAK,QAAQ,OAAO,OAAO,GAAG,EAAE,WAAW,KAAK,CAAC;AAChE;AA9IA,IA4BI,sBACA;AA7BJ;AAAA;AAAA;AAAA;AAAA;;;ACAA,SAAS,YAAY,WAAW,cAAc,YAAY,qBAAqB;AAC/E,SAAS,eAAe;AACxB,SAAS,SAAS,YAAY;AAWvB,SAAS,gBAAwB;AACtC,QAAM,WAAW,QAAQ,IAAI;AAC7B,MAAI,YAAY,SAAS,KAAK,GAAG;AAC/B,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,QAAQ,GAAG,eAAe;AACxC;AAEO,SAAS,iBAAyB;AACvC,QAAM,eAAe,QAAQ,IAAI;AACjC,MAAI,gBAAgB,aAAa,KAAK,GAAG;AACvC,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,cAAc,GAAG,cAAc;AAC7C;AAEO,SAAS,oBAA0C;AACxD,QAAM,cAAc,eAAe;AACnC,MAAI,CAAC,WAAW,WAAW,GAAG;AAC5B,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,aAAa,aAAa,OAAO,CAAC;AAC5D,QACE,OAAO,OAAO,SAAS,YACvB,OAAO,OAAO,QAAQ,YACtB,OAAO,OAAO,UAAU,YACxB,OAAO,OAAO,qBAAqB,YACnC,OAAO,OAAO,cAAc,UAC5B;AACA,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,MAAM,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAAA,MACtD,MAAM,OAAO;AAAA,MACb,KAAK,OAAO;AAAA,MACZ,OAAO,OAAO;AAAA,MACd,kBAAkB,OAAO;AAAA,MACzB,WAAW,OAAO;AAAA,IACpB;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,mBAAmB,QAA6B;AAC9D,QAAM,cAAc,eAAe;AACnC,QAAM,aAAa,QAAQ,WAAW;AACtC,MAAI,CAAC,WAAW,UAAU,GAAG;AAC3B,cAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,EAC3C;AAEA,gBAAc,aAAa,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG,OAAO;AACrE;AAEO,SAAS,sBAA4B;AAC1C,QAAM,cAAc,eAAe;AACnC,MAAI,WAAW,WAAW,GAAG;AAC3B,eAAW,WAAW;AAAA,EACxB;AACF;AA7EA;AAAA;AAAA;AAAA;AAAA;;;ACAA,SAAS,SAAS;AAAlB,IAMa;AANb;AAAA;AAAA;AAMO,IAAM,qBAAqB,EAAE,OAAO;AAAA;AAAA,MAEzC,OAAO,EACJ,KAAK;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC,EACA,SAAS;AAAA;AAAA,MAGZ,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;AAAA;AAAA,MAG1D,gBAAgB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA;AAAA,MAG7C,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,IACrD,CAAC;AAAA;AAAA;;;AC3BD,IAEa;AAFb;AAAA;AAAA;AAEO,IAAM,uBAAuC;AAAA,MAClD,oBAAoB,CAAC;AAAA,MACrB,gBAAgB;AAAA,IAClB;AAAA;AAAA;;;ACFO,SAAS,iCACd,QACA,KACA;AACA,QAAM,MAAM,mBAAmB,MAAM,MAAM;AAC3C,QAAM,QAAQ,IAAI,SAAS,IAAI;AAE/B,SAAO;AAAA,IACL,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA,IAAI;AAAA,MACJ;AAAA,MACA;AAAA,MACA,GAAI,QAAQ,CAAC,WAAW,KAAK,IAAI,CAAC;AAAA,MAClC,GAAI,IAAI,kBAAkB,CAAC;AAAA,IAC7B;AAAA,IACA,KAAK,IAAI;AAAA,IACT,KAAK;AAAA,MACH,GAAI,IAAI,WAAW,CAAC;AAAA,MACpB,GAAI,IAAI,SAAS,EAAE,mBAAmB,IAAI,OAAO,IAAI,CAAC;AAAA,MACtD,yBAAyB,IAAI;AAAA,IAC/B;AAAA,EACF;AACF;AA3BA;AAAA;AAAA;AACA;AAAA;AAAA;;;ACDA,IAMa,uBA8DA;AApEb;AAAA;AAAA;AAEA;AACA;AACA;AAEO,IAAM,wBAAwB;AAAA,MACnC,eAAe,CAAC,KAAK;AAAA,MACrB,iBAAiB,CAAC,kCAAkC,gCAAgC;AAAA,MACpF,SAAS;AAAA,QACP,UAAU;AAAA,QACV,eAAe;AAAA,UACb,KAAK;AAAA,QACP;AAAA,MACF;AAAA,MACA,YAAY;AAAA,QACV,OAAO;AAAA,UACL;AAAA,YACE,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,eAAe;AAAA,YACf,kBAAkB,CAAC,QAAQ;AAAA,YAC3B,SAAS;AAAA,YACT,MAAM,CAAC,WAAW,QAAQ,qBAAqB,WAAW,UAAU;AAAA,UACtE;AAAA,UACA;AAAA,YACE,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,eAAe;AAAA,YACf,kBAAkB,CAAC,KAAK;AAAA,YACxB,SAAS;AAAA,YACT,MAAM,CAAC,WAAW,MAAM,2BAA2B;AAAA,UACrD;AAAA,QACF;AAAA,QACA,QAAQ;AAAA,UACN;AAAA,YACE,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,eAAe;AAAA,YACf,kBAAkB,CAAC,MAAM;AAAA,YACzB,SAAS;AAAA,YACT,MAAM,CAAC,WAAW,MAAM;AAAA,UAC1B;AAAA,UACA;AAAA,YACE,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,eAAe;AAAA,YACf,kBAAkB,CAAC,KAAK;AAAA,YACxB,SAAS;AAAA,YACT,MAAM,CAAC,WAAW,MAAM,2BAA2B;AAAA,UACrD;AAAA,QACF;AAAA,QACA,OAAO;AAAA,UACL;AAAA,YACE,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,eAAe;AAAA,YACf,kBAAkB,CAAC,KAAK;AAAA,YACxB,SAAS;AAAA,YACT,MAAM,CAAC,WAAW,MAAM,2BAA2B;AAAA,UACrD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAKO,IAAM,mBAAuC;AAAA;AAAA,MAElD,IAAI;AAAA,MACJ,aAAa;AAAA,MACb,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,SAAS;AAAA;AAAA,MAGT,aAAa,QAAwB,KAAK;AACxC,cAAM,MAAM,mBAAmB,MAAM,MAAM;AAC3C,cAAM,WAAW,IAAI,QAAQ,CAAC,WAAW,IAAI,KAAK,IAAI,CAAC;AAEvD,eAAO;AAAA,UACL,MAAM,CAAC,UAAU,GAAG,UAAU,GAAI,IAAI,kBAAkB,CAAC,CAAE;AAAA,UAC3D,KAAK;AAAA,YACH,GAAI,IAAI,WAAW,CAAC;AAAA,YACpB,yBAAyB,IAAI;AAAA,UAC/B;AAAA,UACA,KAAK,IAAI;AAAA,QACX;AAAA,MACF;AAAA,MAEA,4BAA4B;AAAA;AAAA,MAG5B,cAAc;AAAA,MACd,eAAe,CAAC;AAAA;AAAA,MAGhB,kBAAkB,CAAC,QAAQ;AAAA,MAC3B,gBAAgB;AAAA,IAClB;AAAA;AAAA;;;ACpGA,SAAS,KAAAC,UAAS;AAAlB,IAKa;AALb,IAAAC,sBAAA;AAAA;AAAA;AAKO,IAAM,oBAAoBD,GAAE,OAAO;AAAA,MACxC,OAAOA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,MAClC,gBAAgBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,MAC9C,SAASA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,IACtD,CAAC;AAAA;AAAA;;;ACTD,IASa,mBAkBA,oBAgBA;AA3Cb;AAAA;AAAA;AASO,IAAM,oBAA8B;AAAA;AAAA,MAEzC;AAAA;AAAA,MAGA;AAAA;AAAA,MAGA;AAAA;AAAA,MAGA;AAAA,IACF;AAMO,IAAM,qBAA+B;AAAA;AAAA,MAE1C;AAAA,MACA;AAAA;AAAA,MAGA;AAAA;AAAA,MAGA;AAAA;AAAA,IACF;AAMO,IAAM,iBAAiB;AAAA;AAAA;;;AC7BvB,SAAS,gCACd,QACA,KACA;AACA,QAAM,MAAM,kBAAkB,MAAM,MAAM;AAE1C,SAAO;AAAA,IACL,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAI,IAAI,QAAQ,CAAC,MAAM,IAAI,KAAK,IAAI,CAAC;AAAA,MACrC,GAAG,IAAI;AAAA,MACP,IAAI;AAAA,IACN;AAAA,IACA,KAAK,IAAI;AAAA,IACT,KAAK;AAAA,MACH,GAAG,IAAI;AAAA,MACP,GAAI,IAAI,SAAS,EAAE,gBAAgB,IAAI,OAAO,IAAI,CAAC;AAAA,MACnD,yBAAyB,IAAI;AAAA,IAC/B;AAAA,EACF;AACF;AAvCA,IAAAE,wBAAA;AAAA;AAAA;AACA,IAAAC;AAAA;AAAA;;;ACDA,IAMa,sBA8DA;AApEb,IAAAC,mBAAA;AAAA;AAAA;AAEA,IAAAC;AACA;AACA,IAAAC;AAEO,IAAM,uBAAuB;AAAA,MAClC,eAAe,CAAC,KAAK;AAAA,MACrB,iBAAiB,CAAC,kCAAkC,+BAA+B;AAAA,MACnF,SAAS;AAAA,QACP,UAAU;AAAA,QACV,eAAe;AAAA,UACb,KAAK;AAAA,QACP;AAAA,MACF;AAAA,MACA,YAAY;AAAA,QACV,OAAO;AAAA,UACL;AAAA,YACE,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,eAAe;AAAA,YACf,kBAAkB,CAAC,QAAQ;AAAA,YAC3B,SAAS;AAAA,YACT,MAAM,CAAC,WAAW,QAAQ,qBAAqB,WAAW,UAAU;AAAA,UACtE;AAAA,UACA;AAAA,YACE,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,eAAe;AAAA,YACf,kBAAkB,CAAC,KAAK;AAAA,YACxB,SAAS;AAAA,YACT,MAAM,CAAC,WAAW,MAAM,eAAe;AAAA,UACzC;AAAA,QACF;AAAA,QACA,QAAQ;AAAA,UACN;AAAA,YACE,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,eAAe;AAAA,YACf,kBAAkB,CAAC,MAAM;AAAA,YACzB,SAAS;AAAA,YACT,MAAM,CAAC,WAAW,MAAM;AAAA,UAC1B;AAAA,UACA;AAAA,YACE,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,eAAe;AAAA,YACf,kBAAkB,CAAC,KAAK;AAAA,YACxB,SAAS;AAAA,YACT,MAAM,CAAC,WAAW,MAAM,eAAe;AAAA,UACzC;AAAA,QACF;AAAA,QACA,OAAO;AAAA,UACL;AAAA,YACE,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,eAAe;AAAA,YACf,kBAAkB,CAAC,KAAK;AAAA,YACxB,SAAS;AAAA,YACT,MAAM,CAAC,WAAW,MAAM,eAAe;AAAA,UACzC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAKO,IAAM,kBAAsC;AAAA;AAAA,MAEjD,IAAI;AAAA,MACJ,aAAa;AAAA,MACb,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,SAAS;AAAA;AAAA,MAGT,aAAa,QAAwB,KAAK;AACxC,cAAM,MAAM,kBAAkB,MAAM,MAAM;AAE1C,eAAO;AAAA,UACL,MAAM,CAAC,SAAS,GAAG,IAAI,cAAc;AAAA,UACrC,KAAK;AAAA,YACH,GAAG,IAAI;AAAA,YACP,yBAAyB,IAAI;AAAA,UAC/B;AAAA,UACA,KAAK,IAAI;AAAA,QACX;AAAA,MACF;AAAA;AAAA,MAGA,4BAA4B;AAAA;AAAA,MAG5B,cAAc;AAAA,MACd,eAAe;AAAA,QACb,gBAAgB,CAAC;AAAA,QACjB,SAAS,CAAC;AAAA,MACZ;AAAA;AAAA,MAGA,kBAAkB,CAAC,OAAO;AAAA,MAC1B,gBAAgB;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AC3GA,IAea;AAfb;AAAA;AAAA;AAEA;AACA,IAAAC;AAYO,IAAM,mBAAyC,CAAC,kBAAkB,eAAe;AAAA;AAAA;;;ACfxF;AAAA;AAAA;AAGA;AACA;AAEA,IAAAC;AACA,IAAAC;AACA;AAUA;AAAA;AAAA;;;AClBA,SAAS,OAAO,eAAe;AAE/B,SAAS,mBAAmBC,QAAuB;AACjD,SAAO,eAAe,KAAKA,MAAI;AACjC;AAEA,SAAS,wBAAwBA,QAAsB;AACrD,MAAI,aAAaA,OAAK,QAAQ,OAAO,GAAG;AAExC,MAAI,iBAAiB,KAAK,UAAU,GAAG;AACrC,iBAAa,WAAW,MAAM,CAAC;AAAA,EACjC;AAEA,MAAI,WAAW,WAAW,IAAI,GAAG;AAC/B,iBAAa,KAAK,MAAM,UAAU,WAAW,MAAM,CAAC,CAAC,CAAC;AAAA,EACxD,OAAO;AACL,iBAAa,MAAM,UAAU,UAAU;AAAA,EACzC;AAEA,MAAI,mBAAmB,UAAU,KAAK,WAAW,WAAW,IAAI,GAAG;AACjE,iBAAa,WAAW,YAAY;AAAA,EACtC;AAEA,SAAO;AACT;AAEA,SAAS,uBAAuB,WAAkC;AAChE,MAAI;AAEJ,MAAI;AACF,UAAM,IAAI,IAAI,SAAS;AAAA,EACzB,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,MAAI,IAAI,aAAa,SAAS;AAC5B,WAAO;AAAA,EACT;AAEA,QAAMA,SAAO,GAAG,IAAI,OAAO,KAAK,IAAI,IAAI,KAAK,EAAE,GAAG,mBAAmB,IAAI,QAAQ,CAAC;AAClF,SAAO,wBAAwBA,MAAI;AACrC;AAEA,SAAS,kBAAkB,OAAuB;AAChD,QAAM,wBAAwB,kBAAkB,KAAK,KAAK,KAAK,QAAQ,KAAK,KAAK;AACjF,SAAO,wBAAwB,wBAAwB,QAAQ,QAAQ,KAAK,CAAC;AAC/E;AAEO,SAAS,kBACd,WACA,QAA4B,QAAQ,KAAK,CAAC,GACjC;AACT,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,uBAAuB,SAAS;AAEnD,MAAI,eAAe,MAAM;AACvB,WAAO;AAAA,EACT;AAEA,SAAO,eAAe,kBAAkB,KAAK;AAC/C;AA/DA;AAAA;AAAA;AAAA;AAAA;;;ACYO,SAAS,yBACd,SACA,WAA4B,QAAQ,UAC3B;AACT,SAAO,aAAa,WAAW,kBAAkB,IAAI,QAAQ,YAAY,CAAC;AAC5E;AAjBA,IAUM;AAVN;AAAA;AAAA;AAUA,IAAM,oBAAoB,oBAAI,IAAI,CAAC,QAAQ,OAAO,KAAK,CAAC;AAAA;AAAA;;;ACGxD,YAAYC,SAAQ;AACpB,YAAYC,WAAU;AAiBf,SAAS,iBACd,MACA,OAA6B,CAAC,GACpB;AACV,QAAM,WAAW,KAAK,YAAY,QAAQ;AAC1C,MAAI,aAAa,SAAS;AACxB,WAAO,CAAC,GAAG,IAAI;AAAA,EACjB;AACA,QAAM,UAAU,KAAK,CAAC;AACtB,MAAI,YAAY,QAAW;AACzB,WAAO,CAAC;AAAA,EACV;AACA,QAAM,WAAW,KAAK,MAAM,CAAC;AAE7B,QAAMC,gBAAe,KAAK,iBAAiB,CAAC,SAAoB,iBAAa,MAAM,MAAM;AACzF,QAAMC,eAAa,KAAK,cAAiB;AACzC,QAAM,UAAU,KAAK,WAAW,QAAQ,IAAI,QAAQ,QAAQ,IAAI,QAAQ;AACxE,QAAM,UAAU,KAAK,WAAW,QAAQ,IAAI,WAAW;AAEvD,QAAM,WAAW,sBAAsB,SAAS,SAAS,SAASA,YAAU;AAC5E,MAAI,CAAC,UAAU;AAEb,WAAO,CAAC,GAAG,IAAI;AAAA,EACjB;AAEA,QAAM,MAAW,YAAM,QAAQ,QAAQ,EAAE,YAAY;AACrD,MAAI,QAAQ,UAAU,QAAQ,QAAQ;AACpC,WAAO,CAAC,UAAU,GAAG,QAAQ;AAAA,EAC/B;AACA,MAAI,QAAQ,UAAU,QAAQ,QAAQ;AACpC,QAAI;AACJ,QAAI;AACF,gBAAUD,cAAa,QAAQ;AAAA,IACjC,QAAQ;AACN,aAAO,CAAC,WAAW,MAAM,MAAM,MAAM,UAAU,GAAG,QAAQ;AAAA,IAC5D;AACA,UAAM,SAAS,aAAa,UAAU,OAAO;AAC7C,QAAI,QAAQ;AACV,aAAO,CAAC,OAAO,MAAM,OAAO,OAAO,GAAG,QAAQ;AAAA,IAChD;AACA,WAAO,CAAC,WAAW,MAAM,MAAM,MAAM,UAAU,GAAG,QAAQ;AAAA,EAC5D;AAGA,SAAO,CAAC,GAAG,IAAI;AACjB;AAEO,SAAS,aAAa,UAAkB,SAAuC;AACpF,QAAM,SAAc,YAAM,QAAQ,QAAQ;AAG1C,QAAM,aAAa,QAAQ,MAAM,0BAA0B;AAC3D,QAAM,WAAW,aAAa,CAAC;AAC/B,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,eAAe,UAAU,MAAM;AAI7C,QAAM,YAAY,QAAQ,MAAM,yBAAyB,KAAK,QAAQ,MAAM,oBAAoB;AAChG,QAAM,UAAU,YAAY,CAAC;AAC7B,QAAM,OAAO,UAAU,eAAe,SAAS,MAAM,IAAI;AAEzD,SAAO,EAAE,MAAM,MAAM;AACvB;AAEA,SAAS,eAAe,OAAe,QAAwB;AAG7D,QAAM,eAAe,OAAO,SAAS,IAAI,IAAI,SAAS,GAAG,MAAM;AAC/D,MAAI,WAAW;AACf,aAAW,SAAS,QAAQ,WAAW,YAAY;AACnD,aAAW,SAAS,QAAQ,WAAW,YAAY;AAEnD,MAAS,YAAM,WAAW,QAAQ,GAAG;AACnC,WAAY,YAAM,UAAU,QAAQ;AAAA,EACtC;AACA,SAAY,YAAM,QAAQ,QAAQ,QAAQ;AAC5C;AAEA,SAAS,aAAa,SAA2B;AAC/C,SAAO,QACJ,MAAM,GAAG,EACT,IAAI,CAAC,UAAU,MAAM,KAAK,EAAE,YAAY,CAAC,EACzC,OAAO,CAAC,UAAU,MAAM,SAAS,CAAC;AACvC;AAEA,SAAS,sBACP,SACA,SACA,SACAC,cACe;AACf,QAAM,SAAc,YAAM,QAAQ,OAAO,EAAE,SAAS;AACpD,QAAM,aAAa,aAAa,OAAO;AAEvC,MAAS,YAAM,WAAW,OAAO,GAAG;AAClC,QAAIA,aAAW,OAAO,GAAG;AACvB,aAAO;AAAA,IACT;AACA,QAAI,CAAC,QAAQ;AACX,iBAAW,OAAO,YAAY;AAC5B,cAAM,YAAY,UAAU;AAC5B,YAAIA,aAAW,SAAS,GAAG;AACzB,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,QACV,MAAM,GAAG,EACT,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,EACvB,OAAO,CAAC,QAAQ,IAAI,SAAS,CAAC;AAEjC,aAAW,OAAO,MAAM;AACtB,QAAI,QAAQ;AACV,YAAM,YAAiB,YAAM,KAAK,KAAK,OAAO;AAC9C,UAAIA,aAAW,SAAS,GAAG;AACzB,eAAO;AAAA,MACT;AACA;AAAA,IACF;AACA,eAAW,OAAO,YAAY;AAC5B,YAAM,YAAiB,YAAM,KAAK,KAAK,UAAU,GAAG;AACpD,UAAIA,aAAW,SAAS,GAAG;AACzB,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AApKA,IAgBM;AAhBN;AAAA;AAAA;AAgBA,IAAM,kBAAkB;AAAA;AAAA;;;AChBxB,IAAAC,YAAA;AAAA;AAAA;AAAA;AACA;AAKA;AAAA;AAAA;;;ACSA,SAAS,eAAe;AAuBjB,SAAS,iBAAiB,UAAwC;AACvE,QAAM,MAAM,QAAQ,QAAQ,EAAE,YAAY;AAC1C,SAAO,kBAAkB,GAAG,KAAK;AACnC;AAzCA,IA2BM;AA3BN;AAAA;AAAA;AA2BA,IAAM,oBAAmD;AAAA,MACvD,QAAQ,EAAE,MAAM,aAAa,cAAc,MAAM;AAAA,MACjD,QAAQ,EAAE,MAAM,cAAc,cAAc,MAAM;AAAA,MAClD,SAAS,EAAE,MAAM,cAAc,cAAc,MAAM;AAAA,MACnD,QAAQ,EAAE,MAAM,aAAa,cAAc,MAAM;AAAA,MACjD,SAAS,EAAE,MAAM,cAAc,cAAc,MAAM;AAAA,MACnD,QAAQ,EAAE,MAAM,aAAa,cAAc,MAAM;AAAA,MACjD,QAAQ,EAAE,MAAM,gBAAgB,cAAc,MAAM;AAAA,MACpD,QAAQ,EAAE,MAAM,iBAAiB,cAAc,KAAK;AAAA,IACtD;AAAA;AAAA;;;AChCA,SAAS,kBAAkB;AAC3B,SAAS,YAAY,YAAY,aAAa,aAAa,OAAO,IAAI,YAAY;AAClF,SAAS,WAAAC,UAAS,YAAY,UAAU,WAAAC,gBAAe;AAgCvD,eAAe,SAASC,QAAc;AACpC,MAAI;AACF,WAAO,MAAM,KAAKA,MAAI;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,WAAW,UAAkB,SAAgC;AACjF,QAAM,MAAM,YAAY,UAAU,OAAO;AACzC,QAAM,WAAW,MAAM,SAAS,GAAG;AAEnC,MAAI,UAAU;AACZ,UAAM,EAAE,MAAM,kBAAkB,SAAS,sBAAsB;AAAA,EACjE;AAEA,QAAM,MAAMF,SAAQ,GAAG,GAAG,EAAE,WAAW,KAAK,CAAC;AAC7C,QAAM,YAAY,KAAK,IAAI,OAAO;AACpC;AAEA,eAAsB,gBAAgB,UAAkB,SAAgC;AACtF,QAAM,MAAM,YAAY,UAAU,OAAO;AACzC,QAAM,WAAW,MAAM,SAAS,GAAG;AAEnC,MAAI,UAAU;AACZ,UAAM,EAAE,MAAM,kBAAkB,SAAS,2BAA2B;AAAA,EACtE;AAEA,QAAM,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AACtC;AAEA,eAAsB,YAAY,UAAkB,SAAgC;AAClF,QAAM,MAAM,YAAY,UAAU,OAAO;AACzC,QAAM,WAAW,MAAM,SAAS,GAAG;AAEnC,MAAI,CAAC,UAAU;AACb,UAAM,EAAE,MAAM,aAAa,SAAS,mBAAmB;AAAA,EACzD;AAEA,QAAM,GAAG,KAAK,EAAE,WAAW,KAAK,CAAC;AACnC;AAUO,SAAS,YAAY,MAAc,SAAyB;AACjE,QAAM,UAAUC,SAAQ,IAAI;AAC5B,QAAM,MAAMA,SAAQ,SAAS,OAAO;AAGpC,QAAM,MAAM,SAAS,SAAS,GAAG;AACjC,MAAI,QAAQ,QAAQ,IAAI,WAAW,KAAK,GAAG,EAAE,KAAK,WAAW,GAAG,GAAG;AACjE,UAAM,EAAE,MAAM,eAAe,SAAS,8BAA8B;AAAA,EACtE;AAEA,SAAO;AACT;AAcA,eAAsB,SACpB,aACA,UACA,SACyB;AACzB,QAAM,MAAM,YAAY,UAAU,OAAO;AAEzC,QAAM,YAAY,iBAAiB,OAAO;AAC1C,MAAI,WAAW;AACb,UAAM,QAAQ,MAAM,WAAW,GAAG;AAClC,UAAM,SAAS,IAAI,gBAAgB;AAAA,MACjC;AAAA,MACA,MAAM;AAAA,IACR,CAAC;AACD,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM,UAAU;AAAA,MAChB,KAAK,aAAa,OAAO,SAAS,CAAC;AAAA,MACnC,MAAM,MAAM;AAAA,MACZ,cAAc,UAAU;AAAA,MACxB,SAAS,WAAW,QAAQ,EAAE,OAAO,KAAK,EAAE,OAAO,KAAK;AAAA,IAC1D;AAAA,EACF;AAEA,QAAM,UAAU,MAAM,WAAW,KAAK,OAAO;AAC7C,QAAM,WAAW,WAAW,QAAQ,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK;AAElE,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,UAAU;AAAA,EACZ;AACF;AAaA,eAAsB,UACpB,UACA,SACA,SACA,UAC0B;AAC1B,QAAM,MAAM,YAAY,UAAU,OAAO;AAGzC,MAAI,UAAU;AACZ,UAAM,UAAU,MAAM,WAAW,KAAK,OAAO,EAAE,MAAM,MAAM,EAAE;AAC7D,UAAM,cAAc,WAAW,QAAQ,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK;AAErE,QAAI,gBAAgB,UAAU;AAC5B,YAAM;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,SAAS;AAAA,UACP,cAAc;AAAA,UACd,YAAY;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,MAAMD,SAAQ,GAAG,GAAG,EAAE,WAAW,KAAK,CAAC;AAG7C,QAAM,YAAY,KAAK,SAAS,OAAO;AACvC,QAAM,UAAU,WAAW,QAAQ,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK;AAEjE,SAAO,EAAE,QAAQ;AACnB;AAhMA;AAAA;AAAA;AAOA;AAAA;AAAA;;;ACcA,SAAS,wBAAwB;AACjC,SAAS,UAAU,QAAAG,aAAY;AAC/B,SAAS,cAAAC,aAAY,YAAAC,iBAAgB;AAKrC,SAAS,iBAAiB,UAAkB,YAA6B;AACvE,QAAM,MAAMA,UAAS,UAAU,UAAU;AACzC,SAAO,QAAQ,QAAQ,CAAC,IAAI,WAAW,KAAK,GAAG,EAAE,KAAK,CAACD,YAAW,GAAG;AACvE;AAOO,SAAS,wBACd,KACA,MACA;AACA,MAAI;AAAA,IACF;AAAA,IACA,OAAO,SAA0D,UAAwB;AACvF,YAAM,EAAE,aAAa,MAAM,QAAQ,IAAI,QAAQ;AAE/C,UAAI,CAAC,eAAe,CAAC,SAAS;AAC5B,eAAO,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,oCAAoC,CAAC;AAAA,MACzF;AAEA,YAAM,YAAY,KAAK,aAAa,IAAI,WAAW;AACnD,UAAI,CAAC,WAAW;AACd,eAAO,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,sBAAsB,CAAC;AAAA,MAC3E;AAEA,YAAM,WAAW,iBAAiB,OAAO;AACzC,UAAI,CAAC,UAAU;AAIb,eAAO,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,eAAe,CAAC;AAAA,MACpE;AAEA,UAAI;AACJ,UAAI;AACF,kBAAU,YAAY,UAAU,MAAM,OAAO;AAAA,MAC/C,QAAQ;AACN,eAAO,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,cAAc,CAAC;AAAA,MACnE;AAEA,UAAI;AACF,cAAM,CAAC,mBAAmB,aAAa,IAAI,MAAM,QAAQ,IAAI;AAAA,UAC3D,SAAS,UAAU,IAAI;AAAA,UACvB,SAAS,OAAO;AAAA,QAClB,CAAC;AAED,YAAI,CAAC,iBAAiB,mBAAmB,aAAa,GAAG;AACvD,iBAAO,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,cAAc,CAAC;AAAA,QACnE;AAAA,MACF,QAAQ;AACN,eAAO,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,YAAY,CAAC;AAAA,MACjE;AAEA,UAAI;AACJ,UAAI;AACF,cAAM,QAAQ,MAAMD,MAAK,OAAO;AAChC,YAAI,CAAC,MAAM,OAAO,GAAG;AACnB,iBAAO,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,aAAa,CAAC;AAAA,QAClE;AACA,mBAAW,MAAM;AAAA,MACnB,QAAQ;AACN,eAAO,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,YAAY,CAAC;AAAA,MACjE;AAIA,YACG,OAAO,gBAAgB,SAAS,IAAI,EACpC,OAAO,kBAAkB,OAAO,QAAQ,CAAC,EACzC,OAAO,iBAAiB,UAAU,EAClC,OAAO,0BAA0B,SAAS;AAE7C,aAAO,MAAM,KAAK,iBAAiB,OAAO,CAAC;AAAA,IAC7C;AAAA,EACF;AACF;AA1GA;AAAA;AAAA;AAwBA;AACA;AAAA;AAAA;;;ACzBA,IAAa,kBACA,yBACA,gBACA,qBACA;AAJb;AAAA;AAAA;AAAO,IAAM,mBAAmB;AACzB,IAAM,0BAA0B,MAAM,OAAO;AAC7C,IAAM,iBAAiB,KAAK,OAAO;AACnC,IAAM,sBAAsB;AAC5B,IAAM,sBAAsB;AAAA;AAAA;;;ACJnC,SAAS,kBAAkB;AAC3B,SAAS,OAAO,SAAAG,cAAa;AAC7B,OAAOC,WAAU;AAMV,SAAS,qBAAqBC,QAAuB;AAC1D,MAAI,YAAY;AAEhB,aAAW,QAAQA,OAAM,KAAK,GAAG;AAC/B,iBAAa,mBAAmB,KAAK,IAAI,IAAI,OAAO;AAAA,EACtD;AAEA,cAAY,UAAU,QAAQ,QAAQ,EAAE;AAExC,MAAI,UAAU,WAAW,KAAK,WAAW,KAAK,SAAS,GAAG;AACxD,WAAO;AAAA,EACT;AAEA,MAAI,UAAU,UAAU,qBAAqB;AAC3C,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,UAAU,YAAY,GAAG;AACzC,MAAI,UAAU,KAAK,UAAU,SAAS,WAAW,IAAI;AACnD,UAAM,MAAM,UAAU,MAAM,OAAO;AACnC,UAAM,OAAO,UAAU,MAAM,GAAG,sBAAsB,IAAI,MAAM;AAChE,WAAO,OAAO;AAAA,EAChB;AAEA,SAAO,UAAU,MAAM,GAAG,mBAAmB;AAC/C;AAEO,SAAS,oBAAoB,IAAkB;AACpD,MAAI,CAAC,gBAAgB,KAAK,EAAE,GAAG;AAC7B,UAAM,IAAI,MAAM,yBAAyB,KAAK,UAAU,EAAE,CAAC,EAAE;AAAA,EAC/D;AACF;AA+CA,eAAe,2BAA2B,aAAoC;AAC5E,QAAM,OAAO,MAAM,MAAM,WAAW;AACpC,MAAI,KAAK,eAAe,GAAG;AACzB,UAAM,IAAI,MAAM,iDAAiD,WAAW,EAAE;AAAA,EAChF;AACA,MAAI,CAAC,KAAK,YAAY,GAAG;AACvB,UAAM,IAAI,MAAM,2CAA2C,WAAW,EAAE;AAAA,EAC1E;AACF;AAEA,eAAsB,oBAAoB,SAAiBC,YAAkC;AAC3F,QAAM,eAAeF,MAAK,QAAQ,OAAO;AACzC,QAAM,iBAAiBA,MAAK,QAAQE,UAAS;AAE7C,MAAI,mBAAmB,gBAAgB,CAAC,eAAe,WAAW,GAAG,YAAY,GAAGF,MAAK,GAAG,EAAE,GAAG;AAC/F,UAAM,IAAI,MAAM,oCAAoC,cAAc,EAAE;AAAA,EACtE;AAEA,MAAI;AACF,UAAM,2BAA2B,YAAY;AAAA,EAC/C,SAAS,OAAO;AACd,UAAM,OAAQ,MAAgC;AAC9C,QAAI,SAAS,UAAU;AACrB,YAAM;AAAA,IACR;AACA,UAAMD,OAAM,cAAc,EAAE,WAAW,KAAK,CAAC;AAC7C,UAAM,2BAA2B,YAAY;AAAA,EAC/C;AAEA,QAAMI,YAAWH,MAAK,SAAS,cAAc,cAAc;AAC3D,MAAI,CAACG,WAAU;AACb;AAAA,EACF;AAEA,MAAI,UAAU;AACd,aAAW,WAAWA,UAAS,MAAMH,MAAK,GAAG,GAAG;AAC9C,cAAUA,MAAK,KAAK,SAAS,OAAO;AAEpC,QAAI;AACF,YAAM,2BAA2B,OAAO;AACxC;AAAA,IACF,SAAS,OAAO;AACd,YAAM,OAAQ,MAAgC;AAC9C,UAAI,SAAS,UAAU;AACrB,cAAM;AAAA,MACR;AAAA,IACF;AAEA,QAAI;AACF,YAAMD,OAAM,OAAO;AAAA,IACrB,SAAS,OAAO;AACd,YAAM,OAAQ,MAAgC;AAC9C,UAAI,SAAS,UAAU;AACrB,cAAM;AAAA,MACR;AAAA,IACF;AAEA,UAAM,2BAA2B,OAAO;AAAA,EAC1C;AACF;AAEO,SAAS,mBAAmBE,QAA0D;AAC3F,sBAAoBA,OAAM,WAAW;AAErC,QAAM,MAAMA,OAAM,OAAO,oBAAI,KAAK;AAClC,QAAM,UAAU,IAAI,YAAY,EAAE,MAAM,GAAG,EAAE;AAC7C,QAAM,MAAMD,MAAK,KAAKC,OAAM,YAAYA,OAAM,aAAa,OAAO;AAClE,QAAM,gBAAgB,qBAAqBA,OAAM,YAAY;AAC7D,QAAM,QAAQ,WAAW,EAAE,QAAQ,MAAM,EAAE,EAAE,MAAM,GAAG,CAAC;AACvD,QAAM,eAAeD,MAAK,QAAQ,KAAK,GAAG,KAAK,IAAI,aAAa,EAAE;AAClE,QAAM,cAAc,GAAGA,MAAK,QAAQC,OAAM,UAAU,CAAC,GAAGD,MAAK,GAAG;AAEhE,MAAI,CAAC,aAAa,WAAW,WAAW,GAAG;AACzC,UAAM,IAAI,MAAM,+CAA+C,YAAY,EAAE;AAAA,EAC/E;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAxKA,IAIM,qBACA,oBACA;AANN;AAAA;AAAA;AAIA,IAAM,sBAAsB;AAC5B,IAAM,qBAAqB;AAC3B,IAAM,kBAAkB;AAAA;AAAA;;;ACNxB,SAAS,SAAS,MAAAI,KAAI,OAAO,QAAAC,OAAM,cAAc;AACjD,OAAOC,WAAU;AAgBjB,eAAe,mBAAmB,MAAoC;AACpE,MAAI;AACJ,MAAI;AACF,cAAU,MAAM,QAAQ,MAAM,EAAE,eAAe,KAAK,CAAC;AAAA,EACvD,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,UAAU;AACtD,aAAO,CAAC;AAAA,IACV;AACA,UAAM;AAAA,EACR;AAEA,QAAM,QAAqB,CAAC;AAC5B,aAAW,SAAS,SAAS;AAC3B,UAAM,YAAYA,MAAK,KAAK,MAAM,MAAM,IAAI;AAC5C,QAAI,MAAM,YAAY,GAAG;AACvB,YAAM,KAAK,GAAI,MAAM,mBAAmB,SAAS,CAAE;AACnD;AAAA,IACF;AAEA,QAAI,CAAC,MAAM,OAAO,GAAG;AACnB;AAAA,IACF;AAEA,UAAM,WAAW,MAAMD,MAAK,SAAS;AACrC,UAAM,KAAK;AAAA,MACT,SAAS;AAAA,MACT,MAAM,SAAS;AAAA,MACf,SAAS,SAAS;AAAA,IACpB,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,eAAe,sBAAsB,MAA6B;AAChE,MAAI;AACJ,MAAI;AACF,cAAU,MAAM,QAAQ,MAAM,EAAE,eAAe,KAAK,CAAC;AAAA,EACvD,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,UAAU;AACtD;AAAA,IACF;AACA,UAAM;AAAA,EACR;AAEA,aAAW,SAAS,SAAS;AAC3B,QAAI,CAAC,MAAM,YAAY,GAAG;AACxB;AAAA,IACF;AACA,UAAM,sBAAsBC,MAAK,KAAK,MAAM,MAAM,IAAI,CAAC;AAAA,EACzD;AAEA,QAAM,mBAAmB,MAAM,QAAQ,IAAI,EAAE,MAAM,MAAM,CAAC,CAAa;AACvE,MAAI,iBAAiB,WAAW,GAAG;AACjC,UAAM,MAAM,IAAI,EAAE,MAAM,MAAM,MAAS;AAAA,EACzC;AACF;AAEA,eAAsB,uBACpB,YACA,aACe;AACf,sBAAoB,WAAW;AAC/B,QAAM,SAASA,MAAK,KAAK,YAAY,WAAW;AAChD,QAAMF,IAAG,QAAQ,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACnD;AAEA,eAAsB,iBACpB,YACA,aACA,UACA,QACe;AACf,sBAAoB,WAAW;AAC/B,QAAM,SAASE,MAAK,KAAK,YAAY,WAAW;AAChD,QAAM,QAAQ,MAAM,mBAAmB,MAAM;AAC7C,QAAM,aAAa,MAAM,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,MAAM,CAAC;AAEjE,MAAI,cAAc,UAAU;AAC1B;AAAA,EACF;AAEA,QAAM,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,OAAO;AAC1C,MAAI,iBAAiB;AAErB,aAAW,QAAQ,OAAO;AACxB,QAAI,kBAAkB,UAAU;AAC9B;AAAA,IACF;AAEA,QAAI;AACF,YAAM,OAAO,KAAK,OAAO;AACzB,wBAAkB,KAAK;AAAA,IACzB,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,EAAE,KAAK,OAAO,MAAM,KAAK,QAAQ;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,sBAAsB,MAAM;AACpC;AAEA,eAAsB,aAAa,YAAoB,QAAsC;AAC3F,QAAM,WAAW,KAAK,IAAI,IAAI,mBAAmB;AAEjD,MAAI;AACJ,MAAI;AACF,uBAAmB,MAAM,QAAQ,YAAY,EAAE,eAAe,KAAK,CAAC;AAAA,EACtE,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,UAAU;AACtD;AAAA,IACF;AACA,YAAQ,KAAK,EAAE,KAAK,OAAO,WAAW,GAAG,iCAAiC;AAC1E;AAAA,EACF;AAEA,aAAW,kBAAkB,kBAAkB;AAC7C,QAAI,CAAC,eAAe,YAAY,GAAG;AACjC;AAAA,IACF;AAEA,UAAM,eAAeA,MAAK,KAAK,YAAY,eAAe,IAAI;AAC9D,UAAM,cAAc,MAAM,QAAQ,cAAc,EAAE,eAAe,KAAK,CAAC,EAAE;AAAA,MACvE,MAAM,CAAC;AAAA,IACT;AAEA,eAAW,aAAa,aAAa;AACnC,UAAI,CAAC,UAAU,YAAY,GAAG;AAC5B;AAAA,MACF;AAEA,YAAM,UAAUA,MAAK,KAAK,cAAc,UAAU,IAAI;AACtD,YAAM,QAAQ,MAAM,mBAAmB,OAAO;AAE9C,iBAAW,QAAQ,OAAO;AACxB,YAAI,KAAK,WAAW,UAAU;AAC5B;AAAA,QACF;AAEA,YAAI;AACF,gBAAM,OAAO,KAAK,OAAO;AAAA,QAC3B,SAAS,OAAO;AACd,kBAAQ,KAAK,EAAE,KAAK,OAAO,UAAU,KAAK,QAAQ,GAAG,4BAA4B;AAAA,QACnF;AAAA,MACF;AAEA,YAAM,sBAAsB,OAAO;AAAA,IACrC;AAEA,QAAI,uBAAuB,KAAK,eAAe,IAAI,GAAG;AACpD,YAAM,iBAAiB,YAAY,eAAe,MAAM,yBAAyB,MAAM;AAAA,IACzF;AAEA,UAAM,sBAAsB,YAAY;AAAA,EAC1C;AACF;AA9KA,IAeM;AAfN;AAAA;AAAA;AAEA;AACA;AAYA,IAAM,yBAAyB;AAAA;AAAA;;;ACf/B,SAAS,yBAAyB;AAClC,SAAS,MAAAC,KAAI,QAAAC,OAAM,aAAAC,kBAAiB;AACpC,SAAS,gBAAgB;AAuBzB,SAAS,uBACP,UACA,UACA,KACQ;AACR,QAAM,UAAU,UAAU,KAAK;AAC/B,MAAI,SAAS;AACX,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,IAAI,YAAY,EAAE,MAAM,IAAI,EAAE,EAAE,QAAQ,MAAM,EAAE;AAC/D,MAAI,MAAM;AACV,MAAI,aAAa,aAAa;AAC5B,UAAM;AAAA,EACR,WAAW,aAAa,cAAc;AACpC,UAAM;AAAA,EACR,WAAW,aAAa,cAAc;AACpC,UAAM;AAAA,EACR,WAAW,aAAa,mBAAmB;AACzC,UAAM;AAAA,EACR;AAEA,SAAO,cAAc,MAAM,IAAI,GAAG;AACpC;AAEA,eAAe,oBAAoB,OAA0C;AAC3E,QAAM,QAAQ,IAAI,MAAM,IAAI,CAAC,SAASF,IAAG,KAAK,MAAM,EAAE,OAAO,KAAK,CAAC,CAAC,CAAC;AACvE;AAEA,SAAS,iBAAiB,SAAmD;AAC3E,QAAM,SAAS,QAAQ;AACvB,MAAI,UAAU,OAAO,OAAO,SAAS,YAAY;AAC/C,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,eAAe,iBACb,OACA,SACA,YACA,OACA;AACA,QAAM,oBAAoB,OAAO;AACjC,SAAO,MAAM,OAAO,UAAU,EAAE,KAAK,EAAE,IAAI,OAAO,MAAM,CAAC;AAC3D;AAEA,SAAS,mBAAmB,MAAY,aAAyD;AAC/F,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,aAAa,IAAI,WAAW,KAAK;AAC/C;AAEA,eAAe,2BACb,MACA,aACA,OACA,SACiC;AACjC,QAAM,YAAY,mBAAmB,MAAM,WAAW;AACtD,MAAI,CAAC,WAAW;AACd,UAAM,iBAAiB,OAAO,SAAS,KAAK,qBAAqB;AACjE,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,gBACP,oBACA,iBACqB;AACrB,MAAI,CAAC,oBAAoB;AACvB,WAAO;AAAA,EACT;AACA,SAAO,uBAAuB,kBAAkB,qBAAqB;AACvE;AAEO,SAAS,qBAAqB,KAAsB,MAAkB;AAC3E,MAAI,KAAK,gBAAgB,OAAO,SAAyB,UAAwB;AAC/E,QAAI,CAAC,QAAQ,YAAY,GAAG;AAC1B,aAAO,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,qBAAqB,CAAC;AAAA,IAC1E;AAEA,QAAI;AACJ,QAAI,qBAAqB;AACzB,QAAI,YAAY;AAChB,UAAM,UAA8B,CAAC;AACrC,UAAM,SAAS,iBAAiB,OAAO;AAEvC,QAAI;AACF,YAAM,QAAQ,QAAQ,MAAM;AAC5B,uBAAiB,QAAQ,OAAO;AAC9B,YAAI,KAAK,SAAS,WAAW,KAAK,cAAc,eAAe;AAC7D,gBAAM,oBAAoB,gBAAgB,aAAa,OAAO,KAAK,KAAK,CAAC;AACzE,cAAI,sBAAsB,YAAY;AACpC,mBAAO,iBAAiB,OAAO,SAAS,KAAK,oBAAoB;AAAA,UACnE;AACA,wBAAc;AACd,cAAI,CAAC,mBAAmB,MAAM,WAAW,GAAG;AAC1C,mBAAO,iBAAiB,OAAO,SAAS,KAAK,qBAAqB;AAAA,UACpE;AACA,+BAAqB;AACrB;AAAA,QACF;AAEA,YAAI,KAAK,SAAS,WAAW,KAAK,cAAc,SAAS;AACvD,cAAI,CAAC,aAAa;AAChB,mBAAO,iBAAiB,OAAO,SAAS,KAAK,oBAAoB;AAAA,UACnE;AAEA,uBAAa;AACb,cAAI,YAAY,qBAAqB;AACnC,mBAAO,iBAAiB,OAAO,SAAS,KAAK,gBAAgB;AAAA,UAC/D;AAEA,gBAAMG,OAAM,oBAAI,KAAK;AACrB,gBAAMC,gBAAe,uBAAuB,QAAW,KAAK,UAAUD,IAAG;AACzE,gBAAME,UAAS,mBAAmB;AAAA,YAChC,YAAY,KAAK;AAAA,YACjB;AAAA,YACA,cAAAD;AAAA,YACA,KAAAD;AAAA,UACF,CAAC;AAED,cAAI,CAAE,MAAM,2BAA2B,MAAM,aAAa,OAAO,OAAO,GAAI;AAC1E;AAAA,UACF;AAEA,cAAI;AACF,kBAAM,oBAAoB,KAAK,YAAYE,QAAO,GAAG;AACrD,kBAAMH,WAAUG,QAAO,cAAc,OAAO,KAAK,KAAK,CAAC;AAAA,UACzD,SAAS,OAAO;AACd,kBAAML,IAAGK,QAAO,cAAc,EAAE,OAAO,KAAK,CAAC;AAC7C,kBAAM,oBAAoB,OAAO;AACjC,oBAAQ,KAAK,EAAE,KAAK,MAAM,GAAG,qBAAqB;AAClD,mBAAO,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,eAAe,CAAC;AAAA,UACpE;AAEA,cAAI;AACF,kBAAM,WAAW,MAAMJ,MAAKI,QAAO,YAAY;AAC/C,oBAAQ,KAAK;AAAA,cACX,MAAMA,QAAO;AAAA,cACb,cAAAD;AAAA,cACA,MAAM,SAAS;AAAA,YACjB,CAAC;AAAA,UACH,SAAS,OAAO;AACd,kBAAMJ,IAAGK,QAAO,cAAc,EAAE,OAAO,KAAK,CAAC;AAC7C,kBAAM,oBAAoB,OAAO;AACjC,oBAAQ,KAAK,EAAE,KAAK,MAAM,GAAG,oBAAoB;AACjD,mBAAO,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,eAAe,CAAC;AAAA,UACpE;AAEA;AAAA,QACF;AAEA,YAAI,KAAK,SAAS,UAAU,KAAK,cAAc,SAAS;AACtD,cAAI,KAAK,SAAS,QAAQ;AACxB,iBAAK,KAAK,OAAO;AAAA,UACnB;AACA;AAAA,QACF;AAEA,YAAI,CAAC,aAAa;AAChB,eAAK,KAAK,OAAO;AACjB,iBAAO,iBAAiB,OAAO,SAAS,KAAK,oBAAoB;AAAA,QACnE;AAEA,qBAAa;AACb,YAAI,YAAY,qBAAqB;AACnC,eAAK,KAAK,OAAO;AACjB,iBAAO,iBAAiB,OAAO,SAAS,KAAK,gBAAgB;AAAA,QAC/D;AAEA,cAAM,MAAM,oBAAI,KAAK;AACrB,cAAM,eAAe,uBAAuB,KAAK,UAAU,KAAK,UAAU,GAAG;AAC7E,cAAM,SAAS,mBAAmB;AAAA,UAChC,YAAY,KAAK;AAAA,UACjB;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAED,YAAI,CAAE,MAAM,2BAA2B,MAAM,aAAa,OAAO,OAAO,GAAI;AAC1E,eAAK,KAAK,OAAO;AACjB;AAAA,QACF;AAEA,YAAI;AACF,gBAAM,oBAAoB,KAAK,YAAY,OAAO,GAAG;AACrD,gBAAM,SAAS,KAAK,MAAM,kBAAkB,OAAO,YAAY,CAAC;AAAA,QAClE,SAAS,OAAO;AACd,gBAAML,IAAG,OAAO,cAAc,EAAE,OAAO,KAAK,CAAC;AAC7C,gBAAM,oBAAoB,OAAO;AACjC,kBAAQ,KAAK,EAAE,KAAK,MAAM,GAAG,qBAAqB;AAClD,iBAAO,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,eAAe,CAAC;AAAA,QACpE;AAEA,YAAI,KAAK,KAAK,WAAW;AACvB,gBAAMA,IAAG,OAAO,cAAc,EAAE,OAAO,KAAK,CAAC;AAC7C,gBAAM,oBAAoB,OAAO;AACjC,iBAAO,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,iBAAiB,CAAC;AAAA,QACtE;AAEA,YAAI;AACF,gBAAM,WAAW,MAAMC,MAAK,OAAO,YAAY;AAC/C,kBAAQ,KAAK;AAAA,YACX,MAAM,OAAO;AAAA,YACb;AAAA,YACA,MAAM,SAAS;AAAA,UACjB,CAAC;AAAA,QACH,SAAS,OAAO;AACd,gBAAMD,IAAG,OAAO,cAAc,EAAE,OAAO,KAAK,CAAC;AAC7C,gBAAM,oBAAoB,OAAO;AACjC,kBAAQ,KAAK,EAAE,KAAK,MAAM,GAAG,oBAAoB;AACjD,iBAAO,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,eAAe,CAAC;AAAA,QACpE;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,YAAM,oBAAoB,OAAO;AACjC,UAAK,MAA4B,SAAS,0BAA0B;AAClE,eAAO,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,iBAAiB,CAAC;AAAA,MACtE;AACA,cAAQ,KAAK,EAAE,KAAK,MAAM,GAAG,qBAAqB;AAClD,aAAO,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,IAAI,OAAO,OAAO,eAAe,CAAC;AAAA,IACpE;AAEA,QAAI,CAAC,aAAa;AAChB,aAAO,iBAAiB,OAAO,SAAS,KAAK,oBAAoB;AAAA,IACnE;AAEA,QAAI,CAAC,oBAAoB;AACvB,aAAO,iBAAiB,OAAO,SAAS,KAAK,qBAAqB;AAAA,IACpE;AAEA,QAAI,QAAQ,WAAW,GAAG;AACxB,aAAO,iBAAiB,OAAO,SAAS,KAAK,UAAU;AAAA,IACzD;AAEA,QAAI,CAAE,MAAM,2BAA2B,MAAM,aAAa,OAAO,OAAO,GAAI;AAC1E;AAAA,IACF;AAEA,SAAK,iBAAiB,KAAK,YAAY,aAAa,yBAAyB,MAAM,EAAE;AAAA,MACnF,CAAC,UAAU,QAAQ,KAAK,EAAE,KAAK,MAAM,GAAG,+BAA+B;AAAA,IACzE;AAEA,WAAO,MAAM,KAAK,EAAE,IAAI,MAAM,OAAO,QAAQ,CAAC;AAAA,EAChD,CAAC;AACH;AApRA;AAAA;AAAA;AAIA;AACA;AACA;AAAA;AAAA;;;ACAA,OAAO,cAAc;AACrB,OAAO,UAAU;AACjB,OAAO,eAAe;AACtB,OAAO,kBAAkB;AACzB,OAAO,eAAmC;AAE1C,OAAO,aAAkE;AAgCzE,eAAsB,gBAAgB,MAAyC;AAC7E,QAAM,MAAM,QAAQ;AAAA,IAClB,QAAQ,KAAK,UAAU;AAAA,MACrB,OAAO;AAAA,MACP,WAAW;AAAA,QACT,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,eAAe;AAAA,UACf,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAGD,QAAM,IAAI,SAAS,eAAgB,SAAS;AAC1C,UAAM,QAAQ,SAAS,WAAW;AAAA,MAChC,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,QAKP,mBAAmB;AAAA,UACjB,WAAW;AAAA,UACX,oBAAoB,EAAE,OAAO,EAAE;AAAA,QACjC;AAAA,MACF;AAAA,IACF,CAAC;AAGD,YAAQ,IAAI,OAAO,EAAE,WAAW,KAAK,GAAG,CAAC,YAAuB,QAAwB;AACtF,WAAK,MAAM,iBAAiB,YAAY,GAAG;AAAA,IAC7C,CAAC;AAAA,EACH,CAAC;AAGD,MAAI;AAAA,IACF;AAAA,IACA,gBAAgB;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,iBAAiB,KAAK;AAAA,MACtB,oBAAoB,KAAK;AAAA,IAC3B,CAAC;AAAA,EACH;AAEA,QAAM,IAAI,SAAS,QAAQ;AAE3B,QAAM,IAAI,SAAS,WAAW;AAAA,IAC5B,QAAQ;AAAA,MACN,UAAU;AAAA,MACV,OAAO;AAAA,IACT;AAAA,IACA,aAAa,CAAC,WAAW,aAAa,aACpC,cAAc,WAAW,gBAAgB,8BAA8B,aAAa;AAAA,EACxF,CAAC;AAGD,QAAM,IAAI,SAAS,MAAM;AAAA,IACvB,QAAQ;AAAA;AAAA,IACR,SAAS,CAAC,OAAO,QAAQ,OAAO,UAAU,SAAS;AAAA,IACnD,gBAAgB,CAAC,gBAAgB,eAAe;AAAA,IAChD,aAAa;AAAA,EACf,CAAC;AAGD,MAAI;AAAA,IACF;AAAA,IACA,wBAAwB;AAAA,MACtB,QAAQ,KAAK;AAAA,MACb,iBAAiB,KAAK;AAAA,MACtB,oBAAoB,KAAK;AAAA,IAC3B,CAAC;AAAA,EACH;AACA,MAAI;AAAA,IACF;AAAA,IACA,mBAAmB;AAAA,MACjB,QAAQ,KAAK;AAAA,MACb,iBAAiB,KAAK;AAAA,MACtB,oBAAoB,KAAK;AAAA,IAC3B,CAAC;AAAA,EACH;AACA,MAAI;AAAA,IACF;AAAA,IACA,wBAAwB;AAAA,MACtB,QAAQ,KAAK;AAAA,MACb,iBAAiB,KAAK;AAAA,MACtB,oBAAoB,KAAK;AAAA,IAC3B,CAAC;AAAA,EACH;AAGA,MAAI,IAAI,YAAY,YAAY;AAC9B,WAAO,EAAE,IAAI,KAAK;AAAA,EACpB,CAAC;AAKD,0BAAwB,KAAK;AAAA,IAC3B,cAAc,KAAK;AAAA,EACrB,CAAC;AAED,uBAAqB,KAAK;AAAA,IACxB,YAAY,KAAK,OAAO;AAAA,IACxB,cAAc,KAAK;AAAA,EACrB,CAAC;AAGD,MAAI,KAAK,SAAS;AAChB,QAAI,SAAS,cAAc;AAAA,MACzB,MAAM,KAAK;AAAA,MACX,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,YAAY,CAAC,cAAc,WAAW;AAAA,MACtC,QAAQ;AAAA,MACR,WAAW;AAAA,IACb,CAAC;AAED,QAAI,SAAS,cAAc;AAAA,MACzB,MAAM,GAAG,KAAK,OAAO;AAAA,MACrB,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,UAAU;AAAA,MACV,eAAe;AAAA,IACjB,CAAC;AAED,QAAI,IAAI,KAAK,OAAO,UAAU,UAAU;AACtC,aAAO,MAAM,SAAS,cAAc;AAAA,QAClC,QAAQ;AAAA,QACR,WAAW;AAAA,MACb,CAAC;AAAA,IACH,CAAC;AAED,QAAI,IAAI,eAAe,OAAO,UAAU,UAAU;AAChD,aAAO,MAAM,SAAS,cAAc;AAAA,QAClC,QAAQ;AAAA,QACR,WAAW;AAAA,MACb,CAAC;AAAA,IACH,CAAC;AAED,QAAI,IAAI,MAAM,OAAO,SAAS,UAAU;AACtC,UAAI,CAAC,4BAA4B,OAAO,GAAG;AACzC,eAAO,MAAM,aAAa;AAAA,MAC5B;AACA,aAAO,MAAM,SAAS,cAAc;AAAA,QAClC,QAAQ;AAAA,QACR,WAAW;AAAA,MACb,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AArMA;AAAA;AAAA;AAaA;AAOA;AACA;AAIA;AACA;AAAA;AAAA;;;AC1BA,IAIM,oBACA,oBACA,kBACA,uBACA,0BACA,cAqCO;AA9Cb;AAAA;AAAA;AAIA,IAAM,qBAAqB;AAC3B,IAAM,qBAAqB;AAC3B,IAAM,mBAAmB;AACzB,IAAM,wBAAwB,IAAI,KAAK;AACvC,IAAM,2BAA2B;AACjC,IAAM,eAAe;AAqCd,IAAM,qBAAN,MAAqD;AAAA,MAa1D,YAA6B,MAAqB;AAArB;AAC3B,aAAK,MAAM,KAAK,OAAO,KAAK;AAC5B,aAAK,SAAS,KAAK,WAAW,MAAM;AACpC,aAAK,eAAe,KAAK,cAAc,WAAW;AAClD,aAAK,gBAAgB,KAAK,eAAe,WAAW;AACpD,aAAK,kBAAkB,KAAK,iBAAiB,WAAW;AACxD,aAAK,iBAAiB,KAAK,gBAAgB,WAAW;AACtD,aAAK,MAAM;AAAA,MACb;AAAA,MAR6B;AAAA,MAZZ,qBAAqB,oBAAI,IAAoB;AAAA,MAC7C,oBAAoB,oBAAI,IAAiC;AAAA,MACzD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,kBAAkB,oBAAI,IAAmC;AAAA,MAClE,YAAmD;AAAA,MACnD,UAAU;AAAA,MAYlB,eAAe,UAAkB,aAA2B;AAC1D,cAAM,sBAAsB,KAAK,mBAAmB,IAAI,QAAQ;AAChE,YAAI,wBAAwB,aAAa;AACvC;AAAA,QACF;AAEA,YAAI,qBAAqB;AACvB,eAAK,iBAAiB,QAAQ;AAAA,QAChC;AAEA,aAAK,mBAAmB,IAAI,UAAU,WAAW;AAEjD,cAAM,QAAQ,KAAK,iBAAiB,WAAW;AAC/C,cAAM,eAAe;AACrB,YAAI,MAAM,gBAAgB,GAAG;AAC3B,gBAAM,UAAU;AAChB,gBAAM,sBAAsB;AAAA,QAC9B;AAEA,aAAK,wBAAwB,OAAO,KAAK;AAAA,MAC3C;AAAA,MAEA,iBAAiB,UAAwB;AACvC,cAAM,cAAc,KAAK,mBAAmB,IAAI,QAAQ;AACxD,YAAI,CAAC,aAAa;AAChB;AAAA,QACF;AAEA,aAAK,mBAAmB,OAAO,QAAQ;AAEvC,cAAM,QAAQ,KAAK,kBAAkB,IAAI,WAAW;AACpD,YAAI,CAAC,OAAO;AACV;AAAA,QACF;AAEA,cAAM,cAAc,KAAK,IAAI,GAAG,MAAM,cAAc,CAAC;AACrD,YAAI,MAAM,gBAAgB,GAAG;AAC3B,gBAAM,UAAU;AAChB,gBAAM,sBAAsB;AAC5B,gBAAM,cAAc;AAAA,QACtB;AAAA,MACF;AAAA,MAEA,qBAAqB,aAA2B;AAC9C,cAAM,QAAQ,KAAK,iBAAiB,WAAW;AAC/C,cAAM,cAAc,MAAM;AAE1B,YAAI,KAAK,WAAW,MAAM,UAAU;AAClC;AAAA,QACF;AAEA,YAAI,gBAAgB,UAAa,KAAK,IAAI,IAAI,cAAc,uBAAuB;AACjF;AAAA,QACF;AAEA,cAAM,QAAQ,KAAK,aAAa,MAAM;AACpC,eAAK,gBAAgB,OAAO,KAAK;AACjC,cAAI,KAAK,SAAS;AAChB;AAAA,UACF;AACA,eAAK,KAAK,eAAe,aAAa,MAAM;AAAA,QAC9C,GAAG,CAAC;AACJ,aAAK,gBAAgB,IAAI,KAAK;AAAA,MAChC;AAAA,MAEA,cAAc,aAA2B;AACvC,cAAM,QAAQ,KAAK,iBAAiB,WAAW;AAC/C,cAAM,cAAc,KAAK,IAAI;AAC7B,cAAM,sBAAsB;AAC5B,cAAM,UAAU;AAChB,cAAM,cAAc;AACpB,aAAK,wBAAwB,OAAO,IAAI;AAAA,MAC1C;AAAA,MAEA,cAAc,aAA2B;AACvC,cAAM,QAAQ,KAAK,iBAAiB,WAAW;AAC/C,cAAM,uBAAuB;AAC7B,cAAM,cAAc;AAEpB,YAAI,MAAM,uBAAuB,0BAA0B;AACzD,gBAAM,UAAU;AAChB;AAAA,QACF;AAEA,aAAK,wBAAwB,OAAO,IAAI;AAAA,MAC1C;AAAA,MAEA,eAAe,aAAyC;AACtD,eAAO,KAAK,kBAAkB,IAAI,WAAW,GAAG;AAAA,MAClD;AAAA,MAEA,MAAM,aAAgB,aAAqB,IAAkC;AAC3E,cAAM,UAAU,MAAM,KAAK,0BAA0B,WAAW;AAChE,YAAI;AACF,iBAAO,MAAM,GAAG;AAAA,QAClB,UAAE;AACA,kBAAQ;AAAA,QACV;AAAA,MACF;AAAA,MAEA,QAAc;AACZ,YAAI,KAAK,WAAW;AAClB;AAAA,QACF;AAEA,aAAK,UAAU;AACf,aAAK,YAAY,KAAK,cAAc,MAAM;AACxC,eAAK,mBAAmB;AAAA,QAC1B,GAAG,gBAAgB;AAAA,MACrB;AAAA,MAEA,OAAa;AACX,YAAI,KAAK,WAAW;AAClB,eAAK,gBAAgB,KAAK,SAAS;AACnC,eAAK,YAAY;AAAA,QACnB;AAEA,aAAK,UAAU;AACf,mBAAW,SAAS,KAAK,iBAAiB;AACxC,eAAK,eAAe,KAAK;AAAA,QAC3B;AACA,aAAK,gBAAgB,MAAM;AAAA,MAC7B;AAAA,MAEQ,qBAA2B;AACjC,cAAM,MAAM,KAAK,IAAI;AAErB,mBAAW,CAAC,aAAa,KAAK,KAAK,KAAK,mBAAmB;AACzD,cAAI,CAAC,KAAK,qBAAqB,KAAK,GAAG;AACrC;AAAA,UACF;AAEA,cAAI,MAAM,gBAAgB,QAAW;AACnC,iBAAK,wBAAwB,OAAO,KAAK;AAAA,UAC3C;AAEA,cAAI,MAAM,gBAAgB,UAAa,MAAM,cAAc,KAAK;AAC9D;AAAA,UACF;AAEA,eAAK,KAAK,eAAe,aAAa,YAAY,MAAM,WAAW;AAAA,QACrE;AAAA,MACF;AAAA,MAEQ,qBAAqB,OAAqC;AAChE,eAAO,KAAK,YAAY,IAAI,KAAK,MAAM,cAAc,KAAK,CAAC,MAAM,YAAY,CAAC,MAAM;AAAA,MACtF;AAAA,MAEQ,wBAAwB,OAA4B,eAA8B;AACxF,cAAM,WAAW,KAAK,YAAY;AAClC,YAAI,YAAY,KAAK,MAAM,eAAe,KAAK,MAAM,WAAW,MAAM,UAAU;AAC9E;AAAA,QACF;AAEA,YAAI,CAAC,iBAAiB,MAAM,gBAAgB,QAAW;AACrD;AAAA,QACF;AAEA,YAAI,MAAM,gBAAgB,QAAW;AACnC,gBAAM,cAAc,KAAK,IAAI;AAC7B;AAAA,QACF;AAEA,cAAM,cAAc,MAAM,cAAc,KAAK,oBAAoB,QAAQ;AACzE,cAAM,cAAc,KAAK,IAAI,KAAK,IAAI,GAAG,WAAW;AAAA,MACtD;AAAA,MAEQ,cAAsB;AAC5B,cAAM,sBAAsB,KAAK,KAAK,aAAa,IAAY,kBAAkB;AACjF,cAAM,YAAY,uBAAuB;AACzC,eAAO,KAAK,IAAI,GAAG,SAAS,IAAI;AAAA,MAClC;AAAA,MAEQ,oBAAoB,UAA0B;AACpD,cAAM,cAAc,KAAK,KAAK,OAAO,IAAI,OAAO,IAAI;AACpD,eAAO,KAAK,MAAM,WAAW,WAAW;AAAA,MAC1C;AAAA,MAEQ,iBAAiB,aAA0C;AACjE,cAAM,gBAAgB,KAAK,kBAAkB,IAAI,WAAW;AAC5D,YAAI,eAAe;AACjB,iBAAO;AAAA,QACT;AAEA,cAAM,QAA6B;AAAA,UACjC,aAAa;AAAA,UACb,qBAAqB;AAAA,UACrB,UAAU;AAAA,UACV,SAAS;AAAA,UACT,SAAS,CAAC;AAAA,QACZ;AACA,aAAK,kBAAkB,IAAI,aAAa,KAAK;AAC7C,eAAO;AAAA,MACT;AAAA,MAEA,MAAc,eACZ,aACA,MACA,aACe;AACf,YAAI,KAAK,SAAS;AAChB;AAAA,QACF;AAEA,cAAM,QAAQ,KAAK,iBAAiB,WAAW;AAC/C,YAAI,MAAM,YAAY,MAAM,SAAS;AACnC;AAAA,QACF;AAEA,YAAI,CAAC,KAAK,KAAK,aAAa,IAAI,WAAW,GAAG;AAC5C,gBAAM,cAAc;AACpB;AAAA,QACF;AAEA,cAAM,KAAK,aAAa,aAAa,YAAY;AAC/C,gBAAM,eAAe,KAAK,iBAAiB,WAAW;AACtD,cAAI,KAAK,WAAW,aAAa,SAAS;AACxC;AAAA,UACF;AAEA,cAAI,CAAC,KAAK,KAAK,aAAa,IAAI,WAAW,GAAG;AAC5C,yBAAa,cAAc;AAC3B;AAAA,UACF;AAEA,cAAI,SAAS,QAAQ;AACnB,kBAAM,cAAc,aAAa;AACjC,gBAAI,gBAAgB,UAAa,KAAK,IAAI,IAAI,cAAc,uBAAuB;AACjF;AAAA,YACF;AAAA,UACF,WACE,gBAAgB,UAChB,aAAa,gBAAgB,UAC7B,aAAa,eAAe,aAC5B;AACA;AAAA,UACF;AAEA,cAAI;AACF,kBAAM,KAAK,KAAK,SAAS,WAAW;AACpC,iBAAK,cAAc,WAAW;AAAA,UAChC,QAAQ;AACN,iBAAK,cAAc,WAAW;AAAA,UAChC;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MAEQ,0BAA0B,aAA0C;AAC1E,cAAM,QAAQ,KAAK,iBAAiB,WAAW;AAE/C,eAAO,IAAI,QAAQ,CAACM,aAAY;AAC9B,gBAAM,QAAQ,MAAM;AAClB,kBAAM,WAAW;AACjB,kBAAM,cAAc;AAEpB,gBAAI,WAAW;AACf,YAAAA,SAAQ,MAAM;AACZ,kBAAI,UAAU;AACZ;AAAA,cACF;AACA,yBAAW;AAEX,oBAAM,OAAO,MAAM,QAAQ,MAAM;AACjC,kBAAI,MAAM;AACR,qBAAK;AACL;AAAA,cACF;AAEA,oBAAM,WAAW;AACjB,mBAAK,wBAAwB,OAAO,IAAI;AAAA,YAC1C,CAAC;AAAA,UACH;AAEA,cAAI,MAAM,UAAU;AAClB,kBAAM,QAAQ,KAAK,KAAK;AACxB;AAAA,UACF;AAEA,gBAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF;AAAA;AAAA;;;AC9VA,SAAS,aAAa;AAgBtB,eAAsB,mBACpB,MACA,MACA,SAC8B;AAC9B,SAAO,IAAI,QAAQ,CAACC,UAAS,WAAW;AACtC,UAAM,QAAQ,MAAM,MAAM,MAAM;AAAA,MAC9B,OAAO,yBAAyB,MAAM,QAAQ,QAAQ;AAAA,MACtD,aAAa,SAAS,eAAe;AAAA,IACvC,CAAC;AAED,UAAM,eAAyB,CAAC;AAChC,UAAM,eAAyB,CAAC;AAEhC,UAAM,QAAQ,GAAG,QAAQ,CAAC,UAA2B;AACnD,mBAAa,KAAK,OAAO,UAAU,WAAW,OAAO,KAAK,KAAK,IAAI,KAAK;AAAA,IAC1E,CAAC;AAED,UAAM,QAAQ,GAAG,QAAQ,CAAC,UAA2B;AACnD,mBAAa,KAAK,OAAO,UAAU,WAAW,OAAO,KAAK,KAAK,IAAI,KAAK;AAAA,IAC1E,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,UAAU;AAC3B;AAAA,QACE,OAAO,OAAO,OAAO;AAAA,UACnB,QAAQ,OAAO,OAAO,YAAY,EAAE,SAAS,MAAM;AAAA,UACnD,QAAQ,OAAO,OAAO,YAAY,EAAE,SAAS,MAAM;AAAA,QACrD,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,YAAM,SAAS,OAAO,OAAO,YAAY,EAAE,SAAS,MAAM;AAC1D,YAAM,SAAS,OAAO,OAAO,YAAY,EAAE,SAAS,MAAM;AAE1D,UAAI,SAAS,GAAG;AACd,QAAAA,SAAQ,EAAE,QAAQ,OAAO,CAAC;AAC1B;AAAA,MACF;AAEA;AAAA,QACE,OAAO,OAAO,IAAI,MAAM,iCAAiC,QAAQ,SAAS,EAAE,GAAG;AAAA,UAC7E,UAAU,QAAQ;AAAA,UAClB;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;AAjEA;AAAA;AAAA;AACA,IAAAC;AAAA;AAAA;;;ACQO,SAAS,2BAA2B,UAA8C;AACvF,SAAO,aAAa,UAAU,UAAU;AAC1C;AAEA,eAAsB,sBACpB,SACA,OAAyB,CAAC,GACR;AAClB,QAAM,WAAW,KAAK,YAAY,QAAQ;AAC1C,QAAMC,cAAa,KAAK,cAAc;AACtC,QAAM,SAAS,2BAA2B,QAAQ;AAElD,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAMA,YAAW,QAAQ,CAAC,OAAO,GAAG,EAAE,aAAa,KAAK,CAAC;AAC5E,WAAO,OAAO,KAAK,EAAE,SAAS;AAAA,EAChC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AA3BA;AAAA;AAAA;AAEA;AAAA;AAAA;;;ACFA,SAAS,WAAW,cAAAC,aAAY,aAAAC,YAAW,gBAAAC,eAAc,iBAAAC,sBAAqB;AAC9E,SAAS,WAAAC,UAAS,QAAAC,aAAY;AA8CvB,SAAS,+BACd,MAAyB,QAAQ,KACH;AAC9B,QAAM,YAAY,IAAI;AACtB,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,IAAI;AACnB,QAAM,eAAe,IAAI;AAEzB,iBAAe,cAAc,kBAAkB,SAAS,WAAW,UAAU,EAAE,EAAE;AAEjF,QAAM,gBAA0C,OAAO,YAAoB;AACzE,UAAM,QAAQ,cAAc,SAAS;AACrC,UAAM,WAAW,MAAM,WAAW,OAAO;AACzC;AAAA,MACE;AAAA,MACA,iBAAiB,OAAO,aAAa,OAAO,QAAQ,CAAC,UAAU,KAAK,UAAU,MAAM,YAAY,CAAC,CAAC,CAAC;AAAA,IACrG;AAEA,QAAI,OAAO,aAAa,WAAW;AACjC,aAAO;AAAA,IACT;AAEA,WAAO,sBAAsB,OAAO;AAAA,EACtC;AAEA,QAAMC,cAA4B,OAAO,MAAM,MAAM,YAAY;AAC/D,UAAM,aAAa,qBAAqB,MAAM,IAAI;AAClD;AAAA,MACE;AAAA,MACA,cAAc,IAAI,IAAI,KAAK,KAAK,GAAG,CAAC,aAAa,cAAc,MAAM;AAAA,IACvE;AACA,QAAI,CAAC,YAAY;AACf,aAAO,mBAAmB,MAAM,MAAM,OAAO;AAAA,IAC/C;AAEA,UAAM,QAAQ,cAAc,SAAS;AACrC,UAAM,WAAW,MAAM,kBAAkB,UAAU;AACnD;AAAA,MACE;AAAA,MACA,YAAY,UAAU,IAAI,KAAK,UAAU,QAAQ,CAAC,UAAU,KAAK,UAAU,KAAK,CAAC;AAAA,IACnF;AACA,QAAI,CAAC,UAAU;AACb,aAAO,mBAAmB,MAAM,MAAM,OAAO;AAAA,IAC/C;AAEA,QAAI,SAAS,WAAW,WAAW;AACjC,qBAAe,WAAW,CAAC,UAAU;AACnC,cAAM,aAAa,CAAC;AACpB,cAAM,SAAS,UAAU,IAAI;AAAA,MAC/B,CAAC;AAED,UAAI,QAAQ;AACV,8BAAsB,QAAQ,UAAU;AAAA,MAC1C;AAEA,qBAAe,cAAc,mBAAmB,UAAU,EAAE;AAE5D,aAAO;AAAA,QACL,QAAQ,aAAa,UAAU;AAAA,QAC/B,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,UAAM,UACJ,SAAS,YACR,SAAS,WAAW,sBAAsB,sBAAsB;AAEnE,UAAM,OAAO,OAAO,IAAI,MAAM,OAAO,GAAG;AAAA,MACtC,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL;AAAA,IACA,YAAAA;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB,MAAc,MAAuC;AACjF,MAAI,SAAS,SAAS,KAAK,WAAW,GAAG;AACvC,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,CAAC,MAAM,aAAa,KAAK,CAAC,MAAM,MAAM;AAC7C,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,KAAK,CAAC;AAC1B,MAAI,gBAAgB,0BAA0B,QAAQ;AACpD,WAAO;AAAA,EACT;AACA,MAAI,gBAAgB,0BAA0B,OAAO;AACnD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,WAAsC;AAC3D,MAAI,CAACN,YAAW,SAAS,GAAG;AAC1B,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,MAAME,cAAa,WAAW,MAAM;AAC1C,MAAI,CAAC,IAAI,KAAK,GAAG;AACf,WAAO,CAAC;AAAA,EACV;AAEA,MAAI;AACF,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,SAAS,OAAO;AACd,UAAM,IAAI;AAAA,MACR,kCAAkC,SAAS,KACzC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CACvD;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,eACP,WACA,SACmB;AACnB,QAAM,YAAY,cAAc,SAAS;AACzC,UAAQ,SAAS;AACjB,EAAAD,WAAUG,SAAQ,SAAS,GAAG,EAAE,WAAW,KAAK,CAAC;AACjD,EAAAD,eAAc,WAAW,KAAK,UAAU,WAAW,MAAM,CAAC,CAAC;AAC3D,SAAO;AACT;AAEA,SAAS,sBAAsB,QAAgB,YAAkC;AAC/E,EAAAF,WAAU,QAAQ,EAAE,WAAW,KAAK,CAAC;AACrC,QAAM,aAAaI,MAAK,QAAQ,UAAU;AAC1C,EAAAF,eAAc,YAAY,yBAAyB,UAAU,GAAG,MAAM;AACtE,YAAU,YAAY,GAAK;AAC7B;AAEA,SAAS,eAAeI,QAA0B,MAAoB;AACpE,MAAI,CAACA,QAAM;AACT;AAAA,EACF;AAEA,EAAAN,WAAUG,SAAQG,MAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5C,EAAAJ,eAAcI,QAAM,GAAG,IAAI;AAAA,GAAM,EAAE,MAAM,IAAI,CAAC;AAChD;AApMA,IAuBM,2BAKA;AA5BN;AAAA;AAAA;AAEA;AACA;AAoBA,IAAM,4BAA4D;AAAA,MAChE,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAEA,IAAM,2BAA2D;AAAA,MAC/D,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQR,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQT;AAAA;AAAA;;;AC7CA,SAAS,cAAAC,mBAAkB;AAqb3B,SAAS,gBAAgB,OAKvB;AACA,MAAI,iBAAiB,OAAO;AAC1B,UAAM,SAAS;AAMf,WAAO;AAAA,MACL,SAAS,MAAM;AAAA,MACf,UACE,OAAO,OAAO,aAAa,WACvB,OAAO,WACP,OAAO,OAAO,SAAS,WACrB,OAAO,OACP;AAAA,MACR,QAAQ,OAAO,UAAU;AAAA,MACzB,QAAQ,OAAO,UAAU;AAAA,IAC3B;AAAA,EACF;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,QAAQ,OAA+C;AAC9D,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AACA,SAAO,MAAM,MAAM,GAAG,aAAa;AACrC;AAEA,SAAS,iBAAiB,KAA6D;AACrF,SAAO;AAAA,IACL,OAAO,IAAI;AAAA,IACX,YAAY,IAAI;AAAA,IAChB,aAAa,CAAC,GAAG,IAAI,WAAW;AAAA,IAChC,QAAQ,IAAI;AAAA,IACZ,eAAe,IAAI;AAAA,IACnB,OAAO,IAAI,MAAM,IAAI,iBAAiB;AAAA,IACtC,SAAS,IAAI,UAAU,aAAa,IAAI,OAAO,IAAI;AAAA,EACrD;AACF;AAEA,SAAS,kBAAkB,MAAgE;AACzF,SAAO;AAAA,IACL,IAAI,KAAK;AAAA,IACT,UAAU,KAAK;AAAA,IACf,MAAM,KAAK;AAAA,IACX,SAAS,KAAK;AAAA,IACd,MAAM,CAAC,GAAG,KAAK,IAAI;AAAA,IACnB,QAAQ,KAAK;AAAA,IACb,WAAW,KAAK;AAAA,IAChB,YAAY,KAAK;AAAA,IACjB,UAAU,KAAK;AAAA,IACf,eAAe,KAAK;AAAA,IACpB,eAAe,KAAK;AAAA,EACtB;AACF;AAEA,SAAS,aAAa,SAAyD;AAC7E,SAAO;AAAA,IACL,MAAM,QAAQ;AAAA,IACd,YAAY,QAAQ;AAAA,IACpB,cAAc,QAAQ;AAAA,IACtB,SAAS,QAAQ;AAAA,IACjB,SAAS,QAAQ;AAAA,IACjB,MAAM,CAAC,GAAG,QAAQ,IAAI;AAAA,IACtB,UAAU,QAAQ;AAAA,IAClB,eAAe,QAAQ;AAAA,IACvB,eAAe,QAAQ;AAAA,IACvB,iBAAiB,CAAC,GAAG,QAAQ,eAAe;AAAA,IAC5C,iBAAiB,CAAC,GAAG,QAAQ,eAAe;AAAA,IAC5C,SAAS;AAAA,MACP,UAAU,QAAQ,QAAQ;AAAA,MAC1B,eAAe,EAAE,GAAG,QAAQ,QAAQ,cAAc;AAAA,IACpD;AAAA,EACF;AACF;AAnhBA,IAcM,eAOO;AArBb;AAAA;AAAA;AAOA;AAKA;AAEA,IAAM,gBAAgB;AAOf,IAAM,yBAAN,MAA6B;AAAA,MACjB,YAAY,oBAAI,IAAgC;AAAA,MAChD,OAAO,oBAAI,IAAwC;AAAA,MACnD,2BAA2B,oBAAI,IAAoB;AAAA,MACnD,6BAA6B,oBAAI,IAGhD;AAAA,MACe;AAAA,MAEjB,YAAY,WAAiC,OAA2B,CAAC,GAAG;AAC1E,aAAK,OAAO;AACZ,mBAAW,YAAY,WAAW;AAChC,eAAK,UAAU,IAAI,SAAS,IAAI,QAAQ;AAAA,QAC1C;AAAA,MACF;AAAA,MAEA,MAAM,MAAM,YAAyD;AACnE,cAAM,YAAY,KAAK,aAAa,UAAU;AAC9C,YAAI,WAAW;AACb,iBAAO,iBAAiB,SAAS;AAAA,QACnC;AAEA,cAAM,gBAAgB,KAAK,2BAA2B,IAAI,UAAU;AACpE,YAAI,eAAe;AACjB,iBAAO,iBAAiB,MAAM,aAAa;AAAA,QAC7C;AAEA,cAAM,eAAe,KAAK,gBAAgB,UAAU;AACpD,aAAK,2BAA2B,IAAI,YAAY,YAAY;AAE5D,YAAI;AACF,iBAAO,iBAAiB,MAAM,YAAY;AAAA,QAC5C,UAAE;AACA,cAAI,KAAK,2BAA2B,IAAI,UAAU,MAAM,cAAc;AACpE,iBAAK,2BAA2B,OAAO,UAAU;AAAA,UACnD;AAAA,QACF;AAAA,MACF;AAAA,MAEA,IAAI,OAAuD;AACzD,cAAM,MAAM,KAAK,KAAK,IAAI,KAAK;AAC/B,eAAO,MAAM,iBAAiB,GAAG,IAAI;AAAA,MACvC;AAAA,MAEA,MAAc,gBAAgB,YAAyD;AACrF,cAAM,WAAW,KAAK,UAAU,IAAI,UAAU;AAC9C,YAAI,CAAC,UAAU;AACb,gBAAM,EAAE,MAAM,oBAAoB,SAAS,uBAAuB,UAAU,GAAG;AAAA,QACjF;AAEA,cAAM,MAAM,MAAM,KAAK,QAAQ,QAAQ;AACvC,aAAK,KAAK,IAAI,IAAI,OAAO,GAAG;AAE5B,YAAI,IAAI,WAAW,UAAU;AAC3B,eAAK,yBAAyB,IAAI,SAAS,IAAI,IAAI,KAAK;AACxD,eAAK,KAAK,eAAe,UAAU,GAAG;AAAA,QACxC;AAEA,eAAO;AAAA,MACT;AAAA,MAEA,MAAc,QAAQ,UAAmE;AACvF,cAAM,WAAW,KAAK,KAAK,YAAY,QAAQ;AAC/C,cAAM,aAAa,SAAS,QAAQ,WAAW,QAAQ,KAAK,CAAC;AAC7D,cAAM,oBAAoB,oBAAI,IAAY;AAE1C,cAAM,0BAA0B,MAAM,KAAK;AAAA,UACzC,SAAS;AAAA,UACT;AAAA,QACF;AACA,YAAI,wBAAwB,WAAW,GAAG;AACxC,iBAAO;AAAA,YACL,OAAOA,YAAW;AAAA,YAClB,YAAY,SAAS;AAAA,YACrB,aAAa,CAAC;AAAA,YACd,QAAQ;AAAA,YACR,OAAO,CAAC;AAAA,UACV;AAAA,QACF;AAEA,cAAM,uBAAuB,MAAM,KAAK;AAAA,UACtC,SAAS,QAAQ;AAAA,UACjB;AAAA,QACF;AAEA,cAAM,qBAAqB,oBAAI,IAAY;AAC3C,mBAAW,YAAY,YAAY;AACjC,qBAAW,WAAW,SAAS,kBAAkB;AAC/C,+BAAmB,IAAI,OAAO;AAAA,UAChC;AAAA,QACF;AAEA,mBAAW,WAAW,oBAAoB;AACxC,cAAI,kBAAkB,IAAI,OAAO,GAAG;AAClC;AAAA,UACF;AACA,cAAI,MAAM,KAAK,cAAc,OAAO,GAAG;AACrC,8BAAkB,IAAI,OAAO;AAAA,UAC/B;AAAA,QACF;AAEA,cAAM,4BAA4B,IAAI,IAAI,uBAAuB;AACjE,cAAM,yBAAyB,IAAI,IAAI,oBAAoB;AAC3D,cAAM,oBAAoB,IAAI,IAAI,iBAAiB;AACnD,cAAM,sBAAsB,oBAAI,IAAY;AAC5C,cAAM,gBAA+C,CAAC;AACtD,YAAI,aAAa;AAEjB,eAAO,YAAY;AACjB,uBAAa;AAEb,qBAAW,YAAY,YAAY;AACjC,gBAAI,oBAAoB,IAAI,SAAS,EAAE,GAAG;AACxC;AAAA,YACF;AAEA,kBAAM,cAAc,SAAS,iBAAiB;AAAA,cAAM,CAAC,YACnD,kBAAkB,IAAI,OAAO;AAAA,YAC/B;AACA,gBAAI,CAAC,aAAa;AAChB;AAAA,YACF;AAEA,gBACE,SAAS,SAAS,kBAClB,uBAAuB,IAAI,SAAS,aAAa,GACjD;AACA,kCAAoB,IAAI,SAAS,EAAE;AACnC,4BAAc;AAAA,gBACZ,KAAK,kBAAkB,SAAS,MAAM,SAAS,eAAe,QAAQ;AAAA,cACxE;AACA,qCAAuB,OAAO,SAAS,aAAa;AACpD,gCAAkB,IAAI,SAAS,aAAa;AAC5C,2BAAa;AACb;AAAA,YACF;AAEA,gBAAI,SAAS,SAAS,cAAc,0BAA0B,IAAI,SAAS,aAAa,GAAG;AACzF,kCAAoB,IAAI,SAAS,EAAE;AACnC,4BAAc;AAAA,gBACZ,KAAK,kBAAkB,SAAS,MAAM,SAAS,eAAe,QAAQ;AAAA,cACxE;AACA,wCAA0B,OAAO,SAAS,aAAa;AACvD,gCAAkB,IAAI,SAAS,aAAa;AAC5C,2BAAa;AAAA,YACf;AAAA,UACF;AAAA,QACF;AAEA,cAAM,QAAQA,YAAW;AACzB,YAAI,uBAAuB,OAAO,GAAG;AACnC,gBAAM,aAAa,KAAK;AAAA,YACtB;AAAA,YACA,CAAC,GAAG,sBAAsB,EAAE,CAAC,KAAK;AAAA,YAClC;AAAA,UACF;AACA,iBAAO;AAAA,YACL;AAAA,YACA,YAAY,SAAS;AAAA,YACrB,aAAa,CAAC,GAAG,mBAAmB;AAAA,YACpC,QAAQ;AAAA,YACR,OAAO,CAAC,GAAG,eAAe,UAAU;AAAA,YACpC,SAAS,KAAK;AAAA,cACZ;AAAA,cACA;AAAA,cACA;AAAA,cACA,kCAAkC,CAAC,GAAG,sBAAsB,EAAE,KAAK,IAAI,CAAC;AAAA,cACxE,CAAC,GAAG,sBAAsB;AAAA,YAC5B;AAAA,UACF;AAAA,QACF;AAEA,YAAI,0BAA0B,OAAO,GAAG;AACtC,gBAAM,aAAa,KAAK;AAAA,YACtB;AAAA,YACA,CAAC,GAAG,yBAAyB,EAAE,CAAC,KAAK;AAAA,YACrC;AAAA,UACF;AACA,iBAAO;AAAA,YACL;AAAA,YACA,YAAY,SAAS;AAAA,YACrB,aAAa,CAAC,GAAG,mBAAmB;AAAA,YACpC,QAAQ;AAAA,YACR,OAAO,CAAC,GAAG,eAAe,UAAU;AAAA,YACpC,SAAS,KAAK;AAAA,cACZ;AAAA,cACA;AAAA,cACA;AAAA,cACA,+CAA+C,CAAC,GAAG,yBAAyB,EAAE,KAAK,IAAI,CAAC;AAAA,cACxF,CAAC,GAAG,yBAAyB;AAAA,YAC/B;AAAA,UACF;AAAA,QACF;AAEA,sBAAc,KAAK;AAAA,UACjB,IAAI,mBAAmB,SAAS,EAAE;AAAA,UAClC,UAAU,gCAAgC,SAAS,EAAE;AAAA,UACrD,MAAM;AAAA,UACN,SAAS,SAAS,iBAAiB,CAAC,KAAK,SAAS;AAAA,UAClD,MAAM,CAAC,WAAW;AAAA,UAClB,QAAQ;AAAA,QACV,CAAC;AACD,eAAO;AAAA,UACL;AAAA,UACA,YAAY,SAAS;AAAA,UACrB,aAAa,CAAC,GAAG,mBAAmB;AAAA,UACpC,QAAQ;AAAA,UACR,eAAe,cAAc,CAAC,GAAG;AAAA,UACjC,OAAO;AAAA,QACT;AAAA,MACF;AAAA,MAEA,MAAc,eACZ,UACA,KACe;AACf,cAAMC,cAAa,KAAK,KAAK,cAAc;AAE3C,YAAI,SAAS;AACb,aAAK,KAAK,IAAI,IAAI,OAAO,GAAG;AAE5B,mBAAW,QAAQ,IAAI,OAAO;AAC5B,cAAI,gBAAgB,KAAK;AACzB,eAAK,SAAS;AACd,eAAK,YAAY,KAAK,IAAI;AAC1B,eAAK,KAAK,IAAI,IAAI,OAAO,GAAG;AAE5B,cAAI;AACF,gBAAI,KAAK,SAAS,UAAU;AAC1B,oBAAM,YAAY,MAAM,KAAK,cAAc,KAAK,OAAO;AACvD,kBAAI,CAAC,WAAW;AACd,qBAAK,SAAS;AACd,qBAAK,aAAa,KAAK,IAAI;AAC3B,oBAAI,SAAS;AACb,oBAAI,UAAU,KAAK;AAAA,kBACjB;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA,oCAAoC,KAAK,OAAO;AAAA,kBAChD,CAAC,KAAK,OAAO;AAAA,gBACf;AACA,qBAAK,eAAe,SAAS,IAAI,IAAI,KAAK;AAC1C,qBAAK,KAAK,IAAI,IAAI,OAAO,GAAG;AAC5B;AAAA,cACF;AAAA,YACF,OAAO;AACL,oBAAM,SAAS,MAAMA,YAAW,KAAK,SAAS,KAAK,MAAM,EAAE,aAAa,KAAK,CAAC;AAC9E,mBAAK,gBAAgB,QAAQ,OAAO,MAAM;AAC1C,mBAAK,gBAAgB,QAAQ,OAAO,MAAM;AAAA,YAC5C;AAEA,iBAAK,SAAS;AACd,iBAAK,WAAW;AAChB,iBAAK,aAAa,KAAK,IAAI;AAC3B,iBAAK,KAAK,IAAI,IAAI,OAAO,GAAG;AAAA,UAC9B,SAAS,OAAO;AACd,kBAAM,UAAU,gBAAgB,KAAK;AACrC,iBAAK,SAAS;AACd,iBAAK,aAAa,KAAK,IAAI;AAC3B,iBAAK,WAAW,QAAQ;AACxB,iBAAK,gBAAgB,QAAQ,QAAQ,MAAM;AAC3C,iBAAK,gBAAgB,QAAQ,QAAQ,UAAU,QAAQ,OAAO;AAC9D,gBAAI,SAAS;AACb,gBAAI,UAAU,KAAK,iBAAiB,UAAU,MAAM,KAAK;AACzD,iBAAK,eAAe,SAAS,IAAI,IAAI,KAAK;AAC1C,iBAAK,KAAK,IAAI,IAAI,OAAO,GAAG;AAC5B;AAAA,UACF;AAAA,QACF;AAEA,YAAI,SAAS;AACb,YAAI,gBAAgB;AACpB,aAAK,eAAe,SAAS,IAAI,IAAI,KAAK;AAC1C,aAAK,KAAK,IAAI,IAAI,OAAO,GAAG;AAAA,MAC9B;AAAA,MAEA,MAAc,eACZ,UACA,mBACmB;AACnB,cAAM,UAAoB,CAAC;AAE3B,mBAAW,WAAW,UAAU;AAC9B,cAAI,MAAM,KAAK,cAAc,OAAO,GAAG;AACrC,+BAAmB,IAAI,OAAO;AAAA,UAChC,OAAO;AACL,oBAAQ,KAAK,OAAO;AAAA,UACtB;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA,MAEA,MAAc,cAAc,SAAmC;AAC7D,cAAM,gBACJ,KAAK,KAAK,kBACT,CAAC,cAAsB,sBAAsB,WAAW,KAAK,IAAI;AACpE,eAAO,cAAc,OAAO;AAAA,MAC9B;AAAA,MAEQ,iBACN,UACA,MACA,OACwB;AACxB,cAAM,UAAU,gBAAgB,KAAK;AACrC,cAAM,WAAW,GAAG,QAAQ,OAAO;AAAA,EAAK,QAAQ,MAAM;AAAA,EAAK,QAAQ,MAAM,GAAG,YAAY;AAExF,YAAI,OAAuC;AAC3C,YACE,SAAS,SAAS,mBAAmB,KACrC,SAAS,SAAS,QAAQ,KAC1B,SAAS,SAAS,OAAO,GACzB;AACA,iBAAO;AAAA,QACT,WACE,SAAS,SAAS,WAAW,KAC7B,SAAS,SAAS,mBAAmB,KACrC,SAAS,SAAS,QAAQ,GAC1B;AACA,iBAAO;AAAA,QACT;AAEA,eAAO,KAAK;AAAA,UACV;AAAA,UACA;AAAA,YACE,GAAG;AAAA,YACH,UAAU,QAAQ;AAAA,YAClB,eAAe,QAAQ,QAAQ,MAAM;AAAA,YACrC,eAAe,QAAQ,QAAQ,UAAU,QAAQ,OAAO;AAAA,UAC1D;AAAA,UACA;AAAA,UACA,QAAQ,WAAW,wBAAwB,KAAK,OAAO;AAAA,UACvD,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MAEQ,cACN,UACA,MACA,MACA,SACA,iBACwB;AACxB,eAAO;AAAA,UACL;AAAA,UACA,YAAY,SAAS;AAAA,UACrB,cAAc,KAAK;AAAA,UACnB;AAAA,UACA,SAAS,KAAK;AAAA,UACd,MAAM,KAAK;AAAA,UACX,UAAU,KAAK;AAAA,UACf,eAAe,KAAK;AAAA,UACpB,eAAe,KAAK;AAAA,UACpB;AAAA,UACA,iBAAiB,SAAS,QAAQ;AAAA,UAClC,SAAS,SAAS,QAAQ;AAAA,QAC5B;AAAA,MACF;AAAA,MAEQ,kBACN,MACA,eACA,UAI6B;AAC7B,eAAO;AAAA,UACL,IAAI,WAAW,IAAI,IAAI,aAAa;AAAA,UACpC,UAAU,yBAAyB,IAAI,IAAI,aAAa;AAAA,UACxD,MAAM;AAAA,UACN,SAAS,SAAS;AAAA,UAClB,MAAM,SAAS;AAAA,UACf,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,MAEQ,gBACN,MACA,eACA,UAC6B;AAC7B,eAAO;AAAA,UACL,IAAI,WAAW,IAAI,IAAI,aAAa;AAAA,UACpC;AAAA,UACA,MAAM;AAAA,UACN,SAAS;AAAA,UACT,MAAM,CAAC;AAAA,UACP,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,MAEQ,eAAe,YAAoB,OAAqB;AAC9D,YAAI,KAAK,yBAAyB,IAAI,UAAU,MAAM,OAAO;AAC3D,eAAK,yBAAyB,OAAO,UAAU;AAAA,QACjD;AAAA,MACF;AAAA,MAEQ,aAAa,YAA4D;AAC/E,cAAM,cAAc,KAAK,yBAAyB,IAAI,UAAU;AAChE,YAAI,CAAC,aAAa;AAChB,iBAAO;AAAA,QACT;AAEA,cAAM,YAAY,KAAK,KAAK,IAAI,WAAW;AAC3C,YAAI,cAAc,UAAU,WAAW,YAAY,UAAU,WAAW,YAAY;AAClF,iBAAO;AAAA,QACT;AAEA,aAAK,yBAAyB,OAAO,UAAU;AAC/C,eAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA;;;ACnbA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA;;;ACmJO,SAAS,sCAAsC,OAAwB;AAC5E,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,KAAK,CAAC,OAAO,cAAc,KAAK,GAAG;AACxF,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,KAAK,QAAQ,uCAAuC;AAC9D,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,8BAA8B,OAAyB;AACrE,SAAO,OAAO,UAAU,YAAY,QAAQ;AAC9C;AAEO,SAAS,+BAA+B,OAAwB;AACrE,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,KAAK,CAAC,OAAO,cAAc,KAAK,GAAG;AACxF,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,KAAK,QAAQ,gCAAgC;AACvD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,+BAA+B,OAAwB;AACrE,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,KAAK,CAAC,OAAO,cAAc,KAAK,GAAG;AACxF,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,KAAK,QAAQ,gCAAgC;AACvD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,gCAAgC,OAAyB;AACvE,SAAO,OAAO,UAAU,YAAY,QAAQ;AAC9C;AAEO,SAAS,uCAAuC,OAAyB;AAC9E,SAAO,OAAO,UAAU,YAAY,QAAQ;AAC9C;AAjMA,IAyIa,2CACA,uCACA,kCACA,oCACA,gCACA,oCACA,gCACA,qCACA,6CAkDA;AAnMb;AAAA;AAAA;AAyIO,IAAM,4CAA4C;AAClD,IAAM,wCAAwC;AAC9C,IAAM,mCAAmC;AACzC,IAAM,qCAAqC;AAC3C,IAAM,iCAAiC;AACvC,IAAM,qCAAqC;AAC3C,IAAM,iCAAiC;AACvC,IAAM,sCAAsC;AAC5C,IAAM,8CAA8C;AAkDpD,IAAM,4BAA8C;AAAA,MACzD,qBAAqB;AAAA,MACrB,4BAA4B;AAAA,MAC5B,kBAAkB;AAAA,MAClB,sBAAsB;AAAA,IACxB;AAAA;AAAA;;;ACdO,SAAS,mBAAmB,KAAiC;AAClE,QAAM,aAAa,IAAI,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACjD,MAAI,CAAC,WAAY,QAAO;AAExB,MAAI,WAAW,UAAU,0BAA0B;AACjD,WAAO;AAAA,EACT;AAGA,SAAO,WAAW,MAAM,GAAG,2BAA2B,CAAC,IAAI;AAC7D;AApMA,IAyFa;AAzFb;AAAA;AAAA;AAyFO,IAAM,2BAA2B;AAAA;AAAA;;;ACzFxC,SAAS,KAAAC,UAAS;AAAlB,IAEa,kCACA,6BAEA,yBA4CA,2BA0BA,2BAiDA,gCAgBA,2BA4DA,gBAQA,eAeA,cASA,kBAMA,oBAMA,eAMA,eAQA;AAlQb;AAAA;AAAA;AAEO,IAAM,mCAAmC;AACzC,IAAM,8BAA8B;AAEpC,IAAM,0BAA0B;AAAA,MACrC,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,UAAU;AAAA,IACZ;AAuCO,IAAM,4BAA4B;AAAA,MACvC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAoBO,IAAM,4BAA4B,CACvC,QACA,YACe;AACf,UAAI,QAAQ,eAAe,OAAO,aAAa;AAC7C,cAAM,IAAI,MAAM,oDAAoD;AAAA,MACtE;AAEA,YAAM,QAAQ,IAAI,WAAW,8BAA8B,QAAQ,UAAU;AAC7E,YAAM,OAAO,IAAI,SAAS,MAAM,MAAM;AACtC,WAAK,SAAS,GAAG,OAAO,OAAO;AAC/B,WAAK,SAAS,GAAG,OAAO,IAAI;AAC5B,WAAK,UAAU,GAAG,OAAO,KAAK;AAC9B,WAAK,UAAU,GAAG,OAAO,IAAI;AAC7B,WAAK,UAAU,GAAG,OAAO,QAAQ;AACjC,WAAK,UAAU,IAAI,OAAO,WAAW;AACrC,YAAM,IAAI,SAAS,2BAA2B;AAC9C,aAAO;AAAA,IACT;AA+BO,IAAM,iCAAiC;AAgBvC,IAAM,4BAA4B,CACvC,QACA,YACe;AACf,UAAI,QAAQ,eAAe,OAAO,aAAa;AAC7C,cAAM,IAAI,MAAM,oDAAoD;AAAA,MACtE;AAEA,YAAM,aAAa,IAAI,YAAY,EAAE,OAAO,OAAO,KAAK;AACxD,YAAM,QAAQ,IAAI;AAAA,QAChB,8BAA8B,WAAW,SAAS,QAAQ;AAAA,MAC5D;AACA,YAAM,OAAO,IAAI,SAAS,MAAM,MAAM;AACtC,WAAK,SAAS,GAAG,8BAA8B;AAC/C,WAAK,SAAS,GAAG,wBAAwB,MAAM;AAC/C,WAAK,UAAU,GAAG,WAAW,QAAQ,KAAK;AAC1C,WAAK,UAAU,GAAG,OAAO,KAAK,KAAK;AACnC,WAAK,UAAU,GAAG,OAAO,UAAU,KAAK;AACxC,WAAK,UAAU,IAAI,QAAQ,YAAY,KAAK;AAC5C,YAAM,IAAI,YAAY,2BAA2B;AACjD,YAAM,IAAI,SAAS,8BAA8B,WAAW,MAAM;AAClE,aAAO;AAAA,IACT;AAsCO,IAAM,iBAAiBA,GAAE,OAAO;AAAA,MACrC,MAAMA,GAAE,QAAQ,SAAS;AAAA,MACzB,IAAIA,GAAE,OAAO,EAAE,KAAK;AAAA,MACpB,IAAIA,GAAE,OAAO;AAAA,MACb,MAAMA,GAAE,QAAQ;AAAA,IAClB,CAAC;AAGM,IAAM,gBAAgBA,GAAE,OAAO;AAAA,MACpC,MAAMA,GAAE,QAAQ,QAAQ;AAAA,MACxB,IAAIA,GAAE,OAAO,EAAE,KAAK;AAAA,MACpB,IAAIA,GAAE,QAAQ;AAAA,MACd,MAAMA,GAAE,QAAQ,EAAE,SAAS;AAAA,MAC3B,OAAOA,GACJ,OAAO;AAAA,QACN,MAAMA,GAAE,OAAO;AAAA,QACf,SAASA,GAAE,OAAO;AAAA,QAClB,SAASA,GAAE,QAAQ,EAAE,SAAS;AAAA,MAChC,CAAC,EACA,SAAS;AAAA,IACd,CAAC;AAGM,IAAM,eAAeA,GAAE,OAAO;AAAA,MACnC,MAAMA,GAAE,QAAQ,OAAO;AAAA,MACvB,OAAOA,GAAE,OAAO;AAAA,MAChB,KAAKA,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,MAClC,WAAWA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,MACrC,MAAMA,GAAE,QAAQ;AAAA,IAClB,CAAC;AAGM,IAAM,mBAAmBA,GAAE,OAAO;AAAA,MACvC,MAAMA,GAAE,QAAQ,WAAW;AAAA,MAC3B,QAAQA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAAA,IAC5B,CAAC;AAGM,IAAM,qBAAqBA,GAAE,OAAO;AAAA,MACzC,MAAMA,GAAE,QAAQ,aAAa;AAAA,MAC7B,QAAQA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAAA,IAC5B,CAAC;AAGM,IAAM,gBAAgBA,GAAE,OAAO;AAAA,MACpC,MAAMA,GAAE,QAAQ,QAAQ;AAAA,MACxB,UAAUA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,OAAO,CAAC;AAAA,IAC3C,CAAC;AAGM,IAAM,gBAAgBA,GAAE,mBAAmB,QAAQ;AAAA,MACxD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAGM,IAAM,gBAAgBA,GAAE,mBAAmB,QAAQ,CAAC,eAAe,YAAY,CAAC;AAAA;AAAA;;;AClQvF,IAEa;AAFb;AAAA;AAAA;AAEO,IAAM,SAAS;AAAA;AAAA,MAEpB,kBAAkB;AAAA,MAClB,iBAAiB;AAAA;AAAA,MAGjB,eAAe,CAAC,OAAe,aAAa,EAAE;AAAA,MAC9C,kBAAkB,CAAC,OAAe,aAAa,EAAE;AAAA,MACjD,mBAAmB,CAAC,OAAe,aAAa,EAAE;AAAA,MAClD,cAAc,CAAC,OAAe,aAAa,EAAE;AAAA;AAAA,MAG7C,cAAc,CAAC,aAAqB,cAClC,aAAa,WAAW,YAAY,SAAS;AAAA,MAC/C,kBAAkB,CAAC,aAAqB,cACtC,aAAa,WAAW,YAAY,SAAS;AAAA,MAC/C,iBAAiB,CAAC,aAAqB,cACrC,aAAa,WAAW,YAAY,SAAS;AAAA,MAC/C,aAAa,CAAC,gBAAwB,aAAa,WAAW;AAAA;AAAA,MAG9D,iBAAiB,CAAC,aAAqB,eACrC,aAAa,WAAW,aAAa,UAAU;AAAA,MACjD,gBAAgB,CAAC,aAAqB,eACpC,aAAa,WAAW,aAAa,UAAU;AAAA,MACjD,cAAc,CAAC,aAAqB,eAClC,aAAa,WAAW,aAAa,UAAU;AAAA,MACjD,cAAc,CAAC,gBAAwB,aAAa,WAAW;AAAA;AAAA,MAG/D,mBAAmB;AAAA;AAAA,MAGnB,iBAAiB,CAAC,aAAqB,cACrC,aAAa,WAAW,YAAY,SAAS;AAAA,MAC/C,iBAAiB,CAAC,aAAqB,cACrC,aAAa,WAAW,YAAY,SAAS;AAAA,IACjD;AAAA;AAAA;;;ACvCA,IAAAC,mBAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAC,wBAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAC,YAAA;AAAA;AAAA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAGA,IAAAC;AACA,IAAAC;AAAA;AAAA;;;ACZA,SAAS,KAAAC,UAAS;AAyBX,SAAS,sBACd,YACuD;AACvD,SAAO,qBAAqB,IAAI,UAAU;AAC5C;AAEO,SAAS,6BAA6B,QAG3C;AACA,QAAM,SAAS,2BAA2B,UAAU,MAAM;AAC1D,SAAO,OAAO,UAAU,OAAO,OAAO,EAAE,gBAAgB,CAAC,EAAE;AAC7D;AAEO,SAAS,0BACd,UACA,QACgB;AAChB,SAAO;AAAA,IACL,GAAI,SAAS;AAAA,IACb,GAAG,6BAA6B,MAAM;AAAA,EACxC;AACF;AAhDA,IAGa,wBAEP,sBAEO,iCAOA,wBAOP;AArBN;AAAA;AAAA;AAGO,IAAM,yBAAyB,CAAC,UAAU,OAAO;AAExD,IAAM,uBAAuB,IAAI,IAAY,sBAAsB;AAE5D,IAAM,kCAAkCA,GAC5C,OAAO;AAAA,MACN,gBAAgBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,MAC7C,SAASA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,IACrD,CAAC,EACA,OAAO;AAEH,IAAM,yBAAyBA,GACnC,OAAO;AAAA,MACN,QAAQ,gCAAgC,SAAS;AAAA,MACjD,OAAO,gCAAgC,SAAS;AAAA,IAClD,CAAC,EACA,OAAO;AAEV,IAAM,6BAA6BA,GAAE,OAAO;AAAA,MAC1C,gBAAgBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,MAC9C,SAASA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,IACrD,CAAC;AAAA;AAAA;;;ACDM,SAAS,aAAa,KAA0B;AACrD,SAAO;AAAA,IACL,IAAI,IAAI;AAAA,IACR,aAAa,IAAI;AAAA,IACjB,YAAY,IAAI;AAAA,IAChB,YAAY,IAAI;AAAA,IAChB,OAAO,IAAI;AAAA,IACX,YAAY,IAAI;AAAA,IAChB,WAAW,IAAI,cAAc,IAAI;AAAA,IACjC,cAAc,IAAI;AAAA,IAClB,SAAS,IAAI,YAAY;AAAA,IACzB,mBAAmB,IAAI,sBAAsB;AAAA,IAC7C,aAAa,IAAI,gBAAgB;AAAA,IACjC,OAAO,IAAI,SAAS;AAAA,IACpB,GAAI,IAAI,SAAS,OAAO,EAAE,OAAO,IAAI,MAAM,IAAI,CAAC;AAAA,EAClD;AACF;AAEO,SAAS,aAAa,SAAmD;AAC9E,SAAO;AAAA,IACL,IAAI,QAAQ;AAAA,IACZ,cAAc,QAAQ;AAAA,IACtB,aAAa,QAAQ;AAAA,IACrB,aAAa,QAAQ;AAAA,IACrB,OAAO,QAAQ;AAAA,IACf,YAAY,QAAQ;AAAA,IACpB,YAAY,QAAQ,aAAa,QAAQ;AAAA,IACzC,gBAAgB,QAAQ;AAAA,IACxB,UAAU,QAAQ,WAAW;AAAA,IAC7B,oBAAoB,QAAQ,qBAAqB;AAAA,IACjD,cAAc,QAAQ,eAAe;AAAA,IACrC,UAAU;AAAA,IACV,OAAO,QAAQ,SAAS;AAAA,IACxB,OAAO,QAAQ,SAAS;AAAA,EAC1B;AACF;AA1DA,IA+Ea;AA/Eb;AAAA;AAAA;AA+EO,IAAM,cAAN,MAAkB;AAAA,MACvB,YAAoB,IAAc;AAAd;AAAA,MAAe;AAAA,MAAf;AAAA;AAAA;AAAA;AAAA,MAKpB,gBAAgB,aAAgC;AAC9C,cAAM,OAAO,KAAK,GACf,QAAQ,wEAAwE,EAChF,IAAI,WAAW;AAClB,eAAO,KAAK,IAAI,YAAY;AAAA,MAC9B;AAAA;AAAA;AAAA;AAAA,MAKA,SAAS,IAAiC;AACxC,cAAM,MAAM,KAAK,GAAG,QAAQ,qCAAqC,EAAE,IAAI,EAAE;AAGzE,eAAO,MAAM,aAAa,GAAG,IAAI;AAAA,MACnC;AAAA;AAAA;AAAA;AAAA,MAKA,iBAAiB,YAAyC;AACxD,cAAM,MAAM,KAAK,GAAG,QAAQ,8CAA8C,EAAE,IAAI,UAAU;AAG1F,eAAO,MAAM,aAAa,GAAG,IAAI;AAAA,MACnC;AAAA;AAAA;AAAA;AAAA,MAKA,sBAAsB,aAAgC;AACpD,cAAM,OAAO,KAAK,GACf;AAAA,UACC;AAAA,QACF,EACC,IAAI,WAAW;AAClB,eAAO,KAAK,IAAI,YAAY;AAAA,MAC9B;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,SAA8B;AACnC,cAAM,OAAO,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA,KAG5B;AAED,aAAK;AAAA,UACH,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,QAAQ,qBAAqB;AAAA,UAC7B,QAAQ,eAAe;AAAA,QACzB;AAEA,eAAO,KAAK,SAAS,QAAQ,EAAE;AAAA,MACjC;AAAA;AAAA;AAAA;AAAA,MAKA,YAAY,IAAY,OAA2B;AACjD,cAAM,OAAO,KAAK,GAAG,QAAQ,4CAA4C;AACzE,aAAK,IAAI,OAAO,EAAE;AAAA,MACpB;AAAA;AAAA;AAAA;AAAA,MAKA,iBAAiB,IAAY,cAA4B;AACvD,cAAM,OAAO,KAAK,GAAG,QAAQ,qDAAqD;AAClF,aAAK,IAAI,cAAc,EAAE;AAAA,MAC3B;AAAA;AAAA;AAAA;AAAA,MAKA,UAAU,IAAY,SAAuB;AAC3C,cAAM,OAAO,KAAK,GAAG,QAAQ,0DAA0D;AACvF,aAAK,IAAI,SAAS,SAAS,EAAE;AAAA,MAC/B;AAAA;AAAA;AAAA;AAAA,MAKA,wBAAwB,IAAY,mBAAiC;AACnE,cAAM,OAAO,KAAK,GAAG,QAAQ,yDAAyD;AACtF,aAAK,IAAI,mBAAmB,EAAE;AAAA,MAChC;AAAA;AAAA;AAAA;AAAA,MAKA,SAAS,IAAY,aAA2B;AAC9C,cAAM,OAAO,KAAK,GAAG,QAAQ,mDAAmD;AAChF,aAAK,IAAI,aAAa,EAAE;AAAA,MAC1B;AAAA;AAAA;AAAA;AAAA,MAKA,QAAQ,IAAkB;AACxB,cAAM,OAAO,KAAK,GAAG,QAAQ,+CAA+C;AAC5E,aAAK,IAAI,EAAE;AAAA,MACb;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,IAAkB;AACvB,cAAM,OAAO,KAAK,GAAG,QAAQ,mCAAmC;AAChE,aAAK,IAAI,EAAE;AAAA,MACb;AAAA,IACF;AAAA;AAAA;;;AC5MA,IASM,qBAEO;AAXb;AAAA;AAAA;AASA,IAAM,sBAAsB;AAErB,IAAM,mBAAN,MAAuB;AAAA,MAK5B,YAA6B,SAAkC;AAAlC;AAAA,MAAmC;AAAA,MAAnC;AAAA,MAJrB,eAAuC;AAAA,MACvC,YAAmC;AAAA,MACnC,eAAe;AAAA,MAIvB,KAAK,OAAqB;AACxB,aAAK,aAAa,SAAS;AAC3B,aAAK,eAAe,GAAG,KAAK,YAAY,GAAG,MAAM,SAAS,MAAM,CAAC,GAAG,MAAM,CAAC,mBAAmB;AAE9F,YAAI,KAAK,kBAAkB,GAAG;AAC5B,eAAK,eAAe;AACpB,eAAK,aAAa,MAAM;AACxB;AAAA,QACF;AAEA,aAAK,qBAAqB;AAAA,MAC5B;AAAA,MAEA,UAAgB;AACd,aAAK,eAAe;AAAA,MACtB;AAAA,MAEQ,aAAa,OAA8B;AACjD,YAAI,KAAK,iBAAiB,OAAO;AAC/B;AAAA,QACF;AAEA,aAAK,eAAe;AACpB,aAAK,QAAQ,cAAc,KAAK;AAAA,MAClC;AAAA,MAEQ,oBAA6B;AACnC,eAAO,KAAK,QAAQ,WAAW,mBAAmB;AAAA,UAAK,CAAC,YACtD,QAAQ,KAAK,KAAK,YAAY;AAAA,QAChC;AAAA,MACF;AAAA,MAEQ,uBAA6B;AACnC,aAAK,eAAe;AACpB,aAAK,YAAY,WAAW,MAAM;AAChC,eAAK,aAAa,MAAM;AAAA,QAC1B,GAAG,KAAK,QAAQ,WAAW,cAAc;AAAA,MAC3C;AAAA,MAEQ,iBAAuB;AAC7B,YAAI,KAAK,cAAc,MAAM;AAC3B;AAAA,QACF;AAEA,qBAAa,KAAK,SAAS;AAC3B,aAAK,YAAY;AAAA,MACnB;AAAA,IACF;AAAA;AAAA;;;ACjDA,SAAS,iBACP,WACA,UACS;AACT,MAAI,CAAC,aAAa,CAAC,UAAU;AAC3B,WAAO;AAAA,EACT;AAEA,SACG,cAAc,aAAa,aAAa,aACxC,cAAc,UAAU,aAAa;AAE1C;AAEO,SAAS,uBACd,KACkB;AAClB,MAAI,YAAiC;AACrC,MAAI,WAAmC;AACvC,MAAI,iBAAgC;AAEpC,QAAM,UAAU,MAAM;AACpB,QAAI,iBAAiB,WAAW,QAAQ,GAAG;AACzC;AAAA,IACF;AAEA,qBAAiB,KAAK,IAAI;AAC1B,QAAI;AAAA,MACF,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA,IAAI;AAAA,IACN,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,iBAAiB,OAAO;AACtB,kBAAY;AACZ,cAAQ;AAAA,IACV;AAAA,IACA,gBAAgB,OAAO;AACrB,iBAAW;AACX,cAAQ;AAAA,IACV;AAAA,IACA,WAAW;AACT,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AApEA;AAAA;AAAA;AAAA;AAAA;;;ACoDA,SAAS,oBAA4B;AACnC,SAAO,QAAQ,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC,CAAC;AACzE;AAtDA,IA8DM,qBAOO,gBA6kBP;AAlpBN;AAAA;AAAA;AAcA,IAAAC;AAEA;AAEA;AAKA;AACA;AAsCA,IAAM,sBAAqC;AAAA,MACzC,MAAM,MAAM;AAAA,MAAC;AAAA,IACf;AAKO,IAAM,iBAAN,MAAqB;AAAA,MAQ1B,YAA6B,MAA0B;AAA1B;AAC3B,aAAK,SAAS,KAAK,UAAU;AAE7B,aAAK,KAAK,SAAS,GAAG,mBAAmB,CAAC,UAA+B;AACvE,eAAK,eAAe,MAAM,YAAY,MAAM,QAAQ;AAAA,QACtD,CAAC;AAAA,MACH;AAAA,MAN6B;AAAA,MAPrB,WAAW,oBAAI,IAA2B;AAAA,MAC1C,oBAAoB,oBAAI,IAAoB;AAAA,MAC5C,YAAY,oBAAI,IAA8B;AAAA,MAC9C,cAAc,oBAAI,IAA8B;AAAA,MAChD,uBAAuB,oBAAI,IAAyB;AAAA,MAC3C;AAAA;AAAA;AAAA;AAAA,MAajB,MAAM,OAAO,KAA6C;AACxD,cAAM,YAAY,kBAAkB;AACpC,cAAM,eAAe,KAAK,gBAAgB,IAAI,YAAY,IAAI,QAAQ;AAGtE,cAAM,MAAM,IAAI,SAAS,aAAa,cAAc;AAAA,UAClD,eAAe,IAAI;AAAA,UACnB;AAAA,QACF,CAAC;AAGD,cAAM,eAA6B;AAAA,UACjC,aAAa,IAAI;AAAA,UACjB,MAAM;AAAA,UACN,MAAM,IAAI;AAAA,UACV,KAAK,IAAI;AAAA,UACT,KAAK;AAAA,YACH,GAAG,IAAI;AAAA,YACP,yBAAyB;AAAA,UAC3B;AAAA,UACA,OAAO,IAAI,SAAS;AAAA,QACtB;AAGA,cAAM,WAAW,KAAK,KAAK,YAAY,OAAO,YAAY;AAI1D,cAAM,SAAS,IAAI,cAAc;AAAA,UAC/B,IAAI;AAAA,UACJ,aAAa,IAAI;AAAA,UACjB,YAAY,IAAI;AAAA,UAChB,YAAY,SAAS;AAAA,UACrB,YAAY,IAAI,SAAS;AAAA,UACzB,OAAO;AAAA,UACP,OAAO,IAAI;AAAA,QACb,CAAC;AAED,aAAK,SAAS,IAAI,WAAW,MAAM;AACnC,aAAK,kBAAkB,IAAI,SAAS,IAAI,SAAS;AACjD,aAAK,qBAAqB,QAAQ,IAAI,QAAQ;AAK9C,aAAK,KAAK,GAAG,OAAO,OAAO,MAAM,CAAC;AAIlC,aAAK,iBAAiB,QAAQ,MAAM,UAAU;AAE9C,eAAO,OAAO,MAAM;AAAA,MACtB;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,KAAK,WAAkC;AAC3C,cAAM,UAAU,KAAK,SAAS,IAAI,SAAS;AAC3C,YAAI,CAAC,SAAS;AACZ,gBAAM,IAAI,MAAM,sBAAsB,SAAS,EAAE;AAAA,QACnD;AAEA,YAAI,QAAQ,UAAU,SAAS;AAC7B,eAAK,kBAAkB,OAAO,QAAQ,UAAU;AAChD,eAAK,gBAAgB,QAAQ,EAAE;AAC/B;AAAA,QACF;AAEA,cAAM,KAAK,KAAK,YAAY,MAAM,QAAQ,UAAU;AAEpD,cAAM,gBAAgB,KAAK,SAAS,IAAI,QAAQ,EAAE;AAClD,YAAI,CAAC,iBAAiB,cAAc,UAAU,SAAS;AACrD;AAAA,QACF;AAEA,aAAK;AAAA,UACH;AAAA,UACA,KAAK,kBAAkB,IAAI,cAAc,UAAU,IAAI,SAAY;AAAA,QACrE;AAAA,MACF;AAAA,MAEA,MAAM,UAAyB;AAC7B,cAAM,oBAAoB,KAAK,KAAK,GAAG,eAAe;AAEtD,mBAAW,WAAW,mBAAmB;AACvC,cAAI,KAAK,SAAS,IAAI,QAAQ,EAAE,GAAG;AACjC;AAAA,UACF;AAEA,gBAAM,YAAY,KAAK,qBAAqB,OAAO;AACnD,gBAAM,WAAW,IAAI,cAAc;AAAA,YACjC,IAAI,QAAQ;AAAA,YACZ,aAAa,QAAQ;AAAA,YACrB,YAAY,QAAQ;AAAA,YACpB,YAAY,QAAQ;AAAA,YACpB,YAAY,QAAQ;AAAA,YACpB,OAAO;AAAA,YACP,OAAO,QAAQ;AAAA,YACf,WAAW,QAAQ;AAAA,YACnB,cAAc,QAAQ;AAAA,YACtB,SAAS,QAAQ;AAAA,YACjB,mBAAmB,QAAQ;AAAA,YAC3B,aAAa,QAAQ;AAAA,UACvB,CAAC;AAED,eAAK,SAAS,IAAI,QAAQ,IAAI,QAAQ;AACtC,eAAK,kBAAkB,IAAI,QAAQ,YAAY,QAAQ,EAAE;AAEzD,cAAI,cAAc,QAAQ,OAAO;AAC/B,iBAAK,KAAK,GAAG,OAAO,QAAQ,IAAI,EAAE,OAAO,UAAU,CAAC;AAAA,UACtD;AAAA,QACF;AAAA,MACF;AAAA,MAEQ,qBAAqB,SAAgC;AAC3D,YAAI,QAAQ,UAAU,SAAS;AAC7B,iBAAO;AAAA,QACT;AAEA,cAAM,iBAAiB,KAAK,KAAK,YAAY,IAAI,QAAQ,UAAU;AACnE,YAAI,gBAAgB,OAAO;AACzB,iBAAO,QAAQ;AAAA,QACjB;AAEA,YAAI,QAAQ,UAAU,SAAS;AAC7B,iBAAO,QAAQ;AAAA,QACjB;AAEA,eAAO;AAAA,MACT;AAAA,MAEQ,gBAAgB,YAAoB,UAA8B;AACxE,eAAO,0BAA0B,UAAU,KAAK,KAAK,mBAAmB,IAAI,UAAU,CAAC;AAAA,MACzF;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,WAAwC;AAC1C,eAAO,KAAK,SAAS,IAAI,SAAS,GAAG,MAAM;AAAA,MAC7C;AAAA;AAAA;AAAA;AAAA,MAKA,gBAAgB,aAAgC;AAC9C,eAAO,MAAM,KAAK,KAAK,SAAS,OAAO,CAAC,EACrC,OAAO,CAAC,MAAM,EAAE,gBAAgB,WAAW,EAC3C,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;AAAA,MACzB;AAAA,MAEA,MAAM,iBAAiB,aAAoC;AACzD,cAAM,WAAW,MAAM,KAAK,KAAK,SAAS,OAAO,CAAC,EAAE;AAAA,UAClD,CAAC,YAAY,QAAQ,gBAAgB;AAAA,QACvC;AAEA,mBAAW,WAAW,UAAU;AAC9B,cAAI,QAAQ,UAAU,SAAS;AAC7B,iBAAK,kBAAkB,OAAO,QAAQ,UAAU;AAChD,iBAAK,gBAAgB,QAAQ,EAAE;AAC/B;AAAA,UACF;AAEA,gBAAM,KAAK,KAAK,QAAQ,EAAE;AAAA,QAC5B;AAAA,MACF;AAAA,MAEA,wBAAwB,aAA2B;AACjD,cAAM,gBAAgB,MAAM,KAAK,KAAK,SAAS,OAAO,CAAC,EAAE;AAAA,UACvD,CAAC,YAAY,QAAQ,gBAAgB,eAAe,QAAQ,UAAU;AAAA,QACxE;AAEA,mBAAW,WAAW,eAAe;AACnC,eAAK,SAAS,OAAO,QAAQ,EAAE;AAC/B,eAAK,kBAAkB,OAAO,QAAQ,UAAU;AAChD,eAAK,gBAAgB,QAAQ,EAAE;AAAA,QACjC;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAWA,gBACE,YACA,WAAkC,UAClC,MACM;AACN,cAAM,YAAY,KAAK,kBAAkB,IAAI,UAAU;AACvD,YAAI,CAAC,UAAW;AAEhB,cAAM,UAAU,KAAK,SAAS,IAAI,SAAS;AAC3C,YAAI,CAAC,QAAS;AAEd,aAAK,2BAA2B,SAAS,UAAU,MAAM,EAAE,mBAAmB,KAAK,CAAC;AAAA,MACtF;AAAA,MAEQ,2BACN,SACA,UACA,MACA,SACM;AACN,YAAI,aAAa,aAAa,aAAa,UAAU;AACnD;AAAA,QACF;AAEA,YAAI,aAAa,mBAAmB;AAClC,cAAI,QAAQ,mBAAmB;AAC7B,oBAAQ,yBAAyB;AACjC,oBAAQ,0BAA0B;AAAA,UACpC;AACA,gBAAMC,QAAO,QAAQ;AACrB,cAAI,QAAQ,UAAU,WAAW;AAC/B,oBAAQ,QAAQ;AAChB,oBAAQ,eAAe,KAAK,IAAI;AAChC,iBAAK,KAAK,GAAG,OAAO,QAAQ,IAAI;AAAA,cAC9B,OAAO;AAAA,cACP,cAAc,QAAQ;AAAA,YACxB,CAAC;AACD,iBAAK,iBAAiB,SAASA,OAAM,SAAS;AAAA,UAChD;AACA;AAAA,QACF;AAEA,YAAI,aAAa,SAAU;AAE3B,cAAM,gBAAgB;AACtB,YAAI,eAAe,KAAK,GAAG;AACzB,kBAAQ,2BAA2B,cAAc,KAAK;AAAA,QACxD;AACA,YAAI,QAAQ,mBAAmB;AAC7B,kBAAQ,yBAAyB;AACjC,kBAAQ,0BAA0B;AAAA,QACpC;AAKA,cAAM,eAAe,KAAK,iBAAiB,SAAS,aAAa;AAEjE,cAAM,OAAO,QAAQ;AACrB,cAAM,eAAe,QAAQ,UAAU,UAAU,QAAQ,UAAU;AAEnE,YAAI,cAAc;AAChB,kBAAQ,QAAQ;AAChB,kBAAQ,eAAe,KAAK,IAAI;AAEhC,eAAK,KAAK,GAAG,OAAO,QAAQ,IAAI;AAAA,YAC9B,OAAO;AAAA,YACP,cAAc,QAAQ;AAAA,UACxB,CAAC;AAED,eAAK,iBAAiB,SAAS,MAAM,SAAS;AAAA,QAChD,WAAW,cAAc;AAIvB,eAAK,iBAAiB,SAAS,MAAM,QAAQ,KAAK;AAAA,QACpD;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,UACE,WACA,OACA,WAAkC,UAClC,eACM;AACN,cAAM,UAAU,KAAK,SAAS,IAAI,SAAS;AAC3C,YAAI,CAAC,SAAS;AACZ,gBAAM,IAAI,MAAM,sBAAsB,SAAS,EAAE;AAAA,QACnD;AAEA,cAAM,OACJ,aAAa,YAAY,aAAa,oBACjC,iBAAiB,MAAM,SAAS,OAAO,IACxC;AACN,cAAM,cAAc,KAAK,6BAA6B,SAAS,QAAQ;AAEvE,YAAI;AACF,eAAK,KAAK,YAAY,MAAM,QAAQ,YAAY,KAAK;AAAA,QACvD,SAAS,OAAO;AACd,wBAAc;AACd,gBAAM;AAAA,QACR;AAEA,aAAK,2BAA2B,SAAS,UAAU,MAAM,EAAE,mBAAmB,MAAM,CAAC;AACrF,aAAK,oBAAoB,OAAO;AAAA,MAClC;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,WAAmB,MAAc,MAAoB;AAC1D,cAAM,UAAU,KAAK,SAAS,IAAI,SAAS;AAC3C,YAAI,CAAC,SAAS;AACZ,gBAAM,IAAI,MAAM,sBAAsB,SAAS,EAAE;AAAA,QACnD;AAEA,aAAK,KAAK,YAAY,OAAO,QAAQ,YAAY,MAAM,IAAI;AAAA,MAC7D;AAAA;AAAA;AAAA;AAAA,MAKA,cAAc,WAAmB,QAAgB,MAAc;AAC7D,cAAM,UAAU,KAAK,SAAS,IAAI,SAAS;AAC3C,YAAI,CAAC,SAAS;AACZ,iBAAO,OAAO,MAAM,CAAC;AAAA,QACvB;AAEA,eAAO,KAAK,KAAK,YAAY,kBAAkB,QAAQ,YAAY,KAAK;AAAA,MAC1E;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,oBAAoB,WAAmB,SAAyC;AACpF,cAAM,UAAU,KAAK,SAAS,IAAI,SAAS;AAC3C,YAAI,CAAC,SAAS;AACZ,iBAAO;AAAA,QACT;AAEA,eAAO,KAAK,KAAK,YAAY,oBAAoB,QAAQ,YAAY,OAAO;AAAA,MAC9E;AAAA;AAAA;AAAA;AAAA,MAKA,4BAA4B,WAAuC;AACjE,eAAO,KAAK,SAAS,IAAI,SAAS,GAAG;AAAA,MACvC;AAAA;AAAA;AAAA;AAAA,MAKA,wBAAwB,YAAwC;AAC9D,eAAO,KAAK,kBAAkB,IAAI,UAAU;AAAA,MAC9C;AAAA;AAAA;AAAA;AAAA;AAAA,MAMQ,iBAAiB,SAAwB,MAAmC;AAClF,YAAI,QAAQ,MAAO,QAAO;AAC1B,YAAI,CAAC,KAAM,QAAO;AAElB,cAAM,QAAQ,mBAAmB,IAAI;AAErC,YAAI,CAAC,MAAO,QAAO;AAEnB,gBAAQ,QAAQ;AAChB,aAAK,KAAK,GAAG,OAAO,QAAQ,IAAI,EAAE,MAAM,CAAC;AACzC,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,eAAe,YAAoB,UAAwB;AACzD,cAAM,YAAY,KAAK,kBAAkB,IAAI,UAAU;AACvD,YAAI,CAAC,UAAW;AAEhB,cAAM,UAAU,KAAK,SAAS,IAAI,SAAS;AAC3C,YAAI,CAAC,QAAS;AAEd,aAAK,cAAc,SAAS,QAAQ;AAAA,MACtC;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,OAAO,WAAyB;AAC9B,cAAM,UAAU,KAAK,SAAS,IAAI,SAAS;AAC3C,YAAI,CAAC,SAAS;AACZ,gBAAM,IAAI,MAAM,sBAAsB,SAAS,EAAE;AAAA,QACnD;AAEA,YAAI,QAAQ,UAAU,SAAS;AAC7B,gBAAM,IAAI,MAAM,mCAAmC,QAAQ,KAAK,EAAE;AAAA,QACpE;AAGA,aAAK,SAAS,OAAO,SAAS;AAC9B,aAAK,kBAAkB,OAAO,QAAQ,UAAU;AAChD,aAAK,gBAAgB,SAAS;AAG9B,aAAK,KAAK,GAAG,OAAO,SAAS;AAG7B,aAAK,KAAK,SAAS,KAAK;AAAA,UACtB,MAAM;AAAA,UACN,aAAa,QAAQ;AAAA,UACrB;AAAA,UACA,OAAO;AAAA,QACT,CAAgB;AAAA,MAClB;AAAA;AAAA;AAAA;AAAA,MAKQ,iBACN,SACA,MACA,IACM;AACN,aAAK,YAAY,IAAI,QAAQ,EAAE,GAAG,iBAAiB,QAAQ,KAAK;AAChE,cAAM,QAAiE;AAAA,UACrE,MAAM;AAAA,UACN,WAAW,QAAQ;AAAA,UACnB,aAAa,QAAQ;AAAA,UACrB,MAAM,QAAQ;AAAA,UACd;AAAA,UACA,SAAS,QAAQ,MAAM;AAAA,QACzB;AACA,aAAK,KAAK,SAAS,KAAK,KAAK;AAAA,MAC/B;AAAA,MAEQ,6BACN,SACA,UACqB;AACrB,YAAI,aAAa,YAAY,aAAa,mBAAmB;AAC3D,iBAAO;AAAA,QACT;AAEA,cAAM,iCAAiC,QAAQ;AAC/C,cAAM,kCAAkC,QAAQ;AAChD,gBAAQ,yBAAyB;AACjC,gBAAQ,0BAA0B;AAElC,eAAO,MAAM;AACX,kBAAQ,yBAAyB;AACjC,kBAAQ,0BAA0B;AAAA,QACpC;AAAA,MACF;AAAA,MAEQ,oBAAoB,SAA8B;AACxD,cAAM,WAAW,KAAK,YAAY,IAAI,QAAQ,EAAE,GAAG,SAAS,EAAE;AAC9D,YAAI,aAAa,QAAQ;AACvB;AAAA,QACF;AAEA,aAAK,wBAAwB,OAAO;AAAA,MACtC;AAAA,MAEQ,wBAAwB,eAAoC;AAClE,cAAM,OAAO,cAAc;AAC3B,YAAI,SAAS,aAAa,SAAS,YAAY;AAC7C;AAAA,QACF;AAEA,YAAI,SAAS,aAAa,CAAC,cAAc,yBAAyB;AAChE;AAAA,QACF;AAEA,cAAM,0BAA0B,SAAS,aAAa,cAAc;AACpE,sBAAc,QAAQ;AACtB,sBAAc,yBAAyB;AACvC,sBAAc,0BAA0B;AACxC,YAAI,CAAC,cAAc,WAAW;AAC5B,wBAAc,YAAY,KAAK,IAAI;AAAA,QACrC;AACA,aAAK,KAAK,GAAG,OAAO,cAAc,IAAI;AAAA,UACpC,OAAO;AAAA,UACP,WAAW,cAAc;AAAA,QAC3B,CAAC;AACD,aAAK,iBAAiB,eAAe,MAAM,MAAM;AACjD,YAAI,yBAAyB;AAC3B,eAAK,KAAK,SAAS,KAAK;AAAA,YACtB,MAAM;AAAA,YACN,aAAa,cAAc;AAAA,YAC3B,WAAW,cAAc;AAAA,YACzB,OAAO;AAAA,UACT,CAAgB;AAAA,QAClB;AAAA,MACF;AAAA,MAEQ,qBAAqB,SAAwB,UAAoC;AACvF,YAAI,CAAC,SAAS,gBAAgB;AAC5B;AAAA,QACF;AAEA,cAAM,aAAa,uBAAuB,CAAC,SAAS;AAClD,eAAK,OAAO;AAAA,YACV;AAAA,cACE,GAAG;AAAA,cACH,WAAW,QAAQ;AAAA,cACnB,YAAY,QAAQ;AAAA,cACpB,YAAY,QAAQ;AAAA,YACtB;AAAA,YACA;AAAA,UACF;AAAA,QACF,CAAC;AAED,cAAM,WAAW,IAAI,iBAAiB;AAAA,UACpC,YAAY,SAAS;AAAA,UACrB,eAAe,CAAC,UAAU;AACxB,kBAAM,gBAAgB,KAAK,SAAS,IAAI,QAAQ,EAAE;AAClD,gBAAI,CAAC,eAAe;AAClB;AAAA,YACF;AAEA,kBAAM,OAAO,cAAc;AAC3B,gBAAI,UAAU,WAAW,SAAS,aAAa,SAAS,aAAa;AACnE,mBAAK,wBAAwB,aAAa;AAAA,YAC5C;AAEA,uBAAW,gBAAgB,KAAK;AAAA,UAClC;AAAA,QACF,CAAC;AAED,cAAM,cAAc,KAAK,KAAK,SAAS,GAAG,mBAAmB,CAAC,UAA+B;AAC3F,cAAI,MAAM,eAAe,QAAQ,YAAY;AAC3C;AAAA,UACF;AAEA,gBAAM,gBAAgB,KAAK,SAAS,IAAI,QAAQ,EAAE;AAClD,cAAI,eAAe,wBAAwB;AACzC,0BAAc,0BAA0B;AAAA,UAC1C;AAEA,mBAAS,KAAK,MAAM,KAAK;AAAA,QAC3B,CAAC;AAED,aAAK,YAAY,IAAI,QAAQ,IAAI,UAAU;AAC3C,aAAK,UAAU,IAAI,QAAQ,IAAI,QAAQ;AACvC,aAAK,qBAAqB,IAAI,QAAQ,IAAI,WAAW;AAAA,MACvD;AAAA,MAEQ,gBAAgB,WAAyB;AAC/C,aAAK,qBAAqB,IAAI,SAAS,IAAI;AAC3C,aAAK,qBAAqB,OAAO,SAAS;AAC1C,aAAK,UAAU,IAAI,SAAS,GAAG,QAAQ;AACvC,aAAK,UAAU,OAAO,SAAS;AAC/B,aAAK,YAAY,OAAO,SAAS;AAAA,MACnC;AAAA,MAEQ,cAAc,SAAwB,UAAoC;AAChF,cAAM,OAAO,QAAQ;AACrB,gBAAQ,QAAQ;AAChB,gBAAQ,UAAU,KAAK,IAAI;AAC3B,gBAAQ,WAAW;AACnB,aAAK,kBAAkB,OAAO,QAAQ,UAAU;AAChD,aAAK,gBAAgB,QAAQ,EAAE;AAE/B,aAAK,KAAK,GAAG,OAAO,QAAQ,IAAI;AAAA,UAC9B,OAAO;AAAA,UACP,SAAS,QAAQ;AAAA,QACnB,CAAC;AAED,aAAK,iBAAiB,SAAS,MAAM,OAAO;AAAA,MAC9C;AAAA,IACF;AAKA,IAAM,gBAAN,MAAoB;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,yBAAyB;AAAA,MACzB,0BAA0B;AAAA,MAE1B,YAAY,MAcT;AACD,aAAK,KAAK,KAAK;AACf,aAAK,cAAc,KAAK;AACxB,aAAK,aAAa,KAAK;AACvB,aAAK,aAAa,KAAK;AACvB,aAAK,aAAa,KAAK;AACvB,aAAK,QAAQ,KAAK;AAClB,aAAK,QAAQ,KAAK;AAClB,aAAK,QAAQ,KAAK;AAClB,aAAK,YAAY,KAAK,aAAa,KAAK,IAAI;AAC5C,aAAK,eAAe,KAAK,gBAAgB,KAAK;AAC9C,aAAK,UAAU,KAAK;AACpB,aAAK,oBAAoB,KAAK;AAC9B,aAAK,cAAc,KAAK;AAAA,MAC1B;AAAA,MAEA,QAAiB;AACf,eAAO;AAAA,UACL,IAAI,KAAK;AAAA,UACT,aAAa,KAAK;AAAA,UAClB,YAAY,KAAK;AAAA,UACjB,YAAY,KAAK;AAAA,UACjB,OAAO,KAAK;AAAA,UACZ,YAAY,KAAK;AAAA,UACjB,WAAW,KAAK,aAAa,KAAK,IAAI;AAAA,UACtC,cAAc,KAAK;AAAA,UACnB,SAAS,KAAK;AAAA,UACd,mBAAmB,KAAK;AAAA,UACxB,aAAa,KAAK;AAAA,UAClB,OAAO,KAAK;AAAA,QACd;AAAA,MACF;AAAA,MAEA,QAAoB;AAClB,eAAO,aAAa;AAAA,UAClB,GAAG,KAAK,MAAM;AAAA,UACd,GAAI,KAAK,UAAU,SAAY,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,QAC1D,CAAC;AAAA,MACH;AAAA,IACF;AAAA;AAAA;;;ACttBO,SAAS,gBAAmB,IAAc,IAAgB;AAC/D,KAAG,KAAK,OAAO;AACf,MAAI;AACF,UAAM,SAAS,GAAG;AAClB,OAAG,KAAK,QAAQ;AAChB,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAI,GAAG,eAAe;AACpB,SAAG,KAAK,UAAU;AAAA,IACpB;AACA,UAAM;AAAA,EACR;AACF;AAhBA;AAAA;AAAA;AAAA;AAAA;;;ACAA,SAAS,oBAAoB;AAC7B,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,QAAAC,aAAY;AAqTrB,SAAS,aAAa,KAA4B;AAChD,UAAQ,OAAO,IAAI,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAC/C;AAEA,SAAS,kBAAkB,IAA6B;AACtD,QAAM,OAAO,GACV;AAAA,IACC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOF,EACC,IAAI;AAEP,SAAO,KAAK,IAAI,CAAC,SAAS;AAAA,IACxB,MAAM,IAAI;AAAA,IACV,MAAM,IAAI;AAAA,IACV,WAAW,IAAI;AAAA,IACf,KAAK,aAAa,IAAI,GAAG;AAAA,EAC3B,EAAE;AACJ;AAEA,SAAS,qBAAqB,OAA4B;AACxD,SAAO,GAAG,MAAM,IAAI,IAAI,MAAM,IAAI,IAAI,MAAM,SAAS,IAAI,MAAM,GAAG;AACpE;AAEA,SAAS,mBAAmB,WAAkC;AAC5D,QAAM,KAAK,IAAI,aAAa,UAAU;AACtC,MAAI;AACF,OAAG,KAAK,SAAS;AACjB,WAAO,kBAAkB,EAAE;AAAA,EAC7B,UAAE;AACA,OAAG,MAAM;AAAA,EACX;AACF;AAMA,SAAS,oBACP,eACA,iBACS;AACT,MAAI,cAAc,WAAW,gBAAgB,QAAQ;AACnD,WAAO;AAAA,EACT;AAEA,SAAO,cAAc;AAAA,IACnB,CAAC,OAAO,UAAU,qBAAqB,KAAK,MAAM,qBAAqB,gBAAgB,KAAK,CAAE;AAAA,EAChG;AACF;AAEA,SAAS,uBAAuB,UAAyB,QAA+B;AACtF,QAAM,iBAAiB,IAAI,IAAI,SAAS,IAAI,CAAC,UAAU,CAAC,GAAG,MAAM,IAAI,IAAI,MAAM,IAAI,IAAI,KAAK,CAAC,CAAC;AAC9F,QAAM,eAAe,IAAI,IAAI,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,MAAM,IAAI,IAAI,MAAM,IAAI,IAAI,KAAK,CAAC,CAAC;AAC1F,QAAM,OAAO,oBAAI,IAAI,CAAC,GAAG,eAAe,KAAK,GAAG,GAAG,aAAa,KAAK,CAAC,CAAC;AAEvE,aAAW,OAAO,MAAM;AACtB,UAAM,gBAAgB,eAAe,IAAI,GAAG;AAC5C,UAAM,cAAc,aAAa,IAAI,GAAG;AAExC,QAAI,CAAC,eAAe;AAClB,aAAO,cAAc,aAAa,QAAQ,eAAe,IAAI,aAAa,QAAQ,GAAG;AAAA,IACvF;AAEA,QAAI,CAAC,aAAa;AAChB,aAAO,WAAW,cAAc,IAAI,IAAI,cAAc,IAAI;AAAA,IAC5D;AAEA,QAAI,qBAAqB,aAAa,MAAM,qBAAqB,WAAW,GAAG;AAC7E,aAAO,2BAA2B,cAAc,IAAI,IAAI,cAAc,IAAI;AAAA,IAC5E;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,aAAa,IAA+B;AAC1D,QAAM,gBAAgB,kBAAkB,EAAE;AAC1C,QAAM,iBAAiB,GAAG,QAAQ,qBAAqB,EAAE,IAAI;AAC7D,QAAM,cAAc,gBAAgB,gBAAgB;AAEpD,MAAI,cAAc,WAAW,GAAG;AAC9B,WAAO;AAAA,MACL,OAAO;AAAA,MACP;AAAA,MACA,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,MAAI,oBAAoB,eAAe,sBAAsB,GAAG;AAC9D,WAAO;AAAA,MACL,OAAO;AAAA,MACP;AAAA,MACA,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,MAAI,oBAAoB,eAAe,iBAAiB,GAAG;AACzD,WAAO;AAAA,MACL,OAAO;AAAA,MACP;AAAA,MACA,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,MAAI,oBAAoB,eAAe,iBAAiB,GAAG;AACzD,WAAO;AAAA,MACL,OAAO,2BAA2B,IAAI,YAAY;AAAA,MAClD;AAAA,MACA,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,IACP;AAAA,IACA,UAAU,uBAAuB,wBAAwB,aAAa;AAAA,EACxE;AACF;AAEO,SAAS,0BAA0B,IAAoB;AAC5D,KAAG,KAAK,yBAAyB,sBAAsB,EAAE;AAC3D;AAEO,SAAS,mBAAmB,IAAc,SAAuB;AACtE,KAAG,KAAK,yBAAyB,OAAO,EAAE;AAC5C;AA1bA,IA+Ba,wBAEP,qBAEO,oBAEA,eAgIA,eAyLP,wBACA,mBACA,mBA4FO;AA5bb;AAAA;AAAA;AA+BO,IAAM,yBAAyB;AAEtC,IAAM,sBAAsBA,MAAK,YAAY,SAAS,cAAc,cAAc;AAE3E,IAAM,qBAAqBD,cAAa,qBAAqB,OAAO;AAEpE,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgItB,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyL7B,IAAM,yBAAyB,mBAAmB,kBAAkB;AACpE,IAAM,oBAAoB,mBAAmB,aAAa;AAC1D,IAAM,oBAAoB,mBAAmB,aAAa;AA4FnD,IAAM,0BAAN,cAAsC,MAAM;AAAA,MACxC,OAAO;AAAA,MAEhB,YAAY,QAAgB,UAAkB;AAC5C;AAAA,UACE,gEAAgE,MAAM,KAAK,QAAQ;AAAA,QAErF;AACA,aAAK,OAAO;AAAA,MACd;AAAA,IACF;AAAA;AAAA;;;ACtcA,SAAS,gBAAAE,qBAAoB;AA0B7B,SAAS,SAAS,IAAc,WAA4B;AAC1D,QAAM,MAAM,GACT,QAAQ,gEAAgE,EACxE,IAAI,SAAS;AAChB,SAAO,KAAK,SAAS;AACvB;AAEA,SAAS,kBAAkB,IAA2B;AACpD,MAAI,CAAC,SAAS,IAAI,UAAU,GAAG;AAC7B,WAAO,oBAAI,IAAI;AAAA,EACjB;AAEA,QAAM,OAAO,GAAG,QAAQ,6BAA6B,EAAE,IAAI;AAC3D,SAAO,IAAI,IAAI,KAAK,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC;AAC5C;AAEA,SAAS,mBAAmB,IAAwB;AAClD,QAAM,UAAoB,CAAC;AAE3B,aAAW,aAAa,eAAe;AACrC,QAAI,SAAS,IAAI,SAAS,GAAG;AAC3B,cAAQ,KAAK,gBAAgB,SAAS,EAAE;AAAA,IAC1C;AAAA,EACF;AAEA,QAAM,iBAAiB,kBAAkB,EAAE;AAC3C,aAAW,cAAc,wBAAwB;AAC/C,QAAI,eAAe,IAAI,UAAU,GAAG;AAClC,cAAQ,KAAK,0BAA0B,UAAU,EAAE;AAAA,IACrD;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,oBAAoB,IAAc,QAAsB;AAC/D,QAAM,UAAU,mBAAmB,EAAE;AACrC,MAAI,QAAQ,WAAW,GAAG;AACxB;AAAA,EACF;AAEA,QAAM,IAAI,wBAAwB,QAAQ,2BAA2B,QAAQ,KAAK,IAAI,CAAC,GAAG;AAC5F;AAEA,SAAS,iBAAiB,IAAoB;AAC5C,kBAAgB,IAAI,MAAM;AACxB,OAAG,KAAK,kBAAkB;AAAA,EAC5B,CAAC;AACH;AAEA,SAAS,oBAAoB,IAAoB;AAC/C,kBAAgB,IAAI,MAAM;AACxB,OAAG,KAAK,yDAAyD;AACjE,OAAG,KAAK,qFAAqF;AAC7F,OAAG;AAAA,MACD;AAAA,IACF;AACA,OAAG,KAAK,yDAAyD;AACjE,OAAG,KAAK,qDAAqD;AAC7D,OAAG,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAWP;AACD,OAAG;AAAA,MACD;AAAA,IACF;AACA,uBAAmB,IAAI,CAAC;AAAA,EAC1B,CAAC;AACH;AAEA,SAAS,oBAAoB,IAAc,QAAsB;AAC/D,QAAM,YAAY,aAAa,EAAE;AACjC,MAAI,UAAU,UAAU,WAAW;AACjC,UAAM,IAAI,wBAAwB,QAAQ,UAAU,YAAY,sBAAsB;AAAA,EACxF;AACF;AAEA,SAAS,0BAA0B,IAAc,QAAsB;AACrE,sBAAoB,IAAI,MAAM;AAE9B,QAAM,YAAY,aAAa,EAAE;AAEjC,UAAQ,UAAU,OAAO;AAAA,IACvB,KAAK;AACH,uBAAiB,EAAE;AACnB,0BAAoB,IAAI,MAAM;AAC9B;AAAA,IAEF,KAAK;AACH,UAAI,UAAU,gBAAgB,wBAAwB;AACpD,kCAA0B,EAAE;AAAA,MAC9B;AACA,0BAAoB,IAAI,MAAM;AAC9B;AAAA,IAEF,KAAK;AACH,0BAAoB,EAAE;AACtB,0BAAoB,IAAI,MAAM;AAC9B;AAAA,IAEF,KAAK;AACH,UAAI,UAAU,gBAAgB,wBAAwB;AACpD,kCAA0B,EAAE;AAAA,MAC9B;AACA,0BAAoB,IAAI,MAAM;AAC9B;AAAA,IAEF,KAAK;AACH,YAAM,IAAI,wBAAwB,QAAQ,UAAU,YAAY,sBAAsB;AAAA,EAC1F;AACF;AASO,SAAS,aAAa,QAA0B;AACrD,QAAM,KAAK,IAAIA,cAAa,MAAM;AAElC,MAAI;AACF,OAAG,KAAK,2BAA2B;AACnC,OAAG,KAAK,0BAA0B;AAElC,UAAM,kBAAkB,GACrB,QAAQ,wBAAwB,EAChC,IAAI;AACP,QAAI,gBAAgB,CAAC,GAAG,oBAAoB,MAAM;AAChD,YAAM,IAAI,MAAM,oCAAoC,KAAK,UAAU,eAAe,CAAC,EAAE;AAAA,IACvF;AAEA,8BAA0B,IAAI,MAAM;AAEpC,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAI;AACF,UAAI,GAAG,QAAQ;AACb,WAAG,MAAM;AAAA,MACX;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,UAAM;AAAA,EACR;AACF;AAeO,SAAS,cAAc,IAAoB;AAChD,MAAI,GAAG,QAAQ;AACb,OAAG,MAAM;AAAA,EACX;AACF;AAxMA,IAuBM,eACA;AAxBN;AAAA;AAAA;AACA;AACA;AAqBA,IAAM,gBAAgB,CAAC,sBAAsB,aAAa;AAC1D,IAAM,yBAAyB,CAAC,aAAa,iBAAiB;AAAA;AAAA;;;ACxB9D,IAwBM,UAQO;AAhCb;AAAA;AAAA;AAAA;AAwBA,IAAM,WAAW,CAAC,SAAkD;AAAA,MAClE,IAAI,IAAI;AAAA,MACR,aAAa,IAAI;AAAA,MACjB,eAAe,IAAI;AAAA,MACnB,cAAc,IAAI;AAAA,MAClB,cAAc,IAAI;AAAA,IACpB;AAEO,IAAM,qBAAN,MAAyB;AAAA,MAC9B,YAA6B,IAAc;AAAd;AAAA,MAAe;AAAA,MAAf;AAAA,MAE7B,IAAI,IAAyC;AAC3C,cAAM,MAAM,KAAK,GACd,QAAQ;AAAA;AAAA;AAAA;AAAA,KAIV,EACE,IAAI,EAAE;AAET,eAAO,MAAM,SAAS,GAAG,IAAI;AAAA,MAC/B;AAAA,MAEA,OAAO,QAAoD;AACzD,aAAK,GACF,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KASV,EACE;AAAA,UACC,OAAO;AAAA,UACP,OAAO;AAAA,UACP,OAAO;AAAA,UACP,OAAO;AAAA,UACP,OAAO;AAAA,QACT;AAEF,eAAO;AAAA,MACT;AAAA,MAEA,cACE,IACA,KACA,aACA,cACA,iBACsB;AACtB,eAAO,gBAAgB,KAAK,IAAI,MAAM;AACpC,eAAK,GACF,QAAQ;AAAA;AAAA;AAAA,OAGV,EACE,IAAI,IAAI,WAAW;AAEtB,eAAK,GACF,QAAQ;AAAA;AAAA;AAAA,OAGV,EACE,IAAI,IAAI,GAAG;AAEd,gBAAM,QAAQ,KAAK,GAChB,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAOV,EACE,IAAI,EAAE;AAET,gBAAM,SAA+B;AAAA,YACnC;AAAA,YACA,aAAa,MAAM;AAAA,YACnB,eAAe,MAAM,mBAAmB;AAAA,YACxC,cAAc,MAAM,kBAAkB;AAAA,YACtC,cAAc,MAAM,gBAAgB,eAAe,MAAM,kBAAkB;AAAA,UAC7E;AAEA,iBAAO,KAAK,OAAO,MAAM;AAAA,QAC3B,CAAC;AAAA,MACH;AAAA,MAEA,OAAO,IAAqB;AAC1B,eAAO,gBAAgB,KAAK,IAAI,MAAM;AACpC,gBAAM,cAAc,KAAK,GAAG,QAAQ,4CAA4C,EAAE,IAAI,EAAE;AACxF,gBAAM,gBAAgB,KAAK,GAAG,QAAQ,8CAA8C,EAAE,IAAI,EAAE;AAC5F,iBAAO,OAAO,YAAY,OAAO,IAAI,OAAO,cAAc,OAAO,IAAI;AAAA,QACvE,CAAC;AAAA,MACH;AAAA,MAEA,iBAAiB,KAAqC;AACpD,cAAM,OAAO,KAAK,GACf,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,KAKV,EACE,IAAI,GAAG;AAEV,eAAO,KAAK,IAAI,QAAQ;AAAA,MAC1B;AAAA,IACF;AAAA;AAAA;;;ACvIA,IAQa;AARb;AAAA;AAAA;AAQO,IAAM,kBAAN,MAAsB;AAAA,MAC3B,YAA6B,IAAc;AAAd;AAAA,MAAe;AAAA,MAAf;AAAA,MAE7B,OAAO,OAAe,KAA0B;AAC9C,aAAK,GACF,QAAQ;AAAA;AAAA;AAAA,KAGV,EACE,IAAI,OAAO,KAAK,GAAG;AAEtB,eAAO;AAAA,UACL;AAAA,UACA,WAAW;AAAA,UACX,YAAY;AAAA,QACd;AAAA,MACF;AAAA,MAEA,MAAM,OAAe,KAAsB;AACzC,cAAM,SAAS,KAAK,GACjB,QAAQ;AAAA;AAAA;AAAA;AAAA,KAIV,EACE,IAAI,KAAK,KAAK;AAEjB,eAAO,OAAO,UAAU;AAAA,MAC1B;AAAA,MAEA,OAAO,OAAqB;AAC1B,aAAK,GAAG,QAAQ,2CAA2C,EAAE,IAAI,KAAK;AAAA,MACxE;AAAA,IACF;AAAA;AAAA;;;ACzCA,IAMa;AANb;AAAA;AAAA;AAMO,IAAM,qBAAN,MAAyB;AAAA,MAC9B,YAAoB,IAAc;AAAd;AAAA,MAAe;AAAA,MAAf;AAAA;AAAA;AAAA;AAAA,MAKpB,IAAI,YAAgD;AAClD,cAAM,MAAM,KAAK,GACd,QAAQ,2DAA2D,EACnE,IAAI,UAAU;AAEjB,eAAO,MAAO,KAAK,MAAM,IAAI,MAAM,IAAuB;AAAA,MAC5D;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,IAAI,YAAoB,QAA8B;AACpD,cAAM,OAAO,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA,KAI5B;AAED,aAAK,IAAI,YAAY,KAAK,UAAU,MAAM,CAAC;AAAA,MAC7C;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,YAA0B;AAC/B,cAAM,OAAO,KAAK,GAAG,QAAQ,oDAAoD;AACjF,aAAK,IAAI,UAAU;AAAA,MACrB;AAAA;AAAA;AAAA;AAAA,MAKA,kBAA4B;AAC1B,cAAM,OAAO,KAAK,GAAG,QAAQ,0CAA0C,EAAE,IAAI;AAG7E,eAAO,KAAK,IAAI,CAAC,QAAQ,IAAI,WAAW;AAAA,MAC1C;AAAA;AAAA;AAAA;AAAA,MAKA,SAAyC;AACvC,cAAM,OAAO,KAAK,GAAG,QAAQ,kDAAkD,EAAE,IAAI;AAKrF,cAAM,SAAyC,CAAC;AAChD,mBAAW,OAAO,MAAM;AACtB,iBAAO,IAAI,WAAW,IAAI,KAAK,MAAM,IAAI,MAAM;AAAA,QACjD;AAEA,eAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA;;;ACpEA,IAWa;AAXb;AAAA;AAAA;AAWO,IAAM,eAAN,MAAmB;AAAA,MACxB,YAAoB,IAAc;AAAd;AAAA,MAAe;AAAA,MAAf;AAAA;AAAA;AAAA;AAAA;AAAA,MAMpB,IAAiB,KAA4B;AAC3C,cAAM,MAAM,KAAK,GAAG,QAAQ,+CAA+C,EAAE,IAAI,GAAG;AAIpF,eAAO,MAAO,KAAK,MAAM,IAAI,KAAK,IAAU;AAAA,MAC9C;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,IAAO,KAAa,OAAgB;AAClC,cAAM,OAAO,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA,KAI5B;AAED,aAAK,IAAI,KAAK,KAAK,UAAU,KAAK,CAAC;AAAA,MACrC;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,KAAmB;AACxB,cAAM,OAAO,KAAK,GAAG,QAAQ,yCAAyC;AACtE,aAAK,IAAI,GAAG;AAAA,MACd;AAAA;AAAA;AAAA;AAAA,MAKA,WAAqB;AACnB,cAAM,OAAO,KAAK,GAAG,QAAQ,+BAA+B,EAAE,IAAI;AAClE,eAAO,KAAK,IAAI,CAAC,QAAQ,IAAI,GAAG;AAAA,MAClC;AAAA;AAAA;AAAA;AAAA,MAKA,SAAkC;AAChC,cAAM,OAAO,KAAK,GAAG,QAAQ,sCAAsC,EAAE,IAAI;AAKzE,cAAM,SAAkC,CAAC;AACzC,mBAAW,OAAO,MAAM;AACtB,iBAAO,IAAI,GAAG,IAAI,KAAK,MAAM,IAAI,KAAK;AAAA,QACxC;AAEA,eAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA;;;ACxEA,IAsBa;AAtBb;AAAA;AAAA;AAsBO,IAAM,6BAAN,MAAiC;AAAA,MACtC,YAA6B,IAAc;AAAd;AAAA,MAAe;AAAA,MAAf;AAAA,MAE7B,OAAOC,QAA0D;AAC/D,aAAK,GACF;AAAA,UACC;AAAA;AAAA,QAEF,EACC;AAAA,UACCA,OAAM;AAAA,UACNA,OAAM;AAAA,UACNA,OAAM;AAAA,UACNA,OAAM;AAAA,UACNA,OAAM;AAAA,UACNA,OAAM,eAAe;AAAA,UACrBA,OAAM,eAAe;AAAA,UACrBA,OAAM,iBAAiB;AAAA,QACzB;AAEF,eAAO,KAAK,SAASA,OAAM,EAAE;AAAA,MAC/B;AAAA,MAEA,SAAS,IAAgD;AACvD,cAAM,MAAM,KAAK,GAAG,QAAQ,sDAAsD,EAAE,IAAI,EAAE;AAG1F,eAAO,MAAM,KAAK,aAAa,GAAG,IAAI;AAAA,MACxC;AAAA,MAEA,aAAa,SAA2C;AACtD,cAAM,OAAO,KAAK,GACf;AAAA,UACC;AAAA,QACF,EACC,IAAI,OAAO;AACd,eAAO,KAAK,IAAI,CAAC,QAAQ,KAAK,aAAa,GAAG,CAAC;AAAA,MACjD;AAAA,MAEA,OAAO,IAAY,OAAkE;AACnF,cAAM,cAAwB,CAAC;AAC/B,cAAM,SAAiD,EAAE,GAAG;AAE5D,YAAI,MAAM,WAAW,QAAW;AAC9B,sBAAY,KAAK,kBAAkB;AACnC,iBAAO,SAAS,MAAM;AAAA,QACxB;AACA,YAAI,MAAM,gBAAgB,QAAW;AACnC,sBAAY,KAAK,6BAA6B;AAC9C,iBAAO,cAAc,MAAM;AAAA,QAC7B;AACA,YAAI,MAAM,gBAAgB,QAAW;AACnC,sBAAY,KAAK,6BAA6B;AAC9C,iBAAO,cAAc,MAAM;AAAA,QAC7B;AACA,YAAI,MAAM,kBAAkB,QAAW;AACrC,sBAAY,KAAK,iCAAiC;AAClD,iBAAO,gBAAgB,MAAM;AAAA,QAC/B;AAEA,YAAI,YAAY,WAAW,GAAG;AAC5B,gBAAM,WAAW,KAAK,SAAS,EAAE;AACjC,cAAI,CAAC,UAAU;AACb,kBAAM,IAAI,MAAM,uCAAuC,EAAE,EAAE;AAAA,UAC7D;AACA,iBAAO;AAAA,QACT;AAEA,cAAM,SAAS,KAAK,GACjB,QAAQ,wCAAwC,YAAY,KAAK,IAAI,CAAC,iBAAiB,EACvF,IAAI,MAAM;AAEb,YAAI,OAAO,YAAY,GAAG;AACxB,gBAAM,IAAI,MAAM,uCAAuC,EAAE,EAAE;AAAA,QAC7D;AAEA,eAAO,KAAK,SAAS,EAAE;AAAA,MACzB;AAAA,MAEA,eAAe,SAAuB;AACpC,aAAK,GAAG,QAAQ,0DAA0D,EAAE,IAAI,OAAO;AAAA,MACzF;AAAA,MAEQ,aAAa,KAAwD;AAC3E,eAAO;AAAA,UACL,IAAI,IAAI;AAAA,UACR,SAAS,IAAI;AAAA,UACb,cAAc,IAAI;AAAA,UAClB,QAAQ,IAAI;AAAA,UACZ,WAAW,IAAI;AAAA,UACf,aAAa,IAAI,gBAAgB;AAAA,UACjC,aAAa,IAAI,gBAAgB;AAAA,UACjC,eAAe,IAAI,kBAAkB;AAAA,QACvC;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACrHA,IA8Ba;AA9Bb;AAAA;AAAA;AA8BO,IAAM,sBAAN,MAA0B;AAAA,MAC/B,YAA6B,IAAc;AAAd;AAAA,MAAe;AAAA,MAAf;AAAA,MAE7B,OAAOC,QAAyC;AAC9C,aAAK,GACF;AAAA,UACC;AAAA;AAAA,QAEF,EACC;AAAA,UACCA,OAAM;AAAA,UACNA,OAAM;AAAA,UACNA,OAAM;AAAA,UACNA,OAAM;AAAA,UACNA,OAAM;AAAA,UACNA,OAAM;AAAA,UACNA,OAAM;AAAA,UACNA,OAAM;AAAA,UACNA,OAAM,UAAU;AAAA,UAChBA,OAAM,YAAY;AAAA,UAClBA,OAAM,UAAU;AAAA,UAChBA,OAAM,oBAAoB;AAAA,UAC1BA,OAAM,eAAe;AAAA,UACrBA,OAAM;AAAA,UACNA,OAAM,eAAe;AAAA,QACvB;AAEF,eAAO,KAAK,SAASA,OAAM,EAAE;AAAA,MAC/B;AAAA,MAEA,SAAS,IAAyC;AAChD,cAAM,MAAM,KAAK,GAAG,QAAQ,8CAA8C,EAAE,IAAI,EAAE;AAGlF,eAAO,MAAM,KAAK,WAAW,GAAG,IAAI;AAAA,MACtC;AAAA,MAEA,wBAAwB,cAAsB,OAAkC;AAC9E,cAAM,OAAO,KAAK,GACf;AAAA,UACC;AAAA,QACF,EACC,IAAI,cAAc,KAAK;AAC1B,eAAO,KAAK,IAAI,CAAC,QAAQ,KAAK,WAAW,GAAG,CAAC;AAAA,MAC/C;AAAA,MAEA,OAAO,IAAY,OAAoD;AACrE,cAAM,cAAwB,CAAC;AAC/B,cAAM,SAAiD,EAAE,GAAG;AAE5D,YAAI,MAAM,WAAW,QAAW;AAC9B,sBAAY,KAAK,kBAAkB;AACnC,iBAAO,SAAS,MAAM;AAAA,QACxB;AACA,YAAI,MAAM,aAAa,QAAW;AAChC,sBAAY,KAAK,sBAAsB;AACvC,iBAAO,WAAW,MAAM;AAAA,QAC1B;AACA,YAAI,MAAM,WAAW,QAAW;AAC9B,sBAAY,KAAK,kBAAkB;AACnC,iBAAO,SAAS,MAAM;AAAA,QACxB;AACA,YAAI,MAAM,qBAAqB,QAAW;AACxC,sBAAY,KAAK,uCAAuC;AACxD,iBAAO,mBAAmB,MAAM;AAAA,QAClC;AACA,YAAI,MAAM,gBAAgB,QAAW;AACnC,sBAAY,KAAK,6BAA6B;AAC9C,iBAAO,cAAc,MAAM;AAAA,QAC7B;AACA,YAAI,MAAM,gBAAgB,QAAW;AACnC,sBAAY,KAAK,6BAA6B;AAC9C,iBAAO,cAAc,MAAM;AAAA,QAC7B;AAEA,YAAI,YAAY,WAAW,GAAG;AAC5B,gBAAM,WAAW,KAAK,SAAS,EAAE;AACjC,cAAI,CAAC,UAAU;AACb,kBAAM,IAAI,MAAM,+BAA+B,EAAE,EAAE;AAAA,UACrD;AACA,iBAAO;AAAA,QACT;AAEA,cAAM,SAAS,KAAK,GACjB,QAAQ,gCAAgC,YAAY,KAAK,IAAI,CAAC,iBAAiB,EAC/E,IAAI,MAAM;AAEb,YAAI,OAAO,YAAY,GAAG;AACxB,gBAAM,IAAI,MAAM,+BAA+B,EAAE,EAAE;AAAA,QACrD;AAEA,eAAO,KAAK,SAAS,EAAE;AAAA,MACzB;AAAA,MAEA,YAAY,cAAsB,MAAoB;AACpD,aAAK,GACF;AAAA,UACC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAOF,EACC,IAAI,cAAc,IAAI;AAAA,MAC3B;AAAA,MAEQ,WAAW,KAA0C;AAC3D,eAAO;AAAA,UACL,IAAI,IAAI;AAAA,UACR,cAAc,IAAI;AAAA,UAClB,WAAW,IAAI;AAAA,UACf,QAAQ,IAAI;AAAA,UACZ,SAAS,IAAI;AAAA,UACb,gBAAgB,IAAI;AAAA,UACpB,WAAW,IAAI;AAAA,UACf,qBAAqB,IAAI;AAAA,UACzB,QAAQ,IAAI,WAAW;AAAA,UACvB,UAAU,IAAI,YAAY;AAAA,UAC1B,QAAQ,IAAI,UAAU;AAAA,UACtB,kBAAkB,IAAI,qBAAqB;AAAA,UAC3C,aAAa,IAAI,gBAAgB;AAAA,UACjC,WAAW,IAAI;AAAA,UACf,aAAa,IAAI,gBAAgB;AAAA,QACnC;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AC7JA,IAwDa;AAxDb;AAAA;AAAA;AAwDO,IAAM,iBAAN,MAAqB;AAAA,MAC1B,YAA6B,IAAc;AAAd;AAAA,MAAe;AAAA,MAAf;AAAA,MAE7B,OAAOC,QAAkC;AACvC,aAAK,GACF;AAAA,UACC;AAAA;AAAA,QAEF,EACC;AAAA,UACCA,OAAM;AAAA,UACNA,OAAM;AAAA,UACNA,OAAM;AAAA,UACNA,OAAM;AAAA,UACNA,OAAM;AAAA,UACNA,OAAM;AAAA,UACNA,OAAM,kBAAkB;AAAA,UACxBA,OAAM,uBAAuB;AAAA,UAC7BA,OAAM,6BAA6B;AAAA,UACnCA,OAAM,eAAe;AAAA,UACrBA,OAAM,cAAc;AAAA,UACpBA,OAAM,eAAe;AAAA,UACrBA,OAAM,uBAAuB;AAAA,UAC7BA,OAAM,eAAe;AAAA,UACrBA,OAAM;AAAA,UACNA,OAAM;AAAA,QACR;AAEF,eAAO,KAAK,SAASA,OAAM,EAAE;AAAA,MAC/B;AAAA,MAEA,SAAS,IAAoC;AAC3C,cAAM,MAAM,KAAK,GAAG,QAAQ,wCAAwC,EAAE,IAAI,EAAE;AAG5E,eAAO,MAAM,KAAK,gBAAgB,GAAG,IAAI;AAAA,MAC3C;AAAA,MAEA,eAAe,WAA2C;AACxD,cAAM,MAAM,KAAK,GAAG,QAAQ,gDAAgD,EAAE,IAAI,SAAS;AAG3F,eAAO,MAAM,KAAK,gBAAgB,GAAG,IAAI;AAAA,MAC3C;AAAA,MAEA,UAAwB;AACtB,cAAM,OAAO,KAAK,GACf,QAAQ,mDAAmD,EAC3D,IAAI;AACP,eAAO,KAAK,IAAI,CAAC,QAAQ,KAAK,gBAAgB,GAAG,CAAC;AAAA,MACpD;AAAA,MAEA,OAAO,IAAY,OAA0C;AAC3D,cAAM,cAAc,CAAC,yBAAyB;AAC9C,cAAM,SAAiD;AAAA,UACrD;AAAA,UACA,WAAW,MAAM,aAAa,KAAK,IAAI;AAAA,QACzC;AAEA,YAAI,MAAM,UAAU,QAAW;AAC7B,sBAAY,KAAK,gBAAgB;AACjC,iBAAO,QAAQ,MAAM;AAAA,QACvB;AACA,YAAI,MAAM,cAAc,QAAW;AACjC,sBAAY,KAAK,wBAAwB;AACzC,iBAAO,YAAY,MAAM;AAAA,QAC3B;AACA,YAAI,MAAM,wBAAwB,QAAW;AAC3C,sBAAY,KAAK,8CAA8C;AAC/D,iBAAO,sBAAsB,MAAM;AAAA,QACrC;AACA,YAAI,MAAM,mBAAmB,QAAW;AACtC,sBAAY,KAAK,mCAAmC;AACpD,iBAAO,iBAAiB,MAAM;AAAA,QAChC;AACA,YAAI,MAAM,wBAAwB,QAAW;AAC3C,sBAAY,KAAK,8CAA8C;AAC/D,iBAAO,sBAAsB,MAAM;AAAA,QACrC;AACA,YAAI,MAAM,8BAA8B,QAAW;AACjD,sBAAY,KAAK,0DAA0D;AAC3E,iBAAO,4BAA4B,MAAM;AAAA,QAC3C;AACA,YAAI,MAAM,gBAAgB,QAAW;AACnC,sBAAY,KAAK,6BAA6B;AAC9C,iBAAO,cAAc,MAAM;AAAA,QAC7B;AACA,YAAI,MAAM,eAAe,QAAW;AAClC,sBAAY,KAAK,2BAA2B;AAC5C,iBAAO,aAAa,MAAM;AAAA,QAC5B;AACA,YAAI,MAAM,gBAAgB,QAAW;AACnC,sBAAY,KAAK,8BAA8B;AAC/C,iBAAO,cAAc,MAAM;AAAA,QAC7B;AACA,YAAI,MAAM,wBAAwB,QAAW;AAC3C,sBAAY,KAAK,+CAA+C;AAChE,iBAAO,sBAAsB,MAAM;AAAA,QACrC;AACA,YAAI,MAAM,gBAAgB,QAAW;AACnC,sBAAY,KAAK,6BAA6B;AAC9C,iBAAO,cAAc,MAAM;AAAA,QAC7B;AAEA,cAAM,SAAS,KAAK,GACjB,QAAQ,0BAA0B,YAAY,KAAK,IAAI,CAAC,iBAAiB,EACzE,IAAI,MAAM;AAEb,YAAI,OAAO,YAAY,GAAG;AACxB,gBAAM,IAAI,MAAM,yBAAyB,EAAE,EAAE;AAAA,QAC/C;AAEA,eAAO,KAAK,SAAS,EAAE;AAAA,MACzB;AAAA,MAEA,OAAO,IAAkB;AACvB,aAAK,GAAG,QAAQ,sCAAsC,EAAE,IAAI,EAAE;AAAA,MAChE;AAAA,MAEQ,gBAAgB,KAAgC;AACtD,eAAO;AAAA,UACL,IAAI,IAAI;AAAA,UACR,WAAW,IAAI;AAAA,UACf,aAAa,IAAI;AAAA,UACjB,UAAU,IAAI;AAAA,UACd,OAAO,IAAI;AAAA,UACX,WAAW,IAAI;AAAA,UACf,qBAAqB,IAAI;AAAA,UACzB,gBAAgB,IAAI,mBAAmB;AAAA,UACvC,qBAAqB,IAAI;AAAA,UACzB,2BAA2B,IAAI;AAAA,UAC/B,aAAa,IAAI,gBAAgB;AAAA,UACjC,YAAY,IAAI,eAAe;AAAA,UAC/B,qBAAqB;AAAA,UACrB,oBAAoB,CAAC;AAAA,UACrB,QAAQ,CAAC;AAAA,UACT,aAAa,IAAI,iBAAiB;AAAA,UAClC,qBAAqB,IAAI,0BAA0B;AAAA,UACnD,aAAa,IAAI,gBAAgB;AAAA,UACjC,WAAW,IAAI;AAAA,UACf,WAAW,IAAI;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AClMO,SAAS,UAAU,MAAsB;AAC9C,SAAO,KACJ,QAAQ,gCAAgC,EAAE,EAC1C,QAAQ,sCAAsC,EAAE,EAChD,QAAQ,SAAS,EAAE,EACnB,KAAK;AACV;AAEO,SAAS,qBAAqB,MAAc,SAAgC;AACjF,QAAM,OAAO,UAAU,KAAK,SAAS,MAAM,CAAC;AAC5C,QAAM,QAAQ,KAAK,MAAM,IAAI;AAE7B,SAAO,MAAM,SAAS,KAAK,MAAM,GAAG,EAAE,GAAG,KAAK,MAAM,IAAI;AACtD,UAAM,IAAI;AAAA,EACZ;AAEA,SAAO,MAAM,MAAM,CAAC,QAAQ,QAAQ,EAAE,KAAK,IAAI,EAAE,MAAM,CAAC,QAAQ,QAAQ;AAC1E;AAtBA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAaM,aAYA,oBACA,oBAkBO;AA5Cb;AAAA;AAAA;AAWA;AAEA,IAAM,cAAiC;AAAA,MACrC,OAAO,MAAM;AAAA,MACb,OAAO,MAAM;AAAA,MAAC;AAAA,MACd,OAAO,MAAM;AAAA,MAAC;AAAA,MACd,OAAO,MAAM;AAAA,MAAC;AAAA,MACd,MAAM,MAAM;AAAA,MAAC;AAAA,MACb,OAAO;AAAA,MACP,QAAQ,MAAM;AAAA,MAAC;AAAA,MACf,OAAO,MAAM;AAAA,MAAC;AAAA,MACd,MAAM,MAAM;AAAA,MAAC;AAAA,IACf;AAEA,IAAM,qBAAqB;AAC3B,IAAM,qBAAqB;AAkBpB,IAAM,2BAAN,MAA+B;AAAA,MAGpC,YACmB,MAOjB;AAPiB;AAQjB,aAAK,SAAS,KAAK,UAAU;AAAA,MAC/B;AAAA,MATmB;AAAA,MAHF;AAAA,MAcjB,MAAM,MACJ,YACA,cACsC;AACtC,cAAM,UAAU,KAAK,KAAK,WAAW,IAAI,WAAW,SAAS;AAC7D,cAAM,YAAY,KAAK,KAAK,aAAa,IAAI,WAAW,WAAW;AAEnE,YAAI,CAAC,WAAW,CAAC,WAAW;AAC1B,gBAAM;AAAA,YACJ,MAAM;AAAA,YACN,SAAS;AAAA,UACX;AAAA,QACF;AAEA,YAAI,mBAAmB;AACvB,YAAI;AACF,6BAAmB,MAAM,KAAK,KAAK,WAAW,oBAAoB,QAAQ,IAAI;AAAA,YAC5E,UAAU;AAAA,YACV,UAAU;AAAA,UACZ,CAAC;AAAA,QACH,SAAS,OAAO;AACd,eAAK,OAAO;AAAA,YACV,EAAE,KAAK,OAAO,WAAW,QAAQ,GAAG;AAAA,YACpC;AAAA,UACF;AAAA,QACF;AAEA,cAAM,kBAAkB,KAAK,KAAK,WAAW,4BAA4B,QAAQ,EAAE;AAEnF,aAAK,OAAO;AAAA,UACV;AAAA,YACE,QAAQ;AAAA,YACR,WAAW,QAAQ;AAAA,YACnB,aAAa,UAAU;AAAA,YACvB,gBAAgB;AAAA,YAChB,mBAAmB,iBAAiB;AAAA,UACtC;AAAA,UACA;AAAA,QACF;AAEA,eAAO;AAAA,UACL,WAAW,WAAW;AAAA,UACtB,WAAW,QAAQ;AAAA,UACnB,aAAa,UAAU;AAAA,UACvB,eAAe,UAAU;AAAA,UACzB,mBAAmB,QAAQ;AAAA,UAC3B,qBAAqB,WAAW;AAAA,UAChC,cAAc,QAAQ;AAAA,UACtB,mBAAmB;AAAA,UACnB,iBAAiB;AAAA,UACjB,YAAY;AAAA,UACZ,gBAAgB;AAAA,UAChB;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AC7GA,SAAS,aAAAC,YAAW,cAAAC,aAAY,gBAAgB;AAChD,SAAS,qBAAqB;AAC9B,OAAOC,WAAU;AAwBV,SAAS,mCACd,OAOI,CAAC,GACC;AACN,QAAM,WAAW,KAAK,YAAY,QAAQ;AAC1C,MAAI,aAAa,UAAU;AACzB;AAAA,EACF;AACA,QAAM,OAAO,KAAK,QAAQ,QAAQ;AAElC,QAAMC,WAAU,KAAK,YAAY,CAAC,OAAeC,SAAQ,QAAQ,EAAE;AACnE,QAAM,aAAa,KAAK,cAAcH;AACtC,QAAMI,QAAO,KAAK,YAAY;AAC9B,QAAM,QAAQ,KAAK,aAAaL;AAEhC,MAAI;AACJ,MAAI;AACF,sBAAkBG,SAAQ,YAAY;AAAA,EACxC,QAAQ;AACN;AAAA,EACF;AAEA,QAAM,aAAaD,MAAK,QAAQ,eAAe;AAC/C,QAAM,YAAY,SAAS,UAAU,iBAAiB,SAAS,QAAQ,eAAe;AACtF,MAAI,CAAC,WAAW;AACd;AAAA,EACF;AAEA,QAAM,aAAaA,MAAK,KAAK,YAAY,aAAa,WAAW,cAAc;AAE/E,MAAI;AACF,QAAI,CAAC,WAAW,UAAU,GAAG;AAC3B;AAAA,IACF;AAEA,UAAM,cAAcG,MAAK,UAAU,EAAE;AACrC,UAAM,iBAAiB,cAAc;AACrC,QAAI,mBAAmB,aAAa;AAClC;AAAA,IACF;AAEA,UAAM,YAAY,cAAc;AAAA,EAClC,QAAQ;AAAA,EAER;AACF;AASO,SAAS,iBAAiB,KAAa,QAAiC;AAC7E,MAAI;AAGF,YAAQ,KAAK,CAAC,KAAK,MAAM;AACzB,WAAO;AAAA,EACT,QAAQ;AAEN,QAAI;AACF,cAAQ,KAAK,KAAK,MAAM;AACxB,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAUA,SAAS,eAAe,KAAsB;AAC5C,MAAI;AACF,YAAQ,KAAK,CAAC,KAAK,CAAC;AACpB,WAAO;AAAA,EACT,QAAQ;AACN,QAAI;AACF,cAAQ,KAAK,KAAK,CAAC;AACnB,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAcA,eAAsB,wBACpB,KACA,QACA,SACkB;AAClB,QAAM,iBAAiB,SAAS,kBAAkB;AAClD,QAAM,YAAY,SAAS,aAAa;AAGxC,MAAI,WAAW,WAAW;AACxB,WAAO,iBAAiB,KAAK,MAAM;AAAA,EACrC;AAGA,QAAM,OAAO,iBAAiB,KAAK,SAAS;AAC5C,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAGA,MAAI,CAAC,eAAe,GAAG,GAAG;AACxB,WAAO;AAAA,EACT;AAGA,QAAM,YAAY,KAAK,IAAI;AAC3B,QAAM,WAAW,YAAY;AAE7B,SAAO,KAAK,IAAI,IAAI,UAAU;AAE5B,UAAM,IAAI,QAAQ,CAACF,aAAY,WAAWA,UAAS,cAAc,CAAC;AAGlE,QAAI,CAAC,eAAe,GAAG,GAAG;AACxB,aAAO;AAAA,IACT;AAAA,EACF;AAGA,mBAAiB,KAAK,SAAS;AAC/B,SAAO;AACT;AAxLA,IAaMC,UACA,cAaA,0BAGA,oBAgKO;AA9Lb;AAAA;AAAA;AASA,IAAAE;AAIA,IAAMF,WAAU,cAAc,YAAY,GAAG;AAC7C,IAAM,eAAe;AAarB,IAAM,2BAA2B;AAGjC,IAAM,qBAAqB;AAgKpB,IAAM,cAAN,MAAqC;AAAA,MAC1C,MAAM,MAAgB,SAAsC;AAC1D,2CAAmC;AAGnC,YAAI;AACJ,YAAI;AACF,gBAAMA,SAAQ,UAAU;AAAA,QAC1B,SAAS,KAAK;AACZ,gBAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,gBAAM,IAAI,MAAM,yCAAyC,OAAO,EAAE;AAAA,QACpE;AAEA,YAAI,KAAK,WAAW,GAAG;AACrB,gBAAM,IAAI,MAAM,8BAA8B;AAAA,QAChD;AAMA,cAAM,CAAC,SAAS,GAAG,IAAI,IAAI,iBAAiB,MAAM;AAAA,UAChD,SAAS,QAAQ,IAAI,QAAQ,QAAQ,IAAI;AAAA,UACzC,SAAS,QAAQ,IAAI;AAAA,QACvB,CAAC;AACD,YAAI,YAAY,QAAW;AACzB,gBAAM,IAAI,MAAM,8BAA8B;AAAA,QAChD;AAEA,cAAM,aAAa,IAAI,MAAM,SAAS,MAAM;AAAA,UAC1C,KAAK,QAAQ;AAAA,UACb,KAAK,QAAQ;AAAA,UACb,MAAM,QAAQ;AAAA,UACd,MAAM,QAAQ;AAAA,QAChB,CAAC;AAED,eAAO;AAAA,UACL,QAAQ,CAAC,aAAa;AACpB,uBAAW,OAAO,QAAQ;AAAA,UAC5B;AAAA,UACA,QAAQ,CAAC,aAAa;AACpB,uBAAW,OAAO,CAAC,EAAE,SAAS,MAA4B,SAAS,EAAE,SAAS,CAAC,CAAC;AAAA,UAClF;AAAA,UACA,OAAO,CAAC,SAAS;AACf,gBAAI,OAAO,SAAS,IAAI,GAAG;AACzB,yBAAW,MAAM,KAAK,SAAS,OAAO,CAAC;AAAA,YACzC,OAAO;AACL,yBAAW,MAAM,IAAI;AAAA,YACvB;AAAA,UACF;AAAA,UACA,QAAQ,CAAC,MAAM,SAAS;AACtB,uBAAW,OAAO,MAAM,IAAI;AAAA,UAC9B;AAAA,UACA,MAAM,OAAO,SAAyB,cAAc;AAClD,kBAAM,MAAM,WAAW;AAEvB,gBAAI,MAAM,GAAG;AAEX,kBAAI;AACF,2BAAW,KAAK,MAAM;AAAA,cACxB,QAAQ;AAAA,cAER;AAIA,kBAAI;AACF,sBAAM,wBAAwB,KAAK,MAAM;AAAA,cAC3C,QAAQ;AAAA,cAER;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AC1OO,SAAS,iCAAiC,cAAkD;AACjG,MAAI;AACJ,MAAI;AACF,kBAAc,cAAc,IAAY,yCAAyC;AAAA,EACnF,QAAQ;AACN,kBAAc;AAAA,EAChB;AAEA,QAAM,aAAa,sCAAsC,WAAW;AACpE,SAAO,aAAa;AACtB;AAEA,SAAS,oBACP,cACA,KACA,UACG;AACH,MAAI;AACF,WAAQ,cAAc,IAAO,GAAG,KAAK;AAAA,EACvC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,2BACd,cACyB;AACzB,SAAO;AAAA,IACL,cAAc;AAAA,MACZ;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA,eAAe;AAAA,MACb;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA,gBAAgB;AAAA,MACd;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA,uBAAuB;AAAA,MACrB;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AA/FA,IAgBa,2CACA,sCACA,wCACA,wCACA,yCACA;AArBb;AAAA;AAAA;AAAA,IAAAG;AAgBO,IAAM,4CAA4C;AAClD,IAAM,uCAAuC;AAC7C,IAAM,yCAAyC;AAC/C,IAAM,yCAAyC;AAC/C,IAAM,0CAA0C;AAChD,IAAM,kDAAkD;AAAA;AAAA;;;ACrB/D,SAAS,SAAAC,cAAa;AAoItB,SAAS,YAAY,SAA8C;AACjE,QAAM,QAAkB;AAAA,IACtB;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;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;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,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,KAAK,UAAU,QAAQ,cAAc,MAAM,CAAC;AAAA,IAC5C;AAAA,IACA;AAAA,IACA,QAAQ,iBAAiB,KAAK,KAAK;AAAA,IACnC;AAAA,IACA;AAAA,IACA,QAAQ,mBAAmB;AAAA,EAC7B;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,eAAe,WACb,SACA,WACA,UAA2B,CAAC,GACX;AACjB,MAAI,QAAQ,QAAQ,SAAS;AAC3B,UAAM,iCAAiC;AAAA,EACzC;AAEA,SAAO,MAAM,IAAI,QAAQ,CAACC,UAAS,WAAW;AAC5C,UAAM,QAAQD,OAAM,QAAQ,KAAK,CAAC,GAAI,QAAQ,KAAK,MAAM,CAAC,GAAG;AAAA,MAC3D,KAAK,QAAQ;AAAA,MACb,UAAU,QAAQ,aAAa;AAAA,MAC/B,KAAK,EAAE,GAAG,QAAQ,KAAK,GAAG,QAAQ,IAAI;AAAA,MACtC,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,MAChC,aAAa;AAAA,IACf,CAAC;AAED,UAAM,SAAmB,CAAC;AAC1B,UAAM,SAAmB,CAAC;AAC1B,QAAI,UAAU;AACd,QAAI,mBAGO;AAEX,UAAM,UAAU,MAAM;AACpB,mBAAa,KAAK;AAClB,cAAQ,QAAQ,oBAAoB,SAAS,OAAO;AAAA,IACtD;AAEA,UAAM,eAAe,CAAC,UAAmB;AACvC,UAAI,SAAS;AACX;AAAA,MACF;AACA,gBAAU;AACV,cAAQ;AACR,aAAO,KAAK;AAAA,IACd;AAEA,UAAM,gBAAgB,CAAC,UAAkB;AACvC,UAAI,SAAS;AACX;AAAA,MACF;AACA,gBAAU;AACV,cAAQ;AACR,MAAAC,SAAQ,KAAK;AAAA,IACf;AAEA,UAAM,YAAY,CAAC,UAGb;AACJ,UAAI,kBAAkB;AACpB;AAAA,MACF;AACA,yBAAmB;AAEnB,UAAI,OAAO,MAAM,QAAQ,YAAY,MAAM,OAAO,GAAG;AACnD,qBAAa,KAAK;AAClB;AAAA,MACF;AAEA,WAAK,wBAAwB,MAAM,KAAK,SAAS,EAAE,MAAM,MAAM;AAAA,MAE/D,CAAC;AAAA,IACH;AAEA,UAAM,UAAU,MAAM;AACpB,gBAAU,iCAAiC,CAAC;AAAA,IAC9C;AAEA,UAAM,QAAQ,WAAW,MAAM;AAC7B,gBAAU;AAAA,QACR,MAAM;AAAA,QACN,SAAS,wCAAwC,SAAS;AAAA,MAC5D,CAAC;AAAA,IACH,GAAG,SAAS;AAEZ,YAAQ,QAAQ,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AACjE,UAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,OAAO,KAAK,OAAO,KAAK,KAAK,CAAC,CAAC;AACnE,UAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,OAAO,KAAK,OAAO,KAAK,KAAK,CAAC,CAAC;AACnE,UAAM,GAAG,SAAS,CAAC,UAAU;AAC3B,UAAI,kBAAkB;AACpB,qBAAa,gBAAgB;AAC7B;AAAA,MACF;AACA,mBAAa,KAAK;AAAA,IACpB,CAAC;AACD,UAAM,GAAG,QAAQ,CAAC,SAAS;AACzB,UAAI,kBAAkB;AACpB,qBAAa,gBAAgB;AAC7B;AAAA,MACF;AACA,UAAI,SAAS,GAAG;AACd,qBAAa;AAAA,UACX,MAAM;AAAA,UACN,SACE,OAAO,OAAO,MAAM,EAAE,SAAS,MAAM,EAAE,KAAK,KAAK,8BAA8B,IAAI;AAAA,QACvF,CAAC;AACD;AAAA,MACF;AAEA,oBAAc,OAAO,OAAO,MAAM,EAAE,SAAS,MAAM,CAAC;AAAA,IACtD,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,mCAGP;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AACF;AAKA,SAAS,eAAe,MAAsB;AAC5C,QAAM,SAAS,KAAK,MAAM,yCAAyC;AACnE,SAAO,SAAS,OAAO,CAAC,EAAG,KAAK,IAAI;AACtC;AAwBA,SAAS,gBAAgB,OAAkC;AACzD,QAAM,OAAwB;AAAA,IAC5B,yBAAyB,CAAC;AAAA,IAC1B,eAAe;AAAA,IACf,eAAe;AAAA,IACf,aAAa;AAAA,IACb,cAAc;AAAA,EAChB;AAEA,aAAW,QAAQ,OAAO;AACxB,QAAI;AACJ,QAAI;AACF,cAAQ,KAAK,MAAM,IAAI;AAAA,IACzB,QAAQ;AACN;AAAA,IACF;AACA,QAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC;AAAA,IACF;AACA,UAAM,SAAS;AACf,UAAM,OAAO,OAAO;AAEpB,QACE,SAAS,oBACT,SAAS,kBACT,SAAS,oBACT,SAAS,iBACT,SAAS,kBACT,SAAS,kBACT,SAAS,kBACT;AACA,WAAK,gBAAgB;AAAA,IACvB;AAEA,QAAI,SAAS,kBAAkB;AAC7B,WAAK,gBAAgB;AACrB,YAAM,QAAQ,OAAO;AACrB,UACE,SACA,OAAO,UAAU,YACjB,OAAQ,MAAkC,kBAAkB,UAC5D;AACA,aAAK,eAAgB,MAAkC;AAAA,MACzD;AAAA,IACF;AAEA,QAAI,SAAS,eAAe;AAC1B,YAAM,QAAQ,OAAO;AACrB,UACE,SACA,OAAO,UAAU,YACjB,OAAQ,MAAkC,YAAY,UACtD;AACA,aAAK,cAAe,MAAkC;AAAA,MACxD,OAAO;AACL,aAAK,cAAc;AAAA,MACrB;AAAA,IACF;AAEA,QAAI,SAAS,kBAAkB;AAC7B,YAAM,OAAO,OAAO;AACpB,UAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC;AAAA,MACF;AACA,YAAM,aAAa;AACnB,YAAM,WAAW,WAAW,QAAQ,WAAW;AAC/C,WACG,aAAa,mBACZ,aAAa,uBACb,aAAa,gBACf,OAAO,WAAW,SAAS,UAC3B;AACA,aAAK,wBAAwB,KAAK;AAAA,UAChC,YAAY;AAAA,UACZ,SAAS,WAAW;AAAA,QACtB,CAAC;AACD;AAAA,MACF;AACA,UAAI,aAAa,uBAAuB,OAAO,WAAW,sBAAsB,UAAU;AACxF,aAAK,wBAAwB,KAAK;AAAA,UAChC,YAAY;AAAA,UACZ,SAAS,WAAW;AAAA,QACtB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmBC,SAAgB,WAAW,KAAc;AACnE,SAAOA,QAAO,UAAU,WACpBA,UACA,GAAGA,QAAO,MAAM,GAAG,QAAQ,CAAC;AAAA,mBAAiBA,QAAO,SAAS,QAAQ;AAC3E;AAEA,SAAS,4BACP,QACA,YACA,SACA,SACA,QACAA,SACA,MACM;AACN,SAAO;AAAA,IACL;AAAA,MACE,cAAc,WAAW;AAAA,MACzB,WAAW,WAAW;AAAA,MACtB,qBAAqB,WAAW;AAAA,MAChC,mBAAmB,QAAQ;AAAA,MAC3B,cAAc,KAAK;AAAA,MACnB,eAAe,KAAK;AAAA,MACpB,aAAa,KAAK;AAAA,MAClB,6BAA6B,KAAK,wBAAwB;AAAA,MAC1D,yBAAyB,KAAK,wBAAwB,IAAI,CAAC,WAAW,WAAW;AAAA,QAC/E;AAAA,QACA,YAAY,UAAU;AAAA,QACtB,gBAAgB,mBAAmB,UAAU,SAAS,GAAG;AAAA,MAC3D,EAAE;AAAA,MACF,aAAa,QAAQ;AAAA,MACrB,YAAY,QAAQ;AAAA,MACpB;AAAA,MACA,WAAW,mBAAmBA,OAAM;AAAA,IACtC;AAAA,IACA;AAAA,EACF;AACF;AAOA,SAAS,yBAAyBA,SAAgB,YAA4B;AAC5E,QAAM,UAAUA,QAAO,KAAK;AAC5B,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,kCAAkC;AAAA,EACpD;AAEA,QAAM,QAAQ,QAAQ,MAAM,OAAO,EAAE,OAAO,OAAO;AAEnD,MAAI,eAAe,SAAS;AAC1B,QAAI,CAAC,QAAQ,WAAW,GAAG,KAAK,CAAC,QAAQ,WAAW,GAAG,GAAG;AACxD,aAAO,eAAe,OAAO;AAAA,IAC/B;AAEA,UAAM,OAAO,gBAAgB,KAAK;AAElC,QAAI,CAAC,KAAK,kBAAkB,QAAQ,WAAW,GAAG,KAAK,QAAQ,WAAW,GAAG,IAAI;AAC/E,aAAO,eAAe,OAAO;AAAA,IAC/B;AAEA,QAAI,KAAK,aAAa;AACpB,YAAM,IAAI,MAAM,8BAA8B,KAAK,WAAW,EAAE;AAAA,IAClE;AAIA,aAAS,IAAI,KAAK,wBAAwB,SAAS,GAAG,KAAK,GAAG,KAAK;AACjE,YAAM,YAAY,KAAK,wBAAwB,CAAC;AAChD,UACE,UAAU,eAAe,mBACzB,UAAU,eAAe,eACzB,UAAU,eAAe,qBACzB;AACA,cAAM,WAAW,eAAe,UAAU,OAAO,EAAE,KAAK;AACxD,YAAI,UAAU;AACZ,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAGA,aAAS,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK;AAC1C,YAAM,OAAO,MAAM,CAAC;AAEpB,UAAI,KAAK,WAAW,GAAG,KAAK,KAAK,WAAW,GAAG,GAAG;AAChD;AAAA,MACF;AACA,YAAM,OAAO,KAAK,KAAK;AACvB,UAAI,QAAQ,CAAC,KAAK,eAAe;AAC/B,eAAO,eAAe,IAAI;AAAA,MAC5B;AAAA,IACF;AAGA,UAAM,YAAY,KAAK,iBAAiB,OAAO,KAAK,KAAK,YAAY,oBAAoB;AACzF,UAAM,IAAI,MAAM,6DAA6D,SAAS;AAAA,EACxF;AAGA,WAAS,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK;AAC1C,UAAM,OAAO,MAAM,CAAC;AACpB,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,UAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,YAAY,QAAQ;AACvE,cAAM,SAAU,OAAmC;AACnD,YAAI,OAAO,WAAW,UAAU;AAC9B,iBAAO,eAAe,MAAM,EAAE,KAAK;AAAA,QACrC;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAGA,WAAS,IAAI,MAAM,SAAS,GAAG,KAAK,GAAG,KAAK;AAC1C,UAAM,OAAO,MAAM,CAAC,EAAG,KAAK;AAC5B,QAAI,MAAM;AACR,aAAO,eAAe,IAAI;AAAA,IAC5B;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,kDAAkD;AACpE;AAEA,SAAS,gCACP,aACA,kBAC4B;AAC5B,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,eAAe,WAAW,CAAC;AAAA,EACjD,SAAS,OAAO;AACd,UAAM,IAAI;AAAA,MACR,qCAAqC,iBAAiB,QAAQ,MAAM,UAAU,cAAc;AAAA,IAC9F;AAAA,EACF;AAEA,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,UAAM,IAAI,MAAM,gDAAgD;AAAA,EAClE;AAEA,QAAM,SAAS;AACf,QAAM,SAAS,OAAO;AACtB,QAAM,SAAS,OAAO;AAEtB,MACG,WAAW,cAAc,WAAW,UACrC,OAAO,WAAW,YAClB,CAAC,OAAO,KAAK,GACb;AACA,UAAM,IAAI,MAAM,gDAAgD;AAAA,EAClE;AAEA,MAAI,WAAW,QAAQ;AACrB,UAAM,aAAa,OAAO;AAC1B,QAAI,eAAe,wBAAwB,eAAe,wBAAwB;AAChF,YAAM,IAAI,MAAM,sDAAsD;AAAA,IACxE;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,QAAQ,OAAO,KAAK;AAAA,IACtB;AAAA,EACF;AAEA,QAAM,WACJ,OAAO,OAAO,aAAa,YAAY,OAAO,SAAS,KAAK,IACxD,OAAO,SAAS,KAAK,EAAE,MAAM,GAAG,gBAAgB,IAChD;AAEN,QAAM,OAAyC,MAAM,QAAQ,OAAO,IAAI,IACpE,OAAO,KAAK,QAA4B,CAAC,UAAU;AACjD,QAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,aAAO,CAAC;AAAA,IACV;AACA,UAAM,OAAO;AACb,QACE,OAAO,KAAK,OAAO,YACnB,OAAO,KAAK,UAAU,YACrB,KAAK,WAAW,aAAa,KAAK,WAAW,iBAAiB,KAAK,WAAW,QAC/E;AACA,aAAO,CAAC;AAAA,IACV;AACA,WAAO,CAAC,EAAE,IAAI,KAAK,IAAI,OAAO,KAAK,OAAO,QAAQ,KAAK,OAAO,CAAC;AAAA,EACjE,CAAC,IACD;AAEJ,QAAM,cAAuD,MAAM,QAAQ,OAAO,WAAW,IACzF,OAAO,YAAY,QAAmC,CAAC,UAAU;AAC/D,QAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,aAAO,CAAC;AAAA,IACV;AACA,UAAM,SAAS;AACf,QACE,OAAO,OAAO,OAAO,YACpB,OAAO,WAAW,aACjB,OAAO,WAAW,iBAClB,OAAO,WAAW,QACpB;AACA,aAAO,CAAC;AAAA,IACV;AACA,WAAO,CAAC,EAAE,IAAI,OAAO,IAAI,QAAQ,OAAO,OAAO,CAAC;AAAA,EAClD,CAAC,IACD;AAEJ,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,OAAO,KAAK;AAAA,IACpB;AAAA,IACA;AAAA,IACA,cACE,OAAO,OAAO,iBAAiB,YAAY,OAAO,aAAa,KAAK,IAChE,OAAO,eACP;AAAA,IACN,iBACE,OAAO,OAAO,oBAAoB,YAAY,OAAO,gBAAgB,KAAK,IACtE,OAAO,gBAAgB,KAAK,IAC5B;AAAA,IACN;AAAA,EACF;AACF;AAvqBA,IAkBMC,cA6BO;AA/Cb;AAAA;AAAA;AACA,IAAAC;AAUA;AAGA;AAEA;AAEA,IAAMD,eAAiC;AAAA,MACrC,OAAO,MAAMA;AAAA,MACb,OAAO,MAAM;AAAA,MAAC;AAAA,MACd,OAAO,MAAM;AAAA,MAAC;AAAA,MACd,OAAO,MAAM;AAAA,MAAC;AAAA,MACd,MAAM,MAAM;AAAA,MAAC;AAAA,MACb,OAAO;AAAA,MACP,QAAQ,MAAM;AAAA,MAAC;AAAA,MACf,OAAO,MAAM;AAAA,MAAC;AAAA,MACd,MAAM,MAAM;AAAA,MAAC;AAAA,IACf;AAmBO,IAAM,sBAAN,MAA0B;AAAA,MAI/B,YACmB,MAQjB;AARiB;AASjB,aAAK,SAAS,KAAK,UAAU;AAC7B,aAAK,SAAS,KAAK,UAAUA;AAAA,MAC/B;AAAA,MAXmB;AAAA,MAJF;AAAA,MACA;AAAA,MAgBjB,MAAM,SACJ,YACA,SACA,UAA2B,CAAC,GACS;AACrC,cAAM,WAAW,KAAK,KAAK,iBAAiB;AAAA,UAC1C,CAAC,SAAS,KAAK,OAAO,WAAW;AAAA,QACnC;AACA,YAAI,CAAC,UAAU,4BAA4B;AACzC,gBAAM;AAAA,YACJ,MAAM;AAAA,YACN,SAAS;AAAA,UACX;AAAA,QACF;AAEA,cAAM,SAAS;AAAA,UACb;AAAA,UACA,KAAK,KAAK,mBAAmB,IAAI,SAAS,EAAE;AAAA,QAC9C;AAEA,cAAM,SAAS,YAAY,OAAO;AAClC,cAAM,UAAU,SAAS,2BAA2B,QAAQ;AAAA,UAC1D;AAAA,UACA,WAAW,WAAW;AAAA,UACtB,eAAe,QAAQ;AAAA,UACvB,OACE,OAAO,WAAW,mBAAmB,YAAY,WAAW,eAAe,KAAK,IAC5E,WAAW,eAAe,KAAK,IAC/B,OAAO,OAAO,UAAU,WACtB,OAAO,QACP;AAAA,QACV,CAAC;AAED,YAAI,CAAC,SAAS;AACZ,gBAAM;AAAA,YACJ,MAAM;AAAA,YACN,SAAS;AAAA,UACX;AAAA,QACF;AAEA,cAAM,SAAS,MAAM;AAAA,UACnB;AAAA,UACA,KAAK,KAAK,aAAa,iCAAiC,KAAK,KAAK,YAAY;AAAA,UAC9E;AAAA,QACF;AAEA,YAAI;AACJ,YAAI;AACF,wBAAc,yBAAyB,QAAQ,SAAS,EAAE;AAAA,QAC5D,SAAS,OAAO;AACd,gBAAM,QAAQ,OAAO,KAAK,EAAE,MAAM,OAAO,EAAE,OAAO,OAAO;AACzD;AAAA,YACE,KAAK;AAAA,YACL;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,gBAAgB,KAAK;AAAA,UACvB;AACA,gBAAM;AAAA,QACR;AAEA,eAAO,gCAAgC,aAAa,KAAK,OAAO,gBAAgB;AAAA,MAClF;AAAA,IACF;AAAA;AAAA;;;AClIA,SAAS,cAAAE,mBAAkB;AAsBpB,SAAS,2BAA2B,OAA6B;AACtE,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO,kBAAkB,KAAK;AAAA,EAClC;AACF;AAjCA,IAWa,2BAwBA;AAnCb;AAAA;AAAA;AACA,IAAAC;AAUO,IAAM,4BAAuD,oBAAI,IAAkB;AAAA,MACxF;AAAA,MACA;AAAA,IACF,CAAC;AAqBM,IAAM,qBAAN,MAAyB;AAAA,MAG9B,YACW,MAKT;AALS;AAMT,aAAK,SAAS,KAAK,UAAU;AAAA,MAC/B;AAAA,MAPW;AAAA,MAHM;AAAA,MAYjB,MAAM,OACJ,YACAC,QACA,cACA,UAAoC,CAAC,GACS;AAC9C,YAAI,QAAQ,QAAQ,SAAS;AAC3B,gBAAM;AAAA,YACJ,MAAM;AAAA,YACN,SAAS;AAAA,UACX;AAAA,QACF;AAEA,cAAM,UAAU,KAAK,KAAK,WAAW,IAAI,WAAW,SAAS;AAC7D,YAAI,CAAC,SAAS;AACZ,gBAAM;AAAA,YACJ,MAAM;AAAA,YACN,SAAS,WAAW,WAAW,SAAS;AAAA,UAC1C;AAAA,QACF;AACA,YAAI,CAAC,0BAA0B,IAAI,QAAQ,KAAK,GAAG;AACjD,gBAAM;AAAA,YACJ,MAAM;AAAA,YACN,SAAS,8BAA8B,WAAW,SAAS,KAAK,2BAA2B,QAAQ,KAAK,CAAC;AAAA,UAC3G;AAAA,QACF;AAEA,cAAM,UAAUA,OAAM,QAAQ,MAAM,GAAG,KAAK,OAAO,gBAAgB;AACnE,cAAM,OAAO,gBAAgB,OAAO;AAEpC,cAAM,OAAOF,YAAW,MAAM,EAAE,OAAO,IAAI,EAAE,OAAO,KAAK;AACzD,cAAM,YAAY,aACf,MAAM,GAAG,KAAK,OAAO,oBAAoB,EACzC,IAAI,CAAC,UAAU,MAAM,gBAAgB,EACrC,OAAO,CAAC,UAA2B,QAAQ,KAAK,CAAC,EACjD,KAAK,CAAC,UAAUA,YAAW,MAAM,EAAE,OAAO,KAAK,EAAE,OAAO,KAAK,MAAM,IAAI;AAE1E,YAAI,WAAW;AACb,iBAAO,EAAE,UAAU,OAAO,KAAK;AAAA,QACjC;AAEA,YAAI,QAAQ,QAAQ,SAAS;AAC3B,gBAAM;AAAA,YACJ,MAAM;AAAA,YACN,SAAS;AAAA,UACX;AAAA,QACF;AAKA,cAAM,wBAAwB;AAC9B,cAAM,sBAAsB;AAC5B,cAAM,SAAS;AACf,cAAM,UAAU,GAAG,qBAAqB,GAAG,IAAI,GAAG,mBAAmB,GAAG,MAAM;AAE9E,aAAK,KAAK,WAAW,UAAU,QAAQ,IAAI,OAAO,KAAK,SAAS,MAAM,GAAG,iBAAiB;AAC1F,eAAO,EAAE,UAAU,MAAM,KAAK;AAAA,MAChC;AAAA,IACF;AAAA;AAAA;;;AC3GA,IAKa;AALb;AAAA;AAAA;AAKO,IAAM,sBAAN,MAA0B;AAAA,MAM/B,YACmB,MAMjB;AANiB;AAAA,MAMhB;AAAA,MANgB;AAAA,MANX,cAAmC;AAAA,MACnC,iBAAuD;AAAA,MAC9C,wBAAwB;AAAA,MACxB,wBAAwB,oBAAI,IAAoB;AAAA,MAWjE,QAAc;AACZ,aAAK,cAAc;AACnB,aAAK,cAAc,KAAK,KAAK,SAAS;AAAA,UACpC;AAAA,UACA,CAAC,UAAiC;AAChC,gBAAI,MAAM,UAAU,kBAAkB;AACpC;AAAA,YACF;AACA,iBAAK,KAAK,gBAAgB,MAAM,SAAS;AAAA,UAC3C;AAAA,QACF;AAAA,MACF;AAAA,MAEA,UAAgB;AACd,aAAK,oBAAoB;AAEzB,cAAM,YAAY,KAAK,KAAK,2BAA2B,KAAK,CAAC;AAC7D,aAAK,gBAAgB,SAAS;AAC9B,YAAI,UAAU,WAAW,GAAG;AAC1B;AAAA,QACF;AAEA,cAAM,MAAM,KAAK,IAAI;AACrB,cAAM,SAAS,UAAU,OAAO,CAAC,UAAU,SAAS;AAClD,gBAAM,YAAY,KAAK,iBAAiB,MAAM,GAAG;AACjD,iBAAO,YAAY,WAAW,YAAY;AAAA,QAC5C,GAAG,OAAO,iBAAiB;AAC3B,YAAI,CAAC,OAAO,SAAS,MAAM,GAAG;AAC5B;AAAA,QACF;AAEA,cAAM,UAAU,KAAK,IAAI,SAAS,KAAK,CAAC;AACxC,aAAK,iBAAiB,WAAW,MAAM;AACrC,eAAK,iBAAiB;AACtB,gBAAM,UAAU,KAAK,KAAK,2BAA2B,KAAK,CAAC;AAC3D,eAAK,gBAAgB,OAAO;AAE5B,gBAAM,QAAQ,KAAK,IAAI;AACvB,gBAAM,MAAM,QAAQ;AAAA,YAClB,CAAC,SACC,KAAK,eAAe,UACnB,KAAK,sBAAsB,IAAI,KAAK,YAAY,KAAK,OAAO,sBAAsB;AAAA,UACvF;AACA,qBAAW,QAAQ,KAAK;AACtB,iBAAK,sBAAsB,IAAI,KAAK,cAAc,QAAQ,KAAK,qBAAqB;AACpF,iBAAK,KAAK,iBAAiB,KAAK,YAAY;AAAA,UAC9C;AACA,eAAK,QAAQ;AAAA,QACf,GAAG,OAAO;AACV,aAAK,eAAe,QAAQ;AAAA,MAC9B;AAAA,MAEA,OAAa;AACX,aAAK,cAAc;AACnB,aAAK,cAAc;AACnB,aAAK,oBAAoB;AACzB,aAAK,sBAAsB,MAAM;AAAA,MACnC;AAAA,MAEQ,sBAA4B;AAClC,YAAI,KAAK,gBAAgB;AACvB,uBAAa,KAAK,cAAc;AAChC,eAAK,iBAAiB;AAAA,QACxB;AAAA,MACF;AAAA,MAEQ,iBACN,MACA,KACQ;AACR,YAAI,KAAK,cAAc,KAAK;AAC1B,iBAAO,KAAK;AAAA,QACd;AAEA,cAAM,UAAU,KAAK,sBAAsB,IAAI,KAAK,YAAY;AAChE,eAAO,WAAW,UAAU,MAAM,UAAU,KAAK;AAAA,MACnD;AAAA,MAEQ,gBAAgB,WAAuE;AAC7F,cAAM,eAAe,IAAI,IAAI,UAAU,IAAI,CAAC,SAAS,KAAK,YAAY,CAAC;AACvE,mBAAW,gBAAgB,KAAK,sBAAsB,KAAK,GAAG;AAC5D,cAAI,CAAC,aAAa,IAAI,YAAY,GAAG;AACnC,iBAAK,sBAAsB,OAAO,YAAY;AAAA,UAChD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACkBA,SAAS,2BAA+C;AACtD,MAAIG,WAAU,MAAM;AAAA,EAAC;AACrB,QAAM,UAAU,IAAI,QAAc,CAAC,iBAAiB;AAClD,IAAAA,WAAU;AAAA,EACZ,CAAC;AACD,SAAO,EAAE,SAAS,SAAAA,SAAQ;AAC5B;AAEA,SAAS,uBAA+B;AACtC,SAAO,OAAO,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AACpE;AAEA,SAAS,kBAA0B;AACjC,SAAO,SAAS,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AACtE;AAEA,SAAS,oBAA4B;AACnC,SAAO,WAAW,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AACxE;AAEA,SAAS,UAAU,OAAgB,UAA0B;AAC3D,MAAI,iBAAiB,OAAO;AAC1B,WAAO,MAAM;AAAA,EACf;AACA,MAAI,SAAS,OAAO,UAAU,YAAY,aAAa,OAAO;AAC5D,UAAM,QAAS,MAA+B;AAC9C,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,WACP,QACA,OACA,SACA,SACM;AACN,SAAO,MAAM,EAAE,GAAG,SAAS,KAAK,MAAM,GAAG,OAAO;AAClD;AA48CA,SAAS,wBAAwB,OAG/B;AACA,SACE,CAAC,CAAC,SACF,OAAO,UAAU,YAChB,MAA6B,SAAS;AAE3C;AAznDA,IAoCMC,cAkIO;AAtKb,IAAAC,gBAAA;AAAA;AAAA;AAAA,IAAAC;AAyBA;AACA;AACA;AAKA;AACA;AAGA,IAAMF,eAAiC;AAAA,MACrC,OAAO,MAAMA;AAAA,MACb,OAAO,MAAM;AAAA,MAAC;AAAA,MACd,OAAO,MAAM;AAAA,MAAC;AAAA,MACd,OAAO,MAAM;AAAA,MAAC;AAAA,MACd,MAAM,MAAM;AAAA,MAAC;AAAA,MACb,OAAO;AAAA,MACP,QAAQ,MAAM;AAAA,MAAC;AAAA,MACf,OAAO,MAAM;AAAA,MAAC;AAAA,MACd,MAAM,MAAM;AAAA,MAAC;AAAA,IACf;AAwHO,IAAM,oBAAN,MAAwB;AAAA,MAiB7B,YAA6B,MAA6B;AAA7B;AAC3B,aAAK,SAAS,KAAK,UAAUA;AAC7B,aAAK,SAAS,KAAK,UAAU;AAC7B,aAAK,iBAAiB,IAAI,yBAAyB;AAAA,UACjD,cAAc,KAAK;AAAA,UACnB,YAAY,KAAK;AAAA,UACjB,aAAa,KAAK;AAAA,UAClB,kBAAkB,KAAK;AAAA,UACvB,QAAQ,KAAK;AAAA,QACf,CAAC;AACD,aAAK,YAAY,IAAI,oBAAoB;AAAA,UACvC,kBAAkB,KAAK;AAAA,UACvB,oBAAoB,KAAK;AAAA,UACzB,cAAc,KAAK;AAAA,UACnB,QAAQ,KAAK;AAAA,UACb,QAAQ,KAAK;AAAA,QACf,CAAC;AACD,aAAK,WAAW,IAAI,mBAAmB;AAAA,UACrC,YAAY,KAAK;AAAA,UACjB,aAAa,KAAK;AAAA,UAClB,QAAQ,KAAK;AAAA,QACf,CAAC;AACD,aAAK,YAAY,IAAI,oBAAoB;AAAA,UACvC,UAAU,KAAK;AAAA,UACf,iBAAiB,CAAC,cAAc;AAC9B,kBAAM,eAAe,KAAK,qBAAqB,IAAI,SAAS;AAC5D,gBAAI,cAAc;AAChB,mBAAK,KAAK,cAAc,cAAc,gBAAgB,EAAE,MAAM,CAAC,UAAU;AACvE,qBAAK,OAAO,KAAK,EAAE,KAAK,OAAO,aAAa,GAAG,mCAAmC;AAAA,cACpF,CAAC;AAAA,YACH;AAAA,UACF;AAAA,UACA,0BAA0B,MAAM,KAAK,yBAAyB;AAAA,UAC9D,gBAAgB,CAAC,iBAAiB;AAChC,iBAAK,KAAK,cAAc,cAAc,WAAW,EAAE,MAAM,CAAC,UAAU;AAClE,mBAAK,OAAO;AAAA,gBACV,EAAE,KAAK,OAAO,aAAa;AAAA,gBAC3B;AAAA,cACF;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MA1C6B;AAAA,MAhBZ,cAAc,oBAAI,IAAwB;AAAA,MAC1C,uBAAuB,oBAAI,IAAoB;AAAA,MAC/C,WAAW,oBAAI,IAAY;AAAA,MAC3B,iBAAiB,oBAAI,IAAY;AAAA,MACjC,gBAAgB,oBAAI,IAAY;AAAA,MAChC,0BAA0B,oBAAI,IAAY;AAAA,MAC1C,6BAA6B,oBAAI,IAA6B;AAAA,MAC9D,sBAAsB,oBAAI,IAAgC;AAAA,MAC1D;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACT,uBAA4C;AAAA,MA8CpD,MAAM,UAAyB;AAC7B,aAAK,YAAY,MAAM;AACvB,aAAK,qBAAqB,MAAM;AAEhC,mBAAW,cAAc,KAAK,KAAK,eAAe,QAAQ,GAAG;AAC3D,gBAAM,qBAAqB,MAAM,KAAK,mBAAmB,UAAU;AACnE,gBAAM,kBACJ,mBAAmB,UAAU,gBAAgB,mBAAmB,UAAU,cACtE,SACA,mBAAmB;AAEzB,gBAAM,YACJ,oBAAoB,mBAAmB,QACnC,qBACA,KAAK;AAAA,YACH,KAAK,KAAK,eAAe,OAAO,mBAAmB,IAAI;AAAA,cACrD,OAAO;AAAA,cACP,aAAa;AAAA,cACb,WAAW,KAAK,IAAI;AAAA,YACtB,CAAC;AAAA,UACH;AAKN,gBAAM,QAAQ,KAAK,KAAK,UACrB,wBAAwB,mBAAmB,IAAI,KAAK,OAAO,mBAAmB,EAC9E,OAAO,CAAC,UAAU,MAAM,WAAW,YAAY,MAAM,WAAW,YAAY;AAC/E,qBAAW,SAAS,OAAO;AACzB,gBAAI;AACF,mBAAK,KAAK,UAAU,OAAO,MAAM,IAAI;AAAA,gBACnC,QAAQ;AAAA,gBACR,aAAa;AAAA,gBACb,aAAa,KAAK,IAAI;AAAA,cACxB,CAAC;AAAA,YACH,SAAS,OAAO;AACd,mBAAK,OAAO;AAAA,gBACV,EAAE,KAAK,OAAO,SAAS,MAAM,IAAI,cAAc,mBAAmB,GAAG;AAAA,gBACrE;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAEA,eAAK,cAAc,KAAK,aAAa,SAAS,CAAC;AAAA,QACjD;AAEA,aAAK,uBAAuB;AAC5B,aAAK,uBAAuB,KAAK,KAAK,SAAS;AAAA,UAC7C;AAAA,UACA,CAAC,UAAiC;AAChC,gBAAI,MAAM,UAAU,WAAW;AAC7B;AAAA,YACF;AACA,kBAAM,eAAe,KAAK,qBAAqB,IAAI,MAAM,SAAS;AAClE,gBAAI,cAAc;AAChB,mBAAK,KAAK,OAAO,YAAY,EAAE,MAAM,CAAC,UAAU;AAC9C,qBAAK,OAAO,KAAK,EAAE,KAAK,OAAO,aAAa,GAAG,uCAAuC;AAAA,cACxF,CAAC;AAAA,YACH;AAAA,UACF;AAAA,QACF;AAEA,aAAK,UAAU,MAAM;AACrB,aAAK,UAAU,QAAQ;AAAA,MACzB;AAAA,MAEA,OAAa;AACX,aAAK,UAAU,KAAK;AACpB,aAAK,uBAAuB;AAC5B,aAAK,uBAAuB;AAAA,MAC9B;AAAA,MAEA,IAAI,IAAoC;AACtC,eAAO,KAAK,YAAY,IAAI,EAAE;AAAA,MAChC;AAAA,MAEA,aAAa,WAA2C;AACtD,cAAM,eAAe,KAAK,qBAAqB,IAAI,SAAS;AAC5D,eAAO,eAAe,KAAK,YAAY,IAAI,YAAY,IAAI;AAAA,MAC7D;AAAA,MAEA,MAAM,mBAAmB,aAAoC;AAC3D,cAAM,gBAAgB,MAAM,KAAK,KAAK,YAAY,OAAO,CAAC,EACvD,OAAO,CAAC,eAAe,WAAW,gBAAgB,WAAW,EAC7D,IAAI,CAAC,eAAe,WAAW,EAAE;AACpC,cAAM,UAA2B,CAAC;AAElC,mBAAW,gBAAgB,eAAe;AACxC,gBAAM,aAAa,KAAK,YAAY,IAAI,YAAY;AACpD,cAAI,CAAC,YAAY;AACf;AAAA,UACF;AAEA,eAAK,eAAe,IAAI,YAAY;AACpC,cAAI,CAAC,KAAK,SAAS,IAAI,YAAY,GAAG;AACpC,iBAAK,UAAU,UAAU;AACzB;AAAA,UACF;AAEA,eAAK,2BAA2B,IAAI,YAAY,GAAG,MAAM;AACzD,gBAAM,aAAa,KAAK,oBAAoB,IAAI,YAAY;AAC5D,cAAI,YAAY;AACd,oBAAQ,KAAK,WAAW,OAAO;AAAA,UACjC;AAAA,QACF;AAEA,cAAM,QAAQ,IAAI,OAAO;AAAA,MAC3B;AAAA,MAEA,MAAM,OAAO,KAAmD;AAC9D,cAAM,UAAU,KAAK,KAAK,WAAW,IAAI,IAAI,SAAS;AACtD,YAAI,CAAC,SAAS;AACZ,gBAAM;AAAA,YACJ,MAAM;AAAA,YACN,SAAS,WAAW,IAAI,SAAS;AAAA,UACnC;AAAA,QACF;AACA,YAAI,QAAQ,UAAU,SAAS;AAC7B,gBAAM;AAAA,YACJ,MAAM;AAAA,YACN,SAAS;AAAA,UACX;AAAA,QACF;AACA,cAAM,kBAAkB,KAAK,uBAAuB,QAAQ,UAAU;AACtE,YAAI,CAAC,KAAK,mBAAmB,eAAe,GAAG;AAC7C,gBAAM;AAAA,YACJ,MAAM;AAAA,YACN,SAAS,YAAY,QAAQ,UAAU;AAAA,UACzC;AAAA,QACF;AACA,YAAI,KAAK,qBAAqB,IAAI,IAAI,SAAS,GAAG;AAChD,gBAAM;AAAA,YACJ,MAAM;AAAA,YACN,SAAS,iCAAiC,IAAI,SAAS;AAAA,UACzD;AAAA,QACF;AAEA,aAAK,wBAAwB,IAAI,mBAAmB;AAEpD,cAAM,MAAM,KAAK,IAAI;AACrB,cAAM,YAAY,IAAI,UAAU,KAAK;AACrC,cAAM,YAAY,KAAK,iBAAiB,IAAI,WAAW;AACvD,cAAM,eAAe,qBAAqB;AAC1C,cAAM,aAAa,KAAK;AAAA,UACtB,KAAK,KAAK,eAAe,OAAO;AAAA,YAC9B,IAAI;AAAA,YACJ,WAAW,IAAI;AAAA,YACf,aAAa,IAAI;AAAA,YACjB,OAAO;AAAA,YACP;AAAA,YACA,qBAAqB,IAAI;AAAA,YACzB,gBAAgB,IAAI,gBAAgB,KAAK,KAAK;AAAA,YAC9C,qBAAqB,IAAI,uBAAuB;AAAA,YAChD,2BAA2B;AAAA,YAC3B,aAAa,IAAI;AAAA,YACjB,WAAW;AAAA,YACX,WAAW;AAAA,UACb,CAAC;AAAA,QACH;AACA,YAAI;AACJ,YAAI;AACF,gBAAM,KAAK,KAAK,YAAY,kBAAkB,UAAU,MAAM;AAAA,YAC5D,UAAU;AAAA,YACV,WAAW,IAAI;AAAA,YACf,aAAa,IAAI;AAAA,YACjB;AAAA,YACA,WAAW;AAAA,UACb,CAAC;AAED,qBAAW,MAAM,KAAK,kBAAkB,YAAY,UAAU,IAAI;AAAA,QACpE,SAAS,OAAO;AACd,eAAK,KAAK,eAAe,OAAO,WAAW,EAAE;AAC7C,gBAAM;AAAA,QACR;AAEA,aAAK,cAAc,QAAQ;AAC3B,aAAK,eAAe,UAAU,SAAS;AACvC,aAAK,UAAU,QAAQ;AACvB,eAAO;AAAA,MACT;AAAA,MAEA,MAAM,OAAO,IAAY,OAAqD;AAC5E,YAAI,UAAU,KAAK,kBAAkB,EAAE;AAEvC,YAAI,MAAM,qBAAqB;AAC7B,eAAK,wBAAwB,MAAM,mBAAmB;AAAA,QACxD;AAEA,cAAM,gBACJ,MAAM,cAAc,SAAY,MAAM,UAAU,KAAK,IAAI,QAAQ;AACnE,cAAM,mBAAmB,MAAM,cAAc,UAAa,kBAAkB,QAAQ;AAEpF,YAAI,oBAAoB,KAAK,SAAS,IAAI,EAAE,GAAG;AAC7C,eAAK,wBAAwB,IAAI,EAAE;AACnC,eAAK,2BAA2B,IAAI,EAAE,GAAG,MAAM;AAC/C,gBAAM,KAAK,oBAAoB,IAAI,EAAE,GAAG;AACxC,oBAAU,KAAK,kBAAkB,EAAE;AAAA,QACrC;AAEA,cAAM,YAAY,KAAK,iBAAiB,QAAQ,WAAW;AAC3D,cAAM,YAAqD;AAAA,UACzD,WAAW;AAAA,UACX,qBAAqB,MAAM,uBAAuB,QAAQ;AAAA,UAC1D,gBACE,MAAM,mBAAmB,SACrB,QAAQ,iBACR,MAAM,gBAAgB,KAAK,KAAK;AAAA,UACtC,qBAAqB,MAAM,uBAAuB,QAAQ;AAAA,UAC1D,aAAa,MAAM,gBAAgB,SAAY,QAAQ,cAAc,MAAM;AAAA,UAC3E,OAAO,mBACH,QAAQ,UAAU,WAChB,WACA,SACF,QAAQ,UAAU,UAChB,SACA,QAAQ;AAAA,UACd,YAAY,mBAAmB,OAAO,QAAQ;AAAA,UAC9C,2BAA2B,mBAAmB,IAAI,QAAQ;AAAA,UAC1D,qBAAqB,mBAAmB,OAAO,QAAQ;AAAA,UACvD,aAAa;AAAA,UACb,WAAW,KAAK,IAAI;AAAA,QACtB;AAEA,cAAM,gBAAgB,KAAK,wBAAwB,SAAS,KAAK,IAAI,CAAC;AACtE,aAAK,KAAK,eAAe,OAAO,IAAI,SAAS;AAE7C,YAAI,kBAAkB;AACpB,cAAI;AACF,kBAAM,KAAK,KAAK,YAAY,iBAAiB,UAAU,MAAM;AAAA,cAC3D,UAAU,QAAQ;AAAA,cAClB,WAAW,QAAQ;AAAA,cACnB,aAAa,QAAQ;AAAA,cACrB,WAAW;AAAA,cACX,WAAW,UAAU,aAAa,KAAK,IAAI;AAAA,YAC7C,CAAC;AAAA,UACH,SAAS,OAAO;AACd,gBAAI;AACF,mBAAK,KAAK,eAAe,OAAO,IAAI,aAAa;AAAA,YACnD,SAAS,eAAe;AACtB,mBAAK,OAAO;AAAA,gBACV,EAAE,KAAK,eAAe,cAAc,GAAG;AAAA,gBACvC;AAAA,cACF;AAAA,YACF;AACA,kBAAM;AAAA,UACR;AAAA,QACF;AAEA,cAAM,WAAW,MAAM,KAAK,2BAA2B,IAAI,UAAU,IAAI;AACzE,YAAI,CAAC,UAAU;AACb,gBAAM,KAAK,4BAA4B,UAAU,MAAM,OAAO,EAAE,MAAM,MAAM;AAAA,UAAC,CAAC;AAC9E,gBAAM,KAAK,wBAAwB,EAAE;AAAA,QACvC;AAEA,aAAK,cAAc,QAAQ;AAC3B,aAAK,eAAe,UAAU,SAAS;AACvC,aAAK,UAAU,QAAQ;AACvB,eAAO;AAAA,MACT;AAAA,MAEA,MAAM,MAAM,IAAiC;AAC3C,YAAI,KAAK,SAAS,IAAI,EAAE,GAAG;AACzB,eAAK,cAAc,IAAI,EAAE;AACzB,eAAK,2BAA2B,IAAI,EAAE,GAAG,MAAM;AAAA,QACjD;AAEA,cAAM,UAAU,KAAK;AAAA,UACnB,KAAK;AAAA,YACH,KAAK,KAAK,eAAe,OAAO,IAAI;AAAA,cAClC,OAAO;AAAA,cACP,WAAW,KAAK,IAAI;AAAA,YACtB,CAAC;AAAA,UACH;AAAA,QACF;AAEA,aAAK,cAAc,OAAO;AAC1B,aAAK,eAAe,SAAS,eAAe;AAC5C,aAAK,UAAU,QAAQ;AACvB,eAAO;AAAA,MACT;AAAA,MAEA,MAAM,OAAO,IAAiC;AAC5C,cAAM,UAAU,KAAK;AAAA,UACnB,KAAK;AAAA,YACH,KAAK,KAAK,eAAe,OAAO,IAAI;AAAA,cAClC,OAAO;AAAA,cACP,aAAa;AAAA,cACb,WAAW,KAAK,IAAI;AAAA,YACtB,CAAC;AAAA,UACH;AAAA,QACF;AAEA,aAAK,cAAc,OAAO;AAC1B,aAAK,eAAe,SAAS,eAAe;AAC5C,aAAK,UAAU,QAAQ;AACvB,eAAO;AAAA,MACT;AAAA,MAEA,MAAM,OAAO,IAA2B;AACtC,cAAM,aAAa,KAAK,kBAAkB,EAAE;AAE5C,YAAI,KAAK,SAAS,IAAI,EAAE,GAAG;AACzB,eAAK,eAAe,IAAI,EAAE;AAC1B,eAAK,2BAA2B,IAAI,EAAE,GAAG,MAAM;AAC/C,gBAAM,KAAK,oBAAoB,IAAI,EAAE,GAAG;AACxC,eAAK,UAAU,QAAQ;AACvB;AAAA,QACF;AAEA,aAAK,UAAU,UAAU;AAAA,MAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,MAAM,kBAAkB,IAAsC;AAC5D,cAAM,UAAU,MAAM,KAAK,WAAW,IAAI,QAAQ;AAClD,YAAI,CAAC,SAAS;AACZ,gBAAM;AAAA,YACJ,MAAM;AAAA,YACN,SAAS,cAAc,EAAE;AAAA,UAC3B;AAAA,QACF;AAIA,aAAK,KAAK,YAAY,OAAO,EAAE,MAAM,CAAC,UAAU;AAC9C,eAAK,OAAO;AAAA,YACV,EAAE,KAAK,OAAO,cAAc,IAAI,SAAS,QAAQ,MAAM,GAAG;AAAA,YAC1D;AAAA,UACF;AAAA,QACF,CAAC;AAED,eAAO,QAAQ;AAAA,MACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,MAAM,cACJ,cACA,UAA0C,kBACT;AACjC,cAAM,UAAU,MAAM,KAAK,WAAW,cAAc,OAAO;AAC3D,YAAI,CAAC,SAAS;AACZ,iBAAO;AAAA,QACT;AACA,eAAO,MAAM,KAAK,YAAY,OAAO;AAAA,MACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAaA,MAAc,WACZ,IACA,SAC8B;AAC9B,cAAM,aAAa,KAAK,kBAAkB,EAAE;AAC5C,cAAM,UAAU,KAAK,KAAK,WAAW,IAAI,WAAW,SAAS;AAE7D,YAAI,CAAC,SAAS;AACZ,gBAAM;AAAA,YACJ,MAAM;AAAA,YACN,SAAS,WAAW,WAAW,SAAS;AAAA,UAC1C;AAAA,QACF;AAEA,YAAI,KAAK,SAAS,IAAI,EAAE,GAAG;AACzB,cAAI,YAAY,UAAU;AACxB,kBAAM;AAAA,cACJ,MAAM;AAAA,cACN,SAAS,cAAc,EAAE;AAAA,YAC3B;AAAA,UACF;AACA,iBAAO;AAAA,QACT;AAEA,YAAI,WAAW,UAAU,UAAU;AACjC,cAAI,YAAY,UAAU;AACxB,kBAAM;AAAA,cACJ,MAAM;AAAA,cACN,SAAS,cAAc,EAAE;AAAA,YAC3B;AAAA,UACF;AACA,iBAAO;AAAA,QACT;AAEA,YAAI,WAAW,UAAU,WAAW;AAClC,cAAI,YAAY,UAAU;AACxB,kBAAM;AAAA,cACJ,MAAM;AAAA,cACN,SAAS,cAAc,EAAE;AAAA,YAC3B;AAAA,UACF;AACA,iBAAO;AAAA,QACT;AAEA,aACG,YAAY,oBAAoB,YAAY,iBAC5C,WAAW,UAAU,UAAW,QAAQ,UAAU,aAAa,QAAQ,UAAU,SAClF;AACA,iBAAO;AAAA,QACT;AAEA,YACE,WAAW,sBAAsB,KACjC,WAAW,6BAA6B,WAAW,qBACnD;AACA,gBAAM,UAAU,KAAK;AAAA,YACnB,KAAK,KAAK,eAAe,OAAO,IAAI;AAAA,cAClC,OAAO;AAAA,cACP,YAAY;AAAA,cACZ,WAAW,KAAK,IAAI;AAAA,YACtB,CAAC;AAAA,UACH;AACA,eAAK,cAAc,OAAO;AAC1B,eAAK,eAAe,SAAS,eAAe;AAC5C,eAAK,UAAU,QAAQ;AACvB,iBAAO;AAAA,QACT;AAKA,YAAI,YAAY,kBAAkB;AAChC,cACE,WAAW,gBAAgB,UAC3B,WAAW,gBAAgB,QAC3B,WAAW,cAAc,KAAK,IAAI,GAClC;AACA,mBAAO;AAAA,UACT;AAAA,QACF;AAEA,YAAI,YAAY,aAAa;AAC3B,cAAI,WAAW,gBAAgB,UAAa,WAAW,cAAc,KAAK,IAAI,GAAG;AAC/E,mBAAO;AAAA,UACT;AAAA,QACF;AAMA,YAAI,YAAY,YAAY,CAAC,0BAA0B,IAAI,QAAQ,KAAK,GAAG;AACzE,gBAAM;AAAA,YACJ,MAAM;AAAA,YACN,SAAS,cAAc,EAAE,yBAAyB,2BAA2B,QAAQ,KAAK,CAAC;AAAA,UAC7F;AAAA,QACF;AAEA,aAAK,SAAS,IAAI,EAAE;AACpB,aAAK,2BAA2B,IAAI,IAAI,IAAI,gBAAgB,CAAC;AAC7D,aAAK,oBAAoB,IAAI,IAAI,yBAAyB,CAAC;AAE3D,YAAI;AACF,gBAAM,gBAAgB,2BAA2B,KAAK,KAAK,YAAY;AACvE,gBAAM,YAAY,KAAK,iBAAiB,WAAW,WAAW;AAC9D,gBAAM,qBAAqB,MAAM,KAAK,kBAAkB,YAAY,UAAU,IAAI;AAClF,gBAAM,eAAe,mBAAmB;AACxC,cAAI,CAAC,cAAc;AACjB,kBAAM,IAAI,MAAM,wCAAwC,WAAW,EAAE,EAAE;AAAA,UACzE;AACA,gBAAM,UAAU,MAAM,KAAK,eAAe,MAAM,oBAAoB,YAAY;AAChF,cACE,YAAY,oBACZ,QAAQ,cACR,QAAQ,eAAe,WAAW,qBAClC;AACA,iBAAK,gBAAgB,EAAE;AACvB,mBAAO;AAAA,UACT;AAEA,gBAAM,2BACJ,YAAY,eACX,YAAY,oBACX,WAAW,gBAAgB,UAC3B,WAAW,gBAAgB,QAC3B,WAAW,eAAe,KAAK,IAAI;AAEvC,gBAAM,uBAAuB,KAAK;AAAA,YAChC,KAAK;AAAA,cACH,KAAK,KAAK,eAAe,OAAO,WAAW,IAAI;AAAA,gBAC7C,OAAO;AAAA,gBACP,aAAa,2BAA2B,OAAQ,WAAW,eAAe;AAAA,gBAC1E,YAAY;AAAA,gBACZ,aAAa;AAAA,gBACb,WAAW,KAAK,IAAI;AAAA,cACtB,CAAC;AAAA,YACH;AAAA,UACF;AACA,eAAK,cAAc,oBAAoB;AACvC,eAAK,eAAe,sBAAsB,eAAe;AACzD,eAAK,UAAU,QAAQ;AAEvB,gBAAM,cAAc,KAAK,KAAK,UAAU,OAAO;AAAA,YAC7C,IAAI,gBAAgB;AAAA,YACpB,cAAc,WAAW;AAAA,YACzB,WAAW,WAAW;AAAA,YACtB,QAAQ;AAAA,YACR;AAAA,YACA,gBAAgB,QAAQ;AAAA,YACxB,WAAW,WAAW;AAAA,YACtB,qBAAqB,WAAW;AAAA,YAChC,QAAQ,QAAQ;AAAA,YAChB,WAAW,KAAK,IAAI;AAAA,UACtB,CAAC;AACD,eAAK,eAAe,sBAAsB,aAAa,SAAS;AAEhE,iBAAO;AAAA,YACL,OAAO;AAAA,YACP,YAAY;AAAA,YACZ;AAAA,YACA,UAAU,mBAAmB;AAAA,YAC7B;AAAA,YACA,OAAO;AAAA,cACL,cAAc,cAAc;AAAA,cAC5B,eAAe,cAAc;AAAA,cAC7B,cAAc,cAAc,gBAAgB;AAAA,cAC5C,gBAAgB,cAAc;AAAA,cAC9B,uBAAuB,cAAc;AAAA,YACvC;AAAA,UACF;AAAA,QACF,SAAS,OAAgB;AAIvB,eAAK,gBAAgB,EAAE;AACvB,eAAK,oBAAoB,IAAI,KAAK;AAClC,gBAAM;AAAA,QACR;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,MAAc,YAAY,SAAiD;AACzE,cAAM,EAAE,OAAO,aAAa,SAAS,SAAS,IAAI;AAClD,cAAM,eAAe,YAAY;AAEjC,YAAI;AACF,gBAAM,SAAS,KAAK,2BAA2B,IAAI,YAAY,GAAG;AAClE,gBAAM,aAAa,MAAM,KAAK,sBAAsB,SAAS,MAAM;AACnE,gBAAM,YAAY,MAAM,KAAK;AAAA,YAC3B;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAEA,cAAI,KAAK,eAAe,IAAI,YAAY,GAAG;AACzC,iBAAK,eAAe,OAAO,YAAY;AACvC,iBAAK,UAAU,UAAU,UAAU;AAAA,UACrC;AAEA,iBAAO,UAAU;AAAA,QACnB,SAAS,OAAgB;AACvB,cAAI,wBAAwB,KAAK,GAAG;AAClC,kBAAM,YAAY,KAAK,wBAAwB,YAAY;AAC3D,kBAAM,eAAe,KAAK,KAAK,UAAU,OAAO,YAAY,IAAI;AAAA,cAC9D,QAAQ,YAAY,cAAc;AAAA,cAClC,aAAa,YAAY,OAAO,UAAU,OAAO,8BAA8B;AAAA,cAC/E,aAAa,KAAK,IAAI;AAAA,YACxB,CAAC;AAED,kBAAMG,qBACJ,KAAK,YAAY,IAAI,YAAY,KAAK,KAAK,kBAAkB,YAAY;AAE3E,gBAAI,KAAK,eAAe,IAAI,YAAY,GAAG;AACzC,oBAAMC,aAAY,KAAK,KAAK,aAAa,IAAID,mBAAkB,WAAW;AAC1E,kBAAIC,YAAW;AACb,sBAAM,KAAK;AAAA,kBACTA,WAAU;AAAA,kBACV;AAAA,kBACA;AAAA,kBACA,aAAa,eAAe;AAAA,gBAC9B;AACA,sBAAM,KAAK,4BAA4BA,WAAU,MAAMD,kBAAiB;AAAA,cAC1E;AACA,mBAAK,eAAeA,oBAAmB,cAAc,SAAS;AAC9D,mBAAK,eAAe,OAAO,YAAY;AACvC,mBAAK,UAAUA,kBAAiB;AAChC,qBAAO;AAAA,YACT;AAEA,gBAAI,KAAK,wBAAwB,IAAI,YAAY,GAAG;AAClD,oBAAME,aAA6B,KAAK,cAAc,IAAI,YAAY,IAClE,WACA;AACJ,oBAAMC,uBAAsB,KAAK;AAAA,gBAC/B,KAAK,KAAK,eAAe,OAAO,cAAc;AAAA,kBAC5C,OAAOD;AAAA,kBACP,YAAY;AAAA,kBACZ,aAAa;AAAA,kBACb,WAAW,KAAK,IAAI;AAAA,gBACtB,CAAC;AAAA,cACH;AAEA,mBAAK,cAAcC,oBAAmB;AACtC,mBAAK,eAAeA,sBAAqB,cAAc,SAAS;AAChE,mBAAK,eAAeA,sBAAqB,eAAe;AACxD,mBAAK,KAAK,UAAU,YAAY,cAAc,KAAK,OAAO,mBAAmB;AAC7E,mBAAK,UAAU,QAAQ;AAEvB,qBAAO;AAAA,YACT;AAEA,gBAAIH,mBAAkB,aAAa,UAAU;AAC3C,oBAAMC,aAAY,KAAK,KAAK,aAAa,IAAID,mBAAkB,WAAW;AAC1E,oBAAM,WAAW,KAAK;AAAA,gBACpBC,aACI,MAAM,KAAK,kBAAkBD,oBAAmBC,WAAU,IAAI,IAC9DD;AAAA,cACN;AACA,kBAAIC,cAAa,aAAa,WAAW,UAAU;AACjD,sBAAM,KAAK;AAAA,kBACTA,WAAU;AAAA,kBACV;AAAA,kBACA;AAAA,kBACA,aAAa,eAAe;AAAA,gBAC9B;AAAA,cACF;AACA,mBAAK,cAAc,QAAQ;AAC3B,mBAAK,eAAe,UAAU,cAAc,SAAS;AACrD,mBAAK,KAAK,UAAU,YAAY,cAAc,KAAK,OAAO,mBAAmB;AAC7E,mBAAK,UAAU,QAAQ;AACvB,mBAAK,cAAc,OAAO,YAAY;AACtC,qBAAO;AAAA,YACT;AAEA,kBAAM,cAAc,KAAK,YAAY,IAAI,YAAY,GAAG;AACxD,kBAAM,YACJ,aAAa,gBAAgB,WAAW,WAAW;AACrD,kBAAM,sBAAsB,KAAK;AAAA,cAC/B,KAAK,KAAK,eAAe,OAAO,cAAc;AAAA,gBAC5C,OAAO;AAAA,gBACP,YAAY;AAAA,gBACZ,aAAa;AAAA,gBACb,WAAW,KAAK,IAAI;AAAA,cACtB,CAAC;AAAA,YACH;AAEA,iBAAK,cAAc,mBAAmB;AACtC,kBAAMA,aAAY,KAAK,KAAK,aAAa,IAAI,oBAAoB,WAAW;AAC5E,gBAAIA,cAAa,aAAa,WAAW,UAAU;AACjD,oBAAM,KAAK;AAAA,gBACTA,WAAU;AAAA,gBACV;AAAA,gBACA;AAAA,gBACA,aAAa,eAAe;AAAA,cAC9B;AAAA,YACF;AACA,iBAAK,eAAe,qBAAqB,cAAc,SAAS;AAChE,iBAAK,eAAe,qBAAqB,eAAe;AACxD,iBAAK,KAAK,UAAU,YAAY,cAAc,KAAK,OAAO,mBAAmB;AAC7E,iBAAK,UAAU,QAAQ;AACvB,iBAAK,cAAc,OAAO,YAAY;AAEtC,mBAAO;AAAA,UACT;AAEA;AAAA,YACE,KAAK;AAAA,YACL;AAAA,YACA,EAAE,cAAc,SAAS,YAAY,GAAG;AAAA,YACxC;AAAA,UACF;AACA,gBAAM,SAAS,UAAU,OAAO,8BAA8B;AAC9D,gBAAM,cAAc,KAAK,KAAK,UAAU,OAAO,YAAY,IAAI;AAAA,YAC7D,QAAQ;AAAA,YACR,aAAa;AAAA,YACb,aAAa,KAAK,IAAI;AAAA,UACxB,CAAC;AACD,gBAAM,oBACJ,KAAK,YAAY,IAAI,YAAY,KAAK,KAAK,kBAAkB,YAAY;AAC3E,gBAAM,YAAY,KAAK,KAAK,aAAa,IAAI,kBAAkB,WAAW;AAC1E,cAAI,kBAAkB,aAAa,UAAU;AAC3C,kBAAM,WAAW,KAAK;AAAA,cACpB,YACI,MAAM,KAAK,kBAAkB,mBAAmB,UAAU,IAAI,IAC9D;AAAA,YACN;AACA,gBAAI,WAAW;AACb,oBAAM,KAAK;AAAA,gBACT,UAAU;AAAA,gBACV;AAAA,gBACA;AAAA,gBACA,YAAY,eAAe;AAAA,cAC7B;AAAA,YACF;AACA,iBAAK,cAAc,QAAQ;AAC3B,iBAAK,eAAe,UAAU,aAAa,SAAS;AAEpD,gBAAI,KAAK,eAAe,IAAI,YAAY,GAAG;AACzC,mBAAK,eAAe,OAAO,YAAY;AACvC,mBAAK,UAAU,QAAQ;AAAA,YACzB;AAEA,kBAAM;AAAA,UACR;AAEA,gBAAM,mBAAmB,KAAK;AAAA,YAC5B,KAAK,KAAK,eAAe,OAAO,cAAc;AAAA,cAC5C,OAAO;AAAA,cACP,YAAY;AAAA,cACZ,aAAa;AAAA,cACb,WAAW,KAAK,IAAI;AAAA,YACtB,CAAC;AAAA,UACH;AAEA,eAAK,cAAc,gBAAgB;AACnC,cAAI,WAAW;AACb,kBAAM,KAAK;AAAA,cACT,UAAU;AAAA,cACV;AAAA,cACA;AAAA,cACA,YAAY,eAAe;AAAA,YAC7B;AAAA,UACF;AACA,eAAK,eAAe,kBAAkB,aAAa,SAAS;AAC5D,eAAK,eAAe,kBAAkB,eAAe;AAErD,cAAI,KAAK,eAAe,IAAI,YAAY,GAAG;AACzC,iBAAK,eAAe,OAAO,YAAY;AACvC,iBAAK,UAAU,gBAAgB;AAAA,UACjC;AAEA,gBAAM;AAAA,QACR,UAAE;AACA,eAAK,wBAAwB,OAAO,YAAY;AAChD,eAAK,cAAc,OAAO,YAAY;AACtC,eAAK,gBAAgB,YAAY;AAAA,QACnC;AAAA,MACF;AAAA,MAEA,MAAc,sBACZ,SACA,QAKC;AACD,cAAM,aAAa,QAAQ;AAE3B,iBAAS,eAAe,KAAK,gBAAgB,GAAG;AAC9C,gBAAM,UAAU,KAAK,KAAK,iBAAiB,OAAO;AAAA,YAChD,IAAI,kBAAkB;AAAA,YACtB,SAAS,QAAQ,MAAM;AAAA,YACvB;AAAA,YACA,QAAQ;AAAA,YACR,WAAW,KAAK,IAAI;AAAA,UACtB,CAAC;AAED,cAAI;AACF,kBAAM,aAAa,MAAM,KAAK,UAAU,SAAS,YAAY,QAAQ,SAAS,EAAE,OAAO,CAAC;AACxF,iBAAK,KAAK,iBAAiB,OAAO,QAAQ,IAAI;AAAA,cAC5C,QAAQ;AAAA,cACR,aAAa,KAAK,IAAI;AAAA,cACtB,eAAe,WAAW,kBAAkB;AAAA,YAC9C,CAAC;AAED,gBAAI,WAAW,WAAW,QAAQ;AAChC,qBAAO;AAAA,gBACL;AAAA,gBACA,UAAU;AAAA,cACZ;AAAA,YACF;AAEA,gBAAI,CAAC,WAAW,UAAU,KAAK,GAAG;AAChC,qBAAO;AAAA,gBACL;AAAA,gBACA,UAAU;AAAA,cACZ;AAAA,YACF;AAEA,gBAAI,QAAQ,WAAW,KAAK,cAAc,IAAI,WAAW,EAAE,GAAG;AAC5D,oBAAM,EAAE,MAAM,2BAA2B,SAAS,+BAA+B;AAAA,YACnF;AAEA,kBAAM,oBACJ,KAAK,YAAY,IAAI,WAAW,EAAE,KAAK,KAAK,kBAAkB,WAAW,EAAE;AAC7E,gBAAI,kBAAkB,aAAa,QAAQ,UAAU;AACnD,qBAAO;AAAA,gBACL;AAAA,gBACA,UAAU;AAAA,cACZ;AAAA,YACF;AAEA,kBAAM,sBAAsB,KAAK;AAAA,cAC/B,KAAK;AAAA,gBACH,KAAK,KAAK,eAAe,OAAO,WAAW,IAAI;AAAA,kBAC7C,OAAO;AAAA,kBACP,WAAW,KAAK,IAAI;AAAA,gBACtB,CAAC;AAAA,cACH;AAAA,YACF;AACA,iBAAK,cAAc,mBAAmB;AACtC,iBAAK,eAAe,qBAAqB,eAAe;AAExD,kBAAM,eAAe,KAAK,KAAK,UAC5B,wBAAwB,WAAW,IAAI,KAAK,OAAO,uBAAuB,CAAC,EAC3E,OAAO,CAAC,UAAU,MAAM,OAAO,QAAQ,MAAM,EAAE;AAElD,kBAAM,YAAY,MAAM,KAAK,SAAS;AAAA,cACpC;AAAA,cACA;AAAA,gBACE,SAAS,WAAW;AAAA,cACtB;AAAA,cACA;AAAA,cACA,EAAE,OAAO;AAAA,YACX;AAEA,mBAAO;AAAA,cACL;AAAA,cACA,UAAU,UAAU;AAAA,cACpB,cAAc,UAAU,WAAW,UAAU,OAAO;AAAA,YACtD;AAAA,UACF,SAAS,OAAO;AACd,gBAAI,wBAAwB,KAAK,GAAG;AAClC,oBAAM,YAAY,KAAK,wBAAwB,WAAW,EAAE;AAC5D,mBAAK,KAAK,iBAAiB,OAAO,QAAQ,IAAI;AAAA,gBAC5C,QAAQ,YAAY,cAAc;AAAA,gBAClC,aAAa,KAAK,IAAI;AAAA,gBACtB,aAAa,YAAY,OAAO,UAAU,OAAO,8BAA8B;AAAA,cACjF,CAAC;AACD,oBAAM;AAAA,YACR;AAEA,kBAAM,SAAS,UAAU,OAAO,8BAA8B;AAC9D,iBAAK,KAAK,iBAAiB,OAAO,QAAQ,IAAI;AAAA,cAC5C,QAAQ;AAAA,cACR,aAAa,KAAK,IAAI;AAAA,cACtB,aAAa;AAAA,YACf,CAAC;AAED,gBAAI,CAAC,KAAK,mBAAmB,OAAO,cAAc,QAAQ,KAAK,GAAG;AAChE,oBAAM;AAAA,YACR;AAEA,kBAAM,KAAK,MAAM,QAAQ,MAAM,cAAc,MAAM;AAEnD,kBAAM,uBAAuB,KAAK;AAAA,cAChC,KAAK;AAAA,gBACH,KAAK,KAAK,eAAe,OAAO,WAAW,IAAI;AAAA,kBAC7C,OAAO;AAAA,kBACP,WAAW,KAAK,IAAI;AAAA,gBACtB,CAAC;AAAA,cACH;AAAA,YACF;AACA,iBAAK,cAAc,oBAAoB;AACvC,iBAAK,eAAe,sBAAsB,eAAe;AAAA,UAC3D;AAAA,QACF;AAAA,MACF;AAAA,MAEA,MAAc,wBACZ,aACA,SACA,QAKA,UAC6D;AAC7D,cAAM,YAAY,KAAK,iBAAiB,QAAQ,WAAW;AAC3D,cAAM,oBACJ,KAAK,YAAY,IAAI,YAAY,YAAY,KAC7C,KAAK,kBAAkB,YAAY,YAAY;AACjD,cAAM,eACJ,aAAa,kBAAkB,YAAY,kBAAkB,sBACzD,kBAAkB,sBAClB,MAAM,KAAK,KAAK,YAAY,iBAAiB,UAAU,MAAM,QAAQ;AAC3E,cAAM,cAA2B,OAAO,WAAW,aAAa;AAChE,cAAM,cACJ,OAAO,WAAW,WAAW,SACzB,OAAO,WAAW,SAClB,OAAO,WACL,OAAO,eACP,OAAO,WAAW,WAChB,sBAAsB,OAAO,WAAW,QAAQ,KAChD;AAEV,cAAM,gBAAgB,KAAK,KAAK,UAAU,OAAO,YAAY,IAAI;AAAA,UAC/D,QAAQ;AAAA,UACR,QAAQ,eAAe;AAAA,UACvB,kBAAkB,OAAO,gBAAgB;AAAA,UACzC,aAAa;AAAA,UACb,aAAa,KAAK,IAAI;AAAA,QACxB,CAAC;AAED,cAAM,mBAAmB,KAAK;AAAA,UAC5B;AAAA,UACA,OAAO;AAAA,UACP,OAAO;AAAA,UACP,cAAc,eAAe,KAAK,IAAI;AAAA,QACxC;AACA,cAAM,KAAK,KAAK,YAAY,iBAAiB,UAAU,MAAM,UAAU,gBAAgB;AAEvF,cAAM,cACJ,OAAO,WAAW,WAAW,SACzB;AAAA,UACE,SAAS,YAAY;AAAA,UACrB;AAAA,UACA,WAAW,YAAY;AAAA,UACvB,aAAa,cAAc,eAAe,KAAK,IAAI;AAAA,UACnD,QAAQ;AAAA,UACR,YAAY,OAAO,WAAW;AAAA,UAC9B,QAAQ,OAAO,WAAW;AAAA,UAC1B,iBAAiB,OAAO,WAAW,mBAAmB,iBAAiB;AAAA,UACvE,cAAc,OAAO,WAAW,gBAAgB,iBAAiB;AAAA,UACjE,aAAa,OAAO,WAAW;AAAA,UAC/B,UAAU;AAAA,UACV,cAAc,KAAK,KAAK,iBAAiB,aAAa,YAAY,EAAE,EAAE;AAAA,QACxE,IACA;AAAA,UACE,SAAS,YAAY;AAAA,UACrB;AAAA,UACA,WAAW,YAAY;AAAA,UACvB,aAAa,cAAc,eAAe,KAAK,IAAI;AAAA,UACnD,QAAQ;AAAA,UACR,QAAQ,OAAO,WAAW;AAAA,UAC1B,UAAU,OAAO,WAAW,OAAO,eAAe,OAAO,WAAW;AAAA,UACpE,iBAAiB,iBAAiB;AAAA,UAClC,cAAc,iBAAiB;AAAA,UAC/B,aAAa,OAAO,WAAW;AAAA,UAC/B,UAAU,OAAO;AAAA,UACjB,cAAc,KAAK,KAAK,iBAAiB,aAAa,YAAY,EAAE,EAAE;AAAA,QACxE;AACN,cAAM,KAAK,KAAK,YAAY,wBAAwB,UAAU,MAAM,UAAU,WAAW;AAEzF,YAAI,OAAO,WAAW,WAAW,QAAQ;AACvC,gBAAM,KAAK,uBAAuB,UAAU,MAAM,UAAU;AAAA,YAC1D,QAAQ,OAAO,WAAW,eAAe,uBAAuB,cAAc;AAAA,YAC9E,aAAa,cAAc,eAAe,KAAK,IAAI;AAAA,UACrD,CAAC;AAAA,QACH;AAEA,YAAI,kBAAkB,aAAa,UAAU;AAC3C,gBAAMG,YAAW,KAAK;AAAA,YACpB,MAAM,KAAK,kBAAkB,mBAAmB,UAAU,IAAI;AAAA,UAChE;AACA,eAAK,cAAcA,SAAQ;AAC3B,eAAK,eAAeA,WAAU,eAAe,SAAS;AACtD,eAAK,KAAK,UAAU,YAAY,YAAY,cAAc,KAAK,OAAO,mBAAmB;AACzF,eAAK,UAAU,QAAQ;AACvB,iBAAO,EAAE,OAAO,eAAe,YAAYA,UAAS;AAAA,QACtD;AAEA,cAAM,qBAAqB,KAAK;AAAA,UAC9B,KAAK;AAAA,YACH,KAAK,KAAK,eAAe,OAAO,YAAY,cAAc;AAAA,cACxD,OAAO,OAAO,WAAW,WAAW,SAAS,YAAY;AAAA,cACzD,4BACG,KAAK,YAAY,IAAI,YAAY,YAAY,GAAG,6BAA6B,KAAK;AAAA,cACrF,YAAY,OAAO,WAAW,WAAW,SAAS,OAAO,WAAW,aAAa;AAAA,cACjF,aAAa,cAAc;AAAA,cAC3B,qBAAqB,QAAQ,cAAc;AAAA,cAC3C,aAAa;AAAA,cACb,WAAW,KAAK,IAAI;AAAA,YACtB,CAAC;AAAA,UACH;AAAA,QACF;AACA,cAAM,WAAW,MAAM,KAAK,kBAAkB,oBAAoB,UAAU,IAAI;AAEhF,aAAK,cAAc,QAAQ;AAC3B,aAAK,eAAe,UAAU,eAAe,SAAS;AACtD,aAAK,eAAe,UAAU,eAAe;AAC7C,aAAK,KAAK,UAAU,YAAY,YAAY,cAAc,KAAK,OAAO,mBAAmB;AACzF,aAAK,UAAU,QAAQ;AAEvB,eAAO,EAAE,OAAO,eAAe,YAAY,SAAS;AAAA,MACtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOQ,oBAAoB,IAAY,OAAsB;AAC5D;AAAA,UACE,KAAK;AAAA,UACL;AAAA,UACA,EAAE,cAAc,GAAG;AAAA,UACnB;AAAA,QACF;AACA,cAAM,SAAS,UAAU,OAAO,8BAA8B;AAC9D,YAAI;AACF,gBAAM,SAAS,KAAK;AAAA,YAClB,KAAK,KAAK,eAAe,OAAO,IAAI;AAAA,cAClC,OAAO;AAAA,cACP,aAAa;AAAA,cACb,WAAW,KAAK,IAAI;AAAA,YACtB,CAAC;AAAA,UACH;AACA,eAAK,cAAc,MAAM;AACzB,eAAK,eAAe,QAAQ,eAAe;AAAA,QAC7C,SAAS,YAAY;AACnB,eAAK,OAAO;AAAA,YACV,EAAE,KAAK,YAAY,cAAc,GAAG;AAAA,YACpC;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MAEQ,uBAAuB,YAAwC;AACrE,cAAM,WAAW,KAAK,KAAK,iBAAiB,KAAK,CAAC,SAAS,KAAK,OAAO,UAAU;AACjF,YAAI,CAAC,UAAU;AACb,gBAAM;AAAA,YACJ,MAAM;AAAA,YACN,SAAS,YAAY,UAAU;AAAA,UACjC;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAAA,MAEQ,mBAAmB,UAAuC;AAChE,eAAO,SAAS,eAAe;AAAA,MACjC;AAAA,MAEQ,iBAAiB,aAAmD;AAC1E,cAAM,YAAY,KAAK,KAAK,aAAa,IAAI,WAAW;AACxD,YAAI,CAAC,WAAW;AACd,gBAAM;AAAA,YACJ,MAAM;AAAA,YACN,SAAS,aAAa,WAAW;AAAA,UACnC;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAAA,MAEA,MAAc,iCACZ,eACA,YACe;AACf,YAAI;AACF,gBAAM,KAAK,KAAK,YAAY,eAAe,eAAe,WAAW,QAAQ;AAAA,QAC/E,SAAS,OAAO;AACd,cACE,CAAC,SACD,OAAO,UAAU,YACjB,EAAE,UAAU,UACX,MAA4B,SAAS,UACtC;AACA,kBAAM;AAAA,UACR;AACA,gBAAM,KAAK,KAAK,YAAY,kBAAkB,eAAe;AAAA,YAC3D,UAAU,WAAW;AAAA,YACrB,WAAW,WAAW;AAAA,YACtB,aAAa,WAAW;AAAA,YACxB,WAAW,WAAW;AAAA,YACtB,WAAW,WAAW;AAAA,UACxB,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MAEA,MAAc,kBACZ,YACA,eACqB;AACrB,cAAM,KAAK,iCAAiC,eAAe,UAAU;AACrE,cAAM,CAAC,qBAAqB,kBAAkB,IAAI,MAAM,QAAQ,IAAI;AAAA,UAClE,KAAK,KAAK,YAAY,iBAAiB,eAAe,WAAW,QAAQ;AAAA,UACzE,KAAK,KAAK,YAAY,uBAAuB,eAAe,WAAW,UAAU,EAAE;AAAA,QACrF,CAAC;AAED,eAAO;AAAA,UACL,GAAG;AAAA,UACH;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MAEA,MAAc,mBAAmB,YAA6C;AAC5E,cAAM,YAAY,KAAK,KAAK,aAAa,IAAI,WAAW,WAAW;AACnE,YAAI,CAAC,WAAW;AACd,iBAAO;AAAA,QACT;AACA,eAAO,MAAM,KAAK,kBAAkB,YAAY,UAAU,IAAI;AAAA,MAChE;AAAA,MAEA,MAAc,2BACZ,cACA,eAC4B;AAC5B,cAAM,YAAY,KAAK,KAAK,eAAe,SAAS,YAAY;AAChE,YAAI,CAAC,WAAW;AACd,iBAAO;AAAA,QACT;AAEA,cAAM,WAAW,MAAM,KAAK,kBAAkB,KAAK,aAAa,SAAS,GAAG,aAAa;AACzF,cAAM,SAAS,KAAK,KAAK,eAAe,SAAS,YAAY;AAC7D,YAAI,CAAC,QAAQ;AACX,iBAAO;AAAA,QACT;AAEA,YAAI,OAAO,aAAa,SAAS,UAAU;AACzC,iBAAO,MAAM,KAAK,kBAAkB,KAAK,aAAa,MAAM,GAAG,aAAa;AAAA,QAC9E;AAEA,eAAO;AAAA,UACL,GAAG,KAAK,aAAa,MAAM;AAAA,UAC3B,qBAAqB,SAAS;AAAA,UAC9B,oBAAoB,SAAS;AAAA,QAC/B;AAAA,MACF;AAAA,MAEQ,uBAAuB,YAAoC;AACjE,cAAM,UAAU,KAAK,YAAY,IAAI,WAAW,EAAE;AAClD,YAAI,CAAC,WAAW,QAAQ,aAAa,WAAW,UAAU;AACxD,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,UACL,GAAG;AAAA,UACH,qBAAqB,QAAQ;AAAA,UAC7B,oBAAoB,QAAQ;AAAA,QAC9B;AAAA,MACF;AAAA,MAEQ,wBAAwB,cAA+B;AAC7D,eAAO,KAAK,cAAc,IAAI,YAAY,KAAK,KAAK,wBAAwB,IAAI,YAAY;AAAA,MAC9F;AAAA,MAEQ,wBACN,YACA,WACyC;AACzC,eAAO;AAAA,UACL,OAAO,WAAW;AAAA,UAClB,WAAW,WAAW;AAAA,UACtB,qBAAqB,WAAW;AAAA,UAChC,gBAAgB,WAAW,kBAAkB;AAAA,UAC7C,qBAAqB,WAAW;AAAA,UAChC,2BAA2B,WAAW;AAAA,UACtC,aAAa,WAAW,eAAe;AAAA,UACvC,YAAY,WAAW,cAAc;AAAA,UACrC,aAAa,WAAW,eAAe;AAAA,UACvC,qBAAqB,WAAW,uBAAuB;AAAA,UACvD,aAAa,WAAW,eAAe;AAAA,UACvC;AAAA,QACF;AAAA,MACF;AAAA,MAEQ,8BACN,QACA,YACA,cACA,WACwB;AACxB,YAAI,OAAO,OAAO;AAClB,YAAI,WAAW,QAAQ,WAAW,KAAK,SAAS,GAAG;AACjD,iBAAO,WAAW;AAAA,QACpB,WAAW,WAAW,aAAa,QAAQ;AACzC,gBAAM,UAAU,IAAI,IAAI,WAAW,YAAY,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,KAAK,MAAM,CAAC,CAAC;AACpF,iBAAO,OAAO,KAAK;AAAA,YAAI,CAAC,SACtB,QAAQ,IAAI,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,QAAQ,QAAQ,IAAI,KAAK,EAAE,EAAG,IAAI;AAAA,UACtE;AAAA,QACF;AAEA,cAAM,kBAAkB,WAAW,mBAAmB,OAAO;AAC7D,cAAM,eACJ,WAAW,WAAW,aACjB,gBAAgB,WAAW,YAAY,OAAO,eAC/C,OAAO;AACb,cAAM,eACJ,WAAW,WAAW,cACtB,CAAC,WAAW,mBACZ,CAAC,WAAW,aAAa,SACrB,OAAO,eAAe,IACtB;AAEN,eAAO;AAAA,UACL,GAAG;AAAA,UACH,eAAe,OAAO,iBAAiB,QAAQ,WAAW,MAAM,MAAM;AAAA,UACtE;AAAA,UACA,cAAc,WAAW,gBAAgB,OAAO;AAAA,UAChD;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MAEA,MAAc,uBACZ,eACA,UACA,OACe;AACf,cAAM,UAAU,MAAM,KAAK,KAAK,YAAY,eAAe,eAAe,QAAQ;AAClF,cAAM,YACJ,QAAQ,WAAW,gBAAgB,MAAM,UAAU,MAAM,WAAW,eAChE;AAAA,UACE,GAAG;AAAA,UACH,QAAQ,QAAQ;AAAA,UAChB,cAAc,QAAQ;AAAA,QACxB,IACA;AACN,cAAM,KAAK,KAAK,YAAY,eAAe,eAAe,UAAU;AAAA,UAClE,GAAG;AAAA,UACH,GAAG;AAAA,UACH,WAAW,KAAK,IAAI;AAAA,QACtB,CAAC;AAAA,MACH;AAAA,MAEA,MAAc,4BACZ,eACA,UACA,OACA,aACe;AACf,cAAM,KAAK,KAAK,YAAY,wBAAwB,eAAe,UAAU;AAAA,UAC3E,SAAS,MAAM;AAAA,UACf;AAAA,UACA,WAAW,MAAM;AAAA,UACjB,aAAa,KAAK,IAAI;AAAA,UACtB,QAAQ;AAAA,UACR;AAAA,UACA,cAAc,KAAK,KAAK,iBAAiB,aAAa,MAAM,EAAE,EAAE;AAAA,QAClE,CAAC;AAAA,MACH;AAAA,MAEA,MAAc,4BACZ,eACA,YACe;AACf,cAAM,OAAO,MAAM,KAAK,KAAK,YAC1B,eAAe,eAAe,WAAW,QAAQ,EACjD,MAAM,MAAM,IAAI;AACnB,YAAI,CAAC,QAAQ,KAAK,WAAW,eAAe,KAAK,WAAW,cAAc;AACxE;AAAA,QACF;AACA,cAAM,KAAK,uBAAuB,eAAe,WAAW,UAAU;AAAA,UACpE,QAAQ;AAAA,UACR,aAAa,KAAK,eAAe,KAAK,IAAI;AAAA,QAC5C,CAAC;AAAA,MACH;AAAA,MAEQ,wBAAwB,YAA0B;AACxD,cAAM,WAAW,KAAK,KAAK,iBAAiB,KAAK,CAAC,SAAS,KAAK,OAAO,UAAU;AACjF,YAAI,CAAC,UAAU,4BAA4B;AACzC,gBAAM;AAAA,YACJ,MAAM;AAAA,YACN,SAAS,YAAY,UAAU;AAAA,UACjC;AAAA,QACF;AACA,cAAM,YAAY,KAAK,KAAK,mBAAmB,IAAI,UAAU,KAAK,SAAS;AAC3E,YAAI,CAAC,WAAW;AACd,gBAAM;AAAA,YACJ,MAAM;AAAA,YACN,SAAS,yCAAyC,UAAU;AAAA,UAC9D;AAAA,QACF;AAAA,MACF;AAAA,MAEQ,aAAa,YAAoC;AACvD,eAAO;AAAA,UACL,GAAG;AAAA,UACH,QAAQ,KAAK,KAAK,UAAU,wBAAwB,WAAW,IAAI,EAAE;AAAA,QACvE;AAAA,MACF;AAAA,MAEQ,2BAAiF;AACvF,eAAO,MAAM,KAAK,KAAK,YAAY,OAAO,CAAC,EACxC;AAAA,UACC,CAAC,eACC,WAAW,UAAU,UACrB,OAAO,WAAW,gBAAgB,YAClC,OAAO,SAAS,WAAW,WAAW;AAAA,QAC1C,EACC,IAAI,CAAC,gBAAgB;AAAA,UACpB,cAAc,WAAW;AAAA,UACzB,aAAa,WAAW;AAAA,QAC1B,EAAE;AAAA,MACN;AAAA,MAEQ,cAAc,YAA8B;AAClD,aAAK,YAAY,IAAI,WAAW,IAAI,UAAU;AAC9C,aAAK,qBAAqB,IAAI,WAAW,WAAW,WAAW,EAAE;AAAA,MACnE;AAAA,MAEQ,UAAU,YAA8B;AAC9C,cAAM,YAAY,KAAK,KAAK,aAAa,IAAI,WAAW,WAAW;AACnE,YAAI,WAAW;AACb,eAAK,KAAK,4BAA4B,UAAU,MAAM,UAAU,EAAE,MAAM,CAAC,UAAU;AACjF,iBAAK,OAAO;AAAA,cACV,EAAE,KAAK,OAAO,cAAc,WAAW,IAAI,UAAU,WAAW,SAAS;AAAA,cACzE;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AACA,aAAK,KAAK,eAAe,OAAO,WAAW,EAAE;AAC7C,aAAK,YAAY,OAAO,WAAW,EAAE;AACrC,aAAK,qBAAqB,OAAO,WAAW,SAAS;AACrD,aAAK,eAAe,OAAO,WAAW,EAAE;AACxC,aAAK,cAAc,OAAO,WAAW,EAAE;AACvC,aAAK,wBAAwB,OAAO,WAAW,EAAE;AACjD,aAAK,gBAAgB,WAAW,EAAE;AAClC,aAAK,UAAU,QAAQ;AAEvB,aAAK,KAAK,YAAY;AAAA,UACpB,OAAO,gBAAgB,WAAW,aAAa,WAAW,SAAS;AAAA,UACnE,EAAE,cAAc,WAAW,IAAI,OAAO,UAAU;AAAA,QAClD;AAAA,MACF;AAAA,MAEQ,gBAAgB,cAA4B;AAClD,aAAK,SAAS,OAAO,YAAY;AACjC,aAAK,2BAA2B,OAAO,YAAY;AACnD,aAAK,oBAAoB,IAAI,YAAY,GAAG,QAAQ;AACpD,aAAK,oBAAoB,OAAO,YAAY;AAAA,MAC9C;AAAA,MAEQ,wBAAwB,IAA+D;AAC7F,eAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS,cAAc,EAAE;AAAA,QAC3B;AAAA,MACF;AAAA,MAEQ,kBAAkB,IAAwB;AAChD,cAAM,aAAa,KAAK,YAAY,IAAI,EAAE;AAC1C,YAAI,CAAC,YAAY;AACf,gBAAM,KAAK,wBAAwB,EAAE;AAAA,QACvC;AACA,eAAO;AAAA,MACT;AAAA,MAEQ,eACN,YACA,OACM;AACN,aAAK,KAAK,YAAY;AAAA,UACpB,OAAO,gBAAgB,WAAW,aAAa,WAAW,SAAS;AAAA,UACnE,EAAE,YAAY,MAAM;AAAA,QACtB;AAAA,MACF;AAAA,MAEQ,eACN,YACA,OACA,OACM;AACN,aAAK,KAAK,YAAY;AAAA,UACpB,OAAO,gBAAgB,WAAW,aAAa,WAAW,SAAS;AAAA,UACnE,EAAE,OAAO,MAAM;AAAA,QACjB;AAAA,MACF;AAAA,MAEQ,mBACN,OACA,cACA,OACS;AACT,YAAI,CAAC,MAAM,cAAc;AACvB,iBAAO;AAAA,QACT;AACA,YAAI,gBAAgB,MAAM,eAAe;AACvC,iBAAO;AAAA,QACT;AAEA,cAAM,OACJ,SAAS,OAAO,UAAU,YAAY,UAAU,QAC3C,MAA6B,OAC9B;AAEN,YAAI,SAAS,2BAA2B;AACtC,iBAAO,MAAM;AAAA,QACf;AAEA,YAAI,SAAS,0BAA0B;AACrC,iBAAO,MAAM;AAAA,QACf;AAEA,eAAO;AAAA,MACT;AAAA,MAEA,MAAc,MAAM,SAAiB,QAAqC;AACxE,YAAI,WAAW,GAAG;AAChB;AAAA,QACF;AAEA,YAAI,QAAQ,SAAS;AACnB,gBAAM,EAAE,MAAM,2BAA2B,SAAS,+BAA+B;AAAA,QACnF;AAEA,cAAM,IAAI,QAAc,CAACR,UAAS,WAAW;AAC3C,gBAAM,QAAQ,WAAW,MAAM;AAC7B,oBAAQ,oBAAoB,SAAS,OAAO;AAC5C,YAAAA,SAAQ;AAAA,UACV,GAAG,OAAO;AACV,gBAAM,QAAQ;AAEd,gBAAM,UAAU,MAAM;AACpB,yBAAa,KAAK;AAClB,oBAAQ,oBAAoB,SAAS,OAAO;AAC5C,mBAAO,EAAE,MAAM,2BAA2B,SAAS,+BAA+B,CAAC;AAAA,UACrF;AAEA,kBAAQ,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAAA,QAC3D,CAAC;AAAA,MACH;AAAA,IACF;AAAA;AAAA;;;AC9mDA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAS,SAAAS,QAAO,SAAS,YAAAC,WAAU,QAAQ,MAAAC,KAAI,aAAAC,kBAAiB;AAChE,SAAS,WAAAC,UAAS,QAAAC,aAAY;AAe9B,SAAS,UAAU,eAAuB,UAA0B;AAClE,SAAOA,MAAK,eAAe,iBAAiB,cAAc,WAAW,QAAQ;AAC/E;AAEA,SAAS,SAAS,eAAuB,UAA0B;AACjE,SAAOA,MAAK,UAAU,eAAe,QAAQ,GAAG,WAAW;AAC7D;AAEA,SAAS,WAAW,eAAuB,UAA0B;AACnE,SAAOA,MAAK,UAAU,eAAe,QAAQ,GAAG,aAAa;AAC/D;AAEA,SAAS,WAAW,eAAuB,UAA0B;AACnE,SAAOA,MAAK,UAAU,eAAe,QAAQ,GAAG,cAAc;AAChE;AAEA,SAAS,aAAa,SAAyB;AAC7C,SAAOA,MAAK,SAAS,WAAW;AAClC;AAEA,SAAS,eAAe,SAAyB;AAC/C,SAAOA,MAAK,SAAS,aAAa;AACpC;AAEA,SAAS,eAAe,SAAyB;AAC/C,SAAOA,MAAK,SAAS,cAAc;AACrC;AAEA,SAAS,QAAQ,OAAgB,MAAuB;AACtD,SAAO;AAAA,IACL,SACE,OAAO,UAAU,YACjB,UAAU,SACT,MAA6B,SAAS;AAAA,EAC3C;AACF;AAEA,SAAS,aAAa,OAAgB,UAA0B;AAC9D,MAAI,iBAAiB,OAAO;AAC1B,WAAO,MAAM;AAAA,EACf;AACA,MAAI,SAAS,OAAO,UAAU,YAAY,aAAa,OAAO;AAC5D,UAAM,QAAS,MAAgC;AAC/C,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,mBAAmBC,QAAc,OAA+B;AAC7E,MAAI;AACF,UAAMH,WAAUG,QAAM,KAAK,UAAU,OAAO,MAAM,CAAC,IAAI,MAAM;AAAA,MAC3D,UAAU;AAAA,MACV,MAAM;AAAA,IACR,CAAC;AAAA,EACH,SAAS,OAAO;AACd,QAAI,CAAC,QAAQ,OAAO,QAAQ,GAAG;AAC7B,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,gBAAgBC,QAMA;AACvB,SAAO;AAAA,IACL,UAAUA,OAAM;AAAA,IAChB,WAAWA,OAAM;AAAA,IACjB,aAAaA,OAAM;AAAA,IACnB,WAAWA,OAAM;AAAA,IACjB,QAAQ;AAAA,IACR,WAAWA,OAAM;AAAA,IACjB,WAAWA,OAAM;AAAA,IACjB,cAAc;AAAA,IACd,aAAa;AAAA,EACf;AACF;AAEA,SAAS,kBAAkB,UAAkB,WAA2C;AACtF,SAAO;AAAA,IACL;AAAA,IACA,eAAe;AAAA,IACf,MAAM,CAAC;AAAA,IACP,cAAc;AAAA,IACd,WAAW;AAAA,EACb;AACF;AAEA,eAAe,sBACb,SACAA,QAOe;AACf,QAAMP,OAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AACxC,QAAMG;AAAA,IACJ,aAAa,OAAO;AAAA,IACpB,KAAK,UAAU,gBAAgBI,MAAK,GAAG,MAAM,CAAC,IAAI;AAAA,IAClD;AAAA,EACF;AACA,QAAMJ;AAAA,IACJ,eAAe,OAAO;AAAA,IACtB,KAAK,UAAU,kBAAkBI,OAAM,UAAUA,OAAM,SAAS,GAAG,MAAM,CAAC,IAAI;AAAA,IAC9E;AAAA,EACF;AACA,QAAMJ,WAAU,eAAe,OAAO,GAAG,IAAI,OAAO;AACtD;AAEA,eAAsB,kBACpB,eACAI,QAOe;AACf,QAAM,MAAM,UAAU,eAAeA,OAAM,QAAQ;AACnD,QAAMP,OAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AACpC,QAAM,mBAAmB,SAAS,eAAeO,OAAM,QAAQ,GAAG,gBAAgBA,MAAK,CAAC;AACxF,QAAM;AAAA,IACJ,WAAW,eAAeA,OAAM,QAAQ;AAAA,IACxC,kBAAkBA,OAAM,UAAUA,OAAM,SAAS;AAAA,EACnD;AACF;AAEA,eAAsB,iBACpB,eACAA,QAOe;AACf,QAAM,MAAM,UAAU,eAAeA,OAAM,QAAQ;AACnD,QAAM,YAAYH,SAAQ,GAAG;AAC7B,QAAM,YAAY,GAAG,GAAG,WAAW,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAEvF,QAAMJ,OAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAC1C,QAAM,aAAa,MAAM,QAAQK,MAAK,WAAW,GAAGE,OAAM,QAAQ,SAAS,CAAC;AAE5E,MAAI,gBAAgB;AACpB,MAAI,WAAW;AACf,MAAI,WAAW;AAEf,MAAI;AACF,UAAM,sBAAsB,YAAYA,MAAK;AAE7C,QAAI;AACF,YAAM,OAAO,KAAK,SAAS;AAC3B,sBAAgB;AAAA,IAClB,SAAS,OAAO;AACd,UAAI,CAAC,QAAQ,OAAO,QAAQ,GAAG;AAC7B,cAAM;AAAA,MACR;AAAA,IACF;AAEA,QAAI;AACF,YAAM,OAAO,YAAY,GAAG;AAC5B,iBAAW;AAAA,IACb,SAAS,cAAc;AACrB,UAAI,eAAe;AACjB,YAAI;AACF,gBAAM,OAAO,WAAW,GAAG;AAC3B,0BAAgB;AAChB,qBAAW;AAAA,QACb,SAAS,cAAc;AACrB,gBAAM,IAAI;AAAA,YACR,mCAAmC;AAAA,cACjC;AAAA,cACA;AAAA,YACF,CAAC,2BAA2B,aAAa,cAAc,uBAAuB,CAAC;AAAA,UACjF;AAAA,QACF;AAAA,MACF;AACA,YAAM;AAAA,IACR;AAAA,EACF,SAAS,OAAO;AACd,QAAI,YAAY,CAAC,eAAe;AAC9B,YAAML,IAAG,YAAY,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IACvE;AACA,UAAM;AAAA,EACR;AAEA,MAAI,eAAe;AACjB,UAAMA,IAAG,WAAW,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACtE;AACA,MAAI,CAAC,UAAU;AACb,UAAMA,IAAG,YAAY,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACvE;AACF;AAEA,eAAsB,eACpB,eACA,UAC+B;AAC/B,SAAO,KAAK;AAAA,IACV,MAAMD,UAAS,SAAS,eAAe,QAAQ,GAAG,OAAO;AAAA,EAC3D;AACF;AAEA,eAAsB,iBACpB,eACA,UACiC;AACjC,SAAO,KAAK;AAAA,IACV,MAAMA,UAAS,WAAW,eAAe,QAAQ,GAAG,OAAO;AAAA,EAC7D;AACF;AAEA,eAAsB,iBACpB,eACA,UACA,QACe;AACf,QAAMD,OAAMI,SAAQ,WAAW,eAAe,QAAQ,CAAC,GAAG,EAAE,WAAW,KAAK,CAAC;AAC7E,QAAMD;AAAA,IACJ,WAAW,eAAe,QAAQ;AAAA,IAClC,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI;AAAA,IAClC;AAAA,EACF;AACF;AAEA,eAAsB,wBACpB,eACA,UACA,QACe;AACf,QAAMH,OAAMI,SAAQ,WAAW,eAAe,QAAQ,CAAC,GAAG,EAAE,WAAW,KAAK,CAAC;AAC7E,QAAMD,WAAU,WAAW,eAAe,QAAQ,GAAG,KAAK,UAAU,MAAM,IAAI,MAAM;AAAA,IAClF,UAAU;AAAA,IACV,MAAM;AAAA,EACR,CAAC;AACH;AAEA,eAAsB,eACpB,eACA,UACA,MACe;AACf,QAAMH,OAAMI,SAAQ,SAAS,eAAe,QAAQ,CAAC,GAAG,EAAE,WAAW,KAAK,CAAC;AAC3E,QAAMD,WAAU,SAAS,eAAe,QAAQ,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI,MAAM,OAAO;AAClG;AAEA,eAAsB,uBACpB,eACA,UACA,QAAQ,IACgC;AACxC,QAAM,UAAU,MAAMF,UAAS,WAAW,eAAe,QAAQ,GAAG,OAAO,EAAE,MAAM,MAAM,EAAE;AAC3F,SAAO,QACJ,MAAM,IAAI,EACV,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO,EACd,IAAI,CAAC,SAAS,KAAK,MAAM,IAAI,CAAgC,EAC7D,MAAM,CAAC,KAAK,EACZ,QAAQ;AACb;AAEA,eAAsB,qBACpB,eACA,UACA,cACA,WACe;AACf,QAAM,OAAO,MAAM,eAAe,eAAe,QAAQ;AACzD,QAAM,eAAe,eAAe,UAAU;AAAA,IAC5C,GAAG;AAAA,IACH,QAAQ;AAAA,IACR,cAAc;AAAA,IACd;AAAA,EACF,CAAC;AACH;AA5SA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAUa;AAVb;AAAA;AAAA;AAUO,IAAM,iBAAN,MAAqB;AAAA,MAa1B,YACkB,IACA,MACA,KACA,YACA,gBACA,YAAoB,KAAK,IAAI,GAC7C;AANgB;AACA;AACA;AACA;AACA;AACA;AAEhB,aAAK,cAAc,KAAK,QAAQ;AAChC,aAAK,cAAc,KAAK,QAAQ;AAAA,MAClC;AAAA,MATkB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MAlBX,QAAQ;AAAA,MACR;AAAA,MACA,eAAsC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOtC;AAAA,MACA;AAAA;AAAA;AAAA;AAAA,MAiBP,QAAkB;AAChB,eAAO;AAAA,UACL,IAAI,KAAK;AAAA,UACT,aAAa,KAAK,KAAK;AAAA,UACvB,MAAM,KAAK,KAAK;AAAA,UAChB,OAAO,KAAK,KAAK,SAAS,KAAK,KAAK,KAAK,KAAK,GAAG;AAAA,UACjD,KAAK,KAAK,KAAK;AAAA,UACf,MAAM,KAAK,KAAK;AAAA,UAChB,MAAM,KAAK,KAAK,QAAQ;AAAA,UACxB,MAAM,KAAK,KAAK,QAAQ;AAAA,UACxB,OAAO,KAAK;AAAA,UACZ,WAAW,KAAK;AAAA,UAChB,SAAS,KAAK,QAAQ,SAAY,KAAK,IAAI;AAAA,UAC3C,UAAU,KAAK;AAAA,QACjB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,QAAkB;AAChB,eAAO,KAAK,MAAM;AAAA,MACpB;AAAA,IACF;AAAA;AAAA;;;AC7DA,IAAa,kBACA;AADb,IAAAO,kBAAA;AAAA;AAAA;AAAO,IAAM,mBAAmB,KAAK,OAAO;AACrC,IAAM,+BAA+B;AAAA;AAAA;;;ACD5C,IAMa;AANb;AAAA;AAAA;AAMO,IAAM,aAAN,MAAiB;AAAA,MAKtB,YAA6B,MAAc;AAAd;AAC3B,aAAK,SAAS,OAAO,MAAM,IAAI;AAAA,MACjC;AAAA,MAF6B;AAAA,MAJrB;AAAA,MACA,WAAW;AAAA,MACX,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,MAUrB,OAAO,OAAgC;AACrC,YAAI,MAAM,WAAW,GAAG;AACtB,iBAAO,EAAE,KAAK,KAAK,WAAW;AAAA,QAChC;AAGA,YAAI,YAAY,MAAM;AACtB,YAAI,SAAS;AAEb,eAAO,YAAY,GAAG;AACpB,gBAAM,iBAAiB,KAAK,OAAO,KAAK;AACxC,gBAAM,cAAc,KAAK,IAAI,WAAW,cAAc;AAEtD,gBAAM,KAAK,KAAK,QAAQ,KAAK,UAAU,QAAQ,SAAS,WAAW;AAEnE,eAAK,YAAY,KAAK,WAAW,eAAe,KAAK;AACrD,oBAAU;AACV,uBAAa;AAAA,QACf;AAEA,aAAK,cAAc,MAAM;AAEzB,eAAO,EAAE,KAAK,KAAK,WAAW;AAAA,MAChC;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,WAAW,SAAsF;AAC/F,YAAI,WAAW,KAAK,YAAY;AAE9B,iBAAO,EAAE,QAAQ,MAAM,MAAM,OAAO,MAAM,CAAC,GAAG,KAAK,KAAK,WAAW;AAAA,QACrE;AAEA,cAAM,cAAc,KAAK,aAAa;AAGtC,YAAI,cAAc,KAAK,MAAM;AAC3B,iBAAO,EAAE,QAAQ,UAAU;AAAA,QAC7B;AAGA,cAAM,OAAO,OAAO,MAAM,WAAW;AACrC,YAAI,UAAU,KAAK,WAAW;AAC9B,YAAI,UAAU,GAAG;AACf,qBAAW,KAAK;AAAA,QAClB;AAEA,YAAI,YAAY;AAChB,YAAI,SAAS;AAEb,eAAO,YAAY,GAAG;AACpB,gBAAM,iBAAiB,KAAK,OAAO;AACnC,gBAAM,aAAa,KAAK,IAAI,WAAW,cAAc;AAErD,eAAK,OAAO,KAAK,MAAM,QAAQ,SAAS,UAAU,UAAU;AAE5D,qBAAW,UAAU,cAAc,KAAK;AACxC,oBAAU;AACV,uBAAa;AAAA,QACf;AAEA,eAAO,EAAE,QAAQ,MAAM,MAAM,KAAK,KAAK,WAAW;AAAA,MACpD;AAAA;AAAA;AAAA;AAAA,MAKA,WAAmB;AACjB,cAAM,aAAa,KAAK,IAAI,KAAK,YAAY,KAAK,IAAI;AACtD,cAAM,WAAW,KAAK,aAAa,KAAK,OAAO,KAAK,WAAW;AAE/D,cAAM,WAAW,OAAO,MAAM,UAAU;AACxC,YAAI,UAAU;AACd,YAAI,YAAY;AAChB,YAAI,SAAS;AAEb,eAAO,YAAY,GAAG;AACpB,gBAAM,iBAAiB,KAAK,OAAO;AACnC,gBAAM,aAAa,KAAK,IAAI,WAAW,cAAc;AAErD,eAAK,OAAO,KAAK,UAAU,QAAQ,SAAS,UAAU,UAAU;AAEhE,qBAAW,UAAU,cAAc,KAAK;AACxC,oBAAU;AACV,uBAAa;AAAA,QACf;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,KAAK,OAAuB;AAC1B,YAAI,SAAS,GAAG;AACd,iBAAO,OAAO,MAAM,CAAC;AAAA,QACvB;AAEA,cAAM,aAAa,KAAK,IAAI,KAAK,YAAY,KAAK,IAAI;AACtD,cAAM,cAAc,KAAK,IAAI,OAAO,UAAU;AAE9C,YAAI,gBAAgB,GAAG;AACrB,iBAAO,OAAO,MAAM,CAAC;AAAA,QACvB;AAEA,YAAI,UAAU,KAAK,WAAW;AAC9B,YAAI,UAAU,GAAG;AACf,qBAAW,KAAK;AAAA,QAClB;AAEA,cAAM,SAAS,OAAO,YAAY,WAAW;AAC7C,YAAI,YAAY;AAChB,YAAI,SAAS;AAEb,eAAO,YAAY,GAAG;AACpB,gBAAM,iBAAiB,KAAK,OAAO;AACnC,gBAAM,aAAa,KAAK,IAAI,WAAW,cAAc;AAErD,eAAK,OAAO,KAAK,QAAQ,QAAQ,SAAS,UAAU,UAAU;AAE9D,qBAAW,UAAU,cAAc,KAAK;AACxC,oBAAU;AACV,uBAAa;AAAA,QACf;AAEA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,SAAiB;AACf,eAAO,KAAK;AAAA,MACd;AAAA,IACF;AAAA;AAAA;;;AC5JA,SAAS,sBAAsB;AAE/B,OAAO,mBAAmB;AAF1B,IAKQ,UASK,0BAOA;AArBb;AAAA;AAAA;AAGA,IAAAC;AAEA,KAAM,EAAE,aAAa;AASd,IAAM,2BAAN,cAAuC,MAAM;AAAA,MAClD,YAAY,UAAU,2CAA2C;AAC/D,cAAM,OAAO;AACb,aAAK,OAAO;AAAA,MACd;AAAA,IACF;AAEO,IAAM,yBAAN,MAA6B;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MACd,gBAAgB;AAAA,MAChB,WAAW;AAAA,MACX,oBAAoB;AAAA,MACpB,iBAAoC,CAAC;AAAA,MAE7C,YAAY,SAA8D;AACxE,aAAK,OAAO,QAAQ;AACpB,aAAK,OAAO,QAAQ;AACpB,aAAK,OAAO,IAAI,SAAS;AAAA,UACvB,MAAM,QAAQ;AAAA,UACd,MAAM,QAAQ;AAAA,UACd,YAAY,QAAQ,cAAc;AAAA,UAClC,kBAAkB;AAAA,QACpB,CAAC;AACD,aAAK,QAAQ,IAAI,eAAe;AAChC,aAAK,KAAK,UAAU,KAAK,KAAK;AAAA,MAChC;AAAA,MAEA,IAAI,WAAoB;AACtB,eAAO,KAAK;AAAA,MACd;AAAA,MAEA,MAAM,OAAe,KAAmB;AACtC,cAAM,OAAO,KAAK,gBAAgB;AAElC,aAAK,qBAAqB;AAC1B,YAAI;AACF,eAAK,MAAM,OAAO,MAAM;AACtB,iBAAK,cAAc;AACnB,iBAAK,oBAAoB,KAAK,IAAI,GAAG,KAAK,oBAAoB,CAAC;AAC/D,iBAAK,mBAAmB;AAAA,UAC1B,CAAC;AAAA,QACH,SAAS,OAAO;AACd,eAAK,oBAAoB,KAAK,IAAI,GAAG,KAAK,oBAAoB,CAAC;AAC/D,eAAK,QAAQ;AACb,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,MAEA,OAAO,MAAc,MAAoB;AACvC,cAAM,OAAO,KAAK,gBAAgB;AAElC,YAAI;AACF,eAAK,OAAO,MAAM,IAAI;AACtB,eAAK,OAAO;AACZ,eAAK,OAAO;AAAA,QACd,SAAS,OAAO;AACd,eAAK,QAAQ;AACb,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,MAEA,MAAM,WAA4C;AAChD,aAAK,gBAAgB;AACrB,cAAM,QAAQ,KAAK,aAAa;AAEhC,cAAM,KAAK,qBAAqB;AAEhC,YAAI;AACF,gBAAM,aAAa,MAAM,UAAU;AACnC,iBAAO;AAAA,YACL,MAAM,OAAO,KAAK,YAAY,MAAM;AAAA,YACpC,KAAK,KAAK;AAAA,YACV,MAAM,KAAK;AAAA,YACX,MAAM,KAAK;AAAA,UACb;AAAA,QACF,SAAS,OAAO;AACd,eAAK,QAAQ;AACb,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,MAEA,UAAgB;AACd,YAAI,KAAK,UAAU;AACjB;AAAA,QACF;AAEA,aAAK,WAAW;AAChB,aAAK,MAAM,QAAQ;AACnB,aAAK,OAAO,QAAQ;AACpB,aAAK,OAAO;AACZ,aAAK,QAAQ;AACb,aAAK,gBAAgB;AACrB,aAAK,oBAAoB;AACzB,aAAK,mBAAmB;AAAA,MAC1B;AAAA,MAEQ,uBAAsC;AAC5C,YAAI,KAAK,sBAAsB,GAAG;AAChC,iBAAO,QAAQ,QAAQ;AAAA,QACzB;AAEA,eAAO,IAAI,QAAQ,CAACC,aAAY;AAC9B,eAAK,eAAe,KAAKA,QAAO;AAAA,QAClC,CAAC;AAAA,MACH;AAAA,MAEQ,qBAA2B;AACjC,YAAI,KAAK,sBAAsB,GAAG;AAChC;AAAA,QACF;AAEA,cAAM,YAAY,KAAK;AACvB,aAAK,iBAAiB,CAAC;AACvB,mBAAWA,YAAW,WAAW;AAC/B,UAAAA,SAAQ;AAAA,QACV;AAAA,MACF;AAAA,MAEQ,kBAAoC;AAC1C,YAAI,KAAK,YAAY,KAAK,iBAAiB,CAAC,KAAK,MAAM;AACrD,gBAAM,IAAI,yBAAyB;AAAA,QACrC;AAEA,eAAO,KAAK;AAAA,MACd;AAAA,MAEQ,eAA+B;AACrC,YAAI,KAAK,YAAY,KAAK,iBAAiB,CAAC,KAAK,OAAO;AACtD,gBAAM,IAAI,yBAAyB;AAAA,QACrC;AAEA,eAAO,KAAK;AAAA,MACd;AAAA,MAEQ,UAAgB;AACtB,aAAK,gBAAgB;AACrB,aAAK,mBAAmB;AAAA,MAC1B;AAAA,IACF;AAAA;AAAA;;;AC5JA,IAuCa,uBAUA;AAjDb,IAAAC,cAAA;AAAA;AAAA;AAuCO,IAAM,wBAAN,cAAoC,MAAM;AAAA,MAC/C,YAAY,UAAU,yBAAyB;AAC7C,cAAM,OAAO;AACb,aAAK,OAAO;AAAA,MACd;AAAA,IACF;AAKO,IAAM,qBAAN,cAAiC,MAAM;AAAA,MAG5C,YACkB,MACA,OACA,SAKhB;AACA,cAAM,0BAA0B,MAAM,OAAO,EAAE;AAR/B;AACA;AACA;AAOhB,aAAK,OAAO;AAAA,MACd;AAAA,MAVkB;AAAA,MACA;AAAA,MACA;AAAA,MALT,OAAO;AAAA,IAclB;AAAA;AAAA;;;AC7CA,SAAS,yBAAkC;AACzC,SAAO,QAAQ,IAAI,gCAAgC;AACrD;AAEA,SAAS,iBAAiB,MAAc,QAAwB;AAC9D,SAAO,KAAK,MAAM,MAAM,EAAE,SAAS;AACrC;AAEA,SAAS,sBAAsB,MAAuB;AACpD,QAAM,OAAO,OAAO,SAAS,WAAW,OAAO,KAAK,SAAS,MAAM;AACnE,SAAO;AAAA,IACL,QAAQ,OAAO,SAAS,WAAW,OAAO,WAAW,MAAM,MAAM,IAAI,KAAK;AAAA,IAC1E,WAAW,iBAAiB,MAAM,aAAa;AAAA,IAC/C,SAAS,iBAAiB,MAAM,aAAa;AAAA,IAC7C,YAAY,iBAAiB,MAAM,QAAQ;AAAA,IAC3C,aAAa,iBAAiB,MAAM,SAAS;AAAA,IAC7C,WAAW,iBAAiB,MAAM,QAAQ;AAAA,IAC1C,YAAY,iBAAiB,MAAM,WAAW;AAAA,IAC9C,KAAK,iBAAiB,MAAM,SAAS;AAAA,IACrC,IAAI,iBAAiB,MAAM,QAAQ;AAAA,IACnC,cAAc,iBAAiB,MAAM,OAAO;AAAA,IAC5C,aAAa,KAAK,MAAM,oBAAoB,GAAG,UAAU;AAAA,IACzD,eAAe,KAAK,MAAM,iBAAiB,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC;AAAA,EAChE;AACF;AAEA,SAAS,cACP,YACA,OACA,UAAmC,CAAC,GACpC;AACA,MAAI,CAAC,uBAAuB,GAAG;AAC7B;AAAA,EACF;AAEA,UAAQ,MAAM,oBAAoB;AAAA,IAChC,IAAI,KAAK,IAAI;AAAA,IACb;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,CAAC;AACH;AASA,SAAS,aAAqB;AAC5B,SAAO,QAAQ,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC,CAAC;AACzE;AAvEA,IA4Ea;AA5Eb,IAAAC,gBAAA;AAAA;AAAA;AAIA;AACA,IAAAC;AACA;AACA;AACA;AASA,IAAAC;AA2DO,IAAM,kBAAN,MAAsB;AAAA,MAc3B,YACmB,MAKjB;AALiB;AAAA,MAKhB;AAAA,MALgB;AAAA,MAdX,YAAY,oBAAI,IAAgC;AAAA,MAChD,uBAAuB,oBAAI,IAUjC;AAAA;AAAA;AAAA;AAAA,MAaF,OAAO,MAA8B;AACnC,cAAM,KAAK,WAAW;AAQtB,cAAM,cAAsC;AAAA,UAC1C,GAAG,OAAO;AAAA,YACR,OAAO,QAAQ,QAAQ,GAAG,EAAE,OAAO,CAAC,MAA6B,EAAE,CAAC,KAAK,IAAI;AAAA,UAC/E;AAAA,UACA,MAAM;AAAA,UACN,WAAW;AAAA,UACX,aAAa;AAAA,UACb,GAAG,KAAK;AAAA,QACV;AAEA,YAAI;AACJ,YAAI;AACF,gBAAM,KAAK,KAAK,QAAQ,MAAM,KAAK,MAAM;AAAA,YACvC,KAAK,KAAK;AAAA,YACV,KAAK;AAAA,YACL,MAAM,KAAK,QAAQ;AAAA,YACnB,MAAM,KAAK,QAAQ;AAAA,UACrB,CAAC;AAAA,QACH,SAAS,KAAK;AACZ,gBAAM,QAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAChE,gBAAM,IAAI,mBAAmB,qBAAqB,OAAO;AAAA,YACvD,SAAS,KAAK,KAAK,CAAC;AAAA,YACpB,KAAK,KAAK;AAAA,YACV,cAAc,KAAK;AAAA,UACrB,CAAC;AAAA,QACH;AAEA,cAAM,aAAa,IAAI,WAAW,gBAAgB;AAClD,YAAI;AAEJ,YAAI,KAAK,SAAS,WAAW,KAAK,SAAS,SAAS;AAClD,cAAI;AACF,6BAAiB,IAAI,uBAAuB;AAAA,cAC1C,MAAM,KAAK,QAAQ;AAAA,cACnB,MAAM,KAAK,QAAQ;AAAA,YACrB,CAAC;AAAA,UACH,SAAS,KAAK;AACZ,0BAAc,IAAI,uBAAuB;AAAA,cACvC,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,YACxD,CAAC;AAAA,UACH;AAAA,QACF;AAGA,cAAM,SAAS,IAAI,eAAe,IAAI,MAAM,KAAK,YAAY,cAAc;AAG3E,aAAK,WAAW,MAAM;AAGtB,aAAK,UAAU,IAAI,IAAI,MAAM;AAC7B,aAAK,KAAK,GAAG,OAAO,OAAO,MAAM,CAAC;AAGlC,cAAM,QAAqB;AAAA,UACzB,MAAM;AAAA,UACN,aAAa,KAAK;AAAA,UAClB,YAAY;AAAA,UACZ,MAAM,KAAK;AAAA,UACX,OAAO,KAAK,SAAS;AAAA,UACrB,KAAK,KAAK;AAAA,QACZ;AACA,aAAK,KAAK,SAAS,KAAK,KAAK;AAE7B,eAAO,OAAO,MAAM;AAAA,MACtB;AAAA;AAAA;AAAA;AAAA,MAKQ,WAAW,QAA8B;AAC/C,cAAM,EAAE,KAAK,YAAY,MAAM,GAAG,IAAI;AAGtC,YAAI,OAAO,CAAC,SAAiB;AAC3B,gBAAM,SAAS,OAAO,KAAK,MAAM,OAAO;AACxC,gBAAM,EAAE,IAAI,IAAI,WAAW,OAAO,MAAM;AACxC,wBAAc,IAAI,cAAc;AAAA,YAC9B,aAAa,KAAK;AAAA,YAClB;AAAA,YACA,SAAS,sBAAsB,MAAM;AAAA,UACvC,CAAC;AAGD,gBAAM,QAAqB;AAAA,YACzB,MAAM;AAAA,YACN,aAAa,KAAK;AAAA,YAClB,YAAY;AAAA,YACZ,OAAO;AAAA,YACP;AAAA,UACF;AACA,eAAK,KAAK,SAAS,KAAK,KAAK;AAE7B,cAAI,OAAO,kBAAkB,CAAC,OAAO,eAAe,UAAU;AAC5D,gBAAI;AACF,qBAAO,eAAe,MAAM,QAAQ,GAAG;AAAA,YACzC,SAAS,KAAK;AACZ,4BAAc,IAAI,wBAAwB;AAAA,gBACxC,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,cACxD,CAAC;AAAA,YACH;AAAA,UACF;AAAA,QACF,CAAC;AAGD,YAAI,OAAO,CAAC,EAAE,SAAS,MAA4B;AACjD,iBAAO,QAAQ;AACf,iBAAO,WAAW;AAGlB,gBAAM,QAAqB;AAAA,YACzB,MAAM;AAAA,YACN,aAAa,KAAK;AAAA,YAClB,YAAY;AAAA,YACZ;AAAA,UACF;AACA,eAAK,KAAK,SAAS,KAAK,KAAK;AAE7B,gBAAM,gBAAgB,KAAK,qBAAqB,IAAI,EAAE;AACtD,cAAI,eAAe;AACjB,iBAAK,cAAc,cAAc,QAAQ,MAAM;AAC7C,kBAAI,CAAC,cAAc,WAAW;AAC5B,8BAAc,YAAY;AAC1B,qBAAK,iBAAiB,MAAM;AAAA,cAC9B;AACA,mBAAK,qBAAqB,OAAO,EAAE;AACnC,4BAAc,QAAQ;AAAA,YACxB,CAAC;AAAA,UACH,OAAO;AAEL,mBAAO,eAAe,WAAW,MAAM;AACrC,mBAAK,iBAAiB,MAAM;AAAA,YAC9B,GAAG,GAAI;AAAA,UACT;AAGA,eAAK,KAAK,GAAG,UAAU,IAAI,KAAK,IAAI,GAAG,QAAQ;AAAA,QACjD,CAAC;AAAA,MACH;AAAA,MAEQ,iBAAiB,QAA8B;AACrD,YAAI,OAAO,cAAc;AACvB,uBAAa,OAAO,YAAY;AAChC,iBAAO,eAAe;AAAA,QACxB;AACA,eAAO,gBAAgB,QAAQ;AAC/B,aAAK,UAAU,OAAO,OAAO,EAAE;AAAA,MACjC;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,YAAwB,OAAqB;AACjD,cAAM,WAAW,KAAK,UAAU,IAAI,UAAU;AAC9C,YAAI,CAAC,UAAU;AACb,gBAAM,IAAI,MAAM,uBAAuB,UAAU,EAAE;AAAA,QACrD;AACA,YAAI,CAAC,SAAS,OAAO;AACnB,gBAAM,IAAI,MAAM,uBAAuB;AAAA,QACzC;AAEA,sBAAc,YAAY,aAAa;AAAA,UACrC,SAAS,sBAAsB,KAAK;AAAA,QACtC,CAAC;AACD,iBAAS,IAAI,MAAM,KAAK;AAAA,MAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAaA,OAAO,YAAwB,MAAc,MAAoB;AAC/D,cAAM,WAAW,KAAK,UAAU,IAAI,UAAU;AAC9C,YAAI,CAAC,YAAY,CAAC,SAAS,OAAO;AAChC;AAAA,QACF;AAEA,YAAI,SAAS,gBAAgB,QAAQ,SAAS,gBAAgB,MAAM;AAClE,wBAAc,YAAY,mBAAmB,EAAE,MAAM,KAAK,CAAC;AAC3D;AAAA,QACF;AAEA,sBAAc,YAAY,cAAc;AAAA,UACtC,UAAU,SAAS;AAAA,UACnB,UAAU,SAAS;AAAA,UACnB;AAAA,UACA;AAAA,QACF,CAAC;AACD,iBAAS,cAAc;AACvB,iBAAS,cAAc;AACvB,iBAAS,IAAI,OAAO,MAAM,IAAI;AAC9B,YAAI,SAAS,kBAAkB,CAAC,SAAS,eAAe,UAAU;AAChE,cAAI;AACF,qBAAS,eAAe,OAAO,MAAM,IAAI;AAAA,UAC3C,SAAS,KAAK;AACZ,0BAAc,YAAY,yBAAyB;AAAA,cACjD,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,YACxD,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,KAAK,YAAwB,SAAyB,WAAiB;AACrE,cAAM,WAAW,KAAK,UAAU,IAAI,UAAU;AAC9C,YAAI,UAAU;AACZ,eAAK,SAAS,IAAI,KAAK,MAAM;AAAA,QAC/B;AAAA,MACF;AAAA,MAEA,MAAM,YAAwB,SAAyB,WAA0B;AAC/E,cAAM,WAAW,KAAK,UAAU,IAAI,UAAU;AAC9C,YAAI,CAAC,UAAU;AACb,iBAAO,QAAQ,QAAQ;AAAA,QACzB;AAEA,YAAI,CAAC,SAAS,OAAO;AACnB,gBAAMC,YAAW,KAAK,qBAAqB,IAAI,UAAU;AACzD,cAAIA,WAAU;AACZ,gBAAI,CAACA,UAAS,WAAW;AACvB,cAAAA,UAAS,YAAY;AACrB,mBAAK,iBAAiB,QAAQ;AAAA,YAChC;AACA,mBAAOA,UAAS;AAAA,UAClB;AAEA,eAAK,iBAAiB,QAAQ;AAC9B,iBAAO,QAAQ,QAAQ;AAAA,QACzB;AAEA,cAAM,WAAW,KAAK,qBAAqB,IAAI,UAAU;AACzD,YAAI,UAAU;AACZ,cAAI,SAAS,WAAW,QAAQ;AAC9B,qBAAS,IAAI,KAAK,MAAM;AAAA,UAC1B;AACA,iBAAO,SAAS;AAAA,QAClB;AAEA,YAAIC,WAAU,MAAM;AAAA,QAAC;AACrB,cAAM,UAAU,IAAI,QAAc,CAAC,iBAAiB;AAClD,UAAAA,WAAU;AAAA,QACZ,CAAC;AACD,YAAI,oBAAoB,MAAM;AAAA,QAAC;AAC/B,cAAM,gBAAgB,IAAI,QAAc,CAAC,iBAAiB;AACxD,8BAAoB;AAAA,QACtB,CAAC;AACD,aAAK,qBAAqB,IAAI,YAAY;AAAA,UACxC;AAAA,UACA;AAAA,UACA;AAAA,UACA,WAAW;AAAA,UACX;AAAA,UACA,SAAAA;AAAA,QACF,CAAC;AACD,aAAK,SAAS,IAAI,KAAK,MAAM,EAAE,QAAQ,MAAM;AAC3C,gBAAM,SAAS,KAAK,qBAAqB,IAAI,UAAU;AACvD,cAAI,CAAC,QAAQ;AACX;AAAA,UACF;AAEA,iBAAO,kBAAkB;AAAA,QAC3B,CAAC;AACD,eAAO;AAAA,MACT;AAAA,MAEA,iBAAiB,aAAqB,SAAyB,WAAiB;AAC9E,mBAAW,YAAY,KAAK,UAAU,OAAO,GAAG;AAC9C,cAAI,SAAS,KAAK,gBAAgB,eAAe,CAAC,SAAS,OAAO;AAChE;AAAA,UACF;AAEA,eAAK,SAAS,IAAI,KAAK,MAAM;AAAA,QAC/B;AAAA,MACF;AAAA,MAEA,MAAM,kBAAkB,aAAqB,SAAyB,WAA0B;AAC9F,cAAM,SAA0B,CAAC;AAEjC,mBAAW,YAAY,KAAK,UAAU,OAAO,GAAG;AAC9C,cAAI,SAAS,KAAK,gBAAgB,aAAa;AAC7C;AAAA,UACF;AAEA,iBAAO,KAAK,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC;AAAA,QAC7C;AAEA,cAAM,QAAQ,IAAI,MAAM;AAAA,MAC1B;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,YAAoD;AACtD,eAAO,KAAK,UAAU,IAAI,UAAU;AAAA,MACtC;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,YAAwB,SAA+B;AAC5D,cAAM,WAAW,KAAK,UAAU,IAAI,UAAU;AAC9C,YAAI,UAAU;AACZ,gBAAM,SAAS,SAAS,WAAW,WAAW,OAAO;AACrD,wBAAc,YAAY,UAAU;AAAA,YAClC;AAAA,YACA,QAAQ,OAAO;AAAA,YACf,KAAK,OAAO,WAAW,OAAO,OAAO,MAAM;AAAA,YAC3C,MAAM,OAAO,WAAW,OAAO,OAAO,KAAK,aAAa;AAAA,YACxD,SAAS,OAAO,WAAW,OAAO,sBAAsB,OAAO,IAAI,IAAI;AAAA,UACzE,CAAC;AACD,iBAAO;AAAA,QACT;AAEA,eAAO,EAAE,QAAQ,UAAU;AAAA,MAC7B;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,SAAS,YAAiD;AAC9D,cAAM,WAAW,KAAK,UAAU,IAAI,UAAU;AAC9C,YAAI,CAAC,YAAY,CAAC,SAAS,gBAAgB;AACzC,iBAAO,EAAE,QAAQ,cAAc;AAAA,QACjC;AAEA,YAAI,SAAS,eAAe,UAAU;AACpC,iBAAO,EAAE,QAAQ,cAAc;AAAA,QACjC;AAEA,YAAI;AACF,gBAAM,SAAS,MAAM,SAAS,eAAe,SAAS;AACtD,iBAAO;AAAA,YACL,QAAQ;AAAA,YACR,MAAM,OAAO;AAAA,YACb,KAAK,OAAO;AAAA,YACZ,MAAM,OAAO;AAAA,YACb,MAAM,OAAO;AAAA,UACf;AAAA,QACF,SAAS,KAAK;AACZ,wBAAc,YAAY,wBAAwB;AAAA,YAChD,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,UACxD,CAAC;AACD,iBAAO,EAAE,QAAQ,cAAc;AAAA,QACjC;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,oBAAoB,YAAwB,SAAyC;AACzF,cAAM,WAAW,MAAM,KAAK,SAAS,UAAU;AAC/C,YAAI,SAAS,WAAW,MAAM;AAC5B,iBAAO;AAAA,QACT;AAEA,eAAO,qBAAqB,SAAS,MAAM,OAAO;AAAA,MACpD;AAAA;AAAA;AAAA;AAAA,MAKA,kBAAkB,YAAwB,OAAuB;AAC/D,cAAM,WAAW,KAAK,UAAU,IAAI,UAAU;AAC9C,YAAI,UAAU;AACZ,iBAAO,SAAS,WAAW,KAAK,KAAK;AAAA,QACvC;AAEA,eAAO,OAAO,MAAM,CAAC;AAAA,MACvB;AAAA;AAAA;AAAA;AAAA,MAKA,SAA2B;AACzB,eAAO,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,MAC3C;AAAA;AAAA;AAAA;AAAA,MAKA,WAAiB;AACf,mBAAW,UAAU,KAAK,qBAAqB,OAAO,GAAG;AACvD,iBAAO,QAAQ;AAAA,QACjB;AACA,aAAK,qBAAqB,MAAM;AAEhC,mBAAW,YAAY,KAAK,UAAU,OAAO,GAAG;AAC9C,cAAI,SAAS,OAAO;AAClB,iBAAK,SAAS,IAAI,KAAK,SAAS;AAAA,UAClC;AACA,eAAK,iBAAiB,QAAQ;AAAA,QAChC;AACA,aAAK,UAAU,MAAM;AAAA,MACvB;AAAA,IACF;AAAA;AAAA;;;AC7fA,SAAS,iBAAiB;AAC1B,SAAS,QAAQ,QAAAC,aAAY;AAU7B,eAAsB,aAAaC,QAAyC;AAC1E,MAAI;AAEF,UAAM,QAAQ,MAAMD,MAAKC,MAAI;AAG7B,QAAI,CAAC,MAAM,YAAY,GAAG;AACxB,aAAO,EAAE,OAAO,OAAO,OAAO,0BAA0B;AAAA,IAC1D;AAGA,UAAM,OAAOA,QAAM,UAAU,IAAI;AAGjC,UAAM,OAAOA,QAAM,UAAU,IAAI;AAEjC,WAAO,EAAE,OAAO,KAAK;AAAA,EACvB,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,UAAU;AACtD,aAAO,EAAE,OAAO,OAAO,OAAO,sBAAsB;AAAA,IACtD;AACA,QAAK,MAAgC,SAAS,UAAU;AACtD,aAAO,EAAE,OAAO,OAAO,OAAO,oBAAoB;AAAA,IACpD;AACA,WAAO,EAAE,OAAO,OAAO,OAAO,sBAAuB,MAAgB,OAAO,GAAG;AAAA,EACjF;AACF;AAzCA,IA8Ca;AA9Cb;AAAA;AAAA;AA8CO,IAAM,qBAAN,MAAyB;AAAA,MAC9B,MAAM,SAASA,QAA6B;AAC1C,cAAM,SAAS,MAAM,aAAaA,MAAI;AAEtC,YAAI,CAAC,OAAO,OAAO;AACjB,gBAAM,IAAI,MAAM,2BAA2B,OAAO,KAAK,EAAE;AAAA,QAC3D;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AClDA,SAAS,cAAAC,aAAY,gBAAAC,qBAAoB;AACzC,OAAO,YAAY;AACnB,SAAS,QAAAC,OAAM,YAAAC,iBAAgB;AAS/B,SAAS,cAAcC,QAAsB;AAC3C,SAAOA,OAAK,QAAQ,OAAO,GAAG;AAChC;AAEA,SAAS,eAAe,UAAkBA,QAAsB;AAC9D,SAAO,cAAcD,UAAS,UAAUC,MAAI,CAAC;AAC/C;AAEA,SAAS,qBAAqB,MAAuB;AACnD,SAAO,KAAK,WAAW,GAAG,KAAK,SAAS,kBAAkB,SAAS;AACrE;AAEA,SAAS,aAAa,MAAuB;AAC3C,SAAO,SAAS;AAClB;AAEA,SAAS,oBAAoB,MAAuB;AAClD,SAAO,SAAS,kBAAkB,SAAS;AAC7C;AAEA,SAAS,qBAAqB,IAA+BA,QAAuB;AAClF,MAAI,CAACA,UAAQA,OAAK,WAAW,IAAI,GAAG;AAClC,WAAO;AAAA,EACT;AACA,SAAO,GAAG,QAAQA,MAAI,KAAK,GAAG,QAAQ,GAAGA,MAAI,GAAG;AAClD;AAUO,SAAS,sBACd,UACA,SAC2B;AAC3B,QAAM,gBAAgBF,MAAK,UAAU,YAAY;AAEjD,MAAI,CAACF,YAAW,aAAa,GAAG;AAE9B,WAAO,CAAC,SAAiB,CAAC,qBAAqB,IAAI;AAAA,EACrD;AAEA,QAAM,mBAAmBC,cAAa,eAAe,OAAO;AAC5D,QAAM,KAAK,OAAO,EAAE,IAAI,gBAAgB;AAExC,SAAO,CAAC,SAAiB;AACvB,QAAI,oBAAoB,IAAI,GAAG;AAC7B,aAAO;AAAA,IACT;AAEA,UAAM,eAAe,eAAe,UAAUC,MAAK,SAAS,IAAI,CAAC;AACjE,WAAO,CAAC,qBAAqB,IAAI,YAAY;AAAA,EAC/C;AACF;AAMO,SAAS,6BAAwD;AACtE,SAAO,CAAC,SAAiB,CAAC,aAAa,IAAI;AAC7C;AAMO,SAAS,0BAA0B,UAA6C;AACrF,OAAK;AAKL,SAAO,CAACE,WACN,iCAAiC,KAAK,CAAC,MAAM,EAAE,KAAK,cAAcA,MAAI,CAAC,CAAC;AAC5E;AA9FA,IAQM;AARN;AAAA;AAAA;AAQA,IAAM,mCAA6C;AAAA,MACjD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA;AAAA;;;ACNA,OAAO,cAAc;AAPrB,IAmBa;AAnBb;AAAA;AAAA;AAKA,IAAAC;AAGA;AAWO,IAAM,mBAAN,MAAuB;AAAA,MAS5B,YACU,aACR,UACQ,aACR;AAHQ;AAEA;AAER,cAAM,eAAe,0BAA0B,QAAQ;AAEvD,aAAK,WAAW,SAAS,MAAM,UAAU;AAAA,UACvC,SAAS;AAAA,UACT,eAAe;AAAA,UACf,YAAY;AAAA,QACd,CAAC;AAED,aAAK,SAAS,GAAG,OAAO,CAAC,YAAY,gBAAgB,KAAK,UAAU,WAAW,CAAC;AAAA,MAClF;AAAA,MAbU;AAAA,MAEA;AAAA,MAXF;AAAA,MACA,aAAoC;AAAA,MACpC,iBAAgC;AAAA,MAChC,gBAAqD;AAAA,MACrD,yBAAyB;AAAA,MAChB,cAAc;AAAA,MACd,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAuBvB,UAAU,aAA4B;AAC5C,cAAM,MAAM,KAAK,IAAI;AACrB,YAAI,KAAK,mBAAmB,MAAM;AAChC,eAAK,iBAAiB;AAAA,QACxB;AAEA,YAAI,eAAe,KAAK,uBAAuB,WAAW,GAAG;AAC3D,eAAK,yBAAyB;AAAA,QAChC;AAEA,YAAI,eAAe,CAAC,KAAK,kBAAkB,WAAW,GAAG;AACvD,eAAK,gBAAgB;AAAA,QACvB,WAAW,eAAe,KAAK,kBAAkB,aAAa;AAC5D,eAAK,gBAAgB;AAAA,QACvB,WAAW,KAAK,kBAAkB,MAAM;AACtC,eAAK,gBAAgB;AAAA,QACvB;AAEA,cAAM,UAAU,MAAM,KAAK;AAC3B,cAAM,QAAQ,KAAK,IAAI,KAAK,aAAa,KAAK,IAAI,GAAG,KAAK,cAAc,OAAO,CAAC;AAEhF,YAAI,KAAK,YAAY;AACnB,uBAAa,KAAK,UAAU;AAAA,QAC9B;AAEA,aAAK,aAAa,WAAW,MAAM,KAAK,WAAW,GAAG,KAAK;AAAA,MAC7D;AAAA,MAEQ,aAAmB;AACzB,aAAK,aAAa,UAAU,OAAO,iBAAiB,KAAK,WAAW,GAAG;AAAA,UACrE,QAAQ,KAAK,iBAAiB;AAAA,QAChC,CAAC;AACD,YAAI,KAAK,wBAAwB;AAC/B,eAAK,aAAa,UAAU,OAAO,kBAAkB,KAAK,WAAW,GAAG;AAAA,YACtE,iBAAiB;AAAA,UACnB,CAAC;AAAA,QACH;AACA,aAAK,aAAa;AAClB,aAAK,iBAAiB;AACtB,aAAK,gBAAgB;AACrB,aAAK,yBAAyB;AAAA,MAChC;AAAA,MAEQ,kBAAkB,aAA8B;AACtD,eAAO,YAAY,QAAQ,OAAO,GAAG,EAAE,SAAS,QAAQ;AAAA,MAC1D;AAAA,MAEQ,uBAAuB,aAA8B;AAC3D,cAAM,aAAa,YAAY,QAAQ,OAAO,GAAG;AACjD,eAAO,WAAW,SAAS,iBAAiB;AAAA,MAC9C;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,QAAuB;AAC3B,YAAI,KAAK,YAAY;AACnB,uBAAa,KAAK,UAAU;AAC5B,eAAK,aAAa;AAAA,QACpB;AACA,cAAM,KAAK,SAAS,MAAM;AAAA,MAC5B;AAAA,IACF;AAAA;AAAA;;;AC3EA,SAAS,sBAA8B;AACrC,SAAO,MAAM,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,EAAE,CAAC;AACxE;AAtCA,IA6Ca;AA7Cb,IAAAC,gBAAA;AAAA;AAAA;AAMA;AAuUA;AAhSO,IAAM,mBAAN,MAAuB;AAAA,MAI5B,YAAoB,MAA4B;AAA5B;AAAA,MAA6B;AAAA,MAA7B;AAAA,MAHZ,YAAY,IAAI,mBAAmB;AAAA,MACnC,WAAW,oBAAI,IAA8B;AAAA,MAI7C,aAAa,aAAqB,UAAwB;AAChE,YAAI,CAAC,KAAK,KAAK,eAAe,KAAK,SAAS,IAAI,WAAW,GAAG;AAC5D;AAAA,QACF;AAEA,aAAK,SAAS;AAAA,UACZ;AAAA,UACA,IAAI,iBAAiB,aAAa,UAAU,KAAK,KAAK,WAAW;AAAA,QACnE;AAAA,MACF;AAAA,MAEA,kBAAwB;AACtB,mBAAW,aAAa,KAAK,KAAK,GAAG;AACnC,eAAK,aAAa,UAAU,IAAI,UAAU,IAAI;AAAA,QAChD;AAAA,MACF;AAAA,MAEA,cAAc,aAAqB,SAAqC;AACtE,cAAM,YAAY,KAAK,IAAI,WAAW;AACtC,YAAI,CAAC,WAAW;AACd,gBAAM,IAAI,MAAM,wBAAwB,WAAW,EAAE;AAAA,QACvD;AAEA,aAAK,KAAK,GACP,QAAQ,iDAAiD,EACzD,IAAI,KAAK,UAAU,OAAO,GAAG,WAAW;AAE3C,aAAK,KAAK,SAAS,KAAK;AAAA,UACtB,MAAM;AAAA,UACN;AAAA,UACA,OAAO,EAAE,QAAQ;AAAA,QACnB,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAaA,MAAM,KAAK,KAA+C;AAExD,cAAM,KAAK,UAAU,SAAS,IAAI,IAAI;AAGtC,cAAM,WAAW,KAAK,UAAU,IAAI,IAAI;AACxC,YAAI,UAAU;AAEZ,eAAK,MAAM,SAAS,EAAE;AAGtB,eAAK,aAAa,SAAS,IAAI,SAAS,IAAI;AAE5C,eAAK,KAAK,SAAS,KAAK;AAAA,YACtB,MAAM;AAAA,YACN,aAAa,SAAS;AAAA,YACtB,OAAO,EAAE,cAAc,KAAK,IAAI,EAAE;AAAA,UACpC,CAAC;AACD,eAAK,KAAK,WAAW,qBAAqB,SAAS,EAAE;AACrD,iBAAO;AAAA,QACT;AAGA,cAAM,YAAuB;AAAA,UAC3B,IAAI,oBAAoB;AAAA,UACxB,MAAM,IAAI;AAAA,UACV,eAAe;AAAA,UACf,WAAW,IAAI;AAAA,UACf,UAAU,KAAK,IAAI;AAAA,UACnB,cAAc,KAAK,IAAI;AAAA,UACvB,SAAS;AAAA,YACP,gBAAgB;AAAA,YAChB,mBAAmB;AAAA,YACnB,WAAW;AAAA,YACX,YAAY;AAAA,cACV,IAAI;AAAA,cACJ,MAAM;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAEA,aAAK,KAAK,GACP;AAAA,UACC;AAAA;AAAA,QAEF,EACC;AAAA,UACC,UAAU;AAAA,UACV,UAAU;AAAA,UACV;AAAA,UACA,UAAU,aAAa;AAAA,UACvB,UAAU;AAAA,UACV,UAAU;AAAA,UACV,KAAK,UAAU,UAAU,OAAO;AAAA,QAClC;AAGF,aAAK,KAAK,SAAS,KAAK;AAAA,UACtB,MAAM;AAAA,UACN,aAAa,UAAU;AAAA,UACvB,OAAO;AAAA,QACT,CAAC;AAGD,aAAK,aAAa,UAAU,IAAI,UAAU,IAAI;AAC9C,aAAK,KAAK,WAAW,qBAAqB,UAAU,EAAE;AAEtD,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,MAAM,MAAM,aAAoC;AAC9C,cAAM,YAAY,KAAK,IAAI,WAAW;AACtC,YAAI,CAAC,WAAW;AACd,gBAAM,IAAI,MAAM,wBAAwB,WAAW,EAAE;AAAA,QACvD;AAGA,cAAM,UAAU,KAAK,SAAS,IAAI,WAAW;AAC7C,YAAI,SAAS;AACX,gBAAM,QAAQ,MAAM;AACpB,eAAK,SAAS,OAAO,WAAW;AAAA,QAClC;AAEA,YAAI,KAAK,KAAK,UAAU;AACtB,gBAAM,KAAK,KAAK,SAAS,WAAW;AAAA,QACtC;AAGA,aAAK,KAAK,GAAG,QAAQ,qCAAqC,EAAE,IAAI,WAAW;AAE3E,YAAI,KAAK,KAAK,SAAS;AACrB,cAAI;AACF,kBAAM,KAAK,KAAK,QAAQ,WAAW;AAAA,UACrC,SAAS,KAAK;AACZ,oBAAQ,KAAK,oCAAoC,GAAG;AAAA,UACtD;AAAA,QACF;AAGA,aAAK,KAAK,SAAS,KAAK;AAAA,UACtB,MAAM;AAAA,UACN;AAAA,UACA,OAAO,EAAE,cAAc,KAAK,IAAI,EAAE;AAAA,QACpC,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,OAAoB;AAClB,cAAM,OAAO,KAAK,KAAK,GACpB;AAAA,UACC;AAAA;AAAA;AAAA,QAGF,EACC,IAAI;AAUP,eAAO,KAAK,IAAI,CAAC,SAAS;AAAA,UACxB,IAAI,IAAI;AAAA,UACR,MAAM,IAAI;AAAA,UACV,eAAe,IAAI;AAAA,UACnB,WAAW,IAAI,cAAc;AAAA,UAC7B,UAAU,IAAI;AAAA,UACd,cAAc,IAAI;AAAA,UAClB,SAAS,KAAK,MAAM,IAAI,QAAQ;AAAA,QAClC,EAAE;AAAA,MACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,IAAI,aAA4C;AAC9C,cAAM,MAAM,KAAK,KAAK,GACnB;AAAA,UACC;AAAA;AAAA;AAAA,QAGF,EACC,IAAI,WAAW;AAYlB,YAAI,CAAC,IAAK,QAAO;AAEjB,eAAO;AAAA,UACL,IAAI,IAAI;AAAA,UACR,MAAM,IAAI;AAAA,UACV,eAAe,IAAI;AAAA,UACnB,WAAW,IAAI,cAAc;AAAA,UAC7B,UAAU,IAAI;AAAA,UACd,cAAc,IAAI;AAAA,UAClB,SAAS,KAAK,MAAM,IAAI,QAAQ;AAAA,QAClC;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,UAAUC,QAAqC;AAC7C,cAAM,MAAM,KAAK,KAAK,GACnB;AAAA,UACC;AAAA;AAAA;AAAA,QAGF,EACC,IAAIA,MAAI;AAYX,YAAI,CAAC,IAAK,QAAO;AAEjB,eAAO;AAAA,UACL,IAAI,IAAI;AAAA,UACR,MAAM,IAAI;AAAA,UACV,eAAe,IAAI;AAAA,UACnB,WAAW,IAAI,cAAc;AAAA,UAC7B,UAAU,IAAI;AAAA,UACd,cAAc,IAAI;AAAA,UAClB,SAAS,KAAK,MAAM,IAAI,QAAQ;AAAA,QAClC;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,MAAM,aAA2B;AAC/B,cAAM,MAAM,KAAK,IAAI;AACrB,aAAK,KAAK,GACP,QAAQ,uDAAuD,EAC/D,IAAI,KAAK,WAAW;AAAA,MACzB;AAAA,MAEA,YAAY,aAA2B;AACrC,aAAK,KAAK,WAAW,cAAc,WAAW;AAAA,MAChD;AAAA,IACF;AAAA;AAAA;;;AC3UA,IAuBM,iBAIO;AA3Bb;AAAA;AAAA;AAuBA,IAAM,kBAA4C;AAAA,MAChD,SAAS;AAAA,IACX;AAEO,IAAM,oBAAN,MAAwB;AAAA,MACZ;AAAA,MACT,QAAgC;AAAA,MAChC,aAAa;AAAA,MAErB,YAAY,SAA6C;AACvD,aAAK,UAAU,EAAE,GAAG,iBAAiB,GAAG,QAAQ;AAAA,MAClD;AAAA,MAEA,MACE,kBACA,YACA,SACuB;AACvB,cAAM,MAAM,KAAK,IAAI;AACrB,cAAM,cAAc,KAAK,SAAS;AAElC,YAAI,eAAe,YAAY,qBAAqB,kBAAkB;AACpE,gBAAM,kBAAkB,YAAY,eAAe,QAAQ,OAAO,YAAY;AAC9E,gBAAMC,uBACJ,mBAAmB,YAAY,eAAe,aAAa,OAAO,YAAY;AAEhF,sBAAY,aAAa;AACzB,sBAAY,aAAa;AAEzB,iBAAO;AAAA,YACL,QAAQ;AAAA,YACR,YAAY,YAAY;AAAA,YACxB,cAAc;AAAA,YACd,qBAAAA;AAAA,UACF;AAAA,QACF;AAEA,cAAM,sBACJ,eAAe,YAAY,qBAAqB,mBAC5C,YAAY,aACZ;AACN,cAAM,eAAe,wBAAwB,OAAO,UAAU;AAE9D,aAAK,cAAc;AACnB,aAAK,QAAQ;AAAA,UACX;AAAA,UACA;AAAA,UACA,YAAY,KAAK;AAAA,UACjB,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,IAAI,QAAQ;AAAA,UACZ,WAAW,QAAQ,QAAQ,YAAY,KAAK;AAAA,QAC9C;AAEA,eAAO;AAAA,UACL,QAAQ;AAAA,UACR,YAAY,KAAK,MAAM;AAAA,UACvB;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MAEA,QAAQ,kBAA0B,YAA0B;AAC1D,cAAM,QAAQ,KAAK,SAAS;AAC5B,YAAI,CAAC,OAAO;AACV;AAAA,QACF;AAEA,YAAI,MAAM,qBAAqB,oBAAoB,MAAM,eAAe,YAAY;AAClF;AAAA,QACF;AAEA,aAAK,QAAQ;AAAA,MACf;AAAA,MAEA,eAAe,YAA0B;AACvC,cAAM,QAAQ,KAAK,SAAS;AAC5B,YAAI,CAAC,SAAS,MAAM,eAAe,YAAY;AAC7C;AAAA,QACF;AAEA,cAAM,aAAa,KAAK,IAAI,IAAI,KAAK,QAAQ;AAAA,MAC/C;AAAA,MAEA,WAAmC;AACjC,YAAI,CAAC,KAAK,OAAO;AACf,iBAAO;AAAA,QACT;AAEA,eAAO,KAAK;AAAA,MACd;AAAA,IACF;AAAA;AAAA;;;AC7CO,SAAS,gBACd,IACA,QACA,SACM;AACN,WAAS,IAAI,IAAI,OAAyB;AAC1C,UAAQ,IAAI,IAAI,MAAM;AACxB;AAKA,eAAsB,SACpB,KACA,KACA,UACiB;AACjB,QAAM,eACJ,aAAa,UAAa,OAAO,IAAI,YAAY,uBAAuB;AAE1E,MAAI,gBAAgB,CAAC,qBAAqB,IAAI,IAAI,EAAE,GAAG;AACrD,UAAM,SAAS,IAAI,cAAc,SAAS;AAC1C,QAAI,CAAC,UAAU,OAAO,eAAe,UAAU;AAC7C,aAAO;AAAA,QACL,MAAM;AAAA,QACN,IAAI,IAAI;AAAA,QACR,IAAI;AAAA,QACJ,OAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAU,SAAS,IAAI,IAAI,EAAE;AAEnC,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,MACL,MAAM;AAAA,MACN,IAAI,IAAI;AAAA,MACR,IAAI;AAAA,MACJ,OAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,sBAAsB,IAAI,EAAE;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAEA,MAAI;AACF,UAAM,SAAS,QAAQ,IAAI,IAAI,EAAE;AACjC,QAAI,OAAO,IAAI;AAEf,QAAI,QAAQ;AACV,aAAO,OAAO,MAAM,IAAI,IAAI;AAAA,IAC9B;AAEA,UAAM,OAAO,MAAM,QAAQ,MAAM,KAAK,QAAQ;AAE9C,WAAO;AAAA,MACL,MAAM;AAAA,MACN,IAAI,IAAI;AAAA,MACR,IAAI;AAAA,MACJ;AAAA,IACF;AAAA,EACF,SAAS,OAAgB;AACvB,UAAM,kBAAkB,eAAe,KAAK;AAE5C,WAAO;AAAA,MACL,MAAM;AAAA,MACN,IAAI,IAAI;AAAA,MACR,IAAI;AAAA,MACJ,OAAO;AAAA,IACT;AAAA,EACF;AACF;AAKA,SAAS,eAAe,OAAiC;AACvD,QAAM,YAAY;AAQlB,MAAI,UAAU,SAAS,YAAY;AACjC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,UAAU;AAAA,IACrB;AAAA,EACF;AAEA,MAAI,UAAU,MAAM;AAClB,WAAO;AAAA,MACL,MAAM,UAAU;AAAA,MAChB,SAAS,UAAU,WAAW,OAAO,UAAU,IAAI;AAAA,MACnD,SAAS,UAAU;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,UAAU,WAAW;AAAA,EAChC;AACF;AAlLA,IAsDM,UAKA,SACA;AA5DN;AAAA;AAAA;AAsDA,IAAM,WAAW,oBAAI,IAA4B;AAKjD,IAAM,UAAU,oBAAI,IAA2B;AAC/C,IAAM,uBAAuB,oBAAI,IAAI;AAAA,MACnC;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA;AAAA;;;AChED,IAmCMC,kBAUO;AA7Cb;AAAA;AAAA;AAmCA,IAAMA,mBAAyC;AAAA,MAC7C,oBAAoB;AAAA;AAAA,MACpB,mBAAmB;AAAA;AAAA,MACnB,mBAAmB;AAAA;AAAA,MACnB,gBAAgB;AAAA;AAAA,IAClB;AAKO,IAAM,iBAAN,MAAqB;AAAA,MAClB;AAAA;AAAA,MAEA,SAAS,oBAAI,IAA0B;AAAA;AAAA,MAEvC,aAAa,oBAAI,IAAoB;AAAA;AAAA,MAErC,aAAa,oBAAI,IAQvB;AAAA,MAEF,YAAY,SAA0C;AACpD,aAAK,UAAU,EAAE,GAAGA,kBAAiB,GAAG,QAAQ;AAAA,MAClD;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,eACE,aACA,UACA,OACA,SAC4C;AAC5C,cAAM,MAAM,KAAK,IAAI;AACrB,cAAM,KAAK,QAAQ;AACnB,cAAM,YAAY,QAAQ,QAAQ,YAAY,KAAK;AAGnD,cAAM,WAAW,KAAK,OAAO,IAAI,WAAW;AAE5C,YAAI,UAAU;AAEZ,cAAI,MAAM,SAAS,WAAW;AAE5B,iBAAK,OAAO,OAAO,WAAW;AAAA,UAChC,WAAW,SAAS,aAAa,UAAU;AAEzC,mBAAO,KAAK,WAAW,aAAa,UAAU,OAAO,IAAI,SAAS;AAAA,UACpE,OAAO;AAEL,mBAAO;AAAA,cACL,cAAc;AAAA,cACd,QAAQ;AAAA,YACV;AAAA,UACF;AAAA,QACF;AAGA,cAAM,aAAa,KAAK,WAAW,IAAI,WAAW;AAClD,YAAI,cAAc,MAAM,WAAW,WAAW,KAAK,QAAQ,gBAAgB;AACzE,cAAI,WAAW,OAAO,MAAM,WAAW,cAAc,WAAW;AAE9D,mBAAO,KAAK,WAAW,aAAa,UAAU,OAAO,IAAI,SAAS;AAAA,UACpE;AAAA,QACF;AAGA,eAAO,KAAK,WAAW,aAAa,UAAU,OAAO,IAAI,SAAS;AAAA,MACpE;AAAA;AAAA;AAAA;AAAA,MAKA,UAAU,aAAqB,UAA2B;AACxD,cAAM,QAAQ,KAAK,OAAO,IAAI,WAAW;AACzC,YAAI,CAAC,SAAS,MAAM,aAAa,UAAU;AACzC,iBAAO;AAAA,QACT;AAGA,aAAK,WAAW,IAAI,UAAU,KAAK,IAAI,CAAC;AAGxC,cAAM,YAAY,KAAK,IAAI,IAAI,KAAK,QAAQ;AAE5C,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,QAAQ,aAAqB,UAAwB;AACnD,cAAM,QAAQ,KAAK,OAAO,IAAI,WAAW;AACzC,YAAI,SAAS,MAAM,aAAa,UAAU;AAExC,eAAK,WAAW,IAAI,aAAa;AAAA,YAC/B,UAAU,MAAM;AAAA,YAChB,UAAU,KAAK,IAAI;AAAA,YACnB,IAAI,MAAM;AAAA,YACV,WAAW,MAAM;AAAA,UACnB,CAAC;AAED,eAAK,OAAO,OAAO,WAAW;AAC9B,eAAK,WAAW,OAAO,QAAQ;AAAA,QACjC;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,aAAa,aAAqB,UAA2B;AAC3D,cAAM,QAAQ,KAAK,OAAO,IAAI,WAAW;AACzC,eAAO,OAAO,aAAa;AAAA,MAC7B;AAAA;AAAA;AAAA;AAAA,MAKA,cAAc,aAA+C;AAC3D,cAAM,QAAQ,KAAK,OAAO,IAAI,WAAW;AACzC,YAAI,SAAS,KAAK,IAAI,KAAK,MAAM,WAAW;AAC1C,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,yBAAyB,aAA8B;AACrD,cAAM,QAAQ,KAAK,OAAO,IAAI,WAAW;AACzC,YAAI,CAAC,OAAO;AACV,iBAAO;AAAA,QACT;AAEA,cAAM,gBAAgB,KAAK,WAAW,IAAI,MAAM,QAAQ;AACxD,YAAI,CAAC,eAAe;AAClB,iBAAO;AAAA,QACT;AAGA,cAAM,wBAAwB,KAAK,QAAQ,qBAAqB;AAChE,eAAO,KAAK,IAAI,IAAI,gBAAgB;AAAA,MACtC;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,cACE,aACA,UACA,OACA,SACuC;AACvC,YAAI,CAAC,KAAK,yBAAyB,WAAW,GAAG;AAC/C,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,QAAQ;AAAA,UACV;AAAA,QACF;AAGA,aAAK,OAAO,OAAO,WAAW;AAG9B,cAAM,KAAK,QAAQ;AACnB,cAAM,YAAY,QAAQ,QAAQ,YAAY,KAAK;AACnD,cAAM,SAAS,KAAK,WAAW,aAAa,UAAU,OAAO,IAAI,SAAS;AAE1E,eAAO,EAAE,SAAS,OAAO,aAAa;AAAA,MACxC;AAAA;AAAA;AAAA;AAAA,MAKQ,WACN,aACA,UACA,OACA,IACA,WAC2B;AAC3B,cAAM,MAAM,KAAK,IAAI;AAErB,cAAM,QAAsB;AAAA,UAC1B;AAAA,UACA;AAAA,UACA,UAAU;AAAA,UACV,WAAW,MAAM,KAAK,QAAQ;AAAA,UAC9B;AAAA,UACA;AAAA,QACF;AAEA,aAAK,OAAO,IAAI,aAAa,KAAK;AAClC,aAAK,WAAW,IAAI,UAAU,GAAG;AAGjC,aAAK,WAAW,OAAO,WAAW;AAElC,eAAO,EAAE,cAAc,KAAK;AAAA,MAC9B;AAAA;AAAA;AAAA;AAAA,MAKA,UAAgB;AACd,cAAM,MAAM,KAAK,IAAI;AAErB,mBAAW,CAAC,aAAa,KAAK,KAAK,KAAK,QAAQ;AAC9C,cAAI,MAAM,MAAM,WAAW;AACzB,iBAAK,OAAO,OAAO,WAAW;AAC9B,iBAAK,WAAW,OAAO,MAAM,QAAQ;AAAA,UACvC;AAAA,QACF;AAGA,cAAM,cAAc,MAAM,KAAK,QAAQ,iBAAiB;AACxD,mBAAW,CAAC,aAAa,UAAU,KAAK,KAAK,YAAY;AACvD,cAAI,WAAW,WAAW,aAAa;AACrC,iBAAK,WAAW,OAAO,WAAW;AAAA,UACpC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACvQA,SAAS,gBAAgB;AAWzB,SAAS,KAAAC,UAAS;AAyBlB,SAAS,oBAAoB,MAAiE;AAC5F,MAAI,WAAW,MAAM;AACnB,WAAO,OAAO,KAAK,KAAK,OAAO,QAAQ;AAAA,EACzC;AAEA,QAAM,UAAU,qBAAqB,IAAI,KAAK,QAAQ;AACtD,MAAI,CAAC,SAAS;AACZ,UAAM;AAAA,MACJ,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EACF;AACA,uBAAqB,OAAO,KAAK,QAAQ;AACzC,SAAO,QAAQ;AACjB;AAEA,SAAS,+BACP,UACmC;AACnC,SAAO;AACT;AAEO,SAAS,6BAA6B,MAA+B,SAAuB;AACjG,uBAAqB,IAAI,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC3D;AAEO,SAAS,0BAA0B,UAAwB;AAChE,uBAAqB,OAAO,QAAQ;AACtC;AAEA,SAAS,iCAAyC;AAChD,+BAA8B,6BAA6B,MAAO;AAClE,SAAO;AACT;AAEA,SAAS,wBACP,UACA,KAOA,OAMM;AACN,MAAI,CAAC,UAAU;AACb;AAAA,EACF;AAEA,MAAI,YAAY;AAAA,IACd;AAAA,IACA,OAAO;AAAA,MACL;AAAA,QACE;AAAA,UACE,SAAS;AAAA,UACT,MAAM,MAAM;AAAA,UACZ,OAAO;AAAA,UACP,MAAM,MAAM;AAAA,UACZ,UAAU,MAAM;AAAA,UAChB,aAAa,MAAM,QAAQ;AAAA,QAC7B;AAAA,QACA,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,sBAAyD;AAChE,MAAI,QAAQ,aAAa,SAAS;AAChC,UAAMC,aAAY,QAAQ,IAAI,WAAW,QAAQ,IAAI,WAAW;AAChE,WAAO;AAAA,MACL,MAAM,CAACA,UAAS;AAAA,MAChB,OAAO,SAASA,UAAS,KAAKA;AAAA,IAChC;AAAA,EACF;AAEA,QAAM,YAAY,QAAQ,IAAI,SAAS;AACvC,QAAM,YAAY,SAAS,SAAS;AACpC,QAAM,OAAO,cAAc,YAAY,CAAC,SAAS,IAAI,CAAC,WAAW,IAAI;AAErE,SAAO;AAAA,IACL;AAAA,IACA,OAAO,aAAa;AAAA,EACtB;AACF;AAlIA,IAkBM,6BAEA,qBAiBA,sBACF;AAtCJ;AAAA;AAAA;AAKA,IAAAC;AAWA;AAEA,IAAM,8BAA8BF,GAAE,KAAK,yBAAyB,EAAE,SAAS;AAE/E,IAAM,sBAAsBA,GAAE,MAAM;AAAA,MAClCA,GAAE,OAAO;AAAA,QACP,YAAYA,GAAE,OAAO;AAAA,QACrB,OAAOA,GAAE,OAAO;AAAA,QAChB,UAAU;AAAA,QACV,eAAeA,GAAE,OAAO,EAAE,SAAS;AAAA,MACrC,CAAC;AAAA,MACDA,GAAE,OAAO;AAAA,QACP,YAAYA,GAAE,OAAO;AAAA,QACrB,WAAWA,GAAE,QAAQ,QAAQ;AAAA,QAC7B,UAAUA,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,QACvC,MAAMA,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,QACnC,UAAU;AAAA,QACV,eAAeA,GAAE,OAAO,EAAE,SAAS;AAAA,MACrC,CAAC;AAAA,IACH,CAAC;AAED,IAAM,uBAAuB,oBAAI,IAAgE;AACjG,IAAI,6BAA6B;AA+FjC;AAAA,MACE;AAAA,MACAA,GAAE,OAAO;AAAA,QACP,aAAaA,GAAE,OAAO;AAAA,MACxB,CAAC;AAAA,MACD,OAAO,MAAM,QAAQ;AACnB,eAAO,IAAI,YACR,OAAO,EACP,IAAI,CAAC,aAAa,SAAS,MAAM,CAAC,EAClC,OAAO,CAAC,aAAa,SAAS,gBAAgB,KAAK,WAAW;AAAA,MACnE;AAAA,IACF;AAGA;AAAA,MACE;AAAA,MACAA,GAAE,OAAO;AAAA,QACP,aAAaA,GAAE,OAAO;AAAA,QACtB,MAAMA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,QAC3C,MAAMA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,MAC7C,CAAC;AAAA,MACD,OAAO,MAAM,QAAQ;AACnB,cAAM,YAAY,IAAI,aAAa,IAAI,KAAK,WAAW;AACvD,YAAI,CAAC,WAAW;AACd,gBAAM,EAAE,MAAM,uBAAuB,SAAS,wBAAwB,KAAK,WAAW,GAAG;AAAA,QAC3F;AAEA,cAAM,QAAQ,oBAAoB;AAGlC,cAAM,WAAW,IAAI,YAAY,OAAO;AAAA,UACtC,aAAa,KAAK;AAAA,UAClB,MAAM;AAAA,UACN,MAAM,MAAM;AAAA,UACZ,OAAO,MAAM;AAAA,UACb,KAAK,UAAU;AAAA,UACf,MAAM,KAAK,QAAQ;AAAA,UACnB,MAAM,KAAK,QAAQ;AAAA,QACrB,CAAC;AAED,eAAO;AAAA,MACT;AAAA,IACF;AAGA;AAAA,MACE;AAAA,MACAA,GAAE,OAAO;AAAA,QACP,YAAYA,GAAE,OAAO;AAAA,QACrB,SAASA,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS;AAAA,MACnD,CAAC;AAAA,MACD,OAAO,MAAM,KAAK,aAAa;AAC7B,cAAM,SAAS,IAAI,YAAY,OAAO,KAAK,YAAY,KAAK,WAAW,CAAC;AAExE,YAAI,OAAO,WAAW,MAAM;AAC1B,iBAAO;AAAA,QACT;AAEA,cAAM,WAAW,+BAA+B;AAChD,gCAAwB,UAAU,KAAK;AAAA,UACrC,MAAM,wBAAwB;AAAA,UAC9B,MAAM,OAAO;AAAA,UACb;AAAA,UACA,SAAS,OAAO;AAAA,QAClB,CAAC;AAED,eAAO;AAAA,UACL,QAAQ;AAAA,UACR,WAAW;AAAA,UACX;AAAA,UACA,MAAM,OAAO,KAAK;AAAA,UAClB,KAAK,OAAO;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAGA;AAAA,MACE;AAAA,MACAA,GAAE,OAAO;AAAA,QACP,YAAYA,GAAE,OAAO;AAAA,MACvB,CAAC;AAAA,MACD,OAAO,MAAM,KAAK,aAAa;AAC7B,cAAM,WAAW,MAAM,IAAI,YAAY,SAAS,KAAK,UAAU;AAE/D,YAAI,SAAS,WAAW,MAAM;AAC5B,iBAAO;AAAA,QACT;AAEA,cAAM,WAAW,+BAA+B;AAChD,gCAAwB,UAAU,KAAK;AAAA,UACrC,MAAM,wBAAwB;AAAA,UAC9B,MAAM,SAAS;AAAA,UACf;AAAA,UACA,SAAS,SAAS;AAAA,QACpB,CAAC;AAED,eAAO;AAAA,UACL,QAAQ;AAAA,UACR,WAAW;AAAA,UACX;AAAA,UACA,MAAM,SAAS,KAAK;AAAA,UACpB,KAAK,SAAS;AAAA,UACd,MAAM,SAAS;AAAA,UACf,MAAM,SAAS;AAAA,UACf,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAGA;AAAA,MACE;AAAA,MACAA,GAAE,OAAO;AAAA,QACP,YAAYA,GAAE,OAAO;AAAA,MACvB,CAAC;AAAA,MACD,OAAO,MAAM,QAAQ;AACnB,cAAM,IAAI,YAAY,MAAM,KAAK,UAAU;AAAA,MAC7C;AAAA,IACF;AAGA,oBAAgB,kBAAkB,qBAAqB,OAAO,MAAM,QAAQ;AAC1E,YAAM,SAAS,oBAAoB,IAAI;AACvC,YAAM,YAAY,IAAI,WAAW,wBAAwB,KAAK,UAAU;AACxE,UAAI,WAAW;AACb,YAAI,WAAW;AAAA,UACb;AAAA,UACA;AAAA,UACA,+BAA+B,KAAK,QAAQ;AAAA,UAC5C,KAAK;AAAA,QACP;AACA;AAAA,MACF;AAEA,UAAI,YAAY,MAAM,KAAK,YAAY,MAAM;AAAA,IAC/C,CAAC;AAGD;AAAA,MACE;AAAA,MACAA,GAAE,OAAO;AAAA,QACP,YAAYA,GAAE,OAAO;AAAA,QACrB,MAAMA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,QAChC,MAAMA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,MAClC,CAAC;AAAA,MACD,OAAO,MAAM,QAAQ;AACnB,cAAM,YAAY,IAAI,WAAW,wBAAwB,KAAK,UAAU;AACxE,YAAI,WAAW;AACb,cAAI,WAAW,OAAO,WAAW,KAAK,MAAM,KAAK,IAAI;AACrD;AAAA,QACF;AAEA,YAAI,YAAY,OAAO,KAAK,YAAY,KAAK,MAAM,KAAK,IAAI;AAAA,MAC9D;AAAA,IACF;AAAA;AAAA;;;AChSA,IAyBa,wBAKA;AA9Bb;AAAA;AAAA;AAyBO,IAAM,yBAA8C;AAAA,MACzD,UAAU,MAAM;AAAA,MAChB,aAAa;AAAA,IACf;AAEO,IAAM,eAAN,MAAmB;AAAA,MAMxB,YAA6B,UAA+B,wBAAwB;AAAvD;AAAA,MAAwD;AAAA,MAAxD;AAAA,MALZ,UAAU,oBAAI,IAAqB;AAAA,MACnC,cAAc,oBAAI,IAAoB;AAAA,MAC/C,SAAS;AAAA,MACT,YAAY;AAAA,MAIpB,QAAQ,OAAe,OAAoB;AACzC,YAAI,KAAK,UAAW;AAEpB,YAAI,SAAS,KAAK,QAAQ,IAAI,KAAK;AACnC,YAAI,CAAC,QAAQ;AACX,iBAAO,KAAK,QAAQ,QAAQ,KAAK,QAAQ,aAAa;AACpD,kBAAM,SAAS,KAAK,QAAQ,KAAK,EAAE,KAAK,EAAE;AAC1C,gBAAI,WAAW,OAAW;AAC1B,kBAAM,eAAe,KAAK,QAAQ,IAAI,MAAM;AAC5C,kBAAM,cAAc,KAAK,YAAY,IAAI,MAAM,KAAK;AACpD,iBAAK,QAAQ,eAAe;AAAA,cAC1B,OAAO;AAAA,cACP,QAAQ,cAAc,UAAU;AAAA,cAChC,OAAO;AAAA,YACT,CAAC;AACD,iBAAK,QAAQ,OAAO,MAAM;AAC1B,iBAAK,YAAY,OAAO,MAAM;AAAA,UAChC;AACA,mBAAS,CAAC;AACV,eAAK,QAAQ,IAAI,OAAO,MAAM;AAC9B,eAAK,YAAY,IAAI,OAAO,CAAC;AAAA,QAC/B,OAAO;AACL,gBAAMG,SAAQ,KAAK,YAAY,IAAI,KAAK,KAAK;AAC7C,eAAK,QAAQ,OAAO,KAAK;AACzB,eAAK,QAAQ,IAAI,OAAO,MAAM;AAC9B,eAAK,YAAY,OAAO,KAAK;AAC7B,eAAK,YAAY,IAAI,OAAOA,MAAK;AAAA,QACnC;AAEA,eAAO,KAAK,KAAK;AACjB,YAAI,SAAS,KAAK,YAAY,IAAI,KAAK,KAAK,KAAK,MAAM;AAEvD,eAAO,QAAQ,KAAK,QAAQ,YAAY,OAAO,SAAS,GAAG;AACzD,gBAAM,UAAU,OAAO,MAAM;AAC7B,mBAAS,QAAQ;AACjB,eAAK,QAAQ,eAAe;AAAA,YAC1B;AAAA,YACA,WAAW,QAAQ;AAAA,YACnB,aAAa;AAAA,YACb,cAAc,OAAO;AAAA,UACvB,CAAC;AAAA,QACH;AAEA,aAAK,YAAY,IAAI,OAAO,KAAK;AAAA,MACnC;AAAA,MAEA,MAAM,UAAkB,MAAgD;AACtE,YAAI,KAAK,UAAW;AACpB,YAAI,OAAO;AACX,YAAI,UAAU;AACd,cAAM,cAAc,KAAK;AAEzB,eAAO,OAAO,YAAY,KAAK,QAAQ,OAAO,GAAG;AAC/C,gBAAM,SAAS,CAAC,GAAG,KAAK,QAAQ,KAAK,CAAC;AACtC,cAAI,mBAAmB;AAEvB,mBAAS,IAAI,GAAG,IAAI,OAAO,UAAU,OAAO,UAAU,KAAK;AACzD,kBAAM,OAAO,cAAc,KAAK,OAAO;AACvC,kBAAM,QAAQ,OAAO,GAAG;AACxB,kBAAM,SAAS,KAAK,QAAQ,IAAI,KAAK;AACrC,gBAAI,CAAC,UAAU,OAAO,WAAW,EAAG;AAEpC,kBAAM,OAAO,OAAO,CAAC;AACrB,gBAAI,CAAC,KAAK,KAAK,IAAI,GAAG;AACpB,kBAAI,QAAS,MAAK,SAAS,cAAc;AACzC;AAAA,YACF;AAEA,mBAAO,MAAM;AACb,oBAAQ,KAAK;AACb,sBAAU;AACV;AAEA,kBAAM,aAAa,KAAK,YAAY,IAAI,KAAK,KAAK,KAAK,KAAK;AAC5D,gBAAI,OAAO,WAAW,GAAG;AACvB,mBAAK,QAAQ,OAAO,KAAK;AACzB,mBAAK,YAAY,OAAO,KAAK;AAAA,YAC/B,OAAO;AACL,mBAAK,YAAY,IAAI,OAAO,SAAS;AAAA,YACvC;AAAA,UACF;AAEA,cAAI,qBAAqB,EAAG;AAAA,QAC9B;AAEA,YAAI,QAAS,MAAK,SAAS,cAAc;AAAA,MAC3C;AAAA,MAEA,UAAmB;AACjB,eAAO,KAAK,QAAQ,SAAS;AAAA,MAC/B;AAAA,MAEA,UAAgB;AACd,aAAK,YAAY;AACjB,aAAK,QAAQ,MAAM;AACnB,aAAK,YAAY,MAAM;AAAA,MACzB;AAAA,IACF;AAAA;AAAA;;;AC7HA,OAAO,eAAe;AAVtB,IAmBM,YACA,WACA,mBACA,gCASAC,cAIO;AAnCb;AAAA;AAAA;AAWA;AAQA,IAAM,aAAa,OAAO;AAC1B,IAAM,YAAY,MAAM;AACxB,IAAM,oBAAoB;AAC1B,IAAM,iCAAiC;AASvC,IAAMA,eAA8B;AAAA,MAClC,MAAM,MAAM;AAAA,MAAC;AAAA,IACf;AAEO,IAAM,WAAN,MAAe;AAAA,MAgBpB,YACmB,QACjB,IACA,QACA;AAHiB;AAIjB,aAAK,KAAK;AACV,aAAK,SAAS,UAAUA;AACxB,aAAK,eAAe,IAAI,aAAa;AAAA,UACnC,GAAG;AAAA,UACH,cAAc,CAAC,UAAU,KAAK,uBAAuB,KAAK;AAAA,UAC1D,cAAc,CAAC,UAAU,KAAK,2BAA2B,KAAK;AAAA,QAChE,CAAC;AACD,aAAK,oBAAoB;AAAA,MAC3B;AAAA,MAZmB;AAAA,MAhBV;AAAA,MACD,gBAAgB,oBAAI,IAAY;AAAA,MACvB;AAAA,MACT,aAAoC;AAAA,MACpC,iBAAwC;AAAA,MACxC,eAAoC;AAAA,MACpC,UAAU;AAAA,MACV,6BAA6B;AAAA,MAC7B,4BAA4B;AAAA,MAC5B,6BAA6B;AAAA,MAC7B,6BAA6B;AAAA,MAC7B,4BAA4B;AAAA,MAC5B,yBAAyB;AAAA,MAChB;AAAA,MAiBT,YAAkB;AACxB,aAAK,UAAU;AAAA,MACjB;AAAA,MAEQ,sBAA4B;AAClC,aAAK,OAAO,GAAG,WAAW,CAAC,MAAc,aAAsB;AAC7D,eAAK,UAAU;AAEf,cAAI,UAAU;AACZ,iBAAK,iBAAiB,IAAI;AAC1B;AAAA,UACF;AAEA,cAAI;AACF,kBAAM,MAAM,KAAK,MAAM,KAAK,SAAS,CAAC;AACtC,iBAAK,iBAAiB,GAAG;AAAA,UAC3B,SAAS,OAAO;AACd,oBAAQ,MAAM,uCAAuC,KAAK,EAAE,KAAK,KAAK;AAAA,UACxE;AAAA,QACF,CAAC;AAED,aAAK,OAAO,GAAG,SAAS,MAAM;AAC5B,eAAK,UAAU;AACf,eAAK,gBAAgB;AACrB,eAAK,aAAa,QAAQ;AAC1B,eAAK,eAAe;AAAA,QACtB,CAAC;AAED,aAAK,OAAO,GAAG,QAAQ,MAAM;AAC3B,eAAK,UAAU;AAAA,QACjB,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA,MAKA,UAAU,SAA+B;AACvC,aAAK,iBAAiB;AAAA,MACxB;AAAA;AAAA;AAAA;AAAA,MAKA,QAAQ,SAA6B;AACnC,aAAK,eAAe;AAAA,MACtB;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,YAAY,KAA8B;AACxC,YAAI,KAAK,OAAO,eAAe,UAAU,MAAM;AAC7C,iBAAO;AAAA,QACT;AACA,YAAI;AACF,eAAK,OAAO,KAAK,KAAK,UAAU,GAAG,CAAC;AACpC,iBAAO;AAAA,QACT,SAAS,OAAO;AACd,kBAAQ,MAAM,oCAAoC,KAAK,EAAE,KAAK,KAAK;AACnE,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,MAEA,oBAAoB,KAAqB,MAAc,QAAyB;AAC9E,YAAI,KAAK,OAAO,eAAe,UAAU,MAAM;AAC7C,iBAAO;AAAA,QACT;AAEA,YAAI;AACF,eAAK,OAAO,KAAK,KAAK,UAAU,GAAG,GAAG,MAAM;AAC1C,iBAAK,OAAO,MAAM,MAAM,MAAM;AAAA,UAChC,CAAC;AACD,iBAAO;AAAA,QACT,SAAS,OAAO;AACd,kBAAQ,MAAM,oCAAoC,KAAK,EAAE,KAAK,KAAK;AACnE,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,MAEA,WAAW,MAAuB;AAChC,YAAI,KAAK,OAAO,eAAe,UAAU,MAAM;AAC7C,iBAAO;AAAA,QACT;AACA,YAAI;AACF,eAAK,OAAO,KAAK,MAAM,EAAE,QAAQ,KAAK,CAAC;AACvC,iBAAO;AAAA,QACT,SAAS,OAAO;AACd,kBAAQ,MAAM,yCAAyC,KAAK,EAAE,KAAK,KAAK;AACxE,iBAAO;AAAA,QACT;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,KAAK,KAA8B;AACjC,eAAO,KAAK,YAAY,GAAG;AAAA,MAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,WAAW,OAAe,KAAoC;AAC5D,YAAI,KAAK,OAAO,eAAe,UAAU,KAAM;AAE/C,cAAM,QAAQ,KAAK,YAAY,GAAG;AAElC,cAAM,WAAW,KAAK,OAAO,kBAAkB;AAC/C,YAAI,WAAW,cAAc,KAAK,aAAa,QAAQ,GAAG;AACxD,cAAI,CAAC,KAAK,UAAU,MAAM,IAAI,GAAG;AAC/B,oBAAQ,MAAM,yCAAyC,KAAK,EAAE,EAAE;AAAA,UAClE;AACA;AAAA,QACF;AAEA,aAAK,aAAa,QAAQ,OAAO,KAAK;AACtC,aAAK,YAAY;AAAA,MACnB;AAAA;AAAA;AAAA;AAAA,MAKA,gBAAgB,OAAe,MAAe,MAAc,GAAS;AACnE,cAAM,QAAe;AAAA,UACnB,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA,WAAW,KAAK,IAAI;AAAA,UACpB;AAAA,QACF;AACA,aAAK,WAAW,OAAO,KAAK;AAAA,MAC9B;AAAA,MAEQ,YAAY,KAAqC;AACvD,YAAI,OAAO,SAAS,GAAG,GAAG;AACxB,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,MAAM,IAAI;AAAA,UACZ;AAAA,QACF;AAEA,cAAM,OAAO,KAAK,UAAU,GAAG;AAC/B,eAAO;AAAA,UACL;AAAA,UACA,MAAM,OAAO,WAAW,MAAM,MAAM;AAAA,QACtC;AAAA,MACF;AAAA,MAEQ,UAAU,MAAgC;AAChD,YAAI;AACF,cAAI,OAAO,SAAS,IAAI,GAAG;AACzB,iBAAK,OAAO,KAAK,MAAM,EAAE,QAAQ,KAAK,CAAC;AAAA,UACzC,OAAO;AACL,iBAAK,OAAO,KAAK,IAAI;AAAA,UACvB;AACA,iBAAO;AAAA,QACT,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,MAEQ,cAAoB;AAC1B,YAAI,KAAK,OAAO,eAAe,UAAU,MAAM;AAC7C,eAAK,gBAAgB;AACrB,eAAK,aAAa,QAAQ;AAC1B;AAAA,QACF;AAEA,cAAM,WAAW,KAAK,OAAO,kBAAkB;AAC/C,YAAI,WAAW,WAAW;AACxB,gBAAM,WAAW,aAAa;AAC9B,eAAK,aAAa,MAAM,UAAU,CAAC,SAAS;AAC1C,gBAAI;AACF,kBAAI,OAAO,SAAS,IAAI,GAAG;AACzB,qBAAK,OAAO,KAAK,MAAM,EAAE,QAAQ,KAAK,CAAC;AAAA,cACzC,OAAO;AACL,qBAAK,OAAO,KAAK,IAAI;AAAA,cACvB;AACA,qBAAO;AAAA,YACT,SAAS,OAAO;AACd,sBAAQ,MAAM,iCAAiC,KAAK,EAAE,KAAK,KAAK;AAChE,qBAAO;AAAA,YACT;AAAA,UACF,CAAC;AAAA,QACH;AAEA,YAAI,KAAK,aAAa,QAAQ,GAAG;AAC/B,eAAK,gBAAgB;AAAA,QACvB,OAAO;AACL,eAAK,iBAAiB;AAAA,QACxB;AAAA,MACF;AAAA,MAEQ,mBAAyB;AAC/B,YAAI,KAAK,WAAY;AACrB,aAAK,aAAa,YAAY,MAAM,KAAK,YAAY,GAAG,iBAAiB;AAAA,MAC3E;AAAA,MAEQ,kBAAwB;AAC9B,YAAI,KAAK,YAAY;AACnB,wBAAc,KAAK,UAAU;AAC7B,eAAK,aAAa;AAAA,QACpB;AAAA,MACF;AAAA,MAEQ,uBAAuB,OAA0C;AACvE,aAAK,8BAA8B;AACnC,aAAK,6BAA6B,MAAM;AACxC,aAAK,yBAAyB,aAAa,MAAM,KAAK;AAAA,MACxD;AAAA,MAEQ,2BAA2B,OAA0C;AAC3E,aAAK,8BAA8B;AACnC,aAAK,8BAA8B,MAAM;AACzC,aAAK,6BAA6B,MAAM;AACxC,aAAK,yBAAyB,aAAa,MAAM,KAAK;AAAA,MACxD;AAAA,MAEQ,yBAAyB,QAAmC,OAAqB;AACvF,cAAM,MAAM,KAAK,IAAI;AACrB,YAAI,MAAM,KAAK,yBAAyB,gCAAgC;AACtE;AAAA,QACF;AAEA,aAAK,OAAO;AAAA,UACV;AAAA,YACE;AAAA,YACA,UAAU,KAAK;AAAA,YACf;AAAA,YACA,gBAAgB,KAAK,OAAO,kBAAkB;AAAA,YAC9C,eAAe,KAAK;AAAA,YACpB,cAAc,KAAK;AAAA,YACnB,eAAe,KAAK;AAAA,YACpB,eAAe,KAAK;AAAA,YACpB,cAAc,KAAK;AAAA,UACrB;AAAA,UACA;AAAA,QACF;AAEA,aAAK,yBAAyB;AAC9B,aAAK,6BAA6B;AAClC,aAAK,4BAA4B;AACjC,aAAK,6BAA6B;AAClC,aAAK,6BAA6B;AAClC,aAAK,4BAA4B;AAAA,MACnC;AAAA;AAAA;AAAA;AAAA,MAKA,UAAU,OAAe,MAAe,MAAc,GAAY;AAChE,cAAM,QAAe;AAAA,UACnB,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA,WAAW,KAAK,IAAI;AAAA,UACpB;AAAA,QACF;AACA,eAAO,KAAK,KAAK,KAAK;AAAA,MACxB;AAAA,MAEA,kBACE,OACA,MACA,MACA,QACA,MAAc,GACL;AACT,cAAM,QAAe;AAAA,UACnB,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA,WAAW,KAAK,IAAI;AAAA,UACpB;AAAA,QACF;AACA,eAAO,KAAK,oBAAoB,OAAO,MAAM,MAAM;AAAA,MACrD;AAAA;AAAA;AAAA;AAAA,MAKA,aAAa,OAAwB;AACnC,mBAAW,WAAW,KAAK,eAAe;AACxC,cAAI,KAAK,WAAW,SAAS,KAAK,GAAG;AACnC,mBAAO;AAAA,UACT;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,UAAU,QAAwB;AAChC,mBAAW,SAAS,QAAQ;AAC1B,eAAK,cAAc,IAAI,KAAK;AAAA,QAC9B;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,YAAY,QAAwB;AAClC,mBAAW,SAAS,QAAQ;AAC1B,eAAK,cAAc,OAAO,KAAK;AAAA,QACjC;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,IAAI,QAAiB;AACnB,eAAO,KAAK,WAAW,KAAK,OAAO,eAAe,UAAU;AAAA,MAC9D;AAAA;AAAA;AAAA;AAAA,MAKA,OAAa;AACX,YAAI,KAAK,OAAO,eAAe,UAAU,MAAM;AAC7C,eAAK,UAAU;AACf,eAAK,OAAO,KAAK;AAAA,QACnB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,MAAe,QAAuB;AAC1C,aAAK,OAAO,MAAM,MAAM,MAAM;AAAA,MAChC;AAAA;AAAA;AAAA;AAAA;AAAA,MAMQ,WAAW,SAAiB,OAAwB;AAC1D,YAAI,YAAY,MAAO,QAAO;AAC9B,YAAI,YAAY,IAAK,QAAO;AAG5B,cAAM,eAAe,QAAQ,MAAM,GAAG;AACtC,cAAM,aAAa,MAAM,MAAM,GAAG;AAGlC,iBAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC5C,gBAAM,KAAK,aAAa,CAAC;AAGzB,cAAI,OAAO,KAAK;AAEd,gBAAI,MAAM,aAAa,SAAS,GAAG;AACjC,qBAAO;AAAA,YACT;AACA;AAAA,UACF;AAGA,cAAI,KAAK,WAAW,UAAU,OAAO,WAAW,CAAC,GAAG;AAClD,mBAAO;AAAA,UACT;AAAA,QACF;AAGA,eAAO,aAAa,UAAU,WAAW;AAAA,MAC3C;AAAA,IACF;AAAA;AAAA;;;AClbO,SAAS,cAAc,OAAwB;AACpD,SAAO,gBAAgB,KAAK,KAAK;AACnC;AAJA,IAAM;AAAN;AAAA;AAAA;AAAA,IAAM,kBAAkB;AAAA;AAAA;;;ACmBxB,SAAS,MAAM,cAAc;AAnB7B,IAqCM,2BAQA,2BAsBO;AAnEb;AAAA;AAAA;AAiBA,IAAAC;AAKA;AAEA;AACA;AAEA;AAUA,IAAM,4BAA4B;AAQlC,IAAM,4BAA4B,CAAC,SAAmD;AACpF,aACE,OAAO,SAAS,YAChB,SAAS,QACT,eAAe,QACd,KAAiC,cAAc;AAAA,IAEpD;AAeO,IAAM,QAAN,MAAmC;AAAA,MAWxC,YAA6B,MAAiB;AAAjB;AAC3B,aAAK,kBAAkB;AAAA,MACzB;AAAA,MAF6B;AAAA,MAVrB,UAAU,oBAAI,IAAwB;AAAA,MACtC,iBAAiB,oBAAI,IAA8B;AAAA,MACnD,qBAAqC,CAAC;AAAA,MACtC,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA,MAKf,uBAAuB,oBAAI,IAA8B;AAAA,MAMjE,UAAU,QAAiC;AACzC,aAAK,KAAK,SAAS;AAAA,MACrB;AAAA,MAEA,kBAAkB,gBAAsC;AACtD,aAAK,KAAK,iBAAiB;AAAA,MAC7B;AAAA;AAAA;AAAA;AAAA,MAKA,iBAAiB,QAAmB,KAA2B;AAC7D,cAAM,SAAS,IAAI,SAAS,QAAQ,OAAO,GAAG,KAAK,KAAK,MAAM;AAC9D,aAAK,QAAQ,IAAI,OAAO,IAAI,MAAM;AAClC,aAAK,eAAe,IAAI,OAAO,IAAI,GAAG;AAItC,eAAO,UAAU,qBAAqB;AAAA,UACpC,QAAQ;AAAA,UACR,UAAU,OAAO;AAAA,UACjB,aAAa,KAAK,KAAK,OAAO,KAAK;AAAA,UACnC,yBAAyB;AAAA,UACzB,SAAS,KAAK,KAAK,OAAO,cAAc;AAAA,UACxC,kBAAkB,UAAU,QAAQ,GAAG;AAAA,UACvC,UAAU;AAAA,QACZ,CAAC;AAGD,eAAO,UAAU,CAAC,QAAQ,KAAK,aAAa,QAAQ,GAAG,CAAC;AACxD,eAAO,QAAQ,MAAM,KAAK,YAAY,MAAM,CAAC;AAAA,MAC/C;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,aAAa,QAAkB,KAA6C;AACxF,YAAI,OAAO,SAAS,GAAG,GAAG;AACxB,eAAK,qBAAqB,OAAO,IAAI,GAAG;AACxC;AAAA,QACF;AAEA,gBAAQ,IAAI,MAAM;AAAA,UAChB,KAAK;AACH,mBAAO,UAAU,IAAI,MAAM;AAC3B;AAAA,UAEF,KAAK;AACH,mBAAO,YAAY,IAAI,MAAM;AAC7B;AAAA,UAEF,KAAK,WAAW;AACd,kBAAM,iBAAiB,KAAK,kBAAkB;AAC9C,gBAAI,wBAAuC;AAC3C,gBAAI,IAAI,OAAO,oBAAoB,0BAA0B,IAAI,IAAI,GAAG;AAItE,kBAAI;AACF,sBAAM,UAAU,MAAM,KAAK,mBAAmB,OAAO,EAAE;AACvD,6CAA6B,IAAI,MAAM,OAAO;AAC9C,wCAAwB,IAAI,KAAK;AAAA,cACnC,SAAS,OAAO;AACd,uBAAO,KAAK;AAAA,kBACV,MAAM;AAAA,kBACN,IAAI,IAAI;AAAA,kBACR,IAAI;AAAA,kBACJ,OAAO;AAAA,oBACL,MAAM;AAAA,oBACN,SACE,iBAAiB,QACb,MAAM,UACN;AAAA,kBACR;AAAA,gBACF,CAAC;AACD;AAAA,cACF;AAAA,YACF;AACA,kBAAM,SAAS,MAAM,SAAS,KAAgB,gBAAgB,OAAO,EAAE;AACvE,gBACE,0BAA0B,QAC1B,CAAC,OAAO,MACR,OAAO,OAAO,SAAS,oBACvB;AACA,wCAA0B,qBAAqB;AAAA,YACjD;AACA,mBAAO,KAAK,MAAM;AAClB;AAAA,UACF;AAAA,UAEA,KAAK;AACH,iBAAK,aAAa,QAAQ,IAAI,QAAQ;AACtC;AAAA,QACJ;AAAA,MACF;AAAA,MAEQ,mBAAmB,UAAqC;AAC9D,eAAO,IAAI,QAAgB,CAACC,UAAS,WAAW;AAC9C,gBAAM,QAAQ,WAAW,MAAM;AAC7B,kBAAM,UAAU,KAAK,qBAAqB,IAAI,QAAQ;AACtD,gBAAI,CAAC,QAAS;AACd,kBAAM,MAAM,QAAQ,UAAU,CAAC,MAAM,EAAE,UAAU,KAAK;AACtD,gBAAI,QAAQ,GAAI;AAChB,oBAAQ,OAAO,KAAK,CAAC;AACrB,gBAAI,QAAQ,WAAW,GAAG;AACxB,mBAAK,qBAAqB,OAAO,QAAQ;AAAA,YAC3C;AACA,mBAAO,IAAI,MAAM,mDAAmD,CAAC;AAAA,UACvE,GAAG,yBAAyB;AAE5B,gBAAM,SAAuB,EAAE,SAAAA,UAAS,QAAQ,MAAM;AACtD,gBAAM,QAAQ,KAAK,qBAAqB,IAAI,QAAQ;AACpD,cAAI,OAAO;AACT,kBAAM,KAAK,MAAM;AAAA,UACnB,OAAO;AACL,iBAAK,qBAAqB,IAAI,UAAU,CAAC,MAAM,CAAC;AAAA,UAClD;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MAEQ,qBAAqB,UAAoB,SAAuB;AACtE,cAAM,QAAQ,KAAK,qBAAqB,IAAI,QAAQ;AACpD,YAAI,CAAC,SAAS,MAAM,WAAW,GAAG;AAChC;AAAA,QACF;AACA,cAAM,SAAS,MAAM,MAAM;AAC3B,YAAI,MAAM,WAAW,GAAG;AACtB,eAAK,qBAAqB,OAAO,QAAQ;AAAA,QAC3C;AACA,qBAAa,OAAO,KAAK;AACzB,eAAO,QAAQ,OAAO;AAAA,MACxB;AAAA,MAEQ,4BAA4B,UAA0B;AAC5D,cAAM,QAAQ,KAAK,qBAAqB,IAAI,QAAQ;AACpD,YAAI,CAAC,MAAO;AACZ,aAAK,qBAAqB,OAAO,QAAQ;AACzC,mBAAW,UAAU,OAAO;AAC1B,uBAAa,OAAO,KAAK;AACzB,iBAAO,OAAO,IAAI,MAAM,mDAAmD,CAAC;AAAA,QAC9E;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,aAAa,QAAkB,UAAwC;AAC7E,cAAM,iBAAiB,KAAK,kBAAkB;AAC9C,cAAM,aAAa,eAAe,aAAa,KAAK;AACpD,mBAAW,aAAa,YAAY;AAClC,gBAAM,iBAAiB,OAAO,cAAc,UAAU,EAAE;AACxD,cAAI,OAAO,aAAa,cAAc,GAAG;AACvC,mBAAO,UAAU,gBAAgB,SAAS;AAAA,UAC5C;AAEA,gBAAM,WAAW,eAAe,WAAW,gBAAgB,UAAU,EAAE;AACvE,qBAAW,WAAW,UAAU;AAC9B,kBAAM,eAAe,OAAO,aAAa,UAAU,IAAI,QAAQ,EAAE;AACjE,gBAAI,CAAC,OAAO,aAAa,YAAY,GAAG;AACtC;AAAA,YACF;AACA,mBAAO,UAAU,cAAc,OAAO;AAAA,UACxC;AAAA,QACF;AAEA,eAAO,UAAU,qBAAqB;AAAA,UACpC,QAAQ;AAAA,UACR,QAAQ,OAAO,KAAK,QAAQ;AAAA,QAC9B,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA,MAKQ,YAAY,QAAwB;AAC1C,aAAK,QAAQ,OAAO,OAAO,EAAE;AAC7B,aAAK,eAAe,OAAO,OAAO,EAAE;AACpC,aAAK,4BAA4B,OAAO,EAAE;AAC1C,aAAK,KAAK,gBAAgB,UAAU,iBAAiB,OAAO,EAAE;AAC9D,aAAK,KAAK,gBAAgB,cAAc,eAAe,OAAO,EAAE;AAAA,MAMlE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,MAAM,SAAS,WAAoC;AAGjD,aAAK,QAAQ,IAAI,UAAU,IAAI,SAAS;AAAA,MAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,UAAU,OAAe,SAAwB;AAC/C,cAAM,SAAS,cAAc,KAAK;AAClC,mBAAW,UAAU,KAAK,QAAQ,OAAO,GAAG;AAC1C,cAAI,CAAC,OAAO,aAAa,KAAK,EAAG;AACjC,cAAI,UAAU,OAAO,SAAS,OAAO,GAAG;AACtC,iBAAK,2BAA2B,QAAQ,OAAO,SAAS,CAAC;AAAA,UAC3D,WAAW,QAAQ;AACjB,mBAAO,gBAAgB,OAAO,OAAO;AAAA,UACvC,OAAO;AACL,mBAAO,UAAU,OAAO,OAAO;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,aAAa,UAAoB,KAA8B;AAC7D,cAAM,SAAS,KAAK,QAAQ,IAAI,QAAQ;AACxC,YAAI,CAAC,OAAQ,QAAO;AACpB,eAAO,OAAO,KAAK,GAAG;AAAA,MACxB;AAAA,MAEA,mBAAmB,UAAoB,MAAuB;AAC5D,cAAM,SAAS,KAAK,QAAQ,IAAI,QAAQ;AACxC,YAAI,CAAC,OAAQ,QAAO;AACpB,eAAO,OAAO,WAAW,IAAI;AAAA,MAC/B;AAAA,MAEA,qBAAqB,UAAoB,YAA0B;AACjE,cAAM,SAAS,KAAK,QAAQ,IAAI,QAAQ;AACxC,YAAI,CAAC,QAAQ;AACX;AAAA,QACF;AAEA,eAAO;AAAA,UACL;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR;AAAA,UACF;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MAEA,mBAAmB,UAAgD;AACjE,eAAO,KAAK,eAAe,IAAI,QAAQ;AAAA,MACzC;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,YAA6B;AAE3B,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA,MAKA,UAAgB;AACd,mBAAW,UAAU,KAAK,QAAQ,OAAO,GAAG;AAC1C,cAAI,CAAC,OAAO,OAAO;AACjB,mBAAO,MAAM,MAAM,mBAAmB;AACtC;AAAA,UACF;AACA,iBAAO,KAAK;AAAA,QACd;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,WAAiB;AACf,mBAAW,UAAU,KAAK,QAAQ,OAAO,GAAG;AAC1C,iBAAO,MAAM;AAAA,QACf;AACA,aAAK,QAAQ,MAAM;AACnB,aAAK,eAAe,MAAM;AAAA,MAC5B;AAAA;AAAA;AAAA;AAAA,MAKQ,oBAA0B;AAEhC,cAAM,aAAoC;AAAA,UACxC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAEA,mBAAW,QAAQ,YAAY;AAC7B,gBAAM,QAAQ,KAAK,KAAK,SAAS,GAAG,MAAM,CAAC,UAAU;AACnD,iBAAK,kBAAkB,KAAK;AAAA,UAC9B,CAAC;AACD,eAAK,mBAAmB,KAAK,KAAK;AAAA,QACpC;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKQ,kBAAkB,OAA0B;AAClD,YAAI,MAAM,SAAS,mBAAmB;AACpC,gBAAMC,SAAQ,OAAO,eAAe,MAAM,aAAa,MAAM,UAAU;AACvE,qBAAW,UAAU,KAAK,QAAQ,OAAO,GAAG;AAC1C,gBAAI,CAAC,OAAO,aAAaA,MAAK,EAAG;AACjC,iBAAK,2BAA2B,QAAQA,QAAO,MAAM,OAAO,MAAM,GAAG;AAAA,UACvE;AACA;AAAA,QACF;AAEA,YAAI;AACJ,YAAI;AAEJ,gBAAQ,MAAM,MAAM;AAAA,UAClB,KAAK;AACH,gBAAI,CAAC,MAAM,aAAa;AACtB;AAAA,YACF;AACA,oBAAQ,OAAO,aAAa,MAAM,aAAa,MAAM,SAAS;AAC9D,mBAAO,MAAM,WAAW;AAAA,cACtB,OAAO,MAAM;AAAA,cACb,MAAM,MAAM;AAAA,YACd;AACA;AAAA,UAEF,KAAK;AACH,gBAAI,CAAC,MAAM,aAAa;AACtB;AAAA,YACF;AACA,oBAAQ,OAAO,iBAAiB,MAAM,aAAa,MAAM,SAAS;AAClE,mBAAO;AAAA,cACL,OAAO,MAAM;AAAA,YACf;AACA;AAAA,UAEF,KAAK;AACH,oBAAQ,OAAO,cAAc,MAAM,WAAW;AAC9C,mBAAO,MAAM;AACb;AAAA,UAEF,KAAK;AACH,oBAAQ,OAAO,kBAAkB,MAAM,WAAW;AAClD,mBAAO;AAAA,cACL,aAAa,QAAQ,MAAM,WAAW;AAAA,cACtC,eAAe,QAAQ,MAAM,aAAa;AAAA,cAC1C,iBAAiB,QAAQ,MAAM,eAAe;AAAA,YAChD;AACA;AAAA,UAEF,KAAK;AACH,oBAAQ,OAAO,iBAAiB,MAAM,WAAW;AACjD,mBAAO,EAAE,QAAQ,MAAM,OAAO;AAC9B;AAAA,UAEF,KAAK;AACH,oBAAQ,OAAO,gBAAgB,MAAM,aAAa,MAAM,UAAU;AAClE,mBAAO;AAAA,cACL,IAAI,MAAM;AAAA,cACV,MAAM,MAAM;AAAA,cACZ,OAAO,MAAM;AAAA,cACb,KAAK,MAAM;AAAA,cACX,aAAa,MAAM;AAAA,YACrB;AACA;AAAA,UAEF,KAAK;AACH,oBAAQ,OAAO,aAAa,MAAM,aAAa,MAAM,UAAU;AAC/D,mBAAO;AAAA,cACL,MAAM,MAAM;AAAA,YACd;AACA;AAAA,UAEF;AACE;AAAA,QACJ;AAEA,aAAK,UAAU,OAAO,IAAI;AAAA,MAC5B;AAAA,MAEQ,2BACN,QACA,OACA,SACA,KACM;AACN,cAAM,WAAW,KAAK,iBAAiB;AACvC,eAAO;AAAA,UACL;AAAA,UACA,OAAO;AAAA,YACL,0BAA0B,EAAE,OAAO,KAAK,UAAU,aAAa,QAAQ,OAAO,GAAG,OAAO;AAAA,UAC1F;AAAA,QACF;AAAA,MACF;AAAA,MAEQ,mBAA2B;AACjC,cAAM,KAAK,KAAK;AAChB,aAAK,gBAAgB;AACrB,eAAO;AAAA,MACT;AAAA,MAEQ,oBAAoC;AAC1C,YAAI,CAAC,KAAK,KAAK,gBAAgB;AAC7B,gBAAM,IAAI,MAAM,oDAAoD;AAAA,QACtE;AACA,eAAO,KAAK,KAAK;AAAA,MACnB;AAAA;AAAA;AAAA;AAAA,MAKA,UAAgB;AACd,mBAAW,SAAS,KAAK,oBAAoB;AAC3C,gBAAM;AAAA,QACR;AACA,aAAK,qBAAqB,CAAC;AAC3B,aAAK,SAAS;AAAA,MAChB;AAAA,IACF;AAAA;AAAA;;;AC5fA,SAAS,WAAAC,gBAAe;AACxB,SAAS,WAAAC,gBAAe;AACxB,SAAS,QAAAC,aAAY;AACrB,SAAS,KAAAC,UAAS;AAPlB;AAAA;AAAA;AAQA;AAGA,oBAAgB,kBAAkBA,GAAE,OAAO,CAAC,CAAC,GAAG,OAAO,OAAO,QAAQ;AACpE,aAAO,IAAI,aAAa,KAAK;AAAA,IAC/B,CAAC;AAGD;AAAA,MACE;AAAA,MACAA,GAAE,OAAO;AAAA,QACP,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC5B,CAAC;AAAA,MACD,OAAO,SAAS;AACd,cAAM,WAAW,KAAK,QAAQF,SAAQ;AACtC,cAAM,UAAU,MAAMD,SAAQ,UAAU,EAAE,eAAe,KAAK,CAAC;AAE/D,cAAM,cAAc,QACjB,OAAO,CAAC,UAAU,MAAM,YAAY,CAAC,EACrC,IAAI,CAAC,WAAW;AAAA,UACf,MAAM,MAAM;AAAA,UACZ,MAAME,MAAK,UAAU,MAAM,IAAI;AAAA,QACjC,EAAE,EACD,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAE9C,eAAO;AAAA,UACL,aAAa;AAAA,UACb,YAAY,aAAa,MAAMA,MAAK,UAAU,IAAI,IAAI;AAAA,UACtD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA;AAAA,MACE;AAAA,MACAC,GAAE,OAAO;AAAA,QACP,MAAMA,GAAE,OAAO;AAAA,MACjB,CAAC;AAAA,MACD,OAAO,MAAM,QAAQ;AACnB,eAAO,IAAI,aAAa,KAAK;AAAA,UAC3B,MAAM,KAAK;AAAA,QACb,CAAC;AAAA,MACH;AAAA,IACF;AAGA;AAAA,MACE;AAAA,MACAA,GAAE,OAAO;AAAA,QACP,IAAIA,GAAE,OAAO;AAAA,MACf,CAAC;AAAA,MACD,OAAO,MAAM,QAAQ;AACnB,cAAM,IAAI,aAAa,MAAM,KAAK,EAAE;AAAA,MACtC;AAAA,IACF;AAEA;AAAA,MACE;AAAA,MACAA,GAAE,OAAO;AAAA,QACP,aAAaA,GAAE,OAAO;AAAA,QACtB,SAASA,GAAE,OAAO;AAAA,UAChB,gBAAgBA,GAAE,OAAO;AAAA,UACzB,mBAAmBA,GAAE,OAAO;AAAA,UAC5B,WAAWA,GAAE,QAAQ;AAAA,UACrB,iBAAiBA,GAAE,OAAO,EAAE,SAAS;AAAA,UACrC,sBAAsBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,UACnD,YAAYA,GACT,OAAO;AAAA,YACN,IAAIA,GAAE,OAAO;AAAA,YACb,MAAMA,GAAE,KAAK,CAAC,QAAQ,OAAO,CAAC;AAAA,YAC9B,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,YAC/B,WAAWA,GAAE,KAAK,CAAC,cAAc,UAAU,CAAC,EAAE,SAAS;AAAA,YACvD,UAAUA,GACP;AAAA,cAAK,MACJA,GAAE;AAAA,gBACAA,GAAE,OAAO;AAAA,kBACP,IAAIA,GAAE,OAAO;AAAA,kBACb,MAAMA,GAAE,KAAK,CAAC,QAAQ,OAAO,CAAC;AAAA,kBAC9B,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,kBAC/B,WAAWA,GAAE,KAAK,CAAC,cAAc,UAAU,CAAC,EAAE,SAAS;AAAA,kBACvD,UAAUA,GAAE,IAAI,EAAE,SAAS;AAAA,gBAC7B,CAAC;AAAA,cACH;AAAA,YACF,EACC,SAAS;AAAA,UACd,CAAC,EACA,SAAS;AAAA,QACd,CAAC;AAAA,MACH,CAAC;AAAA,MACD,OAAO,MAAM,QAAQ;AACnB,YAAI,aAAa,cAAc,KAAK,aAAa,KAAK,OAAO;AAC7D,cAAM,YAAY,IAAI,aAAa,IAAI,KAAK,WAAW;AACvD,YAAI,CAAC,WAAW;AACd,gBAAM,EAAE,MAAM,uBAAuB,SAAS,wBAAwB,KAAK,WAAW,GAAG;AAAA,QAC3F;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA;;;ACzGA,SAAS,KAAAC,UAAS;AAUlB,SAAS,+BAA+B,OAAiD;AACvF,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,KAAK;AAC/B,UAAM,SAAS,gCAAgC,UAAU,MAAM;AAC/D,WAAO,OAAO,UAAU,OAAO,OAAO;AAAA,EACxC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAnBA,IAIM,kCACA;AALN;AAAA;AAAA;AAEA;AAEA,IAAM,mCAAmC;AACzC,IAAM,kCAAkCA,GAAE,OAAO;AAAA,MAC/C,aAAaA,GAAE,OAAO;AAAA,MACtB,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,MAC/B,WAAWA,GAAE,OAAO;AAAA,IACtB,CAAC;AAYD;AAAA,MACE;AAAA,MACAA,GAAE,OAAO;AAAA,QACP,aAAaA,GAAE,OAAO;AAAA,MACxB,CAAC;AAAA,MACD,OAAO,MAAM,KAAK,aAAa;AAC7B,YAAI,CAAC,UAAU;AACb,iBAAO,CAAC;AAAA,QACV;AAEA,YAAI,UAAU,eAAe,UAAU,KAAK,WAAW;AACvD,eAAO,CAAC;AAAA,MACV;AAAA,IACF;AAEA,oBAAgB,wBAAwBA,GAAE,OAAO,CAAC,CAAC,GAAG,OAAO,OAAO,KAAK,aAAa;AACpF,UAAI,CAAC,UAAU;AACb,eAAO,CAAC;AAAA,MACV;AAEA,UAAI,UAAU,iBAAiB,QAAQ;AACvC,aAAO,CAAC;AAAA,IACV,CAAC;AAED,oBAAgB,kCAAkCA,GAAE,OAAO,CAAC,CAAC,GAAG,OAAO,OAAO,QAAQ;AACpF,YAAM,MAAM,IAAI,GACb,QAAQ,+CAA+C,EACvD,IAAI,gCAAgC;AAEvC,UAAI,CAAC,KAAK;AACR,eAAO;AAAA,MACT;AAEA,aAAO,+BAA+B,IAAI,KAAK;AAAA,IACjD,CAAC;AAED;AAAA,MACE;AAAA,MACAA,GAAE,OAAO;AAAA,QACP,aAAaA,GAAE,OAAO;AAAA,QACtB,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA,MACjC,CAAC;AAAA,MACD,OAAO,MAAM,QAAQ;AACnB,cAAM,YAAY,IAAI,aAAa,IAAI,KAAK,WAAW;AACvD,YAAI,CAAC,WAAW;AACd,gBAAM;AAAA,YACJ,MAAM;AAAA,YACN,SAAS,wBAAwB,KAAK,WAAW;AAAA,UACnD;AAAA,QACF;AAEA,cAAM,UAAU,KAAK,YAAY,IAAI,WAAW,IAAI,KAAK,SAAS,IAAI;AAEtE,cAAM,aAAwC;AAAA,UAC5C,aAAa,KAAK;AAAA,UAClB,WAAW,WAAW,QAAQ,gBAAgB,KAAK,cAAc,QAAQ,KAAK;AAAA,UAC9E,WAAW,KAAK,IAAI;AAAA,QACtB;AAEA,YAAI,GACD;AAAA,UACC;AAAA;AAAA;AAAA;AAAA;AAAA,QAKF,EACC,IAAI,kCAAkC,KAAK,UAAU,UAAU,CAAC;AAEnE,eAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA;;;AC5FA,SAAS,KAAAC,UAAS;AAAlB,IAAAC,mBAAA;AAAA;AAAA;AACA;AAEA;AAAA,MACE;AAAA,MACAD,GAAE,OAAO,EAAE,kBAAkBA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;AAAA,MAChD,OAAO,MAAM,KAAK,aAAa;AAC7B,YAAI,CAAC,UAAU;AACb,gBAAM;AAAA,YACJ,MAAM;AAAA,YACN,SAAS;AAAA,UACX;AAAA,QACF;AAEA,cAAM,UAAU,IAAI,YAAY,qBAAqB,QAAQ;AAC7D,YAAI,CAAC,SAAS;AACZ,gBAAM;AAAA,YACJ,MAAM;AAAA,YACN,SAAS;AAAA,UACX;AAAA,QACF;AAEA,cAAM,QAAQ,IAAI,cAAc,MAAM,KAAK,kBAAkB,UAAU,OAAO;AAC9E,YAAI,MAAM,qBAAqB;AAC7B,cAAI,YAAY,uBAAuB,MAAM,qBAAqB,MAAM,UAAU;AAAA,QACpF;AAEA,eAAO;AAAA,MACT;AAAA,IACF;AAEA;AAAA,MACE;AAAA,MACAA,GAAE,OAAO,EAAE,kBAAkBA,GAAE,OAAO,GAAG,YAAYA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AAAA,MAClF,OAAO,MAAM,KAAK,aAAa;AAC7B,cAAM,QAAQ,IAAI,cAAc,SAAS;AACzC,YAAI,CAAC,YAAY,CAAC,SAAS,MAAM,eAAe,UAAU;AACxD,iBAAO,EAAE,IAAI,MAAM;AAAA,QACrB;AAEA,YAAI,cAAc,QAAQ,KAAK,kBAAkB,KAAK,UAAU;AAChE,eAAO,EAAE,IAAI,KAAK;AAAA,MACpB;AAAA,IACF;AAAA;AAAA;;;AC3CA,SAAS,KAAAE,UAAS;AAAlB;AAAA;AAAA;AACA;AAEA,oBAAgB,oBAAoBA,GAAE,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,GAAG,YAAY;AACxE,aAAO,EAAE,IAAI,KAAc;AAAA,IAC7B,CAAC;AAAA;AAAA;;;ACMD,SAAS,eACP,UACA,UACA,iBACA,sBACA,mBACS;AACT,QAAM,aAAa,SAAS,QAAQ,WAAW,QAAQ,KAAK,CAAC;AAC7D,QAAM,oBAAoB,IAAI,IAAI,eAAe;AACjD,QAAM,yBAAyB,IAAI,IAAI,oBAAoB;AAC3D,QAAM,oBAAoB,IAAI,IAAI,iBAAiB;AACnD,MAAI,aAAa;AAEjB,SAAO,YAAY;AACjB,iBAAa;AAEb,eAAW,YAAY,YAAY;AACjC,YAAM,cAAc,SAAS,iBAAiB;AAAA,QAAM,CAAC,YACnD,kBAAkB,IAAI,OAAO;AAAA,MAC/B;AAEA,UACE,SAAS,SAAS,kBAClB,uBAAuB,IAAI,SAAS,aAAa,KACjD,aACA;AACA,+BAAuB,OAAO,SAAS,aAAa;AACpD,0BAAkB,IAAI,SAAS,aAAa;AAC5C,qBAAa;AACb;AAAA,MACF;AAEA,UACE,SAAS,SAAS,cAClB,kBAAkB,IAAI,SAAS,aAAa,KAC5C,aACA;AACA,0BAAkB,OAAO,SAAS,aAAa;AAC/C,0BAAkB,IAAI,SAAS,aAAa;AAC5C,qBAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAEA,SAAO,kBAAkB,SAAS,KAAK,WAAW,SAAS;AAC7D;AAEA,eAAsB,2BACpB,WACA,OAA0B,CAAC,GACa;AACxC,QAAM,WAAW,KAAK,YAAY,QAAQ;AAC1C,QAAM,gBACJ,KAAK,kBAAkB,CAAC,YAAoB,sBAAsB,SAAS,IAAI;AACjF,QAAM,SAAwC,EAAE,WAAW,CAAC,EAAE;AAE9D,aAAW,YAAY,WAAW;AAChC,UAAM,aAAa,SAAS,QAAQ,WAAW,QAAQ,KAAK,CAAC;AAC7D,UAAM,6BAA6B,oBAAI,IAAY;AACnD,eAAW,YAAY,YAAY;AACjC,iBAAW,WAAW,SAAS,kBAAkB;AAC/C,mCAA2B,IAAI,OAAO;AAAA,MACxC;AAAA,IACF;AAEA,UAAM,kBAA4B,CAAC;AACnC,UAAM,oBAAoB,oBAAI,IAAY;AAC1C,eAAW,WAAW,SAAS,kBAAkB;AAC/C,UAAI,MAAM,cAAc,OAAO,GAAG;AAChC,0BAAkB,IAAI,OAAO;AAAA,MAC/B,OAAO;AACL,wBAAgB,KAAK,OAAO;AAAA,MAC9B;AAAA,IACF;AAEA,UAAM,uBAAiC,CAAC;AACxC,eAAW,WAAW,SAAS,QAAQ,eAAe;AACpD,UAAI,MAAM,cAAc,OAAO,GAAG;AAChC,0BAAkB,IAAI,OAAO;AAAA,MAC/B,OAAO;AACL,6BAAqB,KAAK,OAAO;AAAA,MACnC;AAAA,IACF;AAEA,eAAW,WAAW,4BAA4B;AAChD,UAAI,kBAAkB,IAAI,OAAO,GAAG;AAClC;AAAA,MACF;AAEA,UAAI,MAAM,cAAc,OAAO,GAAG;AAChC,0BAAkB,IAAI,OAAO;AAAA,MAC/B;AAAA,IACF;AAEA,UAAM,uBAAuB;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,YAAY,gBAAgB,WAAW;AAE7C,WAAO,UAAU,SAAS,EAAE,IAAI;AAAA,MAC9B,YAAY,SAAS;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,kBAAkB,YACd,UACA,uBACE,qBAAqB,WAAW,IAC9B,UACA,yBACF;AAAA,MACN,iBAAiB,SAAS,QAAQ;AAAA,MAClC,SAAS,SAAS,QAAQ;AAAA,IAC5B;AAAA,EACF;AAEA,SAAO;AACT;AArIA;AAAA;AAAA;AACA;AAAA;AAAA;;;ACIA,SAAS,KAAAC,WAAS;AAIlB,SAAS,wBACP,YACA,UACgC;AAChC,SAAO,SAAS,KAAK,CAAC,aAAa,SAAS,OAAO,UAAU;AAC/D;AAdA;AAAA;AAAA;AAMA;AACA;AAUA;AAAA,MACE;AAAA,MACAA,IAAE,OAAO;AAAA,QACP,aAAaA,IAAE,OAAO;AAAA,MACxB,CAAC;AAAA,MACD,OAAO,MAAM,QAAQ;AACnB,eAAO,IAAI,WAAW,gBAAgB,KAAK,WAAW;AAAA,MACxD;AAAA,IACF;AAGA;AAAA,MACE;AAAA,MACAA,IAAE,OAAO;AAAA,QACP,aAAaA,IAAE,OAAO;AAAA,QACtB,YAAYA,IAAE,OAAO;AAAA,QACrB,OAAOA,IAAE,OAAO,EAAE,SAAS;AAAA,MAC7B,CAAC;AAAA,MACD,OAAO,MAAM,QAAQ;AAEnB,cAAM,YAAY,IAAI,aAAa,IAAI,KAAK,WAAW;AACvD,YAAI,CAAC,WAAW;AACd,gBAAM,EAAE,MAAM,uBAAuB,SAAS,wBAAwB,KAAK,WAAW,GAAG;AAAA,QAC3F;AAEA,cAAM,WAAW,wBAAwB,KAAK,YAAY,IAAI,gBAAgB;AAC9E,YAAI,CAAC,UAAU;AACb,gBAAM,EAAE,MAAM,oBAAoB,SAAS,uBAAuB,KAAK,UAAU,GAAG;AAAA,QACtF;AAEA,cAAM,gBAAgB,MAAM,2BAA2B,CAAC,QAAQ,GAAG,IAAI,mBAAmB;AAC1F,cAAM,iBAAiB,cAAc,UAAU,SAAS,EAAE;AAE1D,YAAI,CAAC,gBAAgB,WAAW;AAC9B,gBAAM;AAAA,YACJ,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SAAS;AAAA,cACP,YAAY,SAAS;AAAA,cACrB,iBAAiB,gBAAgB,mBAAmB,SAAS;AAAA,YAC/D;AAAA,UACF;AAAA,QACF;AAEA,eAAO,IAAI,WAAW,OAAO;AAAA,UAC3B,aAAa,KAAK;AAAA,UAClB,eAAe,UAAU;AAAA,UACzB,YAAY,KAAK;AAAA,UACjB;AAAA,UACA,OAAO,KAAK;AAAA,QACd,CAAC;AAAA,MACH;AAAA,IACF;AAGA;AAAA,MACE;AAAA,MACAA,IAAE,OAAO;AAAA,QACP,WAAWA,IAAE,OAAO;AAAA,MACtB,CAAC;AAAA,MACD,OAAO,MAAM,QAAQ;AACnB,cAAM,IAAI,WAAW,KAAK,KAAK,SAAS;AAAA,MAC1C;AAAA,IACF;AAGA;AAAA,MACE;AAAA,MACAA,IAAE,OAAO;AAAA,QACP,WAAWA,IAAE,OAAO;AAAA,MACtB,CAAC;AAAA,MACD,OAAO,MAAM,QAAQ;AACnB,cAAM,UAAU,IAAI,WAAW,IAAI,KAAK,SAAS;AACjD,YAAI,CAAC,SAAS;AACZ,gBAAM,EAAE,MAAM,qBAAqB,SAAS,sBAAsB,KAAK,SAAS,GAAG;AAAA,QACrF;AAEA,YAAI,QAAQ,UAAU,SAAS;AAC7B,gBAAM,EAAE,MAAM,iBAAiB,SAAS,mCAAmC,QAAQ,KAAK,GAAG;AAAA,QAC7F;AAEA,YAAI,WAAW,OAAO,KAAK,SAAS;AAAA,MACtC;AAAA,IACF;AAAA;AAAA;;;AC9FA,SAAS,WAAAC,UAAS,QAAAC,aAAY;AAC9B,SAAS,QAAAC,OAAM,YAAAC,iBAAgB;AAiB/B,eAAsB,SAAS,UAAkB,QAA0C;AACzF,QAAM,aAAa,SAASD,MAAK,UAAU,MAAM,IAAI;AACrD,QAAM,SAAS,2BAA2B;AAE1C,QAAM,UAAU,MAAMF,SAAQ,YAAY,EAAE,eAAe,KAAK,CAAC;AACjE,QAAM,QAAoB,CAAC;AAE3B,aAAW,SAAS,SAAS;AAC3B,QAAI,CAAC,OAAO,MAAM,IAAI,GAAG;AACvB;AAAA,IACF;AAEA,UAAM,WAAWE,MAAK,YAAY,MAAM,IAAI;AAC5C,UAAM,UAAUC,UAAS,UAAU,QAAQ;AAE3C,QAAI,MAAM,YAAY,GAAG;AACvB,YAAM,KAAK;AAAA,QACT,MAAM,MAAM;AAAA,QACZ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,UAAU;AAAA;AAAA,MACZ,CAAC;AAAA,IACH,WAAW,MAAM,OAAO,GAAG;AACzB,YAAM,QAAQ,MAAMF,MAAK,QAAQ;AACjC,YAAM,KAAK;AAAA,QACT,MAAM,MAAM;AAAA,QACZ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM,MAAM;AAAA,QACZ,OAAO,MAAM;AAAA,MACf,CAAC;AAAA,IACH;AAAA,EACF;AAGA,QAAM,KAAK,CAAC,GAAG,MAAM;AACnB,QAAI,EAAE,SAAS,EAAE,MAAM;AACrB,aAAO,EAAE,SAAS,QAAQ,KAAK;AAAA,IACjC;AACA,WAAO,EAAE,KAAK,cAAc,EAAE,IAAI;AAAA,EACpC,CAAC;AAED,SAAO;AAAA,IACL,MAAM,UAAU;AAAA,IAChB,UAAU;AAAA,EACZ;AACF;AAMA,eAAsB,YACpB,UACA,OACA,QAAQ,IACoB;AAC5B,QAAM,kBAAkB,MAAM,KAAK,EAAE,YAAY;AACjD,MAAI,CAAC,iBAAiB;AACpB,WAAO,EAAE,OAAO,CAAC,EAAE;AAAA,EACrB;AAEA,QAAM,UAAiF,CAAC;AAExF,iBAAe,KAAK,SAAgC;AAClD,UAAM,SAAS,sBAAsB,UAAU,OAAO;AACtD,UAAM,UAAU,MAAMD,SAAQ,SAAS,EAAE,eAAe,KAAK,CAAC;AAE9D,UAAM,kBAAkB,QAAQ,OAAO,CAAC,UAAU,OAAO,MAAM,IAAI,CAAC;AACpE,oBAAgB,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAE3D,eAAW,SAAS,iBAAiB;AACnC,YAAM,WAAWE,MAAK,SAAS,MAAM,IAAI;AACzC,YAAM,UAAUC,UAAS,UAAU,QAAQ;AAE3C,UAAI,MAAM,YAAY,GAAG;AACvB,cAAM,KAAK,QAAQ;AACnB;AAAA,MACF;AAEA,UAAI,MAAM,OAAO,GAAG;AAClB,cAAM,OAAO,mBAAmB,MAAM,MAAM,eAAe;AAC3D,YAAI,SAAS,MAAM;AACjB;AAAA,QACF;AAEA,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,MAAM,MAAM;AAAA,UACZ;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,KAAK,QAAQ;AAEnB,QAAM,QAAoB,CAAC;AAC3B,aAAW,SAAS,QACjB,KAAK,CAAC,GAAG,MAAM;AACd,QAAI,EAAE,SAAS,EAAE,MAAM;AACrB,aAAO,EAAE,OAAO,EAAE;AAAA,IACpB;AAEA,UAAM,cAAc,EAAE,KAAK,YAAY,EAAE,cAAc,EAAE,KAAK,YAAY,CAAC;AAC3E,QAAI,gBAAgB,GAAG;AACrB,aAAO;AAAA,IACT;AAEA,UAAM,eAAe,EAAE,KAAK,MAAM,GAAG,EAAE,SAAS,EAAE,KAAK,MAAM,GAAG,EAAE;AAClE,QAAI,iBAAiB,GAAG;AACtB,aAAO;AAAA,IACT;AAEA,WAAO,EAAE,KAAK,YAAY,EAAE,cAAc,EAAE,KAAK,YAAY,CAAC;AAAA,EAChE,CAAC,EACA,MAAM,GAAG,KAAK,GAAG;AAClB,UAAM,QAAQ,MAAMF,MAAK,MAAM,QAAQ;AACvC,UAAM,KAAK;AAAA,MACT,MAAM,MAAM;AAAA,MACZ,MAAM,MAAM;AAAA,MACZ,MAAM;AAAA,MACN,MAAM,MAAM;AAAA,MACZ,OAAO,MAAM;AAAA,IACf,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,MAAM;AACjB;AAEA,SAAS,mBAAmB,MAAc,OAA8B;AACtE,QAAM,iBAAiB,KAAK,YAAY;AACxC,QAAM,WAAW,eAAe,QAAQ,YAAY,EAAE;AAEtD,MAAI,mBAAmB,OAAO;AAC5B,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,OAAO;AACtB,WAAO;AAAA,EACT;AAEA,MAAI,eAAe,WAAW,KAAK,GAAG;AACpC,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,WAAW,KAAK,GAAG;AAC9B,WAAO;AAAA,EACT;AAEA,MAAI,eAAe,SAAS,KAAK,GAAG;AAClC,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,SAAS,KAAK,GAAG;AAC5B,WAAO;AAAA,EACT;AAEA,MAAI,cAAc,OAAO,cAAc,GAAG;AACxC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,OAAe,WAA4B;AAChE,MAAI,QAAQ;AAEZ,aAAW,QAAQ,WAAW;AAC5B,QAAI,SAAS,MAAM,KAAK,GAAG;AACzB,eAAS;AACT,UAAI,UAAU,MAAM,QAAQ;AAC1B,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO,MAAM,WAAW;AAC1B;AA3MA;AAAA;AAAA;AAQA;AAAA;AAAA;;;ACJA,SAAS,KAAAG,WAAS;AAJlB;AAAA;AAAA;AAKA;AACA;AACA;AAGA;AAAA,MACE;AAAA,MACAA,IAAE,OAAO;AAAA,QACP,aAAaA,IAAE,OAAO;AAAA,QACtB,SAASA,IAAE,OAAO,EAAE,SAAS;AAAA,MAC/B,CAAC;AAAA,MACD,OAAO,MAAM,QAAQ;AACnB,cAAM,YAAY,IAAI,aAAa,IAAI,KAAK,WAAW;AACvD,YAAI,CAAC,WAAW;AACd,gBAAM,EAAE,MAAM,uBAAuB,SAAS,wBAAwB,KAAK,WAAW,GAAG;AAAA,QAC3F;AAEA,eAAO,SAAS,UAAU,MAAM,KAAK,OAAO;AAAA,MAC9C;AAAA,IACF;AAGA;AAAA,MACE;AAAA,MACAA,IAAE,OAAO;AAAA,QACP,aAAaA,IAAE,OAAO;AAAA,QACtB,OAAOA,IAAE,OAAO;AAAA,QAChB,OAAOA,IAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,SAAS;AAAA,MACtD,CAAC;AAAA,MACD,OAAO,MAAM,QAAQ;AACnB,cAAM,YAAY,IAAI,aAAa,IAAI,KAAK,WAAW;AACvD,YAAI,CAAC,WAAW;AACd,gBAAM,EAAE,MAAM,uBAAuB,SAAS,wBAAwB,KAAK,WAAW,GAAG;AAAA,QAC3F;AAEA,eAAO,YAAY,UAAU,MAAM,KAAK,OAAO,KAAK,SAAS,EAAE;AAAA,MACjE;AAAA,IACF;AAGA;AAAA,MACE;AAAA,MACAA,IAAE,OAAO;AAAA,QACP,aAAaA,IAAE,OAAO;AAAA,QACtB,MAAMA,IAAE,OAAO;AAAA,MACjB,CAAC;AAAA,MACD,OAAO,MAAM,QAAQ;AACnB,cAAM,YAAY,IAAI,aAAa,IAAI,KAAK,WAAW;AACvD,YAAI,CAAC,WAAW;AACd,gBAAM,EAAE,MAAM,uBAAuB,SAAS,wBAAwB,KAAK,WAAW,GAAG;AAAA,QAC3F;AAEA,eAAO,SAAS,KAAK,aAAa,UAAU,MAAM,KAAK,IAAI;AAAA,MAC7D;AAAA,IACF;AAGA;AAAA,MACE;AAAA,MACAA,IAAE,OAAO;AAAA,QACP,aAAaA,IAAE,OAAO;AAAA,QACtB,MAAMA,IAAE,OAAO;AAAA,MACjB,CAAC;AAAA,MACD,OAAO,MAAM,QAAQ;AACnB,cAAM,YAAY,IAAI,aAAa,IAAI,KAAK,WAAW;AACvD,YAAI,CAAC,WAAW;AACd,gBAAM,EAAE,MAAM,uBAAuB,SAAS,wBAAwB,KAAK,WAAW,GAAG;AAAA,QAC3F;AAEA,cAAM,WAAW,UAAU,MAAM,KAAK,IAAI;AAC1C,YAAI,SAAS,KAAK;AAAA,UAChB,MAAM;AAAA,UACN,aAAa,KAAK;AAAA,UAClB,QAAQ;AAAA,QACV,CAAC;AACD,eAAO,EAAE,IAAI,KAAK;AAAA,MACpB;AAAA,IACF;AAGA;AAAA,MACE;AAAA,MACAA,IAAE,OAAO;AAAA,QACP,aAAaA,IAAE,OAAO;AAAA,QACtB,MAAMA,IAAE,OAAO;AAAA,MACjB,CAAC;AAAA,MACD,OAAO,MAAM,QAAQ;AACnB,cAAM,YAAY,IAAI,aAAa,IAAI,KAAK,WAAW;AACvD,YAAI,CAAC,WAAW;AACd,gBAAM,EAAE,MAAM,uBAAuB,SAAS,wBAAwB,KAAK,WAAW,GAAG;AAAA,QAC3F;AAEA,cAAM,gBAAgB,UAAU,MAAM,KAAK,IAAI;AAC/C,YAAI,SAAS,KAAK;AAAA,UAChB,MAAM;AAAA,UACN,aAAa,KAAK;AAAA,UAClB,QAAQ;AAAA,QACV,CAAC;AACD,eAAO,EAAE,IAAI,KAAK;AAAA,MACpB;AAAA,IACF;AAGA;AAAA,MACE;AAAA,MACAA,IAAE,OAAO;AAAA,QACP,aAAaA,IAAE,OAAO;AAAA,QACtB,MAAMA,IAAE,OAAO;AAAA,MACjB,CAAC;AAAA,MACD,OAAO,MAAM,QAAQ;AACnB,cAAM,YAAY,IAAI,aAAa,IAAI,KAAK,WAAW;AACvD,YAAI,CAAC,WAAW;AACd,gBAAM,EAAE,MAAM,uBAAuB,SAAS,wBAAwB,KAAK,WAAW,GAAG;AAAA,QAC3F;AAEA,cAAM,YAAY,UAAU,MAAM,KAAK,IAAI;AAC3C,YAAI,SAAS,KAAK;AAAA,UAChB,MAAM;AAAA,UACN,aAAa,KAAK;AAAA,UAClB,QAAQ;AAAA,QACV,CAAC;AACD,eAAO,EAAE,IAAI,KAAK;AAAA,MACpB;AAAA,IACF;AAGA;AAAA,MACE;AAAA,MACAA,IAAE,OAAO;AAAA,QACP,aAAaA,IAAE,OAAO;AAAA,QACtB,MAAMA,IAAE,OAAO;AAAA,QACf,SAASA,IAAE,OAAO;AAAA,QAClB,UAAUA,IAAE,OAAO,EAAE,SAAS;AAAA;AAAA,MAChC,CAAC;AAAA,MACD,OAAO,MAAM,QAAQ;AACnB,cAAM,YAAY,IAAI,aAAa,IAAI,KAAK,WAAW;AACvD,YAAI,CAAC,WAAW;AACd,gBAAM,EAAE,MAAM,uBAAuB,SAAS,wBAAwB,KAAK,WAAW,GAAG;AAAA,QAC3F;AAEA,cAAM,SAAS,MAAM,UAAU,UAAU,MAAM,KAAK,MAAM,KAAK,SAAS,KAAK,QAAQ;AACrF,YAAI,SAAS,KAAK;AAAA,UAChB,MAAM;AAAA,UACN,aAAa,KAAK;AAAA,UAClB,QAAQ;AAAA,QACV,CAAC;AACD,eAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA;;;ACzJA,IAOa;AAPb;AAAA;AAAA;AAOO,IAAM,qBAAqB,CAAC,WAAW,WAAW;AAAA;AAAA;;;ACOlD,SAAS,YAAY,aAAgC;AAC1D,MAAI,SAAS;AACb,MAAI,QAAQ;AACZ,MAAI,SAAS;AACb,MAAI;AACJ,QAAM,SAA0B,CAAC;AACjC,QAAM,WAA4B,CAAC;AACnC,QAAM,YAA6B,CAAC;AACpC,QAAM,UAA2B,CAAC;AAClC,QAAM,UAAU,YAAY,SAAS,IAAI,IACrC,YAAY,MAAM,IAAI,EAAE,OAAO,CAAC,WAAW,OAAO,SAAS,CAAC,IAC5D,YAAY,MAAM,IAAI,EAAE,OAAO,CAAC,WAAW,OAAO,SAAS,CAAC;AAEhE,WAAS,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AACtD,UAAM,SAAS,QAAQ,KAAK;AAC5B,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AAEA,QAAI,OAAO,WAAW,eAAe,GAAG;AACtC,YAAM,MAAM,OAAO,UAAU,gBAAgB,MAAM;AACnD,UAAI,OAAO,QAAQ,aAAa;AAC9B,kBAAU;AAAA,MACZ;AACA;AAAA,IACF;AAEA,QAAI,OAAO,WAAW,gBAAgB,GAAG;AACvC,eAAS,OAAO,UAAU,iBAAiB,MAAM;AACjD;AAAA,IACF;AAEA,QAAI,OAAO,WAAW,cAAc,GAAG;AACrC,YAAM,QAAQ,OAAO,MAAM,6BAA6B;AACxD,YAAM,YAAY,QAAQ,CAAC;AAC3B,YAAM,aAAa,QAAQ,CAAC;AAC5B,UAAI,aAAa,YAAY;AAC3B,gBAAQ,SAAS,WAAW,EAAE;AAC9B,iBAAS,SAAS,YAAY,EAAE;AAAA,MAClC;AACA;AAAA,IACF;AAEA,QAAI,OAAO,WAAW,IAAI,GAAG;AAC3B,gCAA0B,QAAQ,QAAQ,UAAU,OAAO;AAC3D;AAAA,IACF;AAEA,QAAI,OAAO,WAAW,IAAI,GAAG;AAC3B,YAAM,UAAU,QAAQ,QAAQ,CAAC;AACjC,wBAAkB,QAAQ,SAAS,QAAQ,UAAU,OAAO;AAC5D,UAAI,SAAS;AACX,iBAAS;AAAA,MACX;AACA;AAAA,IACF;AAEA,QAAI,OAAO,WAAW,IAAI,GAAG;AAC3B,gBAAU,KAAK,EAAE,MAAM,OAAO,UAAU,CAAC,GAAG,QAAQ,YAAY,CAAC;AAAA,IACnE;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,SAAS,MAAM,GAAG,CAAC;AAAA,IACjC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAKA,SAAS,0BACP,QACA,QACA,UACA,SACM;AACN,QAAM,QAAQ,OAAO,MAAM,GAAG;AAC9B,QAAM,KAAK,MAAM,CAAC;AAClB,MAAI,CAAC,IAAI;AACP;AAAA,EACF;AAEA,QAAMC,SAAO,MAAM,MAAM,CAAC,EAAE,KAAK,GAAG;AACpC,MAAI,CAACA,QAAM;AACT;AAAA,EACF;AAEA,aAAW,EAAE,MAAAA,OAAK,GAAG,IAAI,QAAQ,UAAU,OAAO;AACpD;AAMA,SAAS,kBACP,QACA,eACA,QACA,UACA,SACM;AACN,QAAM,QAAQ,OAAO,MAAM,GAAG;AAC9B,QAAM,KAAK,MAAM,CAAC;AAClB,MAAI,CAAC,IAAI;AACP;AAAA,EACF;AAEA,QAAM,aAAa,MAAM,MAAM,CAAC;AAChC,QAAM,sBAAsB,WAAW,KAAK,GAAG;AAC/C,QAAM,kBAAkB,oBAAoB,MAAM,GAAI;AACtD,QAAM,eACJ,CAAC,iBAAiB,gBAAgB,WAAW,KAAK,WAAW,SAAS,IAClE,WAAW,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG,IAChC;AACN,QAAMA,SAAO,gBAAgB,gBAAgB,CAAC;AAC9C,MAAI,CAACA,QAAM;AACT;AAAA,EACF;AAEA,QAAM,WACH,iBAAiB,CAAC,cAAc,WAAW,GAAG,IAAI,gBAAgB,WACnE,gBAAgB,CAAC,MAChB,WAAW,SAAS,IAAI,WAAW,WAAW,SAAS,CAAC,IAAI;AAC/D,aAAW,EAAE,MAAAA,QAAM,QAAQ,GAAG,IAAI,QAAQ,UAAU,OAAO;AAC7D;AAEA,SAAS,WACP,QACA,IACA,QACA,UACA,SACM;AACN,QAAM,cAAc,GAAG,CAAC;AACxB,QAAM,iBAAiB,GAAG,CAAC;AAE3B,MAAI,eAAe,gBAAgB,OAAO,gBAAgB,KAAK;AAC7D,WAAO,KAAK;AAAA,MACV,GAAG;AAAA,MACH,QAAQ,uBAAuB,aAAa,OAAO,OAAO;AAAA,IAC5D,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,kBAAkB,mBAAmB,OAAO,mBAAmB,KAAK;AACvE;AAAA,EACF;AAEA,MAAI,mBAAmB,KAAK;AAC1B,YAAQ,KAAK,EAAE,MAAM,OAAO,MAAM,QAAQ,UAAU,CAAC;AACrD;AAAA,EACF;AAEA,WAAS,KAAK;AAAA,IACZ,MAAM,OAAO;AAAA,IACb,SAAS,OAAO;AAAA,IAChB,QAAQ,uBAAuB,gBAAgB,OAAO,OAAO;AAAA,EAC/D,CAAC;AACH;AAEA,SAAS,uBAAuB,MAAc,SAAmC;AAC/E,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,UAAU,YAAY;AAAA,IAC/B,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL;AACE,aAAO,UAAU,YAAY;AAAA,EACjC;AACF;AAtMA;AAAA;AAAA;AAAA;AAAA;;;ACKA,SAAS,gBAAgB;AACzB,SAAS,SAAAC,QAAO,WAAAC,UAAS,MAAAC,KAAI,aAAAC,kBAAiB;AAC9C,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAyDjB,eAAsB,OACpB,KACA,MACA,UAAyB,CAAC,GACC;AAC3B,SAAO,IAAI,QAAQ,CAACC,UAAS,WAAW;AACtC,UAAM,UAAU;AAAA,MACd,GAAI,QAAQ,QAAQ,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC,KAAK,CAAC;AAAA,MAC7E,GAAG;AAAA,IACL;AAEA,UAAM,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,QACE;AAAA,QACA,KAAK;AAAA,UACH,GAAG,QAAQ;AAAA,UACX,qBAAqB;AAAA;AAAA;AAAA,UAGrB,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,GAAG,QAAQ;AAAA,QACb;AAAA,QACA,WAAW,KAAK,OAAO;AAAA,QACvB,SAAS,QAAQ;AAAA,QACjB,aAAa;AAAA,MACf;AAAA,MACA,CAAC,KAAK,QAAQ,WAAW;AACvB,YAAI,KAAK;AACP,iBAAO,IAAI,SAAS,IAAI,SAAS,MAAM,CAAC;AAAA,QAC1C,OAAO;AACL,UAAAA,SAAQ,EAAE,QAAQ,OAAO,CAAC;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAEA,QAAI,QAAQ,UAAU,UAAa,MAAM,OAAO;AAC9C,YAAM,MAAM,GAAG,SAAS,MAAM;AAAA,MAAC,CAAC;AAChC,YAAM,MAAM,IAAI,QAAQ,KAAK;AAAA,IAC/B;AAAA,EACF,CAAC;AACH;AAsDA,eAAsB,aAAa,KAAiC;AAClE,QAAM,EAAE,QAAQ,aAAa,IAAI,MAAM,OAAO,KAAK;AAAA,IACjD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,SAAS,YAAY,YAAY;AAEvC,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,QAAQ,kBAAkB,IAAI,MAAM,OAAO,KAAK,CAAC,QAAQ,MAAM,eAAe,MAAM,CAAC;AAC7F,SAAO;AAAA,IACL,GAAG;AAAA,IACH,aAAa,kBAAkB,KAAK;AAAA,EACtC;AACF;AAKA,eAAsB,cAAc,KAAa,QAAQ,GAAgC;AACvF,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM,OAAO,KAAK;AAAA,MACnC;AAAA,MACA,eAAe,KAAK,IAAI,GAAG,KAAK,CAAC;AAAA,MACjC;AAAA,IACF,CAAC;AAED,WAAO,OACJ,MAAM,GAAM,EACZ,IAAI,CAAC,WAAW,OAAO,KAAK,CAAC,EAC7B,OAAO,CAAC,WAAW,OAAO,SAAS,CAAC,EACpC,IAAI,CAAC,WAAW;AACf,YAAM,CAAC,MAAM,IAAI,WAAW,IAAI,UAAU,IAAI,aAAa,IAAI,aAAa,GAAG,IAC7E,OAAO,MAAM,GAAM;AACrB,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY,OAAO,SAAS,YAAY,EAAE,IAAI;AAAA,MAChD;AAAA,IACF,CAAC,EACA,OAAO,CAAC,UAAU,MAAM,OAAO,MAAM,OAAO;AAAA,EACjD,SAAS,OAAO;AACd,QAAI,iBAAiB,YAAY,iCAAiC,KAAK,MAAM,MAAM,GAAG;AACpF,aAAO,CAAC;AAAA,IACV;AAEA,UAAM;AAAA,EACR;AACF;AAKA,eAAsB,iBAAiB,KAAa,KAA8B;AAChF,QAAM,EAAE,OAAO,IAAI,MAAM,OAAO,KAAK;AAAA,IACnC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,SAAO;AACT;AAqBA,eAAsB,WAAW,KAAa,OAAgC;AAC5E,MAAI,MAAM,WAAW,EAAG;AACxB,QAAM,OAAO,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;AACrC;AAKA,eAAsB,aAAa,KAAa,OAAgC;AAC9E,MAAI,MAAM,WAAW,EAAG;AACxB,QAAM,OAAO,KAAK,CAAC,SAAS,QAAQ,MAAM,GAAG,KAAK,CAAC;AACrD;AAKA,eAAsB,eAAe,KAAa,OAAgC;AAChF,MAAI,MAAM,WAAW,EAAG;AAExB,QAAM,eAAyB,CAAC;AAChC,QAAM,iBAA2B,CAAC;AAElC,aAAWD,UAAQ,OAAO;AACxB,QAAI;AACF,YAAM,OAAO,KAAK,CAAC,YAAY,mBAAmB,MAAMA,MAAI,CAAC;AAC7D,mBAAa,KAAKA,MAAI;AAAA,IACxB,QAAQ;AACN,qBAAe,KAAKA,MAAI;AAAA,IAC1B;AAAA,EACF;AAEA,MAAI,aAAa,SAAS,GAAG;AAC3B,UAAM,OAAO,KAAK,CAAC,WAAW,YAAY,cAAc,MAAM,GAAG,YAAY,CAAC;AAAA,EAChF;AAEA,MAAI,eAAe,SAAS,GAAG;AAC7B,UAAM,OAAO,KAAK,CAAC,SAAS,OAAO,MAAM,GAAG,cAAc,CAAC;AAAA,EAC7D;AACF;AAKA,eAAsB,cAAc,KAAa,SAA2C;AAC1F,QAAM,EAAE,OAAO,IAAI,MAAM,OAAO,KAAK,CAAC,UAAU,MAAM,OAAO,CAAC;AAG9D,QAAM,QAAQ,OAAO,MAAM,oBAAoB;AAC/C,QAAM,MAAM,QAAQ,CAAC,KAAK;AAE1B,SAAO,EAAE,IAAI;AACf;AAKA,eAAsB,WACpB,KACA,SAM+B;AAC/B,QAAM,OAAO,CAAC,MAAM;AACpB,MAAI,SAAS,SAAS;AACtB,MAAI,SAAS,SAAS;AAEtB,MAAI,SAAS,OAAO;AAClB,SAAK,KAAK,SAAS;AAAA,EACrB;AAEA,MAAI,CAAC,UAAU,CAAC,QAAQ;AACtB,UAAM,aAAa,MAAM,0BAA0B,KAAK,MAAM;AAC9D,aAAS,UAAU,YAAY;AAC/B,aAAS,UAAU,YAAY;AAAA,EACjC;AAEA,MAAI,CAAC,UAAU,CAAC,QAAQ;AACtB,UAAM,iBAAiB,MAAM,0BAA0B,KAAK,UAAU;AACtE,aAAS,UAAU,gBAAgB;AACnC,aAAS,UAAU,gBAAgB;AAAA,EACrC;AAEA,MAAI,CAAC,UAAU,QAAQ;AACrB,aAAU,MAAM,mBAAmB,GAAG,KAAM;AAAA,EAC9C;AAEA,MAAI,CAAC,QAAQ;AACX,aAAU,MAAM,mBAAmB,GAAG,KAAM;AAAA,EAC9C;AAEA,QAAM,gBAAgB,UAAW,MAAM,qBAAqB,GAAG;AAE/D,MAAI,UAAU,QAAQ;AACpB,SAAK,KAAK,QAAQ,QAAQ,MAAM,EAAE;AAAA,EACpC,WAAW,QAAQ;AACjB,SAAK,KAAK,kBAAkB,QAAQ,MAAM;AAAA,EAC5C;AACA,QAAM,YAAY,SAAS,MAAM,aAAa,KAAK,MAAM,IAAI;AAC7D,QAAM,iBAAiB,uBAAuB,aAAa,MAAS;AACpE,QAAM,gBAAgB,MAAM,wBAAwB,SAAS,MAAM,cAAc;AAEjF,MAAI;AACF,UAAM,EAAE,QAAQ,OAAO,IAAI,MAAM,OAAO,KAAK,MAAM;AAAA,MACjD,WAAW;AAAA,MACX,KAAK,cAAc;AAAA,MACnB,QAAQ,cAAc;AAAA,IACxB,CAAC;AAED,QAAI,SAAS,MAAM;AACjB,YAAM,0BAA0B,KAAK,QAAQ,MAAM,cAAc;AAAA,IACnE;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS;AAAA,MACT;AAAA,MACA,QAAQ;AAAA,MACR,SAAS,CAAC,eAAe,QAAQ,MAAM;AAAA,IACzC;AAAA,EACF,SAAS,OAAO;AACd,UAAM,wBAAwB,OAAO;AAAA,MACnC,WAAW;AAAA,MACX;AAAA,MACA,WAAW,eAAe,gBAAgB,aAAa;AAAA,MACvD,yBAAyB,QAAQ,SAAS,IAAI;AAAA,IAChD,CAAC;AAAA,EACH,UAAE;AACA,UAAM,cAAc,QAAQ;AAAA,EAC9B;AACF;AAKA,eAAsB,WACpB,KACA,SAK6D;AAC7D,QAAM,OAAO,CAAC,MAAM;AACpB,MAAI,SAAS,SAAS;AACtB,MAAI,SAAS,SAAS;AAEtB,MAAI,CAAC,UAAU,CAAC,QAAQ;AACtB,UAAM,iBAAiB,MAAM,0BAA0B,KAAK,UAAU;AACtE,aAAS,UAAU,gBAAgB;AACnC,aAAS,UAAU,gBAAgB;AAAA,EACrC;AAEA,MAAI,CAAC,UAAU,QAAQ;AACrB,aAAU,MAAM,mBAAmB,GAAG,KAAM;AAAA,EAC9C;AAEA,QAAM,gBAAgB,UAAW,MAAM,qBAAqB,GAAG;AAE/D,MAAI,UAAU,QAAQ;AACpB,SAAK,KAAK,QAAQ,MAAM;AAAA,EAC1B;AACA,QAAM,YAAY,SAAS,MAAM,aAAa,KAAK,MAAM,IAAI;AAC7D,QAAM,iBAAiB,uBAAuB,aAAa,MAAS;AACpE,QAAM,gBAAgB,MAAM,wBAAwB,SAAS,MAAM,cAAc;AAEjF,MAAI;AACF,UAAM,EAAE,QAAQ,OAAO,IAAI,MAAM,OAAO,KAAK,MAAM;AAAA,MACjD,WAAW;AAAA,MACX,KAAK,cAAc;AAAA,MACnB,QAAQ,cAAc;AAAA,IACxB,CAAC;AAED,QAAI,SAAS,MAAM;AACjB,YAAM,0BAA0B,KAAK,QAAQ,MAAM,cAAc;AAAA,IACnE;AAGA,UAAM,eAAyB,CAAC;AAChC,UAAM,cAAc,OAAO;AAAA,MACzB;AAAA,IACF;AACA,eAAW,SAAS,aAAa;AAC/B,YAAM,eAAe,MAAM,CAAC,KAAK;AACjC,YAAM,YAAY,aAAa,MAAM,IAAI,EAAE,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC;AACvE,iBAAW,QAAQ,WAAW;AAC5B,cAAM,YAAY,KAAK,MAAM,iBAAiB;AAC9C,YAAI,aAAa,UAAU,CAAC,GAAG;AAC7B,uBAAa,KAAK,UAAU,CAAC,CAAC;AAAA,QAChC;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS;AAAA,MACT;AAAA,MACA,QAAQ;AAAA,MACR,SAAS,CAAC,eAAe,QAAQ,MAAM;AAAA,MACvC;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,UAAM,wBAAwB,OAAO;AAAA,MACnC,WAAW;AAAA,MACX;AAAA,MACA,WAAW,eAAe,gBAAgB,aAAa;AAAA,MACvD,yBAAyB,QAAQ,SAAS,IAAI;AAAA,IAChD,CAAC;AAAA,EACH,UAAE;AACA,UAAM,cAAc,QAAQ;AAAA,EAC9B;AACF;AAYA,eAAsB,YACpB,KACA,SACuE;AACvE,QAAM,OAAO,CAAC,OAAO;AACrB,QAAM,SAAS,SAAS;AACxB,QAAM,iBAAiB,UAAW,MAAM,mBAAmB,GAAG,KAAM;AACpE,QAAM,QAAQ,SAAS,SAAS;AAEhC,MAAI,QAAQ;AACV,SAAK,KAAK,MAAM;AAAA,EAClB,OAAO;AACL,SAAK,KAAK,OAAO;AAAA,EACnB;AAEA,MAAI,OAAO;AACT,SAAK,KAAK,SAAS;AAAA,EACrB;AAEA,QAAM,YAAY,iBAAiB,MAAM,aAAa,KAAK,cAAc,IAAI;AAC7E,QAAM,iBAAiB,uBAAuB,aAAa,MAAS;AACpE,QAAM,gBAAgB,MAAM,wBAAwB,SAAS,MAAM,cAAc;AAEjF,MAAI;AACF,UAAM,EAAE,QAAQ,OAAO,IAAI,MAAM,OAAO,KAAK,MAAM;AAAA,MACjD,WAAW,SAAS,aAAa;AAAA,MACjC,KAAK,cAAc;AAAA,MACnB,QAAQ,cAAc;AAAA,IACxB,CAAC;AAED,QAAI,SAAS,MAAM;AACjB,YAAM,0BAA0B,KAAK,QAAQ,MAAM,cAAc;AAAA,IACnE;AAEA,UAAM,UAAU,UAAU,UAAU;AACpC,WAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA,aAAa,sBAAsB,MAAM;AAAA,IAC3C;AAAA,EACF,SAAS,OAAO;AACd,UAAM,wBAAwB,OAAO;AAAA,MACnC,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,WAAW,eAAe,gBAAgB,aAAa;AAAA,MACvD,yBAAyB,QAAQ,SAAS,IAAI;AAAA,IAChD,CAAC;AAAA,EACH,UAAE;AACA,UAAM,cAAc,QAAQ;AAAA,EAC9B;AACF;AAEA,SAAS,sBAAsB,QAA0B;AACvD,QAAM,OAAiB,CAAC;AACxB,aAAW,WAAW,OAAO,MAAM,IAAI,GAAG;AACxC,UAAM,OAAO,QAAQ,QAAQ;AAC7B,UAAM,aAAa,KAAK,QAAQ,MAAM;AACtC,QAAI,aAAa,EAAG;AACpB,UAAM,SAAS,KAAK,MAAM,aAAa,CAAC,EAAE,KAAK;AAC/C,QAAI,CAAC,OAAQ;AACb,SAAK,KAAK,MAAM;AAAA,EAClB;AACA,SAAO;AACT;AAKA,eAAsB,eACpB,KACA,KACA,SAGiE;AACjE,QAAM,OAAO,CAAC,UAAU;AACxB,QAAM,sBAAsB,CAAC,OAAgB,oBAC3C,iBAAiB,WACb,MAAM,OAAO,KAAK,KAAK,MAAM,WAAW,kBACxC;AAGN,MAAI,cAAc;AAClB,MAAI;AACF,UAAM,EAAE,QAAQ,WAAW,IAAI,MAAM,OAAO,KAAK,CAAC,QAAQ,CAAC;AAC3D,UAAM,UAAU,WAAW,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO;AAE5D,kBAAc,QAAQ,KAAK,CAAC,WAAW,IAAI,WAAW,GAAG,MAAM,GAAG,CAAC;AAAA,EACrE,QAAQ;AAEN,kBAAc,mBAAmB,KAAK,CAAC,WAAW,IAAI,WAAW,MAAM,CAAC;AAAA,EAC1E;AAGA,MAAI,eAAe,CAAC,SAAS,cAAc;AACzC,UAAM,uBAAuB,IAAI,QAAQ,GAAG;AAC5C,UAAM,aAAa,wBAAwB,IAAI,IAAI,MAAM,uBAAuB,CAAC,IAAI;AAErF,QAAI;AACF,YAAM,OAAO,KAAK,CAAC,YAAY,YAAY,WAAW,cAAc,UAAU,EAAE,CAAC;AACjF,YAAM,EAAE,QAAQ,OAAO,IAAI,MAAM,OAAO,KAAK,CAAC,YAAY,UAAU,CAAC;AACrE,YAAM,UAAU,UAAU,UAAU,eAAe,UAAU;AAC7D,aAAO,EAAE,SAAS,MAAM,SAAS,QAAQ,WAAW;AAAA,IACtD,QAAQ;AACN,WAAK,KAAK,MAAM,YAAY,GAAG;AAAA,IACjC;AAEA,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,IAAI,MAAM,OAAO,KAAK,IAAI;AACjD,YAAM,UAAU,UAAU,UAAU,eAAe,GAAG;AAGtD,aAAO,EAAE,SAAS,MAAM,SAAS,QAAQ,WAAW;AAAA,IACtD,SAAS,OAAO;AACd,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,oBAAoB,OAAO,qCAAqC,GAAG,GAAG;AAAA,MACjF;AAAA,IACF;AAAA,EACF,OAAO;AAEL,QAAI,SAAS,cAAc;AACzB,WAAK,KAAK,IAAI;AAAA,IAChB;AACA,SAAK,KAAK,GAAG;AAEb,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,IAAI,MAAM,OAAO,KAAK,IAAI;AAGjD,YAAM,cAAc,OAAO,MAAM,+CAA+C;AAChF,YAAM,SAAS,cAAc,CAAC,KAAK;AAEnC,YAAM,UAAU,UAAU,UAAU,eAAe,GAAG;AAEtD,aAAO,EAAE,SAAS,MAAM,SAAS,OAAO;AAAA,IAC1C,SAAS,OAAO;AACd,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,oBAAoB,OAAO,uBAAuB,GAAG,GAAG;AAAA,MACnE;AAAA,IACF;AAAA,EACF;AACF;AAKA,eAAsB,mBACpB,KACA,YACA,SAGgE;AAChE,QAAM,OAAO,CAAC,UAAU,UAAU;AAElC,MAAI,SAAS,YAAY;AACvB,SAAK,KAAK,QAAQ,UAAU;AAAA,EAC9B;AAEA,QAAM,OAAO,KAAK,IAAI;AAEtB,SAAO,EAAE,SAAS,MAAM,SAAS,WAAW,UAAU,aAAa,QAAQ,WAAW;AACxF;AAWA,eAAsB,mBAAmB,KAGtC;AAED,QAAM,EAAE,QAAQ,YAAY,IAAI,MAAM,OAAO,KAAK,CAAC,UAAU,QAAQ,CAAC;AACtE,QAAM,EAAE,QAAQ,mBAAmB,IAAI,MAAM,OAAO,KAAK,CAAC,UAAU,UAAU,KAAK,CAAC;AAGpF,QAAM,EAAE,QAAQ,aAAa,IAAI,MAAM,OAAO,KAAK,CAAC,UAAU,IAAI,CAAC;AAEnE,QAAM,WAAwB,CAAC;AAC/B,MAAI,UAAU;AACd,QAAM,8BAA8B,oBAAI,IAAoB;AAE5D,QAAM,oBAAoB,mBAAmB,MAAM,IAAI,EAAE,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC;AACrF,aAAW,QAAQ,mBAAmB;AACpC,UAAM,iBAAiB,KAAK,QAAQ,aAAa,EAAE;AACnD,UAAM,cAAc,eAAe,MAAM,cAAc;AACvD,UAAM,gBAAgB,KAAK,MAAM,aAAa;AAC9C,QAAI,CAAC,cAAc,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG;AAC5C;AAAA,IACF;AAEA,UAAM,eAAe,cAAc,CAAC;AACpC,QAAI,aAAa,WAAW,GAAG,KAAK,aAAa,WAAW,GAAG,GAAG;AAChE,kCAA4B,IAAI,YAAY,CAAC,GAAG,YAAY;AAAA,IAC9D;AAAA,EACF;AAGA,QAAM,aAAa,YAAY,MAAM,IAAI,EAAE,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC;AACvE,aAAW,QAAQ,YAAY;AAC7B,UAAM,YAAY,KAAK,WAAW,GAAG;AACrC,UAAM,OAAO,KAAK,QAAQ,aAAa,EAAE,EAAE,KAAK;AAGhD,QAAI,KAAK,WAAW,gBAAgB,GAAG;AACrC,UAAI,WAAW;AACb,kBAAU;AAAA,MACZ;AACA;AAAA,IACF;AAEA,QAAI,4BAA4B,IAAI,IAAI,KAAK,CAAC,WAAW;AACvD;AAAA,IACF;AAEA,aAAS,KAAK;AAAA,MACZ;AAAA,MACA,UAAU;AAAA,MACV;AAAA,MACA,oBAAoB,4BAA4B,IAAI,IAAI;AAAA,IAC1D,CAAC;AACD,QAAI,WAAW;AACb,gBAAU;AAAA,IACZ;AAAA,EACF;AAGA,QAAM,cAAc,aAAa,MAAM,IAAI,EAAE,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC;AACzE,aAAW,QAAQ,aAAa;AAC9B,UAAM,WAAW,KAAK,KAAK;AAC3B,QAAI,SAAS,SAAS,MAAM,GAAG;AAC7B;AAAA,IACF;AAEA,UAAM,CAAC,MAAM,IAAI,SAAS,MAAM,GAAG;AACnC,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA;AAAA,MACN,UAAU;AAAA,MACV,WAAW;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,UAAU,QAAQ;AAC7B;AAEA,eAAe,0BACb,KACA,MACuC;AACvC,QAAM,cAAc,SAAS,SAAS,YAAY;AAElD,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM,OAAO,KAAK;AAAA,MACnC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,UAAM,UAAU,OAAO,KAAK;AAC5B,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AAEA,UAAM,uBAAuB,QAAQ,QAAQ,GAAG;AAChD,QAAI,wBAAwB,KAAK,yBAAyB,QAAQ,SAAS,GAAG;AAC5E,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,QAAQ,QAAQ,MAAM,GAAG,oBAAoB;AAAA,MAC7C,QAAQ,QAAQ,MAAM,uBAAuB,CAAC;AAAA,IAChD;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,qBAAqB,KAA0C;AAC5E,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM,OAAO,KAAK,CAAC,UAAU,gBAAgB,CAAC;AACjE,UAAM,SAAS,OAAO,KAAK;AAC3B,WAAO,UAAU;AAAA,EACnB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,eAAe,QAAgB,QAAyB;AAC/D,SAAO,yBAAyB,KAAK,GAAG,MAAM;AAAA,EAAK,MAAM,EAAE;AAC7D;AAEA,SAAS,eAAe,QAAgB,QAAyB;AAC/D,SAAO,+BAA+B,KAAK,GAAG,MAAM;AAAA,EAAK,MAAM,EAAE;AACnE;AAEA,eAAe,mBAAmB,KAAqC;AACrE,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM,OAAO,KAAK,CAAC,QAAQ,CAAC;AAC/C,UAAM,UAAU,OACb,MAAM,IAAI,EACV,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO;AAEjB,QAAI,QAAQ,WAAW,GAAG;AACxB,aAAO;AAAA,IACT;AAEA,WAAO,QAAQ,SAAS,QAAQ,IAAI,WAAY,QAAQ,CAAC,KAAK;AAAA,EAChE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,aAAa,KAAa,QAAwC;AAC/E,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM,OAAO,KAAK,CAAC,UAAU,WAAW,MAAM,CAAC;AAClE,UAAM,QAAQ,OAAO,KAAK;AAC1B,WAAO,SAAS;AAAA,EAClB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,wBACb,MACA,gBACmC;AACnC,MAAI,CAAC,QAAQ,CAAC,eAAe,aAAa,CAAC,eAAe,MAAM;AAC9D,WAAO;AAAA,MACL,SAAS,YAAY;AAAA,MAAC;AAAA,IACxB;AAAA,EACF;AAEA,QAAM,UAAU,MAAMJ,SAAQI,MAAK,KAAKD,IAAG,OAAO,GAAG,wBAAwB,CAAC;AAC9E,QAAM,WAAWC,MAAK,KAAK,SAAS,OAAO;AAC3C,QAAM,cAAcA,MAAK,KAAK,SAAS,YAAY;AAEnD,QAAML,OAAM,UAAU,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AACtD,QAAMG;AAAA,IACJ;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,IACX,EAAE,MAAM,IAAM;AAAA,EAChB;AAEA,SAAO;AAAA,IACL,KAAK;AAAA,MACH,aAAa;AAAA,MACb,aAAa;AAAA,MACb,iBAAiB;AAAA,MACjB,gCAAgC,KAAK;AAAA,MACrC,gCAAgC,KAAK;AAAA,IACvC;AAAA,IACA,QAAQ;AAAA,MACN,CAAC,kBAAkB,QAAQ;AAAA,MAC3B,CAAC,qBAAqB,EAAE;AAAA,MACxB,CAAC,uBAAuB,KAAK,QAAQ;AAAA,IACvC;AAAA,IACA,SAAS,YAAY;AACnB,YAAMD,IAAG,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IACpD;AAAA,EACF;AACF;AAEA,eAAe,0BACb,KACA,MACA,gBACe;AACf,MAAI,CAAC,eAAe,aAAa,CAAC,eAAe,QAAQ,CAAC,eAAe,MAAM;AAC7E;AAAA,EACF;AAEA,MAAI,mBAAmB;AACvB,MAAI;AACF,QAAI,eAAe,cAAc;AAC/B,YAAM,EAAE,OAAO,IAAI,MAAM;AAAA,QACvB;AAAA,QACA,CAAC,UAAU,kBAAkB,qBAAqB,eAAe,YAAY;AAAA,QAC7E;AAAA,UACE,WAAW;AAAA,QACb;AAAA,MACF;AACA,yBAAmB,OAChB,MAAM,IAAI,EACV,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,KAAK,OAAO;AAAA,IACjB,OAAO;AACL,YAAM,EAAE,OAAO,IAAI,MAAM;AAAA,QACvB;AAAA,QACA,CAAC,UAAU,gBAAgB,+BAA+B;AAAA,QAC1D;AAAA,UACE,WAAW;AAAA,QACb;AAAA,MACF;AACA,yBAAmB,OAChB,MAAM,IAAI,EACV,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,KAAK,OAAO;AAAA,IACjB;AAAA,EACF,QAAQ;AACN,uBAAmB;AAAA,EACrB;AAEA,MAAI,CAAC,kBAAkB;AACrB;AAAA,EACF;AAEA,MAAI,cAAc;AAClB,MAAI;AACF,UAAM,aAAa,eAAe,eAC9B,CAAC,UAAU,kBAAkB,0BAA0B,eAAe,YAAY,IAClF,CAAC,UAAU,SAAS,wBAAwB;AAChD,UAAM,EAAE,OAAO,IAAI,MAAM,OAAO,KAAK,YAAY;AAAA,MAC/C,WAAW;AAAA,IACb,CAAC;AACD,kBAAc,iBAAiB,MAAM;AAAA,EACvC,QAAQ;AACN,kBAAc;AAAA,EAChB;AAEA,QAAM,kBAAkB;AAAA,IACtB,YAAY,eAAe,YAAY,OAAO;AAAA,IAC9C,QAAQ,eAAe,IAAI;AAAA,IAC3B,GAAI,cAAc,CAAC,QAAQ,eAAe,IAAI,EAAE,IAAI,CAAC;AAAA,IACrD,YAAY,KAAK,QAAQ;AAAA,IACzB,YAAY,KAAK,QAAQ;AAAA,IACzB;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAEX,MAAI;AACF,UAAM,OAAO,KAAK,CAAC,cAAc,SAAS,GAAG;AAAA,MAC3C,OAAO;AAAA,MACP,WAAW;AAAA,IACb,CAAC;AAAA,EACH,QAAQ;AAAA,EAER;AACF;AAEA,SAAS,wBAAwB,OAAgB,SAAkC;AACjF,MAAI,EAAE,iBAAiB,WAAW;AAChC,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,uBAAuB,OAAO,OAAO;AACrD,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,QAAQ,YAAY,sBAAsB;AACvD,SAAO,IAAI,aAAa,4BAA4B,OAAO,GAAG,MAAM,OAAO;AAC7E;AAEO,SAAS,uBACd,OACA,SAC8B;AAC9B,QAAMK,UAAS,GAAG,MAAM,OAAO;AAAA,EAAK,MAAM,MAAM,GAAG,YAAY;AAC/D,QAAM,iBAAiB,eAAe,QAAQ,QAAQ,QAAQ,SAAS;AACvE,QAAM,eAAe;AAAA,IACnB;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;AAEA,MAAI,CAAC,aAAa,KAAK,CAAC,YAAYA,QAAO,SAAS,OAAO,CAAC,GAAG;AAC7D,WAAO;AAAA,EACT;AAEA,QAAM,0BAA0B,QAAQ,2BAA2B;AACnE,QAAM,SACJA,QAAO,SAAS,mCAAmC,KACnDA,QAAO,SAAS,wCAAwC,IACpD,yBACAA,QAAO,SAAS,2BAA2B,KACzCA,QAAO,SAAS,yBAAyB,KACzCA,QAAO,SAAS,yBAAyB,IACzC,wBACA,2BAA2BA,QAAO,SAAS,eAAe,IACxD,wBACA;AAEV,SAAO;AAAA,IACL,WAAW,QAAQ;AAAA,IACnB,QAAQ,QAAQ;AAAA,IAChB,WAAW,eAAe;AAAA,IAC1B,aAAa,eAAe;AAAA,IAC5B,MAAM,eAAe;AAAA,IACrB;AAAA,IACA,UAAU,eAAe,YAAY,sBAAsB;AAAA,IAC3D,WAAW,eAAe;AAAA,IAC1B,cAAc,eAAe;AAAA,EAC/B;AACF;AAEA,SAAS,4BAA4B,SAAwC;AAC3E,MAAI,CAAC,QAAQ,WAAW;AACtB,WAAO,6BAA6B,QAAQ,WAAW;AAAA,EACzD;AAEA,MAAI,QAAQ,WAAW,wBAAwB;AAC7C,WAAO,mBAAmB,QAAQ,WAAW,sDAAsD,QAAQ,SAAS;AAAA,EACtH;AAEA,MAAI,QAAQ,WAAW,uBAAuB;AAC5C,WAAO,mBAAmB,QAAQ,WAAW;AAAA,EAC/C;AAEA,SAAO,iCAAiC,QAAQ,SAAS,IAAI,QAAQ,WAAW;AAClF;AAEA,SAAS,eAAe,QAA4B,WAA+B;AACjF,QAAM,WAAW,uBAAuB,SAAS;AACjD,QAAM,cAAc,SAAS,OACzB,GAAG,UAAU,QAAQ,KAAK,SAAS,IAAI,MACtC,UAAU;AAEf,SAAO;AAAA,IACL,WAAW,SAAS,gBAAgB;AAAA,IACpC;AAAA,IACA,MAAM,SAAS;AAAA,IACf,WAAW,SAAS;AAAA,IACpB,cAAc;AAAA,EAChB;AACF;AAEA,SAAS,uBAAuB,WAAkD;AAChF,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,MACL,WAAW;AAAA,IACb;AAAA,EACF;AAEA,MAAI;AACF,UAAM,SAAS,IAAI,IAAI,SAAS;AAChC,UAAM,WAAW,OAAO,SAAS,QAAQ,QAAQ,EAAE;AACnD,UAAM,YAAY,IAAI,IAAI,SAAS;AACnC,cAAU,WAAW;AACrB,cAAU,WAAW;AACrB,WAAO;AAAA,MACL,UAAU,OAAO,SAAS,QAAQ,MAAM,EAAE;AAAA,MAC1C,MAAM,OAAO,QAAQ;AAAA,MACrB,MAAM,YAAY;AAAA,MAClB,cAAc,UAAU,SAAS;AAAA,MACjC,WAAW,OAAO,aAAa,WAAW,OAAO,aAAa;AAAA,IAChE;AAAA,EACF,QAAQ;AACN,UAAM,WAAW,UAAU,MAAM,oCAAoC;AACrE,QAAI,UAAU,QAAQ,MAAM;AAC1B,aAAO;AAAA,QACL,UAAU;AAAA,QACV,MAAM,SAAS,OAAO;AAAA,QACtB,MAAM,UAAU,MAAM,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK;AAAA,QACjD,cAAc;AAAA,QACd,WAAW;AAAA,MACb;AAAA,IACF;AAEA,WAAO;AAAA,MACL,cAAc;AAAA,MACd,WAAW;AAAA,IACb;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,OAAwB;AAChD,SAAO,CAAC,QAAQ,OAAO,MAAM,GAAG,EAAE,SAAS,MAAM,KAAK,EAAE,YAAY,CAAC;AACvE;AAnjCA,IAwDM,wBAyDO,UAcA;AA/Hb;AAAA;AAAA;AASA;AACA;AA8CA,IAAM,yBAAyB,IAAI,KAAK;AAyDjC,IAAM,WAAN,cAAuB,MAAM;AAAA,MAClC,YACE,SACgB,QAChB;AACA,cAAM,OAAO;AAFG;AAGhB,aAAK,OAAO;AAAA,MACd;AAAA,MAJkB;AAAA,IAKpB;AAMO,IAAM,eAAN,cAA2B,MAAM;AAAA,MACtC,YACE,SACgB,MACA,SAChB;AACA,cAAM,OAAO;AAHG;AACA;AAGhB,aAAK,OAAO;AAAA,MACd;AAAA,MALkB;AAAA,MACA;AAAA,IAKpB;AAAA;AAAA;;;ACpIA,SAAS,WAAAC,UAAS,MAAAC,WAAU;AAC5B,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAGjB,eAAe,cAAc,KAAa,UAAoC;AAC5E,MAAI;AACF,UAAM,OAAO,KAAK,CAAC,YAAY,mBAAmB,MAAM,QAAQ,CAAC;AACjE,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,qBAAqB,KAAa,UAAmC;AAClF,QAAM,UAAU,MAAMH,SAAQG,MAAK,KAAKD,IAAG,OAAO,GAAG,wBAAwB,CAAC;AAC9E,QAAM,YAAYC,MAAK,KAAK,SAAS,OAAO;AAE5C,MAAI;AACF,QAAI;AACF,YAAM,OAAO,KAAK,CAAC,aAAa,MAAM,GAAG;AAAA,QACvC,KAAK,EAAE,gBAAgB,UAAU;AAAA,MACnC,CAAC;AAAA,IACH,SAAS,OAAO;AACd,UAAI,EAAE,iBAAiB,WAAW;AAChC,cAAM;AAAA,MACR;AAIA,YAAM,OAAO,KAAK,CAAC,aAAa,SAAS,GAAG;AAAA,QAC1C,KAAK,EAAE,gBAAgB,UAAU;AAAA,MACnC,CAAC;AAAA,IACH;AAEA,UAAM,OAAO,KAAK,CAAC,OAAO,MAAM,MAAM,QAAQ,GAAG;AAAA,MAC/C,KAAK,EAAE,gBAAgB,UAAU;AAAA,IACnC,CAAC;AAED,UAAM,SAAS,MAAM,OAAO,KAAK,CAAC,QAAQ,MAAM,QAAQ,GAAG;AAAA,MACzD,KAAK,EAAE,gBAAgB,UAAU;AAAA,IACnC,CAAC;AACD,WAAO,OAAO;AAAA,EAChB,UAAE;AACA,UAAMF,IAAG,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EACpD;AACF;AAUA,eAAsB,YAAY,KAAaE,QAAc,SAAS,OAAwB;AAC5F,MAAI,CAAC,UAAU,CAAE,MAAM,cAAc,KAAKA,MAAI,GAAI;AAChD,WAAO,qBAAqB,KAAKA,MAAI;AAAA,EACvC;AAEA,QAAM,OAAO,SAAS,CAAC,QAAQ,YAAY,MAAMA,MAAI,IAAI,CAAC,QAAQ,MAAMA,MAAI;AAC5E,QAAM,SAAS,MAAM,OAAO,KAAK,IAAI;AACrC,SAAO,OAAO;AAChB;AApEA;AAAA;AAAA;AAOA;AAAA;AAAA;;;ACLO,SAAS,oBACd,KACA,aACA,SAKA;AACA,MAAI,SAAS,KAAK;AAAA,IAChB,MAAM;AAAA,IACN;AAAA,IACA,aAAa,SAAS;AAAA,IACtB,eAAe,SAAS;AAAA,IACxB,iBAAiB,SAAS;AAAA,EAC5B,CAAC;AACH;AAlBA;AAAA;AAAA;AAAA;AAAA;;;ACIA,SAAS,KAAAC,WAAS;AAgClB,eAAe,uBACb,KACA,aACA,IACY;AACZ,MAAI,CAAC,IAAI,WAAW,cAAc;AAChC,WAAO,GAAG;AAAA,EACZ;AAEA,SAAO,IAAI,UAAU,aAAa,aAAa,EAAE;AACnD;AA9CA,IA0BM,mBAIA,yBAIA;AAlCN,IAAAC,YAAA;AAAA;AAAA;AAKA;AAgBA;AAEA;AACA;AAEA,IAAM,oBAAoBD,IAAE,OAAO;AAAA,MACjC,UAAUA,IAAE,OAAO;AAAA,MACnB,UAAUA,IAAE,OAAO;AAAA,IACrB,CAAC;AACD,IAAM,0BAA0BA,IAC7B,OAAO,EACP,MAAM,uBAAuB,6BAA6B;AAE7D,IAAM,kCAAkC,KAAK;AAe7C;AAAA,MACE;AAAA,MACAA,IAAE,OAAO;AAAA,QACP,aAAaA,IAAE,OAAO;AAAA,MACxB,CAAC;AAAA,MACD,OAAO,MAAM,QAAQ;AACnB,cAAM,YAAY,IAAI,aAAa,IAAI,KAAK,WAAW;AACvD,YAAI,CAAC,WAAW;AACd,gBAAM,EAAE,MAAM,uBAAuB,SAAS,wBAAwB,KAAK,WAAW,GAAG;AAAA,QAC3F;AAEA,eAAO,aAAa,UAAU,IAAI;AAAA,MACpC;AAAA,IACF;AAGA;AAAA,MACE;AAAA,MACAA,IAAE,OAAO;AAAA,QACP,aAAaA,IAAE,OAAO;AAAA,QACtB,OAAOA,IAAE,MAAMA,IAAE,OAAO,CAAC;AAAA,MAC3B,CAAC;AAAA,MACD,OAAO,MAAM,QAAQ;AACnB,cAAM,YAAY,IAAI,aAAa,IAAI,KAAK,WAAW;AACvD,YAAI,CAAC,WAAW;AACd,gBAAM,EAAE,MAAM,uBAAuB,SAAS,wBAAwB,KAAK,WAAW,GAAG;AAAA,QAC3F;AAEA,cAAM,WAAW,UAAU,MAAM,KAAK,KAAK;AAC3C,4BAAoB,KAAK,KAAK,WAAW;AACzC,eAAO,CAAC;AAAA,MACV;AAAA,IACF;AAGA;AAAA,MACE;AAAA,MACAA,IAAE,OAAO;AAAA,QACP,aAAaA,IAAE,OAAO;AAAA,QACtB,MAAMA,IAAE,OAAO;AAAA,QACf,QAAQA,IAAE,QAAQ,EAAE,SAAS;AAAA,MAC/B,CAAC;AAAA,MACD,OAAO,MAAM,QAAQ;AACnB,cAAM,YAAY,IAAI,aAAa,IAAI,KAAK,WAAW;AACvD,YAAI,CAAC,WAAW;AACd,gBAAM,EAAE,MAAM,uBAAuB,SAAS,wBAAwB,KAAK,WAAW,GAAG;AAAA,QAC3F;AAEA,eAAO;AAAA,UACL,MAAM,MAAM,YAAY,UAAU,MAAM,KAAK,MAAM,KAAK,UAAU,KAAK;AAAA,QACzE;AAAA,MACF;AAAA,IACF;AAGA;AAAA,MACE;AAAA,MACAA,IAAE,OAAO;AAAA,QACP,aAAaA,IAAE,OAAO;AAAA,QACtB,OAAOA,IAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS;AAAA,MAClD,CAAC;AAAA,MACD,OAAO,MAAM,QAAQ;AACnB,cAAM,YAAY,IAAI,aAAa,IAAI,KAAK,WAAW;AACvD,YAAI,CAAC,WAAW;AACd,gBAAM,EAAE,MAAM,uBAAuB,SAAS,wBAAwB,KAAK,WAAW,GAAG;AAAA,QAC3F;AAEA,eAAO;AAAA,UACL,SAAS,MAAM,cAAc,UAAU,MAAM,KAAK,SAAS,CAAC;AAAA,QAC9D;AAAA,MACF;AAAA,IACF;AAGA;AAAA,MACE;AAAA,MACAA,IAAE,OAAO;AAAA,QACP,aAAaA,IAAE,OAAO;AAAA,QACtB,KAAK;AAAA,MACP,CAAC;AAAA,MACD,OAAO,MAAM,QAAQ;AACnB,cAAM,YAAY,IAAI,aAAa,IAAI,KAAK,WAAW;AACvD,YAAI,CAAC,WAAW;AACd,gBAAM,EAAE,MAAM,uBAAuB,SAAS,wBAAwB,KAAK,WAAW,GAAG;AAAA,QAC3F;AAEA,eAAO;AAAA,UACL,MAAM,MAAM,iBAAiB,UAAU,MAAM,KAAK,GAAG;AAAA,QACvD;AAAA,MACF;AAAA,IACF;AAGA;AAAA,MACE;AAAA,MACAA,IAAE,OAAO;AAAA,QACP,aAAaA,IAAE,OAAO;AAAA,QACtB,OAAOA,IAAE,MAAMA,IAAE,OAAO,CAAC;AAAA,MAC3B,CAAC;AAAA,MACD,OAAO,MAAM,QAAQ;AACnB,cAAM,YAAY,IAAI,aAAa,IAAI,KAAK,WAAW;AACvD,YAAI,CAAC,WAAW;AACd,gBAAM,EAAE,MAAM,uBAAuB,SAAS,wBAAwB,KAAK,WAAW,GAAG;AAAA,QAC3F;AAEA,cAAM,aAAa,UAAU,MAAM,KAAK,KAAK;AAC7C,4BAAoB,KAAK,KAAK,WAAW;AACzC,eAAO,CAAC;AAAA,MACV;AAAA,IACF;AAGA;AAAA,MACE;AAAA,MACAA,IAAE,OAAO;AAAA,QACP,aAAaA,IAAE,OAAO;AAAA,QACtB,OAAOA,IAAE,MAAMA,IAAE,OAAO,CAAC;AAAA,MAC3B,CAAC;AAAA,MACD,OAAO,MAAM,QAAQ;AACnB,cAAM,YAAY,IAAI,aAAa,IAAI,KAAK,WAAW;AACvD,YAAI,CAAC,WAAW;AACd,gBAAM,EAAE,MAAM,uBAAuB,SAAS,wBAAwB,KAAK,WAAW,GAAG;AAAA,QAC3F;AAEA,cAAM,eAAe,UAAU,MAAM,KAAK,KAAK;AAC/C,4BAAoB,KAAK,KAAK,aAAa;AAAA,UACzC,aAAa;AAAA,QACf,CAAC;AACD,eAAO,CAAC;AAAA,MACV;AAAA,IACF;AAGA;AAAA,MACE;AAAA,MACAA,IAAE,OAAO;AAAA,QACP,aAAaA,IAAE,OAAO;AAAA,QACtB,SAASA,IAAE,OAAO;AAAA,MACpB,CAAC;AAAA,MACD,OAAO,MAAM,QAAQ;AACnB,cAAM,YAAY,IAAI,aAAa,IAAI,KAAK,WAAW;AACvD,YAAI,CAAC,WAAW;AACd,gBAAM,EAAE,MAAM,uBAAuB,SAAS,wBAAwB,KAAK,WAAW,GAAG;AAAA,QAC3F;AAEA,cAAM,SAAS,MAAM,cAAc,UAAU,MAAM,KAAK,OAAO;AAC/D,4BAAoB,KAAK,KAAK,aAAa;AAAA,UACzC,eAAe;AAAA,UACf,iBAAiB;AAAA,QACnB,CAAC;AACD,eAAO;AAAA,MACT;AAAA,IACF;AAGA;AAAA,MACE;AAAA,MACAA,IAAE,OAAO;AAAA,QACP,aAAaA,IAAE,OAAO;AAAA,QACtB,QAAQA,IAAE,OAAO,EAAE,SAAS;AAAA,QAC5B,QAAQA,IAAE,OAAO,EAAE,SAAS;AAAA,QAC5B,OAAOA,IAAE,QAAQ,EAAE,SAAS;AAAA,QAC5B,MAAM,kBAAkB,SAAS;AAAA,MACnC,CAAC;AAAA,MACD,OAAO,MAAM,QAAQ;AACnB,cAAM,YAAY,IAAI,aAAa,IAAI,KAAK,WAAW;AACvD,YAAI,CAAC,WAAW;AACd,gBAAM,EAAE,MAAM,uBAAuB,SAAS,wBAAwB,KAAK,WAAW,GAAG;AAAA,QAC3F;AAEA,cAAM,SAAS,MAAM;AAAA,UAAuB;AAAA,UAAK,KAAK;AAAA,UAAa,MACjE,WAAW,UAAU,MAAM;AAAA,YACzB,QAAQ,KAAK;AAAA,YACb,QAAQ,KAAK;AAAA,YACb,OAAO,KAAK;AAAA,YACZ,MAAM,KAAK;AAAA,UACb,CAAC;AAAA,QACH;AACA,4BAAoB,KAAK,KAAK,aAAa;AAAA,UACzC,eAAe;AAAA,UACf,iBAAiB;AAAA,QACnB,CAAC;AACD,eAAO;AAAA,MACT;AAAA,IACF;AAGA;AAAA,MACE;AAAA,MACAA,IAAE,OAAO;AAAA,QACP,aAAaA,IAAE,OAAO;AAAA,QACtB,QAAQA,IAAE,OAAO,EAAE,SAAS;AAAA,QAC5B,QAAQA,IAAE,OAAO,EAAE,SAAS;AAAA,QAC5B,MAAM,kBAAkB,SAAS;AAAA,MACnC,CAAC;AAAA,MACD,OAAO,MAAM,QAAQ;AACnB,cAAM,YAAY,IAAI,aAAa,IAAI,KAAK,WAAW;AACvD,YAAI,CAAC,WAAW;AACd,gBAAM,EAAE,MAAM,uBAAuB,SAAS,wBAAwB,KAAK,WAAW,GAAG;AAAA,QAC3F;AAEA,cAAM,SAAS,MAAM;AAAA,UAAuB;AAAA,UAAK,KAAK;AAAA,UAAa,MACjE,WAAW,UAAU,MAAM;AAAA,YACzB,QAAQ,KAAK;AAAA,YACb,QAAQ,KAAK;AAAA,YACb,MAAM,KAAK;AAAA,UACb,CAAC;AAAA,QACH;AACA,YAAI,aAAa,YAAY,KAAK,WAAW;AAC7C,4BAAoB,KAAK,KAAK,aAAa;AAAA,UACzC,aAAa;AAAA,UACb,eAAe;AAAA,UACf,iBAAiB;AAAA,QACnB,CAAC;AACD,eAAO;AAAA,MACT;AAAA,IACF;AAGA;AAAA,MACE;AAAA,MACAA,IAAE,OAAO;AAAA,QACP,aAAaA,IAAE,OAAO;AAAA,QACtB,QAAQA,IAAE,OAAO,EAAE,SAAS;AAAA,QAC5B,OAAOA,IAAE,QAAQ,EAAE,SAAS;AAAA,QAC5B,MAAM,kBAAkB,SAAS;AAAA,QACjC,YAAYA,IAAE,QAAQ,EAAE,SAAS;AAAA,MACnC,CAAC;AAAA,MACD,OAAO,MAAM,KAAK,aAAa;AAC7B,cAAM,YAAY,IAAI,aAAa,IAAI,KAAK,WAAW;AACvD,YAAI,CAAC,WAAW;AACd,gBAAM,EAAE,MAAM,uBAAuB,SAAS,wBAAwB,KAAK,WAAW,GAAG;AAAA,QAC3F;AAEA,YAAI;AAIF,gBAAM,4BAA4B,KAAK,eAAe,QAAQ,CAAC;AAC/D,gBAAM,WAAW,MACf,YAAY,UAAU,MAAM;AAAA,YAC1B,QAAQ,KAAK;AAAA,YACb,OAAO,KAAK;AAAA,YACZ,MAAM,KAAK;AAAA,YACX,WAAW,KAAK,aAAa,kCAAkC;AAAA,UACjE,CAAC;AACH,gBAAM,SAAS,4BACX,MAAM,SAAS,IACf,MAAM,uBAAuB,KAAK,KAAK,aAAa,QAAQ;AAChE,cAAI,aAAa,YAAY,KAAK,WAAW;AAC7C,8BAAoB,KAAK,KAAK,aAAa,EAAE,eAAe,KAAK,CAAC;AAClE,iBAAO;AAAA,QACT,SAAS,KAAK;AACZ,cAAI,KAAK,cAAc,eAAe,cAAc;AAClD,mBAAO,EAAE,SAAS,OAAO,SAAS,IAAI,SAAS,aAAa,CAAC,EAAE;AAAA,UACjE;AACA,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAGA;AAAA,MACE;AAAA,MACAA,IAAE,OAAO;AAAA,QACP,aAAaA,IAAE,OAAO;AAAA,QACtB,KAAKA,IAAE,OAAO;AAAA,QACd,cAAcA,IAAE,QAAQ,EAAE,SAAS;AAAA,MACrC,CAAC;AAAA,MACD,OAAO,MAAM,QAAQ;AACnB,cAAM,YAAY,IAAI,aAAa,IAAI,KAAK,WAAW;AACvD,YAAI,CAAC,WAAW;AACd,gBAAM,EAAE,MAAM,uBAAuB,SAAS,wBAAwB,KAAK,WAAW,GAAG;AAAA,QAC3F;AAEA,cAAM,SAAS,MAAM,eAAe,UAAU,MAAM,KAAK,KAAK;AAAA,UAC5D,cAAc,KAAK;AAAA,QACrB,CAAC;AACD,YAAI,OAAO,SAAS;AAClB,8BAAoB,KAAK,KAAK,aAAa;AAAA,YACzC,aAAa;AAAA,YACb,eAAe;AAAA,YACf,iBAAiB;AAAA,UACnB,CAAC;AAAA,QACH;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAGA;AAAA,MACE;AAAA,MACAA,IAAE,OAAO;AAAA,QACP,aAAaA,IAAE,OAAO;AAAA,QACtB,MAAMA,IAAE,OAAO;AAAA,QACf,YAAYA,IAAE,OAAO,EAAE,SAAS;AAAA,MAClC,CAAC;AAAA,MACD,OAAO,MAAM,QAAQ;AACnB,cAAM,YAAY,IAAI,aAAa,IAAI,KAAK,WAAW;AACvD,YAAI,CAAC,WAAW;AACd,gBAAM,EAAE,MAAM,uBAAuB,SAAS,wBAAwB,KAAK,WAAW,GAAG;AAAA,QAC3F;AAEA,cAAM,SAAS,MAAM,mBAAmB,UAAU,MAAM,KAAK,MAAM;AAAA,UACjE,YAAY,KAAK;AAAA,QACnB,CAAC;AACD,4BAAoB,KAAK,KAAK,aAAa;AAAA,UACzC,eAAe;AAAA,UACf,iBAAiB;AAAA,QACnB,CAAC;AACD,eAAO;AAAA,MACT;AAAA,IACF;AAGA;AAAA,MACE;AAAA,MACAA,IAAE,OAAO;AAAA,QACP,aAAaA,IAAE,OAAO;AAAA,MACxB,CAAC;AAAA,MACD,OAAO,MAAM,QAAQ;AACnB,cAAM,YAAY,IAAI,aAAa,IAAI,KAAK,WAAW;AACvD,YAAI,CAAC,WAAW;AACd,gBAAM,EAAE,MAAM,uBAAuB,SAAS,wBAAwB,KAAK,WAAW,GAAG;AAAA,QAC3F;AAEA,eAAO,mBAAmB,UAAU,IAAI;AAAA,MAC1C;AAAA,IACF;AAAA;AAAA;;;AChXA,SAAS,cAAAE,aAAY,aAAAC,YAAW,gBAAAC,eAAc,YAAY,iBAAAC,sBAAqB;AAC/E,SAAS,WAAAC,gBAAe;AACxB,SAAS,YAAAC,WAAU,WAAAC,UAAS,QAAAC,aAAY;AAkCjC,SAAS,kBAAkB,YAAgC;AAChE,MAAI,eAAe,SAAS;AAC1B,UAAM,WAAW,QAAQ,IAAI;AAC7B,QAAI,YAAY,SAAS,KAAK,GAAG;AAC/B,aAAOA,MAAK,UAAU,aAAa;AAAA,IACrC;AACA,UAAM,YAAY,QAAQ,IAAI;AAC9B,QAAI,aAAa,UAAU,KAAK,GAAG;AACjC,aAAOA,MAAK,WAAW,aAAa;AAAA,IACtC;AACA,WAAOA,MAAKH,SAAQ,GAAG,UAAU,aAAa;AAAA,EAChD;AAEA,MAAI,eAAe,UAAU;AAC3B,UAAM,WAAW,QAAQ,IAAI;AAC7B,QAAI,YAAY,SAAS,KAAK,GAAG;AAC/B,aAAOG,MAAK,UAAU,eAAe;AAAA,IACvC;AACA,WAAOA,MAAKH,SAAQ,GAAG,WAAW,eAAe;AAAA,EACnD;AAEA,QAAM,IAAI,MAAM,wBAAwB,UAAU,EAAE;AACtD;AAQO,SAAS,eAAe,YAA0C;AACvE,QAAM,aAAa,kBAAkB,UAAU;AAE/C,MAAI,CAACJ,YAAW,UAAU,GAAG;AAC3B,WAAO,EAAE,YAAY,SAAS,IAAI,QAAQ,MAAM;AAAA,EAClD;AAEA,MAAI;AACF,UAAM,UAAUE,cAAa,YAAY,OAAO;AAChD,WAAO,EAAE,YAAY,SAAS,QAAQ,KAAK;AAAA,EAC7C,QAAQ;AACN,WAAO,EAAE,YAAY,SAAS,IAAI,QAAQ,MAAM;AAAA,EAClD;AACF;AASO,SAAS,gBAAgB,YAAwB,SAAoC;AAC1F,MAAI;AACF,UAAM,aAAa,kBAAkB,UAAU;AAG/C,UAAM,YAAYI,SAAQ,UAAU;AACpC,QAAI,CAACN,YAAW,SAAS,GAAG;AAC1B,MAAAC,WAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,IAC1C;AAGA,QAAI,aAA4B;AAChC,QAAID,YAAW,UAAU,GAAG;AAC1B,mBAAa,aAAa,UAAU;AAAA,IACtC;AAGA,UAAM,WAAW,GAAG,UAAU;AAC9B,IAAAG,eAAc,UAAU,SAAS,OAAO;AACxC,eAAW,UAAU,UAAU;AAE/B,WAAO,EAAE,SAAS,MAAM,WAAW;AAAA,EACrC,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAC9D;AAAA,EACF;AACF;AAOA,SAAS,aAAa,UAA0B;AAC9C,QAAM,WAAWD,cAAa,UAAU,OAAO;AAE/C,QAAM,MAAM,SAAS,MAAM,GAAG,EAAE,IAAI,KAAK;AACzC,QAAM,OAAOG,UAAS,UAAU,IAAI,GAAG,EAAE;AACzC,QAAM,MAAMC,SAAQ,QAAQ;AAE5B,QAAM,KAAK,gBAAgB,oBAAI,KAAK,CAAC;AACrC,QAAM,aAAaC,MAAK,KAAK,GAAG,IAAI,QAAQ,EAAE,IAAI,GAAG,EAAE;AAEvD,EAAAJ,eAAc,YAAY,UAAU,OAAO;AAC3C,SAAO;AACT;AAOA,SAAS,gBAAgB,GAAiB;AACxC,QAAM,MAAM,CAAC,MAAc,OAAO,CAAC,EAAE,SAAS,GAAG,GAAG;AACpD,SACE,GAAG,EAAE,YAAY,CAAC,GAAG,IAAI,EAAE,SAAS,IAAI,CAAC,CAAC,GAAG,IAAI,EAAE,QAAQ,CAAC,CAAC,IACzD,IAAI,EAAE,SAAS,CAAC,CAAC,GAAG,IAAI,EAAE,WAAW,CAAC,CAAC,GAAG,IAAI,EAAE,WAAW,CAAC,CAAC;AAErE;AA9JA;AAAA;AAAA;AAAA;AAAA;;;ACgBA,SAAS,KAAAK,WAAS;AAoNlB,SAAS,gBAAgB,KAA8B,SAAS,IAA6B;AAC3F,QAAM,SAAkC,CAAC;AAEzC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,UAAM,UAAU,SAAS,GAAG,MAAM,IAAI,GAAG,KAAK;AAE9C,QAAI,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,GAAG;AAC/D,aAAO,OAAO,QAAQ,gBAAgB,OAAkC,OAAO,CAAC;AAAA,IAClF,WAAW,UAAU,QAAW;AAC9B,aAAO,OAAO,IAAI;AAAA,IACpB;AAAA,EACF;AAEA,SAAO;AACT;AAlPA,IAqCM;AArCN,IAAAC,iBAAA;AAAA;AAAA;AAIA,IAAAC;AAaA;AACA;AAOA;AACA;AAQA;AAGA,IAAM,iBAAiBF,IAAE,OAAO;AAAA,MAC9B,mBAAmBA,IAAE,OAAO,EAAE,SAAS;AAAA,MACvC,eAAeA,IACZ,OAAO;AAAA,QACN,SAASA,IAAE,QAAQ,EAAE,SAAS;AAAA,QAC9B,cAAcA,IAAE,QAAQ,EAAE,SAAS;AAAA;AAAA;AAAA;AAAA,QAInC,sBAAsBA,IAAE,QAAQ,EAAE,SAAS;AAAA,MAC7C,CAAC,EACA,SAAS;AAAA,MACZ,YAAYA,IACT,OAAO;AAAA,QACN,sBAAsBA,IACnB,OAAO,EACP,IAAI,EACJ,IAAI,CAAC,EACL,IAAI,qCAAqC,EACzC,QAAQ,yCAAyC,EACjD,SAAS;AAAA,QACZ,cAAcA,IAAE,QAAQ,EAAE,SAAS;AAAA,QACnC,eAAeA,IAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,8BAA8B,EAAE,SAAS;AAAA,QACpF,eAAeA,IAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,8BAA8B,EAAE,SAAS;AAAA,QACpF,gBAAgBA,IAAE,QAAQ,EAAE,SAAS;AAAA,QACrC,uBAAuBA,IAAE,QAAQ,EAAE,SAAS;AAAA,MAC9C,CAAC,EACA,SAAS;AAAA,MACZ,YAAYA,IACT,OAAO;AAAA,QACN,OAAOA,IAAE,KAAK,CAAC,QAAQ,OAAO,CAAC,EAAE,SAAS;AAAA,QAC1C,SAASA,IAAE,OAAO,EAAE,SAAS;AAAA,QAC7B,kBAAkBA,IAAE,KAAK,CAAC,YAAY,eAAe,CAAC,EAAE,SAAS;AAAA,QACjE,sBAAsBA,IAAE,QAAQ,EAAE,SAAS;AAAA,QAC3C,kBAAkBA,IAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,SAAS;AAAA,QAC5D,yBAAyBA,IAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,SAAS;AAAA,QACnE,wBAAwBA,IAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,SAAS;AAAA,QAClE,QAAQA,IAAE,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,SAAS;AAAA,MACxC,CAAC,EACA,SAAS;AAAA,MACZ,WAAW,uBAAuB,SAAS;AAAA,IAC7C,CAAC;AAGD,oBAAgB,gBAAgBA,IAAE,OAAO,CAAC,CAAC,GAAG,OAAO,OAAO,QAAQ;AAClE,YAAM,MAAM,IAAI,GAAG,QAAQ,sCAAsC,EAAE,IAAI;AAKvE,YAAM,WAAoC,CAAC;AAC3C,iBAAW,EAAE,KAAK,MAAM,KAAK,KAAK;AAChC,YAAI,IAAI,WAAW,YAAY,GAAG;AAChC;AAAA,QACF;AAEA,YAAI;AACF,mBAAS,GAAG,IAAI,KAAK,MAAM,KAAK;AAAA,QAClC,QAAQ;AACN,mBAAS,GAAG,IAAI;AAAA,QAClB;AAAA,MACF;AAEA,YAAM,qBAAqB,IAAI,mBAAmB,IAAI,EAAE;AACxD,YAAM,kBAAkB,mBAAmB,OAAO;AAClD,iBAAW,CAAC,YAAY,MAAM,KAAK,OAAO,QAAQ,eAAe,GAAG;AAClE,YAAI,CAAC,sBAAsB,UAAU,GAAG;AACtC;AAAA,QACF;AAEA,eAAO;AAAA,UACL;AAAA,UACA,gBAAgB,6BAA6B,MAAM,GAAG,aAAa,UAAU,EAAE;AAAA,QACjF;AAAA,MACF;AAEA,UAAI,OAAO,UAAU,eAAe,KAAK,UAAU,yCAAyC,GAAG;AAC7F,iBAAS,yCAAyC,IAAI;AAAA,UACpD,SAAS,yCAAyC;AAAA,QACpD;AAAA,MACF;AACA,UAAI,OAAO,UAAU,eAAe,KAAK,UAAU,oCAAoC,GAAG;AACxF,iBAAS,oCAAoC,IAAI;AAAA,UAC/C,SAAS,oCAAoC;AAAA,QAC/C;AAAA,MACF;AACA,UAAI,OAAO,UAAU,eAAe,KAAK,UAAU,sCAAsC,GAAG;AAC1F,iBAAS,sCAAsC,IAAI;AAAA,UACjD,SAAS,sCAAsC;AAAA,QACjD;AAAA,MACF;AACA,UAAI,OAAO,UAAU,eAAe,KAAK,UAAU,sCAAsC,GAAG;AAC1F,iBAAS,sCAAsC,IAAI;AAAA,UACjD,SAAS,sCAAsC;AAAA,QACjD;AAAA,MACF;AACA,UAAI,OAAO,UAAU,eAAe,KAAK,UAAU,uCAAuC,GAAG;AAC3F,iBAAS,uCAAuC,IAAI;AAAA,UAClD,SAAS,uCAAuC;AAAA,QAClD;AAAA,MACF;AACA,UACE,OAAO,UAAU,eAAe,KAAK,UAAU,+CAA+C,GAC9F;AACA,iBAAS,+CAA+C,IACtD;AAAA,UACE,SAAS,+CAA+C;AAAA,QAC1D;AAAA,MACJ;AAEA,aAAO;AAAA,IACT,CAAC;AAGD;AAAA,MACE;AAAA,MACAA,IAAE,OAAO;AAAA,QACP,UAAU;AAAA,MACZ,CAAC;AAAA,MACD,OAAO,MAAM,QAAQ;AACnB,cAAM,qBAAqB,IAAI,mBAAmB,IAAI,EAAE;AACxD,cAAM,eAAe,KAAK;AAC1B,cAAM,YACJ,aAAa,aACb,OAAO,aAAa,cAAc,YAClC,CAAC,MAAM,QAAQ,aAAa,SAAS,IAChC,aAAa,YACd;AACN,cAAM,EAAE,WAAW,YAAY,GAAG,oBAAoB,IAAI;AAG1D,cAAM,eAAe,gBAAgB,mBAAmB;AAGxD,cAAM,OAAO,IAAI,GAAG,QAAQ;AAAA;AAAA;AAAA;AAAA,KAI3B;AAED,mBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,YAAY,GAAG;AACvD,eAAK,IAAI,KAAK,KAAK,UAAU,KAAK,CAAC;AAAA,QACrC;AAEA,YAAI,WAAW;AACb,qBAAW,CAAC,YAAY,MAAM,KAAK,OAAO,QAAQ,SAAS,GAAG;AAC5D,+BAAmB,IAAI,YAAY,6BAA6B,MAAM,CAAC;AAAA,UACzE;AAAA,QACF;AAEA,eAAO;AAAA,UACL,SAAS;AAAA,YACP,GAAG,OAAO,KAAK,YAAY;AAAA,YAC3B,GAAG,OAAO,KAAK,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,eAAe,aAAa,UAAU,EAAE;AAAA,UAC/E;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA;AAAA,MACE;AAAA,MACAA,IAAE,OAAO;AAAA,QACP,YAAYA,IAAE,OAAO;AAAA,QACrB,QAAQ;AAAA,QACR,eAAeA,IAAE,OAAO,EAAE,SAAS;AAAA,MACrC,CAAC;AAAA,MACD,OAAO,MAAM,QAAQ;AACnB,cAAM,WAAW,IAAI,iBAAiB,KAAK,CAAC,SAAS,KAAK,OAAO,KAAK,UAAU;AAEhF,YAAI,CAAC,UAAU;AACb,gBAAM,IAAI,MAAM,qBAAqB,KAAK,UAAU,EAAE;AAAA,QACxD;AAEA,cAAM,UAAU,SAAS,aAAa,0BAA0B,UAAU,KAAK,MAAM,GAAG;AAAA,UACtF,WAAW;AAAA,UACX,eAAe,KAAK,iBAAiB,QAAQ,IAAI;AAAA,QACnD,CAAC;AAED,eAAO;AAAA,UACL,MAAM,QAAQ;AAAA,UACd,KAAK,QAAQ;AAAA,UACb,KAAK,QAAQ;AAAA,UACb,SAAS,GAAG,QAAQ,KAAK,KAAK,GAAG,CAAC,GAAG,QAAQ,MAAM,WAAW,QAAQ,GAAG,KAAK,EAAE;AAAA,QAClF;AAAA,MACF;AAAA,IACF;AAsBA;AAAA,MACE;AAAA,MACAA,IAAE,OAAO;AAAA,QACP,YAAYA,IAAE,KAAK,CAAC,SAAS,QAAQ,CAAC;AAAA,MACxC,CAAC;AAAA,MACD,OAAO,SAAS;AACd,cAAM,SAAS,eAAe,KAAK,UAAwB;AAC3D,eAAO;AAAA,MACT;AAAA,IACF;AAGA;AAAA,MACE;AAAA,MACAA,IAAE,OAAO;AAAA,QACP,YAAYA,IAAE,KAAK,CAAC,SAAS,QAAQ,CAAC;AAAA,QACtC,SAASA,IAAE,OAAO;AAAA,MACpB,CAAC;AAAA,MACD,OAAO,SAAS;AACd,cAAM,SAAS,gBAAgB,KAAK,YAA0B,KAAK,OAAO;AAC1E,eAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA;;;AC3QA,SAAS,KAAAG,WAAS;AAAlB;AAAA;AAAA;AACA;AACA;AAEA,oBAAgB,0BAA0BA,IAAE,OAAO,CAAC,CAAC,GAAG,OAAO,OAAO,QAAQ;AAC5E,aAAO,2BAA2B,IAAI,kBAAkB,IAAI,mBAAmB;AAAA,IACjF,CAAC;AAED;AAAA,MACE;AAAA,MACAA,IAAE,OAAO;AAAA,QACP,YAAYA,IAAE,OAAO;AAAA,MACvB,CAAC;AAAA,MACD,OAAO,MAAM,QAAQ;AACnB,YAAI,CAAC,IAAI,oBAAoB;AAC3B,gBAAM;AAAA,YACJ,MAAM;AAAA,YACN,SAAS;AAAA,UACX;AAAA,QACF;AAEA,eAAO,IAAI,mBAAmB,MAAM,KAAK,UAAU;AAAA,MACrD;AAAA,IACF;AAEA;AAAA,MACE;AAAA,MACAA,IAAE,OAAO;AAAA,QACP,OAAOA,IAAE,OAAO;AAAA,MAClB,CAAC;AAAA,MACD,OAAO,MAAM,QAAQ;AACnB,YAAI,CAAC,IAAI,oBAAoB;AAC3B,gBAAM;AAAA,YACJ,MAAM;AAAA,YACN,SAAS;AAAA,UACX;AAAA,QACF;AAEA,cAAM,MAAM,IAAI,mBAAmB,IAAI,KAAK,KAAK;AACjD,YAAI,CAAC,KAAK;AACR,gBAAM;AAAA,YACJ,MAAM;AAAA,YACN,SAAS,0BAA0B,KAAK,KAAK;AAAA,UAC/C;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA;;;AChDA,SAAS,KAAAC,WAAS;AAAlB,IAGM,2BACA,wBAWA,wBAmBA,iBACA;AAnCN,IAAAC,mBAAA;AAAA;AAAA;AACA;AAEA,IAAM,4BAA4BD,IAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAI;AACnE,IAAM,yBAAyBA,IAC5B,OAAO;AAAA,MACN,WAAWA,IAAE,OAAO;AAAA,MACpB,aAAaA,IAAE,OAAO;AAAA,MACtB,WAAW;AAAA,MACX,qBAAqBA,IAAE,OAAO;AAAA,MAC9B,gBAAgBA,IAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS;AAAA,MAC3D,qBAAqBA,IAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,OAAO,gBAAgB,EAAE,SAAS;AAAA,MACnF,aAAaA,IAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,OAAO,gBAAgB,EAAE,SAAS;AAAA,IAC7E,CAAC,EACA,OAAO;AACV,IAAM,yBAAyBA,IAC5B,OAAO;AAAA,MACN,IAAIA,IAAE,OAAO;AAAA,MACb,WAAW,0BAA0B,SAAS;AAAA,MAC9C,qBAAqBA,IAAE,OAAO,EAAE,SAAS;AAAA,MACzC,gBAAgBA,IAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAS,EAAE,SAAS;AAAA,MACtE,qBAAqBA,IAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,OAAO,gBAAgB,EAAE,SAAS;AAAA,MACnF,aAAaA,IAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,OAAO,gBAAgB,EAAE,SAAS,EAAE,SAAS;AAAA,IACxF,CAAC,EACA,OAAO,EACP;AAAA,MACC,CAACE,WACCA,OAAM,cAAc,UACpBA,OAAM,wBAAwB,UAC9BA,OAAM,mBAAmB,UACzBA,OAAM,wBAAwB,UAC9BA,OAAM,gBAAgB;AAAA,MACxB;AAAA,IACF;AACF,IAAM,kBAAkBF,IAAE,OAAO,EAAE,WAAWA,IAAE,OAAO,EAAE,CAAC;AAC1D,IAAM,qBAAqBA,IAAE,OAAO,EAAE,IAAIA,IAAE,OAAO,EAAE,CAAC;AAGtD,oBAAgB,qBAAqB,wBAAwB,OAAO,MAAM,QAAQ;AAChF,aAAO;AAAA,QACL,YAAY,MAAM,IAAI,cAAc,OAAO;AAAA,UACzC,WAAW,KAAK;AAAA,UAChB,aAAa,KAAK;AAAA,UAClB,WAAW,KAAK;AAAA,UAChB,qBAAqB,KAAK;AAAA,UAC1B,gBAAgB,KAAK;AAAA,UACrB,qBAAqB,KAAK;AAAA,UAC1B,aAAa,KAAK;AAAA,QACpB,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAGD,oBAAgB,kBAAkB,iBAAiB,OAAO,MAAM,QAAQ;AACtE,aAAO,EAAE,YAAY,IAAI,cAAc,aAAa,KAAK,SAAS,KAAK,KAAK;AAAA,IAC9E,CAAC;AAGD,oBAAgB,qBAAqB,wBAAwB,OAAO,MAAM,QAAQ;AAChF,aAAO;AAAA,QACL,YAAY,MAAM,IAAI,cAAc,OAAO,KAAK,IAAI;AAAA,UAClD,WAAW,KAAK;AAAA,UAChB,qBAAqB,KAAK;AAAA,UAC1B,gBAAgB,KAAK;AAAA,UACrB,qBAAqB,KAAK;AAAA,UAC1B,aAAa,KAAK;AAAA,QACpB,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAGD,oBAAgB,qBAAqB,oBAAoB,OAAO,MAAM,QAAQ;AAC5E,YAAM,IAAI,cAAc,OAAO,KAAK,EAAE;AACtC,aAAO,CAAC;AAAA,IACV,CAAC;AAGD,oBAAgB,oBAAoB,oBAAoB,OAAO,MAAM,QAAQ;AAC3E,aAAO,EAAE,YAAY,MAAM,IAAI,cAAc,MAAM,KAAK,EAAE,EAAE;AAAA,IAC9D,CAAC;AAGD,oBAAgB,qBAAqB,oBAAoB,OAAO,MAAM,QAAQ;AAC5E,aAAO,EAAE,YAAY,MAAM,IAAI,cAAc,OAAO,KAAK,EAAE,EAAE;AAAA,IAC/D,CAAC;AAGD,oBAAgB,sBAAsB,oBAAoB,OAAO,MAAM,QAAQ;AAC7E,aAAO,EAAE,OAAO,MAAM,IAAI,cAAc,kBAAkB,KAAK,EAAE,EAAE;AAAA,IACrE,CAAC;AAAA;AAAA;;;ACnFD,OAAOG,WAAU;AAKjB,SAAS,sBAAsB,cAA8B;AAC3D,SAAOA,MAAK,QAAQ,YAAY;AAClC;AAEA,eAAsB,oBAAoB,UAAmC;AAC3E,QAAM,EAAE,OAAO,IAAI,MAAM,OAAO,UAAU,CAAC,aAAa,kBAAkB,CAAC;AAC3E,SAAO,sBAAsBA,MAAK,QAAQ,UAAU,OAAO,KAAK,CAAC,CAAC;AACpE;AAEA,eAAsB,oBAAoB,UAAkB,cAAuC;AACjG,QAAM,sBAAsB,sBAAsB,YAAY;AAC9D,QAAM,YAAY,MAAM,cAAc,QAAQ;AAC9C,QAAM,UAAU,UAAU;AAAA,IACxB,CAAC,aAAa,sBAAsB,SAAS,IAAI,MAAM;AAAA,EACzD;AAEA,MAAI,CAAC,SAAS;AACZ,UAAM;AAAA,MACJ,MAAM;AAAA,MACN,SAAS,sCAAsC,YAAY;AAAA,IAC7D;AAAA,EACF;AAEA,SAAO,QAAQ;AACjB;AAQA,eAAsB,cAAc,UAA2C;AAC7E,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM,OAAO,UAAU,CAAC,YAAY,QAAQ,aAAa,CAAC;AAE7E,UAAM,YAA4B,CAAC;AACnC,UAAM,QAAQ,OAAO,MAAM,IAAI;AAE/B,QAAI,UAAiC,CAAC;AAEtC,eAAW,QAAQ,OAAO;AACxB,UAAI,KAAK,WAAW,WAAW,GAAG;AAChC,YAAI,QAAQ,MAAM;AAChB,oBAAU,KAAK,OAAuB;AAAA,QACxC;AACA,kBAAU,EAAE,MAAM,KAAK,UAAU,CAAC,EAAE;AAAA,MACtC,WAAW,KAAK,WAAW,OAAO,GAAG;AACnC,gBAAQ,SAAS,KAAK,UAAU,CAAC,EAAE,UAAU,GAAG,CAAC;AAAA,MACnD,WAAW,KAAK,WAAW,SAAS,GAAG;AACrC,cAAM,SAAS,KAAK,UAAU,CAAC;AAC/B,gBAAQ,SAAS;AACjB,gBAAQ,OAAO,OAAO,MAAM,GAAG,EAAE,IAAI,KAAK;AAAA,MAC5C,WAAW,SAAS,YAAY;AAC9B,gBAAQ,SAAS;AAAA,MACnB,WAAW,SAAS,IAAI;AAEtB,YAAI,QAAQ,MAAM;AAEhB,oBAAU,KAAK,OAAuB;AACtC,oBAAU,CAAC;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAGA,QAAI,QAAQ,MAAM;AAChB,gBAAU,KAAK,OAAuB;AAAA,IACxC;AAGA,eAAW,MAAM,WAAW;AAC1B,UAAI;AACF,cAAM,SAAS,MAAM,kBAAkB,GAAG,IAAI;AAC9C,WAAG,SACD,OAAO,OAAO,SAAS,KACvB,OAAO,SAAS,SAAS,KACzB,OAAO,UAAU,SAAS,KAC1B,OAAO,QAAQ,SAAS,IACpB,UACA;AAAA,MACR,QAAQ;AACN,WAAG,SAAS;AAAA,MACd;AAAA,IACF;AAEA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAI,iBAAiB,UAAU;AAC7B,YAAM,IAAI,MAAM,6BAA6B,MAAM,OAAO,EAAE;AAAA,IAC9D;AACA,UAAM;AAAA,EACR;AACF;AAQA,eAAsB,kBAAkB,cAA0C;AAChF,QAAM,EAAE,OAAO,IAAI,MAAM,OAAO,cAAc;AAAA,IAC5C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,SAAO,YAAY,MAAM;AAC3B;AASA,eAAsB,gBAAgB,cAAsB,SAAS,OAAwB;AAC3F,QAAM,OAAO,CAAC,MAAM;AACpB,MAAI,QAAQ;AACV,SAAK,KAAK,UAAU;AAAA,EACtB;AACA,QAAM,EAAE,OAAO,IAAI,MAAM,OAAO,cAAc,IAAI;AAClD,SAAO;AACT;AASA,eAAsB,gBAAgB,cAA2C;AAC/E,QAAM,EAAE,OAAO,IAAI,MAAM,OAAO,cAAc,CAAC,WAAW,MAAM,eAAe,MAAM,CAAC;AAEtF,QAAM,QAAoB,CAAC;AAC3B,QAAM,QAAQ,OAAO,MAAM,IAAI,EAAE,OAAO,OAAO;AAE/C,aAAW,QAAQ,OAAO;AACxB,UAAM,QAAQ,KAAK,SAAS,GAAG;AAC/B,UAAM,OAAO,QAAQ,KAAK,MAAM,GAAG,EAAE,IAAI;AACzC,UAAMA,SAAO,GAAG,YAAY,IAAI,IAAI;AAEpC,UAAM,KAAK;AAAA,MACT;AAAA,MACA,MAAAA;AAAA,MACA,MAAM,QAAQ,QAAQ;AAAA,IACxB,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAUA,eAAsB,eACpB,UACA,QACA,cACuB;AACvB,MAAI,aAAa,CAAC,YAAY,OAAO,cAAc,MAAM;AACzD,MAAI;AACF,UAAM,OAAO,UAAU,CAAC,aAAa,YAAY,WAAW,GAAG,MAAM,WAAW,CAAC;AAAA,EACnF,SAAS,OAAO;AACd,QAAI,iBAAiB,UAAU;AAC7B,mBAAa,CAAC,YAAY,OAAO,MAAM,QAAQ,YAAY;AAAA,IAC7D,OAAO;AACL,YAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM,OAAO,UAAU,UAAU;AAEjC,QAAM,YAAY,MAAM,cAAc,QAAQ;AAC9C,QAAM,sBAAsB,sBAAsB,YAAY;AAC9D,QAAM,UAAU,UAAU,KAAK,CAAC,OAAO,sBAAsB,GAAG,IAAI,MAAM,mBAAmB;AAE7F,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,iCAAiC;AAAA,EACnD;AAEA,SAAO;AACT;AASA,eAAsB,eACpB,UACA,cACA,QAAQ,OACO;AACf,QAAM,OAAO,CAAC,YAAY,UAAU,YAAY;AAChD,MAAI,OAAO;AACT,SAAK,KAAK,SAAS;AAAA,EACrB;AACA,QAAM,OAAO,UAAU,IAAI;AAC7B;AA7NA;AAAA;AAAA;AAQA;AACA;AAAA;AAAA;;;ACLA,OAAOC,WAAU;AACjB,SAAS,KAAAC,WAAS;AAelB,eAAe,wBACb,KACA,eACmB;AACnB,QAAM,kBAAkB,MAAM,oBAAoB,aAAa;AAC/D,QAAM,sBAAsB,MAAM,QAAQ;AAAA,IACxC,IAAI,aAAa,KAAK,EAAE,IAAI,OAAO,cAAc;AAC/C,UAAI;AACF,cAAM,YAAY,MAAM,oBAAoB,UAAU,IAAI;AAC1D,eAAO,cAAc,kBAAkB,UAAU,KAAK;AAAA,MACxD,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,oBAAoB,OAAO,CAAC,gBAAuC,QAAQ,WAAW,CAAC;AAChG;AAEA,SAAS,mCAAmC,KAAqB,cAAwB;AACvF,aAAW,eAAe,cAAc;AACtC,QAAI,CAAC,IAAI,aAAa,IAAI,WAAW,GAAG;AACtC;AAAA,IACF;AACA,wBAAoB,KAAK,aAAa,EAAE,iBAAiB,KAAK,CAAC;AAAA,EACjE;AACF;AAEA,SAAS,uBAAuB,KAAqB,eAAgC;AACnF,QAAM,aAAaD,MAAK,QAAQ,aAAa;AAC7C,SAAO,IAAI,aACR,KAAK,EACL,KAAK,CAAC,kBAAkBA,MAAK,QAAQ,cAAc,IAAI,MAAM,UAAU;AAC5E;AArDA,IAAAE,iBAAA;AAAA;AAAA;AAMA;AAWA;AACA;AAsCA,oBAAgB,iBAAiBD,IAAE,OAAO,EAAE,aAAaA,IAAE,OAAO,EAAE,CAAC,GAAG,OAAO,MAAM,QAAQ;AAC3F,YAAM,YAAY,IAAI,aAAa,IAAI,KAAK,WAAW;AACvD,UAAI,CAAC,WAAW;AACd,cAAM,EAAE,MAAM,uBAAuB,SAAS,wBAAwB,KAAK,WAAW,GAAG;AAAA,MAC3F;AACA,aAAO,EAAE,WAAW,MAAM,cAAc,UAAU,IAAI,EAAE;AAAA,IAC1D,CAAC;AAGD;AAAA,MACE;AAAA,MACAA,IAAE,OAAO,EAAE,aAAaA,IAAE,OAAO,GAAG,cAAcA,IAAE,OAAO,EAAE,CAAC;AAAA,MAC9D,OAAO,MAAM,QAAQ;AACnB,cAAM,YAAY,IAAI,aAAa,IAAI,KAAK,WAAW;AACvD,YAAI,CAAC,WAAW;AACd,gBAAM,EAAE,MAAM,uBAAuB,SAAS,wBAAwB,KAAK,WAAW,GAAG;AAAA,QAC3F;AAEA,cAAM,eAAe,MAAM,oBAAoB,UAAU,MAAM,KAAK,YAAY;AAChF,eAAO,EAAE,QAAQ,MAAM,kBAAkB,YAAY,EAAE;AAAA,MACzD;AAAA,IACF;AAGA;AAAA,MACE;AAAA,MACAA,IAAE,OAAO;AAAA,QACP,aAAaA,IAAE,OAAO;AAAA,QACtB,cAAcA,IAAE,OAAO;AAAA,QACvB,QAAQA,IAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,MAC9C,CAAC;AAAA,MACD,OAAO,MAAM,QAAQ;AACnB,cAAM,YAAY,IAAI,aAAa,IAAI,KAAK,WAAW;AACvD,YAAI,CAAC,WAAW;AACd,gBAAM,EAAE,MAAM,uBAAuB,SAAS,wBAAwB,KAAK,WAAW,GAAG;AAAA,QAC3F;AAEA,cAAM,eAAe,MAAM,oBAAoB,UAAU,MAAM,KAAK,YAAY;AAChF,eAAO,EAAE,MAAM,MAAM,gBAAgB,cAAc,KAAK,MAAM,EAAE;AAAA,MAClE;AAAA,IACF;AAGA;AAAA,MACE;AAAA,MACAA,IAAE,OAAO,EAAE,aAAaA,IAAE,OAAO,GAAG,cAAcA,IAAE,OAAO,EAAE,CAAC;AAAA,MAC9D,OAAO,MAAM,QAAQ;AACnB,cAAM,YAAY,IAAI,aAAa,IAAI,KAAK,WAAW;AACvD,YAAI,CAAC,WAAW;AACd,gBAAM,EAAE,MAAM,uBAAuB,SAAS,wBAAwB,KAAK,WAAW,GAAG;AAAA,QAC3F;AAEA,cAAM,eAAe,MAAM,oBAAoB,UAAU,MAAM,KAAK,YAAY;AAChF,eAAO,EAAE,MAAM,MAAM,gBAAgB,YAAY,EAAE;AAAA,MACrD;AAAA,IACF;AAGA;AAAA,MACE;AAAA,MACAA,IAAE,OAAO;AAAA,QACP,aAAaA,IAAE,OAAO;AAAA,QACtB,QAAQA,IAAE,OAAO;AAAA,QACjB,MAAMA,IAAE,OAAO;AAAA,MACjB,CAAC;AAAA,MACD,OAAO,MAAM,QAAQ;AACnB,cAAM,YAAY,IAAI,aAAa,IAAI,KAAK,WAAW;AACvD,YAAI,CAAC,WAAW;AACd,gBAAM,EAAE,MAAM,uBAAuB,SAAS,wBAAwB,KAAK,WAAW,GAAG;AAAA,QAC3F;AAEA,cAAM,sBAAsB,MAAM,wBAAwB,KAAK,UAAU,IAAI;AAC7E,cAAM,WAAW,MAAM,eAAe,UAAU,MAAM,KAAK,QAAQ,KAAK,IAAI;AAC5E,2CAAmC,KAAK,mBAAmB;AAC3D,eAAO,EAAE,SAAS;AAAA,MACpB;AAAA,IACF;AAGA;AAAA,MACE;AAAA,MACAA,IAAE,OAAO;AAAA,QACP,aAAaA,IAAE,OAAO;AAAA,QACtB,cAAcA,IAAE,OAAO;AAAA,QACvB,OAAOA,IAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK;AAAA,MAC7C,CAAC;AAAA,MACD,OAAO,MAAM,QAAQ;AACnB,cAAM,YAAY,IAAI,aAAa,IAAI,KAAK,WAAW;AACvD,YAAI,CAAC,WAAW;AACd,gBAAM,EAAE,MAAM,uBAAuB,SAAS,wBAAwB,KAAK,WAAW,GAAG;AAAA,QAC3F;AAEA,cAAM,sBAAsB,MAAM,wBAAwB,KAAK,UAAU,IAAI;AAC7E,cAAM,eAAe,MAAM,oBAAoB,UAAU,MAAM,KAAK,YAAY;AAChF,YAAI,uBAAuB,KAAK,YAAY,GAAG;AAC7C,gBAAM;AAAA,YACJ,MAAM;AAAA,YACN,SAAS,6CAA6C,YAAY;AAAA,UACpE;AAAA,QACF;AAEA,cAAM,eAAe,UAAU,MAAM,cAAc,KAAK,KAAK;AAC7D,2CAAmC,KAAK,mBAAmB;AAC3D,eAAO,CAAC;AAAA,MACV;AAAA,IACF;AAAA;AAAA;;;AC5JA,SAAS,KAAAE,WAAS;AAGlB,SAAS,2BAA2C;AAClD,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,SAAS,EAAE,cAAc,sBAAsB;AAAA,EACjD;AACF;AAbA,IAAAC,gBAAA;AAAA;AAAA;AAMA;AAUA;AAAA,MACE;AAAA,MACAD,IAAE,OAAO;AAAA,QACP,aAAaA,IAAE,OAAO;AAAA,QACtB,OAAOA,IAAE,OAAO;AAAA,MAClB,CAAC;AAAA,MACD,OAAO,MAAM,KAAK,aAAa;AAG7B,eAAO,IAAI,WAAW;AAAA,UACpB,KAAK;AAAA,UACL;AAAA,UACA,KAAK;AAAA,UACL,yBAAyB;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAGA;AAAA,MACE;AAAA,MACAA,IAAE,OAAO,EAAE,aAAaA,IAAE,OAAO,EAAE,CAAC;AAAA,MACpC,OAAO,MAAM,KAAK,aAAa;AAC7B,cAAM,UAAU,IAAI,WAAW,UAAU,KAAK,aAAa,QAAS;AACpE,eAAO,EAAE,QAAQ;AAAA,MACnB;AAAA,IACF;AAGA;AAAA,MACE;AAAA,MACAA,IAAE,OAAO,EAAE,aAAaA,IAAE,OAAO,EAAE,CAAC;AAAA,MACpC,OAAO,MAAM,KAAK,aAAa;AAC7B,YAAI,WAAW,QAAQ,KAAK,aAAa,QAAS;AAClD,eAAO,CAAC;AAAA,MACV;AAAA,IACF;AAGA,oBAAgB,kBAAkBA,IAAE,OAAO,EAAE,aAAaA,IAAE,OAAO,EAAE,CAAC,GAAG,OAAO,MAAM,QAAQ;AAC5F,YAAM,aAAa,IAAI,WAAW,cAAc,KAAK,WAAW;AAChE,YAAM,iBAAiB,IAAI,WAAW,yBAAyB,KAAK,WAAW;AAC/E,aAAO;AAAA,QACL,cAAc,cAAc;AAAA,QAC5B,YAAY,aAAa,EAAE,OAAO,WAAW,OAAO,UAAU,WAAW,SAAS,IAAI;AAAA,QACtF;AAAA,MACF;AAAA,IACF,CAAC;AAGD;AAAA,MACE;AAAA,MACAA,IAAE,OAAO;AAAA,QACP,aAAaA,IAAE,OAAO;AAAA,QACtB,OAAOA,IAAE,OAAO;AAAA,MAClB,CAAC;AAAA,MACD,OAAO,MAAM,KAAK,aAAa;AAC7B,eAAO,IAAI,WAAW;AAAA,UACpB,KAAK;AAAA,UACL;AAAA,UACA,KAAK;AAAA,UACL,yBAAyB;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AChFA;AAAA;AAAA;AAMA;AACA;AACA,IAAAE;AACA;AACA;AACA;AACA;AACA,IAAAC;AACA,IAAAC;AACA;AACA,IAAAC;AACA,IAAAC;AACA,IAAAC;AAAA;AAAA;;;AC2CA,eAAsB,aACpB,iBACiB;AACjB,QAAM,SAAS,kBAAkB,eAAe;AAEhD,gBAAc,MAAM;AAEpB,QAAM,KAAK,aAAa,OAAO,OAAO;AACtC,QAAM,WAAW,IAAI,SAAS;AAC9B,QAAM,gBAAgB,IAAI,kBAAkB;AAC5C,QAAM,aAAa,IAAI,eAAe;AACtC,QAAM,QAAQ,IAAI,MAAM,EAAE,UAAU,gBAAgB,MAAM,QAAQ,WAAW,CAAC;AAC9E,MAAI;AACJ,MAAI;AAEJ,QAAM,cAAc,IAAI,gBAAgB;AAAA,IACtC,SAAS,cAAc;AAAA,IACvB;AAAA,IACA,IAAI,uBAAuB,EAAE;AAAA,EAC/B,CAAC;AAED,QAAM,eAAe,IAAI,aAAa,EAAE;AACxC,QAAM,YAAY,IAAI,mBAAmB;AAAA,IACvC,cAAc,EAAE,KAAK,CAAC,gBAAgB,aAAa,IAAI,WAAW,EAAE;AAAA,IACpE;AAAA,IACA;AAAA,IACA,UAAU,OAAO,gBAAgB;AAC/B,UAAI,CAAC,aAAa,IAAI,WAAW,GAAG;AAClC;AAAA,MACF;AAEA,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,UACE,MAAM;AAAA,UACN,IAAI,cAAc,WAAW,IAAI,KAAK,IAAI,CAAC;AAAA,UAC3C,IAAI;AAAA,UACJ,MAAM;AAAA,YACJ;AAAA,YACA,YAAY;AAAA,UACd;AAAA,QACF;AAAA,QACA;AAAA,MACF;AAEA,UAAI,CAAC,OAAO,IAAI;AACd,cAAM,IAAI,MAAM,OAAO,OAAO,WAAW,yBAAyB;AAAA,MACpE;AAEA,YAAM,OAAO,OAAO;AACpB,UAAI,KAAK,YAAY,OAAO;AAC1B,cAAM,IAAI,MAAM,KAAK,WAAW,yBAAyB;AAAA,MAC3D;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,YAAY,sBAAsB,EAAE;AAC1C,QAAM,qBAAqB,IAAI,mBAAmB,EAAE;AACpD,QAAM,aAAa,IAAI,eAAe;AAAA,IACpC;AAAA,IACA;AAAA,IACA,IAAI;AAAA,IACJ,aAAa;AAAA,IACb;AAAA,IACA;AAAA,EACF,CAAC;AAED,MAAI;AAEJ,iBAAe,IAAI,iBAAiB;AAAA,IAClC;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb;AAAA,IACA,UAAU,OAAO,gBAAgB;AAC/B,YAAM,eAAe,mBAAmB,WAAW;AACnD,YAAM,WAAW,iBAAiB,WAAW;AAC7C,YAAM,YAAY,kBAAkB,WAAW;AAC/C,iBAAW,wBAAwB,WAAW;AAAA,IAChD;AAAA,IACA,SAAS,CAAC,gBACR,uBAAuB,OAAO,YAAY,WAAW,EAAE;AAAA,MAAM,CAAC,QAC5D,QAAQ,KAAK,oCAAoC,EAAE,MAAM,aAAa,IAAI,CAAC;AAAA,IAC7E;AAAA,EACJ,CAAC;AACD,eAAa,gBAAgB;AAE7B,QAAM,kBAAkB,IAAI,gBAAgB,EAAE;AAC9C,QAAM,qBAAqB,IAAI,mBAAmB,EAAE;AAEpD,QAAM,MAAM,MAAM,gBAAgB;AAAA,IAChC;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,OAAO;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,MACN,OAAO;AAAA,MACP,WAAW;AAAA,QACT,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,eAAe;AAAA,UACf,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,UAAU,IAAI,GAAG;AAEvB,QAAM,iBAAiB,IAAI,eAAe,EAAE;AAC5C,QAAM,YAAY,IAAI,oBAAoB,EAAE;AAC5C,QAAM,mBAAmB,IAAI,2BAA2B,EAAE;AAC1D,kBAAgB,IAAI,kBAAkB;AAAA,IACpC;AAAA,IACA,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,IAAI;AAAA,EACd,CAAC;AACD,QAAM,WAAW,QAAQ;AACzB,QAAM,cAAc,QAAQ;AAE5B,QAAM,wBAAwB,+BAA+B;AAC7D,QAAM,sBAAyC,wBAC3C;AAAA,IACE,eAAe,sBAAsB;AAAA,EACvC,IACA,CAAC;AACL,QAAM,qBAAqB,IAAI,uBAAuB,kBAAkB;AAAA,IACtE,GAAG;AAAA,IACH,YAAY,uBAAuB,cAAc;AAAA,EACnD,CAAC;AAED,mBAAiB;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,kBAAkB,cAAc;AAEtC,QAAM,IAAI,OAAO;AAAA,IACf,MAAM,OAAO;AAAA,IACb,MAAM,OAAO;AAAA,EACf,CAAC;AAED,MAAI,iBAAiB,sBAAsB,QAAQ,IAAI,aAAa,cAAc;AAChF,UAAM,UAAyB;AAAA,MAC7B,MAAM,OAAO;AAAA,MACb,MAAM,kBAAkB,GAAG,KAAK,OAAO;AAAA,MACvC,KAAK,QAAQ;AAAA,MACb,OAAO,UAAU,QAAQ,GAAG;AAAA,MAC5B,kBAAkB,UAAU,QAAQ,GAAG;AAAA,MACvC,WAAW,KAAK,IAAI;AAAA,IACtB;AACA,YAAQ,IAAI,iCAAiC,eAAe;AAC5D,uBAAmB,OAAO;AAAA,EAC5B;AAEA,QAAM,UAAU,WAAW,MAAM;AAC/B,iBAAa,OAAO,YAAY,IAAI,GAAG,EAAE;AAAA,MAAM,CAAC,QAC9C,IAAI,IAAI,KAAK,EAAE,IAAI,GAAG,mBAAmB;AAAA,IAC3C;AAAA,EACF,GAAG,mBAAmB;AACtB,UAAQ,MAAM;AAEd,QAAM,mBAAmB,YAAY,MAAM;AACzC,UAAM,QAAQ;AAAA,EAChB,GAAG,wBAAwB;AAC3B,mBAAiB,MAAM;AAEvB,MAAI,UAAU;AACd,QAAM,aAAa,YAAY;AAC7B,QAAI,QAAS;AACb,cAAU;AAEV,iBAAa,OAAO;AACpB,kBAAc,gBAAgB;AAC9B,UAAM,IAAI,MAAM;AAChB,cAAU,KAAK;AACf,kBAAc,KAAK;AACnB,gBAAY,SAAS;AACrB,UAAM,QAAQ;AACd,aAAS,MAAM;AACf,wBAAoB;AACpB,OAAG,MAAM;AAAA,EACX;AAEA,QAAM,aAAa,kBAAkB,GAAG,KAAK,OAAO;AACpD,UAAQ,IAAI,8BAA8B,OAAO,IAAI,IAAI,UAAU,EAAE;AAErE,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,UAAU,EAAE,YAAY,eAAe;AAAA,EACzC;AACF;AAEA,SAAS,kBAAkB,KAA0C;AACnE,QAAM,UAAU,IAAI,OAAO,QAAQ;AACnC,MAAI,WAAW,OAAO,YAAY,YAAY,OAAO,QAAQ,SAAS,UAAU;AAC9E,WAAO,QAAQ;AAAA,EACjB;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB;AACvB,SAAO,IAAI,YAAY;AACzB;AAEA,SAAS,uBAAuB,IAAgC;AAC9D,SAAO;AAAA,IACL,QAAQ,CAAC,aAAa;AACpB,SAAG,QAAQ;AAAA;AAAA;AAAA,OAGV,EAAE;AAAA,QACD,SAAS;AAAA,QACT,SAAS;AAAA,QACT,SAAS;AAAA,QACT,SAAS;AAAA,QACT,SAAS;AAAA,QACT,KAAK,UAAU,SAAS,IAAI;AAAA,QAC5B,SAAS;AAAA,QACT,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,WAAW,CAAC,IAAY,SAAiB,aAAqB;AAC5D,SAAG,QAAQ;AAAA;AAAA,OAEV,EAAE,IAAI,SAAS,UAAU,EAAE;AAAA,IAC9B;AAAA,EACF;AACF;AAEA,SAAS,sBAAsB,IAAc;AAC3C,SAAO;AAAA,IACL,QAAQ,CAAC,YAAwB;AAC/B,SAAG,QAAQ;AAAA;AAAA;AAAA,OAGV,EAAE;AAAA,QACD,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA,QAAQ,CAAC,IAAY,UAAmC;AACtD,YAAM,OAAO,OAAO,KAAK,KAAK;AAC9B,UAAI,KAAK,WAAW,EAAG;AAEvB,YAAM,cAAc,oBAAI,IAAI;AAAA,QAC1B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAED,YAAM,aAAuB,CAAC;AAC9B,YAAM,SAAoB,CAAC;AAC3B,iBAAW,OAAO,MAAM;AACtB,cAAM,MAAM,IAAI,QAAQ,YAAY,KAAK,EAAE,YAAY;AACvD,YAAI,CAAC,YAAY,IAAI,GAAG,EAAG;AAC3B,mBAAW,KAAK,GAAG,GAAG,MAAM;AAC5B,eAAO,KAAK,MAAM,GAAG,CAAC;AAAA,MACxB;AACA,UAAI,WAAW,WAAW,EAAG;AAE7B,SAAG,QAAQ,uBAAuB,WAAW,KAAK,IAAI,CAAC,eAAe,EAAE;AAAA,QACtE,GAAI;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAAA,IACA,UAAU,CAAC,OAAe;AACxB,YAAM,MAAM,GAAG,QAAQ,qCAAqC,EAAE,IAAI,EAAE;AAGpE,aAAO,MAAM,aAAa,GAAG,IAAI;AAAA,IACnC;AAAA,IACA,mBAAmB,CAAC,gBAAwB;AAC1C,YAAM,OAAO,GACV,QAAQ,wEAAwE,EAChF,IAAI,WAAW;AAClB,aAAO,KAAK,IAAI,YAAY;AAAA,IAC9B;AAAA,IACA,gBAAgB,MAAM;AACpB,YAAM,OAAO,GACV;AAAA,QACC;AAAA,MACF,EACC,IAAI;AACP,aAAO,KAAK,IAAI,YAAY;AAAA,IAC9B;AAAA,IACA,QAAQ,CAAC,OAAe;AACtB,SAAG,QAAQ,mCAAmC,EAAE,IAAI,EAAE;AAAA,IACxD;AAAA,EACF;AACF;AApYA,IAiDM;AAjDN;AAAA;AAAA;AAKA;AAMA;AACA,IAAAC;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAAC;AACA;AACA,IAAAA;AACA;AAEA;AACA;AACA,IAAAA;AACA;AAEA;AACA;AACA;AAEA;AAEA,IAAM,2BAA2B;AAqVjC,QAAI,kBAAkB,YAAY,GAAG,GAAG;AACtC,YAAM,SAAS,MAAM,aAAa;AAElC,cAAQ,GAAG,UAAU,YAAY;AAC/B,gBAAQ,IAAI,oBAAoB;AAChC,cAAM,OAAO,KAAK;AAClB,gBAAQ,KAAK,CAAC;AAAA,MAChB,CAAC;AAED,cAAQ,GAAG,WAAW,YAAY;AAChC,gBAAQ,IAAI,oBAAoB;AAChC,cAAM,OAAO,KAAK;AAClB,gBAAQ,KAAK,CAAC;AAAA,MAChB,CAAC;AAAA,IACH;AAAA;AAAA;;;ACpZA,IAwCa;AAxCb;AAAA;AAAA;AAwCO,IAAM,eAAN,MAAmB;AAAA,MACxB,YAAoB,IAAc;AAAd;AAAA,MAAe;AAAA,MAAf;AAAA;AAAA;AAAA;AAAA,MAKpB,gBAAgB,aAAiC;AAC/C,cAAM,OAAO,KAAK,GACf,QAAQ,yEAAyE,EACjF,IAAI,WAAW;AAClB,eAAO,KAAK,IAAI,CAAC,QAAQ,KAAK,cAAc,GAAG,CAAC;AAAA,MAClD;AAAA;AAAA;AAAA;AAAA,MAKA,SAAS,IAAkC;AACzC,cAAM,MAAM,KAAK,GAAG,QAAQ,sCAAsC,EAAE,IAAI,EAAE;AAG1E,eAAO,MAAM,KAAK,cAAc,GAAG,IAAI;AAAA,MACzC;AAAA;AAAA;AAAA;AAAA,MAKA,sBAAsB,aAAiC;AACrD,cAAM,OAAO,KAAK,GACf;AAAA,UACC;AAAA,QACF,EACC,IAAI,WAAW;AAClB,eAAO,KAAK,IAAI,CAAC,QAAQ,KAAK,cAAc,GAAG,CAAC;AAAA,MAClD;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,UAAiC;AACtC,cAAM,OAAO,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA,KAG5B;AAED,aAAK;AAAA,UACH,SAAS;AAAA,UACT,SAAS;AAAA,UACT,SAAS;AAAA,UACT,SAAS;AAAA,UACT,KAAK,UAAU,SAAS,IAAI;AAAA,UAC5B,SAAS,MAAM,KAAK,UAAU,SAAS,GAAG,IAAI;AAAA,UAC9C,SAAS,SAAS;AAAA,UAClB,SAAS;AAAA,UACT,SAAS;AAAA,UACT,SAAS;AAAA,QACX;AAEA,eAAO,KAAK,SAAS,SAAS,EAAE;AAAA,MAClC;AAAA;AAAA;AAAA;AAAA,MAKA,UAAU,IAAY,SAAiB,UAAwB;AAC7D,cAAM,OAAO,KAAK,GAAG,QAAQ,+DAA+D;AAC5F,aAAK,IAAI,SAAS,UAAU,EAAE;AAAA,MAChC;AAAA;AAAA;AAAA;AAAA,MAKA,iBAAiB,IAAY,MAAc,MAAoB;AAC7D,cAAM,OAAO,KAAK,GAAG,QAAQ,sDAAsD;AACnF,aAAK,IAAI,MAAM,MAAM,EAAE;AAAA,MACzB;AAAA;AAAA;AAAA;AAAA,MAKA,YAAY,IAAY,OAAqB;AAC3C,cAAM,OAAO,KAAK,GAAG,QAAQ,6CAA6C;AAC1E,aAAK,IAAI,OAAO,EAAE;AAAA,MACpB;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,IAAkB;AACvB,cAAM,OAAO,KAAK,GAAG,QAAQ,oCAAoC;AACjE,aAAK,IAAI,EAAE;AAAA,MACb;AAAA;AAAA;AAAA;AAAA,MAKQ,cAAc,KAA4B;AAChD,eAAO;AAAA,UACL,IAAI,IAAI;AAAA,UACR,aAAa,IAAI;AAAA,UACjB,MAAM,IAAI;AAAA,UACV,KAAK,IAAI;AAAA,UACT,MAAM,KAAK,MAAM,IAAI,IAAI;AAAA,UACzB,MAAM,IAAI;AAAA,UACV,MAAM,IAAI;AAAA,UACV,OAAO,IAAI,aAAa;AAAA,UACxB,WAAW,IAAI;AAAA,UACf,SAAS,IAAI,YAAY;AAAA,UACzB,UAAU,IAAI,aAAa;AAAA,UAC3B,OAAO,IAAI,SAAS;AAAA,UACpB,KAAK,IAAI,MAAO,KAAK,MAAM,IAAI,GAAG,IAA+B;AAAA,QACnE;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACxJA,IAgCa;AAhCb;AAAA;AAAA;AAgCO,IAAM,gBAAN,MAAoB;AAAA,MACzB,YAAoB,IAAc;AAAd;AAAA,MAAe;AAAA,MAAf;AAAA;AAAA;AAAA;AAAA,MAKpB,OAAoB;AAClB,cAAM,OAAO,KAAK,GAAG,QAAQ,0BAA0B,EAAE,IAAI;AAC7D,eAAO,KAAK,IAAI,CAAC,QAAQ,KAAK,eAAe,GAAG,CAAC;AAAA,MACnD;AAAA;AAAA;AAAA;AAAA,MAKA,SAAS,IAAmC;AAC1C,cAAM,MAAM,KAAK,GAAG,QAAQ,uCAAuC,EAAE,IAAI,EAAE;AAG3E,eAAO,MAAM,KAAK,eAAe,GAAG,IAAI;AAAA,MAC1C;AAAA;AAAA;AAAA;AAAA,MAKA,WAAWC,QAAqC;AAC9C,cAAM,MAAM,KAAK,GAAG,QAAQ,yCAAyC,EAAE,IAAIA,MAAI;AAG/E,eAAO,MAAM,KAAK,eAAe,GAAG,IAAI;AAAA,MAC1C;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,WAAoC;AACzC,cAAM,OAAO,KAAK,GAAG,QAAQ;AAAA;AAAA;AAAA,KAG5B;AAED,aAAK;AAAA,UACH,UAAU;AAAA,UACV,UAAU;AAAA,UACV,UAAU;AAAA,UACV,UAAU,aAAa;AAAA,UACvB,UAAU;AAAA,UACV,UAAU;AAAA,UACV,KAAK,UAAU,UAAU,OAAO;AAAA,QAClC;AAEA,eAAO,KAAK,SAAS,UAAU,EAAE;AAAA,MACnC;AAAA;AAAA;AAAA;AAAA,MAKA,cAAc,IAAY,SAAwB;AAChD,cAAM,OAAO,KAAK,GAAG,QAAQ,iDAAiD;AAC9E,aAAK,IAAI,KAAK,UAAU,OAAO,GAAG,EAAE;AAAA,MACtC;AAAA;AAAA;AAAA;AAAA,MAKA,iBAAiB,IAAY,cAA4B;AACvD,cAAM,OAAO,KAAK,GAAG,QAAQ,uDAAuD;AACpF,aAAK,IAAI,cAAc,EAAE;AAAA,MAC3B;AAAA;AAAA;AAAA;AAAA,MAKA,OAAO,IAAkB;AACvB,cAAM,OAAO,KAAK,GAAG,QAAQ,qCAAqC;AAClE,aAAK,IAAI,EAAE;AAAA,MACb;AAAA;AAAA;AAAA;AAAA,MAKQ,eAAe,KAA8B;AACnD,eAAO;AAAA,UACL,IAAI,IAAI;AAAA,UACR,MAAM,IAAI;AAAA,UACV,eAAe,IAAI;AAAA,UACnB,WAAW,IAAI,cAAc;AAAA,UAC7B,UAAU,IAAI;AAAA,UACd,cAAc,IAAI;AAAA,UAClB,SAAS,KAAK,MAAM,IAAI,QAAQ;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AC3HA;AAAA;AAAA;AAAA;AACA;AACA;AAIA;AACA;AAOA;AACA;AAKA;AAIA;AAKA;AACA;AAAA;AAAA;;;AC9BA,IAAAC,iBAAA;AAAA;AAAA;AAEA;AACA,IAAAC;AACA;AACA;AAWA,IAAAC;AAAA;AAAA;;;AChBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAC,YAAA;AAAA;AAAA;AAAA;AACA;AACA;AAGA;AACA;AACA,IAAAC;AACA;AAAA;AAAA;;;ACRA,SAAS,cAAAC,cAAY,cAAc;AACnC,SAAS,WAAAC,UAAS,QAAAC,cAAY;AAC9B,SAAS,iBAAAC,sBAAqB;;;ACF9B,MAAAC;;;ACAA,SAAS,cAAAC,aAAY,aAAAC,YAAW,gBAAAC,eAAc,iBAAAC,sBAAqB;AACnE,SAAS,WAAAC,gBAAe;AACxB,SAAS,YAAAC,WAAU,QAAAC,aAAY;AAE/B,IAAM,kBAAkB;AASjB,SAAS,mBAA2B;AACzC,SAAOA,MAAKF,SAAQ,GAAG,iBAAiB,aAAa;AACvD;AAEO,SAAS,iBAAiBG,QAAuB;AACtD,MAAIA,OAAM,SAAS,KAAK,GAAG;AACzB,WAAOA;AAAA,EACT;AACA,MAAIF,UAASE,MAAK,EAAE,SAAS,GAAG,GAAG;AACjC,WAAOA;AAAA,EACT;AACA,SAAOD,MAAKC,QAAO,eAAe;AACpC;AAEO,SAAS,gBAAkC;AAChD,QAAMC,SAAO,iBAAiB;AAC9B,MAAI,CAACR,YAAWQ,MAAI,GAAG;AACrB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,SAAS,KAAK,MAAMN,cAAaM,QAAM,OAAO,CAAC;AACrD,QACG,OAAO,SAAS,UAAa,OAAO,OAAO,SAAS,YACpD,OAAO,SAAS,UAAa,OAAO,OAAO,SAAS,YACpD,OAAO,YAAY,UAAa,OAAO,OAAO,YAAY,YAC1D,OAAO,aAAa,UAAa,OAAO,OAAO,aAAa,UAC7D;AACA,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,eAAe,QAAyB;AACtD,QAAMA,SAAO,iBAAiB;AAC9B,QAAM,MAAMF,MAAKF,SAAQ,GAAG,eAAe;AAC3C,QAAM,mBAA8B;AAAA,IAClC,GAAI,OAAO,SAAS,SAAY,EAAE,MAAM,OAAO,KAAK,IAAI,CAAC;AAAA,IACzD,GAAI,OAAO,SAAS,UAAa,OAAO,OAAO,IAAI,EAAE,MAAM,OAAO,KAAK,IAAI,CAAC;AAAA,IAC5E,GAAI,OAAO,YAAY,SAAY,EAAE,SAAS,iBAAiB,OAAO,OAAO,EAAE,IAAI,CAAC;AAAA,IACpF,GAAI,OAAO,aAAa,SAAY,EAAE,UAAU,OAAO,SAAS,IAAI,CAAC;AAAA,EACvE;AACA,MAAI,CAACJ,YAAW,GAAG,GAAG;AACpB,IAAAC,WAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACpC;AACA,EAAAE,eAAcK,QAAM,KAAK,UAAU,kBAAkB,MAAM,CAAC,GAAG,OAAO;AACxE;;;AD9CA,SAAS,iBAAyB;AAChC,QAAM,cAAc,cAAc;AAClC,SAAO,kBAAkB;AAAA,IACvB,GAAI,aAAa,YAAY,SAAY,EAAE,SAAS,YAAY,QAAQ,IAAI,CAAC;AAAA,EAC/E,CAAC,EAAE;AACL;AAEA,eAAsB,eAAe,MAAM,KAAK,IAAI,GAA4B;AAC9E,QAAM,KAAK,aAAa,eAAe,CAAC;AACxC,MAAI;AACF,UAAM,OAAO,IAAI,mBAAmB,EAAE;AACtC,WAAO,KAAK,iBAAiB,GAAG,EAAE,IAAI,CAAC,YAAY;AAAA,MACjD,IAAI,OAAO;AAAA,MACX,aAAa,OAAO;AAAA,MACpB,eAAe,OAAO;AAAA,MACtB,cAAc,OAAO;AAAA,MACrB,cAAc,OAAO,gBAAgB;AAAA,IACvC,EAAE;AAAA,EACJ,UAAE;AACA,kBAAc,EAAE;AAAA,EAClB;AACF;AAEA,eAAsB,mBAAmB,IAA8B;AACrE,QAAM,KAAK,aAAa,eAAe,CAAC;AACxC,MAAI;AACF,UAAM,OAAO,IAAI,mBAAmB,EAAE;AACtC,WAAO,KAAK,OAAO,EAAE;AAAA,EACvB,UAAE;AACA,kBAAc,EAAE;AAAA,EAClB;AACF;;;AE/CA,SAAS,SAAAC,cAAa;AAEtB,SAAS,eAAe,KAAkD;AACxE,UAAQ,QAAQ,UAAU;AAAA,IACxB,KAAK;AACH,aAAO,EAAE,SAAS,QAAQ,MAAM,CAAC,GAAG,EAAE;AAAA,IACxC,KAAK;AACH,aAAO,EAAE,SAAS,OAAO,MAAM,CAAC,MAAM,SAAS,IAAI,GAAG,EAAE;AAAA,IAC1D;AACE,aAAO,EAAE,SAAS,YAAY,MAAM,CAAC,GAAG,EAAE;AAAA,EAC9C;AACF;AAEA,eAAsB,YAAY,KAA4B;AAC5D,QAAM,EAAE,SAAS,KAAK,IAAI,eAAe,GAAG;AAE5C,QAAM,IAAI,QAAc,CAACC,UAAS,WAAW;AAC3C,UAAM,QAAQD,OAAM,SAAS,MAAM;AAAA,MACjC,UAAU;AAAA,MACV,OAAO;AAAA,MACP,aAAa;AAAA,IACf,CAAC;AAED,UAAM,KAAK,SAAS,MAAM;AAC1B,UAAM,KAAK,SAAS,MAAM;AACxB,YAAM,MAAM;AACZ,MAAAC,SAAQ;AAAA,IACV,CAAC;AAAA,EACH,CAAC;AACH;;;AC7BA,SAAS,WAAW,cAAAC,aAAY,UAAU,UAAU,YAAAC,iBAAgB;AAEpE,IAAM,oBAAoB;AAC1B,IAAM,oBAAoB;AAC1B,IAAM,oBAAoB,KAAK;AASxB,IAAM,cAAc,CAACC,WAAyB;AACnD,MAAI,CAACF,YAAWE,MAAI,GAAG;AACrB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,WAAOD,UAASC,MAAI,EAAE;AAAA,EACxB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,IAAM,iBAAiB,CAC5BA,QACA;AAAA,EACE,cAAc;AAAA,EACd,WAAW;AAAA,EACX,WAAW;AAAA,EACX,WAAW;AACb,IAAuB,CAAC,MACN;AAClB,MAAI,CAACF,YAAWE,MAAI,GAAG;AACrB,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,YAAYA,MAAI;AACjC,QAAM,aAAa,cAAc,WAAW,IAAI,KAAK,IAAI,GAAG,WAAW;AACvE,MAAI,aAAa,YAAY;AAC3B,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,KAAK,IAAI,WAAW,YAAY,QAAQ;AAC5D,QAAM,YAAY,WAAW;AAC7B,QAAM,SAAS,OAAO,YAAY,WAAW;AAC7C,QAAM,KAAK,SAASA,QAAM,GAAG;AAC7B,MAAI,UAAU;AACd,MAAI,gBAAgB;AAEpB,MAAI;AACF,UAAM,YAAY,SAAS,IAAI,QAAQ,GAAG,aAAa,SAAS;AAChE,QAAI,cAAc,GAAG;AACnB,aAAO;AAAA,IACT;AAEA,QAAI,YAAY,cAAc,YAAY,GAAG;AAC3C,YAAM,eAAe,OAAO,MAAM,CAAC;AACnC,YAAM,oBAAoB,SAAS,IAAI,cAAc,GAAG,GAAG,YAAY,CAAC;AACxE,sBAAgB,sBAAsB,KAAK,aAAa,CAAC,MAAM;AAAA,IACjE;AAEA,cAAU,OAAO,SAAS,SAAS,GAAG,SAAS,EAAE,QAAQ;AAAA,EAC3D,UAAE;AACA,cAAU,EAAE;AAAA,EACd;AAEA,MAAI,eAAe;AACjB,UAAM,oBAAoB,QAAQ,QAAQ,IAAI;AAC9C,QAAI,sBAAsB,IAAI;AAC5B,gBAAU,QAAQ,MAAM,oBAAoB,CAAC;AAAA,IAC/C;AAAA,EACF;AAEA,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,QACX,MAAM,QAAQ,EACd,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC,EAC5B,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;AACnC,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,QAAMC,WAAU,MAAM,MAAM,CAAC,QAAQ,EAAE,KAAK,IAAI;AAChD,MAAI,aAAa,QAAQA,SAAQ,UAAU,UAAU;AACnD,WAAOA;AAAA,EACT;AAEA,SAAO,SAAIA,SAAQ,MAAM,CAAC,WAAW,CAAC,CAAC;AACzC;;;AC7FO,IAAM,uBAAuB;AAEpC,SAAS,aAAa,SAA2C;AAC/D,QAAM,CAAC,QAAQ,KAAK,QAAQ,KAAK,QAAQ,GAAG,IAAI,QAAQ,MAAM,GAAG;AACjE,SAAO;AAAA,IACL,OAAO,SAAS,OAAO,EAAE,KAAK;AAAA,IAC9B,OAAO,SAAS,OAAO,EAAE,KAAK;AAAA,IAC9B,OAAO,SAAS,OAAO,EAAE,KAAK;AAAA,EAChC;AACF;AAEO,SAAS,uBAAuB,SAA0B;AAC/D,QAAM,UAAU,aAAa,OAAO;AACpC,QAAM,UAAU,aAAa,oBAAoB;AAEjD,WAAS,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AACtD,UAAM,cAAc,QAAQ,KAAK,KAAK;AACtC,UAAM,cAAc,QAAQ,KAAK,KAAK;AACtC,QAAI,cAAc,YAAa,QAAO;AACtC,QAAI,cAAc,YAAa,QAAO;AAAA,EACxC;AAEA,SAAO;AACT;AAEO,SAAS,2BAA2B,UAAU,QAAQ,SAAS,MAAY;AAChF,MAAI,uBAAuB,OAAO,GAAG;AACnC;AAAA,EACF;AAEA,QAAM,IAAI;AAAA,IACR,mCAAmC,oBAAoB,sEAAsE,OAAO;AAAA,EACtI;AACF;;;ACjCA,SAAS,cAAAC,aAAY,gBAAAC,qBAAoB;AAMlC,SAAS,6BAA6B,eAA4B;AACvE,QAAM,cAAc;AAAA,IAClB,IAAI,IAAI,mBAAmB,aAAa;AAAA,IACxC,IAAI,IAAI,sBAAsB,aAAa;AAAA,EAC7C,EAAE,KAAK,CAAC,cAAcD,YAAW,SAAS,CAAC;AAE3C,MAAI,CAAC,aAAa;AAChB,UAAM,IAAI,MAAM,mCAAmC;AAAA,EACrD;AAEA,SAAO;AACT;AAEO,SAAS,sBAAsB,eAA2C;AAC/E,SAAO,KAAK;AAAA,IACVC,cAAa,6BAA6B,aAAa,GAAG,OAAO;AAAA,EACnE;AACF;AAEO,SAAS,cAAc,eAA+B;AAC3D,SAAO,sBAAsB,aAAa,EAAE,WAAW;AACzD;;;ACfO,IAAM,uBACX;AAkBF,SAAS,iBAAiB,MAA2B;AACnD,SAAO,KAAK,WAAW;AACzB;AAEA,SAAS,gBAAgB,MAAqB;AAC5C,SAAO,KAAK;AACZ,SAAO,KAAK;AACZ,SAAO,KAAK;AACZ,SAAO,KAAK;AACZ,SAAO,KAAK;AACZ,SAAO,KAAK;AACd;AAEA,SAAS,cAAc,MAAqB;AAC1C,SAAO,KAAK;AACZ,SAAO,KAAK;AACd;AAEA,SAAS,cAAc,MAAqB;AAC1C,SAAO,KAAK;AACZ,SAAO,KAAK;AACd;AAEA,SAAS,WAAW,MAAe,SAA2B;AAC5D,MAAI,YAAY,UAAU;AACxB,oBAAgB,IAAI;AAAA,EACtB;AAEA,MAAI,YAAY,QAAQ;AACtB,kBAAc,IAAI;AAAA,EACpB;AAEA,MAAI,YAAY,QAAQ;AACtB,kBAAc,IAAI;AAAA,EACpB;AAEA,MAAI,YAAY,SAAS;AACvB,WAAO,KAAK;AAAA,EACd;AAEA,MAAI,YAAY,WAAW,YAAY,QAAQ;AAC7C,WAAO,KAAK;AAAA,EACd;AAEA,OAAK,UAAU;AACjB;AAEA,SAAS,mBAAmB,QAAuB;AACjD,QAAM,IAAI,MAAM,mBAAmB,MAAM,EAAE;AAC7C;AAEA,SAAS,qBAAqB,UAAyB;AACrD,QAAM,IAAI,MAAM,qBAAqB,QAAQ,EAAE;AACjD;AAEA,SAAS,oBAAoB,MAAe,QAAsB;AAChE,QAAM,UAAU,iBAAiB,IAAI;AAErC,MAAI,YAAY,UAAU;AACxB;AAAA,EACF;AAEA,MAAI,YAAY,SAAS;AACvB,UAAM,IAAI,MAAM,oBAAoB;AAAA,EACtC;AAEA,qBAAmB,MAAM;AAC3B;AAEA,SAAS,gBAAgB,MAAgB,OAAe,OAAuB;AAC7E,QAAM,QAAQ,KAAK,KAAK;AAExB,MAAI,UAAU,QAAW;AACvB,UAAM,IAAI,MAAM,WAAW,KAAK,QAAQ;AAAA,EAC1C;AAEA,SAAO;AACT;AAEO,SAAS,UAAU,MAAyB;AACjD,QAAM,OAAgB,CAAC;AAEvB,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,MAAM,KAAK,CAAC;AAClB,QAAI,QAAQ,QAAW;AACrB;AAAA,IACF;AAEA,YAAQ,KAAK;AAAA,MACX,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,mBAAW,MAAM,GAAG;AACpB;AAAA,MAEF,KAAK;AACH,mBAAW,MAAM,OAAO;AACxB;AAAA,MAEF,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,YAAI,KAAK,YAAY,UAAU;AAC7B,eAAK,aAAa;AAClB;AAAA,QACF;AAEA,mBAAW,MAAM,MAAM;AACvB;AAAA,MAEF,KAAK;AAAA,MACL,KAAK;AACH,mBAAW,MAAM,SAAS;AAC1B;AAAA,MAEF,KAAK;AACH,YAAI,iBAAiB,IAAI,MAAM,SAAS;AACtC,6BAAmB,GAAG;AAAA,QACxB;AAEA,aAAK,aAAa;AAClB;AAAA,MAEF,KAAK,aAAa;AAChB,cAAM,UAAU,iBAAiB,IAAI;AAErC,YAAI,YAAY,WAAW,YAAY,QAAQ;AAC7C,6BAAmB,GAAG;AAAA,QACxB;AAEA,aAAK,UAAU;AACf;AAAA,MACF;AAAA,MAEA,KAAK,UAAU;AACb,YAAI,iBAAiB,IAAI,MAAM,QAAQ;AACrC,6BAAmB,GAAG;AAAA,QACxB;AAEA,cAAM,YAAY,gBAAgB,MAAM,IAAI,GAAG,MAAM;AACrD,YAAI,CAAC,cAAc,KAAK,SAAS,GAAG;AAClC,gBAAM,IAAI,MAAM,qBAAqB;AAAA,QACvC;AAEA,cAAM,OAAO,OAAO,SAAS;AAC7B,YAAI,CAAC,OAAO,cAAc,IAAI,GAAG;AAC/B,gBAAM,IAAI,MAAM,qBAAqB;AAAA,QACvC;AAEA,aAAK,OAAO;AACZ,aAAK;AACL;AAAA,MACF;AAAA,MAEA,KAAK;AACH,YAAI,iBAAiB,IAAI,MAAM,QAAQ;AACrC,6BAAmB,GAAG;AAAA,QACxB;AAEA,aAAK,aAAa;AAClB;AAAA,MAEF,KAAK;AAAA,MACL,KAAK,MAAM;AACT,4BAAoB,MAAM,GAAG;AAC7B,cAAM,YAAY,gBAAgB,MAAM,IAAI,GAAG,MAAM;AACrD,cAAM,OAAO,OAAO,SAAS,WAAW,EAAE;AAE1C,YAAI,OAAO,MAAM,IAAI,GAAG;AACtB,gBAAM,IAAI,MAAM,qBAAqB;AAAA,QACvC;AAEA,aAAK,OAAO;AACZ,aAAK;AACL;AAAA,MACF;AAAA,MAEA,KAAK;AACH,4BAAoB,MAAM,GAAG;AAC7B,aAAK,OAAO,gBAAgB,MAAM,IAAI,GAAG,MAAM;AAC/C,aAAK;AACL;AAAA,MAEF,KAAK;AAAA,MACL,KAAK;AACH,4BAAoB,MAAM,GAAG;AAC7B,aAAK,UAAU,gBAAgB,MAAM,IAAI,GAAG,UAAU;AACtD,aAAK;AACL;AAAA,MAEF,KAAK;AACH,4BAAoB,MAAM,GAAG;AAC7B,aAAK,WAAW,gBAAgB,MAAM,IAAI,GAAG,UAAU;AACvD,aAAK;AACL;AAAA,MAEF,KAAK;AACH,YAAI,iBAAiB,IAAI,MAAM,SAAS;AACtC,gBAAM,IAAI,MAAM,oBAAoB;AAAA,QACtC;AAEA,2BAAmB,GAAG;AAAA,MAExB,KAAK;AAAA,MACL,KAAK;AACH,YAAI,iBAAiB,IAAI,MAAM,QAAQ;AACrC,+BAAqB,GAAG;AAAA,QAC1B;AAEA,aAAK,cAAc;AACnB;AAAA,MAEF,KAAK;AACH,YAAI,iBAAiB,IAAI,MAAM,UAAU,KAAK,gBAAgB,WAAW;AACvE,6BAAmB,GAAG;AAAA,QACxB;AAEA,aAAK,KAAK,gBAAgB,MAAM,IAAI,GAAG,IAAI;AAC3C,aAAK;AACL;AAAA,MAEF;AACE,YAAI,IAAI,WAAW,GAAG,GAAG;AACvB,6BAAmB,GAAG;AAAA,QACxB;AAEA,6BAAqB,GAAG;AAAA,IAC5B;AAAA,EACF;AAEA,MAAI,KAAK,YAAY,QAAW;AAC9B,SAAK,UAAU;AAAA,EACjB;AAEA,MAAI,KAAK,YAAY,QAAQ;AAC3B,QAAI,KAAK,gBAAgB,QAAW;AAClC,YAAM,IAAI,MAAM,yBAAyB;AAAA,IAC3C;AAEA,QAAI,KAAK,gBAAgB,aAAa,KAAK,OAAO,QAAW;AAC3D,YAAM,IAAI,MAAM,kBAAkB;AAAA,IACpC;AAAA,EACF;AAEA,SAAO;AACT;;;ACzRA;AACA,SAAS,aAAAC,kBAAiB;AAC1B,SAAS,WAAAC,gBAAe;AACxB,SAAS,QAAAC,cAAY;AAGd,IAAM,sBAAsB;AACnC,IAAM,uBAAuB;AAC7B,IAAM,iBAAiB;AACvB,IAAM,mBAAmB;AACzB,IAAM,qBAAqB;AAC3B,IAAM,yBAAyB;AAC/B,IAAM,2BAA2B;AACjC,IAAM,2BACJ;AA4BF,IAAM,8BAA8B,CAAC,UAA4B;AAC/D,MAAI,EAAE,iBAAiB,QAAQ;AAC7B,WAAO;AAAA,EACT;AAEA,SAAO,kCAAkC,KAAK,MAAM,OAAO;AAC7D;AAKA,IAAM,wBAAwB,CAAC,UAA4B;AACzD,MAAI,EAAE,iBAAiB,QAAQ;AAC7B,WAAO;AAAA,EACT;AACA,SACE,MAAM,QAAQ,SAAS,sBAAsB,KAC5C,MAAM,QAAQ,SAAS,oBAAoB,KAAK,MAAM,QAAQ,SAAS,KAAK;AAEjF;AAWA,IAAI,YAA8B;AAElC,eAAe,UAA8B;AAC3C,MAAI,WAAW;AACb,WAAO;AAAA,EACT;AAEA,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,MAAM,OAAO,KAAK;AAC9B,gBAAY,IAAI;AAAA,EAClB,QAAQ;AACN,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,cAAY;AACZ,SAAO;AACT;AAEA,IAAM,aAAa,YAA2B;AAC5C,QAAM,MAAM,MAAM,QAAQ;AAC1B,SAAO,IAAI,QAAQ,CAACC,UAAS,WAAW;AACtC,QAAI,QAAQ,CAAC,UAAU;AACrB,UAAI,OAAO;AACT,eAAO,KAAK;AACZ;AAAA,MACF;AAEA,MAAAA,SAAQ;AAAA,IACV,CAAC;AAAA,EACH,CAAC;AACH;AAEA,IAAM,QAAQ,OAAO,OACnB,IAAI,QAAQ,CAACA,aAAY;AACvB,aAAWA,UAAS,EAAE;AACxB,CAAC;AAEH,IAAM,gBAAgB,YAA2B;AAC/C,QAAM,MAAM,MAAM,QAAQ;AAC1B,QAAM,IAAI,QAAc,CAACA,aAAY;AACnC,QAAI,UAAU;AACd,UAAM,SAAS,MAAM;AACnB,UAAI,SAAS;AACX;AAAA,MACF;AAEA,gBAAU;AACV,MAAAA,SAAQ;AAAA,IACV;AAEA,UAAM,QAAQ,WAAW,QAAQ,sBAAsB;AACvD,QAAI;AACF,UAAI,WAAW,MAAM;AACnB,qBAAa,KAAK;AAClB,eAAO;AAAA,MACT,CAAC;AAAA,IACH,QAAQ;AACN,mBAAa,KAAK;AAClB,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AACH;AAEA,IAAM,wBAAwB,OAAO,QACnC,IAAI,QAAQ,CAACA,UAAS,WAAW;AAC/B,MAAI,SAAS,qBAAqB,CAAC,OAAO,WAAW;AACnD,QAAI,OAAO;AACT,aAAO,KAAK;AACZ;AAAA,IACF;AACA,IAAAA,SAAS,UAAU,CAAC,CAA6B;AAAA,EACnD,CAAC;AACH,CAAC;AAEH,IAAM,sBAAsB,OAAO,QACjC,IAAI,QAAQ,CAACA,UAAS,WAAW;AAC/B,MAAI,OAAO,qBAAqB,CAAC,UAAU;AACzC,QAAI,OAAO;AACT,aAAO,KAAK;AACZ;AAAA,IACF;AACA,IAAAA,SAAQ;AAAA,EACV,CAAC;AACH,CAAC;AAMH,IAAM,gBAAgB,YAA2B;AAC/C,QAAM,MAAM,MAAM,QAAQ;AAC1B,SAAO,IAAI,QAAQ,CAACA,aAAY;AAC9B,QAAI,KAAK,MAAM;AACb,MAAAA,SAAQ;AAAA,IACV,CAAC;AAAA,EACH,CAAC;AACH;AAMA,IAAM,sBAAsB,YAAgC;AAC1D,MAAI;AACF,UAAM,WAAW;AACjB,WAAO,QAAQ;AAAA,EACjB,SAAS,OAAO;AACd,QAAI,sBAAsB,KAAK,GAAG;AAChC,cAAQ,KAAK,6DAA6D;AAC1E,UAAI;AACF,cAAM,cAAc;AAAA,MACtB,QAAQ;AAAA,MAER;AACA,YAAM,MAAM,GAAI;AAEhB,kBAAY;AACZ,YAAM,WAAW;AACjB,aAAO,QAAQ;AAAA,IACjB,OAAO;AACL,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,IAAM,oBAAoB,OAAU,cAA0D;AAC5F,QAAM,MAAM,MAAM,oBAAoB;AAEtC,MAAI;AACF,WAAO,MAAM,UAAU,GAAG;AAAA,EAC5B,UAAE;AACA,UAAM,cAAc;AAAA,EACtB;AACF;AAEA,IAAM,sBAAsB,OAC1B,KACA,QACA,eACkB;AAClB,QAAM,WAAW,KAAK,IAAI,IAAI;AAE9B,SAAO,KAAK,IAAI,KAAK,UAAU;AAC7B,QAAI,kBAAkB,GAAG;AACvB;AAAA,IACF;AAEA,UAAM,YAAY,MAAM,sBAAsB,GAAG;AACjD,UAAMC,WAAU,UAAU,CAAC;AAC3B,QAAI,CAACA,UAAS;AACZ,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,SAASA,SAAQ,SAAS;AAChC,QAAI,WAAW,aAAa,WAAW,WAAW;AAChD,YAAM,mBAAmB,mCAAmC,MAAM,UAAU,UAAU;AAAA,IACxF;AAEA,UAAM,cAAc,WAAW,KAAK,IAAI;AACxC,QAAI,eAAe,GAAG;AACpB;AAAA,IACF;AAEA,UAAM,MAAM,KAAK,IAAI,0BAA0B,WAAW,CAAC;AAAA,EAC7D;AAEA,QAAM,mBAAmB,qCAAqC,MAAM,MAAM,UAAU;AACtF;AAEA,IAAM,+BAA+B,OAAO,KAAgB,WAAkC;AAC5F,QAAM,WAAW,KAAK,IAAI,IAAI;AAE9B,SAAO,KAAK,IAAI,KAAK,UAAU;AAC7B,UAAM,YAAY,MAAM,sBAAsB,GAAG;AACjD,QAAI,UAAU,WAAW,GAAG;AAC1B;AAAA,IACF;AAEA,UAAM,cAAc,WAAW,KAAK,IAAI;AACxC,QAAI,eAAe,GAAG;AACpB;AAAA,IACF;AAEA,UAAM,MAAM,KAAK,IAAI,0BAA0B,WAAW,CAAC;AAAA,EAC7D;AAEA,QAAM,IAAI,MAAM,0DAA0D,MAAM,KAAK;AACvF;AAEA,IAAM,+BAA+B,OACnC,KACA;AAAA,EACE,gBAAgB;AAClB,IAEI,CAAC,MACgB;AACrB,QAAM,YAAY,MAAM,sBAAsB,GAAG;AACjD,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,oBAAoB,GAAG;AAAA,EAC/B,SAAS,OAAO;AACd,QAAI,iBAAiB,4BAA4B,KAAK,GAAG;AACvD,YAAM,6BAA6B,KAAK,kBAAkB;AAC1D,aAAO;AAAA,IACT;AAEA,UAAM;AAAA,EACR;AAEA,QAAM,6BAA6B,KAAK,kBAAkB;AAC1D,SAAO;AACT;AAEA,IAAM,qBAAqB,MAAY;AACrC,EAAAC,WAAUC,OAAKC,SAAQ,GAAG,iBAAiB,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AACzE;AAEO,IAAM,cAAc,OAAO;AAAA,EAChC,SAASD,OAAKC,SAAQ,GAAG,iBAAiB,QAAQ,gBAAgB;AAAA,EAClE,SAASD,OAAKC,SAAQ,GAAG,iBAAiB,QAAQ,gBAAgB;AACpE;AAEA,IAAM,2BAA2B,MAAyB;AACxD,QAAM,EAAE,SAAS,QAAQ,IAAI,YAAY;AACzC,SAAO;AAAA,IACL,WAAW,YAAY,OAAO;AAAA,IAC9B,WAAW,YAAY,OAAO;AAAA,EAChC;AACF;AAEA,IAAM,2BAA2B,CAAC,YAA8C;AAC9E,QAAM,EAAE,SAAS,QAAQ,IAAI,YAAY;AACzC,QAAM,WAAqB,CAAC;AAC5B,QAAM,aAAa,eAAe,SAAS,EAAE,aAAa,QAAQ,UAAU,CAAC;AAC7E,QAAM,aACJ,YAAY,UAAU,OAAO,eAAe,SAAS,EAAE,aAAa,QAAQ,UAAU,CAAC;AAEzF,MAAI,YAAY;AACd,aAAS,KAAK,6BAA6B,OAAO;AAAA,EAAO,UAAU,EAAE;AAAA,EACvE;AAEA,MAAI,YAAY;AACd,aAAS,KAAK,8BAA8B,OAAO;AAAA,EAAO,UAAU,EAAE;AAAA,EACxE;AAEA,SAAO,SAAS,WAAW,IAAI,OAAO,SAAS,KAAK,MAAM;AAC5D;AAEA,IAAM,qBAAqB,CAAC,QAAgB,YAAsC;AAChF,QAAM,UAAU,yBAAyB,OAAO;AAChD,QAAM,UAAU;AAAA,IACd,+CAA+C,MAAM;AAAA,IACrD,GAAI,UAAU,CAAC,OAAO,IAAI,CAAC;AAAA,IAC3B;AAAA,EACF,EAAE,KAAK,MAAM;AAEb,SAAO,IAAI,MAAM,OAAO;AAC1B;AAEO,IAAM,sBAAsB,OAAO;AAAA,EACxC,gBAAgB;AAClB,IAEI,CAAC,MACH,kBAAkB,CAAC,QAAQ,6BAA6B,KAAK,EAAE,cAAc,CAAC,CAAC;AAE1E,IAAM,qBAAqB,OAAO;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MACE,kBAAkB,OAAO,QAAQ;AAC/B,QAAM,6BAA6B,KAAK,EAAE,eAAe,KAAK,CAAC;AAE/D,MAAI,kBAAkB,GAAG;AACvB,wBAAoB;AAAA,EACtB;AAEA,qBAAmB;AACnB,QAAM,EAAE,SAAS,QAAQ,IAAI,YAAY;AACzC,QAAM,aAAa,yBAAyB;AAE5C,QAAM,IAAI,QAAc,CAACJ,UAAS,WAAW;AAC3C,QAAI;AAAA,MACF;AAAA,QACE,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,GAAI,SAAS,SAAY,EAAE,KAAK,IAAI,CAAC;AAAA,QACrC,KAAK;AAAA,UACH,GAAG,QAAQ;AAAA,UACX,UAAU;AAAA,QACZ;AAAA,QACA,aAAa;AAAA,QACb,eAAe;AAAA,QACf,YAAY;AAAA,QACZ,cAAc;AAAA,QACd,UAAU;AAAA,QACV,YAAY;AAAA,MACd;AAAA,MACA,CAAC,UAAU;AACT,YAAI,OAAO;AACT,iBAAO,KAAK;AACZ;AAAA,QACF;AAEA,QAAAA,SAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,oBAAoB,KAAK,QAAQ,UAAU;AACnD,CAAC;AAEI,IAAM,yBAAyB,YACpC,kBAAkB,OAAO,QAAQ;AAC/B,QAAM,YAAY,MAAM,sBAAsB,GAAG;AACjD,QAAMC,WAAU,UAAU,CAAC;AAE3B,MAAI,CAACA,UAAS;AACZ,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,cAAc;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,SAASA,SAAQ,SAAS;AAChC,QAAM,eAAeA,SAAQ,SAAS,gBAAgB;AACtD,QAAM,SAASA,SAAQ,OAAO;AAE9B,MAAI,WAAW,UAAU;AACvB,WAAO;AAAA,MACL,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,WAAW,aAAa;AAC1B,WAAO;AAAA,MACL,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,WAAW,WAAW;AACxB,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI,WAAW,QAAQ,WAAW,GAAG;AACnC,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,EACF;AACF,CAAC;;;ACncH,SAAS,SAAS,OAAO,UAAU,cAAc;AACjD,SAAS,uBAAuB;AAEzB,SAAS,uBAAgC;AAC9C,SAAO,QAAQ,MAAM,SAAS,OAAO,KAAK;AAC5C;AAEA,eAAsB,aAAa,QAAkC;AACnE,QAAM,KAAK,gBAAgB,EAAE,OAAO,OAAO,CAAC;AAE5C,MAAI;AACF,UAAM,UAAU,MAAM,GAAG,SAAS,MAAM,GAAG,KAAK,EAAE,YAAY;AAC9D,WAAO,WAAW,OAAO,WAAW;AAAA,EACtC,UAAE;AACA,OAAG,MAAM;AAAA,EACX;AACF;;;AChBA;AAcA,eAAsB,oBAAsC;AAC1D,QAAM,UAAU,MAAM,oBAAoB,EAAE,eAAe,KAAK,CAAC;AAEjE,MAAI,kBAAkB,GAAG;AACvB,wBAAoB;AAAA,EACtB;AAEA,SAAO;AACT;AAMA,eAAsB,kBAAyC;AAC7D,QAAM,gBAAgB,MAAM,uBAAuB;AACnD,QAAM,UAAU,kBAAkB;AAClC,QAAM,EAAE,SAAS,QAAQ,IAAI,YAAY;AAEzC,MAAI,cAAc,WAAW,aAAc,cAAc,WAAW,QAAQ,YAAY,MAAO;AAC7F,QAAI,SAAS;AACX,0BAAoB;AAAA,IACtB;AAEA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,KAAK;AAAA,MACL,MAAM;AAAA,MACN,MAAM;AAAA,MACN,cAAc;AAAA,MACd;AAAA,MACA;AAAA,MACA,WAAW;AAAA,IACb;AAAA,EACF;AAEA,SAAO;AAAA,IACL,QAAQ,UAAU,cAAc,SAAS;AAAA,IACzC,KAAK,SAAS,OAAO,cAAc;AAAA,IACnC,MAAM,SAAS,QAAQ;AAAA,IACvB,MAAM,SAAS,QAAQ;AAAA,IACvB,cAAc,cAAc;AAAA,IAC5B;AAAA,IACA;AAAA,IACA,WAAW,SAAS,aAAa;AAAA,EACnC;AACF;;;AC3DA,MAAAI;AACA,SAAS,aAAAC,kBAAiB;AAC1B,SAAS,WAAAC,gBAAe;AACxB,SAAS,iBAAAC,sBAAqB;;;ACG9B,SAAS,cAAAC,oBAAkB;AAC3B,SAAS,WAAAC,UAAS,WAAAC,gBAAe;AACjC,SAAS,qBAAqB;AAE9B,IAAM,aAAa,cAAc,YAAY,GAAG;AAChD,IAAM,YAAYD,SAAQ,UAAU;AAGpC,IAAM,iBAAiBC,SAAQ,WAAW,QAAQ;AAK3C,SAAS,qBAA6B;AAC3C,SAAO;AACT;AAKO,SAAS,eAAwB;AACtC,SAAOF,aAAW,cAAc;AAClC;;;ADnBA,IAAM,6BAA6B;AAE5B,IAAM,oBAAoB,MAA6B;AAC5D,QAAM,cAAc,cAAc;AAClC,QAAM,SAAgC;AAAA,IACpC,YAAY,cAAc,YAAY,GAAG;AAAA,IACzC,GAAI,aAAa,SAAS,SAAY,EAAE,MAAM,YAAY,KAAK,IAAI,CAAC;AAAA,IACpE,GAAI,aAAa,SAAS,UAAa,YAAY,OAAO,IAAI,EAAE,MAAM,YAAY,KAAK,IAAI,CAAC;AAAA,IAC5F,GAAI,aAAa,YAAY,SAAY,EAAE,SAAS,YAAY,QAAQ,IAAI,CAAC;AAAA,IAC7E,GAAI,aAAa,aAAa,SAC1B;AAAA,MACE,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,UAAU,YAAY;AAAA,MACxB;AAAA,IACF,IACA,CAAC;AAAA,EACP;AAEA,MAAI,aAAa,GAAG;AAClB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS,mBAAmB;AAAA,IAC9B;AAAA,EACF;AAEA,UAAQ,KAAK,0BAA0B;AACvC,SAAO;AACT;AAEO,IAAM,mCAAmC,MAAY;AAC1D,QAAM,SAAS,kBAAkB,kBAAkB,CAAC;AACpD,MAAI,OAAO,YAAY,YAAY;AACjC,IAAAG,WAAUC,SAAQ,OAAO,OAAO,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,EACxD;AAEA,QAAM,KAAK,aAAa,OAAO,OAAO;AACtC,gBAAc,EAAE;AAClB;AAEA,IAAM,wBAAwB,CAAC,WAAmB,YAAY;AAC5D,QAAM,OAAO,KAAK;AAClB,UAAQ,KAAK,CAAC;AAChB;AAEA,IAAM,qBAAqB,CAAC,WAAmB,cAAgC;AAC7E,MAAI,cAAc,QAAW;AAC3B,WAAO;AAAA,EACT;AAEA,MAAI,UAAU,SAAS,yBAAyB,GAAG;AACjD,WAAO;AAAA,EACT;AAEA,QAAM,aAAaC,eAAc,SAAS;AAC1C,QAAM,CAAC,WAAW,IAAI,UAAU,MAAM,OAAO,CAAC;AAC9C,SAAO,gBAAgB;AACzB;AAEO,IAAM,sBAAsB,OAAO,WAAmB,cAAsC;AACjG,MAAI,CAAC,mBAAmB,WAAW,SAAS,GAAG;AAC7C;AAAA,EACF;AAEA,QAAM,YAAY;AACpB;AAEO,IAAM,cAAc,YAA6B;AACtD,6BAA2B;AAC3B,QAAM,EAAE,cAAAC,cAAa,IAAI,MAAM;AAC/B,QAAM,SAAS,MAAMA,cAAa,kBAAkB,CAAC;AACrD,QAAM,WAAW,sBAAsB,MAAM;AAE7C,UAAQ,GAAG,UAAU,QAAQ;AAC7B,UAAQ,GAAG,WAAW,QAAQ;AAE9B,SAAO;AACT;AAEA,KAAK,oBAAoB,YAAY,KAAK,QAAQ,KAAK,CAAC,CAAC;;;AEvFzD,SAAS,eAAe,MAAuB;AAC7C,SAAO,SAAS,aAAa,SAAS,QAAQ,SAAS;AACzD;AAEA,SAAS,cAAc,MAAsB;AAC3C,SAAO,KAAK,SAAS,GAAG,KAAK,CAAC,KAAK,WAAW,GAAG,IAAI,IAAI,IAAI,MAAM;AACrE;AAEO,SAAS,YAAY,QAAqC;AAC/D,SAAO,OAAO;AAChB;AAEO,SAAS,aAAa,QAAqC;AAChE,MAAI,OAAO,SAAS,QAAQ,OAAO,SAAS,MAAM;AAChD,WAAO;AAAA,EACT;AAEA,SAAO,UAAU,cAAc,OAAO,IAAI,CAAC,IAAI,OAAO,IAAI;AAC5D;AAEO,SAAS,cAAc,QAAqC;AACjE,MAAI,OAAO,SAAS,MAAM;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,OACJ,OAAO,SAAS,QAAQ,OAAO,SAAS,eAAe,eAAe,OAAO,IAAI,IAC7E,cACA,cAAc,OAAO,IAAI;AAE/B,SAAO,UAAU,IAAI,IAAI,OAAO,IAAI;AACtC;;;AbjBA,IAAM,yBAAyB;AAC/B,IAAM,yBAAyB;AAE/B,SAAS,aAAa,QAAkC;AACtD,SAAO,KAAK,UAAU,UAAU,CAAC,GAAG,MAAM,CAAC;AAC7C;AAEA,SAAS,aAAa,QAA8B;AAClD,QAAM,YAAY,aAAa,MAAM,KAAK;AAC1C,QAAM,aAAa,cAAc,MAAM,KAAK;AAC5C,QAAM,YAAY,OAAO,cAAc,OAAO,QAAQ,IAAI,KAAK,OAAO,SAAS,EAAE,YAAY;AAE7F,SAAO;AAAA,IACL,WAAW,OAAO,MAAM;AAAA,IACxB,gBAAgB,OAAO,QAAQ,KAAK;AAAA,IACpC,cAAc,YAAY,MAAM,KAAK,KAAK;AAAA,IAC1C,SAAS,OAAO,QAAQ,KAAK;AAAA,IAC7B,eAAe,SAAS;AAAA,IACxB,cAAc,UAAU;AAAA,IACxB,QAAQ,OAAO,OAAO,KAAK;AAAA,IAC3B,YAAY,SAAS;AAAA,IACrB,aAAa,OAAO,YAAY;AAAA,IAChC,YAAY,OAAO,OAAO;AAAA,IAC1B,cAAc,OAAO,OAAO;AAAA,EAC9B,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,SACP,QACA;AAAA,EACE,OAAO;AAAA,EACP,aAAa;AACf,IAA6C,CAAC,GACxC;AACN,QAAM,QAAQ,aAAa,CAAC,OAAO,OAAO,IAAI,CAAC,OAAO,SAAS,OAAO,OAAO;AAC7E,QAAM,WAAW,MACd,OAAO,CAACC,QAAM,OAAOC,WAAUA,OAAM,QAAQD,MAAI,MAAM,KAAK,EAC5D,QAAQ,CAACA,WAAS;AACjB,UAAM,UAAU,eAAeA,QAAM,EAAE,UAAU,MAAM,UAAU,KAAK,CAAC;AACvE,WAAO,UAAU,CAAC,OAAO,IAAI,CAAC;AAAA,EAChC,CAAC;AAEH,UAAQ,IAAI,SAAS,WAAW,IAAI,uBAAuB,SAAS,KAAK,IAAI,CAAC;AAChF;AAEA,SAAS,WAAiB;AACxB,UAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAyCb;AACD;AAEA,SAAS,iBAAuB;AAC9B,UAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAyBb;AACD;AAEA,SAAS,cAAoB;AAC3B,UAAQ,IAAI,8BAA8B,cAAc,YAAY,GAAG,CAAC,EAAE;AAC5E;AAEA,SAAS,iBAAiB,QAA4D;AACpF,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AACvC;AAEA,SAAS,2BAAmC;AAC1C,QAAM,cAAcE,eAAc,YAAY,GAAG;AACjD,QAAM,aAAaC,SAAQ,WAAW;AACtC,QAAM,aAAa;AAAA,IACjBC,OAAK,YAAY,kBAAkB;AAAA,IACnCA,OAAK,YAAY,mBAAmB;AAAA,IACpCA,OAAK,YAAY,yBAAyB;AAAA,EAC5C;AAEA,QAAM,aAAa,WAAW,KAAK,CAAC,cAAcC,aAAW,SAAS,CAAC;AACvE,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,QAA+B;AACtD,SAAO,OAAO,WAAW,aAAa,OAAO,WAAW;AAC1D;AAOA,eAAe,2BAA2B,QAAwC;AAChF,QAAM,aAAa,cAAc,MAAM,KAAK,aAAa,MAAM,KAAK;AAEpE,MAAI,CAAC,qBAAqB,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,SAAO,aAAa,sCAAsC,UAAU,sBAAsB;AAC5F;AAEA,eAAe,sBAAsB,eAAe,OAAwC;AAC1F,QAAM,SAAS,MAAM,gBAAgB;AACrC,MAAI,CAAC,gBAAgB,MAAM,GAAG;AAC5B,WAAO;AAAA,MACL,gBAAgB;AAAA,MAChB,kBAAkB;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,UAAU,eAAe,OAAO,MAAM,2BAA2B,MAAM;AAC7E,MAAI,CAAC,SAAS;AACZ,UAAM,aAAa,cAAc,MAAM,KAAK,aAAa,MAAM,KAAK;AACpE,QAAI,CAAC,qBAAqB,GAAG;AAC3B,cAAQ;AAAA,QACN,sCAAsC,UAAU;AAAA,MAClD;AAAA,IACF,OAAO;AACL,cAAQ,IAAI,uDAAuD,UAAU,GAAG;AAAA,IAClF;AACA,WAAO;AAAA,MACL,gBAAgB;AAAA,MAChB,kBAAkB;AAAA,IACpB;AAAA,EACF;AAEA,UAAQ,IAAI,+CAA+C;AAC3D,SAAO;AAAA,IACL,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,EACpB;AACF;AAEA,eAAe,yBAAwC;AACrD,QAAM,mBAAmB;AAAA,IACvB,QAAQ,yBAAyB;AAAA,IACjC,KAAK,QAAQ,IAAI;AAAA,IACjB,QAAQ;AAAA,EACV,CAAC;AACH;AAOA,SAAS,6BAA6B,OAAoD;AACxF,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAClB,MAAI,UAAU,SAAS,4BAA4B,OAAO,UAAU,WAAW,UAAU;AACvF,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,UAAU;AAAA,EACpB;AACF;AAEA,eAAe,yBAAyB,OAAkC;AACxE,QAAM,UAAU,6BAA6B,KAAK;AAClD,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,qBAAqB,IAClC,MAAM;AAAA,IACJ,qCAAqC,QAAQ,MAAM;AAAA,EACrD,IACA;AAEJ,MAAI,CAAC,UAAU;AACb,UAAM;AAAA,EACR;AAEA,SAAO,QAAQ,QAAQ,EAAE,OAAO,KAAK,CAAC;AACtC,SAAO;AACT;AAEA,eAAe,qCAAoD;AACjE,MAAI;AACF,qCAAiC;AAAA,EACnC,SAAS,OAAO;AACd,UAAM,UAAU,MAAM,yBAAyB,KAAK;AACpD,QAAI,CAAC,SAAS;AACZ,YAAM;AAAA,IACR;AAEA,qCAAiC;AAAA,EACnC;AACF;AAEA,eAAe,2BAA2B,gBAAqD;AAC7F,QAAM,SAAS,kBAAmB,MAAM,gBAAgB;AACxD,QAAM,aAAa,cAAc,MAAM;AAEvC,MAAI,eAAe,MAAM;AACvB,UAAM,IAAI,MAAM,mDAAmD;AAAA,EACrE;AAEA,UAAQ,IAAI,yCAAyC,UAAU,EAAE;AACjE,QAAM,YAAY,UAAU;AAC9B;AAEA,eAAsB,KAAK,OAAO,QAAQ,KAAK,MAAM,CAAC,GAAkB;AACtE,6BAA2B;AAC3B,QAAM,OAAO,UAAU,IAAI;AAE3B,MAAI,KAAK,YAAY,UAAU;AAC7B,QAAI,KAAK,YAAY;AACnB,qBAAe;AACf;AAAA,IACF;AAEA,QACE,KAAK,SAAS,UACd,KAAK,SAAS,UACd,KAAK,YAAY,UACjB,KAAK,aAAa,QAClB;AACA,cAAQ,IAAI,aAAa,cAAc,CAAC,CAAC;AACzC;AAAA,IACF;AAEA,UAAM,cAAc,cAAc;AAClC,UAAM,aAAwB;AAAA,MAC5B,GAAI,aAAa,SAAS,SAAY,EAAE,MAAM,YAAY,KAAK,IAAI,CAAC;AAAA,MACpE,GAAI,aAAa,SAAS,UAAa,YAAY,OAAO,IACtD,EAAE,MAAM,YAAY,KAAK,IACzB,CAAC;AAAA,MACL,GAAI,aAAa,YAAY,SAAY,EAAE,SAAS,YAAY,QAAQ,IAAI,CAAC;AAAA,MAC7E,GAAI,aAAa,aAAa,SAAY,EAAE,UAAU,YAAY,SAAS,IAAI,CAAC;AAAA,MAChF,GAAI,KAAK,SAAS,SAAY,EAAE,MAAM,KAAK,KAAK,IAAI,CAAC;AAAA,MACrD,GAAI,KAAK,SAAS,SAAY,EAAE,MAAM,KAAK,KAAK,IAAI,CAAC;AAAA,MACrD,GAAI,KAAK,YAAY,SAAY,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,MAC9D,GAAI,KAAK,aAAa,SAAY,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;AAAA,IACnE;AACA,mBAAe,UAAU;AACzB,YAAQ,IAAI,aAAa,UAAU,CAAC;AACpC;AAAA,EACF;AAEA,MAAI,KAAK,YAAY,QAAQ;AAC3B,UAAM,UAAU,MAAM,kBAAkB;AACxC,YAAQ,IAAI,UAAU,iCAAiC,uCAAuC;AAC9F;AAAA,EACF;AAEA,MAAI,KAAK,YAAY,UAAU;AAC7B,YAAQ,IAAI,aAAa,MAAM,gBAAgB,CAAC,CAAC;AACjD;AAAA,EACF;AAEA,MAAI,KAAK,YAAY,QAAQ;AAC3B,aAAS,MAAM,gBAAgB,GAAG,EAAE,MAAM,KAAK,MAAM,YAAY,KAAK,WAAW,CAAC;AAClF;AAAA,EACF;AAEA,MAAI,KAAK,YAAY,QAAQ;AAC3B,aAAS;AACT;AAAA,EACF;AAEA,MAAI,KAAK,YAAY,WAAW;AAC9B,gBAAY;AACZ;AAAA,EACF;AAEA,MAAI,KAAK,YAAY,QAAQ;AAC3B,QAAI,KAAK,gBAAgB,YAAY;AACnC,cAAQ,IAAI,iBAAiB,MAAM,eAAe,CAAC,CAAC;AACpD;AAAA,IACF;AAEA,QAAI,KAAK,gBAAgB,WAAW;AAClC,YAAM,UAAU,MAAM,mBAAmB,KAAK,EAAG;AACjD,cAAQ,IAAI,UAAU,iBAAiB,KAAK,EAAE,KAAK,0BAA0B,KAAK,EAAE,EAAE;AACtF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,KAAK,YAAY,QAAQ;AAC3B,UAAMC,WAAU,MAAM,sBAAsB,KAAK,OAAO;AACxD,QAAIA,SAAQ,mBAAmB,MAAM;AACnC,YAAM,mCAAmC;AACzC,YAAM,uBAAuB;AAAA,IAC/B;AAEA,UAAM,2BAA2BA,SAAQ,cAAc;AACvD;AAAA,EACF;AAEA,MAAI,KAAK,YAAY;AACnB,UAAMA,WAAU,MAAM,sBAAsB,KAAK,OAAO;AACxD,QAAIA,SAAQ,mBAAmB,MAAM;AACnC;AAAA,IACF;AAEA,QAAIA,SAAQ,kBAAkB;AAC5B,YAAM,kBAAkB;AAAA,IAC1B;AAEA,YAAQ,IAAI,+CAA+C;AAC3D,QAAI;AACF,YAAM,YAAY;AAAA,IACpB,SAAS,OAAO;AACd,YAAM,UAAU,MAAM,yBAAyB,KAAK;AACpD,UAAI,CAAC,SAAS;AACZ,cAAM;AAAA,MACR;AACA,YAAM,YAAY;AAAA,IACpB;AACA;AAAA,EACF;AAEA,QAAM,UAAU,MAAM,sBAAsB,KAAK,OAAO;AACxD,MAAI,QAAQ,mBAAmB,MAAM;AACnC;AAAA,EACF;AAEA,QAAM,mCAAmC;AACzC,QAAM,uBAAuB;AAE7B,UAAQ,IAAI,4CAA4C;AACxD,UAAQ,IAAI,kDAAkD;AAChE;;;AcxZA,KAAK,KAAK,EAAE,MAAM,CAAC,UAAU;AAC3B,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,UAAQ,MAAM,cAAc,OAAO;AACnC,UAAQ,KAAK,CAAC;AAChB,CAAC;",
6
6
  "names": ["isFrontendNavigationRequest", "path", "handlers", "z", "init_config_schema", "init_supervisor_eval", "init_config_schema", "init_definition", "init_config_schema", "init_supervisor_eval", "init_definition", "init_config_schema", "init_definition", "path", "fs", "path", "readFileSync", "existsSync", "init_src", "dirname", "resolve", "path", "stat", "isAbsolute", "relative", "mkdir", "path", "input", "targetDir", "relative", "rm", "stat", "path", "rm", "stat", "writeFile", "now", "originalName", "target", "resolve", "resolve", "init_src", "runCommand", "existsSync", "mkdirSync", "readFileSync", "writeFileSync", "dirname", "join", "runCommand", "path", "randomUUID", "runCommand", "z", "init_definition", "init_idle_heuristics", "init_src", "init_definition", "init_idle_heuristics", "z", "init_src", "prev", "readFileSync", "join", "DatabaseSync", "input", "input", "input", "chmodSync", "existsSync", "path", "resolve", "require", "stat", "init_src", "init_src", "spawn", "resolve", "output", "NOOP_LOGGER", "init_src", "createHash", "init_src", "input", "resolve", "NOOP_LOGGER", "init_manager", "init_src", "currentSupervisor", "workspace", "nextState", "recoveredSupervisor", "enriched", "mkdir", "readFile", "rm", "writeFile", "dirname", "join", "path", "input", "init_constants", "init_constants", "resolve", "init_types", "init_manager", "init_constants", "init_types", "existing", "resolve", "stat", "path", "existsSync", "readFileSync", "join", "relative", "path", "init_src", "init_manager", "path", "displacedWsClientId", "DEFAULT_OPTIONS", "z", "shellPath", "init_src", "bytes", "NOOP_LOGGER", "init_src", "resolve", "topic", "readdir", "homedir", "join", "z", "z", "z", "init_activation", "z", "z", "readdir", "stat", "join", "relative", "z", "path", "mkdir", "mkdtemp", "rm", "writeFile", "os", "path", "resolve", "output", "mkdtemp", "rm", "os", "path", "z", "init_git", "existsSync", "mkdirSync", "readFileSync", "writeFileSync", "homedir", "basename", "dirname", "join", "z", "init_settings", "init_src", "z", "z", "init_supervisor", "input", "path", "path", "z", "init_worktree", "z", "init_fencing", "init_activation", "init_git", "init_settings", "init_supervisor", "init_worktree", "init_fencing", "init_src", "init_manager", "path", "init_terminal", "init_manager", "init_types", "init_src", "init_terminal", "existsSync", "dirname", "join", "fileURLToPath", "init_src", "existsSync", "mkdirSync", "readFileSync", "writeFileSync", "homedir", "basename", "join", "input", "path", "spawn", "resolve", "existsSync", "statSync", "path", "excerpt", "existsSync", "readFileSync", "mkdirSync", "homedir", "join", "resolve", "process", "mkdirSync", "join", "homedir", "init_src", "mkdirSync", "dirname", "fileURLToPath", "existsSync", "dirname", "resolve", "mkdirSync", "dirname", "fileURLToPath", "createServer", "path", "paths", "fileURLToPath", "dirname", "join", "existsSync", "startup"]
7
7
  }