{"version":3,"sources":["../src/lib/messages.ts"],"names":[],"mappings":"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","file":"chunk-5RRCXU5I.cjs","sourcesContent":["import type { DisplayMessage, ToolCallInfo, RenderedUIPanel } from '../types/index'\n\n/**\n * Convert SDK Message[] into flat DisplayMessage[] for UI.\n *\n * Critical invariants:\n *\n * 1. **Index parity with the source array**: `display[i]` corresponds to\n *    `messages[i]`. Callers (useAgent) attach `_toolCalls` / `_uiPanels` /\n *    `_attachments` from the raw message by index, so we MUST NOT skip\n *    messages — empty turns become empty-text DisplayMessages (which the UI\n *    renders as blank but preserved so tool-call metadata stays aligned).\n *\n * 2. **toolUse and toolResult are first-class**: previously we flattened\n *    toolUse blocks into ugly `*[tool: name]*` placeholder text, which\n *    destroyed the input payload and broke pairing with toolResult. Now we\n *    extract them into a proper `toolCalls: ToolCallInfo[]` on the\n *    DisplayMessage, so ToolCallBubble can show full input/output.\n *\n * 3. **render_ui is re-materialized from toolUse input**: the `render_ui`\n *    tool's input IS the HTML/CSS/JS of the panel. On re-hydration from IDB\n *    (new tab, page reload), `_uiPanels` may be absent but the toolUse\n *    blocks survive — so we rebuild `uiPanels` from them. That's how the\n *    UI panels survive forever, not just within the live stream.\n *\n * 4. **Text extraction preserves ordering**: toolUse/toolResult blocks are\n *    NOT inlined as text. They become siblings of the message via\n *    toolCalls/uiPanels. Text remains text.\n */\nexport function toDisplayMessages(messages: any[]): DisplayMessage[] {\n  const result: DisplayMessage[] = []\n\n  // First pass: build preliminary list + collect tool-result-by-id lookup\n  // so we can pair toolUse (in one assistant msg) with toolResult (in the\n  // next user msg, per SDK convention).\n  const toolResultsById = new Map<string, { status: 'success' | 'error'; text: string }>()\n  for (const msg of messages) {\n    const blocks = Array.isArray(msg.content) ? msg.content : []\n    for (const b of blocks) {\n      if (b.toolResult?.toolUseId) {\n        const txt = Array.isArray(b.toolResult.content)\n          ? b.toolResult.content.map((c: any) => c.text || (typeof c === 'string' ? c : JSON.stringify(c))).join('')\n          : String(b.toolResult.content ?? '')\n        const status = b.toolResult.status === 'error' ? 'error' : 'success'\n        toolResultsById.set(b.toolResult.toolUseId, { status, text: txt })\n      }\n    }\n  }\n\n  for (let i = 0; i < messages.length; i++) {\n    const msg = messages[i]\n    const role = msg.role === 'user' ? 'user' : 'assistant'\n    const blocks = Array.isArray(msg.content) ? msg.content : [{ text: String(msg.content ?? '') }]\n\n    const texts: string[] = []\n    const toolCalls: ToolCallInfo[] = []\n    const inlinePanels: RenderedUIPanel[] = []\n\n    for (const b of blocks) {\n      if (b.text) {\n        texts.push(b.text)\n      } else if (b.toolUse) {\n        const id = b.toolUse.toolUseId || `tu-${i}-${toolCalls.length}`\n        const paired = toolResultsById.get(b.toolUse.toolUseId || '')\n        toolCalls.push({\n          id,\n          toolUseId: b.toolUse.toolUseId || id,\n          name: b.toolUse.name,\n          input: b.toolUse.input ?? {},\n          status: paired ? paired.status : 'success',\n          result: paired?.text,\n          startedAt: 0,\n          endedAt: 0,\n        })\n\n        // Re-materialize render_ui panels from persisted tool input so they\n        // survive tab reload / IDB roundtrip / context compaction.\n        if (b.toolUse.name === 'render_ui' && b.toolUse.input) {\n          const inp = b.toolUse.input\n          inlinePanels.push({\n            id: `panel-${id}`,\n            title: inp.title || 'panel',\n            html: inp.html || '',\n            css: inp.css,\n            js: inp.js,\n            createdAt: 0,\n          })\n        }\n      }\n      // toolResult blocks are consumed via the lookup map above; we don't\n      // render them as their own DisplayMessage text.\n    }\n\n    const text = texts.join('').trim()\n    const entry: DisplayMessage = { id: `msg-${i}`, role, text }\n\n    // Prefer explicit metadata (stashed during live streaming) but fall back\n    // to what we extracted from raw blocks for IDB-reloaded messages.\n    const rawToolCalls = (msg as any)._toolCalls as ToolCallInfo[] | undefined\n    const rawUiPanels = (msg as any)._uiPanels as RenderedUIPanel[] | undefined\n    const rawAttachments = (msg as any)._attachments\n\n    if (rawToolCalls?.length) entry.toolCalls = rawToolCalls\n    else if (toolCalls.length) entry.toolCalls = toolCalls\n\n    if (rawUiPanels?.length) entry.uiPanels = rawUiPanels\n    else if (inlinePanels.length) entry.uiPanels = inlinePanels\n\n    if (rawAttachments?.length) entry.attachments = rawAttachments\n\n    result.push(entry)\n  }\n  return result\n}\n\n/**\n * Serialize agent.messages safely for IndexedDB.\n *\n * Preserves:\n * - text blocks verbatim\n * - toolUse blocks with full input payload (so render_ui can be rehydrated)\n * - toolResult blocks with toolUseId + status + content\n * - image/document blocks (binary → base64)\n * - our hack metadata: _toolCalls, _uiPanels, _attachments\n */\nexport function serializeMessages(messages: any[]): any[] {\n  return messages.map(msg => ({\n    role: msg.role,\n    ...(msg._toolCalls ? { _toolCalls: msg._toolCalls } : {}),\n    ...(msg._uiPanels ? { _uiPanels: msg._uiPanels } : {}),\n    ...(msg._attachments ? { _attachments: msg._attachments } : {}),\n    content: Array.isArray(msg.content) ? msg.content.map((b: any) => {\n      if (typeof b.toJSON === 'function') return b.toJSON()\n      if (b.text !== undefined) return { text: b.text }\n      if (b.toolUse) return { toolUse: { name: b.toolUse.name, toolUseId: b.toolUse.toolUseId, input: b.toolUse.input } }\n      if (b.toolResult) return {\n        toolResult: {\n          toolUseId: b.toolResult.toolUseId,\n          status: b.toolResult.status,\n          content: b.toolResult.content?.map((c: any) => ({ text: c.text || String(c) })) || [],\n        },\n      }\n      if (b.image) {\n        let bytes = b.image.source?.bytes\n        if (bytes instanceof Uint8Array) {\n          let s = ''\n          for (let i = 0; i < bytes.length; i++) s += String.fromCharCode(bytes[i])\n          bytes = btoa(s)\n        }\n        return { image: { format: b.image.format, source: { bytes } } }\n      }\n      if (b.document) {\n        let bytes = b.document.source?.bytes\n        if (bytes instanceof Uint8Array) {\n          let s = ''\n          for (let i = 0; i < bytes.length; i++) s += String.fromCharCode(bytes[i])\n          bytes = btoa(s)\n        }\n        return { document: { name: b.document.name, format: b.document.format, source: { bytes } } }\n      }\n      return { text: String(b.text ?? '') }\n    }) : [{ text: String(msg.content ?? '') }]\n  }))\n}\n"]}