Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ aes = "0.8"
hex = "0.4"
chardetng = "0.1.17"
encoding_rs = "0.8.35"
url = "2"

# HTTP client
reqwest = { version = "0.13.4", default-features = false, features = ["native-tls", "rustls", "json", "stream", "multipart", "query", "form"] }
Expand Down
40 changes: 33 additions & 7 deletions docs/architecture/extensions/external-ai-work-sources-design.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,10 @@ SDK 或 Server 输出到外部宿主,以及内部 Provider Slot、状态、事

本文同时记录当前可用纵向切片与目标架构。当前 BitFun 已具备通用外部来源目录和生命周期协调器,并通过
OpenCode Prompt Command 适配器接入本地用户全局/项目来源;Desktop 可查看、刷新、抑制和处理跨来源冲突,
CLI/TUI 可列出并执行 prompt-only Command。完整配置映射、Codex/Claude Code 适配器以及 Tool、Subagent、插件
执行仍属于后续阶段,不能因来源被识别就宣称已经可用。
CLI/TUI 可列出并执行 prompt-only Command。第二条纵向切片已让受支持的单文件 OpenCode `.js` standalone Tool 经静态
预览、来源/能力确认和同名冲突选择后进入现有 Tool Runtime;Desktop 与 CLI/TUI 使用同一决策状态。完整
TypeScript/Bun、包依赖、package plugin、Codex/Claude Code 适配器和 Subagent 仍属于后续阶段,不能因来源被识别
就宣称已经可用。

## 1. 产品判断与竞品启示

Expand Down Expand Up @@ -70,7 +72,8 @@ CLI/TUI 可列出并执行 prompt-only Command。完整配置映射、Codex/Clau
“已发现”或“需确认”。
- 可执行内容因首次启用、更新策略要求询问或 import 前摘要扩大而等待确认时,不得 import module、启动进程、
读取凭据或主动联网;提示可以稍后处理。
- 当前阶段只能静态识别的插件或工具只进入“已发现,静态预览”清单,不进入模型可调用集合。
- 当前阶段范围外的 TypeScript、依赖型 Tool 和 package plugin 只进入“已发现,静态预览”清单,不进入模型可调用
集合;受支持 JS Tool 也必须在明确启用前保持同一状态。
- 全局来源首次在当前执行域识别时提示一次;项目来源按工作区提示。相同全局来源不能在每个项目重复轰炸用户。
- “撤销已应用内容”对持续兼容来源表示在用户选择的当前项目或当前执行域内抑制对应来源/资产并重新计算下一
来源或产品默认;后续 watcher 更新不得绕过该偏好重新应用。该操作不写回外部文件,也不同于显式导入的字段级撤销。
Expand Down Expand Up @@ -265,22 +268,45 @@ Command;明确缺失且未被标记失败的 Command 是稳定删除。产品

## 8. 分阶段落地与验收

第一阶段以 Prompt Command 做第一个可用纵向切片,不借设计提前宣称其他运行能力
第一阶段以 Prompt Command 做第一个可用纵向切片:

1. 建立共享来源目录、生命周期协调器、开放生态 ID 和 Prompt Command 专属契约;用第二个 fake adapter 证明
provider 更新、失败和删除彼此隔离。
2. 发现 OpenCode 当前支持的用户全局和项目 Command 来源,建立来源限定身份、生态内覆盖关系和聚合清单;
OpenCode 自身定义的项目/用户优先级仍由 adapter 解释,跨 provider 或与 BitFun 本地 Command 的同名冲突进入待选择状态。
3. 支持 `$ARGUMENTS` 与位置参数的 prompt-only 命令在用户显式选择或输入时展开并提交;发现本身不向会话发送内容。
4. 含 `!shell`、`@file`、`{env:...}`、`{file:...}`、`agent`、`model`、`variant` 或 `subtask` 等未接通语义的命令标记为“部分受限”,不做
静默忽略后的部分执行。静态 custom tool 名称仍只能标为“已发现,静态预览,未执行”。
静默忽略后的部分执行。
5. Desktop 提供统一来源状态、刷新、按执行域抑制/恢复和冲突候选选择;首次 provider 扫描完成前显示中性检查状态,
不把暂时空目录误报为最终空结果;已经选择且指纹未变化的冲突退出待处理区。CLI/TUI 使用同一目录列出和执行
Command;跨 provider 候选以来源限定别名供 CLI 用户直接选择,同次选择也解析本地同名冲突。发现或确认不阻塞
普通聊天输入;发现未完成时未限定 slash 别名不猜测冲突结果,显式 `/builtin:<name>` 仍可立即执行。执行域全局偏好
使用独立偏好文件、跨进程锁和严格原子替换,并在查询、刷新和执行前重新读取,使并行 Desktop/CLI 进程不会继续使用
另一进程已停用的来源或丢失并发选择。Desktop IPC 仅返回设置页所需摘要,不携带 Prompt Command 模板正文。
6. 先完成来源变化、无效候选、稳定删除、重新出现、偏好保持和去重提示,再在后续 PR 接入真实 JS/TS Tool。
6. 完成来源变化、无效候选、稳定删除、重新出现、偏好保持和去重提示,为后续能力 owner 提供稳定基线。

