完善 AGC 对话流与工具调用,统一消息层级并新增文档预览 #375

Merged
suzmii merged 80 commits from feat/chat-codex-ui into master 2026-09-16 04:07:41 +08:00
Member

概要

完善 AGC 对话面板、回合恢复与素材工具栏:对话按唯一回合流展示,过程信息与最终正文明确分层,同时补齐素材导出及文档/代码预览。

主要改动

1. 对话流与回合状态

  • 以回合身份和有序流条目统一实时展示、历史回读与重进恢复,避免多条呈现链路重复输出。
  • 修复从首页重新进入项目时错误显示“回复已生成 / 正在提交回复”的状态残留。
  • 用户消息显示发送时间;回合结束时间精确到秒,耗时右对齐。
  • 回复完成后,中间输出和工具调用归入默认折叠的“执行过程”,最终回复单独保留。

2. 工具调用与输入区

  • 工具块支持展开查看每条调用的输入、输出、状态与耗时;连续工具按流顺序分组。
  • Windows 命令展示去掉可识别的 pwsh / powershell -Command 包装,仅展示命令正文;不改变执行参数与持久化原文。
  • 输入区补齐附件、终止、待发送队列、语音输入及推理强度选择,统一留白与引用按钮位置;语音能力不可用时禁用对应入口。
  • 保留工具内容脱敏、快照单调合并与落盘收尾。

3. 当前 Agent / 策划 Agent 共用视觉层级

  • 共用 packages/sharedAgentMessageContent,不按 Agent 类型复制表现逻辑。
  • 正文:14px、主题深色;思考 / 中间输出 / 工具调用:12px、主题浅色。
  • 实时和历史思考共用折叠入口;Markdown 标题、表格与代码在过程区同步弱化,展开后的工具详情保持一致。
  • 清理旧样式覆盖,执行状态卡也纳入过程层级;失败状态继续使用错误语义色。

4. 素材工具栏与文档预览

  • 分隔线由实际动作分组生成,空条件动作和嵌套 Fragment 不再产生空分组或重复分隔线。
  • 工具栏宽度上限扩至 800px;重命名保留原位,导出放在删除之前并与删除同组。
  • 所有具有实际文件路径的素材复用原文件导出入口。
  • 文档与代码增加独立预览弹窗:文档统一使用 Markdown,代码使用带语言标识的安全代码围栏。
  • 复用现有 Markdown 渲染器及读取队列、缓存与权限边界,补充代码高亮;未知语言和大正文安全降级。
  • 代码仅在打开详情时读取;预览支持加载、空内容、失败及可重试状态,切换资源或项目时关闭旧预览。

master 集成

  • 已合并 origin/mastera4a030dfb),合并提交为 d3c117de0
  • 保留 master 的错误反馈重试,同时确保失败路径也完成回合流快照刷新及持久化等待。
  • 移除未使用的重复活跃回合查询入口,继续复用现有正式快照恢复链路。

验证记录

已完成:

  • AGC 完整类型检查(含 skill-pack / 配置调用检查)。
  • Tauri 主程序 cargo check,编译通过;仍有 194 条编译警告。
  • 编码检查、文档索引检查、5 份相关 CSS 的语法解析及 git diff --check
  • 提交钩子的 ESLint / Prettier / Rustfmt。
  • 补充消息层级、工具栏分组、Markdown 预览及按需读取回归用例。
  • 扩展检查涉及的测试文件:与合并后的基线对比,均为 55 项既有类型错误,本次无新增;这不代表测试目录整体类型检查通过。

未执行 / 待验证:

  • 按本次约定未运行自动化测试。
  • 未完成真实 Agent 回合、Tauri 端交互和文档预览的实机联调。
  • 远端 CI 以本次推送后的实际结果为准,不以本地检查代替。

文档同步

已同步对话工具调用方案、AGC 实施方案、文档预览里程碑与实施计划,以及共享组件使用约定。

