@memtensor/memos-local-openclaw-plugin 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 (162) hide show
  1. package/.env.example +11 -0
  2. package/README.md +251 -0
  3. package/SKILL.md +43 -0
  4. package/dist/capture/index.d.ts +16 -0
  5. package/dist/capture/index.d.ts.map +1 -0
  6. package/dist/capture/index.js +80 -0
  7. package/dist/capture/index.js.map +1 -0
  8. package/dist/config.d.ts +4 -0
  9. package/dist/config.d.ts.map +1 -0
  10. package/dist/config.js +96 -0
  11. package/dist/config.js.map +1 -0
  12. package/dist/embedding/index.d.ts +12 -0
  13. package/dist/embedding/index.d.ts.map +1 -0
  14. package/dist/embedding/index.js +75 -0
  15. package/dist/embedding/index.js.map +1 -0
  16. package/dist/embedding/local.d.ts +3 -0
  17. package/dist/embedding/local.d.ts.map +1 -0
  18. package/dist/embedding/local.js +65 -0
  19. package/dist/embedding/local.js.map +1 -0
  20. package/dist/embedding/providers/cohere.d.ts +4 -0
  21. package/dist/embedding/providers/cohere.d.ts.map +1 -0
  22. package/dist/embedding/providers/cohere.js +57 -0
  23. package/dist/embedding/providers/cohere.js.map +1 -0
  24. package/dist/embedding/providers/gemini.d.ts +3 -0
  25. package/dist/embedding/providers/gemini.d.ts.map +1 -0
  26. package/dist/embedding/providers/gemini.js +31 -0
  27. package/dist/embedding/providers/gemini.js.map +1 -0
  28. package/dist/embedding/providers/mistral.d.ts +3 -0
  29. package/dist/embedding/providers/mistral.d.ts.map +1 -0
  30. package/dist/embedding/providers/mistral.js +25 -0
  31. package/dist/embedding/providers/mistral.js.map +1 -0
  32. package/dist/embedding/providers/openai.d.ts +3 -0
  33. package/dist/embedding/providers/openai.d.ts.map +1 -0
  34. package/dist/embedding/providers/openai.js +35 -0
  35. package/dist/embedding/providers/openai.js.map +1 -0
  36. package/dist/embedding/providers/voyage.d.ts +3 -0
  37. package/dist/embedding/providers/voyage.d.ts.map +1 -0
  38. package/dist/embedding/providers/voyage.js +25 -0
  39. package/dist/embedding/providers/voyage.js.map +1 -0
  40. package/dist/index.d.ts +44 -0
  41. package/dist/index.d.ts.map +1 -0
  42. package/dist/index.js +75 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/ingest/chunker.d.ts +15 -0
  45. package/dist/ingest/chunker.d.ts.map +1 -0
  46. package/dist/ingest/chunker.js +193 -0
  47. package/dist/ingest/chunker.js.map +1 -0
  48. package/dist/ingest/dedup.d.ts +11 -0
  49. package/dist/ingest/dedup.d.ts.map +1 -0
  50. package/dist/ingest/dedup.js +29 -0
  51. package/dist/ingest/dedup.js.map +1 -0
  52. package/dist/ingest/providers/anthropic.d.ts +3 -0
  53. package/dist/ingest/providers/anthropic.d.ts.map +1 -0
  54. package/dist/ingest/providers/anthropic.js +33 -0
  55. package/dist/ingest/providers/anthropic.js.map +1 -0
  56. package/dist/ingest/providers/bedrock.d.ts +8 -0
  57. package/dist/ingest/providers/bedrock.d.ts.map +1 -0
  58. package/dist/ingest/providers/bedrock.js +41 -0
  59. package/dist/ingest/providers/bedrock.js.map +1 -0
  60. package/dist/ingest/providers/gemini.d.ts +3 -0
  61. package/dist/ingest/providers/gemini.d.ts.map +1 -0
  62. package/dist/ingest/providers/gemini.js +31 -0
  63. package/dist/ingest/providers/gemini.js.map +1 -0
  64. package/dist/ingest/providers/index.d.ts +9 -0
  65. package/dist/ingest/providers/index.d.ts.map +1 -0
  66. package/dist/ingest/providers/index.js +68 -0
  67. package/dist/ingest/providers/index.js.map +1 -0
  68. package/dist/ingest/providers/openai.d.ts +3 -0
  69. package/dist/ingest/providers/openai.d.ts.map +1 -0
  70. package/dist/ingest/providers/openai.js +41 -0
  71. package/dist/ingest/providers/openai.js.map +1 -0
  72. package/dist/ingest/worker.d.ts +21 -0
  73. package/dist/ingest/worker.d.ts.map +1 -0
  74. package/dist/ingest/worker.js +111 -0
  75. package/dist/ingest/worker.js.map +1 -0
  76. package/dist/recall/engine.d.ts +23 -0
  77. package/dist/recall/engine.d.ts.map +1 -0
  78. package/dist/recall/engine.js +153 -0
  79. package/dist/recall/engine.js.map +1 -0
  80. package/dist/recall/mmr.d.ts +17 -0
  81. package/dist/recall/mmr.d.ts.map +1 -0
  82. package/dist/recall/mmr.js +51 -0
  83. package/dist/recall/mmr.js.map +1 -0
  84. package/dist/recall/recency.d.ts +20 -0
  85. package/dist/recall/recency.d.ts.map +1 -0
  86. package/dist/recall/recency.js +26 -0
  87. package/dist/recall/recency.js.map +1 -0
  88. package/dist/recall/rrf.d.ts +16 -0
  89. package/dist/recall/rrf.d.ts.map +1 -0
  90. package/dist/recall/rrf.js +15 -0
  91. package/dist/recall/rrf.js.map +1 -0
  92. package/dist/storage/sqlite.d.ts +34 -0
  93. package/dist/storage/sqlite.d.ts.map +1 -0
  94. package/dist/storage/sqlite.js +274 -0
  95. package/dist/storage/sqlite.js.map +1 -0
  96. package/dist/storage/vector.d.ts +13 -0
  97. package/dist/storage/vector.d.ts.map +1 -0
  98. package/dist/storage/vector.js +33 -0
  99. package/dist/storage/vector.js.map +1 -0
  100. package/dist/tools/index.d.ts +4 -0
  101. package/dist/tools/index.d.ts.map +1 -0
  102. package/dist/tools/index.js +10 -0
  103. package/dist/tools/index.js.map +1 -0
  104. package/dist/tools/memory-get.d.ts +4 -0
  105. package/dist/tools/memory-get.d.ts.map +1 -0
  106. package/dist/tools/memory-get.js +59 -0
  107. package/dist/tools/memory-get.js.map +1 -0
  108. package/dist/tools/memory-search.d.ts +4 -0
  109. package/dist/tools/memory-search.d.ts.map +1 -0
  110. package/dist/tools/memory-search.js +36 -0
  111. package/dist/tools/memory-search.js.map +1 -0
  112. package/dist/tools/memory-timeline.d.ts +4 -0
  113. package/dist/tools/memory-timeline.d.ts.map +1 -0
  114. package/dist/tools/memory-timeline.js +64 -0
  115. package/dist/tools/memory-timeline.js.map +1 -0
  116. package/dist/types.d.ts +158 -0
  117. package/dist/types.d.ts.map +1 -0
  118. package/dist/types.js +25 -0
  119. package/dist/types.js.map +1 -0
  120. package/dist/viewer/html.d.ts +2 -0
  121. package/dist/viewer/html.d.ts.map +1 -0
  122. package/dist/viewer/html.js +686 -0
  123. package/dist/viewer/html.js.map +1 -0
  124. package/dist/viewer/server.d.ts +48 -0
  125. package/dist/viewer/server.d.ts.map +1 -0
  126. package/dist/viewer/server.js +470 -0
  127. package/dist/viewer/server.js.map +1 -0
  128. package/index.ts +357 -0
  129. package/openclaw.plugin.json +57 -0
  130. package/package.json +57 -0
  131. package/src/capture/index.ts +92 -0
  132. package/src/config.ts +67 -0
  133. package/src/embedding/index.ts +76 -0
  134. package/src/embedding/local.ts +35 -0
  135. package/src/embedding/providers/cohere.ts +69 -0
  136. package/src/embedding/providers/gemini.ts +41 -0
  137. package/src/embedding/providers/mistral.ts +32 -0
  138. package/src/embedding/providers/openai.ts +42 -0
  139. package/src/embedding/providers/voyage.ts +32 -0
  140. package/src/index.ts +106 -0
  141. package/src/ingest/chunker.ts +217 -0
  142. package/src/ingest/dedup.ts +37 -0
  143. package/src/ingest/providers/anthropic.ts +41 -0
  144. package/src/ingest/providers/bedrock.ts +50 -0
  145. package/src/ingest/providers/gemini.ts +41 -0
  146. package/src/ingest/providers/index.ts +67 -0
  147. package/src/ingest/providers/openai.ts +48 -0
  148. package/src/ingest/worker.ts +130 -0
  149. package/src/recall/engine.ts +182 -0
  150. package/src/recall/mmr.ts +60 -0
  151. package/src/recall/recency.ts +27 -0
  152. package/src/recall/rrf.ts +31 -0
  153. package/src/storage/sqlite.ts +305 -0
  154. package/src/storage/vector.ts +39 -0
  155. package/src/tools/index.ts +3 -0
  156. package/src/tools/memory-get.ts +68 -0
  157. package/src/tools/memory-search.ts +36 -0
  158. package/src/tools/memory-timeline.ts +73 -0
  159. package/src/types.ts +214 -0
  160. package/src/viewer/html.ts +682 -0
  161. package/src/viewer/server.ts +464 -0
  162. package/www/index.html +606 -0
