6f7ccc2832
外部 MCP HTTP 错误返回状态、错误码和中文正文 认证、素材上传和发行发布保留上游 401/403/5xx 详情 精确脱敏 Direct 错误并标记旧历史缺失正文 补充回归测试、诊断文档和真实客户端启动验证
52 lines
1.9 KiB
TypeScript
52 lines
1.9 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
||
|
||
import { projectRuntimeVisibleError } from '../src/features/agent-runtime/model';
|
||
|
||
describe('Agent Runtime 错误正文', () => {
|
||
it('终态未知时保留连接层的具体 detail', () => {
|
||
const text = projectRuntimeVisibleError(
|
||
'codex-app-server-terminal-unknown: HTTP 503 upstream overloaded;https://provider.example/private',
|
||
'陶泥儿智能创作',
|
||
);
|
||
|
||
expect(text).toContain('HTTP 503');
|
||
expect(text).toContain('upstream overloaded');
|
||
expect(text).not.toContain('provider.example');
|
||
});
|
||
|
||
it('原生分类映射不吞掉后续的状态和错误正文', () => {
|
||
const text = projectRuntimeVisibleError(
|
||
'provider failed kind=codex-app-server-unauthorized status=401 detail=invalid token',
|
||
'陶泥儿智能创作',
|
||
);
|
||
|
||
expect(text).toContain('鉴权失败');
|
||
expect(text).toContain('status=401');
|
||
expect(text).toContain('detail=invalid token');
|
||
});
|
||
|
||
it('正文带敏感字段时只替换敏感值,不丢掉上游状态和原因', () => {
|
||
const text = projectRuntimeVisibleError(
|
||
'direct-codex-error: HTTP 502 upstream overloaded;authorization=Bearer provider-secret;https://provider.example/private;C:\\Users\\demo\\game',
|
||
'陶泥儿智能创作',
|
||
);
|
||
|
||
expect(text).toContain('HTTP 502');
|
||
expect(text).toContain('upstream overloaded');
|
||
expect(text).toContain('[已隐藏凭据]');
|
||
expect(text).not.toContain('provider-secret');
|
||
expect(text).not.toContain('provider.example');
|
||
expect(text).not.toContain('C:\\Users\\demo');
|
||
});
|
||
|
||
it('已知分类但宿主没有正文时明确标记正文缺失', () => {
|
||
const text = projectRuntimeVisibleError(
|
||
'kind=codex-app-server-unauthorized',
|
||
'陶泥儿智能创作',
|
||
);
|
||
|
||
expect(text).toContain('鉴权失败');
|
||
expect(text).toContain('宿主未提供具体错误正文');
|
||
});
|
||
});
|