Skip to content

优化项目对话、刷新续流、实时滚动与工具状态恢复 - #245

Open
RuoJi6 wants to merge 32 commits into
Ed1s0nZ:mainfrom
RuoJi6:main
Open

优化项目对话、刷新续流、实时滚动与工具状态恢复#245
RuoJi6 wants to merge 32 commits into
Ed1s0nZ:mainfrom
RuoJi6:main

Conversation

@RuoJi6

@RuoJi6 RuoJi6 commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

背景与目标

本次改动围绕项目化对话、人工审批和长会话交互进行整体优化,重点解决多对话并发、服务重启、长历史滚动、刷新续流、双标签页状态同步、审批状态不同步,以及实时输出期间滚动位置被反复拉回等问题,并统一对话页的视觉与操作逻辑。

主要改动

项目与对话导航

  • 增加稳定的“无项目”虚拟文件夹,集中展示未绑定项目的对话。
  • 新任务默认继承当前所在项目;切换项目后,新对话欢迎语同步更新。
  • 支持项目和对话置顶,置顶、删除后立即刷新侧栏。
  • 移除未使用的“对话分组”,修复项目折叠、排序及“无项目”误展开。
  • 项目根据展开状态显示打开或关闭文件夹图标。
  • 项目与对话支持更易命中的悬浮预览;对话预览显示本地年月日时分。
  • 项目名称超过 12 个 Unicode 字符时仅在界面省略,完整名称仍用于悬浮和无障碍信息。
  • 项目侧栏首批显示 6 个项目,通过“加载更多”按批追加。

对话刷新、续流与滚动

  • 新对话页居中显示当前项目欢迎语,移除主时间线中的用户和助手头像。
  • 输入框支持 Enter 发送、Shift+Enter 换行,并兼容输入法候选确认。
  • 刷新指定对话时直接恢复目标页面,不再短暂闪现主页面或“无项目”。
  • 刷新运行中任务后恢复已持久化迭代记录,并继续接收后续增量。
  • 事件流关闭、订阅竞态或终态事件缺失时,通过数据库对账最终正文与过程详情。
  • 实时输出与刷新续流均使用两层独立滚动:外层对话滚动、内层推理迭代滚动。
  • 用户轻微上滑时立即解除外层和内层粘底,并取消已经排队的自动滚动帧,避免输出期间视口上下跳动。
  • 只有用户明确向下滚动并到达真实底部后才恢复自动跟随;布局变化、模式切换及流式内容增高不会自行重新开启粘底。
  • 修复长文本刷新后内容停止更新、任务完成后详情未折叠及暗色模式操作按钮过亮。
  • 增加主代理迭代分割线和长会话轮次导航,扩大悬浮与点击热区。

工具执行状态恢复

  • 统一实时事件与刷新历史记录的工具状态渲染逻辑。
  • 刷新页面或重新展开历史过程详情后,重新显示 ✅ 已完成❌ 执行失败、执行中及结果缺失状态。
  • 工具结果到达、语言切换和历史记录恢复均复用同一状态徽标,避免只保留颜色而丢失可见状态文字。

服务重启与任务终态

  • 服务重启后,不再把遗留 处理中... 占位继续识别为运行任务。
  • 中断、审批超时、审批拒绝和执行失败使用独立终态及固定耗时,不再按当前时间无限增长。
  • 对历史数据执行有证据约束的安全迁移:仅处理审批已超时/取消/拒绝、已有终态事件,或同一对话已存在后续消息的占位记录。
  • 保留没有终态证据、仍可能恢复的占位记录,避免误判活动任务。
  • 对话时间线显示“已中断 / 已超时 / 执行失败 · 耗时 …”,并保留可展开的过程详情。
  • 服务停止或重启后立即停止审批倒计时并禁用历史审批按钮。

同一会话多标签页同步

  • 通过跨标签页任务通知和服务端活跃任务列表同步运行状态。
  • 另一个标签页会自动加载同一会话的新轮次并挂载事件补流,无需手动刷新。
  • 发送前再次获取权威任务状态,提前阻止重复任务并保留输入草稿。
  • 仅为当前可见且 conversation ID 精确匹配的任务补流,不影响其他并发会话。

