@remnic/core 9.25.6 → 9.26.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 (220) hide show
  1. package/dist/access-admin-ops-surface.d.ts +2 -2
  2. package/dist/access-admin-ops-surface.js +41 -41
  3. package/dist/access-audit.js +2 -2
  4. package/dist/access-authorization-probe.d.ts +2 -2
  5. package/dist/access-authorization-probe.js +42 -42
  6. package/dist/access-boundary.d.ts +2 -2
  7. package/dist/access-boundary.js +41 -41
  8. package/dist/access-cli.js +98 -97
  9. package/dist/access-cli.js.map +1 -1
  10. package/dist/access-http-lcm-compaction.d.ts +130 -0
  11. package/dist/access-http-lcm-compaction.js +10 -0
  12. package/dist/access-http.d.ts +2 -2
  13. package/dist/access-http.js +53 -52
  14. package/dist/access-identity-continuity-surface.d.ts +1 -1
  15. package/dist/access-identity-continuity-surface.js +41 -41
  16. package/dist/access-lcm-surface.d.ts +2 -2
  17. package/dist/access-lcm-surface.js +41 -41
  18. package/dist/access-mcp.d.ts +2 -2
  19. package/dist/access-mcp.js +47 -47
  20. package/dist/access-namespace-preflight.js +41 -41
  21. package/dist/access-observe-write-surface.d.ts +2 -2
  22. package/dist/access-observe-write-surface.js +41 -41
  23. package/dist/access-operations-batch.js +43 -43
  24. package/dist/access-operations.d.ts +2 -2
  25. package/dist/access-operations.js +45 -45
  26. package/dist/access-recall-concurrency.d.ts +2 -2
  27. package/dist/access-recall-concurrency.js +41 -41
  28. package/dist/access-recall-response.d.ts +2 -2
  29. package/dist/access-recall-response.js +41 -41
  30. package/dist/access-recall-surface.d.ts +2 -2
  31. package/dist/access-recall-surface.js +41 -41
  32. package/dist/access-schema.d.ts +16 -1
  33. package/dist/access-schema.js +8 -8
  34. package/dist/{access-service-BJQ22URi.d.ts → access-service-DL8FJnTj.d.ts} +2 -2
  35. package/dist/access-service.d.ts +2 -2
  36. package/dist/access-service.js +41 -41
  37. package/dist/access-surface-catalog.d.ts +2 -2
  38. package/dist/adapters/index.js +7 -7
  39. package/dist/adapters/registry.js +3 -3
  40. package/dist/{auto-sync-5OE5QOZB.js → auto-sync-UPTUVE4X.js} +3 -3
  41. package/dist/bootstrap.d.ts +1 -1
  42. package/dist/briefing.js +5 -5
  43. package/dist/{capsule-crypto-7FJQINUR.js → capsule-crypto-YO5QJ6L3.js} +2 -2
  44. package/dist/capsule-crypto-YO5QJ6L3.js.map +1 -0
  45. package/dist/causal-behavior.js +2 -2
  46. package/dist/causal-chain.js +2 -2
  47. package/dist/causal-consolidation.js +11 -11
  48. package/dist/causal-retrieval.js +2 -2
  49. package/dist/causal-trajectory.js +1 -1
  50. package/dist/{chunk-JBPKEARU.js → chunk-2QSZNTDO.js} +7 -7
  51. package/dist/{chunk-BL4JHZSO.js → chunk-2XP3PWL3.js} +40 -40
  52. package/dist/{chunk-AQ2ZQYDI.js → chunk-4KKV7W62.js} +6 -6
  53. package/dist/chunk-4Z4XNEWZ.js +86 -0
  54. package/dist/chunk-4Z4XNEWZ.js.map +1 -0
  55. package/dist/{chunk-32XTXKIA.js → chunk-67DSDRUB.js} +22 -14
  56. package/dist/chunk-67DSDRUB.js.map +1 -0
  57. package/dist/{chunk-2PHX3I5C.js → chunk-6NNNURLK.js} +8 -8
  58. package/dist/{chunk-BLAKS3CP.js → chunk-77CNV7DY.js} +4 -4
  59. package/dist/{chunk-TVVEYCNW.js → chunk-7K5Q6COX.js} +4 -4
  60. package/dist/{chunk-227UFSEQ.js → chunk-7RZJWZ46.js} +5 -5
  61. package/dist/{chunk-WIGBTWXA.js → chunk-7XXCIO6X.js} +2 -2
  62. package/dist/{chunk-7CPOZH6Y.js → chunk-AJ7QCSIS.js} +2 -2
  63. package/dist/{chunk-2NLLXCJG.js → chunk-BXLOS5AJ.js} +2 -2
  64. package/dist/{chunk-X7Y7WX73.js → chunk-DQEMWVMT.js} +1 -1
  65. package/dist/{chunk-UMFLAACL.js → chunk-E6EAB4J6.js} +9 -9
  66. package/dist/{chunk-WSEA52RI.js → chunk-EXM2Q555.js} +2 -2
  67. package/dist/{chunk-G6MGAE36.js → chunk-F6LSNPPB.js} +5 -5
  68. package/dist/{chunk-7KXQ44PA.js → chunk-FE5FKTCI.js} +5 -5
  69. package/dist/{chunk-5J7HJ7RT.js → chunk-H2PBM562.js} +2 -2
  70. package/dist/{chunk-OIE242WM.js → chunk-HBVOJNV4.js} +3 -3
  71. package/dist/{chunk-PS5OG75R.js → chunk-IHMXPG4P.js} +2 -2
  72. package/dist/{chunk-3UOSVTFR.js → chunk-JCVQV6QX.js} +11 -11
  73. package/dist/{chunk-P25IPRXP.js → chunk-KGTD2KZJ.js} +28 -8
  74. package/dist/chunk-KGTD2KZJ.js.map +1 -0
  75. package/dist/{chunk-NY6W6CJW.js → chunk-KPWLZBXZ.js} +2 -2
  76. package/dist/{chunk-W33DEUKR.js → chunk-LIIQPDFN.js} +2 -2
  77. package/dist/{chunk-D7MAWMMK.js → chunk-M2KGXXTL.js} +2 -2
  78. package/dist/{chunk-UOURUMBN.js → chunk-MIFF37NN.js} +2 -2
  79. package/dist/{chunk-37VPMR4E.js → chunk-NKDVXEFU.js} +6 -6
  80. package/dist/{chunk-ZPUFQGUF.js → chunk-PQPSZICJ.js} +5 -5
  81. package/dist/{chunk-ES36HTSC.js → chunk-PTN6UAUA.js} +4 -4
  82. package/dist/{chunk-FR75B4UU.js → chunk-PX7VDW7R.js} +408 -721
  83. package/dist/chunk-PX7VDW7R.js.map +1 -0
  84. package/dist/{chunk-S2BBISHU.js → chunk-RYHWZ52A.js} +4 -4
  85. package/dist/{chunk-ZN4UZWMT.js → chunk-SK3EYPKC.js} +2 -2
  86. package/dist/{chunk-TPYZ727G.js → chunk-SN3ZESWQ.js} +6 -6
  87. package/dist/{chunk-BUK2FXOL.js → chunk-TKBDJTXG.js} +4 -4
  88. package/dist/{chunk-4B77XSG5.js → chunk-UV72DEZD.js} +5 -5
  89. package/dist/{chunk-K4DP5KZA.js → chunk-UZK7VVPD.js} +14 -14
  90. package/dist/{chunk-KQAFEZQX.js → chunk-VDX2J7OX.js} +2 -2
  91. package/dist/{chunk-SSYBI43M.js → chunk-VGEH3STZ.js} +6 -6
  92. package/dist/{chunk-NRV4Y3PM.js → chunk-W4FBGYGK.js} +1 -1
  93. package/dist/{chunk-IR4LGIH6.js → chunk-WMDRLTNA.js} +2 -2
  94. package/dist/{chunk-MU7ZHSZE.js → chunk-WZFAPHIK.js} +2 -2
  95. package/dist/{chunk-JA4HEXV7.js → chunk-XAAIUXJO.js} +2 -2
  96. package/dist/{chunk-VPSAVXHM.js → chunk-XNUBF6RF.js} +7 -7
  97. package/dist/{chunk-3CHQZVAL.js → chunk-Y6E37WRG.js} +5 -5
  98. package/dist/{chunk-E5A6C4A5.js → chunk-YN4AUGNF.js} +48 -48
  99. package/dist/{chunk-EZ25VE3G.js → chunk-YNDLCWXS.js} +4 -4
  100. package/dist/{chunk-7IGWPXVC.js → chunk-ZHP4SUPB.js} +2 -2
  101. package/dist/{cli-1W7cNjJJ.d.ts → cli-BoouX6LX.d.ts} +2 -2
  102. package/dist/cli.d.ts +3 -3
  103. package/dist/cli.js +75 -74
  104. package/dist/compounding/engine.js +5 -5
  105. package/dist/connectors/codex-materialize-runner.js +5 -5
  106. package/dist/connectors/index.js +5 -5
  107. package/dist/conversation-index/backend.js +2 -2
  108. package/dist/corpus-watermark.js +16 -16
  109. package/dist/dashboard-runtime.js +2 -2
  110. package/dist/entity-retrieval.js +5 -5
  111. package/dist/explicit-capture.d.ts +1 -1
  112. package/dist/extraction.js +3 -3
  113. package/dist/{first-start-migration-BKNGOFED.js → first-start-migration-LEXL3XYL.js} +4 -4
  114. package/dist/index.d.ts +4 -4
  115. package/dist/index.js +177 -176
  116. package/dist/lcm/engine.js +3 -3
  117. package/dist/lcm/index.js +9 -9
  118. package/dist/maintenance/memory-governance.js +6 -6
  119. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +5 -5
  120. package/dist/maintenance/rebuild-memory-projection.js +7 -7
  121. package/dist/mcp-memory-inspector-app.d.ts +2 -2
  122. package/dist/namespaces/migrate.js +15 -15
  123. package/dist/namespaces/search.js +9 -9
  124. package/dist/namespaces/storage.js +5 -5
  125. package/dist/operator-doctor-corpus.js +17 -17
  126. package/dist/operator-toolkit.js +28 -28
  127. package/dist/orchestration/maintenance.js +11 -11
  128. package/dist/{orchestrator-BtA1wC5K.d.ts → orchestrator-CFJ_TG6D.d.ts} +15 -10
  129. package/dist/orchestrator.d.ts +1 -1
  130. package/dist/orchestrator.js +98 -97
  131. package/dist/resume-bundles.js +1 -1
  132. package/dist/search/factory.js +8 -8
  133. package/dist/search/index.js +13 -13
  134. package/dist/search/lancedb-backend.js +2 -2
  135. package/dist/search/meilisearch-backend.js +2 -2
  136. package/dist/search/orama-backend.js +2 -2
  137. package/dist/semantic-consolidation.js +7 -7
  138. package/dist/semantic-rule-promotion.js +5 -5
  139. package/dist/semantic-rule-verifier.js +6 -6
  140. package/dist/session-namespace-bindings.d.ts +27 -0
  141. package/dist/session-namespace-bindings.js +243 -0
  142. package/dist/session-namespace-bindings.js.map +1 -0
  143. package/dist/storage.js +4 -4
  144. package/dist/testing/lifecycle-matrix.d.ts +100 -0
  145. package/dist/testing/lifecycle-matrix.js +149 -0
  146. package/dist/testing/lifecycle-matrix.js.map +1 -0
  147. package/dist/transfer/backup.js +4 -4
  148. package/dist/transfer/capsule-export.js +4 -4
  149. package/dist/transfer/capsule-import.js +3 -3
  150. package/dist/verified-recall.js +6 -6
  151. package/package.json +22 -2
  152. package/src/access-http-lcm-compaction.ts +116 -0
  153. package/src/access-http.test.ts +218 -0
  154. package/src/access-http.ts +8 -8
  155. package/src/access-schema-pi.test.ts +9 -0
  156. package/src/access-schema.ts +29 -4
  157. package/src/access-surface-catalog.test.ts +1 -0
  158. package/src/meetings/recall-exclusion.test.ts +4 -2
  159. package/src/orchestration/generic-recall-paths.ts +119 -0
  160. package/src/orchestration/namespace-read-fanout.ts +0 -12
  161. package/src/orchestration/orchestrator-helpers.ts +0 -35
  162. package/src/orchestration/recall-internal.ts +6 -6
  163. package/src/orchestration/recall-search-pipeline.test.ts +194 -28
  164. package/src/orchestration/recall-search-pipeline.ts +39 -89
  165. package/src/orchestrator.ts +5 -17
  166. package/src/recall-cold-deadline.test.ts +11 -13
  167. package/src/session-namespace-bindings.test.ts +358 -0
  168. package/src/session-namespace-bindings.ts +301 -0
  169. package/src/testing/lifecycle-matrix.ts +17 -7
  170. package/src/testing/subjects/generic-recall-paths.test.ts +157 -0
  171. package/dist/chunk-32XTXKIA.js.map +0 -1
  172. package/dist/chunk-FR75B4UU.js.map +0 -1
  173. package/dist/chunk-P25IPRXP.js.map +0 -1
  174. package/src/recall/archive-scoring.ts +0 -544
  175. /package/dist/{capsule-crypto-7FJQINUR.js.map → access-http-lcm-compaction.js.map} +0 -0
  176. /package/dist/{auto-sync-5OE5QOZB.js.map → auto-sync-UPTUVE4X.js.map} +0 -0
  177. /package/dist/{chunk-JBPKEARU.js.map → chunk-2QSZNTDO.js.map} +0 -0
  178. /package/dist/{chunk-BL4JHZSO.js.map → chunk-2XP3PWL3.js.map} +0 -0
  179. /package/dist/{chunk-AQ2ZQYDI.js.map → chunk-4KKV7W62.js.map} +0 -0
  180. /package/dist/{chunk-2PHX3I5C.js.map → chunk-6NNNURLK.js.map} +0 -0
  181. /package/dist/{chunk-BLAKS3CP.js.map → chunk-77CNV7DY.js.map} +0 -0
  182. /package/dist/{chunk-TVVEYCNW.js.map → chunk-7K5Q6COX.js.map} +0 -0
  183. /package/dist/{chunk-227UFSEQ.js.map → chunk-7RZJWZ46.js.map} +0 -0
  184. /package/dist/{chunk-WIGBTWXA.js.map → chunk-7XXCIO6X.js.map} +0 -0
  185. /package/dist/{chunk-7CPOZH6Y.js.map → chunk-AJ7QCSIS.js.map} +0 -0
  186. /package/dist/{chunk-2NLLXCJG.js.map → chunk-BXLOS5AJ.js.map} +0 -0
  187. /package/dist/{chunk-X7Y7WX73.js.map → chunk-DQEMWVMT.js.map} +0 -0
  188. /package/dist/{chunk-UMFLAACL.js.map → chunk-E6EAB4J6.js.map} +0 -0
  189. /package/dist/{chunk-WSEA52RI.js.map → chunk-EXM2Q555.js.map} +0 -0
  190. /package/dist/{chunk-G6MGAE36.js.map → chunk-F6LSNPPB.js.map} +0 -0
  191. /package/dist/{chunk-7KXQ44PA.js.map → chunk-FE5FKTCI.js.map} +0 -0
  192. /package/dist/{chunk-5J7HJ7RT.js.map → chunk-H2PBM562.js.map} +0 -0
  193. /package/dist/{chunk-OIE242WM.js.map → chunk-HBVOJNV4.js.map} +0 -0
  194. /package/dist/{chunk-PS5OG75R.js.map → chunk-IHMXPG4P.js.map} +0 -0
  195. /package/dist/{chunk-3UOSVTFR.js.map → chunk-JCVQV6QX.js.map} +0 -0
  196. /package/dist/{chunk-NY6W6CJW.js.map → chunk-KPWLZBXZ.js.map} +0 -0
  197. /package/dist/{chunk-W33DEUKR.js.map → chunk-LIIQPDFN.js.map} +0 -0
  198. /package/dist/{chunk-D7MAWMMK.js.map → chunk-M2KGXXTL.js.map} +0 -0
  199. /package/dist/{chunk-UOURUMBN.js.map → chunk-MIFF37NN.js.map} +0 -0
  200. /package/dist/{chunk-37VPMR4E.js.map → chunk-NKDVXEFU.js.map} +0 -0
  201. /package/dist/{chunk-ZPUFQGUF.js.map → chunk-PQPSZICJ.js.map} +0 -0
  202. /package/dist/{chunk-ES36HTSC.js.map → chunk-PTN6UAUA.js.map} +0 -0
  203. /package/dist/{chunk-S2BBISHU.js.map → chunk-RYHWZ52A.js.map} +0 -0
  204. /package/dist/{chunk-ZN4UZWMT.js.map → chunk-SK3EYPKC.js.map} +0 -0
  205. /package/dist/{chunk-TPYZ727G.js.map → chunk-SN3ZESWQ.js.map} +0 -0
  206. /package/dist/{chunk-BUK2FXOL.js.map → chunk-TKBDJTXG.js.map} +0 -0
  207. /package/dist/{chunk-4B77XSG5.js.map → chunk-UV72DEZD.js.map} +0 -0
  208. /package/dist/{chunk-K4DP5KZA.js.map → chunk-UZK7VVPD.js.map} +0 -0
  209. /package/dist/{chunk-KQAFEZQX.js.map → chunk-VDX2J7OX.js.map} +0 -0
  210. /package/dist/{chunk-SSYBI43M.js.map → chunk-VGEH3STZ.js.map} +0 -0
  211. /package/dist/{chunk-NRV4Y3PM.js.map → chunk-W4FBGYGK.js.map} +0 -0
  212. /package/dist/{chunk-IR4LGIH6.js.map → chunk-WMDRLTNA.js.map} +0 -0
  213. /package/dist/{chunk-MU7ZHSZE.js.map → chunk-WZFAPHIK.js.map} +0 -0
  214. /package/dist/{chunk-JA4HEXV7.js.map → chunk-XAAIUXJO.js.map} +0 -0
  215. /package/dist/{chunk-VPSAVXHM.js.map → chunk-XNUBF6RF.js.map} +0 -0
  216. /package/dist/{chunk-3CHQZVAL.js.map → chunk-Y6E37WRG.js.map} +0 -0
  217. /package/dist/{chunk-E5A6C4A5.js.map → chunk-YN4AUGNF.js.map} +0 -0
  218. /package/dist/{chunk-EZ25VE3G.js.map → chunk-YNDLCWXS.js.map} +0 -0
  219. /package/dist/{chunk-7IGWPXVC.js.map → chunk-ZHP4SUPB.js.map} +0 -0
  220. /package/dist/{first-start-migration-BKNGOFED.js.map → first-start-migration-LEXL3XYL.js.map} +0 -0
