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
26 changes: 16 additions & 10 deletions docs/plans/core-decomposition-plan.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,24 +35,30 @@

### PR-C:Execution 层深迁移

目标:
状态:本阶段收口 Execution 层主体迁移,剩余工作转入 PR-D / PR-E。

完成口径:

- 继续迁移 built-in tools、skills、MCP tool bridge、sandbox runner、local/remote tool runtime、harness descriptor / route plan 的实际 owner。
- 删除或显著简化 core 中对应 tool/harness 主体路径,保留兼容 facade。
- 区分 MCP tool bridge 与 MCP transport:tool bridge 属于 Execution,transport/client concrete 属于 Cross-platform Adapter。
- built-in tool provider plan、skills 纯策略、tool runtime assembly、tool execution helper、harness descriptor / route plan 已由 Execution 层 owner 承接,core 保留产品组装和兼容 facade。
- MCP dynamic tool name、tool info、descriptor、input validation、tool-use / rejected / result presentation、`ToolResult` shape 进入 `bitfun-agent-tools` 的 MCP tool bridge contract。
- `services-integrations` 只负责 MCP wire / transport / protocol result content 投影,并通过旧导出路径保持兼容。
- `bitfun-core` 的 MCP tool adapter 只保留 `Tool` trait 适配、MCP connection 调用和旧注册路径,不再持有 bridge 文案、validation 或 dynamic metadata 组装。
- 当前代码未发现独立 sandbox runner 主体;sandbox 相关内容主要是 capability / permission / execution-domain 事实和局部 guard,后续如出现 concrete runner,需要按 Execution contract 加 Cross-platform Adapter provider 的方式单独评审。

保护:

- prompt-visible manifest、`GetToolSpec`、permission gate、tool result/artifact、collapsed/expanded exposure、MCP/ACP catalog 和 remote/local path containment 等价。
- `cargo test -p bitfun-agent-tools`、`cargo test -p tool-runtime`、harness / MCP focused testsproduct shape tests 必跑
- PR-C 提交前至少覆盖 `cargo test -p bitfun-agent-tools`、`cargo test -p tool-runtime`、harness / MCP focused testsproduct shape tests、`bitfun-core --features product-full` 和 core boundary checks

### PR-D:Extension Host 与 OpenCode / ACP 适配收口

目标:
状态:本阶段收口 ACP external-agent tool bridge;Extension/OpenCode/plugin、UI extension、effect / permission mapping 和多形态 SDK 验证转入后续阶段。

完成口径:

- 定义并落地最小 Extension Host 边界:plugin capability declaration、UI contribution descriptor、tool/hook/workflow provider mapping
- 明确 OpenCode adapter 将外部 plugin API 映射到 BitFun Rust Kernel API、UI Extension Contract 和 Capability/Effect API
- ACP 保持协议入口和 external agent/tool capability owner,不下沉到 Agent Kernel
- ACP external-agent tool name、schema、validation、presentation 和 ToolResult shape 由 `bitfun-agent-tools` 承接
- `bitfun-acp` 继续持有 ACP protocol、client lifecycle、remote probing、permission bridge 和配置加载;现有 `AcpClientInfo` API shape 不变
- OpenCode/plugin concrete host、UI contribution、hook/workflow provider mapping 和 capability/effect policy 仍需在实际消费路径明确后单独接入,避免提前扩大稳定 API

保护:

Expand Down Expand Up @@ -96,7 +102,7 @@
| Remote Connect / IM bot support | `cargo test -p bitfun-services-integrations --features remote-connect --lib remote_connect::bot::`,`cargo test -p bitfun-core --features product-full remote_connect::bot::command_router` |
| Tool / MCP / terminal / sandbox | `cargo test -p bitfun-agent-tools`,`cargo test -p tool-runtime`,terminal / exec-command / MCP focused tests |
| Harness / Product Domains | `cargo test -p bitfun-harness`,`cargo test -p bitfun-product-domains`,DeepReview / MiniApp focused tests |
| Extension / OpenCode / ACP | extension host focused tests,UI contribution descriptor tests,ACP permission / external tool focused tests |
| Extension / OpenCode / ACP | extension host focused tests,ACP permission / external tool focused tests |
| Product shape / SDK | SDK fake-provider smoke,Desktop / CLI / Web / ACP capability matrix checks,cargo tree / metadata 对比 |
| 大范围 owner 迁移 | `cargo check --workspace`,必要时补 `cargo test --workspace` |

