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
4 changes: 4 additions & 0 deletions docs/architecture/agent-runtime-services-design.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,10 @@ Product API 不应被定义为单一 Rust 后端 API。目标 API 分为三类
OpenCode adapter、ACP bridge 和未来 plugin runtime 必须把外部 API 映射为上述三类 API,再由 Product Assembly
统一注册。它们不能直接写 Agent Kernel 权威状态,也不能绕过 permission、sandbox、audit 或 UI host 的渲染边界。

Agentic frontend event projection 属于稳定 event contract:Agent Kernel 产生 provider-neutral `AgenticEvent`,
契约层给出 event name、event type 和 payload;Tauri、WebSocket、OpenCode adapter 或 UI extension host
只选择 delivery/profile,不重新定义字段映射。

Extension registration contract 属于稳定扩展契约,不属于 Product Assembly 的具体实现。Extension Host 和
OpenCode adapter 只产出可注册的 descriptor、provider 和 contribution;Product Assembly 消费这些 contract 并完成
产品形态内的注册,避免 Extension 层反向依赖 assembly crate。
Expand Down
3 changes: 3 additions & 0 deletions docs/architecture/core-decomposition.md
Original file line number Diff line number Diff line change
Expand Up @@ -366,6 +366,8 @@ provider-neutral contract。
应该放这里:

- 可序列化 DTO、identity、event、port trait、artifact ref、typed error。
- 跨框架 frontend event projection:把内核事件映射为稳定 event name / event type / payload,不包含 Tauri、
React、WebSocket delivery 或 OpenCode adapter 实现。
- capability/effect、permission、sandbox、execution domain、audit facts。
- UI extension descriptor contract 和跨产品领域的纯规则。

Expand Down Expand Up @@ -397,6 +399,7 @@ Platform adapter 只实现 ports 并调用边界外资源。
| `ExtensionHost` / OpenCode adapter | Extension | extension host / adapter | Product Assembly | Product Assembly、UI host、Execution provider registry | 产出 descriptor/provider,不写权威状态 |
| `RuntimeServicesBuilder` / platform providers | Cross-platform Adapter | services/adapters/app provider | Product Assembly | Kernel/Execution/Harness 通过 port handle | 实现边界外 I/O,不读取 product profile |
| `SecurityDecisionPort` / `CapabilityEffectPolicy` | Stable Contracts and Security Control Plane | 注入式策略 owner | Product Assembly | Kernel、Execution、Extension、UI projection | 决策可审计,模型/插件不能直接授权 |
| `AgenticFrontendEvent` / frontend event projection | Stable Contracts and Security Control Plane | `bitfun-events` | 无运行时注册 | Tauri/WebSocket/UI extension/OpenCode adapter | 只定义 event name/type/payload;delivery 由 adapter 执行 |

典型调用链:

Expand Down
2 changes: 1 addition & 1 deletion docs/plans/core-decomposition-completed.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
- `services-core` 已承接 session layout、metadata store CRUD / index rebuild、metadata pagination、metadata construction / mutation、lineage / branch shaping、JSON file store、filesystem primitives、managed runtime command resolution / PATH merge、LSP plugin registry / extension matching / command-target mapping、diagnostic redaction、session usage/token usage 基础服务。
- `services-core` 已承接 workspace-runtime legacy session-store merge、metadata 冲突选择、index rebuild 和 legacy path copy/move fallback;core workspace-runtime 只保留路径计算、runtime layout ensure 和错误兼容映射。
- `runtime-services` 已承接 typed runtime service assembly、capability availability、provider registry、capability validation、无副作用 capability marker ports 和 backend event delivery;core backend event system 只保留兼容 re-export。
- `bitfun-events` 已承接 backend event DTO、agentic event DTO 和 platform-neutral `EventEmitter` trait。
- `bitfun-events` 已承接 backend event DTO、agentic event DTO、framework-neutral Agentic frontend event projection 和 platform-neutral `EventEmitter` trait;Tauri/WebSocket transport 只负责 delivery
- `services-integrations` 已承接 remote-connect primitives、wire command routing / response assembly、IM bot provider-neutral config / persistence / file auto-push / locale / menu / state / command parsing、workspace search concrete owner、remote SSH/SFTP/PTY owner、Remote SSH disabled runtime surface、Remote SSH workspace/session identity helper、remote workspace-search disabled surface、DeepResearch report IO / display-map sidecar、MiniApp host dispatch / storage / worker / import IO。
- `tool-contracts` 已承接 provider-neutral tool DTO、manifest/catalog/admission/result presentation、Computer Use DTO/input parser/screenshot payload、confirmation facts、truncation recovery presentation、runtime restriction policy 和 provider-entry materialization;core 只保留 Computer Use 旧 public path re-export / compatibility shim 与产品执行入口。
- `tool-execution` 已承接 local / remote IO helper、Bash shell helper、batching plan、retry policy、state counting、tool state event payload shaping / result redaction、cancellation-state/token-store policy、background exec output capture、ExecCommand provider-neutral 呈现 / control facts / completion shape、prompt-safe tool context facts / custom-data materialization、Computer Use loop detection / screenshot hash / verification / retry policy,以及 File tool 的 provider-neutral 结果展示、写入 mode/status/line-count 规则、Edit guardrail 分类和 Delete success 文本;core 只保留 ToolResult 包装、权限、checkpoint、runtime handles、process manager / host adapter 调用、read-state adapter、remote shell/FS 调用和旧工具入口。
Expand Down
1 change: 1 addition & 0 deletions docs/plans/core-decomposition-plan.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
- Root boundary scripts 已覆盖核心 owner 防回流、six-layer path 解析、facade-only 文件、custom agent owner / custom subagent wrapper 保护和重点 feature gate。
- Agent Runtime session workspace resolution、Cron / SessionControl / SessionMessage / SessionHistory 的 target session/workspace owner routing、`/goal` tool management runtime-port routing、session/config/context/lifecycle fact owner 收口,以及 `services-integrations` workspace search preview/result conversion 已纳入已完成摘要;后续计划只保留仍需迁移的 feature/kernel、security/control-plane、execution、extension 和 cross-platform adapter 主体工作。
- MiniApp built-in seed orchestration 已进入 `product-domains`,core 只保留 concrete host adapter;session state manager 已进入 `agent-runtime`,core 只保留兼容 re-export。
- `bitfun-events` 已承接 Agentic frontend event projection;Tauri/WebSocket transport 不再内联事件字段映射,后续 OpenCode/UI extension adapter 应复用同一稳定投影。

