test: stabilize 0.12.0 candidate validation
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
GoodBuddy Agents / Validate Agent source (push) Canceled after 0s
GoodBuddy Agents / Build Linux arm64 Agent (push) Canceled after 0s
GoodBuddy Agents / Build Linux x64 Agent (push) Canceled after 0s

Full-suite resource contention could make asynchronous renderer assertions and short runtime timing tests fail even though focused runs passed. Limit Vitest to two workers and give the affected UI operations the existing three-second async window.

Also include the approved Linux ARM OpenCode startup note in both feature matrices and release-note languages, and record the successful isolated Linux x64 Host validation of the current-source Runtime activation path.
This commit is contained in:
mesalogo
2026-09-02 22:57:31 +08:00
parent dc36e7a967
commit 8ecd87381f
6 changed files with 35 additions and 8 deletions
+4 -1
View File
@@ -82,7 +82,10 @@ otherwise.
parallel. Interactive questions are answered only by foreground
conversations; scheduled tasks, remote channels, delegated work, and other
background runs fail immediately with guidance to rerun in the foreground
instead of waiting indefinitely.
instead of waiting indefinitely. On managed Linux ARM Hosts, project
switching and cold startup reuse the Runtime path, registry, and manifest
verified during setup instead of repeating an OpenCode version probe or
binary check.
- [x] **Managed SSH OpenCode loop (technical preview)**: Controlled by the
separate Remote Projects (Technical Preview) tab under Settings / Platform
Features and disabled by default. Disabling it does not affect local
+1 -1
View File
@@ -27,7 +27,7 @@
- [x] **直连模型 Runtime**:支持问答、知识总结、受控工具执行和图像生成。
- [x] **直连模型编程 Agent**:本机直连文本模型可在 Execute 模式运行平台 Shell,并可按父请求模式、模型、工作区和能力范围委派一层编程 Subagent;OpenCode、Continue、DeepSeek Harness 和托管 SSH 不重复注入这两个工具。Windows 本机命令与真实模型“修改、测试、修复、复核”闭环已通过,macOS 与 Linux 真机命令仍待对应平台验收。
- [x] **OpenCode 与 Continue**:使用隔离子进程、环境变量白名单、统一配置、取消、总执行时限、有界流式输出和活动记录;共享进程回收逻辑保留 Windows 完整进程树终止,并对采用独立进程组的 POSIX 子进程执行组回收。聊天状态检查使用一次性探测 Runtime 并在返回后立即回收,不进入按模型与项目隔离的执行 Runtime 缓存;执行 Runtime 仍按项目复用,因此不同项目可并行。交互提问只由前台对话回答,定时任务、远程通道和委派等后台执行遇到提问时会立即失败并提示改为前台运行,避免无限等待。
- [x] **OpenCode 与 Continue**:使用隔离子进程、环境变量白名单、统一配置、取消、总执行时限、有界流式输出和活动记录;共享进程回收逻辑保留 Windows 完整进程树终止,并对采用独立进程组的 POSIX 子进程执行组回收。聊天状态检查使用一次性探测 Runtime 并在返回后立即回收,不进入按模型与项目隔离的执行 Runtime 缓存;执行 Runtime 仍按项目复用,因此不同项目可并行。交互提问只由前台对话回答,定时任务、远程通道和委派等后台执行遇到提问时会立即失败并提示改为前台运行,避免无限等待。托管 Linux ARM Host 切换项目或冷启动时,复用准备阶段已验证的 Runtime 路径、registry 和 manifest,不重复执行 OpenCode 版本探测或二进制检查。
- [x] **托管 SSH OpenCode 闭环(技术预览)**:该能力由“设置 > 平台功能”中的独立“远程项目(技术预览)”页签控制并默认关闭;关闭时不影响任何本地项目、普通桌面功能或桌面发布。启用后可管理固定 Host Key 的 SSH Host、浏览有界远端目录并创建 Ask/Execute 项目;Ask 在 Runtime 边界通过 bubblewrap 保持 Workspace 只读,Execute 使用所选 SSH 账号的完整权限。Agent 通过私有 Unix socket 和 ACP v4 持有 accepted Prompt、Provider/工具轮次、Runtime 进程、稳定模型 ledger 与有界语义 transcript;Desktop 退出、网络中断或本机进程结束后 Host 继续执行,重启后只 attach 原 controller/binding/operation 并把 provenance 原子归并回原对话,不重发 Prompt。模型 profile 与 API Key 只在当前 accepted operation 生命周期内进入 Agent 内存,不写入 Renderer、SSH 参数、远端环境或磁盘。远端组件不嵌入桌面包,项目切换只更新本地选择且不会连接或下载;设置页只读取小型签名目录并按 Linux x64/arm64 显示本地版本、在线最新兼容版本和“有更新/已是最新”,用户点击后才下载签名 `.gbagent`,也可导入/导出离线包。每个复合包包含 Agent、固定 Node 与由桌面源码统一维护适配的 OpenCode Runtime;在线来源跟随“关于与更新”的 GitHub/北京 OSS 选择,签名累计目录绑定最低桌面版本、Agent 协议、架构、大小、SHA-256 和固定 URL。公钥 registry 接受等价 JSON 空白和换行,但仍严格校验 schema、Ed25519 key、环境与撤销;目录、包、manifest、payload 签名和流式 SHA-256 不变。缺少某架构包只使该架构托管 SSH 不可用。项目只保存 Host、远端路径、Runtime 选择和模式;首次实际使用 Workspace/Runtime 时读取 Host current identity,同一进程内其他项目复用已确认 identity 和 Agent 连接。托管 SSH 会话只显示支持的 OpenCode 选择。同一 Host 可并行运行多个项目和对话;恢复进度分别显示网络、Agent、Runtime、已提交事件 cursor、完成或失败/重试,只阻塞受影响项目。Linux x64 真实 Host 已覆盖短/长 detach、本机 harness 强制结束、并发、SSH relay 丢失、取消、确定/不确定 Provider 失败、Agent `SIGKILL`/重启和 reopened Desktop SQLite 恢复;成功工具 START/END 各一次,未发现 Prompt、Provider 或工具重放。当前 Agent 源码 lock 为 `0.11.14`,Desktop 发布候选为 `0.12.0`;正式发布状态以 Agent 与 Desktop 的独立发布渠道为准。
- [x] **SSH Host 手动环境准备源码链路**:Host Key、认证和系统探针成功后先保存 Host,并只读探测共享 Agent/Runtime;保存 Host、打开项目都不自动安装。Host 卡片只有一个按版本事实显示“安装远程环境”“更新远程环境”或“重新安装”的主按钮,次级 SegmentedControl 选择默认且不持久化的“自动”、Host 下载或 GoodBuddy 传输;“版本匹配”badge 不等同环境健康。自动模式只在 operation/prepare 前探测并择一,显式选择保持有效,任何 prepare、commit 或 adoption 失败都不跨 acquisition 自动 fallback。两种方式把同一签名 compound `.gbagent` 交付到固定 staging 后,共用 control-plane prepare、commit、Agent activate/health、Runtime activate、finalize 与显式 cleanup。GoodBuddy 路径可在同一次操作下载并验证缺失候选、缓存并取得 lease,再有界流式 SFTP 上传一个归档和其中已验证的 bootstrap Node,不把约 294 MiB 整包读入 Main `Buffer`;Host 在解包时完成一次完整 payload 校验。未完成操作只记录暂存 cleanup 所需的 operation ID;下次更新尽力清理旧暂存后重新 prepare,不保存远端 metadata 副本,也不让 cleanup 失败阻塞新更新或回滚健康环境。已有项目在实际使用 Workspace/Runtime 时按需解析 Host current identity 并执行固定 `attach-or-bootstrap`,注册后的 health、capabilities 和 prompt 启动不扫描完整 payload。详见 [设计说明](./docs/features/remote-host/environment-provisioning-technical-design.md)。
- [ ] **SSH Host 环境准备真实 Host 验收**:源码已可使用当前 format v1 包;仍需完成 GitHub、北京镜像、Linux x64/arm64、取消和离线 GoodBuddy 传输的真实 Host 验收。当前状态不表示已发布或已完成真实 Host 测试。
@@ -382,6 +382,12 @@ model bridge,以及生命周期和恢复逻辑。单元测试、mock、fixture
为 `0700`、文件为 `0600`,单文件 3719 bytes,未超过 64 KiB。六类测试哨兵覆盖 Prompt、
密钥、环境、SSH 参数、用户文件内容和原始错误消息,CLI 输出与磁盘均未出现哨兵。把隔离
diagnostics 目录临时设为不可写后,Attach 和 `agent/status` 仍正常;随后已恢复权限。
- 2026-09-02 使用当前源码 Agent bundle 在共享 Linux x64 Host 的唯一
`/tmp/goodbuddy-e2e-no-reverify-*` 隔离 HOME 验证已登记 Runtime 的快速激活路径。测试
复制 Host current Runtime registry 与 bundle,在副本 OpenCode 二进制追加哨兵字节后,
`runtime activate` 仍依据匹配的 registry 与 canonical manifest 成功返回
`activated=true`,确认普通激活不重新哈希 payload 或执行 OpenCode 版本探测。本次没有
模型调用;harness 成功后已删除整个隔离目录,未修改共享 Agent/Runtime 安装或进程。
本次未注入模型凭据或执行 Prompt,真实文本模型调用 0 次;三文件轮转继续由聚焦测试覆盖。
测试结束前按 PID、UID、starttime、executable 和唯一 installation 核对并停止所有本次
daemon,本地及 Host 临时目录均已清理,共享 current Agent 和 `/root/.goodbuddy` 未修改。
+4 -2
View File
@@ -22,7 +22,8 @@
"**DeepSeek Harness 自动沿用兼容模型。** 没有管理员预置连接时,现在跟随默认或首个兼容模型,无需重复配置。",
"**Skills 与 MCP 入口更清晰。** 两者统一到“能力与工具”;内置 Skills 从 14 个顶层入口精简为 5 个,产品营销类默认停用,已保存的用户设置保持不变。",
"**界面和产品文案修正。** 修复主侧栏分隔线未对齐,并将官网、README 与智能心跳中的空泛宣传改为直接说明实际能力和运行边界。",
"**桌面打包更干净。** 不再显示无需处理的重复依赖引用摘要,也不再把已由 Renderer 打包的 AntV G6 依赖树重复复制到安装包。"
"**桌面打包更干净。** 不再显示无需处理的重复依赖引用摘要,也不再把已由 Renderer 打包的 AntV G6 依赖树重复复制到安装包。",
"**Linux ARM OpenCode 启动更快。** 在 Linux ARM Host 切换项目或冷启动已安装的 OpenCode 时,GoodBuddy 不再重复执行版本探测或检查已登记的二进制。安装或更新阶段已验证的路径、registry 和 manifest 仍作为运行依据。"
],
"notices": [
"工具执行环境只作用于本机 Skills 和 stdio MCP,不修改系统环境、普通终端或远程 Host。托管 Python 在首次使用时按需下载。",
@@ -47,7 +48,8 @@
"**DeepSeek Harness follows a compatible model automatically.** Without an administrator-provided connection, it now uses the default or first compatible model instead of requiring duplicate configuration.",
"**Clearer Skills and MCP navigation.** Both now live under Capabilities and Tools. Built-in Skills are reduced from 14 top-level entries to five; product-marketing Skills default to off, while saved user settings remain authoritative.",
"**Interface and product-copy corrections.** Fixed the misaligned main-sidebar divider and replaced vague promotional wording on the website, in the README, and in Smart Heartbeat with direct descriptions of actual behavior and boundaries.",
"**Cleaner desktop packaging.** Packaging no longer prints non-actionable duplicate dependency summaries or copies the Renderer-bundled AntV G6 dependency graph into desktop packages."
"**Cleaner desktop packaging.** Packaging no longer prints non-actionable duplicate dependency summaries or copies the Renderer-bundled AntV G6 dependency graph into desktop packages.",
"**Faster OpenCode startup on Linux ARM.** When switching projects or cold-starting an installed OpenCode Runtime on a Linux ARM Host, GoodBuddy no longer repeats a version probe or rechecks the registered binary. The path, registry, and manifest verified during installation or update remain the execution authority."
],
"notices": [
"Tool environments apply only to local Skills and stdio MCP. They do not modify the system environment, ordinary terminals, or remote Hosts. Managed Python is downloaded on demand when first used.",
+19 -4
View File
@@ -1892,7 +1892,11 @@ describe('App', () => {
name: /本地工作区/u
})
)
await screen.findByRole('heading', { name: '设置中心' })
await screen.findByRole(
'heading',
{ name: '设置中心' },
{ timeout: 3000 }
)
fireEvent.click(
screen.getByRole('tab', { name: '外观' })
)
@@ -2180,7 +2184,11 @@ describe('App', () => {
name: /本地工作区/u
})
)
await screen.findByRole('heading', { name: '设置中心' })
await screen.findByRole(
'heading',
{ name: '设置中心' },
{ timeout: 3000 }
)
fireEvent.click(
screen.getByRole('tab', { name: '外观' })
)
@@ -5749,7 +5757,11 @@ describe('App', () => {
render(<App />)
fireEvent.click(await screen.findByText('本地工作区'))
await screen.findByRole('heading', { name: '设置中心' })
await screen.findByRole(
'heading',
{ name: '设置中心' },
{ timeout: 3000 }
)
fireEvent.click(screen.getByRole('tab', { name: '外观' }))
fireEvent.click(screen.getByRole('radio', { name: /暗色/u }))
@@ -9866,7 +9878,10 @@ describe('App', () => {
target: { value: '打开示例网页' }
})
fireEvent.click(await screen.findByLabelText('发送'))
await waitFor(() => expect(run).toHaveBeenCalledOnce())
await waitFor(
() => expect(run).toHaveBeenCalledOnce(),
{ timeout: 3000 }
)
const conversationId = run.mock.calls[0]?.[0].conversationId
expect(conversationId).toBeTruthy()
+1
View File
@@ -6,6 +6,7 @@ export default defineConfig({
test: {
environment: 'jsdom',
setupFiles: ['./src/renderer/src/test-setup.ts'],
maxWorkers: 2,
coverage: {
reporter: ['text', 'html']
}