Dependency audit / audit (push) Canceled after 0s
CI / plan (push) Canceled after 0s
Gitoxide helper admission / macos-latest (push) Canceled after 0s
Gitoxide helper admission / ubuntu-latest (push) Canceled after 0s
Gitoxide helper admission / windows-latest (push) Canceled after 0s
Runtime Host peer admission / quality (push) Canceled after 0s
Windows recovery / windows_recovery (push) Canceled after 0s
CI / heavy (push) Canceled after 0s
CI / test (push) Canceled after 0s
123 lines
5.9 KiB
Markdown
123 lines
5.9 KiB
Markdown
<!--
|
||
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.
|