mnemosyne-core 2.0.2 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/README.md +42 -25
  2. package/dist/{Store-BtdYuiUx.d.mts → Store-BJ8b6xbs.d.mts} +2 -0
  3. package/dist/{Store-BtdYuiUx.d.ts → Store-BJ8b6xbs.d.ts} +2 -0
  4. package/dist/cli/index.js +475 -5708
  5. package/dist/cli/index.js.map +1 -1
  6. package/dist/cli/index.mjs +475 -5709
  7. package/dist/cli/index.mjs.map +1 -1
  8. package/dist/{index-yTOihMUk.d.mts → index-2AoCh09i.d.mts} +1 -1
  9. package/dist/{index-B2oTMNlL.d.ts → index-BZrUZX8Z.d.ts} +1 -1
  10. package/dist/{index-B8PTQKy9.d.mts → index-CHbW0NJZ.d.mts} +1 -1
  11. package/dist/{index-DWk78ifo.d.ts → index-CfqixdlW.d.ts} +1 -1
  12. package/dist/index.d.mts +4 -4
  13. package/dist/index.d.ts +4 -4
  14. package/dist/index.js +328 -5739
  15. package/dist/index.js.map +1 -1
  16. package/dist/index.mjs +327 -5739
  17. package/dist/index.mjs.map +1 -1
  18. package/dist/mcp/index.d.mts +2 -2
  19. package/dist/mcp/index.d.ts +2 -2
  20. package/dist/mcp/index.js +19 -2
  21. package/dist/mcp/index.js.map +1 -1
  22. package/dist/mcp/index.mjs +26 -2
  23. package/dist/mcp/index.mjs.map +1 -1
  24. package/dist/sdk/index.d.mts +202 -50
  25. package/dist/sdk/index.d.ts +202 -50
  26. package/dist/sdk/index.js +76 -34
  27. package/dist/sdk/index.js.map +1 -1
  28. package/dist/sdk/index.mjs +76 -34
  29. package/dist/sdk/index.mjs.map +1 -1
  30. package/dist/server/api.d.mts +1 -1
  31. package/dist/server/api.d.ts +1 -1
  32. package/dist/server/api.js +231 -154
  33. package/dist/server/api.js.map +1 -1
  34. package/dist/server/api.mjs +231 -154
  35. package/dist/server/api.mjs.map +1 -1
  36. package/dist/server/index.d.mts +2 -2
  37. package/dist/server/index.d.ts +2 -2
  38. package/dist/server/index.js +296 -5711
  39. package/dist/server/index.js.map +1 -1
  40. package/dist/server/index.mjs +295 -5711
  41. package/dist/server/index.mjs.map +1 -1
  42. package/dist/server/websocket.d.mts +1 -1
  43. package/dist/server/websocket.d.ts +1 -1
  44. package/dist/ws/index.d.mts +1 -1
  45. package/dist/ws/index.d.ts +1 -1
  46. package/package.json +1 -1
  47. package/dist/sharp-win32-x64-CXV3GA3G.node +0 -0
@@ -1,4 +1,4 @@
1
- export { J as JsonRpcRequest, a as JsonRpcResponse, M as McpServer, b as McpSseTransport, c as McpStdioTransport, d as McpTool, T as TOOLS } from '../index-yTOihMUk.mjs';
2
- import '../Store-BtdYuiUx.mjs';
1
+ export { J as JsonRpcRequest, a as JsonRpcResponse, M as McpServer, b as McpSseTransport, c as McpStdioTransport, d as McpTool, T as TOOLS } from '../index-2AoCh09i.mjs';
2
+ import '../Store-BJ8b6xbs.mjs';
3
3
  import 'better-sqlite3';
4
4
  import 'http';
@@ -1,4 +1,4 @@
1
- export { J as JsonRpcRequest, a as JsonRpcResponse, M as McpServer, b as McpSseTransport, c as McpStdioTransport, d as McpTool, T as TOOLS } from '../index-DWk78ifo.js';
2
- import '../Store-BtdYuiUx.js';
1
+ export { J as JsonRpcRequest, a as JsonRpcResponse, M as McpServer, b as McpSseTransport, c as McpStdioTransport, d as McpTool, T as TOOLS } from '../index-CfqixdlW.js';
2
+ import '../Store-BJ8b6xbs.js';
3
3
  import 'better-sqlite3';
4
4
  import 'http';
package/dist/mcp/index.js CHANGED
@@ -244,6 +244,23 @@ var TOOLS = [
244
244
  ];
245
245
 
246
246
  // src/mcp/server.ts
