@mnemonic-ai/core 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.
Files changed (47) hide show
  1. package/dist/chunk-5Z46NSNR.js +228 -0
  2. package/dist/chunk-5Z46NSNR.js.map +1 -0
  3. package/dist/chunk-CZDK53NR.js +24 -0
  4. package/dist/chunk-CZDK53NR.js.map +1 -0
  5. package/dist/chunk-L7SCUMC3.js +53 -0
  6. package/dist/chunk-L7SCUMC3.js.map +1 -0
  7. package/dist/chunk-M3IZJTMM.js +474 -0
  8. package/dist/chunk-M3IZJTMM.js.map +1 -0
  9. package/dist/chunk-NA7L5FQN.js +1581 -0
  10. package/dist/chunk-NA7L5FQN.js.map +1 -0
  11. package/dist/chunk-OEEEWS2M.js +375 -0
  12. package/dist/chunk-OEEEWS2M.js.map +1 -0
  13. package/dist/chunk-YZW6DYUY.js +46 -0
  14. package/dist/chunk-YZW6DYUY.js.map +1 -0
  15. package/dist/cli/main.cjs +1827 -0
  16. package/dist/cli/main.cjs.map +1 -0
  17. package/dist/cli/main.d.cts +1 -0
  18. package/dist/cli/main.d.ts +1 -0
  19. package/dist/cli/main.js +84 -0
  20. package/dist/cli/main.js.map +1 -0
  21. package/dist/client-b2Xhkqdl.d.cts +409 -0
  22. package/dist/client-b2Xhkqdl.d.ts +409 -0
  23. package/dist/index.cjs +2547 -0
  24. package/dist/index.cjs.map +1 -0
  25. package/dist/index.d.cts +309 -0
  26. package/dist/index.d.ts +309 -0
  27. package/dist/index.js +160 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/local-MYLINANE.js +7 -0
  30. package/dist/local-MYLINANE.js.map +1 -0
  31. package/dist/mcp/main.cjs +2775 -0
  32. package/dist/mcp/main.cjs.map +1 -0
  33. package/dist/mcp/main.d.cts +1 -0
  34. package/dist/mcp/main.d.ts +1 -0
  35. package/dist/mcp/main.js +31 -0
  36. package/dist/mcp/main.js.map +1 -0
  37. package/dist/mcp/server.cjs +2765 -0
  38. package/dist/mcp/server.cjs.map +1 -0
  39. package/dist/mcp/server.d.cts +23 -0
  40. package/dist/mcp/server.d.ts +23 -0
  41. package/dist/mcp/server.js +12 -0
  42. package/dist/mcp/server.js.map +1 -0
  43. package/dist/openai-GDIC3YVT.js +7 -0
  44. package/dist/openai-GDIC3YVT.js.map +1 -0
  45. package/dist/postgres-GQ6DZDBW.js +8 -0
  46. package/dist/postgres-GQ6DZDBW.js.map +1 -0
  47. package/package.json +117 -0
