@theokit/sdk-memory 0.1.0 → 0.2.1

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 (127) hide show
  1. package/CHANGELOG.md +31 -1
  2. package/dist/index.cjs +309 -209
  3. package/dist/index.cjs.map +1 -1
  4. package/dist/index.d.cts +34 -33
  5. package/dist/index.d.ts +34 -33
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +312 -213
  8. package/dist/index.js.map +1 -1
  9. package/dist/internal/active-memory/active-memory-cache.d.ts.map +1 -0
  10. package/dist/internal/{active-memory-types.d.ts → active-memory/active-memory-types.d.ts} +1 -1
  11. package/dist/internal/active-memory/active-memory-types.d.ts.map +1 -0
  12. package/dist/internal/{active-memory.d.ts → active-memory/active-memory.d.ts} +2 -2
  13. package/dist/internal/active-memory/active-memory.d.ts.map +1 -0
  14. package/dist/internal/active-memory/composite-scorer.d.ts.map +1 -0
  15. package/dist/internal/active-memory/query-analyzer.d.ts.map +1 -0
  16. package/dist/internal/adapter-catalog.d.ts +6 -6
  17. package/dist/internal/categorized-memory.d.ts +56 -0
  18. package/dist/internal/categorized-memory.d.ts.map +1 -0
  19. package/dist/internal/dreaming/dreaming-diary.d.ts.map +1 -0
  20. package/dist/internal/{dreaming-phases.d.ts → dreaming/dreaming-phases.d.ts} +2 -2
  21. package/dist/internal/dreaming/dreaming-phases.d.ts.map +1 -0
  22. package/dist/internal/{dreaming-run.d.ts → dreaming/dreaming-run.d.ts} +1 -1
  23. package/dist/internal/dreaming/dreaming-run.d.ts.map +1 -0
  24. package/dist/internal/embedding/batch-encoder.d.ts.map +1 -0
  25. package/dist/internal/embedding/deepinfra-embedding.d.ts.map +1 -0
  26. package/dist/internal/embedding/embedding-adapter.d.ts.map +1 -0
  27. package/dist/internal/embedding/embedding-cache.d.ts.map +1 -0
  28. package/dist/internal/embedding/mistral-embedding.d.ts.map +1 -0
  29. package/dist/internal/embedding/ollama-embedding.d.ts.map +1 -0
  30. package/dist/internal/embedding/openai-compatible.d.ts.map +1 -0
  31. package/dist/internal/embedding/openai-embedding.d.ts.map +1 -0
  32. package/dist/internal/embedding/openrouter-embedding.d.ts.map +1 -0
  33. package/dist/internal/embedding/voyage-embedding.d.ts.map +1 -0
  34. package/dist/internal/index/index-db.d.ts.map +1 -0
  35. package/dist/internal/{index-manager-contract.d.ts → index/index-manager-contract.d.ts} +1 -1
  36. package/dist/internal/index/index-manager-contract.d.ts.map +1 -0
  37. package/dist/internal/index/index-manager-dispatch.d.ts.map +1 -0
  38. package/dist/internal/{index-manager.d.ts → index/index-manager.d.ts} +1 -1
  39. package/dist/internal/index/index-manager.d.ts.map +1 -0
  40. package/dist/internal/index/index-schema.d.ts.map +1 -0
  41. package/dist/internal/{lance-index.d.ts → index/lance-index.d.ts} +1 -1
  42. package/dist/internal/index/lance-index.d.ts.map +1 -0
  43. package/dist/internal/index/lance-memory-adapter.d.ts.map +1 -0
  44. package/dist/internal/index/memory-index.d.ts.map +1 -0
  45. package/dist/internal/index/migrate-sqlite-to-lance.d.ts.map +1 -0
  46. package/dist/internal/{migration.d.ts → index/migration.d.ts} +1 -1
  47. package/dist/internal/index/migration.d.ts.map +1 -0
  48. package/dist/internal/index/sqlite-vec-loader.d.ts.map +1 -0
  49. package/dist/internal/{vec-index.d.ts → index/vec-index.d.ts} +1 -1
  50. package/dist/internal/index/vec-index.d.ts.map +1 -0
  51. package/dist/internal/memory-types.d.ts +5 -0
  52. package/dist/internal/memory-types.d.ts.map +1 -1
  53. package/dist/internal/store/chunk-markdown.d.ts.map +1 -0
  54. package/dist/internal/{markdown-store.d.ts → store/markdown-store.d.ts} +1 -1
  55. package/dist/internal/store/markdown-store.d.ts.map +1 -0
  56. package/dist/internal/store/reader.d.ts.map +1 -0
  57. package/dist/internal/store/session-loader.d.ts.map +1 -0
  58. package/dist/internal/store/session-summary-writer.d.ts.map +1 -0
  59. package/dist/internal/store/transcript-store.d.ts.map +1 -0
  60. package/dist/internal/store/wiki-loader.d.ts.map +1 -0
  61. package/dist/internal/tools.d.ts +1 -1
  62. package/dist/internal/tools.d.ts.map +1 -1
  63. package/package.json +9 -9
  64. package/dist/internal/active-memory-cache.d.ts.map +0 -1
  65. package/dist/internal/active-memory-types.d.ts.map +0 -1
  66. package/dist/internal/active-memory.d.ts.map +0 -1
  67. package/dist/internal/batch-encoder.d.ts.map +0 -1
  68. package/dist/internal/chunk-markdown.d.ts.map +0 -1
  69. package/dist/internal/composite-scorer.d.ts.map +0 -1
  70. package/dist/internal/deepinfra-embedding.d.ts.map +0 -1
  71. package/dist/internal/dreaming-diary.d.ts.map +0 -1
  72. package/dist/internal/dreaming-phases.d.ts.map +0 -1
  73. package/dist/internal/dreaming-run.d.ts.map +0 -1
  74. package/dist/internal/embedding-adapter.d.ts.map +0 -1
  75. package/dist/internal/embedding-cache.d.ts.map +0 -1
  76. package/dist/internal/index-db.d.ts.map +0 -1
  77. package/dist/internal/index-manager-contract.d.ts.map +0 -1
  78. package/dist/internal/index-manager-dispatch.d.ts.map +0 -1
  79. package/dist/internal/index-manager.d.ts.map +0 -1
  80. package/dist/internal/index-schema.d.ts.map +0 -1
  81. package/dist/internal/lance-index.d.ts.map +0 -1
  82. package/dist/internal/lance-memory-adapter.d.ts.map +0 -1
  83. package/dist/internal/markdown-store.d.ts.map +0 -1
  84. package/dist/internal/memory-index.d.ts.map +0 -1
  85. package/dist/internal/migrate-sqlite-to-lance.d.ts.map +0 -1
  86. package/dist/internal/migration.d.ts.map +0 -1
  87. package/dist/internal/mistral-embedding.d.ts.map +0 -1
  88. package/dist/internal/ollama-embedding.d.ts.map +0 -1
  89. package/dist/internal/openai-compatible.d.ts.map +0 -1
  90. package/dist/internal/openai-embedding.d.ts.map +0 -1
  91. package/dist/internal/openrouter-embedding.d.ts.map +0 -1
  92. package/dist/internal/query-analyzer.d.ts.map +0 -1
  93. package/dist/internal/reader.d.ts.map +0 -1
  94. package/dist/internal/session-loader.d.ts.map +0 -1
  95. package/dist/internal/session-summary-writer.d.ts.map +0 -1
  96. package/dist/internal/sqlite-vec-loader.d.ts.map +0 -1
  97. package/dist/internal/transcript-store.d.ts.map +0 -1
  98. package/dist/internal/vec-index.d.ts.map +0 -1
  99. package/dist/internal/voyage-embedding.d.ts.map +0 -1
  100. package/dist/internal/wiki-loader.d.ts.map +0 -1
  101. /package/dist/internal/{active-memory-cache.d.ts → active-memory/active-memory-cache.d.ts} +0 -0
  102. /package/dist/internal/{composite-scorer.d.ts → active-memory/composite-scorer.d.ts} +0 -0
  103. /package/dist/internal/{query-analyzer.d.ts → active-memory/query-analyzer.d.ts} +0 -0
  104. /package/dist/internal/{dreaming-diary.d.ts → dreaming/dreaming-diary.d.ts} +0 -0
  105. /package/dist/internal/{batch-encoder.d.ts → embedding/batch-encoder.d.ts} +0 -0
  106. /package/dist/internal/{deepinfra-embedding.d.ts → embedding/deepinfra-embedding.d.ts} +0 -0
  107. /package/dist/internal/{embedding-adapter.d.ts → embedding/embedding-adapter.d.ts} +0 -0
  108. /package/dist/internal/{embedding-cache.d.ts → embedding/embedding-cache.d.ts} +0 -0
  109. /package/dist/internal/{mistral-embedding.d.ts → embedding/mistral-embedding.d.ts} +0 -0
  110. /package/dist/internal/{ollama-embedding.d.ts → embedding/ollama-embedding.d.ts} +0 -0
  111. /package/dist/internal/{openai-compatible.d.ts → embedding/openai-compatible.d.ts} +0 -0
  112. /package/dist/internal/{openai-embedding.d.ts → embedding/openai-embedding.d.ts} +0 -0
  113. /package/dist/internal/{openrouter-embedding.d.ts → embedding/openrouter-embedding.d.ts} +0 -0
  114. /package/dist/internal/{voyage-embedding.d.ts → embedding/voyage-embedding.d.ts} +0 -0
  115. /package/dist/internal/{index-db.d.ts → index/index-db.d.ts} +0 -0
  116. /package/dist/internal/{index-manager-dispatch.d.ts → index/index-manager-dispatch.d.ts} +0 -0
  117. /package/dist/internal/{index-schema.d.ts → index/index-schema.d.ts} +0 -0
  118. /package/dist/internal/{lance-memory-adapter.d.ts → index/lance-memory-adapter.d.ts} +0 -0
  119. /package/dist/internal/{memory-index.d.ts → index/memory-index.d.ts} +0 -0
  120. /package/dist/internal/{migrate-sqlite-to-lance.d.ts → index/migrate-sqlite-to-lance.d.ts} +0 -0
  121. /package/dist/internal/{sqlite-vec-loader.d.ts → index/sqlite-vec-loader.d.ts} +0 -0
  122. /package/dist/internal/{chunk-markdown.d.ts → store/chunk-markdown.d.ts} +0 -0
  123. /package/dist/internal/{reader.d.ts → store/reader.d.ts} +0 -0
  124. /package/dist/internal/{session-loader.d.ts → store/session-loader.d.ts} +0 -0
  125. /package/dist/internal/{session-summary-writer.d.ts → store/session-summary-writer.d.ts} +0 -0
  126. /package/dist/internal/{transcript-store.d.ts → store/transcript-store.d.ts} +0 -0
  127. /package/dist/internal/{wiki-loader.d.ts → store/wiki-loader.d.ts} +0 -0
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
- import { mkdir, readFile, readdir, rename, stat, access, unlink } from 'fs/promises';
2
- import { join, resolve, dirname, relative } from 'path';
1
+ import { mkdir, readFile, readdir, stat, access, unlink } from 'fs/promises';
2
+ import { join, resolve, relative } from 'path';
3
3
  import { Security } from '@theokit/sdk';
