graph.do 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types.ts","../src/mcp/server.ts","../src/mcp/stdio-transport.ts","../src/mcp/http-transport.ts"],"sourcesContent":["import { z } from 'zod'\n\n// Core entity schema - represents a node in the knowledge graph\nexport const EntitySchema = z.object({\n name: z.string().describe('Unique identifier for the entity'),\n entityType: z.string().describe('Type classification of the entity'),\n observations: z.array(z.string()).describe('Array of atomic facts about the entity'),\n})\n\nexport type Entity = z.infer<typeof EntitySchema>\n\n// Relation schema - represents a directed edge between entities\nexport const RelationSchema = z.object({\n from: z.string().describe('Source entity name'),\n to: z.string().describe('Target entity name'),\n relationType: z.string().describe('Type of relationship (active voice)'),\n})\n\nexport type Relation = z.infer<typeof RelationSchema>\n\n// Complete knowledge graph structure\nexport const KnowledgeGraphSchema = z.object({\n entities: z.array(EntitySchema),\n relations: z.array(RelationSchema),\n})\n\nexport type KnowledgeGraph = z.infer<typeof KnowledgeGraphSchema>\n\n// Input schemas for MCP tools\nexport const CreateEntitiesInputSchema = z.object({\n entities: z.array(EntitySchema).describe('Array of entities to create'),\n})\n\nexport const CreateRelationsInputSchema = z.object({\n relations: z.array(RelationSchema).describe('Array of relations to create'),\n})\n\nexport const AddObservationsInputSchema = z.object({\n observations: z.array(\n z.object({\n entityName: z.string().describe('Name of the entity to add observations to'),\n contents: z.array(z.string()).describe('Array of observations to add'),\n })\n ).describe('Array of observation additions'),\n})\n\nexport const DeleteEntitiesInputSchema = z.object({\n entityNames: z.array(z.string()).describe('Array of entity names to delete'),\n})\n\nexport const DeleteObservationsInputSchema = z.object({\n deletions: z.array(\n z.object({\n entityName: z.string().describe('Name of the entity'),\n observations: z.array(z.string()).describe('Observations to remove'),\n })\n ).describe('Array of observation deletions'),\n})\n\nexport const DeleteRelationsInputSchema = z.object({\n relations: z.array(RelationSchema).describe('Array of relations to delete'),\n})\n\nexport const SearchNodesInputSchema = z.object({\n query: z.string().describe('Search query to match against entity names, types, and observations'),\n})\n\nexport const OpenNodesInputSchema = z.object({\n names: z.array(z.string()).describe('Array of entity names to retrieve'),\n})\n\n// MongoDB document types (with _id)\nexport interface EntityDocument extends Entity {\n _id?: string\n [key: string]: unknown\n}\n\nexport interface RelationDocument extends Relation {\n _id?: string\n [key: string]: unknown\n}\n\n// Minimal collection interface for flexibility\nexport interface CollectionLike<T> {\n findOne(filter: Record<string, unknown>): Promise<T | null>\n find(filter: Record<string, unknown>): { toArray(): Promise<T[]> }\n insertOne(doc: Partial<T>): Promise<{ insertedId: string }>\n updateOne(filter: Record<string, unknown>, update: Record<string, unknown>): Promise<{ modifiedCount: number }>\n deleteOne(filter: Record<string, unknown>): Promise<{ deletedCount: number }>\n deleteMany(filter: Record<string, unknown>): Promise<{ deletedCount: number }>\n}\n\n// Tool response types\nexport interface AddObservationsResult {\n entityName: string\n addedObservations: string[]\n}\n\nexport interface OperationResult {\n success: boolean\n message: string\n}\n","import { z } from 'zod'\nimport type { KnowledgeGraphManager } from '../graph-manager.js'\nimport {\n CreateEntitiesInputSchema,\n CreateRelationsInputSchema,\n AddObservationsInputSchema,\n DeleteEntitiesInputSchema,\n DeleteObservationsInputSchema,\n DeleteRelationsInputSchema,\n SearchNodesInputSchema,\n OpenNodesInputSchema,\n type KnowledgeGraph,\n} from '../types.js'\n\n// MCP Protocol Types\nexport interface McpToolDefinition {\n name: string\n description: string\n inputSchema: {\n type: 'object'\n properties: Record<string, unknown>\n required?: string[]\n }\n}\n\nexport interface McpToolResponse {\n content: Array<\n | { type: 'text'; text: string }\n | { type: 'resource'; resource: { uri: string; mimeType: string; text: string } }\n >\n isError?: boolean\n}\n\nexport interface McpRequest {\n jsonrpc: '2.0'\n id: string | number\n method: string\n params?: Record<string, unknown>\n}\n\nexport interface McpResponse {\n jsonrpc: '2.0'\n id: string | number\n result?: unknown\n error?: {\n code: number\n message: string\n data?: unknown\n }\n}\n\nexport interface McpServerConfig {\n name?: string\n version?: string\n graphManager: KnowledgeGraphManager\n}\n\n// MCP Error Codes\nconst McpErrorCode = {\n PARSE_ERROR: -32700,\n INVALID_REQUEST: -32600,\n METHOD_NOT_FOUND: -32601,\n INVALID_PARAMS: -32602,\n INTERNAL_ERROR: -32603,\n} as const\n\n/**\n * Creates an MCP server for the knowledge graph\n */\nexport function createGraphMcpServer(config: McpServerConfig) {\n const { name = 'graph.do', version = '0.1.0', graphManager } = config\n\n // Tool definitions matching the memory server schema\n const tools: McpToolDefinition[] = [\n {\n name: 'create_entities',\n description:\n 'Create multiple new entities in the knowledge graph. Entities are nodes with a unique name, type, and observations.',\n inputSchema: {\n type: 'object',\n properties: {\n entities: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n name: { type: 'string', description: 'Unique identifier for the entity' },\n entityType: { type: 'string', description: 'Type classification of the entity' },\n observations: {\n type: 'array',\n items: { type: 'string' },\n description: 'Array of atomic facts about the entity',\n },\n },\n required: ['name', 'entityType', 'observations'],\n },\n description: 'Array of entities to create',\n },\n },\n required: ['entities'],\n },\n },\n {\n name: 'create_relations',\n description:\n 'Create multiple new relations between entities. Relations are directed edges with a type.',\n inputSchema: {\n type: 'object',\n properties: {\n relations: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n from: { type: 'string', description: 'Source entity name' },\n to: { type: 'string', description: 'Target entity name' },\n relationType: {\n type: 'string',\n description: 'Type of relationship (active voice)',\n },\n },\n required: ['from', 'to', 'relationType'],\n },\n description: 'Array of relations to create',\n },\n },\n required: ['relations'],\n },\n },\n {\n name: 'add_observations',\n description:\n 'Add new observations to existing entities. Observations are atomic facts about an entity.',\n inputSchema: {\n type: 'object',\n properties: {\n observations: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n entityName: {\n type: 'string',\n description: 'Name of the entity to add observations to',\n },\n contents: {\n type: 'array',\n items: { type: 'string' },\n description: 'Array of observations to add',\n },\n },\n required: ['entityName', 'contents'],\n },\n description: 'Array of observation additions',\n },\n },\n required: ['observations'],\n },\n },\n {\n name: 'delete_entities',\n description:\n 'Delete multiple entities and their relations from the knowledge graph by name.',\n inputSchema: {\n type: 'object',\n properties: {\n entityNames: {\n type: 'array',\n items: { type: 'string' },\n description: 'Array of entity names to delete',\n },\n },\n required: ['entityNames'],\n },\n },\n {\n name: 'delete_observations',\n description: 'Delete specific observations from entities.',\n inputSchema: {\n type: 'object',\n properties: {\n deletions: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n entityName: { type: 'string', description: 'Name of the entity' },\n observations: {\n type: 'array',\n items: { type: 'string' },\n description: 'Observations to remove',\n },\n },\n required: ['entityName', 'observations'],\n },\n description: 'Array of observation deletions',\n },\n },\n required: ['deletions'],\n },\n },\n {\n name: 'delete_relations',\n description: 'Delete specific relations from the knowledge graph.',\n inputSchema: {\n type: 'object',\n properties: {\n relations: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n from: { type: 'string', description: 'Source entity name' },\n to: { type: 'string', description: 'Target entity name' },\n relationType: { type: 'string', description: 'Type of relationship' },\n },\n required: ['from', 'to', 'relationType'],\n },\n description: 'Array of relations to delete',\n },\n },\n required: ['relations'],\n },\n },\n {\n name: 'read_graph',\n description: 'Read the entire knowledge graph including all entities and relations.',\n inputSchema: {\n type: 'object',\n properties: {},\n },\n },\n {\n name: 'search_nodes',\n description: 'Search for nodes in the knowledge graph by matching names, types, or observations.',\n inputSchema: {\n type: 'object',\n properties: {\n query: {\n type: 'string',\n description: 'Search query to match against entity names, types, and observations',\n },\n },\n required: ['query'],\n },\n },\n {\n name: 'open_nodes',\n description: 'Open specific nodes by name and retrieve them with their inter-relations.',\n inputSchema: {\n type: 'object',\n properties: {\n names: {\n type: 'array',\n items: { type: 'string' },\n description: 'Array of entity names to retrieve',\n },\n },\n required: ['names'],\n },\n },\n ]\n\n // Tool handlers\n const toolHandlers: Record<string, (input: unknown) => Promise<McpToolResponse>> = {\n create_entities: async (input) => {\n const { entities } = CreateEntitiesInputSchema.parse(input)\n const created = await graphManager.createEntities(entities)\n return formatGraphResponse(created, `Created ${created.length} entities`)\n },\n\n create_relations: async (input) => {\n const { relations } = CreateRelationsInputSchema.parse(input)\n const created = await graphManager.createRelations(relations)\n return formatGraphResponse(created, `Created ${created.length} relations`)\n },\n\n add_observations: async (input) => {\n const { observations } = AddObservationsInputSchema.parse(input)\n const results = await graphManager.addObservations(observations)\n return formatGraphResponse(results, 'Observations added')\n },\n\n delete_entities: async (input) => {\n const { entityNames } = DeleteEntitiesInputSchema.parse(input)\n const result = await graphManager.deleteEntities(entityNames)\n return {\n content: [{ type: 'text', text: result.message }],\n }\n },\n\n delete_observations: async (input) => {\n const { deletions } = DeleteObservationsInputSchema.parse(input)\n const result = await graphManager.deleteObservations(deletions)\n return {\n content: [{ type: 'text', text: result.message }],\n }\n },\n\n delete_relations: async (input) => {\n const { relations } = DeleteRelationsInputSchema.parse(input)\n const result = await graphManager.deleteRelations(relations)\n return {\n content: [{ type: 'text', text: result.message }],\n }\n },\n\n read_graph: async () => {\n const graph = await graphManager.readGraph()\n return formatGraphResponse(graph, `Graph contains ${graph.entities.length} entities and ${graph.relations.length} relations`)\n },\n\n search_nodes: async (input) => {\n const { query } = SearchNodesInputSchema.parse(input)\n const graph = await graphManager.searchNodes(query)\n return formatGraphResponse(graph, `Found ${graph.entities.length} matching entities`)\n },\n\n open_nodes: async (input) => {\n const { names } = OpenNodesInputSchema.parse(input)\n const graph = await graphManager.openNodes(names)\n return formatGraphResponse(graph, `Opened ${graph.entities.length} entities`)\n },\n }\n\n function formatGraphResponse(data: unknown, summary: string): McpToolResponse {\n return {\n content: [\n { type: 'text', text: summary },\n {\n type: 'resource',\n resource: {\n uri: 'graph://result',\n mimeType: 'application/json',\n text: JSON.stringify(data, null, 2),\n },\n },\n ],\n }\n }\n\n // Handle MCP JSON-RPC requests\n async function handleRequest(request: McpRequest): Promise<McpResponse> {\n const { id, method, params } = request\n\n try {\n switch (method) {\n case 'initialize':\n return {\n jsonrpc: '2.0',\n id,\n result: {\n protocolVersion: '2024-11-05',\n capabilities: {\n tools: {},\n },\n serverInfo: {\n name,\n version,\n },\n },\n }\n\n case 'notifications/initialized':\n return { jsonrpc: '2.0', id, result: {} }\n\n case 'tools/list':\n return {\n jsonrpc: '2.0',\n id,\n result: { tools },\n }\n\n case 'tools/call': {\n const toolName = (params as { name: string })?.name\n const toolInput = (params as { arguments?: unknown })?.arguments ?? {}\n\n const handler = toolHandlers[toolName]\n if (!handler) {\n return {\n jsonrpc: '2.0',\n id,\n error: {\n code: McpErrorCode.METHOD_NOT_FOUND,\n message: `Unknown tool: ${toolName}`,\n },\n }\n }\n\n try {\n const result = await handler(toolInput)\n return { jsonrpc: '2.0', id, result }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err))\n return {\n jsonrpc: '2.0',\n id,\n result: {\n content: [{ type: 'text', text: `Error: ${error.message}` }],\n isError: true,\n },\n }\n }\n }\n\n case 'ping':\n return { jsonrpc: '2.0', id, result: {} }\n\n default:\n return {\n jsonrpc: '2.0',\n id,\n error: {\n code: McpErrorCode.METHOD_NOT_FOUND,\n message: `Unknown method: ${method}`,\n },\n }\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err))\n return {\n jsonrpc: '2.0',\n id,\n error: {\n code: McpErrorCode.INTERNAL_ERROR,\n message: error.message,\n },\n }\n }\n }\n\n return {\n name,\n version,\n tools,\n handleRequest,\n graphManager,\n }\n}\n\nexport type GraphMcpServer = ReturnType<typeof createGraphMcpServer>\n","import type { GraphMcpServer, McpRequest, McpResponse } from './server.js'\n\n/**\n * Stdio transport for MCP server\n * Reads JSON-RPC messages from stdin, writes responses to stdout\n */\nexport async function runStdioTransport(server: GraphMcpServer): Promise<void> {\n const stdin = process.stdin\n const stdout = process.stdout\n const stderr = process.stderr\n\n stdin.setEncoding('utf8')\n\n let buffer = ''\n\n stderr.write(`${server.name} v${server.version} MCP server started (stdio)\\n`)\n\n stdin.on('data', async (chunk: string) => {\n buffer += chunk\n\n // Process complete lines\n while (true) {\n const newlineIndex = buffer.indexOf('\\n')\n if (newlineIndex === -1) break\n\n const line = buffer.slice(0, newlineIndex).trim()\n buffer = buffer.slice(newlineIndex + 1)\n\n if (!line) continue\n\n try {\n const request = JSON.parse(line) as McpRequest\n const response = await server.handleRequest(request)\n stdout.write(JSON.stringify(response) + '\\n')\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err))\n const errorResponse: McpResponse = {\n jsonrpc: '2.0',\n id: 0,\n error: {\n code: -32700,\n message: `Parse error: ${error.message}`,\n },\n }\n stdout.write(JSON.stringify(errorResponse) + '\\n')\n }\n }\n })\n\n stdin.on('end', () => {\n stderr.write('stdin closed, shutting down\\n')\n process.exit(0)\n })\n\n stdin.on('error', (err) => {\n stderr.write(`stdin error: ${err.message}\\n`)\n process.exit(1)\n })\n\n // Keep the process alive\n await new Promise(() => {})\n}\n\n/**\n * Create a simple in-process MCP client for testing\n */\nexport function createStdioClient(server: GraphMcpServer) {\n let requestId = 0\n\n async function call(method: string, params?: Record<string, unknown>): Promise<unknown> {\n const request: McpRequest = {\n jsonrpc: '2.0',\n id: ++requestId,\n method,\n params,\n }\n\n const response = await server.handleRequest(request)\n\n if (response.error) {\n throw new Error(`MCP Error ${response.error.code}: ${response.error.message}`)\n }\n\n return response.result\n }\n\n return {\n initialize: () => call('initialize'),\n listTools: () => call('tools/list'),\n callTool: (name: string, args?: unknown) =>\n call('tools/call', { name, arguments: args }),\n ping: () => call('ping'),\n }\n}\n","import type { GraphMcpServer, McpRequest, McpResponse } from './server.js'\n\nexport interface HttpTransportConfig {\n server: GraphMcpServer\n}\n\n/**\n * Create HTTP request handler for MCP server\n * Compatible with Cloudflare Workers fetch handler\n */\nexport function createHttpTransport(config: HttpTransportConfig) {\n const { server } = config\n\n async function handleRequest(request: Request): Promise<Response> {\n const url = new URL(request.url)\n\n // CORS headers\n const corsHeaders = {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',\n 'Access-Control-Allow-Headers': 'Content-Type',\n }\n\n // Handle CORS preflight\n if (request.method === 'OPTIONS') {\n return new Response(null, { status: 204, headers: corsHeaders })\n }\n\n // GET /mcp - Server info and capabilities\n if (request.method === 'GET' && (url.pathname === '/mcp' || url.pathname === '/mcp/')) {\n const initResponse = await server.handleRequest({\n jsonrpc: '2.0',\n id: 'info',\n method: 'initialize',\n })\n\n return new Response(JSON.stringify(initResponse.result, null, 2), {\n headers: {\n 'Content-Type': 'application/json',\n ...corsHeaders,\n },\n })\n }\n\n // GET /mcp/tools - List available tools\n if (request.method === 'GET' && url.pathname === '/mcp/tools') {\n const toolsResponse = await server.handleRequest({\n jsonrpc: '2.0',\n id: 'tools',\n method: 'tools/list',\n })\n\n return new Response(JSON.stringify(toolsResponse.result, null, 2), {\n headers: {\n 'Content-Type': 'application/json',\n ...corsHeaders,\n },\n })\n }\n\n // POST /mcp - JSON-RPC endpoint\n if (request.method === 'POST' && (url.pathname === '/mcp' || url.pathname === '/mcp/')) {\n try {\n const body = await request.json()\n\n // Handle batch requests\n if (Array.isArray(body)) {\n const responses = await Promise.all(\n body.map((req: McpRequest) => server.handleRequest(req))\n )\n return new Response(JSON.stringify(responses), {\n headers: {\n 'Content-Type': 'application/json',\n ...corsHeaders,\n },\n })\n }\n\n // Single request\n const response = await server.handleRequest(body as McpRequest)\n return new Response(JSON.stringify(response), {\n headers: {\n 'Content-Type': 'application/json',\n ...corsHeaders,\n },\n })\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err))\n const errorResponse: McpResponse = {\n jsonrpc: '2.0',\n id: 0,\n error: {\n code: -32700,\n message: `Parse error: ${error.message}`,\n },\n }\n return new Response(JSON.stringify(errorResponse), {\n status: 400,\n headers: {\n 'Content-Type': 'application/json',\n ...corsHeaders,\n },\n })\n }\n }\n\n // POST /mcp/tools/:toolName - Convenience endpoint for direct tool calls\n const toolMatch = url.pathname.match(/^\\/mcp\\/tools\\/([^/]+)$/)\n if (request.method === 'POST' && toolMatch) {\n const toolName = toolMatch[1]\n try {\n const args = request.headers.get('content-length') !== '0' ? await request.json() : {}\n\n const response = await server.handleRequest({\n jsonrpc: '2.0',\n id: 'tool-call',\n method: 'tools/call',\n params: { name: toolName, arguments: args },\n })\n\n return new Response(JSON.stringify(response.result ?? response.error), {\n status: response.error ? 400 : 200,\n headers: {\n 'Content-Type': 'application/json',\n ...corsHeaders,\n },\n })\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err))\n return new Response(\n JSON.stringify({\n content: [{ type: 'text', text: `Error: ${error.message}` }],\n isError: true,\n }),\n {\n status: 400,\n headers: {\n 'Content-Type': 'application/json',\n ...corsHeaders,\n },\n }\n )\n }\n }\n\n return new Response('Not Found', { status: 404, headers: corsHeaders })\n }\n\n return { handleRequest }\n}\n\n/**\n * Server-Sent Events transport for streaming responses\n */\nexport function createSseTransport(config: HttpTransportConfig) {\n const { server } = config\n\n function handleSse(request: Request): Response {\n const encoder = new TextEncoder()\n\n const stream = new ReadableStream({\n async start(controller) {\n // Send initial connection message\n controller.enqueue(\n encoder.encode(`data: ${JSON.stringify({ type: 'connected', server: server.name })}\\n\\n`)\n )\n\n // For SSE, we'd typically set up a subscription mechanism\n // For now, just keep the connection alive with pings\n const pingInterval = setInterval(() => {\n try {\n controller.enqueue(encoder.encode(`data: ${JSON.stringify({ type: 'ping' })}\\n\\n`))\n } catch {\n clearInterval(pingInterval)\n }\n }, 30000)\n\n // Clean up on abort\n request.signal.addEventListener('abort', () => {\n clearInterval(pingInterval)\n controller.close()\n })\n },\n })\n\n return new Response(stream, {\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n 'Access-Control-Allow-Origin': '*',\n },\n })\n }\n\n return { handleSse }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,203 @@
1
+ // src/graph-manager.ts
2
+ var KnowledgeGraphManager = class {
3
+ entities;
4
+ relations;
5
+ constructor(config) {
6
+ this.entities = config.entities;
7
+ this.relations = config.relations;
8
+ }
9
+ /**
10
+ * Create new entities (ignores duplicates)
11
+ */
12
+ async createEntities(entities) {
13
+ const created = [];
14
+ for (const entity of entities) {
15
+ const existing = await this.entities.findOne({ name: entity.name });
16
+ if (!existing) {
17
+ await this.entities.insertOne({
18
+ name: entity.name,
19
+ entityType: entity.entityType,
20
+ observations: entity.observations
21
+ });
22
+ created.push(entity);
23
+ }
24
+ }
25
+ return created;
26
+ }
27
+ /**
28
+ * Create new relations (skips duplicates)
29
+ */
30
+ async createRelations(relations) {
31
+ const created = [];
32
+ for (const relation of relations) {
33
+ const existing = await this.relations.findOne({
34
+ from: relation.from,
35
+ to: relation.to,
36
+ relationType: relation.relationType
37
+ });
38
+ if (!existing) {
39
+ await this.relations.insertOne({
40
+ from: relation.from,
41
+ to: relation.to,
42
+ relationType: relation.relationType
43
+ });
44
+ created.push(relation);
45
+ }
46
+ }
47
+ return created;
48
+ }
49
+ /**
50
+ * Add observations to existing entities
51
+ * Throws if entity doesn't exist
52
+ */
53
+ async addObservations(observations) {
54
+ const results = [];
55
+ for (const { entityName, contents } of observations) {
56
+ const entity = await this.entities.findOne({ name: entityName });
57
+ if (!entity) {
58
+ throw new Error(`Entity with name "${entityName}" not found`);
59
+ }
60
+ const existingObservations = new Set(entity.observations);
61
+ const newObservations = contents.filter((obs) => !existingObservations.has(obs));
62
+ if (newObservations.length > 0) {
63
+ await this.entities.updateOne(
64
+ { name: entityName },
65
+ { $push: { observations: { $each: newObservations } } }
66
+ );
67
+ }
68
+ results.push({
69
+ entityName,
70
+ addedObservations: newObservations
71
+ });
72
+ }
73
+ return results;
74
+ }
75
+ /**
76
+ * Delete entities and cascade delete their relations
77
+ */
78
+ async deleteEntities(entityNames) {
79
+ const deleteResult = await this.entities.deleteMany({
80
+ name: { $in: entityNames }
81
+ });
82
+ await this.relations.deleteMany({
83
+ $or: [{ from: { $in: entityNames } }, { to: { $in: entityNames } }]
84
+ });
85
+ return {
86
+ success: true,
87
+ message: `Deleted ${deleteResult.deletedCount} entities and their relations`
88
+ };
89
+ }
90
+ /**
91
+ * Delete specific observations from entities (silent on non-existent)
92
+ */
93
+ async deleteObservations(deletions) {
94
+ let totalRemoved = 0;
95
+ for (const { entityName, observations } of deletions) {
96
+ const entity = await this.entities.findOne({ name: entityName });
97
+ if (entity) {
98
+ const observationsToRemove = new Set(observations);
99
+ const remaining = entity.observations.filter((obs) => !observationsToRemove.has(obs));
100
+ const removed = entity.observations.length - remaining.length;
101
+ if (removed > 0) {
102
+ await this.entities.updateOne({ name: entityName }, { $set: { observations: remaining } });
103
+ totalRemoved += removed;
104
+ }
105
+ }
106
+ }
107
+ return {
108
+ success: true,
109
+ message: `Removed ${totalRemoved} observations`
110
+ };
111
+ }
112
+ /**
113
+ * Delete specific relations (silent on non-existent)
114
+ */
115
+ async deleteRelations(relations) {
116
+ let totalDeleted = 0;
117
+ for (const relation of relations) {
118
+ const result = await this.relations.deleteOne({
119
+ from: relation.from,
120
+ to: relation.to,
121
+ relationType: relation.relationType
122
+ });
123
+ totalDeleted += result.deletedCount;
124
+ }
125
+ return {
126
+ success: true,
127
+ message: `Deleted ${totalDeleted} relations`
128
+ };
129
+ }
130
+ /**
131
+ * Read the complete knowledge graph
132
+ */
133
+ async readGraph() {
134
+ const entities = await this.entities.find({}).toArray();
135
+ const relations = await this.relations.find({}).toArray();
136
+ return {
137
+ entities: entities.map(({ _id, ...entity }) => entity),
138
+ relations: relations.map(({ _id, ...relation }) => relation)
139
+ };
140
+ }
141
+ /**
142
+ * Search nodes by query (matches name, type, or observations)
143
+ */
144
+ async searchNodes(query) {
145
+ const lowerQuery = query.toLowerCase();
146
+ const allEntities = await this.entities.find({}).toArray();
147
+ const matchingEntities = allEntities.filter((entity) => {
148
+ const nameMatch = entity.name.toLowerCase().includes(lowerQuery);
149
+ const typeMatch = entity.entityType.toLowerCase().includes(lowerQuery);
150
+ const observationMatch = entity.observations.some(
151
+ (obs) => obs.toLowerCase().includes(lowerQuery)
152
+ );
153
+ return nameMatch || typeMatch || observationMatch;
154
+ });
155
+ const matchingNames = new Set(matchingEntities.map((e) => e.name));
156
+ const relations = await this.relations.find({}).toArray();
157
+ const matchingRelations = relations.filter(
158
+ (rel) => matchingNames.has(rel.from) && matchingNames.has(rel.to)
159
+ );
160
+ return {
161
+ entities: matchingEntities.map(({ _id, ...entity }) => entity),
162
+ relations: matchingRelations.map(({ _id, ...relation }) => relation)
163
+ };
164
+ }
165
+ /**
166
+ * Open specific nodes by name and return them with their inter-relations
167
+ */
168
+ async openNodes(names) {
169
+ const nameSet = new Set(names);
170
+ const entities = await this.entities.find({ name: { $in: names } }).toArray();
171
+ const relations = await this.relations.find({
172
+ from: { $in: names },
173
+ to: { $in: names }
174
+ }).toArray();
175
+ return {
176
+ entities: entities.map(({ _id, ...entity }) => entity),
177
+ relations: relations.map(({ _id, ...relation }) => relation)
178
+ };
179
+ }
180
+ /**
181
+ * Get a single entity by name
182
+ */
183
+ async getEntity(name) {
184
+ const entity = await this.entities.findOne({ name });
185
+ if (!entity) return null;
186
+ const { _id, ...rest } = entity;
187
+ return rest;
188
+ }
189
+ /**
190
+ * Get all relations for an entity
191
+ */
192
+ async getRelationsFor(entityName) {
193
+ const relations = await this.relations.find({
194
+ $or: [{ from: entityName }, { to: entityName }]
195
+ }).toArray();
196
+ return relations.map(({ _id, ...relation }) => relation);
197
+ }
198
+ };
199
+
200
+ export {
201
+ KnowledgeGraphManager
202
+ };
203
+ //# sourceMappingURL=chunk-VXRM2HKS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/graph-manager.ts"],"sourcesContent":["import type {\n Entity,\n EntityDocument,\n Relation,\n RelationDocument,\n KnowledgeGraph,\n AddObservationsResult,\n OperationResult,\n CollectionLike,\n} from './types.js'\n\nexport interface GraphManagerConfig {\n entities: CollectionLike<EntityDocument>\n relations: CollectionLike<RelationDocument>\n}\n\n/**\n * KnowledgeGraphManager - Manages entities and relations stored in MongoDB\n */\nexport class KnowledgeGraphManager {\n private entities: CollectionLike<EntityDocument>\n private relations: CollectionLike<RelationDocument>\n\n constructor(config: GraphManagerConfig) {\n this.entities = config.entities\n this.relations = config.relations\n }\n\n /**\n * Create new entities (ignores duplicates)\n */\n async createEntities(entities: Entity[]): Promise<Entity[]> {\n const created: Entity[] = []\n\n for (const entity of entities) {\n // Check if entity already exists\n const existing = await this.entities.findOne({ name: entity.name })\n if (!existing) {\n await this.entities.insertOne({\n name: entity.name,\n entityType: entity.entityType,\n observations: entity.observations,\n })\n created.push(entity)\n }\n }\n\n return created\n }\n\n /**\n * Create new relations (skips duplicates)\n */\n async createRelations(relations: Relation[]): Promise<Relation[]> {\n const created: Relation[] = []\n\n for (const relation of relations) {\n // Check if relation already exists\n const existing = await this.relations.findOne({\n from: relation.from,\n to: relation.to,\n relationType: relation.relationType,\n })\n if (!existing) {\n await this.relations.insertOne({\n from: relation.from,\n to: relation.to,\n relationType: relation.relationType,\n })\n created.push(relation)\n }\n }\n\n return created\n }\n\n /**\n * Add observations to existing entities\n * Throws if entity doesn't exist\n */\n async addObservations(\n observations: Array<{ entityName: string; contents: string[] }>\n ): Promise<AddObservationsResult[]> {\n const results: AddObservationsResult[] = []\n\n for (const { entityName, contents } of observations) {\n const entity = await this.entities.findOne({ name: entityName })\n if (!entity) {\n throw new Error(`Entity with name \"${entityName}\" not found`)\n }\n\n // Filter out observations that already exist\n const existingObservations = new Set(entity.observations)\n const newObservations = contents.filter((obs) => !existingObservations.has(obs))\n\n if (newObservations.length > 0) {\n await this.entities.updateOne(\n { name: entityName },\n { $push: { observations: { $each: newObservations } } }\n )\n }\n\n results.push({\n entityName,\n addedObservations: newObservations,\n })\n }\n\n return results\n }\n\n /**\n * Delete entities and cascade delete their relations\n */\n async deleteEntities(entityNames: string[]): Promise<OperationResult> {\n // Delete all matching entities\n const deleteResult = await this.entities.deleteMany({\n name: { $in: entityNames },\n })\n\n // Cascade delete relations involving these entities\n await this.relations.deleteMany({\n $or: [{ from: { $in: entityNames } }, { to: { $in: entityNames } }],\n })\n\n return {\n success: true,\n message: `Deleted ${deleteResult.deletedCount} entities and their relations`,\n }\n }\n\n /**\n * Delete specific observations from entities (silent on non-existent)\n */\n async deleteObservations(\n deletions: Array<{ entityName: string; observations: string[] }>\n ): Promise<OperationResult> {\n let totalRemoved = 0\n\n for (const { entityName, observations } of deletions) {\n const entity = await this.entities.findOne({ name: entityName })\n if (entity) {\n const observationsToRemove = new Set(observations)\n const remaining = entity.observations.filter((obs) => !observationsToRemove.has(obs))\n const removed = entity.observations.length - remaining.length\n\n if (removed > 0) {\n await this.entities.updateOne({ name: entityName }, { $set: { observations: remaining } })\n totalRemoved += removed\n }\n }\n }\n\n return {\n success: true,\n message: `Removed ${totalRemoved} observations`,\n }\n }\n\n /**\n * Delete specific relations (silent on non-existent)\n */\n async deleteRelations(relations: Relation[]): Promise<OperationResult> {\n let totalDeleted = 0\n\n for (const relation of relations) {\n const result = await this.relations.deleteOne({\n from: relation.from,\n to: relation.to,\n relationType: relation.relationType,\n })\n totalDeleted += result.deletedCount\n }\n\n return {\n success: true,\n message: `Deleted ${totalDeleted} relations`,\n }\n }\n\n /**\n * Read the complete knowledge graph\n */\n async readGraph(): Promise<KnowledgeGraph> {\n const entities = await this.entities.find({}).toArray()\n const relations = await this.relations.find({}).toArray()\n\n return {\n entities: entities.map(({ _id, ...entity }) => entity),\n relations: relations.map(({ _id, ...relation }) => relation),\n }\n }\n\n /**\n * Search nodes by query (matches name, type, or observations)\n */\n async searchNodes(query: string): Promise<KnowledgeGraph> {\n const lowerQuery = query.toLowerCase()\n\n // Search entities where name, type, or any observation matches\n const allEntities = await this.entities.find({}).toArray()\n const matchingEntities = allEntities.filter((entity) => {\n const nameMatch = entity.name.toLowerCase().includes(lowerQuery)\n const typeMatch = entity.entityType.toLowerCase().includes(lowerQuery)\n const observationMatch = entity.observations.some((obs) =>\n obs.toLowerCase().includes(lowerQuery)\n )\n return nameMatch || typeMatch || observationMatch\n })\n\n const matchingNames = new Set(matchingEntities.map((e) => e.name))\n\n // Get relations between matching entities\n const relations = await this.relations.find({}).toArray()\n const matchingRelations = relations.filter(\n (rel) => matchingNames.has(rel.from) && matchingNames.has(rel.to)\n )\n\n return {\n entities: matchingEntities.map(({ _id, ...entity }) => entity),\n relations: matchingRelations.map(({ _id, ...relation }) => relation),\n }\n }\n\n /**\n * Open specific nodes by name and return them with their inter-relations\n */\n async openNodes(names: string[]): Promise<KnowledgeGraph> {\n const nameSet = new Set(names)\n\n // Find all requested entities\n const entities = await this.entities.find({ name: { $in: names } }).toArray()\n\n // Find relations between the requested entities\n const relations = await this.relations\n .find({\n from: { $in: names },\n to: { $in: names },\n })\n .toArray()\n\n return {\n entities: entities.map(({ _id, ...entity }) => entity),\n relations: relations.map(({ _id, ...relation }) => relation),\n }\n }\n\n /**\n * Get a single entity by name\n */\n async getEntity(name: string): Promise<Entity | null> {\n const entity = await this.entities.findOne({ name })\n if (!entity) return null\n const { _id, ...rest } = entity\n return rest\n }\n\n /**\n * Get all relations for an entity\n */\n async getRelationsFor(entityName: string): Promise<Relation[]> {\n const relations = await this.relations\n .find({\n $or: [{ from: entityName }, { to: entityName }],\n })\n .toArray()\n\n return relations.map(({ _id, ...relation }) => relation)\n }\n}\n"],"mappings":"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","names":[]}