@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.
- package/dist/access-admin-ops-surface.d.ts +2 -2
- package/dist/access-admin-ops-surface.js +41 -41
- package/dist/access-audit.js +2 -2
- package/dist/access-authorization-probe.d.ts +2 -2
- package/dist/access-authorization-probe.js +42 -42
- package/dist/access-boundary.d.ts +2 -2
- package/dist/access-boundary.js +41 -41
- package/dist/access-cli.js +98 -97
- package/dist/access-cli.js.map +1 -1
- package/dist/access-http-lcm-compaction.d.ts +130 -0
- package/dist/access-http-lcm-compaction.js +10 -0
- package/dist/access-http.d.ts +2 -2
- package/dist/access-http.js +53 -52
- package/dist/access-identity-continuity-surface.d.ts +1 -1
- package/dist/access-identity-continuity-surface.js +41 -41
- package/dist/access-lcm-surface.d.ts +2 -2
- package/dist/access-lcm-surface.js +41 -41
- package/dist/access-mcp.d.ts +2 -2
- package/dist/access-mcp.js +47 -47
- package/dist/access-namespace-preflight.js +41 -41
- package/dist/access-observe-write-surface.d.ts +2 -2
- package/dist/access-observe-write-surface.js +41 -41
- package/dist/access-operations-batch.js +43 -43
- package/dist/access-operations.d.ts +2 -2
- package/dist/access-operations.js +45 -45
- package/dist/access-recall-concurrency.d.ts +2 -2
- package/dist/access-recall-concurrency.js +41 -41
- package/dist/access-recall-response.d.ts +2 -2
- package/dist/access-recall-response.js +41 -41
- package/dist/access-recall-surface.d.ts +2 -2
- package/dist/access-recall-surface.js +41 -41
- package/dist/access-schema.d.ts +16 -1
- package/dist/access-schema.js +8 -8
- package/dist/{access-service-BJQ22URi.d.ts → access-service-DL8FJnTj.d.ts} +2 -2
- package/dist/access-service.d.ts +2 -2
- package/dist/access-service.js +41 -41
- package/dist/access-surface-catalog.d.ts +2 -2
- package/dist/adapters/index.js +7 -7
- package/dist/adapters/registry.js +3 -3
- package/dist/{auto-sync-5OE5QOZB.js → auto-sync-UPTUVE4X.js} +3 -3
- package/dist/bootstrap.d.ts +1 -1
- package/dist/briefing.js +5 -5
- package/dist/{capsule-crypto-7FJQINUR.js → capsule-crypto-YO5QJ6L3.js} +2 -2
- package/dist/capsule-crypto-YO5QJ6L3.js.map +1 -0
- package/dist/causal-behavior.js +2 -2
- package/dist/causal-chain.js +2 -2
- package/dist/causal-consolidation.js +11 -11
- package/dist/causal-retrieval.js +2 -2
- package/dist/causal-trajectory.js +1 -1
- package/dist/{chunk-JBPKEARU.js → chunk-2QSZNTDO.js} +7 -7
- package/dist/{chunk-BL4JHZSO.js → chunk-2XP3PWL3.js} +40 -40
- package/dist/{chunk-AQ2ZQYDI.js → chunk-4KKV7W62.js} +6 -6
- package/dist/chunk-4Z4XNEWZ.js +86 -0
- package/dist/chunk-4Z4XNEWZ.js.map +1 -0
- package/dist/{chunk-32XTXKIA.js → chunk-67DSDRUB.js} +22 -14
- package/dist/chunk-67DSDRUB.js.map +1 -0
- package/dist/{chunk-2PHX3I5C.js → chunk-6NNNURLK.js} +8 -8
- package/dist/{chunk-BLAKS3CP.js → chunk-77CNV7DY.js} +4 -4
- package/dist/{chunk-TVVEYCNW.js → chunk-7K5Q6COX.js} +4 -4
- package/dist/{chunk-227UFSEQ.js → chunk-7RZJWZ46.js} +5 -5
- package/dist/{chunk-WIGBTWXA.js → chunk-7XXCIO6X.js} +2 -2
- package/dist/{chunk-7CPOZH6Y.js → chunk-AJ7QCSIS.js} +2 -2
- package/dist/{chunk-2NLLXCJG.js → chunk-BXLOS5AJ.js} +2 -2
- package/dist/{chunk-X7Y7WX73.js → chunk-DQEMWVMT.js} +1 -1
- package/dist/{chunk-UMFLAACL.js → chunk-E6EAB4J6.js} +9 -9
- package/dist/{chunk-WSEA52RI.js → chunk-EXM2Q555.js} +2 -2
- package/dist/{chunk-G6MGAE36.js → chunk-F6LSNPPB.js} +5 -5
- package/dist/{chunk-7KXQ44PA.js → chunk-FE5FKTCI.js} +5 -5
- package/dist/{chunk-5J7HJ7RT.js → chunk-H2PBM562.js} +2 -2
- package/dist/{chunk-OIE242WM.js → chunk-HBVOJNV4.js} +3 -3
- package/dist/{chunk-PS5OG75R.js → chunk-IHMXPG4P.js} +2 -2
- package/dist/{chunk-3UOSVTFR.js → chunk-JCVQV6QX.js} +11 -11
- package/dist/{chunk-P25IPRXP.js → chunk-KGTD2KZJ.js} +28 -8
- package/dist/chunk-KGTD2KZJ.js.map +1 -0
- package/dist/{chunk-NY6W6CJW.js → chunk-KPWLZBXZ.js} +2 -2
- package/dist/{chunk-W33DEUKR.js → chunk-LIIQPDFN.js} +2 -2
- package/dist/{chunk-D7MAWMMK.js → chunk-M2KGXXTL.js} +2 -2
- package/dist/{chunk-UOURUMBN.js → chunk-MIFF37NN.js} +2 -2
- package/dist/{chunk-37VPMR4E.js → chunk-NKDVXEFU.js} +6 -6
- package/dist/{chunk-ZPUFQGUF.js → chunk-PQPSZICJ.js} +5 -5
- package/dist/{chunk-ES36HTSC.js → chunk-PTN6UAUA.js} +4 -4
- package/dist/{chunk-FR75B4UU.js → chunk-PX7VDW7R.js} +408 -721
- package/dist/chunk-PX7VDW7R.js.map +1 -0
- package/dist/{chunk-S2BBISHU.js → chunk-RYHWZ52A.js} +4 -4
- package/dist/{chunk-ZN4UZWMT.js → chunk-SK3EYPKC.js} +2 -2
- package/dist/{chunk-TPYZ727G.js → chunk-SN3ZESWQ.js} +6 -6
- package/dist/{chunk-BUK2FXOL.js → chunk-TKBDJTXG.js} +4 -4
- package/dist/{chunk-4B77XSG5.js → chunk-UV72DEZD.js} +5 -5
- package/dist/{chunk-K4DP5KZA.js → chunk-UZK7VVPD.js} +14 -14
- package/dist/{chunk-KQAFEZQX.js → chunk-VDX2J7OX.js} +2 -2
- package/dist/{chunk-SSYBI43M.js → chunk-VGEH3STZ.js} +6 -6
- package/dist/{chunk-NRV4Y3PM.js → chunk-W4FBGYGK.js} +1 -1
- package/dist/{chunk-IR4LGIH6.js → chunk-WMDRLTNA.js} +2 -2
- package/dist/{chunk-MU7ZHSZE.js → chunk-WZFAPHIK.js} +2 -2
- package/dist/{chunk-JA4HEXV7.js → chunk-XAAIUXJO.js} +2 -2
- package/dist/{chunk-VPSAVXHM.js → chunk-XNUBF6RF.js} +7 -7
- package/dist/{chunk-3CHQZVAL.js → chunk-Y6E37WRG.js} +5 -5
- package/dist/{chunk-E5A6C4A5.js → chunk-YN4AUGNF.js} +48 -48
- package/dist/{chunk-EZ25VE3G.js → chunk-YNDLCWXS.js} +4 -4
- package/dist/{chunk-7IGWPXVC.js → chunk-ZHP4SUPB.js} +2 -2
- package/dist/{cli-1W7cNjJJ.d.ts → cli-BoouX6LX.d.ts} +2 -2
- package/dist/cli.d.ts +3 -3
- package/dist/cli.js +75 -74
- package/dist/compounding/engine.js +5 -5
- package/dist/connectors/codex-materialize-runner.js +5 -5
- package/dist/connectors/index.js +5 -5
- package/dist/conversation-index/backend.js +2 -2
- package/dist/corpus-watermark.js +16 -16
- package/dist/dashboard-runtime.js +2 -2
- package/dist/entity-retrieval.js +5 -5
- package/dist/explicit-capture.d.ts +1 -1
- package/dist/extraction.js +3 -3
- package/dist/{first-start-migration-BKNGOFED.js → first-start-migration-LEXL3XYL.js} +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +177 -176
- package/dist/lcm/engine.js +3 -3
- package/dist/lcm/index.js +9 -9
- package/dist/maintenance/memory-governance.js +6 -6
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +5 -5
- package/dist/maintenance/rebuild-memory-projection.js +7 -7
- package/dist/mcp-memory-inspector-app.d.ts +2 -2
- package/dist/namespaces/migrate.js +15 -15
- package/dist/namespaces/search.js +9 -9
- package/dist/namespaces/storage.js +5 -5
- package/dist/operator-doctor-corpus.js +17 -17
- package/dist/operator-toolkit.js +28 -28
- package/dist/orchestration/maintenance.js +11 -11
- package/dist/{orchestrator-BtA1wC5K.d.ts → orchestrator-CFJ_TG6D.d.ts} +15 -10
- package/dist/orchestrator.d.ts +1 -1
- package/dist/orchestrator.js +98 -97
- package/dist/resume-bundles.js +1 -1
- package/dist/search/factory.js +8 -8
- package/dist/search/index.js +13 -13
- package/dist/search/lancedb-backend.js +2 -2
- package/dist/search/meilisearch-backend.js +2 -2
- package/dist/search/orama-backend.js +2 -2
- package/dist/semantic-consolidation.js +7 -7
- package/dist/semantic-rule-promotion.js +5 -5
- package/dist/semantic-rule-verifier.js +6 -6
- package/dist/session-namespace-bindings.d.ts +27 -0
- package/dist/session-namespace-bindings.js +243 -0
- package/dist/session-namespace-bindings.js.map +1 -0
- package/dist/storage.js +4 -4
- package/dist/testing/lifecycle-matrix.d.ts +100 -0
- package/dist/testing/lifecycle-matrix.js +149 -0
- package/dist/testing/lifecycle-matrix.js.map +1 -0
- package/dist/transfer/backup.js +4 -4
- package/dist/transfer/capsule-export.js +4 -4
- package/dist/transfer/capsule-import.js +3 -3
- package/dist/verified-recall.js +6 -6
- package/package.json +22 -2
- package/src/access-http-lcm-compaction.ts +116 -0
- package/src/access-http.test.ts +218 -0
- package/src/access-http.ts +8 -8
- package/src/access-schema-pi.test.ts +9 -0
- package/src/access-schema.ts +29 -4
- package/src/access-surface-catalog.test.ts +1 -0
- package/src/meetings/recall-exclusion.test.ts +4 -2
- package/src/orchestration/generic-recall-paths.ts +119 -0
- package/src/orchestration/namespace-read-fanout.ts +0 -12
- package/src/orchestration/orchestrator-helpers.ts +0 -35
- package/src/orchestration/recall-internal.ts +6 -6
- package/src/orchestration/recall-search-pipeline.test.ts +194 -28
- package/src/orchestration/recall-search-pipeline.ts +39 -89
- package/src/orchestrator.ts +5 -17
- package/src/recall-cold-deadline.test.ts +11 -13
- package/src/session-namespace-bindings.test.ts +358 -0
- package/src/session-namespace-bindings.ts +301 -0
- package/src/testing/lifecycle-matrix.ts +17 -7
- package/src/testing/subjects/generic-recall-paths.test.ts +157 -0
- package/dist/chunk-32XTXKIA.js.map +0 -1
- package/dist/chunk-FR75B4UU.js.map +0 -1
- package/dist/chunk-P25IPRXP.js.map +0 -1
- package/src/recall/archive-scoring.ts +0 -544
- /package/dist/{capsule-crypto-7FJQINUR.js.map → access-http-lcm-compaction.js.map} +0 -0
- /package/dist/{auto-sync-5OE5QOZB.js.map → auto-sync-UPTUVE4X.js.map} +0 -0
- /package/dist/{chunk-JBPKEARU.js.map → chunk-2QSZNTDO.js.map} +0 -0
- /package/dist/{chunk-BL4JHZSO.js.map → chunk-2XP3PWL3.js.map} +0 -0
- /package/dist/{chunk-AQ2ZQYDI.js.map → chunk-4KKV7W62.js.map} +0 -0
- /package/dist/{chunk-2PHX3I5C.js.map → chunk-6NNNURLK.js.map} +0 -0
- /package/dist/{chunk-BLAKS3CP.js.map → chunk-77CNV7DY.js.map} +0 -0
- /package/dist/{chunk-TVVEYCNW.js.map → chunk-7K5Q6COX.js.map} +0 -0
- /package/dist/{chunk-227UFSEQ.js.map → chunk-7RZJWZ46.js.map} +0 -0
- /package/dist/{chunk-WIGBTWXA.js.map → chunk-7XXCIO6X.js.map} +0 -0
- /package/dist/{chunk-7CPOZH6Y.js.map → chunk-AJ7QCSIS.js.map} +0 -0
- /package/dist/{chunk-2NLLXCJG.js.map → chunk-BXLOS5AJ.js.map} +0 -0
- /package/dist/{chunk-X7Y7WX73.js.map → chunk-DQEMWVMT.js.map} +0 -0
- /package/dist/{chunk-UMFLAACL.js.map → chunk-E6EAB4J6.js.map} +0 -0
- /package/dist/{chunk-WSEA52RI.js.map → chunk-EXM2Q555.js.map} +0 -0
- /package/dist/{chunk-G6MGAE36.js.map → chunk-F6LSNPPB.js.map} +0 -0
- /package/dist/{chunk-7KXQ44PA.js.map → chunk-FE5FKTCI.js.map} +0 -0
- /package/dist/{chunk-5J7HJ7RT.js.map → chunk-H2PBM562.js.map} +0 -0
- /package/dist/{chunk-OIE242WM.js.map → chunk-HBVOJNV4.js.map} +0 -0
- /package/dist/{chunk-PS5OG75R.js.map → chunk-IHMXPG4P.js.map} +0 -0
- /package/dist/{chunk-3UOSVTFR.js.map → chunk-JCVQV6QX.js.map} +0 -0
- /package/dist/{chunk-NY6W6CJW.js.map → chunk-KPWLZBXZ.js.map} +0 -0
- /package/dist/{chunk-W33DEUKR.js.map → chunk-LIIQPDFN.js.map} +0 -0
- /package/dist/{chunk-D7MAWMMK.js.map → chunk-M2KGXXTL.js.map} +0 -0
- /package/dist/{chunk-UOURUMBN.js.map → chunk-MIFF37NN.js.map} +0 -0
- /package/dist/{chunk-37VPMR4E.js.map → chunk-NKDVXEFU.js.map} +0 -0
- /package/dist/{chunk-ZPUFQGUF.js.map → chunk-PQPSZICJ.js.map} +0 -0
- /package/dist/{chunk-ES36HTSC.js.map → chunk-PTN6UAUA.js.map} +0 -0
- /package/dist/{chunk-S2BBISHU.js.map → chunk-RYHWZ52A.js.map} +0 -0
- /package/dist/{chunk-ZN4UZWMT.js.map → chunk-SK3EYPKC.js.map} +0 -0
- /package/dist/{chunk-TPYZ727G.js.map → chunk-SN3ZESWQ.js.map} +0 -0
- /package/dist/{chunk-BUK2FXOL.js.map → chunk-TKBDJTXG.js.map} +0 -0
- /package/dist/{chunk-4B77XSG5.js.map → chunk-UV72DEZD.js.map} +0 -0
- /package/dist/{chunk-K4DP5KZA.js.map → chunk-UZK7VVPD.js.map} +0 -0
- /package/dist/{chunk-KQAFEZQX.js.map → chunk-VDX2J7OX.js.map} +0 -0
- /package/dist/{chunk-SSYBI43M.js.map → chunk-VGEH3STZ.js.map} +0 -0
- /package/dist/{chunk-NRV4Y3PM.js.map → chunk-W4FBGYGK.js.map} +0 -0
- /package/dist/{chunk-IR4LGIH6.js.map → chunk-WMDRLTNA.js.map} +0 -0
- /package/dist/{chunk-MU7ZHSZE.js.map → chunk-WZFAPHIK.js.map} +0 -0
- /package/dist/{chunk-JA4HEXV7.js.map → chunk-XAAIUXJO.js.map} +0 -0
- /package/dist/{chunk-VPSAVXHM.js.map → chunk-XNUBF6RF.js.map} +0 -0
- /package/dist/{chunk-3CHQZVAL.js.map → chunk-Y6E37WRG.js.map} +0 -0
- /package/dist/{chunk-E5A6C4A5.js.map → chunk-YN4AUGNF.js.map} +0 -0
- /package/dist/{chunk-EZ25VE3G.js.map → chunk-YNDLCWXS.js.map} +0 -0
- /package/dist/{chunk-7IGWPXVC.js.map → chunk-ZHP4SUPB.js.map} +0 -0
- /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/`
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
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
|
|
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
|
-
|
|
230
|
+
nodeTest(name, fn);
|
|
221
231
|
};
|
|
222
232
|
|
|
223
233
|
const defaultRegisterSkipped: MatrixSkipRegistrar = (name, reason) => {
|
|
224
|
-
|
|
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);
|