@pcircle/memesh 4.2.10 → 4.3.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 (106) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/README.de.md +14 -13
  4. package/README.es.md +14 -13
  5. package/README.fr.md +14 -13
  6. package/README.ja.md +14 -13
  7. package/README.ko.md +14 -13
  8. package/README.md +15 -14
  9. package/README.pt.md +14 -13
  10. package/README.th.md +15 -14
  11. package/README.vi.md +14 -13
  12. package/README.zh-CN.md +12 -11
  13. package/README.zh-TW.md +12 -11
  14. package/dashboard/dist/index.html +8 -8
  15. package/dist/cli/view.d.ts.map +1 -1
  16. package/dist/cli/view.js +6 -0
  17. package/dist/cli/view.js.map +1 -1
  18. package/dist/core/config.d.ts +14 -0
  19. package/dist/core/config.d.ts.map +1 -1
  20. package/dist/core/config.js +25 -5
  21. package/dist/core/config.js.map +1 -1
  22. package/dist/core/doctor.d.ts +3 -0
  23. package/dist/core/doctor.d.ts.map +1 -1
  24. package/dist/core/doctor.js +84 -5
  25. package/dist/core/doctor.js.map +1 -1
  26. package/dist/core/dreamer.d.ts.map +1 -1
  27. package/dist/core/dreamer.js +26 -15
  28. package/dist/core/dreamer.js.map +1 -1
  29. package/dist/core/embedder.d.ts +6 -1
  30. package/dist/core/embedder.d.ts.map +1 -1
  31. package/dist/core/embedder.js +33 -9
  32. package/dist/core/embedder.js.map +1 -1
  33. package/dist/core/llm-validator.d.ts.map +1 -1
  34. package/dist/core/llm-validator.js +6 -0
  35. package/dist/core/llm-validator.js.map +1 -1
  36. package/dist/core/memory-tool.d.ts +37 -0
  37. package/dist/core/memory-tool.d.ts.map +1 -0
  38. package/dist/core/memory-tool.js +371 -0
  39. package/dist/core/memory-tool.js.map +1 -0
  40. package/dist/core/operations.d.ts +11 -5
  41. package/dist/core/operations.d.ts.map +1 -1
  42. package/dist/core/operations.js +91 -34
  43. package/dist/core/operations.js.map +1 -1
  44. package/dist/core/prompt-safety.d.ts.map +1 -1
  45. package/dist/core/prompt-safety.js.map +1 -1
  46. package/dist/core/schema-export.d.ts.map +1 -1
  47. package/dist/core/schema-export.js +19 -34
  48. package/dist/core/schema-export.js.map +1 -1
  49. package/dist/core/types.d.ts +5 -12
  50. package/dist/core/types.d.ts.map +1 -1
  51. package/dist/core/types.js +4 -1
  52. package/dist/core/types.js.map +1 -1
  53. package/dist/core/verifier.d.ts +3 -0
  54. package/dist/core/verifier.d.ts.map +1 -1
  55. package/dist/core/verifier.js +27 -11
  56. package/dist/core/verifier.js.map +1 -1
  57. package/dist/db.d.ts +11 -0
  58. package/dist/db.d.ts.map +1 -1
  59. package/dist/db.js +174 -35
  60. package/dist/db.js.map +1 -1
  61. package/dist/index.d.ts +2 -0
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +1 -0
  64. package/dist/index.js.map +1 -1
  65. package/dist/knowledge-graph.d.ts +1 -2
  66. package/dist/knowledge-graph.d.ts.map +1 -1
  67. package/dist/knowledge-graph.js +94 -44
  68. package/dist/knowledge-graph.js.map +1 -1
  69. package/dist/skills-manifest.json +14 -15
  70. package/dist/storage/conflicts.d.ts +1 -4
  71. package/dist/storage/conflicts.d.ts.map +1 -1
  72. package/dist/storage/conflicts.js +2 -5
  73. package/dist/storage/conflicts.js.map +1 -1
  74. package/dist/storage/fts-index.d.ts +11 -0
  75. package/dist/storage/fts-index.d.ts.map +1 -1
  76. package/dist/storage/fts-index.js +58 -2
  77. package/dist/storage/fts-index.js.map +1 -1
  78. package/dist/transports/cli/cli.d.ts.map +1 -1
  79. package/dist/transports/cli/cli.js +96 -50
  80. package/dist/transports/cli/cli.js.map +1 -1
  81. package/dist/transports/http/retired-routes.d.ts +2 -0
  82. package/dist/transports/http/retired-routes.d.ts.map +1 -0
  83. package/dist/transports/http/retired-routes.js +4 -0
  84. package/dist/transports/http/retired-routes.js.map +1 -0
  85. package/dist/transports/http/server.d.ts.map +1 -1
  86. package/dist/transports/http/server.js +6 -3
  87. package/dist/transports/http/server.js.map +1 -1
  88. package/dist/transports/mcp/handlers.d.ts +4 -25
  89. package/dist/transports/mcp/handlers.d.ts.map +1 -1
  90. package/dist/transports/mcp/handlers.js +8 -28
  91. package/dist/transports/mcp/handlers.js.map +1 -1
  92. package/dist/transports/schemas.d.ts +0 -5
  93. package/dist/transports/schemas.d.ts.map +1 -1
  94. package/dist/transports/schemas.js +0 -5
  95. package/dist/transports/schemas.js.map +1 -1
  96. package/package.json +35 -6
  97. package/scripts/hooks/_generated/fts-index.js +58 -2
  98. package/scripts/hooks/_shared.js +238 -4
  99. package/scripts/hooks/pre-compact.js +14 -3
  100. package/scripts/hooks/pre-edit-recall.js +76 -9
  101. package/skills/memesh/SKILL.md +11 -4
  102. package/skills/memesh-review/SKILL.md +7 -5
  103. package/dist/core/consolidator.d.ts +0 -3
  104. package/dist/core/consolidator.d.ts.map +0 -1
  105. package/dist/core/consolidator.js +0 -108
  106. package/dist/core/consolidator.js.map +0 -1
