Fix persistence pending gating and add repair actions

This commit is contained in:
Youzini-afk
2026-04-11 00:20:51 +08:00
parent b3d7399abe
commit f37c5de761
8 changed files with 356 additions and 24 deletions

View File

@@ -85,9 +85,27 @@ function normalizePersistenceStateRecord(persistResult = null) {
saved: persistResult?.saved === true,
queued,
blocked,
attempted: true,
};
}
function hasMeaningfulPersistenceRecord(persistence = null) {
if (!persistence || typeof persistence !== "object") return false;
if (persistence.attempted === true) return true;
const revision = Number(persistence?.revision || 0);
if (Number.isFinite(revision) && revision > 0) return true;
if (String(persistence?.storageTier || "").trim() && persistence.storageTier !== "none") {
return true;
}
if (String(persistence?.saveMode || "").trim()) return true;
if (String(persistence?.reason || "").trim()) return true;
return (
persistence.saved === true ||
persistence.queued === true ||
persistence.blocked === true
);
}
function cloneSerializable(value, fallback = null) {
try {
return JSON.parse(JSON.stringify(value));
@@ -346,13 +364,15 @@ function getPendingPersistenceGateInfo(runtime) {
const persistence = batchStatus?.persistence || null;
const pendingPersist = runtime?.getGraphPersistenceState?.()?.pendingPersist === true;
const accepted = isPersistenceRevisionAccepted(runtime, persistence);
if (!pendingPersist && (!persistence || accepted)) {
const attempted = hasMeaningfulPersistenceRecord(persistence);
if (!pendingPersist && (!attempted || accepted)) {
return null;
}
return {
pendingPersist,
accepted,
attempted,
outcome: String(persistence?.outcome || ""),
reason: String(persistence?.reason || ""),
revision: Number.isFinite(Number(persistence?.revision))
@@ -387,7 +407,7 @@ function formatPendingPersistenceGateMessage(runtime, operationLabel = "当前
Number.isFinite(Number(gate.revision)) && Number(gate.revision) > 0
? ` · rev ${Number(gate.revision)}`
: "";
return `${operationLabel}已暂停:上一批持久化尚未确认,请先重试持久化或触发恢复${revision}${reason}`;
return `${operationLabel}已暂停:上一批持久化尚未确认,请先使用“重试持久化”或“重新探测图谱”${revision}${reason}`;
}
export function resolveAutoExtractionPlanController(
@@ -571,6 +591,15 @@ export async function executeExtractionBatchController(
"failed",
result?.error || "提取阶段未返回有效操作",
);
runtime.setBatchStageOutcome(
batchStatus,
"finalize",
"failed",
"提取阶段失败,未进入持久化",
);
batchStatus.persistence = null;
batchStatus.historyAdvanceAllowed = false;
batchStatus.historyAdvanced = false;
runtime.finalizeBatchStatus(batchStatus, runtime.getExtractionCount());
runtime.getCurrentGraph().historyState.lastBatchStatus = batchStatus;
return {
@@ -852,7 +881,7 @@ export async function onManualExtractController(runtime, options = {}) {
syncRuntime: true,
},
);
runtime.toastr.warning("上一批持久化尚未确认,请先重试持久化或执行恢复");
runtime.toastr.warning("上一批持久化尚未确认,请先点“重试持久化”或“重新探测图谱”");
return;
}
if (!(await runtime.recoverHistoryIfNeeded("manual-extract"))) return;