@@ -0,0 +1,228 @@
1
+ // src/core/utils.ts
2
+ function cosineSimilarity(a, b) {
3
+ if (a.length !== b.length) {
4
+ throw new Error(
5
+ `Embedding dimension mismatch: ${a.length} vs ${b.length}`
6
+ );
7
+ }
8
+ let dot = 0;
9
+ let normA = 0;
10
+ let normB = 0;
11
+ for (let i = 0; i < a.length; i++) {
12
+ dot += a[i] * b[i];
13
+ normA += a[i] * a[i];
14
+ normB += b[i] * b[i];
15
+ }
16
+ normA = Math.sqrt(normA);
17
+ normB = Math.sqrt(normB);
18
+ if (normA === 0 || normB === 0) return 0;
19
+ return dot / (normA * normB);
20
+ }
21
+ function cosineSimilarityVector(query, embeddings) {
22
+ const dim = query.length;
23
+ const n = embeddings.length;
24
+ const result = new Float64Array(n);
25
+ for (let ei = 0; ei < n; ei++) {
26
+ if (embeddings[ei].length !== dim) {
27
+ throw new Error(
28
+ `Embedding dimension mismatch: ${embeddings[ei].length} vs query ${dim}`
29
+ );
30
+ }
31
+ }
32
+ let normQ = 0;
33
+ for (let i = 0; i < dim; i++) normQ += query[i] * query[i];
34
+ normQ = Math.sqrt(normQ);
35
+ if (normQ === 0) return result;
36
+ const qNormed = new Float64Array(dim);
37
+ for (let i = 0; i < dim; i++) qNormed[i] = query[i] / normQ;
38
+ for (let ei = 0; ei < n; ei++) {
39
+ const emb = embeddings[ei];
40
+ let dot = 0;
41
+ let normE = 0;
42
+ for (let i = 0; i < dim; i++) {
43
+ dot += qNormed[i] * emb[i];
44
+ normE += emb[i] * emb[i];
45
+ }
46
+ normE = Math.sqrt(normE);
47
+ result[ei] = normE === 0 ? 0 : dot / normE;
48
+ }
49
+ return result;
50
+ }
51
+ function cosineSimilarityMatrix(embeddings) {
52
+ const n = embeddings.length;
53
+ if (n === 0) return new Float64Array(0);
54
+ const dim = embeddings[0].length;
55
+ for (let i = 1; i < n; i++) {
56
+ if (embeddings[i].length !== dim) {
57
+ throw new Error(
58
+ `Embedding dimension mismatch at index ${i}: ${embeddings[i].length} vs ${dim}`
59
+ );
60
+ }
61
+ }
62
+ const result = new Float64Array(n * n);
63
+ const normed = [];
64
+ const isZeroNorm = [];
65
+ for (let i = 0; i < n; i++) {
66
+ const emb = embeddings[i];
67
+ let norm = 0;
68
+ for (let d = 0; d < dim; d++) norm += emb[d] * emb[d];
69
+ norm = Math.sqrt(norm);
70
+ const row = new Float64Array(dim);
71
+ if (norm > 0) {
72
+ for (let d = 0; d < dim; d++) row[d] = emb[d] / norm;
73
+ isZeroNorm.push(false);
74
+ } else {
75
+ isZeroNorm.push(true);
76
+ }
77
+ normed.push(row);
78
+ }
79
+ for (let i = 0; i < n; i++) {
80
+ result[i * n + i] = isZeroNorm[i] ? 0 : 1;
81
+ for (let j = i + 1; j < n; j++) {
82
+ let dot = 0;
83
+ for (let d = 0; d < dim; d++) dot += normed[i][d] * normed[j][d];
84
+ result[i * n + j] = dot;
85
+ result[j * n + i] = dot;
86
+ }
87
+ }
88
+ return result;
89
+ }
90
+ var DURATION_RE = /^(\d+)\s*([wdhms])$/;
91
+ var MS_MULTIPLIERS = {
92
+ w: 7 * 24 * 60 * 60 * 1e3,
93
+ d: 24 * 60 * 60 * 1e3,
94
+ h: 60 * 60 * 1e3,
95
+ m: 60 * 1e3,
96
+ s: 1e3
97
+ };
98
+ function parseDuration(s) {
99
+ const match = s.trim().toLowerCase().match(DURATION_RE);
100
+ if (!match) {
101
+ throw new Error(
102
+ `Cannot parse duration: '${s}'. Use e.g. 2w, 30d, 24h, 60m, 120s.`
103
+ );
104
+ }
105
+ const n = parseInt(match[1], 10);
106
+ const unit = match[2];
107
+ return n * MS_MULTIPLIERS[unit];
108
+ }
109
+ function estimateTokens(text, charsPerToken = 4) {
110
+ return Math.max(1, Math.floor(text.length / charsPerToken));
111
+ }
112
+ function parseSqlitePath(uri) {
113
+ if (!uri.includes("///")) {
114
+ throw new Error(
115
+ `Invalid SQLite URI: '${uri}'. Expected format: sqlite:///path/to/db`
116
+ );
117
+ }
118
+ return uri.split("///")[1] || "mnemonic.db";
119
+ }
120
+ function bruteForceSimilarPairs(memories, threshold, maxCandidates) {
121
+ const cap = Math.max(0, maxCandidates);
122
+ const withEmb = memories.filter((m) => m.embedding != null).slice(0, cap);
123
+ if (withEmb.length < 2) return [];
124
+ const simMatrix = cosineSimilarityMatrix(withEmb.map((m) => m.embedding));
125
+ const n = withEmb.length;
126
+ const pairs = [];
127
+ for (let i = 0; i < n; i++) {
128
+ for (let j = i + 1; j < n; j++) {
129
+ const sim = simMatrix[i * n + j];
130
+ if (sim >= threshold) {
131
+ pairs.push({ idA: withEmb[i].id, idB: withEmb[j].id, similarity: sim });
132
+ }
133
+ }
134
+ }
135
+ return pairs;
136
+ }
137
+ function bruteForceCosineSearch(memories, embedding, limit) {
138
+ if (limit <= 0) return [];
139
+ const withEmb = memories.filter((m) => m.embedding != null);
140
+ if (withEmb.length === 0) return [];
141
+ const embList = withEmb.map((m) => m.embedding);
142
+ const sims = cosineSimilarityVector(embedding, embList);
143
+ const indices = Array.from({ length: withEmb.length }, (_, i) => i);
144
+ indices.sort((a, b) => sims[b] - sims[a]);
145
+ return indices.slice(0, limit).map((i) => withEmb[i]);
146
+ }
147
+
148
+ // src/core/memory.ts
149
+ import { randomUUID } from "crypto";
150
+ var MemoryTier = {
151
+ IDENTITY: "identity",
152
+ PROCEDURAL: "procedural",
153
+ STRUCTURAL: "structural",
154
+ EPISODIC: "episodic",
155
+ TRANSIENT: "transient"
156
+ };
157
+ var Memory = class {
158
+ content;
159
+ id;
160
+ tier;
161
+ source;
162
+ actor;
163
+ sessionId;
164
+ createdAt;
165
+ lastAccessedAt;
166
+ accessCount;
167
+ importance;
168
+ supersededBy;
169
+ contradictedBy;
170
+ embedding;
171
+ metadata;
172
+ linkedIds;
173
+ agentId;
174
+ shared;
175
+ _charsPerToken;
176
+ constructor(init) {
177
+ const now = /* @__PURE__ */ new Date();
178
+ this.content = init.content;
179
+ this.id = init.id ?? randomUUID().replace(/-/g, "");
180
+ this.tier = init.tier ?? MemoryTier.EPISODIC;
181
+ this.source = init.source ?? "unknown";
182
+ this.actor = init.actor ?? "system";
183
+ this.sessionId = init.sessionId ?? null;
184
+ this.createdAt = init.createdAt ?? now;
185
+ this.lastAccessedAt = init.lastAccessedAt ?? now;
186
+ this.accessCount = init.accessCount ?? 0;
187
+ this.importance = init.importance ?? 1;
188
+ this.supersededBy = init.supersededBy ?? null;
189
+ this.contradictedBy = init.contradictedBy ?? null;
190
+ this.embedding = init.embedding ?? null;
191
+ this.metadata = init.metadata ?? {};
192
+ this.linkedIds = init.linkedIds ?? [];
193
+ this.agentId = init.agentId ?? "default";
194
+ this.shared = init.shared ?? false;
195
+ this._charsPerToken = init.charsPerToken ?? 4;
196
+ }
197
+ /** The tier as a plain string, regardless of whether it was set as an enum. */
198
+ get tierName() {
199
+ return this.tier;
200
+ }
201
+ /** Rough token count using configurable chars-per-token ratio. */
202
+ get tokenEstimate() {
203
+ return estimateTokens(this.content, this._charsPerToken);
204
+ }
205
+ /** Record an access. */
206
+ touch() {
207
+ this.lastAccessedAt = /* @__PURE__ */ new Date();
208
+ this.accessCount += 1;
209
+ }
210
+ };
211
+ function createEdge(sourceId, targetId, relation, weight = 1) {
212
+ return { sourceId, targetId, relation, weight, createdAt: /* @__PURE__ */ new Date() };
213
+ }
214
+
215
+ export {
216
+ cosineSimilarity,
217
+ cosineSimilarityVector,
218
+ cosineSimilarityMatrix,
219
+ parseDuration,
220
+ estimateTokens,
221
+ parseSqlitePath,
222
+ bruteForceSimilarPairs,
223
+ bruteForceCosineSearch,
224
+ MemoryTier,
225
+ Memory,
226
+ createEdge
227
+ };
228
+ //# sourceMappingURL=chunk-5Z46NSNR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/utils.ts","../src/core/memory.ts"],"sourcesContent":["/**\n * Shared utility functions.\n */\n\nimport type { Memory, SimilarPair } from \"./memory.js\";\n\n/** Cosine similarity between two vectors. Returns 0 if either is zero-norm. */\nexport function cosineSimilarity(a: number[], b: number[]): number {\n if (a.length !== b.length) {\n throw new Error(\n `Embedding dimension mismatch: ${a.length} vs ${b.length}`,\n );\n }\n let dot = 0;\n let normA = 0;\n let normB = 0;\n for (let i = 0; i < a.length; i++) {\n dot += a[i] * b[i];\n normA += a[i] * a[i];\n normB += b[i] * b[i];\n }\n normA = Math.sqrt(normA);\n normB = Math.sqrt(normB);\n if (normA === 0 || normB === 0) return 0;\n return dot / (normA * normB);\n}\n\n/**\n * Cosine similarity between a single query and a list of embeddings.\n * Returns an array of similarities, one per embedding.\n */\nexport function cosineSimilarityVector(\n query: number[],\n embeddings: number[][],\n): Float64Array {\n const dim = query.length;\n const n = embeddings.length;\n const result = new Float64Array(n);\n\n for (let ei = 0; ei < n; ei++) {\n if (embeddings[ei].length !== dim) {\n throw new Error(\n `Embedding dimension mismatch: ${embeddings[ei].length} vs query ${dim}`,\n );\n }\n }\n\n // Normalize query once.\n let normQ = 0;\n for (let i = 0; i < dim; i++) normQ += query[i] * query[i];\n normQ = Math.sqrt(normQ);\n if (normQ === 0) return result;\n\n const qNormed = new Float64Array(dim);\n for (let i = 0; i < dim; i++) qNormed[i] = query[i] / normQ;\n\n for (let ei = 0; ei < n; ei++) {\n const emb = embeddings[ei];\n let dot = 0;\n let normE = 0;\n for (let i = 0; i < dim; i++) {\n dot += qNormed[i] * emb[i];\n normE += emb[i] * emb[i];\n }\n normE = Math.sqrt(normE);\n result[ei] = normE === 0 ? 0 : dot / normE;\n }\n\n return result;\n}\n\n/**\n * Pairwise cosine similarity matrix for a list of embeddings.\n * Returns a flat Float64Array of size n*n (row-major).\n */\nexport function cosineSimilarityMatrix(\n embeddings: number[][],\n): Float64Array {\n const n = embeddings.length;\n if (n === 0) return new Float64Array(0);\n const dim = embeddings[0].length;\n for (let i = 1; i < n; i++) {\n if (embeddings[i].length !== dim) {\n throw new Error(\n `Embedding dimension mismatch at index ${i}: ${embeddings[i].length} vs ${dim}`,\n );\n }\n }\n const result = new Float64Array(n * n);\n\n // Normalize all embeddings once.\n const normed: Float64Array[] = [];\n const isZeroNorm: boolean[] = [];\n for (let i = 0; i < n; i++) {\n const emb = embeddings[i];\n let norm = 0;\n for (let d = 0; d < dim; d++) norm += emb[d] * emb[d];\n norm = Math.sqrt(norm);\n const row = new Float64Array(dim);\n if (norm > 0) {\n for (let d = 0; d < dim; d++) row[d] = emb[d] / norm;\n isZeroNorm.push(false);\n } else {\n isZeroNorm.push(true);\n }\n normed.push(row);\n }\n\n // Compute upper triangle, mirror to lower.\n for (let i = 0; i < n; i++) {\n result[i * n + i] = isZeroNorm[i] ? 0 : 1.0;\n for (let j = i + 1; j < n; j++) {\n let dot = 0;\n for (let d = 0; d < dim; d++) dot += normed[i][d] * normed[j][d];\n result[i * n + j] = dot;\n result[j * n + i] = dot;\n }\n }\n\n return result;\n}\n\nconst DURATION_RE = /^(\\d+)\\s*([wdhms])$/;\nconst MS_MULTIPLIERS: Record<string, number> = {\n w: 7 * 24 * 60 * 60 * 1000,\n d: 24 * 60 * 60 * 1000,\n h: 60 * 60 * 1000,\n m: 60 * 1000,\n s: 1000,\n};\n\n/** Parse human-friendly durations like '30d', '24h', '90m', '2w', '120s'. Returns milliseconds. */\nexport function parseDuration(s: string): number {\n const match = s.trim().toLowerCase().match(DURATION_RE);\n if (!match) {\n throw new Error(\n `Cannot parse duration: '${s}'. Use e.g. 2w, 30d, 24h, 60m, 120s.`,\n );\n }\n const n = parseInt(match[1], 10);\n const unit = match[2];\n return n * MS_MULTIPLIERS[unit];\n}\n\n/** Rough token count estimate. */\nexport function estimateTokens(\n text: string,\n charsPerToken: number = 4.0,\n): number {\n return Math.max(1, Math.floor(text.length / charsPerToken));\n}\n\n/** Extract the file path from a sqlite:///path URI. Throws on malformed URIs. */\nexport function parseSqlitePath(uri: string): string {\n if (!uri.includes(\"///\")) {\n throw new Error(\n `Invalid SQLite URI: '${uri}'. Expected format: sqlite:///path/to/db`,\n );\n }\n return uri.split(\"///\")[1] || \"mnemonic.db\";\n}\n\n/** Capped brute-force NxN similarity scan over in-memory embeddings. */\nexport function bruteForceSimilarPairs(\n memories: Memory[],\n threshold: number,\n maxCandidates: number,\n): SimilarPair[] {\n const cap = Math.max(0, maxCandidates);\n const withEmb = memories.filter((m) => m.embedding != null).slice(0, cap);\n if (withEmb.length < 2) return [];\n const simMatrix = cosineSimilarityMatrix(withEmb.map((m) => m.embedding!));\n const n = withEmb.length;\n const pairs: SimilarPair[] = [];\n for (let i = 0; i < n; i++) {\n for (let j = i + 1; j < n; j++) {\n const sim = simMatrix[i * n + j];\n if (sim >= threshold) {\n pairs.push({ idA: withEmb[i].id, idB: withEmb[j].id, similarity: sim });\n }\n }\n }\n return pairs;\n}\n\n/** Rank memories by cosine similarity to embedding, return top limit. */\nexport function bruteForceCosineSearch(\n memories: Memory[],\n embedding: number[],\n limit: number,\n): Memory[] {\n if (limit <= 0) return [];\n const withEmb = memories.filter((m) => m.embedding != null);\n if (withEmb.length === 0) return [];\n const embList = withEmb.map((m) => m.embedding!);\n const sims = cosineSimilarityVector(embedding, embList);\n\n const indices = Array.from({ length: withEmb.length }, (_, i) => i);\n indices.sort((a, b) => sims[b] - sims[a]);\n return indices.slice(0, limit).map((i) => withEmb[i]);\n}\n","/**\n * Core memory data structures.\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport { estimateTokens } from \"./utils.js\";\n\n/** Built-in tier constants. Custom tiers can be registered via MnemonicConfig. */\nexport const MemoryTier = {\n IDENTITY: \"identity\",\n PROCEDURAL: \"procedural\",\n STRUCTURAL: \"structural\",\n EPISODIC: \"episodic\",\n TRANSIENT: \"transient\",\n} as const;\nexport type MemoryTier = (typeof MemoryTier)[keyof typeof MemoryTier];\n\n/** Options for constructing a Memory. Only `content` is required. */\nexport interface MemoryInit {\n content: string;\n id?: string;\n tier?: string;\n source?: string;\n actor?: string;\n sessionId?: string | null;\n createdAt?: Date;\n lastAccessedAt?: Date;\n accessCount?: number;\n importance?: number;\n supersededBy?: string | null;\n contradictedBy?: string | null;\n embedding?: number[] | null;\n metadata?: Record<string, unknown>;\n linkedIds?: string[];\n agentId?: string;\n shared?: boolean;\n charsPerToken?: number;\n}\n\n/** A single unit of agent memory. */\nexport class Memory {\n readonly content: string;\n readonly id: string;\n tier: string;\n source: string;\n actor: string;\n sessionId: string | null;\n createdAt: Date;\n lastAccessedAt: Date;\n accessCount: number;\n importance: number;\n supersededBy: string | null;\n contradictedBy: string | null;\n embedding: number[] | null;\n metadata: Record<string, unknown>;\n linkedIds: string[];\n agentId: string;\n shared: boolean;\n private _charsPerToken: number;\n\n constructor(init: MemoryInit) {\n const now = new Date();\n this.content = init.content;\n this.id = init.id ?? randomUUID().replace(/-/g, \"\");\n this.tier = init.tier ?? MemoryTier.EPISODIC;\n this.source = init.source ?? \"unknown\";\n this.actor = init.actor ?? \"system\";\n this.sessionId = init.sessionId ?? null;\n this.createdAt = init.createdAt ?? now;\n this.lastAccessedAt = init.lastAccessedAt ?? now;\n this.accessCount = init.accessCount ?? 0;\n this.importance = init.importance ?? 1.0;\n this.supersededBy = init.supersededBy ?? null;\n this.contradictedBy = init.contradictedBy ?? null;\n this.embedding = init.embedding ?? null;\n this.metadata = init.metadata ?? {};\n this.linkedIds = init.linkedIds ?? [];\n this.agentId = init.agentId ?? \"default\";\n this.shared = init.shared ?? false;\n this._charsPerToken = init.charsPerToken ?? 4.0;\n }\n\n /** The tier as a plain string, regardless of whether it was set as an enum. */\n get tierName(): string {\n return this.tier;\n }\n\n /** Rough token count using configurable chars-per-token ratio. */\n get tokenEstimate(): number {\n return estimateTokens(this.content, this._charsPerToken);\n }\n\n /** Record an access. */\n touch(): void {\n this.lastAccessedAt = new Date();\n this.accessCount += 1;\n }\n}\n\n/** A directed relationship between two memories.\n * Known relations: \"related_to\", \"contradicts\", \"elaborates\", \"supersedes\", \"consolidates\".\n */\nexport interface MemoryEdge {\n sourceId: string;\n targetId: string;\n relation: string;\n weight: number;\n createdAt: Date;\n}\n\n/**\n * A pair of memory IDs with their cosine similarity score.\n * Used by findSimilarPairs() to return sparse above-threshold pairs\n * without transferring full embedding vectors from the database.\n */\nexport interface SimilarPair {\n idA: string;\n idB: string;\n similarity: number;\n}\n\n/** Create a MemoryEdge with defaults. */\nexport function createEdge(\n sourceId: string,\n targetId: string,\n relation: string,\n weight: number = 1.0,\n): MemoryEdge {\n return { sourceId, targetId, relation, weight, createdAt: new Date() };\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,24 @@
1
+ // src/embeddings/factory.ts
2
+ async function buildEmbedder(provider) {
3
+ const resolved = (provider ?? process.env["MNEMONIC_EMBEDDER"] ?? "none").trim().toLowerCase();
4
+ if (resolved === "none" || resolved === "") return null;
5
+ if (resolved === "openai") {
6
+ const { OpenAIEmbedder } = await import("./openai-GDIC3YVT.js");
7
+ return new OpenAIEmbedder({
8
+ model: process.env["MNEMONIC_OPENAI_MODEL"],
9
+ apiKey: process.env["MNEMONIC_OPENAI_API_KEY"]
10
+ });
11
+ }
12
+ if (resolved === "local") {
13
+ const { LocalEmbedder } = await import("./local-MYLINANE.js");
14
+ return new LocalEmbedder();
15
+ }
16
+ throw new Error(
17
+ `Unknown embedder provider: '${resolved}'. Valid options: none, openai, local`
18
+ );
19
+ }
20
+
21
+ export {
22
+ buildEmbedder
23
+ };
24
+ //# sourceMappingURL=chunk-CZDK53NR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/embeddings/factory.ts"],"sourcesContent":["/**\n * Embedder factory — resolves MNEMONIC_EMBEDDER env var to a concrete embedder.\n */\n\nimport type { BaseEmbedder } from \"./base.js\";\n\n/**\n * Build an embedder based on provider name (or MNEMONIC_EMBEDDER env var).\n *\n * - \"none\" → null (keyword-only mode)\n * - \"openai\" → OpenAIEmbedder\n * - \"local\" → LocalEmbedder (@huggingface/transformers)\n *\n * Returns null if provider is \"none\" or empty.\n * Throws if provider is unrecognised.\n */\nexport async function buildEmbedder(\n provider?: string,\n): Promise<BaseEmbedder | null> {\n const resolved = (\n provider ?? process.env[\"MNEMONIC_EMBEDDER\"] ?? \"none\"\n )\n .trim()\n .toLowerCase();\n\n if (resolved === \"none\" || resolved === \"\") return null;\n\n if (resolved === \"openai\") {\n const { OpenAIEmbedder } = await import(\"./openai.js\");\n return new OpenAIEmbedder({\n model: process.env[\"MNEMONIC_OPENAI_MODEL\"],\n apiKey: process.env[\"MNEMONIC_OPENAI_API_KEY\"],\n });\n }\n\n if (resolved === \"local\") {\n const { LocalEmbedder } = await import(\"./local.js\");\n return new LocalEmbedder();\n }\n\n throw new Error(\n `Unknown embedder provider: '${resolved}'. Valid options: none, openai, local`,\n );\n}\n"],"mappings":";AAgBA,eAAsB,cACpB,UAC8B;AAC9B,QAAM,YACJ,YAAY,QAAQ,IAAI,mBAAmB,KAAK,QAE/C,KAAK,EACL,YAAY;AAEf,MAAI,aAAa,UAAU,aAAa,GAAI,QAAO;AAEnD,MAAI,aAAa,UAAU;AACzB,UAAM,EAAE,eAAe,IAAI,MAAM,OAAO,sBAAa;AACrD,WAAO,IAAI,eAAe;AAAA,MACxB,OAAO,QAAQ,IAAI,uBAAuB;AAAA,MAC1C,QAAQ,QAAQ,IAAI,yBAAyB;AAAA,IAC/C,CAAC;AAAA,EACH;AAEA,MAAI,aAAa,SAAS;AACxB,UAAM,EAAE,cAAc,IAAI,MAAM,OAAO,qBAAY;AACnD,WAAO,IAAI,cAAc;AAAA,EAC3B;AAEA,QAAM,IAAI;AAAA,IACR,+BAA+B,QAAQ;AAAA,EACzC;AACF;","names":[]}
@@ -0,0 +1,53 @@
1
+ // src/embeddings/local.ts
2
+ var MODEL_DIMENSIONS = {
3
+ "Xenova/all-MiniLM-L6-v2": 384,
4
+ "Xenova/all-MiniLM-L12-v2": 384,
5
+ "Xenova/all-mpnet-base-v2": 768
6
+ };
7
+ var DEFAULT_MODEL = "Xenova/all-MiniLM-L6-v2";
8
+ var DEFAULT_DIMENSION = 384;
9
+ var LocalEmbedder = class {
10
+ _modelName;
11
+ _pipeline = null;
12
+ _dimension;
13
+ constructor(options) {
14
+ this._modelName = options?.model ?? DEFAULT_MODEL;
15
+ this._dimension = MODEL_DIMENSIONS[this._modelName] ?? DEFAULT_DIMENSION;
16
+ }
17
+ get dimension() {
18
+ return this._dimension;
19
+ }
20
+ async _getPipeline() {
21
+ if (this._pipeline) return this._pipeline;
22
+ let pipeline;
23
+ try {
24
+ const mod = await import("@huggingface/transformers");
25
+ pipeline = mod.pipeline ?? mod.default?.pipeline;
26
+ } catch {
27
+ throw new Error(
28
+ "LocalEmbedder requires '@huggingface/transformers'. Install it with: npm install @huggingface/transformers"
29
+ );
30
+ }
31
+ this._pipeline = await pipeline("feature-extraction", this._modelName, {
32
+ quantized: true
33
+ });
34
+ return this._pipeline;
35
+ }
36
+ async embed(text) {
37
+ const pipe = await this._getPipeline();
38
+ const output = await pipe(text, { pooling: "mean", normalize: true });
39
+ return Array.from(output.data).slice(0, this._dimension);
40
+ }
41
+ async embedBatch(texts) {
42
+ const results = [];
43
+ for (const text of texts) {
44
+ results.push(await this.embed(text));
45
+ }
46
+ return results;
47
+ }
48
+ };
49
+
50
+ export {
51
+ LocalEmbedder
52
+ };
53
+ //# sourceMappingURL=chunk-L7SCUMC3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/embeddings/local.ts"],"sourcesContent":["/**\n * Local embedder using @huggingface/transformers (ONNX runtime).\n * Default model: Xenova/all-MiniLM-L6-v2 (384 dimensions).\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { BaseEmbedder } from \"./base.js\";\n\nexport interface LocalEmbedderOptions {\n /** HuggingFace model name (default: \"Xenova/all-MiniLM-L6-v2\"). */\n model?: string;\n}\n\nconst MODEL_DIMENSIONS: Record<string, number> = {\n \"Xenova/all-MiniLM-L6-v2\": 384,\n \"Xenova/all-MiniLM-L12-v2\": 384,\n \"Xenova/all-mpnet-base-v2\": 768,\n};\n\nconst DEFAULT_MODEL = \"Xenova/all-MiniLM-L6-v2\";\nconst DEFAULT_DIMENSION = 384;\n\nexport class LocalEmbedder implements BaseEmbedder {\n private _modelName: string;\n private _pipeline: any = null;\n private _dimension: number;\n\n constructor(options?: LocalEmbedderOptions) {\n this._modelName = options?.model ?? DEFAULT_MODEL;\n this._dimension =\n MODEL_DIMENSIONS[this._modelName] ?? DEFAULT_DIMENSION;\n }\n\n get dimension(): number {\n return this._dimension;\n }\n\n private async _getPipeline(): Promise<any> {\n if (this._pipeline) return this._pipeline;\n let pipeline: any;\n try {\n const mod: any = await import(\"@huggingface/transformers\");\n pipeline = mod.pipeline ?? mod.default?.pipeline;\n } catch {\n throw new Error(\n \"LocalEmbedder requires '@huggingface/transformers'. \" +\n \"Install it with: npm install @huggingface/transformers\",\n );\n }\n this._pipeline = await pipeline(\"feature-extraction\", this._modelName, {\n quantized: true,\n });\n return this._pipeline;\n }\n\n async embed(text: string): Promise<number[]> {\n const pipe = await this._getPipeline();\n const output = await pipe(text, { pooling: \"mean\", normalize: true });\n return Array.from(output.data as Float32Array).slice(0, this._dimension);\n }\n\n async embedBatch(texts: string[]): Promise<number[][]> {\n const results: number[][] = [];\n for (const text of texts) {\n results.push(await this.embed(text));\n }\n return results;\n }\n}\n"],"mappings":";AAcA,IAAM,mBAA2C;AAAA,EAC/C,2BAA2B;AAAA,EAC3B,4BAA4B;AAAA,EAC5B,4BAA4B;AAC9B;AAEA,IAAM,gBAAgB;AACtB,IAAM,oBAAoB;AAEnB,IAAM,gBAAN,MAA4C;AAAA,EACzC;AAAA,EACA,YAAiB;AAAA,EACjB;AAAA,EAER,YAAY,SAAgC;AAC1C,SAAK,aAAa,SAAS,SAAS;AACpC,SAAK,aACH,iBAAiB,KAAK,UAAU,KAAK;AAAA,EACzC;AAAA,EAEA,IAAI,YAAoB;AACtB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAc,eAA6B;AACzC,QAAI,KAAK,UAAW,QAAO,KAAK;AAChC,QAAI;AACJ,QAAI;AACF,YAAM,MAAW,MAAM,OAAO,2BAA2B;AACzD,iBAAW,IAAI,YAAY,IAAI,SAAS;AAAA,IAC1C,QAAQ;AACN,YAAM,IAAI;AAAA,QACR;AAAA,MAEF;AAAA,IACF;AACA,SAAK,YAAY,MAAM,SAAS,sBAAsB,KAAK,YAAY;AAAA,MACrE,WAAW;AAAA,IACb,CAAC;AACD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,MAAM,MAAiC;AAC3C,UAAM,OAAO,MAAM,KAAK,aAAa;AACrC,UAAM,SAAS,MAAM,KAAK,MAAM,EAAE,SAAS,QAAQ,WAAW,KAAK,CAAC;AACpE,WAAO,MAAM,KAAK,OAAO,IAAoB,EAAE,MAAM,GAAG,KAAK,UAAU;AAAA,EACzE;AAAA,EAEA,MAAM,WAAW,OAAsC;AACrD,UAAM,UAAsB,CAAC;AAC7B,eAAW,QAAQ,OAAO;AACxB,cAAQ,KAAK,MAAM,KAAK,MAAM,IAAI,CAAC;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AACF;","names":[]}