Completed OpenCode requests left their event streams open across repeated and parallel conversations. Each request now closes its own subscription on exit without cancelling peer sessions, and cancellation preserves its original cause. Direct-model Execute commands no longer restrict cwd to the workspace. Absolute paths, parent-relative paths, and symlinks to external directories are accepted. The workspace remains the default and relative-path base; Ask stays read-only, and local execution binding, directory validation, and process cleanup remain. Add real OpenCode lifecycle and real Shell tool-loop regressions, plus matching feature documentation. Focused checks: 182 passed, 1 skipped; typecheck and lint passed. Full shared-worktree suite: 3542 passed, 57 skipped, 1 unrelated sidebar heading failure, reproduced separately and documented. Release note: 修复 OpenCode 连续及并行对话结束后事件连接未释放的问题;直连模型 Execute 命令现在可直接指定工作区外的绝对路径、相对路径或符号链接目录,Ask 只读边界保持不变。
5.3 KiB
5.3 KiB
直连模型 Agent 能力 UI 设计
文档信息
| 项目 | 内容 |
|---|---|
| 状态 | 已实施 |
| 版本 | 0.3 |
| 日期 | 2026-09-03 |
| 设计系统 | GoodBuddy 统一界面设计系统 |
| 关联 PRD | PRD |
| 关联逻辑 | 功能逻辑设计 |
1. 信息架构
本功能不增加一级页面、Composer 按钮或 Runtime 专属工具栏。用户主要通过三处理解能力:
- 设置 > MCP > 直连模型:查看内置编程能力说明。
- 聊天消息活动块:查看命令和 Subagent 的实时状态与结果。
- 运行记录:按当前 Conversation 或 Task 查看聚合执行活动。
Job、Subjob 和 Run 继续是内部对象,不创建树形 UI、独立路由或操作菜单。
2. 设置中的能力目录
在现有直连模型工具目录增加“编程能力”分组:
编程能力
进程执行
使用当前用户权限运行 PowerShell、Bash 或 Sh 命令,默认在工作区执行,也可指定其他工作目录。
编程 Subagent
将聚焦任务委派给同一模型连接;继承当前工作模式和工作区。
要求:
- 两项默认属于直连模型,不提供持久 Switch。
- 设置目录只定义稳定工具能力,不增加 Shell 状态或重试控件;实际 Shell 标签在模型工具 定义和进程结果中返回。
- Runtime 是 OpenCode、Continue 或 DeepSeek Harness 时,不在其原生能力清单中伪造这两项; 用户需要理解差异时,在直连模型分组说明“Agent Runtime 使用自身工具”。
- 不把模型配置检查成功描述为命令或 Subagent 已经通过真实执行验证。
3. 进程活动块
复用现有对话工具活动视觉和语义,不创建页面专属卡片系统。
3.1 标题与摘要
进程执行
PowerShell · packages/app · npm test
- 命令只显示单行有界摘要,完整参数进入可展开详情。
- 工作区内目录显示相对路径,工作区根显示
.;工作区外目录显示规范化绝对路径。 - 不在摘要中显示完整环境或凭据。
3.2 状态
| 状态 | 文案 |
|---|---|
| pending | 等待运行 |
| running | 正在运行 |
| completed,exit 0 | 已完成 |
| completed,exit 非零 | 工具已完成,详情显示退出码 N |
| timeout | 工具已完成,详情显示 timeout |
| cancelled | 父请求活动显示已取消 |
| failed | 启动失败 |
状态必须同时有文字和状态图标,不能只依靠颜色。非零退出属于正常结构化工具结果,不显示为 GoodBuddy 服务崩溃。
3.3 结果详情
详情按以下顺序展示:
- Shell、工作目录、耗时和退出码。
- stdout。
- stderr。
- 截断提示。
日志使用共享等宽字体和可选择文本。长输出在活动块内折叠,展开后仍保持工作栏和聊天布局 可用;不把完整日志复制为应用通知。
4. Subagent 活动块
复用现有 subagent 消息块,并将系统执行者显示为“编程 Subagent”,不要求用户预先创建
专家。
编程 Subagent
检查认证模块的测试失败并提出修复
正在运行 · 直连模型 · Execute
终态:
- 完成:显示有界结果摘要,可展开查看完整返回。
- 失败:保留部分输出和错误。
- 取消:显示“父请求已取消”或准确取消原因。
- 排队:显示当前处于并发队列,不显示虚假百分比。
活动块不提供单独的“批准”“提高权限”或“继续递归”按钮。用户取消父请求即可取消子级。
5. Ask/Execute 表达
- Ask 中不显示不可用的进程按钮,因为模型工具没有手动调用入口。
- Ask Subagent 活动明确显示“只读”。
- Execute 活动显示“当前用户权限”,不声称 OS 沙箱或工作区隔离。
- 如果用户从 Ask 切到 Execute,只有下一条请求使用新模式;运行中的 Subagent 不切换。
6. 错误与通知
- 参数错误、命令退出、Subagent 失败和部分输出属于当前活动上下文,保留在对应活动块。
- Runtime 初始化、Shell 探测或全局服务失败可通过应用通知提示,并在设置状态卡提供重试。
- 同一错误不同时显示活动块副本和通知副本。
- 失败后保留用户 Prompt、命令摘要、工作目录和已有输出。
- 直连模型自动重试通过现有聊天状态显示“模型网络请求失败,正在重试(n/3)”,不增加 独立按钮、弹窗或通知副本;用户仍可使用当前停止操作取消请求。
7. 键盘与无障碍
- 活动块展开按钮使用原生
button,提供aria-expanded和关联详情 ID。 - 状态变化通过现有活动区域的礼貌级 live region 发布,不逐个朗读流式日志。
- stdout/stderr 区域具有可见标签,不能只靠顺序区分。
- 焦点不会因后台状态更新自动移动。
- 取消父请求后的焦点保持在原取消按钮或恢复到 Composer。
- 浅色、深色和减少动态效果模式遵守统一设计系统。
8. 响应式
- 窄聊天区只保留工具名、状态和一行摘要,元数据换行到下一行。
- 日志区域横向滚动,不撑宽页面。
- 运行记录使用紧凑摘要,不复制完整 stdout/stderr;用户回到聊天活动块展开查看详情。