feat: add external knowledge retrieval and cross-project activity
Connect Dify, FastGPT and RAGFlow through read-only bindings, encrypted local credentials, shared retrieval and persistent citations. Configuration and removal affect GoodBuddy only. Show active conversations across projects, retain older live work, and improve project dialog scrolling. Queue concurrent questions and route managed SSH OpenCode questions through the Agent. Preserve recoverable read/search errors and partial search results. Document the Electron UI automation standard, real model and external knowledge validation, and remaining acceptance limits. Validation: earlier full regression passed 4081 tests with 66 skipped; subsequent focused remote-question checks and real Linux evidence are recorded in feature progress. Precommit typecheck and lint passed; latest project dialog and shared UI suites passed 58 tests. The full suite was not rerun for the final dialog changes. Release note: Use external knowledge in conversations, find active work across projects, and answer concurrent local or managed SSH OpenCode questions. Managed SSH questions require the updated Agent adapter.
This commit is contained in:
@@ -1,5 +1,62 @@
|
||||
# 工作栏实现与验证进度
|
||||
|
||||
## 2026-09-13 托管 SSH 原生问答
|
||||
|
||||
- 当前源码支持前台托管 SSH OpenCode 的父、子孙会话原生问题、回答和拒答,复用已有
|
||||
Renderer 队列与 Task 归属。问题来源为原生 `question.asked`;模型正文和普通工具活动
|
||||
不生成问答表单。协议、身份与生命周期规则见
|
||||
[远程主机技术设计](../remote-host/technical-design.md#acp-与断线)。
|
||||
- 新增 `remote-question-binary.test.ts`,使用真实 OpenCode `1.18.29` ACP 进程、生产插件、
|
||||
Agent Prompt owner 和 loopback 模型夹具,覆盖父问题、Task 子问题、拒答、取消、
|
||||
跨 binding 回答拒绝、迟到回答拒绝,以及临时回复能力不进入语义记录。
|
||||
插件测试另覆盖孙会话归属、并发重复事件、HTTP 路径认证、原生待答列表校验和端口关闭;
|
||||
Runtime 测试覆盖已 ACK 记录后的待答补发、回复失败重试与已回答历史去重。
|
||||
- 共享 Linux x64 Host 使用既有加密凭据和固定 Host Key,经真实 SSH attach 启动当前源码
|
||||
的隔离 Agent。生产 `createManagedRemoteAcpRuntime` 入口完成 Ask、Execute 并行父子
|
||||
问答、拒答和待答期间取消;两个并行问题在首次回答前均到达 Desktop Runtime,子问题
|
||||
带 Task 归属,回答后原生 Task 和父轮次正常完成。拒答结束原生轮次,取消后迟到回答
|
||||
明确失败。最终一轮 7 次确定性模型夹具请求,外部模型调用 0 次;测试 daemon 停止,
|
||||
测试目录与上传文件已清理,未修改 Host 原有 Runtime registry。
|
||||
- 最终定向回归:11 份测试文件,219 项通过、5 项平台跳过,包含 Agent、模型桥、ACP
|
||||
Runtime、认证控制通道及托管入口测试。`npm run typecheck`、`npm run lint` 通过。
|
||||
本轮全量 `npm test -- --reporter=json --outputFile=<临时报告>` 为 4,081 项通过、
|
||||
0 项失败、66 项跳过;之后的插件身份与并发去重补充由最终定向回归和 Host 复测覆盖。
|
||||
- 当前验证未操作 Electron 窗口、重装共享 Agent 或模拟整机重启;问答队列的界面行为由
|
||||
既有 App/ChatTimeline 测试覆盖。同一存活 Prompt 的待答补发由 Runtime 回归验证,
|
||||
不把它描述成 Agent 进程重启后的问题恢复。旧 Agent 和任意第三方 ACP 服务的范围见
|
||||
[Runtime 交互边界](./runtime-interactions.md)。
|
||||
|
||||
## 2026-09-13 并行提问顺序回答
|
||||
|
||||
- 修复同一前台请求的后续提问覆盖未回答问题:Renderer 按 ID 保存待答队列,逐次显示、
|
||||
回答和跳过,保留失败重试输入;运行中快照刷新保留队列,终态清理全部待答项。
|
||||
交互和归属限制见 [Runtime 交互边界](./runtime-interactions.md#运行与失败)。
|
||||
- 本机 SDK 使用已收到的 Task 子会话元数据传递可选 `childTaskId`;Task 卡片显示待答状态,
|
||||
展开后可定位并聚焦队首表单。没有已知 Task 关联的问题仍能回答。
|
||||
- 六份相关测试文件共 346 项通过:`App.test.tsx`、`ChatTimeline.test.tsx`、
|
||||
`conversation-activity.test.ts`、`opencode-runtime.test.ts`、
|
||||
`opencode-runtime-permissions.test.ts`、`opencode-runtime-lifecycle.test.ts`。
|
||||
覆盖并发到达、重复 ID、草稿保留、提交失败、队列推进、快照刷新及终态与回复竞态。
|
||||
- 真实本机 OpenCode 二进制配合 loopback 模型服务验证两次原生提问均在首次回答前到达,
|
||||
随后分别回传并完成请求;同时保留 Task 文件读取和 Ask 工具限制验证。该用例每轮
|
||||
6 次 loopback 模型请求,外部模型调用 0 次。完整桌面点击路径由 App 组件测试覆盖,
|
||||
本轮未手动操作 Electron 窗口。
|
||||
- 首次 `npm test` 达到工具 200 秒上限;后台重跑 `npm test -- --reporter=verbose` 完成,
|
||||
348 份测试文件通过、9 份跳过,4,069 项通过、66 项跳过,耗时 572.20 秒。
|
||||
随后补充已回答 ID 的去重必须先于任务状态更新,最终 18 项问答及活动相关回归通过。
|
||||
- 独立评审补充同一 React 批次首次两次收到相同 ID 的回归:修复前显示两个待答项。
|
||||
在消息函数式更新器内复核待答和已回答 ID,重复事件直接返回原消息,保留状态;外层
|
||||
去重仍阻止重复事件改写任务状态。修复后 19 项定向回归、typecheck 和完整 lint 通过。
|
||||
- 最终 App 全文件复跑为 217 项通过、1 项失败;失败项为并行开发中的外部知识绑定测试
|
||||
`adds a new external binding to the current selection without re-enabling an excluded library`,
|
||||
“添加知识库”按钮未启用,定向复跑仍失败。本次未修改该测试或知识绑定逻辑。
|
||||
`npm run typecheck` 与差异空白检查通过;早期完整 lint 通过,最终完整 lint 扫到并行
|
||||
工作新增的 `.kb-app-live` 产物而失败。保持产物原样,使用
|
||||
`npm run lint -- --ignore-pattern ".kb-app-live/**" --ignore-pattern ".kb-app-live*.cjs" --ignore-pattern ".kb-app-live*.ts"`
|
||||
复跑通过。
|
||||
- 远程 `AcpRemoteRuntime` 仅接入权限请求,尚无业务问答桥;本次未修改 Agent、ACP
|
||||
传输、共享子任务进度适配器或 SSE 订阅,不将本机问答验证算作远程覆盖。
|
||||
|
||||
## 2026-09-13 浏览器租用标签页关闭与显式恢复
|
||||
|
||||
- 更新 `tests/browser-tabs-electron-e2e.ts`,移除两处租用期间拒绝关闭的旧断言。
|
||||
|
||||
@@ -5,22 +5,34 @@
|
||||
| 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 的 ACP 权限处理与直接启动配置由
|
||||
[远程主机技术设计](../remote-host/technical-design.md)定义;本机 SDK 问答适配不代表远程
|
||||
ACP 已提供相同业务问答接口。
|
||||
托管 SSH OpenCode 的权限、原生问题事件与回复链路由
|
||||
[远程主机技术设计](../remote-host/technical-design.md)定义。远端业务问答需要包含此适配的
|
||||
Agent 和新启动的托管 Runtime;任意第三方 ACP 服务及旧 Agent 不因此获得通用问答接口。
|
||||
|
||||
## 运行与失败
|
||||
|
||||
- 结构化 yes/no 是普通选项,不从日志、自然语言或 Shell 输出猜测用户意图。
|
||||
- 前台问题停留在现有问答卡片,保留回答、提交失败提示与跳过入口。
|
||||
- 前台同一请求的待答问题按公开 `questionId` 去重,按到达顺序保存在消息的
|
||||
`pendingQuestions` 中。每次显示队首表单;有多个待答请求时显示数量。后续提问和重复
|
||||
事件不替换当前表单或清空输入,回答或跳过成功后只移除对应 ID,再显示下一张表单。
|
||||
提交失败保留队列、输入和重试入口,队列未清空时继续显示“等待你的回答”。
|
||||
- 本机与托管 SSH OpenCode 在提问到达前已收到原生 Task 的 `metadata.sessionId` 时,将精确匹配的
|
||||
子会话关联为可选 `childTaskId`。问答卡片显示该任务名称;对应 Task 卡片显示
|
||||
“等待你的回答”,展开后可点击“前往问答表单”滚动并聚焦当前队首表单,仍按顺序回答。
|
||||
没有已知关联的子孙会话问题照常排队,不猜测子任务归属,也不从工具名或进度文本构造表单。
|
||||
- 回答或跳过成功后,会话保留只读的“问题与回答”,显示原问题及对应的选项答案、
|
||||
自定义文本或“已跳过”。同一任务的多轮问答逐次保留,随本地会话保存,重新打开后仍可查看。
|
||||
提交失败时保留输入与重试入口,不生成已回答记录;取消未回答的问题不记为主动跳过。
|
||||
- 提交响应晚于任务结束时仍保存已提交的问答,但不覆盖完成或失败状态;晚于下一轮提问时
|
||||
不清除新的待答卡片。旧版会话未保存的问题与答案无法从“已提交”状态文案恢复。
|
||||
- 待答队列仅保存在当前桌面会话内存中,不写入会话快照。刷新仍在运行的消息时保留整个
|
||||
本地队列;完成、失败、取消事件或持久化终态快照清除整个队列。迟到的提交结果可以保存
|
||||
已回答记录,但不会恢复表单或覆盖终态。本机 Runtime 不恢复重启前未提交的问题;托管 SSH
|
||||
重新附加同一存活 Agent Prompt 时,由 Agent 当前待答列表补发问题,已回答的历史事件不补发。
|
||||
- 后台任务收到结构化提问时,通过现有 Main 路径明确失败并提示改为前台对话,不永久等待。
|
||||
- 请求结束或取消后清除对应待答映射;过期回答明确报错,不转交给后来的请求。
|
||||
- 任意终端程序的密码、OAuth 登录、许可证确认或 stdin 提示不自动回复 `yes`。这类程序应
|
||||
|
||||
Reference in New Issue
Block a user