subagent-cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +1647 -0
- package/dist/cli.js.map +1 -0
- package/package.json +49 -0
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/env.ts","../src/config.ts","../src/modes/print.ts","../src/tools/memory.ts","../src/components/theme.ts","../src/components/team-panel.ts","../src/components/tool-panel.ts","../src/components/chat.ts","../src/session.ts","../src/components/status-bar.ts","../src/modes/interactive.ts","../src/components/input.ts","../src/modes/sms.ts","../src/sms/relay-client.ts","../src/main.ts","../src/cli.ts"],"sourcesContent":["import * as fs from \"node:fs\"\nimport * as path from \"node:path\"\n\n/**\n * Load .env files into process.env. No external dependencies.\n *\n * Priority (first found wins per variable):\n * 1. Existing env vars (never overridden)\n * 2. Nearest .env walking up from cwd\n * 3. ~/.sa/.env (global API keys)\n */\nexport function loadEnv(): void {\n const toLoad: string[] = []\n\n // Walk up from cwd looking for nearest .env\n let dir = process.cwd()\n while (true) {\n const envFile = path.join(dir, \".env\")\n if (fs.existsSync(envFile)) {\n toLoad.push(envFile)\n break // Only load the nearest project .env\n }\n const parent = path.dirname(dir)\n if (parent === dir) break\n dir = parent\n }\n\n // Always load global ~/.sa/.env as fallback\n const home = process.env.HOME || process.env.USERPROFILE\n if (home) {\n const globalEnv = path.join(home, \".sa\", \".env\")\n if (fs.existsSync(globalEnv)) {\n toLoad.push(globalEnv)\n }\n }\n\n for (const envFile of toLoad) {\n parseEnvFile(envFile)\n }\n}\n\nfunction parseEnvFile(filePath: string): void {\n const content = fs.readFileSync(filePath, \"utf-8\")\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim()\n if (!trimmed || trimmed.startsWith(\"#\")) continue\n const eqIdx = trimmed.indexOf(\"=\")\n if (eqIdx === -1) continue\n const key = trimmed.slice(0, eqIdx).trim()\n let value = trimmed.slice(eqIdx + 1).trim()\n // Strip quotes\n if ((value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n value = value.slice(1, -1)\n }\n // Don't override existing env vars\n if (!(key in process.env)) {\n process.env[key] = value\n }\n }\n}\n","import * as fs from \"node:fs\"\nimport * as path from \"node:path\"\nimport * as os from \"node:os\"\nimport type { AgentOptions, SubAgentConfig } from \"subagent\"\n\nexport interface CliConfig {\n model?: string\n warpGrep?: boolean\n fastApply?: boolean\n compact?: boolean\n githubSearch?: boolean\n thinkingLevel?: \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\"\n systemPrompt?: string\n subagents?: SubAgentConfig[]\n debug?: boolean\n}\n\nexport interface CliFlags {\n model?: string\n prompt?: string\n resume?: boolean | string\n print?: boolean\n debug?: boolean\n help?: boolean\n version?: boolean\n sessions?: boolean\n thinkingLevel?: string\n sms?: boolean\n}\n\nconst SA_DIR = \".sa\"\nconst CONFIG_NAME = \"config.json\"\nconst GLOBAL_DIR = path.join(os.homedir(), SA_DIR)\n\nconst DEFAULT_MODEL = \"anthropic:claude-sonnet-4-6\"\n\nconst MEMORY_SYSTEM_PROMPT = `\n## Memory\n\nYou have persistent memory via write_memory and read_memory tools.\n\nWhen you learn something useful during a conversation, save it with write_memory so future sessions benefit:\n- User preferences (coding style, tools, workflow)\n- Project conventions (naming, structure, patterns)\n- Solutions to problems (so you don't re-solve them)\n- Corrections the user made (so you don't repeat mistakes)\n\nUse scope \"project\" for project-specific knowledge, \"global\" for cross-project preferences.\nMemory auto-loads into your system prompt on startup.\n`\n\nexport function getProjectDir(): string {\n return path.join(process.cwd(), SA_DIR)\n}\n\nexport function getGlobalDir(): string {\n return GLOBAL_DIR\n}\n\nexport function ensureDir(dir: string): void {\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true })\n }\n}\n\nfunction loadJsonFile(filePath: string): Record<string, any> {\n try {\n if (fs.existsSync(filePath)) {\n return JSON.parse(fs.readFileSync(filePath, \"utf-8\"))\n }\n } catch {\n // Invalid JSON, ignore\n }\n return {}\n}\n\nexport function loadConfig(): CliConfig {\n const global = loadJsonFile(path.join(GLOBAL_DIR, CONFIG_NAME))\n const project = loadJsonFile(path.join(getProjectDir(), CONFIG_NAME))\n return { ...global, ...project } as CliConfig\n}\n\nexport function parseFlags(argv: string[]): CliFlags {\n const flags: CliFlags = {}\n const positional: string[] = []\n\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i]!\n if (arg === \"--help\" || arg === \"-h\") {\n flags.help = true\n } else if (arg === \"--version\" || arg === \"-v\") {\n flags.version = true\n } else if (arg === \"--print\" || arg === \"-p\") {\n flags.print = true\n } else if (arg === \"--debug\") {\n flags.debug = true\n } else if (arg === \"--resume\" || arg === \"-r\") {\n const next = argv[i + 1]\n if (next && !next.startsWith(\"-\")) {\n flags.resume = next\n i++\n } else {\n flags.resume = true\n }\n } else if (arg === \"--model\" || arg === \"-m\") {\n flags.model = argv[++i]\n } else if (arg === \"--thinking\") {\n flags.thinkingLevel = argv[++i]\n } else if (arg === \"--sms\") {\n flags.sms = true\n } else if (arg === \"sessions\") {\n flags.sessions = true\n } else if (!arg.startsWith(\"-\")) {\n positional.push(arg)\n }\n }\n\n if (positional.length > 0) {\n flags.prompt = positional.join(\" \")\n // If prompt is provided as arg, default to print mode\n if (flags.print === undefined) {\n flags.print = true\n }\n }\n\n return flags\n}\n\nexport function resolveModelName(config: CliConfig, flags: CliFlags): string {\n return flags.model ?? config.model ?? DEFAULT_MODEL\n}\n\nexport function configToAgentOptions(config: CliConfig, flags: CliFlags): AgentOptions {\n const memoryPaths: string[] = []\n\n // Auto-discover .sa/memory.md files\n const projectMemory = path.join(getProjectDir(), \"memory.md\")\n if (fs.existsSync(projectMemory)) {\n memoryPaths.push(projectMemory)\n }\n const globalMemory = path.join(GLOBAL_DIR, \"memory.md\")\n if (fs.existsSync(globalMemory)) {\n memoryPaths.push(globalMemory)\n }\n\n // Build system prompt with memory instructions\n let systemPrompt = MEMORY_SYSTEM_PROMPT\n if (config.systemPrompt) {\n systemPrompt = config.systemPrompt + \"\\n\" + systemPrompt\n }\n\n return {\n model: flags.model ?? config.model,\n systemPrompt,\n warpGrep: config.warpGrep ?? true,\n fastApply: config.fastApply ?? true,\n compact: config.compact ?? false,\n githubSearch: config.githubSearch ?? true,\n thinkingLevel: (flags.thinkingLevel ?? config.thinkingLevel ?? \"medium\") as any,\n subagents: config.subagents,\n memory: memoryPaths.length > 0 ? memoryPaths : undefined,\n debug: flags.debug ?? config.debug,\n }\n}\n","import { createAgent, type SubAgent, type AgentOptions } from \"subagent\"\nimport type { AgentEvent } from \"subagent\"\nimport { writeMemoryTool, readMemoryTool } from \"../tools/memory.js\"\nimport { toolStart, toolEnd, clearLiveRender } from \"../components/tool-panel.js\"\nimport { writeTextDelta, writeThinkingDelta, endThinking, endAssistantMessage, writeError } from \"../components/chat.js\"\nimport { generateSessionId, appendEvent } from \"../session.js\"\nimport { renderStatusBar } from \"../components/status-bar.js\"\nimport { renderAgentSummary } from \"../components/team-panel.js\"\nimport { theme, styled } from \"../components/theme.js\"\n\nexport async function runPrintMode(prompt: string, agentOptions: AgentOptions, modelName: string): Promise<void> {\n const sessionId = generateSessionId()\n\n // Add memory tools\n const tools = [...(agentOptions.tools ?? []), writeMemoryTool as any, readMemoryTool as any]\n\n let agent: SubAgent\n try {\n agent = await createAgent({ ...agentOptions, tools })\n } catch (err: any) {\n writeError(err.message ?? String(err))\n process.exit(1)\n }\n\n // Track usage\n let totalTokens = 0\n let totalCost = 0\n let isInText = false\n let isInThinking = false\n let assistantText = \"\"\n\n // Session logging\n appendEvent(sessionId, { type: \"user\", content: prompt, timestamp: Date.now() })\n\n // Subscribe to events\n agent.subscribe((event: AgentEvent) => {\n switch (event.type) {\n case \"message_update\": {\n const e = event.assistantMessageEvent\n if (e.type === \"text_delta\") {\n if (isInThinking) {\n isInThinking = false\n endThinking()\n }\n if (!isInText) {\n clearLiveRender()\n }\n isInText = true\n writeTextDelta(e.delta)\n assistantText += e.delta\n } else if (e.type === \"thinking_delta\") {\n isInThinking = true\n writeThinkingDelta(e.delta)\n } else if (e.type === \"thinking_end\") {\n if (isInThinking) {\n isInThinking = false\n endThinking()\n }\n } else if (e.type === \"error\") {\n const errMsg = (e as any).error?.errorMessage ?? \"Unknown streaming error\"\n writeError(errMsg)\n }\n break\n }\n\n case \"message_end\": {\n // Detect API errors in the completed message\n const msg = event.message as any\n if (msg?.role === \"assistant\" && msg?.stopReason === \"error\") {\n const errMsg = msg.errorMessage ?? \"API error (no details)\"\n writeError(errMsg)\n }\n break\n }\n\n case \"turn_end\": {\n if (isInText) {\n endAssistantMessage()\n isInText = false\n }\n // Extract usage from the message\n const msg = event.message as any\n if (msg?.usage) {\n totalTokens += msg.usage.totalTokens ?? 0\n totalCost += msg.usage.cost?.total ?? 0\n }\n // Log assistant text\n if (assistantText) {\n appendEvent(sessionId, { type: \"assistant\", content: assistantText, timestamp: Date.now() })\n assistantText = \"\"\n }\n break\n }\n\n case \"tool_execution_start\": {\n toolStart(event.toolCallId, event.toolName, event.args)\n appendEvent(sessionId, {\n type: \"tool_call\",\n name: event.toolName,\n args: event.args,\n timestamp: Date.now(),\n })\n break\n }\n\n case \"tool_execution_end\": {\n toolEnd(event.toolCallId, event.result, event.isError)\n const resultText = extractResultText(event.result)\n appendEvent(sessionId, {\n type: \"tool_result\",\n name: event.toolName,\n result: resultText.slice(0, 500),\n isError: event.isError,\n timestamp: Date.now(),\n })\n break\n }\n\n case \"agent_end\": {\n const bar = renderStatusBar({\n model: modelName,\n totalTokens,\n totalCost,\n sessionId,\n isStreaming: false,\n })\n process.stderr.write(`\\n${bar}\\n`)\n // Show per-agent stats\n const agentSummary = renderAgentSummary()\n if (agentSummary) {\n process.stderr.write(`${agentSummary}\\n`)\n }\n break\n }\n }\n })\n\n // Run\n try {\n await agent.prompt(prompt)\n await agent.waitForIdle()\n } catch (err: any) {\n if (err.name === \"AbortError\") {\n process.stderr.write(`\\n${styled(theme.dim, \"(aborted)\")}\\n`)\n } else {\n writeError(err.message ?? String(err))\n }\n } finally {\n agent.destroy()\n }\n}\n\nfunction extractResultText(result: any): string {\n if (!result) return \"\"\n if (typeof result === \"string\") return result\n if (result.content && Array.isArray(result.content)) {\n return result.content\n .filter((c: any) => c.type === \"text\")\n .map((c: any) => c.text)\n .join(\"\\n\")\n }\n return JSON.stringify(result).slice(0, 500)\n}\n","import * as fs from \"node:fs\"\nimport * as path from \"node:path\"\nimport { Type } from \"@sinclair/typebox\"\nimport { getProjectDir, getGlobalDir, ensureDir } from \"../config.js\"\n\n// Type imports only — we construct the tool objects to match AgentTool shape\ntype AgentToolLike = {\n name: string\n label: string\n description: string\n parameters: any\n execute: (toolCallId: string, params: any) => Promise<{ content: { type: \"text\"; text: string }[]; details: Record<string, never> }>\n}\n\nconst MAX_MEMORY_SIZE = 8 * 1024 // 8KB\n\nfunction textResult(text: string) {\n return { content: [{ type: \"text\" as const, text }], details: {} }\n}\n\nfunction getMemoryPath(scope: string): string {\n const dir = scope === \"global\" ? getGlobalDir() : getProjectDir()\n ensureDir(dir)\n return path.join(dir, \"memory.md\")\n}\n\nfunction readMemoryFile(filePath: string): string {\n try {\n if (fs.existsSync(filePath)) {\n return fs.readFileSync(filePath, \"utf-8\")\n }\n } catch {\n // ignore\n }\n return \"\"\n}\n\nexport const writeMemoryTool: AgentToolLike = {\n name: \"write_memory\",\n label: \"Write Memory\",\n description: `Save a learning, pattern, or preference to persistent memory so future sessions benefit.\n\nUse this when you discover:\n- User preferences (coding style, tools, workflow)\n- Project conventions (naming, structure, patterns)\n- Solutions to problems you solved (so you don't re-solve them)\n- Corrections the user made (so you don't repeat mistakes)\n\nScope \"project\" saves to .sa/memory.md (this project only).\nScope \"global\" saves to ~/.sa/memory.md (all projects).`,\n parameters: Type.Object({\n key: Type.String({ description: \"Short identifier for this memory entry (e.g., 'test-command', 'prefer-bun')\" }),\n content: Type.String({ description: \"The memory content to save. Be concise but complete.\" }),\n scope: Type.Union([Type.Literal(\"project\"), Type.Literal(\"global\")], {\n description: \"Where to save: 'project' for project-specific, 'global' for cross-project\",\n default: \"project\",\n }),\n }),\n execute: async (_toolCallId: string, params: { key: string; content: string; scope: string }) => {\n const { key, content, scope } = params\n const memoryPath = getMemoryPath(scope)\n let existing = readMemoryFile(memoryPath)\n\n // Check if key already exists — update in place\n const keyHeader = `## ${key}`\n const keyRegex = new RegExp(`## ${escapeRegex(key)}\\\\n[\\\\s\\\\S]*?(?=\\\\n## |$)`, \"m\")\n\n const newEntry = `## ${key}\\n${content}\\n`\n\n if (existing.match(keyRegex)) {\n existing = existing.replace(keyRegex, newEntry.trim())\n } else {\n existing = existing.trim() + (existing.trim() ? \"\\n\\n\" : \"\") + newEntry\n }\n\n // Enforce max size\n if (Buffer.byteLength(existing, \"utf-8\") > MAX_MEMORY_SIZE) {\n return textResult(`Memory file would exceed ${MAX_MEMORY_SIZE / 1024}KB limit. Remove old entries first with write_memory using a shorter content, or use read_memory to see what's stored.`)\n }\n\n fs.writeFileSync(memoryPath, existing.trim() + \"\\n\", \"utf-8\")\n return textResult(`Saved \"${key}\" to ${scope} memory (${memoryPath})`)\n },\n}\n\nexport const readMemoryTool: AgentToolLike = {\n name: \"read_memory\",\n label: \"Read Memory\",\n description: \"Read your persistent memory files to recall learnings from previous sessions.\",\n parameters: Type.Object({\n scope: Type.Optional(\n Type.Union([Type.Literal(\"project\"), Type.Literal(\"global\"), Type.Literal(\"all\")], {\n description: \"Which memory to read. Default: 'all'\",\n default: \"all\",\n }),\n ),\n }),\n execute: async (_toolCallId: string, params: { scope?: string }) => {\n const scope = params.scope ?? \"all\"\n const sections: string[] = []\n\n if (scope === \"project\" || scope === \"all\") {\n const projectPath = path.join(getProjectDir(), \"memory.md\")\n const content = readMemoryFile(projectPath)\n if (content.trim()) {\n sections.push(`# Project Memory (.sa/memory.md)\\n\\n${content.trim()}`)\n } else {\n sections.push(\"# Project Memory\\n\\n(empty)\")\n }\n }\n\n if (scope === \"global\" || scope === \"all\") {\n const globalPath = path.join(getGlobalDir(), \"memory.md\")\n const content = readMemoryFile(globalPath)\n if (content.trim()) {\n sections.push(`# Global Memory (~/.sa/memory.md)\\n\\n${content.trim()}`)\n } else {\n sections.push(\"# Global Memory\\n\\n(empty)\")\n }\n }\n\n return textResult(sections.join(\"\\n\\n---\\n\\n\"))\n },\n}\n\nfunction escapeRegex(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n}\n","// ANSI color helpers — zero dependencies, works in any terminal\n// We use muted, professional colors. No rainbow unicorns.\n\nconst ESC = \"\\x1b[\"\n\nexport const color = {\n reset: `${ESC}0m`,\n bold: `${ESC}1m`,\n dim: `${ESC}2m`,\n italic: `${ESC}3m`,\n underline: `${ESC}4m`,\n\n // Foreground\n black: `${ESC}30m`,\n red: `${ESC}31m`,\n green: `${ESC}32m`,\n yellow: `${ESC}33m`,\n blue: `${ESC}34m`,\n magenta: `${ESC}35m`,\n cyan: `${ESC}36m`,\n white: `${ESC}37m`,\n\n // Bright foreground\n gray: `${ESC}90m`,\n brightRed: `${ESC}91m`,\n brightGreen: `${ESC}92m`,\n brightYellow: `${ESC}93m`,\n brightBlue: `${ESC}94m`,\n brightMagenta: `${ESC}95m`,\n brightCyan: `${ESC}96m`,\n brightWhite: `${ESC}97m`,\n\n // 256-color (for subtle tones)\n fg256: (n: number) => `${ESC}38;5;${n}m`,\n bg256: (n: number) => `${ESC}48;5;${n}m`,\n}\n\n// Semantic colors\nexport const theme = {\n agent: color.brightCyan,\n user: color.brightWhite,\n tool: color.yellow,\n toolResult: color.dim,\n error: color.red,\n success: color.green,\n thinking: color.gray,\n dim: color.dim,\n accent: color.blue,\n label: color.gray,\n reset: color.reset,\n bold: color.bold,\n}\n\nexport function styled(style: string, text: string): string {\n return `${style}${text}${color.reset}`\n}\n\n// Box drawing characters\nexport const box = {\n topLeft: \"╭\",\n topRight: \"╮\",\n bottomLeft: \"╰\",\n bottomRight: \"╯\",\n horizontal: \"─\",\n vertical: \"│\",\n teeRight: \"├\",\n teeLeft: \"┤\",\n dot: \"●\",\n arrow: \"→\",\n spinner: [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"],\n}\n","import { theme, styled, box, color } from \"./theme.js\"\nimport type { TeamRuntime } from \"subagent\"\n\n// ── Color Assignment ──────────────────────────────────────────────\n\nconst TEAMMATE_COLORS = [\n color.brightCyan,\n color.brightMagenta,\n color.brightYellow,\n color.brightGreen,\n color.brightBlue,\n color.brightRed,\n color.cyan,\n color.magenta,\n color.yellow,\n color.green,\n]\n\nconst colorAssignments = new Map<string, string>()\nlet nextColorIndex = 0\n\nexport function getTeammateColor(name: string): string {\n let assigned = colorAssignments.get(name)\n if (!assigned) {\n assigned = TEAMMATE_COLORS[nextColorIndex % TEAMMATE_COLORS.length]!\n colorAssignments.set(name, assigned)\n nextColorIndex++\n }\n return assigned\n}\n\n// ── Task Tracking ─────────────────────────────────────────────────\n\ninterface TrackedTask {\n toolCallId: string\n agentName: string\n prompt: string\n startTime: number\n}\n\ninterface AgentStats {\n taskCount: number\n totalTimeMs: number\n}\n\nconst activeTasks = new Map<string, TrackedTask>()\nconst agentStats = new Map<string, AgentStats>()\n\nexport function trackTaskStart(toolCallId: string, agentName: string, prompt: string): void {\n activeTasks.set(toolCallId, { toolCallId, agentName, prompt, startTime: Date.now() })\n}\n\nexport function trackTaskEnd(toolCallId: string): { agentName: string; elapsed: number } | null {\n const task = activeTasks.get(toolCallId)\n if (!task) return null\n activeTasks.delete(toolCallId)\n\n const elapsed = Date.now() - task.startTime\n\n const existing = agentStats.get(task.agentName)\n if (existing) {\n existing.taskCount++\n existing.totalTimeMs += elapsed\n } else {\n agentStats.set(task.agentName, { taskCount: 1, totalTimeMs: elapsed })\n }\n\n return { agentName: task.agentName, elapsed }\n}\n\nexport function hasActiveTasks(): boolean {\n return activeTasks.size > 0\n}\n\n// ── Message Tracking ──────────────────────────────────────────────\n\ninterface TrackedMessage {\n toolCallId: string\n to: string\n text: string\n startTime: number\n}\n\nconst activeMessages = new Map<string, TrackedMessage>()\n\nexport function trackMessageStart(toolCallId: string, to: string, text: string): void {\n activeMessages.set(toolCallId, { toolCallId, to, text, startTime: Date.now() })\n}\n\nexport function trackMessageEnd(toolCallId: string, delivered: boolean): {\n to: string; text: string; elapsed: number; delivered: boolean\n} | null {\n const msg = activeMessages.get(toolCallId)\n if (!msg) return null\n activeMessages.delete(toolCallId)\n return { to: msg.to, text: msg.text, elapsed: Date.now() - msg.startTime, delivered }\n}\n\n// ── Rendering: Task Completion ────────────────────────────────────\n\nexport function renderTaskCompletion(agentName: string, elapsed: number, isError: boolean): string {\n const c = getTeammateColor(agentName)\n const timeStr = formatTime(elapsed)\n const status = isError\n ? styled(theme.error, \"✗\")\n : styled(theme.success, \"✓\")\n return ` ${status} ${styled(c, agentName)} ${styled(theme.dim, isError ? \"failed\" : \"done\")} ${styled(theme.dim, timeStr)}`\n}\n\n// ── Rendering: Message Flow (#1 + #3 combined) ───────────────────\n\nexport function renderMessageFlow(to: string, text: string, delivered: boolean, elapsed: number): string {\n const toColor = getTeammateColor(to)\n const summary = text.length > 50 ? text.slice(0, 47) + \"...\" : text\n const arrow = `${styled(theme.dim, \"──\")}${styled(toColor, \"→\")}`\n const status = delivered\n ? styled(theme.success, \"✓\")\n : styled(theme.error, \"✗\")\n const timeStr = formatTime(elapsed)\n return ` ✉ ${styled(theme.dim, \"agent\")} ${arrow} ${styled(toColor, to)} ${styled(theme.dim, `\"${summary}\"`)} ${status} ${styled(theme.dim, timeStr)}`\n}\n\nexport function renderInboxBadge(to: string): string {\n const toColor = getTeammateColor(to)\n return ` 📬 ${styled(toColor, to)} ${styled(theme.dim, \"new message received\")}`\n}\n\n// ── Rendering: Task Graph / Activity Panel (#2 + #5) ─────────────\n\nexport function renderTaskGraph(spinnerFrame: number): string[] {\n if (activeTasks.size === 0) return []\n\n const tasks = Array.from(activeTasks.values())\n const lines: string[] = []\n\n for (let i = 0; i < tasks.length; i++) {\n const t = tasks[i]!\n const c = getTeammateColor(t.agentName)\n const elapsed = Date.now() - t.startTime\n const timeStr = formatTime(elapsed)\n const spinnerChar = styled(c, box.spinner[spinnerFrame % box.spinner.length]!)\n const prompt = t.prompt.length > 40 ? t.prompt.slice(0, 37) + \"...\" : t.prompt\n const connector = i === tasks.length - 1 ? \"└─\" : \"├─\"\n const name = t.agentName.padEnd(14)\n\n lines.push(\n ` ${styled(theme.dim, connector)} ${spinnerChar} ${styled(c, name)} ${styled(theme.dim, `\"${prompt}\"`)} ${styled(theme.dim, timeStr)}`\n )\n }\n\n return lines\n}\n\n// ── Rendering: Per-Agent Summary (#4) ─────────────────────────────\n\nexport function renderAgentSummary(): string {\n if (agentStats.size === 0) return \"\"\n\n const entries = Array.from(agentStats.entries())\n .sort((a, b) => b[1].totalTimeMs - a[1].totalTimeMs)\n\n const lines: string[] = []\n lines.push(` ${styled(theme.dim, `┌ agents ${\"─\".repeat(37)}┐`)}`)\n\n for (const [name, stats] of entries) {\n const c = getTeammateColor(name)\n const taskLabel = stats.taskCount === 1 ? \"1 task\" : `${stats.taskCount} tasks`\n const timeStr = formatTime(stats.totalTimeMs)\n lines.push(\n ` ${styled(theme.dim, \"│\")} ${styled(c, box.dot)} ${styled(c, name.padEnd(14))} ${styled(theme.dim, taskLabel.padEnd(10))} ${styled(theme.dim, timeStr.padStart(7))} ${styled(theme.dim, \"│\")}`\n )\n }\n\n lines.push(` ${styled(theme.dim, `└${\"─\".repeat(44)}┘`)}`)\n\n return lines.join(\"\\n\")\n}\n\n// ── Rendering: Team Status (for /status) ──────────────────────────\n\nexport function renderTeamStatus(team: TeamRuntime | null): string {\n if (!team) return \"\"\n\n const lines: string[] = []\n lines.push(styled(theme.label, ` team: ${team.name}`))\n\n for (const [name, handle] of team.teammates) {\n const c = getTeammateColor(name)\n const status = handle.abortController.signal.aborted\n ? styled(theme.dim, \"done\")\n : styled(color.green, \"active\")\n lines.push(` ${styled(c, box.dot)} ${styled(c, name)} ${status}`)\n }\n\n return lines.join(\"\\n\")\n}\n\n// ── Helpers ───────────────────────────────────────────────────────\n\nfunction formatTime(ms: number): string {\n if (ms >= 60_000) return `${(ms / 60_000).toFixed(1)}m`\n if (ms >= 1000) return `${(ms / 1000).toFixed(1)}s`\n return `${ms}ms`\n}\n","import { theme, styled, box, color } from \"./theme.js\"\nimport {\n getTeammateColor,\n hasActiveTasks, renderTaskGraph,\n trackTaskStart, trackTaskEnd, renderTaskCompletion,\n trackMessageStart, trackMessageEnd, renderMessageFlow, renderInboxBadge,\n} from \"./team-panel.js\"\n\n// ── Types ─────────────────────────────────────────────────────────\n\ninterface ActiveTool {\n toolCallId: string\n name: string\n args: any\n startTime: number\n}\n\nconst TEAM_TOOLS = new Set([\"task\", \"send_message\"])\nconst activeTools = new Map<string, ActiveTool>()\nlet spinnerFrame = 0\n\n// ── Multi-line Live Render ────────────────────────────────────────\n// Tracks how many lines the spinner rendered so we can clear them\n// before writing any new output (tool completions, text, etc.)\n\nlet renderedLineCount = 0\n\nexport function clearLiveRender(): void {\n if (renderedLineCount <= 0) return\n let seq = \"\"\n for (let i = 0; i < renderedLineCount; i++) {\n seq += \"\\x1b[2K\" // Erase line\n if (i < renderedLineCount - 1) {\n seq += \"\\x1b[A\" // Move up\n }\n }\n seq += \"\\r\"\n process.stderr.write(seq)\n renderedLineCount = 0\n}\n\nfunction writeLiveLines(lines: string[]): void {\n clearLiveRender()\n if (lines.length === 0) return\n process.stderr.write(lines.join(\"\\n\") + \"\\r\")\n renderedLineCount = lines.length\n}\n\n// ── Tool Start ────────────────────────────────────────────────────\n\nexport function toolStart(toolCallId: string, name: string, args: any): void {\n activeTools.set(toolCallId, { toolCallId, name, args, startTime: Date.now() })\n\n // Track team tools in team-panel\n if (name === \"task\" && args?.agent) {\n trackTaskStart(toolCallId, args.agent, args.prompt ?? \"\")\n } else if (name === \"send_message\" && args?.to) {\n trackMessageStart(toolCallId, args.to, args.text ?? \"\")\n }\n}\n\n// ── Tool End ──────────────────────────────────────────────────────\n\nexport function toolEnd(toolCallId: string, _result: any, isError: boolean): void {\n const tool = activeTools.get(toolCallId)\n activeTools.delete(toolCallId)\n if (!tool) return\n\n clearLiveRender()\n\n // Team tools get special rendering\n if (tool.name === \"task\") {\n const tracked = trackTaskEnd(toolCallId)\n if (tracked) {\n process.stderr.write(renderTaskCompletion(tracked.agentName, tracked.elapsed, isError) + \"\\n\")\n }\n return\n }\n\n if (tool.name === \"send_message\") {\n const tracked = trackMessageEnd(toolCallId, !isError)\n if (tracked) {\n process.stderr.write(renderMessageFlow(tracked.to, tracked.text, tracked.delivered, tracked.elapsed) + \"\\n\")\n if (tracked.delivered) {\n process.stderr.write(renderInboxBadge(tracked.to) + \"\\n\")\n }\n }\n return\n }\n\n // Regular tool completion\n const elapsed = Date.now() - tool.startTime\n const timeStr = formatTime(elapsed)\n const status = isError\n ? styled(theme.error, \"✗\")\n : styled(theme.success, \"✓\")\n const label = formatToolLabel(tool.name, tool.args)\n const nameColor = getToolNameColor(tool.name, tool.args)\n process.stderr.write(` ${status} ${styled(nameColor, tool.name)} ${styled(theme.dim, label)} ${styled(theme.dim, timeStr)}\\n`)\n}\n\n// ── Live Panel (spinner replacement) ──────────────────────────────\n// Called on interval — renders task graph + active non-team tools\n\nexport function updateLivePanel(): void {\n spinnerFrame = (spinnerFrame + 1) % box.spinner.length\n const lines: string[] = []\n\n // Task graph (team agents running)\n if (hasActiveTasks()) {\n lines.push(...renderTaskGraph(spinnerFrame))\n }\n\n // Non-team active tools\n const nonTeamTools = Array.from(activeTools.values()).filter((t) => !TEAM_TOOLS.has(t.name))\n for (const t of nonTeamTools) {\n const elapsed = Date.now() - t.startTime\n const timeStr = formatTime(elapsed)\n const label = formatToolLabel(t.name, t.args)\n const spinnerColor = getToolNameColor(t.name, t.args)\n const spinner = styled(spinnerColor, box.spinner[spinnerFrame]!)\n lines.push(` ${spinner} ${styled(spinnerColor, t.name)} ${styled(theme.dim, label)} ${styled(theme.dim, timeStr)}`)\n }\n\n writeLiveLines(lines)\n}\n\nexport function hasActiveWork(): boolean {\n return activeTools.size > 0\n}\n\n// ── Helpers ───────────────────────────────────────────────────────\n\nfunction getToolNameColor(name: string, args: any): string {\n if (name === \"task\" && args?.agent) return getTeammateColor(args.agent)\n if (name === \"send_message\" && args?.to) return getTeammateColor(args.to)\n return theme.tool\n}\n\nfunction formatToolLabel(name: string, args: any): string {\n if (!args) return \"\"\n\n switch (name) {\n case \"read_file\":\n return truncate(args.path ?? args.file_path ?? \"\", 50)\n case \"write_file\":\n return truncate(args.path ?? args.file_path ?? \"\", 50)\n case \"edit_file\":\n return truncate(args.path ?? args.file_path ?? \"\", 50)\n case \"execute\":\n return truncate(args.command ?? \"\", 60)\n case \"glob\":\n return truncate(args.pattern ?? \"\", 50)\n case \"grep\":\n return truncate(`\"${args.pattern ?? \"\"}\" ${args.path ?? \"\"}`, 60)\n case \"ls\":\n return truncate(args.path ?? \"\", 50)\n case \"warp_grep\":\n return truncate(`\"${args.query ?? \"\"}\"`, 50)\n case \"fast_apply\":\n return truncate(args.file_path ?? args.path ?? \"\", 50)\n case \"write_memory\":\n return truncate(`${args.scope ?? \"project\"}:${args.key ?? \"\"}`, 40)\n default:\n for (const v of Object.values(args)) {\n if (typeof v === \"string\" && v.length > 0) {\n return truncate(v, 50)\n }\n }\n return \"\"\n }\n}\n\nfunction truncate(s: string, max: number): string {\n if (s.length <= max) return s\n return s.slice(0, max - 1) + \"…\"\n}\n\nfunction formatTime(ms: number): string {\n if (ms >= 60_000) return `${(ms / 60_000).toFixed(1)}m`\n if (ms >= 1000) return `${(ms / 1000).toFixed(1)}s`\n return `${ms}ms`\n}\n","import { theme, styled, color } from \"./theme.js\"\n\n/** Write assistant text delta to stdout. No framing, just stream the text. */\nexport function writeTextDelta(delta: string): void {\n process.stdout.write(delta)\n}\n\n/** Write a thinking delta (dimmed) */\nexport function writeThinkingDelta(delta: string): void {\n process.stderr.write(styled(theme.thinking, delta))\n}\n\n/** End thinking block */\nexport function endThinking(): void {\n process.stderr.write(color.reset + \"\\n\")\n}\n\n/** Write a full assistant message */\nexport function writeAssistantMessage(text: string): void {\n process.stdout.write(text)\n}\n\n/** End the current assistant message with a newline */\nexport function endAssistantMessage(): void {\n process.stdout.write(\"\\n\")\n}\n\n/** Write a user prompt echo (for interactive mode) */\nexport function writeUserPrompt(text: string): void {\n process.stderr.write(`\\n${styled(color.brightWhite + color.bold, \"> \")}${styled(color.brightWhite, text)}\\n\\n`)\n}\n\n/** Write an error message */\nexport function writeError(message: string): void {\n process.stderr.write(`${styled(theme.error, \"error\")}: ${message}\\n`)\n}\n\n/** Write a system/info message */\nexport function writeInfo(message: string): void {\n process.stderr.write(`${styled(theme.dim, message)}\\n`)\n}\n\n/** Write the welcome banner (compact, informative) */\nexport function writeBanner(model: string, sessionId: string): void {\n process.stderr.write(\n `${styled(theme.accent, \"sa\")} ${styled(theme.dim, model)} ${styled(theme.dim, `session:${sessionId}`)}\\n` +\n `${styled(theme.dim, \"Type a message to start. Ctrl+C to exit. /help for commands.\")}\\n\\n`,\n )\n}\n","import * as fs from \"node:fs\"\nimport * as path from \"node:path\"\nimport { getProjectDir, ensureDir } from \"./config.js\"\n\nexport interface SessionEvent {\n type: \"user\" | \"assistant\" | \"tool_call\" | \"tool_result\" | \"system\"\n content?: string\n name?: string\n args?: Record<string, any>\n result?: string\n isError?: boolean\n timestamp: number\n}\n\nexport interface SessionInfo {\n id: string\n created: number\n lastActive: number\n lines: number\n preview: string\n}\n\nfunction getSessionsDir(): string {\n const dir = path.join(getProjectDir(), \"sessions\")\n ensureDir(dir)\n return dir\n}\n\nexport function generateSessionId(): string {\n const now = new Date()\n const date = now.toISOString().slice(0, 10) // YYYY-MM-DD\n const time = now.toISOString().slice(11, 19).replace(/:/g, \"\") // HHMMSS\n const rand = Math.random().toString(36).slice(2, 6)\n return `${date}_${time}_${rand}`\n}\n\nexport function appendEvent(sessionId: string, event: SessionEvent): void {\n const sessionsDir = getSessionsDir()\n const filePath = path.join(sessionsDir, `${sessionId}.jsonl`)\n fs.appendFileSync(filePath, JSON.stringify(event) + \"\\n\", \"utf-8\")\n}\n\nexport function loadSession(sessionId: string): SessionEvent[] {\n const filePath = path.join(getSessionsDir(), `${sessionId}.jsonl`)\n if (!fs.existsSync(filePath)) return []\n\n return fs\n .readFileSync(filePath, \"utf-8\")\n .trim()\n .split(\"\\n\")\n .filter(Boolean)\n .map((line) => JSON.parse(line))\n}\n\nexport function listSessions(): SessionInfo[] {\n const dir = getSessionsDir()\n if (!fs.existsSync(dir)) return []\n\n return fs\n .readdirSync(dir)\n .filter((f) => f.endsWith(\".jsonl\"))\n .map((f) => {\n const filePath = path.join(dir, f)\n const stat = fs.statSync(filePath)\n const content = fs.readFileSync(filePath, \"utf-8\").trim()\n const lines = content.split(\"\\n\").filter(Boolean)\n const firstUser = lines.find((l) => {\n try {\n return JSON.parse(l).type === \"user\"\n } catch {\n return false\n }\n })\n let preview = \"(empty)\"\n if (firstUser) {\n try {\n const parsed = JSON.parse(firstUser)\n preview = (parsed.content ?? \"\").slice(0, 80)\n if ((parsed.content ?? \"\").length > 80) preview += \"...\"\n } catch {\n // ignore\n }\n }\n\n return {\n id: f.replace(\".jsonl\", \"\"),\n created: stat.birthtimeMs,\n lastActive: stat.mtimeMs,\n lines: lines.length,\n preview,\n }\n })\n .sort((a, b) => b.lastActive - a.lastActive)\n}\n\nexport function getLatestSessionId(): string | null {\n const sessions = listSessions()\n return sessions.length > 0 ? sessions[0]!.id : null\n}\n\nexport function formatSessionList(sessions: SessionInfo[]): string {\n if (sessions.length === 0) return \"No sessions found.\"\n\n const lines = sessions.map((s) => {\n const age = formatAge(Date.now() - s.lastActive)\n return ` ${s.id} ${age} ago (${s.lines} events) ${s.preview}`\n })\n\n return `Sessions:\\n${lines.join(\"\\n\")}`\n}\n\nfunction formatAge(ms: number): string {\n const mins = Math.floor(ms / 60000)\n if (mins < 60) return `${mins}m`\n const hours = Math.floor(mins / 60)\n if (hours < 24) return `${hours}h`\n const days = Math.floor(hours / 24)\n return `${days}d`\n}\n","import { theme, styled, color } from \"./theme.js\"\n\nexport interface StatusBarState {\n model: string\n totalTokens: number\n totalCost: number\n sessionId: string\n isStreaming: boolean\n}\n\nexport function renderStatusBar(state: StatusBarState): string {\n const cols = process.stdout.columns || 80\n\n const model = styled(theme.accent, state.model)\n const tokens = state.totalTokens > 0\n ? styled(theme.dim, ` ${formatTokens(state.totalTokens)} tokens`)\n : \"\"\n const cost = state.totalCost > 0\n ? styled(theme.dim, ` $${state.totalCost.toFixed(4)}`)\n : \"\"\n const streaming = state.isStreaming\n ? styled(color.yellow, \" ●\")\n : styled(color.green, \" ●\")\n\n return `${streaming} ${model}${tokens}${cost}`\n}\n\nfunction formatTokens(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`\n return `${n}`\n}\n","import { createAgent, type SubAgent, type AgentOptions } from \"subagent\"\nimport type { AgentEvent } from \"subagent\"\nimport { writeMemoryTool, readMemoryTool } from \"../tools/memory.js\"\nimport { toolStart, toolEnd, hasActiveWork, updateLivePanel, clearLiveRender } from \"../components/tool-panel.js\"\nimport {\n writeTextDelta, writeThinkingDelta, endThinking, endAssistantMessage,\n writeUserPrompt, writeError, writeInfo, writeBanner,\n} from \"../components/chat.js\"\nimport { renderStatusBar } from \"../components/status-bar.js\"\nimport { renderTeamStatus, renderAgentSummary } from \"../components/team-panel.js\"\nimport { createInput, pauseInput } from \"../components/input.js\"\nimport {\n generateSessionId, appendEvent, listSessions, formatSessionList,\n loadSession, type SessionEvent,\n} from \"../session.js\"\nimport { theme, styled, color } from \"../components/theme.js\"\n\nexport async function runInteractiveMode(agentOptions: AgentOptions, modelName: string, resumeSessionId?: string): Promise<void> {\n const sessionId = resumeSessionId ?? generateSessionId()\n const model = modelName\n\n // Add memory tools\n const tools = [...(agentOptions.tools ?? []), writeMemoryTool as any, readMemoryTool as any]\n\n let agent: SubAgent\n try {\n agent = await createAgent({ ...agentOptions, tools })\n } catch (err: any) {\n writeError(err.message ?? String(err))\n process.exit(1)\n }\n\n // Track state\n let totalTokens = 0\n let totalCost = 0\n let isInText = false\n let isInThinking = false\n let isWorking = false\n let assistantText = \"\"\n let spinnerInterval: ReturnType<typeof setInterval> | null = null\n\n // If resuming, replay session messages into agent\n if (resumeSessionId) {\n const events = loadSession(resumeSessionId)\n if (events.length > 0) {\n writeInfo(`Resuming session ${resumeSessionId} (${events.length} events)`)\n for (const event of events) {\n if (event.type === \"user\" && event.content) {\n agent.followUp({\n role: \"user\",\n content: [{ type: \"text\", text: event.content }],\n timestamp: event.timestamp,\n })\n }\n }\n }\n }\n\n writeBanner(model, sessionId)\n\n // Subscribe to events\n agent.subscribe((event: AgentEvent) => {\n switch (event.type) {\n case \"message_update\": {\n const e = event.assistantMessageEvent\n if (e.type === \"text_delta\") {\n if (isInThinking) {\n isInThinking = false\n endThinking()\n }\n if (!isInText) {\n clearLiveRender() // Clear spinner before text starts\n }\n isInText = true\n writeTextDelta(e.delta)\n assistantText += e.delta\n } else if (e.type === \"thinking_delta\") {\n if (!isInThinking) {\n clearLiveRender() // Clear spinner before thinking\n process.stderr.write(styled(theme.thinking, \"thinking... \"))\n isInThinking = true\n }\n writeThinkingDelta(e.delta)\n } else if (e.type === \"thinking_end\") {\n if (isInThinking) {\n isInThinking = false\n endThinking()\n }\n }\n break\n }\n\n case \"turn_end\": {\n if (isInText) {\n endAssistantMessage()\n isInText = false\n }\n // Extract usage\n const msg = event.message as any\n if (msg?.usage) {\n totalTokens += msg.usage.totalTokens ?? 0\n totalCost += msg.usage.cost?.total ?? 0\n }\n // Log assistant text\n if (assistantText) {\n appendEvent(sessionId, { type: \"assistant\", content: assistantText, timestamp: Date.now() })\n assistantText = \"\"\n }\n break\n }\n\n case \"tool_execution_start\": {\n toolStart(event.toolCallId, event.toolName, event.args)\n appendEvent(sessionId, {\n type: \"tool_call\",\n name: event.toolName,\n args: event.args,\n timestamp: Date.now(),\n })\n break\n }\n\n case \"tool_execution_end\": {\n toolEnd(event.toolCallId, event.result, event.isError)\n const resultText = extractResultText(event.result)\n appendEvent(sessionId, {\n type: \"tool_result\",\n name: event.toolName,\n result: resultText.slice(0, 500),\n isError: event.isError,\n timestamp: Date.now(),\n })\n break\n }\n\n case \"agent_end\": {\n isWorking = false\n stopSpinner()\n // Show status\n const bar = renderStatusBar({\n model,\n totalTokens,\n totalCost,\n sessionId,\n isStreaming: false,\n })\n process.stderr.write(`${bar}\\n`)\n // Show per-agent stats if any agents ran\n const agentSummary = renderAgentSummary()\n if (agentSummary) {\n process.stderr.write(`${agentSummary}\\n`)\n }\n // Show team status if applicable\n const teamStatus = renderTeamStatus(agent.team)\n if (teamStatus) {\n process.stderr.write(`${teamStatus}\\n`)\n }\n process.stderr.write(\"\\n\")\n input.prompt()\n break\n }\n\n case \"agent_start\": {\n isWorking = true\n startSpinner()\n break\n }\n }\n })\n\n // Spinner — renders live activity panel (task graph + active tools)\n function startSpinner() {\n if (spinnerInterval) return\n spinnerInterval = setInterval(() => {\n if (hasActiveWork()) {\n updateLivePanel()\n }\n }, 100)\n }\n\n function stopSpinner() {\n if (spinnerInterval) {\n clearInterval(spinnerInterval)\n spinnerInterval = null\n clearLiveRender()\n }\n }\n\n // Handle slash commands\n function handleSlashCommand(input: string): boolean {\n const [cmd, ...rest] = input.slice(1).split(/\\s+/)\n const arg = rest.join(\" \")\n\n switch (cmd) {\n case \"help\":\n writeInfo(`Commands:\n /help Show this help\n /sessions List saved sessions\n /status Show current status\n /clear Clear conversation\n /compact Force context compaction\n /memory Show loaded memories\n /quit, /exit Exit sa`)\n return true\n\n case \"sessions\":\n process.stderr.write(formatSessionList(listSessions()) + \"\\n\")\n return true\n\n case \"status\": {\n const bar = renderStatusBar({\n model,\n totalTokens,\n totalCost,\n sessionId,\n isStreaming: isWorking,\n })\n process.stderr.write(`${bar}\\n`)\n const teamStatus = renderTeamStatus(agent.team)\n if (teamStatus) process.stderr.write(`${teamStatus}\\n`)\n return true\n }\n\n case \"clear\":\n agent.reset()\n totalTokens = 0\n totalCost = 0\n writeInfo(\"Conversation cleared.\")\n return true\n\n case \"memory\":\n writeInfo(\"Memory is auto-loaded into system prompt from:\")\n writeInfo(\" Project: .sa/memory.md\")\n writeInfo(\" Global: ~/.sa/memory.md\")\n writeInfo(\"The agent can write to memory with write_memory tool.\")\n return true\n\n case \"quit\":\n case \"exit\":\n cleanup()\n return true\n\n default:\n writeError(`Unknown command: /${cmd}. Type /help for available commands.`)\n return true\n }\n }\n\n // Input handler\n const input = createInput({\n onSubmit: async (text: string) => {\n // Slash commands\n if (text.startsWith(\"/\")) {\n const handled = handleSlashCommand(text)\n if (handled) {\n input.prompt()\n return\n }\n }\n\n if (isWorking) {\n // Steer the agent mid-run\n writeInfo(\"(steering agent...)\")\n agent.steer({\n role: \"user\",\n content: [{ type: \"text\", text }],\n timestamp: Date.now(),\n })\n return\n }\n\n // Normal prompt\n pauseInput()\n appendEvent(sessionId, { type: \"user\", content: text, timestamp: Date.now() })\n\n try {\n await agent.prompt(text)\n await agent.waitForIdle()\n } catch (err: any) {\n if (err.name === \"AbortError\") {\n process.stderr.write(`\\n${styled(theme.dim, \"(aborted)\")}\\n`)\n } else {\n writeError(err.message ?? String(err))\n }\n input.prompt()\n }\n },\n onAbort: () => {\n if (isWorking) {\n agent.abort()\n isWorking = false\n stopSpinner()\n process.stderr.write(`\\n${styled(theme.dim, \"(aborted)\")}\\n`)\n input.prompt()\n } else {\n cleanup()\n }\n },\n })\n\n function cleanup() {\n stopSpinner()\n agent.destroy()\n input.close()\n process.stderr.write(`\\n${styled(theme.dim, `Session saved: ${sessionId}`)}\\n`)\n process.exit(0)\n }\n\n // Handle process signals\n process.on(\"SIGTERM\", cleanup)\n\n // Start the prompt\n input.prompt()\n}\n\nfunction extractResultText(result: any): string {\n if (!result) return \"\"\n if (typeof result === \"string\") return result\n if (result.content && Array.isArray(result.content)) {\n return result.content\n .filter((c: any) => c.type === \"text\")\n .map((c: any) => c.text)\n .join(\"\\n\")\n }\n return JSON.stringify(result).slice(0, 500)\n}\n","import * as readline from \"node:readline\"\nimport { theme, styled, color } from \"./theme.js\"\n\nexport interface InputOptions {\n onSubmit: (input: string) => void\n onAbort: () => void\n}\n\nconst HISTORY_MAX = 200\nconst history: string[] = []\nlet rl: readline.Interface | null = null\n\nexport function createInput(opts: InputOptions): { prompt: () => void; close: () => void } {\n rl = readline.createInterface({\n input: process.stdin,\n output: process.stderr,\n prompt: styled(color.brightWhite + color.bold, \"> \"),\n historySize: HISTORY_MAX,\n terminal: true,\n })\n\n rl.on(\"line\", (line) => {\n const trimmed = line.trim()\n if (!trimmed) {\n rl?.prompt()\n return\n }\n history.push(trimmed)\n opts.onSubmit(trimmed)\n })\n\n rl.on(\"close\", () => {\n opts.onAbort()\n })\n\n // Handle Ctrl+C gracefully\n rl.on(\"SIGINT\", () => {\n opts.onAbort()\n })\n\n return {\n prompt: () => {\n rl?.prompt()\n },\n close: () => {\n rl?.close()\n rl = null\n },\n }\n}\n\n/** Temporarily pause readline so agent output doesn't interleave with the prompt */\nexport function pauseInput(): void {\n if (rl) {\n // Clear current prompt line\n process.stderr.write(\"\\r\\x1b[K\")\n }\n}\n\n/** Resume readline prompt */\nexport function resumeInput(): void {\n rl?.prompt()\n}\n","/**\n * SMS mode — remote control the agent via text messages.\n *\n * The CLI connects outbound to a Durable Object relay via WebSocket.\n * A paired phone sends SMS through Twilio → Worker → DO → CLI.\n * Responses flow back: CLI → DO → Twilio → Phone.\n */\n\nimport { createAgent, type SubAgent, type AgentOptions } from 'subagent';\nimport type { AgentEvent } from 'subagent';\nimport { connectRelay, type RelayClient } from '../sms/relay-client.js';\nimport { writeMemoryTool, readMemoryTool } from '../tools/memory.js';\nimport { toolStart, toolEnd, hasActiveWork, updateLivePanel, clearLiveRender } from '../components/tool-panel.js';\nimport {\n writeTextDelta, writeThinkingDelta, endThinking, endAssistantMessage,\n writeError, writeInfo,\n} from '../components/chat.js';\nimport { renderStatusBar } from '../components/status-bar.js';\nimport {\n generateSessionId, appendEvent,\n} from '../session.js';\nimport { theme, styled, color } from '../components/theme.js';\nimport crypto from 'node:crypto';\n\nconst SMS_API_BASE = 'wss://api.subagents.com';\nconst TWILIO_PHONE = process.env.TWILIO_PHONE_NUMBER || '+18556242904';\nconst MAX_SMS_LEN = 1500;\n\nfunction generatePairingCode(): string {\n return String(crypto.randomInt(1000, 9999));\n}\n\nfunction truncateForSms(text: string): string {\n if (text.length <= MAX_SMS_LEN) return text;\n return text.slice(0, MAX_SMS_LEN - 30) + '\\n\\n[text \"/full\" for complete response]';\n}\n\nexport async function runSmsMode(agentOptions: AgentOptions, modelName: string): Promise<void> {\n const sessionId = generateSessionId();\n const pairingCode = generatePairingCode();\n const model = modelName;\n\n // Create agent\n const tools = [...(agentOptions.tools ?? []), writeMemoryTool as any, readMemoryTool as any];\n let agent: SubAgent;\n try {\n agent = await createAgent({ ...agentOptions, tools });\n } catch (err: any) {\n writeError(err.message ?? String(err));\n process.exit(1);\n }\n\n // State\n let totalTokens = 0;\n let totalCost = 0;\n let isInText = false;\n let isInThinking = false;\n let isWorking = false;\n let assistantText = '';\n let lastFullResponse = '';\n let pairedPhone = '';\n let spinnerInterval: ReturnType<typeof setInterval> | null = null;\n let relay: RelayClient;\n\n // Banner\n process.stderr.write('\\n');\n process.stderr.write(styled(color.bold, ` sa `) + styled(theme.dim, `SMS Remote Control\\n`));\n process.stderr.write(styled(theme.dim, ` Model: `) + styled(color.brightCyan, model) + '\\n');\n process.stderr.write(styled(theme.dim, ` Session: `) + sessionId + '\\n');\n process.stderr.write('\\n');\n process.stderr.write(styled(color.brightYellow, ` Text \"${pairingCode}\" to ${TWILIO_PHONE} to connect\\n`));\n process.stderr.write(styled(theme.dim, ` Ctrl+C to stop\\n`));\n process.stderr.write('\\n');\n\n // Subscribe to agent events (terminal display, same as interactive)\n agent.subscribe((event: AgentEvent) => {\n switch (event.type) {\n case 'message_update': {\n const e = event.assistantMessageEvent;\n if (e.type === 'text_delta') {\n if (isInThinking) {\n isInThinking = false;\n endThinking();\n }\n isInText = true;\n writeTextDelta(e.delta);\n assistantText += e.delta;\n } else if (e.type === 'thinking_delta') {\n if (!isInThinking) {\n process.stderr.write(styled(theme.thinking, 'thinking... '));\n isInThinking = true;\n }\n writeThinkingDelta(e.delta);\n } else if (e.type === 'thinking_end') {\n if (isInThinking) {\n isInThinking = false;\n endThinking();\n }\n }\n break;\n }\n\n case 'turn_end': {\n if (isInText) {\n endAssistantMessage();\n isInText = false;\n }\n const msg = event.message as any;\n if (msg?.usage) {\n totalTokens += msg.usage.totalTokens ?? 0;\n totalCost += msg.usage.cost?.total ?? 0;\n }\n if (assistantText) {\n appendEvent(sessionId, { type: 'assistant', content: assistantText, timestamp: Date.now() });\n }\n break;\n }\n\n case 'tool_execution_start': {\n toolStart(event.toolCallId, event.toolName, event.args);\n appendEvent(sessionId, {\n type: 'tool_call',\n name: event.toolName,\n args: event.args,\n timestamp: Date.now(),\n });\n break;\n }\n\n case 'tool_execution_end': {\n toolEnd(event.toolCallId, event.result, event.isError);\n break;\n }\n\n case 'agent_end': {\n isWorking = false;\n stopSpinner();\n\n // Save full response, send truncated via SMS\n lastFullResponse = assistantText;\n if (pairedPhone && assistantText) {\n relay.sendResponse(pairedPhone, truncateForSms(assistantText));\n }\n assistantText = '';\n\n // Show status in terminal\n const bar = renderStatusBar({\n model,\n totalTokens,\n totalCost,\n sessionId,\n isStreaming: false,\n });\n process.stderr.write(`${bar}\\n\\n`);\n relay.sendStatus('idle');\n break;\n }\n\n case 'agent_start': {\n isWorking = true;\n startSpinner();\n relay.sendStatus('working');\n break;\n }\n }\n });\n\n // Spinner\n function startSpinner() {\n if (spinnerInterval) return;\n spinnerInterval = setInterval(() => {\n if (hasActiveWork()) {\n updateLivePanel();\n }\n }, 100);\n }\n\n function stopSpinner() {\n if (spinnerInterval) {\n clearInterval(spinnerInterval);\n spinnerInterval = null;\n clearLiveRender();\n }\n }\n\n // Handle SMS slash commands\n function handleSmsCommand(text: string): boolean {\n const cmd = text.toLowerCase().trim();\n\n if (cmd === '/full') {\n if (lastFullResponse && pairedPhone) {\n relay.sendResponse(pairedPhone, lastFullResponse);\n } else if (pairedPhone) {\n relay.sendResponse(pairedPhone, 'No previous response to show.');\n }\n return true;\n }\n\n if (cmd === '/status') {\n if (pairedPhone) {\n const status = isWorking ? 'Working...' : 'Idle';\n relay.sendResponse(pairedPhone, `Status: ${status}\\nTokens: ${totalTokens}\\nCost: $${totalCost.toFixed(4)}`);\n }\n return true;\n }\n\n if (cmd === '/clear') {\n agent.reset();\n totalTokens = 0;\n totalCost = 0;\n lastFullResponse = '';\n if (pairedPhone) relay.sendResponse(pairedPhone, 'Conversation cleared.');\n writeInfo('Conversation cleared (via SMS).');\n return true;\n }\n\n if (cmd === '/quit') {\n if (pairedPhone) relay.sendResponse(pairedPhone, 'Session ended.');\n cleanup();\n return true;\n }\n\n return false;\n }\n\n // Connect relay\n relay = connectRelay({\n sessionId,\n pairingCode,\n apiBaseUrl: SMS_API_BASE,\n\n onPrompt: async (body: string, from: string) => {\n process.stderr.write(styled(color.brightCyan, `\\n [SMS from ${from}] `) + body + '\\n\\n');\n appendEvent(sessionId, { type: 'user', content: `[SMS] ${body}`, timestamp: Date.now() });\n\n // Handle slash commands\n if (body.startsWith('/')) {\n if (handleSmsCommand(body)) return;\n }\n\n if (isWorking) {\n writeInfo('(steering agent via SMS...)');\n agent.steer({\n role: 'user',\n content: [{ type: 'text', text: body }],\n timestamp: Date.now(),\n });\n return;\n }\n\n try {\n await agent.prompt(body);\n await agent.waitForIdle();\n } catch (err: any) {\n if (err.name === 'AbortError') {\n process.stderr.write(`\\n${styled(theme.dim, '(aborted)')}\\n`);\n } else {\n writeError(err.message ?? String(err));\n if (pairedPhone) relay.sendResponse(pairedPhone, `Error: ${err.message}`);\n }\n }\n },\n\n onPaired: (phone: string) => {\n pairedPhone = phone;\n process.stderr.write(styled(color.brightGreen, ` Paired with ${phone}\\n\\n`));\n },\n\n onError: (message: string) => {\n writeError(`Relay: ${message}`);\n },\n\n onDisconnect: () => {\n writeInfo('Relay disconnected.');\n cleanup();\n },\n });\n\n function cleanup() {\n stopSpinner();\n relay.close();\n agent.destroy();\n process.stderr.write(`\\n${styled(theme.dim, `Session saved: ${sessionId}`)}\\n`);\n process.exit(0);\n }\n\n // Handle Ctrl+C\n process.on('SIGINT', cleanup);\n process.on('SIGTERM', cleanup);\n\n // Keep process alive\n process.stderr.write(styled(theme.dim, ' Waiting for SMS connection...\\n'));\n}\n","/**\n * WebSocket client that connects to the SmsRelay Durable Object.\n * Handles: connect, reconnect (exponential backoff), ping/pong keepalive,\n * message parsing, sending responses.\n */\n\nimport WebSocket from 'ws';\n\nexport interface RelayClientOptions {\n sessionId: string;\n pairingCode: string;\n apiBaseUrl: string; // e.g. \"wss://api.subagents.com\"\n onPrompt: (body: string, from: string) => void;\n onPaired: (phone: string) => void;\n onError: (message: string) => void;\n onDisconnect: () => void;\n}\n\nexport interface RelayClient {\n sendResponse(to: string, body: string): void;\n sendStatus(status: 'working' | 'idle'): void;\n close(): void;\n}\n\nexport function connectRelay(opts: RelayClientOptions): RelayClient {\n let ws: WebSocket | null = null;\n let closed = false;\n let reconnectAttempt = 0;\n let reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n let pingInterval: ReturnType<typeof setInterval> | null = null;\n const MAX_RECONNECT_DELAY = 30_000;\n const RECONNECT_BUDGET_MS = 10 * 60 * 1000; // 10 min\n let firstConnectTime = Date.now();\n\n function connect() {\n if (closed) return;\n\n const wsUrl = `${opts.apiBaseUrl}/v1/sms/ws?session=${encodeURIComponent(opts.sessionId)}&code=${encodeURIComponent(opts.pairingCode)}`;\n ws = new WebSocket(wsUrl);\n\n ws.on('open', () => {\n reconnectAttempt = 0;\n firstConnectTime = Date.now();\n\n // Keepalive ping every 30s\n pingInterval = setInterval(() => {\n if (ws?.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify({ type: 'ping' }));\n }\n }, 30_000);\n });\n\n ws.on('message', (data: WebSocket.Data) => {\n let msg: any;\n try {\n msg = JSON.parse(data.toString());\n } catch {\n return;\n }\n\n switch (msg.type) {\n case 'prompt':\n opts.onPrompt(msg.body, msg.from);\n break;\n case 'paired':\n opts.onPaired(msg.phone);\n break;\n case 'pong':\n // keepalive ack\n break;\n case 'error':\n opts.onError(msg.message);\n break;\n }\n });\n\n ws.on('close', (code: number) => {\n clearPing();\n if (closed) return;\n\n // Don't reconnect on intentional close\n if (code === 1000) {\n opts.onDisconnect();\n return;\n }\n\n attemptReconnect();\n });\n\n ws.on('error', (err: Error) => {\n // error event is followed by close, so reconnect happens there\n if (!closed) {\n console.error(`[relay] WebSocket error: ${err.message}`);\n }\n });\n }\n\n function attemptReconnect() {\n if (closed) return;\n\n if (Date.now() - firstConnectTime > RECONNECT_BUDGET_MS) {\n opts.onError('Reconnect budget exhausted');\n opts.onDisconnect();\n return;\n }\n\n const delay = Math.min(1000 * 2 ** reconnectAttempt, MAX_RECONNECT_DELAY);\n reconnectAttempt++;\n reconnectTimer = setTimeout(connect, delay);\n }\n\n function clearPing() {\n if (pingInterval) {\n clearInterval(pingInterval);\n pingInterval = null;\n }\n }\n\n function send(msg: object) {\n if (ws?.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify(msg));\n }\n }\n\n // Start\n connect();\n\n return {\n sendResponse(to: string, body: string) {\n send({ type: 'response', body, to });\n },\n sendStatus(status: 'working' | 'idle') {\n send({ type: 'status', status });\n },\n close() {\n closed = true;\n clearPing();\n if (reconnectTimer) clearTimeout(reconnectTimer);\n if (ws) {\n try { ws.close(1000, 'Client closing'); } catch {}\n }\n },\n };\n}\n","import { parseFlags, loadConfig, configToAgentOptions, resolveModelName } from \"./config.js\"\nimport { runPrintMode } from \"./modes/print.js\"\nimport { runInteractiveMode } from \"./modes/interactive.js\"\nimport { runSmsMode } from \"./modes/sms.js\"\nimport { listSessions, formatSessionList, getLatestSessionId } from \"./session.js\"\nimport { styled, color } from \"./components/theme.js\"\nimport { writeError } from \"./components/chat.js\"\n\nconst VERSION = \"0.1.0\"\n\nconst HELP = `${styled(color.brightCyan, \"sa\")} — fluid, subagent-centric coding agent\n\n${styled(color.bold, \"Usage:\")}\n sa Interactive mode (TUI)\n sa \"fix the login bug\" Run prompt and exit (print mode)\n sa --sms SMS remote control (text prompts from phone)\n sa --resume Resume last session\n sa sessions List saved sessions\n\n${styled(color.bold, \"Options:\")}\n -m, --model <model> Model (e.g., anthropic:claude-sonnet-4-6)\n -p, --print Force print mode (non-interactive)\n -r, --resume [id] Resume a session (latest if no id)\n --sms SMS remote control mode\n --thinking <level> Thinking level: off, minimal, low, medium, high\n --debug Enable debug logging\n -h, --help Show this help\n -v, --version Show version\n\n${styled(color.bold, \"Interactive commands:\")}\n /help Show available commands\n /sessions List sessions\n /status Show tokens, cost, model\n /clear Clear conversation\n /quit Exit\n\n${styled(color.bold, \"Memory:\")}\n The agent saves learnings to .sa/memory.md (project) or ~/.sa/memory.md (global).\n Memory auto-loads on startup so the agent improves across sessions.\n\n${styled(color.bold, \"Config:\")}\n ~/.sa/config.json Global config\n .sa/config.json Project config (overrides global)\n\n${styled(color.bold, \"Setup:\")}\n Set your API key: echo 'ANTHROPIC_API_KEY=sk-...' >> ~/.sa/.env\n`\n\nexport async function main(argv: string[]): Promise<void> {\n const flags = parseFlags(argv)\n\n if (flags.help) {\n process.stderr.write(HELP)\n process.exit(0)\n }\n\n if (flags.version) {\n process.stderr.write(`sa v${VERSION}\\n`)\n process.exit(0)\n }\n\n if (flags.sessions) {\n process.stderr.write(formatSessionList(listSessions()) + \"\\n\")\n process.exit(0)\n }\n\n const config = loadConfig()\n const agentOptions = configToAgentOptions(config, flags)\n const modelName = resolveModelName(config, flags)\n\n // SMS mode\n if (flags.sms) {\n await runSmsMode(agentOptions, modelName)\n return\n }\n\n // Resume mode\n if (flags.resume) {\n let sessionId: string | undefined\n if (typeof flags.resume === \"string\") {\n sessionId = flags.resume\n } else {\n sessionId = getLatestSessionId() ?? undefined\n if (!sessionId) {\n writeError(\"No sessions found to resume.\")\n process.exit(1)\n }\n }\n await runInteractiveMode(agentOptions, modelName, sessionId)\n return\n }\n\n // Print mode (prompt given as argument, or piped stdin)\n if (flags.prompt) {\n await runPrintMode(flags.prompt, agentOptions, modelName)\n return\n }\n\n // Check if stdin is piped\n if (!process.stdin.isTTY) {\n const chunks: Uint8Array[] = []\n for await (const chunk of process.stdin) {\n chunks.push(chunk as Uint8Array)\n }\n const input = Buffer.concat(chunks).toString(\"utf-8\").trim()\n if (input) {\n await runPrintMode(input, agentOptions, modelName)\n return\n }\n }\n\n // Interactive mode (default when no prompt, TTY is available)\n await runInteractiveMode(agentOptions, modelName)\n}\n","import { loadEnv } from \"./env.js\"\n\n// Load .env files before anything else\nloadEnv()\n\n// Global error handlers for clean output\nprocess.on(\"uncaughtException\", (err) => {\n const msg = err.message ?? String(err)\n if (msg.includes(\"No API key\")) {\n process.stderr.write(\n \"\\x1b[31merror\\x1b[0m: No API key found. Set ANTHROPIC_API_KEY in:\\n\" +\n \" - Environment variable\\n\" +\n \" - .env file in project directory\\n\" +\n \" - ~/.sa/.env for global config\\n\"\n )\n } else {\n process.stderr.write(`\\x1b[31merror\\x1b[0m: ${msg}\\n`)\n }\n process.exit(1)\n})\n\nprocess.on(\"unhandledRejection\", (err: any) => {\n const msg = err?.message ?? String(err)\n if (msg.includes(\"No API key\")) {\n process.stderr.write(\n \"\\x1b[31merror\\x1b[0m: No API key found. Set ANTHROPIC_API_KEY in:\\n\" +\n \" - Environment variable\\n\" +\n \" - .env file in project directory\\n\" +\n \" - ~/.sa/.env for global config\\n\"\n )\n } else {\n process.stderr.write(`\\x1b[31merror\\x1b[0m: ${msg}\\n`)\n }\n process.exit(1)\n})\n\nimport { main } from \"./main.js\"\n\nmain(process.argv.slice(2)).catch((err) => {\n process.stderr.write(`\\x1b[31merror\\x1b[0m: ${err.message ?? err}\\n`)\n process.exit(1)\n})\n"],"mappings":";;;AAAA,YAAY,QAAQ;AACpB,YAAY,UAAU;AAUf,SAAS,UAAgB;AAC9B,QAAM,SAAmB,CAAC;AAG1B,MAAI,MAAM,QAAQ,IAAI;AACtB,SAAO,MAAM;AACX,UAAM,UAAe,UAAK,KAAK,MAAM;AACrC,QAAO,cAAW,OAAO,GAAG;AAC1B,aAAO,KAAK,OAAO;AACnB;AAAA,IACF;AACA,UAAM,SAAc,aAAQ,GAAG;AAC/B,QAAI,WAAW,IAAK;AACpB,UAAM;AAAA,EACR;AAGA,QAAM,OAAO,QAAQ,IAAI,QAAQ,QAAQ,IAAI;AAC7C,MAAI,MAAM;AACR,UAAM,YAAiB,UAAK,MAAM,OAAO,MAAM;AAC/C,QAAO,cAAW,SAAS,GAAG;AAC5B,aAAO,KAAK,SAAS;AAAA,IACvB;AAAA,EACF;AAEA,aAAW,WAAW,QAAQ;AAC5B,iBAAa,OAAO;AAAA,EACtB;AACF;AAEA,SAAS,aAAa,UAAwB;AAC5C,QAAM,UAAa,gBAAa,UAAU,OAAO;AACjD,aAAW,QAAQ,QAAQ,MAAM,IAAI,GAAG;AACtC,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,CAAC,WAAW,QAAQ,WAAW,GAAG,EAAG;AACzC,UAAM,QAAQ,QAAQ,QAAQ,GAAG;AACjC,QAAI,UAAU,GAAI;AAClB,UAAM,MAAM,QAAQ,MAAM,GAAG,KAAK,EAAE,KAAK;AACzC,QAAI,QAAQ,QAAQ,MAAM,QAAQ,CAAC,EAAE,KAAK;AAE1C,QAAK,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,KAC3C,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,GAAI;AAClD,cAAQ,MAAM,MAAM,GAAG,EAAE;AAAA,IAC3B;AAEA,QAAI,EAAE,OAAO,QAAQ,MAAM;AACzB,cAAQ,IAAI,GAAG,IAAI;AAAA,IACrB;AAAA,EACF;AACF;;;AC5DA,YAAYA,SAAQ;AACpB,YAAYC,WAAU;AACtB,YAAY,QAAQ;AA4BpB,IAAM,SAAS;AACf,IAAM,cAAc;AACpB,IAAM,aAAkB,WAAQ,WAAQ,GAAG,MAAM;AAEjD,IAAM,gBAAgB;AAEtB,IAAM,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAetB,SAAS,gBAAwB;AACtC,SAAY,WAAK,QAAQ,IAAI,GAAG,MAAM;AACxC;AAEO,SAAS,eAAuB;AACrC,SAAO;AACT;AAEO,SAAS,UAAU,KAAmB;AAC3C,MAAI,CAAI,eAAW,GAAG,GAAG;AACvB,IAAG,cAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACvC;AACF;AAEA,SAAS,aAAa,UAAuC;AAC3D,MAAI;AACF,QAAO,eAAW,QAAQ,GAAG;AAC3B,aAAO,KAAK,MAAS,iBAAa,UAAU,OAAO,CAAC;AAAA,IACtD;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO,CAAC;AACV;AAEO,SAAS,aAAwB;AACtC,QAAM,SAAS,aAAkB,WAAK,YAAY,WAAW,CAAC;AAC9D,QAAM,UAAU,aAAkB,WAAK,cAAc,GAAG,WAAW,CAAC;AACpE,SAAO,EAAE,GAAG,QAAQ,GAAG,QAAQ;AACjC;AAEO,SAAS,WAAW,MAA0B;AACnD,QAAM,QAAkB,CAAC;AACzB,QAAM,aAAuB,CAAC;AAE9B,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,MAAM,KAAK,CAAC;AAClB,QAAI,QAAQ,YAAY,QAAQ,MAAM;AACpC,YAAM,OAAO;AAAA,IACf,WAAW,QAAQ,eAAe,QAAQ,MAAM;AAC9C,YAAM,UAAU;AAAA,IAClB,WAAW,QAAQ,aAAa,QAAQ,MAAM;AAC5C,YAAM,QAAQ;AAAA,IAChB,WAAW,QAAQ,WAAW;AAC5B,YAAM,QAAQ;AAAA,IAChB,WAAW,QAAQ,cAAc,QAAQ,MAAM;AAC7C,YAAM,OAAO,KAAK,IAAI,CAAC;AACvB,UAAI,QAAQ,CAAC,KAAK,WAAW,GAAG,GAAG;AACjC,cAAM,SAAS;AACf;AAAA,MACF,OAAO;AACL,cAAM,SAAS;AAAA,MACjB;AAAA,IACF,WAAW,QAAQ,aAAa,QAAQ,MAAM;AAC5C,YAAM,QAAQ,KAAK,EAAE,CAAC;AAAA,IACxB,WAAW,QAAQ,cAAc;AAC/B,YAAM,gBAAgB,KAAK,EAAE,CAAC;AAAA,IAChC,WAAW,QAAQ,SAAS;AAC1B,YAAM,MAAM;AAAA,IACd,WAAW,QAAQ,YAAY;AAC7B,YAAM,WAAW;AAAA,IACnB,WAAW,CAAC,IAAI,WAAW,GAAG,GAAG;AAC/B,iBAAW,KAAK,GAAG;AAAA,IACrB;AAAA,EACF;AAEA,MAAI,WAAW,SAAS,GAAG;AACzB,UAAM,SAAS,WAAW,KAAK,GAAG;AAElC,QAAI,MAAM,UAAU,QAAW;AAC7B,YAAM,QAAQ;AAAA,IAChB;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,iBAAiB,QAAmB,OAAyB;AAC3E,SAAO,MAAM,SAAS,OAAO,SAAS;AACxC;AAEO,SAAS,qBAAqB,QAAmB,OAA+B;AACrF,QAAM,cAAwB,CAAC;AAG/B,QAAM,gBAAqB,WAAK,cAAc,GAAG,WAAW;AAC5D,MAAO,eAAW,aAAa,GAAG;AAChC,gBAAY,KAAK,aAAa;AAAA,EAChC;AACA,QAAM,eAAoB,WAAK,YAAY,WAAW;AACtD,MAAO,eAAW,YAAY,GAAG;AAC/B,gBAAY,KAAK,YAAY;AAAA,EAC/B;AAGA,MAAI,eAAe;AACnB,MAAI,OAAO,cAAc;AACvB,mBAAe,OAAO,eAAe,OAAO;AAAA,EAC9C;AAEA,SAAO;AAAA,IACL,OAAO,MAAM,SAAS,OAAO;AAAA,IAC7B;AAAA,IACA,UAAU,OAAO,YAAY;AAAA,IAC7B,WAAW,OAAO,aAAa;AAAA,IAC/B,SAAS,OAAO,WAAW;AAAA,IAC3B,cAAc,OAAO,gBAAgB;AAAA,IACrC,eAAgB,MAAM,iBAAiB,OAAO,iBAAiB;AAAA,IAC/D,WAAW,OAAO;AAAA,IAClB,QAAQ,YAAY,SAAS,IAAI,cAAc;AAAA,IAC/C,OAAO,MAAM,SAAS,OAAO;AAAA,EAC/B;AACF;;;ACnKA,SAAS,mBAAqD;;;ACA9D,YAAYC,SAAQ;AACpB,YAAYC,WAAU;AACtB,SAAS,YAAY;AAYrB,IAAM,kBAAkB,IAAI;AAE5B,SAAS,WAAW,MAAc;AAChC,SAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,KAAK,CAAC,GAAG,SAAS,CAAC,EAAE;AACnE;AAEA,SAAS,cAAc,OAAuB;AAC5C,QAAM,MAAM,UAAU,WAAW,aAAa,IAAI,cAAc;AAChE,YAAU,GAAG;AACb,SAAY,WAAK,KAAK,WAAW;AACnC;AAEA,SAAS,eAAe,UAA0B;AAChD,MAAI;AACF,QAAO,eAAW,QAAQ,GAAG;AAC3B,aAAU,iBAAa,UAAU,OAAO;AAAA,IAC1C;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAEO,IAAM,kBAAiC;AAAA,EAC5C,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUb,YAAY,KAAK,OAAO;AAAA,IACtB,KAAK,KAAK,OAAO,EAAE,aAAa,8EAA8E,CAAC;AAAA,IAC/G,SAAS,KAAK,OAAO,EAAE,aAAa,uDAAuD,CAAC;AAAA,IAC5F,OAAO,KAAK,MAAM,CAAC,KAAK,QAAQ,SAAS,GAAG,KAAK,QAAQ,QAAQ,CAAC,GAAG;AAAA,MACnE,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH,CAAC;AAAA,EACD,SAAS,OAAO,aAAqB,WAA4D;AAC/F,UAAM,EAAE,KAAK,SAAS,MAAM,IAAI;AAChC,UAAM,aAAa,cAAc,KAAK;AACtC,QAAI,WAAW,eAAe,UAAU;AAGxC,UAAM,YAAY,MAAM,GAAG;AAC3B,UAAM,WAAW,IAAI,OAAO,MAAM,YAAY,GAAG,CAAC,6BAA6B,GAAG;AAElF,UAAM,WAAW,MAAM,GAAG;AAAA,EAAK,OAAO;AAAA;AAEtC,QAAI,SAAS,MAAM,QAAQ,GAAG;AAC5B,iBAAW,SAAS,QAAQ,UAAU,SAAS,KAAK,CAAC;AAAA,IACvD,OAAO;AACL,iBAAW,SAAS,KAAK,KAAK,SAAS,KAAK,IAAI,SAAS,MAAM;AAAA,IACjE;AAGA,QAAI,OAAO,WAAW,UAAU,OAAO,IAAI,iBAAiB;AAC1D,aAAO,WAAW,4BAA4B,kBAAkB,IAAI,wHAAwH;AAAA,IAC9L;AAEA,IAAG,kBAAc,YAAY,SAAS,KAAK,IAAI,MAAM,OAAO;AAC5D,WAAO,WAAW,UAAU,GAAG,QAAQ,KAAK,YAAY,UAAU,GAAG;AAAA,EACvE;AACF;AAEO,IAAM,iBAAgC;AAAA,EAC3C,MAAM;AAAA,EACN,OAAO;AAAA,EACP,aAAa;AAAA,EACb,YAAY,KAAK,OAAO;AAAA,IACtB,OAAO,KAAK;AAAA,MACV,KAAK,MAAM,CAAC,KAAK,QAAQ,SAAS,GAAG,KAAK,QAAQ,QAAQ,GAAG,KAAK,QAAQ,KAAK,CAAC,GAAG;AAAA,QACjF,aAAa;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAAA,EACD,SAAS,OAAO,aAAqB,WAA+B;AAClE,UAAM,QAAQ,OAAO,SAAS;AAC9B,UAAM,WAAqB,CAAC;AAE5B,QAAI,UAAU,aAAa,UAAU,OAAO;AAC1C,YAAM,cAAmB,WAAK,cAAc,GAAG,WAAW;AAC1D,YAAM,UAAU,eAAe,WAAW;AAC1C,UAAI,QAAQ,KAAK,GAAG;AAClB,iBAAS,KAAK;AAAA;AAAA,EAAuC,QAAQ,KAAK,CAAC,EAAE;AAAA,MACvE,OAAO;AACL,iBAAS,KAAK,6BAA6B;AAAA,MAC7C;AAAA,IACF;AAEA,QAAI,UAAU,YAAY,UAAU,OAAO;AACzC,YAAM,aAAkB,WAAK,aAAa,GAAG,WAAW;AACxD,YAAM,UAAU,eAAe,UAAU;AACzC,UAAI,QAAQ,KAAK,GAAG;AAClB,iBAAS,KAAK;AAAA;AAAA,EAAwC,QAAQ,KAAK,CAAC,EAAE;AAAA,MACxE,OAAO;AACL,iBAAS,KAAK,4BAA4B;AAAA,MAC5C;AAAA,IACF;AAEA,WAAO,WAAW,SAAS,KAAK,aAAa,CAAC;AAAA,EAChD;AACF;AAEA,SAAS,YAAY,GAAmB;AACtC,SAAO,EAAE,QAAQ,uBAAuB,MAAM;AAChD;;;AC5HA,IAAM,MAAM;AAEL,IAAM,QAAQ;AAAA,EACnB,OAAO,GAAG,GAAG;AAAA,EACb,MAAM,GAAG,GAAG;AAAA,EACZ,KAAK,GAAG,GAAG;AAAA,EACX,QAAQ,GAAG,GAAG;AAAA,EACd,WAAW,GAAG,GAAG;AAAA;AAAA,EAGjB,OAAO,GAAG,GAAG;AAAA,EACb,KAAK,GAAG,GAAG;AAAA,EACX,OAAO,GAAG,GAAG;AAAA,EACb,QAAQ,GAAG,GAAG;AAAA,EACd,MAAM,GAAG,GAAG;AAAA,EACZ,SAAS,GAAG,GAAG;AAAA,EACf,MAAM,GAAG,GAAG;AAAA,EACZ,OAAO,GAAG,GAAG;AAAA;AAAA,EAGb,MAAM,GAAG,GAAG;AAAA,EACZ,WAAW,GAAG,GAAG;AAAA,EACjB,aAAa,GAAG,GAAG;AAAA,EACnB,cAAc,GAAG,GAAG;AAAA,EACpB,YAAY,GAAG,GAAG;AAAA,EAClB,eAAe,GAAG,GAAG;AAAA,EACrB,YAAY,GAAG,GAAG;AAAA,EAClB,aAAa,GAAG,GAAG;AAAA;AAAA,EAGnB,OAAO,CAAC,MAAc,GAAG,GAAG,QAAQ,CAAC;AAAA,EACrC,OAAO,CAAC,MAAc,GAAG,GAAG,QAAQ,CAAC;AACvC;AAGO,IAAM,QAAQ;AAAA,EACnB,OAAO,MAAM;AAAA,EACb,MAAM,MAAM;AAAA,EACZ,MAAM,MAAM;AAAA,EACZ,YAAY,MAAM;AAAA,EAClB,OAAO,MAAM;AAAA,EACb,SAAS,MAAM;AAAA,EACf,UAAU,MAAM;AAAA,EAChB,KAAK,MAAM;AAAA,EACX,QAAQ,MAAM;AAAA,EACd,OAAO,MAAM;AAAA,EACb,OAAO,MAAM;AAAA,EACb,MAAM,MAAM;AACd;AAEO,SAAS,OAAO,OAAe,MAAsB;AAC1D,SAAO,GAAG,KAAK,GAAG,IAAI,GAAG,MAAM,KAAK;AACtC;AAGO,IAAM,MAAM;AAAA,EACjB,SAAS;AAAA,EACT,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,UAAU;AAAA,EACV,SAAS;AAAA,EACT,KAAK;AAAA,EACL,OAAO;AAAA,EACP,SAAS,CAAC,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,QAAG;AAC5D;;;ACjEA,IAAM,kBAAkB;AAAA,EACtB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AACR;AAEA,IAAM,mBAAmB,oBAAI,IAAoB;AACjD,IAAI,iBAAiB;AAEd,SAAS,iBAAiB,MAAsB;AACrD,MAAI,WAAW,iBAAiB,IAAI,IAAI;AACxC,MAAI,CAAC,UAAU;AACb,eAAW,gBAAgB,iBAAiB,gBAAgB,MAAM;AAClE,qBAAiB,IAAI,MAAM,QAAQ;AACnC;AAAA,EACF;AACA,SAAO;AACT;AAgBA,IAAM,cAAc,oBAAI,IAAyB;AACjD,IAAM,aAAa,oBAAI,IAAwB;AAExC,SAAS,eAAe,YAAoB,WAAmB,QAAsB;AAC1F,cAAY,IAAI,YAAY,EAAE,YAAY,WAAW,QAAQ,WAAW,KAAK,IAAI,EAAE,CAAC;AACtF;AAEO,SAAS,aAAa,YAAmE;AAC9F,QAAM,OAAO,YAAY,IAAI,UAAU;AACvC,MAAI,CAAC,KAAM,QAAO;AAClB,cAAY,OAAO,UAAU;AAE7B,QAAM,UAAU,KAAK,IAAI,IAAI,KAAK;AAElC,QAAM,WAAW,WAAW,IAAI,KAAK,SAAS;AAC9C,MAAI,UAAU;AACZ,aAAS;AACT,aAAS,eAAe;AAAA,EAC1B,OAAO;AACL,eAAW,IAAI,KAAK,WAAW,EAAE,WAAW,GAAG,aAAa,QAAQ,CAAC;AAAA,EACvE;AAEA,SAAO,EAAE,WAAW,KAAK,WAAW,QAAQ;AAC9C;AAEO,SAAS,iBAA0B;AACxC,SAAO,YAAY,OAAO;AAC5B;AAWA,IAAM,iBAAiB,oBAAI,IAA4B;AAEhD,SAAS,kBAAkB,YAAoB,IAAY,MAAoB;AACpF,iBAAe,IAAI,YAAY,EAAE,YAAY,IAAI,MAAM,WAAW,KAAK,IAAI,EAAE,CAAC;AAChF;AAEO,SAAS,gBAAgB,YAAoB,WAE3C;AACP,QAAM,MAAM,eAAe,IAAI,UAAU;AACzC,MAAI,CAAC,IAAK,QAAO;AACjB,iBAAe,OAAO,UAAU;AAChC,SAAO,EAAE,IAAI,IAAI,IAAI,MAAM,IAAI,MAAM,SAAS,KAAK,IAAI,IAAI,IAAI,WAAW,UAAU;AACtF;AAIO,SAAS,qBAAqB,WAAmB,SAAiB,SAA0B;AACjG,QAAM,IAAI,iBAAiB,SAAS;AACpC,QAAM,UAAU,WAAW,OAAO;AAClC,QAAM,SAAS,UACX,OAAO,MAAM,OAAO,QAAG,IACvB,OAAO,MAAM,SAAS,QAAG;AAC7B,SAAO,KAAK,MAAM,IAAI,OAAO,GAAG,SAAS,CAAC,KAAK,OAAO,MAAM,KAAK,UAAU,WAAW,MAAM,CAAC,KAAK,OAAO,MAAM,KAAK,OAAO,CAAC;AAC9H;AAIO,SAAS,kBAAkB,IAAY,MAAc,WAAoB,SAAyB;AACvG,QAAM,UAAU,iBAAiB,EAAE;AACnC,QAAM,UAAU,KAAK,SAAS,KAAK,KAAK,MAAM,GAAG,EAAE,IAAI,QAAQ;AAC/D,QAAM,QAAQ,GAAG,OAAO,MAAM,KAAK,cAAI,CAAC,GAAG,OAAO,SAAS,QAAG,CAAC;AAC/D,QAAM,SAAS,YACX,OAAO,MAAM,SAAS,QAAG,IACzB,OAAO,MAAM,OAAO,QAAG;AAC3B,QAAM,UAAU,WAAW,OAAO;AAClC,SAAO,aAAQ,OAAO,MAAM,KAAK,OAAO,CAAC,IAAI,KAAK,IAAI,OAAO,SAAS,EAAE,CAAC,KAAK,OAAO,MAAM,KAAK,IAAI,OAAO,GAAG,CAAC,KAAK,MAAM,KAAK,OAAO,MAAM,KAAK,OAAO,CAAC;AAC3J;AAEO,SAAS,iBAAiB,IAAoB;AACnD,QAAM,UAAU,iBAAiB,EAAE;AACnC,SAAO,eAAQ,OAAO,SAAS,EAAE,CAAC,KAAK,OAAO,MAAM,KAAK,sBAAsB,CAAC;AAClF;AAIO,SAAS,gBAAgBC,eAAgC;AAC9D,MAAI,YAAY,SAAS,EAAG,QAAO,CAAC;AAEpC,QAAM,QAAQ,MAAM,KAAK,YAAY,OAAO,CAAC;AAC7C,QAAM,QAAkB,CAAC;AAEzB,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,IAAI,MAAM,CAAC;AACjB,UAAM,IAAI,iBAAiB,EAAE,SAAS;AACtC,UAAM,UAAU,KAAK,IAAI,IAAI,EAAE;AAC/B,UAAM,UAAU,WAAW,OAAO;AAClC,UAAM,cAAc,OAAO,GAAG,IAAI,QAAQA,gBAAe,IAAI,QAAQ,MAAM,CAAE;AAC7E,UAAM,SAAS,EAAE,OAAO,SAAS,KAAK,EAAE,OAAO,MAAM,GAAG,EAAE,IAAI,QAAQ,EAAE;AACxE,UAAM,YAAY,MAAM,MAAM,SAAS,IAAI,iBAAO;AAClD,UAAM,OAAO,EAAE,UAAU,OAAO,EAAE;AAElC,UAAM;AAAA,MACJ,KAAK,OAAO,MAAM,KAAK,SAAS,CAAC,IAAI,WAAW,IAAI,OAAO,GAAG,IAAI,CAAC,IAAI,OAAO,MAAM,KAAK,IAAI,MAAM,GAAG,CAAC,KAAK,OAAO,MAAM,KAAK,OAAO,CAAC;AAAA,IACxI;AAAA,EACF;AAEA,SAAO;AACT;AAIO,SAAS,qBAA6B;AAC3C,MAAI,WAAW,SAAS,EAAG,QAAO;AAElC,QAAM,UAAU,MAAM,KAAK,WAAW,QAAQ,CAAC,EAC5C,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,WAAW;AAErD,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,KAAK,OAAO,MAAM,KAAK,iBAAY,SAAI,OAAO,EAAE,CAAC,QAAG,CAAC,EAAE;AAElE,aAAW,CAAC,MAAM,KAAK,KAAK,SAAS;AACnC,UAAM,IAAI,iBAAiB,IAAI;AAC/B,UAAM,YAAY,MAAM,cAAc,IAAI,WAAW,GAAG,MAAM,SAAS;AACvE,UAAM,UAAU,WAAW,MAAM,WAAW;AAC5C,UAAM;AAAA,MACJ,KAAK,OAAO,MAAM,KAAK,QAAG,CAAC,IAAI,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,OAAO,GAAG,KAAK,OAAO,EAAE,CAAC,CAAC,IAAI,OAAO,MAAM,KAAK,UAAU,OAAO,EAAE,CAAC,CAAC,IAAI,OAAO,MAAM,KAAK,QAAQ,SAAS,CAAC,CAAC,CAAC,KAAK,OAAO,MAAM,KAAK,QAAG,CAAC;AAAA,IACjM;AAAA,EACF;AAEA,QAAM,KAAK,KAAK,OAAO,MAAM,KAAK,SAAI,SAAI,OAAO,EAAE,CAAC,QAAG,CAAC,EAAE;AAE1D,SAAO,MAAM,KAAK,IAAI;AACxB;AAIO,SAAS,iBAAiB,MAAkC;AACjE,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,OAAO,MAAM,OAAO,WAAW,KAAK,IAAI,EAAE,CAAC;AAEtD,aAAW,CAAC,MAAM,MAAM,KAAK,KAAK,WAAW;AAC3C,UAAM,IAAI,iBAAiB,IAAI;AAC/B,UAAM,SAAS,OAAO,gBAAgB,OAAO,UACzC,OAAO,MAAM,KAAK,MAAM,IACxB,OAAO,MAAM,OAAO,QAAQ;AAChC,UAAM,KAAK,OAAO,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,OAAO,GAAG,IAAI,CAAC,IAAI,MAAM,EAAE;AAAA,EACrE;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAIA,SAAS,WAAW,IAAoB;AACtC,MAAI,MAAM,IAAQ,QAAO,IAAI,KAAK,KAAQ,QAAQ,CAAC,CAAC;AACpD,MAAI,MAAM,IAAM,QAAO,IAAI,KAAK,KAAM,QAAQ,CAAC,CAAC;AAChD,SAAO,GAAG,EAAE;AACd;;;AC1LA,IAAM,aAAa,oBAAI,IAAI,CAAC,QAAQ,cAAc,CAAC;AACnD,IAAM,cAAc,oBAAI,IAAwB;AAChD,IAAI,eAAe;AAMnB,IAAI,oBAAoB;AAEjB,SAAS,kBAAwB;AACtC,MAAI,qBAAqB,EAAG;AAC5B,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,mBAAmB,KAAK;AAC1C,WAAO;AACP,QAAI,IAAI,oBAAoB,GAAG;AAC7B,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACP,UAAQ,OAAO,MAAM,GAAG;AACxB,sBAAoB;AACtB;AAEA,SAAS,eAAe,OAAuB;AAC7C,kBAAgB;AAChB,MAAI,MAAM,WAAW,EAAG;AACxB,UAAQ,OAAO,MAAM,MAAM,KAAK,IAAI,IAAI,IAAI;AAC5C,sBAAoB,MAAM;AAC5B;AAIO,SAAS,UAAU,YAAoB,MAAc,MAAiB;AAC3E,cAAY,IAAI,YAAY,EAAE,YAAY,MAAM,MAAM,WAAW,KAAK,IAAI,EAAE,CAAC;AAG7E,MAAI,SAAS,UAAU,MAAM,OAAO;AAClC,mBAAe,YAAY,KAAK,OAAO,KAAK,UAAU,EAAE;AAAA,EAC1D,WAAW,SAAS,kBAAkB,MAAM,IAAI;AAC9C,sBAAkB,YAAY,KAAK,IAAI,KAAK,QAAQ,EAAE;AAAA,EACxD;AACF;AAIO,SAAS,QAAQ,YAAoB,SAAc,SAAwB;AAChF,QAAM,OAAO,YAAY,IAAI,UAAU;AACvC,cAAY,OAAO,UAAU;AAC7B,MAAI,CAAC,KAAM;AAEX,kBAAgB;AAGhB,MAAI,KAAK,SAAS,QAAQ;AACxB,UAAM,UAAU,aAAa,UAAU;AACvC,QAAI,SAAS;AACX,cAAQ,OAAO,MAAM,qBAAqB,QAAQ,WAAW,QAAQ,SAAS,OAAO,IAAI,IAAI;AAAA,IAC/F;AACA;AAAA,EACF;AAEA,MAAI,KAAK,SAAS,gBAAgB;AAChC,UAAM,UAAU,gBAAgB,YAAY,CAAC,OAAO;AACpD,QAAI,SAAS;AACX,cAAQ,OAAO,MAAM,kBAAkB,QAAQ,IAAI,QAAQ,MAAM,QAAQ,WAAW,QAAQ,OAAO,IAAI,IAAI;AAC3G,UAAI,QAAQ,WAAW;AACrB,gBAAQ,OAAO,MAAM,iBAAiB,QAAQ,EAAE,IAAI,IAAI;AAAA,MAC1D;AAAA,IACF;AACA;AAAA,EACF;AAGA,QAAM,UAAU,KAAK,IAAI,IAAI,KAAK;AAClC,QAAM,UAAUC,YAAW,OAAO;AAClC,QAAM,SAAS,UACX,OAAO,MAAM,OAAO,QAAG,IACvB,OAAO,MAAM,SAAS,QAAG;AAC7B,QAAM,QAAQ,gBAAgB,KAAK,MAAM,KAAK,IAAI;AAClD,QAAM,YAAY,iBAAiB,KAAK,MAAM,KAAK,IAAI;AACvD,UAAQ,OAAO,MAAM,KAAK,MAAM,IAAI,OAAO,WAAW,KAAK,IAAI,CAAC,IAAI,OAAO,MAAM,KAAK,KAAK,CAAC,IAAI,OAAO,MAAM,KAAK,OAAO,CAAC;AAAA,CAAI;AAChI;AAKO,SAAS,kBAAwB;AACtC,kBAAgB,eAAe,KAAK,IAAI,QAAQ;AAChD,QAAM,QAAkB,CAAC;AAGzB,MAAI,eAAe,GAAG;AACpB,UAAM,KAAK,GAAG,gBAAgB,YAAY,CAAC;AAAA,EAC7C;AAGA,QAAM,eAAe,MAAM,KAAK,YAAY,OAAO,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,IAAI,CAAC;AAC3F,aAAW,KAAK,cAAc;AAC5B,UAAM,UAAU,KAAK,IAAI,IAAI,EAAE;AAC/B,UAAM,UAAUA,YAAW,OAAO;AAClC,UAAM,QAAQ,gBAAgB,EAAE,MAAM,EAAE,IAAI;AAC5C,UAAM,eAAe,iBAAiB,EAAE,MAAM,EAAE,IAAI;AACpD,UAAM,UAAU,OAAO,cAAc,IAAI,QAAQ,YAAY,CAAE;AAC/D,UAAM,KAAK,KAAK,OAAO,IAAI,OAAO,cAAc,EAAE,IAAI,CAAC,IAAI,OAAO,MAAM,KAAK,KAAK,CAAC,IAAI,OAAO,MAAM,KAAK,OAAO,CAAC,EAAE;AAAA,EACrH;AAEA,iBAAe,KAAK;AACtB;AAEO,SAAS,gBAAyB;AACvC,SAAO,YAAY,OAAO;AAC5B;AAIA,SAAS,iBAAiB,MAAc,MAAmB;AACzD,MAAI,SAAS,UAAU,MAAM,MAAO,QAAO,iBAAiB,KAAK,KAAK;AACtE,MAAI,SAAS,kBAAkB,MAAM,GAAI,QAAO,iBAAiB,KAAK,EAAE;AACxE,SAAO,MAAM;AACf;AAEA,SAAS,gBAAgB,MAAc,MAAmB;AACxD,MAAI,CAAC,KAAM,QAAO;AAElB,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,SAAS,KAAK,QAAQ,KAAK,aAAa,IAAI,EAAE;AAAA,IACvD,KAAK;AACH,aAAO,SAAS,KAAK,QAAQ,KAAK,aAAa,IAAI,EAAE;AAAA,IACvD,KAAK;AACH,aAAO,SAAS,KAAK,QAAQ,KAAK,aAAa,IAAI,EAAE;AAAA,IACvD,KAAK;AACH,aAAO,SAAS,KAAK,WAAW,IAAI,EAAE;AAAA,IACxC,KAAK;AACH,aAAO,SAAS,KAAK,WAAW,IAAI,EAAE;AAAA,IACxC,KAAK;AACH,aAAO,SAAS,IAAI,KAAK,WAAW,EAAE,KAAK,KAAK,QAAQ,EAAE,IAAI,EAAE;AAAA,IAClE,KAAK;AACH,aAAO,SAAS,KAAK,QAAQ,IAAI,EAAE;AAAA,IACrC,KAAK;AACH,aAAO,SAAS,IAAI,KAAK,SAAS,EAAE,KAAK,EAAE;AAAA,IAC7C,KAAK;AACH,aAAO,SAAS,KAAK,aAAa,KAAK,QAAQ,IAAI,EAAE;AAAA,IACvD,KAAK;AACH,aAAO,SAAS,GAAG,KAAK,SAAS,SAAS,IAAI,KAAK,OAAO,EAAE,IAAI,EAAE;AAAA,IACpE;AACE,iBAAW,KAAK,OAAO,OAAO,IAAI,GAAG;AACnC,YAAI,OAAO,MAAM,YAAY,EAAE,SAAS,GAAG;AACzC,iBAAO,SAAS,GAAG,EAAE;AAAA,QACvB;AAAA,MACF;AACA,aAAO;AAAA,EACX;AACF;AAEA,SAAS,SAAS,GAAW,KAAqB;AAChD,MAAI,EAAE,UAAU,IAAK,QAAO;AAC5B,SAAO,EAAE,MAAM,GAAG,MAAM,CAAC,IAAI;AAC/B;AAEA,SAASA,YAAW,IAAoB;AACtC,MAAI,MAAM,IAAQ,QAAO,IAAI,KAAK,KAAQ,QAAQ,CAAC,CAAC;AACpD,MAAI,MAAM,IAAM,QAAO,IAAI,KAAK,KAAM,QAAQ,CAAC,CAAC;AAChD,SAAO,GAAG,EAAE;AACd;;;ACnLO,SAAS,eAAe,OAAqB;AAClD,UAAQ,OAAO,MAAM,KAAK;AAC5B;AAGO,SAAS,mBAAmB,OAAqB;AACtD,UAAQ,OAAO,MAAM,OAAO,MAAM,UAAU,KAAK,CAAC;AACpD;AAGO,SAAS,cAAoB;AAClC,UAAQ,OAAO,MAAM,MAAM,QAAQ,IAAI;AACzC;AAQO,SAAS,sBAA4B;AAC1C,UAAQ,OAAO,MAAM,IAAI;AAC3B;AAQO,SAAS,WAAW,SAAuB;AAChD,UAAQ,OAAO,MAAM,GAAG,OAAO,MAAM,OAAO,OAAO,CAAC,KAAK,OAAO;AAAA,CAAI;AACtE;AAGO,SAAS,UAAU,SAAuB;AAC/C,UAAQ,OAAO,MAAM,GAAG,OAAO,MAAM,KAAK,OAAO,CAAC;AAAA,CAAI;AACxD;AAGO,SAAS,YAAY,OAAe,WAAyB;AAClE,UAAQ,OAAO;AAAA,IACb,GAAG,OAAO,MAAM,QAAQ,IAAI,CAAC,IAAI,OAAO,MAAM,KAAK,KAAK,CAAC,IAAI,OAAO,MAAM,KAAK,WAAW,SAAS,EAAE,CAAC;AAAA,EACnG,OAAO,MAAM,KAAK,8DAA8D,CAAC;AAAA;AAAA;AAAA,EACtF;AACF;;;AChDA,YAAYC,SAAQ;AACpB,YAAYC,WAAU;AAqBtB,SAAS,iBAAyB;AAChC,QAAM,MAAW,WAAK,cAAc,GAAG,UAAU;AACjD,YAAU,GAAG;AACb,SAAO;AACT;AAEO,SAAS,oBAA4B;AAC1C,QAAM,MAAM,oBAAI,KAAK;AACrB,QAAM,OAAO,IAAI,YAAY,EAAE,MAAM,GAAG,EAAE;AAC1C,QAAM,OAAO,IAAI,YAAY,EAAE,MAAM,IAAI,EAAE,EAAE,QAAQ,MAAM,EAAE;AAC7D,QAAM,OAAO,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC;AAClD,SAAO,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI;AAChC;AAEO,SAAS,YAAY,WAAmB,OAA2B;AACxE,QAAM,cAAc,eAAe;AACnC,QAAM,WAAgB,WAAK,aAAa,GAAG,SAAS,QAAQ;AAC5D,EAAG,mBAAe,UAAU,KAAK,UAAU,KAAK,IAAI,MAAM,OAAO;AACnE;AAEO,SAAS,YAAY,WAAmC;AAC7D,QAAM,WAAgB,WAAK,eAAe,GAAG,GAAG,SAAS,QAAQ;AACjE,MAAI,CAAI,eAAW,QAAQ,EAAG,QAAO,CAAC;AAEtC,SACG,iBAAa,UAAU,OAAO,EAC9B,KAAK,EACL,MAAM,IAAI,EACV,OAAO,OAAO,EACd,IAAI,CAAC,SAAS,KAAK,MAAM,IAAI,CAAC;AACnC;AAEO,SAAS,eAA8B;AAC5C,QAAM,MAAM,eAAe;AAC3B,MAAI,CAAI,eAAW,GAAG,EAAG,QAAO,CAAC;AAEjC,SACG,gBAAY,GAAG,EACf,OAAO,CAAC,MAAM,EAAE,SAAS,QAAQ,CAAC,EAClC,IAAI,CAAC,MAAM;AACV,UAAM,WAAgB,WAAK,KAAK,CAAC;AACjC,UAAM,OAAU,aAAS,QAAQ;AACjC,UAAM,UAAa,iBAAa,UAAU,OAAO,EAAE,KAAK;AACxD,UAAM,QAAQ,QAAQ,MAAM,IAAI,EAAE,OAAO,OAAO;AAChD,UAAM,YAAY,MAAM,KAAK,CAAC,MAAM;AAClC,UAAI;AACF,eAAO,KAAK,MAAM,CAAC,EAAE,SAAS;AAAA,MAChC,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AACD,QAAI,UAAU;AACd,QAAI,WAAW;AACb,UAAI;AACF,cAAM,SAAS,KAAK,MAAM,SAAS;AACnC,mBAAW,OAAO,WAAW,IAAI,MAAM,GAAG,EAAE;AAC5C,aAAK,OAAO,WAAW,IAAI,SAAS,GAAI,YAAW;AAAA,MACrD,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,WAAO;AAAA,MACL,IAAI,EAAE,QAAQ,UAAU,EAAE;AAAA,MAC1B,SAAS,KAAK;AAAA,MACd,YAAY,KAAK;AAAA,MACjB,OAAO,MAAM;AAAA,MACb;AAAA,IACF;AAAA,EACF,CAAC,EACA,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,UAAU;AAC/C;AAEO,SAAS,qBAAoC;AAClD,QAAM,WAAW,aAAa;AAC9B,SAAO,SAAS,SAAS,IAAI,SAAS,CAAC,EAAG,KAAK;AACjD;AAEO,SAAS,kBAAkB,UAAiC;AACjE,MAAI,SAAS,WAAW,EAAG,QAAO;AAElC,QAAM,QAAQ,SAAS,IAAI,CAAC,MAAM;AAChC,UAAM,MAAM,UAAU,KAAK,IAAI,IAAI,EAAE,UAAU;AAC/C,WAAO,KAAK,EAAE,EAAE,KAAK,GAAG,UAAU,EAAE,KAAK,aAAa,EAAE,OAAO;AAAA,EACjE,CAAC;AAED,SAAO;AAAA,EAAc,MAAM,KAAK,IAAI,CAAC;AACvC;AAEA,SAAS,UAAU,IAAoB;AACrC,QAAM,OAAO,KAAK,MAAM,KAAK,GAAK;AAClC,MAAI,OAAO,GAAI,QAAO,GAAG,IAAI;AAC7B,QAAM,QAAQ,KAAK,MAAM,OAAO,EAAE;AAClC,MAAI,QAAQ,GAAI,QAAO,GAAG,KAAK;AAC/B,QAAM,OAAO,KAAK,MAAM,QAAQ,EAAE;AAClC,SAAO,GAAG,IAAI;AAChB;;;AC5GO,SAAS,gBAAgB,OAA+B;AAC7D,QAAM,OAAO,QAAQ,OAAO,WAAW;AAEvC,QAAM,QAAQ,OAAO,MAAM,QAAQ,MAAM,KAAK;AAC9C,QAAM,SAAS,MAAM,cAAc,IAC/B,OAAO,MAAM,KAAK,IAAI,aAAa,MAAM,WAAW,CAAC,SAAS,IAC9D;AACJ,QAAM,OAAO,MAAM,YAAY,IAC3B,OAAO,MAAM,KAAK,KAAK,MAAM,UAAU,QAAQ,CAAC,CAAC,EAAE,IACnD;AACJ,QAAM,YAAY,MAAM,cACpB,OAAO,MAAM,QAAQ,SAAI,IACzB,OAAO,MAAM,OAAO,SAAI;AAE5B,SAAO,GAAG,SAAS,IAAI,KAAK,GAAG,MAAM,GAAG,IAAI;AAC9C;AAEA,SAAS,aAAa,GAAmB;AACvC,MAAI,KAAK,IAAW,QAAO,IAAI,IAAI,KAAW,QAAQ,CAAC,CAAC;AACxD,MAAI,KAAK,IAAO,QAAO,IAAI,IAAI,KAAO,QAAQ,CAAC,CAAC;AAChD,SAAO,GAAG,CAAC;AACb;;;APrBA,eAAsB,aAAa,QAAgB,cAA4B,WAAkC;AAC/G,QAAM,YAAY,kBAAkB;AAGpC,QAAM,QAAQ,CAAC,GAAI,aAAa,SAAS,CAAC,GAAI,iBAAwB,cAAqB;AAE3F,MAAI;AACJ,MAAI;AACF,YAAQ,MAAM,YAAY,EAAE,GAAG,cAAc,MAAM,CAAC;AAAA,EACtD,SAAS,KAAU;AACjB,eAAW,IAAI,WAAW,OAAO,GAAG,CAAC;AACrC,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,MAAI,cAAc;AAClB,MAAI,YAAY;AAChB,MAAI,WAAW;AACf,MAAI,eAAe;AACnB,MAAI,gBAAgB;AAGpB,cAAY,WAAW,EAAE,MAAM,QAAQ,SAAS,QAAQ,WAAW,KAAK,IAAI,EAAE,CAAC;AAG/E,QAAM,UAAU,CAAC,UAAsB;AACrC,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK,kBAAkB;AACrB,cAAM,IAAI,MAAM;AAChB,YAAI,EAAE,SAAS,cAAc;AAC3B,cAAI,cAAc;AAChB,2BAAe;AACf,wBAAY;AAAA,UACd;AACA,cAAI,CAAC,UAAU;AACb,4BAAgB;AAAA,UAClB;AACA,qBAAW;AACX,yBAAe,EAAE,KAAK;AACtB,2BAAiB,EAAE;AAAA,QACrB,WAAW,EAAE,SAAS,kBAAkB;AACtC,yBAAe;AACf,6BAAmB,EAAE,KAAK;AAAA,QAC5B,WAAW,EAAE,SAAS,gBAAgB;AACpC,cAAI,cAAc;AAChB,2BAAe;AACf,wBAAY;AAAA,UACd;AAAA,QACF,WAAW,EAAE,SAAS,SAAS;AAC7B,gBAAM,SAAU,EAAU,OAAO,gBAAgB;AACjD,qBAAW,MAAM;AAAA,QACnB;AACA;AAAA,MACF;AAAA,MAEA,KAAK,eAAe;AAElB,cAAM,MAAM,MAAM;AAClB,YAAI,KAAK,SAAS,eAAe,KAAK,eAAe,SAAS;AAC5D,gBAAM,SAAS,IAAI,gBAAgB;AACnC,qBAAW,MAAM;AAAA,QACnB;AACA;AAAA,MACF;AAAA,MAEA,KAAK,YAAY;AACf,YAAI,UAAU;AACZ,8BAAoB;AACpB,qBAAW;AAAA,QACb;AAEA,cAAM,MAAM,MAAM;AAClB,YAAI,KAAK,OAAO;AACd,yBAAe,IAAI,MAAM,eAAe;AACxC,uBAAa,IAAI,MAAM,MAAM,SAAS;AAAA,QACxC;AAEA,YAAI,eAAe;AACjB,sBAAY,WAAW,EAAE,MAAM,aAAa,SAAS,eAAe,WAAW,KAAK,IAAI,EAAE,CAAC;AAC3F,0BAAgB;AAAA,QAClB;AACA;AAAA,MACF;AAAA,MAEA,KAAK,wBAAwB;AAC3B,kBAAU,MAAM,YAAY,MAAM,UAAU,MAAM,IAAI;AACtD,oBAAY,WAAW;AAAA,UACrB,MAAM;AAAA,UACN,MAAM,MAAM;AAAA,UACZ,MAAM,MAAM;AAAA,UACZ,WAAW,KAAK,IAAI;AAAA,QACtB,CAAC;AACD;AAAA,MACF;AAAA,MAEA,KAAK,sBAAsB;AACzB,gBAAQ,MAAM,YAAY,MAAM,QAAQ,MAAM,OAAO;AACrD,cAAM,aAAa,kBAAkB,MAAM,MAAM;AACjD,oBAAY,WAAW;AAAA,UACrB,MAAM;AAAA,UACN,MAAM,MAAM;AAAA,UACZ,QAAQ,WAAW,MAAM,GAAG,GAAG;AAAA,UAC/B,SAAS,MAAM;AAAA,UACf,WAAW,KAAK,IAAI;AAAA,QACtB,CAAC;AACD;AAAA,MACF;AAAA,MAEA,KAAK,aAAa;AAChB,cAAM,MAAM,gBAAgB;AAAA,UAC1B,OAAO;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,UACA,aAAa;AAAA,QACf,CAAC;AACD,gBAAQ,OAAO,MAAM;AAAA,EAAK,GAAG;AAAA,CAAI;AAEjC,cAAM,eAAe,mBAAmB;AACxC,YAAI,cAAc;AAChB,kBAAQ,OAAO,MAAM,GAAG,YAAY;AAAA,CAAI;AAAA,QAC1C;AACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAGD,MAAI;AACF,UAAM,MAAM,OAAO,MAAM;AACzB,UAAM,MAAM,YAAY;AAAA,EAC1B,SAAS,KAAU;AACjB,QAAI,IAAI,SAAS,cAAc;AAC7B,cAAQ,OAAO,MAAM;AAAA,EAAK,OAAO,MAAM,KAAK,WAAW,CAAC;AAAA,CAAI;AAAA,IAC9D,OAAO;AACL,iBAAW,IAAI,WAAW,OAAO,GAAG,CAAC;AAAA,IACvC;AAAA,EACF,UAAE;AACA,UAAM,QAAQ;AAAA,EAChB;AACF;AAEA,SAAS,kBAAkB,QAAqB;AAC9C,MAAI,CAAC,OAAQ,QAAO;AACpB,MAAI,OAAO,WAAW,SAAU,QAAO;AACvC,MAAI,OAAO,WAAW,MAAM,QAAQ,OAAO,OAAO,GAAG;AACnD,WAAO,OAAO,QACX,OAAO,CAAC,MAAW,EAAE,SAAS,MAAM,EACpC,IAAI,CAAC,MAAW,EAAE,IAAI,EACtB,KAAK,IAAI;AAAA,EACd;AACA,SAAO,KAAK,UAAU,MAAM,EAAE,MAAM,GAAG,GAAG;AAC5C;;;AQlKA,SAAS,eAAAC,oBAAqD;;;ACA9D,YAAY,cAAc;AAQ1B,IAAM,cAAc;AACpB,IAAM,UAAoB,CAAC;AAC3B,IAAI,KAAgC;AAE7B,SAAS,YAAY,MAA+D;AACzF,OAAc,yBAAgB;AAAA,IAC5B,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,IAChB,QAAQ,OAAO,MAAM,cAAc,MAAM,MAAM,IAAI;AAAA,IACnD,aAAa;AAAA,IACb,UAAU;AAAA,EACZ,CAAC;AAED,KAAG,GAAG,QAAQ,CAAC,SAAS;AACtB,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,CAAC,SAAS;AACZ,UAAI,OAAO;AACX;AAAA,IACF;AACA,YAAQ,KAAK,OAAO;AACpB,SAAK,SAAS,OAAO;AAAA,EACvB,CAAC;AAED,KAAG,GAAG,SAAS,MAAM;AACnB,SAAK,QAAQ;AAAA,EACf,CAAC;AAGD,KAAG,GAAG,UAAU,MAAM;AACpB,SAAK,QAAQ;AAAA,EACf,CAAC;AAED,SAAO;AAAA,IACL,QAAQ,MAAM;AACZ,UAAI,OAAO;AAAA,IACb;AAAA,IACA,OAAO,MAAM;AACX,UAAI,MAAM;AACV,WAAK;AAAA,IACP;AAAA,EACF;AACF;AAGO,SAAS,aAAmB;AACjC,MAAI,IAAI;AAEN,YAAQ,OAAO,MAAM,UAAU;AAAA,EACjC;AACF;;;ADxCA,eAAsB,mBAAmB,cAA4B,WAAmB,iBAAyC;AAC/H,QAAM,YAAY,mBAAmB,kBAAkB;AACvD,QAAM,QAAQ;AAGd,QAAM,QAAQ,CAAC,GAAI,aAAa,SAAS,CAAC,GAAI,iBAAwB,cAAqB;AAE3F,MAAI;AACJ,MAAI;AACF,YAAQ,MAAMC,aAAY,EAAE,GAAG,cAAc,MAAM,CAAC;AAAA,EACtD,SAAS,KAAU;AACjB,eAAW,IAAI,WAAW,OAAO,GAAG,CAAC;AACrC,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,MAAI,cAAc;AAClB,MAAI,YAAY;AAChB,MAAI,WAAW;AACf,MAAI,eAAe;AACnB,MAAI,YAAY;AAChB,MAAI,gBAAgB;AACpB,MAAI,kBAAyD;AAG7D,MAAI,iBAAiB;AACnB,UAAM,SAAS,YAAY,eAAe;AAC1C,QAAI,OAAO,SAAS,GAAG;AACrB,gBAAU,oBAAoB,eAAe,KAAK,OAAO,MAAM,UAAU;AACzE,iBAAW,SAAS,QAAQ;AAC1B,YAAI,MAAM,SAAS,UAAU,MAAM,SAAS;AAC1C,gBAAM,SAAS;AAAA,YACb,MAAM;AAAA,YACN,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,MAAM,QAAQ,CAAC;AAAA,YAC/C,WAAW,MAAM;AAAA,UACnB,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,cAAY,OAAO,SAAS;AAG5B,QAAM,UAAU,CAAC,UAAsB;AACrC,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK,kBAAkB;AACrB,cAAM,IAAI,MAAM;AAChB,YAAI,EAAE,SAAS,cAAc;AAC3B,cAAI,cAAc;AAChB,2BAAe;AACf,wBAAY;AAAA,UACd;AACA,cAAI,CAAC,UAAU;AACb,4BAAgB;AAAA,UAClB;AACA,qBAAW;AACX,yBAAe,EAAE,KAAK;AACtB,2BAAiB,EAAE;AAAA,QACrB,WAAW,EAAE,SAAS,kBAAkB;AACtC,cAAI,CAAC,cAAc;AACjB,4BAAgB;AAChB,oBAAQ,OAAO,MAAM,OAAO,MAAM,UAAU,cAAc,CAAC;AAC3D,2BAAe;AAAA,UACjB;AACA,6BAAmB,EAAE,KAAK;AAAA,QAC5B,WAAW,EAAE,SAAS,gBAAgB;AACpC,cAAI,cAAc;AAChB,2BAAe;AACf,wBAAY;AAAA,UACd;AAAA,QACF;AACA;AAAA,MACF;AAAA,MAEA,KAAK,YAAY;AACf,YAAI,UAAU;AACZ,8BAAoB;AACpB,qBAAW;AAAA,QACb;AAEA,cAAM,MAAM,MAAM;AAClB,YAAI,KAAK,OAAO;AACd,yBAAe,IAAI,MAAM,eAAe;AACxC,uBAAa,IAAI,MAAM,MAAM,SAAS;AAAA,QACxC;AAEA,YAAI,eAAe;AACjB,sBAAY,WAAW,EAAE,MAAM,aAAa,SAAS,eAAe,WAAW,KAAK,IAAI,EAAE,CAAC;AAC3F,0BAAgB;AAAA,QAClB;AACA;AAAA,MACF;AAAA,MAEA,KAAK,wBAAwB;AAC3B,kBAAU,MAAM,YAAY,MAAM,UAAU,MAAM,IAAI;AACtD,oBAAY,WAAW;AAAA,UACrB,MAAM;AAAA,UACN,MAAM,MAAM;AAAA,UACZ,MAAM,MAAM;AAAA,UACZ,WAAW,KAAK,IAAI;AAAA,QACtB,CAAC;AACD;AAAA,MACF;AAAA,MAEA,KAAK,sBAAsB;AACzB,gBAAQ,MAAM,YAAY,MAAM,QAAQ,MAAM,OAAO;AACrD,cAAM,aAAaC,mBAAkB,MAAM,MAAM;AACjD,oBAAY,WAAW;AAAA,UACrB,MAAM;AAAA,UACN,MAAM,MAAM;AAAA,UACZ,QAAQ,WAAW,MAAM,GAAG,GAAG;AAAA,UAC/B,SAAS,MAAM;AAAA,UACf,WAAW,KAAK,IAAI;AAAA,QACtB,CAAC;AACD;AAAA,MACF;AAAA,MAEA,KAAK,aAAa;AAChB,oBAAY;AACZ,oBAAY;AAEZ,cAAM,MAAM,gBAAgB;AAAA,UAC1B;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,aAAa;AAAA,QACf,CAAC;AACD,gBAAQ,OAAO,MAAM,GAAG,GAAG;AAAA,CAAI;AAE/B,cAAM,eAAe,mBAAmB;AACxC,YAAI,cAAc;AAChB,kBAAQ,OAAO,MAAM,GAAG,YAAY;AAAA,CAAI;AAAA,QAC1C;AAEA,cAAM,aAAa,iBAAiB,MAAM,IAAI;AAC9C,YAAI,YAAY;AACd,kBAAQ,OAAO,MAAM,GAAG,UAAU;AAAA,CAAI;AAAA,QACxC;AACA,gBAAQ,OAAO,MAAM,IAAI;AACzB,cAAM,OAAO;AACb;AAAA,MACF;AAAA,MAEA,KAAK,eAAe;AAClB,oBAAY;AACZ,qBAAa;AACb;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAGD,WAAS,eAAe;AACtB,QAAI,gBAAiB;AACrB,sBAAkB,YAAY,MAAM;AAClC,UAAI,cAAc,GAAG;AACnB,wBAAgB;AAAA,MAClB;AAAA,IACF,GAAG,GAAG;AAAA,EACR;AAEA,WAAS,cAAc;AACrB,QAAI,iBAAiB;AACnB,oBAAc,eAAe;AAC7B,wBAAkB;AAClB,sBAAgB;AAAA,IAClB;AAAA,EACF;AAGA,WAAS,mBAAmBC,QAAwB;AAClD,UAAM,CAAC,KAAK,GAAG,IAAI,IAAIA,OAAM,MAAM,CAAC,EAAE,MAAM,KAAK;AACjD,UAAM,MAAM,KAAK,KAAK,GAAG;AAEzB,YAAQ,KAAK;AAAA,MACX,KAAK;AACH,kBAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAOW;AACrB,eAAO;AAAA,MAET,KAAK;AACH,gBAAQ,OAAO,MAAM,kBAAkB,aAAa,CAAC,IAAI,IAAI;AAC7D,eAAO;AAAA,MAET,KAAK,UAAU;AACb,cAAM,MAAM,gBAAgB;AAAA,UAC1B;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,aAAa;AAAA,QACf,CAAC;AACD,gBAAQ,OAAO,MAAM,GAAG,GAAG;AAAA,CAAI;AAC/B,cAAM,aAAa,iBAAiB,MAAM,IAAI;AAC9C,YAAI,WAAY,SAAQ,OAAO,MAAM,GAAG,UAAU;AAAA,CAAI;AACtD,eAAO;AAAA,MACT;AAAA,MAEA,KAAK;AACH,cAAM,MAAM;AACZ,sBAAc;AACd,oBAAY;AACZ,kBAAU,uBAAuB;AACjC,eAAO;AAAA,MAET,KAAK;AACH,kBAAU,gDAAgD;AAC1D,kBAAU,0BAA0B;AACpC,kBAAU,4BAA4B;AACtC,kBAAU,uDAAuD;AACjE,eAAO;AAAA,MAET,KAAK;AAAA,MACL,KAAK;AACH,gBAAQ;AACR,eAAO;AAAA,MAET;AACE,mBAAW,qBAAqB,GAAG,sCAAsC;AACzE,eAAO;AAAA,IACX;AAAA,EACF;AAGA,QAAM,QAAQ,YAAY;AAAA,IACxB,UAAU,OAAO,SAAiB;AAEhC,UAAI,KAAK,WAAW,GAAG,GAAG;AACxB,cAAM,UAAU,mBAAmB,IAAI;AACvC,YAAI,SAAS;AACX,gBAAM,OAAO;AACb;AAAA,QACF;AAAA,MACF;AAEA,UAAI,WAAW;AAEb,kBAAU,qBAAqB;AAC/B,cAAM,MAAM;AAAA,UACV,MAAM;AAAA,UACN,SAAS,CAAC,EAAE,MAAM,QAAQ,KAAK,CAAC;AAAA,UAChC,WAAW,KAAK,IAAI;AAAA,QACtB,CAAC;AACD;AAAA,MACF;AAGA,iBAAW;AACX,kBAAY,WAAW,EAAE,MAAM,QAAQ,SAAS,MAAM,WAAW,KAAK,IAAI,EAAE,CAAC;AAE7E,UAAI;AACF,cAAM,MAAM,OAAO,IAAI;AACvB,cAAM,MAAM,YAAY;AAAA,MAC1B,SAAS,KAAU;AACjB,YAAI,IAAI,SAAS,cAAc;AAC7B,kBAAQ,OAAO,MAAM;AAAA,EAAK,OAAO,MAAM,KAAK,WAAW,CAAC;AAAA,CAAI;AAAA,QAC9D,OAAO;AACL,qBAAW,IAAI,WAAW,OAAO,GAAG,CAAC;AAAA,QACvC;AACA,cAAM,OAAO;AAAA,MACf;AAAA,IACF;AAAA,IACA,SAAS,MAAM;AACb,UAAI,WAAW;AACb,cAAM,MAAM;AACZ,oBAAY;AACZ,oBAAY;AACZ,gBAAQ,OAAO,MAAM;AAAA,EAAK,OAAO,MAAM,KAAK,WAAW,CAAC;AAAA,CAAI;AAC5D,cAAM,OAAO;AAAA,MACf,OAAO;AACL,gBAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF,CAAC;AAED,WAAS,UAAU;AACjB,gBAAY;AACZ,UAAM,QAAQ;AACd,UAAM,MAAM;AACZ,YAAQ,OAAO,MAAM;AAAA,EAAK,OAAO,MAAM,KAAK,kBAAkB,SAAS,EAAE,CAAC;AAAA,CAAI;AAC9E,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,UAAQ,GAAG,WAAW,OAAO;AAG7B,QAAM,OAAO;AACf;AAEA,SAASD,mBAAkB,QAAqB;AAC9C,MAAI,CAAC,OAAQ,QAAO;AACpB,MAAI,OAAO,WAAW,SAAU,QAAO;AACvC,MAAI,OAAO,WAAW,MAAM,QAAQ,OAAO,OAAO,GAAG;AACnD,WAAO,OAAO,QACX,OAAO,CAAC,MAAW,EAAE,SAAS,MAAM,EACpC,IAAI,CAAC,MAAW,EAAE,IAAI,EACtB,KAAK,IAAI;AAAA,EACd;AACA,SAAO,KAAK,UAAU,MAAM,EAAE,MAAM,GAAG,GAAG;AAC5C;;;AE7TA,SAAS,eAAAE,oBAAqD;;;ACF9D,OAAO,eAAe;AAkBf,SAAS,aAAa,MAAuC;AAClE,MAAI,KAAuB;AAC3B,MAAI,SAAS;AACb,MAAI,mBAAmB;AACvB,MAAI,iBAAuD;AAC3D,MAAI,eAAsD;AAC1D,QAAM,sBAAsB;AAC5B,QAAM,sBAAsB,KAAK,KAAK;AACtC,MAAI,mBAAmB,KAAK,IAAI;AAEhC,WAAS,UAAU;AACjB,QAAI,OAAQ;AAEZ,UAAM,QAAQ,GAAG,KAAK,UAAU,sBAAsB,mBAAmB,KAAK,SAAS,CAAC,SAAS,mBAAmB,KAAK,WAAW,CAAC;AACrI,SAAK,IAAI,UAAU,KAAK;AAExB,OAAG,GAAG,QAAQ,MAAM;AAClB,yBAAmB;AACnB,yBAAmB,KAAK,IAAI;AAG5B,qBAAe,YAAY,MAAM;AAC/B,YAAI,IAAI,eAAe,UAAU,MAAM;AACrC,aAAG,KAAK,KAAK,UAAU,EAAE,MAAM,OAAO,CAAC,CAAC;AAAA,QAC1C;AAAA,MACF,GAAG,GAAM;AAAA,IACX,CAAC;AAED,OAAG,GAAG,WAAW,CAAC,SAAyB;AACzC,UAAI;AACJ,UAAI;AACF,cAAM,KAAK,MAAM,KAAK,SAAS,CAAC;AAAA,MAClC,QAAQ;AACN;AAAA,MACF;AAEA,cAAQ,IAAI,MAAM;AAAA,QAChB,KAAK;AACH,eAAK,SAAS,IAAI,MAAM,IAAI,IAAI;AAChC;AAAA,QACF,KAAK;AACH,eAAK,SAAS,IAAI,KAAK;AACvB;AAAA,QACF,KAAK;AAEH;AAAA,QACF,KAAK;AACH,eAAK,QAAQ,IAAI,OAAO;AACxB;AAAA,MACJ;AAAA,IACF,CAAC;AAED,OAAG,GAAG,SAAS,CAAC,SAAiB;AAC/B,gBAAU;AACV,UAAI,OAAQ;AAGZ,UAAI,SAAS,KAAM;AACjB,aAAK,aAAa;AAClB;AAAA,MACF;AAEA,uBAAiB;AAAA,IACnB,CAAC;AAED,OAAG,GAAG,SAAS,CAAC,QAAe;AAE7B,UAAI,CAAC,QAAQ;AACX,gBAAQ,MAAM,4BAA4B,IAAI,OAAO,EAAE;AAAA,MACzD;AAAA,IACF,CAAC;AAAA,EACH;AAEA,WAAS,mBAAmB;AAC1B,QAAI,OAAQ;AAEZ,QAAI,KAAK,IAAI,IAAI,mBAAmB,qBAAqB;AACvD,WAAK,QAAQ,4BAA4B;AACzC,WAAK,aAAa;AAClB;AAAA,IACF;AAEA,UAAM,QAAQ,KAAK,IAAI,MAAO,KAAK,kBAAkB,mBAAmB;AACxE;AACA,qBAAiB,WAAW,SAAS,KAAK;AAAA,EAC5C;AAEA,WAAS,YAAY;AACnB,QAAI,cAAc;AAChB,oBAAc,YAAY;AAC1B,qBAAe;AAAA,IACjB;AAAA,EACF;AAEA,WAAS,KAAK,KAAa;AACzB,QAAI,IAAI,eAAe,UAAU,MAAM;AACrC,SAAG,KAAK,KAAK,UAAU,GAAG,CAAC;AAAA,IAC7B;AAAA,EACF;AAGA,UAAQ;AAER,SAAO;AAAA,IACL,aAAa,IAAY,MAAc;AACrC,WAAK,EAAE,MAAM,YAAY,MAAM,GAAG,CAAC;AAAA,IACrC;AAAA,IACA,WAAW,QAA4B;AACrC,WAAK,EAAE,MAAM,UAAU,OAAO,CAAC;AAAA,IACjC;AAAA,IACA,QAAQ;AACN,eAAS;AACT,gBAAU;AACV,UAAI,eAAgB,cAAa,cAAc;AAC/C,UAAI,IAAI;AACN,YAAI;AAAE,aAAG,MAAM,KAAM,gBAAgB;AAAA,QAAG,QAAQ;AAAA,QAAC;AAAA,MACnD;AAAA,IACF;AAAA,EACF;AACF;;;ADzHA,OAAO,YAAY;AAEnB,IAAM,eAAe;AACrB,IAAM,eAAe,QAAQ,IAAI,uBAAuB;AACxD,IAAM,cAAc;AAEpB,SAAS,sBAA8B;AACrC,SAAO,OAAO,OAAO,UAAU,KAAM,IAAI,CAAC;AAC5C;AAEA,SAAS,eAAe,MAAsB;AAC5C,MAAI,KAAK,UAAU,YAAa,QAAO;AACvC,SAAO,KAAK,MAAM,GAAG,cAAc,EAAE,IAAI;AAC3C;AAEA,eAAsB,WAAW,cAA4B,WAAkC;AAC7F,QAAM,YAAY,kBAAkB;AACpC,QAAM,cAAc,oBAAoB;AACxC,QAAM,QAAQ;AAGd,QAAM,QAAQ,CAAC,GAAI,aAAa,SAAS,CAAC,GAAI,iBAAwB,cAAqB;AAC3F,MAAI;AACJ,MAAI;AACF,YAAQ,MAAMC,aAAY,EAAE,GAAG,cAAc,MAAM,CAAC;AAAA,EACtD,SAAS,KAAU;AACjB,eAAW,IAAI,WAAW,OAAO,GAAG,CAAC;AACrC,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,MAAI,cAAc;AAClB,MAAI,YAAY;AAChB,MAAI,WAAW;AACf,MAAI,eAAe;AACnB,MAAI,YAAY;AAChB,MAAI,gBAAgB;AACpB,MAAI,mBAAmB;AACvB,MAAI,cAAc;AAClB,MAAI,kBAAyD;AAC7D,MAAI;AAGJ,UAAQ,OAAO,MAAM,IAAI;AACzB,UAAQ,OAAO,MAAM,OAAO,MAAM,MAAM,OAAO,IAAI,OAAO,MAAM,KAAK;AAAA,CAAsB,CAAC;AAC5F,UAAQ,OAAO,MAAM,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,MAAM,YAAY,KAAK,IAAI,IAAI;AAC5F,UAAQ,OAAO,MAAM,OAAO,MAAM,KAAK,aAAa,IAAI,YAAY,IAAI;AACxE,UAAQ,OAAO,MAAM,IAAI;AACzB,UAAQ,OAAO,MAAM,OAAO,MAAM,cAAc,WAAW,WAAW,QAAQ,YAAY;AAAA,CAAe,CAAC;AAC1G,UAAQ,OAAO,MAAM,OAAO,MAAM,KAAK;AAAA,CAAoB,CAAC;AAC5D,UAAQ,OAAO,MAAM,IAAI;AAGzB,QAAM,UAAU,CAAC,UAAsB;AACrC,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK,kBAAkB;AACrB,cAAM,IAAI,MAAM;AAChB,YAAI,EAAE,SAAS,cAAc;AAC3B,cAAI,cAAc;AAChB,2BAAe;AACf,wBAAY;AAAA,UACd;AACA,qBAAW;AACX,yBAAe,EAAE,KAAK;AACtB,2BAAiB,EAAE;AAAA,QACrB,WAAW,EAAE,SAAS,kBAAkB;AACtC,cAAI,CAAC,cAAc;AACjB,oBAAQ,OAAO,MAAM,OAAO,MAAM,UAAU,cAAc,CAAC;AAC3D,2BAAe;AAAA,UACjB;AACA,6BAAmB,EAAE,KAAK;AAAA,QAC5B,WAAW,EAAE,SAAS,gBAAgB;AACpC,cAAI,cAAc;AAChB,2BAAe;AACf,wBAAY;AAAA,UACd;AAAA,QACF;AACA;AAAA,MACF;AAAA,MAEA,KAAK,YAAY;AACf,YAAI,UAAU;AACZ,8BAAoB;AACpB,qBAAW;AAAA,QACb;AACA,cAAM,MAAM,MAAM;AAClB,YAAI,KAAK,OAAO;AACd,yBAAe,IAAI,MAAM,eAAe;AACxC,uBAAa,IAAI,MAAM,MAAM,SAAS;AAAA,QACxC;AACA,YAAI,eAAe;AACjB,sBAAY,WAAW,EAAE,MAAM,aAAa,SAAS,eAAe,WAAW,KAAK,IAAI,EAAE,CAAC;AAAA,QAC7F;AACA;AAAA,MACF;AAAA,MAEA,KAAK,wBAAwB;AAC3B,kBAAU,MAAM,YAAY,MAAM,UAAU,MAAM,IAAI;AACtD,oBAAY,WAAW;AAAA,UACrB,MAAM;AAAA,UACN,MAAM,MAAM;AAAA,UACZ,MAAM,MAAM;AAAA,UACZ,WAAW,KAAK,IAAI;AAAA,QACtB,CAAC;AACD;AAAA,MACF;AAAA,MAEA,KAAK,sBAAsB;AACzB,gBAAQ,MAAM,YAAY,MAAM,QAAQ,MAAM,OAAO;AACrD;AAAA,MACF;AAAA,MAEA,KAAK,aAAa;AAChB,oBAAY;AACZ,oBAAY;AAGZ,2BAAmB;AACnB,YAAI,eAAe,eAAe;AAChC,gBAAM,aAAa,aAAa,eAAe,aAAa,CAAC;AAAA,QAC/D;AACA,wBAAgB;AAGhB,cAAM,MAAM,gBAAgB;AAAA,UAC1B;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,aAAa;AAAA,QACf,CAAC;AACD,gBAAQ,OAAO,MAAM,GAAG,GAAG;AAAA;AAAA,CAAM;AACjC,cAAM,WAAW,MAAM;AACvB;AAAA,MACF;AAAA,MAEA,KAAK,eAAe;AAClB,oBAAY;AACZ,qBAAa;AACb,cAAM,WAAW,SAAS;AAC1B;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAGD,WAAS,eAAe;AACtB,QAAI,gBAAiB;AACrB,sBAAkB,YAAY,MAAM;AAClC,UAAI,cAAc,GAAG;AACnB,wBAAgB;AAAA,MAClB;AAAA,IACF,GAAG,GAAG;AAAA,EACR;AAEA,WAAS,cAAc;AACrB,QAAI,iBAAiB;AACnB,oBAAc,eAAe;AAC7B,wBAAkB;AAClB,sBAAgB;AAAA,IAClB;AAAA,EACF;AAGA,WAAS,iBAAiB,MAAuB;AAC/C,UAAM,MAAM,KAAK,YAAY,EAAE,KAAK;AAEpC,QAAI,QAAQ,SAAS;AACnB,UAAI,oBAAoB,aAAa;AACnC,cAAM,aAAa,aAAa,gBAAgB;AAAA,MAClD,WAAW,aAAa;AACtB,cAAM,aAAa,aAAa,+BAA+B;AAAA,MACjE;AACA,aAAO;AAAA,IACT;AAEA,QAAI,QAAQ,WAAW;AACrB,UAAI,aAAa;AACf,cAAM,SAAS,YAAY,eAAe;AAC1C,cAAM,aAAa,aAAa,WAAW,MAAM;AAAA,UAAa,WAAW;AAAA,SAAY,UAAU,QAAQ,CAAC,CAAC,EAAE;AAAA,MAC7G;AACA,aAAO;AAAA,IACT;AAEA,QAAI,QAAQ,UAAU;AACpB,YAAM,MAAM;AACZ,oBAAc;AACd,kBAAY;AACZ,yBAAmB;AACnB,UAAI,YAAa,OAAM,aAAa,aAAa,uBAAuB;AACxE,gBAAU,iCAAiC;AAC3C,aAAO;AAAA,IACT;AAEA,QAAI,QAAQ,SAAS;AACnB,UAAI,YAAa,OAAM,aAAa,aAAa,gBAAgB;AACjE,cAAQ;AACR,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAGA,UAAQ,aAAa;AAAA,IACnB;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IAEZ,UAAU,OAAO,MAAc,SAAiB;AAC9C,cAAQ,OAAO,MAAM,OAAO,MAAM,YAAY;AAAA,cAAiB,IAAI,IAAI,IAAI,OAAO,MAAM;AACxF,kBAAY,WAAW,EAAE,MAAM,QAAQ,SAAS,SAAS,IAAI,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;AAGxF,UAAI,KAAK,WAAW,GAAG,GAAG;AACxB,YAAI,iBAAiB,IAAI,EAAG;AAAA,MAC9B;AAEA,UAAI,WAAW;AACb,kBAAU,6BAA6B;AACvC,cAAM,MAAM;AAAA,UACV,MAAM;AAAA,UACN,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,CAAC;AAAA,UACtC,WAAW,KAAK,IAAI;AAAA,QACtB,CAAC;AACD;AAAA,MACF;AAEA,UAAI;AACF,cAAM,MAAM,OAAO,IAAI;AACvB,cAAM,MAAM,YAAY;AAAA,MAC1B,SAAS,KAAU;AACjB,YAAI,IAAI,SAAS,cAAc;AAC7B,kBAAQ,OAAO,MAAM;AAAA,EAAK,OAAO,MAAM,KAAK,WAAW,CAAC;AAAA,CAAI;AAAA,QAC9D,OAAO;AACL,qBAAW,IAAI,WAAW,OAAO,GAAG,CAAC;AACrC,cAAI,YAAa,OAAM,aAAa,aAAa,UAAU,IAAI,OAAO,EAAE;AAAA,QAC1E;AAAA,MACF;AAAA,IACF;AAAA,IAEA,UAAU,CAAC,UAAkB;AAC3B,oBAAc;AACd,cAAQ,OAAO,MAAM,OAAO,MAAM,aAAa,iBAAiB,KAAK;AAAA;AAAA,CAAM,CAAC;AAAA,IAC9E;AAAA,IAEA,SAAS,CAAC,YAAoB;AAC5B,iBAAW,UAAU,OAAO,EAAE;AAAA,IAChC;AAAA,IAEA,cAAc,MAAM;AAClB,gBAAU,qBAAqB;AAC/B,cAAQ;AAAA,IACV;AAAA,EACF,CAAC;AAED,WAAS,UAAU;AACjB,gBAAY;AACZ,UAAM,MAAM;AACZ,UAAM,QAAQ;AACd,YAAQ,OAAO,MAAM;AAAA,EAAK,OAAO,MAAM,KAAK,kBAAkB,SAAS,EAAE,CAAC;AAAA,CAAI;AAC9E,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,UAAQ,GAAG,UAAU,OAAO;AAC5B,UAAQ,GAAG,WAAW,OAAO;AAG7B,UAAQ,OAAO,MAAM,OAAO,MAAM,KAAK,mCAAmC,CAAC;AAC7E;;;AE5RA,IAAM,UAAU;AAEhB,IAAM,OAAO,GAAG,OAAO,MAAM,YAAY,IAAI,CAAC;AAAA;AAAA,EAE5C,OAAO,MAAM,MAAM,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO5B,OAAO,MAAM,MAAM,UAAU,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAU9B,OAAO,MAAM,MAAM,uBAAuB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO3C,OAAO,MAAM,MAAM,SAAS,CAAC;AAAA;AAAA;AAAA;AAAA,EAI7B,OAAO,MAAM,MAAM,SAAS,CAAC;AAAA;AAAA;AAAA;AAAA,EAI7B,OAAO,MAAM,MAAM,QAAQ,CAAC;AAAA;AAAA;AAI9B,eAAsB,KAAK,MAA+B;AACxD,QAAM,QAAQ,WAAW,IAAI;AAE7B,MAAI,MAAM,MAAM;AACd,YAAQ,OAAO,MAAM,IAAI;AACzB,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,MAAM,SAAS;AACjB,YAAQ,OAAO,MAAM,OAAO,OAAO;AAAA,CAAI;AACvC,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,MAAM,UAAU;AAClB,YAAQ,OAAO,MAAM,kBAAkB,aAAa,CAAC,IAAI,IAAI;AAC7D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,WAAW;AAC1B,QAAM,eAAe,qBAAqB,QAAQ,KAAK;AACvD,QAAM,YAAY,iBAAiB,QAAQ,KAAK;AAGhD,MAAI,MAAM,KAAK;AACb,UAAM,WAAW,cAAc,SAAS;AACxC;AAAA,EACF;AAGA,MAAI,MAAM,QAAQ;AAChB,QAAI;AACJ,QAAI,OAAO,MAAM,WAAW,UAAU;AACpC,kBAAY,MAAM;AAAA,IACpB,OAAO;AACL,kBAAY,mBAAmB,KAAK;AACpC,UAAI,CAAC,WAAW;AACd,mBAAW,8BAA8B;AACzC,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AACA,UAAM,mBAAmB,cAAc,WAAW,SAAS;AAC3D;AAAA,EACF;AAGA,MAAI,MAAM,QAAQ;AAChB,UAAM,aAAa,MAAM,QAAQ,cAAc,SAAS;AACxD;AAAA,EACF;AAGA,MAAI,CAAC,QAAQ,MAAM,OAAO;AACxB,UAAM,SAAuB,CAAC;AAC9B,qBAAiB,SAAS,QAAQ,OAAO;AACvC,aAAO,KAAK,KAAmB;AAAA,IACjC;AACA,UAAM,QAAQ,OAAO,OAAO,MAAM,EAAE,SAAS,OAAO,EAAE,KAAK;AAC3D,QAAI,OAAO;AACT,YAAM,aAAa,OAAO,cAAc,SAAS;AACjD;AAAA,IACF;AAAA,EACF;AAGA,QAAM,mBAAmB,cAAc,SAAS;AAClD;;;AC9GA,QAAQ;AAGR,QAAQ,GAAG,qBAAqB,CAAC,QAAQ;AACvC,QAAM,MAAM,IAAI,WAAW,OAAO,GAAG;AACrC,MAAI,IAAI,SAAS,YAAY,GAAG;AAC9B,YAAQ,OAAO;AAAA,MACb;AAAA,IAIF;AAAA,EACF,OAAO;AACL,YAAQ,OAAO,MAAM,yBAAyB,GAAG;AAAA,CAAI;AAAA,EACvD;AACA,UAAQ,KAAK,CAAC;AAChB,CAAC;AAED,QAAQ,GAAG,sBAAsB,CAAC,QAAa;AAC7C,QAAM,MAAM,KAAK,WAAW,OAAO,GAAG;AACtC,MAAI,IAAI,SAAS,YAAY,GAAG;AAC9B,YAAQ,OAAO;AAAA,MACb;AAAA,IAIF;AAAA,EACF,OAAO;AACL,YAAQ,OAAO,MAAM,yBAAyB,GAAG;AAAA,CAAI;AAAA,EACvD;AACA,UAAQ,KAAK,CAAC;AAChB,CAAC;AAID,KAAK,QAAQ,KAAK,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ;AACzC,UAAQ,OAAO,MAAM,yBAAyB,IAAI,WAAW,GAAG;AAAA,CAAI;AACpE,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["fs","path","fs","path","spinnerFrame","formatTime","fs","path","createAgent","createAgent","extractResultText","input","createAgent","createAgent"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "subagent-cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "sa — agent-native coding CLI with teams, delegation, and multi-agent coordination",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"sa": "./dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"main": "./dist/cli.js",
|
|
10
|
+
"files": [
|
|
11
|
+
"dist"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsup",
|
|
15
|
+
"dev": "tsup --watch",
|
|
16
|
+
"start": "node dist/cli.js",
|
|
17
|
+
"test": "tsx test/team-visuals.test.ts"
|
|
18
|
+
},
|
|
19
|
+
"keywords": [
|
|
20
|
+
"ai",
|
|
21
|
+
"agent",
|
|
22
|
+
"cli",
|
|
23
|
+
"coding-agent",
|
|
24
|
+
"multi-agent",
|
|
25
|
+
"teams",
|
|
26
|
+
"subagent",
|
|
27
|
+
"llm"
|
|
28
|
+
],
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"@sinclair/typebox": "^0.34.48",
|
|
31
|
+
"subagent": "^1.0.0",
|
|
32
|
+
"ws": "^8.19.0"
|
|
33
|
+
},
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"@types/ws": "^8.18.1",
|
|
36
|
+
"tsup": "^8.0.0",
|
|
37
|
+
"tsx": "^4.21.0",
|
|
38
|
+
"typescript": "^5.0.0"
|
|
39
|
+
},
|
|
40
|
+
"engines": {
|
|
41
|
+
"node": ">=18"
|
|
42
|
+
},
|
|
43
|
+
"repository": {
|
|
44
|
+
"type": "git",
|
|
45
|
+
"url": "git+https://github.com/morphllm/subagents.git",
|
|
46
|
+
"directory": "packages/subagent-cli"
|
|
47
|
+
},
|
|
48
|
+
"license": "MIT"
|
|
49
|
+
}
|