人工审批与模型

  • 审批卡同时显示在对话时间线和底部输入区,两处均可允许或拒绝。
  • 项目汇总等待批准数量;具体对话按剩余时间显示状态和进度条。
  • 隔离人工审批与 Agent 审查,Agent 审查不进入人工弹窗、项目计数或待办列表。
  • 审批记录显示真实工具名称,并保留请求参数、修改内容和最终裁决。
  • write_file 加入 HITL 内置免审批工具集合。
  • 输入区展示系统实际模型,支持直接选择模型与推理强度并自动保存。

验证结果

  • node --test web/static/js/*.test.cjs:85/85 通过。
  • node --check web/static/js/chat-scroll.js:通过。
  • node --check web/static/js/monitor.js:通过。
  • go test ./internal/handler:通过。
  • go test ./internal/database -run TestProcessDetailsSummary:通过。
  • git diff --check:通过。
  • 内置浏览器真实回归:
    • 长文本持续输出时,用户向上滚动 18px 即可脱离粘底;后续内容继续增长时阅读位置保持不变;
    • 用户主动滚回真实底部后恢复自动跟随;
    • 刷新并重新展开历史过程详情后,同时恢复 ✅ 已完成❌ 执行失败 状态;
    • 新版本脚本无新增控制台错误或框架错误覆盖层。

提交范围

  • 本 PR 仅包含项目对话、刷新续流、实时滚动、多标签页同步、工具状态、审批、中断终态及对应测试。
  • ASM 分支、ASM 工作区和 ASM 相关改动未包含在本 PR 中。

@RuoJi6 RuoJi6 changed the title feat(ui): modernize the project-based chat workflow feat(ui): 优化项目对话与人机协同审批体验 Aug 10, 2026
@RuoJi6 RuoJi6 changed the title feat(ui): 优化项目对话与人机协同审批体验 feat(ui): 优化项目对话、人机审批与模型设置体验 Aug 11, 2026
@RuoJi6

RuoJi6 commented Aug 11, 2026

Copy link
Copy Markdown
Contributor Author

本次追加更新:

  • 修复对话置顶点击后无即时反馈的问题,置顶成功后立即显示并排序。
  • 修复删除对话必须刷新页面才消失的问题,项目树、最近对话和分组列表会立即同步。
  • 为项目文件夹增加置顶/取消置顶入口,置顶项目优先展示并显示图钉。
  • 完善对话分组删除:校验接口结果,删除成功后即时清理本地状态,分组内对话不会被删除。
  • 增加并发请求序列保护,避免旧请求覆盖最新操作结果。

验证:JavaScript 语法检查通过,前端自动化测试 45/45 通过,git diff --check 通过。

@RuoJi6

RuoJi6 commented Aug 11, 2026

Copy link
Copy Markdown
Contributor Author

本次根据实际界面反馈完成语义修正:

  • 移除对话侧栏中的整块「对话分组」区域及新建分组入口。
  • 调整项目文件夹排序为:置顶项目 → 无项目 → 普通项目。
  • 取消置顶后「无项目」会恢复到普通项目之前;重新置顶后项目会即时移动到「无项目」之前并显示图钉。
  • 更新前端静态资源版本,避免浏览器继续使用旧项目排序脚本。

验证结果:前端自动化测试 46/46 通过;内置浏览器实测取消置顶、重新置顶和侧栏区域移除均通过;干净页面控制台无 error/warn。

@RuoJi6 RuoJi6 changed the title feat(ui): 优化项目对话、人机审批与模型设置体验 feat(ui): 优化项目对话、审批与长会话导航体验 Aug 11, 2026
@RuoJi6 RuoJi6 changed the title feat(ui): 优化项目对话、审批与长会话导航体验 优化项目对话、人工审批与长会话交互 Aug 12, 2026
@RuoJi6 RuoJi6 changed the title 优化项目对话、人工审批与长会话交互 优化项目对话、人工审批、刷新续流与多标签页同步 Aug 13, 2026
@RuoJi6 RuoJi6 changed the title 优化项目对话、人工审批、刷新续流与多标签页同步 优化项目对话、人工审批、刷新续流与中断终态 Aug 13, 2026
@RuoJi6 RuoJi6 changed the title 优化项目对话、人工审批、刷新续流与中断终态 优化项目对话、刷新续流、实时滚动与工具状态恢复 Aug 13, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant