Show bounded operation summaries for Continue, DeepSeek Harness and direct-model tools, retaining input details across incremental updates. Use one canonical workspace path for DeepSeek Host startup and ACP sessions so equivalent Windows paths reuse a working Runtime. Compare persisted subagent tool fields by value, release terminal task caches, and avoid rebuilding caches for duplicate remote events. Upgrade to schema 35 to recompact repeated schema-34 tool blocks while preserving events and provenance. Include regression coverage, validation records and temporary-resource test exclusions. Validation: 4155 tests passed, 66 skipped; typecheck and lint passed. Full desktop real-model validation covered all three tool-summary paths and both Windows path spellings. Storage validation evidence includes local and remote tool workloads and real database upgrade checks. Release note: Tool records now show paths, commands and search details across runtimes. Fix DeepSeek Windows workspace failures and repeated subagent history growth; schema 35 reclaims redundant history data while preserving execution records, and older clients cannot reopen the upgraded database.
93 lines
8.5 KiB
Markdown
93 lines
8.5 KiB
Markdown
# Runtime 交互边界
|
|
|
|
本文定义当前原生交互的适配范围,不增加工作模式或第二层 Execute 审批。
|
|
|
|
| Runtime | 权限确认 | 业务问答 |
|
|
| --- | --- | --- |
|
|
| 本机 GoodBuddy 管理的 OpenCode | 内部默认配置允许权限;每个 Ask 请求仍使用 deny-all 与显式只读能力。Execute 自动回复属于当前请求的父、子孙会话权限事件,不处理其他并行请求 | 通过 `question.asked` 转交父、子孙会话问题,支持原生单选、多选、yes/no、自由文本及跳过;使用公开 ID 回传 `question.reply/reject` |
|
|
| 托管 SSH OpenCode | Agent 按已接受 Prompt 的 Ask/Execute 模式处理 ACP 权限,规则见远程主机技术设计 | 当前 Agent 插件转交原生父、子孙会话 `question.asked`;前台使用同一问答队列,回答和跳过经认证 Agent 控制通道回传,已知 Task 关联显示子任务归属 |
|
|
| Continue | Execute 启动传入 `--auto`,剩余原生权限请求按当前模式自动答复 | 对接 `1.5.47` QuizService 的扁平 `pendingQuestion`,其中 `question` 是字符串。选项回答与自定义文本分别回传正确的 `isCustomAnswer`;跳过发送拒绝回答的文本 |
|
|
| DeepSeek Harness | 固定 Host 的 Execute 文件与命令工具不询问目录权限;若收到 ACP 权限请求,活跃 Execute 直接选一次性允许,缺少该选项时使用 Runtime 提供的允许选项,Ask 拒绝,不等待额外 authorizer | 固定 Host 当前未提供通用原生业务问答服务,不把普通模型正文误识别成待答协议。模型以普通回复提问时,用户通过下一条消息回答 |
|
|
|
|
托管 SSH OpenCode 的权限、原生问题事件与回复链路由
|
|
[远程主机技术设计](../remote-host/technical-design.md)定义。本次候选的远端业务问答需要
|
|
Desktop `0.13.0`、Agent `0.11.24` 和新启动的托管 Runtime;请先升级 Desktop,再更新
|
|
Host 环境。任意第三方 ACP 服务及旧 Agent 不因此获得通用问答接口,候选不表示已经发布。
|
|
|
|
## 运行与失败
|
|
|
|
- 结构化 yes/no 是普通选项,不从日志、自然语言或 Shell 输出猜测用户意图。
|
|
- 前台同一请求的待答问题按公开 `questionId` 去重,按到达顺序保存在消息的
|
|
`pendingQuestions` 中。每次显示队首表单;有多个待答请求时显示数量。后续提问和重复
|
|
事件不替换当前表单或清空输入,回答或跳过成功后只移除对应 ID,再显示下一张表单。
|
|
提交失败保留队列、输入和重试入口,队列未清空时继续显示“等待你的回答”。
|
|
- 本机与托管 SSH OpenCode 在提问到达前已收到原生 Task 的 `metadata.sessionId` 时,将精确匹配的
|
|
子会话关联为可选 `childTaskId`。问答卡片显示该任务名称;对应 Task 卡片显示
|
|
“等待你的回答”,展开后可点击“前往问答表单”滚动并聚焦当前队首表单,仍按顺序回答。
|
|
没有已知关联的子孙会话问题照常排队,不猜测子任务归属,也不从工具名或进度文本构造表单。
|
|
- 回答或跳过成功后,会话保留只读的“问题与回答”,显示原问题及对应的选项答案、
|
|
自定义文本或“已跳过”。同一任务的多轮问答逐次保留,随本地会话保存,重新打开后仍可查看。
|
|
提交失败时保留输入与重试入口,不生成已回答记录;取消未回答的问题不记为主动跳过。
|
|
- 提交响应晚于任务结束时仍保存已提交的问答,但不覆盖完成或失败状态;晚于下一轮提问时
|
|
不清除新的待答卡片。旧版会话未保存的问题与答案无法从“已提交”状态文案恢复。
|
|
- 待答队列仅保存在当前桌面会话内存中,不写入会话快照。刷新仍在运行的消息时保留整个
|
|
本地队列;完成、失败、取消事件或持久化终态快照清除整个队列。迟到的提交结果可以保存
|
|
已回答记录,但不会恢复表单或覆盖终态。本机 Runtime 不恢复重启前未提交的问题;托管 SSH
|
|
重新附加同一存活 Agent Prompt 时,由 Agent 当前待答列表补发问题,已回答的历史事件不补发。
|
|
- 后台任务收到结构化提问时,通过现有 Main 路径明确失败并提示改为前台对话,不永久等待。
|
|
- 请求结束或取消后清除对应待答映射;过期回答明确报错,不转交给后来的请求。
|
|
- 任意终端程序的密码、OAuth 登录、许可证确认或 stdin 提示不自动回复 `yes`。这类程序应
|
|
使用其非交互参数,或由用户在终端完成;不能把权限确认和业务决策混为一谈。Shell
|
|
工具保留其现有取消与超时,不新增日志解析或通用交互代理。
|
|
|
|
## 托管 Runtime 的并行与输出
|
|
|
|
子任务完整过程的显示与数据库差量存储相互独立,本机和托管 SSH 共用桌面存储层;
|
|
旧库升级与空间回收规则见[执行记录存储与升级回收](./execution-history-storage.md)。
|
|
|
|
- 本机和 Agent 管理的 OpenCode 启动配置都显式设置 `snapshot: false`。GoodBuddy 不消费
|
|
原生自动 Git 快照、快照差异摘要或快照撤销;关闭这条内部路径,避免大行级差异的同步
|
|
计算阻塞同一原生进程中的其他会话。
|
|
- 文件工具、Shell、原生子代理、工作区 Git 状态和单文件差异保持可用;不新增全局会话
|
|
队列、请求重放或总执行截止时间。外部 OpenCode Server 的配置不由 GoodBuddy 改写,
|
|
已运行的旧原生进程也不会热更新配置。
|
|
- Continue 使用 HTTP 传递响应和状态;Electron UtilityProcess 启动后持续排空不用展示的
|
|
stdout,避免控制台输出填满管道后阻塞宿主。stderr 的有界错误处理、请求取消与进程
|
|
回收保持不变,不把诊断输出复制进聊天或持久日志。
|
|
- 远端最终启动配置由[远程主机技术设计](../remote-host/technical-design.md)定义,
|
|
模型桥生成最终配置时同样保留上述快照策略。
|
|
|
|
## 工具操作摘要
|
|
|
|
工具记录沿用 [UI 设计系统](../../../UI-DESIGN.md)的折叠布局。Continue、DeepSeek Harness
|
|
和直连模型共用 `toolOperationSummary`:优先使用有效原生标题,否则从参数提取命令、
|
|
文件路径、搜索条件或 URL,合并空白后最多显示 240 字符。无法识别时保留原有工具名
|
|
回退规则;文件正文、整份参数 JSON 不进入标题,参数详情仍可展开查看。
|
|
|
|
Continue 在宿主截断输入前提取摘要,流式完成与失败事件使用合并后的输入和摘要。
|
|
DeepSeek Harness 按调用 ID 保留名称、输入和摘要,结束事件省略输入时仍能显示操作内容。
|
|
直连模型从原始参数生成一次摘要,在待执行、执行中和完成时复用;审批失败、拒绝和
|
|
执行失败、刷新重试仍保留已有提示。
|
|
|
|
本机 OpenCode 沿用原生操作标题。远端 ACP 独立使用原生标题作为记录名称,不经过上述
|
|
本地转换,本次没有修改 Agent、远程桥或协议。
|
|
|
|
## 消息底部请求状态
|
|
|
|
- 状态属于当前请求,不与顶部 Runtime 的连接中、就绪、不可用混为一谈。提交后先显示
|
|
“正在准备请求”;没有更具体的活动事件时显示“等待后续进展”,不声称模型正在思考。
|
|
- 本机 OpenCode 只把当前父会话的 `session.status.retry` 映射为等待重试,显示原生
|
|
`attempt`、计划重试时间和有界脱敏原因;后续 `busy` 才显示已开始重试。其他会话的
|
|
状态不串入当前消息,不猜测总重试次数,不把 SDK 事件流重连当作模型重试。
|
|
- 显示优先级为待回答、待确认、进行中的上下文压缩、明确的请求状态、待执行或执行中的
|
|
工具、未完成的子任务、等待后续进展。压缩沿用已有活动块,不重复增加底部提示。
|
|
正文、推理或工具进展会清除旧状态;子任务更新不覆盖父请求的重试提示。
|
|
- 完成、失败、取消后保留真实终态,迟到的状态事件不能把请求恢复成处理中。底部状态点
|
|
为静态,不凭请求尚未结束暗示仍有进展;会话列表闪点和发送、停止按钮保持原有行为。
|
|
- Continue、DeepSeek Harness 和远端 ACP 保留其已接入的处理与工具事件,不伪造未接入
|
|
的原生重试状态。直连模型的重试等待与请求开始文案见
|
|
[直连模型 UI 设计](../direct-model-agent/ui-design.md#6-错误与通知);本次不改变任何
|
|
Runtime 的重试上限、请求重放或取消策略。
|
|
|
|
实现与真实 Runtime 验证证据见[进度记录](./progress.md)。
|