{"version":3,"sources":["../src/tools/knowledge-graph.ts"],"names":["get","Graph","set","tool","z","dfsFromNode","bfsFromNode","dijkstra","edgePathFromNodePath","groups","louvain","del"],"mappings":"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","file":"chunk-VOAH4YVV.cjs","sourcesContent":["import { tool } from '@strands-agents/sdk'\nimport { z } from 'zod'\nimport { get, set, del } from 'idb-keyval'\nimport Graph from 'graphology'\nimport { bfsFromNode, dfsFromNode } from 'graphology-traversal'\nimport { dijkstra, edgePathFromNodePath } from 'graphology-shortest-path'\nimport louvain from 'graphology-communities-louvain'\n\nconst KG_KEY = 'careless-v2-kg'\nlet cached: Graph | null = null\n\nasync function load(): Promise<Graph> {\n  if (cached) return cached\n  const blob = await get<any>(KG_KEY)\n  const g = new Graph({ multi: false, allowSelfLoops: true, type: 'directed' })\n  if (blob && blob.attributes !== undefined) {\n    try { g.import(blob) } catch (e) { console.warn('[kg] import failed, starting fresh:', e) }\n  }\n  cached = g\n  return g\n}\n\nasync function save(g: Graph): Promise<void> {\n  cached = g\n  await set(KG_KEY, g.export())\n}\n\n// Canonical id: lowercased, whitespace→dash, no punctuation\nfunction nodeId(type: string, name: string): string {\n  const norm = (s: string) => s.toLowerCase().trim().replace(/\\s+/g, '-').replace(/[^a-z0-9:_-]/g, '')\n  return `${norm(type)}:${norm(name)}`\n}\n\nfunction ok(data: Record<string, unknown>) {\n  return JSON.stringify({ status: 'success', ...data })\n}\nfunction fail(e: unknown) {\n  return JSON.stringify({ status: 'error', error: (e as Error).message || String(e) })\n}\n\nexport const kgAddEntityTool = tool({\n  name: 'kg_add_entity',\n  description: 'Add or update an entity node. Returns node id + total count.',\n  inputSchema: z.object({\n    name: z.string(),\n    type: z.string().describe('Entity type (person/project/technology/concept/etc.)'),\n    properties: z.record(z.string(), z.string()).optional(),\n  }),\n  callback: async (input) => {\n    try {\n      const g = await load()\n      const id = nodeId(input.type, input.name)\n      const created = !g.hasNode(id)\n      if (created) {\n        g.addNode(id, {\n          name: input.name.toLowerCase().trim(),  // normalize on write\n          type: input.type.toLowerCase().trim(),\n          ...(input.properties || {}),\n          created: Date.now(),\n        })\n      } else {\n        g.mergeNodeAttributes(id, { ...(input.properties || {}), updated: Date.now() })\n      }\n      await save(g)\n      return ok({ id, created, total_nodes: g.order, total_edges: g.size })\n    } catch (e) { return fail(e) }\n  },\n})\n\nexport const kgAddRelationTool = tool({\n  name: 'kg_add_relation',\n  description: 'Add directed edge between two entities. Auto-creates missing nodes with type=\"unknown\".',\n  inputSchema: z.object({\n    from: z.string().describe('Source node id (type:name format)'),\n    to: z.string().describe('Target node id (type:name format)'),\n    relation: z.string().describe('Edge label (e.g. works_on, knows, depends_on)'),\n    weight: z.number().optional().describe('Edge weight (default 1)'),\n    properties: z.record(z.string(), z.string()).optional(),\n  }),\n  callback: async (input) => {\n    try {\n      const g = await load()\n      const autoCreated: string[] = []\n      for (const raw of [input.from, input.to]) {\n        if (!g.hasNode(raw)) {\n          const [t, n] = raw.includes(':') ? raw.split(':', 2) : ['unknown', raw]\n          g.addNode(raw, { name: n, type: t || 'unknown', created: Date.now(), auto_created: true })\n          autoCreated.push(raw)\n        }\n      }\n      const attrs = {\n        relation: input.relation,\n        weight: input.weight ?? 1,\n        ...(input.properties || {}),\n        created: Date.now(),\n      }\n      const key = `${input.from}->${input.to}:${input.relation}`\n      if (g.hasEdge(key)) g.mergeEdgeAttributes(key, attrs)\n      else g.addEdgeWithKey(key, input.from, input.to, attrs)\n      await save(g)\n      return ok({ edge: key, auto_created: autoCreated, total_nodes: g.order, total_edges: g.size })\n    } catch (e) { return fail(e) }\n  },\n})\n\nexport const kgQueryTool = tool({\n  name: 'kg_query',\n  description: 'Query nodes by case-insensitive name substring and/or type. Optionally include adjacent edges.',\n  inputSchema: z.object({\n    name: z.string().optional(),\n    type: z.string().optional(),\n    includeRelations: z.boolean().optional(),\n    limit: z.number().optional(),\n  }),\n  callback: async (input) => {\n    try {\n      const g = await load()\n      const q = input.name?.toLowerCase().trim()\n      const typeFilter = input.type?.toLowerCase().trim()\n      const matches: any[] = []\n      g.forEachNode((id, attrs) => {\n        if (typeFilter && String(attrs.type).toLowerCase() !== typeFilter) return\n        if (q) {\n          const nameStr = String(attrs.name || '').toLowerCase()\n          if (!nameStr.includes(q) && !id.toLowerCase().includes(q)) return\n        }\n        matches.push({ id, ...attrs })\n      })\n      const limited = matches.slice(0, input.limit ?? 50)\n      let edges: any[] | undefined\n      if (input.includeRelations) {\n        const ids = new Set(limited.map(m => m.id))\n        edges = []\n        g.forEachEdge((key, attrs, src, tgt) => {\n          if (ids.has(src) || ids.has(tgt)) edges!.push({ key, from: src, to: tgt, ...attrs })\n        })\n      }\n      return ok({ count: matches.length, returned: limited.length, nodes: limited, ...(edges ? { edges } : {}) })\n    } catch (e) { return fail(e) }\n  },\n})\n\nexport const kgNeighborsTool = tool({\n  name: 'kg_neighbors',\n  description: '1-hop neighbors of a node. Direction: in/out/both.',\n  inputSchema: z.object({\n    id: z.string(),\n    direction: z.enum(['in', 'out', 'both']).optional(),\n  }),\n  callback: async (input) => {\n    try {\n      const g = await load()\n      if (!g.hasNode(input.id)) return fail(new Error(`node not found: ${input.id}`))\n      const dir = input.direction ?? 'both'\n      const out: any[] = []\n      const seen = new Set<string>()\n      const add = (nid: string, edgeKey: string, role: 'in' | 'out') => {\n        const k = nid + '|' + edgeKey\n        if (seen.has(k)) return\n        seen.add(k)\n        out.push({ id: nid, role, edge: edgeKey, ...g.getNodeAttributes(nid), edgeAttrs: g.getEdgeAttributes(edgeKey) })\n      }\n      if (dir === 'out' || dir === 'both') g.forEachOutEdge(input.id, (k, _a, _s, t) => add(t, k, 'out'))\n      if (dir === 'in'  || dir === 'both') g.forEachInEdge(input.id, (k, _a, s) => add(s, k, 'in'))\n      return ok({ id: input.id, count: out.length, neighbors: out })\n    } catch (e) { return fail(e) }\n  },\n})\n\nexport const kgTraverseTool = tool({\n  name: 'kg_traverse',\n  description: 'BFS/DFS traversal from a node. Returns visited nodes up to maxDepth (default 3). Optional relation filter.',\n  inputSchema: z.object({\n    start: z.string().describe('Starting node id'),\n    mode: z.enum(['bfs', 'dfs']).optional(),\n    maxDepth: z.number().optional(),\n    relationFilter: z.string().optional(),\n  }),\n  callback: async (input) => {\n    try {\n      const g = await load()\n      if (!g.hasNode(input.start)) return fail(new Error(`node not found: ${input.start}`))\n      const maxDepth = input.maxDepth ?? 3\n      const visited: { id: string; depth: number; attrs: any }[] = []\n      const walker = input.mode === 'dfs' ? dfsFromNode : bfsFromNode\n      let target: Graph = g\n      if (input.relationFilter) {\n        target = g.copy()\n        const toDrop: string[] = []\n        target.forEachEdge((k, a) => { if (a.relation !== input.relationFilter) toDrop.push(k) })\n        toDrop.forEach(k => target.dropEdge(k))\n      }\n      walker(target, input.start, (node, attrs, depth) => {\n        if (depth > maxDepth) return true\n        visited.push({ id: node, depth, attrs })\n        return false\n      })\n      return ok({ start: input.start, mode: input.mode ?? 'bfs', maxDepth, count: visited.length, visited })\n    } catch (e) { return fail(e) }\n  },\n})\n\nexport const kgShortestPathTool = tool({\n  name: 'kg_shortest_path',\n  description: 'Shortest path between two nodes. Returns hops + total cost. Weighted uses edge.weight attribute via Dijkstra.',\n  inputSchema: z.object({\n    from: z.string(),\n    to: z.string(),\n    weighted: z.boolean().optional(),\n  }),\n  callback: async (input) => {\n    try {\n      const g = await load()\n      if (!g.hasNode(input.from)) return fail(new Error(`node not found: ${input.from}`))\n      if (!g.hasNode(input.to)) return fail(new Error(`node not found: ${input.to}`))\n      const path: string[] | null = input.weighted\n        ? dijkstra.bidirectional(g, input.from, input.to, 'weight')\n        : dijkstra.bidirectional(g, input.from, input.to)\n      if (!path) return ok({ found: false })\n      const edgePath = edgePathFromNodePath(g, path)\n      // Compute total cost\n      let cost = 0\n      for (const ek of edgePath) {\n        const w = g.getEdgeAttribute(ek, 'weight')\n        cost += typeof w === 'number' ? w : 1\n      }\n      return ok({\n        found: true,\n        hops: path.length - 1,\n        cost: input.weighted ? cost : path.length - 1,\n        weighted: !!input.weighted,\n        nodes: path,\n        edges: edgePath.map(k => ({ key: k, ...g.getEdgeAttributes(k) })),\n      })\n    } catch (e) { return fail(e) }\n  },\n})\n\nexport const kgCommunitiesTool = tool({\n  name: 'kg_communities',\n  description: 'Louvain community detection. Works on an undirected projection of the graph.',\n  inputSchema: z.object({}),\n  callback: async () => {\n    try {\n      const g = await load()\n      if (g.order === 0) return ok({ count: 0, communities: {} })\n      if (g.size === 0) {\n        // Each node is its own community\n        const groups: Record<string, string[]> = {}\n        g.forEachNode(n => { groups[n] = [n] })\n        return ok({ count: g.order, communities: groups, note: 'no edges; each node isolated' })\n      }\n      // Build undirected simple projection — louvain requires undirected\n      const ug = new Graph({ type: 'undirected', allowSelfLoops: false, multi: false })\n      g.forEachNode((n, a) => ug.addNode(n, { ...a }))\n      g.forEachEdge((_k, a, s, t) => {\n        if (s === t) return  // skip self-loops\n        if (ug.hasEdge(s, t)) {\n          // Accumulate weight\n          const prev = (ug.getEdgeAttribute(s, t, 'weight') as number) || 1\n          ug.setEdgeAttribute(s, t, 'weight', prev + ((a.weight as number) || 1))\n        } else {\n          ug.addEdge(s, t, { weight: (a.weight as number) || 1 })\n        }\n      })\n      const map = louvain(ug, { getEdgeWeight: 'weight' }) as Record<string, number>\n      const groups: Record<string, string[]> = {}\n      for (const [node, comm] of Object.entries(map)) {\n        const key = String(comm)\n        ;(groups[key] ||= []).push(node)\n      }\n      return ok({ count: Object.keys(groups).length, communities: groups, nodes: g.order, edges: g.size })\n    } catch (e) { return fail(e) }\n  },\n})\n\nexport const kgStatsTool = tool({\n  name: 'kg_stats',\n  description: 'Graph stats: node/edge counts, density, type + relation distribution, top-degree nodes.',\n  inputSchema: z.object({}),\n  callback: async () => {\n    try {\n      const g = await load()\n      const types: Record<string, number> = {}\n      const relations: Record<string, number> = {}\n      const degrees: { id: string; degree: number; name: string; type: string }[] = []\n      g.forEachNode((id, a) => {\n        const t = String(a.type || 'unknown')\n        types[t] = (types[t] || 0) + 1\n        degrees.push({ id, degree: g.degree(id), name: String(a.name || id), type: t })\n      })\n      g.forEachEdge((_k, a) => {\n        const r = String(a.relation || 'unknown')\n        relations[r] = (relations[r] || 0) + 1\n      })\n      degrees.sort((a, b) => b.degree - a.degree)\n      const density = g.order > 1 ? g.size / (g.order * (g.order - 1)) : 0\n      return ok({\n        nodes: g.order, edges: g.size,\n        density: +density.toFixed(4),\n        types, relations,\n        top_nodes: degrees.slice(0, 10),\n      })\n    } catch (e) { return fail(e) }\n  },\n})\n\nexport const kgDeleteTool = tool({\n  name: 'kg_delete',\n  description: 'Delete a node and all its edges.',\n  inputSchema: z.object({ id: z.string() }),\n  callback: async (input) => {\n    try {\n      const g = await load()\n      if (!g.hasNode(input.id)) return fail(new Error(`node not found: ${input.id}`))\n      const edges = g.degree(input.id)\n      g.dropNode(input.id)\n      await save(g)\n      return ok({ deleted: input.id, edges_removed: edges, total_nodes: g.order, total_edges: g.size })\n    } catch (e) { return fail(e) }\n  },\n})\n\nexport const kgClearTool = tool({\n  name: 'kg_clear',\n  description: 'Clear the entire knowledge graph. Requires confirm=true.',\n  inputSchema: z.object({ confirm: z.boolean() }),\n  callback: async (input) => {\n    try {\n      if (!input.confirm) return fail(new Error('pass confirm=true to clear'))\n      await del(KG_KEY)\n      cached = new Graph({ multi: false, allowSelfLoops: true, type: 'directed' })\n      return ok({ cleared: true, total_nodes: 0, total_edges: 0 })\n    } catch (e) { return fail(e) }\n  },\n})\n\nexport const kgExportTool = tool({\n  name: 'kg_export',\n  description: 'Export graph as serializable JSON (graphology format).',\n  inputSchema: z.object({}),\n  callback: async () => {\n    try {\n      const g = await load()\n      return ok({ graph: g.export(), nodes: g.order, edges: g.size })\n    } catch (e) { return fail(e) }\n  },\n})\n\nexport const kgImportTool = tool({\n  name: 'kg_import',\n  description: 'Import graph from graphology JSON (replaces current graph). Pass confirm=true.',\n  inputSchema: z.object({\n    graph: z.any().describe('Graphology-format JSON (output of kg_export)'),\n    confirm: z.boolean(),\n  }),\n  callback: async (input) => {\n    try {\n      if (!input.confirm) return fail(new Error('pass confirm=true to replace current graph'))\n      const g = new Graph({ multi: false, allowSelfLoops: true, type: 'directed' })\n      g.import(input.graph)\n      await save(g)\n      return ok({ imported: true, total_nodes: g.order, total_edges: g.size })\n    } catch (e) { return fail(e) }\n  },\n})\n\nexport const KNOWLEDGE_GRAPH_TOOLS = [\n  kgAddEntityTool, kgAddRelationTool,\n  kgQueryTool, kgNeighborsTool,\n  kgTraverseTool, kgShortestPathTool,\n  kgCommunitiesTool, kgStatsTool,\n  kgDeleteTool, kgClearTool,\n  kgExportTool, kgImportTool,\n]\n\nexport { load as loadGraph, KG_KEY }\n"]}