@agentconnect.md/daemon 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/daemon.ts","../src/config/load-config.ts","../src/config/config-schema.ts","../src/paths.ts","../src/agents/load-agents.ts","../src/agents/agent-schema.ts","../src/agents/agent-env.ts","../src/reconciler/reconciler.ts","../src/store/local-store.ts","../src/acp/acp-host.ts","../src/workspace/workspace-manager.ts","../src/session/session-manager.ts","../src/router/routing-table.ts","../src/router/routing-rule.ts","../src/router/cp-routing-layer.ts","../src/slack/connection.ts","../src/slack/normalize.ts","../src/slack/render.ts","../src/scheduler/scheduler.ts","../src/runtimes/registry.ts","../src/log.ts","../../protocol/src/envelope.ts","../../protocol/src/frames/auth.ts","../../protocol/src/frames/register.ts","../../protocol/src/frames/route.ts","../../protocol/src/frames/cron.ts","../../protocol/src/frames/secrets.ts","../../protocol/src/frames/agent.ts","../../protocol/src/frames/telemetry.ts","../../protocol/src/frames/error.ts","../../protocol/src/frame.ts","../../protocol/src/codec.ts","../src/cp/correlator.ts","../src/cp/client.ts","../src/cp/transport.ts","../src/cp/cp-cron.ts","../src/cp/config-apply.ts","../src/cp/clock.ts","../src/cli/chat.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from 'commander'\nimport { Daemon } from './daemon.js'\nimport { runChat } from './cli/chat.js'\n\n// CLI surface mirrors docs/designs/daemon-detailed-design.md §1.2.\n// All subcommands are stubs for now; wiring lands in later phases.\n\n// Replaced at build time by tsup (define); falls back when run from source (tsx).\ndeclare const __DAEMON_VERSION__: string | undefined\nconst version = typeof __DAEMON_VERSION__ === 'string' ? __DAEMON_VERSION__ : '0.0.0-dev'\n\nconst program = new Command()\n\nprogram.name('agentconnect').description('AgentConnect daemon — edge message + agent execution unit').version(version)\n\n// Process-level overrides (docs §1.3). Declared as global options so every\n// subcommand can read them; they take precedence over config.json.\nprogram\n .option('--config <path>', 'path to config.json (default ~/.agentconnect/config.json)')\n .option('--root <dir>', 'override ~/.agentconnect root directory')\n .option('--cp-url <url>', 'override controlPlane.url')\n .option('--cp-token <token>', 'override controlPlane.token')\n .option('--no-cp', 'run fully local, do not connect to the Control Plane')\n .option('--daemon-id <id>', 'override daemon identity')\n .option('--log-level <level>', 'trace|debug|info|warn|error')\n .option('--agents-dir <dir>', 'override agents directory')\n .option('--max-agents <n>', 'max agents this daemon advertises / enforces')\n .option('--dry-run', 'load + validate config and print the reconcile plan, then exit')\n .option('--agent <name>', 'select a single agent by id (run/chat)')\n\nconst todo = (name: string) => () => {\n console.log(`agentconnect: ${name} (not yet implemented)`)\n}\n\nprogram\n .command('run')\n .description('Run the daemon in the foreground')\n .action(async () => {\n const opts = program.opts()\n const daemon = new Daemon({\n root: opts.root,\n agentName: opts.agent,\n overrides: {\n cpUrl: opts.cpUrl,\n cpToken: opts.cpToken,\n noCp: opts.cp === false,\n daemonId: opts.daemonId,\n logLevel: opts.logLevel,\n agentsDir: opts.agentsDir,\n maxAgents: opts.maxAgents ? Number(opts.maxAgents) : undefined\n }\n })\n try {\n await daemon.start()\n } catch (err) {\n console.error(`agentconnect run: ${(err as Error).message}`)\n process.exit(1)\n }\n const shutdown = async () => {\n await daemon.stop()\n process.exit(0)\n }\n process.on('SIGINT', shutdown)\n process.on('SIGTERM', shutdown)\n console.log('agentconnect: daemon running (Ctrl-C to stop)')\n })\nprogram.command('start').description('Start the daemon in the background (detached)').action(todo('start'))\nprogram.command('stop').description('Gracefully stop the daemon').action(todo('stop'))\nprogram.command('restart').description('Restart the daemon').action(todo('restart'))\nprogram.command('status').description('Print runtime status').action(todo('status'))\nprogram.command('install-service').description('Install launchd / systemd service').action(todo('install-service'))\nprogram.command('uninstall-service').description('Uninstall the system service').action(todo('uninstall-service'))\nprogram.command('login').description('Write daemon-token / CP url into config').action(todo('login'))\n\nconst config = program.command('config').description('Read / write / validate config.json')\nconfig.command('get').action(todo('config get'))\nconfig.command('set').action(todo('config set'))\nconfig.command('validate').action(todo('config validate'))\nconfig.command('path').action(todo('config path'))\n\nconst agent = program.command('agent').description('Manage local agent directories')\nagent.command('list').action(todo('agent list'))\nagent.command('add [id]').action(todo('agent add'))\nagent.command('remove [id]').action(todo('agent remove'))\nagent.command('enable [id]').action(todo('agent enable'))\nagent.command('disable [id]').action(todo('agent disable'))\n\nprogram\n .command('chat [message]')\n .description('Discover an agent under --agents-dir (or --agent <name>) and chat over ACP')\n .action(async (message?: string) => {\n const opts = program.opts()\n try {\n await runChat({\n agentsDir: opts.agentsDir,\n agentName: opts.agent,\n message,\n configPath: opts.config,\n root: opts.root\n })\n process.exit(0)\n } catch (err) {\n console.error(`agentconnect chat: ${(err as Error).message}`)\n process.exit(1)\n }\n })\n\nprogram.parse()\n","import { randomUUID } from 'node:crypto'\nimport { hostname, loadavg, freemem, totalmem } from 'node:os'\nimport chokidar, { type FSWatcher } from 'chokidar'\nimport { loadConfig, persistDaemonId, type FlatOverrides } from './config/load-config.js'\nimport { loadAgents, selectAgent, type LoadedAgent } from './agents/load-agents.js'\nimport { agentChildEnv } from './agents/agent-env.js'\nimport { diffAgents } from './reconciler/reconciler.js'\nimport { resolveRoot, statePath } from './paths.js'\nimport { LocalStore } from './store/local-store.js'\nimport { AcpHost } from './acp/acp-host.js'\nimport { SessionManager } from './session/session-manager.js'\nimport { routeRules } from './router/routing-table.js'\nimport { rulesFromAgent, resolveCpRule, resolveAgentIntegration, type RoutingRule } from './router/routing-rule.js'\nimport { CpRoutingLayer } from './router/cp-routing-layer.js'\nimport { consolidate, SlackConnection } from './slack/connection.js'\nimport { OutputConverger, type SlackAction } from './slack/render.js'\nimport { Scheduler } from './scheduler/scheduler.js'\nimport { resolveRuntimes } from './runtimes/registry.js'\nimport { makeLogger, type Logger } from './log.js'\nimport { CpClient } from './cp/client.js'\nimport { ClientTransport } from './cp/transport.js'\nimport { CpCronRegistry } from './cp/cp-cron.js'\nimport { mergeConfigPush, type ConfigApply } from './cp/config-apply.js'\nimport { systemClock } from './cp/clock.js'\nimport type { Agent } from './agents/agent-schema.js'\nimport type { NormalizedMessage } from './messages/normalized.js'\nimport type { RegisterOk, CronUpsert, RouteAssign, RouteUpdate } from '@agentconnect.md/protocol'\n\nconst LOADING_MSGS = ['Working on it…', 'Crunching through it…', 'Hang tight…']\n\nexport class Daemon {\n private store!: LocalStore\n private agents = new Map<string, LoadedAgent>()\n private hosts = new Map<string, AcpHost>()\n private connections: SlackConnection[] = []\n private scheduler!: Scheduler\n private sessions!: SessionManager\n // integrationId -> the SlackConnection that owns it (for replies)\n private connByIntegration = new Map<string, SlackConnection>()\n private hostStarts = new Map<string, Promise<void>>()\n private watcher?: FSWatcher\n private debounceTimer?: NodeJS.Timeout\n private agentsDir = ''\n private cfg!: ReturnType<typeof loadConfig>\n private log: Logger = makeLogger('info')\n private root = ''\n private runtimes: Record<string, import('./config/config-schema.js').RuntimeDef> = {}\n private cpClient?: CpClient\n private cpCrons?: CpCronRegistry\n private botUserIds: Record<string, string> = {}\n private cpRouting?: CpRoutingLayer\n\n constructor(\n private opts: {\n root?: string\n overrides?: FlatOverrides\n agentName?: string\n hostFactory?: (agent: Agent, onUpdate: (sid: string, u: any) => void) => AcpHost\n } = {}\n ) {}\n\n async start(): Promise<void> {\n const root = resolveRoot(this.opts.root)\n const cfg = loadConfig({ root, overrides: this.opts.overrides, optional: !!this.opts.agentName, autoCreate: true })\n this.cfg = cfg\n // Mint a stable local daemonId only when we are NOT onboarding via a CP\n // token: with a `controlPlane.token` and no explicit id, the CP assigns the\n // id from the token's `sub` and the daemon adopts it (see startCpClient).\n const cpTokenOnboarding = !!(cfg.controlPlane?.enabled && cfg.controlPlane.token)\n if (!cfg.daemonId && !cpTokenOnboarding) {\n cfg.daemonId = randomUUID()\n persistDaemonId(root, cfg.daemonId)\n }\n this.log = makeLogger(cfg.logging.level)\n this.log.info(`starting daemon (root=${root})`)\n this.log.info(\n `control plane: ${cfg.controlPlane?.enabled ? `enabled (${cfg.controlPlane.url ?? 'no url'})` : 'disabled — running local'}`\n )\n this.agentsDir = cfg.agentsDir!\n const agents = this.loadAgentList()\n for (const a of agents) this.agents.set(a.id, a)\n this.log.info(\n `loaded ${agents.length} agent(s) from ${this.agentsDir}${agents.length ? `: ${agents.map((a) => a.id).join(', ')}` : ''}`\n )\n\n this.root = root\n this.runtimes = await resolveRuntimes(cfg, root, {\n neededRuntimes: agents.map((a) => a.runtime),\n mode: 'cache-first'\n })\n this.log.info(`runtimes ready: ${Object.keys(this.runtimes).join(', ') || '(none)'}`)\n\n this.store = new LocalStore(statePath(root))\n this.cpRouting = new CpRoutingLayer({\n load: () => {\n const row = this.store.getCpRouting()\n return row\n ? {\n routingEpoch: row.routingEpoch,\n assignments: JSON.parse(row.assignments),\n globalRules: JSON.parse(row.globalRules)\n }\n : undefined\n },\n save: (s) => this.store.setCpRouting(s.routingEpoch, JSON.stringify(s.assignments), JSON.stringify(s.globalRules))\n })\n this.sessions = new SessionManager({\n store: this.store,\n // Must hand back a *started* host: handle() calls host.newSession() immediately,\n // which needs the ACP connection that start() establishes.\n hostFor: (agentId) => this.ensureHostAsync(agentId),\n agentById: (id) => this.agents.get(id)\n })\n this.scheduler = new Scheduler({\n onFire: (agentId, msg) =>\n void this.dispatch(agentId, msg).catch((err) =>\n this.log.error(`cron dispatch failed for agent \"${agentId}\": ${(err as Error).stack ?? err}`)\n ),\n newTraceId: () => randomUUID()\n })\n\n // open consolidated Slack connections, resolve bot user ids (merged rules are per-message)\n const groups = consolidate(agents)\n this.botUserIds = {}\n if (groups.size === 0) this.log.info('slack: no slack integrations configured')\n else this.log.info(`slack: opening ${groups.size} socket connection(s)`)\n for (const group of groups.values()) {\n const conn = new SlackConnection({\n group,\n newTraceId: () => randomUUID(),\n onMessage: (msg) => this.onInbound(msg),\n log: this.log,\n boltDebug: cfg.logging.level === 'debug' || cfg.logging.level === 'trace'\n })\n this.log.info(\n `slack: connecting (${group.integrations.length} integration(s): ${group.integrations.map((i) => i.agentId).join(', ')})…`\n )\n await conn.start()\n this.log.info(`slack: socket connected as bot user ${conn.botUserId}`)\n for (const { integrationId } of group.integrations) {\n this.botUserIds[integrationId] = conn.botUserId\n this.connByIntegration.set(integrationId, conn)\n }\n this.connections.push(conn)\n }\n\n // register crons\n let cronCount = 0\n for (const a of agents)\n for (const c of a.crons) {\n this.scheduler.register(a.id, c)\n cronCount++\n }\n if (cronCount) this.log.info(`registered ${cronCount} cron(s)`)\n\n // file-watch: reconcile on any agents/** change (debounced 300ms)\n this.watcher = chokidar.watch(this.agentsDir, {\n ignoreInitial: true,\n depth: 4,\n ignored: (p: string) => /[\\\\/](node_modules|\\.git)([\\\\/]|$)/.test(p)\n })\n const debounced = () => {\n clearTimeout(this.debounceTimer)\n this.debounceTimer = setTimeout(() => {\n void this.reconcile().catch((err) => console.error('agentconnect: reconcile failed:', err))\n }, 300)\n }\n this.watcher.on('add', debounced).on('change', debounced).on('unlink', debounced)\n this.log.info(`watching ${this.agentsDir} for agent changes`)\n this.startCpClient(root)\n this.log.info('daemon ready')\n }\n\n // Multi-agent: all active agents under agentsDir. Single-agent (--agent): just\n // the selected agent, regardless of status.\n private loadAgentList(): LoadedAgent[] {\n return this.opts.agentName ? [selectAgent(this.agentsDir, this.opts.agentName)] : loadAgents(this.agentsDir)\n }\n\n async reconcile(): Promise<void> {\n const desired = this.loadAgentList()\n const { toStart, toStop } = diffAgents(desired, [...this.agents.keys()])\n for (const id of toStop) {\n const host = this.hosts.get(id)\n if (host) {\n await host.stop()\n this.hosts.delete(id)\n }\n this.hostStarts.delete(id)\n this.agents.delete(id)\n }\n for (const a of toStart) this.agents.set(a.id, a as LoadedAgent)\n // NOTE: routing-table rebuild for newly-added Slack integrations requires (re)opening\n // connections; in MVP, agents added at runtime are routable for cron/DM once their host\n // starts lazily. Re-opening Slack connections on hot-add is a follow-up (needs auth.test).\n }\n\n private ensureHost(agentId: string, cfg: ReturnType<typeof loadConfig>): AcpHost {\n let host = this.hosts.get(agentId)\n if (host) return host\n const agent = this.agents.get(agentId)!\n const onUpdate = (sid: string, u: any) => this.onAcpUpdate(agentId, sid, u)\n if (this.opts.hostFactory) {\n host = this.opts.hostFactory(agent, onUpdate)\n } else {\n const runtime = this.runtimes[agent.runtime]\n if (!runtime) throw new Error(`runtime \"${agent.runtime}\" not in config.runtimes or ACP registry`)\n host = new AcpHost(runtime, { onUpdate, env: agentChildEnv(agent) })\n }\n this.hosts.set(agentId, host)\n return host\n }\n\n // route an inbound Slack message\n private seenMsgIds = new Set<string>()\n\n private onInbound(msg: NormalizedMessage): void {\n // A mention in a watched channel can arrive via both `message.*` and\n // `app_mention`; both share channel:ts, so msgId dedups the double-fire.\n if (this.seenMsgIds.has(msg.msgId)) {\n this.log.debug(`routing: duplicate ${msg.msgId} ignored`)\n return\n }\n this.seenMsgIds.add(msg.msgId)\n if (this.seenMsgIds.size > 2000) this.seenMsgIds.clear()\n\n const result = routeRules(msg, this.mergedRules(), (c, t) => this.sessions.threadOwner(c, t))\n if (!result) {\n this.log.debug(\n `routing: dropped message in ch=${msg.channel} (no agent matched — not a mention of a known bot, not a subscribed 'all' channel, not a thread/DM hit)`\n )\n return\n }\n this.log.info(`routing: ch=${msg.channel} → agent \"${result.agentId}\" (integration ${result.integrationId})`)\n void this.dispatch(result.agentId, msg, result.integrationId).catch((err) =>\n this.log.error(`dispatch failed for agent \"${result.agentId}\": ${(err as Error).stack ?? err}`)\n )\n }\n\n /** Local layer (agent.json) ∪ resolved CP layer; unservable CP rules are dropped + warn-logged. */\n private mergedRules(): RoutingRule[] {\n const local = [...this.agents.values()].flatMap((a) => rulesFromAgent(a, this.botUserIds))\n const cp: RoutingRule[] = []\n for (const cpRule of this.cpRouting?.effectiveRules() ?? []) {\n const resolved = resolveCpRule(cpRule, (agentId) => this.resolveCpAgent(agentId))\n if (resolved) cp.push(resolved)\n else this.log.warn(`cp: routing rule for unknown/Slack-less agent \"${cpRule.agentId}\" skipped (degraded)`)\n }\n return [...local, ...cp]\n }\n\n /** Resolve a CP agentId (== local agent.id) to its Slack integration; null if unservable. */\n private resolveCpAgent(agentId: string): { integrationId: string; botUserId: string } | null {\n return resolveAgentIntegration(this.agents.get(agentId), this.botUserIds)\n }\n\n /** agentIds of CP rules that currently resolve to null (no servable Slack integration). */\n private cpDegradedScopes(): string[] {\n const out = new Set<string>()\n for (const cpRule of this.cpRouting?.effectiveRules() ?? []) {\n if (!this.resolveCpAgent(cpRule.agentId)) out.add(cpRule.agentId)\n }\n return [...out]\n }\n\n // shared dispatch for user + cron messages\n private async dispatch(agentId: string, msg: NormalizedMessage, integrationId?: string): Promise<void> {\n const agent = this.agents.get(agentId)!\n const conv = new OutputConverger(agent.output.mode)\n const replyConn = this.replyConnFor(agentId, integrationId)\n // Capture cold/warm BEFORE sessions.handle(), which boots the host via hostFor().\n const wasRunning = this.hostStarts.has(agentId)\n const statusThread = msg.thread ?? msg.msgId\n void replyConn?.setStatus(msg.channel, statusThread, wasRunning ? 'is thinking…' : 'is starting up…', LOADING_MSGS)\n const { sessionId, blocks } = await this.sessions.handle(agentId, msg)\n this.pending.set(sessionId, { conv, channel: msg.channel, thread: msg.thread, conn: replyConn })\n try {\n const host = await this.ensureHostAsync(agentId)\n if (!wasRunning) void replyConn?.setStatus(msg.channel, statusThread, 'is thinking…', LOADING_MSGS)\n await host.prompt(sessionId, blocks as any)\n // flush final\n for (const action of conv.onFinal(`local://session/${sessionId}`)) {\n await this.applyAction(action, replyConn, msg.channel, statusThread)\n }\n } finally {\n this.pending.delete(sessionId)\n }\n }\n\n /** Route a converger action: set-status → setStatus (loading_messages only when not clearing); else postMessage. */\n private async applyAction(\n action: SlackAction,\n conn: SlackConnection | undefined,\n channel: string,\n thread?: string\n ): Promise<void> {\n if (action.kind === 'set-status') {\n if (conn && thread) await conn.setStatus(channel, thread, action.text, action.text ? LOADING_MSGS : undefined)\n return\n }\n await conn?.postMessage(channel, action.text, thread)\n }\n\n private pending = new Map<\n string,\n { conv: OutputConverger; channel: string; thread?: string; conn?: SlackConnection }\n >()\n\n private onAcpUpdate(_agentId: string, sessionId: string, update: any): void {\n const p = this.pending.get(sessionId)\n if (!p) return\n for (const action of p.conv.onUpdate(update)) {\n void this.applyAction(action, p.conn, p.channel, p.thread).catch((err) =>\n console.error('slack post failed:', err)\n )\n }\n }\n\n private async ensureHostAsync(agentId: string): Promise<AcpHost> {\n const host = this.ensureHost(agentId, this.cfg)\n let p = this.hostStarts.get(agentId)\n if (!p) {\n p = host.start()\n this.hostStarts.set(agentId, p)\n }\n await p\n return host\n }\n\n private replyConnFor(agentId: string, integrationId?: string): SlackConnection | undefined {\n const intId = integrationId ?? this.agents.get(agentId)?.integrations[0]?.id\n return intId ? this.connByIntegration.get(intId) : undefined\n }\n\n // ── ConfigApply seam (CP changes config, never live routing) ──\n private cpConfigApply(): ConfigApply {\n return {\n applyConfigPush: (keys) => {\n const { applied, ignored } = mergeConfigPush(this.cfg, keys)\n if (applied.includes('logging.level')) this.log = makeLogger(this.cfg.logging.level)\n if (applied.length) this.log.info(`cp: applied config keys: ${applied.join(', ')}`)\n if (ignored.length) this.log.warn(`cp: ignored config keys: ${ignored.join(', ')}`)\n },\n applyReconcileSnapshot: (snap: RegisterOk) => {\n this.cpCrons?.converge(snap.crons)\n this.cpRouting?.converge({\n routingEpoch: snap.routingEpoch,\n assignments: snap.assignments,\n drop: { assignments: snap.drop.assignments }\n })\n if (snap.leases.length) this.log.debug(`cp: ${snap.leases.length} lease(s) noted (secrets handled later)`)\n if (snap.assignments.length) this.log.debug(`cp: converged ${snap.assignments.length} assignment(s)`)\n },\n upsertCron: (cron: CronUpsert) => this.cpCrons!.upsert(cron),\n removeCron: (cronId: string) => this.cpCrons!.remove(cronId),\n applyRouteAssign: (a: RouteAssign) => this.cpRouting?.upsertAssign(a),\n applyRouteUpdate: (u: RouteUpdate) => this.cpRouting?.applyUpdate(u)\n }\n }\n\n /** A CP cron fired: build a synthetic message and run it through the normal routing path. */\n private onCpCronFire(cron: CronUpsert): void {\n const traceId = randomUUID()\n const msg: NormalizedMessage = {\n msgId: `cpcron:${cron.cronId}:${traceId}`,\n traceId,\n source: 'cron',\n platform: 'slack',\n channel: cron.target.channel,\n thread: `cpcron:${cron.cronId}:${traceId}`,\n sender: { id: `cpcron:${cron.cronId}`, isBot: false },\n text: cron.trigger,\n mentionedBots: [],\n isDm: false,\n trigger: 'cron'\n }\n this.onInbound(msg)\n }\n\n private startCpClient(root: string): void {\n const cp = this.cfg.controlPlane\n if (!cp?.enabled || !cp.url || !cp.token) {\n this.log.info('cp: not connecting (disabled or missing url/token) — running local')\n return\n }\n // Do NOT force-mint a daemonId: when none is configured, the CP derives it\n // from the token's `sub` and returns it in auth/ok; we adopt + persist it\n // (raft-style token-only onboarding). An explicit --daemon-id still wins.\n this.cpCrons = new CpCronRegistry({ onFire: (cron) => this.onCpCronFire(cron) })\n const url = cp.url\n this.cpClient = new CpClient({\n url,\n token: cp.token,\n ...(this.cfg.daemonId ? { daemonId: this.cfg.daemonId } : {}),\n onDaemonId: (id) => {\n this.cfg.daemonId = id\n persistDaemonId(root, id)\n this.log.info(`cp: adopted daemonId ${id} from auth/ok`)\n },\n agentVersion: '0.0.0',\n host: hostname(),\n heartbeatDefaultMs: cp.heartbeatMs,\n maxAgents: this.cfg.limits.maxAgents,\n capabilities: () => ({\n platforms: ['slack'],\n runtimes: Object.keys(this.runtimes),\n acp: true,\n features: []\n }),\n localState: () => ({ assignments: [], crons: this.cpCrons?.ids() ?? [], leases: [] }),\n loadSnapshot: () => ({\n cpu: loadavg()[0] ?? 0,\n mem: totalmem() > 0 ? 1 - freemem() / totalmem() : 0,\n agents: this.hosts.size\n }),\n activeSessions: () => this.pending.size,\n degradedScopes: () => this.cpDegradedScopes(),\n configApply: this.cpConfigApply(),\n clock: systemClock,\n connect: () => ClientTransport.dial(url),\n log: this.log\n })\n this.cpClient.start()\n this.log.info(`cp: connecting to ${url}…`)\n }\n\n async stop(): Promise<void> {\n clearTimeout(this.debounceTimer)\n await this.watcher?.close()\n const errors: unknown[] = []\n this.scheduler?.stop()\n await Promise.resolve(this.cpClient?.stop()).catch((e) => errors.push(e))\n this.cpCrons?.stop()\n for (const c of this.connections) await Promise.resolve(c.stop()).catch((e) => errors.push(e))\n for (const h of this.hosts.values()) await Promise.resolve(h.stop()).catch((e) => errors.push(e))\n this.store?.close()\n if (errors.length) throw new AggregateError(errors, 'stop: partial failure')\n }\n}\n","import { readFileSync, existsSync, writeFileSync, mkdirSync } from 'node:fs'\nimport { dirname } from 'node:path'\nimport { ConfigSchema, type Config } from './config-schema.js'\nimport { resolveRoot, configPath, defaultAgentsDir } from '../paths.js'\n\nexport interface FlatOverrides {\n cpUrl?: string\n cpToken?: string\n noCp?: boolean\n daemonId?: string\n logLevel?: Config['logging']['level']\n agentsDir?: string\n maxAgents?: number\n}\n\nexport function loadConfig(\n opts: { root?: string; configPath?: string; overrides?: FlatOverrides; optional?: boolean; autoCreate?: boolean } = {}\n): Config {\n const root = resolveRoot(opts.root)\n const file = opts.configPath ?? configPath(root)\n // `optional` (used by `chat`) lets the daemon run with zero config: a missing\n // config.json yields the schema defaults, and runtimes fall back to the ACP registry.\n // `autoCreate` (used by `run`) goes a step further and writes that empty config to\n // disk so the daemon runs fully local (control plane disabled by default) and the\n // user has a file to edit later — no `agentconnect login` required.\n let raw: unknown\n if (existsSync(file)) {\n raw = JSON.parse(readFileSync(file, 'utf8'))\n } else if (opts.autoCreate) {\n raw = { version: 1 }\n mkdirSync(dirname(file), { recursive: true })\n writeFileSync(file, JSON.stringify(raw, null, 2) + '\\n')\n } else if (opts.optional) {\n raw = { version: 1 }\n } else {\n throw new Error(`config not found: ${file} (create it, pass --config, or run \\`agentconnect login\\`)`)\n }\n const cfg = ConfigSchema.parse(raw) // throws on invalid\n\n const o = opts.overrides ?? {}\n if (o.daemonId) cfg.daemonId = o.daemonId\n if (o.logLevel) cfg.logging.level = o.logLevel\n if (o.maxAgents !== undefined) cfg.limits.maxAgents = o.maxAgents\n if (o.cpUrl) cfg.controlPlane.url = o.cpUrl\n if (o.cpToken) cfg.controlPlane.token = o.cpToken\n // Passing --cp-url/--cp-token implies \"connect to the CP\" (it defaults off),\n // so the one-line onboarding command works without a config edit. --no-cp wins.\n if (o.cpUrl || o.cpToken) cfg.controlPlane.enabled = true\n if (o.noCp) cfg.controlPlane.enabled = false\n\n cfg.agentsDir = o.agentsDir ?? cfg.agentsDir ?? defaultAgentsDir(root)\n return cfg\n}\n\n/**\n * Persist a (freshly-minted) `daemonId` back into config.json so it is stable\n * per install. Best-effort: a write failure is swallowed (the daemon still runs\n * with the in-memory id this session).\n */\nexport function persistDaemonId(root: string | undefined, daemonId: string): void {\n try {\n const file = configPath(resolveRoot(root))\n const raw = existsSync(file) ? JSON.parse(readFileSync(file, 'utf8')) : { version: 1 }\n raw.daemonId = daemonId\n mkdirSync(dirname(file), { recursive: true })\n writeFileSync(file, JSON.stringify(raw, null, 2) + '\\n')\n } catch {\n // ignore — non-fatal\n }\n}\n","import { z } from 'zod'\n\nexport const RuntimeDefSchema = z.object({\n command: z.string(),\n args: z.array(z.string()).default([]),\n env: z.array(z.object({ name: z.string(), value: z.string() })).default([])\n})\nexport type RuntimeDef = z.infer<typeof RuntimeDefSchema>\n\nexport const ConfigSchema = z.object({\n version: z.literal(1),\n daemonId: z.string().optional(),\n controlPlane: z\n .object({\n enabled: z.boolean().default(true),\n url: z.string().optional(),\n token: z.string().optional(),\n heartbeatMs: z.number().int().default(15000)\n })\n .default({ enabled: false, heartbeatMs: 15000 }),\n agentsDir: z.string().optional(), // resolved against root if absent\n runtimes: z.record(z.string(), RuntimeDefSchema).optional(),\n logging: z\n .object({ level: z.enum(['trace', 'debug', 'info', 'warn', 'error']).default('info') })\n .default({ level: 'info' }),\n limits: z\n .object({\n maxAgents: z.number().int().default(8),\n maxConcurrentSessions: z.number().int().default(32),\n agentIdleTimeoutMs: z.number().int().default(900_000)\n })\n .default({ maxAgents: 8, maxConcurrentSessions: 32, agentIdleTimeoutMs: 900_000 })\n})\nexport type Config = z.infer<typeof ConfigSchema>\n","import { homedir } from 'node:os'\nimport { join, resolve } from 'node:path'\n\nexport function resolveRoot(root?: string): string {\n const r = root ?? process.env.AGENTCONNECT_ROOT ?? join(homedir(), '.agentconnect')\n return resolve(r.replace(/^~(?=$|\\/)/, homedir()))\n}\n\nexport function configPath(root: string): string {\n return join(root, 'config.json')\n}\n\nexport function statePath(root: string): string {\n return join(root, 'state', 'local.sqlite')\n}\n\nexport function defaultAgentsDir(root: string): string {\n return join(root, 'agents')\n}\n\nexport function registryPath(root: string): string {\n return join(root, 'acp_registry.json')\n}\n\nexport function registryCachePath(root: string): string {\n return join(root, 'acp_registry.cache.json')\n}\n","import { readFileSync, readdirSync, existsSync } from 'node:fs'\nimport { join, resolve, isAbsolute, dirname } from 'node:path'\nimport { AgentSchema, type Agent } from './agent-schema.js'\nimport { loadDotenv, interpolateAgent } from './agent-env.js'\n\nconst IGNORED_DIRS = new Set(['node_modules', '.git'])\nconst MAX_DEPTH = 4\n\n// Agent plus loader-derived data: its directory and parsed .env.\nexport type LoadedAgent = Agent & { dir: string; env: Record<string, string> }\n\n// Parse one agent.json, interpolate ${VAR} from the sibling .env (+ process.env),\n// then resolve workspace.path relative to the agent dir.\nfunction parseAgentFile(file: string): LoadedAgent {\n const dir = dirname(file)\n const env = loadDotenv(dir)\n const agent = AgentSchema.parse(JSON.parse(readFileSync(file, 'utf8')))\n interpolateAgent(agent, { ...process.env, ...env }, { id: agent.id, envPath: join(dir, '.env') })\n if (!isAbsolute(agent.workspace.path)) {\n agent.workspace.path = resolve(dir, agent.workspace.path)\n }\n return { ...agent, dir, env }\n}\n\n// Bounded recursive walk: collect every agent.json under `dir`. A directory that\n// contains an agent.json is treated as a leaf (we do not recurse into it), so an\n// agent's own workspace checkout can't masquerade as nested agents.\nfunction findAgentFiles(dir: string, depth = 0): string[] {\n if (depth > MAX_DEPTH || !existsSync(dir)) return []\n let entries\n try {\n entries = readdirSync(dir, { withFileTypes: true })\n } catch {\n return []\n }\n if (entries.some((e) => e.isFile() && e.name === 'agent.json')) {\n return [join(dir, 'agent.json')]\n }\n const out: string[] = []\n for (const entry of entries) {\n if (!entry.isDirectory()) continue\n if (IGNORED_DIRS.has(entry.name) || entry.name.startsWith('.')) continue\n out.push(...findAgentFiles(join(dir, entry.name), depth + 1))\n }\n return out\n}\n\n// All parsed agents under `agentsDir`, no status filter. `dir` is the directory\n// holding each agent.json.\nexport function discoverAgents(agentsDir: string): { agent: LoadedAgent; dir: string }[] {\n return findAgentFiles(agentsDir).map((file) => {\n try {\n return { agent: parseAgentFile(file), dir: dirname(file) }\n } catch (err) {\n throw new Error(`invalid agent.json at ${file}: ${(err as Error).message}`)\n }\n })\n}\n\n// Active agents only — the daemon's multi-agent path.\nexport function loadAgents(agentsDir: string): LoadedAgent[] {\n return discoverAgents(agentsDir)\n .map((d) => d.agent)\n .filter((a) => a.status === 'active')\n}\n\n// Resolve a single agent from `agentsDir`. With `name`, matches the agent `id`.\n// Without `name`: requires exactly one discovered agent. Used by `chat` and by\n// `run --agent`. Does NOT filter by status.\nexport function selectAgent(agentsDir: string, name?: string): LoadedAgent {\n const agents = discoverAgents(agentsDir).map((d) => d.agent)\n if (name) {\n const match = agents.find((a) => a.id === name)\n if (!match) {\n const available =\n agents\n .map((a) => a.id)\n .sort()\n .join(', ') || '(none)'\n throw new Error(`agent \"${name}\" not found in ${agentsDir}. Available: ${available}`)\n }\n return match\n }\n if (agents.length === 0) throw new Error(`no agent.json found in ${agentsDir}`)\n if (agents.length > 1) {\n const ids = agents\n .map((a) => a.id)\n .sort()\n .join(', ')\n throw new Error(`multiple agents found in ${agentsDir}: ${ids}; use --agent <name> to specify one`)\n }\n return agents[0]!\n}\n","import { z } from 'zod'\n\nexport const BindMatchSchema = z.discriminatedUnion('kind', [\n z.object({ kind: z.literal('mention') }),\n z.object({ kind: z.literal('dm') }),\n z.object({ kind: z.literal('keyword'), value: z.string() }),\n z.object({ kind: z.literal('auto') })\n])\nexport type BindMatch = z.infer<typeof BindMatchSchema>\n\nexport const BindRuleConfigSchema = z.object({\n channel: z.string().optional(), // absent = any channel\n thread: z.string().optional(),\n match: BindMatchSchema\n})\nexport type BindRuleConfig = z.infer<typeof BindRuleConfigSchema>\n\nexport const SlackConfigSchema = z.object({\n botToken: z.string(),\n appToken: z.string(),\n signingSecret: z.string().optional(),\n botUserId: z.string().optional(), // filled at connect via auth.test if absent\n allowedUserIds: z.array(z.string()).default([]),\n notificationChannelId: z.string().optional(),\n bindRules: z.array(BindRuleConfigSchema).default([])\n})\nexport type SlackConfig = z.infer<typeof SlackConfigSchema>\n\nexport const IntegrationSchema = z.object({\n id: z.string(),\n platform: z.literal('slack'),\n slack: SlackConfigSchema\n})\nexport type Integration = z.infer<typeof IntegrationSchema>\n\nexport const CronDefSchema = z.object({\n id: z.string(),\n schedule: z.string(),\n target: z.object({ platform: z.literal('slack'), channel: z.string() }),\n trigger: z.string()\n})\nexport type CronDef = z.infer<typeof CronDefSchema>\n\nexport const AgentSchema = z.object({\n id: z.string(),\n name: z.string(),\n status: z.enum(['active', 'inactive', 'paused']).default('active'),\n runtime: z.string(),\n runtimeOverrides: z\n .object({\n model: z.string().optional(),\n env: z.array(z.object({ name: z.string(), value: z.string() })).default([])\n })\n .optional(),\n workspace: z.object({\n mode: z.enum(['git-repo', 'from-scratch']),\n path: z.string(),\n gitRepo: z.string().optional(),\n gitBranch: z.string().default('main'),\n pullOnNewSession: z.boolean().default(true),\n skills: z.array(z.string()).default([])\n }),\n integrations: z.array(IntegrationSchema).default([]),\n // zod 4: nested .default({}) does not apply inner field defaults — use explicit full literal\n output: z.object({ mode: z.enum(['low', 'medium', 'high']).default('low') }).default({ mode: 'low' }),\n permissions: z\n .object({ policy: z.enum(['ask', 'auto']).default('ask'), autoApprove: z.array(z.string()).default([]) })\n .default({ policy: 'ask', autoApprove: [] }),\n crons: z.array(CronDefSchema).default([])\n})\nexport type Agent = z.infer<typeof AgentSchema>\n","import { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport type { Agent } from './agent-schema.js'\n\n// Minimal .env parser: KEY=VALUE per line, `#` comments, blank lines,\n// optional `export ` prefix, matching single/double quotes stripped.\n// No variable expansion within the file. Last duplicate key wins.\nexport function parseDotenv(text: string): Record<string, string> {\n const out: Record<string, string> = {}\n for (const rawLine of text.split('\\n')) {\n const line = rawLine.replace(/\\r$/, '').trim()\n if (!line || line.startsWith('#')) continue\n const body = line.startsWith('export ') ? line.slice(7).trim() : line\n const eq = body.indexOf('=')\n if (eq === -1) continue\n const key = body.slice(0, eq).trim()\n if (!key) continue\n let value = body.slice(eq + 1).trim()\n const q = value[0]\n if (value.length >= 2 && (q === '\"' || q === \"'\") && value.at(-1) === q) {\n value = value.slice(1, -1)\n }\n out[key] = value\n }\n return out\n}\n\n// Parse `<dir>/.env`, or {} if the file does not exist.\nexport function loadDotenv(dir: string): Record<string, string> {\n const file = join(dir, '.env')\n if (!existsSync(file)) return {}\n return parseDotenv(readFileSync(file, 'utf8'))\n}\n\nconst VAR_RE = /\\$\\{([A-Za-z_][A-Za-z0-9_]*)\\}/g\n\nfunction interpolateString(\n value: string,\n source: Record<string, string | undefined>,\n path: string,\n ctx: { id: string; envPath: string }\n): string {\n return value.replace(VAR_RE, (_m, name: string) => {\n const resolved = source[name]\n if (resolved === undefined) {\n throw new Error(`agent \"${ctx.id}\": unresolved \\${${name}} in ${path} (.env: ${ctx.envPath})`)\n }\n return resolved\n })\n}\n\nfunction walk(\n node: unknown,\n source: Record<string, string | undefined>,\n path: string,\n ctx: { id: string; envPath: string }\n): unknown {\n if (typeof node === 'string') return interpolateString(node, source, path, ctx)\n if (Array.isArray(node)) {\n for (let i = 0; i < node.length; i++) node[i] = walk(node[i], source, `${path}[${i}]`, ctx)\n return node\n }\n if (node && typeof node === 'object') {\n const obj = node as Record<string, unknown>\n for (const key of Object.keys(obj)) {\n obj[key] = walk(obj[key], source, path ? `${path}.${key}` : key, ctx)\n }\n return node\n }\n return node\n}\n\n// Rewrite every ${VAR} in every string of `agent` (in place). Throws on the\n// first unresolved variable.\nexport function interpolateAgent(\n agent: Agent,\n source: Record<string, string | undefined>,\n ctx: { id: string; envPath: string }\n): void {\n walk(agent, source, '', ctx)\n}\n\n// Per-agent env overlay applied on top of runtime.env when spawning the ACP\n// child. .env values, then runtimeOverrides.env (which wins).\nexport function agentChildEnv(agent: {\n env: Record<string, string>\n runtimeOverrides?: { env?: { name: string; value: string }[] }\n}): Record<string, string> {\n return {\n ...agent.env,\n ...Object.fromEntries((agent.runtimeOverrides?.env ?? []).map((e) => [e.name, e.value]))\n }\n}\n","import type { Agent } from '../agents/agent-schema.js'\n\nexport function diffAgents(desired: Agent[], actualIds: string[]): { toStart: Agent[]; toStop: string[] } {\n const desiredIds = new Set(desired.map((a) => a.id))\n const toStart = desired.filter((a) => !actualIds.includes(a.id))\n const toStop = actualIds.filter((id) => !desiredIds.has(id))\n return { toStart, toStop }\n}\n","import Database from 'better-sqlite3'\nimport { mkdirSync } from 'node:fs'\nimport { dirname } from 'node:path'\n\nexport interface SessionRecord {\n key: string\n agentId: string\n platform: string\n channel: string\n thread: string\n acpSessionId: string | null\n state: 'idle' | 'prompting' | 'closed'\n lastDeliveredTs: string | null\n updatedAt: number\n}\n\nexport interface TranscriptEntry {\n channel: string\n thread: string\n ts: string\n sender: string\n text: string\n}\n\nexport function sessionKey(platform: string, channel: string, thread: string, agentId: string): string {\n return `${platform}:${channel}:${thread}:${agentId}`\n}\n\nexport class LocalStore {\n private db: Database.Database\n\n constructor(dbPath: string) {\n mkdirSync(dirname(dbPath), { recursive: true })\n this.db = new Database(dbPath)\n this.db.pragma('journal_mode = WAL')\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS sessions (\n key TEXT PRIMARY KEY, agentId TEXT, platform TEXT, channel TEXT, thread TEXT,\n acpSessionId TEXT, state TEXT, lastDeliveredTs TEXT, updatedAt INTEGER\n );\n CREATE TABLE IF NOT EXISTS transcript (\n channel TEXT, thread TEXT, ts TEXT, sender TEXT, text TEXT,\n PRIMARY KEY (channel, thread, ts)\n );\n CREATE TABLE IF NOT EXISTS cp_routing (\n id INTEGER PRIMARY KEY CHECK (id = 1),\n routingEpoch INTEGER, assignments TEXT, globalRules TEXT\n );\n `)\n }\n\n getSession(key: string): SessionRecord | undefined {\n return this.db.prepare('SELECT * FROM sessions WHERE key = ?').get(key) as SessionRecord | undefined\n }\n\n upsertSession(rec: SessionRecord): void {\n this.db\n .prepare(\n `INSERT INTO sessions (key, agentId, platform, channel, thread, acpSessionId, state, lastDeliveredTs, updatedAt)\n VALUES (@key, @agentId, @platform, @channel, @thread, @acpSessionId, @state, @lastDeliveredTs, @updatedAt)\n ON CONFLICT(key) DO UPDATE SET\n acpSessionId=excluded.acpSessionId, state=excluded.state,\n lastDeliveredTs=excluded.lastDeliveredTs, updatedAt=excluded.updatedAt`\n )\n .run(rec)\n }\n\n appendTranscript(e: TranscriptEntry): void {\n this.db\n .prepare(\n 'INSERT OR IGNORE INTO transcript (channel, thread, ts, sender, text) VALUES (@channel, @thread, @ts, @sender, @text)'\n )\n .run(e)\n }\n\n transcriptSince(channel: string, thread: string, sinceTs: string | null): TranscriptEntry[] {\n if (sinceTs === null) {\n return this.db\n .prepare('SELECT * FROM transcript WHERE channel = ? AND thread = ? ORDER BY ts ASC')\n .all(channel, thread) as TranscriptEntry[]\n }\n return this.db\n .prepare('SELECT * FROM transcript WHERE channel = ? AND thread = ? AND ts > ? ORDER BY ts ASC')\n .all(channel, thread, sinceTs) as TranscriptEntry[]\n }\n\n openSessionAgents(channel: string, thread: string): string[] {\n return (\n this.db\n .prepare(\"SELECT agentId FROM sessions WHERE channel = ? AND thread = ? AND state != 'closed'\")\n .all(channel, thread) as { agentId: string }[]\n ).map((r) => r.agentId)\n }\n\n getCpRouting(): { routingEpoch: number; assignments: string; globalRules: string } | undefined {\n return this.db.prepare('SELECT routingEpoch, assignments, globalRules FROM cp_routing WHERE id = 1').get() as\n | { routingEpoch: number; assignments: string; globalRules: string }\n | undefined\n }\n\n setCpRouting(routingEpoch: number, assignments: string, globalRules: string): void {\n this.db\n .prepare(\n `INSERT INTO cp_routing (id, routingEpoch, assignments, globalRules) VALUES (1, @routingEpoch, @assignments, @globalRules)\n ON CONFLICT(id) DO UPDATE SET routingEpoch=excluded.routingEpoch, assignments=excluded.assignments, globalRules=excluded.globalRules`\n )\n .run({ routingEpoch, assignments, globalRules })\n }\n\n close(): void {\n this.db.close()\n }\n}\n","import { spawn, type ChildProcess } from 'node:child_process'\nimport { Readable, Writable } from 'node:stream'\nimport {\n ClientSideConnection,\n ndJsonStream,\n type Agent as AcpAgent,\n type Client,\n type ContentBlock,\n type SessionNotification,\n type SessionUpdate,\n type StopReason\n} from '@agentclientprotocol/sdk'\nimport type { RuntimeDef } from '../config/config-schema.js'\n\nconst PROTOCOL_VERSION = 1\n\nexport class AcpHost {\n private child?: ChildProcess\n private conn?: ClientSideConnection\n\n constructor(\n private runtime: RuntimeDef,\n private opts: {\n onUpdate: (sessionId: string, update: SessionUpdate) => void\n env?: Record<string, string>\n }\n ) {}\n\n async start(): Promise<void> {\n if (this.child) throw new Error('AcpHost: already started')\n const child = spawn(this.runtime.command, this.runtime.args, {\n stdio: ['pipe', 'pipe', 'inherit'],\n env: {\n ...process.env,\n ...Object.fromEntries(this.runtime.env.map((e) => [e.name, e.value])),\n ...(this.opts.env ?? {})\n }\n })\n this.child = child\n\n if (!child.stdin || !child.stdout) {\n throw new Error('AcpHost: subprocess stdin/stdout are not piped')\n }\n const toAgent = Writable.toWeb(child.stdin) as WritableStream<Uint8Array>\n const fromAgent = Readable.toWeb(child.stdout) as unknown as ReadableStream<Uint8Array>\n const stream = ndJsonStream(toAgent, fromAgent)\n\n const self = this\n this.conn = new ClientSideConnection((_agent: AcpAgent): Client => {\n return {\n async sessionUpdate(params: SessionNotification): Promise<void> {\n self.opts.onUpdate(params.sessionId, params.update)\n },\n async requestPermission(params) {\n // MVP: auto-allow the first option (no interactive policy yet)\n const allow = params.options.find((o) => o.kind === 'allow_once' || o.kind === 'allow_always')\n const optionId = (allow ?? params.options[0])?.optionId\n return {\n outcome: optionId ? { outcome: 'selected', optionId } : { outcome: 'cancelled' }\n }\n },\n async readTextFile() {\n throw new Error('fs.readTextFile not supported in MVP')\n },\n async writeTextFile() {\n throw new Error('fs.writeTextFile not supported in MVP')\n }\n }\n }, stream)\n\n await this.conn.initialize({\n protocolVersion: PROTOCOL_VERSION,\n clientCapabilities: { fs: { readTextFile: false, writeTextFile: false } }\n })\n }\n\n async newSession(cwd: string): Promise<string> {\n const res = await this.conn!.newSession({ cwd, mcpServers: [] })\n return res.sessionId\n }\n\n async prompt(sessionId: string, blocks: ContentBlock[]): Promise<StopReason> {\n const res = await this.conn!.prompt({ sessionId, prompt: blocks })\n return res.stopReason\n }\n\n async cancel(sessionId: string): Promise<void> {\n await this.conn!.cancel({ sessionId })\n }\n\n async stop(): Promise<void> {\n if (!this.child) return\n this.child.kill('SIGTERM')\n await new Promise<void>((resolve) => this.child!.once('exit', () => resolve()))\n }\n}\n","import { mkdirSync, existsSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { simpleGit } from 'simple-git'\nimport type { Agent } from '../agents/agent-schema.js'\n\nconst PULL_TIMEOUT_MS = 4500\n\nexport async function prepareWorkspace(agent: Agent): Promise<string> {\n const cwd = agent.workspace.path\n mkdirSync(cwd, { recursive: true })\n\n if (agent.workspace.mode === 'from-scratch') {\n const mem = join(cwd, 'memory.md')\n if (!existsSync(mem)) writeFileSync(mem, `# ${agent.name} memory\\n`)\n return cwd\n }\n\n // git-repo: best-effort ff-only pull; never block/throw on offline (design §4.3)\n if (agent.workspace.pullOnNewSession && existsSync(join(cwd, '.git'))) {\n try {\n await Promise.race([\n simpleGit(cwd).pull(['--ff-only']),\n new Promise((_, rej) => setTimeout(() => rej(new Error('pull timeout')), PULL_TIMEOUT_MS))\n ])\n } catch {\n // offline / non-fast-forward: proceed with the on-disk checkout\n }\n }\n return cwd\n}\n","import type { ContentBlock } from '@agentclientprotocol/sdk'\nimport { LocalStore, sessionKey } from '../store/local-store.js'\nimport { prepareWorkspace } from '../workspace/workspace-manager.js'\nimport type { AcpHost } from '../acp/acp-host.js'\nimport type { Agent } from '../agents/agent-schema.js'\nimport type { NormalizedMessage } from '../messages/normalized.js'\n\nexport class SessionManager {\n constructor(\n private deps: {\n store: LocalStore\n hostFor: (agentId: string) => Promise<AcpHost>\n agentById: (id: string) => Agent | undefined\n }\n ) {}\n\n threadOwner(channel: string, thread: string): string | null {\n const owners = this.deps.store.openSessionAgents(channel, thread)\n return owners.length === 1 ? owners[0]! : null\n }\n\n async handle(agentId: string, msg: NormalizedMessage): Promise<{ sessionId: string; blocks: ContentBlock[] }> {\n const agent = this.deps.agentById(agentId)\n if (!agent) throw new Error(`unknown agent ${agentId}`)\n const thread = msg.thread ?? msg.msgId\n const key = sessionKey(msg.platform, msg.channel, thread, agentId)\n\n // record the triggering message in the transcript\n this.deps.store.appendTranscript({\n channel: msg.channel,\n thread,\n ts: tsOf(msg),\n sender: msg.sender.id,\n text: msg.text\n })\n\n let rec = this.deps.store.getSession(key)\n const host = await this.deps.hostFor(agentId)\n\n if (!rec || !rec.acpSessionId) {\n const cwd = await prepareWorkspace(agent)\n const acpSessionId = await host.newSession(cwd)\n rec = {\n key,\n agentId,\n platform: msg.platform,\n channel: msg.channel,\n thread,\n acpSessionId,\n state: 'idle',\n lastDeliveredTs: null,\n updatedAt: Date.now()\n }\n this.deps.store.upsertSession(rec)\n }\n\n // §8.5 catch-up replay: everything in the transcript after lastDeliveredTs, including the current msg\n const gap = this.deps.store.transcriptSince(msg.channel, thread, rec.lastDeliveredTs)\n const blocks: ContentBlock[] = []\n const context = gap.slice(0, -1) // all but the current message\n if (context.length > 0) {\n const ctxText = context.map((e) => `[${e.sender}] ${e.text}`).join('\\n')\n blocks.push({ type: 'text', text: `(thread context you may have missed)\\n${ctxText}` })\n }\n blocks.push({ type: 'text', text: msg.text })\n\n rec.lastDeliveredTs = tsOf(msg)\n rec.state = 'prompting'\n rec.updatedAt = Date.now()\n this.deps.store.upsertSession(rec)\n\n return { sessionId: rec.acpSessionId!, blocks }\n }\n}\n\nfunction tsOf(msg: NormalizedMessage): string {\n // NormalizedMessage.msgId is `slack:<channel>:<ts>`; recover the ts\n const parts = msg.msgId.split(':')\n return parts[parts.length - 1] ?? '0'\n}\n","import type { NormalizedMessage } from '../messages/normalized.js'\nimport type { RoutingRule } from './routing-rule.js'\n\n// ─── routeRules: arbitration ladder over the merged (local ∪ CP) rule set ───\n\nconst KIND_ORDER = ['mention', 'dm', 'keyword', 'auto'] as const\n\nfunction scopeMatches(r: RoutingRule, msg: NormalizedMessage): boolean {\n if (r.scope.channel !== undefined && r.scope.channel !== msg.channel) return false\n if (r.scope.thread !== undefined && r.scope.thread !== msg.thread) return false\n return true\n}\n\nfunction kindMatches(r: RoutingRule, msg: NormalizedMessage): boolean {\n switch (r.match.kind) {\n case 'mention':\n return r.botUserId !== '' && msg.mentionedBots.includes(r.botUserId)\n case 'dm':\n return msg.isDm\n case 'keyword':\n return msg.text.toLowerCase().includes(r.match.value.toLowerCase())\n case 'auto':\n return true\n }\n}\n\nconst pickRule = (r: RoutingRule) => ({ agentId: r.agentId, integrationId: r.integrationId })\n\n/**\n * Arbitrate the merged (local ∪ CP) rule set for an inbound message (design §8.2/§8.3).\n * Ladder: (1) explicit @bot mention (cross-layer; overrides thread affinity) →\n * (2) thread affinity (highest after explicit @; bypasses the kind filter, gated on\n * reachable-bot count) → (3) CP per-sessionKey override → (4/5) kind precedence\n * mention > dm > keyword > auto within the chosen layer.\n */\nexport function routeRules(\n msg: NormalizedMessage,\n rules: RoutingRule[],\n threadOwner: (channel: string, thread: string) => string | null\n): { agentId: string; integrationId: string } | null {\n if (msg.sender.isBot) return null\n\n const authz = (r: RoutingRule) =>\n !r.allowedUserIds || r.allowedUserIds.length === 0 || r.allowedUserIds.includes(msg.sender.id)\n\n // scope-candidates: scope + authz, KIND-AGNOSTIC (used for reachability + thread continuity).\n const scopeCandidates = rules.filter((r) => scopeMatches(r, msg) && authz(r))\n // kind-candidates: also match the message kind.\n const kindCandidates = scopeCandidates.filter((r) => kindMatches(r, msg))\n\n // 1. explicit @bot mention — across layers; overrides thread affinity (§8.3).\n const mention = kindCandidates.find((r) => r.match.kind === 'mention')\n if (mention) return pickRule(mention)\n\n // 2. thread affinity (§8.2 step 1 — highest after explicit @; bypasses kind filter).\n if (msg.thread) {\n const owner = threadOwner(msg.channel, msg.thread)\n if (owner) {\n const reachable = new Set(scopeCandidates.map((r) => r.agentId))\n if (reachable.has(owner)) {\n if (reachable.size === 1) {\n const r = scopeCandidates.find((x) => x.agentId === owner)!\n return pickRule(r) // single reachable bot → continuity, kind-agnostic\n }\n return null // multiple reachable bots, un-mentioned → mention-gated, activate none\n }\n }\n }\n\n // 3. CP per-sessionKey override (§8.3: CP authoritative).\n const cpInChannel = kindCandidates.some(\n (r) =>\n r.source === 'cp' &&\n r.scope.channel === msg.channel &&\n (r.scope.thread === undefined || r.scope.thread === msg.thread)\n )\n const layer = cpInChannel ? kindCandidates.filter((r) => r.source === 'cp') : kindCandidates\n\n // 4/5. kind precedence within the chosen layer (mention already handled).\n for (const kind of KIND_ORDER) {\n if (kind === 'mention') continue\n const r = layer.find((x) => x.match.kind === kind)\n if (r) return pickRule(r)\n }\n return null\n}\n","/**\n * The unified routing-rule model. Two layers produce `RoutingRule`s — the local\n * layer (from agent.json bindRules) and the CP layer (from route/*). The router\n * (`routeRules`) consumes the merged, resolved set.\n *\n * A `CpRule` is the stored CP-layer shape (no integration yet); `resolveCpRule`\n * resolves it to a `RoutingRule` at merge time (so a hot-added agent makes a\n * previously-unservable rule servable). `agent.id` IS the CP `agentId`.\n */\nimport type { Agent, BindMatch } from '../agents/agent-schema.js'\nimport type { RouteAssign, RouteUpdate } from '@agentconnect.md/protocol'\n\nexport type RoutingMatch = BindMatch\n\nexport interface RoutingRule {\n agentId: string\n integrationId: string\n botUserId: string // for `mention` matching (\"\" when unknown)\n scope: { channel?: string; thread?: string }\n match: RoutingMatch\n allowedUserIds?: string[]\n source: 'config' | 'cp'\n epoch?: number // cp layer only\n}\n\n/** Stored CP-layer rule — integration resolved lazily at merge time. */\nexport interface CpRule {\n agentId: string\n scope: { channel?: string; thread?: string }\n match: RoutingMatch\n epoch?: number\n}\n\n/**\n * Resolve an agent to its first Slack integration's `{ integrationId, botUserId }`.\n * Pure: `botUserIds` (integrationId → resolved bot user id) overrides the static\n * `int.slack.botUserId`. Returns null when there is no agent or no Slack integration\n * (i.e. the agent is unservable for routing).\n */\nexport function resolveAgentIntegration(\n agent: Agent | undefined,\n botUserIds: Record<string, string>\n): { integrationId: string; botUserId: string } | null {\n const int = agent?.integrations.find((i) => i.platform === 'slack')\n if (!int) return null\n return { integrationId: int.id, botUserId: botUserIds[int.id] ?? int.slack.botUserId ?? '' }\n}\n\n/** Local layer: one resolved RoutingRule per bindRule of each Slack integration. */\nexport function rulesFromAgent(agent: Agent, botUserIds: Record<string, string>): RoutingRule[] {\n const out: RoutingRule[] = []\n for (const int of agent.integrations) {\n if (int.platform !== 'slack') continue\n const botUserId = botUserIds[int.id] ?? int.slack.botUserId ?? ''\n for (const br of int.slack.bindRules) {\n out.push({\n agentId: agent.id,\n integrationId: int.id,\n botUserId,\n scope: { ...(br.channel ? { channel: br.channel } : {}), ...(br.thread ? { thread: br.thread } : {}) },\n match: br.match,\n allowedUserIds: int.slack.allowedUserIds,\n source: 'config'\n })\n }\n }\n return out\n}\n\n/** Resolve a stored CP rule to a RoutingRule; null if the agent is unservable. */\nexport function resolveCpRule(\n cp: CpRule,\n resolve: (agentId: string) => { integrationId: string; botUserId: string } | null\n): RoutingRule | null {\n const r = resolve(cp.agentId)\n if (!r) return null\n return {\n agentId: cp.agentId,\n integrationId: r.integrationId,\n botUserId: r.botUserId,\n scope: cp.scope,\n match: cp.match,\n source: 'cp',\n ...(cp.epoch !== undefined ? { epoch: cp.epoch } : {})\n }\n}\n\n/** Canonical sessionKey string — matches the protocol's `${platform}:${channel}:${thread ?? \"-\"}`. */\nexport function sessionKeyStr(sk: { platform: string; channel: string; thread?: string }): string {\n return `${sk.platform}:${sk.channel}:${sk.thread ?? '-'}`\n}\n\n/** route/assign → stored CP rules scoped to its sessionKey (integration resolved later). */\nexport function cpRulesFromAssign(a: RouteAssign, epoch?: number): CpRule[] {\n return a.bindRules.map((br) => ({\n agentId: a.agentId,\n scope: { channel: a.sessionKey.channel, ...(a.sessionKey.thread ? { thread: a.sessionKey.thread } : {}) },\n match: br.match,\n ...(epoch !== undefined ? { epoch } : {})\n }))\n}\n\n/** route/update → global (unscoped) CP rules. Malformed match entries are skipped. */\nexport function cpRulesFromUpdate(u: RouteUpdate): CpRule[] {\n const out: CpRule[] = []\n for (const r of u.rules) {\n const m = r.match as { kind?: string; value?: unknown }\n if (m?.kind === 'mention' || m?.kind === 'dm' || m?.kind === 'auto') {\n out.push({ agentId: r.agentId, scope: {}, match: { kind: m.kind } as RoutingMatch, epoch: u.routingEpoch })\n } else if (m?.kind === 'keyword' && typeof m.value === 'string') {\n out.push({ agentId: r.agentId, scope: {}, match: { kind: 'keyword', value: m.value }, epoch: u.routingEpoch })\n }\n }\n return out\n}\n","/**\n * `CpRoutingLayer` — the daemon's persisted CP-layer routing state. Holds\n * per-session assignments (route/assign) keyed by sessionKey and the global\n * rules (route/update), versioned by `routingEpoch`. `converge` applies the\n * register/ok reconcile snapshot. Every mutation persists via the injected io.\n */\nimport type { RouteAssign, RouteUpdate } from '@agentconnect.md/protocol'\nimport { cpRulesFromAssign, cpRulesFromUpdate, sessionKeyStr, type CpRule } from './routing-rule.js'\n\nexport interface CpRoutingSnapshot {\n routingEpoch: number\n assignments: Record<string, CpRule[]> // keyed by sessionKeyStr\n globalRules: CpRule[]\n}\n\nexport interface CpRoutingIo {\n load(): CpRoutingSnapshot | undefined\n save(s: CpRoutingSnapshot): void\n}\n\nexport class CpRoutingLayer {\n routingEpoch = 0\n private assignments = new Map<string, CpRule[]>()\n private globalRules: CpRule[] = []\n\n constructor(private readonly io: CpRoutingIo) {\n const s = io.load()\n if (s) {\n this.routingEpoch = s.routingEpoch\n this.assignments = new Map(Object.entries(s.assignments))\n this.globalRules = s.globalRules\n }\n }\n\n upsertAssign(a: RouteAssign): void {\n this.assignments.set(sessionKeyStr(a.sessionKey), cpRulesFromAssign(a, this.routingEpoch))\n this.persist()\n }\n\n applyUpdate(u: RouteUpdate): void {\n if (u.routingEpoch < this.routingEpoch) return // stale — idempotent re-apply guard\n this.routingEpoch = u.routingEpoch\n this.globalRules = cpRulesFromUpdate(u)\n this.persist()\n }\n\n // Intentionally converges ONLY `assignments`: the register/ok reconcile snapshot carries no\n // route/update global rules — those have their own epoch lifecycle via `applyUpdate`.\n converge(snap: { routingEpoch: number; assignments: RouteAssign[]; drop: { assignments: string[] } }): void {\n this.routingEpoch = snap.routingEpoch\n this.assignments = new Map(\n snap.assignments.map((a) => [sessionKeyStr(a.sessionKey), cpRulesFromAssign(a, snap.routingEpoch)])\n )\n for (const k of snap.drop.assignments) this.assignments.delete(k)\n this.persist()\n }\n\n effectiveRules(): CpRule[] {\n return [...[...this.assignments.values()].flat(), ...this.globalRules]\n }\n\n private persist(): void {\n this.io.save({\n routingEpoch: this.routingEpoch,\n assignments: Object.fromEntries(this.assignments),\n globalRules: this.globalRules\n })\n }\n}\n","import pkg from '@slack/bolt'\nconst { App, LogLevel } = pkg\nimport type { Agent } from '../agents/agent-schema.js'\nimport { normalizeSlackEvent, type SlackMessageEvent } from './normalize.js'\nimport type { NormalizedMessage } from '../messages/normalized.js'\nimport type { Logger } from '../log.js'\n\nexport interface ConsolidatedGroup {\n appToken: string\n botToken: string\n integrations: { agentId: string; integrationId: string }[]\n}\n\n/** §6.1: one Slack Socket Mode connection per unique appToken. */\nexport function consolidate(agents: Agent[]): Map<string, ConsolidatedGroup> {\n const groups = new Map<string, ConsolidatedGroup>()\n for (const a of agents) {\n for (const int of a.integrations) {\n if (int.platform !== 'slack') continue\n const k = int.slack.appToken\n const g = groups.get(k) ?? { appToken: k, botToken: int.slack.botToken, integrations: [] }\n g.integrations.push({ agentId: a.id, integrationId: int.id })\n groups.set(k, g)\n }\n }\n return groups\n}\n\nexport interface SlackDeps {\n group: ConsolidatedGroup\n onMessage: (msg: NormalizedMessage) => void\n newTraceId: () => string\n log?: Logger\n /** When true, hand Bolt LogLevel.DEBUG so socket-mode internals are visible. */\n boltDebug?: boolean\n}\n\ntype AppLike = {\n message: (handler: (args: { message: unknown }) => Promise<void> | void) => void\n event: (type: string, handler: (args: { event: unknown }) => Promise<void> | void) => void\n client: {\n auth: { test: () => Promise<{ user_id?: string }> }\n chat: { postMessage: (a: unknown) => Promise<unknown> }\n assistant: {\n threads: {\n setStatus: (a: unknown) => Promise<unknown>\n }\n }\n }\n start: () => Promise<void>\n stop: () => Promise<void>\n}\n\nexport class SlackConnection {\n private app: AppLike\n botUserId = ''\n\n constructor(\n private deps: SlackDeps,\n factory: (opts: { token: string; appToken: string }) => AppLike = (o) =>\n new App({\n token: o.token,\n appToken: o.appToken,\n socketMode: true,\n ...(deps.boltDebug ? { logLevel: LogLevel.DEBUG } : {})\n }) as unknown as AppLike\n ) {\n this.app = factory({ token: deps.group.botToken, appToken: deps.group.appToken })\n }\n\n async start(): Promise<void> {\n const log = this.deps.log\n log?.debug('slack: auth.test → resolving bot identity (HTTPS)…')\n const auth = await this.app.client.auth.test()\n this.botUserId = auth.user_id ?? ''\n log?.debug(`slack: auth.test ok → bot user ${this.botUserId}`)\n const deliver = (ev: SlackMessageEvent, kind: string) => {\n const msg = normalizeSlackEvent(ev, { traceId: this.deps.newTraceId() })\n log?.debug(\n `slack: inbound ${kind} ch=${msg.channel} user=${msg.sender.id} isBot=${msg.sender.isBot} isDm=${msg.isDm} mentions=[${msg.mentionedBots.join(',')}] text=${JSON.stringify(msg.text.slice(0, 80))}`\n )\n this.deps.onMessage(msg)\n }\n // message.* events: DMs, and channels the bot reads (needs the matching\n // `message.channels`/`message.groups`/`message.im` bot-event subscriptions).\n this.app.message(async ({ message }) => {\n const ev = message as SlackMessageEvent\n if (ev.type !== 'message' || !ev.channel) {\n log?.debug(`slack: inbound event ignored (type=${ev.type}, channel=${ev.channel ?? 'none'})`)\n return\n }\n deliver(ev, 'message')\n })\n // app_mention events: fired whenever the bot is @-mentioned (needs only the\n // `app_mentions:read` scope). Dedup against the message.* path happens in the\n // daemon by msgId, since both carry the same channel:ts.\n this.app.event('app_mention', async ({ event }) => {\n const ev = event as SlackMessageEvent\n if (!ev.channel) return\n deliver(ev, 'app_mention')\n })\n log?.debug('slack: app.start → opening Socket Mode WebSocket (wss://…slack.com)…')\n await this.app.start()\n log?.debug('slack: app.start resolved → socket established')\n }\n\n async postMessage(channel: string, text: string, threadTs?: string): Promise<void> {\n await this.app.client.chat.postMessage({ channel, text, thread_ts: threadTs })\n }\n\n /**\n * Best-effort assistant loading status (assistant.threads.setStatus).\n * Works in channels/DMs/assistant panel under chat:write (post Mar 2026).\n * Pass status='' to clear. Never throws into dispatch.\n */\n async setStatus(channel: string, threadTs: string, status: string, loadingMessages?: string[]): Promise<void> {\n try {\n await this.app.client.assistant.threads.setStatus({\n channel_id: channel,\n thread_ts: threadTs,\n status,\n ...(loadingMessages ? { loading_messages: loadingMessages } : {})\n })\n } catch (err) {\n this.deps.log?.debug(`slack: setStatus failed (ch=${channel} thread=${threadTs}): ${(err as Error).message}`)\n }\n }\n\n async stop(): Promise<void> {\n await this.app.stop()\n }\n}\n","import type { NormalizedMessage } from '../messages/normalized.js'\n\nexport interface SlackMessageEvent {\n type: string\n channel: string\n channel_type?: string\n thread_ts?: string\n ts: string\n user?: string\n bot_id?: string\n text?: string\n}\n\nconst MENTION_RE = /<@([A-Z0-9]+)>/g\n\nexport function normalizeSlackEvent(event: SlackMessageEvent, ctx: { traceId: string }): NormalizedMessage {\n const text = event.text ?? ''\n const mentionedBots = [...text.matchAll(MENTION_RE)].map((m) => m[1]!)\n return {\n msgId: `slack:${event.channel}:${event.ts}`,\n traceId: ctx.traceId,\n source: 'user',\n platform: 'slack',\n channel: event.channel,\n thread: event.thread_ts ?? event.ts,\n sender: { id: event.user ?? event.bot_id ?? 'unknown', isBot: Boolean(event.bot_id) },\n text,\n mentionedBots,\n isDm: event.channel_type === 'im'\n }\n}\n","import type { SessionUpdate } from '@agentclientprotocol/sdk'\n\nexport type SlackAction =\n | { kind: 'post'; text: string }\n | { kind: 'update-main'; text: string }\n | { kind: 'set-status'; text: string }\n\nexport class OutputConverger {\n private buf = ''\n constructor(private mode: 'low' | 'medium' | 'high') {}\n\n private flush(): SlackAction[] {\n if (!this.buf.trim()) {\n this.buf = ''\n return []\n }\n const text = this.buf\n this.buf = ''\n return [{ kind: 'post', text }]\n }\n\n onUpdate(update: SessionUpdate): SlackAction[] {\n switch (update.sessionUpdate) {\n case 'agent_message_chunk': {\n const content = (update as { content?: { type?: string; text?: string } }).content\n if (content?.type === 'text') this.buf += content.text ?? ''\n return []\n }\n case 'agent_thought_chunk': {\n if (this.mode === 'low') return [...this.flush(), { kind: 'set-status', text: 'is thinking…' }]\n if (this.mode !== 'high') return []\n const content = (update as { content?: { text?: string } }).content\n return [...this.flush(), { kind: 'update-main', text: `_thinking: ${content?.text ?? ''}_` }]\n }\n case 'tool_call':\n case 'tool_call_update': {\n const title = (update as { title?: string }).title ?? (update as { toolCallId?: string }).toolCallId ?? 'tool'\n if (this.mode === 'low') return [...this.flush(), { kind: 'set-status', text: title }]\n return [...this.flush(), { kind: 'update-main', text: `:hammer_and_wrench: ${title}` }]\n }\n case 'usage_update':\n return [] // dropped (goes to telemetry, not the channel)\n default:\n return []\n }\n }\n\n onFinal(link: string): SlackAction[] {\n if (this.mode === 'low') return [...this.flush(), { kind: 'set-status', text: '' }]\n return [...this.flush(), { kind: 'post', text: `:white_check_mark: done — <${link}|details>` }]\n }\n}\n","import { Cron } from 'croner'\nimport type { CronDef } from '../agents/agent-schema.js'\nimport type { NormalizedMessage } from '../messages/normalized.js'\n\nexport function buildSyntheticMessage(\n agentId: string,\n cron: CronDef,\n traceId: string\n): { agentId: string; msg: NormalizedMessage } {\n const msg: NormalizedMessage = {\n msgId: `cron:${cron.id}:${traceId}`,\n traceId,\n source: 'cron',\n platform: 'slack',\n channel: cron.target.channel,\n thread: `cron:${cron.id}:${traceId}`, // fresh thread per fire\n sender: { id: `cron:${cron.id}`, isBot: false },\n text: cron.trigger,\n mentionedBots: [],\n isDm: false,\n trigger: 'cron'\n }\n return { agentId, msg }\n}\n\nexport class Scheduler {\n private jobs: Cron[] = []\n constructor(private deps: { onFire: (agentId: string, msg: NormalizedMessage) => void; newTraceId: () => string }) {}\n\n register(agentId: string, cron: CronDef): void {\n this.jobs.push(\n new Cron(cron.schedule, () => {\n const { msg } = buildSyntheticMessage(agentId, cron, this.deps.newTraceId())\n this.deps.onFire(agentId, msg)\n })\n )\n }\n\n stop(): void {\n for (const j of this.jobs) j.stop()\n this.jobs = []\n }\n}\n","import { z } from 'zod'\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs'\nimport { dirname } from 'node:path'\nimport type { RuntimeDef, Config } from '../config/config-schema.js'\nimport { registryPath, registryCachePath } from '../paths.js'\n\nconst PackageDistSchema = z.object({ package: z.string(), args: z.array(z.string()).default([]) })\nconst BinaryPlatformSchema = z.object({\n archive: z.string().optional(),\n cmd: z.string(),\n args: z.array(z.string()).default([]),\n env: z.record(z.string(), z.string()).default({})\n})\nconst DistributionSchema = z.object({\n npx: PackageDistSchema.optional(),\n uvx: PackageDistSchema.optional(),\n binary: z.record(z.string(), BinaryPlatformSchema).optional()\n})\nexport const RegistryEntrySchema = z.object({\n id: z.string(),\n name: z.string().default(''),\n version: z.string().default(''),\n distribution: DistributionSchema\n})\nexport type RegistryEntry = z.infer<typeof RegistryEntrySchema>\n\n// Root tolerates both an id-keyed object and an {agents:[...]} array; normalizes to {agents: Record}.\nexport const RegistryDocSchema = z\n .object({ agents: z.union([z.array(RegistryEntrySchema), z.record(z.string(), RegistryEntrySchema)]) })\n .transform((d) => ({\n agents: Array.isArray(d.agents) ? Object.fromEntries(d.agents.map((a) => [a.id, a])) : d.agents\n }))\nexport type RegistryDoc = { agents: Record<string, RegistryEntry> }\n\nexport function platformKey(): string | null {\n const os =\n process.platform === 'win32'\n ? 'windows'\n : process.platform === 'darwin'\n ? 'darwin'\n : process.platform === 'linux'\n ? 'linux'\n : null\n const arch = process.arch === 'arm64' ? 'aarch64' : process.arch === 'x64' ? 'x86_64' : null\n if (!os || !arch) return null\n return `${os}-${arch}`\n}\n\nexport function toRuntimeDef(entry: RegistryEntry): RuntimeDef | null {\n const d = entry.distribution\n if (d.npx) return { command: 'npx', args: ['-y', d.npx.package, ...d.npx.args], env: [] }\n if (d.uvx) return { command: 'uvx', args: [d.uvx.package, ...d.uvx.args], env: [] }\n if (d.binary) {\n const key = platformKey()\n const bin = key ? d.binary[key] : undefined\n if (!bin) return null\n return { command: bin.cmd, args: bin.args, env: Object.entries(bin.env).map(([name, value]) => ({ name, value })) }\n }\n return null\n}\n\nconst REGISTRY_URL = 'https://cdn.agentclientprotocol.com/registry/v1/latest/registry.json'\nconst DEFAULT_TIMEOUT_MS = 4500\n\ninterface CacheMeta {\n etag?: string\n lastModified?: string\n fetchedAt?: number\n}\n\nfunction readCachedDoc(root: string): RegistryDoc | null {\n const file = registryPath(root)\n if (!existsSync(file)) return null\n try {\n return RegistryDocSchema.parse(JSON.parse(readFileSync(file, 'utf8')))\n } catch {\n return null\n }\n}\n\nfunction readCacheMeta(root: string): CacheMeta {\n const file = registryCachePath(root)\n if (!existsSync(file)) return {}\n try {\n return JSON.parse(readFileSync(file, 'utf8')) as CacheMeta\n } catch {\n return {}\n }\n}\n\nexport async function fetchRegistry(\n root: string,\n opts: { fetchImpl?: typeof fetch; timeoutMs?: number } = {}\n): Promise<RegistryDoc> {\n const doFetch = opts.fetchImpl ?? fetch\n const meta = readCacheMeta(root)\n const headers: Record<string, string> = {}\n if (meta.etag) headers['If-None-Match'] = meta.etag\n if (meta.lastModified) headers['If-Modified-Since'] = meta.lastModified\n\n const ac = new AbortController()\n const timer = setTimeout(() => ac.abort(), opts.timeoutMs ?? DEFAULT_TIMEOUT_MS)\n try {\n const res = await doFetch(REGISTRY_URL, { headers, signal: ac.signal })\n if (res.status === 304) return readCachedDoc(root) ?? { agents: {} }\n if (!res.ok) return readCachedDoc(root) ?? { agents: {} }\n const bodyText = await res.text()\n const doc = RegistryDocSchema.parse(JSON.parse(bodyText))\n mkdirSync(dirname(registryPath(root)), { recursive: true }) // root may not exist on a zero-config first run\n writeFileSync(registryPath(root), bodyText)\n const newMeta: CacheMeta = {\n etag: res.headers.get('etag') ?? undefined,\n lastModified: res.headers.get('last-modified') ?? undefined,\n fetchedAt: Date.now()\n }\n writeFileSync(registryCachePath(root), JSON.stringify(newMeta))\n return doc\n } catch {\n return readCachedDoc(root) ?? { agents: {} }\n } finally {\n clearTimeout(timer)\n }\n}\n\nexport async function defaultRuntimes(\n root: string,\n opts: { mode?: 'cache-first' | 'blocking'; fetchImpl?: typeof fetch; timeoutMs?: number } = {}\n): Promise<Record<string, RuntimeDef>> {\n const mode = opts.mode ?? 'blocking'\n const cached = mode === 'cache-first' ? readCachedDoc(root) : null\n let doc: RegistryDoc\n if (cached) {\n doc = cached\n void fetchRegistry(root, opts).catch(() => {}) // background refresh; affects next run only\n } else {\n doc = await fetchRegistry(root, opts)\n }\n const out: Record<string, RuntimeDef> = {}\n for (const [id, entry] of Object.entries(doc.agents)) {\n const rt = toRuntimeDef(entry)\n if (rt) out[id] = rt\n }\n return out\n}\n\nexport async function resolveRuntimes(\n cfg: Config,\n root: string,\n opts: {\n neededRuntimes?: string[]\n mode?: 'cache-first' | 'blocking'\n fetchImpl?: typeof fetch\n timeoutMs?: number\n } = {}\n): Promise<Record<string, RuntimeDef>> {\n const userRuntimes = cfg.runtimes ?? {}\n const needed = opts.neededRuntimes\n if (needed && needed.length > 0 && needed.every((n) => userRuntimes[n])) {\n return { ...userRuntimes }\n }\n const defaults = await defaultRuntimes(root, opts)\n return { ...defaults, ...userRuntimes }\n}\n","// Minimal leveled logger. The daemon had no logging wired to `logging.level`\n// (config parsed it but nothing consumed it), so startup was silent. This gives\n// visible, level-gated milestones: agents loaded, runtimes ready, slack connected, …\nexport type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error'\n\nconst ORDER: Record<LogLevel, number> = { trace: 10, debug: 20, info: 30, warn: 40, error: 50 }\n\nexport interface Logger {\n trace: (msg: string) => void\n debug: (msg: string) => void\n info: (msg: string) => void\n warn: (msg: string) => void\n error: (msg: string) => void\n}\n\nexport function makeLogger(level: LogLevel = 'info'): Logger {\n const threshold = ORDER[level] ?? ORDER.info\n const emit = (lvl: LogLevel, msg: string) => {\n if (ORDER[lvl] < threshold) return\n const line = `[agentconnect] ${lvl.toUpperCase().padEnd(5)} ${msg}`\n if (ORDER[lvl] >= ORDER.warn) console.error(line)\n else console.log(line)\n }\n return {\n trace: (m) => emit('trace', m),\n debug: (m) => emit('debug', m),\n info: (m) => emit('info', m),\n warn: (m) => emit('warn', m),\n error: (m) => emit('error', m)\n }\n}\n","import { z } from 'zod'\n\n/**\n * The protocol envelope — every frame, both directions, is wrapped in this.\n * Mirrors daemon-cp-ws-protocol.md §1.1.\n *\n * `payload` is left as `unknown` here and validated by the per-type schema in\n * `frames/*` via `FRAME_SCHEMAS[type]` (see `frame.ts`). This two-step parse is\n * what lets the codec answer an unknown `type` with `UNKNOWN_FRAME` (a REP)\n * instead of a hard close — forward-compat, protocol §1.\n */\nexport const Envelope = z.object({\n v: z.literal(1), // protocol major; bump = breaking\n id: z.string().uuid(), // unique per frame (sender-generated)\n ts: z.string().datetime(), // RFC3339, sender clock (advisory only)\n type: z.string(), // frame discriminator, e.g. \"register\"\n corr: z.string().uuid().optional(), // correlation: set on a reply to the request's `id`\n payload: z.unknown() // validated by the per-type schema\n})\nexport type Envelope = z.infer<typeof Envelope>\n\n/**\n * Control-frame envelope extension — protocol §4.2.\n *\n * Ordered / fenced C→D frames carry this block alongside `payload`. It is the\n * fencing surface: `epoch` (sessionEpoch this frame was issued under),\n * per-agent `seq`, the `agentId` it belongs to, and the `launchId` fence.\n * Daemon validation order: epoch → launchId → seq.\n */\nexport const ControlExt = z.object({\n epoch: z.number().int(), // sessionEpoch this frame was issued under (§3.1 fencing)\n seq: z.number().int().optional(), // per-agent monotonic, when agent-scoped\n agentId: z.string().uuid().optional(), // present iff seq present\n launchId: z.string().uuid().optional() // per-launch fence, §4.4\n})\nexport type ControlExt = z.infer<typeof ControlExt>\n\n/** The all-zero UUID used when a frame is malformed past the point of reading `id`. */\nexport const NIL_UUID = '00000000-0000-0000-0000-000000000000'\n","import { z } from 'zod'\n\n/**\n * Auth & identity — protocol §3.1 / §3.2.\n *\n * `auth` is the first frame after the socket opens. `auth/ok` carries the\n * minted `sessionEpoch` (the global fencing token), heartbeat cadence, and the\n * resume verdict.\n */\n\nexport const AuthReq = z.object({\n daemonToken: z.string(), // short-lived, rotatable daemon credential; its `sub` IS the daemonId\n // Optional: the token's `sub` is the authoritative daemonId. A daemon MAY echo\n // it (legacy / explicit), but if present it must equal the token subject.\n daemonId: z.string().uuid().optional(),\n machineId: z.string().uuid().optional(), // 🅼 machine identity, §3.2\n attestation: z.string().optional(), // 🅼 signed proof (JWS), §3.2\n agentVersion: z.string(), // daemon build/version\n resume: z\n .object({\n lastEpoch: z.number().int(), // sessionEpoch the daemon last held\n lastRecvSeq: z.record(z.string(), z.number()) // per-agent last seq it consumed (§4)\n })\n .optional()\n})\nexport type AuthReq = z.infer<typeof AuthReq>\n\nexport const AuthOk = z.object({\n daemonId: z.string().uuid(),\n sessionEpoch: z.number().int(), // monotonic; bumped each successful (re)auth — fencing token\n heartbeatSec: z.number().int(), // cadence the daemon must emit heartbeat at\n serverTime: z.string().datetime(),\n resume: z\n .object({\n accepted: z.boolean(), // false ⇒ daemon must do a full register reconcile\n redeliverFromSeq: z.record(z.string(), z.number()).optional()\n })\n .optional()\n})\nexport type AuthOk = z.infer<typeof AuthOk>\n","import { z } from 'zod'\nimport { Platform, RouteAssign } from './route.js'\nimport { CronUpsert } from './cron.js'\nimport { SecretsGrant } from './secrets.js'\n\n/**\n * Capability upload + the reconcile snapshot — protocol §3.3.\n *\n * `register/ok` is the authoritative source of truth: the daemon converges its\n * local cache to it. CP wins all conflicts, so re-issuing the same snapshot is\n * idempotent.\n */\n\nexport const RegisterReq = z.object({\n host: z.string(), // hostname (display only)\n capabilities: z.object({\n platforms: z.array(Platform), // D3 adapters present\n runtimes: z.array(z.string()), // e.g. [\"claude\",\"codex\"]\n acp: z.boolean(), // can this daemon host ACP sessions (D6)?\n features: z.array(z.string()).default([]) // e.g. [\"cli-wrapper-fallback\",\"worktree-iso\"]\n }),\n maxAgents: z.number().int(), // concurrency ceiling for placement (C3)\n localState: z.object({\n // what the daemon currently believes it owns (for reconcile)\n assignments: z.array(z.string()), // sessionKeys it is actively serving\n crons: z.array(z.string()), // cronIds it has scheduled\n leases: z.array(z.string()) // leaseIds it holds\n })\n})\nexport type RegisterReq = z.infer<typeof RegisterReq>\n\nexport const RegisterOk = z.object({\n routingEpoch: z.number().int(), // version of the routing table this snapshot reflects\n // Authoritative reconcile snapshot — daemon converges its local cache to this:\n assignments: z.array(RouteAssign), // the route/assign set the daemon SHOULD own\n crons: z.array(CronUpsert), // the cron set it SHOULD run\n leases: z.array(SecretsGrant), // secret leases it SHOULD hold\n drop: z.object({\n // things in localState the CP says to release\n assignments: z.array(z.string()),\n crons: z.array(z.string())\n })\n})\nexport type RegisterOk = z.infer<typeof RegisterOk>\n","import { z } from 'zod'\n\n/**\n * Routing & orchestration (C→D control) — protocol §5.\n *\n * `SessionKey` is the canonical session primitive shared across route/*,\n * agent/*, and event/session. Its canonical string form is\n * `${platform}:${channel}:${thread ?? \"-\"}`.\n */\n\nexport const Platform = z.enum(['slack', 'telegram'])\nexport type Platform = z.infer<typeof Platform>\n\nexport const SessionKey = z.object({\n platform: Platform,\n channel: z.string(),\n thread: z.string().optional() // absent = channel-root\n})\nexport type SessionKey = z.infer<typeof SessionKey>\n\n/** Trigger-matching rule for a binding (protocol §5.1). */\nexport const BindRule = z.object({\n match: z.discriminatedUnion('kind', [\n z.object({ kind: z.literal('mention') }),\n z.object({ kind: z.literal('dm') }),\n z.object({ kind: z.literal('keyword'), value: z.string() }),\n z.object({ kind: z.literal('auto') }) // alert-channel auto-handle\n ])\n})\nexport type BindRule = z.infer<typeof BindRule>\n\nexport const RouteAssign = z.object({\n // also appears in RegisterOk.assignments[]\n sessionKey: SessionKey,\n agentId: z.string().uuid(),\n workspaceId: z.string().uuid(), // which D9 workspace to prepare\n bindRules: z.array(BindRule).default([])\n})\nexport type RouteAssign = z.infer<typeof RouteAssign>\n\nexport const RouteAssignAck = z.object({\n ok: z.boolean(),\n sessionKey: SessionKey,\n reason: z.string().optional()\n})\nexport type RouteAssignAck = z.infer<typeof RouteAssignAck>\n\nexport const RouteUpdate = z.object({\n routingEpoch: z.number().int(),\n rules: z.array(z.object({ match: z.unknown(), agentId: z.string().uuid() }))\n})\nexport type RouteUpdate = z.infer<typeof RouteUpdate>\n\n/** Graceful scale-down / rebalance — protocol §5.3. */\nexport const Drain = z.object({\n scope: z.union([\n z.object({ kind: z.literal('agent'), agentId: z.string().uuid() }),\n z.object({ kind: z.literal('daemon') }), // whole-daemon drain (shutdown/upgrade)\n z.object({ kind: z.literal('session'), sessionKey: SessionKey })\n ]),\n deadline: z.string().datetime() // hard cutoff; in-flight turns past this are cancelled\n})\nexport type Drain = z.infer<typeof Drain>\n\nexport const DrainProgress = z.object({\n remaining: z.number().int(),\n drained: z.array(SessionKey)\n})\nexport type DrainProgress = z.infer<typeof DrainProgress>\n\nexport const DrainDone = z.object({\n released: z.array(SessionKey) // CP may now reassign — fenced by new epoch\n})\nexport type DrainDone = z.infer<typeof DrainDone>\n","import { z } from 'zod'\n\n/**\n * Cron sinks to the daemon (D5) — protocol §5.4.\n *\n * The CP owns the definition; the daemon owns firing + last-run persistence so\n * crons fire even when the CP is down.\n */\n\nexport const CronUpsert = z.object({\n cronId: z.string().uuid(),\n schedule: z.string(), // croner expression (tz-aware)\n target: z.object({ channel: z.string() }),\n trigger: z.string(), // synthetic message text injected into D4 on fire\n enabled: z.boolean().default(true)\n})\nexport type CronUpsert = z.infer<typeof CronUpsert>\n\nexport const CronRemove = z.object({\n cronId: z.string().uuid()\n})\nexport type CronRemove = z.infer<typeof CronRemove>\n","import { z } from 'zod'\nimport { Platform } from './route.js'\n\n/**\n * Secrets (C5 ↔ D10) — protocol §6.\n *\n * Lease-based, no plaintext on the wire or in PG. Every frame carries a\n * REFERENCE to a Vault/KMS path, never the secret material itself.\n */\n\nexport const SecretsRequest = z.object({\n // D→C, REQ — daemon asks for a lease at session start\n scope: z.object({\n platform: Platform,\n workspaceId: z.string().uuid()\n })\n})\nexport type SecretsRequest = z.infer<typeof SecretsRequest>\n\nexport const SecretsGrant = z.object({\n // C→D, REP (also in RegisterOk.leases[])\n leaseId: z.string().uuid(),\n scope: z.object({\n platform: z.string(),\n workspaceId: z.string().uuid()\n }),\n ref: z.string(), // Vault/KMS path or handle — NOT the secret\n ttl: z.number().int(), // seconds\n renewBeforeSec: z.number().int() // daemon should renew this many sec before expiry\n})\nexport type SecretsGrant = z.infer<typeof SecretsGrant>\n\nexport const SecretsRenew = z.object({\n leaseId: z.string().uuid() // D→C REQ → new SecretsGrant\n})\nexport type SecretsRenew = z.infer<typeof SecretsRenew>\n\nexport const SecretsRevoke = z.object({\n leaseId: z.string().uuid(),\n reason: z.string() // C→D EVT (hot revoke)\n})\nexport type SecretsRevoke = z.infer<typeof SecretsRevoke>\n\n/** 🅼 Direct-to-store upload/download grant — protocol §3.2 / frame #25. */\nexport const ScopeAttestation = z.object({\n machineId: z.string().uuid(),\n scope: z.enum(['attachment.put', 'attachment.get', 'facts.put']),\n resourceRef: z.string(), // opaque object key/prefix\n jws: z.string(), // signed capability the store verifies offline\n exp: z.string().datetime()\n})\nexport type ScopeAttestation = z.infer<typeof ScopeAttestation>\n","import { z } from 'zod'\nimport { SessionKey } from './route.js'\n\n/**\n * Agent lifecycle + delivery (protocol §4.3, §4.4, §7.4, §8).\n *\n * Body-locality invariant (protocol §12): no frame here carries\n * `NormalizedMessage.text`. `agent/prompt` ships a `NormalizedMessageRef` — a\n * reference the daemon resolves against its local body store.\n */\n\n/**\n * A REFERENCE/digest of a normalized message, NOT the body (protocol §4.3).\n * Enough for D4/D6 to fetch the local body and prompt.\n */\nexport const NormalizedMessageRef = z.object({\n sessionKey: SessionKey,\n platformMsgId: z.string(),\n seenUpToSeq: z.number().int()\n})\nexport type NormalizedMessageRef = z.infer<typeof NormalizedMessageRef>\n\nexport const AgentLaunch = z.object({\n // C→D, carries ControlExt(epoch)\n agentId: z.string().uuid(),\n runtime: z.string(), // must be in RegisterReq.capabilities.runtimes\n workspaceId: z.string().uuid(),\n capabilities: z.array(z.string()), // the active-capability pin (§8.1)\n mode: z.enum(['long_lived', 'per_turn']).default('long_lived') // 🅰️ decision #2 knob\n})\nexport type AgentLaunch = z.infer<typeof AgentLaunch>\n\nexport const AgentLaunched = z.object({\n // D→C, REP/EVT\n agentId: z.string().uuid(),\n launchId: z.string().uuid(), // new fence value\n acpSessionId: z.string().optional(), // 🅰️ present iff long-lived ACP session (default)\n startedAt: z.string().datetime(),\n runtime: z.string() // e.g. \"claude\" / \"codex\"\n})\nexport type AgentLaunched = z.infer<typeof AgentLaunched>\n\nexport const AgentStop = z.object({\n agentId: z.string().uuid(),\n launchId: z.string().uuid(),\n reason: z.string()\n})\nexport type AgentStop = z.infer<typeof AgentStop>\n\nexport const AgentPrompt = z.object({\n // C→D, carries ControlExt (epoch/seq/agentId/launchId)\n sessionKey: SessionKey,\n agentId: z.string().uuid(),\n content: NormalizedMessageRef, // a REFERENCE/digest, NOT the body\n seenUpToSeq: z.number().int() // freshness watermark, §4.5\n})\nexport type AgentPrompt = z.infer<typeof AgentPrompt>\n\nexport const AgentPromptAck = z.object({\n // D→C reply (corr = prompt.id)\n accepted: z.boolean(),\n reason: z.enum(['queued', 'held', 'scope_denied', 'no_session', 'stale']).optional(),\n seq: z.number().int() // echoes the accepted seq\n})\nexport type AgentPromptAck = z.infer<typeof AgentPromptAck>\n\nexport const AgentActivity = z.object({\n // D→C, EVT — activity-probe (§7.4)\n agentId: z.string().uuid(),\n launchId: z.string().uuid(),\n state: z.enum(['thinking', 'tool_call', 'awaiting_permission', 'idle']),\n ts: z.string().datetime()\n})\nexport type AgentActivity = z.infer<typeof AgentActivity>\n\nexport const AgentScopeDenied = z.object({\n // D→C, EVT — capability-scope audit (§8.1)\n agentId: z.string().uuid(),\n launchId: z.string().uuid(),\n capability: z.string()\n})\nexport type AgentScopeDenied = z.infer<typeof AgentScopeDenied>\n","import { z } from 'zod'\n\n/**\n * Telemetry & facts (D→C) — protocol §7.\n *\n * The dashboard's real-time source. `event/session` is the converged milestone\n * feed (NOT the message stream); `facts/runtime-profile` is the observed runtime\n * capability feed; `heartbeat` drives the watchdog.\n */\n\nexport const Heartbeat = z.object({\n load: z.object({\n cpu: z.number(),\n mem: z.number(),\n agents: z.number().int()\n }),\n health: z.enum(['ok', 'degraded']),\n activeSessions: z.number().int(),\n degradedScopes: z.array(z.string()).default([]) // e.g. expired-lease bindings (§6)\n})\nexport type Heartbeat = z.infer<typeof Heartbeat>\n\n/** Converged session lifecycle milestone — protocol §7.2. NOT the message stream. */\nexport const EventSession = z.object({\n sessionId: z.string().uuid(),\n agentId: z.string().uuid(),\n launchId: z.string().uuid(), // 🅰️ ties the event to its launch (§4.4)\n phase: z.enum(['start', 'plan', 'problem', 'end']),\n link: z.string().optional(), // deep-link to detail view\n summary: z.string().optional(), // short, human-facing milestone text\n ts: z.string().datetime()\n})\nexport type EventSession = z.infer<typeof EventSession>\n\n/** Observed capabilities of an installed runtime — protocol §7.3. */\nexport const FactsRuntimeProfile = z.object({\n runtime: z.string(), // \"claude\" / \"codex\" / ...\n version: z.string(),\n models: z.array(z.string()),\n contextWindow: z.number().int().optional(),\n acpSupport: z.enum(['full', 'partial', 'none']), // gates the dual-mode decision (#1)\n toolCalling: z.boolean()\n})\nexport type FactsRuntimeProfile = z.infer<typeof FactsRuntimeProfile>\n\n/** Non-secret config update — C→D EVT, protocol §8.3 / frame #26. */\nexport const ConfigPush = z.object({\n keys: z.record(z.string(), z.unknown())\n})\nexport type ConfigPush = z.infer<typeof ConfigPush>\n\n/** Fleet: drain+exit, supervisor restarts — C→D REQ, protocol §8.3 / frame #27. */\nexport const DaemonRestart = z.object({\n reason: z.string(),\n drainFirst: z.boolean().default(true)\n})\nexport type DaemonRestart = z.infer<typeof DaemonRestart>\n\n/** Fleet: drain+exit for version bump — C→D REQ, protocol §8.3 / frame #28. */\nexport const DaemonUpgrade = z.object({\n targetVersion: z.string(),\n drainFirst: z.boolean().default(true)\n})\nexport type DaemonUpgrade = z.infer<typeof DaemonUpgrade>\n\n/** Reply to a fleet restart/upgrade REQ (protocol §8.3). */\nexport const DaemonControlAck = z.object({\n accepted: z.boolean(),\n willDrainUntil: z.string().datetime().optional()\n})\nexport type DaemonControlAck = z.infer<typeof DaemonControlAck>\n\n/**\n * Generic acknowledgement for REQs whose reply is just `ack` in the frame index\n * (cron/upsert, cron/remove, agent/stop). Kept permissive but typed.\n */\nexport const Ack = z.object({\n ok: z.boolean(),\n reason: z.string().optional()\n})\nexport type Ack = z.infer<typeof Ack>\n","import { z } from 'zod'\n\n/**\n * Error model — protocol §9.\n *\n * Every REQ can be answered by an `error` REP (`corr` = request `id`). Errors\n * are typed and actionable, not free text.\n */\n\nexport const ErrorCode = z.enum([\n // protocol / framing\n 'UNKNOWN_FRAME',\n 'FRAME_TOO_LARGE',\n 'PROTOCOL_STATE',\n 'BAD_PAYLOAD',\n // auth / identity\n 'AUTH_FAILED',\n 'ATTESTATION_INVALID',\n // fencing / ordering\n 'STALE_EPOCH',\n 'STALE_LAUNCH',\n 'SEQ_GAP',\n // delivery\n 'NO_SESSION',\n 'HELD',\n 'SCOPE_DENIED',\n // secrets\n 'LEASE_EXPIRED',\n 'LEASE_DENIED',\n // generic\n 'RATE_LIMITED',\n 'INTERNAL'\n])\nexport type ErrorCode = z.infer<typeof ErrorCode>\n\nexport const ErrorFrame = z.object({\n code: ErrorCode,\n message: z.string(), // human-readable, redacted of secrets\n retryable: z.boolean(),\n details: z.record(z.string(), z.unknown()).optional() // e.g. {expected: <seq>} for SEQ_GAP\n})\nexport type ErrorFrame = z.infer<typeof ErrorFrame>\n\n/**\n * WebSocket close codes — protocol §9.\n *\n * `4401` requires a fresh credential before reconnecting; everything else uses\n * exponential backoff with jitter.\n */\nexport const CloseCode = {\n BAD_SUBPROTOCOL: 4400, // bad subprotocol/handshake\n AUTH_FAILED: 4401, // auth failed (don't auto-retry)\n EPOCH_CONFLICT: 4409, // epoch conflict on handshake (do full reconcile)\n UNSUPPORTED_ENCODING: 4415, // binary/unsupported encoding\n RATE_LIMITED: 4429, // rate-limited (backoff)\n SERVER_INTERNAL: 1011, // server internal\n SERVER_RESTARTING: 1012, // server restarting (reconnect with backoff)\n /** soft 256 KiB cap exceeded → ws library close (protocol §1). */\n MESSAGE_TOO_BIG: 1009\n} as const\nexport type CloseCode = (typeof CloseCode)[keyof typeof CloseCode]\n","import { z } from 'zod'\n\nimport { AuthReq, AuthOk } from './frames/auth.js'\nimport { RegisterReq, RegisterOk } from './frames/register.js'\nimport { RouteAssign, RouteAssignAck, RouteUpdate, Drain, DrainProgress, DrainDone } from './frames/route.js'\nimport {\n AgentLaunch,\n AgentLaunched,\n AgentStop,\n AgentPrompt,\n AgentPromptAck,\n AgentActivity,\n AgentScopeDenied\n} from './frames/agent.js'\nimport { CronUpsert, CronRemove } from './frames/cron.js'\nimport { SecretsRequest, SecretsGrant, SecretsRenew, SecretsRevoke, ScopeAttestation } from './frames/secrets.js'\nimport {\n Heartbeat,\n EventSession,\n FactsRuntimeProfile,\n ConfigPush,\n DaemonRestart,\n DaemonUpgrade,\n DaemonControlAck,\n Ack\n} from './frames/telemetry.js'\nimport { ErrorFrame } from './frames/error.js'\n\n/**\n * The single source of truth for the wire: `type` string → payload zod schema.\n *\n * Mirrors the frame index in daemon-cp-ws-protocol.md §10 (the 29 numbered\n * frames) plus the correlated REP types named in the \"Reply\" column\n * (`route/assign/ack`, `drain/done`, and the generic `ack` replies) that also\n * travel on the wire and must be decodable.\n *\n * `ws/codec.ts` validates every inbound `payload` against `FRAME_SCHEMAS[type]`;\n * an unknown `type` → `ErrorFrame{code:\"UNKNOWN_FRAME\"}` (a REP, not a close).\n */\nexport const FRAME_SCHEMAS = {\n // ── auth / identity ──\n auth: AuthReq,\n 'auth/ok': AuthOk,\n // ── register / reconcile ──\n register: RegisterReq,\n 'register/ok': RegisterOk,\n // ── telemetry ──\n heartbeat: Heartbeat,\n // ── agent lifecycle / delivery ──\n 'agent/launch': AgentLaunch,\n 'agent/launched': AgentLaunched,\n 'agent/stop': AgentStop,\n 'agent/prompt': AgentPrompt,\n 'agent/prompt/ack': AgentPromptAck,\n 'agent/activity': AgentActivity,\n 'agent/scope-denied': AgentScopeDenied,\n // ── routing / orchestration ──\n 'route/assign': RouteAssign,\n 'route/assign/ack': RouteAssignAck,\n 'route/update': RouteUpdate,\n 'daemon/drain': Drain,\n 'drain/progress': DrainProgress,\n 'drain/done': DrainDone,\n // ── cron ──\n 'cron/upsert': CronUpsert,\n 'cron/remove': CronRemove,\n // ── secrets ──\n 'secrets/request': SecretsRequest,\n 'secrets/grant': SecretsGrant,\n 'secrets/renew': SecretsRenew,\n 'secrets/revoke': SecretsRevoke,\n 'scope-attestation': ScopeAttestation,\n // ── dashboard / facts ──\n 'event/session': EventSession,\n 'facts/runtime-profile': FactsRuntimeProfile,\n // ── fleet / config ──\n 'config/push': ConfigPush,\n 'daemon/restart': DaemonRestart,\n 'daemon/upgrade': DaemonUpgrade,\n // ── generic replies ──\n 'daemon/control/ack': DaemonControlAck,\n ack: Ack,\n // ── error ──\n error: ErrorFrame\n} as const\n\n/** Union of every legal `type` discriminator on the wire. */\nexport type FrameType = keyof typeof FRAME_SCHEMAS\n\n/** All frame `type` strings, as a runtime array (used by guards / tests). */\nexport const FRAME_TYPES = Object.keys(FRAME_SCHEMAS) as FrameType[]\n\n/**\n * Builds the envelope schema for one frame `type` with a `type` literal and the\n * typed payload, so the discriminated union infers `payload` precisely.\n */\nfunction frame<T extends FrameType>(type: T, payload: (typeof FRAME_SCHEMAS)[T]) {\n return z.object({\n v: z.literal(1),\n id: z.string().uuid(),\n ts: z.string().datetime(),\n type: z.literal(type),\n corr: z.string().uuid().optional(),\n payload\n })\n}\n\n/**\n * `AnyFrame` — the discriminated union over `type` of every fully-validated\n * frame (envelope + typed payload). This is the runtime guard at the socket\n * edge and the precise inferred type the handlers switch on.\n */\nexport const AnyFrame = z.discriminatedUnion('type', [\n frame('auth', FRAME_SCHEMAS['auth']),\n frame('auth/ok', FRAME_SCHEMAS['auth/ok']),\n frame('register', FRAME_SCHEMAS['register']),\n frame('register/ok', FRAME_SCHEMAS['register/ok']),\n frame('heartbeat', FRAME_SCHEMAS['heartbeat']),\n frame('agent/launch', FRAME_SCHEMAS['agent/launch']),\n frame('agent/launched', FRAME_SCHEMAS['agent/launched']),\n frame('agent/stop', FRAME_SCHEMAS['agent/stop']),\n frame('agent/prompt', FRAME_SCHEMAS['agent/prompt']),\n frame('agent/prompt/ack', FRAME_SCHEMAS['agent/prompt/ack']),\n frame('agent/activity', FRAME_SCHEMAS['agent/activity']),\n frame('agent/scope-denied', FRAME_SCHEMAS['agent/scope-denied']),\n frame('route/assign', FRAME_SCHEMAS['route/assign']),\n frame('route/assign/ack', FRAME_SCHEMAS['route/assign/ack']),\n frame('route/update', FRAME_SCHEMAS['route/update']),\n frame('daemon/drain', FRAME_SCHEMAS['daemon/drain']),\n frame('drain/progress', FRAME_SCHEMAS['drain/progress']),\n frame('drain/done', FRAME_SCHEMAS['drain/done']),\n frame('cron/upsert', FRAME_SCHEMAS['cron/upsert']),\n frame('cron/remove', FRAME_SCHEMAS['cron/remove']),\n frame('secrets/request', FRAME_SCHEMAS['secrets/request']),\n frame('secrets/grant', FRAME_SCHEMAS['secrets/grant']),\n frame('secrets/renew', FRAME_SCHEMAS['secrets/renew']),\n frame('secrets/revoke', FRAME_SCHEMAS['secrets/revoke']),\n frame('scope-attestation', FRAME_SCHEMAS['scope-attestation']),\n frame('event/session', FRAME_SCHEMAS['event/session']),\n frame('facts/runtime-profile', FRAME_SCHEMAS['facts/runtime-profile']),\n frame('config/push', FRAME_SCHEMAS['config/push']),\n frame('daemon/restart', FRAME_SCHEMAS['daemon/restart']),\n frame('daemon/upgrade', FRAME_SCHEMAS['daemon/upgrade']),\n frame('daemon/control/ack', FRAME_SCHEMAS['daemon/control/ack']),\n frame('ack', FRAME_SCHEMAS['ack']),\n frame('error', FRAME_SCHEMAS['error'])\n])\nexport type AnyFrame = z.infer<typeof AnyFrame>\n\n/** Runtime guard: is `t` a known frame `type`? */\nexport function isFrameType(t: string): t is FrameType {\n return Object.prototype.hasOwnProperty.call(FRAME_SCHEMAS, t)\n}\n","import { randomUUID } from 'node:crypto'\nimport { Envelope, FRAME_SCHEMAS, NIL_UUID, type AnyFrame, type ControlExt, type FrameType } from './index.js'\n\n/** Soft cap per frame — 256 KiB (protocol §1). Over this → FRAME_TOO_LARGE. */\nexport const MAX_FRAME_BYTES = 256 * 1024\n\nexport type DecodeResult =\n | { ok: true; frame: AnyFrame; ext?: InboundControlExt }\n | { ok: false; id: string; msg: string }\n\nexport interface InboundControlExt {\n epoch?: number\n seq?: number\n agentId?: string\n launchId?: string\n}\n\nconst textEncoder = new TextEncoder()\nfunction byteLength(text: string): number {\n return textEncoder.encode(text).length\n}\n\nfunction extractControlExt(json: unknown): InboundControlExt | undefined {\n if (typeof json !== 'object' || json === null) return undefined\n const o = json as Record<string, unknown>\n const ext: InboundControlExt = {}\n if (typeof o.epoch === 'number') ext.epoch = o.epoch\n if (typeof o.seq === 'number') ext.seq = o.seq\n if (typeof o.agentId === 'string') ext.agentId = o.agentId\n if (typeof o.launchId === 'string') ext.launchId = o.launchId\n return Object.keys(ext).length > 0 ? ext : undefined\n}\n\nexport function decodeEnvelope(text: string): DecodeResult {\n if (byteLength(text) > MAX_FRAME_BYTES) {\n return { ok: false, id: NIL_UUID, msg: 'FRAME_TOO_LARGE' }\n }\n let json: unknown\n try {\n json = JSON.parse(text)\n } catch {\n return { ok: false, id: NIL_UUID, msg: 'invalid json' }\n }\n const env = Envelope.safeParse(json)\n if (!env.success) {\n const id =\n typeof json === 'object' && json !== null && typeof (json as { id?: unknown }).id === 'string'\n ? (json as { id: string }).id\n : NIL_UUID\n return { ok: false, id, msg: env.error.message }\n }\n const schema = FRAME_SCHEMAS[env.data.type as FrameType]\n if (!schema) {\n return { ok: false, id: env.data.id, msg: 'UNKNOWN_FRAME' }\n }\n const payload = schema.safeParse(env.data.payload)\n if (!payload.success) {\n return { ok: false, id: env.data.id, msg: payload.error.message }\n }\n const ext = extractControlExt(json)\n return {\n ok: true,\n frame: { ...env.data, payload: payload.data } as AnyFrame,\n ...(ext ? { ext } : {})\n }\n}\n\nexport interface BuildOpts {\n corr?: string\n id?: string\n ts?: string\n ext?: ControlExt\n}\n\nexport function buildEnvelope<T extends FrameType>(type: T, payload: unknown, opts: BuildOpts = {}): AnyFrame {\n const base = {\n v: 1 as const,\n id: opts.id ?? randomUUID(),\n ts: opts.ts ?? new Date().toISOString(),\n type,\n payload,\n ...(opts.corr ? { corr: opts.corr } : {}),\n ...(opts.ext ?? {})\n }\n return base as AnyFrame\n}\n\nexport function encode(frame: AnyFrame): string {\n return JSON.stringify(frame)\n}\n","/**\n * `ReqRep` — daemon-side request/reply correlation + retransmit (mirrors the CP\n * correlator). Holds an `id → pending` map for daemon-issued REQs (`auth`,\n * `register`). On timeout it retransmits the identical bytes (same `id`) up to\n * `maxTries`, all driven by the injected `Clock` so retries are deterministic in\n * tests. `settle(rep)` resolves on a correlated REP and rejects with a\n * {@link WireError} on a correlated `error` frame.\n */\nimport type { AnyFrame, ErrorFrame } from '@agentconnect.md/protocol'\nimport type { Clock, TimerHandle } from './clock.js'\n\n/** Transport-free representation of a typed wire `error` REP. */\nexport class WireError extends Error {\n readonly code: string\n readonly retryable: boolean\n readonly details?: Record<string, unknown>\n constructor(code: string, message: string, retryable = false, details?: Record<string, unknown>) {\n super(message)\n this.name = 'WireError'\n this.code = code\n this.retryable = retryable\n if (details) this.details = details\n }\n}\n\ninterface Pending {\n id: string\n encoded: string\n resolve: (frame: AnyFrame) => void\n reject: (err: unknown) => void\n tries: number\n timer?: TimerHandle\n}\n\nexport class ReqRep {\n private pending = new Map<string, Pending>()\n\n constructor(\n private readonly clock: Clock,\n private readonly ackTimeoutMs: number,\n private readonly maxTries = 5\n ) {}\n\n request(frame: AnyFrame, write: (encoded: string) => void): Promise<AnyFrame> {\n const encoded = JSON.stringify(frame)\n return new Promise<AnyFrame>((resolve, reject) => {\n const entry: Pending = { id: frame.id, encoded, resolve, reject, tries: 1 }\n this.pending.set(frame.id, entry)\n this.arm(entry, write)\n write(encoded)\n })\n }\n\n private arm(entry: Pending, write: (encoded: string) => void): void {\n entry.timer = this.clock.setTimeout(() => {\n if (!this.pending.has(entry.id)) return\n if (entry.tries >= this.maxTries) {\n this.pending.delete(entry.id)\n entry.reject(new WireError('INTERNAL', `no ack after ${this.maxTries} tries for ${entry.id}`, true))\n return\n }\n entry.tries += 1\n this.arm(entry, write)\n write(entry.encoded)\n }, this.ackTimeoutMs)\n }\n\n settle(frame: AnyFrame): boolean {\n const corr = frame.corr\n if (!corr) return false\n const entry = this.pending.get(corr)\n if (!entry) return false\n this.pending.delete(corr)\n if (entry.timer !== undefined) this.clock.clearTimeout(entry.timer)\n if (frame.type === 'error') {\n const e = frame.payload as ErrorFrame\n entry.reject(new WireError(e.code, e.message, e.retryable, e.details))\n } else {\n entry.resolve(frame)\n }\n return true\n }\n\n inflight(): number {\n return this.pending.size\n }\n\n rejectAll(err: unknown): void {\n for (const entry of this.pending.values()) {\n if (entry.timer !== undefined) this.clock.clearTimeout(entry.timer)\n entry.reject(err)\n }\n this.pending.clear()\n }\n}\n","/**\n * `CpClient` — the daemon-side CP WebSocket client FSM (protocol §2.1). Dials\n * out, runs the auth → register handshake, then (Tasks 5–7) emits heartbeats,\n * dispatches C→D control frames, and reconnects with backoff. Local-first:\n * `start()` is non-blocking and a CP failure never affects the daemon.\n */\nimport type { AnyFrame, RegisterReq, Heartbeat } from '@agentconnect.md/protocol'\nimport { buildEnvelope, decodeEnvelope, encode } from '@agentconnect.md/protocol'\nimport type { Clock, TimerHandle } from './clock.js'\nimport type { Transport } from './transport.js'\nimport { ReqRep, WireError } from './correlator.js'\nimport type { ConfigApply } from './config-apply.js'\nimport type { Logger } from '../log.js'\n\nconst ACK_TIMEOUT_MS = 5000\nconst BACKOFF_BASE_MS = 1000\nconst BACKOFF_CAP_MS = 30000\n\nexport type CpState = 'CONNECTING' | 'AUTHENTICATING' | 'REGISTERING' | 'READY' | 'DRAINING' | 'CLOSED' | 'DEGRADED'\n\nexport interface CpClientDeps {\n url: string\n token: string\n /** Optional: when unset, the token's `sub` is the authoritative daemonId and\n * the CP assigns it (raft-style). The adopted id is surfaced via `onDaemonId`. */\n daemonId?: string\n agentVersion: string\n host: string\n heartbeatDefaultMs: number\n maxAgents: number\n capabilities: () => RegisterReq['capabilities']\n localState: () => RegisterReq['localState']\n loadSnapshot: () => Heartbeat['load']\n activeSessions: () => number\n /** Unservable CP-rule agentIds, surfaced in heartbeat.degradedScopes. Defaults to []. */\n degradedScopes?: () => string[]\n configApply: ConfigApply\n clock: Clock\n /** Dial factory — production passes `() => ClientTransport.dial(url)`; tests inject a fake. */\n connect: () => Promise<Transport>\n log: Logger\n /** Backoff jitter in [0,1); defaults to Math.random. Injected as `() => 0` in tests. */\n jitter?: () => number\n /** Called with the authoritative daemonId from `auth/ok` (so the daemon can\n * persist a CP-assigned id when none was configured). */\n onDaemonId?: (daemonId: string) => void\n}\n\nexport class CpClient {\n state: CpState = 'CLOSED'\n sessionEpoch = 0\n routingEpoch = 0\n\n private transport?: Transport\n private readonly correlator: ReqRep\n private stopped = false\n private fatal = false // 4401 — never auto-retry\n private attempt = 0\n private reconnectTimer?: TimerHandle\n private lastAuthedEpoch = 0 // for resume on reconnect (per-agent seq tail is out of scope)\n private heartbeatTimer?: TimerHandle\n private heartbeatMs = 0\n\n constructor(private readonly deps: CpClientDeps) {\n this.correlator = new ReqRep(deps.clock, ACK_TIMEOUT_MS)\n }\n\n /** Non-blocking: kicks off the connect loop and returns. */\n start(): void {\n this.stopped = false\n this.fatal = false\n void this.attemptConnect()\n }\n\n async stop(): Promise<void> {\n this.stopped = true\n if (this.reconnectTimer !== undefined) {\n this.deps.clock.clearTimeout(this.reconnectTimer)\n this.reconnectTimer = undefined\n }\n this.stopHeartbeat()\n this.correlator.rejectAll(new Error('stopping'))\n this.transport?.close(1000, 'shutdown')\n this.state = 'CLOSED'\n }\n\n private async attemptConnect(): Promise<void> {\n if (this.stopped || this.fatal) return\n this.state = 'CONNECTING'\n try {\n const t = await this.deps.connect()\n this.transport = t\n t.onMessage((txt) => void this.onText(txt))\n t.onClose((c, r) => this.onClose(c, r))\n await this.handshake()\n this.attempt = 0 // connected — reset backoff\n } catch (err) {\n this.deps.log.warn(`cp: connect/handshake failed: ${(err as Error).message}`)\n this.transport?.close(1011, 'handshake failed')\n this.transport = undefined\n this.scheduleReconnect()\n }\n }\n\n private scheduleReconnect(): void {\n if (this.stopped || this.fatal) return\n if (this.reconnectTimer !== undefined) return // one in flight\n const jitter = this.deps.jitter ?? Math.random\n const base = Math.min(BACKOFF_CAP_MS, BACKOFF_BASE_MS * 2 ** this.attempt)\n const delay = base + Math.floor(jitter() * base) // full jitter, jitter()=0 → exactly base\n this.attempt += 1\n this.reconnectTimer = this.deps.clock.setTimeout(() => {\n this.reconnectTimer = undefined\n void this.attemptConnect()\n }, delay)\n }\n\n private async handshake(): Promise<void> {\n // ── auth ── (resume on reconnect; per-agent seq tail is out of scope → lastRecvSeq {})\n this.state = 'AUTHENTICATING'\n const authPayload: Record<string, unknown> = {\n daemonToken: this.deps.token,\n agentVersion: this.deps.agentVersion\n }\n // Send daemonId only if configured; otherwise the CP derives it from the\n // token's `sub` and returns it in auth/ok (raft-style token-only onboarding).\n if (this.deps.daemonId) {\n authPayload.daemonId = this.deps.daemonId\n }\n if (this.lastAuthedEpoch > 0) {\n authPayload.resume = { lastEpoch: this.lastAuthedEpoch, lastRecvSeq: {} }\n }\n const authOk = await this.request('auth', authPayload)\n const ok = authOk.payload as { daemonId: string; sessionEpoch: number; heartbeatSec: number }\n this.sessionEpoch = ok.sessionEpoch\n this.lastAuthedEpoch = ok.sessionEpoch\n // Adopt the authoritative daemonId the CP assigned (no-op if we already had one).\n if (ok.daemonId && ok.daemonId !== this.deps.daemonId) {\n this.deps.daemonId = ok.daemonId\n this.deps.onDaemonId?.(ok.daemonId)\n }\n\n // ── register ──\n this.state = 'REGISTERING'\n const regOk = await this.request('register', {\n host: this.deps.host,\n capabilities: this.deps.capabilities(),\n maxAgents: this.deps.maxAgents,\n localState: this.deps.localState()\n })\n const snap = regOk.payload as Parameters<ConfigApply['applyReconcileSnapshot']>[0]\n this.routingEpoch = snap.routingEpoch\n this.deps.configApply.applyReconcileSnapshot(snap)\n\n this.state = 'READY'\n this.heartbeatMs = ok.heartbeatSec > 0 ? ok.heartbeatSec * 1000 : this.deps.heartbeatDefaultMs\n this.armHeartbeat()\n this.deps.log.info(`cp: READY (epoch=${this.sessionEpoch}, routingEpoch=${this.routingEpoch})`)\n }\n\n private request(type: string, payload: unknown): Promise<AnyFrame> {\n const frame = buildEnvelope(type as Parameters<typeof buildEnvelope>[0], payload)\n return this.correlator.request(frame, (e) => this.transport!.send(e))\n }\n\n private async onText(text: string): Promise<void> {\n const decoded = decodeEnvelope(text)\n if (!decoded.ok) {\n this.sendError(decoded.id, this.decodeErrorCode(decoded.msg), decoded.msg, false)\n return\n }\n const frame = decoded.frame\n // A correlated REP/error settles a pending daemon-issued REQ.\n if (frame.corr && this.correlator.settle(frame)) return\n // §2.1 legal-state gate: control frames are only legal in READY/DRAINING.\n if (this.state !== 'READY' && this.state !== 'DRAINING') {\n this.sendError(frame.id, 'PROTOCOL_STATE', `${frame.type} illegal in ${this.state}`, false)\n return\n }\n // Fencing (protocol §4.2): reject any control frame issued under a stale epoch.\n if (decoded.ext?.epoch !== undefined && decoded.ext.epoch < this.sessionEpoch) {\n this.sendError(frame.id, 'STALE_EPOCH', 'epoch < current', true)\n return\n }\n this.dispatchControl(frame)\n }\n\n private decodeErrorCode(msg: string): 'UNKNOWN_FRAME' | 'FRAME_TOO_LARGE' | 'BAD_PAYLOAD' {\n if (msg === 'FRAME_TOO_LARGE') return 'FRAME_TOO_LARGE'\n if (msg === 'UNKNOWN_FRAME') return 'UNKNOWN_FRAME'\n return 'BAD_PAYLOAD'\n }\n\n private sendError(corr: string, code: string, message: string, retryable: boolean): void {\n if (!this.transport) return\n this.transport.send(encode(buildEnvelope('error', { code, message, retryable }, { corr })))\n }\n\n private onClose(code: number, _reason: string): void {\n this.stopHeartbeat()\n this.correlator.rejectAll(new WireError('INTERNAL', 'connection closed', true))\n if (code === 4401) {\n this.fatal = true\n this.state = 'CLOSED'\n this.deps.log.error('cp: AUTH_FAILED (4401) — not reconnecting; re-mint the daemon token')\n return\n }\n if (this.stopped) {\n this.state = 'CLOSED'\n return\n }\n this.state = 'DEGRADED'\n this.scheduleReconnect()\n }\n\n private armHeartbeat(): void {\n this.heartbeatTimer = this.deps.clock.setTimeout(() => {\n if (this.state !== 'READY') return\n this.transport?.send(\n encode(\n buildEnvelope('heartbeat', {\n load: this.deps.loadSnapshot(),\n health: 'ok',\n activeSessions: this.deps.activeSessions(),\n degradedScopes: this.deps.degradedScopes?.() ?? []\n })\n )\n )\n this.armHeartbeat()\n }, this.heartbeatMs)\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeatTimer !== undefined) {\n this.deps.clock.clearTimeout(this.heartbeatTimer)\n this.heartbeatTimer = undefined\n }\n }\n\n /** C→D control dispatch. The CP changes config, never live routing. */\n private dispatchControl(frame: AnyFrame): void {\n switch (frame.type) {\n case 'config/push':\n this.deps.configApply.applyConfigPush((frame.payload as { keys: Record<string, unknown> }).keys)\n return // EVT — no reply\n case 'cron/upsert':\n try {\n this.deps.configApply.upsertCron(frame.payload as Parameters<ConfigApply['upsertCron']>[0])\n this.reply(frame, 'ack', { ok: true })\n } catch (err) {\n this.sendError(frame.id, 'BAD_PAYLOAD', `cron upsert failed: ${(err as Error).message}`, false)\n }\n return\n case 'cron/remove':\n this.deps.configApply.removeCron((frame.payload as { cronId: string }).cronId)\n this.reply(frame, 'ack', { ok: true })\n return\n case 'route/assign': {\n const a = frame.payload as Parameters<ConfigApply['applyRouteAssign']>[0]\n this.deps.configApply.applyRouteAssign(a)\n this.reply(frame, 'route/assign/ack', { ok: true, sessionKey: a.sessionKey })\n return\n }\n case 'route/update':\n this.deps.configApply.applyRouteUpdate(frame.payload as Parameters<ConfigApply['applyRouteUpdate']>[0])\n return // EVT — no reply\n // ── unimplemented this slice ──\n case 'agent/launch':\n case 'agent/stop':\n case 'agent/prompt':\n case 'daemon/drain':\n case 'daemon/restart':\n case 'daemon/upgrade':\n this.sendError(frame.id, 'INTERNAL', `${frame.type} not implemented`, false)\n return\n default:\n this.deps.log.debug(`cp: ignoring ${frame.type}`)\n return\n }\n }\n\n private reply(req: AnyFrame, type: string, payload: unknown): void {\n this.transport?.send(encode(buildEnvelope(type as Parameters<typeof buildEnvelope>[0], payload, { corr: req.id })))\n }\n}\n","/**\n * Transport seam — the no-real-socket boundary for the daemon's CP client. The\n * FSM depends ONLY on this interface, so tests inject a `FakeTransport`.\n * `ClientTransport` is the production impl: it DIALS OUT (the daemon connects to\n * the CP, never the reverse) and resolves once the socket is open.\n */\nimport WebSocket from 'ws'\nimport { MAX_FRAME_BYTES } from '@agentconnect.md/protocol'\n\nexport const SUBPROTOCOL = 'agentconnect.v1'\nconst DEFAULT_WS_PATH = '/daemon/ws'\n\nexport interface Transport {\n send(text: string): void\n onMessage(cb: (text: string) => void): void\n onClose(cb: (code: number, reason: string) => void): void\n close(code: number, reason: string): void\n readonly subprotocol: string\n}\n\nexport class ClientTransport implements Transport {\n get subprotocol(): string {\n return this.ws.protocol\n }\n\n private constructor(private readonly ws: WebSocket) {}\n\n /**\n * Dial `wss://<host>/daemon/ws` with the `agentconnect.v1` subprotocol.\n * Resolves once the socket is open; rejects on any error before open\n * (refused, bad handshake/subprotocol → HTTP 400).\n */\n static dial(url: string): Promise<Transport> {\n const wsUrl = url.endsWith(DEFAULT_WS_PATH) ? url : url.replace(/\\/+$/, '') + DEFAULT_WS_PATH\n return new Promise<Transport>((resolve, reject) => {\n const ws = new WebSocket(wsUrl, [SUBPROTOCOL], { maxPayload: MAX_FRAME_BYTES })\n const onPreOpenError = (err: Error) => {\n ws.removeAllListeners()\n reject(err)\n }\n ws.once('error', onPreOpenError)\n ws.once('open', () => {\n ws.removeListener('error', onPreOpenError)\n resolve(new ClientTransport(ws))\n })\n })\n }\n\n send(text: string): void {\n this.ws.send(text)\n }\n onMessage(cb: (text: string) => void): void {\n this.ws.on('message', (data: unknown, isBinary?: boolean) => {\n if (isBinary) return // JSON text frames only (protocol §1)\n cb(typeof data === 'string' ? data : String(data))\n })\n }\n onClose(cb: (code: number, reason: string) => void): void {\n this.ws.on('close', (code: number, reason: Buffer) => cb(code, reason.toString()))\n }\n close(code: number, reason: string): void {\n this.ws.close(code, reason)\n }\n}\n","/**\n * `CpCronRegistry` — the daemon's set of CP-pushed crons, keyed by `cronId`\n * (distinct from per-agent `agent.crons`). On fire it calls `onFire(cron)`; the\n * daemon resolves `cron.target.channel` to an owning agent and dispatches.\n * `converge` makes the live set exactly a register/ok snapshot.\n */\nimport { Cron } from 'croner'\nimport type { CronUpsert } from '@agentconnect.md/protocol'\n\nexport class CpCronRegistry {\n private jobs = new Map<string, Cron>()\n\n constructor(private readonly deps: { onFire: (cron: CronUpsert) => void }) {}\n\n upsert(cron: CronUpsert): void {\n this.remove(cron.cronId)\n if (cron.enabled === false) return\n // `new Cron` throws on a bad schedule — surfaced to the caller (handler → error REP).\n this.jobs.set(cron.cronId, new Cron(cron.schedule, () => this.deps.onFire(cron)))\n }\n\n remove(cronId: string): void {\n this.jobs.get(cronId)?.stop()\n this.jobs.delete(cronId)\n }\n\n converge(crons: CronUpsert[]): void {\n const keep = new Set(crons.map((c) => c.cronId))\n for (const id of [...this.jobs.keys()]) if (!keep.has(id)) this.remove(id)\n for (const c of crons) this.upsert(c)\n }\n\n ids(): string[] {\n return [...this.jobs.keys()]\n }\n\n stop(): void {\n for (const id of [...this.jobs.keys()]) this.remove(id)\n }\n}\n","/**\n * `ConfigApply` — the seam from CP control frames to daemon config/cron\n * mutations. The CP changes *config*, never live routing; the `Daemon`\n * implements this interface. `mergeConfigPush` is the pure whitelist-merge used\n * by the real implementation and unit-tested on its own (Task 6).\n */\nimport type { RegisterOk, CronUpsert, RouteAssign, RouteUpdate } from '@agentconnect.md/protocol'\nimport type { Config } from '../config/config-schema.js'\n\nexport interface ConfigApply {\n /** Merge whitelisted non-secret config keys (config/push EVT). */\n applyConfigPush(keys: Record<string, unknown>): void\n /** Converge crons (+ record leases) from the register/ok reconcile snapshot. */\n applyReconcileSnapshot(snap: RegisterOk): void\n /** Add or replace a CP cron (cron/upsert REQ). Throws on a bad schedule. */\n upsertCron(cron: CronUpsert): void\n /** Remove a CP cron (cron/remove REQ). */\n removeCron(cronId: string): void\n /** Apply a per-session routing override (route/assign REQ). */\n applyRouteAssign(a: RouteAssign): void\n /** Apply the global routing-rule set (route/update EVT). */\n applyRouteUpdate(u: RouteUpdate): void\n}\n\nconst LOG_LEVELS = new Set(['trace', 'debug', 'info', 'warn', 'error'])\n\n/**\n * Merge a `config/push` payload into the running config — whitelist only, no\n * secrets. Unknown or wrongly-typed keys are ignored (reported, not thrown).\n * Returns the keys actually applied vs. ignored.\n */\nexport function mergeConfigPush(cfg: Config, keys: Record<string, unknown>): { applied: string[]; ignored: string[] } {\n const applied: string[] = []\n const ignored: string[] = []\n for (const [key, value] of Object.entries(keys)) {\n let ok = false\n switch (key) {\n case 'logging.level':\n if (typeof value === 'string' && LOG_LEVELS.has(value)) {\n cfg.logging.level = value as Config['logging']['level']\n ok = true\n }\n break\n case 'limits.maxAgents':\n if (typeof value === 'number' && Number.isInteger(value)) {\n cfg.limits.maxAgents = value\n ok = true\n }\n break\n case 'limits.maxConcurrentSessions':\n if (typeof value === 'number' && Number.isInteger(value)) {\n cfg.limits.maxConcurrentSessions = value\n ok = true\n }\n break\n case 'limits.agentIdleTimeoutMs':\n if (typeof value === 'number' && Number.isInteger(value)) {\n cfg.limits.agentIdleTimeoutMs = value\n ok = true\n }\n break\n default:\n ok = false\n }\n ;(ok ? applied : ignored).push(key)\n }\n return { applied, ignored }\n}\n","/**\n * `Clock` — the daemon's time seam for the CP client (mirrors the CP's\n * `domain/clock.ts`). The correlator's retransmit and the client's heartbeat /\n * reconnect timers all go through this, so a `FakeClock` drives them\n * deterministically in tests.\n */\nexport type TimerHandle = number | object\n\nexport interface Clock {\n now(): number\n setTimeout(fn: () => void, ms: number): TimerHandle\n clearTimeout(h: TimerHandle): void\n}\n\nexport class SystemClock implements Clock {\n now(): number {\n return Date.now()\n }\n setTimeout(fn: () => void, ms: number): TimerHandle {\n return globalThis.setTimeout(fn, ms)\n }\n clearTimeout(h: TimerHandle): void {\n globalThis.clearTimeout(h as ReturnType<typeof globalThis.setTimeout>)\n }\n}\n\nexport const systemClock: Clock = new SystemClock()\n","import { createInterface } from 'node:readline'\nimport type { ContentBlock, SessionUpdate } from '@agentclientprotocol/sdk'\nimport { loadConfig } from '../config/load-config.js'\nimport { resolveRuntimes } from '../runtimes/registry.js'\nimport { selectAgent } from '../agents/load-agents.js'\nimport { agentChildEnv } from '../agents/agent-env.js'\nimport { prepareWorkspace } from '../workspace/workspace-manager.js'\nimport { AcpHost } from '../acp/acp-host.js'\nimport { resolveRoot } from '../paths.js'\n\nexport function renderUpdate(out: NodeJS.WritableStream) {\n return (_sessionId: string, update: SessionUpdate): void => {\n if (update.sessionUpdate === 'agent_message_chunk' && update.content.type === 'text') {\n out.write(update.content.text)\n } else if (update.sessionUpdate === 'tool_call') {\n const title = ('title' in update && update.title) || update.toolCallId || 'tool'\n out.write(`\\n[tool] ${title}\\n`)\n }\n }\n}\n\nexport interface RunChatOpts {\n agentsDir?: string\n agentName?: string\n message?: string\n configPath?: string\n root?: string\n out?: NodeJS.WritableStream\n input?: NodeJS.ReadableStream\n}\n\nexport async function runChat(opts: RunChatOpts): Promise<void> {\n const out = opts.out ?? process.stdout\n const root = resolveRoot(opts.root)\n const cfg = loadConfig({\n root: opts.root,\n configPath: opts.configPath,\n optional: true,\n overrides: { agentsDir: opts.agentsDir }\n })\n const agent = selectAgent(cfg.agentsDir!, opts.agentName)\n\n const runtimes = await resolveRuntimes(cfg, root, { neededRuntimes: [agent.runtime], mode: 'cache-first' })\n const runtime = runtimes[agent.runtime]\n if (!runtime) {\n const available = Object.keys(runtimes).sort().join(', ') || '(none)'\n throw new Error(`runtime \"${agent.runtime}\" not found. Available: ${available}`)\n }\n\n const host = new AcpHost(runtime, { onUpdate: renderUpdate(out), env: agentChildEnv(agent) })\n await host.start()\n try {\n const cwd = await prepareWorkspace(agent)\n const sessionId = await host.newSession(cwd)\n\n const send = async (text: string) => {\n const blocks: ContentBlock[] = [{ type: 'text', text }]\n await host.prompt(sessionId, blocks)\n out.write('\\n')\n }\n\n if (typeof opts.message === 'string' && opts.message.length > 0) {\n await send(opts.message)\n return\n }\n\n const rl = createInterface({ input: opts.input ?? process.stdin })\n out.write(`Chatting with ${agent.name} (${agent.id}). Type .exit to quit.\\n> `)\n try {\n for await (const line of rl) {\n const text = line.trim()\n if (text === '.exit' || text === '.quit') break\n if (text.length > 0) await send(text)\n out.write('> ')\n }\n } finally {\n rl.close()\n }\n } finally {\n await host.stop()\n }\n}\n"],"mappings":";;;AACA,SAAS,eAAe;;;ACDxB,SAAS,cAAAA,mBAAkB;AAC3B,SAAS,UAAU,SAAS,SAAS,gBAAgB;AACrD,OAAO,cAAkC;;;ACFzC,SAAS,cAAc,YAAY,eAAe,iBAAiB;AACnE,SAAS,eAAe;;;ACDxB,SAAS,SAAS;AAEX,IAAM,mBAAmB,EAAE,OAAO;AAAA,EACvC,SAAS,EAAE,OAAO;AAAA,EAClB,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACpC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAC5E,CAAC;AAGM,IAAM,eAAe,EAAE,OAAO;AAAA,EACnC,SAAS,EAAE,QAAQ,CAAC;AAAA,EACpB,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,cAAc,EACX,OAAO;AAAA,IACN,SAAS,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,IACjC,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,IACzB,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,IAC3B,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,IAAK;AAAA,EAC7C,CAAC,EACA,QAAQ,EAAE,SAAS,OAAO,aAAa,KAAM,CAAC;AAAA,EACjD,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAC/B,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,gBAAgB,EAAE,SAAS;AAAA,EAC1D,SAAS,EACN,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,SAAS,SAAS,QAAQ,QAAQ,OAAO,CAAC,EAAE,QAAQ,MAAM,EAAE,CAAC,EACrF,QAAQ,EAAE,OAAO,OAAO,CAAC;AAAA,EAC5B,QAAQ,EACL,OAAO;AAAA,IACN,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC;AAAA,IACrC,uBAAuB,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE;AAAA,IAClD,oBAAoB,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,GAAO;AAAA,EACtD,CAAC,EACA,QAAQ,EAAE,WAAW,GAAG,uBAAuB,IAAI,oBAAoB,IAAQ,CAAC;AACrF,CAAC;;;AChCD,SAAS,eAAe;AACxB,SAAS,MAAM,eAAe;AAEvB,SAAS,YAAY,MAAuB;AACjD,QAAM,IAAI,QAAQ,QAAQ,IAAI,qBAAqB,KAAK,QAAQ,GAAG,eAAe;AAClF,SAAO,QAAQ,EAAE,QAAQ,cAAc,QAAQ,CAAC,CAAC;AACnD;AAEO,SAAS,WAAW,MAAsB;AAC/C,SAAO,KAAK,MAAM,aAAa;AACjC;AAEO,SAAS,UAAU,MAAsB;AAC9C,SAAO,KAAK,MAAM,SAAS,cAAc;AAC3C;AAEO,SAAS,iBAAiB,MAAsB;AACrD,SAAO,KAAK,MAAM,QAAQ;AAC5B;AAEO,SAAS,aAAa,MAAsB;AACjD,SAAO,KAAK,MAAM,mBAAmB;AACvC;AAEO,SAAS,kBAAkB,MAAsB;AACtD,SAAO,KAAK,MAAM,yBAAyB;AAC7C;;;AFXO,SAAS,WACd,OAAoH,CAAC,GAC7G;AACR,QAAM,OAAO,YAAY,KAAK,IAAI;AAClC,QAAM,OAAO,KAAK,cAAc,WAAW,IAAI;AAM/C,MAAI;AACJ,MAAI,WAAW,IAAI,GAAG;AACpB,UAAM,KAAK,MAAM,aAAa,MAAM,MAAM,CAAC;AAAA,EAC7C,WAAW,KAAK,YAAY;AAC1B,UAAM,EAAE,SAAS,EAAE;AACnB,cAAU,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5C,kBAAc,MAAM,KAAK,UAAU,KAAK,MAAM,CAAC,IAAI,IAAI;AAAA,EACzD,WAAW,KAAK,UAAU;AACxB,UAAM,EAAE,SAAS,EAAE;AAAA,EACrB,OAAO;AACL,UAAM,IAAI,MAAM,qBAAqB,IAAI,4DAA4D;AAAA,EACvG;AACA,QAAM,MAAM,aAAa,MAAM,GAAG;AAElC,QAAM,IAAI,KAAK,aAAa,CAAC;AAC7B,MAAI,EAAE,SAAU,KAAI,WAAW,EAAE;AACjC,MAAI,EAAE,SAAU,KAAI,QAAQ,QAAQ,EAAE;AACtC,MAAI,EAAE,cAAc,OAAW,KAAI,OAAO,YAAY,EAAE;AACxD,MAAI,EAAE,MAAO,KAAI,aAAa,MAAM,EAAE;AACtC,MAAI,EAAE,QAAS,KAAI,aAAa,QAAQ,EAAE;AAG1C,MAAI,EAAE,SAAS,EAAE,QAAS,KAAI,aAAa,UAAU;AACrD,MAAI,EAAE,KAAM,KAAI,aAAa,UAAU;AAEvC,MAAI,YAAY,EAAE,aAAa,IAAI,aAAa,iBAAiB,IAAI;AACrE,SAAO;AACT;AAOO,SAAS,gBAAgB,MAA0B,UAAwB;AAChF,MAAI;AACF,UAAM,OAAO,WAAW,YAAY,IAAI,CAAC;AACzC,UAAM,MAAM,WAAW,IAAI,IAAI,KAAK,MAAM,aAAa,MAAM,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE;AACrF,QAAI,WAAW;AACf,cAAU,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5C,kBAAc,MAAM,KAAK,UAAU,KAAK,MAAM,CAAC,IAAI,IAAI;AAAA,EACzD,QAAQ;AAAA,EAER;AACF;;;AGrEA,SAAS,gBAAAC,eAAc,aAAa,cAAAC,mBAAkB;AACtD,SAAS,QAAAC,OAAM,WAAAC,UAAS,YAAY,WAAAC,gBAAe;;;ACDnD,SAAS,KAAAC,UAAS;AAEX,IAAM,kBAAkBA,GAAE,mBAAmB,QAAQ;AAAA,EAC1DA,GAAE,OAAO,EAAE,MAAMA,GAAE,QAAQ,SAAS,EAAE,CAAC;AAAA,EACvCA,GAAE,OAAO,EAAE,MAAMA,GAAE,QAAQ,IAAI,EAAE,CAAC;AAAA,EAClCA,GAAE,OAAO,EAAE,MAAMA,GAAE,QAAQ,SAAS,GAAG,OAAOA,GAAE,OAAO,EAAE,CAAC;AAAA,EAC1DA,GAAE,OAAO,EAAE,MAAMA,GAAE,QAAQ,MAAM,EAAE,CAAC;AACtC,CAAC;AAGM,IAAM,uBAAuBA,GAAE,OAAO;AAAA,EAC3C,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAC7B,QAAQA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,OAAO;AACT,CAAC;AAGM,IAAM,oBAAoBA,GAAE,OAAO;AAAA,EACxC,UAAUA,GAAE,OAAO;AAAA,EACnB,UAAUA,GAAE,OAAO;AAAA,EACnB,eAAeA,GAAE,OAAO,EAAE,SAAS;AAAA,EACnC,WAAWA,GAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAC/B,gBAAgBA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EAC9C,uBAAuBA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC3C,WAAWA,GAAE,MAAM,oBAAoB,EAAE,QAAQ,CAAC,CAAC;AACrD,CAAC;AAGM,IAAM,oBAAoBA,GAAE,OAAO;AAAA,EACxC,IAAIA,GAAE,OAAO;AAAA,EACb,UAAUA,GAAE,QAAQ,OAAO;AAAA,EAC3B,OAAO;AACT,CAAC;AAGM,IAAM,gBAAgBA,GAAE,OAAO;AAAA,EACpC,IAAIA,GAAE,OAAO;AAAA,EACb,UAAUA,GAAE,OAAO;AAAA,EACnB,QAAQA,GAAE,OAAO,EAAE,UAAUA,GAAE,QAAQ,OAAO,GAAG,SAASA,GAAE,OAAO,EAAE,CAAC;AAAA,EACtE,SAASA,GAAE,OAAO;AACpB,CAAC;AAGM,IAAM,cAAcA,GAAE,OAAO;AAAA,EAClC,IAAIA,GAAE,OAAO;AAAA,EACb,MAAMA,GAAE,OAAO;AAAA,EACf,QAAQA,GAAE,KAAK,CAAC,UAAU,YAAY,QAAQ,CAAC,EAAE,QAAQ,QAAQ;AAAA,EACjE,SAASA,GAAE,OAAO;AAAA,EAClB,kBAAkBA,GACf,OAAO;AAAA,IACN,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC3B,KAAKA,GAAE,MAAMA,GAAE,OAAO,EAAE,MAAMA,GAAE,OAAO,GAAG,OAAOA,GAAE,OAAO,EAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EAC5E,CAAC,EACA,SAAS;AAAA,EACZ,WAAWA,GAAE,OAAO;AAAA,IAClB,MAAMA,GAAE,KAAK,CAAC,YAAY,cAAc,CAAC;AAAA,IACzC,MAAMA,GAAE,OAAO;AAAA,IACf,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,IAC7B,WAAWA,GAAE,OAAO,EAAE,QAAQ,MAAM;AAAA,IACpC,kBAAkBA,GAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,IAC1C,QAAQA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACxC,CAAC;AAAA,EACD,cAAcA,GAAE,MAAM,iBAAiB,EAAE,QAAQ,CAAC,CAAC;AAAA;AAAA,EAEnD,QAAQA,GAAE,OAAO,EAAE,MAAMA,GAAE,KAAK,CAAC,OAAO,UAAU,MAAM,CAAC,EAAE,QAAQ,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAAA,EACpG,aAAaA,GACV,OAAO,EAAE,QAAQA,GAAE,KAAK,CAAC,OAAO,MAAM,CAAC,EAAE,QAAQ,KAAK,GAAG,aAAaA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,EACvG,QAAQ,EAAE,QAAQ,OAAO,aAAa,CAAC,EAAE,CAAC;AAAA,EAC7C,OAAOA,GAAE,MAAM,aAAa,EAAE,QAAQ,CAAC,CAAC;AAC1C,CAAC;;;ACrED,SAAS,cAAAC,aAAY,gBAAAC,qBAAoB;AACzC,SAAS,QAAAC,aAAY;AAMd,SAAS,YAAY,MAAsC;AAChE,QAAM,MAA8B,CAAC;AACrC,aAAW,WAAW,KAAK,MAAM,IAAI,GAAG;AACtC,UAAM,OAAO,QAAQ,QAAQ,OAAO,EAAE,EAAE,KAAK;AAC7C,QAAI,CAAC,QAAQ,KAAK,WAAW,GAAG,EAAG;AACnC,UAAM,OAAO,KAAK,WAAW,SAAS,IAAI,KAAK,MAAM,CAAC,EAAE,KAAK,IAAI;AACjE,UAAM,KAAK,KAAK,QAAQ,GAAG;AAC3B,QAAI,OAAO,GAAI;AACf,UAAM,MAAM,KAAK,MAAM,GAAG,EAAE,EAAE,KAAK;AACnC,QAAI,CAAC,IAAK;AACV,QAAI,QAAQ,KAAK,MAAM,KAAK,CAAC,EAAE,KAAK;AACpC,UAAM,IAAI,MAAM,CAAC;AACjB,QAAI,MAAM,UAAU,MAAM,MAAM,OAAO,MAAM,QAAQ,MAAM,GAAG,EAAE,MAAM,GAAG;AACvE,cAAQ,MAAM,MAAM,GAAG,EAAE;AAAA,IAC3B;AACA,QAAI,GAAG,IAAI;AAAA,EACb;AACA,SAAO;AACT;AAGO,SAAS,WAAW,KAAqC;AAC9D,QAAM,OAAOA,MAAK,KAAK,MAAM;AAC7B,MAAI,CAACF,YAAW,IAAI,EAAG,QAAO,CAAC;AAC/B,SAAO,YAAYC,cAAa,MAAM,MAAM,CAAC;AAC/C;AAEA,IAAM,SAAS;AAEf,SAAS,kBACP,OACA,QACA,MACA,KACQ;AACR,SAAO,MAAM,QAAQ,QAAQ,CAAC,IAAI,SAAiB;AACjD,UAAM,WAAW,OAAO,IAAI;AAC5B,QAAI,aAAa,QAAW;AAC1B,YAAM,IAAI,MAAM,UAAU,IAAI,EAAE,oBAAoB,IAAI,QAAQ,IAAI,WAAW,IAAI,OAAO,GAAG;AAAA,IAC/F;AACA,WAAO;AAAA,EACT,CAAC;AACH;AAEA,SAAS,KACP,MACA,QACA,MACA,KACS;AACT,MAAI,OAAO,SAAS,SAAU,QAAO,kBAAkB,MAAM,QAAQ,MAAM,GAAG;AAC9E,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,IAAK,MAAK,CAAC,IAAI,KAAK,KAAK,CAAC,GAAG,QAAQ,GAAG,IAAI,IAAI,CAAC,KAAK,GAAG;AAC1F,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,OAAO,SAAS,UAAU;AACpC,UAAM,MAAM;AACZ,eAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAClC,UAAI,GAAG,IAAI,KAAK,IAAI,GAAG,GAAG,QAAQ,OAAO,GAAG,IAAI,IAAI,GAAG,KAAK,KAAK,GAAG;AAAA,IACtE;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAIO,SAAS,iBACdE,QACA,QACA,KACM;AACN,OAAKA,QAAO,QAAQ,IAAI,GAAG;AAC7B;AAIO,SAAS,cAAcA,QAGH;AACzB,SAAO;AAAA,IACL,GAAGA,OAAM;AAAA,IACT,GAAG,OAAO,aAAaA,OAAM,kBAAkB,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AAAA,EACzF;AACF;;;AFvFA,IAAM,eAAe,oBAAI,IAAI,CAAC,gBAAgB,MAAM,CAAC;AACrD,IAAM,YAAY;AAOlB,SAAS,eAAe,MAA2B;AACjD,QAAM,MAAMC,SAAQ,IAAI;AACxB,QAAM,MAAM,WAAW,GAAG;AAC1B,QAAMC,SAAQ,YAAY,MAAM,KAAK,MAAMC,cAAa,MAAM,MAAM,CAAC,CAAC;AACtE,mBAAiBD,QAAO,EAAE,GAAG,QAAQ,KAAK,GAAG,IAAI,GAAG,EAAE,IAAIA,OAAM,IAAI,SAASE,MAAK,KAAK,MAAM,EAAE,CAAC;AAChG,MAAI,CAAC,WAAWF,OAAM,UAAU,IAAI,GAAG;AACrC,IAAAA,OAAM,UAAU,OAAOG,SAAQ,KAAKH,OAAM,UAAU,IAAI;AAAA,EAC1D;AACA,SAAO,EAAE,GAAGA,QAAO,KAAK,IAAI;AAC9B;AAKA,SAAS,eAAe,KAAa,QAAQ,GAAa;AACxD,MAAI,QAAQ,aAAa,CAACI,YAAW,GAAG,EAAG,QAAO,CAAC;AACnD,MAAI;AACJ,MAAI;AACF,cAAU,YAAY,KAAK,EAAE,eAAe,KAAK,CAAC;AAAA,EACpD,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACA,MAAI,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK,EAAE,SAAS,YAAY,GAAG;AAC9D,WAAO,CAACF,MAAK,KAAK,YAAY,CAAC;AAAA,EACjC;AACA,QAAM,MAAgB,CAAC;AACvB,aAAW,SAAS,SAAS;AAC3B,QAAI,CAAC,MAAM,YAAY,EAAG;AAC1B,QAAI,aAAa,IAAI,MAAM,IAAI,KAAK,MAAM,KAAK,WAAW,GAAG,EAAG;AAChE,QAAI,KAAK,GAAG,eAAeA,MAAK,KAAK,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC;AAAA,EAC9D;AACA,SAAO;AACT;AAIO,SAAS,eAAe,WAA0D;AACvF,SAAO,eAAe,SAAS,EAAE,IAAI,CAAC,SAAS;AAC7C,QAAI;AACF,aAAO,EAAE,OAAO,eAAe,IAAI,GAAG,KAAKH,SAAQ,IAAI,EAAE;AAAA,IAC3D,SAAS,KAAK;AACZ,YAAM,IAAI,MAAM,yBAAyB,IAAI,KAAM,IAAc,OAAO,EAAE;AAAA,IAC5E;AAAA,EACF,CAAC;AACH;AAGO,SAAS,WAAW,WAAkC;AAC3D,SAAO,eAAe,SAAS,EAC5B,IAAI,CAAC,MAAM,EAAE,KAAK,EAClB,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ;AACxC;AAKO,SAAS,YAAY,WAAmB,MAA4B;AACzE,QAAM,SAAS,eAAe,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK;AAC3D,MAAI,MAAM;AACR,UAAM,QAAQ,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,IAAI;AAC9C,QAAI,CAAC,OAAO;AACV,YAAM,YACJ,OACG,IAAI,CAAC,MAAM,EAAE,EAAE,EACf,KAAK,EACL,KAAK,IAAI,KAAK;AACnB,YAAM,IAAI,MAAM,UAAU,IAAI,kBAAkB,SAAS,gBAAgB,SAAS,EAAE;AAAA,IACtF;AACA,WAAO;AAAA,EACT;AACA,MAAI,OAAO,WAAW,EAAG,OAAM,IAAI,MAAM,0BAA0B,SAAS,EAAE;AAC9E,MAAI,OAAO,SAAS,GAAG;AACrB,UAAM,MAAM,OACT,IAAI,CAAC,MAAM,EAAE,EAAE,EACf,KAAK,EACL,KAAK,IAAI;AACZ,UAAM,IAAI,MAAM,4BAA4B,SAAS,KAAK,GAAG,qCAAqC;AAAA,EACpG;AACA,SAAO,OAAO,CAAC;AACjB;;;AG1FO,SAAS,WAAW,SAAkB,WAA6D;AACxG,QAAM,aAAa,IAAI,IAAI,QAAQ,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AACnD,QAAM,UAAU,QAAQ,OAAO,CAAC,MAAM,CAAC,UAAU,SAAS,EAAE,EAAE,CAAC;AAC/D,QAAM,SAAS,UAAU,OAAO,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;AAC3D,SAAO,EAAE,SAAS,OAAO;AAC3B;;;ACPA,OAAO,cAAc;AACrB,SAAS,aAAAM,kBAAiB;AAC1B,SAAS,WAAAC,gBAAe;AAsBjB,SAAS,WAAW,UAAkB,SAAiB,QAAgB,SAAyB;AACrG,SAAO,GAAG,QAAQ,IAAI,OAAO,IAAI,MAAM,IAAI,OAAO;AACpD;AAEO,IAAM,aAAN,MAAiB;AAAA,EACd;AAAA,EAER,YAAY,QAAgB;AAC1B,IAAAD,WAAUC,SAAQ,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AAC9C,SAAK,KAAK,IAAI,SAAS,MAAM;AAC7B,SAAK,GAAG,OAAO,oBAAoB;AACnC,SAAK,GAAG,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAaZ;AAAA,EACH;AAAA,EAEA,WAAW,KAAwC;AACjD,WAAO,KAAK,GAAG,QAAQ,sCAAsC,EAAE,IAAI,GAAG;AAAA,EACxE;AAAA,EAEA,cAAc,KAA0B;AACtC,SAAK,GACF;AAAA,MACC;AAAA;AAAA;AAAA;AAAA;AAAA,IAKF,EACC,IAAI,GAAG;AAAA,EACZ;AAAA,EAEA,iBAAiB,GAA0B;AACzC,SAAK,GACF;AAAA,MACC;AAAA,IACF,EACC,IAAI,CAAC;AAAA,EACV;AAAA,EAEA,gBAAgB,SAAiB,QAAgB,SAA2C;AAC1F,QAAI,YAAY,MAAM;AACpB,aAAO,KAAK,GACT,QAAQ,2EAA2E,EACnF,IAAI,SAAS,MAAM;AAAA,IACxB;AACA,WAAO,KAAK,GACT,QAAQ,sFAAsF,EAC9F,IAAI,SAAS,QAAQ,OAAO;AAAA,EACjC;AAAA,EAEA,kBAAkB,SAAiB,QAA0B;AAC3D,WACE,KAAK,GACF,QAAQ,qFAAqF,EAC7F,IAAI,SAAS,MAAM,EACtB,IAAI,CAAC,MAAM,EAAE,OAAO;AAAA,EACxB;AAAA,EAEA,eAA+F;AAC7F,WAAO,KAAK,GAAG,QAAQ,4EAA4E,EAAE,IAAI;AAAA,EAG3G;AAAA,EAEA,aAAa,cAAsB,aAAqB,aAA2B;AACjF,SAAK,GACF;AAAA,MACC;AAAA;AAAA,IAEF,EACC,IAAI,EAAE,cAAc,aAAa,YAAY,CAAC;AAAA,EACnD;AAAA,EAEA,QAAc;AACZ,SAAK,GAAG,MAAM;AAAA,EAChB;AACF;;;AChHA,SAAS,aAAgC;AACzC,SAAS,UAAU,gBAAgB;AACnC;AAAA,EACE;AAAA,EACA;AAAA,OAOK;AAGP,IAAM,mBAAmB;AAElB,IAAM,UAAN,MAAc;AAAA,EAInB,YACU,SACA,MAIR;AALQ;AACA;AAAA,EAIP;AAAA,EALO;AAAA,EACA;AAAA,EALF;AAAA,EACA;AAAA,EAUR,MAAM,QAAuB;AAC3B,QAAI,KAAK,MAAO,OAAM,IAAI,MAAM,0BAA0B;AAC1D,UAAM,QAAQ,MAAM,KAAK,QAAQ,SAAS,KAAK,QAAQ,MAAM;AAAA,MAC3D,OAAO,CAAC,QAAQ,QAAQ,SAAS;AAAA,MACjC,KAAK;AAAA,QACH,GAAG,QAAQ;AAAA,QACX,GAAG,OAAO,YAAY,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AAAA,QACpE,GAAI,KAAK,KAAK,OAAO,CAAC;AAAA,MACxB;AAAA,IACF,CAAC;AACD,SAAK,QAAQ;AAEb,QAAI,CAAC,MAAM,SAAS,CAAC,MAAM,QAAQ;AACjC,YAAM,IAAI,MAAM,gDAAgD;AAAA,IAClE;AACA,UAAM,UAAU,SAAS,MAAM,MAAM,KAAK;AAC1C,UAAM,YAAY,SAAS,MAAM,MAAM,MAAM;AAC7C,UAAM,SAAS,aAAa,SAAS,SAAS;AAE9C,UAAM,OAAO;AACb,SAAK,OAAO,IAAI,qBAAqB,CAAC,WAA6B;AACjE,aAAO;AAAA,QACL,MAAM,cAAc,QAA4C;AAC9D,eAAK,KAAK,SAAS,OAAO,WAAW,OAAO,MAAM;AAAA,QACpD;AAAA,QACA,MAAM,kBAAkB,QAAQ;AAE9B,gBAAM,QAAQ,OAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,gBAAgB,EAAE,SAAS,cAAc;AAC7F,gBAAM,YAAY,SAAS,OAAO,QAAQ,CAAC,IAAI;AAC/C,iBAAO;AAAA,YACL,SAAS,WAAW,EAAE,SAAS,YAAY,SAAS,IAAI,EAAE,SAAS,YAAY;AAAA,UACjF;AAAA,QACF;AAAA,QACA,MAAM,eAAe;AACnB,gBAAM,IAAI,MAAM,sCAAsC;AAAA,QACxD;AAAA,QACA,MAAM,gBAAgB;AACpB,gBAAM,IAAI,MAAM,uCAAuC;AAAA,QACzD;AAAA,MACF;AAAA,IACF,GAAG,MAAM;AAET,UAAM,KAAK,KAAK,WAAW;AAAA,MACzB,iBAAiB;AAAA,MACjB,oBAAoB,EAAE,IAAI,EAAE,cAAc,OAAO,eAAe,MAAM,EAAE;AAAA,IAC1E,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,WAAW,KAA8B;AAC7C,UAAM,MAAM,MAAM,KAAK,KAAM,WAAW,EAAE,KAAK,YAAY,CAAC,EAAE,CAAC;AAC/D,WAAO,IAAI;AAAA,EACb;AAAA,EAEA,MAAM,OAAO,WAAmB,QAA6C;AAC3E,UAAM,MAAM,MAAM,KAAK,KAAM,OAAO,EAAE,WAAW,QAAQ,OAAO,CAAC;AACjE,WAAO,IAAI;AAAA,EACb;AAAA,EAEA,MAAM,OAAO,WAAkC;AAC7C,UAAM,KAAK,KAAM,OAAO,EAAE,UAAU,CAAC;AAAA,EACvC;AAAA,EAEA,MAAM,OAAsB;AAC1B,QAAI,CAAC,KAAK,MAAO;AACjB,SAAK,MAAM,KAAK,SAAS;AACzB,UAAM,IAAI,QAAc,CAACC,aAAY,KAAK,MAAO,KAAK,QAAQ,MAAMA,SAAQ,CAAC,CAAC;AAAA,EAChF;AACF;;;AC/FA,SAAS,aAAAC,YAAW,cAAAC,aAAY,iBAAAC,sBAAqB;AACrD,SAAS,QAAAC,aAAY;AACrB,SAAS,iBAAiB;AAG1B,IAAM,kBAAkB;AAExB,eAAsB,iBAAiBC,QAA+B;AACpE,QAAM,MAAMA,OAAM,UAAU;AAC5B,EAAAJ,WAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAElC,MAAII,OAAM,UAAU,SAAS,gBAAgB;AAC3C,UAAM,MAAMD,MAAK,KAAK,WAAW;AACjC,QAAI,CAACF,YAAW,GAAG,EAAG,CAAAC,eAAc,KAAK,KAAKE,OAAM,IAAI;AAAA,CAAW;AACnE,WAAO;AAAA,EACT;AAGA,MAAIA,OAAM,UAAU,oBAAoBH,YAAWE,MAAK,KAAK,MAAM,CAAC,GAAG;AACrE,QAAI;AACF,YAAM,QAAQ,KAAK;AAAA,QACjB,UAAU,GAAG,EAAE,KAAK,CAAC,WAAW,CAAC;AAAA,QACjC,IAAI,QAAQ,CAAC,GAAG,QAAQ,WAAW,MAAM,IAAI,IAAI,MAAM,cAAc,CAAC,GAAG,eAAe,CAAC;AAAA,MAC3F,CAAC;AAAA,IACH,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;;;ACtBO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YACU,MAKR;AALQ;AAAA,EAKP;AAAA,EALO;AAAA,EAOV,YAAY,SAAiB,QAA+B;AAC1D,UAAM,SAAS,KAAK,KAAK,MAAM,kBAAkB,SAAS,MAAM;AAChE,WAAO,OAAO,WAAW,IAAI,OAAO,CAAC,IAAK;AAAA,EAC5C;AAAA,EAEA,MAAM,OAAO,SAAiB,KAAgF;AAC5G,UAAME,SAAQ,KAAK,KAAK,UAAU,OAAO;AACzC,QAAI,CAACA,OAAO,OAAM,IAAI,MAAM,iBAAiB,OAAO,EAAE;AACtD,UAAM,SAAS,IAAI,UAAU,IAAI;AACjC,UAAM,MAAM,WAAW,IAAI,UAAU,IAAI,SAAS,QAAQ,OAAO;AAGjE,SAAK,KAAK,MAAM,iBAAiB;AAAA,MAC/B,SAAS,IAAI;AAAA,MACb;AAAA,MACA,IAAI,KAAK,GAAG;AAAA,MACZ,QAAQ,IAAI,OAAO;AAAA,MACnB,MAAM,IAAI;AAAA,IACZ,CAAC;AAED,QAAI,MAAM,KAAK,KAAK,MAAM,WAAW,GAAG;AACxC,UAAM,OAAO,MAAM,KAAK,KAAK,QAAQ,OAAO;AAE5C,QAAI,CAAC,OAAO,CAAC,IAAI,cAAc;AAC7B,YAAM,MAAM,MAAM,iBAAiBA,MAAK;AACxC,YAAM,eAAe,MAAM,KAAK,WAAW,GAAG;AAC9C,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA,UAAU,IAAI;AAAA,QACd,SAAS,IAAI;AAAA,QACb;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,iBAAiB;AAAA,QACjB,WAAW,KAAK,IAAI;AAAA,MACtB;AACA,WAAK,KAAK,MAAM,cAAc,GAAG;AAAA,IACnC;AAGA,UAAM,MAAM,KAAK,KAAK,MAAM,gBAAgB,IAAI,SAAS,QAAQ,IAAI,eAAe;AACpF,UAAM,SAAyB,CAAC;AAChC,UAAM,UAAU,IAAI,MAAM,GAAG,EAAE;AAC/B,QAAI,QAAQ,SAAS,GAAG;AACtB,YAAM,UAAU,QAAQ,IAAI,CAAC,MAAM,IAAI,EAAE,MAAM,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK,IAAI;AACvE,aAAO,KAAK,EAAE,MAAM,QAAQ,MAAM;AAAA,EAAyC,OAAO,GAAG,CAAC;AAAA,IACxF;AACA,WAAO,KAAK,EAAE,MAAM,QAAQ,MAAM,IAAI,KAAK,CAAC;AAE5C,QAAI,kBAAkB,KAAK,GAAG;AAC9B,QAAI,QAAQ;AACZ,QAAI,YAAY,KAAK,IAAI;AACzB,SAAK,KAAK,MAAM,cAAc,GAAG;AAEjC,WAAO,EAAE,WAAW,IAAI,cAAe,OAAO;AAAA,EAChD;AACF;AAEA,SAAS,KAAK,KAAgC;AAE5C,QAAM,QAAQ,IAAI,MAAM,MAAM,GAAG;AACjC,SAAO,MAAM,MAAM,SAAS,CAAC,KAAK;AACpC;;;AC1EA,IAAM,aAAa,CAAC,WAAW,MAAM,WAAW,MAAM;AAEtD,SAAS,aAAa,GAAgB,KAAiC;AACrE,MAAI,EAAE,MAAM,YAAY,UAAa,EAAE,MAAM,YAAY,IAAI,QAAS,QAAO;AAC7E,MAAI,EAAE,MAAM,WAAW,UAAa,EAAE,MAAM,WAAW,IAAI,OAAQ,QAAO;AAC1E,SAAO;AACT;AAEA,SAAS,YAAY,GAAgB,KAAiC;AACpE,UAAQ,EAAE,MAAM,MAAM;AAAA,IACpB,KAAK;AACH,aAAO,EAAE,cAAc,MAAM,IAAI,cAAc,SAAS,EAAE,SAAS;AAAA,IACrE,KAAK;AACH,aAAO,IAAI;AAAA,IACb,KAAK;AACH,aAAO,IAAI,KAAK,YAAY,EAAE,SAAS,EAAE,MAAM,MAAM,YAAY,CAAC;AAAA,IACpE,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAEA,IAAM,WAAW,CAAC,OAAoB,EAAE,SAAS,EAAE,SAAS,eAAe,EAAE,cAAc;AASpF,SAAS,WACd,KACA,OACA,aACmD;AACnD,MAAI,IAAI,OAAO,MAAO,QAAO;AAE7B,QAAM,QAAQ,CAAC,MACb,CAAC,EAAE,kBAAkB,EAAE,eAAe,WAAW,KAAK,EAAE,eAAe,SAAS,IAAI,OAAO,EAAE;AAG/F,QAAM,kBAAkB,MAAM,OAAO,CAAC,MAAM,aAAa,GAAG,GAAG,KAAK,MAAM,CAAC,CAAC;AAE5E,QAAM,iBAAiB,gBAAgB,OAAO,CAAC,MAAM,YAAY,GAAG,GAAG,CAAC;AAGxE,QAAM,UAAU,eAAe,KAAK,CAAC,MAAM,EAAE,MAAM,SAAS,SAAS;AACrE,MAAI,QAAS,QAAO,SAAS,OAAO;AAGpC,MAAI,IAAI,QAAQ;AACd,UAAM,QAAQ,YAAY,IAAI,SAAS,IAAI,MAAM;AACjD,QAAI,OAAO;AACT,YAAM,YAAY,IAAI,IAAI,gBAAgB,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC;AAC/D,UAAI,UAAU,IAAI,KAAK,GAAG;AACxB,YAAI,UAAU,SAAS,GAAG;AACxB,gBAAM,IAAI,gBAAgB,KAAK,CAAC,MAAM,EAAE,YAAY,KAAK;AACzD,iBAAO,SAAS,CAAC;AAAA,QACnB;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAGA,QAAM,cAAc,eAAe;AAAA,IACjC,CAAC,MACC,EAAE,WAAW,QACb,EAAE,MAAM,YAAY,IAAI,YACvB,EAAE,MAAM,WAAW,UAAa,EAAE,MAAM,WAAW,IAAI;AAAA,EAC5D;AACA,QAAM,QAAQ,cAAc,eAAe,OAAO,CAAC,MAAM,EAAE,WAAW,IAAI,IAAI;AAG9E,aAAW,QAAQ,YAAY;AAC7B,QAAI,SAAS,UAAW;AACxB,UAAM,IAAI,MAAM,KAAK,CAAC,MAAM,EAAE,MAAM,SAAS,IAAI;AACjD,QAAI,EAAG,QAAO,SAAS,CAAC;AAAA,EAC1B;AACA,SAAO;AACT;;;AC9CO,SAAS,wBACdC,QACA,YACqD;AACrD,QAAM,MAAMA,QAAO,aAAa,KAAK,CAAC,MAAM,EAAE,aAAa,OAAO;AAClE,MAAI,CAAC,IAAK,QAAO;AACjB,SAAO,EAAE,eAAe,IAAI,IAAI,WAAW,WAAW,IAAI,EAAE,KAAK,IAAI,MAAM,aAAa,GAAG;AAC7F;AAGO,SAAS,eAAeA,QAAc,YAAmD;AAC9F,QAAM,MAAqB,CAAC;AAC5B,aAAW,OAAOA,OAAM,cAAc;AACpC,QAAI,IAAI,aAAa,QAAS;AAC9B,UAAM,YAAY,WAAW,IAAI,EAAE,KAAK,IAAI,MAAM,aAAa;AAC/D,eAAW,MAAM,IAAI,MAAM,WAAW;AACpC,UAAI,KAAK;AAAA,QACP,SAASA,OAAM;AAAA,QACf,eAAe,IAAI;AAAA,QACnB;AAAA,QACA,OAAO,EAAE,GAAI,GAAG,UAAU,EAAE,SAAS,GAAG,QAAQ,IAAI,CAAC,GAAI,GAAI,GAAG,SAAS,EAAE,QAAQ,GAAG,OAAO,IAAI,CAAC,EAAG;AAAA,QACrG,OAAO,GAAG;AAAA,QACV,gBAAgB,IAAI,MAAM;AAAA,QAC1B,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO;AACT;AAGO,SAAS,cACd,IACAC,UACoB;AACpB,QAAM,IAAIA,SAAQ,GAAG,OAAO;AAC5B,MAAI,CAAC,EAAG,QAAO;AACf,SAAO;AAAA,IACL,SAAS,GAAG;AAAA,IACZ,eAAe,EAAE;AAAA,IACjB,WAAW,EAAE;AAAA,IACb,OAAO,GAAG;AAAA,IACV,OAAO,GAAG;AAAA,IACV,QAAQ;AAAA,IACR,GAAI,GAAG,UAAU,SAAY,EAAE,OAAO,GAAG,MAAM,IAAI,CAAC;AAAA,EACtD;AACF;AAGO,SAAS,cAAc,IAAoE;AAChG,SAAO,GAAG,GAAG,QAAQ,IAAI,GAAG,OAAO,IAAI,GAAG,UAAU,GAAG;AACzD;AAGO,SAAS,kBAAkB,GAAgB,OAA0B;AAC1E,SAAO,EAAE,UAAU,IAAI,CAAC,QAAQ;AAAA,IAC9B,SAAS,EAAE;AAAA,IACX,OAAO,EAAE,SAAS,EAAE,WAAW,SAAS,GAAI,EAAE,WAAW,SAAS,EAAE,QAAQ,EAAE,WAAW,OAAO,IAAI,CAAC,EAAG;AAAA,IACxG,OAAO,GAAG;AAAA,IACV,GAAI,UAAU,SAAY,EAAE,MAAM,IAAI,CAAC;AAAA,EACzC,EAAE;AACJ;AAGO,SAAS,kBAAkB,GAA0B;AAC1D,QAAM,MAAgB,CAAC;AACvB,aAAW,KAAK,EAAE,OAAO;AACvB,UAAM,IAAI,EAAE;AACZ,QAAI,GAAG,SAAS,aAAa,GAAG,SAAS,QAAQ,GAAG,SAAS,QAAQ;AACnE,UAAI,KAAK,EAAE,SAAS,EAAE,SAAS,OAAO,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,KAAK,GAAmB,OAAO,EAAE,aAAa,CAAC;AAAA,IAC5G,WAAW,GAAG,SAAS,aAAa,OAAO,EAAE,UAAU,UAAU;AAC/D,UAAI,KAAK,EAAE,SAAS,EAAE,SAAS,OAAO,CAAC,GAAG,OAAO,EAAE,MAAM,WAAW,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,aAAa,CAAC;AAAA,IAC/G;AAAA,EACF;AACA,SAAO;AACT;;;AC9FO,IAAM,iBAAN,MAAqB;AAAA,EAK1B,YAA6B,IAAiB;AAAjB;AAC3B,UAAM,IAAI,GAAG,KAAK;AAClB,QAAI,GAAG;AACL,WAAK,eAAe,EAAE;AACtB,WAAK,cAAc,IAAI,IAAI,OAAO,QAAQ,EAAE,WAAW,CAAC;AACxD,WAAK,cAAc,EAAE;AAAA,IACvB;AAAA,EACF;AAAA,EAP6B;AAAA,EAJ7B,eAAe;AAAA,EACP,cAAc,oBAAI,IAAsB;AAAA,EACxC,cAAwB,CAAC;AAAA,EAWjC,aAAa,GAAsB;AACjC,SAAK,YAAY,IAAI,cAAc,EAAE,UAAU,GAAG,kBAAkB,GAAG,KAAK,YAAY,CAAC;AACzF,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,YAAY,GAAsB;AAChC,QAAI,EAAE,eAAe,KAAK,aAAc;AACxC,SAAK,eAAe,EAAE;AACtB,SAAK,cAAc,kBAAkB,CAAC;AACtC,SAAK,QAAQ;AAAA,EACf;AAAA;AAAA;AAAA,EAIA,SAAS,MAAmG;AAC1G,SAAK,eAAe,KAAK;AACzB,SAAK,cAAc,IAAI;AAAA,MACrB,KAAK,YAAY,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,UAAU,GAAG,kBAAkB,GAAG,KAAK,YAAY,CAAC,CAAC;AAAA,IACpG;AACA,eAAW,KAAK,KAAK,KAAK,YAAa,MAAK,YAAY,OAAO,CAAC;AAChE,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,iBAA2B;AACzB,WAAO,CAAC,GAAG,CAAC,GAAG,KAAK,YAAY,OAAO,CAAC,EAAE,KAAK,GAAG,GAAG,KAAK,WAAW;AAAA,EACvE;AAAA,EAEQ,UAAgB;AACtB,SAAK,GAAG,KAAK;AAAA,MACX,cAAc,KAAK;AAAA,MACnB,aAAa,OAAO,YAAY,KAAK,WAAW;AAAA,MAChD,aAAa,KAAK;AAAA,IACpB,CAAC;AAAA,EACH;AACF;;;ACpEA,OAAO,SAAS;;;ACahB,IAAM,aAAa;AAEZ,SAAS,oBAAoB,OAA0B,KAA6C;AACzG,QAAM,OAAO,MAAM,QAAQ;AAC3B,QAAM,gBAAgB,CAAC,GAAG,KAAK,SAAS,UAAU,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAE;AACrE,SAAO;AAAA,IACL,OAAO,SAAS,MAAM,OAAO,IAAI,MAAM,EAAE;AAAA,IACzC,SAAS,IAAI;AAAA,IACb,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS,MAAM;AAAA,IACf,QAAQ,MAAM,aAAa,MAAM;AAAA,IACjC,QAAQ,EAAE,IAAI,MAAM,QAAQ,MAAM,UAAU,WAAW,OAAO,QAAQ,MAAM,MAAM,EAAE;AAAA,IACpF;AAAA,IACA;AAAA,IACA,MAAM,MAAM,iBAAiB;AAAA,EAC/B;AACF;;;AD7BA,IAAM,EAAE,KAAK,SAAS,IAAI;AAanB,SAAS,YAAY,QAAiD;AAC3E,QAAM,SAAS,oBAAI,IAA+B;AAClD,aAAW,KAAK,QAAQ;AACtB,eAAW,OAAO,EAAE,cAAc;AAChC,UAAI,IAAI,aAAa,QAAS;AAC9B,YAAM,IAAI,IAAI,MAAM;AACpB,YAAM,IAAI,OAAO,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,IAAI,MAAM,UAAU,cAAc,CAAC,EAAE;AACzF,QAAE,aAAa,KAAK,EAAE,SAAS,EAAE,IAAI,eAAe,IAAI,GAAG,CAAC;AAC5D,aAAO,IAAI,GAAG,CAAC;AAAA,IACjB;AAAA,EACF;AACA,SAAO;AACT;AA2BO,IAAM,kBAAN,MAAsB;AAAA,EAI3B,YACU,MACR,UAAkE,CAAC,MACjE,IAAI,IAAI;AAAA,IACN,OAAO,EAAE;AAAA,IACT,UAAU,EAAE;AAAA,IACZ,YAAY;AAAA,IACZ,GAAI,KAAK,YAAY,EAAE,UAAU,SAAS,MAAM,IAAI,CAAC;AAAA,EACvD,CAAC,GACH;AARQ;AASR,SAAK,MAAM,QAAQ,EAAE,OAAO,KAAK,MAAM,UAAU,UAAU,KAAK,MAAM,SAAS,CAAC;AAAA,EAClF;AAAA,EAVU;AAAA,EAJF;AAAA,EACR,YAAY;AAAA,EAeZ,MAAM,QAAuB;AAC3B,UAAM,MAAM,KAAK,KAAK;AACtB,SAAK,MAAM,8DAAoD;AAC/D,UAAM,OAAO,MAAM,KAAK,IAAI,OAAO,KAAK,KAAK;AAC7C,SAAK,YAAY,KAAK,WAAW;AACjC,SAAK,MAAM,uCAAkC,KAAK,SAAS,EAAE;AAC7D,UAAM,UAAU,CAAC,IAAuB,SAAiB;AACvD,YAAM,MAAM,oBAAoB,IAAI,EAAE,SAAS,KAAK,KAAK,WAAW,EAAE,CAAC;AACvE,WAAK;AAAA,QACH,kBAAkB,IAAI,OAAO,IAAI,OAAO,SAAS,IAAI,OAAO,EAAE,UAAU,IAAI,OAAO,KAAK,SAAS,IAAI,IAAI,cAAc,IAAI,cAAc,KAAK,GAAG,CAAC,UAAU,KAAK,UAAU,IAAI,KAAK,MAAM,GAAG,EAAE,CAAC,CAAC;AAAA,MACnM;AACA,WAAK,KAAK,UAAU,GAAG;AAAA,IACzB;AAGA,SAAK,IAAI,QAAQ,OAAO,EAAE,QAAQ,MAAM;AACtC,YAAM,KAAK;AACX,UAAI,GAAG,SAAS,aAAa,CAAC,GAAG,SAAS;AACxC,aAAK,MAAM,sCAAsC,GAAG,IAAI,aAAa,GAAG,WAAW,MAAM,GAAG;AAC5F;AAAA,MACF;AACA,cAAQ,IAAI,SAAS;AAAA,IACvB,CAAC;AAID,SAAK,IAAI,MAAM,eAAe,OAAO,EAAE,MAAM,MAAM;AACjD,YAAM,KAAK;AACX,UAAI,CAAC,GAAG,QAAS;AACjB,cAAQ,IAAI,aAAa;AAAA,IAC3B,CAAC;AACD,SAAK,MAAM,qFAAsE;AACjF,UAAM,KAAK,IAAI,MAAM;AACrB,SAAK,MAAM,qDAAgD;AAAA,EAC7D;AAAA,EAEA,MAAM,YAAY,SAAiB,MAAc,UAAkC;AACjF,UAAM,KAAK,IAAI,OAAO,KAAK,YAAY,EAAE,SAAS,MAAM,WAAW,SAAS,CAAC;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,UAAU,SAAiB,UAAkB,QAAgB,iBAA2C;AAC5G,QAAI;AACF,YAAM,KAAK,IAAI,OAAO,UAAU,QAAQ,UAAU;AAAA,QAChD,YAAY;AAAA,QACZ,WAAW;AAAA,QACX;AAAA,QACA,GAAI,kBAAkB,EAAE,kBAAkB,gBAAgB,IAAI,CAAC;AAAA,MACjE,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,WAAK,KAAK,KAAK,MAAM,+BAA+B,OAAO,WAAW,QAAQ,MAAO,IAAc,OAAO,EAAE;AAAA,IAC9G;AAAA,EACF;AAAA,EAEA,MAAM,OAAsB;AAC1B,UAAM,KAAK,IAAI,KAAK;AAAA,EACtB;AACF;;;AE5HO,IAAM,kBAAN,MAAsB;AAAA,EAE3B,YAAoB,MAAiC;AAAjC;AAAA,EAAkC;AAAA,EAAlC;AAAA,EADZ,MAAM;AAAA,EAGN,QAAuB;AAC7B,QAAI,CAAC,KAAK,IAAI,KAAK,GAAG;AACpB,WAAK,MAAM;AACX,aAAO,CAAC;AAAA,IACV;AACA,UAAM,OAAO,KAAK;AAClB,SAAK,MAAM;AACX,WAAO,CAAC,EAAE,MAAM,QAAQ,KAAK,CAAC;AAAA,EAChC;AAAA,EAEA,SAAS,QAAsC;AAC7C,YAAQ,OAAO,eAAe;AAAA,MAC5B,KAAK,uBAAuB;AAC1B,cAAM,UAAW,OAA0D;AAC3E,YAAI,SAAS,SAAS,OAAQ,MAAK,OAAO,QAAQ,QAAQ;AAC1D,eAAO,CAAC;AAAA,MACV;AAAA,MACA,KAAK,uBAAuB;AAC1B,YAAI,KAAK,SAAS,MAAO,QAAO,CAAC,GAAG,KAAK,MAAM,GAAG,EAAE,MAAM,cAAc,MAAM,oBAAe,CAAC;AAC9F,YAAI,KAAK,SAAS,OAAQ,QAAO,CAAC;AAClC,cAAM,UAAW,OAA2C;AAC5D,eAAO,CAAC,GAAG,KAAK,MAAM,GAAG,EAAE,MAAM,eAAe,MAAM,cAAc,SAAS,QAAQ,EAAE,IAAI,CAAC;AAAA,MAC9F;AAAA,MACA,KAAK;AAAA,MACL,KAAK,oBAAoB;AACvB,cAAM,QAAS,OAA8B,SAAU,OAAmC,cAAc;AACxG,YAAI,KAAK,SAAS,MAAO,QAAO,CAAC,GAAG,KAAK,MAAM,GAAG,EAAE,MAAM,cAAc,MAAM,MAAM,CAAC;AACrF,eAAO,CAAC,GAAG,KAAK,MAAM,GAAG,EAAE,MAAM,eAAe,MAAM,uBAAuB,KAAK,GAAG,CAAC;AAAA,MACxF;AAAA,MACA,KAAK;AACH,eAAO,CAAC;AAAA;AAAA,MACV;AACE,eAAO,CAAC;AAAA,IACZ;AAAA,EACF;AAAA,EAEA,QAAQ,MAA6B;AACnC,QAAI,KAAK,SAAS,MAAO,QAAO,CAAC,GAAG,KAAK,MAAM,GAAG,EAAE,MAAM,cAAc,MAAM,GAAG,CAAC;AAClF,WAAO,CAAC,GAAG,KAAK,MAAM,GAAG,EAAE,MAAM,QAAQ,MAAM,mCAA8B,IAAI,YAAY,CAAC;AAAA,EAChG;AACF;;;ACnDA,SAAS,YAAY;AAId,SAAS,sBACd,SACA,MACA,SAC6C;AAC7C,QAAM,MAAyB;AAAA,IAC7B,OAAO,QAAQ,KAAK,EAAE,IAAI,OAAO;AAAA,IACjC;AAAA,IACA,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS,KAAK,OAAO;AAAA,IACrB,QAAQ,QAAQ,KAAK,EAAE,IAAI,OAAO;AAAA;AAAA,IAClC,QAAQ,EAAE,IAAI,QAAQ,KAAK,EAAE,IAAI,OAAO,MAAM;AAAA,IAC9C,MAAM,KAAK;AAAA,IACX,eAAe,CAAC;AAAA,IAChB,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AACA,SAAO,EAAE,SAAS,IAAI;AACxB;AAEO,IAAM,YAAN,MAAgB;AAAA,EAErB,YAAoB,MAA+F;AAA/F;AAAA,EAAgG;AAAA,EAAhG;AAAA,EADZ,OAAe,CAAC;AAAA,EAGxB,SAAS,SAAiB,MAAqB;AAC7C,SAAK,KAAK;AAAA,MACR,IAAI,KAAK,KAAK,UAAU,MAAM;AAC5B,cAAM,EAAE,IAAI,IAAI,sBAAsB,SAAS,MAAM,KAAK,KAAK,WAAW,CAAC;AAC3E,aAAK,KAAK,OAAO,SAAS,GAAG;AAAA,MAC/B,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,OAAa;AACX,eAAW,KAAK,KAAK,KAAM,GAAE,KAAK;AAClC,SAAK,OAAO,CAAC;AAAA,EACf;AACF;;;AC1CA,SAAS,KAAAC,UAAS;AAClB,SAAS,gBAAAC,eAAc,iBAAAC,gBAAe,cAAAC,aAAY,aAAAC,kBAAiB;AACnE,SAAS,WAAAC,gBAAe;AAIxB,IAAM,oBAAoBC,GAAE,OAAO,EAAE,SAASA,GAAE,OAAO,GAAG,MAAMA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC;AACjG,IAAM,uBAAuBA,GAAE,OAAO;AAAA,EACpC,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,KAAKA,GAAE,OAAO;AAAA,EACd,MAAMA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACpC,KAAKA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAClD,CAAC;AACD,IAAM,qBAAqBA,GAAE,OAAO;AAAA,EAClC,KAAK,kBAAkB,SAAS;AAAA,EAChC,KAAK,kBAAkB,SAAS;AAAA,EAChC,QAAQA,GAAE,OAAOA,GAAE,OAAO,GAAG,oBAAoB,EAAE,SAAS;AAC9D,CAAC;AACM,IAAM,sBAAsBA,GAAE,OAAO;AAAA,EAC1C,IAAIA,GAAE,OAAO;AAAA,EACb,MAAMA,GAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,EAC3B,SAASA,GAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,EAC9B,cAAc;AAChB,CAAC;AAIM,IAAM,oBAAoBA,GAC9B,OAAO,EAAE,QAAQA,GAAE,MAAM,CAACA,GAAE,MAAM,mBAAmB,GAAGA,GAAE,OAAOA,GAAE,OAAO,GAAG,mBAAmB,CAAC,CAAC,EAAE,CAAC,EACrG,UAAU,CAAC,OAAO;AAAA,EACjB,QAAQ,MAAM,QAAQ,EAAE,MAAM,IAAI,OAAO,YAAY,EAAE,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE;AAC3F,EAAE;AAGG,SAAS,cAA6B;AAC3C,QAAM,KACJ,QAAQ,aAAa,UACjB,YACA,QAAQ,aAAa,WACnB,WACA,QAAQ,aAAa,UACnB,UACA;AACV,QAAM,OAAO,QAAQ,SAAS,UAAU,YAAY,QAAQ,SAAS,QAAQ,WAAW;AACxF,MAAI,CAAC,MAAM,CAAC,KAAM,QAAO;AACzB,SAAO,GAAG,EAAE,IAAI,IAAI;AACtB;AAEO,SAAS,aAAa,OAAyC;AACpE,QAAM,IAAI,MAAM;AAChB,MAAI,EAAE,IAAK,QAAO,EAAE,SAAS,OAAO,MAAM,CAAC,MAAM,EAAE,IAAI,SAAS,GAAG,EAAE,IAAI,IAAI,GAAG,KAAK,CAAC,EAAE;AACxF,MAAI,EAAE,IAAK,QAAO,EAAE,SAAS,OAAO,MAAM,CAAC,EAAE,IAAI,SAAS,GAAG,EAAE,IAAI,IAAI,GAAG,KAAK,CAAC,EAAE;AAClF,MAAI,EAAE,QAAQ;AACZ,UAAM,MAAM,YAAY;AACxB,UAAM,MAAM,MAAM,EAAE,OAAO,GAAG,IAAI;AAClC,QAAI,CAAC,IAAK,QAAO;AACjB,WAAO,EAAE,SAAS,IAAI,KAAK,MAAM,IAAI,MAAM,KAAK,OAAO,QAAQ,IAAI,GAAG,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,EAAE,MAAM,MAAM,EAAE,EAAE;AAAA,EACpH;AACA,SAAO;AACT;AAEA,IAAM,eAAe;AACrB,IAAM,qBAAqB;AAQ3B,SAAS,cAAc,MAAkC;AACvD,QAAM,OAAO,aAAa,IAAI;AAC9B,MAAI,CAACC,YAAW,IAAI,EAAG,QAAO;AAC9B,MAAI;AACF,WAAO,kBAAkB,MAAM,KAAK,MAAMC,cAAa,MAAM,MAAM,CAAC,CAAC;AAAA,EACvE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,cAAc,MAAyB;AAC9C,QAAM,OAAO,kBAAkB,IAAI;AACnC,MAAI,CAACD,YAAW,IAAI,EAAG,QAAO,CAAC;AAC/B,MAAI;AACF,WAAO,KAAK,MAAMC,cAAa,MAAM,MAAM,CAAC;AAAA,EAC9C,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAsB,cACpB,MACA,OAAyD,CAAC,GACpC;AACtB,QAAM,UAAU,KAAK,aAAa;AAClC,QAAM,OAAO,cAAc,IAAI;AAC/B,QAAM,UAAkC,CAAC;AACzC,MAAI,KAAK,KAAM,SAAQ,eAAe,IAAI,KAAK;AAC/C,MAAI,KAAK,aAAc,SAAQ,mBAAmB,IAAI,KAAK;AAE3D,QAAM,KAAK,IAAI,gBAAgB;AAC/B,QAAM,QAAQ,WAAW,MAAM,GAAG,MAAM,GAAG,KAAK,aAAa,kBAAkB;AAC/E,MAAI;AACF,UAAM,MAAM,MAAM,QAAQ,cAAc,EAAE,SAAS,QAAQ,GAAG,OAAO,CAAC;AACtE,QAAI,IAAI,WAAW,IAAK,QAAO,cAAc,IAAI,KAAK,EAAE,QAAQ,CAAC,EAAE;AACnE,QAAI,CAAC,IAAI,GAAI,QAAO,cAAc,IAAI,KAAK,EAAE,QAAQ,CAAC,EAAE;AACxD,UAAM,WAAW,MAAM,IAAI,KAAK;AAChC,UAAM,MAAM,kBAAkB,MAAM,KAAK,MAAM,QAAQ,CAAC;AACxD,IAAAC,WAAUC,SAAQ,aAAa,IAAI,CAAC,GAAG,EAAE,WAAW,KAAK,CAAC;AAC1D,IAAAC,eAAc,aAAa,IAAI,GAAG,QAAQ;AAC1C,UAAM,UAAqB;AAAA,MACzB,MAAM,IAAI,QAAQ,IAAI,MAAM,KAAK;AAAA,MACjC,cAAc,IAAI,QAAQ,IAAI,eAAe,KAAK;AAAA,MAClD,WAAW,KAAK,IAAI;AAAA,IACtB;AACA,IAAAA,eAAc,kBAAkB,IAAI,GAAG,KAAK,UAAU,OAAO,CAAC;AAC9D,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,cAAc,IAAI,KAAK,EAAE,QAAQ,CAAC,EAAE;AAAA,EAC7C,UAAE;AACA,iBAAa,KAAK;AAAA,EACpB;AACF;AAEA,eAAsB,gBACpB,MACA,OAA4F,CAAC,GACxD;AACrC,QAAM,OAAO,KAAK,QAAQ;AAC1B,QAAM,SAAS,SAAS,gBAAgB,cAAc,IAAI,IAAI;AAC9D,MAAI;AACJ,MAAI,QAAQ;AACV,UAAM;AACN,SAAK,cAAc,MAAM,IAAI,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAC/C,OAAO;AACL,UAAM,MAAM,cAAc,MAAM,IAAI;AAAA,EACtC;AACA,QAAM,MAAkC,CAAC;AACzC,aAAW,CAAC,IAAI,KAAK,KAAK,OAAO,QAAQ,IAAI,MAAM,GAAG;AACpD,UAAM,KAAK,aAAa,KAAK;AAC7B,QAAI,GAAI,KAAI,EAAE,IAAI;AAAA,EACpB;AACA,SAAO;AACT;AAEA,eAAsB,gBACpB,KACA,MACA,OAKI,CAAC,GACgC;AACrC,QAAM,eAAe,IAAI,YAAY,CAAC;AACtC,QAAM,SAAS,KAAK;AACpB,MAAI,UAAU,OAAO,SAAS,KAAK,OAAO,MAAM,CAAC,MAAM,aAAa,CAAC,CAAC,GAAG;AACvE,WAAO,EAAE,GAAG,aAAa;AAAA,EAC3B;AACA,QAAM,WAAW,MAAM,gBAAgB,MAAM,IAAI;AACjD,SAAO,EAAE,GAAG,UAAU,GAAG,aAAa;AACxC;;;AC7JA,IAAM,QAAkC,EAAE,OAAO,IAAI,OAAO,IAAI,MAAM,IAAI,MAAM,IAAI,OAAO,GAAG;AAUvF,SAAS,WAAW,QAAkB,QAAgB;AAC3D,QAAM,YAAY,MAAM,KAAK,KAAK,MAAM;AACxC,QAAM,OAAO,CAAC,KAAe,QAAgB;AAC3C,QAAI,MAAM,GAAG,IAAI,UAAW;AAC5B,UAAM,OAAO,kBAAkB,IAAI,YAAY,EAAE,OAAO,CAAC,CAAC,IAAI,GAAG;AACjE,QAAI,MAAM,GAAG,KAAK,MAAM,KAAM,SAAQ,MAAM,IAAI;AAAA,QAC3C,SAAQ,IAAI,IAAI;AAAA,EACvB;AACA,SAAO;AAAA,IACL,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC;AAAA,IAC7B,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC;AAAA,IAC7B,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC;AAAA,IAC3B,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC;AAAA,IAC3B,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC;AAAA,EAC/B;AACF;;;AC9BA,SAAS,KAAAC,UAAS;AAWX,IAAM,WAAWA,GAAE,OAAO;EAC/B,GAAGA,GAAE,QAAQ,CAAC;;EACd,IAAIA,GAAE,OAAM,EAAG,KAAI;;EACnB,IAAIA,GAAE,OAAM,EAAG,SAAQ;;EACvB,MAAMA,GAAE,OAAM;;EACd,MAAMA,GAAE,OAAM,EAAG,KAAI,EAAG,SAAQ;;EAChC,SAASA,GAAE,QAAO;;CACnB;AAWM,IAAM,aAAaA,GAAE,OAAO;EACjC,OAAOA,GAAE,OAAM,EAAG,IAAG;;EACrB,KAAKA,GAAE,OAAM,EAAG,IAAG,EAAG,SAAQ;;EAC9B,SAASA,GAAE,OAAM,EAAG,KAAI,EAAG,SAAQ;;EACnC,UAAUA,GAAE,OAAM,EAAG,KAAI,EAAG,SAAQ;;CACrC;AAIM,IAAM,WAAW;;;ACtCxB,SAAS,KAAAC,UAAS;AAUX,IAAM,UAAUA,GAAE,OAAO;EAC9B,aAAaA,GAAE,OAAM;;;;EAGrB,UAAUA,GAAE,OAAM,EAAG,KAAI,EAAG,SAAQ;EACpC,WAAWA,GAAE,OAAM,EAAG,KAAI,EAAG,SAAQ;;EACrC,aAAaA,GAAE,OAAM,EAAG,SAAQ;;EAChC,cAAcA,GAAE,OAAM;;EACtB,QAAQA,GACL,OAAO;IACN,WAAWA,GAAE,OAAM,EAAG,IAAG;;IACzB,aAAaA,GAAE,OAAOA,GAAE,OAAM,GAAIA,GAAE,OAAM,CAAE;;GAC7C,EACA,SAAQ;CACZ;AAGM,IAAM,SAASA,GAAE,OAAO;EAC7B,UAAUA,GAAE,OAAM,EAAG,KAAI;EACzB,cAAcA,GAAE,OAAM,EAAG,IAAG;;EAC5B,cAAcA,GAAE,OAAM,EAAG,IAAG;;EAC5B,YAAYA,GAAE,OAAM,EAAG,SAAQ;EAC/B,QAAQA,GACL,OAAO;IACN,UAAUA,GAAE,QAAO;;IACnB,kBAAkBA,GAAE,OAAOA,GAAE,OAAM,GAAIA,GAAE,OAAM,CAAE,EAAE,SAAQ;GAC5D,EACA,SAAQ;CACZ;;;ACtCD,SAAS,KAAAC,UAAS;;;ACAlB,SAAS,KAAAC,UAAS;AAUX,IAAM,WAAWA,GAAE,KAAK,CAAC,SAAS,UAAU,CAAC;AAG7C,IAAM,aAAaA,GAAE,OAAO;EACjC,UAAU;EACV,SAASA,GAAE,OAAM;EACjB,QAAQA,GAAE,OAAM,EAAG,SAAQ;;CAC5B;AAIM,IAAM,WAAWA,GAAE,OAAO;EAC/B,OAAOA,GAAE,mBAAmB,QAAQ;IAClCA,GAAE,OAAO,EAAE,MAAMA,GAAE,QAAQ,SAAS,EAAC,CAAE;IACvCA,GAAE,OAAO,EAAE,MAAMA,GAAE,QAAQ,IAAI,EAAC,CAAE;IAClCA,GAAE,OAAO,EAAE,MAAMA,GAAE,QAAQ,SAAS,GAAG,OAAOA,GAAE,OAAM,EAAE,CAAE;IAC1DA,GAAE,OAAO,EAAE,MAAMA,GAAE,QAAQ,MAAM,EAAC,CAAE;;GACrC;CACF;AAGM,IAAM,cAAcA,GAAE,OAAO;;EAElC,YAAY;EACZ,SAASA,GAAE,OAAM,EAAG,KAAI;EACxB,aAAaA,GAAE,OAAM,EAAG,KAAI;;EAC5B,WAAWA,GAAE,MAAM,QAAQ,EAAE,QAAQ,CAAA,CAAE;CACxC;AAGM,IAAM,iBAAiBA,GAAE,OAAO;EACrC,IAAIA,GAAE,QAAO;EACb,YAAY;EACZ,QAAQA,GAAE,OAAM,EAAG,SAAQ;CAC5B;AAGM,IAAM,cAAcA,GAAE,OAAO;EAClC,cAAcA,GAAE,OAAM,EAAG,IAAG;EAC5B,OAAOA,GAAE,MAAMA,GAAE,OAAO,EAAE,OAAOA,GAAE,QAAO,GAAI,SAASA,GAAE,OAAM,EAAG,KAAI,EAAE,CAAE,CAAC;CAC5E;AAIM,IAAM,QAAQA,GAAE,OAAO;EAC5B,OAAOA,GAAE,MAAM;IACbA,GAAE,OAAO,EAAE,MAAMA,GAAE,QAAQ,OAAO,GAAG,SAASA,GAAE,OAAM,EAAG,KAAI,EAAE,CAAE;IACjEA,GAAE,OAAO,EAAE,MAAMA,GAAE,QAAQ,QAAQ,EAAC,CAAE;;IACtCA,GAAE,OAAO,EAAE,MAAMA,GAAE,QAAQ,SAAS,GAAG,YAAY,WAAU,CAAE;GAChE;EACD,UAAUA,GAAE,OAAM,EAAG,SAAQ;;CAC9B;AAGM,IAAM,gBAAgBA,GAAE,OAAO;EACpC,WAAWA,GAAE,OAAM,EAAG,IAAG;EACzB,SAASA,GAAE,MAAM,UAAU;CAC5B;AAGM,IAAM,YAAYA,GAAE,OAAO;EAChC,UAAUA,GAAE,MAAM,UAAU;;CAC7B;;;ACxED,SAAS,KAAAC,UAAS;AASX,IAAM,aAAaA,GAAE,OAAO;EACjC,QAAQA,GAAE,OAAM,EAAG,KAAI;EACvB,UAAUA,GAAE,OAAM;;EAClB,QAAQA,GAAE,OAAO,EAAE,SAASA,GAAE,OAAM,EAAE,CAAE;EACxC,SAASA,GAAE,OAAM;;EACjB,SAASA,GAAE,QAAO,EAAG,QAAQ,IAAI;CAClC;AAGM,IAAM,aAAaA,GAAE,OAAO;EACjC,QAAQA,GAAE,OAAM,EAAG,KAAI;CACxB;;;ACpBD,SAAS,KAAAC,UAAS;AAUX,IAAM,iBAAiBC,GAAE,OAAO;;EAErC,OAAOA,GAAE,OAAO;IACd,UAAU;IACV,aAAaA,GAAE,OAAM,EAAG,KAAI;GAC7B;CACF;AAGM,IAAM,eAAeA,GAAE,OAAO;;EAEnC,SAASA,GAAE,OAAM,EAAG,KAAI;EACxB,OAAOA,GAAE,OAAO;IACd,UAAUA,GAAE,OAAM;IAClB,aAAaA,GAAE,OAAM,EAAG,KAAI;GAC7B;EACD,KAAKA,GAAE,OAAM;;EACb,KAAKA,GAAE,OAAM,EAAG,IAAG;;EACnB,gBAAgBA,GAAE,OAAM,EAAG,IAAG;;CAC/B;AAGM,IAAM,eAAeA,GAAE,OAAO;EACnC,SAASA,GAAE,OAAM,EAAG,KAAI;;CACzB;AAGM,IAAM,gBAAgBA,GAAE,OAAO;EACpC,SAASA,GAAE,OAAM,EAAG,KAAI;EACxB,QAAQA,GAAE,OAAM;;CACjB;AAIM,IAAM,mBAAmBA,GAAE,OAAO;EACvC,WAAWA,GAAE,OAAM,EAAG,KAAI;EAC1B,OAAOA,GAAE,KAAK,CAAC,kBAAkB,kBAAkB,WAAW,CAAC;EAC/D,aAAaA,GAAE,OAAM;;EACrB,KAAKA,GAAE,OAAM;;EACb,KAAKA,GAAE,OAAM,EAAG,SAAQ;CACzB;;;AHrCM,IAAM,cAAcC,GAAE,OAAO;EAClC,MAAMA,GAAE,OAAM;;EACd,cAAcA,GAAE,OAAO;IACrB,WAAWA,GAAE,MAAM,QAAQ;;IAC3B,UAAUA,GAAE,MAAMA,GAAE,OAAM,CAAE;;IAC5B,KAAKA,GAAE,QAAO;;IACd,UAAUA,GAAE,MAAMA,GAAE,OAAM,CAAE,EAAE,QAAQ,CAAA,CAAE;;GACzC;EACD,WAAWA,GAAE,OAAM,EAAG,IAAG;;EACzB,YAAYA,GAAE,OAAO;;IAEnB,aAAaA,GAAE,MAAMA,GAAE,OAAM,CAAE;;IAC/B,OAAOA,GAAE,MAAMA,GAAE,OAAM,CAAE;;IACzB,QAAQA,GAAE,MAAMA,GAAE,OAAM,CAAE;;GAC3B;CACF;AAGM,IAAM,aAAaA,GAAE,OAAO;EACjC,cAAcA,GAAE,OAAM,EAAG,IAAG;;;EAE5B,aAAaA,GAAE,MAAM,WAAW;;EAChC,OAAOA,GAAE,MAAM,UAAU;;EACzB,QAAQA,GAAE,MAAM,YAAY;;EAC5B,MAAMA,GAAE,OAAO;;IAEb,aAAaA,GAAE,MAAMA,GAAE,OAAM,CAAE;IAC/B,OAAOA,GAAE,MAAMA,GAAE,OAAM,CAAE;GAC1B;CACF;;;AI1CD,SAAS,KAAAC,WAAS;AAeX,IAAM,uBAAuBC,IAAE,OAAO;EAC3C,YAAY;EACZ,eAAeA,IAAE,OAAM;EACvB,aAAaA,IAAE,OAAM,EAAG,IAAG;CAC5B;AAGM,IAAM,cAAcA,IAAE,OAAO;;EAElC,SAASA,IAAE,OAAM,EAAG,KAAI;EACxB,SAASA,IAAE,OAAM;;EACjB,aAAaA,IAAE,OAAM,EAAG,KAAI;EAC5B,cAAcA,IAAE,MAAMA,IAAE,OAAM,CAAE;;EAChC,MAAMA,IAAE,KAAK,CAAC,cAAc,UAAU,CAAC,EAAE,QAAQ,YAAY;;CAC9D;AAGM,IAAM,gBAAgBA,IAAE,OAAO;;EAEpC,SAASA,IAAE,OAAM,EAAG,KAAI;EACxB,UAAUA,IAAE,OAAM,EAAG,KAAI;;EACzB,cAAcA,IAAE,OAAM,EAAG,SAAQ;;EACjC,WAAWA,IAAE,OAAM,EAAG,SAAQ;EAC9B,SAASA,IAAE,OAAM;;CAClB;AAGM,IAAM,YAAYA,IAAE,OAAO;EAChC,SAASA,IAAE,OAAM,EAAG,KAAI;EACxB,UAAUA,IAAE,OAAM,EAAG,KAAI;EACzB,QAAQA,IAAE,OAAM;CACjB;AAGM,IAAM,cAAcA,IAAE,OAAO;;EAElC,YAAY;EACZ,SAASA,IAAE,OAAM,EAAG,KAAI;EACxB,SAAS;;EACT,aAAaA,IAAE,OAAM,EAAG,IAAG;;CAC5B;AAGM,IAAM,iBAAiBA,IAAE,OAAO;;EAErC,UAAUA,IAAE,QAAO;EACnB,QAAQA,IAAE,KAAK,CAAC,UAAU,QAAQ,gBAAgB,cAAc,OAAO,CAAC,EAAE,SAAQ;EAClF,KAAKA,IAAE,OAAM,EAAG,IAAG;;CACpB;AAGM,IAAM,gBAAgBA,IAAE,OAAO;;EAEpC,SAASA,IAAE,OAAM,EAAG,KAAI;EACxB,UAAUA,IAAE,OAAM,EAAG,KAAI;EACzB,OAAOA,IAAE,KAAK,CAAC,YAAY,aAAa,uBAAuB,MAAM,CAAC;EACtE,IAAIA,IAAE,OAAM,EAAG,SAAQ;CACxB;AAGM,IAAM,mBAAmBA,IAAE,OAAO;;EAEvC,SAASA,IAAE,OAAM,EAAG,KAAI;EACxB,UAAUA,IAAE,OAAM,EAAG,KAAI;EACzB,YAAYA,IAAE,OAAM;CACrB;;;AChFD,SAAS,KAAAC,WAAS;AAUX,IAAM,YAAYA,IAAE,OAAO;EAChC,MAAMA,IAAE,OAAO;IACb,KAAKA,IAAE,OAAM;IACb,KAAKA,IAAE,OAAM;IACb,QAAQA,IAAE,OAAM,EAAG,IAAG;GACvB;EACD,QAAQA,IAAE,KAAK,CAAC,MAAM,UAAU,CAAC;EACjC,gBAAgBA,IAAE,OAAM,EAAG,IAAG;EAC9B,gBAAgBA,IAAE,MAAMA,IAAE,OAAM,CAAE,EAAE,QAAQ,CAAA,CAAE;;CAC/C;AAIM,IAAM,eAAeA,IAAE,OAAO;EACnC,WAAWA,IAAE,OAAM,EAAG,KAAI;EAC1B,SAASA,IAAE,OAAM,EAAG,KAAI;EACxB,UAAUA,IAAE,OAAM,EAAG,KAAI;;EACzB,OAAOA,IAAE,KAAK,CAAC,SAAS,QAAQ,WAAW,KAAK,CAAC;EACjD,MAAMA,IAAE,OAAM,EAAG,SAAQ;;EACzB,SAASA,IAAE,OAAM,EAAG,SAAQ;;EAC5B,IAAIA,IAAE,OAAM,EAAG,SAAQ;CACxB;AAIM,IAAM,sBAAsBA,IAAE,OAAO;EAC1C,SAASA,IAAE,OAAM;;EACjB,SAASA,IAAE,OAAM;EACjB,QAAQA,IAAE,MAAMA,IAAE,OAAM,CAAE;EAC1B,eAAeA,IAAE,OAAM,EAAG,IAAG,EAAG,SAAQ;EACxC,YAAYA,IAAE,KAAK,CAAC,QAAQ,WAAW,MAAM,CAAC;;EAC9C,aAAaA,IAAE,QAAO;CACvB;AAIM,IAAM,aAAaA,IAAE,OAAO;EACjC,MAAMA,IAAE,OAAOA,IAAE,OAAM,GAAIA,IAAE,QAAO,CAAE;CACvC;AAIM,IAAM,gBAAgBA,IAAE,OAAO;EACpC,QAAQA,IAAE,OAAM;EAChB,YAAYA,IAAE,QAAO,EAAG,QAAQ,IAAI;CACrC;AAIM,IAAM,gBAAgBA,IAAE,OAAO;EACpC,eAAeA,IAAE,OAAM;EACvB,YAAYA,IAAE,QAAO,EAAG,QAAQ,IAAI;CACrC;AAIM,IAAM,mBAAmBA,IAAE,OAAO;EACvC,UAAUA,IAAE,QAAO;EACnB,gBAAgBA,IAAE,OAAM,EAAG,SAAQ,EAAG,SAAQ;CAC/C;AAOM,IAAM,MAAMA,IAAE,OAAO;EAC1B,IAAIA,IAAE,QAAO;EACb,QAAQA,IAAE,OAAM,EAAG,SAAQ;CAC5B;;;AC/ED,SAAS,KAAAC,WAAS;AASX,IAAM,YAAYA,IAAE,KAAK;;EAE9B;EACA;EACA;EACA;;EAEA;EACA;;EAEA;EACA;EACA;;EAEA;EACA;EACA;;EAEA;EACA;;EAEA;EACA;CACD;AAGM,IAAM,aAAaA,IAAE,OAAO;EACjC,MAAM;EACN,SAASA,IAAE,OAAM;;EACjB,WAAWA,IAAE,QAAO;EACpB,SAASA,IAAE,OAAOA,IAAE,OAAM,GAAIA,IAAE,QAAO,CAAE,EAAE,SAAQ;;CACpD;;;ACxCD,SAAS,KAAAC,WAAS;AAuCX,IAAM,gBAAgB;;EAE3B,MAAM;EACN,WAAW;;EAEX,UAAU;EACV,eAAe;;EAEf,WAAW;;EAEX,gBAAgB;EAChB,kBAAkB;EAClB,cAAc;EACd,gBAAgB;EAChB,oBAAoB;EACpB,kBAAkB;EAClB,sBAAsB;;EAEtB,gBAAgB;EAChB,oBAAoB;EACpB,gBAAgB;EAChB,gBAAgB;EAChB,kBAAkB;EAClB,cAAc;;EAEd,eAAe;EACf,eAAe;;EAEf,mBAAmB;EACnB,iBAAiB;EACjB,iBAAiB;EACjB,kBAAkB;EAClB,qBAAqB;;EAErB,iBAAiB;EACjB,yBAAyB;;EAEzB,eAAe;EACf,kBAAkB;EAClB,kBAAkB;;EAElB,sBAAsB;EACtB,KAAK;;EAEL,OAAO;;AAOF,IAAM,cAAc,OAAO,KAAK,aAAa;AAMpD,SAAS,MAA2B,MAAS,SAAkC;AAC7E,SAAOC,IAAE,OAAO;IACd,GAAGA,IAAE,QAAQ,CAAC;IACd,IAAIA,IAAE,OAAM,EAAG,KAAI;IACnB,IAAIA,IAAE,OAAM,EAAG,SAAQ;IACvB,MAAMA,IAAE,QAAQ,IAAI;IACpB,MAAMA,IAAE,OAAM,EAAG,KAAI,EAAG,SAAQ;IAChC;GACD;AACH;AAOO,IAAM,WAAWA,IAAE,mBAAmB,QAAQ;EACnD,MAAM,QAAQ,cAAc,MAAM,CAAC;EACnC,MAAM,WAAW,cAAc,SAAS,CAAC;EACzC,MAAM,YAAY,cAAc,UAAU,CAAC;EAC3C,MAAM,eAAe,cAAc,aAAa,CAAC;EACjD,MAAM,aAAa,cAAc,WAAW,CAAC;EAC7C,MAAM,gBAAgB,cAAc,cAAc,CAAC;EACnD,MAAM,kBAAkB,cAAc,gBAAgB,CAAC;EACvD,MAAM,cAAc,cAAc,YAAY,CAAC;EAC/C,MAAM,gBAAgB,cAAc,cAAc,CAAC;EACnD,MAAM,oBAAoB,cAAc,kBAAkB,CAAC;EAC3D,MAAM,kBAAkB,cAAc,gBAAgB,CAAC;EACvD,MAAM,sBAAsB,cAAc,oBAAoB,CAAC;EAC/D,MAAM,gBAAgB,cAAc,cAAc,CAAC;EACnD,MAAM,oBAAoB,cAAc,kBAAkB,CAAC;EAC3D,MAAM,gBAAgB,cAAc,cAAc,CAAC;EACnD,MAAM,gBAAgB,cAAc,cAAc,CAAC;EACnD,MAAM,kBAAkB,cAAc,gBAAgB,CAAC;EACvD,MAAM,cAAc,cAAc,YAAY,CAAC;EAC/C,MAAM,eAAe,cAAc,aAAa,CAAC;EACjD,MAAM,eAAe,cAAc,aAAa,CAAC;EACjD,MAAM,mBAAmB,cAAc,iBAAiB,CAAC;EACzD,MAAM,iBAAiB,cAAc,eAAe,CAAC;EACrD,MAAM,iBAAiB,cAAc,eAAe,CAAC;EACrD,MAAM,kBAAkB,cAAc,gBAAgB,CAAC;EACvD,MAAM,qBAAqB,cAAc,mBAAmB,CAAC;EAC7D,MAAM,iBAAiB,cAAc,eAAe,CAAC;EACrD,MAAM,yBAAyB,cAAc,uBAAuB,CAAC;EACrE,MAAM,eAAe,cAAc,aAAa,CAAC;EACjD,MAAM,kBAAkB,cAAc,gBAAgB,CAAC;EACvD,MAAM,kBAAkB,cAAc,gBAAgB,CAAC;EACvD,MAAM,sBAAsB,cAAc,oBAAoB,CAAC;EAC/D,MAAM,OAAO,cAAc,KAAK,CAAC;EACjC,MAAM,SAAS,cAAc,OAAO,CAAC;CACtC;;;AClJD,SAAS,kBAAkB;AAIpB,IAAM,kBAAkB,MAAM;AAarC,IAAM,cAAc,IAAI,YAAW;AACnC,SAAS,WAAW,MAAY;AAC9B,SAAO,YAAY,OAAO,IAAI,EAAE;AAClC;AAEA,SAAS,kBAAkB,MAAa;AACtC,MAAI,OAAO,SAAS,YAAY,SAAS;AAAM,WAAO;AACtD,QAAM,IAAI;AACV,QAAM,MAAyB,CAAA;AAC/B,MAAI,OAAO,EAAE,UAAU;AAAU,QAAI,QAAQ,EAAE;AAC/C,MAAI,OAAO,EAAE,QAAQ;AAAU,QAAI,MAAM,EAAE;AAC3C,MAAI,OAAO,EAAE,YAAY;AAAU,QAAI,UAAU,EAAE;AACnD,MAAI,OAAO,EAAE,aAAa;AAAU,QAAI,WAAW,EAAE;AACrD,SAAO,OAAO,KAAK,GAAG,EAAE,SAAS,IAAI,MAAM;AAC7C;AAEM,SAAU,eAAe,MAAY;AACzC,MAAI,WAAW,IAAI,IAAI,iBAAiB;AACtC,WAAO,EAAE,IAAI,OAAO,IAAI,UAAU,KAAK,kBAAiB;EAC1D;AACA,MAAI;AACJ,MAAI;AACF,WAAO,KAAK,MAAM,IAAI;EACxB,QAAQ;AACN,WAAO,EAAE,IAAI,OAAO,IAAI,UAAU,KAAK,eAAc;EACvD;AACA,QAAM,MAAM,SAAS,UAAU,IAAI;AACnC,MAAI,CAAC,IAAI,SAAS;AAChB,UAAM,KACJ,OAAO,SAAS,YAAY,SAAS,QAAQ,OAAQ,KAA0B,OAAO,WACjF,KAAwB,KACzB;AACN,WAAO,EAAE,IAAI,OAAO,IAAI,KAAK,IAAI,MAAM,QAAO;EAChD;AACA,QAAM,SAAS,cAAc,IAAI,KAAK,IAAiB;AACvD,MAAI,CAAC,QAAQ;AACX,WAAO,EAAE,IAAI,OAAO,IAAI,IAAI,KAAK,IAAI,KAAK,gBAAe;EAC3D;AACA,QAAM,UAAU,OAAO,UAAU,IAAI,KAAK,OAAO;AACjD,MAAI,CAAC,QAAQ,SAAS;AACpB,WAAO,EAAE,IAAI,OAAO,IAAI,IAAI,KAAK,IAAI,KAAK,QAAQ,MAAM,QAAO;EACjE;AACA,QAAM,MAAM,kBAAkB,IAAI;AAClC,SAAO;IACL,IAAI;IACJ,OAAO,EAAE,GAAG,IAAI,MAAM,SAAS,QAAQ,KAAI;IAC3C,GAAI,MAAM,EAAE,IAAG,IAAK,CAAA;;AAExB;AASM,SAAU,cAAmC,MAAS,SAAkB,OAAkB,CAAA,GAAE;AAChG,QAAM,OAAO;IACX,GAAG;IACH,IAAI,KAAK,MAAM,WAAU;IACzB,IAAI,KAAK,OAAM,oBAAI,KAAI,GAAG,YAAW;IACrC;IACA;IACA,GAAI,KAAK,OAAO,EAAE,MAAM,KAAK,KAAI,IAAK,CAAA;IACtC,GAAI,KAAK,OAAO,CAAA;;AAElB,SAAO;AACT;AAEM,SAAU,OAAOC,QAAe;AACpC,SAAO,KAAK,UAAUA,MAAK;AAC7B;;;AC7EO,IAAM,YAAN,cAAwB,MAAM;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACT,YAAY,MAAc,SAAiB,YAAY,OAAO,SAAmC;AAC/F,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,YAAY;AACjB,QAAI,QAAS,MAAK,UAAU;AAAA,EAC9B;AACF;AAWO,IAAM,SAAN,MAAa;AAAA,EAGlB,YACmB,OACA,cACA,WAAW,GAC5B;AAHiB;AACA;AACA;AAAA,EAChB;AAAA,EAHgB;AAAA,EACA;AAAA,EACA;AAAA,EALX,UAAU,oBAAI,IAAqB;AAAA,EAQ3C,QAAQC,QAAiB,OAAqD;AAC5E,UAAM,UAAU,KAAK,UAAUA,MAAK;AACpC,WAAO,IAAI,QAAkB,CAACC,UAAS,WAAW;AAChD,YAAM,QAAiB,EAAE,IAAID,OAAM,IAAI,SAAS,SAAAC,UAAS,QAAQ,OAAO,EAAE;AAC1E,WAAK,QAAQ,IAAID,OAAM,IAAI,KAAK;AAChC,WAAK,IAAI,OAAO,KAAK;AACrB,YAAM,OAAO;AAAA,IACf,CAAC;AAAA,EACH;AAAA,EAEQ,IAAI,OAAgB,OAAwC;AAClE,UAAM,QAAQ,KAAK,MAAM,WAAW,MAAM;AACxC,UAAI,CAAC,KAAK,QAAQ,IAAI,MAAM,EAAE,EAAG;AACjC,UAAI,MAAM,SAAS,KAAK,UAAU;AAChC,aAAK,QAAQ,OAAO,MAAM,EAAE;AAC5B,cAAM,OAAO,IAAI,UAAU,YAAY,gBAAgB,KAAK,QAAQ,cAAc,MAAM,EAAE,IAAI,IAAI,CAAC;AACnG;AAAA,MACF;AACA,YAAM,SAAS;AACf,WAAK,IAAI,OAAO,KAAK;AACrB,YAAM,MAAM,OAAO;AAAA,IACrB,GAAG,KAAK,YAAY;AAAA,EACtB;AAAA,EAEA,OAAOA,QAA0B;AAC/B,UAAM,OAAOA,OAAM;AACnB,QAAI,CAAC,KAAM,QAAO;AAClB,UAAM,QAAQ,KAAK,QAAQ,IAAI,IAAI;AACnC,QAAI,CAAC,MAAO,QAAO;AACnB,SAAK,QAAQ,OAAO,IAAI;AACxB,QAAI,MAAM,UAAU,OAAW,MAAK,MAAM,aAAa,MAAM,KAAK;AAClE,QAAIA,OAAM,SAAS,SAAS;AAC1B,YAAM,IAAIA,OAAM;AAChB,YAAM,OAAO,IAAI,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,CAAC;AAAA,IACvE,OAAO;AACL,YAAM,QAAQA,MAAK;AAAA,IACrB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,WAAmB;AACjB,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,UAAU,KAAoB;AAC5B,eAAW,SAAS,KAAK,QAAQ,OAAO,GAAG;AACzC,UAAI,MAAM,UAAU,OAAW,MAAK,MAAM,aAAa,MAAM,KAAK;AAClE,YAAM,OAAO,GAAG;AAAA,IAClB;AACA,SAAK,QAAQ,MAAM;AAAA,EACrB;AACF;;;AChFA,IAAM,iBAAiB;AACvB,IAAM,kBAAkB;AACxB,IAAM,iBAAiB;AAgChB,IAAM,WAAN,MAAe;AAAA,EAepB,YAA6B,MAAoB;AAApB;AAC3B,SAAK,aAAa,IAAI,OAAO,KAAK,OAAO,cAAc;AAAA,EACzD;AAAA,EAF6B;AAAA,EAd7B,QAAiB;AAAA,EACjB,eAAe;AAAA,EACf,eAAe;AAAA,EAEP;AAAA,EACS;AAAA,EACT,UAAU;AAAA,EACV,QAAQ;AAAA;AAAA,EACR,UAAU;AAAA,EACV;AAAA,EACA,kBAAkB;AAAA;AAAA,EAClB;AAAA,EACA,cAAc;AAAA;AAAA,EAOtB,QAAc;AACZ,SAAK,UAAU;AACf,SAAK,QAAQ;AACb,SAAK,KAAK,eAAe;AAAA,EAC3B;AAAA,EAEA,MAAM,OAAsB;AAC1B,SAAK,UAAU;AACf,QAAI,KAAK,mBAAmB,QAAW;AACrC,WAAK,KAAK,MAAM,aAAa,KAAK,cAAc;AAChD,WAAK,iBAAiB;AAAA,IACxB;AACA,SAAK,cAAc;AACnB,SAAK,WAAW,UAAU,IAAI,MAAM,UAAU,CAAC;AAC/C,SAAK,WAAW,MAAM,KAAM,UAAU;AACtC,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,MAAc,iBAAgC;AAC5C,QAAI,KAAK,WAAW,KAAK,MAAO;AAChC,SAAK,QAAQ;AACb,QAAI;AACF,YAAM,IAAI,MAAM,KAAK,KAAK,QAAQ;AAClC,WAAK,YAAY;AACjB,QAAE,UAAU,CAAC,QAAQ,KAAK,KAAK,OAAO,GAAG,CAAC;AAC1C,QAAE,QAAQ,CAAC,GAAG,MAAM,KAAK,QAAQ,GAAG,CAAC,CAAC;AACtC,YAAM,KAAK,UAAU;AACrB,WAAK,UAAU;AAAA,IACjB,SAAS,KAAK;AACZ,WAAK,KAAK,IAAI,KAAK,iCAAkC,IAAc,OAAO,EAAE;AAC5E,WAAK,WAAW,MAAM,MAAM,kBAAkB;AAC9C,WAAK,YAAY;AACjB,WAAK,kBAAkB;AAAA,IACzB;AAAA,EACF;AAAA,EAEQ,oBAA0B;AAChC,QAAI,KAAK,WAAW,KAAK,MAAO;AAChC,QAAI,KAAK,mBAAmB,OAAW;AACvC,UAAM,SAAS,KAAK,KAAK,UAAU,KAAK;AACxC,UAAM,OAAO,KAAK,IAAI,gBAAgB,kBAAkB,KAAK,KAAK,OAAO;AACzE,UAAM,QAAQ,OAAO,KAAK,MAAM,OAAO,IAAI,IAAI;AAC/C,SAAK,WAAW;AAChB,SAAK,iBAAiB,KAAK,KAAK,MAAM,WAAW,MAAM;AACrD,WAAK,iBAAiB;AACtB,WAAK,KAAK,eAAe;AAAA,IAC3B,GAAG,KAAK;AAAA,EACV;AAAA,EAEA,MAAc,YAA2B;AAEvC,SAAK,QAAQ;AACb,UAAM,cAAuC;AAAA,MAC3C,aAAa,KAAK,KAAK;AAAA,MACvB,cAAc,KAAK,KAAK;AAAA,IAC1B;AAGA,QAAI,KAAK,KAAK,UAAU;AACtB,kBAAY,WAAW,KAAK,KAAK;AAAA,IACnC;AACA,QAAI,KAAK,kBAAkB,GAAG;AAC5B,kBAAY,SAAS,EAAE,WAAW,KAAK,iBAAiB,aAAa,CAAC,EAAE;AAAA,IAC1E;AACA,UAAM,SAAS,MAAM,KAAK,QAAQ,QAAQ,WAAW;AACrD,UAAM,KAAK,OAAO;AAClB,SAAK,eAAe,GAAG;AACvB,SAAK,kBAAkB,GAAG;AAE1B,QAAI,GAAG,YAAY,GAAG,aAAa,KAAK,KAAK,UAAU;AACrD,WAAK,KAAK,WAAW,GAAG;AACxB,WAAK,KAAK,aAAa,GAAG,QAAQ;AAAA,IACpC;AAGA,SAAK,QAAQ;AACb,UAAM,QAAQ,MAAM,KAAK,QAAQ,YAAY;AAAA,MAC3C,MAAM,KAAK,KAAK;AAAA,MAChB,cAAc,KAAK,KAAK,aAAa;AAAA,MACrC,WAAW,KAAK,KAAK;AAAA,MACrB,YAAY,KAAK,KAAK,WAAW;AAAA,IACnC,CAAC;AACD,UAAM,OAAO,MAAM;AACnB,SAAK,eAAe,KAAK;AACzB,SAAK,KAAK,YAAY,uBAAuB,IAAI;AAEjD,SAAK,QAAQ;AACb,SAAK,cAAc,GAAG,eAAe,IAAI,GAAG,eAAe,MAAO,KAAK,KAAK;AAC5E,SAAK,aAAa;AAClB,SAAK,KAAK,IAAI,KAAK,oBAAoB,KAAK,YAAY,kBAAkB,KAAK,YAAY,GAAG;AAAA,EAChG;AAAA,EAEQ,QAAQ,MAAc,SAAqC;AACjE,UAAME,SAAQ,cAAc,MAA6C,OAAO;AAChF,WAAO,KAAK,WAAW,QAAQA,QAAO,CAAC,MAAM,KAAK,UAAW,KAAK,CAAC,CAAC;AAAA,EACtE;AAAA,EAEA,MAAc,OAAO,MAA6B;AAChD,UAAM,UAAU,eAAe,IAAI;AACnC,QAAI,CAAC,QAAQ,IAAI;AACf,WAAK,UAAU,QAAQ,IAAI,KAAK,gBAAgB,QAAQ,GAAG,GAAG,QAAQ,KAAK,KAAK;AAChF;AAAA,IACF;AACA,UAAMA,SAAQ,QAAQ;AAEtB,QAAIA,OAAM,QAAQ,KAAK,WAAW,OAAOA,MAAK,EAAG;AAEjD,QAAI,KAAK,UAAU,WAAW,KAAK,UAAU,YAAY;AACvD,WAAK,UAAUA,OAAM,IAAI,kBAAkB,GAAGA,OAAM,IAAI,eAAe,KAAK,KAAK,IAAI,KAAK;AAC1F;AAAA,IACF;AAEA,QAAI,QAAQ,KAAK,UAAU,UAAa,QAAQ,IAAI,QAAQ,KAAK,cAAc;AAC7E,WAAK,UAAUA,OAAM,IAAI,eAAe,mBAAmB,IAAI;AAC/D;AAAA,IACF;AACA,SAAK,gBAAgBA,MAAK;AAAA,EAC5B;AAAA,EAEQ,gBAAgB,KAAkE;AACxF,QAAI,QAAQ,kBAAmB,QAAO;AACtC,QAAI,QAAQ,gBAAiB,QAAO;AACpC,WAAO;AAAA,EACT;AAAA,EAEQ,UAAU,MAAc,MAAc,SAAiB,WAA0B;AACvF,QAAI,CAAC,KAAK,UAAW;AACrB,SAAK,UAAU,KAAK,OAAO,cAAc,SAAS,EAAE,MAAM,SAAS,UAAU,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AAAA,EAC5F;AAAA,EAEQ,QAAQ,MAAc,SAAuB;AACnD,SAAK,cAAc;AACnB,SAAK,WAAW,UAAU,IAAI,UAAU,YAAY,qBAAqB,IAAI,CAAC;AAC9E,QAAI,SAAS,MAAM;AACjB,WAAK,QAAQ;AACb,WAAK,QAAQ;AACb,WAAK,KAAK,IAAI,MAAM,0EAAqE;AACzF;AAAA,IACF;AACA,QAAI,KAAK,SAAS;AAChB,WAAK,QAAQ;AACb;AAAA,IACF;AACA,SAAK,QAAQ;AACb,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAEQ,eAAqB;AAC3B,SAAK,iBAAiB,KAAK,KAAK,MAAM,WAAW,MAAM;AACrD,UAAI,KAAK,UAAU,QAAS;AAC5B,WAAK,WAAW;AAAA,QACd;AAAA,UACE,cAAc,aAAa;AAAA,YACzB,MAAM,KAAK,KAAK,aAAa;AAAA,YAC7B,QAAQ;AAAA,YACR,gBAAgB,KAAK,KAAK,eAAe;AAAA,YACzC,gBAAgB,KAAK,KAAK,iBAAiB,KAAK,CAAC;AAAA,UACnD,CAAC;AAAA,QACH;AAAA,MACF;AACA,WAAK,aAAa;AAAA,IACpB,GAAG,KAAK,WAAW;AAAA,EACrB;AAAA,EAEQ,gBAAsB;AAC5B,QAAI,KAAK,mBAAmB,QAAW;AACrC,WAAK,KAAK,MAAM,aAAa,KAAK,cAAc;AAChD,WAAK,iBAAiB;AAAA,IACxB;AAAA,EACF;AAAA;AAAA,EAGQ,gBAAgBA,QAAuB;AAC7C,YAAQA,OAAM,MAAM;AAAA,MAClB,KAAK;AACH,aAAK,KAAK,YAAY,gBAAiBA,OAAM,QAA8C,IAAI;AAC/F;AAAA;AAAA,MACF,KAAK;AACH,YAAI;AACF,eAAK,KAAK,YAAY,WAAWA,OAAM,OAAmD;AAC1F,eAAK,MAAMA,QAAO,OAAO,EAAE,IAAI,KAAK,CAAC;AAAA,QACvC,SAAS,KAAK;AACZ,eAAK,UAAUA,OAAM,IAAI,eAAe,uBAAwB,IAAc,OAAO,IAAI,KAAK;AAAA,QAChG;AACA;AAAA,MACF,KAAK;AACH,aAAK,KAAK,YAAY,WAAYA,OAAM,QAA+B,MAAM;AAC7E,aAAK,MAAMA,QAAO,OAAO,EAAE,IAAI,KAAK,CAAC;AACrC;AAAA,MACF,KAAK,gBAAgB;AACnB,cAAM,IAAIA,OAAM;AAChB,aAAK,KAAK,YAAY,iBAAiB,CAAC;AACxC,aAAK,MAAMA,QAAO,oBAAoB,EAAE,IAAI,MAAM,YAAY,EAAE,WAAW,CAAC;AAC5E;AAAA,MACF;AAAA,MACA,KAAK;AACH,aAAK,KAAK,YAAY,iBAAiBA,OAAM,OAAyD;AACtG;AAAA;AAAA;AAAA,MAEF,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,aAAK,UAAUA,OAAM,IAAI,YAAY,GAAGA,OAAM,IAAI,oBAAoB,KAAK;AAC3E;AAAA,MACF;AACE,aAAK,KAAK,IAAI,MAAM,gBAAgBA,OAAM,IAAI,EAAE;AAChD;AAAA,IACJ;AAAA,EACF;AAAA,EAEQ,MAAM,KAAe,MAAc,SAAwB;AACjE,SAAK,WAAW,KAAK,OAAO,cAAc,MAA6C,SAAS,EAAE,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC;AAAA,EACpH;AACF;;;ACtRA,OAAO,eAAe;AAGf,IAAM,cAAc;AAC3B,IAAM,kBAAkB;AAUjB,IAAM,kBAAN,MAAM,iBAAqC;AAAA,EAKxC,YAA6B,IAAe;AAAf;AAAA,EAAgB;AAAA,EAAhB;AAAA,EAJrC,IAAI,cAAsB;AACxB,WAAO,KAAK,GAAG;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,KAAK,KAAiC;AAC3C,UAAM,QAAQ,IAAI,SAAS,eAAe,IAAI,MAAM,IAAI,QAAQ,QAAQ,EAAE,IAAI;AAC9E,WAAO,IAAI,QAAmB,CAACC,UAAS,WAAW;AACjD,YAAM,KAAK,IAAI,UAAU,OAAO,CAAC,WAAW,GAAG,EAAE,YAAY,gBAAgB,CAAC;AAC9E,YAAM,iBAAiB,CAAC,QAAe;AACrC,WAAG,mBAAmB;AACtB,eAAO,GAAG;AAAA,MACZ;AACA,SAAG,KAAK,SAAS,cAAc;AAC/B,SAAG,KAAK,QAAQ,MAAM;AACpB,WAAG,eAAe,SAAS,cAAc;AACzC,QAAAA,SAAQ,IAAI,iBAAgB,EAAE,CAAC;AAAA,MACjC,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEA,KAAK,MAAoB;AACvB,SAAK,GAAG,KAAK,IAAI;AAAA,EACnB;AAAA,EACA,UAAU,IAAkC;AAC1C,SAAK,GAAG,GAAG,WAAW,CAAC,MAAe,aAAuB;AAC3D,UAAI,SAAU;AACd,SAAG,OAAO,SAAS,WAAW,OAAO,OAAO,IAAI,CAAC;AAAA,IACnD,CAAC;AAAA,EACH;AAAA,EACA,QAAQ,IAAkD;AACxD,SAAK,GAAG,GAAG,SAAS,CAAC,MAAc,WAAmB,GAAG,MAAM,OAAO,SAAS,CAAC,CAAC;AAAA,EACnF;AAAA,EACA,MAAM,MAAc,QAAsB;AACxC,SAAK,GAAG,MAAM,MAAM,MAAM;AAAA,EAC5B;AACF;;;ACzDA,SAAS,QAAAC,aAAY;AAGd,IAAM,iBAAN,MAAqB;AAAA,EAG1B,YAA6B,MAA8C;AAA9C;AAAA,EAA+C;AAAA,EAA/C;AAAA,EAFrB,OAAO,oBAAI,IAAkB;AAAA,EAIrC,OAAO,MAAwB;AAC7B,SAAK,OAAO,KAAK,MAAM;AACvB,QAAI,KAAK,YAAY,MAAO;AAE5B,SAAK,KAAK,IAAI,KAAK,QAAQ,IAAIA,MAAK,KAAK,UAAU,MAAM,KAAK,KAAK,OAAO,IAAI,CAAC,CAAC;AAAA,EAClF;AAAA,EAEA,OAAO,QAAsB;AAC3B,SAAK,KAAK,IAAI,MAAM,GAAG,KAAK;AAC5B,SAAK,KAAK,OAAO,MAAM;AAAA,EACzB;AAAA,EAEA,SAAS,OAA2B;AAClC,UAAM,OAAO,IAAI,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;AAC/C,eAAW,MAAM,CAAC,GAAG,KAAK,KAAK,KAAK,CAAC,EAAG,KAAI,CAAC,KAAK,IAAI,EAAE,EAAG,MAAK,OAAO,EAAE;AACzE,eAAW,KAAK,MAAO,MAAK,OAAO,CAAC;AAAA,EACtC;AAAA,EAEA,MAAgB;AACd,WAAO,CAAC,GAAG,KAAK,KAAK,KAAK,CAAC;AAAA,EAC7B;AAAA,EAEA,OAAa;AACX,eAAW,MAAM,CAAC,GAAG,KAAK,KAAK,KAAK,CAAC,EAAG,MAAK,OAAO,EAAE;AAAA,EACxD;AACF;;;ACfA,IAAM,aAAa,oBAAI,IAAI,CAAC,SAAS,SAAS,QAAQ,QAAQ,OAAO,CAAC;AAO/D,SAAS,gBAAgB,KAAa,MAAyE;AACpH,QAAM,UAAoB,CAAC;AAC3B,QAAM,UAAoB,CAAC;AAC3B,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC/C,QAAI,KAAK;AACT,YAAQ,KAAK;AAAA,MACX,KAAK;AACH,YAAI,OAAO,UAAU,YAAY,WAAW,IAAI,KAAK,GAAG;AACtD,cAAI,QAAQ,QAAQ;AACpB,eAAK;AAAA,QACP;AACA;AAAA,MACF,KAAK;AACH,YAAI,OAAO,UAAU,YAAY,OAAO,UAAU,KAAK,GAAG;AACxD,cAAI,OAAO,YAAY;AACvB,eAAK;AAAA,QACP;AACA;AAAA,MACF,KAAK;AACH,YAAI,OAAO,UAAU,YAAY,OAAO,UAAU,KAAK,GAAG;AACxD,cAAI,OAAO,wBAAwB;AACnC,eAAK;AAAA,QACP;AACA;AAAA,MACF,KAAK;AACH,YAAI,OAAO,UAAU,YAAY,OAAO,UAAU,KAAK,GAAG;AACxD,cAAI,OAAO,qBAAqB;AAChC,eAAK;AAAA,QACP;AACA;AAAA,MACF;AACE,aAAK;AAAA,IACT;AACA;AAAC,KAAC,KAAK,UAAU,SAAS,KAAK,GAAG;AAAA,EACpC;AACA,SAAO,EAAE,SAAS,QAAQ;AAC5B;;;ACrDO,IAAM,cAAN,MAAmC;AAAA,EACxC,MAAc;AACZ,WAAO,KAAK,IAAI;AAAA,EAClB;AAAA,EACA,WAAW,IAAgB,IAAyB;AAClD,WAAO,WAAW,WAAW,IAAI,EAAE;AAAA,EACrC;AAAA,EACA,aAAa,GAAsB;AACjC,eAAW,aAAa,CAA6C;AAAA,EACvE;AACF;AAEO,IAAM,cAAqB,IAAI,YAAY;;;ArCElD,IAAM,eAAe,CAAC,uBAAkB,8BAAyB,kBAAa;AAEvE,IAAM,SAAN,MAAa;AAAA,EAsBlB,YACU,OAKJ,CAAC,GACL;AANQ;AAAA,EAMP;AAAA,EANO;AAAA,EAtBF;AAAA,EACA,SAAS,oBAAI,IAAyB;AAAA,EACtC,QAAQ,oBAAI,IAAqB;AAAA,EACjC,cAAiC,CAAC;AAAA,EAClC;AAAA,EACA;AAAA;AAAA,EAEA,oBAAoB,oBAAI,IAA6B;AAAA,EACrD,aAAa,oBAAI,IAA2B;AAAA,EAC5C;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA,MAAc,WAAW,MAAM;AAAA,EAC/B,OAAO;AAAA,EACP,WAA2E,CAAC;AAAA,EAC5E;AAAA,EACA;AAAA,EACA,aAAqC,CAAC;AAAA,EACtC;AAAA,EAWR,MAAM,QAAuB;AAC3B,UAAM,OAAO,YAAY,KAAK,KAAK,IAAI;AACvC,UAAM,MAAM,WAAW,EAAE,MAAM,WAAW,KAAK,KAAK,WAAW,UAAU,CAAC,CAAC,KAAK,KAAK,WAAW,YAAY,KAAK,CAAC;AAClH,SAAK,MAAM;AAIX,UAAM,oBAAoB,CAAC,EAAE,IAAI,cAAc,WAAW,IAAI,aAAa;AAC3E,QAAI,CAAC,IAAI,YAAY,CAAC,mBAAmB;AACvC,UAAI,WAAWC,YAAW;AAC1B,sBAAgB,MAAM,IAAI,QAAQ;AAAA,IACpC;AACA,SAAK,MAAM,WAAW,IAAI,QAAQ,KAAK;AACvC,SAAK,IAAI,KAAK,yBAAyB,IAAI,GAAG;AAC9C,SAAK,IAAI;AAAA,MACP,kBAAkB,IAAI,cAAc,UAAU,YAAY,IAAI,aAAa,OAAO,QAAQ,MAAM,+BAA0B;AAAA,IAC5H;AACA,SAAK,YAAY,IAAI;AACrB,UAAM,SAAS,KAAK,cAAc;AAClC,eAAW,KAAK,OAAQ,MAAK,OAAO,IAAI,EAAE,IAAI,CAAC;AAC/C,SAAK,IAAI;AAAA,MACP,UAAU,OAAO,MAAM,kBAAkB,KAAK,SAAS,GAAG,OAAO,SAAS,KAAK,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,IAAI,CAAC,KAAK,EAAE;AAAA,IAC1H;AAEA,SAAK,OAAO;AACZ,SAAK,WAAW,MAAM,gBAAgB,KAAK,MAAM;AAAA,MAC/C,gBAAgB,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO;AAAA,MAC3C,MAAM;AAAA,IACR,CAAC;AACD,SAAK,IAAI,KAAK,mBAAmB,OAAO,KAAK,KAAK,QAAQ,EAAE,KAAK,IAAI,KAAK,QAAQ,EAAE;AAEpF,SAAK,QAAQ,IAAI,WAAW,UAAU,IAAI,CAAC;AAC3C,SAAK,YAAY,IAAI,eAAe;AAAA,MAClC,MAAM,MAAM;AACV,cAAM,MAAM,KAAK,MAAM,aAAa;AACpC,eAAO,MACH;AAAA,UACE,cAAc,IAAI;AAAA,UAClB,aAAa,KAAK,MAAM,IAAI,WAAW;AAAA,UACvC,aAAa,KAAK,MAAM,IAAI,WAAW;AAAA,QACzC,IACA;AAAA,MACN;AAAA,MACA,MAAM,CAAC,MAAM,KAAK,MAAM,aAAa,EAAE,cAAc,KAAK,UAAU,EAAE,WAAW,GAAG,KAAK,UAAU,EAAE,WAAW,CAAC;AAAA,IACnH,CAAC;AACD,SAAK,WAAW,IAAI,eAAe;AAAA,MACjC,OAAO,KAAK;AAAA;AAAA;AAAA,MAGZ,SAAS,CAAC,YAAY,KAAK,gBAAgB,OAAO;AAAA,MAClD,WAAW,CAAC,OAAO,KAAK,OAAO,IAAI,EAAE;AAAA,IACvC,CAAC;AACD,SAAK,YAAY,IAAI,UAAU;AAAA,MAC7B,QAAQ,CAAC,SAAS,QAChB,KAAK,KAAK,SAAS,SAAS,GAAG,EAAE;AAAA,QAAM,CAAC,QACtC,KAAK,IAAI,MAAM,mCAAmC,OAAO,MAAO,IAAc,SAAS,GAAG,EAAE;AAAA,MAC9F;AAAA,MACF,YAAY,MAAMA,YAAW;AAAA,IAC/B,CAAC;AAGD,UAAM,SAAS,YAAY,MAAM;AACjC,SAAK,aAAa,CAAC;AACnB,QAAI,OAAO,SAAS,EAAG,MAAK,IAAI,KAAK,yCAAyC;AAAA,QACzE,MAAK,IAAI,KAAK,kBAAkB,OAAO,IAAI,uBAAuB;AACvE,eAAW,SAAS,OAAO,OAAO,GAAG;AACnC,YAAM,OAAO,IAAI,gBAAgB;AAAA,QAC/B;AAAA,QACA,YAAY,MAAMA,YAAW;AAAA,QAC7B,WAAW,CAAC,QAAQ,KAAK,UAAU,GAAG;AAAA,QACtC,KAAK,KAAK;AAAA,QACV,WAAW,IAAI,QAAQ,UAAU,WAAW,IAAI,QAAQ,UAAU;AAAA,MACpE,CAAC;AACD,WAAK,IAAI;AAAA,QACP,sBAAsB,MAAM,aAAa,MAAM,oBAAoB,MAAM,aAAa,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,MACxH;AACA,YAAM,KAAK,MAAM;AACjB,WAAK,IAAI,KAAK,uCAAuC,KAAK,SAAS,EAAE;AACrE,iBAAW,EAAE,cAAc,KAAK,MAAM,cAAc;AAClD,aAAK,WAAW,aAAa,IAAI,KAAK;AACtC,aAAK,kBAAkB,IAAI,eAAe,IAAI;AAAA,MAChD;AACA,WAAK,YAAY,KAAK,IAAI;AAAA,IAC5B;AAGA,QAAI,YAAY;AAChB,eAAW,KAAK;AACd,iBAAW,KAAK,EAAE,OAAO;AACvB,aAAK,UAAU,SAAS,EAAE,IAAI,CAAC;AAC/B;AAAA,MACF;AACF,QAAI,UAAW,MAAK,IAAI,KAAK,cAAc,SAAS,UAAU;AAG9D,SAAK,UAAU,SAAS,MAAM,KAAK,WAAW;AAAA,MAC5C,eAAe;AAAA,MACf,OAAO;AAAA,MACP,SAAS,CAAC,MAAc,qCAAqC,KAAK,CAAC;AAAA,IACrE,CAAC;AACD,UAAM,YAAY,MAAM;AACtB,mBAAa,KAAK,aAAa;AAC/B,WAAK,gBAAgB,WAAW,MAAM;AACpC,aAAK,KAAK,UAAU,EAAE,MAAM,CAAC,QAAQ,QAAQ,MAAM,mCAAmC,GAAG,CAAC;AAAA,MAC5F,GAAG,GAAG;AAAA,IACR;AACA,SAAK,QAAQ,GAAG,OAAO,SAAS,EAAE,GAAG,UAAU,SAAS,EAAE,GAAG,UAAU,SAAS;AAChF,SAAK,IAAI,KAAK,YAAY,KAAK,SAAS,oBAAoB;AAC5D,SAAK,cAAc,IAAI;AACvB,SAAK,IAAI,KAAK,cAAc;AAAA,EAC9B;AAAA;AAAA;AAAA,EAIQ,gBAA+B;AACrC,WAAO,KAAK,KAAK,YAAY,CAAC,YAAY,KAAK,WAAW,KAAK,KAAK,SAAS,CAAC,IAAI,WAAW,KAAK,SAAS;AAAA,EAC7G;AAAA,EAEA,MAAM,YAA2B;AAC/B,UAAM,UAAU,KAAK,cAAc;AACnC,UAAM,EAAE,SAAS,OAAO,IAAI,WAAW,SAAS,CAAC,GAAG,KAAK,OAAO,KAAK,CAAC,CAAC;AACvE,eAAW,MAAM,QAAQ;AACvB,YAAM,OAAO,KAAK,MAAM,IAAI,EAAE;AAC9B,UAAI,MAAM;AACR,cAAM,KAAK,KAAK;AAChB,aAAK,MAAM,OAAO,EAAE;AAAA,MACtB;AACA,WAAK,WAAW,OAAO,EAAE;AACzB,WAAK,OAAO,OAAO,EAAE;AAAA,IACvB;AACA,eAAW,KAAK,QAAS,MAAK,OAAO,IAAI,EAAE,IAAI,CAAgB;AAAA,EAIjE;AAAA,EAEQ,WAAW,SAAiB,KAA6C;AAC/E,QAAI,OAAO,KAAK,MAAM,IAAI,OAAO;AACjC,QAAI,KAAM,QAAO;AACjB,UAAMC,SAAQ,KAAK,OAAO,IAAI,OAAO;AACrC,UAAM,WAAW,CAAC,KAAa,MAAW,KAAK,YAAY,SAAS,KAAK,CAAC;AAC1E,QAAI,KAAK,KAAK,aAAa;AACzB,aAAO,KAAK,KAAK,YAAYA,QAAO,QAAQ;AAAA,IAC9C,OAAO;AACL,YAAM,UAAU,KAAK,SAASA,OAAM,OAAO;AAC3C,UAAI,CAAC,QAAS,OAAM,IAAI,MAAM,YAAYA,OAAM,OAAO,0CAA0C;AACjG,aAAO,IAAI,QAAQ,SAAS,EAAE,UAAU,KAAK,cAAcA,MAAK,EAAE,CAAC;AAAA,IACrE;AACA,SAAK,MAAM,IAAI,SAAS,IAAI;AAC5B,WAAO;AAAA,EACT;AAAA;AAAA,EAGQ,aAAa,oBAAI,IAAY;AAAA,EAE7B,UAAU,KAA8B;AAG9C,QAAI,KAAK,WAAW,IAAI,IAAI,KAAK,GAAG;AAClC,WAAK,IAAI,MAAM,sBAAsB,IAAI,KAAK,UAAU;AACxD;AAAA,IACF;AACA,SAAK,WAAW,IAAI,IAAI,KAAK;AAC7B,QAAI,KAAK,WAAW,OAAO,IAAM,MAAK,WAAW,MAAM;AAEvD,UAAM,SAAS,WAAW,KAAK,KAAK,YAAY,GAAG,CAAC,GAAG,MAAM,KAAK,SAAS,YAAY,GAAG,CAAC,CAAC;AAC5F,QAAI,CAAC,QAAQ;AACX,WAAK,IAAI;AAAA,QACP,kCAAkC,IAAI,OAAO;AAAA,MAC/C;AACA;AAAA,IACF;AACA,SAAK,IAAI,KAAK,eAAe,IAAI,OAAO,kBAAa,OAAO,OAAO,kBAAkB,OAAO,aAAa,GAAG;AAC5G,SAAK,KAAK,SAAS,OAAO,SAAS,KAAK,OAAO,aAAa,EAAE;AAAA,MAAM,CAAC,QACnE,KAAK,IAAI,MAAM,8BAA8B,OAAO,OAAO,MAAO,IAAc,SAAS,GAAG,EAAE;AAAA,IAChG;AAAA,EACF;AAAA;AAAA,EAGQ,cAA6B;AACnC,UAAM,QAAQ,CAAC,GAAG,KAAK,OAAO,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,eAAe,GAAG,KAAK,UAAU,CAAC;AACzF,UAAM,KAAoB,CAAC;AAC3B,eAAW,UAAU,KAAK,WAAW,eAAe,KAAK,CAAC,GAAG;AAC3D,YAAM,WAAW,cAAc,QAAQ,CAAC,YAAY,KAAK,eAAe,OAAO,CAAC;AAChF,UAAI,SAAU,IAAG,KAAK,QAAQ;AAAA,UACzB,MAAK,IAAI,KAAK,kDAAkD,OAAO,OAAO,sBAAsB;AAAA,IAC3G;AACA,WAAO,CAAC,GAAG,OAAO,GAAG,EAAE;AAAA,EACzB;AAAA;AAAA,EAGQ,eAAe,SAAsE;AAC3F,WAAO,wBAAwB,KAAK,OAAO,IAAI,OAAO,GAAG,KAAK,UAAU;AAAA,EAC1E;AAAA;AAAA,EAGQ,mBAA6B;AACnC,UAAM,MAAM,oBAAI,IAAY;AAC5B,eAAW,UAAU,KAAK,WAAW,eAAe,KAAK,CAAC,GAAG;AAC3D,UAAI,CAAC,KAAK,eAAe,OAAO,OAAO,EAAG,KAAI,IAAI,OAAO,OAAO;AAAA,IAClE;AACA,WAAO,CAAC,GAAG,GAAG;AAAA,EAChB;AAAA;AAAA,EAGA,MAAc,SAAS,SAAiB,KAAwB,eAAuC;AACrG,UAAMA,SAAQ,KAAK,OAAO,IAAI,OAAO;AACrC,UAAM,OAAO,IAAI,gBAAgBA,OAAM,OAAO,IAAI;AAClD,UAAM,YAAY,KAAK,aAAa,SAAS,aAAa;AAE1D,UAAM,aAAa,KAAK,WAAW,IAAI,OAAO;AAC9C,UAAM,eAAe,IAAI,UAAU,IAAI;AACvC,SAAK,WAAW,UAAU,IAAI,SAAS,cAAc,aAAa,sBAAiB,wBAAmB,YAAY;AAClH,UAAM,EAAE,WAAW,OAAO,IAAI,MAAM,KAAK,SAAS,OAAO,SAAS,GAAG;AACrE,SAAK,QAAQ,IAAI,WAAW,EAAE,MAAM,SAAS,IAAI,SAAS,QAAQ,IAAI,QAAQ,MAAM,UAAU,CAAC;AAC/F,QAAI;AACF,YAAM,OAAO,MAAM,KAAK,gBAAgB,OAAO;AAC/C,UAAI,CAAC,WAAY,MAAK,WAAW,UAAU,IAAI,SAAS,cAAc,qBAAgB,YAAY;AAClG,YAAM,KAAK,OAAO,WAAW,MAAa;AAE1C,iBAAW,UAAU,KAAK,QAAQ,mBAAmB,SAAS,EAAE,GAAG;AACjE,cAAM,KAAK,YAAY,QAAQ,WAAW,IAAI,SAAS,YAAY;AAAA,MACrE;AAAA,IACF,UAAE;AACA,WAAK,QAAQ,OAAO,SAAS;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA,EAGA,MAAc,YACZ,QACA,MACA,SACA,QACe;AACf,QAAI,OAAO,SAAS,cAAc;AAChC,UAAI,QAAQ,OAAQ,OAAM,KAAK,UAAU,SAAS,QAAQ,OAAO,MAAM,OAAO,OAAO,eAAe,MAAS;AAC7G;AAAA,IACF;AACA,UAAM,MAAM,YAAY,SAAS,OAAO,MAAM,MAAM;AAAA,EACtD;AAAA,EAEQ,UAAU,oBAAI,IAGpB;AAAA,EAEM,YAAY,UAAkB,WAAmB,QAAmB;AAC1E,UAAM,IAAI,KAAK,QAAQ,IAAI,SAAS;AACpC,QAAI,CAAC,EAAG;AACR,eAAW,UAAU,EAAE,KAAK,SAAS,MAAM,GAAG;AAC5C,WAAK,KAAK,YAAY,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE;AAAA,QAAM,CAAC,QAChE,QAAQ,MAAM,sBAAsB,GAAG;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,gBAAgB,SAAmC;AAC/D,UAAM,OAAO,KAAK,WAAW,SAAS,KAAK,GAAG;AAC9C,QAAI,IAAI,KAAK,WAAW,IAAI,OAAO;AACnC,QAAI,CAAC,GAAG;AACN,UAAI,KAAK,MAAM;AACf,WAAK,WAAW,IAAI,SAAS,CAAC;AAAA,IAChC;AACA,UAAM;AACN,WAAO;AAAA,EACT;AAAA,EAEQ,aAAa,SAAiB,eAAqD;AACzF,UAAM,QAAQ,iBAAiB,KAAK,OAAO,IAAI,OAAO,GAAG,aAAa,CAAC,GAAG;AAC1E,WAAO,QAAQ,KAAK,kBAAkB,IAAI,KAAK,IAAI;AAAA,EACrD;AAAA;AAAA,EAGQ,gBAA6B;AACnC,WAAO;AAAA,MACL,iBAAiB,CAAC,SAAS;AACzB,cAAM,EAAE,SAAS,QAAQ,IAAI,gBAAgB,KAAK,KAAK,IAAI;AAC3D,YAAI,QAAQ,SAAS,eAAe,EAAG,MAAK,MAAM,WAAW,KAAK,IAAI,QAAQ,KAAK;AACnF,YAAI,QAAQ,OAAQ,MAAK,IAAI,KAAK,4BAA4B,QAAQ,KAAK,IAAI,CAAC,EAAE;AAClF,YAAI,QAAQ,OAAQ,MAAK,IAAI,KAAK,4BAA4B,QAAQ,KAAK,IAAI,CAAC,EAAE;AAAA,MACpF;AAAA,MACA,wBAAwB,CAAC,SAAqB;AAC5C,aAAK,SAAS,SAAS,KAAK,KAAK;AACjC,aAAK,WAAW,SAAS;AAAA,UACvB,cAAc,KAAK;AAAA,UACnB,aAAa,KAAK;AAAA,UAClB,MAAM,EAAE,aAAa,KAAK,KAAK,YAAY;AAAA,QAC7C,CAAC;AACD,YAAI,KAAK,OAAO,OAAQ,MAAK,IAAI,MAAM,OAAO,KAAK,OAAO,MAAM,yCAAyC;AACzG,YAAI,KAAK,YAAY,OAAQ,MAAK,IAAI,MAAM,iBAAiB,KAAK,YAAY,MAAM,gBAAgB;AAAA,MACtG;AAAA,MACA,YAAY,CAAC,SAAqB,KAAK,QAAS,OAAO,IAAI;AAAA,MAC3D,YAAY,CAAC,WAAmB,KAAK,QAAS,OAAO,MAAM;AAAA,MAC3D,kBAAkB,CAAC,MAAmB,KAAK,WAAW,aAAa,CAAC;AAAA,MACpE,kBAAkB,CAAC,MAAmB,KAAK,WAAW,YAAY,CAAC;AAAA,IACrE;AAAA,EACF;AAAA;AAAA,EAGQ,aAAa,MAAwB;AAC3C,UAAM,UAAUD,YAAW;AAC3B,UAAM,MAAyB;AAAA,MAC7B,OAAO,UAAU,KAAK,MAAM,IAAI,OAAO;AAAA,MACvC;AAAA,MACA,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS,KAAK,OAAO;AAAA,MACrB,QAAQ,UAAU,KAAK,MAAM,IAAI,OAAO;AAAA,MACxC,QAAQ,EAAE,IAAI,UAAU,KAAK,MAAM,IAAI,OAAO,MAAM;AAAA,MACpD,MAAM,KAAK;AAAA,MACX,eAAe,CAAC;AAAA,MAChB,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AACA,SAAK,UAAU,GAAG;AAAA,EACpB;AAAA,EAEQ,cAAc,MAAoB;AACxC,UAAM,KAAK,KAAK,IAAI;AACpB,QAAI,CAAC,IAAI,WAAW,CAAC,GAAG,OAAO,CAAC,GAAG,OAAO;AACxC,WAAK,IAAI,KAAK,yEAAoE;AAClF;AAAA,IACF;AAIA,SAAK,UAAU,IAAI,eAAe,EAAE,QAAQ,CAAC,SAAS,KAAK,aAAa,IAAI,EAAE,CAAC;AAC/E,UAAM,MAAM,GAAG;AACf,SAAK,WAAW,IAAI,SAAS;AAAA,MAC3B;AAAA,MACA,OAAO,GAAG;AAAA,MACV,GAAI,KAAK,IAAI,WAAW,EAAE,UAAU,KAAK,IAAI,SAAS,IAAI,CAAC;AAAA,MAC3D,YAAY,CAAC,OAAO;AAClB,aAAK,IAAI,WAAW;AACpB,wBAAgB,MAAM,EAAE;AACxB,aAAK,IAAI,KAAK,wBAAwB,EAAE,eAAe;AAAA,MACzD;AAAA,MACA,cAAc;AAAA,MACd,MAAM,SAAS;AAAA,MACf,oBAAoB,GAAG;AAAA,MACvB,WAAW,KAAK,IAAI,OAAO;AAAA,MAC3B,cAAc,OAAO;AAAA,QACnB,WAAW,CAAC,OAAO;AAAA,QACnB,UAAU,OAAO,KAAK,KAAK,QAAQ;AAAA,QACnC,KAAK;AAAA,QACL,UAAU,CAAC;AAAA,MACb;AAAA,MACA,YAAY,OAAO,EAAE,aAAa,CAAC,GAAG,OAAO,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,MACnF,cAAc,OAAO;AAAA,QACnB,KAAK,QAAQ,EAAE,CAAC,KAAK;AAAA,QACrB,KAAK,SAAS,IAAI,IAAI,IAAI,QAAQ,IAAI,SAAS,IAAI;AAAA,QACnD,QAAQ,KAAK,MAAM;AAAA,MACrB;AAAA,MACA,gBAAgB,MAAM,KAAK,QAAQ;AAAA,MACnC,gBAAgB,MAAM,KAAK,iBAAiB;AAAA,MAC5C,aAAa,KAAK,cAAc;AAAA,MAChC,OAAO;AAAA,MACP,SAAS,MAAM,gBAAgB,KAAK,GAAG;AAAA,MACvC,KAAK,KAAK;AAAA,IACZ,CAAC;AACD,SAAK,SAAS,MAAM;AACpB,SAAK,IAAI,KAAK,qBAAqB,GAAG,QAAG;AAAA,EAC3C;AAAA,EAEA,MAAM,OAAsB;AAC1B,iBAAa,KAAK,aAAa;AAC/B,UAAM,KAAK,SAAS,MAAM;AAC1B,UAAM,SAAoB,CAAC;AAC3B,SAAK,WAAW,KAAK;AACrB,UAAM,QAAQ,QAAQ,KAAK,UAAU,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,OAAO,KAAK,CAAC,CAAC;AACxE,SAAK,SAAS,KAAK;AACnB,eAAW,KAAK,KAAK,YAAa,OAAM,QAAQ,QAAQ,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,OAAO,KAAK,CAAC,CAAC;AAC7F,eAAW,KAAK,KAAK,MAAM,OAAO,EAAG,OAAM,QAAQ,QAAQ,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,OAAO,KAAK,CAAC,CAAC;AAChG,SAAK,OAAO,MAAM;AAClB,QAAI,OAAO,OAAQ,OAAM,IAAI,eAAe,QAAQ,uBAAuB;AAAA,EAC7E;AACF;;;AsCtbA,SAAS,uBAAuB;AAUzB,SAAS,aAAa,KAA4B;AACvD,SAAO,CAAC,YAAoB,WAAgC;AAC1D,QAAI,OAAO,kBAAkB,yBAAyB,OAAO,QAAQ,SAAS,QAAQ;AACpF,UAAI,MAAM,OAAO,QAAQ,IAAI;AAAA,IAC/B,WAAW,OAAO,kBAAkB,aAAa;AAC/C,YAAM,QAAS,WAAW,UAAU,OAAO,SAAU,OAAO,cAAc;AAC1E,UAAI,MAAM;AAAA,SAAY,KAAK;AAAA,CAAI;AAAA,IACjC;AAAA,EACF;AACF;AAYA,eAAsB,QAAQ,MAAkC;AAC9D,QAAM,MAAM,KAAK,OAAO,QAAQ;AAChC,QAAM,OAAO,YAAY,KAAK,IAAI;AAClC,QAAM,MAAM,WAAW;AAAA,IACrB,MAAM,KAAK;AAAA,IACX,YAAY,KAAK;AAAA,IACjB,UAAU;AAAA,IACV,WAAW,EAAE,WAAW,KAAK,UAAU;AAAA,EACzC,CAAC;AACD,QAAME,SAAQ,YAAY,IAAI,WAAY,KAAK,SAAS;AAExD,QAAM,WAAW,MAAM,gBAAgB,KAAK,MAAM,EAAE,gBAAgB,CAACA,OAAM,OAAO,GAAG,MAAM,cAAc,CAAC;AAC1G,QAAM,UAAU,SAASA,OAAM,OAAO;AACtC,MAAI,CAAC,SAAS;AACZ,UAAM,YAAY,OAAO,KAAK,QAAQ,EAAE,KAAK,EAAE,KAAK,IAAI,KAAK;AAC7D,UAAM,IAAI,MAAM,YAAYA,OAAM,OAAO,2BAA2B,SAAS,EAAE;AAAA,EACjF;AAEA,QAAM,OAAO,IAAI,QAAQ,SAAS,EAAE,UAAU,aAAa,GAAG,GAAG,KAAK,cAAcA,MAAK,EAAE,CAAC;AAC5F,QAAM,KAAK,MAAM;AACjB,MAAI;AACF,UAAM,MAAM,MAAM,iBAAiBA,MAAK;AACxC,UAAM,YAAY,MAAM,KAAK,WAAW,GAAG;AAE3C,UAAM,OAAO,OAAO,SAAiB;AACnC,YAAM,SAAyB,CAAC,EAAE,MAAM,QAAQ,KAAK,CAAC;AACtD,YAAM,KAAK,OAAO,WAAW,MAAM;AACnC,UAAI,MAAM,IAAI;AAAA,IAChB;AAEA,QAAI,OAAO,KAAK,YAAY,YAAY,KAAK,QAAQ,SAAS,GAAG;AAC/D,YAAM,KAAK,KAAK,OAAO;AACvB;AAAA,IACF;AAEA,UAAM,KAAK,gBAAgB,EAAE,OAAO,KAAK,SAAS,QAAQ,MAAM,CAAC;AACjE,QAAI,MAAM,iBAAiBA,OAAM,IAAI,KAAKA,OAAM,EAAE;AAAA,GAA4B;AAC9E,QAAI;AACF,uBAAiB,QAAQ,IAAI;AAC3B,cAAM,OAAO,KAAK,KAAK;AACvB,YAAI,SAAS,WAAW,SAAS,QAAS;AAC1C,YAAI,KAAK,SAAS,EAAG,OAAM,KAAK,IAAI;AACpC,YAAI,MAAM,IAAI;AAAA,MAChB;AAAA,IACF,UAAE;AACA,SAAG,MAAM;AAAA,IACX;AAAA,EACF,UAAE;AACA,UAAM,KAAK,KAAK;AAAA,EAClB;AACF;;;AvCvEA,IAAM,UAAU,OAAyC,UAAqB;AAE9E,IAAM,UAAU,IAAI,QAAQ;AAE5B,QAAQ,KAAK,cAAc,EAAE,YAAY,gEAA2D,EAAE,QAAQ,OAAO;AAIrH,QACG,OAAO,mBAAmB,2DAA2D,EACrF,OAAO,gBAAgB,yCAAyC,EAChE,OAAO,kBAAkB,2BAA2B,EACpD,OAAO,sBAAsB,6BAA6B,EAC1D,OAAO,WAAW,sDAAsD,EACxE,OAAO,oBAAoB,0BAA0B,EACrD,OAAO,uBAAuB,6BAA6B,EAC3D,OAAO,sBAAsB,2BAA2B,EACxD,OAAO,oBAAoB,8CAA8C,EACzE,OAAO,aAAa,gEAAgE,EACpF,OAAO,kBAAkB,wCAAwC;AAEpE,IAAM,OAAO,CAAC,SAAiB,MAAM;AACnC,UAAQ,IAAI,iBAAiB,IAAI,wBAAwB;AAC3D;AAEA,QACG,QAAQ,KAAK,EACb,YAAY,kCAAkC,EAC9C,OAAO,YAAY;AAClB,QAAM,OAAO,QAAQ,KAAK;AAC1B,QAAM,SAAS,IAAI,OAAO;AAAA,IACxB,MAAM,KAAK;AAAA,IACX,WAAW,KAAK;AAAA,IAChB,WAAW;AAAA,MACT,OAAO,KAAK;AAAA,MACZ,SAAS,KAAK;AAAA,MACd,MAAM,KAAK,OAAO;AAAA,MAClB,UAAU,KAAK;AAAA,MACf,UAAU,KAAK;AAAA,MACf,WAAW,KAAK;AAAA,MAChB,WAAW,KAAK,YAAY,OAAO,KAAK,SAAS,IAAI;AAAA,IACvD;AAAA,EACF,CAAC;AACD,MAAI;AACF,UAAM,OAAO,MAAM;AAAA,EACrB,SAAS,KAAK;AACZ,YAAQ,MAAM,qBAAsB,IAAc,OAAO,EAAE;AAC3D,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,WAAW,YAAY;AAC3B,UAAM,OAAO,KAAK;AAClB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,UAAQ,GAAG,UAAU,QAAQ;AAC7B,UAAQ,GAAG,WAAW,QAAQ;AAC9B,UAAQ,IAAI,+CAA+C;AAC7D,CAAC;AACH,QAAQ,QAAQ,OAAO,EAAE,YAAY,+CAA+C,EAAE,OAAO,KAAK,OAAO,CAAC;AAC1G,QAAQ,QAAQ,MAAM,EAAE,YAAY,4BAA4B,EAAE,OAAO,KAAK,MAAM,CAAC;AACrF,QAAQ,QAAQ,SAAS,EAAE,YAAY,oBAAoB,EAAE,OAAO,KAAK,SAAS,CAAC;AACnF,QAAQ,QAAQ,QAAQ,EAAE,YAAY,sBAAsB,EAAE,OAAO,KAAK,QAAQ,CAAC;AACnF,QAAQ,QAAQ,iBAAiB,EAAE,YAAY,mCAAmC,EAAE,OAAO,KAAK,iBAAiB,CAAC;AAClH,QAAQ,QAAQ,mBAAmB,EAAE,YAAY,8BAA8B,EAAE,OAAO,KAAK,mBAAmB,CAAC;AACjH,QAAQ,QAAQ,OAAO,EAAE,YAAY,yCAAyC,EAAE,OAAO,KAAK,OAAO,CAAC;AAEpG,IAAM,SAAS,QAAQ,QAAQ,QAAQ,EAAE,YAAY,qCAAqC;AAC1F,OAAO,QAAQ,KAAK,EAAE,OAAO,KAAK,YAAY,CAAC;AAC/C,OAAO,QAAQ,KAAK,EAAE,OAAO,KAAK,YAAY,CAAC;AAC/C,OAAO,QAAQ,UAAU,EAAE,OAAO,KAAK,iBAAiB,CAAC;AACzD,OAAO,QAAQ,MAAM,EAAE,OAAO,KAAK,aAAa,CAAC;AAEjD,IAAM,QAAQ,QAAQ,QAAQ,OAAO,EAAE,YAAY,gCAAgC;AACnF,MAAM,QAAQ,MAAM,EAAE,OAAO,KAAK,YAAY,CAAC;AAC/C,MAAM,QAAQ,UAAU,EAAE,OAAO,KAAK,WAAW,CAAC;AAClD,MAAM,QAAQ,aAAa,EAAE,OAAO,KAAK,cAAc,CAAC;AACxD,MAAM,QAAQ,aAAa,EAAE,OAAO,KAAK,cAAc,CAAC;AACxD,MAAM,QAAQ,cAAc,EAAE,OAAO,KAAK,eAAe,CAAC;AAE1D,QACG,QAAQ,gBAAgB,EACxB,YAAY,4EAA4E,EACxF,OAAO,OAAO,YAAqB;AAClC,QAAM,OAAO,QAAQ,KAAK;AAC1B,MAAI;AACF,UAAM,QAAQ;AAAA,MACZ,WAAW,KAAK;AAAA,MAChB,WAAW,KAAK;AAAA,MAChB;AAAA,MACA,YAAY,KAAK;AAAA,MACjB,MAAM,KAAK;AAAA,IACb,CAAC;AACD,YAAQ,KAAK,CAAC;AAAA,EAChB,SAAS,KAAK;AACZ,YAAQ,MAAM,sBAAuB,IAAc,OAAO,EAAE;AAC5D,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QAAQ,MAAM;","names":["randomUUID","readFileSync","existsSync","join","resolve","dirname","z","existsSync","readFileSync","join","agent","dirname","agent","readFileSync","join","resolve","existsSync","mkdirSync","dirname","resolve","mkdirSync","existsSync","writeFileSync","join","agent","agent","agent","resolve","z","readFileSync","writeFileSync","existsSync","mkdirSync","dirname","z","existsSync","readFileSync","mkdirSync","dirname","writeFileSync","z","z","z","z","z","z","z","z","z","z","z","z","z","z","frame","frame","resolve","frame","resolve","Cron","randomUUID","agent","agent"]}
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "@agentconnect.md/daemon",
3
+ "version": "0.0.0",
4
+ "description": "AgentConnect daemon — edge message + agent execution unit",
5
+ "license": "Apache-2.0",
6
+ "type": "module",
7
+ "exports": {
8
+ ".": {
9
+ "import": "./dist/index.js",
10
+ "default": "./dist/index.js"
11
+ },
12
+ "./package.json": "./package.json"
13
+ },
14
+ "main": "dist/index.js",
15
+ "bin": {
16
+ "agentconnect": "dist/index.js"
17
+ },
18
+ "files": [
19
+ "dist"
20
+ ],
21
+ "dependencies": {
22
+ "@agentclientprotocol/sdk": "^0.25.0",
23
+ "@slack/bolt": "^4.2.0",
24
+ "better-sqlite3": "^11.8.0",
25
+ "chokidar": "^4.0.3",
26
+ "commander": "^13.0.0",
27
+ "croner": "^9.0.0",
28
+ "simple-git": "^3.27.0",
29
+ "ws": "^8.18.0",
30
+ "zod": "^4.4.3"
31
+ },
32
+ "devDependencies": {
33
+ "@types/better-sqlite3": "^7.6.12",
34
+ "@types/node": "^24.13.2",
35
+ "@types/ws": "^8.5.13",
36
+ "tsup": "^8.5.1",
37
+ "tsx": "^4.19.2",
38
+ "typescript": "^6.0.3",
39
+ "vitest": "^4.1.9",
40
+ "@agentconnect.md/protocol": "0.0.0"
41
+ },
42
+ "keywords": [
43
+ "acp",
44
+ "agentconnect",
45
+ "agents",
46
+ "cli",
47
+ "daemon"
48
+ ],
49
+ "engines": {
50
+ "node": ">=24"
51
+ },
52
+ "publishConfig": {
53
+ "access": "public"
54
+ },
55
+ "scripts": {
56
+ "agent:chat": "tsx src/index.ts --agents-dir ./test/fixtures/sample-agent chat",
57
+ "agent:run": "tsx src/index.ts --agents-dir ./test/fixtures/sample-agent run",
58
+ "build": "tsup",
59
+ "clean": "rm -rf dist",
60
+ "dev": "tsx watch src/index.ts run",
61
+ "start": "node dist/index.js run",
62
+ "test": "vitest run",
63
+ "test:watch": "vitest",
64
+ "typecheck": "tsc -p tsconfig.json --noEmit"
65
+ }
66
+ }