@@ -0,0 +1,274 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.SqliteStore = void 0;
40
+ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ class SqliteStore {
44
+ log;
45
+ db;
46
+ constructor(dbPath, log) {
47
+ this.log = log;
48
+ fs.mkdirSync(path.dirname(dbPath), { recursive: true });
49
+ this.db = new better_sqlite3_1.default(dbPath);
50
+ this.db.pragma("journal_mode = WAL");
51
+ this.db.pragma("foreign_keys = ON");
52
+ this.migrate();
53
+ }
54
+ // ─── Schema ───
55
+ migrate() {
56
+ this.db.exec(`
57
+ CREATE TABLE IF NOT EXISTS chunks (
58
+ id TEXT PRIMARY KEY,
59
+ session_key TEXT NOT NULL,
60
+ turn_id TEXT NOT NULL,
61
+ seq INTEGER NOT NULL,
62
+ role TEXT NOT NULL,
63
+ content TEXT NOT NULL,
64
+ kind TEXT NOT NULL DEFAULT 'paragraph',
65
+ summary TEXT NOT NULL DEFAULT '',
66
+ created_at INTEGER NOT NULL,
67
+ updated_at INTEGER NOT NULL
68
+ );
69
+
70
+ CREATE INDEX IF NOT EXISTS idx_chunks_session
71
+ ON chunks(session_key);
72
+ CREATE INDEX IF NOT EXISTS idx_chunks_turn
73
+ ON chunks(session_key, turn_id, seq);
74
+ CREATE INDEX IF NOT EXISTS idx_chunks_created
75
+ ON chunks(created_at);
76
+
77
+ CREATE VIRTUAL TABLE IF NOT EXISTS chunks_fts USING fts5(
78
+ summary,
79
+ content,
80
+ content='chunks',
81
+ content_rowid='rowid',
82
+ tokenize='porter unicode61'
83
+ );
84
+
85
+ CREATE TRIGGER IF NOT EXISTS chunks_ai AFTER INSERT ON chunks BEGIN
86
+ INSERT INTO chunks_fts(rowid, summary, content)
87
+ VALUES (new.rowid, new.summary, new.content);
88
+ END;
89
+
90
+ CREATE TRIGGER IF NOT EXISTS chunks_ad AFTER DELETE ON chunks BEGIN
91
+ INSERT INTO chunks_fts(chunks_fts, rowid, summary, content)
92
+ VALUES ('delete', old.rowid, old.summary, old.content);
93
+ END;
94
+
95
+ CREATE TRIGGER IF NOT EXISTS chunks_au AFTER UPDATE ON chunks BEGIN
96
+ INSERT INTO chunks_fts(chunks_fts, rowid, summary, content)
97
+ VALUES ('delete', old.rowid, old.summary, old.content);
98
+ INSERT INTO chunks_fts(rowid, summary, content)
99
+ VALUES (new.rowid, new.summary, new.content);
100
+ END;
101
+
102
+ CREATE TABLE IF NOT EXISTS embeddings (
103
+ chunk_id TEXT PRIMARY KEY REFERENCES chunks(id) ON DELETE CASCADE,
104
+ vector BLOB NOT NULL,
105
+ dimensions INTEGER NOT NULL,
106
+ updated_at INTEGER NOT NULL
107
+ );
108
+ `);
109
+ this.log.debug("Database schema initialized");
110
+ }
111
+ // ─── Write ───
112
+ insertChunk(chunk) {
113
+ const stmt = this.db.prepare(`
114
+ INSERT OR REPLACE INTO chunks (id, session_key, turn_id, seq, role, content, kind, summary, created_at, updated_at)
115
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
116
+ `);
117
+ stmt.run(chunk.id, chunk.sessionKey, chunk.turnId, chunk.seq, chunk.role, chunk.content, chunk.kind, chunk.summary, chunk.createdAt, chunk.updatedAt);
118
+ }
119
+ updateSummary(chunkId, summary) {
120
+ this.db.prepare("UPDATE chunks SET summary = ?, updated_at = ? WHERE id = ?").run(summary, Date.now(), chunkId);
121
+ }
122
+ upsertEmbedding(chunkId, vector) {
123
+ const buf = Buffer.from(new Float32Array(vector).buffer);
124
+ this.db.prepare(`
125
+ INSERT OR REPLACE INTO embeddings (chunk_id, vector, dimensions, updated_at)
126
+ VALUES (?, ?, ?, ?)
127
+ `).run(chunkId, buf, vector.length, Date.now());
128
+ }
129
+ // ─── Read ───
130
+ getChunk(chunkId) {
131
+ const row = this.db.prepare("SELECT * FROM chunks WHERE id = ?").get(chunkId);
132
+ return row ? rowToChunk(row) : null;
133
+ }
134
+ getChunksByRef(ref) {
135
+ return this.getChunk(ref.chunkId);
136
+ }
137
+ getNeighborChunks(sessionKey, turnId, seq, window) {
138
+ const allRows = this.db.prepare(`
139
+ SELECT * FROM chunks
140
+ WHERE session_key = ?
141
+ ORDER BY created_at, seq
142
+ `).all(sessionKey);
143
+ const targetIdx = allRows.findIndex((r) => r.turn_id === turnId && r.seq === seq);
144
+ if (targetIdx === -1)
145
+ return [];
146
+ const radius = window * 3;
147
+ const start = Math.max(0, targetIdx - radius);
148
+ const end = Math.min(allRows.length, targetIdx + radius + 1);
149
+ return allRows.slice(start, end).map(rowToChunk);
150
+ }
151
+ // ─── FTS Search ───
152
+ ftsSearch(query, limit) {
153
+ const sanitized = sanitizeFtsQuery(query);
154
+ if (!sanitized)
155
+ return [];
156
+ try {
157
+ const rows = this.db.prepare(`
158
+ SELECT c.id as chunk_id, rank
159
+ FROM chunks_fts f
160
+ JOIN chunks c ON c.rowid = f.rowid
161
+ WHERE chunks_fts MATCH ?
162
+ ORDER BY rank
163
+ LIMIT ?
164
+ `).all(sanitized, limit);
165
+ if (rows.length === 0)
166
+ return [];
167
+ const maxAbsRank = Math.max(...rows.map((r) => Math.abs(r.rank)));
168
+ return rows.map((r) => ({
169
+ chunkId: r.chunk_id,
170
+ score: maxAbsRank > 0 ? Math.abs(r.rank) / maxAbsRank : 0,
171
+ }));
172
+ }
173
+ catch {
174
+ this.log.warn(`FTS query failed for: "${sanitized}", returning empty`);
175
+ return [];
176
+ }
177
+ }
178
+ // ─── Vector Search ───
179
+ getAllEmbeddings() {
180
+ const rows = this.db.prepare("SELECT chunk_id, vector, dimensions FROM embeddings").all();
181
+ return rows.map((r) => ({
182
+ chunkId: r.chunk_id,
183
+ vector: Array.from(new Float32Array(r.vector.buffer, r.vector.byteOffset, r.dimensions)),
184
+ }));
185
+ }
186
+ getEmbedding(chunkId) {
187
+ const row = this.db.prepare("SELECT vector, dimensions FROM embeddings WHERE chunk_id = ?").get(chunkId);
188
+ if (!row)
189
+ return null;
190
+ return Array.from(new Float32Array(row.vector.buffer, row.vector.byteOffset, row.dimensions));
191
+ }
192
+ // ─── Update ───
193
+ updateChunk(chunkId, fields) {
194
+ const sets = [];
195
+ const params = [];
196
+ if (fields.summary !== undefined) {
197
+ sets.push("summary = ?");
198
+ params.push(fields.summary);
199
+ }
200
+ if (fields.content !== undefined) {
201
+ sets.push("content = ?");
202
+ params.push(fields.content);
203
+ }
204
+ if (fields.role !== undefined) {
205
+ sets.push("role = ?");
206
+ params.push(fields.role);
207
+ }
208
+ if (fields.kind !== undefined) {
209
+ sets.push("kind = ?");
210
+ params.push(fields.kind);
211
+ }
212
+ if (sets.length === 0)
213
+ return false;
214
+ sets.push("updated_at = ?");
215
+ params.push(Date.now());
216
+ params.push(chunkId);
217
+ const result = this.db.prepare(`UPDATE chunks SET ${sets.join(", ")} WHERE id = ?`).run(...params);
218
+ return result.changes > 0;
219
+ }
220
+ // ─── Delete ───
221
+ deleteChunk(chunkId) {
222
+ const result = this.db.prepare("DELETE FROM chunks WHERE id = ?").run(chunkId);
223
+ return result.changes > 0;
224
+ }
225
+ deleteSession(sessionKey) {
226
+ const result = this.db.prepare("DELETE FROM chunks WHERE session_key = ?").run(sessionKey);
227
+ return result.changes;
228
+ }
229
+ deleteAll() {
230
+ const result = this.db.prepare("DELETE FROM chunks").run();
231
+ return result.changes;
232
+ }
233
+ // ─── Util ───
234
+ getRecentChunkIds(limit) {
235
+ const rows = this.db.prepare("SELECT id FROM chunks ORDER BY created_at DESC LIMIT ?").all(limit);
236
+ return rows.map((r) => r.id);
237
+ }
238
+ close() {
239
+ this.db.close();
240
+ }
241
+ }
242
+ exports.SqliteStore = SqliteStore;
243
+ // ─── FTS helpers ───
244
+ /**
245
+ * Sanitize user input for FTS5 MATCH queries.
246
+ * Strip FTS operators and special characters, then join tokens
247
+ * with implicit AND (space-separated) for safe querying.
248
+ */
249
+ function sanitizeFtsQuery(raw) {
250
+ const tokens = raw
251
+ .replace(/[."""(){}[\]*:^~!@#$%&\\/<>,;'`]/g, " ")
252
+ .split(/\s+/)
253
+ .map((t) => t.trim().replace(/^-+|-+$/g, ""))
254
+ .filter((t) => t.length > 1)
255
+ .filter((t) => !FTS_RESERVED.has(t.toUpperCase()));
256
+ return tokens.join(" ");
257
+ }
258
+ const FTS_RESERVED = new Set(["AND", "OR", "NOT", "NEAR"]);
259
+ function rowToChunk(row) {
260
+ return {
261
+ id: row.id,
262
+ sessionKey: row.session_key,
263
+ turnId: row.turn_id,
264
+ seq: row.seq,
265
+ role: row.role,
266
+ content: row.content,
267
+ kind: row.kind,
268
+ summary: row.summary,
269
+ embedding: null,
270
+ createdAt: row.created_at,
271
+ updatedAt: row.updated_at,
272
+ };
273
+ }
274
+ //# sourceMappingURL=sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/storage/sqlite.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { SqliteStore } from "./sqlite";
2
+ export declare function cosineSimilarity(a: number[], b: number[]): number;
3
+ export interface VectorHit {
4
+ chunkId: string;
5
+ score: number;
6
+ }
7
+ /**
8
+ * Brute-force vector search over all stored embeddings.
9
+ * For local single-user usage the dataset is small enough that
10
+ * a full scan with SIMD-friendly Float32 math is sufficient.
11
+ */
12
+ export declare function vectorSearch(store: SqliteStore, queryVec: number[], topK: number): VectorHit[];
13
+ //# sourceMappingURL=vector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector.d.ts","sourceRoot":"","sources":["../../src/storage/vector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAYjE;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,MAAM,EAAE,EAClB,IAAI,EAAE,MAAM,GACX,SAAS,EAAE,CAQb"}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.cosineSimilarity = cosineSimilarity;
4
+ exports.vectorSearch = vectorSearch;
5
+ function cosineSimilarity(a, b) {
6
+ if (a.length !== b.length)
7
+ return 0;
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
+ const denom = Math.sqrt(normA) * Math.sqrt(normB);
17
+ return denom === 0 ? 0 : dot / denom;
18
+ }
19
+ /**
20
+ * Brute-force vector search over all stored embeddings.
21
+ * For local single-user usage the dataset is small enough that
22
+ * a full scan with SIMD-friendly Float32 math is sufficient.
23
+ */
24
+ function vectorSearch(store, queryVec, topK) {
25
+ const all = store.getAllEmbeddings();
26
+ const scored = all.map((row) => ({
27
+ chunkId: row.chunkId,
28
+ score: cosineSimilarity(queryVec, row.vector),
29
+ }));
30
+ scored.sort((a, b) => b.score - a.score);
31
+ return scored.slice(0, topK);
32
+ }
33
+ //# sourceMappingURL=vector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector.js","sourceRoot":"","sources":["../../src/storage/vector.ts"],"names":[],"mappings":";;AAEA,4CAYC;AAYD,oCAYC;AApCD,SAAgB,gBAAgB,CAAC,CAAW,EAAE,CAAW;IACvD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC;IACpC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACrB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClD,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC;AACvC,CAAC;AAOD;;;;GAIG;AACH,SAAgB,YAAY,CAC1B,KAAkB,EAClB,QAAkB,EAClB,IAAY;IAEZ,MAAM,GAAG,GAAG,KAAK,CAAC,gBAAgB,EAAE,CAAC;IACrC,MAAM,MAAM,GAAgB,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC5C,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,KAAK,EAAE,gBAAgB,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC;KAC9C,CAAC,CAAC,CAAC;IACJ,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACzC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { createMemorySearchTool } from "./memory-search";
2
+ export { createMemoryTimelineTool } from "./memory-timeline";
3
+ export { createMemoryGetTool } from "./memory-get";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createMemoryGetTool = exports.createMemoryTimelineTool = exports.createMemorySearchTool = void 0;
4
+ var memory_search_1 = require("./memory-search");
5
+ Object.defineProperty(exports, "createMemorySearchTool", { enumerable: true, get: function () { return memory_search_1.createMemorySearchTool; } });
6
+ var memory_timeline_1 = require("./memory-timeline");
7
+ Object.defineProperty(exports, "createMemoryTimelineTool", { enumerable: true, get: function () { return memory_timeline_1.createMemoryTimelineTool; } });
8
+ var memory_get_1 = require("./memory-get");
9
+ Object.defineProperty(exports, "createMemoryGetTool", { enumerable: true, get: function () { return memory_get_1.createMemoryGetTool; } });
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":";;;AAAA,iDAAyD;AAAhD,uHAAA,sBAAsB,OAAA;AAC/B,qDAA6D;AAApD,2HAAA,wBAAwB,OAAA;AACjC,2CAAmD;AAA1C,iHAAA,mBAAmB,OAAA"}
@@ -0,0 +1,4 @@
1
+ import type { SqliteStore } from "../storage/sqlite";
2
+ import type { ToolDefinition } from "../types";
3
+ export declare function createMemoryGetTool(store: SqliteStore): ToolDefinition;
4
+ //# sourceMappingURL=memory-get.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-get.d.ts","sourceRoot":"","sources":["../../src/tools/memory-get.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAuB,MAAM,UAAU,CAAC;AAGpE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,WAAW,GAAG,cAAc,CA+DtE"}
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createMemoryGetTool = createMemoryGetTool;
4
+ const types_1 = require("../types");
5
+ function createMemoryGetTool(store) {
6
+ return {
7
+ name: "memory_get",
8
+ description: "Retrieve the full original text of a specific memory chunk. Use after memory_search or memory_timeline " +
9
+ "when you need to see the complete content (not just the excerpt). Useful for verifying exact details.",
10
+ inputSchema: {
11
+ type: "object",
12
+ properties: {
13
+ ref: {
14
+ type: "object",
15
+ description: "Reference object from a memory_search hit or memory_timeline entry.",
16
+ properties: {
17
+ sessionKey: { type: "string" },
18
+ chunkId: { type: "string" },
19
+ turnId: { type: "string" },
20
+ seq: { type: "number" },
21
+ },
22
+ required: ["sessionKey", "chunkId", "turnId", "seq"],
23
+ },
24
+ maxChars: {
25
+ type: "number",
26
+ description: `Maximum characters to return (default ${types_1.DEFAULTS.getMaxCharsDefault}, max ${types_1.DEFAULTS.getMaxCharsMax}).`,
27
+ },
28
+ },
29
+ required: ["ref"],
30
+ },
31
+ handler: async (input) => {
32
+ const ref = input.ref;
33
+ const maxChars = Math.min(input.maxChars ?? types_1.DEFAULTS.getMaxCharsDefault, types_1.DEFAULTS.getMaxCharsMax);
34
+ const chunk = store.getChunksByRef(ref);
35
+ if (!chunk) {
36
+ return { error: `Chunk not found: ${ref.chunkId}` };
37
+ }
38
+ const content = chunk.content.length > maxChars
39
+ ? chunk.content.slice(0, maxChars) + "…"
40
+ : chunk.content;
41
+ const result = {
42
+ content,
43
+ ref: {
44
+ sessionKey: chunk.sessionKey,
45
+ chunkId: chunk.id,
46
+ turnId: chunk.turnId,
47
+ seq: chunk.seq,
48
+ },
49
+ source: {
50
+ ts: chunk.createdAt,
51
+ role: chunk.role,
52
+ sessionKey: chunk.sessionKey,
53
+ },
54
+ };
55
+ return result;
56
+ },
57
+ };
58
+ }
59
+ //# sourceMappingURL=memory-get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-get.js","sourceRoot":"","sources":["../../src/tools/memory-get.ts"],"names":[],"mappings":";;AAIA,kDA+DC;AAjED,oCAAoC;AAEpC,SAAgB,mBAAmB,CAAC,KAAkB;IACpD,OAAO;QACL,IAAI,EAAE,YAAY;QAClB,WAAW,EACT,yGAAyG;YACzG,uGAAuG;QACzG,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,GAAG,EAAE;oBACH,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,qEAAqE;oBAClF,UAAU,EAAE;wBACV,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBAC9B,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBAC3B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBAC1B,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;qBACxB;oBACD,QAAQ,EAAE,CAAC,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC;iBACrD;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,yCAAyC,gBAAQ,CAAC,kBAAkB,SAAS,gBAAQ,CAAC,cAAc,IAAI;iBACtH;aACF;YACD,QAAQ,EAAE,CAAC,KAAK,CAAC;SAClB;QACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YACvB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAe,CAAC;YAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CACtB,KAAK,CAAC,QAAmB,IAAI,gBAAQ,CAAC,kBAAkB,EACzD,gBAAQ,CAAC,cAAc,CACxB,CAAC;YAEF,MAAM,KAAK,GAAG,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;YAExC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,EAAE,KAAK,EAAE,oBAAoB,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;YACtD,CAAC;YAED,MAAM,OAAO,GACX,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,QAAQ;gBAC7B,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,GAAG;gBACxC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;YAEpB,MAAM,MAAM,GAAc;gBACxB,OAAO;gBACP,GAAG,EAAE;oBACH,UAAU,EAAE,KAAK,CAAC,UAAU;oBAC5B,OAAO,EAAE,KAAK,CAAC,EAAE;oBACjB,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,GAAG,EAAE,KAAK,CAAC,GAAG;iBACf;gBACD,MAAM,EAAE;oBACN,EAAE,EAAE,KAAK,CAAC,SAAS;oBACnB,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,UAAU,EAAE,KAAK,CAAC,UAAU;iBAC7B;aACF,CAAC;YAEF,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { RecallEngine } from "../recall/engine";
2
+ import type { ToolDefinition } from "../types";
3
+ export declare function createMemorySearchTool(engine: RecallEngine): ToolDefinition;
4
+ //# sourceMappingURL=memory-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-search.d.ts","sourceRoot":"","sources":["../../src/tools/memory-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,YAAY,GAAG,cAAc,CAgC3E"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createMemorySearchTool = createMemorySearchTool;
4
+ function createMemorySearchTool(engine) {
5
+ return {
6
+ name: "memory_search",
7
+ description: "Search stored conversation memories. Returns matching entries with summary, original_excerpt (evidence), score, and ref for follow-up with memory_timeline or memory_get. " +
8
+ "Default: top 6 results, minScore 0.45. Increase maxResults to 12/20 or lower minScore to 0.35 if initial results are insufficient.",
9
+ inputSchema: {
10
+ type: "object",
11
+ properties: {
12
+ query: {
13
+ type: "string",
14
+ description: "Natural language search query. Include specific entities, commands, or error messages for better recall.",
15
+ },
16
+ maxResults: {
17
+ type: "number",
18
+ description: "Maximum number of results (default 6, max 20).",
19
+ },
20
+ minScore: {
21
+ type: "number",
22
+ description: "Minimum relevance score threshold 0-1 (default 0.45, floor 0.35).",
23
+ },
24
+ },
25
+ },
26
+ handler: async (input) => {
27
+ const result = await engine.search({
28
+ query: input.query ?? "",
29
+ maxResults: input.maxResults,
30
+ minScore: input.minScore,
31
+ });
32
+ return result;
33
+ },
34
+ };
35
+ }
36
+ //# sourceMappingURL=memory-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-search.js","sourceRoot":"","sources":["../../src/tools/memory-search.ts"],"names":[],"mappings":";;AAGA,wDAgCC;AAhCD,SAAgB,sBAAsB,CAAC,MAAoB;IACzD,OAAO;QACL,IAAI,EAAE,eAAe;QACrB,WAAW,EACT,4KAA4K;YAC5K,oIAAoI;QACtI,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,0GAA0G;iBACxH;gBACD,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,gDAAgD;iBAC9D;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,mEAAmE;iBACjF;aACF;SACF;QACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YACvB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC;gBACjC,KAAK,EAAG,KAAK,CAAC,KAAgB,IAAI,EAAE;gBACpC,UAAU,EAAE,KAAK,CAAC,UAAgC;gBAClD,QAAQ,EAAE,KAAK,CAAC,QAA8B;aAC/C,CAAC,CAAC;YACH,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { SqliteStore } from "../storage/sqlite";
2
+ import type { ToolDefinition } from "../types";
3
+ export declare function createMemoryTimelineTool(store: SqliteStore): ToolDefinition;
4
+ //# sourceMappingURL=memory-timeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-timeline.d.ts","sourceRoot":"","sources":["../../src/tools/memory-timeline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAA2C,MAAM,UAAU,CAAC;AAGxF,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,WAAW,GAAG,cAAc,CAoE3E"}
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createMemoryTimelineTool = createMemoryTimelineTool;
4
+ const types_1 = require("../types");
5
+ function createMemoryTimelineTool(store) {
6
+ return {
7
+ name: "memory_timeline",
8
+ description: "Retrieve neighboring context around a memory reference. Use after memory_search to expand context " +
9
+ "around a specific hit. Provides adjacent conversation chunks marked as before/current/after.",
10
+ inputSchema: {
11
+ type: "object",
12
+ properties: {
13
+ ref: {
14
+ type: "object",
15
+ description: "Reference object from a memory_search hit (must contain sessionKey, chunkId, turnId, seq).",
16
+ properties: {
17
+ sessionKey: { type: "string" },
18
+ chunkId: { type: "string" },
19
+ turnId: { type: "string" },
20
+ seq: { type: "number" },
21
+ },
22
+ required: ["sessionKey", "chunkId", "turnId", "seq"],
23
+ },
24
+ window: {
25
+ type: "number",
26
+ description: "Number of turns/chunks to include before and after (default ±2).",
27
+ },
28
+ },
29
+ required: ["ref"],
30
+ },
31
+ handler: async (input) => {
32
+ const ref = input.ref;
33
+ const window = input.window ?? types_1.DEFAULTS.timelineWindowDefault;
34
+ const neighbors = store.getNeighborChunks(ref.sessionKey, ref.turnId, ref.seq, window);
35
+ const entries = neighbors.map((chunk) => {
36
+ let relation = "before";
37
+ if (chunk.id === ref.chunkId) {
38
+ relation = "current";
39
+ }
40
+ else if (chunk.createdAt > (store.getChunk(ref.chunkId)?.createdAt ?? 0)) {
41
+ relation = "after";
42
+ }
43
+ return {
44
+ excerpt: chunk.content.slice(0, types_1.DEFAULTS.excerptMaxChars),
45
+ ref: {
46
+ sessionKey: chunk.sessionKey,
47
+ chunkId: chunk.id,
48
+ turnId: chunk.turnId,
49
+ seq: chunk.seq,
50
+ },
51
+ role: chunk.role,
52
+ ts: chunk.createdAt,
53
+ relation,
54
+ };
55
+ });
56
+ const result = {
57
+ entries,
58
+ anchorRef: ref,
59
+ };
60
+ return result;
61
+ },
62
+ };
63
+ }
64
+ //# sourceMappingURL=memory-timeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-timeline.js","sourceRoot":"","sources":["../../src/tools/memory-timeline.ts"],"names":[],"mappings":";;AAIA,4DAoEC;AAtED,oCAAoC;AAEpC,SAAgB,wBAAwB,CAAC,KAAkB;IACzD,OAAO;QACL,IAAI,EAAE,iBAAiB;QACvB,WAAW,EACT,oGAAoG;YACpG,8FAA8F;QAChG,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,GAAG,EAAE;oBACH,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,4FAA4F;oBACzG,UAAU,EAAE;wBACV,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBAC9B,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBAC3B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBAC1B,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;qBACxB;oBACD,QAAQ,EAAE,CAAC,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC;iBACrD;gBACD,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,kEAAkE;iBAChF;aACF;YACD,QAAQ,EAAE,CAAC,KAAK,CAAC;SAClB;QACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YACvB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAe,CAAC;YAClC,MAAM,MAAM,GAAI,KAAK,CAAC,MAAiB,IAAI,gBAAQ,CAAC,qBAAqB,CAAC;YAE1E,MAAM,SAAS,GAAG,KAAK,CAAC,iBAAiB,CACvC,GAAG,CAAC,UAAU,EACd,GAAG,CAAC,MAAM,EACV,GAAG,CAAC,GAAG,EACP,MAAM,CACP,CAAC;YAEF,MAAM,OAAO,GAAoB,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;gBACvD,IAAI,QAAQ,GAA8B,QAAQ,CAAC;gBACnD,IAAI,KAAK,CAAC,EAAE,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC;oBAC7B,QAAQ,GAAG,SAAS,CAAC;gBACvB,CAAC;qBAAM,IAAI,KAAK,CAAC,SAAS,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,SAAS,IAAI,CAAC,CAAC,EAAE,CAAC;oBAC3E,QAAQ,GAAG,OAAO,CAAC;gBACrB,CAAC;gBAED,OAAO;oBACL,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAQ,CAAC,eAAe,CAAC;oBACzD,GAAG,EAAE;wBACH,UAAU,EAAE,KAAK,CAAC,UAAU;wBAC5B,OAAO,EAAE,KAAK,CAAC,EAAE;wBACjB,MAAM,EAAE,KAAK,CAAC,MAAM;wBACpB,GAAG,EAAE,KAAK,CAAC,GAAG;qBACf;oBACD,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,EAAE,EAAE,KAAK,CAAC,SAAS;oBACnB,QAAQ;iBACT,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAmB;gBAC7B,OAAO;gBACP,SAAS,EAAE,GAAG;aACf,CAAC;YAEF,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC"}