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
Original file line number Diff line number Diff line change
Expand Up @@ -312,8 +312,11 @@ Command;明确缺失且未被标记失败的 Command 是稳定删除。产品
3. 内置、MCP 与外部同名 Tool 使用包含候选身份和内容版本的指纹;选择前保留已有本地实现,不按注册顺序静默覆盖。
候选集合由已识别定义而非成功加载结果计算;候选更新、暂不可用或删除后重新选择,已选外部实现失效时保持
unavailable,不静默回退同名本地实现。其他无关 Tool 和生态不受影响。
4. Desktop 提供完整审核卡、主动停用/重新审核和冲突候选;交互式 TUI(ChatMode)状态栏只做非阻塞提示,`/external-tools`
以编号映射稳定 key 完成启用、保持停用、冲突选择和刷新。普通聊天输入和无关会话不等待用户处理。
4. Desktop 提供完整审核卡、主动停用/重新审核和冲突候选;交互式 TUI(ChatMode)状态栏只做非阻塞提示,通用 `/tools`
入口在“外部 AI 应用”分组中以编号映射稳定 key 完成启用、保持停用、冲突选择和刷新;Agent 相关能力统一复用
`/agents`,在同一列表中以文字区分主 Agent、Subagent 与外部 AI 应用,不另建 `/subagents` 或 `external-*` 命令。
普通聊天输入和无关会话不等待用户处理;活动 turn 期间入口仍可查看和管理,但主 Agent 切换单独禁用并说明原因,
不改变正在执行的 session。
5. 每个 target 使用一个持久 Node worker,支持 load/invoke、`AbortSignal` 取消、500 ms 宽限后的 target 级硬终止、
30 秒请求期限和 dispose;产品配置的更短外层期限丢弃调用 future 时也会终止 worker,并在终止完成前保持 target
串行许可。输出限制为 1 MiB,协议帧限制为 8 MiB。稳定删除、抑制或撤销先撤下新调用;更新加载
Expand Down
2 changes: 1 addition & 1 deletion docs/architecture/product-architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -327,7 +327,7 @@ flowchart LR
| 产品形态 | 当前扩展能力 | 入口行为 |
|---|---|---|
| Desktop / product-full | 生产入口仍依赖 `bitfun-core/product-full` 作为兼容组装层;“外部 AI 应用”设置已消费 OpenCode Command、standalone Tool 和 Subagent 的统一来源快照、审批、冲突选择与诊断;Skills 场景和设置列表显示已发现 Skill 的生态来源与覆盖结果 | 仅本地执行域支持当前三条可执行纵向切片;Skill 仍使用独立 Registry,不据来源展示宣称已并入外部来源协调器。受管 package plugin 仍只有静态预览,不能据设置页接入宣称完整 OpenCode 插件运行时 |
| CLI | 入口仍以 `bitfun-core/product-full` 作为执行兼容 owner;交互式 TUI 已可执行受支持的 Prompt Command,并通过 `/external-tools`、`/external-agents` 消费与 Desktop 相同的审批、冲突和刷新状态;Skill 列表显示来源,模式配置按实际选择结果说明覆盖来源 | 已批准的 standalone Tool 进入现有 Tool Runtime;已批准的外部 Subagent 只支持 fresh single-run。CLI/TUI 不解析生态文件、不启动第二套 worker/Agent owner;非交互入口和 Remote 未接入时不得借本机 TUI 路径代执行。本地 Agent 与 Peer Host 路径选择 `DeliveryProfile::Cli` 并消费同一 Runtime Parts/SDK;主会话的恢复、转录、本地分支、用量报告生成与精确结算走 SDK,远程分支明确不支持。TUI 用量卡片持久化、快照及 Peer Host/ACP 持久化维护缺口由单一 Core 兼容门面转发;本切片不改变扩展执行边界 |
| CLI | 入口仍以 `bitfun-core/product-full` 作为执行兼容 owner;交互式 TUI 已可执行受支持的 Prompt Command,并在通用 `/tools` 与 `/agents` 入口按文字分组消费与 Desktop 相同的审批、冲突和刷新状态;`/agents` 同时承载主 Agent 切换、Subagent 管理和“外部 AI 应用”,不再注册 `/subagents` 或 `external-*` 平行命令。活动 turn 期间仍可查看和管理,只有主 Agent 切换被禁用。Skill 列表显示来源,模式配置按实际选择结果说明覆盖来源 | 已批准的 standalone Tool 进入现有 Tool Runtime;已批准的外部 Subagent 只支持 fresh single-run。CLI/TUI 不解析生态文件、不启动第二套 worker/Agent owner;非交互入口和 Remote 未接入时不得借本机 TUI 路径代执行。本地 Agent 与 Peer Host 路径选择 `DeliveryProfile::Cli` 并消费同一 Runtime Parts/SDK;主会话的恢复、转录、本地分支、用量报告生成与精确结算走 SDK,远程分支明确不支持。TUI 用量卡片持久化、快照及 Peer Host/ACP 持久化维护缺口由单一 Core 兼容门面转发;本切片不改变扩展执行边界 |
| HarmonyOS PC 原生 CLI/TUI | 未来平台目标,当前未实现 | 目标、问题和风险见平台规约;具体适配另立专题,HAP、手机 Remote App 与远端代执行均不替代 |
| HarmonyOS PC GUI | 完整 HarmonyOS PC 支持的另一目标形态,当前未实现 | 与 CLI/TUI 共享稳定能力和 Runtime 语义,但独立设计宿主、界面与发布验证;Web、Remote 或现有 Tauri Desktop 均不能替代 |
| HarmonyOS 手机 Remote App | `src/apps/mobile/harmonyos` 是 phone-only ArkTS 远程入口,不持有本地 Rust Agent Runtime | 保持当前能力并按移动端专题独立演进;本轮不提前设计移动 Runtime/TUI/GUI,也不能据此宣称 HarmonyOS PC 本地能力 |
Expand Down
52 changes: 44 additions & 8 deletions docs/plans/opencode-extension-compatibility-plan.md
Original file line number Diff line number Diff line change
Expand Up @@ -160,8 +160,9 @@ Codex、Claude Code 接入同类能力时新增同级 adapter,不修改 OpenCo
### 4.2 产品与决策语义

