@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.
- package/LICENSE +21 -0
- package/README.md +200 -0
- package/dist/agents.d.ts +127 -0
- package/dist/agents.d.ts.map +1 -0
- package/dist/agents.js +1162 -0
- package/dist/agents.js.map +1 -0
- package/dist/cache.d.ts +15 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +117 -0
- package/dist/cache.js.map +1 -0
- package/dist/cli.d.ts +10 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +227 -0
- package/dist/cli.js.map +1 -0
- package/dist/code-chunker.d.ts +12 -0
- package/dist/code-chunker.d.ts.map +1 -0
- package/dist/code-chunker.js +263 -0
- package/dist/code-chunker.js.map +1 -0
- package/dist/collectors.d.ts +63 -0
- package/dist/collectors.d.ts.map +1 -0
- package/dist/collectors.js +617 -0
- package/dist/collectors.js.map +1 -0
- package/dist/config.d.ts +59 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +213 -0
- package/dist/config.js.map +1 -0
- package/dist/embeddings.d.ts +31 -0
- package/dist/embeddings.d.ts.map +1 -0
- package/dist/embeddings.js +91 -0
- package/dist/embeddings.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +557 -0
- package/dist/index.js.map +1 -0
- package/dist/ingest.d.ts +23 -0
- package/dist/ingest.d.ts.map +1 -0
- package/dist/ingest.js +79 -0
- package/dist/ingest.js.map +1 -0
- package/dist/search.d.ts +11 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +58 -0
- package/dist/search.js.map +1 -0
- package/dist/sessions.d.ts +46 -0
- package/dist/sessions.d.ts.map +1 -0
- package/dist/sessions.js +143 -0
- package/dist/sessions.js.map +1 -0
- package/dist/test-sessions.d.ts +2 -0
- package/dist/test-sessions.d.ts.map +1 -0
- package/dist/test-sessions.js.map +1 -0
- package/dist/test.d.ts +2 -0
- package/dist/test.d.ts.map +1 -0
- package/dist/test.js +52 -0
- package/dist/test.js.map +1 -0
- package/package.json +58 -0
package/dist/ingest.js
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from "fs";
|
|
2
|
+
import { basename } from "path";
|
|
3
|
+
/**
|
|
4
|
+
* Parse a markdown file into chunks, splitting on headings.
|
|
5
|
+
* Each chunk captures the heading hierarchy for context.
|
|
6
|
+
*/
|
|
7
|
+
function parseMarkdown(filePath, sourceName) {
|
|
8
|
+
const text = readFileSync(filePath, "utf-8");
|
|
9
|
+
const lines = text.split("\n");
|
|
10
|
+
const chunks = [];
|
|
11
|
+
// Track heading hierarchy
|
|
12
|
+
const headingStack = [];
|
|
13
|
+
let currentContent = [];
|
|
14
|
+
let chunkStartLine = 1;
|
|
15
|
+
for (let i = 0; i < lines.length; i++) {
|
|
16
|
+
const line = lines[i];
|
|
17
|
+
const headingMatch = line.match(/^(#{1,6})\s+(.+)/);
|
|
18
|
+
if (headingMatch) {
|
|
19
|
+
// Flush previous chunk
|
|
20
|
+
if (currentContent.length > 0) {
|
|
21
|
+
const content = currentContent.join("\n").trim();
|
|
22
|
+
if (content.length > 0) {
|
|
23
|
+
chunks.push({
|
|
24
|
+
source: sourceName,
|
|
25
|
+
section: headingStack.join(" > ") || basename(filePath),
|
|
26
|
+
content,
|
|
27
|
+
lineStart: chunkStartLine,
|
|
28
|
+
lineEnd: i, // line before this heading
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
const level = headingMatch[1].length;
|
|
33
|
+
const title = headingMatch[2].trim();
|
|
34
|
+
// Pop headings at same or deeper level
|
|
35
|
+
while (headingStack.length >= level) {
|
|
36
|
+
headingStack.pop();
|
|
37
|
+
}
|
|
38
|
+
headingStack.push(`${"#".repeat(level)} ${title}`);
|
|
39
|
+
currentContent = [];
|
|
40
|
+
chunkStartLine = i + 1; // 1-based
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
currentContent.push(line);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Flush last chunk
|
|
47
|
+
if (currentContent.length > 0) {
|
|
48
|
+
const content = currentContent.join("\n").trim();
|
|
49
|
+
if (content.length > 0) {
|
|
50
|
+
chunks.push({
|
|
51
|
+
source: sourceName,
|
|
52
|
+
section: headingStack.join(" > ") || basename(filePath),
|
|
53
|
+
content,
|
|
54
|
+
lineStart: chunkStartLine,
|
|
55
|
+
lineEnd: lines.length,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return chunks;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Ingest all configured knowledge sources into chunks.
|
|
63
|
+
* Skips files that don't exist (with a warning to stderr).
|
|
64
|
+
*/
|
|
65
|
+
export function ingestSources(sources) {
|
|
66
|
+
const allChunks = [];
|
|
67
|
+
for (const source of sources) {
|
|
68
|
+
if (!existsSync(source.path)) {
|
|
69
|
+
console.error(`[ContextEngine] ⚠ Skipping missing: ${source.path}`);
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
const chunks = parseMarkdown(source.path, source.name);
|
|
73
|
+
allChunks.push(...chunks);
|
|
74
|
+
console.error(`[ContextEngine] ✅ Indexed: ${source.name} (${chunks.length} chunks)`);
|
|
75
|
+
}
|
|
76
|
+
console.error(`[ContextEngine] 📦 Total: ${allChunks.length} chunks from ${sources.length} sources`);
|
|
77
|
+
return allChunks;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=ingest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ingest.js","sourceRoot":"","sources":["../src/ingest.ts"],"names":[],"mappings":"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"}
|
package/dist/search.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Chunk } from "./ingest.js";
|
|
2
|
+
export interface SearchResult {
|
|
3
|
+
chunk: Chunk;
|
|
4
|
+
score: number;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Search chunks by keyword relevance.
|
|
8
|
+
* Returns top-k results sorted by score descending.
|
|
9
|
+
*/
|
|
10
|
+
export declare function searchChunks(chunks: Chunk[], query: string, topK?: number): SearchResult[];
|
|
11
|
+
//# sourceMappingURL=search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAkDpC,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,KAAK,EAAE,EACf,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,MAAW,GAChB,YAAY,EAAE,CAehB"}
|
package/dist/search.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple TF-IDF-ish keyword search over chunks.
|
|
3
|
+
* Fast, zero-dependency — good enough for v1.
|
|
4
|
+
* Will be replaced by vector embeddings in step 3.
|
|
5
|
+
*/
|
|
6
|
+
/** Normalize and tokenize a string */
|
|
7
|
+
function tokenize(text) {
|
|
8
|
+
return text
|
|
9
|
+
.toLowerCase()
|
|
10
|
+
.replace(/[^a-z0-9\s_\-./]/g, " ")
|
|
11
|
+
.split(/\s+/)
|
|
12
|
+
.filter((t) => t.length > 1);
|
|
13
|
+
}
|
|
14
|
+
/** Score a chunk against a query using term overlap */
|
|
15
|
+
function scoreChunk(chunk, queryTokens) {
|
|
16
|
+
const contentLower = (chunk.content + " " + chunk.section).toLowerCase();
|
|
17
|
+
let score = 0;
|
|
18
|
+
for (const token of queryTokens) {
|
|
19
|
+
// Exact word boundary match scores higher
|
|
20
|
+
const regex = new RegExp(`\\b${escapeRegex(token)}\\b`, "gi");
|
|
21
|
+
const matches = contentLower.match(regex);
|
|
22
|
+
if (matches) {
|
|
23
|
+
score += matches.length * 2;
|
|
24
|
+
}
|
|
25
|
+
// Partial/substring match
|
|
26
|
+
else if (contentLower.includes(token)) {
|
|
27
|
+
score += 1;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// Bonus for matching multiple distinct query terms
|
|
31
|
+
const distinctMatches = queryTokens.filter((t) => contentLower.includes(t)).length;
|
|
32
|
+
if (distinctMatches > 1) {
|
|
33
|
+
score += distinctMatches * 3;
|
|
34
|
+
}
|
|
35
|
+
return score;
|
|
36
|
+
}
|
|
37
|
+
function escapeRegex(s) {
|
|
38
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Search chunks by keyword relevance.
|
|
42
|
+
* Returns top-k results sorted by score descending.
|
|
43
|
+
*/
|
|
44
|
+
export function searchChunks(chunks, query, topK = 10) {
|
|
45
|
+
const queryTokens = tokenize(query);
|
|
46
|
+
if (queryTokens.length === 0)
|
|
47
|
+
return [];
|
|
48
|
+
const scored = [];
|
|
49
|
+
for (const chunk of chunks) {
|
|
50
|
+
const score = scoreChunk(chunk, queryTokens);
|
|
51
|
+
if (score > 0) {
|
|
52
|
+
scored.push({ chunk, score });
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
scored.sort((a, b) => b.score - a.score);
|
|
56
|
+
return scored.slice(0, topK);
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AAEH,sCAAsC;AACtC,SAAS,QAAQ,CAAC,IAAY;IAC5B,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC;SACjC,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,uDAAuD;AACvD,SAAS,UAAU,CAAC,KAAY,EAAE,WAAqB;IACrD,MAAM,YAAY,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IACzE,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,0CAA0C;QAC1C,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,OAAO,EAAE,CAAC;YACZ,KAAK,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QAC9B,CAAC;QACD,0BAA0B;aACrB,IAAI,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACtC,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;IACH,CAAC;IAED,mDAAmD;IACnD,MAAM,eAAe,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAC/C,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CACzB,CAAC,MAAM,CAAC;IACT,IAAI,eAAe,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,IAAI,eAAe,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,WAAW,CAAC,CAAS;IAC5B,OAAO,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC;AAOD;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,MAAe,EACf,KAAa,EACb,OAAe,EAAE;IAEjB,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAExC,MAAM,MAAM,GAAmB,EAAE,CAAC;IAElC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAC7C,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACzC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export interface SessionEntry {
|
|
2
|
+
key: string;
|
|
3
|
+
value: string;
|
|
4
|
+
timestamp: string;
|
|
5
|
+
}
|
|
6
|
+
export interface Session {
|
|
7
|
+
name: string;
|
|
8
|
+
created: string;
|
|
9
|
+
updated: string;
|
|
10
|
+
entries: SessionEntry[];
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Save or update a key-value pair in a named session.
|
|
14
|
+
*/
|
|
15
|
+
export declare function saveSession(name: string, key: string, value: string): Session;
|
|
16
|
+
/**
|
|
17
|
+
* Load a session by name.
|
|
18
|
+
*/
|
|
19
|
+
export declare function loadSession(name: string): Session | null;
|
|
20
|
+
/**
|
|
21
|
+
* List all saved sessions.
|
|
22
|
+
*/
|
|
23
|
+
export declare function listSessions(): Array<{
|
|
24
|
+
name: string;
|
|
25
|
+
entries: number;
|
|
26
|
+
created: string;
|
|
27
|
+
updated: string;
|
|
28
|
+
}>;
|
|
29
|
+
/**
|
|
30
|
+
* Delete a session.
|
|
31
|
+
*/
|
|
32
|
+
export declare function deleteSession(name: string): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Format a session for display.
|
|
35
|
+
*/
|
|
36
|
+
export declare function formatSession(session: Session): string;
|
|
37
|
+
/**
|
|
38
|
+
* Format session list for display.
|
|
39
|
+
*/
|
|
40
|
+
export declare function formatSessionList(sessions: Array<{
|
|
41
|
+
name: string;
|
|
42
|
+
entries: number;
|
|
43
|
+
created: string;
|
|
44
|
+
updated: string;
|
|
45
|
+
}>): string;
|
|
46
|
+
//# sourceMappingURL=sessions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../src/sessions.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAcD;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAwB7E;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CASxD;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAyBzG;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAOnD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAiBtD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,MAAM,CAiB9H"}
|
package/dist/sessions.js
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync, unlinkSync } from "fs";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
import { homedir } from "os";
|
|
4
|
+
/**
|
|
5
|
+
* Session Persistence — save/restore conversation context between sessions.
|
|
6
|
+
*
|
|
7
|
+
* Sessions are saved as JSON files in ~/.contextengine/sessions/.
|
|
8
|
+
* Each session has a name, timestamp, and key-value data store.
|
|
9
|
+
*
|
|
10
|
+
* Use cases:
|
|
11
|
+
* - AI agent saves decisions/context at end of session → picks up next time
|
|
12
|
+
* - Track what was discussed, changed, or planned across sessions
|
|
13
|
+
* - Store project-specific notes that persist between agent restarts
|
|
14
|
+
*/
|
|
15
|
+
const SESSIONS_DIR = join(homedir(), ".contextengine", "sessions");
|
|
16
|
+
function ensureDir() {
|
|
17
|
+
if (!existsSync(SESSIONS_DIR)) {
|
|
18
|
+
mkdirSync(SESSIONS_DIR, { recursive: true });
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function sessionPath(name) {
|
|
22
|
+
// Sanitize name for filesystem
|
|
23
|
+
const safe = name.replace(/[^a-zA-Z0-9_\-\.]/g, "_").substring(0, 100);
|
|
24
|
+
return join(SESSIONS_DIR, `${safe}.json`);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Save or update a key-value pair in a named session.
|
|
28
|
+
*/
|
|
29
|
+
export function saveSession(name, key, value) {
|
|
30
|
+
ensureDir();
|
|
31
|
+
const path = sessionPath(name);
|
|
32
|
+
const now = new Date().toISOString();
|
|
33
|
+
let session;
|
|
34
|
+
if (existsSync(path)) {
|
|
35
|
+
session = JSON.parse(readFileSync(path, "utf-8"));
|
|
36
|
+
session.updated = now;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
session = { name, created: now, updated: now, entries: [] };
|
|
40
|
+
}
|
|
41
|
+
// Update existing key or add new one
|
|
42
|
+
const existing = session.entries.find((e) => e.key === key);
|
|
43
|
+
if (existing) {
|
|
44
|
+
existing.value = value;
|
|
45
|
+
existing.timestamp = now;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
session.entries.push({ key, value, timestamp: now });
|
|
49
|
+
}
|
|
50
|
+
writeFileSync(path, JSON.stringify(session, null, 2));
|
|
51
|
+
return session;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Load a session by name.
|
|
55
|
+
*/
|
|
56
|
+
export function loadSession(name) {
|
|
57
|
+
const path = sessionPath(name);
|
|
58
|
+
if (!existsSync(path))
|
|
59
|
+
return null;
|
|
60
|
+
try {
|
|
61
|
+
return JSON.parse(readFileSync(path, "utf-8"));
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* List all saved sessions.
|
|
69
|
+
*/
|
|
70
|
+
export function listSessions() {
|
|
71
|
+
ensureDir();
|
|
72
|
+
try {
|
|
73
|
+
return readdirSync(SESSIONS_DIR)
|
|
74
|
+
.filter((f) => f.endsWith(".json"))
|
|
75
|
+
.map((f) => {
|
|
76
|
+
try {
|
|
77
|
+
const session = JSON.parse(readFileSync(join(SESSIONS_DIR, f), "utf-8"));
|
|
78
|
+
return {
|
|
79
|
+
name: session.name,
|
|
80
|
+
entries: session.entries.length,
|
|
81
|
+
created: session.created,
|
|
82
|
+
updated: session.updated,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
})
|
|
89
|
+
.filter(Boolean);
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return [];
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Delete a session.
|
|
97
|
+
*/
|
|
98
|
+
export function deleteSession(name) {
|
|
99
|
+
const path = sessionPath(name);
|
|
100
|
+
if (existsSync(path)) {
|
|
101
|
+
unlinkSync(path);
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Format a session for display.
|
|
108
|
+
*/
|
|
109
|
+
export function formatSession(session) {
|
|
110
|
+
const lines = [];
|
|
111
|
+
lines.push(`# Session: ${session.name}`);
|
|
112
|
+
lines.push(`Created: ${session.created}`);
|
|
113
|
+
lines.push(`Updated: ${session.updated}`);
|
|
114
|
+
lines.push(`Entries: ${session.entries.length}`);
|
|
115
|
+
lines.push("");
|
|
116
|
+
for (const entry of session.entries) {
|
|
117
|
+
lines.push(`## ${entry.key}`);
|
|
118
|
+
lines.push(`_Updated: ${entry.timestamp}_`);
|
|
119
|
+
lines.push("");
|
|
120
|
+
lines.push(entry.value);
|
|
121
|
+
lines.push("");
|
|
122
|
+
}
|
|
123
|
+
return lines.join("\n");
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Format session list for display.
|
|
127
|
+
*/
|
|
128
|
+
export function formatSessionList(sessions) {
|
|
129
|
+
if (sessions.length === 0) {
|
|
130
|
+
return "No saved sessions. Use `save_session` to create one.";
|
|
131
|
+
}
|
|
132
|
+
const lines = [];
|
|
133
|
+
lines.push("# 📋 Saved Sessions\n");
|
|
134
|
+
lines.push("| Session | Entries | Created | Last Updated |");
|
|
135
|
+
lines.push("|---------|---------|---------|-------------|");
|
|
136
|
+
for (const s of sessions) {
|
|
137
|
+
const created = s.created.split("T")[0];
|
|
138
|
+
const updated = s.updated.split("T")[0];
|
|
139
|
+
lines.push(`| ${s.name} | ${s.entries} | ${created} | ${updated} |`);
|
|
140
|
+
}
|
|
141
|
+
return lines.join("\n");
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../src/sessions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-sessions.d.ts","sourceRoot":"","sources":["../src/test-sessions.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-sessions.js","sourceRoot":"","sources":["../src/test-sessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAExH,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AAC5B,WAAW,CAAC,cAAc,EAAE,SAAS,EAAE,qCAAqC,CAAC,CAAC;AAC9E,WAAW,CAAC,cAAc,EAAE,WAAW,EAAE,yDAAyD,CAAC,CAAC;AACpG,WAAW,CAAC,cAAc,EAAE,cAAc,EAAE,+BAA+B,CAAC,CAAC;AAC7E,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;AAE/B,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AAC9B,MAAM,CAAC,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;AACtC,IAAI,CAAC;IAAE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;AAErC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AAC9B,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;AAE/C,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;AAC7C,WAAW,CAAC,cAAc,EAAE,SAAS,EAAE,0DAA0D,CAAC,CAAC;AACnG,MAAM,EAAE,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;AACvC,IAAI,EAAE,EAAE,CAAC;IACP,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;AAC1E,CAAC;AAED,WAAW,CAAC,eAAe,EAAE,QAAQ,EAAE,2BAA2B,CAAC,CAAC;AAEpE,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;AAC3C,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;AAE/C,aAAa,CAAC,cAAc,CAAC,CAAC;AAC9B,aAAa,CAAC,eAAe,CAAC,CAAC;AAC/B,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;AACjC,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC"}
|
package/dist/test.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":""}
|
package/dist/test.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { loadSources } from "./config.js";
|
|
2
|
+
import { ingestSources } from "./ingest.js";
|
|
3
|
+
import { searchChunks } from "./search.js";
|
|
4
|
+
import { initEmbeddings, embedChunks, vectorSearch, } from "./embeddings.js";
|
|
5
|
+
async function test() {
|
|
6
|
+
// 1. Ingest
|
|
7
|
+
const sources = loadSources();
|
|
8
|
+
const chunks = ingestSources(sources);
|
|
9
|
+
// 2. Keyword search
|
|
10
|
+
console.log("\n=== KEYWORD SEARCH: 'Docker deployment PHP nginx' ===\n");
|
|
11
|
+
const kwResults = searchChunks(chunks, "Docker deployment PHP nginx", 3);
|
|
12
|
+
kwResults.forEach((r, i) => {
|
|
13
|
+
console.log(`--- Result ${i + 1} (score: ${r.score}) ---`);
|
|
14
|
+
console.log(`Source: ${r.chunk.source}`);
|
|
15
|
+
console.log(`Section: ${r.chunk.section}`);
|
|
16
|
+
console.log(`Lines: ${r.chunk.lineStart}-${r.chunk.lineEnd}`);
|
|
17
|
+
console.log(r.chunk.content.slice(0, 150));
|
|
18
|
+
console.log();
|
|
19
|
+
});
|
|
20
|
+
// 3. Embeddings
|
|
21
|
+
console.log("=== LOADING EMBEDDINGS ===\n");
|
|
22
|
+
const ready = await initEmbeddings();
|
|
23
|
+
if (!ready) {
|
|
24
|
+
console.log("Embeddings not available — done.");
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
console.log(`Embedding ${chunks.length} chunks...`);
|
|
28
|
+
const embedded = await embedChunks(chunks);
|
|
29
|
+
console.log(`Embedded ${embedded.length} chunks\n`);
|
|
30
|
+
// 4. Semantic search
|
|
31
|
+
console.log("=== SEMANTIC SEARCH: 'how to deploy to production server' ===\n");
|
|
32
|
+
const semResults = await vectorSearch("how to deploy to production server", embedded, 3);
|
|
33
|
+
semResults.forEach((r, i) => {
|
|
34
|
+
console.log(`--- Result ${i + 1} (score: ${r.score.toFixed(4)}) ---`);
|
|
35
|
+
console.log(`Source: ${r.chunk.source}`);
|
|
36
|
+
console.log(`Section: ${r.chunk.section}`);
|
|
37
|
+
console.log(r.chunk.content.slice(0, 150));
|
|
38
|
+
console.log();
|
|
39
|
+
});
|
|
40
|
+
// 5. Second semantic test — different query
|
|
41
|
+
console.log("=== SEMANTIC SEARCH: 'email queue worker supervisor' ===\n");
|
|
42
|
+
const semResults2 = await vectorSearch("email queue worker supervisor", embedded, 3);
|
|
43
|
+
semResults2.forEach((r, i) => {
|
|
44
|
+
console.log(`--- Result ${i + 1} (score: ${r.score.toFixed(4)}) ---`);
|
|
45
|
+
console.log(`Source: ${r.chunk.source}`);
|
|
46
|
+
console.log(`Section: ${r.chunk.section}`);
|
|
47
|
+
console.log(r.chunk.content.slice(0, 150));
|
|
48
|
+
console.log();
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
test().catch(console.error);
|
|
52
|
+
//# sourceMappingURL=test.js.map
|
package/dist/test.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.js","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@compr/contextengine-mcp",
|
|
3
|
+
"version": "1.9.44",
|
|
4
|
+
"description": "MCP server that turns your project documentation into a queryable knowledge base for AI coding agents",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"contextengine-mcp": "dist/cli.js",
|
|
9
|
+
"contextengine": "dist/cli.js"
|
|
10
|
+
},
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsc",
|
|
13
|
+
"dev": "tsc --watch",
|
|
14
|
+
"start": "node dist/index.js",
|
|
15
|
+
"prepublishOnly": "npm run build"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"mcp",
|
|
19
|
+
"model-context-protocol",
|
|
20
|
+
"copilot",
|
|
21
|
+
"claude",
|
|
22
|
+
"cursor",
|
|
23
|
+
"ai",
|
|
24
|
+
"knowledge-base",
|
|
25
|
+
"documentation",
|
|
26
|
+
"context",
|
|
27
|
+
"rag",
|
|
28
|
+
"search",
|
|
29
|
+
"developer-tools"
|
|
30
|
+
],
|
|
31
|
+
"author": "FASTPROD",
|
|
32
|
+
"license": "MIT",
|
|
33
|
+
"repository": {
|
|
34
|
+
"type": "git",
|
|
35
|
+
"url": "git+https://github.com/FASTPROD/ContextEngine.git"
|
|
36
|
+
},
|
|
37
|
+
"homepage": "https://github.com/FASTPROD/ContextEngine#readme",
|
|
38
|
+
"bugs": {
|
|
39
|
+
"url": "https://github.com/FASTPROD/ContextEngine/issues"
|
|
40
|
+
},
|
|
41
|
+
"engines": {
|
|
42
|
+
"node": ">=18.0.0"
|
|
43
|
+
},
|
|
44
|
+
"files": [
|
|
45
|
+
"dist/",
|
|
46
|
+
"LICENSE",
|
|
47
|
+
"README.md"
|
|
48
|
+
],
|
|
49
|
+
"dependencies": {
|
|
50
|
+
"@huggingface/transformers": "^3.8.1",
|
|
51
|
+
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
52
|
+
"zod": "^4.3.6"
|
|
53
|
+
},
|
|
54
|
+
"devDependencies": {
|
|
55
|
+
"@types/node": "^25.2.3",
|
|
56
|
+
"typescript": "^5.9.3"
|
|
57
|
+
}
|
|
58
|
+
}
|