Preserve read-only question and answer reviews after successful submission or skipping, including multiple rounds and local conversation reloads. Keep failed submissions retryable and preserve newer questions and terminal states when responses arrive late. Validation: typecheck and lint passed; full suite had 3900 passes, 66 skips and one Agent package timeout that passed on isolated rerun. Real OpenCode UI acceptance was not run. Previously discarded answers cannot be recovered. Release note: 修复 OpenCode 提交回答后会话仅显示已提交的问题;现在保留原问题及对应答案,多轮问答和跳过记录在重新打开会话后仍可查看。
62 lines
5.5 KiB
Markdown
62 lines
5.5 KiB
Markdown
# Runtime 交互边界
|
|
|
|
本文定义当前原生交互的适配范围,不增加工作模式或第二层 Execute 审批。
|
|
|
|
| Runtime | 权限确认 | 业务问答 |
|
|
| --- | --- | --- |
|
|
| 本机 GoodBuddy 管理的 OpenCode | 内部默认配置允许权限;每个 Ask 请求仍使用 deny-all 与显式只读能力。Execute 自动回复属于当前请求的父、子孙会话权限事件,不处理其他并行请求 | 通过 `question.asked` 转交父、子孙会话问题,支持原生单选、多选、yes/no、自由文本及跳过;使用公开 ID 回传 `question.reply/reject` |
|
|
| Continue | Execute 启动传入 `--auto`,剩余原生权限请求按当前模式自动答复 | 对接 `1.5.47` QuizService 的扁平 `pendingQuestion`,其中 `question` 是字符串。选项回答与自定义文本分别回传正确的 `isCustomAnswer`;跳过发送拒绝回答的文本 |
|
|
| DeepSeek Harness | 固定 Host 的 Execute 文件与命令工具不询问目录权限;若收到 ACP 权限请求,活跃 Execute 直接选一次性允许,缺少该选项时使用 Runtime 提供的允许选项,Ask 拒绝,不等待额外 authorizer | 固定 Host 当前未提供通用原生业务问答服务,不把普通模型正文误识别成待答协议。模型以普通回复提问时,用户通过下一条消息回答 |
|
|
|
|
托管 SSH OpenCode 的 ACP 权限处理与直接启动配置由
|
|
[远程主机技术设计](../remote-host/technical-design.md)定义;本机 SDK 问答适配不代表远程
|
|
ACP 已提供相同业务问答接口。
|
|
|
|
## 运行与失败
|
|
|
|
- 结构化 yes/no 是普通选项,不从日志、自然语言或 Shell 输出猜测用户意图。
|
|
- 前台问题停留在现有问答卡片,保留回答、提交失败提示与跳过入口。
|
|
- 回答或跳过成功后,会话保留只读的“问题与回答”,显示原问题及对应的选项答案、
|
|
自定义文本或“已跳过”。同一任务的多轮问答逐次保留,随本地会话保存,重新打开后仍可查看。
|
|
提交失败时保留输入与重试入口,不生成已回答记录;取消未回答的问题不记为主动跳过。
|
|
- 提交响应晚于任务结束时仍保存已提交的问答,但不覆盖完成或失败状态;晚于下一轮提问时
|
|
不清除新的待答卡片。旧版会话未保存的问题与答案无法从“已提交”状态文案恢复。
|
|
- 后台任务收到结构化提问时,通过现有 Main 路径明确失败并提示改为前台对话,不永久等待。
|
|
- 请求结束或取消后清除对应待答映射;过期回答明确报错,不转交给后来的请求。
|
|
- 任意终端程序的密码、OAuth 登录、许可证确认或 stdin 提示不自动回复 `yes`。这类程序应
|
|
使用其非交互参数,或由用户在终端完成;不能把权限确认和业务决策混为一谈。Shell
|
|
工具保留其现有取消与超时,不新增日志解析或通用交互代理。
|
|
|
|
## 托管 Runtime 的并行与输出
|
|
|
|
- 本机和 Agent 管理的 OpenCode 启动配置都显式设置 `snapshot: false`。GoodBuddy 不消费
|
|
原生自动 Git 快照、快照差异摘要或快照撤销;关闭这条内部路径,避免大行级差异的同步
|
|
计算阻塞同一原生进程中的其他会话。
|
|
- 文件工具、Shell、原生子代理、工作区 Git 状态和单文件差异保持可用;不新增全局会话
|
|
队列、请求重放或总执行截止时间。外部 OpenCode Server 的配置不由 GoodBuddy 改写,
|
|
已运行的旧原生进程也不会热更新配置。
|
|
- Continue 使用 HTTP 传递响应和状态;Electron UtilityProcess 启动后持续排空不用展示的
|
|
stdout,避免控制台输出填满管道后阻塞宿主。stderr 的有界错误处理、请求取消与进程
|
|
回收保持不变,不把诊断输出复制进聊天或持久日志。
|
|
- 远端最终启动配置由[远程主机技术设计](../remote-host/technical-design.md)定义,
|
|
模型桥生成最终配置时同样保留上述快照策略。
|
|
|
|
## 消息底部请求状态
|
|
|
|
- 状态属于当前请求,不与顶部 Runtime 的连接中、就绪、不可用混为一谈。提交后先显示
|
|
“正在准备请求”;没有更具体的活动事件时显示“等待后续进展”,不声称模型正在思考。
|
|
- 本机 OpenCode 只把当前父会话的 `session.status.retry` 映射为等待重试,显示原生
|
|
`attempt`、计划重试时间和有界脱敏原因;后续 `busy` 才显示已开始重试。其他会话的
|
|
状态不串入当前消息,不猜测总重试次数,不把 SDK 事件流重连当作模型重试。
|
|
- 显示优先级为待回答、待确认、进行中的上下文压缩、明确的请求状态、待执行或执行中的
|
|
工具、未完成的子任务、等待后续进展。压缩沿用已有活动块,不重复增加底部提示。
|
|
正文、推理或工具进展会清除旧状态;子任务更新不覆盖父请求的重试提示。
|
|
- 完成、失败、取消后保留真实终态,迟到的状态事件不能把请求恢复成处理中。底部状态点
|
|
为静态,不凭请求尚未结束暗示仍有进展;会话列表闪点和发送、停止按钮保持原有行为。
|
|
- Continue、DeepSeek Harness 和远端 ACP 保留其已接入的处理与工具事件,不伪造未接入
|
|
的原生重试状态。直连模型的重试等待与请求开始文案见
|
|
[直连模型 UI 设计](../direct-model-agent/ui-design.md#6-错误与通知);本次不改变任何
|
|
Runtime 的重试上限、请求重放或取消策略。
|
|
|
|
实现与真实 Runtime 验证证据见[进度记录](./progress.md)。
|