- Desktop 在“外部 AI 应用”中显示来源、文件、工作目录、工具名和直接文件/网络/环境/进程能力,并明确提示当前 worker
不是 OS 沙箱。交互式 TUI(ChatMode)使用同一快照:状态栏只做一次非阻塞提醒,`/external-tools` 提供静态预览以及
`enable`、`disable`、`choose`、`refresh` 操作;等待处理不阻塞输入或普通会话。
不是 OS 沙箱。交互式 TUI(ChatMode)使用同一快照:状态栏只做一次非阻塞提醒,通用 `/tools` 入口以“外部 AI 应用”
分组提供静态预览以及 `enable`、`disable`、`choose`、`refresh` 操作;等待处理不阻塞输入或普通会话,不再注册平行的
`external-*` 命令。
- 首次启用键由“来源限定 target + 执行域 + runtime + 能力集合”组成。纯内容更新且能力集合不变时复用已批准
结果;能力、runtime 或执行域扩大时重新确认。用户选择保持停用后,同一内容版本不再主动询问;来源内容更新后
才形成新 decision key。Desktop 仍允许用户主动重新审核,避免“一次拒绝后永久不可恢复”。
Expand Down Expand Up @@ -233,8 +234,8 @@ PR3 已为现有 Subagent owner 增加独立兼容端口,由 OpenCode adapter
旧绑定事实,若执行时配置已漂移则安全失败,不静默切换模型。
- fresh Task 在进入调度前固定不可变 runtime generation,并以 lease 保持到完成、取消、超时或提交失败;来源稳定
删除、显式停用或抑制会立即阻止新调用,短暂读取失败最多在有界窗口内沿用 exact last-valid。
- Desktop 的“外部 AI 应用”设置和 TUI `/external-agents` 使用同一 generation/revision 校验的非阻塞审批与冲突
操作;同一工作区的 Agent 决策串行提交,完成后刷新权威状态并说明具体对象。冲突候选在选择前原位展示模型、
- Desktop 的“外部 AI 应用”设置和 TUI `/agents` 中的“外部 AI 应用”选项使用同一 generation/revision 校验的
非阻塞审批与冲突操作;同一工作区的 Agent 决策串行提交,完成后刷新权威状态并说明具体对象。冲突候选在选择前原位展示模型、
工具、执行域、安全来源标签、兼容影响和恢复动作,一次点击才原子完成“选择并批准”。Agents 场景只显示已激活的
只读 `External · provider`、`Single-run` 投影,并可跳转到统一管理入口;外部 prompt、绝对用户路径和内部行为摘要
不进入 IPC 或普通列表摘要。
Expand All @@ -252,9 +253,12 @@ PR3 已为现有 Subagent owner 增加独立兼容端口,由 OpenCode adapter

