@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
@@ -0,0 +1,59 @@
1
+ /**
2
+ * A knowledge source that ContextEngine indexes.
3
+ */
4
+ export interface KnowledgeSource {
5
+ /** Human-readable label */
6
+ name: string;
7
+ /** Absolute path to the file */
8
+ path: string;
9
+ /** File type for parser selection */
10
+ type: "markdown" | "code";
11
+ }
12
+ /**
13
+ * A discovered project directory for operational data collection.
14
+ */
15
+ export interface ProjectDirectory {
16
+ /** Human-readable project name (directory basename) */
17
+ name: string;
18
+ /** Absolute path to the project root */
19
+ path: string;
20
+ }
21
+ /**
22
+ * User configuration loaded from contextengine.json
23
+ */
24
+ export interface ContextEngineConfig {
25
+ /** Explicit list of files to index */
26
+ sources?: Array<{
27
+ name: string;
28
+ path: string;
29
+ }>;
30
+ /** Directories to scan for knowledge files */
31
+ workspaces?: string[];
32
+ /** File patterns to auto-discover within workspaces */
33
+ patterns?: string[];
34
+ /** Directories to scan for code files (TS/JS/Python) — e.g. ["src/"] relative to project root */
35
+ codeDirs?: string[];
36
+ /** Enable operational data collection (git, deps, env, etc.) — default true */
37
+ collectOps?: boolean;
38
+ /** Enable system-wide operational data (docker, pm2, nginx, cron, shell history) — default true */
39
+ collectSystemOps?: boolean;
40
+ }
41
+ /**
42
+ * Load knowledge sources.
43
+ *
44
+ * Resolution order:
45
+ * 1. Config file (CONTEXTENGINE_CONFIG env, ./contextengine.json, ~/.contextengine.json)
46
+ * 2. CONTEXTENGINE_WORKSPACES env var (colon-separated paths)
47
+ * 3. Auto-discover from ~/Projects
48
+ */
49
+ export declare function loadSources(): KnowledgeSource[];
50
+ /**
51
+ * Discover project directories from workspaces.
52
+ * Returns one entry per top-level project found.
53
+ */
54
+ export declare function loadProjectDirs(): ProjectDirectory[];
55
+ /**
56
+ * Load the raw config (for checking flags like collectSystemOps).
57
+ */
58
+ export declare function loadConfig(): ContextEngineConfig;
59
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,qCAAqC;IACrC,IAAI,EAAE,UAAU,GAAG,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,sCAAsC;IACtC,OAAO,CAAC,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;IACH,8CAA8C;IAC9C,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,iGAAiG;IACjG,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,+EAA+E;IAC/E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,mGAAmG;IACnG,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAgGD;;;;;;;GAOG;AACH,wBAAgB,WAAW,IAAI,eAAe,EAAE,CAyD/C;AAYD;;;GAGG;AACH,wBAAgB,eAAe,IAAI,gBAAgB,EAAE,CAsDpD;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,mBAAmB,CAMhD"}
package/dist/config.js ADDED
@@ -0,0 +1,213 @@
1
+ import { resolve, join } from "path";
2
+ import { homedir } from "os";
3
+ import { readFileSync, existsSync, readdirSync, statSync } from "fs";
4
+ const DEFAULT_PATTERNS = [
5
+ // GitHub Copilot
6
+ ".github/copilot-instructions.md",
7
+ ".github/SKILLS.md",
8
+ // Claude Code
9
+ "CLAUDE.md",
10
+ // Cursor
11
+ ".cursorrules",
12
+ ".cursor/rules",
13
+ // Codex / multi-agent
14
+ "AGENTS.md",
15
+ ];
16
+ /**
17
+ * Look for contextengine.json in standard locations.
18
+ * Priority: env var > CWD > home dir
19
+ */
20
+ function findConfigFile() {
21
+ const candidates = [];
22
+ const envPath = process.env.CONTEXTENGINE_CONFIG;
23
+ if (envPath) {
24
+ candidates.push(resolve(envPath));
25
+ }
26
+ candidates.push(resolve(process.cwd(), "contextengine.json"), resolve(homedir(), ".contextengine.json"));
27
+ for (const c of candidates) {
28
+ if (existsSync(c))
29
+ return c;
30
+ }
31
+ return null;
32
+ }
33
+ /**
34
+ * Auto-discover knowledge files by scanning directories for known patterns.
35
+ * Scans one level deep (each subdirectory = a project).
36
+ */
37
+ function discoverSources(dirs, patterns) {
38
+ const sources = [];
39
+ for (const dir of dirs) {
40
+ const absDir = resolve(dir.replace(/^~/, homedir()));
41
+ if (!existsSync(absDir))
42
+ continue;
43
+ // Check patterns at this level
44
+ for (const pattern of patterns) {
45
+ const filePath = join(absDir, pattern);
46
+ if (existsSync(filePath)) {
47
+ const dirName = absDir.split("/").pop() || absDir;
48
+ const fileName = pattern.split("/").pop() || pattern;
49
+ sources.push({
50
+ name: `${dirName} — ${fileName}`,
51
+ path: filePath,
52
+ type: "markdown",
53
+ });
54
+ }
55
+ }
56
+ // Scan one level deep (subdirectories = projects)
57
+ try {
58
+ for (const entry of readdirSync(absDir)) {
59
+ if (entry.startsWith(".") || entry === "node_modules")
60
+ continue;
61
+ const subDir = join(absDir, entry);
62
+ try {
63
+ if (!statSync(subDir).isDirectory())
64
+ continue;
65
+ }
66
+ catch {
67
+ continue;
68
+ }
69
+ for (const pattern of patterns) {
70
+ const filePath = join(subDir, pattern);
71
+ if (existsSync(filePath)) {
72
+ const fileName = pattern.split("/").pop() || pattern;
73
+ sources.push({
74
+ name: `${entry} — ${fileName}`,
75
+ path: filePath,
76
+ type: "markdown",
77
+ });
78
+ }
79
+ }
80
+ }
81
+ }
82
+ catch {
83
+ // Permission denied — skip
84
+ }
85
+ }
86
+ return sources;
87
+ }
88
+ /**
89
+ * Load knowledge sources.
90
+ *
91
+ * Resolution order:
92
+ * 1. Config file (CONTEXTENGINE_CONFIG env, ./contextengine.json, ~/.contextengine.json)
93
+ * 2. CONTEXTENGINE_WORKSPACES env var (colon-separated paths)
94
+ * 3. Auto-discover from ~/Projects
95
+ */
96
+ export function loadSources() {
97
+ const configPath = findConfigFile();
98
+ if (configPath) {
99
+ console.error(`[ContextEngine] 📄 Config: ${configPath}`);
100
+ const config = JSON.parse(readFileSync(configPath, "utf-8"));
101
+ const sources = [];
102
+ // Explicit sources
103
+ if (config.sources) {
104
+ for (const s of config.sources) {
105
+ const absPath = resolve(configPath, "..", s.path.replace(/^~/, homedir()));
106
+ if (existsSync(absPath)) {
107
+ sources.push({ name: s.name, path: absPath, type: "markdown" });
108
+ }
109
+ else {
110
+ console.error(`[ContextEngine] ⚠ Not found: ${absPath}`);
111
+ }
112
+ }
113
+ }
114
+ // Workspace auto-discovery
115
+ if (config.workspaces) {
116
+ const patterns = config.patterns || DEFAULT_PATTERNS;
117
+ const resolved = config.workspaces.map((w) => resolve(configPath, "..", w.replace(/^~/, homedir())));
118
+ sources.push(...discoverSources(resolved, patterns));
119
+ }
120
+ return dedup(sources);
121
+ }
122
+ // Env var fallback
123
+ const envWorkspaces = process.env.CONTEXTENGINE_WORKSPACES;
124
+ if (envWorkspaces) {
125
+ console.error(`[ContextEngine] 🔍 Discovering from CONTEXTENGINE_WORKSPACES`);
126
+ const dirs = envWorkspaces.split(":").filter(Boolean);
127
+ return dedup(discoverSources(dirs, DEFAULT_PATTERNS));
128
+ }
129
+ // Auto-discover from ~/Projects
130
+ const projectsDir = resolve(homedir(), "Projects");
131
+ if (existsSync(projectsDir)) {
132
+ console.error(`[ContextEngine] 🔍 Auto-discovering from ~/Projects`);
133
+ return dedup(discoverSources([projectsDir], DEFAULT_PATTERNS));
134
+ }
135
+ console.error(`[ContextEngine] ⚠ No sources found. Create contextengine.json or set CONTEXTENGINE_WORKSPACES.`);
136
+ return [];
137
+ }
138
+ /** Remove duplicate paths */
139
+ function dedup(sources) {
140
+ const seen = new Set();
141
+ return sources.filter((s) => {
142
+ if (seen.has(s.path))
143
+ return false;
144
+ seen.add(s.path);
145
+ return true;
146
+ });
147
+ }
148
+ /**
149
+ * Discover project directories from workspaces.
150
+ * Returns one entry per top-level project found.
151
+ */
152
+ export function loadProjectDirs() {
153
+ const configPath = findConfigFile();
154
+ const dirs = [];
155
+ let workspaceDirs = [];
156
+ if (configPath) {
157
+ const config = JSON.parse(readFileSync(configPath, "utf-8"));
158
+ if (config.collectOps === false)
159
+ return []; // opted out
160
+ if (config.workspaces) {
161
+ workspaceDirs = config.workspaces.map((w) => resolve(configPath, "..", w.replace(/^~/, homedir())));
162
+ }
163
+ }
164
+ // Env var fallback
165
+ if (workspaceDirs.length === 0) {
166
+ const envWorkspaces = process.env.CONTEXTENGINE_WORKSPACES;
167
+ if (envWorkspaces) {
168
+ workspaceDirs = envWorkspaces.split(":").filter(Boolean);
169
+ }
170
+ }
171
+ // Auto-discover fallback
172
+ if (workspaceDirs.length === 0) {
173
+ const projectsDir = resolve(homedir(), "Projects");
174
+ if (existsSync(projectsDir)) {
175
+ workspaceDirs = [projectsDir];
176
+ }
177
+ }
178
+ for (const wsDir of workspaceDirs) {
179
+ const absDir = resolve(wsDir.replace(/^~/, homedir()));
180
+ if (!existsSync(absDir))
181
+ continue;
182
+ try {
183
+ for (const entry of readdirSync(absDir)) {
184
+ if (entry.startsWith(".") || entry === "node_modules")
185
+ continue;
186
+ const subDir = join(absDir, entry);
187
+ try {
188
+ if (!statSync(subDir).isDirectory())
189
+ continue;
190
+ }
191
+ catch {
192
+ continue;
193
+ }
194
+ dirs.push({ name: entry, path: subDir });
195
+ }
196
+ }
197
+ catch {
198
+ // Permission denied — skip
199
+ }
200
+ }
201
+ return dirs;
202
+ }
203
+ /**
204
+ * Load the raw config (for checking flags like collectSystemOps).
205
+ */
206
+ export function loadConfig() {
207
+ const configPath = findConfigFile();
208
+ if (configPath) {
209
+ return JSON.parse(readFileSync(configPath, "utf-8"));
210
+ }
211
+ return {};
212
+ }
213
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { Chunk } from "./ingest.js";
2
+ /**
3
+ * Initialize the embedding pipeline (downloads model on first run, ~22MB).
4
+ * Subsequent calls use cached model.
5
+ */
6
+ export declare function initEmbeddings(): Promise<boolean>;
7
+ /**
8
+ * An embedded chunk with its vector.
9
+ */
10
+ export interface EmbeddedChunk {
11
+ chunk: Chunk;
12
+ vector: Float32Array;
13
+ }
14
+ /**
15
+ * Embed all chunks. Returns the chunks with their vectors.
16
+ * Shows progress on stderr.
17
+ */
18
+ export declare function embedChunks(chunks: Chunk[]): Promise<EmbeddedChunk[]>;
19
+ export interface VectorSearchResult {
20
+ chunk: Chunk;
21
+ score: number;
22
+ }
23
+ /**
24
+ * Semantic search: embed the query, then find most similar chunks.
25
+ */
26
+ export declare function vectorSearch(query: string, embeddedChunks: EmbeddedChunk[], topK?: number): Promise<VectorSearchResult[]>;
27
+ /**
28
+ * Check if embeddings are available.
29
+ */
30
+ export declare function isEmbeddingsReady(): boolean;
31
+ //# sourceMappingURL=embeddings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../src/embeddings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAQzC;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAgBvD;AA2BD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,EAAE,YAAY,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAwB3E;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,aAAa,EAAE,EAC/B,IAAI,GAAE,MAAW,GAChB,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAY/B;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C"}
@@ -0,0 +1,91 @@
1
+ // We dynamically import @huggingface/transformers to keep startup fast
2
+ // and handle the case where it fails gracefully.
3
+ let embedPipeline = null;
4
+ const MODEL_NAME = "Xenova/all-MiniLM-L6-v2";
5
+ /**
6
+ * Initialize the embedding pipeline (downloads model on first run, ~22MB).
7
+ * Subsequent calls use cached model.
8
+ */
9
+ export async function initEmbeddings() {
10
+ try {
11
+ console.error(`[ContextEngine] 🧠 Loading embedding model: ${MODEL_NAME}...`);
12
+ const { pipeline } = await import("@huggingface/transformers");
13
+ embedPipeline = await pipeline("feature-extraction", MODEL_NAME, {
14
+ dtype: "fp32",
15
+ });
16
+ console.error(`[ContextEngine] ✅ Embedding model loaded`);
17
+ return true;
18
+ }
19
+ catch (err) {
20
+ console.error(`[ContextEngine] ⚠ Embeddings unavailable (keyword search only):`, err.message);
21
+ return false;
22
+ }
23
+ }
24
+ /**
25
+ * Embed a single text string → float32 vector (384 dimensions).
26
+ */
27
+ async function embedText(text) {
28
+ const output = await embedPipeline(text, {
29
+ pooling: "mean",
30
+ normalize: true,
31
+ });
32
+ // output.data is a flat typed array
33
+ return new Float32Array(output.data);
34
+ }
35
+ /**
36
+ * Cosine similarity between two vectors.
37
+ * Both must be normalized (which MiniLM + normalize:true guarantees),
38
+ * so dot product = cosine similarity.
39
+ */
40
+ function cosineSimilarity(a, b) {
41
+ let dot = 0;
42
+ for (let i = 0; i < a.length; i++) {
43
+ dot += a[i] * b[i];
44
+ }
45
+ return dot;
46
+ }
47
+ /**
48
+ * Embed all chunks. Returns the chunks with their vectors.
49
+ * Shows progress on stderr.
50
+ */
51
+ export async function embedChunks(chunks) {
52
+ const results = [];
53
+ const total = chunks.length;
54
+ const batchSize = 10;
55
+ for (let i = 0; i < total; i += batchSize) {
56
+ const batch = chunks.slice(i, i + batchSize);
57
+ const batchResults = await Promise.all(batch.map(async (chunk) => {
58
+ // Embed section + content together for context
59
+ const text = `${chunk.section}\n${chunk.content}`.slice(0, 512);
60
+ const vector = await embedText(text);
61
+ return { chunk, vector };
62
+ }));
63
+ results.push(...batchResults);
64
+ const done = Math.min(i + batchSize, total);
65
+ if (done % 50 === 0 || done === total) {
66
+ console.error(`[ContextEngine] 📊 Embedded ${done}/${total} chunks`);
67
+ }
68
+ }
69
+ return results;
70
+ }
71
+ /**
72
+ * Semantic search: embed the query, then find most similar chunks.
73
+ */
74
+ export async function vectorSearch(query, embeddedChunks, topK = 10) {
75
+ if (!embedPipeline || embeddedChunks.length === 0)
76
+ return [];
77
+ const queryVector = await embedText(query);
78
+ const scored = embeddedChunks.map((ec) => ({
79
+ chunk: ec.chunk,
80
+ score: cosineSimilarity(queryVector, ec.vector),
81
+ }));
82
+ scored.sort((a, b) => b.score - a.score);
83
+ return scored.slice(0, topK);
84
+ }
85
+ /**
86
+ * Check if embeddings are available.
87
+ */
88
+ export function isEmbeddingsReady() {
89
+ return embedPipeline !== null;
90
+ }
91
+ //# sourceMappingURL=embeddings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../src/embeddings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}