Expand Down
24 changes: 22 additions & 2 deletions scripts/core-boundaries/rules/source/forbidden-rules.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -2250,7 +2250,7 @@ export const forbiddenContentRules = [
patterns: [
{
regex: /\bfn behavior_hints\b/,
message: 'core MCP tool adapter must not own dynamic tool behavior hint rendering; use the integrations helper',
message: 'core MCP tool adapter must not own dynamic tool behavior hint rendering; use the execution MCP tool bridge contract',
},
{
regex: /\bfn truncate_for_assistant\b/,
Expand All @@ -2262,7 +2262,27 @@ export const forbiddenContentRules = [
},
{
regex: /Tool '\{\}' from MCP server/,
message: 'core MCP tool adapter must not own dynamic descriptor text; use the integrations helper',
message: 'core MCP tool adapter must not own dynamic descriptor text; use the execution MCP tool bridge contract',
},
{
regex: /\bDynamicMcpToolInfo\b/,
message: 'core MCP tool adapter must not own dynamic MCP metadata assembly; use the execution MCP tool bridge contract',
},
{
regex: /Input must be an object/,
message: 'core MCP tool adapter must not own bridge input validation text; use the execution MCP tool bridge contract',
},
{
regex: /Using MCP tool/,
message: 'core MCP tool adapter must not own bridge tool-use presentation; use the execution MCP tool bridge contract',
},
{
regex: /was rejected by user/,
message: 'core MCP tool adapter must not own bridge rejection presentation; use the execution MCP tool bridge contract',
},
{
regex: /completed\. Result:/,
message: 'core MCP tool adapter must not own bridge result presentation; use the execution MCP tool bridge contract',
},
],
},
Expand Down
94 changes: 94 additions & 0 deletions scripts/core-boundaries/rules/source/required-rules.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -4379,6 +4379,100 @@ export const requiredContentRules = [
},
],
},
{
path: 'src/crates/execution/tool-contracts/src/mcp_tool_bridge.rs',
reason:
'agent-tools owns MCP tool bridge naming, descriptor, validation, presentation, and ToolResult shape contracts without depending on MCP transport concrete',
patterns: [
{
regex: /\bpub fn build_mcp_tool_bridge_name\b/,
message: 'missing MCP tool bridge prompt-visible name builder',
},
{
regex: /\bpub struct McpToolBridgeDefinition\b/,
message: 'missing MCP tool bridge descriptor contract',
},
{
regex: /\bpub struct McpToolBridgeBehaviorHints\b/,
message: 'missing MCP tool bridge behavior hint contract',
},
{
regex: /\bpub fn build_mcp_tool_bridge_definition\b/,
message: 'missing MCP tool bridge descriptor builder',
},
{
regex: /\bpub fn mcp_tool_bridge_dynamic_tool_info\b/,
message: 'missing MCP dynamic tool info bridge',
},
{
regex: /\bpub fn validate_mcp_tool_bridge_input\b/,
message: 'missing MCP tool bridge input validation contract',
},
{
regex: /\bpub fn render_mcp_tool_bridge_use_message\b/,
message: 'missing MCP tool bridge use-message renderer',
},
{
regex: /\bpub fn render_mcp_tool_bridge_rejected_message\b/,
message: 'missing MCP tool bridge rejection-message renderer',
},
{
regex: /\bpub fn render_mcp_tool_bridge_result_message\b/,
message: 'missing MCP tool bridge result-message renderer',
},
{
regex: /\bpub fn build_mcp_tool_bridge_result\b/,
message: 'missing MCP tool bridge ToolResult builder',
},
],
},
{
path: 'src/crates/execution/tool-contracts/src/acp_tool_bridge.rs',
reason:
'agent-tools owns ACP external-agent tool bridge naming, schema, validation, presentation, and ToolResult contracts without depending on ACP protocol concrete',
patterns: [
{
regex: /\bpub fn build_acp_external_agent_tool_name\b/,
message: 'missing ACP external-agent prompt-visible name builder',
},
{
regex: /\bpub struct AcpExternalAgentToolDefinition\b/,
message: 'missing ACP external-agent tool definition contract',
},
{
regex: /\bpub fn build_acp_external_agent_tool_definition\b/,
message: 'missing ACP external-agent tool definition builder',
},
{
regex: /\bpub fn acp_external_agent_tool_input_schema\b/,
message: 'missing ACP external-agent input schema contract',
},
{
regex: /\bpub fn validate_acp_external_agent_tool_input\b/,
message: 'missing ACP external-agent input validation contract',
},
{
regex: /\bpub fn render_acp_external_agent_use_message\b/,
message: 'missing ACP external-agent use-message renderer',
},
{
regex: /\bpub fn render_acp_external_agent_rejected_message\b/,
message: 'missing ACP external-agent rejection-message renderer',
},
{
regex: /\bpub fn render_acp_external_agent_result_message\b/,
message: 'missing ACP external-agent result-message renderer',
},
{
regex: /\bpub fn render_acp_external_agent_result_for_assistant\b/,
message: 'missing ACP external-agent assistant-result renderer',
},
{
regex: /\bpub fn build_acp_external_agent_tool_result\b/,
message: 'missing ACP external-agent ToolResult builder',
},
],
},
{
path: 'src/crates/execution/tool-contracts/src/file_guidance.rs',
reason: 'agent-tools owns provider-neutral file tool guidance marker contracts',
Expand Down
35 changes: 35 additions & 0 deletions scripts/core-boundaries/self-test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -2307,6 +2307,36 @@ export function runManifestParserSelfTest({
'call_results',
],
},
{
path: 'src/crates/execution/tool-contracts/src/mcp_tool_bridge.rs',
contracts: [
'build_mcp_tool_bridge_name',
'McpToolBridgeDefinition',
'McpToolBridgeBehaviorHints',
'build_mcp_tool_bridge_definition',
'mcp_tool_bridge_dynamic_tool_info',
'validate_mcp_tool_bridge_input',
'render_mcp_tool_bridge_use_message',
'render_mcp_tool_bridge_rejected_message',
'render_mcp_tool_bridge_result_message',
'build_mcp_tool_bridge_result',
],
},
{
path: 'src/crates/execution/tool-contracts/src/acp_tool_bridge.rs',
contracts: [
'build_acp_external_agent_tool_name',
'AcpExternalAgentToolDefinition',
'build_acp_external_agent_tool_definition',
'acp_external_agent_tool_input_schema',
'validate_acp_external_agent_tool_input',
'render_acp_external_agent_use_message',
'render_acp_external_agent_rejected_message',
'render_acp_external_agent_result_message',
'render_acp_external_agent_result_for_assistant',
'build_acp_external_agent_tool_result',
],
},
{
path: 'src/crates/execution/tool-provider-groups/src/lib.rs',
contracts: [
Expand Down Expand Up @@ -3398,6 +3428,11 @@ export function runManifestParserSelfTest({
'truncate_for_assistant',
'MCPToolResultContent',
'Tool',
'DynamicMcpToolInfo',
'Input must be an object',
'Using MCP tool',
'was rejected by user',
'completed\\. Result:',
];
const mcpToolAdapterRuleText = mcpToolAdapterRule.patterns
.map((pattern) => pattern.regex.source)
Expand Down
Loading
Loading