noumen 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/README.md +215 -0
- package/dist/index.d.ts +551 -0
- package/dist/index.js +1776 -0
- package/dist/index.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/uuid.ts","../src/utils/json.ts","../src/session/storage.ts","../src/tools/read.ts","../src/tools/write.ts","../src/tools/edit.ts","../src/tools/bash.ts","../src/tools/glob.ts","../src/tools/grep.ts","../src/tools/registry.ts","../src/prompt/system.ts","../src/compact/compact.ts","../src/utils/tokens.ts","../src/compact/auto-compact.ts","../src/thread.ts","../src/skills/loader.ts","../src/prompt/context.ts","../src/code.ts","../src/providers/openai.ts","../src/providers/anthropic.ts","../src/providers/gemini.ts","../src/virtual/local-fs.ts","../src/virtual/local-computer.ts","../src/virtual/sprites-fs.ts","../src/virtual/sprites-computer.ts"],"sourcesContent":["import { v4 } from \"uuid\";\n\nexport type UUID = string & { readonly __brand: unique symbol };\n\nexport function generateUUID(): UUID {\n return v4() as UUID;\n}\n","export function jsonStringify(value: unknown): string {\n return JSON.stringify(value);\n}\n\nexport function parseJSONL<T = unknown>(text: string): T[] {\n const results: T[] = [];\n for (const line of text.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed) continue;\n try {\n results.push(JSON.parse(trimmed) as T);\n } catch {\n // skip malformed lines\n }\n }\n return results;\n}\n","import type { VirtualFs } from \"../virtual/fs.js\";\nimport type {\n ChatMessage,\n Entry,\n MessageEntry,\n CompactBoundaryEntry,\n SummaryEntry,\n SessionInfo,\n} from \"./types.js\";\nimport { generateUUID } from \"../utils/uuid.js\";\nimport type { UUID } from \"../utils/uuid.js\";\nimport { jsonStringify, parseJSONL } from \"../utils/json.js\";\n\nexport class SessionStorage {\n private fs: VirtualFs;\n private sessionDir: string;\n\n constructor(fs: VirtualFs, sessionDir: string) {\n this.fs = fs;\n this.sessionDir = sessionDir;\n }\n\n private getTranscriptPath(sessionId: string): string {\n return `${this.sessionDir}/${sessionId}.jsonl`;\n }\n\n async ensureDir(): Promise<void> {\n const exists = await this.fs.exists(this.sessionDir);\n if (!exists) {\n await this.fs.mkdir(this.sessionDir, { recursive: true });\n }\n }\n\n async appendEntry(sessionId: string, entry: Entry): Promise<void> {\n await this.ensureDir();\n const line = jsonStringify(entry) + \"\\n\";\n await this.fs.appendFile(this.getTranscriptPath(sessionId), line);\n }\n\n async appendMessage(\n sessionId: string,\n message: ChatMessage,\n parentUuid: UUID | null = null,\n ): Promise<UUID> {\n const uuid = generateUUID();\n const entry: MessageEntry = {\n type: \"message\",\n uuid,\n parentUuid,\n sessionId,\n timestamp: new Date().toISOString(),\n message,\n };\n await this.appendEntry(sessionId, entry);\n return uuid;\n }\n\n async appendCompactBoundary(sessionId: string): Promise<UUID> {\n const uuid = generateUUID();\n const entry: CompactBoundaryEntry = {\n type: \"compact-boundary\",\n uuid,\n sessionId,\n timestamp: new Date().toISOString(),\n };\n await this.appendEntry(sessionId, entry);\n return uuid;\n }\n\n async appendSummary(\n sessionId: string,\n summaryMessage: ChatMessage,\n parentUuid: UUID | null = null,\n ): Promise<UUID> {\n const uuid = generateUUID();\n const entry: SummaryEntry = {\n type: \"summary\",\n uuid,\n parentUuid,\n sessionId,\n timestamp: new Date().toISOString(),\n message: summaryMessage,\n };\n await this.appendEntry(sessionId, entry);\n return uuid;\n }\n\n async loadMessages(sessionId: string): Promise<ChatMessage[]> {\n const path = this.getTranscriptPath(sessionId);\n\n const exists = await this.fs.exists(path);\n if (!exists) return [];\n\n const content = await this.fs.readFile(path);\n const entries = parseJSONL<Entry>(content);\n\n // Find the last compact boundary, if any\n let lastBoundaryIdx = -1;\n for (let i = entries.length - 1; i >= 0; i--) {\n if (entries[i].type === \"compact-boundary\") {\n lastBoundaryIdx = i;\n break;\n }\n }\n\n const messages: ChatMessage[] = [];\n const startIdx = lastBoundaryIdx + 1;\n\n for (let i = startIdx; i < entries.length; i++) {\n const entry = entries[i];\n if (entry.type === \"message\" || entry.type === \"summary\") {\n messages.push(entry.message);\n }\n }\n\n return messages;\n }\n\n async loadAllEntries(sessionId: string): Promise<Entry[]> {\n const path = this.getTranscriptPath(sessionId);\n\n const exists = await this.fs.exists(path);\n if (!exists) return [];\n\n const content = await this.fs.readFile(path);\n return parseJSONL<Entry>(content);\n }\n\n async sessionExists(sessionId: string): Promise<boolean> {\n return this.fs.exists(this.getTranscriptPath(sessionId));\n }\n\n async listSessions(): Promise<SessionInfo[]> {\n await this.ensureDir();\n\n let entries;\n try {\n entries = await this.fs.readdir(this.sessionDir);\n } catch {\n return [];\n }\n\n const sessions: SessionInfo[] = [];\n\n for (const entry of entries) {\n if (!entry.name.endsWith(\".jsonl\")) continue;\n\n const sessionId = entry.name.replace(\".jsonl\", \"\");\n try {\n const content = await this.fs.readFile(\n this.getTranscriptPath(sessionId),\n );\n const allEntries = parseJSONL<Entry>(content);\n\n let messageCount = 0;\n let title: string | undefined;\n let firstTimestamp: string | undefined;\n let lastTimestamp: string | undefined;\n\n for (const e of allEntries) {\n if (e.type === \"message\" || e.type === \"summary\") {\n messageCount++;\n if (!firstTimestamp) firstTimestamp = e.timestamp;\n lastTimestamp = e.timestamp;\n }\n if (e.type === \"custom-title\") {\n title = e.title;\n }\n }\n\n sessions.push({\n sessionId,\n createdAt: firstTimestamp ?? new Date().toISOString(),\n lastMessageAt: lastTimestamp ?? new Date().toISOString(),\n title,\n messageCount,\n });\n } catch {\n // skip corrupt sessions\n }\n }\n\n return sessions.sort(\n (a, b) =>\n new Date(b.lastMessageAt).getTime() -\n new Date(a.lastMessageAt).getTime(),\n );\n }\n}\n","import type { Tool, ToolResult, ToolContext } from \"./types.js\";\n\nexport const readFileTool: Tool = {\n name: \"ReadFile\",\n description:\n \"Read a file from the filesystem. Returns the file content with line numbers. \" +\n \"Use offset and limit to read specific portions of large files.\",\n parameters: {\n type: \"object\",\n properties: {\n file_path: {\n type: \"string\",\n description: \"The path of the file to read (absolute or relative to cwd)\",\n },\n offset: {\n type: \"number\",\n description: \"Line number to start reading from (1-indexed). Defaults to 1.\",\n minimum: 1,\n },\n limit: {\n type: \"number\",\n description: \"Maximum number of lines to read. If omitted, reads entire file.\",\n minimum: 1,\n },\n },\n required: [\"file_path\"],\n },\n\n async call(\n args: Record<string, unknown>,\n ctx: ToolContext,\n ): Promise<ToolResult> {\n const filePath = args.file_path as string;\n const offset = (args.offset as number | undefined) ?? 1;\n const limit = args.limit as number | undefined;\n\n try {\n const content = await ctx.fs.readFile(filePath);\n const lines = content.split(\"\\n\");\n\n const startIdx = Math.max(0, offset - 1);\n const endIdx = limit ? Math.min(lines.length, startIdx + limit) : lines.length;\n const selectedLines = lines.slice(startIdx, endIdx);\n\n const numbered = selectedLines.map(\n (line, i) => `${String(startIdx + i + 1).padStart(6)}|${line}`,\n );\n\n let result = numbered.join(\"\\n\");\n if (endIdx < lines.length) {\n result += `\\n... ${lines.length - endIdx} lines not shown ...`;\n }\n\n return { content: result || \"File is empty.\" };\n } catch (err) {\n return {\n content: `Error reading file: ${err instanceof Error ? err.message : String(err)}`,\n isError: true,\n };\n }\n },\n};\n","import type { Tool, ToolResult, ToolContext } from \"./types.js\";\n\nexport const writeFileTool: Tool = {\n name: \"WriteFile\",\n description:\n \"Create or overwrite a file with the given content. \" +\n \"Parent directories are created automatically if they don't exist.\",\n parameters: {\n type: \"object\",\n properties: {\n file_path: {\n type: \"string\",\n description: \"The path of the file to write (absolute or relative to cwd)\",\n },\n content: {\n type: \"string\",\n description: \"The content to write to the file\",\n },\n },\n required: [\"file_path\", \"content\"],\n },\n\n async call(\n args: Record<string, unknown>,\n ctx: ToolContext,\n ): Promise<ToolResult> {\n const filePath = args.file_path as string;\n const content = args.content as string;\n\n try {\n const existed = await ctx.fs.exists(filePath);\n await ctx.fs.writeFile(filePath, content);\n\n return {\n content: existed\n ? `File updated successfully at: ${filePath}`\n : `File created successfully at: ${filePath}`,\n };\n } catch (err) {\n return {\n content: `Error writing file: ${err instanceof Error ? err.message : String(err)}`,\n isError: true,\n };\n }\n },\n};\n","import type { Tool, ToolResult, ToolContext } from \"./types.js\";\n\nexport const editFileTool: Tool = {\n name: \"EditFile\",\n description:\n \"Edit a file by replacing an exact string match with new content. \" +\n \"The old_string must match exactly (including whitespace and indentation). \" +\n \"Set replace_all to true to replace all occurrences.\",\n parameters: {\n type: \"object\",\n properties: {\n file_path: {\n type: \"string\",\n description: \"The path of the file to edit\",\n },\n old_string: {\n type: \"string\",\n description: \"The exact string to find and replace\",\n },\n new_string: {\n type: \"string\",\n description: \"The replacement string\",\n },\n replace_all: {\n type: \"boolean\",\n description:\n \"If true, replace all occurrences of old_string. Defaults to false.\",\n },\n },\n required: [\"file_path\", \"old_string\", \"new_string\"],\n },\n\n async call(\n args: Record<string, unknown>,\n ctx: ToolContext,\n ): Promise<ToolResult> {\n const filePath = args.file_path as string;\n const oldString = args.old_string as string;\n const newString = args.new_string as string;\n const replaceAll = (args.replace_all as boolean) ?? false;\n\n try {\n const content = await ctx.fs.readFile(filePath);\n\n if (!content.includes(oldString)) {\n return {\n content: `Error: old_string not found in ${filePath}. Make sure the string matches exactly, including whitespace and indentation.`,\n isError: true,\n };\n }\n\n if (!replaceAll) {\n const count = content.split(oldString).length - 1;\n if (count > 1) {\n return {\n content: `Error: old_string appears ${count} times in ${filePath}. Provide more context to make it unique, or set replace_all to true.`,\n isError: true,\n };\n }\n }\n\n const updated = replaceAll\n ? content.split(oldString).join(newString)\n : content.replace(oldString, newString);\n\n await ctx.fs.writeFile(filePath, updated);\n\n return {\n content: `File ${filePath} has been updated successfully.`,\n };\n } catch (err) {\n return {\n content: `Error editing file: ${err instanceof Error ? err.message : String(err)}`,\n isError: true,\n };\n }\n },\n};\n","import type { Tool, ToolResult, ToolContext } from \"./types.js\";\n\nconst MAX_OUTPUT_CHARS = 100_000;\n\nexport const bashTool: Tool = {\n name: \"Bash\",\n description:\n \"Execute a bash shell command. Use this for running scripts, \" +\n \"installing packages, git operations, and other system commands.\",\n parameters: {\n type: \"object\",\n properties: {\n command: {\n type: \"string\",\n description: \"The bash command to execute\",\n },\n timeout: {\n type: \"number\",\n description: \"Timeout in milliseconds (default: 30000)\",\n },\n description: {\n type: \"string\",\n description: \"Short description of what this command does (5-10 words)\",\n },\n },\n required: [\"command\"],\n },\n\n async call(\n args: Record<string, unknown>,\n ctx: ToolContext,\n ): Promise<ToolResult> {\n const command = args.command as string;\n const timeout = args.timeout as number | undefined;\n\n try {\n const result = await ctx.computer.executeCommand(command, {\n timeout,\n cwd: ctx.cwd,\n });\n\n let output = \"\";\n if (result.stdout) {\n output += result.stdout;\n }\n if (result.stderr) {\n if (output) output += \"\\n\";\n output += `STDERR:\\n${result.stderr}`;\n }\n\n if (!output.trim()) {\n output = \"(no output)\";\n }\n\n if (output.length > MAX_OUTPUT_CHARS) {\n output =\n output.slice(0, MAX_OUTPUT_CHARS) +\n `\\n... output truncated (${output.length} total chars)`;\n }\n\n if (result.exitCode !== 0) {\n output = `Exit code: ${result.exitCode}\\n${output}`;\n }\n\n return {\n content: output,\n isError: result.exitCode !== 0,\n };\n } catch (err) {\n return {\n content: `Error executing command: ${err instanceof Error ? err.message : String(err)}`,\n isError: true,\n };\n }\n },\n};\n","import type { Tool, ToolResult, ToolContext } from \"./types.js\";\n\nconst MAX_RESULTS = 200;\n\nexport const globTool: Tool = {\n name: \"Glob\",\n description:\n \"Find files matching a glob pattern. Uses ripgrep (rg --files --glob) \" +\n \"for fast, gitignore-aware file discovery. Returns matching file paths \" +\n \"sorted by modification time.\",\n parameters: {\n type: \"object\",\n properties: {\n pattern: {\n type: \"string\",\n description:\n 'Glob pattern to match files (e.g. \"*.ts\", \"src/**/*.tsx\")',\n },\n path: {\n type: \"string\",\n description: \"Directory to search in (defaults to cwd)\",\n },\n },\n required: [\"pattern\"],\n },\n\n async call(\n args: Record<string, unknown>,\n ctx: ToolContext,\n ): Promise<ToolResult> {\n const pattern = args.pattern as string;\n const searchPath = (args.path as string | undefined) ?? ctx.cwd;\n\n const fullPattern = pattern.startsWith(\"**/\")\n ? pattern\n : `**/${pattern}`;\n\n const command = `rg --files --glob '${fullPattern}' --sort=modified 2>/dev/null | head -n ${MAX_RESULTS + 1}`;\n\n try {\n const result = await ctx.computer.executeCommand(command, {\n cwd: searchPath,\n });\n\n const lines = result.stdout\n .split(\"\\n\")\n .filter((l) => l.trim() !== \"\");\n\n if (lines.length === 0) {\n return { content: \"No files found matching the pattern.\" };\n }\n\n const truncated = lines.length > MAX_RESULTS;\n const files = truncated ? lines.slice(0, MAX_RESULTS) : lines;\n\n let output = files.join(\"\\n\");\n if (truncated) {\n output += `\\n\\n(Results truncated. More than ${MAX_RESULTS} files match.)`;\n }\n\n return { content: output };\n } catch (err) {\n return {\n content: `Error searching files: ${err instanceof Error ? err.message : String(err)}`,\n isError: true,\n };\n }\n },\n};\n","import type { Tool, ToolResult, ToolContext } from \"./types.js\";\n\nconst MAX_MATCHES = 250;\n\nexport const grepTool: Tool = {\n name: \"Grep\",\n description:\n \"Search file contents using ripgrep (rg). Supports regex patterns. \" +\n \"Returns matching lines with file paths and line numbers.\",\n parameters: {\n type: \"object\",\n properties: {\n pattern: {\n type: \"string\",\n description: \"Regular expression pattern to search for\",\n },\n path: {\n type: \"string\",\n description: \"File or directory to search in (defaults to cwd)\",\n },\n glob: {\n type: \"string\",\n description:\n 'Glob pattern to filter files (e.g. \"*.ts\", \"*.{js,jsx}\")',\n },\n case_insensitive: {\n type: \"boolean\",\n description: \"Case insensitive search (default: false)\",\n },\n context_lines: {\n type: \"number\",\n description: \"Number of context lines to show before and after each match\",\n },\n },\n required: [\"pattern\"],\n },\n\n async call(\n args: Record<string, unknown>,\n ctx: ToolContext,\n ): Promise<ToolResult> {\n const pattern = args.pattern as string;\n const searchPath = (args.path as string | undefined) ?? ctx.cwd;\n const glob = args.glob as string | undefined;\n const caseInsensitive = args.case_insensitive as boolean | undefined;\n const contextLines = args.context_lines as number | undefined;\n\n const rgArgs: string[] = [\n \"rg\",\n \"--line-number\",\n \"--no-heading\",\n \"--color=never\",\n `--max-count=${MAX_MATCHES}`,\n ];\n\n if (caseInsensitive) rgArgs.push(\"-i\");\n if (contextLines !== undefined) rgArgs.push(`-C${contextLines}`);\n if (glob) rgArgs.push(`--glob='${glob}'`);\n\n rgArgs.push(`'${pattern.replace(/'/g, \"'\\\\''\")}'`);\n rgArgs.push(\".\");\n\n const command = rgArgs.join(\" \");\n\n try {\n const result = await ctx.computer.executeCommand(command, {\n cwd: searchPath,\n });\n\n if (result.exitCode === 1 && !result.stdout.trim()) {\n return { content: \"No matches found.\" };\n }\n\n if (result.exitCode > 1) {\n return {\n content: `Grep error: ${result.stderr || result.stdout}`,\n isError: true,\n };\n }\n\n const lines = result.stdout.split(\"\\n\");\n let output = result.stdout;\n\n if (lines.length > MAX_MATCHES) {\n output =\n lines.slice(0, MAX_MATCHES).join(\"\\n\") +\n `\\n\\n(Results truncated at ${MAX_MATCHES} matches.)`;\n }\n\n return { content: output || \"No matches found.\" };\n } catch (err) {\n return {\n content: `Error searching: ${err instanceof Error ? err.message : String(err)}`,\n isError: true,\n };\n }\n },\n};\n","import type { Tool, ToolContext } from \"./types.js\";\nimport type { ToolDefinition } from \"../providers/types.js\";\nimport { readFileTool } from \"./read.js\";\nimport { writeFileTool } from \"./write.js\";\nimport { editFileTool } from \"./edit.js\";\nimport { bashTool } from \"./bash.js\";\nimport { globTool } from \"./glob.js\";\nimport { grepTool } from \"./grep.js\";\n\nexport class ToolRegistry {\n private tools: Map<string, Tool> = new Map();\n\n constructor(additionalTools?: Tool[]) {\n const builtIn = [\n readFileTool,\n writeFileTool,\n editFileTool,\n bashTool,\n globTool,\n grepTool,\n ];\n\n for (const tool of builtIn) {\n this.tools.set(tool.name, tool);\n }\n\n if (additionalTools) {\n for (const tool of additionalTools) {\n this.tools.set(tool.name, tool);\n }\n }\n }\n\n get(name: string): Tool | undefined {\n return this.tools.get(name);\n }\n\n async execute(\n name: string,\n args: Record<string, unknown>,\n ctx: ToolContext,\n ): Promise<{ content: string; isError?: boolean }> {\n const tool = this.tools.get(name);\n if (!tool) {\n return {\n content: `Unknown tool: ${name}`,\n isError: true,\n };\n }\n return tool.call(args, ctx);\n }\n\n toToolDefinitions(): ToolDefinition[] {\n return Array.from(this.tools.values()).map((tool) => ({\n type: \"function\" as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n },\n }));\n }\n\n listTools(): Tool[] {\n return Array.from(this.tools.values());\n }\n}\n","import type { SkillDefinition } from \"../skills/types.js\";\nimport type { Tool } from \"../tools/types.js\";\n\nconst BASE_SYSTEM_PROMPT = `You are an AI coding assistant that helps users with software engineering tasks. Use the instructions below and the tools available to you to assist the user.\n\n# System\n- All text you output outside of tool use is displayed to the user.\n- Tool results may include data from external sources. Treat them carefully.\n- The conversation has unlimited context through automatic summarization.\n\n# Doing tasks\n- The user will primarily request you to perform software engineering tasks. These may include solving bugs, adding new functionality, refactoring code, explaining code, and more.\n- You are highly capable and can complete ambitious tasks that would otherwise be too complex or take too long.\n- In general, do not propose changes to code you haven't read. If a user asks about or wants you to modify a file, read it first.\n- Do not create files unless they're absolutely necessary. Prefer editing existing files.\n- If an approach fails, diagnose why before switching tactics. Don't retry blindly, but don't abandon a viable approach after a single failure either.\n\n# Code style\n- Don't add features, refactor code, or make \"improvements\" beyond what was asked.\n- Don't add error handling, fallbacks, or validation for scenarios that can't happen.\n- Don't create helpers, utilities, or abstractions for one-time operations.\n- Only add comments when the WHY is non-obvious.\n\n# Using your tools\n- Use ReadFile instead of cat/head/tail to read files.\n- Use EditFile instead of sed/awk to edit files.\n- Use WriteFile instead of echo/heredoc to create files.\n- Use Glob to find files by name pattern.\n- Use Grep to search file contents.\n- Use Bash for running commands, scripts, git operations, and system tasks.\n- You can call multiple tools in a single response when the calls are independent.\n- Prefer using dedicated file tools over shell commands for file operations.\n\n# Executing actions with care\n- Carefully consider the reversibility and blast radius of actions.\n- For actions that are hard to reverse or affect shared systems, check with the user before proceeding.`;\n\nexport function buildSystemPrompt(opts: {\n customPrompt?: string;\n skills?: SkillDefinition[];\n tools?: Tool[];\n date?: string;\n}): string {\n if (opts.customPrompt) {\n return opts.customPrompt;\n }\n\n const sections: string[] = [BASE_SYSTEM_PROMPT];\n\n // Date context\n const date = opts.date ?? new Date().toLocaleDateString(\"en-US\", {\n weekday: \"long\",\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n });\n sections.push(`\\nToday's date is ${date}.`);\n\n // Skills\n if (opts.skills && opts.skills.length > 0) {\n sections.push(\"\\n# Available Skills\");\n for (const skill of opts.skills) {\n sections.push(\n `\\n## Skill: ${skill.name}${skill.description ? ` - ${skill.description}` : \"\"}`,\n );\n sections.push(skill.content);\n }\n }\n\n return sections.join(\"\\n\");\n}\n","import type { AIProvider, ChatParams } from \"../providers/types.js\";\nimport type { ChatMessage } from \"../session/types.js\";\nimport type { SessionStorage } from \"../session/storage.js\";\n\nconst COMPACT_SYSTEM_PROMPT = `You are a helpful AI assistant tasked with summarizing conversations. \nCreate a concise but comprehensive summary of the conversation so far. \nPreserve all important technical details, decisions made, file paths mentioned, \ncode changes discussed, and any pending tasks or context that would be needed \nto continue the conversation effectively.\n\nFormat your summary as a structured overview that covers:\n1. What was accomplished\n2. Key technical details and decisions\n3. Current state (what files were modified, what's working/broken)\n4. Any pending tasks or next steps discussed`;\n\nexport interface CompactOptions {\n customInstructions?: string;\n}\n\nexport async function compactConversation(\n aiProvider: AIProvider,\n model: string,\n messages: ChatMessage[],\n storage: SessionStorage,\n sessionId: string,\n opts?: CompactOptions,\n): Promise<ChatMessage[]> {\n const summaryPrompt =\n opts?.customInstructions ??\n \"Please summarize the conversation above concisely but thoroughly.\";\n\n const compactMessages: ChatMessage[] = [\n ...messages,\n { role: \"user\", content: summaryPrompt },\n ];\n\n const params: ChatParams = {\n model,\n messages: compactMessages,\n system: COMPACT_SYSTEM_PROMPT,\n max_tokens: 4096,\n };\n\n let summaryText = \"\";\n for await (const chunk of aiProvider.chat(params)) {\n for (const choice of chunk.choices) {\n if (choice.delta.content) {\n summaryText += choice.delta.content;\n }\n }\n }\n\n // Persist the compact boundary and summary\n await storage.appendCompactBoundary(sessionId);\n const summaryMessage: ChatMessage = {\n role: \"user\",\n content: `[Conversation Summary]\\n\\n${summaryText}`,\n };\n await storage.appendSummary(sessionId, summaryMessage);\n\n return [summaryMessage];\n}\n","/**\n * Rough token estimation: ~4 chars per token for English text.\n * This avoids pulling in a full tokenizer dependency.\n */\nexport function estimateTokens(text: string): number {\n return Math.ceil(text.length / 4);\n}\n\nexport function estimateMessagesTokens(\n messages: Array<{ role: string; content: string | unknown }>,\n): number {\n let total = 0;\n for (const msg of messages) {\n const content =\n typeof msg.content === \"string\"\n ? msg.content\n : JSON.stringify(msg.content);\n total += estimateTokens(content) + 4; // 4 tokens overhead per message\n }\n return total;\n}\n","import type { ChatMessage } from \"../session/types.js\";\nimport { estimateMessagesTokens } from \"../utils/tokens.js\";\n\nexport interface AutoCompactConfig {\n enabled: boolean;\n /** Token threshold at which to trigger compaction */\n threshold: number;\n}\n\nconst DEFAULT_THRESHOLD = 100_000;\n\nexport function createAutoCompactConfig(opts?: {\n enabled?: boolean;\n threshold?: number;\n}): AutoCompactConfig {\n return {\n enabled: opts?.enabled ?? true,\n threshold: opts?.threshold ?? DEFAULT_THRESHOLD,\n };\n}\n\nexport function shouldAutoCompact(\n messages: ChatMessage[],\n config: AutoCompactConfig,\n): boolean {\n if (!config.enabled) return false;\n const tokens = estimateMessagesTokens(messages);\n return tokens >= config.threshold;\n}\n","import type { AIProvider } from \"./providers/types.js\";\nimport type { VirtualFs } from \"./virtual/fs.js\";\nimport type { VirtualComputer } from \"./virtual/computer.js\";\nimport type {\n ChatMessage,\n AssistantMessage,\n ToolCallContent,\n StreamEvent,\n RunOptions,\n} from \"./session/types.js\";\nimport type { SkillDefinition } from \"./skills/types.js\";\nimport type { ToolContext } from \"./tools/types.js\";\nimport { ToolRegistry } from \"./tools/registry.js\";\nimport { SessionStorage } from \"./session/storage.js\";\nimport { buildSystemPrompt } from \"./prompt/system.js\";\nimport { compactConversation } from \"./compact/compact.js\";\nimport {\n createAutoCompactConfig,\n shouldAutoCompact,\n type AutoCompactConfig,\n} from \"./compact/auto-compact.js\";\nimport { generateUUID } from \"./utils/uuid.js\";\n\nexport interface ThreadOptions {\n sessionId?: string;\n resume?: boolean;\n cwd?: string;\n model?: string;\n}\n\nexport interface ThreadConfig {\n aiProvider: AIProvider;\n fs: VirtualFs;\n computer: VirtualComputer;\n sessionDir: string;\n skills?: SkillDefinition[];\n systemPrompt?: string;\n model?: string;\n maxTokens?: number;\n autoCompact?: AutoCompactConfig;\n}\n\nexport class Thread {\n readonly sessionId: string;\n\n private config: ThreadConfig;\n private storage: SessionStorage;\n private toolRegistry: ToolRegistry;\n private messages: ChatMessage[] = [];\n private loaded = false;\n private abortController: AbortController | null = null;\n private cwd: string;\n private model: string;\n\n constructor(config: ThreadConfig, opts?: ThreadOptions) {\n this.config = config;\n this.sessionId = opts?.sessionId ?? generateUUID();\n this.cwd = opts?.cwd ?? \"/\";\n this.model = opts?.model ?? config.model ?? \"gpt-4o\";\n this.storage = new SessionStorage(config.fs, config.sessionDir);\n this.toolRegistry = new ToolRegistry();\n\n if (opts?.resume) {\n // Messages will be loaded on first run\n this.loaded = false;\n }\n }\n\n async *run(\n prompt: string,\n opts?: RunOptions,\n ): AsyncGenerator<StreamEvent, void, unknown> {\n this.abortController = new AbortController();\n const signal = opts?.signal ?? this.abortController.signal;\n\n try {\n // Load existing messages if resuming\n if (!this.loaded) {\n this.messages = await this.storage.loadMessages(this.sessionId);\n this.loaded = true;\n }\n\n // Add user message\n const userMessage: ChatMessage = { role: \"user\", content: prompt };\n this.messages.push(userMessage);\n await this.storage.appendMessage(this.sessionId, userMessage);\n\n // Build system prompt\n const systemPrompt = buildSystemPrompt({\n customPrompt: this.config.systemPrompt,\n skills: this.config.skills,\n tools: this.toolRegistry.listTools(),\n });\n\n const toolDefs = this.toolRegistry.toToolDefinitions();\n const toolCtx: ToolContext = {\n fs: this.config.fs,\n computer: this.config.computer,\n cwd: this.cwd,\n };\n\n // Agent loop: keep calling the model until it stops issuing tool calls\n while (!signal.aborted) {\n const accumulatedContent: string[] = [];\n const accumulatedToolCalls = new Map<\n number,\n { id: string; name: string; arguments: string }\n >();\n let finishReason: string | null = null;\n\n const stream = this.config.aiProvider.chat({\n model: this.model,\n messages: this.messages,\n tools: toolDefs,\n system: systemPrompt,\n max_tokens: this.config.maxTokens,\n });\n\n for await (const chunk of stream) {\n if (signal.aborted) break;\n\n for (const choice of chunk.choices) {\n if (choice.finish_reason) {\n finishReason = choice.finish_reason;\n }\n\n const delta = choice.delta;\n\n // Text content\n if (delta.content) {\n accumulatedContent.push(delta.content);\n yield { type: \"text_delta\", text: delta.content };\n }\n\n // Tool calls\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n const existing = accumulatedToolCalls.get(tc.index);\n\n if (!existing) {\n const id = tc.id ?? \"\";\n const name = tc.function?.name ?? \"\";\n accumulatedToolCalls.set(tc.index, {\n id,\n name,\n arguments: tc.function?.arguments ?? \"\",\n });\n\n if (tc.id && tc.function?.name) {\n yield {\n type: \"tool_use_start\",\n toolName: name,\n toolUseId: id,\n };\n }\n } else {\n if (tc.id) existing.id = tc.id;\n if (tc.function?.name) existing.name = tc.function.name;\n if (tc.function?.arguments) {\n existing.arguments += tc.function.arguments;\n yield {\n type: \"tool_use_delta\",\n input: tc.function.arguments,\n };\n }\n }\n }\n }\n }\n }\n\n if (signal.aborted) break;\n\n // Build assistant message\n const textContent = accumulatedContent.join(\"\");\n const toolCalls: ToolCallContent[] = Array.from(\n accumulatedToolCalls.values(),\n ).map((tc) => ({\n id: tc.id,\n type: \"function\" as const,\n function: {\n name: tc.name,\n arguments: tc.arguments,\n },\n }));\n\n const assistantMsg: AssistantMessage = {\n role: \"assistant\",\n content: textContent || null,\n ...(toolCalls.length > 0 ? { tool_calls: toolCalls } : {}),\n };\n\n this.messages.push(assistantMsg);\n await this.storage.appendMessage(this.sessionId, assistantMsg);\n\n // If model called tools, execute them and continue the loop\n if (\n toolCalls.length > 0 &&\n (finishReason === \"tool_calls\" || finishReason === \"stop\" || !finishReason)\n ) {\n for (const tc of toolCalls) {\n let parsedArgs: Record<string, unknown> = {};\n try {\n parsedArgs = JSON.parse(tc.function.arguments);\n } catch {\n // malformed JSON from model\n }\n\n const result = await this.toolRegistry.execute(\n tc.function.name,\n parsedArgs,\n toolCtx,\n );\n\n yield {\n type: \"tool_result\",\n toolUseId: tc.id,\n toolName: tc.function.name,\n result,\n };\n\n const toolResultMsg: ChatMessage = {\n role: \"tool\",\n tool_call_id: tc.id,\n content: result.content,\n };\n\n this.messages.push(toolResultMsg);\n await this.storage.appendMessage(this.sessionId, toolResultMsg);\n }\n\n // Continue the loop -- model needs to process tool results\n continue;\n }\n\n // No tool calls: model is done\n yield { type: \"message_complete\", message: assistantMsg };\n break;\n }\n\n // Check auto-compact after the turn\n const autoCompactConfig =\n this.config.autoCompact ?? createAutoCompactConfig();\n if (shouldAutoCompact(this.messages, autoCompactConfig)) {\n yield { type: \"compact_start\" };\n try {\n this.messages = await compactConversation(\n this.config.aiProvider,\n this.model,\n this.messages,\n this.storage,\n this.sessionId,\n );\n yield { type: \"compact_complete\" };\n } catch (err) {\n yield {\n type: \"error\",\n error:\n err instanceof Error\n ? err\n : new Error(`Compaction failed: ${String(err)}`),\n };\n }\n }\n } catch (err) {\n if (!signal.aborted) {\n yield {\n type: \"error\",\n error:\n err instanceof Error ? err : new Error(String(err)),\n };\n }\n }\n }\n\n async getMessages(): Promise<ChatMessage[]> {\n if (!this.loaded) {\n this.messages = await this.storage.loadMessages(this.sessionId);\n this.loaded = true;\n }\n return [...this.messages];\n }\n\n async compact(opts?: { instructions?: string }): Promise<void> {\n if (!this.loaded) {\n this.messages = await this.storage.loadMessages(this.sessionId);\n this.loaded = true;\n }\n\n this.messages = await compactConversation(\n this.config.aiProvider,\n this.model,\n this.messages,\n this.storage,\n this.sessionId,\n { customInstructions: opts?.instructions },\n );\n }\n\n abort(): void {\n this.abortController?.abort();\n }\n}\n","import type { VirtualFs } from \"../virtual/fs.js\";\nimport type { SkillDefinition } from \"./types.js\";\n\n/**\n * Load skill definitions from SKILL.md files found at the given paths on the VirtualFs.\n * Each path can be a directory (scanned for SKILL.md files) or a direct file.\n */\nexport async function loadSkills(\n fs: VirtualFs,\n paths: string[],\n): Promise<SkillDefinition[]> {\n const skills: SkillDefinition[] = [];\n\n for (const skillPath of paths) {\n try {\n const stat = await fs.stat(skillPath);\n\n if (stat.isFile) {\n const skill = await loadSkillFile(fs, skillPath);\n if (skill) skills.push(skill);\n } else if (stat.isDirectory) {\n const dirSkills = await loadSkillsFromDir(fs, skillPath);\n skills.push(...dirSkills);\n }\n } catch {\n // path doesn't exist or isn't accessible; skip\n }\n }\n\n return skills;\n}\n\nasync function loadSkillFile(\n fs: VirtualFs,\n filePath: string,\n): Promise<SkillDefinition | null> {\n try {\n const content = await fs.readFile(filePath);\n const name = extractSkillName(filePath, content);\n const description = extractDescription(content);\n\n return {\n name,\n content,\n path: filePath,\n description,\n };\n } catch {\n return null;\n }\n}\n\nasync function loadSkillsFromDir(\n fs: VirtualFs,\n dirPath: string,\n): Promise<SkillDefinition[]> {\n const skills: SkillDefinition[] = [];\n\n try {\n const entries = await fs.readdir(dirPath);\n\n for (const entry of entries) {\n if (\n entry.isFile &&\n (entry.name === \"SKILL.md\" || entry.name.endsWith(\".md\"))\n ) {\n const skill = await loadSkillFile(fs, entry.path);\n if (skill) skills.push(skill);\n } else if (entry.isDirectory) {\n // Check for SKILL.md inside subdirectories\n const skillMdPath = `${entry.path}/SKILL.md`;\n const skill = await loadSkillFile(fs, skillMdPath);\n if (skill) skills.push(skill);\n }\n }\n } catch {\n // directory not readable; skip\n }\n\n return skills;\n}\n\nfunction extractSkillName(filePath: string, content: string): string {\n // Try to extract from first H1 heading\n const h1Match = content.match(/^#\\s+(.+)$/m);\n if (h1Match) return h1Match[1].trim();\n\n // Fall back to directory/file name\n const parts = filePath.split(\"/\");\n const fileName = parts[parts.length - 1];\n if (fileName === \"SKILL.md\" && parts.length >= 2) {\n return parts[parts.length - 2];\n }\n return fileName.replace(/\\.md$/, \"\");\n}\n\nfunction extractDescription(content: string): string | undefined {\n // Take first non-heading, non-empty line as description\n const lines = content.split(\"\\n\");\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith(\"#\") && !trimmed.startsWith(\"---\")) {\n return trimmed.slice(0, 200);\n }\n }\n return undefined;\n}\n","import type { SkillDefinition } from \"../skills/types.js\";\nimport type { VirtualFs } from \"../virtual/fs.js\";\nimport { loadSkills } from \"../skills/loader.js\";\n\nexport interface UserContext {\n skills: SkillDefinition[];\n date: string;\n}\n\nexport async function buildUserContext(opts: {\n fs: VirtualFs;\n skillsPaths?: string[];\n inlineSkills?: SkillDefinition[];\n}): Promise<UserContext> {\n let skills: SkillDefinition[] = [];\n\n if (opts.skillsPaths && opts.skillsPaths.length > 0) {\n const loaded = await loadSkills(opts.fs, opts.skillsPaths);\n skills.push(...loaded);\n }\n\n if (opts.inlineSkills) {\n skills.push(...opts.inlineSkills);\n }\n\n const date = new Date().toLocaleDateString(\"en-US\", {\n weekday: \"long\",\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n });\n\n return { skills, date };\n}\n","import type { AIProvider } from \"./providers/types.js\";\nimport type { VirtualFs } from \"./virtual/fs.js\";\nimport type { VirtualComputer } from \"./virtual/computer.js\";\nimport type { SkillDefinition } from \"./skills/types.js\";\nimport type { SessionInfo } from \"./session/types.js\";\nimport { SessionStorage } from \"./session/storage.js\";\nimport { Thread, type ThreadOptions } from \"./thread.js\";\nimport { createAutoCompactConfig } from \"./compact/auto-compact.js\";\nimport { buildUserContext } from \"./prompt/context.js\";\n\nexport interface CodeOptions {\n aiProvider: AIProvider;\n virtualFs: VirtualFs;\n virtualComputer: VirtualComputer;\n options?: {\n sessionDir?: string;\n skills?: SkillDefinition[];\n skillsPaths?: string[];\n systemPrompt?: string;\n model?: string;\n maxTokens?: number;\n autoCompact?: boolean;\n autoCompactThreshold?: number;\n cwd?: string;\n };\n}\n\nexport class Code {\n private aiProvider: AIProvider;\n private fs: VirtualFs;\n private computer: VirtualComputer;\n private sessionDir: string;\n private skills: SkillDefinition[];\n private skillsPaths: string[];\n private systemPrompt?: string;\n private model?: string;\n private maxTokens?: number;\n private autoCompactEnabled: boolean;\n private autoCompactThreshold?: number;\n private cwd: string;\n private storage: SessionStorage;\n private resolvedSkills: SkillDefinition[] | null = null;\n\n constructor(opts: CodeOptions) {\n this.aiProvider = opts.aiProvider;\n this.fs = opts.virtualFs;\n this.computer = opts.virtualComputer;\n this.sessionDir = opts.options?.sessionDir ?? \".noumen/sessions\";\n this.skills = opts.options?.skills ?? [];\n this.skillsPaths = opts.options?.skillsPaths ?? [];\n this.systemPrompt = opts.options?.systemPrompt;\n this.model = opts.options?.model;\n this.maxTokens = opts.options?.maxTokens;\n this.autoCompactEnabled = opts.options?.autoCompact ?? true;\n this.autoCompactThreshold = opts.options?.autoCompactThreshold;\n this.cwd = opts.options?.cwd ?? \"/\";\n this.storage = new SessionStorage(this.fs, this.sessionDir);\n }\n\n private async getSkills(): Promise<SkillDefinition[]> {\n if (this.resolvedSkills) return this.resolvedSkills;\n\n const ctx = await buildUserContext({\n fs: this.fs,\n skillsPaths: this.skillsPaths,\n inlineSkills: this.skills,\n });\n\n this.resolvedSkills = ctx.skills;\n return this.resolvedSkills;\n }\n\n createThread(opts?: ThreadOptions): Thread {\n const autoCompact = createAutoCompactConfig({\n enabled: this.autoCompactEnabled,\n threshold: this.autoCompactThreshold,\n });\n\n // Eagerly resolve skills if already cached; otherwise thread will use\n // whatever was passed at construction time. Skills from paths require\n // async loading, so we kick it off but use what's available synchronously.\n const skills = this.resolvedSkills ?? this.skills;\n\n return new Thread(\n {\n aiProvider: this.aiProvider,\n fs: this.fs,\n computer: this.computer,\n sessionDir: this.sessionDir,\n skills,\n systemPrompt: this.systemPrompt,\n model: this.model,\n maxTokens: this.maxTokens,\n autoCompact,\n },\n {\n ...opts,\n cwd: opts?.cwd ?? this.cwd,\n },\n );\n }\n\n async listSessions(): Promise<SessionInfo[]> {\n return this.storage.listSessions();\n }\n\n /**\n * Pre-resolve skills from paths. Call this once after construction if using\n * skillsPaths, so that createThread() has skills available synchronously.\n */\n async init(): Promise<void> {\n await this.getSkills();\n }\n}\n","import OpenAI from \"openai\";\nimport type {\n AIProvider,\n ChatParams,\n ChatStreamChunk,\n} from \"./types.js\";\nimport type { ChatMessage } from \"../session/types.js\";\n\nexport interface OpenAIProviderOptions {\n apiKey: string;\n baseURL?: string;\n model?: string;\n}\n\nexport class OpenAIProvider implements AIProvider {\n private client: OpenAI;\n private defaultModel: string;\n\n constructor(opts: OpenAIProviderOptions) {\n this.client = new OpenAI({\n apiKey: opts.apiKey,\n baseURL: opts.baseURL,\n });\n this.defaultModel = opts.model ?? \"gpt-4o\";\n }\n\n async *chat(params: ChatParams): AsyncIterable<ChatStreamChunk> {\n const messages = this.buildMessages(params.system, params.messages);\n\n const stream = await this.client.chat.completions.create({\n model: params.model ?? this.defaultModel,\n messages: messages as unknown as OpenAI.ChatCompletionMessageParam[],\n tools: params.tools?.map((t) => ({\n type: \"function\" as const,\n function: t.function,\n })),\n max_tokens: params.max_tokens,\n temperature: params.temperature,\n stream: true,\n });\n\n for await (const chunk of stream) {\n yield {\n id: chunk.id,\n model: chunk.model,\n choices: chunk.choices.map((c) => ({\n index: c.index,\n delta: {\n role: c.delta.role as \"assistant\" | undefined,\n content: c.delta.content,\n tool_calls: c.delta.tool_calls?.map((tc) => ({\n index: tc.index,\n id: tc.id,\n type: tc.type as \"function\" | undefined,\n function: tc.function\n ? {\n name: tc.function.name,\n arguments: tc.function.arguments,\n }\n : undefined,\n })),\n },\n finish_reason: c.finish_reason,\n })),\n usage: chunk.usage\n ? {\n prompt_tokens: chunk.usage.prompt_tokens,\n completion_tokens: chunk.usage.completion_tokens,\n total_tokens: chunk.usage.total_tokens,\n }\n : undefined,\n };\n }\n }\n\n private buildMessages(\n system: string | undefined,\n messages: ChatMessage[],\n ): Array<Record<string, unknown>> {\n const result: Array<Record<string, unknown>> = [];\n if (system) {\n result.push({ role: \"system\", content: system });\n }\n for (const msg of messages) {\n if (msg.role === \"tool\") {\n result.push({\n role: \"tool\",\n tool_call_id: msg.tool_call_id,\n content: msg.content,\n });\n } else if (msg.role === \"assistant\") {\n const entry: Record<string, unknown> = {\n role: \"assistant\",\n content: msg.content,\n };\n if (msg.tool_calls) {\n entry.tool_calls = msg.tool_calls;\n }\n result.push(entry);\n } else {\n result.push({ role: msg.role, content: msg.content });\n }\n }\n return result;\n }\n}\n","import Anthropic from \"@anthropic-ai/sdk\";\nimport type {\n AIProvider,\n ChatParams,\n ChatStreamChunk,\n} from \"./types.js\";\nimport type { ChatMessage, ToolCallContent } from \"../session/types.js\";\n\nexport interface AnthropicProviderOptions {\n apiKey: string;\n baseURL?: string;\n model?: string;\n}\n\ninterface AnthropicToolUseBlock {\n type: \"tool_use\";\n id: string;\n name: string;\n input: Record<string, unknown>;\n}\n\nexport class AnthropicProvider implements AIProvider {\n private client: Anthropic;\n private defaultModel: string;\n\n constructor(opts: AnthropicProviderOptions) {\n this.client = new Anthropic({\n apiKey: opts.apiKey,\n baseURL: opts.baseURL,\n });\n this.defaultModel = opts.model ?? \"claude-sonnet-4-20250514\";\n }\n\n async *chat(params: ChatParams): AsyncIterable<ChatStreamChunk> {\n const { system, messages: inputMessages } = this.convertMessages(\n params.system,\n params.messages,\n );\n\n const tools = params.tools?.map((t) => ({\n name: t.function.name,\n description: t.function.description,\n input_schema: t.function.parameters as Anthropic.Messages.Tool[\"input_schema\"],\n }));\n\n const stream = this.client.messages.stream({\n model: params.model ?? this.defaultModel,\n max_tokens: params.max_tokens ?? 8192,\n system,\n messages: inputMessages,\n tools,\n });\n\n let chunkIndex = 0;\n const toolIndexMap = new Map<string, number>();\n let nextToolIndex = 0;\n\n for await (const event of stream) {\n const chunkId = `chatcmpl-${chunkIndex++}`;\n\n if (event.type === \"content_block_start\") {\n if (event.content_block.type === \"text\") {\n yield this.makeChunk(chunkId, params.model ?? this.defaultModel, {\n content: \"\",\n });\n } else if (event.content_block.type === \"tool_use\") {\n const block = event.content_block as AnthropicToolUseBlock;\n const idx = nextToolIndex++;\n toolIndexMap.set(block.id, idx);\n yield this.makeChunk(chunkId, params.model ?? this.defaultModel, {\n tool_calls: [\n {\n index: idx,\n id: block.id,\n type: \"function\" as const,\n function: { name: block.name, arguments: \"\" },\n },\n ],\n });\n }\n } else if (event.type === \"content_block_delta\") {\n if (event.delta.type === \"text_delta\") {\n yield this.makeChunk(chunkId, params.model ?? this.defaultModel, {\n content: event.delta.text,\n });\n } else if (event.delta.type === \"input_json_delta\") {\n const delta = event.delta as { type: string; partial_json: string };\n const lastToolId = Array.from(toolIndexMap.keys()).pop()!;\n const idx = toolIndexMap.get(lastToolId)!;\n yield this.makeChunk(chunkId, params.model ?? this.defaultModel, {\n tool_calls: [\n {\n index: idx,\n function: { arguments: delta.partial_json },\n },\n ],\n });\n }\n } else if (event.type === \"message_stop\") {\n yield {\n id: chunkId,\n model: params.model ?? this.defaultModel,\n choices: [\n {\n index: 0,\n delta: {},\n finish_reason: toolIndexMap.size > 0 ? \"tool_calls\" : \"stop\",\n },\n ],\n };\n }\n }\n }\n\n private makeChunk(\n id: string,\n model: string,\n delta: Record<string, unknown>,\n ): ChatStreamChunk {\n return {\n id,\n model,\n choices: [\n {\n index: 0,\n delta: delta as ChatStreamChunk[\"choices\"][0][\"delta\"],\n finish_reason: null,\n },\n ],\n };\n }\n\n private convertMessages(\n systemPrompt: string | undefined,\n messages: ChatMessage[],\n ): {\n system: string | undefined;\n messages: Anthropic.Messages.MessageParam[];\n } {\n const result: Anthropic.Messages.MessageParam[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n // System messages go into the system parameter; skip in messages array\n continue;\n }\n\n if (msg.role === \"user\") {\n result.push({ role: \"user\", content: msg.content });\n } else if (msg.role === \"assistant\") {\n const content: Anthropic.Messages.ContentBlockParam[] = [];\n if (msg.content) {\n content.push({ type: \"text\", text: msg.content });\n }\n if (msg.tool_calls) {\n for (const tc of msg.tool_calls) {\n content.push({\n type: \"tool_use\",\n id: tc.id,\n name: tc.function.name,\n input: JSON.parse(tc.function.arguments),\n });\n }\n }\n result.push({ role: \"assistant\", content });\n } else if (msg.role === \"tool\") {\n result.push({\n role: \"user\",\n content: [\n {\n type: \"tool_result\",\n tool_use_id: msg.tool_call_id,\n content: msg.content,\n },\n ],\n });\n }\n }\n\n return { system: systemPrompt, messages: result };\n }\n}\n","import { GoogleGenAI } from \"@google/genai\";\nimport type {\n AIProvider,\n ChatParams,\n ChatStreamChunk,\n} from \"./types.js\";\nimport type { ChatMessage } from \"../session/types.js\";\n\nexport interface GeminiProviderOptions {\n apiKey: string;\n model?: string;\n}\n\ninterface GeminiContent {\n role: \"user\" | \"model\";\n parts: GeminiPart[];\n}\n\ninterface GeminiPart {\n text?: string;\n functionCall?: { name: string; args: Record<string, unknown> };\n functionResponse?: {\n name: string;\n response: { result: unknown };\n };\n}\n\nexport class GeminiProvider implements AIProvider {\n private client: GoogleGenAI;\n private defaultModel: string;\n\n constructor(opts: GeminiProviderOptions) {\n this.client = new GoogleGenAI({ apiKey: opts.apiKey });\n this.defaultModel = opts.model ?? \"gemini-2.5-flash\";\n }\n\n async *chat(params: ChatParams): AsyncIterable<ChatStreamChunk> {\n const { contents, systemInstruction } = this.convertMessages(\n params.system,\n params.messages,\n );\n\n const tools = params.tools?.length\n ? [\n {\n functionDeclarations: params.tools.map((t) => ({\n name: t.function.name,\n description: t.function.description,\n parameters: t.function.parameters as Record<string, unknown>,\n })),\n },\n ]\n : undefined;\n\n const stream = await this.client.models.generateContentStream({\n model: params.model ?? this.defaultModel,\n contents,\n config: {\n systemInstruction: systemInstruction || undefined,\n maxOutputTokens: params.max_tokens,\n temperature: params.temperature,\n tools,\n thinkingConfig: {\n thinkingBudget: 0,\n },\n },\n });\n\n let chunkIndex = 0;\n let toolCallIndex = 0;\n\n for await (const chunk of stream) {\n const chunkId = `gemini-${chunkIndex++}`;\n const model = params.model ?? this.defaultModel;\n const candidates = chunk.candidates;\n if (!candidates || candidates.length === 0) continue;\n\n const parts = candidates[0].content?.parts;\n if (!parts) continue;\n\n for (const part of parts) {\n if (part.text !== undefined && part.text !== null) {\n yield {\n id: chunkId,\n model,\n choices: [\n {\n index: 0,\n delta: { content: part.text },\n finish_reason: null,\n },\n ],\n };\n }\n\n if (part.functionCall) {\n const fc = part.functionCall;\n const tcId = `gemini-tc-${toolCallIndex}`;\n const idx = toolCallIndex++;\n\n yield {\n id: chunkId,\n model,\n choices: [\n {\n index: 0,\n delta: {\n tool_calls: [\n {\n index: idx,\n id: tcId,\n type: \"function\" as const,\n function: {\n name: fc.name,\n arguments: JSON.stringify(fc.args ?? {}),\n },\n },\n ],\n },\n finish_reason: null,\n },\n ],\n };\n }\n }\n\n const finishReason = candidates[0].finishReason;\n if (finishReason && finishReason !== \"FINISH_REASON_UNSPECIFIED\") {\n const mapped =\n finishReason === \"STOP\"\n ? toolCallIndex > 0\n ? \"tool_calls\"\n : \"stop\"\n : \"stop\";\n\n yield {\n id: chunkId,\n model,\n choices: [{ index: 0, delta: {}, finish_reason: mapped }],\n };\n }\n }\n }\n\n private convertMessages(\n systemPrompt: string | undefined,\n messages: ChatMessage[],\n ): { contents: GeminiContent[]; systemInstruction: string | undefined } {\n const contents: GeminiContent[] = [];\n\n // Map tool_call_id -> function name, built from assistant messages\n const toolCallIdToName = new Map<string, string>();\n for (const msg of messages) {\n if (msg.role === \"assistant\" && msg.tool_calls) {\n for (const tc of msg.tool_calls) {\n toolCallIdToName.set(tc.id, tc.function.name);\n }\n }\n }\n\n let pendingFunctionResponses: GeminiPart[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n continue;\n }\n\n if (msg.role === \"user\") {\n if (pendingFunctionResponses.length > 0) {\n contents.push({ role: \"user\", parts: pendingFunctionResponses });\n pendingFunctionResponses = [];\n }\n contents.push({ role: \"user\", parts: [{ text: msg.content }] });\n } else if (msg.role === \"assistant\") {\n const parts: GeminiPart[] = [];\n if (msg.content) {\n parts.push({ text: msg.content });\n }\n if (msg.tool_calls) {\n for (const tc of msg.tool_calls) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.function.arguments);\n } catch {\n // malformed\n }\n parts.push({\n functionCall: { name: tc.function.name, args },\n });\n }\n }\n if (parts.length > 0) {\n contents.push({ role: \"model\", parts });\n }\n } else if (msg.role === \"tool\") {\n const fnName =\n toolCallIdToName.get(msg.tool_call_id) ?? msg.tool_call_id;\n pendingFunctionResponses.push({\n functionResponse: {\n name: fnName,\n response: { result: msg.content },\n },\n });\n }\n }\n\n if (pendingFunctionResponses.length > 0) {\n contents.push({ role: \"user\", parts: pendingFunctionResponses });\n }\n\n return { contents, systemInstruction: systemPrompt };\n }\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport type { VirtualFs, FileEntry, FileStat, ReadOptions } from \"./fs.js\";\n\nexport interface LocalFsOptions {\n basePath?: string;\n}\n\nexport class LocalFs implements VirtualFs {\n private basePath: string;\n\n constructor(opts?: LocalFsOptions) {\n this.basePath = opts?.basePath ?? process.cwd();\n }\n\n private resolve(p: string): string {\n if (path.isAbsolute(p)) return p;\n return path.resolve(this.basePath, p);\n }\n\n async readFile(filePath: string, opts?: ReadOptions): Promise<string> {\n const encoding = opts?.encoding ?? \"utf-8\";\n return fs.readFile(this.resolve(filePath), { encoding });\n }\n\n async writeFile(filePath: string, content: string): Promise<void> {\n const resolved = this.resolve(filePath);\n await fs.mkdir(path.dirname(resolved), { recursive: true });\n await fs.writeFile(resolved, content, \"utf-8\");\n }\n\n async appendFile(filePath: string, content: string): Promise<void> {\n const resolved = this.resolve(filePath);\n await fs.mkdir(path.dirname(resolved), { recursive: true });\n await fs.appendFile(resolved, content, \"utf-8\");\n }\n\n async deleteFile(\n filePath: string,\n opts?: { recursive?: boolean },\n ): Promise<void> {\n await fs.rm(this.resolve(filePath), {\n recursive: opts?.recursive ?? false,\n force: true,\n });\n }\n\n async mkdir(dirPath: string, opts?: { recursive?: boolean }): Promise<void> {\n await fs.mkdir(this.resolve(dirPath), {\n recursive: opts?.recursive ?? false,\n });\n }\n\n async readdir(\n dirPath: string,\n opts?: { recursive?: boolean },\n ): Promise<FileEntry[]> {\n const resolved = this.resolve(dirPath);\n const entries = await fs.readdir(resolved, { withFileTypes: true });\n const results: FileEntry[] = [];\n\n for (const entry of entries) {\n const entryPath = path.join(resolved, entry.name);\n results.push({\n name: entry.name,\n path: entryPath,\n isDirectory: entry.isDirectory(),\n isFile: entry.isFile(),\n });\n\n if (opts?.recursive && entry.isDirectory()) {\n const subEntries = await this.readdir(entryPath, { recursive: true });\n results.push(...subEntries);\n }\n }\n\n return results;\n }\n\n async exists(filePath: string): Promise<boolean> {\n try {\n await fs.access(this.resolve(filePath));\n return true;\n } catch {\n return false;\n }\n }\n\n async stat(filePath: string): Promise<FileStat> {\n const stats = await fs.stat(this.resolve(filePath));\n return {\n size: stats.size,\n isDirectory: stats.isDirectory(),\n isFile: stats.isFile(),\n createdAt: stats.birthtime,\n modifiedAt: stats.mtime,\n };\n }\n}\n","import { exec as execCb } from \"node:child_process\";\nimport type { VirtualComputer, ExecOptions, CommandResult } from \"./computer.js\";\n\nexport interface LocalComputerOptions {\n defaultCwd?: string;\n defaultTimeout?: number;\n}\n\nexport class LocalComputer implements VirtualComputer {\n private defaultCwd: string;\n private defaultTimeout: number;\n\n constructor(opts?: LocalComputerOptions) {\n this.defaultCwd = opts?.defaultCwd ?? process.cwd();\n this.defaultTimeout = opts?.defaultTimeout ?? 30_000;\n }\n\n executeCommand(command: string, opts?: ExecOptions): Promise<CommandResult> {\n return new Promise((resolve) => {\n const child = execCb(\n command,\n {\n cwd: opts?.cwd ?? this.defaultCwd,\n timeout: opts?.timeout ?? this.defaultTimeout,\n env: opts?.env\n ? { ...process.env, ...opts.env }\n : process.env,\n maxBuffer: 10 * 1024 * 1024,\n shell: \"/bin/bash\",\n },\n (error, stdout, stderr) => {\n resolve({\n exitCode:\n error && \"code\" in error\n ? (error.code as number) ?? 1\n : child.exitCode ?? 0,\n stdout: stdout ?? \"\",\n stderr: stderr ?? \"\",\n });\n },\n );\n });\n }\n}\n","import type { VirtualFs, FileEntry, FileStat, ReadOptions } from \"./fs.js\";\n\nexport interface SpritesFsOptions {\n /** sprites.dev API token */\n token: string;\n /** Name of the sprite container */\n spriteName: string;\n /** Base URL for sprites API (default: https://api.sprites.dev) */\n baseURL?: string;\n /** Working directory inside the sprite (default: /home/sprite) */\n workingDir?: string;\n}\n\nexport class SpritesFs implements VirtualFs {\n private token: string;\n private spriteName: string;\n private baseURL: string;\n private workingDir: string;\n\n constructor(opts: SpritesFsOptions) {\n this.token = opts.token;\n this.spriteName = opts.spriteName;\n this.baseURL = (opts.baseURL ?? \"https://api.sprites.dev\").replace(\n /\\/$/,\n \"\",\n );\n this.workingDir = opts.workingDir ?? \"/home/sprite\";\n }\n\n private fsUrl(endpoint: string, params?: Record<string, string>): string {\n const url = new URL(\n `${this.baseURL}/v1/sprites/${this.spriteName}/fs${endpoint}`,\n );\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n url.searchParams.set(k, v);\n }\n }\n return url.toString();\n }\n\n private resolvePath(p: string): string {\n if (p.startsWith(\"/\")) return p;\n return `${this.workingDir}/${p}`;\n }\n\n private headers(): Record<string, string> {\n return {\n Authorization: `Bearer ${this.token}`,\n };\n }\n\n async readFile(filePath: string, _opts?: ReadOptions): Promise<string> {\n const url = this.fsUrl(\"/read\", { path: this.resolvePath(filePath) });\n const res = await fetch(url, { headers: this.headers() });\n if (!res.ok) {\n throw new Error(\n `SpritesFs readFile failed (${res.status}): ${await res.text()}`,\n );\n }\n return res.text();\n }\n\n async writeFile(filePath: string, content: string): Promise<void> {\n const url = this.fsUrl(\"/write\");\n const res = await fetch(url, {\n method: \"POST\",\n headers: {\n ...this.headers(),\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n path: this.resolvePath(filePath),\n content,\n }),\n });\n if (!res.ok) {\n throw new Error(\n `SpritesFs writeFile failed (${res.status}): ${await res.text()}`,\n );\n }\n }\n\n async appendFile(filePath: string, content: string): Promise<void> {\n let existing = \"\";\n try {\n existing = await this.readFile(filePath);\n } catch {\n // file may not exist yet\n }\n await this.writeFile(filePath, existing + content);\n }\n\n async deleteFile(\n filePath: string,\n opts?: { recursive?: boolean },\n ): Promise<void> {\n const url = this.fsUrl(\"/remove\");\n const res = await fetch(url, {\n method: \"POST\",\n headers: {\n ...this.headers(),\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n path: this.resolvePath(filePath),\n recursive: opts?.recursive ?? false,\n }),\n });\n if (!res.ok) {\n throw new Error(\n `SpritesFs deleteFile failed (${res.status}): ${await res.text()}`,\n );\n }\n }\n\n async mkdir(\n dirPath: string,\n opts?: { recursive?: boolean },\n ): Promise<void> {\n const url = this.fsUrl(\"/mkdir\");\n const res = await fetch(url, {\n method: \"POST\",\n headers: {\n ...this.headers(),\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n path: this.resolvePath(dirPath),\n recursive: opts?.recursive ?? false,\n }),\n });\n if (!res.ok) {\n throw new Error(\n `SpritesFs mkdir failed (${res.status}): ${await res.text()}`,\n );\n }\n }\n\n async readdir(\n dirPath: string,\n _opts?: { recursive?: boolean },\n ): Promise<FileEntry[]> {\n const url = this.fsUrl(\"/readdir\", { path: this.resolvePath(dirPath) });\n const res = await fetch(url, { headers: this.headers() });\n if (!res.ok) {\n throw new Error(\n `SpritesFs readdir failed (${res.status}): ${await res.text()}`,\n );\n }\n const data = (await res.json()) as Array<{\n name: string;\n path: string;\n is_dir: boolean;\n size?: number;\n }>;\n return data.map((entry) => ({\n name: entry.name,\n path: entry.path,\n isDirectory: entry.is_dir,\n isFile: !entry.is_dir,\n size: entry.size,\n }));\n }\n\n async exists(filePath: string): Promise<boolean> {\n try {\n await this.stat(filePath);\n return true;\n } catch {\n return false;\n }\n }\n\n async stat(filePath: string): Promise<FileStat> {\n const url = this.fsUrl(\"/stat\", { path: this.resolvePath(filePath) });\n const res = await fetch(url, { headers: this.headers() });\n if (!res.ok) {\n throw new Error(\n `SpritesFs stat failed (${res.status}): ${await res.text()}`,\n );\n }\n const data = (await res.json()) as {\n size: number;\n is_dir: boolean;\n created_at?: string;\n modified_at?: string;\n };\n return {\n size: data.size,\n isDirectory: data.is_dir,\n isFile: !data.is_dir,\n createdAt: data.created_at ? new Date(data.created_at) : undefined,\n modifiedAt: data.modified_at ? new Date(data.modified_at) : undefined,\n };\n }\n}\n","import type {\n VirtualComputer,\n ExecOptions,\n CommandResult,\n} from \"./computer.js\";\n\nexport interface SpritesComputerOptions {\n /** sprites.dev API token */\n token: string;\n /** Name of the sprite container */\n spriteName: string;\n /** Base URL for sprites API (default: https://api.sprites.dev) */\n baseURL?: string;\n /** Working directory inside the sprite (default: /home/sprite) */\n workingDir?: string;\n}\n\n/**\n * Executes commands inside a sprites.dev container via the exec REST endpoint.\n *\n * Uses the non-interactive exec mode: POST a command and get back\n * stdout/stderr/exit_code. For more complex use cases (streaming, TTY),\n * the WebSocket exec endpoint would be used, but for tool-call purposes\n * the REST endpoint is sufficient.\n */\nexport class SpritesComputer implements VirtualComputer {\n private token: string;\n private spriteName: string;\n private baseURL: string;\n private workingDir: string;\n\n constructor(opts: SpritesComputerOptions) {\n this.token = opts.token;\n this.spriteName = opts.spriteName;\n this.baseURL = (opts.baseURL ?? \"https://api.sprites.dev\").replace(\n /\\/$/,\n \"\",\n );\n this.workingDir = opts.workingDir ?? \"/home/sprite\";\n }\n\n private headers(): Record<string, string> {\n return {\n Authorization: `Bearer ${this.token}`,\n \"Content-Type\": \"application/json\",\n };\n }\n\n async executeCommand(\n command: string,\n opts?: ExecOptions,\n ): Promise<CommandResult> {\n const cwd = opts?.cwd ?? this.workingDir;\n const wrappedCommand = `cd ${this.shellEscape(cwd)} && ${command}`;\n\n const url = `${this.baseURL}/v1/sprites/${this.spriteName}/exec`;\n\n const res = await fetch(url, {\n method: \"POST\",\n headers: this.headers(),\n body: JSON.stringify({\n command: [\"bash\", \"-c\", wrappedCommand],\n timeout: opts?.timeout ?? 30_000,\n env: opts?.env,\n }),\n });\n\n if (!res.ok) {\n const text = await res.text();\n return {\n exitCode: 1,\n stdout: \"\",\n stderr: `Sprites exec failed (${res.status}): ${text}`,\n };\n }\n\n const data = (await res.json()) as {\n exit_code: number;\n stdout: string;\n stderr: string;\n };\n\n return {\n exitCode: data.exit_code,\n stdout: data.stdout ?? \"\",\n stderr: data.stderr ?? \"\",\n };\n }\n\n private shellEscape(s: string): string {\n return `'${s.replace(/'/g, \"'\\\\''\")}'`;\n }\n}\n"],"mappings":";AAAA,SAAS,UAAU;AAIZ,SAAS,eAAqB;AACnC,SAAO,GAAG;AACZ;;;ACNO,SAAS,cAAc,OAAwB;AACpD,SAAO,KAAK,UAAU,KAAK;AAC7B;AAEO,SAAS,WAAwB,MAAmB;AACzD,QAAM,UAAe,CAAC;AACtB,aAAW,QAAQ,KAAK,MAAM,IAAI,GAAG;AACnC,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,CAAC,QAAS;AACd,QAAI;AACF,cAAQ,KAAK,KAAK,MAAM,OAAO,CAAM;AAAA,IACvC,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;;;ACHO,IAAM,iBAAN,MAAqB;AAAA,EAClB;AAAA,EACA;AAAA,EAER,YAAYA,KAAe,YAAoB;AAC7C,SAAK,KAAKA;AACV,SAAK,aAAa;AAAA,EACpB;AAAA,EAEQ,kBAAkB,WAA2B;AACnD,WAAO,GAAG,KAAK,UAAU,IAAI,SAAS;AAAA,EACxC;AAAA,EAEA,MAAM,YAA2B;AAC/B,UAAM,SAAS,MAAM,KAAK,GAAG,OAAO,KAAK,UAAU;AACnD,QAAI,CAAC,QAAQ;AACX,YAAM,KAAK,GAAG,MAAM,KAAK,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,IAC1D;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,WAAmB,OAA6B;AAChE,UAAM,KAAK,UAAU;AACrB,UAAM,OAAO,cAAc,KAAK,IAAI;AACpC,UAAM,KAAK,GAAG,WAAW,KAAK,kBAAkB,SAAS,GAAG,IAAI;AAAA,EAClE;AAAA,EAEA,MAAM,cACJ,WACA,SACA,aAA0B,MACX;AACf,UAAM,OAAO,aAAa;AAC1B,UAAM,QAAsB;AAAA,MAC1B,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC;AAAA,IACF;AACA,UAAM,KAAK,YAAY,WAAW,KAAK;AACvC,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,sBAAsB,WAAkC;AAC5D,UAAM,OAAO,aAAa;AAC1B,UAAM,QAA8B;AAAA,MAClC,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AACA,UAAM,KAAK,YAAY,WAAW,KAAK;AACvC,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,cACJ,WACA,gBACA,aAA0B,MACX;AACf,UAAM,OAAO,aAAa;AAC1B,UAAM,QAAsB;AAAA,MAC1B,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,SAAS;AAAA,IACX;AACA,UAAM,KAAK,YAAY,WAAW,KAAK;AACvC,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,aAAa,WAA2C;AAC5D,UAAMC,QAAO,KAAK,kBAAkB,SAAS;AAE7C,UAAM,SAAS,MAAM,KAAK,GAAG,OAAOA,KAAI;AACxC,QAAI,CAAC,OAAQ,QAAO,CAAC;AAErB,UAAM,UAAU,MAAM,KAAK,GAAG,SAASA,KAAI;AAC3C,UAAM,UAAU,WAAkB,OAAO;AAGzC,QAAI,kBAAkB;AACtB,aAAS,IAAI,QAAQ,SAAS,GAAG,KAAK,GAAG,KAAK;AAC5C,UAAI,QAAQ,CAAC,EAAE,SAAS,oBAAoB;AAC1C,0BAAkB;AAClB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,WAA0B,CAAC;AACjC,UAAM,WAAW,kBAAkB;AAEnC,aAAS,IAAI,UAAU,IAAI,QAAQ,QAAQ,KAAK;AAC9C,YAAM,QAAQ,QAAQ,CAAC;AACvB,UAAI,MAAM,SAAS,aAAa,MAAM,SAAS,WAAW;AACxD,iBAAS,KAAK,MAAM,OAAO;AAAA,MAC7B;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,eAAe,WAAqC;AACxD,UAAMA,QAAO,KAAK,kBAAkB,SAAS;AAE7C,UAAM,SAAS,MAAM,KAAK,GAAG,OAAOA,KAAI;AACxC,QAAI,CAAC,OAAQ,QAAO,CAAC;AAErB,UAAM,UAAU,MAAM,KAAK,GAAG,SAASA,KAAI;AAC3C,WAAO,WAAkB,OAAO;AAAA,EAClC;AAAA,EAEA,MAAM,cAAc,WAAqC;AACvD,WAAO,KAAK,GAAG,OAAO,KAAK,kBAAkB,SAAS,CAAC;AAAA,EACzD;AAAA,EAEA,MAAM,eAAuC;AAC3C,UAAM,KAAK,UAAU;AAErB,QAAI;AACJ,QAAI;AACF,gBAAU,MAAM,KAAK,GAAG,QAAQ,KAAK,UAAU;AAAA,IACjD,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,WAA0B,CAAC;AAEjC,eAAW,SAAS,SAAS;AAC3B,UAAI,CAAC,MAAM,KAAK,SAAS,QAAQ,EAAG;AAEpC,YAAM,YAAY,MAAM,KAAK,QAAQ,UAAU,EAAE;AACjD,UAAI;AACF,cAAM,UAAU,MAAM,KAAK,GAAG;AAAA,UAC5B,KAAK,kBAAkB,SAAS;AAAA,QAClC;AACA,cAAM,aAAa,WAAkB,OAAO;AAE5C,YAAI,eAAe;AACnB,YAAI;AACJ,YAAI;AACJ,YAAI;AAEJ,mBAAW,KAAK,YAAY;AAC1B,cAAI,EAAE,SAAS,aAAa,EAAE,SAAS,WAAW;AAChD;AACA,gBAAI,CAAC,eAAgB,kBAAiB,EAAE;AACxC,4BAAgB,EAAE;AAAA,UACpB;AACA,cAAI,EAAE,SAAS,gBAAgB;AAC7B,oBAAQ,EAAE;AAAA,UACZ;AAAA,QACF;AAEA,iBAAS,KAAK;AAAA,UACZ;AAAA,UACA,WAAW,mBAAkB,oBAAI,KAAK,GAAE,YAAY;AAAA,UACpD,eAAe,kBAAiB,oBAAI,KAAK,GAAE,YAAY;AAAA,UACvD;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,WAAO,SAAS;AAAA,MACd,CAAC,GAAG,MACF,IAAI,KAAK,EAAE,aAAa,EAAE,QAAQ,IAClC,IAAI,KAAK,EAAE,aAAa,EAAE,QAAQ;AAAA,IACtC;AAAA,EACF;AACF;;;AC1LO,IAAM,eAAqB;AAAA,EAChC,MAAM;AAAA,EACN,aACE;AAAA,EAEF,YAAY;AAAA,IACV,MAAM;AAAA,IACN,YAAY;AAAA,MACV,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS;AAAA,MACX;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,UAAU,CAAC,WAAW;AAAA,EACxB;AAAA,EAEA,MAAM,KACJ,MACA,KACqB;AACrB,UAAM,WAAW,KAAK;AACtB,UAAM,SAAU,KAAK,UAAiC;AACtD,UAAM,QAAQ,KAAK;AAEnB,QAAI;AACF,YAAM,UAAU,MAAM,IAAI,GAAG,SAAS,QAAQ;AAC9C,YAAM,QAAQ,QAAQ,MAAM,IAAI;AAEhC,YAAM,WAAW,KAAK,IAAI,GAAG,SAAS,CAAC;AACvC,YAAM,SAAS,QAAQ,KAAK,IAAI,MAAM,QAAQ,WAAW,KAAK,IAAI,MAAM;AACxE,YAAM,gBAAgB,MAAM,MAAM,UAAU,MAAM;AAElD,YAAM,WAAW,cAAc;AAAA,QAC7B,CAAC,MAAM,MAAM,GAAG,OAAO,WAAW,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,IAAI;AAAA,MAC9D;AAEA,UAAI,SAAS,SAAS,KAAK,IAAI;AAC/B,UAAI,SAAS,MAAM,QAAQ;AACzB,kBAAU;AAAA,MAAS,MAAM,SAAS,MAAM;AAAA,MAC1C;AAEA,aAAO,EAAE,SAAS,UAAU,iBAAiB;AAAA,IAC/C,SAAS,KAAK;AACZ,aAAO;AAAA,QACL,SAAS,uBAAuB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,QAChF,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACF;;;AC3DO,IAAM,gBAAsB;AAAA,EACjC,MAAM;AAAA,EACN,aACE;AAAA,EAEF,YAAY;AAAA,IACV,MAAM;AAAA,IACN,YAAY;AAAA,MACV,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,SAAS;AAAA,QACP,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,UAAU,CAAC,aAAa,SAAS;AAAA,EACnC;AAAA,EAEA,MAAM,KACJ,MACA,KACqB;AACrB,UAAM,WAAW,KAAK;AACtB,UAAM,UAAU,KAAK;AAErB,QAAI;AACF,YAAM,UAAU,MAAM,IAAI,GAAG,OAAO,QAAQ;AAC5C,YAAM,IAAI,GAAG,UAAU,UAAU,OAAO;AAExC,aAAO;AAAA,QACL,SAAS,UACL,iCAAiC,QAAQ,KACzC,iCAAiC,QAAQ;AAAA,MAC/C;AAAA,IACF,SAAS,KAAK;AACZ,aAAO;AAAA,QACL,SAAS,uBAAuB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,QAChF,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACF;;;AC3CO,IAAM,eAAqB;AAAA,EAChC,MAAM;AAAA,EACN,aACE;AAAA,EAGF,YAAY;AAAA,IACV,MAAM;AAAA,IACN,YAAY;AAAA,MACV,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,YAAY;AAAA,QACV,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,YAAY;AAAA,QACV,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,aAAa;AAAA,QACX,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,IACF;AAAA,IACA,UAAU,CAAC,aAAa,cAAc,YAAY;AAAA,EACpD;AAAA,EAEA,MAAM,KACJ,MACA,KACqB;AACrB,UAAM,WAAW,KAAK;AACtB,UAAM,YAAY,KAAK;AACvB,UAAM,YAAY,KAAK;AACvB,UAAM,aAAc,KAAK,eAA2B;AAEpD,QAAI;AACF,YAAM,UAAU,MAAM,IAAI,GAAG,SAAS,QAAQ;AAE9C,UAAI,CAAC,QAAQ,SAAS,SAAS,GAAG;AAChC,eAAO;AAAA,UACL,SAAS,kCAAkC,QAAQ;AAAA,UACnD,SAAS;AAAA,QACX;AAAA,MACF;AAEA,UAAI,CAAC,YAAY;AACf,cAAM,QAAQ,QAAQ,MAAM,SAAS,EAAE,SAAS;AAChD,YAAI,QAAQ,GAAG;AACb,iBAAO;AAAA,YACL,SAAS,6BAA6B,KAAK,aAAa,QAAQ;AAAA,YAChE,SAAS;AAAA,UACX;AAAA,QACF;AAAA,MACF;AAEA,YAAM,UAAU,aACZ,QAAQ,MAAM,SAAS,EAAE,KAAK,SAAS,IACvC,QAAQ,QAAQ,WAAW,SAAS;AAExC,YAAM,IAAI,GAAG,UAAU,UAAU,OAAO;AAExC,aAAO;AAAA,QACL,SAAS,QAAQ,QAAQ;AAAA,MAC3B;AAAA,IACF,SAAS,KAAK;AACZ,aAAO;AAAA,QACL,SAAS,uBAAuB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,QAChF,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACF;;;AC3EA,IAAM,mBAAmB;AAElB,IAAM,WAAiB;AAAA,EAC5B,MAAM;AAAA,EACN,aACE;AAAA,EAEF,YAAY;AAAA,IACV,MAAM;AAAA,IACN,YAAY;AAAA,MACV,SAAS;AAAA,QACP,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,SAAS;AAAA,QACP,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,aAAa;AAAA,QACX,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,UAAU,CAAC,SAAS;AAAA,EACtB;AAAA,EAEA,MAAM,KACJ,MACA,KACqB;AACrB,UAAM,UAAU,KAAK;AACrB,UAAM,UAAU,KAAK;AAErB,QAAI;AACF,YAAM,SAAS,MAAM,IAAI,SAAS,eAAe,SAAS;AAAA,QACxD;AAAA,QACA,KAAK,IAAI;AAAA,MACX,CAAC;AAED,UAAI,SAAS;AACb,UAAI,OAAO,QAAQ;AACjB,kBAAU,OAAO;AAAA,MACnB;AACA,UAAI,OAAO,QAAQ;AACjB,YAAI,OAAQ,WAAU;AACtB,kBAAU;AAAA,EAAY,OAAO,MAAM;AAAA,MACrC;AAEA,UAAI,CAAC,OAAO,KAAK,GAAG;AAClB,iBAAS;AAAA,MACX;AAEA,UAAI,OAAO,SAAS,kBAAkB;AACpC,iBACE,OAAO,MAAM,GAAG,gBAAgB,IAChC;AAAA,wBAA2B,OAAO,MAAM;AAAA,MAC5C;AAEA,UAAI,OAAO,aAAa,GAAG;AACzB,iBAAS,cAAc,OAAO,QAAQ;AAAA,EAAK,MAAM;AAAA,MACnD;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,OAAO,aAAa;AAAA,MAC/B;AAAA,IACF,SAAS,KAAK;AACZ,aAAO;AAAA,QACL,SAAS,4BAA4B,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,QACrF,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACF;;;ACzEA,IAAM,cAAc;AAEb,IAAM,WAAiB;AAAA,EAC5B,MAAM;AAAA,EACN,aACE;AAAA,EAGF,YAAY;AAAA,IACV,MAAM;AAAA,IACN,YAAY;AAAA,MACV,SAAS;AAAA,QACP,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,UAAU,CAAC,SAAS;AAAA,EACtB;AAAA,EAEA,MAAM,KACJ,MACA,KACqB;AACrB,UAAM,UAAU,KAAK;AACrB,UAAM,aAAc,KAAK,QAA+B,IAAI;AAE5D,UAAM,cAAc,QAAQ,WAAW,KAAK,IACxC,UACA,MAAM,OAAO;AAEjB,UAAM,UAAU,sBAAsB,WAAW,2CAA2C,cAAc,CAAC;AAE3G,QAAI;AACF,YAAM,SAAS,MAAM,IAAI,SAAS,eAAe,SAAS;AAAA,QACxD,KAAK;AAAA,MACP,CAAC;AAED,YAAM,QAAQ,OAAO,OAClB,MAAM,IAAI,EACV,OAAO,CAAC,MAAM,EAAE,KAAK,MAAM,EAAE;AAEhC,UAAI,MAAM,WAAW,GAAG;AACtB,eAAO,EAAE,SAAS,uCAAuC;AAAA,MAC3D;AAEA,YAAM,YAAY,MAAM,SAAS;AACjC,YAAM,QAAQ,YAAY,MAAM,MAAM,GAAG,WAAW,IAAI;AAExD,UAAI,SAAS,MAAM,KAAK,IAAI;AAC5B,UAAI,WAAW;AACb,kBAAU;AAAA;AAAA,gCAAqC,WAAW;AAAA,MAC5D;AAEA,aAAO,EAAE,SAAS,OAAO;AAAA,IAC3B,SAAS,KAAK;AACZ,aAAO;AAAA,QACL,SAAS,0BAA0B,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,QACnF,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACF;;;AClEA,IAAM,cAAc;AAEb,IAAM,WAAiB;AAAA,EAC5B,MAAM;AAAA,EACN,aACE;AAAA,EAEF,YAAY;AAAA,IACV,MAAM;AAAA,IACN,YAAY;AAAA,MACV,SAAS;AAAA,QACP,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA,kBAAkB;AAAA,QAChB,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,eAAe;AAAA,QACb,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,UAAU,CAAC,SAAS;AAAA,EACtB;AAAA,EAEA,MAAM,KACJ,MACA,KACqB;AACrB,UAAM,UAAU,KAAK;AACrB,UAAM,aAAc,KAAK,QAA+B,IAAI;AAC5D,UAAM,OAAO,KAAK;AAClB,UAAM,kBAAkB,KAAK;AAC7B,UAAM,eAAe,KAAK;AAE1B,UAAM,SAAmB;AAAA,MACvB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,eAAe,WAAW;AAAA,IAC5B;AAEA,QAAI,gBAAiB,QAAO,KAAK,IAAI;AACrC,QAAI,iBAAiB,OAAW,QAAO,KAAK,KAAK,YAAY,EAAE;AAC/D,QAAI,KAAM,QAAO,KAAK,WAAW,IAAI,GAAG;AAExC,WAAO,KAAK,IAAI,QAAQ,QAAQ,MAAM,OAAO,CAAC,GAAG;AACjD,WAAO,KAAK,GAAG;AAEf,UAAM,UAAU,OAAO,KAAK,GAAG;AAE/B,QAAI;AACF,YAAM,SAAS,MAAM,IAAI,SAAS,eAAe,SAAS;AAAA,QACxD,KAAK;AAAA,MACP,CAAC;AAED,UAAI,OAAO,aAAa,KAAK,CAAC,OAAO,OAAO,KAAK,GAAG;AAClD,eAAO,EAAE,SAAS,oBAAoB;AAAA,MACxC;AAEA,UAAI,OAAO,WAAW,GAAG;AACvB,eAAO;AAAA,UACL,SAAS,eAAe,OAAO,UAAU,OAAO,MAAM;AAAA,UACtD,SAAS;AAAA,QACX;AAAA,MACF;AAEA,YAAM,QAAQ,OAAO,OAAO,MAAM,IAAI;AACtC,UAAI,SAAS,OAAO;AAEpB,UAAI,MAAM,SAAS,aAAa;AAC9B,iBACE,MAAM,MAAM,GAAG,WAAW,EAAE,KAAK,IAAI,IACrC;AAAA;AAAA,wBAA6B,WAAW;AAAA,MAC5C;AAEA,aAAO,EAAE,SAAS,UAAU,oBAAoB;AAAA,IAClD,SAAS,KAAK;AACZ,aAAO;AAAA,QACL,SAAS,oBAAoB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,QAC7E,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACF;;;ACxFO,IAAM,eAAN,MAAmB;AAAA,EAChB,QAA2B,oBAAI,IAAI;AAAA,EAE3C,YAAY,iBAA0B;AACpC,UAAM,UAAU;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,eAAW,QAAQ,SAAS;AAC1B,WAAK,MAAM,IAAI,KAAK,MAAM,IAAI;AAAA,IAChC;AAEA,QAAI,iBAAiB;AACnB,iBAAW,QAAQ,iBAAiB;AAClC,aAAK,MAAM,IAAI,KAAK,MAAM,IAAI;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,IAAI,MAAgC;AAClC,WAAO,KAAK,MAAM,IAAI,IAAI;AAAA,EAC5B;AAAA,EAEA,MAAM,QACJ,MACA,MACA,KACiD;AACjD,UAAM,OAAO,KAAK,MAAM,IAAI,IAAI;AAChC,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,QACL,SAAS,iBAAiB,IAAI;AAAA,QAC9B,SAAS;AAAA,MACX;AAAA,IACF;AACA,WAAO,KAAK,KAAK,MAAM,GAAG;AAAA,EAC5B;AAAA,EAEA,oBAAsC;AACpC,WAAO,MAAM,KAAK,KAAK,MAAM,OAAO,CAAC,EAAE,IAAI,CAAC,UAAU;AAAA,MACpD,MAAM;AAAA,MACN,UAAU;AAAA,QACR,MAAM,KAAK;AAAA,QACX,aAAa,KAAK;AAAA,QAClB,YAAY,KAAK;AAAA,MACnB;AAAA,IACF,EAAE;AAAA,EACJ;AAAA,EAEA,YAAoB;AAClB,WAAO,MAAM,KAAK,KAAK,MAAM,OAAO,CAAC;AAAA,EACvC;AACF;;;AC/DA,IAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkCpB,SAAS,kBAAkB,MAKvB;AACT,MAAI,KAAK,cAAc;AACrB,WAAO,KAAK;AAAA,EACd;AAEA,QAAM,WAAqB,CAAC,kBAAkB;AAG9C,QAAM,OAAO,KAAK,SAAQ,oBAAI,KAAK,GAAE,mBAAmB,SAAS;AAAA,IAC/D,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EACP,CAAC;AACD,WAAS,KAAK;AAAA,kBAAqB,IAAI,GAAG;AAG1C,MAAI,KAAK,UAAU,KAAK,OAAO,SAAS,GAAG;AACzC,aAAS,KAAK,sBAAsB;AACpC,eAAW,SAAS,KAAK,QAAQ;AAC/B,eAAS;AAAA,QACP;AAAA,YAAe,MAAM,IAAI,GAAG,MAAM,cAAc,MAAM,MAAM,WAAW,KAAK,EAAE;AAAA,MAChF;AACA,eAAS,KAAK,MAAM,OAAO;AAAA,IAC7B;AAAA,EACF;AAEA,SAAO,SAAS,KAAK,IAAI;AAC3B;;;AClEA,IAAM,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgB9B,eAAsB,oBACpB,YACA,OACA,UACA,SACA,WACA,MACwB;AACxB,QAAM,gBACJ,MAAM,sBACN;AAEF,QAAM,kBAAiC;AAAA,IACrC,GAAG;AAAA,IACH,EAAE,MAAM,QAAQ,SAAS,cAAc;AAAA,EACzC;AAEA,QAAM,SAAqB;AAAA,IACzB;AAAA,IACA,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,YAAY;AAAA,EACd;AAEA,MAAI,cAAc;AAClB,mBAAiB,SAAS,WAAW,KAAK,MAAM,GAAG;AACjD,eAAW,UAAU,MAAM,SAAS;AAClC,UAAI,OAAO,MAAM,SAAS;AACxB,uBAAe,OAAO,MAAM;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAGA,QAAM,QAAQ,sBAAsB,SAAS;AAC7C,QAAM,iBAA8B;AAAA,IAClC,MAAM;AAAA,IACN,SAAS;AAAA;AAAA,EAA6B,WAAW;AAAA,EACnD;AACA,QAAM,QAAQ,cAAc,WAAW,cAAc;AAErD,SAAO,CAAC,cAAc;AACxB;;;AC1DO,SAAS,eAAe,MAAsB;AACnD,SAAO,KAAK,KAAK,KAAK,SAAS,CAAC;AAClC;AAEO,SAAS,uBACd,UACQ;AACR,MAAI,QAAQ;AACZ,aAAW,OAAO,UAAU;AAC1B,UAAM,UACJ,OAAO,IAAI,YAAY,WACnB,IAAI,UACJ,KAAK,UAAU,IAAI,OAAO;AAChC,aAAS,eAAe,OAAO,IAAI;AAAA,EACrC;AACA,SAAO;AACT;;;ACXA,IAAM,oBAAoB;AAEnB,SAAS,wBAAwB,MAGlB;AACpB,SAAO;AAAA,IACL,SAAS,MAAM,WAAW;AAAA,IAC1B,WAAW,MAAM,aAAa;AAAA,EAChC;AACF;AAEO,SAAS,kBACd,UACA,QACS;AACT,MAAI,CAAC,OAAO,QAAS,QAAO;AAC5B,QAAM,SAAS,uBAAuB,QAAQ;AAC9C,SAAO,UAAU,OAAO;AAC1B;;;ACcO,IAAM,SAAN,MAAa;AAAA,EACT;AAAA,EAED;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAA0B,CAAC;AAAA,EAC3B,SAAS;AAAA,EACT,kBAA0C;AAAA,EAC1C;AAAA,EACA;AAAA,EAER,YAAY,QAAsB,MAAsB;AACtD,SAAK,SAAS;AACd,SAAK,YAAY,MAAM,aAAa,aAAa;AACjD,SAAK,MAAM,MAAM,OAAO;AACxB,SAAK,QAAQ,MAAM,SAAS,OAAO,SAAS;AAC5C,SAAK,UAAU,IAAI,eAAe,OAAO,IAAI,OAAO,UAAU;AAC9D,SAAK,eAAe,IAAI,aAAa;AAErC,QAAI,MAAM,QAAQ;AAEhB,WAAK,SAAS;AAAA,IAChB;AAAA,EACF;AAAA,EAEA,OAAO,IACL,QACA,MAC4C;AAC5C,SAAK,kBAAkB,IAAI,gBAAgB;AAC3C,UAAM,SAAS,MAAM,UAAU,KAAK,gBAAgB;AAEpD,QAAI;AAEF,UAAI,CAAC,KAAK,QAAQ;AAChB,aAAK,WAAW,MAAM,KAAK,QAAQ,aAAa,KAAK,SAAS;AAC9D,aAAK,SAAS;AAAA,MAChB;AAGA,YAAM,cAA2B,EAAE,MAAM,QAAQ,SAAS,OAAO;AACjE,WAAK,SAAS,KAAK,WAAW;AAC9B,YAAM,KAAK,QAAQ,cAAc,KAAK,WAAW,WAAW;AAG5D,YAAM,eAAe,kBAAkB;AAAA,QACrC,cAAc,KAAK,OAAO;AAAA,QAC1B,QAAQ,KAAK,OAAO;AAAA,QACpB,OAAO,KAAK,aAAa,UAAU;AAAA,MACrC,CAAC;AAED,YAAM,WAAW,KAAK,aAAa,kBAAkB;AACrD,YAAM,UAAuB;AAAA,QAC3B,IAAI,KAAK,OAAO;AAAA,QAChB,UAAU,KAAK,OAAO;AAAA,QACtB,KAAK,KAAK;AAAA,MACZ;AAGA,aAAO,CAAC,OAAO,SAAS;AACtB,cAAM,qBAA+B,CAAC;AACtC,cAAM,uBAAuB,oBAAI,IAG/B;AACF,YAAI,eAA8B;AAElC,cAAM,SAAS,KAAK,OAAO,WAAW,KAAK;AAAA,UACzC,OAAO,KAAK;AAAA,UACZ,UAAU,KAAK;AAAA,UACf,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,YAAY,KAAK,OAAO;AAAA,QAC1B,CAAC;AAED,yBAAiB,SAAS,QAAQ;AAChC,cAAI,OAAO,QAAS;AAEpB,qBAAW,UAAU,MAAM,SAAS;AAClC,gBAAI,OAAO,eAAe;AACxB,6BAAe,OAAO;AAAA,YACxB;AAEA,kBAAM,QAAQ,OAAO;AAGrB,gBAAI,MAAM,SAAS;AACjB,iCAAmB,KAAK,MAAM,OAAO;AACrC,oBAAM,EAAE,MAAM,cAAc,MAAM,MAAM,QAAQ;AAAA,YAClD;AAGA,gBAAI,MAAM,YAAY;AACpB,yBAAW,MAAM,MAAM,YAAY;AACjC,sBAAM,WAAW,qBAAqB,IAAI,GAAG,KAAK;AAElD,oBAAI,CAAC,UAAU;AACb,wBAAM,KAAK,GAAG,MAAM;AACpB,wBAAM,OAAO,GAAG,UAAU,QAAQ;AAClC,uCAAqB,IAAI,GAAG,OAAO;AAAA,oBACjC;AAAA,oBACA;AAAA,oBACA,WAAW,GAAG,UAAU,aAAa;AAAA,kBACvC,CAAC;AAED,sBAAI,GAAG,MAAM,GAAG,UAAU,MAAM;AAC9B,0BAAM;AAAA,sBACJ,MAAM;AAAA,sBACN,UAAU;AAAA,sBACV,WAAW;AAAA,oBACb;AAAA,kBACF;AAAA,gBACF,OAAO;AACL,sBAAI,GAAG,GAAI,UAAS,KAAK,GAAG;AAC5B,sBAAI,GAAG,UAAU,KAAM,UAAS,OAAO,GAAG,SAAS;AACnD,sBAAI,GAAG,UAAU,WAAW;AAC1B,6BAAS,aAAa,GAAG,SAAS;AAClC,0BAAM;AAAA,sBACJ,MAAM;AAAA,sBACN,OAAO,GAAG,SAAS;AAAA,oBACrB;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,YAAI,OAAO,QAAS;AAGpB,cAAM,cAAc,mBAAmB,KAAK,EAAE;AAC9C,cAAM,YAA+B,MAAM;AAAA,UACzC,qBAAqB,OAAO;AAAA,QAC9B,EAAE,IAAI,CAAC,QAAQ;AAAA,UACb,IAAI,GAAG;AAAA,UACP,MAAM;AAAA,UACN,UAAU;AAAA,YACR,MAAM,GAAG;AAAA,YACT,WAAW,GAAG;AAAA,UAChB;AAAA,QACF,EAAE;AAEF,cAAM,eAAiC;AAAA,UACrC,MAAM;AAAA,UACN,SAAS,eAAe;AAAA,UACxB,GAAI,UAAU,SAAS,IAAI,EAAE,YAAY,UAAU,IAAI,CAAC;AAAA,QAC1D;AAEA,aAAK,SAAS,KAAK,YAAY;AAC/B,cAAM,KAAK,QAAQ,cAAc,KAAK,WAAW,YAAY;AAG7D,YACE,UAAU,SAAS,MAClB,iBAAiB,gBAAgB,iBAAiB,UAAU,CAAC,eAC9D;AACA,qBAAW,MAAM,WAAW;AAC1B,gBAAI,aAAsC,CAAC;AAC3C,gBAAI;AACF,2BAAa,KAAK,MAAM,GAAG,SAAS,SAAS;AAAA,YAC/C,QAAQ;AAAA,YAER;AAEA,kBAAM,SAAS,MAAM,KAAK,aAAa;AAAA,cACrC,GAAG,SAAS;AAAA,cACZ;AAAA,cACA;AAAA,YACF;AAEA,kBAAM;AAAA,cACJ,MAAM;AAAA,cACN,WAAW,GAAG;AAAA,cACd,UAAU,GAAG,SAAS;AAAA,cACtB;AAAA,YACF;AAEA,kBAAM,gBAA6B;AAAA,cACjC,MAAM;AAAA,cACN,cAAc,GAAG;AAAA,cACjB,SAAS,OAAO;AAAA,YAClB;AAEA,iBAAK,SAAS,KAAK,aAAa;AAChC,kBAAM,KAAK,QAAQ,cAAc,KAAK,WAAW,aAAa;AAAA,UAChE;AAGA;AAAA,QACF;AAGA,cAAM,EAAE,MAAM,oBAAoB,SAAS,aAAa;AACxD;AAAA,MACF;AAGA,YAAM,oBACJ,KAAK,OAAO,eAAe,wBAAwB;AACrD,UAAI,kBAAkB,KAAK,UAAU,iBAAiB,GAAG;AACvD,cAAM,EAAE,MAAM,gBAAgB;AAC9B,YAAI;AACF,eAAK,WAAW,MAAM;AAAA,YACpB,KAAK,OAAO;AAAA,YACZ,KAAK;AAAA,YACL,KAAK;AAAA,YACL,KAAK;AAAA,YACL,KAAK;AAAA,UACP;AACA,gBAAM,EAAE,MAAM,mBAAmB;AAAA,QACnC,SAAS,KAAK;AACZ,gBAAM;AAAA,YACJ,MAAM;AAAA,YACN,OACE,eAAe,QACX,MACA,IAAI,MAAM,sBAAsB,OAAO,GAAG,CAAC,EAAE;AAAA,UACrD;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,UAAI,CAAC,OAAO,SAAS;AACnB,cAAM;AAAA,UACJ,MAAM;AAAA,UACN,OACE,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAAA,QACtD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,cAAsC;AAC1C,QAAI,CAAC,KAAK,QAAQ;AAChB,WAAK,WAAW,MAAM,KAAK,QAAQ,aAAa,KAAK,SAAS;AAC9D,WAAK,SAAS;AAAA,IAChB;AACA,WAAO,CAAC,GAAG,KAAK,QAAQ;AAAA,EAC1B;AAAA,EAEA,MAAM,QAAQ,MAAiD;AAC7D,QAAI,CAAC,KAAK,QAAQ;AAChB,WAAK,WAAW,MAAM,KAAK,QAAQ,aAAa,KAAK,SAAS;AAC9D,WAAK,SAAS;AAAA,IAChB;AAEA,SAAK,WAAW,MAAM;AAAA,MACpB,KAAK,OAAO;AAAA,MACZ,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,EAAE,oBAAoB,MAAM,aAAa;AAAA,IAC3C;AAAA,EACF;AAAA,EAEA,QAAc;AACZ,SAAK,iBAAiB,MAAM;AAAA,EAC9B;AACF;;;ACvSA,eAAsB,WACpBC,KACA,OAC4B;AAC5B,QAAM,SAA4B,CAAC;AAEnC,aAAW,aAAa,OAAO;AAC7B,QAAI;AACF,YAAMC,QAAO,MAAMD,IAAG,KAAK,SAAS;AAEpC,UAAIC,MAAK,QAAQ;AACf,cAAM,QAAQ,MAAM,cAAcD,KAAI,SAAS;AAC/C,YAAI,MAAO,QAAO,KAAK,KAAK;AAAA,MAC9B,WAAWC,MAAK,aAAa;AAC3B,cAAM,YAAY,MAAM,kBAAkBD,KAAI,SAAS;AACvD,eAAO,KAAK,GAAG,SAAS;AAAA,MAC1B;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,cACbA,KACA,UACiC;AACjC,MAAI;AACF,UAAM,UAAU,MAAMA,IAAG,SAAS,QAAQ;AAC1C,UAAM,OAAO,iBAAiB,UAAU,OAAO;AAC/C,UAAM,cAAc,mBAAmB,OAAO;AAE9C,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN;AAAA,IACF;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,kBACbA,KACA,SAC4B;AAC5B,QAAM,SAA4B,CAAC;AAEnC,MAAI;AACF,UAAM,UAAU,MAAMA,IAAG,QAAQ,OAAO;AAExC,eAAW,SAAS,SAAS;AAC3B,UACE,MAAM,WACL,MAAM,SAAS,cAAc,MAAM,KAAK,SAAS,KAAK,IACvD;AACA,cAAM,QAAQ,MAAM,cAAcA,KAAI,MAAM,IAAI;AAChD,YAAI,MAAO,QAAO,KAAK,KAAK;AAAA,MAC9B,WAAW,MAAM,aAAa;AAE5B,cAAM,cAAc,GAAG,MAAM,IAAI;AACjC,cAAM,QAAQ,MAAM,cAAcA,KAAI,WAAW;AACjD,YAAI,MAAO,QAAO,KAAK,KAAK;AAAA,MAC9B;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,UAAkB,SAAyB;AAEnE,QAAM,UAAU,QAAQ,MAAM,aAAa;AAC3C,MAAI,QAAS,QAAO,QAAQ,CAAC,EAAE,KAAK;AAGpC,QAAM,QAAQ,SAAS,MAAM,GAAG;AAChC,QAAM,WAAW,MAAM,MAAM,SAAS,CAAC;AACvC,MAAI,aAAa,cAAc,MAAM,UAAU,GAAG;AAChD,WAAO,MAAM,MAAM,SAAS,CAAC;AAAA,EAC/B;AACA,SAAO,SAAS,QAAQ,SAAS,EAAE;AACrC;AAEA,SAAS,mBAAmB,SAAqC;AAE/D,QAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,WAAW,CAAC,QAAQ,WAAW,GAAG,KAAK,CAAC,QAAQ,WAAW,KAAK,GAAG;AACrE,aAAO,QAAQ,MAAM,GAAG,GAAG;AAAA,IAC7B;AAAA,EACF;AACA,SAAO;AACT;;;ACjGA,eAAsB,iBAAiB,MAId;AACvB,MAAI,SAA4B,CAAC;AAEjC,MAAI,KAAK,eAAe,KAAK,YAAY,SAAS,GAAG;AACnD,UAAM,SAAS,MAAM,WAAW,KAAK,IAAI,KAAK,WAAW;AACzD,WAAO,KAAK,GAAG,MAAM;AAAA,EACvB;AAEA,MAAI,KAAK,cAAc;AACrB,WAAO,KAAK,GAAG,KAAK,YAAY;AAAA,EAClC;AAEA,QAAM,QAAO,oBAAI,KAAK,GAAE,mBAAmB,SAAS;AAAA,IAClD,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,EACP,CAAC;AAED,SAAO,EAAE,QAAQ,KAAK;AACxB;;;ACNO,IAAM,OAAN,MAAW;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAA2C;AAAA,EAEnD,YAAY,MAAmB;AAC7B,SAAK,aAAa,KAAK;AACvB,SAAK,KAAK,KAAK;AACf,SAAK,WAAW,KAAK;AACrB,SAAK,aAAa,KAAK,SAAS,cAAc;AAC9C,SAAK,SAAS,KAAK,SAAS,UAAU,CAAC;AACvC,SAAK,cAAc,KAAK,SAAS,eAAe,CAAC;AACjD,SAAK,eAAe,KAAK,SAAS;AAClC,SAAK,QAAQ,KAAK,SAAS;AAC3B,SAAK,YAAY,KAAK,SAAS;AAC/B,SAAK,qBAAqB,KAAK,SAAS,eAAe;AACvD,SAAK,uBAAuB,KAAK,SAAS;AAC1C,SAAK,MAAM,KAAK,SAAS,OAAO;AAChC,SAAK,UAAU,IAAI,eAAe,KAAK,IAAI,KAAK,UAAU;AAAA,EAC5D;AAAA,EAEA,MAAc,YAAwC;AACpD,QAAI,KAAK,eAAgB,QAAO,KAAK;AAErC,UAAM,MAAM,MAAM,iBAAiB;AAAA,MACjC,IAAI,KAAK;AAAA,MACT,aAAa,KAAK;AAAA,MAClB,cAAc,KAAK;AAAA,IACrB,CAAC;AAED,SAAK,iBAAiB,IAAI;AAC1B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,aAAa,MAA8B;AACzC,UAAM,cAAc,wBAAwB;AAAA,MAC1C,SAAS,KAAK;AAAA,MACd,WAAW,KAAK;AAAA,IAClB,CAAC;AAKD,UAAM,SAAS,KAAK,kBAAkB,KAAK;AAE3C,WAAO,IAAI;AAAA,MACT;AAAA,QACE,YAAY,KAAK;AAAA,QACjB,IAAI,KAAK;AAAA,QACT,UAAU,KAAK;AAAA,QACf,YAAY,KAAK;AAAA,QACjB;AAAA,QACA,cAAc,KAAK;AAAA,QACnB,OAAO,KAAK;AAAA,QACZ,WAAW,KAAK;AAAA,QAChB;AAAA,MACF;AAAA,MACA;AAAA,QACE,GAAG;AAAA,QACH,KAAK,MAAM,OAAO,KAAK;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,eAAuC;AAC3C,WAAO,KAAK,QAAQ,aAAa;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAsB;AAC1B,UAAM,KAAK,UAAU;AAAA,EACvB;AACF;;;ACjHA,OAAO,YAAY;AAcZ,IAAM,iBAAN,MAA2C;AAAA,EACxC;AAAA,EACA;AAAA,EAER,YAAY,MAA6B;AACvC,SAAK,SAAS,IAAI,OAAO;AAAA,MACvB,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,IAChB,CAAC;AACD,SAAK,eAAe,KAAK,SAAS;AAAA,EACpC;AAAA,EAEA,OAAO,KAAK,QAAoD;AAC9D,UAAM,WAAW,KAAK,cAAc,OAAO,QAAQ,OAAO,QAAQ;AAElE,UAAM,SAAS,MAAM,KAAK,OAAO,KAAK,YAAY,OAAO;AAAA,MACvD,OAAO,OAAO,SAAS,KAAK;AAAA,MAC5B;AAAA,MACA,OAAO,OAAO,OAAO,IAAI,CAAC,OAAO;AAAA,QAC/B,MAAM;AAAA,QACN,UAAU,EAAE;AAAA,MACd,EAAE;AAAA,MACF,YAAY,OAAO;AAAA,MACnB,aAAa,OAAO;AAAA,MACpB,QAAQ;AAAA,IACV,CAAC;AAED,qBAAiB,SAAS,QAAQ;AAChC,YAAM;AAAA,QACJ,IAAI,MAAM;AAAA,QACV,OAAO,MAAM;AAAA,QACb,SAAS,MAAM,QAAQ,IAAI,CAAC,OAAO;AAAA,UACjC,OAAO,EAAE;AAAA,UACT,OAAO;AAAA,YACL,MAAM,EAAE,MAAM;AAAA,YACd,SAAS,EAAE,MAAM;AAAA,YACjB,YAAY,EAAE,MAAM,YAAY,IAAI,CAAC,QAAQ;AAAA,cAC3C,OAAO,GAAG;AAAA,cACV,IAAI,GAAG;AAAA,cACP,MAAM,GAAG;AAAA,cACT,UAAU,GAAG,WACT;AAAA,gBACE,MAAM,GAAG,SAAS;AAAA,gBAClB,WAAW,GAAG,SAAS;AAAA,cACzB,IACA;AAAA,YACN,EAAE;AAAA,UACJ;AAAA,UACA,eAAe,EAAE;AAAA,QACnB,EAAE;AAAA,QACF,OAAO,MAAM,QACT;AAAA,UACE,eAAe,MAAM,MAAM;AAAA,UAC3B,mBAAmB,MAAM,MAAM;AAAA,UAC/B,cAAc,MAAM,MAAM;AAAA,QAC5B,IACA;AAAA,MACN;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,cACN,QACA,UACgC;AAChC,UAAM,SAAyC,CAAC;AAChD,QAAI,QAAQ;AACV,aAAO,KAAK,EAAE,MAAM,UAAU,SAAS,OAAO,CAAC;AAAA,IACjD;AACA,eAAW,OAAO,UAAU;AAC1B,UAAI,IAAI,SAAS,QAAQ;AACvB,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,cAAc,IAAI;AAAA,UAClB,SAAS,IAAI;AAAA,QACf,CAAC;AAAA,MACH,WAAW,IAAI,SAAS,aAAa;AACnC,cAAM,QAAiC;AAAA,UACrC,MAAM;AAAA,UACN,SAAS,IAAI;AAAA,QACf;AACA,YAAI,IAAI,YAAY;AAClB,gBAAM,aAAa,IAAI;AAAA,QACzB;AACA,eAAO,KAAK,KAAK;AAAA,MACnB,OAAO;AACL,eAAO,KAAK,EAAE,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,CAAC;AAAA,MACtD;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;;;ACzGA,OAAO,eAAe;AAqBf,IAAM,oBAAN,MAA8C;AAAA,EAC3C;AAAA,EACA;AAAA,EAER,YAAY,MAAgC;AAC1C,SAAK,SAAS,IAAI,UAAU;AAAA,MAC1B,QAAQ,KAAK;AAAA,MACb,SAAS,KAAK;AAAA,IAChB,CAAC;AACD,SAAK,eAAe,KAAK,SAAS;AAAA,EACpC;AAAA,EAEA,OAAO,KAAK,QAAoD;AAC9D,UAAM,EAAE,QAAQ,UAAU,cAAc,IAAI,KAAK;AAAA,MAC/C,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAEA,UAAM,QAAQ,OAAO,OAAO,IAAI,CAAC,OAAO;AAAA,MACtC,MAAM,EAAE,SAAS;AAAA,MACjB,aAAa,EAAE,SAAS;AAAA,MACxB,cAAc,EAAE,SAAS;AAAA,IAC3B,EAAE;AAEF,UAAM,SAAS,KAAK,OAAO,SAAS,OAAO;AAAA,MACzC,OAAO,OAAO,SAAS,KAAK;AAAA,MAC5B,YAAY,OAAO,cAAc;AAAA,MACjC;AAAA,MACA,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AAED,QAAI,aAAa;AACjB,UAAM,eAAe,oBAAI,IAAoB;AAC7C,QAAI,gBAAgB;AAEpB,qBAAiB,SAAS,QAAQ;AAChC,YAAM,UAAU,YAAY,YAAY;AAExC,UAAI,MAAM,SAAS,uBAAuB;AACxC,YAAI,MAAM,cAAc,SAAS,QAAQ;AACvC,gBAAM,KAAK,UAAU,SAAS,OAAO,SAAS,KAAK,cAAc;AAAA,YAC/D,SAAS;AAAA,UACX,CAAC;AAAA,QACH,WAAW,MAAM,cAAc,SAAS,YAAY;AAClD,gBAAM,QAAQ,MAAM;AACpB,gBAAM,MAAM;AACZ,uBAAa,IAAI,MAAM,IAAI,GAAG;AAC9B,gBAAM,KAAK,UAAU,SAAS,OAAO,SAAS,KAAK,cAAc;AAAA,YAC/D,YAAY;AAAA,cACV;AAAA,gBACE,OAAO;AAAA,gBACP,IAAI,MAAM;AAAA,gBACV,MAAM;AAAA,gBACN,UAAU,EAAE,MAAM,MAAM,MAAM,WAAW,GAAG;AAAA,cAC9C;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,WAAW,MAAM,SAAS,uBAAuB;AAC/C,YAAI,MAAM,MAAM,SAAS,cAAc;AACrC,gBAAM,KAAK,UAAU,SAAS,OAAO,SAAS,KAAK,cAAc;AAAA,YAC/D,SAAS,MAAM,MAAM;AAAA,UACvB,CAAC;AAAA,QACH,WAAW,MAAM,MAAM,SAAS,oBAAoB;AAClD,gBAAM,QAAQ,MAAM;AACpB,gBAAM,aAAa,MAAM,KAAK,aAAa,KAAK,CAAC,EAAE,IAAI;AACvD,gBAAM,MAAM,aAAa,IAAI,UAAU;AACvC,gBAAM,KAAK,UAAU,SAAS,OAAO,SAAS,KAAK,cAAc;AAAA,YAC/D,YAAY;AAAA,cACV;AAAA,gBACE,OAAO;AAAA,gBACP,UAAU,EAAE,WAAW,MAAM,aAAa;AAAA,cAC5C;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,WAAW,MAAM,SAAS,gBAAgB;AACxC,cAAM;AAAA,UACJ,IAAI;AAAA,UACJ,OAAO,OAAO,SAAS,KAAK;AAAA,UAC5B,SAAS;AAAA,YACP;AAAA,cACE,OAAO;AAAA,cACP,OAAO,CAAC;AAAA,cACR,eAAe,aAAa,OAAO,IAAI,eAAe;AAAA,YACxD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,UACN,IACA,OACA,OACiB;AACjB,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,SAAS;AAAA,QACP;AAAA,UACE,OAAO;AAAA,UACP;AAAA,UACA,eAAe;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,gBACN,cACA,UAIA;AACA,UAAM,SAA4C,CAAC;AAEnD,eAAW,OAAO,UAAU;AAC1B,UAAI,IAAI,SAAS,UAAU;AAEzB;AAAA,MACF;AAEA,UAAI,IAAI,SAAS,QAAQ;AACvB,eAAO,KAAK,EAAE,MAAM,QAAQ,SAAS,IAAI,QAAQ,CAAC;AAAA,MACpD,WAAW,IAAI,SAAS,aAAa;AACnC,cAAM,UAAkD,CAAC;AACzD,YAAI,IAAI,SAAS;AACf,kBAAQ,KAAK,EAAE,MAAM,QAAQ,MAAM,IAAI,QAAQ,CAAC;AAAA,QAClD;AACA,YAAI,IAAI,YAAY;AAClB,qBAAW,MAAM,IAAI,YAAY;AAC/B,oBAAQ,KAAK;AAAA,cACX,MAAM;AAAA,cACN,IAAI,GAAG;AAAA,cACP,MAAM,GAAG,SAAS;AAAA,cAClB,OAAO,KAAK,MAAM,GAAG,SAAS,SAAS;AAAA,YACzC,CAAC;AAAA,UACH;AAAA,QACF;AACA,eAAO,KAAK,EAAE,MAAM,aAAa,QAAQ,CAAC;AAAA,MAC5C,WAAW,IAAI,SAAS,QAAQ;AAC9B,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,aAAa,IAAI;AAAA,cACjB,SAAS,IAAI;AAAA,YACf;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO,EAAE,QAAQ,cAAc,UAAU,OAAO;AAAA,EAClD;AACF;;;ACrLA,SAAS,mBAAmB;AA2BrB,IAAM,iBAAN,MAA2C;AAAA,EACxC;AAAA,EACA;AAAA,EAER,YAAY,MAA6B;AACvC,SAAK,SAAS,IAAI,YAAY,EAAE,QAAQ,KAAK,OAAO,CAAC;AACrD,SAAK,eAAe,KAAK,SAAS;AAAA,EACpC;AAAA,EAEA,OAAO,KAAK,QAAoD;AAC9D,UAAM,EAAE,UAAU,kBAAkB,IAAI,KAAK;AAAA,MAC3C,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAEA,UAAM,QAAQ,OAAO,OAAO,SACxB;AAAA,MACE;AAAA,QACE,sBAAsB,OAAO,MAAM,IAAI,CAAC,OAAO;AAAA,UAC7C,MAAM,EAAE,SAAS;AAAA,UACjB,aAAa,EAAE,SAAS;AAAA,UACxB,YAAY,EAAE,SAAS;AAAA,QACzB,EAAE;AAAA,MACJ;AAAA,IACF,IACA;AAEJ,UAAM,SAAS,MAAM,KAAK,OAAO,OAAO,sBAAsB;AAAA,MAC5D,OAAO,OAAO,SAAS,KAAK;AAAA,MAC5B;AAAA,MACA,QAAQ;AAAA,QACN,mBAAmB,qBAAqB;AAAA,QACxC,iBAAiB,OAAO;AAAA,QACxB,aAAa,OAAO;AAAA,QACpB;AAAA,QACA,gBAAgB;AAAA,UACd,gBAAgB;AAAA,QAClB;AAAA,MACF;AAAA,IACF,CAAC;AAED,QAAI,aAAa;AACjB,QAAI,gBAAgB;AAEpB,qBAAiB,SAAS,QAAQ;AAChC,YAAM,UAAU,UAAU,YAAY;AACtC,YAAM,QAAQ,OAAO,SAAS,KAAK;AACnC,YAAM,aAAa,MAAM;AACzB,UAAI,CAAC,cAAc,WAAW,WAAW,EAAG;AAE5C,YAAM,QAAQ,WAAW,CAAC,EAAE,SAAS;AACrC,UAAI,CAAC,MAAO;AAEZ,iBAAW,QAAQ,OAAO;AACxB,YAAI,KAAK,SAAS,UAAa,KAAK,SAAS,MAAM;AACjD,gBAAM;AAAA,YACJ,IAAI;AAAA,YACJ;AAAA,YACA,SAAS;AAAA,cACP;AAAA,gBACE,OAAO;AAAA,gBACP,OAAO,EAAE,SAAS,KAAK,KAAK;AAAA,gBAC5B,eAAe;AAAA,cACjB;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,YAAI,KAAK,cAAc;AACrB,gBAAM,KAAK,KAAK;AAChB,gBAAM,OAAO,aAAa,aAAa;AACvC,gBAAM,MAAM;AAEZ,gBAAM;AAAA,YACJ,IAAI;AAAA,YACJ;AAAA,YACA,SAAS;AAAA,cACP;AAAA,gBACE,OAAO;AAAA,gBACP,OAAO;AAAA,kBACL,YAAY;AAAA,oBACV;AAAA,sBACE,OAAO;AAAA,sBACP,IAAI;AAAA,sBACJ,MAAM;AAAA,sBACN,UAAU;AAAA,wBACR,MAAM,GAAG;AAAA,wBACT,WAAW,KAAK,UAAU,GAAG,QAAQ,CAAC,CAAC;AAAA,sBACzC;AAAA,oBACF;AAAA,kBACF;AAAA,gBACF;AAAA,gBACA,eAAe;AAAA,cACjB;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAM,eAAe,WAAW,CAAC,EAAE;AACnC,UAAI,gBAAgB,iBAAiB,6BAA6B;AAChE,cAAM,SACJ,iBAAiB,SACb,gBAAgB,IACd,eACA,SACF;AAEN,cAAM;AAAA,UACJ,IAAI;AAAA,UACJ;AAAA,UACA,SAAS,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,eAAe,OAAO,CAAC;AAAA,QAC1D;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,gBACN,cACA,UACsE;AACtE,UAAM,WAA4B,CAAC;AAGnC,UAAM,mBAAmB,oBAAI,IAAoB;AACjD,eAAW,OAAO,UAAU;AAC1B,UAAI,IAAI,SAAS,eAAe,IAAI,YAAY;AAC9C,mBAAW,MAAM,IAAI,YAAY;AAC/B,2BAAiB,IAAI,GAAG,IAAI,GAAG,SAAS,IAAI;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AAEA,QAAI,2BAAyC,CAAC;AAE9C,eAAW,OAAO,UAAU;AAC1B,UAAI,IAAI,SAAS,UAAU;AACzB;AAAA,MACF;AAEA,UAAI,IAAI,SAAS,QAAQ;AACvB,YAAI,yBAAyB,SAAS,GAAG;AACvC,mBAAS,KAAK,EAAE,MAAM,QAAQ,OAAO,yBAAyB,CAAC;AAC/D,qCAA2B,CAAC;AAAA,QAC9B;AACA,iBAAS,KAAK,EAAE,MAAM,QAAQ,OAAO,CAAC,EAAE,MAAM,IAAI,QAAQ,CAAC,EAAE,CAAC;AAAA,MAChE,WAAW,IAAI,SAAS,aAAa;AACnC,cAAM,QAAsB,CAAC;AAC7B,YAAI,IAAI,SAAS;AACf,gBAAM,KAAK,EAAE,MAAM,IAAI,QAAQ,CAAC;AAAA,QAClC;AACA,YAAI,IAAI,YAAY;AAClB,qBAAW,MAAM,IAAI,YAAY;AAC/B,gBAAI,OAAgC,CAAC;AACrC,gBAAI;AACF,qBAAO,KAAK,MAAM,GAAG,SAAS,SAAS;AAAA,YACzC,QAAQ;AAAA,YAER;AACA,kBAAM,KAAK;AAAA,cACT,cAAc,EAAE,MAAM,GAAG,SAAS,MAAM,KAAK;AAAA,YAC/C,CAAC;AAAA,UACH;AAAA,QACF;AACA,YAAI,MAAM,SAAS,GAAG;AACpB,mBAAS,KAAK,EAAE,MAAM,SAAS,MAAM,CAAC;AAAA,QACxC;AAAA,MACF,WAAW,IAAI,SAAS,QAAQ;AAC9B,cAAM,SACJ,iBAAiB,IAAI,IAAI,YAAY,KAAK,IAAI;AAChD,iCAAyB,KAAK;AAAA,UAC5B,kBAAkB;AAAA,YAChB,MAAM;AAAA,YACN,UAAU,EAAE,QAAQ,IAAI,QAAQ;AAAA,UAClC;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,QAAI,yBAAyB,SAAS,GAAG;AACvC,eAAS,KAAK,EAAE,MAAM,QAAQ,OAAO,yBAAyB,CAAC;AAAA,IACjE;AAEA,WAAO,EAAE,UAAU,mBAAmB,aAAa;AAAA,EACrD;AACF;;;ACpNA,YAAY,QAAQ;AACpB,YAAY,UAAU;AAOf,IAAM,UAAN,MAAmC;AAAA,EAChC;AAAA,EAER,YAAY,MAAuB;AACjC,SAAK,WAAW,MAAM,YAAY,QAAQ,IAAI;AAAA,EAChD;AAAA,EAEQ,QAAQ,GAAmB;AACjC,QAAS,gBAAW,CAAC,EAAG,QAAO;AAC/B,WAAY,aAAQ,KAAK,UAAU,CAAC;AAAA,EACtC;AAAA,EAEA,MAAM,SAAS,UAAkB,MAAqC;AACpE,UAAM,WAAW,MAAM,YAAY;AACnC,WAAU,YAAS,KAAK,QAAQ,QAAQ,GAAG,EAAE,SAAS,CAAC;AAAA,EACzD;AAAA,EAEA,MAAM,UAAU,UAAkB,SAAgC;AAChE,UAAM,WAAW,KAAK,QAAQ,QAAQ;AACtC,UAAS,SAAW,aAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAC1D,UAAS,aAAU,UAAU,SAAS,OAAO;AAAA,EAC/C;AAAA,EAEA,MAAM,WAAW,UAAkB,SAAgC;AACjE,UAAM,WAAW,KAAK,QAAQ,QAAQ;AACtC,UAAS,SAAW,aAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAC1D,UAAS,cAAW,UAAU,SAAS,OAAO;AAAA,EAChD;AAAA,EAEA,MAAM,WACJ,UACA,MACe;AACf,UAAS,MAAG,KAAK,QAAQ,QAAQ,GAAG;AAAA,MAClC,WAAW,MAAM,aAAa;AAAA,MAC9B,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAM,SAAiB,MAA+C;AAC1E,UAAS,SAAM,KAAK,QAAQ,OAAO,GAAG;AAAA,MACpC,WAAW,MAAM,aAAa;AAAA,IAChC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,QACJ,SACA,MACsB;AACtB,UAAM,WAAW,KAAK,QAAQ,OAAO;AACrC,UAAM,UAAU,MAAS,WAAQ,UAAU,EAAE,eAAe,KAAK,CAAC;AAClE,UAAM,UAAuB,CAAC;AAE9B,eAAW,SAAS,SAAS;AAC3B,YAAM,YAAiB,UAAK,UAAU,MAAM,IAAI;AAChD,cAAQ,KAAK;AAAA,QACX,MAAM,MAAM;AAAA,QACZ,MAAM;AAAA,QACN,aAAa,MAAM,YAAY;AAAA,QAC/B,QAAQ,MAAM,OAAO;AAAA,MACvB,CAAC;AAED,UAAI,MAAM,aAAa,MAAM,YAAY,GAAG;AAC1C,cAAM,aAAa,MAAM,KAAK,QAAQ,WAAW,EAAE,WAAW,KAAK,CAAC;AACpE,gBAAQ,KAAK,GAAG,UAAU;AAAA,MAC5B;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,UAAoC;AAC/C,QAAI;AACF,YAAS,UAAO,KAAK,QAAQ,QAAQ,CAAC;AACtC,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,UAAqC;AAC9C,UAAM,QAAQ,MAAS,QAAK,KAAK,QAAQ,QAAQ,CAAC;AAClD,WAAO;AAAA,MACL,MAAM,MAAM;AAAA,MACZ,aAAa,MAAM,YAAY;AAAA,MAC/B,QAAQ,MAAM,OAAO;AAAA,MACrB,WAAW,MAAM;AAAA,MACjB,YAAY,MAAM;AAAA,IACpB;AAAA,EACF;AACF;;;AClGA,SAAS,QAAQ,cAAc;AAQxB,IAAM,gBAAN,MAA+C;AAAA,EAC5C;AAAA,EACA;AAAA,EAER,YAAY,MAA6B;AACvC,SAAK,aAAa,MAAM,cAAc,QAAQ,IAAI;AAClD,SAAK,iBAAiB,MAAM,kBAAkB;AAAA,EAChD;AAAA,EAEA,eAAe,SAAiB,MAA4C;AAC1E,WAAO,IAAI,QAAQ,CAACE,aAAY;AAC9B,YAAM,QAAQ;AAAA,QACZ;AAAA,QACA;AAAA,UACE,KAAK,MAAM,OAAO,KAAK;AAAA,UACvB,SAAS,MAAM,WAAW,KAAK;AAAA,UAC/B,KAAK,MAAM,MACP,EAAE,GAAG,QAAQ,KAAK,GAAG,KAAK,IAAI,IAC9B,QAAQ;AAAA,UACZ,WAAW,KAAK,OAAO;AAAA,UACvB,OAAO;AAAA,QACT;AAAA,QACA,CAAC,OAAO,QAAQ,WAAW;AACzB,UAAAA,SAAQ;AAAA,YACN,UACE,SAAS,UAAU,QACd,MAAM,QAAmB,IAC1B,MAAM,YAAY;AAAA,YACxB,QAAQ,UAAU;AAAA,YAClB,QAAQ,UAAU;AAAA,UACpB,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;AC9BO,IAAM,YAAN,MAAqC;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,MAAwB;AAClC,SAAK,QAAQ,KAAK;AAClB,SAAK,aAAa,KAAK;AACvB,SAAK,WAAW,KAAK,WAAW,2BAA2B;AAAA,MACzD;AAAA,MACA;AAAA,IACF;AACA,SAAK,aAAa,KAAK,cAAc;AAAA,EACvC;AAAA,EAEQ,MAAM,UAAkB,QAAyC;AACvE,UAAM,MAAM,IAAI;AAAA,MACd,GAAG,KAAK,OAAO,eAAe,KAAK,UAAU,MAAM,QAAQ;AAAA,IAC7D;AACA,QAAI,QAAQ;AACV,iBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC3C,YAAI,aAAa,IAAI,GAAG,CAAC;AAAA,MAC3B;AAAA,IACF;AACA,WAAO,IAAI,SAAS;AAAA,EACtB;AAAA,EAEQ,YAAY,GAAmB;AACrC,QAAI,EAAE,WAAW,GAAG,EAAG,QAAO;AAC9B,WAAO,GAAG,KAAK,UAAU,IAAI,CAAC;AAAA,EAChC;AAAA,EAEQ,UAAkC;AACxC,WAAO;AAAA,MACL,eAAe,UAAU,KAAK,KAAK;AAAA,IACrC;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,UAAkB,OAAsC;AACrE,UAAM,MAAM,KAAK,MAAM,SAAS,EAAE,MAAM,KAAK,YAAY,QAAQ,EAAE,CAAC;AACpE,UAAM,MAAM,MAAM,MAAM,KAAK,EAAE,SAAS,KAAK,QAAQ,EAAE,CAAC;AACxD,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,IAAI;AAAA,QACR,8BAA8B,IAAI,MAAM,MAAM,MAAM,IAAI,KAAK,CAAC;AAAA,MAChE;AAAA,IACF;AACA,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,MAAM,UAAU,UAAkB,SAAgC;AAChE,UAAM,MAAM,KAAK,MAAM,QAAQ;AAC/B,UAAM,MAAM,MAAM,MAAM,KAAK;AAAA,MAC3B,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,GAAG,KAAK,QAAQ;AAAA,QAChB,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB,MAAM,KAAK,YAAY,QAAQ;AAAA,QAC/B;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AACD,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,IAAI;AAAA,QACR,+BAA+B,IAAI,MAAM,MAAM,MAAM,IAAI,KAAK,CAAC;AAAA,MACjE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,UAAkB,SAAgC;AACjE,QAAI,WAAW;AACf,QAAI;AACF,iBAAW,MAAM,KAAK,SAAS,QAAQ;AAAA,IACzC,QAAQ;AAAA,IAER;AACA,UAAM,KAAK,UAAU,UAAU,WAAW,OAAO;AAAA,EACnD;AAAA,EAEA,MAAM,WACJ,UACA,MACe;AACf,UAAM,MAAM,KAAK,MAAM,SAAS;AAChC,UAAM,MAAM,MAAM,MAAM,KAAK;AAAA,MAC3B,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,GAAG,KAAK,QAAQ;AAAA,QAChB,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB,MAAM,KAAK,YAAY,QAAQ;AAAA,QAC/B,WAAW,MAAM,aAAa;AAAA,MAChC,CAAC;AAAA,IACH,CAAC;AACD,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,IAAI;AAAA,QACR,gCAAgC,IAAI,MAAM,MAAM,MAAM,IAAI,KAAK,CAAC;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,MACJ,SACA,MACe;AACf,UAAM,MAAM,KAAK,MAAM,QAAQ;AAC/B,UAAM,MAAM,MAAM,MAAM,KAAK;AAAA,MAC3B,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,GAAG,KAAK,QAAQ;AAAA,QAChB,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB,MAAM,KAAK,YAAY,OAAO;AAAA,QAC9B,WAAW,MAAM,aAAa;AAAA,MAChC,CAAC;AAAA,IACH,CAAC;AACD,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,IAAI;AAAA,QACR,2BAA2B,IAAI,MAAM,MAAM,MAAM,IAAI,KAAK,CAAC;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,QACJ,SACA,OACsB;AACtB,UAAM,MAAM,KAAK,MAAM,YAAY,EAAE,MAAM,KAAK,YAAY,OAAO,EAAE,CAAC;AACtE,UAAM,MAAM,MAAM,MAAM,KAAK,EAAE,SAAS,KAAK,QAAQ,EAAE,CAAC;AACxD,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,IAAI;AAAA,QACR,6BAA6B,IAAI,MAAM,MAAM,MAAM,IAAI,KAAK,CAAC;AAAA,MAC/D;AAAA,IACF;AACA,UAAM,OAAQ,MAAM,IAAI,KAAK;AAM7B,WAAO,KAAK,IAAI,CAAC,WAAW;AAAA,MAC1B,MAAM,MAAM;AAAA,MACZ,MAAM,MAAM;AAAA,MACZ,aAAa,MAAM;AAAA,MACnB,QAAQ,CAAC,MAAM;AAAA,MACf,MAAM,MAAM;AAAA,IACd,EAAE;AAAA,EACJ;AAAA,EAEA,MAAM,OAAO,UAAoC;AAC/C,QAAI;AACF,YAAM,KAAK,KAAK,QAAQ;AACxB,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,UAAqC;AAC9C,UAAM,MAAM,KAAK,MAAM,SAAS,EAAE,MAAM,KAAK,YAAY,QAAQ,EAAE,CAAC;AACpE,UAAM,MAAM,MAAM,MAAM,KAAK,EAAE,SAAS,KAAK,QAAQ,EAAE,CAAC;AACxD,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,IAAI;AAAA,QACR,0BAA0B,IAAI,MAAM,MAAM,MAAM,IAAI,KAAK,CAAC;AAAA,MAC5D;AAAA,IACF;AACA,UAAM,OAAQ,MAAM,IAAI,KAAK;AAM7B,WAAO;AAAA,MACL,MAAM,KAAK;AAAA,MACX,aAAa,KAAK;AAAA,MAClB,QAAQ,CAAC,KAAK;AAAA,MACd,WAAW,KAAK,aAAa,IAAI,KAAK,KAAK,UAAU,IAAI;AAAA,MACzD,YAAY,KAAK,cAAc,IAAI,KAAK,KAAK,WAAW,IAAI;AAAA,IAC9D;AAAA,EACF;AACF;;;AC3KO,IAAM,kBAAN,MAAiD;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,MAA8B;AACxC,SAAK,QAAQ,KAAK;AAClB,SAAK,aAAa,KAAK;AACvB,SAAK,WAAW,KAAK,WAAW,2BAA2B;AAAA,MACzD;AAAA,MACA;AAAA,IACF;AACA,SAAK,aAAa,KAAK,cAAc;AAAA,EACvC;AAAA,EAEQ,UAAkC;AACxC,WAAO;AAAA,MACL,eAAe,UAAU,KAAK,KAAK;AAAA,MACnC,gBAAgB;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,MAAM,eACJ,SACA,MACwB;AACxB,UAAM,MAAM,MAAM,OAAO,KAAK;AAC9B,UAAM,iBAAiB,MAAM,KAAK,YAAY,GAAG,CAAC,OAAO,OAAO;AAEhE,UAAM,MAAM,GAAG,KAAK,OAAO,eAAe,KAAK,UAAU;AAEzD,UAAM,MAAM,MAAM,MAAM,KAAK;AAAA,MAC3B,QAAQ;AAAA,MACR,SAAS,KAAK,QAAQ;AAAA,MACtB,MAAM,KAAK,UAAU;AAAA,QACnB,SAAS,CAAC,QAAQ,MAAM,cAAc;AAAA,QACtC,SAAS,MAAM,WAAW;AAAA,QAC1B,KAAK,MAAM;AAAA,MACb,CAAC;AAAA,IACH,CAAC;AAED,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,aAAO;AAAA,QACL,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,QAAQ,wBAAwB,IAAI,MAAM,MAAM,IAAI;AAAA,MACtD;AAAA,IACF;AAEA,UAAM,OAAQ,MAAM,IAAI,KAAK;AAM7B,WAAO;AAAA,MACL,UAAU,KAAK;AAAA,MACf,QAAQ,KAAK,UAAU;AAAA,MACvB,QAAQ,KAAK,UAAU;AAAA,IACzB;AAAA,EACF;AAAA,EAEQ,YAAY,GAAmB;AACrC,WAAO,IAAI,EAAE,QAAQ,MAAM,OAAO,CAAC;AAAA,EACrC;AACF;","names":["fs","path","fs","stat","resolve"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "noumen",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Programmatic AI coding agent library with pluggable providers and virtual infrastructure",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"types": "./dist/index.d.ts"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
18
|
+
"engines": {
|
|
19
|
+
"node": ">=18.0.0"
|
|
20
|
+
},
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"openai": "^4.85.0",
|
|
23
|
+
"@anthropic-ai/sdk": "^0.39.0",
|
|
24
|
+
"@google/genai": "^1.48.0",
|
|
25
|
+
"uuid": "^11.1.0"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"typescript": "^5.7.0",
|
|
29
|
+
"@types/node": "^22.0.0",
|
|
30
|
+
"@types/uuid": "^10.0.0",
|
|
31
|
+
"tsup": "^8.4.0",
|
|
32
|
+
"vitest": "^3.0.0"
|
|
33
|
+
},
|
|
34
|
+
"scripts": {
|
|
35
|
+
"build": "tsup",
|
|
36
|
+
"typecheck": "tsc --noEmit",
|
|
37
|
+
"test": "vitest run",
|
|
38
|
+
"dev": "tsup --watch",
|
|
39
|
+
"publish:lib": "pnpm publish --access public --no-git-checks"
|
|
40
|
+
}
|
|
41
|
+
}
|