## 概要 完善 AGC 对话面板、回合恢复与素材工具栏:对话按唯一回合流展示,过程信息与最终正文明确分层,同时补齐素材导出及文档/代码预览。 ## 主要改动 ### 1. 对话流与回合状态 - 以回合身份和有序流条目统一实时展示、历史回读与重进恢复,避免多条呈现链路重复输出。 - 修复从首页重新进入项目时错误显示“回复已生成 / 正在提交回复”的状态残留。 - 用户消息显示发送时间;回合结束时间精确到秒,耗时右对齐。 - 回复完成后,中间输出和工具调用归入默认折叠的“执行过程”,最终回复单独保留。 ### 2. 工具调用与输入区 - 工具块支持展开查看每条调用的输入、输出、状态与耗时;连续工具按流顺序分组。 - Windows 命令展示去掉可识别的 `pwsh / powershell -Command` 包装,仅展示命令正文;不改变执行参数与持久化原文。 - 输入区补齐附件、终止、待发送队列、语音输入及推理强度选择,统一留白与引用按钮位置;语音能力不可用时禁用对应入口。 - 保留工具内容脱敏、快照单调合并与落盘收尾。 ### 3. 当前 Agent / 策划 Agent 共用视觉层级 - 共用 `packages/shared` 的 `AgentMessageContent`,不按 Agent 类型复制表现逻辑。 - **正文:14px、主题深色;思考 / 中间输出 / 工具调用:12px、主题浅色。** - 实时和历史思考共用折叠入口;Markdown 标题、表格与代码在过程区同步弱化,展开后的工具详情保持一致。 - 清理旧样式覆盖,执行状态卡也纳入过程层级;失败状态继续使用错误语义色。 ### 4. 素材工具栏与文档预览 - 分隔线由实际动作分组生成,空条件动作和嵌套 Fragment 不再产生空分组或重复分隔线。 - 工具栏宽度上限扩至 800px;重命名保留原位,导出放在删除之前并与删除同组。 - 所有具有实际文件路径的素材复用原文件导出入口。 - 文档与代码增加独立预览弹窗:文档统一使用 Markdown,代码使用带语言标识的安全代码围栏。 - 复用现有 Markdown 渲染器及读取队列、缓存与权限边界,补充代码高亮;未知语言和大正文安全降级。 - 代码仅在打开详情时读取;预览支持加载、空内容、失败及可重试状态,切换资源或项目时关闭旧预览。 ## master 集成 - 已合并 `origin/master`(`a4a030dfb`),合并提交为 `d3c117de0`。 - 保留 master 的错误反馈重试,同时确保失败路径也完成回合流快照刷新及持久化等待。 - 移除未使用的重复活跃回合查询入口,继续复用现有正式快照恢复链路。 ## 验证记录 已完成: - AGC 完整类型检查(含 skill-pack / 配置调用检查)。 - Tauri 主程序 `cargo check`,编译通过;仍有 194 条编译警告。 - 编码检查、文档索引检查、5 份相关 CSS 的语法解析及 `git diff --check`。 - 提交钩子的 ESLint / Prettier / Rustfmt。 - 补充消息层级、工具栏分组、Markdown 预览及按需读取回归用例。 - 扩展检查涉及的测试文件:与合并后的基线对比,均为 55 项既有类型错误,本次无新增;这不代表测试目录整体类型检查通过。 未执行 / 待验证: - 按本次约定未运行自动化测试。 - 未完成真实 Agent 回合、Tauri 端交互和文档预览的实机联调。 - 远端 CI 以本次推送后的实际结果为准,不以本地检查代替。 ## 文档同步 已同步对话工具调用方案、AGC 实施方案、文档预览里程碑与实施计划,以及共享组件使用约定。
suzmii added 32 commits 2026-09-15 19:46:32 +08:00
- ProjectSupervisorView:direct-codex 面板改成三段式(顶部极简条 / 唯一滚动区消息列表 / 文档流输入盒)
- ProjectSupervisorView:顶部只留状态点 + 状态文案(aria-live=polite)+ 设置齿轮,移除头像、标题、副标题、审批按钮与泥点钱包槽
- ProjectSupervisorView:新增 direct-codex 空态(线稿图标 + 主标题「你想让陶泥儿做什么游戏?」+ 短指令副标题),整体在消息区垂直水平居中
- ProjectSupervisorView:输入盒改成三行结构(`项目名` · `本地` 信息标签 / ResourceReferenceInput 文本区 / 控制排)
- ProjectSupervisorView:控制排左为 `+` 附件钮与 `@` 引用钮(都复用 composerRef.openPicker),右为模型下拉与圆形主色发送钮
- ProjectSupervisorView:新增 walletEntry 可选属性,透传到设置浮层的「泥点」行
- ProjectSupervisorSettingsDialog(新增):设置齿轮打开的独立浮层(role=dialog + aria-modal + Esc 关闭 + 点遮罩关闭),承载运行配置入口、操作权限入口与泥点
- approvalMode(新增):把「严格 / 风险 / 无」审批模式选项与文案抽成可复用模块
- ApprovalModeDialog(新增):审批模式对话框改成可复用组件,index.tsx 改为复用它
- project-development/index.tsx:`!uiEditorRoute` 的 game-workbench-chat 头部精简掉标题/审批按钮/钱包槽,并用 cloneElement 把 walletEntry 透传给 supervisor 元素
- project-development/index.tsx:`planningStartMode` 分支保持原样
- ConversationModelSelect:触发按钮只显示已选模型 displayName,未加载完时显示「模型」占位(菜单内加载提示保留)
- styles.css:消息列表去掉绝对定位与 196px/256px 底边留白,改成唯一滚动区
- styles.css:输入盒去掉绝对定位,改成文档流三行网格,成为唯一有边框的容器(1px 边框、14px 圆角)
- styles.css:助手消息去掉整块底色,用户消息保留右对齐浅底气泡 + 主色描边
- styles.css:新增顶栏、空态、设置浮层与暖色执行过程卡的样式区块,颜色全部取自现有 platform 变量
- styles.css:窄屏(760px/1000px 断点)下输入盒留在文档流并保留四周边距
- chatDialogFrameLayout.test.ts:把「输入区浮在消息列表之上」的旧契约改写成「输入盒在消息列表下方、文档流、列表无浮层留白」的新契约
- project-development.suite.ts:同步更新表单布局、提交按钮尺寸与钱包槽的断言,并新增空态 + 设置浮层用例
- styles.css:为 .game-workbench-chat .project-supervisor-surface 补 grid-row: 1 / -1,并就近说明原因
- styles.css:说明该几何必须靠 height: 100% 撑满轨道,不能再叠加 flex 简写
- styles.css:文件末尾新增实测修复区块,解除 direct-codex 消息列表的 340px 最小高度下限
- styles.css:新增实测修复区块,把 direct-codex 的 surface / conversation 固定为纵向链
- chatDialogFrameLayout.test.ts:新增用例锁定面板必须跨满对话列全部 grid 行、height 100%、且不得叠加 flex 简写
- chatDialogFrameLayout.test.ts:新增断言锁定 direct-codex 面板把消息列表 min-height 从 96px 解除到 0
- 说明这次断言对应的一次真实渲染事故:新会话只有一条欢迎消息时,消息列表塌成 54px、输入盒被拉伸到 212px
- ProjectSupervisorView:移除输入盒内「项目名 · 本地」信息标签行,删除随之无用的 projectDisplayName 辅助函数
- styles.css:输入盒网格从三行改回两行(文本区 / 控制排),删除信息标签行及其胶囊样式规则
- chatDialogFrameLayout.test.ts:把「表单子树含信息标签行」的断言反转成不再包含,并删除相关 CSS 常量与取值
- project-development.suite.ts:输入盒断言从「含项目名/本地标签」改为「不再渲染该标签行」,网格行数断言同步为两行
- docs/technical:【技术方案】GameAgent对话工具调用卡片-2026-09-14.md:工具调用条目形状、独立历史文件 tool-calls.jsonl、事件新增 toolCalls 字段、read_direct_tool_calls 回读命令、卡片 DOM 与无障碍要求、验收判据与不做项
- docs/README.md:把该方案登记进「AI 游戏创作与 Agent Runtime」索引
- 方案明确不改 project.jsonl 既有格式与 Codex 上下文注入路径,避免污染模型上下文
- 新增 agent/direct_tool_calls.rs:把 Codex item 投影成结构化 DirectToolCall(command / file_change /
  mcp_tool / web_search / context_compaction / other),标题按 kind 固定(`编辑 N 个文件` 按去重路径数)
- 新增 agent/direct_tool_calls.rs:独立文件 `.agent/conversations/tool-calls.jsonl` 的幂等 upsert
  (同 id 只落一行、completed 覆盖 started、startedAt 取最早非零值)与 200 条上限裁剪
- 新增 agent/direct_tool_calls.rs:command/output 截断 4000 字符、summary 截断 120 字符,
  先抹绝对路径再抹密钥(复用 redact_absolute_path_tokens / redact_secret_tokens)
- 新增 agent/direct_tool_calls.rs:回读按时间正序、单行损坏跳过、文件缺失返回空数组
- 新增 agent/direct_tool_calls.rs 单测 8 条:幂等 upsert、非 0 退出码判 failed、截断、脱敏、
  坏行跳过、上限裁剪与排序、file_change 标题与摘要、非工具 item 不产卡片
- agent/codex_app_server.rs:DirectCodexTurnObservation 增加 ToolCall 变体;item/started 与
  item/completed 各采一次,turnId 沿用 AGC 客户端回合 id
- agent/direct_runtime.rs:观察者采集到工具调用时增量下发,回合结束整批落盘(一次锁、一次重写)
- agent/direct_runtime.rs:单项落盘走阻塞线程池,落盘失败不影响回合结果
- agent/runtime_driver/entrypoints.rs:DirectGameCreatorTurnUpdateEmitter::emit 增加可选
  toolCalls 参数
- main.rs:GameCreatorDirectTurnUpdateEvent 增加可选 toolCalls 字段,skip_serializing_if 保证
  老事件序列化结果不变
- commands.rs / main.rs:新增 read_direct_tool_calls(projectPath) 命令并注册到 invoke_handler
- app/types.ts:新增 GameCreatorDirectToolCall / Detail / Change 类型,并给
  GameCreatorDirectTurnUpdateEvent 增加可选 toolCalls 字段(老事件 undefined 走原路径)
- App.tsx:订阅 game-creator-direct-turn-update 时按 id 归并工具调用增量(completed 覆盖
  running、startedAt 取最早),打开项目时整表替换为 read_direct_tool_calls 的回读结果
- App.tsx:只把「对话里已有该回合」或「当前正在跑的回合」的工具调用交给面板,避免旧卡片漂尾
- ProjectSupervisorView.tsx:新增 toolCalls / activeTurnId 属性,按回合把卡片插在
  **同一回合最后一条 assistant 消息之后**,同回合内按 startedAt 升序;当前回合在 assistant
  消息落盘前锚到最后一条 assistant 消息
- ToolCallCard.tsx(新增):Codex 风格可折叠卡片,`<button aria-expanded aria-controls>` +
  `hidden` 控制展开,键盘可达,aria-label 为「执行命令:npm run build」
- ToolCallCard.tsx:折叠态显示图标/标题/摘要/进行中状态点/状态文案;展开态显示命令、
  文件路径 + 变更类型、输出
- styles.css:新增工具调用卡片样式区块,running 状态点与 failed 配色都用现有 --platform-* 变量
- tests/appSurface/project-development.suite.ts:新增两条用例 —— 实时回合卡片从 running 走到
  completed 并在回合结束后仍挂在同一回合消息之后;打开项目时调用 read_direct_tool_calls
