release: validate the complete 0.15.0 branch snapshot
GoodBuddy Agents / Validate Agent source (push) Canceled after 0s
GoodBuddy Agents / Build darwin arm64 Agent (push) Canceled after 0s
GoodBuddy Agents / Build linux arm64 Agent (push) Canceled after 0s
GoodBuddy Agents / Build linux x64 Agent (push) Canceled after 0s
Cross-platform packages / Validate source (push) Canceled after 0s
Cross-platform packages / Authorize desktop packaging (push) Canceled after 0s
Cross-platform packages / linux arm64 (push) Canceled after 0s
Cross-platform packages / macos arm64 (push) Canceled after 0s
Cross-platform packages / windows arm64 (push) Canceled after 0s
Cross-platform packages / linux x64 (push) Canceled after 0s
Cross-platform packages / macos x64 (push) Canceled after 0s
Cross-platform packages / windows x64 (push) Canceled after 0s
Cross-platform packages / Publish GitHub and OSS release (push) Canceled after 0s

Account for concurrent composer, conversation-order, desktop-notification,
and Supervisor discussion changes in bilingual notes and feature matrices.
Correct the removed entity-writeback description in the companion article.

Align the configuration fixture with the default-on notification setting,
scope note-source UI queries and wait for completed actions, and preserve
all real Obsidian child-process checks with a 15-second scenario allowance.

