context-eng 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 (60) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +272 -0
  3. package/dist/categories.d.ts +27 -0
  4. package/dist/categories.js +71 -0
  5. package/dist/categories.js.map +1 -0
  6. package/dist/cli-entry.d.ts +2 -0
  7. package/dist/cli-entry.js +7 -0
  8. package/dist/cli-entry.js.map +1 -0
  9. package/dist/cli.d.ts +30 -0
  10. package/dist/cli.js +327 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/db.d.ts +40 -0
  13. package/dist/db.js +158 -0
  14. package/dist/db.js.map +1 -0
  15. package/dist/engine.d.ts +149 -0
  16. package/dist/engine.js +589 -0
  17. package/dist/engine.js.map +1 -0
  18. package/dist/harness.d.ts +56 -0
  19. package/dist/harness.js +358 -0
  20. package/dist/harness.js.map +1 -0
  21. package/dist/index.d.ts +4 -0
  22. package/dist/index.js +3 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/inspect-cli.d.ts +2 -0
  25. package/dist/inspect-cli.js +96 -0
  26. package/dist/inspect-cli.js.map +1 -0
  27. package/dist/inspect.d.ts +33 -0
  28. package/dist/inspect.js +149 -0
  29. package/dist/inspect.js.map +1 -0
  30. package/dist/map.d.ts +39 -0
  31. package/dist/map.js +106 -0
  32. package/dist/map.js.map +1 -0
  33. package/dist/mcp.d.ts +5 -0
  34. package/dist/mcp.js +348 -0
  35. package/dist/mcp.js.map +1 -0
  36. package/dist/migrate.d.ts +7 -0
  37. package/dist/migrate.js +107 -0
  38. package/dist/migrate.js.map +1 -0
  39. package/dist/paths.d.ts +29 -0
  40. package/dist/paths.js +69 -0
  41. package/dist/paths.js.map +1 -0
  42. package/dist/search.d.ts +144 -0
  43. package/dist/search.js +449 -0
  44. package/dist/search.js.map +1 -0
  45. package/dist/secrets.d.ts +28 -0
  46. package/dist/secrets.js +135 -0
  47. package/dist/secrets.js.map +1 -0
  48. package/dist/text.d.ts +22 -0
  49. package/dist/text.js +153 -0
  50. package/dist/text.js.map +1 -0
  51. package/dist/tokens.d.ts +6 -0
  52. package/dist/tokens.js +15 -0
  53. package/dist/tokens.js.map +1 -0
  54. package/dist/typesafe.d.ts +40 -0
  55. package/dist/typesafe.js +170 -0
  56. package/dist/typesafe.js.map +1 -0
  57. package/package.json +51 -0
  58. package/system_prompts/AGENTS.md +14 -0
  59. package/system_prompts/CLAUDE.md +14 -0
  60. package/system_prompts/rules.md +157 -0
