fix: 修复额度耗尽错误展示

问题:Token balance exhausted 被作为原始助手气泡展示,且额度确认可能跨会话复用。

修复:区分绝对余额与滚动额度,绑定当前会话失败 key,并补充真实消息结构与双会话回归测试。
This commit is contained in:
2026-08-08 19:34:31 +08:00
parent 52626b332d
commit d092132d86
5 changed files with 260 additions and 40 deletions

View File

@@ -1,5 +1,8 @@
import { describe, expect, it } from 'vitest';
import { getOpencodeErrorKind } from '../../shared/opencode-error-kind';
import {
getOpencodeErrorKind,
isOpencodeTokenBalanceExhausted,
} from '../../shared/opencode-error-kind';
describe('getOpencodeErrorKind', () => {
it('classifies a generic Works Square gateway authorization failure as invalid authentication', () => {
@@ -14,4 +17,20 @@ describe('getOpencodeErrorKind', () => {
])('classifies explicit quota evidence as exhausted: %s', (message) => {
expect(getOpencodeErrorKind(message)).toBe('quota_exhausted');
});
it.each([
'token_balance_exhausted',
'Token balance exhausted (request id: req-1)',
'works_square_gateway_authorize_failed: balance exhausted',
])('identifies authoritative token-balance exhaustion: %s', (message) => {
expect(isOpencodeTokenBalanceExhausted(message)).toBe(true);
});
it.each([
'Token quota exhausted for rolling 5-hour window',
'user quota is not enough',
'works_square_gateway_authorize_failed',
])('does not mistake other failures for token-balance exhaustion: %s', (message) => {
expect(isOpencodeTokenBalanceExhausted(message)).toBe(false);
});
});