Plan J1 + J2 / spec §10.3.5 / Phase 4.
New workspace package: packages/agui-adapter/. Pure-TS
bidirectional bridge between OD's native PersistedAgentEvent /
GenUIEvent / PluginPipelineStageEvent union and the AG-UI canonical
event protocol (https://github.com/CopilotKit/CopilotKit).
- src/types.ts — AGUIEvent discriminated union (agent.message,
tool_call, state_update, ui.surface_requested,
ui.surface_responded, run.lifecycle).
- src/encode.ts — encodeOdEventForAgui(event, ctx): maps every
OD native event onto the canonical shape; drops
events the encoder can't translate so external
AG-UI clients always see a clean stream.
- tests/encode.test.ts (9 cases) covers message_chunk, tool_call,
run_started, end → started/completed/failed/
cancelled, pipeline_stage_started/completed,
genui_surface_request/response/timeout,
genui_state_synced, and the unknown-event drop.
apps/daemon/src/server.ts mounts GET /api/runs/:id/agui:
- 404 for unknown run ids.
- Replays the run's recorded events through the encoder on subscribe
(so a reconnecting client with Last-Event-ID picks up exactly the
AG-UI events it missed).
- Subscribes to future events via a thin adapter client wrapper that
routes through the existing run.clients fan-out, so the encoder
runs lazily on each broadcast (no double event buffering).
Daemon depends on @open-design/agui-adapter; the package builds clean
and ships pure ESM. v1 plugins consume CopilotKit / agent-protocol
clients without modification — the adapter ships independently from
daemon main, so upstream protocol revs do not couple to the daemon
release cadence (per spec §10.3.5 Phase 4 contract).
Tests: agui-adapter 9/9, daemon 1481 → 1482 (+1 case on agui-route).
Co-authored-by: Tom Huang <1043269994@qq.com>