Files
agent_ops/03.迭代规划/02.已完成阶段/01.kernel/原始文档/01.kernel.md
T

8.8 KiB
Raw Blame History

LineUp App 迭代目标:Runtime Kernel 与应用编排

迭代编号: 01.kernel 状态: 目标设计,待实现 日期: 2026-08-04 前置基线: 00.base.md

1. 迭代目标

本迭代要把 LineUp 从“Runtime 加载一个 Chat 页面”推进为“Runtime 管理一个应用工作区”。 Runtime 不仅负责网络、消息和存储,还要负责应用实例、工具路由、前后台焦点和恢复; Interaction App 则负责用户与 Agent 的核心交互体验。

目标结构:

LineUp Runtime
│
├── Runtime Shell / Desktop
│   ├── 应用启动
│   ├── 应用切换
│   ├── 前后台与焦点
│   ├── 通知和安全恢复
│   └── Host 挂载协调
│
├── Interaction AppCore App
│   ├── IM Mode:文字、图片、短消息
│   ├── Audio Mode:实时语音
│   ├── Video Mode:实时视频
│   └── 标准交互原语:choice / confirm / input
│
└── Installed / Extension Apps
    ├── Whiteboard
    ├── Draw-and-Guess
    ├── Task Dashboard
    └── 其他可安装应用

当前代码中的 chat 继续作为兼容实现名称,产品概念上将其定位为:

Interaction App 的 IM 实现

后续是否将目录和作用域从 chat 正式迁移到 interaction,另行作为命名迁移任务处理, 不与本迭代的运行时编排重构混在一起。

2. 核心职责分工

2.1 LineUp Runtime

Runtime 是整个应用工作区的底层协调中心,拥有最终调度和安全决策权:

  • 管理 App Registry、App Instance 和焦点栈;
  • 校验 Agent Tool Call、Manifest、Inventory、参数和作用域;
  • 决定调用应直接执行、启动 App、切换前台、等待用户交互还是创建异步任务;
  • 维护 App 的启动、运行、后台、挂起、恢复、关闭和失败状态;
  • 管理 Conversation、Store、App Inbox、outbox、权限和审计;
  • 在扩展 App 结束或启动失败时恢复原来的前台实例。

2.2 Runtime Shell / Desktop

Runtime Shell 是一个拥有特殊权限的内置工作区。它在产品体验上类似桌面或 Launcher, 但最终的生命周期和安全决策仍由 Runtime Core 管理。

它负责:

  • 把 App 实例挂载到 Tauri 或 Web Host
  • 显示当前前台 App
  • 管理应用切换、恢复和关闭;
  • 提供全局连接状态、通知和安全恢复入口;
  • 向 App 传递受限的 Host 能力。

普通 App 不能伪造 Runtime Shell,也不能直接修改焦点栈。

2.3 Interaction App

Interaction App 是默认的人与 Agent 交互应用,但不是整个应用生态的调度器。

它负责:

  • 当前 Conversation 的主要交互体验;
  • IM、Audio、Video 等交互模式;
  • 选择框、确认框、输入框和进度卡片等标准交互原语;
  • 显示普通 Agent 消息、任务、Tool 结果和扩展 App 的结果;
  • 通过 SDK 提交用户动作。

它不负责:

  • 直接连接 AppServer 或 Agent
  • 决定其他 App 是否启动;
  • 管理其他 App 的前后台状态;
  • 直接执行未经 Runtime 授权的 Tool 或 Capability。

2.4 Extension App

扩展 App 与 Interaction App 是 Runtime 上的平级应用。画板、你画我猜和任务面板拥有 自己的页面、状态、Tool、Surface 和实例生命周期,但必须使用 Runtime SDK。

扩展 App 可以请求:

启动自己
创建 Surface
进入前台
进入后台
提交结果
请求关闭

最终是否允许、如何持久化、是否需要用户确认,由 Runtime 决定。

3. 应用实例与焦点模型

App Registry 管理“有哪些应用”,App Instance Manager 管理“哪些应用正在运行”。两者 不能混为一个状态。

type AppInstanceRecord = {
  instance_id: string;
  app_scope: string;
  conversation_id?: string;
  state:
    | "starting"
    | "foreground"
    | "background"
    | "suspended"
    | "stopping"
    | "stopped"
    | "failed";
  parent_instance_id?: string;
  started_at: string;
  stopped_at?: string;
  error?: string;
};

Runtime 需要保存当前会话的焦点栈:

focus_stack:
  interaction:audio-001
  draw-and-guess:game-001

foreground:
  draw-and-guess:game-001

background:
  interaction:audio-001

