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.
- package/README.md +274 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +125 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/database/Database.d.ts +4 -0
- package/dist/database/Database.d.ts.map +1 -0
- package/dist/database/Database.js +83 -0
- package/dist/database/Database.js.map +1 -0
- package/dist/database/schema.sql +121 -0
- package/dist/knowledge/KnowledgeEngine.d.ts +63 -0
- package/dist/knowledge/KnowledgeEngine.d.ts.map +1 -0
- package/dist/knowledge/KnowledgeEngine.js +190 -0
- package/dist/knowledge/KnowledgeEngine.js.map +1 -0
- package/dist/languages/LanguageRegistry.d.ts +38 -0
- package/dist/languages/LanguageRegistry.d.ts.map +1 -0
- package/dist/languages/LanguageRegistry.js +233 -0
- package/dist/languages/LanguageRegistry.js.map +1 -0
- package/dist/languages/definitions/cpp.d.ts +2 -0
- package/dist/languages/definitions/cpp.d.ts.map +1 -0
- package/dist/languages/definitions/cpp.js +25 -0
- package/dist/languages/definitions/cpp.js.map +1 -0
- package/dist/languages/definitions/csharp.d.ts +2 -0
- package/dist/languages/definitions/csharp.d.ts.map +1 -0
- package/dist/languages/definitions/csharp.js +40 -0
- package/dist/languages/definitions/csharp.js.map +1 -0
- package/dist/languages/definitions/go.d.ts +2 -0
- package/dist/languages/definitions/go.d.ts.map +1 -0
- package/dist/languages/definitions/go.js +21 -0
- package/dist/languages/definitions/go.js.map +1 -0
- package/dist/languages/definitions/java.d.ts +2 -0
- package/dist/languages/definitions/java.d.ts.map +1 -0
- package/dist/languages/definitions/java.js +32 -0
- package/dist/languages/definitions/java.js.map +1 -0
- package/dist/languages/definitions/javascript.d.ts +2 -0
- package/dist/languages/definitions/javascript.d.ts.map +1 -0
- package/dist/languages/definitions/javascript.js +26 -0
- package/dist/languages/definitions/javascript.js.map +1 -0
- package/dist/languages/definitions/kotlin.d.ts +2 -0
- package/dist/languages/definitions/kotlin.d.ts.map +1 -0
- package/dist/languages/definitions/kotlin.js +36 -0
- package/dist/languages/definitions/kotlin.js.map +1 -0
- package/dist/languages/definitions/markdown.d.ts +2 -0
- package/dist/languages/definitions/markdown.d.ts.map +1 -0
- package/dist/languages/definitions/markdown.js +18 -0
- package/dist/languages/definitions/markdown.js.map +1 -0
- package/dist/languages/definitions/php.d.ts +2 -0
- package/dist/languages/definitions/php.d.ts.map +1 -0
- package/dist/languages/definitions/php.js +27 -0
- package/dist/languages/definitions/php.js.map +1 -0
- package/dist/languages/definitions/python.d.ts +2 -0
- package/dist/languages/definitions/python.d.ts.map +1 -0
- package/dist/languages/definitions/python.js +17 -0
- package/dist/languages/definitions/python.js.map +1 -0
- package/dist/languages/definitions/ruby.d.ts +2 -0
- package/dist/languages/definitions/ruby.d.ts.map +1 -0
- package/dist/languages/definitions/ruby.js +16 -0
- package/dist/languages/definitions/ruby.js.map +1 -0
- package/dist/languages/definitions/rust.d.ts +2 -0
- package/dist/languages/definitions/rust.d.ts.map +1 -0
- package/dist/languages/definitions/rust.js +28 -0
- package/dist/languages/definitions/rust.js.map +1 -0
- package/dist/languages/definitions/sql.d.ts +2 -0
- package/dist/languages/definitions/sql.d.ts.map +1 -0
- package/dist/languages/definitions/sql.js +36 -0
- package/dist/languages/definitions/sql.js.map +1 -0
- package/dist/languages/definitions/swift.d.ts +2 -0
- package/dist/languages/definitions/swift.d.ts.map +1 -0
- package/dist/languages/definitions/swift.js +40 -0
- package/dist/languages/definitions/swift.js.map +1 -0
- package/dist/languages/definitions/typescript.d.ts +2 -0
- package/dist/languages/definitions/typescript.d.ts.map +1 -0
- package/dist/languages/definitions/typescript.js +40 -0
- package/dist/languages/definitions/typescript.js.map +1 -0
- package/dist/mcp/McpServer.d.ts +2 -0
- package/dist/mcp/McpServer.d.ts.map +1 -0
- package/dist/mcp/McpServer.js +262 -0
- package/dist/mcp/McpServer.js.map +1 -0
- package/dist/parser/IncrementalParser.d.ts +25 -0
- package/dist/parser/IncrementalParser.d.ts.map +1 -0
- package/dist/parser/IncrementalParser.js +195 -0
- package/dist/parser/IncrementalParser.js.map +1 -0
- package/dist/schema/ISchemaAdapter.d.ts +20 -0
- package/dist/schema/ISchemaAdapter.d.ts.map +1 -0
- package/dist/schema/ISchemaAdapter.js +3 -0
- package/dist/schema/ISchemaAdapter.js.map +1 -0
- package/dist/schema/MssqlAdapter.d.ts +6 -0
- package/dist/schema/MssqlAdapter.d.ts.map +1 -0
- package/dist/schema/MssqlAdapter.js +139 -0
- package/dist/schema/MssqlAdapter.js.map +1 -0
- package/dist/schema/MySqlAdapter.d.ts +6 -0
- package/dist/schema/MySqlAdapter.d.ts.map +1 -0
- package/dist/schema/MySqlAdapter.js +77 -0
- package/dist/schema/MySqlAdapter.js.map +1 -0
- package/dist/schema/PostgresAdapter.d.ts +6 -0
- package/dist/schema/PostgresAdapter.d.ts.map +1 -0
- package/dist/schema/PostgresAdapter.js +78 -0
- package/dist/schema/PostgresAdapter.js.map +1 -0
- package/dist/schema/SchemaReader.d.ts +17 -0
- package/dist/schema/SchemaReader.d.ts.map +1 -0
- package/dist/schema/SchemaReader.js +82 -0
- package/dist/schema/SchemaReader.js.map +1 -0
- package/dist/session/SessionEngine.d.ts +40 -0
- package/dist/session/SessionEngine.d.ts.map +1 -0
- package/dist/session/SessionEngine.js +131 -0
- package/dist/session/SessionEngine.js.map +1 -0
- package/dist/utils/logger.d.ts +3 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +54 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/watcher/FileWatcher.d.ts +19 -0
- package/dist/watcher/FileWatcher.d.ts.map +1 -0
- package/dist/watcher/FileWatcher.js +146 -0
- package/dist/watcher/FileWatcher.js.map +1 -0
- 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 @@
|
|
|
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"}
|