@@ -15,13 +15,13 @@
15
15
  * `MATRIX_ROWS` entry. Adding a row here is a one-file change that
16
16
  * automatically extends every adopter — the whole point of the harness.
17
17
  *
18
- * Test-support only: this file lives under `src/testing/` (a subdirectory, so
19
- * tsup which entry-points only top-level `src/*.ts` and the public exports —
20
- * never bundles it) and is intentionally absent from package.json `exports`.
21
- * It imports `node:test` and must NEVER be imported by runtime code.
18
+ * Test-support only: this file lives under `src/testing/` and is exported solely
19
+ * so adapter test subjects can share the canonical matrix across packages.
20
+ * The registrar loads `node:test` through `createRequire` so the built artifact
21
+ * keeps the builtin specifier, and runtime code must never import this module.
22
22
  */
23
23
 
24
- import test from "node:test";
24
+ import { createRequire } from "node:module";
25
25
 
26
26
  /** The nine canonical AGENTS.md session/retrieval/cache matrix rows. */
27
27
  export type MatrixRowId =
@@ -215,13 +215,23 @@ export interface RunLifecycleMatrixOptions {
215
215
  export function lifecycleTestName(subjectName: string, row: MatrixRow): string {
216
216
  return `lifecycle-matrix[${subjectName}] :: ${row.id} — ${row.title}`;
217
217
  }
218
+ type NodeTestRegistrar = {
219
+ (name: string, fn: () => void | Promise<void>): void;
220
+ (name: string, options: { skip: string }, fn: () => void): void;
221
+ };
222
+
223
+ const requiredNodeTest = createRequire(import.meta.url)("node:test") as
224
+ | NodeTestRegistrar
225
+ | { test: NodeTestRegistrar };
226
+ const nodeTest: NodeTestRegistrar =
227
+ typeof requiredNodeTest === "function" ? requiredNodeTest : requiredNodeTest.test;
218
228
 
219
229
  const defaultRegister: MatrixTestRegistrar = (name, fn) => {
220
- test(name, fn);
230
+ nodeTest(name, fn);
221
231
  };
222
232
 
223
233
  const defaultRegisterSkipped: MatrixSkipRegistrar = (name, reason) => {
224
- test(name, { skip: reason }, () => {});
234
+ nodeTest(name, { skip: reason }, () => {});
225
235
  };
226
236
 
227
237
  /**
@@ -0,0 +1,157 @@
1
+ import assert from "node:assert/strict";
2
+
3
+ import { Orchestrator } from "../../orchestrator.js";
4
+ import type { SearchBackend } from "../../search/port.js";
5
+ import type { MemoryFile, PluginConfig, QmdSearchResult } from "../../types.js";
6
+ import {
7
+ cleanupDir,
8
+ makeLifecycleConfig,
9
+ mkTempMemoryDir,
10
+ singleFactResult,
11
+ stubExtraction,
12
+ } from "../orchestrator-lite.js";
13
+ import {
14
+ type LifecycleSubject,
15
+ type MatrixRow,
16
+ runLifecycleMatrix,
17
+ } from "../lifecycle-matrix.js";
18
+
19
+ interface QmdSeam {
20
+ qmd: SearchBackend;
21
+ }
22
+
23
+ interface GenericRecallPathState {
24
+ readonly memoryDir: string;
25
+ orchestrator: Orchestrator;
26
+ readonly config: PluginConfig;
27
+ readonly archivePath: string;
28
+ readonly activePath: string;
29
+ readonly candidates: QmdSearchResult[];
30
+ recalled?: string;
31
+ }
32
+
33
+ function installQmd(orchestrator: Orchestrator, candidates: QmdSearchResult[]): void {
34
+ const seam = orchestrator as unknown as QmdSeam;
35
+ seam.qmd = {
36
+ isAvailable: () => true,
37
+ debugStatus: () => "lifecycle-test-qmd",
38
+ search: async () => candidates,
39
+ hybridSearch: async () => candidates,
40
+ } as unknown as SearchBackend;
41
+ }
42
+
43
+ function result(memory: MemoryFile, score: number): QmdSearchResult {
44
+ return {
45
+ docid: memory.frontmatter.id,
46
+ path: memory.path,
47
+ score,
48
+ snippet: memory.content,
49
+ };
50
+ }
51
+
52
+ const subject: LifecycleSubject<GenericRecallPathState> = {
53
+ async setup(row: MatrixRow): Promise<GenericRecallPathState> {
54
+ const memoryDir = await mkTempMemoryDir(`generic-recall-${row.id}`);
55
+ let orchestrator: Orchestrator | undefined;
56
+ try {
57
+ const config = makeLifecycleConfig(memoryDir, {
58
+ qmdEnabled: true,
59
+ qmdSearchStrategy: "lex",
60
+ });
61
+ orchestrator = new Orchestrator(config);
62
+ stubExtraction(orchestrator, () => singleFactResult(`replay-${row.id}`));
63
+ const storage = await orchestrator.getStorage();
64
+ const archivedWrite = await storage.writeMemory(
65
+ "fact",
66
+ `archived candidate for ${row.id}`,
67
+ );
68
+ const archivedMemory = await storage.getMemoryById(archivedWrite.id);
69
+ assert.ok(archivedMemory);
70
+ const archivePath = await storage.archiveMemory(archivedMemory);
71
+ assert.ok(archivePath);
72
+
73
+ const activeWrite = await storage.writeMemory(
74
+ "fact",
75
+ `active candidate for ${row.id}`,
76
+ );
77
+ const activeMemory = await storage.getMemoryById(activeWrite.id);
78
+ assert.ok(activeMemory);
79
+ const candidates = [
80
+ result({ ...archivedMemory, path: archivePath }, 1),
81
+ result(activeMemory, 0.9),
82
+ ];
83
+ installQmd(orchestrator, candidates);
84
+ return {
85
+ memoryDir,
86
+ orchestrator,
87
+ config,
88
+ archivePath,
89
+ activePath: activeMemory.path,
90
+ candidates,
91
+ };
92
+ } catch (error) {
93
+ await orchestrator?.destroy().catch(() => undefined);
94
+ await cleanupDir(memoryDir);
95
+ throw error;
96
+ }
97
+ },
98
+
99
+ async exercise(state, row): Promise<void> {
100
+ const sessionKey = `generic-recall-${row.id}`;
101
+ if (row.dimensions.flush !== "none") {
102
+ await state.orchestrator.flushSession(sessionKey, {
103
+ reason: row.dimensions.flush,
104
+ });
105
+ }
106
+ if (row.dimensions.restart) {
107
+ await state.orchestrator.destroy();
108
+ state.orchestrator = new Orchestrator(state.config);
109
+ installQmd(state.orchestrator, state.candidates);
110
+ }
111
+ if (
112
+ row.dimensions.providerIdentity === "explicit" ||
113
+ (row.dimensions.providerIdentity === "sparse" && row.dimensions.rememberedBinding)
114
+ ) {
115
+ state.orchestrator.setPeerIdForSession(sessionKey, "remembered-provider");
116
+ } else if (row.dimensions.providerIdentity === "rebound") {
117
+ state.orchestrator.setPeerIdForSession(sessionKey, "provider-a");
118
+ state.orchestrator.setPeerIdForSession(sessionKey, "provider-b");
119
+ }
120
+ if (row.dimensions.dedupeOrReplay) {
121
+ const replayTurn = {
122
+ source: "openclaw" as const,
123
+ sessionKey,
124
+ role: "user" as const,
125
+ content: "replayed candidate",
126
+ timestamp: "2026-07-25T00:00:00.000Z",
127
+ };
128
+ await state.orchestrator.ingestReplayBatch(
129
+ [replayTurn, { ...replayTurn }],
130
+ { archiveLcm: false },
131
+ );
132
+ }
133
+ state.recalled = await state.orchestrator.recall("candidate", sessionKey);
134
+ },
135
+
136
+ async invariants(state): Promise<void> {
137
+ assert.match(state.recalled ?? "", /active candidate/);
138
+ assert.doesNotMatch(state.recalled ?? "", /archived candidate/);
139
+ assert.equal(
140
+ state.candidates[0]?.path,
141
+ state.archivePath,
142
+ "the QMD fixture must put the archived memory ahead of the active hit",
143
+ );
144
+ assert.equal(
145
+ state.candidates[1]?.path,
146
+ state.activePath,
147
+ "the QMD fixture must include the persisted active memory",
148
+ );
149
+ },
150
+
151
+ async teardown(state): Promise<void> {
152
+ await state.orchestrator.destroy();
153
+ await cleanupDir(state.memoryDir);
154
+ },
155
+ };
156
+
157
+ runLifecycleMatrix("generic-recall-paths", subject);