- styles.css:direct-codex 面板自身 padding 归 0,四边留白由子节点声明为 16px(实测 16/16/16/16)
- styles.css:盒内内边距 12px(文字左内缩 = 上内缩 = 右内缩 = 13px,实测)
- styles.css:输入区改单块布局,「AI 润色」按钮浮到右下角,不再占掉文字右边缘 36px(这是文字左右内缩不一致的根因)
- styles.css:左侧控件组左移 12px,使 + 图标墨迹与文字左边缘同线(实测同为 x=950)
- styles.css:去掉画在输入区上的内层焦点环,焦点环改画在整只输入盒外侧,不再出现第二层框
- styles.css:删除 direct-codex 输入盒旧几何规则(1fr 82px 网格 / z-index 2 / padding-top 8px)与窄屏 8px 12px 12px 的不对称外边距
- 测试:宽屏断言四边留白恒等 + 文字三边内缩相等;窄屏断言四边 16px;高度算式同步
- styles.css:字号从输入区/编辑器各自声明下沉到共同父级 .resource-reference-input(13px/1.6),hint 不再继承面板的 16px 而比实际输入文字大一圈
- styles.css:编辑器内 Lexical 段落清零外边距,去掉全局 p 规则的 8px 顶边距,光标不再比 hint 低 8px
- 实测:hint 首字符与打字后首字符位置完全重合(948/640.5)
- ChatMarkdownMessage:无序列表改用真正的列表标记(list-disc + pl-4),不再手写 '- ' 文本前缀
- ChatMarkdownMessage:删除列表项里手写的短横线,换行后的第二行恢复悬挂缩进,同时恢复列表语义
- ChatMarkdownMessage:移除随之无用的 ListKindContext
- ChatMarkdownMessage.test.tsx:用例改为断言 list-disc/pl-4 与「列表项文本不含手写短横线」
- 实测:真实面板注入同 class 标记后 list-style-type=disc、li 为 list-item、换行行与首行文字左边缘对齐
- 新增 ToolCallGroup.tsx:块头一行汇总(按 kind 固定顺序计数拼接),展开态每行一条工具,行可二级展开看命令 / 文件变更 / 输出
- 新增 toolCallGroupPresentation.ts:汇总与行文案纯函数(组件文件不导出非组件值)
- 删除 ToolCallCard.tsx:一回合多卡片的旧形态不再使用
- ProjectSupervisorView:工具调用块插到该回合 assistant 消息之前;实时回合还没有 assistant 消息时先落在消息流末尾
- 汇总 / 行文案按契约固定:已执行 N 个命令、… / 已运行、已编辑、已调用、已搜索、已整理上下文、已执行
- appSurface 用例改为断言折叠块:默认折叠、行数 = 工具数、回读历史插在 assistant 消息之前
- 新增 tool-call-group.suite.ts:汇总文案、行文案、默认折叠、行二级展开、空集合不渲染
- 技术方案文档同步第 4 节:一回合一个折叠块的 DOM 与文案契约
- 新增 toolCallGroupPresentation.ts 的耗时 / 时间纯函数:toolCallDurationMs、formatToolCallDuration(0.4s / 12.3s / 2m 5s)、turnToolCallDurationMs、formatTurnDuration(42秒 / 4分钟 / 5分钟 45秒)、formatClockTime、turnToolCallTimeLabel
- ToolCallGroup:块头右侧显示总用时(min(startedAt) → max(updatedAt))与该回合结束时间(拿得到同回合用户消息时间时显示 发送 → 结束)
- ToolCallGroup:展开态每行右侧显示该工具自己的耗时;startedAt 为 0 或时间倒序时不显示耗时(不出现 0s / 负数),running 行显示 执行中
- ToolCallGroup:块与行都带 data-duration-ms(无法计算时为空串),块尾补一行 结束于 HH:mm
- ProjectSupervisorView:按回合把用户消息的 updatedAt 传给块,用于 发送 → 结束 时间显示
- 用例:耗时格式化边界(0 / <1s / 整秒 / ≥60s / 时间倒序)、总用时、每行耗时、无时间戳不渲染耗时
- 技术方案文档补耗时 / 时间 / data-* 契约
- styles.css 工具调用区块重写:块头做成一整行浅底圆角条目(图标 / 汇总 / 结束时间 / 总用时 / 折角),只用现有 --platform-* 变量
- 展开态每行一条:行内不换行、超长命令 text-overflow: ellipsis,耗时 margin-left: auto 右对齐、tabular-nums 对齐数字
- 行二级明细改用 agent-tool-call-row-command / -output / -changes 样式,命令与输出沿用中性底 + 细边框
- 补 [hidden] 显式 display: none,避免折叠态被 display: grid 顶掉后仍占位
- 展开箭头只做 rotate 过渡,不引入布局跳动;failed 行用 --platform-button-danger-text
- 删除旧 agent-tool-call-* 卡片样式;输入盒 / 面板留白 / 顶栏相关规则未动
- 新增用例:历史为空、消息列表里只有没有 messageId 的默认问候时,当前回合的工具块在回合进行中就直接渲染在消息列表末尾
- 同一用例断言回合结束后块只有一份、并回到该回合 assistant 消息之前(末尾兜底不留重复块)
- 断言块内每行为按钮、行数 = 工具数、data-duration-ms 与行耗时文案
- direct_tool_calls.rs:detail.command / detail.output / detail.changes[].path 不再只走
  redact_absolute_path_tokens + redact_secret_tokens(后者只认 sk-/tnr_sk_/ghp_/AKIA/eyJ 固定前缀),
  改为追加既有 sanitize_error_context(= redact_secret_tokens + redact_error_sensitive_assignments
  + redact_error_bearer_values + redact_error_config_names 的既有组合用法),
  覆盖 Authorization: Bearer <token>、Cookie: session=<v>、api_key=<v>、client_secret=<v> 四类键值凭据
- 含 --password / --token / --secret / --api-key 这类敏感 CLI 标志的行沿用既有 fail-closed 约定,
  整行替换成 [redacted sensitive context](与 sanitize_agent_runtime_text 行为一致)
- summary 的 tool 兜底来源同样先脱敏(同一条落盘链路上的残留未脱敏文本)
- 新增单测:tool_call_redacts_extended_credential_shapes(五类凭据在投影与落盘行都不含原始值)、
  tool_call_redaction_keeps_normal_text_and_is_idempotent(裸 password 词不误伤、脱敏幂等、sk- 前缀不回退)
新增 cancel_direct_codex_turn:按项目登记正在运行的 direct-codex 回合句柄,终止时复用 CodexTurnStartCancellation 只发 turn/interrupt;无活动回合、clientTurnId 不匹配、进程已退出都返回可读原因。

新增 select_game_creator_reasoning_effort:按 select_game_creator_model 的既有配置写入模式,只改 llm.reasoningEffort 后落盘,读接口语义不变。

codex_app_server.rs 追加 DirectCodexActiveTurnTable 注册表与回合登记/注销 guard,并补 2 个单测(选中/注销哪一轮、注册键归一化);既有事件与命令语义不动。
- direct_tool_calls.rs:把 preserve_started_at(只管 startedAt)换成 merge_tool_call_snapshot,
  同一 id 的多条快照按 updatedAt 单调合并:updatedAt 更旧的快照不得覆盖更新的 status 与 updatedAt,
  updatedAt 相同时终态优先,startedAt 仍取最早的非零值
- upsert_direct_tool_call_once(逐条快照落盘)与 persist_direct_tool_calls_at(回合末整批落盘)
  两条竞争路径共用同一合并函数,后到的旧快照不再把 completed / failed 打回 running
- normalize_tool_calls(回读归并)同 id 的重复行同样按 updatedAt 合并,磁盘上留下的旧快照不得回退状态
- 新增单测:tool_call_persist_keeps_newest_snapshot_per_item(单条 + 整批两条路径)、
  tool_call_read_merges_duplicate_rows_monotonically(回读重复行)
文件上传:+ 改成添加入口(上传本地文件 / 引用项目素材),上传走既有 upload_local_asset 链路并落成 DirectCodexTurnAttachment,随下次提交进入回合 attachments,提交后清空。

终止:回合运行中发送钮位置显示终止方块,调用新增 cancel_direct_codex_turn;中断回流被识别为主动终止,回合 finally 复位输入盒,不再写运行错误与诊断。