应用切换不会自动删除原实例。原实例可能进入 backgroundsuspended,在新应用关闭、 失败或用户返回时恢复。

4. Tool 调度模型

Tool 调度权在 Runtime,不在 Interaction App。

Agent Tool Call
  → Runtime 校验 Envelope / Inventory / Manifest / 参数 / Scope
  → Tool Router 判断处理方式
  → App Orchestrator 创建或切换 App Instance
  → Focus Manager 调整前后台
  → Interaction App / Mode / Extension App 承接
  → App 通过 SDK 返回 progress / result / error
  → Runtime 校验、持久化、审计并回传 Agent

Tool 的处理方式至少包括:

direct       直接由 Runtime 或受信 App 处理
interactive  交给 Interaction App 等待用户选择/确认/输入
launch       启动或唤醒一个扩展 App
foreground   要求目标 App 进入前台
operation    创建长时间运行的异步任务

Interact 可以请求 Runtime 启动扩展 App,但不能直接加载 Bundle、切换其他 App 或执行 系统能力。

5. 典型场景:语音切换到你画我猜

开始时:

Runtime Shell
  └── Interaction App
        └── Audio Modeforeground

用户说:“我们来玩一局你画我猜吧。” Agent 发来启动请求后:

Agent launch(draw-and-guess)
  → Runtime 检查 App 是否已安装、启用和兼容
  → 校验 Tool、Manifest、Inventory、参数和权限
  → 创建 draw-and-guess:game-001
  → 保存 interaction:audio-001 的焦点位置
  → Audio Mode 进入 background / suspended
  → Draw-and-Guess 进入 starting → foreground

游戏完成后:

Draw-and-Guess App
  → 通过 SDK 提交 game.result
  → Runtime 持久化并回传 Agent
  → 游戏实例关闭或挂起
  → Runtime 恢复焦点栈中的 Audio Mode
  → Interaction App 显示游戏结果

游戏和原来的语音交互使用同一个 conversation_id,但拥有不同的 instance_id。这样既 能把结果归还给同一个 Agent 会话,也能独立管理每个应用实例。

6. 标准交互原语与扩展 App 的边界

以下内容属于 Interaction App 的内建能力,不需要安装独立 App:

choice
confirm
input
progress
error

例如 Agent 请求选择框:

Agent tool.call(choice)
  → Runtime 校验并持久化 pending Tool Call
  → Interaction App 在 IM 中显示 Choice Card
  → 用户选择
  → Runtime 校验 call_id 并写入 outbox
  → Choice Card 变为 submitted / completed,不再可操作
  → IM 时间线显示“你选择了……”

选择框可以从界面上退出可操作状态,但交互记录不能从 Store 中删除。这样才能支持刷新 恢复、Agent 回声、幂等去重和审计。

画板、游戏和复杂任务面板则属于可安装扩展 App,拥有自己的 Tool 和 Surface。

7. 目标模块

runtime/app-management/
├── app-registry.ts
├── app-instance-manager.ts
├── app-focus-manager.ts
├── app-lifecycle-manager.ts
└── runtime-app-host.ts

runtime/coordination/
├── tool-router.ts
├── app-orchestrator.ts
└── interaction-orchestrator.ts

core-apps/interaction/(当前由 core-apps/chat 兼容实现)
├── interaction-runtime.ts
├── interaction-shell.ts
├── interaction-mode-registry.ts
├── modes/im/
├── modes/audio/
├── modes/video/
└── primitives/

installed-apps/
├── whiteboard/
├── draw-and-guess/
└── task-dashboard/

RuntimeAppHost 负责实际挂载和卸载;App Instance、Focus、Lifecycle 和 Tool Router 负责 状态和决策。这样不会把所有业务规则重新堆回 main.ts

8. 本迭代验收目标

1. Runtime 能从 App Registry 选择默认 Interaction App。
2. Runtime 能创建、前台化、后台化、挂起、恢复和关闭 App Instance。
3. Agent 启动扩展 App 时,当前前台 App 能安全进入后台。
4. 扩展 App 结束或失败后,Runtime 能恢复原来的焦点和交互模式。
5. Tool 调用必须经过 Runtime 的 Inventory、Manifest、参数、作用域和权限校验。
6. Interaction App 能处理 choice / confirm / input 等标准交互原语。
7. 扩展 App 只能通过 SDK 返回结果,不能直接访问 Agent、Host DOM 或系统特权。
8. 断线或重启后,App Instance、Tool Call、App Inbox、outbox 和焦点栈可以有界恢复。
9. 00.base 中已经通过的 21 个测试文件、94 个测试和生产构建不能退化。