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
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ Keep crate dependencies inside each layer to the smallest set needed.
| # | Layer | Path | Owns | Modules / entries | Layer doc |
|---|---|---|---|---|---|
| 1 | Interfaces and entrypoints | `src/apps/*`, `src/web-ui`, `src/mobile-web`, `BitFun-Installer`, `tests/e2e`, `src/crates/interfaces` | Product hosts, commands, UI entrypoints, protocol interfaces, and cross-surface tests | desktop, CLI, server, relay, Web UI, mobile web, installer, E2E, `acp` | nearest local `AGENTS.md`; [interfaces](src/crates/interfaces/AGENTS.md) |
| 2 | Product assembly | `src/crates/assembly` | Compatibility exports, product capability selection, product-full wiring, and adapter/service registration | `core`, `product-capabilities` | [AGENTS.md](src/crates/assembly/AGENTS.md) |
| 2 | Product assembly | `src/crates/assembly` | Compatibility exports, product capability selection, product-full wiring, adapter/service registration, and ecosystem-neutral source coordination | `core`, `external-sources`, `product-capabilities` | [AGENTS.md](src/crates/assembly/AGENTS.md) |
| 3 | Adapters | `src/crates/adapters` | AI/transport/WebDriver/OpenCode protocol adapters and external-provider translation | `ai-adapters`, `opencode-adapter`, `transport`, `webdriver` | [AGENTS.md](src/crates/adapters/AGENTS.md) |
| 4 | Services | `src/crates/services` | Reusable OS, filesystem, terminal, MCP, remote, git, watch, process, LSP plugin registry, session persistence primitives, MiniApp runtime IO, and network implementations | `services-core`, `services-integrations`, `relay-service`, `terminal` | [AGENTS.md](src/crates/services/AGENTS.md) |
| 5 | Execution primitives | `src/crates/execution` | Portable agent, harness, stream, DeepReview policy/report, plugin host boundary, typed-service, tool-contract, tool-group, and tool-execution building blocks | `agent-runtime`, `agent-stream`, `tool-contracts`, `harness`, `plugin-runtime-host`, `runtime-services`, `tool-provider-groups`, `tool-execution` | [AGENTS.md](src/crates/execution/AGENTS.md) |
Expand Down
1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ members = [
"src/apps/relay-server",
"src/crates/interfaces/acp",
"src/crates/assembly/core",
"src/crates/assembly/external-sources",
"src/crates/adapters/ai-adapters",
"src/crates/adapters/opencode-adapter",
"src/crates/adapters/webdriver",
Expand Down
73 changes: 55 additions & 18 deletions docs/architecture/extensions/external-ai-work-sources-design.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@
是第一条完整兼容来源;其他生态只在有稳定格式和真实消费方时接入。各生态的解析、加载顺序和运行语义仍由对应
适配器负责,本文不建立跨生态通用配置格式或脚本 SDK。

本文是产品与目标架构设计。当前 BitFun 只具备 BitFun 原生受管包的来源确认、启停记录和少量 OpenCode custom
tool 静态名称预览,尚未具备本文描述的统一来源视图、OpenCode 完整来源发现、配置实时兼容或插件执行能力。
本文同时记录当前可用纵向切片与目标架构。当前 BitFun 已具备通用外部来源目录和生命周期协调器,并通过
OpenCode Prompt Command 适配器接入本地用户全局/项目来源;Desktop 可查看、刷新、抑制和处理跨来源冲突,
CLI/TUI 可列出并执行 prompt-only Command。完整配置映射、Codex/Claude Code 适配器以及 Tool、Subagent、插件
执行仍属于后续阶段,不能因来源被识别就宣称已经可用。

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

Expand All @@ -28,11 +30,13 @@ tool 静态名称预览,尚未具备本文描述的统一来源视图、OpenCo
目标:

1. 自动发现当前执行域中的用户全局、项目和工作区外部来源,不阻塞项目打开、TUI 输入或无关会话。
2. 当前能够安全消费的低风险内容默认无感应用,并通过可撤销的非阻塞摘要说明来源和影响。
2. 当前能够安全消费且不存在同名冲突的低风险内容默认无感应用,并通过可撤销的非阻塞摘要说明来源和影响;
外部能力与产品本地能力、或独立外部 provider 之间发生同名冲突时,不得静默选择胜者。
3. 插件、Hook、Command、MCP 等可执行或有外部副作用的内容先发现,首次启用或能力扩大时再由用户确认。
4. 运行中感知来源修改、升级、删除和重新出现;成功更新安全切换,失败时优雅保留仍合规的上一有效代次。
5. 用户始终能解释“发现了什么、来自哪里、当前是否生效、为何降级、下一步能做什么”。
6. 产品体验可复用于未来生态,但解析、优先级、权限和运行语义不被抽象成最低公分母。
7. 冲突选择按“能力 + 逻辑名称 + 全部候选身份与内容版本”形成指纹;同一指纹只询问一次,任一候选更新后才重新询问。

非目标:

Expand Down Expand Up @@ -174,18 +178,22 @@ tool 静态名称预览,尚未具备本文描述的统一来源视图、OpenCo
```mermaid
flowchart LR
Sources["用户全局 / 项目 / 工作区外部来源"]
Adapter["生态发现与解析适配器"]
Adapters["同级生态适配器:OpenCode / Codex / Claude Code"]
Ports["能力专属 provider 契约"]
Catalog["外部来源目录与只读状态"]
Coordinator["生态来源协调器:监听、候选、差异与切换"]
Watch["文件观察与外部变化事实"]
Coordinator["共享生命周期协调器:候选、差异与原子替换"]
Policy["激活策略与各能力 owner"]
Config["Runtime Configuration Service"]
Host["Plugin Runtime Host"]
Owners["Skill / MCP / Tool / Config / TUI 等归属模块"]
Owners["Command / Skill / MCP / Tool / Config / Subagent 等归属模块"]
Surface["Desktop / CLI / Web / SDK"]

Sources --> Adapter
Adapter --> Catalog
Adapter --> Coordinator
Sources --> Adapters
Adapters --> Ports
Watch --> Coordinator
Coordinator --> Ports
Ports --> Catalog
Catalog --> Surface
Coordinator --> Policy
Policy --> Config
Expand All @@ -198,8 +206,12 @@ flowchart LR
| 部分 | 负责 | 不能承担 |
|---|---|---|
| 外部来源目录 | 聚合来源身份、作用域、资产清单、用户处理偏好和可读状态 | 解释所有生态格式、保存凭据、授予脚本权限或管理 worker。 |
| 生态发现与解析适配器 | 发现本生态标准来源,保留真实优先级、格式和诊断 | 写 BitFun 配置、执行第三方代码或创建跨生态最低公分母。 |
| 生态来源协调器 | 监听变化、生成候选、执行 import 前包络比较和 import 后贡献比较、请求准备并决定切换 | 直接提交配置、工具、权限或界面状态。 |
| 生态发现与解析适配器 | 发现本生态标准来源,保留真实优先级、格式、参数展开和诊断,并通过能力专属 provider 输出 | 写 BitFun 配置、依赖兄弟生态 adapter、执行其他生态语义或创建跨生态最低公分母。 |
| 能力专属 provider 契约 | 用来源限定身份交付 Command、Tool、Subagent 等类型化定义与调用/展开结果 | 携带任意 payload 的通用资产对象,或让一种能力的新增字段污染其他能力。 |
| 文件观察服务 | 提供可订阅、去抖的文件变化事实 | 解释生态路径、决定优先级、提交业务状态。 |
| 本地 JSON 存储服务 | 提供跨进程锁、锁内读改写和严格同卷原子替换等通用文件能力;替换失败时保留旧文件 | 定义外部来源偏好 schema、冲突策略或生态语义。 |
| 共享生命周期协调器 | 调用已注册 provider、生成不可变候选、按 provider 原子替换、保留隔离诊断,并请求能力 owner 切换 | 按生态 ID 分支业务行为、解析生态文件、直接提交配置、工具、权限或界面状态。 |
| 冲突解析 | 对独立 provider 或产品本地能力的同名候选建立版本敏感指纹;未选择时不激活,选择后只在指纹不变时复用 | 用 adapter 优先级静默覆盖另一生态或本地能力,或把选择写回外部文件。 |
| 激活策略与各能力 owner | 根据风险、用户选择、组织上限和执行域决定自动应用、等待确认或限制 | 修改生态加载顺序或把策略拒绝伪装成解析失败。 |
| Runtime Configuration Service | 应用兼容配置视图,执行显式导入、冲突预览、原子写入和撤销 | 读取凭据值或加载插件代码。 |
| Plugin Runtime Host / 执行服务 | 准备代次、监督进程、期限、取消、背压、健康和贡献生命周期 | 决定来源优先级、产品提示策略或最终业务状态。 |
Expand All @@ -209,6 +221,19 @@ flowchart LR
MCP、Tool、Permission 和 Plugin Runtime 边界;不得建立同时扫描目录、写配置、下载依赖、执行命令和注册贡献的
“大导入器”。

`ecosystem_id`、来源类型和执行域 ID 是开放且可校验的标识,不是 core 中持续扩大的枚举分支。只有 Product
Assembly 知道当前构建注册了哪些具体 adapter;产品入口、目录、协调器和能力 owner 不得导入 OpenCode、Codex
或 Claude Code 的私有类型。新增生态通过同级 adapter 与现有能力契约接入,不能修改另一个生态 adapter。

provider discovery 必须是可独立调度的 request/result,不在协调器锁内串行扫描。产品组装为每个 provider 设定期限,
超时后只沿用该 provider 的上一有效结果;健康兄弟 provider 继续更新。同步文件适配器超时后底层阻塞任务未必可取消,
因此同一 provider 同时最多保留一个 in-flight discovery,后续刷新复用它,完成后再提交结果,不能无限堆积线程。
未来网络 provider 还应实现协作式 deadline/cancel,但不改变目录、冲突或产品入口契约。

来源降级必须区分粒度:整个配置/目录状态未知时回退对应来源;能确定身份的单个 Command 读取或解析失败时只回退该
Command;明确缺失且未被标记失败的 Command 是稳定删除。产品调用在刷新后还要校验先前投影的候选 ID 与内容版本,
否则菜单展示旧版本、执行新版本会绕过冲突重新确认。

## 7. 状态与提示规则

以下表格是各宿主唯一的一级用户状态集合;Host 的 `ready/restarting/paused` 等内部阶段只能作为详情和原因映射,
Expand Down Expand Up @@ -237,13 +262,22 @@ MCP、Tool、Permission 和 Plugin Runtime 边界;不得建立同时扫描目

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

第一阶段只建立当前可证明的体验,不借设计提前宣称运行能力:

1. 发现 OpenCode 当前支持的用户全局和项目来源,建立来源限定身份和聚合清单。
2. 静态 custom tool 名称继续标为“已发现,静态预览,未执行”;不能因进入来源页变成“已加载”。
3. 对已经有真实归属模块且不产生外部副作用的 L1 内容,允许无感应用并提供非阻塞摘要;尚未接通的内容只展示。
4. 先完成来源变化、无效候选、删除、重新出现、去重提示和作用域测试,再接入真实 JS/TS 执行。
5. standalone tool 闭环必须补齐首次启用、能力摘要、候选代次和删除撤下验证,不能只证明 `execute` 成功。
第一阶段以 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。

验收至少覆盖:

Expand All @@ -259,6 +293,9 @@ MCP、Tool、Permission 和 Plugin Runtime 边界;不得建立同时扫描目
- 全局来源偏好与项目执行实例策略分开;跨项目只重新求值而不重复提示,跨执行域或新实例扩大执行包络时不会
错误继承确认。
- 持续来源撤销后不会被下一次 watcher 更新重新应用;当前项目与整个执行域的抑制范围可验证。
- 同名外部候选和产品本地能力在用户选择前均不会被静默覆盖;选择在候选内容版本和参与集合不变时不重复询问,
任一候选更新、删除或参与集合变化后重新进入待选择,即使变化后只剩一个实现也不静默切换。
- 冲突偏好按执行域与命令族只保留当前指纹,并以去重候选身份标记曾发生冲突;连续内容更新不会按历史指纹线性膨胀。
- 显式导入的字段级预览、冲突、撤销和凭据脱敏可验证。
- 当前只支持静态预览的资产不会被产品文案误报为已应用或可执行。

Expand Down
Loading
Loading