# Agent Runtime Control Plane V2

本文档记录后续 Agent Platform / runtime 管控面的设计方向。它是当前讨论中的 **v2 文档**，但这里的 v2 指 Host capability layer / runtime control plane，不是 `AgentRunner Protocol v2`，也不属于当前 AgentRunner Protocol v1 插件化主线的交付范围。

> **future design note**。协议数据结构见 [PROTOCOL_V1.md](./PROTOCOL_V1.md)，实现进度见 [PROGRESS.md](./PROGRESS.md)。本文只讲 v2 管控面方向，不重抄 schema。
> 与当前 runner 外化分支、EBA 和 Agent Platform 的边界见 [EXTENSION_SCOPE_MATRIX.md](./EXTENSION_SCOPE_MATRIX.md)。

## 1. 结论

当前主线应继续收口 AgentRunner v1：

```text
message/event -> binding -> runner.run(ctx) -> result stream
```

Runtime Control Plane v2 在 Host 侧新增 runtime control plane：

```text
event -> task -> runtime selection -> daemon claim -> execute -> progress/audit/result
```

在 Runtime Control Plane v2 之上，可以构建独立的 agent 管控面插件。插件负责 UI、策略和编排体验；runtime、task、heartbeat、audit 的事实源必须属于 LangBot Host，而不是插件私有 storage。

## 2. 不影响 v1 主线

v2 不应改变 AgentRunner v1 的基本契约：

- 现有 `local-agent`、Dify、n8n、Coze 等 runner 仍可按 v1 直接执行。
- 当前 Claude Code / Codex MVP runner 可以继续作为本机 subprocess 开发路径。
- Host v1 已有的 event-first context、resource authorization、history / event / artifact / state / storage pull APIs 继续保留。
- Pipeline 仍只是当前入口 adapter，不参与 v2 runtime 管控面的设计中心。

v2 只是在 Host 上新增一层可选能力。需要管控面的 runner 或管理插件可以声明使用它；不需要的 runner 不受影响。

## 3. 当前 Host 能力与缺口

当前 Host 已经具备 v2 的基础设施底座：

- `AgentEventEnvelope` / `AgentBinding`
- run-scoped resource authorization
- EventLog / Transcript / ArtifactStore / PersistentStateStore
- History / Event / Artifact / State / Storage pull APIs
- AgentRunner result stream 和受控错误回流
- Agent/runner config 与 host-owned state

这些能力足够支持一次 `runner.run(ctx)` 内的安全执行，但不足以承担完整 runtime 管控面。

v2 还需要 Host 新增：

- runtime registry：runtime id、所属 workspace、所在机器、provider 能力、状态。
- capability discovery：`claude` / `codex` / 其它 CLI 是否存在、版本、登录状态、执行隔离能力。
- heartbeat / liveness：runtime 在线、忙闲、最后心跳、可用 slot。
- task queue：enqueue、claim、start、progress、complete、fail、cancel。
- workspace mapping：LangBot workspace / project 如何映射到 runtime 上的真实目录、仓库或挂载。
- secret / env projection：按授权向 runtime 投影 token、代理、MCP 配置、技能和环境变量。
- runtime audit：stdout、stderr、事件流、产物、失败原因、执行耗时、使用量。
- control API / UI：选择 runtime、测试 runtime、查看状态、下线、取消任务、重试任务。

## 4. 角色边界

### 4.1 LangBot Host

Host 是事实源和控制面内核：

- 保存 runtime / task / heartbeat / audit 状态。
- 做权限校验、资源裁剪、workspace 绑定和审计。
- 决定任务是否可被某 runtime claim。
- 将执行结果统一回写到 event / transcript / artifact / state。

Host 不应内置具体 agent CLI 的复杂业务逻辑，也不应把某个官方 runner 的特殊行为提升为通用协议。

### 4.2 Agent 管控面插件

管理插件是 v2 control plane 的产品化管理层：

- 展示 runtime、agent、task、进度、失败、审计。
- 提供策略配置，例如默认 runtime、provider 偏好、并发限制、重试策略。
- 触发 runtime 测试、任务取消、任务重试、手动分配。

管理插件不应把 runtime/task 的事实源放进自己的 plugin storage。它应该调用 Host v2 API。

### 4.3 Runtime daemon / worker

Runtime daemon 负责真实执行：

- 在所在机器上检测 CLI 和版本。
- 管理工作目录、仓库、挂载、临时文件和进程。
- 从 Host claim 任务，执行后上报 progress / complete / fail。
- 将 stdout / stderr / artifacts / session id 回流 Host。

Claude Code、Codex、OpenCode、Gemini CLI 等 provider 适配逻辑应主要落在 daemon / worker 或 provider adapter 中。

## 5. 部署形态

### 5.1 uv / local embedded

用户用 `uv` 或源码直接启动 LangBot 时，LangBot 进程所在机器就是 runtime host。

这种模式下可以直接检测用户主机上的 `claude`、`codex` 等 CLI，也可以直接 subprocess 执行。它适合个人开发和本地 smoke，但不应作为团队级管控面的唯一形态。

