wikimem 0.1.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 +37 -0
- package/LICENSE +21 -0
- package/README.md +398 -0
- package/dist/cli/commands/duplicates.d.ts +3 -0
- package/dist/cli/commands/duplicates.d.ts.map +1 -0
- package/dist/cli/commands/duplicates.js +38 -0
- package/dist/cli/commands/duplicates.js.map +1 -0
- package/dist/cli/commands/improve.d.ts +3 -0
- package/dist/cli/commands/improve.d.ts.map +1 -0
- package/dist/cli/commands/improve.js +69 -0
- package/dist/cli/commands/improve.js.map +1 -0
- package/dist/cli/commands/ingest.d.ts +3 -0
- package/dist/cli/commands/ingest.d.ts.map +1 -0
- package/dist/cli/commands/ingest.js +181 -0
- package/dist/cli/commands/ingest.js.map +1 -0
- package/dist/cli/commands/init.d.ts +3 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +91 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/lint.d.ts +3 -0
- package/dist/cli/commands/lint.d.ts.map +1 -0
- package/dist/cli/commands/lint.js +49 -0
- package/dist/cli/commands/lint.js.map +1 -0
- package/dist/cli/commands/query.d.ts +3 -0
- package/dist/cli/commands/query.d.ts.map +1 -0
- package/dist/cli/commands/query.js +51 -0
- package/dist/cli/commands/query.js.map +1 -0
- package/dist/cli/commands/scrape.d.ts +3 -0
- package/dist/cli/commands/scrape.d.ts.map +1 -0
- package/dist/cli/commands/scrape.js +47 -0
- package/dist/cli/commands/scrape.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +3 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +24 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/status.d.ts +3 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +30 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/watch.d.ts +3 -0
- package/dist/cli/commands/watch.d.ts.map +1 -0
- package/dist/cli/commands/watch.js +29 -0
- package/dist/cli/commands/watch.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +30 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/config.d.ts +47 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +11 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/improve.d.ts +19 -0
- package/dist/core/improve.d.ts.map +1 -0
- package/dist/core/improve.js +175 -0
- package/dist/core/improve.js.map +1 -0
- package/dist/core/index-manager.d.ts +9 -0
- package/dist/core/index-manager.d.ts.map +1 -0
- package/dist/core/index-manager.js +30 -0
- package/dist/core/index-manager.js.map +1 -0
- package/dist/core/ingest.d.ts +46 -0
- package/dist/core/ingest.d.ts.map +1 -0
- package/dist/core/ingest.js +366 -0
- package/dist/core/ingest.js.map +1 -0
- package/dist/core/lint.d.ts +19 -0
- package/dist/core/lint.d.ts.map +1 -0
- package/dist/core/lint.js +90 -0
- package/dist/core/lint.js.map +1 -0
- package/dist/core/log-manager.d.ts +2 -0
- package/dist/core/log-manager.d.ts.map +1 -0
- package/dist/core/log-manager.js +14 -0
- package/dist/core/log-manager.js.map +1 -0
- package/dist/core/obsidian.d.ts +89 -0
- package/dist/core/obsidian.d.ts.map +1 -0
- package/dist/core/obsidian.js +123 -0
- package/dist/core/obsidian.js.map +1 -0
- package/dist/core/query.d.ts +16 -0
- package/dist/core/query.d.ts.map +1 -0
- package/dist/core/query.js +77 -0
- package/dist/core/query.js.map +1 -0
- package/dist/core/scrape.d.ts +13 -0
- package/dist/core/scrape.d.ts.map +1 -0
- package/dist/core/scrape.js +103 -0
- package/dist/core/scrape.js.map +1 -0
- package/dist/core/vault.d.ts +35 -0
- package/dist/core/vault.d.ts.map +1 -0
- package/dist/core/vault.js +119 -0
- package/dist/core/vault.js.map +1 -0
- package/dist/core/watcher.d.ts +4 -0
- package/dist/core/watcher.d.ts.map +1 -0
- package/dist/core/watcher.js +34 -0
- package/dist/core/watcher.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/processors/audio.d.ts +10 -0
- package/dist/processors/audio.d.ts.map +1 -0
- package/dist/processors/audio.js +139 -0
- package/dist/processors/audio.js.map +1 -0
- package/dist/processors/docx.d.ts +12 -0
- package/dist/processors/docx.d.ts.map +1 -0
- package/dist/processors/docx.js +98 -0
- package/dist/processors/docx.js.map +1 -0
- package/dist/processors/image.d.ts +9 -0
- package/dist/processors/image.d.ts.map +1 -0
- package/dist/processors/image.js +94 -0
- package/dist/processors/image.js.map +1 -0
- package/dist/processors/pdf.d.ts +10 -0
- package/dist/processors/pdf.d.ts.map +1 -0
- package/dist/processors/pdf.js +92 -0
- package/dist/processors/pdf.js.map +1 -0
- package/dist/processors/pptx.d.ts +13 -0
- package/dist/processors/pptx.d.ts.map +1 -0
- package/dist/processors/pptx.js +165 -0
- package/dist/processors/pptx.js.map +1 -0
- package/dist/processors/text.d.ts +7 -0
- package/dist/processors/text.d.ts.map +1 -0
- package/dist/processors/text.js +9 -0
- package/dist/processors/text.js.map +1 -0
- package/dist/processors/url.d.ts +7 -0
- package/dist/processors/url.d.ts.map +1 -0
- package/dist/processors/url.js +61 -0
- package/dist/processors/url.js.map +1 -0
- package/dist/processors/video.d.ts +10 -0
- package/dist/processors/video.d.ts.map +1 -0
- package/dist/processors/video.js +115 -0
- package/dist/processors/video.js.map +1 -0
- package/dist/processors/xlsx.d.ts +13 -0
- package/dist/processors/xlsx.d.ts.map +1 -0
- package/dist/processors/xlsx.js +138 -0
- package/dist/processors/xlsx.js.map +1 -0
- package/dist/providers/claude.d.ts +10 -0
- package/dist/providers/claude.d.ts.map +1 -0
- package/dist/providers/claude.js +44 -0
- package/dist/providers/claude.js.map +1 -0
- package/dist/providers/embeddings.d.ts +62 -0
- package/dist/providers/embeddings.d.ts.map +1 -0
- package/dist/providers/embeddings.js +206 -0
- package/dist/providers/embeddings.js.map +1 -0
- package/dist/providers/index.d.ts +7 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +19 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/ollama.d.ts +10 -0
- package/dist/providers/ollama.d.ts.map +1 -0
- package/dist/providers/ollama.js +48 -0
- package/dist/providers/ollama.js.map +1 -0
- package/dist/providers/openai.d.ts +10 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +38 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/types.d.ts +33 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/search/bm25.d.ts +18 -0
- package/dist/search/bm25.d.ts.map +1 -0
- package/dist/search/bm25.js +52 -0
- package/dist/search/bm25.js.map +1 -0
- package/dist/search/index.d.ts +12 -0
- package/dist/search/index.d.ts.map +1 -0
- package/dist/search/index.js +64 -0
- package/dist/search/index.js.map +1 -0
- package/dist/search/semantic.d.ts +30 -0
- package/dist/search/semantic.d.ts.map +1 -0
- package/dist/search/semantic.js +162 -0
- package/dist/search/semantic.js.map +1 -0
- package/dist/templates/agents-md.d.ts +2 -0
- package/dist/templates/agents-md.d.ts.map +1 -0
- package/dist/templates/agents-md.js +85 -0
- package/dist/templates/agents-md.js.map +1 -0
- package/dist/templates/config-yaml.d.ts +2 -0
- package/dist/templates/config-yaml.d.ts.map +1 -0
- package/dist/templates/config-yaml.js +81 -0
- package/dist/templates/config-yaml.js.map +1 -0
- package/dist/web/server.d.ts +2 -0
- package/dist/web/server.d.ts.map +1 -0
- package/dist/web/server.js +170 -0
- package/dist/web/server.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedding providers for llmwiki.
|
|
3
|
+
* Supports Google Gemini (text-embedding-004), OpenAI (text-embedding-3-small), and local fallback.
|
|
4
|
+
*/
|
|
5
|
+
export interface EmbeddingVector {
|
|
6
|
+
values: number[];
|
|
7
|
+
model: string;
|
|
8
|
+
dimensions: number;
|
|
9
|
+
}
|
|
10
|
+
export interface EmbeddingProvider {
|
|
11
|
+
name: string;
|
|
12
|
+
embed(text: string): Promise<EmbeddingVector>;
|
|
13
|
+
embedBatch(texts: string[]): Promise<EmbeddingVector[]>;
|
|
14
|
+
isAvailable(): Promise<boolean>;
|
|
15
|
+
}
|
|
16
|
+
export interface EmbeddingResult {
|
|
17
|
+
vector: number[];
|
|
18
|
+
model: string;
|
|
19
|
+
dimensions: number;
|
|
20
|
+
text: string;
|
|
21
|
+
timestamp: string;
|
|
22
|
+
}
|
|
23
|
+
export declare class GeminiEmbeddingProvider implements EmbeddingProvider {
|
|
24
|
+
name: string;
|
|
25
|
+
private apiKey;
|
|
26
|
+
private model;
|
|
27
|
+
private baseUrl;
|
|
28
|
+
constructor(apiKey?: string, model?: string);
|
|
29
|
+
embed(text: string): Promise<EmbeddingVector>;
|
|
30
|
+
embedBatch(texts: string[]): Promise<EmbeddingVector[]>;
|
|
31
|
+
isAvailable(): Promise<boolean>;
|
|
32
|
+
}
|
|
33
|
+
export declare class OpenAIEmbeddingProvider implements EmbeddingProvider {
|
|
34
|
+
name: string;
|
|
35
|
+
private apiKey;
|
|
36
|
+
private model;
|
|
37
|
+
constructor(apiKey?: string, model?: string);
|
|
38
|
+
embed(text: string): Promise<EmbeddingVector>;
|
|
39
|
+
embedBatch(texts: string[]): Promise<EmbeddingVector[]>;
|
|
40
|
+
isAvailable(): Promise<boolean>;
|
|
41
|
+
}
|
|
42
|
+
export declare class LocalEmbeddingProvider implements EmbeddingProvider {
|
|
43
|
+
name: string;
|
|
44
|
+
private dimensions;
|
|
45
|
+
constructor(dimensions?: number);
|
|
46
|
+
embed(text: string): Promise<EmbeddingVector>;
|
|
47
|
+
embedBatch(texts: string[]): Promise<EmbeddingVector[]>;
|
|
48
|
+
isAvailable(): Promise<boolean>;
|
|
49
|
+
/**
|
|
50
|
+
* Deterministic hash-based embedding. Uses a bag-of-words approach
|
|
51
|
+
* with feature hashing to produce a fixed-dimension vector.
|
|
52
|
+
* Not as good as neural embeddings, but works offline with zero deps.
|
|
53
|
+
*/
|
|
54
|
+
private computeLocalEmbedding;
|
|
55
|
+
private hashToken;
|
|
56
|
+
}
|
|
57
|
+
export declare function createEmbeddingProvider(name?: string, options?: {
|
|
58
|
+
apiKey?: string;
|
|
59
|
+
model?: string;
|
|
60
|
+
}): EmbeddingProvider;
|
|
61
|
+
export declare function cosineSimilarity(a: number[], b: number[]): number;
|
|
62
|
+
//# sourceMappingURL=embeddings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../src/providers/embeddings.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC9C,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IACxD,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAID,qBAAa,uBAAwB,YAAW,iBAAiB;IAC/D,IAAI,SAAY;IAChB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;IAMrC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAS7C,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAmCvD,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAGtC;AAID,qBAAa,uBAAwB,YAAW,iBAAiB;IAC/D,IAAI,SAAY;IAChB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;gBAEV,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;IAKrC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAS7C,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAqCvD,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAGtC;AAID,qBAAa,sBAAuB,YAAW,iBAAiB;IAC9D,IAAI,SAAW;IACf,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,CAAC,EAAE,MAAM;IAIzB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAK7C,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAQvD,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAIrC;;;;OAIG;IACH,OAAO,CAAC,qBAAqB;IAkC7B,OAAO,CAAC,SAAS;CASlB;AAID,wBAAgB,uBAAuB,CACrC,IAAI,CAAC,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5C,iBAAiB,CAgBnB;AAUD,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAiBjE"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedding providers for llmwiki.
|
|
3
|
+
* Supports Google Gemini (text-embedding-004), OpenAI (text-embedding-3-small), and local fallback.
|
|
4
|
+
*/
|
|
5
|
+
// --- Google Gemini Embeddings ---
|
|
6
|
+
export class GeminiEmbeddingProvider {
|
|
7
|
+
name = 'gemini';
|
|
8
|
+
apiKey;
|
|
9
|
+
model;
|
|
10
|
+
baseUrl;
|
|
11
|
+
constructor(apiKey, model) {
|
|
12
|
+
this.apiKey = apiKey ?? process.env['GOOGLE_API_KEY'] ?? '';
|
|
13
|
+
this.model = model ?? 'text-embedding-004';
|
|
14
|
+
this.baseUrl = 'https://generativelanguage.googleapis.com/v1beta';
|
|
15
|
+
}
|
|
16
|
+
async embed(text) {
|
|
17
|
+
const results = await this.embedBatch([text]);
|
|
18
|
+
const first = results[0];
|
|
19
|
+
if (!first) {
|
|
20
|
+
throw new Error('Gemini embedding returned empty result');
|
|
21
|
+
}
|
|
22
|
+
return first;
|
|
23
|
+
}
|
|
24
|
+
async embedBatch(texts) {
|
|
25
|
+
if (!this.apiKey) {
|
|
26
|
+
throw new Error('GOOGLE_API_KEY is required for Gemini embeddings');
|
|
27
|
+
}
|
|
28
|
+
const url = `${this.baseUrl}/models/${this.model}:batchEmbedContents?key=${this.apiKey}`;
|
|
29
|
+
const requests = texts.map((text) => ({
|
|
30
|
+
model: `models/${this.model}`,
|
|
31
|
+
content: { parts: [{ text }] },
|
|
32
|
+
taskType: 'RETRIEVAL_DOCUMENT',
|
|
33
|
+
}));
|
|
34
|
+
const response = await fetch(url, {
|
|
35
|
+
method: 'POST',
|
|
36
|
+
headers: { 'Content-Type': 'application/json' },
|
|
37
|
+
body: JSON.stringify({ requests }),
|
|
38
|
+
});
|
|
39
|
+
if (!response.ok) {
|
|
40
|
+
const errorText = await response.text();
|
|
41
|
+
throw new Error(`Gemini embedding API error ${response.status}: ${errorText}`);
|
|
42
|
+
}
|
|
43
|
+
const data = (await response.json());
|
|
44
|
+
return data.embeddings.map((emb) => ({
|
|
45
|
+
values: emb.values,
|
|
46
|
+
model: this.model,
|
|
47
|
+
dimensions: emb.values.length,
|
|
48
|
+
}));
|
|
49
|
+
}
|
|
50
|
+
async isAvailable() {
|
|
51
|
+
return !!(this.apiKey || process.env['GOOGLE_API_KEY']);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// --- OpenAI Embeddings ---
|
|
55
|
+
export class OpenAIEmbeddingProvider {
|
|
56
|
+
name = 'openai';
|
|
57
|
+
apiKey;
|
|
58
|
+
model;
|
|
59
|
+
constructor(apiKey, model) {
|
|
60
|
+
this.apiKey = apiKey ?? process.env['OPENAI_API_KEY'] ?? '';
|
|
61
|
+
this.model = model ?? 'text-embedding-3-small';
|
|
62
|
+
}
|
|
63
|
+
async embed(text) {
|
|
64
|
+
const results = await this.embedBatch([text]);
|
|
65
|
+
const first = results[0];
|
|
66
|
+
if (!first) {
|
|
67
|
+
throw new Error('OpenAI embedding returned empty result');
|
|
68
|
+
}
|
|
69
|
+
return first;
|
|
70
|
+
}
|
|
71
|
+
async embedBatch(texts) {
|
|
72
|
+
if (!this.apiKey) {
|
|
73
|
+
throw new Error('OPENAI_API_KEY is required for OpenAI embeddings');
|
|
74
|
+
}
|
|
75
|
+
const response = await fetch('https://api.openai.com/v1/embeddings', {
|
|
76
|
+
method: 'POST',
|
|
77
|
+
headers: {
|
|
78
|
+
'Content-Type': 'application/json',
|
|
79
|
+
'Authorization': `Bearer ${this.apiKey}`,
|
|
80
|
+
},
|
|
81
|
+
body: JSON.stringify({
|
|
82
|
+
model: this.model,
|
|
83
|
+
input: texts,
|
|
84
|
+
}),
|
|
85
|
+
});
|
|
86
|
+
if (!response.ok) {
|
|
87
|
+
const errorText = await response.text();
|
|
88
|
+
throw new Error(`OpenAI embedding API error ${response.status}: ${errorText}`);
|
|
89
|
+
}
|
|
90
|
+
const data = (await response.json());
|
|
91
|
+
// Sort by index to maintain input order
|
|
92
|
+
const sorted = data.data.sort((a, b) => a.index - b.index);
|
|
93
|
+
return sorted.map((item) => ({
|
|
94
|
+
values: item.embedding,
|
|
95
|
+
model: data.model,
|
|
96
|
+
dimensions: item.embedding.length,
|
|
97
|
+
}));
|
|
98
|
+
}
|
|
99
|
+
async isAvailable() {
|
|
100
|
+
return !!(this.apiKey || process.env['OPENAI_API_KEY']);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// --- Local Embeddings (TF-IDF-based, no API needed) ---
|
|
104
|
+
export class LocalEmbeddingProvider {
|
|
105
|
+
name = 'local';
|
|
106
|
+
dimensions;
|
|
107
|
+
constructor(dimensions) {
|
|
108
|
+
this.dimensions = dimensions ?? 384;
|
|
109
|
+
}
|
|
110
|
+
async embed(text) {
|
|
111
|
+
const values = this.computeLocalEmbedding(text);
|
|
112
|
+
return { values, model: 'local-tfidf', dimensions: this.dimensions };
|
|
113
|
+
}
|
|
114
|
+
async embedBatch(texts) {
|
|
115
|
+
return texts.map((text) => ({
|
|
116
|
+
values: this.computeLocalEmbedding(text),
|
|
117
|
+
model: 'local-tfidf',
|
|
118
|
+
dimensions: this.dimensions,
|
|
119
|
+
}));
|
|
120
|
+
}
|
|
121
|
+
async isAvailable() {
|
|
122
|
+
return true; // Always available — no external dependencies
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Deterministic hash-based embedding. Uses a bag-of-words approach
|
|
126
|
+
* with feature hashing to produce a fixed-dimension vector.
|
|
127
|
+
* Not as good as neural embeddings, but works offline with zero deps.
|
|
128
|
+
*/
|
|
129
|
+
computeLocalEmbedding(text) {
|
|
130
|
+
const tokens = text
|
|
131
|
+
.toLowerCase()
|
|
132
|
+
.replace(/[^a-z0-9\s]/g, ' ')
|
|
133
|
+
.split(/\s+/)
|
|
134
|
+
.filter((t) => t.length > 2);
|
|
135
|
+
const vector = new Float64Array(this.dimensions);
|
|
136
|
+
for (const token of tokens) {
|
|
137
|
+
// Feature hashing (hash trick)
|
|
138
|
+
const hash = this.hashToken(token);
|
|
139
|
+
const idx = Math.abs(hash) % this.dimensions;
|
|
140
|
+
const sign = hash > 0 ? 1 : -1;
|
|
141
|
+
vector[idx] = (vector[idx] ?? 0) + sign;
|
|
142
|
+
}
|
|
143
|
+
// L2 normalize
|
|
144
|
+
let norm = 0;
|
|
145
|
+
for (let i = 0; i < this.dimensions; i++) {
|
|
146
|
+
const v = vector[i] ?? 0;
|
|
147
|
+
norm += v * v;
|
|
148
|
+
}
|
|
149
|
+
norm = Math.sqrt(norm);
|
|
150
|
+
if (norm > 0) {
|
|
151
|
+
for (let i = 0; i < this.dimensions; i++) {
|
|
152
|
+
vector[i] = (vector[i] ?? 0) / norm;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return Array.from(vector);
|
|
156
|
+
}
|
|
157
|
+
hashToken(token) {
|
|
158
|
+
// FNV-1a hash
|
|
159
|
+
let hash = 0x811c9dc5;
|
|
160
|
+
for (let i = 0; i < token.length; i++) {
|
|
161
|
+
hash ^= token.charCodeAt(i);
|
|
162
|
+
hash = Math.imul(hash, 0x01000193);
|
|
163
|
+
}
|
|
164
|
+
return hash;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// --- Factory ---
|
|
168
|
+
export function createEmbeddingProvider(name, options) {
|
|
169
|
+
const providerName = name ?? detectBestProvider();
|
|
170
|
+
switch (providerName.toLowerCase()) {
|
|
171
|
+
case 'gemini':
|
|
172
|
+
case 'google':
|
|
173
|
+
return new GeminiEmbeddingProvider(options?.apiKey, options?.model);
|
|
174
|
+
case 'openai':
|
|
175
|
+
return new OpenAIEmbeddingProvider(options?.apiKey, options?.model);
|
|
176
|
+
case 'local':
|
|
177
|
+
return new LocalEmbeddingProvider();
|
|
178
|
+
default:
|
|
179
|
+
throw new Error(`Unknown embedding provider: ${providerName}. Supported: gemini, openai, local`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
function detectBestProvider() {
|
|
183
|
+
if (process.env['GOOGLE_API_KEY'])
|
|
184
|
+
return 'gemini';
|
|
185
|
+
if (process.env['OPENAI_API_KEY'])
|
|
186
|
+
return 'openai';
|
|
187
|
+
return 'local';
|
|
188
|
+
}
|
|
189
|
+
// --- Cosine Similarity ---
|
|
190
|
+
export function cosineSimilarity(a, b) {
|
|
191
|
+
if (a.length !== b.length)
|
|
192
|
+
return 0;
|
|
193
|
+
let dotProduct = 0;
|
|
194
|
+
let normA = 0;
|
|
195
|
+
let normB = 0;
|
|
196
|
+
for (let i = 0; i < a.length; i++) {
|
|
197
|
+
const va = a[i] ?? 0;
|
|
198
|
+
const vb = b[i] ?? 0;
|
|
199
|
+
dotProduct += va * vb;
|
|
200
|
+
normA += va * va;
|
|
201
|
+
normB += vb * vb;
|
|
202
|
+
}
|
|
203
|
+
const denom = Math.sqrt(normA) * Math.sqrt(normB);
|
|
204
|
+
return denom === 0 ? 0 : dotProduct / denom;
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=embeddings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../src/providers/embeddings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,YAAY,CAAC;AAK1D,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9D,WAAW,CAgBb"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ClaudeProvider } from './claude.js';
|
|
2
|
+
import { OpenAIProvider } from './openai.js';
|
|
3
|
+
import { OllamaProvider } from './ollama.js';
|
|
4
|
+
export function createProvider(name, options) {
|
|
5
|
+
switch (name.toLowerCase()) {
|
|
6
|
+
case 'claude':
|
|
7
|
+
case 'anthropic':
|
|
8
|
+
return new ClaudeProvider(options?.model, options?.apiKey);
|
|
9
|
+
case 'openai':
|
|
10
|
+
case 'gpt':
|
|
11
|
+
return new OpenAIProvider(options?.model, options?.apiKey);
|
|
12
|
+
case 'ollama':
|
|
13
|
+
case 'local':
|
|
14
|
+
return new OllamaProvider(options?.model, options?.baseUrl);
|
|
15
|
+
default:
|
|
16
|
+
throw new Error(`Unknown provider: ${name}. Supported: claude, openai, ollama`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,UAAU,cAAc,CAC5B,IAAY,EACZ,OAA+D;IAE/D,QAAQ,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QAC3B,KAAK,QAAQ,CAAC;QACd,KAAK,WAAW;YACd,OAAO,IAAI,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7D,KAAK,QAAQ,CAAC;QACd,KAAK,KAAK;YACR,OAAO,IAAI,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7D,KAAK,QAAQ,CAAC;QACd,KAAK,OAAO;YACV,OAAO,IAAI,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9D;YACE,MAAM,IAAI,KAAK,CACb,qBAAqB,IAAI,qCAAqC,CAC/D,CAAC;IACN,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { LLMProvider, LLMMessage, LLMResponse, LLMOptions } from './types.js';
|
|
2
|
+
export declare class OllamaProvider implements LLMProvider {
|
|
3
|
+
name: string;
|
|
4
|
+
private baseUrl;
|
|
5
|
+
private defaultModel;
|
|
6
|
+
constructor(model?: string, baseUrl?: string);
|
|
7
|
+
chat(messages: LLMMessage[], options?: LLMOptions): Promise<LLMResponse>;
|
|
8
|
+
isAvailable(): Promise<boolean>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=ollama.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../src/providers/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEnF,qBAAa,cAAe,YAAW,WAAW;IAChD,IAAI,SAAY;IAChB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAS;gBAEjB,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;IAKtC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IAuCxE,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAQtC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export class OllamaProvider {
|
|
2
|
+
name = 'ollama';
|
|
3
|
+
baseUrl;
|
|
4
|
+
defaultModel;
|
|
5
|
+
constructor(model, baseUrl) {
|
|
6
|
+
this.baseUrl = baseUrl ?? process.env['OLLAMA_BASE_URL'] ?? 'http://localhost:11434';
|
|
7
|
+
this.defaultModel = model ?? 'llama3.2';
|
|
8
|
+
}
|
|
9
|
+
async chat(messages, options) {
|
|
10
|
+
const allMessages = options?.systemPrompt
|
|
11
|
+
? [{ role: 'system', content: options.systemPrompt }, ...messages.filter((m) => m.role !== 'system')]
|
|
12
|
+
: messages;
|
|
13
|
+
const response = await fetch(`${this.baseUrl}/api/chat`, {
|
|
14
|
+
method: 'POST',
|
|
15
|
+
headers: { 'Content-Type': 'application/json' },
|
|
16
|
+
body: JSON.stringify({
|
|
17
|
+
model: options?.model ?? this.defaultModel,
|
|
18
|
+
messages: allMessages.map((m) => ({
|
|
19
|
+
role: m.role,
|
|
20
|
+
content: m.content,
|
|
21
|
+
})),
|
|
22
|
+
stream: false,
|
|
23
|
+
}),
|
|
24
|
+
});
|
|
25
|
+
if (!response.ok) {
|
|
26
|
+
throw new Error(`Ollama API error: ${response.status} ${response.statusText}`);
|
|
27
|
+
}
|
|
28
|
+
const data = (await response.json());
|
|
29
|
+
return {
|
|
30
|
+
content: data.message.content,
|
|
31
|
+
model: data.model,
|
|
32
|
+
tokensUsed: {
|
|
33
|
+
input: data.prompt_eval_count ?? 0,
|
|
34
|
+
output: data.eval_count ?? 0,
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
async isAvailable() {
|
|
39
|
+
try {
|
|
40
|
+
const response = await fetch(`${this.baseUrl}/api/tags`);
|
|
41
|
+
return response.ok;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=ollama.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/providers/ollama.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,cAAc;IACzB,IAAI,GAAG,QAAQ,CAAC;IACR,OAAO,CAAS;IAChB,YAAY,CAAS;IAE7B,YAAY,KAAc,EAAE,OAAgB;QAC1C,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,wBAAwB,CAAC;QACrF,IAAI,CAAC,YAAY,GAAG,KAAK,IAAI,UAAU,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAsB,EAAE,OAAoB;QACrD,MAAM,WAAW,GAAG,OAAO,EAAE,YAAY;YACvC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAiB,EAAE,OAAO,EAAE,OAAO,CAAC,YAAY,EAAE,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YAC9G,CAAC,CAAC,QAAQ,CAAC;QAEb,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,WAAW,EAAE;YACvD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,IAAI,CAAC,YAAY;gBAC1C,QAAQ,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAChC,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,OAAO,EAAE,CAAC,CAAC,OAAO;iBACnB,CAAC,CAAC;gBACH,MAAM,EAAE,KAAK;aACd,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACjF,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAKlC,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;YAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE;gBACV,KAAK,EAAE,IAAI,CAAC,iBAAiB,IAAI,CAAC;gBAClC,MAAM,EAAE,IAAI,CAAC,UAAU,IAAI,CAAC;aAC7B;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW;QACf,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,WAAW,CAAC,CAAC;YACzD,OAAO,QAAQ,CAAC,EAAE,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { LLMProvider, LLMMessage, LLMResponse, LLMOptions } from './types.js';
|
|
2
|
+
export declare class OpenAIProvider implements LLMProvider {
|
|
3
|
+
name: string;
|
|
4
|
+
private client;
|
|
5
|
+
private defaultModel;
|
|
6
|
+
constructor(model?: string, apiKey?: string);
|
|
7
|
+
chat(messages: LLMMessage[], options?: LLMOptions): Promise<LLMResponse>;
|
|
8
|
+
isAvailable(): Promise<boolean>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=openai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEnF,qBAAa,cAAe,YAAW,WAAW;IAChD,IAAI,SAAY;IAChB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAS;gBAEjB,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAOrC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IA0BxE,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAGtC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import OpenAI from 'openai';
|
|
2
|
+
export class OpenAIProvider {
|
|
3
|
+
name = 'openai';
|
|
4
|
+
client;
|
|
5
|
+
defaultModel;
|
|
6
|
+
constructor(model, apiKey) {
|
|
7
|
+
this.client = new OpenAI({
|
|
8
|
+
apiKey: apiKey ?? process.env['OPENAI_API_KEY'],
|
|
9
|
+
});
|
|
10
|
+
this.defaultModel = model ?? 'gpt-4o';
|
|
11
|
+
}
|
|
12
|
+
async chat(messages, options) {
|
|
13
|
+
const allMessages = options?.systemPrompt
|
|
14
|
+
? [{ role: 'system', content: options.systemPrompt }, ...messages.filter((m) => m.role !== 'system')]
|
|
15
|
+
: messages;
|
|
16
|
+
const response = await this.client.chat.completions.create({
|
|
17
|
+
model: options?.model ?? this.defaultModel,
|
|
18
|
+
max_tokens: options?.maxTokens ?? 4096,
|
|
19
|
+
messages: allMessages.map((m) => ({
|
|
20
|
+
role: m.role,
|
|
21
|
+
content: m.content,
|
|
22
|
+
})),
|
|
23
|
+
});
|
|
24
|
+
const content = response.choices[0]?.message?.content ?? '';
|
|
25
|
+
return {
|
|
26
|
+
content,
|
|
27
|
+
model: response.model,
|
|
28
|
+
tokensUsed: {
|
|
29
|
+
input: response.usage?.prompt_tokens ?? 0,
|
|
30
|
+
output: response.usage?.completion_tokens ?? 0,
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
async isAvailable() {
|
|
35
|
+
return !!process.env['OPENAI_API_KEY'];
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAG5B,MAAM,OAAO,cAAc;IACzB,IAAI,GAAG,QAAQ,CAAC;IACR,MAAM,CAAS;IACf,YAAY,CAAS;IAE7B,YAAY,KAAc,EAAE,MAAe;QACzC,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC;YACvB,MAAM,EAAE,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;SAChD,CAAC,CAAC;QACH,IAAI,CAAC,YAAY,GAAG,KAAK,IAAI,QAAQ,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAsB,EAAE,OAAoB;QACrD,MAAM,WAAW,GAAG,OAAO,EAAE,YAAY;YACvC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAiB,EAAE,OAAO,EAAE,OAAO,CAAC,YAAY,EAAE,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YAC9G,CAAC,CAAC,QAAQ,CAAC;QAEb,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YACzD,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,IAAI,CAAC,YAAY;YAC1C,UAAU,EAAE,OAAO,EAAE,SAAS,IAAI,IAAI;YACtC,QAAQ,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAChC,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,OAAO,EAAE,CAAC,CAAC,OAAO;aACnB,CAAC,CAAC;SACJ,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;QAE5D,OAAO;YACL,OAAO;YACP,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,UAAU,EAAE;gBACV,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC;gBACzC,MAAM,EAAE,QAAQ,CAAC,KAAK,EAAE,iBAAiB,IAAI,CAAC;aAC/C;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW;QACf,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACzC,CAAC;CACF"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export interface LLMMessage {
|
|
2
|
+
role: 'system' | 'user' | 'assistant';
|
|
3
|
+
content: string;
|
|
4
|
+
}
|
|
5
|
+
export interface LLMResponse {
|
|
6
|
+
content: string;
|
|
7
|
+
model: string;
|
|
8
|
+
tokensUsed: {
|
|
9
|
+
input: number;
|
|
10
|
+
output: number;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export interface LLMProvider {
|
|
14
|
+
name: string;
|
|
15
|
+
chat(messages: LLMMessage[], options?: LLMOptions): Promise<LLMResponse>;
|
|
16
|
+
isAvailable(): Promise<boolean>;
|
|
17
|
+
}
|
|
18
|
+
export interface LLMOptions {
|
|
19
|
+
model?: string;
|
|
20
|
+
maxTokens?: number;
|
|
21
|
+
temperature?: number;
|
|
22
|
+
systemPrompt?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface VisionProvider extends LLMProvider {
|
|
25
|
+
describeImage(imagePath: string, prompt?: string): Promise<string>;
|
|
26
|
+
}
|
|
27
|
+
export interface ProviderConfig {
|
|
28
|
+
provider: 'claude' | 'openai' | 'ollama';
|
|
29
|
+
model?: string;
|
|
30
|
+
apiKey?: string;
|
|
31
|
+
baseUrl?: string;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE;QACV,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACzE,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAe,SAAQ,WAAW;IACjD,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACpE;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple BM25 search implementation for markdown files.
|
|
3
|
+
* No external dependencies — works locally.
|
|
4
|
+
*/
|
|
5
|
+
interface Document {
|
|
6
|
+
path: string;
|
|
7
|
+
content: string;
|
|
8
|
+
title: string;
|
|
9
|
+
}
|
|
10
|
+
interface SearchResult {
|
|
11
|
+
path: string;
|
|
12
|
+
score: number;
|
|
13
|
+
title: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function bm25Search(query: string, documents: Document[]): SearchResult[];
|
|
16
|
+
export declare function tokenize(text: string): string[];
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=bm25.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bm25.d.ts","sourceRoot":"","sources":["../../src/search/bm25.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAKD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,YAAY,EAAE,CAgD/E;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAM/C"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple BM25 search implementation for markdown files.
|
|
3
|
+
* No external dependencies — works locally.
|
|
4
|
+
*/
|
|
5
|
+
const K1 = 1.5;
|
|
6
|
+
const B = 0.75;
|
|
7
|
+
export function bm25Search(query, documents) {
|
|
8
|
+
const queryTerms = tokenize(query);
|
|
9
|
+
const avgDocLength = documents.reduce((sum, d) => sum + tokenize(d.content).length, 0) / Math.max(documents.length, 1);
|
|
10
|
+
// Calculate IDF for each query term
|
|
11
|
+
const idf = new Map();
|
|
12
|
+
for (const term of queryTerms) {
|
|
13
|
+
const docsWithTerm = documents.filter((d) => tokenize(d.content).includes(term) || tokenize(d.title).includes(term)).length;
|
|
14
|
+
const idfValue = Math.log((documents.length - docsWithTerm + 0.5) / (docsWithTerm + 0.5) + 1);
|
|
15
|
+
idf.set(term, idfValue);
|
|
16
|
+
}
|
|
17
|
+
// Score each document
|
|
18
|
+
const results = [];
|
|
19
|
+
for (const doc of documents) {
|
|
20
|
+
const docTerms = tokenize(doc.content + ' ' + doc.title);
|
|
21
|
+
const docLength = docTerms.length;
|
|
22
|
+
let score = 0;
|
|
23
|
+
for (const term of queryTerms) {
|
|
24
|
+
const tf = docTerms.filter((t) => t === term).length;
|
|
25
|
+
const termIdf = idf.get(term) ?? 0;
|
|
26
|
+
const numerator = tf * (K1 + 1);
|
|
27
|
+
const denominator = tf + K1 * (1 - B + B * (docLength / avgDocLength));
|
|
28
|
+
score += termIdf * (numerator / denominator);
|
|
29
|
+
}
|
|
30
|
+
// Boost title matches (additive, not multiplicative — avoids exponential blowup)
|
|
31
|
+
const titleTerms = tokenize(doc.title);
|
|
32
|
+
let titleBoost = 0;
|
|
33
|
+
for (const term of queryTerms) {
|
|
34
|
+
if (titleTerms.includes(term)) {
|
|
35
|
+
titleBoost += score * 0.5;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
score += titleBoost;
|
|
39
|
+
if (score > 0) {
|
|
40
|
+
results.push({ path: doc.path, score, title: doc.title });
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return results.sort((a, b) => b.score - a.score);
|
|
44
|
+
}
|
|
45
|
+
export function tokenize(text) {
|
|
46
|
+
return text
|
|
47
|
+
.toLowerCase()
|
|
48
|
+
.replace(/[^a-z0-9\s]/g, ' ')
|
|
49
|
+
.split(/\s+/)
|
|
50
|
+
.filter((t) => t.length > 2);
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=bm25.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bm25.js","sourceRoot":"","sources":["../../src/search/bm25.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { EmbeddingProvider } from '../providers/embeddings.js';
|
|
2
|
+
export interface SearchOptions {
|
|
3
|
+
mode?: 'bm25' | 'semantic' | 'hybrid';
|
|
4
|
+
embeddingProvider?: EmbeddingProvider;
|
|
5
|
+
wikiDir?: string;
|
|
6
|
+
limit?: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Search wiki pages. Supports BM25 (keyword), semantic (embedding), and hybrid modes.
|
|
10
|
+
*/
|
|
11
|
+
export declare function searchPages(query: string, pagePaths: string[], options?: SearchOptions): Promise<string[]>;
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/search/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAEpE,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,QAAQ,CAAC;IACtC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EAAE,EACnB,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,MAAM,EAAE,CAAC,CAoCnB"}
|