247
+ function getVersion() {
248
+ try {
249
+ const { readFileSync } = require("fs");
250
+ const { resolve } = require("path");
251
+ const pkg = JSON.parse(readFileSync(resolve(__dirname, "../../package.json"), "utf-8"));
252
+ return pkg.version;
253
+ } catch {
254
+ try {
255
+ const { readFileSync } = require("fs");
256
+ const { resolve } = require("path");
257
+ const pkg = JSON.parse(readFileSync(resolve(process.cwd(), "package.json"), "utf-8"));
258
+ return pkg.version;
259
+ } catch {
260
+ return "2.1.0";
261
+ }
262
+ }
263
+ }
247
264
  var McpServer = class {
248
265
  store;
249
266
  toolMap = /* @__PURE__ */ new Map();
@@ -264,7 +281,7 @@ var McpServer = class {
264
281
  return this.ok(req.id, {
265
282
  protocolVersion: "2024-11-05",
266
283
  capabilities: { tools: {}, resources: {}, prompts: {} },
267
- serverInfo: { name: "mnemosyne-mcp", version: "2.0.0" }
284
+ serverInfo: { name: "mnemosyne-mcp", version: getVersion() }
268
285
  });
269
286
  case "tools/list":
270
287
  return this.ok(req.id, {
@@ -291,7 +308,7 @@ var McpServer = class {
291
308
  getManifest() {
292
309
  return {
293
310
  name: "Mnemosyne",
294
- version: "2.0.0",
311
+ version: getVersion(),
295
312
  description: "Knowledge base MCP server for projects, atoms, blocks, and bonds.",
296
313
  protocol: "mcp",
297
314
  transport: ["stdio", "sse"],
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/mcp/index.ts","../../src/mcp/tools.ts","../../src/mcp/server.ts","../../src/mcp/sse.ts","../../src/mcp/stdio.ts"],"sourcesContent":["export { McpServer } from \"./server.js\";\nexport { TOOLS } from \"./tools.js\";\nexport { McpSseTransport } from \"./sse.js\";\nexport { McpStdioTransport } from \"./stdio.js\";\nexport type { McpTool, JsonRpcRequest, JsonRpcResponse } from \"./types.js\";\n","/**\n * MCP Tool Definitions\n * All tools exposed to MCP clients (Claude Desktop, Cursor, etc.)\n */\n\nimport type { Store } from \"../core/Store.js\";\nimport type { McpTool } from \"./types.js\";\n\nexport const TOOLS: McpTool[] = [\n {\n name: \"nexus_list_projects\",\n description: \"List all projects in the Mnemosyne knowledge base.\",\n inputSchema: { type: \"object\", properties: {} },\n handler: (_args, store) => {\n return { projects: store.getProjects().map(p => ({ id: p.id, name: p.name, description: p.description, atomCount: store.getAtomsByProject(p.id).length })) };\n },\n },\n {\n name: \"nexus_search\",\n description: \"Search atoms and blocks by keyword. Returns ranked results.\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: { type: \"string\", description: \"Search query\" },\n project: { type: \"string\", description: \"Project name or ID (optional)\" },\n limit: { type: \"number\", description: \"Max results (default 10)\" },\n },\n required: [\"query\"],\n },\n handler: (args, store) => {\n const projectId = args.project ? store.getProjectByName(args.project)?.id || args.project : \"\";\n const results = store.search(projectId, args.query, args.limit || 10);\n return { query: args.query, count: results.length, results };\n },\n },\n {\n name: \"nexus_read_atom\",\n description: \"Read an atom by ID or title. Returns atom details, blocks, children, and bonds.\",\n inputSchema: {\n type: \"object\",\n properties: {\n id: { type: \"string\", description: \"Atom UUID\" },\n title: { type: \"string\", description: \"Atom title (alternative to id)\" },\n project: { type: \"string\", description: \"Project name (required if searching by title)\" },\n },\n required: [],\n },\n handler: (args, store) => {\n let atom = args.id ? store.getAtom(args.id) : undefined;\n if (!atom && args.title && args.project) {\n const projectId = store.getProjectByName(args.project)?.id || args.project;\n atom = store.getAtomsByProject(projectId).find(a => a.title === args.title);\n }\n if (!atom) throw new Error(\"Atom not found\");\n const children = store.getAtomChildren(atom.id).map(a => ({ id: a.id, title: a.title, type: a.metadata?.type || \"text\" }));\n const blocks = store.getBlocksByAtom(atom.id);\n const bonds = store.getBondsByAtom(atom.id);\n return { atom, children, blocks, bonds };\n },\n },\n {\n name: \"nexus_create_atom\",\n description: \"Create a new atom in a project.\",\n inputSchema: {\n type: \"object\",\n properties: {\n project: { type: \"string\", description: \"Project name or ID\" },\n title: { type: \"string\", description: \"Atom title/path\" },\n type: { type: \"string\", description: \"Atom type (text, memory, stream, thought, task)\" },\n parent_id: { type: \"string\", description: \"Parent atom ID (optional)\" },\n tags: { type: \"array\", items: { type: \"string\" }, description: \"Tags (optional)\" },\n assistant_id: { type: \"string\", description: \"Creator assistant ID\" },\n },\n required: [\"project\", \"title\"],\n },\n handler: (args, store) => {\n const project = store.getProjectByName(args.project) || store.getProject(args.project);\n if (!project) throw new Error(\"Project not found\");\n const assistantId = args.assistant_id || \"mcp-assistant\";\n const atom = store.createAtom(project.id, args.title, args.type || \"text\", assistantId, {\n parentId: args.parent_id,\n tags: args.tags,\n });\n return { success: true, atom };\n },\n },\n {\n name: \"nexus_update_atom\",\n description: \"Update an atom's title or parent.\",\n inputSchema: {\n type: \"object\",\n properties: {\n id: { type: \"string\", description: \"Atom UUID\" },\n title: { type: \"string\", description: \"New title\" },\n parent_id: { type: [\"string\", \"null\"], description: \"New parent ID or null for root\" },\n assistant_id: { type: \"string\", description: \"Updater assistant ID\" },\n },\n required: [\"id\"],\n },\n handler: (args, store) => {\n const assistantId = args.assistant_id || \"mcp-assistant\";\n if (args.parent_id !== undefined) {\n const updated = store.updateAtomParent(args.id, args.parent_id, assistantId);\n if (!updated) throw new Error(\"Invalid parent or atom not found\");\n }\n const updated = store.updateAtom(args.id, { title: args.title }, assistantId);\n return { success: true, atom: updated || store.getAtom(args.id) };\n },\n },\n {\n name: \"nexus_create_bond\",\n description: \"Create a bond (graph connection) between two atoms.\",\n inputSchema: {\n type: \"object\",\n properties: {\n source_id: { type: \"string\", description: \"Source atom ID\" },\n target_id: { type: \"string\", description: \"Target atom ID\" },\n label: { type: \"string\", description: \"Bond label (default: connects)\" },\n color: { type: \"string\", description: \"Hex color (optional)\" },\n },\n required: [\"source_id\", \"target_id\"],\n },\n handler: (args, store) => {\n const bond = store.createBond(args.source_id, args.target_id, args.label || \"connects\", args.color);\n return { success: true, bond };\n },\n },\n {\n name: \"nexus_request_checkout\",\n description: \"Request an exclusive checkout (lock) on an atom.\",\n inputSchema: {\n type: \"object\",\n properties: {\n atom_id: { type: \"string\", description: \"Atom UUID\" },\n assistant_id: { type: \"string\", description: \"Assistant requesting checkout\" },\n reason: { type: \"string\", description: \"Reason for checkout\" },\n },\n required: [\"atom_id\", \"assistant_id\"],\n },\n handler: (args, store) => {\n const result = store.checkout(args.atom_id, args.assistant_id, \"exclusive\", args.reason || \"\");\n return result;\n },\n },\n {\n name: \"nexus_release_checkout\",\n description: \"Release a checkout (unlock) on an atom.\",\n inputSchema: {\n type: \"object\",\n properties: {\n atom_id: { type: \"string\", description: \"Atom UUID\" },\n assistant_id: { type: \"string\", description: \"Assistant releasing checkout\" },\n },\n required: [\"atom_id\", \"assistant_id\"],\n },\n handler: (args, store) => {\n const success = store.releaseCheckout(args.atom_id, args.assistant_id);\n return { success };\n },\n },\n {\n name: \"nexus_subscribe_to_atom\",\n description: \"Subscribe to real-time updates for an atom via WebSocket.\",\n inputSchema: {\n type: \"object\",\n properties: {\n atom_id: { type: \"string\", description: \"Atom UUID to subscribe to\" },\n },\n required: [\"atom_id\"],\n },\n handler: (args, _store) => {\n return { success: true, wsEndpoint: \"ws://localhost:7321/ws\", atom_id: args.atom_id, message: \"Connect via WebSocket and send { type: 'subscribe', atomId: '<id>' }\" };\n },\n },\n {\n name: \"nexus_batch\",\n description: \"Execute multiple MCP tools in a single request. Reduces round-trip token waste.\",\n inputSchema: {\n type: \"object\",\n properties: {\n operations: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n tool: { type: \"string\", description: \"Tool name to call\" },\n params: { type: \"object\", description: \"Parameters for the tool\" },\n },\n required: [\"tool\"],\n },\n description: \"Ordered list of tool calls\",\n },\n stop_on_error: { type: \"boolean\", description: \"If true, stop at first error. Default: false\", default: false },\n },\n required: [\"operations\"],\n },\n handler: (args, store) => {\n const operations = args.operations || [];\n const stopOnError = args.stop_on_error ?? false;\n const results: any[] = [];\n const toolMap = new Map<string, McpTool>();\n for (const t of TOOLS) toolMap.set(t.name, t);\n\n for (let i = 0; i < operations.length; i++) {\n const op = operations[i];\n const tool = toolMap.get(op.tool);\n if (!tool) {\n results.push({ index: i, tool: op.tool, error: `Tool not found: ${op.tool}` });\n if (stopOnError) break;\n continue;\n }\n try {\n const result = tool.handler(op.params || {}, store);\n results.push({ index: i, tool: op.tool, success: true, result });\n } catch (err: any) {\n results.push({ index: i, tool: op.tool, error: err.message });\n if (stopOnError) break;\n }\n }\n return { count: operations.length, completed: results.length, results };\n },\n },\n];\n","/**\n * MCP Server\n * JSON-RPC handler for Model Context Protocol.\n */\n\nimport type { Store } from \"../core/Store.js\";\nimport { TOOLS } from \"./tools.js\";\nimport type { JsonRpcRequest, JsonRpcResponse, McpTool } from \"./types.js\";\n\nexport class McpServer {\n private store: Store;\n private toolMap = new Map<string, McpTool>();\n\n constructor(store: Store) {\n this.store = store;\n for (const t of TOOLS) this.toolMap.set(t.name, t);\n }\n\n /**\n * Returns `null` for notifications (no response needed).\n */\n handleRequest(req: JsonRpcRequest): JsonRpcResponse | null {\n // Notifications have no id — do not send a response\n if (req.id === null || req.id === undefined) {\n return null;\n }\n\n try {\n switch (req.method) {\n case \"initialize\":\n return this.ok(req.id, {\n protocolVersion: \"2024-11-05\",\n capabilities: { tools: {}, resources: {}, prompts: {} },\n serverInfo: { name: \"mnemosyne-mcp\", version: \"2.0.0\" },\n });\n\n case \"tools/list\":\n return this.ok(req.id, {\n tools: TOOLS.map(t => ({ name: t.name, description: t.description, inputSchema: t.inputSchema })),\n });\n\n case \"tools/call\": {\n const { name, arguments: args } = req.params || {};\n const tool = this.toolMap.get(name);\n if (!tool) return this.err(req.id, -32601, `Tool not found: ${name}`);\n const result = tool.handler(args || {}, this.store);\n return this.ok(req.id, { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] });\n }\n\n case \"resources/list\":\n return this.ok(req.id, { resources: [] });\n\n case \"prompts/list\":\n return this.ok(req.id, { prompts: [] });\n\n default:\n return this.err(req.id, -32601, `Method not found: ${req.method}`);\n }\n } catch (e: any) {\n return this.err(req.id, -32603, e.message);\n }\n }\n\n getManifest() {\n return {\n name: \"Mnemosyne\",\n version: \"2.0.0\",\n description: \"Knowledge base MCP server for projects, atoms, blocks, and bonds.\",\n protocol: \"mcp\",\n transport: [\"stdio\", \"sse\"],\n endpoints: {\n sse: \"/mcp/sse\",\n messages: \"/mcp/messages\",\n },\n tools: TOOLS.map(t => ({ name: t.name, description: t.description })),\n };\n }\n\n private ok(id: string | number | null, result: any): JsonRpcResponse {\n return { jsonrpc: \"2.0\", id, result };\n }\n private err(id: string | number | null, code: number, message: string): JsonRpcResponse {\n return { jsonrpc: \"2.0\", id, error: { code, message } };\n }\n}\n","/**\n * MCP SSE Transport\n * Server-Sent Events transport for MCP over HTTP.\n */\n\nimport type { McpServer } from \"./server.js\";\nimport type { JsonRpcRequest } from \"./types.js\";\n\ninterface SseSession {\n id: string;\n res: import(\"http\").ServerResponse;\n}\n\nexport class McpSseTransport {\n private server: McpServer;\n private sessions = new Map<string, SseSession>();\n private sessionCounter = 0;\n\n constructor(server: McpServer) {\n this.server = server;\n }\n\n handleSse(req: import(\"http\").IncomingMessage, res: import(\"http\").ServerResponse): void {\n const id = `sess_${++this.sessionCounter}_${Date.now()}`;\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n \"Connection\": \"keep-alive\",\n });\n this.sessions.set(id, { id, res });\n\n // Send endpoint event\n this.sendSse(id, \"endpoint\", \"/mcp/messages?session_id=\" + id);\n\n req.on(\"close\", () => this.sessions.delete(id));\n }\n\n handleMessage(req: import(\"http\").IncomingMessage, res: import(\"http\").ServerResponse, body: any): void {\n const url = new URL(req.url || \"/\", `http://${req.headers.host}`);\n const sessionId = url.searchParams.get(\"session_id\") || \"\";\n\n const request = body as JsonRpcRequest;\n if (!request || request.jsonrpc !== \"2.0\") {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"invalid_jsonrpc\" }));\n return;\n }\n\n const response = this.server.handleRequest(request);\n // Notifications return null — send empty 200\n if (!response) {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(\"{}\");\n return;\n }\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(response));\n\n // Also broadcast via SSE if the session is active\n if (sessionId) this.sendSse(sessionId, \"message\", JSON.stringify(response));\n }\n\n private sendSse(sessionId: string, event: string, data: string): void {\n const session = this.sessions.get(sessionId);\n if (!session) return;\n session.res.write(`event: ${event}\\ndata: ${data}\\n\\n`);\n }\n}\n","/**\n * MCP Stdio Transport\n * Line-delimited JSON-RPC over stdin/stdout.\n * This is what Claude Desktop uses to communicate with MCP servers.\n */\n\nimport type { McpServer } from \"./server.js\";\nimport type { JsonRpcRequest, JsonRpcResponse } from \"./types.js\";\n\nexport class McpStdioTransport {\n private server: McpServer;\n private buffer = \"\";\n\n constructor(server: McpServer) {\n this.server = server;\n }\n\n start(): void {\n process.stdin.setEncoding(\"utf8\");\n process.stdin.resume();\n\n process.stdin.on(\"data\", (chunk: string) => {\n this.buffer += chunk;\n const lines = this.buffer.split(\"\\n\");\n this.buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (!line.trim()) continue;\n try {\n const request = JSON.parse(line) as JsonRpcRequest;\n const response = this.server.handleRequest(request);\n if (response) this.send(response);\n // Notifications return null — no output\n } catch (err: any) {\n this.send({ jsonrpc: \"2.0\", id: null, error: { code: -32700, message: \"Parse error: \" + err.message } });\n }\n }\n });\n\n process.stdin.on(\"end\", () => {\n process.exit(0);\n });\n }\n\n send(message: JsonRpcResponse): void {\n process.stdout.write(JSON.stringify(message) + \"\\n\");\n }\n}\n"],"mappings":"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","names":["updated"]}
1
+ {"version":3,"sources":["../../src/mcp/index.ts","../../src/mcp/tools.ts","../../src/mcp/server.ts","../../src/mcp/sse.ts","../../src/mcp/stdio.ts"],"sourcesContent":["export { McpServer } from \"./server.js\";\nexport { TOOLS } from \"./tools.js\";\nexport { McpSseTransport } from \"./sse.js\";\nexport { McpStdioTransport } from \"./stdio.js\";\nexport type { McpTool, JsonRpcRequest, JsonRpcResponse } from \"./types.js\";\n","/**\n * MCP Tool Definitions\n * All tools exposed to MCP clients (Claude Desktop, Cursor, etc.)\n */\n\nimport type { Store } from \"../core/Store.js\";\nimport type { McpTool } from \"./types.js\";\n\nexport const TOOLS: McpTool[] = [\n {\n name: \"nexus_list_projects\",\n description: \"List all projects in the Mnemosyne knowledge base.\",\n inputSchema: { type: \"object\", properties: {} },\n handler: (_args, store) => {\n return { projects: store.getProjects().map(p => ({ id: p.id, name: p.name, description: p.description, atomCount: store.getAtomsByProject(p.id).length })) };\n },\n },\n {\n name: \"nexus_search\",\n description: \"Search atoms and blocks by keyword. Returns ranked results.\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: { type: \"string\", description: \"Search query\" },\n project: { type: \"string\", description: \"Project name or ID (optional)\" },\n limit: { type: \"number\", description: \"Max results (default 10)\" },\n },\n required: [\"query\"],\n },\n handler: (args, store) => {\n const projectId = args.project ? store.getProjectByName(args.project)?.id || args.project : \"\";\n const results = store.search(projectId, args.query, args.limit || 10);\n return { query: args.query, count: results.length, results };\n },\n },\n {\n name: \"nexus_read_atom\",\n description: \"Read an atom by ID or title. Returns atom details, blocks, children, and bonds.\",\n inputSchema: {\n type: \"object\",\n properties: {\n id: { type: \"string\", description: \"Atom UUID\" },\n title: { type: \"string\", description: \"Atom title (alternative to id)\" },\n project: { type: \"string\", description: \"Project name (required if searching by title)\" },\n },\n required: [],\n },\n handler: (args, store) => {\n let atom = args.id ? store.getAtom(args.id) : undefined;\n if (!atom && args.title && args.project) {\n const projectId = store.getProjectByName(args.project)?.id || args.project;\n atom = store.getAtomsByProject(projectId).find(a => a.title === args.title);\n }\n if (!atom) throw new Error(\"Atom not found\");\n const children = store.getAtomChildren(atom.id).map(a => ({ id: a.id, title: a.title, type: a.metadata?.type || \"text\" }));\n const blocks = store.getBlocksByAtom(atom.id);\n const bonds = store.getBondsByAtom(atom.id);\n return { atom, children, blocks, bonds };\n },\n },\n {\n name: \"nexus_create_atom\",\n description: \"Create a new atom in a project.\",\n inputSchema: {\n type: \"object\",\n properties: {\n project: { type: \"string\", description: \"Project name or ID\" },\n title: { type: \"string\", description: \"Atom title/path\" },\n type: { type: \"string\", description: \"Atom type (text, memory, stream, thought, task)\" },\n parent_id: { type: \"string\", description: \"Parent atom ID (optional)\" },\n tags: { type: \"array\", items: { type: \"string\" }, description: \"Tags (optional)\" },\n assistant_id: { type: \"string\", description: \"Creator assistant ID\" },\n },\n required: [\"project\", \"title\"],\n },\n handler: (args, store) => {\n const project = store.getProjectByName(args.project) || store.getProject(args.project);\n if (!project) throw new Error(\"Project not found\");\n const assistantId = args.assistant_id || \"mcp-assistant\";\n const atom = store.createAtom(project.id, args.title, args.type || \"text\", assistantId, {\n parentId: args.parent_id,\n tags: args.tags,\n });\n return { success: true, atom };\n },\n },\n {\n name: \"nexus_update_atom\",\n description: \"Update an atom's title or parent.\",\n inputSchema: {\n type: \"object\",\n properties: {\n id: { type: \"string\", description: \"Atom UUID\" },\n title: { type: \"string\", description: \"New title\" },\n parent_id: { type: [\"string\", \"null\"], description: \"New parent ID or null for root\" },\n assistant_id: { type: \"string\", description: \"Updater assistant ID\" },\n },\n required: [\"id\"],\n },\n handler: (args, store) => {\n const assistantId = args.assistant_id || \"mcp-assistant\";\n if (args.parent_id !== undefined) {\n const updated = store.updateAtomParent(args.id, args.parent_id, assistantId);\n if (!updated) throw new Error(\"Invalid parent or atom not found\");\n }\n const updated = store.updateAtom(args.id, { title: args.title }, assistantId);\n return { success: true, atom: updated || store.getAtom(args.id) };\n },\n },\n {\n name: \"nexus_create_bond\",\n description: \"Create a bond (graph connection) between two atoms.\",\n inputSchema: {\n type: \"object\",\n properties: {\n source_id: { type: \"string\", description: \"Source atom ID\" },\n target_id: { type: \"string\", description: \"Target atom ID\" },\n label: { type: \"string\", description: \"Bond label (default: connects)\" },\n color: { type: \"string\", description: \"Hex color (optional)\" },\n },\n required: [\"source_id\", \"target_id\"],\n },\n handler: (args, store) => {\n const bond = store.createBond(args.source_id, args.target_id, args.label || \"connects\", args.color);\n return { success: true, bond };\n },\n },\n {\n name: \"nexus_request_checkout\",\n description: \"Request an exclusive checkout (lock) on an atom.\",\n inputSchema: {\n type: \"object\",\n properties: {\n atom_id: { type: \"string\", description: \"Atom UUID\" },\n assistant_id: { type: \"string\", description: \"Assistant requesting checkout\" },\n reason: { type: \"string\", description: \"Reason for checkout\" },\n },\n required: [\"atom_id\", \"assistant_id\"],\n },\n handler: (args, store) => {\n const result = store.checkout(args.atom_id, args.assistant_id, \"exclusive\", args.reason || \"\");\n return result;\n },\n },\n {\n name: \"nexus_release_checkout\",\n description: \"Release a checkout (unlock) on an atom.\",\n inputSchema: {\n type: \"object\",\n properties: {\n atom_id: { type: \"string\", description: \"Atom UUID\" },\n assistant_id: { type: \"string\", description: \"Assistant releasing checkout\" },\n },\n required: [\"atom_id\", \"assistant_id\"],\n },\n handler: (args, store) => {\n const success = store.releaseCheckout(args.atom_id, args.assistant_id);\n return { success };\n },\n },\n {\n name: \"nexus_subscribe_to_atom\",\n description: \"Subscribe to real-time updates for an atom via WebSocket.\",\n inputSchema: {\n type: \"object\",\n properties: {\n atom_id: { type: \"string\", description: \"Atom UUID to subscribe to\" },\n },\n required: [\"atom_id\"],\n },\n handler: (args, _store) => {\n return { success: true, wsEndpoint: \"ws://localhost:7321/ws\", atom_id: args.atom_id, message: \"Connect via WebSocket and send { type: 'subscribe', atomId: '<id>' }\" };\n },\n },\n {\n name: \"nexus_batch\",\n description: \"Execute multiple MCP tools in a single request. Reduces round-trip token waste.\",\n inputSchema: {\n type: \"object\",\n properties: {\n operations: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n tool: { type: \"string\", description: \"Tool name to call\" },\n params: { type: \"object\", description: \"Parameters for the tool\" },\n },\n required: [\"tool\"],\n },\n description: \"Ordered list of tool calls\",\n },\n stop_on_error: { type: \"boolean\", description: \"If true, stop at first error. Default: false\", default: false },\n },\n required: [\"operations\"],\n },\n handler: (args, store) => {\n const operations = args.operations || [];\n const stopOnError = args.stop_on_error ?? false;\n const results: any[] = [];\n const toolMap = new Map<string, McpTool>();\n for (const t of TOOLS) toolMap.set(t.name, t);\n\n for (let i = 0; i < operations.length; i++) {\n const op = operations[i];\n const tool = toolMap.get(op.tool);\n if (!tool) {\n results.push({ index: i, tool: op.tool, error: `Tool not found: ${op.tool}` });\n if (stopOnError) break;\n continue;\n }\n try {\n const result = tool.handler(op.params || {}, store);\n results.push({ index: i, tool: op.tool, success: true, result });\n } catch (err: any) {\n results.push({ index: i, tool: op.tool, error: err.message });\n if (stopOnError) break;\n }\n }\n return { count: operations.length, completed: results.length, results };\n },\n },\n];\n","/**\n * MCP Server\n * JSON-RPC handler for Model Context Protocol.\n */\n\nimport type { Store } from \"../core/Store.js\";\nimport { TOOLS } from \"./tools.js\";\nimport type { JsonRpcRequest, JsonRpcResponse, McpTool } from \"./types.js\";\n\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.1.0\";\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 * MCP Stdio Transport\n * Line-delimited JSON-RPC over stdin/stdout.\n * This is what Claude Desktop uses to communicate with MCP servers.\n */\n\nimport type { McpServer } from \"./server.js\";\nimport type { JsonRpcRequest, JsonRpcResponse } from \"./types.js\";\n\nexport class McpStdioTransport {\n private server: McpServer;\n private buffer = \"\";\n\n constructor(server: McpServer) {\n this.server = server;\n }\n\n start(): void {\n process.stdin.setEncoding(\"utf8\");\n process.stdin.resume();\n\n process.stdin.on(\"data\", (chunk: string) => {\n this.buffer += chunk;\n const lines = this.buffer.split(\"\\n\");\n this.buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (!line.trim()) continue;\n try {\n const request = JSON.parse(line) as JsonRpcRequest;\n const response = this.server.handleRequest(request);\n if (response) this.send(response);\n // Notifications return null — no output\n } catch (err: any) {\n this.send({ jsonrpc: \"2.0\", id: null, error: { code: -32700, message: \"Parse error: \" + err.message } });\n }\n }\n });\n\n process.stdin.on(\"end\", () => {\n process.exit(0);\n });\n }\n\n send(message: JsonRpcResponse): void {\n process.stdout.write(JSON.stringify(message) + \"\\n\");\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACQO,IAAM,QAAmB;AAAA,EAC9B;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa,EAAE,MAAM,UAAU,YAAY,CAAC,EAAE;AAAA,IAC9C,SAAS,CAAC,OAAO,UAAU;AACzB,aAAO,EAAE,UAAU,MAAM,YAAY,EAAE,IAAI,QAAM,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE,MAAM,aAAa,EAAE,aAAa,WAAW,MAAM,kBAAkB,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE;AAAA,IAC7J;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,OAAO,EAAE,MAAM,UAAU,aAAa,eAAe;AAAA,QACrD,SAAS,EAAE,MAAM,UAAU,aAAa,gCAAgC;AAAA,QACxE,OAAO,EAAE,MAAM,UAAU,aAAa,2BAA2B;AAAA,MACnE;AAAA,MACA,UAAU,CAAC,OAAO;AAAA,IACpB;AAAA,IACA,SAAS,CAAC,MAAM,UAAU;AACxB,YAAM,YAAY,KAAK,UAAU,MAAM,iBAAiB,KAAK,OAAO,GAAG,MAAM,KAAK,UAAU;AAC5F,YAAM,UAAU,MAAM,OAAO,WAAW,KAAK,OAAO,KAAK,SAAS,EAAE;AACpE,aAAO,EAAE,OAAO,KAAK,OAAO,OAAO,QAAQ,QAAQ,QAAQ;AAAA,IAC7D;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,IAAI,EAAE,MAAM,UAAU,aAAa,YAAY;AAAA,QAC/C,OAAO,EAAE,MAAM,UAAU,aAAa,iCAAiC;AAAA,QACvE,SAAS,EAAE,MAAM,UAAU,aAAa,gDAAgD;AAAA,MAC1F;AAAA,MACA,UAAU,CAAC;AAAA,IACb;AAAA,IACA,SAAS,CAAC,MAAM,UAAU;AACxB,UAAI,OAAO,KAAK,KAAK,MAAM,QAAQ,KAAK,EAAE,IAAI;AAC9C,UAAI,CAAC,QAAQ,KAAK,SAAS,KAAK,SAAS;AACvC,cAAM,YAAY,MAAM,iBAAiB,KAAK,OAAO,GAAG,MAAM,KAAK;AACnE,eAAO,MAAM,kBAAkB,SAAS,EAAE,KAAK,OAAK,EAAE,UAAU,KAAK,KAAK;AAAA,MAC5E;AACA,UAAI,CAAC,KAAM,OAAM,IAAI,MAAM,gBAAgB;AAC3C,YAAM,WAAW,MAAM,gBAAgB,KAAK,EAAE,EAAE,IAAI,QAAM,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,OAAO,MAAM,EAAE,UAAU,QAAQ,OAAO,EAAE;AACzH,YAAM,SAAS,MAAM,gBAAgB,KAAK,EAAE;AAC5C,YAAM,QAAQ,MAAM,eAAe,KAAK,EAAE;AAC1C,aAAO,EAAE,MAAM,UAAU,QAAQ,MAAM;AAAA,IACzC;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,SAAS,EAAE,MAAM,UAAU,aAAa,qBAAqB;AAAA,QAC7D,OAAO,EAAE,MAAM,UAAU,aAAa,kBAAkB;AAAA,QACxD,MAAM,EAAE,MAAM,UAAU,aAAa,kDAAkD;AAAA,QACvF,WAAW,EAAE,MAAM,UAAU,aAAa,4BAA4B;AAAA,QACtE,MAAM,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,SAAS,GAAG,aAAa,kBAAkB;AAAA,QACjF,cAAc,EAAE,MAAM,UAAU,aAAa,uBAAuB;AAAA,MACtE;AAAA,MACA,UAAU,CAAC,WAAW,OAAO;AAAA,IAC/B;AAAA,IACA,SAAS,CAAC,MAAM,UAAU;AACxB,YAAM,UAAU,MAAM,iBAAiB,KAAK,OAAO,KAAK,MAAM,WAAW,KAAK,OAAO;AACrF,UAAI,CAAC,QAAS,OAAM,IAAI,MAAM,mBAAmB;AACjD,YAAM,cAAc,KAAK,gBAAgB;AACzC,YAAM,OAAO,MAAM,WAAW,QAAQ,IAAI,KAAK,OAAO,KAAK,QAAQ,QAAQ,aAAa;AAAA,QACtF,UAAU,KAAK;AAAA,QACf,MAAM,KAAK;AAAA,MACb,CAAC;AACD,aAAO,EAAE,SAAS,MAAM,KAAK;AAAA,IAC/B;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,IAAI,EAAE,MAAM,UAAU,aAAa,YAAY;AAAA,QAC/C,OAAO,EAAE,MAAM,UAAU,aAAa,YAAY;AAAA,QAClD,WAAW,EAAE,MAAM,CAAC,UAAU,MAAM,GAAG,aAAa,iCAAiC;AAAA,QACrF,cAAc,EAAE,MAAM,UAAU,aAAa,uBAAuB;AAAA,MACtE;AAAA,MACA,UAAU,CAAC,IAAI;AAAA,IACjB;AAAA,IACA,SAAS,CAAC,MAAM,UAAU;AACxB,YAAM,cAAc,KAAK,gBAAgB;AACzC,UAAI,KAAK,cAAc,QAAW;AAChC,cAAMA,WAAU,MAAM,iBAAiB,KAAK,IAAI,KAAK,WAAW,WAAW;AAC3E,YAAI,CAACA,SAAS,OAAM,IAAI,MAAM,kCAAkC;AAAA,MAClE;AACA,YAAM,UAAU,MAAM,WAAW,KAAK,IAAI,EAAE,OAAO,KAAK,MAAM,GAAG,WAAW;AAC5E,aAAO,EAAE,SAAS,MAAM,MAAM,WAAW,MAAM,QAAQ,KAAK,EAAE,EAAE;AAAA,IAClE;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,WAAW,EAAE,MAAM,UAAU,aAAa,iBAAiB;AAAA,QAC3D,WAAW,EAAE,MAAM,UAAU,aAAa,iBAAiB;AAAA,QAC3D,OAAO,EAAE,MAAM,UAAU,aAAa,iCAAiC;AAAA,QACvE,OAAO,EAAE,MAAM,UAAU,aAAa,uBAAuB;AAAA,MAC/D;AAAA,MACA,UAAU,CAAC,aAAa,WAAW;AAAA,IACrC;AAAA,IACA,SAAS,CAAC,MAAM,UAAU;AACxB,YAAM,OAAO,MAAM,WAAW,KAAK,WAAW,KAAK,WAAW,KAAK,SAAS,YAAY,KAAK,KAAK;AAClG,aAAO,EAAE,SAAS,MAAM,KAAK;AAAA,IAC/B;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,SAAS,EAAE,MAAM,UAAU,aAAa,YAAY;AAAA,QACpD,cAAc,EAAE,MAAM,UAAU,aAAa,gCAAgC;AAAA,QAC7E,QAAQ,EAAE,MAAM,UAAU,aAAa,sBAAsB;AAAA,MAC/D;AAAA,MACA,UAAU,CAAC,WAAW,cAAc;AAAA,IACtC;AAAA,IACA,SAAS,CAAC,MAAM,UAAU;AACxB,YAAM,SAAS,MAAM,SAAS,KAAK,SAAS,KAAK,cAAc,aAAa,KAAK,UAAU,EAAE;AAC7F,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,SAAS,EAAE,MAAM,UAAU,aAAa,YAAY;AAAA,QACpD,cAAc,EAAE,MAAM,UAAU,aAAa,+BAA+B;AAAA,MAC9E;AAAA,MACA,UAAU,CAAC,WAAW,cAAc;AAAA,IACtC;AAAA,IACA,SAAS,CAAC,MAAM,UAAU;AACxB,YAAM,UAAU,MAAM,gBAAgB,KAAK,SAAS,KAAK,YAAY;AACrE,aAAO,EAAE,QAAQ;AAAA,IACnB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,SAAS,EAAE,MAAM,UAAU,aAAa,4BAA4B;AAAA,MACtE;AAAA,MACA,UAAU,CAAC,SAAS;AAAA,IACtB;AAAA,IACA,SAAS,CAAC,MAAM,WAAW;AACzB,aAAO,EAAE,SAAS,MAAM,YAAY,0BAA0B,SAAS,KAAK,SAAS,SAAS,uEAAuE;AAAA,IACvK;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,YAAY;AAAA,UACV,MAAM;AAAA,UACN,OAAO;AAAA,YACL,MAAM;AAAA,YACN,YAAY;AAAA,cACV,MAAM,EAAE,MAAM,UAAU,aAAa,oBAAoB;AAAA,cACzD,QAAQ,EAAE,MAAM,UAAU,aAAa,0BAA0B;AAAA,YACnE;AAAA,YACA,UAAU,CAAC,MAAM;AAAA,UACnB;AAAA,UACA,aAAa;AAAA,QACf;AAAA,QACA,eAAe,EAAE,MAAM,WAAW,aAAa,gDAAgD,SAAS,MAAM;AAAA,MAChH;AAAA,MACA,UAAU,CAAC,YAAY;AAAA,IACzB;AAAA,IACA,SAAS,CAAC,MAAM,UAAU;AACxB,YAAM,aAAa,KAAK,cAAc,CAAC;AACvC,YAAM,cAAc,KAAK,iBAAiB;AAC1C,YAAM,UAAiB,CAAC;AACxB,YAAM,UAAU,oBAAI,IAAqB;AACzC,iBAAW,KAAK,MAAO,SAAQ,IAAI,EAAE,MAAM,CAAC;AAE5C,eAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,cAAM,KAAK,WAAW,CAAC;AACvB,cAAM,OAAO,QAAQ,IAAI,GAAG,IAAI;AAChC,YAAI,CAAC,MAAM;AACT,kBAAQ,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,OAAO,mBAAmB,GAAG,IAAI,GAAG,CAAC;AAC7E,cAAI,YAAa;AACjB;AAAA,QACF;AACA,YAAI;AACF,gBAAM,SAAS,KAAK,QAAQ,GAAG,UAAU,CAAC,GAAG,KAAK;AAClD,kBAAQ,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,SAAS,MAAM,OAAO,CAAC;AAAA,QACjE,SAAS,KAAU;AACjB,kBAAQ,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,OAAO,IAAI,QAAQ,CAAC;AAC5D,cAAI,YAAa;AAAA,QACnB;AAAA,MACF;AACA,aAAO,EAAE,OAAO,WAAW,QAAQ,WAAW,QAAQ,QAAQ,QAAQ;AAAA,IACxE;AAAA,EACF;AACF;;;ACrNA,SAAS,aAAqB;AAC5B,MAAI;AACF,UAAM,EAAE,aAAa,IAAI,QAAQ,IAAI;AACrC,UAAM,EAAE,QAAQ,IAAI,QAAQ,MAAM;AAClC,UAAM,MAAM,KAAK,MAAM,aAAa,QAAQ,WAAW,oBAAoB,GAAG,OAAO,CAAC;AACtF,WAAO,IAAI;AAAA,EACb,QAAQ;AACN,QAAI;AACF,YAAM,EAAE,aAAa,IAAI,QAAQ,IAAI;AACrC,YAAM,EAAE,QAAQ,IAAI,QAAQ,MAAM;AAClC,YAAM,MAAM,KAAK,MAAM,aAAa,QAAQ,QAAQ,IAAI,GAAG,cAAc,GAAG,OAAO,CAAC;AACpF,aAAO,IAAI;AAAA,IACb,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEO,IAAM,YAAN,MAAgB;AAAA,EACb;AAAA,EACA,UAAU,oBAAI,IAAqB;AAAA,EAE3C,YAAY,OAAc;AACxB,SAAK,QAAQ;AACb,eAAW,KAAK,MAAO,MAAK,QAAQ,IAAI,EAAE,MAAM,CAAC;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,KAA6C;AAEzD,QAAI,IAAI,OAAO,QAAQ,IAAI,OAAO,QAAW;AAC3C,aAAO;AAAA,IACT;AAEA,QAAI;AACF,cAAQ,IAAI,QAAQ;AAAA,QAClB,KAAK;AACH,iBAAO,KAAK,GAAG,IAAI,IAAI;AAAA,YACrB,iBAAiB;AAAA,YACjB,cAAc,EAAE,OAAO,CAAC,GAAG,WAAW,CAAC,GAAG,SAAS,CAAC,EAAE;AAAA,YACtD,YAAY,EAAE,MAAM,iBAAiB,SAAS,WAAW,EAAE;AAAA,UAC7D,CAAC;AAAA,QAEH,KAAK;AACH,iBAAO,KAAK,GAAG,IAAI,IAAI;AAAA,YACrB,OAAO,MAAM,IAAI,QAAM,EAAE,MAAM,EAAE,MAAM,aAAa,EAAE,aAAa,aAAa,EAAE,YAAY,EAAE;AAAA,UAClG,CAAC;AAAA,QAEH,KAAK,cAAc;AACjB,gBAAM,EAAE,MAAM,WAAW,KAAK,IAAI,IAAI,UAAU,CAAC;AACjD,gBAAM,OAAO,KAAK,QAAQ,IAAI,IAAI;AAClC,cAAI,CAAC,KAAM,QAAO,KAAK,IAAI,IAAI,IAAI,QAAQ,mBAAmB,IAAI,EAAE;AACpE,gBAAM,SAAS,KAAK,QAAQ,QAAQ,CAAC,GAAG,KAAK,KAAK;AAClD,iBAAO,KAAK,GAAG,IAAI,IAAI,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;AAAA,QAC/F;AAAA,QAEA,KAAK;AACH,iBAAO,KAAK,GAAG,IAAI,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC;AAAA,QAE1C,KAAK;AACH,iBAAO,KAAK,GAAG,IAAI,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC;AAAA,QAExC;AACE,iBAAO,KAAK,IAAI,IAAI,IAAI,QAAQ,qBAAqB,IAAI,MAAM,EAAE;AAAA,MACrE;AAAA,IACF,SAAS,GAAQ;AACf,aAAO,KAAK,IAAI,IAAI,IAAI,QAAQ,EAAE,OAAO;AAAA,IAC3C;AAAA,EACF;AAAA,EAEA,cAAc;AACZ,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,WAAW;AAAA,MACpB,aAAa;AAAA,MACb,UAAU;AAAA,MACV,WAAW,CAAC,SAAS,KAAK;AAAA,MAC1B,WAAW;AAAA,QACT,KAAK;AAAA,QACL,UAAU;AAAA,MACZ;AAAA,MACA,OAAO,MAAM,IAAI,QAAM,EAAE,MAAM,EAAE,MAAM,aAAa,EAAE,YAAY,EAAE;AAAA,IACtE;AAAA,EACF;AAAA,EAEQ,GAAG,IAA4B,QAA8B;AACnE,WAAO,EAAE,SAAS,OAAO,IAAI,OAAO;AAAA,EACtC;AAAA,EACQ,IAAI,IAA4B,MAAc,SAAkC;AACtF,WAAO,EAAE,SAAS,OAAO,IAAI,OAAO,EAAE,MAAM,QAAQ,EAAE;AAAA,EACxD;AACF;;;ACzFO,IAAM,kBAAN,MAAsB;AAAA,EACnB;AAAA,EACA,WAAW,oBAAI,IAAwB;AAAA,EACvC,iBAAiB;AAAA,EAEzB,YAAY,QAAmB;AAC7B,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,UAAU,KAAqC,KAA0C;AACvF,UAAM,KAAK,QAAQ,EAAE,KAAK,cAAc,IAAI,KAAK,IAAI,CAAC;AACtD,QAAI,UAAU,KAAK;AAAA,MACjB,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,MACjB,cAAc;AAAA,IAChB,CAAC;AACD,SAAK,SAAS,IAAI,IAAI,EAAE,IAAI,IAAI,CAAC;AAGjC,SAAK,QAAQ,IAAI,YAAY,8BAA8B,EAAE;AAE7D,QAAI,GAAG,SAAS,MAAM,KAAK,SAAS,OAAO,EAAE,CAAC;AAAA,EAChD;AAAA,EAEA,cAAc,KAAqC,KAAoC,MAAiB;AACtG,UAAM,MAAM,IAAI,IAAI,IAAI,OAAO,KAAK,UAAU,IAAI,QAAQ,IAAI,EAAE;AAChE,UAAM,YAAY,IAAI,aAAa,IAAI,YAAY,KAAK;AAExD,UAAM,UAAU;AAChB,QAAI,CAAC,WAAW,QAAQ,YAAY,OAAO;AACzC,UAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,UAAI,IAAI,KAAK,UAAU,EAAE,OAAO,kBAAkB,CAAC,CAAC;AACpD;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,OAAO,cAAc,OAAO;AAElD,QAAI,CAAC,UAAU;AACb,UAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,UAAI,IAAI,IAAI;AACZ;AAAA,IACF;AAEA,QAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,QAAI,IAAI,KAAK,UAAU,QAAQ,CAAC;AAGhC,QAAI,UAAW,MAAK,QAAQ,WAAW,WAAW,KAAK,UAAU,QAAQ,CAAC;AAAA,EAC5E;AAAA,EAEQ,QAAQ,WAAmB,OAAe,MAAoB;AACpE,UAAM,UAAU,KAAK,SAAS,IAAI,SAAS;AAC3C,QAAI,CAAC,QAAS;AACd,YAAQ,IAAI,MAAM,UAAU,KAAK;AAAA,QAAW,IAAI;AAAA;AAAA,CAAM;AAAA,EACxD;AACF;;;AC3DO,IAAM,oBAAN,MAAwB;AAAA,EACrB;AAAA,EACA,SAAS;AAAA,EAEjB,YAAY,QAAmB;AAC7B,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,QAAc;AACZ,YAAQ,MAAM,YAAY,MAAM;AAChC,YAAQ,MAAM,OAAO;AAErB,YAAQ,MAAM,GAAG,QAAQ,CAAC,UAAkB;AAC1C,WAAK,UAAU;AACf,YAAM,QAAQ,KAAK,OAAO,MAAM,IAAI;AACpC,WAAK,SAAS,MAAM,IAAI,KAAK;AAE7B,iBAAW,QAAQ,OAAO;AACxB,YAAI,CAAC,KAAK,KAAK,EAAG;AAClB,YAAI;AACF,gBAAM,UAAU,KAAK,MAAM,IAAI;AAC/B,gBAAM,WAAW,KAAK,OAAO,cAAc,OAAO;AAClD,cAAI,SAAU,MAAK,KAAK,QAAQ;AAAA,QAElC,SAAS,KAAU;AACjB,eAAK,KAAK,EAAE,SAAS,OAAO,IAAI,MAAM,OAAO,EAAE,MAAM,QAAQ,SAAS,kBAAkB,IAAI,QAAQ,EAAE,CAAC;AAAA,QACzG;AAAA,MACF;AAAA,IACF,CAAC;AAED,YAAQ,MAAM,GAAG,OAAO,MAAM;AAC5B,cAAQ,KAAK,CAAC;AAAA,IAChB,CAAC;AAAA,EACH;AAAA,EAEA,KAAK,SAAgC;AACnC,YAAQ,OAAO,MAAM,KAAK,UAAU,OAAO,IAAI,IAAI;AAAA,EACrD;AACF;","names":["updated"]}
@@ -1,3 +1,10 @@
1
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
2
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
3
+ }) : x)(function(x) {
4
+ if (typeof require !== "undefined") return require.apply(this, arguments);
5
+ throw Error('Dynamic require of "' + x + '" is not supported');
6
+ });
7
+
1
8
  // src/mcp/tools.ts
2
9
  var TOOLS = [
3
10
  {
@@ -215,6 +222,23 @@ var TOOLS = [
215
222
  ];
216
223
 
217
224
  // src/mcp/server.ts
225
+ function getVersion() {
226
+ try {
227
+ const { readFileSync } = __require("fs");
228
+ const { resolve } = __require("path");
229
+ const pkg = JSON.parse(readFileSync(resolve(__dirname, "../../package.json"), "utf-8"));
230
+ return pkg.version;
231
+ } catch {
232
+ try {
233
+ const { readFileSync } = __require("fs");
234
+ const { resolve } = __require("path");
235
+ const pkg = JSON.parse(readFileSync(resolve(process.cwd(), "package.json"), "utf-8"));
236
+ return pkg.version;
237
+ } catch {
238
+ return "2.1.0";
239
+ }
240
+ }
241
+ }
218
242
  var McpServer = class {
219
243
  store;
220
244
  toolMap = /* @__PURE__ */ new Map();
@@ -235,7 +259,7 @@ var McpServer = class {
235
259
  return this.ok(req.id, {
236
260
  protocolVersion: "2024-11-05",
237
261
  capabilities: { tools: {}, resources: {}, prompts: {} },
238
- serverInfo: { name: "mnemosyne-mcp", version: "2.0.0" }
262
+ serverInfo: { name: "mnemosyne-mcp", version: getVersion() }
239
263
  });
240
264
  case "tools/list":
241
265
  return this.ok(req.id, {
@@ -262,7 +286,7 @@ var McpServer = class {
262
286
  getManifest() {
263
287
  return {
264
288
  name: "Mnemosyne",
265
- version: "2.0.0",
289
+ version: getVersion(),
266
290
  description: "Knowledge base MCP server for projects, atoms, blocks, and bonds.",
267
291
  protocol: "mcp",
268
292
  transport: ["stdio", "sse"],
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/mcp/tools.ts","../../src/mcp/server.ts","../../src/mcp/sse.ts","../../src/mcp/stdio.ts"],"sourcesContent":["/**\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 * MCP Stdio Transport\n * Line-delimited JSON-RPC over stdin/stdout.\n * This is what Claude Desktop uses to communicate with MCP servers.\n */\n\nimport type { McpServer } from \"./server.js\";\nimport type { JsonRpcRequest, JsonRpcResponse } from \"./types.js\";\n\nexport class McpStdioTransport {\n private server: McpServer;\n private buffer = \"\";\n\n constructor(server: McpServer) {\n this.server = server;\n }\n\n start(): void {\n process.stdin.setEncoding(\"utf8\");\n process.stdin.resume();\n\n process.stdin.on(\"data\", (chunk: string) => {\n this.buffer += chunk;\n const lines = this.buffer.split(\"\\n\");\n this.buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (!line.trim()) continue;\n try {\n const request = JSON.parse(line) as JsonRpcRequest;\n const response = this.server.handleRequest(request);\n if (response) this.send(response);\n // Notifications return null — no output\n } catch (err: any) {\n this.send({ jsonrpc: \"2.0\", id: null, error: { code: -32700, message: \"Parse error: \" + err.message } });\n }\n }\n });\n\n process.stdin.on(\"end\", () => {\n process.exit(0);\n });\n }\n\n send(message: JsonRpcResponse): void {\n process.stdout.write(JSON.stringify(message) + \"\\n\");\n }\n}\n"],"mappings":"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","names":["updated"]}
1
+ {"version":3,"sources":["../../src/mcp/tools.ts","../../src/mcp/server.ts","../../src/mcp/sse.ts","../../src/mcp/stdio.ts"],"sourcesContent":["/**\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.1.0\";\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 * MCP Stdio Transport\n * Line-delimited JSON-RPC over stdin/stdout.\n * This is what Claude Desktop uses to communicate with MCP servers.\n */\n\nimport type { McpServer } from \"./server.js\";\nimport type { JsonRpcRequest, JsonRpcResponse } from \"./types.js\";\n\nexport class McpStdioTransport {\n private server: McpServer;\n private buffer = \"\";\n\n constructor(server: McpServer) {\n this.server = server;\n }\n\n start(): void {\n process.stdin.setEncoding(\"utf8\");\n process.stdin.resume();\n\n process.stdin.on(\"data\", (chunk: string) => {\n this.buffer += chunk;\n const lines = this.buffer.split(\"\\n\");\n this.buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (!line.trim()) continue;\n try {\n const request = JSON.parse(line) as JsonRpcRequest;\n const response = this.server.handleRequest(request);\n if (response) this.send(response);\n // Notifications return null — no output\n } catch (err: any) {\n this.send({ jsonrpc: \"2.0\", id: null, error: { code: -32700, message: \"Parse error: \" + err.message } });\n }\n }\n });\n\n process.stdin.on(\"end\", () => {\n process.exit(0);\n });\n }\n\n send(message: JsonRpcResponse): void {\n process.stdout.write(JSON.stringify(message) + \"\\n\");\n }\n}\n"],"mappings":";;;;;;;;AAQO,IAAM,QAAmB;AAAA,EAC9B;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa,EAAE,MAAM,UAAU,YAAY,CAAC,EAAE;AAAA,IAC9C,SAAS,CAAC,OAAO,UAAU;AACzB,aAAO,EAAE,UAAU,MAAM,YAAY,EAAE,IAAI,QAAM,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE,MAAM,aAAa,EAAE,aAAa,WAAW,MAAM,kBAAkB,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE;AAAA,IAC7J;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,OAAO,EAAE,MAAM,UAAU,aAAa,eAAe;AAAA,QACrD,SAAS,EAAE,MAAM,UAAU,aAAa,gCAAgC;AAAA,QACxE,OAAO,EAAE,MAAM,UAAU,aAAa,2BAA2B;AAAA,MACnE;AAAA,MACA,UAAU,CAAC,OAAO;AAAA,IACpB;AAAA,IACA,SAAS,CAAC,MAAM,UAAU;AACxB,YAAM,YAAY,KAAK,UAAU,MAAM,iBAAiB,KAAK,OAAO,GAAG,MAAM,KAAK,UAAU;AAC5F,YAAM,UAAU,MAAM,OAAO,WAAW,KAAK,OAAO,KAAK,SAAS,EAAE;AACpE,aAAO,EAAE,OAAO,KAAK,OAAO,OAAO,QAAQ,QAAQ,QAAQ;AAAA,IAC7D;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,IAAI,EAAE,MAAM,UAAU,aAAa,YAAY;AAAA,QAC/C,OAAO,EAAE,MAAM,UAAU,aAAa,iCAAiC;AAAA,QACvE,SAAS,EAAE,MAAM,UAAU,aAAa,gDAAgD;AAAA,MAC1F;AAAA,MACA,UAAU,CAAC;AAAA,IACb;AAAA,IACA,SAAS,CAAC,MAAM,UAAU;AACxB,UAAI,OAAO,KAAK,KAAK,MAAM,QAAQ,KAAK,EAAE,IAAI;AAC9C,UAAI,CAAC,QAAQ,KAAK,SAAS,KAAK,SAAS;AACvC,cAAM,YAAY,MAAM,iBAAiB,KAAK,OAAO,GAAG,MAAM,KAAK;AACnE,eAAO,MAAM,kBAAkB,SAAS,EAAE,KAAK,OAAK,EAAE,UAAU,KAAK,KAAK;AAAA,MAC5E;AACA,UAAI,CAAC,KAAM,OAAM,IAAI,MAAM,gBAAgB;AAC3C,YAAM,WAAW,MAAM,gBAAgB,KAAK,EAAE,EAAE,IAAI,QAAM,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,OAAO,MAAM,EAAE,UAAU,QAAQ,OAAO,EAAE;AACzH,YAAM,SAAS,MAAM,gBAAgB,KAAK,EAAE;AAC5C,YAAM,QAAQ,MAAM,eAAe,KAAK,EAAE;AAC1C,aAAO,EAAE,MAAM,UAAU,QAAQ,MAAM;AAAA,IACzC;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,SAAS,EAAE,MAAM,UAAU,aAAa,qBAAqB;AAAA,QAC7D,OAAO,EAAE,MAAM,UAAU,aAAa,kBAAkB;AAAA,QACxD,MAAM,EAAE,MAAM,UAAU,aAAa,kDAAkD;AAAA,QACvF,WAAW,EAAE,MAAM,UAAU,aAAa,4BAA4B;AAAA,QACtE,MAAM,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,SAAS,GAAG,aAAa,kBAAkB;AAAA,QACjF,cAAc,EAAE,MAAM,UAAU,aAAa,uBAAuB;AAAA,MACtE;AAAA,MACA,UAAU,CAAC,WAAW,OAAO;AAAA,IAC/B;AAAA,IACA,SAAS,CAAC,MAAM,UAAU;AACxB,YAAM,UAAU,MAAM,iBAAiB,KAAK,OAAO,KAAK,MAAM,WAAW,KAAK,OAAO;AACrF,UAAI,CAAC,QAAS,OAAM,IAAI,MAAM,mBAAmB;AACjD,YAAM,cAAc,KAAK,gBAAgB;AACzC,YAAM,OAAO,MAAM,WAAW,QAAQ,IAAI,KAAK,OAAO,KAAK,QAAQ,QAAQ,aAAa;AAAA,QACtF,UAAU,KAAK;AAAA,QACf,MAAM,KAAK;AAAA,MACb,CAAC;AACD,aAAO,EAAE,SAAS,MAAM,KAAK;AAAA,IAC/B;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,IAAI,EAAE,MAAM,UAAU,aAAa,YAAY;AAAA,QAC/C,OAAO,EAAE,MAAM,UAAU,aAAa,YAAY;AAAA,QAClD,WAAW,EAAE,MAAM,CAAC,UAAU,MAAM,GAAG,aAAa,iCAAiC;AAAA,QACrF,cAAc,EAAE,MAAM,UAAU,aAAa,uBAAuB;AAAA,MACtE;AAAA,MACA,UAAU,CAAC,IAAI;AAAA,IACjB;AAAA,IACA,SAAS,CAAC,MAAM,UAAU;AACxB,YAAM,cAAc,KAAK,gBAAgB;AACzC,UAAI,KAAK,cAAc,QAAW;AAChC,cAAMA,WAAU,MAAM,iBAAiB,KAAK,IAAI,KAAK,WAAW,WAAW;AAC3E,YAAI,CAACA,SAAS,OAAM,IAAI,MAAM,kCAAkC;AAAA,MAClE;AACA,YAAM,UAAU,MAAM,WAAW,KAAK,IAAI,EAAE,OAAO,KAAK,MAAM,GAAG,WAAW;AAC5E,aAAO,EAAE,SAAS,MAAM,MAAM,WAAW,MAAM,QAAQ,KAAK,EAAE,EAAE;AAAA,IAClE;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,WAAW,EAAE,MAAM,UAAU,aAAa,iBAAiB;AAAA,QAC3D,WAAW,EAAE,MAAM,UAAU,aAAa,iBAAiB;AAAA,QAC3D,OAAO,EAAE,MAAM,UAAU,aAAa,iCAAiC;AAAA,QACvE,OAAO,EAAE,MAAM,UAAU,aAAa,uBAAuB;AAAA,MAC/D;AAAA,MACA,UAAU,CAAC,aAAa,WAAW;AAAA,IACrC;AAAA,IACA,SAAS,CAAC,MAAM,UAAU;AACxB,YAAM,OAAO,MAAM,WAAW,KAAK,WAAW,KAAK,WAAW,KAAK,SAAS,YAAY,KAAK,KAAK;AAClG,aAAO,EAAE,SAAS,MAAM,KAAK;AAAA,IAC/B;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,SAAS,EAAE,MAAM,UAAU,aAAa,YAAY;AAAA,QACpD,cAAc,EAAE,MAAM,UAAU,aAAa,gCAAgC;AAAA,QAC7E,QAAQ,EAAE,MAAM,UAAU,aAAa,sBAAsB;AAAA,MAC/D;AAAA,MACA,UAAU,CAAC,WAAW,cAAc;AAAA,IACtC;AAAA,IACA,SAAS,CAAC,MAAM,UAAU;AACxB,YAAM,SAAS,MAAM,SAAS,KAAK,SAAS,KAAK,cAAc,aAAa,KAAK,UAAU,EAAE;AAC7F,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,SAAS,EAAE,MAAM,UAAU,aAAa,YAAY;AAAA,QACpD,cAAc,EAAE,MAAM,UAAU,aAAa,+BAA+B;AAAA,MAC9E;AAAA,MACA,UAAU,CAAC,WAAW,cAAc;AAAA,IACtC;AAAA,IACA,SAAS,CAAC,MAAM,UAAU;AACxB,YAAM,UAAU,MAAM,gBAAgB,KAAK,SAAS,KAAK,YAAY;AACrE,aAAO,EAAE,QAAQ;AAAA,IACnB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,SAAS,EAAE,MAAM,UAAU,aAAa,4BAA4B;AAAA,MACtE;AAAA,MACA,UAAU,CAAC,SAAS;AAAA,IACtB;AAAA,IACA,SAAS,CAAC,MAAM,WAAW;AACzB,aAAO,EAAE,SAAS,MAAM,YAAY,0BAA0B,SAAS,KAAK,SAAS,SAAS,uEAAuE;AAAA,IACvK;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,YAAY;AAAA,UACV,MAAM;AAAA,UACN,OAAO;AAAA,YACL,MAAM;AAAA,YACN,YAAY;AAAA,cACV,MAAM,EAAE,MAAM,UAAU,aAAa,oBAAoB;AAAA,cACzD,QAAQ,EAAE,MAAM,UAAU,aAAa,0BAA0B;AAAA,YACnE;AAAA,YACA,UAAU,CAAC,MAAM;AAAA,UACnB;AAAA,UACA,aAAa;AAAA,QACf;AAAA,QACA,eAAe,EAAE,MAAM,WAAW,aAAa,gDAAgD,SAAS,MAAM;AAAA,MAChH;AAAA,MACA,UAAU,CAAC,YAAY;AAAA,IACzB;AAAA,IACA,SAAS,CAAC,MAAM,UAAU;AACxB,YAAM,aAAa,KAAK,cAAc,CAAC;AACvC,YAAM,cAAc,KAAK,iBAAiB;AAC1C,YAAM,UAAiB,CAAC;AACxB,YAAM,UAAU,oBAAI,IAAqB;AACzC,iBAAW,KAAK,MAAO,SAAQ,IAAI,EAAE,MAAM,CAAC;AAE5C,eAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,cAAM,KAAK,WAAW,CAAC;AACvB,cAAM,OAAO,QAAQ,IAAI,GAAG,IAAI;AAChC,YAAI,CAAC,MAAM;AACT,kBAAQ,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,OAAO,mBAAmB,GAAG,IAAI,GAAG,CAAC;AAC7E,cAAI,YAAa;AACjB;AAAA,QACF;AACA,YAAI;AACF,gBAAM,SAAS,KAAK,QAAQ,GAAG,UAAU,CAAC,GAAG,KAAK;AAClD,kBAAQ,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,SAAS,MAAM,OAAO,CAAC;AAAA,QACjE,SAAS,KAAU;AACjB,kBAAQ,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,OAAO,IAAI,QAAQ,CAAC;AAC5D,cAAI,YAAa;AAAA,QACnB;AAAA,MACF;AACA,aAAO,EAAE,OAAO,WAAW,QAAQ,WAAW,QAAQ,QAAQ,QAAQ;AAAA,IACxE;AAAA,EACF;AACF;;;ACrNA,SAAS,aAAqB;AAC5B,MAAI;AACF,UAAM,EAAE,aAAa,IAAI,UAAQ,IAAI;AACrC,UAAM,EAAE,QAAQ,IAAI,UAAQ,MAAM;AAClC,UAAM,MAAM,KAAK,MAAM,aAAa,QAAQ,WAAW,oBAAoB,GAAG,OAAO,CAAC;AACtF,WAAO,IAAI;AAAA,EACb,QAAQ;AACN,QAAI;AACF,YAAM,EAAE,aAAa,IAAI,UAAQ,IAAI;AACrC,YAAM,EAAE,QAAQ,IAAI,UAAQ,MAAM;AAClC,YAAM,MAAM,KAAK,MAAM,aAAa,QAAQ,QAAQ,IAAI,GAAG,cAAc,GAAG,OAAO,CAAC;AACpF,aAAO,IAAI;AAAA,IACb,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEO,IAAM,YAAN,MAAgB;AAAA,EACb;AAAA,EACA,UAAU,oBAAI,IAAqB;AAAA,EAE3C,YAAY,OAAc;AACxB,SAAK,QAAQ;AACb,eAAW,KAAK,MAAO,MAAK,QAAQ,IAAI,EAAE,MAAM,CAAC;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,KAA6C;AAEzD,QAAI,IAAI,OAAO,QAAQ,IAAI,OAAO,QAAW;AAC3C,aAAO;AAAA,IACT;AAEA,QAAI;AACF,cAAQ,IAAI,QAAQ;AAAA,QAClB,KAAK;AACH,iBAAO,KAAK,GAAG,IAAI,IAAI;AAAA,YACrB,iBAAiB;AAAA,YACjB,cAAc,EAAE,OAAO,CAAC,GAAG,WAAW,CAAC,GAAG,SAAS,CAAC,EAAE;AAAA,YACtD,YAAY,EAAE,MAAM,iBAAiB,SAAS,WAAW,EAAE;AAAA,UAC7D,CAAC;AAAA,QAEH,KAAK;AACH,iBAAO,KAAK,GAAG,IAAI,IAAI;AAAA,YACrB,OAAO,MAAM,IAAI,QAAM,EAAE,MAAM,EAAE,MAAM,aAAa,EAAE,aAAa,aAAa,EAAE,YAAY,EAAE;AAAA,UAClG,CAAC;AAAA,QAEH,KAAK,cAAc;AACjB,gBAAM,EAAE,MAAM,WAAW,KAAK,IAAI,IAAI,UAAU,CAAC;AACjD,gBAAM,OAAO,KAAK,QAAQ,IAAI,IAAI;AAClC,cAAI,CAAC,KAAM,QAAO,KAAK,IAAI,IAAI,IAAI,QAAQ,mBAAmB,IAAI,EAAE;AACpE,gBAAM,SAAS,KAAK,QAAQ,QAAQ,CAAC,GAAG,KAAK,KAAK;AAClD,iBAAO,KAAK,GAAG,IAAI,IAAI,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;AAAA,QAC/F;AAAA,QAEA,KAAK;AACH,iBAAO,KAAK,GAAG,IAAI,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC;AAAA,QAE1C,KAAK;AACH,iBAAO,KAAK,GAAG,IAAI,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC;AAAA,QAExC;AACE,iBAAO,KAAK,IAAI,IAAI,IAAI,QAAQ,qBAAqB,IAAI,MAAM,EAAE;AAAA,MACrE;AAAA,IACF,SAAS,GAAQ;AACf,aAAO,KAAK,IAAI,IAAI,IAAI,QAAQ,EAAE,OAAO;AAAA,IAC3C;AAAA,EACF;AAAA,EAEA,cAAc;AACZ,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,WAAW;AAAA,MACpB,aAAa;AAAA,MACb,UAAU;AAAA,MACV,WAAW,CAAC,SAAS,KAAK;AAAA,MAC1B,WAAW;AAAA,QACT,KAAK;AAAA,QACL,UAAU;AAAA,MACZ;AAAA,MACA,OAAO,MAAM,IAAI,QAAM,EAAE,MAAM,EAAE,MAAM,aAAa,EAAE,YAAY,EAAE;AAAA,IACtE;AAAA,EACF;AAAA,EAEQ,GAAG,IAA4B,QAA8B;AACnE,WAAO,EAAE,SAAS,OAAO,IAAI,OAAO;AAAA,EACtC;AAAA,EACQ,IAAI,IAA4B,MAAc,SAAkC;AACtF,WAAO,EAAE,SAAS,OAAO,IAAI,OAAO,EAAE,MAAM,QAAQ,EAAE;AAAA,EACxD;AACF;;;ACzFO,IAAM,kBAAN,MAAsB;AAAA,EACnB;AAAA,EACA,WAAW,oBAAI,IAAwB;AAAA,EACvC,iBAAiB;AAAA,EAEzB,YAAY,QAAmB;AAC7B,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,UAAU,KAAqC,KAA0C;AACvF,UAAM,KAAK,QAAQ,EAAE,KAAK,cAAc,IAAI,KAAK,IAAI,CAAC;AACtD,QAAI,UAAU,KAAK;AAAA,MACjB,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,MACjB,cAAc;AAAA,IAChB,CAAC;AACD,SAAK,SAAS,IAAI,IAAI,EAAE,IAAI,IAAI,CAAC;AAGjC,SAAK,QAAQ,IAAI,YAAY,8BAA8B,EAAE;AAE7D,QAAI,GAAG,SAAS,MAAM,KAAK,SAAS,OAAO,EAAE,CAAC;AAAA,EAChD;AAAA,EAEA,cAAc,KAAqC,KAAoC,MAAiB;AACtG,UAAM,MAAM,IAAI,IAAI,IAAI,OAAO,KAAK,UAAU,IAAI,QAAQ,IAAI,EAAE;AAChE,UAAM,YAAY,IAAI,aAAa,IAAI,YAAY,KAAK;AAExD,UAAM,UAAU;AAChB,QAAI,CAAC,WAAW,QAAQ,YAAY,OAAO;AACzC,UAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,UAAI,IAAI,KAAK,UAAU,EAAE,OAAO,kBAAkB,CAAC,CAAC;AACpD;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,OAAO,cAAc,OAAO;AAElD,QAAI,CAAC,UAAU;AACb,UAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,UAAI,IAAI,IAAI;AACZ;AAAA,IACF;AAEA,QAAI,UAAU,KAAK,EAAE,gBAAgB,mBAAmB,CAAC;AACzD,QAAI,IAAI,KAAK,UAAU,QAAQ,CAAC;AAGhC,QAAI,UAAW,MAAK,QAAQ,WAAW,WAAW,KAAK,UAAU,QAAQ,CAAC;AAAA,EAC5E;AAAA,EAEQ,QAAQ,WAAmB,OAAe,MAAoB;AACpE,UAAM,UAAU,KAAK,SAAS,IAAI,SAAS;AAC3C,QAAI,CAAC,QAAS;AACd,YAAQ,IAAI,MAAM,UAAU,KAAK;AAAA,QAAW,IAAI;AAAA;AAAA,CAAM;AAAA,EACxD;AACF;;;AC3DO,IAAM,oBAAN,MAAwB;AAAA,EACrB;AAAA,EACA,SAAS;AAAA,EAEjB,YAAY,QAAmB;AAC7B,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,QAAc;AACZ,YAAQ,MAAM,YAAY,MAAM;AAChC,YAAQ,MAAM,OAAO;AAErB,YAAQ,MAAM,GAAG,QAAQ,CAAC,UAAkB;AAC1C,WAAK,UAAU;AACf,YAAM,QAAQ,KAAK,OAAO,MAAM,IAAI;AACpC,WAAK,SAAS,MAAM,IAAI,KAAK;AAE7B,iBAAW,QAAQ,OAAO;AACxB,YAAI,CAAC,KAAK,KAAK,EAAG;AAClB,YAAI;AACF,gBAAM,UAAU,KAAK,MAAM,IAAI;AAC/B,gBAAM,WAAW,KAAK,OAAO,cAAc,OAAO;AAClD,cAAI,SAAU,MAAK,KAAK,QAAQ;AAAA,QAElC,SAAS,KAAU;AACjB,eAAK,KAAK,EAAE,SAAS,OAAO,IAAI,MAAM,OAAO,EAAE,MAAM,QAAQ,SAAS,kBAAkB,IAAI,QAAQ,EAAE,CAAC;AAAA,QACzG;AAAA,MACF;AAAA,IACF,CAAC;AAED,YAAQ,MAAM,GAAG,OAAO,MAAM;AAC5B,cAAQ,KAAK,CAAC;AAAA,IAChB,CAAC;AAAA,EACH;AAAA,EAEA,KAAK,SAAgC;AACnC,YAAQ,OAAO,MAAM,KAAK,UAAU,OAAO,IAAI,IAAI;AAAA,EACrD;AACF;","names":["updated"]}