@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.
- package/CHANGELOG.md +31 -1
- package/dist/index.cjs +309 -209
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +34 -33
- package/dist/index.d.ts +34 -33
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +312 -213
- package/dist/index.js.map +1 -1
- package/dist/internal/active-memory/active-memory-cache.d.ts.map +1 -0
- package/dist/internal/{active-memory-types.d.ts → active-memory/active-memory-types.d.ts} +1 -1
- package/dist/internal/active-memory/active-memory-types.d.ts.map +1 -0
- package/dist/internal/{active-memory.d.ts → active-memory/active-memory.d.ts} +2 -2
- package/dist/internal/active-memory/active-memory.d.ts.map +1 -0
- package/dist/internal/active-memory/composite-scorer.d.ts.map +1 -0
- package/dist/internal/active-memory/query-analyzer.d.ts.map +1 -0
- package/dist/internal/adapter-catalog.d.ts +6 -6
- package/dist/internal/categorized-memory.d.ts +56 -0
- package/dist/internal/categorized-memory.d.ts.map +1 -0
- package/dist/internal/dreaming/dreaming-diary.d.ts.map +1 -0
- package/dist/internal/{dreaming-phases.d.ts → dreaming/dreaming-phases.d.ts} +2 -2
- package/dist/internal/dreaming/dreaming-phases.d.ts.map +1 -0
- package/dist/internal/{dreaming-run.d.ts → dreaming/dreaming-run.d.ts} +1 -1
- package/dist/internal/dreaming/dreaming-run.d.ts.map +1 -0
- package/dist/internal/embedding/batch-encoder.d.ts.map +1 -0
- package/dist/internal/embedding/deepinfra-embedding.d.ts.map +1 -0
- package/dist/internal/embedding/embedding-adapter.d.ts.map +1 -0
- package/dist/internal/embedding/embedding-cache.d.ts.map +1 -0
- package/dist/internal/embedding/mistral-embedding.d.ts.map +1 -0
- package/dist/internal/embedding/ollama-embedding.d.ts.map +1 -0
- package/dist/internal/embedding/openai-compatible.d.ts.map +1 -0
- package/dist/internal/embedding/openai-embedding.d.ts.map +1 -0
- package/dist/internal/embedding/openrouter-embedding.d.ts.map +1 -0
- package/dist/internal/embedding/voyage-embedding.d.ts.map +1 -0
- package/dist/internal/index/index-db.d.ts.map +1 -0
- package/dist/internal/{index-manager-contract.d.ts → index/index-manager-contract.d.ts} +1 -1
- package/dist/internal/index/index-manager-contract.d.ts.map +1 -0
- package/dist/internal/index/index-manager-dispatch.d.ts.map +1 -0
- package/dist/internal/{index-manager.d.ts → index/index-manager.d.ts} +1 -1
- package/dist/internal/index/index-manager.d.ts.map +1 -0
- package/dist/internal/index/index-schema.d.ts.map +1 -0
- package/dist/internal/{lance-index.d.ts → index/lance-index.d.ts} +1 -1
- package/dist/internal/index/lance-index.d.ts.map +1 -0
- package/dist/internal/index/lance-memory-adapter.d.ts.map +1 -0
- package/dist/internal/index/memory-index.d.ts.map +1 -0
- package/dist/internal/index/migrate-sqlite-to-lance.d.ts.map +1 -0
- package/dist/internal/{migration.d.ts → index/migration.d.ts} +1 -1
- package/dist/internal/index/migration.d.ts.map +1 -0
- package/dist/internal/index/sqlite-vec-loader.d.ts.map +1 -0
- package/dist/internal/{vec-index.d.ts → index/vec-index.d.ts} +1 -1
- package/dist/internal/index/vec-index.d.ts.map +1 -0
- package/dist/internal/memory-types.d.ts +5 -0
- package/dist/internal/memory-types.d.ts.map +1 -1
- package/dist/internal/store/chunk-markdown.d.ts.map +1 -0
- package/dist/internal/{markdown-store.d.ts → store/markdown-store.d.ts} +1 -1
- package/dist/internal/store/markdown-store.d.ts.map +1 -0
- package/dist/internal/store/reader.d.ts.map +1 -0
- package/dist/internal/store/session-loader.d.ts.map +1 -0
- package/dist/internal/store/session-summary-writer.d.ts.map +1 -0
- package/dist/internal/store/transcript-store.d.ts.map +1 -0
- package/dist/internal/store/wiki-loader.d.ts.map +1 -0
- package/dist/internal/tools.d.ts +1 -1
- package/dist/internal/tools.d.ts.map +1 -1
- package/package.json +9 -9
- package/dist/internal/active-memory-cache.d.ts.map +0 -1
- package/dist/internal/active-memory-types.d.ts.map +0 -1
- package/dist/internal/active-memory.d.ts.map +0 -1
- package/dist/internal/batch-encoder.d.ts.map +0 -1
- package/dist/internal/chunk-markdown.d.ts.map +0 -1
- package/dist/internal/composite-scorer.d.ts.map +0 -1
- package/dist/internal/deepinfra-embedding.d.ts.map +0 -1
- package/dist/internal/dreaming-diary.d.ts.map +0 -1
- package/dist/internal/dreaming-phases.d.ts.map +0 -1
- package/dist/internal/dreaming-run.d.ts.map +0 -1
- package/dist/internal/embedding-adapter.d.ts.map +0 -1
- package/dist/internal/embedding-cache.d.ts.map +0 -1
- package/dist/internal/index-db.d.ts.map +0 -1
- package/dist/internal/index-manager-contract.d.ts.map +0 -1
- package/dist/internal/index-manager-dispatch.d.ts.map +0 -1
- package/dist/internal/index-manager.d.ts.map +0 -1
- package/dist/internal/index-schema.d.ts.map +0 -1
- package/dist/internal/lance-index.d.ts.map +0 -1
- package/dist/internal/lance-memory-adapter.d.ts.map +0 -1
- package/dist/internal/markdown-store.d.ts.map +0 -1
- package/dist/internal/memory-index.d.ts.map +0 -1
- package/dist/internal/migrate-sqlite-to-lance.d.ts.map +0 -1
- package/dist/internal/migration.d.ts.map +0 -1
- package/dist/internal/mistral-embedding.d.ts.map +0 -1
- package/dist/internal/ollama-embedding.d.ts.map +0 -1
- package/dist/internal/openai-compatible.d.ts.map +0 -1
- package/dist/internal/openai-embedding.d.ts.map +0 -1
- package/dist/internal/openrouter-embedding.d.ts.map +0 -1
- package/dist/internal/query-analyzer.d.ts.map +0 -1
- package/dist/internal/reader.d.ts.map +0 -1
- package/dist/internal/session-loader.d.ts.map +0 -1
- package/dist/internal/session-summary-writer.d.ts.map +0 -1
- package/dist/internal/sqlite-vec-loader.d.ts.map +0 -1
- package/dist/internal/transcript-store.d.ts.map +0 -1
- package/dist/internal/vec-index.d.ts.map +0 -1
- package/dist/internal/voyage-embedding.d.ts.map +0 -1
- package/dist/internal/wiki-loader.d.ts.map +0 -1
- /package/dist/internal/{active-memory-cache.d.ts → active-memory/active-memory-cache.d.ts} +0 -0
- /package/dist/internal/{composite-scorer.d.ts → active-memory/composite-scorer.d.ts} +0 -0
- /package/dist/internal/{query-analyzer.d.ts → active-memory/query-analyzer.d.ts} +0 -0
- /package/dist/internal/{dreaming-diary.d.ts → dreaming/dreaming-diary.d.ts} +0 -0
- /package/dist/internal/{batch-encoder.d.ts → embedding/batch-encoder.d.ts} +0 -0
- /package/dist/internal/{deepinfra-embedding.d.ts → embedding/deepinfra-embedding.d.ts} +0 -0
- /package/dist/internal/{embedding-adapter.d.ts → embedding/embedding-adapter.d.ts} +0 -0
- /package/dist/internal/{embedding-cache.d.ts → embedding/embedding-cache.d.ts} +0 -0
- /package/dist/internal/{mistral-embedding.d.ts → embedding/mistral-embedding.d.ts} +0 -0
- /package/dist/internal/{ollama-embedding.d.ts → embedding/ollama-embedding.d.ts} +0 -0
- /package/dist/internal/{openai-compatible.d.ts → embedding/openai-compatible.d.ts} +0 -0
- /package/dist/internal/{openai-embedding.d.ts → embedding/openai-embedding.d.ts} +0 -0
- /package/dist/internal/{openrouter-embedding.d.ts → embedding/openrouter-embedding.d.ts} +0 -0
- /package/dist/internal/{voyage-embedding.d.ts → embedding/voyage-embedding.d.ts} +0 -0
- /package/dist/internal/{index-db.d.ts → index/index-db.d.ts} +0 -0
- /package/dist/internal/{index-manager-dispatch.d.ts → index/index-manager-dispatch.d.ts} +0 -0
- /package/dist/internal/{index-schema.d.ts → index/index-schema.d.ts} +0 -0
- /package/dist/internal/{lance-memory-adapter.d.ts → index/lance-memory-adapter.d.ts} +0 -0
- /package/dist/internal/{memory-index.d.ts → index/memory-index.d.ts} +0 -0
- /package/dist/internal/{migrate-sqlite-to-lance.d.ts → index/migrate-sqlite-to-lance.d.ts} +0 -0
- /package/dist/internal/{sqlite-vec-loader.d.ts → index/sqlite-vec-loader.d.ts} +0 -0
- /package/dist/internal/{chunk-markdown.d.ts → store/chunk-markdown.d.ts} +0 -0
- /package/dist/internal/{reader.d.ts → store/reader.d.ts} +0 -0
- /package/dist/internal/{session-loader.d.ts → store/session-loader.d.ts} +0 -0
- /package/dist/internal/{session-summary-writer.d.ts → store/session-summary-writer.d.ts} +0 -0
- /package/dist/internal/{transcript-store.d.ts → store/transcript-store.d.ts} +0 -0
- /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,
|
|
2
|
-
import { join, resolve,
|
|
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,
|
|
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
|
|
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
|
-
|
|
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
|
|
1095
|
-
function
|
|
1096
|
-
const
|
|
1097
|
-
|
|
1098
|
-
const
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
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
|
-
|
|
1106
|
-
|
|
1107
|
-
}
|
|
1108
|
-
function
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
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
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
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
|
|
1122
|
-
if (
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
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 (
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
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
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
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
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
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
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
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
|
|
1450
|
-
if (
|
|
1451
|
-
|
|
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
|
-
|
|
1455
|
-
|
|
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
|
|
1465
|
-
|
|
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
|