Add persistence and retrieval observability with native delta gating

This commit is contained in:
Youzini-afk
2026-04-21 20:32:03 +08:00
parent 5a8f563168
commit d2c3d1f5dd
8 changed files with 745 additions and 35 deletions

View File

@@ -16,6 +16,7 @@ function createRuntime(persistResult) {
};
let processedHistoryUpdates = 0;
let persistedGraphSnapshot = null;
let lastPersistDeltaOptions = null;
return {
graph,
@@ -35,6 +36,22 @@ function createRuntime(persistResult) {
cloneGraphSnapshot(value) {
return JSON.parse(JSON.stringify(value));
},
buildPersistDelta(_beforeSnapshot, _afterSnapshot, options = {}) {
lastPersistDeltaOptions = { ...(options || {}) };
return {
upsertNodes: [],
upsertEdges: [],
deleteNodeIds: [],
deleteEdgeIds: [],
tombstones: [],
countDelta: {
nodes: 0,
edges: 0,
tombstones: 0,
},
runtimeMetaPatch: {},
};
},
buildExtractionMessages() {
return [{ seq: 5, role: "assistant", content: "测试消息" }];
},
@@ -101,6 +118,9 @@ function createRuntime(persistResult) {
get persistedGraphSnapshot() {
return persistedGraphSnapshot;
},
get lastPersistDeltaOptions() {
return lastPersistDeltaOptions;
},
};
}
@@ -212,4 +232,85 @@ function createRuntime(persistResult) {
assert.equal(runtime.graph.historyState.lastBatchStatus.persistence, null);
}
{
const originalNativeBuilder = globalThis.__stBmeNativeBuildPersistDelta;
globalThis.__stBmeNativeBuildPersistDelta = () => ({
upsertNodes: [],
upsertEdges: [],
deleteNodeIds: [],
deleteEdgeIds: [],
tombstones: [],
runtimeMetaPatch: {},
});
const runtime = createRuntime({
saved: true,
queued: false,
blocked: false,
accepted: true,
reason: "indexeddb",
revision: 9,
saveMode: "indexeddb",
storageTier: "indexeddb",
});
const result = await executeExtractionBatchController(runtime, {
chat: [{ is_user: false, mes: "测试" }],
startIdx: 5,
endIdx: 5,
settings: {
persistUseNativeDelta: true,
graphNativeForceDisable: false,
nativeEngineFailOpen: true,
persistNativeDeltaThresholdRecords: 123,
persistNativeDeltaThresholdStructuralDelta: 45,
persistNativeDeltaThresholdSerializedChars: 6789,
persistNativeDeltaBridgeMode: "hash",
},
});
assert.equal(result.success, true);
assert.equal(runtime.lastPersistDeltaOptions.useNativeDelta, true);
assert.equal(runtime.lastPersistDeltaOptions.nativeFailOpen, true);
assert.equal(runtime.lastPersistDeltaOptions.persistNativeDeltaThresholdRecords, 123);
assert.equal(
runtime.lastPersistDeltaOptions.persistNativeDeltaThresholdStructuralDelta,
45,
);
assert.equal(
runtime.lastPersistDeltaOptions.persistNativeDeltaThresholdSerializedChars,
6789,
);
assert.equal(runtime.lastPersistDeltaOptions.persistNativeDeltaBridgeMode, "hash");
if (typeof originalNativeBuilder === "function") {
globalThis.__stBmeNativeBuildPersistDelta = originalNativeBuilder;
} else {
delete globalThis.__stBmeNativeBuildPersistDelta;
}
}
{
const runtime = createRuntime({
saved: true,
queued: false,
blocked: false,
accepted: true,
reason: "indexeddb",
revision: 10,
saveMode: "indexeddb",
storageTier: "indexeddb",
});
const result = await executeExtractionBatchController(runtime, {
chat: [{ is_user: false, mes: "测试" }],
startIdx: 5,
endIdx: 5,
settings: {
persistUseNativeDelta: true,
graphNativeForceDisable: true,
},
});
assert.equal(result.success, true);
assert.equal(runtime.lastPersistDeltaOptions.useNativeDelta, false);
}
console.log("extraction-persistence-gating tests passed");