第二阶段以 OpenCode standalone Tool 验证可执行内容的完整产品边界:

1. Tool provider 契约与脚本运行时端口独立于 Prompt Command;OpenCode adapter 负责全局/项目 `{tool,tools}`
来源与格式,Core 激活策略负责审批/冲突,脚本服务负责 Node worker,现有 Tool Runtime 负责最终模型暴露和调用。
2. 发现只读取静态摘要,不 import;首次启用显示来源文件、工作目录与直接文件/网络/环境/进程能力。确认按 target、
执行域、runtime 和能力集合记忆,内容更新不扩大能力时不重复询问;用户拒绝在内容更新前不再主动提示,但可在
设置页主动重新审核。
3. 内置、MCP 与外部同名 Tool 使用包含候选身份和内容版本的指纹;选择前保留已有本地实现,不按注册顺序静默覆盖。
候选集合由已识别定义而非成功加载结果计算;候选更新、暂不可用或删除后重新选择,已选外部实现失效时保持
unavailable,不静默回退同名本地实现。其他无关 Tool 和生态不受影响。
4. Desktop 提供完整审核卡、主动停用/重新审核和冲突候选;CLI/TUI 状态栏只做非阻塞提示,`/external-tools`
以编号映射稳定 key 完成启用、保持停用、冲突选择和刷新。普通聊天输入和无关会话不等待用户处理。
5. 每个 target 使用一个持久 Node worker,支持 load/invoke、`AbortSignal` 取消、500 ms 宽限后的 target 级硬终止、
30 秒请求期限和 dispose;产品配置的更短外层期限丢弃调用 future 时也会终止 worker,并在终止完成前保持 target
串行许可。输出限制为 1 MiB,协议帧限制为 8 MiB。稳定删除、抑制或撤销先撤下新调用;更新加载
失败在没有精确物化旧源码的 PR2 中 fail-closed,不冒充沿用上一版本。worker 崩溃会立即撤下该 target 的全部
路由并显示失败;空闲退出由 runtime health 事件主动上报,事件携带独立加载代次,旧 worker 的迟到事件不能撤下
同版本的新实例。调用不自动重放;下一次模型 Tool Catalog 暴露前只尝试恢复一次,之后依赖显式刷新或来源变化,
不形成循环重启。某个全局、项目、legacy 或显式目录不可读时只降级该目录,其他健康目录继续发现和运行。
6. `.ts`、依赖型 `.js`、`metadata`/`ask`、附件、package plugin、Hook、TUI plugin renderer 和 Remote worker 明确
延后;本机 Node 进程不是 OS 沙箱,VM realm 与隐藏响应令牌只保护协议稳健性。脚本继承当前用户的文件、网络、
环境与进程权限;本阶段没有 Job Object/process group,脚本直接启动的后代进程和系统资源风险必须持续显示。

验收至少覆盖:

Expand All @@ -300,7 +326,7 @@ Command;明确缺失且未被标记失败的 Command 是稳定删除。产品
任一候选更新、删除或参与集合变化后重新进入待选择,即使变化后只剩一个实现也不静默切换。
- 冲突偏好按执行域与命令族只保留当前指纹,并以去重候选身份标记曾发生冲突;连续内容更新不会按历史指纹线性膨胀。
- 显式导入的字段级预览、冲突、撤销和凭据脱敏可验证。
- 当前只支持静态预览的资产不会被产品文案误报为已应用或可执行。
- 当前只支持静态预览的资产不会被产品文案误报为已应用或可执行;支持子集与完整 OpenCode 兼容不会混写

具体 OpenCode 能力范围和近期顺序分别见
[`opencode-extension-compatibility.md`](opencode-extension-compatibility.md)和
Expand Down
Loading
Loading