@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.
Files changed (81) hide show
  1. package/dist/embedding/index.d.ts +3 -0
  2. package/dist/embedding/index.d.ts.map +1 -0
  3. package/dist/embedding/index.js +4 -0
  4. package/dist/embedding/index.js.map +1 -0
  5. package/dist/embedding/local.d.ts +54 -0
  6. package/dist/embedding/local.d.ts.map +1 -0
  7. package/dist/embedding/local.js +162 -0
  8. package/dist/embedding/local.js.map +1 -0
  9. package/dist/embedding/local.test.d.ts +2 -0
  10. package/dist/embedding/local.test.d.ts.map +1 -0
  11. package/dist/embedding/local.test.js +73 -0
  12. package/dist/embedding/local.test.js.map +1 -0
  13. package/dist/index.d.ts +5 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +7 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/memory/capture.d.ts +102 -0
  18. package/dist/memory/capture.d.ts.map +1 -0
  19. package/dist/memory/capture.js +249 -0
  20. package/dist/memory/capture.js.map +1 -0
  21. package/dist/memory/capture.test.d.ts +2 -0
  22. package/dist/memory/capture.test.d.ts.map +1 -0
  23. package/dist/memory/capture.test.js +168 -0
  24. package/dist/memory/capture.test.js.map +1 -0
  25. package/dist/memory/deduplicate.d.ts +31 -0
  26. package/dist/memory/deduplicate.d.ts.map +1 -0
  27. package/dist/memory/deduplicate.js +64 -0
  28. package/dist/memory/deduplicate.js.map +1 -0
  29. package/dist/memory/deduplicate.test.d.ts +2 -0
  30. package/dist/memory/deduplicate.test.d.ts.map +1 -0
  31. package/dist/memory/deduplicate.test.js +116 -0
  32. package/dist/memory/deduplicate.test.js.map +1 -0
  33. package/dist/memory/index.d.ts +8 -0
  34. package/dist/memory/index.d.ts.map +1 -0
  35. package/dist/memory/index.js +7 -0
  36. package/dist/memory/index.js.map +1 -0
  37. package/dist/memory/retrieve.d.ts +62 -0
  38. package/dist/memory/retrieve.d.ts.map +1 -0
  39. package/dist/memory/retrieve.js +218 -0
  40. package/dist/memory/retrieve.js.map +1 -0
  41. package/dist/memory/retrieve.test.d.ts +2 -0
  42. package/dist/memory/retrieve.test.d.ts.map +1 -0
  43. package/dist/memory/retrieve.test.js +177 -0
  44. package/dist/memory/retrieve.test.js.map +1 -0
  45. package/dist/memory/types.d.ts +36 -0
  46. package/dist/memory/types.d.ts.map +1 -0
  47. package/dist/memory/types.js +4 -0
  48. package/dist/memory/types.js.map +1 -0
  49. package/dist/memory/types.test.d.ts +2 -0
  50. package/dist/memory/types.test.d.ts.map +1 -0
  51. package/dist/memory/types.test.js +31 -0
  52. package/dist/memory/types.test.js.map +1 -0
  53. package/dist/storage/index.d.ts +4 -0
  54. package/dist/storage/index.d.ts.map +1 -0
  55. package/dist/storage/index.js +5 -0
  56. package/dist/storage/index.js.map +1 -0
  57. package/dist/storage/lancedb.d.ts +24 -0
  58. package/dist/storage/lancedb.d.ts.map +1 -0
  59. package/dist/storage/lancedb.js +106 -0
  60. package/dist/storage/lancedb.js.map +1 -0
  61. package/dist/storage/lancedb.test.d.ts +2 -0
  62. package/dist/storage/lancedb.test.d.ts.map +1 -0
  63. package/dist/storage/lancedb.test.js +67 -0
  64. package/dist/storage/lancedb.test.js.map +1 -0
  65. package/dist/storage/sqlite.d.ts +68 -0
  66. package/dist/storage/sqlite.d.ts.map +1 -0
  67. package/dist/storage/sqlite.js +354 -0
  68. package/dist/storage/sqlite.js.map +1 -0
  69. package/dist/storage/sqlite.test.d.ts +2 -0
  70. package/dist/storage/sqlite.test.d.ts.map +1 -0
  71. package/dist/storage/sqlite.test.js +137 -0
  72. package/dist/storage/sqlite.test.js.map +1 -0
  73. package/dist/utils/index.d.ts +2 -0
  74. package/dist/utils/index.d.ts.map +1 -0
  75. package/dist/utils/index.js +4 -0
  76. package/dist/utils/index.js.map +1 -0
  77. package/dist/utils/project.d.ts +13 -0
  78. package/dist/utils/project.d.ts.map +1 -0
  79. package/dist/utils/project.js +37 -0
  80. package/dist/utils/project.js.map +1 -0
  81. package/package.json +61 -0
@@ -0,0 +1,3 @@
1
+ export { LocalEmbedding, cosineSimilarity, isModelAvailable, createEmbedFunction } from './local.js';
2
+ export type { EmbeddingOptions } from './local.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,4 @@
1
+ // packages/core/src/embedding/index.ts
2
+ // Copyright (c) 2026 ZodTTD LLC. MIT License.
3
+ export { LocalEmbedding, cosineSimilarity, isModelAvailable, createEmbedFunction } from './local.js';
4
+ //# sourceMappingURL=index.js.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=local.test.d.ts.map
@@ -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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"}
@@ -0,0 +1,5 @@
1
+ export * from './storage/index.js';
2
+ export * from './embedding/index.js';
3
+ export * from './memory/index.js';
4
+ export * from './utils/index.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -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,7 @@
1
+ // @memextend/core
2
+ // Copyright (c) 2026 ZodTTD LLC. MIT License.
3
+ export * from './storage/index.js';
4
+ export * from './embedding/index.js';
5
+ export * from './memory/index.js';
6
+ export * from './utils/index.js';
7
+ //# sourceMappingURL=index.js.map
@@ -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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"}