{"version":3,"sources":["../src/hooks/useAgent.ts"],"names":["useRef","useState","useEffect","useMemo","buildTools","buildCustomTools","getSelfPromptAdditions","readTurnsSync","formatTurnsForPrompt","buildSystemPrompt","get","mesh","useCallback","appendTurn","estimateTotalTokens","shouldSummarize","fireBusEvent","createModel","Agent","serializeMessages","set","del","toDisplayMessages"],"mappings":"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","file":"chunk-2XEA2OOC.cjs","sourcesContent":["/**\n * useAgent — concurrent multi-stream agent hook.\n *\n * Multiple agents can stream in parallel. Each send() spawns a fresh\n * Agent whose .messages points at a single shared list. Each in-flight\n * stream tracks its own:\n *   - AbortController\n *   - streaming text buffer\n *   - tool calls (via BeforeToolCallEvent / ToolResultEvent lookalike: toolResultEvent + beforeToolCallEvent hooks aren't always streamed — we use contentBlockEvent + toolResultEvent from AgentStreamEvent)\n *   - inline UI panels rendered via `render_ui` during that turn\n *   - user-message index where its bubble gets inserted\n *\n * Inline rendering: the bubble sits at insertIndex, so multiple concurrent\n * streams naturally interleave with their corresponding user messages.\n */\nimport { useState, useCallback, useRef, useEffect, useMemo } from 'react'\nimport { Agent, Tool } from '@strands-agents/sdk'\nimport type { MessageData, ContentBlockData } from '@strands-agents/sdk'\nimport { get, set, del } from 'idb-keyval'\nimport type {\n  Settings, DisplayMessage, AgentStatus, Metrics, Attachment,\n  ToolCallInfo, RenderedUIPanel,\n} from '../types/index'\nimport { buildTools, buildCustomTools } from '../tools/index'\nimport { buildSystemPrompt, type DynamicContext } from '../lib/system-prompt'\nimport { getSelfPromptAdditions } from '../tools/self-modify'\nimport { mesh } from '../lib/mesh'\nimport { toDisplayMessages, serializeMessages } from '../lib/messages'\nimport { estimateTotalTokens, shouldSummarize } from '../lib/rolling-summary'\nimport { fireBusEvent } from '../lib/event-bus'\nimport { createModel } from '../providers/factory'\nimport { appendTurn, readTurnsSync, formatTurnsForPrompt } from '../lib/turn-log'\n\n/** MessageData augmented with our private metadata stashed on agent.messages entries */\ntype StoredMessage = MessageData & {\n  _toolCalls?: ToolCallInfo[]\n  _uiPanels?: RenderedUIPanel[]\n  _attachments?: Attachment[]\n  _sid?: string\n}\n\nconst DEFAULT_MESSAGES_KEY = 'careless-v2-messages'\n\ninterface LiveStream {\n  id: string\n  text: string\n  /** Index in messagesRef.current where THIS stream's user msg was pushed */\n  userIndex: number\n  /** Tool calls emitted during this turn */\n  toolCalls: Map<string, ToolCallInfo>\n  /** UI panels rendered during this turn (via render_ui tool) */\n  uiPanels: RenderedUIPanel[]\n  /** Attachments the user sent with this turn (for display) */\n  attachments: Attachment[]\n  /** User message text (for display; echoes input) */\n  userText: string\n}\n\nexport interface UseAgentReturn {\n  send: (input: string, opts?: { attachments?: Attachment[] }) => Promise<{ text: string }>\n  cancel: () => void\n  clear: () => void\n  regenerate: (assistantMsgIdx?: number) => Promise<void>\n  exportMd: () => void\n  messages: DisplayMessage[]\n  streamText: string\n  status: AgentStatus\n  metrics: Metrics | null\n  liveStreamCount: number\n  customToolNames: string[]\n}\n\n\n/** Detect context-window / token-limit errors from any provider. */\nfunction isContextOverflowError(err: unknown): boolean {\n  const msg = String((err as { message?: string } | null)?.message || err || '').toLowerCase()\n  return (\n    msg.includes('context window') ||\n    msg.includes('context length') ||\n    msg.includes('too many tokens') ||\n    msg.includes('input is too long') ||\n    msg.includes('maximum context') ||\n    msg.includes('token limit') ||\n    msg.includes('prompt is too long') ||\n    msg.includes('reduce the length') ||\n    msg.includes('trim conversation')\n  )\n}\n\n/** Detect auth/rate-limit errors for user-friendly messaging. */\nfunction classifyProviderError(err: unknown): { kind: 'auth' | 'rate' | 'network' | 'unknown'; hint: string } {\n  const e = err as { message?: string; status?: number; statusCode?: number } | null\n  const msg = String(e?.message || err || '').toLowerCase()\n  const status = e?.status || e?.statusCode || 0\n  if (status === 401 || status === 403 || msg.includes('unauthorized') || msg.includes('invalid api key') || msg.includes('authentication')) {\n    return { kind: 'auth', hint: 'Check your API key in Settings (⌘,).' }\n  }\n  if (status === 429 || msg.includes('rate limit') || msg.includes('quota') || msg.includes('too many requests')) {\n    return { kind: 'rate', hint: 'Rate limited — wait a moment and try again.' }\n  }\n  if (msg.includes('fetch') || msg.includes('network') || msg.includes('connection')) {\n    return { kind: 'network', hint: 'Network issue — check your connection.' }\n  }\n  return { kind: 'unknown', hint: '' }\n}\n\n/** Drop the older half of conversation messages (keep system/tool pairs intact). */\nfunction dropOlderHalf(messages: StoredMessage[]): StoredMessage[] {\n  if (messages.length <= 2) return messages\n  // Keep the last half, but never break a toolUse→toolResult pair.\n  let cut = Math.floor(messages.length / 2)\n  // Walk forward until we're not in the middle of a tool chain.\n  while (cut < messages.length) {\n    const m = messages[cut]\n    const hasToolResult = Array.isArray(m?.content) && m.content.some((b: ContentBlockData) => 'toolResult' in b)\n    if (!hasToolResult) break\n    cut++\n  }\n  return messages.slice(cut)\n}\n\n/** Fire a toast notification via window event for App to display. */\nfunction fireToast(text: string, kind: 'info' | 'warn' | 'error' = 'info') {\n  try {\n    window.dispatchEvent(new CustomEvent('careless:toast', { detail: { text, kind } }))\n  } catch {}\n}\n\nexport function useAgent(settings: Settings, dynamicCtx?: DynamicContext, storageKey?: string | null): UseAgentReturn {\n  const MESSAGES_KEY = storageKey || DEFAULT_MESSAGES_KEY\n  const messagesRef = useRef<StoredMessage[]>([])\n  const abortControllersRef = useRef<Map<string, AbortController>>(new Map())\n  const hydratedRef = useRef(false)\n\n  const [status, setStatus] = useState<AgentStatus>('ready')\n  const [metrics, setMetrics] = useState<Metrics | null>(null)\n  const [messageVersion, setMessageVersion] = useState(0)\n  const [liveStreams, setLiveStreams] = useState<Map<string, LiveStream>>(new Map())\n  const liveStreamsRef = useRef<Map<string, LiveStream>>(new Map())\n\n  // Keep ref in sync for use inside stale closures (finally block)\n  useEffect(() => { liveStreamsRef.current = liveStreams }, [liveStreams])\n\n  const baseTools = useMemo(() => buildTools(settings), [\n    settings.enableTools, settings.enableVision, settings.enableMesh, settings.enableMemory,\n    settings.disabledTools,\n  ])\n  const [customTools, setCustomTools] = useState<Tool[]>([])\n  useEffect(() => {\n    let alive = true\n    const refresh = async () => {\n      const t = await buildCustomTools()\n      if (alive) setCustomTools(t)\n    }\n    refresh()\n    window.addEventListener('careless:custom-tools-changed', refresh)\n    return () => { alive = false; window.removeEventListener('careless:custom-tools-changed', refresh) }\n  }, [])\n  const tools = useMemo(() => [...baseTools, ...customTools], [baseTools, customTools])\n  const customToolNames = useMemo(\n    () => customTools.map((t) => (t as Tool & { name?: string; config?: { name?: string } })?.name || (t as Tool & { config?: { name?: string } })?.config?.name || 'unnamed').filter(Boolean),\n    [customTools]\n  )\n\n  const [selfAdditions, setSelfAdditions] = useState('')\n  useEffect(() => {\n    const refresh = async () => setSelfAdditions(await getSelfPromptAdditions())\n    refresh()\n    window.addEventListener('careless:system-prompt-changed', refresh)\n    return () => window.removeEventListener('careless:system-prompt-changed', refresh)\n  }, [])\n  // Derive threadId from storageKey (e.g. \"careless-thread-t-abc123\" → \"t-abc123\")\n  const threadId = useMemo(() => {\n    if (!storageKey) return null\n    const m = storageKey.match(/^careless-thread-(.+)$/)\n    return m ? m[1] : null\n  }, [storageKey])\n\n  // Turn-log version — bumped after each append so system prompt re-renders\n  const [turnLogVersion, setTurnLogVersion] = useState(0)\n\n  const systemPrompt = useMemo(() => {\n    // Inject IDB-persisted turn transcript (last 200 turns, cross-thread)\n    const recentTurns = readTurnsSync(200)\n    const turnTranscript = formatTurnsForPrompt(recentTurns, { activeThreadId: threadId, maxChars: 12000 })\n    const base = buildSystemPrompt(settings, { ...(dynamicCtx || {}), turnTranscript })\n    return base + (selfAdditions || '')\n  }, [settings, dynamicCtx, selfAdditions, threadId, turnLogVersion])\n\n  useEffect(() => {\n    // Re-hydrate when storageKey changes\n    hydratedRef.current = false\n    messagesRef.current = []\n    setMessageVersion(v => v + 1)\n    get(MESSAGES_KEY).then(stored => {\n      if (Array.isArray(stored) && stored.length > 0) {\n        messagesRef.current = stored\n        setMessageVersion(v => v + 1)\n      }\n      hydratedRef.current = true\n    }).catch(() => { hydratedRef.current = true })\n  }, [MESSAGES_KEY])\n\n  // External mutations via manage_messages tool → re-hydrate from IDB.\n  useEffect(() => {\n    const onExternal = (e: Event) => {\n      const ev = e as CustomEvent<{ key: string; count: number }>\n      if (ev.detail?.key && ev.detail.key !== MESSAGES_KEY) return\n      get(MESSAGES_KEY).then(stored => {\n        messagesRef.current = Array.isArray(stored) ? stored : []\n        setMessageVersion(v => v + 1)\n      }).catch(() => {})\n    }\n    window.addEventListener('careless:messages-changed', onExternal)\n    return () => window.removeEventListener('careless:messages-changed', onExternal)\n  }, [MESSAGES_KEY])\n\n  useEffect(() => {\n    mesh.init()\n    mesh.setPageLabel('careless')\n  }, [])\n\n\n  const patchStream = useCallback((id: string, patch: (s: LiveStream) => LiveStream) => {\n    setLiveStreams(prev => {\n      const cur = prev.get(id)\n      if (!cur) return prev\n      const next = new Map(prev)\n      next.set(id, patch(cur))\n      return next\n    })\n  }, [])\n\n  // Listen for render_ui events — route to the most recent active stream.\n  // The render_ui tool fires a careless:ui-render event; we attach it to the\n  // stream whose insertIndex is greatest (i.e. most-recently started) since\n  // that's the one whose tool just fired. This is best-effort but works well\n  // in practice because tool calls happen synchronously within a single turn.\n  useEffect(() => {\n    const handler = (e: Event) => {\n      const panel: RenderedUIPanel = (e as CustomEvent<RenderedUIPanel>).detail\n      setLiveStreams(prev => {\n        if (prev.size === 0) return prev\n        // Pick the most recently started stream (largest userIndex).\n        let targetId: string | null = null\n        let maxIdx = -1\n        for (const [id, s] of prev) {\n          if (s.userIndex > maxIdx) { maxIdx = s.userIndex; targetId = id }\n        }\n        if (!targetId) return prev\n        const next = new Map(prev)\n        const cur = next.get(targetId)!\n        next.set(targetId, { ...cur, uiPanels: [...cur.uiPanels, panel] })\n        return next\n      })\n    }\n    window.addEventListener('careless:ui-render', handler)\n    return () => window.removeEventListener('careless:ui-render', handler)\n  }, [])\n\n  const send = useCallback(async (input: string, opts: { attachments?: Attachment[] } = {}) => {\n    const streamId = `s-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`\n    setStatus('thinking')\n    setMetrics(null)\n\n    // 📜 Append user turn to persistent log (fire-and-forget)\n    const userTurnText = input.trim() || (opts.attachments?.length ? `[attached ${opts.attachments.length} file(s)]` : '')\n    if (userTurnText) {\n      appendTurn({ threadId, role: 'user', text: userTurnText })\n        .then(() => setTurnLogVersion(v => v + 1))\n        .catch(err => console.warn('[turn-log] user append failed', err))\n    }\n\n    // 📊 Proactive context-usage check — warn if approaching window\n    try {\n      const tokens = estimateTotalTokens(messagesRef.current)\n      if (shouldSummarize(messagesRef.current, settings.model, 95)) {\n        // Critical: proactively drop older half to avoid guaranteed overflow\n        const before = messagesRef.current.length\n        const kept = dropOlderHalf(messagesRef.current)\n        const dropped = before - kept.length\n        if (dropped > 0) {\n          messagesRef.current = kept\n          fireToast(`Context critical (~${tokens} tok) — auto-dropped ${dropped} older messages`, 'warn')\n          fireBusEvent({ source: 'system', kind: 'completed', summary: `context truncation: dropped ${dropped} msgs (${tokens} tok)` })\n        }\n      } else if (shouldSummarize(messagesRef.current, settings.model, 80)) {\n        fireToast(`Context usage high (~${tokens} tok) — consider /clear or /export`, 'warn')\n      }\n    } catch {}\n\n    // Build multimodal input blocks\n    const textBlocks: any[] = []\n    const promptText = input.trim() || 'Have a look.'\n    textBlocks.push({ text: promptText })\n    if (opts.attachments?.length) {\n      for (const att of opts.attachments) {\n        if (att.type === 'image' && att.base64) {\n          textBlocks.push({ image: { format: att.format || 'jpeg', source: { bytes: att.base64 } } })\n        } else if (att.type === 'document' && att.base64 && att.format) {\n          // Bedrock Converse document block — PDFs, Office docs, etc.\n          // Document name must be alphanumeric + spaces/hyphens/parens/brackets (Bedrock requirement)\n          const safeName = (att.name || 'document').replace(/\\.[^.]+$/, '').replace(/[^a-zA-Z0-9\\s\\-()\\[\\]]/g, '_').slice(0, 200) || 'document'\n          textBlocks.push({ document: { name: safeName, format: att.format, source: { bytes: att.base64 } } })\n        } else if ((att.type === 'file' || att.type === 'document') && att.text) {\n          textBlocks.push({ text: `\\n\\n--- Attached file: ${att.name} ---\\n${att.text}\\n--- end ---` })\n        }\n      }\n    }\n    const agentInput: any = textBlocks\n\n    // The user message will be pushed by Agent.stream at messagesRef.current.length\n    const userIndex = messagesRef.current.length\n\n    // Seed the live stream with user text + attachments for display\n    setLiveStreams(prev => {\n      const next = new Map(prev)\n      next.set(streamId, {\n        id: streamId,\n        text: '',\n        userIndex,\n        toolCalls: new Map(),\n        uiPanels: [],\n        attachments: opts.attachments || [],\n        userText: promptText,\n      })\n      return next\n    })\n\n    let agent: Agent\n    try {\n      const model = await createModel(settings)\n      agent = new Agent({\n        model, tools, systemPrompt,\n        messages: messagesRef.current,\n      } as any)\n    } catch (err: unknown) {\n      console.error('[useAgent] createModel failed:', err)\n      messagesRef.current.push({\n        role: 'assistant',\n        content: [{ text: `⚠️ Failed to initialize model: ${err instanceof Error ? err.message : String(err)}` }],\n      })\n      setStatus('error')\n      setMessageVersion(v => v + 1)\n      setLiveStreams(prev => { const n = new Map(prev); n.delete(streamId); return n })\n      return { text: '' }\n    }\n\n    const controller = new AbortController()\n    abortControllersRef.current.set(streamId, controller)\n\n    let text = ''\n    let errored = false\n    try {\n      for await (const event of agent.stream(agentInput, { cancelSignal: controller.signal } as any)) {\n        if (controller.signal.aborted) break\n        const e = event as any\n\n        switch (e.type) {\n          case 'modelStreamUpdateEvent': {\n            const inner = e.event\n            if (inner?.type === 'modelContentBlockDeltaEvent' && inner.delta?.type === 'textDelta') {\n              text += inner.delta.text\n              patchStream(streamId, s => ({ ...s, text }))\n              setStatus('streaming')\n            }\n            break\n          }\n\n          case 'beforeToolCallEvent': {\n            const tu = e.toolUse\n            if (!tu) break\n            const info: ToolCallInfo = {\n              id: `tc-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`,\n              toolUseId: tu.toolUseId,\n              name: tu.name,\n              input: tu.input,\n              status: 'running',\n              startedAt: Date.now(),\n            }\n            patchStream(streamId, s => {\n              const tc = new Map(s.toolCalls)\n              tc.set(tu.toolUseId, info)\n              return { ...s, toolCalls: tc }\n            })\n            fireBusEvent({ source: 'tool', kind: 'started', summary: `${tu.name}(${JSON.stringify(tu.input).slice(0, 60)})` })\n            break\n          }\n\n          case 'afterToolCallEvent':\n          case 'toolResultEvent': {\n            const result = e.result || e.toolResult\n            const toolUseId = result?.toolUseId || e.toolUse?.toolUseId\n            if (!toolUseId) break\n            // Extract text from result content\n            let resText = ''\n            if (result?.content && Array.isArray(result.content)) {\n              resText = result.content.map((c: any) => c.text || '').join('')\n            } else if (typeof result === 'string') {\n              resText = result\n            }\n            const ok = result?.status !== 'error'\n            patchStream(streamId, s => {\n              const tc = new Map(s.toolCalls)\n              const existing = tc.get(toolUseId)\n              if (existing) {\n                tc.set(toolUseId, {\n                  ...existing,\n                  status: ok ? 'success' : 'error',\n                  result: resText.slice(0, 2000),\n                  endedAt: Date.now(),\n                })\n                fireBusEvent({ source: 'tool', kind: ok ? 'completed' : 'error', summary: `${existing.name} → ${resText.slice(0, 80)}` })\n              }\n              return { ...s, toolCalls: tc }\n            })\n            break\n          }\n\n          case 'contentBlockEvent':\n          case 'modelMessageEvent':\n          case 'messageAddedEvent':\n            setMessageVersion(v => v + 1)\n            break\n\n          case 'agentResultEvent': {\n            const u = e.result?.metrics?.accumulatedUsage\n            if (u) setMetrics({ input: u.inputTokens || 0, output: u.outputTokens || 0 })\n            break\n          }\n        }\n      }\n    } catch (err: unknown) {\n      errored = true\n      console.error('[agent.stream] error:', streamId, err)\n\n      // 🩺 Self-heal: context overflow → drop older half + retry once\n      if (isContextOverflowError(err) && messagesRef.current.length > 2) {\n        const before = messagesRef.current.length\n        messagesRef.current = dropOlderHalf(messagesRef.current)\n        const after = messagesRef.current.length\n        const tok = estimateTotalTokens(messagesRef.current)\n        console.warn(`[useAgent] context overflow — trimmed ${before} → ${after} msgs (~${tok} tok), retrying`)\n        fireToast(`Context full — trimmed ${before - after} old messages, retrying…`, 'warn')\n        try {\n          // Rebuild agent with trimmed messages and retry the stream once\n          const model2 = await createModel(settings)\n          const agent2 = new Agent({\n            model: model2, tools, systemPrompt,\n            messages: messagesRef.current,\n          } as any)\n          text = ''\n          patchStream(streamId, sx => ({ ...sx, text: '' }))\n          for await (const event of agent2.stream(agentInput, { cancelSignal: controller.signal } as any)) {\n            if (controller.signal.aborted) break\n            const e = event as any\n            if (e.type === 'modelStreamUpdateEvent') {\n              const inner = e.event\n              if (inner?.type === 'modelContentBlockDeltaEvent' && inner.delta?.type === 'textDelta') {\n                text += inner.delta.text\n                patchStream(streamId, sx => ({ ...sx, text }))\n                setStatus('streaming')\n              }\n            } else if (e.type === 'agentResultEvent') {\n              const u = e.result?.metrics?.accumulatedUsage\n              if (u) setMetrics({ input: u.inputTokens || 0, output: u.outputTokens || 0 })\n            }\n          }\n          // Use the retry agent as authoritative\n          agent = agent2\n          errored = false\n        } catch (retryErr: any) {\n          console.error('[useAgent] retry after context-trim also failed:', retryErr)\n          messagesRef.current.push({\n            role: 'assistant',\n            content: [{ text: `⚠️ Context overflow — retry failed: ${retryErr?.message || retryErr}` }],\n          })\n          setStatus('error')\n        }\n      } else {\n        // Classify for friendly toast\n        const cls = classifyProviderError(err)\n        const pretty = cls.kind === 'auth'\n          ? `⚠️ Authentication failed. ${cls.hint}`\n          : cls.kind === 'rate'\n          ? `⚠️ Rate limit hit. ${cls.hint}`\n          : cls.kind === 'network'\n          ? `⚠️ Network error. ${cls.hint}`\n          : `⚠️ ${err instanceof Error ? err.message : String(err)}`\n        if (cls.kind !== 'unknown') fireToast(pretty, cls.kind === 'auth' ? 'error' : 'warn')\n        messagesRef.current.push({\n          role: 'assistant',\n          content: [{ text: pretty }],\n        })\n        setStatus('error')\n      }\n    } finally {\n      abortControllersRef.current.delete(streamId)\n\n      // CRITICAL: Sync agent.messages back into messagesRef.current.\n      // The SDK's Agent constructor wraps config.messages in Message instances via\n      // `(config?.messages ?? []).map(msg => Message.fromMessageData(msg))` — so\n      // agent.messages is a NEW array, not our ref. All new user/assistant messages\n      // the SDK appended during the turn live there, not in our ref.\n      //\n      // We serialize agent.messages back to plain objects and replace our ref,\n      // preserving conversation continuity across turns.\n      try {\n        const authoritative = (agent as any).messages || []\n        const serialized = serializeMessages(authoritative)\n        // CRITICAL: preserve our _-prefixed metadata (_toolCalls, _uiPanels,\n        // _attachments) across resync. The SDK owns agent.messages, and\n        // serializeMessages strips our hack fields. We re-attach them by\n        // role-and-index alignment with the previous ref.\n        const prev = messagesRef.current\n        for (let i = 0; i < serialized.length && i < prev.length; i++) {\n          const p = prev[i] as any\n          const n = serialized[i] as any\n          if (!p || !n || p.role !== n.role) continue\n          if (p._toolCalls) n._toolCalls = p._toolCalls\n          if (p._uiPanels) n._uiPanels = p._uiPanels\n          if (p._attachments) n._attachments = p._attachments\n        }\n        messagesRef.current = serialized\n      } catch (syncErr) {\n        console.warn('[useAgent] failed to sync agent.messages:', syncErr)\n      }\n\n      // Persist tool calls + UI panels + attachments onto the messages we just synced.\n      const cur = liveStreamsRef.current.get(streamId)\n      if (cur) {\n        const lastMsg = messagesRef.current[messagesRef.current.length - 1]\n        if (lastMsg && lastMsg.role === 'assistant') {\n          (lastMsg as any)._toolCalls = Array.from(cur.toolCalls.values())\n          ;(lastMsg as any)._uiPanels = cur.uiPanels\n        }\n        // Attach attachments to the user message at userIndex (our pre-turn index).\n        const userMsg = messagesRef.current[cur.userIndex]\n        if (userMsg && userMsg.role === 'user' && cur.attachments.length) {\n          (userMsg as any)._attachments = cur.attachments\n        }\n      }\n\n      setLiveStreams(prev => { const n = new Map(prev); n.delete(streamId); return n })\n\n      if (!errored) {\n        const msgLen = text.length\n        if (msgLen > 0) fireBusEvent({ source: 'agent', kind: 'completed', summary: `Response: ${text.slice(0, 80)}${text.length > 80 ? '…' : ''}` })\n\n        // 📜 Append assistant turn with tool summary\n        if (text.trim()) {\n          const toolNames = cur ? Array.from(cur.toolCalls.values()).map(tc => tc.name) : []\n          const toolsSummary = toolNames.length ? `tools: ${toolNames.slice(0, 5).join(', ')}${toolNames.length > 5 ? '…' : ''}` : undefined\n          appendTurn({ threadId, role: 'assistant', text, tools: toolsSummary })\n            .then(() => setTurnLogVersion(v => v + 1))\n            .catch(err => console.warn('[turn-log] assistant append failed', err))\n        }\n      }\n      if (abortControllersRef.current.size === 0 && !errored) setStatus('ready')\n      else if (abortControllersRef.current.size > 0) setStatus('streaming')\n\n      setMessageVersion(v => v + 1)\n      if (messagesRef.current.length) {\n        set(MESSAGES_KEY, serializeMessages(messagesRef.current)).catch(() => {})\n      }\n    }\n    return { text }\n  }, [settings, tools, systemPrompt, patchStream])\n\n  const cancel = useCallback(() => {\n    for (const c of abortControllersRef.current.values()) c.abort()\n    abortControllersRef.current.clear()\n    setLiveStreams(new Map())\n    setStatus('ready')\n  }, [])\n\n  /**\n   * Regenerate the last (or specified) assistant message.\n   * Splices off everything from that msg onward, then re-sends the previous user msg.\n   */\n  const regenerate = useCallback(async (assistantMsgIdx?: number) => {\n    const msgs = messagesRef.current\n    let idx = assistantMsgIdx\n    if (idx === undefined) {\n      // Find last assistant msg\n      for (let i = msgs.length - 1; i >= 0; i--) {\n        if (msgs[i].role === 'assistant') { idx = i; break }\n      }\n    }\n    if (idx === undefined || idx < 1) return\n    const userMsg = msgs[idx - 1]\n    if (!userMsg || userMsg.role !== 'user') return\n    const userText = Array.isArray(userMsg.content)\n      ? userMsg.content.map((b: any) => b.text || '').filter(Boolean).join(' ')\n      : String(userMsg.content || '')\n    // Splice off the user + assistant (we'll resend the user)\n    messagesRef.current = msgs.slice(0, idx - 1)\n    setMessageVersion(v => v + 1)\n    if (userText.trim()) await send(userText)\n  }, [])\n\n    const clear = useCallback(() => {\n    cancel()\n    messagesRef.current.length = 0\n    del(MESSAGES_KEY).catch(() => {})\n    setMetrics(null)\n    setMessageVersion(v => v + 1)\n  }, [cancel])\n\n  const exportMd = useCallback(() => {\n    const msgs = messagesRef.current\n    if (!msgs.length) return\n    const display = toDisplayMessages(msgs as any)\n    const md = display.map(m => `## ${m.role === 'user' ? 'You' : 'Assistant'}\\n\\n${m.text}`).join('\\n\\n---\\n\\n')\n    const blob = new Blob([md], { type: 'text/markdown' })\n    const url = URL.createObjectURL(blob)\n    const a = document.createElement('a')\n    a.href = url\n    a.download = `careless-${new Date().toISOString().slice(0, 10)}.md`\n    a.click()\n    URL.revokeObjectURL(url)\n  }, [])\n\n  // Build interleaved messages. Persisted messages come first; each live stream\n  // appends its own user+assistant pair at the end, inline with its position.\n  const messages = useMemo<DisplayMessage[]>(() => {\n    const display = toDisplayMessages(messagesRef.current as any)\n\n    // Attach metadata we stashed on raw messages\n    for (let i = 0; i < display.length; i++) {\n      const raw = messagesRef.current[i]\n      if (!raw) continue\n      if (raw._toolCalls) display[i].toolCalls = raw._toolCalls\n      if (raw._uiPanels) display[i].uiPanels = raw._uiPanels\n      if (raw._attachments) display[i].attachments = raw._attachments\n    }\n\n    // Now append each live stream: the user message for it has already been\n    // pushed by agent.stream at userIndex (so it's in `display`), and we show\n    // the streaming assistant bubble right after.\n    const liveArr = Array.from(liveStreams.values()).sort((a, b) => a.userIndex - b.userIndex)\n    for (const s of liveArr) {\n      // If the user message isn't in display yet (stream just started,\n      // Strands hasn't pushed it), synthesize a placeholder user bubble.\n      const hasUser = display.some(d => d.role === 'user' && (d as any)._sid === s.id)\n      if (!hasUser && s.userText) {\n        // Find if a message at this userIndex already exists in display (Strands pushed it).\n        const msgAtIdx = messagesRef.current[s.userIndex]\n        if (!msgAtIdx) {\n          display.push({\n            id: `live-user-${s.id}`,\n            role: 'user',\n            text: s.userText,\n            attachments: s.attachments,\n          })\n        }\n      }\n      display.push({\n        id: s.id,\n        role: 'assistant',\n        text: s.text || '',\n        streaming: true,\n        toolCalls: Array.from(s.toolCalls.values()),\n        uiPanels: s.uiPanels,\n      })\n    }\n    return display\n  }, [messageVersion, liveStreams])\n\n  const streamText = useMemo(() => {\n    if (liveStreams.size === 0) return ''\n    const arr = Array.from(liveStreams.values())\n    return arr[arr.length - 1]?.text || ''\n  }, [liveStreams])\n\n  return {\n    send, cancel, clear, regenerate, exportMd,\n    messages, streamText, status, metrics,\n    liveStreamCount: liveStreams.size,\n    customToolNames,\n  }\n}\n"]}