@backendkit-labs/mcp-server 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/dist/agent-server.d.ts +88 -0
  2. package/dist/agent-server.d.ts.map +1 -0
  3. package/dist/agent-server.js +149 -0
  4. package/dist/agent-server.js.map +1 -0
  5. package/dist/index.d.ts +3 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +6 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/indexer/graph-store.d.ts +48 -0
  10. package/dist/indexer/graph-store.d.ts.map +1 -0
  11. package/dist/indexer/graph-store.js +233 -0
  12. package/dist/indexer/graph-store.js.map +1 -0
  13. package/dist/indexer/indexer.d.ts +17 -0
  14. package/dist/indexer/indexer.d.ts.map +1 -0
  15. package/dist/indexer/indexer.js +180 -0
  16. package/dist/indexer/indexer.js.map +1 -0
  17. package/dist/indexer/languages/go.d.ts +2 -0
  18. package/dist/indexer/languages/go.d.ts.map +1 -0
  19. package/dist/indexer/languages/go.js +36 -0
  20. package/dist/indexer/languages/go.js.map +1 -0
  21. package/dist/indexer/languages/index.d.ts +27 -0
  22. package/dist/indexer/languages/index.d.ts.map +1 -0
  23. package/dist/indexer/languages/index.js +25 -0
  24. package/dist/indexer/languages/index.js.map +1 -0
  25. package/dist/indexer/languages/java.d.ts +2 -0
  26. package/dist/indexer/languages/java.d.ts.map +1 -0
  27. package/dist/indexer/languages/java.js +39 -0
  28. package/dist/indexer/languages/java.js.map +1 -0
  29. package/dist/indexer/languages/python.d.ts +2 -0
  30. package/dist/indexer/languages/python.d.ts.map +1 -0
  31. package/dist/indexer/languages/python.js +41 -0
  32. package/dist/indexer/languages/python.js.map +1 -0
  33. package/dist/indexer/languages/rust.d.ts +2 -0
  34. package/dist/indexer/languages/rust.d.ts.map +1 -0
  35. package/dist/indexer/languages/rust.js +49 -0
  36. package/dist/indexer/languages/rust.js.map +1 -0
  37. package/dist/indexer/languages/typescript.d.ts +2 -0
  38. package/dist/indexer/languages/typescript.d.ts.map +1 -0
  39. package/dist/indexer/languages/typescript.js +47 -0
  40. package/dist/indexer/languages/typescript.js.map +1 -0
  41. package/dist/indexer/languages/utils.d.ts +2 -0
  42. package/dist/indexer/languages/utils.d.ts.map +1 -0
  43. package/dist/indexer/languages/utils.js +52 -0
  44. package/dist/indexer/languages/utils.js.map +1 -0
  45. package/dist/indexer/parser.d.ts +24 -0
  46. package/dist/indexer/parser.d.ts.map +1 -0
  47. package/dist/indexer/parser.js +136 -0
  48. package/dist/indexer/parser.js.map +1 -0
  49. package/dist/indexer/stack-detector.d.ts +3 -0
  50. package/dist/indexer/stack-detector.d.ts.map +1 -0
  51. package/dist/indexer/stack-detector.js +63 -0
  52. package/dist/indexer/stack-detector.js.map +1 -0
  53. package/dist/indexer/watcher.d.ts +8 -0
  54. package/dist/indexer/watcher.d.ts.map +1 -0
  55. package/dist/indexer/watcher.js +83 -0
  56. package/dist/indexer/watcher.js.map +1 -0
  57. package/dist/server.d.ts +3 -0
  58. package/dist/server.d.ts.map +1 -0
  59. package/dist/server.js +308 -0
  60. package/dist/server.js.map +1 -0
  61. package/dist/tools/code/context.d.ts +23 -0
  62. package/dist/tools/code/context.d.ts.map +1 -0
  63. package/dist/tools/code/context.js +93 -0
  64. package/dist/tools/code/context.js.map +1 -0
  65. package/dist/tools/code/search.d.ts +15 -0
  66. package/dist/tools/code/search.d.ts.map +1 -0
  67. package/dist/tools/code/search.js +40 -0
  68. package/dist/tools/code/search.js.map +1 -0
  69. package/dist/tools/skills/install.d.ts +11 -0
  70. package/dist/tools/skills/install.d.ts.map +1 -0
  71. package/dist/tools/skills/install.js +33 -0
  72. package/dist/tools/skills/install.js.map +1 -0
  73. package/dist/tools/skills/list.d.ts +9 -0
  74. package/dist/tools/skills/list.d.ts.map +1 -0
  75. package/dist/tools/skills/list.js +34 -0
  76. package/dist/tools/skills/list.js.map +1 -0
  77. package/dist/tools/skills/search.d.ts +11 -0
  78. package/dist/tools/skills/search.d.ts.map +1 -0
  79. package/dist/tools/skills/search.js +44 -0
  80. package/dist/tools/skills/search.js.map +1 -0
  81. package/package.json +42 -0
