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
17 changes: 10 additions & 7 deletions docs/architecture/agent-runtime-services-design.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,9 @@ Agent Runtime SDK 和“对外能力门面”不是同一发布包必须同时
复用后,才允许两者共享稳定 DTO 或版本边界。

SDK 公共接口以 `AGENT_RUNTIME_SDK_API_VERSION` 标记兼容边界。当前接口版本为 v1 preview:
小版本更新允许增加可选 builder hook、DTO 字段或注册表查询能力,但不得改变既有端口语义、
错误分类、session / turn 标识含义或默认 feature 依赖。任何需要调用方改写现有嵌入代码的变更,
必须提升接口版本并提供兼容迁移路径。
小版本更新允许增加可选 builder hook、有默认实现的端口方法或注册表查询能力,但不得向外部可用
Rust 结构体字面量(struct literal)构造的 DTO 直接增加字段,也不得改变既有端口语义、错误分类、session / turn 标识含义或
默认 feature 依赖。任何需要调用方改写现有嵌入代码的变更,必须提升接口版本并提供兼容迁移路径。

只要外部调用方仍必须导入 `bitfun-core`、启用 `product-full`、持有具体服务管理器、读取产品命令
注册表或依赖全局可变状态,SDK 发布边界就不成立。
Expand Down Expand Up @@ -709,8 +709,10 @@ pub struct HarnessExecutionContext {
Agent Runtime SDK 门面,不注册未实现的 `RuntimeServices` 能力,也不宣称完整 Desktop profile 可用。CLI 通过
一个调用级上下文把 Agent Runtime SDK、Harness、能力注册、调用级权限和 Agentic 事件广播交给 TUI、Exec、Session、Usage 与
交互模式下的 Peer Host。SDK 已承接会话创建/列举/删除/恢复、类型化转录读取、轮次提交/取消,以及 CLI/TUI
的工具确认、拒绝和用户问题回答;Peer Host 当前只消费同一 SDK 的工具确认与拒绝。SDK v1 尚未覆盖的固定 ID
会话创建、模型更新、分支、用量、快照和
的工具确认、拒绝和用户问题回答;固定 ID 创建使用独立的 `create_session_with_id` 方法,普通创建 DTO 保持 v1
字段集合。未实现该能力的提供方返回类型化不支持错误;实现成功时 Runtime 必须校验返回 ID 与请求完全一致,不能
替换为自动生成的 ID。`SessionSelector::Create` 仍保持自动生成。Peer Host 当前只消费同一 SDK 的工具确认与拒绝。
SDK v1 尚未覆盖的模型更新、分支、用量、快照和
持久化维护等操作仍由 `assembly/core` 的单一兼容门面转发。`doctor` 与 `health` 校验真实组装结果及必需注册完整性;
Core 的 Network、Git 和 MCP Catalog 当前仍含兼容 marker,因此该诊断不等于对这些外部服务做实时探活。

Expand Down Expand Up @@ -799,8 +801,9 @@ Core 的 Network、Git 和 MCP Catalog 当前仍含兼容 marker,因此该诊
扩张通用 transcript。CLI/TUI 的工具确认、拒绝和用户问题回答,以及 ACP 服务端 / Peer Host 的工具确认与拒绝,通过类型化
`AgentInteractionResponsePort` 回到 Core 的工具管线或用户输入 owner,不改变审批策略或交互所有权。
`CoreAgentRuntimeCompatibility` 仍承载未迁移的
固定 ID 会话创建、模型更新、持久化、分支、用量和快照等操作;不能据此把整个兼容门面一次性删除,也不能把这些
操作提前声明为跨宿主稳定接口。
模型更新、持久化、分支、用量和快照等操作;不能据此把整个兼容门面一次性删除,也不能把这些
操作提前声明为跨宿主稳定接口。旧固定 ID 创建方法仅作为标记废弃的源码迁移转发保留一个兼容周期,生产 CLI
调用已经迁移到 Runtime SDK;该转发不得重新成为新调用入口。

### 4.3 Product Capability 设计

Expand Down
6 changes: 4 additions & 2 deletions docs/architecture/cli-product-line-design.md
Original file line number Diff line number Diff line change
Expand Up @@ -93,8 +93,10 @@ BitFun CLI 应成为可独立安装和发布的 Agent 产品,而不是 Desktop
- BitFun 原生插件目录的发现、内容校验、来源确认,以及 OpenCode custom tool 静态名称预览。
- CLI 本地 Agent 入口以类型化 `RuntimeServices` 调用 `ProductAssembler`,选择 `DeliveryProfile::Cli`,
并把 `ProductRuntimeParts`、Agent Runtime SDK、事件源和调用级审批策略保存在一个 `CliRuntimeContext` 中。
- TUI、`exec`、会话、用量和交互模式下的 Peer Host 复用同一上下文。SDK 已承接会话创建/列举/删除、
轮次提交和取消;SDK v1 尚未覆盖的固定 ID、恢复视图、消息、分支、用量、快照和工具确认由一个 Core
- TUI、`exec`、会话、用量和交互模式下的 Peer Host 复用同一上下文。SDK 已承接会话创建(包括
`exec --session-id` 和缺失后端会话通过独立固定 ID 方法按原 ID 重建)/列举/删除、轮次提交和取消;普通创建
DTO 保持 v1 字段集合,固定 ID 冲突返回 `InvalidRequest`。SDK v1 尚未覆盖的恢复视图、
消息、分支、用量、快照和工具确认由一个 Core
兼容门面转发给原 owner。
- Agentic Event Queue 仍是唯一事件 owner;TUI、`exec` 与 Peer Host 使用独立广播订阅,不互相消费事件。
- 有界旧队列只承担兼容存储;达到容量时不得抑制广播。CLI 保持一个后台 drain,订阅方一旦报告 lag/closed,
Expand Down
9 changes: 5 additions & 4 deletions docs/plans/core-decomposition-plan.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
| 事实 | 当前状态 | 结论 |
|---|---|---|
| 产品能力组装 | `DeliveryProfile`、`ProductAssembler`、能力计划、服务可用性和测试已存在 | 这些是可测试的 assembly facts,不代表产品入口已接入 |
| CLI / Desktop / ACP | 三者仍启用 `bitfun-core/product-full`;CLI 已提交 `DeliveryProfile::Cli` 并消费 Runtime Parts/SDK,Desktop 与 ACP 尚未切换 | CLI 已建立产品组装边界但仍保留 Core owner;三个入口均未完成 owner 迁移 |
| CLI / Desktop / ACP | 三者仍按需启用 `bitfun-core/product-full`;CLI 与 ACP 已分别提交对应 `DeliveryProfile` 并消费 Runtime Parts/SDK,Desktop 主交互已消费由现有 owner 构造的窄口径 SDK 门面 | 三个入口均复用单一 Core owner;完整 Desktop profile 和剩余兼容操作仍需逐项迁移 |
| Server | 当前生产路由只形成 health/info/ping 基线 | 没有插件状态或独立产品组装闭环 |
| Server / Remote / Web / Mobile Web / SDK profile | 当前为空计划、未接入入口或仅有 preview 测试 | 不得据枚举值宣称产品能力已交付 |
| Agent Runtime SDK | 已有无 `bitfun-core` 依赖的 v1 preview 门面和 smoke test | 发布边界仍需真实嵌入方证明 |
Expand Down Expand Up @@ -59,7 +59,8 @@ assembly → apps。embedded 的 bind、静态 fallback 和任务生命周期移
CLI 是首个入口迁移对象,因为它已有独立产品诉求、显式设计和最小 CI 命令。

当前纵向切片已经完成:入口只提交一次 `DeliveryProfile::Cli`,通过现有 `ProductAssembler` 获得计划、服务可用性、
Harness 和禁用的插件 binding;TUI、Exec、Session 与 Usage 共用一个 `CliRuntimeContext`。会话创建/列举/
Harness 和禁用的插件 binding;TUI、Exec、Session 与 Usage 共用一个 `CliRuntimeContext`。会话创建(包括
`exec --session-id` 和缺失后端会话通过独立固定 ID 方法按原 ID 重建)/列举/
删除、轮次提交和取消走 Agent Runtime SDK;SDK v1 缺口集中在一个 Core 兼容门面。Agentic Event Queue 仍是唯一
owner,各入口只建立独立广播订阅,有界兼容队列满载不再阻断广播。TUI 与 Exec 审批均为调用级策略,不写全局
配置;CLI 本地路径不获取具体 PersistenceManager。交互、执行和管理入口分别控制 Peer Host/MCP 生命周期,管理查询不启动
Expand All @@ -71,8 +72,8 @@ Peer Host 的 Runtime 接入和跨 Relay/Desktop/Web 的协议切换保持独立

下一步按独立纵向切片推进:

1. 以真实调用方和行为等价测试补齐 SDK 端口,逐项缩小固定 ID 会话创建、模型更新、分支、用量、快照和持久化维护兼容面。
2. 迁移 ACP 的会话/权限/事件投影,但保留 ACP stdio 生命周期在接口入口
1. 以真实调用方和行为等价测试补齐 SDK 端口,逐项缩小模型更新、分支、用量、快照和持久化维护兼容面。
2. 继续迁移 ACP 尚未接入 SDK 的持久化历史、模型/模式和 MCP 操作;ACP stdio 与协议投影生命周期保留在接口入口
3. 继续拆分 TUI 副作用边界并补 package smoke,不以大规模重写替代现有回归保护。

当前 assembly 切换条件已经满足:CLI 生产入口消费真实组装结果,目标链路没有第二套状态,独立测试与三平台
Expand Down
5 changes: 3 additions & 2 deletions docs/plans/product-architecture-evolution-plan.md
Original file line number Diff line number Diff line change
Expand Up @@ -99,8 +99,9 @@ HarmonyOS 手机 Remote App 不在该平台执行范围内。

## 7. 工作流五:入口逐项迁移

- CLI:会话创建/列举/删除/恢复、类型化转录和轮次提交/取消已由真实入口消费 Runtime SDK;TUI 通过 SDK 处理
工具确认、拒绝和用户问题回答,Exec 与交互模式下的 Peer Host 处理工具确认与拒绝。固定 ID 会话创建、模型
- CLI:会话创建(包括 `exec --session-id` 和缺失后端会话通过独立固定 ID 方法按原 ID 重建)/列举/删除/恢复、类型化转录和轮次
提交/取消已由真实入口消费 Runtime SDK;
TUI 通过 SDK 处理工具确认、拒绝和用户问题回答,Exec 与交互模式下的 Peer Host 处理工具确认与拒绝。模型
更新、分支、用量、快照和持久化维护等操作在补齐端口与行为测试前继续由
现有单一兼容路径转发。
- ACP:CLI 行为稳定后单独迁移会话、权限和事件投影;ACP stdio 生命周期留在接口入口。
Expand Down
36 changes: 24 additions & 12 deletions src/apps/cli/src/agent/core_adapter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -257,14 +257,20 @@ impl CoreAgentAdapter {
}
}

