mnemosyne-core 2.0.3 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +42 -25
- package/dist/{Store-BtdYuiUx.d.mts → Store-BJ8b6xbs.d.mts} +2 -0
- package/dist/{Store-BtdYuiUx.d.ts → Store-BJ8b6xbs.d.ts} +2 -0
- package/dist/cli/index.js +387 -5744
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/index.mjs +387 -5744
- package/dist/cli/index.mjs.map +1 -1
- package/dist/{index-yTOihMUk.d.mts → index-2AoCh09i.d.mts} +1 -1
- package/dist/{index-B2oTMNlL.d.ts → index-BZrUZX8Z.d.ts} +1 -1
- package/dist/{index-B8PTQKy9.d.mts → index-CHbW0NJZ.d.mts} +1 -1
- package/dist/{index-DWk78ifo.d.ts → index-CfqixdlW.d.ts} +1 -1
- package/dist/index.d.mts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +281 -5726
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +281 -5726
- package/dist/index.mjs.map +1 -1
- package/dist/mcp/index.d.mts +2 -2
- package/dist/mcp/index.d.ts +2 -2
- package/dist/mcp/index.js +1 -1
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/index.mjs +1 -1
- package/dist/mcp/index.mjs.map +1 -1
- package/dist/sdk/index.d.mts +144 -41
- package/dist/sdk/index.d.ts +144 -41
- package/dist/sdk/index.js +92 -34
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/index.mjs +92 -34
- package/dist/sdk/index.mjs.map +1 -1
- package/dist/server/api.d.mts +1 -1
- package/dist/server/api.d.ts +1 -1
- package/dist/server/api.js +205 -160
- package/dist/server/api.js.map +1 -1
- package/dist/server/api.mjs +205 -160
- package/dist/server/api.mjs.map +1 -1
- package/dist/server/index.d.mts +2 -2
- package/dist/server/index.d.ts +2 -2
- package/dist/server/index.js +245 -5694
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +245 -5694
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/websocket.d.mts +1 -1
- package/dist/server/websocket.d.ts +1 -1
- package/dist/ws/index.d.mts +1 -1
- package/dist/ws/index.d.ts +1 -1
- package/package.json +1 -1
- package/dist/sharp-win32-x64-CXV3GA3G.node +0 -0
package/dist/mcp/index.d.mts
CHANGED
|
@@ -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-
|
|
2
|
-
import '../Store-
|
|
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';
|
package/dist/mcp/index.d.ts
CHANGED
|
@@ -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-
|
|
2
|
-
import '../Store-
|
|
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
package/dist/mcp/index.js.map
CHANGED
|
@@ -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\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 * 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":"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","names":["updated"]}
|
package/dist/mcp/index.mjs
CHANGED
package/dist/mcp/index.mjs.map
CHANGED
|
@@ -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\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 * 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":"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","names":["updated"]}
|
package/dist/sdk/index.d.mts
CHANGED
|
@@ -1,63 +1,104 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* SDK shared types — mirror of
|
|
2
|
+
* SDK shared types — mirror of server responses with runtime-safe defaults.
|
|
3
3
|
*/
|
|
4
|
-
interface
|
|
4
|
+
interface Project {
|
|
5
5
|
id: string;
|
|
6
6
|
name: string;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
description: string | null;
|
|
8
|
+
icon: string;
|
|
9
|
+
color: string;
|
|
10
|
+
created_at: number;
|
|
11
|
+
updated_at: number;
|
|
12
|
+
owner: string;
|
|
13
|
+
metadata: Record<string, any>;
|
|
14
|
+
}
|
|
15
|
+
interface Atom {
|
|
16
|
+
id: string;
|
|
11
17
|
project_id: string;
|
|
12
|
-
|
|
13
|
-
|
|
18
|
+
parent_id: string | null;
|
|
19
|
+
title: string;
|
|
20
|
+
summary: string | null;
|
|
21
|
+
type: string;
|
|
22
|
+
icon: string;
|
|
23
|
+
color: string | null;
|
|
24
|
+
status: string;
|
|
25
|
+
metadata: Record<string, any>;
|
|
26
|
+
auto_path?: string;
|
|
27
|
+
path_overridden?: boolean;
|
|
28
|
+
status_updated_at?: number;
|
|
29
|
+
block_count?: number;
|
|
30
|
+
bond_count?: number;
|
|
31
|
+
template_id?: string | null;
|
|
32
|
+
embedding_status?: string | null;
|
|
33
|
+
state: {
|
|
34
|
+
lock: {
|
|
35
|
+
assistantId: string;
|
|
36
|
+
reason: string;
|
|
37
|
+
} | null;
|
|
38
|
+
queue: any[];
|
|
39
|
+
blockCount: number;
|
|
40
|
+
lastActivity: number;
|
|
41
|
+
};
|
|
14
42
|
}
|
|
15
43
|
interface Block {
|
|
16
44
|
id: string;
|
|
17
45
|
atom_id: string;
|
|
18
|
-
|
|
19
|
-
content: string;
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
created_at: string;
|
|
46
|
+
type: string;
|
|
47
|
+
content: string | null;
|
|
48
|
+
order_index: number;
|
|
49
|
+
created_at: number;
|
|
50
|
+
updated_at: number;
|
|
51
|
+
metadata: Record<string, any>;
|
|
25
52
|
}
|
|
26
|
-
interface
|
|
53
|
+
interface Bond {
|
|
27
54
|
id: string;
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
55
|
+
source_id: string;
|
|
56
|
+
target_id: string;
|
|
57
|
+
label: string;
|
|
58
|
+
color: string | null;
|
|
59
|
+
created_at: number;
|
|
31
60
|
}
|
|
32
61
|
interface Assistant {
|
|
33
62
|
id: string;
|
|
34
63
|
name: string;
|
|
35
|
-
role
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
source_id: string;
|
|
43
|
-
target_id: string;
|
|
44
|
-
bond_type: "related" | "child" | "parent" | "reference";
|
|
45
|
-
strength: number;
|
|
46
|
-
created_at: string;
|
|
64
|
+
role: string;
|
|
65
|
+
permissions: Record<string, any>;
|
|
66
|
+
status: string;
|
|
67
|
+
provider: string | null;
|
|
68
|
+
connected_at: number;
|
|
69
|
+
last_seen: number;
|
|
70
|
+
metadata: Record<string, any>;
|
|
47
71
|
}
|
|
48
72
|
interface SearchResult {
|
|
49
|
-
|
|
73
|
+
query: string;
|
|
74
|
+
semantic: boolean;
|
|
75
|
+
count: number;
|
|
76
|
+
results: Array<Atom & {
|
|
50
77
|
similarity?: number;
|
|
51
78
|
score?: number;
|
|
52
79
|
}>;
|
|
53
|
-
time: number;
|
|
54
|
-
total: number;
|
|
55
80
|
}
|
|
56
81
|
interface HealthStatus {
|
|
57
82
|
status: "ok" | "degraded" | "error";
|
|
58
83
|
version: string;
|
|
59
84
|
database: string;
|
|
60
85
|
uptime: number;
|
|
86
|
+
counts: Record<string, number>;
|
|
87
|
+
}
|
|
88
|
+
interface CheckoutResult {
|
|
89
|
+
success: boolean;
|
|
90
|
+
queuePosition?: number;
|
|
91
|
+
}
|
|
92
|
+
interface QueueStatus {
|
|
93
|
+
atomId: string;
|
|
94
|
+
queue: Array<{
|
|
95
|
+
id: string;
|
|
96
|
+
assistant_id: string;
|
|
97
|
+
requested_at: number;
|
|
98
|
+
priority: number;
|
|
99
|
+
status: string;
|
|
100
|
+
reason: string | null;
|
|
101
|
+
}>;
|
|
61
102
|
}
|
|
62
103
|
|
|
63
104
|
interface ClientOptions {
|
|
@@ -74,17 +115,52 @@ declare class MnemosyneClient {
|
|
|
74
115
|
health(): Promise<HealthStatus>;
|
|
75
116
|
listProjects(): Promise<Project[]>;
|
|
76
117
|
getProject(id: string): Promise<Project>;
|
|
77
|
-
createProject(data:
|
|
118
|
+
createProject(data: {
|
|
119
|
+
name: string;
|
|
120
|
+
description?: string;
|
|
121
|
+
}): Promise<Project>;
|
|
78
122
|
deleteProject(id: string): Promise<void>;
|
|
79
123
|
listAtoms(projectId?: string): Promise<Atom[]>;
|
|
80
124
|
getAtom(id: string): Promise<Atom>;
|
|
81
|
-
createAtom(data:
|
|
82
|
-
|
|
125
|
+
createAtom(data: {
|
|
126
|
+
project_id: string;
|
|
127
|
+
title: string;
|
|
128
|
+
type?: string;
|
|
129
|
+
parent_id?: string | null;
|
|
130
|
+
tags?: string[];
|
|
131
|
+
template?: string;
|
|
132
|
+
status?: string;
|
|
133
|
+
auto_path?: string;
|
|
134
|
+
path_overridden?: boolean;
|
|
135
|
+
}): Promise<Atom>;
|
|
136
|
+
updateAtom(id: string, data: {
|
|
137
|
+
title?: string;
|
|
138
|
+
summary?: string;
|
|
139
|
+
tags?: string[];
|
|
140
|
+
status?: string;
|
|
141
|
+
auto_path?: string;
|
|
142
|
+
path_overridden?: boolean;
|
|
143
|
+
parent_id?: string | null;
|
|
144
|
+
}): Promise<Atom>;
|
|
83
145
|
deleteAtom(id: string): Promise<void>;
|
|
84
146
|
getBlocks(atomId: string): Promise<Block[]>;
|
|
85
|
-
createBlock(atomId: string, data:
|
|
86
|
-
|
|
87
|
-
|
|
147
|
+
createBlock(atomId: string, data: {
|
|
148
|
+
type: string;
|
|
149
|
+
content: string;
|
|
150
|
+
tags?: string[];
|
|
151
|
+
}): Promise<Block>;
|
|
152
|
+
updateBlock(id: string, data: {
|
|
153
|
+
content?: string;
|
|
154
|
+
type?: string;
|
|
155
|
+
metadata?: Record<string, any>;
|
|
156
|
+
}): Promise<Block>;
|
|
157
|
+
deleteBlock(id: string): Promise<void>;
|
|
158
|
+
listBonds(atomId?: string): Promise<Bond[]>;
|
|
159
|
+
createBond(atomId: string, data: {
|
|
160
|
+
target_id: string;
|
|
161
|
+
label?: string;
|
|
162
|
+
color?: string;
|
|
163
|
+
}): Promise<Bond>;
|
|
88
164
|
deleteBond(id: string): Promise<void>;
|
|
89
165
|
searchSemantic(query: string, options?: {
|
|
90
166
|
projectId?: string;
|
|
@@ -94,9 +170,36 @@ declare class MnemosyneClient {
|
|
|
94
170
|
projectId?: string;
|
|
95
171
|
limit?: number;
|
|
96
172
|
}): Promise<SearchResult>;
|
|
173
|
+
searchKeyword(query: string, options?: {
|
|
174
|
+
projectId?: string;
|
|
175
|
+
limit?: number;
|
|
176
|
+
}): Promise<SearchResult>;
|
|
97
177
|
listAssistants(): Promise<Assistant[]>;
|
|
98
178
|
getAssistant(id: string): Promise<Assistant>;
|
|
99
|
-
createAssistant(data:
|
|
179
|
+
createAssistant(data: {
|
|
180
|
+
id?: string;
|
|
181
|
+
name: string;
|
|
182
|
+
role: string;
|
|
183
|
+
capabilities?: string[];
|
|
184
|
+
description?: string;
|
|
185
|
+
provider?: string;
|
|
186
|
+
instructions?: string;
|
|
187
|
+
config?: Record<string, any>;
|
|
188
|
+
}): Promise<Assistant>;
|
|
189
|
+
updateAssistant(id: string, data: {
|
|
190
|
+
name?: string;
|
|
191
|
+
role?: string;
|
|
192
|
+
description?: string;
|
|
193
|
+
provider?: string;
|
|
194
|
+
instructions?: string;
|
|
195
|
+
config?: Record<string, any>;
|
|
196
|
+
capabilities?: string[];
|
|
197
|
+
status?: string;
|
|
198
|
+
}): Promise<Assistant>;
|
|
199
|
+
deleteAssistant(id: string): Promise<void>;
|
|
200
|
+
checkoutAtom(atomId: string, mode?: "exclusive" | "shared", reason?: string): Promise<CheckoutResult>;
|
|
201
|
+
releaseCheckout(atomId: string): Promise<boolean>;
|
|
202
|
+
getQueueStatus(atomId: string): Promise<QueueStatus>;
|
|
100
203
|
}
|
|
101
204
|
|
|
102
205
|
export { type Assistant, type Atom, type Block, type Bond, type HealthStatus, MnemosyneClient, type Project, type SearchResult };
|