### 5.2 Docker embedded

用户用 Docker 启动 LangBot 时，runtime host 是容器，不是宿主机。

因此：

- 只能检测容器内的 `claude`、`codex`。
- 只能使用容器内的 HOME、PATH、凭据和挂载目录。
- 如果镜像未安装 CLI，或未挂载认证文件 / workspace，CLI runner 会不可用。

Docker embedded 可以作为高级部署选项，但需要用户显式安装 CLI、挂载工作区和凭据。Host 不应假设 Docker 容器能自动访问宿主机 CLI。

### 5.3 Sidecar daemon

推荐的 v2 形态是 sidecar daemon：

```text
LangBot Host (Docker or server)
  <-> Runtime daemon on user host / worker host
        -> claude / codex / other CLI
```

这种模式下，LangBot 可以跑在 Docker 内，runtime daemon 跑在宿主机或独立 worker 机器上。daemon 负责检测本机 CLI、持有本机凭据和工作区访问能力。

### 5.4 Remote runtime

团队场景可以使用远端 runtime：

- 开发机、构建机、云主机或专用 worker。
- 多个 workspace 可绑定不同 runtime。
- Host 只通过 registry / task queue / heartbeat / audit 进行管理。

### 5.5 API-only agent

Dify、n8n、Coze、DashScope 等 API 型 runner 不依赖本地 CLI。它们可以继续按 v1 直接执行，也可以在未来按需要接入 v2 task/audit。

## 6. 与 Claude Code / Codex MVP runner 的关系

当前 Claude Code / Codex runner 是 v1 runner：

```text
runner.run(ctx) -> subprocess("claude" / "codex")
```

它们适合验证 Host context 投影、state resume、result stream 和基础 CLI 调用，但有明确限制：

- 命令只在 LangBot runtime host 上执行。
- Docker 环境只能看到容器内 CLI。
- 没有 runtime registry、heartbeat、task queue、cancel、workspace lifecycle。
- 不提供发布级执行隔离、secret projection、团队级 audit。

v2 不需要删除这些 runner。它们可以继续作为 dev / MVP 路径存在。未来若接入管控面，可以增加 runtime-managed 执行模式：

```text
runner binding -> Host task -> runtime daemon -> provider CLI -> Host result
```

## 7. 最小 v2 API 草案

以下仅记录能力边界，不代表最终 API 命名。

Runtime：

- `runtime.register`
- `runtime.heartbeat`
- `runtime.list`
- `runtime.get`
- `runtime.disable`
- `runtime.capabilities.report`
- `runtime.capabilities.probe`

Task：

- `task.enqueue`
- `task.claim`
- `task.start`
- `task.progress`
- `task.complete`
- `task.fail`
- `task.cancel`
- `task.retry`

Workspace：

- `runtime.workspace.bind`
- `runtime.workspace.unbind`
- `runtime.workspace.resolve`

Audit / artifacts：

- `task.log.append`
- `task.artifact.create`
- `task.events.page`

这些 API 应由 Host 提供，并受 workspace、runtime、binding、actor 和 plugin identity 约束。

## 8. 管控面插件可以构建的能力

基于 v2 Host 能力，可以实现一个类似 Multica 的 agent 管控面插件。这里的“类似 Multica”只指产品形态：一个集中页面管理 agent profile、runtime 连接、任务队列、执行进度、失败诊断和审计视图；不是引入新的 runner 协议或把 runtime/task 事实源交给插件。

- runtime 列表、在线状态、CLI 能力、版本、认证状态。
- agent profile 与 runtime/provider 绑定。
- 任务看板、任务详情、进度流、失败原因、重试和取消。
- workspace 到 runtime 目录 / 仓库的映射管理。
- provider capability 测试，例如 Claude Code / Codex 是否可执行。
- 审计视图：输入、输出、工具、artifact、stdout/stderr、session id。
- 策略配置：并发、队列、默认 runtime、fallback runtime、权限模式。

该插件应该是 Host v2 的消费者，而不是 Host v2 的替代品。

## 9. 设计原则

- v1 先稳定，v2 可选叠加。
- Host 保存事实源，插件提供管理体验。
- Runtime daemon 执行具体 CLI 和本机资源访问。
- Docker 不假设拥有宿主机 CLI；需要 sidecar 或显式挂载。
- Pipeline 不进入 v2 控制面中心。
- 直接 subprocess runner 可保留，但只作为 local/dev/MVP 路径。
- 发布级能力必须经过 Host 权限、审计和资源边界。

## 10. 待定问题

- runtime daemon 与 Host 的认证模型：workspace token、device token、还是 scoped PAT。
- task 与 AgentRunner binding 的映射关系：由 binding 直接 enqueue，还是由独立 task policy 决定。
- runtime capability schema 的稳定字段：provider、version、login status、execution isolation、workspace access、slot。
- secret projection 的边界：Host 存储、用户本机存储、或外部 secret manager。
- Docker compose 是否提供官方 sidecar daemon 示例。
- v2 UI 是核心前端的一部分，还是完全由管理插件提供。
