@standardagents/client 0.40.13 → 0.41.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +3 -3
- package/dist/index.js +15 -16
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -23,7 +23,7 @@ interface Message {
|
|
|
23
23
|
subagent_title?: string | null;
|
|
24
24
|
subagent_description?: string | null;
|
|
25
25
|
subagent_status?: string | null;
|
|
26
|
-
|
|
26
|
+
subagent_relationship?: string | null;
|
|
27
27
|
subagent_blocking?: boolean | null;
|
|
28
28
|
subagent_thread_name?: string | null;
|
|
29
29
|
subagent_spawn_group_id?: string | null;
|
|
@@ -125,7 +125,7 @@ interface SubagentBlockMessage {
|
|
|
125
125
|
subagent_title?: string | null;
|
|
126
126
|
subagent_description?: string | null;
|
|
127
127
|
subagent_status?: string | null;
|
|
128
|
-
|
|
128
|
+
subagent_relationship?: string | null;
|
|
129
129
|
subagent_blocking?: boolean | null;
|
|
130
130
|
subagent_thread_name?: string | null;
|
|
131
131
|
subagent_spawn_group_id?: string | null;
|
|
@@ -143,7 +143,7 @@ interface SubagentGroupBlockMessage {
|
|
|
143
143
|
updated_at: number;
|
|
144
144
|
depth?: number;
|
|
145
145
|
}
|
|
146
|
-
type StatusMessageKind = "execution_stopped" | "subagent_started" | "subagent_event";
|
|
146
|
+
type StatusMessageKind = "execution_stopped" | "subagent_started" | "subagent_event" | "runtime_tool_invocation";
|
|
147
147
|
interface StatusMessage {
|
|
148
148
|
id: string;
|
|
149
149
|
type: "status";
|
package/dist/index.js
CHANGED
|
@@ -1002,7 +1002,11 @@ function transformToWorkblocks(messages) {
|
|
|
1002
1002
|
|
|
1003
1003
|
// src/utils/subagentBlocks.ts
|
|
1004
1004
|
var SUBAGENT_TOOLS = /* @__PURE__ */ new Set(["subagent_create", "subagent_message", "send_to_agent"]);
|
|
1005
|
-
var SUBAGENT_LIFECYCLE_TOOLS = /* @__PURE__ */ new Set([
|
|
1005
|
+
var SUBAGENT_LIFECYCLE_TOOLS = /* @__PURE__ */ new Set([
|
|
1006
|
+
...SUBAGENT_TOOLS,
|
|
1007
|
+
"subagents",
|
|
1008
|
+
"terminate_subagent"
|
|
1009
|
+
]);
|
|
1006
1010
|
var SUBAGENT_NAME_PATTERN = /subagent/i;
|
|
1007
1011
|
function isWorkblock(message) {
|
|
1008
1012
|
return message.type === "workblock";
|
|
@@ -1059,9 +1063,12 @@ function getSystemStatusKind(message) {
|
|
|
1059
1063
|
return null;
|
|
1060
1064
|
}
|
|
1061
1065
|
const metadataKind = getMetadataString(message, "status_kind");
|
|
1062
|
-
if (metadataKind === "execution_stopped" || metadataKind === "subagent_started" || metadataKind === "subagent_event") {
|
|
1066
|
+
if (metadataKind === "execution_stopped" || metadataKind === "subagent_started" || metadataKind === "subagent_event" || metadataKind === "runtime_tool_invocation") {
|
|
1063
1067
|
return metadataKind;
|
|
1064
1068
|
}
|
|
1069
|
+
if (getMetadataString(message, "runtime_tool_invocation")) {
|
|
1070
|
+
return "runtime_tool_invocation";
|
|
1071
|
+
}
|
|
1065
1072
|
if (getMetadataString(message, "subagent_event") === "parent_handoff") {
|
|
1066
1073
|
return "subagent_event";
|
|
1067
1074
|
}
|
|
@@ -1168,7 +1175,7 @@ function createSubagentBlock(subagentId, message) {
|
|
|
1168
1175
|
subagent_title: message.subagent_title ?? null,
|
|
1169
1176
|
subagent_description: message.subagent_description ?? null,
|
|
1170
1177
|
subagent_status: inferredStatus ?? null,
|
|
1171
|
-
|
|
1178
|
+
subagent_relationship: message.subagent_relationship ?? null,
|
|
1172
1179
|
subagent_blocking: message.subagent_blocking ?? null,
|
|
1173
1180
|
subagent_thread_name: message.subagent_thread_name ?? null,
|
|
1174
1181
|
subagent_spawn_group_id: message.subagent_spawn_group_id ?? null,
|
|
@@ -1196,8 +1203,8 @@ function mergeSubagentBlock(block, message) {
|
|
|
1196
1203
|
if (inferredStatus !== null) {
|
|
1197
1204
|
block.subagent_status = inferredStatus;
|
|
1198
1205
|
}
|
|
1199
|
-
if (message.
|
|
1200
|
-
block.
|
|
1206
|
+
if (message.subagent_relationship !== void 0) {
|
|
1207
|
+
block.subagent_relationship = message.subagent_relationship ?? block.subagent_relationship ?? null;
|
|
1201
1208
|
}
|
|
1202
1209
|
if (message.subagent_blocking !== void 0) {
|
|
1203
1210
|
block.subagent_blocking = message.subagent_blocking ?? block.subagent_blocking ?? null;
|
|
@@ -1242,7 +1249,6 @@ function createPendingSubagentBlock(workblock, toolCall, index, status) {
|
|
|
1242
1249
|
const toolName = asOptionalString(toolCall.name) ?? "Subagent";
|
|
1243
1250
|
const pseudoSubagentId = toolCall.tool_call_id ? `pending:${toolCall.tool_call_id}` : `pending:${workblock.id}:${index}`;
|
|
1244
1251
|
const createdAt = workblock.created_at + index;
|
|
1245
|
-
const isBuiltinLifecycleTool = !!toolCall.name && SUBAGENT_TOOLS.has(toolCall.name);
|
|
1246
1252
|
return {
|
|
1247
1253
|
id: `subagent:${pseudoSubagentId}`,
|
|
1248
1254
|
type: "subagent_block",
|
|
@@ -1251,8 +1257,8 @@ function createPendingSubagentBlock(workblock, toolCall, index, status) {
|
|
|
1251
1257
|
subagent_title: toolName,
|
|
1252
1258
|
subagent_description: null,
|
|
1253
1259
|
subagent_status: status,
|
|
1254
|
-
|
|
1255
|
-
subagent_blocking:
|
|
1260
|
+
subagent_relationship: null,
|
|
1261
|
+
subagent_blocking: null,
|
|
1256
1262
|
subagent_thread_name: getSubagentThreadNameFromWorkItem(toolCall),
|
|
1257
1263
|
subagent_spawn_group_id: workblock.id,
|
|
1258
1264
|
messages: [],
|
|
@@ -1387,7 +1393,7 @@ function transformToSubagentBlocks(messages, options = {}) {
|
|
|
1387
1393
|
continue;
|
|
1388
1394
|
}
|
|
1389
1395
|
if (!subagentId) {
|
|
1390
|
-
if (toolCall.status === "pending" &&
|
|
1396
|
+
if (toolCall.status === "pending" && toolCall.name === "subagent_create") {
|
|
1391
1397
|
pendingSubagentToolCalls.push(toolCall);
|
|
1392
1398
|
}
|
|
1393
1399
|
continue;
|
|
@@ -1401,12 +1407,8 @@ function transformToSubagentBlocks(messages, options = {}) {
|
|
|
1401
1407
|
threadNameBySubagentId.set(subagentId, threadName);
|
|
1402
1408
|
}
|
|
1403
1409
|
const currentFlags = inferredFlagsBySubagentId.get(subagentId) ?? {
|
|
1404
|
-
resumable: null,
|
|
1405
1410
|
blocking: null
|
|
1406
1411
|
};
|
|
1407
|
-
if (toolCall.name === "subagent_create" || toolCall.name === "subagent_message" || toolCall.name === "send_to_agent") {
|
|
1408
|
-
currentFlags.resumable = true;
|
|
1409
|
-
}
|
|
1410
1412
|
if (toolCall.name === "subagent_create") {
|
|
1411
1413
|
const inferredBlocking = inferBlockingFromToolResult(entry, toolCall.tool_call_id);
|
|
1412
1414
|
if (inferredBlocking !== null) {
|
|
@@ -1482,9 +1484,6 @@ function transformToSubagentBlocks(messages, options = {}) {
|
|
|
1482
1484
|
block.subagent_thread_name = inferredThreadName;
|
|
1483
1485
|
}
|
|
1484
1486
|
const inferredFlags = inferredFlagsBySubagentId.get(subagentId);
|
|
1485
|
-
if (block.subagent_resumable === null && inferredFlags?.resumable !== null && inferredFlags?.resumable !== void 0) {
|
|
1486
|
-
block.subagent_resumable = inferredFlags.resumable;
|
|
1487
|
-
}
|
|
1488
1487
|
if (block.subagent_blocking === null && inferredFlags?.blocking !== null && inferredFlags?.blocking !== void 0) {
|
|
1489
1488
|
block.subagent_blocking = inferredFlags.blocking;
|
|
1490
1489
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client/AgentBuilderClient.ts","../src/connection/ThreadConnectionManager.ts","../src/utils/attachments.ts","../src/utils/imageProcessing.ts","../src/utils/fileHelpers.ts","../src/uploads/FileUploadManager.ts","../src/utils/workblocks.ts","../src/utils/subagentBlocks.ts"],"sourcesContent":["import type {\n Message,\n Thread,\n SendMessagePayload,\n GetMessagesOptions,\n MessagesPage,\n MessageWebSocketCallbacks,\n LogWebSocketCallbacks,\n MessageStreamEvent,\n LogStreamEvent,\n ThreadEvent,\n CreateThreadPayload,\n AttachmentRef,\n} from '../types'\n\nconst AUTH_TOKEN_KEY = 'agentbuilder_auth_token'\n\nexport class AgentBuilderClient {\n private endpoint: string\n\n constructor(endpoint: string) {\n // Normalize endpoint by removing trailing slash\n this.endpoint = endpoint.replace(/\\/$/, '')\n }\n\n /**\n * Get the current endpoint\n */\n getEndpoint(): string {\n return this.endpoint\n }\n\n /**\n * Create a new thread\n */\n async createThread(payload: CreateThreadPayload): Promise<Thread> {\n const response = await fetch(`${this.endpoint}/threads`, {\n method: 'POST',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n })\n\n if (!response.ok) {\n throw new Error(`Failed to create thread: ${response.statusText}`)\n }\n\n return response.json()\n }\n\n /**\n * Get thread metadata\n */\n async getThread(id: string): Promise<Thread> {\n const response = await fetch(`${this.endpoint}/threads/${id}`, {\n method: 'GET',\n headers: this.getHeaders(),\n })\n\n if (!response.ok) {\n throw new Error(`Failed to get thread: ${response.statusText}`)\n }\n\n return response.json()\n }\n\n /**\n * Get messages from a thread with optional pagination and filtering\n */\n async getMessages(\n id: string,\n options: GetMessagesOptions = {}\n ): Promise<Message[]> {\n const data = await this.getMessagesPage(id, options)\n return data.messages || []\n }\n\n /**\n * Get a paginated message page from a thread.\n */\n async getMessagesPage(\n id: string,\n options: GetMessagesOptions = {}\n ): Promise<MessagesPage> {\n const params = new URLSearchParams()\n\n if (options.limit !== undefined) params.set('limit', String(options.limit))\n if (options.offset !== undefined) params.set('offset', String(options.offset))\n if (options.depth !== undefined) params.set('depth', String(options.depth))\n if (options.includeSilent !== undefined) params.set('includeSilent', String(options.includeSilent))\n if (options.ids !== undefined && options.ids.length > 0) params.set('ids', options.ids.join(','))\n if (options.includeWorkblocks !== undefined) params.set('includeWorkblocks', String(options.includeWorkblocks))\n\n const queryString = params.toString()\n const url = `${this.endpoint}/threads/${id}/messages${queryString ? `?${queryString}` : ''}`\n\n const response = await fetch(url, {\n method: 'GET',\n headers: this.getHeaders(),\n })\n\n if (!response.ok) {\n throw new Error(`Failed to get messages: ${response.statusText}`)\n }\n\n const data = await response.json()\n return {\n messages: data.messages || [],\n total: data.total || 0,\n hasMore: !!data.hasMore,\n }\n }\n\n /**\n * Send a message to a thread\n */\n async sendMessage(\n id: string,\n payload: SendMessagePayload\n ): Promise<Message> {\n const response = await fetch(`${this.endpoint}/threads/${id}/messages`, {\n method: 'POST',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n })\n\n if (!response.ok) {\n throw new Error(`Failed to send message: ${response.statusText}`)\n }\n\n return response.json()\n }\n\n /**\n * Stop execution of a thread\n */\n async stopExecution(id: string): Promise<void> {\n const response = await fetch(`${this.endpoint}/threads/${id}/stop`, {\n method: 'POST',\n headers: this.getHeaders(),\n })\n\n if (!response.ok) {\n throw new Error(`Failed to stop execution: ${response.statusText}`)\n }\n\n await response.json()\n }\n\n /**\n * Delete a message from a thread\n * @param threadId - The thread ID\n * @param messageId - The message ID to delete\n * @returns Object with success status\n */\n async deleteMessage(\n threadId: string,\n messageId: string\n ): Promise<{ success: boolean }> {\n const response = await fetch(\n `${this.endpoint}/threads/${threadId}/messages/${messageId}`,\n {\n method: 'DELETE',\n headers: this.getHeaders(),\n }\n )\n\n if (!response.ok) {\n throw new Error(`Failed to delete message: ${response.statusText}`)\n }\n\n return response.json()\n }\n\n /**\n * Options for file upload\n */\n /**\n * Upload a file to a thread's filesystem\n * @param threadId - The thread ID\n * @param file - The file to upload\n * @param options - Optional upload options\n * @param options.thumbnail - Base64-encoded thumbnail data (for images)\n * @param options.width - Image width in pixels\n * @param options.height - Image height in pixels\n * @returns AttachmentRef with file metadata\n */\n async uploadFile(\n threadId: string,\n file: File,\n options?: {\n thumbnail?: string\n width?: number\n height?: number\n }\n ): Promise<AttachmentRef> {\n const encodedFilename = encodeURIComponent(file.name)\n const url = `${this.endpoint}/threads/${threadId}/fs/${encodedFilename}`\n\n // If thumbnail provided, use JSON format with base64 data\n if (options?.thumbnail) {\n const base64Data = await this.fileToBase64(file)\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n data: base64Data,\n mimeType: file.type,\n thumbnail: options.thumbnail,\n metadata: {\n width: options.width,\n height: options.height,\n },\n }),\n })\n\n if (!response.ok) {\n throw new Error(`Failed to upload file: ${response.statusText}`)\n }\n\n return response.json()\n }\n\n // For non-image files or when no thumbnail, use raw binary upload\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': file.type,\n },\n body: file,\n })\n\n if (!response.ok) {\n throw new Error(`Failed to upload file: ${response.statusText}`)\n }\n\n return response.json()\n }\n\n /**\n * Convert a File to base64 string\n */\n private fileToBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => {\n const result = reader.result as string\n // Remove data URL prefix (e.g., \"data:image/jpeg;base64,\")\n const base64 = result.split(',')[1]\n resolve(base64)\n }\n reader.onerror = () => reject(new Error('Failed to read file'))\n reader.readAsDataURL(file)\n })\n }\n\n /**\n * Get the full URL for a file in a thread's filesystem\n */\n getFileUrl(threadId: string, path: string): string {\n // Normalize path - remove leading slash and encode special characters\n const normalizedPath = path.startsWith('/') ? path.slice(1) : path\n const encodedPath = normalizedPath\n .split('/')\n .map(segment => encodeURIComponent(segment))\n .join('/')\n\n return `${this.endpoint}/threads/${threadId}/fs/${encodedPath}`\n }\n\n /**\n * Get the thumbnail URL for an image in a thread's filesystem\n */\n getThumbnailUrl(threadId: string, path: string): string {\n return `${this.getFileUrl(threadId, path)}?thumbnail=true`\n }\n\n /**\n * List all files in a thread's filesystem\n * @param threadId - The thread ID\n * @returns Array of file records\n */\n async listFiles(threadId: string): Promise<Array<{\n path: string\n name: string\n mimeType: string\n size: number\n isDirectory: boolean\n createdAt?: number\n updatedAt?: number\n }>> {\n // Use find API to recursively list all files\n const response = await fetch(\n `${this.endpoint}/threads/${threadId}/fs?find=**/*&type=file`,\n {\n method: 'GET',\n headers: this.getHeaders(),\n }\n )\n\n if (!response.ok) {\n throw new Error(`Failed to list files: ${response.statusText}`)\n }\n\n const data = await response.json()\n return data.files || []\n }\n\n /**\n * Connect to message WebSocket for real-time message updates\n */\n async connectMessageWebSocket(\n id: string,\n callbacks: MessageWebSocketCallbacks = {},\n options: { includeSilent?: boolean; depth?: number } = {}\n ): Promise<WebSocket> {\n const extra = new URLSearchParams()\n if (options.includeSilent !== undefined) extra.set('includeSilent', String(options.includeSilent))\n if (options.depth !== undefined) extra.set('depth', String(options.depth))\n\n const url = await this.mintWebSocketUrl(`/threads/${id}/stream`, extra)\n const ws = new WebSocket(url)\n\n ws.onopen = () => {\n callbacks.onOpen?.()\n }\n\n ws.onmessage = (event) => {\n try {\n // Heartbeat replies: `stream_pong` from the hibernation\n // auto-response, `pong` from older servers.\n if (\n typeof event.data === 'string' &&\n (event.data === 'pong' || event.data === 'stream_pong')\n ) {\n return\n }\n\n const data = JSON.parse(event.data) as MessageStreamEvent\n\n switch (data.type) {\n case 'message_data':\n callbacks.onMessage?.(data)\n break\n case 'message_chunk':\n callbacks.onChunk?.(data)\n break\n case 'event':\n callbacks.onEvent?.(data as ThreadEvent)\n break\n case 'error':\n callbacks.onError?.(data)\n break\n }\n } catch (error) {\n console.error('Failed to parse WebSocket message:', error)\n }\n }\n\n ws.onerror = (event) => {\n console.error('WebSocket error:', event)\n callbacks.onError?.({ type: 'error', error: 'WebSocket connection error' })\n }\n\n ws.onclose = (event) => {\n console.log(`[AgentBuilderClient] Message WebSocket closed - code: ${event.code}, reason: ${event.reason || 'none'}, wasClean: ${event.wasClean}`)\n callbacks.onClose?.()\n }\n\n return ws\n }\n\n /**\n * Connect to log WebSocket for custom events\n */\n async connectLogWebSocket(\n id: string,\n callbacks: LogWebSocketCallbacks = {}\n ): Promise<WebSocket> {\n const url = await this.mintWebSocketUrl(`/threads/${id}`)\n const ws = new WebSocket(url)\n\n ws.onopen = () => {\n callbacks.onOpen?.()\n }\n\n ws.onmessage = (event) => {\n try {\n // Heartbeat replies: `stream_pong` from the hibernation\n // auto-response, `pong` from older servers.\n if (\n typeof event.data === 'string' &&\n (event.data === 'pong' || event.data === 'stream_pong')\n ) {\n return\n }\n\n const data = JSON.parse(event.data) as LogStreamEvent\n\n switch (data.type) {\n case 'log_data':\n callbacks.onLog?.(data)\n break\n case 'custom':\n callbacks.onCustom?.(data)\n break\n case 'stopped_by_user':\n callbacks.onStopped?.(data)\n break\n case 'kv_data':\n callbacks.onKvData?.(data)\n break\n }\n } catch (error) {\n console.error('Failed to parse WebSocket message:', error)\n }\n }\n\n ws.onerror = (event) => {\n console.error('WebSocket error:', event)\n }\n\n ws.onclose = () => {\n callbacks.onClose?.()\n }\n\n return ws\n }\n\n /**\n * Get headers for HTTP requests\n */\n private getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {}\n const token = this.getToken()\n\n if (token) {\n headers['Authorization'] = `Bearer ${token}`\n }\n\n return headers\n }\n\n private getToken(): string | null {\n return typeof localStorage !== 'undefined'\n ? localStorage.getItem(AUTH_TOKEN_KEY)\n : null\n }\n\n /**\n * Mint a path-bound, single-use ticket when a long-lived credential is\n * present. Same-origin cookie sessions open the socket without a query\n * credential so durable secrets never enter access logs.\n */\n private async mintWebSocketUrl(\n suffix: string,\n extra: URLSearchParams = new URLSearchParams(),\n ): Promise<string> {\n const endpointUrl = this.getEndpointUrl()\n const pathname = `${endpointUrl.pathname.replace(/\\/$/, '')}${suffix}`\n const token = this.getToken()\n if (token) {\n const response = await fetch(`${this.endpoint}/auth/websocket-ticket`, {\n method: 'POST',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ pathname }),\n })\n if (!response.ok) {\n throw new Error(`Failed to mint WebSocket ticket: ${response.status} ${response.statusText}`)\n }\n const payload = await response.json() as { ticket?: unknown }\n if (typeof payload.ticket !== 'string' || !payload.ticket) {\n throw new Error('WebSocket ticket response did not include a ticket')\n }\n extra.set('ticket', payload.ticket)\n }\n const query = extra.toString()\n return `${this.getWebSocketEndpoint()}${suffix}${query ? `?${query}` : ''}`\n }\n\n private getEndpointUrl(): URL {\n const base =\n typeof location !== 'undefined'\n ? location.href\n : 'http://localhost/'\n return new URL(this.endpoint, base)\n }\n\n private getWebSocketEndpoint(): string {\n const endpointUrl = this.getEndpointUrl()\n endpointUrl.protocol = endpointUrl.protocol === 'https:' ? 'wss:' : 'ws:'\n return endpointUrl.toString().replace(/\\/$/, '')\n }\n}\n","import { AgentBuilderClient } from '../client/AgentBuilderClient'\nimport type {\n ConnectionStatus,\n ThreadConnectionCallbacks,\n MessageDataEvent,\n MessageChunkEvent,\n ThreadEvent,\n ErrorEvent,\n} from '../types'\n\nexport interface ThreadConnectionOptions {\n /** Maximum message depth to stream (default: 0 for top-level only) */\n depth?: number\n /** Whether to include silent messages (default: false) */\n includeSilent?: boolean\n /** Heartbeat interval in milliseconds (default: 30000) */\n heartbeatInterval?: number\n /** Maximum reconnection delay in milliseconds (default: 30000) */\n maxReconnectDelay?: number\n /**\n * Consulted before scheduling a reconnect once the socket has failed\n * `preOpenFailureThreshold` times in a row without ever opening — the\n * browser hides a rejected upgrade's HTTP status, so this is the hook for\n * an application-level auth check. Return false to stop reconnecting (the\n * manager goes `disconnected`; a later explicit `connect()` resumes).\n * Without a gate the manager keeps its historical always-retry behavior.\n */\n reconnectAuthGate?: () => boolean | Promise<boolean>\n /** Consecutive never-opened failures before consulting the gate (default: 3) */\n preOpenFailureThreshold?: number\n}\n\n/**\n * ThreadConnectionManager handles WebSocket connection lifecycle for a thread.\n * Provides automatic reconnection with exponential backoff and heartbeat keep-alive.\n *\n * This class is framework-agnostic. React and Vue SDKs use this internally\n * and handle their own reactive state management.\n *\n * @example\n * ```typescript\n * const manager = new ThreadConnectionManager(client, 'thread-123', {\n * onMessage: (event) => updateMessages(event.data),\n * onChunk: (event) => appendChunk(event.chunk),\n * onStatusChange: (status) => setConnectionStatus(status),\n * })\n *\n * manager.connect()\n * // ... later\n * manager.disconnect()\n * ```\n */\nexport class ThreadConnectionManager {\n private client: AgentBuilderClient\n private threadId: string\n private callbacks: ThreadConnectionCallbacks\n private options: Required<Omit<ThreadConnectionOptions, 'reconnectAuthGate'>> &\n Pick<ThreadConnectionOptions, 'reconnectAuthGate'>\n\n private ws: WebSocket | null = null\n private connectGeneration: number = 0\n private status: ConnectionStatus = 'disconnected'\n private reconnectAttempts: number = 0\n private reconnectTimeout: ReturnType<typeof setTimeout> | null = null\n private heartbeatInterval: ReturnType<typeof setInterval> | null = null\n private isReconnecting: boolean = false\n private shouldReconnect: boolean = true\n /** Timestamp of the last frame received; gates quiet-only keepalives. */\n private lastFrameAt: number = 0\n /** Consecutive closes without a successful open (rejected upgrades). */\n private consecutivePreOpenFailures: number = 0\n private openedSinceConnect: boolean = false\n\n constructor(\n client: AgentBuilderClient,\n threadId: string,\n callbacks: ThreadConnectionCallbacks = {},\n options: ThreadConnectionOptions = {}\n ) {\n this.client = client\n this.threadId = threadId\n this.callbacks = callbacks\n this.options = {\n depth: options.depth ?? 0,\n includeSilent: options.includeSilent ?? false,\n heartbeatInterval: options.heartbeatInterval ?? 30000,\n maxReconnectDelay: options.maxReconnectDelay ?? 30000,\n reconnectAuthGate: options.reconnectAuthGate,\n preOpenFailureThreshold: options.preOpenFailureThreshold ?? 3,\n }\n }\n\n /**\n * Get current connection status\n */\n getStatus(): ConnectionStatus {\n return this.status\n }\n\n /**\n * Get the thread ID this manager is connected to\n */\n getThreadId(): string {\n return this.threadId\n }\n\n /**\n * Connect to the thread WebSocket\n */\n connect(): void {\n void this.connectAsync()\n }\n\n /**\n * Mint a ticket when needed, then open the thread WebSocket.\n */\n async connectAsync(): Promise<void> {\n if (this.ws && this.ws.readyState !== WebSocket.CLOSED) {\n // Already connected or connecting\n return\n }\n\n const generation = ++this.connectGeneration\n this.shouldReconnect = true\n this.isReconnecting = false\n this.openedSinceConnect = false\n this.setStatus('connecting')\n\n let ws: WebSocket\n try {\n ws = await this.client.connectMessageWebSocket(\n this.threadId,\n {\n onOpen: () => {\n this.setStatus('connected')\n this.reconnectAttempts = 0\n this.isReconnecting = false\n this.consecutivePreOpenFailures = 0\n this.openedSinceConnect = true\n this.startHeartbeat()\n },\n onMessage: (event: MessageDataEvent) => {\n this.lastFrameAt = Date.now()\n this.callbacks.onMessage?.(event)\n },\n onChunk: (event: MessageChunkEvent) => {\n this.lastFrameAt = Date.now()\n this.callbacks.onChunk?.(event)\n },\n onEvent: (event: ThreadEvent) => {\n this.lastFrameAt = Date.now()\n this.callbacks.onEvent?.(event)\n },\n onError: (event: ErrorEvent) => {\n this.callbacks.onError?.(event)\n },\n onClose: () => {\n if (!this.openedSinceConnect) this.consecutivePreOpenFailures++\n this.clearTimers()\n this.scheduleReconnect()\n },\n },\n {\n depth: this.options.depth,\n includeSilent: this.options.includeSilent,\n }\n )\n } catch {\n if (generation !== this.connectGeneration || !this.shouldReconnect) return\n this.scheduleReconnect()\n return\n }\n\n if (generation !== this.connectGeneration || !this.shouldReconnect) {\n ws.close()\n return\n }\n this.ws = ws\n }\n\n /**\n * Disconnect from the thread WebSocket\n */\n disconnect(): void {\n this.connectGeneration++\n this.shouldReconnect = false\n this.clearTimers()\n\n if (this.ws) {\n this.ws.close()\n this.ws = null\n }\n\n this.reconnectAttempts = 0\n this.isReconnecting = false\n this.setStatus('disconnected')\n }\n\n /**\n * Update callbacks without reconnecting\n */\n updateCallbacks(callbacks: Partial<ThreadConnectionCallbacks>): void {\n this.callbacks = { ...this.callbacks, ...callbacks }\n }\n\n /**\n * Update options (requires reconnect to take effect for depth/includeSilent)\n */\n updateOptions(options: Partial<ThreadConnectionOptions>): void {\n this.options = { ...this.options, ...options }\n }\n\n private setStatus(status: ConnectionStatus): void {\n if (this.status !== status) {\n this.status = status\n this.callbacks.onStatusChange?.(status)\n }\n }\n\n /**\n * Passive keepalive. `stream_ping` is answered by the thread Durable\n * Object's hibernation auto-response at the edge, so it never wakes DO\n * JavaScript the way a plain `ping` did (~2 wakes/minute/socket while\n * idle). It is sent only after a full quiet interval — a socket that just\n * delivered message/chunk/event frames needs no keepalive.\n */\n private startHeartbeat(): void {\n this.clearHeartbeat()\n this.lastFrameAt = Date.now()\n\n this.heartbeatInterval = setInterval(() => {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n if (Date.now() - this.lastFrameAt >= this.options.heartbeatInterval) {\n this.ws.send('stream_ping')\n }\n }\n }, this.options.heartbeatInterval)\n }\n\n private clearHeartbeat(): void {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval)\n this.heartbeatInterval = null\n }\n }\n\n private clearReconnectTimeout(): void {\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout)\n this.reconnectTimeout = null\n }\n }\n\n private clearTimers(): void {\n this.clearHeartbeat()\n this.clearReconnectTimeout()\n }\n\n private scheduleReconnect(): void {\n if (!this.shouldReconnect || this.isReconnecting) {\n this.setStatus('disconnected')\n return\n }\n\n // Repeated never-opened failures: consult the application's auth gate\n // before another upgrade attempt. A rejected handshake's HTTP status is\n // invisible here, so only the application can tell an expired session\n // (stop and re-authenticate) from a flaky network (keep bounded retry).\n const gate = this.options.reconnectAuthGate\n if (gate && this.consecutivePreOpenFailures >= this.options.preOpenFailureThreshold) {\n this.isReconnecting = true\n this.setStatus('reconnecting')\n void Promise.resolve()\n .then(() => gate())\n .then((allowed) => {\n this.isReconnecting = false\n if (!this.shouldReconnect) return\n if (!allowed) {\n this.shouldReconnect = false\n this.setStatus('disconnected')\n return\n }\n this.scheduleReconnectDelay()\n })\n .catch(() => {\n // An erroring gate is indeterminate — keep bounded recovery.\n this.isReconnecting = false\n if (this.shouldReconnect) this.scheduleReconnectDelay()\n })\n return\n }\n\n this.scheduleReconnectDelay()\n }\n\n private scheduleReconnectDelay(): void {\n this.isReconnecting = true\n this.setStatus('reconnecting')\n\n // Exponential backoff: 1s, 2s, 4s, 8s, 16s, 30s (max), with ±25% jitter\n // so independent clients do not retry in synchronized bursts.\n const base = Math.min(\n 1000 * Math.pow(2, this.reconnectAttempts),\n this.options.maxReconnectDelay\n )\n const spread = base * 0.25\n const delay = Math.max(0, Math.round(base - spread + Math.random() * spread * 2))\n this.reconnectAttempts++\n\n this.reconnectTimeout = setTimeout(() => {\n if (this.shouldReconnect) {\n this.connect()\n }\n }, delay)\n }\n}\n","import type { Message, AttachmentRef, ThreadFile } from '../types'\n\n/**\n * Parse attachments from a message\n * Handles both JSON string and already-parsed array formats\n * Returns empty array if no attachments or invalid data\n */\nexport function parseAttachments(message: Message): AttachmentRef[] {\n if (!message.attachments) {\n return []\n }\n\n // If already an array, return it directly\n if (Array.isArray(message.attachments)) {\n return message.attachments\n }\n\n // Otherwise try to parse as JSON string\n try {\n const parsed = JSON.parse(message.attachments)\n if (!Array.isArray(parsed)) {\n return []\n }\n return parsed\n } catch {\n return []\n }\n}\n\n/**\n * Check if a MIME type represents an image\n */\nexport function isImageMimeType(mimeType: string): boolean {\n return mimeType.toLowerCase().startsWith('image/')\n}\n\n/**\n * Convert messages to ThreadFile array\n * Extracts all committed files from message attachments\n */\nexport function messagesToFiles(messages: Message[]): ThreadFile[] {\n const files: ThreadFile[] = []\n\n for (const message of messages) {\n const attachments = parseAttachments(message)\n\n for (const attachment of attachments) {\n files.push({\n id: attachment.id,\n name: attachment.name,\n mimeType: attachment.mimeType,\n size: attachment.size,\n isImage: isImageMimeType(attachment.mimeType),\n localPreviewUrl: null, // Committed files don't have local preview\n status: 'committed',\n path: attachment.path,\n width: attachment.width,\n height: attachment.height,\n messageId: message.id,\n })\n }\n }\n\n return files\n}\n","/**\n * Image processing utilities for thumbnail generation\n * These functions require a browser environment with Canvas support\n */\n\nconst THUMBNAIL_SIZE = 256\n\n/**\n * Result of processing an image file\n */\nexport interface ImageProcessingResult {\n /** Base64-encoded thumbnail data (without data URL prefix) */\n thumbnail: string\n /** Original image width */\n width: number\n /** Original image height */\n height: number\n}\n\n/**\n * Load an image from a File object\n */\nfunction loadImage(file: File): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image()\n const objectUrl = URL.createObjectURL(file)\n\n img.onload = () => {\n URL.revokeObjectURL(objectUrl)\n resolve(img)\n }\n img.onerror = () => {\n URL.revokeObjectURL(objectUrl)\n reject(new Error('Failed to load image'))\n }\n img.src = objectUrl\n })\n}\n\n/**\n * Create a thumbnail from an image element\n * Returns base64 data without the data URL prefix\n */\nfunction createThumbnailFromImage(img: HTMLImageElement): string {\n const { width, height } = img\n const aspectRatio = width / height\n\n let thumbWidth: number\n let thumbHeight: number\n\n if (aspectRatio > 1) {\n thumbWidth = Math.min(THUMBNAIL_SIZE, width)\n thumbHeight = Math.floor(thumbWidth / aspectRatio)\n } else {\n thumbHeight = Math.min(THUMBNAIL_SIZE, height)\n thumbWidth = Math.floor(thumbHeight * aspectRatio)\n }\n\n const canvas = document.createElement('canvas')\n canvas.width = thumbWidth\n canvas.height = thumbHeight\n\n const ctx = canvas.getContext('2d')\n if (!ctx) {\n throw new Error('Failed to get canvas context')\n }\n\n ctx.drawImage(img, 0, 0, thumbWidth, thumbHeight)\n\n // Return WebP for smaller size, strip data URL prefix\n const dataUrl = canvas.toDataURL('image/webp', 0.8)\n return dataUrl.split(',')[1]\n}\n\n/**\n * Process an image file to generate a thumbnail\n * @param file - The image file to process\n * @returns Promise with thumbnail data and dimensions\n */\nexport async function generateImageThumbnail(file: File): Promise<ImageProcessingResult> {\n const img = await loadImage(file)\n\n return {\n thumbnail: createThumbnailFromImage(img),\n width: img.width,\n height: img.height,\n }\n}\n\n/**\n * Check if the current environment supports Canvas (for thumbnail generation)\n */\nexport function canGenerateThumbnails(): boolean {\n return typeof document !== 'undefined' && typeof document.createElement === 'function'\n}\n","/**\n * File upload helper utilities\n */\n\n/**\n * Generate a unique ID for pending file uploads.\n * Uses timestamp + random string to ensure uniqueness.\n */\nexport function generatePendingFileId(): string {\n return `pending-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n}\n\n/**\n * Read a file as a data URL for image preview.\n * Returns a base64-encoded data URL that can be used as an image src.\n */\nexport function readFileAsDataUrl(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => resolve(reader.result as string)\n reader.onerror = reject\n reader.readAsDataURL(file)\n })\n}\n","/**\n * FileUploadManager - Framework-agnostic file upload management\n *\n * Handles the common logic for file uploads across Vue and React packages.\n * Each framework integrates this manager with its own state management.\n */\n\nimport type { ThreadFile, AttachmentRef } from '../types'\nimport type { AgentBuilderClient } from '../client/AgentBuilderClient'\nimport { isImageMimeType } from '../utils/attachments'\nimport { generateImageThumbnail } from '../utils/imageProcessing'\nimport { generatePendingFileId, readFileAsDataUrl } from '../utils/fileHelpers'\n\n/**\n * Callback for receiving file state updates during upload\n */\nexport type FileUpdateCallback = (updates: Partial<ThreadFile>) => void\n\n/**\n * Options for upload execution\n */\nexport interface UploadOptions {\n /** Generate and upload thumbnail for images (default: true) */\n generateThumbnail?: boolean\n /** Generate local preview URL for images (default: true) */\n generatePreview?: boolean\n}\n\n/**\n * FileUploadManager handles the upload lifecycle for files.\n *\n * Usage:\n * 1. Call queueFiles() to create pending file objects for immediate UI display\n * 2. Call executeUpload() for each file to start the actual upload\n * 3. Receive state updates via the callback to update your framework's state\n *\n * @example\n * ```typescript\n * const manager = new FileUploadManager()\n *\n * // Queue files for UI display\n * const pendingFiles = manager.queueFiles(selectedFiles)\n * setState(prev => [...prev, ...pendingFiles])\n *\n * // Start uploads\n * for (const pending of pendingFiles) {\n * manager.executeUpload(threadId, file, pending.id, client, (updates) => {\n * setState(prev => prev.map(f =>\n * f.id === pending.id ? { ...f, ...updates } : f\n * ))\n * })\n * }\n * ```\n */\nexport class FileUploadManager {\n /**\n * Create a pending file object from a File.\n * The returned object can be immediately added to state for UI feedback.\n */\n createPendingFile(file: File): ThreadFile {\n return {\n id: generatePendingFileId(),\n name: file.name,\n mimeType: file.type,\n size: file.size,\n isImage: isImageMimeType(file.type),\n localPreviewUrl: null,\n status: 'uploading',\n }\n }\n\n /**\n * Queue multiple files for upload.\n * Returns an array of pending file objects paired with their source File objects.\n *\n * @param files - Files to queue (File array or FileList)\n * @returns Array of [ThreadFile, File] tuples\n */\n queueFiles(files: File[] | FileList): Array<{ pending: ThreadFile; file: File }> {\n return Array.from(files).map(file => ({\n pending: this.createPendingFile(file),\n file,\n }))\n }\n\n /**\n * Execute the upload for a file.\n *\n * This method:\n * 1. Generates a local preview for images (async, non-blocking)\n * 2. Generates a thumbnail for images (if supported)\n * 3. Uploads the file to the server\n * 4. Calls onUpdate with state changes at each step\n *\n * @param threadId - The thread to upload to\n * @param file - The file to upload\n * @param pendingId - The ID of the pending file (from queueFiles)\n * @param client - The AgentBuilderClient instance\n * @param onUpdate - Callback for state updates\n * @param options - Upload options\n */\n async executeUpload(\n threadId: string,\n file: File,\n pendingId: string,\n client: AgentBuilderClient,\n onUpdate: FileUpdateCallback,\n options: UploadOptions = {}\n ): Promise<AttachmentRef> {\n const {\n generateThumbnail = true,\n generatePreview = true,\n } = options\n\n const isImage = isImageMimeType(file.type)\n\n // Generate local preview for images (async, doesn't block upload)\n if (isImage && generatePreview) {\n readFileAsDataUrl(file)\n .then(dataUrl => onUpdate({ localPreviewUrl: dataUrl }))\n .catch(err => console.error('Failed to generate preview:', err))\n }\n\n try {\n // Prepare upload options for images\n let uploadOptions: Parameters<typeof client.uploadFile>[2] | undefined\n\n if (isImage && generateThumbnail) {\n try {\n const result = await generateImageThumbnail(file)\n uploadOptions = {\n thumbnail: result.thumbnail,\n width: result.width,\n height: result.height,\n }\n } catch (err) {\n // If thumbnail generation fails, continue without it\n console.warn('Failed to generate thumbnail:', err)\n }\n }\n\n // Upload the file\n const attachment = await client.uploadFile(threadId, file, uploadOptions)\n\n // Update with server response\n onUpdate({\n id: attachment.id,\n status: 'ready',\n path: attachment.path,\n width: attachment.width,\n height: attachment.height,\n })\n\n return attachment\n } catch (err) {\n // Update with error state\n onUpdate({\n status: 'error',\n error: err instanceof Error ? err.message : 'Failed to upload file',\n })\n throw err\n }\n }\n\n /**\n * Execute uploads for multiple files in parallel.\n *\n * @param threadId - The thread to upload to\n * @param items - Array of pending/file pairs from queueFiles()\n * @param client - The AgentBuilderClient instance\n * @param onUpdate - Callback receiving (pendingId, updates) for each file\n * @param options - Upload options\n * @returns Array of upload results (AttachmentRef or Error for each file)\n */\n async executeUploads(\n threadId: string,\n items: Array<{ pending: ThreadFile; file: File }>,\n client: AgentBuilderClient,\n onUpdate: (pendingId: string, updates: Partial<ThreadFile>) => void,\n options: UploadOptions = {}\n ): Promise<Array<AttachmentRef | Error>> {\n const promises = items.map(({ pending, file }) =>\n this.executeUpload(\n threadId,\n file,\n pending.id,\n client,\n (updates) => onUpdate(pending.id, updates),\n options\n ).catch(err => err instanceof Error ? err : new Error(String(err)))\n )\n\n return Promise.all(promises)\n }\n}\n","import type { Message, WorkMessage, WorkItem, ThreadMessage } from '../types'\n\n/**\n * Transform a flat list of messages into a list with workblocks.\n * Groups consecutive assistant tool_calls and their tool results into WorkMessage objects.\n *\n * A workblock starts when an assistant message has tool_calls,\n * and continues to include ALL subsequent messages until:\n * - A user message appears\n * - An assistant message without tool_calls appears\n *\n * This means multiple assistant messages with tool_calls in a row\n * (with their tool results in between) are merged into a single workblock.\n */\nexport function transformToWorkblocks(messages: Message[]): ThreadMessage[] {\n if (messages.length === 0) {\n return []\n }\n\n const result: ThreadMessage[] = []\n let i = 0\n\n while (i < messages.length) {\n const message = messages[i]\n\n // Check if this is an assistant message with tool_calls\n if (message.role === 'assistant' && message.tool_calls) {\n // Try to parse tool_calls\n let toolCalls: any[]\n try {\n toolCalls = JSON.parse(message.tool_calls)\n } catch (error) {\n // If we can't parse tool_calls, treat it as a regular message\n result.push(message)\n i++\n continue\n }\n\n // Start building a workblock\n const workItems: WorkItem[] = []\n const contentParts: string[] = []\n let reasoningContent: string | null = message.reasoning_content || null\n let workblockStatus: 'pending' | 'completed' | 'failed' = 'completed'\n const firstMessageId = message.id\n const firstCreatedAt = message.created_at\n let latestTimestamp = Math.max(\n message.created_at,\n message.response_completed_at ?? 0\n )\n let requestSentAt = message.request_sent_at ?? message.created_at\n const depth = message.depth\n const logIds = new Set<string>()\n if (message.log_id) logIds.add(message.log_id)\n\n // Track if the current assistant message is pending\n if (message.status === 'pending') {\n workblockStatus = 'pending'\n } else if (message.status === 'failed') {\n workblockStatus = 'failed'\n }\n\n // Emit the first assistant message's text inline, before its tool calls,\n // so it renders directly above the tool calls it was returned with\n // instead of being hoisted to the top of the workblock.\n if (message.content) {\n contentParts.push(message.content)\n workItems.push({\n id: `${message.id}-content`,\n type: 'content',\n content: message.content,\n created_at: message.created_at,\n log_id: message.log_id ?? null,\n })\n }\n\n // Add tool calls as work items\n for (const toolCall of toolCalls) {\n workItems.push({\n id: toolCall.id || message.id,\n type: 'tool_call',\n name: toolCall.function?.name,\n content: toolCall.function?.arguments || null,\n status: null, // Will be updated below based on matching results\n tool_call_id: toolCall.id,\n created_at: message.created_at,\n log_id: message.log_id ?? null,\n })\n }\n\n // Continue collecting messages while we see tool results or more assistant tool_calls\n let j = i + 1\n while (j < messages.length) {\n const nextMessage = messages[j]\n\n if (nextMessage.role === 'tool') {\n latestTimestamp = Math.max(\n latestTimestamp,\n nextMessage.created_at,\n nextMessage.response_completed_at ?? 0\n )\n if (nextMessage.log_id) logIds.add(nextMessage.log_id)\n\n // Tool result - add to workblock\n const resultStatus = nextMessage.tool_status || 'pending'\n\n workItems.push({\n id: nextMessage.id,\n type: 'tool_result',\n name: nextMessage.name || undefined,\n content: nextMessage.content,\n status: resultStatus,\n tool_call_id: nextMessage.tool_call_id || undefined,\n created_at: nextMessage.created_at,\n log_id: nextMessage.log_id ?? null,\n })\n\n j++\n } else if (nextMessage.role === 'assistant' && nextMessage.tool_calls) {\n // Another assistant message with tool_calls - merge into same workblock\n let nextToolCalls: any[]\n try {\n nextToolCalls = JSON.parse(nextMessage.tool_calls)\n } catch (error) {\n // Can't parse, stop merging here\n break\n }\n\n // Update status if this message is pending/failed\n latestTimestamp = Math.max(\n latestTimestamp,\n nextMessage.created_at,\n nextMessage.response_completed_at ?? 0\n )\n requestSentAt = Math.min(\n requestSentAt,\n nextMessage.request_sent_at ?? nextMessage.created_at\n )\n if (nextMessage.log_id) logIds.add(nextMessage.log_id)\n\n // Update status if this message is pending/failed\n if (nextMessage.status === 'pending') {\n workblockStatus = 'pending'\n } else if (nextMessage.status === 'failed' && workblockStatus !== 'pending') {\n workblockStatus = 'failed'\n }\n\n // Emit this assistant message's text inline, before its tool calls,\n // preserving its position relative to the surrounding operations.\n if (nextMessage.content) {\n contentParts.push(nextMessage.content)\n workItems.push({\n id: `${nextMessage.id}-content`,\n type: 'content',\n content: nextMessage.content,\n created_at: nextMessage.created_at,\n log_id: nextMessage.log_id ?? null,\n })\n }\n\n // Collect reasoning content (use first non-null)\n if (!reasoningContent && nextMessage.reasoning_content) {\n reasoningContent = nextMessage.reasoning_content\n }\n\n // Add tool calls\n for (const toolCall of nextToolCalls) {\n workItems.push({\n id: toolCall.id || nextMessage.id,\n type: 'tool_call',\n name: toolCall.function?.name,\n content: toolCall.function?.arguments || null,\n status: null,\n tool_call_id: toolCall.id,\n created_at: nextMessage.created_at,\n log_id: nextMessage.log_id ?? null,\n })\n }\n j++\n } else {\n // User message or assistant without tool_calls - stop collecting\n break\n }\n }\n\n // Find orphaned tool_results (results without matching tool_calls) and create synthetic tool_calls\n const toolCallIds = new Set(workItems.filter(w => w.type === 'tool_call').map(w => w.tool_call_id))\n const orphanedResults = workItems.filter(\n w => w.type === 'tool_result' && w.tool_call_id && !toolCallIds.has(w.tool_call_id)\n )\n\n // Insert synthetic tool_calls for orphaned results\n for (const orphan of orphanedResults) {\n // Find the position of this orphan in workItems\n const orphanIndex = workItems.indexOf(orphan)\n // Extract tool name from error message or use generic\n const toolName = orphan.content?.match(/Tool not found: (\\w+)/)?.[1] || 'unknown_tool'\n\n // Insert a synthetic tool_call before the result\n const syntheticCall: WorkItem = {\n id: `synthetic-${orphan.tool_call_id}`,\n type: 'tool_call',\n name: toolName,\n content: null,\n status: orphan.status,\n tool_call_id: orphan.tool_call_id,\n created_at: orphan.created_at,\n log_id: orphan.log_id ?? null,\n }\n workItems.splice(orphanIndex, 0, syntheticCall)\n }\n\n // Update tool call statuses based on their matching results\n for (const item of workItems) {\n if (item.type === 'tool_call' && item.tool_call_id && item.status === null) {\n // Find matching result\n const matchingResult = workItems.find(\n wi => wi.type === 'tool_result' && wi.tool_call_id === item.tool_call_id\n )\n if (matchingResult) {\n // Tool call inherits status from its result\n item.status = matchingResult.status\n } else {\n // No result yet - tool call is pending\n item.status = 'pending'\n }\n }\n }\n\n // Combine content parts\n const combinedContent = contentParts.length > 0 ? contentParts.join('') : null\n\n // Create the workblock\n const workblock: WorkMessage = {\n id: firstMessageId,\n type: 'workblock',\n content: combinedContent,\n reasoning_content: reasoningContent,\n workItems,\n status: workblockStatus,\n created_at: firstCreatedAt,\n updated_at: latestTimestamp,\n request_sent_at: requestSentAt,\n response_completed_at: workblockStatus === 'pending' ? null : latestTimestamp,\n depth,\n log_ids: Array.from(logIds),\n }\n\n result.push(workblock)\n\n // Move index past all consumed messages\n i = j\n } else {\n // Not a workblock, pass through unchanged\n result.push(message)\n i++\n }\n }\n\n return result\n}\n","import type {\n Message,\n StatusMessage,\n SubagentBlockMessage,\n SubagentGroupBlockMessage,\n SubagentThreadMessage,\n ThreadMessage,\n WorkMessage,\n WorkItem,\n} from \"../types\"\nimport { transformToWorkblocks } from \"./workblocks\"\n\ntype TransformOptions = {\n /** Preserve tool-call workblocks around the projected subagent blocks. */\n includeWorkblocks?: boolean\n /** Thread being viewed; references to it are not projected as child subagents. */\n currentThreadId?: string\n /** Keep explicitly included silent messages in the chronological stream. */\n preserveSilentMessages?: boolean\n}\n\nconst SUBAGENT_TOOLS = new Set([\"subagent_create\", \"subagent_message\", \"send_to_agent\"])\nconst SUBAGENT_LIFECYCLE_TOOLS = new Set([...SUBAGENT_TOOLS, \"subagents\"])\nconst SUBAGENT_NAME_PATTERN = /subagent/i\n\nfunction isWorkblock(message: SubagentThreadMessage): message is WorkMessage {\n return (message as WorkMessage).type === \"workblock\"\n}\n\nfunction isStatusMessage(message: SubagentThreadMessage): message is StatusMessage {\n return (message as StatusMessage).type === \"status\"\n}\n\nfunction asOptionalString(value: unknown): string | null {\n if (typeof value !== \"string\") {\n return null\n }\n const normalized = value.trim()\n return normalized.length > 0 ? normalized : null\n}\n\nfunction getMetadataString(\n message: Message,\n key: string\n): string | null {\n if (!message.metadata || typeof message.metadata !== \"object\") {\n return null\n }\n return asOptionalString((message.metadata as Record<string, unknown>)[key])\n}\n\nfunction extractSubagentIdFromContent(content: string | null | undefined): string | null {\n if (!content) {\n return null\n }\n const fromToolResult = content.match(/Reference:\\s*([0-9a-fA-F-]{36})/)\n if (fromToolResult?.[1]) {\n return fromToolResult[1].toLowerCase()\n }\n const fromSubagentMessage = content.match(/reference:\\s*([0-9a-fA-F-]{36})/i)\n if (fromSubagentMessage?.[1]) {\n return fromSubagentMessage[1].toLowerCase()\n }\n return null\n}\n\nfunction inferSubagentStatus(message: Message): string | null {\n const explicit = asOptionalString(message.subagent_status)\n if (explicit) {\n return explicit\n }\n const content = message.content || \"\"\n if (/was initiated successfully/i.test(content) || /Message sent to subagent/i.test(content)) {\n return \"running\"\n }\n if (/has returned the following result/i.test(content)) {\n return \"idle\"\n }\n if (/has reported a failure/i.test(content) || /execution stopped before completion/i.test(content)) {\n return \"terminated\"\n }\n return null\n}\n\nfunction getSystemStatusKind(message: Message): StatusMessage[\"status_kind\"] | null {\n if (message.role !== \"system\") {\n return null\n }\n const metadataKind = getMetadataString(message, \"status_kind\")\n if (\n metadataKind === \"execution_stopped\" ||\n metadataKind === \"subagent_started\" ||\n metadataKind === \"subagent_event\"\n ) {\n return metadataKind\n }\n if (getMetadataString(message, \"subagent_event\") === \"parent_handoff\") {\n return \"subagent_event\"\n }\n const content = (message.content || \"\").trim()\n if (/execution\\s+stopped/i.test(content)) {\n return \"execution_stopped\"\n }\n if (/subagents?\\s+started:/i.test(content)) {\n return \"subagent_started\"\n }\n return null\n}\n\nfunction createSystemStatusMessage(message: Message): StatusMessage {\n const kind = getSystemStatusKind(message) ?? undefined\n return {\n id: `status:${message.id}`,\n type: \"status\",\n role: \"system\",\n content: message.content || \"Execution stopped by user\",\n created_at: message.created_at,\n depth: message.depth,\n silent: false,\n status_kind: kind,\n }\n}\n\nfunction isSubagentSignalMessage(message: Message): boolean {\n if (message.role === \"tool\" && asOptionalString(message.subagent_id)) {\n return true\n }\n\n if (message.role === \"tool\" && message.name && SUBAGENT_TOOLS.has(message.name)) {\n return true\n }\n\n const content = message.content || \"\"\n if (/subagent\\s*\\(reference:/i.test(content)) {\n return true\n }\n if (/the subagent was initiated successfully/i.test(content)) {\n return true\n }\n if (/message sent to subagent/i.test(content)) {\n return true\n }\n\n return false\n}\n\nfunction extractSubagentId(message: Message): string | null {\n const direct = asOptionalString(message.subagent_id)\n if (direct) {\n return direct\n }\n\n const metadata = message.metadata\n if (metadata && typeof metadata === \"object\") {\n const snake = asOptionalString((metadata as Record<string, unknown>).subagent_id)\n if (snake) {\n return snake\n }\n const camel = asOptionalString((metadata as Record<string, unknown>).subagentId)\n if (camel) {\n return camel\n }\n }\n\n return extractSubagentIdFromContent(message.content)\n}\n\nfunction parseToolCalls(toolCalls: string | null | undefined): Array<{\n id?: string\n function?: { name?: string }\n}> {\n if (!toolCalls) {\n return []\n }\n try {\n const parsed = JSON.parse(toolCalls)\n return Array.isArray(parsed) ? parsed : []\n } catch {\n return []\n }\n}\n\nfunction parseToolArguments(raw: string | null | undefined): Record<string, unknown> {\n if (!raw) {\n return {}\n }\n try {\n const parsed = JSON.parse(raw)\n return parsed && typeof parsed === \"object\" ? (parsed as Record<string, unknown>) : {}\n } catch {\n return {}\n }\n}\n\nfunction isLikelySubagentToolName(toolName: string | undefined): boolean {\n if (!toolName) {\n return false\n }\n if (SUBAGENT_TOOLS.has(toolName)) {\n return true\n }\n return SUBAGENT_NAME_PATTERN.test(toolName)\n}\n\nfunction getSubagentThreadNameFromWorkItem(item: WorkItem): string | null {\n const args = parseToolArguments(item.content)\n const name = asOptionalString(args.name)\n return name\n}\n\nfunction getSubagentIdFromWorkItem(\n item: WorkItem,\n toolCallIdToSubagentId: Map<string, string>\n): string | null {\n if (item.tool_call_id) {\n const mapped = toolCallIdToSubagentId.get(item.tool_call_id)\n if (mapped) {\n return mapped\n }\n }\n return extractSubagentIdFromContent(item.content)\n}\n\nfunction createSubagentBlock(\n subagentId: string,\n message: Message\n): SubagentBlockMessage {\n const inferredStatus = inferSubagentStatus(message)\n return {\n id: `subagent:${subagentId}`,\n type: \"subagent_block\",\n subagent_id: subagentId,\n subagent_name: message.subagent_name ?? null,\n subagent_title: message.subagent_title ?? null,\n subagent_description: message.subagent_description ?? null,\n subagent_status: inferredStatus ?? null,\n subagent_resumable: message.subagent_resumable ?? null,\n subagent_blocking: message.subagent_blocking ?? null,\n subagent_thread_name: message.subagent_thread_name ?? null,\n subagent_spawn_group_id: message.subagent_spawn_group_id ?? null,\n messages: [message],\n created_at: message.created_at,\n updated_at: message.created_at,\n depth: message.depth,\n }\n}\n\nfunction mergeSubagentBlock(block: SubagentBlockMessage, message: Message): void {\n block.messages.push(message)\n block.updated_at = Math.max(block.updated_at, message.created_at)\n block.created_at = Math.min(block.created_at, message.created_at)\n block.depth = message.depth ?? block.depth\n\n if (message.subagent_name !== undefined) {\n block.subagent_name = message.subagent_name ?? block.subagent_name ?? null\n }\n if (message.subagent_title !== undefined) {\n block.subagent_title = message.subagent_title ?? block.subagent_title ?? null\n }\n if (message.subagent_description !== undefined) {\n block.subagent_description =\n message.subagent_description ?? block.subagent_description ?? null\n }\n const inferredStatus = inferSubagentStatus(message)\n if (inferredStatus !== null) {\n block.subagent_status = inferredStatus\n }\n if (message.subagent_resumable !== undefined) {\n block.subagent_resumable =\n message.subagent_resumable ?? block.subagent_resumable ?? null\n }\n if (message.subagent_blocking !== undefined) {\n block.subagent_blocking =\n message.subagent_blocking ?? block.subagent_blocking ?? null\n }\n if (message.subagent_thread_name !== undefined) {\n block.subagent_thread_name =\n message.subagent_thread_name ?? block.subagent_thread_name ?? null\n }\n if (message.subagent_spawn_group_id !== undefined) {\n block.subagent_spawn_group_id =\n message.subagent_spawn_group_id ?? block.subagent_spawn_group_id ?? null\n }\n}\n\nfunction shouldSkipWorkblock(\n workblock: WorkMessage,\n resolvedSubagentIds: Set<string>\n): boolean {\n const toolCalls = workblock.workItems.filter((item) => item.type === \"tool_call\")\n if (toolCalls.length === 0) {\n return false\n }\n if (!toolCalls.every((item) => item.name && SUBAGENT_TOOLS.has(item.name))) {\n return false\n }\n return resolvedSubagentIds.size > 0\n}\n\nfunction inferBlockingFromToolResult(\n workblock: WorkMessage,\n toolCallId: string | undefined\n): boolean | null {\n if (!toolCallId) {\n return null\n }\n const result = workblock.workItems.find(\n (item) => item.type === \"tool_result\" && item.tool_call_id === toolCallId\n )\n if (!result || result.status !== \"success\") {\n return null\n }\n\n const text = (result.content || \"\").toLowerCase()\n if (text.includes(\"was initiated successfully\") || text.includes(\"results will be delivered when complete\")) {\n return false\n }\n if (text.length > 0) {\n return true\n }\n return null\n}\n\nfunction createPendingSubagentBlock(\n workblock: WorkMessage,\n toolCall: WorkItem,\n index: number,\n status: \"pending\" | \"running\"\n): SubagentBlockMessage {\n const toolName = asOptionalString(toolCall.name) ?? \"Subagent\"\n const pseudoSubagentId = toolCall.tool_call_id\n ? `pending:${toolCall.tool_call_id}`\n : `pending:${workblock.id}:${index}`\n const createdAt = workblock.created_at + index\n const isBuiltinLifecycleTool = !!toolCall.name && SUBAGENT_TOOLS.has(toolCall.name)\n\n return {\n id: `subagent:${pseudoSubagentId}`,\n type: \"subagent_block\",\n subagent_id: pseudoSubagentId,\n subagent_name: toolName,\n subagent_title: toolName,\n subagent_description: null,\n subagent_status: status,\n subagent_resumable: isBuiltinLifecycleTool ? true : false,\n subagent_blocking: isBuiltinLifecycleTool ? null : true,\n subagent_thread_name: getSubagentThreadNameFromWorkItem(toolCall),\n subagent_spawn_group_id: workblock.id,\n messages: [],\n created_at: createdAt,\n updated_at: createdAt,\n depth: workblock.depth,\n }\n}\n\ntype BlockPlacement = {\n block: SubagentBlockMessage\n startIndex: number | undefined\n displayIndex: number | undefined\n groupKey: string\n}\n\ntype BlockGroup = {\n groupKey: string\n startIndex: number | undefined\n displayIndex: number | undefined\n blocks: SubagentBlockMessage[]\n}\n\nfunction createGroupStartMarker(group: BlockGroup): StatusMessage | null {\n if (group.startIndex === undefined || group.displayIndex === undefined) {\n return null\n }\n if (group.startIndex === group.displayIndex) {\n return null\n }\n\n const names = group.blocks\n .map((block) => block.subagent_thread_name || block.subagent_title || block.subagent_name || \"Subagent\")\n .filter((name, index, arr) => arr.indexOf(name) === index)\n\n let label: string\n if (names.length <= 1) {\n label = `Subagent started: ${names[0] || \"Subagent\"}`\n } else if (names.length <= 3) {\n label = `Subagents started: ${names.join(\", \")}`\n } else {\n label = `Subagents started: ${names.length} subagents`\n }\n\n const createdAt =\n Math.min(...group.blocks.map((block) => block.created_at)) || Date.now() * 1000\n const depth = group.blocks[0]?.depth\n\n return {\n id: `subagent-start:${group.groupKey}`,\n type: \"status\",\n role: \"system\",\n content: label,\n created_at: createdAt,\n status_kind: \"subagent_started\",\n silent: false,\n depth,\n }\n}\n\nfunction getSubagentDisplayName(block: SubagentBlockMessage | undefined): string {\n return (\n block?.subagent_thread_name ||\n block?.subagent_title ||\n block?.subagent_name ||\n \"Subagent\"\n )\n}\n\nfunction createSubagentEventStatusMessage(\n message: Message,\n block: SubagentBlockMessage | undefined\n): StatusMessage | null {\n if (!message.content) {\n return null\n }\n\n const content = message.content\n const name = getSubagentDisplayName(block)\n\n let label: string | null = null\n if (/has returned the following result/i.test(content)) {\n label = `Subagent replied: ${name}`\n } else if (\n /has reported a failure/i.test(content) ||\n /execution stopped before completion/i.test(content)\n ) {\n label = `Subagent failed: ${name}`\n }\n\n if (!label) {\n return null\n }\n\n return {\n id: `status:subagent-event:${message.id}`,\n type: \"status\",\n role: \"system\",\n content: label,\n created_at: message.created_at,\n depth: message.depth,\n silent: false,\n status_kind: \"subagent_event\",\n subagent_id: block?.subagent_id ?? message.subagent_id ?? null,\n }\n}\n\nfunction buildGroupedBlock(group: BlockGroup): SubagentBlockMessage | SubagentGroupBlockMessage {\n if (group.blocks.length === 1) {\n return group.blocks[0]\n }\n\n const sorted = [...group.blocks].sort((a, b) => {\n const aName = (a.subagent_thread_name || a.subagent_title || a.subagent_name || \"\").toLowerCase()\n const bName = (b.subagent_thread_name || b.subagent_title || b.subagent_name || \"\").toLowerCase()\n if (aName !== bName) {\n return aName.localeCompare(bName)\n }\n return a.created_at - b.created_at\n })\n\n return {\n id: `subagent-group:${group.groupKey}`,\n type: \"subagent_group_block\",\n group_id: group.groupKey,\n subagents: sorted,\n created_at: Math.min(...sorted.map((block) => block.created_at)),\n updated_at: Math.max(...sorted.map((block) => block.updated_at)),\n depth: sorted[0]?.depth,\n }\n}\n\n/**\n * Transform thread messages into a stream that preserves workblocks while also\n * collapsing subagent-tagged messages into anchor-based subagent blocks.\n *\n * The subagent block is anchored to the originating `subagent_create` workblock\n * when possible, and subagent-tagged messages are rendered inside that block.\n * Pass `currentThreadId` when rendering a thread so bootstrap messages tagged\n * with that same ID remain in the thread instead of becoming a self-child card.\n */\nexport function transformToSubagentBlocks(\n messages: Message[],\n options: TransformOptions = {}\n): SubagentThreadMessage[] {\n if (messages.length === 0) {\n return []\n }\n\n const includeWorkblocks = options.includeWorkblocks ?? false\n const preserveSilentMessages = options.preserveSilentMessages ?? false\n const currentThreadId = asOptionalString(options.currentThreadId)?.toLowerCase() ?? null\n const isCurrentThread = (subagentId: string): boolean =>\n currentThreadId !== null && subagentId.toLowerCase() === currentThreadId\n const baseMessages: SubagentThreadMessage[] = includeWorkblocks\n ? (transformToWorkblocks(messages) as ThreadMessage[])\n : messages\n\n const toolCallIdToSubagentId = new Map<string, string>()\n for (const message of messages) {\n if (message.role !== \"tool\") {\n continue\n }\n if (!message.tool_call_id) {\n continue\n }\n const subagentId = extractSubagentId(message)\n if (subagentId) {\n toolCallIdToSubagentId.set(message.tool_call_id, subagentId)\n }\n }\n\n const anchorIndexBySubagentId = new Map<string, number>()\n const threadNameBySubagentId = new Map<string, string>()\n const inferredFlagsBySubagentId = new Map<\n string,\n { resumable: boolean | null; blocking: boolean | null }\n >()\n const pendingPlacements: BlockPlacement[] = []\n const skipWorkblockIndexes = new Set<number>()\n const indexByBaseEntryId = new Map<string, number>()\n\n baseMessages.forEach((entry, index) => {\n indexByBaseEntryId.set(entry.id, index)\n\n if (!isWorkblock(entry)) {\n return\n }\n\n const resolvedFromWorkblock = new Set<string>()\n const toolCalls = entry.workItems.filter((item) => item.type === \"tool_call\")\n const pendingSubagentToolCalls: WorkItem[] = []\n\n for (const toolCall of toolCalls) {\n if (!isLikelySubagentToolName(toolCall.name)) {\n continue\n }\n const subagentId = getSubagentIdFromWorkItem(toolCall, toolCallIdToSubagentId)\n if (subagentId && isCurrentThread(subagentId)) {\n continue\n }\n if (!subagentId) {\n if (\n toolCall.status === \"pending\" &&\n (!toolCall.name || !SUBAGENT_LIFECYCLE_TOOLS.has(toolCall.name))\n ) {\n pendingSubagentToolCalls.push(toolCall)\n }\n continue\n }\n resolvedFromWorkblock.add(subagentId)\n if (!anchorIndexBySubagentId.has(subagentId)) {\n anchorIndexBySubagentId.set(subagentId, index)\n }\n const threadName = getSubagentThreadNameFromWorkItem(toolCall)\n if (threadName && !threadNameBySubagentId.has(subagentId)) {\n threadNameBySubagentId.set(subagentId, threadName)\n }\n\n const currentFlags = inferredFlagsBySubagentId.get(subagentId) ?? {\n resumable: null,\n blocking: null,\n }\n if (toolCall.name === \"subagent_create\" || toolCall.name === \"subagent_message\" || toolCall.name === \"send_to_agent\") {\n currentFlags.resumable = true\n }\n if (toolCall.name === \"subagent_create\") {\n const inferredBlocking = inferBlockingFromToolResult(entry, toolCall.tool_call_id)\n if (inferredBlocking !== null) {\n currentFlags.blocking = inferredBlocking\n }\n }\n inferredFlagsBySubagentId.set(subagentId, currentFlags)\n }\n\n if (pendingSubagentToolCalls.length > 0) {\n pendingSubagentToolCalls.forEach((toolCall, pendingIndex) => {\n const pendingStatus: \"pending\" | \"running\" =\n pendingIndex === 0 ? \"running\" : \"pending\"\n const block = createPendingSubagentBlock(\n entry,\n toolCall,\n pendingIndex,\n pendingStatus\n )\n pendingPlacements.push({\n block,\n startIndex: index,\n displayIndex: index,\n groupKey: `start:${index}`,\n })\n })\n }\n\n if (shouldSkipWorkblock(entry, resolvedFromWorkblock)) {\n skipWorkblockIndexes.add(index)\n }\n })\n\n const blocksBySubagentId = new Map<string, SubagentBlockMessage>()\n const signaledSubagentIds = new Set<string>()\n for (const message of messages) {\n const subagentId = extractSubagentId(message)\n if (!subagentId || isCurrentThread(subagentId)) {\n continue\n }\n if (isSubagentSignalMessage(message)) {\n signaledSubagentIds.add(subagentId)\n }\n }\n\n for (const message of messages) {\n const subagentId = extractSubagentId(message)\n if (\n !subagentId ||\n isCurrentThread(subagentId) ||\n (preserveSilentMessages && message.silent === true) ||\n !signaledSubagentIds.has(subagentId)\n ) {\n continue\n }\n\n const existing = blocksBySubagentId.get(subagentId)\n if (!existing) {\n blocksBySubagentId.set(subagentId, createSubagentBlock(subagentId, message))\n } else {\n mergeSubagentBlock(existing, message)\n }\n }\n\n if (blocksBySubagentId.size === 0 && pendingPlacements.length === 0) {\n return baseMessages.map((entry) => {\n if (isStatusMessage(entry)) {\n return entry\n }\n if (isWorkblock(entry)) {\n return entry\n }\n const raw = entry as Message\n if (getSystemStatusKind(raw)) {\n return createSystemStatusMessage(raw)\n }\n return raw\n })\n }\n\n const placements: BlockPlacement[] = []\n const endAnchoredBlocks: SubagentBlockMessage[] = []\n\n for (const [subagentId, block] of blocksBySubagentId) {\n const inferredThreadName = threadNameBySubagentId.get(subagentId)\n if (!block.subagent_thread_name && inferredThreadName) {\n block.subagent_thread_name = inferredThreadName\n }\n const inferredFlags = inferredFlagsBySubagentId.get(subagentId)\n if (block.subagent_resumable === null && inferredFlags?.resumable !== null && inferredFlags?.resumable !== undefined) {\n block.subagent_resumable = inferredFlags.resumable\n }\n if (block.subagent_blocking === null && inferredFlags?.blocking !== null && inferredFlags?.blocking !== undefined) {\n block.subagent_blocking = inferredFlags.blocking\n }\n\n let startIndex = anchorIndexBySubagentId.get(subagentId)\n let displayIndex: number | undefined\n\n for (const childMessage of block.messages) {\n const messageIndex = indexByBaseEntryId.get(childMessage.id)\n if (messageIndex === undefined) {\n continue\n }\n if (displayIndex === undefined || messageIndex > displayIndex) {\n displayIndex = messageIndex\n }\n }\n\n if (startIndex === undefined && block.subagent_spawn_group_id) {\n startIndex = indexByBaseEntryId.get(block.subagent_spawn_group_id)\n }\n\n if (displayIndex === undefined) {\n if (startIndex !== undefined) {\n displayIndex = startIndex\n } else if (block.subagent_spawn_group_id) {\n displayIndex = indexByBaseEntryId.get(block.subagent_spawn_group_id)\n }\n }\n\n if (startIndex === undefined && displayIndex !== undefined) {\n startIndex = displayIndex\n }\n\n if (displayIndex === undefined) {\n endAnchoredBlocks.push(block)\n continue\n }\n\n const groupKey =\n block.subagent_spawn_group_id\n ? `spawn:${block.subagent_spawn_group_id}`\n : startIndex !== undefined\n ? `start:${startIndex}`\n : `subagent:${subagentId}`\n\n placements.push({\n block,\n startIndex,\n displayIndex,\n groupKey,\n })\n }\n\n for (const placement of pendingPlacements) {\n placements.push(placement)\n }\n\n const groupsByKey = new Map<string, BlockGroup>()\n for (const placement of placements) {\n const existing = groupsByKey.get(placement.groupKey)\n if (!existing) {\n groupsByKey.set(placement.groupKey, {\n groupKey: placement.groupKey,\n startIndex: placement.startIndex,\n displayIndex: placement.displayIndex,\n blocks: [placement.block],\n })\n continue\n }\n\n if (existing.startIndex === undefined) {\n existing.startIndex = placement.startIndex\n }\n if (placement.startIndex !== undefined && existing.startIndex !== undefined) {\n existing.startIndex = Math.min(existing.startIndex, placement.startIndex)\n }\n if (existing.displayIndex === undefined) {\n existing.displayIndex = placement.displayIndex\n }\n if (placement.displayIndex !== undefined && existing.displayIndex !== undefined) {\n existing.displayIndex = Math.max(existing.displayIndex, placement.displayIndex)\n }\n existing.blocks.push(placement.block)\n }\n\n const groupedByDisplayIndex = new Map<number, Array<SubagentBlockMessage | SubagentGroupBlockMessage>>()\n const startMarkersByIndex = new Map<number, StatusMessage[]>()\n const eventMarkersByIndex = new Map<number, StatusMessage[]>()\n\n for (const group of groupsByKey.values()) {\n const groupedBlock = buildGroupedBlock(group)\n if (group.displayIndex !== undefined) {\n const existing = groupedByDisplayIndex.get(group.displayIndex) ?? []\n existing.push(groupedBlock)\n groupedByDisplayIndex.set(group.displayIndex, existing)\n }\n\n const marker = createGroupStartMarker(group)\n if (marker && group.startIndex !== undefined) {\n const existing = startMarkersByIndex.get(group.startIndex) ?? []\n existing.push(marker)\n startMarkersByIndex.set(group.startIndex, existing)\n }\n }\n\n for (const rawMessage of messages) {\n if (preserveSilentMessages && rawMessage.silent === true) {\n continue\n }\n const subagentId = extractSubagentId(rawMessage)\n if (!subagentId) {\n continue\n }\n const messageIndex = indexByBaseEntryId.get(rawMessage.id)\n if (messageIndex === undefined) {\n continue\n }\n const block = blocksBySubagentId.get(subagentId)\n const marker = createSubagentEventStatusMessage(rawMessage, block)\n if (!marker) {\n continue\n }\n const existing = eventMarkersByIndex.get(messageIndex) ?? []\n existing.push(marker)\n eventMarkersByIndex.set(messageIndex, existing)\n }\n\n for (const [displayIndex, items] of groupedByDisplayIndex) {\n items.sort((a, b) => a.created_at - b.created_at)\n groupedByDisplayIndex.set(displayIndex, items)\n }\n for (const [startIndex, markers] of startMarkersByIndex) {\n markers.sort((a, b) => a.created_at - b.created_at)\n startMarkersByIndex.set(startIndex, markers)\n }\n for (const [markerIndex, markers] of eventMarkersByIndex) {\n markers.sort((a, b) => a.created_at - b.created_at)\n eventMarkersByIndex.set(markerIndex, markers)\n }\n\n endAnchoredBlocks.sort((a, b) => a.created_at - b.created_at)\n\n const result: SubagentThreadMessage[] = []\n const insertedSubagentIds = new Set<string>()\n\n for (let i = 0; i < baseMessages.length; i++) {\n const startMarkers = startMarkersByIndex.get(i) ?? []\n for (const marker of startMarkers) {\n result.push(marker)\n }\n\n const eventMarkers = eventMarkersByIndex.get(i) ?? []\n for (const marker of eventMarkers) {\n result.push(marker)\n }\n\n const displayBlocks = groupedByDisplayIndex.get(i) ?? []\n for (const item of displayBlocks) {\n if ((item as SubagentGroupBlockMessage).type === \"subagent_group_block\") {\n const group = item as SubagentGroupBlockMessage\n for (const block of group.subagents) {\n insertedSubagentIds.add(block.subagent_id)\n }\n result.push(group)\n } else {\n const block = item as SubagentBlockMessage\n if (!insertedSubagentIds.has(block.subagent_id)) {\n result.push(block)\n insertedSubagentIds.add(block.subagent_id)\n }\n }\n }\n\n const entry = baseMessages[i]\n if (isStatusMessage(entry)) {\n result.push(entry)\n continue\n }\n\n if (isWorkblock(entry)) {\n if (skipWorkblockIndexes.has(i)) {\n continue\n }\n result.push(entry)\n continue\n }\n\n const rawEntry = entry as Message\n if (getSystemStatusKind(rawEntry)) {\n result.push(createSystemStatusMessage(rawEntry))\n continue\n }\n\n const rawSubagentId = extractSubagentId(rawEntry)\n if (\n rawSubagentId &&\n !isCurrentThread(rawSubagentId) &&\n !(preserveSilentMessages && rawEntry.silent === true)\n ) {\n continue\n }\n result.push(rawEntry)\n }\n\n for (const block of endAnchoredBlocks) {\n if (!insertedSubagentIds.has(block.subagent_id)) {\n result.push(block)\n insertedSubagentIds.add(block.subagent_id)\n }\n }\n\n return result\n}\n"],"mappings":";AAeA,IAAM,iBAAiB;AAEhB,IAAM,qBAAN,MAAyB;AAAA,EACtB;AAAA,EAER,YAAY,UAAkB;AAE5B,SAAK,WAAW,SAAS,QAAQ,OAAO,EAAE;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,cAAsB;AACpB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,SAA+C;AAChE,UAAM,WAAW,MAAM,MAAM,GAAG,KAAK,QAAQ,YAAY;AAAA,MACvD,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,GAAG,KAAK,WAAW;AAAA,QACnB,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU,OAAO;AAAA,IAC9B,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,4BAA4B,SAAS,UAAU,EAAE;AAAA,IACnE;AAEA,WAAO,SAAS,KAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,IAA6B;AAC3C,UAAM,WAAW,MAAM,MAAM,GAAG,KAAK,QAAQ,YAAY,EAAE,IAAI;AAAA,MAC7D,QAAQ;AAAA,MACR,SAAS,KAAK,WAAW;AAAA,IAC3B,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,yBAAyB,SAAS,UAAU,EAAE;AAAA,IAChE;AAEA,WAAO,SAAS,KAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YACJ,IACA,UAA8B,CAAC,GACX;AACpB,UAAM,OAAO,MAAM,KAAK,gBAAgB,IAAI,OAAO;AACnD,WAAO,KAAK,YAAY,CAAC;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBACJ,IACA,UAA8B,CAAC,GACR;AACvB,UAAM,SAAS,IAAI,gBAAgB;AAEnC,QAAI,QAAQ,UAAU,OAAW,QAAO,IAAI,SAAS,OAAO,QAAQ,KAAK,CAAC;AAC1E,QAAI,QAAQ,WAAW,OAAW,QAAO,IAAI,UAAU,OAAO,QAAQ,MAAM,CAAC;AAC7E,QAAI,QAAQ,UAAU,OAAW,QAAO,IAAI,SAAS,OAAO,QAAQ,KAAK,CAAC;AAC1E,QAAI,QAAQ,kBAAkB,OAAW,QAAO,IAAI,iBAAiB,OAAO,QAAQ,aAAa,CAAC;AAClG,QAAI,QAAQ,QAAQ,UAAa,QAAQ,IAAI,SAAS,EAAG,QAAO,IAAI,OAAO,QAAQ,IAAI,KAAK,GAAG,CAAC;AAChG,QAAI,QAAQ,sBAAsB,OAAW,QAAO,IAAI,qBAAqB,OAAO,QAAQ,iBAAiB,CAAC;AAE9G,UAAM,cAAc,OAAO,SAAS;AACpC,UAAM,MAAM,GAAG,KAAK,QAAQ,YAAY,EAAE,YAAY,cAAc,IAAI,WAAW,KAAK,EAAE;AAE1F,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR,SAAS,KAAK,WAAW;AAAA,IAC3B,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,2BAA2B,SAAS,UAAU,EAAE;AAAA,IAClE;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,WAAO;AAAA,MACL,UAAU,KAAK,YAAY,CAAC;AAAA,MAC5B,OAAO,KAAK,SAAS;AAAA,MACrB,SAAS,CAAC,CAAC,KAAK;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YACJ,IACA,SACkB;AAClB,UAAM,WAAW,MAAM,MAAM,GAAG,KAAK,QAAQ,YAAY,EAAE,aAAa;AAAA,MACtE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,GAAG,KAAK,WAAW;AAAA,QACnB,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU,OAAO;AAAA,IAC9B,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,2BAA2B,SAAS,UAAU,EAAE;AAAA,IAClE;AAEA,WAAO,SAAS,KAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,IAA2B;AAC7C,UAAM,WAAW,MAAM,MAAM,GAAG,KAAK,QAAQ,YAAY,EAAE,SAAS;AAAA,MAClE,QAAQ;AAAA,MACR,SAAS,KAAK,WAAW;AAAA,IAC3B,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,6BAA6B,SAAS,UAAU,EAAE;AAAA,IACpE;AAEA,UAAM,SAAS,KAAK;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,cACJ,UACA,WAC+B;AAC/B,UAAM,WAAW,MAAM;AAAA,MACrB,GAAG,KAAK,QAAQ,YAAY,QAAQ,aAAa,SAAS;AAAA,MAC1D;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,KAAK,WAAW;AAAA,MAC3B;AAAA,IACF;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,6BAA6B,SAAS,UAAU,EAAE;AAAA,IACpE;AAEA,WAAO,SAAS,KAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,WACJ,UACA,MACA,SAKwB;AACxB,UAAM,kBAAkB,mBAAmB,KAAK,IAAI;AACpD,UAAM,MAAM,GAAG,KAAK,QAAQ,YAAY,QAAQ,OAAO,eAAe;AAGtE,QAAI,SAAS,WAAW;AACtB,YAAM,aAAa,MAAM,KAAK,aAAa,IAAI;AAE/C,YAAMA,YAAW,MAAM,MAAM,KAAK;AAAA,QAChC,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,GAAG,KAAK,WAAW;AAAA,UACnB,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB,MAAM;AAAA,UACN,UAAU,KAAK;AAAA,UACf,WAAW,QAAQ;AAAA,UACnB,UAAU;AAAA,YACR,OAAO,QAAQ;AAAA,YACf,QAAQ,QAAQ;AAAA,UAClB;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAED,UAAI,CAACA,UAAS,IAAI;AAChB,cAAM,IAAI,MAAM,0BAA0BA,UAAS,UAAU,EAAE;AAAA,MACjE;AAEA,aAAOA,UAAS,KAAK;AAAA,IACvB;AAGA,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,GAAG,KAAK,WAAW;AAAA,QACnB,gBAAgB,KAAK;AAAA,MACvB;AAAA,MACA,MAAM;AAAA,IACR,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,0BAA0B,SAAS,UAAU,EAAE;AAAA,IACjE;AAEA,WAAO,SAAS,KAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,MAA6B;AAChD,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,SAAS,IAAI,WAAW;AAC9B,aAAO,SAAS,MAAM;AACpB,cAAM,SAAS,OAAO;AAEtB,cAAM,SAAS,OAAO,MAAM,GAAG,EAAE,CAAC;AAClC,gBAAQ,MAAM;AAAA,MAChB;AACA,aAAO,UAAU,MAAM,OAAO,IAAI,MAAM,qBAAqB,CAAC;AAC9D,aAAO,cAAc,IAAI;AAAA,IAC3B,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,UAAkB,MAAsB;AAEjD,UAAM,iBAAiB,KAAK,WAAW,GAAG,IAAI,KAAK,MAAM,CAAC,IAAI;AAC9D,UAAM,cAAc,eACjB,MAAM,GAAG,EACT,IAAI,aAAW,mBAAmB,OAAO,CAAC,EAC1C,KAAK,GAAG;AAEX,WAAO,GAAG,KAAK,QAAQ,YAAY,QAAQ,OAAO,WAAW;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,UAAkB,MAAsB;AACtD,WAAO,GAAG,KAAK,WAAW,UAAU,IAAI,CAAC;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,UAAU,UAQZ;AAEF,UAAM,WAAW,MAAM;AAAA,MACrB,GAAG,KAAK,QAAQ,YAAY,QAAQ;AAAA,MACpC;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,KAAK,WAAW;AAAA,MAC3B;AAAA,IACF;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,yBAAyB,SAAS,UAAU,EAAE;AAAA,IAChE;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,WAAO,KAAK,SAAS,CAAC;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,wBACJ,IACA,YAAuC,CAAC,GACxC,UAAuD,CAAC,GACpC;AACpB,UAAM,QAAQ,IAAI,gBAAgB;AAClC,QAAI,QAAQ,kBAAkB,OAAW,OAAM,IAAI,iBAAiB,OAAO,QAAQ,aAAa,CAAC;AACjG,QAAI,QAAQ,UAAU,OAAW,OAAM,IAAI,SAAS,OAAO,QAAQ,KAAK,CAAC;AAEzE,UAAM,MAAM,MAAM,KAAK,iBAAiB,YAAY,EAAE,WAAW,KAAK;AACtE,UAAM,KAAK,IAAI,UAAU,GAAG;AAE5B,OAAG,SAAS,MAAM;AAChB,gBAAU,SAAS;AAAA,IACrB;AAEA,OAAG,YAAY,CAAC,UAAU;AACxB,UAAI;AAGF,YACE,OAAO,MAAM,SAAS,aACrB,MAAM,SAAS,UAAU,MAAM,SAAS,gBACzC;AACA;AAAA,QACF;AAEA,cAAM,OAAO,KAAK,MAAM,MAAM,IAAI;AAElC,gBAAQ,KAAK,MAAM;AAAA,UACjB,KAAK;AACH,sBAAU,YAAY,IAAI;AAC1B;AAAA,UACF,KAAK;AACH,sBAAU,UAAU,IAAI;AACxB;AAAA,UACF,KAAK;AACH,sBAAU,UAAU,IAAmB;AACvC;AAAA,UACF,KAAK;AACH,sBAAU,UAAU,IAAI;AACxB;AAAA,QACJ;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,MAAM,sCAAsC,KAAK;AAAA,MAC3D;AAAA,IACF;AAEA,OAAG,UAAU,CAAC,UAAU;AACtB,cAAQ,MAAM,oBAAoB,KAAK;AACvC,gBAAU,UAAU,EAAE,MAAM,SAAS,OAAO,6BAA6B,CAAC;AAAA,IAC5E;AAEA,OAAG,UAAU,CAAC,UAAU;AACtB,cAAQ,IAAI,yDAAyD,MAAM,IAAI,aAAa,MAAM,UAAU,MAAM,eAAe,MAAM,QAAQ,EAAE;AACjJ,gBAAU,UAAU;AAAA,IACtB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBACJ,IACA,YAAmC,CAAC,GAChB;AACpB,UAAM,MAAM,MAAM,KAAK,iBAAiB,YAAY,EAAE,EAAE;AACxD,UAAM,KAAK,IAAI,UAAU,GAAG;AAE5B,OAAG,SAAS,MAAM;AAChB,gBAAU,SAAS;AAAA,IACrB;AAEA,OAAG,YAAY,CAAC,UAAU;AACxB,UAAI;AAGF,YACE,OAAO,MAAM,SAAS,aACrB,MAAM,SAAS,UAAU,MAAM,SAAS,gBACzC;AACA;AAAA,QACF;AAEA,cAAM,OAAO,KAAK,MAAM,MAAM,IAAI;AAElC,gBAAQ,KAAK,MAAM;AAAA,UACjB,KAAK;AACH,sBAAU,QAAQ,IAAI;AACtB;AAAA,UACF,KAAK;AACH,sBAAU,WAAW,IAAI;AACzB;AAAA,UACF,KAAK;AACH,sBAAU,YAAY,IAAI;AAC1B;AAAA,UACF,KAAK;AACH,sBAAU,WAAW,IAAI;AACzB;AAAA,QACJ;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,MAAM,sCAAsC,KAAK;AAAA,MAC3D;AAAA,IACF;AAEA,OAAG,UAAU,CAAC,UAAU;AACtB,cAAQ,MAAM,oBAAoB,KAAK;AAAA,IACzC;AAEA,OAAG,UAAU,MAAM;AACjB,gBAAU,UAAU;AAAA,IACtB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAqC;AAC3C,UAAM,UAAkC,CAAC;AACzC,UAAM,QAAQ,KAAK,SAAS;AAE5B,QAAI,OAAO;AACT,cAAQ,eAAe,IAAI,UAAU,KAAK;AAAA,IAC5C;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,WAA0B;AAChC,WAAO,OAAO,iBAAiB,cAC3B,aAAa,QAAQ,cAAc,IACnC;AAAA,EACN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,iBACZ,QACA,QAAyB,IAAI,gBAAgB,GAC5B;AACjB,UAAM,cAAc,KAAK,eAAe;AACxC,UAAM,WAAW,GAAG,YAAY,SAAS,QAAQ,OAAO,EAAE,CAAC,GAAG,MAAM;AACpE,UAAM,QAAQ,KAAK,SAAS;AAC5B,QAAI,OAAO;AACT,YAAM,WAAW,MAAM,MAAM,GAAG,KAAK,QAAQ,0BAA0B;AAAA,QACrE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,GAAG,KAAK,WAAW;AAAA,UACnB,gBAAgB;AAAA,QAClB;AAAA,QACA,MAAM,KAAK,UAAU,EAAE,SAAS,CAAC;AAAA,MACnC,CAAC;AACD,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,IAAI,MAAM,oCAAoC,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AAAA,MAC9F;AACA,YAAM,UAAU,MAAM,SAAS,KAAK;AACpC,UAAI,OAAO,QAAQ,WAAW,YAAY,CAAC,QAAQ,QAAQ;AACzD,cAAM,IAAI,MAAM,oDAAoD;AAAA,MACtE;AACA,YAAM,IAAI,UAAU,QAAQ,MAAM;AAAA,IACpC;AACA,UAAM,QAAQ,MAAM,SAAS;AAC7B,WAAO,GAAG,KAAK,qBAAqB,CAAC,GAAG,MAAM,GAAG,QAAQ,IAAI,KAAK,KAAK,EAAE;AAAA,EAC3E;AAAA,EAEQ,iBAAsB;AAC5B,UAAM,OACJ,OAAO,aAAa,cAChB,SAAS,OACT;AACN,WAAO,IAAI,IAAI,KAAK,UAAU,IAAI;AAAA,EACpC;AAAA,EAEQ,uBAA+B;AACrC,UAAM,cAAc,KAAK,eAAe;AACxC,gBAAY,WAAW,YAAY,aAAa,WAAW,SAAS;AACpE,WAAO,YAAY,SAAS,EAAE,QAAQ,OAAO,EAAE;AAAA,EACjD;AACF;;;ACtcO,IAAM,0BAAN,MAA8B;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAGA,KAAuB;AAAA,EACvB,oBAA4B;AAAA,EAC5B,SAA2B;AAAA,EAC3B,oBAA4B;AAAA,EAC5B,mBAAyD;AAAA,EACzD,oBAA2D;AAAA,EAC3D,iBAA0B;AAAA,EAC1B,kBAA2B;AAAA;AAAA,EAE3B,cAAsB;AAAA;AAAA,EAEtB,6BAAqC;AAAA,EACrC,qBAA8B;AAAA,EAEtC,YACE,QACA,UACA,YAAuC,CAAC,GACxC,UAAmC,CAAC,GACpC;AACA,SAAK,SAAS;AACd,SAAK,WAAW;AAChB,SAAK,YAAY;AACjB,SAAK,UAAU;AAAA,MACb,OAAO,QAAQ,SAAS;AAAA,MACxB,eAAe,QAAQ,iBAAiB;AAAA,MACxC,mBAAmB,QAAQ,qBAAqB;AAAA,MAChD,mBAAmB,QAAQ,qBAAqB;AAAA,MAChD,mBAAmB,QAAQ;AAAA,MAC3B,yBAAyB,QAAQ,2BAA2B;AAAA,IAC9D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAA8B;AAC5B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,cAAsB;AACpB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,SAAK,KAAK,aAAa;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAA8B;AAClC,QAAI,KAAK,MAAM,KAAK,GAAG,eAAe,UAAU,QAAQ;AAEtD;AAAA,IACF;AAEA,UAAM,aAAa,EAAE,KAAK;AAC1B,SAAK,kBAAkB;AACvB,SAAK,iBAAiB;AACtB,SAAK,qBAAqB;AAC1B,SAAK,UAAU,YAAY;AAE3B,QAAI;AACJ,QAAI;AACF,WAAK,MAAM,KAAK,OAAO;AAAA,QACrB,KAAK;AAAA,QACL;AAAA,UACE,QAAQ,MAAM;AACZ,iBAAK,UAAU,WAAW;AAC1B,iBAAK,oBAAoB;AACzB,iBAAK,iBAAiB;AACtB,iBAAK,6BAA6B;AAClC,iBAAK,qBAAqB;AAC1B,iBAAK,eAAe;AAAA,UACtB;AAAA,UACA,WAAW,CAAC,UAA4B;AACtC,iBAAK,cAAc,KAAK,IAAI;AAC5B,iBAAK,UAAU,YAAY,KAAK;AAAA,UAClC;AAAA,UACA,SAAS,CAAC,UAA6B;AACrC,iBAAK,cAAc,KAAK,IAAI;AAC5B,iBAAK,UAAU,UAAU,KAAK;AAAA,UAChC;AAAA,UACA,SAAS,CAAC,UAAuB;AAC/B,iBAAK,cAAc,KAAK,IAAI;AAC5B,iBAAK,UAAU,UAAU,KAAK;AAAA,UAChC;AAAA,UACA,SAAS,CAAC,UAAsB;AAC9B,iBAAK,UAAU,UAAU,KAAK;AAAA,UAChC;AAAA,UACA,SAAS,MAAM;AACb,gBAAI,CAAC,KAAK,mBAAoB,MAAK;AACnC,iBAAK,YAAY;AACjB,iBAAK,kBAAkB;AAAA,UACzB;AAAA,QACF;AAAA,QACA;AAAA,UACE,OAAO,KAAK,QAAQ;AAAA,UACpB,eAAe,KAAK,QAAQ;AAAA,QAC9B;AAAA,MACF;AAAA,IACF,QAAQ;AACN,UAAI,eAAe,KAAK,qBAAqB,CAAC,KAAK,gBAAiB;AACpE,WAAK,kBAAkB;AACvB;AAAA,IACF;AAEA,QAAI,eAAe,KAAK,qBAAqB,CAAC,KAAK,iBAAiB;AAClE,SAAG,MAAM;AACT;AAAA,IACF;AACA,SAAK,KAAK;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA,EAKA,aAAmB;AACjB,SAAK;AACL,SAAK,kBAAkB;AACvB,SAAK,YAAY;AAEjB,QAAI,KAAK,IAAI;AACX,WAAK,GAAG,MAAM;AACd,WAAK,KAAK;AAAA,IACZ;AAEA,SAAK,oBAAoB;AACzB,SAAK,iBAAiB;AACtB,SAAK,UAAU,cAAc;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,WAAqD;AACnE,SAAK,YAAY,EAAE,GAAG,KAAK,WAAW,GAAG,UAAU;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,SAAiD;AAC7D,SAAK,UAAU,EAAE,GAAG,KAAK,SAAS,GAAG,QAAQ;AAAA,EAC/C;AAAA,EAEQ,UAAU,QAAgC;AAChD,QAAI,KAAK,WAAW,QAAQ;AAC1B,WAAK,SAAS;AACd,WAAK,UAAU,iBAAiB,MAAM;AAAA,IACxC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,iBAAuB;AAC7B,SAAK,eAAe;AACpB,SAAK,cAAc,KAAK,IAAI;AAE5B,SAAK,oBAAoB,YAAY,MAAM;AACzC,UAAI,KAAK,MAAM,KAAK,GAAG,eAAe,UAAU,MAAM;AACpD,YAAI,KAAK,IAAI,IAAI,KAAK,eAAe,KAAK,QAAQ,mBAAmB;AACnE,eAAK,GAAG,KAAK,aAAa;AAAA,QAC5B;AAAA,MACF;AAAA,IACF,GAAG,KAAK,QAAQ,iBAAiB;AAAA,EACnC;AAAA,EAEQ,iBAAuB;AAC7B,QAAI,KAAK,mBAAmB;AAC1B,oBAAc,KAAK,iBAAiB;AACpC,WAAK,oBAAoB;AAAA,IAC3B;AAAA,EACF;AAAA,EAEQ,wBAA8B;AACpC,QAAI,KAAK,kBAAkB;AACzB,mBAAa,KAAK,gBAAgB;AAClC,WAAK,mBAAmB;AAAA,IAC1B;AAAA,EACF;AAAA,EAEQ,cAAoB;AAC1B,SAAK,eAAe;AACpB,SAAK,sBAAsB;AAAA,EAC7B;AAAA,EAEQ,oBAA0B;AAChC,QAAI,CAAC,KAAK,mBAAmB,KAAK,gBAAgB;AAChD,WAAK,UAAU,cAAc;AAC7B;AAAA,IACF;AAMA,UAAM,OAAO,KAAK,QAAQ;AAC1B,QAAI,QAAQ,KAAK,8BAA8B,KAAK,QAAQ,yBAAyB;AACnF,WAAK,iBAAiB;AACtB,WAAK,UAAU,cAAc;AAC7B,WAAK,QAAQ,QAAQ,EAClB,KAAK,MAAM,KAAK,CAAC,EACjB,KAAK,CAAC,YAAY;AACjB,aAAK,iBAAiB;AACtB,YAAI,CAAC,KAAK,gBAAiB;AAC3B,YAAI,CAAC,SAAS;AACZ,eAAK,kBAAkB;AACvB,eAAK,UAAU,cAAc;AAC7B;AAAA,QACF;AACA,aAAK,uBAAuB;AAAA,MAC9B,CAAC,EACA,MAAM,MAAM;AAEX,aAAK,iBAAiB;AACtB,YAAI,KAAK,gBAAiB,MAAK,uBAAuB;AAAA,MACxD,CAAC;AACH;AAAA,IACF;AAEA,SAAK,uBAAuB;AAAA,EAC9B;AAAA,EAEQ,yBAA+B;AACrC,SAAK,iBAAiB;AACtB,SAAK,UAAU,cAAc;AAI7B,UAAM,OAAO,KAAK;AAAA,MAChB,MAAO,KAAK,IAAI,GAAG,KAAK,iBAAiB;AAAA,MACzC,KAAK,QAAQ;AAAA,IACf;AACA,UAAM,SAAS,OAAO;AACtB,UAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,SAAS,KAAK,OAAO,IAAI,SAAS,CAAC,CAAC;AAChF,SAAK;AAEL,SAAK,mBAAmB,WAAW,MAAM;AACvC,UAAI,KAAK,iBAAiB;AACxB,aAAK,QAAQ;AAAA,MACf;AAAA,IACF,GAAG,KAAK;AAAA,EACV;AACF;;;ACpTO,SAAS,iBAAiB,SAAmC;AAClE,MAAI,CAAC,QAAQ,aAAa;AACxB,WAAO,CAAC;AAAA,EACV;AAGA,MAAI,MAAM,QAAQ,QAAQ,WAAW,GAAG;AACtC,WAAO,QAAQ;AAAA,EACjB;AAGA,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,QAAQ,WAAW;AAC7C,QAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,aAAO,CAAC;AAAA,IACV;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAKO,SAAS,gBAAgB,UAA2B;AACzD,SAAO,SAAS,YAAY,EAAE,WAAW,QAAQ;AACnD;AAMO,SAAS,gBAAgB,UAAmC;AACjE,QAAM,QAAsB,CAAC;AAE7B,aAAW,WAAW,UAAU;AAC9B,UAAM,cAAc,iBAAiB,OAAO;AAE5C,eAAW,cAAc,aAAa;AACpC,YAAM,KAAK;AAAA,QACT,IAAI,WAAW;AAAA,QACf,MAAM,WAAW;AAAA,QACjB,UAAU,WAAW;AAAA,QACrB,MAAM,WAAW;AAAA,QACjB,SAAS,gBAAgB,WAAW,QAAQ;AAAA,QAC5C,iBAAiB;AAAA;AAAA,QACjB,QAAQ;AAAA,QACR,MAAM,WAAW;AAAA,QACjB,OAAO,WAAW;AAAA,QAClB,QAAQ,WAAW;AAAA,QACnB,WAAW,QAAQ;AAAA,MACrB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;;;AC3DA,IAAM,iBAAiB;AAiBvB,SAAS,UAAU,MAAuC;AACxD,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,MAAM,IAAI,MAAM;AACtB,UAAM,YAAY,IAAI,gBAAgB,IAAI;AAE1C,QAAI,SAAS,MAAM;AACjB,UAAI,gBAAgB,SAAS;AAC7B,cAAQ,GAAG;AAAA,IACb;AACA,QAAI,UAAU,MAAM;AAClB,UAAI,gBAAgB,SAAS;AAC7B,aAAO,IAAI,MAAM,sBAAsB,CAAC;AAAA,IAC1C;AACA,QAAI,MAAM;AAAA,EACZ,CAAC;AACH;AAMA,SAAS,yBAAyB,KAA+B;AAC/D,QAAM,EAAE,OAAO,OAAO,IAAI;AAC1B,QAAM,cAAc,QAAQ;AAE5B,MAAI;AACJ,MAAI;AAEJ,MAAI,cAAc,GAAG;AACnB,iBAAa,KAAK,IAAI,gBAAgB,KAAK;AAC3C,kBAAc,KAAK,MAAM,aAAa,WAAW;AAAA,EACnD,OAAO;AACL,kBAAc,KAAK,IAAI,gBAAgB,MAAM;AAC7C,iBAAa,KAAK,MAAM,cAAc,WAAW;AAAA,EACnD;AAEA,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,QAAQ;AACf,SAAO,SAAS;AAEhB,QAAM,MAAM,OAAO,WAAW,IAAI;AAClC,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,MAAM,8BAA8B;AAAA,EAChD;AAEA,MAAI,UAAU,KAAK,GAAG,GAAG,YAAY,WAAW;AAGhD,QAAM,UAAU,OAAO,UAAU,cAAc,GAAG;AAClD,SAAO,QAAQ,MAAM,GAAG,EAAE,CAAC;AAC7B;AAOA,eAAsB,uBAAuB,MAA4C;AACvF,QAAM,MAAM,MAAM,UAAU,IAAI;AAEhC,SAAO;AAAA,IACL,WAAW,yBAAyB,GAAG;AAAA,IACvC,OAAO,IAAI;AAAA,IACX,QAAQ,IAAI;AAAA,EACd;AACF;AAKO,SAAS,wBAAiC;AAC/C,SAAO,OAAO,aAAa,eAAe,OAAO,SAAS,kBAAkB;AAC9E;;;ACtFO,SAAS,wBAAgC;AAC9C,SAAO,WAAW,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC;AACzE;AAMO,SAAS,kBAAkB,MAA6B;AAC7D,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,SAAS,IAAI,WAAW;AAC9B,WAAO,SAAS,MAAM,QAAQ,OAAO,MAAgB;AACrD,WAAO,UAAU;AACjB,WAAO,cAAc,IAAI;AAAA,EAC3B,CAAC;AACH;;;AC+BO,IAAM,oBAAN,MAAwB;AAAA;AAAA;AAAA;AAAA;AAAA,EAK7B,kBAAkB,MAAwB;AACxC,WAAO;AAAA,MACL,IAAI,sBAAsB;AAAA,MAC1B,MAAM,KAAK;AAAA,MACX,UAAU,KAAK;AAAA,MACf,MAAM,KAAK;AAAA,MACX,SAAS,gBAAgB,KAAK,IAAI;AAAA,MAClC,iBAAiB;AAAA,MACjB,QAAQ;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,WAAW,OAAsE;AAC/E,WAAO,MAAM,KAAK,KAAK,EAAE,IAAI,WAAS;AAAA,MACpC,SAAS,KAAK,kBAAkB,IAAI;AAAA,MACpC;AAAA,IACF,EAAE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,MAAM,cACJ,UACA,MACA,WACA,QACA,UACA,UAAyB,CAAC,GACF;AACxB,UAAM;AAAA,MACJ,oBAAoB;AAAA,MACpB,kBAAkB;AAAA,IACpB,IAAI;AAEJ,UAAM,UAAU,gBAAgB,KAAK,IAAI;AAGzC,QAAI,WAAW,iBAAiB;AAC9B,wBAAkB,IAAI,EACnB,KAAK,aAAW,SAAS,EAAE,iBAAiB,QAAQ,CAAC,CAAC,EACtD,MAAM,SAAO,QAAQ,MAAM,+BAA+B,GAAG,CAAC;AAAA,IACnE;AAEA,QAAI;AAEF,UAAI;AAEJ,UAAI,WAAW,mBAAmB;AAChC,YAAI;AACF,gBAAM,SAAS,MAAM,uBAAuB,IAAI;AAChD,0BAAgB;AAAA,YACd,WAAW,OAAO;AAAA,YAClB,OAAO,OAAO;AAAA,YACd,QAAQ,OAAO;AAAA,UACjB;AAAA,QACF,SAAS,KAAK;AAEZ,kBAAQ,KAAK,iCAAiC,GAAG;AAAA,QACnD;AAAA,MACF;AAGA,YAAM,aAAa,MAAM,OAAO,WAAW,UAAU,MAAM,aAAa;AAGxE,eAAS;AAAA,QACP,IAAI,WAAW;AAAA,QACf,QAAQ;AAAA,QACR,MAAM,WAAW;AAAA,QACjB,OAAO,WAAW;AAAA,QAClB,QAAQ,WAAW;AAAA,MACrB,CAAC;AAED,aAAO;AAAA,IACT,SAAS,KAAK;AAEZ,eAAS;AAAA,QACP,QAAQ;AAAA,QACR,OAAO,eAAe,QAAQ,IAAI,UAAU;AAAA,MAC9C,CAAC;AACD,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,eACJ,UACA,OACA,QACA,UACA,UAAyB,CAAC,GACa;AACvC,UAAM,WAAW,MAAM;AAAA,MAAI,CAAC,EAAE,SAAS,KAAK,MAC1C,KAAK;AAAA,QACH;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,QACA,CAAC,YAAY,SAAS,QAAQ,IAAI,OAAO;AAAA,QACzC;AAAA,MACF,EAAE,MAAM,SAAO,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC,CAAC;AAAA,IACpE;AAEA,WAAO,QAAQ,IAAI,QAAQ;AAAA,EAC7B;AACF;;;ACpLO,SAAS,sBAAsB,UAAsC;AAC1E,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,SAA0B,CAAC;AACjC,MAAI,IAAI;AAER,SAAO,IAAI,SAAS,QAAQ;AAC1B,UAAM,UAAU,SAAS,CAAC;AAG1B,QAAI,QAAQ,SAAS,eAAe,QAAQ,YAAY;AAEtD,UAAI;AACJ,UAAI;AACF,oBAAY,KAAK,MAAM,QAAQ,UAAU;AAAA,MAC3C,SAAS,OAAO;AAEd,eAAO,KAAK,OAAO;AACnB;AACA;AAAA,MACF;AAGA,YAAM,YAAwB,CAAC;AAC/B,YAAM,eAAyB,CAAC;AAChC,UAAI,mBAAkC,QAAQ,qBAAqB;AACnE,UAAI,kBAAsD;AAC1D,YAAM,iBAAiB,QAAQ;AAC/B,YAAM,iBAAiB,QAAQ;AAC/B,UAAI,kBAAkB,KAAK;AAAA,QACzB,QAAQ;AAAA,QACR,QAAQ,yBAAyB;AAAA,MACnC;AACA,UAAI,gBAAgB,QAAQ,mBAAmB,QAAQ;AACvD,YAAM,QAAQ,QAAQ;AACtB,YAAM,SAAS,oBAAI,IAAY;AAC/B,UAAI,QAAQ,OAAQ,QAAO,IAAI,QAAQ,MAAM;AAG7C,UAAI,QAAQ,WAAW,WAAW;AAChC,0BAAkB;AAAA,MACpB,WAAW,QAAQ,WAAW,UAAU;AACtC,0BAAkB;AAAA,MACpB;AAKA,UAAI,QAAQ,SAAS;AACnB,qBAAa,KAAK,QAAQ,OAAO;AACjC,kBAAU,KAAK;AAAA,UACb,IAAI,GAAG,QAAQ,EAAE;AAAA,UACjB,MAAM;AAAA,UACN,SAAS,QAAQ;AAAA,UACjB,YAAY,QAAQ;AAAA,UACpB,QAAQ,QAAQ,UAAU;AAAA,QAC5B,CAAC;AAAA,MACH;AAGA,iBAAW,YAAY,WAAW;AAChC,kBAAU,KAAK;AAAA,UACb,IAAI,SAAS,MAAM,QAAQ;AAAA,UAC3B,MAAM;AAAA,UACN,MAAM,SAAS,UAAU;AAAA,UACzB,SAAS,SAAS,UAAU,aAAa;AAAA,UACzC,QAAQ;AAAA;AAAA,UACR,cAAc,SAAS;AAAA,UACvB,YAAY,QAAQ;AAAA,UACpB,QAAQ,QAAQ,UAAU;AAAA,QAC5B,CAAC;AAAA,MACH;AAGA,UAAI,IAAI,IAAI;AACZ,aAAO,IAAI,SAAS,QAAQ;AAC1B,cAAM,cAAc,SAAS,CAAC;AAE9B,YAAI,YAAY,SAAS,QAAQ;AAC/B,4BAAkB,KAAK;AAAA,YACrB;AAAA,YACA,YAAY;AAAA,YACZ,YAAY,yBAAyB;AAAA,UACvC;AACA,cAAI,YAAY,OAAQ,QAAO,IAAI,YAAY,MAAM;AAGrD,gBAAM,eAAe,YAAY,eAAe;AAEhD,oBAAU,KAAK;AAAA,YACb,IAAI,YAAY;AAAA,YAChB,MAAM;AAAA,YACN,MAAM,YAAY,QAAQ;AAAA,YAC1B,SAAS,YAAY;AAAA,YACrB,QAAQ;AAAA,YACR,cAAc,YAAY,gBAAgB;AAAA,YAC1C,YAAY,YAAY;AAAA,YACxB,QAAQ,YAAY,UAAU;AAAA,UAChC,CAAC;AAED;AAAA,QACF,WAAW,YAAY,SAAS,eAAe,YAAY,YAAY;AAErE,cAAI;AACJ,cAAI;AACF,4BAAgB,KAAK,MAAM,YAAY,UAAU;AAAA,UACnD,SAAS,OAAO;AAEd;AAAA,UACF;AAGA,4BAAkB,KAAK;AAAA,YACrB;AAAA,YACA,YAAY;AAAA,YACZ,YAAY,yBAAyB;AAAA,UACvC;AACA,0BAAgB,KAAK;AAAA,YACnB;AAAA,YACA,YAAY,mBAAmB,YAAY;AAAA,UAC7C;AACA,cAAI,YAAY,OAAQ,QAAO,IAAI,YAAY,MAAM;AAGrD,cAAI,YAAY,WAAW,WAAW;AACpC,8BAAkB;AAAA,UACpB,WAAW,YAAY,WAAW,YAAY,oBAAoB,WAAW;AAC3E,8BAAkB;AAAA,UACpB;AAIA,cAAI,YAAY,SAAS;AACvB,yBAAa,KAAK,YAAY,OAAO;AACrC,sBAAU,KAAK;AAAA,cACb,IAAI,GAAG,YAAY,EAAE;AAAA,cACrB,MAAM;AAAA,cACN,SAAS,YAAY;AAAA,cACrB,YAAY,YAAY;AAAA,cACxB,QAAQ,YAAY,UAAU;AAAA,YAChC,CAAC;AAAA,UACH;AAGA,cAAI,CAAC,oBAAoB,YAAY,mBAAmB;AACtD,+BAAmB,YAAY;AAAA,UACjC;AAGA,qBAAW,YAAY,eAAe;AACpC,sBAAU,KAAK;AAAA,cACb,IAAI,SAAS,MAAM,YAAY;AAAA,cAC/B,MAAM;AAAA,cACN,MAAM,SAAS,UAAU;AAAA,cACzB,SAAS,SAAS,UAAU,aAAa;AAAA,cACzC,QAAQ;AAAA,cACR,cAAc,SAAS;AAAA,cACvB,YAAY,YAAY;AAAA,cACxB,QAAQ,YAAY,UAAU;AAAA,YAChC,CAAC;AAAA,UACH;AACA;AAAA,QACF,OAAO;AAEL;AAAA,QACF;AAAA,MACF;AAGA,YAAM,cAAc,IAAI,IAAI,UAAU,OAAO,OAAK,EAAE,SAAS,WAAW,EAAE,IAAI,OAAK,EAAE,YAAY,CAAC;AAClG,YAAM,kBAAkB,UAAU;AAAA,QAChC,OAAK,EAAE,SAAS,iBAAiB,EAAE,gBAAgB,CAAC,YAAY,IAAI,EAAE,YAAY;AAAA,MACpF;AAGA,iBAAW,UAAU,iBAAiB;AAEpC,cAAM,cAAc,UAAU,QAAQ,MAAM;AAE5C,cAAM,WAAW,OAAO,SAAS,MAAM,uBAAuB,IAAI,CAAC,KAAK;AAGxE,cAAM,gBAA0B;AAAA,UAC9B,IAAI,aAAa,OAAO,YAAY;AAAA,UACpC,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS;AAAA,UACT,QAAQ,OAAO;AAAA,UACf,cAAc,OAAO;AAAA,UACrB,YAAY,OAAO;AAAA,UACnB,QAAQ,OAAO,UAAU;AAAA,QAC3B;AACA,kBAAU,OAAO,aAAa,GAAG,aAAa;AAAA,MAChD;AAGA,iBAAW,QAAQ,WAAW;AAC5B,YAAI,KAAK,SAAS,eAAe,KAAK,gBAAgB,KAAK,WAAW,MAAM;AAE1E,gBAAM,iBAAiB,UAAU;AAAA,YAC/B,QAAM,GAAG,SAAS,iBAAiB,GAAG,iBAAiB,KAAK;AAAA,UAC9D;AACA,cAAI,gBAAgB;AAElB,iBAAK,SAAS,eAAe;AAAA,UAC/B,OAAO;AAEL,iBAAK,SAAS;AAAA,UAChB;AAAA,QACF;AAAA,MACF;AAGA,YAAM,kBAAkB,aAAa,SAAS,IAAI,aAAa,KAAK,EAAE,IAAI;AAG1E,YAAM,YAAyB;AAAA,QAC7B,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,mBAAmB;AAAA,QACnB;AAAA,QACA,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,iBAAiB;AAAA,QACjB,uBAAuB,oBAAoB,YAAY,OAAO;AAAA,QAC9D;AAAA,QACA,SAAS,MAAM,KAAK,MAAM;AAAA,MAC5B;AAEA,aAAO,KAAK,SAAS;AAGrB,UAAI;AAAA,IACN,OAAO;AAEL,aAAO,KAAK,OAAO;AACnB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;AC9OA,IAAM,iBAAiB,oBAAI,IAAI,CAAC,mBAAmB,oBAAoB,eAAe,CAAC;AACvF,IAAM,2BAA2B,oBAAI,IAAI,CAAC,GAAG,gBAAgB,WAAW,CAAC;AACzE,IAAM,wBAAwB;AAE9B,SAAS,YAAY,SAAwD;AAC3E,SAAQ,QAAwB,SAAS;AAC3C;AAEA,SAAS,gBAAgB,SAA0D;AACjF,SAAQ,QAA0B,SAAS;AAC7C;AAEA,SAAS,iBAAiB,OAA+B;AACvD,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AACA,QAAM,aAAa,MAAM,KAAK;AAC9B,SAAO,WAAW,SAAS,IAAI,aAAa;AAC9C;AAEA,SAAS,kBACP,SACA,KACe;AACf,MAAI,CAAC,QAAQ,YAAY,OAAO,QAAQ,aAAa,UAAU;AAC7D,WAAO;AAAA,EACT;AACA,SAAO,iBAAkB,QAAQ,SAAqC,GAAG,CAAC;AAC5E;AAEA,SAAS,6BAA6B,SAAmD;AACvF,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,QAAM,iBAAiB,QAAQ,MAAM,iCAAiC;AACtE,MAAI,iBAAiB,CAAC,GAAG;AACvB,WAAO,eAAe,CAAC,EAAE,YAAY;AAAA,EACvC;AACA,QAAM,sBAAsB,QAAQ,MAAM,kCAAkC;AAC5E,MAAI,sBAAsB,CAAC,GAAG;AAC5B,WAAO,oBAAoB,CAAC,EAAE,YAAY;AAAA,EAC5C;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,SAAiC;AAC5D,QAAM,WAAW,iBAAiB,QAAQ,eAAe;AACzD,MAAI,UAAU;AACZ,WAAO;AAAA,EACT;AACA,QAAM,UAAU,QAAQ,WAAW;AACnC,MAAI,8BAA8B,KAAK,OAAO,KAAK,4BAA4B,KAAK,OAAO,GAAG;AAC5F,WAAO;AAAA,EACT;AACA,MAAI,qCAAqC,KAAK,OAAO,GAAG;AACtD,WAAO;AAAA,EACT;AACA,MAAI,0BAA0B,KAAK,OAAO,KAAK,uCAAuC,KAAK,OAAO,GAAG;AACnG,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,SAAuD;AAClF,MAAI,QAAQ,SAAS,UAAU;AAC7B,WAAO;AAAA,EACT;AACA,QAAM,eAAe,kBAAkB,SAAS,aAAa;AAC7D,MACE,iBAAiB,uBACjB,iBAAiB,sBACjB,iBAAiB,kBACjB;AACA,WAAO;AAAA,EACT;AACA,MAAI,kBAAkB,SAAS,gBAAgB,MAAM,kBAAkB;AACrE,WAAO;AAAA,EACT;AACA,QAAM,WAAW,QAAQ,WAAW,IAAI,KAAK;AAC7C,MAAI,uBAAuB,KAAK,OAAO,GAAG;AACxC,WAAO;AAAA,EACT;AACA,MAAI,yBAAyB,KAAK,OAAO,GAAG;AAC1C,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,0BAA0B,SAAiC;AAClE,QAAM,OAAO,oBAAoB,OAAO,KAAK;AAC7C,SAAO;AAAA,IACL,IAAI,UAAU,QAAQ,EAAE;AAAA,IACxB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS,QAAQ,WAAW;AAAA,IAC5B,YAAY,QAAQ;AAAA,IACpB,OAAO,QAAQ;AAAA,IACf,QAAQ;AAAA,IACR,aAAa;AAAA,EACf;AACF;AAEA,SAAS,wBAAwB,SAA2B;AAC1D,MAAI,QAAQ,SAAS,UAAU,iBAAiB,QAAQ,WAAW,GAAG;AACpE,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,SAAS,UAAU,QAAQ,QAAQ,eAAe,IAAI,QAAQ,IAAI,GAAG;AAC/E,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,QAAQ,WAAW;AACnC,MAAI,2BAA2B,KAAK,OAAO,GAAG;AAC5C,WAAO;AAAA,EACT;AACA,MAAI,2CAA2C,KAAK,OAAO,GAAG;AAC5D,WAAO;AAAA,EACT;AACA,MAAI,4BAA4B,KAAK,OAAO,GAAG;AAC7C,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,SAAiC;AAC1D,QAAM,SAAS,iBAAiB,QAAQ,WAAW;AACnD,MAAI,QAAQ;AACV,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,QAAQ;AACzB,MAAI,YAAY,OAAO,aAAa,UAAU;AAC5C,UAAM,QAAQ,iBAAkB,SAAqC,WAAW;AAChF,QAAI,OAAO;AACT,aAAO;AAAA,IACT;AACA,UAAM,QAAQ,iBAAkB,SAAqC,UAAU;AAC/E,QAAI,OAAO;AACT,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO,6BAA6B,QAAQ,OAAO;AACrD;AAiBA,SAAS,mBAAmB,KAAyD;AACnF,MAAI,CAAC,KAAK;AACR,WAAO,CAAC;AAAA,EACV;AACA,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,WAAO,UAAU,OAAO,WAAW,WAAY,SAAqC,CAAC;AAAA,EACvF,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,yBAAyB,UAAuC;AACvE,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AACA,MAAI,eAAe,IAAI,QAAQ,GAAG;AAChC,WAAO;AAAA,EACT;AACA,SAAO,sBAAsB,KAAK,QAAQ;AAC5C;AAEA,SAAS,kCAAkC,MAA+B;AACxE,QAAM,OAAO,mBAAmB,KAAK,OAAO;AAC5C,QAAM,OAAO,iBAAiB,KAAK,IAAI;AACvC,SAAO;AACT;AAEA,SAAS,0BACP,MACA,wBACe;AACf,MAAI,KAAK,cAAc;AACrB,UAAM,SAAS,uBAAuB,IAAI,KAAK,YAAY;AAC3D,QAAI,QAAQ;AACV,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,6BAA6B,KAAK,OAAO;AAClD;AAEA,SAAS,oBACP,YACA,SACsB;AACtB,QAAM,iBAAiB,oBAAoB,OAAO;AAClD,SAAO;AAAA,IACL,IAAI,YAAY,UAAU;AAAA,IAC1B,MAAM;AAAA,IACN,aAAa;AAAA,IACb,eAAe,QAAQ,iBAAiB;AAAA,IACxC,gBAAgB,QAAQ,kBAAkB;AAAA,IAC1C,sBAAsB,QAAQ,wBAAwB;AAAA,IACtD,iBAAiB,kBAAkB;AAAA,IACnC,oBAAoB,QAAQ,sBAAsB;AAAA,IAClD,mBAAmB,QAAQ,qBAAqB;AAAA,IAChD,sBAAsB,QAAQ,wBAAwB;AAAA,IACtD,yBAAyB,QAAQ,2BAA2B;AAAA,IAC5D,UAAU,CAAC,OAAO;AAAA,IAClB,YAAY,QAAQ;AAAA,IACpB,YAAY,QAAQ;AAAA,IACpB,OAAO,QAAQ;AAAA,EACjB;AACF;AAEA,SAAS,mBAAmB,OAA6B,SAAwB;AAC/E,QAAM,SAAS,KAAK,OAAO;AAC3B,QAAM,aAAa,KAAK,IAAI,MAAM,YAAY,QAAQ,UAAU;AAChE,QAAM,aAAa,KAAK,IAAI,MAAM,YAAY,QAAQ,UAAU;AAChE,QAAM,QAAQ,QAAQ,SAAS,MAAM;AAErC,MAAI,QAAQ,kBAAkB,QAAW;AACvC,UAAM,gBAAgB,QAAQ,iBAAiB,MAAM,iBAAiB;AAAA,EACxE;AACA,MAAI,QAAQ,mBAAmB,QAAW;AACxC,UAAM,iBAAiB,QAAQ,kBAAkB,MAAM,kBAAkB;AAAA,EAC3E;AACA,MAAI,QAAQ,yBAAyB,QAAW;AAC9C,UAAM,uBACJ,QAAQ,wBAAwB,MAAM,wBAAwB;AAAA,EAClE;AACA,QAAM,iBAAiB,oBAAoB,OAAO;AAClD,MAAI,mBAAmB,MAAM;AAC3B,UAAM,kBAAkB;AAAA,EAC1B;AACA,MAAI,QAAQ,uBAAuB,QAAW;AAC5C,UAAM,qBACJ,QAAQ,sBAAsB,MAAM,sBAAsB;AAAA,EAC9D;AACA,MAAI,QAAQ,sBAAsB,QAAW;AAC3C,UAAM,oBACJ,QAAQ,qBAAqB,MAAM,qBAAqB;AAAA,EAC5D;AACA,MAAI,QAAQ,yBAAyB,QAAW;AAC9C,UAAM,uBACJ,QAAQ,wBAAwB,MAAM,wBAAwB;AAAA,EAClE;AACA,MAAI,QAAQ,4BAA4B,QAAW;AACjD,UAAM,0BACJ,QAAQ,2BAA2B,MAAM,2BAA2B;AAAA,EACxE;AACF;AAEA,SAAS,oBACP,WACA,qBACS;AACT,QAAM,YAAY,UAAU,UAAU,OAAO,CAAC,SAAS,KAAK,SAAS,WAAW;AAChF,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO;AAAA,EACT;AACA,MAAI,CAAC,UAAU,MAAM,CAAC,SAAS,KAAK,QAAQ,eAAe,IAAI,KAAK,IAAI,CAAC,GAAG;AAC1E,WAAO;AAAA,EACT;AACA,SAAO,oBAAoB,OAAO;AACpC;AAEA,SAAS,4BACP,WACA,YACgB;AAChB,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AACA,QAAM,SAAS,UAAU,UAAU;AAAA,IACjC,CAAC,SAAS,KAAK,SAAS,iBAAiB,KAAK,iBAAiB;AAAA,EACjE;AACA,MAAI,CAAC,UAAU,OAAO,WAAW,WAAW;AAC1C,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,OAAO,WAAW,IAAI,YAAY;AAChD,MAAI,KAAK,SAAS,4BAA4B,KAAK,KAAK,SAAS,yCAAyC,GAAG;AAC3G,WAAO;AAAA,EACT;AACA,MAAI,KAAK,SAAS,GAAG;AACnB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,2BACP,WACA,UACA,OACA,QACsB;AACtB,QAAM,WAAW,iBAAiB,SAAS,IAAI,KAAK;AACpD,QAAM,mBAAmB,SAAS,eAC9B,WAAW,SAAS,YAAY,KAChC,WAAW,UAAU,EAAE,IAAI,KAAK;AACpC,QAAM,YAAY,UAAU,aAAa;AACzC,QAAM,yBAAyB,CAAC,CAAC,SAAS,QAAQ,eAAe,IAAI,SAAS,IAAI;AAElF,SAAO;AAAA,IACL,IAAI,YAAY,gBAAgB;AAAA,IAChC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,sBAAsB;AAAA,IACtB,iBAAiB;AAAA,IACjB,oBAAoB,yBAAyB,OAAO;AAAA,IACpD,mBAAmB,yBAAyB,OAAO;AAAA,IACnD,sBAAsB,kCAAkC,QAAQ;AAAA,IAChE,yBAAyB,UAAU;AAAA,IACnC,UAAU,CAAC;AAAA,IACX,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,OAAO,UAAU;AAAA,EACnB;AACF;AAgBA,SAAS,uBAAuB,OAAyC;AACvE,MAAI,MAAM,eAAe,UAAa,MAAM,iBAAiB,QAAW;AACtE,WAAO;AAAA,EACT;AACA,MAAI,MAAM,eAAe,MAAM,cAAc;AAC3C,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,MAAM,OACjB,IAAI,CAAC,UAAU,MAAM,wBAAwB,MAAM,kBAAkB,MAAM,iBAAiB,UAAU,EACtG,OAAO,CAAC,MAAM,OAAO,QAAQ,IAAI,QAAQ,IAAI,MAAM,KAAK;AAE3D,MAAI;AACJ,MAAI,MAAM,UAAU,GAAG;AACrB,YAAQ,qBAAqB,MAAM,CAAC,KAAK,UAAU;AAAA,EACrD,WAAW,MAAM,UAAU,GAAG;AAC5B,YAAQ,sBAAsB,MAAM,KAAK,IAAI,CAAC;AAAA,EAChD,OAAO;AACL,YAAQ,sBAAsB,MAAM,MAAM;AAAA,EAC5C;AAEA,QAAM,YACJ,KAAK,IAAI,GAAG,MAAM,OAAO,IAAI,CAAC,UAAU,MAAM,UAAU,CAAC,KAAK,KAAK,IAAI,IAAI;AAC7E,QAAM,QAAQ,MAAM,OAAO,CAAC,GAAG;AAE/B,SAAO;AAAA,IACL,IAAI,kBAAkB,MAAM,QAAQ;AAAA,IACpC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,QAAQ;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,uBAAuB,OAAiD;AAC/E,SACE,OAAO,wBACP,OAAO,kBACP,OAAO,iBACP;AAEJ;AAEA,SAAS,iCACP,SACA,OACsB;AACtB,MAAI,CAAC,QAAQ,SAAS;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,QAAQ;AACxB,QAAM,OAAO,uBAAuB,KAAK;AAEzC,MAAI,QAAuB;AAC3B,MAAI,qCAAqC,KAAK,OAAO,GAAG;AACtD,YAAQ,qBAAqB,IAAI;AAAA,EACnC,WACE,0BAA0B,KAAK,OAAO,KACtC,uCAAuC,KAAK,OAAO,GACnD;AACA,YAAQ,oBAAoB,IAAI;AAAA,EAClC;AAEA,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,IAAI,yBAAyB,QAAQ,EAAE;AAAA,IACvC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,IACT,YAAY,QAAQ;AAAA,IACpB,OAAO,QAAQ;AAAA,IACf,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,aAAa,OAAO,eAAe,QAAQ,eAAe;AAAA,EAC5D;AACF;AAEA,SAAS,kBAAkB,OAAqE;AAC9F,MAAI,MAAM,OAAO,WAAW,GAAG;AAC7B,WAAO,MAAM,OAAO,CAAC;AAAA,EACvB;AAEA,QAAM,SAAS,CAAC,GAAG,MAAM,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM;AAC9C,UAAM,SAAS,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,iBAAiB,IAAI,YAAY;AAChG,UAAM,SAAS,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,iBAAiB,IAAI,YAAY;AAChG,QAAI,UAAU,OAAO;AACnB,aAAO,MAAM,cAAc,KAAK;AAAA,IAClC;AACA,WAAO,EAAE,aAAa,EAAE;AAAA,EAC1B,CAAC;AAED,SAAO;AAAA,IACL,IAAI,kBAAkB,MAAM,QAAQ;AAAA,IACpC,MAAM;AAAA,IACN,UAAU,MAAM;AAAA,IAChB,WAAW;AAAA,IACX,YAAY,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,UAAU,CAAC;AAAA,IAC/D,YAAY,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,UAAU,MAAM,UAAU,CAAC;AAAA,IAC/D,OAAO,OAAO,CAAC,GAAG;AAAA,EACpB;AACF;AAWO,SAAS,0BACd,UACA,UAA4B,CAAC,GACJ;AACzB,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,oBAAoB,QAAQ,qBAAqB;AACvD,QAAM,yBAAyB,QAAQ,0BAA0B;AACjE,QAAM,kBAAkB,iBAAiB,QAAQ,eAAe,GAAG,YAAY,KAAK;AACpF,QAAM,kBAAkB,CAAC,eACvB,oBAAoB,QAAQ,WAAW,YAAY,MAAM;AAC3D,QAAM,eAAwC,oBACzC,sBAAsB,QAAQ,IAC/B;AAEJ,QAAM,yBAAyB,oBAAI,IAAoB;AACvD,aAAW,WAAW,UAAU;AAC9B,QAAI,QAAQ,SAAS,QAAQ;AAC3B;AAAA,IACF;AACA,QAAI,CAAC,QAAQ,cAAc;AACzB;AAAA,IACF;AACA,UAAM,aAAa,kBAAkB,OAAO;AAC5C,QAAI,YAAY;AACd,6BAAuB,IAAI,QAAQ,cAAc,UAAU;AAAA,IAC7D;AAAA,EACF;AAEA,QAAM,0BAA0B,oBAAI,IAAoB;AACxD,QAAM,yBAAyB,oBAAI,IAAoB;AACvD,QAAM,4BAA4B,oBAAI,IAGpC;AACF,QAAM,oBAAsC,CAAC;AAC7C,QAAM,uBAAuB,oBAAI,IAAY;AAC7C,QAAM,qBAAqB,oBAAI,IAAoB;AAEnD,eAAa,QAAQ,CAAC,OAAO,UAAU;AACrC,uBAAmB,IAAI,MAAM,IAAI,KAAK;AAEtC,QAAI,CAAC,YAAY,KAAK,GAAG;AACvB;AAAA,IACF;AAEA,UAAM,wBAAwB,oBAAI,IAAY;AAC9C,UAAM,YAAY,MAAM,UAAU,OAAO,CAAC,SAAS,KAAK,SAAS,WAAW;AAC5E,UAAM,2BAAuC,CAAC;AAE9C,eAAW,YAAY,WAAW;AAChC,UAAI,CAAC,yBAAyB,SAAS,IAAI,GAAG;AAC5C;AAAA,MACF;AACA,YAAM,aAAa,0BAA0B,UAAU,sBAAsB;AAC7E,UAAI,cAAc,gBAAgB,UAAU,GAAG;AAC7C;AAAA,MACF;AACA,UAAI,CAAC,YAAY;AACf,YACE,SAAS,WAAW,cACnB,CAAC,SAAS,QAAQ,CAAC,yBAAyB,IAAI,SAAS,IAAI,IAC9D;AACA,mCAAyB,KAAK,QAAQ;AAAA,QACxC;AACA;AAAA,MACF;AACA,4BAAsB,IAAI,UAAU;AACpC,UAAI,CAAC,wBAAwB,IAAI,UAAU,GAAG;AAC5C,gCAAwB,IAAI,YAAY,KAAK;AAAA,MAC/C;AACA,YAAM,aAAa,kCAAkC,QAAQ;AAC7D,UAAI,cAAc,CAAC,uBAAuB,IAAI,UAAU,GAAG;AACzD,+BAAuB,IAAI,YAAY,UAAU;AAAA,MACnD;AAEA,YAAM,eAAe,0BAA0B,IAAI,UAAU,KAAK;AAAA,QAChE,WAAW;AAAA,QACX,UAAU;AAAA,MACZ;AACA,UAAI,SAAS,SAAS,qBAAqB,SAAS,SAAS,sBAAsB,SAAS,SAAS,iBAAiB;AACpH,qBAAa,YAAY;AAAA,MAC3B;AACA,UAAI,SAAS,SAAS,mBAAmB;AACvC,cAAM,mBAAmB,4BAA4B,OAAO,SAAS,YAAY;AACjF,YAAI,qBAAqB,MAAM;AAC7B,uBAAa,WAAW;AAAA,QAC1B;AAAA,MACF;AACA,gCAA0B,IAAI,YAAY,YAAY;AAAA,IACxD;AAEA,QAAI,yBAAyB,SAAS,GAAG;AACvC,+BAAyB,QAAQ,CAAC,UAAU,iBAAiB;AAC3D,cAAM,gBACJ,iBAAiB,IAAI,YAAY;AACnC,cAAM,QAAQ;AAAA,UACZ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,0BAAkB,KAAK;AAAA,UACrB;AAAA,UACA,YAAY;AAAA,UACZ,cAAc;AAAA,UACd,UAAU,SAAS,KAAK;AAAA,QAC1B,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAEA,QAAI,oBAAoB,OAAO,qBAAqB,GAAG;AACrD,2BAAqB,IAAI,KAAK;AAAA,IAChC;AAAA,EACF,CAAC;AAED,QAAM,qBAAqB,oBAAI,IAAkC;AACjE,QAAM,sBAAsB,oBAAI,IAAY;AAC5C,aAAW,WAAW,UAAU;AAC9B,UAAM,aAAa,kBAAkB,OAAO;AAC5C,QAAI,CAAC,cAAc,gBAAgB,UAAU,GAAG;AAC9C;AAAA,IACF;AACA,QAAI,wBAAwB,OAAO,GAAG;AACpC,0BAAoB,IAAI,UAAU;AAAA,IACpC;AAAA,EACF;AAEA,aAAW,WAAW,UAAU;AAC9B,UAAM,aAAa,kBAAkB,OAAO;AAC5C,QACE,CAAC,cACD,gBAAgB,UAAU,KACzB,0BAA0B,QAAQ,WAAW,QAC9C,CAAC,oBAAoB,IAAI,UAAU,GACnC;AACA;AAAA,IACF;AAEA,UAAM,WAAW,mBAAmB,IAAI,UAAU;AAClD,QAAI,CAAC,UAAU;AACb,yBAAmB,IAAI,YAAY,oBAAoB,YAAY,OAAO,CAAC;AAAA,IAC7E,OAAO;AACL,yBAAmB,UAAU,OAAO;AAAA,IACtC;AAAA,EACF;AAEA,MAAI,mBAAmB,SAAS,KAAK,kBAAkB,WAAW,GAAG;AACnE,WAAO,aAAa,IAAI,CAAC,UAAU;AACjC,UAAI,gBAAgB,KAAK,GAAG;AAC1B,eAAO;AAAA,MACT;AACA,UAAI,YAAY,KAAK,GAAG;AACtB,eAAO;AAAA,MACT;AACA,YAAM,MAAM;AACZ,UAAI,oBAAoB,GAAG,GAAG;AAC5B,eAAO,0BAA0B,GAAG;AAAA,MACtC;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,QAAM,aAA+B,CAAC;AACtC,QAAM,oBAA4C,CAAC;AAEnD,aAAW,CAAC,YAAY,KAAK,KAAK,oBAAoB;AACpD,UAAM,qBAAqB,uBAAuB,IAAI,UAAU;AAChE,QAAI,CAAC,MAAM,wBAAwB,oBAAoB;AACrD,YAAM,uBAAuB;AAAA,IAC/B;AACA,UAAM,gBAAgB,0BAA0B,IAAI,UAAU;AAC9D,QAAI,MAAM,uBAAuB,QAAQ,eAAe,cAAc,QAAQ,eAAe,cAAc,QAAW;AACpH,YAAM,qBAAqB,cAAc;AAAA,IAC3C;AACA,QAAI,MAAM,sBAAsB,QAAQ,eAAe,aAAa,QAAQ,eAAe,aAAa,QAAW;AACjH,YAAM,oBAAoB,cAAc;AAAA,IAC1C;AAEA,QAAI,aAAa,wBAAwB,IAAI,UAAU;AACvD,QAAI;AAEJ,eAAW,gBAAgB,MAAM,UAAU;AACzC,YAAM,eAAe,mBAAmB,IAAI,aAAa,EAAE;AAC3D,UAAI,iBAAiB,QAAW;AAC9B;AAAA,MACF;AACA,UAAI,iBAAiB,UAAa,eAAe,cAAc;AAC7D,uBAAe;AAAA,MACjB;AAAA,IACF;AAEA,QAAI,eAAe,UAAa,MAAM,yBAAyB;AAC7D,mBAAa,mBAAmB,IAAI,MAAM,uBAAuB;AAAA,IACnE;AAEA,QAAI,iBAAiB,QAAW;AAC9B,UAAI,eAAe,QAAW;AAC5B,uBAAe;AAAA,MACjB,WAAW,MAAM,yBAAyB;AACxC,uBAAe,mBAAmB,IAAI,MAAM,uBAAuB;AAAA,MACrE;AAAA,IACF;AAEA,QAAI,eAAe,UAAa,iBAAiB,QAAW;AAC1D,mBAAa;AAAA,IACf;AAEA,QAAI,iBAAiB,QAAW;AAC9B,wBAAkB,KAAK,KAAK;AAC5B;AAAA,IACF;AAEA,UAAM,WACJ,MAAM,0BACF,SAAS,MAAM,uBAAuB,KACtC,eAAe,SACb,SAAS,UAAU,KACnB,YAAY,UAAU;AAE9B,eAAW,KAAK;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,aAAW,aAAa,mBAAmB;AACzC,eAAW,KAAK,SAAS;AAAA,EAC3B;AAEA,QAAM,cAAc,oBAAI,IAAwB;AAChD,aAAW,aAAa,YAAY;AAClC,UAAM,WAAW,YAAY,IAAI,UAAU,QAAQ;AACnD,QAAI,CAAC,UAAU;AACb,kBAAY,IAAI,UAAU,UAAU;AAAA,QAClC,UAAU,UAAU;AAAA,QACpB,YAAY,UAAU;AAAA,QACtB,cAAc,UAAU;AAAA,QACxB,QAAQ,CAAC,UAAU,KAAK;AAAA,MAC1B,CAAC;AACD;AAAA,IACF;AAEA,QAAI,SAAS,eAAe,QAAW;AACrC,eAAS,aAAa,UAAU;AAAA,IAClC;AACA,QAAI,UAAU,eAAe,UAAa,SAAS,eAAe,QAAW;AAC3E,eAAS,aAAa,KAAK,IAAI,SAAS,YAAY,UAAU,UAAU;AAAA,IAC1E;AACA,QAAI,SAAS,iBAAiB,QAAW;AACvC,eAAS,eAAe,UAAU;AAAA,IACpC;AACA,QAAI,UAAU,iBAAiB,UAAa,SAAS,iBAAiB,QAAW;AAC/E,eAAS,eAAe,KAAK,IAAI,SAAS,cAAc,UAAU,YAAY;AAAA,IAChF;AACA,aAAS,OAAO,KAAK,UAAU,KAAK;AAAA,EACtC;AAEA,QAAM,wBAAwB,oBAAI,IAAqE;AACvG,QAAM,sBAAsB,oBAAI,IAA6B;AAC7D,QAAM,sBAAsB,oBAAI,IAA6B;AAE7D,aAAW,SAAS,YAAY,OAAO,GAAG;AACxC,UAAM,eAAe,kBAAkB,KAAK;AAC5C,QAAI,MAAM,iBAAiB,QAAW;AACpC,YAAM,WAAW,sBAAsB,IAAI,MAAM,YAAY,KAAK,CAAC;AACnE,eAAS,KAAK,YAAY;AAC1B,4BAAsB,IAAI,MAAM,cAAc,QAAQ;AAAA,IACxD;AAEA,UAAM,SAAS,uBAAuB,KAAK;AAC3C,QAAI,UAAU,MAAM,eAAe,QAAW;AAC5C,YAAM,WAAW,oBAAoB,IAAI,MAAM,UAAU,KAAK,CAAC;AAC/D,eAAS,KAAK,MAAM;AACpB,0BAAoB,IAAI,MAAM,YAAY,QAAQ;AAAA,IACpD;AAAA,EACF;AAEA,aAAW,cAAc,UAAU;AACjC,QAAI,0BAA0B,WAAW,WAAW,MAAM;AACxD;AAAA,IACF;AACA,UAAM,aAAa,kBAAkB,UAAU;AAC/C,QAAI,CAAC,YAAY;AACf;AAAA,IACF;AACA,UAAM,eAAe,mBAAmB,IAAI,WAAW,EAAE;AACzD,QAAI,iBAAiB,QAAW;AAC9B;AAAA,IACF;AACA,UAAM,QAAQ,mBAAmB,IAAI,UAAU;AAC/C,UAAM,SAAS,iCAAiC,YAAY,KAAK;AACjE,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AACA,UAAM,WAAW,oBAAoB,IAAI,YAAY,KAAK,CAAC;AAC3D,aAAS,KAAK,MAAM;AACpB,wBAAoB,IAAI,cAAc,QAAQ;AAAA,EAChD;AAEA,aAAW,CAAC,cAAc,KAAK,KAAK,uBAAuB;AACzD,UAAM,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,UAAU;AAChD,0BAAsB,IAAI,cAAc,KAAK;AAAA,EAC/C;AACA,aAAW,CAAC,YAAY,OAAO,KAAK,qBAAqB;AACvD,YAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,UAAU;AAClD,wBAAoB,IAAI,YAAY,OAAO;AAAA,EAC7C;AACA,aAAW,CAAC,aAAa,OAAO,KAAK,qBAAqB;AACxD,YAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,UAAU;AAClD,wBAAoB,IAAI,aAAa,OAAO;AAAA,EAC9C;AAEA,oBAAkB,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,UAAU;AAE5D,QAAM,SAAkC,CAAC;AACzC,QAAM,sBAAsB,oBAAI,IAAY;AAE5C,WAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC5C,UAAM,eAAe,oBAAoB,IAAI,CAAC,KAAK,CAAC;AACpD,eAAW,UAAU,cAAc;AACjC,aAAO,KAAK,MAAM;AAAA,IACpB;AAEA,UAAM,eAAe,oBAAoB,IAAI,CAAC,KAAK,CAAC;AACpD,eAAW,UAAU,cAAc;AACjC,aAAO,KAAK,MAAM;AAAA,IACpB;AAEA,UAAM,gBAAgB,sBAAsB,IAAI,CAAC,KAAK,CAAC;AACvD,eAAW,QAAQ,eAAe;AAChC,UAAK,KAAmC,SAAS,wBAAwB;AACvE,cAAM,QAAQ;AACd,mBAAW,SAAS,MAAM,WAAW;AACnC,8BAAoB,IAAI,MAAM,WAAW;AAAA,QAC3C;AACA,eAAO,KAAK,KAAK;AAAA,MACnB,OAAO;AACL,cAAM,QAAQ;AACd,YAAI,CAAC,oBAAoB,IAAI,MAAM,WAAW,GAAG;AAC/C,iBAAO,KAAK,KAAK;AACjB,8BAAoB,IAAI,MAAM,WAAW;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AAEA,UAAM,QAAQ,aAAa,CAAC;AAC5B,QAAI,gBAAgB,KAAK,GAAG;AAC1B,aAAO,KAAK,KAAK;AACjB;AAAA,IACF;AAEA,QAAI,YAAY,KAAK,GAAG;AACtB,UAAI,qBAAqB,IAAI,CAAC,GAAG;AAC/B;AAAA,MACF;AACA,aAAO,KAAK,KAAK;AACjB;AAAA,IACF;AAEA,UAAM,WAAW;AACjB,QAAI,oBAAoB,QAAQ,GAAG;AACjC,aAAO,KAAK,0BAA0B,QAAQ,CAAC;AAC/C;AAAA,IACF;AAEA,UAAM,gBAAgB,kBAAkB,QAAQ;AAChD,QACE,iBACA,CAAC,gBAAgB,aAAa,KAC9B,EAAE,0BAA0B,SAAS,WAAW,OAChD;AACA;AAAA,IACF;AACA,WAAO,KAAK,QAAQ;AAAA,EACtB;AAEA,aAAW,SAAS,mBAAmB;AACrC,QAAI,CAAC,oBAAoB,IAAI,MAAM,WAAW,GAAG;AAC/C,aAAO,KAAK,KAAK;AACjB,0BAAoB,IAAI,MAAM,WAAW;AAAA,IAC3C;AAAA,EACF;AAEA,SAAO;AACT;","names":["response"]}
|
|
1
|
+
{"version":3,"sources":["../src/client/AgentBuilderClient.ts","../src/connection/ThreadConnectionManager.ts","../src/utils/attachments.ts","../src/utils/imageProcessing.ts","../src/utils/fileHelpers.ts","../src/uploads/FileUploadManager.ts","../src/utils/workblocks.ts","../src/utils/subagentBlocks.ts"],"sourcesContent":["import type {\n Message,\n Thread,\n SendMessagePayload,\n GetMessagesOptions,\n MessagesPage,\n MessageWebSocketCallbacks,\n LogWebSocketCallbacks,\n MessageStreamEvent,\n LogStreamEvent,\n ThreadEvent,\n CreateThreadPayload,\n AttachmentRef,\n} from '../types'\n\nconst AUTH_TOKEN_KEY = 'agentbuilder_auth_token'\n\nexport class AgentBuilderClient {\n private endpoint: string\n\n constructor(endpoint: string) {\n // Normalize endpoint by removing trailing slash\n this.endpoint = endpoint.replace(/\\/$/, '')\n }\n\n /**\n * Get the current endpoint\n */\n getEndpoint(): string {\n return this.endpoint\n }\n\n /**\n * Create a new thread\n */\n async createThread(payload: CreateThreadPayload): Promise<Thread> {\n const response = await fetch(`${this.endpoint}/threads`, {\n method: 'POST',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n })\n\n if (!response.ok) {\n throw new Error(`Failed to create thread: ${response.statusText}`)\n }\n\n return response.json()\n }\n\n /**\n * Get thread metadata\n */\n async getThread(id: string): Promise<Thread> {\n const response = await fetch(`${this.endpoint}/threads/${id}`, {\n method: 'GET',\n headers: this.getHeaders(),\n })\n\n if (!response.ok) {\n throw new Error(`Failed to get thread: ${response.statusText}`)\n }\n\n return response.json()\n }\n\n /**\n * Get messages from a thread with optional pagination and filtering\n */\n async getMessages(\n id: string,\n options: GetMessagesOptions = {}\n ): Promise<Message[]> {\n const data = await this.getMessagesPage(id, options)\n return data.messages || []\n }\n\n /**\n * Get a paginated message page from a thread.\n */\n async getMessagesPage(\n id: string,\n options: GetMessagesOptions = {}\n ): Promise<MessagesPage> {\n const params = new URLSearchParams()\n\n if (options.limit !== undefined) params.set('limit', String(options.limit))\n if (options.offset !== undefined) params.set('offset', String(options.offset))\n if (options.depth !== undefined) params.set('depth', String(options.depth))\n if (options.includeSilent !== undefined) params.set('includeSilent', String(options.includeSilent))\n if (options.ids !== undefined && options.ids.length > 0) params.set('ids', options.ids.join(','))\n if (options.includeWorkblocks !== undefined) params.set('includeWorkblocks', String(options.includeWorkblocks))\n\n const queryString = params.toString()\n const url = `${this.endpoint}/threads/${id}/messages${queryString ? `?${queryString}` : ''}`\n\n const response = await fetch(url, {\n method: 'GET',\n headers: this.getHeaders(),\n })\n\n if (!response.ok) {\n throw new Error(`Failed to get messages: ${response.statusText}`)\n }\n\n const data = await response.json()\n return {\n messages: data.messages || [],\n total: data.total || 0,\n hasMore: !!data.hasMore,\n }\n }\n\n /**\n * Send a message to a thread\n */\n async sendMessage(\n id: string,\n payload: SendMessagePayload\n ): Promise<Message> {\n const response = await fetch(`${this.endpoint}/threads/${id}/messages`, {\n method: 'POST',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n })\n\n if (!response.ok) {\n throw new Error(`Failed to send message: ${response.statusText}`)\n }\n\n return response.json()\n }\n\n /**\n * Stop execution of a thread\n */\n async stopExecution(id: string): Promise<void> {\n const response = await fetch(`${this.endpoint}/threads/${id}/stop`, {\n method: 'POST',\n headers: this.getHeaders(),\n })\n\n if (!response.ok) {\n throw new Error(`Failed to stop execution: ${response.statusText}`)\n }\n\n await response.json()\n }\n\n /**\n * Delete a message from a thread\n * @param threadId - The thread ID\n * @param messageId - The message ID to delete\n * @returns Object with success status\n */\n async deleteMessage(\n threadId: string,\n messageId: string\n ): Promise<{ success: boolean }> {\n const response = await fetch(\n `${this.endpoint}/threads/${threadId}/messages/${messageId}`,\n {\n method: 'DELETE',\n headers: this.getHeaders(),\n }\n )\n\n if (!response.ok) {\n throw new Error(`Failed to delete message: ${response.statusText}`)\n }\n\n return response.json()\n }\n\n /**\n * Options for file upload\n */\n /**\n * Upload a file to a thread's filesystem\n * @param threadId - The thread ID\n * @param file - The file to upload\n * @param options - Optional upload options\n * @param options.thumbnail - Base64-encoded thumbnail data (for images)\n * @param options.width - Image width in pixels\n * @param options.height - Image height in pixels\n * @returns AttachmentRef with file metadata\n */\n async uploadFile(\n threadId: string,\n file: File,\n options?: {\n thumbnail?: string\n width?: number\n height?: number\n }\n ): Promise<AttachmentRef> {\n const encodedFilename = encodeURIComponent(file.name)\n const url = `${this.endpoint}/threads/${threadId}/fs/${encodedFilename}`\n\n // If thumbnail provided, use JSON format with base64 data\n if (options?.thumbnail) {\n const base64Data = await this.fileToBase64(file)\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n data: base64Data,\n mimeType: file.type,\n thumbnail: options.thumbnail,\n metadata: {\n width: options.width,\n height: options.height,\n },\n }),\n })\n\n if (!response.ok) {\n throw new Error(`Failed to upload file: ${response.statusText}`)\n }\n\n return response.json()\n }\n\n // For non-image files or when no thumbnail, use raw binary upload\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': file.type,\n },\n body: file,\n })\n\n if (!response.ok) {\n throw new Error(`Failed to upload file: ${response.statusText}`)\n }\n\n return response.json()\n }\n\n /**\n * Convert a File to base64 string\n */\n private fileToBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => {\n const result = reader.result as string\n // Remove data URL prefix (e.g., \"data:image/jpeg;base64,\")\n const base64 = result.split(',')[1]\n resolve(base64)\n }\n reader.onerror = () => reject(new Error('Failed to read file'))\n reader.readAsDataURL(file)\n })\n }\n\n /**\n * Get the full URL for a file in a thread's filesystem\n */\n getFileUrl(threadId: string, path: string): string {\n // Normalize path - remove leading slash and encode special characters\n const normalizedPath = path.startsWith('/') ? path.slice(1) : path\n const encodedPath = normalizedPath\n .split('/')\n .map(segment => encodeURIComponent(segment))\n .join('/')\n\n return `${this.endpoint}/threads/${threadId}/fs/${encodedPath}`\n }\n\n /**\n * Get the thumbnail URL for an image in a thread's filesystem\n */\n getThumbnailUrl(threadId: string, path: string): string {\n return `${this.getFileUrl(threadId, path)}?thumbnail=true`\n }\n\n /**\n * List all files in a thread's filesystem\n * @param threadId - The thread ID\n * @returns Array of file records\n */\n async listFiles(threadId: string): Promise<Array<{\n path: string\n name: string\n mimeType: string\n size: number\n isDirectory: boolean\n createdAt?: number\n updatedAt?: number\n }>> {\n // Use find API to recursively list all files\n const response = await fetch(\n `${this.endpoint}/threads/${threadId}/fs?find=**/*&type=file`,\n {\n method: 'GET',\n headers: this.getHeaders(),\n }\n )\n\n if (!response.ok) {\n throw new Error(`Failed to list files: ${response.statusText}`)\n }\n\n const data = await response.json()\n return data.files || []\n }\n\n /**\n * Connect to message WebSocket for real-time message updates\n */\n async connectMessageWebSocket(\n id: string,\n callbacks: MessageWebSocketCallbacks = {},\n options: { includeSilent?: boolean; depth?: number } = {}\n ): Promise<WebSocket> {\n const extra = new URLSearchParams()\n if (options.includeSilent !== undefined) extra.set('includeSilent', String(options.includeSilent))\n if (options.depth !== undefined) extra.set('depth', String(options.depth))\n\n const url = await this.mintWebSocketUrl(`/threads/${id}/stream`, extra)\n const ws = new WebSocket(url)\n\n ws.onopen = () => {\n callbacks.onOpen?.()\n }\n\n ws.onmessage = (event) => {\n try {\n // Heartbeat replies: `stream_pong` from the hibernation\n // auto-response, `pong` from older servers.\n if (\n typeof event.data === 'string' &&\n (event.data === 'pong' || event.data === 'stream_pong')\n ) {\n return\n }\n\n const data = JSON.parse(event.data) as MessageStreamEvent\n\n switch (data.type) {\n case 'message_data':\n callbacks.onMessage?.(data)\n break\n case 'message_chunk':\n callbacks.onChunk?.(data)\n break\n case 'event':\n callbacks.onEvent?.(data as ThreadEvent)\n break\n case 'error':\n callbacks.onError?.(data)\n break\n }\n } catch (error) {\n console.error('Failed to parse WebSocket message:', error)\n }\n }\n\n ws.onerror = (event) => {\n console.error('WebSocket error:', event)\n callbacks.onError?.({ type: 'error', error: 'WebSocket connection error' })\n }\n\n ws.onclose = (event) => {\n console.log(`[AgentBuilderClient] Message WebSocket closed - code: ${event.code}, reason: ${event.reason || 'none'}, wasClean: ${event.wasClean}`)\n callbacks.onClose?.()\n }\n\n return ws\n }\n\n /**\n * Connect to log WebSocket for custom events\n */\n async connectLogWebSocket(\n id: string,\n callbacks: LogWebSocketCallbacks = {}\n ): Promise<WebSocket> {\n const url = await this.mintWebSocketUrl(`/threads/${id}`)\n const ws = new WebSocket(url)\n\n ws.onopen = () => {\n callbacks.onOpen?.()\n }\n\n ws.onmessage = (event) => {\n try {\n // Heartbeat replies: `stream_pong` from the hibernation\n // auto-response, `pong` from older servers.\n if (\n typeof event.data === 'string' &&\n (event.data === 'pong' || event.data === 'stream_pong')\n ) {\n return\n }\n\n const data = JSON.parse(event.data) as LogStreamEvent\n\n switch (data.type) {\n case 'log_data':\n callbacks.onLog?.(data)\n break\n case 'custom':\n callbacks.onCustom?.(data)\n break\n case 'stopped_by_user':\n callbacks.onStopped?.(data)\n break\n case 'kv_data':\n callbacks.onKvData?.(data)\n break\n }\n } catch (error) {\n console.error('Failed to parse WebSocket message:', error)\n }\n }\n\n ws.onerror = (event) => {\n console.error('WebSocket error:', event)\n }\n\n ws.onclose = () => {\n callbacks.onClose?.()\n }\n\n return ws\n }\n\n /**\n * Get headers for HTTP requests\n */\n private getHeaders(): Record<string, string> {\n const headers: Record<string, string> = {}\n const token = this.getToken()\n\n if (token) {\n headers['Authorization'] = `Bearer ${token}`\n }\n\n return headers\n }\n\n private getToken(): string | null {\n return typeof localStorage !== 'undefined'\n ? localStorage.getItem(AUTH_TOKEN_KEY)\n : null\n }\n\n /**\n * Mint a path-bound, single-use ticket when a long-lived credential is\n * present. Same-origin cookie sessions open the socket without a query\n * credential so durable secrets never enter access logs.\n */\n private async mintWebSocketUrl(\n suffix: string,\n extra: URLSearchParams = new URLSearchParams(),\n ): Promise<string> {\n const endpointUrl = this.getEndpointUrl()\n const pathname = `${endpointUrl.pathname.replace(/\\/$/, '')}${suffix}`\n const token = this.getToken()\n if (token) {\n const response = await fetch(`${this.endpoint}/auth/websocket-ticket`, {\n method: 'POST',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ pathname }),\n })\n if (!response.ok) {\n throw new Error(`Failed to mint WebSocket ticket: ${response.status} ${response.statusText}`)\n }\n const payload = await response.json() as { ticket?: unknown }\n if (typeof payload.ticket !== 'string' || !payload.ticket) {\n throw new Error('WebSocket ticket response did not include a ticket')\n }\n extra.set('ticket', payload.ticket)\n }\n const query = extra.toString()\n return `${this.getWebSocketEndpoint()}${suffix}${query ? `?${query}` : ''}`\n }\n\n private getEndpointUrl(): URL {\n const base =\n typeof location !== 'undefined'\n ? location.href\n : 'http://localhost/'\n return new URL(this.endpoint, base)\n }\n\n private getWebSocketEndpoint(): string {\n const endpointUrl = this.getEndpointUrl()\n endpointUrl.protocol = endpointUrl.protocol === 'https:' ? 'wss:' : 'ws:'\n return endpointUrl.toString().replace(/\\/$/, '')\n }\n}\n","import { AgentBuilderClient } from '../client/AgentBuilderClient'\nimport type {\n ConnectionStatus,\n ThreadConnectionCallbacks,\n MessageDataEvent,\n MessageChunkEvent,\n ThreadEvent,\n ErrorEvent,\n} from '../types'\n\nexport interface ThreadConnectionOptions {\n /** Maximum message depth to stream (default: 0 for top-level only) */\n depth?: number\n /** Whether to include silent messages (default: false) */\n includeSilent?: boolean\n /** Heartbeat interval in milliseconds (default: 30000) */\n heartbeatInterval?: number\n /** Maximum reconnection delay in milliseconds (default: 30000) */\n maxReconnectDelay?: number\n /**\n * Consulted before scheduling a reconnect once the socket has failed\n * `preOpenFailureThreshold` times in a row without ever opening — the\n * browser hides a rejected upgrade's HTTP status, so this is the hook for\n * an application-level auth check. Return false to stop reconnecting (the\n * manager goes `disconnected`; a later explicit `connect()` resumes).\n * Without a gate the manager keeps its historical always-retry behavior.\n */\n reconnectAuthGate?: () => boolean | Promise<boolean>\n /** Consecutive never-opened failures before consulting the gate (default: 3) */\n preOpenFailureThreshold?: number\n}\n\n/**\n * ThreadConnectionManager handles WebSocket connection lifecycle for a thread.\n * Provides automatic reconnection with exponential backoff and heartbeat keep-alive.\n *\n * This class is framework-agnostic. React and Vue SDKs use this internally\n * and handle their own reactive state management.\n *\n * @example\n * ```typescript\n * const manager = new ThreadConnectionManager(client, 'thread-123', {\n * onMessage: (event) => updateMessages(event.data),\n * onChunk: (event) => appendChunk(event.chunk),\n * onStatusChange: (status) => setConnectionStatus(status),\n * })\n *\n * manager.connect()\n * // ... later\n * manager.disconnect()\n * ```\n */\nexport class ThreadConnectionManager {\n private client: AgentBuilderClient\n private threadId: string\n private callbacks: ThreadConnectionCallbacks\n private options: Required<Omit<ThreadConnectionOptions, 'reconnectAuthGate'>> &\n Pick<ThreadConnectionOptions, 'reconnectAuthGate'>\n\n private ws: WebSocket | null = null\n private connectGeneration: number = 0\n private status: ConnectionStatus = 'disconnected'\n private reconnectAttempts: number = 0\n private reconnectTimeout: ReturnType<typeof setTimeout> | null = null\n private heartbeatInterval: ReturnType<typeof setInterval> | null = null\n private isReconnecting: boolean = false\n private shouldReconnect: boolean = true\n /** Timestamp of the last frame received; gates quiet-only keepalives. */\n private lastFrameAt: number = 0\n /** Consecutive closes without a successful open (rejected upgrades). */\n private consecutivePreOpenFailures: number = 0\n private openedSinceConnect: boolean = false\n\n constructor(\n client: AgentBuilderClient,\n threadId: string,\n callbacks: ThreadConnectionCallbacks = {},\n options: ThreadConnectionOptions = {}\n ) {\n this.client = client\n this.threadId = threadId\n this.callbacks = callbacks\n this.options = {\n depth: options.depth ?? 0,\n includeSilent: options.includeSilent ?? false,\n heartbeatInterval: options.heartbeatInterval ?? 30000,\n maxReconnectDelay: options.maxReconnectDelay ?? 30000,\n reconnectAuthGate: options.reconnectAuthGate,\n preOpenFailureThreshold: options.preOpenFailureThreshold ?? 3,\n }\n }\n\n /**\n * Get current connection status\n */\n getStatus(): ConnectionStatus {\n return this.status\n }\n\n /**\n * Get the thread ID this manager is connected to\n */\n getThreadId(): string {\n return this.threadId\n }\n\n /**\n * Connect to the thread WebSocket\n */\n connect(): void {\n void this.connectAsync()\n }\n\n /**\n * Mint a ticket when needed, then open the thread WebSocket.\n */\n async connectAsync(): Promise<void> {\n if (this.ws && this.ws.readyState !== WebSocket.CLOSED) {\n // Already connected or connecting\n return\n }\n\n const generation = ++this.connectGeneration\n this.shouldReconnect = true\n this.isReconnecting = false\n this.openedSinceConnect = false\n this.setStatus('connecting')\n\n let ws: WebSocket\n try {\n ws = await this.client.connectMessageWebSocket(\n this.threadId,\n {\n onOpen: () => {\n this.setStatus('connected')\n this.reconnectAttempts = 0\n this.isReconnecting = false\n this.consecutivePreOpenFailures = 0\n this.openedSinceConnect = true\n this.startHeartbeat()\n },\n onMessage: (event: MessageDataEvent) => {\n this.lastFrameAt = Date.now()\n this.callbacks.onMessage?.(event)\n },\n onChunk: (event: MessageChunkEvent) => {\n this.lastFrameAt = Date.now()\n this.callbacks.onChunk?.(event)\n },\n onEvent: (event: ThreadEvent) => {\n this.lastFrameAt = Date.now()\n this.callbacks.onEvent?.(event)\n },\n onError: (event: ErrorEvent) => {\n this.callbacks.onError?.(event)\n },\n onClose: () => {\n if (!this.openedSinceConnect) this.consecutivePreOpenFailures++\n this.clearTimers()\n this.scheduleReconnect()\n },\n },\n {\n depth: this.options.depth,\n includeSilent: this.options.includeSilent,\n }\n )\n } catch {\n if (generation !== this.connectGeneration || !this.shouldReconnect) return\n this.scheduleReconnect()\n return\n }\n\n if (generation !== this.connectGeneration || !this.shouldReconnect) {\n ws.close()\n return\n }\n this.ws = ws\n }\n\n /**\n * Disconnect from the thread WebSocket\n */\n disconnect(): void {\n this.connectGeneration++\n this.shouldReconnect = false\n this.clearTimers()\n\n if (this.ws) {\n this.ws.close()\n this.ws = null\n }\n\n this.reconnectAttempts = 0\n this.isReconnecting = false\n this.setStatus('disconnected')\n }\n\n /**\n * Update callbacks without reconnecting\n */\n updateCallbacks(callbacks: Partial<ThreadConnectionCallbacks>): void {\n this.callbacks = { ...this.callbacks, ...callbacks }\n }\n\n /**\n * Update options (requires reconnect to take effect for depth/includeSilent)\n */\n updateOptions(options: Partial<ThreadConnectionOptions>): void {\n this.options = { ...this.options, ...options }\n }\n\n private setStatus(status: ConnectionStatus): void {\n if (this.status !== status) {\n this.status = status\n this.callbacks.onStatusChange?.(status)\n }\n }\n\n /**\n * Passive keepalive. `stream_ping` is answered by the thread Durable\n * Object's hibernation auto-response at the edge, so it never wakes DO\n * JavaScript the way a plain `ping` did (~2 wakes/minute/socket while\n * idle). It is sent only after a full quiet interval — a socket that just\n * delivered message/chunk/event frames needs no keepalive.\n */\n private startHeartbeat(): void {\n this.clearHeartbeat()\n this.lastFrameAt = Date.now()\n\n this.heartbeatInterval = setInterval(() => {\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n if (Date.now() - this.lastFrameAt >= this.options.heartbeatInterval) {\n this.ws.send('stream_ping')\n }\n }\n }, this.options.heartbeatInterval)\n }\n\n private clearHeartbeat(): void {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval)\n this.heartbeatInterval = null\n }\n }\n\n private clearReconnectTimeout(): void {\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout)\n this.reconnectTimeout = null\n }\n }\n\n private clearTimers(): void {\n this.clearHeartbeat()\n this.clearReconnectTimeout()\n }\n\n private scheduleReconnect(): void {\n if (!this.shouldReconnect || this.isReconnecting) {\n this.setStatus('disconnected')\n return\n }\n\n // Repeated never-opened failures: consult the application's auth gate\n // before another upgrade attempt. A rejected handshake's HTTP status is\n // invisible here, so only the application can tell an expired session\n // (stop and re-authenticate) from a flaky network (keep bounded retry).\n const gate = this.options.reconnectAuthGate\n if (gate && this.consecutivePreOpenFailures >= this.options.preOpenFailureThreshold) {\n this.isReconnecting = true\n this.setStatus('reconnecting')\n void Promise.resolve()\n .then(() => gate())\n .then((allowed) => {\n this.isReconnecting = false\n if (!this.shouldReconnect) return\n if (!allowed) {\n this.shouldReconnect = false\n this.setStatus('disconnected')\n return\n }\n this.scheduleReconnectDelay()\n })\n .catch(() => {\n // An erroring gate is indeterminate — keep bounded recovery.\n this.isReconnecting = false\n if (this.shouldReconnect) this.scheduleReconnectDelay()\n })\n return\n }\n\n this.scheduleReconnectDelay()\n }\n\n private scheduleReconnectDelay(): void {\n this.isReconnecting = true\n this.setStatus('reconnecting')\n\n // Exponential backoff: 1s, 2s, 4s, 8s, 16s, 30s (max), with ±25% jitter\n // so independent clients do not retry in synchronized bursts.\n const base = Math.min(\n 1000 * Math.pow(2, this.reconnectAttempts),\n this.options.maxReconnectDelay\n )\n const spread = base * 0.25\n const delay = Math.max(0, Math.round(base - spread + Math.random() * spread * 2))\n this.reconnectAttempts++\n\n this.reconnectTimeout = setTimeout(() => {\n if (this.shouldReconnect) {\n this.connect()\n }\n }, delay)\n }\n}\n","import type { Message, AttachmentRef, ThreadFile } from '../types'\n\n/**\n * Parse attachments from a message\n * Handles both JSON string and already-parsed array formats\n * Returns empty array if no attachments or invalid data\n */\nexport function parseAttachments(message: Message): AttachmentRef[] {\n if (!message.attachments) {\n return []\n }\n\n // If already an array, return it directly\n if (Array.isArray(message.attachments)) {\n return message.attachments\n }\n\n // Otherwise try to parse as JSON string\n try {\n const parsed = JSON.parse(message.attachments)\n if (!Array.isArray(parsed)) {\n return []\n }\n return parsed\n } catch {\n return []\n }\n}\n\n/**\n * Check if a MIME type represents an image\n */\nexport function isImageMimeType(mimeType: string): boolean {\n return mimeType.toLowerCase().startsWith('image/')\n}\n\n/**\n * Convert messages to ThreadFile array\n * Extracts all committed files from message attachments\n */\nexport function messagesToFiles(messages: Message[]): ThreadFile[] {\n const files: ThreadFile[] = []\n\n for (const message of messages) {\n const attachments = parseAttachments(message)\n\n for (const attachment of attachments) {\n files.push({\n id: attachment.id,\n name: attachment.name,\n mimeType: attachment.mimeType,\n size: attachment.size,\n isImage: isImageMimeType(attachment.mimeType),\n localPreviewUrl: null, // Committed files don't have local preview\n status: 'committed',\n path: attachment.path,\n width: attachment.width,\n height: attachment.height,\n messageId: message.id,\n })\n }\n }\n\n return files\n}\n","/**\n * Image processing utilities for thumbnail generation\n * These functions require a browser environment with Canvas support\n */\n\nconst THUMBNAIL_SIZE = 256\n\n/**\n * Result of processing an image file\n */\nexport interface ImageProcessingResult {\n /** Base64-encoded thumbnail data (without data URL prefix) */\n thumbnail: string\n /** Original image width */\n width: number\n /** Original image height */\n height: number\n}\n\n/**\n * Load an image from a File object\n */\nfunction loadImage(file: File): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image()\n const objectUrl = URL.createObjectURL(file)\n\n img.onload = () => {\n URL.revokeObjectURL(objectUrl)\n resolve(img)\n }\n img.onerror = () => {\n URL.revokeObjectURL(objectUrl)\n reject(new Error('Failed to load image'))\n }\n img.src = objectUrl\n })\n}\n\n/**\n * Create a thumbnail from an image element\n * Returns base64 data without the data URL prefix\n */\nfunction createThumbnailFromImage(img: HTMLImageElement): string {\n const { width, height } = img\n const aspectRatio = width / height\n\n let thumbWidth: number\n let thumbHeight: number\n\n if (aspectRatio > 1) {\n thumbWidth = Math.min(THUMBNAIL_SIZE, width)\n thumbHeight = Math.floor(thumbWidth / aspectRatio)\n } else {\n thumbHeight = Math.min(THUMBNAIL_SIZE, height)\n thumbWidth = Math.floor(thumbHeight * aspectRatio)\n }\n\n const canvas = document.createElement('canvas')\n canvas.width = thumbWidth\n canvas.height = thumbHeight\n\n const ctx = canvas.getContext('2d')\n if (!ctx) {\n throw new Error('Failed to get canvas context')\n }\n\n ctx.drawImage(img, 0, 0, thumbWidth, thumbHeight)\n\n // Return WebP for smaller size, strip data URL prefix\n const dataUrl = canvas.toDataURL('image/webp', 0.8)\n return dataUrl.split(',')[1]\n}\n\n/**\n * Process an image file to generate a thumbnail\n * @param file - The image file to process\n * @returns Promise with thumbnail data and dimensions\n */\nexport async function generateImageThumbnail(file: File): Promise<ImageProcessingResult> {\n const img = await loadImage(file)\n\n return {\n thumbnail: createThumbnailFromImage(img),\n width: img.width,\n height: img.height,\n }\n}\n\n/**\n * Check if the current environment supports Canvas (for thumbnail generation)\n */\nexport function canGenerateThumbnails(): boolean {\n return typeof document !== 'undefined' && typeof document.createElement === 'function'\n}\n","/**\n * File upload helper utilities\n */\n\n/**\n * Generate a unique ID for pending file uploads.\n * Uses timestamp + random string to ensure uniqueness.\n */\nexport function generatePendingFileId(): string {\n return `pending-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n}\n\n/**\n * Read a file as a data URL for image preview.\n * Returns a base64-encoded data URL that can be used as an image src.\n */\nexport function readFileAsDataUrl(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => resolve(reader.result as string)\n reader.onerror = reject\n reader.readAsDataURL(file)\n })\n}\n","/**\n * FileUploadManager - Framework-agnostic file upload management\n *\n * Handles the common logic for file uploads across Vue and React packages.\n * Each framework integrates this manager with its own state management.\n */\n\nimport type { ThreadFile, AttachmentRef } from '../types'\nimport type { AgentBuilderClient } from '../client/AgentBuilderClient'\nimport { isImageMimeType } from '../utils/attachments'\nimport { generateImageThumbnail } from '../utils/imageProcessing'\nimport { generatePendingFileId, readFileAsDataUrl } from '../utils/fileHelpers'\n\n/**\n * Callback for receiving file state updates during upload\n */\nexport type FileUpdateCallback = (updates: Partial<ThreadFile>) => void\n\n/**\n * Options for upload execution\n */\nexport interface UploadOptions {\n /** Generate and upload thumbnail for images (default: true) */\n generateThumbnail?: boolean\n /** Generate local preview URL for images (default: true) */\n generatePreview?: boolean\n}\n\n/**\n * FileUploadManager handles the upload lifecycle for files.\n *\n * Usage:\n * 1. Call queueFiles() to create pending file objects for immediate UI display\n * 2. Call executeUpload() for each file to start the actual upload\n * 3. Receive state updates via the callback to update your framework's state\n *\n * @example\n * ```typescript\n * const manager = new FileUploadManager()\n *\n * // Queue files for UI display\n * const pendingFiles = manager.queueFiles(selectedFiles)\n * setState(prev => [...prev, ...pendingFiles])\n *\n * // Start uploads\n * for (const pending of pendingFiles) {\n * manager.executeUpload(threadId, file, pending.id, client, (updates) => {\n * setState(prev => prev.map(f =>\n * f.id === pending.id ? { ...f, ...updates } : f\n * ))\n * })\n * }\n * ```\n */\nexport class FileUploadManager {\n /**\n * Create a pending file object from a File.\n * The returned object can be immediately added to state for UI feedback.\n */\n createPendingFile(file: File): ThreadFile {\n return {\n id: generatePendingFileId(),\n name: file.name,\n mimeType: file.type,\n size: file.size,\n isImage: isImageMimeType(file.type),\n localPreviewUrl: null,\n status: 'uploading',\n }\n }\n\n /**\n * Queue multiple files for upload.\n * Returns an array of pending file objects paired with their source File objects.\n *\n * @param files - Files to queue (File array or FileList)\n * @returns Array of [ThreadFile, File] tuples\n */\n queueFiles(files: File[] | FileList): Array<{ pending: ThreadFile; file: File }> {\n return Array.from(files).map(file => ({\n pending: this.createPendingFile(file),\n file,\n }))\n }\n\n /**\n * Execute the upload for a file.\n *\n * This method:\n * 1. Generates a local preview for images (async, non-blocking)\n * 2. Generates a thumbnail for images (if supported)\n * 3. Uploads the file to the server\n * 4. Calls onUpdate with state changes at each step\n *\n * @param threadId - The thread to upload to\n * @param file - The file to upload\n * @param pendingId - The ID of the pending file (from queueFiles)\n * @param client - The AgentBuilderClient instance\n * @param onUpdate - Callback for state updates\n * @param options - Upload options\n */\n async executeUpload(\n threadId: string,\n file: File,\n pendingId: string,\n client: AgentBuilderClient,\n onUpdate: FileUpdateCallback,\n options: UploadOptions = {}\n ): Promise<AttachmentRef> {\n const {\n generateThumbnail = true,\n generatePreview = true,\n } = options\n\n const isImage = isImageMimeType(file.type)\n\n // Generate local preview for images (async, doesn't block upload)\n if (isImage && generatePreview) {\n readFileAsDataUrl(file)\n .then(dataUrl => onUpdate({ localPreviewUrl: dataUrl }))\n .catch(err => console.error('Failed to generate preview:', err))\n }\n\n try {\n // Prepare upload options for images\n let uploadOptions: Parameters<typeof client.uploadFile>[2] | undefined\n\n if (isImage && generateThumbnail) {\n try {\n const result = await generateImageThumbnail(file)\n uploadOptions = {\n thumbnail: result.thumbnail,\n width: result.width,\n height: result.height,\n }\n } catch (err) {\n // If thumbnail generation fails, continue without it\n console.warn('Failed to generate thumbnail:', err)\n }\n }\n\n // Upload the file\n const attachment = await client.uploadFile(threadId, file, uploadOptions)\n\n // Update with server response\n onUpdate({\n id: attachment.id,\n status: 'ready',\n path: attachment.path,\n width: attachment.width,\n height: attachment.height,\n })\n\n return attachment\n } catch (err) {\n // Update with error state\n onUpdate({\n status: 'error',\n error: err instanceof Error ? err.message : 'Failed to upload file',\n })\n throw err\n }\n }\n\n /**\n * Execute uploads for multiple files in parallel.\n *\n * @param threadId - The thread to upload to\n * @param items - Array of pending/file pairs from queueFiles()\n * @param client - The AgentBuilderClient instance\n * @param onUpdate - Callback receiving (pendingId, updates) for each file\n * @param options - Upload options\n * @returns Array of upload results (AttachmentRef or Error for each file)\n */\n async executeUploads(\n threadId: string,\n items: Array<{ pending: ThreadFile; file: File }>,\n client: AgentBuilderClient,\n onUpdate: (pendingId: string, updates: Partial<ThreadFile>) => void,\n options: UploadOptions = {}\n ): Promise<Array<AttachmentRef | Error>> {\n const promises = items.map(({ pending, file }) =>\n this.executeUpload(\n threadId,\n file,\n pending.id,\n client,\n (updates) => onUpdate(pending.id, updates),\n options\n ).catch(err => err instanceof Error ? err : new Error(String(err)))\n )\n\n return Promise.all(promises)\n }\n}\n","import type { Message, WorkMessage, WorkItem, ThreadMessage } from '../types'\n\n/**\n * Transform a flat list of messages into a list with workblocks.\n * Groups consecutive assistant tool_calls and their tool results into WorkMessage objects.\n *\n * A workblock starts when an assistant message has tool_calls,\n * and continues to include ALL subsequent messages until:\n * - A user message appears\n * - An assistant message without tool_calls appears\n *\n * This means multiple assistant messages with tool_calls in a row\n * (with their tool results in between) are merged into a single workblock.\n */\nexport function transformToWorkblocks(messages: Message[]): ThreadMessage[] {\n if (messages.length === 0) {\n return []\n }\n\n const result: ThreadMessage[] = []\n let i = 0\n\n while (i < messages.length) {\n const message = messages[i]\n\n // Check if this is an assistant message with tool_calls\n if (message.role === 'assistant' && message.tool_calls) {\n // Try to parse tool_calls\n let toolCalls: any[]\n try {\n toolCalls = JSON.parse(message.tool_calls)\n } catch (error) {\n // If we can't parse tool_calls, treat it as a regular message\n result.push(message)\n i++\n continue\n }\n\n // Start building a workblock\n const workItems: WorkItem[] = []\n const contentParts: string[] = []\n let reasoningContent: string | null = message.reasoning_content || null\n let workblockStatus: 'pending' | 'completed' | 'failed' = 'completed'\n const firstMessageId = message.id\n const firstCreatedAt = message.created_at\n let latestTimestamp = Math.max(\n message.created_at,\n message.response_completed_at ?? 0\n )\n let requestSentAt = message.request_sent_at ?? message.created_at\n const depth = message.depth\n const logIds = new Set<string>()\n if (message.log_id) logIds.add(message.log_id)\n\n // Track if the current assistant message is pending\n if (message.status === 'pending') {\n workblockStatus = 'pending'\n } else if (message.status === 'failed') {\n workblockStatus = 'failed'\n }\n\n // Emit the first assistant message's text inline, before its tool calls,\n // so it renders directly above the tool calls it was returned with\n // instead of being hoisted to the top of the workblock.\n if (message.content) {\n contentParts.push(message.content)\n workItems.push({\n id: `${message.id}-content`,\n type: 'content',\n content: message.content,\n created_at: message.created_at,\n log_id: message.log_id ?? null,\n })\n }\n\n // Add tool calls as work items\n for (const toolCall of toolCalls) {\n workItems.push({\n id: toolCall.id || message.id,\n type: 'tool_call',\n name: toolCall.function?.name,\n content: toolCall.function?.arguments || null,\n status: null, // Will be updated below based on matching results\n tool_call_id: toolCall.id,\n created_at: message.created_at,\n log_id: message.log_id ?? null,\n })\n }\n\n // Continue collecting messages while we see tool results or more assistant tool_calls\n let j = i + 1\n while (j < messages.length) {\n const nextMessage = messages[j]\n\n if (nextMessage.role === 'tool') {\n latestTimestamp = Math.max(\n latestTimestamp,\n nextMessage.created_at,\n nextMessage.response_completed_at ?? 0\n )\n if (nextMessage.log_id) logIds.add(nextMessage.log_id)\n\n // Tool result - add to workblock\n const resultStatus = nextMessage.tool_status || 'pending'\n\n workItems.push({\n id: nextMessage.id,\n type: 'tool_result',\n name: nextMessage.name || undefined,\n content: nextMessage.content,\n status: resultStatus,\n tool_call_id: nextMessage.tool_call_id || undefined,\n created_at: nextMessage.created_at,\n log_id: nextMessage.log_id ?? null,\n })\n\n j++\n } else if (nextMessage.role === 'assistant' && nextMessage.tool_calls) {\n // Another assistant message with tool_calls - merge into same workblock\n let nextToolCalls: any[]\n try {\n nextToolCalls = JSON.parse(nextMessage.tool_calls)\n } catch (error) {\n // Can't parse, stop merging here\n break\n }\n\n // Update status if this message is pending/failed\n latestTimestamp = Math.max(\n latestTimestamp,\n nextMessage.created_at,\n nextMessage.response_completed_at ?? 0\n )\n requestSentAt = Math.min(\n requestSentAt,\n nextMessage.request_sent_at ?? nextMessage.created_at\n )\n if (nextMessage.log_id) logIds.add(nextMessage.log_id)\n\n // Update status if this message is pending/failed\n if (nextMessage.status === 'pending') {\n workblockStatus = 'pending'\n } else if (nextMessage.status === 'failed' && workblockStatus !== 'pending') {\n workblockStatus = 'failed'\n }\n\n // Emit this assistant message's text inline, before its tool calls,\n // preserving its position relative to the surrounding operations.\n if (nextMessage.content) {\n contentParts.push(nextMessage.content)\n workItems.push({\n id: `${nextMessage.id}-content`,\n type: 'content',\n content: nextMessage.content,\n created_at: nextMessage.created_at,\n log_id: nextMessage.log_id ?? null,\n })\n }\n\n // Collect reasoning content (use first non-null)\n if (!reasoningContent && nextMessage.reasoning_content) {\n reasoningContent = nextMessage.reasoning_content\n }\n\n // Add tool calls\n for (const toolCall of nextToolCalls) {\n workItems.push({\n id: toolCall.id || nextMessage.id,\n type: 'tool_call',\n name: toolCall.function?.name,\n content: toolCall.function?.arguments || null,\n status: null,\n tool_call_id: toolCall.id,\n created_at: nextMessage.created_at,\n log_id: nextMessage.log_id ?? null,\n })\n }\n j++\n } else {\n // User message or assistant without tool_calls - stop collecting\n break\n }\n }\n\n // Find orphaned tool_results (results without matching tool_calls) and create synthetic tool_calls\n const toolCallIds = new Set(workItems.filter(w => w.type === 'tool_call').map(w => w.tool_call_id))\n const orphanedResults = workItems.filter(\n w => w.type === 'tool_result' && w.tool_call_id && !toolCallIds.has(w.tool_call_id)\n )\n\n // Insert synthetic tool_calls for orphaned results\n for (const orphan of orphanedResults) {\n // Find the position of this orphan in workItems\n const orphanIndex = workItems.indexOf(orphan)\n // Extract tool name from error message or use generic\n const toolName = orphan.content?.match(/Tool not found: (\\w+)/)?.[1] || 'unknown_tool'\n\n // Insert a synthetic tool_call before the result\n const syntheticCall: WorkItem = {\n id: `synthetic-${orphan.tool_call_id}`,\n type: 'tool_call',\n name: toolName,\n content: null,\n status: orphan.status,\n tool_call_id: orphan.tool_call_id,\n created_at: orphan.created_at,\n log_id: orphan.log_id ?? null,\n }\n workItems.splice(orphanIndex, 0, syntheticCall)\n }\n\n // Update tool call statuses based on their matching results\n for (const item of workItems) {\n if (item.type === 'tool_call' && item.tool_call_id && item.status === null) {\n // Find matching result\n const matchingResult = workItems.find(\n wi => wi.type === 'tool_result' && wi.tool_call_id === item.tool_call_id\n )\n if (matchingResult) {\n // Tool call inherits status from its result\n item.status = matchingResult.status\n } else {\n // No result yet - tool call is pending\n item.status = 'pending'\n }\n }\n }\n\n // Combine content parts\n const combinedContent = contentParts.length > 0 ? contentParts.join('') : null\n\n // Create the workblock\n const workblock: WorkMessage = {\n id: firstMessageId,\n type: 'workblock',\n content: combinedContent,\n reasoning_content: reasoningContent,\n workItems,\n status: workblockStatus,\n created_at: firstCreatedAt,\n updated_at: latestTimestamp,\n request_sent_at: requestSentAt,\n response_completed_at: workblockStatus === 'pending' ? null : latestTimestamp,\n depth,\n log_ids: Array.from(logIds),\n }\n\n result.push(workblock)\n\n // Move index past all consumed messages\n i = j\n } else {\n // Not a workblock, pass through unchanged\n result.push(message)\n i++\n }\n }\n\n return result\n}\n","import type {\n Message,\n StatusMessage,\n SubagentBlockMessage,\n SubagentGroupBlockMessage,\n SubagentThreadMessage,\n ThreadMessage,\n WorkMessage,\n WorkItem,\n} from \"../types\"\nimport { transformToWorkblocks } from \"./workblocks\"\n\ntype TransformOptions = {\n /** Preserve tool-call workblocks around the projected subagent blocks. */\n includeWorkblocks?: boolean\n /** Thread being viewed; references to it are not projected as child subagents. */\n currentThreadId?: string\n /** Keep explicitly included silent messages in the chronological stream. */\n preserveSilentMessages?: boolean\n}\n\nconst SUBAGENT_TOOLS = new Set([\"subagent_create\", \"subagent_message\", \"send_to_agent\"])\nconst SUBAGENT_LIFECYCLE_TOOLS = new Set([\n ...SUBAGENT_TOOLS,\n \"subagents\",\n \"terminate_subagent\",\n])\nconst SUBAGENT_NAME_PATTERN = /subagent/i\n\nfunction isWorkblock(message: SubagentThreadMessage): message is WorkMessage {\n return (message as WorkMessage).type === \"workblock\"\n}\n\nfunction isStatusMessage(message: SubagentThreadMessage): message is StatusMessage {\n return (message as StatusMessage).type === \"status\"\n}\n\nfunction asOptionalString(value: unknown): string | null {\n if (typeof value !== \"string\") {\n return null\n }\n const normalized = value.trim()\n return normalized.length > 0 ? normalized : null\n}\n\nfunction getMetadataString(\n message: Message,\n key: string\n): string | null {\n if (!message.metadata || typeof message.metadata !== \"object\") {\n return null\n }\n return asOptionalString((message.metadata as Record<string, unknown>)[key])\n}\n\nfunction extractSubagentIdFromContent(content: string | null | undefined): string | null {\n if (!content) {\n return null\n }\n const fromToolResult = content.match(/Reference:\\s*([0-9a-fA-F-]{36})/)\n if (fromToolResult?.[1]) {\n return fromToolResult[1].toLowerCase()\n }\n const fromSubagentMessage = content.match(/reference:\\s*([0-9a-fA-F-]{36})/i)\n if (fromSubagentMessage?.[1]) {\n return fromSubagentMessage[1].toLowerCase()\n }\n return null\n}\n\nfunction inferSubagentStatus(message: Message): string | null {\n const explicit = asOptionalString(message.subagent_status)\n if (explicit) {\n return explicit\n }\n const content = message.content || \"\"\n if (/was initiated successfully/i.test(content) || /Message sent to subagent/i.test(content)) {\n return \"running\"\n }\n if (/has returned the following result/i.test(content)) {\n return \"idle\"\n }\n if (/has reported a failure/i.test(content) || /execution stopped before completion/i.test(content)) {\n return \"terminated\"\n }\n return null\n}\n\nfunction getSystemStatusKind(message: Message): StatusMessage[\"status_kind\"] | null {\n if (message.role !== \"system\") {\n return null\n }\n const metadataKind = getMetadataString(message, \"status_kind\")\n if (\n metadataKind === \"execution_stopped\" ||\n metadataKind === \"subagent_started\" ||\n metadataKind === \"subagent_event\" ||\n metadataKind === \"runtime_tool_invocation\"\n ) {\n return metadataKind\n }\n // Anchors written before the status_kind metadata was added.\n if (getMetadataString(message, \"runtime_tool_invocation\")) {\n return \"runtime_tool_invocation\"\n }\n if (getMetadataString(message, \"subagent_event\") === \"parent_handoff\") {\n return \"subagent_event\"\n }\n const content = (message.content || \"\").trim()\n if (/execution\\s+stopped/i.test(content)) {\n return \"execution_stopped\"\n }\n if (/subagents?\\s+started:/i.test(content)) {\n return \"subagent_started\"\n }\n return null\n}\n\nfunction createSystemStatusMessage(message: Message): StatusMessage {\n const kind = getSystemStatusKind(message) ?? undefined\n return {\n id: `status:${message.id}`,\n type: \"status\",\n role: \"system\",\n content: message.content || \"Execution stopped by user\",\n created_at: message.created_at,\n depth: message.depth,\n silent: false,\n status_kind: kind,\n }\n}\n\nfunction isSubagentSignalMessage(message: Message): boolean {\n if (message.role === \"tool\" && asOptionalString(message.subagent_id)) {\n return true\n }\n\n if (message.role === \"tool\" && message.name && SUBAGENT_TOOLS.has(message.name)) {\n return true\n }\n\n const content = message.content || \"\"\n if (/subagent\\s*\\(reference:/i.test(content)) {\n return true\n }\n if (/the subagent was initiated successfully/i.test(content)) {\n return true\n }\n if (/message sent to subagent/i.test(content)) {\n return true\n }\n\n return false\n}\n\nfunction extractSubagentId(message: Message): string | null {\n const direct = asOptionalString(message.subagent_id)\n if (direct) {\n return direct\n }\n\n const metadata = message.metadata\n if (metadata && typeof metadata === \"object\") {\n const snake = asOptionalString((metadata as Record<string, unknown>).subagent_id)\n if (snake) {\n return snake\n }\n const camel = asOptionalString((metadata as Record<string, unknown>).subagentId)\n if (camel) {\n return camel\n }\n }\n\n return extractSubagentIdFromContent(message.content)\n}\n\nfunction parseToolCalls(toolCalls: string | null | undefined): Array<{\n id?: string\n function?: { name?: string }\n}> {\n if (!toolCalls) {\n return []\n }\n try {\n const parsed = JSON.parse(toolCalls)\n return Array.isArray(parsed) ? parsed : []\n } catch {\n return []\n }\n}\n\nfunction parseToolArguments(raw: string | null | undefined): Record<string, unknown> {\n if (!raw) {\n return {}\n }\n try {\n const parsed = JSON.parse(raw)\n return parsed && typeof parsed === \"object\" ? (parsed as Record<string, unknown>) : {}\n } catch {\n return {}\n }\n}\n\nfunction isLikelySubagentToolName(toolName: string | undefined): boolean {\n if (!toolName) {\n return false\n }\n if (SUBAGENT_TOOLS.has(toolName)) {\n return true\n }\n return SUBAGENT_NAME_PATTERN.test(toolName)\n}\n\nfunction getSubagentThreadNameFromWorkItem(item: WorkItem): string | null {\n const args = parseToolArguments(item.content)\n const name = asOptionalString(args.name)\n return name\n}\n\nfunction getSubagentIdFromWorkItem(\n item: WorkItem,\n toolCallIdToSubagentId: Map<string, string>\n): string | null {\n if (item.tool_call_id) {\n const mapped = toolCallIdToSubagentId.get(item.tool_call_id)\n if (mapped) {\n return mapped\n }\n }\n return extractSubagentIdFromContent(item.content)\n}\n\nfunction createSubagentBlock(\n subagentId: string,\n message: Message\n): SubagentBlockMessage {\n const inferredStatus = inferSubagentStatus(message)\n return {\n id: `subagent:${subagentId}`,\n type: \"subagent_block\",\n subagent_id: subagentId,\n subagent_name: message.subagent_name ?? null,\n subagent_title: message.subagent_title ?? null,\n subagent_description: message.subagent_description ?? null,\n subagent_status: inferredStatus ?? null,\n subagent_relationship: message.subagent_relationship ?? null,\n subagent_blocking: message.subagent_blocking ?? null,\n subagent_thread_name: message.subagent_thread_name ?? null,\n subagent_spawn_group_id: message.subagent_spawn_group_id ?? null,\n messages: [message],\n created_at: message.created_at,\n updated_at: message.created_at,\n depth: message.depth,\n }\n}\n\nfunction mergeSubagentBlock(block: SubagentBlockMessage, message: Message): void {\n block.messages.push(message)\n block.updated_at = Math.max(block.updated_at, message.created_at)\n block.created_at = Math.min(block.created_at, message.created_at)\n block.depth = message.depth ?? block.depth\n\n if (message.subagent_name !== undefined) {\n block.subagent_name = message.subagent_name ?? block.subagent_name ?? null\n }\n if (message.subagent_title !== undefined) {\n block.subagent_title = message.subagent_title ?? block.subagent_title ?? null\n }\n if (message.subagent_description !== undefined) {\n block.subagent_description =\n message.subagent_description ?? block.subagent_description ?? null\n }\n const inferredStatus = inferSubagentStatus(message)\n if (inferredStatus !== null) {\n block.subagent_status = inferredStatus\n }\n if (message.subagent_relationship !== undefined) {\n block.subagent_relationship =\n message.subagent_relationship ?? block.subagent_relationship ?? null\n }\n if (message.subagent_blocking !== undefined) {\n block.subagent_blocking =\n message.subagent_blocking ?? block.subagent_blocking ?? null\n }\n if (message.subagent_thread_name !== undefined) {\n block.subagent_thread_name =\n message.subagent_thread_name ?? block.subagent_thread_name ?? null\n }\n if (message.subagent_spawn_group_id !== undefined) {\n block.subagent_spawn_group_id =\n message.subagent_spawn_group_id ?? block.subagent_spawn_group_id ?? null\n }\n}\n\nfunction shouldSkipWorkblock(\n workblock: WorkMessage,\n resolvedSubagentIds: Set<string>\n): boolean {\n const toolCalls = workblock.workItems.filter((item) => item.type === \"tool_call\")\n if (toolCalls.length === 0) {\n return false\n }\n if (!toolCalls.every((item) => item.name && SUBAGENT_TOOLS.has(item.name))) {\n return false\n }\n return resolvedSubagentIds.size > 0\n}\n\nfunction inferBlockingFromToolResult(\n workblock: WorkMessage,\n toolCallId: string | undefined\n): boolean | null {\n if (!toolCallId) {\n return null\n }\n const result = workblock.workItems.find(\n (item) => item.type === \"tool_result\" && item.tool_call_id === toolCallId\n )\n if (!result || result.status !== \"success\") {\n return null\n }\n\n const text = (result.content || \"\").toLowerCase()\n if (text.includes(\"was initiated successfully\") || text.includes(\"results will be delivered when complete\")) {\n return false\n }\n if (text.length > 0) {\n return true\n }\n return null\n}\n\nfunction createPendingSubagentBlock(\n workblock: WorkMessage,\n toolCall: WorkItem,\n index: number,\n status: \"pending\" | \"running\"\n): SubagentBlockMessage {\n const toolName = asOptionalString(toolCall.name) ?? \"Subagent\"\n const pseudoSubagentId = toolCall.tool_call_id\n ? `pending:${toolCall.tool_call_id}`\n : `pending:${workblock.id}:${index}`\n const createdAt = workblock.created_at + index\n\n return {\n id: `subagent:${pseudoSubagentId}`,\n type: \"subagent_block\",\n subagent_id: pseudoSubagentId,\n subagent_name: toolName,\n subagent_title: toolName,\n subagent_description: null,\n subagent_status: status,\n subagent_relationship: null,\n subagent_blocking: null,\n subagent_thread_name: getSubagentThreadNameFromWorkItem(toolCall),\n subagent_spawn_group_id: workblock.id,\n messages: [],\n created_at: createdAt,\n updated_at: createdAt,\n depth: workblock.depth,\n }\n}\n\ntype BlockPlacement = {\n block: SubagentBlockMessage\n startIndex: number | undefined\n displayIndex: number | undefined\n groupKey: string\n}\n\ntype BlockGroup = {\n groupKey: string\n startIndex: number | undefined\n displayIndex: number | undefined\n blocks: SubagentBlockMessage[]\n}\n\nfunction createGroupStartMarker(group: BlockGroup): StatusMessage | null {\n if (group.startIndex === undefined || group.displayIndex === undefined) {\n return null\n }\n if (group.startIndex === group.displayIndex) {\n return null\n }\n\n const names = group.blocks\n .map((block) => block.subagent_thread_name || block.subagent_title || block.subagent_name || \"Subagent\")\n .filter((name, index, arr) => arr.indexOf(name) === index)\n\n let label: string\n if (names.length <= 1) {\n label = `Subagent started: ${names[0] || \"Subagent\"}`\n } else if (names.length <= 3) {\n label = `Subagents started: ${names.join(\", \")}`\n } else {\n label = `Subagents started: ${names.length} subagents`\n }\n\n const createdAt =\n Math.min(...group.blocks.map((block) => block.created_at)) || Date.now() * 1000\n const depth = group.blocks[0]?.depth\n\n return {\n id: `subagent-start:${group.groupKey}`,\n type: \"status\",\n role: \"system\",\n content: label,\n created_at: createdAt,\n status_kind: \"subagent_started\",\n silent: false,\n depth,\n }\n}\n\nfunction getSubagentDisplayName(block: SubagentBlockMessage | undefined): string {\n return (\n block?.subagent_thread_name ||\n block?.subagent_title ||\n block?.subagent_name ||\n \"Subagent\"\n )\n}\n\nfunction createSubagentEventStatusMessage(\n message: Message,\n block: SubagentBlockMessage | undefined\n): StatusMessage | null {\n if (!message.content) {\n return null\n }\n\n const content = message.content\n const name = getSubagentDisplayName(block)\n\n let label: string | null = null\n if (/has returned the following result/i.test(content)) {\n label = `Subagent replied: ${name}`\n } else if (\n /has reported a failure/i.test(content) ||\n /execution stopped before completion/i.test(content)\n ) {\n label = `Subagent failed: ${name}`\n }\n\n if (!label) {\n return null\n }\n\n return {\n id: `status:subagent-event:${message.id}`,\n type: \"status\",\n role: \"system\",\n content: label,\n created_at: message.created_at,\n depth: message.depth,\n silent: false,\n status_kind: \"subagent_event\",\n subagent_id: block?.subagent_id ?? message.subagent_id ?? null,\n }\n}\n\nfunction buildGroupedBlock(group: BlockGroup): SubagentBlockMessage | SubagentGroupBlockMessage {\n if (group.blocks.length === 1) {\n return group.blocks[0]\n }\n\n const sorted = [...group.blocks].sort((a, b) => {\n const aName = (a.subagent_thread_name || a.subagent_title || a.subagent_name || \"\").toLowerCase()\n const bName = (b.subagent_thread_name || b.subagent_title || b.subagent_name || \"\").toLowerCase()\n if (aName !== bName) {\n return aName.localeCompare(bName)\n }\n return a.created_at - b.created_at\n })\n\n return {\n id: `subagent-group:${group.groupKey}`,\n type: \"subagent_group_block\",\n group_id: group.groupKey,\n subagents: sorted,\n created_at: Math.min(...sorted.map((block) => block.created_at)),\n updated_at: Math.max(...sorted.map((block) => block.updated_at)),\n depth: sorted[0]?.depth,\n }\n}\n\n/**\n * Transform thread messages into a stream that preserves workblocks while also\n * collapsing subagent-tagged messages into anchor-based subagent blocks.\n *\n * The subagent block is anchored to the originating `subagent_create` workblock\n * when possible, and subagent-tagged messages are rendered inside that block.\n * Pass `currentThreadId` when rendering a thread so bootstrap messages tagged\n * with that same ID remain in the thread instead of becoming a self-child card.\n */\nexport function transformToSubagentBlocks(\n messages: Message[],\n options: TransformOptions = {}\n): SubagentThreadMessage[] {\n if (messages.length === 0) {\n return []\n }\n\n const includeWorkblocks = options.includeWorkblocks ?? false\n const preserveSilentMessages = options.preserveSilentMessages ?? false\n const currentThreadId = asOptionalString(options.currentThreadId)?.toLowerCase() ?? null\n const isCurrentThread = (subagentId: string): boolean =>\n currentThreadId !== null && subagentId.toLowerCase() === currentThreadId\n const baseMessages: SubagentThreadMessage[] = includeWorkblocks\n ? (transformToWorkblocks(messages) as ThreadMessage[])\n : messages\n\n const toolCallIdToSubagentId = new Map<string, string>()\n for (const message of messages) {\n if (message.role !== \"tool\") {\n continue\n }\n if (!message.tool_call_id) {\n continue\n }\n const subagentId = extractSubagentId(message)\n if (subagentId) {\n toolCallIdToSubagentId.set(message.tool_call_id, subagentId)\n }\n }\n\n const anchorIndexBySubagentId = new Map<string, number>()\n const threadNameBySubagentId = new Map<string, string>()\n const inferredFlagsBySubagentId = new Map<string, { blocking: boolean | null }>()\n const pendingPlacements: BlockPlacement[] = []\n const skipWorkblockIndexes = new Set<number>()\n const indexByBaseEntryId = new Map<string, number>()\n\n baseMessages.forEach((entry, index) => {\n indexByBaseEntryId.set(entry.id, index)\n\n if (!isWorkblock(entry)) {\n return\n }\n\n const resolvedFromWorkblock = new Set<string>()\n const toolCalls = entry.workItems.filter((item) => item.type === \"tool_call\")\n const pendingSubagentToolCalls: WorkItem[] = []\n\n for (const toolCall of toolCalls) {\n if (!isLikelySubagentToolName(toolCall.name)) {\n continue\n }\n const subagentId = getSubagentIdFromWorkItem(toolCall, toolCallIdToSubagentId)\n if (subagentId && isCurrentThread(subagentId)) {\n continue\n }\n if (!subagentId) {\n // Only an actual spawn in flight (`subagent_create`) may render as a\n // pending instance card. Every other lifecycle/management call — and\n // any tool that merely matches the /subagent/i name pattern — stays\n // ordinary tool work until a real child reference resolves.\n if (toolCall.status === \"pending\" && toolCall.name === \"subagent_create\") {\n pendingSubagentToolCalls.push(toolCall)\n }\n continue\n }\n resolvedFromWorkblock.add(subagentId)\n if (!anchorIndexBySubagentId.has(subagentId)) {\n anchorIndexBySubagentId.set(subagentId, index)\n }\n const threadName = getSubagentThreadNameFromWorkItem(toolCall)\n if (threadName && !threadNameBySubagentId.has(subagentId)) {\n threadNameBySubagentId.set(subagentId, threadName)\n }\n\n const currentFlags = inferredFlagsBySubagentId.get(subagentId) ?? {\n blocking: null,\n }\n if (toolCall.name === \"subagent_create\") {\n const inferredBlocking = inferBlockingFromToolResult(entry, toolCall.tool_call_id)\n if (inferredBlocking !== null) {\n currentFlags.blocking = inferredBlocking\n }\n }\n inferredFlagsBySubagentId.set(subagentId, currentFlags)\n }\n\n if (pendingSubagentToolCalls.length > 0) {\n pendingSubagentToolCalls.forEach((toolCall, pendingIndex) => {\n const pendingStatus: \"pending\" | \"running\" =\n pendingIndex === 0 ? \"running\" : \"pending\"\n const block = createPendingSubagentBlock(\n entry,\n toolCall,\n pendingIndex,\n pendingStatus\n )\n pendingPlacements.push({\n block,\n startIndex: index,\n displayIndex: index,\n groupKey: `start:${index}`,\n })\n })\n }\n\n if (shouldSkipWorkblock(entry, resolvedFromWorkblock)) {\n skipWorkblockIndexes.add(index)\n }\n })\n\n const blocksBySubagentId = new Map<string, SubagentBlockMessage>()\n const signaledSubagentIds = new Set<string>()\n for (const message of messages) {\n const subagentId = extractSubagentId(message)\n if (!subagentId || isCurrentThread(subagentId)) {\n continue\n }\n if (isSubagentSignalMessage(message)) {\n signaledSubagentIds.add(subagentId)\n }\n }\n\n for (const message of messages) {\n const subagentId = extractSubagentId(message)\n if (\n !subagentId ||\n isCurrentThread(subagentId) ||\n (preserveSilentMessages && message.silent === true) ||\n !signaledSubagentIds.has(subagentId)\n ) {\n continue\n }\n\n const existing = blocksBySubagentId.get(subagentId)\n if (!existing) {\n blocksBySubagentId.set(subagentId, createSubagentBlock(subagentId, message))\n } else {\n mergeSubagentBlock(existing, message)\n }\n }\n\n if (blocksBySubagentId.size === 0 && pendingPlacements.length === 0) {\n return baseMessages.map((entry) => {\n if (isStatusMessage(entry)) {\n return entry\n }\n if (isWorkblock(entry)) {\n return entry\n }\n const raw = entry as Message\n if (getSystemStatusKind(raw)) {\n return createSystemStatusMessage(raw)\n }\n return raw\n })\n }\n\n const placements: BlockPlacement[] = []\n const endAnchoredBlocks: SubagentBlockMessage[] = []\n\n for (const [subagentId, block] of blocksBySubagentId) {\n const inferredThreadName = threadNameBySubagentId.get(subagentId)\n if (!block.subagent_thread_name && inferredThreadName) {\n block.subagent_thread_name = inferredThreadName\n }\n const inferredFlags = inferredFlagsBySubagentId.get(subagentId)\n if (block.subagent_blocking === null && inferredFlags?.blocking !== null && inferredFlags?.blocking !== undefined) {\n block.subagent_blocking = inferredFlags.blocking\n }\n\n let startIndex = anchorIndexBySubagentId.get(subagentId)\n let displayIndex: number | undefined\n\n for (const childMessage of block.messages) {\n const messageIndex = indexByBaseEntryId.get(childMessage.id)\n if (messageIndex === undefined) {\n continue\n }\n if (displayIndex === undefined || messageIndex > displayIndex) {\n displayIndex = messageIndex\n }\n }\n\n if (startIndex === undefined && block.subagent_spawn_group_id) {\n startIndex = indexByBaseEntryId.get(block.subagent_spawn_group_id)\n }\n\n if (displayIndex === undefined) {\n if (startIndex !== undefined) {\n displayIndex = startIndex\n } else if (block.subagent_spawn_group_id) {\n displayIndex = indexByBaseEntryId.get(block.subagent_spawn_group_id)\n }\n }\n\n if (startIndex === undefined && displayIndex !== undefined) {\n startIndex = displayIndex\n }\n\n if (displayIndex === undefined) {\n endAnchoredBlocks.push(block)\n continue\n }\n\n const groupKey =\n block.subagent_spawn_group_id\n ? `spawn:${block.subagent_spawn_group_id}`\n : startIndex !== undefined\n ? `start:${startIndex}`\n : `subagent:${subagentId}`\n\n placements.push({\n block,\n startIndex,\n displayIndex,\n groupKey,\n })\n }\n\n for (const placement of pendingPlacements) {\n placements.push(placement)\n }\n\n const groupsByKey = new Map<string, BlockGroup>()\n for (const placement of placements) {\n const existing = groupsByKey.get(placement.groupKey)\n if (!existing) {\n groupsByKey.set(placement.groupKey, {\n groupKey: placement.groupKey,\n startIndex: placement.startIndex,\n displayIndex: placement.displayIndex,\n blocks: [placement.block],\n })\n continue\n }\n\n if (existing.startIndex === undefined) {\n existing.startIndex = placement.startIndex\n }\n if (placement.startIndex !== undefined && existing.startIndex !== undefined) {\n existing.startIndex = Math.min(existing.startIndex, placement.startIndex)\n }\n if (existing.displayIndex === undefined) {\n existing.displayIndex = placement.displayIndex\n }\n if (placement.displayIndex !== undefined && existing.displayIndex !== undefined) {\n existing.displayIndex = Math.max(existing.displayIndex, placement.displayIndex)\n }\n existing.blocks.push(placement.block)\n }\n\n const groupedByDisplayIndex = new Map<number, Array<SubagentBlockMessage | SubagentGroupBlockMessage>>()\n const startMarkersByIndex = new Map<number, StatusMessage[]>()\n const eventMarkersByIndex = new Map<number, StatusMessage[]>()\n\n for (const group of groupsByKey.values()) {\n const groupedBlock = buildGroupedBlock(group)\n if (group.displayIndex !== undefined) {\n const existing = groupedByDisplayIndex.get(group.displayIndex) ?? []\n existing.push(groupedBlock)\n groupedByDisplayIndex.set(group.displayIndex, existing)\n }\n\n const marker = createGroupStartMarker(group)\n if (marker && group.startIndex !== undefined) {\n const existing = startMarkersByIndex.get(group.startIndex) ?? []\n existing.push(marker)\n startMarkersByIndex.set(group.startIndex, existing)\n }\n }\n\n for (const rawMessage of messages) {\n if (preserveSilentMessages && rawMessage.silent === true) {\n continue\n }\n const subagentId = extractSubagentId(rawMessage)\n if (!subagentId) {\n continue\n }\n const messageIndex = indexByBaseEntryId.get(rawMessage.id)\n if (messageIndex === undefined) {\n continue\n }\n const block = blocksBySubagentId.get(subagentId)\n const marker = createSubagentEventStatusMessage(rawMessage, block)\n if (!marker) {\n continue\n }\n const existing = eventMarkersByIndex.get(messageIndex) ?? []\n existing.push(marker)\n eventMarkersByIndex.set(messageIndex, existing)\n }\n\n for (const [displayIndex, items] of groupedByDisplayIndex) {\n items.sort((a, b) => a.created_at - b.created_at)\n groupedByDisplayIndex.set(displayIndex, items)\n }\n for (const [startIndex, markers] of startMarkersByIndex) {\n markers.sort((a, b) => a.created_at - b.created_at)\n startMarkersByIndex.set(startIndex, markers)\n }\n for (const [markerIndex, markers] of eventMarkersByIndex) {\n markers.sort((a, b) => a.created_at - b.created_at)\n eventMarkersByIndex.set(markerIndex, markers)\n }\n\n endAnchoredBlocks.sort((a, b) => a.created_at - b.created_at)\n\n const result: SubagentThreadMessage[] = []\n const insertedSubagentIds = new Set<string>()\n\n for (let i = 0; i < baseMessages.length; i++) {\n const startMarkers = startMarkersByIndex.get(i) ?? []\n for (const marker of startMarkers) {\n result.push(marker)\n }\n\n const eventMarkers = eventMarkersByIndex.get(i) ?? []\n for (const marker of eventMarkers) {\n result.push(marker)\n }\n\n const displayBlocks = groupedByDisplayIndex.get(i) ?? []\n for (const item of displayBlocks) {\n if ((item as SubagentGroupBlockMessage).type === \"subagent_group_block\") {\n const group = item as SubagentGroupBlockMessage\n for (const block of group.subagents) {\n insertedSubagentIds.add(block.subagent_id)\n }\n result.push(group)\n } else {\n const block = item as SubagentBlockMessage\n if (!insertedSubagentIds.has(block.subagent_id)) {\n result.push(block)\n insertedSubagentIds.add(block.subagent_id)\n }\n }\n }\n\n const entry = baseMessages[i]\n if (isStatusMessage(entry)) {\n result.push(entry)\n continue\n }\n\n if (isWorkblock(entry)) {\n if (skipWorkblockIndexes.has(i)) {\n continue\n }\n result.push(entry)\n continue\n }\n\n const rawEntry = entry as Message\n if (getSystemStatusKind(rawEntry)) {\n result.push(createSystemStatusMessage(rawEntry))\n continue\n }\n\n const rawSubagentId = extractSubagentId(rawEntry)\n if (\n rawSubagentId &&\n !isCurrentThread(rawSubagentId) &&\n !(preserveSilentMessages && rawEntry.silent === true)\n ) {\n continue\n }\n result.push(rawEntry)\n }\n\n for (const block of endAnchoredBlocks) {\n if (!insertedSubagentIds.has(block.subagent_id)) {\n result.push(block)\n insertedSubagentIds.add(block.subagent_id)\n }\n }\n\n return result\n}\n"],"mappings":"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","names":["response"]}
|