refactor(interact): separate runtime actions from ui projection

This commit is contained in:
2026-08-06 00:32:59 +08:00
parent c77a0cf69b
commit 823e71a162
8 changed files with 125 additions and 57 deletions
@@ -119,6 +119,25 @@ Task Dashboard 和 Whiteboard 的安全与运行时模型必须与未来的一
绑定受限 Surface 的装配代码;它不得把 MiniApp 业务 UI 挂到可信 Host DOM,也不得提供 Tauri、
Transport、Store、Agent、任意网络或其他 MiniApp 数据访问。
#### 2.4 Interact 的 SDK 适配边界
Interact 使用“通用 Runtime 操作 + 可信 UI 投影”的适配方式:
```text
Interact SDK
├── runtime:消息发送、标准交互提交/取消/过期、草稿和任务操作
└── ui:IM 视图、Agent 消息订阅、消息确认和子会话展示
```
`runtime` 是行为的统一入口,所有提交、取消、发送和生命周期动作仍由 Runtime 校验、持久化和回传。
`ui` 只是给可信 DOM Renderer 使用的 IM 投影,不是第二套 Transport、Store、Tool 或 Capability
协议。Interact 可以继续使用可信 DOM,但不能因为可信就直接访问 Transport、ConversationStore、原始
Agent Envelope、Host DOM 根节点或系统能力。
当前代码中的扁平方法(例如 `sdk.dispatch()``sdk.interactions.submit()`)只是兼容别名;新代码应使用
`sdk.runtime.*``sdk.ui.*`,以明确区分 Runtime 行为与 UI 展示。普通 bundled MiniApp 不获得这组
IM UI 投影,只使用通用 MiniApp SDK 和自己的受限 Surface。
## 3. MiniApp SDK v1 契约
SDK 是 Runtime 根据 Manifest、实例状态、scope 和 Policy 注入的受限对象。SDK 中的所有写操作都
@@ -20,7 +20,7 @@
| ✅ | P1 | A2 | `bundled` MiniApp 的业务逻辑仍在可信 Host JS 中运行,没有真正的受限执行边界 | `tauri/src/main.ts``isolated-surface-host.ts` | 已移除 Host 直接实例化;Task Dashboard/Whiteboard 业务逻辑改在 opaque sandbox iframe 内运行,只能通过 Runtime Bridge 请求能力。待浏览器复验。 |
| ✅ | P1 | A3 | SDK 暴露完整 workspaceMiniApp 可看到其他 App 实例和全局焦点栈 | `lineup-runtime.ts``miniapp-sdk.ts` | 已从 `LineUpMiniAppSDK` 删除 `workspace()`,不再把全局实例和焦点栈交给 bundled MiniApp。 |
| ✅ | P1 | A4 | 同一个 App 的多个 instance 之间 Inbox 订阅没有隔离 | `lineup-runtime.ts` | 已按 `app_scope + conversation_id + instance_id` 过滤实时订阅,并补充双实例回归测试。 |
| 🔴 | P1 | A5 | Interact 使用专用 `ChatRuntimeSDK` 旁路,没有和其他 MiniApp 共用 SDK v1 语义 | `tauri/src/core-apps/chat/chat-app-host.ts:67-75``main.ts:103-125` | 需要明确并实现统一 SDK 适配Interact 可有可信 DOM,但交互、Tool、生命周期仍必须通过统一 Runtime 契约;不能让专用接口成为另一套协议。 |
| | P1 | A5 | Interact 使用专用 `ChatRuntimeSDK` 旁路,没有和其他 MiniApp 共用 SDK v1 语义 | `tauri/src/runtime/app-management/app-sdk.ts``lineup-runtime.ts``main.ts` | 已明确为“通用 Runtime 操作 + 可信 UI 投影”Interact 保留可信 DOM 和 IM 展示,但行为统一走 `sdk.runtime.*`,展示走 `sdk.ui.*`;旧扁平方法仅作兼容别名。 |
| 🔴 | P1 | A6 | 标准交互的超时、dismiss、提交和答案 schema 没有由 Runtime 统一裁决 | `lineup-runtime.ts:507-558, 798-815``agent-interaction-service.ts:93-101` | 必须让 Interaction 与 Kernel Tool 共用一个终态迁移;超时/dismiss 要写唯一 Agent outbox;提交前按 `notice/choice/confirm/input` 校验答案,拒绝重复和竞态。 |
| 🔴 | P2 | A7 | 迭代文档中的 Tool 名称和代码 Manifest 不一致 | 主文档 §5.2/§5.3;`reference-miniapps.ts` | 统一契约、Manifest、fixture、Agent Inventory 和验收脚本中的名称。 |
| 🔴 | P2 | A8 | 当前 Task Dashboard/Whiteboard Surface 主要是 Host 硬编码的静态页面,无法证明真实业务 UI 在各自受限 Surface 内运行 | `main.ts:180-198``isolated-surface-host.ts` | 至少提供能代表业务边界的受限 Surface fixture,并验证 MiniApp 业务逻辑不能取得 Host DOM 或 Runtime 内部。 |
@@ -68,12 +68,12 @@ Store 或 Transport 注入 MiniApp。
`inbox.list()`、ACK 和 `inbox.subscribe()` 现在都按 `app_scope + conversation_id + instance_id` 过滤;新增回归
测试验证同一 App 的两个 instance 不会互收消息。
### A5Interact 的 SDK 语义没有统一
### A5Interact 的 SDK 语义没有统一(已修复)
Interact 使用 `ChatRuntimeSDK` 和 Host 注入的 `toolInteractions`,而 Task Dashboard/Whiteboard 使用
`LineUpMiniAppSDK`。可信 DOM 可以是 Interact 与 bundled 的不同实现方式,但交互归属、Tool 状态、Runtime
动作和错误/恢复语义不能因此分成两套没有共同契约的接口。当前代码无法用一套 SDK golden fixture 证明三类 App
遵守相同的 Runtime 边界
Interact 仍然可以使用可信 DOM,但它的 SDK 已明确拆成两层:`sdk.runtime.*` 提供 Runtime 行为入口,
`sdk.ui.*` 提供 IM 和子会话的可信展示投影。标准交互、消息发送、草稿、任务操作仍由 Runtime 完成;UI
投影没有 Transport、Store、Agent 原始 Envelope 或 Host 特权。旧的扁平 `ChatRuntimeSDK` 方法只保留为
兼容别名,避免把 Interact 的 UI 适配误解成另一套协议
### A6:标准交互有两套状态,可能互相打架
@@ -86,16 +86,16 @@ Interact 使用 `ChatRuntimeSDK` 和 Host 注入的 `toolInteractions`,而 Tas
## 3. 验收结论
当前结论为(完成本轮 P1-1 后):
当前结论为(完成本轮 P1-1P1-3 后):
```text
功能回归:通过
基础构建与自动化测试:通过
真实登录和消息发送:通过
App 架构边界:部分通过(A1/A2 已实现,A2 待浏览器复验;A5/A6 仍不通过)
MiniApp 隔离与 SDK 规范:A1A4 已通过,Interact/状态机仍不通过
App 架构边界:部分通过(A1/A2/A5 已实现,A2 待浏览器复验;A6 仍不通过)
MiniApp 隔离与 SDK 规范:A1A5 已通过,标准交互状态机仍不通过
标准交互终态契约:不通过
迭代整体验收:不通过,继续处理 A5/A6A2 需在最终浏览器复验中确认
迭代整体验收:不通过,继续处理 A6;A2 需在最终浏览器复验中确认
```
本次验收没有修改实现代码。下一步应先处理 P1,再重新运行自动化测试和真实浏览器验收;P2/P3 不能被静默