mnemosyne-core 2.0.0 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/config.ts","../../src/server/embedder.ts","../../src/server/api.ts","../../src/mcp/tools.ts","../../src/mcp/server.ts","../../src/mcp/sse.ts","../../src/api/middleware.ts","../../src/api/utils.ts","../../src/api/routes/assistants.ts","../../src/api/routes/projects.ts","../../src/api/routes/atoms.ts","../../src/api/routes/bonds.ts","../../src/api/routes/blocks.ts","../../src/api/routes/search.ts","../../src/server/files.ts","../../src/api/routes/files.ts","../../src/server/export-format.ts","../../src/api/routes/export-import.ts","../../src/api/routes/events.ts","../../src/api/routes/health.ts","../../src/core/types.ts","../../src/api/routes/tree.ts","../../src/api/router.ts"],"sourcesContent":["/**\n * Mnemosyne Configuration Loader\n * Reads config.yaml with a minimal parser. No external YAML dependency.\n */\n\nimport { readFileSync, existsSync } from \"fs\";\nimport { resolve } from \"path\";\n\nfunction parseValue(v: string): any {\n const trimmed = v.trim();\n if (trimmed === \"true\") return true;\n if (trimmed === \"false\") return false;\n if (trimmed === \"null\" || trimmed === \"~\") return null;\n if (/^-?\\d+$/.test(trimmed)) return parseInt(trimmed, 10);\n if (/^-?\\d+\\.\\d+$/.test(trimmed)) return parseFloat(trimmed);\n if ((trimmed.startsWith('\"') && trimmed.endsWith('\"')) || (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\"))) {\n return trimmed.slice(1, -1);\n }\n return trimmed;\n}\n\nfunction parseYaml(text: string): any {\n const lines = text.split(\"\\n\");\n const root: any = {};\n const stack: { obj: any; indent: number; isArray: boolean }[] = [{ obj: root, indent: -1, isArray: false }];\n\n for (const rawLine of lines) {\n const commentIdx = rawLine.indexOf(\"#\");\n const line = commentIdx >= 0 ? rawLine.slice(0, commentIdx) : rawLine;\n if (!line.trim()) continue;\n\n const indent = line.length - line.trimStart().length;\n const trimmed = line.trim();\n\n while (stack.length > 1 && stack[stack.length - 1].indent >= indent) {\n stack.pop();\n }\n\n const parent = stack[stack.length - 1];\n\n if (trimmed.startsWith(\"- \")) {\n const valueStr = trimmed.slice(2).trim();\n if (!parent.isArray) {\n // Convert parent object to array if needed (not expected in our config)\n }\n let target: any[] = parent.obj;\n if (!Array.isArray(target)) {\n // Should not happen with well-formed config\n target = [];\n }\n if (valueStr.includes(\":\")) {\n const item: any = {};\n const colonIdx = valueStr.indexOf(\":\");\n const k = valueStr.slice(0, colonIdx).trim();\n const v = valueStr.slice(colonIdx + 1).trim();\n item[k] = parseValue(v);\n target.push(item);\n } else {\n target.push(parseValue(valueStr));\n }\n continue;\n }\n\n const colonIdx = trimmed.indexOf(\":\");\n if (colonIdx === -1) continue;\n\n const key = trimmed.slice(0, colonIdx).trim();\n const valueStr = trimmed.slice(colonIdx + 1).trim();\n\n if (!valueStr) {\n const newObj: any = {};\n parent.obj[key] = newObj;\n stack.push({ obj: newObj, indent, isArray: false });\n } else {\n parent.obj[key] = parseValue(valueStr);\n }\n }\n\n return root;\n}\n\nfunction loadConfig(): Config {\n const configPath = resolve(process.cwd(), \"config.yaml\");\n if (!existsSync(configPath)) {\n console.warn(\"[Config] config.yaml not found, using defaults\");\n return defaultConfig();\n }\n try {\n const raw = readFileSync(configPath, \"utf-8\");\n const parsed = parseYaml(raw);\n return mergeDeep(defaultConfig(), parsed) as Config;\n } catch (err: any) {\n console.error(\"[Config] Failed to parse config.yaml:\", err.message);\n return defaultConfig();\n }\n}\n\nfunction defaultConfig(): Config {\n return {\n server: { port: 7321, host: \"localhost\", version: \"2.0.0\" },\n database: { path: \"data/nexus.db\", wal_mode: true, vec_extension_path: \"data/vec0\" },\n storage: { files_dir: \"data/files\", max_file_size_mb: 50, backups_dir: \"data/backups\", backup_interval_hours: 24, max_backups: 7 },\n limits: { max_atoms_per_project: 10000, rate_limit_requests: 100, rate_limit_window_ms: 60000 },\n embeddings: { model: \"Xenova/all-MiniLM-L6-v2\", dimension: 384, max_text_length: 10000 },\n features: { mcp_enabled: true, auto_index_enabled: true, file_processing_enabled: true },\n index: { debounce_ms: 30000 },\n search: { semantic_weight: 0.6, fts_weight: 0.4 },\n bonds: { default_type: \"relates\" },\n };\n}\n\nfunction mergeDeep(target: any, source: any): any {\n if (!source || typeof source !== \"object\") return target;\n const output = { ...target };\n for (const key of Object.keys(source)) {\n if (source[key] && typeof source[key] === \"object\" && !Array.isArray(source[key])) {\n output[key] = mergeDeep(target[key] || {}, source[key]);\n } else {\n output[key] = source[key];\n }\n }\n return output;\n}\n\n// ─── Typed Config Interface ───\nexport interface Config {\n server: {\n port: number;\n host: string;\n version: string;\n };\n database: {\n path: string;\n wal_mode: boolean;\n vec_extension_path: string;\n };\n storage: {\n files_dir: string;\n max_file_size_mb: number;\n backups_dir: string;\n backup_interval_hours: number;\n max_backups: number;\n };\n limits: {\n max_atoms_per_project: number;\n rate_limit_requests: number;\n rate_limit_window_ms: number;\n };\n embeddings: {\n model: string;\n dimension: number;\n max_text_length: number;\n };\n features: {\n mcp_enabled: boolean;\n auto_index_enabled: boolean;\n file_processing_enabled: boolean;\n };\n index: {\n debounce_ms: number;\n };\n search: {\n semantic_weight: number;\n fts_weight: number;\n };\n bonds: {\n default_type: string;\n };\n}\n\nexport const CONFIG: Config = loadConfig();\n","/**\n * Mnemosyne Embedder\n * Lazy-loaded semantic embedding using @xenova/transformers.\n * Model: all-MiniLM-L6-v2 (384 dimensions)\n * Downloads model on first use (~50MB).\n */\n\nimport { pipeline, type FeatureExtractionPipeline } from \"@xenova/transformers\";\nimport { CONFIG } from \"../config.js\";\n\nlet extractor: FeatureExtractionPipeline | null = null;\nlet loading = false;\nlet loadError: Error | null = null;\n\nasync function getExtractor(): Promise<FeatureExtractionPipeline | null> {\n if (extractor) return extractor;\n if (loadError) return null;\n if (loading) {\n // Wait for existing load\n while (loading) await new Promise(r => setTimeout(r, 100));\n return extractor;\n }\n\n loading = true;\n try {\n // Use Xenova's hosted model (no local path needed)\n extractor = await pipeline(\"feature-extraction\", CONFIG.embeddings.model, {\n quantized: true, // Use quantized model for faster download\n });\n console.log(`[Embedder] Model loaded: ${CONFIG.embeddings.model}`);\n return extractor;\n } catch (err: any) {\n loadError = err;\n console.error(\"[Embedder] Failed to load model:\", err.message);\n return null;\n } finally {\n loading = false;\n }\n}\n\n/**\n * Embed a single text string into a 384-dim float array.\n * Returns null if embedder is unavailable.\n */\nexport async function embedText(text: string): Promise<number[] | null> {\n const ext = await getExtractor();\n if (!ext) return null;\n\n // Truncate very long text\n const truncated = text.slice(0, CONFIG.embeddings.max_text_length);\n if (!truncated.trim()) return null;\n\n try {\n const output = await ext(truncated, { pooling: \"mean\", normalize: true });\n // output.data is a TypedArray of 384 floats\n return Array.from(output.data as Float32Array);\n } catch (err: any) {\n console.error(\"[Embedder] Embedding failed:\", err.message);\n return null;\n }\n}\n\n/**\n * Batch embed multiple texts.\n */\nexport async function embedTexts(texts: string[]): Promise<(number[] | null)[]> {\n const ext = await getExtractor();\n if (!ext) return texts.map(() => null);\n\n const results: (number[] | null)[] = [];\n for (const text of texts) {\n const truncated = text.slice(0, CONFIG.embeddings.max_text_length);\n if (!truncated.trim()) {\n results.push(null);\n continue;\n }\n try {\n const output = await ext(truncated, { pooling: \"mean\", normalize: true });\n results.push(Array.from(output.data as Float32Array));\n } catch {\n results.push(null);\n }\n }\n return results;\n}\n\nexport function isReady(): boolean {\n return extractor !== null;\n}\n","/**\n * Mnemosyne REST API (Backward-Compatible Wrapper)\n * Re-exports from src/api/router.ts\n */\n\nexport { ApiRouter as API } from \"../api/router.js\";\n","/**\n * MCP Tool Definitions\n * All tools exposed to MCP clients (Claude Desktop, Cursor, etc.)\n */\n\nimport type { Store } from \"../core/Store.js\";\nimport type { McpTool } from \"./types.js\";\n\nexport const TOOLS: McpTool[] = [\n {\n name: \"nexus_list_projects\",\n description: \"List all projects in the Mnemosyne knowledge base.\",\n inputSchema: { type: \"object\", properties: {} },\n handler: (_args, store) => {\n return { projects: store.getProjects().map(p => ({ id: p.id, name: p.name, description: p.description, atomCount: store.getAtomsByProject(p.id).length })) };\n },\n },\n {\n name: \"nexus_search\",\n description: \"Search atoms and blocks by keyword. Returns ranked results.\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: { type: \"string\", description: \"Search query\" },\n project: { type: \"string\", description: \"Project name or ID (optional)\" },\n limit: { type: \"number\", description: \"Max results (default 10)\" },\n },\n required: [\"query\"],\n },\n handler: (args, store) => {\n const projectId = args.project ? store.getProjectByName(args.project)?.id || args.project : \"\";\n const results = store.search(projectId, args.query, args.limit || 10);\n return { query: args.query, count: results.length, results };\n },\n },\n {\n name: \"nexus_read_atom\",\n description: \"Read an atom by ID or title. Returns atom details, blocks, children, and bonds.\",\n inputSchema: {\n type: \"object\",\n properties: {\n id: { type: \"string\", description: \"Atom UUID\" },\n title: { type: \"string\", description: \"Atom title (alternative to id)\" },\n project: { type: \"string\", description: \"Project name (required if searching by title)\" },\n },\n required: [],\n },\n handler: (args, store) => {\n let atom = args.id ? store.getAtom(args.id) : undefined;\n if (!atom && args.title && args.project) {\n const projectId = store.getProjectByName(args.project)?.id || args.project;\n atom = store.getAtomsByProject(projectId).find(a => a.title === args.title);\n }\n if (!atom) throw new Error(\"Atom not found\");\n const children = store.getAtomChildren(atom.id).map(a => ({ id: a.id, title: a.title, type: a.metadata?.type || \"text\" }));\n const blocks = store.getBlocksByAtom(atom.id);\n const bonds = store.getBondsByAtom(atom.id);\n return { atom, children, blocks, bonds };\n },\n },\n {\n name: \"nexus_create_atom\",\n description: \"Create a new atom in a project.\",\n inputSchema: {\n type: \"object\",\n properties: {\n project: { type: \"string\", description: \"Project name or ID\" },\n title: { type: \"string\", description: \"Atom title/path\" },\n type: { type: \"string\", description: \"Atom type (text, memory, stream, thought, task)\" },\n parent_id: { type: \"string\", description: \"Parent atom ID (optional)\" },\n tags: { type: \"array\", items: { type: \"string\" }, description: \"Tags (optional)\" },\n assistant_id: { type: \"string\", description: \"Creator assistant ID\" },\n },\n required: [\"project\", \"title\"],\n },\n handler: (args, store) => {\n const project = store.getProjectByName(args.project) || store.getProject(args.project);\n if (!project) throw new Error(\"Project not found\");\n const assistantId = args.assistant_id || \"mcp-assistant\";\n const atom = store.createAtom(project.id, args.title, args.type || \"text\", assistantId, {\n parentId: args.parent_id,\n tags: args.tags,\n });\n return { success: true, atom };\n },\n },\n {\n name: \"nexus_update_atom\",\n description: \"Update an atom's title or parent.\",\n inputSchema: {\n type: \"object\",\n properties: {\n id: { type: \"string\", description: \"Atom UUID\" },\n title: { type: \"string\", description: \"New title\" },\n parent_id: { type: [\"string\", \"null\"], description: \"New parent ID or null for root\" },\n assistant_id: { type: \"string\", description: \"Updater assistant ID\" },\n },\n required: [\"id\"],\n },\n handler: (args, store) => {\n const assistantId = args.assistant_id || \"mcp-assistant\";\n if (args.parent_id !== undefined) {\n const updated = store.updateAtomParent(args.id, args.parent_id, assistantId);\n if (!updated) throw new Error(\"Invalid parent or atom not found\");\n }\n const updated = store.updateAtom(args.id, { title: args.title }, assistantId);\n return { success: true, atom: updated || store.getAtom(args.id) };\n },\n },\n {\n name: \"nexus_create_bond\",\n description: \"Create a bond (graph connection) between two atoms.\",\n inputSchema: {\n type: \"object\",\n properties: {\n source_id: { type: \"string\", description: \"Source atom ID\" },\n target_id: { type: \"string\", description: \"Target atom ID\" },\n label: { type: \"string\", description: \"Bond label (default: connects)\" },\n color: { type: \"string\", description: \"Hex color (optional)\" },\n },\n required: [\"source_id\", \"target_id\"],\n },\n handler: (args, store) => {\n const bond = store.createBond(args.source_id, args.target_id, args.label || \"connects\", args.color);\n return { success: true, bond };\n },\n },\n {\n name: \"nexus_request_checkout\",\n description: \"Request an exclusive checkout (lock) on an atom.\",\n inputSchema: {\n type: \"object\",\n properties: {\n atom_id: { type: \"string\", description: \"Atom UUID\" },\n assistant_id: { type: \"string\", description: \"Assistant requesting checkout\" },\n reason: { type: \"string\", description: \"Reason for checkout\" },\n },\n required: [\"atom_id\", \"assistant_id\"],\n },\n handler: (args, store) => {\n const result = store.checkout(args.atom_id, args.assistant_id, \"exclusive\", args.reason || \"\");\n return result;\n },\n },\n {\n name: \"nexus_release_checkout\",\n description: \"Release a checkout (unlock) on an atom.\",\n inputSchema: {\n type: \"object\",\n properties: {\n atom_id: { type: \"string\", description: \"Atom UUID\" },\n assistant_id: { type: \"string\", description: \"Assistant releasing checkout\" },\n },\n required: [\"atom_id\", \"assistant_id\"],\n },\n handler: (args, store) => {\n const success = store.releaseCheckout(args.atom_id, args.assistant_id);\n return { success };\n },\n },\n {\n name: \"nexus_subscribe_to_atom\",\n description: \"Subscribe to real-time updates for an atom via WebSocket.\",\n inputSchema: {\n type: \"object\",\n properties: {\n atom_id: { type: \"string\", description: \"Atom UUID to subscribe to\" },\n },\n required: [\"atom_id\"],\n },\n handler: (args, _store) => {\n return { success: true, wsEndpoint: \"ws://localhost:7321/ws\", atom_id: args.atom_id, message: \"Connect via WebSocket and send { type: 'subscribe', atomId: '<id>' }\" };\n },\n },\n {\n name: \"nexus_batch\",\n description: \"Execute multiple MCP tools in a single request. Reduces round-trip token waste.\",\n inputSchema: {\n type: \"object\",\n properties: {\n operations: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n tool: { type: \"string\", description: \"Tool name to call\" },\n params: { type: \"object\", description: \"Parameters for the tool\" },\n },\n required: [\"tool\"],\n },\n description: \"Ordered list of tool calls\",\n },\n stop_on_error: { type: \"boolean\", description: \"If true, stop at first error. Default: false\", default: false },\n },\n required: [\"operations\"],\n },\n handler: (args, store) => {\n const operations = args.operations || [];\n const stopOnError = args.stop_on_error ?? false;\n const results: any[] = [];\n const toolMap = new Map<string, McpTool>();\n for (const t of TOOLS) toolMap.set(t.name, t);\n\n for (let i = 0; i < operations.length; i++) {\n const op = operations[i];\n const tool = toolMap.get(op.tool);\n if (!tool) {\n results.push({ index: i, tool: op.tool, error: `Tool not found: ${op.tool}` });\n if (stopOnError) break;\n continue;\n }\n try {\n const result = tool.handler(op.params || {}, store);\n results.push({ index: i, tool: op.tool, success: true, result });\n } catch (err: any) {\n results.push({ index: i, tool: op.tool, error: err.message });\n if (stopOnError) break;\n }\n }\n return { count: operations.length, completed: results.length, results };\n },\n },\n];\n","/**\n * MCP Server\n * JSON-RPC handler for Model Context Protocol.\n */\n\nimport type { Store } from \"../core/Store.js\";\nimport { TOOLS } from \"./tools.js\";\nimport type { JsonRpcRequest, JsonRpcResponse, McpTool } from \"./types.js\";\n\nexport class McpServer {\n private store: Store;\n private toolMap = new Map<string, McpTool>();\n\n constructor(store: Store) {\n this.store = store;\n for (const t of TOOLS) this.toolMap.set(t.name, t);\n }\n\n /**\n * Returns `null` for notifications (no response needed).\n */\n handleRequest(req: JsonRpcRequest): JsonRpcResponse | null {\n // Notifications have no id — do not send a response\n if (req.id === null || req.id === undefined) {\n return null;\n }\n\n try {\n switch (req.method) {\n case \"initialize\":\n return this.ok(req.id, {\n protocolVersion: \"2024-11-05\",\n capabilities: { tools: {}, resources: {}, prompts: {} },\n serverInfo: { name: \"mnemosyne-mcp\", version: \"2.0.0\" },\n });\n\n case \"tools/list\":\n return this.ok(req.id, {\n tools: TOOLS.map(t => ({ name: t.name, description: t.description, inputSchema: t.inputSchema })),\n });\n\n case \"tools/call\": {\n const { name, arguments: args } = req.params || {};\n const tool = this.toolMap.get(name);\n if (!tool) return this.err(req.id, -32601, `Tool not found: ${name}`);\n const result = tool.handler(args || {}, this.store);\n return this.ok(req.id, { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] });\n }\n\n case \"resources/list\":\n return this.ok(req.id, { resources: [] });\n\n case \"prompts/list\":\n return this.ok(req.id, { prompts: [] });\n\n default:\n return this.err(req.id, -32601, `Method not found: ${req.method}`);\n }\n } catch (e: any) {\n return this.err(req.id, -32603, e.message);\n }\n }\n\n getManifest() {\n return {\n name: \"Mnemosyne\",\n version: \"2.0.0\",\n description: \"Knowledge base MCP server for projects, atoms, blocks, and bonds.\",\n protocol: \"mcp\",\n transport: [\"stdio\", \"sse\"],\n endpoints: {\n sse: \"/mcp/sse\",\n messages: \"/mcp/messages\",\n },\n tools: TOOLS.map(t => ({ name: t.name, description: t.description })),\n };\n }\n\n private ok(id: string | number | null, result: any): JsonRpcResponse {\n return { jsonrpc: \"2.0\", id, result };\n }\n private err(id: string | number | null, code: number, message: string): JsonRpcResponse {\n return { jsonrpc: \"2.0\", id, error: { code, message } };\n }\n}\n","/**\n * MCP SSE Transport\n * Server-Sent Events transport for MCP over HTTP.\n */\n\nimport type { McpServer } from \"./server.js\";\nimport type { JsonRpcRequest } from \"./types.js\";\n\ninterface SseSession {\n id: string;\n res: import(\"http\").ServerResponse;\n}\n\nexport class McpSseTransport {\n private server: McpServer;\n private sessions = new Map<string, SseSession>();\n private sessionCounter = 0;\n\n constructor(server: McpServer) {\n this.server = server;\n }\n\n handleSse(req: import(\"http\").IncomingMessage, res: import(\"http\").ServerResponse): void {\n const id = `sess_${++this.sessionCounter}_${Date.now()}`;\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n \"Connection\": \"keep-alive\",\n });\n this.sessions.set(id, { id, res });\n\n // Send endpoint event\n this.sendSse(id, \"endpoint\", \"/mcp/messages?session_id=\" + id);\n\n req.on(\"close\", () => this.sessions.delete(id));\n }\n\n handleMessage(req: import(\"http\").IncomingMessage, res: import(\"http\").ServerResponse, body: any): void {\n const url = new URL(req.url || \"/\", `http://${req.headers.host}`);\n const sessionId = url.searchParams.get(\"session_id\") || \"\";\n\n const request = body as JsonRpcRequest;\n if (!request || request.jsonrpc !== \"2.0\") {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"invalid_jsonrpc\" }));\n return;\n }\n\n const response = this.server.handleRequest(request);\n // Notifications return null — send empty 200\n if (!response) {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(\"{}\");\n return;\n }\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(response));\n\n // Also broadcast via SSE if the session is active\n if (sessionId) this.sendSse(sessionId, \"message\", JSON.stringify(response));\n }\n\n private sendSse(sessionId: string, event: string, data: string): void {\n const session = this.sessions.get(sessionId);\n if (!session) return;\n session.res.write(`event: ${event}\\ndata: ${data}\\n\\n`);\n }\n}\n","/**\n * API Middleware\n * Rate limiting, CORS, auth helpers.\n */\n\nimport type { Store } from \"../core/Store.js\";\nimport type { Assistant } from \"../core/types.js\";\n\ninterface RateWindow {\n count: number;\n resetAt: number;\n}\n\nexport class RateLimiter {\n private rates = new Map<string, RateWindow>();\n private limit: number;\n private windowMs: number;\n\n constructor(limit: number, windowMs: number) {\n this.limit = limit;\n this.windowMs = windowMs;\n setInterval(() => this.cleanup(), 60000);\n }\n\n check(token: string): boolean {\n const now = Date.now();\n let window = this.rates.get(token);\n if (!window || window.resetAt < now) {\n window = { count: 0, resetAt: now + this.windowMs };\n this.rates.set(token, window);\n }\n if (window.count >= this.limit) return false;\n window.count++;\n return true;\n }\n\n private cleanup(): void {\n const now = Date.now();\n for (const [key, window] of this.rates.entries()) {\n if (window.resetAt < now) this.rates.delete(key);\n }\n }\n}\n\nexport function setCorsHeaders(res: import(\"http\").ServerResponse): void {\n res.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n res.setHeader(\"Access-Control-Allow-Methods\", \"GET, POST, PATCH, DELETE, OPTIONS\");\n res.setHeader(\"Access-Control-Allow-Headers\", \"Content-Type, Authorization\");\n res.setHeader(\"Cache-Control\", \"no-store, no-cache, must-revalidate, proxy-revalidate\");\n res.setHeader(\"Pragma\", \"no-cache\");\n res.setHeader(\"Expires\", \"0\");\n}\n\nexport function authenticate(store: Store, req: import(\"http\").IncomingMessage): Assistant | undefined {\n const token = req.headers.authorization?.replace(\"Bearer \", \"\");\n return token ? store.getAssistant(token) : undefined;\n}\n","/**\n * API Utilities\n * Shared helpers for route handlers.\n */\n\nimport type { Store } from \"../core/Store.js\";\n\nexport function json(res: import(\"http\").ServerResponse, status: number, data: any): void {\n res.writeHead(status, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(data));\n}\n\nexport function readBody(req: import(\"http\").IncomingMessage): Promise<any> {\n return new Promise((resolve) => {\n let body = \"\";\n req.on(\"data\", chunk => body += chunk);\n req.on(\"end\", () => { try { resolve(JSON.parse(body)); } catch { resolve({}); } });\n });\n}\n\nexport function resolveProjectId(store: Store, idOrName: string): string {\n if (!idOrName) return \"\";\n if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(idOrName)) return idOrName;\n const p = store.getProjectByName(idOrName);\n return p?.id || idOrName;\n}\n\nexport function serializeAtom(store: Store, atom: any, compact = false): any {\n if (compact) {\n return {\n id: atom.id,\n title: atom.title,\n type: atom.metadata?.type || \"memory\",\n status: atom.status,\n };\n }\n const blockCount = atom.block_count ?? store.getBlocksByAtom(atom.id).length;\n return {\n id: atom.id,\n project_id: atom.project_id,\n parent_id: atom.parent_id,\n title: atom.title,\n summary: atom.summary,\n type: atom.metadata?.type || \"memory\",\n icon: atom.icon,\n color: atom.color,\n metadata: atom.metadata,\n auto_path: atom.auto_path,\n path_overridden: atom.path_overridden,\n status: atom.status,\n status_updated_at: atom.status_updated_at,\n block_count: atom.block_count,\n bond_count: atom.bond_count,\n template_id: atom.template_id,\n embedding_status: atom.embedding_status,\n state: {\n lock: atom.locked_by ? { assistantId: atom.locked_by, reason: atom.locked_reason } : null,\n queue: [],\n blockCount: blockCount,\n lastActivity: atom.updated_at,\n },\n };\n}\n\nexport function pickFields(obj: any, fields: string[]): any {\n const result: any = {};\n for (const f of fields) {\n if (f.includes(\".\")) {\n const [head, ...tail] = f.split(\".\");\n if (obj[head] != null) {\n result[head] = result[head] || (Array.isArray(obj[head]) ? [] : {});\n if (Array.isArray(obj[head])) {\n result[head] = obj[head].map((item: any) => pickFields(item, [tail.join(\".\")]));\n } else {\n const nested = pickFields(obj[head], [tail.join(\".\")]);\n Object.assign(result[head], nested);\n }\n }\n } else if (obj[f] !== undefined) {\n result[f] = obj[f];\n }\n }\n return result;\n}\n\nexport function exportAtomMarkdown(store: Store, atom: any): string {\n const blocks = store.getBlocksByAtom(atom.id).sort((a: any, b: any) => (a.order_index || 0) - (b.order_index || 0));\n const bonds = store.getBondsByAtom(atom.id);\n const parent = atom.parent_id ? store.getAtom(atom.parent_id) : null;\n\n let md = `---\\n`;\n md += `title: \"${atom.title}\"\\n`;\n md += `type: ${atom.type || \"memory\"}\\n`;\n md += `status: ${atom.status || \"draft\"}\\n`;\n md += `path: ${atom.auto_path || \"/\"}\\n`;\n if (atom.summary) md += `summary: \"${atom.summary}\"\\n`;\n if (atom.metadata?.tags?.length) md += `tags: [${atom.metadata.tags.map((t: string) => `\"${t}\"`).join(\", \")}]\\n`;\n if (parent) md += `parent: \"${parent.title}\"\\n`;\n md += `exported_at: ${new Date().toISOString()}\\n`;\n md += `---\\n\\n`;\n\n md += `# ${atom.title}\\n\\n`;\n if (atom.summary) md += `${atom.summary}\\n\\n`;\n\n for (const b of blocks) {\n const content = b.content || \"\";\n if (b.type === \"text\") {\n try { const p = JSON.parse(content); md += `${p.text || content}\\n\\n`; } catch { md += `${content}\\n\\n`; }\n } else if (b.type === \"code\") {\n const lines = content.split(\"\\n\");\n const first = lines[0]?.trim() || \"\";\n let lang = \"\";\n let code = content;\n if (first.startsWith(\"```\")) { lang = first.replace(/```/g, \"\").trim(); code = lines.slice(1).join(\"\\n\").replace(/```$/, \"\").trim(); }\n md += `\\`\\`\\`${lang}\\n${code}\\n\\`\\`\\`\\n\\n`;\n } else if (b.type === \"checklist\") {\n try {\n const items = JSON.parse(content);\n if (Array.isArray(items)) {\n for (const item of items) md += `- [${item.checked ? \"x\" : \" \"}] ${item.text}\\n`;\n md += \"\\n\";\n }\n } catch { md += `${content}\\n\\n`; }\n } else if (b.type === \"table\") {\n try {\n const rows = JSON.parse(content);\n if (Array.isArray(rows) && rows.length) {\n const headers = Object.keys(rows[0]);\n md += `| ${headers.join(\" | \")} |\\n`;\n md += `| ${headers.map(() => \"---\").join(\" | \")} |\\n`;\n for (const row of rows) md += `| ${headers.map(h => String(row[h] ?? \"\")).join(\" | \")} |\\n`;\n md += \"\\n\";\n }\n } catch { md += `${content}\\n\\n`; }\n } else if (b.type === \"image\" || b.type === \"file\") {\n try {\n const meta = JSON.parse(content);\n if (b.type === \"image\") md += `![${meta.file_name || \"image\"}](${meta.hash})\\n\\n`;\n else md += `[${meta.file_name || \"file\"}](${meta.hash})\\n\\n`;\n } catch { md += `${content}\\n\\n`; }\n } else if (b.type === \"link\") {\n const url = content.trim().startsWith(\"http\") ? content.trim() : \"https://\" + content.trim();\n md += `[${content.trim()}](${url})\\n\\n`;\n } else {\n md += `${content}\\n\\n`;\n }\n }\n\n const allBonds = [...(bonds.outgoing || []), ...(bonds.incoming || [])];\n if (allBonds.length) {\n md += `---\\n\\n## Connections\\n\\n`;\n for (const b of allBonds) {\n const otherId = b.source_id === atom.id ? b.target_id : b.source_id;\n const other = store.getAtom(otherId);\n const dir = b.source_id === atom.id ? \"→\" : \"←\";\n md += `- ${dir} [[${other ? other.title : otherId}]] (${b.label})\\n`;\n }\n md += \"\\n\";\n }\n\n return md;\n}\n\nexport function exportMarkdown(store: Store, projectId: string): string {\n const project = projectId ? store.getProject(projectId) : undefined;\n const atoms = projectId ? store.getAtomsByProject(projectId) : [];\n const bonds = projectId ? store.getGraph(projectId).bonds : [];\n const blockMap = new Map<string, any>();\n for (const atom of atoms) {\n for (const b of store.getBlocksByAtom(atom.id)) {\n blockMap.set(b.id, b);\n }\n }\n\n let md = `# ${project ? project.name : \"Mnemosyne Export\"}\\n\\n`;\n md += `*Exported on ${new Date().toISOString()}*\\n\\n`;\n\n const atomMap = new Map(atoms.map(a => [a.id, a]));\n const rootAtoms = atoms.filter(a => !a.parent_id);\n\n function renderAtom(atom: any, depth: number) {\n const indent = \" \".repeat(depth);\n md += `${indent}## ${atom.title}\\n\\n`;\n if (atom.summary) md += `${indent}${atom.summary}\\n\\n`;\n if (atom.metadata?.tags?.length) md += `${indent}*Tags: ${atom.metadata.tags.join(\", \")}*\\n\\n`;\n\n const atomBlocks = Array.from(blockMap.values()).filter(b => b.atom_id === atom.id).sort((a, b) => a.order_index - b.order_index);\n for (const b of atomBlocks) {\n try {\n const parsed = JSON.parse(b.content || \"{}\");\n if (parsed.text) md += `${indent}${parsed.text}\\n\\n`;\n else md += `${indent}\\`\\`\\`json\\n${indent}${JSON.stringify(parsed, null, 2).split(\"\\n\").join(\"\\n\" + indent)}\\n${indent}\\`\\`\\`\\n\\n`;\n } catch {\n md += `${indent}${b.content || \"\"}\\n\\n`;\n }\n }\n\n const children = atoms.filter(a => a.parent_id === atom.id);\n for (const child of children) renderAtom(child, depth + 1);\n }\n\n for (const root of rootAtoms) renderAtom(root, 0);\n\n if (bonds.length) {\n md += `---\\n\\n## Bonds\\n\\n`;\n for (const b of bonds) {\n const src = atomMap.get(b.source_id);\n const tgt = atomMap.get(b.target_id);\n md += `- [[${src ? src.title : b.source_id}]] —${b.label}→ [[${tgt ? tgt.title : b.target_id}]]\\n`;\n }\n md += \"\\n\";\n }\n\n return md;\n}\n","import type { Store } from \"../../core/Store.js\";\nimport type { AssistantRole } from \"../../core/types.js\";\nimport { json } from \"../utils.js\";\n\nexport function handleAssistants(\n store: Store,\n pathname: string,\n method: string,\n res: import(\"http\").ServerResponse,\n body: any\n): boolean {\n if (pathname === \"/api/v1/assistants/register\" && method === \"POST\") {\n const a = body as { id?: string; name: string; role: AssistantRole; capabilities?: string[]; description?: string; provider?: string; instructions?: string; config?: Record<string, any> };\n const id = a.id || a.name || crypto.randomUUID();\n const existing = store.getAssistant(id);\n if (existing) {\n json(res, 200, { success: true, token: existing.id, assistant: existing });\n return true;\n }\n const newAssistant = store.registerAssistant({ id, name: a.name || id, role: a.role || \"developer\", capabilities: a.capabilities || [], description: a.description, provider: a.provider, instructions: a.instructions, config: a.config });\n json(res, 200, { success: true, token: newAssistant.id, assistant: newAssistant });\n return true;\n }\n\n if (pathname.startsWith(\"/api/v1/assistants/\") && pathname.endsWith(\"/heartbeat\") && method === \"POST\") {\n const id = pathname.split(\"/\")[4];\n store.heartbeat(id);\n json(res, 200, { success: true });\n return true;\n }\n\n if (pathname === \"/api/v1/assistants\" && method === \"GET\") {\n const compact = new URL(pathname, \"http://localhost\").searchParams.get(\"compact\") === \"true\";\n const assistants = store.getAllAssistants().map(a => compact\n ? { id: a.id, name: a.name, role: a.role, status: a.status }\n : a\n );\n json(res, 200, { assistants });\n return true;\n }\n\n if (pathname.match(/^\\/api\\/v1\\/assistants\\/[^\\/]+$/) && method === \"PATCH\") {\n const id = pathname.replace(\"/api/v1/assistants/\", \"\");\n const a = body as { name?: string; role?: AssistantRole; description?: string; provider?: string; instructions?: string; config?: Record<string, any>; capabilities?: string[]; status?: string };\n const updated = store.updateAssistant(id, a);\n if (!updated) { json(res, 404, { error: \"assistant_not_found\" }); return true; }\n json(res, 200, { assistant: updated });\n return true;\n }\n\n if (pathname.match(/^\\/api\\/v1\\/assistants\\/[^\\/]+$/) && method === \"DELETE\") {\n const id = pathname.replace(\"/api/v1/assistants/\", \"\");\n const ok = store.deleteAssistant(id);\n json(res, ok ? 200 : 404, { success: ok });\n return true;\n }\n\n return false;\n}\n","import type { Store } from \"../../core/Store.js\";\nimport { json, resolveProjectId } from \"../utils.js\";\n\nexport function handleProjects(\n store: Store,\n pathname: string,\n method: string,\n res: import(\"http\").ServerResponse,\n body: any,\n searchParams: URLSearchParams\n): boolean {\n if (pathname === \"/api/v1/projects\" && method === \"GET\") {\n const compact = searchParams.get(\"compact\") === \"true\";\n const projects = store.getProjects().map(p => compact\n ? { id: p.id, name: p.name, description: p.description }\n : p\n );\n json(res, 200, { projects });\n return true;\n }\n\n if (pathname === \"/api/v1/projects\" && method === \"POST\") {\n const { name, description } = body as { name: string; description?: string };\n if (!name) { json(res, 400, { error: \"name_required\" }); return true; }\n const project = store.createProject(name, description);\n json(res, 200, { success: true, project });\n return true;\n }\n\n // Project Index (__INDEX__ atom)\n const projectIndexMatch = pathname.match(/^\\/api\\/v1\\/projects\\/([^/]+)\\/index$/);\n if (projectIndexMatch && method === \"GET\") {\n const projectId = resolveProjectId(store, projectIndexMatch[1]);\n const indexAtom = store.getProjectIndexAtom(projectId);\n if (!indexAtom) {\n json(res, 404, { error: \"index_not_found\" });\n return true;\n }\n const blocks = store.getBlocksByAtom(indexAtom.id);\n const manifestBlock = blocks.find(b => b.type === \"text\");\n let manifest: any = {};\n try {\n if (manifestBlock) manifest = JSON.parse(manifestBlock.content || \"{}\");\n } catch {}\n json(res, 200, {\n project_id: projectId,\n atom_id: indexAtom.id,\n generated_at: indexAtom.updated_at,\n manifest,\n });\n return true;\n }\n\n return false;\n}\n","import type { Store } from \"../../core/Store.js\";\nimport type { Assistant } from \"../../core/types.js\";\nimport { json, resolveProjectId, serializeAtom, pickFields, exportAtomMarkdown } from \"../utils.js\";\n\nexport function handleAtoms(\n store: Store,\n pathname: string,\n method: string,\n res: import(\"http\").ServerResponse,\n body: any,\n searchParams: URLSearchParams,\n assistant?: Assistant\n): boolean {\n if (pathname === \"/api/v1/atoms\" && method === \"POST\") {\n const { project_id, title, type, parent_id, tags, template, status, auto_path, path_overridden } = body as { project_id: string; title: string; type: string; parent_id?: string; tags?: string[]; template?: string; status?: string; auto_path?: string; path_overridden?: boolean };\n if (!project_id || !title) { json(res, 400, { error: \"project_id_and_title_required\" }); return true; }\n const resolvedProjectId = resolveProjectId(store, project_id);\n if (!resolvedProjectId) { json(res, 400, { error: \"project_not_found\" }); return true; }\n if (!assistant || !store.can(assistant.role, \"create\", undefined, assistant.id)) {\n json(res, 403, { error: \"permission_denied\" }); return true; }\n const atom = store.createAtom(resolvedProjectId, title, type || \"text\", assistant.id, { parentId: parent_id, tags, template, status, auto_path, path_overridden });\n json(res, 200, { atom: serializeAtom(store, atom) });\n return true;\n }\n\n if (pathname === \"/api/v1/atoms\" && method === \"GET\") {\n const projectId = resolveProjectId(store, searchParams.get(\"project_id\") || \"\");\n const compact = searchParams.get(\"compact\") === \"true\";\n const atoms = projectId\n ? store.getAtomsByProject(projectId).map(d => serializeAtom(store, d, compact))\n : [];\n json(res, 200, { atoms });\n return true;\n }\n\n if (pathname.match(/^\\/api\\/v1\\/atoms\\/[^\\/]+$/) && method === \"GET\" && !pathname.includes(\"/blocks\") && !pathname.includes(\"/bonds\") && !pathname.includes(\"/checkout\") && !pathname.includes(\"/queue\")) {\n const atomId = pathname.replace(\"/api/v1/atoms/\", \"\");\n const atom = store.getAtom(atomId);\n if (!atom) { json(res, 404, { error: \"atom_not_found\" }); return true; }\n const fieldsParam = searchParams.get(\"fields\");\n const children = store.getAtomChildren(atomId).map(a => ({ id: a.id, title: a.title, type: a.metadata?.type || \"memory\", blockCount: store.getBlocksByAtom(a.id).length }));\n const full = {\n atom: serializeAtom(store, atom),\n children,\n blocks: store.getBlocksByAtom(atomId),\n bonds: store.getBondsByAtom(atomId),\n };\n const response = fieldsParam ? pickFields(full, fieldsParam.split(\",\")) : full;\n json(res, 200, response);\n return true;\n }\n\n if (pathname.match(/^\\/api\\/v1\\/atoms\\/[^\\/]+$/) && (method === \"PATCH\" || method === \"POST\") && !pathname.includes(\"/blocks\") && !pathname.includes(\"/bonds\")) {\n const atomId = pathname.replace(\"/api/v1/atoms/\", \"\");\n const { parent_id, title, summary, tags, status, auto_path, path_overridden } = body as { parent_id?: string | null; title?: string; summary?: string; tags?: string[]; status?: string; auto_path?: string; path_overridden?: boolean };\n if (!assistant || !store.can(assistant.role, \"update\", atomId, assistant.id)) {\n json(res, 403, { error: \"permission_denied\" }); return true; }\n if (parent_id !== undefined) {\n const updated = store.updateAtomParent(atomId, parent_id ?? null, assistant.id);\n if (!updated) { json(res, 400, { error: \"invalid_parent\" }); return true; }\n json(res, 200, { atom: serializeAtom(store, updated) });\n return true;\n }\n try {\n const updated = store.updateAtom(atomId, { title, summary, tags, status, auto_path, path_overridden }, assistant.id);\n if (!updated) { json(res, 404, { error: \"atom_not_found\" }); return true; }\n json(res, 200, { atom: serializeAtom(store, updated) });\n } catch (err: any) {\n json(res, 400, { error: err.message });\n }\n return true;\n }\n\n if (pathname.match(/^\\/api\\/v1\\/atoms\\/[^\\/]+$/) && method === \"DELETE\" && !pathname.includes(\"/blocks\") && !pathname.includes(\"/bonds\") && !pathname.includes(\"/checkout\")) {\n const atomId = pathname.replace(\"/api/v1/atoms/\", \"\");\n if (!assistant || !store.can(assistant.role, \"delete\", atomId, assistant.id)) {\n json(res, 403, { error: \"permission_denied\" }); return true; }\n const ok = store.deleteAtom(atomId, assistant.id);\n json(res, ok ? 200 : 404, { success: ok });\n return true;\n }\n\n // Checkout\n if (pathname.match(/^\\/api\\/v1\\/atoms\\/[^\\/]+\\/checkout$/) && method === \"POST\") {\n const atomId = pathname.replace(\"/api/v1/atoms/\", \"\").replace(\"/checkout\", \"\");\n const { mode, reason } = body as { mode: any; reason: string };\n if (!assistant || !store.can(assistant.role, \"lock\", atomId, assistant.id)) {\n json(res, 403, { error: \"permission_denied\" }); return true; }\n const result = store.checkout(atomId, assistant.id, mode || \"exclusive\", reason || \"\");\n json(res, result.success ? 200 : 423, result);\n return true;\n }\n\n if (pathname.match(/^\\/api\\/v1\\/atoms\\/[^\\/]+\\/checkout$/) && method === \"DELETE\") {\n const atomId = pathname.replace(\"/api/v1/atoms/\", \"\").replace(\"/checkout\", \"\");\n if (!assistant) { json(res, 403, { error: \"unauthorized\" }); return true; }\n const success = store.releaseCheckout(atomId, assistant.id);\n json(res, success ? 200 : 400, { success });\n return true;\n }\n\n // Queue\n if (pathname.match(/^\\/api\\/v1\\/atoms\\/[^\\/]+\\/queue$/) && method === \"GET\") {\n const atomId = pathname.replace(\"/api/v1/atoms/\", \"\").replace(\"/queue\", \"\");\n const status = store.getQueueStatus(atomId);\n json(res, status ? 200 : 404, status || { error: \"atom_not_found\" });\n return true;\n }\n\n const queueGrantMatch = pathname.match(/^\\/api\\/v1\\/atoms\\/([^\\/]+)\\/queue\\/([^\\/]+)\\/grant$/);\n if (queueGrantMatch && method === \"POST\") {\n const atomId = queueGrantMatch[1];\n const queueId = queueGrantMatch[2];\n const ok = store.grantQueueItem(atomId, queueId);\n json(res, ok ? 200 : 400, { success: ok });\n return true;\n }\n\n const queueRejectMatch = pathname.match(/^\\/api\\/v1\\/atoms\\/([^\\/]+)\\/queue\\/([^\\/]+)\\/reject$/);\n if (queueRejectMatch && method === \"POST\") {\n const atomId = queueRejectMatch[1];\n const queueId = queueRejectMatch[2];\n const ok = store.rejectQueueItem(atomId, queueId);\n json(res, ok ? 200 : 400, { success: ok });\n return true;\n }\n\n const queueBumpMatch = pathname.match(/^\\/api\\/v1\\/atoms\\/([^\\/]+)\\/queue\\/([^\\/]+)\\/bump$/);\n if (queueBumpMatch && method === \"POST\") {\n const atomId = queueBumpMatch[1];\n const queueId = queueBumpMatch[2];\n const ok = store.bumpQueueItem(atomId, queueId);\n json(res, ok ? 200 : 400, { success: ok });\n return true;\n }\n\n // Permissions\n if (pathname.match(/^\\/api\\/v1\\/atoms\\/[^\\/]+\\/permissions$/) && method === \"GET\") {\n const atomId = pathname.replace(\"/api/v1/atoms/\", \"\").replace(\"/permissions\", \"\");\n const perms = store.getAtomPermissions(atomId);\n json(res, 200, { atom_id: atomId, permissions: perms });\n return true;\n }\n\n if (pathname.match(/^\\/api\\/v1\\/atoms\\/[^\\/]+\\/permissions$/) && method === \"POST\") {\n const atomId = pathname.replace(\"/api/v1/atoms/\", \"\").replace(\"/permissions\", \"\");\n const { assistant_id, level } = body as { assistant_id: string; level: string };\n if (!assistant_id || !level) { json(res, 400, { error: \"assistant_id_and_level_required\" }); return true; }\n store.setAtomPermission(atomId, assistant_id, level as any, assistant?.id);\n json(res, 200, { success: true });\n return true;\n }\n\n if (pathname.match(/^\\/api\\/v1\\/atoms\\/[^\\/]+\\/permissions\\/[^\\/]+$/) && method === \"DELETE\") {\n const parts = pathname.replace(\"/api/v1/atoms/\", \"\").split(\"/\");\n const atomId = parts[0];\n const assistantId = parts[2];\n const ok = store.removeAtomPermission(atomId, assistantId);\n json(res, ok ? 200 : 404, { success: ok });\n return true;\n }\n\n // History\n if (pathname.match(/^\\/api\\/v1\\/atoms\\/[^\\/]+\\/history$/) && method === \"GET\") {\n const atomId = pathname.replace(\"/api/v1/atoms/\", \"\").replace(\"/history\", \"\");\n const history = store.getAtomHistory(atomId);\n json(res, 200, { atom_id: atomId, history });\n return true;\n }\n\n // Export\n if (pathname.match(/^\\/api\\/v1\\/atoms\\/[^\\/]+\\/export$/) && method === \"GET\") {\n const atomId = pathname.replace(\"/api/v1/atoms/\", \"\").replace(\"/export\", \"\");\n const format = searchParams.get(\"format\") || \"markdown\";\n const atom = store.getAtom(atomId);\n if (!atom) { json(res, 404, { error: \"atom_not_found\" }); return true; }\n if (format === \"markdown\") {\n const md = exportAtomMarkdown(store, atom);\n const safeName = (atom.title || \"memory\").replace(/[^a-z0-9\\-_]/gi, \"_\").toLowerCase();\n res.writeHead(200, { \"Content-Type\": \"text/markdown; charset=utf-8\", \"Content-Disposition\": `attachment; filename=\"${safeName}.md\"` });\n res.end(md);\n return true;\n }\n json(res, 400, { error: \"unsupported_format\" });\n return true;\n }\n\n // Force Release\n if (pathname.match(/^\\/api\\/v1\\/atoms\\/[^\\/]+\\/force-release$/) && method === \"POST\") {\n const atomId = pathname.replace(\"/api/v1/atoms/\", \"\").replace(\"/force-release\", \"\");\n const atom = store.getAtom(atomId);\n if (!atom) { json(res, 404, { error: \"atom_not_found\" }); return true; }\n if (!atom.locked_by) { json(res, 200, { success: true, note: \"not_locked\" }); return true; }\n const ok = store.forceRelease(atomId, assistant?.id || \"system\");\n json(res, ok ? 200 : 400, { success: ok });\n return true;\n }\n\n return false;\n}\n","import type { Store } from \"../../core/Store.js\";\nimport { json } from \"../utils.js\";\n\nexport function handleBonds(\n store: Store,\n pathname: string,\n method: string,\n res: import(\"http\").ServerResponse,\n body: any\n): boolean {\n if (pathname.match(/^\\/api\\/v1\\/atoms\\/[^\\/]+\\/bonds$/) && method === \"GET\") {\n const atomId = pathname.replace(\"/api/v1/atoms/\", \"\").replace(\"/bonds\", \"\");\n json(res, 200, store.getBondsByAtom(atomId));\n return true;\n }\n\n if (pathname.match(/^\\/api\\/v1\\/atoms\\/[^\\/]+\\/bonds$/) && method === \"POST\") {\n const atomId = pathname.replace(\"/api/v1/atoms/\", \"\").replace(\"/bonds\", \"\");\n const { target_id, label, color } = body as { target_id: string; label: string; color?: string };\n if (!target_id) { json(res, 400, { error: \"target_id_required\" }); return true; }\n const bond = store.createBond(atomId, target_id, label || \"connects\", color);\n json(res, 200, { bond });\n return true;\n }\n\n if (pathname === \"/api/v1/bonds\" && method === \"DELETE\") {\n const { bond_id } = body as { bond_id: string };\n const ok = store.deleteBond(bond_id);\n json(res, ok ? 200 : 404, { success: ok });\n return true;\n }\n\n if (pathname.match(/^\\/api\\/v1\\/bonds\\/[^\\/]+$/) && method === \"DELETE\") {\n const bondId = pathname.replace(\"/api/v1/bonds/\", \"\");\n const ok = store.deleteBond(bondId);\n json(res, ok ? 200 : 404, { success: ok });\n return true;\n }\n\n if (pathname.match(/^\\/api\\/v1\\/bonds\\/[^\\/]+$/) && method === \"PATCH\") {\n const bondId = pathname.replace(\"/api/v1/bonds/\", \"\");\n const { label, color } = body as { label?: string; color?: string };\n const updated = store.updateBond(bondId, { label, color });\n if (!updated) { json(res, 404, { error: \"bond_not_found\" }); return true; }\n json(res, 200, { bond: updated });\n return true;\n }\n\n return false;\n}\n","import type { Store } from \"../../core/Store.js\";\nimport type { Assistant } from \"../../core/types.js\";\nimport { json } from \"../utils.js\";\n\nexport function handleBlocks(\n store: Store,\n pathname: string,\n method: string,\n res: import(\"http\").ServerResponse,\n body: any,\n assistant?: Assistant\n): boolean {\n if (pathname.match(/^\\/api\\/v1\\/atoms\\/[^\\/]+\\/blocks$/) && method === \"POST\") {\n const atomId = pathname.replace(\"/api/v1/atoms/\", \"\").replace(\"/blocks\", \"\");\n const { type, content, tags } = body as { type: string; content: string; tags?: string[] };\n const isSuggestion = type === \"suggestion\";\n const requiredAction = isSuggestion ? \"suggest\" : \"write\";\n if (!assistant || !store.can(assistant.role, requiredAction as any, atomId, assistant.id)) {\n json(res, 403, { error: \"permission_denied\" }); return true;\n }\n const block = store.createBlock(atomId, type || \"text\", content || \"\", assistant.id, { tags });\n if (type === \"file\" || type === \"image\") {\n store.processFileBlock(atomId, content || \"\").catch(() => {});\n }\n json(res, 200, { block });\n return true;\n }\n\n if (pathname.match(/^\\/api\\/v1\\/blocks\\/[^\\/]+$/) && method === \"GET\") {\n const blockId = pathname.replace(\"/api/v1/blocks/\", \"\");\n const block = store.getBlock(blockId);\n if (!block) { json(res, 404, { error: \"block_not_found\" }); return true; }\n json(res, 200, { block });\n return true;\n }\n\n if (pathname.match(/^\\/api\\/v1\\/blocks\\/[^\\/]+$/) && method === \"PATCH\") {\n const blockId = pathname.replace(\"/api/v1/blocks/\", \"\");\n const { content, type, metadata } = body as { content?: string; type?: string; metadata?: any };\n const block = store.getBlock(blockId);\n if (!block) { json(res, 404, { error: \"block_not_found\" }); return true; }\n if (content !== undefined) {\n store.updateBlock(blockId, content, assistant?.id || \"system\");\n }\n if (type !== undefined || metadata !== undefined) {\n const updates: string[] = [];\n const vals: any[] = [];\n if (type !== undefined) { updates.push(\"type = ?\"); vals.push(type); }\n if (metadata !== undefined) { updates.push(\"metadata = ?\"); vals.push(JSON.stringify(metadata)); }\n vals.push(blockId);\n store[\"stmt\"](`UPDATE blocks SET ${updates.join(\", \")} WHERE id = ?`).run(...vals);\n }\n json(res, 200, { block: store.getBlock(blockId) });\n return true;\n }\n\n if (pathname.match(/^\\/api\\/v1\\/blocks\\/[^\\/]+$/) && method === \"DELETE\") {\n const blockId = pathname.replace(\"/api/v1/blocks/\", \"\");\n const block = store.getBlock(blockId);\n if (!block) { json(res, 404, { error: \"block_not_found\" }); return true; }\n const ok = store.deleteBlock(blockId, assistant?.id || \"system\");\n json(res, ok ? 200 : 400, { success: ok });\n return true;\n }\n\n return false;\n}\n","import type { Store } from \"../../core/Store.js\";\nimport { json, resolveProjectId } from \"../utils.js\";\n\nexport async function handleSearch(\n store: Store,\n pathname: string,\n method: string,\n res: import(\"http\").ServerResponse,\n searchParams: URLSearchParams\n): Promise<boolean> {\n if (pathname === \"/api/v1/search\" && method === \"GET\") {\n const projectId = resolveProjectId(store, searchParams.get(\"project_id\") || \"\");\n const q = (searchParams.get(\"q\") || \"\").toLowerCase();\n const limit = parseInt(searchParams.get(\"limit\") || \"20\", 10);\n const semantic = searchParams.get(\"semantic\") === \"true\";\n if (!q) { json(res, 200, { results: [], count: 0 }); return true; }\n\n let results: any[] = [];\n\n if (semantic) {\n const { embedText } = await import(\"../../server/embedder.js\");\n const queryEmbedding = await embedText(q);\n if (queryEmbedding) {\n results = store.searchHybrid(projectId, q, queryEmbedding, limit);\n } else {\n results = store.search(projectId, q, limit);\n }\n } else {\n results = store.search(projectId, q, limit);\n }\n\n json(res, 200, { query: q, semantic, count: results.length, results });\n return true;\n }\n\n return false;\n}\n","/**\n * Content-Addressed Storage (CAS)\n * Files stored by SHA256 hash, sharded by first 2 hex chars.\n */\n\nimport { createHash } from \"crypto\";\nimport { mkdirSync, existsSync, writeFileSync, readFileSync } from \"fs\";\nimport { resolve, dirname } from \"path\";\nimport { CONFIG } from \"../config.js\";\n\nconst FILES_DIR = resolve(process.cwd(), CONFIG.storage.files_dir);\n\nfunction ensureDir(path: string): void {\n if (!existsSync(path)) mkdirSync(path, { recursive: true });\n}\n\nfunction hashPath(hash: string): string {\n return resolve(FILES_DIR, hash.slice(0, 2), hash.slice(2));\n}\n\nexport function computeHash(buffer: Buffer): string {\n return createHash(\"sha256\").update(buffer).digest(\"hex\");\n}\n\nexport function saveFile(buffer: Buffer, _fileName: string): { hash: string; size: number; path: string } {\n const hash = computeHash(buffer);\n const dest = hashPath(hash);\n\n if (!existsSync(dest)) {\n ensureDir(dirname(dest));\n writeFileSync(dest, buffer);\n }\n\n return { hash, size: buffer.length, path: dest };\n}\n\nexport function getFile(hash: string): Buffer | null {\n try {\n return readFileSync(hashPath(hash));\n } catch {\n return null;\n }\n}\n\nexport function fileExists(hash: string): boolean {\n return existsSync(hashPath(hash));\n}\n","import type { Store } from \"../../core/Store.js\";\nimport { saveFile, getFile, computeHash } from \"../../server/files.js\";\nimport { json } from \"../utils.js\";\n\nexport function handleFiles(\n store: Store,\n pathname: string,\n method: string,\n req: import(\"http\").IncomingMessage,\n res: import(\"http\").ServerResponse,\n maxFileSizeMb: number\n): boolean | Promise<boolean> {\n if (pathname === \"/api/v1/files/upload\" && method === \"POST\") {\n const fileName = req.headers[\"x-file-name\"] as string || \"upload\";\n const mimeType = req.headers[\"content-type\"] || \"application/octet-stream\";\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n req.on(\"end\", () => {\n const buffer = Buffer.concat(chunks);\n const maxBytes = maxFileSizeMb * 1024 * 1024;\n if (buffer.length > maxBytes) {\n json(res, 413, { error: \"file_too_large\", max: `${maxFileSizeMb}MB` }); return;\n }\n const hash = computeHash(buffer);\n const existing = store.getAttachmentByHash(hash);\n if (existing) {\n json(res, 200, { success: true, hash, file_name: existing.file_name, size: existing.file_size, mime_type: existing.mime_type, dedup: true });\n return;\n }\n const saved = saveFile(buffer, fileName);\n const attachment = store.createAttachment(hash, fileName, saved.size, mimeType);\n json(res, 200, { success: true, hash, file_name: fileName, size: saved.size, mime_type: mimeType });\n });\n return true;\n }\n\n if (pathname.match(/^\\/api\\/v1\\/files\\/[^\\/]+$/) && method === \"GET\") {\n const hash = pathname.replace(\"/api/v1/files/\", \"\");\n const data = getFile(hash);\n if (!data) { json(res, 404, { error: \"file_not_found\" }); return true; }\n const attachment = store.getAttachmentByHash(hash);\n const mime = attachment?.mime_type || \"application/octet-stream\";\n res.writeHead(200, { \"Content-Type\": mime, \"Content-Length\": data.length });\n res.end(data);\n return true;\n }\n\n return false;\n}\n","/**\n * .mnemosyne Export Format\n * Creates a ZIP containing: nexus.db + files/ + manifest.json\n */\n\nimport AdmZip from \"adm-zip\";\nimport { createHash } from \"crypto\";\nimport { readFileSync, existsSync, readdirSync, statSync } from \"fs\";\nimport { resolve } from \"path\";\n\nconst DB_PATH = resolve(process.cwd(), \"data\", \"nexus.db\");\nconst FILES_DIR = resolve(process.cwd(), \"data\", \"files\");\n\nfunction sha256File(path: string): string {\n return createHash(\"sha256\").update(readFileSync(path)).digest(\"hex\");\n}\n\nfunction sha256Dir(dir: string): string {\n const hash = createHash(\"sha256\");\n function walk(p: string) {\n const stat = statSync(p);\n if (stat.isFile()) {\n hash.update(readFileSync(p));\n } else if (stat.isDirectory()) {\n for (const child of readdirSync(p).sort()) walk(resolve(p, child));\n }\n }\n walk(dir);\n return hash.digest(\"hex\");\n}\n\nexport function buildMnemosyneExport(projectId?: string, projectName?: string): Buffer {\n const zip = new AdmZip();\n\n // Add database\n zip.addLocalFile(DB_PATH, \"\", \"nexus.db\");\n\n // Add files directory\n if (existsSync(FILES_DIR)) {\n zip.addLocalFolder(FILES_DIR, \"files\");\n }\n\n // Build manifest\n const dbChecksum = sha256File(DB_PATH);\n const filesChecksum = existsSync(FILES_DIR) ? sha256Dir(FILES_DIR) : \"\";\n\n const manifest = {\n version: \"1.1\",\n app: \"Mnemosyne\",\n exported_at: new Date().toISOString(),\n project: projectId ? { id: projectId, name: projectName || \"\" } : null,\n checksums: { db: dbChecksum, files: filesChecksum },\n };\n\n zip.addFile(\"manifest.json\", Buffer.from(JSON.stringify(manifest, null, 2)));\n\n return zip.toBuffer();\n}\n\nexport function parseMnemosyneImport(zipBuffer: Buffer): { valid: boolean; error?: string; manifest?: any } {\n try {\n const zip = new AdmZip(zipBuffer);\n const manifestEntry = zip.getEntry(\"manifest.json\");\n if (!manifestEntry) return { valid: false, error: \"Missing manifest.json\" };\n\n const manifest = JSON.parse(manifestEntry.getData().toString(\"utf-8\"));\n if (manifest.version !== \"1.0\" && manifest.version !== \"1.1\") return { valid: false, error: `Unsupported version: ${manifest.version}` };\n if (!zip.getEntry(\"nexus.db\")) return { valid: false, error: \"Missing nexus.db\" };\n\n return { valid: true, manifest };\n } catch (err: any) {\n return { valid: false, error: err.message };\n }\n}\n","import type { Store } from \"../../core/Store.js\";\nimport type { Assistant } from \"../../core/types.js\";\nimport { buildMnemosyneExport, parseMnemosyneImport } from \"../../server/export-format.js\";\nimport { json, resolveProjectId, exportMarkdown } from \"../utils.js\";\n\nexport function handleExportImport(\n store: Store,\n pathname: string,\n method: string,\n req: import(\"http\").IncomingMessage,\n res: import(\"http\").ServerResponse,\n body: any,\n searchParams: URLSearchParams,\n assistant?: Assistant\n): boolean | Promise<boolean> {\n if (pathname === \"/api/v1/export\" && method === \"GET\") {\n const format = searchParams.get(\"format\") || \"mnemosyne\";\n const projectId = resolveProjectId(store, searchParams.get(\"project_id\") || \"\");\n\n if (format === \"markdown\") {\n const md = exportMarkdown(store, projectId);\n res.writeHead(200, { \"Content-Type\": \"text/markdown; charset=utf-8\", \"Content-Disposition\": \"attachment; filename=mnemosyne-export.md\" });\n res.end(md);\n return true;\n }\n\n if (format === \"mnemosyne\") {\n const project = projectId ? store.getProject(projectId) : undefined;\n const zipBuffer = buildMnemosyneExport(projectId, project?.name);\n res.writeHead(200, {\n \"Content-Type\": \"application/zip\",\n \"Content-Disposition\": `attachment; filename=\"${project?.name || \"mnemosyne\"}.mnemosyne\"`,\n \"Content-Length\": zipBuffer.length,\n });\n res.end(zipBuffer);\n return true;\n }\n\n if (!assistant || !store.can(assistant.role, \"export\", \"/system\")) {\n json(res, 403, { error: \"permission_denied\" }); return true;\n }\n const snapshot = store.exportSnapshot();\n json(res, 200, snapshot);\n return true;\n }\n\n if (pathname === \"/api/v1/import\" && method === \"POST\") {\n if (!assistant || !store.can(assistant.role, \"import\", \"/system\")) {\n json(res, 403, { error: \"permission_denied\" }); return true;\n }\n const format = searchParams.get(\"format\") || \"mnemosyne\";\n\n if (format === \"mnemosyne\") {\n const contentType = req.headers[\"content-type\"] || \"\";\n if (contentType.includes(\"application/zip\") || contentType.includes(\"multipart\") || contentType.includes(\"application/octet-stream\")) {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n req.on(\"end\", () => {\n const buffer = Buffer.concat(chunks);\n const parsed = parseMnemosyneImport(buffer);\n if (!parsed.valid) { json(res, 400, { success: false, error: parsed.error }); return; }\n const result = store.importMnemosyneZip(buffer, assistant.id);\n if (result.success) {\n json(res, 200, { success: true, atomsRestored: result.atomsRestored });\n } else {\n json(res, 400, { success: false, error: result.error });\n }\n });\n return true;\n }\n json(res, 400, { success: false, error: \"expected_zip_body\" });\n return true;\n }\n\n if (format === \"markdown\") {\n const projectId = resolveProjectId(store, searchParams.get(\"project_id\") || \"\");\n if (!projectId) { json(res, 400, { error: \"project_id_required\" }); return true; }\n const md = typeof body === \"string\" ? body : (body.content || \"\");\n const title = body.title || undefined;\n const result = store.importMarkdown(md, projectId, assistant.id, { title });\n if (result.success) {\n json(res, 200, { success: true, atomId: result.atomId, bondsCreated: result.bondsCreated });\n } else {\n json(res, 400, { success: false, error: result.error });\n }\n return true;\n }\n\n json(res, 400, { success: false, error: \"unsupported_import_format\" });\n return true;\n }\n\n return false;\n}\n","import type { Store } from \"../../core/Store.js\";\nimport { json } from \"../utils.js\";\n\nexport function handleEvents(\n store: Store,\n pathname: string,\n method: string,\n res: import(\"http\").ServerResponse,\n searchParams: URLSearchParams\n): boolean {\n if (pathname === \"/api/v1/events\" && method === \"GET\") {\n const since = parseInt(searchParams.get(\"since\") || \"0\", 10);\n const projectId = searchParams.get(\"project_id\") || undefined;\n const limit = parseInt(searchParams.get(\"limit\") || \"50\", 10);\n json(res, 200, { events: store.getEvents(since, projectId, limit) });\n return true;\n }\n\n if (pathname.match(/^\\/api\\/v1\\/atoms\\/[^\\/]+\\/events$/) && method === \"GET\") {\n const atomId = pathname.replace(\"/api/v1/atoms/\", \"\").replace(\"/events\", \"\");\n const limit = parseInt(searchParams.get(\"limit\") || \"50\", 10);\n json(res, 200, { events: store.getEventsByAtom(atomId, limit) });\n return true;\n }\n\n return false;\n}\n","import type { Store } from \"../../core/Store.js\";\nimport { json } from \"../utils.js\";\n\nexport function handleHealth(\n store: Store,\n pathname: string,\n method: string,\n res: import(\"http\").ServerResponse\n): boolean {\n if (pathname === \"/health\" && method === \"GET\") {\n const stats = store.getStats();\n json(res, 200, {\n status: \"ok\",\n version: \"2.0.0\",\n storage: \"sqlite\",\n database: store.config.database.path,\n uptime: process.uptime(),\n counts: stats,\n });\n return true;\n }\n\n return false;\n}\n","/**\n * Mnemosyne Core Types\n * Shared TypeScript interfaces and constants used across all modules.\n */\n\nexport const VALID_STATUSES = ['draft', 'review', 'approved', 'archived', 'deprecated', 'hot'];\n\nexport const ALLOWED_TRANSITIONS: Record<string, string[]> = {\n draft: ['review', 'archived', 'hot'],\n review: ['draft', 'approved', 'archived'],\n approved: ['review', 'deprecated', 'archived'],\n archived: ['draft'],\n deprecated: ['draft', 'archived'],\n hot: ['draft', 'review']\n};\n\nexport type PermissionLevel = \"none\" | \"view\" | \"suggest\" | \"edit\" | \"create\" | \"admin\";\n\nexport type Action =\n | \"create\" | \"read\" | \"write\" | \"update\" | \"delete\"\n | \"lock\" | \"manage_queue\" | \"force_release\"\n | \"peek\" | \"export\" | \"import\" | \"suggest\";\n\nexport type AssistantRole = \"owner\" | \"admin\" | \"manager\" | \"lead\" | \"developer\" | \"worker\" | \"reviewer\" | \"observer\" | \"bot\" | \"guest\";\n\nexport interface Project {\n id: string;\n name: string;\n description: string | null;\n icon: string;\n color: string;\n created_at: number;\n updated_at: number;\n owner: string;\n metadata: Record<string, any>;\n}\n\nexport interface Atom {\n id: string;\n project_id: string;\n parent_id: string | null;\n title: string;\n summary: string | null;\n icon: string;\n color: string | null;\n x: number | null;\n y: number | null;\n created_at: number;\n updated_at: number;\n version: number;\n locked_by: string | null;\n locked_at: number | null;\n locked_reason: string | null;\n owner: string;\n status: string;\n metadata: Record<string, any>;\n auto_path?: string;\n path_overridden?: boolean;\n status_updated_at?: number;\n block_count?: number;\n bond_count?: number;\n template_id?: string | null;\n embedding_status?: string | null;\n}\n\nexport interface Block {\n id: string;\n atom_id: string;\n type: string;\n content: string | null;\n order_index: number;\n created_at: number;\n updated_at: number;\n metadata: Record<string, any>;\n}\n\nexport interface Bond {\n id: string;\n source_id: string;\n target_id: string;\n label: string;\n color: string | null;\n created_at: number;\n}\n\nexport interface Assistant {\n id: string;\n name: string;\n role: AssistantRole;\n permissions: Record<string, any>;\n status: string;\n provider: string | null;\n connected_at: number;\n last_seen: number;\n metadata: Record<string, any>;\n}\n\nexport interface QueueEntry {\n id: string;\n atom_id: string;\n assistant_id: string;\n requested_at: number;\n priority: number;\n status: string;\n reason: string | null;\n}\n\nexport interface EventLogEntry {\n id: string;\n timestamp: number;\n event_type: string;\n project_id: string | null;\n atom_id: string | null;\n block_id: string | null;\n bond_id: string | null;\n actor: string;\n actor_type: string;\n diff: string | null;\n trigger: string | null;\n metadata: Record<string, any>;\n}\n\nexport interface Config {\n server: {\n port: number;\n host: string;\n version: string;\n };\n database: {\n path: string;\n wal_mode: boolean;\n vec_extension_path: string;\n };\n storage: {\n files_dir: string;\n max_file_size_mb: number;\n backups_dir: string;\n backup_interval_hours: number;\n max_backups: number;\n };\n limits: {\n max_atoms_per_project: number;\n rate_limit_requests: number;\n rate_limit_window_ms: number;\n };\n embeddings: {\n model: string;\n dimension: number;\n max_text_length: number;\n };\n features: {\n mcp_enabled: boolean;\n auto_index_enabled: boolean;\n file_processing_enabled: boolean;\n };\n index: {\n debounce_ms: number;\n };\n search: {\n semantic_weight: number;\n fts_weight: number;\n };\n bonds: {\n default_type: string;\n };\n}\n\nexport const TEMPLATES: Record<string, { name: string; blocks: { type: string; content: string }[] }> = {\n blank: { name: \"Blank\", blocks: [] },\n \"meeting-notes\": { name: \"Meeting Notes\", blocks: [\n { type: \"Attendees\", content: \"\" },\n { type: \"Agenda\", content: \"\" },\n { type: \"Notes\", content: \"\" },\n { type: \"Action Items\", content: \"\" }\n ]},\n \"decision-record\": { name: \"Decision Record\", blocks: [\n { type: \"Context\", content: \"\" },\n { type: \"Options\", content: \"\" },\n { type: \"Decision\", content: \"\" },\n { type: \"Consequences\", content: \"\" }\n ]},\n \"bug-report\": { name: \"Bug Report\", blocks: [\n { type: \"Repro Steps\", content: \"\" },\n { type: \"Expected\", content: \"\" },\n { type: \"Actual\", content: \"\" },\n { type: \"Environment\", content: \"\" }\n ]},\n \"api-design\": { name: \"API Design\", blocks: [\n { type: \"Endpoint\", content: \"\" },\n { type: \"Request\", content: \"\" },\n { type: \"Response\", content: \"\" },\n { type: \"Auth\", content: \"\" },\n { type: \"Errors\", content: \"\" }\n ]},\n persona: { name: \"Persona\", blocks: [\n { type: \"Name\", content: \"\" },\n { type: \"Role\", content: \"\" },\n { type: \"Goals\", content: \"\" },\n { type: \"Pain Points\", content: \"\" },\n { type: \"Quotes\", content: \"\" }\n ]},\n \"project-spec\": { name: \"Project Spec\", blocks: [\n { type: \"Overview\", content: \"\" },\n { type: \"Goals\", content: \"\" },\n { type: \"Non-Goals\", content: \"\" },\n { type: \"Timeline\", content: \"\" }\n ]},\n \"daily-journal\": { name: \"Daily Journal\", blocks: [\n { type: \"Date\", content: \"\" },\n { type: \"Wins\", content: \"\" },\n { type: \"Blockers\", content: \"\" },\n { type: \"Tomorrow\", content: \"\" }\n ]}\n};\n\nexport const ROLE_PERMISSIONS: Record<AssistantRole, { actions: Action[]; pattern: string }> = {\n owner: { actions: [\"create\",\"read\",\"write\",\"update\",\"delete\",\"lock\",\"manage_queue\",\"force_release\",\"peek\",\"export\",\"import\"], pattern: \"/**\" },\n admin: { actions: [\"create\",\"read\",\"write\",\"update\",\"delete\",\"lock\",\"manage_queue\",\"force_release\",\"peek\",\"export\",\"import\"], pattern: \"/**\" },\n manager: { actions: [\"create\",\"read\",\"write\",\"update\",\"delete\",\"lock\",\"manage_queue\",\"force_release\",\"peek\",\"export\",\"import\"], pattern: \"/**\" },\n lead: { actions: [\"create\",\"read\",\"write\",\"update\",\"delete\",\"lock\",\"manage_queue\",\"force_release\",\"peek\",\"export\"], pattern: \"/**\" },\n developer: { actions: [\"create\",\"read\",\"write\",\"update\",\"delete\",\"lock\",\"peek\",\"export\"], pattern: \"/**\" },\n worker: { actions: [\"read\",\"write\",\"lock\",\"peek\"], pattern: \"/**\" },\n reviewer: { actions: [\"read\",\"peek\",\"export\"], pattern: \"/**\" },\n observer: { actions: [\"read\",\"peek\"], pattern: \"/**\" },\n bot: { actions: [\"read\",\"write\",\"peek\"], pattern: \"/**\" },\n guest: { actions: [\"read\",\"peek\"], pattern: \"/**\" },\n};\n\nexport const PRIORITY = {\n IMMEDIATE: 0,\n HIGH: 1,\n NORMAL: 2,\n LOW: 3,\n SCHEDULED: 4,\n} as const;\n","import type { Store } from \"../../core/Store.js\";\nimport { TEMPLATES } from \"../../core/types.js\";\nimport { json, resolveProjectId } from \"../utils.js\";\n\nexport function handleTree(\n store: Store,\n pathname: string,\n method: string,\n res: import(\"http\").ServerResponse,\n searchParams: URLSearchParams\n): boolean {\n if (pathname === \"/api/v1/tree\" && method === \"GET\") {\n const projectId = resolveProjectId(store, searchParams.get(\"project_id\") || \"\");\n const graph = store.getGraph(projectId);\n json(res, 200, { project_id: projectId, ...graph });\n return true;\n }\n\n if (pathname === \"/api/v1/templates\" && method === \"GET\") {\n const templates = Object.entries(TEMPLATES).map(([id, t]) => ({ id, name: t.name }));\n json(res, 200, { templates });\n return true;\n }\n\n return false;\n}\n","/**\n * Mnemosyne API Router\n * Modular HTTP router combining all domain routes.\n */\n\nimport type { Store } from \"../core/Store.js\";\nimport { McpServer, McpHttpTransport } from \"../server/mcp.js\";\nimport { RateLimiter, setCorsHeaders, authenticate } from \"./middleware.js\";\nimport { readBody, json } from \"./utils.js\";\nimport { handleAssistants } from \"./routes/assistants.js\";\nimport { handleProjects } from \"./routes/projects.js\";\nimport { handleAtoms } from \"./routes/atoms.js\";\nimport { handleBonds } from \"./routes/bonds.js\";\nimport { handleBlocks } from \"./routes/blocks.js\";\nimport { handleSearch } from \"./routes/search.js\";\nimport { handleFiles } from \"./routes/files.js\";\nimport { handleExportImport } from \"./routes/export-import.js\";\nimport { handleEvents } from \"./routes/events.js\";\nimport { handleHealth } from \"./routes/health.js\";\nimport { handleTree } from \"./routes/tree.js\";\n\nexport class ApiRouter {\n private store: Store;\n private rateLimiter: RateLimiter;\n private mcpServer: McpServer;\n private mcpTransport: McpHttpTransport;\n\n constructor(store: Store) {\n this.store = store;\n this.rateLimiter = new RateLimiter(\n store.config.limits.rate_limit_requests,\n store.config.limits.rate_limit_window_ms\n );\n this.mcpServer = new McpServer(store);\n this.mcpTransport = new McpHttpTransport(this.mcpServer);\n }\n\n async handle(req: import(\"http\").IncomingMessage, res: import(\"http\").ServerResponse): Promise<void> {\n const url = new URL(req.url || \"/\", `http://${req.headers.host}`);\n const pathname = url.pathname;\n const method = req.method || \"GET\";\n\n setCorsHeaders(res);\n if (method === \"OPTIONS\") { res.writeHead(204); res.end(); return; }\n\n try {\n const assistant = authenticate(this.store, req);\n const token = req.headers.authorization?.replace(\"Bearer \", \"\");\n\n if (token && !this.rateLimiter.check(token)) {\n json(res, 429, { error: \"rate_limit\" }); return;\n }\n\n // File upload (raw body)\n const filesResult = handleFiles(this.store, pathname, method, req, res, this.store.config.storage.max_file_size_mb);\n if (filesResult === true) return;\n\n const body = method !== \"GET\" && method !== \"DELETE\" ? await readBody(req) : {};\n\n // MCP\n if (pathname === \"/mcp/manifest\" && method === \"GET\") {\n json(res, 200, this.mcpServer.getManifest()); return;\n }\n if (pathname === \"/mcp/sse\" && method === \"GET\") {\n this.mcpTransport.handleSse(req, res); return;\n }\n if (pathname === \"/mcp/messages\" && method === \"POST\") {\n this.mcpTransport.handleMessage(req, res, body); return;\n }\n\n // Domain routes\n if (handleAssistants(this.store, pathname, method, res, body)) return;\n if (handleProjects(this.store, pathname, method, res, body, url.searchParams)) return;\n if (handleAtoms(this.store, pathname, method, res, body, url.searchParams, assistant)) return;\n if (handleBonds(this.store, pathname, method, res, body)) return;\n if (handleBlocks(this.store, pathname, method, res, body, assistant)) return;\n if (await handleSearch(this.store, pathname, method, res, url.searchParams)) return;\n if (handleExportImport(this.store, pathname, method, req, res, body, url.searchParams, assistant)) return;\n if (handleEvents(this.store, pathname, method, res, url.searchParams)) return;\n if (handleTree(this.store, pathname, method, res, url.searchParams)) return;\n if (handleHealth(this.store, pathname, method, res)) return;\n\n json(res, 404, { error: \"not_found\", path: pathname, method });\n } catch (err: any) {\n json(res, 500, { error: err.message });\n }\n }\n}\n"],"mappings":"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","names":["valueStr","colonIdx","updated","resolve","embedText","import_fs","import_path","import_crypto","import_fs","import_path","FILES_DIR","AdmZip"]}
1
+ {"version":3,"sources":["../../src/config.ts","../../src/server/embedder.ts","../../src/server/api.ts","../../src/mcp/tools.ts","../../src/mcp/server.ts","../../src/mcp/sse.ts","../../src/api/middleware.ts","../../src/api/utils.ts","../../src/api/routes/assistants.ts","../../src/api/routes/projects.ts","../../src/api/routes/atoms.ts","../../src/api/routes/bonds.ts","../../src/api/routes/blocks.ts","../../src/api/routes/search.ts","../../src/server/files.ts","../../src/api/routes/files.ts","../../src/server/export-format.ts","../../src/api/routes/export-import.ts","../../src/api/routes/events.ts","../../src/api/routes/health.ts","../../src/core/types.ts","../../src/api/routes/tree.ts","../../src/api/router.ts"],"sourcesContent":["/**\n * Mnemosyne Configuration Loader\n * Reads config.yaml with a minimal parser. No external YAML dependency.\n */\n\nimport { readFileSync, existsSync } from \"fs\";\nimport { resolve } from \"path\";\n\nfunction parseValue(v: string): any {\n const trimmed = v.trim();\n if (trimmed === \"true\") return true;\n if (trimmed === \"false\") return false;\n if (trimmed === \"null\" || trimmed === \"~\") return null;\n if (/^-?\\d+$/.test(trimmed)) return parseInt(trimmed, 10);\n if (/^-?\\d+\\.\\d+$/.test(trimmed)) return parseFloat(trimmed);\n if ((trimmed.startsWith('\"') && trimmed.endsWith('\"')) || (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\"))) {\n return trimmed.slice(1, -1);\n }\n return trimmed;\n}\n\nfunction parseYaml(text: string): any {\n const lines = text.split(\"\\n\");\n const root: any = {};\n const stack: { obj: any; indent: number; isArray: boolean }[] = [{ obj: root, indent: -1, isArray: false }];\n\n for (const rawLine of lines) {\n const commentIdx = rawLine.indexOf(\"#\");\n const line = commentIdx >= 0 ? rawLine.slice(0, commentIdx) : rawLine;\n if (!line.trim()) continue;\n\n const indent = line.length - line.trimStart().length;\n const trimmed = line.trim();\n\n while (stack.length > 1 && stack[stack.length - 1].indent >= indent) {\n stack.pop();\n }\n\n const parent = stack[stack.length - 1];\n\n if (trimmed.startsWith(\"- \")) {\n const valueStr = trimmed.slice(2).trim();\n if (!parent.isArray) {\n // Convert parent object to array if needed (not expected in our config)\n }\n let target: any[] = parent.obj;\n if (!Array.isArray(target)) {\n // Should not happen with well-formed config\n target = [];\n }\n if (valueStr.includes(\":\")) {\n const item: any = {};\n const colonIdx = valueStr.indexOf(\":\");\n const k = valueStr.slice(0, colonIdx).trim();\n const v = valueStr.slice(colonIdx + 1).trim();\n item[k] = parseValue(v);\n target.push(item);\n } else {\n target.push(parseValue(valueStr));\n }\n continue;\n }\n\n const colonIdx = trimmed.indexOf(\":\");\n if (colonIdx === -1) continue;\n\n const key = trimmed.slice(0, colonIdx).trim();\n const valueStr = trimmed.slice(colonIdx + 1).trim();\n\n if (!valueStr) {\n const newObj: any = {};\n parent.obj[key] = newObj;\n stack.push({ obj: newObj, indent, isArray: false });\n } else {\n parent.obj[key] = parseValue(valueStr);\n }\n }\n\n return root;\n}\n\nfunction loadConfig(): Config {\n const configPath = resolve(process.cwd(), \"config.yaml\");\n if (!existsSync(configPath)) {\n console.warn(\"[Config] config.yaml not found, using defaults\");\n return defaultConfig();\n }\n try {\n const raw = readFileSync(configPath, \"utf-8\");\n const parsed = parseYaml(raw);\n return mergeDeep(defaultConfig(), parsed) as Config;\n } catch (err: any) {\n console.error(\"[Config] Failed to parse config.yaml:\", err.message);\n return defaultConfig();\n }\n}\n\nfunction getVersion(): string {\n try {\n const pkg = JSON.parse(readFileSync(resolve(__dirname, \"../package.json\"), \"utf-8\"));\n return pkg.version;\n } catch {\n try {\n const pkg = JSON.parse(readFileSync(resolve(process.cwd(), \"package.json\"), \"utf-8\"));\n return pkg.version;\n } catch {\n return \"2.0.1\";\n }\n }\n}\n\nfunction defaultConfig(): Config {\n return {\n server: { port: 7321, host: \"localhost\", version: getVersion() },\n database: { path: \"data/nexus.db\", wal_mode: true, vec_extension_path: \"data/vec0\" },\n storage: { files_dir: \"data/files\", max_file_size_mb: 50, backups_dir: \"data/backups\", backup_interval_hours: 24, max_backups: 7 },\n limits: { max_atoms_per_project: 10000, rate_limit_requests: 100, rate_limit_window_ms: 60000 },\n embeddings: { model: \"Xenova/all-MiniLM-L6-v2\", dimension: 384, max_text_length: 10000 },\n features: { mcp_enabled: true, auto_index_enabled: true, file_processing_enabled: true },\n index: { debounce_ms: 30000 },\n search: { semantic_weight: 0.6, fts_weight: 0.4 },\n bonds: { default_type: \"relates\" },\n };\n}\n\nfunction mergeDeep(target: any, source: any): any {\n if (!source || typeof source !== \"object\") return target;\n const output = { ...target };\n for (const key of Object.keys(source)) {\n if (source[key] && typeof source[key] === \"object\" && !Array.isArray(source[key])) {\n output[key] = mergeDeep(target[key] || {}, source[key]);\n } else {\n output[key] = source[key];\n }\n }\n return output;\n}\n\n// ─── Typed Config Interface ───\nexport interface Config {\n server: {\n port: number;\n host: string;\n version: string;\n };\n database: {\n path: string;\n wal_mode: boolean;\n vec_extension_path: string;\n };\n storage: {\n files_dir: string;\n max_file_size_mb: number;\n backups_dir: string;\n backup_interval_hours: number;\n max_backups: number;\n };\n limits: {\n max_atoms_per_project: number;\n rate_limit_requests: number;\n rate_limit_window_ms: number;\n };\n embeddings: {\n model: string;\n dimension: number;\n max_text_length: number;\n };\n features: {\n mcp_enabled: boolean;\n auto_index_enabled: boolean;\n file_processing_enabled: boolean;\n };\n index: {\n debounce_ms: number;\n };\n search: {\n semantic_weight: number;\n fts_weight: number;\n };\n bonds: {\n default_type: string;\n };\n}\n\nexport const CONFIG: Config = loadConfig();\n","/**\n * Mnemosyne Embedder\n * Lazy-loaded semantic embedding using @xenova/transformers.\n * Model: all-MiniLM-L6-v2 (384 dimensions)\n * Downloads model on first use (~50MB).\n */\n\nimport { pipeline, type FeatureExtractionPipeline } from \"@xenova/transformers\";\nimport { CONFIG } from \"../config.js\";\n\nlet extractor: FeatureExtractionPipeline | null = null;\nlet loading = false;\nlet loadError: Error | null = null;\n\nasync function getExtractor(): Promise<FeatureExtractionPipeline | null> {\n if (extractor) return extractor;\n if (loadError) return null;\n if (loading) {\n // Wait for existing load\n while (loading) await new Promise(r => setTimeout(r, 100));\n return extractor;\n }\n\n loading = true;\n try {\n // Use Xenova's hosted model (no local path needed)\n extractor = await pipeline(\"feature-extraction\", CONFIG.embeddings.model, {\n quantized: true, // Use quantized model for faster download\n });\n console.log(`[Embedder] Model loaded: ${CONFIG.embeddings.model}`);\n return extractor;\n } catch (err: any) {\n loadError = err;\n console.error(\"[Embedder] Failed to load model:\", err.message);\n return null;\n } finally {\n loading = false;\n }\n}\n\n/**\n * Embed a single text string into a 384-dim float array.\n * Returns null if embedder is unavailable.\n */\nexport async function embedText(text: string): Promise<number[] | null> {\n const ext = await getExtractor();\n if (!ext) return null;\n\n // Truncate very long text\n const truncated = text.slice(0, CONFIG.embeddings.max_text_length);\n if (!truncated.trim()) return null;\n\n try {\n const output = await ext(truncated, { pooling: \"mean\", normalize: true });\n // output.data is a TypedArray of 384 floats\n return Array.from(output.data as Float32Array);\n } catch (err: any) {\n console.error(\"[Embedder] Embedding failed:\", err.message);\n return null;\n }\n}\n\n/**\n * Batch embed multiple texts.\n */\nexport async function embedTexts(texts: string[]): Promise<(number[] | null)[]> {\n const ext = await getExtractor();\n if (!ext) return texts.map(() => null);\n\n const results: (number[] | null)[] = [];\n for (const text of texts) {\n const truncated = text.slice(0, CONFIG.embeddings.max_text_length);\n if (!truncated.trim()) {\n results.push(null);\n continue;\n }\n try {\n const output = await ext(truncated, { pooling: \"mean\", normalize: true });\n results.push(Array.from(output.data as Float32Array));\n } catch {\n results.push(null);\n }\n }\n return results;\n}\n\nexport function isReady(): boolean {\n return extractor !== null;\n}\n","/**\n * Mnemosyne REST API (Backward-Compatible Wrapper)\n * Re-exports from src/api/router.ts\n */\n\nexport { ApiRouter as API } from \"../api/router.js\";\n","/**\n * MCP Tool Definitions\n * All tools exposed to MCP clients (Claude Desktop, Cursor, etc.)\n */\n\nimport type { Store } from \"../core/Store.js\";\nimport type { McpTool } from \"./types.js\";\n\nexport const TOOLS: McpTool[] = [\n {\n name: \"nexus_list_projects\",\n description: \"List all projects in the Mnemosyne knowledge base.\",\n inputSchema: { type: \"object\", properties: {} },\n handler: (_args, store) => {\n return { projects: store.getProjects().map(p => ({ id: p.id, name: p.name, description: p.description, atomCount: store.getAtomsByProject(p.id).length })) };\n },\n },\n {\n name: \"nexus_search\",\n description: \"Search atoms and blocks by keyword. Returns ranked results.\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: { type: \"string\", description: \"Search query\" },\n project: { type: \"string\", description: \"Project name or ID (optional)\" },\n limit: { type: \"number\", description: \"Max results (default 10)\" },\n },\n required: [\"query\"],\n },\n handler: (args, store) => {\n const projectId = args.project ? store.getProjectByName(args.project)?.id || args.project : \"\";\n const results = store.search(projectId, args.query, args.limit || 10);\n return { query: args.query, count: results.length, results };\n },\n },\n {\n name: \"nexus_read_atom\",\n description: \"Read an atom by ID or title. Returns atom details, blocks, children, and bonds.\",\n inputSchema: {\n type: \"object\",\n properties: {\n id: { type: \"string\", description: \"Atom UUID\" },\n title: { type: \"string\", description: \"Atom title (alternative to id)\" },\n project: { type: \"string\", description: \"Project name (required if searching by title)\" },\n },\n required: [],\n },\n handler: (args, store) => {\n let atom = args.id ? store.getAtom(args.id) : undefined;\n if (!atom && args.title && args.project) {\n const projectId = store.getProjectByName(args.project)?.id || args.project;\n atom = store.getAtomsByProject(projectId).find(a => a.title === args.title);\n }\n if (!atom) throw new Error(\"Atom not found\");\n const children = store.getAtomChildren(atom.id).map(a => ({ id: a.id, title: a.title, type: a.metadata?.type || \"text\" }));\n const blocks = store.getBlocksByAtom(atom.id);\n const bonds = store.getBondsByAtom(atom.id);\n return { atom, children, blocks, bonds };\n },\n },\n {\n name: \"nexus_create_atom\",\n description: \"Create a new atom in a project.\",\n inputSchema: {\n type: \"object\",\n properties: {\n project: { type: \"string\", description: \"Project name or ID\" },\n title: { type: \"string\", description: \"Atom title/path\" },\n type: { type: \"string\", description: \"Atom type (text, memory, stream, thought, task)\" },\n parent_id: { type: \"string\", description: \"Parent atom ID (optional)\" },\n tags: { type: \"array\", items: { type: \"string\" }, description: \"Tags (optional)\" },\n assistant_id: { type: \"string\", description: \"Creator assistant ID\" },\n },\n required: [\"project\", \"title\"],\n },\n handler: (args, store) => {\n const project = store.getProjectByName(args.project) || store.getProject(args.project);\n if (!project) throw new Error(\"Project not found\");\n const assistantId = args.assistant_id || \"mcp-assistant\";\n const atom = store.createAtom(project.id, args.title, args.type || \"text\", assistantId, {\n parentId: args.parent_id,\n tags: args.tags,\n });\n return { success: true, atom };\n },\n },\n {\n name: \"nexus_update_atom\",\n description: \"Update an atom's title or parent.\",\n inputSchema: {\n type: \"object\",\n properties: {\n id: { type: \"string\", description: \"Atom UUID\" },\n title: { type: \"string\", description: \"New title\" },\n parent_id: { type: [\"string\", \"null\"], description: \"New parent ID or null for root\" },\n assistant_id: { type: \"string\", description: \"Updater assistant ID\" },\n },\n required: [\"id\"],\n },\n handler: (args, store) => {\n const assistantId = args.assistant_id || \"mcp-assistant\";\n if (args.parent_id !== undefined) {\n const updated = store.updateAtomParent(args.id, args.parent_id, assistantId);\n if (!updated) throw new Error(\"Invalid parent or atom not found\");\n }\n const updated = store.updateAtom(args.id, { title: args.title }, assistantId);\n return { success: true, atom: updated || store.getAtom(args.id) };\n },\n },\n {\n name: \"nexus_create_bond\",\n description: \"Create a bond (graph connection) between two atoms.\",\n inputSchema: {\n type: \"object\",\n properties: {\n source_id: { type: \"string\", description: \"Source atom ID\" },\n target_id: { type: \"string\", description: \"Target atom ID\" },\n label: { type: \"string\", description: \"Bond label (default: connects)\" },\n color: { type: \"string\", description: \"Hex color (optional)\" },\n },\n required: [\"source_id\", \"target_id\"],\n },\n handler: (args, store) => {\n const bond = store.createBond(args.source_id, args.target_id, args.label || \"connects\", args.color);\n return { success: true, bond };\n },\n },\n {\n name: \"nexus_request_checkout\",\n description: \"Request an exclusive checkout (lock) on an atom.\",\n inputSchema: {\n type: \"object\",\n properties: {\n atom_id: { type: \"string\", description: \"Atom UUID\" },\n assistant_id: { type: \"string\", description: \"Assistant requesting checkout\" },\n reason: { type: \"string\", description: \"Reason for checkout\" },\n },\n required: [\"atom_id\", \"assistant_id\"],\n },\n handler: (args, store) => {\n const result = store.checkout(args.atom_id, args.assistant_id, \"exclusive\", args.reason || \"\");\n return result;\n },\n },\n {\n name: \"nexus_release_checkout\",\n description: \"Release a checkout (unlock) on an atom.\",\n inputSchema: {\n type: \"object\",\n properties: {\n atom_id: { type: \"string\", description: \"Atom UUID\" },\n assistant_id: { type: \"string\", description: \"Assistant releasing checkout\" },\n },\n required: [\"atom_id\", \"assistant_id\"],\n },\n handler: (args, store) => {\n const success = store.releaseCheckout(args.atom_id, args.assistant_id);\n return { success };\n },\n },\n {\n name: \"nexus_subscribe_to_atom\",\n description: \"Subscribe to real-time updates for an atom via WebSocket.\",\n inputSchema: {\n type: \"object\",\n properties: {\n atom_id: { type: \"string\", description: \"Atom UUID to subscribe to\" },\n },\n required: [\"atom_id\"],\n },\n handler: (args, _store) => {\n return { success: true, wsEndpoint: \"ws://localhost:7321/ws\", atom_id: args.atom_id, message: \"Connect via WebSocket and send { type: 'subscribe', atomId: '<id>' }\" };\n },\n },\n {\n name: \"nexus_batch\",\n description: \"Execute multiple MCP tools in a single request. Reduces round-trip token waste.\",\n inputSchema: {\n type: \"object\",\n properties: {\n operations: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n tool: { type: \"string\", description: \"Tool name to call\" },\n params: { type: \"object\", description: \"Parameters for the tool\" },\n },\n required: [\"tool\"],\n },\n description: \"Ordered list of tool calls\",\n },\n stop_on_error: { type: \"boolean\", description: \"If true, stop at first error. Default: false\", default: false },\n },\n required: [\"operations\"],\n },\n handler: (args, store) => {\n const operations = args.operations || [];\n const stopOnError = args.stop_on_error ?? false;\n const results: any[] = [];\n const toolMap = new Map<string, McpTool>();\n for (const t of TOOLS) toolMap.set(t.name, t);\n\n for (let i = 0; i < operations.length; i++) {\n const op = operations[i];\n const tool = toolMap.get(op.tool);\n if (!tool) {\n results.push({ index: i, tool: op.tool, error: `Tool not found: ${op.tool}` });\n if (stopOnError) break;\n continue;\n }\n try {\n const result = tool.handler(op.params || {}, store);\n results.push({ index: i, tool: op.tool, success: true, result });\n } catch (err: any) {\n results.push({ index: i, tool: op.tool, error: err.message });\n if (stopOnError) break;\n }\n }\n return { count: operations.length, completed: results.length, results };\n },\n },\n];\n","/**\n * MCP Server\n * JSON-RPC handler for Model Context Protocol.\n */\n\nimport type { Store } from \"../core/Store.js\";\nimport { TOOLS } from \"./tools.js\";\nimport type { JsonRpcRequest, JsonRpcResponse, McpTool } from \"./types.js\";\n\nexport class McpServer {\n private store: Store;\n private toolMap = new Map<string, McpTool>();\n\n constructor(store: Store) {\n this.store = store;\n for (const t of TOOLS) this.toolMap.set(t.name, t);\n }\n\n /**\n * Returns `null` for notifications (no response needed).\n */\n handleRequest(req: JsonRpcRequest): JsonRpcResponse | null {\n // Notifications have no id — do not send a response\n if (req.id === null || req.id === undefined) {\n return null;\n }\n\n try {\n switch (req.method) {\n case \"initialize\":\n return this.ok(req.id, {\n protocolVersion: \"2024-11-05\",\n capabilities: { tools: {}, resources: {}, prompts: {} },\n serverInfo: { name: \"mnemosyne-mcp\", version: \"2.0.0\" },\n });\n\n case \"tools/list\":\n return this.ok(req.id, {\n tools: TOOLS.map(t => ({ name: t.name, description: t.description, inputSchema: t.inputSchema })),\n });\n\n case \"tools/call\": {\n const { name, arguments: args } = req.params || {};\n const tool = this.toolMap.get(name);\n if (!tool) return this.err(req.id, -32601, `Tool not found: ${name}`);\n const result = tool.handler(args || {}, this.store);\n return this.ok(req.id, { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] });\n }\n\n case \"resources/list\":\n return this.ok(req.id, { resources: [] });\n\n case \"prompts/list\":\n return this.ok(req.id, { prompts: [] });\n\n default:\n return this.err(req.id, -32601, `Method not found: ${req.method}`);\n }\n } catch (e: any) {\n return this.err(req.id, -32603, e.message);\n }\n }\n\n getManifest() {\n return {\n name: \"Mnemosyne\",\n version: \"2.0.0\",\n description: \"Knowledge base MCP server for projects, atoms, blocks, and bonds.\",\n protocol: \"mcp\",\n transport: [\"stdio\", \"sse\"],\n endpoints: {\n sse: \"/mcp/sse\",\n messages: \"/mcp/messages\",\n },\n tools: TOOLS.map(t => ({ name: t.name, description: t.description })),\n };\n }\n\n private ok(id: string | number | null, result: any): JsonRpcResponse {\n return { jsonrpc: \"2.0\", id, result };\n }\n private err(id: string | number | null, code: number, message: string): JsonRpcResponse {\n return { jsonrpc: \"2.0\", id, error: { code, message } };\n }\n}\n","/**\n * MCP SSE Transport\n * Server-Sent Events transport for MCP over HTTP.\n */\n\nimport type { McpServer } from \"./server.js\";\nimport type { JsonRpcRequest } from \"./types.js\";\n\ninterface SseSession {\n id: string;\n res: import(\"http\").ServerResponse;\n}\n\nexport class McpSseTransport {\n private server: McpServer;\n private sessions = new Map<string, SseSession>();\n private sessionCounter = 0;\n\n constructor(server: McpServer) {\n this.server = server;\n }\n\n handleSse(req: import(\"http\").IncomingMessage, res: import(\"http\").ServerResponse): void {\n const id = `sess_${++this.sessionCounter}_${Date.now()}`;\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n \"Connection\": \"keep-alive\",\n });\n this.sessions.set(id, { id, res });\n\n // Send endpoint event\n this.sendSse(id, \"endpoint\", \"/mcp/messages?session_id=\" + id);\n\n req.on(\"close\", () => this.sessions.delete(id));\n }\n\n handleMessage(req: import(\"http\").IncomingMessage, res: import(\"http\").ServerResponse, body: any): void {\n const url = new URL(req.url || \"/\", `http://${req.headers.host}`);\n const sessionId = url.searchParams.get(\"session_id\") || \"\";\n\n const request = body as JsonRpcRequest;\n if (!request || request.jsonrpc !== \"2.0\") {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"invalid_jsonrpc\" }));\n return;\n }\n\n const response = this.server.handleRequest(request);\n // Notifications return null — send empty 200\n if (!response) {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(\"{}\");\n return;\n }\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(response));\n\n // Also broadcast via SSE if the session is active\n if (sessionId) this.sendSse(sessionId, \"message\", JSON.stringify(response));\n }\n\n private sendSse(sessionId: string, event: string, data: string): void {\n const session = this.sessions.get(sessionId);\n if (!session) return;\n session.res.write(`event: ${event}\\ndata: ${data}\\n\\n`);\n }\n}\n","/**\n * API Middleware\n * Rate limiting, CORS, auth helpers.\n */\n\nimport type { Store } from \"../core/Store.js\";\nimport type { Assistant } from \"../core/types.js\";\n\ninterface RateWindow {\n count: number;\n resetAt: number;\n}\n\nexport class RateLimiter {\n private rates = new Map<string, RateWindow>();\n private limit: number;\n private windowMs: number;\n\n constructor(limit: number, windowMs: number) {\n this.limit = limit;\n this.windowMs = windowMs;\n setInterval(() => this.cleanup(), 60000);\n }\n\n check(token: string): boolean {\n const now = Date.now();\n let window = this.rates.get(token);\n if (!window || window.resetAt < now) {\n window = { count: 0, resetAt: now + this.windowMs };\n this.rates.set(token, window);\n }\n if (window.count >= this.limit) return false;\n window.count++;\n return true;\n }\n\n private cleanup(): void {\n const now = Date.now();\n for (const [key, window] of this.rates.entries()) {\n if (window.resetAt < now) this.rates.delete(key);\n }\n }\n}\n\nexport function setCorsHeaders(res: import(\"http\").ServerResponse): void {\n res.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n res.setHeader(\"Access-Control-Allow-Methods\", \"GET, POST, PATCH, DELETE, OPTIONS\");\n res.setHeader(\"Access-Control-Allow-Headers\", \"Content-Type, Authorization\");\n res.setHeader(\"Cache-Control\", \"no-store, no-cache, must-revalidate, proxy-revalidate\");\n res.setHeader(\"Pragma\", \"no-cache\");\n res.setHeader(\"Expires\", \"0\");\n}\n\nexport function authenticate(store: Store, req: import(\"http\").IncomingMessage): Assistant | undefined {\n const token = req.headers.authorization?.replace(\"Bearer \", \"\");\n return token ? store.getAssistant(token) : undefined;\n}\n","/**\n * API Utilities\n * Shared helpers for route handlers.\n */\n\nimport type { Store } from \"../core/Store.js\";\n\nexport function json(res: import(\"http\").ServerResponse, status: number, data: any): void {\n res.writeHead(status, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(data));\n}\n\nexport function readBody(req: import(\"http\").IncomingMessage): Promise<any> {\n return new Promise((resolve) => {\n let body = \"\";\n req.on(\"data\", chunk => body += chunk);\n req.on(\"end\", () => { try { resolve(JSON.parse(body)); } catch { resolve({}); } });\n });\n}\n\nexport function resolveProjectId(store: Store, idOrName: string): string {\n if (!idOrName) return \"\";\n if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(idOrName)) return idOrName;\n const p = store.getProjectByName(idOrName);\n return p?.id || idOrName;\n}\n\nexport function serializeAtom(store: Store, atom: any, compact = false): any {\n if (compact) {\n return {\n id: atom.id,\n title: atom.title,\n type: atom.metadata?.type || \"memory\",\n status: atom.status,\n };\n }\n const blockCount = atom.block_count ?? store.getBlocksByAtom(atom.id).length;\n return {\n id: atom.id,\n project_id: atom.project_id,\n parent_id: atom.parent_id,\n title: atom.title,\n summary: atom.summary,\n type: atom.metadata?.type || \"memory\",\n icon: atom.icon,\n color: atom.color,\n metadata: atom.metadata,\n auto_path: atom.auto_path,\n path_overridden: atom.path_overridden,\n status: atom.status,\n status_updated_at: atom.status_updated_at,\n block_count: atom.block_count,\n bond_count: atom.bond_count,\n template_id: atom.template_id,\n embedding_status: atom.embedding_status,\n state: {\n lock: atom.locked_by ? { assistantId: atom.locked_by, reason: atom.locked_reason } : null,\n queue: [],\n blockCount: blockCount,\n lastActivity: atom.updated_at,\n },\n };\n}\n\nexport function pickFields(obj: any, fields: string[]): any {\n const result: any = {};\n for (const f of fields) {\n if (f.includes(\".\")) {\n const [head, ...tail] = f.split(\".\");\n if (obj[head] != null) {\n result[head] = result[head] || (Array.isArray(obj[head]) ? [] : {});\n if (Array.isArray(obj[head])) {\n result[head] = obj[head].map((item: any) => pickFields(item, [tail.join(\".\")]));\n } else {\n const nested = pickFields(obj[head], [tail.join(\".\")]);\n Object.assign(result[head], nested);\n }\n }\n } else if (obj[f] !== undefined) {\n result[f] = obj[f];\n }\n }\n return result;\n}\n\nexport function exportAtomMarkdown(store: Store, atom: any): string {\n const blocks = store.getBlocksByAtom(atom.id).sort((a: any, b: any) => (a.order_index || 0) - (b.order_index || 0));\n const bonds = store.getBondsByAtom(atom.id);\n const parent = atom.parent_id ? store.getAtom(atom.parent_id) : null;\n\n let md = `---\\n`;\n md += `title: \"${atom.title}\"\\n`;\n md += `type: ${atom.type || \"memory\"}\\n`;\n md += `status: ${atom.status || \"draft\"}\\n`;\n md += `path: ${atom.auto_path || \"/\"}\\n`;\n if (atom.summary) md += `summary: \"${atom.summary}\"\\n`;\n if (atom.metadata?.tags?.length) md += `tags: [${atom.metadata.tags.map((t: string) => `\"${t}\"`).join(\", \")}]\\n`;\n if (parent) md += `parent: \"${parent.title}\"\\n`;\n md += `exported_at: ${new Date().toISOString()}\\n`;\n md += `---\\n\\n`;\n\n md += `# ${atom.title}\\n\\n`;\n if (atom.summary) md += `${atom.summary}\\n\\n`;\n\n for (const b of blocks) {\n const content = b.content || \"\";\n if (b.type === \"text\") {\n try { const p = JSON.parse(content); md += `${p.text || content}\\n\\n`; } catch { md += `${content}\\n\\n`; }\n } else if (b.type === \"code\") {\n const lines = content.split(\"\\n\");\n const first = lines[0]?.trim() || \"\";\n let lang = \"\";\n let code = content;\n if (first.startsWith(\"```\")) { lang = first.replace(/```/g, \"\").trim(); code = lines.slice(1).join(\"\\n\").replace(/```$/, \"\").trim(); }\n md += `\\`\\`\\`${lang}\\n${code}\\n\\`\\`\\`\\n\\n`;\n } else if (b.type === \"checklist\") {\n try {\n const items = JSON.parse(content);\n if (Array.isArray(items)) {\n for (const item of items) md += `- [${item.checked ? \"x\" : \" \"}] ${item.text}\\n`;\n md += \"\\n\";\n }\n } catch { md += `${content}\\n\\n`; }\n } else if (b.type === \"table\") {\n try {\n const rows = JSON.parse(content);\n if (Array.isArray(rows) && rows.length) {\n const headers = Object.keys(rows[0]);\n md += `| ${headers.join(\" | \")} |\\n`;\n md += `| ${headers.map(() => \"---\").join(\" | \")} |\\n`;\n for (const row of rows) md += `| ${headers.map(h => String(row[h] ?? \"\")).join(\" | \")} |\\n`;\n md += \"\\n\";\n }\n } catch { md += `${content}\\n\\n`; }\n } else if (b.type === \"image\" || b.type === \"file\") {\n try {\n const meta = JSON.parse(content);\n if (b.type === \"image\") md += `![${meta.file_name || \"image\"}](${meta.hash})\\n\\n`;\n else md += `[${meta.file_name || \"file\"}](${meta.hash})\\n\\n`;\n } catch { md += `${content}\\n\\n`; }\n } else if (b.type === \"link\") {\n const url = content.trim().startsWith(\"http\") ? content.trim() : \"https://\" + content.trim();\n md += `[${content.trim()}](${url})\\n\\n`;\n } else {\n md += `${content}\\n\\n`;\n }\n }\n\n const allBonds = [...(bonds.outgoing || []), ...(bonds.incoming || [])];\n if (allBonds.length) {\n md += `---\\n\\n## Connections\\n\\n`;\n for (const b of allBonds) {\n const otherId = b.source_id === atom.id ? b.target_id : b.source_id;\n const other = store.getAtom(otherId);\n const dir = b.source_id === atom.id ? \"→\" : \"←\";\n md += `- ${dir} [[${other ? other.title : otherId}]] (${b.label})\\n`;\n }\n md += \"\\n\";\n }\n\n return md;\n}\n\nexport function exportMarkdown(store: Store, projectId: string): string {\n const project = projectId ? store.getProject(projectId) : undefined;\n const atoms = projectId ? store.getAtomsByProject(projectId) : [];\n const bonds = projectId ? store.getGraph(projectId).bonds : [];\n const blockMap = new Map<string, any>();\n for (const atom of atoms) {\n for (const b of store.getBlocksByAtom(atom.id)) {\n blockMap.set(b.id, b);\n }\n }\n\n let md = `# ${project ? project.name : \"Mnemosyne Export\"}\\n\\n`;\n md += `*Exported on ${new Date().toISOString()}*\\n\\n`;\n\n const atomMap = new Map(atoms.map(a => [a.id, a]));\n const rootAtoms = atoms.filter(a => !a.parent_id);\n\n function renderAtom(atom: any, depth: number) {\n const indent = \" \".repeat(depth);\n md += `${indent}## ${atom.title}\\n\\n`;\n if (atom.summary) md += `${indent}${atom.summary}\\n\\n`;\n if (atom.metadata?.tags?.length) md += `${indent}*Tags: ${atom.metadata.tags.join(\", \")}*\\n\\n`;\n\n const atomBlocks = Array.from(blockMap.values()).filter(b => b.atom_id === atom.id).sort((a, b) => a.order_index - b.order_index);\n for (const b of atomBlocks) {\n try {\n const parsed = JSON.parse(b.content || \"{}\");\n if (parsed.text) md += `${indent}${parsed.text}\\n\\n`;\n else md += `${indent}\\`\\`\\`json\\n${indent}${JSON.stringify(parsed, null, 2).split(\"\\n\").join(\"\\n\" + indent)}\\n${indent}\\`\\`\\`\\n\\n`;\n } catch {\n md += `${indent}${b.content || \"\"}\\n\\n`;\n }\n }\n\n const children = atoms.filter(a => a.parent_id === atom.id);\n for (const child of children) renderAtom(child, depth + 1);\n }\n\n for (const root of rootAtoms) renderAtom(root, 0);\n\n if (bonds.length) {\n md += `---\\n\\n## Bonds\\n\\n`;\n for (const b of bonds) {\n const src = atomMap.get(b.source_id);\n const tgt = atomMap.get(b.target_id);\n md += `- [[${src ? src.title : b.source_id}]] —${b.label}→ [[${tgt ? tgt.title : b.target_id}]]\\n`;\n }\n md += \"\\n\";\n }\n\n return md;\n}\n","import type { Store } from \"../../core/Store.js\";\nimport type { AssistantRole } from \"../../core/types.js\";\nimport { json } from \"../utils.js\";\n\nexport function handleAssistants(\n store: Store,\n pathname: string,\n method: string,\n res: import(\"http\").ServerResponse,\n body: any\n): boolean {\n if (pathname === \"/api/v1/assistants/register\" && method === \"POST\") {\n const a = body as { id?: string; name: string; role: AssistantRole; capabilities?: string[]; description?: string; provider?: string; instructions?: string; config?: Record<string, any> };\n const id = a.id || a.name || crypto.randomUUID();\n const existing = store.getAssistant(id);\n if (existing) {\n json(res, 200, { success: true, token: existing.id, assistant: existing });\n return true;\n }\n const newAssistant = store.registerAssistant({ id, name: a.name || id, role: a.role || \"developer\", capabilities: a.capabilities || [], description: a.description, provider: a.provider, instructions: a.instructions, config: a.config });\n json(res, 200, { success: true, token: newAssistant.id, assistant: newAssistant });\n return true;\n }\n\n if (pathname.startsWith(\"/api/v1/assistants/\") && pathname.endsWith(\"/heartbeat\") && method === \"POST\") {\n const id = pathname.split(\"/\")[4];\n store.heartbeat(id);\n json(res, 200, { success: true });\n return true;\n }\n\n if (pathname === \"/api/v1/assistants\" && method === \"GET\") {\n const compact = new URL(pathname, \"http://localhost\").searchParams.get(\"compact\") === \"true\";\n const assistants = store.getAllAssistants().map(a => compact\n ? { id: a.id, name: a.name, role: a.role, status: a.status }\n : a\n );\n json(res, 200, { assistants });\n return true;\n }\n\n if (pathname.match(/^\\/api\\/v1\\/assistants\\/[^\\/]+$/) && method === \"PATCH\") {\n const id = pathname.replace(\"/api/v1/assistants/\", \"\");\n const a = body as { name?: string; role?: AssistantRole; description?: string; provider?: string; instructions?: string; config?: Record<string, any>; capabilities?: string[]; status?: string };\n const updated = store.updateAssistant(id, a);\n if (!updated) { json(res, 404, { error: \"assistant_not_found\" }); return true; }\n json(res, 200, { assistant: updated });\n return true;\n }\n\n if (pathname.match(/^\\/api\\/v1\\/assistants\\/[^\\/]+$/) && method === \"DELETE\") {\n const id = pathname.replace(\"/api/v1/assistants/\", \"\");\n const ok = store.deleteAssistant(id);\n json(res, ok ? 200 : 404, { success: ok });\n return true;\n }\n\n return false;\n}\n","import type { Store } from \"../../core/Store.js\";\nimport { json, resolveProjectId } from \"../utils.js\";\n\nexport function handleProjects(\n store: Store,\n pathname: string,\n method: string,\n res: import(\"http\").ServerResponse,\n body: any,\n searchParams: URLSearchParams\n): boolean {\n if (pathname === \"/api/v1/projects\" && method === \"GET\") {\n const compact = searchParams.get(\"compact\") === \"true\";\n const projects = store.getProjects().map(p => compact\n ? { id: p.id, name: p.name, description: p.description }\n : p\n );\n json(res, 200, { projects });\n return true;\n }\n\n if (pathname === \"/api/v1/projects\" && method === \"POST\") {\n const { name, description } = body as { name: string; description?: string };\n if (!name) { json(res, 400, { error: \"name_required\" }); return true; }\n const project = store.createProject(name, description);\n json(res, 200, { success: true, project });\n return true;\n }\n\n // Project Index (__INDEX__ atom)\n const projectIndexMatch = pathname.match(/^\\/api\\/v1\\/projects\\/([^/]+)\\/index$/);\n if (projectIndexMatch && method === \"GET\") {\n const projectId = resolveProjectId(store, projectIndexMatch[1]);\n const indexAtom = store.getProjectIndexAtom(projectId);\n if (!indexAtom) {\n json(res, 404, { error: \"index_not_found\" });\n return true;\n }\n const blocks = store.getBlocksByAtom(indexAtom.id);\n const manifestBlock = blocks.find(b => b.type === \"text\");\n let manifest: any = {};\n try {\n if (manifestBlock) manifest = JSON.parse(manifestBlock.content || \"{}\");\n } catch {}\n json(res, 200, {\n project_id: projectId,\n atom_id: indexAtom.id,\n generated_at: indexAtom.updated_at,\n manifest,\n });\n return true;\n }\n\n return false;\n}\n","import type { Store } from \"../../core/Store.js\";\nimport type { Assistant } from \"../../core/types.js\";\nimport { json, resolveProjectId, serializeAtom, pickFields, exportAtomMarkdown } from \"../utils.js\";\n\nexport function handleAtoms(\n store: Store,\n pathname: string,\n method: string,\n res: import(\"http\").ServerResponse,\n body: any,\n searchParams: URLSearchParams,\n assistant?: Assistant\n): boolean {\n if (pathname === \"/api/v1/atoms\" && method === \"POST\") {\n const { project_id, title, type, parent_id, tags, template, status, auto_path, path_overridden } = body as { project_id: string; title: string; type: string; parent_id?: string; tags?: string[]; template?: string; status?: string; auto_path?: string; path_overridden?: boolean };\n if (!project_id || !title) { json(res, 400, { error: \"project_id_and_title_required\" }); return true; }\n const resolvedProjectId = resolveProjectId(store, project_id);\n if (!resolvedProjectId) { json(res, 400, { error: \"project_not_found\" }); return true; }\n if (!assistant || !store.can(assistant.role, \"create\", undefined, assistant.id)) {\n json(res, 403, { error: \"permission_denied\" }); return true; }\n const atom = store.createAtom(resolvedProjectId, title, type || \"text\", assistant.id, { parentId: parent_id, tags, template, status, auto_path, path_overridden });\n json(res, 200, { atom: serializeAtom(store, atom) });\n return true;\n }\n\n if (pathname === \"/api/v1/atoms\" && method === \"GET\") {\n const projectId = resolveProjectId(store, searchParams.get(\"project_id\") || \"\");\n const compact = searchParams.get(\"compact\") === \"true\";\n const atoms = projectId\n ? store.getAtomsByProject(projectId).map(d => serializeAtom(store, d, compact))\n : [];\n json(res, 200, { atoms });\n return true;\n }\n\n if (pathname.match(/^\\/api\\/v1\\/atoms\\/[^\\/]+$/) && method === \"GET\" && !pathname.includes(\"/blocks\") && !pathname.includes(\"/bonds\") && !pathname.includes(\"/checkout\") && !pathname.includes(\"/queue\")) {\n const atomId = pathname.replace(\"/api/v1/atoms/\", \"\");\n const atom = store.getAtom(atomId);\n if (!atom) { json(res, 404, { error: \"atom_not_found\" }); return true; }\n const fieldsParam = searchParams.get(\"fields\");\n const children = store.getAtomChildren(atomId).map(a => ({ id: a.id, title: a.title, type: a.metadata?.type || \"memory\", blockCount: store.getBlocksByAtom(a.id).length }));\n const full = {\n atom: serializeAtom(store, atom),\n children,\n blocks: store.getBlocksByAtom(atomId),\n bonds: store.getBondsByAtom(atomId),\n };\n const response = fieldsParam ? pickFields(full, fieldsParam.split(\",\")) : full;\n json(res, 200, response);\n return true;\n }\n\n if (pathname.match(/^\\/api\\/v1\\/atoms\\/[^\\/]+$/) && (method === \"PATCH\" || method === \"POST\") && !pathname.includes(\"/blocks\") && !pathname.includes(\"/bonds\")) {\n const atomId = pathname.replace(\"/api/v1/atoms/\", \"\");\n const { parent_id, title, summary, tags, status, auto_path, path_overridden } = body as { parent_id?: string | null; title?: string; summary?: string; tags?: string[]; status?: string; auto_path?: string; path_overridden?: boolean };\n if (!assistant || !store.can(assistant.role, \"update\", atomId, assistant.id)) {\n json(res, 403, { error: \"permission_denied\" }); return true; }\n if (parent_id !== undefined) {\n const updated = store.updateAtomParent(atomId, parent_id ?? null, assistant.id);\n if (!updated) { json(res, 400, { error: \"invalid_parent\" }); return true; }\n json(res, 200, { atom: serializeAtom(store, updated) });\n return true;\n }\n try {\n const updated = store.updateAtom(atomId, { title, summary, tags, status, auto_path, path_overridden }, assistant.id);\n if (!updated) { json(res, 404, { error: \"atom_not_found\" }); return true; }\n json(res, 200, { atom: serializeAtom(store, updated) });\n } catch (err: any) {\n json(res, 400, { error: err.message });\n }\n return true;\n }\n\n if (pathname.match(/^\\/api\\/v1\\/atoms\\/[^\\/]+$/) && method === \"DELETE\" && !pathname.includes(\"/blocks\") && !pathname.includes(\"/bonds\") && !pathname.includes(\"/checkout\")) {\n const atomId = pathname.replace(\"/api/v1/atoms/\", \"\");\n if (!assistant || !store.can(assistant.role, \"delete\", atomId, assistant.id)) {\n json(res, 403, { error: \"permission_denied\" }); return true; }\n const ok = store.deleteAtom(atomId, assistant.id);\n json(res, ok ? 200 : 404, { success: ok });\n return true;\n }\n\n // Checkout\n if (pathname.match(/^\\/api\\/v1\\/atoms\\/[^\\/]+\\/checkout$/) && method === \"POST\") {\n const atomId = pathname.replace(\"/api/v1/atoms/\", \"\").replace(\"/checkout\", \"\");\n const { mode, reason } = body as { mode: any; reason: string };\n if (!assistant || !store.can(assistant.role, \"lock\", atomId, assistant.id)) {\n json(res, 403, { error: \"permission_denied\" }); return true; }\n const result = store.checkout(atomId, assistant.id, mode || \"exclusive\", reason || \"\");\n json(res, result.success ? 200 : 423, result);\n return true;\n }\n\n if (pathname.match(/^\\/api\\/v1\\/atoms\\/[^\\/]+\\/checkout$/) && method === \"DELETE\") {\n const atomId = pathname.replace(\"/api/v1/atoms/\", \"\").replace(\"/checkout\", \"\");\n if (!assistant) { json(res, 403, { error: \"unauthorized\" }); return true; }\n const success = store.releaseCheckout(atomId, assistant.id);\n json(res, success ? 200 : 400, { success });\n return true;\n }\n\n // Queue\n if (pathname.match(/^\\/api\\/v1\\/atoms\\/[^\\/]+\\/queue$/) && method === \"GET\") {\n const atomId = pathname.replace(\"/api/v1/atoms/\", \"\").replace(\"/queue\", \"\");\n const status = store.getQueueStatus(atomId);\n json(res, status ? 200 : 404, status || { error: \"atom_not_found\" });\n return true;\n }\n\n const queueGrantMatch = pathname.match(/^\\/api\\/v1\\/atoms\\/([^\\/]+)\\/queue\\/([^\\/]+)\\/grant$/);\n if (queueGrantMatch && method === \"POST\") {\n const atomId = queueGrantMatch[1];\n const queueId = queueGrantMatch[2];\n const ok = store.grantQueueItem(atomId, queueId);\n json(res, ok ? 200 : 400, { success: ok });\n return true;\n }\n\n const queueRejectMatch = pathname.match(/^\\/api\\/v1\\/atoms\\/([^\\/]+)\\/queue\\/([^\\/]+)\\/reject$/);\n if (queueRejectMatch && method === \"POST\") {\n const atomId = queueRejectMatch[1];\n const queueId = queueRejectMatch[2];\n const ok = store.rejectQueueItem(atomId, queueId);\n json(res, ok ? 200 : 400, { success: ok });\n return true;\n }\n\n const queueBumpMatch = pathname.match(/^\\/api\\/v1\\/atoms\\/([^\\/]+)\\/queue\\/([^\\/]+)\\/bump$/);\n if (queueBumpMatch && method === \"POST\") {\n const atomId = queueBumpMatch[1];\n const queueId = queueBumpMatch[2];\n const ok = store.bumpQueueItem(atomId, queueId);\n json(res, ok ? 200 : 400, { success: ok });\n return true;\n }\n\n // Permissions\n if (pathname.match(/^\\/api\\/v1\\/atoms\\/[^\\/]+\\/permissions$/) && method === \"GET\") {\n const atomId = pathname.replace(\"/api/v1/atoms/\", \"\").replace(\"/permissions\", \"\");\n const perms = store.getAtomPermissions(atomId);\n json(res, 200, { atom_id: atomId, permissions: perms });\n return true;\n }\n\n if (pathname.match(/^\\/api\\/v1\\/atoms\\/[^\\/]+\\/permissions$/) && method === \"POST\") {\n const atomId = pathname.replace(\"/api/v1/atoms/\", \"\").replace(\"/permissions\", \"\");\n const { assistant_id, level } = body as { assistant_id: string; level: string };\n if (!assistant_id || !level) { json(res, 400, { error: \"assistant_id_and_level_required\" }); return true; }\n store.setAtomPermission(atomId, assistant_id, level as any, assistant?.id);\n json(res, 200, { success: true });\n return true;\n }\n\n if (pathname.match(/^\\/api\\/v1\\/atoms\\/[^\\/]+\\/permissions\\/[^\\/]+$/) && method === \"DELETE\") {\n const parts = pathname.replace(\"/api/v1/atoms/\", \"\").split(\"/\");\n const atomId = parts[0];\n const assistantId = parts[2];\n const ok = store.removeAtomPermission(atomId, assistantId);\n json(res, ok ? 200 : 404, { success: ok });\n return true;\n }\n\n // History\n if (pathname.match(/^\\/api\\/v1\\/atoms\\/[^\\/]+\\/history$/) && method === \"GET\") {\n const atomId = pathname.replace(\"/api/v1/atoms/\", \"\").replace(\"/history\", \"\");\n const history = store.getAtomHistory(atomId);\n json(res, 200, { atom_id: atomId, history });\n return true;\n }\n\n // Export\n if (pathname.match(/^\\/api\\/v1\\/atoms\\/[^\\/]+\\/export$/) && method === \"GET\") {\n const atomId = pathname.replace(\"/api/v1/atoms/\", \"\").replace(\"/export\", \"\");\n const format = searchParams.get(\"format\") || \"markdown\";\n const atom = store.getAtom(atomId);\n if (!atom) { json(res, 404, { error: \"atom_not_found\" }); return true; }\n if (format === \"markdown\") {\n const md = exportAtomMarkdown(store, atom);\n const safeName = (atom.title || \"memory\").replace(/[^a-z0-9\\-_]/gi, \"_\").toLowerCase();\n res.writeHead(200, { \"Content-Type\": \"text/markdown; charset=utf-8\", \"Content-Disposition\": `attachment; filename=\"${safeName}.md\"` });\n res.end(md);\n return true;\n }\n json(res, 400, { error: \"unsupported_format\" });\n return true;\n }\n\n // Force Release\n if (pathname.match(/^\\/api\\/v1\\/atoms\\/[^\\/]+\\/force-release$/) && method === \"POST\") {\n const atomId = pathname.replace(\"/api/v1/atoms/\", \"\").replace(\"/force-release\", \"\");\n const atom = store.getAtom(atomId);\n if (!atom) { json(res, 404, { error: \"atom_not_found\" }); return true; }\n if (!atom.locked_by) { json(res, 200, { success: true, note: \"not_locked\" }); return true; }\n const ok = store.forceRelease(atomId, assistant?.id || \"system\");\n json(res, ok ? 200 : 400, { success: ok });\n return true;\n }\n\n return false;\n}\n","import type { Store } from \"../../core/Store.js\";\nimport { json } from \"../utils.js\";\n\nexport function handleBonds(\n store: Store,\n pathname: string,\n method: string,\n res: import(\"http\").ServerResponse,\n body: any\n): boolean {\n if (pathname.match(/^\\/api\\/v1\\/atoms\\/[^\\/]+\\/bonds$/) && method === \"GET\") {\n const atomId = pathname.replace(\"/api/v1/atoms/\", \"\").replace(\"/bonds\", \"\");\n json(res, 200, store.getBondsByAtom(atomId));\n return true;\n }\n\n if (pathname.match(/^\\/api\\/v1\\/atoms\\/[^\\/]+\\/bonds$/) && method === \"POST\") {\n const atomId = pathname.replace(\"/api/v1/atoms/\", \"\").replace(\"/bonds\", \"\");\n const { target_id, label, color } = body as { target_id: string; label: string; color?: string };\n if (!target_id) { json(res, 400, { error: \"target_id_required\" }); return true; }\n const bond = store.createBond(atomId, target_id, label || \"connects\", color);\n json(res, 200, { bond });\n return true;\n }\n\n if (pathname === \"/api/v1/bonds\" && method === \"DELETE\") {\n const { bond_id } = body as { bond_id: string };\n const ok = store.deleteBond(bond_id);\n json(res, ok ? 200 : 404, { success: ok });\n return true;\n }\n\n if (pathname.match(/^\\/api\\/v1\\/bonds\\/[^\\/]+$/) && method === \"DELETE\") {\n const bondId = pathname.replace(\"/api/v1/bonds/\", \"\");\n const ok = store.deleteBond(bondId);\n json(res, ok ? 200 : 404, { success: ok });\n return true;\n }\n\n if (pathname.match(/^\\/api\\/v1\\/bonds\\/[^\\/]+$/) && method === \"PATCH\") {\n const bondId = pathname.replace(\"/api/v1/bonds/\", \"\");\n const { label, color } = body as { label?: string; color?: string };\n const updated = store.updateBond(bondId, { label, color });\n if (!updated) { json(res, 404, { error: \"bond_not_found\" }); return true; }\n json(res, 200, { bond: updated });\n return true;\n }\n\n return false;\n}\n","import type { Store } from \"../../core/Store.js\";\nimport type { Assistant } from \"../../core/types.js\";\nimport { json } from \"../utils.js\";\n\nexport function handleBlocks(\n store: Store,\n pathname: string,\n method: string,\n res: import(\"http\").ServerResponse,\n body: any,\n assistant?: Assistant\n): boolean {\n if (pathname.match(/^\\/api\\/v1\\/atoms\\/[^\\/]+\\/blocks$/) && method === \"POST\") {\n const atomId = pathname.replace(\"/api/v1/atoms/\", \"\").replace(\"/blocks\", \"\");\n const { type, content, tags } = body as { type: string; content: string; tags?: string[] };\n const isSuggestion = type === \"suggestion\";\n const requiredAction = isSuggestion ? \"suggest\" : \"write\";\n if (!assistant || !store.can(assistant.role, requiredAction as any, atomId, assistant.id)) {\n json(res, 403, { error: \"permission_denied\" }); return true;\n }\n const block = store.createBlock(atomId, type || \"text\", content || \"\", assistant.id, { tags });\n if (type === \"file\" || type === \"image\") {\n store.processFileBlock(atomId, content || \"\").catch(() => {});\n }\n json(res, 200, { block });\n return true;\n }\n\n if (pathname.match(/^\\/api\\/v1\\/blocks\\/[^\\/]+$/) && method === \"GET\") {\n const blockId = pathname.replace(\"/api/v1/blocks/\", \"\");\n const block = store.getBlock(blockId);\n if (!block) { json(res, 404, { error: \"block_not_found\" }); return true; }\n json(res, 200, { block });\n return true;\n }\n\n if (pathname.match(/^\\/api\\/v1\\/blocks\\/[^\\/]+$/) && method === \"PATCH\") {\n const blockId = pathname.replace(\"/api/v1/blocks/\", \"\");\n const { content, type, metadata } = body as { content?: string; type?: string; metadata?: any };\n const block = store.getBlock(blockId);\n if (!block) { json(res, 404, { error: \"block_not_found\" }); return true; }\n if (content !== undefined) {\n store.updateBlock(blockId, content, assistant?.id || \"system\");\n }\n if (type !== undefined || metadata !== undefined) {\n const updates: string[] = [];\n const vals: any[] = [];\n if (type !== undefined) { updates.push(\"type = ?\"); vals.push(type); }\n if (metadata !== undefined) { updates.push(\"metadata = ?\"); vals.push(JSON.stringify(metadata)); }\n vals.push(blockId);\n store[\"stmt\"](`UPDATE blocks SET ${updates.join(\", \")} WHERE id = ?`).run(...vals);\n }\n json(res, 200, { block: store.getBlock(blockId) });\n return true;\n }\n\n if (pathname.match(/^\\/api\\/v1\\/blocks\\/[^\\/]+$/) && method === \"DELETE\") {\n const blockId = pathname.replace(\"/api/v1/blocks/\", \"\");\n const block = store.getBlock(blockId);\n if (!block) { json(res, 404, { error: \"block_not_found\" }); return true; }\n const ok = store.deleteBlock(blockId, assistant?.id || \"system\");\n json(res, ok ? 200 : 400, { success: ok });\n return true;\n }\n\n return false;\n}\n","import type { Store } from \"../../core/Store.js\";\nimport { json, resolveProjectId } from \"../utils.js\";\n\nexport async function handleSearch(\n store: Store,\n pathname: string,\n method: string,\n res: import(\"http\").ServerResponse,\n searchParams: URLSearchParams\n): Promise<boolean> {\n if (pathname === \"/api/v1/search\" && method === \"GET\") {\n const projectId = resolveProjectId(store, searchParams.get(\"project_id\") || \"\");\n const q = (searchParams.get(\"q\") || \"\").toLowerCase();\n const limit = parseInt(searchParams.get(\"limit\") || \"20\", 10);\n const semantic = searchParams.get(\"semantic\") === \"true\";\n if (!q) { json(res, 200, { results: [], count: 0 }); return true; }\n\n let results: any[] = [];\n\n if (semantic) {\n const { embedText } = await import(\"../../server/embedder.js\");\n const queryEmbedding = await embedText(q);\n if (queryEmbedding) {\n results = store.searchHybrid(projectId, q, queryEmbedding, limit);\n } else {\n results = store.search(projectId, q, limit);\n }\n } else {\n results = store.search(projectId, q, limit);\n }\n\n json(res, 200, { query: q, semantic, count: results.length, results });\n return true;\n }\n\n return false;\n}\n","/**\n * Content-Addressed Storage (CAS)\n * Files stored by SHA256 hash, sharded by first 2 hex chars.\n */\n\nimport { createHash } from \"crypto\";\nimport { mkdirSync, existsSync, writeFileSync, readFileSync } from \"fs\";\nimport { resolve, dirname } from \"path\";\nimport { CONFIG } from \"../config.js\";\n\nconst FILES_DIR = resolve(process.cwd(), CONFIG.storage.files_dir);\n\nfunction ensureDir(path: string): void {\n if (!existsSync(path)) mkdirSync(path, { recursive: true });\n}\n\nfunction hashPath(hash: string): string {\n return resolve(FILES_DIR, hash.slice(0, 2), hash.slice(2));\n}\n\nexport function computeHash(buffer: Buffer): string {\n return createHash(\"sha256\").update(buffer).digest(\"hex\");\n}\n\nexport function saveFile(buffer: Buffer, _fileName: string): { hash: string; size: number; path: string } {\n const hash = computeHash(buffer);\n const dest = hashPath(hash);\n\n if (!existsSync(dest)) {\n ensureDir(dirname(dest));\n writeFileSync(dest, buffer);\n }\n\n return { hash, size: buffer.length, path: dest };\n}\n\nexport function getFile(hash: string): Buffer | null {\n try {\n return readFileSync(hashPath(hash));\n } catch {\n return null;\n }\n}\n\nexport function fileExists(hash: string): boolean {\n return existsSync(hashPath(hash));\n}\n","import type { Store } from \"../../core/Store.js\";\nimport { saveFile, getFile, computeHash } from \"../../server/files.js\";\nimport { json } from \"../utils.js\";\n\nexport function handleFiles(\n store: Store,\n pathname: string,\n method: string,\n req: import(\"http\").IncomingMessage,\n res: import(\"http\").ServerResponse,\n maxFileSizeMb: number\n): boolean | Promise<boolean> {\n if (pathname === \"/api/v1/files/upload\" && method === \"POST\") {\n const fileName = req.headers[\"x-file-name\"] as string || \"upload\";\n const mimeType = req.headers[\"content-type\"] || \"application/octet-stream\";\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n req.on(\"end\", () => {\n const buffer = Buffer.concat(chunks);\n const maxBytes = maxFileSizeMb * 1024 * 1024;\n if (buffer.length > maxBytes) {\n json(res, 413, { error: \"file_too_large\", max: `${maxFileSizeMb}MB` }); return;\n }\n const hash = computeHash(buffer);\n const existing = store.getAttachmentByHash(hash);\n if (existing) {\n json(res, 200, { success: true, hash, file_name: existing.file_name, size: existing.file_size, mime_type: existing.mime_type, dedup: true });\n return;\n }\n const saved = saveFile(buffer, fileName);\n const attachment = store.createAttachment(hash, fileName, saved.size, mimeType);\n json(res, 200, { success: true, hash, file_name: fileName, size: saved.size, mime_type: mimeType });\n });\n return true;\n }\n\n if (pathname.match(/^\\/api\\/v1\\/files\\/[^\\/]+$/) && method === \"GET\") {\n const hash = pathname.replace(\"/api/v1/files/\", \"\");\n const data = getFile(hash);\n if (!data) { json(res, 404, { error: \"file_not_found\" }); return true; }\n const attachment = store.getAttachmentByHash(hash);\n const mime = attachment?.mime_type || \"application/octet-stream\";\n res.writeHead(200, { \"Content-Type\": mime, \"Content-Length\": data.length });\n res.end(data);\n return true;\n }\n\n return false;\n}\n","/**\n * .mnemosyne Export Format\n * Creates a ZIP containing: nexus.db + files/ + manifest.json\n */\n\nimport AdmZip from \"adm-zip\";\nimport { createHash } from \"crypto\";\nimport { readFileSync, existsSync, readdirSync, statSync } from \"fs\";\nimport { resolve } from \"path\";\n\nconst DB_PATH = resolve(process.cwd(), \"data\", \"nexus.db\");\nconst FILES_DIR = resolve(process.cwd(), \"data\", \"files\");\n\nfunction sha256File(path: string): string {\n return createHash(\"sha256\").update(readFileSync(path)).digest(\"hex\");\n}\n\nfunction sha256Dir(dir: string): string {\n const hash = createHash(\"sha256\");\n function walk(p: string) {\n const stat = statSync(p);\n if (stat.isFile()) {\n hash.update(readFileSync(p));\n } else if (stat.isDirectory()) {\n for (const child of readdirSync(p).sort()) walk(resolve(p, child));\n }\n }\n walk(dir);\n return hash.digest(\"hex\");\n}\n\nexport function buildMnemosyneExport(projectId?: string, projectName?: string): Buffer {\n const zip = new AdmZip();\n\n // Add database\n zip.addLocalFile(DB_PATH, \"\", \"nexus.db\");\n\n // Add files directory\n if (existsSync(FILES_DIR)) {\n zip.addLocalFolder(FILES_DIR, \"files\");\n }\n\n // Build manifest\n const dbChecksum = sha256File(DB_PATH);\n const filesChecksum = existsSync(FILES_DIR) ? sha256Dir(FILES_DIR) : \"\";\n\n const manifest = {\n version: \"1.1\",\n app: \"Mnemosyne\",\n exported_at: new Date().toISOString(),\n project: projectId ? { id: projectId, name: projectName || \"\" } : null,\n checksums: { db: dbChecksum, files: filesChecksum },\n };\n\n zip.addFile(\"manifest.json\", Buffer.from(JSON.stringify(manifest, null, 2)));\n\n return zip.toBuffer();\n}\n\nexport function parseMnemosyneImport(zipBuffer: Buffer): { valid: boolean; error?: string; manifest?: any } {\n try {\n const zip = new AdmZip(zipBuffer);\n const manifestEntry = zip.getEntry(\"manifest.json\");\n if (!manifestEntry) return { valid: false, error: \"Missing manifest.json\" };\n\n const manifest = JSON.parse(manifestEntry.getData().toString(\"utf-8\"));\n if (manifest.version !== \"1.0\" && manifest.version !== \"1.1\") return { valid: false, error: `Unsupported version: ${manifest.version}` };\n if (!zip.getEntry(\"nexus.db\")) return { valid: false, error: \"Missing nexus.db\" };\n\n return { valid: true, manifest };\n } catch (err: any) {\n return { valid: false, error: err.message };\n }\n}\n","import type { Store } from \"../../core/Store.js\";\nimport type { Assistant } from \"../../core/types.js\";\nimport { buildMnemosyneExport, parseMnemosyneImport } from \"../../server/export-format.js\";\nimport { json, resolveProjectId, exportMarkdown } from \"../utils.js\";\n\nexport function handleExportImport(\n store: Store,\n pathname: string,\n method: string,\n req: import(\"http\").IncomingMessage,\n res: import(\"http\").ServerResponse,\n body: any,\n searchParams: URLSearchParams,\n assistant?: Assistant\n): boolean | Promise<boolean> {\n if (pathname === \"/api/v1/export\" && method === \"GET\") {\n const format = searchParams.get(\"format\") || \"mnemosyne\";\n const projectId = resolveProjectId(store, searchParams.get(\"project_id\") || \"\");\n\n if (format === \"markdown\") {\n const md = exportMarkdown(store, projectId);\n res.writeHead(200, { \"Content-Type\": \"text/markdown; charset=utf-8\", \"Content-Disposition\": \"attachment; filename=mnemosyne-export.md\" });\n res.end(md);\n return true;\n }\n\n if (format === \"mnemosyne\") {\n const project = projectId ? store.getProject(projectId) : undefined;\n const zipBuffer = buildMnemosyneExport(projectId, project?.name);\n res.writeHead(200, {\n \"Content-Type\": \"application/zip\",\n \"Content-Disposition\": `attachment; filename=\"${project?.name || \"mnemosyne\"}.mnemosyne\"`,\n \"Content-Length\": zipBuffer.length,\n });\n res.end(zipBuffer);\n return true;\n }\n\n if (!assistant || !store.can(assistant.role, \"export\", \"/system\")) {\n json(res, 403, { error: \"permission_denied\" }); return true;\n }\n const snapshot = store.exportSnapshot();\n json(res, 200, snapshot);\n return true;\n }\n\n if (pathname === \"/api/v1/import\" && method === \"POST\") {\n if (!assistant || !store.can(assistant.role, \"import\", \"/system\")) {\n json(res, 403, { error: \"permission_denied\" }); return true;\n }\n const format = searchParams.get(\"format\") || \"mnemosyne\";\n\n if (format === \"mnemosyne\") {\n const contentType = req.headers[\"content-type\"] || \"\";\n if (contentType.includes(\"application/zip\") || contentType.includes(\"multipart\") || contentType.includes(\"application/octet-stream\")) {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n req.on(\"end\", () => {\n const buffer = Buffer.concat(chunks);\n const parsed = parseMnemosyneImport(buffer);\n if (!parsed.valid) { json(res, 400, { success: false, error: parsed.error }); return; }\n const result = store.importMnemosyneZip(buffer, assistant.id);\n if (result.success) {\n json(res, 200, { success: true, atomsRestored: result.atomsRestored });\n } else {\n json(res, 400, { success: false, error: result.error });\n }\n });\n return true;\n }\n json(res, 400, { success: false, error: \"expected_zip_body\" });\n return true;\n }\n\n if (format === \"markdown\") {\n const projectId = resolveProjectId(store, searchParams.get(\"project_id\") || \"\");\n if (!projectId) { json(res, 400, { error: \"project_id_required\" }); return true; }\n const md = typeof body === \"string\" ? body : (body.content || \"\");\n const title = body.title || undefined;\n const result = store.importMarkdown(md, projectId, assistant.id, { title });\n if (result.success) {\n json(res, 200, { success: true, atomId: result.atomId, bondsCreated: result.bondsCreated });\n } else {\n json(res, 400, { success: false, error: result.error });\n }\n return true;\n }\n\n json(res, 400, { success: false, error: \"unsupported_import_format\" });\n return true;\n }\n\n return false;\n}\n","import type { Store } from \"../../core/Store.js\";\nimport { json } from \"../utils.js\";\n\nexport function handleEvents(\n store: Store,\n pathname: string,\n method: string,\n res: import(\"http\").ServerResponse,\n searchParams: URLSearchParams\n): boolean {\n if (pathname === \"/api/v1/events\" && method === \"GET\") {\n const since = parseInt(searchParams.get(\"since\") || \"0\", 10);\n const projectId = searchParams.get(\"project_id\") || undefined;\n const limit = parseInt(searchParams.get(\"limit\") || \"50\", 10);\n json(res, 200, { events: store.getEvents(since, projectId, limit) });\n return true;\n }\n\n if (pathname.match(/^\\/api\\/v1\\/atoms\\/[^\\/]+\\/events$/) && method === \"GET\") {\n const atomId = pathname.replace(\"/api/v1/atoms/\", \"\").replace(\"/events\", \"\");\n const limit = parseInt(searchParams.get(\"limit\") || \"50\", 10);\n json(res, 200, { events: store.getEventsByAtom(atomId, limit) });\n return true;\n }\n\n return false;\n}\n","import type { Store } from \"../../core/Store.js\";\nimport { json } from \"../utils.js\";\n\nconst PKG_VERSION = (() => {\n try {\n const pkg = JSON.parse(require(\"fs\").readFileSync(require(\"path\").resolve(__dirname, \"../../../package.json\"), \"utf-8\"));\n return pkg.version;\n } catch {\n return \"2.0.1\";\n }\n})();\n\nexport function handleHealth(\n store: Store,\n pathname: string,\n method: string,\n res: import(\"http\").ServerResponse\n): boolean {\n if ((pathname === \"/health\" || pathname === \"/api/v1/health\") && method === \"GET\") {\n const stats = store.getStats();\n json(res, 200, {\n status: \"ok\",\n version: PKG_VERSION,\n storage: \"sqlite\",\n database: store.config.database.path,\n uptime: process.uptime(),\n counts: stats,\n });\n return true;\n }\n\n return false;\n}\n","/**\n * Mnemosyne Core Types\n * Shared TypeScript interfaces and constants used across all modules.\n */\n\nexport const VALID_STATUSES = ['draft', 'review', 'approved', 'archived', 'deprecated', 'hot'];\n\nexport const ALLOWED_TRANSITIONS: Record<string, string[]> = {\n draft: ['review', 'archived', 'hot'],\n review: ['draft', 'approved', 'archived'],\n approved: ['review', 'deprecated', 'archived'],\n archived: ['draft'],\n deprecated: ['draft', 'archived'],\n hot: ['draft', 'review']\n};\n\nexport type PermissionLevel = \"none\" | \"view\" | \"suggest\" | \"edit\" | \"create\" | \"admin\";\n\nexport type Action =\n | \"create\" | \"read\" | \"write\" | \"update\" | \"delete\"\n | \"lock\" | \"manage_queue\" | \"force_release\"\n | \"peek\" | \"export\" | \"import\" | \"suggest\";\n\nexport type AssistantRole = \"owner\" | \"admin\" | \"manager\" | \"lead\" | \"developer\" | \"worker\" | \"reviewer\" | \"observer\" | \"bot\" | \"guest\";\n\nexport interface Project {\n id: string;\n name: string;\n description: string | null;\n icon: string;\n color: string;\n created_at: number;\n updated_at: number;\n owner: string;\n metadata: Record<string, any>;\n}\n\nexport interface Atom {\n id: string;\n project_id: string;\n parent_id: string | null;\n title: string;\n summary: string | null;\n icon: string;\n color: string | null;\n x: number | null;\n y: number | null;\n created_at: number;\n updated_at: number;\n version: number;\n locked_by: string | null;\n locked_at: number | null;\n locked_reason: string | null;\n owner: string;\n status: string;\n metadata: Record<string, any>;\n auto_path?: string;\n path_overridden?: boolean;\n status_updated_at?: number;\n block_count?: number;\n bond_count?: number;\n template_id?: string | null;\n embedding_status?: string | null;\n}\n\nexport interface Block {\n id: string;\n atom_id: string;\n type: string;\n content: string | null;\n order_index: number;\n created_at: number;\n updated_at: number;\n metadata: Record<string, any>;\n}\n\nexport interface Bond {\n id: string;\n source_id: string;\n target_id: string;\n label: string;\n color: string | null;\n created_at: number;\n}\n\nexport interface Assistant {\n id: string;\n name: string;\n role: AssistantRole;\n permissions: Record<string, any>;\n status: string;\n provider: string | null;\n connected_at: number;\n last_seen: number;\n metadata: Record<string, any>;\n}\n\nexport interface QueueEntry {\n id: string;\n atom_id: string;\n assistant_id: string;\n requested_at: number;\n priority: number;\n status: string;\n reason: string | null;\n}\n\nexport interface EventLogEntry {\n id: string;\n timestamp: number;\n event_type: string;\n project_id: string | null;\n atom_id: string | null;\n block_id: string | null;\n bond_id: string | null;\n actor: string;\n actor_type: string;\n diff: string | null;\n trigger: string | null;\n metadata: Record<string, any>;\n}\n\nexport interface Config {\n server: {\n port: number;\n host: string;\n version: string;\n };\n database: {\n path: string;\n wal_mode: boolean;\n vec_extension_path: string;\n };\n storage: {\n files_dir: string;\n max_file_size_mb: number;\n backups_dir: string;\n backup_interval_hours: number;\n max_backups: number;\n };\n limits: {\n max_atoms_per_project: number;\n rate_limit_requests: number;\n rate_limit_window_ms: number;\n };\n embeddings: {\n model: string;\n dimension: number;\n max_text_length: number;\n };\n features: {\n mcp_enabled: boolean;\n auto_index_enabled: boolean;\n file_processing_enabled: boolean;\n };\n index: {\n debounce_ms: number;\n };\n search: {\n semantic_weight: number;\n fts_weight: number;\n };\n bonds: {\n default_type: string;\n };\n}\n\nexport const TEMPLATES: Record<string, { name: string; blocks: { type: string; content: string }[] }> = {\n blank: { name: \"Blank\", blocks: [] },\n \"meeting-notes\": { name: \"Meeting Notes\", blocks: [\n { type: \"Attendees\", content: \"\" },\n { type: \"Agenda\", content: \"\" },\n { type: \"Notes\", content: \"\" },\n { type: \"Action Items\", content: \"\" }\n ]},\n \"decision-record\": { name: \"Decision Record\", blocks: [\n { type: \"Context\", content: \"\" },\n { type: \"Options\", content: \"\" },\n { type: \"Decision\", content: \"\" },\n { type: \"Consequences\", content: \"\" }\n ]},\n \"bug-report\": { name: \"Bug Report\", blocks: [\n { type: \"Repro Steps\", content: \"\" },\n { type: \"Expected\", content: \"\" },\n { type: \"Actual\", content: \"\" },\n { type: \"Environment\", content: \"\" }\n ]},\n \"api-design\": { name: \"API Design\", blocks: [\n { type: \"Endpoint\", content: \"\" },\n { type: \"Request\", content: \"\" },\n { type: \"Response\", content: \"\" },\n { type: \"Auth\", content: \"\" },\n { type: \"Errors\", content: \"\" }\n ]},\n persona: { name: \"Persona\", blocks: [\n { type: \"Name\", content: \"\" },\n { type: \"Role\", content: \"\" },\n { type: \"Goals\", content: \"\" },\n { type: \"Pain Points\", content: \"\" },\n { type: \"Quotes\", content: \"\" }\n ]},\n \"project-spec\": { name: \"Project Spec\", blocks: [\n { type: \"Overview\", content: \"\" },\n { type: \"Goals\", content: \"\" },\n { type: \"Non-Goals\", content: \"\" },\n { type: \"Timeline\", content: \"\" }\n ]},\n \"daily-journal\": { name: \"Daily Journal\", blocks: [\n { type: \"Date\", content: \"\" },\n { type: \"Wins\", content: \"\" },\n { type: \"Blockers\", content: \"\" },\n { type: \"Tomorrow\", content: \"\" }\n ]}\n};\n\nexport const ROLE_PERMISSIONS: Record<AssistantRole, { actions: Action[]; pattern: string }> = {\n owner: { actions: [\"create\",\"read\",\"write\",\"update\",\"delete\",\"lock\",\"manage_queue\",\"force_release\",\"peek\",\"export\",\"import\"], pattern: \"/**\" },\n admin: { actions: [\"create\",\"read\",\"write\",\"update\",\"delete\",\"lock\",\"manage_queue\",\"force_release\",\"peek\",\"export\",\"import\"], pattern: \"/**\" },\n manager: { actions: [\"create\",\"read\",\"write\",\"update\",\"delete\",\"lock\",\"manage_queue\",\"force_release\",\"peek\",\"export\",\"import\"], pattern: \"/**\" },\n lead: { actions: [\"create\",\"read\",\"write\",\"update\",\"delete\",\"lock\",\"manage_queue\",\"force_release\",\"peek\",\"export\"], pattern: \"/**\" },\n developer: { actions: [\"create\",\"read\",\"write\",\"update\",\"delete\",\"lock\",\"peek\",\"export\"], pattern: \"/**\" },\n worker: { actions: [\"read\",\"write\",\"lock\",\"peek\"], pattern: \"/**\" },\n reviewer: { actions: [\"read\",\"peek\",\"export\"], pattern: \"/**\" },\n observer: { actions: [\"read\",\"peek\"], pattern: \"/**\" },\n bot: { actions: [\"read\",\"write\",\"peek\"], pattern: \"/**\" },\n guest: { actions: [\"read\",\"peek\"], pattern: \"/**\" },\n};\n\nexport const PRIORITY = {\n IMMEDIATE: 0,\n HIGH: 1,\n NORMAL: 2,\n LOW: 3,\n SCHEDULED: 4,\n} as const;\n","import type { Store } from \"../../core/Store.js\";\nimport { TEMPLATES } from \"../../core/types.js\";\nimport { json, resolveProjectId } from \"../utils.js\";\n\nexport function handleTree(\n store: Store,\n pathname: string,\n method: string,\n res: import(\"http\").ServerResponse,\n searchParams: URLSearchParams\n): boolean {\n if (pathname === \"/api/v1/tree\" && method === \"GET\") {\n const projectId = resolveProjectId(store, searchParams.get(\"project_id\") || \"\");\n const graph = store.getGraph(projectId);\n json(res, 200, { project_id: projectId, ...graph });\n return true;\n }\n\n if (pathname === \"/api/v1/templates\" && method === \"GET\") {\n const templates = Object.entries(TEMPLATES).map(([id, t]) => ({ id, name: t.name }));\n json(res, 200, { templates });\n return true;\n }\n\n return false;\n}\n","/**\n * Mnemosyne API Router\n * Modular HTTP router combining all domain routes.\n */\n\nimport type { Store } from \"../core/Store.js\";\nimport { McpServer, McpHttpTransport } from \"../server/mcp.js\";\nimport { RateLimiter, setCorsHeaders, authenticate } from \"./middleware.js\";\nimport { readBody, json } from \"./utils.js\";\nimport { handleAssistants } from \"./routes/assistants.js\";\nimport { handleProjects } from \"./routes/projects.js\";\nimport { handleAtoms } from \"./routes/atoms.js\";\nimport { handleBonds } from \"./routes/bonds.js\";\nimport { handleBlocks } from \"./routes/blocks.js\";\nimport { handleSearch } from \"./routes/search.js\";\nimport { handleFiles } from \"./routes/files.js\";\nimport { handleExportImport } from \"./routes/export-import.js\";\nimport { handleEvents } from \"./routes/events.js\";\nimport { handleHealth } from \"./routes/health.js\";\nimport { handleTree } from \"./routes/tree.js\";\n\nexport class ApiRouter {\n private store: Store;\n private rateLimiter: RateLimiter;\n private mcpServer: McpServer;\n private mcpTransport: McpHttpTransport;\n\n constructor(store: Store) {\n this.store = store;\n this.rateLimiter = new RateLimiter(\n store.config.limits.rate_limit_requests,\n store.config.limits.rate_limit_window_ms\n );\n this.mcpServer = new McpServer(store);\n this.mcpTransport = new McpHttpTransport(this.mcpServer);\n }\n\n async handle(req: import(\"http\").IncomingMessage, res: import(\"http\").ServerResponse): Promise<void> {\n const url = new URL(req.url || \"/\", `http://${req.headers.host}`);\n const pathname = url.pathname;\n const method = req.method || \"GET\";\n\n setCorsHeaders(res);\n if (method === \"OPTIONS\") { res.writeHead(204); res.end(); return; }\n\n try {\n const assistant = authenticate(this.store, req);\n const token = req.headers.authorization?.replace(\"Bearer \", \"\");\n\n if (token && !this.rateLimiter.check(token)) {\n json(res, 429, { error: \"rate_limit\" }); return;\n }\n\n // File upload (raw body)\n const filesResult = handleFiles(this.store, pathname, method, req, res, this.store.config.storage.max_file_size_mb);\n if (filesResult === true) return;\n\n const body = method !== \"GET\" && method !== \"DELETE\" ? await readBody(req) : {};\n\n // MCP\n if (pathname === \"/mcp/manifest\" && method === \"GET\") {\n json(res, 200, this.mcpServer.getManifest()); return;\n }\n if (pathname === \"/mcp/sse\" && method === \"GET\") {\n this.mcpTransport.handleSse(req, res); return;\n }\n if (pathname === \"/mcp/messages\" && method === \"POST\") {\n this.mcpTransport.handleMessage(req, res, body); return;\n }\n\n // Domain routes\n if (handleAssistants(this.store, pathname, method, res, body)) return;\n if (handleProjects(this.store, pathname, method, res, body, url.searchParams)) return;\n if (handleAtoms(this.store, pathname, method, res, body, url.searchParams, assistant)) return;\n if (handleBonds(this.store, pathname, method, res, body)) return;\n if (handleBlocks(this.store, pathname, method, res, body, assistant)) return;\n if (await handleSearch(this.store, pathname, method, res, url.searchParams)) return;\n if (handleExportImport(this.store, pathname, method, req, res, body, url.searchParams, assistant)) return;\n if (handleEvents(this.store, pathname, method, res, url.searchParams)) return;\n if (handleTree(this.store, pathname, method, res, url.searchParams)) return;\n if (handleHealth(this.store, pathname, method, res)) return;\n\n json(res, 404, { error: \"not_found\", path: pathname, method });\n } catch (err: any) {\n json(res, 500, { error: err.message });\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,SAAS,WAAW,GAAgB;AAClC,QAAM,UAAU,EAAE,KAAK;AACvB,MAAI,YAAY,OAAQ,QAAO;AAC/B,MAAI,YAAY,QAAS,QAAO;AAChC,MAAI,YAAY,UAAU,YAAY,IAAK,QAAO;AAClD,MAAI,UAAU,KAAK,OAAO,EAAG,QAAO,SAAS,SAAS,EAAE;AACxD,MAAI,eAAe,KAAK,OAAO,EAAG,QAAO,WAAW,OAAO;AAC3D,MAAK,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG,KAAO,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG,GAAI;AAC5G,WAAO,QAAQ,MAAM,GAAG,EAAE;AAAA,EAC5B;AACA,SAAO;AACT;AAEA,SAAS,UAAU,MAAmB;AACpC,QAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,QAAM,OAAY,CAAC;AACnB,QAAM,QAA0D,CAAC,EAAE,KAAK,MAAM,QAAQ,IAAI,SAAS,MAAM,CAAC;AAE1G,aAAW,WAAW,OAAO;AAC3B,UAAM,aAAa,QAAQ,QAAQ,GAAG;AACtC,UAAM,OAAO,cAAc,IAAI,QAAQ,MAAM,GAAG,UAAU,IAAI;AAC9D,QAAI,CAAC,KAAK,KAAK,EAAG;AAElB,UAAM,SAAS,KAAK,SAAS,KAAK,UAAU,EAAE;AAC9C,UAAM,UAAU,KAAK,KAAK;AAE1B,WAAO,MAAM,SAAS,KAAK,MAAM,MAAM,SAAS,CAAC,EAAE,UAAU,QAAQ;AACnE,YAAM,IAAI;AAAA,IACZ;AAEA,UAAM,SAAS,MAAM,MAAM,SAAS,CAAC;AAErC,QAAI,QAAQ,WAAW,IAAI,GAAG;AAC5B,YAAMA,YAAW,QAAQ,MAAM,CAAC,EAAE,KAAK;AACvC,UAAI,CAAC,OAAO,SAAS;AAAA,MAErB;AACA,UAAI,SAAgB,OAAO;AAC3B,UAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAE1B,iBAAS,CAAC;AAAA,MACZ;AACA,UAAIA,UAAS,SAAS,GAAG,GAAG;AAC1B,cAAM,OAAY,CAAC;AACnB,cAAMC,YAAWD,UAAS,QAAQ,GAAG;AACrC,cAAM,IAAIA,UAAS,MAAM,GAAGC,SAAQ,EAAE,KAAK;AAC3C,cAAM,IAAID,UAAS,MAAMC,YAAW,CAAC,EAAE,KAAK;AAC5C,aAAK,CAAC,IAAI,WAAW,CAAC;AACtB,eAAO,KAAK,IAAI;AAAA,MAClB,OAAO;AACL,eAAO,KAAK,WAAWD,SAAQ,CAAC;AAAA,MAClC;AACA;AAAA,IACF;AAEA,UAAM,WAAW,QAAQ,QAAQ,GAAG;AACpC,QAAI,aAAa,GAAI;AAErB,UAAM,MAAM,QAAQ,MAAM,GAAG,QAAQ,EAAE,KAAK;AAC5C,UAAM,WAAW,QAAQ,MAAM,WAAW,CAAC,EAAE,KAAK;AAElD,QAAI,CAAC,UAAU;AACb,YAAM,SAAc,CAAC;AACrB,aAAO,IAAI,GAAG,IAAI;AAClB,YAAM,KAAK,EAAE,KAAK,QAAQ,QAAQ,SAAS,MAAM,CAAC;AAAA,IACpD,OAAO;AACL,aAAO,IAAI,GAAG,IAAI,WAAW,QAAQ;AAAA,IACvC;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,aAAqB;AAC5B,QAAM,iBAAa,qBAAQ,QAAQ,IAAI,GAAG,aAAa;AACvD,MAAI,KAAC,sBAAW,UAAU,GAAG;AAC3B,YAAQ,KAAK,gDAAgD;AAC7D,WAAO,cAAc;AAAA,EACvB;AACA,MAAI;AACF,UAAM,UAAM,wBAAa,YAAY,OAAO;AAC5C,UAAM,SAAS,UAAU,GAAG;AAC5B,WAAO,UAAU,cAAc,GAAG,MAAM;AAAA,EAC1C,SAAS,KAAU;AACjB,YAAQ,MAAM,yCAAyC,IAAI,OAAO;AAClE,WAAO,cAAc;AAAA,EACvB;AACF;AAEA,SAAS,aAAqB;AAC5B,MAAI;AACF,UAAM,MAAM,KAAK,UAAM,4BAAa,qBAAQ,WAAW,iBAAiB,GAAG,OAAO,CAAC;AACnF,WAAO,IAAI;AAAA,EACb,QAAQ;AACN,QAAI;AACF,YAAM,MAAM,KAAK,UAAM,4BAAa,qBAAQ,QAAQ,IAAI,GAAG,cAAc,GAAG,OAAO,CAAC;AACpF,aAAO,IAAI;AAAA,IACb,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,SAAS,gBAAwB;AAC/B,SAAO;AAAA,IACL,QAAQ,EAAE,MAAM,MAAM,MAAM,aAAa,SAAS,WAAW,EAAE;AAAA,IAC/D,UAAU,EAAE,MAAM,iBAAiB,UAAU,MAAM,oBAAoB,YAAY;AAAA,IACnF,SAAS,EAAE,WAAW,cAAc,kBAAkB,IAAI,aAAa,gBAAgB,uBAAuB,IAAI,aAAa,EAAE;AAAA,IACjI,QAAQ,EAAE,uBAAuB,KAAO,qBAAqB,KAAK,sBAAsB,IAAM;AAAA,IAC9F,YAAY,EAAE,OAAO,2BAA2B,WAAW,KAAK,iBAAiB,IAAM;AAAA,IACvF,UAAU,EAAE,aAAa,MAAM,oBAAoB,MAAM,yBAAyB,KAAK;AAAA,IACvF,OAAO,EAAE,aAAa,IAAM;AAAA,IAC5B,QAAQ,EAAE,iBAAiB,KAAK,YAAY,IAAI;AAAA,IAChD,OAAO,EAAE,cAAc,UAAU;AAAA,EACnC;AACF;AAEA,SAAS,UAAU,QAAa,QAAkB;AAChD,MAAI,CAAC,UAAU,OAAO,WAAW,SAAU,QAAO;AAClD,QAAM,SAAS,EAAE,GAAG,OAAO;AAC3B,aAAW,OAAO,OAAO,KAAK,MAAM,GAAG;AACrC,QAAI,OAAO,GAAG,KAAK,OAAO,OAAO,GAAG,MAAM,YAAY,CAAC,MAAM,QAAQ,OAAO,GAAG,CAAC,GAAG;AACjF,aAAO,GAAG,IAAI,UAAU,OAAO,GAAG,KAAK,CAAC,GAAG,OAAO,GAAG,CAAC;AAAA,IACxD,OAAO;AACL,aAAO,GAAG,IAAI,OAAO,GAAG;AAAA,IAC1B;AAAA,EACF;AACA,SAAO;AACT;AAxIA,IAKA,WACA,aAkLa;AAxLb;AAAA;AAAA;AAKA,gBAAyC;AACzC,kBAAwB;AAkLjB,IAAM,SAAiB,WAAW;AAAA;AAAA;;;ACxLzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAcA,eAAe,eAA0D;AACvE,MAAI,UAAW,QAAO;AACtB,MAAI,UAAW,QAAO;AACtB,MAAI,SAAS;AAEX,WAAO,QAAS,OAAM,IAAI,QAAQ,OAAK,WAAW,GAAG,GAAG,CAAC;AACzD,WAAO;AAAA,EACT;AAEA,YAAU;AACV,MAAI;AAEF,gBAAY,UAAM,8BAAS,sBAAsB,OAAO,WAAW,OAAO;AAAA,MACxE,WAAW;AAAA;AAAA,IACb,CAAC;AACD,YAAQ,IAAI,4BAA4B,OAAO,WAAW,KAAK,EAAE;AACjE,WAAO;AAAA,EACT,SAAS,KAAU;AACjB,gBAAY;AACZ,YAAQ,MAAM,oCAAoC,IAAI,OAAO;AAC7D,WAAO;AAAA,EACT,UAAE;AACA,cAAU;AAAA,EACZ;AACF;AAMA,eAAsB,UAAU,MAAwC;AACtE,QAAM,MAAM,MAAM,aAAa;AAC/B,MAAI,CAAC,IAAK,QAAO;AAGjB,QAAM,YAAY,KAAK,MAAM,GAAG,OAAO,WAAW,eAAe;AACjE,MAAI,CAAC,UAAU,KAAK,EAAG,QAAO;AAE9B,MAAI;AACF,UAAM,SAAS,MAAM,IAAI,WAAW,EAAE,SAAS,QAAQ,WAAW,KAAK,CAAC;AAExE,WAAO,MAAM,KAAK,OAAO,IAAoB;AAAA,EAC/C,SAAS,KAAU;AACjB,YAAQ,MAAM,gCAAgC,IAAI,OAAO;AACzD,WAAO;AAAA,EACT;AACF;AAKA,eAAsB,WAAW,OAA+C;AAC9E,QAAM,MAAM,MAAM,aAAa;AAC/B,MAAI,CAAC,IAAK,QAAO,MAAM,IAAI,MAAM,IAAI;AAErC,QAAM,UAA+B,CAAC;AACtC,aAAW,QAAQ,OAAO;AACxB,UAAM,YAAY,KAAK,MAAM,GAAG,OAAO,WAAW,eAAe;AACjE,QAAI,CAAC,UAAU,KAAK,GAAG;AACrB,cAAQ,KAAK,IAAI;AACjB;AAAA,IACF;AACA,QAAI;AACF,YAAM,SAAS,MAAM,IAAI,WAAW,EAAE,SAAS,QAAQ,WAAW,KAAK,CAAC;AACxE,cAAQ,KAAK,MAAM,KAAK,OAAO,IAAoB,CAAC;AAAA,IACtD,QAAQ;AACN,cAAQ,KAAK,IAAI;AAAA,IACnB;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,UAAmB;AACjC,SAAO,cAAc;AACvB;AAxFA,IAOA,qBAGI,WACA,SACA;AAZJ;AAAA;AAAA;AAOA,0BAAyD;AACzD;AAEA,IAAI,YAA8C;AAClD,IAAI,UAAU;AACd,IAAI,YAA0B;AAAA;AAAA;;;ACZ9B;AAAA;AAAA;AAAA;AAAA;;;ACQO,IAAM,QAAmB;AAAA,EAC9B;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa,EAAE,MAAM,UAAU,YAAY,CAAC,EAAE;AAAA,IAC9C,SAAS,CAAC,OAAO,UAAU;AACzB,aAAO,EAAE,UAAU,MAAM,YAAY,EAAE,IAAI,QAAM,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE,MAAM,aAAa,EAAE,aAAa,WAAW,MAAM,kBAAkB,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE;AAAA,IAC7J;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,OAAO,EAAE,MAAM,UAAU,aAAa,eAAe;AAAA,QACrD,SAAS,EAAE,MAAM,UAAU,aAAa,gCAAgC;AAAA,QACxE,OAAO,EAAE,MAAM,UAAU,aAAa,2BAA2B;AAAA,MACnE;AAAA,MACA,UAAU,CAAC,OAAO;AAAA,IACpB;AAAA,IACA,SAAS,CAAC,MAAM,UAAU;AACxB,YAAM,YAAY,KAAK,UAAU,MAAM,iBAAiB,KAAK,OAAO,GAAG,MAAM,KAAK,UAAU;AAC5F,YAAM,UAAU,MAAM,OAAO,WAAW,KAAK,OAAO,KAAK,SAAS,EAAE;AACpE,aAAO,EAAE,OAAO,KAAK,OAAO,OAAO,QAAQ,QAAQ,QAAQ;AAAA,IAC7D;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,IAAI,EAAE,MAAM,UAAU,aAAa,YAAY;AAAA,QAC/C,OAAO,EAAE,MAAM,UAAU,aAAa,iCAAiC;AAAA,QACvE,SAAS,EAAE,MAAM,UAAU,aAAa,gDAAgD;AAAA,MAC1F;AAAA,MACA,UAAU,CAAC;AAAA,IACb;AAAA,IACA,SAAS,CAAC,MAAM,UAAU;AACxB,UAAI,OAAO,KAAK,KAAK,MAAM,QAAQ,KAAK,EAAE,IAAI;AAC9C,UAAI,CAAC,QAAQ,KAAK,SAAS,KAAK,SAAS;AACvC,cAAM,YAAY,MAAM,iBAAiB,KAAK,OAAO,GAAG,MAAM,KAAK;AACnE,eAAO,MAAM,kBAAkB,SAAS,EAAE,KAAK,OAAK,EAAE,UAAU,KAAK,KAAK;AAAA,MAC5E;AACA,UAAI,CAAC,KAAM,OAAM,IAAI,MAAM,gBAAgB;AAC3C,YAAM,WAAW,MAAM,gBAAgB,KAAK,EAAE,EAAE,IAAI,QAAM,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,OAAO,MAAM,EAAE,UAAU,QAAQ,OAAO,EAAE;AACzH,YAAM,SAAS,MAAM,gBAAgB,KAAK,EAAE;AAC5C,YAAM,QAAQ,MAAM,eAAe,KAAK,EAAE;AAC1C,aAAO,EAAE,MAAM,UAAU,QAAQ,MAAM;AAAA,IACzC;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,SAAS,EAAE,MAAM,UAAU,aAAa,qBAAqB;AAAA,QAC7D,OAAO,EAAE,MAAM,UAAU,aAAa,kBAAkB;AAAA,QACxD,MAAM,EAAE,MAAM,UAAU,aAAa,kDAAkD;AAAA,QACvF,WAAW,EAAE,MAAM,UAAU,aAAa,4BAA4B;AAAA,QACtE,MAAM,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,SAAS,GAAG,aAAa,kBAAkB;AAAA,QACjF,cAAc,EAAE,MAAM,UAAU,aAAa,uBAAuB;AAAA,MACtE;AAAA,MACA,UAAU,CAAC,WAAW,OAAO;AAAA,IAC/B;AAAA,IACA,SAAS,CAAC,MAAM,UAAU;AACxB,YAAM,UAAU,MAAM,iBAAiB,KAAK,OAAO,KAAK,MAAM,WAAW,KAAK,OAAO;AACrF,UAAI,CAAC,QAAS,OAAM,IAAI,MAAM,mBAAmB;AACjD,YAAM,cAAc,KAAK,gBAAgB;AACzC,YAAM,OAAO,MAAM,WAAW,QAAQ,IAAI,KAAK,OAAO,KAAK,QAAQ,QAAQ,aAAa;AAAA,QACtF,UAAU,KAAK;AAAA,QACf,MAAM,KAAK;AAAA,MACb,CAAC;AACD,aAAO,EAAE,SAAS,MAAM,KAAK;AAAA,IAC/B;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,IAAI,EAAE,MAAM,UAAU,aAAa,YAAY;AAAA,QAC/C,OAAO,EAAE,MAAM,UAAU,aAAa,YAAY;AAAA,QAClD,WAAW,EAAE,MAAM,CAAC,UAAU,MAAM,GAAG,aAAa,iCAAiC;AAAA,QACrF,cAAc,EAAE,MAAM,UAAU,aAAa,uBAAuB;AAAA,MACtE;AAAA,MACA,UAAU,CAAC,IAAI;AAAA,IACjB;AAAA,IACA,SAAS,CAAC,MAAM,UAAU;AACxB,YAAM,cAAc,KAAK,gBAAgB;AACzC,UAAI,KAAK,cAAc,QAAW;AAChC,cAAME,WAAU,MAAM,iBAAiB,KAAK,IAAI,KAAK,WAAW,WAAW;AAC3E,YAAI,CAACA,SAAS,OAAM,IAAI,MAAM,kCAAkC;AAAA,MAClE;AACA,YAAM,UAAU,MAAM,WAAW,KAAK,IAAI,EAAE,OAAO,KAAK,MAAM,GAAG,WAAW;AAC5E,aAAO,EAAE,SAAS,MAAM,MAAM,WAAW,MAAM,QAAQ,KAAK,EAAE,EAAE;AAAA,IAClE;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,WAAW,EAAE,MAAM,UAAU,aAAa,iBAAiB;AAAA,QAC3D,WAAW,EAAE,MAAM,UAAU,aAAa,iBAAiB;AAAA,QAC3D,OAAO,EAAE,MAAM,UAAU,aAAa,iCAAiC;AAAA,QACvE,OAAO,EAAE,MAAM,UAAU,aAAa,uBAAuB;AAAA,MAC/D;AAAA,MACA,UAAU,CAAC,aAAa,WAAW;AAAA,IACrC;AAAA,IACA,SAAS,CAAC,MAAM,UAAU;AACxB,YAAM,OAAO,MAAM,WAAW,KAAK,WAAW,KAAK,WAAW,KAAK,SAAS,YAAY,KAAK,KAAK;AAClG,aAAO,EAAE,SAAS,MAAM,KAAK;AAAA,IAC/B;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,SAAS,EAAE,MAAM,UAAU,aAAa,YAAY;AAAA,QACpD,cAAc,EAAE,MAAM,UAAU,aAAa,gCAAgC;AAAA,QAC7E,QAAQ,EAAE,MAAM,UAAU,aAAa,sBAAsB;AAAA,MAC/D;AAAA,MACA,UAAU,CAAC,WAAW,cAAc;AAAA,IACtC;AAAA,IACA,SAAS,CAAC,MAAM,UAAU;AACxB,YAAM,SAAS,MAAM,SAAS,KAAK,SAAS,KAAK,cAAc,aAAa,KAAK,UAAU,EAAE;AAC7F,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,SAAS,EAAE,MAAM,UAAU,aAAa,YAAY;AAAA,QACpD,cAAc,EAAE,MAAM,UAAU,aAAa,+BAA+B;AAAA,MAC9E;AAAA,MACA,UAAU,CAAC,WAAW,cAAc;AAAA,IACtC;AAAA,IACA,SAAS,CAAC,MAAM,UAAU;AACxB,YAAM,UAAU,MAAM,gBAAgB,KAAK,SAAS,KAAK,YAAY;AACrE,aAAO,EAAE,QAAQ;AAAA,IACnB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,SAAS,EAAE,MAAM,UAAU,aAAa,4BAA4B;AAAA,MACtE;AAAA,MACA,UAAU,CAAC,SAAS;AAAA,IACtB;AAAA,IACA,SAAS,CAAC,MAAM,WAAW;AACzB,aAAO,EAAE,SAAS,MAAM,YAAY,0BAA0B,SAAS,KAAK,SAAS,SAAS,uEAAuE;AAAA,IACvK;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,YAAY;AAAA,UACV,MAAM;AAAA,UACN,OAAO;AAAA,YACL,MAAM;AAAA,YACN,YAAY;AAAA,cACV,MAAM,EAAE,MAAM,UAAU,aAAa,oBAAoB;AAAA,cACzD,QAAQ,EAAE,MAAM,UAAU,aAAa,0BAA0B;AAAA,YACnE;AAAA,YACA,UAAU,CAAC,MAAM;AAAA,UACnB;AAAA,UACA,aAAa;AAAA,QACf;AAAA,QACA,eAAe,EAAE,MAAM,WAAW,aAAa,gDAAgD,SAAS,MAAM;AAAA,MAChH;AAAA,MACA,UAAU,CAAC,YAAY;AAAA,IACzB;AAAA,IACA,SAAS,CAAC,MAAM,UAAU;AACxB,YAAM,aAAa,KAAK,cAAc,CAAC;AACvC,YAAM,cAAc,KAAK,iBAAiB;AAC1C,YAAM,UAAiB,CAAC;AACxB,YAAM,UAAU,oBAAI,IAAqB;AACzC,iBAAW,KAAK,MAAO,SAAQ,IAAI,EAAE,MAAM,CAAC;AAE5C,eAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,cAAM,KAAK,WAAW,CAAC;AACvB,cAAM,OAAO,QAAQ,IAAI,GAAG,IAAI;AAChC,YAAI,CAAC,MAAM;AACT,kBAAQ,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,OAAO,mBAAmB,GAAG,IAAI,GAAG,CAAC;AAC7E,cAAI,YAAa;AACjB;AAAA,QACF;AACA,YAAI;AACF,gBAAM,SAAS,KAAK,QAAQ,GAAG,UAAU,CAAC,GAAG,KAAK;AAClD,kBAAQ,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,SAAS,MAAM,OAAO,CAAC;AAAA,QACjE,SAAS,KAAU;AACjB,kBAAQ,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,OAAO,IAAI,QAAQ,CAAC;AAC5D,cAAI,YAAa;AAAA,QACnB;AAAA,MACF;AACA,aAAO,EAAE,OAAO,WAAW,QAAQ,WAAW,QAAQ,QAAQ,QAAQ;AAAA,IACxE;AAAA,EACF;AACF;;;ACrNO,IAAM,YAAN,MAAgB;AAAA,EACb;AAAA,EACA,UAAU,oBAAI,IAAqB;AAAA,EAE3C,YAAY,OAAc;AACxB,SAAK,QAAQ;AACb,eAAW,KAAK,MAAO,MAAK,QAAQ,IAAI,EAAE,MAAM,CAAC;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,KAA6C;AAEzD,QAAI,IAAI,OAAO,QAAQ,IAAI,OAAO,QAAW;AAC3C,aAAO;AAAA,IACT;AAEA,QAAI;AACF,cAAQ,IAAI,QAAQ;AAAA,QAClB,KAAK;AACH,iBAAO,KAAK,GAAG,IAAI,IAAI;AAAA,YACrB,iBAAiB;AAAA,YACjB,cAAc,EAAE,OAAO,CAAC,GAAG,WAAW,CAAC,GAAG,SAAS,CAAC,EAAE;AAAA,YACtD,YAAY,EAAE,MAAM,iBAAiB,SAAS,QAAQ;AAAA,UACxD,CAAC;AAAA,QAEH,KAAK;AACH,iBAAO,KAAK,GAAG,IAAI,IAAI;AAAA,YACrB,OAAO,MAAM,IAAI,QAAM,EAAE,MAAM,EAAE,MAAM,aAAa,EAAE,aAAa,aAAa,EAAE,YAAY,EAAE;AAAA,UAClG,CAAC;AAAA,QAEH,KAAK,cAAc;AACjB,gBAAM,EAAE,MAAM,WAAW,KAAK,IAAI,IAAI,UAAU,CAAC;AACjD,gBAAM,OAAO,KAAK,QAAQ,IAAI,IAAI;AAClC,cAAI,CAAC,KAAM,QAAO,KAAK,IAAI,IAAI,IAAI,QAAQ,mBAAmB,IAAI,EAAE;AACpE,gBAAM,SAAS,KAAK,QAAQ,QAAQ,CAAC,GAAG,KAAK,KAAK;AAClD,iBAAO,KAAK,GAAG,IAAI,IAAI,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;AAAA,QAC/F;AAAA,QAEA,KAAK;AACH,iBAAO,KAAK,GAAG,IAAI,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC;AAAA,QAE1C,KAAK;AACH,iBAAO,KAAK,GAAG,IAAI,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC;AAAA,QAExC;AACE,iBAAO,KAAK,IAAI,IAAI,IAAI,QAAQ,qBAAqB,IAAI,MAAM,EAAE;AAAA,MACrE;AAAA,IACF,SAAS,GAAQ;AACf,aAAO,KAAK,IAAI,IAAI,IAAI,QAAQ,EAAE,OAAO;AAAA,IAC3C;AAAA,EACF;AAAA,EAEA,cAAc;AACZ,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,MACT,aAAa;AAAA,MACb,UAAU;AAAA,MACV,WAAW,CAAC,SAAS,KAAK;AAAA,MAC1B,WAAW;AAAA,QACT,KAAK;AAAA,QACL,UAAU;AAAA,MACZ;AAAA,MACA,OAAO,MAAM,IAAI,QAAM,EAAE,MAAM,EAAE,MAAM,aAAa,EAAE,YAAY,EAAE;AAAA,IACtE;AAAA,EACF;AAAA,EAEQ,GAAG,IAA4B,QAA8B;AACnE,WAAO,EAAE,SAAS,OAAO,IAAI,OAAO;AAAA,EACtC;AAAA,EACQ,IAAI,IAA4B,MAAc,SAAkC;AACtF,WAAO,EAAE,SAAS,OAAO,IAAI,OAAO,EAAE,MAAM,QAAQ,EAAE;AAAA,EACxD;AACF;;;ACvEO,IAAM,kBAAN,MAAsB;AAAA,EACnB;AAAA,EACA,WAAW,oBAAI,IAAwB;AAAA,EACvC,iBAAiB;AAAA,EAEzB,YAAY,QAAmB;AAC7B,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,UAAU,KAAqC,KAA0C;AACvF,UAAM,KAAK,QAAQ,EAAE,KAAK,cAAc,IAAI,KAAK,IAAI,CAAC;AACtD,QAAI,UAAU,KAAK;AAAA,MACjB,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,MACjB,cAAc;AAAA,IAChB,CAAC;AACD,SAAK,SAAS,IAAI,IAAI,EAAE,IAAI,IAAI,CAAC;AAGjC,SAAK,QAAQ,IAAI,YAAY,8BAA8B,EAAE;AAE7D,QAAI,GAAG,SAAS,MAAM,KAAK,SAAS,OAAO,EAAE,CAAC;AAAA,EAChD;AAAA,EAEA,cAAc,KAAqC,KAAoC,MAAiB;AACtG,UAAM,MAAM,IAAI,IAAI,IAAI,OAAO,KAAK,UAAU,IAAI,QAAQ,IAAI,EAAE;AAChE,UAAM,YAAY,IAAI,aAAa,IAAI,YAAY,KAAK;AAExD,UAAM,UAAU;AAChB,QAAI,CAAC,WAAW,QAAQ,YAAY,OAAO;AACzC,UAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,UAAI,IAAI,KAAK,UAAU,EAAE,OAAO,kBAAkB,CAAC,CAAC;AACpD;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,OAAO,cAAc,OAAO;AAElD,QAAI,CAAC,UAAU;AACb,UAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,UAAI,IAAI,IAAI;AACZ;AAAA,IACF;AAEA,QAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,QAAI,IAAI,KAAK,UAAU,QAAQ,CAAC;AAGhC,QAAI,UAAW,MAAK,QAAQ,WAAW,WAAW,KAAK,UAAU,QAAQ,CAAC;AAAA,EAC5E;AAAA,EAEQ,QAAQ,WAAmB,OAAe,MAAoB;AACpE,UAAM,UAAU,KAAK,SAAS,IAAI,SAAS;AAC3C,QAAI,CAAC,QAAS;AACd,YAAQ,IAAI,MAAM,UAAU,KAAK;AAAA,QAAW,IAAI;AAAA;AAAA,CAAM;AAAA,EACxD;AACF;;;ACvDO,IAAM,cAAN,MAAkB;AAAA,EACf,QAAQ,oBAAI,IAAwB;AAAA,EACpC;AAAA,EACA;AAAA,EAER,YAAY,OAAe,UAAkB;AAC3C,SAAK,QAAQ;AACb,SAAK,WAAW;AAChB,gBAAY,MAAM,KAAK,QAAQ,GAAG,GAAK;AAAA,EACzC;AAAA,EAEA,MAAM,OAAwB;AAC5B,UAAM,MAAM,KAAK,IAAI;AACrB,QAAI,SAAS,KAAK,MAAM,IAAI,KAAK;AACjC,QAAI,CAAC,UAAU,OAAO,UAAU,KAAK;AACnC,eAAS,EAAE,OAAO,GAAG,SAAS,MAAM,KAAK,SAAS;AAClD,WAAK,MAAM,IAAI,OAAO,MAAM;AAAA,IAC9B;AACA,QAAI,OAAO,SAAS,KAAK,MAAO,QAAO;AACvC,WAAO;AACP,WAAO;AAAA,EACT;AAAA,EAEQ,UAAgB;AACtB,UAAM,MAAM,KAAK,IAAI;AACrB,eAAW,CAAC,KAAK,MAAM,KAAK,KAAK,MAAM,QAAQ,GAAG;AAChD,UAAI,OAAO,UAAU,IAAK,MAAK,MAAM,OAAO,GAAG;AAAA,IACjD;AAAA,EACF;AACF;AAEO,SAAS,eAAe,KAA0C;AACvE,MAAI,UAAU,+BAA+B,GAAG;AAChD,MAAI,UAAU,gCAAgC,mCAAmC;AACjF,MAAI,UAAU,gCAAgC,6BAA6B;AAC3E,MAAI,UAAU,iBAAiB,uDAAuD;AACtF,MAAI,UAAU,UAAU,UAAU;AAClC,MAAI,UAAU,WAAW,GAAG;AAC9B;AAEO,SAAS,aAAa,OAAc,KAA4D;AACrG,QAAM,QAAQ,IAAI,QAAQ,eAAe,QAAQ,WAAW,EAAE;AAC9D,SAAO,QAAQ,MAAM,aAAa,KAAK,IAAI;AAC7C;;;ACjDO,SAAS,KAAK,KAAoC,QAAgB,MAAiB;AACxF,MAAI,UAAU,QAAQ,EAAE,gBAAgB,mBAAmB,CAAC;AAC5D,MAAI,IAAI,KAAK,UAAU,IAAI,CAAC;AAC9B;AAEO,SAAS,SAAS,KAAmD;AAC1E,SAAO,IAAI,QAAQ,CAACC,aAAY;AAC9B,QAAI,OAAO;AACX,QAAI,GAAG,QAAQ,WAAS,QAAQ,KAAK;AACrC,QAAI,GAAG,OAAO,MAAM;AAAE,UAAI;AAAE,QAAAA,SAAQ,KAAK,MAAM,IAAI,CAAC;AAAA,MAAG,QAAQ;AAAE,QAAAA,SAAQ,CAAC,CAAC;AAAA,MAAG;AAAA,IAAE,CAAC;AAAA,EACnF,CAAC;AACH;AAEO,SAAS,iBAAiB,OAAc,UAA0B;AACvE,MAAI,CAAC,SAAU,QAAO;AACtB,MAAI,kEAAkE,KAAK,QAAQ,EAAG,QAAO;AAC7F,QAAM,IAAI,MAAM,iBAAiB,QAAQ;AACzC,SAAO,GAAG,MAAM;AAClB;AAEO,SAAS,cAAc,OAAc,MAAW,UAAU,OAAY;AAC3E,MAAI,SAAS;AACX,WAAO;AAAA,MACL,IAAI,KAAK;AAAA,MACT,OAAO,KAAK;AAAA,MACZ,MAAM,KAAK,UAAU,QAAQ;AAAA,MAC7B,QAAQ,KAAK;AAAA,IACf;AAAA,EACF;AACA,QAAM,aAAa,KAAK,eAAe,MAAM,gBAAgB,KAAK,EAAE,EAAE;AACtE,SAAO;AAAA,IACL,IAAI,KAAK;AAAA,IACT,YAAY,KAAK;AAAA,IACjB,WAAW,KAAK;AAAA,IAChB,OAAO,KAAK;AAAA,IACZ,SAAS,KAAK;AAAA,IACd,MAAM,KAAK,UAAU,QAAQ;AAAA,IAC7B,MAAM,KAAK;AAAA,IACX,OAAO,KAAK;AAAA,IACZ,UAAU,KAAK;AAAA,IACf,WAAW,KAAK;AAAA,IAChB,iBAAiB,KAAK;AAAA,IACtB,QAAQ,KAAK;AAAA,IACb,mBAAmB,KAAK;AAAA,IACxB,aAAa,KAAK;AAAA,IAClB,YAAY,KAAK;AAAA,IACjB,aAAa,KAAK;AAAA,IAClB,kBAAkB,KAAK;AAAA,IACvB,OAAO;AAAA,MACL,MAAM,KAAK,YAAY,EAAE,aAAa,KAAK,WAAW,QAAQ,KAAK,cAAc,IAAI;AAAA,MACrF,OAAO,CAAC;AAAA,MACR;AAAA,MACA,cAAc,KAAK;AAAA,IACrB;AAAA,EACF;AACF;AAEO,SAAS,WAAW,KAAU,QAAuB;AAC1D,QAAM,SAAc,CAAC;AACrB,aAAW,KAAK,QAAQ;AACtB,QAAI,EAAE,SAAS,GAAG,GAAG;AACnB,YAAM,CAAC,MAAM,GAAG,IAAI,IAAI,EAAE,MAAM,GAAG;AACnC,UAAI,IAAI,IAAI,KAAK,MAAM;AACrB,eAAO,IAAI,IAAI,OAAO,IAAI,MAAM,MAAM,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACjE,YAAI,MAAM,QAAQ,IAAI,IAAI,CAAC,GAAG;AAC5B,iBAAO,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,CAAC,SAAc,WAAW,MAAM,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC;AAAA,QAChF,OAAO;AACL,gBAAM,SAAS,WAAW,IAAI,IAAI,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC;AACrD,iBAAO,OAAO,OAAO,IAAI,GAAG,MAAM;AAAA,QACpC;AAAA,MACF;AAAA,IACF,WAAW,IAAI,CAAC,MAAM,QAAW;AAC/B,aAAO,CAAC,IAAI,IAAI,CAAC;AAAA,IACnB;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,mBAAmB,OAAc,MAAmB;AAClE,QAAM,SAAS,MAAM,gBAAgB,KAAK,EAAE,EAAE,KAAK,CAAC,GAAQ,OAAY,EAAE,eAAe,MAAM,EAAE,eAAe,EAAE;AAClH,QAAM,QAAQ,MAAM,eAAe,KAAK,EAAE;AAC1C,QAAM,SAAS,KAAK,YAAY,MAAM,QAAQ,KAAK,SAAS,IAAI;AAEhE,MAAI,KAAK;AAAA;AACT,QAAM,WAAW,KAAK,KAAK;AAAA;AAC3B,QAAM,SAAS,KAAK,QAAQ,QAAQ;AAAA;AACpC,QAAM,WAAW,KAAK,UAAU,OAAO;AAAA;AACvC,QAAM,SAAS,KAAK,aAAa,GAAG;AAAA;AACpC,MAAI,KAAK,QAAS,OAAM,aAAa,KAAK,OAAO;AAAA;AACjD,MAAI,KAAK,UAAU,MAAM,OAAQ,OAAM,UAAU,KAAK,SAAS,KAAK,IAAI,CAAC,MAAc,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA;AAC3G,MAAI,OAAQ,OAAM,YAAY,OAAO,KAAK;AAAA;AAC1C,QAAM,iBAAgB,oBAAI,KAAK,GAAE,YAAY,CAAC;AAAA;AAC9C,QAAM;AAAA;AAAA;AAEN,QAAM,KAAK,KAAK,KAAK;AAAA;AAAA;AACrB,MAAI,KAAK,QAAS,OAAM,GAAG,KAAK,OAAO;AAAA;AAAA;AAEvC,aAAW,KAAK,QAAQ;AACtB,UAAM,UAAU,EAAE,WAAW;AAC7B,QAAI,EAAE,SAAS,QAAQ;AACrB,UAAI;AAAE,cAAM,IAAI,KAAK,MAAM,OAAO;AAAG,cAAM,GAAG,EAAE,QAAQ,OAAO;AAAA;AAAA;AAAA,MAAQ,QAAQ;AAAE,cAAM,GAAG,OAAO;AAAA;AAAA;AAAA,MAAQ;AAAA,IAC3G,WAAW,EAAE,SAAS,QAAQ;AAC5B,YAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,YAAM,QAAQ,MAAM,CAAC,GAAG,KAAK,KAAK;AAClC,UAAI,OAAO;AACX,UAAI,OAAO;AACX,UAAI,MAAM,WAAW,KAAK,GAAG;AAAE,eAAO,MAAM,QAAQ,QAAQ,EAAE,EAAE,KAAK;AAAG,eAAO,MAAM,MAAM,CAAC,EAAE,KAAK,IAAI,EAAE,QAAQ,QAAQ,EAAE,EAAE,KAAK;AAAA,MAAG;AACrI,YAAM,SAAS,IAAI;AAAA,EAAK,IAAI;AAAA;AAAA;AAAA;AAAA,IAC9B,WAAW,EAAE,SAAS,aAAa;AACjC,UAAI;AACF,cAAM,QAAQ,KAAK,MAAM,OAAO;AAChC,YAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,qBAAW,QAAQ,MAAO,OAAM,MAAM,KAAK,UAAU,MAAM,GAAG,KAAK,KAAK,IAAI;AAAA;AAC5E,gBAAM;AAAA,QACR;AAAA,MACF,QAAQ;AAAE,cAAM,GAAG,OAAO;AAAA;AAAA;AAAA,MAAQ;AAAA,IACpC,WAAW,EAAE,SAAS,SAAS;AAC7B,UAAI;AACF,cAAM,OAAO,KAAK,MAAM,OAAO;AAC/B,YAAI,MAAM,QAAQ,IAAI,KAAK,KAAK,QAAQ;AACtC,gBAAM,UAAU,OAAO,KAAK,KAAK,CAAC,CAAC;AACnC,gBAAM,KAAK,QAAQ,KAAK,KAAK,CAAC;AAAA;AAC9B,gBAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,EAAE,KAAK,KAAK,CAAC;AAAA;AAC/C,qBAAW,OAAO,KAAM,OAAM,KAAK,QAAQ,IAAI,OAAK,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,KAAK,CAAC;AAAA;AACrF,gBAAM;AAAA,QACR;AAAA,MACF,QAAQ;AAAE,cAAM,GAAG,OAAO;AAAA;AAAA;AAAA,MAAQ;AAAA,IACpC,WAAW,EAAE,SAAS,WAAW,EAAE,SAAS,QAAQ;AAClD,UAAI;AACF,cAAM,OAAO,KAAK,MAAM,OAAO;AAC/B,YAAI,EAAE,SAAS,QAAS,OAAM,KAAK,KAAK,aAAa,OAAO,KAAK,KAAK,IAAI;AAAA;AAAA;AAAA,YACrE,OAAM,IAAI,KAAK,aAAa,MAAM,KAAK,KAAK,IAAI;AAAA;AAAA;AAAA,MACvD,QAAQ;AAAE,cAAM,GAAG,OAAO;AAAA;AAAA;AAAA,MAAQ;AAAA,IACpC,WAAW,EAAE,SAAS,QAAQ;AAC5B,YAAM,MAAM,QAAQ,KAAK,EAAE,WAAW,MAAM,IAAI,QAAQ,KAAK,IAAI,aAAa,QAAQ,KAAK;AAC3F,YAAM,IAAI,QAAQ,KAAK,CAAC,KAAK,GAAG;AAAA;AAAA;AAAA,IAClC,OAAO;AACL,YAAM,GAAG,OAAO;AAAA;AAAA;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,WAAW,CAAC,GAAI,MAAM,YAAY,CAAC,GAAI,GAAI,MAAM,YAAY,CAAC,CAAE;AACtE,MAAI,SAAS,QAAQ;AACnB,UAAM;AAAA;AAAA;AAAA;AAAA;AACN,eAAW,KAAK,UAAU;AACxB,YAAM,UAAU,EAAE,cAAc,KAAK,KAAK,EAAE,YAAY,EAAE;AAC1D,YAAM,QAAQ,MAAM,QAAQ,OAAO;AACnC,YAAM,MAAM,EAAE,cAAc,KAAK,KAAK,WAAM;AAC5C,YAAM,KAAK,GAAG,MAAM,QAAQ,MAAM,QAAQ,OAAO,OAAO,EAAE,KAAK;AAAA;AAAA,IACjE;AACA,UAAM;AAAA,EACR;AAEA,SAAO;AACT;AAEO,SAAS,eAAe,OAAc,WAA2B;AACtE,QAAM,UAAU,YAAY,MAAM,WAAW,SAAS,IAAI;AAC1D,QAAM,QAAQ,YAAY,MAAM,kBAAkB,SAAS,IAAI,CAAC;AAChE,QAAM,QAAQ,YAAY,MAAM,SAAS,SAAS,EAAE,QAAQ,CAAC;AAC7D,QAAM,WAAW,oBAAI,IAAiB;AACtC,aAAW,QAAQ,OAAO;AACxB,eAAW,KAAK,MAAM,gBAAgB,KAAK,EAAE,GAAG;AAC9C,eAAS,IAAI,EAAE,IAAI,CAAC;AAAA,IACtB;AAAA,EACF;AAEA,MAAI,KAAK,KAAK,UAAU,QAAQ,OAAO,kBAAkB;AAAA;AAAA;AACzD,QAAM,iBAAgB,oBAAI,KAAK,GAAE,YAAY,CAAC;AAAA;AAAA;AAE9C,QAAM,UAAU,IAAI,IAAI,MAAM,IAAI,OAAK,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACjD,QAAM,YAAY,MAAM,OAAO,OAAK,CAAC,EAAE,SAAS;AAEhD,WAAS,WAAW,MAAW,OAAe;AAC5C,UAAM,SAAS,KAAK,OAAO,KAAK;AAChC,UAAM,GAAG,MAAM,MAAM,KAAK,KAAK;AAAA;AAAA;AAC/B,QAAI,KAAK,QAAS,OAAM,GAAG,MAAM,GAAG,KAAK,OAAO;AAAA;AAAA;AAChD,QAAI,KAAK,UAAU,MAAM,OAAQ,OAAM,GAAG,MAAM,UAAU,KAAK,SAAS,KAAK,KAAK,IAAI,CAAC;AAAA;AAAA;AAEvF,UAAM,aAAa,MAAM,KAAK,SAAS,OAAO,CAAC,EAAE,OAAO,OAAK,EAAE,YAAY,KAAK,EAAE,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,EAAE,WAAW;AAChI,eAAW,KAAK,YAAY;AAC1B,UAAI;AACF,cAAM,SAAS,KAAK,MAAM,EAAE,WAAW,IAAI;AAC3C,YAAI,OAAO,KAAM,OAAM,GAAG,MAAM,GAAG,OAAO,IAAI;AAAA;AAAA;AAAA,YACzC,OAAM,GAAG,MAAM;AAAA,EAAe,MAAM,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,MAAM,IAAI,EAAE,KAAK,OAAO,MAAM,CAAC;AAAA,EAAK,MAAM;AAAA;AAAA;AAAA,MACxH,QAAQ;AACN,cAAM,GAAG,MAAM,GAAG,EAAE,WAAW,EAAE;AAAA;AAAA;AAAA,MACnC;AAAA,IACF;AAEA,UAAM,WAAW,MAAM,OAAO,OAAK,EAAE,cAAc,KAAK,EAAE;AAC1D,eAAW,SAAS,SAAU,YAAW,OAAO,QAAQ,CAAC;AAAA,EAC3D;AAEA,aAAW,QAAQ,UAAW,YAAW,MAAM,CAAC;AAEhD,MAAI,MAAM,QAAQ;AAChB,UAAM;AAAA;AAAA;AAAA;AAAA;AACN,eAAW,KAAK,OAAO;AACrB,YAAM,MAAM,QAAQ,IAAI,EAAE,SAAS;AACnC,YAAM,MAAM,QAAQ,IAAI,EAAE,SAAS;AACnC,YAAM,OAAO,MAAM,IAAI,QAAQ,EAAE,SAAS,YAAO,EAAE,KAAK,YAAO,MAAM,IAAI,QAAQ,EAAE,SAAS;AAAA;AAAA,IAC9F;AACA,UAAM;AAAA,EACR;AAEA,SAAO;AACT;;;AClNO,SAAS,iBACd,OACA,UACA,QACA,KACA,MACS;AACT,MAAI,aAAa,iCAAiC,WAAW,QAAQ;AACnE,UAAM,IAAI;AACV,UAAM,KAAK,EAAE,MAAM,EAAE,QAAQ,OAAO,WAAW;AAC/C,UAAM,WAAW,MAAM,aAAa,EAAE;AACtC,QAAI,UAAU;AACZ,WAAK,KAAK,KAAK,EAAE,SAAS,MAAM,OAAO,SAAS,IAAI,WAAW,SAAS,CAAC;AACzE,aAAO;AAAA,IACT;AACA,UAAM,eAAe,MAAM,kBAAkB,EAAE,IAAI,MAAM,EAAE,QAAQ,IAAI,MAAM,EAAE,QAAQ,aAAa,cAAc,EAAE,gBAAgB,CAAC,GAAG,aAAa,EAAE,aAAa,UAAU,EAAE,UAAU,cAAc,EAAE,cAAc,QAAQ,EAAE,OAAO,CAAC;AAC1O,SAAK,KAAK,KAAK,EAAE,SAAS,MAAM,OAAO,aAAa,IAAI,WAAW,aAAa,CAAC;AACjF,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,WAAW,qBAAqB,KAAK,SAAS,SAAS,YAAY,KAAK,WAAW,QAAQ;AACtG,UAAM,KAAK,SAAS,MAAM,GAAG,EAAE,CAAC;AAChC,UAAM,UAAU,EAAE;AAClB,SAAK,KAAK,KAAK,EAAE,SAAS,KAAK,CAAC;AAChC,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,wBAAwB,WAAW,OAAO;AACzD,UAAM,UAAU,IAAI,IAAI,UAAU,kBAAkB,EAAE,aAAa,IAAI,SAAS,MAAM;AACtF,UAAM,aAAa,MAAM,iBAAiB,EAAE;AAAA,MAAI,OAAK,UACjD,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,EAAE,MAAM,QAAQ,EAAE,OAAO,IACzD;AAAA,IACJ;AACA,SAAK,KAAK,KAAK,EAAE,WAAW,CAAC;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,MAAM,iCAAiC,KAAK,WAAW,SAAS;AAC3E,UAAM,KAAK,SAAS,QAAQ,uBAAuB,EAAE;AACrD,UAAM,IAAI;AACV,UAAM,UAAU,MAAM,gBAAgB,IAAI,CAAC;AAC3C,QAAI,CAAC,SAAS;AAAE,WAAK,KAAK,KAAK,EAAE,OAAO,sBAAsB,CAAC;AAAG,aAAO;AAAA,IAAM;AAC/E,SAAK,KAAK,KAAK,EAAE,WAAW,QAAQ,CAAC;AACrC,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,MAAM,iCAAiC,KAAK,WAAW,UAAU;AAC5E,UAAM,KAAK,SAAS,QAAQ,uBAAuB,EAAE;AACrD,UAAM,KAAK,MAAM,gBAAgB,EAAE;AACnC,SAAK,KAAK,KAAK,MAAM,KAAK,EAAE,SAAS,GAAG,CAAC;AACzC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;ACvDO,SAAS,eACd,OACA,UACA,QACA,KACA,MACA,cACS;AACT,MAAI,aAAa,sBAAsB,WAAW,OAAO;AACvD,UAAM,UAAU,aAAa,IAAI,SAAS,MAAM;AAChD,UAAM,WAAW,MAAM,YAAY,EAAE;AAAA,MAAI,OAAK,UAC1C,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE,MAAM,aAAa,EAAE,YAAY,IACrD;AAAA,IACJ;AACA,SAAK,KAAK,KAAK,EAAE,SAAS,CAAC;AAC3B,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,sBAAsB,WAAW,QAAQ;AACxD,UAAM,EAAE,MAAM,YAAY,IAAI;AAC9B,QAAI,CAAC,MAAM;AAAE,WAAK,KAAK,KAAK,EAAE,OAAO,gBAAgB,CAAC;AAAG,aAAO;AAAA,IAAM;AACtE,UAAM,UAAU,MAAM,cAAc,MAAM,WAAW;AACrD,SAAK,KAAK,KAAK,EAAE,SAAS,MAAM,QAAQ,CAAC;AACzC,WAAO;AAAA,EACT;AAGA,QAAM,oBAAoB,SAAS,MAAM,uCAAuC;AAChF,MAAI,qBAAqB,WAAW,OAAO;AACzC,UAAM,YAAY,iBAAiB,OAAO,kBAAkB,CAAC,CAAC;AAC9D,UAAM,YAAY,MAAM,oBAAoB,SAAS;AACrD,QAAI,CAAC,WAAW;AACd,WAAK,KAAK,KAAK,EAAE,OAAO,kBAAkB,CAAC;AAC3C,aAAO;AAAA,IACT;AACA,UAAM,SAAS,MAAM,gBAAgB,UAAU,EAAE;AACjD,UAAM,gBAAgB,OAAO,KAAK,OAAK,EAAE,SAAS,MAAM;AACxD,QAAI,WAAgB,CAAC;AACrB,QAAI;AACF,UAAI,cAAe,YAAW,KAAK,MAAM,cAAc,WAAW,IAAI;AAAA,IACxE,QAAQ;AAAA,IAAC;AACT,SAAK,KAAK,KAAK;AAAA,MACb,YAAY;AAAA,MACZ,SAAS,UAAU;AAAA,MACnB,cAAc,UAAU;AAAA,MACxB;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;AClDO,SAAS,YACd,OACA,UACA,QACA,KACA,MACA,cACA,WACS;AACT,MAAI,aAAa,mBAAmB,WAAW,QAAQ;AACrD,UAAM,EAAE,YAAY,OAAO,MAAM,WAAW,MAAM,UAAU,QAAQ,WAAW,gBAAgB,IAAI;AACnG,QAAI,CAAC,cAAc,CAAC,OAAO;AAAE,WAAK,KAAK,KAAK,EAAE,OAAO,gCAAgC,CAAC;AAAG,aAAO;AAAA,IAAM;AACtG,UAAM,oBAAoB,iBAAiB,OAAO,UAAU;AAC5D,QAAI,CAAC,mBAAmB;AAAE,WAAK,KAAK,KAAK,EAAE,OAAO,oBAAoB,CAAC;AAAG,aAAO;AAAA,IAAM;AACvF,QAAI,CAAC,aAAa,CAAC,MAAM,IAAI,UAAU,MAAM,UAAU,QAAW,UAAU,EAAE,GAAG;AAC/E,WAAK,KAAK,KAAK,EAAE,OAAO,oBAAoB,CAAC;AAAG,aAAO;AAAA,IAAM;AAC/D,UAAM,OAAO,MAAM,WAAW,mBAAmB,OAAO,QAAQ,QAAQ,UAAU,IAAI,EAAE,UAAU,WAAW,MAAM,UAAU,QAAQ,WAAW,gBAAgB,CAAC;AACjK,SAAK,KAAK,KAAK,EAAE,MAAM,cAAc,OAAO,IAAI,EAAE,CAAC;AACnD,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,mBAAmB,WAAW,OAAO;AACpD,UAAM,YAAY,iBAAiB,OAAO,aAAa,IAAI,YAAY,KAAK,EAAE;AAC9E,UAAM,UAAU,aAAa,IAAI,SAAS,MAAM;AAChD,UAAM,QAAQ,YACV,MAAM,kBAAkB,SAAS,EAAE,IAAI,OAAK,cAAc,OAAO,GAAG,OAAO,CAAC,IAC5E,CAAC;AACL,SAAK,KAAK,KAAK,EAAE,MAAM,CAAC;AACxB,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,MAAM,4BAA4B,KAAK,WAAW,SAAS,CAAC,SAAS,SAAS,SAAS,KAAK,CAAC,SAAS,SAAS,QAAQ,KAAK,CAAC,SAAS,SAAS,WAAW,KAAK,CAAC,SAAS,SAAS,QAAQ,GAAG;AACxM,UAAM,SAAS,SAAS,QAAQ,kBAAkB,EAAE;AACpD,UAAM,OAAO,MAAM,QAAQ,MAAM;AACjC,QAAI,CAAC,MAAM;AAAE,WAAK,KAAK,KAAK,EAAE,OAAO,iBAAiB,CAAC;AAAG,aAAO;AAAA,IAAM;AACvE,UAAM,cAAc,aAAa,IAAI,QAAQ;AAC7C,UAAM,WAAW,MAAM,gBAAgB,MAAM,EAAE,IAAI,QAAM,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,OAAO,MAAM,EAAE,UAAU,QAAQ,UAAU,YAAY,MAAM,gBAAgB,EAAE,EAAE,EAAE,OAAO,EAAE;AAC1K,UAAM,OAAO;AAAA,MACX,MAAM,cAAc,OAAO,IAAI;AAAA,MAC/B;AAAA,MACA,QAAQ,MAAM,gBAAgB,MAAM;AAAA,MACpC,OAAO,MAAM,eAAe,MAAM;AAAA,IACpC;AACA,UAAM,WAAW,cAAc,WAAW,MAAM,YAAY,MAAM,GAAG,CAAC,IAAI;AAC1E,SAAK,KAAK,KAAK,QAAQ;AACvB,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,MAAM,4BAA4B,MAAM,WAAW,WAAW,WAAW,WAAW,CAAC,SAAS,SAAS,SAAS,KAAK,CAAC,SAAS,SAAS,QAAQ,GAAG;AAC9J,UAAM,SAAS,SAAS,QAAQ,kBAAkB,EAAE;AACpD,UAAM,EAAE,WAAW,OAAO,SAAS,MAAM,QAAQ,WAAW,gBAAgB,IAAI;AAChF,QAAI,CAAC,aAAa,CAAC,MAAM,IAAI,UAAU,MAAM,UAAU,QAAQ,UAAU,EAAE,GAAG;AAC5E,WAAK,KAAK,KAAK,EAAE,OAAO,oBAAoB,CAAC;AAAG,aAAO;AAAA,IAAM;AAC/D,QAAI,cAAc,QAAW;AAC3B,YAAM,UAAU,MAAM,iBAAiB,QAAQ,aAAa,MAAM,UAAU,EAAE;AAC9E,UAAI,CAAC,SAAS;AAAE,aAAK,KAAK,KAAK,EAAE,OAAO,iBAAiB,CAAC;AAAG,eAAO;AAAA,MAAM;AAC1E,WAAK,KAAK,KAAK,EAAE,MAAM,cAAc,OAAO,OAAO,EAAE,CAAC;AACtD,aAAO;AAAA,IACT;AACA,QAAI;AACF,YAAM,UAAU,MAAM,WAAW,QAAQ,EAAE,OAAO,SAAS,MAAM,QAAQ,WAAW,gBAAgB,GAAG,UAAU,EAAE;AACnH,UAAI,CAAC,SAAS;AAAE,aAAK,KAAK,KAAK,EAAE,OAAO,iBAAiB,CAAC;AAAG,eAAO;AAAA,MAAM;AAC1E,WAAK,KAAK,KAAK,EAAE,MAAM,cAAc,OAAO,OAAO,EAAE,CAAC;AAAA,IACxD,SAAS,KAAU;AACjB,WAAK,KAAK,KAAK,EAAE,OAAO,IAAI,QAAQ,CAAC;AAAA,IACvC;AACA,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,MAAM,4BAA4B,KAAK,WAAW,YAAY,CAAC,SAAS,SAAS,SAAS,KAAK,CAAC,SAAS,SAAS,QAAQ,KAAK,CAAC,SAAS,SAAS,WAAW,GAAG;AAC3K,UAAM,SAAS,SAAS,QAAQ,kBAAkB,EAAE;AACpD,QAAI,CAAC,aAAa,CAAC,MAAM,IAAI,UAAU,MAAM,UAAU,QAAQ,UAAU,EAAE,GAAG;AAC5E,WAAK,KAAK,KAAK,EAAE,OAAO,oBAAoB,CAAC;AAAG,aAAO;AAAA,IAAM;AAC/D,UAAM,KAAK,MAAM,WAAW,QAAQ,UAAU,EAAE;AAChD,SAAK,KAAK,KAAK,MAAM,KAAK,EAAE,SAAS,GAAG,CAAC;AACzC,WAAO;AAAA,EACT;AAGA,MAAI,SAAS,MAAM,sCAAsC,KAAK,WAAW,QAAQ;AAC/E,UAAM,SAAS,SAAS,QAAQ,kBAAkB,EAAE,EAAE,QAAQ,aAAa,EAAE;AAC7E,UAAM,EAAE,MAAM,OAAO,IAAI;AACzB,QAAI,CAAC,aAAa,CAAC,MAAM,IAAI,UAAU,MAAM,QAAQ,QAAQ,UAAU,EAAE,GAAG;AAC1E,WAAK,KAAK,KAAK,EAAE,OAAO,oBAAoB,CAAC;AAAG,aAAO;AAAA,IAAM;AAC/D,UAAM,SAAS,MAAM,SAAS,QAAQ,UAAU,IAAI,QAAQ,aAAa,UAAU,EAAE;AACrF,SAAK,KAAK,OAAO,UAAU,MAAM,KAAK,MAAM;AAC5C,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,MAAM,sCAAsC,KAAK,WAAW,UAAU;AACjF,UAAM,SAAS,SAAS,QAAQ,kBAAkB,EAAE,EAAE,QAAQ,aAAa,EAAE;AAC7E,QAAI,CAAC,WAAW;AAAE,WAAK,KAAK,KAAK,EAAE,OAAO,eAAe,CAAC;AAAG,aAAO;AAAA,IAAM;AAC1E,UAAM,UAAU,MAAM,gBAAgB,QAAQ,UAAU,EAAE;AAC1D,SAAK,KAAK,UAAU,MAAM,KAAK,EAAE,QAAQ,CAAC;AAC1C,WAAO;AAAA,EACT;AAGA,MAAI,SAAS,MAAM,mCAAmC,KAAK,WAAW,OAAO;AAC3E,UAAM,SAAS,SAAS,QAAQ,kBAAkB,EAAE,EAAE,QAAQ,UAAU,EAAE;AAC1E,UAAM,SAAS,MAAM,eAAe,MAAM;AAC1C,SAAK,KAAK,SAAS,MAAM,KAAK,UAAU,EAAE,OAAO,iBAAiB,CAAC;AACnE,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkB,SAAS,MAAM,sDAAsD;AAC7F,MAAI,mBAAmB,WAAW,QAAQ;AACxC,UAAM,SAAS,gBAAgB,CAAC;AAChC,UAAM,UAAU,gBAAgB,CAAC;AACjC,UAAM,KAAK,MAAM,eAAe,QAAQ,OAAO;AAC/C,SAAK,KAAK,KAAK,MAAM,KAAK,EAAE,SAAS,GAAG,CAAC;AACzC,WAAO;AAAA,EACT;AAEA,QAAM,mBAAmB,SAAS,MAAM,uDAAuD;AAC/F,MAAI,oBAAoB,WAAW,QAAQ;AACzC,UAAM,SAAS,iBAAiB,CAAC;AACjC,UAAM,UAAU,iBAAiB,CAAC;AAClC,UAAM,KAAK,MAAM,gBAAgB,QAAQ,OAAO;AAChD,SAAK,KAAK,KAAK,MAAM,KAAK,EAAE,SAAS,GAAG,CAAC;AACzC,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB,SAAS,MAAM,qDAAqD;AAC3F,MAAI,kBAAkB,WAAW,QAAQ;AACvC,UAAM,SAAS,eAAe,CAAC;AAC/B,UAAM,UAAU,eAAe,CAAC;AAChC,UAAM,KAAK,MAAM,cAAc,QAAQ,OAAO;AAC9C,SAAK,KAAK,KAAK,MAAM,KAAK,EAAE,SAAS,GAAG,CAAC;AACzC,WAAO;AAAA,EACT;AAGA,MAAI,SAAS,MAAM,yCAAyC,KAAK,WAAW,OAAO;AACjF,UAAM,SAAS,SAAS,QAAQ,kBAAkB,EAAE,EAAE,QAAQ,gBAAgB,EAAE;AAChF,UAAM,QAAQ,MAAM,mBAAmB,MAAM;AAC7C,SAAK,KAAK,KAAK,EAAE,SAAS,QAAQ,aAAa,MAAM,CAAC;AACtD,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,MAAM,yCAAyC,KAAK,WAAW,QAAQ;AAClF,UAAM,SAAS,SAAS,QAAQ,kBAAkB,EAAE,EAAE,QAAQ,gBAAgB,EAAE;AAChF,UAAM,EAAE,cAAc,MAAM,IAAI;AAChC,QAAI,CAAC,gBAAgB,CAAC,OAAO;AAAE,WAAK,KAAK,KAAK,EAAE,OAAO,kCAAkC,CAAC;AAAG,aAAO;AAAA,IAAM;AAC1G,UAAM,kBAAkB,QAAQ,cAAc,OAAc,WAAW,EAAE;AACzE,SAAK,KAAK,KAAK,EAAE,SAAS,KAAK,CAAC;AAChC,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,MAAM,iDAAiD,KAAK,WAAW,UAAU;AAC5F,UAAM,QAAQ,SAAS,QAAQ,kBAAkB,EAAE,EAAE,MAAM,GAAG;AAC9D,UAAM,SAAS,MAAM,CAAC;AACtB,UAAM,cAAc,MAAM,CAAC;AAC3B,UAAM,KAAK,MAAM,qBAAqB,QAAQ,WAAW;AACzD,SAAK,KAAK,KAAK,MAAM,KAAK,EAAE,SAAS,GAAG,CAAC;AACzC,WAAO;AAAA,EACT;AAGA,MAAI,SAAS,MAAM,qCAAqC,KAAK,WAAW,OAAO;AAC7E,UAAM,SAAS,SAAS,QAAQ,kBAAkB,EAAE,EAAE,QAAQ,YAAY,EAAE;AAC5E,UAAM,UAAU,MAAM,eAAe,MAAM;AAC3C,SAAK,KAAK,KAAK,EAAE,SAAS,QAAQ,QAAQ,CAAC;AAC3C,WAAO;AAAA,EACT;AAGA,MAAI,SAAS,MAAM,oCAAoC,KAAK,WAAW,OAAO;AAC5E,UAAM,SAAS,SAAS,QAAQ,kBAAkB,EAAE,EAAE,QAAQ,WAAW,EAAE;AAC3E,UAAM,SAAS,aAAa,IAAI,QAAQ,KAAK;AAC7C,UAAM,OAAO,MAAM,QAAQ,MAAM;AACjC,QAAI,CAAC,MAAM;AAAE,WAAK,KAAK,KAAK,EAAE,OAAO,iBAAiB,CAAC;AAAG,aAAO;AAAA,IAAM;AACvE,QAAI,WAAW,YAAY;AACzB,YAAM,KAAK,mBAAmB,OAAO,IAAI;AACzC,YAAM,YAAY,KAAK,SAAS,UAAU,QAAQ,kBAAkB,GAAG,EAAE,YAAY;AACrF,UAAI,UAAU,KAAK,EAAE,gBAAgB,gCAAgC,uBAAuB,yBAAyB,QAAQ,OAAO,CAAC;AACrI,UAAI,IAAI,EAAE;AACV,aAAO;AAAA,IACT;AACA,SAAK,KAAK,KAAK,EAAE,OAAO,qBAAqB,CAAC;AAC9C,WAAO;AAAA,EACT;AAGA,MAAI,SAAS,MAAM,2CAA2C,KAAK,WAAW,QAAQ;AACpF,UAAM,SAAS,SAAS,QAAQ,kBAAkB,EAAE,EAAE,QAAQ,kBAAkB,EAAE;AAClF,UAAM,OAAO,MAAM,QAAQ,MAAM;AACjC,QAAI,CAAC,MAAM;AAAE,WAAK,KAAK,KAAK,EAAE,OAAO,iBAAiB,CAAC;AAAG,aAAO;AAAA,IAAM;AACvE,QAAI,CAAC,KAAK,WAAW;AAAE,WAAK,KAAK,KAAK,EAAE,SAAS,MAAM,MAAM,aAAa,CAAC;AAAG,aAAO;AAAA,IAAM;AAC3F,UAAM,KAAK,MAAM,aAAa,QAAQ,WAAW,MAAM,QAAQ;AAC/D,SAAK,KAAK,KAAK,MAAM,KAAK,EAAE,SAAS,GAAG,CAAC;AACzC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;ACpMO,SAAS,YACd,OACA,UACA,QACA,KACA,MACS;AACT,MAAI,SAAS,MAAM,mCAAmC,KAAK,WAAW,OAAO;AAC3E,UAAM,SAAS,SAAS,QAAQ,kBAAkB,EAAE,EAAE,QAAQ,UAAU,EAAE;AAC1E,SAAK,KAAK,KAAK,MAAM,eAAe,MAAM,CAAC;AAC3C,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,MAAM,mCAAmC,KAAK,WAAW,QAAQ;AAC5E,UAAM,SAAS,SAAS,QAAQ,kBAAkB,EAAE,EAAE,QAAQ,UAAU,EAAE;AAC1E,UAAM,EAAE,WAAW,OAAO,MAAM,IAAI;AACpC,QAAI,CAAC,WAAW;AAAE,WAAK,KAAK,KAAK,EAAE,OAAO,qBAAqB,CAAC;AAAG,aAAO;AAAA,IAAM;AAChF,UAAM,OAAO,MAAM,WAAW,QAAQ,WAAW,SAAS,YAAY,KAAK;AAC3E,SAAK,KAAK,KAAK,EAAE,KAAK,CAAC;AACvB,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,mBAAmB,WAAW,UAAU;AACvD,UAAM,EAAE,QAAQ,IAAI;AACpB,UAAM,KAAK,MAAM,WAAW,OAAO;AACnC,SAAK,KAAK,KAAK,MAAM,KAAK,EAAE,SAAS,GAAG,CAAC;AACzC,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,MAAM,4BAA4B,KAAK,WAAW,UAAU;AACvE,UAAM,SAAS,SAAS,QAAQ,kBAAkB,EAAE;AACpD,UAAM,KAAK,MAAM,WAAW,MAAM;AAClC,SAAK,KAAK,KAAK,MAAM,KAAK,EAAE,SAAS,GAAG,CAAC;AACzC,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,MAAM,4BAA4B,KAAK,WAAW,SAAS;AACtE,UAAM,SAAS,SAAS,QAAQ,kBAAkB,EAAE;AACpD,UAAM,EAAE,OAAO,MAAM,IAAI;AACzB,UAAM,UAAU,MAAM,WAAW,QAAQ,EAAE,OAAO,MAAM,CAAC;AACzD,QAAI,CAAC,SAAS;AAAE,WAAK,KAAK,KAAK,EAAE,OAAO,iBAAiB,CAAC;AAAG,aAAO;AAAA,IAAM;AAC1E,SAAK,KAAK,KAAK,EAAE,MAAM,QAAQ,CAAC;AAChC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;AC7CO,SAAS,aACd,OACA,UACA,QACA,KACA,MACA,WACS;AACT,MAAI,SAAS,MAAM,oCAAoC,KAAK,WAAW,QAAQ;AAC7E,UAAM,SAAS,SAAS,QAAQ,kBAAkB,EAAE,EAAE,QAAQ,WAAW,EAAE;AAC3E,UAAM,EAAE,MAAM,SAAS,KAAK,IAAI;AAChC,UAAM,eAAe,SAAS;AAC9B,UAAM,iBAAiB,eAAe,YAAY;AAClD,QAAI,CAAC,aAAa,CAAC,MAAM,IAAI,UAAU,MAAM,gBAAuB,QAAQ,UAAU,EAAE,GAAG;AACzF,WAAK,KAAK,KAAK,EAAE,OAAO,oBAAoB,CAAC;AAAG,aAAO;AAAA,IACzD;AACA,UAAM,QAAQ,MAAM,YAAY,QAAQ,QAAQ,QAAQ,WAAW,IAAI,UAAU,IAAI,EAAE,KAAK,CAAC;AAC7F,QAAI,SAAS,UAAU,SAAS,SAAS;AACvC,YAAM,iBAAiB,QAAQ,WAAW,EAAE,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IAC9D;AACA,SAAK,KAAK,KAAK,EAAE,MAAM,CAAC;AACxB,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,MAAM,6BAA6B,KAAK,WAAW,OAAO;AACrE,UAAM,UAAU,SAAS,QAAQ,mBAAmB,EAAE;AACtD,UAAM,QAAQ,MAAM,SAAS,OAAO;AACpC,QAAI,CAAC,OAAO;AAAE,WAAK,KAAK,KAAK,EAAE,OAAO,kBAAkB,CAAC;AAAG,aAAO;AAAA,IAAM;AACzE,SAAK,KAAK,KAAK,EAAE,MAAM,CAAC;AACxB,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,MAAM,6BAA6B,KAAK,WAAW,SAAS;AACvE,UAAM,UAAU,SAAS,QAAQ,mBAAmB,EAAE;AACtD,UAAM,EAAE,SAAS,MAAM,SAAS,IAAI;AACpC,UAAM,QAAQ,MAAM,SAAS,OAAO;AACpC,QAAI,CAAC,OAAO;AAAE,WAAK,KAAK,KAAK,EAAE,OAAO,kBAAkB,CAAC;AAAG,aAAO;AAAA,IAAM;AACzE,QAAI,YAAY,QAAW;AACzB,YAAM,YAAY,SAAS,SAAS,WAAW,MAAM,QAAQ;AAAA,IAC/D;AACA,QAAI,SAAS,UAAa,aAAa,QAAW;AAChD,YAAM,UAAoB,CAAC;AAC3B,YAAM,OAAc,CAAC;AACrB,UAAI,SAAS,QAAW;AAAE,gBAAQ,KAAK,UAAU;AAAG,aAAK,KAAK,IAAI;AAAA,MAAG;AACrE,UAAI,aAAa,QAAW;AAAE,gBAAQ,KAAK,cAAc;AAAG,aAAK,KAAK,KAAK,UAAU,QAAQ,CAAC;AAAA,MAAG;AACjG,WAAK,KAAK,OAAO;AACjB,YAAM,MAAM,EAAE,qBAAqB,QAAQ,KAAK,IAAI,CAAC,eAAe,EAAE,IAAI,GAAG,IAAI;AAAA,IACnF;AACA,SAAK,KAAK,KAAK,EAAE,OAAO,MAAM,SAAS,OAAO,EAAE,CAAC;AACjD,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,MAAM,6BAA6B,KAAK,WAAW,UAAU;AACxE,UAAM,UAAU,SAAS,QAAQ,mBAAmB,EAAE;AACtD,UAAM,QAAQ,MAAM,SAAS,OAAO;AACpC,QAAI,CAAC,OAAO;AAAE,WAAK,KAAK,KAAK,EAAE,OAAO,kBAAkB,CAAC;AAAG,aAAO;AAAA,IAAM;AACzE,UAAM,KAAK,MAAM,YAAY,SAAS,WAAW,MAAM,QAAQ;AAC/D,SAAK,KAAK,KAAK,MAAM,KAAK,EAAE,SAAS,GAAG,CAAC;AACzC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;AC/DA,eAAsB,aACpB,OACA,UACA,QACA,KACA,cACkB;AAClB,MAAI,aAAa,oBAAoB,WAAW,OAAO;AACrD,UAAM,YAAY,iBAAiB,OAAO,aAAa,IAAI,YAAY,KAAK,EAAE;AAC9E,UAAM,KAAK,aAAa,IAAI,GAAG,KAAK,IAAI,YAAY;AACpD,UAAM,QAAQ,SAAS,aAAa,IAAI,OAAO,KAAK,MAAM,EAAE;AAC5D,UAAM,WAAW,aAAa,IAAI,UAAU,MAAM;AAClD,QAAI,CAAC,GAAG;AAAE,WAAK,KAAK,KAAK,EAAE,SAAS,CAAC,GAAG,OAAO,EAAE,CAAC;AAAG,aAAO;AAAA,IAAM;AAElE,QAAI,UAAiB,CAAC;AAEtB,QAAI,UAAU;AACZ,YAAM,EAAE,WAAAC,WAAU,IAAI,MAAM;AAC5B,YAAM,iBAAiB,MAAMA,WAAU,CAAC;AACxC,UAAI,gBAAgB;AAClB,kBAAU,MAAM,aAAa,WAAW,GAAG,gBAAgB,KAAK;AAAA,MAClE,OAAO;AACL,kBAAU,MAAM,OAAO,WAAW,GAAG,KAAK;AAAA,MAC5C;AAAA,IACF,OAAO;AACL,gBAAU,MAAM,OAAO,WAAW,GAAG,KAAK;AAAA,IAC5C;AAEA,SAAK,KAAK,KAAK,EAAE,OAAO,GAAG,UAAU,OAAO,QAAQ,QAAQ,QAAQ,CAAC;AACrE,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;AC/BA,oBAA2B;AAC3B,IAAAC,aAAmE;AACnE,IAAAC,eAAiC;AACjC;AAEA,IAAM,gBAAY,sBAAQ,QAAQ,IAAI,GAAG,OAAO,QAAQ,SAAS;AAEjE,SAAS,UAAU,MAAoB;AACrC,MAAI,KAAC,uBAAW,IAAI,EAAG,2BAAU,MAAM,EAAE,WAAW,KAAK,CAAC;AAC5D;AAEA,SAAS,SAAS,MAAsB;AACtC,aAAO,sBAAQ,WAAW,KAAK,MAAM,GAAG,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC;AAC3D;AAEO,SAAS,YAAY,QAAwB;AAClD,aAAO,0BAAW,QAAQ,EAAE,OAAO,MAAM,EAAE,OAAO,KAAK;AACzD;AAEO,SAAS,SAAS,QAAgB,WAAiE;AACxG,QAAM,OAAO,YAAY,MAAM;AAC/B,QAAM,OAAO,SAAS,IAAI;AAE1B,MAAI,KAAC,uBAAW,IAAI,GAAG;AACrB,kBAAU,sBAAQ,IAAI,CAAC;AACvB,kCAAc,MAAM,MAAM;AAAA,EAC5B;AAEA,SAAO,EAAE,MAAM,MAAM,OAAO,QAAQ,MAAM,KAAK;AACjD;AAEO,SAAS,QAAQ,MAA6B;AACnD,MAAI;AACF,eAAO,yBAAa,SAAS,IAAI,CAAC;AAAA,EACpC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACtCO,SAAS,YACd,OACA,UACA,QACA,KACA,KACA,eAC4B;AAC5B,MAAI,aAAa,0BAA0B,WAAW,QAAQ;AAC5D,UAAM,WAAW,IAAI,QAAQ,aAAa,KAAe;AACzD,UAAM,WAAW,IAAI,QAAQ,cAAc,KAAK;AAChD,UAAM,SAAmB,CAAC;AAC1B,QAAI,GAAG,QAAQ,CAAC,UAAkB,OAAO,KAAK,KAAK,CAAC;AACpD,QAAI,GAAG,OAAO,MAAM;AAClB,YAAM,SAAS,OAAO,OAAO,MAAM;AACnC,YAAM,WAAW,gBAAgB,OAAO;AACxC,UAAI,OAAO,SAAS,UAAU;AAC5B,aAAK,KAAK,KAAK,EAAE,OAAO,kBAAkB,KAAK,GAAG,aAAa,KAAK,CAAC;AAAG;AAAA,MAC1E;AACA,YAAM,OAAO,YAAY,MAAM;AAC/B,YAAM,WAAW,MAAM,oBAAoB,IAAI;AAC/C,UAAI,UAAU;AACZ,aAAK,KAAK,KAAK,EAAE,SAAS,MAAM,MAAM,WAAW,SAAS,WAAW,MAAM,SAAS,WAAW,WAAW,SAAS,WAAW,OAAO,KAAK,CAAC;AAC3I;AAAA,MACF;AACA,YAAM,QAAQ,SAAS,QAAQ,QAAQ;AACvC,YAAM,aAAa,MAAM,iBAAiB,MAAM,UAAU,MAAM,MAAM,QAAQ;AAC9E,WAAK,KAAK,KAAK,EAAE,SAAS,MAAM,MAAM,WAAW,UAAU,MAAM,MAAM,MAAM,WAAW,SAAS,CAAC;AAAA,IACpG,CAAC;AACD,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,MAAM,4BAA4B,KAAK,WAAW,OAAO;AACpE,UAAM,OAAO,SAAS,QAAQ,kBAAkB,EAAE;AAClD,UAAM,OAAO,QAAQ,IAAI;AACzB,QAAI,CAAC,MAAM;AAAE,WAAK,KAAK,KAAK,EAAE,OAAO,iBAAiB,CAAC;AAAG,aAAO;AAAA,IAAM;AACvE,UAAM,aAAa,MAAM,oBAAoB,IAAI;AACjD,UAAM,OAAO,YAAY,aAAa;AACtC,QAAI,UAAU,KAAK,EAAE,gBAAgB,MAAM,kBAAkB,KAAK,OAAO,CAAC;AAC1E,QAAI,IAAI,IAAI;AACZ,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;AC3CA,qBAAmB;AACnB,IAAAC,iBAA2B;AAC3B,IAAAC,aAAgE;AAChE,IAAAC,eAAwB;AAExB,IAAM,cAAU,sBAAQ,QAAQ,IAAI,GAAG,QAAQ,UAAU;AACzD,IAAMC,iBAAY,sBAAQ,QAAQ,IAAI,GAAG,QAAQ,OAAO;AAExD,SAAS,WAAW,MAAsB;AACxC,aAAO,2BAAW,QAAQ,EAAE,WAAO,yBAAa,IAAI,CAAC,EAAE,OAAO,KAAK;AACrE;AAEA,SAAS,UAAU,KAAqB;AACtC,QAAM,WAAO,2BAAW,QAAQ;AAChC,WAAS,KAAK,GAAW;AACvB,UAAM,WAAO,qBAAS,CAAC;AACvB,QAAI,KAAK,OAAO,GAAG;AACjB,WAAK,WAAO,yBAAa,CAAC,CAAC;AAAA,IAC7B,WAAW,KAAK,YAAY,GAAG;AAC7B,iBAAW,aAAS,wBAAY,CAAC,EAAE,KAAK,EAAG,UAAK,sBAAQ,GAAG,KAAK,CAAC;AAAA,IACnE;AAAA,EACF;AACA,OAAK,GAAG;AACR,SAAO,KAAK,OAAO,KAAK;AAC1B;AAEO,SAAS,qBAAqB,WAAoB,aAA8B;AACrF,QAAM,MAAM,IAAI,eAAAC,QAAO;AAGvB,MAAI,aAAa,SAAS,IAAI,UAAU;AAGxC,UAAI,uBAAWD,UAAS,GAAG;AACzB,QAAI,eAAeA,YAAW,OAAO;AAAA,EACvC;AAGA,QAAM,aAAa,WAAW,OAAO;AACrC,QAAM,oBAAgB,uBAAWA,UAAS,IAAI,UAAUA,UAAS,IAAI;AAErE,QAAM,WAAW;AAAA,IACf,SAAS;AAAA,IACT,KAAK;AAAA,IACL,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,SAAS,YAAY,EAAE,IAAI,WAAW,MAAM,eAAe,GAAG,IAAI;AAAA,IAClE,WAAW,EAAE,IAAI,YAAY,OAAO,cAAc;AAAA,EACpD;AAEA,MAAI,QAAQ,iBAAiB,OAAO,KAAK,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC,CAAC;AAE3E,SAAO,IAAI,SAAS;AACtB;AAEO,SAAS,qBAAqB,WAAuE;AAC1G,MAAI;AACF,UAAM,MAAM,IAAI,eAAAC,QAAO,SAAS;AAChC,UAAM,gBAAgB,IAAI,SAAS,eAAe;AAClD,QAAI,CAAC,cAAe,QAAO,EAAE,OAAO,OAAO,OAAO,wBAAwB;AAE1E,UAAM,WAAW,KAAK,MAAM,cAAc,QAAQ,EAAE,SAAS,OAAO,CAAC;AACrE,QAAI,SAAS,YAAY,SAAS,SAAS,YAAY,MAAO,QAAO,EAAE,OAAO,OAAO,OAAO,wBAAwB,SAAS,OAAO,GAAG;AACvI,QAAI,CAAC,IAAI,SAAS,UAAU,EAAG,QAAO,EAAE,OAAO,OAAO,OAAO,mBAAmB;AAEhF,WAAO,EAAE,OAAO,MAAM,SAAS;AAAA,EACjC,SAAS,KAAU;AACjB,WAAO,EAAE,OAAO,OAAO,OAAO,IAAI,QAAQ;AAAA,EAC5C;AACF;;;ACpEO,SAAS,mBACd,OACA,UACA,QACA,KACA,KACA,MACA,cACA,WAC4B;AAC5B,MAAI,aAAa,oBAAoB,WAAW,OAAO;AACrD,UAAM,SAAS,aAAa,IAAI,QAAQ,KAAK;AAC7C,UAAM,YAAY,iBAAiB,OAAO,aAAa,IAAI,YAAY,KAAK,EAAE;AAE9E,QAAI,WAAW,YAAY;AACzB,YAAM,KAAK,eAAe,OAAO,SAAS;AAC1C,UAAI,UAAU,KAAK,EAAE,gBAAgB,gCAAgC,uBAAuB,2CAA2C,CAAC;AACxI,UAAI,IAAI,EAAE;AACV,aAAO;AAAA,IACT;AAEA,QAAI,WAAW,aAAa;AAC1B,YAAM,UAAU,YAAY,MAAM,WAAW,SAAS,IAAI;AAC1D,YAAM,YAAY,qBAAqB,WAAW,SAAS,IAAI;AAC/D,UAAI,UAAU,KAAK;AAAA,QACjB,gBAAgB;AAAA,QAChB,uBAAuB,yBAAyB,SAAS,QAAQ,WAAW;AAAA,QAC5E,kBAAkB,UAAU;AAAA,MAC9B,CAAC;AACD,UAAI,IAAI,SAAS;AACjB,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,aAAa,CAAC,MAAM,IAAI,UAAU,MAAM,UAAU,SAAS,GAAG;AACjE,WAAK,KAAK,KAAK,EAAE,OAAO,oBAAoB,CAAC;AAAG,aAAO;AAAA,IACzD;AACA,UAAM,WAAW,MAAM,eAAe;AACtC,SAAK,KAAK,KAAK,QAAQ;AACvB,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,oBAAoB,WAAW,QAAQ;AACtD,QAAI,CAAC,aAAa,CAAC,MAAM,IAAI,UAAU,MAAM,UAAU,SAAS,GAAG;AACjE,WAAK,KAAK,KAAK,EAAE,OAAO,oBAAoB,CAAC;AAAG,aAAO;AAAA,IACzD;AACA,UAAM,SAAS,aAAa,IAAI,QAAQ,KAAK;AAE7C,QAAI,WAAW,aAAa;AAC1B,YAAM,cAAc,IAAI,QAAQ,cAAc,KAAK;AACnD,UAAI,YAAY,SAAS,iBAAiB,KAAK,YAAY,SAAS,WAAW,KAAK,YAAY,SAAS,0BAA0B,GAAG;AACpI,cAAM,SAAmB,CAAC;AAC1B,YAAI,GAAG,QAAQ,CAAC,UAAkB,OAAO,KAAK,KAAK,CAAC;AACpD,YAAI,GAAG,OAAO,MAAM;AAClB,gBAAM,SAAS,OAAO,OAAO,MAAM;AACnC,gBAAM,SAAS,qBAAqB,MAAM;AAC1C,cAAI,CAAC,OAAO,OAAO;AAAE,iBAAK,KAAK,KAAK,EAAE,SAAS,OAAO,OAAO,OAAO,MAAM,CAAC;AAAG;AAAA,UAAQ;AACtF,gBAAM,SAAS,MAAM,mBAAmB,QAAQ,UAAU,EAAE;AAC5D,cAAI,OAAO,SAAS;AAClB,iBAAK,KAAK,KAAK,EAAE,SAAS,MAAM,eAAe,OAAO,cAAc,CAAC;AAAA,UACvE,OAAO;AACL,iBAAK,KAAK,KAAK,EAAE,SAAS,OAAO,OAAO,OAAO,MAAM,CAAC;AAAA,UACxD;AAAA,QACF,CAAC;AACD,eAAO;AAAA,MACT;AACA,WAAK,KAAK,KAAK,EAAE,SAAS,OAAO,OAAO,oBAAoB,CAAC;AAC7D,aAAO;AAAA,IACT;AAEA,QAAI,WAAW,YAAY;AACzB,YAAM,YAAY,iBAAiB,OAAO,aAAa,IAAI,YAAY,KAAK,EAAE;AAC9E,UAAI,CAAC,WAAW;AAAE,aAAK,KAAK,KAAK,EAAE,OAAO,sBAAsB,CAAC;AAAG,eAAO;AAAA,MAAM;AACjF,YAAM,KAAK,OAAO,SAAS,WAAW,OAAQ,KAAK,WAAW;AAC9D,YAAM,QAAQ,KAAK,SAAS;AAC5B,YAAM,SAAS,MAAM,eAAe,IAAI,WAAW,UAAU,IAAI,EAAE,MAAM,CAAC;AAC1E,UAAI,OAAO,SAAS;AAClB,aAAK,KAAK,KAAK,EAAE,SAAS,MAAM,QAAQ,OAAO,QAAQ,cAAc,OAAO,aAAa,CAAC;AAAA,MAC5F,OAAO;AACL,aAAK,KAAK,KAAK,EAAE,SAAS,OAAO,OAAO,OAAO,MAAM,CAAC;AAAA,MACxD;AACA,aAAO;AAAA,IACT;AAEA,SAAK,KAAK,KAAK,EAAE,SAAS,OAAO,OAAO,4BAA4B,CAAC;AACrE,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;AC1FO,SAAS,aACd,OACA,UACA,QACA,KACA,cACS;AACT,MAAI,aAAa,oBAAoB,WAAW,OAAO;AACrD,UAAM,QAAQ,SAAS,aAAa,IAAI,OAAO,KAAK,KAAK,EAAE;AAC3D,UAAM,YAAY,aAAa,IAAI,YAAY,KAAK;AACpD,UAAM,QAAQ,SAAS,aAAa,IAAI,OAAO,KAAK,MAAM,EAAE;AAC5D,SAAK,KAAK,KAAK,EAAE,QAAQ,MAAM,UAAU,OAAO,WAAW,KAAK,EAAE,CAAC;AACnE,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,MAAM,oCAAoC,KAAK,WAAW,OAAO;AAC5E,UAAM,SAAS,SAAS,QAAQ,kBAAkB,EAAE,EAAE,QAAQ,WAAW,EAAE;AAC3E,UAAM,QAAQ,SAAS,aAAa,IAAI,OAAO,KAAK,MAAM,EAAE;AAC5D,SAAK,KAAK,KAAK,EAAE,QAAQ,MAAM,gBAAgB,QAAQ,KAAK,EAAE,CAAC;AAC/D,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;ACvBA,IAAM,eAAe,MAAM;AACzB,MAAI;AACF,UAAM,MAAM,KAAK,MAAM,QAAQ,IAAI,EAAE,aAAa,QAAQ,MAAM,EAAE,QAAQ,WAAW,uBAAuB,GAAG,OAAO,CAAC;AACvH,WAAO,IAAI;AAAA,EACb,QAAQ;AACN,WAAO;AAAA,EACT;AACF,GAAG;AAEI,SAAS,aACd,OACA,UACA,QACA,KACS;AACT,OAAK,aAAa,aAAa,aAAa,qBAAqB,WAAW,OAAO;AACjF,UAAM,QAAQ,MAAM,SAAS;AAC7B,SAAK,KAAK,KAAK;AAAA,MACb,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,MACT,UAAU,MAAM,OAAO,SAAS;AAAA,MAChC,QAAQ,QAAQ,OAAO;AAAA,MACvB,QAAQ;AAAA,IACV,CAAC;AACD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;ACuIO,IAAM,YAA2F;AAAA,EACtG,OAAO,EAAE,MAAM,SAAS,QAAQ,CAAC,EAAE;AAAA,EACnC,iBAAiB,EAAE,MAAM,iBAAiB,QAAQ;AAAA,IAChD,EAAE,MAAM,aAAa,SAAS,GAAG;AAAA,IACjC,EAAE,MAAM,UAAU,SAAS,GAAG;AAAA,IAC9B,EAAE,MAAM,SAAS,SAAS,GAAG;AAAA,IAC7B,EAAE,MAAM,gBAAgB,SAAS,GAAG;AAAA,EACtC,EAAC;AAAA,EACD,mBAAmB,EAAE,MAAM,mBAAmB,QAAQ;AAAA,IACpD,EAAE,MAAM,WAAW,SAAS,GAAG;AAAA,IAC/B,EAAE,MAAM,WAAW,SAAS,GAAG;AAAA,IAC/B,EAAE,MAAM,YAAY,SAAS,GAAG;AAAA,IAChC,EAAE,MAAM,gBAAgB,SAAS,GAAG;AAAA,EACtC,EAAC;AAAA,EACD,cAAc,EAAE,MAAM,cAAc,QAAQ;AAAA,IAC1C,EAAE,MAAM,eAAe,SAAS,GAAG;AAAA,IACnC,EAAE,MAAM,YAAY,SAAS,GAAG;AAAA,IAChC,EAAE,MAAM,UAAU,SAAS,GAAG;AAAA,IAC9B,EAAE,MAAM,eAAe,SAAS,GAAG;AAAA,EACrC,EAAC;AAAA,EACD,cAAc,EAAE,MAAM,cAAc,QAAQ;AAAA,IAC1C,EAAE,MAAM,YAAY,SAAS,GAAG;AAAA,IAChC,EAAE,MAAM,WAAW,SAAS,GAAG;AAAA,IAC/B,EAAE,MAAM,YAAY,SAAS,GAAG;AAAA,IAChC,EAAE,MAAM,QAAQ,SAAS,GAAG;AAAA,IAC5B,EAAE,MAAM,UAAU,SAAS,GAAG;AAAA,EAChC,EAAC;AAAA,EACD,SAAS,EAAE,MAAM,WAAW,QAAQ;AAAA,IAClC,EAAE,MAAM,QAAQ,SAAS,GAAG;AAAA,IAC5B,EAAE,MAAM,QAAQ,SAAS,GAAG;AAAA,IAC5B,EAAE,MAAM,SAAS,SAAS,GAAG;AAAA,IAC7B,EAAE,MAAM,eAAe,SAAS,GAAG;AAAA,IACnC,EAAE,MAAM,UAAU,SAAS,GAAG;AAAA,EAChC,EAAC;AAAA,EACD,gBAAgB,EAAE,MAAM,gBAAgB,QAAQ;AAAA,IAC9C,EAAE,MAAM,YAAY,SAAS,GAAG;AAAA,IAChC,EAAE,MAAM,SAAS,SAAS,GAAG;AAAA,IAC7B,EAAE,MAAM,aAAa,SAAS,GAAG;AAAA,IACjC,EAAE,MAAM,YAAY,SAAS,GAAG;AAAA,EAClC,EAAC;AAAA,EACD,iBAAiB,EAAE,MAAM,iBAAiB,QAAQ;AAAA,IAChD,EAAE,MAAM,QAAQ,SAAS,GAAG;AAAA,IAC5B,EAAE,MAAM,QAAQ,SAAS,GAAG;AAAA,IAC5B,EAAE,MAAM,YAAY,SAAS,GAAG;AAAA,IAChC,EAAE,MAAM,YAAY,SAAS,GAAG;AAAA,EAClC,EAAC;AACH;;;ACjNO,SAAS,WACd,OACA,UACA,QACA,KACA,cACS;AACT,MAAI,aAAa,kBAAkB,WAAW,OAAO;AACnD,UAAM,YAAY,iBAAiB,OAAO,aAAa,IAAI,YAAY,KAAK,EAAE;AAC9E,UAAM,QAAQ,MAAM,SAAS,SAAS;AACtC,SAAK,KAAK,KAAK,EAAE,YAAY,WAAW,GAAG,MAAM,CAAC;AAClD,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,uBAAuB,WAAW,OAAO;AACxD,UAAM,YAAY,OAAO,QAAQ,SAAS,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,MAAM,EAAE,KAAK,EAAE;AACnF,SAAK,KAAK,KAAK,EAAE,UAAU,CAAC;AAC5B,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;ACJO,IAAM,YAAN,MAAgB;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,OAAc;AACxB,SAAK,QAAQ;AACb,SAAK,cAAc,IAAI;AAAA,MACrB,MAAM,OAAO,OAAO;AAAA,MACpB,MAAM,OAAO,OAAO;AAAA,IACtB;AACA,SAAK,YAAY,IAAI,UAAU,KAAK;AACpC,SAAK,eAAe,IAAI,gBAAiB,KAAK,SAAS;AAAA,EACzD;AAAA,EAEA,MAAM,OAAO,KAAqC,KAAmD;AACnG,UAAM,MAAM,IAAI,IAAI,IAAI,OAAO,KAAK,UAAU,IAAI,QAAQ,IAAI,EAAE;AAChE,UAAM,WAAW,IAAI;AACrB,UAAM,SAAS,IAAI,UAAU;AAE7B,mBAAe,GAAG;AAClB,QAAI,WAAW,WAAW;AAAE,UAAI,UAAU,GAAG;AAAG,UAAI,IAAI;AAAG;AAAA,IAAQ;AAEnE,QAAI;AACF,YAAM,YAAY,aAAa,KAAK,OAAO,GAAG;AAC9C,YAAM,QAAQ,IAAI,QAAQ,eAAe,QAAQ,WAAW,EAAE;AAE9D,UAAI,SAAS,CAAC,KAAK,YAAY,MAAM,KAAK,GAAG;AAC3C,aAAK,KAAK,KAAK,EAAE,OAAO,aAAa,CAAC;AAAG;AAAA,MAC3C;AAGA,YAAM,cAAc,YAAY,KAAK,OAAO,UAAU,QAAQ,KAAK,KAAK,KAAK,MAAM,OAAO,QAAQ,gBAAgB;AAClH,UAAI,gBAAgB,KAAM;AAE1B,YAAM,OAAO,WAAW,SAAS,WAAW,WAAW,MAAM,SAAS,GAAG,IAAI,CAAC;AAG9E,UAAI,aAAa,mBAAmB,WAAW,OAAO;AACpD,aAAK,KAAK,KAAK,KAAK,UAAU,YAAY,CAAC;AAAG;AAAA,MAChD;AACA,UAAI,aAAa,cAAc,WAAW,OAAO;AAC/C,aAAK,aAAa,UAAU,KAAK,GAAG;AAAG;AAAA,MACzC;AACA,UAAI,aAAa,mBAAmB,WAAW,QAAQ;AACrD,aAAK,aAAa,cAAc,KAAK,KAAK,IAAI;AAAG;AAAA,MACnD;AAGA,UAAI,iBAAiB,KAAK,OAAO,UAAU,QAAQ,KAAK,IAAI,EAAG;AAC/D,UAAI,eAAe,KAAK,OAAO,UAAU,QAAQ,KAAK,MAAM,IAAI,YAAY,EAAG;AAC/E,UAAI,YAAY,KAAK,OAAO,UAAU,QAAQ,KAAK,MAAM,IAAI,cAAc,SAAS,EAAG;AACvF,UAAI,YAAY,KAAK,OAAO,UAAU,QAAQ,KAAK,IAAI,EAAG;AAC1D,UAAI,aAAa,KAAK,OAAO,UAAU,QAAQ,KAAK,MAAM,SAAS,EAAG;AACtE,UAAI,MAAM,aAAa,KAAK,OAAO,UAAU,QAAQ,KAAK,IAAI,YAAY,EAAG;AAC7E,UAAI,mBAAmB,KAAK,OAAO,UAAU,QAAQ,KAAK,KAAK,MAAM,IAAI,cAAc,SAAS,EAAG;AACnG,UAAI,aAAa,KAAK,OAAO,UAAU,QAAQ,KAAK,IAAI,YAAY,EAAG;AACvE,UAAI,WAAW,KAAK,OAAO,UAAU,QAAQ,KAAK,IAAI,YAAY,EAAG;AACrE,UAAI,aAAa,KAAK,OAAO,UAAU,QAAQ,GAAG,EAAG;AAErD,WAAK,KAAK,KAAK,EAAE,OAAO,aAAa,MAAM,UAAU,OAAO,CAAC;AAAA,IAC/D,SAAS,KAAU;AACjB,WAAK,KAAK,KAAK,EAAE,OAAO,IAAI,QAAQ,CAAC;AAAA,IACvC;AAAA,EACF;AACF;","names":["valueStr","colonIdx","updated","resolve","embedText","import_fs","import_path","import_crypto","import_fs","import_path","FILES_DIR","AdmZip"]}