nexus-agents 2.77.13 → 2.79.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 (132) hide show
  1. package/dist/{child-mcp-config-MJMUF7TL.js → child-mcp-config-CTO2MBRM.js} +3 -4
  2. package/dist/{child-mcp-config-MJMUF7TL.js.map → child-mcp-config-CTO2MBRM.js.map} +1 -1
  3. package/dist/{chunk-YJ2IGAD2.js → chunk-2UYTFLMO.js} +2 -2
  4. package/dist/{chunk-6AY5DK4E.js → chunk-2YPG6PDG.js} +3 -3
  5. package/dist/{chunk-3VWMM6UF.js → chunk-3NIPH6UP.js} +2 -2
  6. package/dist/{chunk-GFKGL2GQ.js → chunk-3ULMVOIF.js} +171 -83
  7. package/dist/chunk-3ULMVOIF.js.map +1 -0
  8. package/dist/{chunk-JN6UWGHH.js → chunk-5O6XLBPP.js} +2 -2
  9. package/dist/{chunk-ERWXGXV2.js → chunk-6TFTVW77.js} +3 -3
  10. package/dist/{chunk-GOT7OAL5.js → chunk-7BMOZJYS.js} +29 -5
  11. package/dist/chunk-7BMOZJYS.js.map +1 -0
  12. package/dist/{chunk-C2LLQ6TW.js → chunk-7XCUZI4G.js} +4 -4
  13. package/dist/chunk-7XCUZI4G.js.map +1 -0
  14. package/dist/{chunk-TDV5ALHY.js → chunk-D6TM2VHX.js} +3 -3
  15. package/dist/{chunk-PWTJGGKB.js → chunk-DLXT23AC.js} +2 -2
  16. package/dist/chunk-DNO2INX5.js +276 -0
  17. package/dist/chunk-DNO2INX5.js.map +1 -0
  18. package/dist/{chunk-G2CSKBY5.js → chunk-FJWWSVWB.js} +29 -6
  19. package/dist/chunk-FJWWSVWB.js.map +1 -0
  20. package/dist/{chunk-DSQ5XM4O.js → chunk-FVPYP5DD.js} +4 -4
  21. package/dist/{chunk-MGLWPN2I.js → chunk-GONMG4NM.js} +2 -2
  22. package/dist/{chunk-YQMQSJQK.js → chunk-HYU4GZY6.js} +2 -2
  23. package/dist/{chunk-3DH5SLFH.js → chunk-K2QILJG4.js} +6 -6
  24. package/dist/{chunk-5WHWKY32.js → chunk-KT5FIBWS.js} +2 -2
  25. package/dist/{chunk-DIB6V67T.js → chunk-L6SCKLGO.js} +3 -3
  26. package/dist/{chunk-IPWCD22D.js → chunk-PLX6FCFC.js} +2 -2
  27. package/dist/chunk-PQHVC4BD.js +639 -0
  28. package/dist/chunk-PQHVC4BD.js.map +1 -0
  29. package/dist/chunk-Q5CFPIJ5.js +5581 -0
  30. package/dist/chunk-Q5CFPIJ5.js.map +1 -0
  31. package/dist/{chunk-G6ZPVADX.js → chunk-SD76JZBG.js} +2 -2
  32. package/dist/{chunk-Y2CP4Z5B.js → chunk-SWFJU3W2.js} +220 -4580
  33. package/dist/chunk-SWFJU3W2.js.map +1 -0
  34. package/dist/{chunk-3MRM53T4.js → chunk-WDYCIJWN.js} +640 -470
  35. package/dist/chunk-WDYCIJWN.js.map +1 -0
  36. package/dist/{chunk-RBZ4CDMY.js → chunk-YMMYYAZT.js} +5 -5
  37. package/dist/{chunk-CM3TORGV.js → chunk-YXWGEIQR.js} +2 -2
  38. package/dist/{chunk-JX6OI4FS.js → chunk-ZI6G7U7Y.js} +125 -33
  39. package/dist/chunk-ZI6G7U7Y.js.map +1 -0
  40. package/dist/{chunk-7NK7BTWP.js → chunk-ZVCED4Z4.js} +2 -2
  41. package/dist/cli-circuit-breaker-I74ZQ44Q.js +13 -0
  42. package/dist/cli.js +109 -58
  43. package/dist/cli.js.map +1 -1
  44. package/dist/{composite-router-S6E26BCI.js → composite-router-V3OC57IE.js} +3 -4
  45. package/dist/consensus-vote-ESFPGEJE.js +30 -0
  46. package/dist/context-retriever-MB3D7KS6.js +18 -0
  47. package/dist/dist-NIXVXYIH.js +42 -0
  48. package/dist/doctor-deep-KQ765XZA.js +12 -0
  49. package/dist/expert-bridge-JKLC57IC.js +10 -0
  50. package/dist/factory-BUUXNGIB.js +14 -0
  51. package/dist/{factory-X3VKIGKP.js → factory-LHHYDVZX.js} +5 -6
  52. package/dist/index.d.ts +72 -8
  53. package/dist/index.js +208 -316
  54. package/dist/index.js.map +1 -1
  55. package/dist/{init-opencode-CFE7M6XA.js → init-opencode-GXZN2W5S.js} +6 -7
  56. package/dist/{init-opencode-CFE7M6XA.js.map → init-opencode-GXZN2W5S.js.map} +1 -1
  57. package/dist/issue-triage-RMXPDZ2K.js +15 -0
  58. package/dist/{learning-persistence-N6ILD2HX.js → learning-persistence-Q3HTOGTU.js} +2 -3
  59. package/dist/outcome-store-adapter-QRFJJIKB.js +57 -0
  60. package/dist/outcome-store-adapter-QRFJJIKB.js.map +1 -0
  61. package/dist/{registry-command-RPPC7N2K.js → registry-command-6E4YKAMT.js} +3 -4
  62. package/dist/{registry-command-RPPC7N2K.js.map → registry-command-6E4YKAMT.js.map} +1 -1
  63. package/dist/{repo-security-plan-7ZCDVH5O.js → repo-security-plan-AGRU72DL.js} +4 -5
  64. package/dist/research-helpers-synthesize-K2UCJQQG.js +13 -0
  65. package/dist/{routing-memory-5VTX7LQX.js → routing-memory-3B6DDZ76.js} +3 -4
  66. package/dist/{session-memory-7XBV6BMY.js → session-memory-L7EQIY2O.js} +4 -5
  67. package/dist/{setup-command-W6UKPODL.js → setup-command-R4BOEMLZ.js} +11 -12
  68. package/dist/setup-config-EQT24DD4.js +10 -0
  69. package/dist/{setup-custom-api-WM5W5AY5.js → setup-custom-api-IBDV654K.js} +5 -6
  70. package/dist/{setup-custom-api-WM5W5AY5.js.map → setup-custom-api-IBDV654K.js.map} +1 -1
  71. package/dist/tool-memory-6HCHQLAN.js +19 -0
  72. package/dist/{weather-report-YJMVKJGA.js → weather-report-ER3WUZ7S.js} +3 -4
  73. package/package.json +3 -2
  74. package/dist/adaptive-memory-EI564K4C.js +0 -16
  75. package/dist/chunk-3MRM53T4.js.map +0 -1
  76. package/dist/chunk-BJ2OMC7P.js +0 -944
  77. package/dist/chunk-BJ2OMC7P.js.map +0 -1
  78. package/dist/chunk-C2LLQ6TW.js.map +0 -1
  79. package/dist/chunk-G2CSKBY5.js.map +0 -1
  80. package/dist/chunk-GFKGL2GQ.js.map +0 -1
  81. package/dist/chunk-GOT7OAL5.js.map +0 -1
  82. package/dist/chunk-I7ORMAO7.js +0 -32
  83. package/dist/chunk-I7ORMAO7.js.map +0 -1
  84. package/dist/chunk-JX6OI4FS.js.map +0 -1
  85. package/dist/chunk-Y2CP4Z5B.js.map +0 -1
  86. package/dist/cli-circuit-breaker-YX4BWZD5.js +0 -14
  87. package/dist/consensus-vote-MUQ4HPIF.js +0 -30
  88. package/dist/doctor-deep-BRU5ZUJI.js +0 -13
  89. package/dist/expert-bridge-ZPNVLJVN.js +0 -11
  90. package/dist/factory-A7DTCCUY.js +0 -15
  91. package/dist/issue-triage-6XD6CVPB.js +0 -16
  92. package/dist/mobimem-CG2MNS7V.js +0 -14
  93. package/dist/nexus-data-dir-77UO7N6J.js +0 -12
  94. package/dist/research-helpers-synthesize-36TUTUUA.js +0 -14
  95. package/dist/setup-config-EI5KROA3.js +0 -11
  96. /package/dist/{chunk-YJ2IGAD2.js.map → chunk-2UYTFLMO.js.map} +0 -0
  97. /package/dist/{chunk-6AY5DK4E.js.map → chunk-2YPG6PDG.js.map} +0 -0
  98. /package/dist/{chunk-3VWMM6UF.js.map → chunk-3NIPH6UP.js.map} +0 -0
  99. /package/dist/{chunk-JN6UWGHH.js.map → chunk-5O6XLBPP.js.map} +0 -0
  100. /package/dist/{chunk-ERWXGXV2.js.map → chunk-6TFTVW77.js.map} +0 -0
  101. /package/dist/{chunk-TDV5ALHY.js.map → chunk-D6TM2VHX.js.map} +0 -0
  102. /package/dist/{chunk-PWTJGGKB.js.map → chunk-DLXT23AC.js.map} +0 -0
  103. /package/dist/{chunk-DSQ5XM4O.js.map → chunk-FVPYP5DD.js.map} +0 -0
  104. /package/dist/{chunk-MGLWPN2I.js.map → chunk-GONMG4NM.js.map} +0 -0
  105. /package/dist/{chunk-YQMQSJQK.js.map → chunk-HYU4GZY6.js.map} +0 -0
  106. /package/dist/{chunk-3DH5SLFH.js.map → chunk-K2QILJG4.js.map} +0 -0
  107. /package/dist/{chunk-5WHWKY32.js.map → chunk-KT5FIBWS.js.map} +0 -0
  108. /package/dist/{chunk-DIB6V67T.js.map → chunk-L6SCKLGO.js.map} +0 -0
  109. /package/dist/{chunk-IPWCD22D.js.map → chunk-PLX6FCFC.js.map} +0 -0
  110. /package/dist/{chunk-G6ZPVADX.js.map → chunk-SD76JZBG.js.map} +0 -0
  111. /package/dist/{chunk-RBZ4CDMY.js.map → chunk-YMMYYAZT.js.map} +0 -0
  112. /package/dist/{chunk-CM3TORGV.js.map → chunk-YXWGEIQR.js.map} +0 -0
  113. /package/dist/{chunk-7NK7BTWP.js.map → chunk-ZVCED4Z4.js.map} +0 -0
  114. /package/dist/{adaptive-memory-EI564K4C.js.map → cli-circuit-breaker-I74ZQ44Q.js.map} +0 -0
  115. /package/dist/{cli-circuit-breaker-YX4BWZD5.js.map → composite-router-V3OC57IE.js.map} +0 -0
  116. /package/dist/{composite-router-S6E26BCI.js.map → consensus-vote-ESFPGEJE.js.map} +0 -0
  117. /package/dist/{consensus-vote-MUQ4HPIF.js.map → context-retriever-MB3D7KS6.js.map} +0 -0
  118. /package/dist/{doctor-deep-BRU5ZUJI.js.map → dist-NIXVXYIH.js.map} +0 -0
  119. /package/dist/{expert-bridge-ZPNVLJVN.js.map → doctor-deep-KQ765XZA.js.map} +0 -0
  120. /package/dist/{factory-A7DTCCUY.js.map → expert-bridge-JKLC57IC.js.map} +0 -0
  121. /package/dist/{factory-X3VKIGKP.js.map → factory-BUUXNGIB.js.map} +0 -0
  122. /package/dist/{issue-triage-6XD6CVPB.js.map → factory-LHHYDVZX.js.map} +0 -0
  123. /package/dist/{learning-persistence-N6ILD2HX.js.map → issue-triage-RMXPDZ2K.js.map} +0 -0
  124. /package/dist/{mobimem-CG2MNS7V.js.map → learning-persistence-Q3HTOGTU.js.map} +0 -0
  125. /package/dist/{nexus-data-dir-77UO7N6J.js.map → repo-security-plan-AGRU72DL.js.map} +0 -0
  126. /package/dist/{repo-security-plan-7ZCDVH5O.js.map → research-helpers-synthesize-K2UCJQQG.js.map} +0 -0
  127. /package/dist/{research-helpers-synthesize-36TUTUUA.js.map → routing-memory-3B6DDZ76.js.map} +0 -0
  128. /package/dist/{routing-memory-5VTX7LQX.js.map → session-memory-L7EQIY2O.js.map} +0 -0
  129. /package/dist/{session-memory-7XBV6BMY.js.map → setup-command-R4BOEMLZ.js.map} +0 -0
  130. /package/dist/{setup-command-W6UKPODL.js.map → setup-config-EQT24DD4.js.map} +0 -0
  131. /package/dist/{setup-config-EI5KROA3.js.map → tool-memory-6HCHQLAN.js.map} +0 -0
  132. /package/dist/{weather-report-YJMVKJGA.js.map → weather-report-ER3WUZ7S.js.map} +0 -0
