blob: d2ebdcc734a33dbff73539c49915a551b41b2b42 [file] [view]
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
# Runtime v2 implementation notes
> Archived on 2026-07-13. These notes describe the initial Phase 1–4 skeleton; the backend architecture chapters and current source now describe the active runtime.
Status: Phase 1–4 skeleton landed (compile-safe, tested). The production
`SessionManager.sendMessage` hot path is **unchanged**; the v2 seam exists
in parallel so future work can migrate onto it incrementally.
Source plan: `docs/archive/runtime-v2-architecture-evolution.md`.
## What landed
### Core contract (`@maka/core`)
- `packages/core/src/runtime-event.ts` — the canonical `RuntimeEvent` fact
model (role / author / status enums, content discriminated union, actions,
refs, pure helpers `isTerminalRuntimeEvent` /
`runtimeEventHasModelVisibleContent` / `createRuntimeEventId`).
- `packages/core/src/__tests__/runtime-event.test.ts` — focused contract
tests.
- New subpath export `@maka/core/runtime-event`. The later public-API cleanup
removed the package root barrel, so this subpath is now the only public route.
### Runtime v2 seam (`@maka/runtime`)
Five new modules, each importable via its canonical subpath AND re-exported
(selectively) from the runtime barrel:
| Module | Subpath | Role |
|---|---|---|
| `model-history.ts` | `@maka/runtime/model-history` | Policy-driven `buildModelHistoryFromRuntimeEvents()` replacing ad-hoc `StoredMessage` filtering. |
| `invocation-context.ts` | `@maka/runtime/invocation-context` | `InvocationRequest` / `InvocationContext` spine, injectable `newId`/`now` providers, `InvocationResult` envelope. |
| `runtime-runner.ts` | `@maka/runtime/runtime-runner` | `RuntimeRunner.run()` collecting shell: preflight gate → context → user event → flow dispatch → terminal collection. |
| `agent-flow.ts` | `@maka/runtime/agent-flow` | Formal `AgentFlow` / `AgentFlowControl` / `FlowInput` seam. |
| `ai-sdk-flow.ts` | `@maka/runtime/ai-sdk-flow` | `AiSdkFlow` wrapping an `AgentBackend`; `mapSessionEventToRuntimeEvent()` placeholder mapping. |
Each module shipped with co-located tests for the initial migration seam.
### Exports consolidated by the steward
- `packages/core/package.json` — added `"./runtime-event"`.
- `packages/runtime/package.json` — added the runtime-v2 subpath exports.
- The later public-API cleanup removed both package root barrels in favor of
explicit domain subpaths.
## Reconciled: single `InvocationContext` type
`InvocationContext` is now owned by `invocation-context.ts` and reused by the
formal flow seam:
- `invocation-context.ts` — the canonical runner/flow spine (required
`source`, `startedAt`, `request`, `newId`, `now`).
- `agent-flow.ts` — imports and re-exports that canonical type for the
`AgentFlow.run(ctx, input)` contract.
The runtime barrel re-exports the canonical `InvocationContext` from
`invocation-context.ts`; the previous duplicate flow-local context was removed
so runner and flow code share the same identity/provider spine.
## What remains (by phase)
- **Phase 5 — Tool-event actions:** promote `tool_output_delta` /
`tool_progress` `SessionEvent`s to a dedicated tool-progress runtime
action (currently partial tool-role heartbeats). Refine
`mapSessionEventToRuntimeEvent` role/author policy.
- **Phase 6 — RuntimeGate:** implement the real preflight (connection
readiness/rebind, blocked/running/waiting guards) behind `RuntimeGate`
and inject it into desktop + bot/gateway entrypoints.
- **Phase 7 — Projection:** drive `StoredMessage` / `TurnRecord` /
`SessionHeader` / `AgentRunStore` / `RunTrace` / `TelemetryRepo` writes
from `InvocationResult.events`. Wire
`buildModelHistoryFromRuntimeEvents()` into the live
`AiSdkBackend.materializePriorMessages` path.
- **SessionManager delegation:** replace the body of
`SessionManager.sendMessage` with `RuntimeRunner.run(...)` behind a
feature flag, mapping `InvocationResult.events` → existing
`SessionEvent` projection. A streaming `async *stream()` variant may be
added then if the renderer needs live deltas. Today `RuntimeRunner.run()`
is **collecting** (returns `Promise<InvocationResult>`), not streaming.
- **`abort` + `complete` coalescing:** `AiSdkFlow` is a faithful translator
(the backend emits `abort` then a trailing `complete`, and the flow emits
both). Coalescing into a single terminal event is a runner/projection
concern.
- **Flow runnable surface:** `RuntimeRunner` depends on the centrally owned
`RunnableAgentFlow` (`Pick<AgentFlow, 'run'>`) so it remains decoupled from
flow metadata (`kind`, `sessionId`) while sharing the formal `AgentFlow.run`
signature.
## Verification snapshot
All commands run from the repository root (`$RIVE_WORKSPACE`):
```
npm run build # all workspaces — clean
npm run typecheck # all workspaces — clean
npm --workspace @maka/core run test # 613 pass / 0 fail
npm --workspace @maka/runtime run test # 384 pass / 0 fail
git diff --check # clean
```
No production source (`session-manager.ts`, `ai-sdk-backend.ts`,
`agent-run.ts`, `materializer.ts`) was modified. The v2 seam is purely
additive.