diff --git a/modules/story-summary/story-summary.js b/modules/story-summary/story-summary.js index b10ce21..9cb242f 100644 --- a/modules/story-summary/story-summary.js +++ b/modules/story-summary/story-summary.js @@ -367,6 +367,18 @@ async function handleAnchorGenerate() { postToFrame({ type: "ANCHOR_GEN_PROGRESS", current, total, message }); }); + // Self-heal: if chunks are empty but boundary looks "already built", + // reset boundary so incremental L1 rebuild can start from floor 0. + const [meta, storageStats] = await Promise.all([ + getMeta(chatId), + getStorageStats(chatId), + ]); + const lastFloor = (chat?.length || 0) - 1; + if (storageStats.chunks === 0 && lastFloor >= 0 && (meta.lastChunkFloor ?? -1) >= lastFloor) { + await updateMeta(chatId, { lastChunkFloor: -1 }); + xbLog.warn(MODULE_ID, "Detected empty L1 chunks with full boundary, reset lastChunkFloor=-1"); + } + postToFrame({ type: "ANCHOR_GEN_PROGRESS", current: 0, total: 1, message: "向量化 L1..." }); const chunkResult = await buildIncrementalChunks({ vectorConfig: vectorCfg }); @@ -1157,7 +1169,7 @@ function updateFrameStatsAfterSummary(endMesId, merged) { // iframe 消息处理 // ═══════════════════════════════════════════════════════════════════════════ -function handleFrameMessage(event) { +async function handleFrameMessage(event) { const iframe = document.getElementById("xiaobaix-story-summary-iframe"); if (!isTrustedMessage(event, iframe, "LittleWhiteBox-StoryFrame")) return; @@ -1212,7 +1224,7 @@ function handleFrameMessage(event) { break; case "VECTOR_CLEAR": - handleClearVectors(); + await handleClearVectors(); break; case "VECTOR_CANCEL_GENERATE": @@ -1223,11 +1235,11 @@ function handleFrameMessage(event) { break; case "ANCHOR_GENERATE": - handleAnchorGenerate(); + await handleAnchorGenerate(); break; case "ANCHOR_CLEAR": - handleAnchorClear(); + await handleAnchorClear(); break; case "ANCHOR_CANCEL":