package/dist/engine.js ADDED
@@ -0,0 +1,589 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { existsSync, statSync } from "node:fs";
3
+ import path from "node:path";
4
+ import { AUTO_PROMOTE, CATEGORIES, MAX_EXHAUSTIVE_SEARCH_ROWS, MAX_EXHAUSTIVE_SEARCH_TOKENS, MAX_READ_TOKENS, MAX_TOKENS, STAGING, NEAR_CATEGORY_SIMILARITY, categoryNameSimilarity, canonicalCategory, displayCategory, isCategory, isScope, } from "./categories.js";
5
+ import { categoryRecord, insertRow, listCategories, nowSeconds, openCatalog, openCategoryDb, registerCategory, replaceLabels, updateRow, } from "./db.js";
6
+ import { buildIndex, writeMapFiles } from "./map.js";
7
+ import { migrateLegacy } from "./migrate.js";
8
+ import { categoryFileName, contextHome, globalLayoutFor, layoutFor, resolveProjectPath, } from "./paths.js";
9
+ import { EngineError, budgetHits, mergeSearchCandidates, normalizeImportance, normalizeSearch, normalizeStoredLabels, normalizeSubject, readAllEligible, readFtsCandidates, searchResult, searchSources, sortHits, } from "./search.js";
10
+ import { correctTypoQuery, hasMultipleSentences, parseLabels, serializeLabels } from "./text.js";
11
+ import { approxTokens } from "./tokens.js";
12
+ export { EngineError, budgetHits, sortHits };
13
+ export class Engine {
14
+ globalLayout;
15
+ projectLayout = null;
16
+ globalCatalog;
17
+ projectCatalog = null;
18
+ categoryDbs = new Map();
19
+ constructor(opts = {}) {
20
+ const home = opts.home ?? contextHome();
21
+ this.globalLayout = globalLayoutFor(home);
22
+ this.globalCatalog = openCatalog(this.globalLayout.globalCatalogDb);
23
+ this.migrateScope("global");
24
+ const bindAtStart = opts.projectPath !== undefined || !opts.deferProject;
25
+ if (bindAtStart) {
26
+ this.projectLayout = layoutFor(resolveProjectPath(opts.projectPath), home);
27
+ this.openProject();
28
+ this.refreshMaps();
29
+ }
30
+ else {
31
+ this.refreshGlobalMap();
32
+ }
33
+ }
34
+ get layout() {
35
+ return this.requireProjectLayout("call memory_bind before reading the project layout");
36
+ }
37
+ get projectPath() {
38
+ return this.projectLayout?.projectPath;
39
+ }
40
+ get globalMapPath() {
41
+ return this.globalLayout.globalMapMd;
42
+ }
43
+ get projectMapPath() {
44
+ return this.requireProjectLayout("project map path requires memory_bind or projectPath").projectMapMd;
45
+ }
46
+ close() {
47
+ for (const db of this.categoryDbs.values())
48
+ db.close();
49
+ this.categoryDbs.clear();
50
+ this.projectCatalog?.close();
51
+ this.globalCatalog.close();
52
+ }
53
+ bind(projectPath) {
54
+ const resolved = resolveProjectPath(projectPath);
55
+ if (!existsSync(resolved) || !statSync(resolved).isDirectory()) {
56
+ throw new EngineError("INVALID_PROJECT_PATH", `project path must be an existing directory: ${resolved}`);
57
+ }
58
+ const next = layoutFor(resolved, this.globalLayout.home);
59
+ if (next.projectKey === this.projectLayout?.projectKey) {
60
+ const created = !existsSync(next.projectCatalogDb);
61
+ if (this.projectCatalog === null)
62
+ this.openProject();
63
+ return this.bindResult(created);
64
+ }
65
+ const created = !existsSync(next.projectCatalogDb);
66
+ this.closeProject();
67
+ this.projectLayout = next;
68
+ this.openProject();
69
+ this.refreshMaps();
70
+ return this.bindResult(created);
71
+ }
72
+ create(input) {
73
+ if (!isScope(input.scope)) {
74
+ throw new EngineError("INVALID_SCOPE", "scope must be one of: global, project");
75
+ }
76
+ const record = this.ensureCategory(input.scope, input.category, input.confirmNewCategory === true);
77
+ const content = normalizeContent(input.content);
78
+ const importance = normalizeImportance(input.importance ?? 0.5);
79
+ const subject = normalizeSubject(input.subject);
80
+ const topics = normalizeStoredLabels("topics", input.topics);
81
+ const tags = normalizeStoredLabels("tags", input.tags);
82
+ const links = normalizeStoredLabels("links", input.links);
83
+ const promoted = AUTO_PROMOTE.has(record.canonical);
84
+ const now = nowSeconds();
85
+ const row = {
86
+ id: randomUUID(),
87
+ project_id: input.scope === "global" ? "global" : this.requireProjectLayout().projectKey,
88
+ chat_id: promoted ? null : STAGING,
89
+ category: record.display_name,
90
+ content,
91
+ subject: subject || null,
92
+ topics: serializeLabels(topics),
93
+ tags: serializeLabels(tags),
94
+ links: serializeLabels(links),
95
+ importance,
96
+ active: 1,
97
+ created_at: now,
98
+ updated_at: now,
99
+ };
100
+ const db = this.dbForRecord(input.scope, record);
101
+ db.transaction(() => {
102
+ insertRow(db, row);
103
+ replaceLabels(db, row.id, { topics, tags, links });
104
+ })();
105
+ this.refreshAvailableMaps();
106
+ return {
107
+ memory: toMemory(row, input.scope),
108
+ promoted,
109
+ ...(this.projectLayout === null ? {} : {
110
+ projectPath: this.projectLayout.projectPath,
111
+ projectKey: this.projectLayout.projectKey,
112
+ }),
113
+ };
114
+ }
115
+ edit(currentCategory, id, patch) {
116
+ const located = this.locate(currentCategory, id);
117
+ const destination = patch.category === undefined
118
+ ? this.recordFor(located.scope, located.canonical)
119
+ : this.ensureCategory(located.scope, patch.category, patch.confirmNewCategory === true);
120
+ if (!destination)
121
+ throw new EngineError("INVALID_CATEGORY", `unknown category: ${currentCategory}`);
122
+ const next = { ...located.row };
123
+ if (patch.content !== undefined)
124
+ next.content = normalizeContent(patch.content);
125
+ if (patch.subject !== undefined)
126
+ next.subject = normalizeSubject(patch.subject ?? undefined) || null;
127
+ if (patch.topics !== undefined)
128
+ next.topics = serializeLabels(normalizeStoredLabels("topics", patch.topics));
129
+ if (patch.tags !== undefined)
130
+ next.tags = serializeLabels(normalizeStoredLabels("tags", patch.tags));
131
+ if (patch.links !== undefined)
132
+ next.links = serializeLabels(normalizeStoredLabels("links", patch.links));
133
+ if (patch.importance !== undefined)
134
+ next.importance = normalizeImportance(patch.importance);
135
+ next.category = destination.display_name;
136
+ next.updated_at = nowSeconds();
137
+ if (destination.canonical !== located.canonical) {
138
+ next.chat_id = AUTO_PROMOTE.has(destination.canonical) ? null : STAGING;
139
+ this.moveRow(located, destination, next);
140
+ }
141
+ else {
142
+ located.db.transaction(() => {
143
+ updateRow(located.db, next);
144
+ replaceLabels(located.db, next.id, labelsFromRow(next));
145
+ })();
146
+ }
147
+ this.refreshAvailableMaps();
148
+ return toMemory(next, located.scope);
149
+ }
150
+ get(category, id) {
151
+ const { scope, row } = this.locate(category, id);
152
+ return toMemory(row, scope);
153
+ }
154
+ promote(category, target) {
155
+ return this.setChatLocated(this.locateSelector(category, target), null);
156
+ }
157
+ demote(category, target) {
158
+ return this.setChatLocated(this.locateSelector(category, target), STAGING);
159
+ }
160
+ delete(category, target) {
161
+ const { db, row } = this.locateSelector(category, target);
162
+ if (row.chat_id !== STAGING) {
163
+ throw new EngineError("NOT_STAGING", `memory ${row.id} is promoted; use memory_demote first`);
164
+ }
165
+ db.prepare(`DELETE FROM memories WHERE id = ?`).run(row.id);
166
+ this.refreshAvailableMaps();
167
+ return { id: row.id, deleted: true };
168
+ }
169
+ /** Candidates for Jev: exhaustive for small notebooks, bounded signals plus fill for large notebooks. */
170
+ prepareSearch(input) {
171
+ return this.runSearch(input, true);
172
+ }
173
+ /** Raw selection data for diagnostics; formatting and relevance decisions stay outside Engine. */
174
+ prepareSearchDebug(input) {
175
+ const resolved = this.resolveSearch(input, true);
176
+ return {
177
+ result: resolved.result,
178
+ eligible: resolved.eligible,
179
+ candidates: resolved.candidates,
180
+ ...(resolved.correctedQuery !== undefined ? { correctedQuery: resolved.correctedQuery } : {}),
181
+ };
182
+ }
183
+ /** Complete local fallback: lexical and exact-label candidates plus final sorting and read budget. */
184
+ search(input) {
185
+ return this.runSearch(input, false);
186
+ }
187
+ runSearch(input, forJev) {
188
+ return this.resolveSearch(input, forJev).result;
189
+ }
190
+ resolveSearch(input, forJev) {
191
+ const normalized = normalizeSearch(input);
192
+ const access = this.searchAccess();
193
+ const sources = searchSources(normalized, access);
194
+ const eligible = readAllEligible(sources, normalized, access);
195
+ const eligibleTokens = eligible.reduce((sum, hit) => sum + hit.tokens, 0);
196
+ const mode = eligible.length <= MAX_EXHAUSTIVE_SEARCH_ROWS &&
197
+ eligibleTokens <= MAX_EXHAUSTIVE_SEARCH_TOKENS ? "small" : "large";
198
+ if (forJev && mode === "small") {
199
+ const result = searchResult(normalized, eligible, eligible.length, false, false, MAX_READ_TOKENS, {
200
+ mode,
201
+ eligible_tokens: eligibleTokens,
202
+ channels: ["all"],
203
+ });
204
+ return {
205
+ result,
206
+ eligible,
207
+ candidates: eligible.map((hit) => ({
208
+ hit,
209
+ channels: ["all"],
210
+ matchedLabels: [],
211
+ categoryHintBoosted: false,
212
+ })),
213
+ };
214
+ }
215
+ let ftsHits = readFtsCandidates(sources, normalized, access);
216
+ let usedTypo = false;
217
+ let correctedQuery;
218
+ if (mode === "large" && ftsHits.length === 0) {
219
+ const vocabulary = eligible.map((hit) => [hit.content, hit.subject, ...hit.topics, ...hit.tags, ...hit.links].filter(Boolean).join(" "));
220
+ const correction = correctTypoQuery(normalized.input.query, vocabulary);
221
+ if (correction !== null) {
222
+ correctedQuery = correction;
223
+ ftsHits = readFtsCandidates(sources, normalized, access, correctedQuery);
224
+ usedTypo = ftsHits.length > 0;
225
+ }
226
+ }
227
+ const selected = mergeSearchCandidates(eligible, ftsHits, normalized, {
228
+ fill: mode === "large",
229
+ usedTypo,
230
+ });
231
+ const result = searchResult(normalized, selected.hits, eligible.length, ftsHits.length > 0, !forJev, MAX_READ_TOKENS, {
232
+ mode,
233
+ eligible_tokens: eligibleTokens,
234
+ channels: selected.channels,
235
+ });
236
+ return {
237
+ result,
238
+ eligible,
239
+ candidates: selected.candidates,
240
+ ...(correctedQuery !== undefined ? { correctedQuery } : {}),
241
+ };
242
+ }
243
+ map(scope) {
244
+ const result = {};
245
+ if (scope === undefined || scope === "global") {
246
+ result.global = buildIndex(this.mapSources("global"), "global");
247
+ }
248
+ if (scope === "project") {
249
+ const layout = this.requireProjectLayout();
250
+ result.project = buildIndex(this.mapSources("project"), "project", {
251
+ projectKey: layout.projectKey,
252
+ projectPath: layout.projectPath,
253
+ });
254
+ }
255
+ else if (scope === undefined && this.projectLayout !== null) {
256
+ result.project = buildIndex(this.mapSources("project"), "project", {
257
+ projectKey: this.projectLayout.projectKey,
258
+ projectPath: this.projectLayout.projectPath,
259
+ });
260
+ }
261
+ return result;
262
+ }
263
+ listCategoryNames(scope) {
264
+ const result = {};
265
+ if (scope === undefined || scope === "global") {
266
+ result.global = listCategories(this.catalogFor("global")).map((record) => record.display_name);
267
+ }
268
+ if (scope === "project") {
269
+ const layout = this.requireProjectLayout();
270
+ result.project = {
271
+ projectPath: layout.projectPath,
272
+ categories: listCategories(this.catalogFor("project")).map((record) => record.display_name),
273
+ };
274
+ }
275
+ else if (scope === undefined && this.projectLayout !== null) {
276
+ result.project = {
277
+ projectPath: this.projectLayout.projectPath,
278
+ categories: listCategories(this.catalogFor("project")).map((record) => record.display_name),
279
+ };
280
+ }
281
+ return result;
282
+ }
283
+ refreshMaps() {
284
+ const layout = this.requireProjectLayout();
285
+ const global = buildIndex(this.mapSources("global"), "global");
286
+ const project = buildIndex(this.mapSources("project"), "project", {
287
+ projectKey: layout.projectKey,
288
+ projectPath: layout.projectPath,
289
+ });
290
+ writeMapFiles(global, this.globalLayout.globalMapMd, this.globalLayout.globalMapJson);
291
+ writeMapFiles(project, layout.projectMapMd, layout.projectMapJson);
292
+ return { global, project };
293
+ }
294
+ listStaging(scope, category) {
295
+ const records = category === undefined
296
+ ? listCategories(this.catalogFor(scope))
297
+ : [this.requireRecord(scope, category)];
298
+ return records.flatMap((record) => {
299
+ const rows = this.dbForRecord(scope, record)
300
+ .prepare(`SELECT * FROM memories WHERE chat_id = ? AND active = 1 ORDER BY created_at DESC`)
301
+ .all(STAGING);
302
+ return rows.map((row) => toMemory(row, scope));
303
+ });
304
+ }
305
+ categoryDatabasePath(scope, category) {
306
+ const record = this.requireRecord(scope, category);
307
+ return path.join(this.categoriesDir(scope), record.db_file);
308
+ }
309
+ searchAccess() {
310
+ return {
311
+ catalogFor: (scope) => this.catalogFor(scope),
312
+ dbForRecord: (scope, record) => this.dbForRecord(scope, record),
313
+ recordFor: (scope, category) => this.recordFor(scope, category),
314
+ toHit: (row, scope) => ({ ...toMemory(row, scope), score: 0 }),
315
+ };
316
+ }
317
+ mapSources(scope) {
318
+ return listCategories(this.catalogFor(scope)).map((record) => ({
319
+ category: record.display_name,
320
+ db: this.dbForRecord(scope, record),
321
+ }));
322
+ }
323
+ refreshGlobalMap() {
324
+ const index = buildIndex(this.mapSources("global"), "global");
325
+ writeMapFiles(index, this.globalLayout.globalMapMd, this.globalLayout.globalMapJson);
326
+ return index;
327
+ }
328
+ refreshAvailableMaps() {
329
+ if (this.projectLayout !== null)
330
+ this.refreshMaps();
331
+ else
332
+ this.refreshGlobalMap();
333
+ }
334
+ openProject() {
335
+ const layout = this.requireProjectLayout();
336
+ this.projectCatalog = openCatalog(layout.projectCatalogDb);
337
+ this.migrateScope("project");
338
+ }
339
+ closeProject() {
340
+ for (const [key, db] of this.categoryDbs) {
341
+ if (key.startsWith("project:")) {
342
+ db.close();
343
+ this.categoryDbs.delete(key);
344
+ }
345
+ }
346
+ this.projectCatalog?.close();
347
+ this.projectCatalog = null;
348
+ this.projectLayout = null;
349
+ }
350
+ catalogFor(scope) {
351
+ if (scope === "global")
352
+ return this.globalCatalog;
353
+ this.requireProjectLayout();
354
+ if (this.projectCatalog === null) {
355
+ throw new EngineError("PROJECT_NOT_BOUND", "call memory_bind before using project memory");
356
+ }
357
+ return this.projectCatalog;
358
+ }
359
+ categoriesDir(scope) {
360
+ return scope === "global" ? this.globalLayout.globalCategoriesDir : this.requireProjectLayout().projectCategoriesDir;
361
+ }
362
+ recordFor(scope, category) {
363
+ if (!isCategory(category))
364
+ return undefined;
365
+ return categoryRecord(this.catalogFor(scope), canonicalCategory(category));
366
+ }
367
+ requireRecord(scope, category) {
368
+ if (!isCategory(category))
369
+ throw new EngineError("INVALID_CATEGORY", "category must be 1 to 64 characters");
370
+ const record = this.recordFor(scope, category);
371
+ if (!record)
372
+ throw new EngineError("INVALID_CATEGORY", `unknown category: ${displayCategory(category)}`);
373
+ return record;
374
+ }
375
+ ensureCategory(scope, category, confirmNewCategory = false) {
376
+ if (!isCategory(category))
377
+ throw new EngineError("INVALID_CATEGORY", "category must be 1 to 64 characters");
378
+ const canonical = canonicalCategory(category);
379
+ const catalog = this.catalogFor(scope);
380
+ const existing = categoryRecord(catalog, canonical);
381
+ if (existing)
382
+ return existing;
383
+ if (!confirmNewCategory) {
384
+ const requested = displayCategory(category);
385
+ const candidates = [
386
+ ...CATEGORIES,
387
+ ...listCategories(catalog).map((record) => record.display_name),
388
+ ].filter((candidate, index, all) => all.indexOf(candidate) === index);
389
+ const near = candidates
390
+ .map((candidate) => ({ candidate, similarity: categoryNameSimilarity(requested, candidate) }))
391
+ .filter(({ candidate, similarity }) => (similarity >= NEAR_CATEGORY_SIMILARITY && canonicalCategory(candidate) !== canonical))
392
+ .sort((left, right) => right.similarity - left.similarity || left.candidate.localeCompare(right.candidate))[0];
393
+ if (near) {
394
+ throw new EngineError("NEAR_CATEGORY", `"${requested}" is too close to existing category "${near.candidate}". Use category "${near.candidate}". No memory was written.`, { requested, existing: near.candidate });
395
+ }
396
+ }
397
+ const record = {
398
+ canonical,
399
+ display_name: displayCategory(category),
400
+ db_file: categoryFileName(canonical),
401
+ created_at: nowSeconds(),
402
+ };
403
+ const db = openCategoryDb(path.join(this.categoriesDir(scope), record.db_file));
404
+ db.close();
405
+ return registerCategory(catalog, record);
406
+ }
407
+ dbForRecord(scope, record) {
408
+ const key = this.dbCacheKey(scope, record.canonical);
409
+ const cached = this.categoryDbs.get(key);
410
+ if (cached)
411
+ return cached;
412
+ const db = openCategoryDb(path.join(this.categoriesDir(scope), record.db_file));
413
+ this.categoryDbs.set(key, db);
414
+ return db;
415
+ }
416
+ dbCacheKey(scope, canonical) {
417
+ return `${scope}:${scope === "project" ? this.requireProjectLayout().projectKey : "global"}:${canonical}`;
418
+ }
419
+ locate(category, id) {
420
+ if (!isCategory(category))
421
+ throw new EngineError("INVALID_CATEGORY", "category must be 1 to 64 characters");
422
+ this.requireProjectLayout("call memory_bind before using id-based memory tools");
423
+ const canonical = canonicalCategory(category);
424
+ let known = false;
425
+ for (const scope of ["project", "global"]) {
426
+ const record = this.recordFor(scope, canonical);
427
+ if (!record)
428
+ continue;
429
+ known = true;
430
+ const db = this.dbForRecord(scope, record);
431
+ const row = db.prepare(`SELECT * FROM memories WHERE id = ?`).get(id);
432
+ if (row)
433
+ return { db, scope, row, canonical };
434
+ }
435
+ if (!known)
436
+ throw new EngineError("INVALID_CATEGORY", `unknown category: ${displayCategory(category)}`);
437
+ throw new EngineError("NOT_FOUND", `memory ${id} not found in category ${displayCategory(category)}`);
438
+ }
439
+ locateSelector(category, target) {
440
+ const selector = typeof target === "string" ? { id: target } : target;
441
+ const id = selector.id?.trim() ?? "";
442
+ const line = selector.line?.trim() ?? "";
443
+ if (id === "" && line === "") {
444
+ throw new EngineError("INVALID_FILTER", "pass id or line");
445
+ }
446
+ const byId = id === "" ? undefined : this.locate(category, id);
447
+ const byLine = line === "" ? [] : this.locateByLine(category, line);
448
+ if (byLine.length > 1) {
449
+ throw new EngineError("AMBIGUOUS_LINE", `line matches ${byLine.length} memories in category ${displayCategory(category)}; pass id`);
450
+ }
451
+ const lineMatch = byLine[0];
452
+ if (byId && lineMatch && byId.row.id !== lineMatch.row.id) {
453
+ throw new EngineError("LINE_ID_MISMATCH", `line does not match id ${byId.row.id}`);
454
+ }
455
+ if (byId && line !== "" && !lineMatch) {
456
+ throw new EngineError("LINE_ID_MISMATCH", `line does not match id ${byId.row.id}`);
457
+ }
458
+ const located = byId ?? lineMatch;
459
+ if (!located)
460
+ throw new EngineError("NOT_FOUND", `memory not found in category ${displayCategory(category)}`);
461
+ return located;
462
+ }
463
+ locateByLine(category, line) {
464
+ this.requireProjectLayout("call memory_bind before using id-based memory tools");
465
+ if (!isCategory(category))
466
+ throw new EngineError("INVALID_CATEGORY", "category must be 1 to 64 characters");
467
+ const canonical = canonicalCategory(category);
468
+ const found = [];
469
+ let known = false;
470
+ for (const scope of ["project", "global"]) {
471
+ const record = this.recordFor(scope, canonical);
472
+ if (!record)
473
+ continue;
474
+ known = true;
475
+ const db = this.dbForRecord(scope, record);
476
+ const rows = db.prepare(`SELECT * FROM memories WHERE content = ?`).all(line);
477
+ for (const row of rows)
478
+ found.push({ db, scope, row, canonical });
479
+ }
480
+ if (!known)
481
+ throw new EngineError("INVALID_CATEGORY", `unknown category: ${displayCategory(category)}`);
482
+ return found;
483
+ }
484
+ setChatLocated(located, chatId) {
485
+ const { db, scope, row } = located;
486
+ const updated = nowSeconds();
487
+ db.prepare(`UPDATE memories SET chat_id = ?, updated_at = ? WHERE id = ?`).run(chatId, updated, row.id);
488
+ this.refreshAvailableMaps();
489
+ return toMemory({ ...row, chat_id: chatId, updated_at: updated }, scope);
490
+ }
491
+ moveRow(located, destination, next) {
492
+ const destinationPath = path.join(this.categoriesDir(located.scope), destination.db_file);
493
+ const destinationDb = this.dbForRecord(located.scope, destination);
494
+ destinationDb.close();
495
+ this.categoryDbs.delete(this.dbCacheKey(located.scope, destination.canonical));
496
+ located.db.prepare(`ATTACH DATABASE ? AS destination`).run(destinationPath);
497
+ try {
498
+ located.db.exec("BEGIN IMMEDIATE");
499
+ located.db
500
+ .prepare(`INSERT INTO destination.memories
501
+ (id, project_id, chat_id, category, content, subject, topics, tags, links,
502
+ importance, active, created_at, updated_at)
503
+ VALUES (@id, @project_id, @chat_id, @category, @content, @subject, @topics, @tags, @links,
504
+ @importance, @active, @created_at, @updated_at)`)
505
+ .run(next);
506
+ const insertLabel = located.db.prepare(`INSERT INTO destination.memory_labels (memory_id, kind, value) VALUES (?, ?, ?)`);
507
+ const labels = labelsFromRow(next);
508
+ for (const value of labels.topics)
509
+ insertLabel.run(next.id, "topic", value);
510
+ for (const value of labels.tags)
511
+ insertLabel.run(next.id, "tag", value);
512
+ for (const value of labels.links)
513
+ insertLabel.run(next.id, "link", value);
514
+ const deleted = located.db.prepare(`DELETE FROM main.memories WHERE id = ?`).run(next.id);
515
+ if (deleted.changes !== 1)
516
+ throw new Error(`source memory ${next.id} disappeared during move`);
517
+ located.db.exec("COMMIT");
518
+ }
519
+ catch (error) {
520
+ if (located.db.inTransaction)
521
+ located.db.exec("ROLLBACK");
522
+ throw error;
523
+ }
524
+ finally {
525
+ located.db.exec("DETACH DATABASE destination");
526
+ }
527
+ }
528
+ migrateScope(scope) {
529
+ const catalog = scope === "global" ? this.globalCatalog : this.projectCatalog;
530
+ if (!catalog)
531
+ throw new EngineError("PROJECT_NOT_BOUND", "call memory_bind before using project memory");
532
+ migrateLegacy({
533
+ catalog,
534
+ categoriesDir: this.categoriesDir(scope),
535
+ legacyFile: scope === "global" ? this.globalLayout.globalDb : this.requireProjectLayout().projectDb,
536
+ });
537
+ }
538
+ bindResult(created) {
539
+ const layout = this.requireProjectLayout();
540
+ return {
541
+ projectPath: layout.projectPath,
542
+ projectKey: layout.projectKey,
543
+ created,
544
+ maps: { global: this.globalLayout.globalMapMd, project: layout.projectMapMd },
545
+ };
546
+ }
547
+ requireProjectLayout(message = "pass projectPath or call memory_bind before using project memory") {
548
+ if (this.projectLayout === null)
549
+ throw new EngineError("PROJECT_NOT_BOUND", message);
550
+ return this.projectLayout;
551
+ }
552
+ }
553
+ function normalizeContent(raw) {
554
+ const content = (raw ?? "").replace(/\s+/g, " ").trim();
555
+ if (content.length === 0)
556
+ throw new EngineError("EMPTY_CONTENT", "content is empty");
557
+ if (hasMultipleSentences(content)) {
558
+ throw new EngineError("NOT_ONE_SENTENCE", "content must be one sentence / one claim");
559
+ }
560
+ const tokens = approxTokens(content);
561
+ if (tokens > MAX_TOKENS) {
562
+ throw new EngineError("TOO_LONG", `content is ~${tokens} tokens; hard cap is ${MAX_TOKENS}`);
563
+ }
564
+ return content;
565
+ }
566
+ function labelsFromRow(row) {
567
+ return { topics: parseLabels(row.topics), tags: parseLabels(row.tags), links: parseLabels(row.links) };
568
+ }
569
+ function toMemory(row, scope) {
570
+ const memory = {
571
+ id: row.id,
572
+ scope,
573
+ category: row.category,
574
+ content: row.content,
575
+ topics: parseLabels(row.topics),
576
+ tags: parseLabels(row.tags),
577
+ links: parseLabels(row.links),
578
+ importance: row.importance,
579
+ staging: row.chat_id === STAGING,
580
+ active: row.active === 1,
581
+ tokens: approxTokens(row.content),
582
+ created_at: row.created_at,
583
+ updated_at: row.updated_at,
584
+ };
585
+ if (row.subject)
586
+ memory.subject = row.subject;
587
+ return memory;
588
+ }
589
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}