continuum-ai-mcp 1.0.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 (115) hide show
  1. package/README.md +274 -0
  2. package/dist/cli/index.d.ts +3 -0
  3. package/dist/cli/index.d.ts.map +1 -0
  4. package/dist/cli/index.js +125 -0
  5. package/dist/cli/index.js.map +1 -0
  6. package/dist/database/Database.d.ts +4 -0
  7. package/dist/database/Database.d.ts.map +1 -0
  8. package/dist/database/Database.js +83 -0
  9. package/dist/database/Database.js.map +1 -0
  10. package/dist/database/schema.sql +121 -0
  11. package/dist/knowledge/KnowledgeEngine.d.ts +63 -0
  12. package/dist/knowledge/KnowledgeEngine.d.ts.map +1 -0
  13. package/dist/knowledge/KnowledgeEngine.js +190 -0
  14. package/dist/knowledge/KnowledgeEngine.js.map +1 -0
  15. package/dist/languages/LanguageRegistry.d.ts +38 -0
  16. package/dist/languages/LanguageRegistry.d.ts.map +1 -0
  17. package/dist/languages/LanguageRegistry.js +233 -0
  18. package/dist/languages/LanguageRegistry.js.map +1 -0
  19. package/dist/languages/definitions/cpp.d.ts +2 -0
  20. package/dist/languages/definitions/cpp.d.ts.map +1 -0
  21. package/dist/languages/definitions/cpp.js +25 -0
  22. package/dist/languages/definitions/cpp.js.map +1 -0
  23. package/dist/languages/definitions/csharp.d.ts +2 -0
  24. package/dist/languages/definitions/csharp.d.ts.map +1 -0
  25. package/dist/languages/definitions/csharp.js +40 -0
  26. package/dist/languages/definitions/csharp.js.map +1 -0
  27. package/dist/languages/definitions/go.d.ts +2 -0
  28. package/dist/languages/definitions/go.d.ts.map +1 -0
  29. package/dist/languages/definitions/go.js +21 -0
  30. package/dist/languages/definitions/go.js.map +1 -0
  31. package/dist/languages/definitions/java.d.ts +2 -0
  32. package/dist/languages/definitions/java.d.ts.map +1 -0
  33. package/dist/languages/definitions/java.js +32 -0
  34. package/dist/languages/definitions/java.js.map +1 -0
  35. package/dist/languages/definitions/javascript.d.ts +2 -0
  36. package/dist/languages/definitions/javascript.d.ts.map +1 -0
  37. package/dist/languages/definitions/javascript.js +26 -0
  38. package/dist/languages/definitions/javascript.js.map +1 -0
  39. package/dist/languages/definitions/kotlin.d.ts +2 -0
  40. package/dist/languages/definitions/kotlin.d.ts.map +1 -0
  41. package/dist/languages/definitions/kotlin.js +36 -0
  42. package/dist/languages/definitions/kotlin.js.map +1 -0
  43. package/dist/languages/definitions/markdown.d.ts +2 -0
  44. package/dist/languages/definitions/markdown.d.ts.map +1 -0
  45. package/dist/languages/definitions/markdown.js +18 -0
  46. package/dist/languages/definitions/markdown.js.map +1 -0
  47. package/dist/languages/definitions/php.d.ts +2 -0
  48. package/dist/languages/definitions/php.d.ts.map +1 -0
  49. package/dist/languages/definitions/php.js +27 -0
  50. package/dist/languages/definitions/php.js.map +1 -0
  51. package/dist/languages/definitions/python.d.ts +2 -0
  52. package/dist/languages/definitions/python.d.ts.map +1 -0
  53. package/dist/languages/definitions/python.js +17 -0
  54. package/dist/languages/definitions/python.js.map +1 -0
  55. package/dist/languages/definitions/ruby.d.ts +2 -0
  56. package/dist/languages/definitions/ruby.d.ts.map +1 -0
  57. package/dist/languages/definitions/ruby.js +16 -0
  58. package/dist/languages/definitions/ruby.js.map +1 -0
  59. package/dist/languages/definitions/rust.d.ts +2 -0
  60. package/dist/languages/definitions/rust.d.ts.map +1 -0
  61. package/dist/languages/definitions/rust.js +28 -0
  62. package/dist/languages/definitions/rust.js.map +1 -0
  63. package/dist/languages/definitions/sql.d.ts +2 -0
  64. package/dist/languages/definitions/sql.d.ts.map +1 -0
  65. package/dist/languages/definitions/sql.js +36 -0
  66. package/dist/languages/definitions/sql.js.map +1 -0
  67. package/dist/languages/definitions/swift.d.ts +2 -0
  68. package/dist/languages/definitions/swift.d.ts.map +1 -0
  69. package/dist/languages/definitions/swift.js +40 -0
  70. package/dist/languages/definitions/swift.js.map +1 -0
  71. package/dist/languages/definitions/typescript.d.ts +2 -0
  72. package/dist/languages/definitions/typescript.d.ts.map +1 -0
  73. package/dist/languages/definitions/typescript.js +40 -0
  74. package/dist/languages/definitions/typescript.js.map +1 -0
  75. package/dist/mcp/McpServer.d.ts +2 -0
  76. package/dist/mcp/McpServer.d.ts.map +1 -0
  77. package/dist/mcp/McpServer.js +262 -0
  78. package/dist/mcp/McpServer.js.map +1 -0
  79. package/dist/parser/IncrementalParser.d.ts +25 -0
  80. package/dist/parser/IncrementalParser.d.ts.map +1 -0
  81. package/dist/parser/IncrementalParser.js +195 -0
  82. package/dist/parser/IncrementalParser.js.map +1 -0
  83. package/dist/schema/ISchemaAdapter.d.ts +20 -0
  84. package/dist/schema/ISchemaAdapter.d.ts.map +1 -0
  85. package/dist/schema/ISchemaAdapter.js +3 -0
  86. package/dist/schema/ISchemaAdapter.js.map +1 -0
  87. package/dist/schema/MssqlAdapter.d.ts +6 -0
  88. package/dist/schema/MssqlAdapter.d.ts.map +1 -0
  89. package/dist/schema/MssqlAdapter.js +139 -0
  90. package/dist/schema/MssqlAdapter.js.map +1 -0
  91. package/dist/schema/MySqlAdapter.d.ts +6 -0
  92. package/dist/schema/MySqlAdapter.d.ts.map +1 -0
  93. package/dist/schema/MySqlAdapter.js +77 -0
  94. package/dist/schema/MySqlAdapter.js.map +1 -0
  95. package/dist/schema/PostgresAdapter.d.ts +6 -0
  96. package/dist/schema/PostgresAdapter.d.ts.map +1 -0
  97. package/dist/schema/PostgresAdapter.js +78 -0
  98. package/dist/schema/PostgresAdapter.js.map +1 -0
  99. package/dist/schema/SchemaReader.d.ts +17 -0
  100. package/dist/schema/SchemaReader.d.ts.map +1 -0
  101. package/dist/schema/SchemaReader.js +82 -0
  102. package/dist/schema/SchemaReader.js.map +1 -0
  103. package/dist/session/SessionEngine.d.ts +40 -0
  104. package/dist/session/SessionEngine.d.ts.map +1 -0
  105. package/dist/session/SessionEngine.js +131 -0
  106. package/dist/session/SessionEngine.js.map +1 -0
  107. package/dist/utils/logger.d.ts +3 -0
  108. package/dist/utils/logger.d.ts.map +1 -0
  109. package/dist/utils/logger.js +54 -0
  110. package/dist/utils/logger.js.map +1 -0
  111. package/dist/watcher/FileWatcher.d.ts +19 -0
  112. package/dist/watcher/FileWatcher.d.ts.map +1 -0
  113. package/dist/watcher/FileWatcher.js +146 -0
  114. package/dist/watcher/FileWatcher.js.map +1 -0
  115. package/package.json +54 -0
