diff --git a/maintenance/extraction-controller.js b/maintenance/extraction-controller.js index 618b791..20d3b36 100644 --- a/maintenance/extraction-controller.js +++ b/maintenance/extraction-controller.js @@ -843,7 +843,7 @@ export async function executeExtractionBatchController( "AI 生成中", `${preview} [${receivedChars}字]`, "running", - { noticeMarquee: true }, + { syncRuntime: false, noticeMarquee: true }, ); }, }); diff --git a/retrieval/recall-controller.js b/retrieval/recall-controller.js index d2b915a..8e1f5bd 100644 --- a/retrieval/recall-controller.js +++ b/retrieval/recall-controller.js @@ -688,16 +688,16 @@ export async function runRecallController(runtime, options = {}) { schema: runtime.getSchema(), signal: recallSignal, settings, - onStreamProgress: ({ previewText, receivedChars }) => { - const preview = - previewText?.length > 60 - ? "…" + previewText.slice(-60) - : previewText || ""; - runtime.setLastRecallStatus( - "AI 生成中", - `${preview} [${receivedChars}字]`, - "running", - { syncRuntime: true, noticeMarquee: true }, + onStreamProgress: ({ previewText, receivedChars }) => { + const preview = + previewText?.length > 60 + ? "…" + previewText.slice(-60) + : previewText || ""; + runtime.setLastRecallStatus( + "AI 生成中", + `${preview} [${receivedChars}字]`, + "running", + { syncRuntime: false, noticeMarquee: true }, ); }, options: runtime.buildRecallRetrieveOptions(settings, context), diff --git a/ui/panel.js b/ui/panel.js index 9a66d63..61ede94 100644 --- a/ui/panel.js +++ b/ui/panel.js @@ -353,6 +353,9 @@ let fetchedDirectEmbeddingModels = []; let viewportSyncBound = false; let popupRuntimePromise = null; const GRAPH_LIVE_REFRESH_THROTTLE_MS = 240; +let _pendingRafRefreshId = null; +let _lastRafRefreshAt = 0; +const PANEL_LIVE_STATE_REFRESH_MIN_MS = 80; let pendingVisibleGraphRefreshTimer = null; let pendingVisibleGraphRefreshToken = ""; let pendingVisibleGraphRefreshForce = false; @@ -1282,6 +1285,30 @@ export function updatePanelTheme(themeName) { export function refreshLiveState() { if (!overlayEl?.classList.contains("active")) return; + + const now = Date.now(); + const elapsed = now - _lastRafRefreshAt; + + if (elapsed < PANEL_LIVE_STATE_REFRESH_MIN_MS) { + if (!_pendingRafRefreshId) { + _pendingRafRefreshId = requestAnimationFrame(() => { + _pendingRafRefreshId = null; + _lastRafRefreshAt = Date.now(); + _doRefreshLiveState(); + }); + } + return; + } + + if (_pendingRafRefreshId) { + cancelAnimationFrame(_pendingRafRefreshId); + _pendingRafRefreshId = null; + } + _lastRafRefreshAt = now; + _doRefreshLiveState(); +} + +function _doRefreshLiveState() { _applyGraphRuntimeConfig(_getSettings?.() || {}); _refreshRuntimeStatus(); _refreshNativeRolloutStatusUi(_getSettings?.() || {});