@@ -1,944 +0,0 @@
1
- import {
2
- stringifyValue,
3
- tokenize
4
- } from "./chunk-633WH2ML.js";
5
- import {
6
- ErrorCode,
7
- NexusError,
8
- ValidationError,
9
- createLogger,
10
- err,
11
- formatZodError,
12
- getTimeProvider,
13
- ok
14
- } from "./chunk-3MRM53T4.js";
15
-
16
- // src/context/memory-backend-types.ts
17
- import { z } from "zod";
18
- var MemoryImportance = {
19
- LOW: "low",
20
- MEDIUM: "medium",
21
- HIGH: "high"
22
- };
23
- var MemoryImportanceSchema = z.enum(["low", "medium", "high"]);
24
- var MemoryMetadataSchema = z.object({
25
- importance: MemoryImportanceSchema,
26
- tags: z.array(z.string()).optional(),
27
- ttl: z.number().positive().optional()
28
- });
29
- var MemoryEntrySchema = z.object({
30
- key: z.string().min(1),
31
- value: z.unknown(),
32
- metadata: MemoryMetadataSchema,
33
- createdAt: z.date(),
34
- accessedAt: z.date()
35
- });
36
- var MemoryError = class extends NexusError {
37
- constructor(message, options) {
38
- super(message, { code: ErrorCode.INTERNAL_ERROR, ...options });
39
- this.name = "MemoryError";
40
- }
41
- };
42
- var HybridMemoryConfigSchema = z.object({
43
- dbPath: z.string().min(1),
44
- markdownDir: z.string().min(1),
45
- autoExpire: z.boolean().optional()
46
- });
47
-
48
- // src/context/memory-backend.ts
49
- import { z as z2 } from "zod";
50
-
51
- // src/context/memory-markdown.ts
52
- import * as fs from "fs";
53
- import * as path from "path";
54
- var MemoryMarkdownHelper = class {
55
- constructor(markdownDir, logger3) {
56
- this.markdownDir = markdownDir;
57
- this.logger = logger3;
58
- }
59
- /**
60
- * Ensure the Markdown export directory exists.
61
- */
62
- ensureDir() {
63
- if (!fs.existsSync(this.markdownDir)) {
64
- fs.mkdirSync(this.markdownDir, { recursive: true });
65
- this.logger.debug("Created Markdown directory", { path: this.markdownDir });
66
- }
67
- }
68
- /**
69
- * Write a memory entry to Markdown file.
70
- */
71
- async write(key, value, metadata, createdAt) {
72
- const filename = this.keyToFilename(key);
73
- const filepath = path.join(this.markdownDir, filename);
74
- const content = this.format(key, value, metadata, createdAt);
75
- try {
76
- await fs.promises.writeFile(filepath, content, "utf-8");
77
- this.logger.debug("Wrote Markdown file", { key, filepath });
78
- } catch (error) {
79
- this.logger.warn("Failed to write Markdown file", { key, filepath, error });
80
- }
81
- }
82
- /**
83
- * Delete a Markdown file for a memory.
84
- */
85
- delete(key) {
86
- const filename = this.keyToFilename(key);
87
- const filepath = path.join(this.markdownDir, filename);
88
- try {
89
- if (fs.existsSync(filepath)) {
90
- fs.unlinkSync(filepath);
91
- this.logger.debug("Deleted Markdown file", { key, filepath });
92
- }
93
- } catch (error) {
94
- this.logger.warn("Failed to delete Markdown file", { key, filepath, error });
95
- }
96
- }
97
- /**
98
- * Convert a memory key to a safe filename.
99
- */
100
- keyToFilename(key) {
101
- const safeKey = key.replace(/[^a-zA-Z0-9-_]/g, "_").replace(/_+/g, "_").substring(0, 200);
102
- return `${safeKey}.md`;
103
- }
104
- /**
105
- * Format a memory entry as Markdown.
106
- */
107
- format(key, value, metadata, createdAt) {
108
- const lines = [
109
- `# Memory: ${key}`,
110
- "",
111
- "## Metadata",
112
- "",
113
- `- **Importance:** ${metadata.importance}`,
114
- `- **Created:** ${createdAt.toISOString()}`
115
- ];
116
- if (metadata.tags !== void 0 && metadata.tags.length > 0) {
117
- lines.push(`- **Tags:** ${metadata.tags.join(", ")}`);
118
- }
119
- if (metadata.ttl !== void 0) {
120
- const expiresAt = new Date(createdAt.getTime() + metadata.ttl);
121
- lines.push(`- **Expires:** ${expiresAt.toISOString()}`);
122
- }
123
- lines.push("", "## Value", "");
124
- if (typeof value === "string") {
125
- lines.push(value);
126
- } else if (value === null) {
127
- lines.push("`null`");
128
- } else if (typeof value === "object") {
129
- lines.push("```json", JSON.stringify(value, null, 2), "```");
130
- } else {
131
- const stringValue = typeof value === "number" || typeof value === "boolean" ? String(value) : JSON.stringify(value);
132
- lines.push(`\`${stringValue}\``);
133
- }
134
- lines.push("");
135
- return lines.join("\n");
136
- }
137
- };
138
-
139
- // src/context/memory-operations.ts
140
- function safeParseJson(raw) {
141
- try {
142
- return JSON.parse(raw);
143
- } catch {
144
- return null;
145
- }
146
- }
147
- function parseMetadataOrDefault(raw) {
148
- const parsed = safeParseJson(raw);
149
- if (parsed !== null && typeof parsed === "object") return parsed;
150
- return { importance: "medium" };
151
- }
152
- function rowToEntry(row) {
153
- return {
154
- key: row.key,
155
- value: safeParseJson(row.value),
156
- metadata: parseMetadataOrDefault(row.metadata),
157
- createdAt: new Date(row.created_at),
158
- accessedAt: new Date(row.accessed_at)
159
- };
160
- }
161
- function sanitizeFtsQuery(query) {
162
- return query.replace(/[*:^"(){}[\]]/g, " ").replace(/\bAND\b/gi, " ").replace(/\bOR\b/gi, " ").replace(/\bNOT\b/gi, " ").replace(/\bNEAR\b/gi, " ").replace(/\s+/g, " ").trim();
163
- }
164
- function cleanupExpiredEntries(rows, database, autoExpire, logger3) {
165
- const now = getTimeProvider().now();
166
- const entries = [];
167
- const expiredKeys = [];
168
- for (const row of rows) {
169
- if (autoExpire && row.expires_at !== null && row.expires_at < now) {
170
- expiredKeys.push(row.key);
171
- continue;
172
- }
173
- entries.push(rowToEntry(row));
174
- }
175
- if (expiredKeys.length > 0) {
176
- const deleteStmt = database.prepare(
177
- `DELETE FROM memories WHERE key IN (${expiredKeys.map(() => "?").join(",")})`
178
- );
179
- deleteStmt.run(...expiredKeys);
180
- logger3.debug("Auto-expired memories", { count: expiredKeys.length });
181
- }
182
- return { entries, expiredCount: expiredKeys.length };
183
- }
184
- function countMemories(database) {
185
- try {
186
- const stmt = database.prepare("SELECT COUNT(*) as count FROM memories");
187
- const row = stmt.get();
188
- return ok(row?.count ?? 0);
189
- } catch (error) {
190
- const causeError = error instanceof Error ? error : new Error(String(error));
191
- return err(new MemoryError("Failed to count memories", { cause: causeError }));
192
- }
193
- }
194
- function expireAllEntries(database, logger3) {
195
- try {
196
- const stmt = database.prepare(
197
- "DELETE FROM memories WHERE expires_at IS NOT NULL AND expires_at < ?"
198
- );
199
- const result = stmt.run(getTimeProvider().now());
200
- logger3.info("Expired memories", { count: result.changes });
201
- return ok(result.changes);
202
- } catch (error) {
203
- const causeError = error instanceof Error ? error : new Error(String(error));
204
- return err(new MemoryError("Failed to expire memories", { cause: causeError }));
205
- }
206
- }
207
- function pruneOldEntries(database, olderThan, logger3) {
208
- try {
209
- const stmt = database.prepare("DELETE FROM memories WHERE created_at < ?");
210
- const result = stmt.run(olderThan.getTime());
211
- logger3.info("Pruned old memories", {
212
- olderThan: olderThan.toISOString(),
213
- count: result.changes
214
- });
215
- return ok(result.changes);
216
- } catch (error) {
217
- const causeError = error instanceof Error ? error : new Error(String(error));
218
- return err(
219
- new MemoryError("Failed to prune memories", {
220
- cause: causeError,
221
- context: { olderThan: olderThan.toISOString() }
222
- })
223
- );
224
- }
225
- }
226
-
227
- // src/context/memory-backend.ts
228
- var HybridMemoryBackend = class {
229
- dbPath;
230
- logger;
231
- autoExpire;
232
- markdown;
233
- db = null;
234
- initialized = false;
235
- initPromise;
236
- constructor(config) {
237
- const validation = HybridMemoryConfigSchema.safeParse(config);
238
- if (!validation.success) {
239
- throw new ValidationError(
240
- `Invalid HybridMemoryBackend config: ${formatZodError(validation.error)}`,
241
- {
242
- context: { config, validationErrors: validation.error.issues }
243
- }
244
- );
245
- }
246
- this.dbPath = config.dbPath;
247
- this.logger = config.logger ?? createLogger({ component: "HybridMemoryBackend" });
248
- this.autoExpire = config.autoExpire ?? true;
249
- this.markdown = new MemoryMarkdownHelper(config.markdownDir, this.logger);
250
- }
251
- initializeWithDatabase(database) {
252
- this.db = database;
253
- this.createTables();
254
- this.markdown.ensureDir();
255
- this.initialized = true;
256
- this.logger.info("HybridMemoryBackend initialized", { dbPath: this.dbPath });
257
- }
258
- async initialize() {
259
- if (this.initialized) return ok(void 0);
260
- this.initPromise ??= this.doInitialize().finally(() => {
261
- this.initPromise = void 0;
262
- });
263
- return this.initPromise;
264
- }
265
- async doInitialize() {
266
- try {
267
- const betterSqlite3Module = await import("better-sqlite3").catch((cause) => {
268
- this.logger.debug("better-sqlite3 import failed", { error: String(cause) });
269
- return null;
270
- });
271
- if (betterSqlite3Module === null) {
272
- return err(
273
- new MemoryError("better-sqlite3 not installed. Install: npm install better-sqlite3", {
274
- context: { dbPath: this.dbPath }
275
- })
276
- );
277
- }
278
- const Database = betterSqlite3Module.default;
279
- this.db = new Database(this.dbPath);
280
- this.createTables();
281
- this.markdown.ensureDir();
282
- this.initialized = true;
283
- this.logger.info("HybridMemoryBackend initialized", { dbPath: this.dbPath });
284
- return ok(void 0);
285
- } catch (error) {
286
- const causeError = error instanceof Error ? error : new Error(String(error));
287
- this.logger.error("Failed to initialize HybridMemoryBackend", causeError);
288
- return err(
289
- new MemoryError("Failed to initialize memory backend", {
290
- cause: causeError,
291
- context: { dbPath: this.dbPath }
292
- })
293
- );
294
- }
295
- }
296
- createTables() {
297
- const database = this.getDatabase();
298
- database.exec(`
299
- CREATE TABLE IF NOT EXISTS memories (
300
- key TEXT PRIMARY KEY, value TEXT NOT NULL, metadata TEXT NOT NULL,
301
- created_at INTEGER NOT NULL, accessed_at INTEGER NOT NULL, expires_at INTEGER
302
- )
303
- `);
304
- database.exec(`
305
- CREATE VIRTUAL TABLE IF NOT EXISTS memories_fts USING fts5(
306
- key, value, tags, content='memories', content_rowid='rowid'
307
- )
308
- `);
309
- database.exec(`
310
- CREATE TRIGGER IF NOT EXISTS memories_ai AFTER INSERT ON memories BEGIN
311
- INSERT INTO memories_fts(rowid, key, value, tags)
312
- SELECT rowid, NEW.key, NEW.value, json_extract(NEW.metadata, '$.tags') FROM memories WHERE key = NEW.key;
313
- END
314
- `);
315
- database.exec(`
316
- CREATE TRIGGER IF NOT EXISTS memories_ad AFTER DELETE ON memories BEGIN
317
- INSERT INTO memories_fts(memories_fts, rowid, key, value, tags)
318
- VALUES('delete', OLD.rowid, OLD.key, OLD.value, json_extract(OLD.metadata, '$.tags'));
319
- END
320
- `);
321
- database.exec(`
322
- CREATE TRIGGER IF NOT EXISTS memories_au AFTER UPDATE ON memories BEGIN
323
- INSERT INTO memories_fts(memories_fts, rowid, key, value, tags)
324
- VALUES('delete', OLD.rowid, OLD.key, OLD.value, json_extract(OLD.metadata, '$.tags'));
325
- INSERT INTO memories_fts(rowid, key, value, tags)
326
- SELECT rowid, NEW.key, NEW.value, json_extract(NEW.metadata, '$.tags') FROM memories WHERE key = NEW.key;
327
- END
328
- `);
329
- database.exec(
330
- `CREATE INDEX IF NOT EXISTS idx_memories_expires_at ON memories(expires_at) WHERE expires_at IS NOT NULL`
331
- );
332
- database.exec(`CREATE INDEX IF NOT EXISTS idx_memories_created_at ON memories(created_at)`);
333
- this.logger.debug("Database tables created");
334
- }
335
- getDatabase() {
336
- if (this.db === null) throw new MemoryError("Database not initialized");
337
- return this.db;
338
- }
339
- ensureInitialized() {
340
- if (!this.initialized || this.db === null) {
341
- throw new MemoryError("HybridMemoryBackend not initialized. Call initialize() first.");
342
- }
343
- }
344
- async store(key, value, metadata) {
345
- try {
346
- this.ensureInitialized();
347
- const keyValidation = z2.string().min(1).safeParse(key);
348
- if (!keyValidation.success)
349
- return err(new MemoryError("Invalid key: must be non-empty string", { context: { key } }));
350
- const metadataValidation = MemoryMetadataSchema.safeParse(metadata);
351
- if (!metadataValidation.success)
352
- return err(
353
- new MemoryError("Invalid metadata", {
354
- context: { metadata, errors: metadataValidation.error.issues }
355
- })
356
- );
357
- const now = getTimeProvider().now();
358
- const expiresAt = metadata.ttl !== void 0 ? now + metadata.ttl : null;
359
- const database = this.getDatabase();
360
- const stmt = database.prepare(
361
- `INSERT OR REPLACE INTO memories (key, value, metadata, created_at, accessed_at, expires_at) VALUES (?, ?, ?, ?, ?, ?)`
362
- );
363
- stmt.run(key, JSON.stringify(value), JSON.stringify(metadata), now, now, expiresAt);
364
- this.logger.debug("Stored memory", { key, importance: metadata.importance });
365
- if (metadata.importance === MemoryImportance.HIGH)
366
- await this.markdown.write(key, value, metadata, new Date(now));
367
- return ok(void 0);
368
- } catch (error) {
369
- const causeError = error instanceof Error ? error : new Error(String(error));
370
- this.logger.error("Failed to store memory", causeError, { key });
371
- return err(
372
- new MemoryError("Failed to store memory", { cause: causeError, context: { key } })
373
- );
374
- }
375
- }
376
- retrieve(key) {
377
- try {
378
- this.ensureInitialized();
379
- const database = this.getDatabase();
380
- const stmt = database.prepare(
381
- `SELECT key, value, metadata, created_at, accessed_at, expires_at FROM memories WHERE key = ?`
382
- );
383
- const row = stmt.get(key);
384
- if (row === void 0) return Promise.resolve(ok(null));
385
- if (this.autoExpire && row.expires_at !== null && row.expires_at < getTimeProvider().now()) {
386
- database.prepare("DELETE FROM memories WHERE key = ?").run(key);
387
- this.logger.debug("Auto-expired memory", { key });
388
- return Promise.resolve(ok(null));
389
- }
390
- database.prepare("UPDATE memories SET accessed_at = ? WHERE key = ?").run(getTimeProvider().now(), key);
391
- return Promise.resolve(ok(JSON.parse(row.value)));
392
- } catch (error) {
393
- const causeError = error instanceof Error ? error : new Error(String(error));
394
- this.logger.error("Failed to retrieve memory", causeError, { key });
395
- return Promise.resolve(
396
- err(new MemoryError("Failed to retrieve memory", { cause: causeError, context: { key } }))
397
- );
398
- }
399
- }
400
- search(query, limit) {
401
- try {
402
- this.ensureInitialized();
403
- if (limit <= 0 || limit > 1e3)
404
- return Promise.resolve(
405
- err(new MemoryError("Invalid limit: must be between 1 and 1000", { context: { limit } }))
406
- );
407
- const sanitizedQuery = sanitizeFtsQuery(query);
408
- if (sanitizedQuery.length === 0) return Promise.resolve(ok([]));
409
- const database = this.getDatabase();
410
- const stmt = database.prepare(`
411
- SELECT m.key, m.value, m.metadata, m.created_at, m.accessed_at, m.expires_at
412
- FROM memories m INNER JOIN memories_fts fts ON m.rowid = fts.rowid
413
- WHERE memories_fts MATCH ? ORDER BY rank LIMIT ?
414
- `);
415
- const rows = stmt.all(sanitizedQuery, limit);
416
- const { entries } = cleanupExpiredEntries(rows, database, this.autoExpire, this.logger);
417
- return Promise.resolve(ok(entries));
418
- } catch (error) {
419
- const causeError = error instanceof Error ? error : new Error(String(error));
420
- this.logger.error("Failed to search memories", causeError, { query });
421
- return Promise.resolve(
422
- err(
423
- new MemoryError("Failed to search memories", {
424
- cause: causeError,
425
- context: { query, limit }
426
- })
427
- )
428
- );
429
- }
430
- }
431
- prune(olderThan) {
432
- this.ensureInitialized();
433
- return Promise.resolve(pruneOldEntries(this.getDatabase(), olderThan, this.logger));
434
- }
435
- expireAll() {
436
- this.ensureInitialized();
437
- return Promise.resolve(expireAllEntries(this.getDatabase(), this.logger));
438
- }
439
- delete(key) {
440
- try {
441
- this.ensureInitialized();
442
- const result = this.getDatabase().prepare("DELETE FROM memories WHERE key = ?").run(key);
443
- if (result.changes > 0) {
444
- this.markdown.delete(key);
445
- this.logger.debug("Deleted memory", { key });
446
- return Promise.resolve(ok(true));
447
- }
448
- return Promise.resolve(ok(false));
449
- } catch (error) {
450
- const causeError = error instanceof Error ? error : new Error(String(error));
451
- this.logger.error("Failed to delete memory", causeError, { key });
452
- return Promise.resolve(
453
- err(new MemoryError("Failed to delete memory", { cause: causeError, context: { key } }))
454
- );
455
- }
456
- }
457
- getAll(limit = 100) {
458
- try {
459
- this.ensureInitialized();
460
- const database = this.getDatabase();
461
- const rows = database.prepare(
462
- `SELECT key, value, metadata, created_at, accessed_at, expires_at FROM memories ORDER BY accessed_at DESC LIMIT ?`
463
- ).all(limit);
464
- const { entries } = cleanupExpiredEntries(rows, database, this.autoExpire, this.logger);
465
- return Promise.resolve(ok(entries));
466
- } catch (error) {
467
- const causeError = error instanceof Error ? error : new Error(String(error));
468
- this.logger.error("Failed to get all memories", causeError);
469
- return Promise.resolve(
470
- err(new MemoryError("Failed to get all memories", { cause: causeError }))
471
- );
472
- }
473
- }
474
- count() {
475
- this.ensureInitialized();
476
- return Promise.resolve(countMemories(this.getDatabase()));
477
- }
478
- close() {
479
- if (this.db !== null) {
480
- this.db.close();
481
- this.db = null;
482
- this.initialized = false;
483
- this.logger.info("HybridMemoryBackend closed");
484
- }
485
- }
486
- };
487
-
488
- // src/context/adaptive-memory-types.ts
489
- import { z as z3 } from "zod";
490
- var ScoringWeightsBaseSchema = z3.object({
491
- recency: z3.number().min(0).max(1),
492
- importance: z3.number().min(0).max(1),
493
- relevance: z3.number().min(0).max(1)
494
- });
495
- var ScoringWeightsSchema = ScoringWeightsBaseSchema.refine(
496
- (w) => Math.abs(w.recency + w.importance + w.relevance - 1) < 1e-3,
497
- { message: "Weights must sum to 1.0" }
498
- );
499
- var PartialScoringWeightsSchema = ScoringWeightsBaseSchema.partial();
500
- var ImportanceWeightsSchema = z3.object({
501
- low: z3.number().min(0).max(1),
502
- medium: z3.number().min(0).max(1),
503
- high: z3.number().min(0).max(1)
504
- });
505
- var DecayConfigSchema = z3.object({
506
- halfLifeMs: z3.number().positive(),
507
- minScore: z3.number().min(0).max(1)
508
- });
509
- var PriorityScoreSchema = z3.object({
510
- score: z3.number().min(0),
511
- components: z3.object({
512
- recency: z3.number().min(0).max(1),
513
- importance: z3.number().min(0).max(1),
514
- relevance: z3.number().min(0).max(1)
515
- })
516
- });
517
- var ScoredMemoryEntrySchema = z3.object({
518
- entry: z3.object({
519
- key: z3.string(),
520
- value: z3.unknown(),
521
- metadata: z3.object({
522
- importance: z3.enum(["low", "medium", "high"]),
523
- tags: z3.array(z3.string()).optional(),
524
- ttl: z3.number().optional()
525
- }),
526
- createdAt: z3.date(),
527
- accessedAt: z3.date()
528
- }),
529
- priority: PriorityScoreSchema
530
- });
531
- var PriorityRetrievalOptionsSchema = z3.object({
532
- query: z3.string().optional(),
533
- limit: z3.number().int().positive().optional(),
534
- minScore: z3.number().min(0).optional(),
535
- weights: PartialScoringWeightsSchema.optional(),
536
- importanceFilter: z3.array(z3.enum(["low", "medium", "high"])).optional(),
537
- tagFilter: z3.array(z3.string()).optional()
538
- });
539
- var ScoringConfigSchema = z3.object({
540
- weights: ScoringWeightsSchema,
541
- importanceWeights: ImportanceWeightsSchema,
542
- decay: DecayConfigSchema
543
- });
544
- var AdaptiveMemoryConfigSchema = z3.object({
545
- dbPath: z3.string().min(1),
546
- markdownDir: z3.string().min(1),
547
- scoring: ScoringConfigSchema.partial().optional(),
548
- autoExpire: z3.boolean().optional()
549
- });
550
- var DEFAULT_SCORING_WEIGHTS = {
551
- recency: 0.4,
552
- importance: 0.3,
553
- relevance: 0.3
554
- };
555
- var DEFAULT_IMPORTANCE_WEIGHTS = {
556
- low: 0.25,
557
- medium: 0.5,
558
- high: 1
559
- };
560
- var DEFAULT_DECAY_CONFIG = {
561
- halfLifeMs: 24 * 60 * 60 * 1e3,
562
- // 24 hours
563
- minScore: 0.1
564
- };
565
- var DEFAULT_SCORING_CONFIG = {
566
- weights: DEFAULT_SCORING_WEIGHTS,
567
- importanceWeights: DEFAULT_IMPORTANCE_WEIGHTS,
568
- decay: DEFAULT_DECAY_CONFIG
569
- };
570
-
571
- // src/utils/similarity-utils.ts
572
- function calculateTokenOverlap(queryTokens, targetTokens) {
573
- if (queryTokens.length === 0) return 0;
574
- if (targetTokens.length === 0) return 0;
575
- const targetSet = new Set(targetTokens);
576
- let matches = 0;
577
- for (const token of queryTokens) {
578
- if (targetSet.has(token)) matches++;
579
- }
580
- return matches / queryTokens.length;
581
- }
582
- function calculateSetOverlapCount(sourceSet, targetSet) {
583
- let count = 0;
584
- for (const item of sourceSet) {
585
- if (targetSet.has(item)) count++;
586
- }
587
- return count;
588
- }
589
- function calculateJaccardSimilarity(set1, set2) {
590
- if (set1.size === 0 && set2.size === 0) return 1;
591
- if (set1.size === 0 || set2.size === 0) return 0;
592
- const intersection = calculateSetOverlapCount(set1, set2);
593
- const union = set1.size + set2.size - intersection;
594
- return union > 0 ? intersection / union : 0;
595
- }
596
- function calculateTextJaccardSimilarity(text1, text2) {
597
- const words1 = new Set(
598
- text1.toLowerCase().split(/\s+/).filter((w) => w.length > 0)
599
- );
600
- const words2 = new Set(
601
- text2.toLowerCase().split(/\s+/).filter((w) => w.length > 0)
602
- );
603
- return calculateJaccardSimilarity(words1, words2);
604
- }
605
-
606
- // src/utils/memory-db-utils.ts
607
- var logger = createLogger({ component: "MemoryDbUtils" });
608
- function safeJsonParse(json, fallback, context) {
609
- try {
610
- return JSON.parse(json);
611
- } catch {
612
- logger.warn("Corrupt JSON in memory database row", { context });
613
- return fallback;
614
- }
615
- }
616
- function memoryRowToEntry(row) {
617
- return {
618
- key: row.key,
619
- value: safeJsonParse(row.value, row.value, `value for key="${row.key}"`),
620
- metadata: safeJsonParse(
621
- row.metadata,
622
- { importance: MemoryImportance.MEDIUM },
623
- `metadata for key="${row.key}"`
624
- ),
625
- createdAt: new Date(row.created_at),
626
- accessedAt: new Date(row.accessed_at)
627
- };
628
- }
629
- function memoryExists(db, key) {
630
- const stmt = db.prepare(
631
- "SELECT COUNT(*) as count FROM memories WHERE key = ?"
632
- );
633
- const result = stmt.get(key);
634
- return result !== void 0 && result.count > 0;
635
- }
636
- function getMemoryEntry(db, key) {
637
- const stmt = db.prepare("SELECT * FROM memories WHERE key = ?");
638
- const row = stmt.get(key);
639
- return row !== void 0 ? memoryRowToEntry(row) : void 0;
640
- }
641
- function getMemoryRow(db, key) {
642
- const stmt = db.prepare("SELECT * FROM memories WHERE key = ?");
643
- return stmt.get(key);
644
- }
645
- function getAllMemoryRows(db, limit) {
646
- const stmt = db.prepare("SELECT * FROM memories ORDER BY accessed_at DESC LIMIT ?");
647
- return stmt.all(limit);
648
- }
649
-
650
- // src/context/adaptive-memory-helpers.ts
651
- function calculateRecencyScore(accessedAt, now, halfLifeMs, minScore) {
652
- const elapsedMs = now.getTime() - accessedAt.getTime();
653
- if (elapsedMs <= 0) return 1;
654
- const lambda = Math.LN2 / halfLifeMs;
655
- const decayedScore = Math.exp(-lambda * elapsedMs);
656
- return Math.max(minScore, decayedScore);
657
- }
658
- function calculateImportanceScore(importance, config) {
659
- switch (importance) {
660
- case MemoryImportance.HIGH:
661
- return config.importanceWeights.high;
662
- case MemoryImportance.MEDIUM:
663
- return config.importanceWeights.medium;
664
- case MemoryImportance.LOW:
665
- return config.importanceWeights.low;
666
- default:
667
- return config.importanceWeights.medium;
668
- }
669
- }
670
- function calculateRelevanceScore(query, value) {
671
- if (query === void 0 || query.trim() === "") return 1;
672
- const queryTokens = tokenize2(query);
673
- const valueTokens = tokenize2(value);
674
- if (queryTokens.length === 0 || valueTokens.length === 0) return 0.5;
675
- return calculateTokenOverlap(queryTokens, valueTokens);
676
- }
677
- function tokenize2(text) {
678
- return tokenize(text, 1);
679
- }
680
- function calculatePriorityScore(input) {
681
- const { entry, query, now, config, weightOverrides } = input;
682
- const recency = calculateRecencyScore(
683
- entry.accessedAt,
684
- now,
685
- config.decay.halfLifeMs,
686
- config.decay.minScore
687
- );
688
- const importance = calculateImportanceScore(entry.metadata.importance, config);
689
- const relevance = calculateRelevanceScore(query, stringifyValue2(entry.value));
690
- const components = { recency, importance, relevance };
691
- const weights = resolveWeights(config.weights, weightOverrides);
692
- const score = recency * weights.recency + importance * weights.importance + relevance * weights.relevance;
693
- return { score, components };
694
- }
695
- function stringifyValue2(value) {
696
- return stringifyValue(value);
697
- }
698
- function resolveWeights(base, overrides) {
699
- if (overrides === void 0) return base;
700
- const merged = {
701
- recency: overrides.recency ?? base.recency,
702
- importance: overrides.importance ?? base.importance,
703
- relevance: overrides.relevance ?? base.relevance
704
- };
705
- const sum = merged.recency + merged.importance + merged.relevance;
706
- if (sum === 0) return base;
707
- if (Math.abs(sum - 1) > 1e-3) {
708
- return {
709
- recency: merged.recency / sum,
710
- importance: merged.importance / sum,
711
- relevance: merged.relevance / sum
712
- };
713
- }
714
- return merged;
715
- }
716
- function filterScoredEntries(entries, config) {
717
- return entries.filter((e) => {
718
- if (config.minScore !== void 0 && e.priority.score < config.minScore) {
719
- return false;
720
- }
721
- if (config.importanceFilter !== void 0 && config.importanceFilter.length > 0) {
722
- if (!config.importanceFilter.includes(e.entry.metadata.importance)) {
723
- return false;
724
- }
725
- }
726
- if (config.tagFilter !== void 0 && config.tagFilter.length > 0) {
727
- const entryTags = e.entry.metadata.tags ?? [];
728
- const hasMatch = config.tagFilter.some((t) => entryTags.includes(t));
729
- if (!hasMatch) return false;
730
- }
731
- return true;
732
- });
733
- }
734
- function touchMemory(db, key) {
735
- const stmt = db.prepare("UPDATE memories SET accessed_at = ? WHERE key = ?");
736
- const result = stmt.run(getTimeProvider().now(), key);
737
- return result.changes > 0;
738
- }
739
- function scoreAndSortEntries(rows, opts, config) {
740
- const now = new Date(getTimeProvider().now());
741
- const scored = rows.map((row) => {
742
- const entry = memoryRowToEntry(row);
743
- const priority = calculatePriorityScore({
744
- entry,
745
- now,
746
- config,
747
- ...opts?.query !== void 0 && { query: opts.query },
748
- ...opts?.weights !== void 0 && { weightOverrides: opts.weights }
749
- });
750
- return { entry, priority };
751
- });
752
- const filterConfig = {
753
- ...opts?.minScore !== void 0 && { minScore: opts.minScore },
754
- ...opts?.importanceFilter !== void 0 && { importanceFilter: opts.importanceFilter },
755
- ...opts?.tagFilter !== void 0 && { tagFilter: opts.tagFilter }
756
- };
757
- const filtered = filterScoredEntries(scored, filterConfig);
758
- filtered.sort((a, b) => b.priority.score - a.priority.score);
759
- const limit = opts?.limit ?? 100;
760
- return filtered.slice(0, limit);
761
- }
762
- function mergeScoringConfig(partial) {
763
- if (partial === void 0) return DEFAULT_SCORING_CONFIG;
764
- return {
765
- weights: partial.weights ?? DEFAULT_SCORING_CONFIG.weights,
766
- importanceWeights: partial.importanceWeights ?? DEFAULT_SCORING_CONFIG.importanceWeights,
767
- decay: partial.decay ?? DEFAULT_SCORING_CONFIG.decay
768
- };
769
- }
770
-
771
- // src/context/adaptive-memory.ts
772
- var logger2 = createLogger({ component: "AdaptiveMemoryBackend" });
773
- var AdaptiveMemoryBackend = class {
774
- config;
775
- log;
776
- base;
777
- scoringConfig;
778
- db = null;
779
- initialized = false;
780
- initPromise;
781
- constructor(config) {
782
- const validation = AdaptiveMemoryConfigSchema.safeParse(config);
783
- if (!validation.success) {
784
- const msg = validation.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; ");
785
- throw new MemoryError(`Invalid AdaptiveMemoryBackend config: ${msg}`);
786
- }
787
- this.config = config;
788
- this.log = logger2;
789
- this.scoringConfig = mergeScoringConfig(config.scoring);
790
- this.base = new HybridMemoryBackend({ dbPath: config.dbPath, markdownDir: config.markdownDir });
791
- }
792
- async initialize() {
793
- if (this.initialized) return ok(void 0);
794
- this.initPromise ??= this.doInitialize().finally(() => {
795
- this.initPromise = void 0;
796
- });
797
- return this.initPromise;
798
- }
799
- async doInitialize() {
800
- const baseInit = await this.base.initialize();
801
- if (!baseInit.ok) return baseInit;
802
- try {
803
- const mod = await import("better-sqlite3").catch((cause) => {
804
- this.log.debug("better-sqlite3 import failed", { error: String(cause) });
805
- return null;
806
- });
807
- if (mod === null)
808
- return err(
809
- new MemoryError("better-sqlite3 not installed. Install: npm install better-sqlite3")
810
- );
811
- const Database = mod.default;
812
- this.db = new Database(this.config.dbPath);
813
- this.initialized = true;
814
- this.log.info("AdaptiveMemoryBackend initialized");
815
- return ok(void 0);
816
- } catch (error) {
817
- const cause = error instanceof Error ? error : new Error(String(error));
818
- return err(new MemoryError("Failed to initialize adaptive backend", { cause }));
819
- }
820
- }
821
- initializeWithDatabase(database) {
822
- this.base.initializeWithDatabase(database);
823
- this.db = database;
824
- this.initialized = true;
825
- this.log.info("AdaptiveMemoryBackend initialized with database");
826
- }
827
- getDb() {
828
- if (this.db === null) throw new MemoryError("Database not initialized");
829
- return this.db;
830
- }
831
- ensureInit() {
832
- if (!this.initialized) throw new MemoryError("AdaptiveMemoryBackend not initialized");
833
- }
834
- // =========================================================================
835
- // IMemoryBackend Methods (delegated to base)
836
- // =========================================================================
837
- store(key, value, metadata) {
838
- return this.base.store(key, value, metadata);
839
- }
840
- retrieve(key) {
841
- return this.base.retrieve(key);
842
- }
843
- search(query, limit) {
844
- return this.base.search(query, limit);
845
- }
846
- prune(olderThan) {
847
- return this.base.prune(olderThan);
848
- }
849
- // =========================================================================
850
- // IAdaptiveMemory Methods
851
- // =========================================================================
852
- retrieveByPriority(opts) {
853
- try {
854
- this.ensureInit();
855
- const db = this.getDb();
856
- const maxFetch = (opts?.limit ?? 100) * 2;
857
- const rows = getAllMemoryRows(db, maxFetch);
858
- const scored = scoreAndSortEntries(rows, opts, this.scoringConfig);
859
- this.log.debug("Retrieved by priority", { count: scored.length, query: opts?.query });
860
- return Promise.resolve(ok(scored));
861
- } catch (error) {
862
- const cause = error instanceof Error ? error : new Error(String(error));
863
- return Promise.resolve(err(new MemoryError("Failed to retrieve by priority", { cause })));
864
- }
865
- }
866
- getPriorityScore(key, query) {
867
- try {
868
- this.ensureInit();
869
- const db = this.getDb();
870
- if (!memoryExists(db, key)) {
871
- return Promise.resolve(err(new MemoryError(`Key not found: ${key}`)));
872
- }
873
- const row = getMemoryRow(db, key);
874
- if (row === void 0) {
875
- return Promise.resolve(err(new MemoryError(`Key not found: ${key}`)));
876
- }
877
- const entry = memoryRowToEntry(row);
878
- const priority = calculatePriorityScore({
879
- entry,
880
- now: new Date(getTimeProvider().now()),
881
- config: this.scoringConfig,
882
- ...query !== void 0 && { query }
883
- });
884
- return Promise.resolve(ok(priority));
885
- } catch (error) {
886
- const cause = error instanceof Error ? error : new Error(String(error));
887
- return Promise.resolve(err(new MemoryError("Failed to get priority score", { cause })));
888
- }
889
- }
890
- touch(key) {
891
- try {
892
- this.ensureInit();
893
- const db = this.getDb();
894
- if (!memoryExists(db, key)) {
895
- return Promise.resolve(err(new MemoryError(`Key not found: ${key}`)));
896
- }
897
- const updated = touchMemory(db, key);
898
- if (!updated) {
899
- return Promise.resolve(err(new MemoryError(`Failed to touch: ${key}`)));
900
- }
901
- this.log.debug("Touched memory", { key });
902
- return Promise.resolve(ok(void 0));
903
- } catch (error) {
904
- const cause = error instanceof Error ? error : new Error(String(error));
905
- return Promise.resolve(err(new MemoryError("Failed to touch memory", { cause })));
906
- }
907
- }
908
- getScoringConfig() {
909
- return this.scoringConfig;
910
- }
911
- updateScoringConfig(config) {
912
- this.scoringConfig = mergeScoringConfig({ ...this.scoringConfig, ...config });
913
- this.log.info("Updated scoring config", { config: this.scoringConfig });
914
- }
915
- // =========================================================================
916
- // Lifecycle
917
- // =========================================================================
918
- close() {
919
- this.base.close();
920
- if (this.db !== null) {
921
- this.db.close();
922
- this.db = null;
923
- }
924
- this.initialized = false;
925
- this.log.info("AdaptiveMemoryBackend closed");
926
- }
927
- };
928
- function createAdaptiveMemory(config) {
929
- return new AdaptiveMemoryBackend(config);
930
- }
931
-
932
- export {
933
- MemoryImportance,
934
- MemoryError,
935
- memoryRowToEntry,
936
- memoryExists,
937
- getMemoryEntry,
938
- calculateTextJaccardSimilarity,
939
- HybridMemoryBackend,
940
- DEFAULT_SCORING_CONFIG,
941
- AdaptiveMemoryBackend,
942
- createAdaptiveMemory
943
- };
944
- //# sourceMappingURL=chunk-BJ2OMC7P.js.map