agent-knowledge 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/CHANGELOG.md +77 -0
- package/LICENSE +21 -0
- package/README.md +191 -0
- package/dist/dashboard.d.ts +4 -0
- package/dist/dashboard.d.ts.map +1 -0
- package/dist/dashboard.js +434 -0
- package/dist/dashboard.js.map +1 -0
- package/dist/embeddings/claude.d.ts +21 -0
- package/dist/embeddings/claude.d.ts.map +1 -0
- package/dist/embeddings/claude.js +84 -0
- package/dist/embeddings/claude.js.map +1 -0
- package/dist/embeddings/factory.d.ts +9 -0
- package/dist/embeddings/factory.d.ts.map +1 -0
- package/dist/embeddings/factory.js +60 -0
- package/dist/embeddings/factory.js.map +1 -0
- package/dist/embeddings/gemini.d.ts +21 -0
- package/dist/embeddings/gemini.d.ts.map +1 -0
- package/dist/embeddings/gemini.js +86 -0
- package/dist/embeddings/gemini.js.map +1 -0
- package/dist/embeddings/index.d.ts +4 -0
- package/dist/embeddings/index.d.ts.map +1 -0
- package/dist/embeddings/index.js +3 -0
- package/dist/embeddings/index.js.map +1 -0
- package/dist/embeddings/local.d.ts +20 -0
- package/dist/embeddings/local.d.ts.map +1 -0
- package/dist/embeddings/local.js +73 -0
- package/dist/embeddings/local.js.map +1 -0
- package/dist/embeddings/openai.d.ts +20 -0
- package/dist/embeddings/openai.d.ts.map +1 -0
- package/dist/embeddings/openai.js +84 -0
- package/dist/embeddings/openai.js.map +1 -0
- package/dist/embeddings/types.d.ts +39 -0
- package/dist/embeddings/types.d.ts.map +1 -0
- package/dist/embeddings/types.js +12 -0
- package/dist/embeddings/types.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/knowledge/distill.d.ts +27 -0
- package/dist/knowledge/distill.d.ts.map +1 -0
- package/dist/knowledge/distill.js +407 -0
- package/dist/knowledge/distill.js.map +1 -0
- package/dist/knowledge/git.d.ts +30 -0
- package/dist/knowledge/git.d.ts.map +1 -0
- package/dist/knowledge/git.js +228 -0
- package/dist/knowledge/git.js.map +1 -0
- package/dist/knowledge/search.d.ts +20 -0
- package/dist/knowledge/search.d.ts.map +1 -0
- package/dist/knowledge/search.js +72 -0
- package/dist/knowledge/search.js.map +1 -0
- package/dist/knowledge/store.d.ts +47 -0
- package/dist/knowledge/store.d.ts.map +1 -0
- package/dist/knowledge/store.js +173 -0
- package/dist/knowledge/store.js.map +1 -0
- package/dist/search/excerpt.d.ts +12 -0
- package/dist/search/excerpt.d.ts.map +1 -0
- package/dist/search/excerpt.js +28 -0
- package/dist/search/excerpt.js.map +1 -0
- package/dist/search/fuzzy.d.ts +15 -0
- package/dist/search/fuzzy.d.ts.map +1 -0
- package/dist/search/fuzzy.js +81 -0
- package/dist/search/fuzzy.js.map +1 -0
- package/dist/search/tfidf.d.ts +19 -0
- package/dist/search/tfidf.d.ts.map +1 -0
- package/dist/search/tfidf.js +200 -0
- package/dist/search/tfidf.js.map +1 -0
- package/dist/search/types.d.ts +19 -0
- package/dist/search/types.d.ts.map +1 -0
- package/dist/search/types.js +2 -0
- package/dist/search/types.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +518 -0
- package/dist/server.js.map +1 -0
- package/dist/sessions/indexer.d.ts +15 -0
- package/dist/sessions/indexer.d.ts.map +1 -0
- package/dist/sessions/indexer.js +182 -0
- package/dist/sessions/indexer.js.map +1 -0
- package/dist/sessions/parser.d.ts +58 -0
- package/dist/sessions/parser.d.ts.map +1 -0
- package/dist/sessions/parser.js +142 -0
- package/dist/sessions/parser.js.map +1 -0
- package/dist/sessions/scopes.d.ts +16 -0
- package/dist/sessions/scopes.d.ts.map +1 -0
- package/dist/sessions/scopes.js +153 -0
- package/dist/sessions/scopes.js.map +1 -0
- package/dist/sessions/search.d.ts +26 -0
- package/dist/sessions/search.d.ts.map +1 -0
- package/dist/sessions/search.js +256 -0
- package/dist/sessions/search.js.map +1 -0
- package/dist/sessions/summary.d.ts +28 -0
- package/dist/sessions/summary.d.ts.map +1 -0
- package/dist/sessions/summary.js +135 -0
- package/dist/sessions/summary.js.map +1 -0
- package/dist/types.d.ts +26 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +109 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/app.js +1029 -0
- package/dist/ui/index.html +373 -0
- package/dist/ui/styles.css +1508 -0
- package/dist/ui/ui/app.js +811 -0
- package/dist/ui/ui/index.html +300 -0
- package/dist/ui/ui/styles.css +1154 -0
- package/dist/validate.d.ts +21 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +86 -0
- package/dist/validate.js.map +1 -0
- package/dist/vectorstore/chunker.d.ts +48 -0
- package/dist/vectorstore/chunker.d.ts.map +1 -0
- package/dist/vectorstore/chunker.js +165 -0
- package/dist/vectorstore/chunker.js.map +1 -0
- package/dist/vectorstore/index.d.ts +5 -0
- package/dist/vectorstore/index.d.ts.map +1 -0
- package/dist/vectorstore/index.js +3 -0
- package/dist/vectorstore/index.js.map +1 -0
- package/dist/vectorstore/store.d.ts +139 -0
- package/dist/vectorstore/store.d.ts.map +1 -0
- package/dist/vectorstore/store.js +500 -0
- package/dist/vectorstore/store.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/docs/ARCHITECTURE.md +244 -0
- package/docs/DASHBOARD.md +133 -0
- package/docs/SETUP.md +178 -0
- package/package.json +92 -0
- package/scripts/copy-ui.js +6 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { EmbeddingProvider } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Google Gemini embedding provider using the Generative Language API.
|
|
4
|
+
* Uses the batchEmbedContents endpoint for efficient bulk embedding.
|
|
5
|
+
*/
|
|
6
|
+
export declare class GeminiEmbeddingProvider implements EmbeddingProvider {
|
|
7
|
+
readonly name = "gemini";
|
|
8
|
+
readonly dimensions: number;
|
|
9
|
+
readonly model: string;
|
|
10
|
+
private readonly apiKey;
|
|
11
|
+
constructor(apiKey: string, modelOverride?: string);
|
|
12
|
+
/** Embed one or more texts, batching internally at 100 texts per request. */
|
|
13
|
+
embed(texts: string[]): Promise<number[][]>;
|
|
14
|
+
/** Embed a single text. */
|
|
15
|
+
embedOne(text: string): Promise<number[]>;
|
|
16
|
+
/** Check availability by making a test embedding request. */
|
|
17
|
+
isAvailable(): Promise<boolean>;
|
|
18
|
+
private get endpoint();
|
|
19
|
+
private requestEmbeddings;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=gemini.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/embeddings/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAOpD;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,iBAAiB;IAC/D,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM;IAMlD,6EAA6E;IACvE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAYjD,2BAA2B;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAK/C,6DAA6D;IACvD,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IASrC,OAAO,KAAK,QAAQ,GAEnB;YAEa,iBAAiB;CAuChC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
const DEFAULT_MODEL = 'text-embedding-004';
|
|
2
|
+
const DEFAULT_DIMENSIONS = 768;
|
|
3
|
+
const MAX_BATCH_SIZE = 100;
|
|
4
|
+
const TIMEOUT_MS = 30_000;
|
|
5
|
+
/**
|
|
6
|
+
* Google Gemini embedding provider using the Generative Language API.
|
|
7
|
+
* Uses the batchEmbedContents endpoint for efficient bulk embedding.
|
|
8
|
+
*/
|
|
9
|
+
export class GeminiEmbeddingProvider {
|
|
10
|
+
name = 'gemini';
|
|
11
|
+
dimensions;
|
|
12
|
+
model;
|
|
13
|
+
apiKey;
|
|
14
|
+
constructor(apiKey, modelOverride) {
|
|
15
|
+
this.apiKey = apiKey;
|
|
16
|
+
this.model = modelOverride || DEFAULT_MODEL;
|
|
17
|
+
this.dimensions = DEFAULT_DIMENSIONS;
|
|
18
|
+
}
|
|
19
|
+
/** Embed one or more texts, batching internally at 100 texts per request. */
|
|
20
|
+
async embed(texts) {
|
|
21
|
+
if (texts.length === 0)
|
|
22
|
+
return [];
|
|
23
|
+
const results = [];
|
|
24
|
+
for (let i = 0; i < texts.length; i += MAX_BATCH_SIZE) {
|
|
25
|
+
const batch = texts.slice(i, i + MAX_BATCH_SIZE);
|
|
26
|
+
const vectors = await this.requestEmbeddings(batch);
|
|
27
|
+
results.push(...vectors);
|
|
28
|
+
}
|
|
29
|
+
return results;
|
|
30
|
+
}
|
|
31
|
+
/** Embed a single text. */
|
|
32
|
+
async embedOne(text) {
|
|
33
|
+
const results = await this.embed([text]);
|
|
34
|
+
return results[0] ?? [];
|
|
35
|
+
}
|
|
36
|
+
/** Check availability by making a test embedding request. */
|
|
37
|
+
async isAvailable() {
|
|
38
|
+
try {
|
|
39
|
+
const result = await this.embed(['test']);
|
|
40
|
+
return result.length === 1 && result[0].length > 0;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
get endpoint() {
|
|
47
|
+
return `https://generativelanguage.googleapis.com/v1beta/models/${this.model}:batchEmbedContents?key=${this.apiKey}`;
|
|
48
|
+
}
|
|
49
|
+
async requestEmbeddings(texts, retry = true) {
|
|
50
|
+
const modelPath = `models/${this.model}`;
|
|
51
|
+
const requests = texts.map((text) => ({
|
|
52
|
+
model: modelPath,
|
|
53
|
+
content: { parts: [{ text }] },
|
|
54
|
+
}));
|
|
55
|
+
try {
|
|
56
|
+
const response = await fetch(this.endpoint, {
|
|
57
|
+
method: 'POST',
|
|
58
|
+
headers: { 'Content-Type': 'application/json' },
|
|
59
|
+
body: JSON.stringify({ requests }),
|
|
60
|
+
signal: AbortSignal.timeout(TIMEOUT_MS),
|
|
61
|
+
});
|
|
62
|
+
if (response.status === 429 && retry) {
|
|
63
|
+
const retryAfter = parseInt(response.headers.get('retry-after') || '1', 10);
|
|
64
|
+
const delayMs = Math.max(retryAfter, 1) * 1000;
|
|
65
|
+
console.error(`[knowledge] Gemini rate limited, retrying in ${delayMs}ms`);
|
|
66
|
+
await sleep(delayMs);
|
|
67
|
+
return this.requestEmbeddings(texts, false);
|
|
68
|
+
}
|
|
69
|
+
if (!response.ok) {
|
|
70
|
+
const body = await response.text().catch(() => '');
|
|
71
|
+
console.error(`[knowledge] Gemini embedding request failed (${response.status}): ${body}`);
|
|
72
|
+
return texts.map(() => []);
|
|
73
|
+
}
|
|
74
|
+
const json = (await response.json());
|
|
75
|
+
return json.embeddings.map((e) => e.values);
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
console.error('[knowledge] Gemini embedding request error:', err);
|
|
79
|
+
return texts.map(() => []);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function sleep(ms) {
|
|
84
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=gemini.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/embeddings/gemini.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/embeddings/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/embeddings/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { EmbeddingProvider } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Local embedding provider using @huggingface/transformers.
|
|
4
|
+
* Downloads the model silently on first use and caches the pipeline as a singleton.
|
|
5
|
+
*/
|
|
6
|
+
export declare class LocalEmbeddingProvider implements EmbeddingProvider {
|
|
7
|
+
readonly name = "local";
|
|
8
|
+
readonly dimensions: number;
|
|
9
|
+
readonly model: string;
|
|
10
|
+
private readonly batchSize;
|
|
11
|
+
constructor(modelOverride?: string, batchSize?: number);
|
|
12
|
+
/** Embed one or more texts, batching internally if needed. */
|
|
13
|
+
embed(texts: string[]): Promise<number[][]>;
|
|
14
|
+
/** Embed a single text. */
|
|
15
|
+
embedOne(text: string): Promise<number[]>;
|
|
16
|
+
/** Check if the provider is available. Attempts to load the model if not yet loaded. */
|
|
17
|
+
isAvailable(): Promise<boolean>;
|
|
18
|
+
private getPipeline;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=local.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/embeddings/local.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AA2BpD;;;GAGG;AACH,qBAAa,sBAAuB,YAAW,iBAAiB;IAC9D,QAAQ,CAAC,IAAI,WAAW;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,aAAa,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;IAMtD,8DAA8D;IACxD,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAsBjD,2BAA2B;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAK/C,wFAAwF;IAClF,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;YAKvB,WAAW;CAM1B"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
const DEFAULT_MODEL = 'Xenova/all-MiniLM-L6-v2';
|
|
2
|
+
const DEFAULT_DIMENSIONS = 384;
|
|
3
|
+
const DEFAULT_BATCH_SIZE = 32;
|
|
4
|
+
/** Cached pipeline instance — only loaded once. */
|
|
5
|
+
let _pipeline = null;
|
|
6
|
+
async function createPipeline(model) {
|
|
7
|
+
try {
|
|
8
|
+
const { pipeline } = await import('@huggingface/transformers');
|
|
9
|
+
const pipe = await pipeline('feature-extraction', model, {
|
|
10
|
+
dtype: 'fp32',
|
|
11
|
+
});
|
|
12
|
+
return pipe;
|
|
13
|
+
}
|
|
14
|
+
catch (err) {
|
|
15
|
+
console.error(`[knowledge] Failed to load embedding model ${model}:`, err);
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Local embedding provider using @huggingface/transformers.
|
|
21
|
+
* Downloads the model silently on first use and caches the pipeline as a singleton.
|
|
22
|
+
*/
|
|
23
|
+
export class LocalEmbeddingProvider {
|
|
24
|
+
name = 'local';
|
|
25
|
+
dimensions;
|
|
26
|
+
model;
|
|
27
|
+
batchSize;
|
|
28
|
+
constructor(modelOverride, batchSize) {
|
|
29
|
+
this.model = modelOverride || DEFAULT_MODEL;
|
|
30
|
+
this.dimensions = DEFAULT_DIMENSIONS;
|
|
31
|
+
this.batchSize = batchSize ?? DEFAULT_BATCH_SIZE;
|
|
32
|
+
}
|
|
33
|
+
/** Embed one or more texts, batching internally if needed. */
|
|
34
|
+
async embed(texts) {
|
|
35
|
+
const pipe = await this.getPipeline();
|
|
36
|
+
if (!pipe)
|
|
37
|
+
return texts.map(() => []);
|
|
38
|
+
const results = [];
|
|
39
|
+
for (let i = 0; i < texts.length; i += this.batchSize) {
|
|
40
|
+
const batch = texts.slice(i, i + this.batchSize);
|
|
41
|
+
try {
|
|
42
|
+
const output = await pipe(batch, {
|
|
43
|
+
pooling: 'mean',
|
|
44
|
+
normalize: true,
|
|
45
|
+
});
|
|
46
|
+
const vectors = output.tolist();
|
|
47
|
+
results.push(...vectors);
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
console.error('[knowledge] Embedding batch failed:', err);
|
|
51
|
+
results.push(...batch.map(() => []));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return results;
|
|
55
|
+
}
|
|
56
|
+
/** Embed a single text. */
|
|
57
|
+
async embedOne(text) {
|
|
58
|
+
const results = await this.embed([text]);
|
|
59
|
+
return results[0] ?? [];
|
|
60
|
+
}
|
|
61
|
+
/** Check if the provider is available. Attempts to load the model if not yet loaded. */
|
|
62
|
+
async isAvailable() {
|
|
63
|
+
const pipe = await this.getPipeline();
|
|
64
|
+
return pipe !== null;
|
|
65
|
+
}
|
|
66
|
+
async getPipeline() {
|
|
67
|
+
if (!_pipeline) {
|
|
68
|
+
_pipeline = createPipeline(this.model);
|
|
69
|
+
}
|
|
70
|
+
return _pipeline;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=local.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/embeddings/local.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { EmbeddingProvider } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* OpenAI embedding provider using the text-embedding-3-small model.
|
|
4
|
+
* Communicates via native fetch — no SDK dependency.
|
|
5
|
+
*/
|
|
6
|
+
export declare class OpenAIEmbeddingProvider implements EmbeddingProvider {
|
|
7
|
+
readonly name = "openai";
|
|
8
|
+
readonly dimensions: number;
|
|
9
|
+
readonly model: string;
|
|
10
|
+
private readonly apiKey;
|
|
11
|
+
constructor(apiKey: string, modelOverride?: string);
|
|
12
|
+
/** Embed one or more texts, batching internally at 2048 texts per request. */
|
|
13
|
+
embed(texts: string[]): Promise<number[][]>;
|
|
14
|
+
/** Embed a single text. */
|
|
15
|
+
embedOne(text: string): Promise<number[]>;
|
|
16
|
+
/** Check availability by making a test embedding request. */
|
|
17
|
+
isAvailable(): Promise<boolean>;
|
|
18
|
+
private requestEmbeddings;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=openai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/embeddings/openai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAQpD;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,iBAAiB;IAC/D,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM;IAMlD,8EAA8E;IACxE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAYjD,2BAA2B;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAK/C,6DAA6D;IACvD,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;YASvB,iBAAiB;CAsChC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
const DEFAULT_MODEL = 'text-embedding-3-small';
|
|
2
|
+
const DEFAULT_DIMENSIONS = 1536;
|
|
3
|
+
const MAX_BATCH_SIZE = 2048;
|
|
4
|
+
const TIMEOUT_MS = 30_000;
|
|
5
|
+
const ENDPOINT = 'https://api.openai.com/v1/embeddings';
|
|
6
|
+
/**
|
|
7
|
+
* OpenAI embedding provider using the text-embedding-3-small model.
|
|
8
|
+
* Communicates via native fetch — no SDK dependency.
|
|
9
|
+
*/
|
|
10
|
+
export class OpenAIEmbeddingProvider {
|
|
11
|
+
name = 'openai';
|
|
12
|
+
dimensions;
|
|
13
|
+
model;
|
|
14
|
+
apiKey;
|
|
15
|
+
constructor(apiKey, modelOverride) {
|
|
16
|
+
this.apiKey = apiKey;
|
|
17
|
+
this.model = modelOverride || DEFAULT_MODEL;
|
|
18
|
+
this.dimensions = DEFAULT_DIMENSIONS;
|
|
19
|
+
}
|
|
20
|
+
/** Embed one or more texts, batching internally at 2048 texts per request. */
|
|
21
|
+
async embed(texts) {
|
|
22
|
+
if (texts.length === 0)
|
|
23
|
+
return [];
|
|
24
|
+
const results = [];
|
|
25
|
+
for (let i = 0; i < texts.length; i += MAX_BATCH_SIZE) {
|
|
26
|
+
const batch = texts.slice(i, i + MAX_BATCH_SIZE);
|
|
27
|
+
const vectors = await this.requestEmbeddings(batch);
|
|
28
|
+
results.push(...vectors);
|
|
29
|
+
}
|
|
30
|
+
return results;
|
|
31
|
+
}
|
|
32
|
+
/** Embed a single text. */
|
|
33
|
+
async embedOne(text) {
|
|
34
|
+
const results = await this.embed([text]);
|
|
35
|
+
return results[0] ?? [];
|
|
36
|
+
}
|
|
37
|
+
/** Check availability by making a test embedding request. */
|
|
38
|
+
async isAvailable() {
|
|
39
|
+
try {
|
|
40
|
+
const result = await this.embed(['test']);
|
|
41
|
+
return result.length === 1 && result[0].length > 0;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async requestEmbeddings(texts, retry = true) {
|
|
48
|
+
try {
|
|
49
|
+
const response = await fetch(ENDPOINT, {
|
|
50
|
+
method: 'POST',
|
|
51
|
+
headers: {
|
|
52
|
+
'Content-Type': 'application/json',
|
|
53
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
54
|
+
},
|
|
55
|
+
body: JSON.stringify({ model: this.model, input: texts }),
|
|
56
|
+
signal: AbortSignal.timeout(TIMEOUT_MS),
|
|
57
|
+
});
|
|
58
|
+
if (response.status === 429 && retry) {
|
|
59
|
+
const retryAfter = parseInt(response.headers.get('retry-after') || '1', 10);
|
|
60
|
+
const delayMs = Math.max(retryAfter, 1) * 1000;
|
|
61
|
+
console.error(`[knowledge] OpenAI rate limited, retrying in ${delayMs}ms`);
|
|
62
|
+
await sleep(delayMs);
|
|
63
|
+
return this.requestEmbeddings(texts, false);
|
|
64
|
+
}
|
|
65
|
+
if (!response.ok) {
|
|
66
|
+
const body = await response.text().catch(() => '');
|
|
67
|
+
console.error(`[knowledge] OpenAI embedding request failed (${response.status}): ${body}`);
|
|
68
|
+
return texts.map(() => []);
|
|
69
|
+
}
|
|
70
|
+
const json = (await response.json());
|
|
71
|
+
// API may return embeddings out of order — sort by index
|
|
72
|
+
const sorted = json.data.sort((a, b) => a.index - b.index);
|
|
73
|
+
return sorted.map((d) => d.embedding);
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
console.error('[knowledge] OpenAI embedding request error:', err);
|
|
77
|
+
return texts.map(() => []);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function sleep(ms) {
|
|
82
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/embeddings/openai.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedding provider interface — all providers (local, OpenAI, Claude, Gemini) implement this.
|
|
3
|
+
*/
|
|
4
|
+
export interface EmbeddingProvider {
|
|
5
|
+
/** Provider identifier */
|
|
6
|
+
readonly name: string;
|
|
7
|
+
/** Vector dimensions produced by this provider */
|
|
8
|
+
readonly dimensions: number;
|
|
9
|
+
/** Model identifier */
|
|
10
|
+
readonly model: string;
|
|
11
|
+
/**
|
|
12
|
+
* Embed one or more texts. Returns array of float arrays.
|
|
13
|
+
* Implementations MUST handle batching internally if needed.
|
|
14
|
+
*/
|
|
15
|
+
embed(texts: string[]): Promise<number[][]>;
|
|
16
|
+
/**
|
|
17
|
+
* Embed a single text. Convenience wrapper.
|
|
18
|
+
*/
|
|
19
|
+
embedOne(text: string): Promise<number[]>;
|
|
20
|
+
/**
|
|
21
|
+
* Check if the provider is available (model downloaded, API key valid, etc.)
|
|
22
|
+
*/
|
|
23
|
+
isAvailable(): Promise<boolean>;
|
|
24
|
+
}
|
|
25
|
+
export type ProviderName = 'local' | 'openai' | 'claude' | 'gemini';
|
|
26
|
+
export interface EmbeddingConfig {
|
|
27
|
+
provider: ProviderName;
|
|
28
|
+
/** TF-IDF vs semantic weight. 0 = pure semantic, 1 = pure TF-IDF. Default 0.3 */
|
|
29
|
+
alpha: number;
|
|
30
|
+
/** API keys for external providers */
|
|
31
|
+
openaiApiKey?: string;
|
|
32
|
+
claudeApiKey?: string;
|
|
33
|
+
geminiApiKey?: string;
|
|
34
|
+
/** Custom model override per provider */
|
|
35
|
+
modelOverride?: string;
|
|
36
|
+
}
|
|
37
|
+
/** Read embedding configuration from environment variables. */
|
|
38
|
+
export declare function getEmbeddingConfig(): EmbeddingConfig;
|
|
39
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/embeddings/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,0BAA0B;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,kDAAkD;IAClD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,uBAAuB;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC5C;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1C;;OAEG;IACH,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEpE,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,YAAY,CAAC;IACvB,iFAAiF;IACjF,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yCAAyC;IACzC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,+DAA+D;AAC/D,wBAAgB,kBAAkB,IAAI,eAAe,CASpD"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Read embedding configuration from environment variables. */
|
|
2
|
+
export function getEmbeddingConfig() {
|
|
3
|
+
return {
|
|
4
|
+
provider: process.env.KNOWLEDGE_EMBEDDING_PROVIDER || 'local',
|
|
5
|
+
alpha: parseFloat(process.env.KNOWLEDGE_EMBEDDING_ALPHA || '0.3'),
|
|
6
|
+
openaiApiKey: process.env.KNOWLEDGE_OPENAI_API_KEY || process.env.OPENAI_API_KEY,
|
|
7
|
+
claudeApiKey: process.env.KNOWLEDGE_CLAUDE_API_KEY || process.env.ANTHROPIC_API_KEY,
|
|
8
|
+
geminiApiKey: process.env.KNOWLEDGE_GEMINI_API_KEY || process.env.GEMINI_API_KEY,
|
|
9
|
+
modelOverride: process.env.KNOWLEDGE_EMBEDDING_MODEL,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/embeddings/types.ts"],"names":[],"mappings":"AAuCA,+DAA+D;AAC/D,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,QAAQ,EAAG,OAAO,CAAC,GAAG,CAAC,4BAA6C,IAAI,OAAO;QAC/E,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,KAAK,CAAC;QACjE,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc;QAChF,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB;QACnF,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc;QAChF,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,yBAAyB;KACrD,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
2
|
+
import { createServer } from './server.js';
|
|
3
|
+
import { startDashboard } from './dashboard.js';
|
|
4
|
+
async function main() {
|
|
5
|
+
const port = parseInt(process.env.CORTEX_PORT || '3423', 10);
|
|
6
|
+
try {
|
|
7
|
+
await startDashboard(port);
|
|
8
|
+
process.stderr.write(`Dashboard: http://localhost:${port}\n`);
|
|
9
|
+
}
|
|
10
|
+
catch (err) {
|
|
11
|
+
process.stderr.write(`Warning: Dashboard failed to start: ${err}\n`);
|
|
12
|
+
}
|
|
13
|
+
const server = createServer();
|
|
14
|
+
const transport = new StdioServerTransport();
|
|
15
|
+
await server.connect(transport);
|
|
16
|
+
}
|
|
17
|
+
main().catch(console.error);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;IAE7D,IAAI,CAAC;QACH,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,IAAI,IAAI,CAAC,CAAC;IAChE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,GAAG,IAAI,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scrub secrets and system noise from text before it reaches git.
|
|
3
|
+
*/
|
|
4
|
+
export declare function scrubContent(text: string): string;
|
|
5
|
+
/**
|
|
6
|
+
* Normalize a Claude Code project directory name to a clean, readable
|
|
7
|
+
* project name suitable for the knowledge base.
|
|
8
|
+
*
|
|
9
|
+
* Input examples:
|
|
10
|
+
* "C--Users-Mathias--claude-mcp-servers-agent-comm--worktrees-review-security"
|
|
11
|
+
* "C--Users-Mathias-odoo19-odoo"
|
|
12
|
+
* "C--Users-Mathias--agent-comm-swarm-scale-test-3"
|
|
13
|
+
* "C--Users-Mathias--claude"
|
|
14
|
+
*
|
|
15
|
+
* Output:
|
|
16
|
+
* "agent-comm" (worktree merged with parent)
|
|
17
|
+
* "odoo19" (Windows path cleaned)
|
|
18
|
+
* "agent-comm" (swarm merged with parent)
|
|
19
|
+
* "claude-code-config" (special case for ~/.claude)
|
|
20
|
+
*/
|
|
21
|
+
export declare function normalizeProjectName(raw: string): string;
|
|
22
|
+
export declare function distillSessions(): Promise<{
|
|
23
|
+
updated: string[];
|
|
24
|
+
created: string[];
|
|
25
|
+
skipped: string[];
|
|
26
|
+
}>;
|
|
27
|
+
//# sourceMappingURL=distill.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"distill.d.ts","sourceRoot":"","sources":["../../src/knowledge/distill.ts"],"names":[],"mappings":"AAmGA;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAmBjD;AA0BD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CA+CxD;AAwKD,wBAAsB,eAAe,IAAI,OAAO,CAAC;IAC/C,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC,CAgGD"}
|