Skip to content

feat(extensions): add OpenCode standalone tool compatibility - #1592

Merged
limityan merged 1 commit into
GCWing:mainfrom
limityan:yanzhn/opencode-tool-compatibility
Jul 17, 2026
Merged

feat(extensions): add OpenCode standalone tool compatibility#1592
limityan merged 1 commit into
GCWing:mainfrom
limityan:yanzhn/opencode-tool-compatibility

Conversation

@limityan

@limityan limityan commented Jul 17, 2026

Copy link
Copy Markdown
Collaborator

概要

  • 增加 provider-neutral 的 Tool 来源契约与脚本运行时端口;OpenCode adapter 独立维护全局/项目、单数/复数 tool 目录和单文件 JavaScript 子集语义。
  • 受支持 Tool 先静态预览、再显式启用;内置、MCP 与外部同名时由用户选择,选择按候选身份和内容版本记忆,候选未变化不重复询问。
  • 复用现有 Tool Runtime 负责模型暴露、schema、权限与结果;Core 只负责审批、冲突和工作区路由,services 只负责持久 Node worker。
  • Desktop 与 CLI/TUI 共用同一来源/决策状态;TUI 提供非阻塞提醒、/external-tools 审核与 diagnostics,不阻塞普通聊天。
  • 更新、删除、停用、worker 丢失和 Remote 均 fail-closed;已选外部实现失效时不静默回退同名本地实现。
  • 同步扩展架构文档,并将会扩大范围的能力明确保留到后续 PR。

当前兼容范围

支持无外部依赖的单文件 .js standalone Tool 子集,包括基础 schema、默认值、字符串结果、真实 workspace/session 上下文、合作式取消与硬终止。

以下内容仅识别或明确不支持:TypeScript 执行、依赖 import/require、package plugin、Hook、TUI plugin renderer、完整 metadata/ask、Subagent 和 Remote worker。Node worker 继承当前用户的文件、网络、环境与进程权限;VM realm 不是 OS 沙箱,直接创建的后代进程仍有残余风险。

产品与可靠性

  • 首次启用展示来源文件、执行域、工作目录、runtime 和能力包络;能力/runtime/执行域扩大时重新确认,普通内容更新不重复打扰。
  • 冲突指纹变化后重新选择;选择前保留已有实现,选择外部后其失效则显示 unavailable。
  • TUI 的编号操作绑定用户实际看过的快照和 stable key,后台刷新或排序变化不会把编号悄然指向另一目标;后端继续拒绝陈旧 decision。
  • CLI 的结果文案以返回快照中的真实 activation 为准,能够区分加载失败、运行时不可用、冲突、目标变化和成功启用。
  • Desktop 的通用错误不再保证无法确认的禁用结果;用户文案本地化,原始错误折叠在技术详情中。
  • 外部模块禁用明确标为 module 级动作;审批/冲突卡片消失后保留 aria-live 状态并转移焦点;窄终端仍优先显示 Esc 关闭提示。
  • 每 target 持久 worker 支持 load/invoke/cancel/dispose、30 秒期限、500 ms 取消宽限、1 MiB 输出和 8 MiB 协议帧上限。
  • worker 退出立即撤路由,旧加载代次不能误伤新实例;调用不自动重放,仅允许一次有界恢复。
  • 瞬时目录错误只降级对应目录并提供 diagnostics;明确删除或无法验证的更新不伪装成沿用旧版本。

架构边界

  • contracts/product-domains:来源、审批、冲突与产品只读状态
  • contracts/runtime-ports:provider-neutral 脚本运行端口
  • adapters/opencode-adapter:OpenCode 路径、模块格式、静态解析与兼容诊断
  • assembly/external-sources:provider 隔离与原子来源代次
  • assembly/core:审批、冲突、工作区路由与现有 Tool Runtime 装配
  • services/services-integrations:Node worker、协议、取消、期限与物理进程事实
  • Desktop / CLI / TUI:只消费 Core 快照和 typed actions

审批的 snapshot 校验、偏好持久化和 product rebuild 现由同一 refresh_gate 串行化,避免 watcher 在确认期间把 v1 替换为 v2 后仍应用陈旧 decision。锁序保持 refresh_gate -> product_rebuild_gate,OpenCode 特有语义未进入主体运行时契约。

验证

  • cargo +nightly check --workspace
  • cargo +nightly test -p bitfun-core tool_approval_waits_for_refresh_and_rejects_a_changed_decision --lib(1 passed)
  • cargo +nightly test -p bitfun-cli external_tool_(6 passed)
  • cargo +nightly test -p bitfun-cli info_popup_(2 passed)
  • pnpm --dir src/web-ui run test:run src/infrastructure/config/components/ExternalSourcesConfig.test.tsx(9 passed)
  • pnpm run type-check:web
  • pnpm run i18n:audit(0 warnings)
  • node scripts/check-core-boundaries.mjs
  • pnpm run check:repo-hygiene
  • git diff --check

已有 MCP 依赖的 4 条 deprecated warning,以及最新 main 中 CLI daemon 的 2 条 dead-code warning,与本 PR 无关。

独立对抗性审查

最终快照基于最新 main 完成独立资深架构与产品/TUI 两路复审,冻结差异一致,结论均为 P0=0、P1=0、P2=0。复审覆盖 owner/dependency 边界、审批竞态与锁序、跨进程偏好、Remote fail-closed、TUI 编号稳定性、真实 activation 反馈、Desktop module 级动作、错误文案、焦点恢复和窄终端提示。

未捕获真实 Desktop IPC 或真实 TUI PTY,因此不把代码级复审表述为完整视觉/对比度/真实终端渲染验收。Bun、完整 TypeScript、依赖/package plugin、Hook、Subagent、通用 SDK、Remote worker、进程树回收和完整 OS sandbox 均保持为后续工作,不扩入本 PR。

体验基线

CI 状态

当前头提交 a1f17df6f 的 5 项门禁全部通过:Frontend Build、CLI Tests,以及 Ubuntu、macOS、Windows 三平台 Rust Build Check(均包含 core/desktop Rust tests)。现有 Frontend annotations 位于未触及的既有文件,不属于本 PR。

@limityan
limityan force-pushed the yanzhn/opencode-tool-compatibility branch from ca2d3cc to 7caa1e1 Compare July 17, 2026 05:36
Add provider-neutral discovery, approval, conflict, and script-runtime boundaries with Desktop and CLI/TUI product flows. Keep unsupported TypeScript, package plugins, hooks, and remote execution fail-closed.
@limityan
limityan force-pushed the yanzhn/opencode-tool-compatibility branch from 7caa1e1 to a1f17df Compare July 17, 2026 07:03
@limityan
limityan merged commit 2ac8397 into GCWing:main Jul 17, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant