feat: add direct model programming agents
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
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
Direct model conversations can now execute bounded platform-native processes and delegate one level of programming work without duplicating tools in Agent Runtimes. Process and Subagent activity follows existing workspace, mode, approval, cancellation, and lifecycle boundaries, with chat attribution and complete feature documentation. Remove the static Renderer bundle baseline gate and its build-only manifests; production builds continue to compile all processes and verify the control-plane installer. Also include the pending documentation link normalization. Release note: 直连模型现在可在 Execute 模式运行本机命令,并可委派编程 Subagent 完成修改、测试和复核;构建流程不再因静态 Renderer 包体基线阻塞。
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
# 直连模型 Agent 能力
|
||||
|
||||
本目录是 GoodBuddy“直连模型 Agent 能力”的唯一文档入口。本功能为直连文本模型补齐
|
||||
跨平台进程执行和编程 Subagent,使其能够在 Execute 模式完成读取、修改、运行和验证组成的
|
||||
编程闭环,同时避免向已经拥有原生 Shell 或 Agent 能力的 Runtime 重复注入工具。
|
||||
|
||||
## 文档导航
|
||||
|
||||
| 文档 | 权威职责 |
|
||||
| --- | --- |
|
||||
| [PRD](./prd.md) | 用户问题、产品范围、功能需求、非目标和产品验收 |
|
||||
| [User Stories](./user-stories.md) | 本机开发、失败恢复、委派和 Runtime 边界场景 |
|
||||
| [功能逻辑](./logic-design.md) | 能力矩阵、不变量、状态转换、继承规则和失败结果 |
|
||||
| [UI 设计](./ui-design.md) | 设置能力目录、聊天活动、Subagent 状态和无障碍行为 |
|
||||
| [技术设计](./technical-design.md) | Main 服务、工具契约、平台适配、Subagent、生命周期和测试 |
|
||||
| [功能进度](./progress.md) | 当前实现事实、待实施阶段、阻塞项和验证证据 |
|
||||
|
||||
## 术语
|
||||
|
||||
| 术语 | 定义 |
|
||||
| --- | --- |
|
||||
| 直连模型 | Runtime provider 为 `model`、由 GoodBuddy 直接调用模型协议的文本模型 |
|
||||
| 进程执行 | GoodBuddy 在当前执行空间启动一个前台 Shell 命令并返回有界结果 |
|
||||
| 平台 Shell | Windows 上的 PowerShell,macOS/Linux 上的 Bash 或 POSIX Sh |
|
||||
| 编程 Subagent | 由直连模型临时委派、使用直连模型 Runtime 执行一个有界子任务的执行者 |
|
||||
| 父请求 | 发起进程调用或 Subagent 委派的当前直连模型请求 |
|
||||
| 子任务 | 父请求内部的一项委派工作,对应 Job/Subjob 语义,不是新的顶层 Task |
|
||||
|
||||
Task、Job、Subjob、Run 和 Subagent 的对象关系以
|
||||
[Task 与 Job 统一领域模型](../task-and-job/task-and-job-model.md) 为准。本功能不重新定义
|
||||
这些对象。
|
||||
|
||||
## 功能边界
|
||||
|
||||
- `process_execute` 和 `subagent_delegate` 是 GoodBuddy 直连模型内置工具,不是外部 MCP。
|
||||
- OpenCode、Continue 和 DeepSeek Harness 继续使用各自原生执行与委派能力。
|
||||
- Ask 不允许进程执行;Subagent 若在 Ask 中使用,只能继承 Ask 的只读能力。
|
||||
- Execute 表示用户授权当前执行空间账号的完整能力,不增加第二套工具审批或权限档位。
|
||||
- 首版跨平台指桌面本机 Windows、macOS 和 Linux。托管 SSH 项目当前继续使用远端
|
||||
OpenCode;未来若向远端直连模型开放本工具,命令必须由 Host Agent 执行,绝不能回退到
|
||||
桌面本机。
|
||||
|
||||
## 相关功能
|
||||
|
||||
- [本机工具环境](../local-tool-environment/README.md):为新进程提供 Node、Python 和 PATH。
|
||||
- [助手工作栏与执行空间](../assistant-workbar/prd.md):定义本机/SSH 执行位置和活动归属。
|
||||
- [远程主机与远程执行](../remote-host/README.md):定义当前托管 SSH Runtime 边界。
|
||||
- [DeepSeek Harness Runtime](../deepseek-harness/README.md):已经拥有平台 Shell 的独立 Runtime。
|
||||
@@ -0,0 +1,173 @@
|
||||
# 直连模型 Agent 能力功能逻辑设计
|
||||
|
||||
## 文档信息
|
||||
|
||||
| 项目 | 内容 |
|
||||
| --- | --- |
|
||||
| 状态 | 已实施 |
|
||||
| 版本 | 0.2 |
|
||||
| 日期 | 2026-09-01 |
|
||||
| 关联 PRD | [PRD](./prd.md) |
|
||||
| 关联故事 | [User Stories](./user-stories.md) |
|
||||
|
||||
## 1. 权威不变量
|
||||
|
||||
1. `process_execute` 和 `subagent_delegate` 只属于直连文本模型。
|
||||
2. Ask 永远不能启动命令、写入工作区或创建 Execute Subagent。
|
||||
3. 子级的项目、执行空间、工作模式、模型连接和能力范围只能继承或缩小。
|
||||
4. 子级工具清单不包含 `subagent_delegate`,最大深度固定为 1。
|
||||
5. 命令必须在父请求绑定的执行空间运行,禁止跨设备静默回退。
|
||||
6. 一个 `process_execute` 调用只拥有自己创建的前台进程树,不能管理无关进程。
|
||||
7. 非零退出码是命令结果;启动失败、输入无效和后端不可用才是工具失败。
|
||||
8. 子任务是父请求内部 Job/Subjob,不创建顶层 Task 或独立 Conversation。
|
||||
9. 父请求取消、Runtime 释放或应用退出会传播到全部活动子级和进程。
|
||||
10. OpenCode、Continue 和 DeepSeek Harness 的原生能力不被本功能替换或包装。
|
||||
|
||||
## 2. 状态维度
|
||||
|
||||
| 维度 | 值 |
|
||||
| --- | --- |
|
||||
| Runtime | `model`、`opencode`、`continue`、`deepseek-harness` |
|
||||
| 工作模式 | `ask`、`execute` |
|
||||
| 执行空间 | `local`、`ssh` |
|
||||
| 本机 Shell | `available`、`unavailable` |
|
||||
| Subagent 深度 | `0`、`1` |
|
||||
| 父请求 | `active`、`cancelling`、`terminal` |
|
||||
|
||||
## 3. 工具可见性决策表
|
||||
|
||||
| Runtime | 模式 | 执行空间 | `process_execute` | `subagent_delegate` |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| `model` | Ask | 本机 | 隐藏 | 提供,只读继承 |
|
||||
| `model` | Execute | 本机且 Shell 可用 | 提供 | 提供,Execute 继承 |
|
||||
| `model` | Execute | 本机但 Shell 不可用 | 隐藏并报告诊断 | 提供,但子级同样没有进程工具 |
|
||||
| `model` | Ask/Execute | SSH,远端后端未实现 | 隐藏 | 当前远端直连模型产品入口不开放 |
|
||||
| 其他 Runtime | 任意 | 任意 | 隐藏 | 隐藏 |
|
||||
|
||||
工具清单隐藏不是最终授权边界。`callTool` 仍须重新验证 Runtime、工作模式、执行空间和父请求
|
||||
是否活动,以拒绝旧快照或伪造调用。
|
||||
|
||||
## 4. 进程状态机
|
||||
|
||||
```text
|
||||
validating
|
||||
├─ invalid → failed
|
||||
└─ valid → starting
|
||||
├─ spawn_failed → failed
|
||||
└─ running
|
||||
├─ exit 0 → completed
|
||||
├─ exit nonzero → completed_nonzero
|
||||
├─ timeout → terminating → timed_out
|
||||
├─ parent cancel → terminating → cancelled
|
||||
└─ output/lifecycle failure → terminating → failed
|
||||
```
|
||||
|
||||
规则:
|
||||
|
||||
- `completed_nonzero` 仍产生正常工具结果。
|
||||
- 超时和取消结果包含已经取得的有界输出。
|
||||
- 进入 `terminating` 后不再接受新输入,也不启动替代命令。
|
||||
- 终止只针对本次调用记录的进程树。
|
||||
- 迟到的 `close` 只用于清理,不得覆盖已提交的取消或超时原因。
|
||||
|
||||
## 5. 工作目录决策
|
||||
|
||||
| 输入 | 结果 |
|
||||
| --- | --- |
|
||||
| 未提供 | 当前工作区根目录 |
|
||||
| `.` 或合法相对子目录 | 解析到工作区内目录 |
|
||||
| 绝对路径 | 拒绝 |
|
||||
| `..` 越界、符号链接越界 | 拒绝 |
|
||||
| 不存在或不是目录 | 拒绝 |
|
||||
| 当前工作区身份在验证期间变化 | 拒绝本次调用 |
|
||||
|
||||
首版进程工具比 Execute 的 OS 权限范围更窄地固定工作目录输入,只是为了保持请求与项目
|
||||
一致;命令本身仍以当前用户权限运行,可以显式访问该账号有权访问的其他绝对路径。该规则
|
||||
不是 Runtime OS 沙箱,也不能宣称文件系统 containment。
|
||||
|
||||
## 6. Shell 选择
|
||||
|
||||
| 平台 | 顺序 | 不可用结果 |
|
||||
| --- | --- | --- |
|
||||
| Windows | `pwsh` → `powershell.exe` | 进程工具不注册,设置诊断显示 PowerShell 不可用 |
|
||||
| macOS | `/bin/bash` → `/bin/sh` | 两者都不可用时不注册 |
|
||||
| Linux | `/bin/bash` → `/bin/sh` | 两者都不可用时不注册 |
|
||||
|
||||
一次父请求冻结实际 Shell 描述。PATH 或工具环境设置变化只影响新创建的 Runtime/执行服务,
|
||||
不在运行中的命令或 Subagent 中途切换。
|
||||
|
||||
## 7. Subagent 状态机
|
||||
|
||||
```text
|
||||
validating
|
||||
├─ invalid/depth_exceeded → failed
|
||||
└─ queued
|
||||
├─ parent_cancelled → cancelled
|
||||
└─ running
|
||||
├─ model done → completed
|
||||
├─ child failure → failed_with_partial_output
|
||||
├─ timeout → cancelled
|
||||
└─ parent cancel → cancelled
|
||||
```
|
||||
|
||||
父模型收到结构化终态:
|
||||
|
||||
```ts
|
||||
type SubagentDelegateResult = {
|
||||
status: 'completed' | 'failed' | 'cancelled'
|
||||
output: string
|
||||
error?: string
|
||||
modelUsage?: {
|
||||
inputTokens?: number
|
||||
outputTokens?: number
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
失败和取消是父模型可以解释的子任务结果。只有契约损坏、未知子任务身份或服务已经释放等
|
||||
内部不变量失败才终止父工具循环。
|
||||
|
||||
## 8. 权限与能力继承
|
||||
|
||||
| 父请求 | 子级模式 | 子级能力 |
|
||||
| --- | --- | --- |
|
||||
| Ask | Ask | 父级只读工具的子集,不含进程、写入和再次委派 |
|
||||
| Execute | Execute | 父级已启用工具的子集,包含本机进程能力,不含再次委派 |
|
||||
|
||||
- 子级不能请求更高模式。
|
||||
- 子级使用父请求开始时的工具与能力快照;运行中设置变化不重写快照。
|
||||
- 子级调用 MCP、浏览器或知识能力时继续经过这些能力已有的作用域和生命周期边界。
|
||||
- Execute 子级不弹出额外的“Subagent 执行授权”,也不获得父级没有的 MCP 分配。
|
||||
|
||||
## 9. 并发和顺序
|
||||
|
||||
- 全局编程 Subagent 最大并发为 3,额外请求进入有界队列。
|
||||
- 单个父模型的工具调用仍按直连模型现有顺序结算,不为本功能改写全部工具并发语义。
|
||||
- 不同父请求的 Subagent 可以并发;共享工作区的并发写入属于用户已授权的 Execute 行为,
|
||||
活动记录必须保留实际顺序和结果。
|
||||
- 首版不自动创建工作树、锁文件或回滚层。出现真实冲突时由父模型读取当前工作区事实并处理。
|
||||
|
||||
## 10. 结果优先级
|
||||
|
||||
当多个终止原因竞争时,使用以下优先级:
|
||||
|
||||
```text
|
||||
用户/父请求取消 > 工具超时 > 输出或协议边界 > 进程退出 > 普通工具错误
|
||||
```
|
||||
|
||||
已经提交的正常终态不被稍后到达的取消覆盖。父请求进入终态后,迟到的子级文本和工具事件
|
||||
只用于资源清理,不再写入会话。
|
||||
|
||||
## 11. 逻辑完整性评估
|
||||
|
||||
| 领域 | 结论 |
|
||||
| --- | --- |
|
||||
| Runtime 隔离 | 完整,工具只注入 `model` |
|
||||
| Ask/Execute | 完整,清单过滤和调用边界双重检查 |
|
||||
| 本机三平台 | 完整,统一契约和平台 Shell 决策已定义 |
|
||||
| Subagent 递归 | 完整,深度固定为 1 |
|
||||
| 取消与失败 | 完整,父子和进程传播及优先级已定义 |
|
||||
| 产品对象 | 完整,遵循 Task/Job 权威模型 |
|
||||
| SSH 远端执行 | 明确不在首版;未来必须增加 Agent 后端后才能开放 |
|
||||
|
||||
当前没有需要在实施前由用户补充的产品决策。
|
||||
@@ -0,0 +1,185 @@
|
||||
# 直连模型 Agent 能力 PRD
|
||||
|
||||
## 文档信息
|
||||
|
||||
| 项目 | 内容 |
|
||||
| --- | --- |
|
||||
| 状态 | 已实施,跨平台 CI 待验证 |
|
||||
| 版本 | 0.2 |
|
||||
| 日期 | 2026-09-01 |
|
||||
| 适用产品 | GoodBuddy 桌面端 |
|
||||
| 目标平台 | Windows、macOS、Linux,x64 与 arm64 |
|
||||
| 关联领域 | [Task 与 Job 统一领域模型](../task-and-job/task-and-job-model.md) |
|
||||
|
||||
## 1. 背景
|
||||
|
||||
GoodBuddy 直连模型已经可以读取、列出和写入工作区文本,使用浏览器、联网搜索、知识库及
|
||||
分配的 MCP,但没有内置命令执行工具。模型可以生成代码,却不能运行构建、测试、格式化、
|
||||
Git 或项目脚本,因此无法独立验证结果。
|
||||
|
||||
GoodBuddy 也已经有面向用户专家协作的只读 Subagent,但直连模型不能在自己的工具循环中
|
||||
主动委派一个聚焦的编程子任务。OpenCode、Continue 和 DeepSeek Harness 一般已经提供
|
||||
Shell、Agent 或 Task 能力,再向它们注入 GoodBuddy 同名工具只会造成重复入口和语义冲突。
|
||||
|
||||
本功能只补齐直连模型缺少的基础 Agent 能力:
|
||||
|
||||
1. 一个按平台适配的进程执行接口。
|
||||
2. 一个单层、继承父请求范围的编程 Subagent 接口。
|
||||
|
||||
## 2. 产品目标
|
||||
|
||||
1. 让直连模型在 Execute 模式完成“读取代码 → 修改 → 运行 → 根据结果修正”的闭环。
|
||||
2. 在 Windows、macOS 和 Linux 使用同一个模型工具契约,不要求模型调用平台专属工具名。
|
||||
3. 让直连模型可以把独立工作委派给临时 Subagent,并取得有界、可核验的结果。
|
||||
4. 保持 Ask 只读、Execute 完整授权、执行空间、取消、有界输出和进程回收语义不变。
|
||||
5. 不向已有原生执行能力的 Agent Runtime 重复注入 GoodBuddy 进程或 Subagent 工具。
|
||||
|
||||
## 3. 核心产品决策
|
||||
|
||||
### 3.1 统一工具名,平台适配留在 Main
|
||||
|
||||
模型只看到 `process_execute`。GoodBuddy 根据当前平台选择 PowerShell、Bash 或 Sh,并在
|
||||
工具描述和结果中明确实际 Shell。模型不需要在 Windows 调用 `powershell_execute`、在
|
||||
macOS/Linux 改用 `bash_execute`。
|
||||
|
||||
### 3.2 它是内置能力,不依赖 MCP
|
||||
|
||||
进程生命周期、工作目录、取消和执行空间由 GoodBuddy 管理。用户仍可以配置提供其他命令
|
||||
能力的 MCP,但直连模型的基本编程能力不依赖第三方 MCP 是否安装或在线。
|
||||
|
||||
### 3.3 Runtime 能力不重复注入
|
||||
|
||||
| Runtime | GoodBuddy `process_execute` | GoodBuddy `subagent_delegate` |
|
||||
| --- | --- | --- |
|
||||
| 直连模型 `model` | Execute 提供 | Ask/Execute 提供 |
|
||||
| OpenCode | 不提供 | 不提供 |
|
||||
| Continue | 不提供 | 不提供 |
|
||||
| DeepSeek Harness | 不提供 | 不提供 |
|
||||
|
||||
“不提供”只表示不注入本功能工具,不限制 Runtime 自己的 Bash、PowerShell、Task、
|
||||
Agent 或插件能力。
|
||||
|
||||
### 3.4 Subagent 继承,不扩权
|
||||
|
||||
Subagent 使用父请求的项目、执行空间、工作模式、直连模型连接和已启用能力快照:
|
||||
|
||||
- Ask 父请求只能创建 Ask Subagent。
|
||||
- Execute 父请求创建 Execute Subagent。
|
||||
- 子级不能切换项目、目录、Runtime、模型连接或工作模式。
|
||||
- 子级不再看到 `subagent_delegate`,首版最大委派深度固定为 1。
|
||||
- 子任务不是新的顶层 Task 或 Conversation,结果先返回父模型。
|
||||
|
||||
### 3.5 不新增权限档位
|
||||
|
||||
Ask 禁止命令和写入。Execute 是用户对当前执行空间账号的完整授权。进程和 Subagent 不增加
|
||||
“受控执行”“仅测试”“可信命令”或逐命令风险等级,也不重复弹出第二套确认。
|
||||
|
||||
## 4. 功能范围
|
||||
|
||||
### 4.1 包含
|
||||
|
||||
- 本机 Windows、macOS、Linux 的前台 Shell 命令执行。
|
||||
- 当前工作区默认工作目录及合法子目录选择。
|
||||
- Exit Code、标准输出、标准错误、Shell、目录、耗时和截断状态。
|
||||
- 命令超时、用户取消、进程树停止和应用退出清理。
|
||||
- 新进程使用当前本机工具环境提供的 Node、Python 和 PATH。
|
||||
- 直连模型单层 Subagent 委派、排队、运行、部分结果、失败和取消。
|
||||
- 父子请求的工具、模型用量、活动和成果归属。
|
||||
- 桌面聊天和选择直连模型的消息通道项目使用相同 Runtime 能力矩阵。
|
||||
|
||||
### 4.2 不包含
|
||||
|
||||
- 交互式 PTY、终端复用、持续 stdin、密码提示或 TUI 自动化。
|
||||
- 后台守护进程、任意 PID 枚举、接管或停止用户已有进程。
|
||||
- Shell Session 持久化,环境变更不会跨 `process_execute` 调用保留。
|
||||
- 首版远程 SSH 直连模型进程执行。
|
||||
- 向 OpenCode、Continue 或 DeepSeek Harness 注入本功能工具。
|
||||
- 递归 Subagent、长期运行的自治 Agent、Workflow、Hook 或恢复未完成子任务。
|
||||
- 新的权限矩阵、逐命令批准、沙箱档位或命令白名单。
|
||||
- 自动安装项目依赖;模型可以在 Execute 中显式运行项目已有的安装命令。
|
||||
|
||||
## 5. 功能需求
|
||||
|
||||
### FR-1 直连模型专属可用性
|
||||
|
||||
- 两个工具只由 Runtime provider `model` 注册。
|
||||
- Agent Runtime 切换为 OpenCode、Continue 或 DeepSeek Harness 后不再显示这两个工具。
|
||||
- 图像生成连接不获得文本 Agent 工具。
|
||||
- 能力不可用时返回准确原因,不以其他 Runtime 或本机 Shell 静默代替。
|
||||
|
||||
### FR-2 跨平台进程执行
|
||||
|
||||
- 使用统一的 `process_execute` 工具契约。
|
||||
- Windows 选择 PowerShell;macOS/Linux 选择 Bash,Bash 不可用时可使用 POSIX Sh。
|
||||
- 每次调用启动一个前台进程树,完成后返回结构化结果。
|
||||
- 非零退出码是可观察的命令结果,不自动转成模型请求失败。
|
||||
- Shell 启动失败、非法参数或执行后端不可用才属于工具失败。
|
||||
|
||||
### FR-3 工作目录和执行位置
|
||||
|
||||
- 默认目录是父请求当前工作区。
|
||||
- 可选工作目录必须解析为当前工作区本身或其子目录。
|
||||
- 本机执行只能发生在当前桌面执行空间。
|
||||
- 当前请求绑定 SSH 执行空间且没有远端进程后端时不注册工具,绝不在桌面目录回退执行。
|
||||
|
||||
### FR-4 Ask/Execute
|
||||
|
||||
- Ask 工具清单不包含 `process_execute`。
|
||||
- Runtime 边界必须再次拒绝 Ask 发起的伪造命令调用。
|
||||
- Execute 命令使用 GoodBuddy 客户端当前用户权限,不声称 Runtime OS 沙箱。
|
||||
- 消息通道的直连模型 Execute 继续服从该通道既有工具策略。
|
||||
|
||||
### FR-5 Subagent 委派
|
||||
|
||||
- `subagent_delegate` 接受一个清晰的任务说明,不要求用户预先创建专家。
|
||||
- 子级默认使用父请求选择的直连模型连接。
|
||||
- 子级继承父请求的工作模式和能力上限,但不获得再次委派能力。
|
||||
- 子级最终输出、部分输出、错误、用量和状态返回父请求。
|
||||
- 父模型负责综合结果并向用户作最终回答。
|
||||
|
||||
### FR-6 Subagent 领域归属
|
||||
|
||||
- 子任务使用 Job/Subjob 语义,不创建 Task Center 条目或独立 Conversation。
|
||||
- UI 对象层级继续止于用户 Task;活动可以显示 Subagent 状态卡,但不显示 Job/Run 树。
|
||||
- 子任务产生的工具、成果和用量可追溯到父请求及子任务标识。
|
||||
|
||||
### FR-7 生命周期和资源边界
|
||||
|
||||
- 父请求取消必须传播到活动 Subagent 和其当前进程。
|
||||
- Runtime 替换、会话释放和应用退出必须停止 GoodBuddy 创建的活动子进程。
|
||||
- 命令、标准输出、标准错误、Subagent 提示、结果、队列和并发全部有界。
|
||||
- 截断必须明确标记,不能把不完整输出伪装为完整结果。
|
||||
|
||||
### FR-8 环境和凭据
|
||||
|
||||
- 新进程使用筛选后的当前用户环境和本机工具环境 PATH。
|
||||
- 模型 Provider 凭据、GoodBuddy 加密设置和无关桌面会话变量不进入命令环境。
|
||||
- 首版不接受模型提交任意环境变量映射;需要的普通变量由 Shell 命令在单次调用中设置。
|
||||
|
||||
### FR-9 状态与活动
|
||||
|
||||
- 进程活动显示等待、运行、成功、非零退出、超时、取消和失败。
|
||||
- Subagent 显示排队、运行、完成、失败和取消。
|
||||
- 命令和子任务失败保留可操作错误及已有部分输出。
|
||||
- 同一事件不同时显示页内错误和应用通知。
|
||||
|
||||
### FR-10 兼容
|
||||
|
||||
- 现有模型连接、MCP 分配、专家设置和 Runtime 选择无需迁移。
|
||||
- 不改变现有 Agent Runtime 的工具清单或权限语义。
|
||||
- 不修改系统 PATH、Shell Profile 或用户终端会话。
|
||||
|
||||
## 6. 产品验收
|
||||
|
||||
- [ ] Windows 直连模型 Execute 使用 PowerShell 创建文件、运行测试并读取退出码。
|
||||
- [ ] macOS/Linux 直连模型 Execute 使用 Bash/Sh 完成同一工作流。
|
||||
- [ ] Ask 中模型看不到进程工具,伪造调用也在 Main 边界失败。
|
||||
- [ ] 直连模型可以委派编程子任务,子级运行命令并把结果返回父模型。
|
||||
- [ ] Ask Subagent 保持只读;Execute Subagent 不增加第二套批准。
|
||||
- [ ] Subagent 不能递归委派,不能切换父请求工作区、模式或模型。
|
||||
- [ ] 切换到 OpenCode、Continue 或 DeepSeek Harness 后不出现本功能工具。
|
||||
- [ ] 非零退出、超时、取消和输出截断均准确展示。
|
||||
- [ ] 取消父请求和退出应用后没有残留 GoodBuddy 命令进程。
|
||||
- [ ] 本机工具环境选择对新命令生效,Main 持有的模型凭据不进入子进程。
|
||||
- [ ] 子任务不进入 Task Center,不创建独立可导航 Conversation。
|
||||
- [ ] 全量测试、类型检查、Lint 和生产构建通过。
|
||||
@@ -0,0 +1,120 @@
|
||||
# 直连模型 Agent 能力功能进度
|
||||
|
||||
## 文档信息
|
||||
|
||||
| 项目 | 内容 |
|
||||
| --- | --- |
|
||||
| 文档类型 | 功能进度 |
|
||||
| 状态 | 已实施,本机验收完成 |
|
||||
| 版本 | 0.2 |
|
||||
| 日期 | 2026-09-02 |
|
||||
| 关联入口 | [直连模型 Agent 能力](./README.md) |
|
||||
|
||||
## 当前结论
|
||||
|
||||
本机生产路径已经完成源码接线:直连模型 Execute 可运行平台 Shell,Ask/Execute 均可按
|
||||
父模式委派单层编程 Subagent;OpenCode、Continue、DeepSeek Harness 和托管 SSH 路径不注入
|
||||
这两个工具。Windows 本机、真实模型和全量项目验证已通过;macOS 与 Linux 真机验证仍需
|
||||
由对应平台完成。
|
||||
|
||||
## 已确认的当前基线
|
||||
|
||||
- [x] 直连模型当前内置工作区读、目录列表和文本写入,但没有进程工具。
|
||||
- [x] 内置 MCP 当前没有 Shell;自定义 MCP 不能替代开箱即用的进程能力。
|
||||
- [x] `ModelAgentRuntime` 已有多轮工具循环、取消、上下文压缩和有界结果。
|
||||
- [x] DeepSeek Harness 已按 Windows PowerShell、macOS/Linux Bash 注册原生 Shell。
|
||||
- [x] OpenCode 和 Continue 使用各自原生执行工具。
|
||||
- [x] 当前专家 Subagent 是只读协作流程,不是直连模型可调用的编程工具。
|
||||
- [x] Task/Job 领域文档已经明确 Subagent 不是新的顶层 Task 或 Conversation。
|
||||
- [x] 当前跨平台进程树清理已经覆盖 Windows `taskkill /T /F` 和 POSIX 进程组。
|
||||
|
||||
## 已完成设计
|
||||
|
||||
- [x] 工具只注入直连模型,不注入 Agent Runtime。
|
||||
- [x] 统一 `process_execute` 契约和三平台 Shell 决策。
|
||||
- [x] Ask/Execute、执行空间、工作目录和非零退出规则。
|
||||
- [x] 输出、超时、取消、环境和进程树边界。
|
||||
- [x] 单层 `subagent_delegate`、继承规则、并发和结果模型。
|
||||
- [x] 不创建 Child Task/独立 Conversation 的领域归属。
|
||||
- [x] 设置能力目录、聊天活动、错误和无障碍行为。
|
||||
- [x] 本机、真实模型和项目验证方案。
|
||||
|
||||
## 实施状态
|
||||
|
||||
### 阶段 1:进程服务
|
||||
|
||||
- [x] Shared 工具和 schema。
|
||||
- [x] 本机 Shell 探测与能力状态。
|
||||
- [x] 工作目录解析。
|
||||
- [x] 跨平台前台进程、输出边界、超时和取消。
|
||||
- [x] 当前筛选 PATH 和凭据环境过滤。
|
||||
|
||||
### 阶段 2:直连模型接入
|
||||
|
||||
- [x] `ModelToolProvider` 注册与调用。
|
||||
- [x] Ask/Execute、Runtime target 和本机执行空间双重检查。
|
||||
- [x] DeepSeek Harness、OpenCode 和 Continue 隔离。
|
||||
- [x] 通用工具活动和“设置 > MCP > 直连模型”编程能力目录。
|
||||
|
||||
### 阶段 3:编程 Subagent
|
||||
|
||||
- [x] 编程 Subagent 服务和同 Provider 深度过滤。
|
||||
- [x] 父子模式、模型、执行空间和能力继承。
|
||||
- [x] 深度、全局并发、队列、超时和取消。
|
||||
- [x] 新 Subagent actor 契约和旧专家事件兼容读取。
|
||||
- [x] 用量、部分输出、实时活动和终态归并。
|
||||
|
||||
### 阶段 4:端到端验收
|
||||
|
||||
- [x] Windows PowerShell 真实命令。
|
||||
- [ ] macOS Bash/Sh 真实命令。
|
||||
- [ ] Linux x64/arm64 Bash/Sh 真实命令。
|
||||
- [x] 直连模型“修改 → 测试 → 修复”真实闭环。
|
||||
- [x] 假模型端到端 Subagent 编程委派、真实本机命令和父模型综合。
|
||||
- [x] 真实模型 Subagent 编程委派和父模型综合。
|
||||
- [x] Runtime 隔离、取消、会话释放和进程树回收聚焦测试。
|
||||
- [x] 全量测试、类型检查、Lint 和生产构建。
|
||||
|
||||
## 当前阻塞项
|
||||
|
||||
- 当前没有实现阻塞项。
|
||||
- 本机工具环境仍处于计划阶段;在其实施前,进程工具可以使用当前筛选 PATH,但不能宣称
|
||||
GoodBuddy 托管 Node/Python 已可用。
|
||||
- 远端直连模型进程执行不在首版,后续需要独立增加 Agent 进程协议和真机验证。
|
||||
|
||||
## 2026-09-01 至 2026-09-02 实施与验证证据
|
||||
|
||||
- 新增 `direct-model-process-service.ts`:PowerShell/Bash/Sh 探测、工作区目录校验、96 KiB
|
||||
首尾输出、超时、取消、进程树回收和环境过滤。
|
||||
- 新增 `direct-model-subagent-service.ts`:单层委派、共享并发 3、队列 20、10 分钟上限、
|
||||
192 KiB 输出、父请求取消和临时会话释放。
|
||||
- `ModelToolProvider` 只在直连模型上下文注册工具;Ask 隐藏进程工具,深度 1 隐藏委派工具,
|
||||
远端工作区拒绝本机进程。
|
||||
- `ModelAgentRuntime` 复用同一已解析模型和 Tool Provider 运行子级,并把子级工具、用量和
|
||||
Subagent 活动实时归并到父请求。
|
||||
- 新 actor 联合类型兼容既有专家/OpenCode 记录;编程 Subagent 不创建 Assistant Task。
|
||||
- 聚焦验证:
|
||||
- 进程、Provider、Runtime、共享契约与聊天 UI:`290 passed, 1 skipped`。
|
||||
- 设置与 Runtime 隔离:`216 passed`。
|
||||
- Main/Shared 聚焦持久化与 Subagent:`188 passed, 1 skipped`。
|
||||
- Node 与 Web TypeScript no-emit 检查通过。
|
||||
- 假模型端到端场景实际启动 Windows PowerShell,子级运行命令后返回父模型;该场景的
|
||||
Runtime 模型调用数为 4 次。
|
||||
- 真实 DeepSeek 兼容连接端到端通过:模型创建失败程序、观察非零退出、修复并观察退出码
|
||||
0、委派编程 Subagent 再次运行最终程序并综合结果;最终源码成功验收运行包含 8 次真实
|
||||
模型调用。
|
||||
- BigToken 连接的首次验收在 TLS 建立前被 `ECONNRESET` 中断,未进入模型工具路径;切换
|
||||
到仓库已有的 DeepSeek 连接后完成验证。
|
||||
|
||||
- 全量 `npm test`:`3410 passed, 50 skipped`。
|
||||
- `npm run typecheck`:通过。
|
||||
- `npm run lint`:通过。
|
||||
- `npm run build`:Main、Preload、Renderer 和控制面安装器均成功构建。2026-09-02 按产品
|
||||
决策移除未对应实际性能问题的 Renderer bundle 基线门禁后复验通过。
|
||||
|
||||
## 进度维护要求
|
||||
|
||||
- 只有真实生产路径完成并验证后才能勾选实施项。
|
||||
- 平台模拟单元测试不能替代对应平台真实命令测试。
|
||||
- 真实模型验证必须记录准确调用次数且不得记录凭据。
|
||||
- 需求变化回写 PRD、User Stories 和功能逻辑;实现事实只写本文件。
|
||||
@@ -0,0 +1,398 @@
|
||||
# 直连模型 Agent 能力技术设计
|
||||
|
||||
## 文档信息
|
||||
|
||||
| 项目 | 内容 |
|
||||
| --- | --- |
|
||||
| 状态 | 已实施 |
|
||||
| 版本 | 0.2 |
|
||||
| 日期 | 2026-09-01 |
|
||||
| 关联 PRD | [PRD](./prd.md) |
|
||||
| 功能逻辑 | [功能逻辑设计](./logic-design.md) |
|
||||
| 相关架构 | [助手工作栏与执行空间](../assistant-workbar/prd.md)、[本机工具环境](../local-tool-environment/technical-design.md) |
|
||||
|
||||
## 1. 实现基线
|
||||
|
||||
当前源码已经实现:
|
||||
|
||||
- `ModelAgentRuntime` 的多轮工具调用、上下文压缩、取消、用量和有界结果处理。
|
||||
- `ModelToolProvider` 的直连模型内置工具、浏览器、Web、知识和自定义 MCP 聚合。
|
||||
- `WorkspaceAccess` 的本机和远端工作区抽象。
|
||||
- 跨平台子进程树终止辅助函数。
|
||||
- 面向用户专家协作的 `SubagentScheduler`、状态事件和只读模型调用。
|
||||
- OpenCode、Continue 和 DeepSeek Harness 各自的 Shell/Agent 能力。
|
||||
- 直连模型 `process_execute` 和 `subagent_delegate`。
|
||||
- 不创建顶层 Task/Conversation 的编程 Subagent actor 与活动归并。
|
||||
|
||||
## 2. 总体架构
|
||||
|
||||
```text
|
||||
ModelAgentRuntime
|
||||
└─ ModelToolProvider
|
||||
├─ WorkspaceAccess
|
||||
├─ DirectModelProcessService
|
||||
│ └─ LocalDirectModelProcessService
|
||||
├─ DirectModelSubagentService
|
||||
│ ├─ SubagentScheduler
|
||||
│ └─ 同一 ModelAgentRuntime 的临时子会话
|
||||
│ └─ 同一 ModelToolProvider(delegationDepth=1 时移除委派)
|
||||
├─ Browser / Web / Knowledge
|
||||
└─ assigned MCP
|
||||
```
|
||||
|
||||
OpenCode、Continue 和 DeepSeek Harness 的创建路径不接收
|
||||
`DirectModelProcessService` 或 `DirectModelSubagentService`。DeepSeek Harness 即使继续使用
|
||||
`ModelToolProvider` 代理 Web/MCP,也必须通过明确的工具视图排除直连模型专属工具。
|
||||
|
||||
## 3. 共享工具目录
|
||||
|
||||
`BuiltinModelToolSummary` 增加 `programming` 分组和 Runtime 可见性:
|
||||
|
||||
```ts
|
||||
type BuiltinModelToolSummary = {
|
||||
name: string
|
||||
displayName: string
|
||||
description: string
|
||||
access: 'read' | 'write'
|
||||
group: 'filesystem' | 'browser' | 'web' | 'programming'
|
||||
}
|
||||
```
|
||||
|
||||
`process_execute` 标记为 `write`,只在 Execute 清单中出现。
|
||||
`subagent_delegate` 的实际访问级别由父模式决定:
|
||||
|
||||
- Ask 清单中提供只读委派定义。
|
||||
- Execute 清单中提供继承 Execute 的定义。
|
||||
- `callTool` 不依赖静态 `access` 单独授权,必须检查父请求上下文。
|
||||
|
||||
工具总数和 schema 总字节继续计入直连模型现有 100 个工具与 512 KiB 上限。
|
||||
|
||||
## 4. 进程工具契约
|
||||
|
||||
### 4.1 输入
|
||||
|
||||
```ts
|
||||
const processExecuteInputSchema = z.object({
|
||||
command: z.string().trim().min(1).max(100_000),
|
||||
cwd: z
|
||||
.string()
|
||||
.trim()
|
||||
.min(1)
|
||||
.max(4_096)
|
||||
.optional(),
|
||||
timeoutMs: z
|
||||
.number()
|
||||
.int()
|
||||
.min(1_000)
|
||||
.max(10 * 60_000)
|
||||
.default(120_000)
|
||||
}).strict()
|
||||
```
|
||||
|
||||
- `cwd` 只接受相对工作区路径。
|
||||
- 首版不接受 `env`、`stdin`、`background`、`pty`、`shell` 或任意 executable 参数。
|
||||
- Shell 选择由执行后端决定,防止模型绕过平台契约启动另一套受管接口。
|
||||
- 命令字符串仍可以调用当前账号本来有权运行的程序;Execute 不增加命令白名单。
|
||||
|
||||
### 4.2 结果
|
||||
|
||||
```ts
|
||||
type ProcessExecuteResult = {
|
||||
shell: {
|
||||
kind: 'powershell' | 'bash' | 'sh'
|
||||
label: string
|
||||
}
|
||||
cwd: string
|
||||
exitCode: number | null
|
||||
signal?: string
|
||||
terminationReason?: 'timeout' | 'cancelled'
|
||||
durationMs: number
|
||||
stdout: string
|
||||
stderr: string
|
||||
stdoutTruncated: boolean
|
||||
stderrTruncated: boolean
|
||||
}
|
||||
```
|
||||
|
||||
`cwd` 返回工作区相对显示值,不把不必要的绝对用户路径送入模型上下文。Shell 在模型结果
|
||||
中只返回稳定标签;绝对可执行路径只进入 Main 诊断状态。
|
||||
|
||||
### 4.3 输出边界
|
||||
|
||||
- stdout 和 stderr 各最多 96 KiB。
|
||||
- 超限时分别保留前 48 KiB 与最后 48 KiB,中间插入固定截断标记。
|
||||
- JSON 结果加上元数据后必须低于 `ModelToolProvider` 现有 256 KiB 工具结果上限。
|
||||
- 流式读取在收到数据时执行边界,不先积累无界 Buffer。
|
||||
- 输出按 UTF-8 解码,无效序列使用替换字符并保留字节计数。
|
||||
|
||||
## 5. 平台执行
|
||||
|
||||
### 5.1 Shell 探测
|
||||
|
||||
启动直连模型执行服务时解析一次 Shell:
|
||||
|
||||
```text
|
||||
Windows: PATH 中 pwsh → Windows PowerShell powershell.exe
|
||||
macOS: /bin/bash → /bin/sh
|
||||
Linux: /bin/bash → /bin/sh
|
||||
```
|
||||
|
||||
Shell 不可用时保留直连模型对话能力,但不注册 `process_execute`。设置目录继续展示静态能力
|
||||
说明,实际 Shell 通过每次请求的工具定义和结果可见;当前不增加独立 Shell 诊断 IPC。
|
||||
不下载或捆绑新的 Bash/PowerShell。
|
||||
|
||||
### 5.2 启动参数
|
||||
|
||||
```text
|
||||
PowerShell:
|
||||
<shell> -NoLogo -NoProfile -NonInteractive -Command <command>
|
||||
|
||||
Bash:
|
||||
/bin/bash -c <command>
|
||||
|
||||
Sh:
|
||||
/bin/sh -c <command>
|
||||
```
|
||||
|
||||
使用 `spawn(executable, args, { shell: false })`,避免 Node 再增加一层平台 Shell。POSIX 子进程
|
||||
作为独立进程组启动;Windows 记录根 PID。停止时复用现有
|
||||
`terminateProcessTreeAndWait`:Windows 使用 `taskkill /T /F`,POSIX 终止本次进程组并等待
|
||||
有界退出。
|
||||
|
||||
### 5.3 环境
|
||||
|
||||
进程环境由 Main 构造:
|
||||
|
||||
- 继承运行普通项目命令所需的当前用户基础变量。
|
||||
- 当前使用筛选后的用户 PATH;[本机工具环境](../local-tool-environment/technical-design.md)
|
||||
实施后可通过现有 `toolBinDirectory` 注入口把受管 bin 放在 PATH 前面。
|
||||
- 排除模型 Provider Key、GoodBuddy 加密设置、调试变量和无关应用凭据。
|
||||
- 不修改 `process.env`,不写系统 PATH 或 Shell Profile。
|
||||
- 每次调用得到独立环境快照;命令内设置的变量不会进入下一次调用。
|
||||
|
||||
## 6. 执行空间绑定
|
||||
|
||||
定义一个小型进程后端接口,不把任意进程能力塞进 `WorkspaceAccess`:
|
||||
|
||||
```ts
|
||||
interface ExecutionSpaceProcessExecutor {
|
||||
getCapability(): Promise<
|
||||
| { available: true; shell: ProcessShellSummary }
|
||||
| { available: false; reason: string }
|
||||
>
|
||||
execute(
|
||||
input: ProcessExecuteInput,
|
||||
context: {
|
||||
workspace: WorkspaceAccess
|
||||
signal: AbortSignal
|
||||
}
|
||||
): Promise<ProcessExecuteResult>
|
||||
dispose(): Promise<void>
|
||||
}
|
||||
```
|
||||
|
||||
首版只有 `LocalProcessExecutor`。`ExecutionSpaceDescriptor.kind === 'ssh'` 时使用不可用实现,
|
||||
工具清单不注册进程能力。未来远端实现必须新增 Agent 协议、由 Agent 直接拥有命令进程,并
|
||||
按远端身份、取消和断线语义验证;不得把 SSH 路径传给本机 executor。
|
||||
|
||||
工作目录通过 `WorkspaceAccess.getIdentity()` 和本机真实路径解析共同确认。路径检查与 spawn
|
||||
之间若目录被外部替换,spawn 失败并返回准确错误;不为此增加持久路径凭据或恢复协议。
|
||||
|
||||
## 7. Subagent 工具契约
|
||||
|
||||
### 7.1 输入
|
||||
|
||||
```ts
|
||||
const subagentDelegateInputSchema = z.object({
|
||||
task: z.string().trim().min(1).max(100_000)
|
||||
}).strict()
|
||||
```
|
||||
|
||||
首版一次调用只创建一个子任务。不同父请求可以通过全局调度器并发,不增加批量委派 schema。
|
||||
|
||||
### 7.2 子请求
|
||||
|
||||
`DirectModelSubagentService` 创建临时子请求:
|
||||
|
||||
```ts
|
||||
type DirectModelSubagentContext = {
|
||||
parentRequestId: string
|
||||
childRunId: string
|
||||
projectId?: string
|
||||
conversationId: string
|
||||
workMode: 'ask' | 'execute'
|
||||
}
|
||||
```
|
||||
|
||||
- 子 `conversationId` 只用于 Runtime 内存和工具会话隔离,完成后立即
|
||||
`releaseConversation`,不保存为用户 Conversation。
|
||||
- 子 Prompt 使用明确任务和 Main 可信的编程 Subagent 指令,不复制父会话历史。
|
||||
- 子级使用父请求模型连接,首版不增加单独模型选择设置。
|
||||
- 子级复用父请求已授权能力快照和知识范围。
|
||||
- 子级复用父 Provider;Main 写入的 `delegationDepth=1` 同时在清单和调用边界过滤
|
||||
`subagent_delegate`。
|
||||
- Ask 子级使用 Ask 清单;Execute 子级使用 Execute 清单。
|
||||
|
||||
### 7.3 调度和结果
|
||||
|
||||
- 复用 `SubagentScheduler` 的取消、并发和队列模式。
|
||||
- 全局最大并发 3,队列最大 20。
|
||||
- 单个子任务最长 10 分钟;父请求更早取消时立即停止。
|
||||
- 文本结果最多 192 KiB,错误最多 2 KiB,连同结构化字段保持在 256 KiB 工具结果上限内。
|
||||
- 模型用量逐事件归属父请求和 `childRunId`,不能只算入父模型最后一轮。
|
||||
- 子级失败和取消返回结构化终态及部分输出,让父模型决定下一步。
|
||||
|
||||
### 7.4 领域持久化
|
||||
|
||||
当前 `SubagentService` 为历史专家流程创建隐藏 Child Task。新编程 Subagent 不复制该行为:
|
||||
|
||||
- 运行身份使用内部 `childRunId`。
|
||||
- 父消息通过现有 `subagent` 活动块保存终态和结果摘要。
|
||||
- 若通用 Job/Subjob 表已经实现,则记录为所属父 Task/请求的 Subjob/Run。
|
||||
- 若通用 Job/Subjob 表尚未实现,首版只保存现有消息活动和模型用量,不先创建另一套持久
|
||||
子任务表、恢复日志或兼容读取器。
|
||||
|
||||
可以提取现有 Scheduler、事件归并和用量转发逻辑,但不能把旧数据库字段当成新的产品模型。
|
||||
|
||||
## 8. ModelToolProvider 接入
|
||||
|
||||
`ModelToolCallContext` 增加不可伪造的运行上下文:
|
||||
|
||||
```ts
|
||||
type ModelToolCallContext = {
|
||||
conversationId: string
|
||||
requestId: string
|
||||
runtimeTarget: 'model'
|
||||
workMode: 'ask' | 'execute'
|
||||
executionSpaceIdentity: string
|
||||
delegationDepth: 0 | 1
|
||||
knowledgeCapabilityToken?: string
|
||||
}
|
||||
```
|
||||
|
||||
要求:
|
||||
|
||||
- `listTools` 根据模式、执行空间能力和深度生成快照。
|
||||
- `getApproval` 不为两个工具创建第二套逐次确认;沿用父 Execute 授权和现有通道工具策略。
|
||||
- `callTool` 再次检查 `runtimeTarget`、模式、执行空间 identity、深度和请求是否活动。
|
||||
- `releaseConversation` 取消并释放该会话拥有的浏览器、Subagent 和进程。
|
||||
- `dispose` 等待有界清理,不因模型或子进程不响应而阻塞应用退出。
|
||||
|
||||
DeepSeek Harness 的 Main 工具代理必须使用仅包含分配 MCP 和 Web 的 Provider 视图,不能因为
|
||||
共享 `ModelToolProvider` 类而自动看到直连模型编程工具。
|
||||
|
||||
## 9. 事件与活动
|
||||
|
||||
### 9.1 进程事件
|
||||
|
||||
继续使用现有 Runtime `tool` 事件:
|
||||
|
||||
- `pending`:参数已接收。
|
||||
- `running`:Shell 已成功启动。
|
||||
- `completed`:返回 exit 0 或非零退出结果。
|
||||
- `failed`:启动或契约失败。
|
||||
- `cancelled`:父请求取消。
|
||||
|
||||
结果摘要包含 Shell、相对目录、退出码、耗时和截断标记。完整有界 stdout/stderr 进入工具
|
||||
输出字段,不写应用诊断日志。
|
||||
|
||||
### 9.2 Subagent 事件
|
||||
|
||||
复用现有 `subagent` 公开事件和消息块,增加 `routingMode: 'native'` 表示模型主动委派。
|
||||
`expertId` 不再作为编程 Subagent 必填身份;共享 schema 应改为执行者 discriminated union,
|
||||
而不是伪造一个专家记录:
|
||||
|
||||
```ts
|
||||
type SubagentActor =
|
||||
| { kind: 'expert'; expertId: string; expertName: string }
|
||||
| { kind: 'direct-model'; label: '编程 Subagent' }
|
||||
```
|
||||
|
||||
迁移只需让读取器接受旧专家事件和新联合类型,不重写既有消息。
|
||||
|
||||
## 10. 错误处理
|
||||
|
||||
| 情况 | 结果 |
|
||||
| --- | --- |
|
||||
| 命令非零退出 | 正常 `ProcessExecuteResult` |
|
||||
| 命令不存在 | Shell 非零退出及 stderr |
|
||||
| Shell 无法启动 | 工具失败 |
|
||||
| cwd 无效或越界 | 工具调用前失败 |
|
||||
| 超时/取消 | 终止进程树,返回已有输出和原因 |
|
||||
| 子级模型失败 | 返回 `failed`、部分输出和错误 |
|
||||
| 子级工具失败 | 由子模型处理;最终无法完成时返回子级失败 |
|
||||
| 父请求已终止 | 拒绝新调用,丢弃迟到内容并清理 |
|
||||
|
||||
不要用宽泛 catch 抹掉取消、超时、Provider HTTP 状态或进程退出上下文。
|
||||
|
||||
## 11. 性能
|
||||
|
||||
- Shell 探测按执行服务实例缓存,不在每轮模型调用重复探测。
|
||||
- stdout/stderr 边读边界定,避免大日志进入内存后再截断。
|
||||
- 子级共享父请求已解析的模型配置和工具服务,不复制 MCP 配置或持久状态。
|
||||
- 不增加持久 Shell、后台 daemon、工作区快照或恢复状态机。
|
||||
- 命令执行不使用 PTY,避免普通构建和测试承担终端渲染成本。
|
||||
|
||||
## 12. 测试策略
|
||||
|
||||
### 12.1 单元测试
|
||||
|
||||
- 工具可见性矩阵和 Runtime target 过滤。
|
||||
- Ask 伪造进程调用拒绝。
|
||||
- Windows PowerShell、POSIX Bash/Sh 选择和参数。
|
||||
- cwd 默认、合法子目录、越界、符号链接越界和不存在。
|
||||
- exit 0、非零退出、spawn 失败、超时、取消和输出截断。
|
||||
- 环境筛选、本机工具 PATH 优先且模型凭据不进入进程。
|
||||
- 子级模式、模型、项目、执行空间和能力继承。
|
||||
- 深度 1 过滤、并发 3、队列 20、取消传播和部分输出。
|
||||
- 编程 Subagent 不创建 Task/Conversation。
|
||||
- DeepSeek Harness/OpenCode/Continue 不获得本功能工具。
|
||||
|
||||
### 12.2 本机集成测试
|
||||
|
||||
- Windows PowerShell 创建临时文件、运行 Node/Python、非零退出和进程树取消。
|
||||
- macOS/Linux Bash/Sh 执行相同场景。
|
||||
- 直连模型工具循环执行“修改 → 测试失败 → 修复 → 测试通过”。
|
||||
- 父模型委派子级修改或验证专用临时项目,并正确综合结果。
|
||||
- Runtime 切换后工具清单刷新且没有重复 Shell。
|
||||
- 应用退出后无残留 GoodBuddy 命令进程。
|
||||
|
||||
所有测试只在专用临时工作区创建文件,不删除或覆盖用户工作。
|
||||
|
||||
### 12.3 真实模型验证
|
||||
|
||||
使用一个最小真实直连文本模型请求:
|
||||
|
||||
1. Execute 创建一段有缺陷的小程序。
|
||||
2. 调用进程工具运行聚焦测试并观察失败。
|
||||
3. 修改程序并再次运行到通过。
|
||||
4. 委派一个 Subagent 检查实现或补充测试。
|
||||
5. 父模型读取子级结果并给出最终结论。
|
||||
|
||||
每个平台一次完整场景即可,不进行批量或高成本调用。记录准确模型调用次数,不记录 API Key。
|
||||
|
||||
### 12.4 项目验证
|
||||
|
||||
源码完成后运行:
|
||||
|
||||
```text
|
||||
npm test
|
||||
npm run typecheck
|
||||
npm run lint
|
||||
npm run build
|
||||
```
|
||||
|
||||
跨平台进程实现必须由 Windows、macOS、Linux x64 和 Linux arm64 CI 验证。首版不改变
|
||||
GoodBuddy Agent 或桌面到 Agent 生产路径,因此不要求远端 Host 验证;未来增加远端 executor
|
||||
时必须按远程主机技术设计执行共享 Linux Host 真机验证。
|
||||
|
||||
## 13. 实施顺序
|
||||
|
||||
1. Shared 工具摘要、schema 和 Runtime target 过滤。
|
||||
2. 本机 Shell 探测、进程执行、输出边界和进程树取消。
|
||||
3. `ModelToolProvider` Execute 接入及 UI 活动。
|
||||
4. 编程 Subagent 服务、过滤 Provider、事件和用量。
|
||||
5. 设置能力目录与状态诊断。
|
||||
6. 三平台真实命令、真实模型和完整项目验证。
|
||||
|
||||
每一步都必须保持直连模型正常问答可用;Shell 不可用不能阻止普通对话。
|
||||
@@ -0,0 +1,134 @@
|
||||
# 直连模型 Agent 能力 UI 设计
|
||||
|
||||
## 文档信息
|
||||
|
||||
| 项目 | 内容 |
|
||||
| --- | --- |
|
||||
| 状态 | 已实施 |
|
||||
| 版本 | 0.2 |
|
||||
| 日期 | 2026-09-01 |
|
||||
| 设计系统 | [GoodBuddy 统一界面设计系统](../../../UI-DESIGN.md) |
|
||||
| 关联 PRD | [PRD](./prd.md) |
|
||||
| 关联逻辑 | [功能逻辑设计](./logic-design.md) |
|
||||
|
||||
## 1. 信息架构
|
||||
|
||||
本功能不增加一级页面、Composer 按钮或 Runtime 专属工具栏。用户主要通过三处理解能力:
|
||||
|
||||
1. **设置 > MCP > 直连模型**:查看内置编程能力说明。
|
||||
2. **聊天消息活动块**:查看命令和 Subagent 的实时状态与结果。
|
||||
3. **运行记录**:按当前 Conversation 或 Task 查看聚合执行活动。
|
||||
|
||||
Job、Subjob 和 Run 继续是内部对象,不创建树形 UI、独立路由或操作菜单。
|
||||
|
||||
## 2. 设置中的能力目录
|
||||
|
||||
在现有直连模型工具目录增加“编程能力”分组:
|
||||
|
||||
```text
|
||||
编程能力
|
||||
进程执行
|
||||
使用当前工作区和当前用户权限运行 PowerShell/Bash 命令。
|
||||
编程 Subagent
|
||||
将聚焦任务委派给同一模型连接;继承当前工作模式和工作区。
|
||||
```
|
||||
|
||||
要求:
|
||||
|
||||
- 两项默认属于直连模型,不提供持久 Switch。
|
||||
- 设置目录只定义稳定工具能力,不增加 Shell 状态或重试控件;实际 Shell 标签在模型工具
|
||||
定义和进程结果中返回。
|
||||
- Runtime 是 OpenCode、Continue 或 DeepSeek Harness 时,不在其原生能力清单中伪造这两项;
|
||||
用户需要理解差异时,在直连模型分组说明“Agent Runtime 使用自身工具”。
|
||||
- 不把模型配置检查成功描述为命令或 Subagent 已经通过真实执行验证。
|
||||
|
||||
## 3. 进程活动块
|
||||
|
||||
复用现有对话工具活动视觉和语义,不创建页面专属卡片系统。
|
||||
|
||||
### 3.1 标题与摘要
|
||||
|
||||
```text
|
||||
进程执行
|
||||
PowerShell · packages/app · npm test
|
||||
```
|
||||
|
||||
- 命令只显示单行有界摘要,完整参数进入可展开详情。
|
||||
- 目录显示工作区相对路径;工作区根显示 `.`。
|
||||
- 不在摘要中显示完整环境或凭据。
|
||||
|
||||
### 3.2 状态
|
||||
|
||||
| 状态 | 文案 |
|
||||
| --- | --- |
|
||||
| pending | 等待运行 |
|
||||
| running | 正在运行 |
|
||||
| completed,exit 0 | 已完成 |
|
||||
| completed,exit 非零 | 工具已完成,详情显示退出码 N |
|
||||
| timeout | 工具已完成,详情显示 timeout |
|
||||
| cancelled | 父请求活动显示已取消 |
|
||||
| failed | 启动失败 |
|
||||
|
||||
状态必须同时有文字和状态图标,不能只依靠颜色。非零退出属于正常结构化工具结果,不显示为
|
||||
GoodBuddy 服务崩溃。
|
||||
|
||||
### 3.3 结果详情
|
||||
|
||||
详情按以下顺序展示:
|
||||
|
||||
1. Shell、工作目录、耗时和退出码。
|
||||
2. stdout。
|
||||
3. stderr。
|
||||
4. 截断提示。
|
||||
|
||||
日志使用共享等宽字体和可选择文本。长输出在活动块内折叠,展开后仍保持工作栏和聊天布局
|
||||
可用;不把完整日志复制为应用通知。
|
||||
|
||||
## 4. Subagent 活动块
|
||||
|
||||
复用现有 `subagent` 消息块,并将系统执行者显示为“编程 Subagent”,不要求用户预先创建
|
||||
专家。
|
||||
|
||||
```text
|
||||
编程 Subagent
|
||||
检查认证模块的测试失败并提出修复
|
||||
正在运行 · 直连模型 · Execute
|
||||
```
|
||||
|
||||
终态:
|
||||
|
||||
- 完成:显示有界结果摘要,可展开查看完整返回。
|
||||
- 失败:保留部分输出和错误。
|
||||
- 取消:显示“父请求已取消”或准确取消原因。
|
||||
- 排队:显示当前处于并发队列,不显示虚假百分比。
|
||||
|
||||
活动块不提供单独的“批准”“提高权限”或“继续递归”按钮。用户取消父请求即可取消子级。
|
||||
|
||||
## 5. Ask/Execute 表达
|
||||
|
||||
- Ask 中不显示不可用的进程按钮,因为模型工具没有手动调用入口。
|
||||
- Ask Subagent 活动明确显示“只读”。
|
||||
- Execute 活动显示“当前用户权限”,不声称 OS 沙箱或工作区隔离。
|
||||
- 如果用户从 Ask 切到 Execute,只有下一条请求使用新模式;运行中的 Subagent 不切换。
|
||||
|
||||
## 6. 错误与通知
|
||||
|
||||
- 参数错误、命令退出、Subagent 失败和部分输出属于当前活动上下文,保留在对应活动块。
|
||||
- Runtime 初始化、Shell 探测或全局服务失败可通过应用通知提示,并在设置状态卡提供重试。
|
||||
- 同一错误不同时显示活动块副本和通知副本。
|
||||
- 失败后保留用户 Prompt、命令摘要、工作目录和已有输出。
|
||||
|
||||
## 7. 键盘与无障碍
|
||||
|
||||
- 活动块展开按钮使用原生 `button`,提供 `aria-expanded` 和关联详情 ID。
|
||||
- 状态变化通过现有活动区域的礼貌级 live region 发布,不逐个朗读流式日志。
|
||||
- stdout/stderr 区域具有可见标签,不能只靠顺序区分。
|
||||
- 焦点不会因后台状态更新自动移动。
|
||||
- 取消父请求后的焦点保持在原取消按钮或恢复到 Composer。
|
||||
- 浅色、深色和减少动态效果模式遵守统一设计系统。
|
||||
|
||||
## 8. 响应式
|
||||
|
||||
- 窄聊天区只保留工具名、状态和一行摘要,元数据换行到下一行。
|
||||
- 日志区域横向滚动,不撑宽页面。
|
||||
- 运行记录使用紧凑摘要,不复制完整 stdout/stderr;用户回到聊天活动块展开查看详情。
|
||||
@@ -0,0 +1,168 @@
|
||||
# 直连模型 Agent 能力 User Stories
|
||||
|
||||
## 文档信息
|
||||
|
||||
| 项目 | 内容 |
|
||||
| --- | --- |
|
||||
| 状态 | 已实施,跨平台 CI 待验证 |
|
||||
| 版本 | 0.2 |
|
||||
| 日期 | 2026-09-01 |
|
||||
| 关联 PRD | [直连模型 Agent 能力 PRD](./prd.md) |
|
||||
| 关联逻辑 | [功能逻辑设计](./logic-design.md) |
|
||||
|
||||
## 1. 角色
|
||||
|
||||
### 1.1 普通项目用户
|
||||
|
||||
希望模型直接完成脚本、文档生成或数据处理,不关心不同平台的 Shell 名称。
|
||||
|
||||
### 1.2 开发者
|
||||
|
||||
希望直连模型能够修改代码、运行测试、检查 Git 状态并根据失败结果继续修正。
|
||||
|
||||
### 1.3 Runtime 用户
|
||||
|
||||
已经使用 OpenCode、Continue 或 DeepSeek Harness,希望继续使用 Runtime 原生能力,不看到
|
||||
重复的 GoodBuddy Shell 或 Subagent。
|
||||
|
||||
## 2. Epic A:跨平台执行
|
||||
|
||||
### US-A1 在 Windows 运行项目命令
|
||||
|
||||
关联:FR-2、FR-3、FR-4。
|
||||
|
||||
Given 当前项目位于 Windows 本机且选择直连模型 Execute,When 模型调用
|
||||
`process_execute`,Then GoodBuddy 使用可用 PowerShell 在项目目录运行命令,并返回
|
||||
Shell、目录、退出码、输出和耗时。
|
||||
|
||||
### US-A2 在 macOS/Linux 运行项目命令
|
||||
|
||||
关联:FR-2、FR-3。
|
||||
|
||||
Given 当前项目位于 macOS 或 Linux 本机,When 模型运行同一工具,Then GoodBuddy 使用
|
||||
Bash,Bash 不可用时使用 Sh,工具契约保持不变且实际 Shell 明确可见。
|
||||
|
||||
### US-A3 使用工作区子目录
|
||||
|
||||
关联:FR-3。
|
||||
|
||||
Given 项目包含多个包,When 模型传入工作区内相对目录,Then 命令在该目录执行;When
|
||||
路径越出工作区、不是目录或不存在,Then 命令不启动并返回准确错误。
|
||||
|
||||
### US-A4 根据非零退出继续修正
|
||||
|
||||
关联:FR-2、FR-9。
|
||||
|
||||
Given 测试命令退出码非零,When 进程结束,Then 工具正常返回退出码和 stderr,而不是终止
|
||||
整个模型请求,And 模型可以读取失败原因、修改代码并再次运行。
|
||||
|
||||
### US-A5 取消长命令
|
||||
|
||||
关联:FR-7。
|
||||
|
||||
Given 命令仍在运行,When 用户取消父请求,Then 当前 Shell 及其由本次命令创建的子进程树
|
||||
停止,And 活动状态显示“已取消”,And 其他用户进程不受影响。
|
||||
|
||||
### US-A6 看懂截断结果
|
||||
|
||||
关联:FR-7、FR-9。
|
||||
|
||||
Given 命令输出超过上限,When 工具返回结果,Then 保留有用的开头和结尾并明确
|
||||
`truncated: true`,And 模型与用户都不会把结果理解为完整日志。
|
||||
|
||||
## 3. Epic B:编程闭环
|
||||
|
||||
### US-B1 修改后运行验证
|
||||
|
||||
关联:FR-2、FR-4。
|
||||
|
||||
Given 用户选择 Execute 并要求修复代码,When 直连模型修改文件,Then 它可以运行聚焦测试
|
||||
或检查命令,并根据真实结果继续修改,直到给出完成或阻塞结论。
|
||||
|
||||
### US-B2 使用本机工具环境
|
||||
|
||||
关联:FR-8、FR-10。
|
||||
|
||||
Given 用户选择了 GoodBuddy 托管或自定义 Node/Python,When 新命令调用 `node`、`npm`、
|
||||
`npx`、`python` 或 `pip`,Then 它们解析到当前工具环境,And 不修改系统 PATH 或已有终端。
|
||||
|
||||
### US-B3 依赖或命令不存在
|
||||
|
||||
关联:FR-2、FR-9。
|
||||
|
||||
Given 项目缺少所需命令或依赖,When Shell 返回错误,Then 工具保留退出码和错误文本,
|
||||
And 模型说明缺失项或在 Execute 中采取用户要求的安装步骤,不把环境缺失报告为模型故障。
|
||||
|
||||
## 4. Epic C:Subagent 委派
|
||||
|
||||
### US-C1 委派聚焦编程任务
|
||||
|
||||
关联:FR-5、FR-6。
|
||||
|
||||
Given 父直连模型正在处理复杂请求,When 它调用 `subagent_delegate` 并给出独立任务,
|
||||
Then 子级使用同一项目、模型连接和 Execute 能力完成工作,And 最终结果返回父模型综合。
|
||||
|
||||
### US-C2 Ask 中只读委派
|
||||
|
||||
关联:FR-4、FR-5。
|
||||
|
||||
Given 父请求为 Ask,When 模型委派分析任务,Then 子级保持 Ask,不能写文件或运行命令,
|
||||
And 不因 Subagent 存在而扩大权限。
|
||||
|
||||
### US-C3 禁止递归委派
|
||||
|
||||
关联:FR-5、FR-7。
|
||||
|
||||
Given 子级正在执行,When 它读取自己的工具清单,Then 清单中没有
|
||||
`subagent_delegate`,And 子级不能创建孙级任务。
|
||||
|
||||
### US-C4 子级失败后父级继续
|
||||
|
||||
关联:FR-5、FR-9。
|
||||
|
||||
Given 子级运行期间失败或超时,When 子任务结算,Then 父模型收到失败状态、部分输出和
|
||||
有界错误,And 可以自行继续、改变方案或向用户说明阻塞。
|
||||
|
||||
### US-C5 取消传播
|
||||
|
||||
关联:FR-7。
|
||||
|
||||
Given 一个 Subagent 正在运行模型或命令,When 用户取消父请求,Then 排队和运行中的子级
|
||||
全部取消,当前命令进程树停止,And 不再向父请求追加迟到结果。
|
||||
|
||||
### US-C6 保持产品对象简单
|
||||
|
||||
关联:FR-6。
|
||||
|
||||
Given 直连模型完成一次委派,When 用户查看会话、Task Center 和活动,Then 会话内可看到
|
||||
Subagent 状态与结果摘要,And Task Center 不出现新的子 Task,And UI 不展示 Job/Run 树。
|
||||
|
||||
## 5. Epic D:Runtime 与执行空间边界
|
||||
|
||||
### US-D1 Agent Runtime 不重复获得工具
|
||||
|
||||
关联:FR-1、FR-10。
|
||||
|
||||
Given 用户选择 OpenCode、Continue 或 DeepSeek Harness,When Runtime 启动,Then
|
||||
GoodBuddy 不注入 `process_execute` 或 `subagent_delegate`,And Runtime 原生能力保持不变。
|
||||
|
||||
### US-D2 切换 Runtime 后工具清单更新
|
||||
|
||||
关联:FR-1。
|
||||
|
||||
Given 会话从直连模型切换为 Agent Runtime,When 下一次请求开始,Then 新请求只使用目标
|
||||
Runtime 的能力;切回直连模型时重新获得符合工作模式的直连工具。
|
||||
|
||||
### US-D3 不在错误设备执行
|
||||
|
||||
关联:FR-3。
|
||||
|
||||
Given 当前执行空间是 SSH 且远端进程后端尚不可用,When 解析工具清单,Then 不注册
|
||||
`process_execute`;即使调用参数有效,也不能回退到桌面本机执行。
|
||||
|
||||
### US-D4 消息通道使用相同规则
|
||||
|
||||
关联:FR-1、FR-4。
|
||||
|
||||
Given 消息通道项目选择直连模型,When 合法消息触发 Ask 或 Execute,Then 使用与桌面会话
|
||||
相同的工具矩阵和通道既有工具策略,不维护第二套 Shell 能力配置。
|
||||
@@ -14,3 +14,8 @@
|
||||
|
||||
先阅读统一领域模型。其他功能文档不得重新定义 Task、Conversation、Job、Run 或 Subagent。
|
||||
若实现与文档出现冲突,应先修正统一模型,再同步功能 PRD。
|
||||
|
||||
## 相关功能
|
||||
|
||||
- [直连模型 Agent 能力](../direct-model-agent/README.md) 使用本目录定义的 Subagent 与
|
||||
Job/Subjob 语义,为直连模型提供单层编程委派,但不重新定义产品对象层级。
|
||||
|
||||
Reference in New Issue
Block a user