## 3. 大块 PR 节奏

Expand Down
20 changes: 20 additions & 0 deletions scripts/core-boundaries/rules/source/forbidden-rules.mjs
Original file line number Diff line number Diff line change
@@ -1,6 +1,26 @@
// Boundary rules for source ownership, facades, and required owner content.

export const forbiddenContentRules = [
{
path: 'src/crates/adapters/transport/src/adapters/tauri.rs',
patterns: [
{
regex: /\bAgenticEvent::[A-Z]/,
message:
'Tauri transport adapter must not match agentic event variants directly; use bitfun-events frontend projection',
},
],
},
{
path: 'src/crates/adapters/transport/src/adapters/websocket.rs',
patterns: [
{
regex: /\bAgenticEvent::[A-Z]/,
message:
'WebSocket transport adapter must not match agentic event variants directly; use bitfun-events frontend projection',
},
],
},
{
path: 'src/crates/execution/agent-runtime/tests/sdk_smoke.rs',
patterns: [
Expand Down
65 changes: 65 additions & 0 deletions scripts/core-boundaries/rules/source/required-rules.mjs
Original file line number Diff line number Diff line change
@@ -1,6 +1,71 @@
// Boundary rules for source ownership, facades, and required owner content.

export const requiredContentRules = [
{
path: 'src/crates/contracts/events/src/frontend_projection.rs',
reason:
'events contract must own framework-neutral agentic frontend event projection for Tauri, WebSocket, and future extension hosts',
patterns: [
{
regex: /\bpub struct AgenticFrontendEvent\b/,
message: 'missing framework-neutral frontend event projection DTO',
},
{
regex: /\bpub fn project_agentic_frontend_event\b/,
message: 'missing shared agentic frontend event projection function',
},
{
regex: /\bpub fn legacy_flat_message\b/,
message: 'missing legacy flat payload projection helper',
},
{
regex: /\bdeep_review_queue_projection_preserves_camel_case_contract\b/,
message: 'missing camelCase queue projection regression test',
},
{
regex: /\blegacy_flat_message_keeps_projection_type_authoritative\b/,
message: 'missing WebSocket type precedence regression test',
},
{
regex: /\blegacy_flat_dialog_turn_started_preserves_existing_shape\b/,
message: 'missing WebSocket dialog-turn-started shape regression test',
},
],
},
{
path: 'src/crates/adapters/transport/src/adapters/tauri.rs',
reason:
'Tauri transport adapter must only deliver projected events and must not own agentic event field mapping',
patterns: [
{
regex: /\bproject_agentic_frontend_event\b/,
message: 'missing shared frontend projection usage in Tauri transport',
},
{
regex: /\.emit\(projected\.event_name\.as_str\(\), projected\.payload\)/,
message: 'Tauri transport must emit projected event name and payload',
},
],
},
{
path: 'src/crates/adapters/transport/src/adapters/websocket.rs',
reason:
'WebSocket transport adapter must consume shared event projection while preserving the legacy WebSocket event allowlist',
patterns: [
{
regex: /\bproject_agentic_frontend_event\b/,
message: 'missing shared frontend projection usage in WebSocket transport',
},
{
regex: /\bis_legacy_websocket_agentic_event_type\b/,
message: 'missing legacy WebSocket agentic event allowlist',
},
{
regex: /\bwebsocket_keeps_legacy_agentic_event_allowlist\b/,
message: 'missing WebSocket legacy event allowlist regression',
},
],
},
{
path: 'src/crates/contracts/core-types/src/lsp.rs',
reason:
Expand Down
23 changes: 23 additions & 0 deletions scripts/core-boundaries/self-test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -1027,6 +1027,29 @@ export function runManifestParserSelfTest({
'backend_event_names_remain_stable',
],
},
{
path: 'src/crates/contracts/events/src/frontend_projection.rs',
contracts: [
'AgenticFrontendEvent',
'project_agentic_frontend_event',
'legacy_flat_message',
'deep_review_queue_projection_preserves_camel_case_contract',
'legacy_flat_message_keeps_projection_type_authoritative',
'legacy_flat_dialog_turn_started_preserves_existing_shape',
],
},
{
path: 'src/crates/adapters/transport/src/adapters/tauri.rs',
contracts: ['project_agentic_frontend_event', 'projected.event_name.as_str()'],
},
{
path: 'src/crates/adapters/transport/src/adapters/websocket.rs',
contracts: [
'project_agentic_frontend_event',
'is_legacy_websocket_agentic_event_type',
'websocket_keeps_legacy_agentic_event_allowlist',
],
},
{
path: 'src/crates/execution/runtime-services/tests/runtime_services_contracts.rs',
contracts: [
Expand Down
Loading
Loading