self.compatibility
self.runtime
.create_session_with_id(
session_id.to_string(),
session_name,
effective_agent_type,
self.workspace_path_string(),
AgentSessionCreateRequest {
session_name,
agent_type: effective_agent_type,
workspace_path: Some(self.workspace_path_string()),
remote_connection_id: None,
remote_ssh_host: None,
metadata: serde_json::Map::new(),
},
)
.await?;
.await
.map_err(|error| anyhow::anyhow!(error.into_message()))?;

tracing::info!("Recreated backend session with existing id: {}", session_id);
Ok(())
Expand Down Expand Up @@ -316,18 +322,24 @@ impl CoreAgentAdapter {
let mut session_id_guard = self.session_id.lock().await;

let session = self
.compatibility
.runtime
.create_session_with_id(
session_id.clone(),
Self::build_default_session_name(),
agent_type.to_string(),
self.workspace_path_string(),
session_id,
AgentSessionCreateRequest {
session_name: Self::build_default_session_name(),
agent_type: agent_type.to_string(),
workspace_path: Some(self.workspace_path_string()),
remote_connection_id: None,
remote_ssh_host: None,
metadata: serde_json::Map::new(),
},
)
.await?;
.await
.map_err(|error| anyhow::anyhow!(error.into_message()))?;

let id = session.session_id.clone();
*session_id_guard = Some(id.clone());
tracing::info!("Created core session with fixed id: {}", id);
tracing::info!("Created runtime session with fixed id: {}", id);

Ok(id)
}
Expand Down
Loading
Loading