继续收敛前端 IPC 错误正文

保留模板权限、Direct 订阅和剪贴板失败详情

补充前端回归测试与错误处理文档
This commit is contained in:
kdletters
2026-10-05 21:09:20 +08:00
parent 8c4486f9f1
commit 0a249dff3a
4 changed files with 16 additions and 3 deletions
@@ -2,6 +2,8 @@ import { writeText } from '@tauri-apps/plugin-clipboard-manager';
import { Copy } from 'lucide-react';
import { useState } from 'react';
import { visibleClientErrorMessage } from '../../../services/errorReporting';
type CopyState = 'idle' | 'copied' | 'failed';
export function UiEditorCopyPathButton({
@@ -15,16 +17,21 @@ export function UiEditorCopyPathButton({
relativePath: string;
value: CopyState;
}>({ relativePath, value: 'idle' });
const [copyError, setCopyError] = useState('');
const value =
copyState.relativePath === relativePath ? copyState.value : 'idle';
async function copyPath() {
setCopyState({ relativePath, value: 'idle' });
setCopyError('');
try {
await writeText(relativePath);
setCopyState({ relativePath, value: 'copied' });
} catch {
} catch (error) {
setCopyState({ relativePath, value: 'failed' });
setCopyError(
`复制失败:${visibleClientErrorMessage(error)};请手动复制路径。`,
);
}
}
@@ -32,7 +39,7 @@ export function UiEditorCopyPathButton({
<>
{value === 'failed' ? (
<p className="mt-2 text-xs text-red-600" role="alert">
复制失败,请手动复制路径。
{copyError || '复制失败,请手动复制路径。'}
</p>
) : null}
<button
@@ -1043,7 +1043,11 @@ describe('UiEditorPage', () => {
);
fireEvent.click(await screen.findByRole('button', { name: '复制路径' }));
expect(await screen.findByText('复制失败,请手动复制路径。')).toBeTruthy();
expect(
await screen.findByText(
'复制失败:clipboard unavailable;请手动复制路径。',
),
).toBeTruthy();
});
it.each([
['manual', 'saved', 1],
@@ -133,6 +133,7 @@ DirectProject 已经解决过同一类问题([`【ADR】DirectProject命令接
- 旧版已落盘的通用“执行通道中断”文本无法恢复历史原因,读取时明确追加“宿主未提供具体错误正文”;新事件只在确实没有 detail 时使用同样标记。
- 画板/模板/图片分离/参考图/External Editor/资源编辑/项目快照/错误报告等外围 HTTP 入口也遵循同一出口:读取有限响应正文,保留状态码、服务端 message/code 和操作上下文,凭据、URL、路径按统一规则脱敏;不能因为不是 Direct 回合主链就回到“HTTP N”兜底。
- 模板库权限探测和 Direct 线程订阅/consume/bootstrap 属于用户可见的前端状态边界:权限/IPC 失败可以关闭入口或结束订阅,但必须同时保留安全错误正文;禁止用空 catch、只 settle 锚点或清空状态来吞掉认证、网络和 IPC 原因。
- UI 编辑器剪贴板、文件选择、预览等原生 IPC 操作的失败提示也必须经过 `visibleClientErrorMessage`;操作指引可以保留,但不能覆盖原生错误正文。
## 后果与边界
@@ -54,3 +54,4 @@ DirectProject 回合失败在确认不是客户端内部不可归类故障时,
- 新增/通过:外部 MCP HTTP 401/429 定向 2 项、前端 Direct/Runtime 错误正文 25 项、旧历史通用中断脱敏回归 1 项;认证 Rust 定向 19 项、素材上传响应错误定向 1 项通过。`appSurface` 全套仍有环境/fixture 相关失败,不能据此宣称全绿。
- 继续扫描又发现画板项目/资产下载、模板库、图片分离、参考图上传、External Editor 生成恢复、资源编辑上传/轮询、项目快照和错误报告提交仍有“HTTP 只有编号”或未脱敏正文路径;已统一补上状态码 + 有界正文 + 精确脱敏。资源编辑拒绝原因继续复用既有 `details.message` 解析,避免丢掉平台具体原因。
- 前端继续发现两个静默出口:模板库权限检查失败会直接清空入口,Direct 线程订阅/consume/bootstrap 的 IPC 失败会只 settle anchor 而不显示正文;现分别保留权限检查错误,并把订阅链错误正文送入项目状态栏/运行错误出口。认证失败回归已验证显示 `authentication-required`,不再变成泛化“执行失败,请稍后重试”。
- UI 编辑器复制路径的原生剪贴板 IPC 失败也曾只显示“复制失败,请手动复制路径”,现保留脱敏后的剪贴板错误正文并同时给出手动复制指引。