package/dist/db.js CHANGED
@@ -3,9 +3,10 @@ import * as sqliteVec from 'sqlite-vec';
3
3
  import path from 'path';
4
4
  import fs from 'fs';
5
5
  import { runAutoDecay } from './core/lifecycle.js';
6
- import { getEmbeddingDimension } from './core/config.js';
6
+ import { resolveEmbeddingDimension } from './core/config.js';
7
7
  import { computeSignalScore } from './core/signal-scorer.js';
8
8
  import { getDbPath } from './core/paths.js';
9
+ import { insertFtsRow } from './storage/fts-index.js';
9
10
  let db = null;
10
11
  const SCHEMA_SQL = `
11
12
  CREATE TABLE IF NOT EXISTS entities (
@@ -56,12 +57,31 @@ CREATE INDEX IF NOT EXISTS idx_observations_entity ON observations(entity_id);
56
57
  CREATE INDEX IF NOT EXISTS idx_relations_from ON relations(from_entity_id);
57
58
  CREATE INDEX IF NOT EXISTS idx_relations_to ON relations(to_entity_id);
58
59
  CREATE INDEX IF NOT EXISTS idx_entities_type_created ON entities(type, created_at);
60
+
61
+ -- Migration markers and small bits of persistent state (index segmentation
62
+ -- version, embedding dimension, pending-reindex flags, backfill markers).
63
+ --
64
+ -- This used to be created ad hoc by each helper that needed it — four inline
65
+ -- CREATE TABLE IF NOT EXISTS copies in src/db.ts, none of them visible to
66
+ -- scripts/check-schema-drift.mjs, which only extracts SCHEMA_SQL and FTS_SQL.
67
+ -- A column added to one copy would not have been caught. It also meant the
68
+ -- hook-side schema had no metadata table at all, so hooks could not
69
+ -- participate in migrations even in principle.
70
+ CREATE TABLE IF NOT EXISTS memesh_metadata (
71
+ key TEXT PRIMARY KEY,
72
+ value TEXT NOT NULL
73
+ );
59
74
  `;
60
75
  const FTS_SQL = `
61
76
  CREATE VIRTUAL TABLE IF NOT EXISTS entities_fts USING fts5(
62
77
  name, observations, content='',
63
78
  tokenize='unicode61 remove_diacritics 1'
64
79
  );
80
+
81
+ -- Term -> document-count view over the index above. Stores nothing of its own;
82
+ -- it exists so search() can drop query terms that appear in most of the corpus,
83
+ -- which are the ones BM25 already scores near zero. See dropUbiquitousTerms().
84
+ CREATE VIRTUAL TABLE IF NOT EXISTS fts_vocab USING fts5vocab(entities_fts, 'row');
65
85
  `;