Validation: frozen complete tree passed 5371 Linux tests with 51 skipped;
19 focused Windows tests, typecheck, lint, and release-note validation passed.
The older 5345-test Host result did not cover all concurrent branch changes
and is not treated as validation of this complete candidate.
This commit is contained in:
mesalogo
2026-09-28 03:06:41 +08:00
parent d9e1e42288
commit 5cdffee9ee
8 changed files with 62 additions and 11 deletions
+11 -1
View File
@@ -52,6 +52,12 @@ records are listed separately and do not introduce another feature status.
longer stop at 100 conversations, and consecutive sends no longer truncate
saved history beyond 500 messages. Model context limits still apply;
previously lost messages cannot be restored.
Pinned and unpinned groups order by the latest message creation time,
keeping positions stable during streaming text and tool updates.
- [x] **Optional desktop task notifications**: A default-on switch under
Platform Features / General immediately controls system task reminders.
In-app notifications remain available independently; General settings group
shortcuts, conversations and notifications, and workspace and downloads.
- [x] **On-demand contextual help**: Supplementary page and settings
explanations use shared title- or field-adjacent help controls with mouse
and keyboard access. Important operation consequences and errors remain visible.
@@ -792,7 +798,7 @@ records are listed separately and do not introduce another feature status.
[Smart Heartbeat PRD](./docs/features/smart-heartbeat/prd.md).
- [x] **Supervisor reviews, story graphs, and activity**: Review a selected scope
and period, read dated supervision results and history in Work review, inspect saved result graphs and sources, confirm or revise entities,
and preview local knowledge entity writes. Sidebar feedback follows or pins a
and continue a discussion with source-linked review context. Sidebar feedback follows or pins a
Conversation or Task and opens its matching result. It shows target names with
compact pin/refresh buttons and preserves long-title readability and keyboard
focus in narrow sidebars. Activity combines heartbeat
@@ -811,6 +817,10 @@ records are listed separately and do not introduce another feature status.
cancellation from Activity preserves saved batches and holds admission until
cleanup finishes. Cancelled reviews cannot resume. Story-graph events, entities,
and relations have separate counted tabs synchronized with canvas selection.
Continue discussion opens directly from feedback or graph sources, with an
editable question and explicit target-conversation navigation. The UI no
longer exposes knowledge-entity writeback controls or redundant context
explanations, and Automatic supervision hides empty metrics until activity exists.
- [ ] **Further supervision capabilities** (planned): Full event-by-event replay,
Experiment targets, chronological manual-edit audits, event
triggers, and broader execution observation remain incomplete. Current automatic
+4 -1
View File
@@ -22,6 +22,8 @@
- [x] **跨项目会话活动**:统一入口汇总各项目正在运行和需要处理的对话,保留仍有活动的较早会话。锚定的“项目 → 会话”菜单支持键盘导航和精确打开对话,不再使用整块活动弹窗;空闲时隐藏摘要,长会话子菜单独立滚动,项目选择器继续显示活动数量。
后台会话成功完成后,在本次客户端运行期间保留完成提示,直到对应聊天可见且加载完成;提示不跨重启保留。
- [x] **会话置顶与完整历史**:常用会话可置顶,重启后保留。列表和搜索不再限于最近 100 个会话,连续发送不再截断超过 500 条的已保存历史;模型上下文限制仍有效,已丢失的历史无法恢复。
置顶与非置顶分组按最近一条消息的创建时间排序,流式文本和工具进度更新不再反复改变位置。
- [x] **可选桌面任务通知**:“平台功能 / 通用设置”提供默认开启、保存后立即生效的系统任务提醒开关,应用内提示独立保留;通用设置按快捷键、会话与通知、工作目录与下载分组。
- [x] **按需上下文帮助**:页面和设置中的补充说明使用标题或字段旁的共享帮助入口,支持鼠标与键盘;关键操作后果和错误提示保持可见。
- [x] **紧凑会话控件**:输入选项集中在紧凑设置面板,Runtime、工作模式、发送和队列操作保持可用;会话搜索提供内嵌清除按钮,清除后恢复当前范围列表并把焦点返回输入框。
- [x] **会话历史按需加载**:列表只加载轻量摘要,不再一次读入全部会话的过程元数据;已打开和活动会话保留完整详情,搜索、复制、导出、续聊和远程待答问题保持可用。图片合并不会重新发送未变化消息,已确认保存的空闲详情随现有视图缓存释放。详见[历史读取与保留规则](./docs/features/assistant-workbar/execution-history-storage.md#会话列表读取与前端保留)。
@@ -120,8 +122,9 @@
- [x] **定时消息沿用会话**:定时消息使用会话当前历史、Runtime、工作模式和已保存的知识检索设置;任务详情显示实际运行模式,当前 occurrence 未结束时禁止重复“立即运行”。
任务中心通过状态数量和筛选定位运行中及待处理任务,审批操作保留在对应任务卡片中。
- [x] **自动监督设置与范围**:“监督者 > 自动监督”统一管理计划、自动监督报告和建议,支持创建和编辑 Global 或指定一个、多个 Project 的每日、每周计划;工作回顾阅读带日期的统一监督结果及历史。旧单项目配置无损迁移,项目级记忆与行动输出必须显式指定范围内的 Project。Task Center 和设置中心不再复制心跳表单;按分区回顾、候选生成和唤起条件仍待设计。详见 [智能心跳 PRD](./docs/features/smart-heartbeat/prd.md)。
- [x] **监督者回顾、故事线图谱与活动**:按范围和时间回顾工作,查看保存结果的图谱及来源,确认或修订实体,预览写入本地知识库实体。侧栏可跟随或固定 Conversation、Task,并打开匹配结果。活动合并心跳报告与下游监督的阶段状态,保留失败和旧结果入口。自动阶段只处理新增、修改及未处理的来源片段,无变化时跳过模型;手动回顾重新整理有界历史。回顾只读且禁止工具,模型调用可能产生费用,详见[实施与验证记录](./docs/features/conversation-supervision/progress.md)。
- [x] **监督者回顾、故事线图谱与活动**:按范围和时间回顾工作,查看保存结果的图谱及来源,确认或修订实体,并带入相关回顾上下文继续讨论。侧栏可跟随或固定 Conversation、Task,并打开匹配结果。活动合并心跳报告与下游监督的阶段状态,保留失败和旧结果入口。自动阶段只处理新增、修改及未处理的来源片段,无变化时跳过模型;手动回顾重新整理有界历史。回顾只读且禁止工具,模型调用可能产生费用,详见[实施与验证记录](./docs/features/conversation-supervision/progress.md)。
手动开始、自动触发和继续共用一个活动回顾;活动记录可取消并保留已保存批次,清理结束前不接纳新回顾,已取消回顾不可继续。故事线事件、实体和关系按独立页签展示数量,并与画布选择同步。
可从监督反馈或图谱来源直接继续讨论,编辑问题并明确打开目标会话;界面不再提供知识实体写回控件或重复上下文说明,自动监督没有活动时隐藏空指标。
- 手动回顾分页处理所选历史,并按批保存事实与来源;不再按固定时长自动暂停,仍支持主动暂停和从保存进度继续。设置提供并发、单次请求超时、批次大小和响应容量;活动记录突出相连阶段、已保存批次与剩余来源,次要统计可展开查看。工作回顾采用全宽纵向布局,运行状态单独显示,空态不再挤在控件旁。
- [ ] **监督后续能力**(规划中):逐事件完整回放、Experiment 目标、人工修改时间序列审计、事件触发及更完整的执行观察仍未完成。当前自动回顾受输入预算和滚动窗口限制,删除报告不会重置处理进度或重建图谱。详见 [会话监督 PRD](./docs/features/conversation-supervision/prd.md)。
- [ ] **批量运行与对比实验室**(规划中):对模型、Prompt、角色和工作流配置执行批量对比,汇总质量、耗时、Token、费用、失败率和成果差异。
@@ -141,6 +141,34 @@ Escape 返回列表仍失败,活动历史迁移这次超过默认 5 秒时限
- 上述均为测试或验证文档调整,不新增真实模型调用,不改变 Agent 发布输入。
正式发布仍要求当前候选自己的 CI/生产构建通过。
## 完整分支快照重新核对
`d9e1e42` 的 [Desktop CI 36340682594](https://github.com/mesalogo/goodbuddy/actions/runs/36340682594)
已通过原生会话采集焦点测试,但为 5,367 通过、51 跳过、4 失败。
核对祖先后确认准备期间另有四个并行提交进入分支:
`ee1bf8a` 输入区控件样式、`8e60736` 流式会话稳定排序、
`f35198d` 桌面通知开关、`d47f967` 监督结果继续讨论。
它们已随用户授权的当前分支推送;前述 Host 的 5,345 项通过使用较早源码快照,
不能作为包含这四项的新候选验证结果。
本轮已重新核对四个提交的实现和文档,补充两份功能矩阵与双语发布说明:
通知开关默认开启且不影响应用内提示;流式更新不改变排序;
监督结果可直接编辑问题并继续讨论,界面不再提供知识实体写回控件。
Agent 产品源码及 Runtime 锁未因这四项改变,Agent
[CI 36340682607](https://github.com/mesalogo/goodbuddy/actions/runs/36340682607)
源码校验和三个原生构建全部通过。
补齐通知默认值的契约 fixture;Obsidian 多次真实子进程调用使用单用例 15 秒时限,
避免前项超时后的在途调用污染下一项取消断言;笔记来源用例按面板查询控件,
并等前次来源操作释放禁用状态后再发起下一次。
这些修正不改变产品实现。Windows 聚焦回归 19 项通过,类型、lint 和说明校验通过。
从 Git tree `1758ff58a6ff33fcf7ddaa3d35dd2fcc57cd1265` 导出完整快照,
覆盖 Host 测试源码,而非只同步早期快照中的少数文件。
该完整快照 `npm test` 为 **5,371 通过、51 跳过、0 失败**,
451 个文件通过、15 个跳过,耗时 751.42 秒,包含全部四个并行提交。
最终提交前再次核对源码、测试、依赖和发布资源与该已验证 tree 一致,
仅追加本段验证结果;完整候选仍需自己的主分支 CI 与生产构建通过。
## 数据、兼容与验收边界
Desktop schema 48 新增魔法笔记会话来源元数据。升级前应备份完整用户数据,
@@ -34,9 +34,9 @@ GoodBuddy 这一轮更新围绕工作记录的整理与使用展开:监督者
右侧任务中心的项目概览下方新增监督反馈。选中任务时查看该任务的匹配结果,否则跟随当前会话;也可以固定目标,切换聊天后继续查看同一个事项。没有匹配回顾时会明确显示空状态。
查看来源后,可以选择“继续讨论”,确认目标会话和上下文,再将内容加入该会话的发送队列。需要保存摘要时,也可以选择可写的本地知识库,预览后创建知识实体。外部知识库仍保持只读。
在监督反馈或图谱来源中可以直接选择“继续讨论”,编辑问题并确认目标会话,再把相关回顾结论和来源正文加入该会话的发送队列,无需先打开来源。当前界面不再提供知识实体写回控件。
这两种后续操作目前适合短摘要:继续讨论的最终内容最多 12,000 字符,知识实体描述最多 2,000 字符。固定任务没有关联会话时,不能直接发送继续讨论。后续对话沿用目标会话的模型和工作模式。
后续讨论的最终内容最多 12,000 字符。固定任务没有关联会话时,不能直接发送继续讨论;后续对话沿用目标会话的模型和工作模式。
### 聊天正文存入魔法笔记,并保留来源
+6
View File
@@ -8,11 +8,14 @@
"zh-CN": {
"highlights": [],
"features": [
"**按需关闭桌面通知**:在“平台功能 / 通用设置”中可随时开关系统任务提醒,默认保持开启且保存后立即生效。关闭后仍保留应用内提示,通用设置也按快捷键、会话与通知、工作目录与下载分组,便于查找。",
"**连接本地 Obsidian 仓库**:在 MCP 设置中测试并启用全部已注册仓库或指定文件夹,即可在受支持的本地对话中搜索、阅读笔记,并在 Execute 中写回结果,无需安装 Obsidian 插件。默认关闭,支持直连模型及 GoodBuddy 管理的本地 OpenCode、Continue,暂不支持 DeepSeek Harness 和远程执行。",
"**把对话保存到魔法笔记**:单条 AI 回答或完整会话可先预览、编辑,再追加到已有笔记或创建新笔记,保存后可返回来源会话。右侧工作栏新增笔记入口,支持搜索与快速追加,切换会话时保留未提交草稿。",
"**从输入区打开本地 Runtime 客户端(预览)**:本地项目选择 Continue 或 OpenCode 后可打开工作栏原生终端,选择 DS 后可在系统浏览器打开官方 Web 客户端,使用当前项目和模型。客户端是独立会话,不复制 GoodBuddy 聊天历史;DS 网页关闭后服务仍运行,可在 GoodBuddy 中停止,远程快捷入口尚不支持。"
],
"fixes": [
"**流式回复时会话排序稳定**:对话按最近一条消息的创建时间排序,不再因流式文本或工具进度更新反复交换位置。新消息仍会推动会话前移,置顶会话继续排在前面。",
"**从监督结果直接继续讨论**:监督反馈和图谱来源可直接发起后续讨论,编辑问题后将相关回顾结论与来源正文带入目标会话,无需先打开来源。界面移除重复上下文说明和知识实体写回控件,自动监督没有活动时不再显示空指标。",
"**知识库列表与操作更清楚**:内容来源和文档索引合并展示,单文档来源不再重复占行,目录分组、失败来源和统一搜索仍可使用。整理重新处理、移除与任务历史入口,减少重复菜单和不明确的操作。",
"**监督回顾避免重复运行**:手动开始、自动触发和继续回顾共用运行状态,已有回顾执行时会定位当前任务,不再叠加新回顾。可从活动记录取消,已保存批次保留;故事线事件、实体和关系改为独立页签浏览。",
"**修复弹窗与窄窗口操作**:恢复删除确认按钮的可见样式,修正弹层遮挡、控件状态及窄布局滚动。助手工作栏的添加按钮不再被滚动箭头覆盖,设置和知识库中的操作保持可达。",
@@ -28,11 +31,14 @@
"en-US": {
"highlights": [],
"features": [
"**Control desktop notifications**: Turn system task notifications on or off under Platform Features / General; the default remains on and saved changes take effect immediately. In-app notifications remain available when system notifications are off, and General settings are grouped into shortcuts, conversations and notifications, and workspace and downloads.",
"**Connect local Obsidian vaults**: Test and enable all registered vaults or a selected folder in MCP settings to search and read notes in supported local conversations, and write results back in Execute, without an Obsidian plugin. Disabled by default, this supports direct models and GoodBuddy-managed local OpenCode and Continue, but not DeepSeek Harness or remote execution.",
"**Save conversations to Magic Notes**: Preview and edit an AI response or a complete conversation before appending it to an existing note or creating a new one, with links back to the source conversation. The new Notes workbar entry supports search and quick appends while preserving unsent drafts across conversation switches.",
"**Open local Runtime clients from the composer (preview)**: In a local project, open a native workbar terminal for Continue or OpenCode, or the official DS Web client in your system browser, using the current project and model. These are independent sessions without copied GoodBuddy chat history; closing the DS page leaves its service running until stopped in GoodBuddy, and remote shortcuts are not supported yet."
],
"fixes": [
"**Stable conversation order while replies stream**: Conversations are ordered by the creation time of their latest message rather than repeatedly swapping positions as text or tool progress arrives. New messages still move conversations forward, with pinned conversations first.",
"**Continue directly from Supervisor results**: Start a follow-up from supervision feedback or graph sources, edit the question, and send relevant review conclusions and source text to the target conversation without opening the source first. Redundant context explanations and knowledge-entity writeback controls are removed, and Automatic supervision hides empty metrics until activity exists.",
"**Clearer knowledge lists and actions**: Sources and indexed documents now share one list, without duplicate rows for single-document sources, while retaining directory groups, failed sources, and unified search. Reprocessing, removal, and task-history actions are organized to reduce duplicate menus and ambiguous operations.",
"**Avoid overlapping Supervisor reviews**: Manual starts, automatic triggers, and resumed reviews share the active-run state, directing you to existing work instead of starting an overlapping review. Cancel from Activity while retaining saved batches, and browse story-graph events, entities, and relations in separate tabs.",
"**Usable dialogs and narrow layouts**: Restores visible destructive-confirmation buttons and fixes overlay occlusion, control states, and scrolling in narrow layouts. Workbar scroll arrows no longer cover the add button, and settings and knowledge actions remain reachable.",
+1 -1
View File
@@ -127,7 +127,7 @@ describe('offline packaged MCPVault', () => {
expect(await call('list_directory', {})).toContain('smoke.md')
expect(await readFile(join(vaultPath, 'smoke.md'), 'utf8')).toContain('status: verified')
await call('delete_note', { path: 'smoke.md', confirmPath: 'smoke.md', trashMode: 'local' })
})
}, 15_000)
it('does not launch for an already cancelled call', async () => {
const start = vi.spyOn(StdioClientTransport.prototype, 'start')
+9 -6
View File
@@ -14140,19 +14140,22 @@ describe("App", () => {
await screen.findByText('Source history 101')
expect(screen.queryByText('Source history 1')).not.toBeInTheDocument()
fireEvent.click(screen.getByRole('button', { name: '快速笔记' }))
fireEvent.click(await screen.findByRole('button', { name: /Source note/ }))
fireEvent.click(await screen.findByRole('button', { name: '查看来源消息' }))
const notesPanel = within(await screen.findByRole('region', { name: '快速笔记' }))
fireEvent.click(await notesPanel.findByRole('button', { name: /Source note/ }))
fireEvent.click(await notesPanel.findByRole('button', { name: '查看来源消息' }))
await waitFor(() => {
expect(screen.getByText('Source history 1')).toBeVisible()
expect(document.activeElement).toHaveTextContent('Source history 1')
expect(notesPanel.getByRole('button', { name: '查看来源消息' })).toBeEnabled()
})
vi.mocked(api.conversations.get).mockResolvedValue({ ...conversation, messages: [] })
fireEvent.click(screen.getByRole('button', { name: '查看来源消息' }))
fireEvent.click(notesPanel.getByRole('button', { name: '查看来源消息' }))
expect(await screen.findByText('原消息已不存在')).toBeVisible()
await waitFor(() => expect(notesPanel.getByRole('button', { name: '返回原会话' })).toBeEnabled())
vi.mocked(api.conversations.get).mockRejectedValue(new Error('对话不存在'))
fireEvent.click(screen.getByRole('button', { name: '返回原会话' }))
expect(await screen.findByRole('button', { name: '原会话已不存在' })).toBeDisabled()
expect(screen.getByText('Saved text')).toBeVisible()
fireEvent.click(notesPanel.getByRole('button', { name: '返回原会话' }))
expect(await notesPanel.findByRole('button', { name: '原会话已不存在' })).toBeDisabled()
expect(notesPanel.getByText('Saved text')).toBeVisible()
}, 15_000)
it('guards disabling Magic Notes with an unsaved quick draft before saving application settings', async () => {
@@ -152,6 +152,7 @@ describe('GoodBuddy configuration contracts', () => {
const snapshot = {
application: {
checkUpdatesOnStartup: true,
desktopNotificationsEnabled: true,
updateSource: 'github',
modelDownloadSource: 'modelscope',
localToolEnvironment: defaultLocalToolEnvironmentSettings,