feat/frontend-phase2-themes-trace-mermaid
main
traceService
ModelCallStarted
ModelCallCompleted
ModelCallFailed
TraceTimeline
themePackageService
ThemesView
mermaidService
securityLevel: 'strict'
MermaidBlock
MarkdownContent
PluginsView
PluginSettingsPanel
services/
features/
agent/TraceTimeline.vue
agent/AgentView.vue
themes/ThemesView.vue
plugins/PluginsView.vue
plugins/PluginSettingsPanel.vue
components/common/
MermaidBlock.vue
MarkdownContent.vue
CommandPalette.vue
stores/theme.ts
utils/markdown.ts
contracts/index.ts
mermaid@11.17.2
pnpm build
pnpm test
traceService.spec.ts
themePackageService.spec.ts
vue-tsc -b
pluginService
installed-themes
installed-themes-css-{theme_id}
active-custom-theme
PluginHostStatus
PluginCommand
PluginSettingField
PluginSettingsSchema
when
pluginContributionService
options
string[]
minimum
maximum
placeholder
PluginMcpPanel
@import
expression()
javascript:
css_entry
data:
configured
skipLibCheck: true
type-fest
.d.ts
skipLibCheck
@vue/tsconfig
type-fest@^4
git revert
实现第二阶段分工表中吉海燕负责的 P0/P1 前端能力。 - Agent Trace 可视化:新增 traceService 将扁平事件流折叠为树 (ModelCallStarted 区间内的工具/文本事件挂为子节点,运行级事件保持顶层), TraceTimeline 支持时间线/树两种视图、耗时统计与引用跳转。 - 主题包:新增 themePackageService(Web Mock Adapter), 校验 manifest 必填字段与 theme_id 格式,拒绝远程 css_entry; CSS 侧拒绝 @import / expression() / javascript:, 未通过校验的 CSS 不会注入页面。内置主题走 data-theme=light|dark|sepia, 自定义主题走 data-theme={theme_id} + 独立 style 节点。 ThemesView 增加“已安装/社区主题”两个标签页与导入、预览、卸载流程。 - Mermaid:新增 mermaidService(securityLevel: strict)与 MermaidBlock, markdown 渲染管线识别 mermaid 代码块;MarkdownContent 随亮/暗主题重渲染 (SVG 配色在渲染时烘焙,无法靠 CSS 变量事后调整)。 - 插件贡献 UI:PluginsView 增加“概览/命令/设置”标签页, PluginSettingsPanel 按 Schema 动态生成表单; secret 字段只写不读,仅展示 configured 状态,不进 store 也不回显。 与 main 上队友成果的整合(rebase 时处理): - 命令面板保留队友基于真实后端的实现(when 条件求值、效果白名单、 参数命令跳详情页),仅叠加我新增的主题/任务两条内置命令。 - 删除我先前的 pluginContributionService(mock 版), 统一改用队友已落地的 pluginService 真实接口; 相应修正表单以匹配真实契约(options 为 string[]、min/max 可空、无 placeholder)。 - 移除 contracts 中与队友重复的 PluginHostStatus / PluginCommand / PluginSettingField / PluginSettingsSchema 声明,以队友版本为准。 - PluginsView 概览页保留队友的 PluginMcpPanel,并补回被我改写时丢掉的空状态。 顺带修复: - 开启 skipLibCheck —— mermaid 11.17 把 type-fest 泄漏进了发布产物的 .d.ts,但只声明为自身 devDependency,vue-tsc -b 会因此报错。 验证:pnpm test 26 文件 / 113 测试通过(新增 traceService、 themePackageService 两个测试文件共 22 项);pnpm build 通过。
审阅版本:12869b5。
12869b5
本轮发现以下 6 项 P2 问题,需要修复并补充回归测试。
位置:frontend/src/features/themes/ThemesView.vue:45–49
frontend/src/features/themes/ThemesView.vue:45–49
确认安装时调用 generateThemeCss 生成演示配色,没有读取 manifest.css_entry 对应的文件。入口虽然接受 ZIP/CSS,后续却统一按 YAML 文本解析。
影响:YAML 可以显示安装成功,但实际安装的不是用户主题;ZIP/CSS 无法完成导入。
建议:实现真实包内容读取、校验和安装。尚未支持的格式应明确拒绝,演示入口不能作为已完成的主题导入交付。
位置:frontend/src/stores/theme.ts:99–105
frontend/src/stores/theme.ts:99–105
initTheme 未等待 loadCustomThemes 完成就调用 applyTheme(saved)。此时只有内置主题,自定义主题查找失败;加载完成后也没有重新应用。
补充测试已复现:自定义主题加载成功,但 currentThemeId 仍为 light。
建议:先加载自定义主题,再恢复保存的选择,并为主题不存在的情况提供回退。
位置:frontend/src/services/traceService.ts:33–50
frontend/src/services/traceService.ts:33–50
实现按 ModelCallStarted 与 ModelCallCompleted 之间的时间窗口归属工具事件。但真实后端先发送 ModelCallCompleted,再执行工具,并通过 parent_model_call_id 标明归属。
补充测试使用真实事件顺序后,工具节点全部落在顶层。
建议:使用 model_call_id、parent_model_call_id 和 tool_call_id 关联节点,而不是依赖事件相邻顺序;依据 ToolResult 更新调用状态,避免结束后仍显示 running。
位置:frontend/src/features/agent/TraceTimeline.vue:200–214
frontend/src/features/agent/TraceTimeline.vue:200–214
点击事件仅允许有 children 的节点展开,但详情区域要求节点没有 children 且已展开,导致叶子详情永远无法显示。
组件测试已复现:点击工具结果叶子节点后没有详情区域。
建议:允许叶子切换详情,并区分父节点的子树展开与自身数据查看。
位置:frontend/src/features/agent/AgentView.vue:121
frontend/src/features/agent/AgentView.vue:121
TraceTimeline 会发出 open-citation 事件,但 AgentView 没有监听,也未调用工作区打开笔记和定位 Block 的逻辑。
影响:引用显示为可点击,但点击后不会跳转。
建议:接入现有 Citation 定位流程,补充从 Trace 点击到对应笔记位置的集成测试。
位置:frontend/src/features/plugins/PluginsView.vue:62–79
frontend/src/features/plugins/PluginsView.vue:62–79
新增命令页始终发送空 arguments/context,没有根据 parameters 提供必填参数输入;返回的 navigate、refresh 效果也只是显示说明文本,没有执行导航或刷新。
影响:带必填参数的命令无法执行,其他命令可能显示成功但未完成预期界面操作。
建议:复用现有 PluginMcpPanel 的参数表单、when 判断和效果处理流程,避免两个入口行为不一致。
请修复上述问题并补充回归测试后,再次提交审阅。
No dependencies set.
The note is not visible to the blocked user.
改动内容
traceService,把扁平事件流折叠成树 ——ModelCallStarted与其ModelCallCompleted/ModelCallFailed之间的工具、文本、思考事件挂为子节点,运行级事件(RunStarted/RunCompleted/RunFailed)始终留在顶层。新增TraceTimeline组件,支持时间线/树两种视图、耗时与 token 统计、逐事件详情展开、引用点击跳转。themePackageService(Web Mock Adapter 实现 Theme Package Host Contract)。ThemesView增加「已安装/社区主题」两个标签页,含导入、检视结果确认、预览(临时应用后自动还原)、卸载流程。mermaidService(securityLevel: 'strict')与MermaidBlock组件(缩放、错误横幅、防陈旧异步渲染的 render token)。markdown 渲染管线识别 mermaid 代码块并交由服务渲染,DOMPurify 白名单放通 SVG 标签与属性。MarkdownContent监听主题变化并重渲染 —— SVG 配色在渲染时烘焙进产物,无法靠 CSS 变量事后调整。PluginsView增加「概览/命令/设置」标签页(按 Contribution 类型显隐);新增PluginSettingsPanel,按 Settings Schema 动态生成表单(string / number / boolean / select)。影响模块
services/:新增themePackageService、mermaidService、traceServicefeatures/:agent/TraceTimeline.vue(新增)、agent/AgentView.vue、themes/ThemesView.vue、plugins/PluginsView.vue、plugins/PluginSettingsPanel.vue(新增)components/common/:MermaidBlock.vue(新增)、MarkdownContent.vue、CommandPalette.vuestores/theme.ts:支持自定义主题与内置主题共存utils/markdown.ts:渲染管线接入 mermaidcontracts/index.ts:补充 Theme / Mermaid / Trace 相关类型(并清理与队友重复的声明)mermaid@11.17.2验证方式
pnpm build)pnpm test:26 文件 / 113 测试,新增traceService.spec.ts、themePackageService.spec.ts共 22 项)vue-tsc -b)接口或数据变更
pluginService接口。installed-themes、installed-themes-css-{theme_id}、active-custom-theme(仅存主题元数据与 CSS,不含任何凭据)。contracts/index.ts移除了我上一版重复添加的PluginHostStatus/PluginCommand/PluginSettingField/PluginSettingsSchema声明,以队友已合入的版本为准,对外类型不变。风险与恢复
when条件求值、效果白名单、带必填参数的命令跳详情页),我只叠加了两条内置命令。pluginContributionService(mock 版),统一改用队友已落地的pluginService真实接口,避免两套 service 并存。相应修正了表单以匹配真实契约(options为string[]、minimum/maximum可空、无placeholder字段)。PluginsView概览页保留了队友的PluginMcpPanel,并补回被我改写时丢掉的插件空状态。@import、expression()、javascript:,css_entry拒绝远程地址与data:;未通过校验的 CSS 不会注入页面(已有测试覆盖)。Plugin secret 字段只写不读 —— 仅展示configured状态,不写入 store、不落 localStorage、不回显明文。skipLibCheck: true:mermaid 11.17 把type-fest泄漏进了发布产物的.d.ts,却只声明为自身 devDependency,vue-tsc -b因此报 TS2307。这是 mermaid 的打包问题,skipLibCheck也是@vue/tsconfig的默认值。若不接受此改动,替代方案是显式装一个type-fest@^4devDependency。MarkdownContent的 chunk 增至约 1.5 MB(gzip 约 315 KB),各图表类型已由 mermaid 自身按需分包。如需进一步瘦身,可把mermaidService里的 mermaid 改为动态 import,我可以另开一个 PR 处理。git revert即可;新增文件与既有模块耦合面小,主题/Trace/Mermaid 三块可独立回退。关联 Issue
实现第二阶段分工表中吉海燕负责的 P0/P1 前端能力。 - Agent Trace 可视化:新增 traceService 将扁平事件流折叠为树 (ModelCallStarted 区间内的工具/文本事件挂为子节点,运行级事件保持顶层), TraceTimeline 支持时间线/树两种视图、耗时统计与引用跳转。 - 主题包:新增 themePackageService(Web Mock Adapter), 校验 manifest 必填字段与 theme_id 格式,拒绝远程 css_entry; CSS 侧拒绝 @import / expression() / javascript:, 未通过校验的 CSS 不会注入页面。内置主题走 data-theme=light|dark|sepia, 自定义主题走 data-theme={theme_id} + 独立 style 节点。 ThemesView 增加“已安装/社区主题”两个标签页与导入、预览、卸载流程。 - Mermaid:新增 mermaidService(securityLevel: strict)与 MermaidBlock, markdown 渲染管线识别 mermaid 代码块;MarkdownContent 随亮/暗主题重渲染 (SVG 配色在渲染时烘焙,无法靠 CSS 变量事后调整)。 - 插件贡献 UI:PluginsView 增加“概览/命令/设置”标签页, PluginSettingsPanel 按 Schema 动态生成表单; secret 字段只写不读,仅展示 configured 状态,不进 store 也不回显。 与 main 上队友成果的整合(rebase 时处理): - 命令面板保留队友基于真实后端的实现(when 条件求值、效果白名单、 参数命令跳详情页),仅叠加我新增的主题/任务两条内置命令。 - 删除我先前的 pluginContributionService(mock 版), 统一改用队友已落地的 pluginService 真实接口; 相应修正表单以匹配真实契约(options 为 string[]、min/max 可空、无 placeholder)。 - 移除 contracts 中与队友重复的 PluginHostStatus / PluginCommand / PluginSettingField / PluginSettingsSchema 声明,以队友版本为准。 - PluginsView 概览页保留队友的 PluginMcpPanel,并补回被我改写时丢掉的空状态。 顺带修复: - 开启 skipLibCheck —— mermaid 11.17 把 type-fest 泄漏进了发布产物的 .d.ts,但只声明为自身 devDependency,vue-tsc -b 会因此报错。 验证:pnpm test 26 文件 / 113 测试通过(新增 traceService、 themePackageService 两个测试文件共 22 项);pnpm build 通过。审阅结论:请求修改,暂不合并
审阅版本:
12869b5。本轮发现以下 6 项 P2 问题,需要修复并补充回归测试。
[P2] 主题导入未读取用户提供的 CSS
位置:
frontend/src/features/themes/ThemesView.vue:45–49确认安装时调用 generateThemeCss 生成演示配色,没有读取 manifest.css_entry 对应的文件。入口虽然接受 ZIP/CSS,后续却统一按 YAML 文本解析。
影响:YAML 可以显示安装成功,但实际安装的不是用户主题;ZIP/CSS 无法完成导入。
建议:实现真实包内容读取、校验和安装。尚未支持的格式应明确拒绝,演示入口不能作为已完成的主题导入交付。
[P2] 刷新页面后无法恢复自定义主题
位置:
frontend/src/stores/theme.ts:99–105initTheme 未等待 loadCustomThemes 完成就调用 applyTheme(saved)。此时只有内置主题,自定义主题查找失败;加载完成后也没有重新应用。
补充测试已复现:自定义主题加载成功,但 currentThemeId 仍为 light。
建议:先加载自定义主题,再恢复保存的选择,并为主题不存在的情况提供回退。
[P2] Trace 建树逻辑与真实后端事件顺序不一致
位置:
frontend/src/services/traceService.ts:33–50实现按 ModelCallStarted 与 ModelCallCompleted 之间的时间窗口归属工具事件。但真实后端先发送 ModelCallCompleted,再执行工具,并通过 parent_model_call_id 标明归属。
补充测试使用真实事件顺序后,工具节点全部落在顶层。
建议:使用 model_call_id、parent_model_call_id 和 tool_call_id 关联节点,而不是依赖事件相邻顺序;依据 ToolResult 更新调用状态,避免结束后仍显示 running。
[P2] 树形视图叶子节点无法展开详情
位置:
frontend/src/features/agent/TraceTimeline.vue:200–214点击事件仅允许有 children 的节点展开,但详情区域要求节点没有 children 且已展开,导致叶子详情永远无法显示。
组件测试已复现:点击工具结果叶子节点后没有详情区域。
建议:允许叶子切换详情,并区分父节点的子树展开与自身数据查看。
[P2] 引用点击未接入笔记定位流程
位置:
frontend/src/features/agent/AgentView.vue:121TraceTimeline 会发出 open-citation 事件,但 AgentView 没有监听,也未调用工作区打开笔记和定位 Block 的逻辑。
影响:引用显示为可点击,但点击后不会跳转。
建议:接入现有 Citation 定位流程,补充从 Trace 点击到对应笔记位置的集成测试。
[P2] 新命令页缺少参数输入和实际效果执行
位置:
frontend/src/features/plugins/PluginsView.vue:62–79新增命令页始终发送空 arguments/context,没有根据 parameters 提供必填参数输入;返回的 navigate、refresh 效果也只是显示说明文本,没有执行导航或刷新。
影响:带必填参数的命令无法执行,其他命令可能显示成功但未完成预期界面操作。
建议:复用现有 PluginMcpPanel 的参数表单、when 判断和效果处理流程,避免两个入口行为不一致。
验证情况
请修复上述问题并补充回归测试后,再次提交审阅。
Pull request closed