mnemosyne-core 2.0.2 → 2.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.js +148 -24
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/index.mjs +147 -24
- package/dist/cli/index.mjs.map +1 -1
- package/dist/index.js +55 -21
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +54 -21
- package/dist/index.mjs.map +1 -1
- package/dist/mcp/index.js +19 -2
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/index.mjs +26 -2
- package/dist/mcp/index.mjs.map +1 -1
- package/dist/server/api.js +48 -16
- package/dist/server/api.js.map +1 -1
- package/dist/server/api.mjs +48 -16
- package/dist/server/api.mjs.map +1 -1
- package/dist/server/index.js +56 -22
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +55 -22
- package/dist/server/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/server/api.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/config.ts","../../src/server/embedder.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 * 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 += `\\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":"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","names":["valueStr","colonIdx","updated","resolve","embedText","existsSync","readFileSync","resolve","createHash","readFileSync","existsSync","resolve","FILES_DIR"]}
|
|
1
|
+
{"version":3,"sources":["../../src/config.ts","../../src/server/embedder.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 { readFileSync } = require(\"fs\");\n const { resolve } = require(\"path\");\n const pkg = JSON.parse(readFileSync(resolve(__dirname, \"../package.json\"), \"utf-8\"));\n return pkg.version;\n } catch {\n try {\n const { readFileSync } = require(\"fs\");\n const { resolve } = require(\"path\");\n const pkg = JSON.parse(readFileSync(resolve(process.cwd(), \"package.json\"), \"utf-8\"));\n return pkg.version;\n } catch {\n return \"2.0.3\";\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\nlet _config: Config | null = null;\nfunction getConfig(): Config {\n if (!_config) _config = loadConfig();\n return _config;\n}\nexport const CONFIG = new Proxy({} as Config, {\n get(_, prop) {\n return getConfig()[prop as keyof Config];\n },\n});\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 * 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\nfunction getVersion(): string {\n try {\n const { readFileSync } = require(\"fs\");\n const { resolve } = require(\"path\");\n const pkg = JSON.parse(readFileSync(resolve(__dirname, \"../../package.json\"), \"utf-8\"));\n return pkg.version;\n } catch {\n try {\n const { readFileSync } = require(\"fs\");\n const { resolve } = require(\"path\");\n const pkg = JSON.parse(readFileSync(resolve(process.cwd(), \"package.json\"), \"utf-8\"));\n return pkg.version;\n } catch {\n return \"2.0.3\";\n }\n }\n}\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: getVersion() },\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: getVersion(),\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 += `\\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\nfunction getFilesDir(): string {\n return resolve(process.cwd(), CONFIG.storage.files_dir);\n}\n\nfunction ensureDir(path: string): void {\n if (!existsSync(path)) mkdirSync(path, { recursive: true });\n}\n\nfunction hashPath(hash: string): string {\n return resolve(getFilesDir(), 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.3\";\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":"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","names":["valueStr","colonIdx","getVersion","readFileSync","resolve","updated","readFileSync","resolve","resolve","embedText","existsSync","readFileSync","resolve","createHash","readFileSync","existsSync","resolve"]}
|