@compr/contextengine-mcp 1.9.44

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 (54) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +200 -0
  3. package/dist/agents.d.ts +127 -0
  4. package/dist/agents.d.ts.map +1 -0
  5. package/dist/agents.js +1162 -0
  6. package/dist/agents.js.map +1 -0
  7. package/dist/cache.d.ts +15 -0
  8. package/dist/cache.d.ts.map +1 -0
  9. package/dist/cache.js +117 -0
  10. package/dist/cache.js.map +1 -0
  11. package/dist/cli.d.ts +10 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +227 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/code-chunker.d.ts +12 -0
  16. package/dist/code-chunker.d.ts.map +1 -0
  17. package/dist/code-chunker.js +263 -0
  18. package/dist/code-chunker.js.map +1 -0
  19. package/dist/collectors.d.ts +63 -0
  20. package/dist/collectors.d.ts.map +1 -0
  21. package/dist/collectors.js +617 -0
  22. package/dist/collectors.js.map +1 -0
  23. package/dist/config.d.ts +59 -0
  24. package/dist/config.d.ts.map +1 -0
  25. package/dist/config.js +213 -0
  26. package/dist/config.js.map +1 -0
  27. package/dist/embeddings.d.ts +31 -0
  28. package/dist/embeddings.d.ts.map +1 -0
  29. package/dist/embeddings.js +91 -0
  30. package/dist/embeddings.js.map +1 -0
  31. package/dist/index.d.ts +3 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +557 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/ingest.d.ts +23 -0
  36. package/dist/ingest.d.ts.map +1 -0
  37. package/dist/ingest.js +79 -0
  38. package/dist/ingest.js.map +1 -0
  39. package/dist/search.d.ts +11 -0
  40. package/dist/search.d.ts.map +1 -0
  41. package/dist/search.js +58 -0
  42. package/dist/search.js.map +1 -0
  43. package/dist/sessions.d.ts +46 -0
  44. package/dist/sessions.d.ts.map +1 -0
  45. package/dist/sessions.js +143 -0
  46. package/dist/sessions.js.map +1 -0
  47. package/dist/test-sessions.d.ts +2 -0
  48. package/dist/test-sessions.d.ts.map +1 -0
  49. package/dist/test-sessions.js.map +1 -0
  50. package/dist/test.d.ts +2 -0
  51. package/dist/test.d.ts.map +1 -0
  52. package/dist/test.js +52 -0
  53. package/dist/test.js.map +1 -0
  54. package/package.json +58 -0
