From c4483d3b97a7016fa6826e93917dc771ab659566 Mon Sep 17 00:00:00 2001 From: lex Date: Tue, 12 May 2026 13:00:15 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9A(quota)refresh=20?= =?UTF-8?q?=E5=8A=A0=E7=89=88=E6=9C=AC=E5=8F=B7=20guard=20=E9=98=B2?= =?UTF-8?q?=E6=AD=A2=20provider=20=E5=88=87=E6=8D=A2=E6=97=B6=E6=97=A7?= =?UTF-8?q?=E8=AF=B7=E6=B1=82=E8=A6=86=E7=9B=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 60s setInterval 触发的 async refresh 与 providerID 变化的 createEffect refresh 可能并发;旧 fetch resolve 后会用过期数据覆盖当前 provider 的 显示。每次 refresh 自增 seq,await 后比对,stale 即丢弃。 --- .../src/cli/cmd/tui/feature-plugins/session/quota/view.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/opencode/src/cli/cmd/tui/feature-plugins/session/quota/view.tsx b/packages/opencode/src/cli/cmd/tui/feature-plugins/session/quota/view.tsx index 56acf7c590..e331191b44 100644 --- a/packages/opencode/src/cli/cmd/tui/feature-plugins/session/quota/view.tsx +++ b/packages/opencode/src/cli/cmd/tui/feature-plugins/session/quota/view.tsx @@ -87,7 +87,11 @@ export function QuotaView(props: { api: TuiPluginApi; session_id: string }) { } } + // 版本号 guard:providerID 切换或新一轮 refresh 启动时,旧的 in-flight + // 请求 resolve 后会被丢弃,避免用过期数据覆盖当前 provider 的显示。 + let refreshSeq = 0 async function refresh() { + const seq = ++refreshSeq const pid = providerID() if (!pid || !isCopilotMode(pid)) { setLabel("") @@ -97,6 +101,7 @@ export function QuotaView(props: { api: TuiPluginApi; session_id: string }) { // 注意:auth.json 位于 Global.Path.data(XDG_DATA_HOME), // 不能用 props.api.state.path.state(XDG_STATE_HOME),二者是不同目录。 const authEntry = await readCopilotAuthEntry(Global.Path.data) + if (seq !== refreshSeq) return const endpoint = resolveEndpoint({ providerConfig, authEntry }) if (!endpoint) { console.debug(`[quota] resolveEndpoint null providerID=${pid}`) @@ -104,6 +109,7 @@ export function QuotaView(props: { api: TuiPluginApi; session_id: string }) { return } const q = await fetchQuota(endpoint) + if (seq !== refreshSeq) return if (q) applyQuota(q) else setLabel("") }