@memextend/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.
- package/dist/embedding/index.d.ts +3 -0
- package/dist/embedding/index.d.ts.map +1 -0
- package/dist/embedding/index.js +4 -0
- package/dist/embedding/index.js.map +1 -0
- package/dist/embedding/local.d.ts +54 -0
- package/dist/embedding/local.d.ts.map +1 -0
- package/dist/embedding/local.js +162 -0
- package/dist/embedding/local.js.map +1 -0
- package/dist/embedding/local.test.d.ts +2 -0
- package/dist/embedding/local.test.d.ts.map +1 -0
- package/dist/embedding/local.test.js +73 -0
- package/dist/embedding/local.test.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/capture.d.ts +102 -0
- package/dist/memory/capture.d.ts.map +1 -0
- package/dist/memory/capture.js +249 -0
- package/dist/memory/capture.js.map +1 -0
- package/dist/memory/capture.test.d.ts +2 -0
- package/dist/memory/capture.test.d.ts.map +1 -0
- package/dist/memory/capture.test.js +168 -0
- package/dist/memory/capture.test.js.map +1 -0
- package/dist/memory/deduplicate.d.ts +31 -0
- package/dist/memory/deduplicate.d.ts.map +1 -0
- package/dist/memory/deduplicate.js +64 -0
- package/dist/memory/deduplicate.js.map +1 -0
- package/dist/memory/deduplicate.test.d.ts +2 -0
- package/dist/memory/deduplicate.test.d.ts.map +1 -0
- package/dist/memory/deduplicate.test.js +116 -0
- package/dist/memory/deduplicate.test.js.map +1 -0
- package/dist/memory/index.d.ts +8 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +7 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/retrieve.d.ts +62 -0
- package/dist/memory/retrieve.d.ts.map +1 -0
- package/dist/memory/retrieve.js +218 -0
- package/dist/memory/retrieve.js.map +1 -0
- package/dist/memory/retrieve.test.d.ts +2 -0
- package/dist/memory/retrieve.test.d.ts.map +1 -0
- package/dist/memory/retrieve.test.js +177 -0
- package/dist/memory/retrieve.test.js.map +1 -0
- package/dist/memory/types.d.ts +36 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +4 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/memory/types.test.d.ts +2 -0
- package/dist/memory/types.test.d.ts.map +1 -0
- package/dist/memory/types.test.js +31 -0
- package/dist/memory/types.test.js.map +1 -0
- package/dist/storage/index.d.ts +4 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +5 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/lancedb.d.ts +24 -0
- package/dist/storage/lancedb.d.ts.map +1 -0
- package/dist/storage/lancedb.js +106 -0
- package/dist/storage/lancedb.js.map +1 -0
- package/dist/storage/lancedb.test.d.ts +2 -0
- package/dist/storage/lancedb.test.d.ts.map +1 -0
- package/dist/storage/lancedb.test.js +67 -0
- package/dist/storage/lancedb.test.js.map +1 -0
- package/dist/storage/sqlite.d.ts +68 -0
- package/dist/storage/sqlite.d.ts.map +1 -0
- package/dist/storage/sqlite.js +354 -0
- package/dist/storage/sqlite.js.map +1 -0
- package/dist/storage/sqlite.test.d.ts +2 -0
- package/dist/storage/sqlite.test.d.ts.map +1 -0
- package/dist/storage/sqlite.test.js +137 -0
- package/dist/storage/sqlite.test.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/project.d.ts +13 -0
- package/dist/utils/project.d.ts.map +1 -0
- package/dist/utils/project.js +37 -0
- package/dist/utils/project.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/embedding/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACrG,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/embedding/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,8CAA8C;AAE9C,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export interface EmbeddingOptions {
|
|
2
|
+
modelsDir?: string;
|
|
3
|
+
dimensions?: number;
|
|
4
|
+
}
|
|
5
|
+
export declare class LocalEmbedding {
|
|
6
|
+
private model;
|
|
7
|
+
private context;
|
|
8
|
+
private readonly dimensions;
|
|
9
|
+
private constructor();
|
|
10
|
+
static create(modelsDir: string): Promise<LocalEmbedding>;
|
|
11
|
+
private static downloadModel;
|
|
12
|
+
/**
|
|
13
|
+
* Generate embedding for a document/memory
|
|
14
|
+
*/
|
|
15
|
+
embed(text: string): Promise<number[]>;
|
|
16
|
+
/**
|
|
17
|
+
* Generate embedding for a search query
|
|
18
|
+
*/
|
|
19
|
+
embedQuery(text: string): Promise<number[]>;
|
|
20
|
+
/**
|
|
21
|
+
* Batch embed multiple texts (documents)
|
|
22
|
+
*/
|
|
23
|
+
embedBatch(texts: string[]): Promise<number[][]>;
|
|
24
|
+
/**
|
|
25
|
+
* Get the embedding dimensions
|
|
26
|
+
*/
|
|
27
|
+
getDimensions(): number;
|
|
28
|
+
/**
|
|
29
|
+
* Normalize vector to unit length (for cosine similarity)
|
|
30
|
+
*/
|
|
31
|
+
private normalize;
|
|
32
|
+
close(): Promise<void>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Calculate cosine similarity between two vectors
|
|
36
|
+
*/
|
|
37
|
+
export declare function cosineSimilarity(a: number[], b: number[]): number;
|
|
38
|
+
/**
|
|
39
|
+
* Check if the embedding model is available (downloaded)
|
|
40
|
+
*/
|
|
41
|
+
export declare function isModelAvailable(modelsDir: string): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Create an embed function that uses real embeddings if available,
|
|
44
|
+
* otherwise falls back to a deterministic hash-based mock.
|
|
45
|
+
* This is useful for hooks that need fast startup but still work
|
|
46
|
+
* without the model downloaded.
|
|
47
|
+
*/
|
|
48
|
+
export declare function createEmbedFunction(modelsDir: string): Promise<{
|
|
49
|
+
embed: (text: string) => Promise<number[]>;
|
|
50
|
+
embedQuery: (text: string) => Promise<number[]>;
|
|
51
|
+
isReal: boolean;
|
|
52
|
+
close: () => Promise<void>;
|
|
53
|
+
}>;
|
|
54
|
+
//# sourceMappingURL=local.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/embedding/local.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,cAAc;IAEzB,OAAO,CAAC,KAAK,CAAM;IACnB,OAAO,CAAC,OAAO,CAAM;IACrB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IAEpC,OAAO;WAMM,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;mBAsB1C,aAAa;IAkBlC;;OAEG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAQ5C;;OAEG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAOjD;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAQtD;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,OAAO,CAAC,SAAS;IAMX,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CASjE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAG3D;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IACpE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3C,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAChD,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B,CAAC,CAwCD"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
// packages/core/src/embedding/local.ts
|
|
2
|
+
// Copyright (c) 2026 ZodTTD LLC. MIT License.
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
import { existsSync, createWriteStream } from 'fs';
|
|
5
|
+
import { mkdir } from 'fs/promises';
|
|
6
|
+
import { pipeline } from 'stream/promises';
|
|
7
|
+
const MODEL_URL = 'https://huggingface.co/nomic-ai/nomic-embed-text-v1.5-GGUF/resolve/main/nomic-embed-text-v1.5.Q8_0.gguf';
|
|
8
|
+
const MODEL_FILENAME = 'nomic-embed-text-v1.5.Q8_0.gguf';
|
|
9
|
+
export class LocalEmbedding {
|
|
10
|
+
// Using any to avoid ESM/CJS type issues with dynamic imports
|
|
11
|
+
model;
|
|
12
|
+
context;
|
|
13
|
+
dimensions;
|
|
14
|
+
constructor(model, context, dimensions) {
|
|
15
|
+
this.model = model;
|
|
16
|
+
this.context = context;
|
|
17
|
+
this.dimensions = dimensions;
|
|
18
|
+
}
|
|
19
|
+
static async create(modelsDir) {
|
|
20
|
+
const modelPath = join(modelsDir, MODEL_FILENAME);
|
|
21
|
+
// Download model if not exists
|
|
22
|
+
if (!existsSync(modelPath)) {
|
|
23
|
+
await LocalEmbedding.downloadModel(modelsDir, modelPath);
|
|
24
|
+
}
|
|
25
|
+
// Dynamic import of node-llama-cpp to avoid ESM/CJS issues
|
|
26
|
+
const { getLlama, LlamaLogLevel } = await import('node-llama-cpp');
|
|
27
|
+
// Suppress node-llama-cpp warnings (tokenizer warnings are expected with this model)
|
|
28
|
+
const llama = await getLlama({
|
|
29
|
+
logLevel: LlamaLogLevel.error // Only show errors, not warnings
|
|
30
|
+
});
|
|
31
|
+
const model = await llama.loadModel({ modelPath });
|
|
32
|
+
const context = await model.createEmbeddingContext();
|
|
33
|
+
// Nomic embed text v1.5 produces 768-dim vectors, but we'll use 384 for efficiency
|
|
34
|
+
return new LocalEmbedding(model, context, 384);
|
|
35
|
+
}
|
|
36
|
+
static async downloadModel(modelsDir, modelPath) {
|
|
37
|
+
await mkdir(modelsDir, { recursive: true });
|
|
38
|
+
console.log(`Downloading embedding model to ${modelPath}...`);
|
|
39
|
+
console.log('This is a one-time download (~274MB)');
|
|
40
|
+
const response = await fetch(MODEL_URL);
|
|
41
|
+
if (!response.ok || !response.body) {
|
|
42
|
+
throw new Error(`Failed to download model: ${response.statusText}`);
|
|
43
|
+
}
|
|
44
|
+
const fileStream = createWriteStream(modelPath);
|
|
45
|
+
// @ts-ignore - Node.js streams compatibility
|
|
46
|
+
await pipeline(response.body, fileStream);
|
|
47
|
+
console.log('Model downloaded successfully');
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Generate embedding for a document/memory
|
|
51
|
+
*/
|
|
52
|
+
async embed(text) {
|
|
53
|
+
const prefixedText = `search_document: ${text}`;
|
|
54
|
+
const embedding = await this.context.getEmbeddingFor(prefixedText);
|
|
55
|
+
// Truncate or pad to target dimensions
|
|
56
|
+
const vector = Array.from(embedding.vector).slice(0, this.dimensions);
|
|
57
|
+
return this.normalize(vector);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Generate embedding for a search query
|
|
61
|
+
*/
|
|
62
|
+
async embedQuery(text) {
|
|
63
|
+
const prefixedText = `search_query: ${text}`;
|
|
64
|
+
const embedding = await this.context.getEmbeddingFor(prefixedText);
|
|
65
|
+
const vector = Array.from(embedding.vector).slice(0, this.dimensions);
|
|
66
|
+
return this.normalize(vector);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Batch embed multiple texts (documents)
|
|
70
|
+
*/
|
|
71
|
+
async embedBatch(texts) {
|
|
72
|
+
const results = [];
|
|
73
|
+
for (const text of texts) {
|
|
74
|
+
results.push(await this.embed(text));
|
|
75
|
+
}
|
|
76
|
+
return results;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get the embedding dimensions
|
|
80
|
+
*/
|
|
81
|
+
getDimensions() {
|
|
82
|
+
return this.dimensions;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Normalize vector to unit length (for cosine similarity)
|
|
86
|
+
*/
|
|
87
|
+
normalize(vector) {
|
|
88
|
+
const norm = Math.sqrt(vector.reduce((sum, v) => sum + v * v, 0));
|
|
89
|
+
if (norm === 0)
|
|
90
|
+
return vector;
|
|
91
|
+
return vector.map(v => v / norm);
|
|
92
|
+
}
|
|
93
|
+
async close() {
|
|
94
|
+
await this.context.dispose();
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Calculate cosine similarity between two vectors
|
|
99
|
+
*/
|
|
100
|
+
export function cosineSimilarity(a, b) {
|
|
101
|
+
if (a.length !== b.length) {
|
|
102
|
+
throw new Error(`Vector dimensions must match: ${a.length} vs ${b.length}`);
|
|
103
|
+
}
|
|
104
|
+
let dot = 0;
|
|
105
|
+
for (let i = 0; i < a.length; i++) {
|
|
106
|
+
dot += a[i] * b[i];
|
|
107
|
+
}
|
|
108
|
+
return dot; // Already normalized, so this is cosine similarity
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Check if the embedding model is available (downloaded)
|
|
112
|
+
*/
|
|
113
|
+
export function isModelAvailable(modelsDir) {
|
|
114
|
+
const modelPath = join(modelsDir, MODEL_FILENAME);
|
|
115
|
+
return existsSync(modelPath);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Create an embed function that uses real embeddings if available,
|
|
119
|
+
* otherwise falls back to a deterministic hash-based mock.
|
|
120
|
+
* This is useful for hooks that need fast startup but still work
|
|
121
|
+
* without the model downloaded.
|
|
122
|
+
*/
|
|
123
|
+
export async function createEmbedFunction(modelsDir) {
|
|
124
|
+
// Try to use real embeddings if model exists
|
|
125
|
+
if (isModelAvailable(modelsDir)) {
|
|
126
|
+
try {
|
|
127
|
+
const embedding = await LocalEmbedding.create(modelsDir);
|
|
128
|
+
return {
|
|
129
|
+
embed: (text) => embedding.embed(text),
|
|
130
|
+
embedQuery: (text) => embedding.embedQuery(text),
|
|
131
|
+
isReal: true,
|
|
132
|
+
close: () => embedding.close()
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
console.error('[memextend] Failed to load embedding model, using fallback:', error);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// Fallback: deterministic hash-based embedding
|
|
140
|
+
// This allows the system to work without the model, but with reduced semantic quality
|
|
141
|
+
const { createHash } = await import('crypto');
|
|
142
|
+
const hashEmbed = (text, prefix) => {
|
|
143
|
+
const hash = createHash('sha256').update(prefix + text).digest();
|
|
144
|
+
const vector = Array.from(hash).slice(0, 32);
|
|
145
|
+
// Expand to 384 dimensions using multiple hash rounds
|
|
146
|
+
const expanded = [];
|
|
147
|
+
for (let i = 0; i < 12; i++) {
|
|
148
|
+
const roundHash = createHash('sha256').update(text + i.toString()).digest();
|
|
149
|
+
expanded.push(...Array.from(roundHash).slice(0, 32));
|
|
150
|
+
}
|
|
151
|
+
// Normalize
|
|
152
|
+
const norm = Math.sqrt(expanded.reduce((sum, v) => sum + v * v, 0));
|
|
153
|
+
return expanded.map(v => v / norm / 255);
|
|
154
|
+
};
|
|
155
|
+
return {
|
|
156
|
+
embed: async (text) => hashEmbed(text, 'doc:'),
|
|
157
|
+
embedQuery: async (text) => hashEmbed(text, 'query:'),
|
|
158
|
+
isReal: false,
|
|
159
|
+
close: async () => { }
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=local.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/embedding/local.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.test.d.ts","sourceRoot":"","sources":["../../src/embedding/local.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// packages/core/src/embedding/local.test.ts
|
|
2
|
+
// Copyright (c) 2026 ZodTTD LLC. MIT License.
|
|
3
|
+
import { describe, it, expect, beforeAll, afterAll } from 'vitest';
|
|
4
|
+
import { LocalEmbedding, cosineSimilarity } from './local.js';
|
|
5
|
+
import { join } from 'path';
|
|
6
|
+
import { tmpdir } from 'os';
|
|
7
|
+
// Use a shared model directory to avoid re-downloading
|
|
8
|
+
const SHARED_MODEL_DIR = join(tmpdir(), 'memextend-models-test');
|
|
9
|
+
describe('LocalEmbedding', () => {
|
|
10
|
+
let embedding;
|
|
11
|
+
beforeAll(async () => {
|
|
12
|
+
// This may take a while on first run due to model download
|
|
13
|
+
embedding = await LocalEmbedding.create(SHARED_MODEL_DIR);
|
|
14
|
+
}, 300000); // 5 min timeout for model download
|
|
15
|
+
afterAll(async () => {
|
|
16
|
+
await embedding.close();
|
|
17
|
+
// Don't delete the model dir - keep for subsequent test runs
|
|
18
|
+
});
|
|
19
|
+
it('should generate embeddings with correct dimensions', async () => {
|
|
20
|
+
const vector = await embedding.embed('Hello world');
|
|
21
|
+
expect(vector.length).toBe(384);
|
|
22
|
+
});
|
|
23
|
+
it('should generate normalized vectors', async () => {
|
|
24
|
+
const vector = await embedding.embed('Test normalization');
|
|
25
|
+
const magnitude = Math.sqrt(vector.reduce((sum, v) => sum + v * v, 0));
|
|
26
|
+
expect(magnitude).toBeCloseTo(1.0, 5);
|
|
27
|
+
});
|
|
28
|
+
it('should generate similar embeddings for similar text', async () => {
|
|
29
|
+
const vec1 = await embedding.embed('The cat sat on the mat');
|
|
30
|
+
const vec2 = await embedding.embed('A cat was sitting on a mat');
|
|
31
|
+
const vec3 = await embedding.embed('JavaScript programming language');
|
|
32
|
+
const sim12 = cosineSimilarity(vec1, vec2);
|
|
33
|
+
const sim13 = cosineSimilarity(vec1, vec3);
|
|
34
|
+
expect(sim12).toBeGreaterThan(sim13);
|
|
35
|
+
});
|
|
36
|
+
it('should batch embed multiple texts', async () => {
|
|
37
|
+
const texts = ['First text', 'Second text', 'Third text'];
|
|
38
|
+
const vectors = await embedding.embedBatch(texts);
|
|
39
|
+
expect(vectors.length).toBe(3);
|
|
40
|
+
vectors.forEach(vec => expect(vec.length).toBe(384));
|
|
41
|
+
});
|
|
42
|
+
it('should differentiate between query and document embeddings', async () => {
|
|
43
|
+
const doc = await embedding.embed('Documentation about Redis caching');
|
|
44
|
+
const query = await embedding.embedQuery('How to use Redis?');
|
|
45
|
+
// Both should be valid vectors
|
|
46
|
+
expect(doc.length).toBe(384);
|
|
47
|
+
expect(query.length).toBe(384);
|
|
48
|
+
// Query should be somewhat similar to doc
|
|
49
|
+
const sim = cosineSimilarity(doc, query);
|
|
50
|
+
expect(sim).toBeGreaterThan(0);
|
|
51
|
+
});
|
|
52
|
+
it('should report correct dimensions', () => {
|
|
53
|
+
expect(embedding.getDimensions()).toBe(384);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
describe('cosineSimilarity', () => {
|
|
57
|
+
it('should return 1 for identical vectors', () => {
|
|
58
|
+
const vec = [0.5, 0.5, 0.5, 0.5];
|
|
59
|
+
const normalized = vec.map(v => v / Math.sqrt(vec.length * 0.25));
|
|
60
|
+
expect(cosineSimilarity(normalized, normalized)).toBeCloseTo(1.0, 5);
|
|
61
|
+
});
|
|
62
|
+
it('should return 0 for orthogonal vectors', () => {
|
|
63
|
+
const a = [1, 0, 0, 0];
|
|
64
|
+
const b = [0, 1, 0, 0];
|
|
65
|
+
expect(cosineSimilarity(a, b)).toBeCloseTo(0, 5);
|
|
66
|
+
});
|
|
67
|
+
it('should throw for mismatched dimensions', () => {
|
|
68
|
+
const a = [1, 2, 3];
|
|
69
|
+
const b = [1, 2];
|
|
70
|
+
expect(() => cosineSimilarity(a, b)).toThrow('Vector dimensions must match');
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
//# sourceMappingURL=local.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.test.js","sourceRoot":"","sources":["../../src/embedding/local.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAClB,8CAA8C;AAE9C,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import type { SourceTool } from './types.js';
|
|
2
|
+
export interface ToolCapture {
|
|
3
|
+
tool: SourceTool;
|
|
4
|
+
input: Record<string, unknown>;
|
|
5
|
+
output: string;
|
|
6
|
+
}
|
|
7
|
+
export interface TextCapture {
|
|
8
|
+
type: 'reasoning';
|
|
9
|
+
content: string;
|
|
10
|
+
}
|
|
11
|
+
export type Capture = ToolCapture | TextCapture;
|
|
12
|
+
export interface TranscriptEntry {
|
|
13
|
+
type: string;
|
|
14
|
+
message?: {
|
|
15
|
+
role?: string;
|
|
16
|
+
content?: Array<{
|
|
17
|
+
type: string;
|
|
18
|
+
text?: string;
|
|
19
|
+
name?: string;
|
|
20
|
+
id?: string;
|
|
21
|
+
input?: Record<string, unknown>;
|
|
22
|
+
tool_use_id?: string;
|
|
23
|
+
content?: string | Array<{
|
|
24
|
+
type: string;
|
|
25
|
+
text?: string;
|
|
26
|
+
}>;
|
|
27
|
+
}> | string;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export declare const CONFIGURABLE_TOOLS: readonly ["Edit", "Write", "Bash", "Task"];
|
|
31
|
+
export type ConfigurableTool = typeof CONFIGURABLE_TOOLS[number];
|
|
32
|
+
export interface ToolCaptureConfig {
|
|
33
|
+
Edit?: boolean;
|
|
34
|
+
Write?: boolean;
|
|
35
|
+
Bash?: boolean;
|
|
36
|
+
Task?: boolean;
|
|
37
|
+
}
|
|
38
|
+
export interface TranscriptParserOptions {
|
|
39
|
+
/** @deprecated Use toolConfig instead */
|
|
40
|
+
captureTools?: Set<string>;
|
|
41
|
+
/** @deprecated Use toolConfig instead */
|
|
42
|
+
skipTools?: Set<string>;
|
|
43
|
+
/** Individual tool enable/disable config */
|
|
44
|
+
toolConfig?: ToolCaptureConfig;
|
|
45
|
+
/** @deprecated Use maxReasoningLength and maxToolOutputLength instead */
|
|
46
|
+
maxContentLength?: number;
|
|
47
|
+
/** Max length for reasoning text captures (default: 10000) */
|
|
48
|
+
maxReasoningLength?: number;
|
|
49
|
+
/** Max length for tool output captures (default: 2000) */
|
|
50
|
+
maxToolOutputLength?: number;
|
|
51
|
+
captureReasoning?: boolean;
|
|
52
|
+
}
|
|
53
|
+
export declare class TranscriptParser {
|
|
54
|
+
private toolConfig;
|
|
55
|
+
private maxReasoningLength;
|
|
56
|
+
private maxToolOutputLength;
|
|
57
|
+
private captureReasoning;
|
|
58
|
+
constructor(options?: TranscriptParserOptions);
|
|
59
|
+
/**
|
|
60
|
+
* Parse a Claude Code JSONL transcript and extract captures
|
|
61
|
+
*
|
|
62
|
+
* Captures two types of content:
|
|
63
|
+
* 1. Claude's text responses (reasoning, explanations, decisions)
|
|
64
|
+
* 2. Tool calls for code changes (Edit, Write)
|
|
65
|
+
*
|
|
66
|
+
* Claude Code transcript format:
|
|
67
|
+
* - type: "assistant" with message.content containing text and tool_use objects
|
|
68
|
+
* - type: "user" with message.content containing tool_result objects
|
|
69
|
+
*/
|
|
70
|
+
parse(transcript: string): Capture[];
|
|
71
|
+
/**
|
|
72
|
+
* Check if text content is substantial (not just filler/transitional)
|
|
73
|
+
*/
|
|
74
|
+
private isSubstantialContent;
|
|
75
|
+
/**
|
|
76
|
+
* Legacy method for backward compatibility - returns only tool captures
|
|
77
|
+
*/
|
|
78
|
+
parseToolCaptures(transcript: string): ToolCapture[];
|
|
79
|
+
private shouldCapture;
|
|
80
|
+
private truncate;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Type guard to check if a capture is a TextCapture
|
|
84
|
+
*/
|
|
85
|
+
export declare function isTextCapture(capture: Capture): capture is TextCapture;
|
|
86
|
+
/**
|
|
87
|
+
* Type guard to check if a capture is a ToolCapture
|
|
88
|
+
*/
|
|
89
|
+
export declare function isToolCapture(capture: Capture): capture is ToolCapture;
|
|
90
|
+
/**
|
|
91
|
+
* Format a capture into a human-readable memory content string
|
|
92
|
+
*/
|
|
93
|
+
export declare function formatCaptureContent(capture: Capture): string;
|
|
94
|
+
/**
|
|
95
|
+
* Format a tool capture into a human-readable memory content string
|
|
96
|
+
*/
|
|
97
|
+
export declare function formatToolMemoryContent(tool: SourceTool, input: Record<string, unknown>, output: string): string;
|
|
98
|
+
/**
|
|
99
|
+
* @deprecated Use formatCaptureContent instead
|
|
100
|
+
*/
|
|
101
|
+
export declare const formatMemoryContent: typeof formatToolMemoryContent;
|
|
102
|
+
//# sourceMappingURL=capture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../src/memory/capture.ts"],"names":[],"mappings":"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"}
|