队列:回合运行中再次发送进本地 FIFO 队列并在输入盒上方以 chip 展示、可单条取消,回合结束后按序自动发出;输入区在 direct-codex 回合运行中保持可编辑(其余面板维持原行为)。

语音:用 SpeechRecognition/webkitSpeechRecognition,缺失时按钮禁用并直接给出不支持提示;录音态有 is-recording 视觉反馈,识别文本追加进草稿(ResourceReferenceInput 新增 insertText)。

推理档:移到模型选择器旁,读 read_game_creator_app_config、写 select_game_creator_reasoning_effort,只影响后续回合。

新增 tests/appSurface/chat-composer.suite.ts(10 条:队列 FIFO/取消、终止复位、上传后附件进提交、推理档写入回读、语音降级与录音态、追加不覆盖)并更新 + 与推理档相关的既有断言。
RuntimeConfigDialog 删掉「推理档」下拉:该档位已下移到对话输入盒的模型选择器旁;其余设置字段不变。

runtime-settings.suite 同步调整三处断言:设置面板不再有推理档,Escape 用例改用联网检索控件,恢复默认用例改为断言设置里查不到推理档。
- direct_tool_calls.rs:新增 project_relative_path_segment 与 relativize_project_root_paths,
  在 redact_absolute_path_tokens 之前把项目根目录前缀换成项目相对路径(game/src/x.ts),
  Windows 的 \ 与 / 两种写法都匹配、大小写不敏感、分隔符统一成 /
- 项目外绝对路径继续落成 <absolute-path> 占位;只写了项目根目录本身时也按占位处理
- 删掉永远匹配不到的死代码 without_secret.replace(root, "<project-root>")
  (redact_absolute_path_tokens 已经把项目根目录换成 <absolute-path>,契约里的"项目相对路径"在绝对路径场景不成立)
- 新增单测:tool_call_paths_become_project_relative(项目内相对路径 + 项目外占位 + 落盘不残留项目根目录)
待发附件的 localPath 是项目相对路径、队列也属于刚结束的那条对话;切项目后不清空会把上一个项目的附件路径带进下一个回合。

只新增一个跟随 localProject.projectPath 的 effect,其余输入盒状态与后端协议不变。
- direct_tool_calls.rs:read_tool_call_lines 由 BufReader::lines() + let Ok(line) = line else { break }
  改成按行读字节(read_until)+ 逐行 from_utf8 解码:非法 UTF-8 行只跳过该行并继续读后续行,
  不再把这一行之后的所有记录一起丢掉;只有读 I/O 错误才停止读取
- 契约「单行损坏跳过该行继续」在"损坏行缺换行、与下一行黏成一行"时也成立:丢掉的只是黏连的那一行
- 新增单测:tool_call_read_skips_invalid_utf8_line(合法行 + 非法字节行 + 合法行 → 读回 2 条;
  以及损坏行缺换行的黏连形态)
- docs/technical/【技术方案】GameAgent对话工具调用卡片-2026-09-14.md:
  写明同一 id 的快照按 updatedAt 单调合并(旧快照不得把 completed / failed 打回 running,
  并发来源是逐条快照落盘与回合末整批落盘两条路径)
- 写明 detail.changes[].path 用项目相对路径(分隔符统一成 /)、项目外绝对路径用 <absolute-path> 占位
- 写明必须脱敏的具体函数链路(sanitize_detail_text:路径归一化 → redact_absolute_path_tokens →
  redact_secret_tokens → sanitize_error_context),含敏感 CLI 标志的行整行 fail-closed
  (--password 后面即使只是 $VAR 占位符也整行替换),且脱敏必须幂等
- 写明 200 条上限语义是"按时间保留最新 200 条",超出时更早回合的卡片会被静默丢弃(老回合卡片会消失),
  不做分页与历史回填(行为不变,只补文档)
- 写明单行损坏(含非法 UTF-8)逐行读取跳过继续,黏连形态只丢那一行
- 新增单测:tool_call_cap_drops_oldest_turn_cards(超出后保留最新 N 条 + 按时间正序)
- direct_tool_calls.rs:新增单测 tool_call_paths_normalize_separators_and_case,
  覆盖 relativize_project_root_paths 的 `/` 分隔符分支与大小写不敏感分支
  (Codex 上报的路径分隔符与盘符大小写不受我们控制,这两条分支此前没有用例覆盖)
