fix: reclaim idle remote runtimes and retire replaced agents
Remote tasks could leave idle Runtime processes behind, and replaced Agent installations lacked a drain-and-exit lifecycle. Keep the current Agent resident, let displaced Agents finish existing work and reconnect for its results, then retire them without restarting obsolete installations. Reclaim Runtime processes when their last active task finishes, preserve pending questions and shared active tasks, and restore conversation history when the next turn starts. Remove the Remote Projects technical preview label from settings, errors, tests, and current documentation; the feature remains disabled by default. Validation recorded during implementation: 213 lifecycle tests and 28 focused UI/IPC tests passed, as did SettingsPanel and lint. Linux x64 real-Host checks used 8 provider requests. Broader tests and final typecheck encountered unrelated concurrent changes; details and coverage limits are documented. Release note: 远程任务结束后自动释放空闲运行进程,下一轮对话恢复历史;更新后的旧 Agent 等待已有任务完成再退出,当前 Agent 保持常驻。远程项目移除“技术预览”标识,仍默认关闭。
This commit is contained in:
@@ -24,7 +24,7 @@
|
||||
|
||||
1. “平台功能”保留现有一级设置分类,在分类内部增加共享 `PageTabs`:
|
||||
- **通用设置**
|
||||
- **远程项目(技术预览)**
|
||||
- **远程项目**
|
||||
2. “通用设置”首个功能为“模型下载源”。
|
||||
3. 首期提供两个互斥选项:
|
||||
- `modelscope`,用户文案为 **ModelScope**,默认值。
|
||||
@@ -60,7 +60,7 @@
|
||||
“平台功能”现已使用两个二级页签:
|
||||
|
||||
- “通用设置”承载全局模型下载源。
|
||||
- “远程项目(技术预览)”承载远程项目开关与 Agent 包管理。
|
||||
- “远程项目”承载远程项目开关与 Agent 包管理。
|
||||
|
||||
页签复用共享 `PageTabs`,默认打开“通用设置”,不会把当前页签写入应用设置。
|
||||
|
||||
@@ -166,7 +166,7 @@
|
||||
└─ 平台功能
|
||||
├─ 通用设置
|
||||
│ └─ 模型下载源
|
||||
└─ 远程项目(技术预览)
|
||||
└─ 远程项目
|
||||
├─ 远程项目开关
|
||||
└─ Agent 包管理
|
||||
```
|
||||
@@ -185,7 +185,7 @@
|
||||
onChange={setActiveSection}
|
||||
tabs={[
|
||||
{ id: 'general', label: '通用设置' },
|
||||
{ id: 'remote-projects', label: '远程项目(技术预览)' }
|
||||
{ id: 'remote-projects', label: '远程项目' }
|
||||
]}
|
||||
value={activeSection}
|
||||
variant="segmented"
|
||||
@@ -213,7 +213,7 @@
|
||||
|
||||
未来新增页签时:
|
||||
|
||||
- 必须与“通用设置”和“远程项目(技术预览)”处于同级。
|
||||
- 必须与“通用设置”和“远程项目”处于同级。
|
||||
- 页签表示完整、独立的功能设置域。
|
||||
- 通用设置只放跨功能的全局行为,不成为任意设置的杂物区。
|
||||
- 页签超过可读数量时重新组织信息架构,不允许多行堆叠。
|
||||
@@ -229,7 +229,7 @@
|
||||
平台功能
|
||||
管理通用平台行为与可选工作区能力
|
||||
|
||||
[ 通用设置 ] [ 远程项目(技术预览) ]
|
||||
[ 通用设置 ] [ 远程项目 ]
|
||||
|
||||
┌ 模型下载源 ────────────────────────────────────────────┐
|
||||
│ 选择 GoodBuddy 托管本地模型后续下载使用的平台。 │
|
||||
@@ -965,7 +965,7 @@ Ollama 的模型下载由用户和 Ollama 管理。GoodBuddy 的模型下载源
|
||||
|
||||
### 19.1 产品
|
||||
|
||||
- “平台功能”显示“通用设置”和“远程项目(技术预览)”两个可访问页签。
|
||||
- “平台功能”显示“通用设置”和“远程项目”两个可访问页签。
|
||||
- 默认打开“通用设置”。
|
||||
- “通用设置”提供 ModelScope 和 Hugging Face,默认 ModelScope。
|
||||
- 来源选择说明影响范围,并明确已安装模型、ZIP、Ollama 和应用更新不受影响。
|
||||
|
||||
@@ -654,7 +654,7 @@ type WorkbarPanelInstance = {
|
||||
|
||||
### 9.1 设置入口
|
||||
|
||||
设置中心“平台功能”提供独立“远程项目(技术预览)”页签及开关,默认关闭。关闭时不显示
|
||||
设置中心“平台功能”提供独立“远程项目”页签及开关,默认关闭。关闭时不显示
|
||||
“主机与远程执行”分类、托管 SSH 项目创建选项和已保存远程项目,Main IPC 同时拒绝新的
|
||||
SSH/远程项目操作;已有 Host、项目和凭据保持不变。若当前项目已经是远程项目,则切回
|
||||
项目列表中的第一个普通
|
||||
|
||||
@@ -231,8 +231,9 @@ Agent 当前 Runtime installation + 兼容配置
|
||||
竞争读取同一 stdout。消息和 permission 按 sessionId 分派给 binding 的当前 operation。
|
||||
- `AgentAcpConnection` 统一连接级握手、stdio 解码与退出监听,Prompt
|
||||
生命周期仍留在 binding。同一 Session 串行,其他 Session 不等待它完成。
|
||||
- `closeAcpChannel`、取消和 release 只释放所属 binding/Session;最后一个 binding
|
||||
离开后空闲 60 秒关闭进程。关闭 Session 时等待原生 `closeSession` 和原始 Prompt
|
||||
- `closeAcpChannel`、取消和 release 只释放所属 binding/Session;以活动 operation
|
||||
判断共享进程是否空闲,最后一个任务结束即回收,不因历史 binding 保留进程。
|
||||
待答问题仍占用活动 operation。关闭 Session 时等待原生 `closeSession` 和原始 Prompt
|
||||
结算,不等待排在 backend 控制队列后面的完成回调。只有原生控制面不响应时才有界
|
||||
终止共享进程,并向其余请求报告中断,不声称这类故障可以逐 Session 隔离。
|
||||
- terminal 与物理进程状态分开:取消/失败的 Session 也可返回
|
||||
|
||||
@@ -16,3 +16,6 @@
|
||||
跨会话共享 OpenCode 进程、ACP 连接与模型桥的实现设计,见
|
||||
[Runtime 进程复用技术设计](../assistant-workbar/runtime-process-reuse-technical-design.md#6-ssh-opencode-与-agent)。
|
||||
当前实现尚未发布;验收状态见[工作栏进度](../assistant-workbar/progress.md#2026-09-14-runtime-进程复用实施中)。
|
||||
|
||||
更新退役、任务完成后 Runtime 回收和下一轮历史恢复的当前源码验证,见
|
||||
[2026-09-23 生命周期验证](./technical-design.md#生命周期验证2026-09-23)。
|
||||
|
||||
@@ -164,6 +164,10 @@ daemon 参与。两种 acquisition 的差别只在于如何把同一个签名 co
|
||||
5. Main 确认 adoption 后显式执行 cleanup。cleanup 失败不回滚已经健康的 Agent/Runtime,
|
||||
也不阻塞下一次更新。
|
||||
|
||||
新安装成为 current 后,旧 Agent 排空已有任务再退出,空闲旧 Agent 直接退出;当前 Agent
|
||||
可以常驻。Runtime 回收、待答问题与旧任务重连的规则见
|
||||
[远程主机技术设计](./technical-design.md)。
|
||||
|
||||
这不是两个并行安装管理器,也不存在把 Agent 与 Runtime payload 逐文件走 SFTP 安装的
|
||||
第二条路径。两种 acquisition 共享相同的 prepare、commit、adoption、finalize 与 cleanup。
|
||||
|
||||
|
||||
@@ -49,8 +49,8 @@ Agent `0.11.23` 提供,显式请求期限与取消仍有效。当前问答源
|
||||
|
||||
## 产品语义
|
||||
|
||||
远程 Host 与项目能力是默认关闭的技术预览。用户在“设置 > 平台功能”的独立
|
||||
“远程项目(技术预览)”页签启用开关后,Renderer 才显示 SSH Host 管理、托管 SSH 项目创建和已保存
|
||||
远程 Host 与项目能力默认关闭。用户在“设置 > 平台功能”的独立
|
||||
“远程项目”页签启用开关后,Renderer 才显示 SSH Host 管理、托管 SSH 项目创建和已保存
|
||||
远程项目;Main 在 IPC 边界执行同一开关校验,避免隐藏界面被绕过。关闭开关不删除 Host、
|
||||
项目或凭据;当前远程项目切回第一个普通本地项目。应用启动仍固定
|
||||
选择普通本地项目,不会因为保存了远程项目而自动连接 Host。
|
||||
@@ -185,7 +185,15 @@ Detached GoodBuddy Agent
|
||||
解析新的 current registry 并建立当前连接,无需刷新项目记录;当前环境无效时要求用户
|
||||
显式修复,但不在项目切换中下载或安装。失败或取消保留 Host 配置、凭据、项目、
|
||||
Workspace 和旧组件。
|
||||
- 显式 stop、升级、身份冲突或进程退出时清理 GoodBuddy 自己的 socket、状态和子进程;不得删除或覆盖无关 Host 文件。
|
||||
- 当前 Agent 可以常驻。新安装提升为 current 后,旧 Agent 每 250 ms 检查 registry 并进入
|
||||
draining,不再接受新 Prompt;无活动任务时退出,有任务时等待完成。已连接 Desktop 的
|
||||
终态 transcript ACK 也计入排空条件;断线任务完成后不等待离线 Desktop。待答问题仍是
|
||||
活动任务。旧安装退出前可以重新 Attach 原任务,但不得重新 bootstrap 已退役安装。
|
||||
- Prompt 完成后释放空闲 Runtime;共享进程仍有其他活动任务时保留,最后一个任务完成后
|
||||
关闭并核对进程树为空。保留语义 transcript 与会话标识;下一轮重建 Runtime,OpenCode
|
||||
加载原生 session,Continue 通过已有冷启动路径从持久对话历史初始化。
|
||||
- 显式 stop/retire 可校验并停止已被 registry 替换的旧安装。退出只清理 GoodBuddy 自己的
|
||||
socket、状态和子进程,不删除会话历史,不删除或覆盖无关 Host 文件。
|
||||
|
||||
### Host 级环境生命周期
|
||||
|
||||
@@ -872,6 +880,35 @@ goodbuddy-agent diagnostics --installation-id <installationId>
|
||||
Renderer 帮助提示/焦点测试套件。更新后的五个套件连同更新设置大小展示回归共 64 项
|
||||
定向复跑全部通过;未把这次复跑记为又一轮全量通过。
|
||||
|
||||
## 生命周期验证(2026-09-23)
|
||||
|
||||
通过已有 `lifecycle-host` harness 重建当前源码的 Agent、daemon 和桌面驱动,使用已保存
|
||||
凭据与固定 Host Key 经 LAN 连接共享 Linux x64 Host。运行文件均位于独立
|
||||
`/root/tmp/gb-lifecycle-*` 目录,Runtime 使用 Host 已安装的 OpenCode。两次 Ask/Execute
|
||||
运行合计 8 次真实 Provider 请求,另一次空闲更新验证没有模型请求。
|
||||
|
||||
- Ask 完成后测试所属子进程为 0;下一轮重建 Runtime、加载同一原生 session,并准确回忆
|
||||
上轮标记。第二轮完成后子进程再次为 0。
|
||||
- Execute 启动等待 8 秒后写文件的工具任务,Desktop 断开,再把新安装提升为 current。
|
||||
旧 daemon 进入 draining,活动进程仍在;重连并恢复原 operation 后正常收尾,旧 daemon
|
||||
退出,测试所属子进程为 0。
|
||||
- 空闲更新中,旧 daemon 在提升后 3 秒断言窗口内退出,新 current daemon 仍为 ready。
|
||||
各次运行清理时所属子进程均为 0,未修改共享安装 registry。
|
||||
|
||||
8 个定向套件共 213 项通过,覆盖 CLI 退役安装 stop/retire、daemon 常驻与排空、共享及
|
||||
独占 Runtime 回收、待答问题仍属活动任务、断线恢复、原生历史加载和 Desktop 冷启动。
|
||||
远程 UI/IPC 定向复跑 28 项通过,SettingsPanel 完整套件通过;IPC/App 扩展运行共
|
||||
517 项通过、4 项失败,失败位于并行修改中的
|
||||
心跳、设置读取次数和监督者导航断言。全量 `npm test` 运行到 600 秒工具时限仍无最终汇总,
|
||||
期间报告数据库迁移、监督者和导航测试失败,不能记为全量通过。`npm run lint` 通过。
|
||||
类型检查早期通过,最终复跑被并行新增的 `tests/incremental-review-live.electron.test.ts:23`
|
||||
中环境变量对象类型错误阻塞。
|
||||
|
||||
本次实机覆盖当前源码的 daemon、registry 提升、托管 ACP、真实 Runtime 与模型请求。
|
||||
未重复完整签名包安装和 UI 更新点击,也未在实机重跑 Continue 或问题答复;这些场景
|
||||
不能以本次 OpenCode 结果替代。历史发布说明中的技术预览记录保留,当前远程项目设置与
|
||||
说明文档已去除该标签;Linux 桌面控制等其他预览功能不受影响。
|
||||
|
||||
## 发布前完整回归(不能替代开发验证)
|
||||
|
||||
以下清单只用于复核开发期间已经在真实 Host 上通过的链路,不得作为 Agent 改动的首次
|
||||
|
||||
Reference in New Issue
Block a user