@@ -0,0 +1,88 @@
1
+ import { z } from 'zod';
2
+ import { CallbackTransport, type AgentEngine } from '@backendkit-labs/agent-core';
3
+ type ZodRawShape = Record<string, z.ZodTypeAny>;
4
+ /**
5
+ * A single tool exposed by the agent as an MCP tool.
6
+ *
7
+ * @example
8
+ * {
9
+ * name: 'git_summarize',
10
+ * description: 'Summarize recent git commits',
11
+ * schema: { cwd: z.string().optional(), max: z.number().optional() },
12
+ * buildPrompt: ({ cwd, max }) => `Summarize the last ${max ?? 20} commits in ${cwd}.`,
13
+ * }
14
+ */
15
+ export interface AgentToolDef<S extends ZodRawShape = ZodRawShape> {
16
+ name: string;
17
+ description: string;
18
+ /** Zod schema for the tool's input parameters */
19
+ schema: S;
20
+ /** Builds the natural-language prompt sent to the agent */
21
+ buildPrompt: (args: any) => string;
22
+ }
23
+ /**
24
+ * Factory that receives a pre-configured CallbackTransport and returns a
25
+ * ready-to-run AgentEngine. Called once per tool invocation so each call
26
+ * gets isolated state and a fresh output stream.
27
+ *
28
+ * @example
29
+ * engineFactory: (transport) => createCodingEngineFromConfig({
30
+ * appName: 'my-agent',
31
+ * transport,
32
+ * })
33
+ */
34
+ export type AgentEngineFactory = (transport: CallbackTransport) => AgentEngine;
35
+ export interface AgentMCPServerOptions {
36
+ /** Name shown in MCP tool namespaces: mcp:{name}:{tool} */
37
+ name: string;
38
+ version?: string;
39
+ /** Port for HTTP mode. Default: 3001 */
40
+ port?: number;
41
+ /** Host to bind. Default: 127.0.0.1 */
42
+ host?: string;
43
+ tools: AgentToolDef<any>[];
44
+ /**
45
+ * Factory called for every tool invocation.
46
+ * Receives a fresh CallbackTransport so the agent's output can be captured.
47
+ */
48
+ engineFactory: AgentEngineFactory;
49
+ }
50
+ /**
51
+ * Wraps an AgentEngine as a full MCP server.
52
+ *
53
+ * Each registered tool translates its arguments into a natural-language prompt,
54
+ * runs it through the engine, and returns the accumulated text response.
55
+ *
56
+ * Supports two modes:
57
+ * - **HTTP** (`start()`) — `StreamableHTTPServerTransport`, stateful sessions
58
+ * - **Stdio** (`startStdio()`) — for subprocess / pipe-based MCP clients
59
+ *
60
+ * @example
61
+ * const server = new AgentMCPServer({
62
+ * name: 'git-analyst',
63
+ * port: 3010,
64
+ * tools: [{ name: 'git_summarize', ... }],
65
+ * engineFactory: (t) => createCodingEngineFromConfig({ transport: t }),
66
+ * });
67
+ * await server.start(); // HTTP
68
+ * // await server.startStdio(); // stdio
69
+ */
70
+ export declare class AgentMCPServer {
71
+ private readonly opts;
72
+ private httpServer?;
73
+ constructor(opts: AgentMCPServerOptions);
74
+ /** Start in HTTP mode (StreamableHTTP, stateful sessions). */
75
+ start(): Promise<void>;
76
+ /** Start in stdio mode (for subprocess / pipe-based MCP clients). */
77
+ startStdio(): Promise<void>;
78
+ /** Gracefully shut down the HTTP server, force-closing open connections. */
79
+ stop(): Promise<void>;
80
+ private buildMcpServer;
81
+ /**
82
+ * Creates a fresh engine via the factory (cheap — no network calls until run()),
83
+ * runs the prompt, and returns the accumulated token output.
84
+ */
85
+ private runWithEngine;
86
+ }
87
+ export {};
88
+ //# sourceMappingURL=agent-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-server.d.ts","sourceRoot":"","sources":["../src/agent-server.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,KAAK,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAElF,KAAK,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;AAEhD;;;;;;;;;;GAUG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,MAAM,EAAE,CAAC,CAAC;IACV,2DAA2D;IAE3D,WAAW,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,MAAM,CAAC;CACtC;AAED;;;;;;;;;;GAUG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,SAAS,EAAE,iBAAiB,KAAK,WAAW,CAAC;AAE/E,MAAM,WAAW,qBAAqB;IAClC,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;IAC3B;;;OAGG;IACH,aAAa,EAAE,kBAAkB,CAAC;CACrC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,cAAc;IAGX,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,OAAO,CAAC,UAAU,CAAC,CAAkC;gBAExB,IAAI,EAAE,qBAAqB;IAExD,8DAA8D;IACxD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA6D5B,qEAAqE;IAC/D,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAKjC,4EAA4E;IACtE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAc3B,OAAO,CAAC,cAAc;IAqBtB;;;OAGG;IACH,OAAO,CAAC,aAAa;CAYxB"}
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AgentMCPServer = void 0;
4
+ const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
5
+ const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
6
+ const streamableHttp_js_1 = require("@modelcontextprotocol/sdk/server/streamableHttp.js");
7
+ const node_http_1 = require("node:http");
8
+ const node_crypto_1 = require("node:crypto");
9
+ const agent_core_1 = require("@backendkit-labs/agent-core");
10
+ /**
11
+ * Wraps an AgentEngine as a full MCP server.
12
+ *
13
+ * Each registered tool translates its arguments into a natural-language prompt,
14
+ * runs it through the engine, and returns the accumulated text response.
15
+ *
16
+ * Supports two modes:
17
+ * - **HTTP** (`start()`) — `StreamableHTTPServerTransport`, stateful sessions
18
+ * - **Stdio** (`startStdio()`) — for subprocess / pipe-based MCP clients
19
+ *
20
+ * @example
21
+ * const server = new AgentMCPServer({
22
+ * name: 'git-analyst',
23
+ * port: 3010,
24
+ * tools: [{ name: 'git_summarize', ... }],
25
+ * engineFactory: (t) => createCodingEngineFromConfig({ transport: t }),
26
+ * });
27
+ * await server.start(); // HTTP
28
+ * // await server.startStdio(); // stdio
29
+ */
30
+ class AgentMCPServer {
31
+ opts;
32
+ httpServer;
33
+ constructor(opts) {
34
+ this.opts = opts;
35
+ }
36
+ /** Start in HTTP mode (StreamableHTTP, stateful sessions). */
37
+ async start() {
38
+ const sessions = new Map();
39
+ const parseBody = async (req) => {
40
+ const chunks = [];
41
+ for await (const chunk of req)
42
+ chunks.push(chunk);
43
+ const raw = Buffer.concat(chunks).toString('utf-8');
44
+ return raw ? JSON.parse(raw) : undefined;
45
+ };
46
+ this.httpServer = (0, node_http_1.createServer)(async (req, res) => {
47
+ if (req.url !== '/mcp') {
48
+ res.writeHead(404, { 'Content-Type': 'application/json' });
49
+ res.end(JSON.stringify({ error: 'Use POST /mcp' }));
50
+ return;
51
+ }
52
+ try {
53
+ const sessionId = req.headers['mcp-session-id'];
54
+ if (sessionId && sessions.has(sessionId)) {
55
+ const body = req.method === 'POST' ? await parseBody(req) : undefined;
56
+ await sessions.get(sessionId).handleRequest(req, res, body);
57
+ return;
58
+ }
59
+ if (req.method !== 'POST') {
60
+ res.writeHead(400);
61
+ res.end('Session ID required for GET');
62
+ return;
63
+ }
64
+ const body = await parseBody(req);
65
+ const transport = new streamableHttp_js_1.StreamableHTTPServerTransport({
66
+ sessionIdGenerator: () => (0, node_crypto_1.randomUUID)(),
67
+ });
68
+ const srv = this.buildMcpServer();
69
+ await srv.connect(transport);
70
+ await transport.handleRequest(req, res, body);
71
+ if (transport.sessionId) {
72
+ sessions.set(transport.sessionId, transport);
73
+ transport.onclose = () => sessions.delete(transport.sessionId);
74
+ }
75
+ }
76
+ catch (err) {
77
+ if (!res.headersSent) {
78
+ res.writeHead(500);
79
+ res.end(String(err));
80
+ }
81
+ }
82
+ });
83
+ const host = this.opts.host ?? '127.0.0.1';
84
+ const port = this.opts.port ?? 3001;
85
+ await new Promise((resolve, reject) => {
86
+ this.httpServer.once('error', reject);
87
+ this.httpServer.listen(port, host, () => {
88
+ process.stderr.write(`[${this.opts.name}] HTTP server listening on http://${host}:${port}/mcp\n`);
89
+ resolve();
90
+ });
91
+ });
92
+ }
93
+ /** Start in stdio mode (for subprocess / pipe-based MCP clients). */
94
+ async startStdio() {
95
+ const transport = new stdio_js_1.StdioServerTransport();
96
+ await this.buildMcpServer().connect(transport);
97
+ }
98
+ /** Gracefully shut down the HTTP server, force-closing open connections. */
99
+ async stop() {
100
+ if (!this.httpServer)
101
+ return;
102
+ // closeAllConnections() drops keep-alive sockets immediately (Node 18.2+)
103
+ if (typeof this.httpServer.closeAllConnections === 'function') {
104
+ this.httpServer.closeAllConnections();
105
+ }
106
+ await new Promise(resolve => this.httpServer.close(() => resolve()));
107
+ this.httpServer = undefined;
108
+ }
109
+ // ── Private ───────────────────────────────────────────────────────────────
110
+ buildMcpServer() {
111
+ const srv = new mcp_js_1.McpServer({
112
+ name: this.opts.name,
113
+ version: this.opts.version ?? '1.0.0',
114
+ });
115
+ for (const tool of this.opts.tools) {
116
+ srv.tool(tool.name, tool.description, tool.schema, async (args) => {
117
+ const start = Date.now();
118
+ const preview = JSON.stringify(args).slice(0, 80);
119
+ process.stderr.write(`[${this.opts.name}] ← ${tool.name} ${preview}\n`);
120
+ const prompt = tool.buildPrompt(args);
121
+ const result = await this.runWithEngine(prompt);
122
+ process.stderr.write(`[${this.opts.name}] → ${tool.name} ${Date.now() - start}ms\n`);
123
+ return { content: [{ type: 'text', text: result }] };
124
+ });
125
+ }
126
+ return srv;
127
+ }
128
+ /**
129
+ * Creates a fresh engine via the factory (cheap — no network calls until run()),
130
+ * runs the prompt, and returns the accumulated token output.
131
+ */
132
+ runWithEngine(prompt) {
133
+ return new Promise((resolve, reject) => {
134
+ let output = '';
135
+ const transport = new agent_core_1.CallbackTransport((event) => {
136
+ if (event.type === 'token')
137
+ output += event.content;
138
+ if (event.type === 'done')
139
+ resolve(output.trim() || '(no output)');
140
+ if (event.type === 'error')
141
+ reject(new Error(event.message));
142
+ });
143
+ const engine = this.opts.engineFactory(transport);
144
+ engine.run(prompt).catch(reject);
145
+ });
146
+ }
147
+ }
148
+ exports.AgentMCPServer = AgentMCPServer;
149
+ //# sourceMappingURL=agent-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-server.js","sourceRoot":"","sources":["../src/agent-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { AgentMCPServer } from './agent-server';
2
+ export type { AgentToolDef, AgentEngineFactory, AgentMCPServerOptions } from './agent-server';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AgentMCPServer = void 0;
4
+ var agent_server_1 = require("./agent-server");
5
+ Object.defineProperty(exports, "AgentMCPServer", { enumerable: true, get: function () { return agent_server_1.AgentMCPServer; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,+CAAgD;AAAvC,8GAAA,cAAc,OAAA"}
@@ -0,0 +1,48 @@
1
+ export interface NodeRow {
2
+ id: string;
3
+ name: string;
4
+ qualified_name: string;
5
+ kind: string;
6
+ language: string;
7
+ file_path: string;
8
+ start_line: number;
9
+ end_line: number;
10
+ signature: string;
11
+ exported: number;
12
+ updated_at: number;
13
+ }
14
+ export interface EdgeRow {
15
+ source_id: string;
16
+ target_id: string;
17
+ kind: string;
18
+ file_path: string;
19
+ line: number;
20
+ }
21
+ export interface SearchResult extends NodeRow {
22
+ rank: number;
23
+ }
24
+ export declare function nodeId(filePath: string, name: string, startLine: number): string;
25
+ export declare class GraphStore {
26
+ private readonly db;
27
+ constructor(dbPath: string);
28
+ getFileHash(filePath: string): string | undefined;
29
+ upsertFile(filePath: string, language: string, contentHash: string, nodeCount: number): void;
30
+ removeFile(filePath: string): void;
31
+ upsertNodes(nodes: Omit<NodeRow, 'updated_at'>[]): void;
32
+ removeNodesForFile(filePath: string): void;
33
+ upsertEdges(edges: EdgeRow[]): void;
34
+ removeEdgesForFile(filePath: string): void;
35
+ search(query: string, limit?: number): SearchResult[];
36
+ getNode(id: string): NodeRow | undefined;
37
+ getNodesByFile(filePath: string): NodeRow[];
38
+ getOutgoingEdges(nodeId: string): EdgeRow[];
39
+ getIncomingEdges(nodeId: string): EdgeRow[];
40
+ getAllImportSources(): string[];
41
+ stats(): {
42
+ files: number;
43
+ nodes: number;
44
+ edges: number;
45
+ };
46
+ close(): void;
47
+ }
48
+ //# sourceMappingURL=graph-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-store.d.ts","sourceRoot":"","sources":["../../src/indexer/graph-store.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,OAAO;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,OAAO;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAa,SAAQ,OAAO;IACzC,IAAI,EAAE,MAAM,CAAC;CAChB;AAoED,wBAAgB,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAKhF;AAED,qBAAa,UAAU;IACnB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAoB;gBAE3B,MAAM,EAAE,MAAM;IAQ1B,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAOjD,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAY5F,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAWlC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,GAAG,IAAI;IAuBvD,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAM1C,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI;IAWnC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAM1C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,YAAY,EAAE;IAWjD,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAIxC,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,EAAE;IAI3C,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,EAAE;IAI3C,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,EAAE;IAI3C,mBAAmB,IAAI,MAAM,EAAE;IAc/B,KAAK,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;IAOxD,KAAK,IAAI,IAAI;CAGhB"}
@@ -0,0 +1,233 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.GraphStore = void 0;
40
+ exports.nodeId = nodeId;
41
+ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
42
+ const path = __importStar(require("path"));
43
+ const fs = __importStar(require("fs"));
44
+ const crypto_1 = require("crypto");
45
+ const SCHEMA = `
46
+ PRAGMA journal_mode = WAL;
47
+
48
+ CREATE TABLE IF NOT EXISTS files (
49
+ path TEXT PRIMARY KEY,
50
+ language TEXT NOT NULL,
51
+ content_hash TEXT NOT NULL,
52
+ node_count INTEGER DEFAULT 0,
53
+ indexed_at INTEGER NOT NULL
54
+ );
55
+
56
+ CREATE TABLE IF NOT EXISTS nodes (
57
+ id TEXT PRIMARY KEY,
58
+ name TEXT NOT NULL,
59
+ qualified_name TEXT NOT NULL,
60
+ kind TEXT NOT NULL,
61
+ language TEXT NOT NULL,
62
+ file_path TEXT NOT NULL,
63
+ start_line INTEGER NOT NULL,
64
+ end_line INTEGER NOT NULL,
65
+ signature TEXT DEFAULT '',
66
+ exported INTEGER DEFAULT 0,
67
+ updated_at INTEGER NOT NULL
68
+ );
69
+
70
+ CREATE INDEX IF NOT EXISTS idx_nodes_file ON nodes(file_path);
71
+ CREATE INDEX IF NOT EXISTS idx_nodes_name ON nodes(name);
72
+
73
+ CREATE VIRTUAL TABLE IF NOT EXISTS nodes_fts USING fts5(
74
+ name,
75
+ qualified_name,
76
+ signature,
77
+ content=nodes,
78
+ content_rowid=rowid
79
+ );
80
+
81
+ CREATE TRIGGER IF NOT EXISTS nodes_ai AFTER INSERT ON nodes BEGIN
82
+ INSERT INTO nodes_fts(rowid, name, qualified_name, signature)
83
+ VALUES (new.rowid, new.name, new.qualified_name, new.signature);
84
+ END;
85
+
86
+ CREATE TRIGGER IF NOT EXISTS nodes_ad AFTER DELETE ON nodes BEGIN
87
+ INSERT INTO nodes_fts(nodes_fts, rowid, name, qualified_name, signature)
88
+ VALUES ('delete', old.rowid, old.name, old.qualified_name, old.signature);
89
+ END;
90
+
91
+ CREATE TRIGGER IF NOT EXISTS nodes_au AFTER UPDATE ON nodes BEGIN
92
+ INSERT INTO nodes_fts(nodes_fts, rowid, name, qualified_name, signature)
93
+ VALUES ('delete', old.rowid, old.name, old.qualified_name, old.signature);
94
+ INSERT INTO nodes_fts(rowid, name, qualified_name, signature)
95
+ VALUES (new.rowid, new.name, new.qualified_name, new.signature);
96
+ END;
97
+
98
+ CREATE TABLE IF NOT EXISTS edges (
99
+ source_id TEXT NOT NULL,
100
+ target_id TEXT NOT NULL,
101
+ kind TEXT NOT NULL,
102
+ file_path TEXT NOT NULL,
103
+ line INTEGER NOT NULL,
104
+ PRIMARY KEY (source_id, target_id, kind)
105
+ );
106
+
107
+ CREATE INDEX IF NOT EXISTS idx_edges_source ON edges(source_id);
108
+ CREATE INDEX IF NOT EXISTS idx_edges_target ON edges(target_id);
109
+ `;
110
+ function nodeId(filePath, name, startLine) {
111
+ return (0, crypto_1.createHash)('sha1')
112
+ .update(`${filePath}:${name}:${startLine}`)
113
+ .digest('hex')
114
+ .slice(0, 16);
115
+ }
116
+ class GraphStore {
117
+ db;
118
+ constructor(dbPath) {
119
+ fs.mkdirSync(path.dirname(dbPath), { recursive: true });
120
+ this.db = new better_sqlite3_1.default(dbPath);
121
+ this.db.exec(SCHEMA);
122
+ }
123
+ // --- File tracking ---
124
+ getFileHash(filePath) {
125
+ const row = this.db
126
+ .prepare('SELECT content_hash FROM files WHERE path = ?')
127
+ .get(filePath);
128
+ return row?.content_hash;
129
+ }
130
+ upsertFile(filePath, language, contentHash, nodeCount) {
131
+ this.db.prepare(`
132
+ INSERT INTO files (path, language, content_hash, node_count, indexed_at)
133
+ VALUES (?, ?, ?, ?, ?)
134
+ ON CONFLICT(path) DO UPDATE SET
135
+ language = excluded.language,
136
+ content_hash = excluded.content_hash,
137
+ node_count = excluded.node_count,
138
+ indexed_at = excluded.indexed_at
139
+ `).run(filePath, language, contentHash, nodeCount, Date.now());
140
+ }
141
+ removeFile(filePath) {
142
+ const tx = this.db.transaction(() => {
143
+ this.db.prepare('DELETE FROM edges WHERE file_path = ?').run(filePath);
144
+ this.db.prepare('DELETE FROM nodes WHERE file_path = ?').run(filePath);
145
+ this.db.prepare('DELETE FROM files WHERE path = ?').run(filePath);
146
+ });
147
+ tx();
148
+ }
149
+ // --- Nodes ---
150
+ upsertNodes(nodes) {
151
+ const now = Date.now();
152
+ const stmt = this.db.prepare(`
153
+ INSERT INTO nodes (id, name, qualified_name, kind, language, file_path, start_line, end_line, signature, exported, updated_at)
154
+ VALUES (@id, @name, @qualified_name, @kind, @language, @file_path, @start_line, @end_line, @signature, @exported, @updated_at)
155
+ ON CONFLICT(id) DO UPDATE SET
156
+ name = excluded.name,
157
+ qualified_name = excluded.qualified_name,
158
+ kind = excluded.kind,
159
+ signature = excluded.signature,
160
+ exported = excluded.exported,
161
+ start_line = excluded.start_line,
162
+ end_line = excluded.end_line,
163
+ updated_at = excluded.updated_at
164
+ `);
165
+ const tx = this.db.transaction((rows) => {
166
+ for (const row of rows) {
167
+ stmt.run({ ...row, updated_at: now });
168
+ }
169
+ });
170
+ tx(nodes);
171
+ }
172
+ removeNodesForFile(filePath) {
173
+ this.db.prepare('DELETE FROM nodes WHERE file_path = ?').run(filePath);
174
+ }
175
+ // --- Edges ---
176
+ upsertEdges(edges) {
177
+ const stmt = this.db.prepare(`
178
+ INSERT OR REPLACE INTO edges (source_id, target_id, kind, file_path, line)
179
+ VALUES (@source_id, @target_id, @kind, @file_path, @line)
180
+ `);
181
+ const tx = this.db.transaction((rows) => {
182
+ for (const row of rows)
183
+ stmt.run(row);
184
+ });
185
+ tx(edges);
186
+ }
187
+ removeEdgesForFile(filePath) {
188
+ this.db.prepare('DELETE FROM edges WHERE file_path = ?').run(filePath);
189
+ }
190
+ // --- Search ---
191
+ search(query, limit = 20) {
192
+ return this.db.prepare(`
193
+ SELECT n.*, fts.rank
194
+ FROM nodes_fts fts
195
+ JOIN nodes n ON fts.rowid = n.rowid
196
+ WHERE nodes_fts MATCH ?
197
+ ORDER BY fts.rank
198
+ LIMIT ?
199
+ `).all(query, limit);
200
+ }
201
+ getNode(id) {
202
+ return this.db.prepare('SELECT * FROM nodes WHERE id = ?').get(id);
203
+ }
204
+ getNodesByFile(filePath) {
205
+ return this.db.prepare('SELECT * FROM nodes WHERE file_path = ?').all(filePath);
206
+ }
207
+ getOutgoingEdges(nodeId) {
208
+ return this.db.prepare('SELECT * FROM edges WHERE source_id = ?').all(nodeId);
209
+ }
210
+ getIncomingEdges(nodeId) {
211
+ return this.db.prepare('SELECT * FROM edges WHERE target_id = ?').all(nodeId);
212
+ }
213
+ getAllImportSources() {
214
+ const rows = this.db.prepare(`SELECT DISTINCT name FROM nodes WHERE kind = 'import'`).all();
215
+ // Also query edges of kind 'imports' source names
216
+ const edgeRows = this.db.prepare(`SELECT DISTINCT target_id FROM edges WHERE kind = 'imports'`).all();
217
+ return [
218
+ ...rows.map(r => r.name),
219
+ ...edgeRows.map(r => r.target_id),
220
+ ];
221
+ }
222
+ stats() {
223
+ const files = this.db.prepare('SELECT COUNT(*) AS n FROM files').get().n;
224
+ const nodes = this.db.prepare('SELECT COUNT(*) AS n FROM nodes').get().n;
225
+ const edges = this.db.prepare('SELECT COUNT(*) AS n FROM edges').get().n;
226
+ return { files, nodes, edges };
227
+ }
228
+ close() {
229
+ this.db.close();
230
+ }
231
+ }
232
+ exports.GraphStore = GraphStore;
233
+ //# sourceMappingURL=graph-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-store.js","sourceRoot":"","sources":["../../src/indexer/graph-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { GraphStore } from './graph-store';
2
+ export declare class CodeIndexer {
3
+ private readonly store;
4
+ private readonly cwd;
5
+ constructor(store: GraphStore, cwd: string);
6
+ indexFile(filePath: string): Promise<{
7
+ indexed: boolean;
8
+ symbols: number;
9
+ }>;
10
+ removeFile(filePath: string): void;
11
+ indexDirectory(dir: string): Promise<{
12
+ files: number;
13
+ symbols: number;
14
+ }>;
15
+ private collectFiles;
16
+ }
17
+ //# sourceMappingURL=indexer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexer.d.ts","sourceRoot":"","sources":["../../src/indexer/indexer.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAU,MAAM,eAAe,CAAC;AAcnD,qBAAa,WAAW;IAEhB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,GAAG;gBADH,KAAK,EAAE,UAAU,EACjB,GAAG,EAAE,MAAM;IAG1B,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IA4EjF,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI5B,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;YAkBhE,YAAY;CA2B7B"}