fix(phase2): restore agent streams and persist extension installations

This commit is contained in:
2026-09-06 02:21:27 +08:00
parent 9497519e8b
commit 7001794a22
35 changed files with 870 additions and 39 deletions
+1
View File
@@ -5,5 +5,6 @@
- `/tests/visual/index.html?theme=light`:将 theme 依次替换为 dark、sepia、paper-moments、ocean-blue、midnight-purple。检查输入、禁用、焦点、悬停、展开/折叠、Markdown、图表及长标识;在宽屏和窄窗口重复。
- `/tests/visual/index.html?case=dialog`:检查满视口遮罩、背景无法滚动、内部长内容可滚动、Tab 焦点限定、Escape 关闭与再次打开。
- `/tests/visual/index.html?case=editor`:逐字输入行内代码;先输入两个反引号、向左移再填字;连续普通/软换行;输入法提交;选区替换;撤销/重做。编辑器单元测试另覆盖 Markdown 序列化往返。
- `/tests/visual/mermaid-matrix.html`:真实 Mermaid(无渲染 mock)的 6 图型 × 6 主题矩阵。顶部报告检查结果;加 `?theme=paper-moments` 可查看单主题外观。
运行自动回归:`pnpm test`。AppDialog 测试覆盖滚动锁引用计数、恢复焦点、禁止隐式关闭;主题预览矩阵覆盖六主题的实际共享 CSS、控件状态和 CSP/无脚本隔离。自动结构检查不代替浏览器截图、布局和对比度检查。
+38
View File
@@ -0,0 +1,38 @@
<!doctype html><html><head><meta charset="utf-8"><title>Mermaid 真实渲染验收</title></head>
<body><h1>Mermaid 真实渲染验收</h1><p id="status">运行中</p><main id="results"></main>
<script type="module">
import { renderMermaid } from '/src/services/mermaidService.ts';
import { getCommunityThemePreviewCss, mockCommunityThemes } from '/src/services/themePackageService.ts';
import '/src/styles/tokens.css';
import '/src/styles/features.css';
const fixtures = {
flowchart: 'flowchart TD\n A[开始] --> B[完成]',
sequence: 'sequenceDiagram\n participant A as 用户\n participant B as 服务\n A->>B: 请求\n B-->>A: 结果',
class: 'classDiagram\n class Note {\n +String title\n }\n class Vault\n Vault --> Note',
state: 'stateDiagram-v2\n [*] --> Ready\n Ready --> Done\n Done --> [*]',
er: 'erDiagram\n VAULT ||--o{ NOTE : contains',
gantt: 'gantt\n title Plan\n dateFormat YYYY-MM-DD\n section Work\n Build :a, 2026-09-01, 2d',
};
const allThemes = [{theme_id:'light',is_dark:false},{theme_id:'dark',is_dark:true},{theme_id:'sepia',is_dark:false},...mockCommunityThemes];
const requested = new URLSearchParams(location.search).get('theme');
const themes = requested ? allThemes.filter(t=>t.theme_id===requested) : allThemes;
const style = document.createElement('style'); document.head.append(style);
const results = [];
for (const theme of themes) {
document.documentElement.dataset.theme = theme.theme_id;
style.textContent = getCommunityThemePreviewCss(theme.theme_id) || '';
for (const [type,source] of Object.entries(fixtures)) {
const rendered = await renderMermaid(source,{theme:theme.is_dark?'dark':'light'});
const article = document.createElement('article'); article.className='item-card';
const label = document.createElement('h2'); label.textContent=theme.theme_id+' / '+type;
const preview = document.createElement('div'); preview.innerHTML=rendered.svg; preview.style.overflow='auto';
article.append(label,preview); document.querySelector('#results').append(article);
const svg=preview.querySelector('svg');
const valid = !rendered.warnings.length && svg && svg.getBoundingClientRect().height>0 && svg.textContent.trim().length>0 && !svg.querySelector('.error-icon');
results.push({theme:theme.theme_id,type,passed:Boolean(valid),warnings:rendered.warnings});
article.dataset.passed=String(Boolean(valid));
}
}
document.querySelector('#status').textContent=JSON.stringify({passed:results.filter(r=>r.passed).length,total:results.length,results});
document.documentElement.dataset.complete='true';
</script></body></html>