本轮不新增扩展类型,只修复会误导用户或掩盖真实故障的两处问题,并校正文档事实:

- `NodeScriptToolRuntime` 在共享外部 Tool 运行时首次初始化时解析 Node.js 可执行文件,并在当前进程内持有结果。
本轮保持该生命周期,不增加运行时热替换;首次初始化时未找到 Node.js 后,Desktop 与 TUI 必须明确提示安装或修复后
重启 BitFun。刷新只重新发现来源,不能描述为会重新读取进程 `PATH`。运行时状态不得把尚未实际启动的可执行文件写成“已验证”。
- `NodeScriptToolRuntime` 在共享外部 Tool 运行时首次初始化时解析 Node.js 可执行文件,并在当前进程内持有成功结果;
只有缓存仍为空时,后续可用性检查或加载才重新执行当前进程可见范围内的 `which(node)`,不会替换已持有路径、worker
或活动调用。首次未找到 Node.js 后,Desktop 与 TUI 只提示安装或修复、刷新,以及可继续使用其他功能;当前宿主未记录
“安装后已经刷新但仍不可见”的独立证据,因此不主动建议重启,也不提供自动重启或“立即重启”动作,更不能中断活动 session。
刷新会重新发现来源并触发运行环境可用性检查,但不能承诺继承父进程后续收到的环境变量变化;运行时状态不得把
尚未实际启动的可执行文件写成“已验证”。
- Subagent owner 读取 BitFun 模型配置失败时必须 fail closed,并生成与“模型不存在”不同的通用诊断。GUI/TUI
提示用户先确认 BitFun 模型设置能够正常读取和保存,再刷新;日志只保留经过脱敏的失败阶段和错误类别。不得用 `AIConfig::default()`
把配置服务异常转换成候选模型不匹配,也不得把原始错误或绝对配置路径投影到普通快照。临时故障期间不得改写已持久化的
Expand Down Expand Up @@ -308,7 +312,39 @@ Command、Tool、Subagent、MCP 以及未来可执行扩展默认把 BitFun 原
“等待选择”及原因展示,不能从列表消失。该原则由各能力 owner 的独立冲突契约实现,不复用 Skill 的固定优先级,
也不在 PR4 修改 PR1—PR3 已有执行路径。

## 7. 暂停条件
## 7. PR5:同名扩展的选择可见性与统一入口

PR5 不新增扩展类型或运行能力,只补齐 Command、Tool、Subagent 已有冲突决策的管理闭环,并纠正 TUI 信息架构:

- 三类 owner 继续维护各自 DTO、冲突指纹和选择持久化,主体逻辑不按 OpenCode 等生态 ID 分支。候选列表由 owner 输出;
存在 BitFun 原生/本地候选时固定在首位,其余外部候选使用 adapter 已确定的稳定顺序。Skill Registry 的发现顺序和覆盖
关系完全不变,不能复用这里的交互式选择规则。
- Desktop 同时显示待选择和已处理冲突,待选择项排在前面。每个候选明确标识“当前使用”“已选择但当前不可用”“未使用”或“可选”;已选择、
被覆盖以及 Subagent 的“保持不可用”状态都不会因决策完成而消失,用户可直接改选。候选或行为版本变化使冲突指纹变化后,
旧选择失效并重新要求选择;没有变化时不重复打断。
- 交互式 TUI 不提供 `/external-tools`、`/external-agents` 等平行命令。工具使用通用 `/tools` 入口,并在内容中以
“外部 AI 应用”分组;Agent 相关能力统一进入 `/agents`,同一列表以文字区分主 Agent、Subagent 和外部 AI 应用,
删除历史 `/subagents` 命令。待选择与当前选择分区显示,只有待选择项进入
状态栏提醒计数;编号操作绑定产生当前视图的快照和稳定 key,改选仍由 owner 做 generation/revision 校验。
活动 turn 期间 `/agents` 仍可查看和管理 Subagent/外部来源,只禁用主 Agent 切换,并在对应行和状态栏解释原因。
- GUI/TUI 都保持原生异常语义:读取失败不假定变更成功,刷新失败保留已知可用内容并提示状态可能过期,存储异常使受影响
名称 fail closed,Remote 明确不支持且不回退本机。模型设置读取失败只要求修复设置并刷新,不把重启当作通用恢复动作。
- 本轮不新增重启编排。Node.js 是当前唯一可能受宿主进程环境影响的扩展依赖,但现有宿主没有可靠的刷新前后证据,
因此只建议安装或修复后刷新,并说明用户可以继续使用其他能力;扩展入口不得建议或触发重启,也不得打断执行中的 session。
未来若产品增加统一重启动作,必须由 session owner
提供活动任务保护与恢复契约,默认允许“稍后”,不能由扩展模块自行判断。
- Remote 工作区继续显示明确不支持;不加载本机配置代替远程配置。普通轮询仍为 5 秒,仅发现进行中使用 750 ms 有界轮询;
本轮不增加 watcher、全局扫描、遥测平台或磁盘缓存,不改变 system prompt。

PR5 的退出条件是:三类已处理冲突在 GUI 中可见可改选;Tool/Subagent 在 TUI 中使用通用能力入口;原生候选顺序、
待处理提醒去重、选择指纹失效、Remote 无回退和非强迫恢复文案均有聚焦测试。该切片不以统一入口为由构造通用 `ExtensionAsset`
或第二套选择状态。

TUI 命令命名属于产品契约。新增命令前必须先核对 BitFun 既有入口以及至少一个同类竞品的用户可见命令;能力已有对应
入口时优先在原列表中通过分组、状态或二级选项表达来源差异。只有对象、生命周期或权限边界确实不同,并且复用入口会产生
歧义时,才允许新增命令,并须在设计与测试中写明理由。adapter 名、provider ID 或“external”来源标签都不能单独构成新命令依据。

## 8. 暂停条件

出现以下情况时停止扩面并先修复架构:

Expand Down
6 changes: 4 additions & 2 deletions docs/plans/product-architecture-evolution-plan.md
Original file line number Diff line number Diff line change
Expand Up @@ -93,8 +93,10 @@ App 保持不变。
2. standalone Tool 只加载受支持的单文件 JavaScript 子集,经来源确认后接入现有 Tool Runtime;
3. Subagent 安全子集经模型、工具和同名冲突确认后接入现有 Subagent owner,仅支持 fresh single-run。

近期先修复已实现路径中的事实偏移和类型化失败:运行时依赖在当前进程首次检查时不可用时给出真实的重启建议;读取 BitFun
模型配置失败时阻止外部 Subagent 激活并显示独立原因,不能伪装成“请求模型不存在”。随后只有官方 import 型 tool、
已实现路径已经收敛运行时依赖与配置失败:Node.js 在当前进程首次检查时不可用时,只提示修复、刷新和可继续使用其他功能;
当前宿主没有可靠的刷新前后证据,因此不主动建议或触发重启。读取 BitFun 模型配置失败时阻止外部 Subagent 激活并显示独立原因,不能伪装成
“请求模型不存在”。同名冲突的待选择和当前选择保持可见,TUI 通过通用 `/tools` 与 `/agents` 入口按能力和来源分组;
`/agents` 同时容纳主 Agent、Subagent 和外部来源管理,不再创建 `/subagents` 或 `external-*` 平行命令。随后只有官方 import 型 tool、
package plugin、Hook 或 TUI contribution 的真实样例证明当前 owner/契约不足时,才增加对应的最小切片。原始
OpenTUI/Solid renderer、完整 package runtime 和 Remote 执行仍保持不支持。

Expand Down
Loading
Loading