migrate existing chat chain logs to fragments

This commit is contained in:
ekko
2026-06-05 10:42:18 +08:00
committed by ekko
parent 6af2a0e204
commit ea208b4e73
16 changed files with 137 additions and 0 deletions
@@ -0,0 +1,9 @@
---
date: 2026-05-28
pr: 1080
commit: a6b3bec2
feature: 历史消息分页和虚拟列表
impact: 刷新、切换、多 tab resume 时不再一次性加载全部历史消息。
---
前端 session 状态新增 `messageTotal``loadedMessageCount``hasMoreBefore` 等字段;HTTP session API 新增分页消息读取;`resume` payload 携带分页元数据。
@@ -0,0 +1,9 @@
---
date: 2026-05-30
pr: 1145
commit: cb410e50
feature: Bridge 文本和工具事件顺序
impact: 避免“文本 -> tool -> 文本”场景把字拆开或重复输出。
---
Bridge 将每个文本 chunk 同步写入 `events` 中的 `stream.delta`Node 端在事件循环内按顺序处理 `stream.delta`,并在同一 chunk 已有 ordered delta 时跳过聚合 `chunk.delta`
@@ -0,0 +1,9 @@
---
date: 2026-06-02
pr: 1240
commit: 6792a451
feature: 消息语音播放
impact: 修复浏览器语音无法按同一消息切换暂停/继续的问题。
---
普通 Chat 的 `MessageItem.vue` 使用 `useSpeech.toggleBrowser()` 处理 Web Speech 播放/暂停;同时更新 bridge OpenRouter attribution 环境变量品牌值。
@@ -0,0 +1,9 @@
---
date: 2026-06-03
pr: 1263
commit: e6648456
feature: 上下文压缩辅助模型配置
impact: Chat 压缩链路可以使用 profile 级 compression 专用 provider/model。
---
新增 profile 级 `auxiliary.compression` 设置。Chat 压缩链路在 `buildCompressedHistory()`、bridge forced compression 和运行中 compression request 中都会解析 compression 专用 provider/model`auto` 使用当前 session model/provider`main` 使用 profile 默认模型,显式配置则使用 compression 专用模型。
@@ -0,0 +1,9 @@
---
date: 2026-06-03
pr: 1272
commit: 2f1686da
feature: Bridge 工具审批 allowlistBridge 文本/turn boundary 回调
impact: 保证“始终允许”写入配置后后续同 profile run 能读到,并避免文本 delta 重复。
---
`hermes_bridge.py` 在 agent 创建和每次 run 开始时刷新 `tools.approval``command_allowlist` 进程内缓存。`stream_delta_callback` 现在只转发 turn boundary,不再把 agent 的文本 delta 再追加一遍,避免和 `stream_callback` 重复。
@@ -0,0 +1,9 @@
---
date: 2026-06-03
pr: 1273
commit: 91bb68dc
feature: 用户头像上传;group-chat 成员头像同步
impact: 不改变普通 Chat run,但改变 group-chat 成员元数据和消息展示。
---
auth 用户头像进入 group-chat 成员展示链路,`/group-chat` handshake 携带 `authUserId`,服务端按用户 id/name 查头像并同步给 room members。
@@ -0,0 +1,9 @@
---
date: 2026-06-03
pr: 1284
commit: 2aeed108
feature: Windows Agent Bridge 子进程输出解码
impact: 修复本地 code page 输出导致 subprocess reader 线程抛 `UnicodeDecodeError` 的问题,不改变 `/chat-run` 协议、消息落库或工具审批行为。
---
`hermes_bridge.py` 的 Windows parent PID 探测和 stale bridge 进程清理改用平台文本编码读取 `tasklist.exe` / `taskkill.exe` 输出,并忽略不可解码字节。
@@ -0,0 +1,9 @@
---
date: 2026-06-03
pr: 1289
commit: 7848256
feature: tool result / unified diff 展示
impact: 不改变 `/chat-run` 协议、消息落库、工具审批或 group-chat agent 执行行为。
---
`MessageItem.vue``GroupMessageItem.vue``MarkdownRenderer.vue` 和共享 highlighter 对 unified diff 走专门展示路径:tool result JSON 中的 diff 字段只显示 diff body,长段未改动上下文静态折叠,复制仍保留完整原始内容。
@@ -0,0 +1,8 @@
---
date: 2026-06-04
commit: local
feature: CLI bridge abort 超时同步
impact: abort 超时时不再提前释放 session,避免旧 Agent run 尚未退出时触发 `session ... is already running`
---
`/chat-run` abort 路径在 Hermes Agent 协作式 interrupt 未能在 bridge 同步窗口内完成时,不再提前清理 Web UI `isWorking/runId` 或启动队列,而是发送 `abort.timeout` 并保持 session locked/aborting;同会话新消息继续进入队列。当前端后续收到 bridge terminal chunk 时再发送 `abort.completed` 并释放状态。前端新增 `abort.timeout` 事件展示“仍在停止中”,并移除本地 20s 自动清 running 兜底。
@@ -0,0 +1,8 @@
---
date: 2026-06-04
commit: local
feature: Hermes 原生 AI session title 回传
impact: 不阻塞最终回复、usage、goal continuation 或队列执行,也不改 run 生命周期。
---
`hermes_bridge.py` 在 bridge run 完成后后台调用 Hermes 原生 `maybe_auto_title()` 写入 Hermes `state.db`,并提示标题语言跟随用户首条消息;Node 在 `run.completed` 后后台按 `session_id` 短轮询 `get_session_title`,同步 Web UI 本地 `sessions.title` 并推给前端。只在本地标题仍为空或等于首条消息/preview fallback 时应用,用户手动改过的标题不会被覆盖。
@@ -0,0 +1,8 @@
---
date: 2026-06-04
commit: local
feature: OpenRouter attribution title
impact: 只影响 OpenRouter dashboard attribution,不改变 `/chat-run` 协议、消息落库、模型调用或 run 生命周期。
---
`manager.ts` 的 bridge 默认 OpenRouter attribution title 从 `Hermes Web UI` 改为 `Hermes Studio`,与 `https://hermes-studio.ai` referer 品牌保持一致。
@@ -0,0 +1,8 @@
---
date: 2026-06-04
pr: 1303
feature: Chat / Group Chat 工具详情与完成事件边界
impact: 空 `run.completed.parsed_content` 不会把旧 assistant 消息误当成本次输出。
---
前端 message item 和 store mapping 现在保留 object / array / number / boolean 工具 payload`0` / `false` 不再因为 falsy 判断被隐藏;普通文本结果继续按 TEXT 展示。空 `run.completed.parsed_content` 只会保留当前流式 assistant 内容。
@@ -0,0 +1,9 @@
---
date: 2026-06-04
pr: 1320
commit: 237fd954
feature: Agent Bridge restart/resumeshutdown/stop timing
impact: server 重启后 `ChatRunSocket.resume` 会查询 bridge status 并通过 `resumeBridgeRun()` 继续 poll 既有 `run_id` 的 delta/events。
---
Web UI `restart`/页面内升级通过 `SIGUSR2` 保留 Agent Bridge。真实 `stop`/`SIGTERM` 仍会请求 bridge shutdown;非桌面 shutdown 兜底延长到 15s 以覆盖 worker 清理窗口,桌面 `HERMES_DESKTOP=true` 默认仍保持 3s。CLI `restart` 仍使用 5s graceCLI `stop` 最长等 15s 且进程退出后立即返回。
@@ -0,0 +1,8 @@
---
date: 2026-06-04
pr: 1333
feature: reasoning 多轮合并为单条 assistant 消息
impact: 同一 run 内跨 tool cycle 的 thinking 会收敛到同一条 assistant 气泡。
---
`chat.ts` 用独立的 reasoning 目标合并 `reasoning.delta` / `thinking.delta``tool.started` 仍会切断正文流目标,后续 `message.delta` 会在 tool 后新建 assistant,避免最终正文插回工具前。
@@ -0,0 +1,8 @@
---
date: 2026-06-04
pr: 1337
feature: Group Chat socket reconnect/rejoin
impact: `/group-chat` 前端 store 在 socket reconnect 后会重新 join 当前 room,并合并 join ack 中返回的消息以补回断线期间错过的内容。
---
Reconnect 后同时恢复 members/agents/typing/context status。若用户在 ack 返回前切换房间,会忽略旧 room ack;join ack 中的 `rooms` 字符串列表不会覆盖前端 `RoomInfo[]` 房间列表,避免路由和侧边栏状态被污染。
@@ -0,0 +1,8 @@
---
date: 2026-06-05
pr: 1344
feature: Chat resume bridge status 探测
impact: 进入或切换会话不会因为 resume 探测而冷启动 profile worker。
---
`ChatRunSocket.resume` 改用 broker 的 `status_if_loaded` 查询,只在对应 profile worker 已存在时转发为 worker `status`。若 worker 已加载且原 run 仍在运行,仍会通过 `resumeBridgeRun()` 继续接回 `run_id` 的 delta/events;不存在的 session status 不会污染 broker session route。