- appSurface/project-commands.suite.ts:去掉期望文本里手写的前缀短横线(列表项目符号改由 CSS 绘制)
- appSurface/project-commands.suite.ts:把路径匹配限定到 LI 元素(去掉前缀后 li 与内部 p 文本相同,getByText 会命中两个元素)
- appSurface/project-assets.suite.ts、supervisor-runtime.suite.ts、preview-shortcuts:同步去掉期望文本里的手写短横线
- 背景:a60c04b53 把无序列表从手写短横线文本改成真正的 list-disc 标记,9 条既有断言因此失败,本笔把它们对齐到新契约
- 合并分支:feat/chat-composer-controls(基线 a60c04b53,4 笔提交)
- 冲突文件 apps/ai-game-creator-shell/tests/appSurface.test.ts:两条分支各自注册了自己的新用例集(工具调用折叠块 / 输入盒能力),属纯追加,两侧都保留
- 内容:文件上传(+ 弹层:上传本地文件 / 引用项目素材,走既有 upload_local_asset + 回合附件)、终止(新增 cancel_direct_codex_turn + 前端停止钮)、队列(纯前端 FIFO,含取消)、语音输入(无 SpeechRecognition 时禁用降级)、推理档下移到输入盒并从设置面板移除(新增 select_game_creator_reasoning_effort)
- ProjectSupervisorView:把「任务执行中 / 正在思考中」过程卡从消息列表内部移到列表外,紧贴输入盒上方(固定在输入框上面,不随消息滚走)
- styles.css:过程卡离开列表后补回左右 16px 内缩,与消息内容、输入盒对齐(并补回底部间距)
- ToolCallGroup:未结束时不再显示「结束于 HH:mm」——只有全部工具落定后才显示块尾那行
- ToolCallGroup:进行中改为「现在 - 最早开始时间」并每秒重算,用时数字会实时跳动(此前只在新事件到达时变)
- ToolCallGroup:只有正在跑的回合才显示「进行中 / 执行中」;已结束回合里残留的 running 快照不再让用户看到永远停在「执行中」
- ProjectSupervisorView:给实时回合的折叠块传 active,历史回合的块不传(默认按已结束渲染)
- ComposerControls:推理档从原生 select 换成与模型选择器同一套观感的浮层(复用 conversation-model-* 触发钮与菜单样式,带选中勾选),不再出现操作系统原生下拉
- App.tsx:直连回合按回合累积过程/步骤行(相邻重复去重、最多 40 行),每次回合更新时收集,新回合开始时清空
- App.tsx:把累积结果作为 processSteps 传给对话面板
- ProjectSupervisorView:新增可选属性 processSteps;在消息流里渲染默认折叠的「思考过程」块(details 默认收起,data-testid=agent-thinking)
- styles.css:思考过程块与步骤列表的最小样式(左右与消息内容对齐 16px)
- 说明(限制):Codex app-server 0.147/0.149 只推结构性 item、不推 reasoning 文本(codex_app_server.rs 对 reasoning 类型是明确忽略并有单测钉住),所以这里展示的是我们真实能拿到的过程行(正在思考中 / 正在执行命令:x / 正在写入文件:y),不是模型内部推理原文;策划/设计链原有的 designReasoning 折叠块不受影响
移除伪思考过程块:拿不到真思考过程就不显示
Project CI / Repository checks (pull_request) Failing after 15s
Project CI / Backend tests (pull_request) Failing after 15s
Project CI / Frontend tests (pull_request) Failing after 2m21s
Project CI / Native shell tests (pull_request) Failing after 5m17s
0d2010168e
suzmii added 1 commit 2026-09-15 19:52:52 +08:00
工具调用行去掉动词前缀,状态列改为执行中/已执行/失败
Project CI / Repository checks (pull_request) Failing after 13s
Project CI / Backend tests (pull_request) Failing after 12s
Project CI / Frontend tests (pull_request) Failing after 2m14s
Project CI / Native shell tests (pull_request) Failing after 6m15s
82ac6c160f
- toolCallGroupPresentation:行文案不再拼 已运行/已编辑/已调用 前缀,只留工具摘要(状态由行尾状态列表达,避免重复)
- toolCallGroupPresentation:汇总文案在回合进行中只说数量(如 2 个命令),落定后才加 已执行
- ToolCallGroup:行尾状态固定显示 执行中(仅正在跑的回合)/ 已执行 / 失败,不再出现空状态
suzmii added 1 commit 2026-09-15 19:53:50 +08:00
工具调用折叠块块头拆成两行
Project CI / Repository checks (pull_request) Failing after 10s
Project CI / Backend tests (pull_request) Failing after 11s
Project CI / Frontend tests (pull_request) Failing after 2m21s
Project CI / Native shell tests (pull_request) Failing after 5m26s
426fb9b728
- ToolCallGroup:状态/时间与用时包进 agent-tool-call-group-meta
- styles.css:块头改两行网格(图标 + 汇总一行,状态/用时一行,箭头右侧跨两行),汇总超长省略,避免窄面板里被截断且进行中折行
suzmii added 1 commit 2026-09-15 19:57:07 +08:00
合并 origin/master:解 4 处冲突并接入 master 的真思考过程
Project CI / AI game creator shell Rust shard 1/4 (pull_request) Successful in 4m42s
Project CI / AI game creator shell Rust shard 2/4 (pull_request) Successful in 4m57s
Project CI / AI game creator shell Rust smoke (pull_request) Successful in 2m6s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 2m51s
Project CI / AI game creator shell Rust shard 3/4 (pull_request) Successful in 4m52s
Project CI / AI game creator shell Rust shard 4/4 (pull_request) Successful in 4m31s
Project CI / Frontend tests (pull_request) Failing after 3m38s
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
1427ce31af
- 合并 origin/master(领先 355+ 提交),冲突 3 文件 4 块,全部按"两侧语义都保住"处理:
- useHomeProjectCreation.ts:保留我们抽出的 uploadLocalFilesAsAttachments(首页与输入盒共用上传链路),同时接入 master 的建项兜底期限(HOME_CREATION_DEADLINE_MS / resolveRecoverableHomeProjectPath)
- ProjectSupervisorView.tsx(属性):接入 master 新增的 designReasoningEntries 属性
- ProjectSupervisorView.tsx(渲染):把我们的工具调用折叠块(按回合锚定、实时兜底到列表末尾)与 master 的每消息思考过程(message.reasoningText 折叠块 + designReasoningEntries 兜底)合并,两者同时生效
- view/project-development/index.tsx:接入 master 新增的图标 import(Settings2 / Shapes)
- 类型检查通过(0 错),未跑测试
suzmii added 4 commits 2026-09-15 19:59:36 +08:00
- resourceCardPreviewModel:新增 Markdown / 代码 / 纯文本三支扩展名口径,`.json`/`.yaml`/`.toml`/`.xml`/`.html`/`.css`/`.sql` 按用户口径归入代码
- resourceCardPreviewModel:新增 projectResourceCardPreviewVariant 给出卡面分流结论,projectResourceCodeTypeLabel 给出代码卡类型标签
- resourceCardPreviewModel:纯文本(`.txt`/`.csv`/`.log` 等)在上游无类型结论时兜底为文档,改走文本预览而不是占位图标
- resourceCardPreviewModel:用按行截断的 projectResourceDocumentPreviewText 替换压成一行的 summarizeProjectResourceDocument
- resourceCardPreviewModel:Markdown 轻量清理只去标记符号并保留换行,不引入完整渲染器
- useProjectResourceCardPreviews:代码卡在 requestPreview 入队门禁直接返回,不再读取文件内容(判据与卡面分流同源)
- useProjectResourceCardPreviews:收窄 readPreview 的文档/代码双分支为文档单分支,去掉已不可达的代码读取路径
- index.tsx:卡面据 projectResourceCardPreviewVariant 分流,代码卡分支只渲染 lucide 代码图标 + 扩展名标签,不再显示文件内容
- index.tsx:文档卡改用 projectResourceDocumentPreviewText 取前 3 行,并带上 data-document-preview-variant 便于排障与验收
- index.tsx:引入 FileCode2 图标
- ResourcePreviewMedia.tsx:弹窗宿主里代码文件同样改画代码图标,避免看起来像"读不出来的图片"
- styles.css:文档卡预览保留换行并限制 3 行(white-space: pre-line + -webkit-line-clamp: 3)
- styles.css:新增 .game-resource-card-code-visual / .game-resource-card-code-label,复用现有卡片色板与居中排布口径
Merge branch 'feat/doc-card-preview' into feat/chat-codex-ui
Project CI / AI game creator shell Rust shard 1/4 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust shard 2/4 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust shard 3/4 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust shard 4/4 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust smoke (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
b665cf6691
suzmii added 1 commit 2026-09-15 20:03:00 +08:00
消息列表相邻元素补回 14px 间距:块级列表不生效 gap,导致消息与工具块贴在一起
Project CI / AI game creator shell Rust shard 1/4 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust shard 2/4 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust shard 3/4 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust shard 4/4 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust smoke (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
33a7205750
suzmii added 1 commit 2026-09-15 20:06:19 +08:00
思考过程移到消息流上方;修 latch 路径不匹配时占用初始消息导致首页输入被丢
Project CI / AI game creator shell Rust shard 1/4 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust shard 2/4 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust shard 3/4 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust shard 4/4 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust smoke (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
aab1c5c4e0
suzmii added 1 commit 2026-09-15 20:17:51 +08:00
撤回思考过程块上移:恢复 master 的原始位置(消息自带的 reasoningText 折叠块本来就在消息里,设计链 entries 追加在消息之后)
Project CI / AI game creator shell Rust shard 1/4 (pull_request) Successful in 5m0s
Project CI / AI game creator shell Rust shard 2/4 (pull_request) Successful in 4m23s
Project CI / AI game creator shell Rust shard 3/4 (pull_request) Successful in 4m46s
Project CI / Backend tests (pull_request) Failing after 10s
Project CI / AI game creator shell Rust smoke (pull_request) Successful in 1m42s
Project CI / AI game creator shell Rust shard 4/4 (pull_request) Successful in 4m2s
Project CI / Repository checks (pull_request) Failing after 11s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 2m47s
Project CI / Frontend tests (pull_request) Failing after 3m35s
Project CI / AI game creator shell web tests (pull_request) Failing after 3m27s
Project CI / Native shell tests (pull_request) Successful in 7m46s
52f1d7f08b
suzmii added 1 commit 2026-09-15 20:39:51 +08:00
历史回读保留尚未落盘的运行时消息;过程卡不再渲染流式正文
Project CI / AI game creator shell Rust shard 2/4 (pull_request) Successful in 5m8s
Project CI / AI game creator shell Rust shard 1/4 (pull_request) Successful in 5m38s
Project CI / AI game creator shell Rust shard 3/4 (pull_request) Successful in 4m53s
Project CI / Backend tests (pull_request) Failing after 11s
Project CI / AI game creator shell Rust shard 4/4 (pull_request) Successful in 4m0s
Project CI / AI game creator shell Rust smoke (pull_request) Successful in 1m44s
Project CI / Repository checks (pull_request) Failing after 11s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 3m14s
Project CI / AI game creator shell web tests (pull_request) Failing after 3m14s
Project CI / Frontend tests (pull_request) Failing after 3m29s
Project CI / Native shell tests (pull_request) Successful in 7m10s
7161e934e0
suzmii added 6 commits 2026-09-15 20:53:16 +08:00
新增 read_direct_codex_active_turn 只读命令:返回当前登记的 { clientTurnId, startedAt },供前端重进会话时接管正在跑的回合
DirectTaonierActiveInvocation 增加 started_at_ms 登记时刻,供只读探测与后续兜底释放判断这一轮的年龄
不改守卫互斥语义与 Drop 释放时机:探测既不进入也不抢占
把命令注册进 main.rs 的 invoke_handler
新增用例:登记中的回合能被只读探测看到、探测本身不占有不释放、Drop 之后回到 None
cancel_direct_codex_turn 返回值改为 DirectTurnCancelView{outcome, message, clientTurnId},界面能区分"已发中断"与"守卫已被兜底释放"
cancel_direct_codex_turn_at 在拿不到可中断的活句柄(执行进程已退出 / 从没进执行器)时释放本地守卫,返回可读原因;"正在跑的是另一轮"仍保持原拒绝语义,什么都不释放
新增 release_stale_direct_taonier_active_invocation:释放条件写进注释——登记存在、clientTurnId 一致、调用方已确认执行器没有活句柄、"从没进执行器"时登记年龄还要超过 60 秒启动窗口
DirectTaonierStaleGuardReason 给出两种兜底原因与可读文案;DirectCodexActiveTurnTable 增加 registered_client_turn_id,另一轮拒绝文案提成共用常量
把"已有另一条 Direct 客户端回合正在运行"补成可操作文案:可在输入盒点终止,或等它结束后再发送(不改错误分类与前缀语义)
新增用例:同项目第二次进入仍被拒、clientTurnId 不匹配不释放、启动窗口内不释放、老过窗口释放后可再次进入、原守卫 Drop 不影响后来登记的回合
打开项目读项目对话之后调用 read_direct_codex_active_turn,返回回合时把它设回 activeDirectCodexTurnRef(字段与既有两处赋值同形),并置 directCodexStatus=running、chatAgentBusy=true,让过程卡、"任务执行中"与输入盒的终止按钮都出现
只读探测失败或没有回合等于没有回合,不影响打开项目;同一项目已接管时不重复接管,避免 /history 之类重读把 lastSequence 归零
恢复出来的回合挂 15 秒看门狗:窗口内一条本回合事件都没有,就在过程卡与输入盒提示"该回合已无响应,可在输入盒点「终止」结束它以继续";收到真实事件立刻撤掉提示与看门狗
终止按 cancel_direct_codex_turn 的返回值分流:outcome=released 说明守卫已被后端兜底释放、没有回合 promise 会回来复位,界面自己复位并展示后端可读原因;interrupted 仍等回合自身收尾
发消息若仍被"已有另一条 Direct 客户端回合正在运行"拒绝,延时接管那条回合并把出口写进提示(不与同 clientTurnId 的既有分类混用,新增独立判定)
新增 DirectActiveTurnView / DirectTurnCancelView 两个命令返回类型
- commands.rs:接入 master 新增的 read_agent_runtime_error_detail 命令,并补上 prepare_local_project_asset_generation 里新增的 slice_mode / grid_x / grid_y 三个字段
- main.rs:注册 read_agent_runtime_error_detail
- 保留我们这边的 read_direct_tool_calls 等命令,两侧新增全部保留
- 冲突原为纯追加,按"两侧语义都保住"处理;未跑测试
合并 origin/master(真合并:AGC 统一错误诊断 / 图集连通域切分)
Project CI / AI game creator shell Rust shard 1/4 (pull_request) Failing after 5m31s
Project CI / AI game creator shell Rust shard 2/4 (pull_request) Failing after 5m19s
Project CI / AI game creator shell Rust shard 3/4 (pull_request) Failing after 5m44s
Project CI / AI game creator shell Rust smoke (pull_request) Successful in 1m54s
Project CI / AI game creator shell Rust shard 4/4 (pull_request) Failing after 4m13s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 2m18s
Project CI / Native shell tests (pull_request) Failing after 2m14s
Project CI / Repository checks (pull_request) Failing after 1m17s
Project CI / AI game creator shell web tests (pull_request) Failing after 51s
Project CI / Frontend tests (pull_request) Failing after 3m26s
Project CI / Backend tests (pull_request) Successful in 7m9s
1c1009c1d1
- canvas_generation.rs:接入 master 新增的 slice_mode / grid_x / grid_y 结构体字段
- commands.rs:master 的 read_agent_runtime_error_detail 命令与本分支 read_direct_tool_calls 并存(两侧都保留)
- main.rs:两条命令都注册
- 冲突按"两侧语义都保住"处理;未跑测试
suzmii added 1 commit 2026-09-15 20:54:35 +08:00
同步 skill-pack 内容指纹(taonier-art-assets,version=2026-08-26.15)
Project CI / AI game creator shell Rust shard 2/4 (pull_request) Failing after 5m21s
Project CI / AI game creator shell Rust shard 1/4 (pull_request) Successful in 5m37s
Project CI / AI game creator shell Rust shard 3/4 (pull_request) Successful in 4m37s
Project CI / AI game creator shell Rust shard 4/4 (pull_request) Successful in 3m52s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 2m27s
Project CI / AI game creator shell Rust smoke (pull_request) Successful in 2m39s
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
1b8e159153
suzmii added 1 commit 2026-09-15 20:56:34 +08:00
补注册 read_agent_runtime_error_detail 到 Tauri handler 列表(合并时被 checkout 覆盖)
Project CI / AI game creator shell Rust shard 2/4 (pull_request) Failing after 5m8s
Project CI / AI game creator shell Rust shard 4/4 (pull_request) Successful in 5m38s
Project CI / AI game creator shell Rust shard 1/4 (pull_request) Successful in 5m53s
Project CI / AI game creator shell Rust shard 3/4 (pull_request) Successful in 5m58s
Project CI / AI game creator shell Rust smoke (pull_request) Successful in 1m50s
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
d7f20a2f4d
suzmii added 6 commits 2026-09-15 23:30:34 +08:00
修复流式回复、运行状态卡片和回合耗时展示

保留创建项目时的初始提示词并调整输入区按钮

展示工具调用输入输出并清理命令输出中的 ANSI 编码
移除工作台会话区域中的引导 hint
运行中的回合只保留状态卡片耗时,历史回合继续显示会话耗时
避免回复流式生成期间状态卡片随内容变化而收缩
# Conflicts:
#	apps/ai-game-creator-shell/src/App.tsx
Merge remote-tracking branch 'origin/master' into feat/chat-codex-ui
Project CI / AI game creator shell Rust shard 1/4 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust shard 2/4 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust shard 3/4 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust shard 4/4 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust smoke (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
96f1889164
suzmii added 6 commits 2026-09-16 00:12:44 +08:00
减少段落和列表之间的空白,避免回复出现过多空行
保留两个换行表示的正常空行,仅压缩普通正文中的连续多余换行
兼容带空格的连续空行,保留 Markdown 段落分隔语义
先统一 CRLF 与 LF,再压缩正文中的多余空行
修复助手回复视觉空隙过大的问题
提交对话区样式收尾(含另一路未提交的 Markdown 间距修正)
Project CI / AI game creator shell Rust shard 1/4 (pull_request) Failing after 2m11s
Project CI / AI game creator shell Rust shard 2/4 (pull_request) Failing after 2m44s
Project CI / AI game creator shell Rust shard 3/4 (pull_request) Failing after 2m39s
Project CI / AI game creator shell Rust shard 4/4 (pull_request) Failing after 2m42s
Project CI / Backend tests (pull_request) Failing after 10s
Project CI / AI game creator shell Rust smoke (pull_request) Successful in 2m43s
Project CI / Repository checks (pull_request) Failing after 10s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 1m59s
Project CI / Frontend tests (pull_request) Failing after 3m36s
Project CI / AI game creator shell web tests (pull_request) Failing after 3m33s
Project CI / Native shell tests (pull_request) Successful in 7m15s
9b7f7f110c
- styles.css:移除 .message 的 white-space: pre-wrap(Markdown 块之间的换行文本节点会被渲染成真实空行,列表项之间出现大段空白)
- styles.css:对话正文行高统一并钉死 1.5(面板里存在更长的选择器链,普通 .message p 会被压过去)
- styles.css:列表 ul/ol 的默认块间距显式清零,避免与 p 的 margin 叠加成"假空行"
- styles.css:流式思考过程折叠块样式(pre-wrap 换行、1.5 行高、无横向滚动条)
- 说明:本文件里同时包含另一路会话未提交的 Markdown 间距改动,一并提交以免丢失
suzmii added 1 commit 2026-09-16 00:19:37 +08:00
工具块改为排在文本之后(修正锚定遗留:先前从消息前移除但未插回)
Project CI / AI game creator shell Rust shard 1/4 (pull_request) Failing after 2m4s
Project CI / AI game creator shell Rust shard 2/4 (pull_request) Failing after 2m36s
Project CI / AI game creator shell Rust shard 3/4 (pull_request) Failing after 2m38s
Project CI / AI game creator shell Rust shard 4/4 (pull_request) Failing after 2m35s
Project CI / Backend tests (pull_request) Failing after 10s
Project CI / AI game creator shell Rust smoke (pull_request) Successful in 1m50s
Project CI / Repository checks (pull_request) Failing after 12s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 2m8s
Project CI / Frontend tests (pull_request) Failing after 3m17s
Project CI / AI game creator shell web tests (pull_request) Failing after 3m11s
Project CI / Native shell tests (pull_request) Successful in 7m12s
7d5916aa62
- ProjectSupervisorView:该回合的工具组渲染在 assistant 消息之后、轮次统计之前,不再压在同回合文本上面
- 实时回合的工具组改到流式正文之后,顺序与落定回合一致
- 修掉上一次改动把工具组从消息前移除却没插回、导致工具卡片不显示的问题
suzmii added 1 commit 2026-09-16 00:21:19 +08:00
实时回合按顺序交替渲染正文与工具块
Project CI / AI game creator shell Rust shard 1/4 (pull_request) Failing after 1m40s
Project CI / AI game creator shell Rust shard 2/4 (pull_request) Failing after 2m25s
Project CI / AI game creator shell Rust shard 3/4 (pull_request) Failing after 2m26s
Project CI / AI game creator shell Rust shard 4/4 (pull_request) Failing after 2m22s
Project CI / Backend tests (pull_request) Failing after 11s
Project CI / AI game creator shell Rust smoke (pull_request) Successful in 1m57s
Project CI / Repository checks (pull_request) Failing after 10s
Project CI / Frontend tests (pull_request) Failing after 3m14s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 3m29s
Project CI / AI game creator shell web tests (pull_request) Failing after 3m14s
Project CI / Native shell tests (pull_request) Successful in 7m29s
67126a981e
- App.tsx:记录"每个工具首次出现时已生成正文的长度"(切分点)并在收尾/清空对话时重置
- ProjectSupervisorView:新增 renderLiveStream,按切分点把流式正文切成若干段,工具块就地插在对应位置;同一切分点的工具合并成一个块
- 有正文时不再重复渲染独立实时工具组(避免同一批工具出现两次)
- 历史回合没有切分点:退化为"正文 → 工具块 → 轮次统计",老项目与旧数据不受影响
- tsc 通过;未跑测试
suzmii added 1 commit 2026-09-16 00:23:39 +08:00
实时交替渲染的切分点吸附到句子边界,避免把文本切碎
Project CI / AI game creator shell Rust shard 2/4 (pull_request) Failing after 2m11s
Project CI / AI game creator shell Rust shard 1/4 (pull_request) Failing after 2m12s
Project CI / AI game creator shell Rust shard 3/4 (pull_request) Failing after 2m38s
Project CI / Backend tests (pull_request) Failing after 10s
Project CI / AI game creator shell Rust shard 4/4 (pull_request) Failing after 2m32s
Project CI / AI game creator shell Rust smoke (pull_request) Successful in 2m39s
Project CI / Repository checks (pull_request) Failing after 11s
Project CI / AI game creator shell web tests (pull_request) Failing after 53s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 2m1s
Project CI / Native shell tests (pull_request) Failing after 2m50s
Project CI / Frontend tests (pull_request) Failing after 3m35s
b4e6f7e07e
- renderLiveStream:工具切分点向后吸附到最近的句末标点或换行(最多前探 200 字符)
- 同一条句子里的多个工具因此落到同一切点,自动合并成一个块(不再出现 轻|量|的 这种碎片)
- 找不到边界或已到文本末尾时保留原位置,不丢内容
suzmii added 2 commits 2026-09-16 00:44:51 +08:00
- Rust:item 事件保留 itemId,文本段按 (turnId,itemId) 幂等落盘;工具项按 callId 落位置项
- 新增 .agent/conversations/turn-stream.jsonl(schema agc-turn-stream.v1):seq 为位置真相,首次分配后不回退;updatedAt 单调、同刻取更长文本;脱敏/上限/坏行跳过沿用工具卡片口径
- 发射器新增 emit_with_stream_items(不改 emit 现有签名),事件新增可选 streamItems
- 新增读取命令 read_direct_turn_stream(权限 conversation.read)
- 前端:打开项目读取历史流,实时按事件合并(同 id 幂等);按流渲染 text 块与工具块,相邻工具合并、夹文本则分块;回合末渲染结束时间与总耗时
- 回退:该回合没有流项(老项目/缺文件/读取失败)时沿用原渲染,不白屏不丢内容
- 删除长度切点/标点吸附/1 秒时间窗三套启发式
- cargo build 通过、tsc 无新增错误、编码检查通过;未跑测试
合并 feat/turn-stream-order:按 item 分段的对话流
Project CI / AI game creator shell Rust shard 1/4 (pull_request) Failing after 1m29s
Project CI / AI game creator shell Rust shard 2/4 (pull_request) Failing after 1m27s
Project CI / AI game creator shell Rust shard 3/4 (pull_request) Failing after 1m44s
Project CI / AI game creator shell Rust shard 4/4 (pull_request) Failing after 1m41s
Project CI / AI game creator shell Rust smoke (pull_request) Successful in 1m30s
Project CI / Backend tests (pull_request) Failing after 10s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 2m11s
Project CI / Frontend tests (pull_request) Failing after 2m40s
Project CI / Repository checks (pull_request) Failing after 10s
Project CI / Native shell tests (pull_request) Successful in 5m18s
Project CI / AI game creator shell web tests (pull_request) Failing after 2m40s
5519f9e3a7
- 冲突文件 ProjectSupervisorView.tsx 取新功能侧(它取代了按长度/标点/时间窗的启发式切分)
- 其余文件自动合并(Rust 流记录、读取命令、前端状态与渲染)
suzmii added 1 commit 2026-09-16 00:47:35 +08:00
去掉默认问候与对话内重复的进行中耗时
Project CI / AI game creator shell Rust shard 1/4 (pull_request) Failing after 1m48s
Project CI / AI game creator shell Rust shard 2/4 (pull_request) Failing after 1m54s
Project CI / AI game creator shell Rust shard 3/4 (pull_request) Failing after 1m54s
Project CI / AI game creator shell Rust shard 4/4 (pull_request) Failing after 1m53s
Project CI / AI game creator shell Rust smoke (pull_request) Successful in 1m40s
Project CI / Backend tests (pull_request) Failing after 10s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 2m34s
Project CI / Frontend tests (pull_request) Failing after 3m11s
Project CI / Repository checks (pull_request) Failing after 10s
Project CI / Native shell tests (pull_request) Successful in 5m18s
Project CI / AI game creator shell web tests (pull_request) Failing after 3m41s
f1632533df
- createDefaultChatMessages 不再插入「想做什么游戏?」占位消息(对话记录里没有信息量,且会出现在用户消息之后)
- 空对话改为按回读结果替换(新增 isEmptyConversation 判断),历史加载不受影响
- renderTurnUsage:回合进行中不再在对话里显示「本轮进行中 · 用时」,进行中的耗时由输入框上方的过程卡负责显示,避免重复;回合结束后仍显示「本轮结束于 … · 耗时 …」
- tsc 0 错误
suzmii added 1 commit 2026-09-16 00:51:26 +08:00
修文本段被截断:同一 item 的文本按更长优先合并
Project CI / AI game creator shell Rust shard 1/4 (pull_request) Failing after 1m47s
Project CI / AI game creator shell Rust shard 2/4 (pull_request) Failing after 2m1s
Project CI / AI game creator shell Rust shard 3/4 (pull_request) Failing after 2m24s
Project CI / AI game creator shell Rust shard 4/4 (pull_request) Failing after 2m23s
Project CI / Backend tests (pull_request) Failing after 11s
Project CI / AI game creator shell Rust smoke (pull_request) Successful in 2m0s
Project CI / Repository checks (pull_request) Failing after 11s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 2m59s
Project CI / Frontend tests (pull_request) Failing after 3m54s
Project CI / AI game creator shell web tests (pull_request) Failing after 3m52s
Project CI / Native shell tests (pull_request) Has been cancelled
cae6006a96
- 现象:回合正文只剩前缀(如"我来"),后面的完整文本没进对话流
- 根因:文本段快照的 updatedAt 未必单调递增,而合并规则只在 updatedAt 更新(或同刻)时才替换,后到的更长文本被判为"更旧"而丢弃
- Rust(direct_turn_stream.rs):kind=text 时更长文本优先;合并后 updated_at 取两者最大值,不回退顺序元数据
- 前端(App.tsx mergeTurnStreamItems):同规则改为更长优先
- 验证:cargo build 0 error、tsc 0 错误
suzmii added 1 commit 2026-09-16 00:54:18 +08:00
修重载对话后工具卡片消失(老项目回退路径)
Project CI / AI game creator shell Rust shard 1/4 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust shard 2/4 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust shard 3/4 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust shard 4/4 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust smoke (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
08eb475845
- 根因:没有 turn-stream.jsonl 的回合走回退路径,靠 direct-codex:<turnId>:assistant 合成 id 找锚点;老项目持久化的 assistant 消息 id 是 Codex 原始 id(如 0cef4af7-…),锚不上,工具调用被丢弃
- 修法:锚不上的工具按回合收集,渲染在消息列表末尾(按首个 startedAt 排序),绝不丢失
- 一并包含:文本段按"更长优先"合并(前后端两侧),修正文只剩前缀的问题
- tsc 0 错误、cargo build 0 error
suzmii added 1 commit 2026-09-16 01:02:40 +08:00
修历史回合不渲染流:消息与回合按位置配对
Project CI / AI game creator shell Rust shard 1/4 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust shard 2/4 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust shard 3/4 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust shard 4/4 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust smoke (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
f4890d02b5
- 根因:流的 key 是 turnId,而持久化历史消息的 id 是 Codex 原始 id(如 a0e105c1-…),前端用 direct-codex:<turnId>:assistant 合成 id 配对永远失败 → 有流的回合既不渲染流也不渲染工具(实机 DOM:groups=0,只有 user+assistant×2)
- 修法:回合按首次出现时间排序后与用户消息按位置配对(第 N 个回合 ↔ 第 N 个用户消息);流序列渲染在该用户消息之后,该回合的 assistant 消息交给流(避免文本重复);没配上用户消息的回合兜底渲染在列表末尾
- 保护:若流的文本明显短于持久化 assistant 原文(老数据被截断过),流只渲染工具块(toolsOnly),正文仍由消息渲染,避免丢内容
- tsc 0 错误
suzmii added 1 commit 2026-09-16 01:08:19 +08:00
修历史回合工具卡片与回合流被整批过滤掉
Project CI / AI game creator shell Rust shard 1/4 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust shard 2/4 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust shard 3/4 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust shard 4/4 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust smoke (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
3f558bc1c1
- 根因:App 侧 visibleTurnIds 用 directCodexTurnIdFromAssistantMessageId 解析消息 id,该函数要求 direct-codex: 前缀且 :assistant 结尾;实际数据里用户消息是 :user 结尾、assistant 消息是 Codex 原始 id(08ca3ef7-…),一个都解不出来 → visibleToolCalls / visibleTurnStreamItems 双双被过滤为空 → 视图拿不到工具与流(实机:groups=0,重进会话后工具消失)
- 修法一:新增 directCodexTurnIdFromConversationMessageId,:user / :assistant 两种后缀都认
- 修法二:一个回合都解不出来时(老历史)不过滤,交给视图的位置配对与兜底渲染决定位置
- 已删除诊断用的 window.__AGC_DEBUG 临时钩子
- tsc 0 错误
suzmii added 3 commits 2026-09-16 02:32:00 +08:00
合并主线Thread Manager订阅和历史分页能力
保留对话工具卡片、流式输出和回合终止恢复
发送队列携带结构化用户内容,附件接入规范用户消息
同步后台轮询环境下的会话隔离断言与异步测试约定
统一对话回合投影并优化工具命令展示
Project CI / AI game creator shell Rust shard 1/4 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust shard 2/4 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust shard 3/4 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust shard 4/4 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust smoke (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
09791eb9e4
按回合唯一归属渲染正文与工具,修复完成快照冲刷和历史归并

补齐工具输入输出,Windows命令卡片隐藏PowerShell启动器包装

时间显示精确到秒,结束信息右对齐并调整输入框文案与引用按钮间距

同步回归用例与规范文档,保留实机验收待办
suzmii added 2 commits 2026-09-16 03:03:59 +08:00
活动回合快照与Direct事件统一管理生命周期,避免历史终态回放恢复忙碌态

用户消息显示发送时间,历史信封保存时间并通过独立映射回读

完成后统一折叠中间输出和工具调用,最终回复与失败提示保持可见

同步回归用例与规范文档,保留原生实机验收待办
统一对话区域文字颜色
Project CI / AI game creator shell Rust shard 1/4 (pull_request) Failing after 2m2s
Project CI / AI game creator shell Rust shard 2/4 (pull_request) Failing after 2m15s
Project CI / AI game creator shell Rust shard 3/4 (pull_request) Failing after 2m10s
Project CI / Backend tests (pull_request) Failing after 10s
Project CI / AI game creator shell Rust shard 4/4 (pull_request) Failing after 2m2s
Project CI / AI game creator shell Rust smoke (pull_request) Successful in 2m8s
Project CI / Repository checks (pull_request) Failing after 10s
Project CI / AI game creator shell web tests (pull_request) Failing after 51s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 2m5s
Project CI / Native shell tests (pull_request) Failing after 2m10s
Project CI / Frontend tests (pull_request) Failing after 3m11s
60d6619598
正文、工具内容、执行过程和时间统一使用主题正文色

保留错误与禁用状态语义,移除硬编码字体颜色并同步文档
suzmii added 2 commits 2026-09-16 04:05:03 +08:00
同步主分支的错误反馈重试与工作台入口调整

保留回合流去重、快照落盘收尾与对话输入文案
统一智能体对话层级并完善素材导出与文档预览
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
5cd02aa8b0
当前Agent与策划Agent共用正文和过程表现组件,统一思考及工具调用的小字号浅色样式
素材工具栏按实际动作分组,导出紧邻删除并修复空分组重复分隔线
文档与代码使用共享Markdown预览和代码高亮,复用按需读取与缓存
移除未调用的活跃回合查询命令,保留正式快照恢复链路
补充回归用例并同步技术方案和团队约定
suzmii changed title from WIP: 对话面板对标 Codex(工具调用折叠块/输入盒能力/面板对齐) to 完善 AGC 对话流与工具调用,统一消息层级并新增文档预览 2026-09-16 04:05:57 +08:00
suzmii merged commit 6ae188334b into master 2026-09-16 04:07:41 +08:00
suzmii deleted branch feat/chat-codex-ui 2026-09-16 04:07:51 +08:00
Sign in to join this conversation.