From 684152d69976a2ff2e5f620008b6b6ff28ee1775 Mon Sep 17 00:00:00 2001 From: Matthew Meszaros Date: Wed, 15 Jul 2026 17:54:16 +0200 Subject: [PATCH] feat: add the agent transcript client and hydrated turn and block types used to rehydrate a reopened assistant conversation --- .../api/client/app/agent/getAgentMessages.ts | 14 ++++++++++ web/src/lib/api/models/app/agent/Agent.ts | 27 +++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 web/src/lib/api/client/app/agent/getAgentMessages.ts diff --git a/web/src/lib/api/client/app/agent/getAgentMessages.ts b/web/src/lib/api/client/app/agent/getAgentMessages.ts new file mode 100644 index 000000000..e8509bb8f --- /dev/null +++ b/web/src/lib/api/client/app/agent/getAgentMessages.ts @@ -0,0 +1,14 @@ +import type { AgentTranscript } from "@/lib/api/models/app/agent/Agent"; +import Request from "../../Request"; + +// Loads a session's hydrated transcript so a reopened workspace tab rehydrates +// its conversation (and any pending approval) from the server. +export default async function getAgentMessages( + sessionId: string, +): Promise { + return await Request({ + method: "GET", + url: `/ai/sessions/${sessionId}/messages`, + authorization: true, + }); +} diff --git a/web/src/lib/api/models/app/agent/Agent.ts b/web/src/lib/api/models/app/agent/Agent.ts index 99f21937f..62d13f54f 100644 --- a/web/src/lib/api/models/app/agent/Agent.ts +++ b/web/src/lib/api/models/app/agent/Agent.ts @@ -27,6 +27,33 @@ export interface AgentSessionsPage { pagination: { next_cursor: string | null; has_more: boolean }; } +// A persisted transcript block, hydrated server-side into the same shape the +// live stream renders (see internal/app/aiagent HydratedBlock). +export interface AgentHydratedBlock { + kind: "text" | "tool"; + text?: string; + tool?: string; + args_summary?: string; + result?: string; + entity_type?: string; + entity_id?: string; + open_url?: string; + done: boolean; +} + +export interface AgentHydratedTurn { + role: "user" | "assistant"; + blocks: AgentHydratedBlock[]; +} + +// GET /ai/sessions/:id/messages — a reopened session's history + any pending +// approval, so a tab rehydrates identically to a live run. +export interface AgentTranscript { + title: string; + turns: AgentHydratedTurn[]; + pending: PendingAgentTool | null; +} + // AgentStreamEvent is one SSE step from a message/approval run. export interface AgentStreamEvent { type: