修复DB执行器旧版残留导致停用整厂假成功:内容感知落盘+DB写失败不报已重载

This commit is contained in:
youpaishidifu
2026-10-20 09:21:41 +08:00
parent fb7015ff6c
commit 7778a60924
+38 -3
View File
@@ -409,11 +409,36 @@ async function processOutbox(ctx: any): Promise<void> {
const depth = queueDepth()
fileLog(`DB 写结果 op=${op}: ${res},队列剩余=${depth}`)
// ── 堵假成功(2026-10-20 修):DB 写失败时不维护状态、不写「成功 flush」──────
// 否则 TUI 侧照常热重载并 toast「已重载」,但 catalog 压根没改(模型安然无恙)。
const s = String(res)
const failed =
s.startsWith("unknown op") ||
s.startsWith("spawn-fail") ||
s.startsWith("Traceback") ||
/^rc=[1-9]/.test(s)
if (failed) {
fileLog(`✗ DB 写未生效 op=${op}: ${s.slice(0, 300)}`)
if (s.startsWith("unknown op")) {
ensureDbExec()
fileLog("已按当前插件版本重写 DB 执行器(磁盘为旧版本缺新 op),请重新执行该操作")
}
try {
writeFileSync(
FLUSH,
JSON.stringify({ at: Date.now(), lastOp: op, serverReload: false, error: `DB 写未生效: ${s.slice(0, 160)}` }),
)
fileLog("已写「失败 flush」标记(TUI 会提示失败,不报已重载): tag=" + op)
} catch (e: any) {
fileLog("失败 flush 标记写入失败: " + (e && e.message ? e.message : String(e)))
}
return
}
// ── 维护持久化停用状态(只有 DB 真实进入目标态才动)────────────────────
// provider 级 → cfg.json 的「以下是停用列表」(用户可见可手改)
// modelID 级 → model-manager.disabled.json 镜像
try {
const s = String(res)
const prov = payload.provider
if (op === "disable_all" && (s.startsWith("disabled_all ") || s.startsWith("already empty"))) {
const list = readStopList()
@@ -611,10 +636,20 @@ else:
// 把 DB 执行器落盘(首次 setup 时写一次,幂等)
function ensureDbExec(): void {
// 内容感知落盘(2026-10-20 修):旧版只判 existsSync → 插件升级后磁盘残留旧执行器,
// 新 op(disable_all/remove_provider)打过去报 unknown op,DB 没写却照报「已重载」= 假成功。
try {
if (!existsSync(DB_EXEC)) {
let cur: string | null = null
if (existsSync(DB_EXEC)) {
try {
cur = readFileSync(DB_EXEC, "utf-8")
} catch {
cur = null
}
}
if (cur !== DB_EXEC_SRC) {
writeFileSync(DB_EXEC, DB_EXEC_SRC, "utf-8")
fileLog("DB 执行器已落盘 " + DB_EXEC)
fileLog(cur === null ? "DB 执行器已落盘 " + DB_EXEC : "DB 执行器已更新(磁盘为旧版本,已强制重写)")
}
} catch (e: any) {
fileLog("DB 执行器落盘失败: " + (e && e.message ? e.message : String(e)))