Skip to content

完善主聊天内核与 Renderer 生命周期边界 - #182

Merged
lioensky merged 138 commits into
lioensky:mainfrom
RoxyAsahi:codex/chat-kernel-deep-decoupling-draft-20260821
Aug 22, 2026
Merged

lioensky merged 138 commits into
lioensky:mainfrom
RoxyAsahi:codex/chat-kernel-deep-decoupling-draft-20260821

Conversation

@RoxyAsahi

@RoxyAsahi RoxyAsahi commented Aug 21, 2026 •

Copy link
Copy Markdown
Contributor

说明

涉及的范围比较大,感觉有点小危险,辛苦莱恩哥审一下!!

这是一次面向上游的 Chat Kernel、renderer 生命周期和统一 UI 工程化拆分与治理。

为什么需要这次改造

原有主聊天 renderer 同时承担流式传输与 terminal 协调、durable history 读写、DOM 投影、话题/助手 selection、设置主题通知 desktop push、TTS 附件 Flowlock forward、辅助窗口 preload subscription 以及多个兼容性全局对象。

这使得局部修改可能影响 IPC 顺序、持久化次数、terminal 路由、DOM/焦点/ARIA、listener 数量,以及 Classic 页面和插件协议。

整体实现

Chat Kernel 与状态边界

  • 建立无 DOM/Electron 依赖的 StreamSession、StreamState 和 StreamCoordinator。
  • 分离实时协调、renderer-transient projection 与 durable history authority。
  • terminal/persistence 只有一个权威提交点。
  • 使用 messageId + streamOperationId + generation 隔离重试、迟到 chunk 和迟到 terminal。
  • 主聊天、独立 Surface、VoiceChat、Rust Assistant 和辅助窗口使用独立 stream consumer。

Surface 与 renderer 生命周期

  • MessageRenderer 使用显式 root、render model 和 capability closure。
  • renderer.js 收敛为 Main Chat composition/lifecycle adapter。
  • settings、presentation、theme、TTS、附件、发送/取消、Flowlock、forward、通知和 preload 事件均有 named owner。
  • listener、observer、timer、异步任务和 subscription 支持幂等 dispose、quiescent drain 和迟到结果隔离。
  • 主聊天与独立 Surface 不共享 selection/history projection。

流式切题恢复

针对“流式输出等待 VCP 工具回执时切换话题,再切回后消息消失”的问题:

  • 为活动流保存 conversation-scoped transient snapshot;
  • 切回话题后执行 snapshotConversation/reconcileConversation;
  • history/DOM 重建不会丢失未 terminal 的 assistant projection;
  • history 文件读取期间如果 terminal 完成,会保护读取开始时和读取完成时的 active stream identity,避免旧文件结果误删刚提交的消息;
  • 不提前持久化半成品工具请求,不改变 VCP marker 协议和 durable authority。

Ambient/facade 与 UI

  • 删除本路线内无生产消费者的 legacy chat facade 和 direct IPC history fallback。
  • 保留的公共 facade 均冻结、不可替换、有唯一 owner、真实消费者和动态 smoke。
  • “聊天历史”和“独立聊天”保留为自动化/开发验证 Surface,但标记为 discoverable: false,普通用户不会在 Launchpad 看到。
  • Classic 子页面、插件命令协议和主聊天行为保持兼容。
  • 已归档过期路线文档,保留当前状态和审计入口。

行为等价契约

以下行为默认保持不变:主聊天发送、流式、工具等待、取消和重试;历史加载、助手/话题切换;附件;设置、主题和 presentation;通知与 desktop push;VoiceChat、Rust Assistant 和辅助窗口;Classic 页面;插件命令协议。

未登记的 IPC、terminal、持久化、DOM、焦点、ARIA、listener 或资源差异按回归处理。

验证结果

  • Chat Kernel:146/146;
  • UI System:100/100;
  • npm run check:ui-system 完整门禁;
  • design-subtraction、Classic parity/retirement、Next delta、consumer/facade 和 UI application gates;
  • StreamManager 与 ChatManager race regression;
  • launchpad 隐藏内部测试 Surface 回归测试;
  • 已有 Electron UI Apps、主聊天 sequence 和 lifecycle stress 证据。

关键新增回归覆盖:工具回执等待中切换话题、清空 projection、切回并继续接收 chunk;history read 与 terminal completion 并发;internal test Surface 不出现在普通 Launchpad;internal app 仍可通过 ID 被测试和开发入口使用。

当前证据边界

本 PR 不宣称数学意义上的绝对零回归、renderer 崩溃/进程重启后恢复未终结工具流、所有 Windows 版本/打包方式/GPU/DPI 配置均已覆盖、30–60 分钟人工 soak 已完成,或 D7 已最终闭合。

D5/D6 在当前声明范围内完成;D7 仍需要声明支持环境矩阵、真实 packaged Electron、辅助窗口 crash/reload 和人工 soak 证据。

审查入口

  • docs/chat-kernel-deep-decoupling-roadmap.md
  • docs/chat-kernel-vd7-final-audit.md
  • docs/chat-kernel-evidence-and-contracts-roadmap.md
  • docs/stream-switch-tool-wait-recovery.md

SakuraRoxy and others added 30 commits August 19, 2026 19:03
@RoxyAsahi RoxyAsahi changed the title refactor(chat): decouple the main chat kernel and renderer lifecycle 重构主聊天内核并收敛 Renderer 生命周期边界 Aug 21, 2026
@RoxyAsahi RoxyAsahi changed the title 重构主聊天内核并收敛 Renderer 生命周期边界 完善主聊天内核与 Renderer 生命周期边界 Aug 21, 2026
@RoxyAsahi
RoxyAsahi marked this pull request as ready for review August 22, 2026 05:05
@lioensky
lioensky merged commit 8e9fde9 into lioensky:main Aug 22, 2026
9 checks passed
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.

3 participants