package/dist/index.js ADDED
@@ -0,0 +1,557 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import { z } from "zod";
5
+ import { loadSources, loadProjectDirs, loadConfig } from "./config.js";
6
+ import { ingestSources } from "./ingest.js";
7
+ import { searchChunks } from "./search.js";
8
+ import { initEmbeddings, embedChunks, vectorSearch, isEmbeddingsReady, } from "./embeddings.js";
9
+ import { collectProjectOps, collectSystemOps } from "./collectors.js";
10
+ import { loadCache, saveCache } from "./cache.js";
11
+ import { listProjects, checkPorts, runComplianceAudit, formatProjectList, formatPortMap, formatPlan, scoreProject, formatScoreReport, } from "./agents.js";
12
+ import { saveSession, loadSession, listSessions, formatSession, formatSessionList, } from "./sessions.js";
13
+ import { readFileSync, existsSync, watch } from "fs";
14
+ import { basename, join } from "path";
15
+ import { scanCodeDir } from "./code-chunker.js";
16
+ // ---------------------------------------------------------------------------
17
+ // State
18
+ // ---------------------------------------------------------------------------
19
+ let sources = [];
20
+ let chunks = [];
21
+ let embeddedChunks = [];
22
+ /**
23
+ * (Re-)ingest all sources. Called at startup and on file changes.
24
+ */
25
+ async function reindex() {
26
+ sources = loadSources();
27
+ chunks = ingestSources(sources);
28
+ // Collect operational data from project directories
29
+ const config = loadConfig();
30
+ if (config.collectOps !== false) {
31
+ const projectDirs = loadProjectDirs();
32
+ let opsChunks = 0;
33
+ for (const dir of projectDirs) {
34
+ const ops = collectProjectOps(dir.path, dir.name);
35
+ chunks.push(...ops);
36
+ opsChunks += ops.length;
37
+ }
38
+ if (opsChunks > 0) {
39
+ console.error(`[ContextEngine] ⚙ Collected ${opsChunks} operational chunks from ${projectDirs.length} projects`);
40
+ }
41
+ }
42
+ // Collect system-wide operational data
43
+ if (config.collectSystemOps !== false) {
44
+ const sysOps = collectSystemOps();
45
+ if (sysOps.length > 0) {
46
+ chunks.push(...sysOps);
47
+ console.error(`[ContextEngine] 🖥 Collected ${sysOps.length} system operational chunks`);
48
+ }
49
+ }
50
+ // Scan code files if configured
51
+ if (config.codeDirs && config.codeDirs.length > 0) {
52
+ const projectDirs = loadProjectDirs();
53
+ let codeChunks = 0;
54
+ for (const dir of projectDirs) {
55
+ for (const codeDir of config.codeDirs) {
56
+ const codePath = join(dir.path, codeDir);
57
+ if (existsSync(codePath)) {
58
+ const codeResults = scanCodeDir(codePath, dir.name);
59
+ chunks.push(...codeResults);
60
+ codeChunks += codeResults.length;
61
+ }
62
+ }
63
+ }
64
+ if (codeChunks > 0) {
65
+ console.error(`[ContextEngine] 💻 Parsed ${codeChunks} code chunks from source files`);
66
+ }
67
+ }
68
+ if (isEmbeddingsReady()) {
69
+ console.error(`[ContextEngine] 🧠 Re-embedding ${chunks.length} chunks...`);
70
+ embeddedChunks = await embedChunks(chunks);
71
+ saveCache(chunks, embeddedChunks);
72
+ }
73
+ }
74
+ function hybridSearch(query, keywordResults, vectorResults, topK) {
75
+ const map = new Map();
76
+ // Normalize keyword scores (max = 1.0)
77
+ const maxKw = keywordResults.length > 0 ? keywordResults[0].score : 1;
78
+ for (const r of keywordResults) {
79
+ map.set(r.chunk, {
80
+ chunk: r.chunk,
81
+ keywordScore: r.score / maxKw,
82
+ vectorScore: 0,
83
+ combinedScore: 0,
84
+ });
85
+ }
86
+ // Merge vector scores
87
+ for (const r of vectorResults) {
88
+ const existing = map.get(r.chunk);
89
+ if (existing) {
90
+ existing.vectorScore = r.score;
91
+ }
92
+ else {
93
+ map.set(r.chunk, {
94
+ chunk: r.chunk,
95
+ keywordScore: 0,
96
+ vectorScore: r.score,
97
+ combinedScore: 0,
98
+ });
99
+ }
100
+ }
101
+ // Combined: 40% keyword + 60% semantic (semantic is better for natural language)
102
+ for (const r of map.values()) {
103
+ r.combinedScore = r.keywordScore * 0.4 + r.vectorScore * 0.6;
104
+ }
105
+ const results = Array.from(map.values());
106
+ results.sort((a, b) => b.combinedScore - a.combinedScore);
107
+ return results.slice(0, topK);
108
+ }
109
+ // ---------------------------------------------------------------------------
110
+ // File Watching
111
+ // ---------------------------------------------------------------------------
112
+ const watchers = [];
113
+ function startWatching() {
114
+ // Clean up old watchers
115
+ for (const w of watchers) {
116
+ try {
117
+ w.close();
118
+ }
119
+ catch {
120
+ /* ignore */
121
+ }
122
+ }
123
+ watchers.length = 0;
124
+ let debounceTimer = null;
125
+ for (const source of sources) {
126
+ if (!existsSync(source.path))
127
+ continue;
128
+ try {
129
+ const w = watch(source.path, () => {
130
+ // Debounce: wait 500ms after last change before re-indexing
131
+ if (debounceTimer)
132
+ clearTimeout(debounceTimer);
133
+ debounceTimer = setTimeout(async () => {
134
+ console.error(`[ContextEngine] 📝 File changed: ${basename(source.path)} — re-indexing...`);
135
+ await reindex();
136
+ console.error(`[ContextEngine] ✅ Re-indexed: ${chunks.length} chunks from ${sources.length} sources`);
137
+ }, 500);
138
+ });
139
+ watchers.push(w);
140
+ }
141
+ catch {
142
+ // Can't watch this file (permission, network drive, etc.)
143
+ }
144
+ }
145
+ console.error(`[ContextEngine] 👁 Watching ${watchers.length} source files for changes`);
146
+ }
147
+ // ---------------------------------------------------------------------------
148
+ // MCP Server
149
+ // ---------------------------------------------------------------------------
150
+ const server = new McpServer({
151
+ name: "ContextEngine",
152
+ version: "1.9.44",
153
+ });
154
+ // ---------------------------------------------------------------------------
155
+ // Tool: search_context (hybrid: keyword + vector)
156
+ // ---------------------------------------------------------------------------
157
+ server.tool("search_context", "Search across all indexed project knowledge (copilot-instructions, skills docs, runbooks, session docs). Uses hybrid keyword + semantic search. Returns the most relevant chunks with source file, section, and line numbers.", {
158
+ query: z.string().describe("Natural language search query"),
159
+ top_k: z
160
+ .number()
161
+ .int()
162
+ .min(1)
163
+ .max(30)
164
+ .default(5)
165
+ .describe("Number of results to return (default 5)"),
166
+ mode: z
167
+ .enum(["hybrid", "keyword", "semantic"])
168
+ .default("hybrid")
169
+ .describe("Search mode: hybrid (default), keyword-only, or semantic-only"),
170
+ }, async ({ query, top_k, mode }) => {
171
+ let results = [];
172
+ if (mode === "keyword" || mode === "hybrid") {
173
+ const kwResults = searchChunks(chunks, query, top_k * 2);
174
+ if (mode === "keyword" || !isEmbeddingsReady()) {
175
+ results = kwResults.map((r) => ({
176
+ chunk: r.chunk,
177
+ score: r.score,
178
+ label: "keyword",
179
+ }));
180
+ }
181
+ else {
182
+ // Hybrid
183
+ const vecResults = await vectorSearch(query, embeddedChunks, top_k * 2);
184
+ const hybrid = hybridSearch(query, kwResults, vecResults, top_k);
185
+ results = hybrid.map((r) => ({
186
+ chunk: r.chunk,
187
+ score: r.combinedScore,
188
+ label: `kw:${r.keywordScore.toFixed(2)} sem:${r.vectorScore.toFixed(2)}`,
189
+ }));
190
+ }
191
+ }
192
+ else if (mode === "semantic") {
193
+ if (!isEmbeddingsReady()) {
194
+ return {
195
+ content: [
196
+ {
197
+ type: "text",
198
+ text: "Semantic search unavailable — embeddings model not loaded. Use mode='keyword' or 'hybrid'.",
199
+ },
200
+ ],
201
+ isError: true,
202
+ };
203
+ }
204
+ const vecResults = await vectorSearch(query, embeddedChunks, top_k);
205
+ results = vecResults.map((r) => ({
206
+ chunk: r.chunk,
207
+ score: r.score,
208
+ label: "semantic",
209
+ }));
210
+ }
211
+ results = results.slice(0, top_k);
212
+ if (results.length === 0) {
213
+ return {
214
+ content: [
215
+ {
216
+ type: "text",
217
+ text: `No results found for: "${query}"`,
218
+ },
219
+ ],
220
+ };
221
+ }
222
+ const searchMode = isEmbeddingsReady() ? mode : "keyword (embeddings loading)";
223
+ const text = [
224
+ `Search: "${query}" | Mode: ${searchMode} | ${results.length} results`,
225
+ "",
226
+ ...results.map((r, i) => [
227
+ `--- Result ${i + 1} (${r.label}: ${r.score.toFixed(3)}) ---`,
228
+ `Source: ${r.chunk.source}`,
229
+ `Section: ${r.chunk.section}`,
230
+ `Lines: ${r.chunk.lineStart}-${r.chunk.lineEnd}`,
231
+ "",
232
+ r.chunk.content,
233
+ ].join("\n")),
234
+ ].join("\n\n");
235
+ return {
236
+ content: [{ type: "text", text }],
237
+ };
238
+ });
239
+ // ---------------------------------------------------------------------------
240
+ // Tool: list_sources
241
+ // ---------------------------------------------------------------------------
242
+ server.tool("list_sources", "List all knowledge sources indexed by ContextEngine, with their status (found/missing) and chunk counts.", {}, async () => {
243
+ const lines = sources.map((s) => {
244
+ const exists = existsSync(s.path);
245
+ const count = chunks.filter((c) => c.source === s.name).length;
246
+ const embeddedCount = embeddedChunks.filter((ec) => ec.chunk.source === s.name).length;
247
+ const status = exists
248
+ ? `✅ ${count} chunks${embeddedCount > 0 ? ` (${embeddedCount} embedded)` : ""}`
249
+ : "⚠ file not found";
250
+ return `${s.name}: ${status}\n ${s.path}`;
251
+ });
252
+ const embStatus = isEmbeddingsReady()
253
+ ? `✅ ${embeddedChunks.length} vectors`
254
+ : "⏳ loading...";
255
+ return {
256
+ content: [
257
+ {
258
+ type: "text",
259
+ text: [
260
+ `ContextEngine v1.9.43`,
261
+ `Sources: ${sources.length} | Chunks: ${chunks.length} | Embeddings: ${embStatus}`,
262
+ "",
263
+ ...lines,
264
+ ].join("\n"),
265
+ },
266
+ ],
267
+ };
268
+ });
269
+ // ---------------------------------------------------------------------------
270
+ // Tool: read_source
271
+ // ---------------------------------------------------------------------------
272
+ server.tool("read_source", "Read the full content of a specific knowledge source by name.", {
273
+ source_name: z
274
+ .string()
275
+ .describe("Name of the source (from list_sources output)"),
276
+ }, async ({ source_name }) => {
277
+ const source = sources.find((s) => s.name.toLowerCase() === source_name.toLowerCase());
278
+ if (!source) {
279
+ return {
280
+ content: [
281
+ {
282
+ type: "text",
283
+ text: `Unknown source: "${source_name}". Use list_sources to see available sources.`,
284
+ },
285
+ ],
286
+ isError: true,
287
+ };
288
+ }
289
+ if (!existsSync(source.path)) {
290
+ return {
291
+ content: [
292
+ {
293
+ type: "text",
294
+ text: `Source file not found: ${source.path}`,
295
+ },
296
+ ],
297
+ isError: true,
298
+ };
299
+ }
300
+ const content = readFileSync(source.path, "utf-8");
301
+ return {
302
+ content: [
303
+ {
304
+ type: "text",
305
+ text: `# ${source.name}\n\n${content}`,
306
+ },
307
+ ],
308
+ };
309
+ });
310
+ // ---------------------------------------------------------------------------
311
+ // Tool: reindex
312
+ // ---------------------------------------------------------------------------
313
+ server.tool("reindex", "Force a full re-index of all knowledge sources. Use after adding new files or changing contextengine.json.", {}, async () => {
314
+ await reindex();
315
+ return {
316
+ content: [
317
+ {
318
+ type: "text",
319
+ text: `Re-indexed: ${chunks.length} chunks from ${sources.length} sources. Embeddings: ${embeddedChunks.length} vectors.`,
320
+ },
321
+ ],
322
+ };
323
+ });
324
+ // ---------------------------------------------------------------------------
325
+ // Tool: list_projects (Multi-Agent Phase 1)
326
+ // ---------------------------------------------------------------------------
327
+ server.tool("list_projects", "Discover and analyze all projects in the workspace. Shows tech stack (framework, runtime, key dependencies), infrastructure (git, docker, pm2), and git remote status for each project.", {}, async () => {
328
+ const projectDirs = loadProjectDirs();
329
+ const projects = listProjects(projectDirs);
330
+ const text = formatProjectList(projects);
331
+ return {
332
+ content: [{ type: "text", text }],
333
+ };
334
+ });
335
+ // ---------------------------------------------------------------------------
336
+ // Tool: check_ports (Multi-Agent Phase 1)
337
+ // ---------------------------------------------------------------------------
338
+ server.tool("check_ports", "Scan all projects for port declarations (ecosystem.config.js, docker-compose.yml, .env, package.json) and detect port conflicts. Returns a port allocation map with conflict warnings.", {}, async () => {
339
+ const projectDirs = loadProjectDirs();
340
+ const { ports, conflicts } = checkPorts(projectDirs);
341
+ const text = formatPortMap(ports, conflicts);
342
+ return {
343
+ content: [{ type: "text", text }],
344
+ };
345
+ });
346
+ // ---------------------------------------------------------------------------
347
+ // Tool: run_audit (Multi-Agent Phase 1 — Compliance Agent)
348
+ // ---------------------------------------------------------------------------
349
+ server.tool("run_audit", "Run the Compliance Agent audit across all projects. Checks: port conflicts, git remotes (origin + gdrive), git hooks (post-commit auto-push), .env files (existence + gitignore), Docker config (restart policy, workdir), PM2 config (treekill, kill_timeout, no bash wrappers), version issues (EOL runtimes, outdated deps, MUI v4/v5 coexistence). Returns a structured plan with findings and remediation steps.", {
350
+ scope: z
351
+ .enum(["all", "compliance", "versions", "ports"])
352
+ .default("all")
353
+ .describe("Audit scope: all checks, compliance only, version checks only, or port conflicts only"),
354
+ }, async ({ scope }) => {
355
+ const projectDirs = loadProjectDirs();
356
+ const plan = runComplianceAudit(projectDirs);
357
+ const text = formatPlan(plan);
358
+ return {
359
+ content: [{ type: "text", text }],
360
+ };
361
+ });
362
+ // ---------------------------------------------------------------------------
363
+ // Tool: score_project (AI-Readiness Scoring)
364
+ // ---------------------------------------------------------------------------
365
+ server.tool("score_project", "Score one or all projects on AI-readiness (0-100%). Checks documentation (copilot-instructions, README, CLAUDE.md, .cursorrules, SKILLS.md, .env.example), infrastructure (git, hooks, Docker, CI, deploy scripts, PM2), code quality (tests, TypeScript, linting, npm scripts), and security (.env gitignored, secrets exposure, lockfiles). Returns letter grade (A+ to F) with detailed breakdown.", {
366
+ project: z
367
+ .string()
368
+ .optional()
369
+ .describe("Project name to score. Omit to score all projects."),
370
+ }, async ({ project }) => {
371
+ const projectDirs = loadProjectDirs();
372
+ let scores;
373
+ if (project) {
374
+ const dir = projectDirs.find((d) => d.name.toLowerCase() === project.toLowerCase());
375
+ if (!dir) {
376
+ return {
377
+ content: [
378
+ {
379
+ type: "text",
380
+ text: `Project "${project}" not found. Available: ${projectDirs.map((d) => d.name).join(", ")}`,
381
+ },
382
+ ],
383
+ };
384
+ }
385
+ scores = [scoreProject(dir)];
386
+ }
387
+ else {
388
+ scores = projectDirs.map(scoreProject);
389
+ }
390
+ const text = formatScoreReport(scores);
391
+ return {
392
+ content: [{ type: "text", text }],
393
+ };
394
+ });
395
+ // ---------------------------------------------------------------------------
396
+ // Tool: save_session (Session Persistence)
397
+ // ---------------------------------------------------------------------------
398
+ server.tool("save_session", "Save a key-value entry to a named session. Use to persist decisions, context, plans, and findings between coding sessions. Each session can hold multiple keys (e.g., 'summary', 'active_tasks', 'decisions'). Keys are updated in place if they already exist.", {
399
+ session: z
400
+ .string()
401
+ .describe("Session name (e.g., 'admin-crowlr-upgrade', 'compr-app-v2'). Will be created if it doesn't exist."),
402
+ key: z
403
+ .string()
404
+ .describe("Entry key within the session (e.g., 'summary', 'active_tasks', 'decisions', 'blockers')"),
405
+ value: z
406
+ .string()
407
+ .describe("Content to save — can be a summary, list of tasks, decisions, notes, code snippets, etc."),
408
+ }, async ({ session, key, value }) => {
409
+ const result = saveSession(session, key, value);
410
+ return {
411
+ content: [
412
+ {
413
+ type: "text",
414
+ text: `✅ Saved key "${key}" to session "${session}" (${result.entries.length} entries total)`,
415
+ },
416
+ ],
417
+ };
418
+ });
419
+ // ---------------------------------------------------------------------------
420
+ // Tool: load_session (Session Persistence)
421
+ // ---------------------------------------------------------------------------
422
+ server.tool("load_session", "Load a previously saved session by name. Returns all stored key-value entries with timestamps. Use at the start of a session to restore context from a previous conversation.", {
423
+ session: z
424
+ .string()
425
+ .describe("Session name to load"),
426
+ }, async ({ session }) => {
427
+ const result = loadSession(session);
428
+ if (!result) {
429
+ return {
430
+ content: [
431
+ {
432
+ type: "text",
433
+ text: `No session found with name "${session}". Use \`list_sessions\` to see available sessions.`,
434
+ },
435
+ ],
436
+ };
437
+ }
438
+ const text = formatSession(result);
439
+ return {
440
+ content: [{ type: "text", text }],
441
+ };
442
+ });
443
+ // ---------------------------------------------------------------------------
444
+ // Tool: list_sessions (Session Persistence)
445
+ // ---------------------------------------------------------------------------
446
+ server.tool("list_sessions", "List all saved sessions. Shows session names, entry counts, and timestamps. Use to discover what context is available from previous conversations.", {}, async () => {
447
+ const sessions = listSessions();
448
+ const text = formatSessionList(sessions);
449
+ return {
450
+ content: [{ type: "text", text }],
451
+ };
452
+ });
453
+ // ---------------------------------------------------------------------------
454
+ // MCP Resources: expose each source as a browsable resource
455
+ // ---------------------------------------------------------------------------
456
+ function registerResources() {
457
+ // Static resources for each discovered source
458
+ for (const source of sources) {
459
+ if (!existsSync(source.path))
460
+ continue;
461
+ const uri = `context://${encodeURIComponent(source.name)}`;
462
+ server.resource(source.name, uri, {
463
+ description: `Knowledge source: ${source.name}`,
464
+ mimeType: "text/markdown",
465
+ }, async () => {
466
+ const content = existsSync(source.path)
467
+ ? readFileSync(source.path, "utf-8")
468
+ : `Source file not found: ${source.path}`;
469
+ return {
470
+ contents: [
471
+ {
472
+ uri,
473
+ mimeType: "text/markdown",
474
+ text: content,
475
+ },
476
+ ],
477
+ };
478
+ });
479
+ }
480
+ console.error(`[ContextEngine] 📚 Registered ${sources.length} MCP resources`);
481
+ }
482
+ // ---------------------------------------------------------------------------
483
+ // Start
484
+ // ---------------------------------------------------------------------------
485
+ async function main() {
486
+ // 1. Ingest all sources (fast — keyword search available immediately)
487
+ sources = loadSources();
488
+ chunks = ingestSources(sources);
489
+ // 1b. Collect operational data (git, deps, env, docker, pm2, etc.)
490
+ const config = loadConfig();
491
+ if (config.collectOps !== false) {
492
+ const projectDirs = loadProjectDirs();
493
+ let opsChunks = 0;
494
+ for (const dir of projectDirs) {
495
+ const ops = collectProjectOps(dir.path, dir.name);
496
+ chunks.push(...ops);
497
+ opsChunks += ops.length;
498
+ }
499
+ if (opsChunks > 0) {
500
+ console.error(`[ContextEngine] ⚙ Collected ${opsChunks} operational chunks from ${projectDirs.length} projects`);
501
+ }
502
+ }
503
+ if (config.collectSystemOps !== false) {
504
+ const sysOps = collectSystemOps();
505
+ if (sysOps.length > 0) {
506
+ chunks.push(...sysOps);
507
+ console.error(`[ContextEngine] 🖥 Collected ${sysOps.length} system operational chunks`);
508
+ }
509
+ }
510
+ // 1c. Scan code files (TS/JS/Python) if configured
511
+ if (config.codeDirs && config.codeDirs.length > 0) {
512
+ const projectDirs = loadProjectDirs();
513
+ let codeChunks = 0;
514
+ for (const dir of projectDirs) {
515
+ for (const codeDir of config.codeDirs) {
516
+ const codePath = join(dir.path, codeDir);
517
+ if (existsSync(codePath)) {
518
+ const codeResults = scanCodeDir(codePath, dir.name);
519
+ chunks.push(...codeResults);
520
+ codeChunks += codeResults.length;
521
+ }
522
+ }
523
+ }
524
+ if (codeChunks > 0) {
525
+ console.error(`[ContextEngine] 💻 Parsed ${codeChunks} code chunks from source files`);
526
+ }
527
+ }
528
+ // 2. Register MCP resources
529
+ registerResources();
530
+ // 3. Connect MCP transport (server is usable with keyword search now)
531
+ const transport = new StdioServerTransport();
532
+ await server.connect(transport);
533
+ console.error("[ContextEngine] 🚀 MCP server running on stdio (keyword search ready)");
534
+ // 4. Load embeddings — try cache first, then model (non-blocking)
535
+ const cached = loadCache(chunks);
536
+ if (cached) {
537
+ embeddedChunks = cached;
538
+ console.error(`[ContextEngine] ✅ Semantic search ready from cache (${embeddedChunks.length} vectors)`);
539
+ }
540
+ else {
541
+ initEmbeddings().then(async (ready) => {
542
+ if (ready) {
543
+ console.error(`[ContextEngine] 🧠 Embedding ${chunks.length} chunks...`);
544
+ embeddedChunks = await embedChunks(chunks);
545
+ saveCache(chunks, embeddedChunks);
546
+ console.error(`[ContextEngine] ✅ Semantic search ready (${embeddedChunks.length} vectors)`);
547
+ }
548
+ });
549
+ }
550
+ // 5. Start file watchers
551
+ startWatching();
552
+ }
553
+ main().catch((err) => {
554
+ console.error("[ContextEngine] Fatal:", err);
555
+ process.exit(1);
556
+ });
557
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { KnowledgeSource } from "./config.js";
2
+ /**
3
+ * A chunk of text extracted from a knowledge source,
4
+ * suitable for embedding or keyword search.
5
+ */
6
+ export interface Chunk {
7
+ /** Which source file this came from */
8
+ source: string;
9
+ /** Section heading path (e.g. "## Architecture > ### Docker") */
10
+ section: string;
11
+ /** The actual text content */
12
+ content: string;
13
+ /** Starting line number in the original file (1-based) */
14
+ lineStart: number;
15
+ /** Ending line number in the original file (1-based) */
16
+ lineEnd: number;
17
+ }
18
+ /**
19
+ * Ingest all configured knowledge sources into chunks.
20
+ * Skips files that don't exist (with a warning to stderr).
21
+ */
22
+ export declare function ingestSources(sources: KnowledgeSource[]): Chunk[];
23
+ //# sourceMappingURL=ingest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ingest.d.ts","sourceRoot":"","sources":["../src/ingest.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C;;;GAGG;AACH,MAAM,WAAW,KAAK;IACpB,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,OAAO,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,SAAS,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAC;CACjB;AAoED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,KAAK,EAAE,CAoBjE"}