统一智能体对话层级并完善素材导出与文档预览
Project CI / AI game creator shell Rust shard 3/4 (pull_request) Failing after 2m44s
Project CI / AI game creator shell Rust shard 1/4 (pull_request) Failing after 2m45s
Project CI / AI game creator shell Rust shard 2/4 (pull_request) Failing after 2m46s
Project CI / AI game creator shell Rust shard 4/4 (pull_request) Failing after 2m49s
Project CI / AI game creator shell Rust smoke (pull_request) Successful in 1m53s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 3m18s
Project CI / Frontend tests (pull_request) Failing after 4m6s
Project CI / Native shell tests (pull_request) Successful in 6m12s
Project CI / Repository checks (pull_request) Failing after 3m48s
Project CI / Backend tests (pull_request) Successful in 7m8s
Project CI / AI game creator shell web tests (pull_request) Failing after 3m59s

当前Agent与策划Agent共用正文和过程表现组件,统一思考及工具调用的小字号浅色样式
素材工具栏按实际动作分组,导出紧邻删除并修复空分组重复分隔线
文档与代码使用共享Markdown预览和代码高亮,复用按需读取与缓存
移除未调用的活跃回合查询命令,保留正式快照恢复链路
补充回归用例并同步技术方案和团队约定
This commit is contained in:
2026-09-16 03:59:27 +08:00
parent d3c117de01
commit 5cd02aa8b0
37 changed files with 1439 additions and 239 deletions
@@ -0,0 +1,17 @@
# 文档素材 Markdown 预览实施计划
- Date: 2026-09-16
- Status: implemented-awaiting-validation
- Milestone: `【里程碑】文档素材Markdown预览-2026-09-16.md`
## 边界与顺序
1. 扩展现有 Markdown 渲染器的代码高亮,未知语言、大正文安全降级;文档模式保留原始空行。
2. 用资源现有预览类型和扩展名生成 Markdown;代码只放行 `detail` 读取。
3. 工具栏挂载预览入口,复用 ThemedModal 和预览缓存展示加载/空/失败状态,身份变化关闭旧预览。
4. 补充格式转换、渲染和按需读取回归用例,不执行测试。
5. 执行 AGC TypeScript、编码、文档索引、CSS 语法与 diff 检查。
## 风险与回滚
重点检查高亮 class 不被自定义 code 渲染丢弃、Markdown 围栏不吞正文、弹窗 Esc 不误清画布选中、文档切换不串内容。回滚仅移除本次入口/渲染增量,保留此前工具栏修改,不改资源数据。
@@ -0,0 +1,23 @@
# 文档素材 Markdown 预览
- Version: 1
- Status: implemented-awaiting-validation
- Date: 2026-09-16
- Parent Spec: `docs/technical/【技术方案】AI游戏创作智能体App实施计划-2026-06-24.md` 的“文档与代码素材预览”。
## 范围与评审
单里程碑:在已有资源画布和 Markdown 渲染链路中增加只读文档/代码预览。
边界评审:沿用现有权限、scope 与缓存身份;不改 Rust/DTO/持久化数据;代码只在详情请求读取,卡片预取不变;未知语言与大文件退回普通代码,不执行源码。无前置里程碑。
## 验收
- 文档/代码有预览入口,其它素材无此入口;弹窗支持关闭与滚动。
- Markdown 标题、列表、表格可读;代码有语言高亮,反引号、缩进、空行不丢失。
- 代码可见性预取仍不读文件;显式详情复用现有队列。
- 加载、空文件、错误与切换身份不显示错误素材的正文。
- AGC 类型、编码、文档索引与 diff 检查通过。按用户此前约束不运行测试,补充回归用例,实机验收单列为待验证。
## 验收状态
已实现入口、弹窗、队列按需读取、Markdown 代码围栏与高亮;已通过 AGC TypeScript(含新增预览测试文件的静态类型检查)、编码、文档索引、CSS 语法和 diff 检查。回归用例未执行;原生客户端读取、弹窗焦点/滚动和视觉验收仍待验证,不进入下一里程碑。
@@ -18,6 +18,7 @@
- 修改范围保持聚焦;优先扩展现有系统、页面、组件、DTO 和脚本,不新建平行入口或业务真相。
- UI 开发优先复用现有公共组件;跨页面或跨端重复的视觉/交互模式应沉淀到 `packages/shared`,由现有页面迁移使用,禁止在业务页复制同类 UI。共享组件只承载通用表现与交互,不下沉领域规则、后端副作用或正式业务状态。
- AGC 当前 Agent 与策划 Agent 的消息层级共用 `packages/shared``AgentMessageContent`:正文使用 `body`,思考、中间输出与工具调用使用 `process`;宿主不按 Agent 类型重新定义过程字号和颜色,错误状态保留语义色。
- 后端遵循 `module-*``spacetime-module``spacetime-client``api-server``platform-*``shared-contracts` 的现役边界。
- 前端只负责表现、交互和临时 UI 状态;正式状态来自后端投影、API 或持久化契约。
- 对已明确退役且无现役调用方、公开契约、持久化迁移或活跃实例的对象,不写兼容实现、维持旧行为的测试、墓碑注释或墓碑文档。
@@ -1,5 +1,18 @@
# AI 游戏创作智能体 App 实施计划
## 资源卡选中工具栏与导出
- 共享选中工具栏按实际显示的快速编辑、编辑动作、改造、导出与宿主动作组生成分隔线;空组不产生分隔线,不依赖宿主 CSS 隐藏重复线。
- AGC 所有具有本地文件路径的素材都显示带文字的「导出」按钮,位于工具栏末组的「删除素材」之前,两者之间不插入分隔线;「重命名」继续保留在前面的常规动作组。工具栏宽度上限为 `min(92vw, 800px)`,窄屏仍可横向滚动。图片、视频、音频、动画、UI、文档及其它文件共用 `isResourceCanvasExportable`,不按媒体类型限制导出;无文件路径及虚拟项目版本不提供文件导出入口。
- 导出继续复用 `saveProjectResourcesToDisk`:原生保存对话框选择路径,`save_local_project_asset_file` 复制原始文件字节,不转图片、不重编码、不另建 IPC。后端继续校验源文件、敏感路径和目标路径;取消不写文件,失败通过工作台提示。
## 文档与代码素材预览
- 文档与代码素材选中工具栏提供「预览」,打开独立、可滚动的只读弹窗;关闭、切换素材或项目后不残留旧内容。加载中、空文件与读取失败分别呈现,允许重试可重试的错误。
- 复用资源预览队列、身份缓存、项目 scope、失效与权限校验,继续调用 `read_local_project_text_preview`。代码卡不做可见性预取,仅用户显式打开详情时读取;不新增 IPC,不扩大可读取文件范围,不增加编辑/保存能力。
- 文档正文统一使用现有 Markdown 渲染器;代码文件以按扩展名标注语言的 Markdown 围栏代码块呈现。围栏必须长于正文内的反引号串,正文空行与缩进保持原样,不把源码当 Markdown 正文或 HTML 执行。
- 现有 Markdown 渲染器统一提供代码高亮,保留 HTML 禁用及外链/图片安全策略;未知语言回退普通代码块。超大正文跳过高亮但不截断内容,避免流式对话或文件预览被高亮计算阻塞。
## DirectProject 用户消息契约验证
`chat_with_game_creator_direct_codex` 必须携带 `projectPath``prompt`、稳定的 `clientTurnId` 和完整 `userItem``creationType``attachments` 按实际输入传递。Rust 通过 `projectPath` 解析项目身份,不接收额外 `projectId`。界面测试必须核对 `userItem` 的消息身份、角色、正文及附件内容,拒绝回合用例仍验证实际返回的错误原因。重开项目的历史恢复测试使用 `read_direct_project_history_slice` 的 canonical raw items 与 `hasMore`,首屏 `limit: 20`。资源图和生成任务的读取继续遵守原有工作台恢复逻辑,不因聊天断言失败延迟、关闭或改变它们。
@@ -99,7 +99,7 @@ toolCalls?: DirectTurnToolCall[] | null;
- 耗时:单条工具 = `startedAt``updatedAt`,块头总用时 = 该回合所有工具的 `min(startedAt)``max(updatedAt)`。单条格式:`<1s``0.4s``<60s``12.3s`(整秒省略小数)、`≥60s``2m 5s`;块头格式:`42秒` / `4分钟` / `5分钟 45秒``startedAt` 为 0 或 `updatedAt < startedAt` 时不显示耗时(不显示 `0s` / 负数),耗时为 0 时同样不显示 `0s`
- 时间:块头显示该回合结束时间(`max(updatedAt)` 的本地 `HH:mm:ss`);同一回合能拿到用户消息时间(`updatedAt > 0`)时显示 `HH:mm:ss → HH:mm:ss`(发送 → 结束),取不到就只显示结束时间,不编造。
- 回合结束时间与耗时在正文下方右对齐;Direct 对话输入框提示统一为“描述你的想法,或 @ 引用素材”,引用按钮保留输入盒的 12px 内边距,不使用负边距贴边。
- 对话普通文字统一使用 `--platform-text-base`:用户与助手正文、工具摘要和输入输出、执行过程、发送时间及耗时同色,层级通过字号和字重表达。工具子元素继承容器颜色,失败状态保留错误色;输入提示使用主题弱文字色,禁用状态保原有反馈,不混用硬编码灰蓝、绿色或棕色
- 当前 Agent 与策划 Agent 共用 `packages/shared``AgentMessageContent` 表现组件:正文为 14px / `--platform-text-strong`,思考、中间输出和工具调用为 12px / `--platform-text-soft`。实时与历史思考共用同一个折叠入口;工具输入输出继承过程色,失败状态保留错误色。Markdown 标题、表格及代码高亮在过程区同步弱化,最终回复和文档预览仍保留正常排版,不按 Agent 类型复制样式。输入提示与禁用状态保原有反馈。
- Windows 命令展示:仅 `command` 卡片识别 `pwsh` / `powershell`(含完整路径、`.exe`、常见启动选项)的 `-Command` / `-c` 外层包装,摘要和展开输入只展示脚本正文,并解开单个 shell 参数的引用拼接。摘要优先读取已脱敏的 `detail.command`,再按首行 120 字符截断,避免历史摘要被可执行文件路径占满。无法识别的启动方式、`-File``-EncodedCommand`、普通命令和 MCP 输入原样展示;执行参数、持久化原文、脱敏和输出均不改变。
- 调试属性:块与行都带 `data-duration-ms`(原始毫秒,无法计算时为空串)与稳定 `data-testid`(块 `agent-tool-call-group`、行 `agent-tool-call-row`)。
- 必须用 `<button aria-expanded>` + `hidden` 控制展开(键盘可达、可读屏),块头与行都是按钮:`aria-label` = 汇总 / 行文案 + 耗时;默认折叠。