@@ -0,0 +1,262 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
4
+ const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
5
+ const zod_1 = require("zod");
6
+ const SessionEngine_1 = require("../session/SessionEngine");
7
+ const FileWatcher_1 = require("../watcher/FileWatcher");
8
+ const IncrementalParser_1 = require("../parser/IncrementalParser");
9
+ const KnowledgeEngine_1 = require("../knowledge/KnowledgeEngine");
10
+ const SchemaReader_1 = require("../schema/SchemaReader");
11
+ const Database_1 = require("../database/Database");
12
+ const logger_1 = require("../utils/logger");
13
+ // Environment variables are injected by the MCP client (IDE) or Docker.
14
+ // We explicitly do NOT use dotenv here to prevent `dotenvx` from polluting stdout.
15
+ // ── Bootstrap ──────────────────────────────────────────────────────────────
16
+ const session = new SessionEngine_1.SessionEngine();
17
+ const parser = new IncrementalParser_1.IncrementalParser();
18
+ const watcher = new FileWatcher_1.FileWatcher(session, parser);
19
+ const knowledge = new KnowledgeEngine_1.KnowledgeEngine();
20
+ const schema = new SchemaReader_1.SchemaReader();
21
+ const watchPaths = (process.env.WATCH_PATHS || './src').split(',').map((p) => p.trim());
22
+ watcher.start(watchPaths);
23
+ // ── MCP Server ─────────────────────────────────────────────────────────────
24
+ const server = new mcp_js_1.McpServer({
25
+ name: 'continuum',
26
+ version: '1.0.0',
27
+ });
28
+ // ── Observability: log every tool call ─────────────────────────────────────
29
+ function logToolCall(toolName, input, result, durationMs) {
30
+ try {
31
+ const db = (0, Database_1.getDb)();
32
+ db.prepare(`
33
+ INSERT INTO tool_usage (session_id, tool_name, input_json, tokens_returned, duration_ms, called_at)
34
+ VALUES (?, ?, ?, ?, ?, unixepoch())
35
+ `).run(session.getSessionId(), toolName, JSON.stringify(input), result.length, durationMs);
36
+ }
37
+ catch {
38
+ // Don't let observability crash the server
39
+ }
40
+ }
41
+ function withTiming(fn) {
42
+ const start = Date.now();
43
+ return fn().then((result) => [result, Date.now() - start]);
44
+ }
45
+ // ── Tool 1: get_session ────────────────────────────────────────────────────
46
+ server.tool('get_session', 'Get current session state — goal, touched files, task decisions, and next steps. ' +
47
+ 'Call this immediately after any context compaction to resume work seamlessly.', {}, async () => {
48
+ const [state, ms] = await withTiming(async () => session.getSession());
49
+ const result = JSON.stringify(state, null, 2);
50
+ logToolCall('get_session', {}, result, ms);
51
+ return { content: [{ type: 'text', text: result }] };
52
+ });
53
+ // ── Tool 2: save_task ──────────────────────────────────────────────────────
54
+ // @ts-ignore
55
+ server.tool('save_task', 'Save structured task state — goal, decisions, next steps, open questions. ' +
56
+ 'Call this proactively when context is ~60% full to enable seamless recovery.', {
57
+ goal: zod_1.z.string().describe('What you are currently trying to accomplish'),
58
+ decisions: zod_1.z.array(zod_1.z.string()).describe('Architectural/implementation decisions made'),
59
+ next_steps: zod_1.z.array(zod_1.z.string()).describe('Concrete next steps remaining'),
60
+ open_questions: zod_1.z.array(zod_1.z.string()).optional().describe('Unresolved questions'),
61
+ }, async (input) => {
62
+ const [taskId, ms] = await withTiming(async () => session.saveTask({
63
+ goal: input.goal,
64
+ decisions: input.decisions,
65
+ next_steps: input.next_steps,
66
+ open_questions: input.open_questions ?? [],
67
+ }));
68
+ const result = JSON.stringify({ saved: true, task_id: taskId });
69
+ logToolCall('save_task', input, result, ms);
70
+ return { content: [{ type: 'text', text: result }] };
71
+ });
72
+ // ── Tool 3: get_touched_files ──────────────────────────────────────────────
73
+ server.tool('get_touched_files', 'Get all files modified, created, or deleted in this session. ' +
74
+ 'Check before reading a file to see if you already processed it.', {}, async () => {
75
+ const [files, ms] = await withTiming(async () => session.getTouchedFiles());
76
+ const result = JSON.stringify(files, null, 2);
77
+ logToolCall('get_touched_files', {}, result, ms);
78
+ return { content: [{ type: 'text', text: result }] };
79
+ });
80
+ // ── Tool 4: find_related_files ─────────────────────────────────────────────
81
+ server.tool('find_related_files', 'Find all files and symbols related to a feature, class, or concept. ' +
82
+ 'Returns matches across all layers (controller / service / repository / UI / test).', {
83
+ query: zod_1.z.string().describe('Feature name, class name, or symbol to search for'),
84
+ }, async (input) => {
85
+ const [related, ms] = await withTiming(async () => knowledge.findRelated(input.query));
86
+ const result = JSON.stringify(related, null, 2);
87
+ logToolCall('find_related_files', input, result, ms);
88
+ return { content: [{ type: 'text', text: result }] };
89
+ });
90
+ // ── Tool 5: get_schema ─────────────────────────────────────────────────────
91
+ server.tool('get_schema', 'Get the live database schema for a table — columns, types, nullability, PKs, FKs, indexes. ' +
92
+ 'Supports MSSQL, PostgreSQL, and MySQL. Results cached for 1 hour.', {
93
+ table: zod_1.z.string().describe('Table name, e.g. "Orders", "users"'),
94
+ }, async (input) => {
95
+ if (!schema.isEnabled()) {
96
+ const err = JSON.stringify({
97
+ error: 'Schema reader not configured. Set DB_TYPE and connection env vars in .env',
98
+ });
99
+ logToolCall('get_schema', input, err, 0);
100
+ return { content: [{ type: 'text', text: err }] };
101
+ }
102
+ const [tableSchema, ms] = await withTiming(() => schema.getSchema(input.table));
103
+ if (!tableSchema) {
104
+ const err = JSON.stringify({ error: `Table "${input.table}" not found or DB unreachable` });
105
+ logToolCall('get_schema', input, err, ms);
106
+ return { content: [{ type: 'text', text: err }] };
107
+ }
108
+ const result = JSON.stringify(tableSchema, null, 2);
109
+ logToolCall('get_schema', input, result, ms);
110
+ return { content: [{ type: 'text', text: result }] };
111
+ });
112
+ // ── Tool 6: get_dependencies ───────────────────────────────────────────────
113
+ server.tool('get_dependencies', 'Get all symbols defined in a file and their outgoing relationships. ' +
114
+ 'Useful for understanding impact before making changes.', {
115
+ file_path: zod_1.z.string().describe('Partial or full path to the file'),
116
+ }, async (input) => {
117
+ const db = (0, Database_1.getDb)();
118
+ const start = Date.now();
119
+ const file = db
120
+ .prepare('SELECT id FROM files WHERE path LIKE ?')
121
+ .get(`%${input.file_path}%`);
122
+ if (!file) {
123
+ const result = JSON.stringify({ error: 'File not found in index. Is it within WATCH_PATHS?' });
124
+ logToolCall('get_dependencies', input, result, Date.now() - start);
125
+ return { content: [{ type: 'text', text: result }] };
126
+ }
127
+ const symbols = db
128
+ .prepare('SELECT id, name, kind, start_line, end_line FROM symbols WHERE file_id = ?')
129
+ .all(file.id);
130
+ const outgoing = db
131
+ .prepare(`
132
+ SELECT r.to_name, r.kind
133
+ FROM relationships r
134
+ JOIN symbols s ON r.from_id = s.id
135
+ WHERE s.file_id = ?
136
+ `)
137
+ .all(file.id);
138
+ const result = JSON.stringify({ symbols, outgoing_relationships: outgoing }, null, 2);
139
+ logToolCall('get_dependencies', input, result, Date.now() - start);
140
+ return { content: [{ type: 'text', text: result }] };
141
+ });
142
+ // ── Tool 7: get_session_report ─────────────────────────────────────────────
143
+ server.tool('get_session_report', 'Get a report for the current session — tool calls, files touched, compactions, estimated token savings.', {}, async () => {
144
+ const db = (0, Database_1.getDb)();
145
+ const start = Date.now();
146
+ const sess = db
147
+ .prepare('SELECT * FROM sessions WHERE id = ?')
148
+ .get(session.getSessionId());
149
+ const toolCalls = db
150
+ .prepare(`
151
+ SELECT tool_name, COUNT(*) AS count,
152
+ SUM(tokens_returned) AS total_tokens,
153
+ AVG(duration_ms) AS avg_duration_ms
154
+ FROM tool_usage
155
+ WHERE session_id = ?
156
+ GROUP BY tool_name
157
+ ORDER BY count DESC
158
+ `)
159
+ .all(session.getSessionId());
160
+ const touchedCount = db
161
+ .prepare('SELECT COUNT(DISTINCT path) AS count FROM touched_files WHERE session_id = ?')
162
+ .get(session.getSessionId());
163
+ const getSessionCalls = toolCalls.find((t) => t.tool_name === 'get_session')?.count ?? 0;
164
+ const estimatedTokensSaved = getSessionCalls * 5000 + touchedCount.count * 800;
165
+ const report = {
166
+ session_id: sess.id,
167
+ uptime_minutes: Math.round(session.getUptimeSeconds() / 60),
168
+ compactions_survived: sess.compaction_count,
169
+ files_touched: touchedCount.count,
170
+ tool_calls: toolCalls,
171
+ estimated_tokens_saved: estimatedTokensSaved,
172
+ };
173
+ const result = JSON.stringify(report, null, 2);
174
+ logToolCall('get_session_report', {}, result, Date.now() - start);
175
+ return { content: [{ type: 'text', text: result }] };
176
+ });
177
+ // ── Tool 8: search_symbols ─────────────────────────────────────────────────
178
+ // @ts-ignore
179
+ server.tool('search_symbols', 'Full-text search across all indexed symbols (classes, functions, methods, etc.) ' +
180
+ 'in the entire codebase. Returns matching symbols with file locations.', {
181
+ query: zod_1.z.string().describe('Symbol name or partial name to search for'),
182
+ kind: zod_1.z.enum(['class', 'function', 'method', 'interface', 'enum', 'struct', 'trait', 'module', 'property', 'constructor', 'type', 'any'])
183
+ .optional()
184
+ .default('any')
185
+ .describe('Filter by symbol kind (default: any)'),
186
+ limit: zod_1.z.number().int().min(1).max(100).optional().default(30).describe('Max results'),
187
+ }, async (input) => {
188
+ const start = Date.now();
189
+ let results = knowledge.searchSymbols(input.query, input.limit);
190
+ if (input.kind && input.kind !== 'any') {
191
+ results = results.filter((r) => r.kind === input.kind);
192
+ }
193
+ const result = JSON.stringify({ count: results.length, results }, null, 2);
194
+ logToolCall('search_symbols', input, result, Date.now() - start);
195
+ return { content: [{ type: 'text', text: result }] };
196
+ });
197
+ // ── Tool 9: list_languages ─────────────────────────────────────────────────
198
+ server.tool('list_languages', 'List all programming languages that Continuum supports, with file and symbol counts ' +
199
+ 'for indexed files in the current project.', {}, async () => {
200
+ const start = Date.now();
201
+ const breakdown = knowledge.getLanguageBreakdown();
202
+ const stats = knowledge.getProjectStats();
203
+ const result = JSON.stringify({
204
+ total_files: stats.total_files,
205
+ total_symbols: stats.total_symbols,
206
+ last_indexed: stats.last_indexed,
207
+ languages: breakdown,
208
+ }, null, 2);
209
+ logToolCall('list_languages', {}, result, Date.now() - start);
210
+ return { content: [{ type: 'text', text: result }] };
211
+ });
212
+ // ── Tool 10: health_check ──────────────────────────────────────────────────
213
+ server.tool('health_check', 'Check Continuum server health — uptime, database status, indexed file count, active session.', {}, async () => {
214
+ const start = Date.now();
215
+ const db = (0, Database_1.getDb)();
216
+ const fileCount = db.prepare('SELECT COUNT(*) AS n FROM files').get().n;
217
+ const symbolCount = db.prepare('SELECT COUNT(*) AS n FROM symbols').get().n;
218
+ const meta = db
219
+ .prepare("SELECT key, value FROM metadata WHERE key IN ('version', 'boot_count', 'first_started')")
220
+ .all();
221
+ const metaMap = Object.fromEntries(meta.map((m) => [m.key, m.value]));
222
+ const health = {
223
+ status: 'ok',
224
+ version: metaMap['version'] ?? '1.0.0',
225
+ uptime_s: session.getUptimeSeconds(),
226
+ session_id: session.getSessionId(),
227
+ boot_count: Number(metaMap['boot_count'] ?? 1),
228
+ db_status: 'connected',
229
+ indexed_files: fileCount,
230
+ indexed_symbols: symbolCount,
231
+ schema_reader: schema.isEnabled() ? process.env.DB_TYPE : 'disabled',
232
+ };
233
+ const result = JSON.stringify(health, null, 2);
234
+ logToolCall('health_check', {}, result, Date.now() - start);
235
+ return { content: [{ type: 'text', text: result }] };
236
+ });
237
+ // ── Start ──────────────────────────────────────────────────────────────────
238
+ async function main() {
239
+ const transport = new stdio_js_1.StdioServerTransport();
240
+ await server.connect(transport);
241
+ logger_1.logger.info({ sessionId: session.getSessionId() }, 'Continuum MCP server v1.0.0 running');
242
+ }
243
+ main().catch((err) => {
244
+ logger_1.logger.error({ err }, 'Server failed to start');
245
+ process.exit(1);
246
+ });
247
+ // ── Graceful Shutdown ──────────────────────────────────────────────────────
248
+ function shutdown(signal) {
249
+ logger_1.logger.info({ signal }, 'Shutting down gracefully');
250
+ watcher.stop();
251
+ (0, Database_1.closeDb)();
252
+ process.exit(0);
253
+ }
254
+ process.on('SIGINT', () => shutdown('SIGINT'));
255
+ process.on('SIGTERM', () => shutdown('SIGTERM'));
256
+ process.on('uncaughtException', (err) => {
257
+ logger_1.logger.error({ err }, 'Uncaught exception');
258
+ watcher.stop();
259
+ (0, Database_1.closeDb)();
260
+ process.exit(1);
261
+ });
262
+ //# sourceMappingURL=McpServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"McpServer.js","sourceRoot":"","sources":["../../src/mcp/McpServer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Regex-based incremental file parser.
3
+ *
4
+ * Works with any language defined in the LanguageRegistry.
5
+ * Uses MD5 hashing to skip files that haven't changed.
6
+ * Populates: files, symbols, symbols_fts tables.
7
+ */
8
+ export declare class IncrementalParser {
9
+ /**
10
+ * Parse a single file and upsert its symbols into the database.
11
+ * Silently skips files whose hash hasn't changed.
12
+ */
13
+ parseFile(filePath: string): Promise<void>;
14
+ /**
15
+ * Extract symbols line-by-line using language extraction rules.
16
+ * Skip lines that are pure comments.
17
+ */
18
+ private extractSymbols;
19
+ /**
20
+ * Heuristic end-line finder: look for the closing brace / dedent.
21
+ * Falls back to the same line if nothing is found.
22
+ */
23
+ private findEndLine;
24
+ }
25
+ //# sourceMappingURL=IncrementalParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IncrementalParser.d.ts","sourceRoot":"","sources":["../../src/parser/IncrementalParser.ts"],"names":[],"mappings":"AAeA;;;;;;GAMG;AACH,qBAAa,iBAAiB;IAC5B;;;OAGG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuFhD;;;OAGG;IACH,OAAO,CAAC,cAAc;IA6CtB;;;OAGG;IACH,OAAO,CAAC,WAAW;CAoBpB"}
@@ -0,0 +1,195 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.IncrementalParser = void 0;
37
+ const fs = __importStar(require("fs/promises"));
38
+ const path = __importStar(require("path"));
39
+ const crypto = __importStar(require("crypto"));
40
+ const Database_1 = require("../database/Database");
41
+ const LanguageRegistry_1 = require("../languages/LanguageRegistry");
42
+ const logger_1 = require("../utils/logger");
43
+ /**
44
+ * Regex-based incremental file parser.
45
+ *
46
+ * Works with any language defined in the LanguageRegistry.
47
+ * Uses MD5 hashing to skip files that haven't changed.
48
+ * Populates: files, symbols, symbols_fts tables.
49
+ */
50
+ class IncrementalParser {
51
+ /**
52
+ * Parse a single file and upsert its symbols into the database.
53
+ * Silently skips files whose hash hasn't changed.
54
+ */
55
+ async parseFile(filePath) {
56
+ const ext = path.extname(filePath).toLowerCase();
57
+ const langDef = (0, LanguageRegistry_1.getLanguageByExtension)(ext);
58
+ if (!langDef) {
59
+ logger_1.logger.debug({ filePath, ext }, 'Skipping: no language definition for extension');
60
+ return;
61
+ }
62
+ try {
63
+ const content = await fs.readFile(filePath, 'utf-8');
64
+ const hash = crypto.createHash('md5').update(content).digest('hex');
65
+ const sizeBytes = Buffer.byteLength(content, 'utf-8');
66
+ const db = (0, Database_1.getDb)();
67
+ // Skip if file content hasn't changed
68
+ const existing = db
69
+ .prepare('SELECT hash FROM files WHERE path = ?')
70
+ .get(filePath);
71
+ if (existing?.hash === hash) {
72
+ logger_1.logger.debug({ filePath }, 'Skipped (unchanged)');
73
+ return;
74
+ }
75
+ // Extract symbols using language-specific rules
76
+ const symbols = this.extractSymbols(content, langDef);
77
+ // Upsert file record
78
+ db.prepare(`
79
+ INSERT INTO files (path, language, last_parsed, hash, size_bytes, symbol_count, updated_at)
80
+ VALUES (?, ?, unixepoch(), ?, ?, ?, unixepoch())
81
+ ON CONFLICT(path) DO UPDATE SET
82
+ language = excluded.language,
83
+ last_parsed = excluded.last_parsed,
84
+ hash = excluded.hash,
85
+ size_bytes = excluded.size_bytes,
86
+ symbol_count = excluded.symbol_count,
87
+ updated_at = excluded.updated_at
88
+ `).run(filePath, langDef.name, hash, sizeBytes, symbols.length);
89
+ // Get the file ID (works for both INSERT and UPDATE)
90
+ const fileRow = db
91
+ .prepare('SELECT id FROM files WHERE path = ?')
92
+ .get(filePath);
93
+ const fileId = fileRow.id;
94
+ // Clear old symbols and FTS entries for this file
95
+ const oldSymbols = db
96
+ .prepare('SELECT name, kind FROM symbols WHERE file_id = ?')
97
+ .all(fileId);
98
+ db.prepare('DELETE FROM symbols WHERE file_id = ?').run(fileId);
99
+ // Delete from FTS (by file path)
100
+ for (const s of oldSymbols) {
101
+ db.prepare("DELETE FROM symbols_fts WHERE name = ? AND kind = ? AND file_path = ?").run(s.name, s.kind, filePath);
102
+ }
103
+ // Insert new symbols in a transaction for atomicity
104
+ const insertSymbol = db.prepare(`
105
+ INSERT INTO symbols (file_id, name, kind, start_line, end_line, signature)
106
+ VALUES (?, ?, ?, ?, ?, ?)
107
+ `);
108
+ const insertFts = db.prepare('INSERT INTO symbols_fts (name, kind, file_path) VALUES (?, ?, ?)');
109
+ db.transaction(() => {
110
+ for (const s of symbols) {
111
+ insertSymbol.run(fileId, s.name, s.kind, s.startLine, s.endLine, s.signature);
112
+ insertFts.run(s.name, s.kind, filePath);
113
+ }
114
+ })();
115
+ logger_1.logger.debug({ filePath, language: langDef.name, symbolCount: symbols.length }, 'Parsed file');
116
+ }
117
+ catch (err) {
118
+ logger_1.logger.error({ filePath, err }, 'Failed to parse file');
119
+ }
120
+ }
121
+ /**
122
+ * Extract symbols line-by-line using language extraction rules.
123
+ * Skip lines that are pure comments.
124
+ */
125
+ extractSymbols(content, langDef) {
126
+ const lines = content.split('\n');
127
+ const symbols = [];
128
+ const commentPrefixes = langDef.commentPrefixes || [];
129
+ for (let i = 0; i < lines.length; i++) {
130
+ const line = lines[i];
131
+ const trimmed = line.trimStart();
132
+ // Skip blank lines
133
+ if (!trimmed)
134
+ continue;
135
+ // Skip comment-only lines
136
+ if (commentPrefixes.some((p) => trimmed.startsWith(p)))
137
+ continue;
138
+ // Test each rule in definition order
139
+ for (const rule of langDef.rules) {
140
+ const match = rule.pattern.exec(line);
141
+ if (match) {
142
+ const nameGroup = rule.nameGroup ?? 1;
143
+ const name = match[nameGroup]?.trim();
144
+ if (!name || name.length === 0)
145
+ continue;
146
+ // Skip common false-positive matches (short names that are keywords)
147
+ if (name.length < 2 && !['_', '$'].includes(name))
148
+ continue;
149
+ const endLine = this.findEndLine(lines, i);
150
+ const signature = line.trim().slice(0, 120);
151
+ symbols.push({
152
+ name,
153
+ kind: rule.kind,
154
+ startLine: i + 1, // 1-indexed
155
+ endLine,
156
+ signature,
157
+ });
158
+ break; // first matching rule wins
159
+ }
160
+ }
161
+ }
162
+ return symbols;
163
+ }
164
+ /**
165
+ * Heuristic end-line finder: look for the closing brace / dedent.
166
+ * Falls back to the same line if nothing is found.
167
+ */
168
+ findEndLine(lines, startIdx) {
169
+ const startLine = lines[startIdx];
170
+ const indent = startLine.length - startLine.trimStart().length;
171
+ let depth = 0;
172
+ let hasOpened = false;
173
+ for (let i = startIdx; i < Math.min(startIdx + 500, lines.length); i++) {
174
+ for (const ch of lines[i]) {
175
+ if (ch === '{' || ch === '(') {
176
+ depth++;
177
+ hasOpened = true;
178
+ }
179
+ if (ch === '}' || ch === ')') {
180
+ depth--;
181
+ }
182
+ }
183
+ if (hasOpened && depth <= 0)
184
+ return i + 1;
185
+ // Python/Ruby style: end when indentation returns to base level
186
+ if (i > startIdx && lines[i].trim() && lines[i].length - lines[i].trimStart().length <= indent) {
187
+ if (!hasOpened)
188
+ return i; // never found a brace — use dedent
189
+ }
190
+ }
191
+ return startIdx + 1;
192
+ }
193
+ }
194
+ exports.IncrementalParser = IncrementalParser;
195
+ //# sourceMappingURL=IncrementalParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IncrementalParser.js","sourceRoot":"","sources":["../../src/parser/IncrementalParser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export interface ColumnInfo {
2
+ column_name: string;
3
+ data_type: string;
4
+ is_nullable: string;
5
+ max_length: number | null;
6
+ is_primary_key: boolean;
7
+ foreign_key_table?: string;
8
+ foreign_key_column?: string;
9
+ }
10
+ export interface TableSchema {
11
+ table_name: string;
12
+ columns: ColumnInfo[];
13
+ indexes: string[];
14
+ }
15
+ /** Strategy interface — each database adapter implements this. */
16
+ export interface ISchemaAdapter {
17
+ getSchema(tableName: string): Promise<TableSchema | null>;
18
+ listTables(): Promise<string[]>;
19
+ }
20
+ //# sourceMappingURL=ISchemaAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ISchemaAdapter.d.ts","sourceRoot":"","sources":["../../src/schema/ISchemaAdapter.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,EAAE,OAAO,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,kEAAkE;AAClE,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAC1D,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACjC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=ISchemaAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ISchemaAdapter.js","sourceRoot":"","sources":["../../src/schema/ISchemaAdapter.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ import { ISchemaAdapter, TableSchema } from './ISchemaAdapter';
2
+ export declare class MssqlAdapter implements ISchemaAdapter {
3
+ getSchema(tableName: string): Promise<TableSchema | null>;
4
+ listTables(): Promise<string[]>;
5
+ }
6
+ //# sourceMappingURL=MssqlAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MssqlAdapter.d.ts","sourceRoot":"","sources":["../../src/schema/MssqlAdapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAgC/D,qBAAa,YAAa,YAAW,cAAc;IAC3C,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IA2DzD,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CActC"}