|
|
16900b0a20
|
fix(chat): 修复子智能体完成通知不实时显示,压缩残留锁死输入与切换
- 通知:inject_runtime_user_message 不再把子智能体任务 id 透传为事件顶层
task_id(sender setdefault 不覆盖,前端任务归属守卫丢弃事件;socket 通道
在轮询模式下不渲染,双通道断头导致只能刷新后从历史看到)。后台指令因透传
的是 command_id 而不受影响
- 通知:修复 _persist_and_echo_preceding_notice 回显写在 except 分支内,
批量通知前 N-1 条从不实时回显
- 压缩:移除「压缩中切换/新建对话需确认并取消压缩」拦截(多对话独立运行后
无存在意义)
- 压缩:新增 compressionConversationId,输入/发送/停止锁按对话隔离,/new
新建页不再被其他对话的压缩状态锁定
- 压缩:metadata 记录 compression_pid,status/compression_status 读取时按
pid 懒清理进程重启后的残留 in_progress 标记;run_deep_compression 异常时
自动清理标记
|
2026-08-12 22:27:31 +08:00 |
|
|
|
04bd93646b
|
fix(chat): /new 页面隔离运行中对话的任务接管与事件推送
对话运行期间进入 /new 会把最近一次用户输入与后续 AI 输出/工具
调用渲染到空白页,刷新/重复进入均复现,任务结束后才正常。
根因是显式新建路由(currentConversationId 为空)下三层隔离缺失:
- restoreTaskState 经 loadRunningTask(null) 接管任意运行中任务并
全量重放事件、恢复轮询(刷新后复现的根因)
- handleTaskEvent 的对话不匹配守卫要求当前对话 id 为真才生效,
空 id 被绕过
- socket 的 thinking/text 六个流式处理器不做 conversation_id 检查
修复:显式新建路由下 restoreTaskState 直接返回;事件守卫把
"空 id + 显式新建路由"判为不匹配;流式处理器补对话守卫。
从 /new 发送消息不受影响(先建对话改路由,后才启动轮询)。
|
2026-07-29 12:36:03 +08:00 |
|
|
|
4596c67967
|
fix(chat): 修复工具调用期间刷新页面导致对话记录重复显示
思考→工具调用(无文本输出)期间刷新时,服务端因文件态末条 assistant
带 tool_calls 判定 needs_rebuild=True(replay_from=0),但前端忽略该
判定自行重算:renderHistoryMessages 已把进行中工具状态改写为 'stale',
hasInProgressActions 的状态清单不含 'stale',误判走 follow 分支后从
事件 0 全量重放并新建 assistant,同一段运行记录显示两遍(伴随
"已恢复连接"弹窗)。
needsRebuild 计算对服务端判定取 OR(bootstrapReplay.needs_rebuild 与
decision_inputs.has_pending_tool_calls):重建是安全方向,拿不准就重建。
|
2026-07-29 12:10:14 +08:00 |
|
|
|
f953127613
|
fix(frontend): 修复引导/压缩等运行期注入消息场景下刷新导致运行记录重复显示
刷新恢复运行中任务时,重建判据只看最后一条消息:当运行区间中夹着
运行期注入的 user 消息(运行中引导/通知、多智能体内联消息、压缩续接
引导语)时,引导前的静态 assistant 段未被清空,而事件重放从 0 重建
整个任务内容,导致同一段运行记录显示两遍。
修复:重建前先界定本次运行区间(越过 assistant 与运行期注入 user 消
息,直到任务发起消息),复用区间内第一条 assistant 作为重放容器并
移除区间其余部分(注入消息与后续分段由事件流按原序重建),同时绑定
currentMessageIndex 使容器复用真正生效。
|
2026-07-22 22:20:25 +08:00 |
|
|
|
858ff45187
|
feat(static): 进入对话统一走 bootstrap 协议(方案B)
新增 enterConversation 单一入口:一次 GET bootstrap 拿全量数据,
restoreTaskState 增加快速路径(注入 task/events 跳过三次串行请求与
4s 死等,消除运行中刷新的两段式体验);needsRebuild 仍前端重算保证
恢复行为与现状等价。PUT load 保留后端兼容、前端不再调用。
|
2026-07-20 22:31:01 +08:00 |
|
|
|
a4eb688814
|
feat(server,static): 对话运行状态 REST 对账与 conversation 级 WebTerminal 隔离
议题1 运行状态对账:
- 后端新增 GET /api/conversations/<id>/running-status 聚合主任务/子智能体/
后台命令/多智能体四类运行状态
- 前端 3 个 1s probe 收敛为单个 2.5s 对账循环,事件为主、对账纠偏,
清理方向连续 2 次确认,恢复方向立即接管,修复轮询 404 卡死
议题4 conversation 级隔离:
- terminal 缓存键改为 username::workspace::conversation 三段,
每个对话独立 WebTerminal/文件管理/终端/子智能体
- 同工作区多对话可并行运行,互斥维度从工作区改为同对话
- socket 终端面板按对话过滤广播,terminal 工具每对话最多 3 个
- 常驻内存 + 24h TTL 回收器(无活动且无运行任务才回收)
- 子智能体 restore 按 owner_conversation_id 过滤,避免多 manager 重复恢复
|
2026-07-20 01:05:17 +08:00 |
|
|
|
e90610ed05
|
fix(frontend): 修复刷新后AI等待提示与终端侧边栏重复问题
- 修复模型调用工具后刷新页面,AI回复头部等待提示文字再次出现的bug
- restoreTaskState 根据 hasAssistantContentEvent 精确设置 awaitingFirstContent
- handleAiMessageStart 从头重建时保留 restoreTaskState 的设置
- handleToolStart 兜底清除 awaitingFirstContent
- 修复刷新页面后终端侧边栏已有内容重复显示绿色箭头与输入内容的bug
- 后端 get_snapshot/get_terminal_output 返回 last_event_time
- 前端 TerminalPanel 基于 last_event_time 对 terminal_output 事件去重
|
2026-06-22 20:35:00 +08:00 |
|
|
|
f661dc6456
|
refactor(server,modules,utils,frontend): split oversized modules into packages and fix regressions
- Split server/chat.py, server/status.py, server/tasks.py into sub-packages
- Split utils/context_manager.py, utils/conversation_manager.py into mixin packages
- Split modules/file_manager.py, persistent_terminal.py, terminal_ops.py, mcp_client_manager.py into packages
- Split core/main_terminal_parts/context.py into base + mixins
- Split static/src/app/methods/{ui,message,upload,taskPolling,conversation} into sub-modules
- Fix flattened method exports, dynamic import paths, missing cross-module imports
- Add missing permission/network/execution mode constants and _PERMISSION_MODE_LABEL
- Update AGENTS.md, CLAUDE.md and project memories to reflect new structure
|
2026-06-20 15:54:48 +08:00 |
|