Skip to content

补齐设定工具的对话历史上下文 - #15

Open
KuramiWan wants to merge 2 commits into
eleckoi:mainfrom
KuramiWan:fix/setting-tool-history
Open

KuramiWan wants to merge 2 commits into
eleckoi:mainfrom
KuramiWan:fix/setting-tool-history

Conversation

@KuramiWan

Copy link
Copy Markdown
Contributor

Desktop Change(桌面端改动)

What changed(改了什么)

用户不可见;底层变化是角色扮演的设定读取拿回真实对话历史。

每轮输入前写出的设定桥接文件 eleckoi-setting-library-state.json,history 现在包含可见对话历史:

prepare() — 每轮输入前写设定桥接文件
  history =
-   [开场白, 当前输入]
+   [开场白, 可见对话历史, 当前输入]

  可见对话历史 = 用户输入 + 最终回复(去掉工具步骤与 <FINAL> 标签)
  会话末尾仍保留当前输入时(重新生成)→ 这一条不计入,桥接文件只追加一次

history 的两个消费者:

eleckoi-setting-library-state.json
├── eleckoi_glob_setting_files → required_entries(关键词升格为本轮须读)
└── EJS 渲染 → matchChatMessages / getMessageVar / lastMessageId

受影响的行为:关键词扫描深度 > 1 时扫描最近 N 条消息;EJS 的 matchChatMessages / getMessageVar / lastMessageId 能看到最近对话;关键词/EJS 升格的「本轮须读」判断不再失真。

根因:v0.2.8 迁入 DSH 插件后,prepareConversationRuntime 的 history 只保留开场白;迁移前 AgentSessionCoordinator 取完整历史(d3ab69d)。

Architecture route(架构归属)

  • Main 新文件仅承担桌面壳职责,位于 host / modules / platform / i18n(无新增 Main 文件)
  • Shared 新文件位于闭合集合:contracts / foundation(无新增 Shared 文件)
  • 产品跨 Host/Client 查询与命令使用生成的 Typert Remote;会话事件、分页与 projection 使用 DSH Connection 正式协议,未新增业务 IPC 或私有桥
  • Renderer 未直接访问 Electron、Node、SQLite 或 DSH SDK(无 Renderer 改动)
  • 官方运行时装配隔离在 @eleckoi/dsh-runtime;Host/Client 插件使用同版本公开合同,上游包仍是同一个精确版本批次(无版本变化)
  • 新业务进入 DSH Host/Client 插件;产品数据库与 Repository 由 @eleckoi/dsh-product-data 独占,跨模块依赖只使用对方 index.ts 公开面(改动在 dsh-client-roleplay Host 插件内部)
  • 长生命周期资源已注册为 Host/Cordis Plugin,并能反向释放(无新增长生命周期资源)

Data and compatibility(数据与兼容)

  • Schema 改动附带新的向前迁移,没有重写已发布迁移(无 Schema 改动)
  • 没有把会话、消息、角色或模型配置写入 localStorage
  • 旧数据、取消、失败或异常退出路径已考虑(取不到 Session 时 history 退回为空,不阻塞生成;重新生成保留的当前输入按会话末尾的直接用户消息识别,不比较正文;压缩摘要条目保留在历史里)

回滚与影响面

  • Door: two-way。桥接文件是运行时 JSON;revert 这两个提交再重跑 pnpm build 即可。产品数据库、Session 日志、Schema 都不动。
  • Blast Radius: roleplay。只影响角色扮演的设定读取,不动 IPC、DB、UI。副作用:每轮桥接文件写入随会话长度变大;压缩摘要条目(<compacted-summary>)会进入历史,与模型读到的历史一致。

Verification(验证)

  • pnpm test(本地已跑受影响文件;全量由 CI 执行,状态见检查项)
  • pnpm build(由 CI 执行,状态见检查项;本机 Linux 已知停在 check:licenses,与本次改动无关)
  • DSH 改动已通过 pnpm check:electron-dsh(由 CI 执行,状态见检查项;本 PR 未改 DSH 运行时装配)
  • 没有启动 Android、Docker、QEMU 或 ARM64 DSH 核心编译
  • UI 未定稿阶段没有借底层改造擅自改变 JSX/CSS 视觉(无 UI 改动)

本地证据(旧源码 + 新回归用例 → 修复后):

  • Before: 旧源码 + 新回归用例,集成用例 1 failed:
    × writes the visible conversation history into the setting library bridge
    AssertionError: expected [ { role: 'assistant', …(1) }, …(1) ] to deeply equal [ { role: 'assistant', …(1) }, …(3) ]
    Tests  1 failed | 15 passed (16)
    
  • After: 修复后同一文件 16 passed:
    ✓ |integration| tests/integration/dsh-old-chat-generation.test.js (16 tests)
    ✓ |host| packages/client/features/dsh-client-roleplay/tests/host/dsh-conversation-context.test.js (16 tests)
    

pnpm typecheck 过;快闸除 check:plugin-docs 外全过。check:plugin-docs 在未改动的 main(a5bb881)上同样失败(@eleckoi/dsh-client-html-resources 的 ./client 导出解析不到 src/client/types.ts),是基线红,与本次改动无关。

fork 侧的预跑与评审记录:KuramiWan#5

Review scope(审查范围)

  • packages/client/features/dsh-client-roleplay/src/host/conversation-context.mjs
  • packages/client/features/dsh-client-roleplay/src/host/session-runtime.mjs
  • packages/client/features/dsh-client-roleplay/tests/host/dsh-conversation-context.test.js
  • tests/integration/dsh-old-chat-generation.test.js

评审重点:会话末尾保留输入的识别(不比较正文)、压缩摘要条目的处理、取不到 Session 的退回路径。

解决的问题:

1. v0.2.8 把产品能力迁入 DSH 插件后,设定桥接文件的 history 只剩开场白和当前输入,关键词扫描深度大于 1 与 EJS 的 matchChatMessages 看不到最近对话,本轮须读的升格判断会失真。

怎么解决:

1. 准备输入时从官方 Session 面取可见对话(用户输入与最终回复,去掉工具步骤和 FINAL 标签),连同开场白和当前输入写入设定桥接文件。
2. 重新生成会保留当前输入;桥接文件只追加一次当前输入,避免重复。
3. 补单元测试与集成回归测试(普通准备与重新生成各一条)。
解决的问题:

1. 重新生成去重按正文等串比较;多段文本输入经 sessionMessageText 与 messageText 的不同拼接方式会判不等,桥接文件写两次当前输入。
2. 注释称只收用户输入与最终回复,实际把压缩检查点也当历史写入,没有用例说明。
3. 为本修复新增专用测试文件,与 TESTING.md “优先扩展现有测试”不一致;writeSettingBridge 新加的默认参数从不触发。

怎么解决:

1. 改按会话末尾的直接用户消息识别保留输入,不比较正文;压缩检查点不当作保留输入。
2. 用例并入现有 dsh-conversation-context.test.js,覆盖工具步骤、末尾保留输入、压缩检查点与空输入。
3. 去掉 writeSettingBridge 的默认参数;集成测试复用 settingBridge helper。

This branch has not been deployed

No deployments
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