Wave D: native AgentEvent wire + client session rewrite (SDK purged)

Server: ui-stream.ts is verbatim pi AgentEvent passthrough (SSE data
lines + [DONE]); only app-level events are the loop-level error and
turn-settled terminal; onError carries raw provider text (owner ruling).

Client: useChat + the AI-SDK transport replaced by components/session-core.ts
(SessionModel: 409 identity-retry, optimistic c_ appends, absorbed()
adoption, needsContinuation, shared consume for POST + reattach) and the
session.ts hook; the golden-master grouping canon moved client-side into
core/view.ts (projectView); scanners read the native record (phaseAt3Lh,
danglingQuestionOf, graph toolParts, plan-blocks, runner, extraction).

Coverage: the native message is the unit (fork 3) with the call+result
inseparability bond rule; view-line-less messages (markers, error
results) are invisible to coverage and never checkpointed.

Deletes: chat-transport, projection, ui-message, their tests (ported to
tests/session-core.test.ts), and the ai + @ai-sdk/react dependencies —
the Vercel SDK is fully out of the tree. Wire pins in chat-flow rewritten
onto the AgentEvent dialect (eventsOf parser).

Gates: tsc clean, 994/994 tests, eslint clean, build green; live smoke
on PORT=3004 (verbatim wire → native record).
This commit is contained in:
amosblomqvist
2026-09-26 01:52:47 +03:00
parent 7c0e8d9a50
commit f3003d357a
44 changed files with 2299 additions and 2205 deletions
+4 -5
View File
@@ -1,5 +1,4 @@
import { deleteChatSession, getChat, isTurnRunning, sessionCoverage, stores, type ChatDeleteMode } from "@/src/server";
import { projectNative } from "@/src/core";
export async function GET(_req: Request, { params }: { params: Promise<{ id: string }> }) {
const { id } = await params;
@@ -11,13 +10,13 @@ export async function GET(_req: Request, { params }: { params: Promise<{ id: str
// meter + sidebar block — THE coverage surface (the all-sessions GET
// route died with the redesign; the Extract POST stays). getChat
// already 404'd, so the block exists.
// Wave B (owner-approved 2026-09-26): the record's messages are native
// agent history — clients receive the one-way projection (the AI-SDK
// UIMessage view) until Wave D. turnInFlight lets a returning client
// Wave D (owner-approved 2026-09-26): the record's messages are native
// agent history, served VERBATIM — the client derives its view
// (core/view.ts projectView). turnInFlight lets a returning client
// re-attach to a running turn; coverage is the chat view's ring meter.
return Response.json({
...chat,
messages: projectNative(chat.messages),
messages: chat.messages,
turnInFlight: isTurnRunning(id),
coverage: sessionCoverage(id),
});