66
86
  export function openDatabase(dbPath) {
67
87
  if (db)
@@ -73,7 +93,21 @@ export function openDatabase(dbPath) {
73
93
  fs.chmodSync(dir, 0o700);
74
94
  }
75
95
  catch { }
76
- db = new Database(resolvedPath);
96
+ const opening = new Database(resolvedPath);
97
+ try {
98
+ initialiseDatabase(opening, resolvedPath);
99
+ }
100
+ catch (err) {
101
+ try {
102
+ opening.close();
103
+ }
104
+ catch { }
105
+ throw err;
106
+ }
107
+ db = opening;
108
+ return db;
109
+ }
110
+ function initialiseDatabase(db, resolvedPath) {
77
111
  db.pragma('journal_mode = WAL');
78
112
  db.pragma('foreign_keys = ON');
79
113
  db.exec(SCHEMA_SQL);
@@ -125,37 +159,154 @@ export function openDatabase(dbPath) {
125
159
  ensureDreamProposalsTable(db);
126
160
  ensureLlmTelemetryTable(db);
127
161
  runAutoTelemetryPrune(db);
162
+ ensureFtsSegmentation(db);
128
163
  sqliteVec.load(db);
129
- const targetDim = getEmbeddingDimension();
130
- ensureVecTable(db, targetDim);
164
+ const { dimension: targetDim, confident: dimensionKnown } = resolveEmbeddingDimension();
165
+ ensureVecTable(db, resolvedPath, targetDim, dimensionKnown);
131
166
  return db;
132
167
  }
133
- function ensureVecTable(db, targetDim) {
134
- db.exec(`
135
- CREATE TABLE IF NOT EXISTS memesh_metadata (
136
- key TEXT PRIMARY KEY,
137
- value TEXT NOT NULL
138
- )
139
- `);
168
+ export const FTS_SEGMENTATION_VERSION = 3;
169
+ const MIGRATION_RETRY_BACKOFF_MS = 24 * 60 * 60 * 1000;
170
+ function isTransientDbError(err) {
171
+ const code = err?.code ?? '';
172
+ const msg = err?.message ?? '';
173
+ return (/SQLITE_BUSY|SQLITE_LOCKED|SQLITE_PROTOCOL/.test(code) ||
174
+ /database is locked|database table is locked|locking protocol/i.test(msg));
175
+ }
176
+ export function runOnceMigration(db, opts) {
177
+ const { key, version, describe, migrate } = opts;
178
+ const attemptKey = `${key}_last_attempt`;
179
+ const readMarker = (k) => db.prepare('SELECT value FROM memesh_metadata WHERE key = ?').get(k)?.value;
180
+ const stored = readMarker(key);
181
+ if (stored && parseInt(stored, 10) >= version)
182
+ return false;
183
+ const lastAttempt = readMarker(attemptKey);
184
+ if (lastAttempt && Date.now() - parseInt(lastAttempt, 10) < MIGRATION_RETRY_BACKOFF_MS) {
185
+ return false;
186
+ }
187
+ try {
188
+ db.transaction(() => {
189
+ const current = readMarker(key);
190
+ if (current && parseInt(current, 10) >= version)
191
+ return;
192
+ migrate(db, current ? parseInt(current, 10) : 0);
193
+ db.prepare('INSERT OR REPLACE INTO memesh_metadata (key, value) VALUES (?, ?)').run(key, String(version));
194
+ db.prepare('DELETE FROM memesh_metadata WHERE key = ?').run(attemptKey);
195
+ }).immediate();
196
+ return true;
197
+ }
198
+ catch (err) {
199
+ if (isTransientDbError(err)) {
200
+ process.stderr.write(`MeMesh: ${describe} deferred (${err instanceof Error ? err.message : String(err)}). ` +
201
+ `Another process holds the database; it will run on the next start.\n`);
202
+ return false;
203
+ }
204
+ try {
205
+ db.prepare('INSERT OR REPLACE INTO memesh_metadata (key, value) VALUES (?, ?)').run(attemptKey, String(Date.now()));
206
+ }
207
+ catch { }
208
+ process.stderr.write(`MeMesh: ${describe} failed (${err instanceof Error ? err.message : String(err)}). ` +
209
+ `Your memories are unaffected — this rebuilds a derived index. ` +
210
+ `It will retry in 24h, or run 'memesh reindex --fts' to retry now.\n`);
211
+ return false;
212
+ }
213
+ }
214
+ function ensureFtsSegmentation(db) {
215
+ runOnceMigration(db, {
216
+ key: 'fts_segmentation_version',
217
+ version: FTS_SEGMENTATION_VERSION,
218
+ describe: 'search index rebuild',
219
+ migrate: rebuildFtsIndex,
220
+ });
221
+ }
222
+ const FTS_REBUILD_PAGE_SIZE = 500;
223
+ function rebuildFtsIndex(db) {
224
+ db.exec("INSERT INTO entities_fts (entities_fts) VALUES('delete-all')");
225
+ const page = db.prepare(`SELECT e.id, e.name, COALESCE(group_concat(o.content, ' '), '') AS obs
226
+ FROM entities e
227
+ LEFT JOIN observations o ON o.entity_id = e.id
228
+ WHERE e.status = 'active' AND e.id > ?
229
+ GROUP BY e.id
230
+ ORDER BY e.id
231
+ LIMIT ?`);
232
+ let afterId = 0;
233
+ for (;;) {
234
+ const rows = page.all(afterId, FTS_REBUILD_PAGE_SIZE);
235
+ if (rows.length === 0)
236
+ break;
237
+ for (const row of rows)
238
+ insertFtsRow(db, row.id, row.name, row.obs);
239
+ afterId = rows[rows.length - 1].id;
240
+ if (rows.length < FTS_REBUILD_PAGE_SIZE)
241
+ break;
242
+ }
243
+ }
244
+ export function reindexFts() {
245
+ const database = getDatabase();
246
+ database.transaction(() => {
247
+ rebuildFtsIndex(database);
248
+ database
249
+ .prepare('INSERT OR REPLACE INTO memesh_metadata (key, value) VALUES (?, ?)')
250
+ .run('fts_segmentation_version', String(FTS_SEGMENTATION_VERSION));
251
+ database.prepare('DELETE FROM memesh_metadata WHERE key = ?').run('fts_segmentation_version_last_attempt');
252
+ }).immediate();
253
+ const { c } = database
254
+ .prepare("SELECT count(*) AS c FROM entities WHERE status = 'active'")
255
+ .get();
256
+ return { entities: c };
257
+ }
258
+ let vectorRebuildConsentFor = null;
259
+ export async function allowVectorIndexRebuild(dbPath, canRefill) {
260
+ if (!(await canRefill()))
261
+ return false;
262
+ vectorRebuildConsentFor = path.resolve(dbPath);
263
+ return true;
264
+ }
265
+ function consumeVectorRebuildConsent(resolvedPath) {
266
+ const granted = vectorRebuildConsentFor;
267
+ vectorRebuildConsentFor = null;
268
+ return granted !== null && granted === path.resolve(resolvedPath);
269
+ }
270
+ function ensureVecTable(db, resolvedPath, targetDim, dimensionKnown = true) {
271
+ const rebuildConsented = consumeVectorRebuildConsent(resolvedPath);
140
272
  const storedDim = db.prepare("SELECT value FROM memesh_metadata WHERE key = 'embedding_dimension'").get();
141
273
  const currentDim = storedDim ? parseInt(storedDim.value, 10) : 0;
142
274
  const vecExists = db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='entities_vec'").get();
143
275
  if (vecExists && currentDim === targetDim) {
144
276
  return;
145
277
  }
146
- if (vecExists && currentDim !== targetDim) {
147
- process.stderr.write(`MeMesh: Embedding dimension changed (${currentDim} → ${targetDim}). Rebuilding vector index.\n` +
148
- `MeMesh: Old embeddings deleted. Run 'memesh reindex' to regenerate vectors for all entities.\n` +
149
- `MeMesh: Without reindex, only newly accessed entities will be embedded.\n`);
150
- db.exec('DROP TABLE entities_vec');
151
- db.prepare("INSERT OR REPLACE INTO memesh_metadata (key, value) VALUES ('pending_reindex', ?)").run(JSON.stringify({ from: currentDim, to: targetDim, droppedAt: new Date().toISOString() }));
278
+ if (vecExists && !dimensionKnown) {
279
+ process.stderr.write(`MeMesh: embedding dimension could not be determined (config unreadable), so the ` +
280
+ `existing ${currentDim}-dim vector index was left untouched rather than rebuilt. ` +
281
+ `Fix ~/.memesh/config.json to change embedders.\n`);
282
+ return;
283
+ }
284
+ if (vecExists &&
285
+ currentDim !== 0 &&
286
+ currentDim !== targetDim &&
287
+ !rebuildConsented) {
288
+ process.stderr.write(`MeMesh: this database records ${currentDim}-dim embeddings but the current ` +
289
+ `configuration asks for ${targetDim}. Keeping the existing vector index rather ` +
290
+ `than rebuilding it, because rebuilding deletes every stored vector. ` +
291
+ `If the configuration is wrong, fix it. If you meant to switch embedders, run ` +
292
+ `'memesh reindex --vectors' to rebuild the index at ${targetDim} and regenerate.\n`);
293
+ return;
152
294
  }
153
- db.exec(`
154
- CREATE VIRTUAL TABLE IF NOT EXISTS entities_vec USING vec0(
155
- embedding float[${targetDim}]
156
- );
157
- `);
158
- db.prepare("INSERT OR REPLACE INTO memesh_metadata (key, value) VALUES ('embedding_dimension', ?)").run(String(targetDim));
295
+ db.transaction(() => {
296
+ if (vecExists) {
297
+ process.stderr.write(`MeMesh: Embedding dimension changed (${currentDim} → ${targetDim}). Rebuilding vector index.\n` +
298
+ `MeMesh: Old embeddings deleted. Run 'memesh reindex' to regenerate vectors for all entities.\n` +
299
+ `MeMesh: Without reindex, only newly accessed entities will be embedded.\n`);
300
+ db.exec('DROP TABLE entities_vec');
301
+ db.prepare("INSERT OR REPLACE INTO memesh_metadata (key, value) VALUES ('pending_reindex', ?)").run(JSON.stringify({ from: currentDim, to: targetDim, droppedAt: new Date().toISOString() }));
302
+ }
303
+ db.exec(`
304
+ CREATE VIRTUAL TABLE IF NOT EXISTS entities_vec USING vec0(
305
+ embedding float[${targetDim}]
306
+ );
307
+ `);
308
+ db.prepare("INSERT OR REPLACE INTO memesh_metadata (key, value) VALUES ('embedding_dimension', ?)").run(String(targetDim));
309
+ }).immediate();
159
310
  }
160
311
  export function getPendingReindexInfo() {
161
312
  if (!db)
@@ -217,12 +368,6 @@ const TELEMETRY_PRUNE_INTERVAL_MS = 24 * 60 * 60 * 1000;
217
368
  const TELEMETRY_PRUNE_DEFAULT_DAYS = 180;
218
369
  const TELEMETRY_PRUNE_MARKER = 'last_telemetry_prune_at';
219
370
  function runAutoTelemetryPrune(db) {
220
- db.exec(`
221
- CREATE TABLE IF NOT EXISTS memesh_metadata (
222
- key TEXT PRIMARY KEY,
223
- value TEXT NOT NULL
224
- )
225
- `);
226
371
  const last = db.prepare('SELECT value FROM memesh_metadata WHERE key = ?').get(TELEMETRY_PRUNE_MARKER);
227
372
  if (last) {
228
373
  const elapsed = Date.now() - new Date(last.value).getTime();
@@ -239,12 +384,6 @@ function runAutoTelemetryPrune(db) {
239
384
  db.prepare('INSERT OR REPLACE INTO memesh_metadata (key, value) VALUES (?, ?)').run(TELEMETRY_PRUNE_MARKER, new Date().toISOString());
240
385
  }
241
386
  function backfillSignalScores(db) {
242
- db.exec(`
243
- CREATE TABLE IF NOT EXISTS memesh_metadata (
244
- key TEXT PRIMARY KEY,
245
- value TEXT NOT NULL
246
- )
247
- `);
248
387
  const MARKER = 'signal_score_backfill_v1';
249
388
  const done = db.prepare("SELECT value FROM memesh_metadata WHERE key = ?").get(MARKER);
250
389
  if (done)
package/dist/db.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,SAAS,MAAM,YAAY,CAAC;AACxC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,IAAI,EAAE,GAA6B,IAAI,CAAC;AAExC,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiDlB,CAAC;AAEF,MAAM,OAAO,GAAG;;;;;CAKf,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,MAAe;IAC1C,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC;IAElB,MAAM,YAAY,GAAG,MAAM,IAAI,SAAS,EAAE,CAAC;IAE3C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACvC,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,IAAI,CAAC;QAAC,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAiB,CAAC;IAE3D,EAAE,GAAG,IAAI,QAAQ,CAAC,YAAY,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC/B,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpB,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAejB,IAAI,CAAC;QAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAiB,CAAC;IACvD,KAAK,MAAM,MAAM,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;QAC1C,IAAI,CAAC;YAAC,EAAE,CAAC,SAAS,CAAC,GAAG,YAAY,GAAG,MAAM,EAAE,EAAE,KAAK,CAAC,CAAC;QAAC,CAAC;QACxD,MAAM,CAAC,CAA+C,CAAC;IACzD,CAAC;IAaD,MAAM,SAAS,GAAG,CAAC,GAAW,EAAQ,EAAE;QACtC,IAAI,CAAC;YACH,EAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACvD,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,GAAG,CAAC;gBAAE,MAAM,CAAC,CAAC;QACnD,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC,GAAG,EAAuB,CAAC;IACrF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;QAC9C,SAAS,CAAC,uEAAuE,CAAC,CAAC;QACnF,EAAE,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;IAChF,CAAC;IAGD,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC,GAAG,EAAuB,CAAC;IACzF,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,EAAE,CAAC;QACxD,SAAS,CAAC,gEAAgE,CAAC,CAAC;QAC5E,SAAS,CAAC,4DAA4D,CAAC,CAAC;QACxE,SAAS,CAAC,6DAA6D,CAAC,CAAC;QACzE,SAAS,CAAC,sDAAsD,CAAC,CAAC;QAClE,SAAS,CAAC,uDAAuD,CAAC,CAAC;IACrE,CAAC;IAGD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,EAAE,CAAC;QACrD,SAAS,CAAC,mEAAmE,CAAC,CAAC;QAC/E,EAAE,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAC;IACtF,CAAC;IAGD,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC,GAAG,EAAuB,CAAC;IACxF,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,EAAE,CAAC;QACtD,SAAS,CAAC,+DAA+D,CAAC,CAAC;QAC3E,SAAS,CAAC,iEAAiE,CAAC,CAAC;IAC/E,CAAC;IAGD,YAAY,CAAC,EAAE,CAAC,CAAC;IAQjB,oBAAoB,CAAC,EAAE,CAAC,CAAC;IAOzB,yBAAyB,CAAC,EAAE,CAAC,CAAC;IAO9B,uBAAuB,CAAC,EAAE,CAAC,CAAC;IAM5B,qBAAqB,CAAC,EAAE,CAAC,CAAC;IAG1B,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAInB,MAAM,SAAS,GAAG,qBAAqB,EAAE,CAAC;IAC1C,cAAc,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;IAE9B,OAAO,EAAE,CAAC;AACZ,CAAC;AAOD,SAAS,cAAc,CAAC,EAAqB,EAAE,SAAiB;IAE9D,EAAE,CAAC,IAAI,CAAC;;;;;GAKP,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAC1B,qEAAqE,CACtE,CAAC,GAAG,EAAmC,CAAC;IAEzC,MAAM,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAGjE,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAC1B,2EAA2E,CAC5E,CAAC,GAAG,EAAE,CAAC;IAER,IAAI,SAAS,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC1C,OAAO;IACT,CAAC;IAGD,IAAI,SAAS,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,wCAAwC,UAAU,MAAM,SAAS,+BAA+B;YAChG,gGAAgG;YAChG,2EAA2E,CAC5E,CAAC;QACF,EAAE,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAGnC,EAAE,CAAC,OAAO,CACR,mFAAmF,CACpF,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;IAClG,CAAC;IAGD,EAAE,CAAC,IAAI,CAAC;;wBAEc,SAAS;;GAE9B,CAAC,CAAC;IAGH,EAAE,CAAC,OAAO,CACR,uFAAuF,CACxF,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,IAAI,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IACrB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CACpB,iEAAiE,CAClE,CAAC,GAAG,EAAmC,CAAC;QACzC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,IAAI,CAAC,EAAE;QAAE,OAAO;IAChB,EAAE,CAAC,OAAO,CAAC,2DAA2D,CAAC,CAAC,GAAG,EAAE,CAAC;AAChF,CAAC;AAsBD,SAAS,yBAAyB,CAAC,EAAqB;IACtD,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;GAgBP,CAAC,CAAC;AACL,CAAC;AAiBD,SAAS,uBAAuB,CAAC,EAAqB;IACpD,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;GAkBP,CAAC,CAAC;AACL,CAAC;AAED,MAAM,2BAA2B,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACxD,MAAM,4BAA4B,GAAG,GAAG,CAAC;AACzC,MAAM,sBAAsB,GAAG,yBAAyB,CAAC;AAczD,SAAS,qBAAqB,CAAC,EAAqB;IAGlD,EAAE,CAAC,IAAI,CAAC;;;;;GAKP,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB,iDAAiD,CAClD,CAAC,GAAG,CAAC,sBAAsB,CAAkC,CAAC;IAE/D,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;QAC5D,IAAI,OAAO,GAAG,2BAA2B;YAAE,OAAO;IACpD,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,IAAI,CACxB,IAAI,CAAC,GAAG,EAAE,GAAG,4BAA4B,GAAG,QAAQ,CACrD,CAAC,WAAW,EAAE,CAAC;IAChB,IAAI,CAAC;QACH,EAAE,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACtE,CAAC;IAAC,MAAM,CAAC;QAEP,OAAO;IACT,CAAC;IAED,EAAE,CAAC,OAAO,CACR,mEAAmE,CACpE,CAAC,GAAG,CAAC,sBAAsB,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;AAC1D,CAAC;AAcD,SAAS,oBAAoB,CAAC,EAAqB;IAGjD,EAAE,CAAC,IAAI,CAAC;;;;;GAKP,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,0BAA0B,CAAC;IAC1C,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB,iDAAiD,CAClD,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACd,IAAI,IAAI;QAAE,OAAO;IAEjB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB,+CAA+C,CAChD,CAAC,GAAG,EAAgF,CAAC;IAEtF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,EAAE,CAAC,OAAO,CACR,mEAAmE,CACpE,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;QACxC,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,sDAAsD,CAAC,CAAC;IACnF,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,0CAA0C,CAAC,CAAC;IACvE,MAAM,UAAU,GAAG,EAAE,CAAC,OAAO,CAAC,+CAA+C,CAAC,CAAC;IAE/E,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;QAC7B,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,QAAiC,CAAC;YACtC,IAAI,CAAC;gBAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC;gBAAC,QAAQ,GAAG,EAAE,CAAC;YAAC,CAAC;YACzF,IAAI,OAAO,QAAQ,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;gBAC9C,OAAO,EAAE,CAAC;gBACV,SAAS;YACX,CAAC;YACD,MAAM,YAAY,GAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAgC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAC7F,MAAM,IAAI,GAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAA4B,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC7E,QAAQ,CAAC,YAAY,GAAG,kBAAkB,CAAC;gBACzC,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,YAAY;gBACZ,IAAI;aACL,CAAC,CAAC;YACH,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YACjD,MAAM,EAAE,CAAC;QACX,CAAC;QACD,EAAE,CAAC,OAAO,CACR,mEAAmE,CACpE,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IACH,EAAE,EAAE,CAAC;AACP,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,IAAI,EAAE,EAAE,CAAC;QACP,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,EAAE,GAAG,IAAI,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAChD,OAAO,EAAE,CAAC;AACZ,CAAC;AAQD,MAAM,UAAU,cAAc;IAC5B,OAAO,EAAE,KAAK,IAAI,CAAC;AACrB,CAAC"}
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,6 @@
1
1
  export { openDatabase, closeDatabase, getDatabase } from './db.js';
2
2
  export { KnowledgeGraph } from './knowledge-graph.js';
3
3
  export type { Entity, Relation, CreateEntityInput, SearchOptions } from './knowledge-graph.js';
4
+ export { handleMemoryCommand, MEMORY_TOOL_DEFINITION, MEMORY_ROOT, } from './core/memory-tool.js';
5
+ export type { MemoryCommand, MemoryToolResult } from './core/memory-tool.js';
4
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAM/F,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,WAAW,GACZ,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
1
  export { openDatabase, closeDatabase, getDatabase } from './db.js';
2
2
  export { KnowledgeGraph } from './knowledge-graph.js';
3
+ export { handleMemoryCommand, MEMORY_TOOL_DEFINITION, MEMORY_ROOT, } from './core/memory-tool.js';
3
4
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAOtD,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,WAAW,GACZ,MAAM,uBAAuB,CAAC"}
@@ -1,7 +1,6 @@
1
1
  import Database from 'better-sqlite3';
2
2
  export type { Entity, Relation, CreateEntityInput, SearchOptions } from './core/types.js';
3
3
  import type { Entity, Relation, CreateEntityInput, SearchOptions } from './core/types.js';
4
- import { type TrackAccessOptions } from './storage/conflicts.js';
5
4
  export declare class KnowledgeGraph {
6
5
  private db;
7
6
  constructor(db: Database.Database);
@@ -23,7 +22,7 @@ export declare class KnowledgeGraph {
23
22
  }): Entity[];
24
23
  getRelations(entityName: string): Relation[];
25
24
  search(query?: string, opts?: SearchOptions): Entity[];
26
- trackAccess(entityIds: number[], opts?: TrackAccessOptions): void;
25
+ trackAccess(entityIds: number[]): void;
27
26
  findConflicts(entityNames: string[]): string[];
28
27
  listRecent(limit?: number, includeArchived?: boolean, namespace?: string): Entity[];
29
28
  listByType(type: string, limit?: number, includeArchived?: boolean, namespace?: string): Entity[];
@@ -1 +1 @@
1
- {"version":3,"file":"knowledge-graph.d.ts","sourceRoot":"","sources":["../src/knowledge-graph.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC1F,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,EAAE,aAAa,EAAa,MAAM,iBAAiB,CAAC;AACrG,OAAO,EAA8B,KAAK,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAI7F,qBAAa,cAAc;IACb,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAEzC,oBAAoB,CAClB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,CAAC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GAChG,IAAI;IAcP,YAAY,CACV,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE;QACL,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;QACxB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACnC,SAAS,CAAC,EAAE,MAAM,CAAC;QAUnB,aAAa,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC;KACzC,GACA,MAAM;IA4HT,mBAAmB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,GAAG,IAAI;IAcxD,cAAc,CACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,GACnB,IAAI;IA0BP,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAsCtC,gBAAgB,CACd,GAAG,EAAE,MAAM,EAAE,EACb,IAAI,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GACrE,MAAM,EAAE;IAyGX,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,EAAE;IAkB5C,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,MAAM,EAAE;IAkHtD,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,kBAAuB,GAAG,IAAI;IAQrE,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAI9C,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE;IA6BnF,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE;IAejG,OAAO,CAAC,eAAe;IAkCvB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAoBnC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE;IAgC1F,iBAAiB,CACf,UAAU,EAAE,MAAM,EAClB,kBAAkB,EAAE,MAAM,GACzB;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,qBAAqB,EAAE,MAAM,CAAA;KAAE;IA6CtD,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE;IA+BhD,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,UAAU;CAcnB"}
1
+ {"version":3,"file":"knowledge-graph.d.ts","sourceRoot":"","sources":["../src/knowledge-graph.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC1F,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,EAAE,aAAa,EAAa,MAAM,iBAAiB,CAAC;AA0PrG,qBAAa,cAAc;IACb,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAEzC,oBAAoB,CAClB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,CAAC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GAChG,IAAI;IAcP,YAAY,CACV,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE;QACL,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;QACxB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACnC,SAAS,CAAC,EAAE,MAAM,CAAC;QAUnB,aAAa,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC;KACzC,GACA,MAAM;IA6HT,mBAAmB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,GAAG,IAAI;IAcxD,cAAc,CACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,GACnB,IAAI;IA0BP,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAsCtC,gBAAgB,CACd,GAAG,EAAE,MAAM,EAAE,EACb,IAAI,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GACrE,MAAM,EAAE;IAyGX,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,EAAE;IAkB5C,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,MAAM,EAAE;IA4JtD,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI;IAQtC,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAI9C,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE;IA6BnF,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE;IAejG,OAAO,CAAC,eAAe;IAiCvB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAoBnC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE;IAgC1F,iBAAiB,CACf,UAAU,EAAE,MAAM,EAClB,kBAAkB,EAAE,MAAM,GACzB;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,qBAAqB,EAAE,MAAM,CAAA;KAAE;IA6CtD,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE;IA+BhD,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,UAAU;CAcnB"}
@@ -1,6 +1,58 @@
1
1
  import { findConflicts, trackAccess } from './storage/conflicts.js';
2
- import { insertFtsRow, removeFromFts } from './storage/fts-index.js';
2
+ import { insertFtsRow, removeFromFts, tokenizeQuery, renderMatchExpression, registerNfcFunction, SQL_NFC_FUNCTION, } from './storage/fts-index.js';
3
3
  import { computeSignalScore } from './core/signal-scorer.js';
4
+ const MAX_QUERY_TERMS = 32;
5
+ function buildMatchExpression(db, query) {
6
+ const terms = tokenizeQuery(query);
7
+ if (terms.length === 0)
8
+ return null;
9
+ return renderMatchExpression(dropUbiquitousTerms(db, terms).slice(0, MAX_QUERY_TERMS));
10
+ }
11
+ function archivedLikeTerms(db, query) {
12
+ const escapeLike = (v) => v.replace(/[\\%_]/g, '\\$&');
13
+ const terms = tokenizeQuery(query);
14
+ const kept = (terms.length > 1 ? dropUbiquitousTerms(db, terms) : terms).slice(0, MAX_QUERY_TERMS);
15
+ if (kept.length === 0)
16
+ return [`%${escapeLike(query)}%`];
17
+ return kept.map((t) => `%${escapeLike(t)}%`);
18
+ }
19
+ const UBIQUITOUS_TERM_FRACTION = 0.5;
20
+ const MIN_ROWS_FOR_DF_GUARD = 25;
21
+ function activeEntityCount(db) {
22
+ return db.prepare("SELECT count(*) AS c FROM entities WHERE status = 'active'").get().c;
23
+ }
24
+ const MAX_DF_LOOKUP_TERMS = 256;
25
+ const LATIN_FOLDABLE = /^[\p{Script=Latin}\p{M}\p{N}]+$/u;
26
+ function fold(term) {
27
+ const lower = term.toLowerCase();
28
+ if (!LATIN_FOLDABLE.test(lower))
29
+ return lower;
30
+ return lower.normalize('NFD').replace(/\p{M}/gu, '');
31
+ }
32
+ function dropUbiquitousTerms(db, terms) {
33
+ if (terms.length < 2)
34
+ return terms;
35
+ try {
36
+ const total = activeEntityCount(db);
37
+ if (total < MIN_ROWS_FOR_DF_GUARD)
38
+ return terms;
39
+ const lowered = terms.slice(0, MAX_DF_LOOKUP_TERMS).map(fold);
40
+ const rows = db
41
+ .prepare(`SELECT term, doc FROM fts_vocab WHERE term IN (${lowered.map(() => '?').join(',')})`)
42
+ .all(...lowered);
43
+ if (rows.length === 0)
44
+ return terms;
45
+ const docFreq = new Map(rows.map((r) => [r.term, r.doc]));
46
+ const ceiling = UBIQUITOUS_TERM_FRACTION * total;
47
+ const kept = terms.filter((t) => (docFreq.get(fold(t)) ?? 0) <= ceiling);
48
+ if (kept.length > 0)
49
+ return kept;
50
+ return [terms.reduce((rarest, t) => (docFreq.get(fold(t)) ?? 0) < (docFreq.get(fold(rarest)) ?? 0) ? t : rarest)];
51
+ }
52
+ catch {
53
+ return terms;
54
+ }
55
+ }
4
56
  export class KnowledgeGraph {
5
57
  db;
6
58
  constructor(db) {
@@ -243,47 +295,39 @@ export class KnowledgeGraph {
243
295
  }
244
296
  return this.listRecent(limit, opts?.includeArchived, opts?.namespace);
245
297
  }
246
- const sanitized = query.replace(/"/g, '""').trim();
247
- const tokens = sanitized.split(/\s+/).filter((t) => t.length > 0);
248
- if (tokens.length === 0)
249
- return this.listRecent(limit, opts?.includeArchived, opts?.namespace);
250
- const ftsQuery = tokens.map((token) => `"${token}"`).join(' ');
298
+ const ftsQuery = buildMatchExpression(this.db, query);
299
+ if (ftsQuery === null) {
300
+ return [];
301
+ }
251
302
  const statusFilter = opts?.includeArchived ? '' : "AND e.status = 'active'";
252
303
  const namespaceFilter = opts?.namespace ? 'AND e.namespace = ?' : '';
304
+ const tagFilter = opts?.tag
305
+ ? 'AND EXISTS (SELECT 1 FROM tags t WHERE t.entity_id = e.id AND t.tag = ?)'
306
+ : '';
307
+ const params = [ftsQuery];
308
+ if (opts?.tag)
309
+ params.push(opts.tag);
310
+ if (opts?.namespace)
311
+ params.push(opts.namespace);
312
+ params.push(limit);
253
313
  let ftsRows;
254
314
  try {
255
- if (opts?.tag) {
256
- const params = [ftsQuery, opts.tag];
257
- if (opts?.namespace)
258
- params.push(opts.namespace);
259
- params.push(limit);
260
- ftsRows = this.db
261
- .prepare(`SELECT DISTINCT e.id, e.name FROM entities_fts f
262
- JOIN entities e ON e.id = f.rowid
263
- JOIN tags t ON t.entity_id = e.id
264
- WHERE entities_fts MATCH ?
265
- AND t.tag = ?
266
- ${statusFilter}
267
- ${namespaceFilter}
268
- ORDER BY e.id DESC
269
- LIMIT ?`)
270
- .all(...params);
271
- }
272
- else {
273
- const params = [ftsQuery];
274
- if (opts?.namespace)
275
- params.push(opts.namespace);
276
- params.push(limit);
277
- ftsRows = this.db
278
- .prepare(`SELECT e.id, e.name FROM entities_fts f
279
- JOIN entities e ON e.id = f.rowid
280
- WHERE entities_fts MATCH ?
281
- ${statusFilter}
282
- ${namespaceFilter}
283
- ORDER BY e.id DESC
284
- LIMIT ?`)
285
- .all(...params);
286
- }
315
+ ftsRows = this.db
316
+ .prepare(`SELECT e.id FROM entities_fts f
317
+ JOIN entities e ON e.id = f.rowid
318
+ WHERE entities_fts MATCH ?
319
+ ${tagFilter}
320
+ ${statusFilter}
321
+ ${namespaceFilter}
322
+ -- e.id breaks BM25 ties. Ties are common — every row matching only
323
+ -- the same single term scores identically — and LIMIT decides which
324
+ -- of them survive to the multi-factor scorer, so without a
325
+ -- tiebreaker the same query over the same corpus can return
326
+ -- different memories run to run. Newest-first among equals is the
327
+ -- same preference the rest of the scorer expresses.
328
+ ORDER BY f.rank, e.id DESC
329
+ LIMIT ?`)
330
+ .all(...params);
287
331
  }
288
332
  catch (err) {
289
333
  if (err instanceof Error && err.message?.includes('fts5'))
@@ -300,7 +344,13 @@ export class KnowledgeGraph {
300
344
  const tagJoin = opts?.tag ? 'JOIN tags t ON t.entity_id = e.id' : '';
301
345
  const tagFilter = opts?.tag ? 'AND t.tag = ?' : '';
302
346
  const archivedNamespaceFilter = opts?.namespace ? 'AND e.namespace = ?' : '';
303
- const archivedParams = [`%${query}%`, `%${query}%`];
347
+ const likeTerms = archivedLikeTerms(this.db, query);
348
+ registerNfcFunction(this.db);
349
+ const termClause = likeTerms
350
+ .map(() => `(${SQL_NFC_FUNCTION}(e.name) LIKE ? ESCAPE '\\' ` +
351
+ `OR ${SQL_NFC_FUNCTION}(o.content) LIKE ? ESCAPE '\\')`)
352
+ .join(' OR ');
353
+ const archivedParams = likeTerms.flatMap((t) => [t, t]);
304
354
  if (opts?.tag)
305
355
  archivedParams.push(opts.tag);
306
356
  if (opts?.namespace)
@@ -311,7 +361,7 @@ export class KnowledgeGraph {
311
361
  LEFT JOIN observations o ON o.entity_id = e.id
312
362
  ${tagJoin}
313
363
  WHERE e.status = 'archived'
314
- AND (e.name LIKE ? OR o.content LIKE ?)
364
+ AND (${termClause})
315
365
  ${tagFilter}
316
366
  ${archivedNamespaceFilter}
317
367
  ORDER BY e.id DESC
@@ -325,11 +375,11 @@ export class KnowledgeGraph {
325
375
  results.push(...archivedEntities);
326
376
  }
327
377
  const entityIds = results.map((e) => e.id);
328
- this.trackAccess(entityIds, { incrementHits: true });
378
+ this.trackAccess(entityIds);
329
379
  return results;
330
380
  }
331
- trackAccess(entityIds, opts = {}) {
332
- trackAccess(this.db, entityIds, opts);
381
+ trackAccess(entityIds) {
382
+ trackAccess(this.db, entityIds);
333
383
  }
334
384
  findConflicts(entityNames) {
335
385
  return findConflicts(this.db, entityNames);
@@ -378,7 +428,7 @@ export class KnowledgeGraph {
378
428
  LIMIT ?`)
379
429
  .all(...params);
380
430
  const results = this.getEntitiesByIds(rows.map((r) => r.id), { includeArchived, namespace });
381
- this.trackAccess(results.map((e) => e.id), { incrementHits: true });
431
+ this.trackAccess(results.map((e) => e.id));
382
432
  return results;
383
433
  }
384
434
  clearEntityData(name) {