4
- import { replaceFileAtomic, withCwdMutex, atomicWriteJson, applyWalWithFallback, sanitizeFts5Query } from '@theokit/sdk/internal/persistence';
4
+ import { replaceFileAtomic, withCwdMutex, atomicWriteJson, openSqliteResilient, sanitizeFts5Query } from '@theokit/sdk/internal/persistence';
5
5
  import { sanitizeIdentifier, safePathJoin } from '@theokit/sdk/path-safety';
6
6
  import { createHash } from 'crypto';
7
7
  import { AuthenticationError, RateLimitError, ConfigurationError, NetworkError, UnknownAgentError } from '@theokit/sdk/errors';
@@ -249,7 +249,7 @@ function legacyMemoryJsonPath(cwd, config) {
249
249
  return safePathJoin(cwd, ".theokit", "memory", namespace, `${scope}-${userId}.json`);
250
250
  }
251
251
 
252
- // src/internal/markdown-store.ts
252
+ // src/internal/store/markdown-store.ts
253
253
  var MEMORY_MD_HEADER = "# Memory\n\n> Auto-managed by @theokit/sdk. Edit freely \u2014 the SDK reads from here.\n";
254
254
  var FACTS_HEADING = "## Facts";
255
255
  function memoryDir(cwd) {
@@ -340,7 +340,7 @@ async function appendFact(cwd, config, fact) {
340
340
  await appendFactToMarkdown(cwd, fact);
341
341
  }
342
342
 
343
- // src/internal/transcript-store.ts
343
+ // src/internal/store/transcript-store.ts
344
344
  async function persistActiveMemoryTranscript(cwd, transcript) {
345
345
  try {
346
346
  const dir = join(memoryDir(cwd), "transcripts", "active-memory");
@@ -353,7 +353,7 @@ async function persistActiveMemoryTranscript(cwd, transcript) {
353
353
  }
354
354
  }
355
355
 
356
- // src/internal/active-memory.ts
356
+ // src/internal/active-memory/active-memory.ts
357
357
  var SPAN_MEMORY_RECALL = "memory.recall";
358
358
  var HISTOGRAM_MEMORY_RECALL_DURATION_MS = "theokit_memory_recall_duration_ms";
359
359
  var DEFAULTS = {
@@ -384,7 +384,12 @@ async function runActiveMemory(args) {
384
384
  hits: []
385
385
  });
386
386
  }
387
- const cached = args.cache?.get(args.userText, cfg.queryMode);
387
+ const tenantCtx = {
388
+ namespace: args.namespace,
389
+ userId: args.userId,
390
+ scope: args.scope
391
+ };
392
+ const cached = args.cache?.get(args.userText, cfg.queryMode, tenantCtx);
388
393
  if (cached !== void 0) return endRecallSpan(span, args, cached);
389
394
  const query = buildQuery(args.userText, args.priorMessages, cfg.queryMode, cfg.recentUserTurns);
390
395
  if (query.trim().length === 0) {
@@ -481,7 +486,12 @@ function notifyBreaker(breaker, key, status) {
481
486
  else if (status === "ok" || status === "no-recall") breaker.recordSuccess(key);
482
487
  }
483
488
  async function finalize(args, queryMode, result) {
484
- args.cache?.set(args.userText, queryMode, result);
489
+ const tenantCtx = {
490
+ namespace: args.namespace,
491
+ userId: args.userId,
492
+ scope: args.scope
493
+ };
494
+ args.cache?.set(args.userText, queryMode, result, tenantCtx);
485
495
  if (args.persistTranscripts === true && args.cwd !== void 0) {
486
496
  await persistActiveMemoryTranscript(args.cwd, {
487
497
  runId: args.runId ?? `run-${Date.now()}`,
@@ -702,7 +712,7 @@ function formatMessage(providerId, status, code) {
702
712
  return `${providerId} API error: ${code} (HTTP ${status})`;
703
713
  }
704
714
 
705
- // src/internal/embedding-cache.ts
715
+ // src/internal/embedding/embedding-cache.ts
706
716
  var LruEmbeddingCache = class {
707
717
  constructor(capacity = 5e3) {
708
718
  this.capacity = capacity;
@@ -729,7 +739,7 @@ var LruEmbeddingCache = class {
729
739
  }
730
740
  };
731
741
 
732
- // src/internal/openai-compatible.ts
742
+ // src/internal/embedding/openai-compatible.ts
733
743
  var MAX_BATCH = 100;
734
744
  var MAX_RETRIES = 2;
735
745
  async function createOpenAiCompatibleRuntime(cfg, options) {
@@ -900,7 +910,7 @@ function sleep(ms) {
900
910
  return new Promise((resolve) => setTimeout(resolve, ms));
901
911
  }
902
912
 
903
- // src/internal/deepinfra-embedding.ts
913
+ // src/internal/embedding/deepinfra-embedding.ts
904
914
  var DEFAULT_DEEPINFRA_EMBEDDING_MODEL = "BAAI/bge-large-en-v1.5";
905
915
  var DIMENSION_BY_MODEL = {
906
916
  "BAAI/bge-large-en-v1.5": 1024,
@@ -934,7 +944,7 @@ var deepinfraMemoryEmbeddingProviderAdapter = {
934
944
  )
935
945
  };
936
946
 
937
- // src/internal/mistral-embedding.ts
947
+ // src/internal/embedding/mistral-embedding.ts
938
948
  var DEFAULT_MISTRAL_EMBEDDING_MODEL = "mistral-embed";
939
949
  var DIMENSION_BY_MODEL2 = {
940
950
  "mistral-embed": 1024
@@ -958,7 +968,7 @@ var mistralMemoryEmbeddingProviderAdapter = {
958
968
  )
959
969
  };
960
970
 
961
- // src/internal/ollama-embedding.ts
971
+ // src/internal/embedding/ollama-embedding.ts
962
972
  var DEFAULT_OLLAMA_EMBEDDING_MODEL = "nomic-embed-text";
963
973
  var OLLAMA_LOCAL_SENTINEL_KEY = "ollama-local";
964
974
  var DIMENSION_BY_MODEL3 = {
@@ -1001,7 +1011,7 @@ var ollamaMemoryEmbeddingProviderAdapter = {
1001
1011
  }
1002
1012
  };
1003
1013
 
1004
- // src/internal/openai-embedding.ts
1014
+ // src/internal/embedding/openai-embedding.ts
1005
1015
  var DEFAULT_OPENAI_EMBEDDING_MODEL = "text-embedding-3-small";
1006
1016
  var DIMENSION_BY_MODEL4 = {
1007
1017
  "text-embedding-3-small": 1536,
@@ -1027,7 +1037,7 @@ var openAiMemoryEmbeddingProviderAdapter = {
1027
1037
  )
1028
1038
  };
1029
1039
 
1030
- // src/internal/openrouter-embedding.ts
1040
+ // src/internal/embedding/openrouter-embedding.ts
1031
1041
  var DEFAULT_OPENROUTER_EMBEDDING_MODEL = "openai/text-embedding-3-small";
1032
1042
  var DIMENSION_BY_MODEL5 = {
1033
1043
  "openai/text-embedding-3-small": 1536,
@@ -1054,7 +1064,7 @@ var openRouterMemoryEmbeddingProviderAdapter = {
1054
1064
  )
1055
1065
  };
1056
1066
 
1057
- // src/internal/voyage-embedding.ts
1067
+ // src/internal/embedding/voyage-embedding.ts
1058
1068
  var DEFAULT_VOYAGE_EMBEDDING_MODEL = "voyage-3-lite";
1059
1069
  var DIMENSION_BY_MODEL6 = {
1060
1070
  "voyage-3-lite": 512,
@@ -1091,80 +1101,131 @@ var MEMORY_EMBEDDING_ADAPTERS = {
1091
1101
  deepinfra: deepinfraMemoryEmbeddingProviderAdapter,
1092
1102
  ollama: ollamaMemoryEmbeddingProviderAdapter
1093
1103
  };
1094
- var HEADING_RE = /^(#{1,6})\s+(.+?)\s*$/;
1095
- function chunkMarkdown(text, options = {}) {
1096
- const maxChars = options.maxChars ?? 800;
1097
- if (text.length === 0) return [];
1098
- const lines = text.split("\n");
1099
- const acc = { chunks: [], lines: [], start: 1, heading: void 0 };
1100
- for (let i = 0; i < lines.length; i++) {
1101
- const line = lines[i] ?? "";
1102
- const lineNumber = i + 1;
1103
- processLine(acc, line, lineNumber, maxChars);
1104
+ var FACTS_HEADING2 = "## Facts";
1105
+ function createCategorizedMemory(options) {
1106
+ const { root, categories } = options;
1107
+ validateCategories(categories);
1108
+ const allowed = new Set(categories);
1109
+ function assertKnown(category) {
1110
+ if (!allowed.has(category)) {
1111
+ throw new ConfigurationError(
1112
+ `createCategorizedMemory: unknown category ${JSON.stringify(category)} (declared: ${categories.join(", ")})`,
1113
+ { code: "unknown_category" }
1114
+ );
1115
+ }
1104
1116
  }
1105
- flushAccumulator(acc, lines.length, maxChars);
1106
- return acc.chunks;
1107
- }
1108
- function processLine(acc, line, lineNumber, maxChars) {
1109
- const headingMatch = HEADING_RE.exec(line);
1110
- const isBlank = line.trim().length === 0;
1111
- if (headingMatch !== null && acc.lines.length > 0) {
1112
- flushAccumulator(acc, lineNumber - 1, maxChars);
1117
+ function categoryPath(category) {
1118
+ return safePathJoin(root, `${sanitizeIdentifier(category)}.md`);
1119
+ }
1120
+ async function add(category, text) {
1121
+ assertKnown(category);
1122
+ const encoded = encodeFact(redactSecrets(text));
1123
+ const sane = sanitizeIdentifier(category);
1124
+ await withCwdMutex(`catmem:${root}:${sane}`, async () => {
1125
+ const path = safePathJoin(root, `${sane}.md`);
1126
+ const raw = await readFileOrEmpty(path) || header(category);
1127
+ await mkdir(root, { recursive: true });
1128
+ await replaceFileAtomic(path, appendBullet(raw, encoded));
1129
+ });
1113
1130
  }
1114
- if (headingMatch !== null) acc.heading = headingMatch[2];
1115
- acc.lines.push(line);
1116
- if (isBlank && acc.lines.length > 1) {
1117
- const joined = acc.lines.join("\n");
1118
- if (joined.trim().length > 0) flushAccumulator(acc, lineNumber, maxChars);
1131
+ async function list(category) {
1132
+ if (category !== void 0) {
1133
+ assertKnown(category);
1134
+ return readCategory(categoryPath(category), category);
1135
+ }
1136
+ const out = [];
1137
+ for (const c of categories) {
1138
+ out.push(...await readCategory(categoryPath(c), c));
1139
+ }
1140
+ return out;
1119
1141
  }
1142
+ return { categories: [...categories], add, list };
1120
1143
  }
1121
- function flushAccumulator(acc, endLineExclusive, maxChars) {
1122
- if (acc.lines.length === 0) return;
1123
- const chunkText = acc.lines.join("\n");
1124
- if (chunkText.trim().length === 0) {
1125
- acc.lines = [];
1126
- acc.start = endLineExclusive + 1;
1127
- return;
1144
+ function validateCategories(categories) {
1145
+ if (categories.length === 0) {
1146
+ throw new ConfigurationError("createCategorizedMemory: categories must be non-empty", {
1147
+ code: "invalid_categories"
1148
+ });
1128
1149
  }
1129
- if (chunkText.length > maxChars) {
1130
- pushOversizedSlices(acc.chunks, chunkText, acc.start, acc.heading, maxChars);
1131
- } else {
1132
- acc.chunks.push(buildChunk(chunkText, acc.start, endLineExclusive, acc.heading));
1150
+ if (new Set(categories).size !== categories.length) {
1151
+ throw new ConfigurationError("createCategorizedMemory: categories must be unique", {
1152
+ code: "invalid_categories"
1153
+ });
1154
+ }
1155
+ const sanitized = categories.map((c) => trySanitize(c));
1156
+ if (new Set(sanitized).size !== categories.length) {
1157
+ throw new ConfigurationError(
1158
+ "createCategorizedMemory: categories must map to distinct filenames after sanitization",
1159
+ { code: "invalid_categories" }
1160
+ );
1133
1161
  }
1134
- acc.lines = [];
1135
- acc.start = endLineExclusive + 1;
1136
- }
1137
- function buildChunk(text, startLine, endLine, heading) {
1138
- return {
1139
- startLine,
1140
- endLine,
1141
- text,
1142
- hash: createHash("sha256").update(text).digest("hex"),
1143
- ...heading !== void 0 ? { heading } : {}
1144
- };
1145
1162
  }
1146
- function pushOversizedSlices(chunks, text, startLine, heading, maxChars) {
1147
- let remaining = text;
1148
- let lineCursor = startLine;
1149
- while (remaining.length > maxChars) {
1150
- const splitAt = findWordBoundarySplit(remaining, maxChars);
1151
- const slice = remaining.slice(0, splitAt);
1152
- const sliceLines = slice.split("\n").length;
1153
- chunks.push(buildChunk(slice, lineCursor, lineCursor + sliceLines - 1, heading));
1154
- remaining = remaining.slice(splitAt).replace(/^\s+/, "");
1155
- lineCursor += sliceLines - 1;
1163
+ function trySanitize(category) {
1164
+ try {
1165
+ return sanitizeIdentifier(category);
1166
+ } catch (cause) {
1167
+ throw new ConfigurationError(
1168
+ `createCategorizedMemory: category ${JSON.stringify(category)} is not a valid identifier`,
1169
+ { code: "invalid_categories", cause }
1170
+ );
1156
1171
  }
1157
- if (remaining.length > 0) {
1158
- const sliceLines = remaining.split("\n").length;
1159
- chunks.push(buildChunk(remaining, lineCursor, lineCursor + sliceLines - 1, heading));
1172
+ }
1173
+ function header(category) {
1174
+ return `---
1175
+ category: ${category}
1176
+ ---
1177
+
1178
+ ${FACTS_HEADING2}
1179
+ `;
1180
+ }
1181
+ async function readFileOrEmpty(path) {
1182
+ try {
1183
+ return await readFile(path, "utf8");
1184
+ } catch {
1185
+ return "";
1160
1186
  }
1161
1187
  }
1162
- function findWordBoundarySplit(text, maxChars) {
1163
- if (text.length <= maxChars) return text.length;
1164
- for (let i = maxChars; i > Math.max(0, maxChars - 200); i--) {
1165
- if (/\s/.test(text[i] ?? "x")) return i;
1188
+ async function readCategory(path, category) {
1189
+ const raw = await readFileOrEmpty(path);
1190
+ return parseFactBullets(raw).map((text) => ({ text: decodeFact(text), category }));
1191
+ }
1192
+ function encodeFact(text) {
1193
+ return text.replace(/\\/g, "\\\\").replace(/\r/g, "\\r").replace(/\n/g, "\\n");
1194
+ }
1195
+ function decodeFact(text) {
1196
+ return text.replace(
1197
+ /\\(.)/g,
1198
+ (_match, char) => char === "n" ? "\n" : char === "r" ? "\r" : char
1199
+ );
1200
+ }
1201
+ function parseFactBullets(raw) {
1202
+ const idx = raw.indexOf(FACTS_HEADING2);
1203
+ if (idx === -1) return [];
1204
+ const tail = raw.slice(idx + FACTS_HEADING2.length);
1205
+ const nextHeading = tail.search(/\n#{1,2}\s/);
1206
+ const block = nextHeading === -1 ? tail : tail.slice(0, nextHeading);
1207
+ return block.split("\n").map((line) => line.trim()).filter((line) => line.startsWith("- ")).map((line) => line.slice(2).trim());
1208
+ }
1209
+ function appendBullet(raw, text) {
1210
+ const bullet = `- ${text}`;
1211
+ const idx = raw.indexOf(FACTS_HEADING2);
1212
+ if (idx === -1) {
1213
+ const sep = raw.endsWith("\n") ? "" : "\n";
1214
+ return `${raw}${sep}${FACTS_HEADING2}
1215
+
1216
+ ${bullet}
1217
+ `;
1166
1218
  }
1167
- return maxChars;
1219
+ const after = idx + FACTS_HEADING2.length;
1220
+ const nextHeading = raw.slice(after).search(/\n#{1,2}\s/);
1221
+ if (nextHeading === -1) {
1222
+ const trailing = raw.endsWith("\n") ? "" : "\n";
1223
+ return `${raw}${trailing}${bullet}
1224
+ `;
1225
+ }
1226
+ const insertAt = after + nextHeading;
1227
+ return `${raw.slice(0, insertAt)}
1228
+ ${bullet}${raw.slice(insertAt)}`;
1168
1229
  }
1169
1230
  function diaryPath(cwd) {
1170
1231
  return join(memoryDir(cwd), "dream-diary.md");
@@ -1208,7 +1269,7 @@ function entryHash(entry) {
1208
1269
  ).digest("hex");
1209
1270
  }
1210
1271
 
1211
- // src/internal/dreaming-phases.ts
1272
+ // src/internal/dreaming/dreaming-phases.ts
1212
1273
  var DEFAULT_DEDUP_THRESHOLD = 0.95;
1213
1274
  var DEFAULT_CLUSTER_THRESHOLD = 0.75;
1214
1275
  async function lightPhase(facts, embedding, threshold = DEFAULT_DEDUP_THRESHOLD) {
@@ -1366,7 +1427,7 @@ function emptyResult(status) {
1366
1427
  };
1367
1428
  }
1368
1429
 
1369
- // src/internal/index-schema.ts
1430
+ // src/internal/index/index-schema.ts
1370
1431
  var SCHEMA_STATEMENTS = [
1371
1432
  `CREATE TABLE IF NOT EXISTS files (
1372
1433
  id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -1412,57 +1473,180 @@ var PRAGMA_STATEMENTS = [
1412
1473
  "PRAGMA foreign_keys=ON"
1413
1474
  ];
1414
1475
 
1415
- // src/internal/index-db.ts
1476
+ // src/internal/index/index-db.ts
1416
1477
  async function openMemoryDb(opts) {
1417
- await mkdir(dirname(opts.filePath), { recursive: true });
1418
- try {
1419
- return await openConcrete(opts.filePath);
1420
- } catch (cause) {
1421
- if (opts.recoverCorrupt !== false && isCorruptionError(cause)) {
1422
- await renameAside(opts.filePath);
1423
- return await openConcrete(opts.filePath);
1478
+ return openSqliteResilient({
1479
+ filePath: opts.filePath,
1480
+ label: "memory-index",
1481
+ recoverCorrupt: opts.recoverCorrupt,
1482
+ onOpen: (db) => {
1483
+ for (const pragma of PRAGMA_STATEMENTS) db.exec(pragma);
1484
+ for (const stmt of SCHEMA_STATEMENTS) db.exec(stmt);
1424
1485
  }
1425
- throw cause;
1486
+ });
1487
+ }
1488
+ function defaultIndexPath(cwd) {
1489
+ return join(cwd, ".theokit", "memory", ".index", "memory.sqlite");
1490
+ }
1491
+ var HEADING_RE = /^(#{1,6})\s+(.+?)\s*$/;
1492
+ function chunkMarkdown(text, options = {}) {
1493
+ const maxChars = options.maxChars ?? 800;
1494
+ if (text.length === 0) return [];
1495
+ const lines = text.split("\n");
1496
+ const acc = { chunks: [], lines: [], start: 1, heading: void 0 };
1497
+ for (let i = 0; i < lines.length; i++) {
1498
+ const line = lines[i] ?? "";
1499
+ const lineNumber = i + 1;
1500
+ processLine(acc, line, lineNumber, maxChars);
1501
+ }
1502
+ flushAccumulator(acc, lines.length, maxChars);
1503
+ return acc.chunks;
1504
+ }
1505
+ function processLine(acc, line, lineNumber, maxChars) {
1506
+ const headingMatch = HEADING_RE.exec(line);
1507
+ const isBlank = line.trim().length === 0;
1508
+ if (headingMatch !== null && acc.lines.length > 0) {
1509
+ flushAccumulator(acc, lineNumber - 1, maxChars);
1510
+ }
1511
+ if (headingMatch !== null) acc.heading = headingMatch[2];
1512
+ acc.lines.push(line);
1513
+ if (isBlank && acc.lines.length > 1) {
1514
+ const joined = acc.lines.join("\n");
1515
+ if (joined.trim().length > 0) flushAccumulator(acc, lineNumber, maxChars);
1426
1516
  }
1427
1517
  }
1428
- async function openConcrete(filePath) {
1429
- const db = await loadDriver(filePath);
1430
- applyWalWithFallback(db, "memory-index");
1431
- for (const pragma of PRAGMA_STATEMENTS) db.exec(pragma);
1432
- for (const stmt of SCHEMA_STATEMENTS) db.exec(stmt);
1433
- return db;
1518
+ function flushAccumulator(acc, endLineExclusive, maxChars) {
1519
+ if (acc.lines.length === 0) return;
1520
+ const chunkText = acc.lines.join("\n");
1521
+ if (chunkText.trim().length === 0) {
1522
+ acc.lines = [];
1523
+ acc.start = endLineExclusive + 1;
1524
+ return;
1525
+ }
1526
+ if (chunkText.length > maxChars) {
1527
+ pushOversizedSlices(acc.chunks, chunkText, acc.start, acc.heading, maxChars);
1528
+ } else {
1529
+ acc.chunks.push(buildChunk(chunkText, acc.start, endLineExclusive, acc.heading));
1530
+ }
1531
+ acc.lines = [];
1532
+ acc.start = endLineExclusive + 1;
1434
1533
  }
1435
- async function loadDriver(filePath) {
1534
+ function buildChunk(text, startLine, endLine, heading) {
1535
+ return {
1536
+ startLine,
1537
+ endLine,
1538
+ text,
1539
+ hash: createHash("sha256").update(text).digest("hex"),
1540
+ ...heading !== void 0 ? { heading } : {}
1541
+ };
1542
+ }
1543
+ function pushOversizedSlices(chunks, text, startLine, heading, maxChars) {
1544
+ let remaining = text;
1545
+ let lineCursor = startLine;
1546
+ while (remaining.length > maxChars) {
1547
+ const splitAt = findWordBoundarySplit(remaining, maxChars);
1548
+ const slice = remaining.slice(0, splitAt);
1549
+ const sliceLines = slice.split("\n").length;
1550
+ chunks.push(buildChunk(slice, lineCursor, lineCursor + sliceLines - 1, heading));
1551
+ remaining = remaining.slice(splitAt).replace(/^\s+/, "");
1552
+ lineCursor += sliceLines - 1;
1553
+ }
1554
+ if (remaining.length > 0) {
1555
+ const sliceLines = remaining.split("\n").length;
1556
+ chunks.push(buildChunk(remaining, lineCursor, lineCursor + sliceLines - 1, heading));
1557
+ }
1558
+ }
1559
+ function findWordBoundarySplit(text, maxChars) {
1560
+ if (text.length <= maxChars) return text.length;
1561
+ for (let i = maxChars; i > Math.max(0, maxChars - 200); i--) {
1562
+ if (/\s/.test(text[i] ?? "x")) return i;
1563
+ }
1564
+ return maxChars;
1565
+ }
1566
+ var MAX_TURN_CHARS = 2e3;
1567
+ function sessionsDir(cwd) {
1568
+ return join(memoryDir(cwd), "sessions");
1569
+ }
1570
+ function sessionSummaryPath(cwd, runId) {
1571
+ return join(sessionsDir(cwd), `${sanitizeRunId2(runId)}.md`);
1572
+ }
1573
+ function sanitizeRunId2(runId) {
1574
+ return runId.replace(/[^a-zA-Z0-9_-]/g, "_").slice(0, 128);
1575
+ }
1576
+ function truncate2(text) {
1577
+ if (text.length <= MAX_TURN_CHARS) return text;
1578
+ return `${text.slice(0, MAX_TURN_CHARS)}\u2026`;
1579
+ }
1580
+ async function writeSessionSummary(input) {
1581
+ if (input.status !== "finished") return;
1582
+ const path = sessionSummaryPath(input.cwd, input.runId);
1583
+ await mkdir(sessionsDir(input.cwd), { recursive: true });
1584
+ const safeUser = redactSecrets(truncate2(input.userText));
1585
+ const safeAssistant = redactSecrets(truncate2(input.assistantText));
1586
+ const iso = new Date(input.at).toISOString();
1587
+ const body = [
1588
+ "---",
1589
+ `runId: ${input.runId}`,
1590
+ `agentId: ${input.agentId}`,
1591
+ `at: ${iso}`,
1592
+ `status: ${input.status}`,
1593
+ "---",
1594
+ "",
1595
+ "## User",
1596
+ "",
1597
+ safeUser,
1598
+ "",
1599
+ "## Assistant",
1600
+ "",
1601
+ safeAssistant,
1602
+ ""
1603
+ ].join("\n");
1604
+ await replaceFileAtomic(path, body);
1605
+ }
1606
+
1607
+ // src/internal/store/session-loader.ts
1608
+ async function discoverSessionFiles(cwd) {
1609
+ let entries;
1436
1610
  try {
1437
- const mod = await import('better-sqlite3');
1438
- const Ctor = mod.default ?? mod;
1439
- const db = new Ctor(filePath);
1440
- return db;
1441
- } catch (cause) {
1442
- const message = cause instanceof Error ? cause.message : String(cause);
1443
- throw new ConfigurationError(
1444
- `Failed to load SQLite driver. Install \`better-sqlite3\` or run on Node 22.5+ for built-in \`node:sqlite\`. Cause: ${message}`,
1445
- { code: "sqlite_driver_unavailable", cause }
1446
- );
1611
+ entries = await readdir(sessionsDir(cwd));
1612
+ } catch {
1613
+ return [];
1447
1614
  }
1615
+ const root = memoryDir(cwd);
1616
+ return entries.filter((entry) => entry.endsWith(".md")).map((entry) => {
1617
+ const absolutePath = join(sessionsDir(cwd), entry);
1618
+ return {
1619
+ absolutePath,
1620
+ relPath: relativeToRoot(root, absolutePath)
1621
+ };
1622
+ });
1448
1623
  }
1449
- function isCorruptionError(cause) {
1450
- if (!(cause instanceof Error)) return false;
1451
- const msg = cause.message.toLowerCase();
1452
- return msg.includes("malformed") || msg.includes("not a database") || msg.includes("encrypted") || msg.includes("disk image is malformed");
1624
+ function relativeToRoot(root, absolutePath) {
1625
+ if (absolutePath.startsWith(`${root}/`)) return absolutePath.slice(root.length + 1);
1626
+ return absolutePath;
1453
1627
  }
1454
- async function renameAside(filePath) {
1455
- const asidePath = `${filePath}.corrupt-${Date.now()}`;
1456
- await rename(filePath, asidePath).catch(() => void 0);
1457
- await rename(`${filePath}-wal`, `${asidePath}-wal`).catch(() => void 0);
1458
- await rename(`${filePath}-shm`, `${asidePath}-shm`).catch(() => void 0);
1459
- process.stderr.write(
1460
- `[theokit-sdk] memory index corrupt; renamed aside to ${asidePath} and rebuilt schema
1461
- `
1462
- );
1628
+ function wikiDir(cwd) {
1629
+ return join(memoryDir(cwd), "wiki");
1463
1630
  }
1464
- function defaultIndexPath(cwd) {
1465
- return join(cwd, ".theokit", "memory", ".index", "memory.sqlite");
1631
+ async function discoverWikiFiles(cwd) {
1632
+ let entries;
1633
+ try {
1634
+ entries = await readdir(wikiDir(cwd));
1635
+ } catch {
1636
+ return [];
1637
+ }
1638
+ const root = memoryDir(cwd);
1639
+ return entries.filter((entry) => entry.endsWith(".md")).map((entry) => ({
1640
+ absolutePath: join(wikiDir(cwd), entry),
1641
+ relPath: join("wiki", entry)
1642
+ })).map((file) => ({
1643
+ absolutePath: file.absolutePath,
1644
+ relPath: relativeToRoot2(root, file.absolutePath)
1645
+ }));
1646
+ }
1647
+ function relativeToRoot2(root, absolutePath) {
1648
+ if (absolutePath.startsWith(`${root}/`)) return absolutePath.slice(root.length + 1);
1649
+ return absolutePath;
1466
1650
  }
1467
1651
  function requireLance() {
1468
1652
  try {
@@ -1592,7 +1776,7 @@ function lanceStoragePath(cwd) {
1592
1776
  return join(cwd, ".theokit", "memory", "lance");
1593
1777
  }
1594
1778
 
1595
- // src/internal/memory-index.ts
1779
+ // src/internal/index/memory-index.ts
1596
1780
  function parseSearchOptions(options = {}) {
1597
1781
  return {
1598
1782
  maxResults: Math.max(1, options.maxResults ?? 10),
@@ -1600,7 +1784,7 @@ function parseSearchOptions(options = {}) {
1600
1784
  };
1601
1785
  }
1602
1786
 
1603
- // src/internal/lance-memory-adapter.ts
1787
+ // src/internal/index/lance-memory-adapter.ts
1604
1788
  var DEFAULT_NAMESPACE = "default";
1605
1789
  var EMPTY_SYNC_RESULT = Object.freeze({
1606
1790
  filesScanned: 0,
@@ -1665,7 +1849,7 @@ function translateLanceHit(hit) {
1665
1849
  };
1666
1850
  }
1667
1851
 
1668
- // src/internal/index-manager-dispatch.ts
1852
+ // src/internal/index/index-manager-dispatch.ts
1669
1853
  var VALID_BACKENDS = ["sqlite-vec", "lance"];
1670
1854
  function assertValidBackend(backend) {
1671
1855
  if (!VALID_BACKENDS.includes(backend)) {
@@ -1689,68 +1873,6 @@ async function openLanceIndex(opts) {
1689
1873
  });
1690
1874
  return new LanceMemoryAdapter(lance);
1691
1875
  }
1692
- var MAX_TURN_CHARS = 2e3;
1693
- function sessionsDir(cwd) {
1694
- return join(memoryDir(cwd), "sessions");
1695
- }
1696
- function sessionSummaryPath(cwd, runId) {
1697
- return join(sessionsDir(cwd), `${sanitizeRunId2(runId)}.md`);
1698
- }
1699
- function sanitizeRunId2(runId) {
1700
- return runId.replace(/[^a-zA-Z0-9_-]/g, "_").slice(0, 128);
1701
- }
1702
- function truncate2(text) {
1703
- if (text.length <= MAX_TURN_CHARS) return text;
1704
- return `${text.slice(0, MAX_TURN_CHARS)}\u2026`;
1705
- }
1706
- async function writeSessionSummary(input) {
1707
- if (input.status !== "finished") return;
1708
- const path = sessionSummaryPath(input.cwd, input.runId);
1709
- await mkdir(sessionsDir(input.cwd), { recursive: true });
1710
- const safeUser = redactSecrets(truncate2(input.userText));
1711
- const safeAssistant = redactSecrets(truncate2(input.assistantText));
1712
- const iso = new Date(input.at).toISOString();
1713
- const body = [
1714
- "---",
1715
- `runId: ${input.runId}`,
1716
- `agentId: ${input.agentId}`,
1717
- `at: ${iso}`,
1718
- `status: ${input.status}`,
1719
- "---",
1720
- "",
1721
- "## User",
1722
- "",
1723
- safeUser,
1724
- "",
1725
- "## Assistant",
1726
- "",
1727
- safeAssistant,
1728
- ""
1729
- ].join("\n");
1730
- await replaceFileAtomic(path, body);
1731
- }
1732
-
1733
- // src/internal/session-loader.ts
1734
- async function discoverSessionFiles(cwd) {
1735
- let entries;
1736
- try {
1737
- entries = await readdir(sessionsDir(cwd));
1738
- } catch {
1739
- return [];
1740
- }
1741
- const root = memoryDir(cwd);
1742
- return entries.filter((entry) => entry.endsWith(".md")).map((entry) => {
1743
- const absolutePath = join(sessionsDir(cwd), entry);
1744
- return {
1745
- absolutePath,
1746
- relPath: relativeToRoot(root, absolutePath)
1747
- };
1748
- });
1749
- }
1750
- function relativeToRoot(root, absolutePath) {
1751
- if (absolutePath.startsWith(`${root}/`)) return absolutePath.slice(root.length + 1);
1752
- return absolutePath;
1753
- }
1754
1876
  async function loadSqliteVecExtension(db) {
1755
1877
  try {
1756
1878
  const mod = await import('sqlite-vec');
@@ -1776,7 +1898,7 @@ function isSqliteVecLoaded(db) {
1776
1898
  }
1777
1899
  }
1778
1900
 
1779
- // src/internal/vec-index.ts
1901
+ // src/internal/index/vec-index.ts
1780
1902
  var META_KEY_PROVIDER_ID = "embedding.providerId";
1781
1903
  var META_KEY_MODEL = "embedding.model";
1782
1904
  var META_KEY_DIMENSION = "embedding.dimension";
@@ -1849,31 +1971,8 @@ async function embedMissingChunks(args) {
1849
1971
  }
1850
1972
  return normalized.length;
1851
1973
  }
1852
- function wikiDir(cwd) {
1853
- return join(memoryDir(cwd), "wiki");
1854
- }
1855
- async function discoverWikiFiles(cwd) {
1856
- let entries;
1857
- try {
1858
- entries = await readdir(wikiDir(cwd));
1859
- } catch {
1860
- return [];
1861
- }
1862
- const root = memoryDir(cwd);
1863
- return entries.filter((entry) => entry.endsWith(".md")).map((entry) => ({
1864
- absolutePath: join(wikiDir(cwd), entry),
1865
- relPath: join("wiki", entry)
1866
- })).map((file) => ({
1867
- absolutePath: file.absolutePath,
1868
- relPath: relativeToRoot2(root, file.absolutePath)
1869
- }));
1870
- }
1871
- function relativeToRoot2(root, absolutePath) {
1872
- if (absolutePath.startsWith(`${root}/`)) return absolutePath.slice(root.length + 1);
1873
- return absolutePath;
1874
- }
1875
1974
 
1876
- // src/internal/index-manager.ts
1975
+ // src/internal/index/index-manager.ts
1877
1976
  var IndexManager = class _IndexManager {
1878
1977
  constructor(cwd, db, embedding) {
1879
1978
  this.cwd = cwd;
@@ -2495,6 +2594,6 @@ function isPathInside(root, candidate) {
2495
2594
  return candidate === root || candidate.startsWith(normalizedRoot);
2496
2595
  }
2497
2596
 
2498
- export { ActiveMemoryCache, CircuitBreaker, DEFAULT_DEEPINFRA_EMBEDDING_MODEL, DEFAULT_MEMORY_READ_LINES, DEFAULT_MISTRAL_EMBEDDING_MODEL, DEFAULT_OLLAMA_EMBEDDING_MODEL, DEFAULT_OPENAI_EMBEDDING_MODEL, DEFAULT_OPENROUTER_EMBEDDING_MODEL, DEFAULT_VOYAGE_EMBEDDING_MODEL, IndexManager, LanceIndex, LanceMemoryAdapter, MEMORY_EMBEDDING_ADAPTERS, META_KEY_DIMENSION, META_KEY_MODEL, META_KEY_PROVIDER_ID, MIGRATION_V2_STATEMENTS, PRAGMA_STATEMENTS, SCHEMA_STATEMENTS, VALID_BACKENDS, appendDiaryEntry, appendFact, appendFactToMarkdown, assertValidBackend, buildErrorMetadata, chunkMarkdown, createInMemoryMarkdownProvider, createMemoryGetTool, createMemorySearchTool, createOpenAiCompatibleRuntime, createVectorIndex, deepPhase, deepinfraMemoryEmbeddingProviderAdapter, defaultIndexPath, diaryPath, discoverSessionFiles, discoverWikiFiles, dropVectorIndex, embedMissingChunks, entryHash, identityMatches, isLanceAvailable, isSqliteVecLoaded, lanceStoragePath, legacyMemoryJsonPath, lightPhase, listNotes, loadSqliteVecExtension, mapOpenAICompatibleError, memoryDir, memoryMdPath, migrateLegacyJson, migrateSqliteToLance, mistralMemoryEmbeddingProviderAdapter, notesDir, ollamaMemoryEmbeddingProviderAdapter, openAiMemoryEmbeddingProviderAdapter, openLanceIndex, openMemoryDb, openRouterMemoryEmbeddingProviderAdapter, packVector, parseRetryAfter, parseSearchOptions, persistActiveMemoryTranscript, readEmbeddingIdentity, readFacts, readFactsFromMarkdown, readMemoryFileBounded, redactSecrets, remPhase, renderDiaryEntry, resetMigrationStateForTests, runActiveMemory, runDreamingSweep, sessionSummaryPath, sessionsDir, truncateRaw, upsertEmbedding, vectorSearch, voyageMemoryEmbeddingProviderAdapter, wikiDir, writeEmbeddingIdentity, writeSessionSummary };
2597
+ export { ActiveMemoryCache, CircuitBreaker, DEFAULT_DEEPINFRA_EMBEDDING_MODEL, DEFAULT_MEMORY_READ_LINES, DEFAULT_MISTRAL_EMBEDDING_MODEL, DEFAULT_OLLAMA_EMBEDDING_MODEL, DEFAULT_OPENAI_EMBEDDING_MODEL, DEFAULT_OPENROUTER_EMBEDDING_MODEL, DEFAULT_VOYAGE_EMBEDDING_MODEL, IndexManager, LanceIndex, LanceMemoryAdapter, MEMORY_EMBEDDING_ADAPTERS, META_KEY_DIMENSION, META_KEY_MODEL, META_KEY_PROVIDER_ID, MIGRATION_V2_STATEMENTS, PRAGMA_STATEMENTS, SCHEMA_STATEMENTS, VALID_BACKENDS, appendDiaryEntry, appendFact, appendFactToMarkdown, assertValidBackend, buildErrorMetadata, chunkMarkdown, createCategorizedMemory, createInMemoryMarkdownProvider, createMemoryGetTool, createMemorySearchTool, createOpenAiCompatibleRuntime, createVectorIndex, deepPhase, deepinfraMemoryEmbeddingProviderAdapter, defaultIndexPath, diaryPath, discoverSessionFiles, discoverWikiFiles, dropVectorIndex, embedMissingChunks, entryHash, identityMatches, isLanceAvailable, isSqliteVecLoaded, lanceStoragePath, legacyMemoryJsonPath, lightPhase, listNotes, loadSqliteVecExtension, mapOpenAICompatibleError, memoryDir, memoryMdPath, migrateLegacyJson, migrateSqliteToLance, mistralMemoryEmbeddingProviderAdapter, notesDir, ollamaMemoryEmbeddingProviderAdapter, openAiMemoryEmbeddingProviderAdapter, openLanceIndex, openMemoryDb, openRouterMemoryEmbeddingProviderAdapter, packVector, parseRetryAfter, parseSearchOptions, persistActiveMemoryTranscript, readEmbeddingIdentity, readFacts, readFactsFromMarkdown, readMemoryFileBounded, redactSecrets, remPhase, renderDiaryEntry, resetMigrationStateForTests, runActiveMemory, runDreamingSweep, sessionSummaryPath, sessionsDir, truncateRaw, upsertEmbedding, vectorSearch, voyageMemoryEmbeddingProviderAdapter, wikiDir, writeEmbeddingIdentity, writeSessionSummary };
2499
2598
  //# sourceMappingURL=index.js.map
2500
2599
  //# sourceMappingURL=index.js.map